From 048d38d18723eadace96d369fbb36f3c09225207 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 10 Jul 2022 03:10:01 +0200 Subject: [PATCH 0001/1398] interpolated mu i measures (yet to check ) I will replace ExactPredInexactConstructs with a geometry traits template next ISA --- .../interpolated_curvature_measures.h | 88 +++++++++++++++++++ .../Triangulation_2/triangulation_prog1.cpp | 63 ++++++++----- 2 files changed, 131 insertions(+), 20 deletions(-) create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h new file mode 100644 index 000000000000..e4f67d03e17a --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h @@ -0,0 +1,88 @@ +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CURVATURE_MEASURES_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CURVATURE_MEASURES_H +#endif + +#include +#include +#include +#include + +namespace CGAL { + +namespace Polygon_mesh_processing { + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; + +// enum to specify which measure is computed +enum MEASURE_INDEX { + MU0_AREA_MEASURE, + MU1_MEAN_CURVATURE_MEASURE, + MU2_GAUSSIAN_CURVATURE_MEASURE +}; + +Epic::FT interpolated_mu_i_triangle(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, + const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, MEASURE_INDEX mu_i) +{ + Epic::Vector_3 um; + switch (mu_i) + { + case MU0_AREA_MEASURE: + + um = (u0 + u1 + u2) / 3.0; + + return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); + + case MU1_MEAN_CURVATURE_MEASURE: + + um = (u0 + u1 + u2) / 3.0; + + return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) + + CGAL::cross_product(u0 - u2, x1) + + CGAL::cross_product(u1 - u0, x2)); + + case MU2_GAUSSIAN_CURVATURE_MEASURE: + + return 0.5 * u0 * CGAL::cross_product(u1, u2); + + default: return 0; + } +} + +Epic::FT interpolated_mu_i_face(std::vector& x, std::vector& u, MEASURE_INDEX mu_i) +{ + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + if (n == 3) + return interpolated_mu_i_triangle(x[0], x[1], x[2], + u[0], u[1], u[2], mu_i); + + /// If Quad measure formulas (Bilinear Interpolation) proved to be better, + /// they will be implemented and called here + //else if(n == 4) + // return interpolated_mu0_quad(x[0], x[1], x[2], x[3] + // u[0], u[1], u[2], u[3]); + else { + Epic::FT mu0 = 0; + + // getting barycenter of points + Epic::Vector_3 xm = std::accumulate(x.begin(), x.end(), Epic::Vector_3(0, 0, 0)); + xm /= n; + + // getting unit average normal of points + Epic::Vector_3 um = std::accumulate(u.begin(), u.end(), Epic::Vector_3(0,0,0)); + um /= sqrt(um * um); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + mu0 += interpolated_mu_i_triangle(x[i], x[(i + 1) % n], xm, + u[i], u[(i + 1) % n], um, mu_i); + } + return mu0; + } +} + +} +} diff --git a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp index e68f7973163d..e52400cd5d0c 100644 --- a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp +++ b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp @@ -1,27 +1,50 @@ -#include - #include -#include -typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +#define N 4 +namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Triangulation_2 Triangulation; -typedef Triangulation::Vertex_circulator Vertex_circulator; -typedef Triangulation::Point Point; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; -int main() { - std::ifstream in("data/triangulation_prog1.cin"); - std::istream_iterator begin(in); - std::istream_iterator end; +int main(int argc, char* argv[]) +{ + srand(time(NULL)); - Triangulation t; - t.insert(begin, end); + std::vector X(N); + std::vector U(N); + + for (int i = 0; i < N; i++) { + X[i] = { rand() , rand() , rand() }; + U[i] = { rand() , rand() , rand() }; + U[i] = U[i] / sqrt(U[i] * U[i]); + } + std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU0_AREA_MEASURE) << std::endl; + std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU1_MEAN_CURVATURE_MEASURE) << std::endl; + std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE) << std::endl; + + /*srand(time(NULL)); + Epic::Vector_3 x, y; + Epic::FT d = 0; + + Epic::Vector_3 z; + std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); + for (int i = 0; i < N; i++) + { + x * y; + } + std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); + std::cout << std::chrono::duration_cast(end - begin).count() << std::endl;*/ - Vertex_circulator vc = t.incident_vertices(t.infinite_vertex()), - done(vc); - if (vc != nullptr) { - do { std::cout << vc->point() << std::endl; - }while(++vc != done); - } - return 0; } + From e63de4f48ae1772992c4c64f158c8c353984e4b1 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 13 Jul 2022 07:59:21 +0200 Subject: [PATCH 0002/1398] implemented computing mu_i over all faces it works fine, still need to handle if vnm is not given --- ...nterpolated_corrected_curvature_measures.h | 201 ++++++++++++++++++ .../interpolated_curvature_measures.h | 88 -------- .../Triangulation_2/triangulation_prog1.cpp | 76 ++++++- 3 files changed, 267 insertions(+), 98 deletions(-) create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h delete mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h new file mode 100644 index 000000000000..1ebf5fe4dfef --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -0,0 +1,201 @@ +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#endif + +#include +#include + +#include +#include +#include +#include +#include + + +namespace CGAL { + + namespace Polygon_mesh_processing { + + typedef Exact_predicates_inexact_constructions_kernel Epic; + + // enum to specify which measure is computed + enum Measure_index { + MU0_AREA_MEASURE, + MU1_MEAN_CURVATURE_MEASURE, + MU2_GAUSSIAN_CURVATURE_MEASURE + }; + + Epic::FT interpolated_mu_i_triangle(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, + const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, const Measure_index mu_i) + { + Epic::Vector_3 um; + switch (mu_i) + { + case MU0_AREA_MEASURE: + + um = (u0 + u1 + u2) / 3.0; + + return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); + + case MU1_MEAN_CURVATURE_MEASURE: + + um = (u0 + u1 + u2) / 3.0; + + return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) + + CGAL::cross_product(u0 - u2, x1) + + CGAL::cross_product(u1 - u0, x2)); + + case MU2_GAUSSIAN_CURVATURE_MEASURE: + + return 0.5 * u0 * CGAL::cross_product(u1, u2); + + default: return 0; + } + } + + Epic::FT interpolated_mu_i_quad(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, const Epic::Vector_3 x3, + const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, const Epic::Vector_3 u3, const Measure_index mu_i) + { + /// x0 _ x1 + /// x2 |_| x3 + + switch (mu_i) + { + case MU0_AREA_MEASURE: + + return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(x1 - x0, x3 - x1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(x3 - x2, x2 - x0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1)); + + case MU1_MEAN_CURVATURE_MEASURE: + { + const Epic::Vector_3 u03 = u3 - u0; + const Epic::Vector_3 u12 = u2 - u1; + const Epic::Vector_3 x0_cross = CGAL::cross_product(u12, x0); + const Epic::Vector_3 x1_cross = -CGAL::cross_product(u03, x1); + const Epic::Vector_3 x2_cross = CGAL::cross_product(u03, x2); + const Epic::Vector_3 x3_cross = -CGAL::cross_product(u12, x3); + + + return (1 / 12.0) * (u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) + + u1 * (CGAL::cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - CGAL::cross_product((u0 + u2), x3)) + + u2 * (CGAL::cross_product(-(u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) + + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross)); + } + case MU2_GAUSSIAN_CURVATURE_MEASURE: + + return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(u1 - u0, u3 - u1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(u3 - u2, u2 - u0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1)); + + default: return 0; + } + } + + Epic::FT interpolated_mu_i_face(const std::vector& x, const std::vector& u, const Measure_index mu_i) + { + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + // Triangle: use triangle formulas + if (n == 3) + return interpolated_mu_i_triangle(x[0], x[1], x[2], + u[0], u[1], u[2], mu_i); + + // Quad: use bilinear interpolation formulas + else if (n == 4) + /// x[0] _ x[1] ---> x0 _ x1 (reason for changing order) + /// x[3] |_| x[2] ---> x2 |_| x3 + return interpolated_mu_i_quad(x[0], x[1], x[3], x[2], + u[0], u[1], u[3], u[2], mu_i); + + // N-gon: split into n triangles by barycenter and use triangle formulas for each + else { + Epic::FT mu0 = 0; + + // getting barycenter of points + Epic::Vector_3 xm = std::accumulate(x.begin(), x.end(), Epic::Vector_3(0, 0, 0)); + xm /= n; + + // getting unit average normal of points + Epic::Vector_3 um = std::accumulate(u.begin(), u.end(), Epic::Vector_3(0, 0, 0)); + um /= sqrt(um * um); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + mu0 += interpolated_mu_i_triangle(x[i], x[(i + 1) % n], xm, + u[i], u[(i + 1) % n], um, mu_i); + } + return mu0; + } + } + + + /// TODO: + /// 1- Handle if VNM is not given + /// 2- use GT instead of Epic + + template + std::vector + interpolated_corrected_measure_i( + const PolygonMesh& pmesh, + const Measure_index mu_i, + VertexNormalMap vnm, + const NamedParameters& np = parameters::default_values()) + { + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef boost::graph_traits::face_descriptor face_descriptor; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + //std::unordered_map vnm_init; + + //boost::associative_property_map + // ::vertex_descriptor, Epic::Vector_3>> vnm(vnm_init); + + ////if (!vnm) + // { + // compute_vertex_normals(pmesh, vnm, np); + //} + + std::vector mu_i_map; + + + for (face_descriptor f : faces(pmesh)) + { + halfedge_descriptor h_start = pmesh.halfedge(f); + halfedge_descriptor h_iter = h_start; + + std::vector x; + std::vector u; + + // looping over vertices in face + do { + vertex_descriptor v = source(h_iter, pmesh); + Epic::Point_3 p = get(vpm, v); + x.push_back(Epic::Vector_3(p.x(),p.y(),p.z())); + u.push_back(get(vnm, v)); + h_iter = next(h_iter, pmesh); + } while (h_iter != h_start); + + + mu_i_map.push_back(interpolated_mu_i_face(x, u, mu_i)); + } + return mu_i_map; + } + + } +} + diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h deleted file mode 100644 index e4f67d03e17a..000000000000 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_curvature_measures.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CURVATURE_MEASURES_H -#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CURVATURE_MEASURES_H -#endif - -#include -#include -#include -#include - -namespace CGAL { - -namespace Polygon_mesh_processing { - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; - -// enum to specify which measure is computed -enum MEASURE_INDEX { - MU0_AREA_MEASURE, - MU1_MEAN_CURVATURE_MEASURE, - MU2_GAUSSIAN_CURVATURE_MEASURE -}; - -Epic::FT interpolated_mu_i_triangle(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, - const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, MEASURE_INDEX mu_i) -{ - Epic::Vector_3 um; - switch (mu_i) - { - case MU0_AREA_MEASURE: - - um = (u0 + u1 + u2) / 3.0; - - return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); - - case MU1_MEAN_CURVATURE_MEASURE: - - um = (u0 + u1 + u2) / 3.0; - - return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) - + CGAL::cross_product(u0 - u2, x1) - + CGAL::cross_product(u1 - u0, x2)); - - case MU2_GAUSSIAN_CURVATURE_MEASURE: - - return 0.5 * u0 * CGAL::cross_product(u1, u2); - - default: return 0; - } -} - -Epic::FT interpolated_mu_i_face(std::vector& x, std::vector& u, MEASURE_INDEX mu_i) -{ - std::size_t n = x.size(); - CGAL_precondition(u.size() == n); - CGAL_precondition(n >= 3); - - if (n == 3) - return interpolated_mu_i_triangle(x[0], x[1], x[2], - u[0], u[1], u[2], mu_i); - - /// If Quad measure formulas (Bilinear Interpolation) proved to be better, - /// they will be implemented and called here - //else if(n == 4) - // return interpolated_mu0_quad(x[0], x[1], x[2], x[3] - // u[0], u[1], u[2], u[3]); - else { - Epic::FT mu0 = 0; - - // getting barycenter of points - Epic::Vector_3 xm = std::accumulate(x.begin(), x.end(), Epic::Vector_3(0, 0, 0)); - xm /= n; - - // getting unit average normal of points - Epic::Vector_3 um = std::accumulate(u.begin(), u.end(), Epic::Vector_3(0,0,0)); - um /= sqrt(um * um); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu0 += interpolated_mu_i_triangle(x[i], x[(i + 1) % n], xm, - u[i], u[(i + 1) % n], um, mu_i); - } - return mu0; - } -} - -} -} diff --git a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp index e52400cd5d0c..2e625d722cc1 100644 --- a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp +++ b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp @@ -1,25 +1,79 @@ #include +#include +#include +#include +#include -#include -#include -#include -#include +#include - -#include -#include +#include +#include #include #include #include +#include -#define N 4 namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Surface_mesh Mesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + int main(int argc, char* argv[]) { - srand(time(NULL)); + Mesh g1; + if (!PMP::IO::read_polygon_mesh("small_bunny.obj", g1) || !CGAL::is_triangle_mesh(g1)) + { + std::cerr << "Invalid input." << std::endl; + return 1; + } + + //int n1 = g1.size_of_facets(); + + std::unordered_map vnm_vec; + boost::associative_property_map< std::unordered_map> vnm(vnm_vec); + + PMP::compute_vertex_normals(g1, vnm); + + + + std::vector mu0_map, mu1_map, mu2_map; + + mu0_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU0_AREA_MEASURE, vnm); + mu1_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, vnm); + mu2_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, vnm); + + int n = g1.faces().size(); + + for (int i = 0; i < n; i++) + { + std::cout << mu0_map[i] << "\n"; + } + + std::cout << "\n"; + + for (int i = 0; i < n; i++) + { + std::cout << mu1_map[i] << "\n"; + } + + std::cout << "\n"; + + for (int i = 0; i < n; i++) + { + std::cout << mu2_map[i] << "\n"; + } + + + + + /*srand(time(NULL)); + + CGAL::GetGeomTraits GT; std::vector X(N); std::vector U(N); @@ -29,9 +83,11 @@ int main(int argc, char* argv[]) U[i] = { rand() , rand() , rand() }; U[i] = U[i] / sqrt(U[i] * U[i]); } + + std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU0_AREA_MEASURE) << std::endl; std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU1_MEAN_CURVATURE_MEASURE) << std::endl; - std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE) << std::endl; + std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE) << std::endl;*/ /*srand(time(NULL)); Epic::Vector_3 x, y; From 2eeb88ac96cb49755b487cb01a1bfc3fc8f0f1fb Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 15 Jul 2022 13:18:56 +0200 Subject: [PATCH 0003/1398] moved my main program to a new example file in PMP --- .../Polygon_mesh_processing/CMakeLists.txt | 12 +- .../interpolated_corrected_curvatures.cpp | 75 +++++++++++ .../Triangulation_2/triangulation_prog1.cpp | 120 +++--------------- 3 files changed, 106 insertions(+), 101 deletions(-) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index baa4d41677ac..d6f4e273516f 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -5,11 +5,13 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Polygon_mesh_processing_Examples) # CGAL and its components -find_package(CGAL REQUIRED) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) # Boost and its components find_package(Boost REQUIRED) + + if(NOT Boost_FOUND) message( @@ -100,6 +102,14 @@ create_single_source_cgal_program("orientation_pipeline_example.cpp") #create_single_source_cgal_program( "snapping_example.cpp") create_single_source_cgal_program("match_faces.cpp") create_single_source_cgal_program("cc_compatible_orientations.cpp") +create_single_source_cgal_program("interpolated_corrected_curvatures.cpp") + +if(CGAL_Qt5_FOUND) + + #link it with the required CGAL libraries + target_link_libraries(interpolated_corrected_curvatures PUBLIC CGAL::CGAL_Basic_viewer) + +endif() if(OpenMesh_FOUND) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp new file mode 100644 index 000000000000..f45bec68a03b --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Surface_mesh Mesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + +int main(int argc, char* argv[]) +{ + const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("small_bunny.obj"); + + Mesh g1; + if(!CGAL::IO::read_polygon_mesh(filename, g1)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + std::unordered_map vnm_vec; + boost::associative_property_map< std::unordered_map> vnm(vnm_vec); + + PMP::compute_vertex_normals(g1, vnm); + + + std::vector mu0_map, mu1_map, mu2_map; + + mu0_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + mu1_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + mu2_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + + int n = g1.faces().size(); + + for (int i = 0; i < n; i++) + { + std::cout << mu0_map[i] << "\n"; + } + + std::cout << "\n"; + + for (int i = 0; i < n; i++) + { + std::cout << mu1_map[i] << "\n"; + } + + std::cout << "\n"; + + for (int i = 0; i < n; i++) + { + std::cout << mu2_map[i] << "\n"; + } + + + CGAL::draw(g1); + + return EXIT_SUCCESS; +} diff --git a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp index 2e625d722cc1..86b2c23cb481 100644 --- a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp +++ b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp @@ -1,106 +1,26 @@ -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace PMP = CGAL::Polygon_mesh_processing; - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; -typedef CGAL::Polyhedron_3 Polyhedron; -typedef CGAL::Surface_mesh Mesh; -typedef boost::graph_traits::face_descriptor face_descriptor; -typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - - - -int main(int argc, char* argv[]) -{ - Mesh g1; - if (!PMP::IO::read_polygon_mesh("small_bunny.obj", g1) || !CGAL::is_triangle_mesh(g1)) - { - std::cerr << "Invalid input." << std::endl; - return 1; - } - - //int n1 = g1.size_of_facets(); - - std::unordered_map vnm_vec; - boost::associative_property_map< std::unordered_map> vnm(vnm_vec); - - PMP::compute_vertex_normals(g1, vnm); - - - - std::vector mu0_map, mu1_map, mu2_map; - - mu0_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU0_AREA_MEASURE, vnm); - mu1_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, vnm); - mu2_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, vnm); +#include - int n = g1.faces().size(); - - for (int i = 0; i < n; i++) - { - std::cout << mu0_map[i] << "\n"; - } - - std::cout << "\n"; - - for (int i = 0; i < n; i++) - { - std::cout << mu1_map[i] << "\n"; - } - - std::cout << "\n"; - - for (int i = 0; i < n; i++) - { - std::cout << mu2_map[i] << "\n"; - } - - - - - /*srand(time(NULL)); - - CGAL::GetGeomTraits GT; - - std::vector X(N); - std::vector U(N); - - for (int i = 0; i < N; i++) { - X[i] = { rand() , rand() , rand() }; - U[i] = { rand() , rand() , rand() }; - U[i] = U[i] / sqrt(U[i] * U[i]); - } - +#include +#include - std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU0_AREA_MEASURE) << std::endl; - std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU1_MEAN_CURVATURE_MEASURE) << std::endl; - std::cout << PMP::interpolated_mu_i_face(X, U, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE) << std::endl;*/ +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; - /*srand(time(NULL)); - Epic::Vector_3 x, y; - Epic::FT d = 0; +typedef CGAL::Triangulation_2 Triangulation; +typedef Triangulation::Vertex_circulator Vertex_circulator; +typedef Triangulation::Point Point; - Epic::Vector_3 z; - std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); - for (int i = 0; i < N; i++) - { - x * y; - } - std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); - std::cout << std::chrono::duration_cast(end - begin).count() << std::endl;*/ +int main() { + std::ifstream in("data/triangulation_prog1.cin"); + std::istream_iterator begin(in); + std::istream_iterator end; -} + Triangulation t; + t.insert(begin, end); + Vertex_circulator vc = t.incident_vertices(t.infinite_vertex()), + done(vc); + if (vc != nullptr) { + do { std::cout << vc->point() << std::endl; + }while(++vc != done); + } + return 0; \ No newline at end of file From 5af7795d9450ed2ff27e954b23cf65cfb3524cf5 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 15 Jul 2022 16:47:44 +0200 Subject: [PATCH 0004/1398] typo fix --- .../examples/Triangulation_2/triangulation_prog1.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp index 86b2c23cb481..b212837b4ee2 100644 --- a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp +++ b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp @@ -23,4 +23,5 @@ int main() { do { std::cout << vc->point() << std::endl; }while(++vc != done); } - return 0; \ No newline at end of file + return 0; +} \ No newline at end of file From 8c943fd433b4d3ce1390aa4802847a6a851d584c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 15 Jul 2022 17:23:13 +0200 Subject: [PATCH 0005/1398] typo fix --- .../examples/Triangulation_2/triangulation_prog1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp index b212837b4ee2..e68f7973163d 100644 --- a/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp +++ b/Triangulation_2/examples/Triangulation_2/triangulation_prog1.cpp @@ -24,4 +24,4 @@ int main() { }while(++vc != done); } return 0; -} \ No newline at end of file +} From 4b0577a2cff9d47e99577701eae6c3e085cc14c4 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 17 Jul 2022 18:46:04 +0200 Subject: [PATCH 0006/1398] added doc (yet to build), used generic GT instead of Epic, made VNM a named parameter (WIP) --- .../PackageDescription.txt | 4 + .../doc/Polygon_mesh_processing/examples.txt | 1 + .../interpolated_corrected_curvatures.cpp | 6 +- ...nterpolated_corrected_curvature_measures.h | 422 +++++++++++------- 4 files changed, 271 insertions(+), 162 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 34d2f83f08e2..9f6d7ffd4736 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -16,6 +16,10 @@ /// Functions to triangulate faces, and to refine and fair regions of a polygon mesh. /// \ingroup PkgPolygonMeshProcessingRef +/// \defgroup PMP_corrected_curvatures_grp Corrected Curvature Computation +/// Functions to compute the corrected curvatures of a polygon mesh. +/// \ingroup PkgPolygonMeshProcessingRef + /// \defgroup PMP_normal_grp Normal Computation /// Functions to compute unit normals for individual/all vertices or faces. /// \ingroup PkgPolygonMeshProcessingRef diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 3ce5384c81ce..0317812aa443 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -19,6 +19,7 @@ \example Polygon_mesh_processing/refine_fair_example.cpp \example Polygon_mesh_processing/mesh_slicer_example.cpp \example Polygon_mesh_processing/isotropic_remeshing_example.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures.cpp \example Polygon_mesh_processing/delaunay_remeshing_example.cpp \example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp \example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index f45bec68a03b..c117e3f817fe 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -43,9 +43,9 @@ int main(int argc, char* argv[]) std::vector mu0_map, mu1_map, mu2_map; - mu0_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - mu1_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - mu2_map = PMP::interpolated_corrected_measure_i(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + mu0_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + mu1_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + mu2_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); int n = g1.faces().size(); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 1ebf5fe4dfef..df5197b2f005 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -2,7 +2,6 @@ #define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H #endif -#include #include #include @@ -14,188 +13,293 @@ namespace CGAL { - namespace Polygon_mesh_processing { - - typedef Exact_predicates_inexact_constructions_kernel Epic; - - // enum to specify which measure is computed - enum Measure_index { - MU0_AREA_MEASURE, - MU1_MEAN_CURVATURE_MEASURE, - MU2_GAUSSIAN_CURVATURE_MEASURE - }; - - Epic::FT interpolated_mu_i_triangle(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, - const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, const Measure_index mu_i) - { - Epic::Vector_3 um; - switch (mu_i) - { - case MU0_AREA_MEASURE: - - um = (u0 + u1 + u2) / 3.0; +namespace Polygon_mesh_processing { + +// enum to specify which measure is computed +enum Measure_index { + MU0_AREA_MEASURE, + MU1_MEAN_CURVATURE_MEASURE, + MU2_GAUSSIAN_CURVATURE_MEASURE +}; + +/** +* \ingroup PMP_corrected_curvatures_grp +* +* computes the interpolated corrected measure of specific triangle. +* +* @tparam GT is the geometric traits class. +* +* @param x0 is the position of vertex #0. +* @param x1 is the position of vertex #1. +* @param x2 is the position of vertex #2. +* @param u0 is the normal vector of vertex #0. +* @param u1 is the normal vector of vertex #1. +* @param u2 is the normal vector of vertex #2. +* @param mu_i an enum for choosing between computing the area measure, +* the mean curvature measure, or the gaussian curvature measure. +* +* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given triangle. +* +* @see `interpolated_corrected_measure_face()` +* @see `interpolated_corrected_measure_quad()` +*/ +template +typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, + const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const Measure_index mu_i) +{ + switch (mu_i) + { + case MU0_AREA_MEASURE: + { + const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; + + return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); + } + case MU1_MEAN_CURVATURE_MEASURE: + { + const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; - return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); + return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) + + CGAL::cross_product(u0 - u2, x1) + + CGAL::cross_product(u1 - u0, x2)); + } + case MU2_GAUSSIAN_CURVATURE_MEASURE: - case MU1_MEAN_CURVATURE_MEASURE: + return 0.5 * u0 * CGAL::cross_product(u1, u2); - um = (u0 + u1 + u2) / 3.0; + default: return 0; + } +} - return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) - + CGAL::cross_product(u0 - u2, x1) - + CGAL::cross_product(u1 - u0, x2)); +/** +* \ingroup PMP_corrected_curvatures_grp +* +* computes the interpolated corrected measure of specific quad +* Note that the vertices 0 to 3 are ordered like this \n +* v0 _ v1 \n +* v2 |_| v3 +* +* @tparam GT is the geometric traits class. +* +* @param x0 is the position of vertex #0. +* @param x1 is the position of vertex #1. +* @param x2 is the position of vertex #2. +* @param x3 is the position of vertex #3. +* @param u0 is the normal vector of vertex #0. +* @param u1 is the normal vector of vertex #1. +* @param u2 is the normal vector of vertex #2. +* @param u3 is the normal vector of vertex #3. +* @param mu_i an enum for choosing between computing the area measure, +* the mean curvature measure, or the gaussian curvature measure. +* +* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given triangle. +* +* @see `interpolated_corrected_measure_face()` +* @see `interpolated_corrected_measure_quad()` +*/ +template +typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, const typename GT::Vector_3 x3, + const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const typename GT::Vector_3 u3, const Measure_index mu_i) +{ + /// x0 _ x1 + /// x2 |_| x3 + + switch (mu_i) + { + case MU0_AREA_MEASURE: + + return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(x1 - x0, x3 - x1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(x3 - x2, x2 - x0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1)); + + case MU1_MEAN_CURVATURE_MEASURE: + { + const typename GT::Vector_3 u03 = u3 - u0; + const typename GT::Vector_3 u12 = u2 - u1; + const typename GT::Vector_3 x0_cross = CGAL::cross_product(u12, x0); + const typename GT::Vector_3 x1_cross = -CGAL::cross_product(u03, x1); + const typename GT::Vector_3 x2_cross = CGAL::cross_product(u03, x2); + const typename GT::Vector_3 x3_cross = -CGAL::cross_product(u12, x3); + + + return (1 / 12.0) * (u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) + + u1 * (CGAL::cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - CGAL::cross_product((u0 + u2), x3)) + + u2 * (CGAL::cross_product(-(u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) + + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross)); + } + case MU2_GAUSSIAN_CURVATURE_MEASURE: - case MU2_GAUSSIAN_CURVATURE_MEASURE: + return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(u1 - u0, u3 - u1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(u3 - u2, u2 - u0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1)); - return 0.5 * u0 * CGAL::cross_product(u1, u2); + default: return 0; + } +} - default: return 0; - } - } - Epic::FT interpolated_mu_i_quad(const Epic::Vector_3 x0, const Epic::Vector_3 x1, const Epic::Vector_3 x2, const Epic::Vector_3 x3, - const Epic::Vector_3 u0, const Epic::Vector_3 u1, const Epic::Vector_3 u2, const Epic::Vector_3 u3, const Measure_index mu_i) +/** +* \ingroup PMP_corrected_curvatures_grp +* +* computes the interpolated corrected measure of specific face. +* +* @tparam GT is the geometric traits class. +* +* @param x is a vector of the vertex positions of the face. +* @param u is a vector of the vertex nomrals of the face. +* @param mu_i an enum for choosing between computing the area measure, +* the mean curvature measure, or the gaussian curvature measure. +* +* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given face. +* +* @see `interpolated_corrected_measure_triangle()` +* @see `interpolated_corrected_measure_quad()` +* @see `interpolated_corrected_measure_mesh()` +*/ +template +typename GT::FT interpolated_corrected_measure_face(const std::vector& x, const std::vector& u, const Measure_index mu_i) +{ + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + // Triangle: use triangle formulas + if (n == 3) + return interpolated_corrected_measure_triangle(x[0], x[1], x[2], + u[0], u[1], u[2], mu_i); + + // Quad: use bilinear interpolation formulas + else if (n == 4) + /// x[0] _ x[1] ---> x0 _ x1 (reason for changing order) + /// x[3] |_| x[2] ---> x2 |_| x3 + return interpolated_corrected_measure_quad(x[0], x[1], x[3], x[2], + u[0], u[1], u[3], u[2], mu_i); + + // N-gon: split into n triangles by barycenter and use triangle formulas for each + else { + typename GT::FT mu0 = 0; + + // getting barycenter of points + typename GT::Vector_3 xm = std::accumulate(x.begin(), x.end(), GT::Vector_3(0, 0, 0)); + xm /= n; + + // getting unit average normal of points + typename GT::Vector_3 um = std::accumulate(u.begin(), u.end(), GT::Vector_3(0, 0, 0)); + um /= sqrt(um * um); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) { - /// x0 _ x1 - /// x2 |_| x3 - - switch (mu_i) - { - case MU0_AREA_MEASURE: - - return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(x1 - x0, x3 - x1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(x3 - x2, x2 - x0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1)); - - case MU1_MEAN_CURVATURE_MEASURE: - { - const Epic::Vector_3 u03 = u3 - u0; - const Epic::Vector_3 u12 = u2 - u1; - const Epic::Vector_3 x0_cross = CGAL::cross_product(u12, x0); - const Epic::Vector_3 x1_cross = -CGAL::cross_product(u03, x1); - const Epic::Vector_3 x2_cross = CGAL::cross_product(u03, x2); - const Epic::Vector_3 x3_cross = -CGAL::cross_product(u12, x3); - - - return (1 / 12.0) * (u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) - + u1 * (CGAL::cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - CGAL::cross_product((u0 + u2), x3)) - + u2 * (CGAL::cross_product(-(u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) - + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross)); - } - case MU2_GAUSSIAN_CURVATURE_MEASURE: - - return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(u1 - u0, u3 - u1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(u3 - u2, u2 - u0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1)); - - default: return 0; - } + mu0 += interpolated_corrected_measure_triangle(x[i], x[(i + 1) % n], xm, + u[i], u[(i + 1) % n], um, mu_i); } + return mu0; + } +} - Epic::FT interpolated_mu_i_face(const std::vector& x, const std::vector& u, const Measure_index mu_i) - { - std::size_t n = x.size(); - CGAL_precondition(u.size() == n); - CGAL_precondition(n >= 3); - - // Triangle: use triangle formulas - if (n == 3) - return interpolated_mu_i_triangle(x[0], x[1], x[2], - u[0], u[1], u[2], mu_i); - - // Quad: use bilinear interpolation formulas - else if (n == 4) - /// x[0] _ x[1] ---> x0 _ x1 (reason for changing order) - /// x[3] |_| x[2] ---> x2 |_| x3 - return interpolated_mu_i_quad(x[0], x[1], x[3], x[2], - u[0], u[1], u[3], u[2], mu_i); - - // N-gon: split into n triangles by barycenter and use triangle formulas for each - else { - Epic::FT mu0 = 0; - - // getting barycenter of points - Epic::Vector_3 xm = std::accumulate(x.begin(), x.end(), Epic::Vector_3(0, 0, 0)); - xm /= n; - - // getting unit average normal of points - Epic::Vector_3 um = std::accumulate(u.begin(), u.end(), Epic::Vector_3(0, 0, 0)); - um /= sqrt(um * um); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu0 += interpolated_mu_i_triangle(x[i], x[(i + 1) % n], xm, - u[i], u[(i + 1) % n], um, mu_i); - } - return mu0; - } - } - - /// TODO: - /// 1- Handle if VNM is not given - /// 2- use GT instead of Epic - - template - std::vector - interpolated_corrected_measure_i( - const PolygonMesh& pmesh, - const Measure_index mu_i, - VertexNormalMap vnm, - const NamedParameters& np = parameters::default_values()) - { - using parameters::choose_parameter; - using parameters::get_parameter; +/** +* \ingroup PMP_corrected_curvatures_grp +* +* computes the interpolated corrected curvature measure on each face of the mesh +* +* @tparam PolygonMesh a model of `FaceGraph` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param mu_i an enum for choosing between computing the area measure, the mean curvature measure or the gaussian curvature measure +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` +* must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`TODO`} +* \cgalParamExtra{If this parameter is omitted, vertex normals should be computed inside the function body.} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @return a vector of the computed measure on all faces. The return type is a std::vector. +* GT is the type of the Geometric Triats deduced from the PolygonMesh and the NamedParameters arguments +* This is to be changed later to a property_map. +* +* @see `interpolated_corrected_measure_face()` +*/ +template +#ifdef DOXYGEN_RUNNING + std::vector +#else + std::vector::type::FT> +#endif + interpolated_corrected_measure_mesh( + const PolygonMesh& pmesh, + const Measure_index mu_i, + NamedParameters& np = parameters::default_values()) +{ + typedef GetGeomTraits::type GT; + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type VNM; - typedef boost::graph_traits::face_descriptor face_descriptor; - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; - typename GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - //std::unordered_map vnm_init; + typedef boost::graph_traits::face_descriptor face_descriptor; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; - //boost::associative_property_map - // ::vertex_descriptor, Epic::Vector_3>> vnm(vnm_init); + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); - ////if (!vnm) - // { - // compute_vertex_normals(pmesh, vnm, np); - //} + VNM vnm = choose_parameter( + get_parameter(np, internal_np::vertex_normal_map), Vector_map_tag(), pmesh); - std::vector mu_i_map; + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + std::vector mu_i_map; - for (face_descriptor f : faces(pmesh)) - { - halfedge_descriptor h_start = pmesh.halfedge(f); - halfedge_descriptor h_iter = h_start; - std::vector x; - std::vector u; + for (face_descriptor f : faces(pmesh)) + { + halfedge_descriptor h_start = pmesh.halfedge(f); + halfedge_descriptor h_iter = h_start; - // looping over vertices in face - do { - vertex_descriptor v = source(h_iter, pmesh); - Epic::Point_3 p = get(vpm, v); - x.push_back(Epic::Vector_3(p.x(),p.y(),p.z())); - u.push_back(get(vnm, v)); - h_iter = next(h_iter, pmesh); - } while (h_iter != h_start); + std::vector x; + std::vector u; + // looping over vertices in face + do { + vertex_descriptor v = source(h_iter, pmesh); + GT::Point_3 p = get(vpm, v); + x.push_back(GT::Vector_3(p.x(),p.y(),p.z())); + u.push_back(get(vnm, v)); + h_iter = next(h_iter, pmesh); + } while (h_iter != h_start); - mu_i_map.push_back(interpolated_mu_i_face(x, u, mu_i)); - } - return mu_i_map; - } + mu_i_map.push_back(interpolated_corrected_measure_face(x, u, mu_i)); } + return mu_i_map; } - +} +} \ No newline at end of file From c3d654b2c372ae23c135d0641faab1edd099c772 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 02:44:14 +0200 Subject: [PATCH 0007/1398] add documentation for enum --- ...nterpolated_corrected_curvature_measures.h | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index df5197b2f005..0b164f2d8509 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -15,11 +15,16 @@ namespace CGAL { namespace Polygon_mesh_processing { -// enum to specify which measure is computed +/*! + * \ingroup PMP_corrected_curvatures_grp + * Enumeration type used to specify which measure is computed for the + * interpolated corrected curvature functions + */ +// enum enum Measure_index { - MU0_AREA_MEASURE, - MU1_MEAN_CURVATURE_MEASURE, - MU2_GAUSSIAN_CURVATURE_MEASURE + MU0_AREA_MEASURE, ///< corrected area density of the given face + MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density of the given face + MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density of the given face }; /** @@ -101,8 +106,8 @@ template typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, const typename GT::Vector_3 x3, const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const typename GT::Vector_3 u3, const Measure_index mu_i) { - /// x0 _ x1 - /// x2 |_| x3 + // x0 _ x1 + // x2 |_| x3 switch (mu_i) { @@ -172,8 +177,8 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector x0 _ x1 (reason for changing order) - /// x[3] |_| x[2] ---> x2 |_| x3 + // x[0] _ x[1] ---> x0 _ x1 (reason for changing order) + // x[3] |_| x[2] ---> x2 |_| x3 return interpolated_corrected_measure_quad(x[0], x[1], x[3], x[2], u[0], u[1], u[3], u[2], mu_i); From e1961c4340bef283b3b4c27afaceecdd89d3c01a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 02:48:52 +0200 Subject: [PATCH 0008/1398] minor doc fix --- .../Curvatures/interpolated_corrected_curvature_measures.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 0b164f2d8509..cf6ca10fc8ec 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -100,7 +100,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto * @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` -* @see `interpolated_corrected_measure_quad()` +* @see `interpolated_corrected_measure_triangle()` */ template typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, const typename GT::Vector_3 x3, From 138f1ea831d9138f008bcb88e0d0db8f7dd26f5b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 03:31:49 +0200 Subject: [PATCH 0009/1398] added to reference manual page --- .../doc/Polygon_mesh_processing/PackageDescription.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 9f6d7ffd4736..c25cfb8490d3 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -200,6 +200,12 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - \link PMP_locate_grp Nearest Face Location Queries \endlink - \link PMP_locate_grp Random Location Generation \endlink +\cgalCRPSection{Corrected Curvature Functions} +- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_mesh()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_face()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_triangle()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_quad()` + \cgalCRPSection{Normal Computation Functions} - `CGAL::Polygon_mesh_processing::compute_face_normal()` - `CGAL::Polygon_mesh_processing::compute_face_normals()` From b1e191212c8d727180e0614ceae545acc8527b9f Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 04:35:21 +0200 Subject: [PATCH 0010/1398] doc typos --- .../interpolated_corrected_curvature_measures.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index cf6ca10fc8ec..38fa4bb05bd8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -18,7 +18,7 @@ namespace Polygon_mesh_processing { /*! * \ingroup PMP_corrected_curvatures_grp * Enumeration type used to specify which measure is computed for the - * interpolated corrected curvature functions + * interpolated corrected curvature functions. */ // enum enum Measure_index { @@ -30,7 +30,7 @@ enum Measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific triangle. +* computes the interpolated corrected measure of a specific triangle. * * @tparam GT is the geometric traits class. * @@ -79,8 +79,8 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific quad -* Note that the vertices 0 to 3 are ordered like this \n +* computes the interpolated corrected measure of a specific quad. \n +* Note that the vertices 0 to 3 are ordered like this: \n * v0 _ v1 \n * v2 |_| v3 * @@ -148,7 +148,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific face. +* computes the interpolated corrected measure of a specific face. * * @tparam GT is the geometric traits class. * @@ -208,7 +208,7 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector Date: Mon, 18 Jul 2022 16:17:03 +0200 Subject: [PATCH 0011/1398] used a face property map for computing measures, added license will update docs to match void interpolated_corrected_measure_mesh( const PolygonMesh& pmesh, FaceMeasureMap fmm, const Measure_index mu_i, NamedParameters& np = parameters::default_values()) { later if it works --- ...nterpolated_corrected_curvature_measures.h | 54 ++++++++++++++++++ .../interpolated_corrected_curvatures.cpp | 40 ++++---------- ...nterpolated_corrected_curvature_measures.h | 55 ++++++++----------- 3 files changed, 88 insertions(+), 61 deletions(-) create mode 100644 Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h diff --git a/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h b/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h new file mode 100644 index 000000000000..15e2a79af8a9 --- /dev/null +++ b/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h @@ -0,0 +1,54 @@ +// Copyright (c) 2016 GeometryFactory SARL (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Andreas Fabri +// +// Warning: this file is generated, see include/CGAL/licence/README.md + +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H + +#include +#include + +#ifdef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE + +# if CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +# if defined(CGAL_LICENSE_WARNING) + + CGAL_pragma_warning("Your commercial license for CGAL does not cover " + "this release of the Polygon Mesh Processing - Interpolated Corrected Curvatures package.") +# endif + +# ifdef CGAL_LICENSE_ERROR +# error "Your commercial license for CGAL does not cover this release \ + of the Polygon Mesh Processing - Interpolated Corrected Curvatures package. \ + You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +# endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE + +#else // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE + +# if defined(CGAL_LICENSE_WARNING) + CGAL_pragma_warning("\nThe macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE is not defined." + "\nYou use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under " + "the terms of the GPLv3+.") +# endif // CGAL_LICENSE_WARNING + +# ifdef CGAL_LICENSE_ERROR +# error "The macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE is not defined.\ + You use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under the terms of \ + the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR." +# endif // CGAL_LICENSE_ERROR + +#endif // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE + +#endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index c117e3f817fe..8dcf387d0ed5 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -23,6 +23,7 @@ typedef CGAL::Polyhedron_3 Polyhedron; typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef std::unordered_map FaceMeasureMap_tag; int main(int argc, char* argv[]) @@ -35,41 +36,20 @@ int main(int argc, char* argv[]) std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; } - std::unordered_map vnm_vec; - boost::associative_property_map< std::unordered_map> vnm(vnm_vec); + std::unordered_map vnm_init; + boost::associative_property_map< std::unordered_map> vnm(vnm_init); PMP::compute_vertex_normals(g1, vnm); + FaceMeasureMap_tag mu0_init, mu1_init, mu2_init; + boost::associative_property_map mu0_map(mu0_init), mu1_map(mu1_init), mu2_map(mu2_init); - std::vector mu0_map, mu1_map, mu2_map; + PMP::interpolated_corrected_measure_mesh(g1, mu0_map, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + PMP::interpolated_corrected_measure_mesh(g1, mu1_map, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + PMP::interpolated_corrected_measure_mesh(g1, mu2_map, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - mu0_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - mu1_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - mu2_map = PMP::interpolated_corrected_measure_mesh(g1, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - - int n = g1.faces().size(); - - for (int i = 0; i < n; i++) + for (face_descriptor f: g1.faces()) { - std::cout << mu0_map[i] << "\n"; + std::cout << f.idx() << ": " << get(mu0_map, f) << ", " << get(mu1_map, f) << ", " << get(mu2_map, f) << ", " << "\n"; } - - std::cout << "\n"; - - for (int i = 0; i < n; i++) - { - std::cout << mu1_map[i] << "\n"; - } - - std::cout << "\n"; - - for (int i = 0; i < n; i++) - { - std::cout << mu2_map[i] << "\n"; - } - - - CGAL::draw(g1); - - return EXIT_SUCCESS; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 38fa4bb05bd8..6a5c675d4e69 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -3,6 +3,7 @@ #endif #include +#include #include #include @@ -17,10 +18,10 @@ namespace Polygon_mesh_processing { /*! * \ingroup PMP_corrected_curvatures_grp - * Enumeration type used to specify which measure is computed for the - * interpolated corrected curvature functions. + * Enumeration type used to specify which measure is computed for the + * interpolated corrected curvature functions */ -// enum +// enum enum Measure_index { MU0_AREA_MEASURE, ///< corrected area density of the given face MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density of the given face @@ -30,7 +31,7 @@ enum Measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of a specific triangle. +* computes the interpolated corrected measure of specific triangle. * * @tparam GT is the geometric traits class. * @@ -79,9 +80,9 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of a specific quad. \n -* Note that the vertices 0 to 3 are ordered like this: \n -* v0 _ v1 \n +* computes the interpolated corrected measure of specific quad +* Note that the vertices 0 to 3 are ordered like this \n +* v0 _ v1 \n * v2 |_| v3 * * @tparam GT is the geometric traits class. @@ -148,7 +149,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of a specific face. +* computes the interpolated corrected measure of specific face. * * @tparam GT is the geometric traits class. * @@ -208,12 +209,12 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%vertex_descriptor` @@ -234,29 +235,27 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector. +* @return a vector of the computed measure on all faces. The return type is a std::vector. * GT is the type of the Geometric Triats deduced from the PolygonMesh and the NamedParameters arguments * This is to be changed later to a property_map. * * @see `interpolated_corrected_measure_face()` */ -template -#ifdef DOXYGEN_RUNNING - std::vector -#else - std::vector::type::FT> -#endif + void interpolated_corrected_measure_mesh( const PolygonMesh& pmesh, + FaceMeasureMap fmm, const Measure_index mu_i, NamedParameters& np = parameters::default_values()) { + typedef GetGeomTraits::type GT; - typedef dynamic_vertex_property_t Vector_map_tag; + typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -274,16 +272,13 @@ template::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); - - VNM vnm = choose_parameter( - get_parameter(np, internal_np::vertex_normal_map), Vector_map_tag(), pmesh); + + // TODO - handle if vnm is not provided + VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vector_map_tag(), pmesh)); if (is_default_parameter::value) compute_vertex_normals(pmesh, vnm, np); - std::vector mu_i_map; - - for (face_descriptor f : faces(pmesh)) { halfedge_descriptor h_start = pmesh.halfedge(f); @@ -301,10 +296,8 @@ template(x, u, mu_i)); + put(fmm, f, interpolated_corrected_measure_face(x, u, mu_i)); } - return mu_i_map; } } -} \ No newline at end of file +} From a54033c0c9211b9c9c42b8eeb6ec6f3f7fa86dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 18 Jul 2022 16:32:33 +0200 Subject: [PATCH 0012/1398] add a couple of missing const and typename --- ...nterpolated_corrected_curvature_measures.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 6a5c675d4e69..46b2f5c01fcc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -188,11 +188,11 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::type GT; + typedef typename GetGeomTraits::type GT; typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::type Default_vector_map; + typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::type VNM; @@ -265,9 +265,9 @@ template::face_descriptor face_descriptor; - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), @@ -284,14 +284,14 @@ template x; - std::vector u; + std::vector x; + std::vector u; // looping over vertices in face do { vertex_descriptor v = source(h_iter, pmesh); - GT::Point_3 p = get(vpm, v); - x.push_back(GT::Vector_3(p.x(),p.y(),p.z())); + typename GT::Point_3 p = get(vpm, v); + x.push_back(typename GT::Vector_3(p.x(),p.y(),p.z())); u.push_back(get(vnm, v)); h_iter = next(h_iter, pmesh); } while (h_iter != h_start); From 5cc75c0bc4690df397c7dc14d03ca3049ad113f2 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 21:57:42 +0200 Subject: [PATCH 0013/1398] Updated Demo Display property plugin, added to license list, --- .../include/CGAL/license/gpl_package_list.txt | 1 + .../interpolated_corrected_curvatures.cpp | 2 +- ...nterpolated_corrected_curvature_measures.h | 10 +- .../Display/Display_property_plugin.cpp | 191 +++++++++++++++++- 4 files changed, 188 insertions(+), 16 deletions(-) diff --git a/Installation/include/CGAL/license/gpl_package_list.txt b/Installation/include/CGAL/license/gpl_package_list.txt index f023d48f375f..485c4234b91d 100644 --- a/Installation/include/CGAL/license/gpl_package_list.txt +++ b/Installation/include/CGAL/license/gpl_package_list.txt @@ -51,6 +51,7 @@ Polygon_mesh_processing/connected_components Polygon Mesh Processing - Connected Polygon_mesh_processing/corefinement Polygon Mesh Processing - Corefinement Polygon_mesh_processing/core Polygon Mesh Processing - Core Polygon_mesh_processing/distance Polygon Mesh Processing - Distance +Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures Polygon Mesh Processing - Interpolated Corrected Curvatures Polygon_mesh_processing/measure Polygon Mesh Processing - Geometric Measure Polygon_mesh_processing/meshing_hole_filling Polygon Mesh Processing - Meshing and Hole Filling Polygon_mesh_processing/orientation Polygon Mesh Processing - Orientation diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 8dcf387d0ed5..d17e37726a8a 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -44,7 +44,7 @@ int main(int argc, char* argv[]) FaceMeasureMap_tag mu0_init, mu1_init, mu2_init; boost::associative_property_map mu0_map(mu0_init), mu1_map(mu1_init), mu2_map(mu2_init); - PMP::interpolated_corrected_measure_mesh(g1, mu0_map, PMP::MU0_AREA_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + PMP::interpolated_corrected_measure_mesh(g1, mu0_map, PMP::MU0_AREA_MEASURE); PMP::interpolated_corrected_measure_mesh(g1, mu1_map, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); PMP::interpolated_corrected_measure_mesh(g1, mu2_map, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 46b2f5c01fcc..7f99fbd7cace 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -22,7 +22,7 @@ namespace Polygon_mesh_processing { * interpolated corrected curvature functions */ // enum -enum Measure_index { +enum Curvature_measure_index { MU0_AREA_MEASURE, ///< corrected area density of the given face MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density of the given face MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density of the given face @@ -51,7 +51,7 @@ enum Measure_index { */ template typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, - const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const Measure_index mu_i) + const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) { switch (mu_i) { @@ -105,7 +105,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto */ template typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, const typename GT::Vector_3 x3, - const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const typename GT::Vector_3 u3, const Measure_index mu_i) + const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const typename GT::Vector_3 u3, const Curvature_measure_index mu_i) { // x0 _ x1 // x2 |_| x3 @@ -165,7 +165,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 * @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_measure_face(const std::vector& x, const std::vector& u, const Measure_index mu_i) +typename GT::FT interpolated_corrected_measure_face(const std::vector& x, const std::vector& u, const Curvature_measure_index mu_i) { std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -250,7 +250,7 @@ template #include #include +#include #include "Scene_points_with_normal_item.h" @@ -31,6 +32,7 @@ #include #include #include +#include #define ARBITRARY_DBL_MIN 1.0E-30 #define ARBITRARY_DBL_MAX 1.0E+30 @@ -41,6 +43,8 @@ typedef CGAL::Three::Triangle_container Tri; typedef CGAL::Three::Viewer_interface VI; +namespace PMP = CGAL::Polygon_mesh_processing; + class Scene_heat_item : public CGAL::Three::Scene_item_rendering_helper { @@ -529,6 +533,9 @@ private Q_SLOTS: dock_widget->propertyBox->addItem("Scaled Jacobian"); dock_widget->propertyBox->addItem("Heat Intensity"); dock_widget->propertyBox->addItem("Heat Intensity (Intrinsic Delaunay)"); + dock_widget->propertyBox->addItem("corrected area density"); + dock_widget->propertyBox->addItem("corrected mean curvature density"); + dock_widget->propertyBox->addItem("corrected gaussian curvature density"); detectSMScalarProperties(sm_item->face_graph()); } @@ -603,6 +610,18 @@ private Q_SLOTS: return; sm_item->setRenderingMode(Gouraud); break; + case 4: // corrected area density + displayInterpolatedCurvatureMeasure(sm_item, PMP::MU0_AREA_MEASURE); + sm_item->setRenderingMode(Flat); + break; + case 5: // corrected mean curvature density + displayInterpolatedCurvatureMeasure(sm_item, PMP::MU1_MEAN_CURVATURE_MEASURE); + sm_item->setRenderingMode(Flat); + break; + case 6: // corrected gaussian curvature density + displayInterpolatedCurvatureMeasure(sm_item, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE); + sm_item->setRenderingMode(Flat); + break; default: if(dock_widget->propertyBox->currentText().contains("v:")) { @@ -637,6 +656,18 @@ private Q_SLOTS: sm_item->face_graph()->property_map("f:angle"); if(does_exist) sm_item->face_graph()->remove_property_map(pmap); + std::tie(pmap, does_exist) = + sm_item->face_graph()->property_map("f:corrected_area_density"); + if (does_exist) + sm_item->face_graph()->remove_property_map(pmap); + std::tie(pmap, does_exist) = + sm_item->face_graph()->property_map("f:corrected_mean_curvature_density"); + if (does_exist) + sm_item->face_graph()->remove_property_map(pmap); + std::tie(pmap, does_exist) = + sm_item->face_graph()->property_map("f:corrected_gaussian_curvature_density"); + if (does_exist) + sm_item->face_graph()->remove_property_map(pmap); }); QApplication::restoreOverrideCursor(); sm_item->invalidateOpenGLBuffers(); @@ -668,13 +699,25 @@ private Q_SLOTS: switch(dock_widget->propertyBox->currentIndex()) { case 0: - dock_widget->zoomToMinButton->setEnabled(angles_max.count(sm_item)>0 ); + dock_widget->zoomToMinButton->setEnabled(angles_min.count(sm_item)>0 ); dock_widget->zoomToMaxButton->setEnabled(angles_max.count(sm_item)>0 ); break; case 1: - dock_widget->zoomToMinButton->setEnabled(jacobian_max.count(sm_item)>0); + dock_widget->zoomToMinButton->setEnabled(jacobian_min.count(sm_item)>0); dock_widget->zoomToMaxButton->setEnabled(jacobian_max.count(sm_item)>0); break; + case 4: + dock_widget->zoomToMinButton->setEnabled(mu0_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(mu0_max.count(sm_item) > 0); + break; + case 5: + dock_widget->zoomToMinButton->setEnabled(mu1_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(mu1_max.count(sm_item) > 0); + break; + case 6: + dock_widget->zoomToMinButton->setEnabled(mu2_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(mu2_max.count(sm_item) > 0); + break; default: break; } @@ -701,11 +744,28 @@ private Q_SLOTS: { smesh.remove_property_map(angles); } + SMesh::Property_map mu0; + std::tie(mu0, found) = smesh.property_map("f:corrected_area_density"); + if (found) + { + smesh.remove_property_map(mu0); + } + SMesh::Property_map mu1; + std::tie(mu1, found) = smesh.property_map("f:corrected_mean_curvature_density"); + if (found) + { + smesh.remove_property_map(mu0); + } + SMesh::Property_map mu2; + std::tie(mu2, found) = smesh.property_map("f:corrected_gaussian_curvature_density"); + if (found) + { + smesh.remove_property_map(mu0); + } } void displayScaledJacobian(Scene_surface_mesh_item* item) { - SMesh& smesh = *item->face_graph(); //compute and store the jacobian per face bool non_init; @@ -742,16 +802,59 @@ private Q_SLOTS: treat_sm_property("f:jacobian", item->face_graph()); } - bool resetScaledJacobian(Scene_surface_mesh_item* item) + void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { + std::vector tied_map = { + "f:corrected_area_density", + "f:corrected_mean_curvature_density", + "f:corrected_gaussian_curvature_density" + }; SMesh& smesh = *item->face_graph(); - if(!smesh.property_map("f:jacobian").second) + //compute once and store the value per face + bool non_init; + SMesh::Property_map mu_i_map; + std::tie(mu_i_map, non_init) = + smesh.add_property_map(tied_map[mu_index], 0); + if (non_init) { - return false; + PMP::interpolated_corrected_measure_mesh(smesh, mu_i_map, mu_index); + + double res_min = ARBITRARY_DBL_MAX, + res_max = -ARBITRARY_DBL_MAX; + SMesh::Face_index min_index, max_index; + for (SMesh::Face_index f : faces(smesh)) + { + if (mu_i_map[f] > res_max) + { + res_max = mu_i_map[f]; + max_index = f; + } + if (mu_i_map[f] < res_min) + { + res_min = mu_i_map[f]; + min_index = f; + } + } + switch (mu_index) + { + case PMP::MU0_AREA_MEASURE: + mu0_max[item] = std::make_pair(res_max, max_index); + mu0_min[item] = std::make_pair(res_min, min_index); + break; + case PMP::MU1_MEAN_CURVATURE_MEASURE: + mu1_max[item] = std::make_pair(res_max, max_index); + mu1_min[item] = std::make_pair(res_min, min_index); + break; + case PMP::MU2_GAUSSIAN_CURVATURE_MEASURE: + mu2_max[item] = std::make_pair(res_max, max_index); + mu2_min[item] = std::make_pair(res_min, min_index); + break; + } + + connect(item, &Scene_surface_mesh_item::itemChanged, + this, &DisplayPropertyPlugin::resetProperty); } - dock_widget->minBox->setValue(jacobian_min[item].first-0.01); - dock_widget->maxBox->setValue(jacobian_max[item].first); - return true; + treat_sm_property(tied_map[mu_index], item->face_graph()); } @@ -1054,6 +1157,9 @@ private Q_SLOTS: break; } case 1: + case 4: + case 5: + case 6: dock_widget->groupBox-> setEnabled(true); dock_widget->groupBox_3->setEnabled(true); @@ -1113,6 +1219,34 @@ private Q_SLOTS: dummy_fd, dummy_p); } + break; + case 4: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu0_min[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); + } + break; + case 5: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu1_min[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); + } + break; + case 6: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu2_min[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); + } + break; break; default: break; @@ -1145,6 +1279,33 @@ private Q_SLOTS: getActiveViewer(), dummy_fd, dummy_p); + } + break; + case 4: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu0_max[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); + } + break; + case 5: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu1_max[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); + } + break; + case 6: + { + ::zoomToId(*item->face_graph(), + QString("f%1").arg(mu2_max[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); } break; default: @@ -1436,6 +1597,16 @@ private Q_SLOTS: std::unordered_map > angles_min; std::unordered_map > angles_max; + + std::unordered_map > mu0_min; + std::unordered_map > mu0_max; + + std::unordered_map > mu1_min; + std::unordered_map > mu1_max; + + std::unordered_map > mu2_min; + std::unordered_map > mu2_max; + std::unordered_map is_source; @@ -1718,7 +1889,7 @@ private Q_SLOTS: } - EPICK::Vector_3 unit_center_normal = CGAL::Polygon_mesh_processing::compute_face_normal(f, mesh); + EPICK::Vector_3 unit_center_normal = PMP::compute_face_normal(f, mesh); unit_center_normal *= 1.0/CGAL::approximate_sqrt(unit_center_normal.squared_length()); for(std::size_t i = 0; i < corner_areas.size(); ++i) From 5af4a28b1674cb660d1c4575ccf69a5d4925ace5 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 18 Jul 2022 22:23:46 +0200 Subject: [PATCH 0014/1398] updated doc for interpolated_corrected_measure_mesh() --- ...nterpolated_corrected_curvature_measures.h | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 7f99fbd7cace..93d41ac77db7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -18,10 +18,10 @@ namespace Polygon_mesh_processing { /*! * \ingroup PMP_corrected_curvatures_grp - * Enumeration type used to specify which measure is computed for the + * Enumeration type used to specify which measure is computed for the * interpolated corrected curvature functions */ -// enum +// enum enum Curvature_measure_index { MU0_AREA_MEASURE, ///< corrected area density of the given face MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density of the given face @@ -212,9 +212,12 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%face_descriptor` as key type and GT::FT as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * -* @param pmesh the polygon mesh +* @param pmesh the polygon mesh +* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure * @param mu_i an enum for choosing between computing the area measure, the mean curvature measure or the gaussian curvature measure * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * @@ -227,7 +230,7 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%vertex_descriptor` @@ -235,12 +238,8 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector. -* GT is the type of the Geometric Triats deduced from the PolygonMesh and the NamedParameters arguments -* This is to be changed later to a property_map. +* \cgalNamedParamsEnd * * @see `interpolated_corrected_measure_face()` */ @@ -272,7 +271,7 @@ template::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); - + // TODO - handle if vnm is not provided VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vector_map_tag(), pmesh)); @@ -291,7 +290,7 @@ template Date: Mon, 18 Jul 2022 22:40:38 +0200 Subject: [PATCH 0015/1398] minor fix --- .../interpolated_corrected_curvatures.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index d17e37726a8a..05c74f68cfc7 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -28,7 +28,7 @@ typedef std::unordered_map FaceMeasureMap_tag; int main(int argc, char* argv[]) { - const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("small_bunny.obj"); + const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); Mesh g1; if(!CGAL::IO::read_polygon_mesh(filename, g1)) From 063e058988567727b9ae5421a98212e18958841e Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 22 Jul 2022 15:29:19 +0200 Subject: [PATCH 0016/1398] minor changes regarding the pull review reordering includes, splitting too long lines, minor addition to doc regarding review on the pull req --- .../interpolated_corrected_curvatures.cpp | 66 +++++++----- ...nterpolated_corrected_curvature_measures.h | 102 +++++++++++------- 2 files changed, 104 insertions(+), 64 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 05c74f68cfc7..505d43286451 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -1,55 +1,67 @@ -#include #include -#include -#include -#include +#include #include -#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include + namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; -typedef CGAL::Polyhedron_3 Polyhedron; -typedef CGAL::Surface_mesh Mesh; +typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; +typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; -typedef std::unordered_map FaceMeasureMap_tag; +typedef std::unordered_map FaceMeasureMap_tag; +typedef std::unordered_map vertexVectorMap_tag; int main(int argc, char* argv[]) { - const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); - Mesh g1; + const std::string filename = (argc>1) ? + argv[1] : + CGAL::data_file_path("meshes/small_bunny.obj"); + if(!CGAL::IO::read_polygon_mesh(filename, g1)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; } - std::unordered_map vnm_init; - boost::associative_property_map< std::unordered_map> vnm(vnm_init); + + vertexVectorMap_tag vnm_init; + boost::associative_property_map vnm(vnm_init); PMP::compute_vertex_normals(g1, vnm); FaceMeasureMap_tag mu0_init, mu1_init, mu2_init; - boost::associative_property_map mu0_map(mu0_init), mu1_map(mu1_init), mu2_map(mu2_init); + boost::associative_property_map + mu0_map(mu0_init), mu1_map(mu1_init), mu2_map(mu2_init); - PMP::interpolated_corrected_measure_mesh(g1, mu0_map, PMP::MU0_AREA_MEASURE); - PMP::interpolated_corrected_measure_mesh(g1, mu1_map, PMP::MU1_MEAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); - PMP::interpolated_corrected_measure_mesh(g1, mu2_map, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, CGAL::parameters::vertex_normal_map(vnm)); + PMP::interpolated_corrected_measure_mesh( + g1, + mu0_map, + PMP::MU0_AREA_MEASURE); + + PMP::interpolated_corrected_measure_mesh( + g1, + mu1_map, + PMP::MU1_MEAN_CURVATURE_MEASURE, + CGAL::parameters::vertex_normal_map(vnm)); + + PMP::interpolated_corrected_measure_mesh( + g1, + mu2_map, + PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, + CGAL::parameters::vertex_normal_map(vnm)); for (face_descriptor f: g1.faces()) - { - std::cout << f.idx() << ": " << get(mu0_map, f) << ", " << get(mu1_map, f) << ", " << get(mu2_map, f) << ", " << "\n"; - } + std::cout << f.idx() << ": " + << get(mu0_map, f) << ", " + << get(mu1_map, f) << ", " + << get(mu2_map, f) << ", " << "\n"; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 93d41ac77db7..aae957dc0159 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -2,15 +2,15 @@ #define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H #endif -#include #include #include -#include #include #include +#include #include +#include namespace CGAL { @@ -18,14 +18,14 @@ namespace Polygon_mesh_processing { /*! * \ingroup PMP_corrected_curvatures_grp - * Enumeration type used to specify which measure is computed for the - * interpolated corrected curvature functions + * Enumeration type used to specify which measure of a given face + * is computed for the interpolated corrected curvature functions */ // enum enum Curvature_measure_index { - MU0_AREA_MEASURE, ///< corrected area density of the given face - MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density of the given face - MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density of the given face + MU0_AREA_MEASURE, ///< corrected area density + MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density + MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density }; /** @@ -44,14 +44,20 @@ enum Curvature_measure_index { * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given triangle. +* @return a scalar of type GT::FT. +* This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` * @see `interpolated_corrected_measure_quad()` */ template -typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, - const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, + const typename GT::Vector_3 x1, + const typename GT::Vector_3 x2, + const typename GT::Vector_3 u0, + const typename GT::Vector_3 u1, + const typename GT::Vector_3 u2, + const Curvature_measure_index mu_i) { switch (mu_i) { @@ -98,26 +104,36 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given triangle. +* @return a scalar of type GT::FT. +* This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` * @see `interpolated_corrected_measure_triangle()` */ template -typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, const typename GT::Vector_3 x3, - const typename GT::Vector_3 u0, const typename GT::Vector_3 u1, const typename GT::Vector_3 u2, const typename GT::Vector_3 u3, const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, + const typename GT::Vector_3 x1, + const typename GT::Vector_3 x2, + const typename GT::Vector_3 x3, + const typename GT::Vector_3 u0, + const typename GT::Vector_3 u1, + const typename GT::Vector_3 u2, + const typename GT::Vector_3 u3, + const Curvature_measure_index mu_i) { // x0 _ x1 // x2 |_| x3 - + switch (mu_i) { case MU0_AREA_MEASURE: - return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) + return (1 / 36.0) * ( + (4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(x1 - x0, x3 - x1) + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(x3 - x2, x2 - x0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1)); + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1) + ); case MU1_MEAN_CURVATURE_MEASURE: { @@ -129,17 +145,21 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 const typename GT::Vector_3 x3_cross = -CGAL::cross_product(u12, x3); - return (1 / 12.0) * (u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) + return (1 / 12.0) * ( + u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) + u1 * (CGAL::cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - CGAL::cross_product((u0 + u2), x3)) - + u2 * (CGAL::cross_product(-(u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) - + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross)); + + u2 * (-CGAL::cross_product((u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) + + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross) + ); } case MU2_GAUSSIAN_CURVATURE_MEASURE: - return (1 / 36.0) * ((4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) + return (1 / 36.0) * ( + (4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(u1 - u0, u3 - u1) + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(u3 - u2, u2 - u0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1)); + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1) + ); default: return 0; } @@ -158,14 +178,17 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. This is the value of the interpolated corrected measure of the given face. +* @return a scalar of type GT::FT. +* This is the value of the interpolated corrected measure of the given face. * * @see `interpolated_corrected_measure_triangle()` * @see `interpolated_corrected_measure_quad()` * @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_measure_face(const std::vector& x, const std::vector& u, const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_measure_face(const std::vector& x, + const std::vector& u, + const Curvature_measure_index mu_i) { std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -188,11 +211,13 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%vertex_descriptor` +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` -* must be available in `PolygonMesh`.} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` * as key type and `%Vector_3` as value type} -* \cgalParamDefault{`TODO`} -* \cgalParamExtra{If this parameter is omitted, vertex normals should be computed inside the function body.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals should be +* computed inside the function body.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -246,11 +275,10 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector void - interpolated_corrected_measure_mesh( - const PolygonMesh& pmesh, - FaceMeasureMap fmm, - const Curvature_measure_index mu_i, - const NamedParameters& np = parameters::default_values()) + interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, + FaceMeasureMap fmm, + const Curvature_measure_index mu_i, + const NamedParameters& np = parameters::default_values()) { typedef typename GetGeomTraits::type GT; From 66a26246412d9922610d380c37da5623c432dc69 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 25 Jul 2022 13:31:07 +0200 Subject: [PATCH 0017/1398] minor doc fix making GT::FT back ticked --- .../interpolated_corrected_curvature_measures.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index aae957dc0159..2409eab42b74 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -44,7 +44,7 @@ enum Curvature_measure_index { * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` @@ -104,7 +104,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` @@ -178,7 +178,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type GT::FT. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given face. * * @see `interpolated_corrected_measure_triangle()` @@ -238,7 +238,7 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%face_descriptor` as key type and GT::FT as value type. +* `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh the polygon mesh From 41be3688ae6a0682ad03db7f22a2bb5a215b4a7b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 26 Jul 2022 19:32:17 +0200 Subject: [PATCH 0018/1398] Mean and Gaussian Curvatures + Visualizer (Still wip) --- .../interpolated_corrected_curvatures.cpp | 35 +-- ...nterpolated_corrected_curvature_measures.h | 224 +++++++++++++++++- .../Display/Display_property_plugin.cpp | 116 +++------ .../internal/parameters_interface.h | 1 + 4 files changed, 259 insertions(+), 117 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 505d43286451..4480366bc2b0 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -33,35 +33,20 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - vertexVectorMap_tag vnm_init; - boost::associative_property_map vnm(vnm_init); - - PMP::compute_vertex_normals(g1, vnm); - - FaceMeasureMap_tag mu0_init, mu1_init, mu2_init; + FaceMeasureMap_tag mean_curvature_init, gaussian_curvature_init; boost::associative_property_map - mu0_map(mu0_init), mu1_map(mu1_init), mu2_map(mu2_init); + mean_curvature_map(mean_curvature_init), gaussian_curvature_map(gaussian_curvature_init); - PMP::interpolated_corrected_measure_mesh( + PMP::interpolated_corrected_mean_curvature( g1, - mu0_map, - PMP::MU0_AREA_MEASURE); - - PMP::interpolated_corrected_measure_mesh( - g1, - mu1_map, - PMP::MU1_MEAN_CURVATURE_MEASURE, - CGAL::parameters::vertex_normal_map(vnm)); - - PMP::interpolated_corrected_measure_mesh( + mean_curvature_map + ); + PMP::interpolated_corrected_gaussian_curvature( g1, - mu2_map, - PMP::MU2_GAUSSIAN_CURVATURE_MEASURE, - CGAL::parameters::vertex_normal_map(vnm)); + gaussian_curvature_map + ); for (face_descriptor f: g1.faces()) - std::cout << f.idx() << ": " - << get(mu0_map, f) << ", " - << get(mu1_map, f) << ", " - << get(mu2_map, f) << ", " << "\n"; + std::cout << f.idx() << ": HC = " << get(mean_curvature_map, f) + << ", GC = " << get(gaussian_curvature_map, f) << "\n"; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 2409eab42b74..737a2525ebd7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -11,6 +11,8 @@ #include #include +#include +#include namespace CGAL { @@ -210,8 +212,8 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::value) compute_vertex_normals(pmesh, vnm, np); for (face_descriptor f : faces(pmesh)) { - halfedge_descriptor h_start = pmesh.halfedge(f); - halfedge_descriptor h_iter = h_start; - std::vector x; std::vector u; - // looping over vertices in face - do { - vertex_descriptor v = source(h_iter, pmesh); + for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + { typename GT::Point_3 p = get(vpm, v); x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); u.push_back(get(vnm, v)); - h_iter = next(h_iter, pmesh); - } while (h_iter != h_start); + } put(fmm, f, interpolated_corrected_measure_face(x, u, mu_i)); } } + +// +// +//template +//typename GT::FT triangle_in_ball_ratio_1(const typename GT::Vector_3 x1, +// const typename GT::Vector_3 x2, +// const typename GT::Vector_3 x3, +// const typename GT::FT r, +// const typename GT::Vector_3 c, +// const std::size_t res = 3) +//{ +// const typename GT::FT R = r * r; +// const typename GT::FT acc = 1.0 / res; +// std::size_t samples_in = 0; +// for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) +// for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) +// { +// if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) +// samples_in++; +// } +// return samples_in / (typename GT::FT)(res * (res + 1) / 2); +//} + + +template +typename GT::FT face_in_ball_ratio_2(const std::vector& x, + const typename GT::FT r, + const typename GT::Vector_3 c) +{ + std::size_t n = x.size(); + + // getting center of points + typename GT::Vector_3 xm = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xm /= n; + + typename GT::FT d_min = (xm - c).squared_length(); + typename GT::FT d_max = d_min; + + for (const typename GT::Vector_3 xi : x) + { + const typename GT::FT d_sq = (xi - c).squared_length(); + d_max = std::max(d_sq, d_max); + d_min = std::min(d_sq, d_min); + } + + if (d_max <= r * r) return 1.0; + else if (r * r <= d_min) return 0.0; + + d_max = sqrt(d_max); + d_min = sqrt(d_min); + + return (r - d_min) / (d_max - d_min); +} + +template + void expand_interpolated_corrected_measure_face(const PolygonMesh& pmesh, + FaceMeasureMap fmm, + const typename boost::graph_traits::face_descriptor f, + const NamedParameters& np = parameters::default_values()) +{ + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef typename GetGeomTraits::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + const typename GetGeomTraits::type::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); + + if (r < 0.000001) + return; + + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + + std::queue bfs_q; + std::unordered_set bfs_v; + + //get face center c + typename GT::Vector_3 c; + for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + typename GT::Point_3 p = get(vpm, v); + c += typename GT::Vector_3(p.x(), p.y(), p.z()); + } + c /= degree(f, pmesh); + + GT::FT corrected_mui = 0; + + bfs_q.push(f); + bfs_v.insert(f); + + while (!bfs_q.empty()) { + face_descriptor fi = bfs_q.front(); + bfs_q.pop(); + + // looping over vertices in face to get point coordinates + std::vector x; + for (vertex_descriptor v : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + typename GT::Point_3 p = get(vpm, v); + x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); + } + + const typename GT::FT f_ratio = face_in_ball_ratio_2(x, r, c); + + if (f_ratio > 0.000001) + { + corrected_mui += f_ratio * get(fmm, fi); + for (face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_v.find(fj) == bfs_v.end()) + { + bfs_q.push(fj); + bfs_v.insert(fj); + } + } + } + } + + put(fmm, f, corrected_mui); +} + +//template +// void expand_interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, +// FaceMeasureMap fmm, +// const NamedParameters& np = parameters::default_values()) +//{ +// typedef typename boost::graph_traits::face_descriptor face_descriptor; +// for (face_descriptor f : faces(pmesh)) +// expand_interpolated_corrected_measure_face(pmesh, fmm, f, np); +//} + +template + void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, + FaceCurvatureMap fcm, + const NamedParameters& np = parameters::default_values()) +{ + typedef typename GetGeomTraits::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef std::unordered_map FaceMeasureMap_tag; + + FaceMeasureMap_tag mu0_init, mu1_init; + boost::associative_property_map + mu0_map(mu0_init), mu1_map(mu1_init); + + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); + interpolated_corrected_measure_mesh(pmesh, mu1_map, MU1_MEAN_CURVATURE_MEASURE); + + for (face_descriptor f : faces(pmesh)) + { + expand_interpolated_corrected_measure_face(pmesh, mu0_map, f, np); + expand_interpolated_corrected_measure_face(pmesh, mu1_map, f, np); + + GT::FT f_mu0 = get(mu0_map, f); + if (f_mu0 > 0.000001) + put(fcm, f, 0.5 * get(mu1_map, f) / get(mu0_map, f)); + else + put(fcm, f, 0); + } + +} + +template + void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, + FaceCurvatureMap fcm, + const NamedParameters& np = parameters::default_values()) +{ + typedef typename GetGeomTraits::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef std::unordered_map FaceMeasureMap_tag; + + FaceMeasureMap_tag mu0_init, mu2_init; + boost::associative_property_map + mu0_map(mu0_init), mu2_map(mu2_init); + + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); + interpolated_corrected_measure_mesh(pmesh, mu2_map, MU2_GAUSSIAN_CURVATURE_MEASURE); + + for (face_descriptor f : faces(pmesh)) + { + expand_interpolated_corrected_measure_face(pmesh, mu0_map, f, np); + expand_interpolated_corrected_measure_face(pmesh, mu2_map, f, np); + + GT::FT f_mu0 = get(mu0_map, f); + if(f_mu0 > 0.000001) + put(fcm, f, get(mu2_map, f) / f_mu0); + else + put(fcm, f, 0); + } + +} + + + } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 1ea1394649c2..88d86966f1d7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -533,9 +533,8 @@ private Q_SLOTS: dock_widget->propertyBox->addItem("Scaled Jacobian"); dock_widget->propertyBox->addItem("Heat Intensity"); dock_widget->propertyBox->addItem("Heat Intensity (Intrinsic Delaunay)"); - dock_widget->propertyBox->addItem("corrected area density"); - dock_widget->propertyBox->addItem("corrected mean curvature density"); - dock_widget->propertyBox->addItem("corrected gaussian curvature density"); + dock_widget->propertyBox->addItem("Interpolated Corrected Mean Curvature"); + dock_widget->propertyBox->addItem("Interpolated Corrected Gaussian Curvature"); detectSMScalarProperties(sm_item->face_graph()); } @@ -610,15 +609,11 @@ private Q_SLOTS: return; sm_item->setRenderingMode(Gouraud); break; - case 4: // corrected area density - displayInterpolatedCurvatureMeasure(sm_item, PMP::MU0_AREA_MEASURE); - sm_item->setRenderingMode(Flat); - break; - case 5: // corrected mean curvature density + case 4: // Interpolated Corrected Mean Curvature displayInterpolatedCurvatureMeasure(sm_item, PMP::MU1_MEAN_CURVATURE_MEASURE); sm_item->setRenderingMode(Flat); break; - case 6: // corrected gaussian curvature density + case 5: // Interpolated Corrected Gaussian Curvature displayInterpolatedCurvatureMeasure(sm_item, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE); sm_item->setRenderingMode(Flat); break; @@ -657,15 +652,11 @@ private Q_SLOTS: if(does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:corrected_area_density"); - if (does_exist) - sm_item->face_graph()->remove_property_map(pmap); - std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:corrected_mean_curvature_density"); + sm_item->face_graph()->property_map("f:interpolated_corrected_mean_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:corrected_gaussian_curvature_density"); + sm_item->face_graph()->property_map("f:interpolated_corrected_gaussian_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); }); @@ -707,16 +698,12 @@ private Q_SLOTS: dock_widget->zoomToMaxButton->setEnabled(jacobian_max.count(sm_item)>0); break; case 4: - dock_widget->zoomToMinButton->setEnabled(mu0_min.count(sm_item) > 0); - dock_widget->zoomToMaxButton->setEnabled(mu0_max.count(sm_item) > 0); + dock_widget->zoomToMinButton->setEnabled(mean_curvature_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(mean_curvature_max.count(sm_item) > 0); break; case 5: - dock_widget->zoomToMinButton->setEnabled(mu1_min.count(sm_item) > 0); - dock_widget->zoomToMaxButton->setEnabled(mu1_max.count(sm_item) > 0); - break; - case 6: - dock_widget->zoomToMinButton->setEnabled(mu2_min.count(sm_item) > 0); - dock_widget->zoomToMaxButton->setEnabled(mu2_max.count(sm_item) > 0); + dock_widget->zoomToMinButton->setEnabled(gaussian_curvature_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(gaussian_curvature_max.count(sm_item) > 0); break; default: break; @@ -744,23 +731,17 @@ private Q_SLOTS: { smesh.remove_property_map(angles); } - SMesh::Property_map mu0; - std::tie(mu0, found) = smesh.property_map("f:corrected_area_density"); + SMesh::Property_map mean_curvature; + std::tie(mean_curvature, found) = smesh.property_map("f:interpolated_corrected_mean_curvature"); if (found) { - smesh.remove_property_map(mu0); + smesh.remove_property_map(mean_curvature); } - SMesh::Property_map mu1; - std::tie(mu1, found) = smesh.property_map("f:corrected_mean_curvature_density"); + SMesh::Property_map gaussian_curvature; + std::tie(gaussian_curvature, found) = smesh.property_map("f:interpolated_corrected_gaussian_curvature"); if (found) { - smesh.remove_property_map(mu0); - } - SMesh::Property_map mu2; - std::tie(mu2, found) = smesh.property_map("f:corrected_gaussian_curvature_density"); - if (found) - { - smesh.remove_property_map(mu0); + smesh.remove_property_map(gaussian_curvature); } } @@ -804,20 +785,20 @@ private Q_SLOTS: void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { - std::vector tied_map = { - "f:corrected_area_density", - "f:corrected_mean_curvature_density", - "f:corrected_gaussian_curvature_density" - }; + std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? + "f:interpolated_corrected_mean_curvature": "f:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); //compute once and store the value per face bool non_init; SMesh::Property_map mu_i_map; std::tie(mu_i_map, non_init) = - smesh.add_property_map(tied_map[mu_index], 0); + smesh.add_property_map(tied_string, 0); if (non_init) { - PMP::interpolated_corrected_measure_mesh(smesh, mu_i_map, mu_index); + if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map); + else + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map); double res_min = ARBITRARY_DBL_MAX, res_max = -ARBITRARY_DBL_MAX; @@ -837,24 +818,20 @@ private Q_SLOTS: } switch (mu_index) { - case PMP::MU0_AREA_MEASURE: - mu0_max[item] = std::make_pair(res_max, max_index); - mu0_min[item] = std::make_pair(res_min, min_index); - break; case PMP::MU1_MEAN_CURVATURE_MEASURE: - mu1_max[item] = std::make_pair(res_max, max_index); - mu1_min[item] = std::make_pair(res_min, min_index); + mean_curvature_max[item] = std::make_pair(res_max, max_index); + mean_curvature_min[item] = std::make_pair(res_min, min_index); break; case PMP::MU2_GAUSSIAN_CURVATURE_MEASURE: - mu2_max[item] = std::make_pair(res_max, max_index); - mu2_min[item] = std::make_pair(res_min, min_index); + gaussian_curvature_max[item] = std::make_pair(res_max, max_index); + gaussian_curvature_min[item] = std::make_pair(res_min, min_index); break; } connect(item, &Scene_surface_mesh_item::itemChanged, this, &DisplayPropertyPlugin::resetProperty); } - treat_sm_property(tied_map[mu_index], item->face_graph()); + treat_sm_property(tied_string, item->face_graph()); } @@ -1159,7 +1136,6 @@ private Q_SLOTS: case 1: case 4: case 5: - case 6: dock_widget->groupBox-> setEnabled(true); dock_widget->groupBox_3->setEnabled(true); @@ -1223,7 +1199,7 @@ private Q_SLOTS: case 4: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu0_min[item].second), + QString("f%1").arg(mean_curvature_min[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1232,20 +1208,12 @@ private Q_SLOTS: case 5: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu1_min[item].second), + QString("f%1").arg(gaussian_curvature_min[item].second), getActiveViewer(), dummy_fd, dummy_p); } break; - case 6: - { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu2_min[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); - } break; break; default: @@ -1284,7 +1252,7 @@ private Q_SLOTS: case 4: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu0_max[item].second), + QString("f%1").arg(mean_curvature_max[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1293,21 +1261,12 @@ private Q_SLOTS: case 5: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu1_max[item].second), + QString("f%1").arg(gaussian_curvature_max[item].second), getActiveViewer(), dummy_fd, dummy_p); } break; - case 6: - { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(mu2_max[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); - } - break; default: break; } @@ -1598,14 +1557,11 @@ private Q_SLOTS: std::unordered_map > angles_min; std::unordered_map > angles_max; - std::unordered_map > mu0_min; - std::unordered_map > mu0_max; + std::unordered_map > mean_curvature_min; + std::unordered_map > mean_curvature_max; - std::unordered_map > mu1_min; - std::unordered_map > mu1_max; - - std::unordered_map > mu2_min; - std::unordered_map > mu2_max; + std::unordered_map > gaussian_curvature_min; + std::unordered_map > gaussian_curvature_max; std::unordered_map is_source; 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 c224b4982513..dd4785ab7e8a 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -87,6 +87,7 @@ CGAL_add_named_parameter(number_of_points_per_edge_t, number_of_points_per_edge, CGAL_add_named_parameter(number_of_points_on_edges_t, number_of_points_on_edges, number_of_points_on_edges) CGAL_add_named_parameter(nb_points_per_area_unit_t, nb_points_per_area_unit, number_of_points_per_area_unit) CGAL_add_named_parameter(nb_points_per_distance_unit_t, nb_points_per_distance_unit, number_of_points_per_distance_unit) +CGAL_add_named_parameter(ball_radius_t, ball_radius, ball_radius) CGAL_add_named_parameter(outward_orientation_t, outward_orientation, outward_orientation) CGAL_add_named_parameter(overlap_test_t, overlap_test, do_overlap_test_of_bounded_sides) CGAL_add_named_parameter(preserve_genus_t, preserve_genus, preserve_genus) From 48ff36dcc94d621d27a1fde09811159e3963eb3a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 27 Jul 2022 12:42:38 +0200 Subject: [PATCH 0019/1398] fixed some missing typenames --- .../interpolated_corrected_curvature_measures.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 737a2525ebd7..9f9a6c0fc14f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -415,7 +415,7 @@ template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::unordered_map FaceMeasureMap_tag; + typedef std::unordered_map FaceMeasureMap_tag; FaceMeasureMap_tag mu0_init, mu1_init; boost::associative_property_map @@ -484,13 +484,12 @@ template 0.000001) put(fcm, f, 0.5 * get(mu1_map, f) / get(mu0_map, f)); else put(fcm, f, 0); } - } template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::unordered_map FaceMeasureMap_tag; + typedef std::unordered_map FaceMeasureMap_tag; FaceMeasureMap_tag mu0_init, mu2_init; boost::associative_property_map @@ -515,13 +514,12 @@ template 0.000001) put(fcm, f, get(mu2_map, f) / f_mu0); else put(fcm, f, 0); } - } From 6b985bfeb86efd80958f42409fdd9fae5f2b5539 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 27 Jul 2022 13:25:35 +0200 Subject: [PATCH 0020/1398] for boundary faces --- .../Curvatures/interpolated_corrected_curvature_measures.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 9f9a6c0fc14f..3528ffed8a43 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -439,7 +439,7 @@ template::null_face()) { bfs_q.push(fj); bfs_v.insert(fj); From 8d2a5bcf82a026a0c7aa8399dc024c96cf40b0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 13:40:25 +0200 Subject: [PATCH 0021/1398] add license header --- .../interpolated_corrected_curvature_measures.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 9f9a6c0fc14f..a3c3d9f16e2c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -1,3 +1,16 @@ +// 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) : Hossam Saeed +// + #ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H #define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H #endif From c99008dde1ad696b2e9eea65081908f325e5ac8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 13:40:33 +0200 Subject: [PATCH 0022/1398] trailing whitespaces --- .../PackageDescription.txt | 2 +- .../interpolated_corrected_curvatures.cpp | 2 +- ...nterpolated_corrected_curvature_measures.h | 28 +++++++++---------- .../Display/Display_property_plugin.cpp | 4 +-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index c25cfb8490d3..d0cab92d6a89 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -16,7 +16,7 @@ /// Functions to triangulate faces, and to refine and fair regions of a polygon mesh. /// \ingroup PkgPolygonMeshProcessingRef -/// \defgroup PMP_corrected_curvatures_grp Corrected Curvature Computation +/// \defgroup PMP_corrected_curvatures_grp Corrected Curvature Computation /// Functions to compute the corrected curvatures of a polygon mesh. /// \ingroup PkgPolygonMeshProcessingRef diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 4480366bc2b0..acf4591fe392 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -47,6 +47,6 @@ int main(int argc, char* argv[]) ); for (face_descriptor f: g1.faces()) - std::cout << f.idx() << ": HC = " << get(mean_curvature_map, f) + std::cout << f.idx() << ": HC = " << get(mean_curvature_map, f) << ", GC = " << get(gaussian_curvature_map, f) << "\n"; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index a3c3d9f16e2c..f618533d2bc9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -59,7 +59,7 @@ enum Curvature_measure_index { * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type `GT::FT`. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` @@ -69,9 +69,9 @@ template typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, const typename GT::Vector_3 x1, const typename GT::Vector_3 x2, - const typename GT::Vector_3 u0, - const typename GT::Vector_3 u1, - const typename GT::Vector_3 u2, + const typename GT::Vector_3 u0, + const typename GT::Vector_3 u1, + const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) { switch (mu_i) @@ -102,8 +102,8 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto * \ingroup PMP_corrected_curvatures_grp * * computes the interpolated corrected measure of specific quad -* Note that the vertices 0 to 3 are ordered like this \n -* v0 _ v1 \n +* Note that the vertices 0 to 3 are ordered like this \n +* v0 _ v1 \n * v2 |_| v3 * * @tparam GT is the geometric traits class. @@ -119,7 +119,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type `GT::FT`. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given triangle. * * @see `interpolated_corrected_measure_face()` @@ -138,7 +138,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 { // x0 _ x1 // x2 |_| x3 - + switch (mu_i) { case MU0_AREA_MEASURE: @@ -193,7 +193,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 * @param mu_i an enum for choosing between computing the area measure, * the mean curvature measure, or the gaussian curvature measure. * -* @return a scalar of type `GT::FT`. +* @return a scalar of type `GT::FT`. * This is the value of the interpolated corrected measure of the given face. * * @see `interpolated_corrected_measure_triangle()` @@ -231,7 +231,7 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} @@ -275,7 +275,7 @@ typename GT::FT interpolated_corrected_measure_face(const std::vector::%vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} @@ -405,7 +405,7 @@ template::face_descriptor face_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - const typename GetGeomTraits::type::FT + const typename GetGeomTraits::type::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); if (r < 0.000001) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 88d86966f1d7..13f704774e38 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -785,13 +785,13 @@ private Q_SLOTS: void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { - std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? + std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? "f:interpolated_corrected_mean_curvature": "f:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); //compute once and store the value per face bool non_init; SMesh::Property_map mu_i_map; - std::tie(mu_i_map, non_init) = + std::tie(mu_i_map, non_init) = smesh.add_property_map(tied_string, 0); if (non_init) { From 1c42a61fa11dc97e0c4629a4c73600e1356a518c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 14:26:28 +0200 Subject: [PATCH 0023/1398] use traits functor --- ...nterpolated_corrected_curvature_measures.h | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index f618533d2bc9..415737e4991a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -74,25 +74,26 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) { + GT::Construct_cross_product_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: { const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; - return 0.5 * um * CGAL::cross_product(x1 - x0, x2 - x0); + return 0.5 * um * cross_product(x1 - x0, x2 - x0); } case MU1_MEAN_CURVATURE_MEASURE: { const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; - return 0.5 * um * (CGAL::cross_product(u2 - u1, x0) - + CGAL::cross_product(u0 - u2, x1) - + CGAL::cross_product(u1 - u0, x2)); + return 0.5 * um * (cross_product(u2 - u1, x0) + + cross_product(u0 - u2, x1) + + cross_product(u1 - u0, x2)); } case MU2_GAUSSIAN_CURVATURE_MEASURE: - return 0.5 * u0 * CGAL::cross_product(u1, u2); + return 0.5 * u0 * cross_product(u1, u2); default: return 0; } @@ -138,42 +139,42 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 { // x0 _ x1 // x2 |_| x3 - + GT::Construct_cross_product_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: return (1 / 36.0) * ( - (4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(x1 - x0, x2 - x0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(x1 - x0, x3 - x1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(x3 - x2, x2 - x0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(x3 - x2, x3 - x1) + (4 * u0 + 2 * u1 + 2 * u2 + u3) * cross_product(x1 - x0, x2 - x0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * cross_product(x1 - x0, x3 - x1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * cross_product(x3 - x2, x2 - x0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * cross_product(x3 - x2, x3 - x1) ); case MU1_MEAN_CURVATURE_MEASURE: { const typename GT::Vector_3 u03 = u3 - u0; const typename GT::Vector_3 u12 = u2 - u1; - const typename GT::Vector_3 x0_cross = CGAL::cross_product(u12, x0); - const typename GT::Vector_3 x1_cross = -CGAL::cross_product(u03, x1); - const typename GT::Vector_3 x2_cross = CGAL::cross_product(u03, x2); - const typename GT::Vector_3 x3_cross = -CGAL::cross_product(u12, x3); + const typename GT::Vector_3 x0_cross = cross_product(u12, x0); + const typename GT::Vector_3 x1_cross = -cross_product(u03, x1); + const typename GT::Vector_3 x2_cross = cross_product(u03, x2); + const typename GT::Vector_3 x3_cross = -cross_product(u12, x3); return (1 / 12.0) * ( - u0 * (2 * x0_cross - CGAL::cross_product((u2 + u3), x1) + CGAL::cross_product((u1 + u3), x2) + x3_cross) - + u1 * (CGAL::cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - CGAL::cross_product((u0 + u2), x3)) - + u2 * (-CGAL::cross_product((u1 + u3), x0) + x1_cross + 2 * x2_cross + CGAL::cross_product((u0 + u1), x3)) - + u3 * (x0_cross + CGAL::cross_product((u0 + u2), x1) - CGAL::cross_product((u0 + u1), x2) + 2 * x3_cross) + u0 * (2 * x0_cross - cross_product((u2 + u3), x1) + cross_product((u1 + u3), x2) + x3_cross) + + u1 * (cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - cross_product((u0 + u2), x3)) + + u2 * (-cross_product((u1 + u3), x0) + x1_cross + 2 * x2_cross + cross_product((u0 + u1), x3)) + + u3 * (x0_cross + cross_product((u0 + u2), x1) - cross_product((u0 + u1), x2) + 2 * x3_cross) ); } case MU2_GAUSSIAN_CURVATURE_MEASURE: return (1 / 36.0) * ( - (4 * u0 + 2 * u1 + 2 * u2 + u3) * CGAL::cross_product(u1 - u0, u2 - u0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * CGAL::cross_product(u1 - u0, u3 - u1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * CGAL::cross_product(u3 - u2, u2 - u0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * CGAL::cross_product(u3 - u2, u3 - u1) + (4 * u0 + 2 * u1 + 2 * u2 + u3) * cross_product(u1 - u0, u2 - u0) + + (2 * u0 + 4 * u1 + u2 + 2 * u3) * cross_product(u1 - u0, u3 - u1) + + (2 * u0 + u1 + 4 * u2 + 2 * u3) * cross_product(u3 - u2, u2 - u0) + + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * cross_product(u3 - u2, u3 - u1) ); default: return 0; From 12a627e23f2d26e98a6b53228fa4c050cef07d2c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:40:06 +0200 Subject: [PATCH 0024/1398] expanding from and evaluating on vertices instead of faces --- .../interpolated_corrected_curvatures.cpp | 15 ++-- ...nterpolated_corrected_curvature_measures.h | 87 +++++++++++-------- .../Display/Display_property_plugin.cpp | 56 ++++++------ 3 files changed, 85 insertions(+), 73 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 4480366bc2b0..63c0b8df528c 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -17,7 +17,7 @@ typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::unordered_map FaceMeasureMap_tag; -typedef std::unordered_map vertexVectorMap_tag; +typedef std::unordered_map vertexVectorMap_tag; int main(int argc, char* argv[]) @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) Mesh g1; const std::string filename = (argc>1) ? argv[1] : - CGAL::data_file_path("meshes/small_bunny.obj"); + CGAL::data_file_path("meshes/cylinder.off"); if(!CGAL::IO::read_polygon_mesh(filename, g1)) { @@ -33,8 +33,9 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - FaceMeasureMap_tag mean_curvature_init, gaussian_curvature_init; - boost::associative_property_map + + vertexVectorMap_tag mean_curvature_init, gaussian_curvature_init; + boost::associative_property_map mean_curvature_map(mean_curvature_init), gaussian_curvature_map(gaussian_curvature_init); PMP::interpolated_corrected_mean_curvature( @@ -46,7 +47,7 @@ int main(int argc, char* argv[]) gaussian_curvature_map ); - for (face_descriptor f: g1.faces()) - std::cout << f.idx() << ": HC = " << get(mean_curvature_map, f) - << ", GC = " << get(gaussian_curvature_map, f) << "\n"; + for (vertex_descriptor v : vertices(g1)) + std::cout << v.idx() << ": HC = " << get(mean_curvature_map, v) + << ", GC = " << get(gaussian_curvature_map, v) << "\n"; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 3528ffed8a43..3b499a8fe94d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -378,11 +378,12 @@ typename GT::FT face_in_ball_ratio_2(const std::vector& x return (r - d_min) / (d_max - d_min); } -template - void expand_interpolated_corrected_measure_face(const PolygonMesh& pmesh, + void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, FaceMeasureMap fmm, - const typename boost::graph_traits::face_descriptor f, + VertexCurvatureMap vcm, + const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { using parameters::choose_parameter; @@ -406,30 +407,28 @@ template bfs_q; std::unordered_set bfs_v; - //get face center c - typename GT::Vector_3 c; - for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - typename GT::Point_3 p = get(vpm, v); - c += typename GT::Vector_3(p.x(), p.y(), p.z()); - } - c /= degree(f, pmesh); + typename GT::Point_3 vp = get(vpm, v); + typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); typename GT::FT corrected_mui = 0; - bfs_q.push(f); - bfs_v.insert(f); - + for (face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_q.push(f); + bfs_v.insert(f); + } + } while (!bfs_q.empty()) { face_descriptor fi = bfs_q.front(); bfs_q.pop(); // looping over vertices in face to get point coordinates std::vector x; - for (vertex_descriptor v : vertices_around_face(halfedge(fi, pmesh), pmesh)) + for (vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) { - typename GT::Point_3 p = get(vpm, v); - x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); + typename GT::Point_3 pi = get(vpm, vi); + x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); } const typename GT::FT f_ratio = face_in_ball_ratio_2(x, r, c); @@ -448,7 +447,7 @@ template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, - FaceCurvatureMap fcm, + VertexCurvatureMap vcm, const NamedParameters& np = parameters::default_values()) { typedef typename GetGeomTraits::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef std::unordered_map VertexMeasureMap_tag; FaceMeasureMap_tag mu0_init, mu1_init; boost::associative_property_map mu0_map(mu0_init), mu1_map(mu1_init); + VertexMeasureMap_tag mu0_expand_init, mu1_expand_init; + boost::associative_property_map + mu0_expand_map(mu0_expand_init), mu1_expand_map(mu1_expand_init); + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); interpolated_corrected_measure_mesh(pmesh, mu1_map, MU1_MEAN_CURVATURE_MEASURE); - for (face_descriptor f : faces(pmesh)) + for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_face(pmesh, mu0_map, f, np); - expand_interpolated_corrected_measure_face(pmesh, mu1_map, f, np); - - const typename GT::FT f_mu0 = get(mu0_map, f); - if (f_mu0 > 0.000001) - put(fcm, f, 0.5 * get(mu1_map, f) / get(mu0_map, f)); - else - put(fcm, f, 0); + expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu0_expand_map, v, np); + expand_interpolated_corrected_measure_vertex(pmesh, mu1_map, mu1_expand_map, v, np); + + typename GT::FT v_mu0 = get(mu0_expand_map, v); + if (v_mu0 > 0.000001) + put(vcm, v, 0.5 * get(mu1_expand_map, v) / v_mu0); + else + put(vcm, v, 0); } } -template void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, - FaceCurvatureMap fcm, + VertexCurvatureMap vcm, const NamedParameters& np = parameters::default_values()) { typedef typename GetGeomTraits::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef std::unordered_map VertexMeasureMap_tag; FaceMeasureMap_tag mu0_init, mu2_init; boost::associative_property_map mu0_map(mu0_init), mu2_map(mu2_init); + VertexMeasureMap_tag mu0_expand_init, mu2_expand_init; + boost::associative_property_map + mu0_expand_map(mu0_expand_init), mu2_expand_map(mu2_expand_init); + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); interpolated_corrected_measure_mesh(pmesh, mu2_map, MU2_GAUSSIAN_CURVATURE_MEASURE); - for (face_descriptor f : faces(pmesh)) + for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_face(pmesh, mu0_map, f, np); - expand_interpolated_corrected_measure_face(pmesh, mu2_map, f, np); + expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu0_expand_map, v, np); + expand_interpolated_corrected_measure_vertex(pmesh, mu2_map, mu2_expand_map, v, np); - const typename GT::FT f_mu0 = get(mu0_map, f); - if(f_mu0 > 0.000001) - put(fcm, f, get(mu2_map, f) / f_mu0); + typename GT::FT v_mu0 = get(mu0_expand_map, v); + if(v_mu0 > 0.000001) + put(vcm, v, get(mu2_expand_map, v) / v_mu0); else - put(fcm, f, 0); + put(vcm, v, 0); } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 88d86966f1d7..2f9bd19e584b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -611,11 +611,11 @@ private Q_SLOTS: break; case 4: // Interpolated Corrected Mean Curvature displayInterpolatedCurvatureMeasure(sm_item, PMP::MU1_MEAN_CURVATURE_MEASURE); - sm_item->setRenderingMode(Flat); + sm_item->setRenderingMode(Gouraud); break; case 5: // Interpolated Corrected Gaussian Curvature displayInterpolatedCurvatureMeasure(sm_item, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE); - sm_item->setRenderingMode(Flat); + sm_item->setRenderingMode(Gouraud); break; default: if(dock_widget->propertyBox->currentText().contains("v:")) @@ -652,11 +652,11 @@ private Q_SLOTS: if(does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:interpolated_corrected_mean_curvature"); + sm_item->face_graph()->property_map("v:interpolated_corrected_mean_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:interpolated_corrected_gaussian_curvature"); + sm_item->face_graph()->property_map("v:interpolated_corrected_gaussian_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); }); @@ -731,14 +731,14 @@ private Q_SLOTS: { smesh.remove_property_map(angles); } - SMesh::Property_map mean_curvature; - std::tie(mean_curvature, found) = smesh.property_map("f:interpolated_corrected_mean_curvature"); + SMesh::Property_map mean_curvature; + std::tie(mean_curvature, found) = smesh.property_map("v:interpolated_corrected_mean_curvature"); if (found) { smesh.remove_property_map(mean_curvature); } - SMesh::Property_map gaussian_curvature; - std::tie(gaussian_curvature, found) = smesh.property_map("f:interpolated_corrected_gaussian_curvature"); + SMesh::Property_map gaussian_curvature; + std::tie(gaussian_curvature, found) = smesh.property_map("v:interpolated_corrected_gaussian_curvature"); if (found) { smesh.remove_property_map(gaussian_curvature); @@ -786,13 +786,13 @@ private Q_SLOTS: void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? - "f:interpolated_corrected_mean_curvature": "f:interpolated_corrected_gaussian_curvature"; + "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); //compute once and store the value per face bool non_init; - SMesh::Property_map mu_i_map; + SMesh::Property_map mu_i_map; std::tie(mu_i_map, non_init) = - smesh.add_property_map(tied_string, 0); + smesh.add_property_map(tied_string, 0); if (non_init) { if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) @@ -802,18 +802,18 @@ private Q_SLOTS: double res_min = ARBITRARY_DBL_MAX, res_max = -ARBITRARY_DBL_MAX; - SMesh::Face_index min_index, max_index; - for (SMesh::Face_index f : faces(smesh)) + SMesh::Vertex_index min_index, max_index; + for (SMesh::Vertex_index v : vertices(smesh)) { - if (mu_i_map[f] > res_max) + if (mu_i_map[v] > res_max) { - res_max = mu_i_map[f]; - max_index = f; + res_max = mu_i_map[v]; + max_index = v; } - if (mu_i_map[f] < res_min) + if (mu_i_map[v] < res_min) { - res_min = mu_i_map[f]; - min_index = f; + res_min = mu_i_map[v]; + min_index = v; } } switch (mu_index) @@ -831,7 +831,7 @@ private Q_SLOTS: connect(item, &Scene_surface_mesh_item::itemChanged, this, &DisplayPropertyPlugin::resetProperty); } - treat_sm_property(tied_string, item->face_graph()); + treat_sm_property(tied_string, item->face_graph()); } @@ -1199,7 +1199,7 @@ private Q_SLOTS: case 4: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mean_curvature_min[item].second), + QString("v%1").arg(mean_curvature_min[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1208,7 +1208,7 @@ private Q_SLOTS: case 5: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(gaussian_curvature_min[item].second), + QString("v%1").arg(gaussian_curvature_min[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1252,7 +1252,7 @@ private Q_SLOTS: case 4: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(mean_curvature_max[item].second), + QString("v%1").arg(mean_curvature_max[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1261,7 +1261,7 @@ private Q_SLOTS: case 5: { ::zoomToId(*item->face_graph(), - QString("f%1").arg(gaussian_curvature_max[item].second), + QString("v%1").arg(gaussian_curvature_max[item].second), getActiveViewer(), dummy_fd, dummy_p); @@ -1557,11 +1557,11 @@ private Q_SLOTS: std::unordered_map > angles_min; std::unordered_map > angles_max; - std::unordered_map > mean_curvature_min; - std::unordered_map > mean_curvature_max; + std::unordered_map > mean_curvature_min; + std::unordered_map > mean_curvature_max; - std::unordered_map > gaussian_curvature_min; - std::unordered_map > gaussian_curvature_max; + std::unordered_map > gaussian_curvature_min; + std::unordered_map > gaussian_curvature_max; std::unordered_map is_source; From 4ffd2d2a098b3c0bb69db2ade868e770e153de54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 19:05:30 +0200 Subject: [PATCH 0025/1398] add missing typename --- .../Curvatures/interpolated_corrected_curvature_measures.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 03e5f396e3ce..0c6a370059c4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -74,7 +74,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) { - GT::Construct_cross_product_3 cross_product; + typename GT::Construct_cross_product_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: @@ -139,7 +139,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 { // x0 _ x1 // x2 |_| x3 - GT::Construct_cross_product_3 cross_product; + typename GT::Construct_cross_product_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: From 62c91c1479fb2396ed6b0e9ef9d707e9ef643f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 19:10:52 +0200 Subject: [PATCH 0026/1398] remove trailing whitespaces --- .../Polyhedron/Plugins/Display/Display_property_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 2f9bd19e584b..0334eb45a972 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -785,13 +785,13 @@ private Q_SLOTS: void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { - std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? + std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); //compute once and store the value per face bool non_init; SMesh::Property_map mu_i_map; - std::tie(mu_i_map, non_init) = + std::tie(mu_i_map, non_init) = smesh.add_property_map(tied_string, 0); if (non_init) { From 184fa0c8a4b5be1b0ca9aab7bdcade05de342cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 27 Jul 2022 19:28:44 +0200 Subject: [PATCH 0027/1398] fix invalid functor name --- .../Curvatures/interpolated_corrected_curvature_measures.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 0c6a370059c4..c3f349740204 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -74,7 +74,7 @@ typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vecto const typename GT::Vector_3 u2, const Curvature_measure_index mu_i) { - typename GT::Construct_cross_product_3 cross_product; + typename GT::Construct_cross_product_vector_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: @@ -139,7 +139,7 @@ typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 { // x0 _ x1 // x2 |_| x3 - typename GT::Construct_cross_product_3 cross_product; + typename GT::Construct_cross_product_vector_3 cross_product; switch (mu_i) { case MU0_AREA_MEASURE: From db753ee6b568c16ce2872a72d21cf9bed62e42c0 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 31 Jul 2022 00:21:55 +0200 Subject: [PATCH 0028/1398] Demo improvements + minor fixes - Fixed some typos in example file and in comment in display prop plugin - Added an option in random perturbation plugin to compute normals before hand - added slider for expanding radius with an exponential range and with max val dependant on max edge length --- .../interpolated_corrected_curvatures.cpp | 6 +-- ...nterpolated_corrected_curvature_measures.h | 12 ----- .../Plugins/Display/Display_property.ui | 36 ++++++++++++-- .../Display/Display_property_plugin.cpp | 49 ++++++++++++++++++- .../Plugins/PMP/Random_perturbation_dialog.ui | 24 ++++++++- .../PMP/Random_perturbation_plugin.cpp | 7 +++ 6 files changed, 111 insertions(+), 23 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 63c0b8df528c..5359315f0fa0 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -17,7 +17,7 @@ typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::unordered_map FaceMeasureMap_tag; -typedef std::unordered_map vertexVectorMap_tag; +typedef std::unordered_map vertexMeasureMap_tag; int main(int argc, char* argv[]) @@ -34,8 +34,8 @@ int main(int argc, char* argv[]) } - vertexVectorMap_tag mean_curvature_init, gaussian_curvature_init; - boost::associative_property_map + vertexMeasureMap_tag mean_curvature_init, gaussian_curvature_init; + boost::associative_property_map mean_curvature_map(mean_curvature_init), gaussian_curvature_map(gaussian_curvature_init); PMP::interpolated_corrected_mean_curvature( diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index c3f349740204..d36e1c67e363 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -338,7 +338,6 @@ template //typename GT::FT triangle_in_ball_ratio_1(const typename GT::Vector_3 x1, @@ -464,17 +463,6 @@ template -// void expand_interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, -// FaceMeasureMap fmm, -// const NamedParameters& np = parameters::default_values()) -//{ -// typedef typename boost::graph_traits::face_descriptor face_descriptor; -// for (face_descriptor f : faces(pmesh)) -// expand_interpolated_corrected_measure_face(pmesh, fmm, f, np); -//} - template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui index 7a5a19621f42..70c22f8348c2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui @@ -84,18 +84,18 @@ Ramp Colors - + - Color Min... + Min - Color Max... + Max @@ -135,7 +135,7 @@ Zoom - + @@ -158,7 +158,7 @@ Ramp Extrema - + @@ -186,6 +186,32 @@ + + + + 0 + + + 100 + + + true + + + Qt::Horizontal + + + QSlider::TicksAbove + + + + + + + Expanding Radius: 0 + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 0334eb45a972..a2d25d167c6b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -783,12 +784,56 @@ private Q_SLOTS: treat_sm_property("f:jacobian", item->face_graph()); } + double sliderRangeToExpandRadius(SMesh& smesh, double val) + { + double sliderMin = dock_widget->expandingRadiusSlider->minimum(); + double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; + val -= sliderMin; + sliderMin = 0; + + auto vpm = get(CGAL::vertex_point, smesh); + + auto edge_range = CGAL::edges(smesh); + + if (edge_range.begin() == edge_range.end()) + return 0; + + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return res == CGAL::SMALLER; + }); + + // if edge_reference is not derefrenceble + if (edge_reference == edge_range.end()) + return 0; + + double L = sqrt( + (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) + .squared_length() + ); + + std::cout << L << std::endl; + + double outMin = 0, outMax = 5 * L, base = 1.2; + + return (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + + } + void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) { std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); - //compute once and store the value per face + + expandRadius = sliderRangeToExpandRadius(smesh, dock_widget->expandingRadiusSlider->value()); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + + //compute once and store the value per vertex bool non_init; SMesh::Property_map mu_i_map; std::tie(mu_i_map, non_init) = @@ -1565,7 +1610,7 @@ private Q_SLOTS: std::unordered_map is_source; - + double expandRadius; double minBox; double maxBox; QPixmap legend_; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_dialog.ui b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_dialog.ui index 1d368c3dd592..3427d5b12e6a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_dialog.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_dialog.ui @@ -135,6 +135,26 @@ + + + keep vertex normals unperturbed + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + seed_spinbox + + + + + + + + + + + Random seed @@ -147,7 +167,7 @@ - + @@ -163,6 +183,8 @@ seed_spinbox seed_label + keep_normal_label + keep_normal_checkbox deterministic_label deterministic_checkbox diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp index 53499b823367..9afb452ab13c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -102,6 +103,12 @@ public Q_SLOTS: if (poly_item) { SMesh& pmesh = *poly_item->face_graph(); + if(ui.keep_normal_checkbox->isChecked()) + { + SMesh::Property_map vnormals = + pmesh.add_property_map("v:normal").first; + CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh,vnormals); + } if(ui.deterministic_checkbox->isChecked()) { unsigned int seed = static_cast(ui.seed_spinbox->value()); From 127c87857cbec43e692dfd94aefbe7755029e376 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 31 Jul 2022 00:32:42 +0200 Subject: [PATCH 0029/1398] Use slider radius (after remapping) in curvature computation --- .../Polyhedron/Plugins/Display/Display_property_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index a2d25d167c6b..92f9df7b213d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -841,9 +841,9 @@ private Q_SLOTS: if (non_init) { if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map); + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expandRadius)); else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map); + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expandRadius)); double res_min = ARBITRARY_DBL_MAX, res_max = -ARBITRARY_DBL_MAX; From 22c0859d92fa444f0ca78b2c21bb58cf843d730d Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 31 Jul 2022 00:41:43 +0200 Subject: [PATCH 0030/1398] trailing spaces --- .../demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 92f9df7b213d..19afdc6728ec 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -815,7 +815,7 @@ private Q_SLOTS: (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) .squared_length() ); - + std::cout << L << std::endl; double outMin = 0, outMax = 5 * L, base = 1.2; From 9635ec14975c74beaaac9cce6f4fc6c883f5ff98 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 31 Jul 2022 18:55:51 +0200 Subject: [PATCH 0031/1398] minor changes on demo (wip) --- ...nterpolated_corrected_curvature_measures.h | 9 +-- .../Display/Display_property_plugin.cpp | 77 +++++++++++-------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index d36e1c67e363..1ee24fef37f5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -409,9 +409,6 @@ template::type::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); - if (r < 0.000001) - return; - typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); @@ -446,7 +443,7 @@ template(x, r, c); - if (f_ratio > 0.000001) + if (f_ratio > 0.00000001) { corrected_mui += f_ratio * get(fmm, fi); for (face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) @@ -492,7 +489,7 @@ template 0.000001) + if (v_mu0 > 0.00000001) put(vcm, v, 0.5 * get(mu1_expand_map, v) / v_mu0); else put(vcm, v, 0); @@ -528,7 +525,7 @@ template 0.000001) + if(v_mu0 > 0.00000001) put(vcm, v, get(mu2_expand_map, v) / v_mu0); else put(vcm, v, 0); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 19afdc6728ec..91deb90680a8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -487,8 +487,10 @@ class DisplayPropertyPlugin : connect(scene_obj, SIGNAL(itemIndexSelected(int)), this,SLOT(detectScalarProperties(int))); - on_propertyBox_currentIndexChanged(0); + connect(dock_widget->expandingRadiusSlider, SIGNAL(valueChanged(int)), + this, SLOT(setExpandingRadius(int))); + on_propertyBox_currentIndexChanged(0); } private: @@ -716,6 +718,10 @@ private Q_SLOTS: { Scene_surface_mesh_item* item = qobject_cast(sender()); + + maxEdgeLength = -1; + setExpandingRadius(dock_widget->expandingRadiusSlider->value()); + if(!item) return; SMesh& smesh = *item->face_graph(); @@ -784,43 +790,56 @@ private Q_SLOTS: treat_sm_property("f:jacobian", item->face_graph()); } - double sliderRangeToExpandRadius(SMesh& smesh, double val) + void setExpandingRadius(int val_int) { double sliderMin = dock_widget->expandingRadiusSlider->minimum(); double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; - val -= sliderMin; + double val = val_int - sliderMin; sliderMin = 0; - auto vpm = get(CGAL::vertex_point, smesh); - - auto edge_range = CGAL::edges(smesh); - - if (edge_range.begin() == edge_range.end()) - return 0; + SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); - auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { - auto res = EPICK().compare_squared_distance_3_object()( - get(vpm, source((l), smesh)), - get(vpm, target((l), smesh)), - get(vpm, source((r), smesh)), - get(vpm, target((r), smesh))); - return res == CGAL::SMALLER; - }); + auto vpm = get(CGAL::vertex_point, smesh); - // if edge_reference is not derefrenceble - if (edge_reference == edge_range.end()) - return 0; + if (maxEdgeLength < 0) + { + auto edge_range = CGAL::edges(smesh); - double L = sqrt( - (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) - .squared_length() - ); + if (edge_range.begin() == edge_range.end()) + { + expandRadius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + return; + } - std::cout << L << std::endl; + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return res == CGAL::SMALLER; + }); + + // if edge_reference is not derefrenceble + if (edge_reference == edge_range.end()) + { + expandRadius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + return; + } - double outMin = 0, outMax = 5 * L, base = 1.2; + maxEdgeLength = sqrt( + (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) + .squared_length() + ); - return (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + } + + double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; + + expandRadius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); } @@ -830,9 +849,6 @@ private Q_SLOTS: "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); - expandRadius = sliderRangeToExpandRadius(smesh, dock_widget->expandingRadiusSlider->value()); - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); - //compute once and store the value per vertex bool non_init; SMesh::Property_map mu_i_map; @@ -1611,6 +1627,7 @@ private Q_SLOTS: std::unordered_map is_source; double expandRadius; + double maxEdgeLength = -1; double minBox; double maxBox; QPixmap legend_; From 765220a4661743db3367676f6723cdc9dd23ccce Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 31 Jul 2022 20:03:33 +0200 Subject: [PATCH 0032/1398] removing the switch from measures functions (for optimization) --- ...nterpolated_corrected_curvature_measures.h | 277 ++++++++++-------- 1 file changed, 151 insertions(+), 126 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 1ee24fef37f5..250ea596c1c3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -26,6 +26,7 @@ #include #include #include +#include namespace CGAL { @@ -46,207 +47,215 @@ enum Curvature_measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific triangle. +* computes the interpolated corrected area measure of a specific face. * * @tparam GT is the geometric traits class. * -* @param x0 is the position of vertex #0. -* @param x1 is the position of vertex #1. -* @param x2 is the position of vertex #2. -* @param u0 is the normal vector of vertex #0. -* @param u1 is the normal vector of vertex #1. -* @param u2 is the normal vector of vertex #2. -* @param mu_i an enum for choosing between computing the area measure, -* the mean curvature measure, or the gaussian curvature measure. +* @param x is a vector of the vertex positions of the face. +* @param u is a vector of the vertex nomrals of the face. * * @return a scalar of type `GT::FT`. -* This is the value of the interpolated corrected measure of the given triangle. +* This is the value of the interpolated corrected area measure of the given face. * -* @see `interpolated_corrected_measure_face()` -* @see `interpolated_corrected_measure_quad()` +* @see `interpolated_corrected_mean_curvature_measure_face()` +* @see `interpolated_corrected_gaussian_curvature_measure_face()` +* @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_measure_triangle(const typename GT::Vector_3 x0, - const typename GT::Vector_3 x1, - const typename GT::Vector_3 x2, - const typename GT::Vector_3 u0, - const typename GT::Vector_3 u1, - const typename GT::Vector_3 u2, - const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_area_measure_face(const std::vector& x, + const std::vector& u) { + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + typename GT::Construct_cross_product_vector_3 cross_product; - switch (mu_i) + + // Triangle: use triangle formula + if (n == 3) { - case MU0_AREA_MEASURE: + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + return 0.5 * um * cross_product(x[1] - x[0], x[2] - x[0]); + } + // Quad: use bilinear interpolation formula + else if (n == 4) { - const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; - - return 0.5 * um * cross_product(x1 - x0, x2 - x0); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + return (1 / 36.0) * ( + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) + ); } - case MU1_MEAN_CURVATURE_MEASURE: + // N-gon: split into n triangles by polygon center and use triangle formula for each + else { - const typename GT::Vector_3 um = (u0 + u1 + u2) / 3.0; + typename GT::FT mu0 = 0; - return 0.5 * um * (cross_product(u2 - u1, x0) - + cross_product(u0 - u2, x1) - + cross_product(u1 - u0, x2)); - } - case MU2_GAUSSIAN_CURVATURE_MEASURE: + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; - return 0.5 * u0 * cross_product(u1, u2); + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); - default: return 0; + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + const typename GT::Vector_3 um = (u[i] + u[(i + 1) % n] + uc) / 3.0; + mu0 += 0.5 * um * cross_product(x[(i + 1) % n] - x[i], xc - x[i]); + } + return mu0; } } /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific quad -* Note that the vertices 0 to 3 are ordered like this \n -* v0 _ v1 \n -* v2 |_| v3 +* computes the interpolated corrected mean curvature measure of a specific face. * * @tparam GT is the geometric traits class. * -* @param x0 is the position of vertex #0. -* @param x1 is the position of vertex #1. -* @param x2 is the position of vertex #2. -* @param x3 is the position of vertex #3. -* @param u0 is the normal vector of vertex #0. -* @param u1 is the normal vector of vertex #1. -* @param u2 is the normal vector of vertex #2. -* @param u3 is the normal vector of vertex #3. -* @param mu_i an enum for choosing between computing the area measure, -* the mean curvature measure, or the gaussian curvature measure. +* @param x is a vector of the vertex positions of the face. +* @param u is a vector of the vertex nomrals of the face. * * @return a scalar of type `GT::FT`. -* This is the value of the interpolated corrected measure of the given triangle. +* This is the value of the interpolated corrected mean curvature measure of the given face. * -* @see `interpolated_corrected_measure_face()` -* @see `interpolated_corrected_measure_triangle()` +* @see `interpolated_corrected_gaussian_curvature_measure_face()` +* @see `interpolated_corrected_area_measure_face()` +* @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_measure_quad(const typename GT::Vector_3 x0, - const typename GT::Vector_3 x1, - const typename GT::Vector_3 x2, - const typename GT::Vector_3 x3, - const typename GT::Vector_3 u0, - const typename GT::Vector_3 u1, - const typename GT::Vector_3 u2, - const typename GT::Vector_3 u3, - const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& x, + const std::vector& u) { - // x0 _ x1 - // x2 |_| x3 + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + typename GT::Construct_cross_product_vector_3 cross_product; - switch (mu_i) - { - case MU0_AREA_MEASURE: - return (1 / 36.0) * ( - (4 * u0 + 2 * u1 + 2 * u2 + u3) * cross_product(x1 - x0, x2 - x0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * cross_product(x1 - x0, x3 - x1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * cross_product(x3 - x2, x2 - x0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * cross_product(x3 - x2, x3 - x1) - ); + // Triangle: use triangle formula + if (n == 3) + { + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; - case MU1_MEAN_CURVATURE_MEASURE: + return 0.5 * um * (cross_product(u[2] - u[1], x[0]) + + cross_product(u[0] - u[2], x[1]) + + cross_product(u[1] - u[0], x[2])); + } + // Quad: use bilinear interpolation formula + else if (n == 4) { - const typename GT::Vector_3 u03 = u3 - u0; - const typename GT::Vector_3 u12 = u2 - u1; - const typename GT::Vector_3 x0_cross = cross_product(u12, x0); - const typename GT::Vector_3 x1_cross = -cross_product(u03, x1); - const typename GT::Vector_3 x2_cross = cross_product(u03, x2); - const typename GT::Vector_3 x3_cross = -cross_product(u12, x3); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 u13 = u[3] - u[1]; + const typename GT::Vector_3 x0_cross = cross_product(u13, x[0]); + const typename GT::Vector_3 x1_cross = -cross_product(u02, x[1]); + const typename GT::Vector_3 x3_cross = cross_product(u02, x[3]); + const typename GT::Vector_3 x2_cross = -cross_product(u13, x[2]); return (1 / 12.0) * ( - u0 * (2 * x0_cross - cross_product((u2 + u3), x1) + cross_product((u1 + u3), x2) + x3_cross) - + u1 * (cross_product((u2 + u3), x0) + 2 * x1_cross + x2_cross - cross_product((u0 + u2), x3)) - + u2 * (-cross_product((u1 + u3), x0) + x1_cross + 2 * x2_cross + cross_product((u0 + u1), x3)) - + u3 * (x0_cross + cross_product((u0 + u2), x1) - cross_product((u0 + u1), x2) + 2 * x3_cross) + u[0] * (2 * x0_cross - cross_product((u[3] + u[2]), x[1]) + cross_product((u[1] + u[2]), x[3]) + x2_cross) + + u[1] * (cross_product((u[3] + u[2]), x[0]) + 2 * x1_cross + x3_cross - cross_product((u[0] + u[3]), x[2])) + + u[3] * (-cross_product((u[1] + u[2]), x[0]) + x1_cross + 2 * x3_cross + cross_product((u[0] + u[1]), x[2])) + + u[2] * (x0_cross + cross_product((u[0] + u[3]), x[1]) - cross_product((u[0] + u[1]), x[3]) + 2 * x2_cross) ); } - case MU2_GAUSSIAN_CURVATURE_MEASURE: + // N-gon: split into n triangles by polygon center and use triangle formula for each + else + { + typename GT::FT mu1 = 0; - return (1 / 36.0) * ( - (4 * u0 + 2 * u1 + 2 * u2 + u3) * cross_product(u1 - u0, u2 - u0) - + (2 * u0 + 4 * u1 + u2 + 2 * u3) * cross_product(u1 - u0, u3 - u1) - + (2 * u0 + u1 + 4 * u2 + 2 * u3) * cross_product(u3 - u2, u2 - u0) - + (u0 + 2 * u1 + 2 * u2 + 4 * u3) * cross_product(u3 - u2, u3 - u1) - ); + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); - default: return 0; + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + const typename GT::Vector_3 um = (u[i] + u[(i+1)%n] + uc) / 3.0; + mu1 += 0.5 * um * (cross_product(uc - u[(i + 1) % n], x[i]) + + cross_product(u[i] - uc, x[(i + 1) % n]) + + cross_product(u[(i + 1) % n] - u[i], xc)); + } + return mu1; } } - /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected measure of specific face. +* computes the interpolated corrected gaussian curvature measure of a specific face. * * @tparam GT is the geometric traits class. * * @param x is a vector of the vertex positions of the face. * @param u is a vector of the vertex nomrals of the face. -* @param mu_i an enum for choosing between computing the area measure, -* the mean curvature measure, or the gaussian curvature measure. * * @return a scalar of type `GT::FT`. -* This is the value of the interpolated corrected measure of the given face. +* This is the value of the interpolated corrected gaussian curvature measure of the given face. * -* @see `interpolated_corrected_measure_triangle()` -* @see `interpolated_corrected_measure_quad()` +* @see `interpolated_corrected_mean_curvature_measure_face()` +* @see `interpolated_corrected_area_measure_face()` * @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_measure_face(const std::vector& x, - const std::vector& u, - const Curvature_measure_index mu_i) +typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& x, + const std::vector& u) { - std::size_t n = x.size(); - CGAL_precondition(u.size() == n); + std::size_t n = u.size(); CGAL_precondition(n >= 3); - // Triangle: use triangle formulas - if (n == 3) - return interpolated_corrected_measure_triangle(x[0], x[1], x[2], - u[0], u[1], u[2], mu_i); + typename GT::Construct_cross_product_vector_3 cross_product; - // Quad: use bilinear interpolation formulas + // Triangle: use triangle formula + if (n == 3) + { + return 0.5 * u[0] * cross_product(u[1], u[2]); + } + // Quad: use bilinear interpolation formula else if (n == 4) - // x[0] _ x[1] ---> x0 _ x1 (reason for changing order) - // x[3] |_| x[2] ---> x2 |_| x3 - return interpolated_corrected_measure_quad(x[0], x[1], x[3], x[2], - u[0], u[1], u[3], u[2], mu_i); - - // N-gon: split into n triangles by barycenter and use triangle formulas for each - else { - typename GT::FT mu0 = 0; - - // getting center of points - typename GT::Vector_3 xm = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xm /= n; + { + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + return (1 / 36.0) * ( + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(x[1] - x[0], x[3] - x[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(x[1] - x[0], x[2] - x[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(x[2] - x[3], x[3] - x[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(x[2] - x[3], x[2] - x[1]) + ); + } + // N-gon: split into n triangles by polygon center and use triangle formula for each + else + { + typename GT::FT mu2 = 0; // getting unit average normal of points - typename GT::Vector_3 um = + typename GT::Vector_3 uc = std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - um /= sqrt(um * um); + uc /= sqrt(uc * uc); // summing each triangle's measure after triangulation by barycenter split. for (std::size_t i = 0; i < n; i++) { - mu0 += interpolated_corrected_measure_triangle(x[i], x[(i + 1) % n], xm, - u[i], u[(i + 1) % n], um, mu_i); + mu2 += 0.5 * u[i] * cross_product(u[(i + 1) % n], uc); } - return mu0; + return mu2; } } - /** * \ingroup PMP_corrected_curvatures_grp * @@ -322,6 +331,22 @@ template::value) compute_vertex_normals(pmesh, vnm, np); + std::function + &, const std::vector&)> + iccm_function; + switch (mu_i) + { + case MU0_AREA_MEASURE: + iccm_function = &interpolated_corrected_area_measure_face; + break; + case MU1_MEAN_CURVATURE_MEASURE: + iccm_function = &interpolated_corrected_mean_curvature_measure_face; + break; + case MU2_GAUSSIAN_CURVATURE_MEASURE: + iccm_function = &interpolated_corrected_gaussian_curvature_measure_face; + break; + } + for (face_descriptor f : faces(pmesh)) { std::vector x; @@ -334,7 +359,7 @@ template(x, u, mu_i)); + put(fmm, f, iccm_function(x, u)); } } From 870c27670b52912cad7946c8e93e2993c473bb0d Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 1 Aug 2022 08:15:18 +0200 Subject: [PATCH 0033/1398] minor fixes (typename, doc) --- .../Curvatures/interpolated_corrected_curvature_measures.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 250ea596c1c3..c9a70ee12ec8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -295,7 +295,9 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std * * \cgalNamedParamsEnd * -* @see `interpolated_corrected_measure_face()` +* @see `interpolated_corrected_area_measure_face()` +* @see `interpolated_corrected_mean_curvature_measure_face()` +* @see `interpolated_corrected_gaussian_curvature_measure_face()` */ template @@ -332,7 +334,7 @@ template&, const std::vector&)> + &, const std::vector&)> iccm_function; switch (mu_i) { From 34b776d6c2e6ce0ec8cf54c6139478fb86b3c48e Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 1 Aug 2022 08:35:06 +0200 Subject: [PATCH 0034/1398] trailing spaces --- .../Polyhedron/Plugins/Display/Display_property_plugin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 91deb90680a8..66187583657e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -721,7 +721,7 @@ private Q_SLOTS: maxEdgeLength = -1; setExpandingRadius(dock_widget->expandingRadiusSlider->value()); - + if(!item) return; SMesh& smesh = *item->face_graph(); @@ -835,9 +835,9 @@ private Q_SLOTS: ); } - + double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; - + expandRadius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); From 09cb2b1e6d1b78fe4e19031c40abb42fd12505cf Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 2 Aug 2022 23:12:23 +0200 Subject: [PATCH 0035/1398] some refactoring + implemented the anisotropic formulas function --- ...nterpolated_corrected_curvature_measures.h | 162 ++++++++++++++++-- 1 file changed, 143 insertions(+), 19 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index c9a70ee12ec8..1032413a9c5c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -47,7 +47,7 @@ enum Curvature_measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected area measure of a specific face. +* computes the interpolated corrected area measure (mu0) of a specific face. * * @tparam GT is the geometric traits class. * @@ -62,8 +62,8 @@ enum Curvature_measure_index { * @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_area_measure_face(const std::vector& x, - const std::vector& u) +typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, + const std::vector& x = {}) { std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -81,6 +81,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector( + std::vector {u[i], u[i + 1 % n], uc}, + std::vector {x[i], x[i + 1 % n], xc} + ); } return mu0; } @@ -116,7 +119,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector -typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& x, - const std::vector& u) +typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, + const std::vector& x = {}) { std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -153,6 +156,7 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve else if (n == 4) { // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 const typename GT::Vector_3 u02 = u[2] - u[0]; const typename GT::Vector_3 u13 = u[3] - u[1]; @@ -186,10 +190,10 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve // summing each triangle's measure after triangulation by barycenter split. for (std::size_t i = 0; i < n; i++) { - const typename GT::Vector_3 um = (u[i] + u[(i+1)%n] + uc) / 3.0; - mu1 += 0.5 * um * (cross_product(uc - u[(i + 1) % n], x[i]) - + cross_product(u[i] - uc, x[(i + 1) % n]) - + cross_product(u[(i + 1) % n] - u[i], xc)); + mu1 += interpolated_corrected_mean_curvature_measure_face( + std::vector {u[i], u[i + 1 % n], uc}, + std::vector {x[i], x[i + 1 % n], xc} + ); } return mu1; } @@ -198,7 +202,7 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected gaussian curvature measure of a specific face. +* computes the interpolated corrected gaussian curvature measure (mu2) of a specific face. * * @tparam GT is the geometric traits class. * @@ -213,8 +217,8 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve * @see `interpolated_corrected_measure_mesh()` */ template -typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& x, - const std::vector& u) +typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, + const std::vector& x = {}) { std::size_t n = u.size(); CGAL_precondition(n >= 3); @@ -230,6 +234,7 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std else if (n == 4) { // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 return (1 / 36.0) * ( (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(x[1] - x[0], x[3] - x[0]) + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(x[1] - x[0], x[2] - x[1]) @@ -250,12 +255,131 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std // summing each triangle's measure after triangulation by barycenter split. for (std::size_t i = 0; i < n; i++) { - mu2 += 0.5 * u[i] * cross_product(u[(i + 1) % n], uc); + mu2 += interpolated_corrected_gaussian_curvature_measure_face( + std::vector {u[i], u[i + 1 % n], uc} + ); } return mu2; } } +/** +* \ingroup PMP_corrected_curvatures_grp +* +* computes the interpolated corrected anisotropic measure (muXY) of a specific face. +* +* @tparam GT is the geometric traits class. +* +* @param u is a vector of the vertex nomrals of the face. +* @param x is a vector of the vertex positions of the face. +* +* @return an array of scalar values for each combination of the standard basis (3x3) of type `std::array`. +* These are the values of the interpolated corrected anisotropic measure of the given face. +* +* @see `interpolated_corrected_anisotropic_measure_mesh()` +*/ +template +std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, + const std::vector& x) +{ + std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + typename GT::Construct_cross_product_vector_3 cross_product; + std::array muXY; + + // Triangle: use triangle formula + if (n == 3) + { + const typename GT::Vector_3 u01 = u[1] - u[0]; + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 x01 = x[1] - x[0]; + const typename GT::Vector_3 x02 = x[2] - x[0]; + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + + for (std::size_t ix = 0; ix < 3; ix++) + { + const typename GT::Vector_3 X(0, 0, 0); + X[ix] = 1; + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); + } + } + // Quad: use bilinear interpolation formula + else if (n == 4) + { + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + for (std::size_t ix = 0; ix < 3; ix++) + { + const typename GT::Vector_3 X(0, 0, 0); + X[ix] = 1; + const typename GT::Vector_3 u0xX = cross_product(u[0], X); + const typename GT::Vector_3 u1xX = cross_product(u[1], X); + const typename GT::Vector_3 u2xX = cross_product(u[2], X); + const typename GT::Vector_3 u3xX = cross_product(u[3], X); + + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = (1 / 72.0) * ( + + u[0][iy] * ( u0xX * ( - x[0] - 11 * x[1] + 13 * x[3] - x[2]) + + u1xX * ( -5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) + + u3xX * ( x[0] - 7 * x[1] + 11 * x[3] - 5 * x[2]) + + u2xX * ( - x[0] - 5 * x[1] + 7 * x[3] - x[2]) + ) + + u[1][iy] * ( u0xX * ( 13 * x[0] - x[1] - 7 * x[3] - 5 * x[2]) + + u1xX * ( 17 * x[0] - 5 * x[1] - 5 * x[3] - 7 * x[2]) + + u3xX * ( 5 * x[0] + x[1] + x[3] - 7 * x[2]) + + u2xX * ( 7 * x[0] - x[1] + 5 * x[3] - 11 * x[2]) + ) + + u[2][iy] * ( u0xX * (-11 * x[0] + 5 * x[1] - x[3] + 7 * x[2]) + + u1xX * (- 7 * x[0] + x[1] + x[3] + 5 * x[2]) + + u3xX * (- 7 * x[0] - 5 * x[1] - 5 * x[3] + 17 * x[2]) + + u2xX * (- 5 * x[0] - 7 * x[1] - x[3] + 13 * x[2]) + ) + + u[3][iy] * ( u0xX * (- x[0] + 7 * x[1] - 5 * x[3] - x[2]) + + u1xX * (- 5 * x[0] + 11 * x[1] - 7 * x[3] + x[2]) + + u3xX * ( x[0] + 11 * x[1] - 7 * x[3] - 5 * x[2]) + + u2xX * (- x[0] + 13 * x[1] - 11 * x[3] - x[2]) + ) + + ); + } + } + // N-gon: split into n triangles by polygon center and use triangle formula for each + else + { + typename GT::FT muXY = 0; + + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + std::array muXY_curr_triangle = + interpolated_corrected_anisotropic_measure_face( + std::vector {u[i], u[i + 1 % n], uc}, + std::vector {x[i], x[i + 1 % n], xc} + ); + + for (std::size_t ix = 0; ix < 3; ix++) + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] += muXY_curr_triangle[ix * 3 + iy]; + } + } + return muXY; +} + + /** * \ingroup PMP_corrected_curvatures_grp * @@ -333,6 +457,8 @@ template::value) compute_vertex_normals(pmesh, vnm, np); + typedef typename property_map_value::type measure; + std::function &, const std::vector&)> iccm_function; @@ -361,7 +487,7 @@ template Date: Wed, 3 Aug 2022 14:30:52 +0200 Subject: [PATCH 0036/1398] Principal Curvatures wip --- .../interpolated_corrected_curvatures.cpp | 2 +- ...nterpolated_corrected_curvature_measures.h | 266 +++++++++++++++++- 2 files changed, 260 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 5359315f0fa0..4b8a9e6cfe7d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) Mesh g1; const std::string filename = (argc>1) ? argv[1] : - CGAL::data_file_path("meshes/cylinder.off"); + CGAL::data_file_path("meshes/sphere_diff_faces.obj"); if(!CGAL::IO::read_polygon_mesh(filename, g1)) { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 1032413a9c5c..618124e7fc74 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -13,7 +13,6 @@ #ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H #define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H -#endif #include @@ -22,6 +21,7 @@ #include #include #include +#include #include #include @@ -82,7 +82,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector`. +* @return an array of scalar values for each combination of the standard basis (3x3) of type `std::array`. * These are the values of the interpolated corrected anisotropic measure of the given face. * * @see `interpolated_corrected_anisotropic_measure_mesh()` @@ -321,7 +321,7 @@ std::array interpolated_corrected_anisotropic_measure_fa const typename GT::Vector_3 u3xX = cross_product(u[3], X); for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] = (1 / 72.0) * ( + muXY[ix * 3 + iy] = (1.0 / 72.0) * ( u[0][iy] * ( u0xX * ( - x[0] - 11 * x[1] + 13 * x[3] - x[2]) + u1xX * ( -5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) @@ -433,6 +433,7 @@ template::type GT; + typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::%face_descriptor` as key type and `std::array` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals should be +* computed inside the function body.} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `interpolated_corrected_anisotropic_measure_face()` +* @see `interpolated_corrected_measure_mesh()` +*/ +template + void + interpolated_corrected_anisotropic_measure_mesh(const PolygonMesh& pmesh, + FaceMeasureMap fmm, + const NamedParameters& np = parameters::default_values()) +{ + + typedef typename GetGeomTraits::type GT; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type VNM; + + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); + + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + + for (face_descriptor f : faces(pmesh)) + { + std::vector x; + std::vector u; + + for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + typename GT::Point_3 p = get(vpm, v); + x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); + } + + put(fmm, f, interpolated_corrected_anisotropic_measure_face(u, x)); + } +} + + // //template //typename GT::FT triangle_in_ball_ratio_1(const typename GT::Vector_3 x1, @@ -556,6 +649,7 @@ template::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; @@ -613,6 +707,85 @@ template + void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, + FaceMeasureMap fmm, + VertexCurvatureMap vcm, + const typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) +{ + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef typename GetGeomTraits::type GT; + + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + const typename GetGeomTraits::type::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); + + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + + std::queue bfs_q; + std::unordered_set bfs_v; + + typename GT::Point_3 vp = get(vpm, v); + typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); + + Eigen::Matrix corrected_muXY = { + { 0.0, 0.0, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 0.0, 0.0} + }; + + for (face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_q.push(f); + bfs_v.insert(f); + } + } + while (!bfs_q.empty()) { + face_descriptor fi = bfs_q.front(); + bfs_q.pop(); + + // looping over vertices in face to get point coordinates + std::vector x; + for (vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + typename GT::Point_3 pi = get(vpm, vi); + x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); + } + + const typename GT::FT f_ratio = face_in_ball_ratio_2(x, r, c); + + if (f_ratio > 0.00000001) + { + std::array muXY_face = get(fmm, fi); + + for (std::size_t ix = 0; ix < 3; ix++) + for (std::size_t iy = 0; iy < 3; iy++) + corrected_muXY(ix, iy) += muXY_face[ix * 3 + iy]; + + for (face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_v.find(fj) == bfs_v.end() && fj != boost::graph_traits::null_face()) + { + bfs_q.push(fj); + bfs_v.insert(fj); + } + } + } + } + + put(vcm, v, corrected_muXY); +} + template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, @@ -620,8 +793,10 @@ template::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::unordered_map VertexMeasureMap_tag; @@ -656,8 +831,10 @@ template::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::unordered_map VertexMeasureMap_tag; @@ -685,5 +862,80 @@ template + void interpolated_corrected_principal_curvature(const PolygonMesh& pmesh, + VertexCurvatureMap vcm, + const NamedParameters& np = parameters::default_values()) +{ + typedef typename GetGeomTraits::type GT; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type VNM; + + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + typename GetVertexPointMap::const_type + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); + + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef std::unordered_map FaceScalarMeasureMap_tag; + // using std:: array to store FT values on the 9 combinations of the standard 3D basis + typedef std::unordered_map> FaceArrayMeasureMap_tag; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef std::unordered_map VertexScalarMeasureMap_tag; + // using Eigen matrix to store & Process FT values on the 9 combinations of the standard 3D basis + typedef std::unordered_map> VertexMatrixMeasureMap_tag; + + + FaceScalarMeasureMap_tag mu0_init; + boost::associative_property_map + mu0_map(mu0_init); + + FaceArrayMeasureMap_tag muXY_init; + boost::associative_property_map + muXY_map(muXY_init); + + VertexScalarMeasureMap_tag mu0_expand_init; + boost::associative_property_map + mu0_expand_map(mu0_expand_init); + + VertexMatrixMeasureMap_tag muXY_expand_init; + boost::associative_property_map + muXY_expand_map(muXY_expand_init); + + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); + interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map); + + for (vertex_descriptor v : vertices(pmesh)) + { + expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu0_expand_map, v, np); + expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, muXY_map, muXY_expand_map, v, np); + + + + /*typename GT::FT v_mu0 = get(mu0_expand_map, v); + if (v_mu0 > 0.00000001) + put(vcm, v, get(mu2_expand_map, v) / v_mu0); + else + put(vcm, v, 0);*/ + } } -} + +} // namespace Polygon_mesh_processing +} // namespace CGAL + +#endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H \ No newline at end of file From 24edaa24b5fc54bf85ac21b9c291610da6bbbf1c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 3 Aug 2022 18:59:08 +0200 Subject: [PATCH 0037/1398] principal curvatures (yet to decompose MuXY Matrix) --- .../interpolated_corrected_curvatures.cpp | 23 ++++++++++-- ...nterpolated_corrected_curvature_measures.h | 36 +++++++++++++------ 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 4b8a9e6cfe7d..28e6e0ef81cb 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -18,6 +18,14 @@ typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef std::unordered_map FaceMeasureMap_tag; typedef std::unordered_map vertexMeasureMap_tag; +typedef std::unordered_map, + Eigen::Vector + >> +vertexPrincipleCurvatureMap_tag; + int main(int argc, char* argv[]) @@ -38,16 +46,27 @@ int main(int argc, char* argv[]) boost::associative_property_map mean_curvature_map(mean_curvature_init), gaussian_curvature_map(gaussian_curvature_init); + vertexPrincipleCurvatureMap_tag principle_curvature_init; + boost::associative_property_map principle_curvature_map(principle_curvature_init); + PMP::interpolated_corrected_mean_curvature( g1, mean_curvature_map - ); + ); PMP::interpolated_corrected_gaussian_curvature( g1, gaussian_curvature_map ); + PMP::interpolated_corrected_principal_curvatures( + g1, + principle_curvature_map + ); for (vertex_descriptor v : vertices(g1)) + { + auto PC = get(principle_curvature_map, v); std::cout << v.idx() << ": HC = " << get(mean_curvature_map, v) - << ", GC = " << get(gaussian_curvature_map, v) << "\n"; + << ", GC = " << get(gaussian_curvature_map, v) << "\n" + << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; + } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 618124e7fc74..83f63b74b54e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -690,7 +690,7 @@ template(x, r, c); - if (f_ratio > 0.00000001) + if (f_ratio != 0.0) { corrected_mui += f_ratio * get(fmm, fi); for (face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) @@ -764,7 +764,7 @@ template(x, r, c); - if (f_ratio > 0.00000001) + if (f_ratio != 0.0) { std::array muXY_face = get(fmm, fi); @@ -817,7 +817,7 @@ template 0.00000001) + if (v_mu0 != 0.0) put(vcm, v, 0.5 * get(mu1_expand_map, v) / v_mu0); else put(vcm, v, 0); @@ -855,7 +855,7 @@ template 0.00000001) + if(v_mu0 != 0.0) put(vcm, v, get(mu2_expand_map, v) / v_mu0); else put(vcm, v, 0); @@ -864,7 +864,7 @@ template - void interpolated_corrected_principal_curvature(const PolygonMesh& pmesh, + void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, VertexCurvatureMap vcm, const NamedParameters& np = parameters::default_values()) { @@ -925,13 +925,27 @@ template v_muXY = get(muXY_expand_map, v); + typename GT::Vector_3 u_GT = get(vnm, v); - - /*typename GT::FT v_mu0 = get(mu0_expand_map, v); - if (v_mu0 > 0.00000001) - put(vcm, v, get(mu2_expand_map, v) / v_mu0); - else - put(vcm, v, 0);*/ + Eigen::Vector u(u_GT.x(), u_GT.y(), u_GT.z()); + + const typename GT::FT K = 1000 * v_mu0; + + v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); + + Eigen::Vector eig_vals; + Eigen::Matrix eig_vecs; + + + //(WIP) + EigenDecomposition< 3, typename GT::FT>::getEigenDecomposition(v_muXY, eig_vecs, eig_vals); + + put(vcm, v, std::make_tuple((v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, + eig_vecs.column(0), + eig_vecs.column(1))); } } From 24551e2cbb2b38db5aabc2f31395c38651e3d635 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 4 Aug 2022 10:51:45 +0200 Subject: [PATCH 0038/1398] principal curvatures completed (but not properly tested) --- .../interpolated_corrected_curvatures.cpp | 2 +- ...nterpolated_corrected_curvature_measures.h | 60 ++++++++++++------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 28e6e0ef81cb..b804ae061cf4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -33,7 +33,7 @@ int main(int argc, char* argv[]) Mesh g1; const std::string filename = (argc>1) ? argv[1] : - CGAL::data_file_path("meshes/sphere_diff_faces.obj"); + CGAL::data_file_path("meshes/small_bunny.obj"); if(!CGAL::IO::read_polygon_mesh(filename, g1)) { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 83f63b74b54e..4b6a2f5149d9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include @@ -287,7 +287,7 @@ std::array interpolated_corrected_anisotropic_measure_fa CGAL_precondition(n >= 3); typename GT::Construct_cross_product_vector_3 cross_product; - std::array muXY; + std::array muXY {0}; // Triangle: use triangle formula if (n == 3) @@ -300,8 +300,14 @@ std::array interpolated_corrected_anisotropic_measure_fa for (std::size_t ix = 0; ix < 3; ix++) { - const typename GT::Vector_3 X(0, 0, 0); - X[ix] = 1; + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); + for (std::size_t iy = 0; iy < 3; iy++) muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); } @@ -313,8 +319,14 @@ std::array interpolated_corrected_anisotropic_measure_fa // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 for (std::size_t ix = 0; ix < 3; ix++) { - const typename GT::Vector_3 X(0, 0, 0); - X[ix] = 1; + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); + const typename GT::Vector_3 u0xX = cross_product(u[0], X); const typename GT::Vector_3 u1xX = cross_product(u[1], X); const typename GT::Vector_3 u2xX = cross_product(u[2], X); @@ -350,8 +362,6 @@ std::array interpolated_corrected_anisotropic_measure_fa // N-gon: split into n triangles by polygon center and use triangle formula for each else { - typename GT::FT muXY = 0; - // getting center of points typename GT::Vector_3 xc = std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); @@ -654,7 +664,7 @@ template::vertex_descriptor vertex_descriptor; const typename GetGeomTraits::type::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.1); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), @@ -737,11 +747,7 @@ template corrected_muXY = { - { 0.0, 0.0, 0.0}, - { 0.0, 0.0, 0.0}, - { 0.0, 0.0, 0.0} - }; + Eigen::Matrix corrected_muXY = Eigen::Matrix::Zero(); for (face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f != boost::graph_traits::null_face()) @@ -935,17 +941,29 @@ template eig_vals; - Eigen::Matrix eig_vecs; + //(WIP) + Eigen::SelfAdjointEigenSolver> eigensolver; + eigensolver.computeDirect(v_muXY); + + if (eigensolver.info() != Eigen::Success) + { + put(vcm, v, std::make_tuple( + 0, + 0, + Eigen::Vector(.0,.0,.0), + Eigen::Vector(.0, .0, .0))); + continue; + } - //(WIP) - EigenDecomposition< 3, typename GT::FT>::getEigenDecomposition(v_muXY, eig_vecs, eig_vals); + Eigen::Vector eig_vals = eigensolver.eigenvalues(); + Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); - put(vcm, v, std::make_tuple((v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + put(vcm, v, std::make_tuple( (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, - eig_vecs.column(0), - eig_vecs.column(1))); + (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + eig_vecs.col(1), + eig_vecs.col(0))); } } From c4db1600fda9f9fa3a50bc005db84f5122107382 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 4 Aug 2022 11:01:09 +0200 Subject: [PATCH 0039/1398] trim whitespaces --- .../Curvatures/interpolated_corrected_curvature_measures.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 4b6a2f5149d9..4525628f5645 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include @@ -305,7 +305,7 @@ std::array interpolated_corrected_anisotropic_measure_fa X = typename GT::Vector_3(1, 0, 0); if (ix == 1) X = typename GT::Vector_3(0, 1, 0); - if (ix == 2) + if (ix == 2) X = typename GT::Vector_3(0, 0, 1); for (std::size_t iy = 0; iy < 3; iy++) @@ -945,7 +945,7 @@ template> eigensolver; eigensolver.computeDirect(v_muXY); - + if (eigensolver.info() != Eigen::Success) { put(vcm, v, std::make_tuple( From 85332fed6d9243a03bcb93edf8a08fc05e091799 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 5 Aug 2022 13:58:52 +0200 Subject: [PATCH 0040/1398] according to some of the review comments on the pull --- .../Polygon_mesh_processing/CMakeLists.txt | 9 ++-- ...nterpolated_corrected_curvature_measures.h | 51 +++++++++++-------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index d6f4e273516f..4783d957589a 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Polygon_mesh_processing_Examples) # CGAL and its components -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED) # Boost and its components find_package(Boost REQUIRED) @@ -102,12 +102,11 @@ create_single_source_cgal_program("orientation_pipeline_example.cpp") #create_single_source_cgal_program( "snapping_example.cpp") create_single_source_cgal_program("match_faces.cpp") create_single_source_cgal_program("cc_compatible_orientations.cpp") -create_single_source_cgal_program("interpolated_corrected_curvatures.cpp") -if(CGAL_Qt5_FOUND) +if(TARGET CGAL::Eigen3_support) - #link it with the required CGAL libraries - target_link_libraries(interpolated_corrected_curvatures PUBLIC CGAL::CGAL_Basic_viewer) + create_single_source_cgal_program("interpolated_corrected_curvatures.cpp") + target_link_libraries(interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 4525628f5645..33cbe05e576d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -17,10 +17,10 @@ #include #include -#include #include #include #include +#include #include #include @@ -83,10 +83,10 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector( - std::vector {u[i], u[i + 1 % n], uc}, - std::vector {x[i], x[i + 1 % n], xc} + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} ); } return mu0; @@ -191,8 +191,8 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve for (std::size_t i = 0; i < n; i++) { mu1 += interpolated_corrected_mean_curvature_measure_face( - std::vector {u[i], u[i + 1 % n], uc}, - std::vector {x[i], x[i + 1 % n], xc} + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} ); } return mu1; @@ -236,10 +236,10 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 return (1.0 / 36.0) * ( - (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(x[1] - x[0], x[3] - x[0]) - + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(x[1] - x[0], x[2] - x[1]) - + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(x[2] - x[3], x[3] - x[0]) - + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(x[2] - x[3], x[2] - x[1]) + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) ); } // N-gon: split into n triangles by polygon center and use triangle formula for each @@ -256,7 +256,7 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std for (std::size_t i = 0; i < n; i++) { mu2 += interpolated_corrected_gaussian_curvature_measure_face( - std::vector {u[i], u[i + 1 % n], uc} + std::vector {u[i], u[(i + 1) % n], uc} ); } return mu2; @@ -377,8 +377,8 @@ std::array interpolated_corrected_anisotropic_measure_fa { std::array muXY_curr_triangle = interpolated_corrected_anisotropic_measure_face( - std::vector {u[i], u[i + 1 % n], uc}, - std::vector {x[i], x[i + 1 % n], xc} + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} ); for (std::size_t ix = 0; ix < 3; ix++) @@ -486,10 +486,11 @@ template x; + std::vector u; + for (face_descriptor f : faces(pmesh)) { - std::vector x; - std::vector u; for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { @@ -499,6 +500,8 @@ template::value) compute_vertex_normals(pmesh, vnm, np); + std::vector x; + std::vector u; + for (face_descriptor f : faces(pmesh)) { - std::vector x; - std::vector u; for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { @@ -590,6 +594,9 @@ template(u, x)); + x.clear(); + u.clear(); + } } @@ -634,8 +641,8 @@ typename GT::FT face_in_ball_ratio_2(const std::vector& x for (const typename GT::Vector_3 xi : x) { const typename GT::FT d_sq = (xi - c).squared_length(); - d_max = std::max(d_sq, d_max); - d_min = std::min(d_sq, d_min); + d_max = (std::max)(d_sq, d_max); + d_min = (std::min)(d_sq, d_min); } if (d_max <= r * r) return 1.0; From 7473a3e2dc702b1529e40f4931b95faa81430591 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 8 Aug 2022 05:05:28 +0200 Subject: [PATCH 0041/1398] Optimizing the expanding functions to compute intersections only once per curvature --- ...nterpolated_corrected_curvature_measures.h | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 33cbe05e576d..289878b9a9bf 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -657,8 +657,10 @@ typename GT::FT face_in_ball_ratio_2(const std::vector& x template void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, - FaceMeasureMap fmm, - VertexCurvatureMap vcm, + FaceMeasureMap area_fmm, + FaceMeasureMap curvature_fmm, + VertexCurvatureMap area_vcm, + VertexCurvatureMap curvature_vcm, const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { @@ -684,6 +686,7 @@ template::null_face()) @@ -720,15 +724,18 @@ template void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, - FaceMeasureMap fmm, - VertexCurvatureMap vcm, + AreaFaceMeasureMap area_fmm, + AnisotropicFaceMeasureMap aniso_fmm, + AreaVertexCurvatureMap area_vcm, + AnisotropicVertexCurvatureMap aniso_vcm, const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { @@ -754,6 +761,7 @@ template corrected_muXY = Eigen::Matrix::Zero(); for (face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { @@ -779,7 +787,9 @@ template muXY_face = get(fmm, fi); + corrected_mu0 += f_ratio * get(area_fmm, fi); + + std::array muXY_face = get(aniso_fmm, fi); for (std::size_t ix = 0; ix < 3; ix++) for (std::size_t iy = 0; iy < 3; iy++) @@ -795,8 +805,8 @@ template v_muXY = get(muXY_expand_map, v); From 36d0fd4e5b3c5d5bfaed59ef3f9f8528aed486f1 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 8 Aug 2022 05:41:34 +0200 Subject: [PATCH 0042/1398] using internal property (SurfMesh) in example --- .../interpolated_corrected_curvatures.cpp | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index b804ae061cf4..c8b972aca658 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -9,24 +9,12 @@ #include #include - namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; typedef CGAL::Surface_mesh Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; -typedef std::unordered_map FaceMeasureMap_tag; -typedef std::unordered_map vertexMeasureMap_tag; -typedef std::unordered_map, - Eigen::Vector - >> -vertexPrincipleCurvatureMap_tag; - - int main(int argc, char* argv[]) { @@ -41,13 +29,31 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } + bool created = false; + + Mesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = g1.add_property_map("v:mean_curvature_map", 0); + assert(created); + + boost::tie(gaussian_curvature_map, created) = g1.add_property_map("v:gaussian_curvature_map", 0); + assert(created); - vertexMeasureMap_tag mean_curvature_init, gaussian_curvature_init; - boost::associative_property_map - mean_curvature_map(mean_curvature_init), gaussian_curvature_map(gaussian_curvature_init); + Mesh::Property_map, + Eigen::Vector + >> principle_curvature_map; - vertexPrincipleCurvatureMap_tag principle_curvature_init; - boost::associative_property_map principle_curvature_map(principle_curvature_init); + boost::tie(principle_curvature_map, created) = g1.add_property_map, + Eigen::Vector + >>("v:principle_curvature_map", { 0, 0, + Eigen::Vector::Zero(), + Eigen::Vector::Zero() }); + assert(created); PMP::interpolated_corrected_mean_curvature( g1, @@ -64,9 +70,9 @@ int main(int argc, char* argv[]) for (vertex_descriptor v : vertices(g1)) { - auto PC = get(principle_curvature_map, v); - std::cout << v.idx() << ": HC = " << get(mean_curvature_map, v) - << ", GC = " << get(gaussian_curvature_map, v) << "\n" + auto PC = principle_curvature_map[v]; + std::cout << v.idx() << ": HC = " << mean_curvature_map[v] + << ", GC = " << gaussian_curvature_map[v] << "\n" << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; } } From a74e05a389dabe01022fcb4d2871bb027996f5fb Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 8 Aug 2022 06:16:05 +0200 Subject: [PATCH 0043/1398] documentation: fixes & improvements --- ...nterpolated_corrected_curvature_measures.h | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 289878b9a9bf..3987f473c145 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -47,15 +47,13 @@ enum Curvature_measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected area measure (mu0) of a specific face. +* computes the interpolated corrected area measure \f$ \mu_0 \f$ of a specific face. * -* @tparam GT is the geometric traits class. +* @tparam GT geometric traits class model of `Kernel`. * * @param x is a vector of the vertex positions of the face. -* @param u is a vector of the vertex nomrals of the face. +* @param u is a vector of the vertex normals of the face. * -* @return a scalar of type `GT::FT`. -* This is the value of the interpolated corrected area measure of the given face. * * @see `interpolated_corrected_mean_curvature_measure_face()` * @see `interpolated_corrected_gaussian_curvature_measure_face()` @@ -119,16 +117,13 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector`. +* @return an array of scalar values for each combination of the standard basis (3x3) * These are the values of the interpolated corrected anisotropic measure of the given face. * * @see `interpolated_corrected_anisotropic_measure_mesh()` @@ -395,7 +387,7 @@ std::array interpolated_corrected_anisotropic_measure_fa * * computes the interpolated corrected curvature measure on each face of the mesh * -* @tparam PolygonMesh a model of `FaceGraph` +* @tparam PolygonMesh a model of `FaceListGraph` * @tparam FaceMeasureMap a a model of `WritablePropertyMap` with * `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -423,8 +415,8 @@ std::array interpolated_corrected_anisotropic_measure_fa * `boost::graph_traits::%vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals should be -* computed inside the function body.} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -511,7 +503,7 @@ template::%face_descriptor` as key type and `std::array` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -537,8 +529,8 @@ template::%vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals should be -* computed inside the function body.} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -956,7 +948,6 @@ template> eigensolver; eigensolver.computeDirect(v_muXY); From 86ac0fcb74f26336d492859b1d650fb28b5251d0 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 8 Aug 2022 07:04:37 +0200 Subject: [PATCH 0044/1398] Documenting Expansion functions --- ...nterpolated_corrected_curvature_measures.h | 158 +++++++++++++++--- 1 file changed, 134 insertions(+), 24 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 3987f473c145..dbe95c28f459 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -47,7 +47,7 @@ enum Curvature_measure_index { /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected area measure \f$ \mu_0 \f$ of a specific face. +* Computes the interpolated corrected area measure \f$ \mu_0 \f$ of a specific face. * * @tparam GT geometric traits class model of `Kernel`. * @@ -117,7 +117,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector interpolated_corrected_anisotropic_measure_fa /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected curvature measure on each face of the mesh +* Computes the interpolated corrected curvature measure on each face of the mesh * * @tparam PolygonMesh a model of `FaceListGraph` -* @tparam FaceMeasureMap a a model of `WritablePropertyMap` with +* @tparam FaceMeasureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * @@ -399,6 +399,7 @@ std::array interpolated_corrected_anisotropic_measure_fa * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin +* * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with @@ -501,10 +502,10 @@ template::%face_descriptor` as key type and `std::array` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * @@ -513,6 +514,7 @@ template -typename GT::FT face_in_ball_ratio_2(const std::vector& x, - const typename GT::FT r, - const typename GT::Vector_3 c) +typename GT::FT face_in_ball_ratio(const std::vector& x, + const typename GT::FT r, + const typename GT::Vector_3 c) { std::size_t n = x.size(); @@ -646,13 +662,59 @@ typename GT::FT face_in_ball_ratio_2(const std::vector& x return (r - d_min) / (d_max - d_min); } -template::%face_descriptor` as key type and `GT::FT` as value type. +* @tparam VertexMeasureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. +* @param curvature_fmm (curvature face measure map) the property map storing the already computed curvature measure on each face. +* This curvature measure can be either the Mean Curvature or the Gaussian Curvature. +* @param area_vmm (area vertex measure map) the property map provided to store the expanded area measure on each vertex. +* @param curvature_vmm (curvature vertex measure map) the property map provided to store the expanded curvature measure on each vertex. +* This curvature measure can be either the Mean Curvature or the Gaussian Curvature. +* @param v (vertex) the vertex to expand the area and curvature measure around. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{the radius of the ball around the vertex `v` to expand the area and curvature measure} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`0.01`} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `expand_interpolated_corrected_anisotropic_measure_vertex()` +* @see `face_in_ball_ratio()` +*/ +template void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, FaceMeasureMap area_fmm, FaceMeasureMap curvature_fmm, - VertexCurvatureMap area_vcm, - VertexCurvatureMap curvature_vcm, + VertexMeasureMap area_vmm, + VertexMeasureMap curvature_vmm, const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { @@ -700,7 +762,7 @@ template(x, r, c); + const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); if (f_ratio != 0.0) { @@ -716,18 +778,66 @@ template::%face_descriptor` as key type and `GT::FT` as value type. +* @tparam AnisotropicFaceMeasureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%face_descriptor` as key type and `std::array` as value type. +* @tparam AreaVertexMeasureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam AnisotropicVertexMeasureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and `std::array` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. +* @param aniso_fmm (anisotropic face measure map) the property map storing the already computed anisotropic curvature measure on each face. +* @param area_vmm (area vertex measure map) the property map provided to store the expanded area measure on each vertex. +* @param aniso_vmm (anisotropic vertex measure map) the property map provided to store the expanded anisotropic curvature measure on each vertex. +* @param v (vertex) the vertex to expand the area and anisotropic curvature measure around. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{the radius of the ball around the vertex `v` to expand the area and curvature measure} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`0.01`} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `expand_interpolated_corrected_measure_vertex()` +* @see `face_in_ball_ratio()` +*/ template void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, AreaFaceMeasureMap area_fmm, AnisotropicFaceMeasureMap aniso_fmm, - AreaVertexCurvatureMap area_vcm, - AnisotropicVertexCurvatureMap aniso_vcm, + AreaVertexMeasureMap area_vmm, + AnisotropicVertexMeasureMap aniso_vmm, const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { @@ -775,7 +885,7 @@ template(x, r, c); + const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); if (f_ratio != 0.0) { @@ -797,8 +907,8 @@ template Date: Mon, 8 Aug 2022 07:13:14 +0200 Subject: [PATCH 0045/1398] minor documentation fixes --- .../Polygon_mesh_processing/PackageDescription.txt | 13 ++++++++++--- .../interpolated_corrected_curvature_measures.h | 8 ++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index d0cab92d6a89..5c9e39811d46 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -202,9 +202,16 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. \cgalCRPSection{Corrected Curvature Functions} - `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_mesh()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_face()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_triangle()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_quad()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_anisotropic_measure_mesh()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_area_measure_face()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_measure_face()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_measure_face()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_anisotropic_measure_face()` +- `CGAL::Polygon_mesh_processing::expand_interpolated_corrected_measure_vertex()` +- `CGAL::Polygon_mesh_processing::expand_interpolated_corrected_anisotropic_measure_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` \cgalCRPSection{Normal Computation Functions} - `CGAL::Polygon_mesh_processing::compute_face_normal()` diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index dbe95c28f459..00b17269d6f1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -785,7 +785,7 @@ template Date: Mon, 8 Aug 2022 07:41:02 +0200 Subject: [PATCH 0046/1398] Documenting new functions + minor doc fixes --- ...nterpolated_corrected_curvature_measures.h | 120 +++++++++++++++--- 1 file changed, 103 insertions(+), 17 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 00b17269d6f1..dc7744a402eb 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -35,7 +35,7 @@ namespace Polygon_mesh_processing { /*! * \ingroup PMP_corrected_curvatures_grp * Enumeration type used to specify which measure of a given face - * is computed for the interpolated corrected curvature functions + * is computed for the interpolated corrected curvature functions. */ // enum enum Curvature_measure_index { @@ -385,17 +385,17 @@ std::array interpolated_corrected_anisotropic_measure_fa /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected curvature measure on each face of the mesh +* Computes the interpolated corrected curvature measure on each face of the mesh. * -* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam PolygonMesh a model of `FaceListGraph`. * @tparam FaceMeasureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure +* @param pmesh the polygon mesh. +* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure. * @param mu_i an enum for choosing between computing -* the area measure, the mean curvature measure or the gaussian curvature measure +* the area measure, the mean curvature measure or the gaussian curvature measure. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -504,13 +504,13 @@ template::%face_descriptor` as key type and `std::array` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure +* @param pmesh the polygon mesh. +* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -622,7 +622,7 @@ template& x, * Expands given face area and curvature (mean or gaussian) measures around a vertex `v`. * Expansion is based on the inclusion ratio of each face in a ball of radius `r` around the vertex `v`. * -* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam PolygonMesh a model of `FaceListGraph`. * @tparam FaceMeasureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. * @tparam VertexMeasureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh +* @param pmesh the polygon mesh. * @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. * @param curvature_fmm (curvature face measure map) the property map storing the already computed curvature measure on each face. * This curvature measure can be either the Mean Curvature or the Gaussian Curvature. @@ -797,9 +797,9 @@ template::%vertex_descriptor` as key type and `GT::FT` as value type. * @tparam AnisotropicVertexMeasureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` as key type and `std::array` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh +* @param pmesh the polygon mesh. * @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. * @param aniso_fmm (anisotropic face measure map) the property map storing the already computed anisotropic measure on each face. * @param area_vmm (area vertex measure map) the property map provided to store the expanded area measure on each vertex. @@ -911,6 +911,27 @@ template::%vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". +* +* @param pmesh the polygon mesh. +* @param vcm the vertex property map in which the computed mean curvatures are stored. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". +* +* @see `interpolated_corrected_gaussian_curvature()` +* @see `interpolated_corrected_principal_curvatures()` +* @see `interpolated_corrected_measure_mesh()` +* @see `expand_interpolated_corrected_measure_vertex()` +*/ + template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, @@ -949,6 +970,26 @@ template::%vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". +* +* @param pmesh the polygon mesh. +* @param vcm the vertex property map in which the computed gaussian curvatures are stored. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". +* +* @see `interpolated_corrected_mean_curvature()` +* @see `interpolated_corrected_principal_curvatures()` +* @see `interpolated_corrected_measure_mesh()` +* @see `expand_interpolated_corrected_measure_vertex()` +*/ template void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, @@ -986,6 +1027,51 @@ template::%vertex_descriptor` as key type and +* `std::tuple, Eigen::Vector>` as value type. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". +* +* @param pmesh the polygon mesh. +* @param vcm the vertex property map in which the computed principal curvatures are stored. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `interpolated_corrected_mean_curvature()` +* @see `interpolated_corrected_gaussian_curvatures()` +* @see `interpolated_corrected_anisotropic_measure_mesh()` +* @see `expand_interpolated_corrected_anisotropic_measure_vertex()` +*/ template void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, From 5840eaf9556370c1c4cdc0cb2b76fc1d81380876 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 9 Aug 2022 17:10:15 +0200 Subject: [PATCH 0047/1398] Update interpolated_corrected_curvature_measures.h --- .../Curvatures/interpolated_corrected_curvature_measures.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index dc7744a402eb..f16413159cab 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -1068,7 +1068,7 @@ template Date: Sat, 27 Aug 2022 18:01:59 +0200 Subject: [PATCH 0048/1398] fixing eigen vector definitions so that it works with other compilers --- .../interpolated_corrected_curvature_measures.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index f16413159cab..6ddfe5feb1a0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -1138,7 +1138,7 @@ template v_muXY = get(muXY_expand_map, v); typename GT::Vector_3 u_GT = get(vnm, v); - Eigen::Vector u(u_GT.x(), u_GT.y(), u_GT.z()); + Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); const typename GT::FT K = 1000 * v_mu0; @@ -1153,12 +1153,12 @@ template(.0,.0,.0), - Eigen::Vector(.0, .0, .0))); + Eigen::Matrix(.0,.0,.0), + Eigen::Matrix(.0, .0, .0))); continue; } - Eigen::Vector eig_vals = eigensolver.eigenvalues(); + Eigen::Matrix eig_vals = eigensolver.eigenvalues(); Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); put(vcm, v, std::make_tuple( From 48262af4247eb8060e3bda3ccfcec6164512007b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 27 Aug 2022 19:46:33 +0200 Subject: [PATCH 0049/1398] fixing eigenvector definitions --- .../interpolated_corrected_curvatures.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index c8b972aca658..3a36aaac5c88 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -41,18 +41,18 @@ int main(int argc, char* argv[]) Mesh::Property_map, - Eigen::Vector + Eigen::Matrix, + Eigen::Matrix >> principle_curvature_map; boost::tie(principle_curvature_map, created) = g1.add_property_map, - Eigen::Vector + Eigen::Matrix, + Eigen::Matrix >>("v:principle_curvature_map", { 0, 0, - Eigen::Vector::Zero(), - Eigen::Vector::Zero() }); + Eigen::Matrix::Zero(), + Eigen::Matrix::Zero() }); assert(created); PMP::interpolated_corrected_mean_curvature( From 13b056c9d404c9eef9b3cdb630777ecb98db5dcf Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 17 Sep 2022 23:53:18 +0200 Subject: [PATCH 0050/1398] minor fixes + handled zero expansion radius --- ...nterpolated_corrected_curvature_measures.h | 72 +++++++++++++++---- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 6ddfe5feb1a0..7cd2c67ab060 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -28,10 +29,31 @@ #include #include +#define EXPANDING_RADIUS_EPSILON 1e-6 + namespace CGAL { namespace Polygon_mesh_processing { +namespace internal { + +template +typename GT::FT average_edge_length(const PolygonMesh& pmesh) +{ + const std::size_t n = edges(pmesh).size(); + if (n == 0) + return 0; + + GT::FT avg_edge_length = 0; + for (auto e : edges(pmesh)) + avg_edge_length += edge_length(e, pmesh); + + avg_edge_length /= n; + return avg_edge_length; +} + +} + /*! * \ingroup PMP_corrected_curvatures_grp * Enumeration type used to specify which measure of a given face @@ -63,7 +85,7 @@ template typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, const std::vector& x = {}) { - std::size_t n = x.size(); + const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); @@ -132,7 +154,7 @@ template typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, const std::vector& x = {}) { - std::size_t n = x.size(); + const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); @@ -212,7 +234,7 @@ template typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, const std::vector& x = {}) { - std::size_t n = u.size(); + const std::size_t n = u.size(); CGAL_precondition(n >= 3); typename GT::Construct_cross_product_vector_3 cross_product; @@ -274,7 +296,7 @@ template std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, const std::vector& x) { - std::size_t n = x.size(); + const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); @@ -636,7 +658,7 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, const typename GT::FT r, const typename GT::Vector_3 c) { - std::size_t n = x.size(); + const std::size_t n = x.size(); // getting center of points typename GT::Vector_3 xm = @@ -726,8 +748,8 @@ template::face_descriptor face_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - const typename GetGeomTraits::type::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.1); + const typename GT::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), @@ -849,8 +871,8 @@ template::face_descriptor face_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - const typename GetGeomTraits::type::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0.01); + const typename GT::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), @@ -938,6 +960,9 @@ template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; @@ -946,6 +971,12 @@ template::vertex_descriptor vertex_descriptor; typedef std::unordered_map VertexMeasureMap_tag; + typename GT::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); + + if (r == 0) + r = internal::average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + FaceMeasureMap_tag mu0_init, mu1_init; boost::associative_property_map mu0_map(mu0_init), mu1_map(mu1_init); @@ -959,7 +990,7 @@ template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; @@ -1004,6 +1038,12 @@ template::vertex_descriptor vertex_descriptor; typedef std::unordered_map VertexMeasureMap_tag; + typename GT::FT + r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); + + if (r == 0) + r = internal::average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + FaceMeasureMap_tag mu0_init, mu2_init; boost::associative_property_map mu0_map(mu0_init), mu2_map(mu2_init); @@ -1017,7 +1057,7 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; + if (is_default_parameter::value) compute_vertex_normals(pmesh, vnm, np); + + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef std::unordered_map FaceScalarMeasureMap_tag; // using std:: array to store FT values on the 9 combinations of the standard 3D basis @@ -1132,7 +1180,7 @@ template v_muXY = get(muXY_expand_map, v); From 4f1a5dd194822e3e763e5c47bd38c1c4151e575c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 20 Sep 2022 04:18:11 +0200 Subject: [PATCH 0051/1398] minor demo updates --- .../Plugins/Display/Display_property_plugin.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 66187583657e..e38211ecea85 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -1496,10 +1496,10 @@ private Q_SLOTS: void displayMapLegend(const std::vector& values) { // Create a legend_ and display it - const std::size_t size = (std::min)(color_map.size(), (std::size_t)256); + const std::size_t size = (std::min)(color_map.size(), (std::size_t)2048); const int text_height = 20; const int height = text_height*static_cast(size) + text_height; - const int width = 140; + const int width = 170; const int cell_width = width/3; const int top_margin = 15; const int left_margin = 5; @@ -1525,8 +1525,8 @@ private Q_SLOTS: tick_height, color); QRect text_rect(left_margin + cell_width+10, drawing_height - top_margin - j, - 50, text_height); - painter.drawText(text_rect, Qt::AlignCenter, tr("%1").arg(values[i], 0, 'f', 3, QLatin1Char(' '))); + 100, text_height); + painter.drawText(text_rect, Qt::AlignCenter, tr("%1").arg(values[i], 0, 'f', 7, QLatin1Char(' '))); } if(color_map.size() > size){ QRect text_rect(left_margin + cell_width+10, 0, @@ -1545,7 +1545,7 @@ private Q_SLOTS: { // Create a legend_ and display it const int height = 256; - const int width = 140; + const int width = 170; const int cell_width = width/3; const int top_margin = 5; const int left_margin = 5; @@ -1589,11 +1589,11 @@ private Q_SLOTS: painter.setPen(Qt::blue); QRect min_text_rect(left_margin + cell_width+10,drawing_height - top_margin, 100, text_height); - painter.drawText(min_text_rect, Qt::AlignCenter, tr("%1").arg(min_value, 0, 'f', 1)); + painter.drawText(min_text_rect, Qt::AlignCenter, tr("%1").arg(min_value, 0, 'f', 7)); QRect max_text_rect(left_margin + cell_width+10, drawing_height - top_margin - 200, 100, text_height); - painter.drawText(max_text_rect, Qt::AlignCenter, tr("%1").arg(max_value, 0, 'f', 1)); + painter.drawText(max_text_rect, Qt::AlignCenter, tr("%1").arg(max_value, 0, 'f', 7)); dock_widget->legendLabel->setPixmap(legend_); } From 3d3b2c30fd2aedd43140d9c6a9b60b87a9340fba Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 20 Sep 2022 11:18:13 +0200 Subject: [PATCH 0052/1398] testing init --- ...nterpolated_corrected_curvature_measures.h | 20 ++- .../Polygon_mesh_processing/CMakeLists.txt | 1 + ...est_interopolated_corrected_curvatures.cpp | 147 ++++++++++++++++++ .../Display/Display_property_plugin.cpp | 34 ++-- .../PMP/Random_perturbation_plugin.cpp | 2 +- 5 files changed, 180 insertions(+), 24 deletions(-) create mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 7cd2c67ab060..aa05f8aebe47 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -483,8 +483,6 @@ template::value) compute_vertex_normals(pmesh, vnm, np); - typedef typename property_map_value::type measure; - std::function &, const std::vector&)> iccm_function; @@ -985,12 +983,12 @@ template mu0_expand_map(mu0_expand_init), mu1_expand_map(mu1_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); - interpolated_corrected_measure_mesh(pmesh, mu1_map, MU1_MEAN_CURVATURE_MEASURE); + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); + interpolated_corrected_measure_mesh(pmesh, mu1_map, MU1_MEAN_CURVATURE_MEASURE, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, CGAL::parameters::ball_radius(r)); + expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); @@ -1052,12 +1050,12 @@ template mu0_expand_map(mu0_expand_init), mu2_expand_map(mu2_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); - interpolated_corrected_measure_mesh(pmesh, mu2_map, MU2_GAUSSIAN_CURVATURE_MEASURE); + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); + interpolated_corrected_measure_mesh(pmesh, mu2_map, MU2_GAUSSIAN_CURVATURE_MEASURE, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, CGAL::parameters::ball_radius(r)); + expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); if(v_mu0 != 0.0) @@ -1175,12 +1173,12 @@ template muXY_expand_map(muXY_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE); - interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map); + interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); + interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, CGAL::parameters::ball_radius(r)); + expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); Eigen::Matrix v_muXY = get(muXY_expand_map, v); diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 909dd292063a..808e6d3a05ef 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -69,6 +69,7 @@ create_single_source_cgal_program("self_intersection_polyhedron_test.cpp") create_single_source_cgal_program("self_intersection_surface_mesh_test.cpp") create_single_source_cgal_program("pmp_do_intersect_test.cpp") create_single_source_cgal_program("test_is_polygon_soup_a_polygon_mesh.cpp") +create_single_source_cgal_program("test_interopolated_corrected_curvatures.cpp") create_single_source_cgal_program("test_stitching.cpp") create_single_source_cgal_program("remeshing_test.cpp") create_single_source_cgal_program("remeshing_with_isolated_constraints_test.cpp" ) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp new file mode 100644 index 000000000000..9c2408139a3f --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; +typedef CGAL::Surface_mesh SMesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::edge_descriptor edge_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + +void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel::FT rel_noise_magnitude) { + SMesh pmesh; + const std::string filename = CGAL::data_file_path(mesh_path); + + if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) + { + std::cerr << "Invalid input file." << std::endl; + } + + bool created = false; + + SMesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); + assert(created); + + boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); + assert(created); + + // getting the max and min edge lengthes + const auto edge_range = CGAL::edges(pmesh); + + const auto edge_length_comparator = [&, pmesh](auto l, auto r) { + return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); + }; + + const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); + + const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); + + + if (rel_noise_magnitude > 0) + { + if (!CGAL::is_triangle_mesh(pmesh)) + return; + + SMesh::Property_map vnm; + boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); + assert(created); + + CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); + + PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + } + else { + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + + } + + + + //PMP::interpolated_corrected_mean_curvature( + // pmesh, + // mean_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + //PMP::interpolated_corrected_gaussian_curvature( + // pmesh, + // gaussian_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + + + const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + + std::cout << "# " << mesh_path << ":\n" + << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" + << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" + << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" + << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; + + +} + +int main() +{ + const std::vector mesh_pathes_to_test = { + "meshes/icc_test/Cube with fillet Quads.obj", + "meshes/icc_test/Lantern Quads.obj", + "meshes/icc_test/Lantern Tris.obj", + "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", + "meshes/icc_test/Sphere Quads + Tris 100352.obj", + "meshes/icc_test/Sphere Quads + Tris.obj", + "meshes/icc_test/Sphere Quads Remesh.obj", + "meshes/icc_test/Sphere Quads.obj", + "meshes/icc_test/Sphere Tris Ico.obj", + "meshes/icc_test/Sphere Tris Oct.obj", + "meshes/icc_test/Sphere Tris Tet.obj" + }; + + const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; + const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; + + for (auto mesh_path : mesh_pathes_to_test) { + for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) + for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) + { + test(mesh_path, rel_expansion_radius, rel_noise_magnitude); + } + + std::cout << "_________________________________________________________________________________\n\n"; + } + +} diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index e38211ecea85..cda67cbd9700 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -807,8 +807,8 @@ private Q_SLOTS: if (edge_range.begin() == edge_range.end()) { - expandRadius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); return; } @@ -824,8 +824,8 @@ private Q_SLOTS: // if edge_reference is not derefrenceble if (edge_reference == edge_range.end()) { - expandRadius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); return; } @@ -838,8 +838,8 @@ private Q_SLOTS: double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; - expandRadius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expandRadius)); + expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); } @@ -849,6 +849,9 @@ private Q_SLOTS: "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); + const auto vnm = smesh.property_map("v:normal_before_perturbation").first; + const bool vnm_exists = smesh.property_map("v:normal_before_perturbation").second; + //compute once and store the value per vertex bool non_init; SMesh::Property_map mu_i_map; @@ -856,11 +859,18 @@ private Q_SLOTS: smesh.add_property_map(tied_string, 0); if (non_init) { - if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expandRadius)); - else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expandRadius)); - + if (vnm_exists) { + if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + else + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + } + else { + if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + else + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + } double res_min = ARBITRARY_DBL_MAX, res_max = -ARBITRARY_DBL_MAX; SMesh::Vertex_index min_index, max_index; @@ -1626,7 +1636,7 @@ private Q_SLOTS: std::unordered_map is_source; - double expandRadius; + double expand_radius; double maxEdgeLength = -1; double minBox; double maxBox; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp index 9afb452ab13c..004768739cd5 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Random_perturbation_plugin.cpp @@ -106,7 +106,7 @@ public Q_SLOTS: if(ui.keep_normal_checkbox->isChecked()) { SMesh::Property_map vnormals = - pmesh.add_property_map("v:normal").first; + pmesh.add_property_map("v:normal_before_perturbation").first; CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh,vnormals); } if(ui.deterministic_checkbox->isChecked()) From c7a6651c6335f7911c8fb04274abc39030af64bb Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 20 Sep 2022 17:19:43 +0200 Subject: [PATCH 0053/1398] GroundTruthtests --- .../test_interopolated_corrected_curvatures.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp index 9c2408139a3f..0caf0149de28 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp @@ -118,17 +118,18 @@ void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel int main() { const std::vector mesh_pathes_to_test = { - "meshes/icc_test/Cube with fillet Quads.obj", - "meshes/icc_test/Lantern Quads.obj", - "meshes/icc_test/Lantern Tris.obj", - "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", - "meshes/icc_test/Sphere Quads + Tris 100352.obj", "meshes/icc_test/Sphere Quads + Tris.obj", - "meshes/icc_test/Sphere Quads Remesh.obj", - "meshes/icc_test/Sphere Quads.obj", + "meshes/icc_test/Sphere Quads + Tris 100352.obj", "meshes/icc_test/Sphere Tris Ico.obj", + "meshes/icc_test/Sphere Tris Tet.obj", "meshes/icc_test/Sphere Tris Oct.obj", - "meshes/icc_test/Sphere Tris Tet.obj" + "meshes/icc_test/Sphere Quads.obj", + "meshes/icc_test/Sphere Quads Remesh.obj", + "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", + "meshes/icc_test/Cube with fillet Quads.obj", + "meshes/cylinder.off", + "meshes/icc_test/Lantern Tris.obj", + "meshes/icc_test/Lantern Quads.obj" }; const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; From 75c7f83c6848a55b4e15f10ca813df2e0d232659 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 20 Sep 2022 17:21:19 +0200 Subject: [PATCH 0054/1398] whitespaces --- .../interpolated_corrected_curvature_measures.h | 2 +- .../test_interopolated_corrected_curvatures.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index aa05f8aebe47..c1c1bcd52877 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -49,7 +49,7 @@ typename GT::FT average_edge_length(const PolygonMesh& pmesh) avg_edge_length += edge_length(e, pmesh); avg_edge_length /= n; - return avg_edge_length; + return avg_edge_length; } } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp index 0caf0149de28..e7b473141562 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp @@ -58,7 +58,7 @@ void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel SMesh::Property_map vnm; boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); assert(created); - + CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); @@ -87,7 +87,7 @@ void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel } - + //PMP::interpolated_corrected_mean_curvature( // pmesh, @@ -106,8 +106,8 @@ void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - std::cout << "# " << mesh_path << ":\n" - << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" + std::cout << "# " << mesh_path << ":\n" + << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; From e0c596d29e8c10724300d40fecbf6015385f6da4 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 25 Sep 2022 22:03:50 +0200 Subject: [PATCH 0055/1398] principal curvatures and directions visualization --- .../interpolated_corrected_curvatures.cpp | 12 +- ...nterpolated_corrected_curvature_measures.h | 59 +++--- .../Polygon_mesh_processing/compute_normal.h | 12 +- .../Polyhedron/Plugins/PMP/CMakeLists.txt | 14 ++ ..._corrected_principal_curvatures_plugin.cpp | 186 ++++++++++++++++++ 5 files changed, 240 insertions(+), 43 deletions(-) create mode 100644 Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp index 3a36aaac5c88..c011d57db41e 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp @@ -41,18 +41,18 @@ int main(int argc, char* argv[]) Mesh::Property_map, - Eigen::Matrix + EpicKernel::Vector_3, + EpicKernel::Vector_3 >> principle_curvature_map; boost::tie(principle_curvature_map, created) = g1.add_property_map, - Eigen::Matrix + EpicKernel::Vector_3, + EpicKernel::Vector_3 >>("v:principle_curvature_map", { 0, 0, - Eigen::Matrix::Zero(), - Eigen::Matrix::Zero() }); + EpicKernel::Vector_3 (0,0,0), + EpicKernel::Vector_3 (0,0,0)}); assert(created); PMP::interpolated_corrected_mean_curvature( diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index c1c1bcd52877..e2e1292aedb4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -754,8 +754,8 @@ template bfs_q; - std::unordered_set bfs_v; + std::queue bfs_queue; + std::unordered_set bfs_visited; typename GT::Point_3 vp = get(vpm, v); typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); @@ -766,13 +766,13 @@ template::null_face()) { - bfs_q.push(f); - bfs_v.insert(f); + bfs_queue.push(f); + bfs_visited.insert(f); } } - while (!bfs_q.empty()) { - face_descriptor fi = bfs_q.front(); - bfs_q.pop(); + while (!bfs_queue.empty()) { + face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); // looping over vertices in face to get point coordinates std::vector x; @@ -790,10 +790,10 @@ template::null_face()) + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) { - bfs_q.push(fj); - bfs_v.insert(fj); + bfs_queue.push(fj); + bfs_visited.insert(fj); } } } @@ -877,8 +877,8 @@ template bfs_q; - std::unordered_set bfs_v; + std::queue bfs_queue; + std::unordered_set bfs_visited; typename GT::Point_3 vp = get(vpm, v); typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); @@ -889,13 +889,13 @@ template::null_face()) { - bfs_q.push(f); - bfs_v.insert(f); + bfs_queue.push(f); + bfs_visited.insert(f); } } - while (!bfs_q.empty()) { - face_descriptor fi = bfs_q.front(); - bfs_q.pop(); + while (!bfs_queue.empty()) { + face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); // looping over vertices in face to get point coordinates std::vector x; @@ -915,14 +915,14 @@ template::null_face()) + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) { - bfs_q.push(fj); - bfs_v.insert(fj); + bfs_queue.push(fj); + bfs_visited.insert(fj); } } } @@ -990,7 +990,6 @@ template v_muXY = get(muXY_expand_map, v); + typename GT::Vector_3 u_GT = get(vnm, v); Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); @@ -1199,19 +1199,22 @@ template(.0,.0,.0), - Eigen::Matrix(.0, .0, .0))); + typename GT::Vector_3(0, 0, 0), + typename GT::Vector_3(0, 0, 0))); continue; } - Eigen::Matrix eig_vals = eigensolver.eigenvalues(); - Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); + const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); + const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); + + const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); + const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); put(vcm, v, std::make_tuple( (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, - eig_vecs.col(1), - eig_vecs.col(0))); + min_eig_vec, + max_eig_vec)); } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h index 2cd837e7bf84..8dfb16af1bdd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h @@ -717,15 +717,9 @@ compute_vertex_normal(typename boost::graph_traits::vertex_descript } #endif - Vector_3 normal = internal::compute_vertex_normal_most_visible_min_circle(v, face_normals, pmesh, traits); - if(traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) // can't always find a most visible normal - { -#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP - std::cout << "Failed to find most visible normal, use weighted sum of normals" << std::endl; -#endif - normal = internal::compute_vertex_normal_as_sum_of_weighted_normals( - v, internal::SIN_WEIGHT, face_normals, vpmap, pmesh, traits); - } + // Change for debugging (comparing with DGtal) + Vector_3 normal = internal::compute_vertex_normal_as_sum_of_weighted_normals( + v, internal::NO_WEIGHT, face_normals, vpmap, pmesh, traits); if(!traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) internal::normalize(normal, traits); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index 53cfdc9b825a..7d2177b03a11 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -13,6 +13,20 @@ else() ) endif() +if(TARGET CGAL::Eigen3_support) + + polyhedron_demo_plugin(interpolated_corrected_principal_curvatures_plugin Interpolated_corrected_principal_curvatures_plugin) + target_link_libraries( + interpolated_corrected_principal_curvatures_plugin PUBLIC scene_surface_mesh_item scene_polylines_item + CGAL::Eigen3_support) + +else() + message( + STATUS + "NOTICE: Eigen 3.1 (or greater) was not found. Interpolated corrected principal curvatures plugin will not be available." + ) +endif() + polyhedron_demo_plugin(extrude_plugin Extrude_plugin KEYWORDS PMP) target_link_libraries(extrude_plugin PUBLIC scene_surface_mesh_item scene_selection_item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp new file mode 100644 index 000000000000..69c2b4fe2dd3 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -0,0 +1,186 @@ +#include +#include +#include +#include "Scene_surface_mesh_item.h" +#include "Scene_polylines_item.h" + +#include + +#include "Scene.h" +#include +#include + +#include +#include + +using namespace CGAL::Three; +class Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin : + public QObject, + public Polyhedron_demo_plugin_interface +{ + Q_OBJECT + Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) + Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") + +public: + + QList actions() const { + return _actions; + } + void init(QMainWindow* mw, + Scene_interface* scene_interface, + Messages_interface*) + { + scene = scene_interface; + QAction *actionEstimateCurvature = new QAction(tr("Interpolated Corrected Principal Curvatures"), mw); + connect(actionEstimateCurvature, SIGNAL(triggered()), this, SLOT(on_actionEstimateCurvature_triggered())); + _actions <(scene->item(scene->mainSelectionIndex())); + } + +public Q_SLOTS: + void on_actionEstimateCurvature_triggered(); +private : + Scene_interface *scene; + QList _actions; +}; // end Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin + + +void compute(SMesh* sMesh, + Scene_polylines_item* max_curv, + Scene_polylines_item* min_curv, + Scene_polylines_item* max_negative_curv, + Scene_polylines_item* min_negative_curv) +{ + namespace PMP = CGAL::Polygon_mesh_processing; + typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; + typedef EpicKernel::Point_3 Point; + typedef EpicKernel::Point_3 Point; + typedef EpicKernel::Vector_3 Vector; + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef std::tuple< + EpicKernel::FT, + EpicKernel::FT, + Vector, + Vector + > PrincipalCurvatureTuple; + + typename boost::property_map::type vpmap = get(CGAL::vertex_point, *sMesh); + + bool created = false; + SMesh::Property_map principle_curvature_map; + + boost::tie(principle_curvature_map, created) = sMesh->add_property_map + ("v:principle_curvature_map", { 0, 0, + Vector(0,0,0), + Vector(0,0,0)}); + assert(created); + + PMP::interpolated_corrected_principal_curvatures( + *sMesh, + principle_curvature_map + ); + + typename EpicKernel::FT max_curvature_magnitude_on_mesh = 0; + for (vertex_descriptor v : vertices(*sMesh)) + { + const PrincipalCurvatureTuple pc = principle_curvature_map[v]; + max_curvature_magnitude_on_mesh = max(max_curvature_magnitude_on_mesh, max(abs(get<0>(pc)), get<1>(pc))); + } + + for(vertex_descriptor v : vertices(*sMesh)) + { + std::vector points; + + // pick central point + const Point& central_point = get(vpmap,v); + points.push_back(central_point); + + // compute min edge len around central vertex + // to scale the ribbons used to display the directions + + typedef EPICK::FT FT; + + const std::size_t n = CGAL::edges(*sMesh).size(); + + EpicKernel::FT avg_edge_length = 0; + if (n > 0) { + for (auto e : CGAL::edges(*sMesh)) + avg_edge_length += PMP::edge_length(e, *sMesh); + avg_edge_length /= n; + } + + const PrincipalCurvatureTuple pc = principle_curvature_map[v]; + + Vector umin = (std::get<0>(pc)/ max_curvature_magnitude_on_mesh) * std::get<2>(pc) * avg_edge_length; + Vector umax = (std::get<1>(pc)/ max_curvature_magnitude_on_mesh) * std::get<3>(pc) * avg_edge_length; + + Scene_polylines_item::Polyline max_segment(2), min_segment(2); + + const double du = 0.4; + + min_segment[0] = central_point + du * umin; + min_segment[1] = central_point - du * umin; + max_segment[0] = central_point + du * umax; + max_segment[1] = central_point - du * umax; + + (std::get<0>(pc) > 0 ? min_curv : min_negative_curv)->polylines.push_back(min_segment); + (std::get<1>(pc) > 0 ? max_curv : max_negative_curv)->polylines.push_back(max_segment); + } +} + +void Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin::on_actionEstimateCurvature_triggered() +{ + // get active polyhedron + const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); + QString name = scene->item(index)->name(); + Scene_surface_mesh_item* sm_item = + qobject_cast(scene->item(index)); + if(! sm_item){ + return; + } + // wait cursor + QApplication::setOverrideCursor(Qt::WaitCursor); + + // types + Scene_polylines_item* max_curv = new Scene_polylines_item; + max_curv->setColor(Qt::red); + max_curv->setWidth(3); + max_curv->setName(tr("%1 (max curvatures)").arg(name)); + + Scene_polylines_item* min_curv = new Scene_polylines_item; + min_curv->setColor(QColor(255,210,0)); + min_curv->setWidth(4); + min_curv->setName(tr("%1 (min curvatures)").arg(name)); + + Scene_polylines_item* max_negative_curv = new Scene_polylines_item; + max_negative_curv->setColor(Qt::cyan); + max_negative_curv->setWidth(4); + max_negative_curv->setName(tr("%1 (min negative curvatures)").arg(name)); + + Scene_polylines_item* min_negative_curv = new Scene_polylines_item; + min_negative_curv->setColor(Qt::blue); + min_negative_curv->setWidth(3); + min_negative_curv->setName(tr("%1 (max negative curvatures)").arg(name)); + + SMesh* pMesh = sm_item->polyhedron(); + compute(pMesh, max_curv, min_curv, max_negative_curv, min_negative_curv); + + scene->addItem(max_curv); + scene->addItem(min_curv); + max_curv->invalidateOpenGLBuffers(); + min_curv->invalidateOpenGLBuffers(); + scene->addItem(max_negative_curv); + scene->addItem(min_negative_curv); + max_negative_curv->invalidateOpenGLBuffers(); + min_negative_curv->invalidateOpenGLBuffers(); + + // default cursor + QApplication::restoreOverrideCursor(); +} + +#include "Interpolated_corrected_principal_curvatures_plugin.moc" From 419745088537cfc6425758ae527048132fde193a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 26 Sep 2022 02:33:04 +0200 Subject: [PATCH 0056/1398] restored compute_normal.h --- .../CGAL/Polygon_mesh_processing/compute_normal.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h index 8dfb16af1bdd..2cd837e7bf84 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h @@ -717,9 +717,15 @@ compute_vertex_normal(typename boost::graph_traits::vertex_descript } #endif - // Change for debugging (comparing with DGtal) - Vector_3 normal = internal::compute_vertex_normal_as_sum_of_weighted_normals( - v, internal::NO_WEIGHT, face_normals, vpmap, pmesh, traits); + Vector_3 normal = internal::compute_vertex_normal_most_visible_min_circle(v, face_normals, pmesh, traits); + if(traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) // can't always find a most visible normal + { +#ifdef CGAL_PMP_COMPUTE_NORMAL_DEBUG_PP + std::cout << "Failed to find most visible normal, use weighted sum of normals" << std::endl; +#endif + normal = internal::compute_vertex_normal_as_sum_of_weighted_normals( + v, internal::SIN_WEIGHT, face_normals, vpmap, pmesh, traits); + } if(!traits.equal_3_object()(normal, CGAL::NULL_VECTOR)) internal::normalize(normal, traits); From 7118646bec18cb0d4192daad64d1f52eb16cae97 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 26 Sep 2022 09:19:17 +0200 Subject: [PATCH 0057/1398] typo fix --- .../Interpolated_corrected_principal_curvatures_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 69c2b4fe2dd3..0b729978c7e7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -160,12 +160,12 @@ void Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin::on_acti Scene_polylines_item* max_negative_curv = new Scene_polylines_item; max_negative_curv->setColor(Qt::cyan); max_negative_curv->setWidth(4); - max_negative_curv->setName(tr("%1 (min negative curvatures)").arg(name)); + max_negative_curv->setName(tr("%1 (max negative curvatures)").arg(name)); Scene_polylines_item* min_negative_curv = new Scene_polylines_item; min_negative_curv->setColor(Qt::blue); min_negative_curv->setWidth(3); - min_negative_curv->setName(tr("%1 (max negative curvatures)").arg(name)); + min_negative_curv->setName(tr("%1 (min negative curvatures)").arg(name)); SMesh* pMesh = sm_item->polyhedron(); compute(pMesh, max_curv, min_curv, max_negative_curv, min_negative_curv); From a1e9345a1ece1571b583326a217cb5833822a7b6 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 26 Sep 2022 19:59:36 +0200 Subject: [PATCH 0058/1398] added principal curvatures plugin to test with cmake --- Polyhedron/demo/Polyhedron/cgal_test_with_cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/Polyhedron/demo/Polyhedron/cgal_test_with_cmake b/Polyhedron/demo/Polyhedron/cgal_test_with_cmake index 6fea79491769..59eb5c1d0211 100755 --- a/Polyhedron/demo/Polyhedron/cgal_test_with_cmake +++ b/Polyhedron/demo/Polyhedron/cgal_test_with_cmake @@ -149,6 +149,7 @@ hole_filling_plugin \ hole_filling_sm_plugin \ hole_filling_polyline_plugin \ inside_out_plugin \ +interpolated_corrected_principal_curvatures_plugin\ surface_intersection_plugin \ surface_intersection_sm_plugin \ io_image_plugin \ From 4f76f267d5b3e9dd08529baf06fefdffba256b4f Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 5 Oct 2022 00:38:23 +0200 Subject: [PATCH 0059/1398] mostly docs and examples, moved utils to internal --- .../PackageDescription.txt | 8 - .../Polygon_mesh_processing.txt | 54 ++++ .../doc/Polygon_mesh_processing/examples.txt | 3 +- .../Polygon_mesh_processing/CMakeLists.txt | 6 +- ...rpolated_corrected_curvatures_example.cpp} | 59 ++-- ...orrected_curvatures_polyhedron_example.cpp | 74 +++++ ...nterpolated_corrected_curvature_measures.h | 290 +----------------- 7 files changed, 184 insertions(+), 310 deletions(-) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures.cpp => interpolated_corrected_curvatures_example.cpp} (52%) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 5c9e39811d46..eae47c610011 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -201,14 +201,6 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - \link PMP_locate_grp Random Location Generation \endlink \cgalCRPSection{Corrected Curvature Functions} -- `CGAL::Polygon_mesh_processing::interpolated_corrected_measure_mesh()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_anisotropic_measure_mesh()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_area_measure_face()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_measure_face()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_measure_face()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_anisotropic_measure_face()` -- `CGAL::Polygon_mesh_processing::expand_interpolated_corrected_measure_vertex()` -- `CGAL::Polygon_mesh_processing::expand_interpolated_corrected_anisotropic_measure_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 743d6bc35079..6c684c4419b4 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -876,6 +876,60 @@ not provide storage for the normals. \cgalExample{Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp} +**************************************** +\section PMPICC Computing Curvatures + +This package provides methods to compute curvatures on polygonal meshes based on #PAPER#. +This includes mean curvature, gaussian curvature, principal curvatures and directions. +These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces. +The algorithms used prove to work well in general. Also, on meshes with noise +on vertex positions, they give accurate results, on the condition that the +correct vertex normals are provided. + +The implementation is generic in terms of mesh data structure. It can be used on Surface_mesh, +Polyhedron_3 and other polygonal mesh structures based on the Face Graph Model. + +These computations are performed using : +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` + +\cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on +the ball_radius named parameter which can be set to a value > 0 to get a smoother +distribution of valuesa and "diffuse" the extreme values of curvatures across the mesh. + +\cgalFigureAnchor{icc_diff_radius} +
+ +
+\cgalFigureCaptionBegin{icc_diff_radius} +The mean curvature distrubution on a bear mesh with different values for the expanding ball radius +\cgalFigureCaptionEnd + +Property maps are used to record the computed curvatures as shown in examples. + +\subsection ICCExample Interpolated Corrected Curvature Examples + +Property maps are an API introduced in the boost library that allows to +associate values to keys. In the following examples, for each proberty map, we associate +a curvature value to each vertex. + +\subsubsection ICCExample Interpolated Corrected Curvature on a Surface Mesh. + +The following example illustrates how to +compute the curvatures on vertices +and store them in property maps provided by the class `Surface_mesh`. + +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp} + +\subsubsection NormalsExampleNP Interpolated Corrected Curvature on a Polyhedron + +The following example illustrates how to +compute the curvatures on vertices +and store them in unordered (or ordered) maps as the class `Polyhedron_3` does +not provide storage for the curvatures. + +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp} **************************************** \section PMPSlicer Slicer diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 0317812aa443..0588d1c76e14 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -19,7 +19,8 @@ \example Polygon_mesh_processing/refine_fair_example.cpp \example Polygon_mesh_processing/mesh_slicer_example.cpp \example Polygon_mesh_processing/isotropic_remeshing_example.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp \example Polygon_mesh_processing/delaunay_remeshing_example.cpp \example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp \example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 4783d957589a..ab084384835b 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -105,8 +105,10 @@ create_single_source_cgal_program("cc_compatible_orientations.cpp") if(TARGET CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures.cpp") - target_link_libraries(interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_example.cpp") + target_link_libraries(interpolated_corrected_curvatures_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_polyhedron_example.cpp") + target_link_libraries(interpolated_corrected_curvatures_polyhedron_example PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp similarity index 52% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index c011d57db41e..caaa52eb3af0 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -7,18 +7,17 @@ #include #include -#include namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; -typedef CGAL::Surface_mesh Mesh; -typedef boost::graph_traits::face_descriptor face_descriptor; -typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_Kernel; +typedef CGAL::Surface_mesh Surface_Mesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) { - Mesh g1; + Surface_Mesh g1; const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); @@ -29,36 +28,54 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } + // creating and tying surface mesh property maps for curvatures (with defaults = 0) bool created = false; - - Mesh::Property_map mean_curvature_map, gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = g1.add_property_map("v:mean_curvature_map", 0); + Surface_Mesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = g1.add_property_map("v:mean_curvature_map", 0); assert(created); - boost::tie(gaussian_curvature_map, created) = g1.add_property_map("v:gaussian_curvature_map", 0); + boost::tie(gaussian_curvature_map, created) = g1.add_property_map("v:gaussian_curvature_map", 0); assert(created); - Mesh::Property_map> principle_curvature_map; boost::tie(principle_curvature_map, created) = g1.add_property_map>("v:principle_curvature_map", { 0, 0, - EpicKernel::Vector_3 (0,0,0), - EpicKernel::Vector_3 (0,0,0)}); + Epic_Kernel::Vector_3 (0,0,0), + Epic_Kernel::Vector_3 (0,0,0)}); assert(created); PMP::interpolated_corrected_mean_curvature( g1, mean_curvature_map ); + + // uncomment this to compute a curvature while specifying named parameters + // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) + + /*Surface_Mesh::Property_map vnm; + boost::tie(vnm, created) = g1.add_property_map( + "v:vnm", Epic_Kernel::Vector_3(0, 0, 0) + ); + + assert(created); + + PMP::interpolated_corrected_mean_curvature( + g1, + mean_curvature_map, + CGAL::parameters::ball_radius(0.5).vertex_normal_map(vnm) + );*/ + PMP::interpolated_corrected_gaussian_curvature( g1, gaussian_curvature_map diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp new file mode 100644 index 000000000000..3e56905068f3 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_Kernel; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + +int main(int argc, char* argv[]) +{ + Polyhedron g1; + const std::string filename = (argc>1) ? + argv[1] : + CGAL::data_file_path("meshes/small_bunny.obj"); + + if(!CGAL::IO::read_polygon_mesh(filename, g1)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + + std::unordered_map mean_curvature_map, gaussian_curvature_map; + std::unordered_map> principle_curvature_map; + + PMP::interpolated_corrected_mean_curvature( + g1, + boost::make_assoc_property_map(mean_curvature_map) + ); + + // uncomment this to compute a curvature while specifying named parameters + // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) + + /*std::unordered_map vnm; + + PMP::interpolated_corrected_mean_curvature( + g1, + boost::make_assoc_property_map(mean_curvature_map), + CGAL::parameters::ball_radius(0.5).vertex_normal_map(boost::make_assoc_property_map(vnm)) + );*/ + + PMP::interpolated_corrected_gaussian_curvature( + g1, + boost::make_assoc_property_map(gaussian_curvature_map) + ); + PMP::interpolated_corrected_principal_curvatures( + g1, + boost::make_assoc_property_map(principle_curvature_map) + ); + + int i = 0; + for (vertex_descriptor v : vertices(g1)) + { + auto PC = principle_curvature_map[v]; + std::cout << i << ": HC = " << mean_curvature_map[v] + << ", GC = " << gaussian_curvature_map[v] << "\n" + << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; + i++; + } +} diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index e2e1292aedb4..8f5e1d338edb 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -44,7 +44,7 @@ typename GT::FT average_edge_length(const PolygonMesh& pmesh) if (n == 0) return 0; - GT::FT avg_edge_length = 0; + typename GT::FT avg_edge_length = 0; for (auto e : edges(pmesh)) avg_edge_length += edge_length(e, pmesh); @@ -52,35 +52,12 @@ typename GT::FT average_edge_length(const PolygonMesh& pmesh) return avg_edge_length; } -} - -/*! - * \ingroup PMP_corrected_curvatures_grp - * Enumeration type used to specify which measure of a given face - * is computed for the interpolated corrected curvature functions. - */ -// enum enum Curvature_measure_index { MU0_AREA_MEASURE, ///< corrected area density MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density }; -/** -* \ingroup PMP_corrected_curvatures_grp -* -* Computes the interpolated corrected area measure \f$ \mu_0 \f$ of a specific face. -* -* @tparam GT geometric traits class model of `Kernel`. -* -* @param x is a vector of the vertex positions of the face. -* @param u is a vector of the vertex normals of the face. -* -* -* @see `interpolated_corrected_mean_curvature_measure_face()` -* @see `interpolated_corrected_gaussian_curvature_measure_face()` -* @see `interpolated_corrected_measure_mesh()` -*/ template typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, const std::vector& x = {}) @@ -136,20 +113,6 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, const std::vector& x = {}) @@ -216,20 +179,6 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve } } -/** -* \ingroup PMP_corrected_curvatures_grp -* -* Computes the interpolated corrected gaussian curvature measure \f$ \mu_2 \f$ of a specific face. -* -* @tparam GT geometric traits class model of `Kernel`. -* -* @param x is a vector of the vertex positions of the face. -* @param u is a vector of the vertex nomrals of the face. -* -* @see `interpolated_corrected_mean_curvature_measure_face()` -* @see `interpolated_corrected_area_measure_face()` -* @see `interpolated_corrected_measure_mesh()` -*/ template typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, const std::vector& x = {}) @@ -277,21 +226,6 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std } } -/** -* \ingroup PMP_corrected_curvatures_grp -* -* Computes the interpolated corrected anisotropic measure \f$ \mu_{XY} \f$ of a specific face. -* -* @tparam GT geometric traits class model of `Kernel`. -* -* @param u is a vector of the vertex nomrals of the face. -* @param x is a vector of the vertex positions of the face. -* -* @return an array of scalar values for each combination of the standard basis (3x3) -* These are the values of the interpolated corrected anisotropic measure of the given face. -* -* @see `interpolated_corrected_anisotropic_measure_mesh()` -*/ template std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, const std::vector& x) @@ -403,51 +337,6 @@ std::array interpolated_corrected_anisotropic_measure_fa return muXY; } - -/** -* \ingroup PMP_corrected_curvatures_grp -* -* Computes the interpolated corrected curvature measure on each face of the mesh. -* -* @tparam PolygonMesh a model of `FaceListGraph`. -* @tparam FaceMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure. -* @param mu_i an enum for choosing between computing -* the area measure, the mean curvature measure or the gaussian curvature measure. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_area_measure_face()` -* @see `interpolated_corrected_mean_curvature_measure_face()` -* @see `interpolated_corrected_gaussian_curvature_measure_face()` -*/ template void @@ -518,48 +407,6 @@ template::%face_descriptor` as key type and `std::array` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param fmm (face measure map) the property map used for storing the computed interpolated corrected measure. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_anisotropic_measure_face()` -* @see `interpolated_corrected_measure_mesh()` -*/ template void @@ -636,21 +483,6 @@ template typename GT::FT face_in_ball_ratio(const std::vector& x, const typename GT::FT r, @@ -682,52 +514,6 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, return (r - d_min) / (d_max - d_min); } -/** -* \ingroup PMP_corrected_curvatures_grp -* -* Expands given face area and curvature (mean or gaussian) measures around a vertex `v`. -* Expansion is based on the inclusion ratio of each face in a ball of radius `r` around the vertex `v`. -* -* @tparam PolygonMesh a model of `FaceListGraph`. -* @tparam FaceMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%face_descriptor` as key type and `GT::FT` as value type. -* @tparam VertexMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. -* @param curvature_fmm (curvature face measure map) the property map storing the already computed curvature measure on each face. -* This curvature measure can be either the Mean Curvature or the Gaussian Curvature. -* @param area_vmm (area vertex measure map) the property map provided to store the expanded area measure on each vertex. -* @param curvature_vmm (curvature vertex measure map) the property map provided to store the expanded curvature measure on each vertex. -* This curvature measure can be either the Mean Curvature or the Gaussian Curvature. -* @param v (vertex) the vertex to expand the area and curvature measure around. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{the radius of the ball around the vertex `v` to expand the area and curvature measure} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`0.01`} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `expand_interpolated_corrected_anisotropic_measure_vertex()` -* @see `face_in_ball_ratio()` -*/ template void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, @@ -802,54 +588,6 @@ template::%face_descriptor` as key type and `GT::FT` as value type. -* @tparam AnisotropicFaceMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%face_descriptor` as key type and `std::array` as value type. -* @tparam AreaVertexMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. -* @tparam AnisotropicVertexMeasureMap a model of `WritablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` as key type and `std::array` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param area_fmm (area face measure map) the property map storing the already computed area measure on each face. -* @param aniso_fmm (anisotropic face measure map) the property map storing the already computed anisotropic measure on each face. -* @param area_vmm (area vertex measure map) the property map provided to store the expanded area measure on each vertex. -* @param aniso_vmm (anisotropic vertex measure map) the property map provided to store the expanded anisotropic measure on each vertex. -* @param v (vertex) the vertex to expand the area and anisotropic measure around. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{the radius of the ball around the vertex `v` to expand the area and curvature measure} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`0.01`} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `expand_interpolated_corrected_measure_vertex()` -* @see `face_in_ball_ratio()` -*/ template @@ -931,6 +669,8 @@ template mu0_expand_map(mu0_expand_init), mu1_expand_map(mu1_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); - interpolated_corrected_measure_mesh(pmesh, mu1_map, MU1_MEAN_CURVATURE_MEASURE, np); + internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); + internal::interpolated_corrected_measure_mesh(pmesh, mu1_map, internal::MU1_MEAN_CURVATURE_MEASURE, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, np.ball_radius(r)); + internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); if (v_mu0 != 0.0) @@ -1015,8 +753,6 @@ template @@ -1049,12 +785,12 @@ template mu0_expand_map(mu0_expand_init), mu2_expand_map(mu2_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); - interpolated_corrected_measure_mesh(pmesh, mu2_map, MU2_GAUSSIAN_CURVATURE_MEASURE, np); + internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); + internal::interpolated_corrected_measure_mesh(pmesh, mu2_map, internal::MU2_GAUSSIAN_CURVATURE_MEASURE, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, np.ball_radius(r)); + internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); if(v_mu0 != 0.0) @@ -1106,8 +842,6 @@ template @@ -1172,12 +906,12 @@ template muXY_expand_map(muXY_expand_init); - interpolated_corrected_measure_mesh(pmesh, mu0_map, MU0_AREA_MEASURE, np); - interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); + internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); + internal::interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); for (vertex_descriptor v : vertices(pmesh)) { - expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, np.ball_radius(r)); + internal::expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, np.ball_radius(r)); typename GT::FT v_mu0 = get(mu0_expand_map, v); Eigen::Matrix v_muXY = get(muXY_expand_map, v); From bb6d3e4f07b372972e942f4198a1666289ac3916 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 5 Oct 2022 10:30:27 +0200 Subject: [PATCH 0060/1398] doc fix --- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 6c684c4419b4..8f222497a527 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -914,7 +914,7 @@ Property maps are an API introduced in the boost library that allows to associate values to keys. In the following examples, for each proberty map, we associate a curvature value to each vertex. -\subsubsection ICCExample Interpolated Corrected Curvature on a Surface Mesh. +\subsubsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh. The following example illustrates how to compute the curvatures on vertices @@ -922,7 +922,7 @@ and store them in property maps provided by the class `Surface_mesh`. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp} -\subsubsection NormalsExampleNP Interpolated Corrected Curvature on a Polyhedron +\subsubsection ICCExamplePH Interpolated Corrected Curvature on a Polyhedron The following example illustrates how to compute the curvatures on vertices From e80a4c8cc57e375356090e07da3a7ff4c5d452a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 5 Oct 2022 10:32:45 +0200 Subject: [PATCH 0061/1398] change ref --- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 6c684c4419b4..6bb9140939c2 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -914,7 +914,7 @@ Property maps are an API introduced in the boost library that allows to associate values to keys. In the following examples, for each proberty map, we associate a curvature value to each vertex. -\subsubsection ICCExample Interpolated Corrected Curvature on a Surface Mesh. +\subsubsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh. The following example illustrates how to compute the curvatures on vertices From 2cb8906639e3aea577bd9c98dcd5005b78c44004 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 7 Oct 2022 21:36:30 +0200 Subject: [PATCH 0062/1398] principle -> principal typo fixed --- .../interpolated_corrected_curvatures_example.cpp | 12 ++++++------ ...lated_corrected_curvatures_polyhedron_example.cpp | 8 ++++---- ...polated_corrected_principal_curvatures_plugin.cpp | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index caaa52eb3af0..78307b952e4f 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -43,14 +43,14 @@ int main(int argc, char* argv[]) Epic_Kernel::FT, Epic_Kernel::Vector_3, Epic_Kernel::Vector_3 - >> principle_curvature_map; + >> principal_curvature_map; - boost::tie(principle_curvature_map, created) = g1.add_property_map>("v:principle_curvature_map", { 0, 0, + >>("v:principal_curvature_map", { 0, 0, Epic_Kernel::Vector_3 (0,0,0), Epic_Kernel::Vector_3 (0,0,0)}); assert(created); @@ -62,7 +62,7 @@ int main(int argc, char* argv[]) // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) - + /*Surface_Mesh::Property_map vnm; boost::tie(vnm, created) = g1.add_property_map( "v:vnm", Epic_Kernel::Vector_3(0, 0, 0) @@ -82,12 +82,12 @@ int main(int argc, char* argv[]) ); PMP::interpolated_corrected_principal_curvatures( g1, - principle_curvature_map + principal_curvature_map ); for (vertex_descriptor v : vertices(g1)) { - auto PC = principle_curvature_map[v]; + auto PC = principal_curvature_map[v]; std::cout << v.idx() << ": HC = " << mean_curvature_map[v] << ", GC = " << gaussian_curvature_map[v] << "\n" << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 3e56905068f3..43aff72dec2b 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -35,7 +35,7 @@ int main(int argc, char* argv[]) Epic_Kernel::FT, Epic_Kernel::Vector_3, Epic_Kernel::Vector_3 - >> principle_curvature_map; + >> principal_curvature_map; PMP::interpolated_corrected_mean_curvature( g1, @@ -44,7 +44,7 @@ int main(int argc, char* argv[]) // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) - + /*std::unordered_map vnm; PMP::interpolated_corrected_mean_curvature( @@ -59,13 +59,13 @@ int main(int argc, char* argv[]) ); PMP::interpolated_corrected_principal_curvatures( g1, - boost::make_assoc_property_map(principle_curvature_map) + boost::make_assoc_property_map(principal_curvature_map) ); int i = 0; for (vertex_descriptor v : vertices(g1)) { - auto PC = principle_curvature_map[v]; + auto PC = principal_curvature_map[v]; std::cout << i << ": HC = " << mean_curvature_map[v] << ", GC = " << gaussian_curvature_map[v] << "\n" << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 0b729978c7e7..59e6438b6763 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -72,23 +72,23 @@ void compute(SMesh* sMesh, typename boost::property_map::type vpmap = get(CGAL::vertex_point, *sMesh); bool created = false; - SMesh::Property_map principle_curvature_map; + SMesh::Property_map principal_curvature_map; - boost::tie(principle_curvature_map, created) = sMesh->add_property_map - ("v:principle_curvature_map", { 0, 0, + boost::tie(principal_curvature_map, created) = sMesh->add_property_map + ("v:principal_curvature_map", { 0, 0, Vector(0,0,0), Vector(0,0,0)}); assert(created); PMP::interpolated_corrected_principal_curvatures( *sMesh, - principle_curvature_map + principal_curvature_map ); typename EpicKernel::FT max_curvature_magnitude_on_mesh = 0; for (vertex_descriptor v : vertices(*sMesh)) { - const PrincipalCurvatureTuple pc = principle_curvature_map[v]; + const PrincipalCurvatureTuple pc = principal_curvature_map[v]; max_curvature_magnitude_on_mesh = max(max_curvature_magnitude_on_mesh, max(abs(get<0>(pc)), get<1>(pc))); } @@ -114,7 +114,7 @@ void compute(SMesh* sMesh, avg_edge_length /= n; } - const PrincipalCurvatureTuple pc = principle_curvature_map[v]; + const PrincipalCurvatureTuple pc = principal_curvature_map[v]; Vector umin = (std::get<0>(pc)/ max_curvature_magnitude_on_mesh) * std::get<2>(pc) * avg_edge_length; Vector umax = (std::get<1>(pc)/ max_curvature_magnitude_on_mesh) * std::get<3>(pc) * avg_edge_length; From 48fc5aeebd9cb076daf20d42c769bb0fa73f797a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 6 Nov 2022 18:19:39 +0200 Subject: [PATCH 0063/1398] dynamic property maps --- ...nterpolated_corrected_curvature_measures.h | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 8f5e1d338edb..d2765c8aa527 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -702,10 +702,12 @@ template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::property_map>::const_type FaceMeasureMap; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef std::unordered_map VertexMeasureMap_tag; + typedef typename boost::property_map>::const_type VertexMeasureMap; typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -713,13 +715,11 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; - FaceMeasureMap_tag mu0_init, mu1_init; - boost::associative_property_map - mu0_map(mu0_init), mu1_map(mu1_init); + FaceMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + FaceMeasureMap mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); - VertexMeasureMap_tag mu0_expand_init, mu1_expand_init; - boost::associative_property_map - mu0_expand_map(mu0_expand_init), mu1_expand_map(mu1_expand_init); + VertexMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + VertexMeasureMap mu1_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_measure_mesh(pmesh, mu1_map, internal::MU1_MEAN_CURVATURE_MEASURE, np); @@ -766,10 +766,12 @@ template::type GT; typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::unordered_map FaceMeasureMap_tag; + typedef typename boost::property_map>::const_type FaceMeasureMap; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef std::unordered_map VertexMeasureMap_tag; + typedef typename boost::property_map>::const_type VertexMeasureMap; typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -777,13 +779,11 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; - FaceMeasureMap_tag mu0_init, mu2_init; - boost::associative_property_map - mu0_map(mu0_init), mu2_map(mu2_init); + FaceMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + FaceMeasureMap mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); - VertexMeasureMap_tag mu0_expand_init, mu2_expand_init; - boost::associative_property_map - mu0_expand_map(mu0_expand_init), mu2_expand_map(mu2_expand_init); + VertexMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + VertexMeasureMap mu2_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_measure_mesh(pmesh, mu2_map, internal::MU2_GAUSSIAN_CURVATURE_MEASURE, np); From 38c66a61e338950689bf6efcbe6aea42f6b74e8a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 6 Nov 2022 18:23:51 +0200 Subject: [PATCH 0064/1398] typo fixes --- .../interpolated_corrected_curvatures_example.cpp | 2 +- .../Curvatures/interpolated_corrected_curvature_measures.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 78307b952e4f..3916b1ea3e1a 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -37,7 +37,7 @@ int main(int argc, char* argv[]) boost::tie(gaussian_curvature_map, created) = g1.add_property_map("v:gaussian_curvature_map", 0); assert(created); - // we use a tuble of 2 scalar values and 2 vectors for principal curvatures and directions + // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions Surface_Mesh::Property_map Date: Sun, 6 Nov 2022 19:06:19 +0200 Subject: [PATCH 0065/1398] tab to space --- ...est_interopolated_corrected_curvatures.cpp | 238 +++++++++--------- 1 file changed, 119 insertions(+), 119 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp index e7b473141562..7e376c887716 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp @@ -19,130 +19,130 @@ typedef boost::graph_traits::edge_descriptor edge_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel::FT rel_noise_magnitude) { - SMesh pmesh; - const std::string filename = CGAL::data_file_path(mesh_path); - - if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) - { - std::cerr << "Invalid input file." << std::endl; - } - - bool created = false; - - SMesh::Property_map mean_curvature_map, gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); - assert(created); - - boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); - assert(created); - - // getting the max and min edge lengthes - const auto edge_range = CGAL::edges(pmesh); - - const auto edge_length_comparator = [&, pmesh](auto l, auto r) { - return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); - }; - - const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); - - const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); - - - if (rel_noise_magnitude > 0) - { - if (!CGAL::is_triangle_mesh(pmesh)) - return; - - SMesh::Property_map vnm; - boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); - assert(created); - - CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); - - PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - } - else { - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - - } - - - - //PMP::interpolated_corrected_mean_curvature( - // pmesh, - // mean_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - //PMP::interpolated_corrected_gaussian_curvature( - // pmesh, - // gaussian_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - - - const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - - std::cout << "# " << mesh_path << ":\n" - << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" - << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" - << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" - << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; + SMesh pmesh; + const std::string filename = CGAL::data_file_path(mesh_path); + + if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) + { + std::cerr << "Invalid input file." << std::endl; + } + + bool created = false; + + SMesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); + assert(created); + + boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); + assert(created); + + // getting the max and min edge lengthes + const auto edge_range = CGAL::edges(pmesh); + + const auto edge_length_comparator = [&, pmesh](auto l, auto r) { + return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); + }; + + const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); + + const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); + + + if (rel_noise_magnitude > 0) + { + if (!CGAL::is_triangle_mesh(pmesh)) + return; + + SMesh::Property_map vnm; + boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); + assert(created); + + CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); + + PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + } + else { + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + + } + + + + //PMP::interpolated_corrected_mean_curvature( + // pmesh, + // mean_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + //PMP::interpolated_corrected_gaussian_curvature( + // pmesh, + // gaussian_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + + + const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + + std::cout << "# " << mesh_path << ":\n" + << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" + << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" + << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" + << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; } int main() { - const std::vector mesh_pathes_to_test = { - "meshes/icc_test/Sphere Quads + Tris.obj", - "meshes/icc_test/Sphere Quads + Tris 100352.obj", - "meshes/icc_test/Sphere Tris Ico.obj", - "meshes/icc_test/Sphere Tris Tet.obj", - "meshes/icc_test/Sphere Tris Oct.obj", - "meshes/icc_test/Sphere Quads.obj", - "meshes/icc_test/Sphere Quads Remesh.obj", - "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", - "meshes/icc_test/Cube with fillet Quads.obj", - "meshes/cylinder.off", - "meshes/icc_test/Lantern Tris.obj", - "meshes/icc_test/Lantern Quads.obj" - }; - - const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; - const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; - - for (auto mesh_path : mesh_pathes_to_test) { - for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) - for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) - { - test(mesh_path, rel_expansion_radius, rel_noise_magnitude); - } - - std::cout << "_________________________________________________________________________________\n\n"; - } + const std::vector mesh_pathes_to_test = { + "meshes/icc_test/Sphere Quads + Tris.obj", + "meshes/icc_test/Sphere Quads + Tris 100352.obj", + "meshes/icc_test/Sphere Tris Ico.obj", + "meshes/icc_test/Sphere Tris Tet.obj", + "meshes/icc_test/Sphere Tris Oct.obj", + "meshes/icc_test/Sphere Quads.obj", + "meshes/icc_test/Sphere Quads Remesh.obj", + "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", + "meshes/icc_test/Cube with fillet Quads.obj", + "meshes/cylinder.off", + "meshes/icc_test/Lantern Tris.obj", + "meshes/icc_test/Lantern Quads.obj" + }; + + const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; + const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; + + for (auto mesh_path : mesh_pathes_to_test) { + for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) + for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) + { + test(mesh_path, rel_expansion_radius, rel_noise_magnitude); + } + + std::cout << "_________________________________________________________________________________\n\n"; + } } From 4295fd4e07645213ab3ac097cfa60821a2900d7b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 6 Nov 2022 19:49:37 +0200 Subject: [PATCH 0066/1398] enum minor fix --- .../Display/Display_property_plugin.cpp | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index cda67cbd9700..c69b73694980 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -338,7 +338,10 @@ class DisplayPropertyPlugin : typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method_idt; typedef CGAL::dynamic_vertex_property_t Vertex_source_tag; typedef boost::property_map::type Vertex_source_map; - + enum CurvatureType { + MEAN_CURVATURE, + GAUSSIAN_CURVATURE, +}; public: bool applicable(QAction* action) const Q_DECL_OVERRIDE @@ -613,11 +616,11 @@ private Q_SLOTS: sm_item->setRenderingMode(Gouraud); break; case 4: // Interpolated Corrected Mean Curvature - displayInterpolatedCurvatureMeasure(sm_item, PMP::MU1_MEAN_CURVATURE_MEASURE); + displayInterpolatedCurvatureMeasure(sm_item, MEAN_CURVATURE); sm_item->setRenderingMode(Gouraud); break; case 5: // Interpolated Corrected Gaussian Curvature - displayInterpolatedCurvatureMeasure(sm_item, PMP::MU2_GAUSSIAN_CURVATURE_MEASURE); + displayInterpolatedCurvatureMeasure(sm_item, GAUSSIAN_CURVATURE); sm_item->setRenderingMode(Gouraud); break; default: @@ -843,9 +846,11 @@ private Q_SLOTS: } - void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, PMP::Curvature_measure_index mu_index) + void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, CurvatureType mu_index) { - std::string tied_string = (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE)? + if (mu_index != MEAN_CURVATURE && mu_index != GAUSSIAN_CURVATURE) return; + + std::string tied_string = (mu_index == MEAN_CURVATURE)? "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; SMesh& smesh = *item->face_graph(); @@ -860,13 +865,13 @@ private Q_SLOTS: if (non_init) { if (vnm_exists) { - if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) + if (mu_index == MEAN_CURVATURE) PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); else PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); } else { - if (mu_index == PMP::MU1_MEAN_CURVATURE_MEASURE) + if (mu_index == MEAN_CURVATURE) PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); else PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); @@ -887,16 +892,13 @@ private Q_SLOTS: min_index = v; } } - switch (mu_index) - { - case PMP::MU1_MEAN_CURVATURE_MEASURE: + if (mu_index == MEAN_CURVATURE){ mean_curvature_max[item] = std::make_pair(res_max, max_index); mean_curvature_min[item] = std::make_pair(res_min, min_index); - break; - case PMP::MU2_GAUSSIAN_CURVATURE_MEASURE: + } + else { gaussian_curvature_max[item] = std::make_pair(res_max, max_index); gaussian_curvature_min[item] = std::make_pair(res_min, min_index); - break; } connect(item, &Scene_surface_mesh_item::itemChanged, From aeaf881c49c8969ec6b1024fb93e4de8e3306ff6 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 6 Nov 2022 20:35:05 +0200 Subject: [PATCH 0067/1398] minor fix max func --- .../PMP/Interpolated_corrected_principal_curvatures_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 59e6438b6763..21b292b05d0c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -89,7 +89,7 @@ void compute(SMesh* sMesh, for (vertex_descriptor v : vertices(*sMesh)) { const PrincipalCurvatureTuple pc = principal_curvature_map[v]; - max_curvature_magnitude_on_mesh = max(max_curvature_magnitude_on_mesh, max(abs(get<0>(pc)), get<1>(pc))); + max_curvature_magnitude_on_mesh = std::max(max_curvature_magnitude_on_mesh, std::max(abs(get<0>(pc)), get<1>(pc))); } for(vertex_descriptor v : vertices(*sMesh)) From 8efd947d53a12aa751eaec67f2ae4a37a1b862a3 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 7 Nov 2022 10:58:45 +0200 Subject: [PATCH 0068/1398] doc fixes --- ...nterpolated_corrected_curvature_measures.h | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 6426cae12de7..6e659e4e6ec8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -686,6 +686,41 @@ template::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* * @see `interpolated_corrected_gaussian_curvature()` * @see `interpolated_corrected_principal_curvatures()` */ @@ -751,6 +786,41 @@ template::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* * @see `interpolated_corrected_mean_curvature()` * @see `interpolated_corrected_principal_curvatures()` */ @@ -837,6 +907,17 @@ template Date: Mon, 7 Nov 2022 11:00:29 +0200 Subject: [PATCH 0069/1398] trailing white spaces --- ...nterpolated_corrected_curvature_measures.h | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 6e659e4e6ec8..7658f1f4dbb1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -720,7 +720,7 @@ template Date: Tue, 8 Nov 2022 19:19:40 +0200 Subject: [PATCH 0070/1398] dynamic property maps --- ...nterpolated_corrected_curvature_measures.h | 44 +++++++------------ 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 7658f1f4dbb1..8a9949b073c8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -26,7 +26,6 @@ #include #include -#include #include #define EXPANDING_RADIUS_EPSILON 1e-6 @@ -932,6 +931,18 @@ template::type GT; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::property_map>::const_type FaceScalarMeasureMap; + typedef typename boost::property_map>>::const_type FaceArrayMeasureMap; + + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::property_map>::const_type VertexScalarMeasureMap; + typedef typename boost::property_map>>::const_type VertexMatrixMeasureMap; + typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::value) compute_vertex_normals(pmesh, vnm, np); + FaceScalarMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + FaceArrayMeasureMap muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); - - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::unordered_map FaceScalarMeasureMap_tag; - // using std:: array to store FT values on the 9 combinations of the standard 3D basis - typedef std::unordered_map> FaceArrayMeasureMap_tag; - - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef std::unordered_map VertexScalarMeasureMap_tag; - // using Eigen matrix to store & Process FT values on the 9 combinations of the standard 3D basis - typedef std::unordered_map> VertexMatrixMeasureMap_tag; - - - FaceScalarMeasureMap_tag mu0_init; - boost::associative_property_map - mu0_map(mu0_init); - - FaceArrayMeasureMap_tag muXY_init; - boost::associative_property_map - muXY_map(muXY_init); - - VertexScalarMeasureMap_tag mu0_expand_init; - boost::associative_property_map - mu0_expand_map(mu0_expand_init); - - VertexMatrixMeasureMap_tag muXY_expand_init; - boost::associative_property_map - muXY_expand_map(muXY_expand_init); + VertexScalarMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + VertexMatrixMeasureMap muXY_expand_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); From 866287a98ee0aa02e213873d8c50a1240e109f20 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 8 Nov 2022 20:13:04 +0200 Subject: [PATCH 0071/1398] minor naming conventions fixes --- ...nterpolated_corrected_curvature_measures.h | 140 +++++++++--------- .../internal/parameters_interface.h | 3 + 2 files changed, 73 insertions(+), 70 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 8a9949b073c8..32c8fcdfcd47 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -351,21 +351,21 @@ template::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::type VNM; + Default_vector_map>::type Vertex_normal_map; using parameters::choose_parameter; using parameters::get_parameter; using parameters::is_default_parameter; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); - VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vector_map_tag(), pmesh)); if (is_default_parameter::value) @@ -390,10 +390,10 @@ template x; std::vector u; - for (face_descriptor f : faces(pmesh)) + for (Face_descriptor f : faces(pmesh)) { - for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { typename GT::Point_3 p = get(vpm, v); x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); @@ -420,21 +420,21 @@ template::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::type VNM; + Default_vector_map>::type VertexNormalMap; using parameters::choose_parameter; using parameters::get_parameter; using parameters::is_default_parameter; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); - VNM vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + VertexNormalMap vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vector_map_tag(), pmesh)); if (is_default_parameter::value) @@ -443,10 +443,10 @@ template x; std::vector u; - for (face_descriptor f : faces(pmesh)) + for (Face_descriptor f : faces(pmesh)) { - for (vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { typename GT::Point_3 p = get(vpm, v); x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); @@ -528,8 +528,8 @@ template::type GT; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; const typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -539,8 +539,8 @@ template bfs_queue; - std::unordered_set bfs_visited; + std::queue bfs_queue; + std::unordered_set bfs_visited; typename GT::Point_3 vp = get(vpm, v); typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); @@ -548,7 +548,7 @@ template::null_face()) { bfs_queue.push(f); @@ -556,12 +556,12 @@ template x; - for (vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) { typename GT::Point_3 pi = get(vpm, vi); x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); @@ -573,7 +573,7 @@ template::null_face()) { @@ -603,8 +603,8 @@ template::type GT; - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; const typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -614,8 +614,8 @@ template bfs_queue; - std::unordered_set bfs_visited; + std::queue bfs_queue; + std::unordered_set bfs_visited; typename GT::Point_3 vp = get(vpm, v); typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); @@ -623,7 +623,7 @@ template corrected_muXY = Eigen::Matrix::Zero(); - for (face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f != boost::graph_traits::null_face()) { bfs_queue.push(f); @@ -631,12 +631,12 @@ template x; - for (vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) { typename GT::Point_3 pi = get(vpm, vi); x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); @@ -654,7 +654,7 @@ template::null_face()) { @@ -678,7 +678,7 @@ template::%vertex_descriptor` as key type and `GT::FT` as value type. +* `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. @@ -690,7 +690,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for @@ -700,7 +700,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be @@ -735,13 +735,13 @@ template::type GT; - typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; typedef typename boost::property_map>::const_type FaceMeasureMap; + CGAL::dynamic_face_property_t>::const_type Face_measure_map; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; typedef typename boost::property_map>::const_type VertexMeasureMap; + CGAL::dynamic_vertex_property_t>::const_type Vertex_measure_map; typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -749,16 +749,16 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; - FaceMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - FaceMeasureMap mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); + Face_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + Face_measure_map mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); - VertexMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - VertexMeasureMap mu1_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + Vertex_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + Vertex_measure_map mu1_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_measure_mesh(pmesh, mu1_map, internal::MU1_MEAN_CURVATURE_MEASURE, np); - for (vertex_descriptor v : vertices(pmesh)) + for (Vertex_descriptor v : vertices(pmesh)) { internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, np.ball_radius(r)); @@ -778,7 +778,7 @@ template::%vertex_descriptor` as key type and `GT::FT` as value type. +* `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. @@ -790,7 +790,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for @@ -800,7 +800,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be @@ -834,13 +834,13 @@ template::type GT; - typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; typedef typename boost::property_map>::const_type FaceMeasureMap; + CGAL::dynamic_face_property_t>::const_type Face_measure_map; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; typedef typename boost::property_map>::const_type VertexMeasureMap; + CGAL::dynamic_vertex_property_t>::const_type Vertex_measure_map; typename GT::FT r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); @@ -848,16 +848,16 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; - FaceMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - FaceMeasureMap mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); + Face_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + Face_measure_map mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); - VertexMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - VertexMeasureMap mu2_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + Vertex_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + Vertex_measure_map mu2_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_measure_mesh(pmesh, mu2_map, internal::MU2_GAUSSIAN_CURVATURE_MEASURE, np); - for (vertex_descriptor v : vertices(pmesh)) + for (Vertex_descriptor v : vertices(pmesh)) { internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, np.ball_radius(r)); @@ -877,7 +877,7 @@ template::%vertex_descriptor` as key type and +* `boost::graph_traits::%Vertex_descriptor` as key type and * `std::tuple, Eigen::Vector>` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * @@ -890,7 +890,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for @@ -900,7 +900,7 @@ template::%vertex_descriptor` +* `boost::graph_traits::%Vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be @@ -931,23 +931,23 @@ template::type GT; - typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; typedef typename boost::property_map>::const_type FaceScalarMeasureMap; + CGAL::dynamic_face_property_t>::const_type Face_scalar_measure_map; typedef typename boost::property_map>>::const_type FaceArrayMeasureMap; + CGAL::dynamic_face_property_t>>::const_type Face_array_measure_map; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; typedef typename boost::property_map>::const_type VertexScalarMeasureMap; + CGAL::dynamic_vertex_property_t>::const_type Vertex_scalar_measure_map; typedef typename boost::property_map>>::const_type VertexMatrixMeasureMap; + CGAL::dynamic_vertex_property_t>>::const_type Vertex_matrix_measure_map; typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::type VNM; + Default_vector_map>::type VertexNormalMap; using parameters::choose_parameter; using parameters::get_parameter; @@ -957,7 +957,7 @@ template::value) compute_vertex_normals(pmesh, vnm, np); - FaceScalarMeasureMap mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - FaceArrayMeasureMap muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); + Face_scalar_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + Face_array_measure_map muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); - VertexScalarMeasureMap mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - VertexMatrixMeasureMap muXY_expand_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); + Vertex_scalar_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + Vertex_matrix_measure_map muXY_expand_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); internal::interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); - for (vertex_descriptor v : vertices(pmesh)) + for (Vertex_descriptor v : vertices(pmesh)) { internal::expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, np.ball_radius(r)); 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 9eea7e71e442..03ee822d0bc9 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -87,6 +87,9 @@ CGAL_add_named_parameter(number_of_points_per_edge_t, number_of_points_per_edge, CGAL_add_named_parameter(number_of_points_on_edges_t, number_of_points_on_edges, number_of_points_on_edges) CGAL_add_named_parameter(nb_points_per_area_unit_t, nb_points_per_area_unit, number_of_points_per_area_unit) CGAL_add_named_parameter(nb_points_per_distance_unit_t, nb_points_per_distance_unit, number_of_points_per_distance_unit) +CGAL_add_named_parameter(vertex_mean_curvature_map_t, vertex_mean_curvature_map, vertex_mean_curvature_map) +CGAL_add_named_parameter(vertex_gaussian_curvature_map_t, vertex_gaussian_curvature_map, vertex_gaussian_curvature_map) +CGAL_add_named_parameter(vertex_principal_curvature_map_t, vertex_principal_curvature_map, vertex_principal_curvature_map) CGAL_add_named_parameter(ball_radius_t, ball_radius, ball_radius) CGAL_add_named_parameter(outward_orientation_t, outward_orientation, outward_orientation) CGAL_add_named_parameter(overlap_test_t, overlap_test, do_overlap_test_of_bounded_sides) From aff46b61624328468311bfe3e83172ade9bed7ec Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:32:42 +0200 Subject: [PATCH 0072/1398] incomplete (integrating class for combined curvature computations) --- ...erpolated_corrected_curvatures_example.cpp | 19 +- ...nterpolated_corrected_curvature_measures.h | 1054 ++++++++++------- 2 files changed, 663 insertions(+), 410 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 3916b1ea3e1a..da6e9d2252f0 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -38,19 +38,10 @@ int main(int argc, char* argv[]) assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> principal_curvature_map; - - boost::tie(principal_curvature_map, created) = g1.add_property_map>("v:principal_curvature_map", { 0, 0, + Surface_Mesh::Property_map> principal_curvature_map; + + boost::tie(principal_curvature_map, created) = g1.add_property_map> + ("v:principal_curvature_map", { 0, 0, Epic_Kernel::Vector_3 (0,0,0), Epic_Kernel::Vector_3 (0,0,0)}); assert(created); @@ -90,6 +81,6 @@ int main(int argc, char* argv[]) auto PC = principal_curvature_map[v]; std::cout << v.idx() << ": HC = " << mean_curvature_map[v] << ", GC = " << gaussian_curvature_map[v] << "\n" - << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 32c8fcdfcd47..c4a9154c1aa2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -26,6 +26,7 @@ #include #include +#include #include #define EXPANDING_RADIUS_EPSILON 1e-6 @@ -34,6 +35,32 @@ namespace CGAL { namespace Polygon_mesh_processing { +template +struct Principal_curvature { + typename GT::FT min_curvature; + typename GT::FT max_curvature; + typename GT::Vector_3 min_direction; + typename GT::Vector_3 max_direction; + + Principal_curvature() { + min_curvature = 0; + max_curvature = 0; + min_direction = typename GT::Vector_3(0, 0, 0); + max_direction = typename GT::Vector_3(0, 0, 0); + } + + Principal_curvature( + typename GT::FT min_curvature, + typename GT::FT max_curvature, + typename GT::Vector_3 min_direction, + typename GT::Vector_3 max_direction) { + this->min_curvature = min_curvature; + this->max_curvature = max_curvature; + this->min_direction = min_direction; + this->max_direction = max_direction; + } +}; + namespace internal { template @@ -57,6 +84,16 @@ enum Curvature_measure_index { MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density }; +template +struct Vertex_measures { + typename GT::FT area_measure = 0; + typename GT::FT mean_curvature_measure = 0; + typename GT::FT gaussian_curvature_measure = 0; + std::array anisotropic_measure = { 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }; +}; + template typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, const std::vector& x = {}) @@ -336,130 +373,129 @@ std::array interpolated_corrected_anisotropic_measure_fa return muXY; } -template - void - interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, - FaceMeasureMap fmm, - const Curvature_measure_index mu_i, - const NamedParameters& np = parameters::default_values()) -{ - - typedef typename GetGeomTraits::type GT; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; - - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; - - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - - typename GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - - Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); - - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); - - std::function - &, const std::vector&)> - iccm_function; - switch (mu_i) - { - case MU0_AREA_MEASURE: - iccm_function = &interpolated_corrected_area_measure_face; - break; - case MU1_MEAN_CURVATURE_MEASURE: - iccm_function = &interpolated_corrected_mean_curvature_measure_face; - break; - case MU2_GAUSSIAN_CURVATURE_MEASURE: - iccm_function = &interpolated_corrected_gaussian_curvature_measure_face; - break; - } - - std::vector x; - std::vector u; - - for (Face_descriptor f : faces(pmesh)) - { - - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - typename GT::Point_3 p = get(vpm, v); - x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - - put(fmm, f, iccm_function(u, x)); - x.clear(); - u.clear(); - } -} - -template - void - interpolated_corrected_anisotropic_measure_mesh(const PolygonMesh& pmesh, - FaceMeasureMap fmm, - const NamedParameters& np = parameters::default_values()) -{ - - typedef typename GetGeomTraits::type GT; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type VertexNormalMap; - - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; - - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - - typename GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - - VertexNormalMap vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); - - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); - - std::vector x; - std::vector u; - - for (Face_descriptor f : faces(pmesh)) - { - - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - typename GT::Point_3 p = get(vpm, v); - x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - - put(fmm, f, interpolated_corrected_anisotropic_measure_face(u, x)); - x.clear(); - u.clear(); - - } -} - +//template +// void +// interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, +// FaceMeasureMap fmm, +// const Curvature_measure_index mu_i, +// const NamedParameters& np = parameters::default_values()) +//{ +// +// typedef typename GetGeomTraits::type GT; +// +// typedef dynamic_vertex_property_t Vector_map_tag; +// typedef typename boost::property_map::const_type Default_vector_map; +// typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; +// +// using parameters::choose_parameter; +// using parameters::get_parameter; +// using parameters::is_default_parameter; +// +// typedef typename boost::graph_traits::face_descriptor Face_descriptor; +// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; +// typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; +// +// typename GetVertexPointMap::const_type +// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), +// get_const_property_map(CGAL::vertex_point, pmesh)); +// +// Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), +// get(Vector_map_tag(), pmesh)); +// +// if (is_default_parameter::value) +// compute_vertex_normals(pmesh, vnm, np); +// +// std::function +// &, const std::vector&)> +// iccm_function; +// switch (mu_i) +// { +// case MU0_AREA_MEASURE: +// iccm_function = &interpolated_corrected_area_measure_face; +// break; +// case MU1_MEAN_CURVATURE_MEASURE: +// iccm_function = &interpolated_corrected_mean_curvature_measure_face; +// break; +// case MU2_GAUSSIAN_CURVATURE_MEASURE: +// iccm_function = &interpolated_corrected_gaussian_curvature_measure_face; +// break; +// } +// +// std::vector x; +// std::vector u; +// +// for (Face_descriptor f : faces(pmesh)) +// { +// +// for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) +// { +// typename GT::Point_3 p = get(vpm, v); +// x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); +// u.push_back(get(vnm, v)); +// } +// +// put(fmm, f, iccm_function(u, x)); +// x.clear(); +// u.clear(); +// } +//} +// +//template +// void +// interpolated_corrected_anisotropic_measure_mesh(const PolygonMesh& pmesh, +// FaceMeasureMap fmm, +// const NamedParameters& np = parameters::default_values()) +//{ +// +// typedef typename GetGeomTraits::type GT; +// +// typedef dynamic_vertex_property_t Vector_map_tag; +// typedef typename boost::property_map::const_type Default_vector_map; +// typedef typename internal_np::Lookup_named_param_def::type VertexNormalMap; +// +// using parameters::choose_parameter; +// using parameters::get_parameter; +// using parameters::is_default_parameter; +// +// typedef typename boost::graph_traits::face_descriptor Face_descriptor; +// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; +// typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; +// +// typename GetVertexPointMap::const_type +// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), +// get_const_property_map(CGAL::vertex_point, pmesh)); +// +// VertexNormalMap vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), +// get(Vector_map_tag(), pmesh)); +// +// if (is_default_parameter::value) +// compute_vertex_normals(pmesh, vnm, np); +// +// std::vector x; +// std::vector u; +// +// for (Face_descriptor f : faces(pmesh)) +// { +// +// for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) +// { +// typename GT::Point_3 p = get(vpm, v); +// x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); +// u.push_back(get(vnm, v)); +// } +// +// put(fmm, f, interpolated_corrected_anisotropic_measure_face(u, x)); +// x.clear(); +// u.clear(); +// +// } +//} // //template @@ -513,160 +549,472 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, return (r - d_min) / (d_max - d_min); } -template - void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, - FaceMeasureMap area_fmm, - FaceMeasureMap curvature_fmm, - VertexMeasureMap area_vmm, - VertexMeasureMap curvature_vmm, - const typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) +//template +// void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, +// FaceMeasureMap area_fmm, +// FaceMeasureMap curvature_fmm, +// VertexMeasureMap area_vmm, +// VertexMeasureMap curvature_vmm, +// const typename boost::graph_traits::vertex_descriptor v, +// const NamedParameters& np = parameters::default_values()) +//{ +// using parameters::choose_parameter; +// using parameters::get_parameter; +// +// typedef typename GetGeomTraits::type GT; +// +// typedef typename boost::graph_traits::face_descriptor Face_descriptor; +// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; +// +// const typename GT::FT +// r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); +// +// typename GetVertexPointMap::const_type +// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), +// get_const_property_map(CGAL::vertex_point, pmesh)); +// +// +// std::queue bfs_queue; +// std::unordered_set bfs_visited; +// +// typename GT::Point_3 vp = get(vpm, v); +// typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); +// +// typename GT::FT corrected_mu0 = 0; +// typename GT::FT corrected_mui = 0; +// +// for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { +// if (f != boost::graph_traits::null_face()) +// { +// bfs_queue.push(f); +// bfs_visited.insert(f); +// } +// } +// while (!bfs_queue.empty()) { +// Face_descriptor fi = bfs_queue.front(); +// bfs_queue.pop(); +// +// // looping over vertices in face to get point coordinates +// std::vector x; +// for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) +// { +// typename GT::Point_3 pi = get(vpm, vi); +// x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); +// } +// +// const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); +// +// if (f_ratio != 0.0) +// { +// corrected_mu0 += f_ratio * get(area_fmm, fi); +// corrected_mui += f_ratio * get(curvature_fmm, fi); +// for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) +// { +// if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) +// { +// bfs_queue.push(fj); +// bfs_visited.insert(fj); +// } +// } +// } +// } +// put(area_vmm, v, corrected_mu0); +// put(curvature_vmm, v, corrected_mui); +//} +// +//template +// void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, +// AreaFaceMeasureMap area_fmm, +// AnisotropicFaceMeasureMap aniso_fmm, +// AreaVertexMeasureMap area_vmm, +// AnisotropicVertexMeasureMap aniso_vmm, +// const typename boost::graph_traits::vertex_descriptor v, +// const NamedParameters& np = parameters::default_values()) +//{ +// using parameters::choose_parameter; +// using parameters::get_parameter; +// +// typedef typename GetGeomTraits::type GT; +// +// typedef typename boost::graph_traits::face_descriptor Face_descriptor; +// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; +// +// const typename GT::FT +// r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); +// +// typename GetVertexPointMap::const_type +// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), +// get_const_property_map(CGAL::vertex_point, pmesh)); +// +// +// std::queue bfs_queue; +// std::unordered_set bfs_visited; +// +// typename GT::Point_3 vp = get(vpm, v); +// typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); +// +// typename GT::FT corrected_mu0 = 0; +// Eigen::Matrix corrected_muXY = Eigen::Matrix::Zero(); +// +// for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { +// if (f != boost::graph_traits::null_face()) +// { +// bfs_queue.push(f); +// bfs_visited.insert(f); +// } +// } +// while (!bfs_queue.empty()) { +// Face_descriptor fi = bfs_queue.front(); +// bfs_queue.pop(); +// +// // looping over vertices in face to get point coordinates +// std::vector x; +// for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) +// { +// typename GT::Point_3 pi = get(vpm, vi); +// x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); +// } +// +// const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); +// +// if (f_ratio != 0.0) +// { +// corrected_mu0 += f_ratio * get(area_fmm, fi); +// +// std::array muXY_face = get(aniso_fmm, fi); +// +// for (std::size_t ix = 0; ix < 3; ix++) +// for (std::size_t iy = 0; iy < 3; iy++) +// corrected_muXY(ix, iy) += f_ratio * muXY_face[ix * 3 + iy]; +// +// for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) +// { +// if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) +// { +// bfs_queue.push(fj); +// bfs_visited.insert(fj); +// } +// } +// } +// } +// put(area_vmm, v, corrected_mu0); +// put(aniso_vmm, v, corrected_muXY); +//} + + +template +Principal_curvature principal_curvature_from_anisotropic_measures( + const std::array anisotropic_measure, + const typename GT::FT v_mu0, + const typename GT::Vector_3 u_GT +) { - using parameters::choose_parameter; - using parameters::get_parameter; + Eigen::Matrix v_muXY = Eigen::Matrix::Zero(); + + for (std::size_t ix = 0; ix < 3; ix++) + for (std::size_t iy = 0; iy < 3; iy++) + v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; + + Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); + const typename GT::FT K = 1000 * v_mu0; + v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); + + Eigen::SelfAdjointEigenSolver> eigensolver; + + eigensolver.computeDirect(v_muXY); + + if (eigensolver.info() != Eigen::Success) + return Principal_curvature(); + + const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); + const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); + + const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); + const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); + + return Principal_curvature( + (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, + (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + min_eig_vec, + max_eig_vec + ); +} + +template +class Interpolated_corrected_curvatures_computer +{ typedef typename GetGeomTraits::type GT; + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + + typedef typename GetVertexPointMap::const_type Vertex_position_map; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + + typedef dynamic_vertex_property_t Scalar_map_tag; + typedef typename boost::property_map::const_type Default_scalar_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_scalar_curvature_map; + + typedef dynamic_vertex_property_t> Principal_map_tag; + typedef typename boost::property_map::const_type Default_principal_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvature_map; + + + + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; typedef typename boost::graph_traits::face_descriptor Face_descriptor; typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - const typename GT::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); + typedef typename boost::property_map>::type Face_scalar_measure_map; + typedef typename boost::property_map>>::type Face_anisotropic_measure_map; + +private: + const PolygonMesh& pmesh; + Vertex_position_map vpm; + Vertex_normal_map vnm; + FT ball_radius; + + bool is_mean_curvature_selected; + bool is_gaussian_curvature_selected; + bool is_principal_curvature_selected; + + Vertex_scalar_curvature_map mean_curvature_map, gaussian_curvature_map; + Vertex_principal_curvature_map principal_curvature_map; + + Face_scalar_measure_map mu0_map, mu1_map, mu2_map; + Face_anisotropic_measure_map muXY_map; + + void set_property_maps() { + mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); + muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); + + } + + void set_named_params(const NamedParameters& np = parameters::default_values()) + { + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; - typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); + vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); - std::queue bfs_queue; - std::unordered_set bfs_visited; + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); - typename GT::Point_3 vp = get(vpm, v); - typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); + const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - typename GT::FT corrected_mu0 = 0; - typename GT::FT corrected_mui = 0; + if (is_mean_curvature_selected) + mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), get(CGAL::dynamic_vertex_property_t(), pmesh)); + if (is_gaussian_curvature_selected) + gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), get(CGAL::dynamic_vertex_property_t(), pmesh)); + if (is_principal_curvature_selected) + principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), get(CGAL::dynamic_vertex_property_t>(), pmesh)); - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); - } + set_ball_radius(radius); } - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); - // looping over vertices in face to get point coordinates - std::vector x; - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - typename GT::Point_3 pi = get(vpm, vi); - x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); - } + void set_ball_radius(const FT radius) { + if (radius == 0) + ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + } + +public: + + Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, + bool is_mean_curvature_selected, + bool is_gaussian_curvature_selected, + bool is_principal_curvature_selected, + const NamedParameters& np = parameters::default_values() + ) : + pmesh(pmesh), + is_mean_curvature_selected(is_mean_curvature_selected), + is_gaussian_curvature_selected(is_gaussian_curvature_selected), + is_principal_curvature_selected(is_principal_curvature_selected) + { + if (!is_mean_curvature_selected && !is_gaussian_curvature_selected && !is_principal_curvature_selected) + return; + + set_named_params(); - const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); + set_property_maps(); - if (f_ratio != 0.0) + compute_selected_curvatures(); + + } + + void interpolated_corrected_all_measures_all_faces() + { + std::vector x; + std::vector u; + + for (Face_descriptor f : faces(pmesh)) { - corrected_mu0 += f_ratio * get(area_fmm, fi); - corrected_mui += f_ratio * get(curvature_fmm, fi); - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) - { - bfs_queue.push(fj); - bfs_visited.insert(fj); - } + Point_3 p = get(vpm, v); + x.push_back(Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); } - } - } - put(area_vmm, v, corrected_mu0); - put(curvature_vmm, v, corrected_mui); -} - -template - void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, - AreaFaceMeasureMap area_fmm, - AnisotropicFaceMeasureMap aniso_fmm, - AreaVertexMeasureMap area_vmm, - AnisotropicVertexMeasureMap aniso_vmm, - const typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) -{ - using parameters::choose_parameter; - using parameters::get_parameter; + put(mu0_map, f, interpolated_corrected_area_measure_face(u, x)); - typedef typename GetGeomTraits::type GT; + if (is_mean_curvature_selected) + put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + if (is_gaussian_curvature_selected) + put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u, x)); - const typename GT::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); + if (is_principal_curvature_selected) + put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); - typename GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); + x.clear(); + u.clear(); + } + } + Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) + { + Vertex_measures vertex_curvatures; - std::queue bfs_queue; - std::unordered_set bfs_visited; + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + vertex_curvatures.area_measure += get(mu0_map, f); - typename GT::Point_3 vp = get(vpm, v); - typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += get(mu1_map, f); - typename GT::FT corrected_mu0 = 0; - Eigen::Matrix corrected_muXY = Eigen::Matrix::Zero(); + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += get(mu2_map, f); - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, f); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; + } } + + return vertex_curvatures; } - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); - // looping over vertices in face to get point coordinates - std::vector x; - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - typename GT::Point_3 pi = get(vpm, vi); - x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); - } + Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) + { + std::queue bfs_queue; + std::unordered_set bfs_visited; - const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); - if (f_ratio != 0.0) - { - corrected_mu0 += f_ratio * get(area_fmm, fi); + Vertex_measures vertex_curvatures; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_queue.push(f); + bfs_visited.insert(f); + } + } + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); - std::array muXY_face = get(aniso_fmm, fi); + // looping over vertices in face to get point coordinates + std::vector x; + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + } - for (std::size_t ix = 0; ix < 3; ix++) - for (std::size_t iy = 0; iy < 3; iy++) - corrected_muXY(ix, iy) += f_ratio * muXY_face[ix * 3 + iy]; + const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + if (f_ratio != 0.0) { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) + vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); + + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); + + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); + + if (is_principal_curvature_selected) { - bfs_queue.push(fj); - bfs_visited.insert(fj); + const std::array face_anisotropic_measure = get(muXY_map, fi); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } + + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) + { + bfs_queue.push(fj); + bfs_visited.insert(fj); + } } } } + return vertex_curvatures; + } + + void compute_selected_curvatures() { + interpolated_corrected_all_measures_all_faces(); + + for (Vertex_descriptor v : vertices(pmesh)) + { + Vertex_measures vertex_curvatures = (ball_radius < 0)? + expand_interpolated_corrected_measure_vertex_no_radius(v) : + expand_interpolated_corrected_measure_vertex(v); + + if (is_mean_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : + put(mean_curvature_map, v, 0); + } + + if (is_gaussian_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : + put(gaussian_curvature_map, v, 0); + } + + if (is_principal_curvature_selected) { + const Vector_3 v_normal = get(vnm, v); + const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( + vertex_curvatures.anisotropic_measure, + vertex_curvatures.area_measure, + v_normal + ); + put(principal_curvature_map, v, principal_curvature); + } + } } - put(area_vmm, v, corrected_mu0); - put(aniso_vmm, v, corrected_muXY); -} + + + +}; } // namespace internal @@ -722,6 +1070,7 @@ template::type GT; - - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::property_map>::const_type Face_measure_map; - - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::property_map>::const_type Vertex_measure_map; - - typename GT::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); - - if (r == 0) - r = internal::average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - - Face_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - Face_measure_map mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); - - Vertex_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - Vertex_measure_map mu1_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - - internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); - internal::interpolated_corrected_measure_mesh(pmesh, mu1_map, internal::MU1_MEAN_CURVATURE_MEASURE, np); - - for (Vertex_descriptor v : vertices(pmesh)) - { - internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu1_map, mu0_expand_map, mu1_expand_map, v, np.ball_radius(r)); - - typename GT::FT v_mu0 = get(mu0_expand_map, v); - if (v_mu0 != 0.0) - put(vcm, v, 0.5 * get(mu1_expand_map, v) / v_mu0); - else - put(vcm, v, 0); - } + internal::Interpolated_corrected_curvatures_computer(pmesh, true, false, false, np.vertex_mean_curvature_map(vcm)); } /** @@ -822,6 +1134,7 @@ template @@ -829,44 +1142,7 @@ template::type GT; - - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::property_map>::const_type Face_measure_map; - - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::property_map>::const_type Vertex_measure_map; - - typename GT::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); - - if (r == 0) - r = internal::average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - - Face_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - Face_measure_map mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); - - Vertex_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - Vertex_measure_map mu2_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - - internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); - internal::interpolated_corrected_measure_mesh(pmesh, mu2_map, internal::MU2_GAUSSIAN_CURVATURE_MEASURE, np); - - for (Vertex_descriptor v : vertices(pmesh)) - { - internal::expand_interpolated_corrected_measure_vertex(pmesh, mu0_map, mu2_map, mu0_expand_map, mu2_expand_map, v, np.ball_radius(r)); - - typename GT::FT v_mu0 = get(mu0_expand_map, v); - if(v_mu0 != 0.0) - put(vcm, v, get(mu2_expand_map, v) / v_mu0); - else - put(vcm, v, 0); - } + internal::Interpolated_corrected_curvatures_computer(pmesh, false, true, false, np.vertex_gaussian_curvature_map(vcm)); } /** @@ -922,6 +1198,7 @@ template @@ -929,98 +1206,83 @@ template::type GT; - - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::property_map>::const_type Face_scalar_measure_map; - typedef typename boost::property_map>>::const_type Face_array_measure_map; - - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::property_map>::const_type Vertex_scalar_measure_map; - typedef typename boost::property_map>>::const_type Vertex_matrix_measure_map; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type VertexNormalMap; - - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; - - typename GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - - VertexNormalMap vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); - - typename GT::FT - r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); - - if (r == 0) - r = internal::average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); - - Face_scalar_measure_map mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - Face_array_measure_map muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); - - Vertex_scalar_measure_map mu0_expand_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - Vertex_matrix_measure_map muXY_expand_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); - - internal::interpolated_corrected_measure_mesh(pmesh, mu0_map, internal::MU0_AREA_MEASURE, np); - internal::interpolated_corrected_anisotropic_measure_mesh(pmesh, muXY_map, np); + internal::Interpolated_corrected_curvatures_computer(pmesh, false, false, true, np.vertex_principal_curvature_map(vcm)); +} - for (Vertex_descriptor v : vertices(pmesh)) +// TODO: DOC +/** +* \ingroup PMP_corrected_curvatures_grp +* +* Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. +* By providing mean, gaussian and/or principal curvature property maps, the user +* can choose which curvatures to compute. +* +* @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". +* +* @param pmesh the polygon mesh. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using compute_vertex_normals()} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `interpolated_corrected_mean_curvature()` +* @see `interpolated_corrected_gaussian_curvature()` +* @see `interpolated_corrected_principal_curvatures()` +*/ +template + void interpolated_corrected_curvatures(const PolygonMesh& pmesh, + bool is_mean_curvature_selected, + bool is_gaussian_curvature_selected, + bool is_principal_curvature_selected, + const NamedParameters& np = parameters::default_values()) +{ + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) { - internal::expand_interpolated_corrected_anisotropic_measure_vertex(pmesh, mu0_map, muXY_map, mu0_expand_map, muXY_expand_map, v, np.ball_radius(r)); - - typename GT::FT v_mu0 = get(mu0_expand_map, v); - Eigen::Matrix v_muXY = get(muXY_expand_map, v); - - typename GT::Vector_3 u_GT = get(vnm, v); - - Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); - - const typename GT::FT K = 1000 * v_mu0; - - v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); - - Eigen::SelfAdjointEigenSolver> eigensolver; - - eigensolver.computeDirect(v_muXY); - - if (eigensolver.info() != Eigen::Success) - { - put(vcm, v, std::make_tuple( - 0, - 0, - typename GT::Vector_3(0, 0, 0), - typename GT::Vector_3(0, 0, 0))); - continue; - } - - const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); - const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); - - const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); - const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); - - put(vcm, v, std::make_tuple( - (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, - (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, - min_eig_vec, - max_eig_vec)); + internal::Interpolated_corrected_curvatures_computer( + pmesh, + is_mean_curvature_selected, + is_gaussian_curvature_selected, + is_principal_curvature_selected, + np + ); } } + } // namespace Polygon_mesh_processing } // namespace CGAL From 2dcb2939b9011cb3e6fa0b199d1ac226f996a0e8 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 13 Nov 2022 13:32:38 +0200 Subject: [PATCH 0073/1398] compute multiple curvatures at same time + no radius handled --- ...erpolated_corrected_curvatures_example.cpp | 8 ++ ...nterpolated_corrected_curvature_measures.h | 83 ++++++++----------- 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index da6e9d2252f0..a2fd69fff1a7 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -76,6 +76,14 @@ int main(int argc, char* argv[]) principal_curvature_map ); + PMP::interpolated_corrected_curvatures( + g1, + CGAL::parameters::ball_radius(0) + .vertex_mean_curvature_map(mean_curvature_map) + .vertex_gaussian_curvature_map(gaussian_curvature_map) + .vertex_principal_curvature_map(principal_curvature_map) + ); + for (vertex_descriptor v : vertices(g1)) { auto PC = principal_curvature_map[v]; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index c4a9154c1aa2..b83bf0e70dff 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -753,6 +753,11 @@ class Interpolated_corrected_curvatures_computer typedef typename GT::Point_3 Point_3; typedef typename GT::Vector_3 Vector_3; + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + typedef typename GetVertexPointMap::const_type Vertex_position_map; typedef dynamic_vertex_property_t Vector_map_tag; @@ -761,29 +766,24 @@ class Interpolated_corrected_curvatures_computer NamedParameters, Default_vector_map>::type Vertex_normal_map; - typedef dynamic_vertex_property_t Scalar_map_tag; - typedef typename boost::property_map::const_type Default_scalar_map; + typedef Constant_property_map Default_scalar_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_scalar_curvature_map; + Default_scalar_map>::type Vertex_mean_curvature_map; - typedef dynamic_vertex_property_t> Principal_map_tag; - typedef typename boost::property_map::const_type Default_principal_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_gaussian_curvature_map; + + typedef Constant_property_map> Default_principal_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvature_map; - - - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - typedef typename boost::property_map>::type Face_scalar_measure_map; + CGAL::dynamic_face_property_t>::const_type Face_scalar_measure_map; typedef typename boost::property_map>>::type Face_anisotropic_measure_map; + CGAL::dynamic_face_property_t>>::const_type Face_anisotropic_measure_map; private: const PolygonMesh& pmesh; @@ -795,7 +795,8 @@ class Interpolated_corrected_curvatures_computer bool is_gaussian_curvature_selected; bool is_principal_curvature_selected; - Vertex_scalar_curvature_map mean_curvature_map, gaussian_curvature_map; + Vertex_mean_curvature_map mean_curvature_map; + Vertex_gaussian_curvature_map gaussian_curvature_map; Vertex_principal_curvature_map principal_curvature_map; Face_scalar_measure_map mu0_map, mu1_map, mu2_map; @@ -809,7 +810,7 @@ class Interpolated_corrected_curvatures_computer } - void set_named_params(const NamedParameters& np = parameters::default_values()) + void set_named_params(const NamedParameters& np) { using parameters::choose_parameter; using parameters::get_parameter; @@ -826,12 +827,15 @@ class Interpolated_corrected_curvatures_computer const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - if (is_mean_curvature_selected) - mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), get(CGAL::dynamic_vertex_property_t(), pmesh)); - if (is_gaussian_curvature_selected) - gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), get(CGAL::dynamic_vertex_property_t(), pmesh)); - if (is_principal_curvature_selected) - principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), get(CGAL::dynamic_vertex_property_t>(), pmesh)); + is_mean_curvature_selected = !is_default_parameter::value; + is_gaussian_curvature_selected = !is_default_parameter::value; + is_principal_curvature_selected = !is_default_parameter::value; + + mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); + gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); + principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), Default_principal_map()); + + std::cout << is_mean_curvature_selected << is_gaussian_curvature_selected << is_principal_curvature_selected << std::endl; set_ball_radius(radius); } @@ -839,25 +843,18 @@ class Interpolated_corrected_curvatures_computer void set_ball_radius(const FT radius) { if (radius == 0) ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + ball_radius = radius; } public: Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, - bool is_mean_curvature_selected, - bool is_gaussian_curvature_selected, - bool is_principal_curvature_selected, const NamedParameters& np = parameters::default_values() ) : - pmesh(pmesh), - is_mean_curvature_selected(is_mean_curvature_selected), - is_gaussian_curvature_selected(is_gaussian_curvature_selected), - is_principal_curvature_selected(is_principal_curvature_selected) + pmesh(pmesh) { - if (!is_mean_curvature_selected && !is_gaussian_curvature_selected && !is_principal_curvature_selected) - return; - - set_named_params(); + set_named_params(np); set_property_maps(); @@ -1079,7 +1076,7 @@ template(pmesh, true, false, false, np.vertex_mean_curvature_map(vcm)); + internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_mean_curvature_map(vcm)); } /** @@ -1142,7 +1139,7 @@ template(pmesh, false, true, false, np.vertex_gaussian_curvature_map(vcm)); + internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_gaussian_curvature_map(vcm)); } /** @@ -1206,7 +1203,7 @@ template(pmesh, false, false, true, np.vertex_principal_curvature_map(vcm)); + internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_principal_curvature_map(vcm)); } // TODO: DOC @@ -1265,21 +1262,9 @@ template void interpolated_corrected_curvatures(const PolygonMesh& pmesh, - bool is_mean_curvature_selected, - bool is_gaussian_curvature_selected, - bool is_principal_curvature_selected, const NamedParameters& np = parameters::default_values()) { - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) - { - internal::Interpolated_corrected_curvatures_computer( - pmesh, - is_mean_curvature_selected, - is_gaussian_curvature_selected, - is_principal_curvature_selected, - np - ); - } + internal::Interpolated_corrected_curvatures_computer(pmesh, np); } From dbd18ed101a6e407f05201468bd04c814778f060 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 13 Nov 2022 13:34:18 +0200 Subject: [PATCH 0074/1398] trailing whitespaces --- .../interpolated_corrected_curvature_measures.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index b83bf0e70dff..183f823e8483 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -848,7 +848,7 @@ class Interpolated_corrected_curvatures_computer } public: - + Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values() ) : @@ -911,7 +911,7 @@ class Interpolated_corrected_curvatures_computer vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; } } - + return vertex_curvatures; } @@ -981,8 +981,8 @@ class Interpolated_corrected_curvatures_computer for (Vertex_descriptor v : vertices(pmesh)) { - Vertex_measures vertex_curvatures = (ball_radius < 0)? - expand_interpolated_corrected_measure_vertex_no_radius(v) : + Vertex_measures vertex_curvatures = (ball_radius < 0)? + expand_interpolated_corrected_measure_vertex_no_radius(v) : expand_interpolated_corrected_measure_vertex(v); if (is_mean_curvature_selected) { @@ -1241,7 +1241,7 @@ template Date: Sun, 13 Nov 2022 17:59:01 +0200 Subject: [PATCH 0075/1398] minor fix --- ...nterpolated_corrected_curvature_measures.h | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 183f823e8483..1a0ef9891b00 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -835,8 +835,6 @@ class Interpolated_corrected_curvatures_computer gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), Default_principal_map()); - std::cout << is_mean_curvature_selected << is_gaussian_curvature_selected << is_principal_curvature_selected << std::endl; - set_ball_radius(radius); } @@ -856,12 +854,16 @@ class Interpolated_corrected_curvatures_computer { set_named_params(np); - set_property_maps(); - - compute_selected_curvatures(); + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) + { + set_property_maps(); + compute_selected_curvatures(); + } } +private: + void interpolated_corrected_all_measures_all_faces() { std::vector x; @@ -1073,10 +1075,10 @@ class Interpolated_corrected_curvatures_computer template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap vcm, - const NamedParameters& np = parameters::default_values()) + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_mean_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); } /** @@ -1136,10 +1138,10 @@ template void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap vcm, - const NamedParameters& np = parameters::default_values()) + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_gaussian_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); } /** @@ -1200,10 +1202,10 @@ template void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, - VertexCurvatureMap vcm, - const NamedParameters& np = parameters::default_values()) + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - internal::Interpolated_corrected_curvatures_computer(pmesh, np.vertex_principal_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvature_map(vcm)); } // TODO: DOC From 6ca73315496d290e77c67d5c8c10930801364adc Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 14 Nov 2022 11:26:13 +0200 Subject: [PATCH 0076/1398] fixes, doc, examples, general cleanup --- .../PackageDescription.txt | 2 + .../Polygon_mesh_processing.txt | 19 +- ...erpolated_corrected_curvatures_example.cpp | 68 ++-- ...orrected_curvatures_polyhedron_example.cpp | 61 ++-- ...nterpolated_corrected_curvature_measures.h | 343 +++--------------- 5 files changed, 136 insertions(+), 357 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index eae47c610011..93f25c89f1fb 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -204,6 +204,8 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` +- `CGAL::Polygon_mesh_processing::Principal_curvature` \cgalCRPSection{Normal Computation Functions} - `CGAL::Polygon_mesh_processing::compute_face_normal()` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 8f222497a527..7932051ec000 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -879,7 +879,10 @@ not provide storage for the normals. **************************************** \section PMPICC Computing Curvatures -This package provides methods to compute curvatures on polygonal meshes based on #PAPER#. +This package provides methods to compute curvatures on polygonal meshes based on + + Interpolated corrected curvature measures for polygonal surfaces +. This includes mean curvature, gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces. The algorithms used prove to work well in general. Also, on meshes with noise @@ -893,25 +896,29 @@ These computations are performed using : - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` + +Where it is recommended to use the last function for computing multiple curvatures (example: mean and gaussian) +as the implementation performs the shared computations only once, making it more efficient. \cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on the ball_radius named parameter which can be set to a value > 0 to get a smoother -distribution of valuesa and "diffuse" the extreme values of curvatures across the mesh. +distribution of values and "diffuse" the extreme values of curvatures across the mesh. \cgalFigureAnchor{icc_diff_radius}
\cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature distrubution on a bear mesh with different values for the expanding ball radius +The mean curvature distribution on a bear mesh with different values for the expanding ball radius \cgalFigureCaptionEnd Property maps are used to record the computed curvatures as shown in examples. \subsection ICCExample Interpolated Corrected Curvature Examples -Property maps are an API introduced in the boost library that allows to -associate values to keys. In the following examples, for each proberty map, we associate +Property maps are an API introduced in the boost library that allows associating +values to keys. In the following examples, for each property map, we associate a curvature value to each vertex. \subsubsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh. @@ -926,7 +933,7 @@ and store them in property maps provided by the class `Surface_mesh`. The following example illustrates how to compute the curvatures on vertices -and store them in unordered (or ordered) maps as the class `Polyhedron_3` does +and store them in dynamic property maps as the class `Polyhedron_3` does not provide storage for the curvatures. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp} diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index a2fd69fff1a7..ffb86d94795c 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -10,19 +10,19 @@ namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_Kernel; -typedef CGAL::Surface_mesh Surface_Mesh; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; +typedef CGAL::Surface_mesh Surface_Mesh; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) { - Surface_Mesh g1; + Surface_Mesh smesh; const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); - if(!CGAL::IO::read_polygon_mesh(filename, g1)) + if(!CGAL::IO::read_polygon_mesh(filename, smesh)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; @@ -30,65 +30,67 @@ int main(int argc, char* argv[]) // creating and tying surface mesh property maps for curvatures (with defaults = 0) bool created = false; - Surface_Mesh::Property_map mean_curvature_map, gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = g1.add_property_map("v:mean_curvature_map", 0); + Surface_Mesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = smesh.add_property_map("v:mean_curvature_map", 0); assert(created); - boost::tie(gaussian_curvature_map, created) = g1.add_property_map("v:gaussian_curvature_map", 0); + boost::tie(gaussian_curvature_map, created) = smesh.add_property_map("v:gaussian_curvature_map", 0); assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> principal_curvature_map; + Surface_Mesh::Property_map> principal_curvature_map; - boost::tie(principal_curvature_map, created) = g1.add_property_map> + boost::tie(principal_curvature_map, created) = smesh.add_property_map> ("v:principal_curvature_map", { 0, 0, - Epic_Kernel::Vector_3 (0,0,0), - Epic_Kernel::Vector_3 (0,0,0)}); + Epic_kernel::Vector_3(0,0,0), + Epic_kernel::Vector_3(0,0,0) }); assert(created); + // user can call these fucntions to compute a specfic curvature type on each vertex. PMP::interpolated_corrected_mean_curvature( - g1, + smesh, mean_curvature_map ); + PMP::interpolated_corrected_gaussian_curvature( + smesh, + gaussian_curvature_map + ); + + PMP::interpolated_corrected_principal_curvatures( + smesh, + principal_curvature_map + ); + // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) - /*Surface_Mesh::Property_map vnm; - boost::tie(vnm, created) = g1.add_property_map( - "v:vnm", Epic_Kernel::Vector_3(0, 0, 0) + /*Surface_Mesh::Property_map vnm; + boost::tie(vnm, created) = smesh.add_property_map( + "v:vnm", Epic_kernel::Vector_3(0, 0, 0) ); assert(created); PMP::interpolated_corrected_mean_curvature( - g1, + smesh, mean_curvature_map, CGAL::parameters::ball_radius(0.5).vertex_normal_map(vnm) );*/ - PMP::interpolated_corrected_gaussian_curvature( - g1, - gaussian_curvature_map - ); - PMP::interpolated_corrected_principal_curvatures( - g1, - principal_curvature_map - ); - + // This function can be used to compute multiple curvature types by specifiying them as named parameters + // This is more efficient than computing each one separately (shared computations). PMP::interpolated_corrected_curvatures( - g1, - CGAL::parameters::ball_radius(0) - .vertex_mean_curvature_map(mean_curvature_map) - .vertex_gaussian_curvature_map(gaussian_curvature_map) + smesh, + CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) .vertex_principal_curvature_map(principal_curvature_map) ); - for (vertex_descriptor v : vertices(g1)) + for (vertex_descriptor v : vertices(smesh)) { auto PC = principal_curvature_map[v]; - std::cout << v.idx() << ": HC = " << mean_curvature_map[v] - << ", GC = " << gaussian_curvature_map[v] << "\n" - << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; + std::cout << v.idx() << ": HC = " << mean_curvature_map[v] + << ", GC = " << gaussian_curvature_map[v] << "\n" + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; } } diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 43aff72dec2b..207625fd8485 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -11,35 +11,43 @@ namespace PMP = CGAL::Polygon_mesh_processing; -typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_Kernel; -typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; +typedef CGAL::Polyhedron_3 Polyhedron; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) { - Polyhedron g1; + Polyhedron polyhedron; const std::string filename = (argc>1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); - if(!CGAL::IO::read_polygon_mesh(filename, g1)) + if(!CGAL::IO::read_polygon_mesh(filename, polyhedron)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; } - std::unordered_map mean_curvature_map, gaussian_curvature_map; - std::unordered_map> principal_curvature_map; + boost::property_map>::type + mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), + gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); + boost::property_map>>::type + principal_curvature_map = get(CGAL::dynamic_vertex_property_t< PMP::Principal_curvature>(), polyhedron); PMP::interpolated_corrected_mean_curvature( - g1, - boost::make_assoc_property_map(mean_curvature_map) + polyhedron, + mean_curvature_map + ); + + PMP::interpolated_corrected_gaussian_curvature( + polyhedron, + gaussian_curvature_map + ); + + PMP::interpolated_corrected_principal_curvatures( + polyhedron, + principal_curvature_map ); // uncomment this to compute a curvature while specifying named parameters @@ -48,27 +56,26 @@ int main(int argc, char* argv[]) /*std::unordered_map vnm; PMP::interpolated_corrected_mean_curvature( - g1, - boost::make_assoc_property_map(mean_curvature_map), + polyhedron, + mean_curvature_map, CGAL::parameters::ball_radius(0.5).vertex_normal_map(boost::make_assoc_property_map(vnm)) );*/ - PMP::interpolated_corrected_gaussian_curvature( - g1, - boost::make_assoc_property_map(gaussian_curvature_map) - ); - PMP::interpolated_corrected_principal_curvatures( - g1, - boost::make_assoc_property_map(principal_curvature_map) + // This function can be used to compute multiple curvature types by specifiying them as named parameters + // This is more efficient than computing each one separately (shared computations). + PMP::interpolated_corrected_curvatures( + polyhedron, + CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) + .vertex_principal_curvature_map(principal_curvature_map) ); int i = 0; - for (vertex_descriptor v : vertices(g1)) + for (vertex_descriptor v : vertices(polyhedron)) { - auto PC = principal_curvature_map[v]; - std::cout << i << ": HC = " << mean_curvature_map[v] - << ", GC = " << gaussian_curvature_map[v] << "\n" - << ", PC = [ " << std::get<0>(PC) << " , " << std::get<1>(PC) << " ]\n"; + auto PC = get(principal_curvature_map, v); + std::cout << i << ": HC = " << get(mean_curvature_map, v) + << ", GC = " << get(gaussian_curvature_map, v) << "\n" + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; i++; } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 1a0ef9891b00..0ed47db00584 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -35,11 +35,26 @@ namespace CGAL { namespace Polygon_mesh_processing { +/** +* \ingroup PMP_corrected_curvatures_grp +* +* \brief a struct for storing principal curvatures and directions. +* +* @tparam GT is the geometric traits class. +*/ template struct Principal_curvature { + + /// min curvature magnitude typename GT::FT min_curvature; + + /// max curvature magnitude typename GT::FT max_curvature; + + /// min curvature direction vector typename GT::Vector_3 min_direction; + + /// max curvature direction vector typename GT::Vector_3 max_direction; Principal_curvature() { @@ -373,138 +388,13 @@ std::array interpolated_corrected_anisotropic_measure_fa return muXY; } -//template -// void -// interpolated_corrected_measure_mesh(const PolygonMesh& pmesh, -// FaceMeasureMap fmm, -// const Curvature_measure_index mu_i, -// const NamedParameters& np = parameters::default_values()) -//{ -// -// typedef typename GetGeomTraits::type GT; -// -// typedef dynamic_vertex_property_t Vector_map_tag; -// typedef typename boost::property_map::const_type Default_vector_map; -// typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; -// -// using parameters::choose_parameter; -// using parameters::get_parameter; -// using parameters::is_default_parameter; -// -// typedef typename boost::graph_traits::face_descriptor Face_descriptor; -// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; -// typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; -// -// typename GetVertexPointMap::const_type -// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), -// get_const_property_map(CGAL::vertex_point, pmesh)); -// -// Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), -// get(Vector_map_tag(), pmesh)); -// -// if (is_default_parameter::value) -// compute_vertex_normals(pmesh, vnm, np); -// -// std::function -// &, const std::vector&)> -// iccm_function; -// switch (mu_i) -// { -// case MU0_AREA_MEASURE: -// iccm_function = &interpolated_corrected_area_measure_face; -// break; -// case MU1_MEAN_CURVATURE_MEASURE: -// iccm_function = &interpolated_corrected_mean_curvature_measure_face; -// break; -// case MU2_GAUSSIAN_CURVATURE_MEASURE: -// iccm_function = &interpolated_corrected_gaussian_curvature_measure_face; -// break; -// } -// -// std::vector x; -// std::vector u; -// -// for (Face_descriptor f : faces(pmesh)) -// { -// -// for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) -// { -// typename GT::Point_3 p = get(vpm, v); -// x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); -// u.push_back(get(vnm, v)); -// } -// -// put(fmm, f, iccm_function(u, x)); -// x.clear(); -// u.clear(); -// } -//} -// -//template -// void -// interpolated_corrected_anisotropic_measure_mesh(const PolygonMesh& pmesh, -// FaceMeasureMap fmm, -// const NamedParameters& np = parameters::default_values()) -//{ -// -// typedef typename GetGeomTraits::type GT; -// -// typedef dynamic_vertex_property_t Vector_map_tag; -// typedef typename boost::property_map::const_type Default_vector_map; -// typedef typename internal_np::Lookup_named_param_def::type VertexNormalMap; -// -// using parameters::choose_parameter; -// using parameters::get_parameter; -// using parameters::is_default_parameter; -// -// typedef typename boost::graph_traits::face_descriptor Face_descriptor; -// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; -// typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; -// -// typename GetVertexPointMap::const_type -// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), -// get_const_property_map(CGAL::vertex_point, pmesh)); -// -// VertexNormalMap vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), -// get(Vector_map_tag(), pmesh)); -// -// if (is_default_parameter::value) -// compute_vertex_normals(pmesh, vnm, np); -// -// std::vector x; -// std::vector u; -// -// for (Face_descriptor f : faces(pmesh)) -// { -// -// for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) -// { -// typename GT::Point_3 p = get(vpm, v); -// x.push_back(typename GT::Vector_3(p.x(), p.y(), p.z())); -// u.push_back(get(vnm, v)); -// } -// -// put(fmm, f, interpolated_corrected_anisotropic_measure_face(u, x)); -// x.clear(); -// u.clear(); -// -// } -//} - -// //template -//typename GT::FT triangle_in_ball_ratio_1(const typename GT::Vector_3 x1, -// const typename GT::Vector_3 x2, -// const typename GT::Vector_3 x3, -// const typename GT::FT r, -// const typename GT::Vector_3 c, -// const std::size_t res = 3) +//typename GT::FT triangle_in_ball_ratio(const typename GT::Vector_3 x1, +// const typename GT::Vector_3 x2, +// const typename GT::Vector_3 x3, +// const typename GT::FT r, +// const typename GT::Vector_3 c, +// const std::size_t res = 3) //{ // const typename GT::FT R = r * r; // const typename GT::FT acc = 1.0 / res; @@ -549,162 +439,6 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, return (r - d_min) / (d_max - d_min); } -//template -// void expand_interpolated_corrected_measure_vertex(const PolygonMesh& pmesh, -// FaceMeasureMap area_fmm, -// FaceMeasureMap curvature_fmm, -// VertexMeasureMap area_vmm, -// VertexMeasureMap curvature_vmm, -// const typename boost::graph_traits::vertex_descriptor v, -// const NamedParameters& np = parameters::default_values()) -//{ -// using parameters::choose_parameter; -// using parameters::get_parameter; -// -// typedef typename GetGeomTraits::type GT; -// -// typedef typename boost::graph_traits::face_descriptor Face_descriptor; -// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; -// -// const typename GT::FT -// r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); -// -// typename GetVertexPointMap::const_type -// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), -// get_const_property_map(CGAL::vertex_point, pmesh)); -// -// -// std::queue bfs_queue; -// std::unordered_set bfs_visited; -// -// typename GT::Point_3 vp = get(vpm, v); -// typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); -// -// typename GT::FT corrected_mu0 = 0; -// typename GT::FT corrected_mui = 0; -// -// for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { -// if (f != boost::graph_traits::null_face()) -// { -// bfs_queue.push(f); -// bfs_visited.insert(f); -// } -// } -// while (!bfs_queue.empty()) { -// Face_descriptor fi = bfs_queue.front(); -// bfs_queue.pop(); -// -// // looping over vertices in face to get point coordinates -// std::vector x; -// for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) -// { -// typename GT::Point_3 pi = get(vpm, vi); -// x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); -// } -// -// const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); -// -// if (f_ratio != 0.0) -// { -// corrected_mu0 += f_ratio * get(area_fmm, fi); -// corrected_mui += f_ratio * get(curvature_fmm, fi); -// for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) -// { -// if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) -// { -// bfs_queue.push(fj); -// bfs_visited.insert(fj); -// } -// } -// } -// } -// put(area_vmm, v, corrected_mu0); -// put(curvature_vmm, v, corrected_mui); -//} -// -//template -// void expand_interpolated_corrected_anisotropic_measure_vertex(const PolygonMesh& pmesh, -// AreaFaceMeasureMap area_fmm, -// AnisotropicFaceMeasureMap aniso_fmm, -// AreaVertexMeasureMap area_vmm, -// AnisotropicVertexMeasureMap aniso_vmm, -// const typename boost::graph_traits::vertex_descriptor v, -// const NamedParameters& np = parameters::default_values()) -//{ -// using parameters::choose_parameter; -// using parameters::get_parameter; -// -// typedef typename GetGeomTraits::type GT; -// -// typedef typename boost::graph_traits::face_descriptor Face_descriptor; -// typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; -// -// const typename GT::FT -// r = choose_parameter(get_parameter(np, internal_np::ball_radius), 0); -// -// typename GetVertexPointMap::const_type -// vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), -// get_const_property_map(CGAL::vertex_point, pmesh)); -// -// -// std::queue bfs_queue; -// std::unordered_set bfs_visited; -// -// typename GT::Point_3 vp = get(vpm, v); -// typename GT::Vector_3 c = typename GT::Vector_3(vp.x(), vp.y(), vp.z()); -// -// typename GT::FT corrected_mu0 = 0; -// Eigen::Matrix corrected_muXY = Eigen::Matrix::Zero(); -// -// for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { -// if (f != boost::graph_traits::null_face()) -// { -// bfs_queue.push(f); -// bfs_visited.insert(f); -// } -// } -// while (!bfs_queue.empty()) { -// Face_descriptor fi = bfs_queue.front(); -// bfs_queue.pop(); -// -// // looping over vertices in face to get point coordinates -// std::vector x; -// for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) -// { -// typename GT::Point_3 pi = get(vpm, vi); -// x.push_back(typename GT::Vector_3(pi.x(), pi.y(), pi.z())); -// } -// -// const typename GT::FT f_ratio = face_in_ball_ratio(x, r, c); -// -// if (f_ratio != 0.0) -// { -// corrected_mu0 += f_ratio * get(area_fmm, fi); -// -// std::array muXY_face = get(aniso_fmm, fi); -// -// for (std::size_t ix = 0; ix < 3; ix++) -// for (std::size_t iy = 0; iy < 3; iy++) -// corrected_muXY(ix, iy) += f_ratio * muXY_face[ix * 3 + iy]; -// -// for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) -// { -// if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) -// { -// bfs_queue.push(fj); -// bfs_visited.insert(fj); -// } -// } -// } -// } -// put(area_vmm, v, corrected_mu0); -// put(aniso_vmm, v, corrected_muXY); -//} - - template Principal_curvature principal_curvature_from_anisotropic_measures( const std::array anisotropic_measure, @@ -1208,12 +942,11 @@ template::%Vertex_descriptor` +* as key type and `%FT` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_gaussian_curvature_map} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamType{a class model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%FT` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} +* \cgalParamNEnd +* +* +* \cgalParamNBegin{vertex_prinicipal_curvature_map} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamType{a class model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%Principal_curvature` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} +* \cgalParamNEnd * * \cgalParamNBegin{ball_radius} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of * measures on faces around the vertex} * \cgalParamNEnd * From 59c3605a0689e20a54a8998d9ed3296fd8862cbb Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 14 Nov 2022 11:28:37 +0200 Subject: [PATCH 0077/1398] trailing whitespace --- .../interpolated_corrected_curvature_measures.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 0ed47db00584..5bcff27cc2ee 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -37,14 +37,14 @@ namespace Polygon_mesh_processing { /** * \ingroup PMP_corrected_curvatures_grp -* +* * \brief a struct for storing principal curvatures and directions. * * @tparam GT is the geometric traits class. */ template struct Principal_curvature { - + /// min curvature magnitude typename GT::FT min_curvature; @@ -976,7 +976,7 @@ template(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} * \cgalParamNEnd -* +* * * \cgalParamNBegin{vertex_prinicipal_curvature_map} * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} From b0a82c4569c6f9483ed45f76f2224f9b9212fad8 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 14 Nov 2022 11:37:14 +0200 Subject: [PATCH 0078/1398] typo fix --- .../Curvatures/interpolated_corrected_curvature_measures.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 5bcff27cc2ee..9da751c7f83b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -996,7 +996,7 @@ template::%Vertex_descriptor` From 25eb94f1ec4996a46ec443888e768ff3e9ba6dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 14 Nov 2022 14:24:24 +0100 Subject: [PATCH 0079/1398] force copy fig --- .../doc/Polygon_mesh_processing/Doxyfile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in index fa3b8b8f1bf5..f2e738b4d23c 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in @@ -21,4 +21,5 @@ EXCLUDE_SYMBOLS += experimental HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/selfintersections.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/mesh_smoothing.png \ - ${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png + ${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png \ + ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png From b56500d0fc8edbf4971c367bfbde6a9d2dd1a915 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 16 Nov 2022 12:51:14 +0200 Subject: [PATCH 0080/1398] 4-space -> 2-space indents --- ...erpolated_corrected_curvatures_example.cpp | 36 +- ...orrected_curvatures_polyhedron_example.cpp | 26 +- ...nterpolated_corrected_curvature_measures.h | 920 +++++++++--------- ...est_interopolated_corrected_curvatures.cpp | 226 ++--- .../Display/Display_property_plugin.cpp | 214 ++-- 5 files changed, 708 insertions(+), 714 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index ffb86d94795c..7bf182c3ce3d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -18,11 +18,11 @@ typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) { Surface_Mesh smesh; - const std::string filename = (argc>1) ? - argv[1] : - CGAL::data_file_path("meshes/small_bunny.obj"); + const std::string filename = (argc > 1) ? + argv[1] : + CGAL::data_file_path("meshes/small_bunny.obj"); - if(!CGAL::IO::read_polygon_mesh(filename, smesh)) + if (!CGAL::IO::read_polygon_mesh(filename, smesh)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; @@ -41,25 +41,25 @@ int main(int argc, char* argv[]) Surface_Mesh::Property_map> principal_curvature_map; boost::tie(principal_curvature_map, created) = smesh.add_property_map> - ("v:principal_curvature_map", { 0, 0, - Epic_kernel::Vector_3(0,0,0), - Epic_kernel::Vector_3(0,0,0) }); + ("v:principal_curvature_map", { 0, 0, + Epic_kernel::Vector_3(0,0,0), + Epic_kernel::Vector_3(0,0,0) }); assert(created); // user can call these fucntions to compute a specfic curvature type on each vertex. PMP::interpolated_corrected_mean_curvature( - smesh, - mean_curvature_map + smesh, + mean_curvature_map ); PMP::interpolated_corrected_gaussian_curvature( - smesh, - gaussian_curvature_map + smesh, + gaussian_curvature_map ); PMP::interpolated_corrected_principal_curvatures( - smesh, - principal_curvature_map + smesh, + principal_curvature_map ); // uncomment this to compute a curvature while specifying named parameters @@ -81,16 +81,16 @@ int main(int argc, char* argv[]) // This function can be used to compute multiple curvature types by specifiying them as named parameters // This is more efficient than computing each one separately (shared computations). PMP::interpolated_corrected_curvatures( - smesh, - CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) - .vertex_principal_curvature_map(principal_curvature_map) + smesh, + CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) + .vertex_principal_curvature_map(principal_curvature_map) ); for (vertex_descriptor v : vertices(smesh)) { auto PC = principal_curvature_map[v]; std::cout << v.idx() << ": HC = " << mean_curvature_map[v] - << ", GC = " << gaussian_curvature_map[v] << "\n" - << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; + << ", GC = " << gaussian_curvature_map[v] << "\n" + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; } } diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 207625fd8485..929fc8d96a67 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -16,14 +16,12 @@ typedef CGAL::Polyhedron_3 Polyhedron; typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; -int main(int argc, char* argv[]) +int main(int argc, char *argv[]) { Polyhedron polyhedron; - const std::string filename = (argc>1) ? - argv[1] : - CGAL::data_file_path("meshes/small_bunny.obj"); + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); - if(!CGAL::IO::read_polygon_mesh(filename, polyhedron)) + if (!CGAL::IO::read_polygon_mesh(filename, polyhedron)) { std::cerr << "Invalid input file." << std::endl; return EXIT_FAILURE; @@ -33,22 +31,19 @@ int main(int argc, char* argv[]) mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); boost::property_map>>::type - principal_curvature_map = get(CGAL::dynamic_vertex_property_t< PMP::Principal_curvature>(), polyhedron); + principal_curvature_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); PMP::interpolated_corrected_mean_curvature( polyhedron, - mean_curvature_map - ); + mean_curvature_map); PMP::interpolated_corrected_gaussian_curvature( polyhedron, - gaussian_curvature_map - ); + gaussian_curvature_map); PMP::interpolated_corrected_principal_curvatures( polyhedron, - principal_curvature_map - ); + principal_curvature_map); // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) @@ -66,16 +61,15 @@ int main(int argc, char* argv[]) PMP::interpolated_corrected_curvatures( polyhedron, CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) - .vertex_principal_curvature_map(principal_curvature_map) - ); + .vertex_principal_curvature_map(principal_curvature_map)); int i = 0; for (vertex_descriptor v : vertices(polyhedron)) { auto PC = get(principal_curvature_map, v); std::cout << i << ": HC = " << get(mean_curvature_map, v) - << ", GC = " << get(gaussian_curvature_map, v) << "\n" - << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; + << ", GC = " << get(gaussian_curvature_map, v) << "\n" + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; i++; } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 9da751c7f83b..4006b761679f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -45,74 +45,74 @@ namespace Polygon_mesh_processing { template struct Principal_curvature { - /// min curvature magnitude - typename GT::FT min_curvature; - - /// max curvature magnitude - typename GT::FT max_curvature; - - /// min curvature direction vector - typename GT::Vector_3 min_direction; - - /// max curvature direction vector - typename GT::Vector_3 max_direction; - - Principal_curvature() { - min_curvature = 0; - max_curvature = 0; - min_direction = typename GT::Vector_3(0, 0, 0); - max_direction = typename GT::Vector_3(0, 0, 0); - } - - Principal_curvature( - typename GT::FT min_curvature, - typename GT::FT max_curvature, - typename GT::Vector_3 min_direction, - typename GT::Vector_3 max_direction) { - this->min_curvature = min_curvature; - this->max_curvature = max_curvature; - this->min_direction = min_direction; - this->max_direction = max_direction; - } + /// min curvature magnitude + typename GT::FT min_curvature; + + /// max curvature magnitude + typename GT::FT max_curvature; + + /// min curvature direction vector + typename GT::Vector_3 min_direction; + + /// max curvature direction vector + typename GT::Vector_3 max_direction; + + Principal_curvature() { + min_curvature = 0; + max_curvature = 0; + min_direction = typename GT::Vector_3(0, 0, 0); + max_direction = typename GT::Vector_3(0, 0, 0); + } + + Principal_curvature( + typename GT::FT min_curvature, + typename GT::FT max_curvature, + typename GT::Vector_3 min_direction, + typename GT::Vector_3 max_direction + ) { + min_curvature = min_curvature; + max_curvature = max_curvature; + min_direction = min_direction; + max_direction = max_direction; + } }; namespace internal { -template -typename GT::FT average_edge_length(const PolygonMesh& pmesh) -{ + template + typename GT::FT average_edge_length(const PolygonMesh& pmesh) { const std::size_t n = edges(pmesh).size(); if (n == 0) - return 0; + return 0; typename GT::FT avg_edge_length = 0; for (auto e : edges(pmesh)) - avg_edge_length += edge_length(e, pmesh); + avg_edge_length += edge_length(e, pmesh); avg_edge_length /= n; return avg_edge_length; -} + } -enum Curvature_measure_index { + enum Curvature_measure_index { MU0_AREA_MEASURE, ///< corrected area density MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density -}; + }; -template -struct Vertex_measures { + template + struct Vertex_measures { typename GT::FT area_measure = 0; typename GT::FT mean_curvature_measure = 0; typename GT::FT gaussian_curvature_measure = 0; std::array anisotropic_measure = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -}; + }; -template -typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, - const std::vector& x = {}) -{ + template + typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, + const std::vector& x = {}) + { const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); @@ -122,52 +122,52 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - } - return mu0; + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + mu0 += interpolated_corrected_area_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); + } + return mu0; } -} + } -template -typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, - const std::vector& x = {}) -{ + template + typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, + const std::vector& x = {}) + { const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); @@ -177,63 +177,63 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve // Triangle: use triangle formula if (n == 3) { - const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; - return 0.5 * um * (cross_product(u[2] - u[1], x[0]) - + cross_product(u[0] - u[2], x[1]) - + cross_product(u[1] - u[0], x[2])); + return 0.5 * um * (cross_product(u[2] - u[1], x[0]) + + cross_product(u[0] - u[2], x[1]) + + cross_product(u[1] - u[0], x[2])); } // Quad: use bilinear interpolation formula else if (n == 4) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - - const typename GT::Vector_3 u02 = u[2] - u[0]; - const typename GT::Vector_3 u13 = u[3] - u[1]; - const typename GT::Vector_3 x0_cross = cross_product(u13, x[0]); - const typename GT::Vector_3 x1_cross = -cross_product(u02, x[1]); - const typename GT::Vector_3 x3_cross = cross_product(u02, x[3]); - const typename GT::Vector_3 x2_cross = -cross_product(u13, x[2]); - - return (1.0 / 12.0) * ( - u[0] * (2 * x0_cross - cross_product((u[3] + u[2]), x[1]) + cross_product((u[1] + u[2]), x[3]) + x2_cross) - + u[1] * (cross_product((u[3] + u[2]), x[0]) + 2 * x1_cross + x3_cross - cross_product((u[0] + u[3]), x[2])) - + u[3] * (-cross_product((u[1] + u[2]), x[0]) + x1_cross + 2 * x3_cross + cross_product((u[0] + u[1]), x[2])) - + u[2] * (x0_cross + cross_product((u[0] + u[3]), x[1]) - cross_product((u[0] + u[1]), x[3]) + 2 * x2_cross) - ); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 u13 = u[3] - u[1]; + const typename GT::Vector_3 x0_cross = cross_product(u13, x[0]); + const typename GT::Vector_3 x1_cross = -cross_product(u02, x[1]); + const typename GT::Vector_3 x3_cross = cross_product(u02, x[3]); + const typename GT::Vector_3 x2_cross = -cross_product(u13, x[2]); + + return (1.0 / 12.0) * ( + u[0] * (2 * x0_cross - cross_product((u[3] + u[2]), x[1]) + cross_product((u[1] + u[2]), x[3]) + x2_cross) + + u[1] * (cross_product((u[3] + u[2]), x[0]) + 2 * x1_cross + x3_cross - cross_product((u[0] + u[3]), x[2])) + + u[3] * (-cross_product((u[1] + u[2]), x[0]) + x1_cross + 2 * x3_cross + cross_product((u[0] + u[1]), x[2])) + + u[2] * (x0_cross + cross_product((u[0] + u[3]), x[1]) - cross_product((u[0] + u[1]), x[3]) + 2 * x2_cross) + ); } // N-gon: split into n triangles by polygon center and use triangle formula for each else { - typename GT::FT mu1 = 0; + typename GT::FT mu1 = 0; - // getting center of points - typename GT::Vector_3 xc = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; - - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu1 += interpolated_corrected_mean_curvature_measure_face( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - } - return mu1; + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + mu1 += interpolated_corrected_mean_curvature_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); + } + return mu1; } -} + } -template -typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, - const std::vector& x = {}) -{ + template + typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, + const std::vector& x = {}) + { const std::size_t n = u.size(); CGAL_precondition(n >= 3); @@ -242,182 +242,182 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std // Triangle: use triangle formula if (n == 3) { - return 0.5 * u[0] * cross_product(u[1], u[2]); + return 0.5 * u[0] * cross_product(u[1], u[2]); } // Quad: use bilinear interpolation formula else if (n == 4) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - return (1.0 / 36.0) * ( - (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) - + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) - + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) - + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) - ); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + return (1.0 / 36.0) * ( + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) + ); } // N-gon: split into n triangles by polygon center and use triangle formula for each else { - typename GT::FT mu2 = 0; - - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu2 += interpolated_corrected_gaussian_curvature_measure_face( - std::vector {u[i], u[(i + 1) % n], uc} - ); - } - return mu2; + typename GT::FT mu2 = 0; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + mu2 += interpolated_corrected_gaussian_curvature_measure_face( + std::vector {u[i], u[(i + 1) % n], uc} + ); + } + return mu2; } -} + } -template -std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, - const std::vector& x) -{ + template + std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, + const std::vector& x) + { const std::size_t n = x.size(); CGAL_precondition(u.size() == n); CGAL_precondition(n >= 3); typename GT::Construct_cross_product_vector_3 cross_product; - std::array muXY {0}; + std::array muXY{ 0 }; // Triangle: use triangle formula if (n == 3) { - const typename GT::Vector_3 u01 = u[1] - u[0]; - const typename GT::Vector_3 u02 = u[2] - u[0]; - const typename GT::Vector_3 x01 = x[1] - x[0]; - const typename GT::Vector_3 x02 = x[2] - x[0]; - const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + const typename GT::Vector_3 u01 = u[1] - u[0]; + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 x01 = x[1] - x[0]; + const typename GT::Vector_3 x02 = x[2] - x[0]; + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + + for (std::size_t ix = 0; ix < 3; ix++) + { + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); - for (std::size_t ix = 0; ix < 3; ix++) - { - typename GT::Vector_3 X; - if (ix == 0) - X = typename GT::Vector_3(1, 0, 0); - if (ix == 1) - X = typename GT::Vector_3(0, 1, 0); - if (ix == 2) - X = typename GT::Vector_3(0, 0, 1); - - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); - } + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); + } } // Quad: use bilinear interpolation formula else if (n == 4) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - for (std::size_t ix = 0; ix < 3; ix++) - { - typename GT::Vector_3 X; - if (ix == 0) - X = typename GT::Vector_3(1, 0, 0); - if (ix == 1) - X = typename GT::Vector_3(0, 1, 0); - if (ix == 2) - X = typename GT::Vector_3(0, 0, 1); - - const typename GT::Vector_3 u0xX = cross_product(u[0], X); - const typename GT::Vector_3 u1xX = cross_product(u[1], X); - const typename GT::Vector_3 u2xX = cross_product(u[2], X); - const typename GT::Vector_3 u3xX = cross_product(u[3], X); - - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] = (1.0 / 72.0) * ( - - u[0][iy] * ( u0xX * ( - x[0] - 11 * x[1] + 13 * x[3] - x[2]) - + u1xX * ( -5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) - + u3xX * ( x[0] - 7 * x[1] + 11 * x[3] - 5 * x[2]) - + u2xX * ( - x[0] - 5 * x[1] + 7 * x[3] - x[2]) - ) - + u[1][iy] * ( u0xX * ( 13 * x[0] - x[1] - 7 * x[3] - 5 * x[2]) - + u1xX * ( 17 * x[0] - 5 * x[1] - 5 * x[3] - 7 * x[2]) - + u3xX * ( 5 * x[0] + x[1] + x[3] - 7 * x[2]) - + u2xX * ( 7 * x[0] - x[1] + 5 * x[3] - 11 * x[2]) - ) - + u[2][iy] * ( u0xX * (-11 * x[0] + 5 * x[1] - x[3] + 7 * x[2]) - + u1xX * (- 7 * x[0] + x[1] + x[3] + 5 * x[2]) - + u3xX * (- 7 * x[0] - 5 * x[1] - 5 * x[3] + 17 * x[2]) - + u2xX * (- 5 * x[0] - 7 * x[1] - x[3] + 13 * x[2]) - ) - + u[3][iy] * ( u0xX * (- x[0] + 7 * x[1] - 5 * x[3] - x[2]) - + u1xX * (- 5 * x[0] + 11 * x[1] - 7 * x[3] + x[2]) - + u3xX * ( x[0] + 11 * x[1] - 7 * x[3] - 5 * x[2]) - + u2xX * (- x[0] + 13 * x[1] - 11 * x[3] - x[2]) - ) - - ); - } + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + for (std::size_t ix = 0; ix < 3; ix++) + { + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); + + const typename GT::Vector_3 u0xX = cross_product(u[0], X); + const typename GT::Vector_3 u1xX = cross_product(u[1], X); + const typename GT::Vector_3 u2xX = cross_product(u[2], X); + const typename GT::Vector_3 u3xX = cross_product(u[3], X); + + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = (1.0 / 72.0) * ( + + u[0][iy] * (u0xX * (-x[0] - 11 * x[1] + 13 * x[3] - x[2]) + + u1xX * (-5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) + + u3xX * (x[0] - 7 * x[1] + 11 * x[3] - 5 * x[2]) + + u2xX * (-x[0] - 5 * x[1] + 7 * x[3] - x[2]) + ) + + u[1][iy] * (u0xX * (13 * x[0] - x[1] - 7 * x[3] - 5 * x[2]) + + u1xX * (17 * x[0] - 5 * x[1] - 5 * x[3] - 7 * x[2]) + + u3xX * (5 * x[0] + x[1] + x[3] - 7 * x[2]) + + u2xX * (7 * x[0] - x[1] + 5 * x[3] - 11 * x[2]) + ) + + u[2][iy] * (u0xX * (-11 * x[0] + 5 * x[1] - x[3] + 7 * x[2]) + + u1xX * (-7 * x[0] + x[1] + x[3] + 5 * x[2]) + + u3xX * (-7 * x[0] - 5 * x[1] - 5 * x[3] + 17 * x[2]) + + u2xX * (-5 * x[0] - 7 * x[1] - x[3] + 13 * x[2]) + ) + + u[3][iy] * (u0xX * (-x[0] + 7 * x[1] - 5 * x[3] - x[2]) + + u1xX * (-5 * x[0] + 11 * x[1] - 7 * x[3] + x[2]) + + u3xX * (x[0] + 11 * x[1] - 7 * x[3] - 5 * x[2]) + + u2xX * (-x[0] + 13 * x[1] - 11 * x[3] - x[2]) + ) + + ); + } } // N-gon: split into n triangles by polygon center and use triangle formula for each else { - // getting center of points - typename GT::Vector_3 xc = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; - - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - std::array muXY_curr_triangle = - interpolated_corrected_anisotropic_measure_face( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - - for (std::size_t ix = 0; ix < 3; ix++) - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] += muXY_curr_triangle[ix * 3 + iy]; - } + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; + + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) + { + std::array muXY_curr_triangle = + interpolated_corrected_anisotropic_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); + + for (std::size_t ix = 0; ix < 3; ix++) + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] += muXY_curr_triangle[ix * 3 + iy]; + } } return muXY; -} - -//template -//typename GT::FT triangle_in_ball_ratio(const typename GT::Vector_3 x1, -// const typename GT::Vector_3 x2, -// const typename GT::Vector_3 x3, -// const typename GT::FT r, -// const typename GT::Vector_3 c, -// const std::size_t res = 3) -//{ -// const typename GT::FT R = r * r; -// const typename GT::FT acc = 1.0 / res; -// std::size_t samples_in = 0; -// for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) -// for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) -// { -// if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) -// samples_in++; -// } -// return samples_in / (typename GT::FT)(res * (res + 1) / 2); -//} - -template -typename GT::FT face_in_ball_ratio(const std::vector& x, - const typename GT::FT r, - const typename GT::Vector_3 c) -{ + } + + //template + //typename GT::FT triangle_in_ball_ratio(const typename GT::Vector_3 x1, + // const typename GT::Vector_3 x2, + // const typename GT::Vector_3 x3, + // const typename GT::FT r, + // const typename GT::Vector_3 c, + // const std::size_t res = 3) + //{ + // const typename GT::FT R = r * r; + // const typename GT::FT acc = 1.0 / res; + // std::size_t samples_in = 0; + // for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) + // for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) + // { + // if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) + // samples_in++; + // } + // return samples_in / (typename GT::FT)(res * (res + 1) / 2); + //} + + template + typename GT::FT face_in_ball_ratio(const std::vector& x, + const typename GT::FT r, + const typename GT::Vector_3 c) + { const std::size_t n = x.size(); // getting center of points typename GT::Vector_3 xm = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); xm /= n; typename GT::FT d_min = (xm - c).squared_length(); @@ -425,9 +425,9 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, for (const typename GT::Vector_3 xi : x) { - const typename GT::FT d_sq = (xi - c).squared_length(); - d_max = (std::max)(d_sq, d_max); - d_min = (std::min)(d_sq, d_min); + const typename GT::FT d_sq = (xi - c).squared_length(); + d_max = (std::max)(d_sq, d_max); + d_min = (std::min)(d_sq, d_min); } if (d_max <= r * r) return 1.0; @@ -437,20 +437,20 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, d_min = sqrt(d_min); return (r - d_min) / (d_max - d_min); -} + } -template -Principal_curvature principal_curvature_from_anisotropic_measures( + template + Principal_curvature principal_curvature_from_anisotropic_measures( const std::array anisotropic_measure, const typename GT::FT v_mu0, const typename GT::Vector_3 u_GT -) -{ + ) + { Eigen::Matrix v_muXY = Eigen::Matrix::Zero(); for (std::size_t ix = 0; ix < 3; ix++) - for (std::size_t iy = 0; iy < 3; iy++) - v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; + for (std::size_t iy = 0; iy < 3; iy++) + v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); const typename GT::FT K = 1000 * v_mu0; @@ -462,7 +462,7 @@ Principal_curvature principal_curvature_from_anisotropic_measures( eigensolver.computeDirect(v_muXY); if (eigensolver.info() != Eigen::Success) - return Principal_curvature(); + return Principal_curvature(); const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); @@ -471,16 +471,16 @@ Principal_curvature principal_curvature_from_anisotropic_measures( const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); return Principal_curvature( - (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, - (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, - min_eig_vec, - max_eig_vec - ); -} - -template -class Interpolated_corrected_curvatures_computer -{ + (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, + (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + min_eig_vec, + max_eig_vec + ); + } + + template + class Interpolated_corrected_curvatures_computer + { typedef typename GetGeomTraits::type GT; typedef typename GT::FT FT; @@ -497,29 +497,29 @@ class Interpolated_corrected_curvatures_computer typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + NamedParameters, + Default_vector_map>::type Vertex_normal_map; typedef Constant_property_map Default_scalar_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_mean_curvature_map; + NamedParameters, + Default_scalar_map>::type Vertex_mean_curvature_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_gaussian_curvature_map; + NamedParameters, + Default_scalar_map>::type Vertex_gaussian_curvature_map; typedef Constant_property_map> Default_principal_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvature_map; + NamedParameters, + Default_principal_map>::type Vertex_principal_curvature_map; typedef typename boost::property_map>::const_type Face_scalar_measure_map; + CGAL::dynamic_face_property_t>::const_type Face_scalar_measure_map; typedef typename boost::property_map>>::const_type Face_anisotropic_measure_map; + CGAL::dynamic_face_property_t>>::const_type Face_anisotropic_measure_map; -private: + private: const PolygonMesh& pmesh; Vertex_position_map vpm; Vertex_normal_map vnm; @@ -537,217 +537,217 @@ class Interpolated_corrected_curvatures_computer Face_anisotropic_measure_map muXY_map; void set_property_maps() { - mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); - mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); - muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); + mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); + muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); } void set_named_params(const NamedParameters& np) { - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); - vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); + vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); - const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - is_mean_curvature_selected = !is_default_parameter::value; - is_gaussian_curvature_selected = !is_default_parameter::value; - is_principal_curvature_selected = !is_default_parameter::value; + is_mean_curvature_selected = !is_default_parameter::value; + is_gaussian_curvature_selected = !is_default_parameter::value; + is_principal_curvature_selected = !is_default_parameter::value; - mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); - gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); - principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), Default_principal_map()); + mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); + gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); + principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), Default_principal_map()); - set_ball_radius(radius); + set_ball_radius(radius); } void set_ball_radius(const FT radius) { - if (radius == 0) - ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - else - ball_radius = radius; + if (radius == 0) + ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + ball_radius = radius; } -public: + public: Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values() + const NamedParameters& np = parameters::default_values() ) : - pmesh(pmesh) + pmesh(pmesh) { - set_named_params(np); + set_named_params(np); - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) - { - set_property_maps(); + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) + { + set_property_maps(); - compute_selected_curvatures(); - } + compute_selected_curvatures(); + } } -private: + private: void interpolated_corrected_all_measures_all_faces() { - std::vector x; - std::vector u; + std::vector x; + std::vector u; - for (Face_descriptor f : faces(pmesh)) + for (Face_descriptor f : faces(pmesh)) + { + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - Point_3 p = get(vpm, v); - x.push_back(Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - put(mu0_map, f, interpolated_corrected_area_measure_face(u, x)); + Point_3 p = get(vpm, v); + x.push_back(Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); + } + put(mu0_map, f, interpolated_corrected_area_measure_face(u, x)); - if (is_mean_curvature_selected) - put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); + if (is_mean_curvature_selected) + put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); - if (is_gaussian_curvature_selected) - put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u, x)); + if (is_gaussian_curvature_selected) + put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u, x)); - if (is_principal_curvature_selected) - put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); + if (is_principal_curvature_selected) + put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); - x.clear(); - u.clear(); - } + x.clear(); + u.clear(); + } } Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) { - Vertex_measures vertex_curvatures; + Vertex_measures vertex_curvatures; - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - vertex_curvatures.area_measure += get(mu0_map, f); + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + vertex_curvatures.area_measure += get(mu0_map, f); - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += get(mu1_map, f); + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += get(mu1_map, f); - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += get(mu2_map, f); + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += get(mu2_map, f); - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, f); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; - } + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, f); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; } + } - return vertex_curvatures; + return vertex_curvatures; } Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) { - std::queue bfs_queue; - std::unordered_set bfs_visited; + std::queue bfs_queue; + std::unordered_set bfs_visited; - Point_3 vp = get(vpm, v); - Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); - Vertex_measures vertex_curvatures; + Vertex_measures vertex_curvatures; - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); - } + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_queue.push(f); + bfs_visited.insert(f); } - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); + } + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); - // looping over vertices in face to get point coordinates - std::vector x; - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - Point_3 pi = get(vpm, vi); - x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); - } + // looping over vertices in face to get point coordinates + std::vector x; + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + } - const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); + const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); - if (f_ratio != 0.0) + if (f_ratio != 0.0) + { + vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); + + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); + + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); + + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, fi); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } + + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) { - vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); - - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); - - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); - - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, fi); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; - } - - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) - { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) - { - bfs_queue.push(fj); - bfs_visited.insert(fj); - } - } + bfs_queue.push(fj); + bfs_visited.insert(fj); } + } } - return vertex_curvatures; + } + return vertex_curvatures; } void compute_selected_curvatures() { - interpolated_corrected_all_measures_all_faces(); - - for (Vertex_descriptor v : vertices(pmesh)) - { - Vertex_measures vertex_curvatures = (ball_radius < 0)? - expand_interpolated_corrected_measure_vertex_no_radius(v) : - expand_interpolated_corrected_measure_vertex(v); - - if (is_mean_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : - put(mean_curvature_map, v, 0); - } + interpolated_corrected_all_measures_all_faces(); + + for (Vertex_descriptor v : vertices(pmesh)) + { + Vertex_measures vertex_curvatures = (ball_radius < 0) ? + expand_interpolated_corrected_measure_vertex_no_radius(v) : + expand_interpolated_corrected_measure_vertex(v); + + if (is_mean_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : + put(mean_curvature_map, v, 0); + } - if (is_gaussian_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : - put(gaussian_curvature_map, v, 0); - } + if (is_gaussian_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : + put(gaussian_curvature_map, v, 0); + } - if (is_principal_curvature_selected) { - const Vector_3 v_normal = get(vnm, v); - const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( - vertex_curvatures.anisotropic_measure, - vertex_curvatures.area_measure, - v_normal - ); - put(principal_curvature_map, v, principal_curvature); - } + if (is_principal_curvature_selected) { + const Vector_3 v_normal = get(vnm, v); + const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( + vertex_curvatures.anisotropic_measure, + vertex_curvatures.area_measure, + v_normal + ); + put(principal_curvature_map, v, principal_curvature); } + } } -}; + }; } // namespace internal @@ -807,12 +807,12 @@ class Interpolated_corrected_curvatures_computer */ template - void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> + void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); } /** @@ -870,12 +870,12 @@ template - void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> + void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); } /** @@ -934,12 +934,12 @@ template - void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> + void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, + VertexCurvatureMap& vcm, + NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvature_map(vcm)); } /** @@ -1023,11 +1023,11 @@ template - void interpolated_corrected_curvatures(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> + void interpolated_corrected_curvatures(const PolygonMesh& pmesh, + const NamedParameters& np = parameters::default_values()) { - internal::Interpolated_corrected_curvatures_computer(pmesh, np); + internal::Interpolated_corrected_curvatures_computer(pmesh, np); } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp index 7e376c887716..b2dbcc0850bb 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp @@ -19,130 +19,130 @@ typedef boost::graph_traits::edge_descriptor edge_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel::FT rel_noise_magnitude) { - SMesh pmesh; - const std::string filename = CGAL::data_file_path(mesh_path); + SMesh pmesh; + const std::string filename = CGAL::data_file_path(mesh_path); - if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) - { - std::cerr << "Invalid input file." << std::endl; - } + if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) + { + std::cerr << "Invalid input file." << std::endl; + } - bool created = false; + bool created = false; - SMesh::Property_map mean_curvature_map, gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); - assert(created); + SMesh::Property_map mean_curvature_map, gaussian_curvature_map; + boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); + assert(created); + + boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); + assert(created); + + // getting the max and min edge lengthes + const auto edge_range = CGAL::edges(pmesh); + + const auto edge_length_comparator = [&, pmesh](auto l, auto r) { + return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); + }; + + const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); + + const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); + const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); + + + if (rel_noise_magnitude > 0) + { + if (!CGAL::is_triangle_mesh(pmesh)) + return; - boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); + SMesh::Property_map vnm; + boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); assert(created); - // getting the max and min edge lengthes - const auto edge_range = CGAL::edges(pmesh); - - const auto edge_length_comparator = [&, pmesh](auto l, auto r) { - return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); - }; - - const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); - - const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); - - - if (rel_noise_magnitude > 0) - { - if (!CGAL::is_triangle_mesh(pmesh)) - return; - - SMesh::Property_map vnm; - boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); - assert(created); - - CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); - - PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - } - else { - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - - } - - - - //PMP::interpolated_corrected_mean_curvature( - // pmesh, - // mean_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - //PMP::interpolated_corrected_gaussian_curvature( - // pmesh, - // gaussian_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - - - const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - - std::cout << "# " << mesh_path << ":\n" - << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" - << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" - << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" - << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; + CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); + + PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) + ); + } + else { + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + ); + + } + + + + //PMP::interpolated_corrected_mean_curvature( + // pmesh, + // mean_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + //PMP::interpolated_corrected_gaussian_curvature( + // pmesh, + // gaussian_curvature_map, + // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) + //); + + + const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); + const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); + + std::cout << "# " << mesh_path << ":\n" + << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" + << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" + << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" + << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; } int main() { - const std::vector mesh_pathes_to_test = { - "meshes/icc_test/Sphere Quads + Tris.obj", - "meshes/icc_test/Sphere Quads + Tris 100352.obj", - "meshes/icc_test/Sphere Tris Ico.obj", - "meshes/icc_test/Sphere Tris Tet.obj", - "meshes/icc_test/Sphere Tris Oct.obj", - "meshes/icc_test/Sphere Quads.obj", - "meshes/icc_test/Sphere Quads Remesh.obj", - "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", - "meshes/icc_test/Cube with fillet Quads.obj", - "meshes/cylinder.off", - "meshes/icc_test/Lantern Tris.obj", - "meshes/icc_test/Lantern Quads.obj" - }; - - const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; - const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; - - for (auto mesh_path : mesh_pathes_to_test) { - for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) - for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) - { - test(mesh_path, rel_expansion_radius, rel_noise_magnitude); - } - - std::cout << "_________________________________________________________________________________\n\n"; - } + const std::vector mesh_pathes_to_test = { + "meshes/icc_test/Sphere Quads + Tris.obj", + "meshes/icc_test/Sphere Quads + Tris 100352.obj", + "meshes/icc_test/Sphere Tris Ico.obj", + "meshes/icc_test/Sphere Tris Tet.obj", + "meshes/icc_test/Sphere Tris Oct.obj", + "meshes/icc_test/Sphere Quads.obj", + "meshes/icc_test/Sphere Quads Remesh.obj", + "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", + "meshes/icc_test/Cube with fillet Quads.obj", + "meshes/cylinder.off", + "meshes/icc_test/Lantern Tris.obj", + "meshes/icc_test/Lantern Quads.obj" + }; + + const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; + const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; + + for (auto mesh_path : mesh_pathes_to_test) { + for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) + for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) + { + test(mesh_path, rel_expansion_radius, rel_noise_magnitude); + } + + std::cout << "_________________________________________________________________________________\n\n"; + } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index c69b73694980..db26f59168a8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -658,13 +658,13 @@ private Q_SLOTS: if(does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("v:interpolated_corrected_mean_curvature"); + sm_item->face_graph()->property_map("v:interpolated_corrected_mean_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("v:interpolated_corrected_gaussian_curvature"); + sm_item->face_graph()->property_map("v:interpolated_corrected_gaussian_curvature"); if (does_exist) - sm_item->face_graph()->remove_property_map(pmap); + sm_item->face_graph()->remove_property_map(pmap); }); QApplication::restoreOverrideCursor(); sm_item->invalidateOpenGLBuffers(); @@ -704,13 +704,13 @@ private Q_SLOTS: dock_widget->zoomToMaxButton->setEnabled(jacobian_max.count(sm_item)>0); break; case 4: - dock_widget->zoomToMinButton->setEnabled(mean_curvature_min.count(sm_item) > 0); - dock_widget->zoomToMaxButton->setEnabled(mean_curvature_max.count(sm_item) > 0); - break; + dock_widget->zoomToMinButton->setEnabled(mean_curvature_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(mean_curvature_max.count(sm_item) > 0); + break; case 5: - dock_widget->zoomToMinButton->setEnabled(gaussian_curvature_min.count(sm_item) > 0); - dock_widget->zoomToMaxButton->setEnabled(gaussian_curvature_max.count(sm_item) > 0); - break; + dock_widget->zoomToMinButton->setEnabled(gaussian_curvature_min.count(sm_item) > 0); + dock_widget->zoomToMaxButton->setEnabled(gaussian_curvature_max.count(sm_item) > 0); + break; default: break; } @@ -745,13 +745,13 @@ private Q_SLOTS: std::tie(mean_curvature, found) = smesh.property_map("v:interpolated_corrected_mean_curvature"); if (found) { - smesh.remove_property_map(mean_curvature); + smesh.remove_property_map(mean_curvature); } SMesh::Property_map gaussian_curvature; std::tie(gaussian_curvature, found) = smesh.property_map("v:interpolated_corrected_gaussian_curvature"); if (found) { - smesh.remove_property_map(gaussian_curvature); + smesh.remove_property_map(gaussian_curvature); } } @@ -795,54 +795,54 @@ private Q_SLOTS: void setExpandingRadius(int val_int) { - double sliderMin = dock_widget->expandingRadiusSlider->minimum(); - double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; - double val = val_int - sliderMin; - sliderMin = 0; + double sliderMin = dock_widget->expandingRadiusSlider->minimum(); + double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; + double val = val_int - sliderMin; + sliderMin = 0; - SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); + SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); - auto vpm = get(CGAL::vertex_point, smesh); + auto vpm = get(CGAL::vertex_point, smesh); - if (maxEdgeLength < 0) + if (maxEdgeLength < 0) + { + auto edge_range = CGAL::edges(smesh); + + if (edge_range.begin() == edge_range.end()) { - auto edge_range = CGAL::edges(smesh); - - if (edge_range.begin() == edge_range.end()) - { - expand_radius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); - return; - } - - auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { - auto res = EPICK().compare_squared_distance_3_object()( - get(vpm, source((l), smesh)), - get(vpm, target((l), smesh)), - get(vpm, source((r), smesh)), - get(vpm, target((r), smesh))); - return res == CGAL::SMALLER; - }); - - // if edge_reference is not derefrenceble - if (edge_reference == edge_range.end()) - { - expand_radius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); - return; - } - - maxEdgeLength = sqrt( - (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) - .squared_length() - ); - + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + return; + } + + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return res == CGAL::SMALLER; + }); + + // if edge_reference is not derefrenceble + if (edge_reference == edge_range.end()) + { + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + return; } + + maxEdgeLength = sqrt( + (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) + .squared_length() + ); + + } - double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; + double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; - expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); } @@ -864,45 +864,45 @@ private Q_SLOTS: smesh.add_property_map(tied_string, 0); if (non_init) { - if (vnm_exists) { - if (mu_index == MEAN_CURVATURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); - else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); - } - else { - if (mu_index == MEAN_CURVATURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); - else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); - } - double res_min = ARBITRARY_DBL_MAX, - res_max = -ARBITRARY_DBL_MAX; - SMesh::Vertex_index min_index, max_index; - for (SMesh::Vertex_index v : vertices(smesh)) + if (vnm_exists) { + if (mu_index == MEAN_CURVATURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + else + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + } + else { + if (mu_index == MEAN_CURVATURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + else + PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + } + double res_min = ARBITRARY_DBL_MAX, + res_max = -ARBITRARY_DBL_MAX; + SMesh::Vertex_index min_index, max_index; + for (SMesh::Vertex_index v : vertices(smesh)) + { + if (mu_i_map[v] > res_max) { - if (mu_i_map[v] > res_max) - { - res_max = mu_i_map[v]; - max_index = v; - } - if (mu_i_map[v] < res_min) - { - res_min = mu_i_map[v]; - min_index = v; - } - } - if (mu_index == MEAN_CURVATURE){ - mean_curvature_max[item] = std::make_pair(res_max, max_index); - mean_curvature_min[item] = std::make_pair(res_min, min_index); + res_max = mu_i_map[v]; + max_index = v; } - else { - gaussian_curvature_max[item] = std::make_pair(res_max, max_index); - gaussian_curvature_min[item] = std::make_pair(res_min, min_index); + if (mu_i_map[v] < res_min) + { + res_min = mu_i_map[v]; + min_index = v; } + } + if (mu_index == MEAN_CURVATURE){ + mean_curvature_max[item] = std::make_pair(res_max, max_index); + mean_curvature_min[item] = std::make_pair(res_min, min_index); + } + else { + gaussian_curvature_max[item] = std::make_pair(res_max, max_index); + gaussian_curvature_min[item] = std::make_pair(res_min, min_index); + } - connect(item, &Scene_surface_mesh_item::itemChanged, - this, &DisplayPropertyPlugin::resetProperty); + connect(item, &Scene_surface_mesh_item::itemChanged, + this, &DisplayPropertyPlugin::resetProperty); } treat_sm_property(tied_string, item->face_graph()); } @@ -1271,20 +1271,20 @@ private Q_SLOTS: break; case 4: { - ::zoomToId(*item->face_graph(), - QString("v%1").arg(mean_curvature_min[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + ::zoomToId(*item->face_graph(), + QString("v%1").arg(mean_curvature_min[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); } break; case 5: { - ::zoomToId(*item->face_graph(), - QString("v%1").arg(gaussian_curvature_min[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + ::zoomToId(*item->face_graph(), + QString("v%1").arg(gaussian_curvature_min[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); } break; break; @@ -1324,20 +1324,20 @@ private Q_SLOTS: break; case 4: { - ::zoomToId(*item->face_graph(), - QString("v%1").arg(mean_curvature_max[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + ::zoomToId(*item->face_graph(), + QString("v%1").arg(mean_curvature_max[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); } break; case 5: { - ::zoomToId(*item->face_graph(), - QString("v%1").arg(gaussian_curvature_max[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + ::zoomToId(*item->face_graph(), + QString("v%1").arg(gaussian_curvature_max[item].second), + getActiveViewer(), + dummy_fd, + dummy_p); } break; default: From e79e34df4fe4e69279865c3b8294159774ad04dc Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 16 Nov 2022 12:53:43 +0200 Subject: [PATCH 0081/1398] trim trailing whitespaces --- .../Plugins/Display/Display_property_plugin.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index db26f59168a8..6efc7f213fe2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -807,14 +807,14 @@ private Q_SLOTS: if (maxEdgeLength < 0) { auto edge_range = CGAL::edges(smesh); - + if (edge_range.begin() == edge_range.end()) { expand_radius = 0; dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); return; } - + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { auto res = EPICK().compare_squared_distance_3_object()( get(vpm, source((l), smesh)), @@ -823,7 +823,7 @@ private Q_SLOTS: get(vpm, target((r), smesh))); return res == CGAL::SMALLER; }); - + // if edge_reference is not derefrenceble if (edge_reference == edge_range.end()) { @@ -831,12 +831,12 @@ private Q_SLOTS: dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); return; } - + maxEdgeLength = sqrt( (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) .squared_length() ); - + } double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; From 400f9de47c68df5ac92a9eba42f0865af1c60515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 17 Nov 2022 19:49:42 +0100 Subject: [PATCH 0082/1398] first draft version for getting the triangulation of a face WARNING: COMPILATION NOT TESTED! --- .../triangulate_faces.h | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h index 0b48967f2733..abe56ea35a61 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h @@ -499,6 +499,153 @@ bool triangulate_face(typename boost::graph_traits::face_descriptor return modifier.triangulate_face(f, pmesh, use_cdt, visitor); } + +#ifndef CGAL_TRIANGULATE_FACES_DO_NOT_USE_CDT2 +template +OutputIterator +face_triangulation(typename boost::graph_traits::face_descriptor f, + PolygonMesh& pmesh, + OutputIterator out, + const NamedParameters& np = parameters::default_values()) +{ + using parameters::choose_parameter; + using parameters::get_parameter; + + //VertexPointMap + typedef typename GetVertexPointMap::type VPMap; + VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_property_map(vertex_point, pmesh)); + + //Kernel + typedef typename GetGeomTraits::type Kernel; + Kernel traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + + //Face_info + typedef typename internal::Triangulate_modifier>::Face_info Face_info; + + //CDT + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef CGAL::Projection_traits_3 P_traits; + typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; + typedef CGAL::Triangulation_face_base_with_info_2 Fb1; + typedef CGAL::Constrained_triangulation_face_base_2 Fb; + typedef CGAL::Triangulation_data_structure_2 TDS; + typedef CGAL::Exact_intersections_tag Itag; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; + P_traits cdt_traits(normal); + CDT cdt(cdt_traits); + + std::size_t original_size = CGAL::halfedges_around_face(halfedge(f, pmesh), pmesh).size(); + + // Halfedge_around_facet_circulator + typedef typename CDT::Vertex_handle Tr_Vertex_handle; + halfedge_descriptor start = halfedge(f, pmesh); + halfedge_descriptor h = start; + Tr_Vertex_handle previous, first; + do + { + Tr_Vertex_handle vh = cdt.insert(get(_vpmap, target(h, pmesh))); + if (first == Tr_Vertex_handle()) { + first = vh; + } + vh->info() = h; + if(previous != Tr_Vertex_handle() && previous != vh) { + cdt.insert_constraint(previous, vh); + } + previous = vh; + h = next(h, pmesh); + + } while( h != start ); + cdt.insert_constraint(previous, first); + + // sets mark is_external + for(typename CDT::All_faces_iterator fit = cdt.all_faces_begin(), + end = cdt.all_faces_end(); + fit != end; ++fit) + { + fit->info().is_external = false; + } + std::queue face_queue; + face_queue.push(cdt.infinite_vertex()->face()); + while(! face_queue.empty() ) + { + typename CDT::Face_handle fh = face_queue.front(); + face_queue.pop(); + + if(fh->info().is_external) + continue; + + fh->info().is_external = true; + for(int i = 0; i <3; ++i) + { + if(!cdt.is_constrained(typename CDT::Edge(fh, i))) + { + face_queue.push(fh->neighbor(i)); + } + } + } + + if(cdt.dimension() != 2 || cdt.number_of_vertices() != original_size) + return out; + + for(typename CDT::Finite_edges_iterator eit = cdt.finite_edges_begin(), + end = cdt.finite_edges_end(); + eit != end; ++eit) + { + typename CDT::Face_handle fh = eit->first; + const int index = eit->second; + typename CDT::Face_handle opposite_fh = fh->neighbor(eit->second); + const int opposite_index = opposite_fh->index(fh); + + const Tr_Vertex_handle va = fh->vertex(cdt. cw(index)); + const Tr_Vertex_handle vb = fh->vertex(cdt.ccw(index)); + + if( ! (is_external(fh) && is_external(opposite_fh))//not both fh are external + && ! cdt.is_constrained(*eit) ) //and edge is not constrained + { + // strictly internal edge + halfedge_descriptor hnew = halfedge(add_edge(pmesh), pmesh), + hnewopp = opposite(hnew, pmesh); + + fh->info().e[index] = hnew; + opposite_fh->info().e[opposite_index] = hnewopp; + + set_target(hnew, target(va->info(), pmesh), pmesh); + set_target(hnewopp, target(vb->info(), pmesh), pmesh); + } + if( cdt.is_constrained(*eit) ) //edge is constrained + { + if(!is_external(fh)) { + fh->info().e[index] = va->info(); + } + if(!is_external(opposite_fh)) { + opposite_fh->info().e[opposite_index] = vb->info(); + } + } + } + for(typename CDT::Finite_faces_iterator fit = cdt.finite_faces_begin(), + end = cdt.finite_faces_end(); + fit != end; ++fit) + { + if(!is_external(fit)) + { + halfedge_descriptor h0 = fit->info().e[0]; + halfedge_descriptor h1 = fit->info().e[1]; + halfedge_descriptor h2 = fit->info().e[2]; + *out++=std::make_tuple(target(h0, pmesh), target(h1, pmesh), target(h2,pmesh)); + } + } + + return out; +} +#endif + + + /** * \ingroup PMP_meshing_grp * From 80e3522eaa294462a26c758745908c5ff5cc9ffb Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:56:08 +0200 Subject: [PATCH 0083/1398] incomplete (single vertex curvature) --- ...nterpolated_corrected_curvature_measures.h | 465 +++++++++++++++++- 1 file changed, 455 insertions(+), 10 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 4006b761679f..3f118bdba45d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -598,7 +598,7 @@ namespace internal { private: - void interpolated_corrected_all_measures_all_faces() + void interpolated_corrected_selected_measures_all_faces() { std::vector x; std::vector u; @@ -629,23 +629,239 @@ namespace internal { Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) { - Vertex_measures vertex_curvatures; + Vertex_measures vertex_measures; for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - vertex_curvatures.area_measure += get(mu0_map, f); + vertex_measures.area_measure += get(mu0_map, f); if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += get(mu1_map, f); + vertex_measures.mean_curvature_measure += get(mu1_map, f); if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += get(mu2_map, f); + vertex_measures.gaussian_curvature_measure += get(mu2_map, f); if (is_principal_curvature_selected) { const std::array face_anisotropic_measure = get(muXY_map, f); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += face_anisotropic_measure[i]; + } + } + + return vertex_measures; + } + + Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) + { + std::queue bfs_queue; + std::unordered_set bfs_visited; + + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + + Vertex_measures vertex_measures; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_queue.push(f); + bfs_visited.insert(f); + } + } + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); + + // looping over vertices in face to get point coordinates + std::vector x; + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + } + + const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); + + if (f_ratio != 0.0) + { + vertex_measures.area_measure += f_ratio * get(mu0_map, fi); + + if (is_mean_curvature_selected) + vertex_measures.mean_curvature_measure += f_ratio * get(mu1_map, fi); + + if (is_gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); + + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, fi); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } + + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) + { + bfs_queue.push(fj); + bfs_visited.insert(fj); + } + } + } + } + return vertex_measures; + } + + void compute_selected_curvatures() { + interpolated_corrected_selected_measures_all_faces(); + + for (Vertex_descriptor v : vertices(pmesh)) + { + Vertex_measures vertex_measures = (ball_radius < 0) ? + expand_interpolated_corrected_measure_vertex_no_radius(v) : + expand_interpolated_corrected_measure_vertex(v); + + if (is_mean_curvature_selected) { + vertex_measures.area_measure != 0 ? + put(mean_curvature_map, v, 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure) : + put(mean_curvature_map, v, 0); + } + + if (is_gaussian_curvature_selected) { + vertex_measures.area_measure != 0 ? + put(gaussian_curvature_map, v, vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure) : + put(gaussian_curvature_map, v, 0); + } + + if (is_principal_curvature_selected) { + const Vector_3 v_normal = get(vnm, v); + const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( + vertex_measures.anisotropic_measure, + vertex_measures.area_measure, + v_normal + ); + put(principal_curvature_map, v, principal_curvature); + } + } + } + }; + + template + class Interpolated_corrected_curvatures_point_computer + { + typedef typename GetGeomTraits::type GT; + + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + + typedef typename GetVertexPointMap::const_type Vertex_position_map; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + + private: + const PolygonMesh& pmesh; + Vertex_position_map vpm; + Vertex_normal_map vnm; + FT ball_radius; + + bool is_mean_curvature_selected; + bool is_gaussian_curvature_selected; + bool is_principal_curvature_selected; + + Point_3 point; + + void set_named_params(const NamedParameters& np) + { + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); + + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + + const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + + is_mean_curvature_selected = !is_default_parameter::value; + is_gaussian_curvature_selected = !is_default_parameter::value; + is_principal_curvature_selected = !is_default_parameter::value; + + set_ball_radius(radius); + } + + void set_ball_radius(const FT radius) { + if (radius == 0) + ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + ball_radius = radius; + } + + public: + + Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, + const NamedParameters& np = parameters::default_values() + ) : + pmesh(pmesh) + { + set_named_params(np); + + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) + { + set_property_maps(); + + compute_selected_curvatures(); + } + } + + private: + Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) + { + Vertex_measures vertex_curvatures; + + std::vector x; + std::vector u; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + Point_3 p = get(vpm, v); + x.push_back(Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); + } + + vertex_curvatures.area_measure += interpolated_corrected_area_measure_face(u, x); + + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); + + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); + + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); for (std::size_t i = 0; i < 3 * 3; i++) vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; } + + x.clear(); + u.clear(); } return vertex_curvatures; @@ -668,12 +884,15 @@ namespace internal { bfs_visited.insert(f); } } + + std::vector x; + std::vector u; + while (!bfs_queue.empty()) { Face_descriptor fi = bfs_queue.front(); bfs_queue.pop(); // looping over vertices in face to get point coordinates - std::vector x; for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) { Point_3 pi = get(vpm, vi); @@ -684,6 +903,11 @@ namespace internal { if (f_ratio != 0.0) { + for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + u.push_back(get(vnm, vi)); + } + vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); if (is_mean_curvature_selected) @@ -699,6 +923,9 @@ namespace internal { vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; } + x.clear(); + u.clear(); + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) { if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) @@ -713,13 +940,11 @@ namespace internal { } void compute_selected_curvatures() { - interpolated_corrected_all_measures_all_faces(); - for (Vertex_descriptor v : vertices(pmesh)) { Vertex_measures vertex_curvatures = (ball_radius < 0) ? - expand_interpolated_corrected_measure_vertex_no_radius(v) : - expand_interpolated_corrected_measure_vertex(v); + compute_expanded_interpolated_corrected_measure_vertex_no_radius(v) : + compute_expanded_interpolated_corrected_measure_vertex(v); if (is_mean_curvature_selected) { vertex_curvatures.area_measure != 0 ? @@ -745,7 +970,227 @@ namespace internal { } } + }; + template + class Interpolated_corrected_curvatures_element_computer + { + typedef typename GetGeomTraits::type GT; + + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + + typedef typename GetVertexPointMap::const_type Vertex_position_map; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + + private: + const PolygonMesh& pmesh; + Vertex_position_map vpm; + Vertex_normal_map vnm; + FT ball_radius; + + bool is_mean_curvature_selected; + bool is_gaussian_curvature_selected; + bool is_principal_curvature_selected; + + void set_named_params(const NamedParameters& np) + { + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); + + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + + const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + + is_mean_curvature_selected = !is_default_parameter::value; + is_gaussian_curvature_selected = !is_default_parameter::value; + is_principal_curvature_selected = !is_default_parameter::value; + + set_ball_radius(radius); + } + + void set_ball_radius(const FT radius) { + if (radius == 0) + ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + ball_radius = radius; + } + + public: + + Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, + const NamedParameters& np = parameters::default_values() + ) : + pmesh(pmesh) + { + set_named_params(np); + + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) + { + set_property_maps(); + } + } + + private: + Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) + { + Vertex_measures vertex_curvatures; + + std::vector x; + std::vector u; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + Point_3 p = get(vpm, v); + x.push_back(Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); + } + + vertex_curvatures.area_measure += interpolated_corrected_area_measure_face(u, x); + + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); + + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); + + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; + } + + x.clear(); + u.clear(); + } + + return vertex_curvatures; + } + + Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) + { + std::queue bfs_queue; + std::unordered_set bfs_visited; + + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + + Vertex_measures vertex_curvatures; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_queue.push(f); + bfs_visited.insert(f); + } + } + + std::vector x; + std::vector u; + + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); + + // looping over vertices in face to get point coordinates + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + } + + const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); + + if (f_ratio != 0.0) + { + for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) + { + u.push_back(get(vnm, vi)); + } + + vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); + + if (is_mean_curvature_selected) + vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); + + if (is_gaussian_curvature_selected) + vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); + + if (is_principal_curvature_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, fi); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } + + x.clear(); + u.clear(); + + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) + { + bfs_queue.push(fj); + bfs_visited.insert(fj); + } + } + } + } + return vertex_curvatures; + } + + void compute_selected_curvatures() { + for (Vertex_descriptor v : vertices(pmesh)) + { + Vertex_measures vertex_curvatures = (ball_radius < 0) ? + compute_expanded_interpolated_corrected_measure_vertex_no_radius(v) : + compute_expanded_interpolated_corrected_measure_vertex(v); + + if (is_mean_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : + put(mean_curvature_map, v, 0); + } + + if (is_gaussian_curvature_selected) { + vertex_curvatures.area_measure != 0 ? + put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : + put(gaussian_curvature_map, v, 0); + } + + if (is_principal_curvature_selected) { + const Vector_3 v_normal = get(vnm, v); + const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( + vertex_curvatures.anisotropic_measure, + vertex_curvatures.area_measure, + v_normal + ); + put(principal_curvature_map, v, principal_curvature); + } + } + } }; From e302b02f764301209548fae1c435f8a92c892d02 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 11:02:26 +0200 Subject: [PATCH 0084/1398] Docs: adding bibtex, ack of DGtal, Authors + Renaming vars + minor fix + removing last commit's approach --- Documentation/doc/biblio/geom.bib | 11 + .../PackageDescription.txt | 2 +- .../Polygon_mesh_processing.txt | 11 +- ...erpolated_corrected_curvatures_example.cpp | 14 +- ...orrected_curvatures_polyhedron_example.cpp | 10 +- ...nterpolated_corrected_curvature_measures.h | 496 +----------------- ..._corrected_principal_curvatures_plugin.cpp | 22 +- .../internal/parameters_interface.h | 2 +- 8 files changed, 66 insertions(+), 502 deletions(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 270f537e1394..37c42071a85f 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -152060,6 +152060,7 @@ @article{cvl-ew-12 Pages = {215--224}, Year = {2012}, Url = {http://monge.univ-mlv.fr/~colinde/pub/09edgewidth.pdf} +} @inproceedings{tang2009interactive, title={Interactive Hausdorff distance computation for general polygonal models}, @@ -152071,3 +152072,13 @@ @inproceedings{tang2009interactive year={2009}, organization={ACM} } + +@article{lachaud2020, + author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert and David Coeurjolly}, + journal = {Computer Graphics Forum (Proceedings of Symposium on Geometry Processing)}, + number = {5}, + title = {Interpolated corrected curvature measures for polygonal surfaces}, + volume = {39}, + month = jul, + year = {2020} +} diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 93f25c89f1fb..5090535be250 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -203,7 +203,7 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. \cgalCRPSection{Corrected Curvature Functions} - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` - `CGAL::Polygon_mesh_processing::Principal_curvature` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 7932051ec000..2347ae1c7ae8 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -879,10 +879,7 @@ not provide storage for the normals. **************************************** \section PMPICC Computing Curvatures -This package provides methods to compute curvatures on polygonal meshes based on - - Interpolated corrected curvature measures for polygonal surfaces -. +This package provides methods to compute curvatures on polygonal meshes based on \cgalCite{lachaud2020} This includes mean curvature, gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces. The algorithms used prove to work well in general. Also, on meshes with noise @@ -895,7 +892,7 @@ Polyhedron_3 and other polygonal mesh structures based on the Face Graph Model. These computations are performed using : - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` Where it is recommended to use the last function for computing multiple curvatures (example: mean and gaussian) @@ -1145,6 +1142,10 @@ available on 7th of October 2020. It only uses the high level algorithm of chec is covered by a set of prisms, where each prism is an offset for an input triangle. That is, the implementation in \cgal does not use indirect predicates. +The interpolated corrected curvatures were implemented during GSoC 2022. This was implemented by Hossam Saeed and under +supervision of Sebastien Loriot, Jaques-Olivier Lachaud and David Coeurjolly. The implementation is based \cgalCite{lachaud2020}. +DGtal's implementation was also +used as a reference during the project. */ } /* namespace CGAL */ diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 7bf182c3ce3d..71aa06a8caec 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -38,10 +38,10 @@ int main(int argc, char* argv[]) assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> principal_curvature_map; + Surface_Mesh::Property_map> principal_curvatures_and_directions_map; - boost::tie(principal_curvature_map, created) = smesh.add_property_map> - ("v:principal_curvature_map", { 0, 0, + boost::tie(principal_curvatures_and_directions_map, created) = smesh.add_property_map> + ("v:principal_curvatures_and_directions_map", { 0, 0, Epic_kernel::Vector_3(0,0,0), Epic_kernel::Vector_3(0,0,0) }); assert(created); @@ -57,9 +57,9 @@ int main(int argc, char* argv[]) gaussian_curvature_map ); - PMP::interpolated_corrected_principal_curvatures( + PMP::interpolated_corrected_principal_curvatures_and_directions( smesh, - principal_curvature_map + principal_curvatures_and_directions_map ); // uncomment this to compute a curvature while specifying named parameters @@ -83,12 +83,12 @@ int main(int argc, char* argv[]) PMP::interpolated_corrected_curvatures( smesh, CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) - .vertex_principal_curvature_map(principal_curvature_map) + .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map) ); for (vertex_descriptor v : vertices(smesh)) { - auto PC = principal_curvature_map[v]; + auto PC = principal_curvatures_and_directions_map[v]; std::cout << v.idx() << ": HC = " << mean_curvature_map[v] << ", GC = " << gaussian_curvature_map[v] << "\n" << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 929fc8d96a67..50fe1a014d8e 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); boost::property_map>>::type - principal_curvature_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); + principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); PMP::interpolated_corrected_mean_curvature( polyhedron, @@ -41,9 +41,9 @@ int main(int argc, char *argv[]) polyhedron, gaussian_curvature_map); - PMP::interpolated_corrected_principal_curvatures( + PMP::interpolated_corrected_principal_curvatures_and_directions( polyhedron, - principal_curvature_map); + principal_curvatures_and_directions_map); // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) @@ -61,12 +61,12 @@ int main(int argc, char *argv[]) PMP::interpolated_corrected_curvatures( polyhedron, CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) - .vertex_principal_curvature_map(principal_curvature_map)); + .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)); int i = 0; for (vertex_descriptor v : vertices(polyhedron)) { - auto PC = get(principal_curvature_map, v); + auto PC = get(principal_curvatures_and_directions_map, v); std::cout << i << ": HC = " << get(mean_curvature_map, v) << ", GC = " << get(gaussian_curvature_map, v) << "\n" << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 3f118bdba45d..3b02341a2129 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -70,10 +70,10 @@ struct Principal_curvature { typename GT::Vector_3 min_direction, typename GT::Vector_3 max_direction ) { - min_curvature = min_curvature; - max_curvature = max_curvature; - min_direction = min_direction; - max_direction = max_direction; + this->min_curvature = min_curvature; + this->max_curvature = max_curvature; + this->min_direction = min_direction; + this->max_direction = max_direction; } }; @@ -440,7 +440,7 @@ namespace internal { } template - Principal_curvature principal_curvature_from_anisotropic_measures( + Principal_curvature principal_curvatures_and_directions_from_anisotropic_measures( const std::array anisotropic_measure, const typename GT::FT v_mu0, const typename GT::Vector_3 u_GT @@ -510,9 +510,9 @@ namespace internal { Default_scalar_map>::type Vertex_gaussian_curvature_map; typedef Constant_property_map> Default_principal_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvature_map; + Default_principal_map>::type Vertex_principal_curvatures_and_directions_map; typedef typename boost::property_map>::const_type Face_scalar_measure_map; @@ -527,11 +527,11 @@ namespace internal { bool is_mean_curvature_selected; bool is_gaussian_curvature_selected; - bool is_principal_curvature_selected; + bool is_principal_curvatures_and_directions_selected; Vertex_mean_curvature_map mean_curvature_map; Vertex_gaussian_curvature_map gaussian_curvature_map; - Vertex_principal_curvature_map principal_curvature_map; + Vertex_principal_curvatures_and_directions_map principal_curvatures_and_directions_map; Face_scalar_measure_map mu0_map, mu1_map, mu2_map; Face_anisotropic_measure_map muXY_map; @@ -563,11 +563,11 @@ namespace internal { is_mean_curvature_selected = !is_default_parameter::value; is_gaussian_curvature_selected = !is_default_parameter::value; - is_principal_curvature_selected = !is_default_parameter::value; + is_principal_curvatures_and_directions_selected = !is_default_parameter::value; mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); - principal_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvature_map), Default_principal_map()); + principal_curvatures_and_directions_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions_map), Default_principal_map()); set_ball_radius(radius); } @@ -588,7 +588,7 @@ namespace internal { { set_named_params(np); - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvatures_and_directions_selected) { set_property_maps(); @@ -619,7 +619,7 @@ namespace internal { if (is_gaussian_curvature_selected) put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u, x)); - if (is_principal_curvature_selected) + if (is_principal_curvatures_and_directions_selected) put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); x.clear(); @@ -640,7 +640,7 @@ namespace internal { if (is_gaussian_curvature_selected) vertex_measures.gaussian_curvature_measure += get(mu2_map, f); - if (is_principal_curvature_selected) + if (is_principal_curvatures_and_directions_selected) { const std::array face_anisotropic_measure = get(muXY_map, f); for (std::size_t i = 0; i < 3 * 3; i++) @@ -692,7 +692,7 @@ namespace internal { if (is_gaussian_curvature_selected) vertex_measures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); - if (is_principal_curvature_selected) + if (is_principal_curvatures_and_directions_selected) { const std::array face_anisotropic_measure = get(muXY_map, fi); for (std::size_t i = 0; i < 3 * 3; i++) @@ -733,467 +733,19 @@ namespace internal { put(gaussian_curvature_map, v, 0); } - if (is_principal_curvature_selected) { + if (is_principal_curvatures_and_directions_selected) { const Vector_3 v_normal = get(vnm, v); - const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( + const Principal_curvature principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, v_normal ); - put(principal_curvature_map, v, principal_curvature); + put(principal_curvatures_and_directions_map, v, principal_curvatures_and_directions); } } } }; - template - class Interpolated_corrected_curvatures_point_computer - { - typedef typename GetGeomTraits::type GT; - - typedef typename GT::FT FT; - typedef typename GT::Point_3 Point_3; - typedef typename GT::Vector_3 Vector_3; - - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - - typedef typename GetVertexPointMap::const_type Vertex_position_map; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; - - private: - const PolygonMesh& pmesh; - Vertex_position_map vpm; - Vertex_normal_map vnm; - FT ball_radius; - - bool is_mean_curvature_selected; - bool is_gaussian_curvature_selected; - bool is_principal_curvature_selected; - - Point_3 point; - - void set_named_params(const NamedParameters& np) - { - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; - - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - - vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); - - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); - - const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - - is_mean_curvature_selected = !is_default_parameter::value; - is_gaussian_curvature_selected = !is_default_parameter::value; - is_principal_curvature_selected = !is_default_parameter::value; - - set_ball_radius(radius); - } - - void set_ball_radius(const FT radius) { - if (radius == 0) - ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - else - ball_radius = radius; - } - - public: - - Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values() - ) : - pmesh(pmesh) - { - set_named_params(np); - - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) - { - set_property_maps(); - - compute_selected_curvatures(); - } - } - - private: - Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) - { - Vertex_measures vertex_curvatures; - - std::vector x; - std::vector u; - - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - Point_3 p = get(vpm, v); - x.push_back(Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - - vertex_curvatures.area_measure += interpolated_corrected_area_measure_face(u, x); - - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); - - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); - - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; - } - - x.clear(); - u.clear(); - } - - return vertex_curvatures; - } - - Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) - { - std::queue bfs_queue; - std::unordered_set bfs_visited; - - Point_3 vp = get(vpm, v); - Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); - - Vertex_measures vertex_curvatures; - - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); - } - } - - std::vector x; - std::vector u; - - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); - - // looping over vertices in face to get point coordinates - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - Point_3 pi = get(vpm, vi); - x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); - } - - const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); - - if (f_ratio != 0.0) - { - for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - u.push_back(get(vnm, vi)); - } - - vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); - - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); - - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); - - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, fi); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; - } - - x.clear(); - u.clear(); - - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) - { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) - { - bfs_queue.push(fj); - bfs_visited.insert(fj); - } - } - } - } - return vertex_curvatures; - } - - void compute_selected_curvatures() { - for (Vertex_descriptor v : vertices(pmesh)) - { - Vertex_measures vertex_curvatures = (ball_radius < 0) ? - compute_expanded_interpolated_corrected_measure_vertex_no_radius(v) : - compute_expanded_interpolated_corrected_measure_vertex(v); - - if (is_mean_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : - put(mean_curvature_map, v, 0); - } - - if (is_gaussian_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : - put(gaussian_curvature_map, v, 0); - } - - if (is_principal_curvature_selected) { - const Vector_3 v_normal = get(vnm, v); - const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( - vertex_curvatures.anisotropic_measure, - vertex_curvatures.area_measure, - v_normal - ); - put(principal_curvature_map, v, principal_curvature); - } - } - } - - }; - - template - class Interpolated_corrected_curvatures_element_computer - { - typedef typename GetGeomTraits::type GT; - - typedef typename GT::FT FT; - typedef typename GT::Point_3 Point_3; - typedef typename GT::Vector_3 Vector_3; - - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - - typedef typename GetVertexPointMap::const_type Vertex_position_map; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; - - private: - const PolygonMesh& pmesh; - Vertex_position_map vpm; - Vertex_normal_map vnm; - FT ball_radius; - - bool is_mean_curvature_selected; - bool is_gaussian_curvature_selected; - bool is_principal_curvature_selected; - - void set_named_params(const NamedParameters& np) - { - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; - - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); - - vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); - - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); - - const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - - is_mean_curvature_selected = !is_default_parameter::value; - is_gaussian_curvature_selected = !is_default_parameter::value; - is_principal_curvature_selected = !is_default_parameter::value; - - set_ball_radius(radius); - } - - void set_ball_radius(const FT radius) { - if (radius == 0) - ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - else - ball_radius = radius; - } - - public: - - Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values() - ) : - pmesh(pmesh) - { - set_named_params(np); - - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvature_selected) - { - set_property_maps(); - } - } - - private: - Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) - { - Vertex_measures vertex_curvatures; - - std::vector x; - std::vector u; - - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - Point_3 p = get(vpm, v); - x.push_back(Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - - vertex_curvatures.area_measure += interpolated_corrected_area_measure_face(u, x); - - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); - - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); - - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += face_anisotropic_measure[i]; - } - - x.clear(); - u.clear(); - } - - return vertex_curvatures; - } - - Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) - { - std::queue bfs_queue; - std::unordered_set bfs_visited; - - Point_3 vp = get(vpm, v); - Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); - - Vertex_measures vertex_curvatures; - - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); - } - } - - std::vector x; - std::vector u; - - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); - - // looping over vertices in face to get point coordinates - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - Point_3 pi = get(vpm, vi); - x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); - } - - const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); - - if (f_ratio != 0.0) - { - for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - u.push_back(get(vnm, vi)); - } - - vertex_curvatures.area_measure += f_ratio * get(mu0_map, fi); - - if (is_mean_curvature_selected) - vertex_curvatures.mean_curvature_measure += f_ratio * get(mu1_map, fi); - - if (is_gaussian_curvature_selected) - vertex_curvatures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); - - if (is_principal_curvature_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, fi); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_curvatures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; - } - - x.clear(); - u.clear(); - - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) - { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) - { - bfs_queue.push(fj); - bfs_visited.insert(fj); - } - } - } - } - return vertex_curvatures; - } - - void compute_selected_curvatures() { - for (Vertex_descriptor v : vertices(pmesh)) - { - Vertex_measures vertex_curvatures = (ball_radius < 0) ? - compute_expanded_interpolated_corrected_measure_vertex_no_radius(v) : - compute_expanded_interpolated_corrected_measure_vertex(v); - - if (is_mean_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(mean_curvature_map, v, 0.5 * vertex_curvatures.mean_curvature_measure / vertex_curvatures.area_measure) : - put(mean_curvature_map, v, 0); - } - - if (is_gaussian_curvature_selected) { - vertex_curvatures.area_measure != 0 ? - put(gaussian_curvature_map, v, vertex_curvatures.gaussian_curvature_measure / vertex_curvatures.area_measure) : - put(gaussian_curvature_map, v, 0); - } - - if (is_principal_curvature_selected) { - const Vector_3 v_normal = get(vnm, v); - const Principal_curvature principal_curvature = principal_curvature_from_anisotropic_measures( - vertex_curvatures.anisotropic_measure, - vertex_curvatures.area_measure, - v_normal - ); - put(principal_curvature_map, v, principal_curvature); - } - } - } - - }; - } // namespace internal /** @@ -1247,7 +799,7 @@ namespace internal { * \cgalNamedParamsEnd * * @see `interpolated_corrected_gaussian_curvature()` -* @see `interpolated_corrected_principal_curvatures()` +* @see `interpolated_corrected_principal_curvatures_and_directions()` * @see `interpolated_corrected_curvatures()` */ @@ -1311,7 +863,7 @@ template - void interpolated_corrected_principal_curvatures(const PolygonMesh& pmesh, + void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvatures_and_directions_map(vcm)); } /** @@ -1441,7 +993,7 @@ template::%Vertex_descriptor` @@ -1465,7 +1017,7 @@ template diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 21b292b05d0c..09df28bc2816 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -14,7 +14,7 @@ #include using namespace CGAL::Three; -class Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin : +class Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin : public QObject, public Polyhedron_demo_plugin_interface { @@ -47,7 +47,7 @@ public Q_SLOTS: private : Scene_interface *scene; QList _actions; -}; // end Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin +}; // end Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin void compute(SMesh* sMesh, @@ -72,23 +72,23 @@ void compute(SMesh* sMesh, typename boost::property_map::type vpmap = get(CGAL::vertex_point, *sMesh); bool created = false; - SMesh::Property_map principal_curvature_map; + SMesh::Property_map principal_curvatures_and_directions_map; - boost::tie(principal_curvature_map, created) = sMesh->add_property_map - ("v:principal_curvature_map", { 0, 0, + boost::tie(principal_curvatures_and_directions_map, created) = sMesh->add_property_map + ("v:principal_curvatures_and_directions_map", { 0, 0, Vector(0,0,0), Vector(0,0,0)}); assert(created); - PMP::interpolated_corrected_principal_curvatures( + PMP::interpolated_corrected_principal_curvatures_and_directions( *sMesh, - principal_curvature_map + principal_curvatures_and_directions_map ); typename EpicKernel::FT max_curvature_magnitude_on_mesh = 0; for (vertex_descriptor v : vertices(*sMesh)) { - const PrincipalCurvatureTuple pc = principal_curvature_map[v]; + const PrincipalCurvatureTuple pc = principal_curvatures_and_directions_map[v]; max_curvature_magnitude_on_mesh = std::max(max_curvature_magnitude_on_mesh, std::max(abs(get<0>(pc)), get<1>(pc))); } @@ -114,7 +114,7 @@ void compute(SMesh* sMesh, avg_edge_length /= n; } - const PrincipalCurvatureTuple pc = principal_curvature_map[v]; + const PrincipalCurvatureTuple pc = principal_curvatures_and_directions_map[v]; Vector umin = (std::get<0>(pc)/ max_curvature_magnitude_on_mesh) * std::get<2>(pc) * avg_edge_length; Vector umax = (std::get<1>(pc)/ max_curvature_magnitude_on_mesh) * std::get<3>(pc) * avg_edge_length; @@ -133,7 +133,7 @@ void compute(SMesh* sMesh, } } -void Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin::on_actionEstimateCurvature_triggered() +void Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin::on_actionEstimateCurvature_triggered() { // get active polyhedron const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); @@ -183,4 +183,4 @@ void Polyhedron_demo_interpolated_corrected_principal_curvatures_plugin::on_acti QApplication::restoreOverrideCursor(); } -#include "Interpolated_corrected_principal_curvatures_plugin.moc" +#include "Interpolated_corrected_principal_curvatures_and_directions_plugin.moc" 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 03ee822d0bc9..21b8227e86c9 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -89,7 +89,7 @@ CGAL_add_named_parameter(nb_points_per_area_unit_t, nb_points_per_area_unit, num CGAL_add_named_parameter(nb_points_per_distance_unit_t, nb_points_per_distance_unit, number_of_points_per_distance_unit) CGAL_add_named_parameter(vertex_mean_curvature_map_t, vertex_mean_curvature_map, vertex_mean_curvature_map) CGAL_add_named_parameter(vertex_gaussian_curvature_map_t, vertex_gaussian_curvature_map, vertex_gaussian_curvature_map) -CGAL_add_named_parameter(vertex_principal_curvature_map_t, vertex_principal_curvature_map, vertex_principal_curvature_map) +CGAL_add_named_parameter(vertex_principal_curvatures_and_directions_map_t, vertex_principal_curvatures_and_directions_map, vertex_principal_curvatures_and_directions_map) CGAL_add_named_parameter(ball_radius_t, ball_radius, ball_radius) CGAL_add_named_parameter(outward_orientation_t, outward_orientation, outward_orientation) CGAL_add_named_parameter(overlap_test_t, overlap_test, do_overlap_test_of_bounded_sides) From f35faf60e18ace1d90646823bd7c1ff1ff8ddb1e Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 11:54:20 +0200 Subject: [PATCH 0085/1398] minor doc fixes and renaming --- .../PackageDescription.txt | 4 ++-- .../Polygon_mesh_processing.txt | 17 ++++++++-------- ...erpolated_corrected_curvatures_example.cpp | 4 ++-- ...orrected_curvatures_polyhedron_example.cpp | 4 ++-- ...nterpolated_corrected_curvature_measures.h | 20 +++++++++---------- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 5090535be250..f62b2816cf7f 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -200,12 +200,12 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - \link PMP_locate_grp Nearest Face Location Queries \endlink - \link PMP_locate_grp Random Location Generation \endlink -\cgalCRPSection{Corrected Curvature Functions} +\cgalCRPSection{Corrected Curvatures} - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` -- `CGAL::Polygon_mesh_processing::Principal_curvature` +- `CGAL::Polygon_mesh_processing::Principal_curvatures_and_directions` \cgalCRPSection{Normal Computation Functions} - `CGAL::Polygon_mesh_processing::compute_face_normal()` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 2347ae1c7ae8..1d7184561a80 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -879,11 +879,11 @@ not provide storage for the normals. **************************************** \section PMPICC Computing Curvatures -This package provides methods to compute curvatures on polygonal meshes based on \cgalCite{lachaud2020} -This includes mean curvature, gaussian curvature, principal curvatures and directions. -These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces. -The algorithms used prove to work well in general. Also, on meshes with noise -on vertex positions, they give accurate results, on the condition that the +This package provides methods to compute curvatures on polygonal meshes based on Interpolated Corrected Curvatures +on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, gaussian curvature, +principal curvatures and directions. These can be computed on triangle meshes, quad meshes, +and meshes with n-gon faces. The algorithms used prove to work well in general. Also, on meshes +with noise on vertex positions, they give accurate results, on the condition that the correct vertex normals are provided. The implementation is generic in terms of mesh data structure. It can be used on Surface_mesh, @@ -912,13 +912,12 @@ The mean curvature distribution on a bear mesh with different values for the exp Property maps are used to record the computed curvatures as shown in examples. -\subsection ICCExample Interpolated Corrected Curvature Examples Property maps are an API introduced in the boost library that allows associating values to keys. In the following examples, for each property map, we associate a curvature value to each vertex. -\subsubsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh. +\subsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh Example The following example illustrates how to compute the curvatures on vertices @@ -926,7 +925,7 @@ and store them in property maps provided by the class `Surface_mesh`. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp} -\subsubsection ICCExamplePH Interpolated Corrected Curvature on a Polyhedron +\subsection ICCExamplePH Interpolated Corrected Curvature on a Polyhedron Example The following example illustrates how to compute the curvatures on vertices @@ -1143,7 +1142,7 @@ is covered by a set of prisms, where each prism is an offset for an input triang That is, the implementation in \cgal does not use indirect predicates. The interpolated corrected curvatures were implemented during GSoC 2022. This was implemented by Hossam Saeed and under -supervision of Sebastien Loriot, Jaques-Olivier Lachaud and David Coeurjolly. The implementation is based \cgalCite{lachaud2020}. +supervision of Sebastien Loriot, Jaques-Olivier Lachaud and David Coeurjolly. The implementation is based on \cgalCite{lachaud2020}. DGtal's implementation was also used as a reference during the project. diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 71aa06a8caec..33d34cd34f13 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -38,9 +38,9 @@ int main(int argc, char* argv[]) assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> principal_curvatures_and_directions_map; + Surface_Mesh::Property_map> principal_curvatures_and_directions_map; - boost::tie(principal_curvatures_and_directions_map, created) = smesh.add_property_map> + boost::tie(principal_curvatures_and_directions_map, created) = smesh.add_property_map> ("v:principal_curvatures_and_directions_map", { 0, 0, Epic_kernel::Vector_3(0,0,0), Epic_kernel::Vector_3(0,0,0) }); diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 50fe1a014d8e..6bbe49ce37e5 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -30,8 +30,8 @@ int main(int argc, char *argv[]) boost::property_map>::type mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); - boost::property_map>>::type - principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); + boost::property_map>>::type + principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); PMP::interpolated_corrected_mean_curvature( polyhedron, diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 3b02341a2129..6ed11404a257 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -43,7 +43,7 @@ namespace Polygon_mesh_processing { * @tparam GT is the geometric traits class. */ template -struct Principal_curvature { +struct Principal_curvatures_and_directions { /// min curvature magnitude typename GT::FT min_curvature; @@ -57,14 +57,14 @@ struct Principal_curvature { /// max curvature direction vector typename GT::Vector_3 max_direction; - Principal_curvature() { + Principal_curvatures_and_directions() { min_curvature = 0; max_curvature = 0; min_direction = typename GT::Vector_3(0, 0, 0); max_direction = typename GT::Vector_3(0, 0, 0); } - Principal_curvature( + Principal_curvatures_and_directions( typename GT::FT min_curvature, typename GT::FT max_curvature, typename GT::Vector_3 min_direction, @@ -440,7 +440,7 @@ namespace internal { } template - Principal_curvature principal_curvatures_and_directions_from_anisotropic_measures( + Principal_curvatures_and_directions principal_curvatures_and_directions_from_anisotropic_measures( const std::array anisotropic_measure, const typename GT::FT v_mu0, const typename GT::Vector_3 u_GT @@ -462,7 +462,7 @@ namespace internal { eigensolver.computeDirect(v_muXY); if (eigensolver.info() != Eigen::Success) - return Principal_curvature(); + return Principal_curvatures_and_directions(); const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); @@ -470,7 +470,7 @@ namespace internal { const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); - return Principal_curvature( + return Principal_curvatures_and_directions( (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, min_eig_vec, @@ -509,7 +509,7 @@ namespace internal { NamedParameters, Default_scalar_map>::type Vertex_gaussian_curvature_map; - typedef Constant_property_map> Default_principal_map; + typedef Constant_property_map> Default_principal_map; typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvatures_and_directions_map; @@ -735,7 +735,7 @@ namespace internal { if (is_principal_curvatures_and_directions_selected) { const Vector_3 v_normal = get(vnm, v); - const Principal_curvature principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( + const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, v_normal @@ -997,8 +997,8 @@ template::%Vertex_descriptor` -* as key type and `%Principal_curvature` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} +* as key type and `%Principal_curvatures_and_directions` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} * \cgalParamNEnd * From fe8988b650046236a9dc26c39707c915de4c4147 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 12:16:27 +0200 Subject: [PATCH 0086/1398] demo fixes --- .../demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 6efc7f213fe2..404bb20f8072 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -1638,7 +1638,7 @@ private Q_SLOTS: std::unordered_map is_source; - double expand_radius; + double expand_radius = 0; double maxEdgeLength = -1; double minBox; double maxBox; From dd49b0c0d87eb344efc3ef994c32b74ca2916706 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 12:18:28 +0200 Subject: [PATCH 0087/1398] demo fixes --- ..._corrected_principal_curvatures_plugin.cpp | 64 +++++++++---------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 09df28bc2816..789ba4a06567 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -57,42 +57,38 @@ void compute(SMesh* sMesh, Scene_polylines_item* min_negative_curv) { namespace PMP = CGAL::Polygon_mesh_processing; - typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; - typedef EpicKernel::Point_3 Point; - typedef EpicKernel::Point_3 Point; - typedef EpicKernel::Vector_3 Vector; - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef std::tuple< - EpicKernel::FT, - EpicKernel::FT, - Vector, - Vector - > PrincipalCurvatureTuple; + typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; + typedef Epic_kernel::Point_3 Point; + typedef Epic_kernel::Point_3 Point; + typedef Epic_kernel::Vector_3 Vector; + typedef boost::graph_traits::vertex_descriptor Vertex_descriptor; typename boost::property_map::type vpmap = get(CGAL::vertex_point, *sMesh); bool created = false; - SMesh::Property_map principal_curvatures_and_directions_map; + SMesh::Property_map> principal_curvatures_and_directions_map; + + boost::tie(principal_curvatures_and_directions_map, created) = sMesh->add_property_map> + ("v:principal_curvatures_and_directions_map", { 0, 0, + Vector(0,0,0), + Vector(0,0,0) }); + assert(created); - boost::tie(principal_curvatures_and_directions_map, created) = sMesh->add_property_map - ("v:principal_curvatures_and_directions_map", { 0, 0, - Vector(0,0,0), - Vector(0,0,0)}); - assert(created); PMP::interpolated_corrected_principal_curvatures_and_directions( - *sMesh, - principal_curvatures_and_directions_map + *sMesh, + principal_curvatures_and_directions_map, + CGAL::parameters::ball_radius(0) ); - typename EpicKernel::FT max_curvature_magnitude_on_mesh = 0; - for (vertex_descriptor v : vertices(*sMesh)) + typename Epic_kernel::FT max_curvature_magnitude_on_mesh = 0; + for (Vertex_descriptor v : vertices(*sMesh)) { - const PrincipalCurvatureTuple pc = principal_curvatures_and_directions_map[v]; - max_curvature_magnitude_on_mesh = std::max(max_curvature_magnitude_on_mesh, std::max(abs(get<0>(pc)), get<1>(pc))); + const PMP::Principal_curvatures_and_directions pc = principal_curvatures_and_directions_map[v]; + max_curvature_magnitude_on_mesh = std::max(max_curvature_magnitude_on_mesh, std::max(abs(pc.min_curvature), abs(pc.max_curvature))); } - for(vertex_descriptor v : vertices(*sMesh)) + for(Vertex_descriptor v : vertices(*sMesh)) { std::vector points; @@ -107,17 +103,17 @@ void compute(SMesh* sMesh, const std::size_t n = CGAL::edges(*sMesh).size(); - EpicKernel::FT avg_edge_length = 0; + Epic_kernel::FT avg_edge_length = 0; if (n > 0) { - for (auto e : CGAL::edges(*sMesh)) - avg_edge_length += PMP::edge_length(e, *sMesh); - avg_edge_length /= n; + for (auto e : CGAL::edges(*sMesh)) + avg_edge_length += PMP::edge_length(e, *sMesh); + avg_edge_length /= n; } - const PrincipalCurvatureTuple pc = principal_curvatures_and_directions_map[v]; + const PMP::Principal_curvatures_and_directions pc = principal_curvatures_and_directions_map[v]; - Vector umin = (std::get<0>(pc)/ max_curvature_magnitude_on_mesh) * std::get<2>(pc) * avg_edge_length; - Vector umax = (std::get<1>(pc)/ max_curvature_magnitude_on_mesh) * std::get<3>(pc) * avg_edge_length; + Vector umin = (pc.min_curvature / max_curvature_magnitude_on_mesh) * pc.min_direction * avg_edge_length; + Vector umax = (pc.max_curvature / max_curvature_magnitude_on_mesh) * pc.max_direction * avg_edge_length; Scene_polylines_item::Polyline max_segment(2), min_segment(2); @@ -128,8 +124,8 @@ void compute(SMesh* sMesh, max_segment[0] = central_point + du * umax; max_segment[1] = central_point - du * umax; - (std::get<0>(pc) > 0 ? min_curv : min_negative_curv)->polylines.push_back(min_segment); - (std::get<1>(pc) > 0 ? max_curv : max_negative_curv)->polylines.push_back(max_segment); + (pc.min_curvature > 0 ? min_curv : min_negative_curv)->polylines.push_back(min_segment); + (pc.max_curvature > 0 ? max_curv : max_negative_curv)->polylines.push_back(max_segment); } } @@ -183,4 +179,4 @@ void Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_ QApplication::restoreOverrideCursor(); } -#include "Interpolated_corrected_principal_curvatures_and_directions_plugin.moc" +#include "Interpolated_corrected_principal_curvatures_plugin.moc" From d96dca1264c3f53a836d6410165c60910967e005 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 17:16:28 +0200 Subject: [PATCH 0088/1398] Skipping concave n-gons case for now remove face triangulation function draft --- .../triangulate_faces.h | 147 ------------------ 1 file changed, 147 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h index abe56ea35a61..0b48967f2733 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h @@ -499,153 +499,6 @@ bool triangulate_face(typename boost::graph_traits::face_descriptor return modifier.triangulate_face(f, pmesh, use_cdt, visitor); } - -#ifndef CGAL_TRIANGULATE_FACES_DO_NOT_USE_CDT2 -template -OutputIterator -face_triangulation(typename boost::graph_traits::face_descriptor f, - PolygonMesh& pmesh, - OutputIterator out, - const NamedParameters& np = parameters::default_values()) -{ - using parameters::choose_parameter; - using parameters::get_parameter; - - //VertexPointMap - typedef typename GetVertexPointMap::type VPMap; - VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), - get_property_map(vertex_point, pmesh)); - - //Kernel - typedef typename GetGeomTraits::type Kernel; - Kernel traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - - //Face_info - typedef typename internal::Triangulate_modifier>::Face_info Face_info; - - //CDT - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef CGAL::Projection_traits_3 P_traits; - typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; - typedef CGAL::Triangulation_face_base_with_info_2 Fb1; - typedef CGAL::Constrained_triangulation_face_base_2 Fb; - typedef CGAL::Triangulation_data_structure_2 TDS; - typedef CGAL::Exact_intersections_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; - P_traits cdt_traits(normal); - CDT cdt(cdt_traits); - - std::size_t original_size = CGAL::halfedges_around_face(halfedge(f, pmesh), pmesh).size(); - - // Halfedge_around_facet_circulator - typedef typename CDT::Vertex_handle Tr_Vertex_handle; - halfedge_descriptor start = halfedge(f, pmesh); - halfedge_descriptor h = start; - Tr_Vertex_handle previous, first; - do - { - Tr_Vertex_handle vh = cdt.insert(get(_vpmap, target(h, pmesh))); - if (first == Tr_Vertex_handle()) { - first = vh; - } - vh->info() = h; - if(previous != Tr_Vertex_handle() && previous != vh) { - cdt.insert_constraint(previous, vh); - } - previous = vh; - h = next(h, pmesh); - - } while( h != start ); - cdt.insert_constraint(previous, first); - - // sets mark is_external - for(typename CDT::All_faces_iterator fit = cdt.all_faces_begin(), - end = cdt.all_faces_end(); - fit != end; ++fit) - { - fit->info().is_external = false; - } - std::queue face_queue; - face_queue.push(cdt.infinite_vertex()->face()); - while(! face_queue.empty() ) - { - typename CDT::Face_handle fh = face_queue.front(); - face_queue.pop(); - - if(fh->info().is_external) - continue; - - fh->info().is_external = true; - for(int i = 0; i <3; ++i) - { - if(!cdt.is_constrained(typename CDT::Edge(fh, i))) - { - face_queue.push(fh->neighbor(i)); - } - } - } - - if(cdt.dimension() != 2 || cdt.number_of_vertices() != original_size) - return out; - - for(typename CDT::Finite_edges_iterator eit = cdt.finite_edges_begin(), - end = cdt.finite_edges_end(); - eit != end; ++eit) - { - typename CDT::Face_handle fh = eit->first; - const int index = eit->second; - typename CDT::Face_handle opposite_fh = fh->neighbor(eit->second); - const int opposite_index = opposite_fh->index(fh); - - const Tr_Vertex_handle va = fh->vertex(cdt. cw(index)); - const Tr_Vertex_handle vb = fh->vertex(cdt.ccw(index)); - - if( ! (is_external(fh) && is_external(opposite_fh))//not both fh are external - && ! cdt.is_constrained(*eit) ) //and edge is not constrained - { - // strictly internal edge - halfedge_descriptor hnew = halfedge(add_edge(pmesh), pmesh), - hnewopp = opposite(hnew, pmesh); - - fh->info().e[index] = hnew; - opposite_fh->info().e[opposite_index] = hnewopp; - - set_target(hnew, target(va->info(), pmesh), pmesh); - set_target(hnewopp, target(vb->info(), pmesh), pmesh); - } - if( cdt.is_constrained(*eit) ) //edge is constrained - { - if(!is_external(fh)) { - fh->info().e[index] = va->info(); - } - if(!is_external(opposite_fh)) { - opposite_fh->info().e[opposite_index] = vb->info(); - } - } - } - for(typename CDT::Finite_faces_iterator fit = cdt.finite_faces_begin(), - end = cdt.finite_faces_end(); - fit != end; ++fit) - { - if(!is_external(fit)) - { - halfedge_descriptor h0 = fit->info().e[0]; - halfedge_descriptor h1 = fit->info().e[1]; - halfedge_descriptor h2 = fit->info().e[2]; - *out++=std::make_tuple(target(h0, pmesh), target(h1, pmesh), target(h2,pmesh)); - } - } - - return out; -} -#endif - - - /** * \ingroup PMP_meshing_grp * From 0ac812bd2f57e4efbea92c7cbaf0bc5579166dac Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 17:23:15 +0200 Subject: [PATCH 0089/1398] minor change, position shouldn't be optional that is, in area and mean measures, in gaussian, it is not needed --- .../Curvatures/interpolated_corrected_curvature_measures.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 6ed11404a257..f14904c6799a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -111,7 +111,7 @@ namespace internal { template typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, - const std::vector& x = {}) + const std::vector& x) { const std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -166,7 +166,7 @@ namespace internal { template typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, - const std::vector& x = {}) + const std::vector& x) { const std::size_t n = x.size(); CGAL_precondition(u.size() == n); @@ -617,7 +617,7 @@ namespace internal { put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); if (is_gaussian_curvature_selected) - put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u, x)); + put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u)); if (is_principal_curvatures_and_directions_selected) put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); From d5a2cf1f0555a015ea3d17c24624565cbb4aebcc Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 19 Nov 2022 19:27:33 +0200 Subject: [PATCH 0090/1398] fixed an expansion bug when mesh has boundary and no input radius is specified --- .../Curvatures/interpolated_corrected_curvature_measures.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index f14904c6799a..4a50a618e66f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -632,6 +632,9 @@ namespace internal { Vertex_measures vertex_measures; for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f == boost::graph_traits::null_face()) + continue; + vertex_measures.area_measure += get(mu0_map, f); if (is_mean_curvature_selected) From 1fd56cdd1dfd5fa06184c1ea38fe581f29c02fdf Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 20 Nov 2022 00:28:10 +0200 Subject: [PATCH 0091/1398] testing file for implemented functions --- .../Polygon_mesh_processing/CMakeLists.txt | 2 +- ...est_interopolated_corrected_curvatures.cpp | 148 --------------- ...test_interpolated_corrected_curvatures.cpp | 178 ++++++++++++++++++ 3 files changed, 179 insertions(+), 149 deletions(-) delete mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp create mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 808e6d3a05ef..c1aedddedf4e 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -69,7 +69,7 @@ create_single_source_cgal_program("self_intersection_polyhedron_test.cpp") create_single_source_cgal_program("self_intersection_surface_mesh_test.cpp") create_single_source_cgal_program("pmp_do_intersect_test.cpp") create_single_source_cgal_program("test_is_polygon_soup_a_polygon_mesh.cpp") -create_single_source_cgal_program("test_interopolated_corrected_curvatures.cpp") +create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") create_single_source_cgal_program("test_stitching.cpp") create_single_source_cgal_program("remeshing_test.cpp") create_single_source_cgal_program("remeshing_with_isolated_constraints_test.cpp" ) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp deleted file mode 100644 index b2dbcc0850bb..000000000000 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interopolated_corrected_curvatures.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -namespace PMP = CGAL::Polygon_mesh_processing; - -typedef CGAL::Exact_predicates_inexact_constructions_kernel EpicKernel; -typedef CGAL::Surface_mesh SMesh; -typedef boost::graph_traits::face_descriptor face_descriptor; -typedef boost::graph_traits::edge_descriptor edge_descriptor; -typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - -void test(std::string mesh_path, EpicKernel::FT rel_expansion_radius, EpicKernel::FT rel_noise_magnitude) { - SMesh pmesh; - const std::string filename = CGAL::data_file_path(mesh_path); - - if (!CGAL::IO::read_polygon_mesh(filename, pmesh)) - { - std::cerr << "Invalid input file." << std::endl; - } - - bool created = false; - - SMesh::Property_map mean_curvature_map, gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = pmesh.add_property_map("v:mean_curvature_map", 0); - assert(created); - - boost::tie(gaussian_curvature_map, created) = pmesh.add_property_map("v:gaussian_curvature_map", 0); - assert(created); - - // getting the max and min edge lengthes - const auto edge_range = CGAL::edges(pmesh); - - const auto edge_length_comparator = [&, pmesh](auto l, auto r) { - return PMP::edge_length(l, pmesh) < PMP::edge_length(r, pmesh); - }; - - const edge_descriptor longest_edge = *std::max_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT max_edge_length = PMP::edge_length(longest_edge, pmesh); - - const edge_descriptor shortest_edge = *std::min_element(edge_range.begin(), edge_range.end(), edge_length_comparator); - const EpicKernel::FT min_edge_length = PMP::edge_length(shortest_edge, pmesh); - - - if (rel_noise_magnitude > 0) - { - if (!CGAL::is_triangle_mesh(pmesh)) - return; - - SMesh::Property_map vnm; - boost::tie(vnm, created) = pmesh.add_property_map("v:vnm", { 0 , 0 , 0 }); - assert(created); - - CGAL::Polygon_mesh_processing::compute_vertex_normals(pmesh, vnm); - - PMP::random_perturbation(pmesh, rel_noise_magnitude * min_edge_length, CGAL::parameters::random_seed(0)); - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length).vertex_normal_map(vnm) - ); - } - else { - PMP::interpolated_corrected_mean_curvature( - pmesh, - mean_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - PMP::interpolated_corrected_gaussian_curvature( - pmesh, - gaussian_curvature_map, - CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - ); - - } - - - - //PMP::interpolated_corrected_mean_curvature( - // pmesh, - // mean_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - //PMP::interpolated_corrected_gaussian_curvature( - // pmesh, - // gaussian_curvature_map, - // CGAL::parameters::ball_radius(rel_expansion_radius * max_edge_length) - //); - - - const EpicKernel::FT max_mean_curvature = *std::max_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT min_mean_curvature = *std::min_element(mean_curvature_map.begin(), mean_curvature_map.end()); - const EpicKernel::FT max_gaussian_curvature = *std::max_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - const EpicKernel::FT min_gaussian_curvature = *std::min_element(gaussian_curvature_map.begin(), gaussian_curvature_map.end()); - - std::cout << "# " << mesh_path << ":\n" - << "expansion radius ratio to max length / expansion radius = " << rel_expansion_radius << " / " << rel_expansion_radius * max_edge_length << ",\n" - << "max perturbation ratio to minlength / max perturbation = " << rel_noise_magnitude << " / " << rel_noise_magnitude * min_edge_length << "\n" - << "mean curvature: min = " << min_mean_curvature << " <-> " << max_mean_curvature << " = max" << "\n" - << "gaussian curvature: min = " << min_gaussian_curvature << " <-> " << max_gaussian_curvature << " = max" << "\n\n\n"; - - -} - -int main() -{ - const std::vector mesh_pathes_to_test = { - "meshes/icc_test/Sphere Quads + Tris.obj", - "meshes/icc_test/Sphere Quads + Tris 100352.obj", - "meshes/icc_test/Sphere Tris Ico.obj", - "meshes/icc_test/Sphere Tris Tet.obj", - "meshes/icc_test/Sphere Tris Oct.obj", - "meshes/icc_test/Sphere Quads.obj", - "meshes/icc_test/Sphere Quads Remesh.obj", - "meshes/icc_test/Sphere Ngons + Quads + Tris.obj", - "meshes/icc_test/Cube with fillet Quads.obj", - "meshes/cylinder.off", - "meshes/icc_test/Lantern Tris.obj", - "meshes/icc_test/Lantern Quads.obj" - }; - - const std::vector rel_expansion_radii = { 0, 0.1, 0.5, 1 }; - const std::vector rel_noise_magnitudes = { 0, 0.5, 0.9 }; - - for (auto mesh_path : mesh_pathes_to_test) { - for (EpicKernel::FT rel_expansion_radius : rel_expansion_radii) - for (EpicKernel::FT rel_noise_magnitude : rel_noise_magnitudes) - { - test(mesh_path, rel_expansion_radius, rel_noise_magnitude); - } - - std::cout << "_________________________________________________________________________________\n\n"; - } - -} diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp new file mode 100644 index 000000000000..a4f43470332e --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -0,0 +1,178 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#define ABS_ERROR 1e-6 + +namespace PMP = CGAL::Polygon_mesh_processing; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; +typedef CGAL::Surface_mesh SMesh; +typedef CGAL::Polyhedron_3 Polyhedron; + +struct Average_test_info { + Epic_kernel::FT expansion_radius = -1; + Epic_kernel::FT mean_curvature_avg; + Epic_kernel::FT gaussian_curvature_avg; + Epic_kernel::FT principal_curvature_avg; + Epic_kernel::FT tolerance = 0.9; + + Average_test_info( + Epic_kernel::FT mean_curvature_avg, + Epic_kernel::FT gaussian_curvature_avg, + Epic_kernel::FT principal_curvature_avg, + Epic_kernel::FT expansion_radius = -1, + Epic_kernel::FT tolerance = 0.9 + ): + expansion_radius(expansion_radius), + mean_curvature_avg(mean_curvature_avg), + gaussian_curvature_avg(gaussian_curvature_avg), + principal_curvature_avg(principal_curvature_avg), + tolerance(tolerance) + { + } + +}; + +bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_kernel::FT tolerance) +{ + if (abs(expected) < ABS_ERROR && abs(result) < ABS_ERROR) + return true; // expected 0, got 0 + else if (abs(expected) < ABS_ERROR) + return false; // expected 0, got non-0 + + return std::min(result, expected) / std::max(result, expected) > tolerance; +} + +template +void test_average_curvatures(std::string mesh_path, Average_test_info test_info){ + PolygonMesh pmesh; + const std::string filename = CGAL::data_file_path(mesh_path); + + if (!CGAL::IO::read_polygon_mesh(filename, pmesh) || faces(pmesh).size() == 0) + { + std::cerr << "Invalid input file." << std::endl; + } + + typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + + boost::property_map>::type + mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh), + gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh); + boost::property_map>>::type + principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); + + // test_info.expansion_radius -> test if no radius is provided by user. + if (test_info.expansion_radius < 0) { + PMP::interpolated_corrected_mean_curvature(pmesh, mean_curvature_map); + PMP::interpolated_corrected_gaussian_curvature(pmesh, gaussian_curvature_map); + PMP::interpolated_corrected_principal_curvatures_and_directions(pmesh, principal_curvatures_and_directions_map); + } + else { + PMP::interpolated_corrected_mean_curvature( + pmesh, + mean_curvature_map, + CGAL::parameters::ball_radius(test_info.expansion_radius) + ); + + PMP::interpolated_corrected_gaussian_curvature( + pmesh, + gaussian_curvature_map, + CGAL::parameters::ball_radius(test_info.expansion_radius) + ); + + PMP::interpolated_corrected_principal_curvatures_and_directions( + pmesh, + principal_curvatures_and_directions_map, + CGAL::parameters::ball_radius(test_info.expansion_radius) + ); + } + + Epic_kernel::FT mean_curvature_avg = 0, gaussian_curvature_avg = 0, principal_curvature_avg = 0; + + for (vertex_descriptor v : vertices(pmesh)) + { + mean_curvature_avg += get(mean_curvature_map, v); + gaussian_curvature_avg += get(gaussian_curvature_map, v); + principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature + + get(principal_curvatures_and_directions_map, v).max_curvature; + } + + mean_curvature_avg /= vertices(pmesh).size(); + gaussian_curvature_avg /= vertices(pmesh).size(); + principal_curvature_avg /= vertices(pmesh).size() * 2; + + // are average curvatures equal to expected? + assert(passes_comparison(mean_curvature_avg, test_info.mean_curvature_avg, test_info.tolerance)); + assert(passes_comparison(gaussian_curvature_avg, test_info.gaussian_curvature_avg, test_info.tolerance)); + assert(passes_comparison(principal_curvature_avg, test_info.principal_curvature_avg, test_info.tolerance)); + + PMP::interpolated_corrected_curvatures( + pmesh, + CGAL::parameters::ball_radius(test_info.expansion_radius) + .vertex_mean_curvature_map(mean_curvature_map) + .vertex_gaussian_curvature_map(gaussian_curvature_map) + .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map) + ); + + // are average curvatures computed from interpolated_corrected_curvatures() equal to average curvatures each computed on its own? + Epic_kernel::FT new_mean_curvature_avg = 0, new_gaussian_curvature_avg = 0, new_principal_curvature_avg = 0; + + for (vertex_descriptor v : vertices(pmesh)) + { + new_mean_curvature_avg += get(mean_curvature_map, v); + new_gaussian_curvature_avg += get(gaussian_curvature_map, v); + new_principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature + + get(principal_curvatures_and_directions_map, v).max_curvature; + } + + new_mean_curvature_avg /= vertices(pmesh).size(); + new_gaussian_curvature_avg /= vertices(pmesh).size(); + new_principal_curvature_avg /= vertices(pmesh).size() * 2; + + assert(passes_comparison(mean_curvature_avg, new_mean_curvature_avg, 0.99)); + assert(passes_comparison(gaussian_curvature_avg, new_gaussian_curvature_avg, 0.99)); + assert(passes_comparison(principal_curvature_avg, new_principal_curvature_avg, 0.99)); +} + +int main() +{ + // testing on a simple sphere(r = 0.5), on both Polyhedron & SurfaceMesh: + // Expected: Mean Curvature = 2, Gaussian Curvature = 4, Principal Curvatures = 2 & 2 so 2 on avg. + test_average_curvatures("meshes/sphere.off", Average_test_info(2,4,2)); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2)); + + // Same mesh but with specified expansion radii of 0 and 0.25 (half radius of sphere) + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0)); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0.25)); + + // testing on a simple sphere(r = 10), on both Polyhedron & SurfaceMesh: + // Expected: Mean Curvature = 0.1, Gaussian Curvature = 0.01, Principal Curvatures = 0.1 & 0.1 so 0.1 on avg. + test_average_curvatures("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1)); + test_average_curvatures("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1)); + + // Same mesh but with specified expansion radii of 0 and 5 (half radius of sphere) + test_average_curvatures("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1, 0)); + test_average_curvatures("meshes/sphere966.off", Average_test_info(0.1, 0.01, 0.1, 5)); + + // testing on a simple half cylinder(r = 1), on both Polyhedron & SurfaceMesh: + // Expected: Mean Curvature = 0.5, Gaussian Curvature = 0, Principal Curvatures = 0 & 1 so 0.5 on avg. + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5)); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5)); + + // Same mesh but with specified expansion radii of 0 and 0.5 (half radius of cylinder) + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0)); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5)); + + + +} From 2af64657636b1fadbacee3dac9e6b2108e1ffedf Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 20 Nov 2022 00:39:14 +0200 Subject: [PATCH 0092/1398] trailing spaces --- .../test_interpolated_corrected_curvatures.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index a4f43470332e..163c9b8d334d 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -32,13 +32,13 @@ struct Average_test_info { Epic_kernel::FT principal_curvature_avg, Epic_kernel::FT expansion_radius = -1, Epic_kernel::FT tolerance = 0.9 - ): + ): expansion_radius(expansion_radius), mean_curvature_avg(mean_curvature_avg), gaussian_curvature_avg(gaussian_curvature_avg), principal_curvature_avg(principal_curvature_avg), tolerance(tolerance) - { + { } }; From 669ba26a266c4e935a546587d92362fa7ca93814 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 25 Nov 2022 13:00:42 +0100 Subject: [PATCH 0093/1398] Allow the use of Foreach_enabled_attributes internal functor starting from a given dimension. --- .../Combinatorial_map/internal/Combinatorial_map_utility.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h index 542b5ab176a3..340b0551c988 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h @@ -609,13 +609,13 @@ namespace CGAL struct Attribute_const_range { typedef CGAL::Void type; }; - // To iterate onto each enabled attributes - template + // To iterate onto each enabled attributes, starting from n-attributes (0 by default) + template struct Foreach_enabled_attributes { template static void run(Ts& ... t) - { Foreach_static_restricted::run(t...); } + { Foreach_static_restricted::run(t...); } }; // To iterate onto each enabled attributes, except j-attributes template From 45ee81d52266a3fd7a34c484456672ba75c81977 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 25 Nov 2022 13:01:43 +0100 Subject: [PATCH 0094/1398] add insert_cell_1_between_two_cells_2 method in genericmap concept --- .../Combinatorial_map/Concepts/GenericMap.h | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index 8c1c39162128..31bcaf161d65 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -876,6 +876,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `insert_cell_0_in_cell_2` \sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_dangling_cell_1_in_cell_2` \sa `insert_cell_2_in_cell_3` \sa `remove_cell` @@ -896,6 +897,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `insert_cell_0_in_cell_2` \sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_dangling_cell_1_in_cell_2` \sa `insert_cell_2_in_cell_3` \sa `remove_cell` @@ -917,12 +919,40 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `is_insertable_cell_1_in_cell_2` \sa `insert_cell_0_in_cell_1` \sa `insert_cell_0_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_dangling_cell_1_in_cell_2` \sa `insert_cell_2_in_cell_3` \sa `remove_cell` */ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor d1, Dart_descriptor d2); +/*! +Inserts a 1-cell between the 2-cell containing `d1` and the one containing `d2`. Returns `previous(d1)`, a descriptor on one dart belonging to the new 1-cell. +\pre `is_insertable_cell_1_between_two_cells_2(d1,d2)`. + +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, call \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a,a') is called for all enabled i-attributes, for i>=2, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic onmerge function of i-attributes is also called on a and a'. + +\cgalAdvancedBegin +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. +\cgalAdvancedEnd + +\sa `is_insertable_cell_1_between_two_cells_2` +\sa `insert_cell_0_in_cell_1` +\sa `insert_cell_0_in_cell_2` +\sa `insert_cell_1_in_cell_2` +\sa `insert_dangling_cell_1_in_cell_2` +\sa `insert_cell_2_in_cell_3` +\sa `remove_cell` +*/ +Dart_descriptor insert_cell_1_between_two_cells_2(Dart_descriptor d1, Dart_descriptor d2); + +/*! Call `insert_cell_1_in_cell_2` if `is_insertable_cell_1_in_cell_2(d1, d2)`, otherwise call `insert_cell_1_between_two_cells_2`. +\sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` +\sa `is_insertable_cell_1_in_cell_2` +*/ +Dart_descriptor insert_cell_1(Dart_descriptor d1, Dart_descriptor d2); + /*! Inserts a 2-cell along the path of 1-cells containing darts given by the range `[afirst,alast)`. Returns `opposite<2>(*afirst)`, a descriptor on one dart belonging to the new 2-cell. \pre `is_insertable_cell_2_in_cell_3(afirst,alast)`. @@ -939,6 +969,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `insert_cell_0_in_cell_1` \sa `insert_cell_0_in_cell_2` \sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_dangling_cell_1_in_cell_2` \sa `remove_cell` */ @@ -958,6 +989,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `insert_cell_0_in_cell_1` \sa `insert_cell_0_in_cell_2` \sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_cell_2_in_cell_3` \sa `remove_cell` @@ -976,6 +1008,17 @@ This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can be reached from `d2` by u */ bool is_insertable_cell_1_in_cell_2(Dart_const_descriptor d1, Dart_const_descriptor d2); +/*! +Returns true iff it is possible to insert a 1-cell in the generic map between `d1` and `d2`. + +This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can not be reached from `d2` by using some `previous` and `next` calls. +\pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 2, `d1`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink, and `d2`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. + +\sa `insert_cell_1_between_two_cells_2` + +*/ +bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor d1, Dart_const_descriptor d2); + /*! Returns true iff it is possible to insert a 2-cell in the generic map along the path of darts given by the range `[afirst,alast)`. The 2-cell can be inserted iff the ordered list of darts form a closed path of edges inside a same volume. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 3. @@ -1016,6 +1059,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa \sa `insert_cell_0_in_cell_1` \sa `insert_cell_0_in_cell_2` \sa `insert_cell_1_in_cell_2` +\sa `insert_cell_1_between_two_cells_2` \sa `insert_dangling_cell_1_in_cell_2` \sa `insert_cell_2_in_cell_3` */ From 01c05d8f1b2f1c772e5b62881239e31c05485813 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 25 Nov 2022 13:02:32 +0100 Subject: [PATCH 0095/1398] Add index method in cc with index, taking an index as parameter. --- Combinatorial_map/include/CGAL/Compact_container_with_index.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Combinatorial_map/include/CGAL/Compact_container_with_index.h b/Combinatorial_map/include/CGAL/Compact_container_with_index.h index 37d555793b6b..c3ddb24005be 100644 --- a/Combinatorial_map/include/CGAL/Compact_container_with_index.h +++ b/Combinatorial_map/include/CGAL/Compact_container_with_index.h @@ -738,6 +738,9 @@ class Compact_container_with_index size_type index(const_iterator cit) const { return static_cast(cit); } + size_type index(Index idx) const + { return static_cast(idx); } + // Returns whether the iterator "cit" is in the range [begin(), end()]. // This function is mostly useful for purposes of efficient debugging at // higher levels. From bb263e009e859b9f6d2f11d24483dbef9bf17021 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 25 Nov 2022 13:06:50 +0100 Subject: [PATCH 0096/1398] add insert_cell_1_between_two_cells_2 method in CMap and GMap --- .../include/CGAL/Combinatorial_map.h | 90 +++++++++- .../include/CGAL/Generalized_map.h | 165 +++++++++++++----- 2 files changed, 203 insertions(+), 52 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index fa13fbe6d6c4..f16a3779cd99 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -1639,11 +1639,14 @@ namespace CGAL { CGAL_static_assertion(i<=dimension); CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "set_attribute but i-attributes are disabled"); - for ( typename Dart_of_cell_range::iterator it(*this, dh); - it.cont(); ++it) + + for (typename Dart_of_cell_range::iterator it(*this, dh); it.cont(); ++it) { this->template set_dart_attribute(it, ah); } + if(ah!=null_descriptor) + // To ensure that the dart of this attribute is dh + { this->template set_dart_of_attribute(ah, dh); } } /// @return a Attributes_range (range through all the @@ -4410,7 +4413,8 @@ namespace CGAL { bool is_insertable_cell_1_in_cell_2(Dart_const_descriptor adart1, Dart_const_descriptor adart2) const { - if ( adart1==adart2 ) return false; + if (adart1==adart2 || adart1==null_descriptor) return false; + if (adart2==null_descriptor) return true; for ( CMap_dart_const_iterator_of_orbit it(*this,adart1); it.cont(); ++it ) { @@ -4427,15 +4431,81 @@ namespace CGAL { * same vertex than adart1. */ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor adart1, - Dart_descriptor adart2, - bool update_attributes=true) + Dart_descriptor adart2, + bool update_attributes=true) { + CGAL_assertion(is_insertable_cell_1_in_cell_2(adart1, adart2)); if ( adart2==null_descriptor ) return insert_dangling_cell_1_in_cell_2(adart1, null_descriptor, update_attributes); + return generic_insert_cell_1(adart1, adart2, false, update_attributes); + } - CGAL_assertion(is_insertable_cell_1_in_cell_2(adart1, adart2)); + /** Test if an edge can be inserted between two different 2-cells + * between two given darts. + * @param adart1 a first dart. + * @param adart2 a second dart. + * @return true iff an edge can be inserted between adart1 and adart2. + */ + bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor adart1, + Dart_const_descriptor adart2) const + { + if (adart1==adart2 || adart1==null_descriptor || adart2==null_descriptor) + { return false; } + for ( CMap_dart_const_iterator_of_orbit it(*this,adart1); + it.cont(); ++it ) + { + if ( it==adart2 ) return false; + } + return true; + } + /** Insert an edge between two different 2-cells, between two given darts. + * @param adart1 a first dart of the first facet (!=null_descriptor && !=null_dart_descriptor). + * @param adart2 a second dart of the second facet (!=null_descriptor && !=null_dart_descriptor). + * @param update_attributes a boolean to update the enabled attributes + * @return a dart of the new edge, and not incident to the + * same vertex than adart1. + */ + Dart_descriptor insert_cell_1_between_two_cells_2(Dart_descriptor adart1, + Dart_descriptor adart2, + bool update_attributes=true) + { + CGAL_assertion(is_insertable_cell_1_between_two_cells_2(adart1, adart2)); + return generic_insert_cell_1(adart1, adart2, true, update_attributes); + } + + /** Insert an edge between two given darts. If the two darts belong to the same facet, call + * insert_cell_1_in_cell_2, otherwise call insert_cell_1_between_two_cells_2. + * @param adart1 a first dart (!=null_descriptor && !=null_dart_descriptor). + * @param adart2 a second dart. + * @param update_attributes a boolean to update the enabled attributes + * @return a dart of the new edge, and not incident to the + * same vertex than adart1. + */ + Dart_descriptor insert_cell_1(Dart_descriptor adart1, + Dart_descriptor adart2, + bool update_attributes=true) + { + if(is_insertable_cell_1_in_cell_2(adart1, adart2)) + { return insert_cell_1_in_cell_2(adart1, adart2, update_attributes); } + return insert_cell_1_between_two_cells_2(adart1, adart2, update_attributes); + } + + /** Generic method to insert a 1-cell, either in a 2-cell (cf. insert_cell_1_in_cell_2) + * or between two different 2-cells (cf. insert_cell_1_between_two_cells_2). + * Indeed the code is the same, except for the group/degroup attribute. + * merge is true if adart1 and adart2 belongs to two different facets; in this case + * the two facets should be merged (they are now linked by the new edge); + * merge is false it adart1 and adart2 belongs to the same facet; in this case + * the facet is split in two. + * Internal method not supposed to be called by users. + */ + Dart_descriptor generic_insert_cell_1(Dart_descriptor adart1, + Dart_descriptor adart2, + bool merge, + bool update_attributes) + { size_type m1=get_new_mark(); CMap_dart_iterator_basic_of_involution it1(*this, adart1, m1); @@ -4509,7 +4579,13 @@ namespace CGAL { if (are_attributes_automatically_managed() && update_attributes) { - internal::Degroup_attribute_functor_run::run(*this, d1, d2); + if(merge) + { // Here we group all enabled attributes starting from 2 to dimension + Helper::template Foreach_enabled_attributes + , 2>::run(*this, adart1, adart2); + } + else // Here we degroup 2-attributes + { internal::Degroup_attribute_functor_run::run(*this, adart1, adart2); } } negate_mark(m1); diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index 6aa6b56045ea..273d8b32bf27 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -1464,11 +1464,14 @@ namespace CGAL { CGAL_static_assertion(i<=dimension); CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "set_attribute but i-attributes are disabled"); - for ( typename Dart_of_cell_range::iterator it(*this, dh); - it.cont(); ++it) + for (typename Dart_of_cell_range::iterator it(*this, dh); + it.cont(); ++it) { this->template set_dart_attribute(it, ah); } + if(ah!=null_descriptor) + // To ensure that the dart of this attribute is dh + { this->template set_dart_of_attribute(ah, dh); } } /// @return a Attributes_range (range through all the @@ -3512,7 +3515,9 @@ namespace CGAL { bool is_insertable_cell_1_in_cell_2(Dart_const_descriptor adart1, Dart_const_descriptor adart2) { - if ( adart1==adart2 || adart1==this->template alpha<0>(adart2) ) + if (adart2==null_descriptor) return true; + if (adart1==adart2 || adart1==this->template alpha<0>(adart2) || + adart1==null_descriptor || this->template is_free<1>(adart2)) return false; for ( CGAL::GMap_dart_const_iterator_of_orbit it(*this,adart1); it.cont(); ++it ) @@ -3525,29 +3530,104 @@ namespace CGAL { /** Insert an edge in a 2-cell between two given darts. * @param adart1 a first dart of the facet (!=null_descriptor && !=null_dart_descriptor). * @param adart2 a second dart of the facet. If null_descriptor insert a dangling edge. + * @param update_attributes a boolean to update the enabled attributes * @return a dart of the new edge, and not incident to the * same vertex than adart1. */ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor adart1, - Dart_descriptor adart2, - bool update_attributes=true, - typename Attribute_descriptor<0>::type - ah=null_descriptor) + Dart_descriptor adart2, + typename Attribute_descriptor<0>:: + type ah=null_descriptor, + bool update_attributes=true) { - if ( adart2!=null_descriptor) + CGAL_assertion(is_insertable_cell_1_in_cell_2(adart1, adart2)); + return generic_insert_cell_1(adart1, adart2, false, update_attributes, ah); + } + + /** Test if an edge can be inserted between two different 2-cells + * between two given darts. + * @param adart1 a first dart. + * @param adart2 a second dart. + * @return true iff an edge can be inserted between adart1 and adart2. + */ + bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor adart1, + Dart_const_descriptor adart2) const + { + if (adart1==adart2 || adart1==null_descriptor || adart2==null_descriptor) + { return false; } + for ( CGAL::GMap_dart_const_iterator_of_orbit it(*this,adart1); + it.cont(); ++it ) { - CGAL_assertion(is_insertable_cell_1_in_cell_2(adart1, adart2)); + if ( it==adart2 ) return false; } + for(unsigned int d=3; d<=dimension; ++d) + { if(is_free(adart1, d)!=is_free(adart2, d)) { return false; }} + + return true; + } + + /** Insert an edge between two different 2-cells, between two given darts. + * @param adart1 a first dart of the first facet (!=null_descriptor && !=null_dart_descriptor). + * @param adart2 a second dart of the second facet (!=null_descriptor && !=null_dart_descriptor). + * @param update_attributes a boolean to update the enabled attributes + * @return a dart of the new edge, and not incident to the + * same vertex than adart1. + */ + Dart_descriptor insert_cell_1_between_two_cells_2(Dart_descriptor adart1, + Dart_descriptor adart2, + bool update_attributes=true) + { + CGAL_assertion(is_insertable_cell_1_between_two_cells_2(adart1, adart2)); + return generic_insert_cell_1(adart1, adart2, true, update_attributes); + } + + /** Insert an edge between two given darts. If the two darts belong to the same facet, call + * insert_cell_1_in_cell_2, otherwise call insert_cell_1_between_two_cells_2. + * @param adart1 a first dart (!=null_descriptor && !=null_dart_descriptor). + * @param adart2 a second dart. + * @param update_attributes a boolean to update the enabled attributes + * @return a dart of the new edge, and not incident to the + * same vertex than adart1. + */ + Dart_descriptor insert_cell_1(Dart_descriptor adart1, + Dart_descriptor adart2, + bool update_attributes=true, + typename Attribute_descriptor<0>::type + ah=null_descriptor) + { + CGAL_assertion(adart1!=null_descriptor); + if(is_insertable_cell_1_in_cell_2(adart1, adart2)) + { return insert_cell_1_in_cell_2(adart1, adart2, update_attributes, ah); } + return insert_cell_1_between_two_cells_2(adart1, adart2, update_attributes); + } + /** Generic method to insert a 1-cell, either in a 2-cell (cf. insert_cell_1_in_cell_2) + * or between two different 2-cells (cf. insert_cell_1_between_two_cells_2). + * Indeed the code is the same, except for the group/degroup attribute. + * merge is true if adart1 and adart2 belongs to two different facets; in this case + * the two facets should be merged (they are now linked by the new edge); + * merge is false it adart1 and adart2 belongs to the same facet; in this case + * the facet is split in two. + * Internal method not supposed to be called by users. + */ + Dart_descriptor generic_insert_cell_1(Dart_descriptor adart1, + Dart_descriptor adart2, + bool merge, + bool update_attributes=true, + typename Attribute_descriptor<0>::type + ah=null_descriptor) + { /* CGAL::GMap_dart_iterator_basic_of_involution will contain all * alpha_i except alpha_0, alpha_1 and alpha_2, i.e. this is * */ + Dart_descriptor dart2_a1=null_descriptor; + if(adart2!=null_descriptor) { dart2_a1=alpha<1>(adart2); } + size_type m1=get_new_mark(); CGAL::GMap_dart_iterator_basic_of_involution it1(*this, adart1, m1); - size_type m2=get_new_mark(); - CGAL::GMap_dart_iterator_basic_of_involution it2(*this, adart2, m2); + CGAL::GMap_dart_iterator_basic_of_involution it2(*this, dart2_a1, m2); Dart_descriptor d1=null_descriptor; Dart_descriptor d2=null_descriptor; @@ -3563,44 +3643,32 @@ namespace CGAL { d2 = create_dart(); mark(it1,treated); - if (!isfree1) - { - d3 = create_dart(); - d4 = create_dart(); - this->template basic_link_alpha<2>(d1, d3); - this->template basic_link_alpha<2>(d2, d4); - } + d3 = create_dart(); + d4 = create_dart(); + this->template basic_link_alpha<2>(d1, d3); + this->template basic_link_alpha<2>(d2, d4); - for ( unsigned int dim=3; dim<=dimension; ++dim) + for (unsigned int dim=3; dim<=dimension; ++dim) { if ( !is_free(it1, dim) && is_marked(alpha(it1, dim), treated) ) { basic_link_alpha(alpha(it1, dim, 1), d1, dim); - basic_link_alpha(alpha(d1, dim, 0), d2, dim); + basic_link_alpha(alpha(it1, dim, 1, 0), d2, dim); - if (!isfree1) - { - basic_link_alpha(alpha(it1, 1, dim, 1), d3, dim); - basic_link_alpha(alpha(d3, dim, 0), d4, dim); - } + basic_link_alpha(alpha(it1, dim, 1, 2), d3, dim); + basic_link_alpha(alpha(it1, dim, 1, 2, 0), d4, dim); } } if (!isfree1) - { - this->template link_alpha<1>(this->template alpha<1>(it1), d3); - if ( adart2!=null_descriptor ) - { - CGAL_assertion (it2.cont()); - this->template link_alpha<1>(this->template alpha<1>(it2), d4); - } - } - + { this->template link_alpha<1>(this->template alpha<1>(it1), d3); } this->template link_alpha<1>(it1, d1); - if ( adart2!=null_descriptor ) + + if (adart2!=null_descriptor) { CGAL_assertion (it2.cont()); + this->template link_alpha<1>(this->template alpha<1>(it2), d4); this->template link_alpha<1>(it2, d2); ++it2; } @@ -3610,25 +3678,31 @@ namespace CGAL { update_attributes && ah!=null_descriptor) { internal::Set_i_attribute_of_dart_functor::run(*this, d2, ah); - if (!isfree1) - { - internal::Set_i_attribute_of_dart_functor::run(*this, d4, ah); - } + internal::Set_i_attribute_of_dart_functor::run(*this, d4, ah); } } // We do the link_alpha<0> after the link_alpha<1> to update the // possible attributes of d2. this->template link_alpha<0>(d1, d2); - if (!isfree1) - { this->template link_alpha<0>(d3, d4); } + this->template link_alpha<0>(d3, d4); } if (are_attributes_automatically_managed() && update_attributes) { - if ( !this->template is_free<2>(d1) && d2!=null_descriptor ) - CGAL::internal::GMap_degroup_attribute_functor_run:: - run(*this, d1, this->template alpha<2>(d1)); + if(merge) + { // Here we group all enabled attributes starting from 2 to dimension + Helper::template Foreach_enabled_attributes + , 2>:: + run(*this, adart1, adart2); + } + else // Here we degroup 2-attributes + { + // TODO if ( !this->template is_free<2>(d1) && d2!=null_descriptor ) + if (adart2!=null_descriptor) + { CGAL::internal::GMap_degroup_attribute_functor_run:: + run(*this, adart1, adart2); } + } } negate_mark(m1); @@ -3673,7 +3747,8 @@ namespace CGAL { typename Attribute_descriptor<0>:: type ah=null_descriptor, bool update_attributes=true ) - { return insert_cell_1_in_cell_2(adart1, null_descriptor, update_attributes, ah); } + { return insert_cell_1_in_cell_2(adart1, null_descriptor, ah, + update_attributes); } /** Test if a 2-cell can be inserted onto a given 3-cell along * a path of edges. From 8d66f692e07f5d4610745d459a198d17e196f5c3 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 25 Nov 2022 13:20:30 +0100 Subject: [PATCH 0097/1398] add a function in tests to create all possible attributes. --- .../Linear_cell_complex_2_test.h | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h index 55e93de1f2b6..3b96f69ca76c 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h @@ -45,6 +45,103 @@ void trace_display_msg(const char* msg) #endif } +template::type::Info> +struct SetInfoIfNonVoid +{ + static void run(Map& map, + typename Map::template Attribute_descriptor::type attr, + long long int nb) + { + map.template info_of_attribute(attr)= + typename Map::template Attribute_type::type::Info(nb); + } +}; +template +struct SetInfoIfNonVoid +{ + static void run(Map&, typename Map::template Attribute_descriptor::type, + long long int) + {} +}; + +template::type> +struct CreateAttributes +{ + static void run(Map& map) + { + long long int nb=0; + for(typename Map::Dart_range::iterator it=map.darts().begin(), + itend=map.darts().end(); it!=itend; ++it) + { + if ( map.template attribute(it)==map.null_descriptor ) + { + map.template set_attribute(it, map.template create_attribute()); + SetInfoIfNonVoid::run(map, map.template attribute(it), ++nb); + } + } + } +}; + +template +struct CreateAttributes +{ + static void run(Map& amap) + { + long long int nb=0; + for ( typename Map::template Attribute_range<0>::type::iterator + it=amap.template attributes<0>().begin(), + itend=amap.template attributes<0>().end(); it!=itend; ++it ) + SetInfoIfNonVoid::run(amap, it, ++nb); + } +}; + +template +struct CreateAttributes +{ + static void run(Map&) + {} +}; + +template +struct CreateAttributes +{ + static void run(Map&) + {} +}; + +template +struct InitDartInfo +{ + static void run(Map& map) + { + long long int nb=0; + for(typename Map::Dart_range::iterator it=map.darts().begin(), + itend=map.darts().end(); it!=itend; ++it) + { + nb=CGAL::get_default_random().get_int(0,20000); + map.info(it)=Info(nb); + } + } +}; + +template +struct InitDartInfo +{ + static void run(Map&) + {} +}; + +template +void create_attributes_2(Map& map) +{ + CreateAttributes::run(map); + CreateAttributes::run(map); + CreateAttributes::run(map); + InitDartInfo::run(map); +} + template struct Alpha1 From d381bfbd4486b6fb580eb1b56238606f96e8cfa0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 30 Nov 2022 10:35:16 +0100 Subject: [PATCH 0098/1398] Add a parameter to group functor to deal with the case where first dart will be deleted --- .../Combinatorial_map_group_functors.h | 42 ++++++++++++++----- .../internal/Generalized_map_group_functors.h | 23 +++++++--- 2 files changed, 48 insertions(+), 17 deletions(-) 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 885940755110..bda62d360f86 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 @@ -238,7 +238,8 @@ struct Group_nonvoid_attribute_functor_run { static void run(CMap& amap, typename CMap::Dart_descriptor adart1, - typename CMap::Dart_descriptor adart2) + typename CMap::Dart_descriptor adart2, + bool dart1_deleted=true) { CGAL_static_assertion( 1<=i && i<=CMap::dimension ); CGAL_static_assertion( i!=j ); @@ -251,8 +252,13 @@ struct Group_nonvoid_attribute_functor_run a2=amap.template attribute(adart2); // If the two attributes are equal, nothing to do. - if ( a1 == a2 ) return; - + if (a1==a2) + { + if(a1!=CMap::null_descriptor && dart1_deleted && + amap.template dart_of_attribute(a1)==adart1) + { amap.template set_dart_of_attribute(a1, adart2); } + return; + } typename CMap::Dart_descriptor toSet = amap.null_descriptor; // If the attribute associated to adart1 is nullptr, set it with @@ -268,6 +274,8 @@ struct Group_nonvoid_attribute_functor_run } } amap.template set_attribute(toSet, a1); + if(dart1_deleted && toSet==adart1) + { amap.template set_dart_of_attribute(a1, adart2); } } }; // Specialization for i=0 and 2<=j. We update 0-attributes for beta_j j>=2. @@ -277,7 +285,8 @@ struct Group_nonvoid_attribute_functor_run { static void run( CMap& amap, typename CMap::Dart_descriptor dh1, - typename CMap::Dart_descriptor dh2 ) + typename CMap::Dart_descriptor dh2, + bool dart1_deleted=true) { CGAL_static_assertion_msg ( CMap::Helper::template Dimension_index<0>::value>=0, @@ -306,6 +315,8 @@ struct Group_nonvoid_attribute_functor_run } } amap.template set_attribute<0>(toSet, a1); + if(dart1_deleted && toSet==dh1) + { amap.template set_dart_of_attribute<0>(a1, od); } } } // Second extremity @@ -338,7 +349,8 @@ struct Group_nonvoid_attribute_functor_run { static void run( CMap& amap, typename CMap::Dart_descriptor dh1, - typename CMap::Dart_descriptor dh2 ) + typename CMap::Dart_descriptor dh2, + bool dart1_deleted=true) { CGAL_static_assertion_msg ( CMap::Helper::template Dimension_index<0>::value>=0, @@ -364,6 +376,8 @@ struct Group_nonvoid_attribute_functor_run } } amap.template set_attribute<0>(toSet, a1); + if(dart1_deleted && toSet==dh1) + { amap.template set_dart_of_attribute<0>(a1, od); } } } } @@ -375,7 +389,8 @@ struct Group_nonvoid_attribute_functor_run { static void run( CMap& amap, typename CMap::Dart_descriptor dh1, - typename CMap::Dart_descriptor dh2 ) + typename CMap::Dart_descriptor dh2, + bool=true) { CGAL_static_assertion_msg ( CMap::Helper::template Dimension_index<0>::value>=0, @@ -411,7 +426,8 @@ struct Group_nonvoid_attribute_functor_run { static void run(CMap&, typename CMap::Dart_descriptor, - typename CMap::Dart_descriptor) + typename CMap::Dart_descriptor, + bool=true) {} }; // Specialization for i=1 and j=0. Do nothing as edges attributes are not @@ -421,7 +437,8 @@ struct Group_nonvoid_attribute_functor_run { static void run(CMap&, typename CMap::Dart_descriptor, - typename CMap::Dart_descriptor) + typename CMap::Dart_descriptor, + bool=true) {} }; //------------------------------------------------------------------------------ @@ -432,8 +449,10 @@ struct Group_attribute_functor_run { static void run( CMap& amap, typename CMap::Dart_descriptor d1, - typename CMap::Dart_descriptor d2) - { Group_nonvoid_attribute_functor_run::run(amap, d1, d2); } + typename CMap::Dart_descriptor d2, + bool dart1_deleted=true) + { Group_nonvoid_attribute_functor_run:: + run(amap, d1, d2, dart1_deleted); } }; // Specialization for void attributes. template @@ -441,7 +460,8 @@ struct Group_attribute_functor_run { static void run( CMap&, typename CMap::Dart_descriptor, - typename CMap::Dart_descriptor ) + typename CMap::Dart_descriptor, + bool=true) {} }; // ************************************************************************ 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 950a723bf21a..7514a5a0089c 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 @@ -132,7 +132,8 @@ struct GMap_group_attribute_functor_run { static void run(GMap& amap, typename GMap::Dart_descriptor adart1, - typename GMap::Dart_descriptor adart2) + typename GMap::Dart_descriptor adart2, + bool dart1_deleted=true) { CGAL_static_assertion( i<=GMap::dimension ); CGAL_static_assertion( i!=j ); @@ -145,7 +146,13 @@ struct GMap_group_attribute_functor_run a2=amap.template attribute(adart2); // If the two attributes are equal, nothing to do. - if ( a1 == a2 ) return; + if ( a1 == a2 ) + { + if(a1!=GMap::null_descriptor && dart1_deleted && + amap.template dart_of_attribute(a1)==adart1) + { amap.template set_dart_of_attribute(a1, adart2); } + return; + } typename GMap::Dart_descriptor toSet = amap.null_descriptor; @@ -162,15 +169,18 @@ struct GMap_group_attribute_functor_run } } amap.template set_attribute(toSet, a1); + if(dart1_deleted && toSet==adart1) + { amap.template set_dart_of_attribute(a1, adart2); } } }; // Specialization for void attributes. template struct GMap_group_attribute_functor_run { - static void run( GMap&, - typename GMap::Dart_descriptor, - typename GMap::Dart_descriptor ) + static void run(GMap&, + typename GMap::Dart_descriptor, + typename GMap::Dart_descriptor, + bool=true) {} }; // Specialization for i=j. Do nothing as j is the dimension to not consider. @@ -179,7 +189,8 @@ struct GMap_group_attribute_functor_run { static void run(GMap&, typename GMap::Dart_descriptor, - typename GMap::Dart_descriptor) + typename GMap::Dart_descriptor, + bool=true) {} }; // ************************************************************************ From 96873950ee5eeb89a06e944c0b747ce14cbd0709 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 30 Nov 2022 10:36:04 +0100 Subject: [PATCH 0099/1398] Bug fix for remove and contrat operations for CMap and GMap --- .../include/CGAL/Combinatorial_map_operations.h | 10 ++++++---- .../include/CGAL/Generalized_map_operations.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h index 2ba09b326500..8d29ad53b6ca 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h @@ -107,8 +107,10 @@ namespace CGAL { // We group the two (i+1)-cells incident if they exist. if ( dg1!=amap.null_descriptor ) + { CGAL::internal::Group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be removed + } } // During the operation, we store in modified_darts the darts modified @@ -353,7 +355,7 @@ namespace CGAL // We group the two edges incident if they exist. if ( dg1!=amap.null_descriptor ) CGAL::internal::Group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be removed } // During the operation, we store in modified_darts the darts modified @@ -523,7 +525,7 @@ namespace CGAL // We group the two (i-1)-cells incident if they exist. if ( dg1!=amap.null_descriptor ) CGAL::internal::Group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be removed } // During the operation, we store in modified_darts the darts modified @@ -677,7 +679,7 @@ namespace CGAL // We group the two vertices incident if they exist. if ( dg1!=amap.null_descriptor ) CGAL::internal::Group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be removed } // During the operation, we store in modified_darts the darts modified diff --git a/Generalized_map/include/CGAL/Generalized_map_operations.h b/Generalized_map/include/CGAL/Generalized_map_operations.h index 8366f3495dfe..abffe8d16513 100644 --- a/Generalized_map/include/CGAL/Generalized_map_operations.h +++ b/Generalized_map/include/CGAL/Generalized_map_operations.h @@ -102,7 +102,7 @@ namespace CGAL // We group the two (i+1)-cells incident if they exist. if ( dg1!=amap.null_descriptor ) CGAL::internal::GMap_group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be deleted } // During the operation, we store in modified_darts the darts modified @@ -320,7 +320,7 @@ namespace CGAL // We group the two (i-1)-cells incident if they exist. if ( dg1!=amap.null_descriptor ) CGAL::internal::GMap_group_attribute_functor_run:: - run(amap, dg1, dg2); + run(amap, dg1, dg2, true); // true because dg1 will be deleted } // During the operation, we store in modified_darts the darts modified From 8b114241ca644aac5dda96308f60256c56b5b6aa Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 30 Nov 2022 10:36:40 +0100 Subject: [PATCH 0100/1398] add one insertion test for cmap --- .../test/Combinatorial_map/Combinatorial_map_3_test.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_3_test.h b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_3_test.h index 1abea6aef50e..aecd73c271a3 100644 --- a/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_3_test.h +++ b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_3_test.h @@ -1012,6 +1012,17 @@ bool test3D() map.insert_cell_1_in_cell_2(d1, map.beta(d1,1,1)); map.display_characteristics(cout) << ", valid=" << map.is_valid() << endl; map.clear(); + + d1 = map.make_combinatorial_polygon(4); + d2 = map.make_combinatorial_polygon(4); + map.insert_cell_1_between_two_cells_2(d1, d2); + if(!map.is_valid()) + { + map.display_characteristics(cout) << ", valid=" << map.is_valid() << endl; + std::cout<<"ERROR after map.insert_cell_1_between_two_cells_2(d1, d2);"< Date: Wed, 30 Nov 2022 10:37:54 +0100 Subject: [PATCH 0101/1398] Bug fix in gmap tests, for the second dart given as parameter to the insert_cell_1_in_cell_2 method. --- .../test/Generalized_map/GMap_test_insertions.h | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Generalized_map/test/Generalized_map/GMap_test_insertions.h b/Generalized_map/test/Generalized_map/GMap_test_insertions.h index b239bad84c16..1a3f67aabc30 100644 --- a/Generalized_map/test/Generalized_map/GMap_test_insertions.h +++ b/Generalized_map/test/Generalized_map/GMap_test_insertions.h @@ -149,7 +149,7 @@ bool test_edge_insertion(GMAP& gmap) trace_test_begin(); d1 = gmap.make_combinatorial_polygon(4); - gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1,0)); + gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1)); if ( !check_number_of_cells_3(gmap, 4, 5, 2, 1, 1) ) return false; gmap.clear(); @@ -158,7 +158,7 @@ bool test_edge_insertion(GMAP& gmap) d1 = gmap.make_combinatorial_polygon(4); d2 = gmap.make_combinatorial_polygon(4); gmap.template sew<3>(d1, d2); - gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1,0)); + gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1)); if ( !check_number_of_cells_3(gmap, 4, 5, 2, 2, 1) ) return false; gmap.clear(); @@ -167,18 +167,11 @@ bool test_edge_insertion(GMAP& gmap) d1 = gmap.make_combinatorial_polygon(4); d2 = gmap.make_combinatorial_polygon(4); gmap.template sew<2>(d1, d2); - gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1,0)); + gmap.insert_cell_1_in_cell_2(d1, gmap.alpha(d1,0,1)); if ( !check_number_of_cells_3(gmap, 6, 8, 3, 1, 1) ) return false; gmap.clear(); - trace_test_begin(); - d1 = gmap.create_dart(); - gmap.insert_dangling_cell_1_in_cell_2(d1); - if ( !check_number_of_cells_3(gmap, 2, 2, 1, 1, 1) ) - return false; - gmap.clear(); - trace_test_begin(); d1 = gmap.make_edge(); gmap.template sew<1>(d1, gmap.alpha(d1, 0)); From caf6d1b38b4e74a45b26794ac00751836988365c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 30 Nov 2022 11:06:42 +0100 Subject: [PATCH 0102/1398] update lcc test in 2D and 4d --- .../Linear_cell_complex_2_test.h | 14 -------------- .../Linear_cell_complex_4_test.h | 4 ++-- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h index 3b96f69ca76c..b76bbf1d7e62 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.h @@ -142,20 +142,6 @@ void create_attributes_2(Map& map) InitDartInfo::run(map); } -template -struct Alpha1 -{ - static typename LCC::Dart_descriptor run(LCC&, typename LCC::Dart_descriptor dh) - { return dh; } -}; -template -struct Alpha1 -{ - static typename LCC::Dart_descriptor run(LCC& lcc, typename LCC::Dart_descriptor dh) - { return lcc.template alpha<1>(dh); } -}; - // Test orientation specialized below only for CMap. For GMap return true. template struct Test_change_orientation_LCC_2 diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.h index 1606dbdaffac..edc8b0f6d40d 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.h @@ -377,9 +377,9 @@ bool test_LCC_4() if ( !check_number_of_cells_4(lcc, 16, 28, 16, 4, 2, 1) ) return false; - lcc.insert_cell_1_in_cell_2(lcc.next(dh1), Alpha1::run(lcc, lcc.previous(dh1))); + lcc.insert_cell_1_in_cell_2(lcc.next(dh1), lcc.previous(dh1)); dh2=lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh1)))); - lcc.insert_cell_1_in_cell_2(dh2, Alpha1::run(lcc, lcc.next(lcc.next(dh2)))); + lcc.insert_cell_1_in_cell_2(dh2, lcc.next(lcc.next(dh2))); std::vector path; path.push_back(lcc.next(dh1)); From f6855fef22c428a701719578097f4051ce8525e1 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 3 Jan 2023 12:13:26 +0200 Subject: [PATCH 0103/1398] single vertex computation implemented single vertex curvature computation compared against the whole mesh computation on both cases of no radius and with radius on some vertices still need to add tests, documentation and an example file --- ...nterpolated_corrected_curvature_measures.h | 1374 ++++++++++------- .../internal/parameters_interface.h | 3 + 2 files changed, 830 insertions(+), 547 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 4a50a618e66f..94aaff9b8b52 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -79,675 +79,911 @@ struct Principal_curvatures_and_directions { namespace internal { - template - typename GT::FT average_edge_length(const PolygonMesh& pmesh) { - const std::size_t n = edges(pmesh).size(); - if (n == 0) - return 0; - - typename GT::FT avg_edge_length = 0; - for (auto e : edges(pmesh)) - avg_edge_length += edge_length(e, pmesh); - - avg_edge_length /= n; - return avg_edge_length; - } +template +typename GT::FT average_edge_length(const PolygonMesh& pmesh) { + const std::size_t n = edges(pmesh).size(); + if (n == 0) + return 0; + + typename GT::FT avg_edge_length = 0; + for (auto e : edges(pmesh)) + avg_edge_length += edge_length(e, pmesh); + + avg_edge_length /= n; + return avg_edge_length; +} - enum Curvature_measure_index { - MU0_AREA_MEASURE, ///< corrected area density - MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density - MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density - }; - - template - struct Vertex_measures { - typename GT::FT area_measure = 0; - typename GT::FT mean_curvature_measure = 0; - typename GT::FT gaussian_curvature_measure = 0; - std::array anisotropic_measure = { 0, 0, 0, - 0, 0, 0, - 0, 0, 0 }; - }; - - template - typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, - const std::vector& x) +enum Curvature_measure_index { + MU0_AREA_MEASURE, ///< corrected area density + MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density + MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density +}; + +template +struct Vertex_measures { + typename GT::FT area_measure = 0; + typename GT::FT mean_curvature_measure = 0; + typename GT::FT gaussian_curvature_measure = 0; + std::array anisotropic_measure = { 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }; +}; + +template +typename GT::FT interpolated_corrected_area_measure_face(const std::vector& u, + const std::vector& x) +{ + const std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + typename GT::Construct_cross_product_vector_3 cross_product; + + // Triangle: use triangle formula + if (n == 3) + { + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + return 0.5 * um * cross_product(x[1] - x[0], x[2] - x[0]); + } + // Quad: use bilinear interpolation formula + else if (n == 4) { - const std::size_t n = x.size(); - CGAL_precondition(u.size() == n); - CGAL_precondition(n >= 3); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + return (1.0 / 36.0) * ( + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(x[1] - x[0], x[3] - x[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(x[1] - x[0], x[2] - x[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(x[2] - x[3], x[3] - x[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(x[2] - x[3], x[2] - x[1]) + ); + } + // N-gon: split into n triangles by polygon center and use triangle formula for each + else + { + typename GT::FT mu0 = 0; - typename GT::Construct_cross_product_vector_3 cross_product; + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; - // Triangle: use triangle formula - if (n == 3) - { - const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; - return 0.5 * um * cross_product(x[1] - x[0], x[2] - x[0]); - } - // Quad: use bilinear interpolation formula - else if (n == 4) + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); + + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - return (1.0 / 36.0) * ( - (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(x[1] - x[0], x[3] - x[0]) - + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(x[1] - x[0], x[2] - x[1]) - + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(x[2] - x[3], x[3] - x[0]) - + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(x[2] - x[3], x[2] - x[1]) - ); + mu0 += interpolated_corrected_area_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); } - // N-gon: split into n triangles by polygon center and use triangle formula for each - else - { - typename GT::FT mu0 = 0; + return mu0; + } +} - // getting center of points - typename GT::Vector_3 xc = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; +template +typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, + const std::vector& x) +{ + const std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); + typename GT::Construct_cross_product_vector_3 cross_product; - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu0 += interpolated_corrected_area_measure_face( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - } - return mu0; - } - } + // Triangle: use triangle formula + if (n == 3) + { + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; - template - typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::vector& u, - const std::vector& x) + return 0.5 * um * (cross_product(u[2] - u[1], x[0]) + + cross_product(u[0] - u[2], x[1]) + + cross_product(u[1] - u[0], x[2])); + } + // Quad: use bilinear interpolation formula + else if (n == 4) { - const std::size_t n = x.size(); - CGAL_precondition(u.size() == n); - CGAL_precondition(n >= 3); + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 u13 = u[3] - u[1]; + const typename GT::Vector_3 x0_cross = cross_product(u13, x[0]); + const typename GT::Vector_3 x1_cross = -cross_product(u02, x[1]); + const typename GT::Vector_3 x3_cross = cross_product(u02, x[3]); + const typename GT::Vector_3 x2_cross = -cross_product(u13, x[2]); + + return (1.0 / 12.0) * ( + u[0] * (2 * x0_cross - cross_product((u[3] + u[2]), x[1]) + cross_product((u[1] + u[2]), x[3]) + x2_cross) + + u[1] * (cross_product((u[3] + u[2]), x[0]) + 2 * x1_cross + x3_cross - cross_product((u[0] + u[3]), x[2])) + + u[3] * (-cross_product((u[1] + u[2]), x[0]) + x1_cross + 2 * x3_cross + cross_product((u[0] + u[1]), x[2])) + + u[2] * (x0_cross + cross_product((u[0] + u[3]), x[1]) - cross_product((u[0] + u[1]), x[3]) + 2 * x2_cross) + ); + } + // N-gon: split into n triangles by polygon center and use triangle formula for each + else + { + typename GT::FT mu1 = 0; - typename GT::Construct_cross_product_vector_3 cross_product; + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; - // Triangle: use triangle formula - if (n == 3) - { - const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); - return 0.5 * um * (cross_product(u[2] - u[1], x[0]) - + cross_product(u[0] - u[2], x[1]) - + cross_product(u[1] - u[0], x[2])); - } - // Quad: use bilinear interpolation formula - else if (n == 4) + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - - const typename GT::Vector_3 u02 = u[2] - u[0]; - const typename GT::Vector_3 u13 = u[3] - u[1]; - const typename GT::Vector_3 x0_cross = cross_product(u13, x[0]); - const typename GT::Vector_3 x1_cross = -cross_product(u02, x[1]); - const typename GT::Vector_3 x3_cross = cross_product(u02, x[3]); - const typename GT::Vector_3 x2_cross = -cross_product(u13, x[2]); - - return (1.0 / 12.0) * ( - u[0] * (2 * x0_cross - cross_product((u[3] + u[2]), x[1]) + cross_product((u[1] + u[2]), x[3]) + x2_cross) - + u[1] * (cross_product((u[3] + u[2]), x[0]) + 2 * x1_cross + x3_cross - cross_product((u[0] + u[3]), x[2])) - + u[3] * (-cross_product((u[1] + u[2]), x[0]) + x1_cross + 2 * x3_cross + cross_product((u[0] + u[1]), x[2])) - + u[2] * (x0_cross + cross_product((u[0] + u[3]), x[1]) - cross_product((u[0] + u[1]), x[3]) + 2 * x2_cross) - ); + mu1 += interpolated_corrected_mean_curvature_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); } - // N-gon: split into n triangles by polygon center and use triangle formula for each - else - { - typename GT::FT mu1 = 0; + return mu1; + } +} - // getting center of points - typename GT::Vector_3 xc = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; +template +typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, + const std::vector& x = {}) +{ + const std::size_t n = u.size(); + CGAL_precondition(n >= 3); - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); + typename GT::Construct_cross_product_vector_3 cross_product; - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu1 += interpolated_corrected_mean_curvature_measure_face( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - } - return mu1; - } + // Triangle: use triangle formula + if (n == 3) + { + return 0.5 * u[0] * cross_product(u[1], u[2]); } - - template - typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, - const std::vector& x = {}) + // Quad: use bilinear interpolation formula + else if (n == 4) + { + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + return (1.0 / 36.0) * ( + (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) + + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) + + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) + + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) + ); + } + // N-gon: split into n triangles by polygon center and use triangle formula for each + else { - const std::size_t n = u.size(); - CGAL_precondition(n >= 3); + typename GT::FT mu2 = 0; - typename GT::Construct_cross_product_vector_3 cross_product; + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); - // Triangle: use triangle formula - if (n == 3) + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) { - return 0.5 * u[0] * cross_product(u[1], u[2]); + mu2 += interpolated_corrected_gaussian_curvature_measure_face( + std::vector {u[i], u[(i + 1) % n], uc} + ); } - // Quad: use bilinear interpolation formula - else if (n == 4) + return mu2; + } +} + +template +std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, + const std::vector& x) +{ + const std::size_t n = x.size(); + CGAL_precondition(u.size() == n); + CGAL_precondition(n >= 3); + + typename GT::Construct_cross_product_vector_3 cross_product; + std::array muXY{ 0 }; + + // Triangle: use triangle formula + if (n == 3) + { + const typename GT::Vector_3 u01 = u[1] - u[0]; + const typename GT::Vector_3 u02 = u[2] - u[0]; + const typename GT::Vector_3 x01 = x[1] - x[0]; + const typename GT::Vector_3 x02 = x[2] - x[0]; + const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + + for (std::size_t ix = 0; ix < 3; ix++) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - return (1.0 / 36.0) * ( - (4 * u[0] + 2 * u[1] + 2 * u[3] + u[2]) * cross_product(u[1] - u[0], u[3] - u[0]) - + (2 * u[0] + 4 * u[1] + u[3] + 2 * u[2]) * cross_product(u[1] - u[0], u[2] - u[1]) - + (2 * u[0] + u[1] + 4 * u[3] + 2 * u[2]) * cross_product(u[2] - u[3], u[3] - u[0]) - + (u[0] + 2 * u[1] + 2 * u[3] + 4 * u[2]) * cross_product(u[2] - u[3], u[2] - u[1]) - ); + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); + + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); } - // N-gon: split into n triangles by polygon center and use triangle formula for each - else + } + // Quad: use bilinear interpolation formula + else if (n == 4) + { + // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. + // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 + for (std::size_t ix = 0; ix < 3; ix++) { - typename GT::FT mu2 = 0; + typename GT::Vector_3 X; + if (ix == 0) + X = typename GT::Vector_3(1, 0, 0); + if (ix == 1) + X = typename GT::Vector_3(0, 1, 0); + if (ix == 2) + X = typename GT::Vector_3(0, 0, 1); + + const typename GT::Vector_3 u0xX = cross_product(u[0], X); + const typename GT::Vector_3 u1xX = cross_product(u[1], X); + const typename GT::Vector_3 u2xX = cross_product(u[2], X); + const typename GT::Vector_3 u3xX = cross_product(u[3], X); - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) - { - mu2 += interpolated_corrected_gaussian_curvature_measure_face( - std::vector {u[i], u[(i + 1) % n], uc} - ); - } - return mu2; + for (std::size_t iy = 0; iy < 3; iy++) + muXY[ix * 3 + iy] = (1.0 / 72.0) * ( + + u[0][iy] * (u0xX * (-x[0] - 11 * x[1] + 13 * x[3] - x[2]) + + u1xX * (-5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) + + u3xX * (x[0] - 7 * x[1] + 11 * x[3] - 5 * x[2]) + + u2xX * (-x[0] - 5 * x[1] + 7 * x[3] - x[2]) + ) + + u[1][iy] * (u0xX * (13 * x[0] - x[1] - 7 * x[3] - 5 * x[2]) + + u1xX * (17 * x[0] - 5 * x[1] - 5 * x[3] - 7 * x[2]) + + u3xX * (5 * x[0] + x[1] + x[3] - 7 * x[2]) + + u2xX * (7 * x[0] - x[1] + 5 * x[3] - 11 * x[2]) + ) + + u[2][iy] * (u0xX * (-11 * x[0] + 5 * x[1] - x[3] + 7 * x[2]) + + u1xX * (-7 * x[0] + x[1] + x[3] + 5 * x[2]) + + u3xX * (-7 * x[0] - 5 * x[1] - 5 * x[3] + 17 * x[2]) + + u2xX * (-5 * x[0] - 7 * x[1] - x[3] + 13 * x[2]) + ) + + u[3][iy] * (u0xX * (-x[0] + 7 * x[1] - 5 * x[3] - x[2]) + + u1xX * (-5 * x[0] + 11 * x[1] - 7 * x[3] + x[2]) + + u3xX * (x[0] + 11 * x[1] - 7 * x[3] - 5 * x[2]) + + u2xX * (-x[0] + 13 * x[1] - 11 * x[3] - x[2]) + ) + + ); } } - - template - std::array interpolated_corrected_anisotropic_measure_face(const std::vector& u, - const std::vector& x) + // N-gon: split into n triangles by polygon center and use triangle formula for each + else { - const std::size_t n = x.size(); - CGAL_precondition(u.size() == n); - CGAL_precondition(n >= 3); + // getting center of points + typename GT::Vector_3 xc = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xc /= n; - typename GT::Construct_cross_product_vector_3 cross_product; - std::array muXY{ 0 }; + // getting unit average normal of points + typename GT::Vector_3 uc = + std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); + uc /= sqrt(uc * uc); - // Triangle: use triangle formula - if (n == 3) + // summing each triangle's measure after triangulation by barycenter split. + for (std::size_t i = 0; i < n; i++) { - const typename GT::Vector_3 u01 = u[1] - u[0]; - const typename GT::Vector_3 u02 = u[2] - u[0]; - const typename GT::Vector_3 x01 = x[1] - x[0]; - const typename GT::Vector_3 x02 = x[2] - x[0]; - const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; + std::array muXY_curr_triangle = + interpolated_corrected_anisotropic_measure_face( + std::vector {u[i], u[(i + 1) % n], uc}, + std::vector {x[i], x[(i + 1) % n], xc} + ); for (std::size_t ix = 0; ix < 3; ix++) - { - typename GT::Vector_3 X; - if (ix == 0) - X = typename GT::Vector_3(1, 0, 0); - if (ix == 1) - X = typename GT::Vector_3(0, 1, 0); - if (ix == 2) - X = typename GT::Vector_3(0, 0, 1); - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); - } + muXY[ix * 3 + iy] += muXY_curr_triangle[ix * 3 + iy]; } - // Quad: use bilinear interpolation formula - else if (n == 4) + } + return muXY; +} + +//template +//typename GT::FT triangle_in_ball_ratio(const typename GT::Vector_3 x1, +// const typename GT::Vector_3 x2, +// const typename GT::Vector_3 x3, +// const typename GT::FT r, +// const typename GT::Vector_3 c, +// const std::size_t res = 3) +//{ +// const typename GT::FT R = r * r; +// const typename GT::FT acc = 1.0 / res; +// std::size_t samples_in = 0; +// for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) +// for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) +// { +// if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) +// samples_in++; +// } +// return samples_in / (typename GT::FT)(res * (res + 1) / 2); +//} + +template +typename GT::FT face_in_ball_ratio(const std::vector& x, + const typename GT::FT r, + const typename GT::Vector_3 c) +{ + const std::size_t n = x.size(); + + // getting center of points + typename GT::Vector_3 xm = + std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); + xm /= n; + + typename GT::FT d_min = (xm - c).squared_length(); + typename GT::FT d_max = d_min; + + for (const typename GT::Vector_3 xi : x) + { + const typename GT::FT d_sq = (xi - c).squared_length(); + d_max = (std::max)(d_sq, d_max); + d_min = (std::min)(d_sq, d_min); + } + + if (d_max <= r * r) return 1.0; + else if (r * r <= d_min) return 0.0; + + d_max = sqrt(d_max); + d_min = sqrt(d_min); + + return (r - d_min) / (d_max - d_min); +} + +template +Principal_curvatures_and_directions principal_curvatures_and_directions_from_anisotropic_measures( + const std::array anisotropic_measure, + const typename GT::FT v_mu0, + const typename GT::Vector_3 u_GT +) +{ + Eigen::Matrix v_muXY = Eigen::Matrix::Zero(); + + for (std::size_t ix = 0; ix < 3; ix++) + for (std::size_t iy = 0; iy < 3; iy++) + v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; + + Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); + const typename GT::FT K = 1000 * v_mu0; + + v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); + + Eigen::SelfAdjointEigenSolver> eigensolver; + + eigensolver.computeDirect(v_muXY); + + if (eigensolver.info() != Eigen::Success) + return Principal_curvatures_and_directions(); + + const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); + const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); + + const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); + const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); + + return Principal_curvatures_and_directions( + (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, + (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + min_eig_vec, + max_eig_vec + ); +} + +template +typename Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( + const PolygonMesh pmesh, + const typename boost::graph_traits::vertex_descriptor v, + const bool is_mean_curvature_selected, + const bool is_gaussian_curvature_selected, + const bool is_principal_curvatures_and_directions_selected, + const VPM vpm, + const VNM vnm +) +{ + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + typedef typename GT::FT FT; + + std::queue bfs_queue; + std::unordered_set bfs_visited; + + typename Vertex_measures vertex_measures; + + std::vector x; + std::vector u; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) { - // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. - // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - for (std::size_t ix = 0; ix < 3; ix++) + for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) { - typename GT::Vector_3 X; - if (ix == 0) - X = typename GT::Vector_3(1, 0, 0); - if (ix == 1) - X = typename GT::Vector_3(0, 1, 0); - if (ix == 2) - X = typename GT::Vector_3(0, 0, 1); - - const typename GT::Vector_3 u0xX = cross_product(u[0], X); - const typename GT::Vector_3 u1xX = cross_product(u[1], X); - const typename GT::Vector_3 u2xX = cross_product(u[2], X); - const typename GT::Vector_3 u3xX = cross_product(u[3], X); - - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] = (1.0 / 72.0) * ( - - u[0][iy] * (u0xX * (-x[0] - 11 * x[1] + 13 * x[3] - x[2]) - + u1xX * (-5 * x[0] - 7 * x[1] + 11 * x[3] + x[2]) - + u3xX * (x[0] - 7 * x[1] + 11 * x[3] - 5 * x[2]) - + u2xX * (-x[0] - 5 * x[1] + 7 * x[3] - x[2]) - ) - + u[1][iy] * (u0xX * (13 * x[0] - x[1] - 7 * x[3] - 5 * x[2]) - + u1xX * (17 * x[0] - 5 * x[1] - 5 * x[3] - 7 * x[2]) - + u3xX * (5 * x[0] + x[1] + x[3] - 7 * x[2]) - + u2xX * (7 * x[0] - x[1] + 5 * x[3] - 11 * x[2]) - ) - + u[2][iy] * (u0xX * (-11 * x[0] + 5 * x[1] - x[3] + 7 * x[2]) - + u1xX * (-7 * x[0] + x[1] + x[3] + 5 * x[2]) - + u3xX * (-7 * x[0] - 5 * x[1] - 5 * x[3] + 17 * x[2]) - + u2xX * (-5 * x[0] - 7 * x[1] - x[3] + 13 * x[2]) - ) - + u[3][iy] * (u0xX * (-x[0] + 7 * x[1] - 5 * x[3] - x[2]) - + u1xX * (-5 * x[0] + 11 * x[1] - 7 * x[3] + x[2]) - + u3xX * (x[0] + 11 * x[1] - 7 * x[3] - 5 * x[2]) - + u2xX * (-x[0] + 13 * x[1] - 11 * x[3] - x[2]) - ) - - ); + Point_3 pi = get(vpm, vi); + Vector_3 ui = get(vnm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + u.push_back(ui); } - } - // N-gon: split into n triangles by polygon center and use triangle formula for each - else - { - // getting center of points - typename GT::Vector_3 xc = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; - - // getting unit average normal of points - typename GT::Vector_3 uc = - std::accumulate(u.begin(), u.end(), typename GT::Vector_3(0, 0, 0)); - uc /= sqrt(uc * uc); - - // summing each triangle's measure after triangulation by barycenter split. - for (std::size_t i = 0; i < n; i++) + + vertex_measures.area_measure += interpolated_corrected_area_measure_face(u, x); + + if (is_mean_curvature_selected) + vertex_measures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); + + if (is_gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); + + if (is_principal_curvatures_and_directions_selected) { - std::array muXY_curr_triangle = - interpolated_corrected_anisotropic_measure_face( - std::vector {u[i], u[(i + 1) % n], uc}, - std::vector {x[i], x[(i + 1) % n], xc} - ); - - for (std::size_t ix = 0; ix < 3; ix++) - for (std::size_t iy = 0; iy < 3; iy++) - muXY[ix * 3 + iy] += muXY_curr_triangle[ix * 3 + iy]; + const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += face_anisotropic_measure[i]; } } - return muXY; + + x.clear(); + u.clear(); } + return vertex_measures; +} - //template - //typename GT::FT triangle_in_ball_ratio(const typename GT::Vector_3 x1, - // const typename GT::Vector_3 x2, - // const typename GT::Vector_3 x3, - // const typename GT::FT r, - // const typename GT::Vector_3 c, - // const std::size_t res = 3) - //{ - // const typename GT::FT R = r * r; - // const typename GT::FT acc = 1.0 / res; - // std::size_t samples_in = 0; - // for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) - // for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) - // { - // if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) - // samples_in++; - // } - // return samples_in / (typename GT::FT)(res * (res + 1) / 2); - //} - - template - typename GT::FT face_in_ball_ratio(const std::vector& x, - const typename GT::FT r, - const typename GT::Vector_3 c) - { - const std::size_t n = x.size(); - // getting center of points - typename GT::Vector_3 xm = - std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xm /= n; +template +typename Vertex_measures interpolated_corrected_measures_one_vertex( + const PolygonMesh pmesh, + const typename boost::graph_traits::vertex_descriptor v, + const typename GT::FT radius, + const bool is_mean_curvature_selected, + const bool is_gaussian_curvature_selected, + const bool is_principal_curvatures_and_directions_selected, + const VPM vpm, + const VNM vnm +) +{ + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + typedef typename GT::FT FT; + + std::queue bfs_queue; + std::unordered_set bfs_visited; - typename GT::FT d_min = (xm - c).squared_length(); - typename GT::FT d_max = d_min; + typename Vertex_measures vertex_measures; - for (const typename GT::Vector_3 xi : x) + typename Point_3 vp = get(vpm, v); + typename Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) { - const typename GT::FT d_sq = (xi - c).squared_length(); - d_max = (std::max)(d_sq, d_max); - d_min = (std::min)(d_sq, d_min); + bfs_queue.push(f); + bfs_visited.insert(f); } + } + std::vector x; + std::vector u; + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); - if (d_max <= r * r) return 1.0; - else if (r * r <= d_min) return 0.0; - - d_max = sqrt(d_max); - d_min = sqrt(d_min); + // looping over vertices in face to get point coordinates - return (r - d_min) / (d_max - d_min); - } + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + Vector_3 ui = get(vnm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + u.push_back(ui); + } - template - Principal_curvatures_and_directions principal_curvatures_and_directions_from_anisotropic_measures( - const std::array anisotropic_measure, - const typename GT::FT v_mu0, - const typename GT::Vector_3 u_GT - ) - { - Eigen::Matrix v_muXY = Eigen::Matrix::Zero(); + const FT f_ratio = face_in_ball_ratio(x, radius, c); - for (std::size_t ix = 0; ix < 3; ix++) - for (std::size_t iy = 0; iy < 3; iy++) - v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; + if (f_ratio != 0.0) + { + vertex_measures.area_measure += f_ratio * interpolated_corrected_area_measure_face(u, x); - Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); - const typename GT::FT K = 1000 * v_mu0; + if (is_mean_curvature_selected) + vertex_measures.mean_curvature_measure += f_ratio * interpolated_corrected_mean_curvature_measure_face(u, x); - v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); + if (is_gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += f_ratio * interpolated_corrected_gaussian_curvature_measure_face(u, x); - Eigen::SelfAdjointEigenSolver> eigensolver; + if (is_principal_curvatures_and_directions_selected) + { + const std::array face_anisotropic_measure = interpolated_corrected_anisotropic_measure_face(u, x); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } - eigensolver.computeDirect(v_muXY); + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) + { + bfs_queue.push(fj); + bfs_visited.insert(fj); + } + } + } - if (eigensolver.info() != Eigen::Success) - return Principal_curvatures_and_directions(); + x.clear(); + u.clear(); + } + return vertex_measures; +} - const Eigen::Matrix eig_vals = eigensolver.eigenvalues(); - const Eigen::Matrix eig_vecs = eigensolver.eigenvectors(); +template + void interpolated_corrected_curvatures_one_vertex( + const PolygonMesh pmesh, + const typename boost::graph_traits::vertex_descriptor v, + NamedParameters& np = parameters::default_values() + ) +{ + typedef typename GetGeomTraits::type GT; + typedef typename GetVertexPointMap::const_type Vertex_position_map; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + Vertex_position_map vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); + + Vertex_normal_map vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); + + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); + + typename GT::FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + if (radius == 0) + radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + radius = radius; + + typename GT::FT* vertex_mean_curvature = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature), nullptr); + typename GT::FT* vertex_gaussian_curvature = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature), nullptr); + typename Principal_curvatures_and_directions* vertex_principal_curvatures_and_directions = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions), nullptr); + + const bool is_mean_curvature_selected = (vertex_mean_curvature != nullptr); + const bool is_gaussian_curvature_selected = (vertex_gaussian_curvature != nullptr); + const bool is_principal_curvatures_and_directions_selected = (vertex_principal_curvatures_and_directions != nullptr); + + std::cout << is_mean_curvature_selected << is_gaussian_curvature_selected << is_principal_curvatures_and_directions_selected << std::endl; + + Vertex_measures vertex_measures; + + if (radius < 0) + vertex_measures = interpolated_corrected_measures_one_vertex_no_radius( + pmesh, + v, + is_mean_curvature_selected, + is_gaussian_curvature_selected, + is_principal_curvatures_and_directions_selected, + vpm, + vnm + ); + else + vertex_measures = interpolated_corrected_measures_one_vertex( + pmesh, + v, + radius, + is_mean_curvature_selected, + is_gaussian_curvature_selected, + is_principal_curvatures_and_directions_selected, + vpm, + vnm + ); + + + if (is_mean_curvature_selected) { + *vertex_mean_curvature = vertex_measures.area_measure != 0 ? + 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure : 0; + } - const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); - const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); + if (is_gaussian_curvature_selected) { + *vertex_gaussian_curvature = vertex_measures.area_measure != 0 ? + vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure : 0; + } - return Principal_curvatures_and_directions( - (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, - (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, - min_eig_vec, - max_eig_vec + if (is_principal_curvatures_and_directions_selected) { + const GT::Vector_3 v_normal = get(vnm, v); + const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( + vertex_measures.anisotropic_measure, + vertex_measures.area_measure, + v_normal ); + *vertex_principal_curvatures_and_directions = principal_curvatures_and_directions; } +} - template - class Interpolated_corrected_curvatures_computer - { - typedef typename GetGeomTraits::type GT; - - typedef typename GT::FT FT; - typedef typename GT::Point_3 Point_3; - typedef typename GT::Vector_3 Vector_3; - - typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; - typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; - typedef typename boost::graph_traits::face_descriptor Face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; - - typedef typename GetVertexPointMap::const_type Vertex_position_map; - - typedef dynamic_vertex_property_t Vector_map_tag; - typedef typename boost::property_map::const_type Default_vector_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; - - typedef Constant_property_map Default_scalar_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_mean_curvature_map; - - typedef typename internal_np::Lookup_named_param_def::type Vertex_gaussian_curvature_map; - - typedef Constant_property_map> Default_principal_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvatures_and_directions_map; - - typedef typename boost::property_map>::const_type Face_scalar_measure_map; - typedef typename boost::property_map>>::const_type Face_anisotropic_measure_map; - - private: - const PolygonMesh& pmesh; - Vertex_position_map vpm; - Vertex_normal_map vnm; - FT ball_radius; - - bool is_mean_curvature_selected; - bool is_gaussian_curvature_selected; - bool is_principal_curvatures_and_directions_selected; - - Vertex_mean_curvature_map mean_curvature_map; - Vertex_gaussian_curvature_map gaussian_curvature_map; - Vertex_principal_curvatures_and_directions_map principal_curvatures_and_directions_map; - - Face_scalar_measure_map mu0_map, mu1_map, mu2_map; - Face_anisotropic_measure_map muXY_map; - - void set_property_maps() { - mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); - mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); - mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); - muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); - } +template +class Interpolated_corrected_curvatures_computer +{ + typedef typename GetGeomTraits::type GT; + + typedef typename GT::FT FT; + typedef typename GT::Point_3 Point_3; + typedef typename GT::Vector_3 Vector_3; + + typedef typename boost::graph_traits::halfedge_descriptor Halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor Edge_descriptor; + typedef typename boost::graph_traits::face_descriptor Face_descriptor; + typedef typename boost::graph_traits::vertex_descriptor Vertex_descriptor; + + typedef typename GetVertexPointMap::const_type Vertex_position_map; + + typedef dynamic_vertex_property_t Vector_map_tag; + typedef typename boost::property_map::const_type Default_vector_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_normal_map; + + typedef Constant_property_map Default_scalar_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_mean_curvature_map; + + typedef typename internal_np::Lookup_named_param_def::type Vertex_gaussian_curvature_map; + + typedef Constant_property_map> Default_principal_map; + typedef typename internal_np::Lookup_named_param_def::type Vertex_principal_curvatures_and_directions_map; + + typedef typename boost::property_map>::const_type Face_scalar_measure_map; + typedef typename boost::property_map>>::const_type Face_anisotropic_measure_map; + +private: + const PolygonMesh& pmesh; + Vertex_position_map vpm; + Vertex_normal_map vnm; + FT ball_radius; + + bool is_mean_curvature_selected; + bool is_gaussian_curvature_selected; + bool is_principal_curvatures_and_directions_selected; + + Vertex_mean_curvature_map mean_curvature_map; + Vertex_gaussian_curvature_map gaussian_curvature_map; + Vertex_principal_curvatures_and_directions_map principal_curvatures_and_directions_map; + + Face_scalar_measure_map mu0_map, mu1_map, mu2_map; + Face_anisotropic_measure_map muXY_map; + + void set_property_maps() { + mu0_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu1_map = get(CGAL::dynamic_face_property_t(), pmesh); + mu2_map = get(CGAL::dynamic_face_property_t(), pmesh); + muXY_map = get(CGAL::dynamic_face_property_t>(), pmesh); - void set_named_params(const NamedParameters& np) - { - using parameters::choose_parameter; - using parameters::get_parameter; - using parameters::is_default_parameter; + } - vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), - get_const_property_map(CGAL::vertex_point, pmesh)); + void set_named_params(const NamedParameters& np) + { + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; - vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), - get(Vector_map_tag(), pmesh)); + vpm = choose_parameter(get_parameter(np, CGAL::vertex_point), + get_const_property_map(CGAL::vertex_point, pmesh)); - if (is_default_parameter::value) - compute_vertex_normals(pmesh, vnm, np); + vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), + get(Vector_map_tag(), pmesh)); - const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + if (is_default_parameter::value) + compute_vertex_normals(pmesh, vnm, np); - is_mean_curvature_selected = !is_default_parameter::value; - is_gaussian_curvature_selected = !is_default_parameter::value; - is_principal_curvatures_and_directions_selected = !is_default_parameter::value; + const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); - mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); - gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); - principal_curvatures_and_directions_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions_map), Default_principal_map()); + is_mean_curvature_selected = !is_default_parameter::value; + is_gaussian_curvature_selected = !is_default_parameter::value; + is_principal_curvatures_and_directions_selected = !is_default_parameter::value; - set_ball_radius(radius); - } + mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); + gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); + principal_curvatures_and_directions_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions_map), Default_principal_map()); - void set_ball_radius(const FT radius) { - if (radius == 0) - ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; - else - ball_radius = radius; - } + set_ball_radius(radius); + } - public: + void set_ball_radius(const FT radius) { + if (radius == 0) + ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + else + ball_radius = radius; + } - Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values() - ) : - pmesh(pmesh) - { - set_named_params(np); +public: - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvatures_and_directions_selected) - { - set_property_maps(); + Interpolated_corrected_curvatures_computer(const PolygonMesh& pmesh, + const NamedParameters& np = parameters::default_values() + ) : + pmesh(pmesh) + { + set_named_params(np); - compute_selected_curvatures(); - } + if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvatures_and_directions_selected) + { + set_property_maps(); + + compute_selected_curvatures(); } + } - private: +private: - void interpolated_corrected_selected_measures_all_faces() - { - std::vector x; - std::vector u; + void interpolated_corrected_selected_measures_all_faces() + { + std::vector x; + std::vector u; - for (Face_descriptor f : faces(pmesh)) + for (Face_descriptor f : faces(pmesh)) + { + for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) { - for (Vertex_descriptor v : vertices_around_face(halfedge(f, pmesh), pmesh)) - { - Point_3 p = get(vpm, v); - x.push_back(Vector_3(p.x(), p.y(), p.z())); - u.push_back(get(vnm, v)); - } - put(mu0_map, f, interpolated_corrected_area_measure_face(u, x)); + Point_3 p = get(vpm, v); + x.push_back(Vector_3(p.x(), p.y(), p.z())); + u.push_back(get(vnm, v)); + } + put(mu0_map, f, interpolated_corrected_area_measure_face(u, x)); - if (is_mean_curvature_selected) - put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); + if (is_mean_curvature_selected) + put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); - if (is_gaussian_curvature_selected) - put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u)); + if (is_gaussian_curvature_selected) + put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u)); - if (is_principal_curvatures_and_directions_selected) - put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); + if (is_principal_curvatures_and_directions_selected) + put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); - x.clear(); - u.clear(); - } + x.clear(); + u.clear(); } + } - Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) - { - Vertex_measures vertex_measures; + Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) + { + Vertex_measures vertex_measures; - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f == boost::graph_traits::null_face()) - continue; + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f == boost::graph_traits::null_face()) + continue; - vertex_measures.area_measure += get(mu0_map, f); + vertex_measures.area_measure += get(mu0_map, f); - if (is_mean_curvature_selected) - vertex_measures.mean_curvature_measure += get(mu1_map, f); + if (is_mean_curvature_selected) + vertex_measures.mean_curvature_measure += get(mu1_map, f); - if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += get(mu2_map, f); + if (is_gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += get(mu2_map, f); - if (is_principal_curvatures_and_directions_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, f); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_measures.anisotropic_measure[i] += face_anisotropic_measure[i]; - } + if (is_principal_curvatures_and_directions_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, f); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += face_anisotropic_measure[i]; } - - return vertex_measures; } - Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) - { - std::queue bfs_queue; - std::unordered_set bfs_visited; + return vertex_measures; + } - Point_3 vp = get(vpm, v); - Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) + { + std::queue bfs_queue; + std::unordered_set bfs_visited; - Vertex_measures vertex_measures; + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); - for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { - if (f != boost::graph_traits::null_face()) - { - bfs_queue.push(f); - bfs_visited.insert(f); - } + Vertex_measures vertex_measures; + + for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { + if (f != boost::graph_traits::null_face()) + { + bfs_queue.push(f); + bfs_visited.insert(f); } - while (!bfs_queue.empty()) { - Face_descriptor fi = bfs_queue.front(); - bfs_queue.pop(); + } + while (!bfs_queue.empty()) { + Face_descriptor fi = bfs_queue.front(); + bfs_queue.pop(); - // looping over vertices in face to get point coordinates - std::vector x; - for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) - { - Point_3 pi = get(vpm, vi); - x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); - } + // looping over vertices in face to get point coordinates + std::vector x; + for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) + { + Point_3 pi = get(vpm, vi); + x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); + } - const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); + const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); - if (f_ratio != 0.0) - { - vertex_measures.area_measure += f_ratio * get(mu0_map, fi); + if (f_ratio != 0.0) + { + vertex_measures.area_measure += f_ratio * get(mu0_map, fi); - if (is_mean_curvature_selected) - vertex_measures.mean_curvature_measure += f_ratio * get(mu1_map, fi); + if (is_mean_curvature_selected) + vertex_measures.mean_curvature_measure += f_ratio * get(mu1_map, fi); - if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); + if (is_gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); - if (is_principal_curvatures_and_directions_selected) - { - const std::array face_anisotropic_measure = get(muXY_map, fi); - for (std::size_t i = 0; i < 3 * 3; i++) - vertex_measures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; - } + if (is_principal_curvatures_and_directions_selected) + { + const std::array face_anisotropic_measure = get(muXY_map, fi); + for (std::size_t i = 0; i < 3 * 3; i++) + vertex_measures.anisotropic_measure[i] += f_ratio * face_anisotropic_measure[i]; + } - for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + for (Face_descriptor fj : faces_around_face(halfedge(fi, pmesh), pmesh)) + { + if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) { - if (bfs_visited.find(fj) == bfs_visited.end() && fj != boost::graph_traits::null_face()) - { - bfs_queue.push(fj); - bfs_visited.insert(fj); - } + bfs_queue.push(fj); + bfs_visited.insert(fj); } } } - return vertex_measures; } + return vertex_measures; + } - void compute_selected_curvatures() { - interpolated_corrected_selected_measures_all_faces(); + void compute_selected_curvatures() { + interpolated_corrected_selected_measures_all_faces(); - for (Vertex_descriptor v : vertices(pmesh)) - { - Vertex_measures vertex_measures = (ball_radius < 0) ? - expand_interpolated_corrected_measure_vertex_no_radius(v) : - expand_interpolated_corrected_measure_vertex(v); - - if (is_mean_curvature_selected) { - vertex_measures.area_measure != 0 ? - put(mean_curvature_map, v, 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure) : - put(mean_curvature_map, v, 0); - } + for (Vertex_descriptor v : vertices(pmesh)) + { + Vertex_measures vertex_measures = (ball_radius < 0) ? + expand_interpolated_corrected_measure_vertex_no_radius(v) : + expand_interpolated_corrected_measure_vertex(v); + + if (is_mean_curvature_selected) { + vertex_measures.area_measure != 0 ? + put(mean_curvature_map, v, 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure) : + put(mean_curvature_map, v, 0); + } - if (is_gaussian_curvature_selected) { - vertex_measures.area_measure != 0 ? - put(gaussian_curvature_map, v, vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure) : - put(gaussian_curvature_map, v, 0); - } + if (is_gaussian_curvature_selected) { + vertex_measures.area_measure != 0 ? + put(gaussian_curvature_map, v, vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure) : + put(gaussian_curvature_map, v, 0); + } - if (is_principal_curvatures_and_directions_selected) { - const Vector_3 v_normal = get(vnm, v); - const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( - vertex_measures.anisotropic_measure, - vertex_measures.area_measure, - v_normal - ); - put(principal_curvatures_and_directions_map, v, principal_curvatures_and_directions); - } + if (is_principal_curvatures_and_directions_selected) { + const Vector_3 v_normal = get(vnm, v); + const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( + vertex_measures.anisotropic_measure, + vertex_measures.area_measure, + v_normal + ); + put(principal_curvatures_and_directions_map, v, principal_curvatures_and_directions); } } - }; + } +}; } // namespace internal @@ -1030,6 +1266,50 @@ template(pmesh, np); } +template + typename GT::FT interpolated_corrected_mean_curvature_at_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) +{ + // use interpolated_corrected_curvatures_at_vertex to compute mean curvature + typename GT::FT* mean_curvature = new typename GT::FT(); + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_mean_curvature(mean_curvature)); + return *mean_curvature; +} + +template + typename GT::FT interpolated_corrected_gaussian_curvature_at_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) +{ + // use interpolated_corrected_curvatures_at_vertex to compute gaussian curvature + typename GT::FT* gc = new typename GT::FT(); + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_gaussian_curvature(gc)); + return *gc; +} + +template + Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_at_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) +{ + // use interpolated_corrected_curvatures_at_vertex to compute principal curvatures + Principal_curvatures_and_directions* pcd = new Principal_curvatures_and_directions(); + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(pcd)); + return *pcd; +} + +template + void interpolated_corrected_curvatures_at_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) +{ + internal::interpolated_corrected_curvatures_one_vertex(pmesh, v, np); +} } // namespace Polygon_mesh_processing } // namespace CGAL 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 21b8227e86c9..0d5469775614 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -90,6 +90,9 @@ CGAL_add_named_parameter(nb_points_per_distance_unit_t, nb_points_per_distance_u CGAL_add_named_parameter(vertex_mean_curvature_map_t, vertex_mean_curvature_map, vertex_mean_curvature_map) CGAL_add_named_parameter(vertex_gaussian_curvature_map_t, vertex_gaussian_curvature_map, vertex_gaussian_curvature_map) CGAL_add_named_parameter(vertex_principal_curvatures_and_directions_map_t, vertex_principal_curvatures_and_directions_map, vertex_principal_curvatures_and_directions_map) +CGAL_add_named_parameter(vertex_mean_curvature_t, vertex_mean_curvature, vertex_mean_curvature) +CGAL_add_named_parameter(vertex_gaussian_curvature_t, vertex_gaussian_curvature, vertex_gaussian_curvature) +CGAL_add_named_parameter(vertex_principal_curvatures_and_directions_t, vertex_principal_curvatures_and_directions, vertex_principal_curvatures_and_directions) CGAL_add_named_parameter(ball_radius_t, ball_radius, ball_radius) CGAL_add_named_parameter(outward_orientation_t, outward_orientation, outward_orientation) CGAL_add_named_parameter(overlap_test_t, overlap_test, do_overlap_test_of_bounded_sides) From 73bde6daa0c57675f5eccd157fab07f6b0370d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 20 Jan 2023 16:02:25 +0100 Subject: [PATCH 0104/1398] Eigen is needed --- .../test/Polygon_mesh_processing/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index c1aedddedf4e..c446a7395dee 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -1,4 +1,4 @@ -# Created by the script cgal_create_CMakeLists +0# Created by the script cgal_create_CMakeLists # This is the CMake script for compiling a set of CGAL applications. cmake_minimum_required(VERSION 3.1...3.23) @@ -44,6 +44,8 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(test_shape_smoothing PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_test.cpp") target_link_libraries(delaunay_remeshing_test PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") + target_link_libraries(test_interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) endif() find_package(OpenMesh QUIET) @@ -69,7 +71,6 @@ create_single_source_cgal_program("self_intersection_polyhedron_test.cpp") create_single_source_cgal_program("self_intersection_surface_mesh_test.cpp") create_single_source_cgal_program("pmp_do_intersect_test.cpp") create_single_source_cgal_program("test_is_polygon_soup_a_polygon_mesh.cpp") -create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") create_single_source_cgal_program("test_stitching.cpp") create_single_source_cgal_program("remeshing_test.cpp") create_single_source_cgal_program("remeshing_with_isolated_constraints_test.cpp" ) From 8af5c620fafb7c6771357f91f05fb9000f748a90 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 23 Jan 2023 13:49:34 +0200 Subject: [PATCH 0105/1398] reference documentation + minor fix + added documentation for the at_vertext curvature functions - removed dynamically allocated pointers for storing the curvature on vertex --- .../PackageDescription.txt | 4 + ...nterpolated_corrected_curvature_measures.h | 761 ++++++++++++------ 2 files changed, 504 insertions(+), 261 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index f62b2816cf7f..f6696dc1ba8c 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -205,6 +205,10 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_at_vertex()` - `CGAL::Polygon_mesh_processing::Principal_curvatures_and_directions` \cgalCRPSection{Normal Computation Functions} diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 94aaff9b8b52..cdd25aefc0e5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -36,11 +36,11 @@ namespace CGAL { namespace Polygon_mesh_processing { /** -* \ingroup PMP_corrected_curvatures_grp -* -* \brief a struct for storing principal curvatures and directions. -* -* @tparam GT is the geometric traits class. + * \ingroup PMP_corrected_curvatures_grp + * + * \brief a struct for storing principal curvatures and directions. + * + * @tparam GT is the geometric traits class. */ template struct Principal_curvatures_and_directions { @@ -665,11 +665,11 @@ template vertex_measures; if (radius < 0) + { + std::cout << -1; vertex_measures = interpolated_corrected_measures_one_vertex_no_radius( pmesh, v, @@ -679,18 +679,21 @@ template( - pmesh, - v, - radius, - is_mean_curvature_selected, - is_gaussian_curvature_selected, - is_principal_curvatures_and_directions_selected, - vpm, - vnm - ); - + pmesh, + v, + radius, + is_mean_curvature_selected, + is_gaussian_curvature_selected, + is_principal_curvatures_and_directions_selected, + vpm, + vnm + ); + } if (is_mean_curvature_selected) { *vertex_mean_curvature = vertex_measures.area_measure != 0 ? @@ -988,58 +991,58 @@ class Interpolated_corrected_curvatures_computer } // namespace internal /** -* \ingroup PMP_corrected_curvatures_grp -* -* Computes the interpolated corrected mean curvature across the mesh -* and stores it in a vertex property map `vcm`. -* -* @tparam PolygonMesh a model of `FaceListGraph`. -* @tparam VertexCurvatureMap model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed mean curvatures are stored. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures -* by summing measures of faces inside a ball of this radius centered at the -* vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_gaussian_curvature()` -* @see `interpolated_corrected_principal_curvatures_and_directions()` -* @see `interpolated_corrected_curvatures()` + * \ingroup PMP_corrected_curvatures_grp + * + * Computes the interpolated corrected mean curvature across the mesh + * and stores it in a vertex property map `vcm`. + * + * @tparam PolygonMesh a model of `FaceListGraph`. + * @tparam VertexCurvatureMap model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". + * + * @param pmesh the polygon mesh. + * @param vcm the vertex property map in which the computed mean curvatures are stored. + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". + * + * \cgalNamedParamsBegin + * + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @see `interpolated_corrected_gaussian_curvature()` + * @see `interpolated_corrected_principal_curvatures_and_directions()` + * @see `interpolated_corrected_curvatures()` */ template::%Vertex_descriptor` as key type and `GT::FT` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed gaussian curvatures are stored. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures -* by summing measures of faces inside a ball of this radius centered at the -* vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_mean_curvature()` -* @see `interpolated_corrected_principal_curvatures_and_directions()` -* @see `interpolated_corrected_curvatures()` + * \ingroup PMP_corrected_curvatures_grp + * + * Computes the interpolated corrected gaussian curvature across the mesh + * and stores it in a vertex property map `vcm`. + * + * @tparam PolygonMesh a model of `FaceListGraph`. + * @tparam VertexCurvatureMap model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". + * + * @param pmesh the polygon mesh. + * @param vcm the vertex property map in which the computed gaussian curvatures are stored. + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". + * + * \cgalNamedParamsBegin + * + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @see `interpolated_corrected_mean_curvature()` + * @see `interpolated_corrected_principal_curvatures_and_directions()` + * @see `interpolated_corrected_curvatures()` */ template @@ -1115,59 +1118,59 @@ template::%Vertex_descriptor` as key type and -* `std::tuple, Eigen::Vector>` as value type. -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". -* -* @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed principal curvatures are stored. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below -* -* \cgalNamedParamsBegin -* -* \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures -* by summing measures of faces inside a ball of this radius centered at the -* vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_mean_curvature()` -* @see `interpolated_corrected_gaussian_curvature()` -* @see `interpolated_corrected_curvatures()` + * \ingroup PMP_corrected_curvatures_grp + * + * Computes the interpolated corrected principal curvatures across the mesh + * and stores it in a vertex property map `vcm`. + * + * @tparam PolygonMesh a model of `FaceListGraph`. + * @tparam VertexCurvatureMap model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` as key type and + * `%Principal_curvatures_and_directions` as value type. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". + * + * @param pmesh the polygon mesh. + * @param vcm the vertex property map in which the computed principal curvatures are stored. + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + * + * \cgalNamedParamsBegin + * + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @see `interpolated_corrected_mean_curvature()` + * @see `interpolated_corrected_gaussian_curvature()` + * @see `interpolated_corrected_curvatures()` */ template @@ -1179,84 +1182,84 @@ template::%Vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for -* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} -* \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_mean_curvature_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} -* \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_gaussian_curvature_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} -* \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} -* \cgalParamNEnd -* -* -* \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} -* \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Principal_curvatures_and_directions` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} -* \cgalParamNEnd -* -* \cgalParamNBegin{ball_radius} -* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures -* by summing measures of faces inside a ball of this radius centered at the -* vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball.} -* \cgalParamType{`GT::FT`} -* \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of -* measures on faces around the vertex} -* \cgalParamNEnd -* -* \cgalNamedParamsEnd -* -* @see `interpolated_corrected_mean_curvature()` -* @see `interpolated_corrected_gaussian_curvature()` -* @see `interpolated_corrected_principal_curvatures_and_directions()` + * \ingroup PMP_corrected_curvatures_grp + * + * Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. + * By providing mean, gaussian and/or principal curvature property maps as named parameters, the user + * can choose which curvatures to compute. + * + * @tparam PolygonMesh a model of `FaceListGraph`. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". + * + * @param pmesh the polygon mesh. + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + * + * \cgalNamedParamsBegin + * + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_mean_curvature_map} + * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} + * \cgalParamType{a class model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%FT` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_gaussian_curvature_map} + * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} + * \cgalParamType{a class model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%FT` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} + * \cgalParamNEnd + * + * + * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} + * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} + * \cgalParamType{a class model of `WritablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Principal_curvatures_and_directions` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball.} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @see `interpolated_corrected_mean_curvature()` + * @see `interpolated_corrected_gaussian_curvature()` + * @see `interpolated_corrected_principal_curvatures_and_directions()` */ template @@ -1266,6 +1269,60 @@ template(pmesh, np); } +/** + * \ingroup PMP_corrected_curvatures_grp + * computes the interpolated corrected mean curvature at a vertex of a triangle mesh. + * + * @tparam GT a geometric traits class that provides the nested type `FT`, + * @tparam PolygonMesh a model of `FaceListGraph` + * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" + * + * @param pmesh the polygon mesh + * @param v the vertex of `pmesh` to compute the mean curvature at + * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below + * + * \cgalNamedParamsBegin + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @return the interpolated corrected mean curvature at the vertex `v` + * + * @see `interpolated_corrected_mean_curvature()` + * @see `interpolated_corrected_gaussian_curvature_at_vertex()` + * @see `interpolated_corrected_principal_curvatures_and_directions_at_vertex()` + * @see `interpolated_corrected_curvatures_at_vertex()` +*/ + template typename GT::FT interpolated_corrected_mean_curvature_at_vertex(const PolygonMesh& pmesh, @@ -1273,11 +1330,65 @@ template::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @return the interpolated corrected Gaussian curvature at the vertex `v` + * + * @see `interpolated_corrected_gaussian_curvature()` + * @see `interpolated_corrected_mean_curvature_at_vertex()` + * @see `interpolated_corrected_principal_curvatures_and_directions_at_vertex()` + * @see `interpolated_corrected_curvatures_at_vertex()` +*/ + template typename GT::FT interpolated_corrected_gaussian_curvature_at_vertex(const PolygonMesh& pmesh, @@ -1285,11 +1396,64 @@ template::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * \cgalNamedParamsEnd + * + * @return the interpolated corrected principal curvatures and directions at the vertex `v` + * + * @see `interpolated_corrected_principal_curvatures_and_directions()` + * @see `interpolated_corrected_mean_curvature_at_vertex()` + * @see `interpolated_corrected_gaussian_curvature_at_vertex()` + * @see `interpolated_corrected_curvatures_at_vertex()` +*/ + template Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_at_vertex(const PolygonMesh& pmesh, @@ -1297,11 +1461,86 @@ template* pcd = new Principal_curvatures_and_directions(); - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(pcd)); - return *pcd; + Principal_curvatures_and_directions pcd; + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); + return pcd; } +/** + * \ingroup PMP_corrected_curvatures_grp + * Computes the interpolated corrected curvatures at a certain vertex, based on the provided pointers. + * By providing mean, gaussian and/or principal curvature pointers as named parameters, the user + * can choose which curvatures to compute. + * The pointers are used to store the computed curvatures. + * The user is responsible for the memory management of the pointers. + * + * @tparam PolygonMesh a model of `FaceListGraph` + * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" + * + * @param pmesh the polygon mesh + * @param v the vertex of `pmesh` to compute the curvatures at + * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below + * + * \cgalNamedParamsBegin + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for + * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_normal_map} + * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} + * \cgalParamType{a class model of `ReadablePropertyMap` with + * `boost::graph_traits::%Vertex_descriptor` + * as key type and `%Vector_3` as value type} + * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} + * \cgalParamExtra{If this parameter is omitted, vertex normals will be + * computed using compute_vertex_normals()} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_mean_curvature} + * \cgalParamDescription{a pointer to a scalar value to store the mean curvature at the vertex `v`} + * \cgalParamType{`GT::FT*`} + * \cgalParamDefault{`nullptr`} + * \cgalParamExtra{If this parameter is omitted, mean curvature won't be computed} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_gaussian_curvature} + * \cgalParamDescription{a pointer to a scalar value to store the gaussian curvature at the vertex `v`} + * \cgalParamType{`GT::FT*`} + * \cgalParamDefault{`nullptr`} + * \cgalParamExtra{If this parameter is omitted, gaussian curvature won't be computed} + * \cgalParamNEnd + * + * \cgalParamNBegin{vertex_principal_curvatures_and_directions} + * \cgalParamDescription{a pointer to a Principal_curvatures_and_directions object to store the principal curvatures and directions at the vertex `v`} + * \cgalParamType{`Principal_curvatures_and_directions*`} + * \cgalParamDefault{`nullptr`} + * \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} + * \cgalParamNEnd + * + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball.} + * \cgalParamType{`GT::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of + * measures on faces around the vertex} + * \cgalParamNEnd + * + * \cgalNamedParamsEnd + * + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` +*/ template void interpolated_corrected_curvatures_at_vertex(const PolygonMesh& pmesh, From 483e8b8e509ee4420ba0861ab70dd5a50133f7b0 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 08:44:09 +0200 Subject: [PATCH 0106/1398] User manual + add example file for 1 vertex curvature --- .../Polygon_mesh_processing.txt | 16 ++++- .../Polygon_mesh_processing/CMakeLists.txt | 2 + ...corrected_curvatures_at_vertex_example.cpp | 60 +++++++++++++++++++ ...erpolated_corrected_curvatures_example.cpp | 2 + ...nterpolated_corrected_curvature_measures.h | 2 - 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 1d7184561a80..49f912ee5ca7 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -889,7 +889,7 @@ correct vertex normals are provided. The implementation is generic in terms of mesh data structure. It can be used on Surface_mesh, Polyhedron_3 and other polygonal mesh structures based on the Face Graph Model. -These computations are performed using : +These computations are performed using (on all vertices of mesh): - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` @@ -898,6 +898,13 @@ These computations are performed using : Where it is recommended to use the last function for computing multiple curvatures (example: mean and gaussian) as the implementation performs the shared computations only once, making it more efficient. +Similarly, we can use the following example functions to compute the curvatures on a specific vertex: +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_at_vertex()` + + \cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on the ball_radius named parameter which can be set to a value > 0 to get a smoother distribution of values and "diffuse" the extreme values of curvatures across the mesh. @@ -934,6 +941,13 @@ not provide storage for the curvatures. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp} +\subsection ICCExamplePH Interpolated Corrected Curvature on a Vertex Example + +The following example illustrates how to +compute the curvatures on a specific vertex + +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp} + **************************************** \section PMPSlicer Slicer diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index ab084384835b..5e840c38a508 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -109,6 +109,8 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(interpolated_corrected_curvatures_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("interpolated_corrected_curvatures_polyhedron_example.cpp") target_link_libraries(interpolated_corrected_curvatures_polyhedron_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_at_vertex_example.cpp") + target_link_libraries(interpolated_corrected_curvatures_at_vertex_example PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp new file mode 100644 index 000000000000..6ed061db93b8 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +#include + +#include + +namespace PMP = CGAL::Polygon_mesh_processing; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; +typedef Epic_kernel::FT FT; +typedef CGAL::Surface_mesh Surface_Mesh; +typedef boost::graph_traits::face_descriptor face_descriptor; +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + +int main(int argc, char* argv[]) +{ + // instantiating and reading mesh + Surface_Mesh smesh; + const std::string filename = (argc > 1) ? + argv[1] : + CGAL::data_file_path("meshes/small_bunny.obj"); + + if (!CGAL::IO::read_polygon_mesh(filename, smesh)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + + // loop over vertices and use vertex_descriptor to compute a curvature on one vertex + for (vertex_descriptor v : vertices(smesh)) + { + FT h = PMP::interpolated_corrected_mean_curvature_at_vertex(smesh, v); + FT g = PMP::interpolated_corrected_gaussian_curvature_at_vertex(smesh, v); + PMP::Principal_curvatures_and_directions p = + PMP::interpolated_corrected_principal_curvatures_and_directions_at_vertex(smesh, v); + + // we can also specify a ball radius for expansion and a user defined vertex normals map using + // named parameters. Refer to interpolated_corrected_curvatures_example.cpp to see example usage. + + // Can also use interpolated_corrected_curvatures_at_vertex() to compute multiple curvatures + // on the vertex at the same time. This is more efficient than computing each one separately. + // The following commented lines show this (all mentioned named parameters work on it as well) + // we specify which curvatures we want to compute by passing pointers as named parameters + // as shown. These pointers are used for storing the result as well. in this example we + // selected mean and gaussian curvatures + // PMP::interpolated_corrected_curvatures_at_vertex( + // smesh, + // v, + // CGAL::parameters::vertex_mean_curvature(&h) + // .vertex_gaussian_curvature(&g) + // ); + + std::cout << v.idx() << ": HC = " << h + << ", GC = " << g << "\n" + << ", PC = [ " << p.min_curvature << " , " << p.max_curvature << " ]\n"; + } +} diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 33d34cd34f13..91266f594135 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -47,6 +47,8 @@ int main(int argc, char* argv[]) assert(created); // user can call these fucntions to compute a specfic curvature type on each vertex. + // (Note: if no ball radius is specified, the measure expansion of each vertex happens by + // summing measures on faces adjacent to each vertex.) PMP::interpolated_corrected_mean_curvature( smesh, mean_curvature_map diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index cdd25aefc0e5..847bac1f5c06 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -669,7 +669,6 @@ template( pmesh, v, @@ -682,7 +681,6 @@ template( pmesh, v, From a7cd6a275ecabaad05c802b4593e1f7235e25e65 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 09:00:24 +0200 Subject: [PATCH 0107/1398] trailling whitespaces --- ...olated_corrected_curvatures_at_vertex_example.cpp | 12 ++++++------ .../interpolated_corrected_curvatures_example.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp index 6ed061db93b8..009c5881f262 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp @@ -17,7 +17,7 @@ typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) { - // instantiating and reading mesh + // instantiating and reading mesh Surface_Mesh smesh; const std::string filename = (argc > 1) ? argv[1] : @@ -34,21 +34,21 @@ int main(int argc, char* argv[]) { FT h = PMP::interpolated_corrected_mean_curvature_at_vertex(smesh, v); FT g = PMP::interpolated_corrected_gaussian_curvature_at_vertex(smesh, v); - PMP::Principal_curvatures_and_directions p = + PMP::Principal_curvatures_and_directions p = PMP::interpolated_corrected_principal_curvatures_and_directions_at_vertex(smesh, v); - // we can also specify a ball radius for expansion and a user defined vertex normals map using + // we can also specify a ball radius for expansion and a user defined vertex normals map using // named parameters. Refer to interpolated_corrected_curvatures_example.cpp to see example usage. // Can also use interpolated_corrected_curvatures_at_vertex() to compute multiple curvatures // on the vertex at the same time. This is more efficient than computing each one separately. // The following commented lines show this (all mentioned named parameters work on it as well) - // we specify which curvatures we want to compute by passing pointers as named parameters - // as shown. These pointers are used for storing the result as well. in this example we + // we specify which curvatures we want to compute by passing pointers as named parameters + // as shown. These pointers are used for storing the result as well. in this example we // selected mean and gaussian curvatures // PMP::interpolated_corrected_curvatures_at_vertex( // smesh, - // v, + // v, // CGAL::parameters::vertex_mean_curvature(&h) // .vertex_gaussian_curvature(&g) // ); diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 91266f594135..511288702336 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -47,7 +47,7 @@ int main(int argc, char* argv[]) assert(created); // user can call these fucntions to compute a specfic curvature type on each vertex. - // (Note: if no ball radius is specified, the measure expansion of each vertex happens by + // (Note: if no ball radius is specified, the measure expansion of each vertex happens by // summing measures on faces adjacent to each vertex.) PMP::interpolated_corrected_mean_curvature( smesh, From fc943a4c317588c51b7e64da23dd84c4fef9672a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 09:18:05 +0200 Subject: [PATCH 0108/1398] minor doc fixes --- .../Polygon_mesh_processing/Polygon_mesh_processing.txt | 8 ++++---- .../doc/Polygon_mesh_processing/examples.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 49f912ee5ca7..426e9e3b54a6 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -898,7 +898,7 @@ These computations are performed using (on all vertices of mesh): Where it is recommended to use the last function for computing multiple curvatures (example: mean and gaussian) as the implementation performs the shared computations only once, making it more efficient. -Similarly, we can use the following example functions to compute the curvatures on a specific vertex: +Similarly, we can use the following functions to compute curvatures on a specific vertex: - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` @@ -924,7 +924,7 @@ Property maps are an API introduced in the boost library that allows associating values to keys. In the following examples, for each property map, we associate a curvature value to each vertex. -\subsection ICCExampleSM Interpolated Corrected Curvature on a Surface Mesh Example +\subsection ICCExampleSM Interpolated Corrected Curvatures on a Surface Mesh Example The following example illustrates how to compute the curvatures on vertices @@ -932,7 +932,7 @@ and store them in property maps provided by the class `Surface_mesh`. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp} -\subsection ICCExamplePH Interpolated Corrected Curvature on a Polyhedron Example +\subsection ICCExamplePH Interpolated Corrected Curvatures on a Polyhedron Example The following example illustrates how to compute the curvatures on vertices @@ -941,7 +941,7 @@ not provide storage for the curvatures. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp} -\subsection ICCExamplePH Interpolated Corrected Curvature on a Vertex Example +\subsection ICCExampleSV Interpolated Corrected Curvatures on a Vertex Example The following example illustrates how to compute the curvatures on a specific vertex diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 0588d1c76e14..58af6e391b56 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -21,6 +21,7 @@ \example Polygon_mesh_processing/isotropic_remeshing_example.cpp \example Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp \example Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +\example Polygon_mesh_processing/interpolated_corrected_gaussian_curvature_at_vertex.cpp \example Polygon_mesh_processing/delaunay_remeshing_example.cpp \example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp \example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp From ca4e412e0e1d98c605ef6cc16eb448a43f66158f Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 09:35:20 +0200 Subject: [PATCH 0109/1398] minor fix --- .../test/Polygon_mesh_processing/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index c446a7395dee..8608e203c6eb 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -1,4 +1,4 @@ -0# Created by the script cgal_create_CMakeLists +# Created by the script cgal_create_CMakeLists # This is the CMake script for compiling a set of CGAL applications. cmake_minimum_required(VERSION 3.1...3.23) From da3db9a40674ac30071ec9e579412e1c2ba9a8a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 09:58:35 +0100 Subject: [PATCH 0110/1398] typo --- .../test/Polygon_mesh_processing/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index c446a7395dee..8608e203c6eb 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -1,4 +1,4 @@ -0# Created by the script cgal_create_CMakeLists +# Created by the script cgal_create_CMakeLists # This is the CMake script for compiling a set of CGAL applications. cmake_minimum_required(VERSION 3.1...3.23) From 50ba18725ca32ab402357f13409bcee7f1e9fd79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 11:10:29 +0100 Subject: [PATCH 0111/1398] fix typename usage --- ...nterpolated_corrected_curvature_measures.h | 26 +++++++++---------- ...test_interpolated_corrected_curvatures.cpp | 6 ++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 94aaff9b8b52..94520cf403dd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -479,7 +479,7 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from } template -typename Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( +Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( const PolygonMesh pmesh, const typename boost::graph_traits::vertex_descriptor v, const bool is_mean_curvature_selected, @@ -498,7 +498,7 @@ typename Vertex_measures interpolated_corrected_measures_one_vertex_no_radiu std::queue bfs_queue; std::unordered_set bfs_visited; - typename Vertex_measures vertex_measures; + Vertex_measures vertex_measures; std::vector x; std::vector u; @@ -538,7 +538,7 @@ typename Vertex_measures interpolated_corrected_measures_one_vertex_no_radiu template -typename Vertex_measures interpolated_corrected_measures_one_vertex( +Vertex_measures interpolated_corrected_measures_one_vertex( const PolygonMesh pmesh, const typename boost::graph_traits::vertex_descriptor v, const typename GT::FT radius, @@ -558,10 +558,10 @@ typename Vertex_measures interpolated_corrected_measures_one_vertex( std::queue bfs_queue; std::unordered_set bfs_visited; - typename Vertex_measures vertex_measures; + Vertex_measures vertex_measures; - typename Point_3 vp = get(vpm, v); - typename Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); + Point_3 vp = get(vpm, v); + Vector_3 c = Vector_3(vp.x(), vp.y(), vp.z()); for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f != boost::graph_traits::null_face()) @@ -626,13 +626,13 @@ template::vertex_descriptor v, - NamedParameters& np = parameters::default_values() + const NamedParameters& np = parameters::default_values() ) { typedef typename GetGeomTraits::type GT; typedef typename GetVertexPointMap::const_type Vertex_position_map; - typedef dynamic_vertex_property_t Vector_map_tag; + typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def* vertex_principal_curvatures_and_directions = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions), nullptr); + Principal_curvatures_and_directions* vertex_principal_curvatures_and_directions = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions), nullptr); const bool is_mean_curvature_selected = (vertex_mean_curvature != nullptr); const bool is_gaussian_curvature_selected = (vertex_gaussian_curvature != nullptr); @@ -703,7 +703,7 @@ template principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, @@ -1046,7 +1046,7 @@ template void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); } @@ -1109,7 +1109,7 @@ template void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); } @@ -1173,7 +1173,7 @@ template void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, - NamedParameters& np = parameters::default_values()) + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvatures_and_directions_map(vcm)); } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index 163c9b8d334d..7f8aa1f7d691 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -63,12 +63,12 @@ void test_average_curvatures(std::string mesh_path, Average_test_info test_info) std::cerr << "Invalid input file." << std::endl; } - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - boost::property_map>::type + typename boost::property_map>::type mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh), gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - boost::property_map>>::type + typename boost::property_map>>::type principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); // test_info.expansion_radius -> test if no radius is provided by user. From 69610f6958dc51f31ede8a0e75c32e4f4c9a5c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 11:15:04 +0100 Subject: [PATCH 0112/1398] move function --- ...nterpolated_corrected_curvature_measures.h | 128 +++++++++--------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 94520cf403dd..821436dc05f6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -990,17 +990,15 @@ class Interpolated_corrected_curvatures_computer /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected mean curvature across the mesh -* and stores it in a vertex property map `vcm`. +* Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. +* By providing mean, gaussian and/or principal curvature property maps as named parameters, the user +* can choose which curvatures to compute. * * @tparam PolygonMesh a model of `FaceListGraph`. -* @tparam VertexCurvatureMap model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed mean curvatures are stored. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * @@ -1024,37 +1022,63 @@ class Interpolated_corrected_curvatures_computer * computed using compute_vertex_normals()} * \cgalParamNEnd * +* \cgalParamNBegin{vertex_mean_curvature_map} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamType{a class model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%FT` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_gaussian_curvature_map} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamType{a class model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%FT` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} +* \cgalParamNEnd +* +* +* \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamType{a class model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` +* as key type and `%Principal_curvatures_and_directions` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} +* \cgalParamNEnd +* * \cgalParamNBegin{ball_radius} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of * measures on faces around the vertex} * \cgalParamNEnd * * \cgalNamedParamsEnd * +* @see `interpolated_corrected_mean_curvature()` * @see `interpolated_corrected_gaussian_curvature()` * @see `interpolated_corrected_principal_curvatures_and_directions()` -* @see `interpolated_corrected_curvatures()` */ - -template - void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, + void interpolated_corrected_curvatures(const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); + internal::Interpolated_corrected_curvatures_computer(pmesh, np); } /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected gaussian curvature across the mesh +* Computes the interpolated corrected mean curvature across the mesh * and stores it in a vertex property map `vcm`. * * @tparam PolygonMesh a model of `FaceListGraph`. @@ -1063,7 +1087,7 @@ template - void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, + void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, const NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); } /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected principal curvatures across the mesh +* Computes the interpolated corrected gaussian curvature across the mesh * and stores it in a vertex property map `vcm`. * * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` as key type and -* `std::tuple, Eigen::Vector>` as value type. +* `boost::graph_traits::%Vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed principal curvatures are stored. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* @param vcm the vertex property map in which the computed gaussian curvatures are stored. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". * * \cgalNamedParamsBegin * @@ -1166,29 +1190,32 @@ template - void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, + void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, VertexCurvatureMap& vcm, const NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvatures_and_directions_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); } /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. -* By providing mean, gaussian and/or principal curvature property maps as named parameters, the user -* can choose which curvatures to compute. +* Computes the interpolated corrected principal curvatures across the mesh +* and stores it in a vertex property map `vcm`. * * @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam VertexCurvatureMap model of `WritablePropertyMap` with +* `boost::graph_traits::%Vertex_descriptor` as key type and +* `std::tuple, Eigen::Vector>` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. +* @param vcm the vertex property map in which the computed principal curvatures are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -1213,42 +1240,14 @@ template::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} -* \cgalParamNEnd -* -* \cgalParamNBegin{vertex_gaussian_curvature_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} -* \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} -* \cgalParamNEnd -* -* -* \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} -* \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Principal_curvatures_and_directions` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} -* \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} -* \cgalParamNEnd -* * \cgalParamNBegin{ball_radius} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball.} +* inclusion ratio inside this ball} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of * measures on faces around the vertex} * \cgalParamNEnd * @@ -1256,14 +1255,15 @@ template - void interpolated_corrected_curvatures(const PolygonMesh& pmesh, + void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, + VertexCurvatureMap& vcm, const NamedParameters& np = parameters::default_values()) { - internal::Interpolated_corrected_curvatures_computer(pmesh, np); + interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvatures_and_directions_map(vcm)); } template Date: Tue, 24 Jan 2023 11:27:31 +0100 Subject: [PATCH 0113/1398] fix warning --- .../Interpolated_corrected_principal_curvatures_plugin.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index 789ba4a06567..e5a01f7b3c3b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -81,7 +81,7 @@ void compute(SMesh* sMesh, CGAL::parameters::ball_radius(0) ); - typename Epic_kernel::FT max_curvature_magnitude_on_mesh = 0; + double max_curvature_magnitude_on_mesh = 0; for (Vertex_descriptor v : vertices(*sMesh)) { const PMP::Principal_curvatures_and_directions pc = principal_curvatures_and_directions_map[v]; @@ -99,11 +99,9 @@ void compute(SMesh* sMesh, // compute min edge len around central vertex // to scale the ribbons used to display the directions - typedef EPICK::FT FT; - const std::size_t n = CGAL::edges(*sMesh).size(); - Epic_kernel::FT avg_edge_length = 0; + double avg_edge_length = 0; if (n > 0) { for (auto e : CGAL::edges(*sMesh)) avg_edge_length += PMP::edge_length(e, *sMesh); From 999b475e4ca5142589b239fb8418a7ff78254c56 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 14:08:02 +0200 Subject: [PATCH 0114/1398] tests (incomplete) + minor typename fix still not passing single vertex on polyhedron due to a problem with vertex normal map --- ...nterpolated_corrected_curvature_measures.h | 10 ++-- ...test_interpolated_corrected_curvatures.cpp | 58 ++++++++++++++++--- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 847bac1f5c06..4cf352e32e48 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -399,8 +399,8 @@ std::array interpolated_corrected_anisotropic_measure_fa // const typename GT::FT R = r * r; // const typename GT::FT acc = 1.0 / res; // std::size_t samples_in = 0; -// for (GT::FT alpha = acc / 3; alpha < 1; alpha += acc) -// for (GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) +// for (typename GT::FT alpha = acc / 3; alpha < 1; alpha += acc) +// for (typename GT::FT beta = acc / 3; beta < 1 - alpha; beta += acc) // { // if ((alpha * x1 + beta * x2 + (1 - alpha - beta) * x3 - c).squared_length() < R) // samples_in++; @@ -632,7 +632,7 @@ template::type GT; typedef typename GetVertexPointMap::const_type Vertex_position_map; - typedef dynamic_vertex_property_t Vector_map_tag; + typedef dynamic_vertex_property_t Vector_map_tag; typedef typename boost::property_map::const_type Default_vector_map; typedef typename internal_np::Lookup_named_param_def(pmesh) * EXPANDING_RADIUS_EPSILON; - else - radius = radius; typename GT::FT* vertex_mean_curvature = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature), nullptr); typename GT::FT* vertex_gaussian_curvature = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature), nullptr); @@ -704,7 +702,7 @@ template principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index 163c9b8d334d..a6fa6f712680 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -54,7 +54,11 @@ bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_ke } template -void test_average_curvatures(std::string mesh_path, Average_test_info test_info){ +void test_average_curvatures(std::string mesh_path, + Average_test_info test_info, + bool compare_single_vertex = false +){ + PolygonMesh pmesh; const std::string filename = CGAL::data_file_path(mesh_path); @@ -116,6 +120,7 @@ void test_average_curvatures(std::string mesh_path, Average_test_info test_info) assert(passes_comparison(gaussian_curvature_avg, test_info.gaussian_curvature_avg, test_info.tolerance)); assert(passes_comparison(principal_curvature_avg, test_info.principal_curvature_avg, test_info.tolerance)); + // computing curvatures together from interpolated_corrected_curvatures() PMP::interpolated_corrected_curvatures( pmesh, CGAL::parameters::ball_radius(test_info.expansion_radius) @@ -124,7 +129,6 @@ void test_average_curvatures(std::string mesh_path, Average_test_info test_info) .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map) ); - // are average curvatures computed from interpolated_corrected_curvatures() equal to average curvatures each computed on its own? Epic_kernel::FT new_mean_curvature_avg = 0, new_gaussian_curvature_avg = 0, new_principal_curvature_avg = 0; for (vertex_descriptor v : vertices(pmesh)) @@ -138,22 +142,62 @@ void test_average_curvatures(std::string mesh_path, Average_test_info test_info) new_mean_curvature_avg /= vertices(pmesh).size(); new_gaussian_curvature_avg /= vertices(pmesh).size(); new_principal_curvature_avg /= vertices(pmesh).size() * 2; - + + // are average curvatures computed from interpolated_corrected_curvatures() + // equal to average curvatures each computed on its own? assert(passes_comparison(mean_curvature_avg, new_mean_curvature_avg, 0.99)); assert(passes_comparison(gaussian_curvature_avg, new_gaussian_curvature_avg, 0.99)); assert(passes_comparison(principal_curvature_avg, new_principal_curvature_avg, 0.99)); + + if (compare_single_vertex) + { + // computing curvatures together from interpolated_corrected_curvatures() + + Epic_kernel::FT single_vertex_mean_curvature_avg = 0, + single_vertex_gaussian_curvature_avg = 0, + single_vertex_principal_curvature_avg = 0; + + Epic_kernel::FT h, g; + PMP::Principal_curvatures_and_directions p; + + for (vertex_descriptor v : vertices(pmesh)) + { + PMP::interpolated_corrected_curvatures_at_vertex( + pmesh, + v, + CGAL::parameters::vertex_gaussian_curvature(&g) + .vertex_mean_curvature(&h) + .vertex_principal_curvatures_and_directions(&p) + ); + + single_vertex_mean_curvature_avg += h; + single_vertex_gaussian_curvature_avg += g; + single_vertex_principal_curvature_avg += p.min_curvature + p.max_curvature; + } + + single_vertex_mean_curvature_avg /= vertices(pmesh).size(); + single_vertex_gaussian_curvature_avg /= vertices(pmesh).size(); + single_vertex_principal_curvature_avg /= vertices(pmesh).size() * 2; + + assert(passes_comparison(mean_curvature_avg, single_vertex_mean_curvature_avg, 0.99)); + assert(passes_comparison(gaussian_curvature_avg, single_vertex_gaussian_curvature_avg, 0.99)); + assert(passes_comparison(principal_curvature_avg, single_vertex_principal_curvature_avg, 0.99)); + } + } int main() { // testing on a simple sphere(r = 0.5), on both Polyhedron & SurfaceMesh: + // For this mesh, ina addition to the whole mesh functions, we also compare against the single vertex + // curvature functions to make sure the produce the same results // Expected: Mean Curvature = 2, Gaussian Curvature = 4, Principal Curvatures = 2 & 2 so 2 on avg. - test_average_curvatures("meshes/sphere.off", Average_test_info(2,4,2)); - test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2)); + test_average_curvatures("meshes/sphere.off", Average_test_info(2,4,2), true); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2), true); // Same mesh but with specified expansion radii of 0 and 0.25 (half radius of sphere) - test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0)); - test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0.25)); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0), true); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2, 0.25), true); // testing on a simple sphere(r = 10), on both Polyhedron & SurfaceMesh: // Expected: Mean Curvature = 0.1, Gaussian Curvature = 0.01, Principal Curvatures = 0.1 & 0.1 so 0.1 on avg. From 7303c7401e476d85784715ab3c28e05a8ca3eb8a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 14:42:39 +0200 Subject: [PATCH 0115/1398] move function + minor func doc fix --- ...nterpolated_corrected_curvature_measures.h | 155 +++++++++--------- 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 078fcaeb48e3..2ae9a6856e38 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -1210,7 +1210,7 @@ template::%Vertex_descriptor` as key type and -* `std::tuple, Eigen::Vector>` as value type. +* `%Principal_curvatures_and_directions` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. @@ -1265,16 +1265,20 @@ template*`} + * \cgalParamDefault{`nullptr`} + * \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} + * \cgalParamNEnd + * * \cgalParamNBegin{ball_radius} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball} + * inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of * measures on faces around the vertex} * \cgalParamNEnd * * \cgalNamedParamsEnd * - * @return the interpolated corrected mean curvature at the vertex `v` - * - * @see `interpolated_corrected_mean_curvature()` - * @see `interpolated_corrected_gaussian_curvature_at_vertex()` - * @see `interpolated_corrected_principal_curvatures_and_directions_at_vertex()` - * @see `interpolated_corrected_curvatures_at_vertex()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` + * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` */ - -template - typename GT::FT interpolated_corrected_mean_curvature_at_vertex(const PolygonMesh& pmesh, + void interpolated_corrected_curvatures_at_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute mean curvature - typename GT::FT mean_curvature; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); - return mean_curvature; + internal::interpolated_corrected_curvatures_one_vertex(pmesh, v, np); } /** * \ingroup PMP_corrected_curvatures_grp - * computes the interpolated corrected Gaussian curvature at a vertex of a triangle mesh. + * computes the interpolated corrected mean curvature at a vertex of a triangle mesh. * * @tparam GT a geometric traits class that provides the nested type `FT`, * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the Gaussian curvature at + * @param v the vertex of `pmesh` to compute the mean curvature at * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -1377,36 +1396,36 @@ template - typename GT::FT interpolated_corrected_gaussian_curvature_at_vertex(const PolygonMesh& pmesh, + typename GT::FT interpolated_corrected_mean_curvature_at_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute gaussian curvature - typename GT::FT gc; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); - return gc; + // use interpolated_corrected_curvatures_at_vertex to compute mean curvature + typename GT::FT mean_curvature; + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); + return mean_curvature; } /** * \ingroup PMP_corrected_curvatures_grp - * computes the interpolated corrected principal curvatures and directions at a vertex of a triangle mesh. + * computes the interpolated corrected Gaussian curvature at a vertex of a triangle mesh. * - * @tparam GT the geometric traits class, + * @tparam GT a geometric traits class that provides the nested type `FT`, * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the principal curvatures and directions at + * @param v the vertex of `pmesh` to compute the Gaussian curvature at * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -1440,41 +1459,39 @@ template - Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_at_vertex(const PolygonMesh& pmesh, + typename GT::FT interpolated_corrected_gaussian_curvature_at_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute principal curvatures - Principal_curvatures_and_directions pcd; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); - return pcd; + // use interpolated_corrected_curvatures_at_vertex to compute gaussian curvature + typename GT::FT gc; + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); + return gc; } /** * \ingroup PMP_corrected_curvatures_grp - * Computes the interpolated corrected curvatures at a certain vertex, based on the provided pointers. - * By providing mean, gaussian and/or principal curvature pointers as named parameters, the user - * can choose which curvatures to compute. - * The pointers are used to store the computed curvatures. - * The user is responsible for the memory management of the pointers. + * computes the interpolated corrected principal curvatures and directions at a vertex of a triangle mesh. * + * @tparam GT the geometric traits class, * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the curvatures at + * @param v the vertex of `pmesh` to compute the principal curvatures and directions at * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -1498,52 +1515,36 @@ template*`} - * \cgalParamDefault{`nullptr`} - * \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} - * \cgalParamNEnd - * * \cgalParamNBegin{ball_radius} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball.} + * inclusion ratio inside this ball} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of * measures on faces around the vertex} * \cgalParamNEnd - * * \cgalNamedParamsEnd * - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` + * @return the interpolated corrected principal curvatures and directions at the vertex `v` + * + * @see `interpolated_corrected_principal_curvatures_and_directions()` + * @see `interpolated_corrected_mean_curvature_at_vertex()` + * @see `interpolated_corrected_gaussian_curvature_at_vertex()` + * @see `interpolated_corrected_curvatures_at_vertex()` */ -template - void interpolated_corrected_curvatures_at_vertex(const PolygonMesh& pmesh, + Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_at_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - internal::interpolated_corrected_curvatures_one_vertex(pmesh, v, np); + // use interpolated_corrected_curvatures_at_vertex to compute principal curvatures + Principal_curvatures_and_directions pcd; + interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); + return pcd; } } // namespace Polygon_mesh_processing From f9c21faf02f7296a6285909dffa9c3758599e564 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 15:11:58 +0200 Subject: [PATCH 0116/1398] trailling white spaces --- .../test_interpolated_corrected_curvatures.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index cd71fbb20f34..367d3c7045d1 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -54,7 +54,7 @@ bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_ke } template -void test_average_curvatures(std::string mesh_path, +void test_average_curvatures(std::string mesh_path, Average_test_info test_info, bool compare_single_vertex = false ){ @@ -142,8 +142,8 @@ void test_average_curvatures(std::string mesh_path, new_mean_curvature_avg /= vertices(pmesh).size(); new_gaussian_curvature_avg /= vertices(pmesh).size(); new_principal_curvature_avg /= vertices(pmesh).size() * 2; - - // are average curvatures computed from interpolated_corrected_curvatures() + + // are average curvatures computed from interpolated_corrected_curvatures() // equal to average curvatures each computed on its own? assert(passes_comparison(mean_curvature_avg, new_mean_curvature_avg, 0.99)); assert(passes_comparison(gaussian_curvature_avg, new_gaussian_curvature_avg, 0.99)); @@ -156,15 +156,15 @@ void test_average_curvatures(std::string mesh_path, Epic_kernel::FT single_vertex_mean_curvature_avg = 0, single_vertex_gaussian_curvature_avg = 0, single_vertex_principal_curvature_avg = 0; - + Epic_kernel::FT h, g; PMP::Principal_curvatures_and_directions p; - + for (vertex_descriptor v : vertices(pmesh)) { PMP::interpolated_corrected_curvatures_at_vertex( pmesh, - v, + v, CGAL::parameters::vertex_gaussian_curvature(&g) .vertex_mean_curvature(&h) .vertex_principal_curvatures_and_directions(&p) @@ -189,8 +189,8 @@ void test_average_curvatures(std::string mesh_path, int main() { // testing on a simple sphere(r = 0.5), on both Polyhedron & SurfaceMesh: - // For this mesh, ina addition to the whole mesh functions, we also compare against the single vertex - // curvature functions to make sure the produce the same results + // For this mesh, ina addition to the whole mesh functions, we also compare against the single vertex + // curvature functions to make sure the produce the same results // Expected: Mean Curvature = 2, Gaussian Curvature = 4, Principal Curvatures = 2 & 2 so 2 on avg. test_average_curvatures("meshes/sphere.off", Average_test_info(2,4,2), true); test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2), true); From 92e22644357462fd3b13af386d4795284999639e Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 17:58:03 +0200 Subject: [PATCH 0117/1398] Update test_interpolated_corrected_curvatures.cpp --- .../test_interpolated_corrected_curvatures.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index 367d3c7045d1..12ab2bff3872 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -168,6 +168,7 @@ void test_average_curvatures(std::string mesh_path, CGAL::parameters::vertex_gaussian_curvature(&g) .vertex_mean_curvature(&h) .vertex_principal_curvatures_and_directions(&p) + .ball_radius(test_info.expansion_radius) ); single_vertex_mean_curvature_avg += h; From 6f2f912c4d03e5a418d37c2f9b1de7c0d4de4a5a Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 24 Jan 2023 18:41:25 +0200 Subject: [PATCH 0118/1398] minor fix --- .../Curvatures/interpolated_corrected_curvature_measures.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 2ae9a6856e38..32287848fb31 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -480,7 +480,7 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from template Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( - const PolygonMesh pmesh, + const PolygonMesh& pmesh, const typename boost::graph_traits::vertex_descriptor v, const bool is_mean_curvature_selected, const bool is_gaussian_curvature_selected, @@ -539,7 +539,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( template Vertex_measures interpolated_corrected_measures_one_vertex( - const PolygonMesh pmesh, + const PolygonMesh& pmesh, const typename boost::graph_traits::vertex_descriptor v, const typename GT::FT radius, const bool is_mean_curvature_selected, @@ -624,7 +624,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( template void interpolated_corrected_curvatures_one_vertex( - const PolygonMesh pmesh, + const PolygonMesh& pmesh, const typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values() ) From 1294548acc0444ec23145fe29d3e428baa515f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 17:58:27 +0100 Subject: [PATCH 0119/1398] avoid macro substitution --- .../test_interpolated_corrected_curvatures.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index 12ab2bff3872..2aa963fea52b 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -50,7 +50,7 @@ bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_ke else if (abs(expected) < ABS_ERROR) return false; // expected 0, got non-0 - return std::min(result, expected) / std::max(result, expected) > tolerance; + return (std::min)(result, expected) / (std::max)(result, expected) > tolerance; } template From 00cf0970e56f8eafdbb74afe728e8b7e8bcf3c3e Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 26 Jan 2023 12:04:51 +0200 Subject: [PATCH 0120/1398] changed the mesh file used in examples --- ...corrected_curvatures_at_vertex_example.cpp | 3 +- ...erpolated_corrected_curvatures_example.cpp | 3 +- ...orrected_curvatures_polyhedron_example.cpp | 35 ++++++++++--------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp index 009c5881f262..046f9101d1e6 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp @@ -12,7 +12,6 @@ namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; typedef Epic_kernel::FT FT; typedef CGAL::Surface_mesh Surface_Mesh; -typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) @@ -21,7 +20,7 @@ int main(int argc, char* argv[]) Surface_Mesh smesh; const std::string filename = (argc > 1) ? argv[1] : - CGAL::data_file_path("meshes/small_bunny.obj"); + CGAL::data_file_path("meshes/sphere.off"); if (!CGAL::IO::read_polygon_mesh(filename, smesh)) { diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp index 511288702336..6a991bafdfb8 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp @@ -12,7 +12,6 @@ namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; typedef CGAL::Surface_mesh Surface_Mesh; -typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; int main(int argc, char* argv[]) @@ -20,7 +19,7 @@ int main(int argc, char* argv[]) Surface_Mesh smesh; const std::string filename = (argc > 1) ? argv[1] : - CGAL::data_file_path("meshes/small_bunny.obj"); + CGAL::data_file_path("meshes/sphere.off"); if (!CGAL::IO::read_polygon_mesh(filename, smesh)) { diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp index 6bbe49ce37e5..0d1ffcfa35d1 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp @@ -13,13 +13,14 @@ namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; typedef CGAL::Polyhedron_3 Polyhedron; -typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; -int main(int argc, char *argv[]) +int main(int argc, char* argv[]) { Polyhedron polyhedron; - const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/small_bunny.obj"); + const std::string filename = (argc > 1) ? + argv[1] : + CGAL::data_file_path("meshes/sphere.off"); if (!CGAL::IO::read_polygon_mesh(filename, polyhedron)) { @@ -28,22 +29,22 @@ int main(int argc, char *argv[]) } boost::property_map>::type - mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), - gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); + mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), + gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); boost::property_map>>::type - principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); + principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); PMP::interpolated_corrected_mean_curvature( - polyhedron, - mean_curvature_map); + polyhedron, + mean_curvature_map); PMP::interpolated_corrected_gaussian_curvature( - polyhedron, - gaussian_curvature_map); + polyhedron, + gaussian_curvature_map); PMP::interpolated_corrected_principal_curvatures_and_directions( - polyhedron, - principal_curvatures_and_directions_map); + polyhedron, + principal_curvatures_and_directions_map); // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) @@ -59,17 +60,17 @@ int main(int argc, char *argv[]) // This function can be used to compute multiple curvature types by specifiying them as named parameters // This is more efficient than computing each one separately (shared computations). PMP::interpolated_corrected_curvatures( - polyhedron, - CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) - .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)); + polyhedron, + CGAL::parameters::vertex_mean_curvature_map(mean_curvature_map) + .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map)); int i = 0; for (vertex_descriptor v : vertices(polyhedron)) { auto PC = get(principal_curvatures_and_directions_map, v); std::cout << i << ": HC = " << get(mean_curvature_map, v) - << ", GC = " << get(gaussian_curvature_map, v) << "\n" - << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; + << ", GC = " << get(gaussian_curvature_map, v) << "\n" + << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; i++; } } From 8d2043d0aab934e3d97cd2de8be8f112638fc94b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 28 Jan 2023 15:54:35 +0200 Subject: [PATCH 0121/1398] renaming mostly to pass the max path error --- .../PackageDescription.txt | 8 ++-- .../Polygon_mesh_processing.txt | 14 +++--- .../doc/Polygon_mesh_processing/examples.txt | 6 +-- .../Polygon_mesh_processing/CMakeLists.txt | 12 ++--- ...lated_corrected_curvatures_example_PH.cpp} | 0 ...lated_corrected_curvatures_example_SM.cpp} | 0 ...d_corrected_curvatures_vertex_example.cpp} | 12 ++--- ...nterpolated_corrected_curvature_measures.h | 44 +++++++++---------- ...test_interpolated_corrected_curvatures.cpp | 2 +- 9 files changed, 49 insertions(+), 49 deletions(-) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_polyhedron_example.cpp => interpolated_corrected_curvatures_example_PH.cpp} (100%) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_example.cpp => interpolated_corrected_curvatures_example_SM.cpp} (100%) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_at_vertex_example.cpp => interpolated_corrected_curvatures_vertex_example.cpp} (83%) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index d5790ec725ee..52ae8934ddf2 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -212,10 +212,10 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` - `CGAL::Polygon_mesh_processing::Principal_curvatures_and_directions` \cgalCRPSection{Normal Computation Functions} diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index fedebf4b8f8a..751db0992492 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -909,10 +909,10 @@ Where it is recommended to use the last function for computing multiple curvatur as the implementation performs the shared computations only once, making it more efficient. Similarly, we can use the following functions to compute curvatures on a specific vertex: -- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_at_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_at_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` \cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on @@ -940,7 +940,7 @@ The following example illustrates how to compute the curvatures on vertices and store them in property maps provided by the class `Surface_mesh`. -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp} \subsection ICCExamplePH Interpolated Corrected Curvatures on a Polyhedron Example @@ -949,14 +949,14 @@ compute the curvatures on vertices and store them in dynamic property maps as the class `Polyhedron_3` does not provide storage for the curvatures. -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp} \subsection ICCExampleSV Interpolated Corrected Curvatures on a Vertex Example The following example illustrates how to compute the curvatures on a specific vertex -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp} **************************************** \section PMPSlicer Slicer diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 58af6e391b56..33e68eea8091 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -19,9 +19,9 @@ \example Polygon_mesh_processing/refine_fair_example.cpp \example Polygon_mesh_processing/mesh_slicer_example.cpp \example Polygon_mesh_processing/isotropic_remeshing_example.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp -\example Polygon_mesh_processing/interpolated_corrected_gaussian_curvature_at_vertex.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp \example Polygon_mesh_processing/delaunay_remeshing_example.cpp \example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp \example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 5e840c38a508..93e321e837c8 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -105,12 +105,12 @@ create_single_source_cgal_program("cc_compatible_orientations.cpp") if(TARGET CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_example.cpp") - target_link_libraries(interpolated_corrected_curvatures_example PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_polyhedron_example.cpp") - target_link_libraries(interpolated_corrected_curvatures_polyhedron_example PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_at_vertex_example.cpp") - target_link_libraries(interpolated_corrected_curvatures_at_vertex_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_example_SM.cpp") + target_link_libraries(interpolated_corrected_curvatures_example_SM PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_example_PH.cpp") + target_link_libraries(interpolated_corrected_curvatures_example_PH PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_vertex_example.cpp") + target_link_libraries(interpolated_corrected_curvatures_vertex_example PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp similarity index 100% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_polyhedron_example.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp similarity index 100% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp similarity index 83% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp index 046f9101d1e6..a897066facb6 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_at_vertex_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp @@ -31,21 +31,21 @@ int main(int argc, char* argv[]) // loop over vertices and use vertex_descriptor to compute a curvature on one vertex for (vertex_descriptor v : vertices(smesh)) { - FT h = PMP::interpolated_corrected_mean_curvature_at_vertex(smesh, v); - FT g = PMP::interpolated_corrected_gaussian_curvature_at_vertex(smesh, v); + FT h = PMP::interpolated_corrected_mean_curvature_one_vertex(smesh, v); + FT g = PMP::interpolated_corrected_gaussian_curvature_one_vertex(smesh, v); PMP::Principal_curvatures_and_directions p = - PMP::interpolated_corrected_principal_curvatures_and_directions_at_vertex(smesh, v); + PMP::interpolated_corrected_principal_curvatures_and_directions_one_vertex(smesh, v); // we can also specify a ball radius for expansion and a user defined vertex normals map using - // named parameters. Refer to interpolated_corrected_curvatures_example.cpp to see example usage. + // named parameters. Refer to interpolated_corrected_curvatures_example_SM.cpp to see example usage. - // Can also use interpolated_corrected_curvatures_at_vertex() to compute multiple curvatures + // Can also use interpolated_corrected_curvatures_one_vertex() to compute multiple curvatures // on the vertex at the same time. This is more efficient than computing each one separately. // The following commented lines show this (all mentioned named parameters work on it as well) // we specify which curvatures we want to compute by passing pointers as named parameters // as shown. These pointers are used for storing the result as well. in this example we // selected mean and gaussian curvatures - // PMP::interpolated_corrected_curvatures_at_vertex( + // PMP::interpolated_corrected_curvatures_one_vertex( // smesh, // v, // CGAL::parameters::vertex_mean_curvature(&h) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 32287848fb31..2142e57fd194 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -1337,13 +1337,13 @@ template - void interpolated_corrected_curvatures_at_vertex(const PolygonMesh& pmesh, + void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { @@ -1399,20 +1399,20 @@ template - typename GT::FT interpolated_corrected_mean_curvature_at_vertex(const PolygonMesh& pmesh, + typename GT::FT interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute mean curvature + // use interpolated_corrected_curvatures_one_vertex to compute mean curvature typename GT::FT mean_curvature; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); return mean_curvature; } @@ -1465,20 +1465,20 @@ template - typename GT::FT interpolated_corrected_gaussian_curvature_at_vertex(const PolygonMesh& pmesh, + typename GT::FT interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute gaussian curvature + // use interpolated_corrected_curvatures_one_vertex to compute gaussian curvature typename GT::FT gc; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); return gc; } @@ -1530,20 +1530,20 @@ template - Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_at_vertex(const PolygonMesh& pmesh, + Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_one_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_at_vertex to compute principal curvatures + // use interpolated_corrected_curvatures_one_vertex to compute principal curvatures Principal_curvatures_and_directions pcd; - interpolated_corrected_curvatures_at_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); return pcd; } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index 2aa963fea52b..37fc6f050df4 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -162,7 +162,7 @@ void test_average_curvatures(std::string mesh_path, for (vertex_descriptor v : vertices(pmesh)) { - PMP::interpolated_corrected_curvatures_at_vertex( + PMP::interpolated_corrected_curvatures_one_vertex( pmesh, v, CGAL::parameters::vertex_gaussian_curvature(&g) From 4e669b79a73682b97aca64b9e04ef46edbf56143 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 29 Jan 2023 06:26:16 +0200 Subject: [PATCH 0122/1398] conversion warnings --- ...interpolated_corrected_curvature_measures.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h index 2142e57fd194..cfe3b79b6e19 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h @@ -89,7 +89,7 @@ typename GT::FT average_edge_length(const PolygonMesh& pmesh) { for (auto e : edges(pmesh)) avg_edge_length += edge_length(e, pmesh); - avg_edge_length /= n; + avg_edge_length /= static_cast(n); return avg_edge_length; } @@ -145,7 +145,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector(n); // getting unit average normal of points typename GT::Vector_3 uc = @@ -211,7 +211,7 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve // getting center of points typename GT::Vector_3 xc = std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; + xc /= static_cast(n); // getting unit average normal of points typename GT::Vector_3 uc = @@ -297,7 +297,7 @@ std::array interpolated_corrected_anisotropic_measure_fa const typename GT::Vector_3 x02 = x[2] - x[0]; const typename GT::Vector_3 um = (u[0] + u[1] + u[2]) / 3.0; - for (std::size_t ix = 0; ix < 3; ix++) + for (unsigned int ix = 0; ix < 3; ix++) { typename GT::Vector_3 X; if (ix == 0) @@ -307,7 +307,7 @@ std::array interpolated_corrected_anisotropic_measure_fa if (ix == 2) X = typename GT::Vector_3(0, 0, 1); - for (std::size_t iy = 0; iy < 3; iy++) + for (unsigned int iy = 0; iy < 3; iy++) muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); } } @@ -316,7 +316,7 @@ std::array interpolated_corrected_anisotropic_measure_fa { // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. // the indices in paper vs in here are: 00 = 0, 10 = 1, 11 = 2, 01 = 3 - for (std::size_t ix = 0; ix < 3; ix++) + for (unsigned int ix = 0; ix < 3; ix++) { typename GT::Vector_3 X; if (ix == 0) @@ -331,7 +331,7 @@ std::array interpolated_corrected_anisotropic_measure_fa const typename GT::Vector_3 u2xX = cross_product(u[2], X); const typename GT::Vector_3 u3xX = cross_product(u[3], X); - for (std::size_t iy = 0; iy < 3; iy++) + for (unsigned int iy = 0; iy < 3; iy++) muXY[ix * 3 + iy] = (1.0 / 72.0) * ( u[0][iy] * (u0xX * (-x[0] - 11 * x[1] + 13 * x[3] - x[2]) @@ -364,7 +364,7 @@ std::array interpolated_corrected_anisotropic_measure_fa // getting center of points typename GT::Vector_3 xc = std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xc /= n; + xc /= static_cast(n); // getting unit average normal of points typename GT::Vector_3 uc = @@ -418,7 +418,7 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, // getting center of points typename GT::Vector_3 xm = std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); - xm /= n; + xm /= static_cast(n); typename GT::FT d_min = (xm - c).squared_length(); typename GT::FT d_max = d_min; From 2ccabc92899980c65ce17ff9e165905af3d2e6c0 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 29 Jan 2023 09:39:39 +0200 Subject: [PATCH 0123/1398] renaming files --- ....h => interpolated_corrected_curvatures.h} | 20 +++++++++---------- .../include/CGAL/license/gpl_package_list.txt | 2 +- ...olated_corrected_curvatures_example_PH.cpp | 2 +- ...olated_corrected_curvatures_example_SM.cpp | 2 +- ...ed_corrected_curvatures_vertex_example.cpp | 2 +- ....h => interpolated_corrected_curvatures.h} | 8 ++++---- ...test_interpolated_corrected_curvatures.cpp | 2 +- .../Display/Display_property_plugin.cpp | 2 +- ..._corrected_principal_curvatures_plugin.cpp | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) rename Installation/include/CGAL/license/Polygon_mesh_processing/{interpolated_corrected_curvature_measures.h => interpolated_corrected_curvatures.h} (83%) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/{Curvatures/interpolated_corrected_curvature_measures.h => interpolated_corrected_curvatures.h} (99%) diff --git a/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h b/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvatures.h similarity index 83% rename from Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h rename to Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 15e2a79af8a9..e484daaf5eae 100644 --- a/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvature_measures.h +++ b/Installation/include/CGAL/license/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -11,15 +11,15 @@ // // Warning: this file is generated, see include/CGAL/licence/README.md -#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H -#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H #include #include -#ifdef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE +#ifdef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE -# if CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE +# if CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE # if defined(CGAL_LICENSE_WARNING) @@ -33,22 +33,22 @@ You get this error, as you defined CGAL_LICENSE_ERROR." # endif // CGAL_LICENSE_ERROR -# endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE +# endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE -#else // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE +#else // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE # if defined(CGAL_LICENSE_WARNING) - CGAL_pragma_warning("\nThe macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE is not defined." + CGAL_pragma_warning("\nThe macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE is not defined." "\nYou use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under " "the terms of the GPLv3+.") # endif // CGAL_LICENSE_WARNING # ifdef CGAL_LICENSE_ERROR -# error "The macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE is not defined.\ +# error "The macro CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE is not defined.\ You use the CGAL Polygon Mesh Processing - Interpolated Corrected Curvatures package under the terms of \ the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR." # endif // CGAL_LICENSE_ERROR -#endif // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_COMMERCIAL_LICENSE +#endif // no CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_COMMERCIAL_LICENSE -#endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#endif // CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H diff --git a/Installation/include/CGAL/license/gpl_package_list.txt b/Installation/include/CGAL/license/gpl_package_list.txt index c6ac0b619df0..14d68b5d9a6a 100644 --- a/Installation/include/CGAL/license/gpl_package_list.txt +++ b/Installation/include/CGAL/license/gpl_package_list.txt @@ -51,7 +51,7 @@ Polygon_mesh_processing/connected_components Polygon Mesh Processing - Connected Polygon_mesh_processing/corefinement Polygon Mesh Processing - Corefinement Polygon_mesh_processing/core Polygon Mesh Processing - Core Polygon_mesh_processing/distance Polygon Mesh Processing - Distance -Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures Polygon Mesh Processing - Interpolated Corrected Curvatures +Polygon_mesh_processing/interpolated_corrected_curvatures Polygon Mesh Processing - Interpolated Corrected Curvatures Polygon_mesh_processing/measure Polygon Mesh Processing - Geometric Measure Polygon_mesh_processing/meshing_hole_filling Polygon Mesh Processing - Meshing and Hole Filling Polygon_mesh_processing/orientation Polygon Mesh Processing - Orientation diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp index 0d1ffcfa35d1..3cf675c53ca4 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp index 6a991bafdfb8..d92ec7b8096d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp index a897066facb6..beb2eda31c04 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h similarity index 99% rename from Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h rename to Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index cfe3b79b6e19..7f0bbc8197ce 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Curvatures/interpolated_corrected_curvature_measures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -11,10 +11,10 @@ // Author(s) : Hossam Saeed // -#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H -#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURE_MEASURES_H +#ifndef CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H +#define CGAL_POLYGON_MESH_PROCESSING_INTERPOLATED_CORRECTED_CURVATURES_H -#include +#include #include #include @@ -1550,4 +1550,4 @@ template -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 67a2061fc5e8..f515c7c12e08 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "Scene_points_with_normal_item.h" diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp index e5a01f7b3c3b..8bb6a229967b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Interpolated_corrected_principal_curvatures_plugin.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include using namespace CGAL::Three; class Polyhedron_demo_interpolated_corrected_principal_curvatures_and_directions_plugin : From eef0f5fd80cf703486b1f72b862898f45c266d00 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:23:46 +0200 Subject: [PATCH 0124/1398] removed unused parameter --- .../interpolated_corrected_curvatures.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 7f0bbc8197ce..a71fdf164449 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -27,7 +27,6 @@ #include #include #include -#include #define EXPANDING_RADIUS_EPSILON 1e-6 @@ -231,8 +230,7 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve } template -typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u, - const std::vector& x = {}) +typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u) { const std::size_t n = u.size(); CGAL_precondition(n >= 3); From 4f4eeea292f09dc7e7a84c55787346f2ec51a607 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:55:15 +0200 Subject: [PATCH 0125/1398] removing _example suffix (renaming) --- .../Polygon_mesh_processing.txt | 6 +++--- .../doc/Polygon_mesh_processing/examples.txt | 6 +++--- .../examples/Polygon_mesh_processing/CMakeLists.txt | 12 ++++++------ ....cpp => interpolated_corrected_curvatures_PH.cpp} | 0 ....cpp => interpolated_corrected_curvatures_SM.cpp} | 0 ... => interpolated_corrected_curvatures_vertex.cpp} | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_example_PH.cpp => interpolated_corrected_curvatures_PH.cpp} (100%) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_example_SM.cpp => interpolated_corrected_curvatures_SM.cpp} (100%) rename Polygon_mesh_processing/examples/Polygon_mesh_processing/{interpolated_corrected_curvatures_vertex_example.cpp => interpolated_corrected_curvatures_vertex.cpp} (98%) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 751db0992492..1da140d96791 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -940,7 +940,7 @@ The following example illustrates how to compute the curvatures on vertices and store them in property maps provided by the class `Surface_mesh`. -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp} \subsection ICCExamplePH Interpolated Corrected Curvatures on a Polyhedron Example @@ -949,14 +949,14 @@ compute the curvatures on vertices and store them in dynamic property maps as the class `Polyhedron_3` does not provide storage for the curvatures. -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp} \subsection ICCExampleSV Interpolated Corrected Curvatures on a Vertex Example The following example illustrates how to compute the curvatures on a specific vertex -\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp} +\cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp} **************************************** \section PMPSlicer Slicer diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt index 33e68eea8091..3a5620d82424 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/examples.txt @@ -19,9 +19,9 @@ \example Polygon_mesh_processing/refine_fair_example.cpp \example Polygon_mesh_processing/mesh_slicer_example.cpp \example Polygon_mesh_processing/isotropic_remeshing_example.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp -\example Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp +\example Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp \example Polygon_mesh_processing/delaunay_remeshing_example.cpp \example Polygon_mesh_processing/compute_normals_example_Polyhedron.cpp \example Polygon_mesh_processing/hausdorff_distance_remeshing_example.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 93e321e837c8..19a3aaf5313d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -105,12 +105,12 @@ create_single_source_cgal_program("cc_compatible_orientations.cpp") if(TARGET CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_example_SM.cpp") - target_link_libraries(interpolated_corrected_curvatures_example_SM PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_example_PH.cpp") - target_link_libraries(interpolated_corrected_curvatures_example_PH PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("interpolated_corrected_curvatures_vertex_example.cpp") - target_link_libraries(interpolated_corrected_curvatures_vertex_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_SM.cpp") + target_link_libraries(interpolated_corrected_curvatures_SM PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_PH.cpp") + target_link_libraries(interpolated_corrected_curvatures_PH PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("interpolated_corrected_curvatures_vertex.cpp") + target_link_libraries(interpolated_corrected_curvatures_vertex PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp similarity index 100% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_PH.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp similarity index 100% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_example_SM.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp similarity index 98% rename from Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp index beb2eda31c04..47fbcfd68711 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp @@ -37,7 +37,7 @@ int main(int argc, char* argv[]) PMP::interpolated_corrected_principal_curvatures_and_directions_one_vertex(smesh, v); // we can also specify a ball radius for expansion and a user defined vertex normals map using - // named parameters. Refer to interpolated_corrected_curvatures_example_SM.cpp to see example usage. + // named parameters. Refer to interpolated_corrected_curvatures_SM.cpp to see example usage. // Can also use interpolated_corrected_curvatures_one_vertex() to compute multiple curvatures // on the vertex at the same time. This is more efficient than computing each one separately. From bd5d9df950ea845efa3b6bdf926a1b548c8c4ffd Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 31 Jan 2023 11:57:00 +0200 Subject: [PATCH 0126/1398] fix some functions were passing x to interpolated_corrected_gaussian_curvature_measure_face() when it was not needed (and causes a compilation error for 1 vertex) --- .../interpolated_corrected_curvatures.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index a71fdf164449..3c7c647e8a6b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -518,7 +518,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( vertex_measures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u, x); + vertex_measures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u); if (is_principal_curvatures_and_directions_selected) { @@ -594,7 +594,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( vertex_measures.mean_curvature_measure += f_ratio * interpolated_corrected_mean_curvature_measure_face(u, x); if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += f_ratio * interpolated_corrected_gaussian_curvature_measure_face(u, x); + vertex_measures.gaussian_curvature_measure += f_ratio * interpolated_corrected_gaussian_curvature_measure_face(u); if (is_principal_curvatures_and_directions_selected) { From 6a7e7d267ebf9be9eedd306ce311b7c0d5c7dc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 31 Jan 2023 11:56:48 +0100 Subject: [PATCH 0127/1398] fix link --- .../interpolated_corrected_curvatures.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 3c7c647e8a6b..88110842b67d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1273,11 +1273,11 @@ template Date: Tue, 31 Jan 2023 12:06:10 +0100 Subject: [PATCH 0128/1398] remove unused variable --- .../demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index f515c7c12e08..c4c7d6a3c916 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -839,7 +839,7 @@ private Q_SLOTS: } - double outMin = 0, outMax = 5 * maxEdgeLength, base = 1.2; + double outMax = 5 * maxEdgeLength, base = 1.2; expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); From e71fcd899a44a07a53d65fbdf976d6224141fd0c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 2 Feb 2023 02:15:34 +0200 Subject: [PATCH 0129/1398] removed unused enum --- .../interpolated_corrected_curvatures.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 88110842b67d..7adc37f0b4a2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -92,12 +92,6 @@ typename GT::FT average_edge_length(const PolygonMesh& pmesh) { return avg_edge_length; } -enum Curvature_measure_index { - MU0_AREA_MEASURE, ///< corrected area density - MU1_MEAN_CURVATURE_MEASURE, ///< corrected mean curvature density - MU2_GAUSSIAN_CURVATURE_MEASURE ///< corrected gaussian curvature density -}; - template struct Vertex_measures { typename GT::FT area_measure = 0; From fcbc89b50314db6f17508bcc8a63046c18c910fc Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 2 Feb 2023 12:07:20 +0200 Subject: [PATCH 0130/1398] added comments for clarity --- .../interpolated_corrected_curvatures.h | 63 +++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 7adc37f0b4a2..952a7e749ecf 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -118,7 +118,7 @@ typename GT::FT interpolated_corrected_area_measure_face(const std::vector interpolated_corrected_anisotropic_measure_fa muXY[ix * 3 + iy] = 0.5 * um * (cross_product(u02[iy] * X, x01) - cross_product(u01[iy] * X, x02)); } } - // Quad: use bilinear interpolation formula + // Quad: use the bilinear interpolation formula else if (n == 4) { // for the formulas below, values of verices 2 & 3 are swapped (compared to paper) to correct order. @@ -412,6 +412,7 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, std::accumulate(x.begin(), x.end(), typename GT::Vector_3(0, 0, 0)); xm /= static_cast(n); + // computing squared distance of furthest and closest point to ball center typename GT::FT d_min = (xm - c).squared_length(); typename GT::FT d_max = d_min; @@ -422,12 +423,14 @@ typename GT::FT face_in_ball_ratio(const std::vector& x, d_min = (std::min)(d_sq, d_min); } + // if the furthest point is inside ball, return 1 if (d_max <= r * r) return 1.0; + // if the closest point is outside ball, return 0 else if (r * r <= d_min) return 0.0; + // else, approximate inclusion ratio of the triangle: d_max = sqrt(d_max); d_min = sqrt(d_min); - return (r - d_min) / (d_max - d_min); } @@ -438,17 +441,22 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from const typename GT::Vector_3 u_GT ) { + // putting anisotropic measure in matrix form Eigen::Matrix v_muXY = Eigen::Matrix::Zero(); for (std::size_t ix = 0; ix < 3; ix++) for (std::size_t iy = 0; iy < 3; iy++) v_muXY(ix, iy) = anisotropic_measure[ix * 3 + iy]; + // constant factor K to force the principal direction eigenvectors to be tangential to the surface Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); const typename GT::FT K = 1000 * v_mu0; + // symmetrizing and adding the constant term v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); + + // computing eigenvalues and eigenvectors Eigen::SelfAdjointEigenSolver> eigensolver; eigensolver.computeDirect(v_muXY); @@ -462,6 +470,7 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from const typename GT::Vector_3 min_eig_vec(eig_vecs(0, 1), eig_vecs(1, 1), eig_vecs(2, 1)); const typename GT::Vector_3 max_eig_vec(eig_vecs(0, 0), eig_vecs(1, 0), eig_vecs(2, 0)); + // returning principal curvatures and directions (with the correct sign) return Principal_curvatures_and_directions( (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, @@ -470,6 +479,7 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from ); } +// measures are computed for faces only if they are adjacent to the vertex template Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( const PolygonMesh& pmesh, @@ -495,9 +505,11 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( std::vector x; std::vector u; + // compute for each face around the vertex (except the null (boundary) face) for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f != boost::graph_traits::null_face()) { + // looping over vertices in face to get point coordinates and normal vectors for (Vertex_descriptor vi : vertices_around_face(halfedge(f, pmesh), pmesh)) { Point_3 pi = get(vpm, vi); @@ -506,6 +518,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( u.push_back(ui); } + // compute measures for selected curvatures (area is always computed) vertex_measures.area_measure += interpolated_corrected_area_measure_face(u, x); if (is_mean_curvature_selected) @@ -528,7 +541,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( return vertex_measures; } - +// measures are computed for faces only if they are in the ball of radius 'radius' centered at the vertex template Vertex_measures interpolated_corrected_measures_one_vertex( const PolygonMesh& pmesh, @@ -547,6 +560,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( typedef typename GT::Vector_3 Vector_3; typedef typename GT::FT FT; + // the ball expansion is done using a BFS traversal from the vertex std::queue bfs_queue; std::unordered_set bfs_visited; @@ -568,8 +582,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( Face_descriptor fi = bfs_queue.front(); bfs_queue.pop(); - // looping over vertices in face to get point coordinates - + // looping over vertices in face to get point coordinates and normal vectors for (Vertex_descriptor vi : vertices_around_face(halfedge(fi, pmesh), pmesh)) { Point_3 pi = get(vpm, vi); @@ -578,8 +591,11 @@ Vertex_measures interpolated_corrected_measures_one_vertex( u.push_back(ui); } + // approximate inclusion ratio of the face in the ball const FT f_ratio = face_in_ball_ratio(x, radius, c); + // if it is not 0 (not completely outside), compute measures for selected curvatures (area is always computed) + // and add neighboring faces to the bfs queue if (f_ratio != 0.0) { vertex_measures.area_measure += f_ratio * interpolated_corrected_area_measure_face(u, x); @@ -613,6 +629,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( return vertex_measures; } +// computes selected curvatures for one specific vertex template void interpolated_corrected_curvatures_one_vertex( @@ -640,23 +657,29 @@ template::value) compute_vertex_normals(pmesh, vnm, np); + // if no radius is given, we pass -1 which will make the expansion be only on the incident faces instead of a ball typename GT::FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + // if the radius is 0, we use a small epsilon to expand the ball (scaled with the average edge length) if (radius == 0) radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + // get parameters (pointers) for curvatures typename GT::FT* vertex_mean_curvature = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature), nullptr); typename GT::FT* vertex_gaussian_curvature = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature), nullptr); Principal_curvatures_and_directions* vertex_principal_curvatures_and_directions = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions), nullptr); + // determine which curvatures are selected (by checking if the pointers are not null) const bool is_mean_curvature_selected = (vertex_mean_curvature != nullptr); const bool is_gaussian_curvature_selected = (vertex_gaussian_curvature != nullptr); const bool is_principal_curvatures_and_directions_selected = (vertex_principal_curvatures_and_directions != nullptr); Vertex_measures vertex_measures; + // if the radius is negative, we do not expand the ball (only the incident faces) if (radius < 0) { vertex_measures = interpolated_corrected_measures_one_vertex_no_radius( @@ -683,6 +706,7 @@ template principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, @@ -783,11 +808,14 @@ class Interpolated_corrected_curvatures_computer vnm = choose_parameter(get_parameter(np, internal_np::vertex_normal_map), get(Vector_map_tag(), pmesh)); + // if no normal map is given, compute normals if (is_default_parameter::value) compute_vertex_normals(pmesh, vnm, np); + // if no radius is given, we pass -1 which will make the expansion be only on the incident faces instead of a ball const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + // check which curvature maps are provided by the user (determines which curvatures are computed) is_mean_curvature_selected = !is_default_parameter::value; is_gaussian_curvature_selected = !is_default_parameter::value; is_principal_curvatures_and_directions_selected = !is_default_parameter::value; @@ -800,6 +828,7 @@ class Interpolated_corrected_curvatures_computer } void set_ball_radius(const FT radius) { + // if given radius is 0, we use a small epsilon to expand the ball (scaled by the average edge length) if (radius == 0) ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; else @@ -825,6 +854,8 @@ class Interpolated_corrected_curvatures_computer private: + // Computes the (selected) interpolated corrected measures for all faces + // and stores them in the property maps void interpolated_corrected_selected_measures_all_faces() { std::vector x; @@ -854,14 +885,17 @@ class Interpolated_corrected_curvatures_computer } } + // expand the measures of the faces incident to v Vertex_measures expand_interpolated_corrected_measure_vertex_no_radius(Vertex_descriptor v) { Vertex_measures vertex_measures; + // add the measures of the faces incident to v (excluding the null (boundary) face) for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f == boost::graph_traits::null_face()) continue; + // only add the measures for the selected curvatures (area measure is always added) vertex_measures.area_measure += get(mu0_map, f); if (is_mean_curvature_selected) @@ -881,8 +915,10 @@ class Interpolated_corrected_curvatures_computer return vertex_measures; } + // expand the measures of the faces inside the ball of radius r around v Vertex_measures expand_interpolated_corrected_measure_vertex(Vertex_descriptor v) { + // the ball expansion is done using a BFS traversal from the vertex std::queue bfs_queue; std::unordered_set bfs_visited; @@ -891,6 +927,7 @@ class Interpolated_corrected_curvatures_computer Vertex_measures vertex_measures; + // add the measures of the faces incident to v (excluding the null (boundary) face) for (Face_descriptor f : faces_around_target(halfedge(v, pmesh), pmesh)) { if (f != boost::graph_traits::null_face()) { @@ -910,8 +947,11 @@ class Interpolated_corrected_curvatures_computer x.push_back(Vector_3(pi.x(), pi.y(), pi.z())); } + // compute the inclusion ratio of the face in the ball const FT f_ratio = face_in_ball_ratio(x, ball_radius, c); + // if the face is inside the ball, add the measures + // only add the measures for the selected curvatures (area measure is always added) if (f_ratio != 0.0) { vertex_measures.area_measure += f_ratio * get(mu0_map, fi); @@ -947,10 +987,13 @@ class Interpolated_corrected_curvatures_computer for (Vertex_descriptor v : vertices(pmesh)) { + // expand the computed measures (on faces) to the vertices Vertex_measures vertex_measures = (ball_radius < 0) ? expand_interpolated_corrected_measure_vertex_no_radius(v) : expand_interpolated_corrected_measure_vertex(v); + // compute the selected curvatures from the expanded measures and store them in the property maps + // if the area measure is zero, the curvature is set to zero if (is_mean_curvature_selected) { vertex_measures.area_measure != 0 ? put(mean_curvature_map, v, 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure) : @@ -964,6 +1007,7 @@ class Interpolated_corrected_curvatures_computer } if (is_principal_curvatures_and_directions_selected) { + // compute the principal curvatures and directions from the anisotropic measure const Vector_3 v_normal = get(vnm, v); const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, @@ -1402,7 +1446,6 @@ template::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_one_vertex to compute mean curvature typename GT::FT mean_curvature; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); return mean_curvature; @@ -1468,7 +1511,6 @@ template::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_one_vertex to compute gaussian curvature typename GT::FT gc; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); return gc; @@ -1533,7 +1575,6 @@ template::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { - // use interpolated_corrected_curvatures_one_vertex to compute principal curvatures Principal_curvatures_and_directions pcd; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); return pcd; From ec4312695a5136411b53ae572f9445fd7e385983 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Thu, 2 Feb 2023 12:23:50 +0200 Subject: [PATCH 0131/1398] remove unused var + minor change --- .../interpolated_corrected_curvatures.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 952a7e749ecf..b298f8cf495f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -497,9 +497,6 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( typedef typename GT::Vector_3 Vector_3; typedef typename GT::FT FT; - std::queue bfs_queue; - std::unordered_set bfs_visited; - Vertex_measures vertex_measures; std::vector x; @@ -814,6 +811,7 @@ class Interpolated_corrected_curvatures_computer // if no radius is given, we pass -1 which will make the expansion be only on the incident faces instead of a ball const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + set_ball_radius(radius); // check which curvature maps are provided by the user (determines which curvatures are computed) is_mean_curvature_selected = !is_default_parameter::value; @@ -823,8 +821,6 @@ class Interpolated_corrected_curvatures_computer mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); principal_curvatures_and_directions_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions_map), Default_principal_map()); - - set_ball_radius(radius); } void set_ball_radius(const FT radius) { From 19fd037731d50f20e703c6dddc9997441bad9d06 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Mon, 20 Feb 2023 11:20:07 +0100 Subject: [PATCH 0132/1398] Minor API doc edits --- .../interpolated_corrected_curvatures.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index b298f8cf495f..ea01b0fe4c34 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1022,8 +1022,8 @@ class Interpolated_corrected_curvatures_computer * \ingroup PMP_corrected_curvatures_grp * * Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. -* By providing mean, gaussian and/or principal curvature property maps as named parameters, the user -* can choose which curvatures to compute. +* By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user +* can choose which quantites to compute. * * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". @@ -1039,7 +1039,7 @@ class Interpolated_corrected_curvatures_computer * `boost::graph_traits::%Vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map for +* \cgalParamExtra{If this parameter is omitted, an internal property map forBy * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * @@ -1301,9 +1301,10 @@ template Date: Wed, 22 Mar 2023 18:13:27 +0100 Subject: [PATCH 0133/1398] first pass on the API --- .../Polygon_mesh_processing.txt | 2 +- ...terpolated_corrected_curvatures_vertex.cpp | 7 +- .../interpolated_corrected_curvatures.h | 695 ++++++++++-------- 3 files changed, 386 insertions(+), 318 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 1da140d96791..2eb85a80bfbb 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -1166,7 +1166,7 @@ is covered by a set of prisms, where each prism is an offset for an input triang That is, the implementation in \cgal does not use indirect predicates. The interpolated corrected curvatures were implemented during GSoC 2022. This was implemented by Hossam Saeed and under -supervision of Sebastien Loriot, Jaques-Olivier Lachaud and David Coeurjolly. The implementation is based on \cgalCite{lachaud2020}. +supervision of David Coeurjolly, Jaques-Olivier Lachaud, and Sébastien Loriot. The implementation is based on \cgalCite{lachaud2020}. DGtal's implementation was also used as a reference during the project. diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp index 47fbcfd68711..e5845a1b3a5a 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp @@ -10,7 +10,6 @@ namespace PMP = CGAL::Polygon_mesh_processing; typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; -typedef Epic_kernel::FT FT; typedef CGAL::Surface_mesh Surface_Mesh; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; @@ -31,10 +30,10 @@ int main(int argc, char* argv[]) // loop over vertices and use vertex_descriptor to compute a curvature on one vertex for (vertex_descriptor v : vertices(smesh)) { - FT h = PMP::interpolated_corrected_mean_curvature_one_vertex(smesh, v); - FT g = PMP::interpolated_corrected_gaussian_curvature_one_vertex(smesh, v); + double h = PMP::interpolated_corrected_mean_curvature_one_vertex(smesh, v); + double g = PMP::interpolated_corrected_gaussian_curvature_one_vertex(smesh, v); PMP::Principal_curvatures_and_directions p = - PMP::interpolated_corrected_principal_curvatures_and_directions_one_vertex(smesh, v); + PMP::interpolated_corrected_principal_curvatures_and_directions_one_vertex(smesh, v); // we can also specify a ball radius for expansion and a user defined vertex normals map using // named parameters. Refer to interpolated_corrected_curvatures_SM.cpp to see example usage. diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index ea01b0fe4c34..24c1d12a59e3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -28,8 +28,6 @@ #include #include -#define EXPANDING_RADIUS_EPSILON 1e-6 - namespace CGAL { namespace Polygon_mesh_processing { @@ -39,7 +37,7 @@ namespace Polygon_mesh_processing { * * \brief a struct for storing principal curvatures and directions. * - * @tparam GT is the geometric traits class. + * @tparam GT is the geometric traits class, model of `Kernel`. */ template struct Principal_curvatures_and_directions { @@ -662,7 +660,7 @@ template(pmesh) * EXPANDING_RADIUS_EPSILON; + radius = average_edge_length(pmesh) * 1e-6; // get parameters (pointers) for curvatures typename GT::FT* vertex_mean_curvature = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature), nullptr); @@ -826,7 +824,7 @@ class Interpolated_corrected_curvatures_computer void set_ball_radius(const FT radius) { // if given radius is 0, we use a small epsilon to expand the ball (scaled by the average edge length) if (radius == 0) - ball_radius = average_edge_length(pmesh) * EXPANDING_RADIUS_EPSILON; + ball_radius = average_edge_length(pmesh) * 1e-6; else ball_radius = radius; } @@ -1021,7 +1019,7 @@ class Interpolated_corrected_curvatures_computer /** * \ingroup PMP_corrected_curvatures_grp * -* Computes the interpolated corrected curvatures across the mesh, based on the provided property maps. +* computes the interpolated corrected curvatures across the mesh `pmesh`. * By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * @@ -1029,66 +1027,70 @@ class Interpolated_corrected_curvatures_computer * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. -* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below. +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} -* \cgalParamExtra{If this parameter is omitted, an internal property map forBy +* \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_mean_curvature_map} * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::FT` as value type} * \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_gaussian_curvature_map} * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%FT` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::FT` as value type} * \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} * \cgalParamNEnd * -* * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Principal_curvatures_and_directions` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t>(), pmesh)`} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `Principal_curvatures_and_directions` as value type} * \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} -* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* \cgalParamDescription{a strictly positive scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their * inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} -* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion is then just a sum of * measures on faces around the vertex} * \cgalParamNEnd * @@ -1099,9 +1101,9 @@ class Interpolated_corrected_curvatures_computer * @see `interpolated_corrected_principal_curvatures_and_directions()` */ template - void interpolated_corrected_curvatures(const PolygonMesh& pmesh, - const NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> +void interpolated_corrected_curvatures(const PolygonMesh& pmesh, + const NamedParameters& np = parameters::default_values()) { internal::Interpolated_corrected_curvatures_computer(pmesh, np); } @@ -1109,25 +1111,25 @@ template::%Vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam VertexCurvatureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. * @param vcm the vertex property map in which the computed mean curvatures are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} @@ -1136,11 +1138,18 @@ template::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1162,10 +1171,10 @@ template - void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - const NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> +void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, + VertexCurvatureMap vcm, + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_mean_curvature_map(vcm)); } @@ -1173,24 +1182,24 @@ template::%Vertex_descriptor` as key type and `GT::FT` as value type. +* @tparam VertexCurvatureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. * @param vcm the vertex property map in which the computed gaussian curvatures are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` +* `boost::graph_traits::%vertex_descriptor` * as key type and `%Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for @@ -1199,12 +1208,19 @@ template::%Vertex_descriptor` +* \cgalParamType{a class model of `GT::ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` * as key type and `%Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1225,10 +1241,10 @@ template - void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - const NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> +void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, + VertexCurvatureMap vcm, + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); } @@ -1236,26 +1252,26 @@ template::%Vertex_descriptor` as key type and -* `%Principal_curvatures_and_directions` as value type. +* @tparam VertexCurvatureMap a model of `WritablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` as key type and +* `Principal_curvatures_and_directions` as value type. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. * @param vcm the vertex property map in which the computed principal curvatures are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} * \cgalParamType{a class model of `ReadablePropertyMap` with -* `boost::graph_traits::%Vertex_descriptor` -* as key type and `%Point_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} @@ -1264,11 +1280,18 @@ template::%Vertex_descriptor` -* as key type and `%Vector_3` as value type} +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using compute_vertex_normals()} +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1289,289 +1312,335 @@ template - void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, - VertexCurvatureMap& vcm, - const NamedParameters& np = parameters::default_values()) +typename NamedParameters = parameters::Default_named_parameters> +void interpolated_corrected_principal_curvatures_and_directions(const PolygonMesh& pmesh, + VertexCurvatureMap vcm, + const NamedParameters& np = parameters::default_values()) { interpolated_corrected_curvatures(pmesh, np.vertex_principal_curvatures_and_directions_map(vcm)); } /** - * \ingroup PMP_corrected_curvatures_grp - * Computes the interpolated corrected curvatures at a certain vertex, based on the provided pointers. - * By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user - * can choose which quantites to compute. - * - * The pointers are used to store the computed quantities. - * The user is responsible for the memory management of the pointers. - * - * @tparam PolygonMesh a model of `FaceListGraph` - * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" - * - * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the curvatures at - * @param np optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below - * - * \cgalNamedParamsBegin - * \cgalParamNBegin{vertex_point_map} - * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Point_3` as value type} - * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} - * \cgalParamExtra{If this parameter is omitted, an internal property map for - * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_normal_map} - * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Vector_3` as value type} - * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} - * \cgalParamExtra{If this parameter is omitted, vertex normals will be - * computed using compute_vertex_normals()} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_mean_curvature} - * \cgalParamDescription{a pointer to a scalar value to store the mean curvature at the vertex `v`} - * \cgalParamType{`GT::FT*`} - * \cgalParamDefault{`nullptr`} - * \cgalParamExtra{If this parameter is omitted, mean curvature won't be computed} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_gaussian_curvature} - * \cgalParamDescription{a pointer to a scalar value to store the gaussian curvature at the vertex `v`} - * \cgalParamType{`GT::FT*`} - * \cgalParamDefault{`nullptr`} - * \cgalParamExtra{If this parameter is omitted, gaussian curvature won't be computed} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_principal_curvatures_and_directions} - * \cgalParamDescription{a pointer to a Principal_curvatures_and_directions object to store the principal curvatures and directions at the vertex `v`} - * \cgalParamType{`Principal_curvatures_and_directions*`} - * \cgalParamDefault{`nullptr`} - * \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} - * \cgalParamNEnd - * - * \cgalParamNBegin{ball_radius} - * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures - * by summing measures of faces inside a ball of this radius centered at the - * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball.} - * \cgalParamType{`GT::FT`} - * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of - * measures on faces around the vertex} - * \cgalParamNEnd - * - * \cgalNamedParamsEnd - * - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` - * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` +* \ingroup PMP_corrected_curvatures_grp +* computes the interpolated corrected curvatures at a certain vertex, based on the provided pointers. +* By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user +* can choose which quantites to compute. +* +* The pointers are used to store the computed quantities. +* The user is responsible for the memory management of the pointers. +* +* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param v the vertex of `pmesh` to compute the curvatures at +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_mean_curvature} +* \cgalParamDescription{a pointer to a scalar value to store the mean curvature at the vertex `v`} +* \cgalParamType{`GT::FT*`} +* \cgalParamDefault{`nullptr`} +* \cgalParamExtra{If this parameter is omitted, mean curvature won't be computed} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_gaussian_curvature} +* \cgalParamDescription{a pointer to a scalar value to store the gaussian curvature at the vertex `v`} +* \cgalParamType{`GT::FT*`} +* \cgalParamDefault{`nullptr`} +* \cgalParamExtra{If this parameter is omitted, gaussian curvature won't be computed} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_principal_curvatures_and_directions} +* \cgalParamDescription{a pointer to a Principal_curvatures_and_directions object to store the principal curvatures and directions at the vertex `v`} +* \cgalParamType{`Principal_curvatures_and_directions*`} +* \cgalParamDefault{`nullptr`} +* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball.} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` +* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` +* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` */ template - void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, - typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) + typename NamedParameters = parameters::Default_named_parameters> +void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) { internal::interpolated_corrected_curvatures_one_vertex(pmesh, v, np); } /** - * \ingroup PMP_corrected_curvatures_grp - * computes the interpolated corrected mean curvature at a vertex of a triangle mesh. - * - * @tparam GT a geometric traits class that provides the nested type `FT`, - * @tparam PolygonMesh a model of `FaceListGraph` - * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" - * - * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the mean curvature at - * @param np optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below - * - * \cgalNamedParamsBegin - * \cgalParamNBegin{vertex_point_map} - * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Point_3` as value type} - * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} - * \cgalParamExtra{If this parameter is omitted, an internal property map for - * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_normal_map} - * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Vector_3` as value type} - * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} - * \cgalParamExtra{If this parameter is omitted, vertex normals will be - * computed using compute_vertex_normals()} - * \cgalParamNEnd - * - * \cgalParamNBegin{ball_radius} - * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures - * by summing measures of faces inside a ball of this radius centered at the - * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball} - * \cgalParamType{`GT::FT`} - * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of - * measures on faces around the vertex} - * \cgalParamNEnd - * - * \cgalNamedParamsEnd - * - * @return the interpolated corrected mean curvature at the vertex `v` - * - * @see `interpolated_corrected_mean_curvature()` - * @see `interpolated_corrected_gaussian_curvature_one_vertex()` - * @see `interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - * @see `interpolated_corrected_curvatures_one_vertex()` +* \ingroup PMP_corrected_curvatures_grp +* computes the interpolated corrected mean curvature at a vertex of a triangle mesh. +* +* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param v the vertex of `pmesh` to compute the mean curvature at +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @return the interpolated corrected mean curvature at the vertex `v` +* +* @see `interpolated_corrected_mean_curvature()` +* @see `interpolated_corrected_gaussian_curvature_one_vertex()` +* @see `interpolated_corrected_principal_curvatures_and_directions_one_vertex()` +* @see `interpolated_corrected_curvatures_one_vertex()` */ -template - typename GT::FT interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, - typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) +template +#ifdef DOXYGEN_RUNNING +typename GT::FT +#else +typename GetGeomTraits::type::FT +#endif +interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) { - typename GT::FT mean_curvature; + typename GetGeomTraits::type::FT mean_curvature; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); return mean_curvature; } /** - * \ingroup PMP_corrected_curvatures_grp - * computes the interpolated corrected Gaussian curvature at a vertex of a triangle mesh. - * - * @tparam GT a geometric traits class that provides the nested type `FT`, - * @tparam PolygonMesh a model of `FaceListGraph` - * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" - * - * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the Gaussian curvature at - * @param np optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below - * - * \cgalNamedParamsBegin - * \cgalParamNBegin{vertex_point_map} - * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Point_3` as value type} - * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} - * \cgalParamExtra{If this parameter is omitted, an internal property map for - * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_normal_map} - * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Vector_3` as value type} - * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} - * \cgalParamExtra{If this parameter is omitted, vertex normals will be - * computed using compute_vertex_normals()} - * \cgalParamNEnd - * - * \cgalParamNBegin{ball_radius} - * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures - * by summing measures of faces inside a ball of this radius centered at the - * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball} - * \cgalParamType{`GT::FT`} - * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of - * measures on faces around the vertex} - * \cgalParamNEnd - * - * \cgalNamedParamsEnd - * - * @return the interpolated corrected Gaussian curvature at the vertex `v` - * - * @see `interpolated_corrected_gaussian_curvature()` - * @see `interpolated_corrected_mean_curvature_one_vertex()` - * @see `interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - * @see `interpolated_corrected_curvatures_one_vertex()` +* \ingroup PMP_corrected_curvatures_grp +* computes the interpolated corrected Gaussian curvature at a vertex of a triangle mesh. +* +* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param v the vertex of `pmesh` to compute the Gaussian curvature at +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `GT::Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* @return the interpolated corrected Gaussian curvature at the vertex `v` +* +* @see `interpolated_corrected_gaussian_curvature()` +* @see `interpolated_corrected_mean_curvature_one_vertex()` +* @see `interpolated_corrected_principal_curvatures_and_directions_one_vertex()` +* @see `interpolated_corrected_curvatures_one_vertex()` */ -template - typename GT::FT interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, - typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) +#ifdef DOXYGEN_RUNNING +typename GT::FT +#else +typename GetGeomTraits::type::FT +#endif +interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) { - typename GT::FT gc; + typename GetGeomTraits::type::FT gc; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); return gc; } /** - * \ingroup PMP_corrected_curvatures_grp - * computes the interpolated corrected principal curvatures and directions at a vertex of a triangle mesh. - * - * @tparam GT the geometric traits class, - * @tparam PolygonMesh a model of `FaceListGraph` - * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" - * - * @param pmesh the polygon mesh - * @param v the vertex of `pmesh` to compute the principal curvatures and directions at - * @param np optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below - * - * \cgalNamedParamsBegin - * \cgalParamNBegin{vertex_point_map} - * \cgalParamDescription{a property map associating points to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Point_3` as value type} - * \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} - * \cgalParamExtra{If this parameter is omitted, an internal property map for - * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} - * \cgalParamNEnd - * - * \cgalParamNBegin{vertex_normal_map} - * \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} - * \cgalParamType{a class model of `ReadablePropertyMap` with - * `boost::graph_traits::%Vertex_descriptor` - * as key type and `%Vector_3` as value type} - * \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} - * \cgalParamExtra{If this parameter is omitted, vertex normals will be - * computed using compute_vertex_normals()} - * \cgalParamNEnd - * - * \cgalParamNBegin{ball_radius} - * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures - * by summing measures of faces inside a ball of this radius centered at the - * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball} - * \cgalParamType{`GT::FT`} - * \cgalParamDefault{`-1`} - * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of - * measures on faces around the vertex} - * \cgalParamNEnd - * \cgalNamedParamsEnd - * - * @return the interpolated corrected principal curvatures and directions at the vertex `v` - * - * @see `interpolated_corrected_principal_curvatures_and_directions()` - * @see `interpolated_corrected_mean_curvature_one_vertex()` - * @see `interpolated_corrected_gaussian_curvature_one_vertex()` - * @see `interpolated_corrected_curvatures_one_vertex()` +* \ingroup PMP_corrected_curvatures_grp +* computes the interpolated corrected principal curvatures and directions at a vertex of a triangle mesh. +* +* @tparam PolygonMesh a model of `FaceListGraph` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param pmesh the polygon mesh +* @param v the vertex of `pmesh` to compute the principal curvatures and directions at +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* `GT` stands for the type of the object provided to the named parameter `geom_traits()`. +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for +* `CGAL::vertex_point_t` must be available in `PolygonMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_normal_map} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamType{a class model of `ReadablePropertyMap` with +* `boost::graph_traits::%vertex_descriptor` +* as key type and `%Vector_3` as value type} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* \cgalParamExtra{If this parameter is omitted, vertex normals will be +* computed using `compute_vertex_normals()`} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} +* \cgalParamNEnd +* +* \cgalParamNBegin{ball_radius} +* \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures +* by summing measures of faces inside a ball of this radius centered at the +* vertex expanded from. The summed face measures are weighted by their +* inclusion ratio inside this ball} +* \cgalParamType{`GT::FT`} +* \cgalParamDefault{`-1`} +* \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of +* measures on faces around the vertex} +* \cgalParamNEnd +* \cgalNamedParamsEnd +* +* @return the interpolated corrected principal curvatures and directions at the vertex `v` +* +* @see `interpolated_corrected_principal_curvatures_and_directions()` +* @see `interpolated_corrected_mean_curvature_one_vertex()` +* @see `interpolated_corrected_gaussian_curvature_one_vertex()` +* @see `interpolated_corrected_curvatures_one_vertex()` */ -template - Principal_curvatures_and_directions interpolated_corrected_principal_curvatures_and_directions_one_vertex(const PolygonMesh& pmesh, - typename boost::graph_traits::vertex_descriptor v, - const NamedParameters& np = parameters::default_values()) +template +#ifdef DOXYGEN_RUNNING +Principal_curvatures_and_directions +#else +Principal_curvatures_and_directions::type> +#endif +interpolated_corrected_principal_curvatures_and_directions_one_vertex(const PolygonMesh& pmesh, + typename boost::graph_traits::vertex_descriptor v, + const NamedParameters& np = parameters::default_values()) { + using GT=typename GetGeomTraits::type; Principal_curvatures_and_directions pcd; interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); return pcd; From 5ef5d67920724435a903a932866b9525260125a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 22 Mar 2023 18:40:44 +0100 Subject: [PATCH 0134/1398] do not use pointers --- .../interpolated_corrected_curvatures.h | 75 +++++++++---------- ...test_interpolated_corrected_curvatures.cpp | 6 +- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 24c1d12a59e3..cc898d2fc943 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -624,6 +624,16 @@ Vertex_measures interpolated_corrected_measures_one_vertex( return vertex_measures; } +template +void set_value(const T& value, std::reference_wrapper rw) +{ + rw.get()=value; +} + +template +void set_value(const T&, internal_np::Param_not_found) +{} + // computes selected curvatures for one specific vertex template @@ -662,15 +672,10 @@ template(pmesh) * 1e-6; - // get parameters (pointers) for curvatures - typename GT::FT* vertex_mean_curvature = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature), nullptr); - typename GT::FT* vertex_gaussian_curvature = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature), nullptr); - Principal_curvatures_and_directions* vertex_principal_curvatures_and_directions = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions), nullptr); - - // determine which curvatures are selected (by checking if the pointers are not null) - const bool is_mean_curvature_selected = (vertex_mean_curvature != nullptr); - const bool is_gaussian_curvature_selected = (vertex_gaussian_curvature != nullptr); - const bool is_principal_curvatures_and_directions_selected = (vertex_principal_curvatures_and_directions != nullptr); + // determine which curvatures are selected + const bool is_mean_curvature_selected = !is_default_parameter::value; + const bool is_gaussian_curvature_selected = !is_default_parameter::value; + const bool is_principal_curvatures_and_directions_selected = !is_default_parameter::value; Vertex_measures vertex_measures; @@ -703,13 +708,13 @@ template principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, - v_normal - ); - *vertex_principal_curvatures_and_directions = principal_curvatures_and_directions; + v_normal); + set_value(principal_curvatures_and_directions, get_parameter(np, internal_np::vertex_principal_curvatures_and_directions)); } } @@ -1064,7 +1068,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `GT::FT` as value type} -* \cgalParamExtra{If this parameter is omitted, mean curvatures won't be computed} +* \cgalParamExtra{If this parameter is omitted, mean curvatures will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_gaussian_curvature_map} @@ -1072,7 +1076,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `GT::FT` as value type} -* \cgalParamExtra{If this parameter is omitted, gaussian curvatures won't be computed} +* \cgalParamExtra{If this parameter is omitted, gaussian curvatures will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} @@ -1080,7 +1084,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `Principal_curvatures_and_directions` as value type} -* \cgalParamExtra{If this parameter is omitted, mean principal won't be computed} +* \cgalParamExtra{If this parameter is omitted, mean principal will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1323,13 +1327,10 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes /** * \ingroup PMP_corrected_curvatures_grp -* computes the interpolated corrected curvatures at a certain vertex, based on the provided pointers. +* computes the interpolated corrected curvatures at a vertex `v`. * By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * -* The pointers are used to store the computed quantities. -* The user is responsible for the memory management of the pointers. -* * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * @@ -1359,7 +1360,6 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * computed using `compute_vertex_normals()`} * \cgalParamNEnd * -* * \cgalParamNBegin{geom_traits} * \cgalParamDescription{an instance of a geometric traits class} * \cgalParamType{a class model of `Kernel`} @@ -1368,24 +1368,21 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * \cgalParamNEnd * * \cgalParamNBegin{vertex_mean_curvature} -* \cgalParamDescription{a pointer to a scalar value to store the mean curvature at the vertex `v`} -* \cgalParamType{`GT::FT*`} -* \cgalParamDefault{`nullptr`} -* \cgalParamExtra{If this parameter is omitted, mean curvature won't be computed} +* \cgalParamDescription{a reference to a scalar value to store the mean curvature at the vertex `v`} +* \cgalParamType{`std::reference_wrapper`} +* \cgalParamExtra{If this parameter is omitted, mean curvature will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_gaussian_curvature} -* \cgalParamDescription{a pointer to a scalar value to store the gaussian curvature at the vertex `v`} -* \cgalParamType{`GT::FT*`} -* \cgalParamDefault{`nullptr`} -* \cgalParamExtra{If this parameter is omitted, gaussian curvature won't be computed} +* \cgalParamDescription{a reference to a scalar value to store the gaussian curvature at the vertex `v`} +* \cgalParamType{`std::reference_wrapper`} +* \cgalParamExtra{If this parameter is omitted, gaussian curvature will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions} -* \cgalParamDescription{a pointer to a Principal_curvatures_and_directions object to store the principal curvatures and directions at the vertex `v`} -* \cgalParamType{`Principal_curvatures_and_directions*`} -* \cgalParamDefault{`nullptr`} -* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions won't be computed} +* \cgalParamDescription{a reference to an`Principal_curvatures_and_directions` object to store the principal curvatures and directions at the vertex `v`} +* \cgalParamType{`std::reference_wrapper>`} +* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1488,7 +1485,7 @@ interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { typename GetGeomTraits::type::FT mean_curvature; - interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_mean_curvature(&mean_curvature)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_mean_curvature(std::ref(mean_curvature))); return mean_curvature; } @@ -1565,7 +1562,7 @@ interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { typename GetGeomTraits::type::FT gc; - interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(&gc)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(std::ref(gc))); return gc; } @@ -1642,7 +1639,7 @@ interpolated_corrected_principal_curvatures_and_directions_one_vertex(const Poly { using GT=typename GetGeomTraits::type; Principal_curvatures_and_directions pcd; - interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(&pcd)); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_principal_curvatures_and_directions(std::ref(pcd))); return pcd; } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index c8d3894720cc..bd0594652206 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -165,9 +165,9 @@ void test_average_curvatures(std::string mesh_path, PMP::interpolated_corrected_curvatures_one_vertex( pmesh, v, - CGAL::parameters::vertex_gaussian_curvature(&g) - .vertex_mean_curvature(&h) - .vertex_principal_curvatures_and_directions(&p) + CGAL::parameters::vertex_gaussian_curvature(std::ref(g)) + .vertex_mean_curvature(std::ref(h)) + .vertex_principal_curvatures_and_directions(std::ref(p)) .ball_radius(test_info.expansion_radius) ); From 7f4597720eed4bc4c9c215668f99e02495357826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 22 Mar 2023 18:44:11 +0100 Subject: [PATCH 0135/1398] the mesh does not need to be triangulated --- .../interpolated_corrected_curvatures.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index cc898d2fc943..94a8533ca42b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1414,7 +1414,7 @@ void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, /** * \ingroup PMP_corrected_curvatures_grp -* computes the interpolated corrected mean curvature at a vertex of a triangle mesh. +* computes the interpolated corrected mean curvature at vertex `v` of mesh `pmesh`. * * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -1491,7 +1491,7 @@ interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, /** * \ingroup PMP_corrected_curvatures_grp -* computes the interpolated corrected Gaussian curvature at a vertex of a triangle mesh. +* computes the interpolated corrected Gaussian curvature at vertex `v` of mesh `pmesh`. * * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -1568,7 +1568,7 @@ interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, /** * \ingroup PMP_corrected_curvatures_grp -* computes the interpolated corrected principal curvatures and directions at a vertex of a triangle mesh. +* computes the interpolated corrected principal curvatures and directions at vertex `v` of mesh `pmesh`. * * @tparam PolygonMesh a model of `FaceListGraph` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" From 661513b16ee05509e00d0975213e928c75443dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 22 Mar 2023 19:12:28 +0100 Subject: [PATCH 0136/1398] gaussian -> Gaussian --- .../PackageDescription.txt | 4 +- .../Polygon_mesh_processing.txt | 4 +- .../interpolated_corrected_curvatures_PH.cpp | 2 +- .../interpolated_corrected_curvatures_SM.cpp | 2 +- ...terpolated_corrected_curvatures_vertex.cpp | 4 +- .../interpolated_corrected_curvatures.h | 76 +++++++++---------- ...test_interpolated_corrected_curvatures.cpp | 24 +++--- .../Display/Display_property_plugin.cpp | 10 +-- .../internal/parameters_interface.h | 4 +- 9 files changed, 65 insertions(+), 65 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 9cb257338a72..9c8b5d6f2948 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -209,11 +209,11 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. \cgalCRPSection{Corrected Curvatures} - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` - `CGAL::Polygon_mesh_processing::Principal_curvatures_and_directions` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 2eb85a80bfbb..65c236e99fc3 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -901,7 +901,7 @@ Polyhedron_3 and other polygonal mesh structures based on the Face Graph Model. These computations are performed using (on all vertices of mesh): - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` @@ -910,7 +910,7 @@ as the implementation performs the shared computations only once, making it more Similarly, we can use the following functions to compute curvatures on a specific vertex: - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` -- `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +- `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp index 3cf675c53ca4..0e3923dc67b8 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp @@ -38,7 +38,7 @@ int main(int argc, char* argv[]) polyhedron, mean_curvature_map); - PMP::interpolated_corrected_gaussian_curvature( + PMP::interpolated_corrected_Gaussian_curvature( polyhedron, gaussian_curvature_map); diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp index d92ec7b8096d..811146dd6412 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp @@ -53,7 +53,7 @@ int main(int argc, char* argv[]) mean_curvature_map ); - PMP::interpolated_corrected_gaussian_curvature( + PMP::interpolated_corrected_Gaussian_curvature( smesh, gaussian_curvature_map ); diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp index e5845a1b3a5a..c0722b25675a 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp @@ -31,7 +31,7 @@ int main(int argc, char* argv[]) for (vertex_descriptor v : vertices(smesh)) { double h = PMP::interpolated_corrected_mean_curvature_one_vertex(smesh, v); - double g = PMP::interpolated_corrected_gaussian_curvature_one_vertex(smesh, v); + double g = PMP::interpolated_corrected_Gaussian_curvature_one_vertex(smesh, v); PMP::Principal_curvatures_and_directions p = PMP::interpolated_corrected_principal_curvatures_and_directions_one_vertex(smesh, v); @@ -48,7 +48,7 @@ int main(int argc, char* argv[]) // smesh, // v, // CGAL::parameters::vertex_mean_curvature(&h) - // .vertex_gaussian_curvature(&g) + // .vertex_Gaussian_curvature(&g) // ); std::cout << v.idx() << ": HC = " << h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 94a8533ca42b..bffd2657e96c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -222,7 +222,7 @@ typename GT::FT interpolated_corrected_mean_curvature_measure_face(const std::ve } template -typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std::vector& u) +typename GT::FT interpolated_corrected_Gaussian_curvature_measure_face(const std::vector& u) { const std::size_t n = u.size(); CGAL_precondition(n >= 3); @@ -259,7 +259,7 @@ typename GT::FT interpolated_corrected_gaussian_curvature_measure_face(const std // summing each triangle's measure after triangulation by barycenter split. for (std::size_t i = 0; i < n; i++) { - mu2 += interpolated_corrected_gaussian_curvature_measure_face( + mu2 += interpolated_corrected_Gaussian_curvature_measure_face( std::vector {u[i], u[(i + 1) % n], uc} ); } @@ -483,7 +483,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( const PolygonMesh& pmesh, const typename boost::graph_traits::vertex_descriptor v, const bool is_mean_curvature_selected, - const bool is_gaussian_curvature_selected, + const bool is_Gaussian_curvature_selected, const bool is_principal_curvatures_and_directions_selected, const VPM vpm, const VNM vnm @@ -519,8 +519,8 @@ Vertex_measures interpolated_corrected_measures_one_vertex_no_radius( if (is_mean_curvature_selected) vertex_measures.mean_curvature_measure += interpolated_corrected_mean_curvature_measure_face(u, x); - if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += interpolated_corrected_gaussian_curvature_measure_face(u); + if (is_Gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += interpolated_corrected_Gaussian_curvature_measure_face(u); if (is_principal_curvatures_and_directions_selected) { @@ -543,7 +543,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( const typename boost::graph_traits::vertex_descriptor v, const typename GT::FT radius, const bool is_mean_curvature_selected, - const bool is_gaussian_curvature_selected, + const bool is_Gaussian_curvature_selected, const bool is_principal_curvatures_and_directions_selected, const VPM vpm, const VNM vnm @@ -598,8 +598,8 @@ Vertex_measures interpolated_corrected_measures_one_vertex( if (is_mean_curvature_selected) vertex_measures.mean_curvature_measure += f_ratio * interpolated_corrected_mean_curvature_measure_face(u, x); - if (is_gaussian_curvature_selected) - vertex_measures.gaussian_curvature_measure += f_ratio * interpolated_corrected_gaussian_curvature_measure_face(u); + if (is_Gaussian_curvature_selected) + vertex_measures.gaussian_curvature_measure += f_ratio * interpolated_corrected_Gaussian_curvature_measure_face(u); if (is_principal_curvatures_and_directions_selected) { @@ -674,7 +674,7 @@ template::value; - const bool is_gaussian_curvature_selected = !is_default_parameter::value; + const bool is_Gaussian_curvature_selected = !is_default_parameter::value; const bool is_principal_curvatures_and_directions_selected = !is_default_parameter::value; Vertex_measures vertex_measures; @@ -686,7 +686,7 @@ template::type Vertex_mean_curvature_map; - typedef typename internal_np::Lookup_named_param_def::type Vertex_gaussian_curvature_map; + Default_scalar_map>::type Vertex_Gaussian_curvature_map; typedef Constant_property_map> Default_principal_map; typedef typename internal_np::Lookup_named_param_def::value; - is_gaussian_curvature_selected = !is_default_parameter::value; + is_Gaussian_curvature_selected = !is_default_parameter::value; is_principal_curvatures_and_directions_selected = !is_default_parameter::value; mean_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_mean_curvature_map), Default_scalar_map()); - gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_gaussian_curvature_map), Default_scalar_map()); + gaussian_curvature_map = choose_parameter(get_parameter(np, internal_np::vertex_Gaussian_curvature_map), Default_scalar_map()); principal_curvatures_and_directions_map = choose_parameter(get_parameter(np, internal_np::vertex_principal_curvatures_and_directions_map), Default_principal_map()); } @@ -842,7 +842,7 @@ class Interpolated_corrected_curvatures_computer { set_named_params(np); - if (is_mean_curvature_selected || is_gaussian_curvature_selected || is_principal_curvatures_and_directions_selected) + if (is_mean_curvature_selected || is_Gaussian_curvature_selected || is_principal_curvatures_and_directions_selected) { set_property_maps(); @@ -872,8 +872,8 @@ class Interpolated_corrected_curvatures_computer if (is_mean_curvature_selected) put(mu1_map, f, interpolated_corrected_mean_curvature_measure_face(u, x)); - if (is_gaussian_curvature_selected) - put(mu2_map, f, interpolated_corrected_gaussian_curvature_measure_face(u)); + if (is_Gaussian_curvature_selected) + put(mu2_map, f, interpolated_corrected_Gaussian_curvature_measure_face(u)); if (is_principal_curvatures_and_directions_selected) put(muXY_map, f, interpolated_corrected_anisotropic_measure_face(u, x)); @@ -899,7 +899,7 @@ class Interpolated_corrected_curvatures_computer if (is_mean_curvature_selected) vertex_measures.mean_curvature_measure += get(mu1_map, f); - if (is_gaussian_curvature_selected) + if (is_Gaussian_curvature_selected) vertex_measures.gaussian_curvature_measure += get(mu2_map, f); if (is_principal_curvatures_and_directions_selected) @@ -957,7 +957,7 @@ class Interpolated_corrected_curvatures_computer if (is_mean_curvature_selected) vertex_measures.mean_curvature_measure += f_ratio * get(mu1_map, fi); - if (is_gaussian_curvature_selected) + if (is_Gaussian_curvature_selected) vertex_measures.gaussian_curvature_measure += f_ratio * get(mu2_map, fi); if (is_principal_curvatures_and_directions_selected) @@ -998,7 +998,7 @@ class Interpolated_corrected_curvatures_computer put(mean_curvature_map, v, 0); } - if (is_gaussian_curvature_selected) { + if (is_Gaussian_curvature_selected) { vertex_measures.area_measure != 0 ? put(gaussian_curvature_map, v, vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure) : put(gaussian_curvature_map, v, 0); @@ -1071,7 +1071,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamExtra{If this parameter is omitted, mean curvatures will not be computed} * \cgalParamNEnd * -* \cgalParamNBegin{vertex_gaussian_curvature_map} +* \cgalParamNBegin{vertex_Gaussian_curvature_map} * \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` @@ -1101,7 +1101,7 @@ class Interpolated_corrected_curvatures_computer * \cgalNamedParamsEnd * * @see `interpolated_corrected_mean_curvature()` -* @see `interpolated_corrected_gaussian_curvature()` +* @see `interpolated_corrected_Gaussian_curvature()` * @see `interpolated_corrected_principal_curvatures_and_directions()` */ template -void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, +void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, VertexCurvatureMap vcm, const NamedParameters& np = parameters::default_values()) { - interpolated_corrected_curvatures(pmesh, np.vertex_gaussian_curvature_map(vcm)); + interpolated_corrected_curvatures(pmesh, np.vertex_Gaussian_curvature_map(vcm)); } /** @@ -1312,7 +1312,7 @@ void interpolated_corrected_gaussian_curvature(const PolygonMesh& pmesh, * \cgalNamedParamsEnd * * @see `interpolated_corrected_mean_curvature()` -* @see `interpolated_corrected_gaussian_curvature()` +* @see `interpolated_corrected_Gaussian_curvature()` * @see `interpolated_corrected_curvatures()` */ template`} * \cgalParamExtra{If this parameter is omitted, gaussian curvature will not be computed} @@ -1400,7 +1400,7 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` -* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_gaussian_curvature_one_vertex()` +* @see `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature_one_vertex()` * @see `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` */ template::type::FT #endif -interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, +interpolated_corrected_Gaussian_curvature_one_vertex(const PolygonMesh& pmesh, typename boost::graph_traits::vertex_descriptor v, const NamedParameters& np = parameters::default_values()) { typename GetGeomTraits::type::FT gc; - interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_gaussian_curvature(std::ref(gc))); + interpolated_corrected_curvatures_one_vertex(pmesh, v, np.vertex_Gaussian_curvature(std::ref(gc))); return gc; } @@ -1622,7 +1622,7 @@ interpolated_corrected_gaussian_curvature_one_vertex(const PolygonMesh& pmesh, * * @see `interpolated_corrected_principal_curvatures_and_directions()` * @see `interpolated_corrected_mean_curvature_one_vertex()` -* @see `interpolated_corrected_gaussian_curvature_one_vertex()` +* @see `interpolated_corrected_Gaussian_curvature_one_vertex()` * @see `interpolated_corrected_curvatures_one_vertex()` */ diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index bd0594652206..c0772ce989bc 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -78,7 +78,7 @@ void test_average_curvatures(std::string mesh_path, // test_info.expansion_radius -> test if no radius is provided by user. if (test_info.expansion_radius < 0) { PMP::interpolated_corrected_mean_curvature(pmesh, mean_curvature_map); - PMP::interpolated_corrected_gaussian_curvature(pmesh, gaussian_curvature_map); + PMP::interpolated_corrected_Gaussian_curvature(pmesh, gaussian_curvature_map); PMP::interpolated_corrected_principal_curvatures_and_directions(pmesh, principal_curvatures_and_directions_map); } else { @@ -88,7 +88,7 @@ void test_average_curvatures(std::string mesh_path, CGAL::parameters::ball_radius(test_info.expansion_radius) ); - PMP::interpolated_corrected_gaussian_curvature( + PMP::interpolated_corrected_Gaussian_curvature( pmesh, gaussian_curvature_map, CGAL::parameters::ball_radius(test_info.expansion_radius) @@ -125,28 +125,28 @@ void test_average_curvatures(std::string mesh_path, pmesh, CGAL::parameters::ball_radius(test_info.expansion_radius) .vertex_mean_curvature_map(mean_curvature_map) - .vertex_gaussian_curvature_map(gaussian_curvature_map) + .vertex_Gaussian_curvature_map(gaussian_curvature_map) .vertex_principal_curvatures_and_directions_map(principal_curvatures_and_directions_map) ); - Epic_kernel::FT new_mean_curvature_avg = 0, new_gaussian_curvature_avg = 0, new_principal_curvature_avg = 0; + Epic_kernel::FT new_mean_curvature_avg = 0, new_Gaussian_curvature_avg = 0, new_principal_curvature_avg = 0; for (vertex_descriptor v : vertices(pmesh)) { new_mean_curvature_avg += get(mean_curvature_map, v); - new_gaussian_curvature_avg += get(gaussian_curvature_map, v); + new_Gaussian_curvature_avg += get(gaussian_curvature_map, v); new_principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature + get(principal_curvatures_and_directions_map, v).max_curvature; } new_mean_curvature_avg /= vertices(pmesh).size(); - new_gaussian_curvature_avg /= vertices(pmesh).size(); + new_Gaussian_curvature_avg /= vertices(pmesh).size(); new_principal_curvature_avg /= vertices(pmesh).size() * 2; // are average curvatures computed from interpolated_corrected_curvatures() // equal to average curvatures each computed on its own? assert(passes_comparison(mean_curvature_avg, new_mean_curvature_avg, 0.99)); - assert(passes_comparison(gaussian_curvature_avg, new_gaussian_curvature_avg, 0.99)); + assert(passes_comparison(gaussian_curvature_avg, new_Gaussian_curvature_avg, 0.99)); assert(passes_comparison(principal_curvature_avg, new_principal_curvature_avg, 0.99)); if (compare_single_vertex) @@ -154,7 +154,7 @@ void test_average_curvatures(std::string mesh_path, // computing curvatures together from interpolated_corrected_curvatures() Epic_kernel::FT single_vertex_mean_curvature_avg = 0, - single_vertex_gaussian_curvature_avg = 0, + single_vertex_Gaussian_curvature_avg = 0, single_vertex_principal_curvature_avg = 0; Epic_kernel::FT h, g; @@ -165,23 +165,23 @@ void test_average_curvatures(std::string mesh_path, PMP::interpolated_corrected_curvatures_one_vertex( pmesh, v, - CGAL::parameters::vertex_gaussian_curvature(std::ref(g)) + CGAL::parameters::vertex_Gaussian_curvature(std::ref(g)) .vertex_mean_curvature(std::ref(h)) .vertex_principal_curvatures_and_directions(std::ref(p)) .ball_radius(test_info.expansion_radius) ); single_vertex_mean_curvature_avg += h; - single_vertex_gaussian_curvature_avg += g; + single_vertex_Gaussian_curvature_avg += g; single_vertex_principal_curvature_avg += p.min_curvature + p.max_curvature; } single_vertex_mean_curvature_avg /= vertices(pmesh).size(); - single_vertex_gaussian_curvature_avg /= vertices(pmesh).size(); + single_vertex_Gaussian_curvature_avg /= vertices(pmesh).size(); single_vertex_principal_curvature_avg /= vertices(pmesh).size() * 2; assert(passes_comparison(mean_curvature_avg, single_vertex_mean_curvature_avg, 0.99)); - assert(passes_comparison(gaussian_curvature_avg, single_vertex_gaussian_curvature_avg, 0.99)); + assert(passes_comparison(gaussian_curvature_avg, single_vertex_Gaussian_curvature_avg, 0.99)); assert(passes_comparison(principal_curvature_avg, single_vertex_principal_curvature_avg, 0.99)); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index c4c7d6a3c916..050487c9fec2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -662,7 +662,7 @@ private Q_SLOTS: if (does_exist) sm_item->face_graph()->remove_property_map(pmap); std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("v:interpolated_corrected_gaussian_curvature"); + sm_item->face_graph()->property_map("v:interpolated_corrected_Gaussian_curvature"); if (does_exist) sm_item->face_graph()->remove_property_map(pmap); }); @@ -748,7 +748,7 @@ private Q_SLOTS: smesh.remove_property_map(mean_curvature); } SMesh::Property_map gaussian_curvature; - std::tie(gaussian_curvature, found) = smesh.property_map("v:interpolated_corrected_gaussian_curvature"); + std::tie(gaussian_curvature, found) = smesh.property_map("v:interpolated_corrected_Gaussian_curvature"); if (found) { smesh.remove_property_map(gaussian_curvature); @@ -851,7 +851,7 @@ private Q_SLOTS: if (mu_index != MEAN_CURVATURE && mu_index != GAUSSIAN_CURVATURE) return; std::string tied_string = (mu_index == MEAN_CURVATURE)? - "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_gaussian_curvature"; + "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_Gaussian_curvature"; SMesh& smesh = *item->face_graph(); const auto vnm = smesh.property_map("v:normal_before_perturbation").first; @@ -868,13 +868,13 @@ private Q_SLOTS: if (mu_index == MEAN_CURVATURE) PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); } else { if (mu_index == MEAN_CURVATURE) PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); else - PMP::interpolated_corrected_gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); } double res_min = ARBITRARY_DBL_MAX, res_max = -ARBITRARY_DBL_MAX; 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 4990dca1ba15..30272955bb00 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -91,10 +91,10 @@ CGAL_add_named_parameter(number_of_points_on_edges_t, number_of_points_on_edges, CGAL_add_named_parameter(nb_points_per_area_unit_t, nb_points_per_area_unit, number_of_points_per_area_unit) CGAL_add_named_parameter(nb_points_per_distance_unit_t, nb_points_per_distance_unit, number_of_points_per_distance_unit) CGAL_add_named_parameter(vertex_mean_curvature_map_t, vertex_mean_curvature_map, vertex_mean_curvature_map) -CGAL_add_named_parameter(vertex_gaussian_curvature_map_t, vertex_gaussian_curvature_map, vertex_gaussian_curvature_map) +CGAL_add_named_parameter(vertex_Gaussian_curvature_map_t, vertex_Gaussian_curvature_map, vertex_Gaussian_curvature_map) CGAL_add_named_parameter(vertex_principal_curvatures_and_directions_map_t, vertex_principal_curvatures_and_directions_map, vertex_principal_curvatures_and_directions_map) CGAL_add_named_parameter(vertex_mean_curvature_t, vertex_mean_curvature, vertex_mean_curvature) -CGAL_add_named_parameter(vertex_gaussian_curvature_t, vertex_gaussian_curvature, vertex_gaussian_curvature) +CGAL_add_named_parameter(vertex_Gaussian_curvature_t, vertex_Gaussian_curvature, vertex_Gaussian_curvature) CGAL_add_named_parameter(vertex_principal_curvatures_and_directions_t, vertex_principal_curvatures_and_directions, vertex_principal_curvatures_and_directions) CGAL_add_named_parameter(ball_radius_t, ball_radius, ball_radius) CGAL_add_named_parameter(outward_orientation_t, outward_orientation, outward_orientation) From 556218bf153dcfd7b82861445e0a77e135753c0f Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 25 Mar 2023 11:57:22 +0200 Subject: [PATCH 0137/1398] gaussian -> Gaussian in docs and comments --- .../Polygon_mesh_processing.txt | 4 ++-- .../interpolated_corrected_curvatures_vertex.cpp | 2 +- .../interpolated_corrected_curvatures.h | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 65c236e99fc3..e2bee6e295d8 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -890,7 +890,7 @@ not provide storage for the normals. \section PMPICC Computing Curvatures This package provides methods to compute curvatures on polygonal meshes based on Interpolated Corrected Curvatures -on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, gaussian curvature, +on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, Gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces. The algorithms used prove to work well in general. Also, on meshes with noise on vertex positions, they give accurate results, on the condition that the @@ -905,7 +905,7 @@ These computations are performed using (on all vertices of mesh): - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` -Where it is recommended to use the last function for computing multiple curvatures (example: mean and gaussian) +Where it is recommended to use the last function for computing multiple curvatures (example: mean and Gaussian) as the implementation performs the shared computations only once, making it more efficient. Similarly, we can use the following functions to compute curvatures on a specific vertex: diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp index c0722b25675a..c6bef5faa740 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_vertex.cpp @@ -43,7 +43,7 @@ int main(int argc, char* argv[]) // The following commented lines show this (all mentioned named parameters work on it as well) // we specify which curvatures we want to compute by passing pointers as named parameters // as shown. These pointers are used for storing the result as well. in this example we - // selected mean and gaussian curvatures + // selected mean and Gaussian curvatures // PMP::interpolated_corrected_curvatures_one_vertex( // smesh, // v, diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index bffd2657e96c..2324b0e9e88c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1024,7 +1024,7 @@ class Interpolated_corrected_curvatures_computer * \ingroup PMP_corrected_curvatures_grp * * computes the interpolated corrected curvatures across the mesh `pmesh`. -* By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user +* By providing mean, Gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * * @tparam PolygonMesh a model of `FaceListGraph`. @@ -1076,7 +1076,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `GT::FT` as value type} -* \cgalParamExtra{If this parameter is omitted, gaussian curvatures will not be computed} +* \cgalParamExtra{If this parameter is omitted, Gaussian curvatures will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} @@ -1186,7 +1186,7 @@ void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected gaussian curvature across the mesh `pmesh`. +* computes the interpolated corrected Gaussian curvature across the mesh `pmesh`. * * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap a model of `WritablePropertyMap` with @@ -1194,7 +1194,7 @@ void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed gaussian curvatures are stored. +* @param vcm the vertex property map in which the computed Gaussian curvatures are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters". * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * @@ -1328,7 +1328,7 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes /** * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected curvatures at a vertex `v`. -* By providing mean, gaussian and/or principal curvature and direction property maps as named parameters, the user +* By providing mean, Gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * * @tparam PolygonMesh a model of `FaceListGraph` @@ -1374,9 +1374,9 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * \cgalParamNEnd * * \cgalParamNBegin{vertex_Gaussian_curvature} -* \cgalParamDescription{a reference to a scalar value to store the gaussian curvature at the vertex `v`} +* \cgalParamDescription{a reference to a scalar value to store the Gaussian curvature at the vertex `v`} * \cgalParamType{`std::reference_wrapper`} -* \cgalParamExtra{If this parameter is omitted, gaussian curvature will not be computed} +* \cgalParamExtra{If this parameter is omitted, Gaussian curvature will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions} From 2bc8b1b49565f9f033c40d30dd08d1f6192d99f5 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 25 Mar 2023 13:29:15 +0200 Subject: [PATCH 0138/1398] user man doc improvements --- .../Polygon_mesh_processing.txt | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index e2bee6e295d8..49614be67c91 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -896,10 +896,10 @@ and meshes with n-gon faces. The algorithms used prove to work well in general. with noise on vertex positions, they give accurate results, on the condition that the correct vertex normals are provided. -The implementation is generic in terms of mesh data structure. It can be used on Surface_mesh, -Polyhedron_3 and other polygonal mesh structures based on the Face Graph Model. +The implementation is generic in terms of mesh data structure. It can be used on `Surface_mesh`, +`Polyhedron_3` and other polygonal mesh structures based on the concept `FaceGraph`. -These computations are performed using (on all vertices of mesh): +These computations are performed using (on all vertices of the mesh): - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` @@ -916,29 +916,25 @@ Similarly, we can use the following functions to compute curvatures on a specifi \cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on -the ball_radius named parameter which can be set to a value > 0 to get a smoother -distribution of values and "diffuse" the extreme values of curvatures across the mesh. +the named parameter `ball_radius`, which can be set to a value > 0 to get a smoother +distribution of values and "diffuses" the extreme values of curvatures across the mesh. \cgalFigureAnchor{icc_diff_radius}
- +
\cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature distribution on a bear mesh with different values for the expanding ball radius +The mean curvature distribution on a bear mesh with different values for the ball radius parameter \cgalFigureCaptionEnd -Property maps are used to record the computed curvatures as shown in examples. - - -Property maps are an API introduced in the boost library that allows associating -values to keys. In the following examples, for each property map, we associate +\ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate a curvature value to each vertex. \subsection ICCExampleSM Interpolated Corrected Curvatures on a Surface Mesh Example The following example illustrates how to compute the curvatures on vertices -and store them in property maps provided by the class `Surface_mesh`. +and store them in the property maps provided by the class `Surface_mesh`. \cgalExample{Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp} From 49c12d9265f2b0c02fd816f82d82f5e9141c4504 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 25 Mar 2023 13:44:36 +0200 Subject: [PATCH 0139/1398] ref doc fixes --- .../interpolated_corrected_curvatures.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 2324b0e9e88c..71a2ceaaa911 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1072,7 +1072,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamNEnd * * \cgalParamNBegin{vertex_Gaussian_curvature_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating Gaussian curvatures to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `GT::FT` as value type} @@ -1080,11 +1080,11 @@ class Interpolated_corrected_curvatures_computer * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating principal curvatures and directions to the vertices of `pmesh`} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `Principal_curvatures_and_directions` as value type} -* \cgalParamExtra{If this parameter is omitted, mean principal will not be computed} +* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1256,7 +1256,7 @@ void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, /** * \ingroup PMP_corrected_curvatures_grp * -* computes the interpolated corrected principal curvatures across the mesh `pmesh`. +* computes the interpolated corrected principal curvatures and directions across the mesh `pmesh`. * * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap a model of `WritablePropertyMap` with @@ -1265,7 +1265,7 @@ void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * * @param pmesh the polygon mesh. -* @param vcm the vertex property map in which the computed principal curvatures are stored. +* @param vcm the vertex property map in which the computed principal curvatures and directions are stored. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * From 057b6fc2dd5011052b1049bbbfbc3728c3b875e8 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:20:26 +0200 Subject: [PATCH 0140/1398] gaussian -> Gaussian in example files --- .../interpolated_corrected_curvatures_PH.cpp | 6 +++--- .../interpolated_corrected_curvatures_SM.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp index 0e3923dc67b8..ecf40b840829 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp @@ -30,7 +30,7 @@ int main(int argc, char* argv[]) boost::property_map>::type mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), - gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); + Gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); boost::property_map>>::type principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); @@ -40,7 +40,7 @@ int main(int argc, char* argv[]) PMP::interpolated_corrected_Gaussian_curvature( polyhedron, - gaussian_curvature_map); + Gaussian_curvature_map); PMP::interpolated_corrected_principal_curvatures_and_directions( polyhedron, @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) { auto PC = get(principal_curvatures_and_directions_map, v); std::cout << i << ": HC = " << get(mean_curvature_map, v) - << ", GC = " << get(gaussian_curvature_map, v) << "\n" + << ", GC = " << get(Gaussian_curvature_map, v) << "\n" << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; i++; } diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp index 811146dd6412..ab985e5068d0 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp @@ -29,11 +29,11 @@ int main(int argc, char* argv[]) // creating and tying surface mesh property maps for curvatures (with defaults = 0) bool created = false; - Surface_Mesh::Property_map mean_curvature_map, gaussian_curvature_map; + Surface_Mesh::Property_map mean_curvature_map, Gaussian_curvature_map; boost::tie(mean_curvature_map, created) = smesh.add_property_map("v:mean_curvature_map", 0); assert(created); - boost::tie(gaussian_curvature_map, created) = smesh.add_property_map("v:gaussian_curvature_map", 0); + boost::tie(Gaussian_curvature_map, created) = smesh.add_property_map("v:Gaussian_curvature_map", 0); assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions @@ -55,7 +55,7 @@ int main(int argc, char* argv[]) PMP::interpolated_corrected_Gaussian_curvature( smesh, - gaussian_curvature_map + Gaussian_curvature_map ); PMP::interpolated_corrected_principal_curvatures_and_directions( @@ -91,7 +91,7 @@ int main(int argc, char* argv[]) { auto PC = principal_curvatures_and_directions_map[v]; std::cout << v.idx() << ": HC = " << mean_curvature_map[v] - << ", GC = " << gaussian_curvature_map[v] << "\n" + << ", GC = " << Gaussian_curvature_map[v] << "\n" << ", PC = [ " << PC.min_curvature << " , " << PC.max_curvature << " ]\n"; } } From 5aa995dbe7a24727d22bcbee6d3d2170b0d3274b Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:45:16 +0200 Subject: [PATCH 0141/1398] missing dots in ref documentation --- .../interpolated_corrected_curvatures.h | 250 +++++++++--------- 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 71a2ceaaa911..a22761691b18 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1037,54 +1037,54 @@ class Interpolated_corrected_curvatures_computer * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamDescription{an instance of a geometric traits class.} * \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_mean_curvature_map} -* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating mean curvatures to the vertices of `pmesh`.} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` * as key type and `GT::FT` as value type} -* \cgalParamExtra{If this parameter is omitted, mean curvatures will not be computed} +* \cgalParamExtra{If this parameter is omitted, mean curvatures will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_Gaussian_curvature_map} -* \cgalParamDescription{a property map associating Gaussian curvatures to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating Gaussian curvatures to the vertices of `pmesh`.} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::FT` as value type} -* \cgalParamExtra{If this parameter is omitted, Gaussian curvatures will not be computed} +* as key type and `GT::FT` as value type.} +* \cgalParamExtra{If this parameter is omitted, Gaussian curvatures will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions_map} -* \cgalParamDescription{a property map associating principal curvatures and directions to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating principal curvatures and directions to the vertices of `pmesh`.} * \cgalParamType{a class model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `Principal_curvatures_and_directions` as value type} -* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed} +* as key type and `Principal_curvatures_and_directions` as value type.} +* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1095,7 +1095,7 @@ class Interpolated_corrected_curvatures_computer * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion is then just a sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -1130,29 +1130,29 @@ void interpolated_corrected_curvatures(const PolygonMesh& pmesh, * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamDescription{an instance of a geometric traits class.} * \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1160,11 +1160,11 @@ void interpolated_corrected_curvatures(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -1201,29 +1201,29 @@ void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `%Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `GT::ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `%Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamDescription{an instance of a geometric traits class.} * \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1231,11 +1231,11 @@ void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -1272,29 +1272,29 @@ void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, * \cgalNamedParamsBegin * * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamDescription{an instance of a geometric traits class.} * \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1302,11 +1302,11 @@ void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -1331,58 +1331,58 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * By providing mean, Gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * -* @tparam PolygonMesh a model of `FaceListGraph` -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param v the vertex of `pmesh` to compute the curvatures at +* @param pmesh the polygon mesh. +* @param v the vertex of `pmesh` to compute the curvatures at. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamDescription{an instance of a geometric traits class.} * \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_mean_curvature} -* \cgalParamDescription{a reference to a scalar value to store the mean curvature at the vertex `v`} -* \cgalParamType{`std::reference_wrapper`} -* \cgalParamExtra{If this parameter is omitted, mean curvature will not be computed} +* \cgalParamDescription{a reference to a scalar value to store the mean curvature at the vertex `v`.} +* \cgalParamType{`std::reference_wrapper`.} +* \cgalParamExtra{If this parameter is omitted, mean curvature will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_Gaussian_curvature} -* \cgalParamDescription{a reference to a scalar value to store the Gaussian curvature at the vertex `v`} -* \cgalParamType{`std::reference_wrapper`} -* \cgalParamExtra{If this parameter is omitted, Gaussian curvature will not be computed} +* \cgalParamDescription{a reference to a scalar value to store the Gaussian curvature at the vertex `v`.} +* \cgalParamType{`std::reference_wrapper`.} +* \cgalParamExtra{If this parameter is omitted, Gaussian curvature will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_principal_curvatures_and_directions} -* \cgalParamDescription{a reference to an`Principal_curvatures_and_directions` object to store the principal curvatures and directions at the vertex `v`} -* \cgalParamType{`std::reference_wrapper>`} -* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed} +* \cgalParamDescription{a reference to an`Principal_curvatures_and_directions` object to store the principal curvatures and directions at the vertex `v`.} +* \cgalParamType{`std::reference_wrapper>`.} +* \cgalParamExtra{If this parameter is omitted, principal curvatures and directions will not be computed.} * \cgalParamNEnd * * \cgalParamNBegin{ball_radius} @@ -1393,7 +1393,7 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the epansion is then just a sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd @@ -1416,39 +1416,39 @@ void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected mean curvature at vertex `v` of mesh `pmesh`. * -* @tparam PolygonMesh a model of `FaceListGraph` -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param v the vertex of `pmesh` to compute the mean curvature at +* @param pmesh the polygon mesh. +* @param v the vertex of `pmesh` to compute the mean curvature at. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} -* \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDescription{an instance of a geometric traits class.} +* \cgalParamType{a class model of `Kernel`.} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1456,16 +1456,16 @@ void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd * -* @return the interpolated corrected mean curvature at the vertex `v` +* @return the interpolated corrected mean curvature at the vertex `v`. * * @see `interpolated_corrected_mean_curvature()` * @see `interpolated_corrected_Gaussian_curvature_one_vertex()` @@ -1493,39 +1493,39 @@ interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected Gaussian curvature at vertex `v` of mesh `pmesh`. * -* @tparam PolygonMesh a model of `FaceListGraph` -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param v the vertex of `pmesh` to compute the Gaussian curvature at +* @param pmesh the polygon mesh. +* @param v the vertex of `pmesh` to compute the Gaussian curvature at. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `GT::Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `GT::Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `GT::Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} -* \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDescription{an instance of a geometric traits class.} +* \cgalParamType{a class model of `Kernel`.} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1533,16 +1533,16 @@ interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * * \cgalNamedParamsEnd * -* @return the interpolated corrected Gaussian curvature at the vertex `v` +* @return the interpolated corrected Gaussian curvature at the vertex `v`. * * @see `interpolated_corrected_Gaussian_curvature()` * @see `interpolated_corrected_mean_curvature_one_vertex()` @@ -1570,39 +1570,39 @@ interpolated_corrected_Gaussian_curvature_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected principal curvatures and directions at vertex `v` of mesh `pmesh`. * -* @tparam PolygonMesh a model of `FaceListGraph` -* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* @tparam PolygonMesh a model of `FaceListGraph`. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * -* @param pmesh the polygon mesh -* @param v the vertex of `pmesh` to compute the principal curvatures and directions at +* @param pmesh the polygon mesh. +* @param v the vertex of `pmesh` to compute the principal curvatures and directions at. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * `GT` stands for the type of the object provided to the named parameter `geom_traits()`. * * \cgalNamedParamsBegin * \cgalParamNBegin{vertex_point_map} -* \cgalParamDescription{a property map associating points to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating points to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `%Point_3` as value type} -* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`} +* as key type and `%Point_3` as value type.} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, pmesh)`.} * \cgalParamExtra{If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`.} * \cgalParamNEnd * * \cgalParamNBegin{vertex_normal_map} -* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`} +* \cgalParamDescription{a property map associating normal vectors to the vertices of `pmesh`.} * \cgalParamType{a class model of `ReadablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` -* as key type and `%Vector_3` as value type} -* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`} +* as key type and `%Vector_3` as value type.} +* \cgalParamDefault{`get(dynamic_vertex_property_t(), pmesh)`.} * \cgalParamExtra{If this parameter is omitted, vertex normals will be -* computed using `compute_vertex_normals()`} +* computed using `compute_vertex_normals()`.} * \cgalParamNEnd * * \cgalParamNBegin{geom_traits} -* \cgalParamDescription{an instance of a geometric traits class} -* \cgalParamType{a class model of `Kernel`} -* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamDescription{an instance of a geometric traits class.} +* \cgalParamType{a class model of `Kernel`.} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`.} * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * @@ -1610,15 +1610,15 @@ interpolated_corrected_Gaussian_curvature_one_vertex(const PolygonMesh& pmesh, * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures * by summing measures of faces inside a ball of this radius centered at the * vertex expanded from. The summed face measures are weighted by their -* inclusion ratio inside this ball} +* inclusion ratio inside this ball.} * \cgalParamType{`GT::FT`} * \cgalParamDefault{`-1`} * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of -* measures on faces around the vertex} +* measures on faces around the vertex.} * \cgalParamNEnd * \cgalNamedParamsEnd * -* @return the interpolated corrected principal curvatures and directions at the vertex `v` +* @return the interpolated corrected principal curvatures and directions at the vertex `v`. * * @see `interpolated_corrected_principal_curvatures_and_directions()` * @see `interpolated_corrected_mean_curvature_one_vertex()` From 2884d8b3cbdd14341d63142d4e96949e3a06be97 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:06:06 +0200 Subject: [PATCH 0142/1398] using is_zero() & is_negative() for FT variables --- .../interpolated_corrected_curvatures.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index a22761691b18..72f7b1b93d07 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -470,8 +470,8 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from // returning principal curvatures and directions (with the correct sign) return Principal_curvatures_and_directions( - (v_mu0 != 0.0) ? -eig_vals[1] / v_mu0 : 0.0, - (v_mu0 != 0.0) ? -eig_vals[0] / v_mu0 : 0.0, + (!is_zero(v_mu0)) ? -eig_vals[1] / v_mu0 : 0.0, + (!is_zero(v_mu0)) ? -eig_vals[0] / v_mu0 : 0.0, min_eig_vec, max_eig_vec ); @@ -591,7 +591,7 @@ Vertex_measures interpolated_corrected_measures_one_vertex( // if it is not 0 (not completely outside), compute measures for selected curvatures (area is always computed) // and add neighboring faces to the bfs queue - if (f_ratio != 0.0) + if (!is_zero(f_ratio)) { vertex_measures.area_measure += f_ratio * interpolated_corrected_area_measure_face(u, x); @@ -669,7 +669,7 @@ template(pmesh) * 1e-6; // determine which curvatures are selected @@ -680,7 +680,7 @@ template vertex_measures; // if the radius is negative, we do not expand the ball (only the incident faces) - if (radius < 0) + if (is_negative(radius)) { vertex_measures = interpolated_corrected_measures_one_vertex_no_radius( pmesh, @@ -708,12 +708,12 @@ template(pmesh) * 1e-6; else ball_radius = radius; @@ -950,7 +950,7 @@ class Interpolated_corrected_curvatures_computer // if the face is inside the ball, add the measures // only add the measures for the selected curvatures (area measure is always added) - if (f_ratio != 0.0) + if (!is_zero(f_ratio)) { vertex_measures.area_measure += f_ratio * get(mu0_map, fi); @@ -986,20 +986,20 @@ class Interpolated_corrected_curvatures_computer for (Vertex_descriptor v : vertices(pmesh)) { // expand the computed measures (on faces) to the vertices - Vertex_measures vertex_measures = (ball_radius < 0) ? + Vertex_measures vertex_measures = (is_negative(ball_radius)) ? expand_interpolated_corrected_measure_vertex_no_radius(v) : expand_interpolated_corrected_measure_vertex(v); // compute the selected curvatures from the expanded measures and store them in the property maps // if the area measure is zero, the curvature is set to zero if (is_mean_curvature_selected) { - vertex_measures.area_measure != 0 ? + !is_zero(vertex_measures.area_measure) ? put(mean_curvature_map, v, 0.5 * vertex_measures.mean_curvature_measure / vertex_measures.area_measure) : put(mean_curvature_map, v, 0); } if (is_Gaussian_curvature_selected) { - vertex_measures.area_measure != 0 ? + !is_zero(vertex_measures.area_measure) ? put(gaussian_curvature_map, v, vertex_measures.gaussian_curvature_measure / vertex_measures.area_measure) : put(gaussian_curvature_map, v, 0); } From 4279a734bfb71821609ee14ea5bf33bcc90831cf Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 27 Mar 2023 19:35:31 +0200 Subject: [PATCH 0143/1398] minor linting changing --- .../interpolated_corrected_curvatures_PH.cpp | 16 ++++------ .../interpolated_corrected_curvatures_SM.cpp | 31 +++++++++---------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp index ecf40b840829..0aa0c196d3f5 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp @@ -31,20 +31,16 @@ int main(int argc, char* argv[]) boost::property_map>::type mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron), Gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); + boost::property_map>>::type - principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); + principal_curvatures_and_directions_map = + get(CGAL::dynamic_vertex_property_t>(), polyhedron); - PMP::interpolated_corrected_mean_curvature( - polyhedron, - mean_curvature_map); + PMP::interpolated_corrected_mean_curvature(polyhedron, mean_curvature_map); - PMP::interpolated_corrected_Gaussian_curvature( - polyhedron, - Gaussian_curvature_map); + PMP::interpolated_corrected_Gaussian_curvature(polyhedron, Gaussian_curvature_map); - PMP::interpolated_corrected_principal_curvatures_and_directions( - polyhedron, - principal_curvatures_and_directions_map); + PMP::interpolated_corrected_principal_curvatures_and_directions(polyhedron, principal_curvatures_and_directions_map); // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp index ab985e5068d0..d75ab14f6984 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp @@ -29,17 +29,23 @@ int main(int argc, char* argv[]) // creating and tying surface mesh property maps for curvatures (with defaults = 0) bool created = false; - Surface_Mesh::Property_map mean_curvature_map, Gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = smesh.add_property_map("v:mean_curvature_map", 0); + Surface_Mesh::Property_map + mean_curvature_map, Gaussian_curvature_map; + + boost::tie(mean_curvature_map, created) = + smesh.add_property_map("v:mean_curvature_map", 0); assert(created); - boost::tie(Gaussian_curvature_map, created) = smesh.add_property_map("v:Gaussian_curvature_map", 0); + boost::tie(Gaussian_curvature_map, created) = + smesh.add_property_map("v:Gaussian_curvature_map", 0); assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> principal_curvatures_and_directions_map; + Surface_Mesh::Property_map> + principal_curvatures_and_directions_map; - boost::tie(principal_curvatures_and_directions_map, created) = smesh.add_property_map> + boost::tie(principal_curvatures_and_directions_map, created) = + smesh.add_property_map> ("v:principal_curvatures_and_directions_map", { 0, 0, Epic_kernel::Vector_3(0,0,0), Epic_kernel::Vector_3(0,0,0) }); @@ -48,20 +54,11 @@ int main(int argc, char* argv[]) // user can call these fucntions to compute a specfic curvature type on each vertex. // (Note: if no ball radius is specified, the measure expansion of each vertex happens by // summing measures on faces adjacent to each vertex.) - PMP::interpolated_corrected_mean_curvature( - smesh, - mean_curvature_map - ); + PMP::interpolated_corrected_mean_curvature(smesh, mean_curvature_map); - PMP::interpolated_corrected_Gaussian_curvature( - smesh, - Gaussian_curvature_map - ); + PMP::interpolated_corrected_Gaussian_curvature(smesh, Gaussian_curvature_map); - PMP::interpolated_corrected_principal_curvatures_and_directions( - smesh, - principal_curvatures_and_directions_map - ); + PMP::interpolated_corrected_principal_curvatures_and_directions(smesh, principal_curvatures_and_directions_map); // uncomment this to compute a curvature while specifying named parameters // Example: an expansion ball radius of 0.5 and a vertex normals map (does not have to depend on positions) From 33c7f5c03aabadea45c0ed1078d38df38455efa2 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 27 Mar 2023 19:37:31 +0200 Subject: [PATCH 0144/1398] traillling spaces --- .../interpolated_corrected_curvatures_PH.cpp | 2 +- .../interpolated_corrected_curvatures_SM.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp index 0aa0c196d3f5..c93de26f26cc 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_PH.cpp @@ -33,7 +33,7 @@ int main(int argc, char* argv[]) Gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), polyhedron); boost::property_map>>::type - principal_curvatures_and_directions_map = + principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), polyhedron); PMP::interpolated_corrected_mean_curvature(polyhedron, mean_curvature_map); diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp index d75ab14f6984..dae2ec0716ec 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/interpolated_corrected_curvatures_SM.cpp @@ -29,22 +29,22 @@ int main(int argc, char* argv[]) // creating and tying surface mesh property maps for curvatures (with defaults = 0) bool created = false; - Surface_Mesh::Property_map + Surface_Mesh::Property_map mean_curvature_map, Gaussian_curvature_map; - boost::tie(mean_curvature_map, created) = + boost::tie(mean_curvature_map, created) = smesh.add_property_map("v:mean_curvature_map", 0); assert(created); - boost::tie(Gaussian_curvature_map, created) = + boost::tie(Gaussian_curvature_map, created) = smesh.add_property_map("v:Gaussian_curvature_map", 0); assert(created); // we use a tuple of 2 scalar values and 2 vectors for principal curvatures and directions - Surface_Mesh::Property_map> + Surface_Mesh::Property_map> principal_curvatures_and_directions_map; - boost::tie(principal_curvatures_and_directions_map, created) = + boost::tie(principal_curvatures_and_directions_map, created) = smesh.add_property_map> ("v:principal_curvatures_and_directions_map", { 0, 0, Epic_kernel::Vector_3(0,0,0), From 796d7cc57d79a06454afac969a329d49a428f6b3 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Fri, 31 Mar 2023 01:55:26 +0200 Subject: [PATCH 0145/1398] handled scale dependency and add tests for it --- .../interpolated_corrected_curvatures.h | 22 ++++-- ...test_interpolated_corrected_curvatures.cpp | 68 ++++++++++++++----- 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 72f7b1b93d07..4b940f157e88 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -436,7 +436,8 @@ template Principal_curvatures_and_directions principal_curvatures_and_directions_from_anisotropic_measures( const std::array anisotropic_measure, const typename GT::FT v_mu0, - const typename GT::Vector_3 u_GT + const typename GT::Vector_3 u_GT, + const typename GT::FT avg_edge_length ) { // putting anisotropic measure in matrix form @@ -448,7 +449,7 @@ Principal_curvatures_and_directions principal_curvatures_and_directions_from // constant factor K to force the principal direction eigenvectors to be tangential to the surface Eigen::Matrix u(u_GT.x(), u_GT.y(), u_GT.z()); - const typename GT::FT K = 1000 * v_mu0; + const typename GT::FT K = 1000 * avg_edge_length * v_mu0; // symmetrizing and adding the constant term v_muXY = 0.5 * (v_muXY + v_muXY.transpose()) + K * u * u.transpose(); @@ -668,9 +669,13 @@ template(pmesh); + // if the radius is 0, we use a small epsilon to expand the ball (scaled with the average edge length) if (is_zero(radius)) - radius = average_edge_length(pmesh) * 1e-6; + radius = avg_edge_length * 1e-6; // determine which curvatures are selected const bool is_mean_curvature_selected = !is_default_parameter::value; @@ -723,7 +728,9 @@ template principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, - v_normal); + v_normal, + avg_edge_length + ); set_value(principal_curvatures_and_directions, get_parameter(np, internal_np::vertex_principal_curvatures_and_directions)); } } @@ -775,6 +782,7 @@ class Interpolated_corrected_curvatures_computer Vertex_position_map vpm; Vertex_normal_map vnm; FT ball_radius; + FT avg_edge_length; bool is_mean_curvature_selected; bool is_Gaussian_curvature_selected; @@ -813,6 +821,7 @@ class Interpolated_corrected_curvatures_computer // if no radius is given, we pass -1 which will make the expansion be only on the incident faces instead of a ball const FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + avg_edge_length = average_edge_length(pmesh); set_ball_radius(radius); // check which curvature maps are provided by the user (determines which curvatures are computed) @@ -828,7 +837,7 @@ class Interpolated_corrected_curvatures_computer void set_ball_radius(const FT radius) { // if given radius is 0, we use a small epsilon to expand the ball (scaled by the average edge length) if (is_zero(radius)) - ball_radius = average_edge_length(pmesh) * 1e-6; + ball_radius = avg_edge_length * 1e-6; else ball_radius = radius; } @@ -1010,7 +1019,8 @@ class Interpolated_corrected_curvatures_computer const Principal_curvatures_and_directions principal_curvatures_and_directions = principal_curvatures_and_directions_from_anisotropic_measures( vertex_measures.anisotropic_measure, vertex_measures.area_measure, - v_normal + v_normal, + avg_edge_length ); put(principal_curvatures_and_directions_map, v, principal_curvatures_and_directions); } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp index c0772ce989bc..2f1af8adb106 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_interpolated_corrected_curvatures.cpp @@ -32,7 +32,7 @@ struct Average_test_info { Epic_kernel::FT principal_curvature_avg, Epic_kernel::FT expansion_radius = -1, Epic_kernel::FT tolerance = 0.9 - ): + ) : expansion_radius(expansion_radius), mean_curvature_avg(mean_curvature_avg), gaussian_curvature_avg(gaussian_curvature_avg), @@ -43,8 +43,7 @@ struct Average_test_info { }; -bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_kernel::FT tolerance) -{ +bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_kernel::FT tolerance) { if (abs(expected) < ABS_ERROR && abs(result) < ABS_ERROR) return true; // expected 0, got 0 else if (abs(expected) < ABS_ERROR) @@ -56,8 +55,10 @@ bool passes_comparison(Epic_kernel::FT result, Epic_kernel::FT expected, Epic_ke template void test_average_curvatures(std::string mesh_path, Average_test_info test_info, - bool compare_single_vertex = false -){ + bool compare_single_vertex = false, + int scale_factor_exponent = 0 +) { + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; PolygonMesh pmesh; const std::string filename = CGAL::data_file_path(mesh_path); @@ -67,14 +68,33 @@ void test_average_curvatures(std::string mesh_path, std::cerr << "Invalid input file." << std::endl; } - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + // The following part is used to scale the given mesh and expected curvatures by a constant factor + // this is used to test the stability of the implementation across different scales + if (scale_factor_exponent) { + Epic_kernel::FT factor = pow(10, scale_factor_exponent); + + test_info.expansion_radius *= factor; + test_info.mean_curvature_avg /= factor; + test_info.gaussian_curvature_avg /= factor * factor; + test_info.principal_curvature_avg /= factor; + + auto vpm = get(CGAL::vertex_point, pmesh); + + for (vertex_descriptor vi : vertices(pmesh)) { + Epic_kernel::Point_3 pi = get(vpm, vi); + Epic_kernel::Point_3 pi_new(pi.x() * factor, pi.y() * factor, pi.z() * factor); + put(vpm, vi, pi_new); + } + } + typename boost::property_map>::type mean_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh), gaussian_curvature_map = get(CGAL::dynamic_vertex_property_t(), pmesh); - typename boost::property_map>>::type - principal_curvatures_and_directions_map = get(CGAL::dynamic_vertex_property_t>(), pmesh); - + typename boost::property_map + >>::type + principal_curvatures_and_directions_map = + get(CGAL::dynamic_vertex_property_t>(), pmesh); // test_info.expansion_radius -> test if no radius is provided by user. if (test_info.expansion_radius < 0) { PMP::interpolated_corrected_mean_curvature(pmesh, mean_curvature_map); @@ -103,8 +123,7 @@ void test_average_curvatures(std::string mesh_path, Epic_kernel::FT mean_curvature_avg = 0, gaussian_curvature_avg = 0, principal_curvature_avg = 0; - for (vertex_descriptor v : vertices(pmesh)) - { + for (vertex_descriptor v : vertices(pmesh)) { mean_curvature_avg += get(mean_curvature_map, v); gaussian_curvature_avg += get(gaussian_curvature_map, v); principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature @@ -131,8 +150,7 @@ void test_average_curvatures(std::string mesh_path, Epic_kernel::FT new_mean_curvature_avg = 0, new_Gaussian_curvature_avg = 0, new_principal_curvature_avg = 0; - for (vertex_descriptor v : vertices(pmesh)) - { + for (vertex_descriptor v : vertices(pmesh)) { new_mean_curvature_avg += get(mean_curvature_map, v); new_Gaussian_curvature_avg += get(gaussian_curvature_map, v); new_principal_curvature_avg += get(principal_curvatures_and_directions_map, v).min_curvature @@ -149,8 +167,7 @@ void test_average_curvatures(std::string mesh_path, assert(passes_comparison(gaussian_curvature_avg, new_Gaussian_curvature_avg, 0.99)); assert(passes_comparison(principal_curvature_avg, new_principal_curvature_avg, 0.99)); - if (compare_single_vertex) - { + if (compare_single_vertex) { // computing curvatures together from interpolated_corrected_curvatures() Epic_kernel::FT single_vertex_mean_curvature_avg = 0, @@ -160,8 +177,7 @@ void test_average_curvatures(std::string mesh_path, Epic_kernel::FT h, g; PMP::Principal_curvatures_and_directions p; - for (vertex_descriptor v : vertices(pmesh)) - { + for (vertex_descriptor v : vertices(pmesh)) { PMP::interpolated_corrected_curvatures_one_vertex( pmesh, v, @@ -193,7 +209,7 @@ int main() // For this mesh, ina addition to the whole mesh functions, we also compare against the single vertex // curvature functions to make sure the produce the same results // Expected: Mean Curvature = 2, Gaussian Curvature = 4, Principal Curvatures = 2 & 2 so 2 on avg. - test_average_curvatures("meshes/sphere.off", Average_test_info(2,4,2), true); + test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2), true); test_average_curvatures("meshes/sphere.off", Average_test_info(2, 4, 2), true); // Same mesh but with specified expansion radii of 0 and 0.25 (half radius of sphere) @@ -218,6 +234,22 @@ int main() test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0)); test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5)); + // Same tests as last one, but with a scaling on the mesh with different values to check for scale stability + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -6); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -6); + + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -3); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -3); + + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, -1); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, -1); + + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 1); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 1); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 3); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 3); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0), false, 6); + test_average_curvatures("meshes/cylinder.off", Average_test_info(0.5, 0, 0.5, 0.5), false, 6); } From a1ff847b6a4ec05ce40e3e24b7d38d8a87fd868e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 08:17:16 +0100 Subject: [PATCH 0146/1398] add "brute-force" version of autorefine() --- .../Polygon_mesh_processing/CMakeLists.txt | 1 + .../triangle_mesh_autorefinement.cpp | 29 + .../Polygon_mesh_processing/autorefinement.h | 507 ++++++++++++++++++ .../internal/parameters_interface.h | 1 + 4 files changed, 538 insertions(+) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/triangle_mesh_autorefinement.cpp create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 192e7d29b745..e188e01e3eb7 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -50,6 +50,7 @@ create_single_source_cgal_program("match_faces.cpp") create_single_source_cgal_program("cc_compatible_orientations.cpp") create_single_source_cgal_program("hausdorff_distance_remeshing_example.cpp") create_single_source_cgal_program("hausdorff_bounded_error_distance_example.cpp") +create_single_source_cgal_program("triangle_mesh_autorefinement.cpp") find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/triangle_mesh_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/triangle_mesh_autorefinement.cpp new file mode 100644 index 000000000000..65db52fef2c9 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/triangle_mesh_autorefinement.cpp @@ -0,0 +1,29 @@ +#include +#include + +#include +#include + +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point; + +typedef CGAL::Surface_mesh Mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char** argv) +{ + Mesh mesh; + + const std::string filename = argc == 1 ? CGAL::data_file_path("meshes/elephant.off") + : std::string(argv[1]); + CGAL::IO::read_polygon_mesh(filename, mesh); + + PMP::autorefine(mesh); + + CGAL::IO::write_polygon_mesh("autorefined.off", mesh, CGAL::parameters::stream_precision(17)); + + return 0; +} diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h new file mode 100644 index 000000000000..8c34b4041d86 --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -0,0 +1,507 @@ +// Copyright (c) 2023 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_POLYGON_MESH_PROCESSING_AUTOREFINEMENT_H +#define CGAL_POLYGON_MESH_PROCESSING_AUTOREFINEMENT_H + +#include + +#include +#include +#include +#include + +// output +#include +#include + +#ifndef NDEBUG +// debug +#include +#endif + +#include + +namespace CGAL { +namespace Polygon_mesh_processing { + +#ifndef DOXYGEN_RUNNING +namespace autorefine_impl { + +template +void generate_subtriangles(const typename EK::Triangle_3& t, + const std::vector& segments, + const std::vector& points, + std::vector& new_triangles) +{ + typedef CGAL::Projection_traits_3 P_traits; + // typedef CGAL::Exact_intersections_tag Itag; + typedef CGAL::No_constraint_intersection_requiring_constructions_tag Itag; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; + + + P_traits cdt_traits(normal(t[0], t[1], t[2])); + CDT cdt(cdt_traits); + + cdt.insert_outside_affine_hull(t[0]); + cdt.insert_outside_affine_hull(t[1]); + typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), false); + v->set_point(t[2]); + + for (const typename EK::Segment_3& s : segments) + cdt.insert_constraint(s[0], s[1]); + + for (const typename EK::Point_3& p : points) + cdt.insert(p); + + for (typename CDT::Face_handle fh : cdt.finite_face_handles()) + { + new_triangles.emplace_back(fh->vertex(0)->point(), + fh->vertex(cdt.ccw(0))->point(), + fh->vertex(cdt.cw(0))->point()); + } +} + +template +struct Intersection_visitor +{ + std::vector& all_segments_1; + std::vector& all_segments_2; + std::vector& all_points_1; + std::vector& all_points_2; + + Intersection_visitor(std::vector& all_segments_1, + std::vector& all_segments_2, + std::vector& all_points_1, + std::vector& all_points_2) + : all_segments_1(all_segments_1) + , all_segments_2(all_segments_2) + , all_points_1(all_points_1) + , all_points_2(all_points_2) + {} + + typedef void result_type; + void operator()(const typename EK::Point_3& p) + { + all_points_1.push_back(p); + all_points_2.push_back(p); + } + + void operator()(const typename EK::Segment_3& s) + { + all_segments_1.push_back(s); + all_segments_2.push_back(s); + } + + void operator()(const typename EK::Triangle_3& t) + { + for (std::size_t i=1; i<3; ++i) + { + typename EK::Segment_3 s(t[i-1], t[i]); + all_segments_1.push_back(s); + all_segments_2.push_back(s); + } + } + + void operator()(const std::vector& poly) + { + std::size_t nbp = poly.size(); + for (std::size_t i=1; i +bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, const std::vector< std::vector>>& triangles) +{ + typedef typename Kernel_traits::value_type>::type IK; + typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::face_descriptor face_descriptor; + typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; + + std::vector soup_points; + std::vector > soup_triangles; + Cartesian_converter to_exact; + std::map point_id_map; + + auto get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); + if (insert_res.second) + soup_points.push_back(pt); + return insert_res.first->second; + }; + + for (face_descriptor f : faces(tm)) + { + int tid = get(tid_map, f); + if (tid == -1) + { + halfedge_descriptor h = halfedge(f, tm); + soup_triangles.emplace_back( + CGAL::make_array(get_point_id(to_exact(get(vpm,source(h, tm)))), + get_point_id(to_exact(get(vpm,target(h, tm)))), + get_point_id(to_exact(get(vpm,target(next(h, tm), tm))))) + ); + } + else + { + for (const typename EK::Triangle_3& t : triangles[tid]) + { + soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + } + } + } + + typedef Surface_mesh Exact_mesh; + Exact_mesh etm; + orient_polygon_soup(soup_points, soup_triangles); + polygon_soup_to_polygon_mesh(soup_points, soup_triangles, etm); + typename Exact_mesh::Property_map is_border_map = + etm.template add_property_map("v:is_border", false).first; + for(typename Exact_mesh::Halfedge_index h : etm.halfedges()) + { + if (CGAL::is_border(h, etm)) + is_border_map[target(h, etm)] = true; + } + + //TODO: double check me + auto skip_faces = [&](const std::pair& p) + { + typename Exact_mesh::Halfedge_index h1 = etm.halfedge(p.first), h2=etm.halfedge(p.second); + + boost::container::small_vector bv1; + if (is_border_map[source(h1, etm)]) bv1.push_back(prev(h1, etm)); + if (is_border_map[target(h1, etm)]) bv1.push_back(h1); + if (is_border_map[target(next(h1, etm), etm)]) bv1.push_back(next(h1, etm)); + if (bv1.empty()) return false; + + boost::container::small_vector bv2; + if (is_border_map[source(h2, etm)]) bv2.push_back(prev(h2, etm)); + if (is_border_map[target(h2, etm)]) bv2.push_back(h2); + if (is_border_map[target(next(h2, etm), etm)]) bv2.push_back(next(h2, etm)); + if (bv2.empty()) return false; + + //collect identical border vertices + boost::container::small_vector, 3> common; + for(typename Exact_mesh::Halfedge_index h1 : bv1) + for(typename Exact_mesh::Halfedge_index h2 : bv2) + if (etm.point(target(h1, etm))==etm.point(target(h2,etm))) + common.push_back(std::make_pair(h1,h2)); + + if (common.empty()) return false; + + switch (common.size()) + { + case 1: + { + // geometric check if the opposite segments intersect the triangles + const typename EK::Triangle_3 t1(etm.point(source(h1,etm)), + etm.point(target(h1,etm)), + etm.point(target(next(h1,etm),etm))); + const typename EK::Triangle_3 t2(etm.point(source(h2,etm)), + etm.point(target(h2,etm)), + etm.point(target(next(h2,etm),etm))); + + const typename EK::Segment_3 s1(etm.point(source(common[0].first,etm)), etm.point(target(next(common[0].first,etm),etm))); + const typename EK::Segment_3 s2(etm.point(source(common[0].second,etm)), etm.point(target(next(common[0].second,etm),etm))); + + if(do_intersect(t1, s2) || do_intersect(t2, s1)) + return false; + return true; + } + case 2: + { + // shared edge + h1 = next(common[0].first, etm) == common[1].first ? common[1].first : common[0].first; + h2 = next(common[0].second, etm) == common[1].second ? common[1].second : common[0].second; + + if ( is_border(etm.opposite(h1), etm) && + is_border(etm.opposite(h2), etm) ) + { + if( CGAL::coplanar(etm.point(source(h1,etm)), + etm.point(target(h1,etm)), + etm.point(target(etm.next(h1),etm)), + etm.point(source(h1,etm))) && + CGAL::coplanar_orientation(etm.point(source(h1,etm)), + etm.point(target(h1,etm)), + etm.point(target(etm.next(h1),etm)), + etm.point(source(h1,etm))) == CGAL::POSITIVE) + { + return false; + } + return true; + } + else + { + // TODO: 2 identical border vertices, no common edge on the boundary. Not sure what to do + return false; + } + } + default: // size == 3 + return true; + } + }; + + std::vector< std::pair > si_faces; + self_intersections(etm, + CGAL::filter_output_iterator(std::back_inserter(si_faces), + skip_faces)); + + return si_faces.empty(); +} + +} // end of autorefine_impl +#endif + +/** + * \ingroup PMP_corefinement_grp + * \link coref_def_subsec autorefines \endlink `tm`. Refines a triangle mesh + * so that no triangles intersects in their interior. + * Self-intersection edges will be marked as constrained. If an edge that was marked as + * constrained is split, its sub-edges will be marked as constrained as well. + * + * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` + * @tparam NamedParameters a sequence of \ref namedparameters + * + * @param tm input triangulated surface mesh + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + * + * \cgalParamNBegin{geom_traits} + * \cgalParamDescription{an instance of a geometric traits class} + * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} + * \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} + * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} + * \cgalParamNEnd + * + * \cgalNamedParamsBegin + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `tm`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` + * must be available in `TriangleMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{edge_is_constrained_map} + * \cgalParamDescription{a property map containing the constrained-or-not status of each edge of `tm`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` + * as key type and `bool` as value type} + * \cgalParamDefault{a constant property map returning `false` for any edge} + * \cgalParamNEnd + * + * \cgalParamNBegin{face_index_map} + * \cgalParamDescription{a property map associating to each face of `tm` a unique index between `0` and `num_faces(tm) - 1`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` + * as key type and `std::size_t` as value type} + * \cgalParamDefault{an automatically indexed internal map} + * \cgalParamExtra{If the property map is writable, the indices of the faces of `tm1` and `tm2` + * will be set after the corefinement is done.} + * \cgalParamNEnd + * + * \cgalParamNBegin{visitor} + * \cgalParamDescription{a visitor used to track the creation of new faces} + * \cgalParamType{a class model of `PMPCorefinementVisitor`} + * \cgalParamDefault{`Corefinement::Default_visitor`} + * \cgalParamNEnd + * \cgalNamedParamsEnd + * + */ +template +void +autorefine( TriangleMesh& tm, + const NamedParameters& np = parameters::default_values()) +{ + //TODO: what about degenerate faces? + + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef typename GetGeomTraits::type GT; + GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + + typedef typename GetVertexPointMap::type VPM; + VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_property_map(vertex_point, tm)); + + typedef typename internal_np::Lookup_named_param_def < + internal_np::concurrency_tag_t, + NamedParameters, + Sequential_tag + > ::type Concurrency_tag; + + typedef boost::graph_traits Graph_traits; + typedef typename Graph_traits::face_descriptor face_descriptor; + typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename Graph_traits::vertex_descriptor vertex_descriptor; + typedef std::pair Pair_of_faces; + + std::vector si_pairs; + + // collect intersecting pairs of triangles + self_intersections(tm, std::back_inserter(si_pairs), np); + + if (si_pairs.empty()) return; + + // assign an id per triangle involved in an intersection + // + the faces involved in the intersection + typedef CGAL::dynamic_face_property_t Face_property_tag; + typedef typename boost::property_map::type Triangle_id_map; + + Triangle_id_map tid_map = get(Face_property_tag(), tm); + for (face_descriptor f : faces(tm)) + put(tid_map, f, -1); + + std::vector intersected_faces; + int tid=-1; + for (const Pair_of_faces& p : si_pairs) + { + if (get(tid_map, p.first)==-1) + { + put(tid_map, p.first, ++tid); + intersected_faces.push_back(p.first); + } + if (get(tid_map, p.second)==-1) + { + put(tid_map, p.second, ++tid); + intersected_faces.push_back(p.second); + } + } + + // init the vector of triangles used for the autorefinement of triangles + typedef CGAL::Exact_predicates_exact_constructions_kernel EK; + std::vector< std::vector > triangles(tid+1); + Cartesian_converter to_exact; + + for(face_descriptor f : intersected_faces) + { + halfedge_descriptor h = halfedge(f, tm); + triangles[get(tid_map, f)].emplace_back( + to_exact( get(vpm, source(h, tm)) ), + to_exact( get(vpm, target(h, tm)) ), + to_exact( get(vpm, target(next(h, tm), tm)) ) ); + } + + typename EK::Intersect_3 intersection = EK().intersect_3_object(); + for (const Pair_of_faces& p : si_pairs) + { + int i1 = get(tid_map, p.first), + i2 = get(tid_map, p.second); + + + std::size_t nbt_1 = triangles[i1].size(), + nbt_2 = triangles[i2].size(); + + std::vector< std::vector > all_segments_1(nbt_1); + std::vector< std::vector > all_segments_2(nbt_2); + std::vector< std::vector > all_points_1(nbt_1); + std::vector< std::vector > all_points_2(nbt_2); + + std::vector t1_subtriangles, t2_subtriangles; + for (std::size_t it1=0; it1 intersection_visitor(all_segments_1[it1], all_segments_2[it2], + all_points_1[it1], all_points_2[it2]); + + boost::apply_visitor(intersection_visitor, *inter); + } + } + } + + // now refine triangles + std::vector new_triangles; + for(std::size_t it1=0; it1(triangles[i1][it1], all_segments_1[it1], all_points_1[it1], new_triangles); + } + triangles[i1].swap(new_triangles); + new_triangles.clear(); + for(std::size_t it2=0; it2(triangles[i2][it2], all_segments_2[it2], all_points_2[it2], new_triangles); + } + triangles[i2].swap(new_triangles); + } + + CGAL_assertion( autorefine_impl::is_output_valid(tm, vpm, tid_map, triangles) ); + + // brute force output: create a soup, orient and to-mesh + // WARNING: there is no reason when using double that identical exact points are identical in double + std::vector soup_points; + std::vector > soup_triangles; + Cartesian_converter to_input; + std::map point_id_map; + + for (vertex_descriptor v : vertices(tm)) + { + if (point_id_map.insert(std::make_pair(to_exact(get(vpm,v)), soup_points.size())).second) + soup_points.push_back(get(vpm,v)); + } + + auto get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); + if (insert_res.second) + soup_points.push_back(to_input(pt)); + return insert_res.first->second; + }; + + for (face_descriptor f : faces(tm)) + { + int tid = get(tid_map, f); + if (tid == -1) + { + halfedge_descriptor h = halfedge(f, tm); + soup_triangles.emplace_back( + CGAL::make_array(get_point_id(to_exact(get(vpm,source(h, tm)))), + get_point_id(to_exact(get(vpm,target(h, tm)))), + get_point_id(to_exact(get(vpm,target(next(h, tm), tm))))) + ); + } + else + { + for (const typename EK::Triangle_3& t : triangles[tid]) + { + soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + } + } + } + clear(tm); + orient_polygon_soup(soup_points, soup_triangles); + polygon_soup_to_polygon_mesh(soup_points, soup_triangles, tm); +} + +} } // end of CGAL::Polygon_mesh_processing + +#endif // CGAL_POLYGON_MESH_PROCESSING_AUTOREFINEMENT_H 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 5c649faa56c7..7d758abc4ee6 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -45,6 +45,7 @@ CGAL_add_named_parameter(implementation_tag_t, implementation_tag, implementatio CGAL_add_named_parameter(prevent_unselection_t, prevent_unselection, prevent_unselection) CGAL_add_named_parameter(verbose_t, verbose, verbose) +CGAL_add_named_parameter(concurrency_tag_t, concurrency_tag, concurrency_tag) // List of named parameters used for IO CGAL_add_named_parameter(vertex_normal_output_iterator_t, vertex_normal_output_iterator, vertex_normal_output_iterator) From b0edd90580ea3044ca3fbfe11086d5413f9338cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 17:21:01 +0100 Subject: [PATCH 0147/1398] add option to directly dump the soup --- .../Polygon_mesh_processing/autorefinement.h | 149 ++++++++++-------- 1 file changed, 84 insertions(+), 65 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 8c34b4041d86..fd124bce8579 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -266,67 +266,12 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, const std::vec } } // end of autorefine_impl -#endif -/** - * \ingroup PMP_corefinement_grp - * \link coref_def_subsec autorefines \endlink `tm`. Refines a triangle mesh - * so that no triangles intersects in their interior. - * Self-intersection edges will be marked as constrained. If an edge that was marked as - * constrained is split, its sub-edges will be marked as constrained as well. - * - * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` - * @tparam NamedParameters a sequence of \ref namedparameters - * - * @param tm input triangulated surface mesh - * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below - * - * \cgalParamNBegin{geom_traits} - * \cgalParamDescription{an instance of a geometric traits class} - * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} - * \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} - * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} - * \cgalParamNEnd - * - * \cgalNamedParamsBegin - * \cgalParamNBegin{vertex_point_map} - * \cgalParamDescription{a property map associating points to the vertices of `tm`} - * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` - * as key type and `%Point_3` as value type} - * \cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`} - * \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` - * must be available in `TriangleMesh`.} - * \cgalParamNEnd - * - * \cgalParamNBegin{edge_is_constrained_map} - * \cgalParamDescription{a property map containing the constrained-or-not status of each edge of `tm`} - * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` - * as key type and `bool` as value type} - * \cgalParamDefault{a constant property map returning `false` for any edge} - * \cgalParamNEnd - * - * \cgalParamNBegin{face_index_map} - * \cgalParamDescription{a property map associating to each face of `tm` a unique index between `0` and `num_faces(tm) - 1`} - * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` - * as key type and `std::size_t` as value type} - * \cgalParamDefault{an automatically indexed internal map} - * \cgalParamExtra{If the property map is writable, the indices of the faces of `tm1` and `tm2` - * will be set after the corefinement is done.} - * \cgalParamNEnd - * - * \cgalParamNBegin{visitor} - * \cgalParamDescription{a visitor used to track the creation of new faces} - * \cgalParamType{a class model of `PMPCorefinementVisitor`} - * \cgalParamDefault{`Corefinement::Default_visitor`} - * \cgalParamNEnd - * \cgalNamedParamsEnd - * - */ -template -void -autorefine( TriangleMesh& tm, - const NamedParameters& np = parameters::default_values()) +template +void autorefine_soup_output(const TriangleMesh& tm, + std::vector& soup_points, + std::vector >& soup_triangles, + const NamedParameters& np = parameters::default_values()) { //TODO: what about degenerate faces? @@ -336,9 +281,9 @@ autorefine( TriangleMesh& tm, typedef typename GetGeomTraits::type GT; GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - typedef typename GetVertexPointMap::type VPM; + typedef typename GetVertexPointMap::const_type VPM; VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), - get_property_map(vertex_point, tm)); + get_const_property_map(vertex_point, tm)); typedef typename internal_np::Lookup_named_param_def < internal_np::concurrency_tag_t, @@ -362,7 +307,7 @@ autorefine( TriangleMesh& tm, // assign an id per triangle involved in an intersection // + the faces involved in the intersection typedef CGAL::dynamic_face_property_t Face_property_tag; - typedef typename boost::property_map::type Triangle_id_map; + typedef typename boost::property_map::const_type Triangle_id_map; Triangle_id_map tid_map = get(Face_property_tag(), tm); for (face_descriptor f : faces(tm)) @@ -458,8 +403,6 @@ autorefine( TriangleMesh& tm, // brute force output: create a soup, orient and to-mesh // WARNING: there is no reason when using double that identical exact points are identical in double - std::vector soup_points; - std::vector > soup_triangles; Cartesian_converter to_input; std::map point_id_map; @@ -497,11 +440,87 @@ autorefine( TriangleMesh& tm, } } } + +} +#endif + +/** + * \ingroup PMP_corefinement_grp + * \link coref_def_subsec autorefines \endlink `tm`. Refines a triangle mesh + * so that no triangles intersects in their interior. + * Self-intersection edges will be marked as constrained. If an edge that was marked as + * constrained is split, its sub-edges will be marked as constrained as well. + * + * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` + * @tparam NamedParameters a sequence of \ref namedparameters + * + * @param tm input triangulated surface mesh + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + * + * \cgalParamNBegin{geom_traits} + * \cgalParamDescription{an instance of a geometric traits class} + * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} + * \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} + * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} + * \cgalParamNEnd + * + * \cgalNamedParamsBegin + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `tm`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` + * must be available in `TriangleMesh`.} + * \cgalParamNEnd + * + * \cgalParamNBegin{edge_is_constrained_map} + * \cgalParamDescription{a property map containing the constrained-or-not status of each edge of `tm`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` + * as key type and `bool` as value type} + * \cgalParamDefault{a constant property map returning `false` for any edge} + * \cgalParamNEnd + * + * \cgalParamNBegin{face_index_map} + * \cgalParamDescription{a property map associating to each face of `tm` a unique index between `0` and `num_faces(tm) - 1`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` + * as key type and `std::size_t` as value type} + * \cgalParamDefault{an automatically indexed internal map} + * \cgalParamExtra{If the property map is writable, the indices of the faces of `tm1` and `tm2` + * will be set after the corefinement is done.} + * \cgalParamNEnd + * + * \cgalParamNBegin{visitor} + * \cgalParamDescription{a visitor used to track the creation of new faces} + * \cgalParamType{a class model of `PMPCorefinementVisitor`} + * \cgalParamDefault{`Corefinement::Default_visitor`} + * \cgalParamNEnd + * \cgalNamedParamsEnd + * + */ +template +void +autorefine( TriangleMesh& tm, + const NamedParameters& np = parameters::default_values()) +{ + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef typename GetGeomTraits::type GT; + GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + + std::vector soup_points; + std::vector > soup_triangles; + + autorefine_soup_output(tm, soup_points, soup_triangles, np); + clear(tm); orient_polygon_soup(soup_points, soup_triangles); polygon_soup_to_polygon_mesh(soup_points, soup_triangles, tm); } + } } // end of CGAL::Polygon_mesh_processing #endif // CGAL_POLYGON_MESH_PROCESSING_AUTOREFINEMENT_H From 47ac016af779ab6a987ee16c62bbf723bd4c182f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 17:32:35 +0100 Subject: [PATCH 0148/1398] skip degenerate faces --- .../Polygon_mesh_processing/autorefinement.h | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index fd124bce8579..4b7020b5615b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -125,8 +126,8 @@ struct Intersection_visitor } }; -template -bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, const std::vector< std::vector>>& triangles) +template +bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map is_degen, const std::vector< std::vector>>& triangles) { typedef typename Kernel_traits::value_type>::type IK; typedef boost::graph_traits Graph_traits; @@ -148,6 +149,7 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, const std::vec for (face_descriptor f : faces(tm)) { + if (get(is_degen, f)) continue; // skip degenerate faces int tid = get(tid_map, f); if (tid == -1) { @@ -273,8 +275,6 @@ void autorefine_soup_output(const TriangleMesh& tm, std::vector >& soup_triangles, const NamedParameters& np = parameters::default_values()) { - //TODO: what about degenerate faces? - using parameters::choose_parameter; using parameters::get_parameter; @@ -304,12 +304,20 @@ void autorefine_soup_output(const TriangleMesh& tm, if (si_pairs.empty()) return; + // mark degenerate faces so that we can ignore them + typedef CGAL::dynamic_face_property_t Degen_property_tag; + typedef typename boost::property_map::const_type Is_degen_map; + Is_degen_map is_degen = get(Degen_property_tag(), tm); + + for(face_descriptor f : faces(tm)) + put(is_degen, f, is_degenerate_triangle_face(f, tm, np)); + // assign an id per triangle involved in an intersection // + the faces involved in the intersection - typedef CGAL::dynamic_face_property_t Face_property_tag; - typedef typename boost::property_map::const_type Triangle_id_map; + typedef CGAL::dynamic_face_property_t TID_property_tag; + typedef typename boost::property_map::const_type Triangle_id_map; - Triangle_id_map tid_map = get(Face_property_tag(), tm); + Triangle_id_map tid_map = get(TID_property_tag(), tm); for (face_descriptor f : faces(tm)) put(tid_map, f, -1); @@ -317,12 +325,12 @@ void autorefine_soup_output(const TriangleMesh& tm, int tid=-1; for (const Pair_of_faces& p : si_pairs) { - if (get(tid_map, p.first)==-1) + if (get(tid_map, p.first)==-1 && !get(is_degen, p.first)) { put(tid_map, p.first, ++tid); intersected_faces.push_back(p.first); } - if (get(tid_map, p.second)==-1) + if (get(tid_map, p.second)==-1 && !get(is_degen, p.second)) { put(tid_map, p.second, ++tid); intersected_faces.push_back(p.second); @@ -349,6 +357,7 @@ void autorefine_soup_output(const TriangleMesh& tm, int i1 = get(tid_map, p.first), i2 = get(tid_map, p.second); + if (i1==-1 || i2==-1) continue; //skip degenerate faces std::size_t nbt_1 = triangles[i1].size(), nbt_2 = triangles[i2].size(); @@ -399,7 +408,7 @@ void autorefine_soup_output(const TriangleMesh& tm, triangles[i2].swap(new_triangles); } - CGAL_assertion( autorefine_impl::is_output_valid(tm, vpm, tid_map, triangles) ); + CGAL_assertion( autorefine_impl::is_output_valid(tm, vpm, tid_map, is_degen, triangles) ); // brute force output: create a soup, orient and to-mesh // WARNING: there is no reason when using double that identical exact points are identical in double @@ -422,6 +431,8 @@ void autorefine_soup_output(const TriangleMesh& tm, for (face_descriptor f : faces(tm)) { + if (get(is_degen, f)) continue; //skip degenerate faces + int tid = get(tid_map, f); if (tid == -1) { @@ -440,7 +451,6 @@ void autorefine_soup_output(const TriangleMesh& tm, } } } - } #endif From 6df9926f9b6ea6553be1fbcfd1c0996e76b802f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 17:47:04 +0100 Subject: [PATCH 0149/1398] add another example with soup as input --- .../Polygon_mesh_processing/CMakeLists.txt | 1 + .../soup_autorefinement.cpp | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index e188e01e3eb7..d2faeb70cb28 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -51,6 +51,7 @@ create_single_source_cgal_program("cc_compatible_orientations.cpp") create_single_source_cgal_program("hausdorff_distance_remeshing_example.cpp") create_single_source_cgal_program("hausdorff_bounded_error_distance_example.cpp") create_single_source_cgal_program("triangle_mesh_autorefinement.cpp") +create_single_source_cgal_program("soup_autorefinement.cpp") find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) include(CGAL_Eigen3_support) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp new file mode 100644 index 000000000000..fa1f5d686907 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -0,0 +1,39 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; +typedef Kernel::Point_3 Point; + +typedef CGAL::Surface_mesh Mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char** argv) +{ + const std::string filename = argc == 1 ? CGAL::data_file_path("meshes/elephant.off") + : std::string(argv[1]); + + std::vector input_points; + std::vector > input_triangles; + + CGAL::IO::read_polygon_soup(filename, input_points, input_triangles); + PMP::repair_polygon_soup(input_points, input_triangles); + + Mesh mesh; + PMP::orient_polygon_soup(input_points, input_triangles); + PMP::polygon_soup_to_polygon_mesh(input_points, input_triangles, mesh); + + PMP::autorefine(mesh); + + CGAL::IO::write_polygon_mesh("autorefined.off", mesh, CGAL::parameters::stream_precision(17)); + + return 0; +} From e1414de8d935cc5da43682c48b5419823b806c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 18:09:26 +0100 Subject: [PATCH 0150/1398] add debug --- .../Polygon_mesh_processing/autorefinement.h | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 4b7020b5615b..8dd8d28fcfcc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -181,6 +181,17 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i is_border_map[target(h, etm)] = true; } +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + std::cerr << std::setprecision(17); + auto verbose_fail_msg = [&](int i, const std::pair& p) + { + typename Exact_mesh::Halfedge_index h1 = halfedge(p.first, etm), h2 = halfedge(p.second, etm); + std::cerr << "DEBUG: failing at check #" << i << "\n"; + std::cerr << "DEBUG: " << etm.point(source(h1, etm)) << " " << etm.point(target(h1, etm)) << " " << etm.point(target(next(h1, etm), etm)) << " " << etm.point(source(h1, etm)) << "\n"; + std::cerr << "DEBUG: " << etm.point(source(h2, etm)) << " " << etm.point(target(h2, etm)) << " " << etm.point(target(next(h2, etm), etm)) << " " << etm.point(source(h2, etm)) << "\n"; + }; +#endif + //TODO: double check me auto skip_faces = [&](const std::pair& p) { @@ -190,13 +201,25 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i if (is_border_map[source(h1, etm)]) bv1.push_back(prev(h1, etm)); if (is_border_map[target(h1, etm)]) bv1.push_back(h1); if (is_border_map[target(next(h1, etm), etm)]) bv1.push_back(next(h1, etm)); - if (bv1.empty()) return false; + if (bv1.empty()) + { +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(1, p); +#endif + return false; + } boost::container::small_vector bv2; if (is_border_map[source(h2, etm)]) bv2.push_back(prev(h2, etm)); if (is_border_map[target(h2, etm)]) bv2.push_back(h2); if (is_border_map[target(next(h2, etm), etm)]) bv2.push_back(next(h2, etm)); - if (bv2.empty()) return false; + if (bv2.empty()) + { +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(2, p); +#endif + return false; + } //collect identical border vertices boost::container::small_vector, 3> common; @@ -205,7 +228,13 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i if (etm.point(target(h1, etm))==etm.point(target(h2,etm))) common.push_back(std::make_pair(h1,h2)); - if (common.empty()) return false; + if (common.empty()) + { +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(3, p); +#endif + return false; + } switch (common.size()) { @@ -223,7 +252,12 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i const typename EK::Segment_3 s2(etm.point(source(common[0].second,etm)), etm.point(target(next(common[0].second,etm),etm))); if(do_intersect(t1, s2) || do_intersect(t2, s1)) + { +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(4, p); +#endif return false; + } return true; } case 2: @@ -244,6 +278,9 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i etm.point(target(etm.next(h1),etm)), etm.point(source(h1,etm))) == CGAL::POSITIVE) { +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(5, p); +#endif return false; } return true; @@ -251,6 +288,9 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i else { // TODO: 2 identical border vertices, no common edge on the boundary. Not sure what to do +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + verbose_fail_msg(6, p); +#endif return false; } } From 85368c43c6258e67aca26af6985fb57884642901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 19:38:10 +0100 Subject: [PATCH 0151/1398] use all vertices in the check --- .../Polygon_mesh_processing/autorefinement.h | 79 ++++++------------- 1 file changed, 23 insertions(+), 56 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 8dd8d28fcfcc..fd5e7312c263 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -173,13 +173,6 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i Exact_mesh etm; orient_polygon_soup(soup_points, soup_triangles); polygon_soup_to_polygon_mesh(soup_points, soup_triangles, etm); - typename Exact_mesh::Property_map is_border_map = - etm.template add_property_map("v:is_border", false).first; - for(typename Exact_mesh::Halfedge_index h : etm.halfedges()) - { - if (CGAL::is_border(h, etm)) - is_border_map[target(h, etm)] = true; - } #ifdef CGAL_DEBUG_PMP_AUTOREFINE std::cerr << std::setprecision(17); @@ -197,41 +190,27 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i { typename Exact_mesh::Halfedge_index h1 = etm.halfedge(p.first), h2=etm.halfedge(p.second); - boost::container::small_vector bv1; - if (is_border_map[source(h1, etm)]) bv1.push_back(prev(h1, etm)); - if (is_border_map[target(h1, etm)]) bv1.push_back(h1); - if (is_border_map[target(next(h1, etm), etm)]) bv1.push_back(next(h1, etm)); - if (bv1.empty()) - { -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(1, p); -#endif - return false; - } + boost::container::small_vector v1; + v1.push_back(prev(h1, etm)); + v1.push_back(h1); + v1.push_back(next(h1, etm)); - boost::container::small_vector bv2; - if (is_border_map[source(h2, etm)]) bv2.push_back(prev(h2, etm)); - if (is_border_map[target(h2, etm)]) bv2.push_back(h2); - if (is_border_map[target(next(h2, etm), etm)]) bv2.push_back(next(h2, etm)); - if (bv2.empty()) - { -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(2, p); -#endif - return false; - } + boost::container::small_vector v2; + v2.push_back(prev(h2, etm)); + v2.push_back(h2); + v2.push_back(next(h2, etm)); - //collect identical border vertices + //collect identical vertices boost::container::small_vector, 3> common; - for(typename Exact_mesh::Halfedge_index h1 : bv1) - for(typename Exact_mesh::Halfedge_index h2 : bv2) + for(typename Exact_mesh::Halfedge_index h1 : v1) + for(typename Exact_mesh::Halfedge_index h2 : v2) if (etm.point(target(h1, etm))==etm.point(target(h2,etm))) common.push_back(std::make_pair(h1,h2)); if (common.empty()) { #ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(3, p); + verbose_fail_msg(1, p); #endif return false; } @@ -254,7 +233,7 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i if(do_intersect(t1, s2) || do_intersect(t2, s1)) { #ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(4, p); + verbose_fail_msg(2, p); #endif return false; } @@ -266,33 +245,21 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i h1 = next(common[0].first, etm) == common[1].first ? common[1].first : common[0].first; h2 = next(common[0].second, etm) == common[1].second ? common[1].second : common[0].second; - if ( is_border(etm.opposite(h1), etm) && - is_border(etm.opposite(h2), etm) ) + if( CGAL::coplanar(etm.point(source(h1,etm)), + etm.point(target(h1,etm)), + etm.point(target(etm.next(h1),etm)), + etm.point(source(h1,etm))) && + CGAL::coplanar_orientation(etm.point(source(h1,etm)), + etm.point(target(h1,etm)), + etm.point(target(etm.next(h1),etm)), + etm.point(source(h1,etm))) == CGAL::POSITIVE) { - if( CGAL::coplanar(etm.point(source(h1,etm)), - etm.point(target(h1,etm)), - etm.point(target(etm.next(h1),etm)), - etm.point(source(h1,etm))) && - CGAL::coplanar_orientation(etm.point(source(h1,etm)), - etm.point(target(h1,etm)), - etm.point(target(etm.next(h1),etm)), - etm.point(source(h1,etm))) == CGAL::POSITIVE) - { #ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(5, p); -#endif - return false; - } - return true; - } - else - { - // TODO: 2 identical border vertices, no common edge on the boundary. Not sure what to do -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(6, p); + verbose_fail_msg(3, p); #endif return false; } + return true; } default: // size == 3 return true; From 944475f169213f38a04637480f0be7aaa080b98c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 2 Jan 2023 19:38:38 +0100 Subject: [PATCH 0152/1398] triangulate input faces --- .../examples/Polygon_mesh_processing/soup_autorefinement.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index fa1f5d686907..8ca983aa31c3 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ int main(int argc, char** argv) Mesh mesh; PMP::orient_polygon_soup(input_points, input_triangles); PMP::polygon_soup_to_polygon_mesh(input_points, input_triangles, mesh); + PMP::triangulate_faces(mesh); PMP::autorefine(mesh); From 2b77fcd094859cd07853b1ae02434b05d5a277a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Jan 2023 18:22:14 +0100 Subject: [PATCH 0153/1398] faster implementation + fix intersection segments + check --- .../Polygon_mesh_processing/autorefinement.h | 246 ++++++++++-------- 1 file changed, 133 insertions(+), 113 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index fd5e7312c263..01188d4d6b14 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -26,7 +27,7 @@ #include #include -#ifndef NDEBUG +#ifdef CGAL_DEBUG_PMP_AUTOREFINE // debug #include #endif @@ -46,12 +47,42 @@ void generate_subtriangles(const typename EK::Triangle_3& t, std::vector& new_triangles) { typedef CGAL::Projection_traits_3 P_traits; - // typedef CGAL::Exact_intersections_tag Itag; - typedef CGAL::No_constraint_intersection_requiring_constructions_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; - - - P_traits cdt_traits(normal(t[0], t[1], t[2])); + typedef CGAL::Exact_intersections_tag Itag; + //typedef CGAL::No_constraint_intersection_requiring_constructions_tag Itag; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_base; + typedef CGAL::Constrained_triangulation_plus_2 CDT; + + typename EK::Vector_3 n = normal(t[0], t[1], t[2]); + //~ bool orientation_flipped = false; + //~ if (n.x() < 0) + //~ { + //~ orientation_flipped = true; + //~ n = -n; + //~ } + //~ else + //~ { + //~ if (n.x()==0) + //~ { + //~ if (n.y() < 0) + //~ { + //~ orientation_flipped = true; + //~ n = -n; + //~ } + //~ else + //~ { + //~ if (n.y()==0) + //~ { + //~ if (n.z() < 0) + //~ { + //~ orientation_flipped = true; + //~ n = -n; + //~ } + //~ } + //~ } + //~ } + //~ } + + P_traits cdt_traits(n); CDT cdt(cdt_traits); cdt.insert_outside_affine_hull(t[0]); @@ -65,12 +96,41 @@ void generate_subtriangles(const typename EK::Triangle_3& t, for (const typename EK::Point_3& p : points) cdt.insert(p); - for (typename CDT::Face_handle fh : cdt.finite_face_handles()) - { - new_triangles.emplace_back(fh->vertex(0)->point(), - fh->vertex(cdt.ccw(0))->point(), - fh->vertex(cdt.cw(0))->point()); - } + //~ if (orientation_flipped) + //~ for (typename CDT::Face_handle fh : cdt.finite_face_handles()) + //~ { + //~ new_triangles.emplace_back(fh->vertex(0)->point(), + //~ fh->vertex(cdt.cw(0))->point(), + //~ fh->vertex(cdt.ccw(0))->point()); + //~ } + //~ else +#ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS + static int k = 0; + std::stringstream buffer; + buffer.precision(17); + int nbt=0; +#endif + for (typename CDT::Face_handle fh : cdt.finite_face_handles()) + { + new_triangles.emplace_back(fh->vertex(0)->point(), + fh->vertex(cdt.ccw(0))->point(), + fh->vertex(cdt.cw(0))->point()); +#ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS + ++nbt; + buffer << fh->vertex(0)->point() << "\n"; + buffer << fh->vertex(cdt.ccw(0))->point() << "\n"; + buffer << fh->vertex(cdt.cw(0))->point() << "\n"; +#endif + } + +#ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS + std::ofstream dump("triangulation_"+std::to_string(k)+".off"); + dump << "OFF\n" << 3*nbt << " " << nbt << " 0\n"; + dump << buffer.str(); + for (int i=0; i @@ -106,69 +166,31 @@ struct Intersection_visitor void operator()(const typename EK::Triangle_3& t) { - for (std::size_t i=1; i<3; ++i) + for (std::size_t i=0; i<3; ++i) { - typename EK::Segment_3 s(t[i-1], t[i]); + typename EK::Segment_3 s(t[i], t[(i+1)%3]); all_segments_1.push_back(s); all_segments_2.push_back(s); } + } void operator()(const std::vector& poly) { std::size_t nbp = poly.size(); - for (std::size_t i=1; i -bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map is_degen, const std::vector< std::vector>>& triangles) +template +bool is_output_valid(std::vector> soup_points, + std::vector > soup_triangles) { - typedef typename Kernel_traits::value_type>::type IK; - typedef boost::graph_traits Graph_traits; - typedef typename Graph_traits::face_descriptor face_descriptor; - typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; - - std::vector soup_points; - std::vector > soup_triangles; - Cartesian_converter to_exact; - std::map point_id_map; - - auto get_point_id = [&](const typename EK::Point_3& pt) - { - auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); - if (insert_res.second) - soup_points.push_back(pt); - return insert_res.first->second; - }; - - for (face_descriptor f : faces(tm)) - { - if (get(is_degen, f)) continue; // skip degenerate faces - int tid = get(tid_map, f); - if (tid == -1) - { - halfedge_descriptor h = halfedge(f, tm); - soup_triangles.emplace_back( - CGAL::make_array(get_point_id(to_exact(get(vpm,source(h, tm)))), - get_point_id(to_exact(get(vpm,target(h, tm)))), - get_point_id(to_exact(get(vpm,target(next(h, tm), tm))))) - ); - } - else - { - for (const typename EK::Triangle_3& t : triangles[tid]) - { - soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); - } - } - } - typedef Surface_mesh Exact_mesh; Exact_mesh etm; orient_polygon_soup(soup_points, soup_triangles); @@ -248,11 +270,11 @@ bool is_output_valid(TriangleMesh& tm , VPM vpm, TID_Map tid_map, Is_degen_map i if( CGAL::coplanar(etm.point(source(h1,etm)), etm.point(target(h1,etm)), etm.point(target(etm.next(h1),etm)), - etm.point(source(h1,etm))) && + etm.point(target(etm.next(h2),etm))) && CGAL::coplanar_orientation(etm.point(source(h1,etm)), etm.point(target(h1,etm)), etm.point(target(etm.next(h1),etm)), - etm.point(source(h1,etm))) == CGAL::POSITIVE) + etm.point(target(etm.next(h2),etm))) == CGAL::POSITIVE) { #ifdef CGAL_DEBUG_PMP_AUTOREFINE verbose_fail_msg(3, p); @@ -346,18 +368,22 @@ void autorefine_soup_output(const TriangleMesh& tm, // init the vector of triangles used for the autorefinement of triangles typedef CGAL::Exact_predicates_exact_constructions_kernel EK; - std::vector< std::vector > triangles(tid+1); + std::vector< EK::Triangle_3 > triangles(tid+1); Cartesian_converter to_exact; for(face_descriptor f : intersected_faces) { halfedge_descriptor h = halfedge(f, tm); - triangles[get(tid_map, f)].emplace_back( + triangles[get(tid_map, f)]= EK::Triangle_3( to_exact( get(vpm, source(h, tm)) ), to_exact( get(vpm, target(h, tm)) ), to_exact( get(vpm, target(next(h, tm), tm)) ) ); } + std::vector< std::vector > all_segments(triangles.size()); + std::vector< std::vector > all_points(triangles.size()); + + typename EK::Intersect_3 intersection = EK().intersect_3_object(); for (const Pair_of_faces& p : si_pairs) { @@ -366,73 +392,59 @@ void autorefine_soup_output(const TriangleMesh& tm, if (i1==-1 || i2==-1) continue; //skip degenerate faces - std::size_t nbt_1 = triangles[i1].size(), - nbt_2 = triangles[i2].size(); + const EK::Triangle_3& t1 = triangles[i1]; + const EK::Triangle_3& t2 = triangles[i2]; - std::vector< std::vector > all_segments_1(nbt_1); - std::vector< std::vector > all_segments_2(nbt_2); - std::vector< std::vector > all_points_1(nbt_1); - std::vector< std::vector > all_points_2(nbt_2); + auto inter = intersection(t1, t2); - std::vector t1_subtriangles, t2_subtriangles; - for (std::size_t it1=0; it1 intersection_visitor(all_segments_1[it1], all_segments_2[it2], - all_points_1[it1], all_points_2[it2]); + autorefine_impl::Intersection_visitor intersection_visitor(all_segments[i1], all_segments[i2], + all_points[i1], all_points[i2]); - boost::apply_visitor(intersection_visitor, *inter); - } - } + boost::apply_visitor(intersection_visitor, *inter); } + } - // now refine triangles - std::vector new_triangles; - for(std::size_t it1=0; it1(triangles[i1][it1], all_segments_1[it1], all_points_1[it1], new_triangles); - } - triangles[i1].swap(new_triangles); - new_triangles.clear(); - for(std::size_t it2=0; it2(triangles[i2][it2], all_segments_2[it2], all_points_2[it2], new_triangles); - } - triangles[i2].swap(new_triangles); + // now refine triangles + std::vector new_triangles; + for(std::size_t ti=0; ti(triangles[ti], all_segments[ti], all_points[ti], new_triangles); } - CGAL_assertion( autorefine_impl::is_output_valid(tm, vpm, tid_map, is_degen, triangles) ); // brute force output: create a soup, orient and to-mesh - // WARNING: there is no reason when using double that identical exact points are identical in double Cartesian_converter to_input; std::map point_id_map; +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + std::vector exact_soup_points; +#endif for (vertex_descriptor v : vertices(tm)) { if (point_id_map.insert(std::make_pair(to_exact(get(vpm,v)), soup_points.size())).second) + { soup_points.push_back(get(vpm,v)); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.push_back(to_exact(get(vpm,v))); +#endif + } } auto get_point_id = [&](const typename EK::Point_3& pt) { auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); if (insert_res.second) + { soup_points.push_back(to_input(pt)); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.push_back(pt); +#endif + } return insert_res.first->second; }; @@ -450,14 +462,22 @@ void autorefine_soup_output(const TriangleMesh& tm, get_point_id(to_exact(get(vpm,target(next(h, tm), tm))))) ); } - else - { - for (const typename EK::Triangle_3& t : triangles[tid]) - { - soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); - } - } } + for (const typename EK::Triangle_3& t : new_triangles) + { + soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + } + + +#ifndef CGAL_NDEBUG + CGAL_assertion( autorefine_impl::is_output_valid(exact_soup_points, soup_triangles) ); +#endif + +#ifdef CGAL_DEBUG_PMP_AUTOREFINE + autorefine_impl::is_output_valid(exact_soup_points, soup_triangles); + throw std::runtime_error("invalid output"); +#endif + } #endif From d92d37c476c40e909db3b8a27b20e3968c4e1f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Jan 2023 18:44:52 +0100 Subject: [PATCH 0154/1398] fix condition --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 01188d4d6b14..d18826fc2f1e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -474,7 +474,7 @@ void autorefine_soup_output(const TriangleMesh& tm, #endif #ifdef CGAL_DEBUG_PMP_AUTOREFINE - autorefine_impl::is_output_valid(exact_soup_points, soup_triangles); + if (!autorefine_impl::is_output_valid(exact_soup_points, soup_triangles)) throw std::runtime_error("invalid output"); #endif From 34e8d7ee420489459d88a90a83a277cc9e071caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 4 Jan 2023 16:51:55 +0100 Subject: [PATCH 0155/1398] disable CDT+ that is slower and add debug --- .../Polygon_mesh_processing/autorefinement.h | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index d18826fc2f1e..3ec807450421 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -32,6 +32,10 @@ #include #endif +#ifndef CGAL_PMP_AUTOREFINE_VERBOSE +#define CGAL_PMP_AUTOREFINE_VERBOSE(MSG) +#endif + #include namespace CGAL { @@ -49,8 +53,12 @@ void generate_subtriangles(const typename EK::Triangle_3& t, typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; //typedef CGAL::No_constraint_intersection_requiring_constructions_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_base; - typedef CGAL::Constrained_triangulation_plus_2 CDT; + + + //typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_base; + //typedef CGAL::Constrained_triangulation_plus_2 CDT; + + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; typename EK::Vector_3 n = normal(t[0], t[1], t[2]); //~ bool orientation_flipped = false; @@ -329,6 +337,7 @@ void autorefine_soup_output(const TriangleMesh& tm, std::vector si_pairs; // collect intersecting pairs of triangles + CGAL_PMP_AUTOREFINE_VERBOSE("collect intersecting pairs"); self_intersections(tm, std::back_inserter(si_pairs), np); if (si_pairs.empty()) return; @@ -384,6 +393,7 @@ void autorefine_soup_output(const TriangleMesh& tm, std::vector< std::vector > all_points(triangles.size()); + CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); typename EK::Intersect_3 intersection = EK().intersect_3_object(); for (const Pair_of_faces& p : si_pairs) { @@ -406,6 +416,7 @@ void autorefine_soup_output(const TriangleMesh& tm, } } + CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles std::vector new_triangles; for(std::size_t ti=0; ti to_input; std::map point_id_map; #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) @@ -468,16 +480,17 @@ void autorefine_soup_output(const TriangleMesh& tm, soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); } - #ifndef CGAL_NDEBUG + CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); CGAL_assertion( autorefine_impl::is_output_valid(exact_soup_points, soup_triangles) ); #endif #ifdef CGAL_DEBUG_PMP_AUTOREFINE + CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); if (!autorefine_impl::is_output_valid(exact_soup_points, soup_triangles)) throw std::runtime_error("invalid output"); #endif - + CGAL_PMP_AUTOREFINE_VERBOSE("done"); } #endif From e94c7be4aa72ca2b481e15265ec30f5bad92abec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 5 Jan 2023 08:44:32 +0100 Subject: [PATCH 0156/1398] update doc + TODOs --- .../Polygon_mesh_processing/autorefinement.h | 31 +++---------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 3ec807450421..0711ad71e21c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1,3 +1,5 @@ +//TODO: add for soup face the id of the input face. not sure it is easy to report intersection edge as a pair of vertex id + // Copyright (c) 2023 GeometryFactory (France). // All rights reserved. // @@ -347,6 +349,7 @@ void autorefine_soup_output(const TriangleMesh& tm, typedef typename boost::property_map::const_type Is_degen_map; Is_degen_map is_degen = get(Degen_property_tag(), tm); +// TODO: we already have this test in bbox inter when it report (f,f) for(face_descriptor f : faces(tm)) put(is_degen, f, is_degenerate_triangle_face(f, tm, np)); @@ -496,10 +499,7 @@ void autorefine_soup_output(const TriangleMesh& tm, /** * \ingroup PMP_corefinement_grp - * \link coref_def_subsec autorefines \endlink `tm`. Refines a triangle mesh - * so that no triangles intersects in their interior. - * Self-intersection edges will be marked as constrained. If an edge that was marked as - * constrained is split, its sub-edges will be marked as constrained as well. + * refines a triangle mesh so that no triangles intersects in their interior. * * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` * @tparam NamedParameters a sequence of \ref namedparameters @@ -524,29 +524,6 @@ void autorefine_soup_output(const TriangleMesh& tm, * must be available in `TriangleMesh`.} * \cgalParamNEnd * - * \cgalParamNBegin{edge_is_constrained_map} - * \cgalParamDescription{a property map containing the constrained-or-not status of each edge of `tm`} - * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` - * as key type and `bool` as value type} - * \cgalParamDefault{a constant property map returning `false` for any edge} - * \cgalParamNEnd - * - * \cgalParamNBegin{face_index_map} - * \cgalParamDescription{a property map associating to each face of `tm` a unique index between `0` and `num_faces(tm) - 1`} - * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%face_descriptor` - * as key type and `std::size_t` as value type} - * \cgalParamDefault{an automatically indexed internal map} - * \cgalParamExtra{If the property map is writable, the indices of the faces of `tm1` and `tm2` - * will be set after the corefinement is done.} - * \cgalParamNEnd - * - * \cgalParamNBegin{visitor} - * \cgalParamDescription{a visitor used to track the creation of new faces} - * \cgalParamType{a class model of `PMPCorefinementVisitor`} - * \cgalParamDefault{`Corefinement::Default_visitor`} - * \cgalParamNEnd - * \cgalNamedParamsEnd - * */ template From 370d9134a08db1f422e6038dfa7e94ea695efea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Jan 2023 17:59:56 +0100 Subject: [PATCH 0157/1398] use insertion by range --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 0711ad71e21c..b2786386205f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -54,13 +54,10 @@ void generate_subtriangles(const typename EK::Triangle_3& t, { typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; - //typedef CGAL::No_constraint_intersection_requiring_constructions_tag Itag; - - //typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_base; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; //typedef CGAL::Constrained_triangulation_plus_2 CDT; - - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; + typedef CDT_2 CDT; typename EK::Vector_3 n = normal(t[0], t[1], t[2]); //~ bool orientation_flipped = false; @@ -100,11 +97,9 @@ void generate_subtriangles(const typename EK::Triangle_3& t, typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), false); v->set_point(t[2]); - for (const typename EK::Segment_3& s : segments) - cdt.insert_constraint(s[0], s[1]); + cdt.insert_constraints(segments.begin(), segments.end()); + cdt.insert(points.begin(), points.end()); - for (const typename EK::Point_3& p : points) - cdt.insert(p); //~ if (orientation_flipped) //~ for (typename CDT::Face_handle fh : cdt.finite_face_handles()) From 9ba370a22902afb08d0af7629b7383bba785ac57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 10 Jan 2023 14:40:02 +0100 Subject: [PATCH 0158/1398] use a canonical orientation --- .../Polygon_mesh_processing/autorefinement.h | 58 ++++++------------- 1 file changed, 17 insertions(+), 41 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index b2786386205f..881ffcc8796b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -60,55 +60,26 @@ void generate_subtriangles(const typename EK::Triangle_3& t, typedef CDT_2 CDT; typename EK::Vector_3 n = normal(t[0], t[1], t[2]); - //~ bool orientation_flipped = false; - //~ if (n.x() < 0) - //~ { - //~ orientation_flipped = true; - //~ n = -n; - //~ } - //~ else - //~ { - //~ if (n.x()==0) - //~ { - //~ if (n.y() < 0) - //~ { - //~ orientation_flipped = true; - //~ n = -n; - //~ } - //~ else - //~ { - //~ if (n.y()==0) - //~ { - //~ if (n.z() < 0) - //~ { - //~ orientation_flipped = true; - //~ n = -n; - //~ } - //~ } - //~ } - //~ } - //~ } + typename EK::Point_3 o(0,0,0); + + bool orientation_flipped = false; + if ( typename EK::Less_xyz_3()(o+n,o) ) + { + n=-n; + orientation_flipped = true; + } P_traits cdt_traits(n); CDT cdt(cdt_traits); cdt.insert_outside_affine_hull(t[0]); cdt.insert_outside_affine_hull(t[1]); - typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), false); + typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), orientation_flipped); v->set_point(t[2]); cdt.insert_constraints(segments.begin(), segments.end()); cdt.insert(points.begin(), points.end()); - - //~ if (orientation_flipped) - //~ for (typename CDT::Face_handle fh : cdt.finite_face_handles()) - //~ { - //~ new_triangles.emplace_back(fh->vertex(0)->point(), - //~ fh->vertex(cdt.cw(0))->point(), - //~ fh->vertex(cdt.ccw(0))->point()); - //~ } - //~ else #ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS static int k = 0; std::stringstream buffer; @@ -117,9 +88,14 @@ void generate_subtriangles(const typename EK::Triangle_3& t, #endif for (typename CDT::Face_handle fh : cdt.finite_face_handles()) { - new_triangles.emplace_back(fh->vertex(0)->point(), - fh->vertex(cdt.ccw(0))->point(), - fh->vertex(cdt.cw(0))->point()); + if (orientation_flipped) + new_triangles.emplace_back(fh->vertex(0)->point(), + fh->vertex(cdt.cw(0))->point(), + fh->vertex(cdt.ccw(0))->point()); + else + new_triangles.emplace_back(fh->vertex(0)->point(), + fh->vertex(cdt.ccw(0))->point(), + fh->vertex(cdt.cw(0))->point()); #ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS ++nbt; buffer << fh->vertex(0)->point() << "\n"; From f9668e279f5f7f2acb49a735adb9f6c15e110841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 11 Jan 2023 11:14:05 +0100 Subject: [PATCH 0159/1398] use self-intersection test for soup for checking the validity of the output on some cases it seems twice faster --- .../Polygon_mesh_processing/autorefinement.h | 122 +----------------- 1 file changed, 4 insertions(+), 118 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 881ffcc8796b..9393e197a195 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -29,11 +29,6 @@ #include #include -#ifdef CGAL_DEBUG_PMP_AUTOREFINE -// debug -#include -#endif - #ifndef CGAL_PMP_AUTOREFINE_VERBOSE #define CGAL_PMP_AUTOREFINE_VERBOSE(MSG) #endif @@ -168,115 +163,6 @@ struct Intersection_visitor } }; -template -bool is_output_valid(std::vector> soup_points, - std::vector > soup_triangles) -{ - typedef Surface_mesh Exact_mesh; - Exact_mesh etm; - orient_polygon_soup(soup_points, soup_triangles); - polygon_soup_to_polygon_mesh(soup_points, soup_triangles, etm); - -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - std::cerr << std::setprecision(17); - auto verbose_fail_msg = [&](int i, const std::pair& p) - { - typename Exact_mesh::Halfedge_index h1 = halfedge(p.first, etm), h2 = halfedge(p.second, etm); - std::cerr << "DEBUG: failing at check #" << i << "\n"; - std::cerr << "DEBUG: " << etm.point(source(h1, etm)) << " " << etm.point(target(h1, etm)) << " " << etm.point(target(next(h1, etm), etm)) << " " << etm.point(source(h1, etm)) << "\n"; - std::cerr << "DEBUG: " << etm.point(source(h2, etm)) << " " << etm.point(target(h2, etm)) << " " << etm.point(target(next(h2, etm), etm)) << " " << etm.point(source(h2, etm)) << "\n"; - }; -#endif - - //TODO: double check me - auto skip_faces = [&](const std::pair& p) - { - typename Exact_mesh::Halfedge_index h1 = etm.halfedge(p.first), h2=etm.halfedge(p.second); - - boost::container::small_vector v1; - v1.push_back(prev(h1, etm)); - v1.push_back(h1); - v1.push_back(next(h1, etm)); - - boost::container::small_vector v2; - v2.push_back(prev(h2, etm)); - v2.push_back(h2); - v2.push_back(next(h2, etm)); - - //collect identical vertices - boost::container::small_vector, 3> common; - for(typename Exact_mesh::Halfedge_index h1 : v1) - for(typename Exact_mesh::Halfedge_index h2 : v2) - if (etm.point(target(h1, etm))==etm.point(target(h2,etm))) - common.push_back(std::make_pair(h1,h2)); - - if (common.empty()) - { -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(1, p); -#endif - return false; - } - - switch (common.size()) - { - case 1: - { - // geometric check if the opposite segments intersect the triangles - const typename EK::Triangle_3 t1(etm.point(source(h1,etm)), - etm.point(target(h1,etm)), - etm.point(target(next(h1,etm),etm))); - const typename EK::Triangle_3 t2(etm.point(source(h2,etm)), - etm.point(target(h2,etm)), - etm.point(target(next(h2,etm),etm))); - - const typename EK::Segment_3 s1(etm.point(source(common[0].first,etm)), etm.point(target(next(common[0].first,etm),etm))); - const typename EK::Segment_3 s2(etm.point(source(common[0].second,etm)), etm.point(target(next(common[0].second,etm),etm))); - - if(do_intersect(t1, s2) || do_intersect(t2, s1)) - { -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(2, p); -#endif - return false; - } - return true; - } - case 2: - { - // shared edge - h1 = next(common[0].first, etm) == common[1].first ? common[1].first : common[0].first; - h2 = next(common[0].second, etm) == common[1].second ? common[1].second : common[0].second; - - if( CGAL::coplanar(etm.point(source(h1,etm)), - etm.point(target(h1,etm)), - etm.point(target(etm.next(h1),etm)), - etm.point(target(etm.next(h2),etm))) && - CGAL::coplanar_orientation(etm.point(source(h1,etm)), - etm.point(target(h1,etm)), - etm.point(target(etm.next(h1),etm)), - etm.point(target(etm.next(h2),etm))) == CGAL::POSITIVE) - { -#ifdef CGAL_DEBUG_PMP_AUTOREFINE - verbose_fail_msg(3, p); -#endif - return false; - } - return true; - } - default: // size == 3 - return true; - } - }; - - std::vector< std::pair > si_faces; - self_intersections(etm, - CGAL::filter_output_iterator(std::back_inserter(si_faces), - skip_faces)); - - return si_faces.empty(); -} - } // end of autorefine_impl template @@ -456,13 +342,13 @@ void autorefine_soup_output(const TriangleMesh& tm, #ifndef CGAL_NDEBUG CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - CGAL_assertion( autorefine_impl::is_output_valid(exact_soup_points, soup_triangles) ); -#endif - + CGAL_assertion( !does_triangle_soup_self_intersect(exact_soup_points, soup_triangles) ); +#else #ifdef CGAL_DEBUG_PMP_AUTOREFINE CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - if (!autorefine_impl::is_output_valid(exact_soup_points, soup_triangles)) + if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles)) throw std::runtime_error("invalid output"); +#endif #endif CGAL_PMP_AUTOREFINE_VERBOSE("done"); } From 7d1582ddbb9ad7bf6e7d8872eb08101254b7e68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 11 Jan 2023 14:00:32 +0100 Subject: [PATCH 0160/1398] avoid doing twice the degenerate test --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 9393e197a195..283e139eb1c6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -206,9 +206,11 @@ void autorefine_soup_output(const TriangleMesh& tm, typedef typename boost::property_map::const_type Is_degen_map; Is_degen_map is_degen = get(Degen_property_tag(), tm); -// TODO: we already have this test in bbox inter when it report (f,f) for(face_descriptor f : faces(tm)) - put(is_degen, f, is_degenerate_triangle_face(f, tm, np)); + put(is_degen, f, false); + for (const Pair_of_faces& p : si_pairs) + if (p.first==p.second) // bbox inter reports (f,f) for degenerate faces + put(is_degen, p.first, true); // assign an id per triangle involved in an intersection // + the faces involved in the intersection From 822e65b3cf93b51855d14349d96cdbcf09cff85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 13 Jan 2023 09:35:51 +0100 Subject: [PATCH 0161/1398] build visitor once for all --- .../Polygon_mesh_processing/autorefinement.h | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 283e139eb1c6..ea1c0de07eba 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -54,6 +54,7 @@ void generate_subtriangles(const typename EK::Triangle_3& t, //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; + // positive triangle normal typename EK::Vector_3 n = normal(t[0], t[1], t[2]); typename EK::Point_3 o(0,0,0); @@ -112,32 +113,32 @@ void generate_subtriangles(const typename EK::Triangle_3& t, template struct Intersection_visitor { - std::vector& all_segments_1; - std::vector& all_segments_2; - std::vector& all_points_1; - std::vector& all_points_2; - - Intersection_visitor(std::vector& all_segments_1, - std::vector& all_segments_2, - std::vector& all_points_1, - std::vector& all_points_2) - : all_segments_1(all_segments_1) - , all_segments_2(all_segments_2) - , all_points_1(all_points_1) - , all_points_2(all_points_2) + std::vector< std::vector >& all_segments; + std::vector< std::vector >& all_points; + std::pair ids; + + Intersection_visitor(std::vector< std::vector >& all_segments, + std::vector< std::vector >& all_points) + : all_segments (all_segments) + , all_points(all_points) {} + void set_triangle_ids(int i1, int i2) + { + ids = {i1, i2}; + } + typedef void result_type; void operator()(const typename EK::Point_3& p) { - all_points_1.push_back(p); - all_points_2.push_back(p); + all_points[ids.first].push_back(p); + all_points[ids.second].push_back(p); } void operator()(const typename EK::Segment_3& s) { - all_segments_1.push_back(s); - all_segments_2.push_back(s); + all_segments[ids.first].push_back(s); + all_segments[ids.second].push_back(s); } void operator()(const typename EK::Triangle_3& t) @@ -145,8 +146,8 @@ struct Intersection_visitor for (std::size_t i=0; i<3; ++i) { typename EK::Segment_3 s(t[i], t[(i+1)%3]); - all_segments_1.push_back(s); - all_segments_2.push_back(s); + all_segments[ids.first].push_back(s); + all_segments[ids.second].push_back(s); } } @@ -157,8 +158,8 @@ struct Intersection_visitor for (std::size_t i=0; i > all_segments(triangles.size()); std::vector< std::vector > all_points(triangles.size()); - CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); typename EK::Intersect_3 intersection = EK().intersect_3_object(); + autorefine_impl::Intersection_visitor intersection_visitor(all_segments, all_points); + for (const Pair_of_faces& p : si_pairs) { int i1 = get(tid_map, p.first), @@ -271,9 +273,7 @@ void autorefine_soup_output(const TriangleMesh& tm, if (inter != boost::none) { - autorefine_impl::Intersection_visitor intersection_visitor(all_segments[i1], all_segments[i2], - all_points[i1], all_points[i2]); - + intersection_visitor.set_triangle_ids(i1, i2); boost::apply_visitor(intersection_visitor, *inter); } } From 9c2de3ee7974a1ccd5e72c73bbf60e03366d5523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 13 Jan 2023 11:42:14 +0100 Subject: [PATCH 0162/1398] handle soup as input --- .../Polygon_mesh_processing/autorefinement.h | 123 ++++++++---------- 1 file changed, 53 insertions(+), 70 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index ea1c0de07eba..290dde253324 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -28,6 +28,7 @@ // output #include #include +#include #ifndef CGAL_PMP_AUTOREFINE_VERBOSE #define CGAL_PMP_AUTOREFINE_VERBOSE(MSG) @@ -166,8 +167,9 @@ struct Intersection_visitor } // end of autorefine_impl -template -void autorefine_soup_output(const TriangleMesh& tm, +template +void autorefine_soup_output(const PointRange& input_points, + const TriIdsRange& id_triples, std::vector& soup_points, std::vector >& soup_triangles, const NamedParameters& np = parameters::default_values()) @@ -175,12 +177,9 @@ void autorefine_soup_output(const TriangleMesh& tm, using parameters::choose_parameter; using parameters::get_parameter; - typedef typename GetGeomTraits::type GT; - GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - - typedef typename GetVertexPointMap::const_type VPM; - VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), - get_const_property_map(vertex_point, tm)); + typedef typename GetPolygonSoupGeomTraits::type GT; + typedef typename GetPointMap::const_type Point_map; + Point_map pm = choose_parameter(get_parameter(np, internal_np::point_map)); typedef typename internal_np::Lookup_named_param_def < internal_np::concurrency_tag_t, @@ -188,68 +187,54 @@ void autorefine_soup_output(const TriangleMesh& tm, Sequential_tag > ::type Concurrency_tag; - typedef boost::graph_traits Graph_traits; - typedef typename Graph_traits::face_descriptor face_descriptor; - typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; - typedef typename Graph_traits::vertex_descriptor vertex_descriptor; - typedef std::pair Pair_of_faces; + typedef std::size_t Input_TID; + typedef std::pair Pair_of_triangle_ids; - std::vector si_pairs; + std::vector si_pairs; // collect intersecting pairs of triangles CGAL_PMP_AUTOREFINE_VERBOSE("collect intersecting pairs"); - self_intersections(tm, std::back_inserter(si_pairs), np); + triangle_soup_self_intersections(input_points, id_triples, std::back_inserter(si_pairs), np); if (si_pairs.empty()) return; // mark degenerate faces so that we can ignore them - typedef CGAL::dynamic_face_property_t Degen_property_tag; - typedef typename boost::property_map::const_type Is_degen_map; - Is_degen_map is_degen = get(Degen_property_tag(), tm); + std::vector is_degen(id_triples.size(), false); - for(face_descriptor f : faces(tm)) - put(is_degen, f, false); - for (const Pair_of_faces& p : si_pairs) + for (const Pair_of_triangle_ids& p : si_pairs) if (p.first==p.second) // bbox inter reports (f,f) for degenerate faces - put(is_degen, p.first, true); + is_degen[p.first] = true; // assign an id per triangle involved in an intersection // + the faces involved in the intersection - typedef CGAL::dynamic_face_property_t TID_property_tag; - typedef typename boost::property_map::const_type Triangle_id_map; - - Triangle_id_map tid_map = get(TID_property_tag(), tm); - for (face_descriptor f : faces(tm)) - put(tid_map, f, -1); - - std::vector intersected_faces; - int tid=-1; - for (const Pair_of_faces& p : si_pairs) + std::vector tri_inter_ids(id_triples.size(), -1); + std::vector intersected_faces; + int tiid=-1; + for (const Pair_of_triangle_ids& p : si_pairs) { - if (get(tid_map, p.first)==-1 && !get(is_degen, p.first)) + if (tri_inter_ids[p.first]==-1 && !is_degen[p.first]) { - put(tid_map, p.first, ++tid); + tri_inter_ids[p.first]=++tiid; intersected_faces.push_back(p.first); } - if (get(tid_map, p.second)==-1 && !get(is_degen, p.second)) + if (tri_inter_ids[p.second]==-1 && !is_degen[p.second]) { - put(tid_map, p.second, ++tid); + tri_inter_ids[p.second]=++tiid; intersected_faces.push_back(p.second); } } // init the vector of triangles used for the autorefinement of triangles typedef CGAL::Exact_predicates_exact_constructions_kernel EK; - std::vector< EK::Triangle_3 > triangles(tid+1); + std::vector< EK::Triangle_3 > triangles(tiid+1); Cartesian_converter to_exact; - for(face_descriptor f : intersected_faces) + for(Input_TID f : intersected_faces) { - halfedge_descriptor h = halfedge(f, tm); - triangles[get(tid_map, f)]= EK::Triangle_3( - to_exact( get(vpm, source(h, tm)) ), - to_exact( get(vpm, target(h, tm)) ), - to_exact( get(vpm, target(next(h, tm), tm)) ) ); + triangles[tri_inter_ids[f]]= EK::Triangle_3( + to_exact( get(pm, input_points[id_triples[f][0]]) ), + to_exact( get(pm, input_points[id_triples[f][1]]) ), + to_exact( get(pm, input_points[id_triples[f][2]]) ) ); } std::vector< std::vector > all_segments(triangles.size()); @@ -259,10 +244,10 @@ void autorefine_soup_output(const TriangleMesh& tm, typename EK::Intersect_3 intersection = EK().intersect_3_object(); autorefine_impl::Intersection_visitor intersection_visitor(all_segments, all_points); - for (const Pair_of_faces& p : si_pairs) + for (const Pair_of_triangle_ids& p : si_pairs) { - int i1 = get(tid_map, p.first), - i2 = get(tid_map, p.second); + int i1 = tri_inter_ids[p.first], + i2 = tri_inter_ids[p.second]; if (i1==-1 || i2==-1) continue; //skip degenerate faces @@ -298,17 +283,6 @@ void autorefine_soup_output(const TriangleMesh& tm, std::vector exact_soup_points; #endif - for (vertex_descriptor v : vertices(tm)) - { - if (point_id_map.insert(std::make_pair(to_exact(get(vpm,v)), soup_points.size())).second) - { - soup_points.push_back(get(vpm,v)); -#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.push_back(to_exact(get(vpm,v))); -#endif - } - } - auto get_point_id = [&](const typename EK::Point_3& pt) { auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); @@ -322,18 +296,22 @@ void autorefine_soup_output(const TriangleMesh& tm, return insert_res.first->second; }; - for (face_descriptor f : faces(tm)) + std::vector input_point_ids; + input_point_ids.reserve(input_points.size()); + for (const auto& p : input_points) + input_point_ids.push_back(get_point_id(to_exact(get(pm,p)))); + + for (Input_TID f=0; f::type GT; GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - std::vector soup_points; - std::vector > soup_triangles; + std::vector in_soup_points; + std::vector > in_soup_triangles; + std::vector out_soup_points; + std::vector > out_soup_triangles; + + polygon_mesh_to_polygon_soup(tm, in_soup_points, in_soup_triangles); - autorefine_soup_output(tm, soup_points, soup_triangles, np); + autorefine_soup_output(in_soup_points, in_soup_triangles, + out_soup_points, out_soup_triangles); clear(tm); - orient_polygon_soup(soup_points, soup_triangles); - polygon_soup_to_polygon_mesh(soup_points, soup_triangles, tm); + orient_polygon_soup(out_soup_points, out_soup_triangles); + polygon_soup_to_polygon_mesh(out_soup_points, out_soup_triangles, tm); } From b4887272e85bfde8bebf0093a9169cc897bca5ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 13 Jan 2023 11:56:36 +0100 Subject: [PATCH 0163/1398] use soup as input/output in example --- .../soup_autorefinement.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index 8ca983aa31c3..297875c9ec89 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -23,19 +23,14 @@ int main(int argc, char** argv) : std::string(argv[1]); std::vector input_points; - std::vector > input_triangles; - + std::vector> input_triangles; CGAL::IO::read_polygon_soup(filename, input_points, input_triangles); - PMP::repair_polygon_soup(input_points, input_triangles); - - Mesh mesh; - PMP::orient_polygon_soup(input_points, input_triangles); - PMP::polygon_soup_to_polygon_mesh(input_points, input_triangles, mesh); - PMP::triangulate_faces(mesh); - PMP::autorefine(mesh); + std::vector output_points; + std::vector> output_triangles; + PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles); - CGAL::IO::write_polygon_mesh("autorefined.off", mesh, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); return 0; } From d979121cd29c42c203609ab3bc4956601e9b0512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 13 Jan 2023 15:41:33 +0100 Subject: [PATCH 0164/1398] repair soup is still recommanded --- .../examples/Polygon_mesh_processing/soup_autorefinement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index 297875c9ec89..9ade96e3be84 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -25,6 +24,7 @@ int main(int argc, char** argv) std::vector input_points; std::vector> input_triangles; CGAL::IO::read_polygon_soup(filename, input_points, input_triangles); + PMP::repair_polygon_soup(input_points, input_triangles); std::vector output_points; std::vector> output_triangles; From 4bc74c399cac5ce0ac84ba894e1b5e996960d605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 16 Jan 2023 22:59:18 +0100 Subject: [PATCH 0165/1398] WIP: start improving intersect computation --- .../Polygon_mesh_processing/autorefinement.h | 269 ++++++++++++++++-- 1 file changed, 248 insertions(+), 21 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 290dde253324..80b964ad8590 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1,5 +1,5 @@ //TODO: add for soup face the id of the input face. not sure it is easy to report intersection edge as a pair of vertex id - +//TODO: only return intersection segments // Copyright (c) 2023 GeometryFactory (France). // All rights reserved. // @@ -43,21 +43,26 @@ namespace Polygon_mesh_processing { namespace autorefine_impl { template -void generate_subtriangles(const typename EK::Triangle_3& t, - const std::vector& segments, +void generate_subtriangles(std::size_t ti, + std::vector& segments, const std::vector& points, + const std::vector& in_triangle_ids, + const std::set >& intersecting_triangles, + const std::vector& triangles, std::vector& new_triangles) { typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; + const typename EK::Triangle_3& t = triangles[ti]; + // positive triangle normal typename EK::Vector_3 n = normal(t[0], t[1], t[2]); - typename EK::Point_3 o(0,0,0); + typename EK::Point_3 o(CGAL::ORIGIN); bool orientation_flipped = false; if ( typename EK::Less_xyz_3()(o+n,o) ) @@ -74,6 +79,184 @@ void generate_subtriangles(const typename EK::Triangle_3& t, typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), orientation_flipped); v->set_point(t[2]); +#if 1 + //~ static std::ofstream debug("inter_segments.polylines.txt"); + //~ debug.precision(17); + + // pre-compute segment intersections + if (!segments.empty()) + { + std::size_t nbs = segments.size(); + //~ std::cout << "nbs " << nbs << "\n"; + + //~ if (nbs==8) + //~ { + //~ for (std::size_t i = 0; i > points_on_segments(nbs); + for (std::size_t i = 0; i(&(*res))) + { + points_on_segments[i].push_back(*pt_ptr); + points_on_segments[j].push_back(*pt_ptr); + + //~ std::cout << "new inter " << *pt_ptr << "\n"; + + } + else + { + // We can have hard cases if two triangles are coplanar.... + + //~ std::cout << "coplanar inter: " << i << " " << j << "\n"; + + auto inter = CGAL::intersection(segments[i], segments[j]); + if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) + { + points_on_segments[i].push_back(*pt_ptr); + points_on_segments[j].push_back(*pt_ptr); + + //~ std::cout << "new inter bis" << *pt_ptr << "\n"; + } + else + { + if (const typename EK::Segment_3* seg_ptr = boost::get(&(*inter))) + { + points_on_segments[i].push_back(seg_ptr->source()); + points_on_segments[j].push_back(seg_ptr->source()); + points_on_segments[i].push_back(seg_ptr->target()); + points_on_segments[j].push_back(seg_ptr->target()); + + } + else + std::cerr <<"ERROR!\n"; + } + + #if 0 + //this code works if triangles are not coplanar + // coplanar intersection that is not a point + int coord = 0; + const typename EK::Segment_3& s = segments[i]; + typename EK::Point_3 src = s.source(), tgt=s.target(); + if (src.x()==tgt.x()) + { + coord=1; + if (src.y()==tgt.y()) + coord==2; + } + + std::vector tmp_pts = { + src, tgt, segments[j][0], segments[j][1] }; + + std::sort(tmp_pts.begin(), tmp_pts.end(), + [coord](const typename EK::Point_3& p, const typename EK::Point_3& q) + {return p[coord] cst_points; + std::vector> csts; + for (std::size_t i = 0; itgt[coord]) + std::swap(src, tgt); + + std::sort(points_on_segments[i].begin(), points_on_segments[i].end(), [coord](const typename EK::Point_3& p, const typename EK::Point_3& q){return p[coord] no_inter_segments; + no_inter_segments.reserve(nbs); + for (std::size_t i = 0; i >& all_segments; std::vector< std::vector >& all_points; + std::vector< std::vector >& all_in_triangle_ids; std::pair ids; Intersection_visitor(std::vector< std::vector >& all_segments, - std::vector< std::vector >& all_points) + std::vector< std::vector >& all_points, + std::vector< std::vector >& all_in_triangle_ids) : all_segments (all_segments) , all_points(all_points) + , all_in_triangle_ids(all_in_triangle_ids) {} void set_triangle_ids(int i1, int i2) @@ -140,6 +326,8 @@ struct Intersection_visitor { all_segments[ids.first].push_back(s); all_segments[ids.second].push_back(s); + all_in_triangle_ids[ids.first].push_back(ids.second); + all_in_triangle_ids[ids.second].push_back(ids.first); } void operator()(const typename EK::Triangle_3& t) @@ -149,6 +337,8 @@ struct Intersection_visitor typename EK::Segment_3 s(t[i], t[(i+1)%3]); all_segments[ids.first].push_back(s); all_segments[ids.second].push_back(s); + all_in_triangle_ids[ids.first].push_back(ids.second); + all_in_triangle_ids[ids.second].push_back(ids.first); } } @@ -161,6 +351,8 @@ struct Intersection_visitor typename EK::Segment_3 s(poly[i], poly[(i+1)%nbp]); all_segments[ids.first].push_back(s); all_segments[ids.second].push_back(s); + all_in_triangle_ids[ids.first].push_back(ids.second); + all_in_triangle_ids[ids.second].push_back(ids.first); } } }; @@ -239,11 +431,13 @@ void autorefine_soup_output(const PointRange& input_points, std::vector< std::vector > all_segments(triangles.size()); std::vector< std::vector > all_points(triangles.size()); + std::vector< std::vector > all_in_triangle_ids(triangles.size()); CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); typename EK::Intersect_3 intersection = EK().intersect_3_object(); - autorefine_impl::Intersection_visitor intersection_visitor(all_segments, all_points); + autorefine_impl::Intersection_visitor intersection_visitor(all_segments, all_points, all_in_triangle_ids); + std::set > intersecting_triangles; for (const Pair_of_triangle_ids& p : si_pairs) { int i1 = tri_inter_ids[p.first], @@ -258,25 +452,13 @@ void autorefine_soup_output(const PointRange& input_points, if (inter != boost::none) { + intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); intersection_visitor.set_triangle_ids(i1, i2); boost::apply_visitor(intersection_visitor, *inter); } } - CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); - // now refine triangles - std::vector new_triangles; - for(std::size_t ti=0; ti(triangles[ti], all_segments[ti], all_points[ti], new_triangles); - } - - - // brute force output: create a soup, orient and to-mesh - CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); + // deduplicate inserted segments Cartesian_converter to_input; std::map point_id_map; #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) @@ -296,6 +478,51 @@ void autorefine_soup_output(const PointRange& input_points, return insert_res.first->second; }; + // filter duplicated segments + for(std::size_t ti=0; ti filtered_segments; + std::vector filtered_in_triangle_ids; + filtered_segments.reserve(nbs); + std::set> segset; + for (std::size_t si=0; si new_triangles; + for(std::size_t ti=0; ti(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + + + // brute force output: create a soup, orient and to-mesh + CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); + std::vector input_point_ids; input_point_ids.reserve(input_points.size()); for (const auto& p : input_points) From 842b6282b5c7a0b9f9c9551dfa443edd4f5319f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 23 Jan 2023 15:39:01 +0100 Subject: [PATCH 0166/1398] STILL WIP: copy/paste code for coplanar intersection --- .../Polygon_mesh_processing/autorefinement.h | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 80b964ad8590..6d97f7521ded 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,12 +36,43 @@ #include +#define TEST_RESOLVE_INTERSECTION +#define DEDUPLICATE_SEGMENTS + namespace CGAL { namespace Polygon_mesh_processing { #ifndef DOXYGEN_RUNNING namespace autorefine_impl { +template +bool do_coplanar_segments_intersect(const typename K::Segment_3& s1, + const typename K::Segment_3& s2, + const K& k = K()) +{ + // supporting_line intersects: points are coplanar + typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); + ::CGAL::Orientation or1 = cpl_orient(s1[0], s1[1], s2[0]); + ::CGAL::Orientation or2 = cpl_orient(s1[0], s1[1], s2[1]); + + if(or1 == COLLINEAR && or2 == COLLINEAR) + { + // segments are collinear + typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); + return (cln_order(s1[0], s2[0], s1[1]) || + cln_order(s1[0], s2[1], s1[1]) || + cln_order(s2[0], s1[0], s2[1])); + } + + if(or1 != or2) + { + or1 = cpl_orient(s2[0], s2[1], s1[0]); + return (or1 == COLLINEAR || or1 != cpl_orient(s2[0], s2[1], s1[1])); + } + + return false; +} + template void generate_subtriangles(std::size_t ti, std::vector& segments, @@ -54,7 +85,11 @@ void generate_subtriangles(std::size_t ti, typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; @@ -79,7 +114,7 @@ void generate_subtriangles(std::size_t ti, typename CDT::Vertex_handle v = cdt.tds().insert_dim_up(cdt.infinite_vertex(), orientation_flipped); v->set_point(t[2]); -#if 1 +#ifdef TEST_RESOLVE_INTERSECTION //~ static std::ofstream debug("inter_segments.polylines.txt"); //~ debug.precision(17); @@ -102,7 +137,7 @@ void generate_subtriangles(std::size_t ti, { if (intersecting_triangles.count(CGAL::make_sorted_pair(in_triangle_ids[i], in_triangle_ids[j]))!=0) { - if (CGAL::do_intersect(segments[i], segments[j])) + if (do_coplanar_segments_intersect(segments[i], segments[j])) { auto res = CGAL::intersection(triangles[in_triangle_ids[i]].supporting_plane(), triangles[in_triangle_ids[j]].supporting_plane(), @@ -479,6 +514,7 @@ void autorefine_soup_output(const PointRange& input_points, }; // filter duplicated segments +#ifdef DEDUPLICATE_SEGMENTS for(std::size_t ti=0; ti(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); } - // brute force output: create a soup, orient and to-mesh CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); From 39d7bbc57fee319e45f8c51c75794f7828cc21d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 14:54:20 +0100 Subject: [PATCH 0167/1398] WIP import intersection computation from coref code --- .../Polygon_mesh_processing/autorefinement.h | 363 +++++++++++++----- 1 file changed, 259 insertions(+), 104 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 6d97f7521ded..afbe0c3479d7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,8 +36,8 @@ #include -#define TEST_RESOLVE_INTERSECTION -#define DEDUPLICATE_SEGMENTS +// #define TEST_RESOLVE_INTERSECTION +// #define DEDUPLICATE_SEGMENTS namespace CGAL { namespace Polygon_mesh_processing { @@ -45,10 +45,13 @@ namespace Polygon_mesh_processing { #ifndef DOXYGEN_RUNNING namespace autorefine_impl { +enum Segment_inter_type { NO_INTERSECTION=0, COPLANAR_SEGMENTS, POINT_INTERSECTION }; + template -bool do_coplanar_segments_intersect(const typename K::Segment_3& s1, - const typename K::Segment_3& s2, - const K& k = K()) +Segment_inter_type +do_coplanar_segments_intersect(const typename K::Segment_3& s1, + const typename K::Segment_3& s2, + const K& k = K()) { // supporting_line intersects: points are coplanar typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); @@ -61,26 +64,207 @@ bool do_coplanar_segments_intersect(const typename K::Segment_3& s1, typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); return (cln_order(s1[0], s2[0], s1[1]) || cln_order(s1[0], s2[1], s1[1]) || - cln_order(s2[0], s1[0], s2[1])); + cln_order(s2[0], s1[0], s2[1])) ? COPLANAR_SEGMENTS : NO_INTERSECTION; } if(or1 != or2) { or1 = cpl_orient(s2[0], s2[1], s1[0]); - return (or1 == COLLINEAR || or1 != cpl_orient(s2[0], s2[1], s1[1])); + return (or1 == COLLINEAR || or1 != cpl_orient(s2[0], s2[1], s1[1])) ? POINT_INTERSECTION : NO_INTERSECTION; + } + + return NO_INTERSECTION; +} + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + +// imported from Polygon_mesh_processing/internal/Corefinement/intersect_triangle_segment_3.h + +template +void +find_intersection(const typename K::Point_3& p, const typename K::Point_3& q, //segment + const typename K::Point_3& a, const typename K::Point_3& b, const typename K::Point_3& c, //triangle + std::vector& inter_pts, + bool is_p_coplanar=false, bool is_q_coplanar=false) // note that in coref this was wrt a halfedge not p/q +{ + Orientation ab=orientation(p,q,a,b); + Orientation bc=orientation(p,q,b,c); + Orientation ca=orientation(p,q,c,a); + + if ( ab==POSITIVE || bc==POSITIVE || ca==POSITIVE ) + return; + + int nb_coplanar=(ab==COPLANAR?1:0) + (bc==COPLANAR?1:0) + (ca==COPLANAR?1:0); + +/* + if ( nb_coplanar==0 ) + return result_type(ON_FACE,hd,is_src_coplanar,is_tgt_coplanar); + + if (nb_coplanar==1){ + if (ab==COPLANAR) + // intersection is ab + return result_type(ON_EDGE,next(hd,tm),is_src_coplanar,is_tgt_coplanar); + if (bc==COPLANAR) + // intersection is bc + return result_type(ON_EDGE,prev(hd,tm),is_src_coplanar,is_tgt_coplanar); + CGAL_assertion(ca==COPLANAR); + // intersection is ca + return result_type(ON_EDGE,hd,is_src_coplanar,is_tgt_coplanar); + } +*/ + + if (is_p_coplanar) + { + inter_pts.push_back(p); + return; + } + if (is_q_coplanar) + { + inter_pts.push_back(q); + return; + } + + if (nb_coplanar!=2) + { + inter_pts.push_back( + typename K::Construct_plane_line_intersection_point_3()(a, b, c, p, q) + ); + } + else + { + if (ab!=COPLANAR) + { + // intersection is c + inter_pts.push_back(c); + return; + } + + if (bc!=COPLANAR) + { + // intersection is a + inter_pts.push_back(a); + return; + } + CGAL_assertion(ca!=COPLANAR); + // intersection is b + inter_pts.push_back(b); } +} - return false; +template +void test_edge(const typename K::Point_3& p, const typename K::Point_3& q, + const typename K::Point_3& a, const typename K::Point_3& b, const typename K::Point_3& c, + const Orientation abcp, + const Orientation abcq, + std::vector& inter_pts) +{ + switch ( abcp ) { + case POSITIVE: + switch ( abcq ) { + case POSITIVE: + // the segment lies in the positive open halfspaces defined by the + // triangle's supporting plane + break; + case NEGATIVE: + // p sees the triangle in counterclockwise order + find_intersection(p,q,a,b,c,inter_pts); + break; + //case COPLANAR: + default: + // q belongs to the triangle's supporting plane + // p sees the triangle in counterclockwise order + find_intersection(p,q,a,b,c,inter_pts,false,true); + } + break; + case NEGATIVE: + switch ( abcq ) { + case POSITIVE: + // q sees the triangle in counterclockwise order + find_intersection(q,p,a,b,c,inter_pts); + break; + case NEGATIVE: + // the segment lies in the negative open halfspaces defined by the + // triangle's supporting plane + break; + // case COPLANAR: + default: + // q belongs to the triangle's supporting plane + // p sees the triangle in clockwise order + find_intersection(q,p,a,b,c,inter_pts,true,false); + } + break; + default: + //case COPLANAR: // p belongs to the triangle's supporting plane + switch ( abcq ) { + case POSITIVE: + // q sees the triangle in counterclockwise order + find_intersection(q,p,a,b,c,inter_pts,false, true); + break; + case NEGATIVE: + // q sees the triangle in clockwise order + find_intersection(p,q,a,b,c,inter_pts,true); + break; + //case COPLANAR: + default: + // the segment is coplanar with the triangle's supporting plane + // we test whether the segment intersects the triangle in the common + // supporting plane + if ( ::CGAL::Intersections::internal::do_intersect_coplanar(a,b,c,p,q,K()) ) + { + //handle coplanar intersection + // TODO: use coref function + throw std::runtime_error("coplanar intersection"); + return; + } + } + } } +template +void collect_intersections(const std::array& t1, + const std::array& t2, + std::vector& inter_pts) +{ + // test edges of t1 vs t2 + std::array ori; + for (int i=0; i<3; ++i) + ori[i] = orientation(t2[0],t2[1],t2[2],t1[i]); + for (int i=0; i<3; ++i) + { + int j=(i+1)%3; + test_edge(t1[i], t1[j], t2[0], t2[1], t2[2], ori[i], ori[j], inter_pts); + if (inter_pts.size()>1) return; + } + + // test edges of t2 vs t1 + for (int i=0; i<3; ++i) + ori[i] = orientation(t1[0],t1[1],t1[2],t2[i]); + for (int i=0; i<3; ++i) + { + int j=(i+1)%3; + test_edge(t2[i], t2[j], t1[0], t1[1], t1[2], ori[i], ori[j], inter_pts); + if (inter_pts.size()>1) return; + } +} + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + template void generate_subtriangles(std::size_t ti, std::vector& segments, const std::vector& points, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, - const std::vector& triangles, - std::vector& new_triangles) + const std::vector>& triangles, + std::vector>& new_triangles) { typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; @@ -93,7 +277,7 @@ void generate_subtriangles(std::size_t ti, //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; - const typename EK::Triangle_3& t = triangles[ti]; + const std::array& t = triangles[ti]; // positive triangle normal typename EK::Vector_3 n = normal(t[0], t[1], t[2]); @@ -130,6 +314,11 @@ void generate_subtriangles(std::size_t ti, //~ std::ofstream("cst_"+std::to_string(i)+".polylines.txt") << std::setprecision(17) << "2 " << segments[i] << "\n"; //~ } + auto supporting_plane = [](const std::array& t) + { + return typename EK::Plane_3(t[0], t[1], t[2]); + }; + std::vector< std::vector > points_on_segments(nbs); for (std::size_t i = 0; i(segments[i], segments[j])) + Segment_inter_type seg_inter_type = do_coplanar_segments_intersect(segments[i], segments[j]); + switch(seg_inter_type) { - auto res = CGAL::intersection(triangles[in_triangle_ids[i]].supporting_plane(), - triangles[in_triangle_ids[j]].supporting_plane(), - triangles[ti].supporting_plane()); - - if (const typename EK::Point_3* pt_ptr = boost::get(&(*res))) + case POINT_INTERSECTION: { - points_on_segments[i].push_back(*pt_ptr); - points_on_segments[j].push_back(*pt_ptr); + auto res = CGAL::intersection(supporting_plane(triangles[in_triangle_ids[i]]), + supporting_plane(triangles[in_triangle_ids[j]]), + supporting_plane(triangles[ti])); + + if (const typename EK::Point_3* pt_ptr = boost::get(&(*res))) + { + points_on_segments[i].push_back(*pt_ptr); + points_on_segments[j].push_back(*pt_ptr); - //~ std::cout << "new inter " << *pt_ptr << "\n"; + //~ std::cout << "new inter " << *pt_ptr << "\n"; + } } - else + // break; No break because of the coplanar case + case COPLANAR_SEGMENTS: { // We can have hard cases if two triangles are coplanar.... //~ std::cout << "coplanar inter: " << i << " " << j << "\n"; auto inter = CGAL::intersection(segments[i], segments[j]); + + if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); + if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) { points_on_segments[i].push_back(*pt_ptr); @@ -224,6 +421,9 @@ void generate_subtriangles(std::size_t ti, //~ debug << "4 " << triangles[ti] << " " << triangles[ti][0] << "\n"; //~ exit(1); } + break; + default: + break; } } } @@ -304,13 +504,13 @@ void generate_subtriangles(std::size_t ti, for (typename CDT::Face_handle fh : cdt.finite_face_handles()) { if (orientation_flipped) - new_triangles.emplace_back(fh->vertex(0)->point(), - fh->vertex(cdt.cw(0))->point(), - fh->vertex(cdt.ccw(0))->point()); + new_triangles.push_back( CGAL::make_array(fh->vertex(0)->point(), + fh->vertex(cdt.cw(0))->point(), + fh->vertex(cdt.ccw(0))->point()) ); else - new_triangles.emplace_back(fh->vertex(0)->point(), - fh->vertex(cdt.ccw(0))->point(), - fh->vertex(cdt.cw(0))->point()); + new_triangles.push_back( CGAL::make_array(fh->vertex(0)->point(), + fh->vertex(cdt.ccw(0))->point(), + fh->vertex(cdt.cw(0))->point()) ); #ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS ++nbt; buffer << fh->vertex(0)->point() << "\n"; @@ -329,69 +529,6 @@ void generate_subtriangles(std::size_t ti, #endif } -template -struct Intersection_visitor -{ - std::vector< std::vector >& all_segments; - std::vector< std::vector >& all_points; - std::vector< std::vector >& all_in_triangle_ids; - std::pair ids; - - Intersection_visitor(std::vector< std::vector >& all_segments, - std::vector< std::vector >& all_points, - std::vector< std::vector >& all_in_triangle_ids) - : all_segments (all_segments) - , all_points(all_points) - , all_in_triangle_ids(all_in_triangle_ids) - {} - - void set_triangle_ids(int i1, int i2) - { - ids = {i1, i2}; - } - - typedef void result_type; - void operator()(const typename EK::Point_3& p) - { - all_points[ids.first].push_back(p); - all_points[ids.second].push_back(p); - } - - void operator()(const typename EK::Segment_3& s) - { - all_segments[ids.first].push_back(s); - all_segments[ids.second].push_back(s); - all_in_triangle_ids[ids.first].push_back(ids.second); - all_in_triangle_ids[ids.second].push_back(ids.first); - } - - void operator()(const typename EK::Triangle_3& t) - { - for (std::size_t i=0; i<3; ++i) - { - typename EK::Segment_3 s(t[i], t[(i+1)%3]); - all_segments[ids.first].push_back(s); - all_segments[ids.second].push_back(s); - all_in_triangle_ids[ids.first].push_back(ids.second); - all_in_triangle_ids[ids.second].push_back(ids.first); - } - - } - - void operator()(const std::vector& poly) - { - std::size_t nbp = poly.size(); - for (std::size_t i=0; i @@ -453,24 +590,22 @@ void autorefine_soup_output(const PointRange& input_points, // init the vector of triangles used for the autorefinement of triangles typedef CGAL::Exact_predicates_exact_constructions_kernel EK; - std::vector< EK::Triangle_3 > triangles(tiid+1); + std::vector< std::array > triangles(tiid+1); Cartesian_converter to_exact; for(Input_TID f : intersected_faces) { - triangles[tri_inter_ids[f]]= EK::Triangle_3( + triangles[tri_inter_ids[f]]= CGAL::make_array( to_exact( get(pm, input_points[id_triples[f][0]]) ), to_exact( get(pm, input_points[id_triples[f][1]]) ), to_exact( get(pm, input_points[id_triples[f][2]]) ) ); } - std::vector< std::vector > all_segments(triangles.size()); + std::vector< std::vector > all_segments(triangles.size()); // TODO use std::pair std::vector< std::vector > all_points(triangles.size()); std::vector< std::vector > all_in_triangle_ids(triangles.size()); CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); - typename EK::Intersect_3 intersection = EK().intersect_3_object(); - autorefine_impl::Intersection_visitor intersection_visitor(all_segments, all_points, all_in_triangle_ids); std::set > intersecting_triangles; for (const Pair_of_triangle_ids& p : si_pairs) @@ -480,16 +615,36 @@ void autorefine_soup_output(const PointRange& input_points, if (i1==-1 || i2==-1) continue; //skip degenerate faces - const EK::Triangle_3& t1 = triangles[i1]; - const EK::Triangle_3& t2 = triangles[i2]; + const std::array& t1 = triangles[i1]; + const std::array& t2 = triangles[i2]; - auto inter = intersection(t1, t2); + std::vector inter_pts; + autorefine_impl::collect_intersections(t1, t2, inter_pts); - if (inter != boost::none) + if (!inter_pts.empty()) { - intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); - intersection_visitor.set_triangle_ids(i1, i2); - boost::apply_visitor(intersection_visitor, *inter); + std::size_t nbi = inter_pts.size(); + switch(nbi) + { + case 1: + all_points[i1].push_back(inter_pts[0]); + all_points[i2].push_back(inter_pts[0]); + break; + case 2: + all_segments[i1].push_back({inter_pts[0], inter_pts[1]}); + all_segments[i2].push_back({inter_pts[0], inter_pts[1]}); + all_in_triangle_ids[i1].push_back(i2); + all_in_triangle_ids[i2].push_back(i1); + break; + default: + for (std::size_t i=0;i new_triangles; + std::vector> new_triangles; for(std::size_t ti=0; ti& t : new_triangles) { soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); } From 10252faf1df2480f21c25959c1980e68819099a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 16:04:43 +0100 Subject: [PATCH 0168/1398] WIP use segments --- .../Polygon_mesh_processing/autorefinement.h | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index afbe0c3479d7..c9bb3f3ffa81 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,8 +36,8 @@ #include -// #define TEST_RESOLVE_INTERSECTION -// #define DEDUPLICATE_SEGMENTS +//#define TEST_RESOLVE_INTERSECTION +//#define DEDUPLICATE_SEGMENTS namespace CGAL { namespace Polygon_mesh_processing { @@ -49,8 +49,8 @@ enum Segment_inter_type { NO_INTERSECTION=0, COPLANAR_SEGMENTS, POINT_INTERSECTI template Segment_inter_type -do_coplanar_segments_intersect(const typename K::Segment_3& s1, - const typename K::Segment_3& s2, +do_coplanar_segments_intersect(const std::array& s1, + const std::array& s2, const K& k = K()) { // supporting_line intersects: points are coplanar @@ -259,7 +259,7 @@ void collect_intersections(const std::array& t1, template void generate_subtriangles(std::size_t ti, - std::vector& segments, + std::vector>& segments, const std::vector& points, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, @@ -351,7 +351,9 @@ void generate_subtriangles(std::size_t ti, //~ std::cout << "coplanar inter: " << i << " " << j << "\n"; - auto inter = CGAL::intersection(segments[i], segments[j]); + typename EK::Segment_3 s1(segments[i][0], segments[i][1]); + typename EK::Segment_3 s2(segments[j][0], segments[j][1]);// TODO: avoid this construction + auto inter = CGAL::intersection(s1, s2); if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); @@ -381,7 +383,7 @@ void generate_subtriangles(std::size_t ti, // coplanar intersection that is not a point int coord = 0; const typename EK::Segment_3& s = segments[i]; - typename EK::Point_3 src = s.source(), tgt=s.target(); + typename EK::Point_3 src = s[0], tgt=s[1]; if (src.x()==tgt.x()) { coord=1; @@ -401,10 +403,10 @@ void generate_subtriangles(std::size_t ti, points_on_segments[j].push_back(tmp_pts[1]); points_on_segments[j].push_back(tmp_pts[2]); #endif - //~ std::cout << "new inter coli " << segments[j].source() << "\n"; - //~ std::cout << "new inter coli " << segments[j].target() << "\n"; - //~ std::cout << "new inter coli " << segments[i].source() << "\n"; - //~ std::cout << "new inter coli " << segments[i].target() << "\n"; + //~ std::cout << "new inter coli " << segments[j][0] << "\n"; + //~ std::cout << "new inter coli " << segments[j][1] << "\n"; + //~ std::cout << "new inter coli " << segments[i][0] << "\n"; + //~ std::cout << "new inter coli " << segments[i][1] << "\n"; //~ points_on_segments[j].push_back(*pt_ptr); @@ -437,8 +439,8 @@ void generate_subtriangles(std::size_t ti, { // TODO: predicate on input triangles int coord = 0; - const typename EK::Segment_3& s = segments[i]; - typename EK::Point_3 src = s.source(), tgt=s.target(); + const std::array& s = segments[i]; + typename EK::Point_3 src = s[0], tgt=s[1]; if (src.x()==tgt.x()) { coord=1; @@ -482,7 +484,7 @@ void generate_subtriangles(std::size_t ti, cdt.insert_constraints(cst_points.begin(), cst_points.end(), csts.begin(), csts.end()); - std::vector no_inter_segments; + std::vector> no_inter_segments; no_inter_segments.reserve(nbs); for (std::size_t i = 0; i > all_segments(triangles.size()); // TODO use std::pair + std::vector< std::vector > > all_segments(triangles.size()); std::vector< std::vector > all_points(triangles.size()); std::vector< std::vector > all_in_triangle_ids(triangles.size()); @@ -631,16 +633,16 @@ void autorefine_soup_output(const PointRange& input_points, all_points[i2].push_back(inter_pts[0]); break; case 2: - all_segments[i1].push_back({inter_pts[0], inter_pts[1]}); - all_segments[i2].push_back({inter_pts[0], inter_pts[1]}); + all_segments[i1].push_back(CGAL::make_array(inter_pts[0], inter_pts[1])); + all_segments[i2].push_back(CGAL::make_array(inter_pts[0], inter_pts[1])); all_in_triangle_ids[i1].push_back(i2); all_in_triangle_ids[i2].push_back(i1); break; default: for (std::size_t i=0;i filtered_segments; + std::vector> filtered_segments; std::vector filtered_in_triangle_ids; filtered_segments.reserve(nbs); std::set> segset; for (std::size_t si=0; si Date: Tue, 24 Jan 2023 16:04:54 +0100 Subject: [PATCH 0169/1398] always std::array as cst --- Triangulation_2/include/CGAL/Constrained_triangulation_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 42867cfbb074..047c8526afc5 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -330,11 +330,11 @@ class Constrained_triangulation_2 #if 1 template static decltype(auto) get_source(const Segment_2& segment){ - return segment.source(); + return segment[0]; } template static decltype(auto) get_target(const Segment_2& segment){ - return segment.target(); + return segment[1]; } static const Point& get_source(const Constraint& cst){ From 810715778223710a066d3161e2a4ec453475eaf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 24 Jan 2023 18:04:10 +0100 Subject: [PATCH 0170/1398] WIP handle coplanar --- .../Polygon_mesh_processing/autorefinement.h | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index c9bb3f3ffa81..f412c2ea298e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -82,8 +82,30 @@ do_coplanar_segments_intersect(const std::array& s1, ////////////////////////////////// ////////////////////////////////// -// imported from Polygon_mesh_processing/internal/Corefinement/intersect_triangle_segment_3.h +// imported from Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h + +template +void coplanar_intersections(const std::array& t1, + const std::array& t2, + std::vector& inter_pts) +{ + const typename K::Point_3& p = t1[0], q = t1[1], r = t1[2]; + + std::list l_inter_pts; + l_inter_pts.push_back(t2[0]); + l_inter_pts.push_back(t2[1]); + l_inter_pts.push_back(t2[2]); + //intersect t2 with the three half planes which intersection defines t1 + K k; + Intersections::internal::intersection_coplanar_triangles_cutoff(p,q,r,k,l_inter_pts); //line pq + Intersections::internal::intersection_coplanar_triangles_cutoff(q,r,p,k,l_inter_pts); //line qr + Intersections::internal::intersection_coplanar_triangles_cutoff(r,p,q,k,l_inter_pts); //line rp + + inter_pts.assign(l_inter_pts.begin(), l_inter_pts.end()); +} + +// imported from Polygon_mesh_processing/internal/Corefinement/intersect_triangle_segment_3.h template void find_intersection(const typename K::Point_3& p, const typename K::Point_3& q, //segment @@ -162,7 +184,7 @@ void test_edge(const typename K::Point_3& p, const typename K::Point_3& q, const Orientation abcq, std::vector& inter_pts) { - switch ( abcp ) { + switch ( abcp ) { case POSITIVE: switch ( abcq ) { case POSITIVE: @@ -213,13 +235,13 @@ void test_edge(const typename K::Point_3& p, const typename K::Point_3& q, // the segment is coplanar with the triangle's supporting plane // we test whether the segment intersects the triangle in the common // supporting plane - if ( ::CGAL::Intersections::internal::do_intersect_coplanar(a,b,c,p,q,K()) ) - { + //if ( ::CGAL::Intersections::internal::do_intersect_coplanar(a,b,c,p,q,K()) ) + //{ //handle coplanar intersection - // TODO: use coref function - throw std::runtime_error("coplanar intersection"); - return; - } + // nothing done as coplanar case handle in collect_intersections + // and other intersection points will be collected with non-coplanar edges + //} + break; } } } @@ -233,6 +255,13 @@ void collect_intersections(const std::array& t1, std::array ori; for (int i=0; i<3; ++i) ori[i] = orientation(t2[0],t2[1],t2[2],t1[i]); + + if (ori[0]== COPLANAR && ori[1]==COPLANAR && ori[2]==COPLANAR) + { + coplanar_intersections(t1, t2, inter_pts); + return; + } + for (int i=0; i<3; ++i) { int j=(i+1)%3; @@ -378,7 +407,7 @@ void generate_subtriangles(std::size_t ti, std::cerr <<"ERROR!\n"; } - #if 0 +#if 0 //this code works if triangles are not coplanar // coplanar intersection that is not a point int coord = 0; From fa662e7dea97c5f33c8872c71817c18f51df0894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 25 Jan 2023 14:45:12 +0100 Subject: [PATCH 0171/1398] WIP handle duplicated intersections + add in intersection list --- .../Polygon_mesh_processing/autorefinement.h | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index f412c2ea298e..ae9858ae77d5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1,5 +1,5 @@ //TODO: add for soup face the id of the input face. not sure it is easy to report intersection edge as a pair of vertex id -//TODO: only return intersection segments +//TODO: only return intersection segments (pay attention to degenerate triangles that are currently ignored) // Copyright (c) 2023 GeometryFactory (France). // All rights reserved. // @@ -36,8 +36,8 @@ #include -//#define TEST_RESOLVE_INTERSECTION -//#define DEDUPLICATE_SEGMENTS +// #define TEST_RESOLVE_INTERSECTION +// #define DEDUPLICATE_SEGMENTS namespace CGAL { namespace Polygon_mesh_processing { @@ -266,7 +266,7 @@ void collect_intersections(const std::array& t1, { int j=(i+1)%3; test_edge(t1[i], t1[j], t2[0], t2[1], t2[2], ori[i], ori[j], inter_pts); - if (inter_pts.size()>1) return; + //~ if (inter_pts.size()>1) return; } // test edges of t2 vs t1 @@ -276,8 +276,13 @@ void collect_intersections(const std::array& t1, { int j=(i+1)%3; test_edge(t2[i], t2[j], t1[0], t1[1], t1[2], ori[i], ori[j], inter_pts); - if (inter_pts.size()>1) return; + //~ if (inter_pts.size()>1) return; } + + // because we don't handle intersection type and can have edge-edge edge-vertex duplicates + std::sort(inter_pts.begin(), inter_pts.end()); + auto last = std::unique(inter_pts.begin(), inter_pts.end()); + inter_pts.erase(last, inter_pts.end()); } ////////////////////////////////// @@ -288,7 +293,7 @@ void collect_intersections(const std::array& t1, template void generate_subtriangles(std::size_t ti, - std::vector>& segments, + std::vector>& segments, const std::vector& points, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, @@ -331,6 +336,27 @@ void generate_subtriangles(std::size_t ti, //~ static std::ofstream debug("inter_segments.polylines.txt"); //~ debug.precision(17); + //~ std::cout << "points.size() " << points.size() << "\n"; + //~ std::set all_triangles_indices(in_triangle_ids.begin(), in_triangle_ids.end()); + //~ all_triangles_indices.insert(ti); + + //~ std::ofstream debug("triangles.polylines.txt"); + //~ debug << std::setprecision(17); + //~ for (std::size_t i : all_triangles_indices) + //~ debug << "4 " + //~ << triangles[i][0] << " " + //~ << triangles[i][1] << " " + //~ << triangles[i][2] << " " + //~ << triangles[i][0] << "\n"; + //~ debug.close(); + //~ debug.open("triangle.off"); + //~ debug << std::setprecision(17); + //~ debug << "OFF\n3 1 0\n"; + //~ debug << triangles[ti][0] << "\n" + //~ << triangles[ti][1] << "\n" + //~ << triangles[ti][2] << "\n 3 0 1 2\n"; + //~ debug.close(); + // pre-compute segment intersections if (!segments.empty()) { @@ -340,7 +366,7 @@ void generate_subtriangles(std::size_t ti, //~ if (nbs==8) //~ { //~ for (std::size_t i = 0; i& t) @@ -404,7 +430,7 @@ void generate_subtriangles(std::size_t ti, } else - std::cerr <<"ERROR!\n"; + throw std::runtime_error("BOOM\n"); } #if 0 @@ -671,11 +697,12 @@ void autorefine_soup_output(const PointRange& input_points, for (std::size_t i=0;i Date: Thu, 2 Feb 2023 11:14:18 +0100 Subject: [PATCH 0172/1398] WIP new coplanar intersection --- .../Triangle_3_Triangle_3_intersection.h | 297 +++++++++++++++--- .../Polygon_mesh_processing/autorefinement.h | 36 ++- 2 files changed, 285 insertions(+), 48 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 424e1fc93616..d4e467a07986 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -31,54 +31,257 @@ namespace CGAL { namespace Intersections { namespace internal{ +template +typename K::FT +coplanar_segment_segment_alpha_intersection(const typename K::Point_3& p1, const typename K::Point_3& p2, // segment 1 + const typename K::Point_3& p3, const typename K::Point_3& p4, // segment 2 + const K& k) +{ + const typename K::Vector_3 v1 = p2-p1; + const typename K::Vector_3 v2 = p4-p3; + + CGAL_assertion(k.coplanar_3_object()(p1,p2,p3,p4)); + + const typename K::Vector_3 v3 = p3 - p1; + const typename K::Vector_3 v3v2 = cross_product(v3,v2); + const typename K::Vector_3 v1v2 = cross_product(v1,v2); + const typename K::FT sl = v1v2.squared_length(); + CGAL_assertion(!certainly(is_zero(sl))); + + const typename K::FT t = ((v3v2.x()*v1v2.x()) + (v3v2.y()*v1v2.y()) + (v3v2.z()*v1v2.z())) / sl; + return t; // p1 + (p2-p1) * t +} + +template +struct Point_on_triangle +{ + static + inline + const typename Kernel::Point_3& + point_from_id(const typename Kernel::Point_3& p, + const typename Kernel::Point_3& q, + const typename Kernel::Point_3& r, + int id) + { + switch(id) + { + case 0: + return p; + case 1: + return q; + default: + return r; + } + } + + Point_on_triangle(int i1, int i2=-1, int sign=0, typename Kernel::FT alpha = 0.) // TODO add global zero()? + : t1_t2_ids(i1,i2) + , sign(sign) + {} + + // (id, -1) point on t1 + // (-1, id) point on t2 + // (id1, id2) intersection of edges + std::pair t1_t2_ids; + int sign; + typename Kernel::FT alpha; + + Orientation + orientation (const typename Kernel::Point_3& p1, // source of edge edge_ids1 + const typename Kernel::Point_3& q1, // target of edge edge_ids1 + const typename Kernel::Point_3& r1, + int edge_id1, + const typename Kernel::Point_3& p2, + const typename Kernel::Point_3& q2, + const typename Kernel::Point_3& r2, + const Kernel& k) const + { + if (t1_t2_ids.first!=-1) + { + if (t1_t2_ids.second==-1) return ZERO; // it is a point on t1 + // this is an intersection point + if (sign == 0) + return POSITIVE; + if (sign == -1) + return edge_id1==t1_t2_ids.first+1?POSITIVE:NEGATIVE; + else + return edge_id1==t1_t2_ids.first+1?NEGATIVE:POSITIVE; + } + else + { + //this is an input point of t2 + typename Kernel::Coplanar_orientation_3 orient = k.coplanar_orientation_3_object(); + const typename Kernel::Point_3& query = point_from_id(p2,q2,r2,t1_t2_ids.second); + return orient(p1,q1,r1,query); + } + } + + int id1() const { return t1_t2_ids.first; } + int id2() const { return t1_t2_ids.second; } + + typename Kernel::Point_3 + point(const typename Kernel::Point_3& p1, + const typename Kernel::Point_3& q1, + const typename Kernel::Point_3& r1, + const typename Kernel::Point_3& p2, + const typename Kernel::Point_3& q2, + const typename Kernel::Point_3& r2, + const Kernel& k) const + { + if (t1_t2_ids.first==-1) + return point_from_id(p2,q2,r2,t1_t2_ids.second); + if (t1_t2_ids.second==-1) + return point_from_id(p1,q1,r1,t1_t2_ids.first); + + return k.construct_barycenter_3_object()(point_from_id(p2,q2,r2,(t1_t2_ids.second+1)%3), alpha, point_from_id(p2,q2,r2,t1_t2_ids.second)) ; + } +}; + template -void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p, - const typename Kernel::Point_3& q, - const typename Kernel::Point_3& r, +Point_on_triangle +intersection(const Point_on_triangle& p, + const Point_on_triangle& q, + int edge_id_t1, + const typename Kernel::Point_3& p1, + const typename Kernel::Point_3& q1, +// const typename Kernel::Point_3& r1, + const typename Kernel::Point_3& p2, + const typename Kernel::Point_3& q2, + const typename Kernel::Point_3& r2, + const Kernel& k) +{ + typedef Point_on_triangle Pot; + switch(p.id1()) + { + case -1: + { + switch(q.id1()) + { + case -1: // (-1, ip2) - (-1, iq2) + { + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, p.id2()), + Pot::point_from_id(p2, q2, r2, q.id2()), k); + int sgn = sign(alpha); + return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); // intersection with an original edge of t2 + } + default: + if (q.id2()!=-1) // (-1, ip2) - (iq1, iq2) + { + // we shorten an already cut edge + CGAL_assertion((p.id2()+1)%3 == q.id2()); + + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, p.id2()), + Pot::point_from_id(p2, q2, r2, q.id2()), k); + int sgn = sign(alpha); + return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); + } + // (-1, ip2) - (iq1, -1) + //vertex of t1, special case t1 edge passed thru a vertex of t2 + CGAL_assertion(edge_id_t1 == 2); + return Point_on_triangle(2, -1); // point on t1 has to be created from the intersection of edge 0 and edge 1 + } + } + default: + { + switch(p.id2()) + { + case -1: + { + switch(q.id1()) + { + case -1: // (ip1, -1) - (-1, iq2) + //vertex of t1, special case t1 edge passed thru a vertex of t2 + return Point_on_triangle(0, -1); + default: + { + CGAL_assertion(q.id2()!=-1); // (ip1, -1) - (iq2, -1) + //(ip1,-1), (iq1, iq2) + CGAL_assertion(edge_id_t1==2 && p.id1()==1); + return Point_on_triangle(q.id1()==1?2:0,-1); // vertex of t1 + } + } + } + default: + { + switch(q.id1()) + { + case -1: // (ip1, ip2) - (-1, iq2) + { + // we shorten an already cut edge + CGAL_assertion((q.id2()+1)%3 == p.id2()); + + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, p.id2()), k); + int sgn = sign(alpha); + return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); + } + default: + { + switch(q.id2()) + { + case -1: // (ip1, ip2) - (iq1, -1) + { + CGAL_assertion(edge_id_t1==2 && q.id1()==1); + return Point_on_triangle(p.id1()==1?2:0); // vertex of t1 + } + default: // (ip1, ip2) - (iq1, iq2) + return Point_on_triangle((p.id1()+1)%3==q.id1()?q.id1():p.id1(), -1); // vertex of t1 + } + } + } + } + } + } + } +} + +template +void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p1, + const typename Kernel::Point_3& q1, + const typename Kernel::Point_3& r1, + int edge_id, + const typename Kernel::Point_3& p2, + const typename Kernel::Point_3& q2, + const typename Kernel::Point_3& r2, const Kernel& k, - std::list& inter_pts) + std::list>& inter_pts) { - typedef typename std::list::iterator Iterator; + typedef typename std::list>::iterator Iterator; if(inter_pts.empty()) return; - typename Kernel::Coplanar_orientation_3 orient = k.coplanar_orientation_3_object(); - typename Kernel::Construct_line_3 line = k.construct_line_3_object(); - - //orient(p,q,r,r) is POSITIVE - std::map orientations; - for (Iterator it=inter_pts.begin();it!=inter_pts.end();++it) - orientations[ &(*it) ]=orient(p,q,r,*it); + //orient(p1,q1,r1,r1) is POSITIVE + std::map*,Orientation> orientations; // TODO skip map + for (const Point_on_triangle& pot : inter_pts) + orientations[ &pot ]=pot.orientation(p1,q1,r1,edge_id,p2,q2,r2,k); - CGAL_kernel_assertion_code(int pt_added = 0;) + CGAL_kernel_assertion_code(int pt_added = 0); - const typename Kernel::Point_3* prev = &(*boost::prior(inter_pts.end())); - Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : boost::prior(inter_pts.end()); + Iterator prev = std::prev(inter_pts.end()); + Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : std::prev(inter_pts.end()); for(Iterator it=inter_pts.begin(); it!=stop; ++it) { - const typename Kernel::Point_3& curr = *it; - Orientation or_prev = orientations[prev], - or_curr = orientations[&curr]; + Orientation or_prev = orientations[&(*prev)], + or_curr = orientations[&(*it)]; if((or_prev == POSITIVE && or_curr == NEGATIVE) || (or_prev == NEGATIVE && or_curr == POSITIVE)) { - typename Intersection_traits::result_type - obj = intersection(line(p,q), line(*prev,curr), k); - - // assert "not empty" - CGAL_kernel_assertion(bool(obj)); + Point_on_triangle new_pt = intersection(*prev, *it, edge_id, p1, q1, p2, q2, r2, k); - const typename Kernel::Point_3* inter = intersect_get(obj); - CGAL_kernel_assertion(inter != nullptr); - - prev = &(*inter_pts.insert(it,*inter)); - orientations[prev] = COLLINEAR; - CGAL_kernel_assertion_code(++pt_added;) + prev = inter_pts.insert(it,new_pt); + orientations[&(*prev)] = COLLINEAR; + CGAL_assertion_code(++pt_added); } - prev = &(*it); + prev = it; } CGAL_kernel_assertion(pt_added<3); @@ -98,35 +301,41 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, const typename K::Triangle_3& t2, const K& k) { - const typename K::Point_3& p = t1.vertex(0), - q = t1.vertex(1), - r = t1.vertex(2); + const typename K::Point_3& p1 = t1.vertex(0), + q1 = t1.vertex(1), + r1 = t1.vertex(2); + + const typename K::Point_3& p2 = t2.vertex(0), + q2 = t2.vertex(1), + r2 = t2.vertex(2); - std::list inter_pts; - inter_pts.push_back(t2.vertex(0)); - inter_pts.push_back(t2.vertex(1)); - inter_pts.push_back(t2.vertex(2)); + std::list> inter_pts; + inter_pts.push_back(Point_on_triangle(-1,0)); + inter_pts.push_back(Point_on_triangle(-1,1)); + inter_pts.push_back(Point_on_triangle(-1,2)); //intersect t2 with the three half planes which intersection defines t1 - intersection_coplanar_triangles_cutoff(p,q,r,k,inter_pts); //line pq - intersection_coplanar_triangles_cutoff(q,r,p,k,inter_pts); //line qr - intersection_coplanar_triangles_cutoff(r,p,q,k,inter_pts); //line rp + intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,inter_pts); //line pq + intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,inter_pts); //line qr + intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,inter_pts); //line rp + auto point = [&](const Point_on_triangle& pot){ return pot.point(p1,q1,r1,p2,q2,r2,k); }; switch(inter_pts.size()) { case 0: return intersection_return(); case 1: - return intersection_return(*inter_pts.begin()); + return intersection_return(point(*inter_pts.begin())); case 2: return intersection_return( - k.construct_segment_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin())) ); + k.construct_segment_3_object()(point(*inter_pts.begin()), point(*std::next(inter_pts.begin()))) ); case 3: return intersection_return( - k.construct_triangle_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin()), *boost::prior(inter_pts.end())) ); + k.construct_triangle_3_object()(point(*inter_pts.begin()), point(*std::next(inter_pts.begin())), point(*std::prev(inter_pts.end()))) ); default: return intersection_return( - std::vector(inter_pts.begin(),inter_pts.end())); + std::vector(boost::make_transform_iterator(inter_pts.begin(), point), + boost::make_transform_iterator(inter_pts.end(), point))); } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index ae9858ae77d5..6d0334d93661 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,8 +36,8 @@ #include -// #define TEST_RESOLVE_INTERSECTION -// #define DEDUPLICATE_SEGMENTS +//#define TEST_RESOLVE_INTERSECTION +//#define DEDUPLICATE_SEGMENTS namespace CGAL { namespace Polygon_mesh_processing { @@ -259,6 +259,9 @@ void collect_intersections(const std::array& t1, if (ori[0]== COPLANAR && ori[1]==COPLANAR && ori[2]==COPLANAR) { coplanar_intersections(t1, t2, inter_pts); + for (auto p : inter_pts) + if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); + return; } @@ -283,6 +286,11 @@ void collect_intersections(const std::array& t1, std::sort(inter_pts.begin(), inter_pts.end()); auto last = std::unique(inter_pts.begin(), inter_pts.end()); inter_pts.erase(last, inter_pts.end()); + + + for (auto p : inter_pts) + if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); + } ////////////////////////////////// @@ -300,6 +308,10 @@ void generate_subtriangles(std::size_t ti, const std::vector>& triangles, std::vector>& new_triangles) { + //~ std::cout << "generate_subtriangles()\n"; + std::cout << std::setprecision(17); + + typedef CGAL::Projection_traits_3 P_traits; typedef CGAL::Exact_intersections_tag Itag; @@ -395,7 +407,7 @@ void generate_subtriangles(std::size_t ti, points_on_segments[i].push_back(*pt_ptr); points_on_segments[j].push_back(*pt_ptr); - //~ std::cout << "new inter " << *pt_ptr << "\n"; + //~ std::cout << "new inter " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; } } @@ -417,7 +429,7 @@ void generate_subtriangles(std::size_t ti, points_on_segments[i].push_back(*pt_ptr); points_on_segments[j].push_back(*pt_ptr); - //~ std::cout << "new inter bis" << *pt_ptr << "\n"; + //~ std::cout << "new inter bis " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; } else { @@ -428,6 +440,8 @@ void generate_subtriangles(std::size_t ti, points_on_segments[i].push_back(seg_ptr->target()); points_on_segments[j].push_back(seg_ptr->target()); + //~ std::cout << "new inter seg " << *seg_ptr << " (" << depth(*seg_ptr) << ")" << "\n"; + } else throw std::runtime_error("BOOM\n"); @@ -537,6 +551,20 @@ void generate_subtriangles(std::size_t ti, } } + //~ int max_degree = 0; + //~ for (const auto p : cst_points) + //~ max_degree = std::max(max_degree, depth(p)); + //~ std::cout << "max_degree " << max_degree << "\n"; + + //~ if (max_degree > 10){ + //~ for (const auto p : cst_points) + //~ std::cout << " -- " << p << "(" << depth(p) << ")\n"; + //~ std::cout << "segments:\n"; + //~ for (auto s : segments) + //~ std::cout << " " << depth(s[0]) << " " << depth(s[1]) << "\n"; + //~ exit(1); + //~ } + cdt.insert_constraints(cst_points.begin(), cst_points.end(), csts.begin(), csts.end()); std::vector> no_inter_segments; From 8e050bdb49c5268af0e12bb48bcf34edd01db96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 1 Mar 2023 15:39:28 +0100 Subject: [PATCH 0173/1398] fix various bug and add debug triangle_3_triangle_3_intersection now passes --- .../Triangle_3_Triangle_3_intersection.h | 131 +++++++++++++----- 1 file changed, 98 insertions(+), 33 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index d4e467a07986..55610e867ff3 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -14,6 +14,8 @@ #ifndef CGAL_INTERNAL_INTERSECTIONS_TRIANGLE_3_TRIANGLE_3_INTERSECTION_H #define CGAL_INTERNAL_INTERSECTIONS_TRIANGLE_3_TRIANGLE_3_INTERSECTION_H +//#define CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + #include #include #include @@ -74,21 +76,20 @@ struct Point_on_triangle } } - Point_on_triangle(int i1, int i2=-1, int sign=0, typename Kernel::FT alpha = 0.) // TODO add global zero()? + Point_on_triangle(int i1, int i2=-1, typename Kernel::FT alpha = 0.) // TODO add global zero()? : t1_t2_ids(i1,i2) - , sign(sign) + , alpha(alpha) {} // (id, -1) point on t1 // (-1, id) point on t2 // (id1, id2) intersection of edges std::pair t1_t2_ids; - int sign; typename Kernel::FT alpha; Orientation - orientation (const typename Kernel::Point_3& p1, // source of edge edge_ids1 - const typename Kernel::Point_3& q1, // target of edge edge_ids1 + orientation (const typename Kernel::Point_3& p1, // source of edge edge_id1 + const typename Kernel::Point_3& q1, // target of edge edge_id1 const typename Kernel::Point_3& r1, int edge_id1, const typename Kernel::Point_3& p2, @@ -98,15 +99,21 @@ struct Point_on_triangle { if (t1_t2_ids.first!=-1) { - if (t1_t2_ids.second==-1) return ZERO; // it is a point on t1 + if (t1_t2_ids.second==-1) + return (edge_id1==t1_t2_ids.first || (edge_id1+1)%3==t1_t2_ids.first) ? ZERO:POSITIVE; // it is a point on t1 // this is an intersection point - if (sign == 0) - return POSITIVE; - if (sign == -1) - return edge_id1==t1_t2_ids.first+1?POSITIVE:NEGATIVE; - else - return edge_id1==t1_t2_ids.first+1?NEGATIVE:POSITIVE; - } + + if (t1_t2_ids.first==edge_id1) + return ZERO; + if (t1_t2_ids.first==(edge_id1+1)%3) + { + if (alpha==0) return ZERO; + return alpha>=0 ? POSITIVE:NEGATIVE; + } + CGAL_assertion((t1_t2_ids.first+1)%3==edge_id1); + if (alpha==1) return ZERO; + return alpha<=1?POSITIVE:NEGATIVE; + } else { //this is an input point of t2 @@ -150,6 +157,11 @@ intersection(const Point_on_triangle& p, const typename Kernel::Point_3& r2, const Kernel& k) { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " calling intersection: "; + std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "])-"; + std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1 << "\n"; +#endif typedef Point_on_triangle Pot; switch(p.id1()) { @@ -163,21 +175,23 @@ intersection(const Point_on_triangle& p, coplanar_segment_segment_alpha_intersection(p1, q1, Pot::point_from_id(p2, q2, r2, p.id2()), Pot::point_from_id(p2, q2, r2, q.id2()), k); - int sgn = sign(alpha); - return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); // intersection with an original edge of t2 + return Point_on_triangle(edge_id_t1, p.id2(), alpha); // intersection with an original edge of t2 } default: if (q.id2()!=-1) // (-1, ip2) - (iq1, iq2) { - // we shorten an already cut edge - CGAL_assertion((p.id2()+1)%3 == q.id2()); - - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, p.id2()), - Pot::point_from_id(p2, q2, r2, q.id2()), k); - int sgn = sign(alpha); - return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); + if (p.id2() == q.id2() || p.id2() == (q.id2()+1)%3) + { + // points are on the same edge of t2 --> we shorten an already cut edge + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); + + return Point_on_triangle(edge_id_t1, q.id2(), alpha); + } + // point of t1 + return Point_on_triangle((q.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); } // (-1, ip2) - (iq1, -1) //vertex of t1, special case t1 edge passed thru a vertex of t2 @@ -211,15 +225,18 @@ intersection(const Point_on_triangle& p, { case -1: // (ip1, ip2) - (-1, iq2) { - // we shorten an already cut edge - CGAL_assertion((q.id2()+1)%3 == p.id2()); + if (q.id2() == p.id2() || q.id2() == (p.id2()+1)%3) + { + // points are on the same edge of t2 --> we shorten an already cut edge + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, p.id2()), + Pot::point_from_id(p2, q2, r2, (p.id2()+1)%3), k); - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, q.id2()), - Pot::point_from_id(p2, q2, r2, p.id2()), k); - int sgn = sign(alpha); - return Point_on_triangle(edge_id_t1, p.id2(), sgn, alpha); + return Point_on_triangle(edge_id_t1, p.id2(), alpha); + } + // point of t1 + return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); } default: { @@ -231,7 +248,8 @@ intersection(const Point_on_triangle& p, return Point_on_triangle(p.id1()==1?2:0); // vertex of t1 } default: // (ip1, ip2) - (iq1, iq2) - return Point_on_triangle((p.id1()+1)%3==q.id1()?q.id1():p.id1(), -1); // vertex of t1 + CGAL_assertion(p.id1()==q.id1()); + return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 } } } @@ -252,6 +270,11 @@ void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p1, const Kernel& k, std::list>& inter_pts) { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " cutoff using e" << edge_id << ": " + << to_double(p1.x()) << " " << to_double(p1.y()) << " " << to_double(p1.z()) << " " + << to_double(q1.x()) << " " << to_double(q1.y()) << " " << to_double(q1.z()) << "\n"; +#endif typedef typename std::list>::iterator Iterator; if(inter_pts.empty()) @@ -262,6 +285,12 @@ void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p1, for (const Point_on_triangle& pot : inter_pts) orientations[ &pot ]=pot.orientation(p1,q1,r1,edge_id,p2,q2,r2,k); +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " Orientations:"; + for (const Point_on_triangle& pot : inter_pts) + std::cout << " " << orientations[ &pot ]; + std::cout << "\n"; +#endif CGAL_kernel_assertion_code(int pt_added = 0); Iterator prev = std::prev(inter_pts.end()); @@ -301,6 +330,22 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, const typename K::Triangle_3& t2, const K& k) { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + auto to_string = [](const typename K::Triangle_3& t) + { + std::stringstream sstr; + sstr << "4 " + << to_double(t[0].x()) << " " << to_double(t[0].y()) << " " << to_double(t[0].z()) << " " + << to_double(t[1].x()) << " " << to_double(t[1].y()) << " " << to_double(t[1].z()) << " " + << to_double(t[2].x()) << " " << to_double(t[2].y()) << " " << to_double(t[2].z()) << " " + << to_double(t[0].x()) << " " << to_double(t[0].y()) << " " << to_double(t[0].z()) << "\n"; + return sstr.str(); + }; + + std::cout << "intersection_coplanar_triangles\n"; + std::ofstream("/tmp/t1.polylines.txt") << to_string(t1) << "\n"; + std::ofstream("/tmp/t2.polylines.txt") << to_string(t2) << "\n"; +#endif const typename K::Point_3& p1 = t1.vertex(0), q1 = t1.vertex(1), r1 = t1.vertex(2); @@ -314,10 +359,30 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, inter_pts.push_back(Point_on_triangle(-1,1)); inter_pts.push_back(Point_on_triangle(-1,2)); +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + auto print_points = [&]() + { + for(auto p : inter_pts) std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) "; std::cout <<"\n"; + }; + std::cout << " ipts size: " << inter_pts.size() << "\n"; + print_points(); +#endif //intersect t2 with the three half planes which intersection defines t1 intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,inter_pts); //line pq +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << inter_pts.size() << "\n"; + print_points(); +#endif intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,inter_pts); //line qr +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << inter_pts.size() << "\n"; + print_points(); +#endif intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,inter_pts); //line rp +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << inter_pts.size() << "\n"; + print_points(); +#endif auto point = [&](const Point_on_triangle& pot){ return pot.point(p1,q1,r1,p2,q2,r2,k); }; switch(inter_pts.size()) From 0bf300d5c51ea71657925aec1a3e6721729cc3c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 1 Mar 2023 17:19:35 +0100 Subject: [PATCH 0174/1398] plug new coplanar triangle intersection code --- .../Polygon_mesh_processing/autorefinement.h | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 6d0334d93661..b87a04c8a6a2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -83,26 +83,44 @@ do_coplanar_segments_intersect(const std::array& s1, ////////////////////////////////// // imported from Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h - template void coplanar_intersections(const std::array& t1, const std::array& t2, std::vector& inter_pts) { - const typename K::Point_3& p = t1[0], q = t1[1], r = t1[2]; + const typename K::Point_3& p1 = t1[0], q1 = t1[1], r1 = t1[2]; + const typename K::Point_3& p2 = t2[0], q2 = t2[1], r2 = t2[2]; + + std::list> l_inter_pts; + l_inter_pts.push_back(Intersections::internal::Point_on_triangle(-1,0)); + l_inter_pts.push_back(Intersections::internal::Point_on_triangle(-1,1)); + l_inter_pts.push_back(Intersections::internal::Point_on_triangle(-1,2)); + +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + auto to_string = [](const auto& t) + { + std::stringstream sstr; + sstr << "4 " + << to_double(t[0].x()) << " " << to_double(t[0].y()) << " " << to_double(t[0].z()) << " " + << to_double(t[1].x()) << " " << to_double(t[1].y()) << " " << to_double(t[1].z()) << " " + << to_double(t[2].x()) << " " << to_double(t[2].y()) << " " << to_double(t[2].z()) << " " + << to_double(t[0].x()) << " " << to_double(t[0].y()) << " " << to_double(t[0].z()) << "\n"; + return sstr.str(); + }; - std::list l_inter_pts; - l_inter_pts.push_back(t2[0]); - l_inter_pts.push_back(t2[1]); - l_inter_pts.push_back(t2[2]); + std::cout << "intersection_coplanar_triangles\n"; + std::ofstream("/tmp/t1.polylines.txt") << to_string(t1) << "\n"; + std::ofstream("/tmp/t2.polylines.txt") << to_string(t2) << "\n"; +#endif //intersect t2 with the three half planes which intersection defines t1 K k; - Intersections::internal::intersection_coplanar_triangles_cutoff(p,q,r,k,l_inter_pts); //line pq - Intersections::internal::intersection_coplanar_triangles_cutoff(q,r,p,k,l_inter_pts); //line qr - Intersections::internal::intersection_coplanar_triangles_cutoff(r,p,q,k,l_inter_pts); //line rp + intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,l_inter_pts); //line p1q1 + intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,l_inter_pts); //line q1r1 + intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,l_inter_pts); //line r1p1 - inter_pts.assign(l_inter_pts.begin(), l_inter_pts.end()); + for (const Intersections::internal::Point_on_triangle& pot : l_inter_pts) + inter_pts.push_back( pot.point(p1,q1,r1,p2,q2,r2,k) ); } // imported from Polygon_mesh_processing/internal/Corefinement/intersect_triangle_segment_3.h From 4fa600bc5fbf357f071817c7e8a775e89d9b2fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 3 Mar 2023 10:33:16 +0100 Subject: [PATCH 0175/1398] bug fix --- .../internal/Triangle_3_Triangle_3_intersection.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 55610e867ff3..7c6ad7b95f82 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -33,6 +33,7 @@ namespace CGAL { namespace Intersections { namespace internal{ +//TODO: move into a functor template typename K::FT coplanar_segment_segment_alpha_intersection(const typename K::Point_3& p1, const typename K::Point_3& p2, // segment 1 @@ -248,8 +249,18 @@ intersection(const Point_on_triangle& p, return Point_on_triangle(p.id1()==1?2:0); // vertex of t1 } default: // (ip1, ip2) - (iq1, iq2) - CGAL_assertion(p.id1()==q.id1()); - return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 + { + CGAL_assertion(p.id1()==q.id1() || p.id2()==q.id2() ); + + if (p.id1()==q.id1()) + return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 + + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); + return Point_on_triangle(edge_id_t1, q.id2(), alpha); + } } } } From 2fade292146be00a4d383c8a0356802de81aa708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 3 Mar 2023 10:35:42 +0100 Subject: [PATCH 0176/1398] add more debug --- .../Polygon_mesh_processing/autorefinement.h | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index b87a04c8a6a2..c5f3ebb78905 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -38,6 +38,7 @@ //#define TEST_RESOLVE_INTERSECTION //#define DEDUPLICATE_SEGMENTS +//#define DEBUG_DEPTH namespace CGAL { namespace Polygon_mesh_processing { @@ -111,13 +112,31 @@ void coplanar_intersections(const std::array& t1, std::cout << "intersection_coplanar_triangles\n"; std::ofstream("/tmp/t1.polylines.txt") << to_string(t1) << "\n"; std::ofstream("/tmp/t2.polylines.txt") << to_string(t2) << "\n"; + auto print_points = [&]() + { + for(auto p : l_inter_pts) std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) "; std::cout <<"\n"; + }; + std::cout << " ipts size: " << l_inter_pts.size() << "\n"; + print_points(); #endif //intersect t2 with the three half planes which intersection defines t1 K k; intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,l_inter_pts); //line p1q1 +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << l_inter_pts.size() << "\n"; + print_points(); +#endif intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,l_inter_pts); //line q1r1 +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << l_inter_pts.size() << "\n"; + print_points(); +#endif intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,l_inter_pts); //line r1p1 +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " ipts size: " << l_inter_pts.size() << "\n"; + print_points(); +#endif for (const Intersections::internal::Point_on_triangle& pot : l_inter_pts) inter_pts.push_back( pot.point(p1,q1,r1,p2,q2,r2,k) ); @@ -277,8 +296,10 @@ void collect_intersections(const std::array& t1, if (ori[0]== COPLANAR && ori[1]==COPLANAR && ori[2]==COPLANAR) { coplanar_intersections(t1, t2, inter_pts); +#ifdef DEBUG_DEPTH for (auto p : inter_pts) - if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); + if (depth(p)>2) throw std::runtime_error("Depth is not 4: "+std::to_string(depth(p))); +#endif return; } @@ -308,7 +329,6 @@ void collect_intersections(const std::array& t1, for (auto p : inter_pts) if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); - } ////////////////////////////////// From f3e4a60f96be4fe94124a8c945a0bd3bd2f5ffb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 6 Mar 2023 14:03:24 +0100 Subject: [PATCH 0177/1398] fix intersection point computation --- .../internal/Triangle_3_Triangle_3_intersection.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 7c6ad7b95f82..ac376f443506 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -141,7 +141,7 @@ struct Point_on_triangle if (t1_t2_ids.second==-1) return point_from_id(p1,q1,r1,t1_t2_ids.first); - return k.construct_barycenter_3_object()(point_from_id(p2,q2,r2,(t1_t2_ids.second+1)%3), alpha, point_from_id(p2,q2,r2,t1_t2_ids.second)) ; + return k.construct_barycenter_3_object()(point_from_id(p1,q1,r1,(t1_t2_ids.first+1)%3), alpha, point_from_id(p1,q1,r1,t1_t2_ids.first)) ; } }; @@ -160,8 +160,8 @@ intersection(const Point_on_triangle& p, { #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " calling intersection: "; - std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "])-"; - std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1 << "\n"; + std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) -"; + std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1 << "\n"; #endif typedef Point_on_triangle Pot; switch(p.id1()) @@ -354,8 +354,8 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, }; std::cout << "intersection_coplanar_triangles\n"; - std::ofstream("/tmp/t1.polylines.txt") << to_string(t1) << "\n"; - std::ofstream("/tmp/t2.polylines.txt") << to_string(t2) << "\n"; + std::ofstream("/tmp/t1.polylines.txt") << std::setprecision(17) << to_string(t1) << "\n"; + std::ofstream("/tmp/t2.polylines.txt") << std::setprecision(17) << to_string(t2) << "\n"; #endif const typename K::Point_3& p1 = t1.vertex(0), q1 = t1.vertex(1), From f499c392664483298fb4c26bc587cce758671b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 6 Mar 2023 19:30:07 +0100 Subject: [PATCH 0178/1398] add a version with fixed dimension for projection --- .../Polygon_mesh_processing/autorefinement.h | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index c5f3ebb78905..7524c9c7f342 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -38,8 +38,13 @@ //#define TEST_RESOLVE_INTERSECTION //#define DEDUPLICATE_SEGMENTS +//#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH +#ifdef USE_FIXED_PROJECTION_TRAITS +#include +#endif + namespace CGAL { namespace Polygon_mesh_processing { @@ -337,7 +342,11 @@ void collect_intersections(const std::array& t1, ////////////////////////////////// ////////////////////////////////// -template +template void generate_subtriangles(std::size_t ti, std::vector>& segments, const std::vector& points, @@ -349,8 +358,11 @@ void generate_subtriangles(std::size_t ti, //~ std::cout << "generate_subtriangles()\n"; std::cout << std::setprecision(17); - +#ifdef USE_FIXED_PROJECTION_TRAITS + typedef ::CGAL::internal::Projection_traits_3 P_traits; +#else typedef CGAL::Projection_traits_3 P_traits; +#endif typedef CGAL::Exact_intersections_tag Itag; typedef CGAL::Constrained_Delaunay_triangulation_2set_point(t[2]); +#endif #ifdef TEST_RESOLVE_INTERSECTION //~ static std::ofstream debug("inter_segments.polylines.txt"); @@ -832,7 +852,31 @@ void autorefine_soup_output(const PointRange& input_points, if (all_segments[ti].empty() && all_points[ti].empty()) new_triangles.push_back(triangles[ti]); else + { + #ifdef USE_FIXED_PROJECTION_TRAITS + const std::array& t = triangles[ti]; + auto is_constant_in_dim = [](const std::array& t, int dim) + { + return t[0][dim]==t[1][dim] && t[0][dim]!=t[2][dim]; + }; + + typename EK::Vector_3 orth = CGAL::normal(t[0], t[1], t[2]); // TODO::avoid construction? + int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; + c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; + + if(c == 0) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } else if(c == 1) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } else if(c == 2) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + #else autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + #endif + } + + } // brute force output: create a soup, orient and to-mesh From 3abf7c401b67eefc2a2408dbac40c11f7e933203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 6 Mar 2023 19:31:26 +0100 Subject: [PATCH 0179/1398] add debug --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 7524c9c7f342..e5a7dbbb139e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -145,6 +145,19 @@ void coplanar_intersections(const std::array& t1, for (const Intersections::internal::Point_on_triangle& pot : l_inter_pts) inter_pts.push_back( pot.point(p1,q1,r1,p2,q2,r2,k) ); + +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::ofstream debug("interpts.xyz"); + debug << std::setprecision(17); + debug << l_inter_pts.size() << "\n"; + for (auto pot : l_inter_pts) + debug << pot.point(p1,q1,r1,p2,q2,r2,k) << "\n"; + debug.close(); + std::cout <<"check!\n"; + int i; + std::cin >> i; +#endif + } // imported from Polygon_mesh_processing/internal/Corefinement/intersect_triangle_segment_3.h From 8ff9f17a415524a52aa253b3c148ad45459de656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 13 Mar 2023 15:33:35 +0100 Subject: [PATCH 0180/1398] restore traits creation --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index e5a7dbbb139e..3bb845854ec2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -401,13 +401,14 @@ void generate_subtriangles(std::size_t ti, cdt.insert(t[1]); cdt.insert(t[2]); #else - P_traits cdt_traits(n); bool orientation_flipped = false; if ( typename EK::Less_xyz_3()(o+n,o) ) { n=-n; orientation_flipped = true; } + + P_traits cdt_traits(n); CDT cdt(cdt_traits); cdt.insert_outside_affine_hull(t[0]); cdt.insert_outside_affine_hull(t[1]); From 14105bbdd4319109f83b256b7af86e855870a487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 14 Mar 2023 13:56:54 +0100 Subject: [PATCH 0181/1398] always use local indices for range insertion of constraints --- .../Polygon_mesh_processing/autorefinement.h | 253 ++++++++++++------ 1 file changed, 167 insertions(+), 86 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 3bb845854ec2..a81b00f65a48 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -37,7 +37,8 @@ #include //#define TEST_RESOLVE_INTERSECTION -//#define DEDUPLICATE_SEGMENTS +#define DEDUPLICATE_SEGMENTS +//#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH @@ -45,6 +46,10 @@ #include #endif +#ifdef DEBUG_COUNTERS +#include +#endif + namespace CGAL { namespace Polygon_mesh_processing { @@ -55,28 +60,28 @@ enum Segment_inter_type { NO_INTERSECTION=0, COPLANAR_SEGMENTS, POINT_INTERSECTI template Segment_inter_type -do_coplanar_segments_intersect(const std::array& s1, - const std::array& s2, +do_coplanar_segments_intersect(const typename K::Point_3& s1_0, const typename K::Point_3& s1_1, + const typename K::Point_3& s2_0, const typename K::Point_3& s2_1, const K& k = K()) { // supporting_line intersects: points are coplanar typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); - ::CGAL::Orientation or1 = cpl_orient(s1[0], s1[1], s2[0]); - ::CGAL::Orientation or2 = cpl_orient(s1[0], s1[1], s2[1]); + ::CGAL::Orientation or1 = cpl_orient(s1_0, s1_1, s2_0); + ::CGAL::Orientation or2 = cpl_orient(s1_0, s1_1, s2_1); if(or1 == COLLINEAR && or2 == COLLINEAR) { // segments are collinear typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); - return (cln_order(s1[0], s2[0], s1[1]) || - cln_order(s1[0], s2[1], s1[1]) || - cln_order(s2[0], s1[0], s2[1])) ? COPLANAR_SEGMENTS : NO_INTERSECTION; + return (cln_order(s1_0, s2_0, s1_1) || + cln_order(s1_0, s2_1, s1_1) || + cln_order(s2_0, s1_0, s2_1)) ? COPLANAR_SEGMENTS : NO_INTERSECTION; } if(or1 != or2) { - or1 = cpl_orient(s2[0], s2[1], s1[0]); - return (or1 == COLLINEAR || or1 != cpl_orient(s2[0], s2[1], s1[1])) ? POINT_INTERSECTION : NO_INTERSECTION; + or1 = cpl_orient(s2_0, s2_1, s1_0); + return (or1 == COLLINEAR || or1 != cpl_orient(s2_0, s2_1, s1_1)) ? POINT_INTERSECTION : NO_INTERSECTION; } return NO_INTERSECTION; @@ -361,8 +366,8 @@ template void generate_subtriangles(std::size_t ti, - std::vector>& segments, - const std::vector& points, + std::vector>& segments, + std::vector& points, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, const std::vector>& triangles, @@ -376,13 +381,14 @@ void generate_subtriangles(std::size_t ti, #else typedef CGAL::Projection_traits_3 P_traits; #endif - typedef CGAL::Exact_intersections_tag Itag; - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; + + typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; @@ -416,6 +422,35 @@ void generate_subtriangles(std::size_t ti, v->set_point(t[2]); #endif +#ifdef DEBUG_COUNTERS + struct Counter + { + int c1=0; + int c2=0; + int c3=0; + int c4=0; + int total=0; + ~Counter() + { + std::cout << "intersection of 3 planes: " << c1 << "\n"; + std::cout << "coplanar segment intersection : " << c2 << "\n"; + std::cout << "coplanar segment overlap: " << c3 << "\n"; + std::cout << "no intersection: " << c4 << "\n"; + std::cout << "# pairs of segments : " << total << "\n"; + std::cout << "time computing segment intersections: " << timer1.time() << "\n"; + std::cout << "time sorting intersection points: " << timer2.time() << "\n"; + std::cout << "time for cdt of constraints: " << timer3.time() << "\n"; + } + CGAL::Real_timer timer1, timer2, timer3; + }; + + static Counter counter; +#define COUNTER_INSTRUCTION(X) X +#else +#define COUNTER_INSTRUCTION(X) +#endif + + #ifdef TEST_RESOLVE_INTERSECTION //~ static std::ofstream debug("inter_segments.polylines.txt"); //~ debug.precision(17); @@ -458,14 +493,33 @@ void generate_subtriangles(std::size_t ti, return typename EK::Plane_3(t[0], t[1], t[2]); }; - std::vector< std::vector > points_on_segments(nbs); + std::vector< std::vector > points_on_segments(nbs); + + COUNTER_INSTRUCTION(counter.timer1.start();) + + std::map point_id_map; + + for (std::size_t pid=0; pidsecond; + }; + + for (std::size_t i = 0; i(segments[i], segments[j]); + Segment_inter_type seg_inter_type = + do_coplanar_segments_intersect(points[segments[i].first], points[segments[i].second], + points[segments[j].first], points[segments[j].second]); switch(seg_inter_type) { case POINT_INTERSECTION: @@ -476,9 +530,11 @@ void generate_subtriangles(std::size_t ti, if (const typename EK::Point_3* pt_ptr = boost::get(&(*res))) { - points_on_segments[i].push_back(*pt_ptr); - points_on_segments[j].push_back(*pt_ptr); - + COUNTER_INSTRUCTION(++counter.c1;) + std::size_t pid = get_point_id(*pt_ptr); + points_on_segments[i].push_back(pid); + points_on_segments[j].push_back(pid); + break; //~ std::cout << "new inter " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; } @@ -490,30 +546,35 @@ void generate_subtriangles(std::size_t ti, //~ std::cout << "coplanar inter: " << i << " " << j << "\n"; - typename EK::Segment_3 s1(segments[i][0], segments[i][1]); - typename EK::Segment_3 s2(segments[j][0], segments[j][1]);// TODO: avoid this construction + typename EK::Segment_3 s1(points[segments[i].first], points[segments[i].second]); + typename EK::Segment_3 s2(points[segments[j].first], points[segments[j].second]);// TODO: avoid this construction auto inter = CGAL::intersection(s1, s2); if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) { - points_on_segments[i].push_back(*pt_ptr); - points_on_segments[j].push_back(*pt_ptr); - + COUNTER_INSTRUCTION(++counter.c2;) + std::size_t pid = get_point_id(*pt_ptr); + points_on_segments[i].push_back(pid); + points_on_segments[j].push_back(pid); + break; //~ std::cout << "new inter bis " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; } else { if (const typename EK::Segment_3* seg_ptr = boost::get(&(*inter))) { - points_on_segments[i].push_back(seg_ptr->source()); - points_on_segments[j].push_back(seg_ptr->source()); - points_on_segments[i].push_back(seg_ptr->target()); - points_on_segments[j].push_back(seg_ptr->target()); - + //TODO HERE WE SHOULD IMPROVE TO AVOID RECOMPUTING SEGMENTS ENDPOINTS + COUNTER_INSTRUCTION(++counter.c3;) + std::size_t src_pid = get_point_id(seg_ptr->source()); + std::size_t tgt_pid = get_point_id(seg_ptr->target()); + points_on_segments[i].push_back(src_pid); + points_on_segments[j].push_back(src_pid); + points_on_segments[i].push_back(tgt_pid); + points_on_segments[j].push_back(tgt_pid); + break; //~ std::cout << "new inter seg " << *seg_ptr << " (" << depth(*seg_ptr) << ")" << "\n"; - } else throw std::runtime_error("BOOM\n"); @@ -564,24 +625,26 @@ void generate_subtriangles(std::size_t ti, //~ debug << "4 " << triangles[ti] << " " << triangles[ti][0] << "\n"; //~ exit(1); } - break; +// break; default: + COUNTER_INSTRUCTION(++counter.c4;) break; } } + COUNTER_INSTRUCTION(++counter.total;) } } - - std::vector cst_points; - std::vector> csts; + COUNTER_INSTRUCTION(counter.timer1.stop();) + COUNTER_INSTRUCTION(counter.timer2.start();) + std::size_t nb_new_segments=0; for (std::size_t i = 0; i& s = segments[i]; - typename EK::Point_3 src = s[0], tgt=s[1]; + std::size_t src_id = segments[i].first, tgt_id = segments[i].second; + typename EK::Point_3 src = points[src_id], tgt=points[tgt_id]; if (src.x()==tgt.x()) { coord=1; @@ -589,15 +652,23 @@ void generate_subtriangles(std::size_t ti, coord==2; } if (src[coord]>tgt[coord]) + { + std::swap(src_id, tgt_id); std::swap(src, tgt); + } - std::sort(points_on_segments[i].begin(), points_on_segments[i].end(), [coord](const typename EK::Point_3& p, const typename EK::Point_3& q){return p[coord]> no_inter_segments; - no_inter_segments.reserve(nbs); + // now fill segments with new segments + segments.reserve(segments.size()+nb_new_segments); for (std::size_t i = 0; i to_input; - std::map point_id_map; -#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - std::vector exact_soup_points; -#endif - - auto get_point_id = [&](const typename EK::Point_3& pt) - { - auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); - if (insert_res.second) - { - soup_points.push_back(to_input(pt)); -#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.push_back(pt); -#endif - } - return insert_res.first->second; - }; - - // filter duplicated segments #ifdef DEDUPLICATE_SEGMENTS + // deduplicate inserted segments + std::vector>> all_segments_ids(all_segments.size()); for(std::size_t ti=0; ti point_id_map; + auto get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, all_points[ti].size())); + if (insert_res.second) + all_points[ti].push_back(pt); + return insert_res.first->second; + }; + std::size_t nbs = all_segments[ti].size(); std::vector> filtered_segments; std::vector filtered_in_triangle_ids; @@ -841,19 +904,16 @@ void autorefine_soup_output(const PointRange& input_points, { EK::Point_3 src = all_segments[ti][si][0], tgt = all_segments[ti][si][1]; + std::size_t src_id = get_point_id(src), tgt_id=get_point_id(tgt); if (segset.insert( - CGAL::make_sorted_pair( get_point_id(src), - get_point_id(tgt))).second) + CGAL::make_sorted_pair(src_id, tgt_id)).second) { - filtered_segments.push_back(all_segments[ti][si]); + all_segments_ids[ti].emplace_back(src_id, tgt_id); filtered_in_triangle_ids.push_back(all_in_triangle_ids[ti][si]); } } - if (filtered_segments.size()!=nbs) - { - filtered_segments.swap(all_segments[ti]); + if (all_segments_ids[ti].size()!=nbs) filtered_in_triangle_ids.swap(all_in_triangle_ids[ti]); - } } } #endif @@ -886,7 +946,7 @@ void autorefine_soup_output(const PointRange& input_points, autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); } #else - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); #endif } @@ -896,11 +956,31 @@ void autorefine_soup_output(const PointRange& input_points, // brute force output: create a soup, orient and to-mesh CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); + Cartesian_converter to_input; + std::map point_id_map; +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + std::vector exact_soup_points; +#endif + + auto get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); + if (insert_res.second) + { + soup_points.push_back(to_input(pt)); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.push_back(pt); +#endif + } + return insert_res.first->second; + }; + std::vector input_point_ids; input_point_ids.reserve(input_points.size()); for (const auto& p : input_points) input_point_ids.push_back(get_point_id(to_exact(get(pm,p)))); + // raw copy of input triangles with no intersection for (Input_TID f=0; f& t : new_triangles) { soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); From 003910ee220262b370b31bfe525ecb20bf2e8a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 14 Mar 2023 18:10:04 +0100 Subject: [PATCH 0182/1398] fix typo --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index a81b00f65a48..e18cf1982b2b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -663,7 +663,7 @@ void generate_subtriangles(std::size_t ti, [&](std::size_t id1, std::size_t id2) { if (id1==id2) return false; - return points[id1][coord] Date: Tue, 14 Mar 2023 18:32:31 +0100 Subject: [PATCH 0183/1398] dramatic typo --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index e18cf1982b2b..d40fce82d2bc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -649,7 +649,7 @@ void generate_subtriangles(std::size_t ti, { coord=1; if (src.y()==tgt.y()) - coord==2; + coord=2; } if (src[coord]>tgt[coord]) { From 5defd784cc0dae96083708f8b2454c2249509dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 15 Mar 2023 14:24:37 +0100 Subject: [PATCH 0184/1398] better treatment of intersection between segments --- .../Polygon_mesh_processing/autorefinement.h | 447 ++++++++++++++---- 1 file changed, 346 insertions(+), 101 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index d40fce82d2bc..711c3d82ce0a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -56,13 +56,59 @@ namespace Polygon_mesh_processing { #ifndef DOXYGEN_RUNNING namespace autorefine_impl { -enum Segment_inter_type { NO_INTERSECTION=0, COPLANAR_SEGMENTS, POINT_INTERSECTION }; + +enum Segment_inter_type_old { NO_INTERSECTION_OLD=0, COPLANAR_SEGMENTS, POINT_INTERSECTION_OLD }; +enum Segment_inter_type { NO_INTERSECTION=0, + POINT_INTERSECTION, + POINT_P, + POINT_Q, + POINT_R, + POINT_S, + COPLANAR_SEGMENT_PQ, + COPLANAR_SEGMENT_RS, + COPLANAR_SEGMENT_PS, + COPLANAR_SEGMENT_QS, + COPLANAR_SEGMENT_PR, + COPLANAR_SEGMENT_QR, + }; + + + +std::string print_enum(Segment_inter_type_old s) +{ + switch(s) + { + case NO_INTERSECTION_OLD: return "NO_INTERSECTION_OLD"; + case COPLANAR_SEGMENTS: return "COPLANAR_SEGMENTS"; + case POINT_INTERSECTION_OLD: return "POINT_INTERSECTION_OLD"; + } +} + +std::string print_enum(Segment_inter_type s) +{ + switch(s) + { + case NO_INTERSECTION: return "NO_INTERSECTION"; + case POINT_INTERSECTION: return "POINT_INTERSECTION"; + case POINT_P: return "POINT_P"; + case POINT_Q: return "POINT_Q"; + case POINT_R: return "POINT_R"; + case POINT_S: return "POINT_S"; + case COPLANAR_SEGMENT_PQ: return "COPLANAR_SEGMENT_PQ"; + case COPLANAR_SEGMENT_RS: return "COPLANAR_SEGMENT_RS"; + case COPLANAR_SEGMENT_PS: return "COPLANAR_SEGMENT_PS"; + case COPLANAR_SEGMENT_QS: return "COPLANAR_SEGMENT_QS"; + case COPLANAR_SEGMENT_PR: return "COPLANAR_SEGMENT_PR"; + case COPLANAR_SEGMENT_QR: return "COPLANAR_SEGMENT_QR"; + } +} + template -Segment_inter_type -do_coplanar_segments_intersect(const typename K::Point_3& s1_0, const typename K::Point_3& s1_1, - const typename K::Point_3& s2_0, const typename K::Point_3& s2_1, - const K& k = K()) +Segment_inter_type_old +do_coplanar_segments_intersect_old(const typename K::Point_3& s1_0, const typename K::Point_3& s1_1, + const typename K::Point_3& s2_0, const typename K::Point_3& s2_1, + const K& k = K()) { // supporting_line intersects: points are coplanar typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); @@ -75,13 +121,155 @@ do_coplanar_segments_intersect(const typename K::Point_3& s1_0, const typename K typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); return (cln_order(s1_0, s2_0, s1_1) || cln_order(s1_0, s2_1, s1_1) || - cln_order(s2_0, s1_0, s2_1)) ? COPLANAR_SEGMENTS : NO_INTERSECTION; + cln_order(s2_0, s1_0, s2_1)) ? COPLANAR_SEGMENTS : NO_INTERSECTION_OLD; } if(or1 != or2) { or1 = cpl_orient(s2_0, s2_1, s1_0); - return (or1 == COLLINEAR || or1 != cpl_orient(s2_0, s2_1, s1_1)) ? POINT_INTERSECTION : NO_INTERSECTION; + return (or1 == COLLINEAR || or1 != cpl_orient(s2_0, s2_1, s1_1)) ? POINT_INTERSECTION_OLD : NO_INTERSECTION_OLD; + } + + return NO_INTERSECTION_OLD; +} + + +// test intersection in the interior of segment pq and rs with pq and rs being coplanar segments +// note that for coplanar cases, we might report identical endpoints +template +Segment_inter_type +do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, + std::size_t ri, std::size_t si, + const std::vector& points, + const K& k = K()) +{ + typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); + typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); + + const typename K::Point_3& p=points[pi]; + const typename K::Point_3& q=points[qi]; + const typename K::Point_3& r=points[ri]; + const typename K::Point_3& s=points[si]; + + // first handle case of shared endpoints + if (pi==ri) + { + if (si==qi || cpl_orient(p, q, s)!=COPLANAR) return NO_INTERSECTION; + // can be s, q or nothing + if (cln_order(p,s,q)) + return POINT_S; + if (cln_order(p,q,s)) + return POINT_Q; + return NO_INTERSECTION; + } + else + { + if(pi==si) + { + if (qi==ri || cpl_orient(p, q, r)!=COPLANAR) return NO_INTERSECTION; + // can be r, q or nothing + if (cln_order(p,r,q)) + return POINT_R; + if (cln_order(p,q,r)) + return POINT_Q; + return NO_INTERSECTION; + } + else + { + if (qi==ri) + { + if (pi==si || cpl_orient(p, q, s)!=COPLANAR) return NO_INTERSECTION; + // can be p, s or nothing + if (cln_order(p,s,q)) + return POINT_S; + if (cln_order(q,p,s)) + return POINT_P; + return NO_INTERSECTION; + } + else + { + if (qi==si) + { + if (pi==ri || cpl_orient(p, q, r)!=COPLANAR) return NO_INTERSECTION; + // can be p, r or nothing + if (cln_order(p,r,q)) + return POINT_R; + if (cln_order(q,p,r)) + return POINT_P; + return NO_INTERSECTION; + } + } + } + } + + // supporting_line intersects: points are coplanar + ::CGAL::Orientation pqr = cpl_orient(p, q, r); + ::CGAL::Orientation pqs = cpl_orient(p, q, s); + + if(pqr == COLLINEAR && pqs == COLLINEAR) + { + // segments are collinear + bool r_in_pq = cln_order(p, r, q), + s_in_pq = cln_order(p, s, q), + p_in_rs = cln_order(r, p, s); + + if (r_in_pq) + { + // intersection could be rs, pr or qr + if (s_in_pq) + return COPLANAR_SEGMENT_RS; + if (p_in_rs) + return COPLANAR_SEGMENT_PR; + CGAL_assertion(cln_order(r, q, s)); + return COPLANAR_SEGMENT_QR; + } + else + { + if (s_in_pq) + { + // intersection could be ps or qs + if (p_in_rs) + return COPLANAR_SEGMENT_PS; + CGAL_assertion(cln_order(r, q, s)); + return COPLANAR_SEGMENT_QS; + } + else + if (p_in_rs) + { + CGAL_assertion(cln_order(r, q, s)); + return COPLANAR_SEGMENT_PQ; + } + } + return NO_INTERSECTION; + } + + if(pqr != pqs) + { + ::CGAL::Orientation rsp = cpl_orient(r, s, p); + + if (rsp==COLLINEAR) + { + if (pqr==COLLINEAR || pqs==COLLINEAR) + { + throw std::runtime_error("no expected #1"); + } + return POINT_P; + } + ::CGAL::Orientation rsq = cpl_orient(r, s, q); + if (rsq==COLLINEAR) + { + if (pqr==COLLINEAR || pqs==COLLINEAR) + { + throw std::runtime_error("no expected #2"); + } + return POINT_Q; + } + if (rsp!=rsq) + { + if (pqr==COLLINEAR) return POINT_R; + if (pqs==COLLINEAR) return POINT_S; + return POINT_INTERSECTION; + } } return NO_INTERSECTION; @@ -429,6 +617,7 @@ void generate_subtriangles(std::size_t ti, int c2=0; int c3=0; int c4=0; + int c5=0; int total=0; ~Counter() { @@ -436,6 +625,7 @@ void generate_subtriangles(std::size_t ti, std::cout << "coplanar segment intersection : " << c2 << "\n"; std::cout << "coplanar segment overlap: " << c3 << "\n"; std::cout << "no intersection: " << c4 << "\n"; + std::cout << "intersection filtered with bboxes: " << c5 << "\n"; std::cout << "# pairs of segments : " << total << "\n"; std::cout << "time computing segment intersections: " << timer1.time() << "\n"; std::cout << "time sorting intersection points: " << timer2.time() << "\n"; @@ -480,13 +670,6 @@ void generate_subtriangles(std::size_t ti, if (!segments.empty()) { std::size_t nbs = segments.size(); - //~ std::cout << "nbs " << nbs << "\n"; - - //~ if (nbs==8) - //~ { - //~ for (std::size_t i = 0; i& t) { @@ -510,20 +693,69 @@ void generate_subtriangles(std::size_t ti, return insert_res.first->second; }; - + std::vector point_boxes(points.size()); + for (std::size_t i = 0; i segment_boxes(nbs); + for (std::size_t i = 0; i(points[segments[i].first], points[segments[i].second], - points[segments[j].first], points[segments[j].second]); + do_coplanar_segments_intersect(segments[i].first, segments[i].second, + segments[j].first, segments[j].second, + points); + + + //~ Segment_inter_type_old seg_inter_type_old = + //~ do_coplanar_segments_intersect_old(points[segments[i].first], points[segments[i].second], + //~ points[segments[j].first], points[segments[j].second]); + + + //~ std::cout << std::setprecision(17); + //~ std::cout << points[segments[i].first] << " " << points[segments[i].second] << "\n"; + //~ std::cout << points[segments[j].first] << " " << points[segments[j].second] << "\n"; + //~ std::cout << "OLD: " << print_enum(seg_inter_type_old) << "\n"; + //~ std::cout << "NEW: " << print_enum(seg_inter_type) << "\n"; + switch(seg_inter_type) { + case POINT_P: + { + points_on_segments[j].push_back(segments[i].first); + break; + } + case POINT_Q: + { + points_on_segments[j].push_back(segments[i].second); + break; + } + case POINT_R: + { + points_on_segments[i].push_back(segments[j].first); + break; + } + case POINT_S: + { + points_on_segments[i].push_back(segments[j].second); + break; + } case POINT_INTERSECTION: { + // TODO: use version with no variant auto res = CGAL::intersection(supporting_plane(triangles[in_triangle_ids[i]]), supporting_plane(triangles[in_triangle_ids[j]]), supporting_plane(triangles[ti])); @@ -534,101 +766,78 @@ void generate_subtriangles(std::size_t ti, std::size_t pid = get_point_id(*pt_ptr); points_on_segments[i].push_back(pid); points_on_segments[j].push_back(pid); - break; - //~ std::cout << "new inter " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; - - } - } - // break; No break because of the coplanar case - case COPLANAR_SEGMENTS: - { - // We can have hard cases if two triangles are coplanar.... - - //~ std::cout << "coplanar inter: " << i << " " << j << "\n"; - - typename EK::Segment_3 s1(points[segments[i].first], points[segments[i].second]); - typename EK::Segment_3 s2(points[segments[j].first], points[segments[j].second]);// TODO: avoid this construction - auto inter = CGAL::intersection(s1, s2); - - if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); - - if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) - { - COUNTER_INSTRUCTION(++counter.c2;) - std::size_t pid = get_point_id(*pt_ptr); - points_on_segments[i].push_back(pid); - points_on_segments[j].push_back(pid); - break; - //~ std::cout << "new inter bis " << *pt_ptr << " (" << depth(points_on_segments[i].back()) << ")" << "\n"; } else { - if (const typename EK::Segment_3* seg_ptr = boost::get(&(*inter))) + COUNTER_INSTRUCTION(++counter.c2;) + //TODO find better! + typename EK::Segment_3 s1(points[segments[i].first], points[segments[i].second]); + typename EK::Segment_3 s2(points[segments[j].first], points[segments[j].second]);// TODO: avoid this construction + auto inter = CGAL::intersection(s1, s2); + if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); + if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) { - //TODO HERE WE SHOULD IMPROVE TO AVOID RECOMPUTING SEGMENTS ENDPOINTS - COUNTER_INSTRUCTION(++counter.c3;) - std::size_t src_pid = get_point_id(seg_ptr->source()); - std::size_t tgt_pid = get_point_id(seg_ptr->target()); - points_on_segments[i].push_back(src_pid); - points_on_segments[j].push_back(src_pid); - points_on_segments[i].push_back(tgt_pid); - points_on_segments[j].push_back(tgt_pid); + std::size_t pid = get_point_id(*pt_ptr); + points_on_segments[i].push_back(pid); + points_on_segments[j].push_back(pid); break; - //~ std::cout << "new inter seg " << *seg_ptr << " (" << depth(*seg_ptr) << ")" << "\n"; } else - throw std::runtime_error("BOOM\n"); - } - -#if 0 - //this code works if triangles are not coplanar - // coplanar intersection that is not a point - int coord = 0; - const typename EK::Segment_3& s = segments[i]; - typename EK::Point_3 src = s[0], tgt=s[1]; - if (src.x()==tgt.x()) - { - coord=1; - if (src.y()==tgt.y()) - coord==2; + throw std::runtime_error("Unexpected case 1"); + //~ std::ofstream debug ("/tmp/triangles.polylines.txt"); + //~ debug << "4 " << triangles[ti][0] << " " << triangles[ti][1] << " " << triangles[ti][2] << " " << triangles[ti][0] << "\n"; + //~ debug << "4 " << triangles[in_triangle_ids[i]][0] << " " << triangles[in_triangle_ids[i]][1] << " " << triangles[in_triangle_ids[i]][2] << " " << triangles[in_triangle_ids[i]][0] << "\n"; + //~ debug << "4 " << triangles[in_triangle_ids[j]][0] << " " << triangles[in_triangle_ids[j]][1] << " " << triangles[in_triangle_ids[j]][2] << " " << triangles[in_triangle_ids[j]][0] << "\n"; + //~ debug.close(); + //~ throw std::runtime_error("Unexpected case 1"); } - - std::vector tmp_pts = { - src, tgt, segments[j][0], segments[j][1] }; - - std::sort(tmp_pts.begin(), tmp_pts.end(), - [coord](const typename EK::Point_3& p, const typename EK::Point_3& q) - {return p[coord](points_on_segments[i].begin(), points_on_segments[i].end()).size()!= points_on_segments[i].size()) + { + std::cout << "coord = " << coord << "\n"; + std::cout << "(src.x()==tgt.x()) " << (src.x()==tgt.x()) << "\n"; + std::cout << "(src.y()==tgt.y()) " << (src.y()==tgt.y()) << "\n"; + std::cout << "(src.z()==tgt.z()) " << (src.z()==tgt.z()) << "\n"; + + for (auto v : points_on_segments[i]) + std::cout << " " << v; + std::cout << std::endl; + for (auto v : points_on_segments[i]) + std::cout << points[v] << "\n"; + std::cout << std::endl; + throw std::runtime_error("unique failed!"); + } + + nb_new_segments+=points_on_segments[i].size()-2; //~ { @@ -721,6 +948,24 @@ void generate_subtriangles(std::size_t ti, //~ std::cout << "done\n"; #endif + // TODO: sorted pair to be constructed when pushing_back + for (std::pair& s : segments) + if (s.second < s.first) + std::swap(s.first,s.second); + std::sort(segments.begin(), segments.end()); + auto last = std::unique(segments.begin(), segments.end()); + segments.erase(last, segments.end()); + + + std::ofstream("/tmp/tri.xyz") << std::setprecision(17) << triangles[ti][0] << "\n" + << triangles[ti][1] << "\n" + << triangles[ti][2] << "\n"; + std::ofstream debug("/tmp/cst.polylines.txt"); + debug << std::setprecision(17); + for(auto s : segments) + debug << "2 " << points[s.first] << " " << points[s.second] << "\n"; + debug.close(); + COUNTER_INSTRUCTION(counter.timer3.start();) cdt.insert_constraints(points.begin(), points.end(), segments.begin(), segments.end()); COUNTER_INSTRUCTION(counter.timer3.stop();) From 48c49add1cd8100ed08cbff3a97f11de244f3fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 15 Mar 2023 15:48:44 +0100 Subject: [PATCH 0185/1398] more debug and enum fix --- .../Polygon_mesh_processing/autorefinement.h | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 711c3d82ce0a..8cc1dd7ff9f8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -154,7 +154,7 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, // first handle case of shared endpoints if (pi==ri) { - if (si==qi || cpl_orient(p, q, s)!=COPLANAR) return NO_INTERSECTION; + if (si==qi || cpl_orient(p, q, s)!=COLLINEAR) return NO_INTERSECTION; // can be s, q or nothing if (cln_order(p,s,q)) return POINT_S; @@ -166,7 +166,7 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, { if(pi==si) { - if (qi==ri || cpl_orient(p, q, r)!=COPLANAR) return NO_INTERSECTION; + if (qi==ri || cpl_orient(p, q, r)!=COLLINEAR) return NO_INTERSECTION; // can be r, q or nothing if (cln_order(p,r,q)) return POINT_R; @@ -178,7 +178,7 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, { if (qi==ri) { - if (pi==si || cpl_orient(p, q, s)!=COPLANAR) return NO_INTERSECTION; + if (pi==si || cpl_orient(p, q, s)!=COLLINEAR) return NO_INTERSECTION; // can be p, s or nothing if (cln_order(p,s,q)) return POINT_S; @@ -190,7 +190,7 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, { if (qi==si) { - if (pi==ri || cpl_orient(p, q, r)!=COPLANAR) return NO_INTERSECTION; + if (pi==ri || cpl_orient(p, q, r)!=COLLINEAR) return NO_INTERSECTION; // can be p, r or nothing if (cln_order(p,r,q)) return POINT_R; @@ -577,7 +577,7 @@ void generate_subtriangles(std::size_t ti, #endif typedef CGAL::Constrained_Delaunay_triangulation_2 CDT_2; - //typedef CGAL::Constrained_triangulation_plus_2 CDT; + //typedef CGAL::Constrained_triangulation_plus_2 CDT; typedef CDT_2 CDT; const std::array& t = triangles[ti]; @@ -630,8 +630,11 @@ void generate_subtriangles(std::size_t ti, std::cout << "time computing segment intersections: " << timer1.time() << "\n"; std::cout << "time sorting intersection points: " << timer2.time() << "\n"; std::cout << "time for cdt of constraints: " << timer3.time() << "\n"; + std::cout << "time coplanar segment intersections: " << timer4.time() << "\n"; + std::cout << "time of do_coplanar_segments_intersect: " << timer5.time() << "\n"; + std::cout << "time of triplane intersection: " << timer6.time() << "\n"; } - CGAL::Real_timer timer1, timer2, timer3; + CGAL::Real_timer timer1, timer2, timer3, timer4, timer5, timer6; }; static Counter counter; @@ -713,11 +716,12 @@ void generate_subtriangles(std::size_t ti, continue; } - // TODO: use point ids to skip some test? + COUNTER_INSTRUCTION(counter.timer5.start();) Segment_inter_type seg_inter_type = do_coplanar_segments_intersect(segments[i].first, segments[i].second, segments[j].first, segments[j].second, points); + COUNTER_INSTRUCTION(counter.timer5.stop();) //~ Segment_inter_type_old seg_inter_type_old = @@ -756,9 +760,11 @@ void generate_subtriangles(std::size_t ti, case POINT_INTERSECTION: { // TODO: use version with no variant + COUNTER_INSTRUCTION(counter.timer6.start();) auto res = CGAL::intersection(supporting_plane(triangles[in_triangle_ids[i]]), supporting_plane(triangles[in_triangle_ids[j]]), supporting_plane(triangles[ti])); + COUNTER_INSTRUCTION(counter.timer6.stop();) if (const typename EK::Point_3* pt_ptr = boost::get(&(*res))) { @@ -770,6 +776,7 @@ void generate_subtriangles(std::size_t ti, else { COUNTER_INSTRUCTION(++counter.c2;) + COUNTER_INSTRUCTION(counter.timer4.start();) //TODO find better! typename EK::Segment_3 s1(points[segments[i].first], points[segments[i].second]); typename EK::Segment_3 s2(points[segments[j].first], points[segments[j].second]);// TODO: avoid this construction @@ -784,6 +791,7 @@ void generate_subtriangles(std::size_t ti, } else throw std::runtime_error("Unexpected case 1"); + COUNTER_INSTRUCTION(counter.timer4.stop();) //~ std::ofstream debug ("/tmp/triangles.polylines.txt"); //~ debug << "4 " << triangles[ti][0] << " " << triangles[ti][1] << " " << triangles[ti][2] << " " << triangles[ti][0] << "\n"; //~ debug << "4 " << triangles[in_triangle_ids[i]][0] << " " << triangles[in_triangle_ids[i]][1] << " " << triangles[in_triangle_ids[i]][2] << " " << triangles[in_triangle_ids[i]][0] << "\n"; @@ -877,24 +885,6 @@ void generate_subtriangles(std::size_t ti, points_on_segments[i].push_back(tgt_id); auto last = std::unique(points_on_segments[i].begin(), points_on_segments[i].end()); points_on_segments[i].erase(last, points_on_segments[i].end()); - - if (std::set(points_on_segments[i].begin(), points_on_segments[i].end()).size()!= points_on_segments[i].size()) - { - std::cout << "coord = " << coord << "\n"; - std::cout << "(src.x()==tgt.x()) " << (src.x()==tgt.x()) << "\n"; - std::cout << "(src.y()==tgt.y()) " << (src.y()==tgt.y()) << "\n"; - std::cout << "(src.z()==tgt.z()) " << (src.z()==tgt.z()) << "\n"; - - for (auto v : points_on_segments[i]) - std::cout << " " << v; - std::cout << std::endl; - for (auto v : points_on_segments[i]) - std::cout << points[v] << "\n"; - std::cout << std::endl; - throw std::runtime_error("unique failed!"); - } - - nb_new_segments+=points_on_segments[i].size()-2; //~ { @@ -1240,6 +1230,7 @@ void autorefine_soup_output(const PointRange& input_points, ); } } + // import refined triangles for (const std::array& t : new_triangles) { From ebb051f0b6e5bd89b17e4eb48f5c0cfdd2b6f1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 16 Mar 2023 10:26:06 +0100 Subject: [PATCH 0186/1398] remove debug --- .../Polygon_mesh_processing/autorefinement.h | 96 ++----------------- 1 file changed, 10 insertions(+), 86 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 8cc1dd7ff9f8..f6b7bac57bb4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,9 +36,9 @@ #include -//#define TEST_RESOLVE_INTERSECTION +#define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS -//#define DEBUG_COUNTERS +#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH @@ -56,8 +56,6 @@ namespace Polygon_mesh_processing { #ifndef DOXYGEN_RUNNING namespace autorefine_impl { - -enum Segment_inter_type_old { NO_INTERSECTION_OLD=0, COPLANAR_SEGMENTS, POINT_INTERSECTION_OLD }; enum Segment_inter_type { NO_INTERSECTION=0, POINT_INTERSECTION, POINT_P, @@ -72,68 +70,6 @@ enum Segment_inter_type { NO_INTERSECTION=0, COPLANAR_SEGMENT_QR, }; - - -std::string print_enum(Segment_inter_type_old s) -{ - switch(s) - { - case NO_INTERSECTION_OLD: return "NO_INTERSECTION_OLD"; - case COPLANAR_SEGMENTS: return "COPLANAR_SEGMENTS"; - case POINT_INTERSECTION_OLD: return "POINT_INTERSECTION_OLD"; - } -} - -std::string print_enum(Segment_inter_type s) -{ - switch(s) - { - case NO_INTERSECTION: return "NO_INTERSECTION"; - case POINT_INTERSECTION: return "POINT_INTERSECTION"; - case POINT_P: return "POINT_P"; - case POINT_Q: return "POINT_Q"; - case POINT_R: return "POINT_R"; - case POINT_S: return "POINT_S"; - case COPLANAR_SEGMENT_PQ: return "COPLANAR_SEGMENT_PQ"; - case COPLANAR_SEGMENT_RS: return "COPLANAR_SEGMENT_RS"; - case COPLANAR_SEGMENT_PS: return "COPLANAR_SEGMENT_PS"; - case COPLANAR_SEGMENT_QS: return "COPLANAR_SEGMENT_QS"; - case COPLANAR_SEGMENT_PR: return "COPLANAR_SEGMENT_PR"; - case COPLANAR_SEGMENT_QR: return "COPLANAR_SEGMENT_QR"; - } -} - - -template -Segment_inter_type_old -do_coplanar_segments_intersect_old(const typename K::Point_3& s1_0, const typename K::Point_3& s1_1, - const typename K::Point_3& s2_0, const typename K::Point_3& s2_1, - const K& k = K()) -{ - // supporting_line intersects: points are coplanar - typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); - ::CGAL::Orientation or1 = cpl_orient(s1_0, s1_1, s2_0); - ::CGAL::Orientation or2 = cpl_orient(s1_0, s1_1, s2_1); - - if(or1 == COLLINEAR && or2 == COLLINEAR) - { - // segments are collinear - typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); - return (cln_order(s1_0, s2_0, s1_1) || - cln_order(s1_0, s2_1, s1_1) || - cln_order(s2_0, s1_0, s2_1)) ? COPLANAR_SEGMENTS : NO_INTERSECTION_OLD; - } - - if(or1 != or2) - { - or1 = cpl_orient(s2_0, s2_1, s1_0); - return (or1 == COLLINEAR || or1 != cpl_orient(s2_0, s2_1, s1_1)) ? POINT_INTERSECTION_OLD : NO_INTERSECTION_OLD; - } - - return NO_INTERSECTION_OLD; -} - - // test intersection in the interior of segment pq and rs with pq and rs being coplanar segments // note that for coplanar cases, we might report identical endpoints template @@ -723,18 +659,6 @@ void generate_subtriangles(std::size_t ti, points); COUNTER_INSTRUCTION(counter.timer5.stop();) - - //~ Segment_inter_type_old seg_inter_type_old = - //~ do_coplanar_segments_intersect_old(points[segments[i].first], points[segments[i].second], - //~ points[segments[j].first], points[segments[j].second]); - - - //~ std::cout << std::setprecision(17); - //~ std::cout << points[segments[i].first] << " " << points[segments[i].second] << "\n"; - //~ std::cout << points[segments[j].first] << " " << points[segments[j].second] << "\n"; - //~ std::cout << "OLD: " << print_enum(seg_inter_type_old) << "\n"; - //~ std::cout << "NEW: " << print_enum(seg_inter_type) << "\n"; - switch(seg_inter_type) { case POINT_P: @@ -947,14 +871,14 @@ void generate_subtriangles(std::size_t ti, segments.erase(last, segments.end()); - std::ofstream("/tmp/tri.xyz") << std::setprecision(17) << triangles[ti][0] << "\n" - << triangles[ti][1] << "\n" - << triangles[ti][2] << "\n"; - std::ofstream debug("/tmp/cst.polylines.txt"); - debug << std::setprecision(17); - for(auto s : segments) - debug << "2 " << points[s.first] << " " << points[s.second] << "\n"; - debug.close(); + //~ std::ofstream("/tmp/tri.xyz") << std::setprecision(17) << triangles[ti][0] << "\n" + //~ << triangles[ti][1] << "\n" + //~ << triangles[ti][2] << "\n"; + //~ std::ofstream debug("/tmp/cst.polylines.txt"); + //~ debug << std::setprecision(17); + //~ for(auto s : segments) + //~ debug << "2 " << points[s.first] << " " << points[s.second] << "\n"; + //~ debug.close(); COUNTER_INSTRUCTION(counter.timer3.start();) cdt.insert_constraints(points.begin(), points.end(), segments.begin(), segments.end()); From b31dc68889c704f0120e6286fb3bbbacdf19da48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 16 Mar 2023 10:28:24 +0100 Subject: [PATCH 0187/1398] add another option coplanar orientation --- .../Polygon_mesh_processing/autorefinement.h | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index f6b7bac57bb4..7432f1f7d35e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -38,7 +38,7 @@ #define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS -#define DEBUG_COUNTERS +//#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH @@ -77,10 +77,20 @@ Segment_inter_type do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, std::size_t ri, std::size_t si, const std::vector& points, + const typename K::Vector_3& plane_normal, const K& k = K()) { typename K::Collinear_are_ordered_along_line_3 cln_order = k.collinear_are_ordered_along_line_3_object(); +#ifdef USE_PROJECTED_ORIENTATION_2_FOR_COPLANAR_ORIENTATION_TESTS + auto cpl_orient = + [&plane_normal](const typename K::Point_3& p, const typename K::Point_3& q, const typename K::Point_3& r) + { + return ::CGAL::orientation(q-p, r-p, plane_normal); + }; +#else typename K::Coplanar_orientation_3 cpl_orient=k.coplanar_orientation_3_object(); + CGAL_USE(plane_normal); +#endif const typename K::Point_3& p=points[pi]; const typename K::Point_3& q=points[qi]; @@ -638,7 +648,7 @@ void generate_subtriangles(std::size_t ti, std::vector segment_boxes(nbs); for (std::size_t i = 0; i(segments[i].first, segments[i].second, segments[j].first, segments[j].second, - points); + points, n); COUNTER_INSTRUCTION(counter.timer5.stop();) switch(seg_inter_type) @@ -767,9 +777,10 @@ void generate_subtriangles(std::size_t ti, points_on_segments[j].push_back(segments[i].second); break; } -// break; case NO_INTERSECTION: + { COUNTER_INSTRUCTION(++counter.c4;) + } } } COUNTER_INSTRUCTION(++counter.total;) @@ -859,7 +870,6 @@ void generate_subtriangles(std::size_t ti, } } } - //~ std::cout << "done\n"; #endif // TODO: sorted pair to be constructed when pushing_back From 38a92ead67a2b471b68ecfc23367b72b710739ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 16 Mar 2023 14:59:08 +0100 Subject: [PATCH 0188/1398] make the message clearer --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 7432f1f7d35e..a54e4d299712 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,7 +36,7 @@ #include -#define TEST_RESOLVE_INTERSECTION +//#define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS //#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS @@ -1178,7 +1178,7 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef CGAL_DEBUG_PMP_AUTOREFINE CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles)) - throw std::runtime_error("invalid output"); + throw std::runtime_error("ERROR: invalid output, there is most probably a bug"); #endif #endif CGAL_PMP_AUTOREFINE_VERBOSE("done"); From 6139fc4119b0c80bd6285e4c1cf1c7c269b85721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 16 Mar 2023 19:10:05 +0100 Subject: [PATCH 0189/1398] insert points even if no constraints --- .../Polygon_mesh_processing/autorefinement.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index a54e4d299712..734a47fcf562 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -465,7 +465,6 @@ void collect_intersections(const std::array& t1, { int j=(i+1)%3; test_edge(t1[i], t1[j], t2[0], t2[1], t2[2], ori[i], ori[j], inter_pts); - //~ if (inter_pts.size()>1) return; } // test edges of t2 vs t1 @@ -475,7 +474,6 @@ void collect_intersections(const std::array& t1, { int j=(i+1)%3; test_edge(t2[i], t2[j], t1[0], t1[1], t1[2], ori[i], ori[j], inter_pts); - //~ if (inter_pts.size()>1) return; } // because we don't handle intersection type and can have edge-edge edge-vertex duplicates @@ -483,9 +481,10 @@ void collect_intersections(const std::array& t1, auto last = std::unique(inter_pts.begin(), inter_pts.end()); inter_pts.erase(last, inter_pts.end()); - +#ifdef DEBUG_DEPTH for (auto p : inter_pts) if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); +#endif } ////////////////////////////////// @@ -507,8 +506,8 @@ void generate_subtriangles(std::size_t ti, const std::vector>& triangles, std::vector>& new_triangles) { - //~ std::cout << "generate_subtriangles()\n"; - std::cout << std::setprecision(17); + // std::cout << "generate_subtriangles()\n"; + // std::cout << std::setprecision(17); #ifdef USE_FIXED_PROJECTION_TRAITS typedef ::CGAL::internal::Projection_traits_3 P_traits; @@ -870,16 +869,16 @@ void generate_subtriangles(std::size_t ti, } } } -#endif // TODO: sorted pair to be constructed when pushing_back + // TODO: only needed in case of coplanar segments? for (std::pair& s : segments) if (s.second < s.first) std::swap(s.first,s.second); std::sort(segments.begin(), segments.end()); auto last = std::unique(segments.begin(), segments.end()); segments.erase(last, segments.end()); - +#endif //~ std::ofstream("/tmp/tri.xyz") << std::setprecision(17) << triangles[ti][0] << "\n" //~ << triangles[ti][1] << "\n" @@ -891,7 +890,10 @@ void generate_subtriangles(std::size_t ti, //~ debug.close(); COUNTER_INSTRUCTION(counter.timer3.start();) - cdt.insert_constraints(points.begin(), points.end(), segments.begin(), segments.end()); + if (segments.empty()) + cdt.insert(points.begin(), points.end()); + else + cdt.insert_constraints(points.begin(), points.end(), segments.begin(), segments.end()); COUNTER_INSTRUCTION(counter.timer3.stop();) #ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS From 85b3f7ed5732f203905086d630b7e35c521e7c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Mar 2023 17:52:09 +0200 Subject: [PATCH 0190/1398] working around non-triangular polygons --- .../Polygon_mesh_processing/soup_autorefinement.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index 9ade96e3be84..a46fc6e711c7 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; @@ -22,10 +24,13 @@ int main(int argc, char** argv) : std::string(argv[1]); std::vector input_points; - std::vector> input_triangles; + std::vector> input_triangles; CGAL::IO::read_polygon_soup(filename, input_points, input_triangles); PMP::repair_polygon_soup(input_points, input_triangles); + for (const auto& c : input_triangles) + if (c.size()!=3) return 0; // skipt for now + std::vector output_points; std::vector> output_triangles; PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles); From b06ed794e6e7ffa1f3112ec16ba556128be2ba79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Mar 2023 17:53:36 +0200 Subject: [PATCH 0191/1398] add more debug --- .../Polygon_mesh_processing/autorefinement.h | 159 +++++++++++++++++- 1 file changed, 155 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 734a47fcf562..7cd083e83388 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -36,7 +36,7 @@ #include -//#define TEST_RESOLVE_INTERSECTION +#define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS //#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS @@ -227,6 +227,69 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, ////////////////////////////////// ////////////////////////////////// +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION +template +void old_intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p, + const typename Kernel::Point_3& q, + const typename Kernel::Point_3& r, + const Kernel& k, + std::list& inter_pts) +{ + typedef typename std::list::iterator Iterator; + + if(inter_pts.empty()) + return; + + typename Kernel::Coplanar_orientation_3 orient = k.coplanar_orientation_3_object(); + typename Kernel::Construct_line_3 line = k.construct_line_3_object(); + + //orient(p,q,r,r) is POSITIVE + std::map orientations; + for (Iterator it=inter_pts.begin();it!=inter_pts.end();++it) + orientations[ &(*it) ]=orient(p,q,r,*it); + + CGAL_kernel_assertion_code(int pt_added = 0;) + + const typename Kernel::Point_3* prev = &(*boost::prior(inter_pts.end())); + Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : boost::prior(inter_pts.end()); + for(Iterator it=inter_pts.begin(); it!=stop; ++it) + { + const typename Kernel::Point_3& curr = *it; + Orientation or_prev = orientations[prev], + or_curr = orientations[&curr]; + + if((or_prev == POSITIVE && or_curr == NEGATIVE) || + (or_prev == NEGATIVE && or_curr == POSITIVE)) + { + typename Intersection_traits::result_type + obj = ::CGAL::Intersections::internal::intersection(line(p,q), line(*prev,curr), k); + + // assert "not empty" + CGAL_kernel_assertion(bool(obj)); + + const typename Kernel::Point_3* inter = ::CGAL::Intersections::internal::intersect_get(obj); + CGAL_kernel_assertion(inter != nullptr); + + prev = &(*inter_pts.insert(it,*inter)); + orientations[prev] = COLLINEAR; + CGAL_kernel_assertion_code(++pt_added;) + } + + prev = &(*it); + } + + CGAL_kernel_assertion(pt_added<3); + Iterator it = inter_pts.begin(); + while(it!=inter_pts.end()) + { + if(orientations[&(*it)] == NEGATIVE) + inter_pts.erase(it++); + else + ++it; + } +} +#endif + // imported from Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h template void coplanar_intersections(const std::array& t1, @@ -242,6 +305,19 @@ void coplanar_intersections(const std::array& t1, l_inter_pts.push_back(Intersections::internal::Point_on_triangle(-1,2)); #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::list old_l_inter_pts; + old_l_inter_pts.push_back(p2); + old_l_inter_pts.push_back(q2); + old_l_inter_pts.push_back(r2); + + + auto enum_to_string = [](CGAL::Orientation o) + { + if (o==COLLINEAR) return std::string("COLLINEAR"); + if (o==POSITIVE) return std::string("POSITIVE"); + return std::string("NEGATIVE"); + }; + auto to_string = [](const auto& t) { std::stringstream sstr; @@ -256,6 +332,32 @@ void coplanar_intersections(const std::array& t1, std::cout << "intersection_coplanar_triangles\n"; std::ofstream("/tmp/t1.polylines.txt") << to_string(t1) << "\n"; std::ofstream("/tmp/t2.polylines.txt") << to_string(t2) << "\n"; + + std::cout << "Position of vertices of t1: "; + std::cout << enum_to_string( coplanar_orientation(p2,q2,r2,p1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(p2,q2,r2,q1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(p2,q2,r2,r1)) << "\n"; + std::cout << " "; + std::cout << enum_to_string( coplanar_orientation(q2,r2,p2,p1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(q2,r2,p2,q1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(q2,r2,p2,r1)) << "\n"; + std::cout << " "; + std::cout << enum_to_string( coplanar_orientation(r2,p2,q2,p1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(r2,p2,q2,q1)) << " - "; + std::cout << enum_to_string( coplanar_orientation(r2,p2,q2,r1)) << "\n"; + std::cout << "Position of vertices of t2: "; + std::cout << enum_to_string( coplanar_orientation(p1,q1,r1,p2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(p1,q1,r1,q2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(p1,q1,r1,r2)) << "\n"; + std::cout << " "; + std::cout << enum_to_string( coplanar_orientation(q1,r1,p1,p2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(q1,r1,p1,q2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(q1,r1,p1,r2)) << "\n"; + std::cout << " "; + std::cout << enum_to_string( coplanar_orientation(r1,p1,q1,p2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(r1,p1,q1,q2)) << " - "; + std::cout << enum_to_string( coplanar_orientation(r1,p1,q1,r2)) << "\n"; + auto print_points = [&]() { for(auto p : l_inter_pts) std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) "; std::cout <<"\n"; @@ -270,31 +372,76 @@ void coplanar_intersections(const std::array& t1, #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); + old_intersection_coplanar_triangles_cutoff(p1,q1,r1,k,old_l_inter_pts); + CGAL_assertion(l_inter_pts.size()==old_l_inter_pts.size()); + for (std::size_t i=0; ipoint(p1,q1,r1,p2,q2,r2,k)) + { + std::cout <<"ERROR with point #" << i << "\n"; + throw std::runtime_error("invalid output 0"); + } + } #endif intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,l_inter_pts); //line q1r1 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); + old_intersection_coplanar_triangles_cutoff(q1,r1,p1,k,old_l_inter_pts); + CGAL_assertion(l_inter_pts.size()==old_l_inter_pts.size()); + for (std::size_t i=0; ipoint(p1,q1,r1,p2,q2,r2,k)) + { + std::cout <<"ERROR with point #" << i << "\n"; + throw std::runtime_error("invalid output 1"); + } + } #endif intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,l_inter_pts); //line r1p1 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); + old_intersection_coplanar_triangles_cutoff(r1,p1,q1,k,old_l_inter_pts); + CGAL_assertion(l_inter_pts.size()==old_l_inter_pts.size()); + for (std::size_t i=0; ipoint(p1,q1,r1,p2,q2,r2,k)) + { + std::cout <<"ERROR with point #" << i << "\n"; + throw std::runtime_error("invalid output 2"); + } + } +#endif + +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::size_t start=inter_pts.size(); #endif for (const Intersections::internal::Point_on_triangle& pot : l_inter_pts) inter_pts.push_back( pot.point(p1,q1,r1,p2,q2,r2,k) ); #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + for (std::size_t i=0; i> i; + // std::cout <<"check!\n"; + // int i; + // std::cin >> i; #endif } @@ -1022,6 +1169,10 @@ void autorefine_soup_output(const PointRange& input_points, std::vector inter_pts; autorefine_impl::collect_intersections(t1, t2, inter_pts); + CGAL_assertion( + CGAL::do_intersect(typename EK::Triangle_3(t1[0], t1[1], t1[2]), typename EK::Triangle_3(t2[0], t2[1], t2[2])) + != inter_pts.empty()); + if (!inter_pts.empty()) { std::size_t nbi = inter_pts.size(); From bd967e7cec9885afb9cee799ae6b39a16abfa609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 27 Mar 2023 17:53:50 +0200 Subject: [PATCH 0192/1398] avoid duplicated tangency point --- .../Polygon_mesh_processing/autorefinement.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 7cd083e83388..c90ba515271c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -778,7 +778,13 @@ void generate_subtriangles(std::size_t ti, std::map point_id_map; for (std::size_t pid=0; pid(points.begin(), points.end()).size()); + CGAL_assertion(points.size()==point_id_map.size()); } // TODO: sorted pair to be constructed when pushing_back @@ -1217,6 +1226,14 @@ void autorefine_soup_output(const PointRange& input_points, return insert_res.first->second; }; + if (!all_points[ti].empty()) + { + std::vector tmp; + tmp.swap(all_points[ti]); + for (const typename EK::Point_3& pt : tmp) + get_point_id(pt); + } + std::size_t nbs = all_segments[ti].size(); std::vector> filtered_segments; std::vector filtered_in_triangle_ids; From 2b74b8f10d561a335e159857e14f109a92aeed50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 28 Mar 2023 14:35:40 +0200 Subject: [PATCH 0193/1398] fix some bugs --- .../Triangle_3_Triangle_3_intersection.h | 98 ++++++++++++++----- 1 file changed, 76 insertions(+), 22 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index ac376f443506..35aa4f8f0a53 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -86,6 +87,7 @@ struct Point_on_triangle // (-1, id) point on t2 // (id1, id2) intersection of edges std::pair t1_t2_ids; + boost::container::flat_set extra_t1; typename Kernel::FT alpha; Orientation @@ -161,7 +163,7 @@ intersection(const Point_on_triangle& p, #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " calling intersection: "; std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) -"; - std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1 << "\n"; + std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1; #endif typedef Point_on_triangle Pot; switch(p.id1()) @@ -172,17 +174,26 @@ intersection(const Point_on_triangle& p, { case -1: // (-1, ip2) - (-1, iq2) { + CGAL_assertion((p.id2()+1)%3 == q.id2() || (q.id2()+1)%3 == p.id2()); +// CGAL_assertion(p.extra_t1.empty() && q.extra_t1.empty()); // TMP to see if it's worth implementing special case +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 1\n"; +#endif typename Kernel::FT alpha = coplanar_segment_segment_alpha_intersection(p1, q1, Pot::point_from_id(p2, q2, r2, p.id2()), Pot::point_from_id(p2, q2, r2, q.id2()), k); - return Point_on_triangle(edge_id_t1, p.id2(), alpha); // intersection with an original edge of t2 + int id2 = (p.id2()+1)%3 == q.id2() ? p.id2() : q.id2(); + return Point_on_triangle(edge_id_t1, id2, alpha); // intersection with an original edge of t2 } default: if (q.id2()!=-1) // (-1, ip2) - (iq1, iq2) { if (p.id2() == q.id2() || p.id2() == (q.id2()+1)%3) { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 2\n"; +#endif // points are on the same edge of t2 --> we shorten an already cut edge typename Kernel::FT alpha = coplanar_segment_segment_alpha_intersection(p1, q1, @@ -191,13 +202,23 @@ intersection(const Point_on_triangle& p, return Point_on_triangle(edge_id_t1, q.id2(), alpha); } - // point of t1 - return Point_on_triangle((q.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 3\n"; +#endif + // point of t1: look for an edge of t1 containing both points + CGAL_assertion( p.extra_t1.count(q.id1())!=0 || p.extra_t1.count(3-q.id1()-edge_id_t1)!=0 ); + int eid1 = p.extra_t1.count(q.id1())!=0 ? q.id1() : 3-q.id1()-edge_id_t1; + return Point_on_triangle((eid1+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 } // (-1, ip2) - (iq1, -1) //vertex of t1, special case t1 edge passed thru a vertex of t2 CGAL_assertion(edge_id_t1 == 2); - return Point_on_triangle(2, -1); // point on t1 has to be created from the intersection of edge 0 and edge 1 +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 4\n"; +#endif + CGAL_assertion(q.id1()==1); + CGAL_assertion(!p.extra_t1.empty()); + return Point_on_triangle(p.extra_t1.count(0)==1?0:2,-1); } } default: @@ -210,13 +231,24 @@ intersection(const Point_on_triangle& p, { case -1: // (ip1, -1) - (-1, iq2) //vertex of t1, special case t1 edge passed thru a vertex of t2 - return Point_on_triangle(0, -1); +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 5\n"; +#endif + CGAL_assertion(edge_id_t1 == 2); + CGAL_assertion(p.id1()==1); + CGAL_assertion(!q.extra_t1.empty()); + return Point_on_triangle(q.extra_t1.count(0)==1?0:2,-1); default: { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 6\n"; +#endif CGAL_assertion(q.id2()!=-1); // (ip1, -1) - (iq2, -1) //(ip1,-1), (iq1, iq2) - CGAL_assertion(edge_id_t1==2 && p.id1()==1); - return Point_on_triangle(q.id1()==1?2:0,-1); // vertex of t1 + CGAL_assertion(edge_id_t1==2); + // p and q are on the same edge of t1 + CGAL_assertion(p.id1()==q.id1() || p.id1()==(q.id1()+1)%3); + return Point_on_triangle((q.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); } } } @@ -228,6 +260,9 @@ intersection(const Point_on_triangle& p, { if (q.id2() == p.id2() || q.id2() == (p.id2()+1)%3) { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 7\n"; +#endif // points are on the same edge of t2 --> we shorten an already cut edge typename Kernel::FT alpha = coplanar_segment_segment_alpha_intersection(p1, q1, @@ -236,8 +271,14 @@ intersection(const Point_on_triangle& p, return Point_on_triangle(edge_id_t1, p.id2(), alpha); } +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 8\n"; +#endif // point of t1 - return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); + //std::cout << "q.extra_t1: "; for(int qet1 : q.extra_t1) std::cout << " " << qet1; std::cout << "\n"; + CGAL_assertion( q.extra_t1.count(p.id1())!=0 || q.extra_t1.count(3-p.id1()-edge_id_t1)!=0 ); + int eid1 = q.extra_t1.count(p.id1())!=0 ? p.id1() : 3-p.id1()-edge_id_t1; + return Point_on_triangle((eid1+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 } default: { @@ -245,21 +286,30 @@ intersection(const Point_on_triangle& p, { case -1: // (ip1, ip2) - (iq1, -1) { - CGAL_assertion(edge_id_t1==2 && q.id1()==1); - return Point_on_triangle(p.id1()==1?2:0); // vertex of t1 + // p and q are on the same edge of t1 + CGAL_assertion(q.id1()==p.id1() || q.id1()==(p.id1()+1)%3); +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 9\n"; +#endif + return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); } default: // (ip1, ip2) - (iq1, iq2) { - CGAL_assertion(p.id1()==q.id1() || p.id2()==q.id2() ); - - if (p.id1()==q.id1()) - return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 - - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, q.id2()), - Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); - return Point_on_triangle(edge_id_t1, q.id2(), alpha); + if (p.id2()==q.id2()) + { +#ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION + std::cout << " -- case 10\n"; +#endif + typename Kernel::FT alpha = + coplanar_segment_segment_alpha_intersection(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); + return Point_on_triangle(edge_id_t1, q.id2(), alpha); + } + // we are intersecting an edge of t1 + CGAL_assertion(p.id1()==q.id1() || edge_id_t1==2); + int eid1 = p.id1()==q.id1() ? p.id1() : 1; + return Point_on_triangle((eid1+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 } } } @@ -293,8 +343,12 @@ void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p1, //orient(p1,q1,r1,r1) is POSITIVE std::map*,Orientation> orientations; // TODO skip map - for (const Point_on_triangle& pot : inter_pts) + for (Point_on_triangle& pot : inter_pts) + { orientations[ &pot ]=pot.orientation(p1,q1,r1,edge_id,p2,q2,r2,k); + if (pot.id1()==-1 && orientations[ &pot ]==COLLINEAR) + pot.extra_t1.insert(edge_id); + } #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " Orientations:"; From e29d52421e624a416b741e3416d75bc65ee1e101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 28 Mar 2023 16:43:35 +0200 Subject: [PATCH 0194/1398] fix doc --- .../Polygon_mesh_processing/autorefinement.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index c90ba515271c..c7e067916d59 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1360,19 +1360,18 @@ void autorefine_soup_output(const PointRange& input_points, * refines a triangle mesh so that no triangles intersects in their interior. * * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` - * @tparam NamedParameters a sequence of \ref namedparameters + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param tm input triangulated surface mesh * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * - * \cgalParamNBegin{geom_traits} - * \cgalParamDescription{an instance of a geometric traits class} - * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} - * \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} - * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} - * \cgalParamNEnd - * * \cgalNamedParamsBegin + * \cgalParamNBegin{geom_traits} + * \cgalParamDescription{an instance of a geometric traits class} + * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} + * \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} + * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} + * \cgalParamNEnd * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `tm`} * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` @@ -1380,7 +1379,8 @@ void autorefine_soup_output(const PointRange& input_points, * \cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`} * \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` * must be available in `TriangleMesh`.} - * \cgalParamNEnd + * \cgalParamNEnd + * \cgalNamedParamsEnd * */ template Date: Wed, 29 Mar 2023 16:38:34 +0200 Subject: [PATCH 0195/1398] triangulate soup --- .../examples/Polygon_mesh_processing/soup_autorefinement.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index a46fc6e711c7..d955734853bf 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -27,9 +27,7 @@ int main(int argc, char** argv) std::vector> input_triangles; CGAL::IO::read_polygon_soup(filename, input_points, input_triangles); PMP::repair_polygon_soup(input_points, input_triangles); - - for (const auto& c : input_triangles) - if (c.size()!=3) return 0; // skipt for now + PMP::triangulate_polygons(input_points, input_triangles); std::vector output_points; std::vector> output_triangles; From 2a791d2625c885b96f6d12b890d6b482918b48d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 31 Mar 2023 10:24:42 +0200 Subject: [PATCH 0196/1398] add optional progress display --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index c7e067916d59..4f56b8a0d817 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -25,6 +25,10 @@ #include #include +#ifdef USE_PROGRESS_DISPLAY +#include +#endif + // output #include #include @@ -1260,6 +1264,11 @@ void autorefine_soup_output(const PointRange& input_points, CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles std::vector> new_triangles; + +#ifdef USE_PROGRESS_DISPLAY + boost::timer::progress_display pd(triangles.size()); +#endif + for(std::size_t ti=0; ti Date: Fri, 31 Mar 2023 10:26:21 +0200 Subject: [PATCH 0197/1398] repair soup before orient + to mesh --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 4f56b8a0d817..e38f64ff3010 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -1417,6 +1418,7 @@ autorefine( TriangleMesh& tm, out_soup_points, out_soup_triangles); clear(tm); + repair_polygon_soup(out_soup_points, out_soup_triangles); orient_polygon_soup(out_soup_points, out_soup_triangles); polygon_soup_to_polygon_mesh(out_soup_points, out_soup_triangles, tm); } From 55f8bcb12202de6fb6fe70ee3096d979b8f95dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Apr 2023 18:24:59 +0200 Subject: [PATCH 0198/1398] fix assertion --- .../internal/Triangle_3_Triangle_3_intersection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 35aa4f8f0a53..4cc5f9be5600 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -372,7 +372,7 @@ void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p1, prev = inter_pts.insert(it,new_pt); orientations[&(*prev)] = COLLINEAR; - CGAL_assertion_code(++pt_added); + CGAL_kernel_assertion_code(++pt_added); } prev = it; From cef23a90456ece3a592b33fcdf17317726759bb3 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 8 Apr 2023 10:24:47 +0200 Subject: [PATCH 0199/1398] moving captions out of the figure --- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 49614be67c91..70f9cf00c0e7 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -921,10 +921,12 @@ distribution of values and "diffuses" the extreme values of curvatures across th \cgalFigureAnchor{icc_diff_radius}
- +
\cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature distribution on a bear mesh with different values for the ball radius parameter +The mean curvature distribution on a bear mesh with different values for the ball +radius parameter. R = 0 (a), R = 0.025 (b), R = 0.05 (c), R = 0.16 (d). Note that +the max edge length is 0.031 and the size of bounding box of the mesh is 1 x 0.7 x 0.8. \cgalFigureCaptionEnd \ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate From 8393933630960d1b23198aac9bc37b6ce38ea0f0 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sat, 8 Apr 2023 10:27:13 +0200 Subject: [PATCH 0200/1398] minor grammer fixes --- .../Polygon_mesh_processing.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 70f9cf00c0e7..987b88b0a217 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -905,8 +905,8 @@ These computations are performed using (on all vertices of the mesh): - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures()` -Where it is recommended to use the last function for computing multiple curvatures (example: mean and Gaussian) -as the implementation performs the shared computations only once, making it more efficient. +Where it is recommended to use the last function for computing multiple curvatures (for example: mean and +Gaussian) as the implementation performs the shared computations only once, making it more efficient. Similarly, we can use the following functions to compute curvatures on a specific vertex: - `CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature_one_vertex()` @@ -924,9 +924,9 @@ distribution of values and "diffuses" the extreme values of curvatures across th \cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature distribution on a bear mesh with different values for the ball -radius parameter. R = 0 (a), R = 0.025 (b), R = 0.05 (c), R = 0.16 (d). Note that -the max edge length is 0.031 and the size of bounding box of the mesh is 1 x 0.7 x 0.8. +The mean curvature distribution on a bear mesh with different values for the ball radius +parameter. R = 0 (a), R = 0.025 (b), R = 0.05 (c), R = 0.16 (d). Note that the max +edge length is 0.031 and the size of the bounding box of the mesh is 1 x 0.7 x 0.8. \cgalFigureCaptionEnd \ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate From f8a9862abfd91f33622830b9142e3137c57842b6 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:14:37 +0200 Subject: [PATCH 0201/1398] incomplete update to user man doc --- .../Polygon_mesh_processing.txt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 987b88b0a217..b454706b9723 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -892,10 +892,16 @@ not provide storage for the normals. This package provides methods to compute curvatures on polygonal meshes based on Interpolated Corrected Curvatures on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, Gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, quad meshes, -and meshes with n-gon faces. The algorithms used prove to work well in general. Also, on meshes +and meshes with n-gon faces (for n-gons, the centroid must be inside the n-gon face). +The algorithms used prove to work well in general. Also, on meshes with noise on vertex positions, they give accurate results, on the condition that the correct vertex normals are provided. +\subsection ICCBackground Brief Background + + +\subsection ICCAPI API + The implementation is generic in terms of mesh data structure. It can be used on `Surface_mesh`, `Polyhedron_3` and other polygonal mesh structures based on the concept `FaceGraph`. @@ -914,6 +920,9 @@ Similarly, we can use the following functions to compute curvatures on a specifi - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` +\subsection ICCResults Results + +**To be updated** \cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on the named parameter `ball_radius`, which can be set to a value > 0 to get a smoother @@ -921,12 +930,12 @@ distribution of values and "diffuses" the extreme values of curvatures across th \cgalFigureAnchor{icc_diff_radius}
- +
\cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature distribution on a bear mesh with different values for the ball radius -parameter. R = 0 (a), R = 0.025 (b), R = 0.05 (c), R = 0.16 (d). Note that the max -edge length is 0.031 and the size of the bounding box of the mesh is 1 x 0.7 x 0.8. +The mean curvature on a mesh with different values for the ball radius +parameter: (a) R = 0, (b) R = 0.025, (c) R = 0.05, (d) R = 0.16. Note that the max +edge length is 0.031 and the size of the bounding box of the mesh is 1 x .7 x .8. \cgalFigureCaptionEnd \ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate From 261eac81e9847bdc2b313ac19ae7a00edeaa9405 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:30:37 +0200 Subject: [PATCH 0202/1398] user manual - incomplete --- .../Polygon_mesh_processing.txt | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index b454706b9723..ead5b5a8c80c 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -889,16 +889,57 @@ not provide storage for the normals. **************************************** \section PMPICC Computing Curvatures -This package provides methods to compute curvatures on polygonal meshes based on Interpolated Corrected Curvatures -on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, Gaussian curvature, -principal curvatures and directions. These can be computed on triangle meshes, quad meshes, -and meshes with n-gon faces (for n-gons, the centroid must be inside the n-gon face). -The algorithms used prove to work well in general. Also, on meshes -with noise on vertex positions, they give accurate results, on the condition that the -correct vertex normals are provided. +This package provides methods to compute curvatures on polygonal meshes based on Interpolated +Corrected Curvatures on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, +Gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, +quad meshes, and meshes with n-gon faces (for n-gons, the centroid must be inside the n-gon face). +The algorithms used prove to work well in general. Also, on meshes with noise on vertex positions, +they give accurate results, on the condition that the correct vertex normals are provided. \subsection ICCBackground Brief Background +Curvatures are quantities that describe the local geometry of a surface. They are important in many +geometry processing applications. since surfaces are 2-dimensional objects (embedded in 3D), they can bend +in 2 independent directions. These directions are called principal directions, and the amount of bending +in each direction is called the principal curvature: \f$ k_1 \f$ and \f$ k_2 \f$. Curvature is usually +expressed as scalar quantities like the mean curvature \f$ H \f$ and the Gaussian curvature \f$ K \f$ +which are defined in terms of the principal curvatures. + +The algorithms are based on the following paper \cgalCite{lachaud2020}. It introduces a new way to +compute curvatures on polygonal meshes. The main idea is based on decoupling the normal information from +the position information, which is useful for dealing with digital surfaces, or meshes with noise on +vertex positions. To compute the curvatures, we first compute interpolated curvature measures for each face +as described below. For a triangle \f$ \tau_{ijk} \f$, with vertices \a i, \a j, \a k: + +\f[ + \begin{align*} + \mu^{(0)}(\tau_{ijk}) = &\frac{1}{2} \langle \bar{\mathbf{u}} \mid (\mathbf{x}_j - \mathbf{x}_i) \times (\mathbf{x}_k - \mathbf{x}_i) \rangle, \\ + \mu^{(1)}(\tau_{ijk}) = &\frac{1}{2} \langle \bar{\mathbf{u}} \mid (\mathbf{u}_k - \mathbf{u}_j) \times \mathbf{x}_i + (\mathbf{u}_i - \mathbf{u}_k) \times \mathbf{x}_j + (\mathbf{u}_j - \mathbf{u}_i) \times \mathbf{x}_k \rangle, \\ + \mu^{(2)}(\tau_{ijk}) = &\frac{1}{2} \langle \mathbf{u}_i \mid \mathbf{u}_j \times \mathbf{u}_k \rangle, \\ + \mu^{\mathbf{X},\mathbf{Y}}(\tau_{ijk}) = & \frac{1}{2} \big\langle \bar{\mathbf{u}} \big| \langle \mathbf{Y} | \mathbf{u}_k -\mathbf{u}_i \rangle \mathbf{X} \times (\mathbf{x}_j - \mathbf{x}_i) \big\rangle + -\frac{1}{2} \big\langle \bar{\mathbf{u}} \big| \langle \mathbf{Y} | \mathbf{u}_j -\mathbf{u}_i \rangle \mathbf{X} \times (\mathbf{x}_k - \mathbf{x}_i) \big\rangle, + \end{align*} +\f] +where \f$ \langle \cdot \mid \cdot \rangle \f$ denotes the usual scalar product, +\f$ \bar{\mathbf{u}}=\frac{1}{3}( \mathbf{u}_i + \mathbf{u}_j + \mathbf{u}_k )\f$. + +The first measure \f$ \mu^{(0)} \f$ is the area measure of the triangle, and the second and third measures +\f$ \mu^{(1)} \f$ and \f$ \mu^{(2)} \f$ are the mean and Gaussian corrected curvature measures of the triangle. +The last measure \f$ \mu^{\mathbf{X},\mathbf{Y}} \f$ is the anisotropic corrected curvature measure of the triangle. +The anisotropic measure is later used to compute the principal curvatures and directions through an eigenvalue +solver. + +The interpolated curvature measures are then computed for each vertex \f$ v \f$ as the sum of +the curvature measures of the faces in a ball around \f$ v \f$ weighted by the inclusion ratio of the +triangle in the ball. if the ball radius is not specified, the sum is instead over the incident faces +of \f$ v \f$. + +To get the final curvature value for a vertex \f$ v \f$, the respective interpolated curvature measure +is divided by the interpolated area measure. + +\f[ +\mu^{(k)}( B ) = \sum_{\tau : \text{triangle} } \mu^{(k)}( \tau ) \frac{\mathrm{Area}( \tau \cap B )}{\mathrm{Area}(\tau)}. +\f] \subsection ICCAPI API @@ -920,7 +961,7 @@ Similarly, we can use the following functions to compute curvatures on a specifi - `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions_one_vertex()` - `CGAL::Polygon_mesh_processing::interpolated_corrected_curvatures_one_vertex()` -\subsection ICCResults Results +\subsection ICCResults Results & Performance **To be updated** From ef465063783b4646f5a90753f4b1f3375221134b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 18 Apr 2023 16:46:40 +0100 Subject: [PATCH 0203/1398] Add cmake/modules files --- .../CGAL_Qt6_moc_and_resource_files.cmake | 25 ++++ .../CGAL_SetupCGAL_Qt6Dependencies.cmake | 124 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake create mode 100644 Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake diff --git a/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake b/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake new file mode 100644 index 000000000000..21b32bc2e9e6 --- /dev/null +++ b/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake @@ -0,0 +1,25 @@ +if(CGAL_Qt6_moc_and_resource_files_included) + return() +endif() +set(CGAL_Qt6_moc_and_resource_files_included TRUE) +# qrc files (resources files, that contain icons, at least) +if(EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc) + qt5_add_resources (_CGAL_Qt6_RESOURCE_FILES_private + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/Input.qrc + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/File.qrc + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/Triangulation_2.qrc) +else() + # Installed version, in CMake resources + file ( COPY + ${CGAL_MODULES_DIR}/demo/resources + ${CGAL_MODULES_DIR}/demo/icons + DESTINATION ${CMAKE_BINARY_DIR}) + qt5_add_resources (_CGAL_Qt6_RESOURCE_FILES_private + ${CMAKE_BINARY_DIR}/resources/CGAL.qrc + ${CMAKE_BINARY_DIR}/icons/Input.qrc + ${CMAKE_BINARY_DIR}/icons/File.qrc + ${CMAKE_BINARY_DIR}/icons/Triangulation_2.qrc) +endif() + +qt5_wrap_ui(_CGAL_Qt6_UI_FILES ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/ImageInterface.ui) diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake new file mode 100644 index 000000000000..161e9673345c --- /dev/null +++ b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake @@ -0,0 +1,124 @@ +#.rst: +# CGAL_SetupCGAL_Qt6Dependencies +# ------------------------------ +# +# The module searches for the dependencies of the `CGAL_Qt6` library: +# - the `Qt6` libraries +# +# by calling +# +# .. code-block:: cmake +# +# find_package(Qt6 QUIET COMPONENTS OpenGL Svg) +# +# and defines the variable :variable:`CGAL_Qt6_FOUND` and the function +# :command:`CGAL_setup_CGAL_Qt6_dependencies`. +# + +if(CGAL_SetupCGAL_Qt6Dependencies_included) + return() +endif() +set(CGAL_SetupCGAL_Qt6Dependencies_included TRUE) + +#.rst: +# Used Modules +# ^^^^^^^^^^^^ +# - :module:`Qt6Config` +find_package(Qt6 QUIET COMPONENTS OpenGL Svg) + +set(CGAL_Qt6_MISSING_DEPS "") +if(NOT Qt6OpenGL_FOUND) + set(CGAL_Qt6_MISSING_DEPS "Qt6OpenGL") +endif() +if(NOT Qt6Svg_FOUND) + set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} Qt6Svg") +endif() +if(NOT Qt6_FOUND) + set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} Qt6") +endif() +if(NOT EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsItem.h) + set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} headers") +endif() + +#.rst: +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# .. variable:: CGAL_Qt6_FOUND +# +# Set to `TRUE` if the dependencies of `CGAL_Qt6` were found. +# +if(NOT CGAL_Qt6_MISSING_DEPS) + set(CGAL_Qt6_FOUND TRUE) + set_property(GLOBAL PROPERTY CGAL_Qt6_FOUND TRUE) + + include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Qt6_moc_and_resource_files.cmake) + + if(NOT TARGET CGAL_Qt6_moc_and_resources) + add_library(CGAL_Qt6_moc_and_resources STATIC + ${_CGAL_Qt6_MOC_FILES_private} + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsViewNavigation.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/DemosMainWindow.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsItem.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsViewInput.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/camera.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/frame.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/keyFrameInterpolator.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/manipulatedCameraFrame.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/manipulatedFrame.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/qglviewer.h + ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/image_interface.h + ${_CGAL_Qt6_UI_FILES} + ${_CGAL_Qt6_RESOURCE_FILES_private}) + target_include_directories( CGAL_Qt6_moc_and_resources PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) + set_target_properties(CGAL_Qt6_moc_and_resources PROPERTIES + POSITION_INDEPENDENT_CODE TRUE + EXCLUDE_FROM_ALL TRUE + AUTOMOC TRUE) + target_link_libraries(CGAL_Qt6_moc_and_resources CGAL::CGAL Qt6::Widgets Qt6::OpenGL Qt6::Svg ) + + add_library(CGAL::CGAL_Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) + add_library(CGAL::Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) + endif() + +endif() + +#get_property(QT_UIC_EXECUTABLE TARGET Qt6::uic PROPERTY LOCATION) +#message( STATUS "Qt6Core include: ${Qt6Core_INCLUDE_DIRS}" ) +#message( STATUS "Qt6 libraries: ${Qt6Core_LIBRARIES} ${Qt6Gui_LIBRARIES} ${Qt6Svg_LIBRARIES} ${Qt6OpenGL_LIBRARIES}" ) +#message( STATUS "Qt6Core definitions: ${Qt6Core_DEFINITIONS}" ) +#message( STATUS "moc executable: ${QT_MOC_EXECUTABLE}" ) +#message( STATUS "uic executable: ${QT_UIC_EXECUTABLE}" ) + +#.rst: +# +# Provided Functions +# ^^^^^^^^^^^^^^^^^^ +# +# .. command:: CGAL_setup_CGAL_Qt6_dependencies +# +# Link the target with the dependencies of `CGAL_Qt6`:: +# +# CGAL_setup_CGAL_Qt6_dependencies( target ) +# +# The dependencies are +# added using :command:`target_link_libraries` with the ``INTERFACE`` +# keyword. +# +function(CGAL_setup_CGAL_Qt6_dependencies target) + + if($ENV{CGAL_FAKE_PUBLIC_RELEASE}) + target_compile_definitions( ${target} INTERFACE CGAL_FAKE_PUBLIC_RELEASE=1 ) + endif() + target_link_libraries( ${target} INTERFACE CGAL::CGAL) + target_link_libraries( ${target} INTERFACE CGAL::Qt6_moc_and_resources) + target_link_libraries( ${target} INTERFACE Qt6::OpenGL Qt6::Svg ) + + # Remove -Wdeprecated-copy, for g++ >= 9.0, because Qt6, as of + # version 5.12, has a lot of [-Wdeprecated-copy] warnings. + if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9" ) + target_compile_options( ${target} INTERFACE "-Wno-deprecated-copy" "-Wno-cast-function-type" ) + endif() + +endfunction() From c6ce5fb1208bb48e173a5bd81116f28c13c10a4e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 12:19:38 +0100 Subject: [PATCH 0204/1398] Switch to QT6 for the GraphicsView demos --- .../demo/Alpha_shapes_2/CMakeLists.txt | 20 +++++------ .../demo/Apollonius_graph_2/CMakeLists.txt | 18 +++++----- .../demo/Bounding_volumes/CMakeLists.txt | 18 +++++----- .../demo/Circular_kernel_2/CMakeLists.txt | 18 +++++----- GraphicsView/demo/Generator/CMakeLists.txt | 16 ++++----- GraphicsView/demo/GraphicsView/CMakeLists.txt | 12 +++---- .../demo/L1_Voronoi_diagram_2/CMakeLists.txt | 18 +++++----- .../demo/Largest_empty_rect_2/CMakeLists.txt | 16 ++++----- .../Periodic_2_triangulation_2/CMakeLists.txt | 18 +++++----- GraphicsView/demo/Polygon/CMakeLists.txt | 18 +++++----- .../Segment_Delaunay_graph_2/CMakeLists.txt | 22 +++++------- .../CMakeLists.txt | 16 ++++----- .../demo/Snap_rounding_2/CMakeLists.txt | 18 +++++----- .../demo/Spatial_searching_2/CMakeLists.txt | 18 +++++----- .../demo/Stream_lines_2/CMakeLists.txt | 20 +++++------ .../demo/Triangulation_2/CMakeLists.txt | 34 +++++++++--------- .../include/CGAL/Qt/DemosMainWindow_impl.h | 15 ++++---- GraphicsView/include/CGAL/Qt/qglviewer.h | 4 +-- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 2 +- Installation/CMakeLists.txt | 36 +++++++++---------- .../cmake/modules/CGALConfig_binary.cmake.in | 24 ++++++------- .../cmake/modules/CGALConfig_install.cmake.in | 20 +++++------ Installation/cmake/modules/CGAL_Macros.cmake | 8 ++--- .../CGAL_Qt6_moc_and_resource_files.cmake | 6 ++-- .../CGAL_SetupCGAL_Qt6Dependencies.cmake | 17 +++++---- .../cmake/modules/CGAL_add_test.cmake | 34 +++++++++--------- .../CGAL_setup_target_dependencies.cmake | 4 +-- Installation/lib/cmake/CGAL/CGALConfig.cmake | 5 ++- 28 files changed, 236 insertions(+), 239 deletions(-) diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index ca4a58c59589..771664f2a4b5 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -13,31 +13,31 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Alpha_shapes_2.ui) + qt6_wrap_ui(DT_UI_FILES Alpha_shapes_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Alpha_shapes_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Alpha_shapes_2.qrc) # The executable itself. add_executable( - Alpha_shapes_2 Alpha_shapes_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + Alpha_shapes_2 Alpha_shapes_2.cpp ${DT_UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shapes_2) - target_link_libraries(Alpha_shapes_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Alpha_shapes_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Alpha_shapes_2) @@ -45,5 +45,5 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Alpha_shapes_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index ab0f43011f9a..27a13e4b21cb 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -13,32 +13,32 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) #-------------------------------- # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Apollonius_graph_2.ui) + qt6_wrap_ui(DT_UI_FILES Apollonius_graph_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Apollonius_graph_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Apollonius_graph_2.qrc) # use the Qt MOC preprocessor on classes that derives from QObject # The executable itself. add_executable( Apollonius_graph_2 Apollonius_graph_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Apollonius_graph_2) - target_link_libraries(Apollonius_graph_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Apollonius_graph_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Apollonius_graph_2) @@ -46,5 +46,5 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Apollonius_graph_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 69a30838cea5..3325c4379037 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -13,34 +13,34 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Bounding_volumes.ui) + qt6_wrap_ui(DT_UI_FILES Bounding_volumes.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Bounding_volumes.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Bounding_volumes.qrc) # use the Qt MOC preprocessor on classes that derives from QObject # The executable itself. add_executable( Bounding_volumes Bounding_volumes.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Bounding_volumes) - target_link_libraries(Bounding_volumes PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Bounding_volumes PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Bounding_volumes) @@ -50,6 +50,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index eb2e2b790116..129bcd076b86 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -13,32 +13,32 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Circular_kernel_2.ui) + qt6_wrap_ui(DT_UI_FILES Circular_kernel_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Circular_kernel_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Circular_kernel_2.qrc) # use the Qt MOC preprocessor on classes that derives from QObject # The executable itself. add_executable( Circular_kernel_2 Circular_kernel_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Circular_kernel_2) - target_link_libraries(Circular_kernel_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Circular_kernel_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Circular_kernel_2) @@ -48,6 +48,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index 3be28ec735dc..58346ad7753c 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -12,36 +12,36 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Generator_2.ui) + qt6_wrap_ui(DT_UI_FILES Generator_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Generator_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Generator_2.qrc) # use the Qt MOC preprocessor on classes that derives from QObject # The executable itself. add_executable(Generator_2 Generator_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Generator_2) - target_link_libraries(Generator_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui) + target_link_libraries(Generator_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Generator_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/GraphicsView/CMakeLists.txt b/GraphicsView/demo/GraphicsView/CMakeLists.txt index 51617b00b874..4b3940bf0fa0 100644 --- a/GraphicsView/demo/GraphicsView/CMakeLists.txt +++ b/GraphicsView/demo/GraphicsView/CMakeLists.txt @@ -12,25 +12,25 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) - add_executable(min min.cpp ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + add_executable(min min.cpp ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS min) - target_link_libraries(min PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui) + target_link_libraries(min PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(min) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index 432cb655369e..b5e8e231bde5 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -13,32 +13,32 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES L1_voronoi_diagram_2.ui) + qt6_wrap_ui(DT_UI_FILES L1_voronoi_diagram_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./L1_voronoi_diagram_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./L1_voronoi_diagram_2.qrc) # The executable itself. add_executable( L1_voronoi_diagram_2 L1_voronoi_diagram_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS L1_voronoi_diagram_2) - target_link_libraries(L1_voronoi_diagram_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(L1_voronoi_diagram_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(L1_voronoi_diagram_2) @@ -48,6 +48,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index a6de2468c40b..7c83ab38c01c 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -13,36 +13,36 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Largest_empty_rectangle_2.ui) + qt6_wrap_ui(DT_UI_FILES Largest_empty_rectangle_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Largest_empty_rectangle_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Largest_empty_rectangle_2.qrc) # The executable itself. add_executable( Largest_empty_rectangle_2 Largest_empty_rectangle_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Largest_empty_rectangle_2) target_link_libraries(Largest_empty_rectangle_2 - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Largest_empty_rectangle_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index 2f964941bb01..0cae7c979012 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -10,22 +10,22 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Periodic_2_triangulation_2.ui) + qt6_wrap_ui(DT_UI_FILES Periodic_2_triangulation_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Periodic_2_triangulation_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Periodic_2_triangulation_2.qrc) # find header files for projects that can show them file(GLOB headers "*.h") @@ -39,8 +39,8 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Periodic_2_Delaunay_triangulation_2 Periodic_2_Delaunay_triangulation_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES} + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES} ${headers} ${QT_headers} ${P2T2_headers}) @@ -49,12 +49,12 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Periodic_2_Delaunay_triangulation_2) target_link_libraries(Periodic_2_Delaunay_triangulation_2 - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Periodic_2_Delaunay_triangulation_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index 8314d618d2ff..fb753dccefe5 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -13,7 +13,7 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 Core) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) @@ -22,9 +22,9 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) @@ -34,25 +34,25 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) endif() # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Polygon_2.ui) + qt6_wrap_ui(DT_UI_FILES Polygon_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Polygon_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Polygon_2.qrc) # add_library( CGAL SHARED IMPORTED ) # SET_PROPERTY(TARGET CGAL PROPERTY IMPORTED_LOCATION ${CGAL_LIBRARY} ) # The executable itself. add_executable(Polygon_2 Polygon_2.cpp ${DT_UI_FILES} ${DT_RESOURCE_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polygon_2) - target_link_libraries(Polygon_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - CGAL::Eigen3_support Qt5::Gui) + target_link_libraries(Polygon_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + CGAL::Eigen3_support Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Polygon_2) else() - message("NOTICE: This demo requires CGAL, CGAL_Core, and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL, CGAL_Core, and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 745fbb09ed0a..653619eb3201 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -13,40 +13,36 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 Core) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) -set(QT_USE_QTXML TRUE) -set(QT_USE_QTMAIN TRUE) -set(QT_USE_QTSCRIPT TRUE) -set(QT_USE_QTOPENGL TRUE) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) # UI files (Qt Designer files) - qt5_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) + qt6_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Segment_voronoi_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Segment_voronoi_2.qrc) # The executable itself. add_executable( Segment_voronoi_2 Segment_voronoi_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Segment_voronoi_2) - target_link_libraries(Segment_voronoi_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Segment_voronoi_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Segment_voronoi_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index f1d5e4fbbd41..25cc1e2f3b6f 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -13,39 +13,39 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 Core) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) set(QT_USE_QTXML TRUE) set(QT_USE_QTMAIN TRUE) set(QT_USE_QTSCRIPT TRUE) set(QT_USE_QTOPENGL TRUE) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) include_directories(BEFORE ./include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) # UI files (Qt Designer files) - qt5_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) + qt6_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Segment_voronoi_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Segment_voronoi_2.qrc) # The executable itself. add_executable( Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Segment_voronoi_linf_2) target_link_libraries(Segment_voronoi_linf_2 PRIVATE CGAL::CGAL - CGAL::CGAL_Qt5 Qt5::Gui) + CGAL::CGAL_Qt6 Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Segment_voronoi_linf_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index 0b7ebdeb6d86..aaffe63198b9 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -13,30 +13,30 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Snap_rounding_2.ui) + qt6_wrap_ui(DT_UI_FILES Snap_rounding_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Snap_rounding_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Snap_rounding_2.qrc) # The executable itself. add_executable( Snap_rounding_2 Snap_rounding_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Snap_rounding_2) - target_link_libraries(Snap_rounding_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Snap_rounding_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Snap_rounding_2) @@ -44,5 +44,5 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Snap_rounding_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6<, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index f5d5aad6d142..6615bea349df 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -13,36 +13,36 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Spatial_searching_2.ui) + qt6_wrap_ui(DT_UI_FILES Spatial_searching_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Spatial_searching_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Spatial_searching_2.qrc) # The executable itself. add_executable( Spatial_searching_2 Spatial_searching_2.cpp ${DT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Spatial_searching_2) - target_link_libraries(Spatial_searching_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Spatial_searching_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Spatial_searching_2) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index 0067351b4e14..19f88273a048 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -13,31 +13,31 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) # UI files (Qt Designer files) - qt5_wrap_ui(DT_UI_FILES Stream_lines_2.ui) + qt6_wrap_ui(DT_UI_FILES Stream_lines_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Stream_lines_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Stream_lines_2.qrc) # The executable itself. add_executable( - Stream_lines_2 Stream_lines_2.cpp ${DT_UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + Stream_lines_2 Stream_lines_2.cpp ${DT_UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Stream_lines_2) - target_link_libraries(Stream_lines_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Gui) + target_link_libraries(Stream_lines_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Stream_lines_2) @@ -47,6 +47,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/GraphicsView/demo/Triangulation_2/CMakeLists.txt b/GraphicsView/demo/Triangulation_2/CMakeLists.txt index 4560bc339dcb..6ee55850f86d 100644 --- a/GraphicsView/demo/Triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Triangulation_2/CMakeLists.txt @@ -16,11 +16,11 @@ endif() set(CMAKE_AUTOMOC TRUE) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) -find_package(Qt5 QUIET COMPONENTS Widgets) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) +find_package(Qt6 QUIET COMPONENTS Widgets) -if(NOT CGAL_Qt5_FOUND OR NOT Qt5_FOUND) - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") +if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") return() endif() @@ -31,15 +31,15 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # The "constrained Delaunay" demo: Constrained_Delaunay_triangulation_2 #-------------------------------- -qt5_add_resources(CD_RES_FILE Constrained_Delaunay_triangulation_2.qrc) -qt5_wrap_ui(CD_UI_FILES Constrained_Delaunay_triangulation_2.ui) +qt6_add_resources(CD_RES_FILE Constrained_Delaunay_triangulation_2.qrc) +qt6_wrap_ui(CD_UI_FILES Constrained_Delaunay_triangulation_2.ui) # The executable itself. add_executable( Constrained_Delaunay_triangulation_2 Constrained_Delaunay_triangulation_2.cpp ${CD_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CD_RES_FILE}) + ${CGAL_Qt6_RESOURCE_FILES} ${CD_RES_FILE}) target_link_libraries(Constrained_Delaunay_triangulation_2 - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) target_include_directories(Constrained_Delaunay_triangulation_2 PRIVATE ./include) @@ -48,14 +48,14 @@ add_to_cached_list(CGAL_EXECUTABLE_TARGETS Constrained_Delaunay_triangulation_2) #-------------------------------- # The "Delaunay" demo: Delaunay_triangulation_2 #-------------------------------- -qt5_wrap_ui(D_UI_FILES Delaunay_triangulation_2.ui) -qt5_add_resources(D_RES_FILE Delaunay_triangulation_2.qrc) +qt6_wrap_ui(D_UI_FILES Delaunay_triangulation_2.ui) +qt6_add_resources(D_RES_FILE Delaunay_triangulation_2.qrc) # The executable itself. add_executable( Delaunay_triangulation_2 Delaunay_triangulation_2.cpp ${D_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${D_RES_FILE}) + ${CGAL_Qt6_RESOURCE_FILES} ${D_RES_FILE}) target_link_libraries(Delaunay_triangulation_2 - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Delaunay_triangulation_2) @@ -64,13 +64,13 @@ add_to_cached_list(CGAL_EXECUTABLE_TARGETS Delaunay_triangulation_2) #-------------------------------- # The executable itself. -qt5_add_resources(R_RES_FILE Regular_triangulation_2.qrc) -qt5_wrap_ui(R_UI_FILES Regular_triangulation_2.ui) +qt6_add_resources(R_RES_FILE Regular_triangulation_2.qrc) +qt6_wrap_ui(R_UI_FILES Regular_triangulation_2.ui) add_executable( Regular_triangulation_2 Regular_triangulation_2.cpp ${R_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${R_RES_FILE}) -target_link_libraries(Regular_triangulation_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Widgets) + ${CGAL_Qt6_RESOURCE_FILES} ${R_RES_FILE}) +target_link_libraries(Regular_triangulation_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::Widgets) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Regular_triangulation_2) diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h index 009b142b963b..31458a45eca2 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h @@ -32,12 +32,11 @@ #include #include #include -#include +#include #include #include #include -#include -#include +#include #include #include #include @@ -205,16 +204,16 @@ void DemosMainWindow::setUseOpenGL(bool checked) { if(checked) { - QGLWidget* new_viewport = new QGLWidget; + // AF QOpenGLWidget* new_viewport = new QOpenGLWidget; // Setup the format to allow antialiasing with OpenGL: // one need to activate the SampleBuffers, if the graphic driver allows // this. - QGLFormat glformat = new_viewport->format(); - glformat.setOption(QGL::SampleBuffers); - new_viewport->setFormat(glformat); + // AF QGLFormat glformat = new_viewport->format(); + // AF glformat.setOption(QGL::SampleBuffers); + // AF new_viewport->setFormat(glformat); - view->setViewport(new_viewport); + // AF view->setViewport(new_viewport); } else { view->setViewport(new QWidget); diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 16fd9b123eb5..89885041c58a 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -72,8 +71,7 @@ class CGAL_QT_EXPORT QGLViewer : public QOpenGLWidget, public QOpenGLFunctions { public: //todo check if this is used. If not remove it - explicit QGLViewer(QGLContext* context, QWidget *parent = nullptr, - ::Qt::WindowFlags flags = ::Qt::WindowType(0)); + explicit QGLViewer(QOpenGLContext* context, QWidget *parent = nullptr, ::Qt::WindowFlags flags = ::Qt::WindowType(0)); explicit QGLViewer(QWidget *parent = nullptr, diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 0950301c127e..d54e88f8aba7 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 0a521d9dd2c2..e4372214daeb 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -500,7 +500,7 @@ macro(set_special_prefix library prefix) set(CGAL_EXT_LIB_${library}_PREFIX ${prefix}) endmacro() -set_special_prefix(Qt5 QT) +set_special_prefix(Qt6 QT) set_special_prefix(Eigen3 EIGEN3) set_special_prefix(Coin3D COIN3D) @@ -647,10 +647,10 @@ cache_get(CGAL_3RD_PARTY_INCLUDE_DIRS ) cache_get(CGAL_3RD_PARTY_LIBRARIES ) cache_get(CGAL_3RD_PARTY_LIBRARIES_DIRS) -install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/" DESTINATION "${CGAL_INSTALL_INC_DIR}/CGAL/Qt" COMPONENT CGAL_Qt5) +install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/" DESTINATION "${CGAL_INSTALL_INC_DIR}/CGAL/Qt" COMPONENT CGAL_Qt6) if(CGAL_BRANCH_BUILD) - install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/resources" COMPONENT CGAL_Qt5) - install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/icons" COMPONENT CGAL_Qt5) + install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/resources" COMPONENT CGAL_Qt6) + install(DIRECTORY "${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/" DESTINATION "${CGAL_INSTALL_CMAKE_DIR}/demo/icons" COMPONENT CGAL_Qt6) endif() # @@ -660,7 +660,7 @@ set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake) get_property(CGAL_FOUND GLOBAL PROPERTY CGAL_FOUND) get_property(CGAL_Core_FOUND GLOBAL PROPERTY CGAL_Core_FOUND) get_property(CGAL_ImageIO_FOUND GLOBAL PROPERTY CGAL_ImageIO_FOUND) -get_property(CGAL_Qt5_FOUND GLOBAL PROPERTY CGAL_Qt5_FOUND) +get_property(CGAL_Qt6_FOUND GLOBAL PROPERTY CGAL_Qt6_FOUND) # # Repeat some problems @@ -928,7 +928,7 @@ if(CGAL_BRANCH_BUILD) find_package(GMP REQUIRED) find_package(Doxygen REQUIRED) find_package(Eigen3 REQUIRED) - find_package(Qt5 COMPONENTS Core Widgets OpenGL Gui REQUIRED) + find_package(Qt6 COMPONENTS Core Widgets OpenGL Gui REQUIRED) find_package(VTK COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) find_package(IPE) find_package(RS3) @@ -939,10 +939,10 @@ if(CGAL_BRANCH_BUILD) set(compile_options "\ ${CMAKE_CXX_FLAGS} -DCGAL_EIGEN3_ENABLED -DCGAL_PROFILE \ -${Qt5Widgets_DEFINITIONS} ${Qt5OpenGL_DEFINITIONS} ${Qt5Gui_DEFINITIONS} \ -${Qt5OpenGL_EXECUTABLE_COMPILE_FLAGS} -fPIC \ -${Qt5Gui_EXECUTABLE_COMPILE_FLAGS} \ -${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_Qt5_3RD_PARTY_DEFINITIONS} \ +${Qt6Widgets_DEFINITIONS} ${Qt6OpenGL_DEFINITIONS} ${Qt6Gui_DEFINITIONS} \ +${Qt6OpenGL_EXECUTABLE_COMPILE_FLAGS} -fPIC \ +${Qt6Gui_EXECUTABLE_COMPILE_FLAGS} \ +${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_Qt6_3RD_PARTY_DEFINITIONS} \ ${CGAL_DEFINITIONS}") message("COMPILATION OPTIONS ARE : ${compile_options}") @@ -1032,11 +1032,11 @@ You must disable CGAL_ENABLE_CHECK_HEADERS.") ${RS_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR} ${GMP_INCLUDE_DIR} - ${Qt5OpenGL_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Gui_DEFINITIONS} + ${Qt6OpenGL_INCLUDE_DIRS} + ${Qt6Widgets_INCLUDE_DIRS} + ${Qt6Gui_DEFINITIONS} ${CGAL_3RD_PARTY_INCLUDE_DIRS} - ${CGAL_Qt5_3RD_PARTY_INCLUDE_DIRS}) + ${CGAL_Qt6_3RD_PARTY_INCLUDE_DIRS}) list(APPEND include_options "-I${incdir}") endforeach() include_directories(SYSTEM ${CGAL_3RD_PARTY_INCLUDE_DIRS}) @@ -1234,7 +1234,7 @@ endif() #print some info about versions if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) - find_package(Qt5 QUIET COMPONENTS Core) + find_package(Qt6 QUIET COMPONENTS Core) find_package(Boost) if(NOT CGAL_DISABLE_GMP) find_package(GMP) @@ -1248,7 +1248,7 @@ if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) STATUS "USING BOOST_VERSION = '${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}'" ) - if(Qt5_FOUND) - message(STATUS "USING Qt5_VERSION = '${Qt5Core_VERSION_STRING}'") - endif()#Qt5_FOUND + if(Qt6_FOUND) + message(STATUS "USING Qt6_VERSION = '${Qt6Core_VERSION_STRING}'") + endif()#Qt6_FOUND endif()#RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE diff --git a/Installation/cmake/modules/CGALConfig_binary.cmake.in b/Installation/cmake/modules/CGALConfig_binary.cmake.in index b15db42aa7e8..7987a2bbd1f3 100644 --- a/Installation/cmake/modules/CGALConfig_binary.cmake.in +++ b/Installation/cmake/modules/CGALConfig_binary.cmake.in @@ -36,7 +36,7 @@ else() CGAL_alias_library(CGAL) CGAL_alias_library(CGAL_Core) CGAL_alias_library(CGAL_ImageIO) - CGAL_alias_library(CGAL_Qt5) + CGAL_alias_library(CGAL_Qt6) endif() macro(CGAL_set_LIB_LIBRARY_var lib) @@ -50,7 +50,7 @@ endmacro() CGAL_set_LIB_LIBRARY_var(CGAL) CGAL_set_LIB_LIBRARY_var(CGAL_Core) CGAL_set_LIB_LIBRARY_var(CGAL_ImageIO) -CGAL_set_LIB_LIBRARY_var(CGAL_Qt5) +CGAL_set_LIB_LIBRARY_var(CGAL_Qt6) set(CGAL_CONFIGURED_LIBRARIES "@CGAL_ACTUAL_CONFIGURED_LIBRARIES@") @@ -120,15 +120,15 @@ macro(check_cgal_component COMPONENT) else( "${CGAL_LIB}" STREQUAL "CGAL" ) if ( WITH_${CGAL_LIB} ) if(TARGET CGAL::${CGAL_LIB}) - if ("${CGAL_LIB}" STREQUAL "CGAL_Qt5") - - include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_Qt5Dependencies.cmake") + if ("${CGAL_LIB}" STREQUAL "CGAL_Qt6") - if(CGAL_Qt5_MISSING_DEPS) - set( CGAL_Qt5_FOUND FALSE ) - message(STATUS "libCGAL_Qt5 is missing the dependencies: ${CGAL_Qt5_MISSING_DEPS} cannot be configured.") + include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_Qt6Dependencies.cmake") + + if(CGAL_Qt6_MISSING_DEPS) + set( CGAL_Qt6_FOUND FALSE ) + message(STATUS "libCGAL_Qt6 is missing the dependencies: ${CGAL_Qt6_MISSING_DEPS} cannot be configured.") else() - set( CGAL_Qt5_FOUND TRUE ) + set( CGAL_Qt6_FOUND TRUE ) endif() elseif("${CGAL_LIB}" STREQUAL "CGAL_Core") include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_CoreDependencies.cmake") @@ -138,10 +138,10 @@ macro(check_cgal_component COMPONENT) else() set( CGAL_Core_FOUND TRUE ) endif() - else("${CGAL_LIB}" STREQUAL "CGAL_Qt5") + else("${CGAL_LIB}" STREQUAL "CGAL_Qt6") # Libraries that have no dependencies set( ${CGAL_LIB}_FOUND TRUE ) - endif("${CGAL_LIB}" STREQUAL "CGAL_Qt5") + endif("${CGAL_LIB}" STREQUAL "CGAL_Qt6") else(TARGET CGAL::${CGAL_LIB}) set( ${CGAL_LIB}_FOUND FALSE ) set( CHECK_${CGAL_LIB}_ERROR_TAIL " CGAL was configured with WITH_${CGAL_LIB}=ON, but one of the dependencies of ${CGAL_LIB} was not configured properly." ) @@ -214,7 +214,7 @@ if (NOT TARGET CGAL::CGAL_Basic_viewer) add_library(CGAL::CGAL_Basic_viewer INTERFACE IMPORTED GLOBAL) set_target_properties(CGAL::CGAL_Basic_viewer PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_BASIC_VIEWER;QT_NO_KEYWORDS" - INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt5) + INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt6) endif() include("${CGAL_MODULES_DIR}/CGAL_enable_end_of_configuration_hook.cmake") diff --git a/Installation/cmake/modules/CGALConfig_install.cmake.in b/Installation/cmake/modules/CGALConfig_install.cmake.in index 00db762aa76d..9ee7c0ba8803 100644 --- a/Installation/cmake/modules/CGALConfig_install.cmake.in +++ b/Installation/cmake/modules/CGALConfig_install.cmake.in @@ -104,15 +104,15 @@ macro(check_cgal_component COMPONENT) if ( WITH_${CGAL_LIB} ) if(TARGET CGAL::${CGAL_LIB}) - if ("${CGAL_LIB}" STREQUAL "CGAL_Qt5") - - include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_Qt5Dependencies.cmake") + if ("${CGAL_LIB}" STREQUAL "CGAL_Qt6") - if(CGAL_Qt5_MISSING_DEPS) - set( CGAL_Qt5_FOUND FALSE ) - message(STATUS "libCGAL_Qt5 is missing the dependencies: ${CGAL_Qt5_MISSING_DEPS} cannot be configured.") + include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_Qt6Dependencies.cmake") + + if(CGAL_Qt6_MISSING_DEPS) + set( CGAL_Qt6_FOUND FALSE ) + message(STATUS "libCGAL_Qt6 is missing the dependencies: ${CGAL_Qt6_MISSING_DEPS} cannot be configured.") else() - set( CGAL_Qt5_FOUND TRUE ) + set( CGAL_Qt6_FOUND TRUE ) endif() elseif("${CGAL_LIB}" STREQUAL "CGAL_Core") include("${CGAL_MODULES_DIR}/CGAL_SetupCGAL_CoreDependencies.cmake") @@ -122,10 +122,10 @@ macro(check_cgal_component COMPONENT) else() set( CGAL_Core_FOUND TRUE ) endif() - else("${CGAL_LIB}" STREQUAL "CGAL_Qt5") + else("${CGAL_LIB}" STREQUAL "CGAL_Qt6") # Libraries that have no dependencies set( ${CGAL_LIB}_FOUND TRUE ) - endif("${CGAL_LIB}" STREQUAL "CGAL_Qt5") + endif("${CGAL_LIB}" STREQUAL "CGAL_Qt6") else(TARGET CGAL::${CGAL_LIB}) set( ${CGAL_LIB}_FOUND FALSE ) set( CHECK_${CGAL_LIB}_ERROR_TAIL " CGAL was configured with WITH_${CGAL_LIB}=ON, but one of the dependencies of ${CGAL_LIB} was not configured properly." ) @@ -198,7 +198,7 @@ if (NOT TARGET CGAL::CGAL_Basic_viewer) add_library(CGAL::CGAL_Basic_viewer INTERFACE IMPORTED GLOBAL) set_target_properties(CGAL::CGAL_Basic_viewer PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_BASIC_VIEWER;QT_NO_KEYWORDS" - INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt5) + INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt6) endif() include("${CGAL_MODULES_DIR}/CGAL_enable_end_of_configuration_hook.cmake") diff --git a/Installation/cmake/modules/CGAL_Macros.cmake b/Installation/cmake/modules/CGAL_Macros.cmake index 8ca618abcd46..2cc35fdc572e 100644 --- a/Installation/cmake/modules/CGAL_Macros.cmake +++ b/Installation/cmake/modules/CGAL_Macros.cmake @@ -229,7 +229,7 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) message (STATUS "Configured ${lib} from UseLIB-file: ${usefile}") # UseLIB-file has to set ${vlib}_SETUP to TRUE - # TODO EBEB what about Qt5, zlib? + # TODO EBEB what about Qt6, zlib? else() @@ -288,11 +288,11 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) add_to_list( CGAL_3RD_PARTY_DEFINITIONS ${CGAL_${component}_3RD_PARTY_DEFINITIONS} ) add_to_list( CGAL_3RD_PARTY_LIBRARIES_DIRS ${CGAL_${component}_3RD_PARTY_LIBRARIES_DIRS} ) - # To deal with imported targets of Qt5 and Boost, when CGAL + # To deal with imported targets of Qt6 and Boost, when CGAL # targets are themselves imported by another project. - if (${component} STREQUAL "Qt5") - find_package(Qt5 COMPONENTS OpenGL Gui Core Script ScriptTools QUIET) + if (${component} STREQUAL "Qt6") + find_package(Qt6 COMPONENTS Widgets OpenGLWidgets Gui Core Script ScriptTools QUIET) endif() else(WITH_CGAL_${component}) diff --git a/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake b/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake index 21b32bc2e9e6..c3c6cbb71431 100644 --- a/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake +++ b/Installation/cmake/modules/CGAL_Qt6_moc_and_resource_files.cmake @@ -4,7 +4,7 @@ endif() set(CGAL_Qt6_moc_and_resource_files_included TRUE) # qrc files (resources files, that contain icons, at least) if(EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc) - qt5_add_resources (_CGAL_Qt6_RESOURCE_FILES_private + qt6_add_resources (_CGAL_Qt6_RESOURCE_FILES_private ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/Input.qrc ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/File.qrc @@ -15,11 +15,11 @@ else() ${CGAL_MODULES_DIR}/demo/resources ${CGAL_MODULES_DIR}/demo/icons DESTINATION ${CMAKE_BINARY_DIR}) - qt5_add_resources (_CGAL_Qt6_RESOURCE_FILES_private + qt6_add_resources (_CGAL_Qt6_RESOURCE_FILES_private ${CMAKE_BINARY_DIR}/resources/CGAL.qrc ${CMAKE_BINARY_DIR}/icons/Input.qrc ${CMAKE_BINARY_DIR}/icons/File.qrc ${CMAKE_BINARY_DIR}/icons/Triangulation_2.qrc) endif() -qt5_wrap_ui(_CGAL_Qt6_UI_FILES ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/ImageInterface.ui) +qt_wrap_ui(_CGAL_Qt6_UI_FILES ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/ImageInterface.ui) diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake index 161e9673345c..690d018d33f8 100644 --- a/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGAL_Qt6Dependencies.cmake @@ -9,7 +9,7 @@ # # .. code-block:: cmake # -# find_package(Qt6 QUIET COMPONENTS OpenGL Svg) +# find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) # # and defines the variable :variable:`CGAL_Qt6_FOUND` and the function # :command:`CGAL_setup_CGAL_Qt6_dependencies`. @@ -24,19 +24,24 @@ set(CGAL_SetupCGAL_Qt6Dependencies_included TRUE) # Used Modules # ^^^^^^^^^^^^ # - :module:`Qt6Config` -find_package(Qt6 QUIET COMPONENTS OpenGL Svg) + +find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets Svg) set(CGAL_Qt6_MISSING_DEPS "") -if(NOT Qt6OpenGL_FOUND) - set(CGAL_Qt6_MISSING_DEPS "Qt6OpenGL") +if(NOT Qt6OpenGLWidgets_FOUND) + message( STATUS "NOTICE: NOT Qt6OpenGLWidgets_FOUND") + set(CGAL_Qt6_MISSING_DEPS "Qt6OpenGLWidgets") endif() if(NOT Qt6Svg_FOUND) + message(STATUS "NOTICE: NOT Qt6Svg_FOUND") set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} Qt6Svg") endif() if(NOT Qt6_FOUND) + message(STATUS "NOTICE: NOT Qt6_FOUND") set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} Qt6") endif() if(NOT EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsItem.h) + message(STATUS "NOTICE: NOT EXISTS GraphicsItem") set(CGAL_Qt6_MISSING_DEPS "${CGAL_Qt6_MISSING_DEPS} headers") endif() @@ -75,7 +80,7 @@ if(NOT CGAL_Qt6_MISSING_DEPS) POSITION_INDEPENDENT_CODE TRUE EXCLUDE_FROM_ALL TRUE AUTOMOC TRUE) - target_link_libraries(CGAL_Qt6_moc_and_resources CGAL::CGAL Qt6::Widgets Qt6::OpenGL Qt6::Svg ) + target_link_libraries(CGAL_Qt6_moc_and_resources CGAL::CGAL Qt6::Widgets Qt6::OpenGLWidgets Qt6::Svg ) add_library(CGAL::CGAL_Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) add_library(CGAL::Qt6_moc_and_resources ALIAS CGAL_Qt6_moc_and_resources) @@ -112,7 +117,7 @@ function(CGAL_setup_CGAL_Qt6_dependencies target) endif() target_link_libraries( ${target} INTERFACE CGAL::CGAL) target_link_libraries( ${target} INTERFACE CGAL::Qt6_moc_and_resources) - target_link_libraries( ${target} INTERFACE Qt6::OpenGL Qt6::Svg ) + target_link_libraries( ${target} INTERFACE Qt6::OpenGLWidgets Qt6::Svg ) # Remove -Wdeprecated-copy, for g++ >= 9.0, because Qt6, as of # version 5.12, has a lot of [-Wdeprecated-copy] warnings. diff --git a/Installation/cmake/modules/CGAL_add_test.cmake b/Installation/cmake/modules/CGAL_add_test.cmake index a5c8b2bc83a7..eb0c748109cc 100644 --- a/Installation/cmake/modules/CGAL_add_test.cmake +++ b/Installation/cmake/modules/CGAL_add_test.cmake @@ -117,23 +117,23 @@ function(cgal_add_compilation_test exe_name) set_property(TEST "check_build_system" PROPERTY FIXTURES_SETUP "check_build_system_SetupFixture") endif() - if(TARGET CGAL_Qt5_moc_and_resources) # if CGAL_Qt5 was searched, and is header-only + if(TARGET CGAL_Qt6_moc_and_resources) # if CGAL_Qt6 was searched, and is header-only get_property(linked_libraries TARGET "${exe_name}" PROPERTY LINK_LIBRARIES) # message(STATUS "${exe_name} depends on ${linked_libraries}") - string(FIND "${linked_libraries}" "CGAL::CGAL_Qt5" link_with_CGAL_Qt5) - if(link_with_CGAL_Qt5 STRGREATER "-1" AND - NOT TARGET compilation_of__CGAL_Qt5_moc_and_resources) + string(FIND "${linked_libraries}" "CGAL::CGAL_Qt6" link_with_CGAL_Qt6) + if(link_with_CGAL_Qt6 STRGREATER "-1" AND + NOT TARGET compilation_of__CGAL_Qt6_moc_and_resources) # This custom target is useless. It is used only as a flag to # detect that the test has already been created. - add_custom_target(compilation_of__CGAL_Qt5_moc_and_resources) - add_dependencies( compilation_of__CGAL_Qt5_moc_and_resources CGAL_Qt5_moc_and_resources ) - add_test(NAME "compilation_of__CGAL_Qt5_moc_and_resources" - COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target "CGAL_Qt5_moc_and_resources" --config "$") - set_property(TEST "compilation_of__CGAL_Qt5_moc_and_resources" + add_custom_target(compilation_of__CGAL_Qt6_moc_and_resources) + add_dependencies( compilation_of__CGAL_Qt6_moc_and_resources CGAL_Qt6_moc_and_resources ) + add_test(NAME "compilation_of__CGAL_Qt6_moc_and_resources" + COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target "CGAL_Qt6_moc_and_resources" --config "$") + set_property(TEST "compilation_of__CGAL_Qt6_moc_and_resources" APPEND PROPERTY LABELS "CGAL_build_system") - set_property(TEST "compilation_of__CGAL_Qt5_moc_and_resources" - PROPERTY FIXTURES_SETUP "CGAL_Qt5_moc_and_resources_Fixture") - set_property(TEST "compilation_of__CGAL_Qt5_moc_and_resources" + set_property(TEST "compilation_of__CGAL_Qt6_moc_and_resources" + PROPERTY FIXTURES_SETUP "CGAL_Qt6_moc_and_resources_Fixture") + set_property(TEST "compilation_of__CGAL_Qt6_moc_and_resources" APPEND PROPERTY DEPENDS "check_build_system") endif() endif() @@ -313,7 +313,7 @@ function(cgal_add_test exe_name) -P "${CGAL_MODULES_DIR}/run_test_with_cin.cmake") set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${cin_file}) - # message(STATUS "add test: ${exe_name} < ${cin_file}") + # message(STATUS "add test: ${exe_name} < ${cin_file}") endif() else() if(NOT ARGS AND NOT cgal_add_test_TEST_NAME) @@ -328,12 +328,12 @@ function(cgal_add_test exe_name) file(STRINGS "${cmd_file}" CMD_LINES) string(CONFIGURE "${CMD_LINES}" CMD_LINES) set(ARGS) - # message(STATUS "DEBUG test ${exe_name}") + # message(STATUS "DEBUG test ${exe_name}") foreach(CMD_LINE ${CMD_LINES}) - # message(STATUS " command line: ${CMD_LINE}") + # message(STATUS " command line: ${CMD_LINE}") string(REGEX REPLACE "\#.*" "" CMD_LINE "${CMD_LINE}") separate_arguments(CMD_LINE_ARGS UNIX_COMMAND ${CMD_LINE}) - # message(STATUS " args: ${CMD_LINE_ARGS}") + # message(STATUS " args: ${CMD_LINE_ARGS}") list(APPEND ARGS ${CMD_LINE_ARGS}) endforeach() expand_list_with_globbing(ARGS) @@ -341,7 +341,7 @@ function(cgal_add_test exe_name) APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${cmd_file}) endif() endif() - # message(STATUS "add test: ${exe_name} ${ARGS}") + # message(STATUS "add test: ${exe_name} ${ARGS}") if(ANDROID) add_test(NAME ${test_name} COMMAND ${TIME_COMMAND} ${adb_executable} shell cd ${CGAL_REMOTE_TEST_DIR_PREFIX}${PROJECT_NAME} && LD_LIBRARY_PATH=${CGAL_REMOTE_TEST_DIR_PREFIX}${PROJECT_NAME} ${CGAL_REMOTE_TEST_DIR_PREFIX}${PROJECT_NAME}/${exe_name} ${ARGS}) elseif(CGAL_RUN_TESTS_THROUGH_SSH) diff --git a/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake b/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake index bed40154c809..820664d04981 100644 --- a/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake +++ b/Installation/cmake/modules/CGAL_setup_target_dependencies.cmake @@ -5,7 +5,7 @@ function(CGAL_setup_target_dependencies target) CGAL_setup_CGAL_Core_dependencies(${target}) elseif(${target} STREQUAL CGAL_ImageIO) CGAL_setup_CGAL_ImageIO_dependencies(${target}) - elseif(${target} STREQUAL CGAL_Qt5) - CGAL_setup_CGAL_Qt5_dependencies(${target}) + elseif(${target} STREQUAL CGAL_Qt6) + CGAL_setup_CGAL_Qt6_dependencies(${target}) endif() endfunction() diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index b9030ecc4dc7..f7afccf00574 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -128,7 +128,7 @@ if( CGAL_DEV_MODE OR RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE ) endif() foreach(comp ${CGAL_FIND_COMPONENTS}) - if(NOT comp MATCHES "Core|ImageIO|Qt5") + if(NOT comp MATCHES "Core|ImageIO|Qt6") message(FATAL_ERROR "The requested CGAL component ${comp} does not exist!") endif() if(comp MATCHES "Core" AND CGAL_DISABLE_GMP) @@ -193,6 +193,5 @@ if (NOT TARGET CGAL::CGAL_Basic_viewer) add_library(CGAL::CGAL_Basic_viewer INTERFACE IMPORTED GLOBAL) set_target_properties(CGAL::CGAL_Basic_viewer PROPERTIES INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_BASIC_VIEWER;QT_NO_KEYWORDS" - INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt5) + INTERFACE_LINK_LIBRARIES CGAL::CGAL_Qt6) endif() - From 47683f2dea3c40bbd380b78426a47dee5d9154b0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 14:27:45 +0100 Subject: [PATCH 0205/1398] The Truiangulation_2/examples which use draw() compile and visualize but have an assertion in a QMap --- .../include/CGAL/Qt/Basic_viewer_qt.h | 4 ++-- .../include/CGAL/Qt/CreateOpenGLContext.h | 21 +++++++++++-------- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 6 +++++- .../examples/Triangulation_2/CMakeLists.txt | 6 +++--- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h index 3c7b05082b98..054740afb350 100644 --- a/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h +++ b/GraphicsView/include/CGAL/Qt/Basic_viewer_qt.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #ifdef __GNUC__ @@ -1779,7 +1779,7 @@ class Basic_viewer_qt : public CGAL::QGLViewer static const unsigned int NB_VBO_BUFFERS=(END_POS-BEGIN_POS)+ (END_COLOR-BEGIN_COLOR)+2; // +2 for 2 vectors of normals - QGLBuffer buffers[NB_VBO_BUFFERS]; + QOpenGLBuffer buffers[NB_VBO_BUFFERS]; // The following enum gives the indices of the different vao. enum diff --git a/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h b/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h index 20bed5105a18..e85911f73e87 100644 --- a/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h +++ b/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h @@ -13,19 +13,22 @@ #define CGAL_QT_CREATE_OPENGL_CONTEXT_H #include -#include + namespace CGAL{ namespace Qt{ -inline QGLContext* createOpenGLContext() +inline QOpenGLContext* createOpenGLContext() { QOpenGLContext *context = new QOpenGLContext(); - QSurfaceFormat format; - format.setVersion(2,1); - format.setProfile(QSurfaceFormat::CompatibilityProfile); - context->setFormat(format); - QGLContext *result = QGLContext::fromOpenGLContext(context); - result->create(); - return result; + context->create(); + return context; + + //QSurfaceFormat format; + //format.setVersion(2,1); + //format.setProfile(QSurfaceFormat::CompatibilityProfile); + //context->setFormat(format); + //QGLContext *result = QGLContext::fromOpenGLContext(context); + // result->create(); + //return result; } } // namespace Qt } // namespace CGAL diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index d54e88f8aba7..c8dec4a0725d 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -2455,7 +2456,10 @@ void CGAL::QGLViewer::setMouseBinding(::Qt::Key key, ::Qt::KeyboardModifiers mod mouseBinding_.insert(mbp, map); ClickBindingPrivate cbp(modifiers, button, false, ::Qt::NoButton, key); - clickBinding_.remove(cbp); + + // AF: currently results in a runtime error + // clickBinding_.remove(cbp); + } diff --git a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt index e4f5e7392ee8..47374a859985 100644 --- a/Triangulation_2/examples/Triangulation_2/CMakeLists.txt +++ b/Triangulation_2/examples/Triangulation_2/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Triangulation_2_Examples) -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # create a target per cppfile file( @@ -15,10 +15,10 @@ foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") endforeach() -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) target_link_libraries(polygon_triangulation PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(draw_triangulation_2 PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(star_conflict_zone PUBLIC CGAL::CGAL_Basic_viewer) else() - message(STATUS "NOTICE: Several examples require Qt5 and will not be compiled.") + message(STATUS "NOTICE: Several examples require Qt6 and will not be compiled.") endif() From b1040de076ee390b3062d9734fdae4fb597ee445 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 14:46:31 +0100 Subject: [PATCH 0206/1398] Surface_mesh example works as well --- Surface_mesh/examples/Surface_mesh/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt index b39506d8b451..87cdd52e06c4 100644 --- a/Surface_mesh/examples/Surface_mesh/CMakeLists.txt +++ b/Surface_mesh/examples/Surface_mesh/CMakeLists.txt @@ -9,8 +9,8 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Surface_mesh_Examples) -#CGAL_Qt5 is needed for the drawing. -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +#CGAL_Qt6 is needed for the drawing. +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) create_single_source_cgal_program("sm_points.cpp") create_single_source_cgal_program("sm_derivation.cpp") @@ -28,7 +28,7 @@ create_single_source_cgal_program("check_orientation.cpp") #create the executable of the application create_single_source_cgal_program("draw_surface_mesh.cpp") -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) #link it with the required CGAL libraries target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Basic_viewer) From 42a9757f2f1e9a768eabe4287a8071d797fe0d1d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 15:05:12 +0100 Subject: [PATCH 0207/1398] Fix to have a weak order --- GraphicsView/include/CGAL/Qt/qglviewer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 89885041c58a..2cf5b7faf342 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -1156,7 +1156,7 @@ private Q_SLOTS: return modifiers < cbp.modifiers; if (button != cbp.button) return button < cbp.button; - return doubleClick != cbp.doubleClick; + return doubleClick < cbp.doubleClick; } }; #endif From 370e81ef08a91199779dad96cbbb16a49f34a8bf Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 15:05:33 +0100 Subject: [PATCH 0208/1398] AABB Tree demo works --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 40 +++++++++++------------ AABB_tree/demo/AABB_tree/MainWindow.h | 2 +- AABB_tree/demo/AABB_tree/Scene.h | 4 +-- AABB_tree/demo/AABB_tree/Viewer.cpp | 2 +- GraphicsView/include/CGAL/Qt/debug_impl.h | 2 +- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index c777eba1798e..76e9faa655e4 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -20,28 +20,28 @@ endif() # Include this package's headers first include_directories(BEFORE ./ ./include) -# Find CGAL and CGAL Qt5 -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +# Find CGAL and CGAL Qt6 +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Script OpenGL Gui Svg) +# Find Qt6 itself +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Gui Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) - qt5_wrap_ui(UI_FILES MainWindow.ui) + qt6_wrap_ui(UI_FILES MainWindow.ui) include(AddFileDependencies) - qt5_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") + qt6_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") add_file_dependencies(MainWindow_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h") - qt5_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") + qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") add_file_dependencies(Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h") - qt5_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") + qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") add_file_dependencies(Scene_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Scene.h") - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES AABB_demo.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES AABB_demo.qrc) add_file_dependencies( AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" @@ -49,30 +49,30 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") add_executable( - AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} - #${CGAL_Qt5_MOC_FILES} + AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} + #${CGAL_Qt6_MOC_FILES} ) # Link with Qt libraries - target_link_libraries(AABB_demo PRIVATE Qt5::OpenGL Qt5::Gui - CGAL::CGAL CGAL::CGAL_Qt5) + target_link_libraries(AABB_demo PRIVATE Qt6::OpenGLWidgets Qt6::Gui + CGAL::CGAL CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(AABB_demo) -else(CGAL_Qt5_FOUND AND Qt5_FOUND) +else(CGAL_Qt6_FOUND AND Qt6_FOUND) set(AABB_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(AABB_MISSING_DEPS "CGAL_Qt5, ${AABB_MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(AABB_MISSING_DEPS "CGAL_Qt6, ${AABB_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(AABB_MISSING_DEPS "Qt5, ${AABB_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(AABB_MISSING_DEPS "Qt6, ${AABB_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${AABB_MISSING_DEPS}, and will not be compiled.") -endif(CGAL_Qt5_FOUND AND Qt5_FOUND) +endif(CGAL_Qt6_FOUND AND Qt6_FOUND) diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index 2a072f195121..f768694514b8 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -1,7 +1,7 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include +#include #include class QDragEnterEvent; diff --git a/AABB_tree/demo/AABB_tree/Scene.h b/AABB_tree/demo/AABB_tree/Scene.h index 44d7b8239ce8..cc109a433fdf 100644 --- a/AABB_tree/demo/AABB_tree/Scene.h +++ b/AABB_tree/demo/AABB_tree/Scene.h @@ -1,7 +1,7 @@ #ifndef SCENE_H #define SCENE_H -#include +#include #include #include @@ -77,7 +77,7 @@ class Scene : public QObject }; public: - QGLContext* context; + QOpenGLContext* context; void draw(CGAL::QGLViewer*); void update_bbox(); Bbox bbox() { return m_bbox; } diff --git a/AABB_tree/demo/AABB_tree/Viewer.cpp b/AABB_tree/demo/AABB_tree/Viewer.cpp index 7bc82f7770e6..6f5eac006797 100644 --- a/AABB_tree/demo/AABB_tree/Viewer.cpp +++ b/AABB_tree/demo/AABB_tree/Viewer.cpp @@ -1,7 +1,7 @@ #include "Viewer.h" #include "Scene.h" #include -#include +#include #include Viewer::Viewer(QWidget* parent) diff --git a/GraphicsView/include/CGAL/Qt/debug_impl.h b/GraphicsView/include/CGAL/Qt/debug_impl.h index eaa4d7ed108b..4f3c152697c6 100644 --- a/GraphicsView/include/CGAL/Qt/debug_impl.h +++ b/GraphicsView/include/CGAL/Qt/debug_impl.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include namespace CGAL { namespace Qt { From 5601e035ff0bd50bb7856028399071a2ab052da7 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 17:05:21 +0100 Subject: [PATCH 0209/1398] Change all CMakeLists.txt --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 148 ++++++++++-------- .../Plugins/Alpha_wrap_3/CMakeLists.txt | 2 +- .../Plugins/Camera_position/CMakeLists.txt | 2 +- .../Plugins/Classification/CMakeLists.txt | 2 +- .../Polyhedron/Plugins/Display/CMakeLists.txt | 2 +- .../demo/Polyhedron/Plugins/IO/CMakeLists.txt | 2 +- .../Polyhedron/Plugins/Mesh_2/CMakeLists.txt | 2 +- .../Polyhedron/Plugins/Mesh_3/CMakeLists.txt | 12 +- .../Operations_on_polyhedra/CMakeLists.txt | 6 +- .../Polyhedron/Plugins/PCA/CMakeLists.txt | 6 +- .../Polyhedron/Plugins/PMP/CMakeLists.txt | 26 +-- .../Plugins/Point_set/CMakeLists.txt | 26 +-- .../Plugins/Surface_mesh/CMakeLists.txt | 12 +- .../Tetrahedral_remeshing/CMakeLists.txt | 6 +- .../Plugins/Three_examples/CMakeLists.txt | 16 +- .../implicit_functions/CMakeLists.txt | 22 +-- 16 files changed, 156 insertions(+), 136 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index 9eb13d44e097..e78c8acd1d0b 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -36,25 +36,34 @@ option(POLYHEDRON_QTSCRIPT_DEBUGGER "Activate the use of Qt Script Debugger in Polyhedron_3 demo" OFF) # Find CGAL -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 ImageIO) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 ImageIO) set_package_properties(CGAL PROPERTIES TYPE REQUIRED) include(${CGAL_USE_FILE}) -# Find Qt5 itself -find_package(Qt5 QUIET - COMPONENTS OpenGL Script Widgets +if(CGAL_Qt6_FOUND) + message( STATUS "we found CGAL_Qt6") +endif() + +# Find Qt6 itself +find_package(Qt6 QUIET + COMPONENTS OpenGLWidgets Widgets OPTIONAL_COMPONENTS ScriptTools WebSockets Network) set_package_properties( - Qt5 PROPERTIES + Qt6 PROPERTIES TYPE REQUIRED PURPOSE "Enables the 3D Features, for GUI and visualization." - DESCRIPTION "To find this package, it should be sufficient to fill the Qt5_DIR variable with: ///lib/cmake/Qt5") + DESCRIPTION "To find this package, it should be sufficient to fill the Qt6_DIR variable with: ///lib/cmake/Qt6") + +if(NOT Qt6_FOUND) + message( STATUS "we did not find it") +endif() -if(Qt5_FOUND) +if(Qt6_FOUND) + message( STATUS "we did find Qt6") add_definitions(-DQT_NO_KEYWORDS) add_definitions(-DSCENE_IMAGE_GL_BUFFERS_AVAILABLE) -endif(Qt5_FOUND) +endif(Qt6_FOUND) find_package(Eigen3 3.2.0 QUIET) #(requires 3.2.0 or greater) set_package_properties( @@ -119,23 +128,34 @@ set_package_properties( DESCRIPTION "A library for parallel programming." PURPOSE "Plugins such as Mesh_3, Bilateral smoothing, and WLOP are faster if TBB is linked.") -if(CGAL_Qt5_FOUND AND Qt5_FOUND) + + +if(NOT CGAL_Qt6_FOUND) + message( STATUS "NOT CGAL_Qt6_FOUND") +endif() + +if(NOT Qt6_FOUND) + message( STATUS "NOT Qt6_FOUND") +endif() + + +if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) - qt5_wrap_ui(MainWindowUI_files MainWindow.ui) - qt5_wrap_ui(SubViewerUI_files SubViewer.ui) - qt5_wrap_ui(statisticsUI_FILES Statistics_on_item_dialog.ui) - qt5_wrap_ui(FileLoaderDialogUI_files FileLoaderDialog.ui) - qt5_wrap_ui(Show_point_dialogUI_FILES Show_point_dialog.ui) - qt5_wrap_ui(PreferencesUI_FILES Preferences.ui Details.ui SSH_dialog.ui) - qt5_wrap_ui(Show_point_dialogUI_FILES Show_point_dialog.ui) - qt5_wrap_ui(ViewerUI_FILES LightingDialog.ui) - qt5_generate_moc("File_loader_dialog.h" + qt6_wrap_ui(MainWindowUI_files MainWindow.ui) + qt6_wrap_ui(SubViewerUI_files SubViewer.ui) + qt6_wrap_ui(statisticsUI_FILES Statistics_on_item_dialog.ui) + qt6_wrap_ui(FileLoaderDialogUI_files FileLoaderDialog.ui) + qt6_wrap_ui(Show_point_dialogUI_FILES Show_point_dialog.ui) + qt6_wrap_ui(PreferencesUI_FILES Preferences.ui Details.ui SSH_dialog.ui) + qt6_wrap_ui(Show_point_dialogUI_FILES Show_point_dialog.ui) + qt6_wrap_ui(ViewerUI_FILES LightingDialog.ui) + qt6_generate_moc("File_loader_dialog.h" "${CMAKE_CURRENT_BINARY_DIR}/File_loader_dialog_moc.cpp") include(${CMAKE_CURRENT_SOURCE_DIR}/polyhedron_demo_macros.cmake) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES Polyhedron_3.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES Polyhedron_3.qrc) find_path( CGAL_THREE_HEADERS_PATH NAMES CGAL/Three/Scene_item.h @@ -144,16 +164,16 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) DOC "Path to CGAL/Three/Scene_item.h") if(CGAL_THREE_HEADERS_PATH) - qt5_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Viewer_interface.h" + qt6_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Viewer_interface.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_interface_moc.cpp") - qt5_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Scene_item.h" + qt6_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Scene_item.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_item_moc.cpp") - qt5_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Scene_group_item.h" + qt6_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Scene_group_item.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_group_item_moc.cpp") - qt5_generate_moc( + qt6_generate_moc( "${CGAL_THREE_HEADERS_PATH}/CGAL/Three/Scene_item_rendering_helper.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_item_rendering_helper_moc.cpp") - qt5_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/TextRenderer.h" + qt6_generate_moc("${CGAL_THREE_HEADERS_PATH}/CGAL/Three/TextRenderer.h" "${CMAKE_CURRENT_BINARY_DIR}/TextRenderer_moc.cpp") else() message(FATAL_ERROR "Cannot find ") @@ -174,8 +194,8 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Viewer.cpp Three.cpp ${ViewerUI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES} + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES} Viewer_interface_moc.cpp Scene_item_moc.cpp Scene_item.cpp @@ -191,11 +211,11 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Primitive_container.cpp Polyhedron_demo_plugin_helper.cpp CGAL_double_edit.cpp) - target_link_libraries(demo_framework PUBLIC Qt5::OpenGL Qt5::Widgets Qt5::Gui - Qt5::Script CGAL::CGAL_Qt5) - if(TARGET Qt5::WebSockets) - target_link_libraries(demo_framework PUBLIC Qt5::WebSockets) - message(STATUS "Qt5WebSockets was found. Using WebSockets is therefore possible.") + target_link_libraries(demo_framework PUBLIC Qt6::OpenGLWidgets Qt6::Widgets Qt6::Gui + CGAL::CGAL_Qt6) + if(TARGET Qt6::WebSockets) + target_link_libraries(demo_framework PUBLIC Qt6::WebSockets) + message(STATUS "Qt6WebSockets was found. Using WebSockets is therefore possible.") endif() #compilation_of__demo_framework is defined in polyhedron_demo_macros.cmake @@ -204,29 +224,29 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) # CMake). That is to deal with the visibility of symbols of # `Three.h`/`Three.cpp`. target_compile_definitions(demo_framework PRIVATE three_EXPORTS=1) - target_compile_definitions(demo_framework PRIVATE -DCGAL_USE_Qt5_RESOURCES) + target_compile_definitions(demo_framework PRIVATE -DCGAL_USE_Qt6_RESOURCES) add_library(scene_basic_objects SHARED Scene_plane_item.cpp Scene_spheres_item.cpp) target_link_libraries( - scene_basic_objects PUBLIC demo_framework ${CGAL_LIBRARIES} Qt5::OpenGL - Qt5::Gui Qt5::Script Qt5::Widgets) + scene_basic_objects PUBLIC demo_framework ${CGAL_LIBRARIES} Qt6::OpenGLWidgets + Qt6::Gui Qt6::Widgets) add_library(scene_color_ramp SHARED Color_ramp.cpp) - target_link_libraries(scene_color_ramp PRIVATE Qt5::Core) + target_link_libraries(scene_color_ramp PRIVATE Qt6::Core) add_library(scene_callback_signaler SHARED Callback_signaler.cpp) - target_link_libraries(scene_callback_signaler PRIVATE Qt5::Core) + target_link_libraries(scene_callback_signaler PRIVATE Qt6::Core) add_library(point_dialog SHARED Show_point_dialog.cpp Show_point_dialog.ui ${Show_point_dialogUI_FILES}) - target_link_libraries(point_dialog PUBLIC Qt5::OpenGL Qt5::Gui Qt5::Script - Qt5::Widgets) + target_link_libraries(point_dialog PUBLIC Qt6::OpenGLWidgets Qt6::Gui + Qt6::Widgets) macro(add_item item_name) add_library(${item_name} SHARED ${ARGN}) target_link_libraries( - ${item_name} PUBLIC demo_framework ${CGAL_LIBRARIES} Qt5::OpenGL Qt5::Gui - Qt5::Script Qt5::Widgets) + ${item_name} PUBLIC demo_framework ${CGAL_LIBRARIES} Qt6::OpenGLWidgets Qt6::Gui + Qt6::Widgets) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${item_name}) endmacro(add_item) @@ -286,7 +306,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_item(scene_textured_item Scene_textured_surface_mesh_item.cpp texture.cpp) target_link_libraries(scene_textured_item PUBLIC CGAL::Eigen3_support) - qt5_wrap_ui(editionUI_FILES Plugins/Surface_mesh_deformation/Deform_mesh.ui) + qt6_wrap_ui(editionUI_FILES Plugins/Surface_mesh_deformation/Deform_mesh.ui) add_item(scene_edit_item Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp ${editionUI_FILES}) @@ -337,35 +357,35 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) Polyhedron_demo.cpp File_loader_dialog_moc.cpp Use_ssh.cpp - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES} + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES} ${FileLoaderDialogUI_files} ${MainWindowUI_files} ${PreferencesUI_FILES} ${statisticsUI_FILES} ${SubViewerUI_files}) target_link_libraries( - polyhedron_demo PUBLIC demo_framework point_dialog Qt5::Gui Qt5::OpenGL - Qt5::Widgets Qt5::Script) + polyhedron_demo PUBLIC demo_framework point_dialog Qt6::Gui Qt6::OpenGLWidgets + Qt6::Widgets ) if(LIBSSH_FOUND) target_compile_definitions(polyhedron_demo PRIVATE -DCGAL_USE_SSH) target_link_libraries(polyhedron_demo PRIVATE ${LIBSSH_LIBRARIES}) target_include_directories(polyhedron_demo SYSTEM PRIVATE ${LIBSSH_INCLUDE_DIR}) endif() #libssh - if(TARGET Qt5::WebSockets) + if(TARGET Qt6::WebSockets) target_compile_definitions(polyhedron_demo PRIVATE -DCGAL_USE_WEBSOCKETS) target_compile_definitions(demo_framework PRIVATE -DCGAL_USE_WEBSOCKETS) - target_link_libraries(polyhedron_demo PRIVATE Qt5::WebSockets) + target_link_libraries(polyhedron_demo PRIVATE Qt6::WebSockets) endif() add_executable(Polyhedron_3 Polyhedron_3.cpp) target_link_libraries(Polyhedron_3 PRIVATE polyhedron_demo) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polyhedron_3) if(POLYHEDRON_QTSCRIPT_DEBUGGER) - if(TARGET Qt5::ScriptTools) - target_link_libraries(polyhedron_demo PUBLIC Qt5::ScriptTools) + if(TARGET Qt6::ScriptTools) + target_link_libraries(polyhedron_demo PUBLIC Qt6::ScriptTools) else() - message(STATUS "POLYHEDRON_QTSCRIPT_DEBUGGER is set to TRUE but the Qt5 ScriptTools library was not found.") + message(STATUS "POLYHEDRON_QTSCRIPT_DEBUGGER is set to TRUE but the Qt6 ScriptTools library was not found.") endif() endif() target_link_libraries(Polyhedron_3 PRIVATE demo_framework) @@ -409,23 +429,23 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS CGAL_PMP) #WS Server - if(TARGET Qt5::WebSockets AND TARGET Qt5::Network) + if(TARGET Qt6::WebSockets AND TARGET Qt6::Network) add_executable(WS_server Server_ws.cpp) - target_link_libraries(WS_server PUBLIC Qt5::WebSockets Qt5::Widgets Qt5::Network) - message(STATUS "Qt5WebSockets was found. Using WebSockets is therefore possible.") + target_link_libraries(WS_server PUBLIC Qt6::WebSockets Qt6::Widgets Qt6::Network) + message(STATUS "Qt6WebSockets was found. Using WebSockets is therefore possible.") endif() # # Exporting # - if(TARGET CGAL_Qt5) + if(TARGET CGAL_Qt6) export( - TARGETS CGAL CGAL_Qt5 CGAL_ImageIO + TARGETS CGAL CGAL_Qt6 CGAL_ImageIO FILE polyhedron_demo_targets.cmake NAMESPACE Polyhedron_) endif() - if(TARGET CGAL_Qt5_moc_and_resources) + if(TARGET CGAL_Qt6_moc_and_resources) export( - TARGETS CGAL_Qt5_moc_and_resources + TARGETS CGAL_Qt6_moc_and_resources NAMESPACE Polyhedron_ APPEND FILE polyhedron_demo_targets.cmake) endif() @@ -447,21 +467,21 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) CGAL_polyhedron_demoConfig.cmake) #TO DO script the activation of all the plugins. -else(CGAL_Qt5_FOUND AND Qt5_FOUND) +else(CGAL_Qt6_FOUND AND Qt6_FOUND) set(POLYHEDRON_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(POLYHEDRON_MISSING_DEPS "the CGAL Qt5 library, ${POLYHEDRON_MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(POLYHEDRON_MISSING_DEPS "the CGAL Qt6 library, ${POLYHEDRON_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(POLYHEDRON_MISSING_DEPS "Qt5, ${POLYHEDRON_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(POLYHEDRON_MISSING_DEPS "Qt6, ${POLYHEDRON_MISSING_DEPS}") endif() - message("NOTICE: This demo requires ${POLYHEDRON_MISSING_DEPS} and will not be compiled.") + message("NOTICE: XX This demo requires ${POLYHEDRON_MISSING_DEPS} and will not be compiled.") -endif(CGAL_Qt5_FOUND AND Qt5_FOUND) +endif(CGAL_Qt6_FOUND AND Qt6_FOUND) feature_summary( WHAT REQUIRED_PACKAGES_NOT_FOUND diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/CMakeLists.txt index 89b5b8ea92a1..3f6540236e37 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/CMakeLists.txt @@ -1,7 +1,7 @@ include(polyhedron_demo_macros) #if the plugin has a UI file -qt5_wrap_ui(alpha_wrap_3UI_FILES alpha_wrap_3_dialog.ui) +qt6_wrap_ui(alpha_wrap_3UI_FILES alpha_wrap_3_dialog.ui) polyhedron_demo_plugin(alpha_wrap_3_plugin Alpha_wrap_3_plugin ${alpha_wrap_3UI_FILES}) #if the plugin uses external libraries like scene_items diff --git a/Polyhedron/demo/Polyhedron/Plugins/Camera_position/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Camera_position/CMakeLists.txt index 35c19f5a82aa..e080e6837a31 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Camera_position/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Camera_position/CMakeLists.txt @@ -1,6 +1,6 @@ include( polyhedron_demo_macros ) -qt5_wrap_ui( cameraUI_FILES Camera_positions_list.ui ) +qt6_wrap_ui( cameraUI_FILES Camera_positions_list.ui ) polyhedron_demo_plugin(camera_positions_plugin Camera_positions_plugin Camera_positions_list.cpp diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt index 86d60a563194..7b8cafbb3c41 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/CMakeLists.txt @@ -20,7 +20,7 @@ if(TARGET CGAL::Eigen3_support) message(STATUS "NOTICE: OpenCV was not found. OpenCV random forest predicate for classification won't be available.") endif() - qt5_wrap_ui(classificationUI_FILES Classification_widget.ui + qt6_wrap_ui(classificationUI_FILES Classification_widget.ui Classification_advanced_widget.ui) polyhedron_demo_plugin( classification_plugin diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt index 6e1c99909175..3831b4679a13 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt @@ -1,6 +1,6 @@ include(polyhedron_demo_macros) if(TARGET CGAL::Eigen3_support) - qt5_wrap_ui( display_propertyUI_FILES Display_property.ui ) + qt6_wrap_ui( display_propertyUI_FILES Display_property.ui ) polyhedron_demo_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES} KEYWORDS Viewer) target_link_libraries(display_property_plugin PUBLIC diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt index 0d4300700dc9..ec7b583d8a28 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/CMakeLists.txt @@ -11,7 +11,7 @@ include(CGAL_LASLIB_support) polyhedron_demo_plugin(gocad_plugin GOCAD_io_plugin KEYWORDS Viewer) target_link_libraries(gocad_plugin PUBLIC scene_surface_mesh_item) -qt5_wrap_ui( funcUI_FILES Function_dialog.ui ) +qt6_wrap_ui( funcUI_FILES Function_dialog.ui ) polyhedron_demo_plugin(io_implicit_function_plugin Implicit_function_io_plugin ${funcUI_FILES} diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/CMakeLists.txt index e4336410f023..3f3be1c57aac 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_2/CMakeLists.txt @@ -1,6 +1,6 @@ include(polyhedron_demo_macros) #if the plugin has a UI file -qt5_wrap_ui(mesh_2UI_FILES mesh_2_dialog.ui) +qt6_wrap_ui(mesh_2UI_FILES mesh_2_dialog.ui) polyhedron_demo_plugin(mesh_2_plugin Mesh_2_plugin ${mesh_2UI_FILES}) #if the plugin uses external libraries like scene_items target_link_libraries( diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 9bf2f376761b..7343e7e215cd 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -2,11 +2,11 @@ include(polyhedron_demo_macros) remove_definitions(-DQT_STATICPLUGIN) -qt5_wrap_cpp(VOLUME_MOC_OUTFILES +qt6_wrap_cpp(VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_thread.h) -qt5_wrap_cpp(VOLUME_MOC_OUTFILES +qt6_wrap_cpp(VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_interface.h) -qt5_wrap_ui(meshingUI_FILES Meshing_dialog.ui Smoother_dialog.ui +qt6_wrap_ui(meshingUI_FILES Meshing_dialog.ui Smoother_dialog.ui Local_optimizers_dialog.ui) polyhedron_demo_plugin( mesh_3_plugin @@ -55,7 +55,7 @@ endif() find_package(Boost QUIET OPTIONAL_COMPONENTS filesystem system) if(Boost_FILESYSTEM_FOUND) - qt5_wrap_ui( imgUI_FILES Image_res_dialog.ui raw_image.ui) + qt6_wrap_ui( imgUI_FILES Image_res_dialog.ui raw_image.ui) polyhedron_demo_plugin(io_image_plugin Io_image_plugin Volume_plane_intersection.cpp Raw_image_dialog.cpp @@ -101,11 +101,11 @@ endif() polyhedron_demo_plugin(c3t3_io_plugin C3t3_io_plugin KEYWORDS Viewer Mesh_3) target_link_libraries(c3t3_io_plugin PUBLIC scene_c3t3_item) -qt5_wrap_ui(tetraUI_FILES Tetrahedra_filter_widget.ui) +qt6_wrap_ui(tetraUI_FILES Tetrahedra_filter_widget.ui) polyhedron_demo_plugin(tetrahedra_filtering_plugin Tetrahedra_filtering_plugin ${tetraUI_FILES} KEYWORDS Mesh_3 Viewer) target_link_libraries(tetrahedra_filtering_plugin PUBLIC scene_c3t3_item scene_tetrahedra_item) -qt5_wrap_ui(ribUI_FILES Rib_dialog.ui) +qt6_wrap_ui(ribUI_FILES Rib_dialog.ui) polyhedron_demo_plugin(c3t3_rib_exporter_plugin C3t3_rib_exporter_plugin ${ribUI_FILES} KEYWORDS Mesh_3) target_link_libraries(c3t3_rib_exporter_plugin PUBLIC scene_c3t3_item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/CMakeLists.txt index 628d00b72d34..2e030be7f6df 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Operations_on_polyhedra/CMakeLists.txt @@ -1,5 +1,5 @@ include(polyhedron_demo_macros) -qt5_wrap_ui(clip_polyhedronUI_FILES Clip_polyhedron_plugin.ui) +qt6_wrap_ui(clip_polyhedronUI_FILES Clip_polyhedron_plugin.ui) polyhedron_demo_plugin(clip_polyhedron_plugin Clip_polyhedron_plugin ${clip_polyhedronUI_FILES}) target_link_libraries( @@ -16,12 +16,12 @@ target_link_libraries( polyhedron_demo_plugin(diff_between_meshes_plugin Diff_between_meshes_plugin) target_link_libraries(diff_between_meshes_plugin PUBLIC scene_surface_mesh_item) - qt5_wrap_ui( animateUI_FILES Animate_widget.ui ) + qt6_wrap_ui( animateUI_FILES Animate_widget.ui ) polyhedron_demo_plugin(animate_mesh_plugin Animate_mesh_plugin ${animateUI_FILES}) target_link_libraries(animate_mesh_plugin PUBLIC scene_surface_mesh_item) if( TARGET CGAL::METIS_support ) - qt5_wrap_ui( partitionUI_FILES PartitionDialog.ui ) + qt6_wrap_ui( partitionUI_FILES PartitionDialog.ui ) polyhedron_demo_plugin(partition_plugin Partition_graph_plugin ${partitionUI_FILES}) target_link_libraries(partition_plugin PUBLIC scene_surface_mesh_item CGAL::METIS_support ) else() diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PCA/CMakeLists.txt index 4171347a6dcc..ccc765452927 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/CMakeLists.txt @@ -4,7 +4,7 @@ target_link_libraries( pca_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item scene_basic_objects) -qt5_wrap_ui(transformUI_FILES Transformation_widget.ui MeshOnGrid_dialog.ui) +qt6_wrap_ui(transformUI_FILES Transformation_widget.ui MeshOnGrid_dialog.ui) polyhedron_demo_plugin(affine_transform_plugin Affine_transform_plugin ${transformUI_FILES} KEYWORDS PointSetProcessing) @@ -16,7 +16,7 @@ polyhedron_demo_plugin(edit_box_plugin Edit_box_plugin) target_link_libraries(edit_box_plugin PUBLIC scene_edit_box_item scene_surface_mesh_item) -qt5_wrap_ui(clipUI_FILES Clipping_box_widget.ui) +qt6_wrap_ui(clipUI_FILES Clipping_box_widget.ui) polyhedron_demo_plugin(clipping_box_plugin Clipping_box_plugin ${clipUI_FILES}) target_link_libraries(clipping_box_plugin PUBLIC scene_edit_box_item scene_basic_objects) @@ -29,7 +29,7 @@ target_link_libraries( create_obb_mesh_plugin PUBLIC scene_surface_mesh_item scene_selection_item scene_points_with_normal_item) -qt5_wrap_ui(volumesUI_FILES Basic_generator_widget.ui) +qt6_wrap_ui(volumesUI_FILES Basic_generator_widget.ui) polyhedron_demo_plugin( basic_generator_plugin Basic_generator_plugin ${volumesUI_FILES} KEYWORDS PolygonMesh PointSetProcessing) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index 6ff2b7c356dc..3abd47002122 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -15,15 +15,15 @@ target_link_libraries(extrude_plugin PUBLIC scene_surface_mesh_item if(TARGET CGAL::Eigen3_support) if("${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") - qt5_wrap_ui( hole_fillingUI_FILES Hole_filling_widget.ui) + qt6_wrap_ui( hole_fillingUI_FILES Hole_filling_widget.ui) polyhedron_demo_plugin(hole_filling_plugin Hole_filling_plugin ${hole_fillingUI_FILES} KEYWORDS PMP) target_link_libraries(hole_filling_plugin PUBLIC scene_surface_mesh_item scene_polylines_item scene_selection_item CGAL::Eigen3_support) - qt5_wrap_ui( fairingUI_FILES Fairing_widget.ui) + qt6_wrap_ui( fairingUI_FILES Fairing_widget.ui) polyhedron_demo_plugin(fairing_plugin Fairing_plugin ${fairingUI_FILES} KEYWORDS PMP) target_link_libraries(fairing_plugin PUBLIC scene_selection_item CGAL::Eigen3_support) - qt5_wrap_ui( Mean_curvature_flow_skeleton_pluginUI_FILES Mean_curvature_flow_skeleton_plugin.ui) + qt6_wrap_ui( Mean_curvature_flow_skeleton_pluginUI_FILES Mean_curvature_flow_skeleton_plugin.ui) polyhedron_demo_plugin(mean_curvature_flow_skeleton_plugin Mean_curvature_flow_skeleton_plugin ${Mean_curvature_flow_skeleton_pluginUI_FILES}) target_link_libraries(mean_curvature_flow_skeleton_plugin PUBLIC @@ -34,7 +34,7 @@ if(TARGET CGAL::Eigen3_support) demo_framework CGAL::Eigen3_support) # The smoothing plugin can still do some things, even if Ceres is not found - qt5_wrap_ui( smoothingUI_FILES Smoothing_plugin.ui Smoothing_tangential_relaxation.ui) + qt6_wrap_ui( smoothingUI_FILES Smoothing_plugin.ui Smoothing_tangential_relaxation.ui) polyhedron_demo_plugin(smoothing_plugin Smoothing_plugin ${smoothingUI_FILES}) target_link_libraries(smoothing_plugin PUBLIC scene_surface_mesh_item scene_selection_item CGAL::Eigen3_support) find_package(Ceres QUIET) @@ -49,7 +49,7 @@ if(TARGET CGAL::Eigen3_support) PURPOSE "Can be used as a solver in the smoothing plugin.") target_link_libraries(extrude_plugin PUBLIC CGAL::Eigen3_support) - qt5_wrap_ui(remeshPlanarPatchesUI_FILES Remesh_planar_patches_dialog.ui) + qt6_wrap_ui(remeshPlanarPatchesUI_FILES Remesh_planar_patches_dialog.ui) polyhedron_demo_plugin(remesh_planar_patches_plugin Remesh_planar_patches_plugin ${remeshPlanarPatchesUI_FILES} KEYWORDS PMP) target_link_libraries(remesh_planar_patches_plugin PUBLIC scene_surface_mesh_item CGAL::Eigen3_support) @@ -71,7 +71,7 @@ else() message(STATUS "NOTICE: The hole filling and fairing plugins require Eigen 3.2 (or higher) and will not be available.") endif() -qt5_wrap_ui(soupUI_FILES Repair_soup.ui) +qt6_wrap_ui(soupUI_FILES Repair_soup.ui) polyhedron_demo_plugin(orient_soup_plugin Orient_soup_plugin ${soupUI_FILES} KEYWORDS Classification PMP) target_link_libraries( @@ -85,18 +85,18 @@ target_link_libraries(inside_out_plugin PUBLIC scene_surface_mesh_item scene_pol polyhedron_demo_plugin(join_and_split_plugin Join_and_split_polyhedra_plugin KEYWORDS PMP) target_link_libraries(join_and_split_plugin PUBLIC scene_surface_mesh_item scene_selection_item) -qt5_wrap_ui( point_inside_polyhedronUI_FILES Point_inside_polyhedron_widget.ui) +qt6_wrap_ui( point_inside_polyhedronUI_FILES Point_inside_polyhedron_widget.ui) polyhedron_demo_plugin(point_inside_polyhedron_plugin Point_inside_polyhedron_plugin ${point_inside_polyhedronUI_FILES}) target_link_libraries(point_inside_polyhedron_plugin PUBLIC scene_surface_mesh_item scene_points_with_normal_item) -qt5_wrap_ui( polyhedron_slicerUI_FILES Polyhedron_slicer_widget.ui) +qt6_wrap_ui( polyhedron_slicerUI_FILES Polyhedron_slicer_widget.ui) polyhedron_demo_plugin(polyhedron_slicer_plugin Polyhedron_slicer_plugin ${polyhedron_slicerUI_FILES}) target_link_libraries(polyhedron_slicer_plugin PUBLIC scene_surface_mesh_item scene_basic_objects scene_polylines_item) polyhedron_demo_plugin(polyhedron_stitching_plugin Polyhedron_stitching_plugin KEYWORDS PMP) target_link_libraries(polyhedron_stitching_plugin PUBLIC scene_surface_mesh_item scene_polylines_item) -qt5_wrap_ui( selectionUI_FILES Selection_widget.ui) +qt6_wrap_ui( selectionUI_FILES Selection_widget.ui) polyhedron_demo_plugin(selection_plugin Selection_plugin ${selectionUI_FILES} KEYWORDS PMP Viewer Classification Mesh_3) target_link_libraries(selection_plugin PUBLIC scene_selection_item scene_points_with_normal_item scene_polylines_item) @@ -117,11 +117,11 @@ target_link_libraries( PUBLIC scene_surface_mesh_item scene_polylines_item scene_points_with_normal_item) -qt5_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui) +qt6_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui) polyhedron_demo_plugin(repair_polyhedron_plugin Repair_polyhedron_plugin ${repairUI_FILES} KEYWORDS PMP) target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item) -qt5_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) +qt6_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) polyhedron_demo_plugin(isotropic_remeshing_plugin Isotropic_remeshing_plugin ${isotropicRemeshingUI_FILES} KEYWORDS PMP) target_link_libraries(isotropic_remeshing_plugin PUBLIC scene_surface_mesh_item @@ -141,7 +141,7 @@ endif() polyhedron_demo_plugin(detect_sharp_edges_plugin Detect_sharp_edges_plugin KEYWORDS Viewer Mesh_3 PMP) target_link_libraries(detect_sharp_edges_plugin PUBLIC scene_surface_mesh_item) -qt5_wrap_ui(randomPerturbationUI_FILES Random_perturbation_dialog.ui) +qt6_wrap_ui(randomPerturbationUI_FILES Random_perturbation_dialog.ui) polyhedron_demo_plugin(random_perturbation_plugin Random_perturbation_plugin ${randomPerturbationUI_FILES} KEYWORDS PMP) target_link_libraries(random_perturbation_plugin PUBLIC scene_surface_mesh_item @@ -152,7 +152,7 @@ polyhedron_demo_plugin(degenerated_faces_plugin Degenerated_faces_plugin target_link_libraries(degenerated_faces_plugin PUBLIC scene_surface_mesh_item scene_selection_item) -qt5_wrap_ui(engravUI_FILES Engrave_dock_widget.ui) +qt6_wrap_ui(engravUI_FILES Engrave_dock_widget.ui) polyhedron_demo_plugin(engrave_text_plugin Engrave_text_plugin ${engravUI_FILES}) target_link_libraries( diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt index 1955755b2dbb..3bade0d26e6e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/CMakeLists.txt @@ -24,7 +24,7 @@ if(TARGET CGAL::Eigen3_support) message(STATUS "NOTICE: SCIP and GLPK were not found. Polygonal surface reconstruction will not be available.") endif() - qt5_wrap_ui(surface_reconstructionUI_FILES Surface_reconstruction_plugin.ui) + qt6_wrap_ui(surface_reconstructionUI_FILES Surface_reconstruction_plugin.ui) polyhedron_demo_plugin( surface_reconstruction_plugin Surface_reconstruction_plugin @@ -46,7 +46,7 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(surface_reconstruction_plugin PUBLIC CGAL::GLPK_support) endif() - qt5_wrap_ui(point_set_normal_estimationUI_FILES + qt6_wrap_ui(point_set_normal_estimationUI_FILES Point_set_normal_estimation_plugin.ui) polyhedron_demo_plugin( point_set_normal_estimation_plugin Point_set_normal_estimation_plugin @@ -57,7 +57,7 @@ if(TARGET CGAL::Eigen3_support) PUBLIC scene_points_with_normal_item scene_callback_signaler CGAL::Eigen3_support) - qt5_wrap_ui(features_detection_pluginUI_FILES Features_detection_plugin.ui) + qt6_wrap_ui(features_detection_pluginUI_FILES Features_detection_plugin.ui) polyhedron_demo_plugin( features_detection_plugin Features_detection_plugin ${features_detection_pluginUI_FILES} KEYWORDS PointSetProcessing) @@ -80,7 +80,7 @@ if(TARGET CGAL::Eigen3_support) PUBLIC scene_points_with_normal_item scene_callback_signaler CGAL::Eigen3_support) - qt5_wrap_ui(point_set_shape_detectionUI_FILES + qt6_wrap_ui(point_set_shape_detectionUI_FILES Point_set_shape_detection_plugin.ui) polyhedron_demo_plugin( point_set_shape_detection_plugin Point_set_shape_detection_plugin @@ -97,7 +97,7 @@ if(TARGET CGAL::Eigen3_support) include(CGAL_pointmatcher_support) if(TARGET CGAL::OpenGR_support OR CGAL::pointmatcher_support) - qt5_wrap_ui(register_point_setsUI_FILES Register_point_sets_plugin.ui) + qt6_wrap_ui(register_point_setsUI_FILES Register_point_sets_plugin.ui) polyhedron_demo_plugin( register_point_sets_plugin Register_point_sets_plugin ${register_point_setsUI_FILES} KEYWORDS PointSetProcessing) @@ -123,7 +123,7 @@ else() message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. Feature detection plugin will not be available.") endif() -qt5_wrap_ui(point_set_bilateral_smoothingUI_FILES +qt6_wrap_ui(point_set_bilateral_smoothingUI_FILES Point_set_bilateral_smoothing_plugin.ui) polyhedron_demo_plugin( point_set_bilateral_smoothing_plugin Point_set_bilateral_smoothing_plugin @@ -132,7 +132,7 @@ target_link_libraries( point_set_bilateral_smoothing_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler) -qt5_wrap_ui(ps_outliers_removal_UI_FILES Point_set_outliers_removal_plugin.ui) +qt6_wrap_ui(ps_outliers_removal_UI_FILES Point_set_outliers_removal_plugin.ui) polyhedron_demo_plugin( point_set_outliers_removal_plugin Point_set_outliers_removal_plugin ${ps_outliers_removal_UI_FILES} KEYWORDS PointSetProcessing) @@ -140,7 +140,7 @@ target_link_libraries( point_set_outliers_removal_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler) -qt5_wrap_ui(point_set_selectionUI_FILES Point_set_selection_widget.ui) +qt6_wrap_ui(point_set_selectionUI_FILES Point_set_selection_widget.ui) polyhedron_demo_plugin( point_set_selection_plugin Point_set_selection_plugin ${point_set_selectionUI_FILES} KEYWORDS PointSetProcessing Classification) @@ -148,7 +148,7 @@ target_link_libraries( point_set_selection_plugin PUBLIC scene_points_with_normal_item scene_polylines_item scene_edit_box_item) -qt5_wrap_ui(point_set_simplificationUI_FILES Point_set_simplification_plugin.ui) +qt6_wrap_ui(point_set_simplificationUI_FILES Point_set_simplification_plugin.ui) polyhedron_demo_plugin( point_set_simplification_plugin Point_set_simplification_plugin ${point_set_simplificationUI_FILES} KEYWORDS PointSetProcessing) @@ -156,14 +156,14 @@ target_link_libraries( point_set_simplification_plugin PUBLIC scene_points_with_normal_item scene_callback_signaler) -qt5_wrap_ui(point_set_upsamplingUI_FILES Point_set_upsampling_plugin.ui) +qt6_wrap_ui(point_set_upsamplingUI_FILES Point_set_upsampling_plugin.ui) polyhedron_demo_plugin( point_set_upsampling_plugin Point_set_upsampling_plugin ${point_set_upsamplingUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(point_set_upsampling_plugin PUBLIC scene_points_with_normal_item) -qt5_wrap_ui(point_set_wlopFILES Point_set_wlop_plugin.ui) +qt6_wrap_ui(point_set_wlopFILES Point_set_wlop_plugin.ui) polyhedron_demo_plugin(point_set_wlop_plugin Point_set_wlop_plugin ${point_set_wlopFILES} KEYWORDS PointSetProcessing) target_link_libraries(point_set_wlop_plugin PUBLIC scene_points_with_normal_item @@ -186,13 +186,13 @@ polyhedron_demo_plugin( target_link_libraries(point_set_interference_plugin PUBLIC scene_points_with_normal_item) -qt5_wrap_ui(alpha_shapeUI_FILES Alpha_shape_widget.ui) +qt6_wrap_ui(alpha_shapeUI_FILES Alpha_shape_widget.ui) polyhedron_demo_plugin(alpha_shape_plugin Alpha_shape_plugin ${alpha_shapeUI_FILES} KEYWORDS PointSetProcessing) target_link_libraries(alpha_shape_plugin PUBLIC scene_points_with_normal_item scene_c3t3_item) -qt5_wrap_ui(distanceUI_FILES Point_set_to_mesh_distance_widget.ui) +qt6_wrap_ui(distanceUI_FILES Point_set_to_mesh_distance_widget.ui) polyhedron_demo_plugin( point_set_to_mesh_distance_plugin Point_set_to_mesh_distance_plugin ${distanceUI_FILES} KEYWORDS PointSetProcessing) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt index 4e553fbde16a..1c211311a738 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt @@ -9,7 +9,7 @@ if(NOT CGAL_DISABLE_GMP) include(${CGAL_USE_FILE}) - qt5_wrap_ui(parameterizationUI_FILES Parameterization_widget.ui OTE_dialog.ui) + qt6_wrap_ui(parameterizationUI_FILES Parameterization_widget.ui OTE_dialog.ui) polyhedron_demo_plugin(parameterization_plugin Parameterization_plugin ${parameterizationUI_FILES}) target_link_libraries( @@ -26,7 +26,7 @@ if(NOT CGAL_DISABLE_GMP) message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. The Parameterization plugin will not be available.") endif() - qt5_wrap_ui(segmentationUI_FILES Mesh_segmentation_widget.ui) + qt6_wrap_ui(segmentationUI_FILES Mesh_segmentation_widget.ui) polyhedron_demo_plugin(mesh_segmentation_plugin Mesh_segmentation_plugin ${segmentationUI_FILES}) target_link_libraries(mesh_segmentation_plugin PUBLIC scene_surface_mesh_item) @@ -37,11 +37,11 @@ if(NOT CGAL_DISABLE_GMP) PROPERTIES RESOURCE_LOCK Selection_test_resources) endif() - qt5_wrap_ui( mesh_simplificationUI_FILES Mesh_simplification_dialog.ui) + qt6_wrap_ui( mesh_simplificationUI_FILES Mesh_simplification_dialog.ui) polyhedron_demo_plugin(mesh_simplification_plugin Mesh_simplification_plugin ${mesh_simplificationUI_FILES}) target_link_libraries(mesh_simplification_plugin PUBLIC scene_surface_mesh_item scene_selection_item) - qt5_wrap_ui(remeshingUI_FILES Remeshing_dialog.ui) + qt6_wrap_ui(remeshingUI_FILES Remeshing_dialog.ui) polyhedron_demo_plugin(offset_meshing_plugin Offset_meshing_plugin ${remeshingUI_FILES}) target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_item @@ -54,14 +54,14 @@ if(NOT CGAL_DISABLE_GMP) target_link_libraries(offset_meshing_plugin PUBLIC CGAL::TBB_support) endif() - qt5_wrap_ui(shortestPathUI_FILES Shortest_path_widget.ui) + qt6_wrap_ui(shortestPathUI_FILES Shortest_path_widget.ui) polyhedron_demo_plugin(shortest_path_plugin Shortest_path_plugin ${shortestPathUI_FILES}) target_link_libraries( shortest_path_plugin PUBLIC scene_surface_mesh_item scene_shortest_path_item scene_basic_objects) - qt5_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) + qt6_wrap_ui(basicUI_FILES Surface_mesh_approximation_dockwidget.ui) polyhedron_demo_plugin( surface_mesh_approximation_plugin Surface_mesh_approximation_plugin ${basicUI_FILES} VSA_wrapper.cpp) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Tetrahedral_remeshing/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Tetrahedral_remeshing/CMakeLists.txt index a7547b6e19cd..15dc949776e9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Tetrahedral_remeshing/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Tetrahedral_remeshing/CMakeLists.txt @@ -2,12 +2,12 @@ include(polyhedron_demo_macros) remove_definitions(-DQT_STATICPLUGIN) -qt5_wrap_cpp(VOLUME_MOC_OUTFILES +qt6_wrap_cpp(VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_thread.h) -qt5_wrap_cpp(VOLUME_MOC_OUTFILES +qt6_wrap_cpp(VOLUME_MOC_OUTFILES ${CMAKE_CURRENT_SOURCE_DIR}/Volume_plane_interface.h) -qt5_wrap_ui(tetRemeshingUI_FILES Tetrahedral_remeshing_dialog.ui) +qt6_wrap_ui(tetRemeshingUI_FILES Tetrahedral_remeshing_dialog.ui) polyhedron_demo_plugin( tetrahedral_remeshing_plugin Tetrahedral_remeshing_plugin ${tetRemeshingUI_FILES} KEYWORDS Tetrahedral_remeshing) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt index a3b77b8e4526..7ebf7feedea9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt @@ -10,22 +10,22 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) #Find CGAL -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5 ImageIO) -# Find Qt5 itself -find_package(Qt5 QUIET - COMPONENTS OpenGL Script Svg - OPTIONAL_COMPONENTS ScriptTools WebSockets) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 ImageIO) +# Find Qt6 itself +find_package(Qt6 QUIET + COMPONENTS OpenGLWidget Svg + OPTIONAL_COMPONENTS WebSockets) if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) - if(Qt5_FOUND) + if(Qt6_FOUND) include(${CGAL_USE_FILE}) endif() polyhedron_demo_plugin(example_plugin Example_plugin) - qt5_wrap_ui(basicUI_FILES Basic_dialog.ui) + qt6_wrap_ui(basicUI_FILES Basic_dialog.ui) polyhedron_demo_plugin(basic_plugin Basic_plugin ${basicUI_FILES}) - qt5_wrap_ui(dockUI_FILES Basic_dock_widget.ui) + qt6_wrap_ui(dockUI_FILES Basic_dock_widget.ui) polyhedron_demo_plugin(dock_widget_plugin Dock_widget_plugin ${dockUI_FILES}) polyhedron_demo_plugin(basic_item_plugin Basic_item_plugin) diff --git a/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt b/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt index 98faad76be30..7e374a519dcb 100644 --- a/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt @@ -19,17 +19,17 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") # Include directory of demo includes include_directories(BEFORE ${Mesh_3_implicit_functions_BINARY_DIR} ../include) -# Find CGAL and CGAL Qt5 -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +# Find CGAL and CGAL Qt6 +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# Find Qt5 itself +# Find Qt6 itself set(QT_USE_QTXML TRUE) set(QT_USE_QTMAIN TRUE) set(QT_USE_QTSCRIPT TRUE) set(QT_USE_QTOPENGL TRUE) -find_package(Qt5 QUIET COMPONENTS Script OpenGL ScriptTools) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets ScriptTools) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) # put plugins (which are shared libraries) at the same location as # executable files set(LIBRARY_OUTPUT_PATH ${RUNTIME_OUTPUT_PATH}) @@ -47,18 +47,18 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) polyhedron_demo_plugin(p_klein_function_plugin Klein_implicit_function KEYWORDS Mesh_3) -else(CGAL_Qt5_FOUND AND Qt5_FOUND) +else(CGAL_Qt6_FOUND AND Qt6_FOUND) set(MESH_3_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(MESH_3_MISSING_DEPS "the CGAL Qt5 library, ${MESH_3_MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(MESH_3_MISSING_DEPS "the CGAL Qt6 library, ${MESH_3_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(MESH_3_MISSING_DEPS "Qt5, ${MESH_3_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(MESH_3_MISSING_DEPS "Qt6, ${MESH_3_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${MESH_3_MISSING_DEPS} and will not be compiled.") -endif(CGAL_Qt5_FOUND AND Qt5_FOUND) +endif(CGAL_Qt6_FOUND AND Qt6_FOUND) From 5030d671d5ee5a71f4eee1b8fe2ea6e1e5d1317e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 19 Apr 2023 17:06:44 +0100 Subject: [PATCH 0210/1398] Target Polyhedron_3 builds and executes, but with all scripting and RegExp (deprecated) commented --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 43 +++++++++++++------ Polyhedron/demo/Polyhedron/MainWindow.h | 20 +++++---- .../demo/Polyhedron/Polyhedron_demo.cpp | 4 +- Polyhedron/demo/Polyhedron/Scene.cpp | 2 +- Polyhedron/demo/Polyhedron/Scene.h | 2 +- .../demo/Polyhedron/Show_point_dialog.cpp | 5 ++- Polyhedron/demo/Polyhedron/Viewer.cpp | 3 +- .../Polyhedron/polyhedron_demo_macros.cmake | 4 +- Three/include/CGAL/Three/exceptions.h | 14 +++--- 9 files changed, 64 insertions(+), 33 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index b797ecf7a70e..4560cf9aceea 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -73,10 +73,12 @@ #include #include +#include "Color_map.h" + #ifdef QT_SCRIPT_LIB # include # include -#include "Color_map.h" + using namespace CGAL::Three; @@ -123,6 +125,7 @@ const QString debug_widgets_names[9] = { # endif #endif +#if 0 QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) { MainWindow* mw = qobject_cast(engine->parent()); @@ -138,6 +141,7 @@ QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) return engine->undefinedValue(); } +#endif inline QKeySequence combine(Qt::Modifier m, Qt::Key k) @@ -166,8 +170,8 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren is_locked = false; // remove the Load Script menu entry, when the demo has not been compiled with QT_SCRIPT_LIB #if !defined(QT_SCRIPT_LIB) - ui->menuBar->removeAction(ui->actionLoadScript); - ui->menuBar->removeAction(ui->on_actionLoad_a_Scene_from_a_Script_File); + // ui->menuBar->removeAction(ui->actionLoadScript); + // ui->menuBar->removeAction(ui->on_actionLoad_a_Scene_from_a_Script_File); #endif // Save some pointers from ui, for latter use. sceneView = ui->sceneView; @@ -528,6 +532,7 @@ void MainWindow::filterOperations(bool) #include +#if 0 void MainWindow::evaluate_script(QString script, const QString& filename, const bool quiet) { @@ -595,6 +600,7 @@ void MainWindow::enableScriptDebugger(bool b /* = true */) this->error(tr("Your version of Qt is too old, and for that reason " "the Qt Script Debugger is not available.")); } +#endif namespace { bool actionsByName(QAction* x, QAction* y) { @@ -650,8 +656,8 @@ bool MainWindow::load_plugin(QString fileName, bool blacklisted) QFileInfo fileinfo(fileName); //set plugin name QString name = fileinfo.fileName(); - name.remove(QRegExp("^lib")); - name.remove(QRegExp("\\..*")); + name.remove(QRegularExpression("^lib")); + name.remove(QRegularExpression("\\..*")); //do not load it if it is in the blacklist if(blacklisted) { @@ -1138,20 +1144,22 @@ bool MainWindow::file_matches_filter(const QString& filters, QString filename_striped=fileinfo.fileName(); //match all filters between () - QRegExp all_filters_rx("\\((.*)\\)"); + QRegularExpression all_filters_rx("\\((.*)\\)"); QStringList split_filters = filters.split(";;"); Q_FOREACH(const QString& filter, split_filters) { //extract filters +#if 0 // AF @todo if ( all_filters_rx.indexIn(filter)!=-1 ){ Q_FOREACH(const QString& pattern,all_filters_rx.cap(1).split(' ')){ - QRegExp rx(pattern); - rx.setPatternSyntax(QRegExp::Wildcard); + QRegularExpression rx(pattern); + rx.setPatternSyntax(QRegularExpression::Wildcard); if ( rx.exactMatch(filename_striped) ){ return true; } } } +#endif } return false; } @@ -1268,6 +1276,7 @@ void MainWindow::open(QString filename) bool MainWindow::open(QString filename, QString loader_name) { QFileInfo fileinfo(filename); boost::optional item_opt; +#if 0 // AF try { item_opt = wrap_a_call_to_cpp ([this, fileinfo, loader_name]() @@ -1284,6 +1293,7 @@ bool MainWindow::open(QString filename, QString loader_name) { std::cerr << e.what() << std::endl; return false; } +#endif return true; } @@ -1887,6 +1897,7 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } +#if 0 bool MainWindow::loadScript(QString filename) { QFileInfo fileinfo(filename); @@ -1920,12 +1931,15 @@ bool MainWindow::loadScript(QFileInfo info) #endif return false; } +#endif void MainWindow::throw_exception() { +#if 0 // AF wrap_a_call_to_cpp([]() { throw std::runtime_error("Exception thrown in " "MainWindow::throw_exception()"); }, this, __FILE__, __LINE__); +#endif } void MainWindow::on_actionLoadScript_triggered() @@ -2046,7 +2060,7 @@ void MainWindow::on_actionSaveAs_triggered() sf = plugin->saveNameFilters().split(";;").first(); } } - QRegExp extensions("\\(\\*\\..+\\)"); + QRegularExpression extensions("\\(\\*\\..+\\)"); QStringList filter_exts; if(filters.empty()) { @@ -2056,6 +2070,7 @@ void MainWindow::on_actionSaveAs_triggered() .arg(item->name())); return; } +#if 0 // AF Q_FOREACH(QString string, filters) { QStringList sl = string.split(";;"); @@ -2065,6 +2080,8 @@ void MainWindow::on_actionSaveAs_triggered() filter_exts.append(extensions.capturedTexts()); } } +#endif + filters << tr("All files (*)"); if(canSavePlugins.isEmpty()) { QMessageBox::warning(this, @@ -2094,9 +2111,9 @@ void MainWindow::on_actionSaveAs_triggered() if(filename.isEmpty()) return; last_saved_dir = QFileInfo(filename).absoluteDir().path(); - extensions.indexIn(sf.split(";;").first()); + // AF extensions.indexIn(sf.split(";;").first()); QString filter_ext, filename_ext; - filter_ext = extensions.cap().split(" ").first();// in case of syntax like (*.a *.b) + // AF filter_ext = extensions.cap().split(" ").first();// in case of syntax like (*.a *.b) filter_ext.remove(")"); filter_ext.remove("("); @@ -2804,9 +2821,11 @@ void MainWindow::colorItems() return; std::vector colors_; colors_.reserve(nb_files); +# compute_color_map(scene->item(scene->selectionIndices().last())->color(), static_cast(nb_files), std::back_inserter(colors_)); + std::size_t nb_item = -1; Q_FOREACH(int id, scene->selectionIndices()) { @@ -3859,7 +3878,7 @@ void MainWindow::on_actionLoad_a_Scene_from_a_Script_File_triggered() if(filename.isEmpty()) return; } - loadScript(QFileInfo(filename)); + if(do_download){ QFile tmp_file(filename); tmp_file.remove(); diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index 7202c8ac6296..f0c3adca0078 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -3,12 +3,13 @@ #include "config.h" #include "MainWindow_config.h" -#include +#include #include #include -#include -#include +// AF @todo Scripting has changed +// #include +// #include #include @@ -60,8 +61,8 @@ namespace Ui { class MAINWINDOW_EXPORT MainWindow : public CGAL::Qt::DemosMainWindow, public Messages_interface, - public CGAL::Three::Three, - protected QScriptable + public CGAL::Three::Three + // AF , protected QScriptable { Q_OBJECT Q_INTERFACES(Messages_interface) @@ -147,12 +148,13 @@ public Q_SLOTS: index of the item to be reloaded as data attached to the action. The index must identify a valid `Scene_item`.*/ void reloadItem(); - +#if 0 //! Loads a script. Returns true if it worked. bool loadScript(QString filename); //! Loads a script. Returns true if it worked. bool loadScript(QFileInfo); +#endif /*! * Gives the keyboard input focus to the widget searchEdit. @@ -261,7 +263,7 @@ public Q_SLOTS: * If able, finds a script debugger and interrupts current action. Default * value for parameter is true. */ - void enableScriptDebugger(bool = true); + // void enableScriptDebugger(bool = true); /// This slot is used to test exception handling in Qt Scripts. void throw_exception(); @@ -449,9 +451,11 @@ protected Q_SLOTS: //! Calls evaluate_script(script, filename, true). void evaluate_script_quiet(QString script, const QString & fileName = QString()); + #endif + QMutex mutex; QWaitCondition wait_condition; -#endif + public Q_SLOTS: void on_actionSa_ve_Scene_as_Script_triggered(); void on_actionLoad_a_Scene_from_a_Script_File_triggered(); diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp index 7b6e5225dfe3..6348c203eab8 100644 --- a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp +++ b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp @@ -129,10 +129,10 @@ Polyhedron_demo::Polyhedron_demo(int& argc, char **argv, } #endif - mainWindow.loadScript(":/cgal/Polyhedron_3/javascript/lib.js"); + // mainWindow.loadScript(":/cgal/Polyhedron_3/javascript/lib.js"); QFileInfo autostart_js("autostart.js"); if(!parser.isSet(no_autostart) && autostart_js.exists()) { - mainWindow.loadScript(autostart_js); + // mainWindow.loadScript(autostart_js); } Q_FOREACH(QString filename, parser.positionalArguments()) { mainWindow.open(filename); diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index c70929ab4a5e..8a66f7fb2cad 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Scene.h b/Polyhedron/demo/Polyhedron/Scene.h index b661ed7baa83..0724bc577cf3 100644 --- a/Polyhedron/demo/Polyhedron/Scene.h +++ b/Polyhedron/demo/Polyhedron/Scene.h @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp index c831303083d8..1654dadf30bc 100644 --- a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp +++ b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp @@ -2,6 +2,7 @@ #include "ui_Show_point_dialog.h" #include +#include Show_point_dialog::Show_point_dialog(QWidget* parent) : QDialog(parent) @@ -50,7 +51,8 @@ void Show_point_dialog::interprete_string(const QString& string) + "|" + not_double_char_re + "+" + double_re + ")" + "$"; - QRegExp re(full_re); +#if 0 // AF @todo QRegExp had exactMatch() and cap() + QRegularExpression re(full_re); if(re.exactMatch(string)) { // const double x = re.cap(1).toDouble(); // const double y = re.cap(2).toDouble(); @@ -66,6 +68,7 @@ void Show_point_dialog::interprete_string(const QString& string) ui->coord_z->setText(QString()); m_has_correct_coordinates = false; } +#endif } double Show_point_dialog::get_x() const diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index 201e15555c50..83182e00bf2e 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #ifdef CGAL_USE_WEBSOCKETS #include @@ -1838,7 +1839,7 @@ void Viewer::setLighting() connect(dialog->position_lineEdit, &QLineEdit::editingFinished, [this, dialog]() { - QStringList list = dialog->position_lineEdit->text().split(QRegExp(","), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = dialog->position_lineEdit->text().split(QRegularExpression(","), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=3){ QMessageBox *msgBox = new QMessageBox; diff --git a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake index 0e20273faa76..3b31bce3992e 100644 --- a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake +++ b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake @@ -19,7 +19,7 @@ include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) set(moc_file_name "") else() set(moc_file_name ${plugin_implementation_base_name}.moc ) - qt5_generate_moc( ${plugin_implementation_base_name}.cpp "${CMAKE_CURRENT_BINARY_DIR}/${moc_file_name}" ) + qt6_generate_moc( ${plugin_implementation_base_name}.cpp "${CMAKE_CURRENT_BINARY_DIR}/${moc_file_name}" ) add_file_dependencies( ${moc_file_name} "${CMAKE_CURRENT_SOURCE_DIR}/${plugin_implementation_base_name}.cpp" ) endif() @@ -49,7 +49,7 @@ include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) set_property(TEST "compilation_of__demo_framework" APPEND PROPERTY FIXTURES_SETUP "demo_framework_SetupFixture") set_property(TEST "compilation_of__demo_framework" - APPEND PROPERTY DEPENDS "compilation_of__CGAL_Qt5_moc_and_resources") + APPEND PROPERTY DEPENDS "compilation_of__CGAL_Qt6_moc_and_resources") endif() endif() else() diff --git a/Three/include/CGAL/Three/exceptions.h b/Three/include/CGAL/Three/exceptions.h index cf3640d5b46a..15fa13cd320d 100644 --- a/Three/include/CGAL/Three/exceptions.h +++ b/Three/include/CGAL/Three/exceptions.h @@ -19,9 +19,9 @@ #include #include #include -#include -#include -#include +//#include +//#include +//#include #include #include @@ -60,6 +60,7 @@ struct Optional_or_bool { enum Context { CURRENT_CONTEXT, PARENT_CONTEXT }; +#if 1 // AF @todo scripting has changed /// This function template wraps a `Callable` that can be called without /// any argument (such as a lambda expression without arguments), and in /// case the function call is in a Qt Script context, wraps the call in a @@ -69,7 +70,7 @@ enum Context { CURRENT_CONTEXT, PARENT_CONTEXT }; template typename Optional_or_bool::type>::type wrap_a_call_to_cpp(Callable f, - QScriptable* qs = 0, + // QScriptable* qs = 0, const char* file = 0, int line = -1, Context c = CURRENT_CONTEXT) { @@ -78,12 +79,13 @@ wrap_a_call_to_cpp(Callable f, typedef typename O_r_b::type Return_type; const bool no_try_catch = qApp->property("no-try-catch").toBool(); - if(no_try_catch || qs == 0 || !qs->context()) return O_r_b::invoke(f); + if(no_try_catch /* || qs == 0 || !qs->context() */ ) return O_r_b::invoke(f); else try { return O_r_b::invoke(f); } catch(const std::exception& e) { +#if 0 const Script_exception* se = dynamic_cast(&e); QScriptContext* context = qs->context(); QStringList qt_bt = context->backtrace(); @@ -121,9 +123,11 @@ wrap_a_call_to_cpp(Callable f, qScriptValueFromSequence(context->engine(), qt_bt)); std::cerr << "result after throwError: " << qPrintable(v.toString()) << std::endl; +#endif return Return_type(); } } +#endif } // end namespace Three } // end namespace CGAL From b80fbc83d08a059d2cfdc176009636c3216f6e4f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 08:18:29 +0100 Subject: [PATCH 0211/1398] Fixes for target Mesh_3 --- .../Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp | 2 +- Polyhedron/demo/Polyhedron/Scene_plane_item.cpp | 15 +++++++++------ .../Scene_polyhedron_selection_item.cpp | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 68c3053d876b..f137b7eb46e6 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -666,7 +666,7 @@ public Q_SLOTS: QApplication::setOverrideCursor(Qt::WaitCursor); //Control widgets creation QLayout* layout = createOrGetDockLayout(); - QRegExpValidator* validator = new QRegExpValidator(QRegExp("\\d*"), this); + QRegularExpressionValidator* validator = new QRegularExpressionValidator(QRegularExpression("\\d*"), this); bool show_sliders = true; if(x_control == nullptr) { diff --git a/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp b/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp index ea241f1cd780..ba455ac0cc22 100644 --- a/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include using namespace CGAL::Three; typedef Triangle_container Tc; @@ -307,13 +307,14 @@ void Scene_plane_item::setPlaneOrientation() { bool does_match = true; //check that the result is of the form %1*x + %2*y + %3*z + %4 = 0, modulo the whitespaces. - QRegExp rx( + QRegularExpression rx( "(\\-?\\s*\\d*\\.?\\d*(?:e\\-?\\d*)?)\\s*\\*\\s*x\\s*\\+?\\s*(\\-?\\s*\\d*\\.?\\d*(?:e\\-?\\d*)?)\\s*\\*\\s*y\\s*\\+?\\s*(\\-?\\s*\\d*\\.?\\d*(?:e\\-?\\d*)?)\\s*\\*\\s*z\\s*\\+?\\s*(\\-?\\s*\\d*\\.?\\d*(?:e\\-?\\d*)?)\\s*=\\s*0" ); const CGAL::qglviewer::Vec offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); QVector3D qoffset(offset.x, offset.y, offset.z); const CGAL::qglviewer::Vec& pos = frame->position(); const CGAL::qglviewer::Vec& n = frame->inverseTransformOf(CGAL::qglviewer::Vec(0.f, 0.f, 1.f)); + QRegularExpressionMatch match; do{ bool ok; @@ -327,13 +328,15 @@ void Scene_plane_item::setPlaneOrientation() &ok); if(!ok) return; - does_match = rx.exactMatch(eq); - if(!does_match) + + match = rx.match(eq); // AF: exact? + // does_match = rx.exactMatch(eq); + if(! match.hasMatch()) { QMessageBox::warning(CGAL::Three::Three::mainWindow(),"Error","The input must be of the form a*x+b*y+c*z+d=0"); } - }while(!does_match); - double a(rx.cap(1).toDouble()), b(rx.cap(2).toDouble()), c(rx.cap(3).toDouble()), d(rx.cap(4).toDouble()); + }while(! match.hasMatch()); + double a(match.captured(1).toDouble()), b(match.captured(2).toDouble()), c(match.captured(3).toDouble()), d(match.captured(4).toDouble()); Kernel_epic::Point_3 sure_point(0,0,0); if(c != 0) diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 561f3f7c8fb7..e6922054fbe2 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -1830,7 +1830,7 @@ Scene_polyhedron_selection_item::Scene_polyhedron_selection_item(Scene_face_grap { common_constructor(); QString sf = poly_item->property("source filename").toString(); - QRegExp rx("\\.(ts$|off$|obj$|ply$|stl$|surf$|vtk$|vtp$|vtu)"); + QRegularExpression rx("\\.(ts$|off$|obj$|ply$|stl$|surf$|vtk$|vtp$|vtu)"); sf.remove(rx); if(!sf.isEmpty()) setProperty("defaultSaveDir", sf); From bd78a33b206fa0efaae62314a8d96f367e6b55b8 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 09:52:25 +0100 Subject: [PATCH 0212/1398] PMP compiles [skip ci] --- .../Classification/Classification_plugin.cpp | 2 +- .../Plugins/PCA/Affine_transform_plugin.cpp | 2 +- .../Plugins/PCA/Basic_generator_plugin.cpp | 20 +++++++++---------- .../Scene_edit_polyhedron_item.h | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp index 586c45709638..5ac906e1c560 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Classification_plugin.cpp @@ -1389,7 +1389,7 @@ public Q_SLOTS: QAction* add_selection = label_buttons.back().menu->addAction ("Add selection to training set"); - add_selection->setShortcut(Qt::SHIFT | (Qt::Key_A + (label_button.shortcut - 'a'))); + add_selection->setShortcut(QKeySequence(Qt::SHIFT | (Qt::Key_A + (label_button.shortcut - 'a')))); // add_selection->setShortcut(Qt::Key_0 + label_buttons.size() - 1); connect(add_selection, SIGNAL(triggered()), this, diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp index 9e2af43a3186..a1ca2fe9f62d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp @@ -727,7 +727,7 @@ void Polyhedron_demo_affine_transform_plugin::normalize(Item* item) double max = (std::max)((double)tsr.x()-bil.x(), (double)tsr.y()-bil.y()); max = (std::max)(max, (double)tsr.z()-bil.z()); QVector3D v_bil= QVector3D(bil.x(),bil.y(),bil.z()); - QMatrix4x4 frameMat = QMatrix(); + QMatrix4x4 frameMat = QMatrix4x4(); QVector3D center(item->center().x, item->center().y, item->center().z); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Basic_generator_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Basic_generator_plugin.cpp index c7a62533106d..4397d8f9362a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Basic_generator_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Basic_generator_plugin.cpp @@ -369,7 +369,7 @@ void Basic_generator_plugin::generateCube() for(int i=0; i<8; ++i) { - QStringList list = point_texts[i].split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = point_texts[i].split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=3){ QMessageBox *msgBox = new QMessageBox; @@ -410,7 +410,7 @@ void Basic_generator_plugin::generateCube() else { QString text = dock_widget->extremaEdit->text(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=6){ QMessageBox *msgBox = new QMessageBox; @@ -461,7 +461,7 @@ void Basic_generator_plugin::generatePrism() bool is_closed = dock_widget->prismCheckBox->isChecked(); QString text = dock_widget->prism_lineEdit->text(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=3){ QMessageBox *msgBox = new QMessageBox; @@ -508,7 +508,7 @@ void Basic_generator_plugin::generatePyramid() bool is_closed = dock_widget->pyramidCheckBox->isChecked(); QString text = dock_widget->pyramid_lineEdit->text(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=3){ QMessageBox *msgBox = new QMessageBox; @@ -551,7 +551,7 @@ void Basic_generator_plugin::generateSphere() { int precision = dock_widget->SphereSpinBox->value(); QString text = dock_widget->center_radius_lineEdit->text(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=4){ QMessageBox *msgBox = new QMessageBox; @@ -601,7 +601,7 @@ void Basic_generator_plugin::generateTetrahedron() for (int i = 0; i < 4; ++i) { - QStringList list = point_texts[i].split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = point_texts[i].split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size() != 3) { QMessageBox* msgBox = new QMessageBox; @@ -635,7 +635,7 @@ void Basic_generator_plugin::generateTetrahedron() else { QString text = dock_widget->point_textEdit_2->toPlainText(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size() != 12) { QMessageBox* msgBox = new QMessageBox; @@ -676,7 +676,7 @@ void Basic_generator_plugin::generatePoints() { QString text = dock_widget->point_textEdit->toPlainText(); Scene_points_with_normal_item* item = new Scene_points_with_normal_item(); - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); int counter = 0; double coord[3]; bool ok = true; @@ -735,7 +735,7 @@ void Basic_generator_plugin::generateLines() std::vector& polyline = *(polylines.rbegin()); QStringList polylines_metadata; - QStringList list = text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); int counter = 0; double coord[3]; bool ok = true; @@ -867,7 +867,7 @@ void Basic_generator_plugin::generateGrid() bool triangulated = dock_widget->grid_checkBox->isChecked(); points_text= dock_widget->grid_lineEdit->text(); - QStringList list = points_text.split(QRegExp("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); + QStringList list = points_text.split(QRegularExpression("\\s+"), CGAL_QT_SKIP_EMPTY_PARTS); if (list.isEmpty()) return; if (list.size()!=6){ QMessageBox *msgBox = new QMessageBox; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h index 3fc7b02d1ddf..bd93820384fa 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h @@ -26,9 +26,9 @@ #include #include -#include -#include -#include +#include +#include +#include typedef boost::graph_traits::vertex_descriptor sm_vertex_descriptor; From ab1d7990d2f1fe2275d4d839aa476176bbffa5db Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 11:14:11 +0100 Subject: [PATCH 0213/1398] various fixes [skip ci] --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 6 ++---- Polyhedron/demo/Polyhedron/Show_point_dialog.cpp | 13 ++++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index c8dec4a0725d..e1ead77a2276 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -2456,10 +2456,8 @@ void CGAL::QGLViewer::setMouseBinding(::Qt::Key key, ::Qt::KeyboardModifiers mod mouseBinding_.insert(mbp, map); ClickBindingPrivate cbp(modifiers, button, false, ::Qt::NoButton, key); - - // AF: currently results in a runtime error - // clickBinding_.remove(cbp); - + clickBinding_.remove(cbp); + } diff --git a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp index 1654dadf30bc..5df594bc57c4 100644 --- a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp +++ b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp @@ -51,15 +51,16 @@ void Show_point_dialog::interprete_string(const QString& string) + "|" + not_double_char_re + "+" + double_re + ")" + "$"; -#if 0 // AF @todo QRegExp had exactMatch() and cap() + QRegularExpression re(full_re); - if(re.exactMatch(string)) { + QRegularExpressionMatch match = re.match(string); // AF @todo QRegExp had exactMatch() + if(match.hasMatch()) { // const double x = re.cap(1).toDouble(); // const double y = re.cap(2).toDouble(); // const double z = re.cap(3).toDouble(); - ui->coord_x->setText(QString(re.cap(1))); - ui->coord_y->setText(QString(re.cap(2))); - ui->coord_z->setText(QString(re.cap(3))); + ui->coord_x->setText(QString(match.captured(1))); + ui->coord_y->setText(QString(match.captured(2))); + ui->coord_z->setText(QString(match.captured(3))); m_has_correct_coordinates = true; } else { @@ -68,7 +69,6 @@ void Show_point_dialog::interprete_string(const QString& string) ui->coord_z->setText(QString()); m_has_correct_coordinates = false; } -#endif } double Show_point_dialog::get_x() const @@ -90,4 +90,3 @@ bool Show_point_dialog::has_correct_coordinates() const { return m_has_correct_coordinates; } - From c77f1443072722dd9f239303423a0114f9e8c1fb Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 11:38:47 +0100 Subject: [PATCH 0214/1398] various fixes [skip ci] --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 4560cf9aceea..91d3d9b1d47e 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -600,7 +600,7 @@ void MainWindow::enableScriptDebugger(bool b /* = true */) this->error(tr("Your version of Qt is too old, and for that reason " "the Qt Script Debugger is not available.")); } -#endif +#endif namespace { bool actionsByName(QAction* x, QAction* y) { @@ -2070,17 +2070,16 @@ void MainWindow::on_actionSaveAs_triggered() .arg(item->name())); return; } -#if 0 // AF + Q_FOREACH(QString string, filters) { QStringList sl = string.split(";;"); Q_FOREACH(QString s, sl){ - int pos = extensions.indexIn(s); - if( pos >-1) - filter_exts.append(extensions.capturedTexts()); + QRegularExpressionMatch match = extensions.match(s); + if(match.hasMatch()) + filter_exts.append(match.capturedTexts()); } } -#endif filters << tr("All files (*)"); if(canSavePlugins.isEmpty()) { @@ -3878,7 +3877,7 @@ void MainWindow::on_actionLoad_a_Scene_from_a_Script_File_triggered() if(filename.isEmpty()) return; } - + if(do_download){ QFile tmp_file(filename); tmp_file.remove(); From b15e0a1ea256e21a5f904f7ab27404e3ef2a8de1 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 15:54:44 +0100 Subject: [PATCH 0215/1398] Fix 'Save As' [skip ci] --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 91d3d9b1d47e..40e14de0d22c 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1141,25 +1141,22 @@ bool MainWindow::file_matches_filter(const QString& filters, const QString& filename ) { QFileInfo fileinfo(filename); - QString filename_striped=fileinfo.fileName(); + QString filename_stripped=fileinfo.fileName(); //match all filters between () QRegularExpression all_filters_rx("\\((.*)\\)"); QStringList split_filters = filters.split(";;"); Q_FOREACH(const QString& filter, split_filters) { - //extract filters -#if 0 // AF @todo - if ( all_filters_rx.indexIn(filter)!=-1 ){ - Q_FOREACH(const QString& pattern,all_filters_rx.cap(1).split(' ')){ - QRegularExpression rx(pattern); - rx.setPatternSyntax(QRegularExpression::Wildcard); - if ( rx.exactMatch(filename_striped) ){ - return true; + QRegularExpressionMatch match = all_filters_rx.match(filter); + if(match.hasMatch()){ + for (const QString& pattern : match.captured(1).split(' ')) { + QRegularExpressionMatch m = QRegularExpression(QRegularExpression::fromWildcard(pattern)).match(filename_stripped); + if (m.hasMatch()) { + return true; + } } } - } -#endif } return false; } From 0574c6ba4cad8e73f0902840490abea8c9da6576 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 20 Apr 2023 16:35:14 +0100 Subject: [PATCH 0216/1398] Change the remaining CMakeLists.txt [skip ci] --- .../demo/Alpha_shapes_3/CMakeLists.txt | 18 +++---- .../Arrangement_on_surface_2/CMakeLists.txt | 28 +++++------ .../demo/Circular_kernel_3/CMakeLists.txt | 14 +++--- .../Hyperbolic_triangulation_2/CMakeLists.txt | 20 ++++---- .../demo/Linear_cell_complex/CMakeLists.txt | 20 ++++---- .../CMakeLists.txt | 50 +++++++++---------- .../Periodic_3_triangulation_3/CMakeLists.txt | 44 ++++++++-------- .../demo/Periodic_Lloyd_3/CMakeLists.txt | 38 +++++++------- .../CMakeLists.txt | 16 +++--- .../Polyline_simplification_2/CMakeLists.txt | 16 +++--- .../CMakeLists.txt | 38 +++++++------- .../demo/Triangulation_3/CMakeLists.txt | 34 ++++++------- .../Triangulation_on_sphere_2/CMakeLists.txt | 18 +++---- 13 files changed, 177 insertions(+), 177 deletions(-) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index ec2a2a8dbb46..b74ed758e222 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -17,11 +17,11 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) @@ -29,24 +29,24 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include_directories(BEFORE ./) # ui file, created with Qt Designer - qt5_wrap_ui(uis MainWindow.ui) + qt6_wrap_ui(uis MainWindow.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Alpha_shape_3.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Alpha_shape_3.qrc) add_executable( Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp ${uis} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shape_3) - target_link_libraries(Alpha_shape_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::OpenGL Qt5::Gui) + target_link_libraries(Alpha_shape_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::OpenGLWidgets Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Alpha_shape_3) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt index 82e33197dae2..6b221f35824b 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt @@ -12,10 +12,10 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt5) -find_package(Qt5 QUIET COMPONENTS Gui Widgets) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6) +find_package(Qt6 QUIET COMPONENTS Gui Widgets) -if (CGAL_Qt5_FOUND AND Qt5_FOUND) +if (CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) add_compile_definitions(QT_NO_KEYWORDS) include_directories( BEFORE ./ ) @@ -50,7 +50,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND) endif() - qt5_wrap_ui(arrangement_2_uis + qt6_wrap_ui(arrangement_2_uis ArrangementDemoWindow.ui NewTabDialog.ui OverlayDialog.ui @@ -58,7 +58,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND) AlgebraicCurveInputDialog.ui RationalCurveInputDialog.ui) - qt5_wrap_cpp(CGAL_Qt5_MOC_FILES + qt6_wrap_cpp(CGAL_Qt6_MOC_FILES ArrangementDemoWindow.h ArrangementDemoTab.h GraphicsViewCurveInput.h @@ -70,7 +70,7 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND) ColorItemEditor.h PropertyValueDelegate.h) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES Arrangement_on_surface_2.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES Arrangement_on_surface_2.qrc) add_executable(arrangement_2 arrangement_2.cpp @@ -107,11 +107,11 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND) ArrangementIO.cpp ${UTILS_COMPILE_FILES} ${arrangement_2_uis} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) - target_link_libraries(arrangement_2 PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) - target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5) + target_link_libraries(arrangement_2 PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets) + target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) if(CGAL_Core_FOUND) target_link_libraries(arrangement_2 PRIVATE CGAL::CGAL_Core) endif() @@ -124,11 +124,11 @@ if (CGAL_Qt5_FOUND AND Qt5_FOUND) else() set(MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(MISSING_DEPS "the CGAL Qt5 library, ${MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(MISSING_DEPS "the CGAL Qt6 library, ${MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(MISSING_DEPS "Qt5, ${MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(MISSING_DEPS "Qt6, ${MISSING_DEPS}") endif() message("NOTICE: This demo requires ${MISSING_DEPS} and will not be compiled.") endif() diff --git a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt index 54c3be3aba43..85038ef29987 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt +++ b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt @@ -10,20 +10,20 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL) +find_package(Qt6 QUIET COMPONENTS OpenGLWidget) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_executable( Circular_kernel_3 Circular_kernel_3.cpp Viewer.cpp - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Circular_kernel_3) - target_link_libraries(Circular_kernel_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::OpenGL Qt5::Gui) + target_link_libraries(Circular_kernel_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::OpenGLWidget Qt6::Gui) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Circular_kernel_3) @@ -33,6 +33,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index fbdf3791ccbf..7fa99290718d 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -11,25 +11,25 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6) find_package(LEDA QUIET) -# Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS OpenGL Gui) +# Find Qt6 itself +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Gui) -if(CGAL_Qt5_FOUND - AND Qt5_FOUND +if(CGAL_Qt6_FOUND + AND Qt6_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND)) # ui files, created with Qt Designer - qt5_wrap_ui(UIS HDT2.ui) + qt6_wrap_ui(UIS HDT2.ui) - qt5_add_resources(RESOURCE_FILES resources/Delaunay_triangulation_2.qrc) + qt6_add_resources(RESOURCE_FILES resources/Delaunay_triangulation_2.qrc) # cpp files - add_executable ( HDT2 HDT2.cpp ${CGAL_Qt5_RESOURCE_FILES} ${RESOURCE_FILES} ${UIS}) + add_executable ( HDT2 HDT2.cpp ${CGAL_Qt6_RESOURCE_FILES} ${RESOURCE_FILES} ${UIS}) target_include_directories(HDT2 PRIVATE ./ ./include) add_to_cached_list( CGAL_EXECUTABLE_TARGETS HDT2 ) - target_link_libraries ( HDT2 CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets) + target_link_libraries ( HDT2 CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) if(CGAL_Core_FOUND) target_link_libraries ( HDT2 CGAL::CGAL_Core) else() @@ -39,5 +39,5 @@ if(CGAL_Qt5_FOUND include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test( HDT2 ) else() - message("NOTICE: This demo requires CGAL_Core (or LEDA), and Qt5 and will not be compiled.") + message("NOTICE: This demo requires CGAL_Core (or LEDA), and Qt6 and will not be compiled.") endif() diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index 66c6e7088aa5..cda51b9191e8 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -40,26 +40,26 @@ add_definitions(-DCGAL_PROFILE_LCC_DEMO) add_definitions(-DCMAP_WITH_INDEX) # to use cc with index (handle otherwise) ################## -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg) if(NOT - (CGAL_Qt5_FOUND - AND Qt5_FOUND)) + (CGAL_Qt6_FOUND + AND Qt6_FOUND)) - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") else() add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) # ui file, created with Qt Designer - qt5_wrap_ui(uis MainWindow.ui CreateMesh.ui CreateMenger.ui + qt6_wrap_ui(uis MainWindow.ui CreateMesh.ui CreateMenger.ui CreateSierpinskiCarpet.ui CreateSierpinskiTriangle.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Linear_cell_complex_3.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Linear_cell_complex_3.qrc) add_executable( Linear_cell_complex_3_demo @@ -73,13 +73,13 @@ else() MainWindow.h Viewer.h ${uis} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Linear_cell_complex_3_demo) target_link_libraries(Linear_cell_complex_3_demo - PUBLIC CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui Qt5::OpenGL) + PUBLIC CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui Qt6::OpenGLWidgets) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Linear_cell_complex_3_demo) diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt index 96eb570c9c94..bdb94342a0a8 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt @@ -15,15 +15,15 @@ endif() # Include this package's headers first include_directories(BEFORE ./ ./include) -# Find CGAL and CGAL Qt5 -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +# Find CGAL and CGAL Qt6 +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# Find Qt5 itself -find_package(Qt5 5.4 QUIET COMPONENTS OpenGL) -if(Qt5_FOUND) +# Find Qt6 itself +find_package(Qt6 5.4 QUIET COMPONENTS OpenGLWidgets) +if(Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) -endif(Qt5_FOUND) +endif(Qt6_FOUND) # Find CImg find_path( @@ -39,37 +39,37 @@ else() "Try setting the environment variable CIMG_INC_DIR to point to the path of the directory containing CImg.h.") endif() -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(SRCS glviewer.cpp scene.cpp Otr2_demo.cpp window.cpp render.cpp) - set(CGAL_Qt5_MOC_FILES moc_dialog_options.cxx moc_glviewer.cxx moc_window.cxx) + set(CGAL_Qt6_MOC_FILES moc_dialog_options.cxx moc_glviewer.cxx moc_window.cxx) set(UIS pwsrec.ui options.ui) - qt5_wrap_ui(UI_FILES ${UIS}) + qt6_wrap_ui(UI_FILES ${UIS}) include(AddFileDependencies) - qt5_generate_moc("window.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_window.cxx") + qt6_generate_moc("window.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_window.cxx") add_file_dependencies(moc_window.cxx "${CMAKE_CURRENT_SOURCE_DIR}/window.h") - qt5_generate_moc("glviewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_glviewer.cxx") + qt6_generate_moc("glviewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_glviewer.cxx") add_file_dependencies(moc_glviewer.cxx "${CMAKE_CURRENT_SOURCE_DIR}/glviewer.h") - qt5_generate_moc("dialog_options.h" + qt6_generate_moc("dialog_options.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_dialog_options.cxx") add_file_dependencies(moc_dialog_options.cxx "${CMAKE_CURRENT_SOURCE_DIR}/dialog_options.h") - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES pwsrec.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES pwsrec.qrc) - add_executable(Otr2_demo ${SRCS} ${CGAL_Qt5_MOC_FILES} ${UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES}) + add_executable(Otr2_demo ${SRCS} ${CGAL_Qt6_MOC_FILES} ${UI_FILES} + ${CGAL_Qt6_RESOURCE_FILES}) - target_link_libraries(Otr2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui - Qt5::OpenGL) + target_link_libraries(Otr2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui + Qt6::OpenGLWidgets) # Link with pthread if necessary if(CIMG_INCLUDE_DIR) @@ -88,21 +88,21 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Otr2_demo) else( - CGAL_Qt5_FOUND - AND Qt5_FOUND) + CGAL_Qt6_FOUND + AND Qt6_FOUND) set(OTR2_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(OTR2_MISSING_DEPS "the CGAL Qt5 library, ${OTR2_MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(OTR2_MISSING_DEPS "the CGAL Qt6 library, ${OTR2_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(OTR2_MISSING_DEPS "Qt5.4, ${OTR2_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(OTR2_MISSING_DEPS "Qt6.4, ${OTR2_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${OTR2_MISSING_DEPS} and will not be compiled.") endif( - CGAL_Qt5_FOUND - AND Qt5_FOUND) + CGAL_Qt6_FOUND + AND Qt6_FOUND) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index 3692008579ee..f668d13ffdb0 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -14,37 +14,37 @@ if(POLICY CMP0071) endif() # Find CGAL -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS OpenGL Help Core) +# Find Qt6 itself +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Help Core) -if(Qt5_FOUND) +if(Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) -endif(Qt5_FOUND) +endif(Qt6_FOUND) -if(Qt5Help_VERSION VERSION_LESS 5.12) - set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qcollectiongenerator) +if(Qt6Help_VERSION VERSION_LESS 5.12) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt6::qcollectiongenerator) else() - set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qhelpgenerator) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt6::qhelpgenerator) endif() -if(CGAL_Qt5_FOUND - AND Qt5_FOUND +if(CGAL_Qt6_FOUND + AND Qt6_FOUND AND TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) # UI files (Qt Designer files) - qt5_wrap_ui(UI_FILES MainWindow.ui) + qt6_wrap_ui(UI_FILES MainWindow.ui) # qrc files (resource files) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Periodic_3_triangulation_3.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Periodic_3_triangulation_3.qrc) # use the Qt MOC preprocessor on classes that derive from QObject - qt5_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Scene.cpp") - qt5_generate_moc("MainWindow.h" + qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Scene.cpp") + qt6_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_MainWindow.cpp") - qt5_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Viewer.cpp") + qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Viewer.cpp") # generate QtAssistant collection file add_custom_command( @@ -66,14 +66,14 @@ if(CGAL_Qt5_FOUND MainWindow.ui moc_MainWindow.cpp ${UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES} + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES} Periodic_3_triangulation_3.qhc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS periodic_3_triangulation_3_demo) target_link_libraries(periodic_3_triangulation_3_demo - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::OpenGL) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGLWidgets) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(periodic_3_triangulation_3_demo) @@ -81,14 +81,14 @@ else() set(PERIODIC_TRIANGULATION_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) + if(NOT CGAL_Qt6_FOUND) set(PERIODIC_TRIANGULATION_MISSING_DEPS - "the CGAL Qt5 library, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") + "the CGAL Qt6 library, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) + if(NOT Qt6_FOUND) set(PERIODIC_TRIANGULATION_MISSING_DEPS - "Qt5, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") + "Qt6, ${PERIODIC_TRIANGULATION_MISSING_DEPS}") endif() if(NOT TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt index 63284a9ba629..a587c2deb4f8 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -17,27 +17,27 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS Script Help OpenGL Svg) +find_package(Qt6 QUIET COMPONENTS Help OpenGLWidget Svg) -if(Qt5Help_VERSION VERSION_LESS 5.12) - set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qcollectiongenerator) +if(Qt6Help_VERSION VERSION_LESS 5.12) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt6::qcollectiongenerator) else() - set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt5::qhelpgenerator) + set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt6::qhelpgenerator) endif() -if(CGAL_Qt5_FOUND - AND Qt5_FOUND +if(CGAL_Qt6_FOUND + AND Qt6_FOUND AND TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) include_directories(BEFORE ./) # ui file, created with Qt Designer - qt5_wrap_ui(uis MainWindow.ui) + qt6_wrap_ui(uis MainWindow.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./Periodic_Lloyd_3.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Periodic_Lloyd_3.qrc) if(DEFINED QT_QCOLLECTIONGENERATOR_EXECUTABLE) @@ -62,29 +62,29 @@ if(CGAL_Qt5_FOUND MainWindow.cpp Viewer.cpp ${uis} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Periodic_Lloyd_3) - target_link_libraries(Periodic_Lloyd_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::OpenGL) + target_link_libraries(Periodic_Lloyd_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + Qt6::OpenGLWidget) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Periodic_Lloyd_3) -else(CGAL_Qt5_FOUND - AND Qt5_FOUND +else(CGAL_Qt6_FOUND + AND Qt6_FOUND AND QT_QCOLLECTIONGENERATOR_EXECUTABLE) set(PERIODIC_LLOYD_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) + if(NOT CGAL_Qt6_FOUND) set(PERIODIC_LLOYD_MISSING_DEPS - "the CGAL Qt5 library, ${PERIODIC_LLOYD_MISSING_DEPS}") + "the CGAL Qt6 library, ${PERIODIC_LLOYD_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(PERIODIC_LLOYD_MISSING_DEPS "Qt5, ${PERIODIC_LLOYD_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(PERIODIC_LLOYD_MISSING_DEPS "Qt6, ${PERIODIC_LLOYD_MISSING_DEPS}") endif() if(NOT QT_QCOLLECTIONGENERATOR_EXECUTABLE) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index a2b4110a07f0..cda66cbac6e7 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -8,28 +8,28 @@ include_directories(${CMAKE_BINARY_DIR}) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -find_package(CGAL REQUIRED COMPONENTS Core Qt5) +find_package(CGAL REQUIRED COMPONENTS Core Qt6) include(${CGAL_USE_FILE}) find_package(LEDA QUIET) -find_package(Qt5 QUIET COMPONENTS Widgets) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) if((CGAL_Core_FOUND OR LEDA_FOUND) - AND Qt5_FOUND - AND CGAL_Qt5_FOUND) + AND Qt6_FOUND + AND CGAL_Qt6_FOUND) include_directories(BEFORE include) # ui files, created with Qt Designer - qt5_wrap_ui(UIS P4HDT2.ui) + qt6_wrap_ui(UIS P4HDT2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(RESOURCE_FILES Main_resources.qrc) + qt6_add_resources(RESOURCE_FILES Main_resources.qrc) # cpp files add_executable(P4HDT2 P4HDT2.cpp ${RESOURCE_FILES} ${UIS}) - target_link_libraries(P4HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets) + target_link_libraries(P4HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) if(TARGET CGAL::CGAL_Core) target_link_libraries(P4HDT2 PRIVATE CGAL::CGAL_Core) endif() @@ -41,5 +41,5 @@ if((CGAL_Core_FOUND OR LEDA_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(P4HDT2) else() - message("NOTICE: This demo requires Qt5 and will not be compiled.") + message("NOTICE: This demo requires Qt6 and will not be compiled.") endif() diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index 002fd913902f..f9da2a3bfb7d 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -13,33 +13,33 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt5 QUIET COMPONENTS Script OpenGL Widgets Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Widgets Svg) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) add_definitions(-DQT_NO_KEYWORDS) # UI files (Qt Designer files) - qt5_wrap_ui(CDT_UI_FILES Polyline_simplification_2.ui) + qt6_wrap_ui(CDT_UI_FILES Polyline_simplification_2.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.qrc) # The executable itself. add_executable( Polyline_simplification_2 ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) target_link_libraries(Polyline_simplification_2 - PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Gui) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Gui) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polyline_simplification_2) @@ -48,6 +48,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) else() - message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") + message("NOTICE: This demo requires CGAL and Qt6, and will not be compiled.") endif() diff --git a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt index 6ec0024f3a59..b00178ac2338 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt @@ -14,8 +14,8 @@ endif() include_directories(./) -# Find CGAL and CGAL Qt5 -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +# Find CGAL and CGAL Qt6 +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) @@ -24,52 +24,52 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() -# Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Script OpenGL) +# Find Qt6 itself +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets) -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) - qt5_wrap_ui(UI_FILES MainWindow.ui) + qt6_wrap_ui(UI_FILES MainWindow.ui) include(AddFileDependencies) - qt5_generate_moc("MainWindow.h" + qt6_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") add_file_dependencies(MainWindow_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h") - qt5_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") + qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") add_file_dependencies(Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h") - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES PCA_demo.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES PCA_demo.qrc) add_file_dependencies( PCA_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") - add_executable(PCA_demo PCA_demo.cpp ${UI_FILES} ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + add_executable(PCA_demo PCA_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) - target_link_libraries(PCA_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - CGAL::Eigen3_support Qt5::Gui) + target_link_libraries(PCA_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 + CGAL::Eigen3_support Qt6::Gui) add_to_cached_list(CGAL_EXECUTABLE_TARGETS PCA_demo) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(PCA_demo) -else(CGAL_Qt5_FOUND AND Qt5_FOUND) +else(CGAL_Qt6_FOUND AND Qt6_FOUND) set(PCA_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) - set(PCA_MISSING_DEPS "the CGAL Qt5 library, ${PCA_MISSING_DEPS}") + if(NOT CGAL_Qt6_FOUND) + set(PCA_MISSING_DEPS "the CGAL Qt6 library, ${PCA_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(PCA_MISSING_DEPS "Qt5, ${PCA_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(PCA_MISSING_DEPS "Qt6, ${PCA_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${PCA_MISSING_DEPS} and will not be compiled.") -endif(CGAL_Qt5_FOUND AND Qt5_FOUND) +endif(CGAL_Qt6_FOUND AND Qt6_FOUND) diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index d142ca179899..3c4b5f8ad346 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -18,14 +18,14 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt5 QUIET COMPONENTS OpenGL) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets) -if(Qt5_FOUND) +if(Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) -endif(Qt5_FOUND) +endif(Qt6_FOUND) # Activate concurrency ? (turned OFF by default) option(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3 @@ -45,15 +45,15 @@ else(CGAL_ACTIVATE_CONCURRENT_TRIANGULATION_3) endif(LINK_WITH_TBB) endif() -if(CGAL_Qt5_FOUND AND Qt5_FOUND) +if(CGAL_Qt6_FOUND AND Qt6_FOUND) include_directories(BEFORE ./) # ui files, created with Qt Designer - qt5_wrap_ui(uis MainWindow.ui) + qt6_wrap_ui(uis MainWindow.ui) # qrc files (resources files, that contain icons, at least) - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES ./T3_demo.qrc) + qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./T3_demo.qrc) # cpp files add_executable( @@ -64,13 +64,13 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) PreferenceDlg.cpp Scene.cpp ${uis} - ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) + ${CGAL_Qt6_RESOURCE_FILES} + ${CGAL_Qt6_MOC_FILES}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS T3_demo) - target_link_libraries(T3_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5) - target_link_libraries(T3_demo PRIVATE Qt5::OpenGL) + target_link_libraries(T3_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) + target_link_libraries(T3_demo PRIVATE Qt6::OpenGLWidgets) if(TARGET CGAL::TBB_support) target_link_libraries(T3_demo PUBLIC CGAL::TBB_support) endif() @@ -81,19 +81,19 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(T3_demo) -else(CGAL_Qt5_FOUND AND Qt5_FOUND) +else(CGAL_Qt6_FOUND AND Qt6_FOUND) set(TRIANGULATION_3_MISSING_DEPS "") - if(NOT CGAL_Qt5_FOUND) + if(NOT CGAL_Qt6_FOUND) set(TRIANGULATION_3_MISSING_DEPS - "the CGAL Qt5 library, ${TRIANGULATION_3_MISSING_DEPS}") + "the CGAL Qt6 library, ${TRIANGULATION_3_MISSING_DEPS}") endif() - if(NOT Qt5_FOUND) - set(TRIANGULATION_3_MISSING_DEPS "Qt5, ${TRIANGULATION_3_MISSING_DEPS}") + if(NOT Qt6_FOUND) + set(TRIANGULATION_3_MISSING_DEPS "Qt6, ${TRIANGULATION_3_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${TRIANGULATION_3_MISSING_DEPS}, and will not be compiled.") -endif(CGAL_Qt5_FOUND AND Qt5_FOUND) +endif(CGAL_Qt6_FOUND AND Qt6_FOUND) diff --git a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt index c9b21f4d7eef..020c94e50df6 100644 --- a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt +++ b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt @@ -20,32 +20,32 @@ if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() -# Find CGAL and CGAL Qt5 -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +# Find CGAL and CGAL Qt6 +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -# Find Qt5 itself -find_package(Qt5 QUIET COMPONENTS Script OpenGL Gui Svg) +# Find Qt6 itself +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Gui Svg) find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) -if(CGAL_Qt5_FOUND AND Qt5_FOUND AND TARGET CGAL::Eigen3_support) +if(CGAL_Qt6_FOUND AND Qt6_FOUND AND TARGET CGAL::Eigen3_support) # Include this package's headers first include_directories(BEFORE ./ ./include) # ui file, created with Qt Designer - qt5_wrap_ui( uis Mainwindow.ui ) + qt6_wrap_ui( uis Mainwindow.ui ) - #qt5_generate_moc( main.cpp Mainwindow.moc) + #qt6_generate_moc( main.cpp Mainwindow.moc) add_executable ( Triangulation_on_sphere_2_Demo main.cpp Viewer.cpp ${uis}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Triangulation_on_sphere_2_Demo ) - target_link_libraries( Triangulation_on_sphere_2_Demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 CGAL::Eigen3_support) + target_link_libraries( Triangulation_on_sphere_2_Demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 CGAL::Eigen3_support) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test( Triangulation_on_sphere_2_Demo ) else() - message("NOTICE: This demo requires CGAL, Qt5, and Eigen, and will not be compiled.") + message("NOTICE: This demo requires CGAL, Qt6, and Eigen, and will not be compiled.") endif() From 7e160aa2bb4daea89c4c222784b7c1ab696043b3 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 21 Apr 2023 14:36:13 +0100 Subject: [PATCH 0217/1398] Hello QJSEngine [skip ci] --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 4 +-- AABB_tree/demo/AABB_tree/MainWindow.cpp | 26 ++++++++++++++++--- AABB_tree/demo/AABB_tree/MainWindow.h | 34 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index 76e9faa655e4..d3042f8eb7c9 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -24,7 +24,7 @@ include_directories(BEFORE ./ ./include) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Gui Svg) +find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Gui Svg Qml) if(CGAL_Qt6_FOUND AND Qt6_FOUND) @@ -53,7 +53,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) #${CGAL_Qt6_MOC_FILES} ) # Link with Qt libraries - target_link_libraries(AABB_demo PRIVATE Qt6::OpenGLWidgets Qt6::Gui + target_link_libraries(AABB_demo PRIVATE Qt6::OpenGLWidgets Qt6::Gui Qt6::Qml CGAL::CGAL CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo) diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index 95fc4056bf7e..7064d50ba5a3 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -13,6 +13,8 @@ #include "ui_MainWindow.h" + + MainWindow::MainWindow(QWidget* parent) : CGAL::Qt::DemosMainWindow(parent) { @@ -38,12 +40,25 @@ MainWindow::MainWindow(QWidget* parent) connect(this, SIGNAL(openRecentFile(QString)), this, SLOT(open(QString))); + QJSValue mainWindow = myEngine.newQObject(this); + myEngine.globalObject().setProperty("main_window", mainWindow); readSettings(); + std::ifstream script("init.js"); + if(script.good()){ + std::string line; + while(getline(script, line)){ + myEngine.evaluate(line.c_str()); + } + } } MainWindow::~MainWindow() { m_pViewer->makeCurrent(); + // AF I thought this helps to avoid the exception when the program + // terminates, but it does not + myEngine.globalObject().setProperty("main_window", QJSValue()); + myEngine.collectGarbage(); delete ui; } @@ -65,6 +80,13 @@ void MainWindow::dropEvent(QDropEvent *event) event->acceptProposedAction(); } + +void MainWindow::hello() const +{ + std::cout << "Hhello world" << std::endl; +} + + void MainWindow::updateViewerBBox() { m_pScene->update_bbox(); @@ -418,7 +440,3 @@ void MainWindow::on_actionCopy_snapshot_triggered() qb->setImage(snapshot); QApplication::restoreOverrideCursor(); } - - - - diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index f768694514b8..7a28f7cde919 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include #include class QDragEnterEvent; @@ -12,6 +13,36 @@ namespace Ui { class MainWindow; } +#if 0 + +struct Foo : public QObject +{ + + Q_OBJECT +public: + QJSEngine myEngine; + + Foo() + { + QJSValue baz = myEngine.newQObject(this); + myEngine.globalObject().setProperty("baz", baz); + } + + void bar() + { + std::cout << "bar()" << std::endl; + myEngine.evaluate("baz.hello()"); + } + +public slots: + void hello() const // if not a slot it must be + { + std::cout << "called hello()" << std::endl; + } + +}; +#endif + class MainWindow : public CGAL::Qt::DemosMainWindow @@ -22,6 +53,8 @@ class MainWindow : ~MainWindow(); public slots: + + void hello() const; void updateViewerBBox(); void open(QString filename); void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers); @@ -79,6 +112,7 @@ class MainWindow : void on_actionView_cutting_plane_triggered(); private: + QJSEngine myEngine; Scene* m_pScene; Viewer* m_pViewer; Ui::MainWindow* ui; From b4a259c31b28396cbeba31fb831b53ba9a06f538 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 21 Apr 2023 14:36:13 +0100 Subject: [PATCH 0218/1398] Hello QJSEngine [skip ci] --- AABB_tree/demo/AABB_tree/init.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 AABB_tree/demo/AABB_tree/init.js diff --git a/AABB_tree/demo/AABB_tree/init.js b/AABB_tree/demo/AABB_tree/init.js new file mode 100644 index 000000000000..e7f08e266c68 --- /dev/null +++ b/AABB_tree/demo/AABB_tree/init.js @@ -0,0 +1,2 @@ +main_window.hello(); +main_window.hello(); From fc034c6a5d589cfbf4ed976c1c043c0293ce3f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 18:40:39 +0200 Subject: [PATCH 0219/1398] boost::unit -> std::uint --- BGL/include/CGAL/boost/graph/IO/STL.h | 2 +- CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h | 2 +- .../include/CGAL/Image_3_vtk_interface.h | 6 +-- ...or_connected_components_in_labeled_image.h | 2 +- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 6 +-- Number_types/include/CGAL/Mpzf.h | 6 +-- .../include/CGAL/known_bit_size_integers.h | 8 ++-- .../Number_types/known_bit_size_integers.cpp | 8 ++-- Point_set_3/doc/Point_set_3/Point_set_3.txt | 2 +- Point_set_3/include/CGAL/Point_set_3.h | 2 +- Point_set_3/include/CGAL/Point_set_3/IO/PLY.h | 30 ++++++------ .../Classification/Cluster_classification.cpp | 12 ++--- .../Point_set_item_classification.cpp | 12 ++--- .../Display/Display_property_plugin.cpp | 48 +++++++++---------- .../demo/Polyhedron/Scene_image_item.cpp | 6 +-- Spatial_searching/include/CGAL/Kd_tree_node.h | 4 +- Stream_support/include/CGAL/IO/PLY.h | 24 +++++----- .../include/CGAL/IO/PLY/PLY_reader.h | 34 ++++++------- Stream_support/include/CGAL/IO/STL.h | 2 +- .../include/CGAL/IO/STL/STL_reader.h | 2 +- .../doc/Surface_mesh/Surface_mesh.txt | 2 +- .../include/CGAL/Surface_mesh/IO/PLY.h | 38 +++++++-------- .../include/CGAL/Surface_mesh/Surface_mesh.h | 6 +-- .../boost/graph/properties_Surface_mesh.h | 12 ++--- .../include/CGAL/Face_graph_wrapper.h | 2 +- .../Functors_for_face_graph_wrapper.h | 12 ++--- 26 files changed, 145 insertions(+), 145 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/IO/STL.h b/BGL/include/CGAL/boost/graph/IO/STL.h index 7198d8640aa1..d2cb78c45243 100644 --- a/BGL/include/CGAL/boost/graph/IO/STL.h +++ b/BGL/include/CGAL/boost/graph/IO/STL.h @@ -264,7 +264,7 @@ bool write_STL(std::ostream& os, if(get_mode(os) == BINARY) { os << "FileType: Binary "; - const boost::uint32_t N32 = static_cast(faces(g).size()); + const std::uint32_t N32 = static_cast(faces(g).size()); os.write(reinterpret_cast(&N32), sizeof(N32)); for(const face_descriptor f : faces(g)) diff --git a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h index c40f95ca3780..83841c5f5792 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h @@ -42,7 +42,7 @@ typedef short CGAL_INT16; typedef boost::int32_t CGAL_INT32; typedef unsigned char CGAL_UINT8; typedef unsigned short CGAL_UINT16; -typedef boost::uint32_t CGAL_UINT32; +typedef std::uint32_t CGAL_UINT32; /***************************************************************************** * diff --git a/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h b/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h index 57e8555557d3..d4fa5b776b8f 100644 --- a/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h +++ b/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h @@ -55,7 +55,7 @@ struct VTK_type_generator { }; template <> -struct VTK_type_generator { +struct VTK_type_generator { static const int type = VTK_UNSIGNED_CHAR; typedef vtkUnsignedCharArray ArrayType; }; @@ -67,7 +67,7 @@ struct VTK_type_generator { }; template <> -struct VTK_type_generator { +struct VTK_type_generator { static const int type = VTK_UNSIGNED_SHORT; typedef vtkUnsignedShortArray ArrayType; }; @@ -79,7 +79,7 @@ struct VTK_type_generator { }; template <> -struct VTK_type_generator { +struct VTK_type_generator { static const int type = VTK_UNSIGNED_INT; typedef vtkUnsignedIntArray ArrayType; }; diff --git a/Mesh_3/include/CGAL/Mesh_3/search_for_connected_components_in_labeled_image.h b/Mesh_3/include/CGAL/Mesh_3/search_for_connected_components_in_labeled_image.h index 343b16ebdc22..70c6d34add02 100644 --- a/Mesh_3/include/CGAL/Mesh_3/search_for_connected_components_in_labeled_image.h +++ b/Mesh_3/include/CGAL/Mesh_3/search_for_connected_components_in_labeled_image.h @@ -47,7 +47,7 @@ search_for_connected_components_in_labeled_image(const CGAL::Image_3& image, const std::size_t nz = image.zdim(); const std::size_t size = nx * ny * nz; - typedef boost::uint16_t uint; + typedef std::uint16_t uint; if(nx > 65535 || ny > 65535 || nz > 65535) { diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 17e69ff984cb..72ba8cdaa0cf 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -456,9 +456,9 @@ class Polyhedral_complex_mesh_domain_3 // here we have a new free vertex on patch #`patch_id` if(random.uniform_smallint( - boost::uint32_t(0), - boost::uint32_t(nb_of_free_vertices_on_patch[patch_id])) - < boost::uint32_t(needed_vertices_on_patch[patch_id])) + std::uint32_t(0), + std::uint32_t(nb_of_free_vertices_on_patch[patch_id])) + < std::uint32_t(needed_vertices_on_patch[patch_id])) { several_vertices_on_patch[patch_id].push_back(vit); --needed_vertices_on_patch[patch_id]; diff --git a/Number_types/include/CGAL/Mpzf.h b/Number_types/include/CGAL/Mpzf.h index c2689f3ee455..93cfcd5b30cd 100644 --- a/Number_types/include/CGAL/Mpzf.h +++ b/Number_types/include/CGAL/Mpzf.h @@ -188,7 +188,7 @@ template struct no_pool { }; // Only used with an argument known not to be 0. -inline int ctz (boost::uint64_t x) { +inline int ctz (std::uint64_t x) { #if defined(_MSC_VER) unsigned long ret; _BitScanForward64(&ret, x); @@ -200,7 +200,7 @@ inline int ctz (boost::uint64_t x) { return __builtin_ctzll (x); #endif } -inline int clz (boost::uint64_t x) { +inline int clz (std::uint64_t x) { #if defined(_MSC_VER) unsigned long ret; _BitScanReverse64(&ret, x); @@ -430,7 +430,7 @@ struct Mpzf { } Mpzf(double d){ init(); - using boost::uint64_t; + using std::uint64_t; union { #ifdef CGAL_LITTLE_ENDIAN struct { uint64_t man:52; uint64_t exp:11; uint64_t sig:1; } s; diff --git a/Number_types/include/CGAL/known_bit_size_integers.h b/Number_types/include/CGAL/known_bit_size_integers.h index 5f9e786701ff..c4871baa3291 100644 --- a/Number_types/include/CGAL/known_bit_size_integers.h +++ b/Number_types/include/CGAL/known_bit_size_integers.h @@ -38,15 +38,15 @@ namespace CGAL { typedef boost::int16_t Integer16; typedef boost::int32_t Integer32; - typedef boost::uint8_t UInteger8; - typedef boost::uint16_t UInteger16; - typedef boost::uint32_t UInteger32; + typedef std::uint8_t UInteger8; + typedef std::uint16_t UInteger16; + typedef std::uint32_t UInteger32; #ifndef BOOST_NO_INT64_T // this macro is still provided but its use is discouraged # define CGAL_HAS_INTEGER64 typedef boost::int64_t Integer64; - typedef boost::uint64_t UInteger64; + typedef std::uint64_t UInteger64; #endif } //namespace CGAL diff --git a/Number_types/test/Number_types/known_bit_size_integers.cpp b/Number_types/test/Number_types/known_bit_size_integers.cpp index 0172db54dac2..d7799f602666 100644 --- a/Number_types/test/Number_types/known_bit_size_integers.cpp +++ b/Number_types/test/Number_types/known_bit_size_integers.cpp @@ -14,11 +14,11 @@ int main() CGAL_static_assertion(sizeof(boost::int64_t) == 8); #endif - CGAL_static_assertion(sizeof(boost::uint8_t) == 1); - CGAL_static_assertion(sizeof(boost::uint16_t) == 2); - CGAL_static_assertion(sizeof(boost::uint32_t) == 4); + CGAL_static_assertion(sizeof(std::uint8_t) == 1); + CGAL_static_assertion(sizeof(std::uint16_t) == 2); + CGAL_static_assertion(sizeof(std::uint32_t) == 4); #ifndef BOOST_NO_INT64_T - CGAL_static_assertion(sizeof(boost::uint64_t) == 8); + CGAL_static_assertion(sizeof(std::uint64_t) == 8); #endif return 0; diff --git a/Point_set_3/doc/Point_set_3/Point_set_3.txt b/Point_set_3/doc/Point_set_3/Point_set_3.txt index 449e557d88e0..513659988820 100644 --- a/Point_set_3/doc/Point_set_3/Point_set_3.txt +++ b/Point_set_3/doc/Point_set_3/Point_set_3.txt @@ -117,7 +117,7 @@ For example, if the following line is found in the PLY header: > property uchar red -Then a property named `red` and with type `boost::uint8_t` (`boost` +Then a property named `red` and with type `std::uint8_t` (`boost` types are used because of their fixed memory size) will be instantiated in the point set and filled with the corresponding values. diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index 2d0f2083dcc5..70cd87aee043 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -48,7 +48,7 @@ namespace internal { #ifdef CGAL_POINT_SET_3_USE_STD_SIZE_T_AS_SIZE_TYPE typedef std::size_t size_type; #else - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; #endif typedef CGAL::Point_set_3 Point_set_3; diff --git a/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h b/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h index 9a9b7fcddb75..147d38e11397 100644 --- a/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h +++ b/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h @@ -124,10 +124,10 @@ class Point_set_3_filler (new PLY_property_to_point_set_property(m_point_set, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -136,10 +136,10 @@ class Point_set_3_filler (new PLY_property_to_point_set_property(m_point_set, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -148,10 +148,10 @@ class Point_set_3_filler (new PLY_property_to_point_set_property(m_point_set, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -457,13 +457,13 @@ bool write_PLY(std::ostream& os, typedef typename Point_set::Point_map Point_map; typedef typename Point_set::Vector_map Vector_map; typedef typename Point_set::template Property_map Int8_map; - typedef typename Point_set::template Property_map Uint8_map; + typedef typename Point_set::template Property_map Uint8_map; typedef typename Point_set::template Property_map Int16_map; - typedef typename Point_set::template Property_map Uint16_map; + typedef typename Point_set::template Property_map Uint16_map; typedef typename Point_set::template Property_map Int32_map; - typedef typename Point_set::template Property_map Uint32_map; + typedef typename Point_set::template Property_map Uint32_map; typedef typename Point_set::template Property_map Int64_map; - typedef typename Point_set::template Property_map Uint64_map; + typedef typename Point_set::template Property_map Uint64_map; typedef typename Point_set::template Property_map Float_map; typedef typename Point_set::template Property_map Double_map; @@ -551,7 +551,7 @@ bool write_PLY(std::ostream& os, } { Uint8_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property uchar " << prop[i] << std::endl; @@ -571,7 +571,7 @@ bool write_PLY(std::ostream& os, } { Uint16_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property ushort " << prop[i] << std::endl; @@ -591,7 +591,7 @@ bool write_PLY(std::ostream& os, } { Uint32_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property uint " << prop[i] << std::endl; @@ -611,11 +611,11 @@ bool write_PLY(std::ostream& os, } { Uint64_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property uint " << prop[i] << std::endl; - printers.push_back(new internal::Simple_property_printer(pmap)); + printers.push_back(new internal::Simple_property_printer(pmap)); continue; } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp index b919ba2ca6b3..03d16d3eef95 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp @@ -637,11 +637,11 @@ void Cluster_classification::compute_features (std::size_t nb_scales, float voxe bool colors = (m_color != Point_set::Property_map()); - Point_set::Property_map echo_map; + Point_set::Property_map echo_map; bool echo; - boost::tie (echo_map, echo) = m_points->point_set()->template property_map("echo"); + boost::tie (echo_map, echo) = m_points->point_set()->template property_map("echo"); if (!echo) - boost::tie (echo_map, echo) = m_points->point_set()->template property_map("number_of_returns"); + boost::tie (echo_map, echo) = m_points->point_set()->template property_map("number_of_returns"); Feature_set pointwise_features; @@ -775,15 +775,15 @@ void Cluster_classification::add_remaining_point_set_properties_as_features(Feat if (try_adding_simple_feature(feature_set, prop[i])) continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp index b6295553e1ad..23aa1094f9e3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp @@ -532,11 +532,11 @@ void Point_set_item_classification::compute_features (std::size_t nb_scales, flo bool colors = (m_color != Point_set::Property_map()); - Point_set::Property_map echo_map; + Point_set::Property_map echo_map; bool echo; - boost::tie (echo_map, echo) = m_points->point_set()->template property_map("echo"); + boost::tie (echo_map, echo) = m_points->point_set()->template property_map("echo"); if (!echo) - boost::tie (echo_map, echo) = m_points->point_set()->template property_map("number_of_returns"); + boost::tie (echo_map, echo) = m_points->point_set()->template property_map("number_of_returns"); m_generator = new Generator (*(m_points->point_set()), m_points->point_set()->point_map(), nb_scales, voxel_size); @@ -670,15 +670,15 @@ void Point_set_item_classification::add_remaining_point_set_properties_as_featur if (try_adding_simple_feature(prop[i])) continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index af1eef9e115c..3e2f7003882c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -1758,7 +1758,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1766,7 +1766,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1774,7 +1774,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1782,7 +1782,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1805,7 +1805,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1813,7 +1813,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1821,7 +1821,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1829,7 +1829,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1847,13 +1847,13 @@ private Q_SLOTS: bool DisplayPropertyPlugin::treat_point_property(std::string name, Point_set* ps) { typedef typename Point_set::template Property_map Int8_map; - typedef typename Point_set::template Property_map Uint8_map; + typedef typename Point_set::template Property_map Uint8_map; typedef typename Point_set::template Property_map Int16_map; - typedef typename Point_set::template Property_map Uint16_map; + typedef typename Point_set::template Property_map Uint16_map; typedef typename Point_set::template Property_map Int32_map; - typedef typename Point_set::template Property_map Uint32_map; + typedef typename Point_set::template Property_map Uint32_map; typedef typename Point_set::template Property_map Int64_map; - typedef typename Point_set::template Property_map Uint64_map; + typedef typename Point_set::template Property_map Uint64_map; typedef typename Point_set::template Property_map Float_map; typedef typename Point_set::template Property_map Double_map; @@ -1869,7 +1869,7 @@ private Q_SLOTS: { Uint8_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1887,7 +1887,7 @@ private Q_SLOTS: { Uint16_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1905,7 +1905,7 @@ private Q_SLOTS: { Uint32_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1923,7 +1923,7 @@ private Q_SLOTS: { Uint64_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1954,13 +1954,13 @@ private Q_SLOTS: bool DisplayPropertyPlugin::treat_sm_property(std::string name, SMesh* sm) { typedef typename SMesh::template Property_map Int8_map; - typedef typename SMesh::template Property_map Uint8_map; + typedef typename SMesh::template Property_map Uint8_map; typedef typename SMesh::template Property_map Int16_map; - typedef typename SMesh::template Property_map Uint16_map; + typedef typename SMesh::template Property_map Uint16_map; typedef typename SMesh::template Property_map Int32_map; - typedef typename SMesh::template Property_map Uint32_map; + typedef typename SMesh::template Property_map Uint32_map; typedef typename SMesh::template Property_map Int64_map; - typedef typename SMesh::template Property_map Uint64_map; + typedef typename SMesh::template Property_map Uint64_map; typedef typename SMesh::template Property_map Float_map; typedef typename SMesh::template Property_map Double_map; @@ -1976,7 +1976,7 @@ private Q_SLOTS: { Uint8_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -1994,7 +1994,7 @@ private Q_SLOTS: { Uint16_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -2012,7 +2012,7 @@ private Q_SLOTS: { Uint32_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -2030,7 +2030,7 @@ private Q_SLOTS: { Uint64_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp index 229aff8a7ffe..24deb8dbc303 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp @@ -548,11 +548,11 @@ template const char* whatType(T) { return "unknown"; } // defaul template <> const char* whatType(float) { return "float"; } template <> const char* whatType(double) { return "double"; } template <> const char* whatType(char) { return "int8_t (char)"; } -template <> const char* whatType(boost::uint8_t) { return "uint8_t (unsigned char)"; } +template <> const char* whatType(std::uint8_t) { return "uint8_t (unsigned char)"; } template <> const char* whatType(boost::int16_t) { return "int16_t (short)"; } -template <> const char* whatType(boost::uint16_t) { return "uint16_t (unsigned short)"; } +template <> const char* whatType(std::uint16_t) { return "uint16_t (unsigned short)"; } template <> const char* whatType(boost::int32_t) { return "int32_t (int)"; } -template <> const char* whatType(boost::uint32_t) { return "uint32_t (unsigned int)"; } +template <> const char* whatType(std::uint32_t) { return "uint32_t (unsigned int)"; } template QString explicitWordType() diff --git a/Spatial_searching/include/CGAL/Kd_tree_node.h b/Spatial_searching/include/CGAL/Kd_tree_node.h index 02af0663d6ab..242b1c9ccc48 100644 --- a/Spatial_searching/include/CGAL/Kd_tree_node.h +++ b/Spatial_searching/include/CGAL/Kd_tree_node.h @@ -653,7 +653,7 @@ namespace CGAL { private: // private variables for internal nodes - boost::uint8_t cut_dim; + std::uint8_t cut_dim; FT cut_val; Node_handle lower_ch, upper_ch; @@ -714,7 +714,7 @@ namespace CGAL { inline void set_separator(Separator& sep){ - cut_dim = static_cast(sep.cutting_dimension()); + cut_dim = static_cast(sep.cutting_dimension()); cut_val = sep.cutting_value(); } diff --git a/Stream_support/include/CGAL/IO/PLY.h b/Stream_support/include/CGAL/IO/PLY.h index 34dfd1ddba6f..c9623ac455d5 100644 --- a/Stream_support/include/CGAL/IO/PLY.h +++ b/Stream_support/include/CGAL/IO/PLY.h @@ -81,13 +81,13 @@ bool read_PLY(std::istream& is, bool has_colors = false; std::string rtag = "r", gtag = "g", btag = "b"; - if((element.has_property("red") || element.has_property("r")) && - (element.has_property("green") || element.has_property("g")) && - (element.has_property("blue") || element.has_property("b"))) + if((element.has_property("red") || element.has_property("r")) && + (element.has_property("green") || element.has_property("g")) && + (element.has_property("blue") || element.has_property("b"))) { has_colors = true; - if(element.has_property("red")) + if(element.has_property("red")) { rtag = "red"; gtag = "green"; @@ -106,17 +106,17 @@ bool read_PLY(std::istream& is, return false; } - std::tuple new_vertex; + std::tuple new_vertex; if(has_colors) { internal::process_properties(element, new_vertex, make_ply_point_reader(CGAL::make_nth_of_tuple_property_map<0>(new_vertex)), std::make_pair(CGAL::make_nth_of_tuple_property_map<1>(new_vertex), - PLY_property(rtag.c_str())), + PLY_property(rtag.c_str())), std::make_pair(CGAL::make_nth_of_tuple_property_map<2>(new_vertex), - PLY_property(gtag.c_str())), + PLY_property(gtag.c_str())), std::make_pair(CGAL::make_nth_of_tuple_property_map<3>(new_vertex), - PLY_property(btag.c_str()))); + PLY_property(btag.c_str()))); *vc_out++ = Color_rgb(get<1>(new_vertex), get<2>(new_vertex), get<3>(new_vertex)); } @@ -135,17 +135,17 @@ bool read_PLY(std::istream& is, { internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); } - else if(element.has_property >("vertex_indices")) + else if(element.has_property >("vertex_indices")) { - internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); + internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); } else if(element.has_property >("vertex_index")) { internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_index"); } - else if(element.has_property >("vertex_index")) + else if(element.has_property >("vertex_index")) { - internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_index"); + internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_index"); } else { diff --git a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h index ddbb1835054c..cd007c256186 100644 --- a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h +++ b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h @@ -37,11 +37,11 @@ m_elements.back().add_property(new PLY_read_typed_list_with_typed_size< SIZE_TYPE , INDEX_TYPE >(name, format)) #define TRY_TO_GENERATE_LIST_PROPERTY(STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ - TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uchar", "uint8", boost::uint8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uchar", "uint8", std::uint8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("char", "int8", boost::int8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("ushort", "uint16", boost::uint16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("ushort", "uint16", std::uint16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("short", "int16", boost::int16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uint", "uint32", boost::uint32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uint", "uint32", std::uint32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("int", "int32", boost::int32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) namespace CGAL { @@ -530,22 +530,22 @@ class PLY_reader } TRY_TO_GENERATE_LIST_PROPERTY("char", "int8", boost::int8_t); - else TRY_TO_GENERATE_LIST_PROPERTY("uchar", "uint8", boost::uint8_t); + else TRY_TO_GENERATE_LIST_PROPERTY("uchar", "uint8", std::uint8_t); else TRY_TO_GENERATE_LIST_PROPERTY("short", "int16", boost::int16_t); - else TRY_TO_GENERATE_LIST_PROPERTY("ushort", "uint16", boost::uint16_t); + else TRY_TO_GENERATE_LIST_PROPERTY("ushort", "uint16", std::uint16_t); else TRY_TO_GENERATE_LIST_PROPERTY("int", "int32", boost::int32_t); - else TRY_TO_GENERATE_LIST_PROPERTY("uint", "uint32", boost::uint32_t); + else TRY_TO_GENERATE_LIST_PROPERTY("uint", "uint32", std::uint32_t); else TRY_TO_GENERATE_LIST_PROPERTY("float", "float32", float); else TRY_TO_GENERATE_LIST_PROPERTY("double", "float64", double); } else { TRY_TO_GENERATE_PROPERTY("char", "int8", boost::int8_t); - else TRY_TO_GENERATE_PROPERTY("uchar", "uint8", boost::uint8_t); + else TRY_TO_GENERATE_PROPERTY("uchar", "uint8", std::uint8_t); else TRY_TO_GENERATE_PROPERTY("short", "int16", boost::int16_t); - else TRY_TO_GENERATE_PROPERTY("ushort", "uint16", boost::uint16_t); + else TRY_TO_GENERATE_PROPERTY("ushort", "uint16", std::uint16_t); else TRY_TO_GENERATE_PROPERTY("int", "int32", boost::int32_t); - else TRY_TO_GENERATE_PROPERTY("uint", "uint32", boost::uint32_t); + else TRY_TO_GENERATE_PROPERTY("uint", "uint32", std::uint32_t); else TRY_TO_GENERATE_PROPERTY("float", "float32", float); else TRY_TO_GENERATE_PROPERTY("double", "float64", double); } @@ -711,12 +711,12 @@ bool read_PLY_faces(std::istream& in, bool has_colors = false; std::string rtag = "r", gtag = "g", btag = "b"; - if((element.has_property("red") || element.has_property("r")) && - (element.has_property("green") || element.has_property("g")) && - (element.has_property("blue") || element.has_property("b"))) + if((element.has_property("red") || element.has_property("r")) && + (element.has_property("green") || element.has_property("g")) && + (element.has_property("blue") || element.has_property("b"))) { has_colors = true; - if(element.has_property("red")) + if(element.has_property("red")) { rtag = "red"; gtag = "green"; @@ -735,7 +735,7 @@ bool read_PLY_faces(std::istream& in, return false; } - std::tuple, boost::uint8_t, boost::uint8_t, boost::uint8_t> new_face; + std::tuple, std::uint8_t, std::uint8_t, std::uint8_t> new_face; if(has_colors) { @@ -743,11 +743,11 @@ bool read_PLY_faces(std::istream& in, std::make_pair(CGAL::make_nth_of_tuple_property_map<0>(new_face), PLY_property >(vertex_indices_tag)), std::make_pair(CGAL::make_nth_of_tuple_property_map<1>(new_face), - PLY_property(rtag.c_str())), + PLY_property(rtag.c_str())), std::make_pair(CGAL::make_nth_of_tuple_property_map<2>(new_face), - PLY_property(gtag.c_str())), + PLY_property(gtag.c_str())), std::make_pair(CGAL::make_nth_of_tuple_property_map<3>(new_face), - PLY_property(btag.c_str()))); + PLY_property(btag.c_str()))); *fc_out++ = Color_rgb(get<1>(new_face), get<2>(new_face), get<3>(new_face)); } diff --git a/Stream_support/include/CGAL/IO/STL.h b/Stream_support/include/CGAL/IO/STL.h index d2c31b00cf85..dfa3ecded7ea 100644 --- a/Stream_support/include/CGAL/IO/STL.h +++ b/Stream_support/include/CGAL/IO/STL.h @@ -308,7 +308,7 @@ bool write_STL(std::ostream& os, if(get_mode(os) == BINARY) { os << "FileType: Binary "; - const boost::uint32_t N32 = static_cast(facets.size()); + const std::uint32_t N32 = static_cast(facets.size()); os.write(reinterpret_cast(&N32), sizeof(N32)); for(const Triangle& face : facets) diff --git a/Stream_support/include/CGAL/IO/STL/STL_reader.h b/Stream_support/include/CGAL/IO/STL/STL_reader.h index 919ceeddd56d..16970596d098 100644 --- a/Stream_support/include/CGAL/IO/STL/STL_reader.h +++ b/Stream_support/include/CGAL/IO/STL/STL_reader.h @@ -209,7 +209,7 @@ bool parse_binary_STL(std::istream& is, int index = 0; std::map index_map; - boost::uint32_t N32; + std::uint32_t N32; if(!(is.read(reinterpret_cast(&N32), sizeof(N32)))) { if(verbose) diff --git a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt index 82555e4488cc..e7a521eaaabc 100644 --- a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt +++ b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt @@ -398,7 +398,7 @@ Result of the run of the draw_surface_mesh program. A window shows the surface m \section sectionSurfaceMeshImplementation Implementation Details -As integer type for the indices we have chosen `boost::uint32_t`. On 64 bit operating systems they +As integer type for the indices we have chosen `std::uint32_t`. On 64 bit operating systems they take only half the size of a pointer. They still allow to have meshes with 2 billion elements. We use `std::vector` for storing properties. So by accessing the address diff --git a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h index 8e274941fc1a..dac77f788dd4 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h @@ -146,7 +146,7 @@ class Surface_mesh_filler if(name == "vertex_indices" || name == "vertex_index") { CGAL_assertion(dynamic_cast*>(property) - || dynamic_cast*>(property)); + || dynamic_cast*>(property)); m_index_tag = name; m_use_int32_t = dynamic_cast*>(property); return true; @@ -222,25 +222,25 @@ class Surface_mesh_filler { properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { @@ -316,7 +316,7 @@ class Surface_mesh_filler if(m_use_int32_t) process_line(element, fi); else - process_line(element, fi); + process_line(element, fi); if(fi == Surface_mesh::null_face()) return false; @@ -370,7 +370,7 @@ class Surface_mesh_filler if(m_use_int32_t) process_line(element, ei); else - process_line(element, ei); + process_line(element, ei); if(ei == Surface_mesh::null_edge()) return false; @@ -403,7 +403,7 @@ class Surface_mesh_filler if(m_use_int32_t) process_line(element, hi); else - process_line(element, hi); + process_line(element, hi); if(hi == Surface_mesh::null_halfedge()) return false; @@ -641,13 +641,13 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, { typedef Surface_mesh SMesh; typedef typename SMesh::template Property_map Int8_map; - typedef typename SMesh::template Property_map Uint8_map; + typedef typename SMesh::template Property_map Uint8_map; typedef typename SMesh::template Property_map Int16_map; - typedef typename SMesh::template Property_map Uint16_map; + typedef typename SMesh::template Property_map Uint16_map; typedef typename SMesh::template Property_map Int32_map; - typedef typename SMesh::template Property_map Uint32_map; + typedef typename SMesh::template Property_map Uint32_map; typedef typename SMesh::template Property_map Int64_map; - typedef typename SMesh::template Property_map Uint64_map; + typedef typename SMesh::template Property_map Uint64_map; typedef typename SMesh::template Property_map Float_map; typedef typename SMesh::template Property_map Double_map; @@ -721,7 +721,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Uint8_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property uchar " << name << std::endl; @@ -741,7 +741,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Uint16_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property ushort " << name << std::endl; @@ -761,7 +761,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Uint32_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property uint " << name << std::endl; @@ -781,11 +781,11 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Uint64_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property uint " << name << std::endl; - printers.push_back(new internal::Simple_property_printer(pmap)); + printers.push_back(new internal::Simple_property_printer(pmap)); continue; } } diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index 47232cbabd51..8a4b5c0921ee 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -60,7 +60,7 @@ namespace CGAL { class SM_Index { public: - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; /// Constructor. %Default construction creates an invalid index. /// We write -1, which is /// (std::numeric_limits::max)() @@ -239,7 +239,7 @@ namespace CGAL { class SM_Edge_index { public: - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; SM_Edge_index() : halfedge_((std::numeric_limits::max)()) { } @@ -364,7 +364,7 @@ class Surface_mesh typedef P Point; /// The type used to represent an index. - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; ///@} diff --git a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h index 5bff49ebab5b..b05395d26427 100644 --- a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h +++ b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h @@ -71,8 +71,8 @@ class SM_index_pmap { public: typedef boost::readable_property_map_tag category; - typedef boost::uint32_t value_type; - typedef boost::uint32_t reference; + typedef std::uint32_t value_type; + typedef std::uint32_t reference; typedef VEF key_type; value_type operator[](const key_type& vd) const @@ -260,13 +260,13 @@ namespace internal { const TYPE& x) \ { return get(get(p, sm), x); } \ -CGAL_SM_INTRINSIC_PROPERTY(boost::uint32_t, boost::vertex_index_t, +CGAL_SM_INTRINSIC_PROPERTY(std::uint32_t, boost::vertex_index_t, SM_Vertex_index) -CGAL_SM_INTRINSIC_PROPERTY(boost::uint32_t, boost::edge_index_t, +CGAL_SM_INTRINSIC_PROPERTY(std::uint32_t, boost::edge_index_t, SM_Edge_index) -CGAL_SM_INTRINSIC_PROPERTY(boost::uint32_t, boost::halfedge_index_t, +CGAL_SM_INTRINSIC_PROPERTY(std::uint32_t, boost::halfedge_index_t, SM_Halfedge_index) -CGAL_SM_INTRINSIC_PROPERTY(boost::uint32_t, boost::face_index_t, +CGAL_SM_INTRINSIC_PROPERTY(std::uint32_t, boost::face_index_t, SM_Face_index) CGAL_SM_INTRINSIC_PROPERTY(Point&, CGAL::vertex_point_t, SM_Vertex_index) diff --git a/Surface_mesh_topology/include/CGAL/Face_graph_wrapper.h b/Surface_mesh_topology/include/CGAL/Face_graph_wrapper.h index b44c70ef305c..661b69eb94dd 100644 --- a/Surface_mesh_topology/include/CGAL/Face_graph_wrapper.h +++ b/Surface_mesh_topology/include/CGAL/Face_graph_wrapper.h @@ -40,7 +40,7 @@ class Face_graph_wrapper public: typedef HEG_ HEG; typedef Face_graph_wrapper Self; - typedef boost::uint32_t /*std::size_t*/ size_type; + typedef std::uint32_t /*std::size_t*/ size_type; typedef Self Refs; struct Dart_container diff --git a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Functors_for_face_graph_wrapper.h b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Functors_for_face_graph_wrapper.h index ea5b79e2bfb3..200ffb829379 100644 --- a/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Functors_for_face_graph_wrapper.h +++ b/Surface_mesh_topology/include/CGAL/Surface_mesh_topology/internal/Functors_for_face_graph_wrapper.h @@ -71,7 +71,7 @@ struct Get_beta template struct Index_from_halfedge_descriptor { - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; typedef typename boost::template graph_traits::halfedge_descriptor halfedge_descriptor; @@ -88,7 +88,7 @@ template struct Index_from_halfedge_descriptor > { using Mesh=CGAL::Surface_mesh

; - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; typedef typename boost::template graph_traits::halfedge_descriptor halfedge_descriptor; @@ -99,7 +99,7 @@ struct Index_from_halfedge_descriptor > template struct Halfedge_descriptor_from_index { - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; typedef typename boost::template graph_traits::halfedge_descriptor halfedge_descriptor; @@ -115,7 +115,7 @@ template struct Halfedge_descriptor_from_index > { using Mesh=CGAL::Surface_mesh

; - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; typedef typename boost::template graph_traits::halfedge_descriptor halfedge_descriptor; @@ -126,7 +126,7 @@ struct Halfedge_descriptor_from_index > template struct Is_index_used { - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; static bool run(const Mesh& m, size_type i) { return i struct Is_index_used > { using Mesh=CGAL::Surface_mesh

; - typedef boost::uint32_t size_type; + typedef std::uint32_t size_type; static bool run(const Mesh& m, size_type i) { return i<(m.number_of_halfedges()+m.number_of_removed_halfedges()) && From 99e7f4806a1c8b18b98a76c7b4ba39d345e55c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 18:43:10 +0200 Subject: [PATCH 0220/1398] boost::int -> std::int --- CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h | 2 +- .../include/CGAL/Image_3_vtk_interface.h | 4 +- .../Hyperbolic_triangulation_face_base_2.h | 2 +- .../include/CGAL/known_bit_size_integers.h | 8 ++-- .../Number_types/known_bit_size_integers.cpp | 8 ++-- .../Point_set_3/point_set_read_ply.cpp | 4 +- Point_set_3/include/CGAL/Point_set_3/IO/PLY.h | 30 ++++++------ .../Classification/Cluster_classification.cpp | 6 +-- .../Point_set_item_classification.cpp | 6 +-- .../Display/Display_property_plugin.cpp | 48 +++++++++---------- .../demo/Polyhedron/Scene_image_item.cpp | 4 +- Random_numbers/include/CGAL/Random_impl.h | 6 +-- Spatial_searching/include/CGAL/Kd_tree_node.h | 4 +- .../CGAL/IO/OFF/File_header_OFF_impl.h | 2 +- .../include/CGAL/IO/OFF/File_scanner_OFF.h | 8 ++-- .../include/CGAL/IO/OFF/File_writer_OFF.h | 4 +- Stream_support/include/CGAL/IO/PLY.h | 8 ++-- .../include/CGAL/IO/PLY/PLY_reader.h | 18 +++---- .../include/CGAL/Surface_mesh/IO/PLY.h | 40 ++++++++-------- .../Triangulation_3/test_regular_remove_3.cpp | 2 +- 20 files changed, 107 insertions(+), 107 deletions(-) diff --git a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h index 83841c5f5792..9c27b948b3d3 100644 --- a/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h +++ b/CGAL_ImageIO/include/CGAL/ImageIO/bmptypes.h @@ -39,7 +39,7 @@ typedef char CGAL_INT8; typedef short CGAL_INT16; -typedef boost::int32_t CGAL_INT32; +typedef std::int32_t CGAL_INT32; typedef unsigned char CGAL_UINT8; typedef unsigned short CGAL_UINT16; typedef std::uint32_t CGAL_UINT32; diff --git a/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h b/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h index d4fa5b776b8f..99a7f528f17e 100644 --- a/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h +++ b/CGAL_ImageIO/include/CGAL/Image_3_vtk_interface.h @@ -61,7 +61,7 @@ struct VTK_type_generator { }; template <> -struct VTK_type_generator { +struct VTK_type_generator { static const int type = VTK_SHORT; typedef vtkShortArray ArrayType; }; @@ -73,7 +73,7 @@ struct VTK_type_generator { }; template <> -struct VTK_type_generator { +struct VTK_type_generator { static const int type = VTK_INT; typedef vtkIntArray ArrayType; }; diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h index 32d730aab7c3..724f45794e65 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h @@ -23,7 +23,7 @@ namespace CGAL { class Hyperbolic_data { - typedef boost::int8_t Id; + typedef std::int8_t Id; private: // - 2 for infinite face diff --git a/Number_types/include/CGAL/known_bit_size_integers.h b/Number_types/include/CGAL/known_bit_size_integers.h index c4871baa3291..c5bc43fed546 100644 --- a/Number_types/include/CGAL/known_bit_size_integers.h +++ b/Number_types/include/CGAL/known_bit_size_integers.h @@ -34,9 +34,9 @@ namespace CGAL { - typedef boost::int8_t Integer8; - typedef boost::int16_t Integer16; - typedef boost::int32_t Integer32; + typedef std::int8_t Integer8; + typedef std::int16_t Integer16; + typedef std::int32_t Integer32; typedef std::uint8_t UInteger8; typedef std::uint16_t UInteger16; @@ -45,7 +45,7 @@ namespace CGAL { #ifndef BOOST_NO_INT64_T // this macro is still provided but its use is discouraged # define CGAL_HAS_INTEGER64 - typedef boost::int64_t Integer64; + typedef std::int64_t Integer64; typedef std::uint64_t UInteger64; #endif diff --git a/Number_types/test/Number_types/known_bit_size_integers.cpp b/Number_types/test/Number_types/known_bit_size_integers.cpp index d7799f602666..93f2be8d6ec7 100644 --- a/Number_types/test/Number_types/known_bit_size_integers.cpp +++ b/Number_types/test/Number_types/known_bit_size_integers.cpp @@ -7,11 +7,11 @@ int main() std::cout << "Verifying the sizes of boost::[u]int{8,16,32,64}_t" << std::endl; - CGAL_static_assertion(sizeof(boost::int8_t) == 1); - CGAL_static_assertion(sizeof(boost::int16_t) == 2); - CGAL_static_assertion(sizeof(boost::int32_t) == 4); + CGAL_static_assertion(sizeof(std::int8_t) == 1); + CGAL_static_assertion(sizeof(std::int16_t) == 2); + CGAL_static_assertion(sizeof(std::int32_t) == 4); #ifndef BOOST_NO_INT64_T - CGAL_static_assertion(sizeof(boost::int64_t) == 8); + CGAL_static_assertion(sizeof(std::int64_t) == 8); #endif CGAL_static_assertion(sizeof(std::uint8_t) == 1); diff --git a/Point_set_3/examples/Point_set_3/point_set_read_ply.cpp b/Point_set_3/examples/Point_set_3/point_set_read_ply.cpp index 01add66acb16..f0ecd03904f2 100644 --- a/Point_set_3/examples/Point_set_3/point_set_read_ply.cpp +++ b/Point_set_3/examples/Point_set_3/point_set_read_ply.cpp @@ -32,9 +32,9 @@ int main (int argc, char** argv) std::cerr << " * " << properties[i] << std::endl; // Recover "label" property of type int - Point_set::Property_map label_prop; + Point_set::Property_map label_prop; bool found = false; - boost::tie(label_prop, found) = point_set.property_map ("label"); + boost::tie(label_prop, found) = point_set.property_map ("label"); if(found) { diff --git a/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h b/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h index 147d38e11397..9e5dafbd2895 100644 --- a/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h +++ b/Point_set_3/include/CGAL/Point_set_3/IO/PLY.h @@ -118,10 +118,10 @@ class Point_set_3_filler continue; } - if(dynamic_cast*>(property)) + if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -130,10 +130,10 @@ class Point_set_3_filler (new PLY_property_to_point_set_property(m_point_set, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -142,10 +142,10 @@ class Point_set_3_filler (new PLY_property_to_point_set_property(m_point_set, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { m_properties.push_back - (new PLY_property_to_point_set_property(m_point_set, + (new PLY_property_to_point_set_property(m_point_set, name)); } else if(dynamic_cast*>(property)) @@ -456,13 +456,13 @@ bool write_PLY(std::ostream& os, typedef typename Point_set::Index Index; typedef typename Point_set::Point_map Point_map; typedef typename Point_set::Vector_map Vector_map; - typedef typename Point_set::template Property_map Int8_map; + typedef typename Point_set::template Property_map Int8_map; typedef typename Point_set::template Property_map Uint8_map; - typedef typename Point_set::template Property_map Int16_map; + typedef typename Point_set::template Property_map Int16_map; typedef typename Point_set::template Property_map Uint16_map; - typedef typename Point_set::template Property_map Int32_map; + typedef typename Point_set::template Property_map Int32_map; typedef typename Point_set::template Property_map Uint32_map; - typedef typename Point_set::template Property_map Int64_map; + typedef typename Point_set::template Property_map Int64_map; typedef typename Point_set::template Property_map Uint64_map; typedef typename Point_set::template Property_map Float_map; typedef typename Point_set::template Property_map Double_map; @@ -541,7 +541,7 @@ bool write_PLY(std::ostream& os, bool okay = false; { Int8_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property char " << prop[i] << std::endl; @@ -561,7 +561,7 @@ bool write_PLY(std::ostream& os, } { Int16_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property short " << prop[i] << std::endl; @@ -581,7 +581,7 @@ bool write_PLY(std::ostream& os, } { Int32_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property int " << prop[i] << std::endl; @@ -601,11 +601,11 @@ bool write_PLY(std::ostream& os, } { Int64_map pmap; - boost::tie(pmap, okay) = point_set.template property_map(prop[i]); + boost::tie(pmap, okay) = point_set.template property_map(prop[i]); if(okay) { os << "property int " << prop[i] << std::endl; - printers.push_back(new internal::Simple_property_printer(pmap)); + printers.push_back(new internal::Simple_property_printer(pmap)); continue; } } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp index 03d16d3eef95..cc1393e2ec2e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp @@ -773,15 +773,15 @@ void Cluster_classification::add_remaining_point_set_properties_as_features(Feat prop[i] == "r" || prop[i] == "g" || prop[i] == "b") continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; - if (try_adding_simple_feature(feature_set, prop[i])) + if (try_adding_simple_feature(feature_set, prop[i])) continue; if (try_adding_simple_feature(feature_set, prop[i])) continue; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp index 23aa1094f9e3..617692963d12 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp @@ -668,15 +668,15 @@ void Point_set_item_classification::add_remaining_point_set_properties_as_featur prop[i] == "r" || prop[i] == "g" || prop[i] == "b") continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; - if (try_adding_simple_feature(prop[i])) + if (try_adding_simple_feature(prop[i])) continue; if (try_adding_simple_feature(prop[i])) continue; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 3e2f7003882c..51f960a7cb49 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -1754,7 +1754,7 @@ private Q_SLOTS: return false; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1762,7 +1762,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1770,7 +1770,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1778,7 +1778,7 @@ private Q_SLOTS: { return true; } - if(ps->template property_map(name).second) + if(ps->template property_map(name).second) { return true; } @@ -1801,7 +1801,7 @@ private Q_SLOTS: bool DisplayPropertyPlugin::is_property_scalar(std::string name, const SMesh* sm) { - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1809,7 +1809,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1817,7 +1817,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1825,7 +1825,7 @@ private Q_SLOTS: { return true; } - if(sm->template property_map(name).second) + if(sm->template property_map(name).second) { return true; } @@ -1846,13 +1846,13 @@ private Q_SLOTS: bool DisplayPropertyPlugin::treat_point_property(std::string name, Point_set* ps) { - typedef typename Point_set::template Property_map Int8_map; + typedef typename Point_set::template Property_map Int8_map; typedef typename Point_set::template Property_map Uint8_map; - typedef typename Point_set::template Property_map Int16_map; + typedef typename Point_set::template Property_map Int16_map; typedef typename Point_set::template Property_map Uint16_map; - typedef typename Point_set::template Property_map Int32_map; + typedef typename Point_set::template Property_map Int32_map; typedef typename Point_set::template Property_map Uint32_map; - typedef typename Point_set::template Property_map Int64_map; + typedef typename Point_set::template Property_map Int64_map; typedef typename Point_set::template Property_map Uint64_map; typedef typename Point_set::template Property_map Float_map; typedef typename Point_set::template Property_map Double_map; @@ -1860,7 +1860,7 @@ private Q_SLOTS: bool okay = false; { Int8_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1878,7 +1878,7 @@ private Q_SLOTS: { Int16_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1896,7 +1896,7 @@ private Q_SLOTS: { Int32_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1914,7 +1914,7 @@ private Q_SLOTS: { Int64_map pmap; - std::tie(pmap, okay) = ps->property_map(name); + std::tie(pmap, okay) = ps->property_map(name); if(okay) { return displayPSProperty(ps, pmap); @@ -1953,13 +1953,13 @@ private Q_SLOTS: template bool DisplayPropertyPlugin::treat_sm_property(std::string name, SMesh* sm) { - typedef typename SMesh::template Property_map Int8_map; + typedef typename SMesh::template Property_map Int8_map; typedef typename SMesh::template Property_map Uint8_map; - typedef typename SMesh::template Property_map Int16_map; + typedef typename SMesh::template Property_map Int16_map; typedef typename SMesh::template Property_map Uint16_map; - typedef typename SMesh::template Property_map Int32_map; + typedef typename SMesh::template Property_map Int32_map; typedef typename SMesh::template Property_map Uint32_map; - typedef typename SMesh::template Property_map Int64_map; + typedef typename SMesh::template Property_map Int64_map; typedef typename SMesh::template Property_map Uint64_map; typedef typename SMesh::template Property_map Float_map; typedef typename SMesh::template Property_map Double_map; @@ -1967,7 +1967,7 @@ private Q_SLOTS: bool okay = false; { Int8_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -1985,7 +1985,7 @@ private Q_SLOTS: { Int16_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -2003,7 +2003,7 @@ private Q_SLOTS: { Int32_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); @@ -2021,7 +2021,7 @@ private Q_SLOTS: { Int64_map pmap; - std::tie(pmap, okay) = sm->property_map(name); + std::tie(pmap, okay) = sm->property_map(name); if(okay) { return displaySMProperty(*sm, pmap, TAG()); diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp index 24deb8dbc303..94c091b86e91 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp @@ -549,9 +549,9 @@ template <> const char* whatType(float) { return "float"; } template <> const char* whatType(double) { return "double"; } template <> const char* whatType(char) { return "int8_t (char)"; } template <> const char* whatType(std::uint8_t) { return "uint8_t (unsigned char)"; } -template <> const char* whatType(boost::int16_t) { return "int16_t (short)"; } +template <> const char* whatType(std::int16_t) { return "int16_t (short)"; } template <> const char* whatType(std::uint16_t) { return "uint16_t (unsigned short)"; } -template <> const char* whatType(boost::int32_t) { return "int32_t (int)"; } +template <> const char* whatType(std::int32_t) { return "int32_t (int)"; } template <> const char* whatType(std::uint32_t) { return "uint32_t (unsigned int)"; } template diff --git a/Random_numbers/include/CGAL/Random_impl.h b/Random_numbers/include/CGAL/Random_impl.h index 89ca7057fe5d..675ed05e814e 100644 --- a/Random_numbers/include/CGAL/Random_impl.h +++ b/Random_numbers/include/CGAL/Random_impl.h @@ -40,7 +40,7 @@ Random() std::time( &s); seed = (unsigned int)s; // initialize random numbers generator - rng.seed(static_cast(seed)); + rng.seed(static_cast(seed)); random_value = get_int(0, 1<<15); } @@ -55,7 +55,7 @@ Random(internal::Random_print_seed) seed = (unsigned int)s; std::cerr << "CGAL::Random()::get_seed() = " << seed << std::endl; // initialize random numbers generator - rng.seed(static_cast(seed)); + rng.seed(static_cast(seed)); random_value = get_int(0, 1<<15); } @@ -65,7 +65,7 @@ Random( unsigned int seed) : val(0), seed(seed) { // initialize random numbers generator - rng.seed(static_cast(seed)); + rng.seed(static_cast(seed)); random_value = get_int(0, 1<<15); } diff --git a/Spatial_searching/include/CGAL/Kd_tree_node.h b/Spatial_searching/include/CGAL/Kd_tree_node.h index 242b1c9ccc48..c6af70495a2a 100644 --- a/Spatial_searching/include/CGAL/Kd_tree_node.h +++ b/Spatial_searching/include/CGAL/Kd_tree_node.h @@ -435,7 +435,7 @@ namespace CGAL { private: // private variables for leaf nodes - boost::int32_t n; // denotes number of items in a leaf node + std::int32_t n; // denotes number of items in a leaf node iterator data; // iterator to data in leaf node @@ -503,7 +503,7 @@ namespace CGAL { private: // private variables for internal nodes - boost::int32_t cut_dim; + std::int32_t cut_dim; FT cut_val; Node_handle lower_ch, upper_ch; diff --git a/Stream_support/include/CGAL/IO/OFF/File_header_OFF_impl.h b/Stream_support/include/CGAL/IO/OFF/File_header_OFF_impl.h index 1ecff298f55b..87994e60aa99 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_header_OFF_impl.h +++ b/Stream_support/include/CGAL/IO/OFF/File_header_OFF_impl.h @@ -348,7 +348,7 @@ std::istream& operator>>( std::istream& in, File_header_OFF& h) { // Read remaining size value(s). int n_h; if ( h.binary()) { - boost::int32_t a, b, c; + std::int32_t a, b, c; I_Binary_read_big_endian_integer32( in, a); if ( h.n_dimensional()) { h.set_dimension( a); diff --git a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h b/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h index 806295998184..8ec2d14334b2 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h +++ b/Stream_support/include/CGAL/IO/OFF/File_scanner_OFF.h @@ -656,7 +656,7 @@ class File_scanner_OFF if(has_colors()) { - boost::int32_t k; + std::int32_t k; I_Binary_read_big_endian_integer32(m_in, k); if(k<0 || k>4) { @@ -688,7 +688,7 @@ class File_scanner_OFF CGAL_assertion(current_facet < size_of_facets()); if(binary()) { - boost::int32_t i32; + std::int32_t i32; I_Binary_read_big_endian_integer32(m_in, i32); size = i32; } @@ -735,7 +735,7 @@ class File_scanner_OFF std::size_t current_facet) { if(binary()){ - boost::int32_t i32; + std::int32_t i32; I_Binary_read_big_endian_integer32(m_in, i32); index = i32; } @@ -793,7 +793,7 @@ class File_scanner_OFF // Take care of trailing information like color triples. if(binary()) { - boost::int32_t k; + std::int32_t k; I_Binary_read_big_endian_integer32(m_in, k); if(k<0 || k>4) { diff --git a/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h b/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h index 91860254f47e..d608a7e38f4f 100644 --- a/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h +++ b/Stream_support/include/CGAL/IO/OFF/File_writer_OFF.h @@ -129,7 +129,7 @@ class File_writer_OFF void write_facet_begin(std::size_t no) { if(m_header.binary()) - I_Binary_write_big_endian_integer32(out(), static_cast(no)); + I_Binary_write_big_endian_integer32(out(), static_cast(no)); else out() << no << ' '; } @@ -137,7 +137,7 @@ class File_writer_OFF void write_facet_vertex_index(std::size_t index) { if(m_header.binary()) - I_Binary_write_big_endian_integer32(out(), static_cast(index)); + I_Binary_write_big_endian_integer32(out(), static_cast(index)); else out() << ' ' << index; } diff --git a/Stream_support/include/CGAL/IO/PLY.h b/Stream_support/include/CGAL/IO/PLY.h index c9623ac455d5..7f72b37a3f59 100644 --- a/Stream_support/include/CGAL/IO/PLY.h +++ b/Stream_support/include/CGAL/IO/PLY.h @@ -131,17 +131,17 @@ bool read_PLY(std::istream& is, } else if(element.name() == "face" || element.name() == "faces") { - if(element.has_property >("vertex_indices")) + if(element.has_property >("vertex_indices")) { - internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); + internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); } else if(element.has_property >("vertex_indices")) { internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_indices"); } - else if(element.has_property >("vertex_index")) + else if(element.has_property >("vertex_index")) { - internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_index"); + internal::read_PLY_faces(is, element, polygons, fc_out, "vertex_index"); } else if(element.has_property >("vertex_index")) { diff --git a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h index cd007c256186..a4a50bd36c8c 100644 --- a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h +++ b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h @@ -38,11 +38,11 @@ #define TRY_TO_GENERATE_LIST_PROPERTY(STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) \ TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uchar", "uint8", std::uint8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("char", "int8", boost::int8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("char", "int8", std::int8_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("ushort", "uint16", std::uint16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("short", "int16", boost::int16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("short", "int16", std::int16_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("uint", "uint32", std::uint32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE); \ - else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("int", "int32", boost::int32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) + else TRY_TO_GENERATE_SIZED_LIST_PROPERTY("int", "int32", std::int32_t, STD_INDEX_TYPE, T_INDEX_TYPE, INDEX_TYPE) namespace CGAL { @@ -529,22 +529,22 @@ class PLY_reader return false; } - TRY_TO_GENERATE_LIST_PROPERTY("char", "int8", boost::int8_t); + TRY_TO_GENERATE_LIST_PROPERTY("char", "int8", std::int8_t); else TRY_TO_GENERATE_LIST_PROPERTY("uchar", "uint8", std::uint8_t); - else TRY_TO_GENERATE_LIST_PROPERTY("short", "int16", boost::int16_t); + else TRY_TO_GENERATE_LIST_PROPERTY("short", "int16", std::int16_t); else TRY_TO_GENERATE_LIST_PROPERTY("ushort", "uint16", std::uint16_t); - else TRY_TO_GENERATE_LIST_PROPERTY("int", "int32", boost::int32_t); + else TRY_TO_GENERATE_LIST_PROPERTY("int", "int32", std::int32_t); else TRY_TO_GENERATE_LIST_PROPERTY("uint", "uint32", std::uint32_t); else TRY_TO_GENERATE_LIST_PROPERTY("float", "float32", float); else TRY_TO_GENERATE_LIST_PROPERTY("double", "float64", double); } else { - TRY_TO_GENERATE_PROPERTY("char", "int8", boost::int8_t); + TRY_TO_GENERATE_PROPERTY("char", "int8", std::int8_t); else TRY_TO_GENERATE_PROPERTY("uchar", "uint8", std::uint8_t); - else TRY_TO_GENERATE_PROPERTY("short", "int16", boost::int16_t); + else TRY_TO_GENERATE_PROPERTY("short", "int16", std::int16_t); else TRY_TO_GENERATE_PROPERTY("ushort", "uint16", std::uint16_t); - else TRY_TO_GENERATE_PROPERTY("int", "int32", boost::int32_t); + else TRY_TO_GENERATE_PROPERTY("int", "int32", std::int32_t); else TRY_TO_GENERATE_PROPERTY("uint", "uint32", std::uint32_t); else TRY_TO_GENERATE_PROPERTY("float", "float32", float); else TRY_TO_GENERATE_PROPERTY("double", "float64", double); diff --git a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h index dac77f788dd4..7bf9dd2e8fc2 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/IO/PLY.h @@ -145,10 +145,10 @@ class Surface_mesh_filler const std::string& name = property->name(); if(name == "vertex_indices" || name == "vertex_index") { - CGAL_assertion(dynamic_cast*>(property) + CGAL_assertion(dynamic_cast*>(property) || dynamic_cast*>(property)); m_index_tag = name; - m_use_int32_t = dynamic_cast*>(property); + m_use_int32_t = dynamic_cast*>(property); return true; } if(name == "red" || @@ -218,25 +218,25 @@ class Surface_mesh_filler const std::string& name = property->name(); - if(dynamic_cast*>(property)) + if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } - else if(dynamic_cast*>(property)) + else if(dynamic_cast*>(property)) { - properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); + properties.push_back(new PLY_property_to_surface_mesh_property(m_mesh, name)); } else if(dynamic_cast*>(property)) { @@ -314,7 +314,7 @@ class Surface_mesh_filler Face_index fi = m_mesh.null_face(); if(m_use_int32_t) - process_line(element, fi); + process_line(element, fi); else process_line(element, fi); @@ -368,7 +368,7 @@ class Surface_mesh_filler Edge_index ei = m_mesh.null_edge(); if(m_use_int32_t) - process_line(element, ei); + process_line(element, ei); else process_line(element, ei); @@ -401,7 +401,7 @@ class Surface_mesh_filler Halfedge_index hi = m_mesh.null_halfedge(); if(m_use_int32_t) - process_line(element, hi); + process_line(element, hi); else process_line(element, hi); @@ -640,13 +640,13 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, const CGAL_NP_CLASS& np = parameters::default_values()) { typedef Surface_mesh SMesh; - typedef typename SMesh::template Property_map Int8_map; + typedef typename SMesh::template Property_map Int8_map; typedef typename SMesh::template Property_map Uint8_map; - typedef typename SMesh::template Property_map Int16_map; + typedef typename SMesh::template Property_map Int16_map; typedef typename SMesh::template Property_map Uint16_map; - typedef typename SMesh::template Property_map Int32_map; + typedef typename SMesh::template Property_map Int32_map; typedef typename SMesh::template Property_map Uint32_map; - typedef typename SMesh::template Property_map Int64_map; + typedef typename SMesh::template Property_map Int64_map; typedef typename SMesh::template Property_map Uint64_map; typedef typename SMesh::template Property_map Float_map; typedef typename SMesh::template Property_map Double_map; @@ -711,7 +711,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, bool okay = false; { Int8_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property char " << name << std::endl; @@ -731,7 +731,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Int16_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property short " << name << std::endl; @@ -751,7 +751,7 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Int32_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property int " << name << std::endl; @@ -771,11 +771,11 @@ void fill_header(std::ostream& os, const Surface_mesh& sm, } { Int64_map pmap; - boost::tie(pmap, okay) = sm.template property_map(prop[i]); + boost::tie(pmap, okay) = sm.template property_map(prop[i]); if(okay) { os << "property int " << name << std::endl; - printers.push_back(new internal::Simple_property_printer(pmap)); + printers.push_back(new internal::Simple_property_printer(pmap)); continue; } } diff --git a/Triangulation_3/test/Triangulation_3/test_regular_remove_3.cpp b/Triangulation_3/test/Triangulation_3/test_regular_remove_3.cpp index f37bb0964136..9252598776cc 100644 --- a/Triangulation_3/test/Triangulation_3/test_regular_remove_3.cpp +++ b/Triangulation_3/test/Triangulation_3/test_regular_remove_3.cpp @@ -329,7 +329,7 @@ int main(int argc, char **argv) } // Hardcoded seeds so that the test-suite is deterministic. - boost::int32_t seed0 = 42, seed1 = 43, seed2 = 42, seed3 = 42; + std::int32_t seed0 = 42, seed1 = 43, seed2 = 42, seed3 = 42; // You can also pass seeds on the command line. if (argc > 1) { std::istringstream iss(argv[1]); iss >>seed0; } From 5a8736d666b95a94c68c96674c5ff5c2bbbfb4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 18:54:12 +0200 Subject: [PATCH 0221/1398] fix typo --- .../include/CGAL/Variational_shape_approximation.h | 2 +- Triangulation_3/doc/Triangulation_3/CGAL/link_to_face_graph.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 566aec602d73..222a99f77e7a 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -1959,7 +1959,7 @@ class Variational_shape_approximation { /*! * @brief checks if a vertex is attached with an anchor. * @tparam VertexAnchorIndexMap `ReadablePropertyMap` - * with `boost::graph_traights::vertex_descriptor` as key and `std::size_t` as value type + * with `boost::graph_traits::vertex_descriptor` as key and `std::size_t` as value type * @param vtx a vertex descriptor * @param vanchor_map vertex anchor index map */ diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/link_to_face_graph.h b/Triangulation_3/doc/Triangulation_3/CGAL/link_to_face_graph.h index 0ca74d3f6ba7..484ae1296c0b 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/link_to_face_graph.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/link_to_face_graph.h @@ -26,7 +26,7 @@ fills the face graph `tm` with the offsets; + std::array offsets; for(int i=0; i<4; ++i) { #ifdef CGAL_PERIODIC_SET_POINT_VERBOSE diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index bd0281cd9d77..300a84fdaced 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -45,7 +45,6 @@ #include #include -#include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp index cc1393e2ec2e..b26135e231ae 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.cpp @@ -19,7 +19,6 @@ #include #include #include -#include Cluster_classification::Cluster_classification(Scene_points_with_normal_item* points) : m_points (points) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp index 617692963d12..12bc858fea91 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Point_set_item_classification.cpp @@ -14,7 +14,6 @@ #include #include #include -#include Point_set_item_classification::Point_set_item_classification(Scene_points_with_normal_item* points) : m_points (points) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Surface_mesh_item_classification.cpp b/Polyhedron/demo/Polyhedron/Plugins/Classification/Surface_mesh_item_classification.cpp index 3fc12e4dd2f1..4880c0917db3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Surface_mesh_item_classification.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Surface_mesh_item_classification.cpp @@ -11,7 +11,6 @@ #include #include #include -#include Surface_mesh_item_classification::Surface_mesh_item_classification(Scene_surface_mesh_item* mesh) : m_mesh (mesh), diff --git a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp index e2b93295cbc6..94a03a4c6f0b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include diff --git a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h index 9fd1aed124ff..fcc57b4ab509 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polygon_soup_item.h @@ -4,8 +4,6 @@ #include #include "SMesh_type.h" -#include - #include struct Scene_polygon_soup_item_priv; @@ -18,7 +16,7 @@ struct Polygon_soup //vector containing a pair of indices of points in Points and a set of indices of Polygons //containing the edge. typedef std::map, std::set > Edges_map; - typedef boost::array Edge; + typedef std::array Edge; typedef std::vector Polygons; typedef std::vector Colors; typedef std::set Edges; diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h index 7639c066a5e8..812a1dc053bb 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.h @@ -21,7 +21,6 @@ #ifndef Q_MOC_RUN #include #include -#include #endif #include diff --git a/STL_Extension/include/CGAL/array.h b/STL_Extension/include/CGAL/array.h index ff234183f99d..eb6d4c086e9e 100644 --- a/STL_Extension/include/CGAL/array.h +++ b/STL_Extension/include/CGAL/array.h @@ -37,7 +37,7 @@ namespace CGAL { // NOTE : The above is actually untrue ! It is possible to do : // struct S2 { -// typedef boost::array Ar; +// typedef std::array Ar; // Ar m; // S2 (const M&a) : m ((Ar) { { a, a } }) {} // }; diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index 8a4b5c0921ee..c109f002a3a6 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -1084,7 +1083,7 @@ class Surface_mesh /// \returns the face index of the added face, or `Surface_mesh::null_face()` if the face could not be added. Face_index add_face(Vertex_index v0, Vertex_index v1, Vertex_index v2) { - boost::array + std::array v = {{v0, v1, v2}}; return add_face(v); } @@ -1093,7 +1092,7 @@ class Surface_mesh /// \returns the face index of the added face, or `Surface_mesh::null_face()` if the face could not be added. Face_index add_face(Vertex_index v0, Vertex_index v1, Vertex_index v2, Vertex_index v3) { - boost::array + std::array v = {{v0, v1, v2, v3}}; return add_face(v); } diff --git a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/square_border_parameterizer.cpp b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/square_border_parameterizer.cpp index 5784d3a1fdb9..09f644dd47db 100644 --- a/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/square_border_parameterizer.cpp +++ b/Surface_mesh_parameterization/examples/Surface_mesh_parameterization/square_border_parameterizer.cpp @@ -10,8 +10,6 @@ #include #include -#include - #include #include #include @@ -28,7 +26,7 @@ typedef boost::graph_traits::face_descriptor face_descriptor typedef boost::graph_traits::vertex_iterator vertex_iterator; -typedef boost::array Vd_array; +typedef std::array Vd_array; typedef CGAL::Unique_hash_map UV_uhm; typedef boost::associative_property_map UV_pmap; diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h index c23ce5bf15d8..1f5bed3c5908 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h @@ -38,7 +38,6 @@ #endif #endif -#include #include #include diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h index 8a67d99a1d21..5e2955124f59 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h @@ -22,8 +22,6 @@ #include #include -#include - namespace CGAL { /*! diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/collapse_short_edges.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/collapse_short_edges.h index 77caca7318f5..d2ababd2779e 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/collapse_short_edges.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/collapse_short_edges.h @@ -18,7 +18,6 @@ #include #include #include -#include #include #include @@ -453,7 +452,7 @@ bool is_valid_collapse(const typename C3t3::Edge& edge, if (!ch->has_vertex(v1)) { //check orientation - boost::array pts = { ch->vertex(0)->point(), + std::array pts = { ch->vertex(0)->point(), ch->vertex(1)->point(), ch->vertex(2)->point(), ch->vertex(3)->point()}; @@ -486,7 +485,7 @@ bool is_valid_collapse(const typename C3t3::Edge& edge, if (!ch->has_vertex(v0)) { //check orientation - boost::array pts = { ch->vertex(0)->point(), + std::array pts = { ch->vertex(0)->point(), ch->vertex(1)->point(), ch->vertex(2)->point(), ch->vertex(3)->point() }; From b8571795b65e18dcc1fcec22515a92620651fac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 19:41:05 +0200 Subject: [PATCH 0228/1398] remove extra namespace --- .../benchmark/Linear_cell_complex_2/surface_mesh/IO_off.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/IO_off.cpp b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/IO_off.cpp index d1be42f9fe41..40024a4b51fb 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/IO_off.cpp +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/IO_off.cpp @@ -42,7 +42,7 @@ bool read_off_ascii(Surface_mesh& mesh, Vec2f t; Surface_mesh::Vertex v; typename CGAL::GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::boost::internal_np::vertex_point), + vpm = choose_parameter(get_parameter(np, CGAL::internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, mesh)); @@ -164,7 +164,7 @@ bool read_off_binary(Surface_mesh& mesh, if (has_normals) normals = mesh.vertex_property("v:normal"); if (has_texcoords) texcoords = mesh.vertex_property("v:texcoord"); typename CGAL::GetVertexPointMap::const_type - vpm = choose_parameter(get_parameter(np, CGAL::boost::internal_np::vertex_point), + vpm = choose_parameter(get_parameter(np, CGAL::internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, mesh)); From 99619dc63417f422574ffc194edba03f07cf4461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 19:49:16 +0200 Subject: [PATCH 0229/1398] boost::prior -> std::prev --- Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h | 2 +- Convex_hull_3/include/CGAL/convex_hull_3.h | 4 ++-- Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h | 4 ++-- Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h | 4 ++-- .../internal/Triangle_3_Triangle_3_intersection.h | 6 +++--- .../include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 2 +- Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h | 4 ++-- .../CGAL/Mesh_domain_with_polyline_features_3.h | 8 ++++---- .../Periodic_3_mesh_3/Protect_edges_sizing_field.h | 2 +- .../intersection_of_coplanar_triangles_3.h | 4 ++-- Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp | 6 +++--- .../Hybrid_squared_distance_cost.h | 2 +- .../Scaled_squared_distance_cost.h | 2 +- .../Polyline_simplification_2/Squared_distance_cost.h | 2 +- .../include/CGAL/Polyline_simplification_2/simplify.h | 8 ++++---- STL_Extension/test/STL_Extension/test_skiplist.cpp | 10 +++++----- .../include/CGAL/Constrained_triangulation_plus_2.h | 4 ++-- 17 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h b/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h index f599e971bb0a..b901a497018c 100644 --- a/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h +++ b/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h @@ -255,7 +255,7 @@ class Fixed_alpha_shape_3 : public Dt std::back_inserter(cells), Emptyset_iterator())); - Facet facet=*boost::prior(facets_on_the_boundary_of_the_hole.end()); + Facet facet=*std::prev(facets_on_the_boundary_of_the_hole.end()); // Remember the points that are hidden by the conflicting cells, // as they will be deleted during the insertion. diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index 18a113293083..5915ca243134 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -613,7 +613,7 @@ partition_outside_sets(const std::list& new_facets, } if(! point_list.empty()){ pending_facets.push_back(f); - f->it = boost::prior(pending_facets.end()); + f->it = std::prev(pending_facets.end()); } else { f->it = pending_facets.end(); } @@ -748,7 +748,7 @@ void non_coplanar_quickhull_3(std::list& points, for(Face_iterator fit = tds.faces_begin(); fit != tds.faces_end(); ++fit){ if (! fit->points.empty()){ pending_facets.push_back(fit); - fit->it = boost::prior(pending_facets.end()); + fit->it = std::prev(pending_facets.end()); } else { fit->it = pending_facets.end(); } diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h index 5460f21e7cef..4490b2057f8a 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h @@ -101,12 +101,12 @@ class VectorH2 Cartesian_const_iterator cartesian_begin() const { return make_cartesian_const_iterator_begin(CGAL::get_pointee_or_identity(base).begin(), - boost::prior(CGAL::get_pointee_or_identity(base).end())); + std::prev(CGAL::get_pointee_or_identity(base).end())); } Cartesian_const_iterator cartesian_end() const { - return make_cartesian_const_iterator_end(boost::prior(CGAL::get_pointee_or_identity(base).end())); + return make_cartesian_const_iterator_end(std::prev(CGAL::get_pointee_or_identity(base).end())); } int dimension() const; diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h index 544ffa964933..7885e2dd9587 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h @@ -117,12 +117,12 @@ class VectorH3 Cartesian_const_iterator cartesian_begin() const { return make_cartesian_const_iterator_begin(get_pointee_or_identity(base).begin(), - boost::prior(get_pointee_or_identity(base).end())); + std::prev(get_pointee_or_identity(base).end())); } Cartesian_const_iterator cartesian_end() const { - return make_cartesian_const_iterator_end(boost::prior(get_pointee_or_identity(base).end())); + return make_cartesian_const_iterator_end(std::prev(get_pointee_or_identity(base).end())); } int dimension() const { return 3; }; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 424e1fc93616..c4be2ae163de 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -53,8 +53,8 @@ void intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& p, CGAL_kernel_assertion_code(int pt_added = 0;) - const typename Kernel::Point_3* prev = &(*boost::prior(inter_pts.end())); - Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : boost::prior(inter_pts.end()); + const typename Kernel::Point_3* prev = &(*std::prev(inter_pts.end())); + Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : std::prev(inter_pts.end()); for(Iterator it=inter_pts.begin(); it!=stop; ++it) { const typename Kernel::Point_3& curr = *it; @@ -123,7 +123,7 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, k.construct_segment_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin())) ); case 3: return intersection_return( - k.construct_triangle_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin()), *boost::prior(inter_pts.end())) ); + k.construct_triangle_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin()), *std::prev(inter_pts.end())) ); default: return intersection_return( std::vector(inter_pts.begin(),inter_pts.end())); diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 2fe2261344c9..8dfdf054d158 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -2098,7 +2098,7 @@ repopulate_edges_around_corner(const Vertex_handle& v, ErasedVeOutIt out) // `check_and_repopulate_edges()::vertices` before it is passed itself // to `repopulate_edges_around_corner()`. if(c3t3_.is_in_complex(to_repopulate.back())) - std::copy(to_repopulate.begin(), boost::prior(to_repopulate.end()), out); + std::copy(to_repopulate.begin(), std::prev(to_repopulate.end()), out); else std::copy(to_repopulate.begin(), to_repopulate.end(), out); 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 e42bc0acff77..7ee16b41b79b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -29,7 +29,7 @@ #include #include -#include // for boost::prior +#include // for std::prev #include #include @@ -388,7 +388,7 @@ void snap_graph_vertices(Graph& graph, if(poly_it->begin() != poly_it->end()) { tree.insert(*poly_it->begin()); if(boost::next(poly_it->begin()) != poly_it->end()) { - tree.insert(*boost::prior(poly_it->end())); + tree.insert(*std::prev(poly_it->end())); } } } diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 47b9bf495ade..363d0d0c61b7 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -37,7 +37,7 @@ #include #include -#include // for boost::prior and boost::next +#include // for std::prev and boost::next #include #include @@ -883,7 +883,7 @@ class Mesh_domain_with_polyline_features_3 } Curve_index maximal_curve_index() const { if(edges_incidences_.empty()) return Curve_index(); - return boost::prior(edges_incidences_.end())->first; + return std::prev(edges_incidences_.end())->first; } void build_curves_aabb_tree() const { @@ -1458,9 +1458,9 @@ insert_edge(InputIterator first, InputIterator end) // 'compute_corners_incidences()', that corner is incident only to a // loop, then it will be removed from the set of corners. register_corner(*first, curve_index); - if ( *first != *boost::prior(end) ) + if ( *first != *std::prev(end) ) { - register_corner(*boost::prior(end), curve_index); + register_corner(*std::prev(end), curve_index); } // Create a new polyline diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h index a8936abb6ffd..de6dccfcbe66 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h @@ -3126,7 +3126,7 @@ repopulate_edges_around_corner(const Vertex_handle& v, ErasedVeOutIt out) // `check_and_repopulate_edges()::vertices` before it is passed itself // to `repopulate_edges_around_corner()`. if(c3t3_.is_in_complex(to_repopulate.back())) - std::copy(to_repopulate.begin(), boost::prior(to_repopulate.end()), out); + std::copy(to_repopulate.begin(), std::prev(to_repopulate.end()), out); else std::copy(to_repopulate.begin(), to_repopulate.end(), out); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h index 0e73d4be013c..50972f741935 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h @@ -243,9 +243,9 @@ struct Intersect_coplanar_faces_3 CGAL_assertion_code(int pt_added=0;) - Inter_pt_info* prev = &(*boost::prior(inter_pts.end())); + Inter_pt_info* prev = &(*std::prev(inter_pts.end())); bool inter_pts_size_g_2 = inter_pts.size() > 2; - Iterator stop = inter_pts_size_g_2 ? inter_pts.end() : boost::prior(inter_pts.end()); + Iterator stop = inter_pts_size_g_2 ? inter_pts.end() : std::prev(inter_pts.end()); for (Iterator it=inter_pts.begin();it!=stop;++it) { Inter_pt_info* curr=&(*it); diff --git a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp index 329d4b3f7198..27e3d41ccc42 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp @@ -622,9 +622,9 @@ void Scene_polylines_item::split_at_sharp_angles() else ++bare_polyline_it; if(it != bare_polyline.end()) { - for(; it != boost::prior(bare_polyline.end()); ++it) { + for(; it != std::prev(bare_polyline.end()); ++it) { const Point_3 pv = *it; - const Point_3 pa = *boost::prior(it); + const Point_3 pa = *std::prev(it); const Point_3 pb = *boost::next(it); const K::Vector_3 av = pv - pa; const K::Vector_3 bv = pv - pb; @@ -647,7 +647,7 @@ void Scene_polylines_item::split_at_sharp_angles() // if the polyline is a cycle, test if its beginning is a sharp // angle... const Point_3 pv = *bare_polyline.begin(); - const Point_3 pa = *boost::prior(boost::prior(bare_polyline.end())); + const Point_3 pa = *std::prev(std::prev(bare_polyline.end())); const Point_3 pb = *boost::next(bare_polyline.begin()); const K::Vector_3 av = pv - pa; const K::Vector_3 bv = pv - pb; diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h index d7f169997b78..850ff94fbd0a 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h @@ -65,7 +65,7 @@ class Hybrid_squared_distance_cost Construct_segment construct_segment = pct.geom_traits().construct_segment_2_object() ; typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; - Vertices_in_constraint_iterator vicp = boost::prior(vicq); + Vertices_in_constraint_iterator vicp = std::prev(vicq); Vertices_in_constraint_iterator vicr = boost::next(vicq); Point const& lP = (*vicp)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h index 53ecf34cc6fc..30a7b2cf00c7 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h @@ -61,7 +61,7 @@ class Scaled_squared_distance_cost Construct_segment construct_segment = pct.geom_traits().construct_segment_2_object() ; typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; - Vertices_in_constraint_iterator vicp = boost::prior(vicq); + Vertices_in_constraint_iterator vicp = std::prev(vicq); Vertices_in_constraint_iterator vicr = boost::next(vicq); Point const& lP = (*vicp)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h index 08ca152ddd0c..92aa449bfdea 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h @@ -66,7 +66,7 @@ class Squared_distance_cost Construct_segment construct_segment = pct.geom_traits().construct_segment_2_object() ; typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; - Vertices_in_constraint_iterator vicp = boost::prior(vicq); + Vertices_in_constraint_iterator vicp = std::prev(vicq); Vertices_in_constraint_iterator vicr = boost::next(vicq); Point const& lP = (*vicp)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index d5497788a02a..e77c07e351e7 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -154,11 +154,11 @@ class Polyline_simplification_2 (*it)->set_removable(false); ++it; for(; it != ite; ++it){ - if((boost::next(it) != ite) && (boost::prior(it)== boost::next(it))){ + if((boost::next(it) != ite) && (std::prev(it)== boost::next(it))){ (*it)->set_removable(false); } } - it = boost::prior(it); + it = std::prev(it); (*it)->set_removable(false); } @@ -245,7 +245,7 @@ class Polyline_simplification_2 } Vertex_handle vh = *it; - Vertices_in_constraint_iterator u = boost::prior(it); + Vertices_in_constraint_iterator u = std::prev(it); Vertex_handle uh = *u; Vertices_in_constraint_iterator w = boost::next(it); Vertex_handle wh = *w; @@ -322,7 +322,7 @@ operator()() Vertices_in_constraint_iterator vit = vertex_to_iterator[v].front(); if(is_removable(vit)){ - Vertices_in_constraint_iterator u = boost::prior(vit), w = boost::next(vit); + Vertices_in_constraint_iterator u = std::prev(vit), w = boost::next(vit); pct.simplify(vit); if((*u)->is_removable()){ diff --git a/STL_Extension/test/STL_Extension/test_skiplist.cpp b/STL_Extension/test/STL_Extension/test_skiplist.cpp index f0f61b5f803f..6405dff5d2f0 100644 --- a/STL_Extension/test/STL_Extension/test_skiplist.cpp +++ b/STL_Extension/test/STL_Extension/test_skiplist.cpp @@ -86,8 +86,8 @@ BOOST_FIXTURE_TEST_CASE( test_single_skip, Fixture ) skips.begin(), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.all_begin(), l.all_end(), all.begin(), all.end()); - l.skip(boost::prior(l.all_end())); - BOOST_CHECK(l.is_skipped(boost::prior(l.all_end()))); + l.skip(std::prev(l.all_end())); + BOOST_CHECK(l.is_skipped(std::prev(l.all_end()))); skips.erase(std::remove(skips.begin(), skips.end(), 7), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); @@ -112,7 +112,7 @@ BOOST_FIXTURE_TEST_CASE( test_range_skip, Fixture ) BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); // drop 6 and 7 - l.skip(boost::prior(l.all_end(), 2), l.all_end()); + l.skip(std::prev(l.all_end(), 2), l.all_end()); skips.erase(std::remove(skips.begin(), skips.end(), 6), skips.end()); skips.erase(std::remove(skips.begin(), skips.end(), 7), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), @@ -229,7 +229,7 @@ BOOST_AUTO_TEST_CASE( test_swap ) { using std::swap; Fixture a, b; - all_iterator it = boost::prior(b.l.all_end()); + all_iterator it = std::prev(b.l.all_end()); b.l.push_back(8); b.l.push_back(9); b.l.push_back(10); swap(a.l, b.l); @@ -244,7 +244,7 @@ BOOST_AUTO_TEST_CASE( test_swap ) a.all.begin(), a.all.end()); // this iterator should still be valid and now point into a BOOST_CHECK_EQUAL_COLLECTIONS(it, a.l.all_end(), - boost::prior(a.all.end(), 4), a.all.end()); + std::prev(a.all.end(), 4), a.all.end()); } BOOST_AUTO_TEST_CASE( test_splice ) diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index 63e07c51dcfe..f37ee350689a 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -582,7 +582,7 @@ Default::Get< Tr_, Constrained_Delaunay_triangulation_2< insert_incident_faces(vcit, out); } //AF vertices_in_constraint_begin(ca)->fixed() = true; - // Vertices_in_constraint_iterator end = boost::prior(vertices_in_constraint_end(ca)); + // Vertices_in_constraint_iterator end = std::prev(vertices_in_constraint_end(ca)); // end->fixed() = true; fc.write_faces(out); @@ -753,7 +753,7 @@ Default::Get< Tr_, Constrained_Delaunay_triangulation_2< void simplify(Vertices_in_constraint_iterator v) { - Vertices_in_constraint_iterator u = boost::prior(v); + Vertices_in_constraint_iterator u = std::prev(v); Vertices_in_constraint_iterator w = boost::next(v); bool unew = (*u != *w); hierarchy.simplify(u,v,w); From e82d970d19e56be8e4b8b7ec84dfd81605bfeb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 19:50:23 +0200 Subject: [PATCH 0230/1398] boost::next -> std::next --- BGL/test/BGL/test_Face_filtered_graph.cpp | 2 +- BGL/test/BGL/test_graph_traits.cpp | 2 +- CGAL_ipelets/demo/CGAL_ipelets/pca.cpp | 4 +- .../include/CGAL/CGAL_Ipelet_base_v6.h | 4 +- .../include/CGAL/CGAL_Ipelet_base_v7.h | 4 +- .../Triangle_3_Triangle_3_intersection.h | 4 +- .../CGAL/Mesh_3/polylines_to_protect.h | 10 ++--- .../Mesh_domain_with_polyline_features_3.h | 2 +- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 2 +- .../intersection_of_coplanar_triangles_3.h | 4 +- .../Plugins/IO/Polylines_io_plugin.cpp | 4 +- .../demo/Polyhedron/Scene_polylines_item.cpp | 16 ++++---- .../Polyhedron/Scene_surface_mesh_item.cpp | 6 +-- .../demo/Polyhedron/include/id_printing.h | 2 +- .../Hybrid_squared_distance_cost.h | 2 +- .../Scaled_squared_distance_cost.h | 2 +- .../Squared_distance_cost.h | 2 +- .../CGAL/Polyline_simplification_2/simplify.h | 6 +-- .../test/STL_Extension/test_skiplist.cpp | 38 +++++++++---------- .../internal/bounded_priority_queue.h | 2 +- .../internal/graph_traits_2D_TDS_helper.h | 2 +- .../CGAL/Constrained_triangulation_plus_2.h | 2 +- .../Polyline_constraint_hierarchy_2.h | 4 +- 23 files changed, 63 insertions(+), 63 deletions(-) diff --git a/BGL/test/BGL/test_Face_filtered_graph.cpp b/BGL/test/BGL/test_Face_filtered_graph.cpp index 2bab2e1d83c4..5dd6521bb02f 100644 --- a/BGL/test/BGL/test_Face_filtered_graph.cpp +++ b/BGL/test/BGL/test_Face_filtered_graph.cpp @@ -37,7 +37,7 @@ void test_halfedge_around_vertex_iterator(const Graph& g) assert(target(*havit, fg) == *vit); // check if we are really moving clockwise - halfedge_around_target_iterator step = boost::next(havit); + halfedge_around_target_iterator step = std::next(havit); if(step != havend) { halfedge_descriptor stepd = *step; assert(stepd == opposite(next(*havit, fg), fg)); diff --git a/BGL/test/BGL/test_graph_traits.cpp b/BGL/test/BGL/test_graph_traits.cpp index 3d71af5a7c23..08e80ef75c76 100644 --- a/BGL/test/BGL/test_graph_traits.cpp +++ b/BGL/test/BGL/test_graph_traits.cpp @@ -34,7 +34,7 @@ void test_halfedge_around_vertex_iterator(const Graph& g) assert(target(*havit, g) == *vit); // check if we are really moving clockwise - halfedge_around_target_iterator step = boost::next(havit); + halfedge_around_target_iterator step = std::next(havit); if(step != havend) { halfedge_descriptor stepd = *step; assert(stepd == opposite(next(*havit, g), g)); diff --git a/CGAL_ipelets/demo/CGAL_ipelets/pca.cpp b/CGAL_ipelets/demo/CGAL_ipelets/pca.cpp index 5e476893af07..50d96042ba69 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/pca.cpp +++ b/CGAL_ipelets/demo/CGAL_ipelets/pca.cpp @@ -67,8 +67,8 @@ void pcaIpelet::protected_run(int fn) for (std::list::iterator it=poly_list.begin();it!=poly_list.end();++it) if (it->size()==3){ tri_list.push_back(Kernel::Triangle_2(*(it->vertices_begin()), - *boost::next(it->vertices_begin()), - *boost::next(it->vertices_begin(),2) + *std::next(it->vertices_begin()), + *std::next(it->vertices_begin(),2) )); } else{ diff --git a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v6.h b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v6.h index 1d55bf3269e5..48572f24118b 100644 --- a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v6.h +++ b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v6.h @@ -317,10 +317,10 @@ namespace CGAL{ IpeSegmentSubPath* create_polyline(const iterator first, const iterator last,bool setclose=false) const { - if (boost::next(first)!=last){ + if (std::next(first)!=last){ IpeSegmentSubPath* SSP_ipe = new IpeSegmentSubPath(); IpeVector Prev_pt=IpeVector(CGAL::to_double(first->x()),CGAL::to_double(first->y())) ; - for (iterator it = boost::next(first);it!=last;++it){ + for (iterator it = std::next(first);it!=last;++it){ IpeVector Cur_pt=IpeVector(CGAL::to_double(it->x()),CGAL::to_double(it->y())); SSP_ipe -> AppendSegment(Prev_pt,Cur_pt); Prev_pt=Cur_pt; diff --git a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h index cae6c0794f87..276e5d5c651a 100644 --- a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h +++ b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h @@ -329,10 +329,10 @@ namespace CGAL{ ipe::Curve* create_polyline(const iterator first, const iterator last,bool setclose=false) const { - if (boost::next(first)!=last){ + if (std::next(first)!=last){ ipe::Curve* SSP_ipe = new ipe::Curve(); ipe::Vector Prev_pt=ipe::Vector(CGAL::to_double(first->x()),CGAL::to_double(first->y())) ; - for (iterator it = boost::next(first);it!=last;++it){ + for (iterator it = std::next(first);it!=last;++it){ ipe::Vector Cur_pt=ipe::Vector(CGAL::to_double(it->x()),CGAL::to_double(it->y())); SSP_ipe -> appendSegment(Prev_pt,Cur_pt); Prev_pt=Cur_pt; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index c4be2ae163de..2f036bc98a07 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -120,10 +120,10 @@ intersection_coplanar_triangles(const typename K::Triangle_3& t1, return intersection_return(*inter_pts.begin()); case 2: return intersection_return( - k.construct_segment_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin())) ); + k.construct_segment_3_object()(*inter_pts.begin(), *std::next(inter_pts.begin())) ); case 3: return intersection_return( - k.construct_triangle_3_object()(*inter_pts.begin(), *boost::next(inter_pts.begin()), *std::prev(inter_pts.end())) ); + k.construct_triangle_3_object()(*inter_pts.begin(), *std::next(inter_pts.begin()), *std::prev(inter_pts.end())) ); default: return intersection_return( std::vector(inter_pts.begin(),inter_pts.end())); 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 7ee16b41b79b..756bf520604d 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -387,7 +387,7 @@ void snap_graph_vertices(Graph& graph, { if(poly_it->begin() != poly_it->end()) { tree.insert(*poly_it->begin()); - if(boost::next(poly_it->begin()) != poly_it->end()) { + if(std::next(poly_it->begin()) != poly_it->end()) { tree.insert(*std::prev(poly_it->end())); } } @@ -1048,10 +1048,10 @@ polylines_to_protect(std::vector >& polylines, continue; typename Polyline::const_iterator pit = polyline.begin(); - while (boost::next(pit) != polyline.end()) + while (std::next(pit) != polyline.end()) { vertex_descriptor v = g_manip.get_vertex(*pit, false); - vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + vertex_descriptor w = g_manip.get_vertex(*std::next(pit), false); g_manip.try_add_edge(v, w); ++pit; } @@ -1165,10 +1165,10 @@ merge_and_snap_polylines(const CGAL::Image_3& image, continue; auto pit = polyline.begin(); - while (boost::next(pit) != polyline.end()) + while (std::next(pit) != polyline.end()) { vertex_descriptor v = g_manip.get_vertex(*pit, false); - vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + vertex_descriptor w = g_manip.get_vertex(*std::next(pit), false); g_manip.try_add_edge(v, w); ++pit; } diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 363d0d0c61b7..400699d0e667 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -37,7 +37,7 @@ #include #include -#include // for std::prev and boost::next +#include // for std::prev and std::next #include #include diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 72ba8cdaa0cf..ce6de8775be8 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -884,7 +884,7 @@ merge_duplicated_points(const PointSet& duplicated_points) typename Union_find_t::handle first_handle = handles[range_begin->second]; // In a second loop on the equal-range, update new_ids around p - for (it = boost::next(range_begin); it != range_end; ++it) + for (it = std::next(range_begin); it != range_end; ++it) { #if CGAL_MESH_3_VERBOSE > 10 std::cerr << " - #" << it->second << "\n"; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h index 50972f741935..45369d47bf53 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h @@ -253,7 +253,7 @@ struct Intersect_coplanar_faces_3 Orientation or_prev=orientations[prev],or_curr=orientations[curr]; if ( (or_prev==POSITIVE && or_curr==NEGATIVE) || (or_prev==NEGATIVE && or_curr==POSITIVE) ) { - Iterator it_curr = inter_pts_size_g_2 ? it:boost::next(it); + Iterator it_curr = inter_pts_size_g_2 ? it:std::next(it); prev=&(* inter_pts.insert( it_curr,operator()(*prev,*curr,h1,h2) ) ); orientations[prev]=COLLINEAR; CGAL_assertion_code(++pt_added;) @@ -278,7 +278,7 @@ struct Intersect_coplanar_faces_3 { if (orientations[&(*it)]==NEGATIVE){ inter_pts.erase(it++); - if (--nb_interpt == 2 && it!=inter_pts.end() && boost::next(it)==inter_pts.end()) should_revert_list=true; + if (--nb_interpt == 2 && it!=inter_pts.end() && std::next(it)==inter_pts.end()) should_revert_list=true; } else ++it; diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp index fa09b6036548..fd052aaf8253 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp @@ -309,10 +309,10 @@ polylines_to_split(std::vector >& polylines, continue; typename Polyline::iterator pit = polyline.begin(); - while (boost::next(pit) != polyline.end()) + while (std::next(pit) != polyline.end()) { vertex_descriptor v = g_manip.get_vertex(*pit, false); - vertex_descriptor w = g_manip.get_vertex(*boost::next(pit), false); + vertex_descriptor w = g_manip.get_vertex(*std::next(pit), false); g_manip.try_add_edge(v, w); ++pit; } diff --git a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp index 27e3d41ccc42..da241453b286 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp @@ -611,9 +611,9 @@ void Scene_polylines_item::split_at_sharp_angles() Bare_polyline_container::iterator current_polyline_it = bare_polyline_it; Bare_polyline& bare_polyline = *bare_polyline_it; - Bare_polyline::iterator it = boost::next(bare_polyline.begin()); + Bare_polyline::iterator it = std::next(bare_polyline.begin()); - if(boost::next(bare_polyline.begin()) == bare_polyline.end()) + if(std::next(bare_polyline.begin()) == bare_polyline.end()) { std::cerr << "WARNING: Isolated point in polylines\n"; bare_polyline_it = bare_polylines.erase(bare_polyline_it); @@ -625,7 +625,7 @@ void Scene_polylines_item::split_at_sharp_angles() for(; it != std::prev(bare_polyline.end()); ++it) { const Point_3 pv = *it; const Point_3 pa = *std::prev(it); - const Point_3 pb = *boost::next(it); + const Point_3 pb = *std::next(it); const K::Vector_3 av = pv - pa; const K::Vector_3 bv = pv - pb; const K::FT sc_prod = av * bv; @@ -648,7 +648,7 @@ void Scene_polylines_item::split_at_sharp_angles() // angle... const Point_3 pv = *bare_polyline.begin(); const Point_3 pa = *std::prev(std::prev(bare_polyline.end())); - const Point_3 pb = *boost::next(bare_polyline.begin()); + const Point_3 pb = *std::next(bare_polyline.begin()); const K::Vector_3 av = pv - pa; const K::Vector_3 bv = pv - pb; const K::FT sc_prod = av * bv; @@ -657,18 +657,18 @@ void Scene_polylines_item::split_at_sharp_angles() CGAL::square(sc_prod) < (av * av) * (bv * bv) / 4 ) ) { // if its beginning is a sharp angle, then split - bare_polyline.erase(boost::next(it), bare_polyline.end()); + bare_polyline.erase(std::next(it), bare_polyline.end()); } else { // ...if not, modifies its beginning - std::copy(boost::next(bare_polyline.begin()), - boost::next(it), + std::copy(std::next(bare_polyline.begin()), + std::next(it), std::back_inserter(new_polyline)); bare_polylines.erase(current_polyline_it); } } else { - bare_polyline.erase(boost::next(it), bare_polyline.end()); + bare_polyline.erase(std::next(it), bare_polyline.end()); } bare_polylines.push_back(new_polyline); break; diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 75db7480aaa0..47efcc20ce9c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -1216,7 +1216,7 @@ Scene_surface_mesh_item::select(double orig_x, const EPICK::Point_3* closest_point = boost::get(&(closest->first)); for(Intersections::iterator - it = boost::next(intersections.begin()), + it = std::next(intersections.begin()), end = intersections.end(); it != end; ++it) { @@ -1431,7 +1431,7 @@ bool Scene_surface_mesh_item::intersect_face(double orig_x, const EPICK::Point_3* closest_point = CGAL::object_cast(&closest->first); for(Intersections::iterator - it = boost::next(intersections.begin()), + it = std::next(intersections.begin()), end = intersections.end(); it != end; ++it) { @@ -1925,7 +1925,7 @@ void Scene_surface_mesh_item::zoomToPosition(const QPoint &point, CGAL::Three::V const EPICK::Point_3* closest_point = boost::get(&closest->first); for(Intersections::iterator - it = boost::next(intersections.begin()), + it = std::next(intersections.begin()), end = intersections.end(); it != end; ++it) { diff --git a/Polyhedron/demo/Polyhedron/include/id_printing.h b/Polyhedron/demo/Polyhedron/include/id_printing.h index 46d142a24bb0..5676f1129df3 100644 --- a/Polyhedron/demo/Polyhedron/include/id_printing.h +++ b/Polyhedron/demo/Polyhedron/include/id_printing.h @@ -155,7 +155,7 @@ bool find_primitive_id(const QPoint& point, const Point* closest_point = boost::get(&closest->first); for(typename Intersections::iterator - it = boost::next(intersections.begin()), + it = std::next(intersections.begin()), end = intersections.end(); it != end; ++it) { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h index 850ff94fbd0a..fd1e9ccc0de8 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h @@ -66,7 +66,7 @@ class Hybrid_squared_distance_cost typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; Vertices_in_constraint_iterator vicp = std::prev(vicq); - Vertices_in_constraint_iterator vicr = boost::next(vicq); + Vertices_in_constraint_iterator vicr = std::next(vicq); Point const& lP = (*vicp)->point(); Point const& lR = (*vicr)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h index 30a7b2cf00c7..8a6977364610 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h @@ -62,7 +62,7 @@ class Scaled_squared_distance_cost typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; Vertices_in_constraint_iterator vicp = std::prev(vicq); - Vertices_in_constraint_iterator vicr = boost::next(vicq); + Vertices_in_constraint_iterator vicr = std::next(vicq); Point const& lP = (*vicp)->point(); Point const& lR = (*vicr)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h index 92aa449bfdea..4110a7718213 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h @@ -67,7 +67,7 @@ class Squared_distance_cost typedef typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; Vertices_in_constraint_iterator vicp = std::prev(vicq); - Vertices_in_constraint_iterator vicr = boost::next(vicq); + Vertices_in_constraint_iterator vicr = std::next(vicq); Point const& lP = (*vicp)->point(); Point const& lR = (*vicr)->point(); diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index e77c07e351e7..85404f86c2d1 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -154,7 +154,7 @@ class Polyline_simplification_2 (*it)->set_removable(false); ++it; for(; it != ite; ++it){ - if((boost::next(it) != ite) && (std::prev(it)== boost::next(it))){ + if((std::next(it) != ite) && (std::prev(it)== std::next(it))){ (*it)->set_removable(false); } } @@ -247,7 +247,7 @@ class Polyline_simplification_2 Vertex_handle vh = *it; Vertices_in_constraint_iterator u = std::prev(it); Vertex_handle uh = *u; - Vertices_in_constraint_iterator w = boost::next(it); + Vertices_in_constraint_iterator w = std::next(it); Vertex_handle wh = *w; typename Geom_traits::Orientation_2 orientation_2 = pct.geom_traits().orientation_2_object(); @@ -322,7 +322,7 @@ operator()() Vertices_in_constraint_iterator vit = vertex_to_iterator[v].front(); if(is_removable(vit)){ - Vertices_in_constraint_iterator u = std::prev(vit), w = boost::next(vit); + Vertices_in_constraint_iterator u = std::prev(vit), w = std::next(vit); pct.simplify(vit); if((*u)->is_removable()){ diff --git a/STL_Extension/test/STL_Extension/test_skiplist.cpp b/STL_Extension/test/STL_Extension/test_skiplist.cpp index 6405dff5d2f0..0e0cf9a9c204 100644 --- a/STL_Extension/test/STL_Extension/test_skiplist.cpp +++ b/STL_Extension/test/STL_Extension/test_skiplist.cpp @@ -60,10 +60,10 @@ BOOST_FIXTURE_TEST_CASE( test_insert, Fixture ) skips.begin(), skips.end()); // the same goes for inserting at an arbitrary position - skip::all_iterator pos = boost::next(l.all_begin(), 3); - l.insert(boost::next(l.all_begin(), 3) + skip::all_iterator pos = std::next(l.all_begin(), 3); + l.insert(std::next(l.all_begin(), 3) , 20); - all.insert(boost::next(all.begin(), 3) + all.insert(std::next(all.begin(), 3) , 20); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); @@ -79,8 +79,8 @@ BOOST_FIXTURE_TEST_CASE( test_single_skip, Fixture ) // skip somewhere in between and at the end // skip 2 and 7 - l.skip(boost::next(l.all_begin())); - BOOST_CHECK(l.is_skipped(boost::next(l.all_begin()))); + l.skip(std::next(l.all_begin())); + BOOST_CHECK(l.is_skipped(std::next(l.all_begin()))); skips.erase(std::remove(skips.begin(), skips.end(), 2), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); @@ -106,7 +106,7 @@ BOOST_FIXTURE_TEST_CASE( test_single_skip, Fixture ) BOOST_FIXTURE_TEST_CASE( test_range_skip, Fixture ) { // drop all from 2 up to 4 - l.skip(boost::next(l.all_begin()), boost::next(l.all_begin(), 3)); + l.skip(std::next(l.all_begin()), std::next(l.all_begin(), 3)); skips.erase(std::remove(skips.begin(), skips.end(), 2), skips.end()); skips.erase(std::remove(skips.begin(), skips.end(), 3), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), @@ -137,20 +137,20 @@ BOOST_AUTO_TEST_CASE( test_continous_insert ) BOOST_FIXTURE_TEST_CASE( test_unskip, Fixture ) { // skip 2 and 3 - l.skip(boost::next(l.all_begin()), boost::next(l.all_begin(), 3)); + l.skip(std::next(l.all_begin()), std::next(l.all_begin(), 3)); skips.erase(std::remove(skips.begin(), skips.end(), 2), skips.end()); skips.erase(std::remove(skips.begin(), skips.end(), 3), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); // unskip 2 - l.unskip(boost::next(l.skip_begin()), boost::next(l.all_begin())); - skips.insert(boost::next(skips.begin()), 2); + l.unskip(std::next(l.skip_begin()), std::next(l.all_begin())); + skips.insert(std::next(skips.begin()), 2); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); // unskip 3 - l.unskip(boost::next(l.skip_begin(), 2), boost::next(l.all_begin(), 2)); - skips.insert(boost::next(skips.begin(), 2), 3); + l.unskip(std::next(l.skip_begin(), 2), std::next(l.all_begin(), 2)); + skips.insert(std::next(skips.begin(), 2), 3); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); @@ -181,8 +181,8 @@ BOOST_FIXTURE_TEST_CASE( test_push, Fixture ) all.begin(), all.end()); // check how it works with skipped elements - l.skip(l.all_begin(), boost::next(l.all_begin(), 4)); - skips.erase(skips.begin(), boost::next(skips.begin(), 4)); + l.skip(l.all_begin(), std::next(l.all_begin(), 4)); + skips.erase(skips.begin(), std::next(skips.begin(), 4)); l.push_front(20); l.push_front(21); skips.insert(skips.begin(), 20); @@ -206,7 +206,7 @@ BOOST_FIXTURE_TEST_CASE( test_implicit_conversion, Fixture ) BOOST_FIXTURE_TEST_CASE( test_erase, Fixture ) { // erase 3 - l.erase(boost::next(l.all_begin(), 2)); + l.erase(std::next(l.all_begin(), 2)); skips.erase(std::remove(skips.begin(), skips.end(), 3), skips.end()); all.erase(std::remove(all.begin(), all.end(), 3), all.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), @@ -215,10 +215,10 @@ BOOST_FIXTURE_TEST_CASE( test_erase, Fixture ) all.begin(), all.end()); // skip 2 first and then erase it - l.skip(boost::next(l.all_begin())); + l.skip(std::next(l.all_begin())); skips.erase(std::remove(skips.begin(), skips.end(), 2), skips.end()); all.erase(std::remove(all.begin(), all.end(), 2), all.end()); - l.erase(boost::next(l.all_begin())); + l.erase(std::next(l.all_begin())); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); BOOST_CHECK_EQUAL_COLLECTIONS(l.all_begin(), l.all_end(), @@ -250,10 +250,10 @@ BOOST_AUTO_TEST_CASE( test_swap ) BOOST_AUTO_TEST_CASE( test_splice ) { Fixture a, b; - a.all.insert(boost::next(a.all.begin()), b.all.begin(), b.all.end()); - a.skips.insert(boost::next(a.skips.begin()), b.skips.begin(), b.skips.end()); + a.all.insert(std::next(a.all.begin()), b.all.begin(), b.all.end()); + a.skips.insert(std::next(a.skips.begin()), b.skips.begin(), b.skips.end()); - a.l.splice(boost::next(a.l.skip_begin()), b.l, b.l.skip_begin(), b.l.skip_end()); + a.l.splice(std::next(a.l.skip_begin()), b.l, b.l.skip_begin(), b.l.skip_end()); BOOST_CHECK_EQUAL_COLLECTIONS(a.l.all_begin(), a.l.all_end(), a.all.begin(), a.all.end()); diff --git a/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h b/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h index 4ef263f59163..58eae6b11ed3 100644 --- a/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h +++ b/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h @@ -124,7 +124,7 @@ class bounded_priority_queue void sort() { -std::sort(m_data.begin(), boost::next(m_data.begin(),m_count), m_comp); +std::sort(m_data.begin(), std::next(m_data.begin(),m_count), m_comp); } protected: diff --git a/TDS_2/include/CGAL/boost/graph/internal/graph_traits_2D_TDS_helper.h b/TDS_2/include/CGAL/boost/graph/internal/graph_traits_2D_TDS_helper.h index d710a027cf2b..9b5f303250d0 100644 --- a/TDS_2/include/CGAL/boost/graph/internal/graph_traits_2D_TDS_helper.h +++ b/TDS_2/include/CGAL/boost/graph/internal/graph_traits_2D_TDS_helper.h @@ -285,7 +285,7 @@ class TDS2_In_edge_circulator namespace std { -// workaround a bug detected on at least g++ 4.4 where boost::next(Iterator) +// workaround a bug detected on at least g++ 4.4 where std::next(Iterator) // is picked as a candidate for next(h,g) template struct iterator_traits< CGAL::internal::TDS2_halfedge_descriptor > diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h index f37ee350689a..c3cd6d187dec 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_plus_2.h @@ -754,7 +754,7 @@ Default::Get< Tr_, Constrained_Delaunay_triangulation_2< void simplify(Vertices_in_constraint_iterator v) { Vertices_in_constraint_iterator u = std::prev(v); - Vertices_in_constraint_iterator w = boost::next(v); + Vertices_in_constraint_iterator w = std::next(v); bool unew = (*u != *w); hierarchy.simplify(u,v,w); 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 8154e26251c9..2280ed0cf9eb 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 @@ -612,7 +612,7 @@ void Polyline_constraint_hierarchy_2::simplify(Vertex_it uc, // Remove the list item which points to v Vertex_list* vertex_list = it->id().vl_ptr(); Vertex_it vc_in_context = it->current(); - vc_in_context = boost::next(vc_in_context); + vc_in_context = std::next(vc_in_context); vertex_list->skip(vc_in_context.base()); ++it; } @@ -625,7 +625,7 @@ void Polyline_constraint_hierarchy_2::simplify(Vertex_it uc, // Remove the list item which points to v Vertex_list* vertex_list = it->id().vl_ptr(); Vertex_it vc_in_context = it->current(); - vc_in_context = boost::next(vc_in_context); + vc_in_context = std::next(vc_in_context); vertex_list->skip(vc_in_context.base()); ++it; } From 9ed6c7acdc71e358854b32df3e6bec68de9b422a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 19:51:54 +0200 Subject: [PATCH 0231/1398] remove useless include --- Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h | 1 - Convex_hull_3/include/CGAL/convex_hull_3.h | 1 - Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h | 2 -- Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h | 2 -- .../internal/Triangle_3_Triangle_3_intersection.h | 2 -- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 1 - .../CGAL/Spatial_searching/internal/bounded_priority_queue.h | 1 - 7 files changed, 10 deletions(-) diff --git a/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h b/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h index b901a497018c..586f82ddfe37 100644 --- a/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h +++ b/Alpha_shapes_3/include/CGAL/Fixed_alpha_shape_3.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index 5915ca243134..20d0809dd967 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -42,7 +42,6 @@ #include #include -#include #include #include #include diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h index 4490b2057f8a..26fb034df447 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h @@ -23,8 +23,6 @@ #include #include -#include - namespace CGAL { template < class R_ > diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h index 7885e2dd9587..c86e20f486dd 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h @@ -21,8 +21,6 @@ #include #include -#include - namespace CGAL { template < class R_ > diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 2f036bc98a07..b55ccf02acb2 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -21,8 +21,6 @@ #include -#include - #include #include #include diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 400699d0e667..758aa9931717 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -37,7 +37,6 @@ #include #include -#include // for std::prev and std::next #include #include diff --git a/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h b/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h index 58eae6b11ed3..bd3e9f0b8ff7 100644 --- a/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h +++ b/Spatial_searching/include/CGAL/Spatial_searching/internal/bounded_priority_queue.h @@ -22,7 +22,6 @@ #include #include #include -#include namespace CGAL { namespace internal{ From 8e29e704be6a5e4801d9aff4783a7d96ffac1863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 20:53:57 +0200 Subject: [PATCH 0232/1398] factorize constructor --- Property_map/include/CGAL/property_map.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Property_map/include/CGAL/property_map.h b/Property_map/include/CGAL/property_map.h index 0da2528a3da5..12fd06503fee 100644 --- a/Property_map/include/CGAL/property_map.h +++ b/Property_map/include/CGAL/property_map.h @@ -73,9 +73,7 @@ class OR_property_map { typedef typename PM1::reference reference; typedef boost::read_write_property_map_tag category; - OR_property_map() {} // required by boost::connected_components - - OR_property_map(PM1 pm1, PM2 pm2) + OR_property_map(PM1 pm1 = PM1(), PM2 pm2 = PM2()) : pm1(pm1),pm2(pm2) {} From 8740b244a26bd9f69caa60bf6a683240d178ad9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 20:55:55 +0200 Subject: [PATCH 0233/1398] boost::distance -> std::distance boost's version is working on std::pair but we decided to no longer consider iterator pairs as ranges --- BGL/include/CGAL/boost/graph/Dual.h | 2 +- BGL/test/BGL/test_Euler_operations.cpp | 20 +++++++++---------- .../Scene_polyhedron_selection_item.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Dual.h b/BGL/include/CGAL/boost/graph/Dual.h index 78cc2b6c6f79..1255e0b08d93 100644 --- a/BGL/include/CGAL/boost/graph/Dual.h +++ b/BGL/include/CGAL/boost/graph/Dual.h @@ -458,7 +458,7 @@ out_degree(typename boost::graph_traits >::vertex_descriptor v, const Dual

& dual) { const typename Dual

::Primal& primal = dual.primal(); - return boost::distance(halfedges_around_face(halfedge(v,primal),primal)); + return std::distance(halfedges_around_face(halfedge(v,primal),primal)); } template diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index 4c2ade85ea1c..36ac20e3f35d 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -270,8 +270,8 @@ join_vertex_interior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 3); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); assert(degree(f.x, f.m) == 4); assert(CGAL::is_valid_polygon_mesh(f.m)); } @@ -295,8 +295,8 @@ join_vertex_exterior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); assert(degree(f.y, f.m) == 3); assert(CGAL::is_valid_polygon_mesh(f.m)); } @@ -314,8 +314,8 @@ join_vertex_exterior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); - assert(boost::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); + assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); assert(CGAL::is_valid_polygon_mesh(f.m)); assert(degree(f.w, f.m) == 3); @@ -344,8 +344,8 @@ split_vertex() assert(CGAL::is_valid_polygon_mesh(f.m)); assert(CGAL::internal::exact_num_vertices(f.m) == 7); assert(CGAL::internal::exact_num_edges(f.m) == 8); - assert(boost::distance(CGAL::halfedges_around_face(h1, f.m)) == 5); - assert(boost::distance(CGAL::halfedges_around_face(h2, f.m)) == 7); + assert(std::distance(CGAL::halfedges_around_face(h1, f.m)) == 5); + assert(std::distance(CGAL::halfedges_around_face(h2, f.m)) == 7); } template @@ -371,8 +371,8 @@ split_join_vertex_inverse() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_edges(f.m) == 6); assert(CGAL::internal::exact_num_halfedges(f.m) == 12); - assert(boost::distance(CGAL::halfedges_around_face(h1, f.m)) == 3); - assert(boost::distance(CGAL::halfedges_around_face(h2, f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(h1, f.m)) == 3); + assert(std::distance(CGAL::halfedges_around_face(h2, f.m)) == 3); } diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 561f3f7c8fb7..0f32ae5b719e 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -1076,9 +1076,9 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::settempInstructions("Edge not selected: the incident facets must have a degree of at least 4.", "Select the edge with extremities you want to join."); @@ -1177,9 +1177,9 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::set Date: Sun, 23 Apr 2023 21:01:38 +0200 Subject: [PATCH 0234/1398] boost::is_empty -> std::is_empty --- STL_Extension/include/CGAL/transforming_iterator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STL_Extension/include/CGAL/transforming_iterator.h b/STL_Extension/include/CGAL/transforming_iterator.h index ed58473b0c50..97287711aec7 100644 --- a/STL_Extension/include/CGAL/transforming_iterator.h +++ b/STL_Extension/include/CGAL/transforming_iterator.h @@ -27,7 +27,7 @@ namespace CGAL { namespace internal { // non-empty case -template::value> struct Functor_as_base { +template::value> struct Functor_as_base { Functor_as_base(){} Functor_as_base(T const& t):f(t){} //template Functor_as_base(Functor_as_base const&g):f(g.functor()){} From 6fd9476cd79c85a322fe1ef8153ccd7d0d9864bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:15:38 +0200 Subject: [PATCH 0235/1398] boost::is_integral -> std::is_integral --- .../demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp | 6 +++--- STL_Extension/include/CGAL/transforming_iterator.h | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 68c3053d876b..67da801ae913 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -855,18 +855,18 @@ public Q_SLOTS: template void switchReaderConverter(std::pair minmax) { - switchReaderConverter(minmax, typename boost::is_integral::type()); + switchReaderConverter(minmax, typename std::is_integral::type()); } template - void switchReaderConverter(std::pair minmax, boost::true_type) + void switchReaderConverter(std::pair minmax, std::true_type) { // IntConverter IntConverter x = { minmax }; pxr_.setIC(x); } template - void switchReaderConverter(std::pair minmax, boost::false_type) + void switchReaderConverter(std::pair minmax, std::false_type) { // IntConverter DoubleConverter x = { minmax }; pxr_.setFC(x); diff --git a/STL_Extension/include/CGAL/transforming_iterator.h b/STL_Extension/include/CGAL/transforming_iterator.h index 97287711aec7..fe61368ddfbd 100644 --- a/STL_Extension/include/CGAL/transforming_iterator.h +++ b/STL_Extension/include/CGAL/transforming_iterator.h @@ -12,9 +12,7 @@ #ifndef CGAL_TRANSFORMING_ITERATOR_H #define CGAL_TRANSFORMING_ITERATOR_H #include -#include #include -#include #include #include #include @@ -60,7 +58,7 @@ class transforming_iterator_helper // Crappy heuristic. If we have *it that returns a Weighted_point and F that returns a reference to the Point contained in the Weighted_point it takes as argument, we do NOT want the transformed iterator to return a reference to the temporary *it. On the other hand, if *it returns an int n, and F returns a reference to array[n] it is not so good to lose the reference. This probably should be done elsewhere and should at least be made optional... typedef typename boost::mpl::if_< boost::mpl::or_, - boost::is_integral >, + std::is_integral >, reference_, value_type>::type reference; public: From d4d2225801f18b73bab4439a7964ed7badfb30ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:18:32 +0200 Subject: [PATCH 0236/1398] boost::is_reference -> std::is_reference --- BGL/include/CGAL/boost/graph/properties.h | 2 +- STL_Extension/include/CGAL/transforming_iterator.h | 3 +-- Spatial_searching/include/CGAL/Search_traits_adapter.h | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/properties.h b/BGL/include/CGAL/boost/graph/properties.h index fbe1f2e45139..80b02a191a14 100644 --- a/BGL/include/CGAL/boost/graph/properties.h +++ b/BGL/include/CGAL/boost/graph/properties.h @@ -140,7 +140,7 @@ struct Point_accessor typedef ValueType value_type; typedef Handle key_type; - typedef typename boost::mpl::if_< boost::is_reference, + typedef typename boost::mpl::if_< std::is_reference, ValueType&, ValueType >::type Reference; diff --git a/STL_Extension/include/CGAL/transforming_iterator.h b/STL_Extension/include/CGAL/transforming_iterator.h index fe61368ddfbd..3067207e643e 100644 --- a/STL_Extension/include/CGAL/transforming_iterator.h +++ b/STL_Extension/include/CGAL/transforming_iterator.h @@ -12,7 +12,6 @@ #ifndef CGAL_TRANSFORMING_ITERATOR_H #define CGAL_TRANSFORMING_ITERATOR_H #include -#include #include #include #include @@ -57,7 +56,7 @@ class transforming_iterator_helper // Crappy heuristic. If we have *it that returns a Weighted_point and F that returns a reference to the Point contained in the Weighted_point it takes as argument, we do NOT want the transformed iterator to return a reference to the temporary *it. On the other hand, if *it returns an int n, and F returns a reference to array[n] it is not so good to lose the reference. This probably should be done elsewhere and should at least be made optional... typedef typename boost::mpl::if_< - boost::mpl::or_, + boost::mpl::or_, std::is_integral >, reference_, value_type>::type reference; diff --git a/Spatial_searching/include/CGAL/Search_traits_adapter.h b/Spatial_searching/include/CGAL/Search_traits_adapter.h index f93fc340b7a2..ff640dc639a4 100644 --- a/Spatial_searching/include/CGAL/Search_traits_adapter.h +++ b/Spatial_searching/include/CGAL/Search_traits_adapter.h @@ -225,13 +225,13 @@ class Search_traits_adapter : public Base_traits{ // Select type of iterator + construct class depending on whether // point map is lvalue or not typedef typename boost::mpl::if_< - boost::is_reference::reference>, + std::is_reference::reference>, typename Base::Cartesian_const_iterator_d, No_lvalue_iterator>::type Cartesian_const_iterator_d; typedef typename boost::mpl::if_< - boost::is_reference::reference>, + std::is_reference::reference>, Construct_cartesian_const_iterator_d_lvalue, Construct_cartesian_const_iterator_d_no_lvalue>::type Construct_cartesian_const_iterator_d; From a1b2dd014db61aa8b67fd0ec8e645171ad85e9e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:20:00 +0200 Subject: [PATCH 0237/1398] boost::is_pointer -> std::is_pointer --- STL_Extension/include/CGAL/type_traits/is_iterator.h | 3 +-- Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/STL_Extension/include/CGAL/type_traits/is_iterator.h b/STL_Extension/include/CGAL/type_traits/is_iterator.h index 837c91e0330c..ddc34f9d4dfd 100644 --- a/STL_Extension/include/CGAL/type_traits/is_iterator.h +++ b/STL_Extension/include/CGAL/type_traits/is_iterator.h @@ -18,7 +18,6 @@ #define CGAL_TYPE_TRAITS_IS_ITERATOR_H #include -#include #include #include @@ -44,7 +43,7 @@ struct is_iterator_ has_difference_type, has_pointer, has_reference >, - boost::is_pointer > + std::is_pointer > { }; template ::value> diff --git a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h index add923b15e22..3709e0a0e15b 100644 --- a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h +++ b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h @@ -26,8 +26,6 @@ #include #include -#include - #include #include #include @@ -107,7 +105,7 @@ class Search_traits_kd_tree_2 { template class Multiple_kd_tree { - CGAL_static_assertion_msg((boost::is_pointer::value), "SAVED_OBJECT is not a pointer."); + CGAL_static_assertion_msg((std::is_pointer::value), "SAVED_OBJECT is not a pointer."); private: typedef Traits_ Traits; typedef typename Traits::FT NT; From a04035879d5811b21c703f9691a3fdd69d704145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:22:20 +0200 Subject: [PATCH 0238/1398] boost::is_const -> std::is_const --- BGL/include/CGAL/boost/graph/property_maps.h | 1 - Mesh_3/benchmark/Mesh_3/StdAfx.h | 1 - .../internal/Corefinement/face_graph_utils.h | 1 - Polyhedron/demo/Polyhedron/SMesh_type.h | 2 +- .../include/CGAL/boost/graph/properties_Surface_mesh.h | 2 +- .../boost/graph/properties_Surface_mesh_features.h | 10 +++++----- .../boost/graph/properties_Surface_mesh_time_stamp.h | 2 +- 7 files changed, 8 insertions(+), 11 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/property_maps.h b/BGL/include/CGAL/boost/graph/property_maps.h index 772966bdacdb..aab29d9b8811 100644 --- a/BGL/include/CGAL/boost/graph/property_maps.h +++ b/BGL/include/CGAL/boost/graph/property_maps.h @@ -15,7 +15,6 @@ #include #include -#include #include namespace CGAL{ diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index d99e062fcbe0..4505ee29f7f1 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -137,7 +137,6 @@ #include #include #include -#include #include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h index d05e9ff97b1e..7d9a37385f8a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h @@ -18,7 +18,6 @@ #include #include -#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/SMesh_type.h b/Polyhedron/demo/Polyhedron/SMesh_type.h index f79a819cb9a6..fad279a89931 100644 --- a/Polyhedron/demo/Polyhedron/SMesh_type.h +++ b/Polyhedron/demo/Polyhedron/SMesh_type.h @@ -51,7 +51,7 @@ struct Get_pmap_of_surface_mesh_ { #define CGAL_PROPERTY_SURFACE_MESH_RETURN_TYPE(Tag) \ typename boost::lazy_disable_if< \ - boost::is_const

, \ + std::is_const

, \ Get_pmap_of_surface_mesh_ \ >::type diff --git a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h index b05395d26427..281c2b37093e 100644 --- a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h +++ b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh.h @@ -238,7 +238,7 @@ template typename boost::lazy_disable_if < - boost::is_const, + std::is_const, internal::Get_vertex_point_map_for_Surface_mesh_return_type >::type get(CGAL::vertex_point_t, const CGAL::Surface_mesh& g) { diff --git a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_features.h b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_features.h index b3881cb789e9..b6fbb66f9681 100644 --- a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_features.h +++ b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_features.h @@ -79,7 +79,7 @@ namespace CGAL { template typename boost::lazy_disable_if< - boost::is_const

, + std::is_const

, Get_pmap_of_surface_mesh > >::type inline get(CGAL::face_patch_id_t, Surface_mesh

& smesh) @@ -91,7 +91,7 @@ inline get(CGAL::face_patch_id_t, Surface_mesh

& smesh) template typename boost::lazy_disable_if< - boost::is_const

, + std::is_const

, Get_pmap_of_surface_mesh > >::type inline get(CGAL::face_patch_id_t, const Surface_mesh

& smesh) @@ -103,7 +103,7 @@ inline get(CGAL::face_patch_id_t, const Surface_mesh

& smesh) #define CGAL_PROPERTY_SURFACE_MESH_RETURN_TYPE(Tag) \ typename boost::lazy_disable_if< \ - boost::is_const

, \ + std::is_const

, \ Get_pmap_of_surface_mesh \ >::type @@ -153,7 +153,7 @@ inline get(CGAL::vertex_feature_degree_t, const Surface_mesh

& smesh) template typename boost::lazy_disable_if< - boost::is_const

, + std::is_const

, Get_pmap_of_surface_mesh > >::type inline get(CGAL::vertex_incident_patches_t, Surface_mesh

& smesh) @@ -164,7 +164,7 @@ typename boost::lazy_disable_if< template typename boost::lazy_disable_if< - boost::is_const

, + std::is_const

, Get_pmap_of_surface_mesh > >::type inline get(CGAL::vertex_incident_patches_t, const Surface_mesh

& smesh) diff --git a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_time_stamp.h b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_time_stamp.h index 23f4f074bf30..d1df35ed90f9 100644 --- a/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_time_stamp.h +++ b/Surface_mesh/include/CGAL/boost/graph/properties_Surface_mesh_time_stamp.h @@ -59,7 +59,7 @@ namespace CGAL { #define CGAL_PROPERTY_SURFACE_MESH_RETURN_TYPE(Tag) \ typename boost::lazy_disable_if< \ - boost::is_const

, \ + std::is_const

, \ Get_pmap_of_surface_mesh \ >::type From 5726a0a255314d658420a982031c7477db6ec3f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:24:43 +0200 Subject: [PATCH 0239/1398] boost::is_floating_point -> std::is_floating_point boost::is_float --- .../include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h | 2 +- .../include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h | 2 +- .../CGAL/Convex_hull_3/dual/halfspace_intersection_3.h | 3 +-- Convex_hull_3/include/CGAL/Convex_hull_traits_3.h | 2 +- Convex_hull_3/include/CGAL/convex_hull_3.h | 3 +-- .../include/CGAL/Optimal_transportation_reconstruction_2.h | 3 +-- .../internal/Corefinement/intersection_nodes.h | 3 +-- .../CGAL/Surface_mesh_segmentation/internal/AABB_traits.h | 4 ++-- 8 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h index cc734b7f4b63..84263d358f69 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h @@ -448,7 +448,7 @@ struct Alpha_nt_selector_2 GeomTraits, // If the base traits is already exact then we don't need to do anything, // and we can simply directly use the traits class - Boolean_tag::value && + Boolean_tag::value && ExactAlphaComparisonTag::value >, Weighted_tag> { }; diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h index cd8536243789..14ff435b3e0d 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h @@ -417,7 +417,7 @@ struct Alpha_nt_selector_3 GeomTraits, // If the base traits is already exact then we don't need to do anything, // and we can simply directly use the traits class - Boolean_tag::value && + Boolean_tag::value && ExactAlphaComparisonTag::value >, Weighted_tag> { }; diff --git a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h index 16a685e08ddf..87062e5c29dd 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h @@ -30,7 +30,6 @@ #include #include -#include #include namespace CGAL @@ -261,7 +260,7 @@ namespace CGAL // The check is done only if the number type is not float or double because in that // case we know the construction of dual points is not exact CGAL_assertion_msg( - boost::is_floating_point::value || + std::is_floating_point::value || Convex_hull_3::internal::point_inside_convex_polyhedron(P, *origin), "halfspace_intersection_3: origin not in the polyhedron" ); diff --git a/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h b/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h index 4cf555e37b35..e57dc65772e8 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_traits_3.h @@ -151,7 +151,7 @@ struct GT3_for_CH3 { template ::type::value && + std::is_floating_point::type::value && R_::Has_filtered_predicates_tag::value > > class Convex_hull_traits_3 diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index 20d0809dd967..70c2f5ea0972 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -42,7 +42,6 @@ #include #include -#include #include #include @@ -148,7 +147,7 @@ namespace internal { //struct to select the default traits class for computing convex hull template< class Point_3, class PolygonMesh = Default, - class Is_floating_point=typename boost::is_floating_point::Kernel::FT>::type, + class Is_floating_point=typename std::is_floating_point::Kernel::FT>::type, class Has_filtered_predicates_tag=typename Kernel_traits::Kernel::Has_filtered_predicates_tag > struct Default_traits_for_Chull_3{ typedef typename Kernel_traits::Kernel type; diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h index d18407434122..ba6ebd878120 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h @@ -34,7 +34,6 @@ #include #include #include -#include namespace CGAL { @@ -1196,7 +1195,7 @@ class Optimal_transportation_reconstruction_2 void relocate_on_the_double_grid(Point& p) const { relocate_on_the_double_grid(p, - typename boost::is_float::type()); + typename std::is_floating_point::type()); } Point compute_relocation(Vertex_handle vertex) const { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h index 64933af6b3b8..42629a5b6797 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h @@ -17,7 +17,6 @@ #include -#include #include namespace CGAL { @@ -31,7 +30,7 @@ template ::value_type >::Kernel::FT diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traits.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traits.h index c6528a2b4030..ae2a6de7ae0f 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traits.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traits.h @@ -47,7 +47,7 @@ class AABB_traits_SDF : // activate functions below if K::FT is floating point and fast_bbox_intersection = true template std::enable_if_t< - boost::is_floating_point::value && fast_bbox_intersection, + std::is_floating_point::value && fast_bbox_intersection, bool > operator()(const CGAL::Segment_3& segment, const Bounding_box& bbox) const { const Point_3& p = segment.source(); @@ -65,7 +65,7 @@ class AABB_traits_SDF : template std::enable_if_t< - boost::is_floating_point::value && fast_bbox_intersection, + std::is_floating_point::value && fast_bbox_intersection, bool > operator()(const CGAL::Ray_3& ray, const Bounding_box& bbox) const { const Point_3& p = ray.source(); From 32340e64010fd45767c019b8c36b1edef07bda66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 21:29:36 +0200 Subject: [PATCH 0240/1398] boost::is_arithmetic -> std::is_arithmetic --- NewKernel_d/include/CGAL/NewKernel_d/utils.h | 2 +- Number_types/include/CGAL/Lazy_exact_nt.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/NewKernel_d/include/CGAL/NewKernel_d/utils.h b/NewKernel_d/include/CGAL/NewKernel_d/utils.h index fb661f5397e2..adc632e50c67 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/utils.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/utils.h @@ -88,7 +88,7 @@ struct Has_type_different_from } }; - template struct has_cheap_constructor : boost::is_arithmetic{}; + template struct has_cheap_constructor : std::is_arithmetic{}; template struct has_cheap_constructor > { enum { value=true }; }; diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index 38c55c62d325..6890fc174208 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -18,7 +18,6 @@ #include // for Root_of functor #include -#include #include #include @@ -383,7 +382,7 @@ public : // Also check that ET and AT are constructible from T? template Lazy_exact_nt (T i, std::enable_if_t, std::is_enum >, + boost::mpl::or_, std::is_enum >, boost::mpl::not_ > >::value,void*> = 0) : Base(new Lazy_exact_Cst(i)) {} From b039040f732ff7769f3349f14cb75474d2ea1c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 22:00:21 +0200 Subject: [PATCH 0241/1398] boost::is_convertible -> std::is_convertible --- .../AABB_halfedge_graph_segment_primitive.h | 1 - .../CGAL/Test/_test_algebraic_structure.h | 2 +- .../include/CGAL/Arr_overlay_2.h | 8 ++++---- .../include/CGAL/box_intersection_d.h | 4 ++-- Circulator/include/CGAL/circulator.h | 16 +++++++--------- .../include/CGAL/Homogeneous/PointH2.h | 5 ++--- .../include/CGAL/Homogeneous/PointH3.h | 6 +++--- .../include/CGAL/Homogeneous/VectorH2.h | 4 ++-- .../include/CGAL/Homogeneous/VectorH3.h | 6 +++--- .../CGAL/regular_neighbor_coordinates_2.h | 4 +--- .../Kernel_23/include/CGAL/_test_cls_point_2.h | 6 ++---- .../Kernel_23/include/CGAL/_test_cls_point_3.h | 4 ++-- Mesh_3/benchmark/Mesh_3/StdAfx.h | 1 - Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 17 ++++++++--------- .../CGAL/Mesh_3/Mesh_global_optimizer.h | 12 +++++------- Mesh_3/include/CGAL/Mesh_3/Mesher_3.h | 7 +++---- Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h | 5 ++--- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 5 ++--- .../CGAL/Mesh_3/Refine_facets_manifold_base.h | 18 +++++++++--------- Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h | 3 +-- Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h | 5 ++--- Mesh_3/include/CGAL/Mesh_cell_base_3.h | 2 -- Mesh_3/include/CGAL/refine_mesh_3.h | 4 ++-- .../Mesh_3/test_meshing_implicit_function.cpp | 2 +- ...st_meshing_implicit_function_deprecated.cpp | 2 +- Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp | 2 +- Mesh_3/test/Mesh_3/test_meshing_utilities.h | 2 +- .../CGAL/Periodic_2_Delaunay_triangulation_2.h | 8 ++++---- .../CGAL/Poisson_reconstruction_function.h | 3 +-- .../CGAL/Polygon_mesh_processing/distance.h | 12 ++++++------ .../orient_polygon_soup_extension.h | 4 ++-- .../include/run_with_qprogressdialog.h | 2 +- STL_Extension/include/CGAL/for_each.h | 4 ++-- STL_Extension/include/CGAL/is_convertible.h | 3 +-- .../include/CGAL/transforming_iterator.h | 4 ++-- .../include/CGAL/transforming_pair_iterator.h | 14 +++++--------- .../include/CGAL/type_traits/is_iterator.h | 5 ++--- .../Weighted_PCA_smoother.h | 4 ++-- Spatial_searching/include/CGAL/Kd_tree.h | 2 +- .../include/CGAL/Hilbert_sort_median_2.h | 4 +--- .../include/CGAL/Hilbert_sort_median_3.h | 4 +--- Stream_support/include/CGAL/IO/helpers.h | 2 +- .../Constrained_Delaunay_triangulation_2.h | 8 ++++---- .../include/CGAL/Delaunay_triangulation_2.h | 8 ++++---- .../include/CGAL/Regular_triangulation_2.h | 8 ++++---- Triangulation_2/include/CGAL/Triangulation_2.h | 8 ++++---- .../include/CGAL/Delaunay_triangulation_3.h | 8 ++++---- .../include/CGAL/Regular_triangulation_3.h | 8 ++++---- Triangulation_3/include/CGAL/Triangulation_3.h | 8 ++++---- .../include/CGAL/Triangulation_hierarchy_3.h | 8 ++++---- 50 files changed, 131 insertions(+), 161 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index 9a6730264095..fe85c35d3662 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 5a5e23c7d8fc..f598b1fe7fec 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -819,7 +819,7 @@ void test_algebraic_structure(){ CGAL_static_assertion( ( ::std::is_same< typename AST::Is_exact, Is_exact >::value)); - CGAL_static_assertion(( ::boost::is_convertible< Tag, + CGAL_static_assertion(( ::std::is_convertible< Tag, Integral_domain_without_division_tag >::value )); CGAL_static_assertion(( ::std::is_same< Tag, Algebraic_category>::value)); CGAL_static_assertion((!::std::is_same< Simplify, Null_functor>::value)); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 83358c14b12d..8dc8cdf6fce0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -172,14 +172,14 @@ overlay(const Arrangement_on_surface_2& arr1 typedef typename Agt2::Point_2 A_point; typedef typename Bgt2::Point_2 B_point; typedef typename Rgt2::Point_2 Res_point; - CGAL_static_assertion((boost::is_convertible::value)); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); typedef typename Agt2::X_monotone_curve_2 A_xcv; typedef typename Bgt2::X_monotone_curve_2 B_xcv; typedef typename Rgt2::X_monotone_curve_2 Res_xcv; - CGAL_static_assertion((boost::is_convertible::value)); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); typedef Arr_traits_basic_adaptor_2 Gt_adaptor_2; typedef Arr_overlay_traits_2 diff --git a/Box_intersection_d/include/CGAL/box_intersection_d.h b/Box_intersection_d/include/CGAL/box_intersection_d.h index 94752c414623..a37ae5a98c72 100644 --- a/Box_intersection_d/include/CGAL/box_intersection_d.h +++ b/Box_intersection_d/include/CGAL/box_intersection_d.h @@ -63,10 +63,10 @@ void box_intersection_segment_tree_d( const NT sup = Box_intersection_d::box_limits::sup(); #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else // CGAL_LINKED_WITH_TBB - if(boost::is_convertible::value) + if(std::is_convertible::value) { // Here is an illustration for n=2. // diff --git a/Circulator/include/CGAL/circulator.h b/Circulator/include/CGAL/circulator.h index 2b1556218f04..8b4f1d09b04f 100644 --- a/Circulator/include/CGAL/circulator.h +++ b/Circulator/include/CGAL/circulator.h @@ -27,8 +27,6 @@ #include #include -#include - // These are name redefinitions for backwards compatibility // with the pre iterator-traits style adaptors. @@ -193,45 +191,45 @@ template inline void Assert_circulator( const C &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_iterator( const I &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_input_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_output_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_forward_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_bidirectional_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } template inline void Assert_random_access_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); } // The assert at-least-category functions use the following // functions to resolve properly. Note the proper order of the diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/PointH2.h b/Homogeneous_kernel/include/CGAL/Homogeneous/PointH2.h index 1c7340d4e606..afb6bff830e9 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/PointH2.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/PointH2.h @@ -18,7 +18,6 @@ #define CGAL_HOMOGENEOUS_POINT_2_H #include -#include #include #include @@ -54,8 +53,8 @@ class PointH2 template < typename Tx, typename Ty > PointH2(const Tx & x, const Ty & y, - std::enable_if_t< boost::mpl::and_, - boost::is_convertible >::value >* = 0) + std::enable_if_t< boost::mpl::and_, + std::is_convertible >::value >* = 0) : base(x, y) {} PointH2(const FT& x, const FT& y) diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/PointH3.h b/Homogeneous_kernel/include/CGAL/Homogeneous/PointH3.h index 8f6cb17a535d..87da02cabff1 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/PointH3.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/PointH3.h @@ -52,9 +52,9 @@ class PointH3 template < typename Tx, typename Ty, typename Tz > PointH3(const Tx & x, const Ty & y, const Tz & z, - std::enable_if_t< boost::mpl::and_< boost::mpl::and_< boost::is_convertible, - boost::is_convertible >, - boost::is_convertible >::value >* = 0) + std::enable_if_t< boost::mpl::and_< boost::mpl::and_< std::is_convertible, + std::is_convertible >, + std::is_convertible >::value >* = 0) : base(x, y, z) {} PointH3(const FT& x, const FT& y, const FT& z) diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h index 26fb034df447..81cd31075952 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH2.h @@ -57,8 +57,8 @@ class VectorH2 template < typename Tx, typename Ty > VectorH2(const Tx & x, const Ty & y, - std::enable_if_t< boost::mpl::and_, - boost::is_convertible >::value >* = 0) + std::enable_if_t< boost::mpl::and_, + std::is_convertible >::value >* = 0) : base(CGAL::make_array(x, y, RT(1))) {} VectorH2(const FT& x, const FT& y) diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h index c86e20f486dd..5228d5251ade 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/VectorH3.h @@ -67,9 +67,9 @@ class VectorH3 template < typename Tx, typename Ty, typename Tz > VectorH3(const Tx & x, const Ty & y, const Tz & z, - std::enable_if_t< boost::mpl::and_< boost::mpl::and_< boost::is_convertible, - boost::is_convertible >, - boost::is_convertible >::value >* = 0) + std::enable_if_t< boost::mpl::and_< boost::mpl::and_< std::is_convertible, + std::is_convertible >, + std::is_convertible >::value >* = 0) : base(CGAL::make_array(x, y, z, RT(1))) {} VectorH3(const FT& x, const FT& y, const FT& z) diff --git a/Interpolation/include/CGAL/regular_neighbor_coordinates_2.h b/Interpolation/include/CGAL/regular_neighbor_coordinates_2.h index 0e18ed8baaf3..2464a1229046 100644 --- a/Interpolation/include/CGAL/regular_neighbor_coordinates_2.h +++ b/Interpolation/include/CGAL/regular_neighbor_coordinates_2.h @@ -22,8 +22,6 @@ #include #include -#include - #include #include #include @@ -343,7 +341,7 @@ regular_neighbor_coordinates_2(const Rt& rt, OutputIterator out, OutputFunctor fct, std::enable_if_t< - !boost::is_convertible::value >* = 0) { diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h index 6ea80be2a414..4473d4c55e32 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h @@ -26,8 +26,6 @@ #include #include -#include - #include #include @@ -60,9 +58,9 @@ _test_cls_point_2(const R& ) CGAL::Weighted_point_2 wp(p1); CGAL::Point_2 p7(wp); - CGAL_static_assertion(!(boost::is_convertible, + CGAL_static_assertion(!(std::is_convertible, CGAL::Point_2 >::value)); - CGAL_static_assertion(!(boost::is_convertible, + CGAL_static_assertion(!(std::is_convertible, CGAL::Weighted_point_2 >::value)); std::cout << '.'; diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h index b09c11e47a70..29471b3c10d0 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h @@ -58,9 +58,9 @@ _test_cls_point_3(const R& ) CGAL::Weighted_point_3 wp(p1); CGAL::Point_3 p7(wp); - CGAL_static_assertion(!(boost::is_convertible, + CGAL_static_assertion(!(std::is_convertible, CGAL::Point_3 >::value)); - CGAL_static_assertion(!(boost::is_convertible, + CGAL_static_assertion(!(std::is_convertible, CGAL::Weighted_point_3 >::value)); std::cout << '.'; diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index 4505ee29f7f1..e1b24ae23fa9 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -137,7 +137,6 @@ #include #include #include -#include #include #include #include diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 8e86644477bc..106b4776edaf 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -41,7 +41,6 @@ #include #include #include -#include #include #ifdef CGAL_LINKED_WITH_TBB @@ -1938,7 +1937,7 @@ class C3T3_helpers { # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tbb::parallel_for_each( outdated_cells.begin(), outdated_cells.end(), @@ -1966,7 +1965,7 @@ class C3T3_helpers { # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tbb::parallel_for ( @@ -2704,7 +2703,7 @@ rebuild_restricted_delaunay(OutdatedCells& outdated_cells, # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { std::vector outdated_cells_vector; outdated_cells_vector.reserve(outdated_cells.size()); @@ -2828,7 +2827,7 @@ rebuild_restricted_delaunay(ForwardIterator first_cell, // Note: ~58% of rebuild_restricted_delaunay time #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tbb::parallel_for_each(first_cell, last_cell, Update_cell(c3t3_, updater)); @@ -2850,7 +2849,7 @@ rebuild_restricted_delaunay(ForwardIterator first_cell, #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tbb::parallel_for_each( facets.begin(), facets.end(), @@ -2962,7 +2961,7 @@ move_point(const Vertex_handle& old_vertex, # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tr_.incident_cells_threadsafe(old_vertex, std::back_inserter(incident_cells_)); } @@ -3438,7 +3437,7 @@ get_least_square_surface_plane(const Vertex_handle& v, Facet_vector facets; # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tr_.finite_incident_facets_threadsafe(v, std::back_inserter(facets)); } @@ -3861,7 +3860,7 @@ get_conflict_zone_topo_change(const Vertex_handle& v, # ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tr_.incident_cells_threadsafe(v, removal_conflict_cells); } diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h index 7b83d8b05bcf..019cb18589c8 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h @@ -44,8 +44,6 @@ #include #include -#include - #ifdef CGAL_LINKED_WITH_TBB # include # include @@ -802,7 +800,7 @@ compute_moves(Moving_vertices_set& moving_vertices) #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tbb::concurrent_vector vertices_not_moving_any_more; @@ -888,7 +886,7 @@ compute_move(const Vertex_handle& v) incident_cells.reserve(64); #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tr_.incident_cells_threadsafe(v, std::back_inserter(incident_cells)); } @@ -947,7 +945,7 @@ update_mesh(const Moves_vector& moves, #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { // Apply moves in triangulation tbb::parallel_for(tbb::blocked_range(0, moves.size()), @@ -1040,7 +1038,7 @@ fill_sizing_field() #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { typedef tbb::enumerable_thread_specific< std::vector< std::pair > > Local_list; @@ -1111,7 +1109,7 @@ average_circumradius_length(const Vertex_handle& v) const incident_cells.reserve(64); #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { tr_.incident_cells_threadsafe(v, std::back_inserter(incident_cells)); } diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h b/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h index 185efe6229cf..94220c276e66 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h @@ -63,7 +63,6 @@ #endif #include -#include #include #include @@ -653,7 +652,7 @@ initialize() defined(CGAL_SEQUENTIAL_MESH_3_ADD_OUTSIDE_POINTS_ON_A_FAR_SPHERE) #ifndef CGAL_SEQUENTIAL_MESH_3_ADD_OUTSIDE_POINTS_ON_A_FAR_SPHERE - if(boost::is_convertible::value) + if(std::is_convertible::value) #endif // If that macro is defined, then estimated_bbox must be initialized { Base::set_bbox(r_oracle_.bbox()); @@ -666,7 +665,7 @@ initialize() #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { // we're not multi-thread, yet r_c3t3_.triangulation().set_lock_data_structure(0); @@ -861,7 +860,7 @@ Mesher_3:: status() const { #ifdef CGAL_LINKED_WITH_TBB - if(boost::is_convertible::value) { + if(std::is_convertible::value) { return Mesher_status( # if CGAL_CONCURRENT_COMPACT_CONTAINER_APPROXIMATE_SIZE approximate_number_of_vertices(Concurrency_tag()), diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h index 4ee48c865ea2..98d4f9572264 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -175,7 +174,7 @@ template::value, + std::is_convertible::value, // Parallel # ifdef CGAL_MESH_3_USE_LAZY_UNSORTED_REFINEMENT_QUEUE @@ -662,7 +661,7 @@ scan_triangulation_impl() #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { # if defined(CGAL_MESH_3_VERBOSE) || defined(CGAL_MESH_3_PROFILING) std::cerr << "Scanning triangulation for bad cells (in parallel)"; diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index ded63f9b139a..72fc441c2d79 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -48,7 +48,6 @@ #include #include #include -#include #include #include @@ -642,7 +641,7 @@ template::value, + std::is_convertible::value, // Parallel # ifdef CGAL_MESH_3_USE_LAZY_UNSORTED_REFINEMENT_QUEUE Meshes::Filtered_deque_container @@ -983,7 +982,7 @@ scan_triangulation_impl() #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { # if defined(CGAL_MESH_3_VERBOSE) || defined(CGAL_MESH_3_PROFILING) std::cerr << "Scanning triangulation for bad facets (in parallel) - " diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h index 17b04cc4239d..c46dad7a808f 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h @@ -251,7 +251,7 @@ class Refine_facets_manifold_base { #ifdef CGAL_LINKED_WITH_TBB // Sequential only - if (!boost::is_convertible::value) + if (!std::is_convertible::value) #endif // CGAL_LINKED_WITH_TBB { //Sequential @@ -280,7 +280,7 @@ class Refine_facets_manifold_base #ifdef CGAL_LINKED_WITH_TBB // Sequential only - if (!boost::is_convertible::value) + if (!std::is_convertible::value) #endif // CGAL_LINKED_WITH_TBB { if(m_bad_vertices_initialized) { @@ -359,7 +359,7 @@ class Refine_facets_manifold_base { #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->insert_bad_facet(biggest_incident_facet_in_complex(*eit), typename Base::Quality()); @@ -402,7 +402,7 @@ class Refine_facets_manifold_base #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->insert_bad_facet(biggest_incident_facet_in_complex(vit), typename Base::Quality()); @@ -471,7 +471,7 @@ class Refine_facets_manifold_base Facet get_next_element_impl() { #ifdef CGAL_LINKED_WITH_TBB - if (boost::is_convertible::value) + if (std::is_convertible::value) return Base::get_next_element_impl(); else #endif @@ -570,7 +570,7 @@ class Refine_facets_manifold_base { #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->insert_bad_facet(biggest_incident_facet_in_complex(edge), typename Base::Quality()); @@ -585,7 +585,7 @@ class Refine_facets_manifold_base else { #ifdef CGAL_LINKED_WITH_TBB // Sequential only - if (!boost::is_convertible::value) + if (!std::is_convertible::value) #endif // CGAL_LINKED_WITH_TBB { m_bad_edges.left.erase( edge_to_edgevv(edge) ); // @TODO: pourquoi?! @@ -622,7 +622,7 @@ class Refine_facets_manifold_base #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->insert_bad_facet(biggest_incident_facet_in_complex(*vit), typename Base::Quality()); @@ -645,7 +645,7 @@ class Refine_facets_manifold_base #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->insert_bad_facet(biggest_incident_facet_in_complex(v), typename Base::Quality()); diff --git a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h index 87a0416f7b32..9554a14cc0e1 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h +++ b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h @@ -59,7 +59,6 @@ #include #include #include -#include #include @@ -928,7 +927,7 @@ perturb(const FT& sliver_bound, PQueue& pqueue, Visitor& visitor) const #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->create_task_group(); diff --git a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h index e8c2c214e48d..3f471ca14a92 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h +++ b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h @@ -39,7 +39,6 @@ #include #include #include -#include #include #include // std::setprecision @@ -623,7 +622,7 @@ class Slivers_exuder { #if defined( CGAL_LINKED_WITH_TBB ) && ( !defined (BOOST_MSVC) || !defined( _DEBUG ) || !defined (CGAL_TEST_SUITE) ) // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) enqueue_task( ch, this->erase_counter(ch), criterion_value); // Sequential @@ -920,7 +919,7 @@ pump_vertices(FT sliver_criterion_limit, #if defined( CGAL_LINKED_WITH_TBB ) && ( !defined (BOOST_MSVC) || !defined( _DEBUG ) || !defined (CGAL_TEST_SUITE) ) // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->create_task_group(); diff --git a/Mesh_3/include/CGAL/Mesh_cell_base_3.h b/Mesh_3/include/CGAL/Mesh_cell_base_3.h index 787124c3ec75..b52243fbbc2d 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_base_3.h @@ -30,8 +30,6 @@ #include #include -#include - #ifdef CGAL_LINKED_WITH_TBB # include #endif diff --git a/Mesh_3/include/CGAL/refine_mesh_3.h b/Mesh_3/include/CGAL/refine_mesh_3.h index 3f11e81ce8a2..b4823d073f48 100644 --- a/Mesh_3/include/CGAL/refine_mesh_3.h +++ b/Mesh_3/include/CGAL/refine_mesh_3.h @@ -77,14 +77,14 @@ class Insert_vertex_in_c3t3 #if defined(CGAL_LINKED_WITH_TBB)\ && !defined(CGAL_PARALLEL_MESH_3_DO_NOT_ADD_OUTSIDE_POINTS_ON_A_FAR_SPHERE) - if (boost::is_convertible::value) + if (std::is_convertible::value) { if (dimension == -1) r_c3t3_.add_far_point(new_vertex); } #endif #ifdef CGAL_SEQUENTIAL_MESH_3_ADD_OUTSIDE_POINTS_ON_A_FAR_SPHERE - if (boost::is_convertible::value) + if (std::is_convertible::value) { if (dimension == -1) r_c3t3_.add_far_point(new_vertex); diff --git a/Mesh_3/test/Mesh_3/test_meshing_implicit_function.cpp b/Mesh_3/test/Mesh_3/test_meshing_implicit_function.cpp index 58eab9a75008..c9a88cecf460 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_implicit_function.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_implicit_function.cpp @@ -75,7 +75,7 @@ struct Implicit_tester : public Tester #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->verify(c3t3, domain, criteria, Bissection_tag(), 40, 65, 60, 110); } diff --git a/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp index 6a7a8aa0b57e..7877b7558d5c 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp @@ -73,7 +73,7 @@ struct Implicit_tester : public Tester #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->verify(c3t3, domain, criteria, Bissection_tag(), 40, 65, 60, 110); } diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp index 9a0c5677168f..c5a30ccb1ec7 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp @@ -90,7 +90,7 @@ struct Polyhedron_tester : public Tester this->verify_c3t3_volume(c3t3, vol*0.95, vol*1.05); #ifdef CGAL_LINKED_WITH_TBB // Parallel - if (boost::is_convertible::value) + if (std::is_convertible::value) { this->verify(c3t3, domain, criteria, Polyhedral_tag(), 110, 140, 190, 235, 300, 450); diff --git a/Mesh_3/test/Mesh_3/test_meshing_utilities.h b/Mesh_3/test/Mesh_3/test_meshing_utilities.h index a16c177a9376..cafe2bfcab8d 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_utilities.h +++ b/Mesh_3/test/Mesh_3/test_meshing_utilities.h @@ -399,7 +399,7 @@ struct Tester // Parallel typedef typename C3t3::Concurrency_tag Concurrency_tag; - if (boost::is_convertible::value) + if (std::is_convertible::value) assert(hdist <= reference_value*4.); else #endif //CGAL_LINKED_WITH_TBB diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_Delaunay_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_Delaunay_triangulation_2.h index b737a7a6edcd..1232e426aed9 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_Delaunay_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_Delaunay_triangulation_2.h @@ -208,7 +208,7 @@ class Periodic_2_Delaunay_triangulation_2 insert(InputIterator first, InputIterator last, bool is_large_point_set = true, std::enable_if_t < - boost::is_convertible < + std::is_convertible < typename std::iterator_traits::value_type, Point >::value >* = nullptr) @@ -420,7 +420,7 @@ class Periodic_2_Delaunay_triangulation_2 InputIterator last, bool is_large_point_set = true, std::enable_if_t < - boost::is_convertible < + std::is_convertible < typename std::iterator_traits::value_type, std::pair::type> >::value >* = nullptr @@ -436,8 +436,8 @@ class Periodic_2_Delaunay_triangulation_2 bool is_large_point_set = true, std::enable_if_t < boost::mpl::and_ < - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* = nullptr) { return insert_with_info< boost::tuple::type> >(first, last, is_large_point_set); diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index 300a84fdaced..9c2c5885fece 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -45,7 +45,6 @@ #include #include -#include #include /*! @@ -380,7 +379,7 @@ class Poisson_reconstruction_function InputIterator beyond, ///< past-the-end iterator over the input points. NormalPMap normal_pmap, ///< property map: `value_type of InputIterator` -> `Vector` (the *oriented* normal of an input point). std::enable_if_t< - boost::is_convertible::value_type, Point>::value + std::is_convertible::value_type, Point>::value >* = 0 ) : m_tr(new Triangulation), m_bary(new std::vector) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 4237fa85b6f8..d8a5f68c083b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -155,10 +155,10 @@ double max_distance_to_mesh_impl(const PointRange& sample_points, using FT = typename Kernel::FT; #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else - if(boost::is_convertible::value) + if(std::is_convertible::value) { Distance_computation f(tree, hint, sample_points); tbb::parallel_reduce(tbb::blocked_range(0, sample_points.size()), f); @@ -1995,7 +1995,7 @@ bounded_error_squared_one_sided_Hausdorff_distance_impl(const TriangleMesh1& tm1 OutputIterator& out) { #if !defined(CGAL_LINKED_WITH_TBB) || !defined(CGAL_METIS_ENABLED) - CGAL_static_assertion_msg(!(boost::is_convertible::value), + CGAL_static_assertion_msg(!(std::is_convertible::value), "Parallel_tag is enabled but at least TBB or METIS is unavailable."); #endif @@ -2053,7 +2053,7 @@ bounded_error_squared_one_sided_Hausdorff_distance_impl(const TriangleMesh1& tm1 std::cout << "* num cores: " << nb_cores << std::endl; #endif - if(boost::is_convertible::value && + if(std::is_convertible::value && nb_cores > 1 && faces(tm1).size() >= min_nb_faces_to_split) { @@ -2207,7 +2207,7 @@ bounded_error_squared_one_sided_Hausdorff_distance_impl(const TriangleMesh1& tm1 #endif #if defined(CGAL_LINKED_WITH_TBB) && defined(CGAL_METIS_ENABLED) && defined(USE_PARALLEL_BEHD) - if(boost::is_convertible::value && + if(std::is_convertible::value && nb_cores > 1 && faces(tm1).size() >= min_nb_faces_to_split) { @@ -2270,7 +2270,7 @@ bounded_error_squared_symmetric_Hausdorff_distance_impl(const TriangleMesh1& tm1 OutputIterator2& out2) { #if !defined(CGAL_LINKED_WITH_TBB) || !defined(CGAL_METIS_ENABLED) - CGAL_static_assertion_msg(!(boost::is_convertible::value), + CGAL_static_assertion_msg(!(std::is_convertible::value), "Parallel_tag is enabled but at least TBB or METIS is unavailable."); #endif diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h index 612620049a0e..1fa539d9bc72 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h @@ -352,10 +352,10 @@ void orient_triangle_soup_with_reference_triangle_mesh(const TriangleMesh& tm_re }; #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else - if (boost::is_convertible::value) + if (std::is_convertible::value) tbb::parallel_for(std::size_t(0), triangles.size(), std::size_t(1), process_facet); else #endif diff --git a/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h b/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h index f2657fda3f1d..9671bb46277e 100644 --- a/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h +++ b/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h @@ -111,7 +111,7 @@ void run_with_qprogressdialog (Functor& functor, signal_callback->signaler.get(), SLOT(cancel())); #ifdef CGAL_HAS_STD_THREADS - if (boost::is_convertible::value) + if (std::is_convertible::value) { std::thread thread (functor); diff --git a/STL_Extension/include/CGAL/for_each.h b/STL_Extension/include/CGAL/for_each.h index f68bba0e80b9..8f05752cbf2f 100644 --- a/STL_Extension/include/CGAL/for_each.h +++ b/STL_Extension/include/CGAL/for_each.h @@ -102,7 +102,7 @@ void for_each (const Range& range, ::reference)>& functor) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif @@ -118,7 +118,7 @@ void for_each (Range& range, ::reference)>& functor) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif diff --git a/STL_Extension/include/CGAL/is_convertible.h b/STL_Extension/include/CGAL/is_convertible.h index 8b9a6a36c93c..1daa86cb63b3 100644 --- a/STL_Extension/include/CGAL/is_convertible.h +++ b/STL_Extension/include/CGAL/is_convertible.h @@ -18,7 +18,6 @@ #define CGAL_IS_CONVERTIBLE_H #include -#include #ifdef CGAL_USE_GMPXX #include #endif @@ -26,7 +25,7 @@ namespace CGAL { templatestruct is_implicit_convertible - : boost::is_convertible {}; + : std::is_convertible {}; #ifdef CGAL_USE_GMPXX // Work around a gmpxx misfeature diff --git a/STL_Extension/include/CGAL/transforming_iterator.h b/STL_Extension/include/CGAL/transforming_iterator.h index 3067207e643e..bd94ad33c4fd 100644 --- a/STL_Extension/include/CGAL/transforming_iterator.h +++ b/STL_Extension/include/CGAL/transforming_iterator.h @@ -90,8 +90,8 @@ private internal::Functor_as_base template transforming_iterator( transforming_iterator const&i, - std::enable_if_t::value>* = 0, - std::enable_if_t::value>* = 0) + std::enable_if_t::value>* = 0, + std::enable_if_t::value>* = 0) : Base(i.base()),Functor_base(i.functor()) {} }; diff --git a/STL_Extension/include/CGAL/transforming_pair_iterator.h b/STL_Extension/include/CGAL/transforming_pair_iterator.h index 22e1bc610800..d048850c156c 100644 --- a/STL_Extension/include/CGAL/transforming_pair_iterator.h +++ b/STL_Extension/include/CGAL/transforming_pair_iterator.h @@ -16,16 +16,12 @@ #include #include -#include - - - namespace CGAL { namespace internal { -template ::value> +template ::value> struct Min_category { - CGAL_static_assertion((boost::is_convertible::value)); + CGAL_static_assertion((std::is_convertible::value)); typedef Cat1 type; }; @@ -97,9 +93,9 @@ private internal::Functor_as_base template transforming_pair_iterator( transforming_pair_iterator const&i, - std::enable_if_t::value>* = 0, - std::enable_if_t::value>* = 0, - std::enable_if_t::value>* = 0) + std::enable_if_t::value>* = 0, + std::enable_if_t::value>* = 0, + std::enable_if_t::value>* = 0) : Functor_base(i.functor()),iter1(i.iter1),iter2(i.iter2) {} }; diff --git a/STL_Extension/include/CGAL/type_traits/is_iterator.h b/STL_Extension/include/CGAL/type_traits/is_iterator.h index ddc34f9d4dfd..6e1e3c2ea052 100644 --- a/STL_Extension/include/CGAL/type_traits/is_iterator.h +++ b/STL_Extension/include/CGAL/type_traits/is_iterator.h @@ -17,7 +17,6 @@ #ifndef CGAL_TYPE_TRAITS_IS_ITERATOR_H #define CGAL_TYPE_TRAITS_IS_ITERATOR_H -#include #include #include @@ -54,7 +53,7 @@ struct is_iterator_type_ template struct is_iterator_type_ : public //boost::is_base_of::iterator_category> - boost::is_convertible::iterator_category, U> + std::is_convertible::iterator_category, U> { }; } // namespace internal @@ -84,7 +83,7 @@ struct is_iterator_to template struct is_iterator_to - : public boost::is_convertible::value_type, U> + : public std::is_convertible::value_type, U> { }; template diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h index bc4ba9ec616a..cecf6f62d44d 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h @@ -198,10 +198,10 @@ class Weighted_PCA_smoother void try_parallel (const F& func, std::size_t begin, std::size_t end) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else - if (boost::is_convertible::value) + if (std::is_convertible::value) tbb::parallel_for(tbb::blocked_range(begin, end), func); else #endif diff --git a/Spatial_searching/include/CGAL/Kd_tree.h b/Spatial_searching/include/CGAL/Kd_tree.h index b0958bc44ee4..c3e107bc31fa 100644 --- a/Spatial_searching/include/CGAL/Kd_tree.h +++ b/Spatial_searching/include/CGAL/Kd_tree.h @@ -335,7 +335,7 @@ class Kd_tree { } #ifndef CGAL_TBB_STRUCTURE_IN_KD_TREE - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h index 722ccc3acbce..aaff07b8693c 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h @@ -17,8 +17,6 @@ #include #include -#include - #ifdef CGAL_LINKED_WITH_TBB #include #endif @@ -157,7 +155,7 @@ class Hilbert_sort_median_2 #ifndef CGAL_LINKED_WITH_TBB CGAL_USE(begin); CGAL_USE(end); - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else const int y = (x + 1) % 2; diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h index ebf71afed5a1..d318d436921a 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h @@ -18,8 +18,6 @@ #include #include -#include - #ifdef CGAL_LINKED_WITH_TBB #include #endif @@ -180,7 +178,7 @@ class CGAL_VISIBILITY_MACRO Hilbert_sort_median_3 #ifndef CGAL_LINKED_WITH_TBB CGAL_USE(begin); CGAL_USE(end); - CGAL_static_assertion_msg (!(boost::is_convertible::value), + CGAL_static_assertion_msg (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else const int y = (x + 1) % 3, z = (x + 2) % 3; diff --git a/Stream_support/include/CGAL/IO/helpers.h b/Stream_support/include/CGAL/IO/helpers.h index 36cd5e2a89ce..39828dcabe21 100644 --- a/Stream_support/include/CGAL/IO/helpers.h +++ b/Stream_support/include/CGAL/IO/helpers.h @@ -80,7 +80,7 @@ struct is_Range : public boost::mpl::and_< boost::has_range_const_iterator, // should be a range boost::mpl::not_ >, // but not a Point_set_3 - boost::mpl::not_ > > // or a std::string / char [x] + boost::mpl::not_ > > // or a std::string / char [x] { }; template diff --git a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h index 3c5ee85b9232..a96be0e6d76d 100644 --- a/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_Delaunay_triangulation_2.h @@ -316,7 +316,7 @@ class Constrained_Delaunay_triangulation_2 std::ptrdiff_t insert( InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename internal::Get_iterator_value_type< InputIterator >::type, Point >::value @@ -398,7 +398,7 @@ class Constrained_Delaunay_triangulation_2 insert( InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename internal::Get_iterator_value_type< InputIterator >::type, std::pair::type> >::value @@ -414,8 +414,8 @@ class Constrained_Delaunay_triangulation_2 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =nullptr ) diff --git a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h index fa001fd490ef..34a282b91626 100644 --- a/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Delaunay_triangulation_2.h @@ -301,7 +301,7 @@ class Delaunay_triangulation_2 std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Point >::value @@ -372,7 +372,7 @@ class Delaunay_triangulation_2 insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> >::value >* = nullptr) @@ -386,8 +386,8 @@ class Delaunay_triangulation_2 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* = nullptr) { diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index 145b387263fe..f7e4a653060b 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -395,7 +395,7 @@ class Regular_triangulation_2 std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Weighted_point >::value @@ -516,7 +516,7 @@ class Regular_triangulation_2 insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> >::value @@ -530,8 +530,8 @@ class Regular_triangulation_2 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - typename boost::is_convertible< typename std::iterator_traits::value_type, Weighted_point >, - typename boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + typename std::is_convertible< typename std::iterator_traits::value_type, Weighted_point >, + typename std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =nullptr ) diff --git a/Triangulation_2/include/CGAL/Triangulation_2.h b/Triangulation_2/include/CGAL/Triangulation_2.h index 6b1de4b4f19d..c79aa0128d2b 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_2.h @@ -632,7 +632,7 @@ class Triangulation_2 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Point >::value @@ -697,7 +697,7 @@ std::ptrdiff_t insert(InputIterator first, InputIterator last, insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> >::value >* = NULL) @@ -711,8 +711,8 @@ std::ptrdiff_t insert(InputIterator first, InputIterator last, boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* = NULL) { diff --git a/Triangulation_3/include/CGAL/Delaunay_triangulation_3.h b/Triangulation_3/include/CGAL/Delaunay_triangulation_3.h index 0099a3044301..8b22fddd3493 100644 --- a/Triangulation_3/include/CGAL/Delaunay_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Delaunay_triangulation_3.h @@ -334,7 +334,7 @@ class Delaunay_triangulation_3 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Point >::value @@ -480,7 +480,7 @@ class Delaunay_triangulation_3 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> @@ -495,8 +495,8 @@ class Delaunay_triangulation_3 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =nullptr) { diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_3.h index 482cb41c1764..18e448bda7a4 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_3.h @@ -337,7 +337,7 @@ class Regular_triangulation_3 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Weighted_point>::value >* = nullptr) #else @@ -576,7 +576,7 @@ class Regular_triangulation_3 std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> >::value @@ -595,8 +595,8 @@ class Regular_triangulation_3 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - typename boost::is_convertible< typename std::iterator_traits::value_type, Weighted_point >, - typename boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + typename std::is_convertible< typename std::iterator_traits::value_type, Weighted_point >, + typename std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =nullptr) { return insert_with_info< diff --git a/Triangulation_3/include/CGAL/Triangulation_3.h b/Triangulation_3/include/CGAL/Triangulation_3.h index cbad6e031830..7b8ef9ab6c8a 100644 --- a/Triangulation_3/include/CGAL/Triangulation_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_3.h @@ -1146,7 +1146,7 @@ class Triangulation_3 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Point >::value @@ -1209,7 +1209,7 @@ class Triangulation_3 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> @@ -1224,8 +1224,8 @@ class Triangulation_3 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =NULL) { diff --git a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h index 8553a34a1b3a..021e40e2ffef 100644 --- a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h @@ -180,7 +180,7 @@ class Triangulation_hierarchy_3 std::ptrdiff_t insert( InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, Point >::value @@ -317,7 +317,7 @@ class Triangulation_hierarchy_3 insert( InputIterator first, InputIterator last, std::enable_if_t< - boost::is_convertible< + std::is_convertible< typename std::iterator_traits::value_type, std::pair::type> >::value >* =nullptr @@ -332,8 +332,8 @@ class Triangulation_hierarchy_3 boost::zip_iterator< boost::tuple > last, std::enable_if_t< boost::mpl::and_< - boost::is_convertible< typename std::iterator_traits::value_type, Point >, - boost::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > + std::is_convertible< typename std::iterator_traits::value_type, Point >, + std::is_convertible< typename std::iterator_traits::value_type, typename internal::Info_check::type > >::value >* =nullptr ) From cf45dd3d5bfa1ca4a85c32aee2c2fc1e3f64e840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 22:03:59 +0200 Subject: [PATCH 0242/1398] boost::is_base_of -> std::is_base_of --- .../include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h | 3 +-- .../include/CGAL/Hyperbolic_Delaunay_triangulation_2.h | 2 +- Mesh_3/include/CGAL/Mesh_criteria_3.h | 6 +++--- STL_Extension/include/CGAL/type_traits/is_iterator.h | 2 +- .../test/STL_Extension/test_Compact_container.cpp | 10 ++++------ 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index b8bd5995a6f9..757a71e20750 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -23,7 +23,6 @@ #include #include -#include #include #include @@ -73,7 +72,7 @@ template struct Is_derived_from_Handle_with_policy { typedef typename - boost::is_base_of< CGAL::Handle_with_policy + std::is_base_of< CGAL::Handle_with_policy < typename Comparable::T, typename Comparable::Handle_policy, typename Comparable::Allocator >, diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h index 2629ec1aff78..538991692ba3 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h @@ -431,7 +431,7 @@ class Hyperbolic_Delaunay_triangulation_2 template < class InputIterator > std::ptrdiff_t insert(InputIterator first, InputIterator last, std::enable_if_t< - boost::is_base_of::value_type>::value + std::is_base_of::value_type>::value >* = nullptr) #else template < class InputIterator > diff --git a/Mesh_3/include/CGAL/Mesh_criteria_3.h b/Mesh_3/include/CGAL/Mesh_criteria_3.h index c7dcfeb33ab6..458ab35ee872 100644 --- a/Mesh_3/include/CGAL/Mesh_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_criteria_3.h @@ -28,7 +28,7 @@ #include #include #include // for the macro DBL_MAX -#include + namespace CGAL { @@ -98,7 +98,7 @@ class Mesh_criteria_3_impl template void add_facet_criterion(Facet_criterion* criterion) { - CGAL_static_assertion((boost::is_base_of< + CGAL_static_assertion((std::is_base_of< typename Facet_criteria::Abstract_criterion, Facet_criterion >::value)); @@ -107,7 +107,7 @@ class Mesh_criteria_3_impl template void add_cell_criterion(Cell_criterion* criterion) { - CGAL_static_assertion((boost::is_base_of< + CGAL_static_assertion((std::is_base_of< typename Cell_criteria::Abstract_criterion, Cell_criterion >::value)); diff --git a/STL_Extension/include/CGAL/type_traits/is_iterator.h b/STL_Extension/include/CGAL/type_traits/is_iterator.h index 6e1e3c2ea052..e48f3ef8bf1f 100644 --- a/STL_Extension/include/CGAL/type_traits/is_iterator.h +++ b/STL_Extension/include/CGAL/type_traits/is_iterator.h @@ -52,7 +52,7 @@ struct is_iterator_type_ template struct is_iterator_type_ - : public //boost::is_base_of::iterator_category> + : public //std::is_base_of::iterator_category> std::is_convertible::iterator_category, U> { }; diff --git a/STL_Extension/test/STL_Extension/test_Compact_container.cpp b/STL_Extension/test/STL_Extension/test_Compact_container.cpp index d2d96cdfc4b3..360073381126 100644 --- a/STL_Extension/test/STL_Extension/test_Compact_container.cpp +++ b/STL_Extension/test/STL_Extension/test_Compact_container.cpp @@ -12,8 +12,6 @@ #include #include -#include - #include template @@ -324,22 +322,22 @@ int main() test_time_stamps(); // Check the time stamper policies - if(! boost::is_base_of, + if(! std::is_base_of, C1::Time_stamper>::value) { std::cerr << "Error timestamper of C1\n"; return 1; } - if(! boost::is_base_of, + if(! std::is_base_of, C2::Time_stamper>::value) { std::cerr << "Error timestamper of C2\n"; return 1; } - if(! boost::is_base_of, + if(! std::is_base_of, C3::Time_stamper>::value) { std::cerr << "Error timestamper of C3\n"; return 1; } - if(! boost::is_base_of, + if(! std::is_base_of, C4::Time_stamper>::value) { std::cerr << "Error timestamper of C4\n"; return 1; From 633ec7329c3beb5cdf32e16fc03146540f31cc88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 22:09:06 +0200 Subject: [PATCH 0243/1398] fonctor -> functor --- Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt | 2 +- Generalized_map/doc/Generalized_map/Generalized_map.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 2e36037ea231..a8f20cf4d062 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -498,7 +498,7 @@ Step 2 defines the onsplit and onmerge dynamic functors. We can see here that wi The next operations will call these functors when 2-cells are split or merged. The \link CombinatorialMap::sew `sew<3>`\endlink operation calls 1 onmerge as two faces are identified; the \link GenericMap::insert_cell_0_in_cell_2 `insert_cell_0_in_cell_2`\endlink operation calls 3 onsplit as one face is split in 4. -Lastly we remove the dynamic onmerge functor (step 7). This is done by initializing the fonctor to a default boost::function. After this initialization, no dynamic merge functor is called when two faces are merged. +Lastly we remove the dynamic onmerge functor (step 7). This is done by initializing the functor to a default boost::function. After this initialization, no dynamic merge functor is called when two faces are merged. \cgalExample{Combinatorial_map/map_3_dynamic_onmerge.cpp} diff --git a/Generalized_map/doc/Generalized_map/Generalized_map.txt b/Generalized_map/doc/Generalized_map/Generalized_map.txt index 491a8c9ed3d3..9ea562fd56f1 100644 --- a/Generalized_map/doc/Generalized_map/Generalized_map.txt +++ b/Generalized_map/doc/Generalized_map/Generalized_map.txt @@ -520,7 +520,7 @@ Step 2 defines the onsplit and onmerge dynamic functors. We can see here that wi The next operations will call these functors when 2-cells are split or merged. The \link GeneralizedMap::sew `sew<3>`\endlink operation calls 1 onmerge as two faces are identified; the \link GenericMap::insert_cell_0_in_cell_2 `insert_cell_0_in_cell_2`\endlink operation calls 3 onsplit as one face is split in 4. -Lastly we remove the dynamic onmerge functor (step 7). This is done by initializing the fonctor to a default boost::function. After this initialization, no dynamic merge functor is called when two faces are merged. +Lastly we remove the dynamic onmerge functor (step 7). This is done by initializing the functor to a default boost::function. After this initialization, no dynamic merge functor is called when two faces are merged. \cgalExample{Generalized_map/gmap_3_dynamic_onmerge.cpp} From ea62c316aeae88a2e142dab2ed405cc875b3b28e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 22:35:45 +0200 Subject: [PATCH 0244/1398] boost::lambda -> c++11 lambda --- AABB_tree/include/CGAL/AABB_tree.h | 5 ++--- Mesh_2/include/CGAL/Mesh_2/Mesh_global_optimizer_2.h | 6 +----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index 0016d4ecc097..3f49779b6acf 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -27,7 +27,6 @@ #include #include #include -#include #ifdef CGAL_HAS_THREADS #include @@ -326,7 +325,7 @@ namespace CGAL { boost::optional< typename Intersection_and_primitive_id::Type > first_intersection(const Ray& query) const { - return first_intersection(query, boost::lambda::constant(false)); + return first_intersection(query, [](Primitive_id){ return false; }); } /// \endcond @@ -351,7 +350,7 @@ namespace CGAL { boost::optional first_intersected_primitive(const Ray& query) const { - return first_intersected_primitive(query, boost::lambda::constant(false)); + return first_intersected_primitive(query, [](Primitive_id){ return false; }); } /// \endcond ///@} diff --git a/Mesh_2/include/CGAL/Mesh_2/Mesh_global_optimizer_2.h b/Mesh_2/include/CGAL/Mesh_2/Mesh_global_optimizer_2.h index 4c6dacd7802f..6c380f054f2d 100644 --- a/Mesh_2/include/CGAL/Mesh_2/Mesh_global_optimizer_2.h +++ b/Mesh_2/include/CGAL/Mesh_2/Mesh_global_optimizer_2.h @@ -33,8 +33,6 @@ #include #include -#include -#include #include #include @@ -329,7 +327,7 @@ class Mesh_global_optimizer_2 typename FT_list::iterator pos = std::find_if( big_moves_.begin(), big_moves_.end(), - boost::lambda::_1 < new_sq_move ); + [&](const FT& v) { return v< new_sq_move; } ); big_moves_.insert(pos, new_sq_move); } @@ -343,8 +341,6 @@ class Mesh_global_optimizer_2 bool check_convergence() const { - namespace bl = boost::lambda; - FT sum(0); for(typename FT_list::const_iterator it = big_moves_.begin(); it != big_moves_.end(); From 2f7d15053108b54884fbc7f9a4c7d06d368ae2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 22:44:33 +0200 Subject: [PATCH 0245/1398] boost::begin/end/empty/size -> std::begin/end/empty/size --- .../CGAL/boost/graph/Face_filtered_graph.h | 4 +-- BGL/include/CGAL/boost/graph/helpers.h | 20 +++++------ BGL/test/BGL/test_Euler_operations.cpp | 4 +-- BGL/test/BGL/test_Properties.cpp | 6 ++-- Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 10 +++--- .../CGAL/Mesh_3/polylines_to_protect.h | 2 +- .../CGAL/Polygon_mesh_processing/clip.h | 4 +-- .../CGAL/Polygon_mesh_processing/distance.h | 4 +-- .../Hole_filling/Triangulate_hole_polyline.h | 4 +-- .../Isotropic_remeshing/remesh_impl.h | 8 ++--- .../internal/fair_impl.h | 4 +-- .../internal/refine_impl.h | 4 +-- .../Polygon_mesh_processing/intersection.h | 36 +++++++++---------- .../merge_border_vertices.h | 2 +- .../polygon_soup_to_polygon_mesh.h | 7 ++-- .../CGAL/Polygon_mesh_processing/remesh.h | 2 +- .../Rigid_triangle_mesh_collision_detection.h | 4 +-- .../test_pmp_collision_detection.cpp | 2 +- .../Surface_mesh/Offset_meshing_plugin.cpp | 4 +-- .../demo/Polyhedron/Scene_c3t3_item.cpp | 2 +- .../examples/Surface_mesh/sm_iterators.cpp | 4 +-- .../test/Surface_mesh/sm_circulator_test.cpp | 8 ++--- 22 files changed, 71 insertions(+), 74 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index e1e9f6f0a6ff..e6f4136481d9 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -486,8 +486,8 @@ struct Face_filtered_graph selected_halfedges.reset(); typedef typename boost::property_traits::value_type Patch_index; - std::unordered_set pids(boost::begin(selected_face_patch_indices), - boost::end(selected_face_patch_indices)); + std::unordered_set pids(std::begin(selected_face_patch_indices), + std::end(selected_face_patch_indices)); for(face_descriptor fd : faces(_graph) ) { diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index 21644ebf18f4..fb585f04acc0 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -848,12 +848,12 @@ inline std::enable_if_t::value, void> clear_impl(FaceGraph& g) { - while(boost::begin(edges(g))!=boost::end(edges(g))) - remove_edge(*boost::begin(edges(g)), g); - while(boost::begin(faces(g))!=boost::end(faces(g))) - remove_face(*boost::begin(faces(g)), g); - while(boost::begin(vertices(g))!=boost::end(vertices(g))) - remove_vertex(*boost::begin(vertices(g)), g); + while(std::begin(edges(g))!=std::end(edges(g))) + remove_edge(*std::begin(edges(g)), g); + while(std::begin(faces(g))!=std::end(faces(g))) + remove_face(*std::begin(faces(g)), g); + while(std::begin(vertices(g))!=std::end(vertices(g))) + remove_vertex(*std::begin(vertices(g)), g); } template @@ -975,9 +975,9 @@ template void clear(FaceGraph& g) { internal::clear_impl(g); - CGAL_postcondition(std::distance(boost::begin(edges(g)),boost::end(edges(g))) == 0); - CGAL_postcondition(std::distance(boost::begin(vertices(g)),boost::end(vertices(g))) == 0); - CGAL_postcondition(std::distance(boost::begin(faces(g)),boost::end(faces(g))) == 0); + CGAL_postcondition(std::distance(std::begin(edges(g)),std::end(edges(g))) == 0); + CGAL_postcondition(std::distance(std::begin(vertices(g)),std::end(vertices(g))) == 0); + CGAL_postcondition(std::distance(std::begin(faces(g)),std::end(faces(g))) == 0); } /** @@ -993,7 +993,7 @@ void clear(FaceGraph& g) template bool is_empty(const FaceGraph& g) { - return boost::empty(vertices(g)); + return std::empty(vertices(g)); } /// \ingroup PkgBGLHelperFct diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index 36ac20e3f35d..a72d33306476 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -476,8 +476,8 @@ test_swap_edges() { Graph g; CGAL::make_tetrahedron(pt,pt,pt,pt,g); - halfedge_descriptor h1 = *std::next(boost::begin(halfedges(g)), i); - halfedge_descriptor h2 = *std::next(boost::begin(halfedges(g)), j); + halfedge_descriptor h1 = *std::next(std::begin(halfedges(g)), i); + halfedge_descriptor h2 = *std::next(std::begin(halfedges(g)), j); CGAL::internal::swap_edges(h1, h2, g); assert(CGAL::is_valid_polygon_mesh(g)); } diff --git a/BGL/test/BGL/test_Properties.cpp b/BGL/test/BGL/test_Properties.cpp index ca63a2f78032..d932eb36d267 100644 --- a/BGL/test/BGL/test_Properties.cpp +++ b/BGL/test/BGL/test_Properties.cpp @@ -68,9 +68,9 @@ void test_uniqueness(const Graph&, #endif typename boost::range_iterator::type - begin = boost::begin(range), - begin2 = boost::begin(range), - end = boost::end(range); + begin = std::begin(range), + begin2 = std::begin(range), + end = std::end(range); typedef std::unordered_set id_map; typedef std::pair resultp; diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 106b4776edaf..7298969e1149 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -36,8 +36,6 @@ #include #endif -#include -#include #include #include #include @@ -2135,8 +2133,8 @@ class C3T3_helpers template void reset_sliver_cache(CellRange& cell_range) const { - reset_sliver_cache(boost::begin(cell_range), - boost::end(cell_range)); + reset_sliver_cache(std::begin(cell_range), + std::end(cell_range)); } template @@ -2152,8 +2150,8 @@ class C3T3_helpers template void reset_circumcenter_cache(CellRange& cell_range) const { - reset_circumcenter_cache(boost::begin(cell_range), - boost::end(cell_range)); + reset_circumcenter_cache(std::begin(cell_range), + std::end(cell_range)); } template 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 756bf520604d..7979860f68f2 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -1177,7 +1177,7 @@ merge_and_snap_polylines(const CGAL::Image_3& image, // snap graph to existing_polylines snap_graph_vertices(graph, image.vx(), image.vy(), image.vz(), - boost::begin(existing_polylines), boost::end(existing_polylines), + std::begin(existing_polylines), std::end(existing_polylines), K()); // rebuild polylines_to_snap diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h index ee92e8e36405..d40ae7396915 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h @@ -721,7 +721,7 @@ bool clip(TriangleMesh& tm, using params::get_parameter; using params::choose_parameter; - if(boost::begin(faces(tm))==boost::end(faces(tm))) return true; + if(std::begin(faces(tm))==std::end(faces(tm))) return true; CGAL::Bbox_3 bbox = ::CGAL::Polygon_mesh_processing::bbox(tm); @@ -831,7 +831,7 @@ bool clip(TriangleMesh& tm, using params::get_parameter; using params::choose_parameter; - if(boost::begin(faces(tm))==boost::end(faces(tm))) return true; + if(std::begin(faces(tm))==std::end(faces(tm))) return true; TriangleMesh clipper; make_hexahedron(iso_cuboid[0], iso_cuboid[1], iso_cuboid[2], iso_cuboid[3], diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index d8a5f68c083b..180d40f892fd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -481,8 +481,8 @@ struct Triangle_structure_sampler_for_triangle_mesh void sample_points() { Property_map_to_unary_function unary(pmap); - this->out = std::copy(boost::make_transform_iterator(boost::begin(vertices(tm)), unary), - boost::make_transform_iterator(boost::end(vertices(tm)), unary), + this->out = std::copy(boost::make_transform_iterator(std::begin(vertices(tm)), unary), + boost::make_transform_iterator(std::end(vertices(tm)), unary), this->out); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h index 5e84ba9e6947..a969e7a189c3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h @@ -1555,8 +1555,8 @@ triangulate_hole_polyline(const PointRange1& points, #endif typedef CGAL::internal::Triangulate_hole_polyline Fill; - std::vector P(boost::begin(points), boost::end(points)); - std::vector Q(boost::begin(third_points), boost::end(third_points)); + std::vector P(std::begin(points), std::end(points)); + std::vector Q(std::begin(third_points), std::end(third_points)); if(P.front() != P.back()){ P.push_back(P.front()); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 9cdb76ac76b0..72ef49c39968 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -156,15 +156,15 @@ namespace internal { template bool same_range(const Range& r1, const Range& r2) { - return boost::begin(r1)==boost::begin(r2) && - boost::end(r1)==boost::end(r2); + return std::begin(r1)==std::begin(r2) && + std::end(r1)==std::end(r2); } template bool same_range(const Range1& r1, const Range2& r2) { - return std::distance(boost::begin(r1), boost::end(r1)) == - std::distance(boost::begin(r2), boost::end(r2)); + return std::distance(std::begin(r1), std::end(r1)) == + std::distance(std::begin(r2), std::end(r2)); } public: diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/fair_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/fair_impl.h index dac9b2d57fca..3de4f3fe12fb 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/fair_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/fair_impl.h @@ -122,8 +122,8 @@ class Fair_Polyhedron_3 { return false; } - std::set interior_vertices(boost::begin(vertices), - boost::end(vertices)); + std::set interior_vertices(std::begin(vertices), + std::end(vertices)); if(interior_vertices.empty()) { return true; } #ifdef CGAL_PMP_FAIR_DEBUG diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h index 06ddc868f0d4..9ad6c177ec0a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h @@ -305,7 +305,7 @@ class Refine_Polyhedron_3 { double alpha) { // do not use just std::set, the order effects the output (for the same input we want to get same output) - std::set interior_map(boost::begin(faces), boost::end(faces)); + std::set interior_map(std::begin(faces), std::end(faces)); // store boundary edges - to be used in relax std::set border_edges; @@ -324,7 +324,7 @@ class Refine_Polyhedron_3 { std::map scale_attribute; calculate_scale_attribute(faces, interior_map, scale_attribute, accept_internal_facets); - std::vector all_faces(boost::begin(faces), boost::end(faces)); + std::vector all_faces(std::begin(faces), std::end(faces)); #ifdef CGAL_PMP_REFINE_DEBUG CGAL::Timer total_timer; total_timer.start(); #endif diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index 7d1b1b6e6bfd..470ca6ed2325 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -415,8 +415,8 @@ compute_face_face_intersection(const FaceRange& face_range1, // make one box per facet std::vector boxes1; std::vector boxes2; - boxes1.reserve(std::distance(boost::begin(face_range1), boost::end(face_range1))); - boxes2.reserve(std::distance(boost::begin(face_range2), boost::end(face_range2))); + boxes1.reserve(std::distance(std::begin(face_range1), std::end(face_range1))); + boxes2.reserve(std::distance(std::begin(face_range2), std::end(face_range2))); typedef typename GetVertexPointMap::const_type VertexPointMap1; typedef typename GetVertexPointMap::const_type VertexPointMap2; @@ -548,7 +548,7 @@ compute_face_polyline_intersection(const FaceRange& face_range, typename boost::range_value::type>::value)); std::vector faces; - faces.reserve(std::distance(boost::begin(face_range), boost::end(face_range))); + faces.reserve(std::distance(std::begin(face_range), std::end(face_range))); typedef CGAL::Box_intersection_d::ID_FROM_BOX_ADDRESS Box_policy; typedef CGAL::Box_intersection_d::Box_with_info_d Box; @@ -556,8 +556,8 @@ compute_face_polyline_intersection(const FaceRange& face_range, // make one box per facet std::vector boxes1; std::vector boxes2; - boxes1.reserve(std::distance(boost::begin(face_range), boost::end(face_range))); - boxes2.reserve(std::distance(boost::begin(polyline), boost::end(polyline)) - 1); + boxes1.reserve(std::distance(std::begin(face_range), std::end(face_range))); + boxes2.reserve(std::distance(std::begin(polyline), std::end(polyline)) - 1); for(face_descriptor f : face_range) { @@ -684,7 +684,7 @@ compute_face_polylines_intersection(const FaceRange& face_range, CGAL_static_assertion((std::is_same::type>::value)); std::vector faces; - faces.reserve(std::distance( boost::begin(face_range), boost::end(face_range) )); + faces.reserve(std::distance( std::begin(face_range), std::end(face_range) )); typedef CGAL::Box_intersection_d::ID_FROM_BOX_ADDRESS Box_policy; typedef CGAL::Box_intersection_d::Box_with_info_d, Box_policy> Box; @@ -692,12 +692,12 @@ compute_face_polylines_intersection(const FaceRange& face_range, // make one box per facet std::vector boxes1; std::vector boxes2; - boxes1.reserve(std::distance(boost::begin(face_range), boost::end(face_range))); + boxes1.reserve(std::distance(std::begin(face_range), std::end(face_range))); std::size_t polylines_size = 0; for(Polyline poly : polyline_range) { - polylines_size += std::distance( boost::begin(poly), boost::end(poly) ) -1; + polylines_size += std::distance( std::begin(poly), std::end(poly) ) -1; } boxes2.reserve(polylines_size); @@ -707,11 +707,11 @@ compute_face_polylines_intersection(const FaceRange& face_range, boxes1.push_back(Box(Polygon_mesh_processing::face_bbox(f, tm), std::make_pair(0, faces.size()-1))); } - std::size_t range_size = std::distance( boost::begin(polyline_range), boost::end(polyline_range) ); + std::size_t range_size = std::distance( std::begin(polyline_range), std::end(polyline_range) ); for(std::size_t j = 0; j < range_size; ++j) { Polyline poly = polyline_range[j]; - std::size_t size = std::distance( boost::begin(poly), boost::end(poly) ); + std::size_t size = std::distance( std::begin(poly), std::end(poly) ); for(std::size_t i =0; i< size - 1; ++i) { Point p1 = poly[i]; @@ -785,8 +785,8 @@ compute_polyline_polyline_intersection(const Polyline& polyline1, // make one box per facet std::vector boxes1; std::vector boxes2; - boxes1.reserve(std::distance(boost::begin(polyline1), boost::end(polyline1)) - 1); - boxes2.reserve(std::distance(boost::begin(polyline2), boost::end(polyline2)) - 1); + boxes1.reserve(std::distance(std::begin(polyline1), std::end(polyline1)) - 1); + boxes2.reserve(std::distance(std::begin(polyline2), std::end(polyline2)) - 1); for(std::size_t i =0; i< polyline1.size()-1; ++i) { @@ -870,7 +870,7 @@ compute_polylines_polylines_intersection(const PolylineRange& polylines1, CGAL::Bbox_3 b1, b2; for(Polyline poly : polylines1) { - polylines_size += std::distance( boost::begin(poly), boost::end(poly) ) -1; + polylines_size += std::distance( std::begin(poly), std::end(poly) ) -1; b1 += CGAL::bbox_3(poly.begin(), poly.end()); } boxes1.reserve( polylines_size ); @@ -878,7 +878,7 @@ compute_polylines_polylines_intersection(const PolylineRange& polylines1, polylines_size = 0; for(Polyline poly : polylines2) { - polylines_size += std::distance( boost::begin(poly), boost::end(poly) ) -1; + polylines_size += std::distance( std::begin(poly), std::end(poly) ) -1; b2 += CGAL::bbox_3(poly.begin(), poly.end()); } boxes2.reserve(polylines_size); @@ -886,11 +886,11 @@ compute_polylines_polylines_intersection(const PolylineRange& polylines1, if(!CGAL::do_overlap(b1,b2)) return out; - std::size_t range_size = std::distance( boost::begin(polylines1), boost::end(polylines1) ); + std::size_t range_size = std::distance( std::begin(polylines1), std::end(polylines1) ); for(std::size_t j = 0; j < range_size; ++j) { Polyline poly = polylines1[j]; - std::size_t size = std::distance( boost::begin(poly), boost::end(poly) ); + std::size_t size = std::distance( std::begin(poly), std::end(poly) ); for(std::size_t i =0; i< size - 1; ++i) { const Point& p1 = poly[i]; @@ -899,11 +899,11 @@ compute_polylines_polylines_intersection(const PolylineRange& polylines1, } } - range_size = std::distance( boost::begin(polylines2), boost::end(polylines2) ); + range_size = std::distance( std::begin(polylines2), std::end(polylines2) ); for(std::size_t j = 0; j < range_size; ++j) { Polyline poly = polylines2[j]; - std::size_t size = std::distance( boost::begin(poly), boost::end(poly) ); + std::size_t size = std::distance( std::begin(poly), std::end(poly) ); for(std::size_t i =0; i< size - 1; ++i) { const Point& p1 = poly[i]; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h index af70795b209a..85d5d7428a43 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h @@ -222,7 +222,7 @@ void merge_vertices_in_range(const HalfedgeRange& sorted_hedges, typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - halfedge_descriptor in_h_kept = *boost::begin(sorted_hedges); + halfedge_descriptor in_h_kept = *std::begin(sorted_hedges); halfedge_descriptor out_h_kept = next(in_h_kept, pm); vertex_descriptor v_kept = target(in_h_kept, pm); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h index bd543f5d390d..4322f62676f9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -197,7 +196,7 @@ bool is_polygon_soup_a_polygon_mesh(const PolygonRange& polygons) typedef typename boost::range_value::type Polygon; typedef typename boost::range_value::type V_ID; - if(boost::begin(polygons) == boost::end(polygons)) + if(std::begin(polygons) == std::end(polygons)) return true; //check there is no duplicated ordered edge, and @@ -208,12 +207,12 @@ bool is_polygon_soup_a_polygon_mesh(const PolygonRange& polygons) for(const Polygon& polygon : polygons) { - std::size_t nb_edges = boost::size(polygon); + std::size_t nb_edges = std::size(polygon); if(nb_edges < 3) return false; polygon_vertices.clear(); - V_ID prev = *std::prev(boost::end(polygon)); + V_ID prev = *std::prev(std::end(polygon)); for(V_ID id : polygon) { if(max_idbuild(); m_aabb_trees[id] = t; m_traversal_traits[id] = Traversal_traits(m_aabb_trees[id]->traits()); @@ -600,7 +600,7 @@ class Rigid_triangle_mesh_collision_detection } } // only one CC - points.push_back( get(vpm, *boost::begin(vertices(tm))) ); + points.push_back( get(vpm, *std::begin(vertices(tm))) ); } /*! diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_collision_detection.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_collision_detection.cpp index 935c9525faa7..e8e28c9c2bd8 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_collision_detection.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_collision_detection.cpp @@ -93,7 +93,7 @@ void test_intersections(Index index, const char* type) collision_detection.add_mesh(tm1, params::face_index_map(get(index, tm1))); // 0 // add tm1 using an external tree typename CGAL::Rigid_triangle_mesh_collision_detection::AABB_tree - tm1_tree(boost::begin(faces(tm1)), boost::end(faces(tm1)), tm1); + tm1_tree(std::begin(faces(tm1)), std::end(faces(tm1)), tm1); collision_detection.add_mesh(tm1_tree, tm1, params::face_index_map(get(index, tm1))); // 1 small_spheres collision_detection.add_mesh(tm2, params::face_index_map(get(index, tm2))); // 2 blobby collision_detection.add_mesh(tm3, params::face_index_map(get(index, tm3))); // 3 large_cube_coplanar diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp index 860cc2d66e9d..429572694813 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp @@ -52,8 +52,8 @@ class Offset_function public: Offset_function(TriangleMesh& tm, double offset_distance) - : m_tree_ptr(new Tree(boost::begin(faces(tm)), - boost::end(faces(tm)), + : m_tree_ptr(new Tree(std::begin(faces(tm)), + std::end(faces(tm)), tm) ) , m_side_of_ptr( new Side_of(*m_tree_ptr) ) , m_offset_distance(offset_distance) diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp index 7b3051fdd3e7..fb464e110f7c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp @@ -306,7 +306,7 @@ void Scene_c3t3_item::compute_bbox() const _bbox = Bbox(result.xmin(), result.ymin(), result.zmin(), result.xmax(), result.ymax(), result.zmax()); - if (boost::empty(c3t3().cells_in_complex())) + if (std::empty(c3t3().cells_in_complex())) { for (Tr::Vertex_handle v : c3t3().triangulation().finite_vertex_handles()) { diff --git a/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp b/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp index 6f5270b76cfd..6fe9d48402e8 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_iterators.cpp @@ -41,8 +41,8 @@ int main() vb = r.begin(); ve = r.end(); // or the boost Range API - vb = boost::begin(r); - ve = boost::end(r); + vb = std::begin(r); + ve = std::end(r); // or with boost::tie, as the CGAL range derives from std::pair for(boost::tie(vb, ve) = m.vertices(); vb != ve; ++vb){ diff --git a/Surface_mesh/test/Surface_mesh/sm_circulator_test.cpp b/Surface_mesh/test/Surface_mesh/sm_circulator_test.cpp index bf446b309597..5e932869a440 100644 --- a/Surface_mesh/test/Surface_mesh/sm_circulator_test.cpp +++ b/Surface_mesh/test/Surface_mesh/sm_circulator_test.cpp @@ -64,20 +64,20 @@ struct test_emptiness : public Surface_fixture assert(m.is_isolated(iv)); Sm::Vertex_around_target_range vr = m.vertices_around_target(m.halfedge(iv)); - assert(is_empty_range(boost::begin(vr), boost::end(vr))); + assert(is_empty_range(std::begin(vr), std::end(vr))); Sm::Face_around_target_range fr = m.faces_around_target(m.halfedge(iv)); - assert(is_empty_range(boost::begin(fr), boost::end(fr))); + assert(is_empty_range(std::begin(fr), std::end(fr))); Sm::Halfedge_around_target_range hr = m.halfedges_around_target(m.halfedge(iv)); - assert(is_empty_range(boost::begin(hr), boost::end(hr))); + assert(is_empty_range(std::begin(hr), std::end(hr))); // not true for everything else m.remove_vertex(iv); assert(m.is_removed(iv)); Sm::Vertex_iterator vb, ve; for(boost::tie(vb, ve) = m.vertices(); vb != ve; ++vb) { Sm::Vertex_around_target_range vr = m.vertices_around_target(m.halfedge(*vb)); - assert(!is_empty_range(boost::begin(vr), boost::end(vr))); + assert(!is_empty_range(std::begin(vr), std::end(vr))); } } }; From d9e9c1e66419b50ee38fcad12e92f9cca30c4400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 23 Apr 2023 23:27:35 +0200 Subject: [PATCH 0246/1398] dtd::disance does not handle ranges --- .../demo/Polyhedron/Scene_polyhedron_selection_item.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index 0f32ae5b719e..0a012a64293f 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -1076,9 +1076,9 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::settempInstructions("Edge not selected: the incident facets must have a degree of at least 4.", "Select the edge with extremities you want to join."); @@ -1177,9 +1177,9 @@ bool Scene_polyhedron_selection_item:: treat_selection(const std::set Date: Tue, 25 Apr 2023 11:38:13 +0200 Subject: [PATCH 0247/1398] Start to debug cmap/gmap insertion (nyf) --- .../include/CGAL/Combinatorial_map.h | 4 +- .../Combinatorial_map_group_functors.h | 41 +++++++++++++++++++ .../internal/Combinatorial_map_utility.h | 21 +++++----- .../CGAL/Combinatorial_map_operations.h | 6 +++ .../include/CGAL/Generalized_map_operations.h | 8 +++- 5 files changed, 67 insertions(+), 13 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index f16a3779cd99..b65e30614dd9 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -4562,7 +4562,7 @@ namespace CGAL { } this->template basic_link_beta_for_involution<2>(d2, d1); - for ( unsigned int dim=3; dim<=dimension; ++dim) + for (unsigned int dim=3; dim<=dimension; ++dim) { if ( !is_free(it1, dim) && is_marked(beta(it1, dim), treated) ) @@ -4583,6 +4583,8 @@ namespace CGAL { { // Here we group all enabled attributes starting from 2 to dimension Helper::template Foreach_enabled_attributes , 2>::run(*this, adart1, adart2); + Helper::template Foreach_enabled_attributes + , 3>::run(*this, adart1, adart2); // TODO DEBUG } else // Here we degroup 2-attributes { internal::Degroup_attribute_functor_run::run(*this, adart1, adart2); } 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 bda62d360f86..08dd26c00c75 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 @@ -42,6 +42,10 @@ * Test_split_attribute_functor to test if there is some i-attributes * that are split after an operation. Modified darts are given in a * std::deque. + * + * Set_dart_of_attribute_if_marked to set the dart of the i-attribute + * associated with a dart if the old dart is marked. Used in remove_cell + * functions. */ namespace CGAL { @@ -1033,6 +1037,43 @@ struct Test_split_attribute_functor } }; // ************************************************************************ +template::type> +struct Set_dart_of_attribute_if_marked +{ + static void run(CMap& amap, typename CMap::Dart_descriptor d1, + typename CMap::size_type amark) + { + if(amap.template attribute(d1)!=CMap::null_descriptor && + amap.template dart(d1)!=CMap::null_descriptor && + amap.is_marked(amap.template dart(d1), amark)) + { amap.template dart(d1)=d1; } + } +}; +// Specialization for void attributes. +template +struct Set_dart_of_attribute_if_marked +{ + static void run(CMap&, typename CMap::Dart_descriptor, + typename CMap::size_type) + {} +}; +// ************************************************************************ +template +struct Toto // TODO UPDATE +{ + template + static void run(CMap& amap, typename CMap::Dart_descriptor d1, + typename CMap::Dart_descriptor d2) + { + if(!amap.template is_free(d1) && !amap.template is_free(d2)) + { + Group_attribute_functor_run::run + (amap, amap.template beta(d1), amap.template beta(d2), false); + } + } +}; +// ************************************************************************ } // namespace internal } // namespace CGAL diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h index 340b0551c988..884c4f80b981 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h @@ -342,23 +342,24 @@ namespace CGAL //is called for case k only if the k'th type in the tuple //is different from Void. Note that to the converse of Foreach_static //Functor are called from n =0 to k - template + template struct Foreach_static_restricted; - template + template struct Foreach_static_restricted,n> + std::tuple,n, startn> { template static void run(T& ... t){ - Conditionnal_run::run(t...); + if(n>=startn) + { Conditionnal_run::run(t...); } Foreach_static_restricted - ,n+1>::run(t...); + , n+1, startn>::run(t...); } }; - template - struct Foreach_static_restricted,n>{ + template + struct Foreach_static_restricted,n, startn>{ template static void run(T& ... ){} }; @@ -609,13 +610,13 @@ namespace CGAL struct Attribute_const_range { typedef CGAL::Void type; }; - // To iterate onto each enabled attributes, starting from n-attributes (0 by default) - template + // To iterate onto each enabled attributes, starting from startn-attributes (0 by default) + template struct Foreach_enabled_attributes { template static void run(Ts& ... t) - { Foreach_static_restricted::run(t...); } + { Foreach_static_restricted::run(t...); } }; // To iterate onto each enabled attributes, except j-attributes template diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h index 8d29ad53b6ca..9a2a3a947448 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h @@ -150,6 +150,9 @@ namespace CGAL if ( d1!=amap.null_dart_descriptor ) { + internal::Set_dart_of_attribute_if_marked:: + run(amap, d1, mark); + if ( d2!=amap.null_dart_descriptor && d1!=d2 ) { amap.template basic_link_beta(d1, d2); @@ -371,6 +374,9 @@ namespace CGAL { if ( !amap.template is_free<0>(*it) ) { + internal::Set_dart_of_attribute_if_marked:: + run(amap, amap.template beta<0>(*it), mark); + if ( !amap.template is_free<1>(*it) && amap.template beta<0>(*it)!=(*it) ) { diff --git a/Generalized_map/include/CGAL/Generalized_map_operations.h b/Generalized_map/include/CGAL/Generalized_map_operations.h index abffe8d16513..7ae5b70117fc 100644 --- a/Generalized_map/include/CGAL/Generalized_map_operations.h +++ b/Generalized_map/include/CGAL/Generalized_map_operations.h @@ -91,8 +91,9 @@ namespace CGAL it.cont(); ++it ) { to_erase.push_back(it); - if ( !amap.template is_free(it) && dg1==amap.null_descriptor ) - { dg1=it; dg2=amap.template alpha(it); } + if (dg1==amap.null_descriptor && !amap.template is_free(it) && + !amap.template is_free(amap.template alpha(it))) + { dg1=it; dg2=amap.template alpha(it); } amap.mark(it, mark); ++res; } @@ -136,6 +137,9 @@ namespace CGAL modified_darts.push_back(d2); amap.mark(d2, mark_modified_darts); } + + internal::Set_dart_of_attribute_if_marked:: + run(amap, d1, mark); } } } From 79ac67c8ffa25e9d3e821cbfb2da9b09285c4069 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 25 Apr 2023 11:40:31 +0200 Subject: [PATCH 0248/1398] Create all attributes for LCC tests; add draw to debug (todo: remove later) --- .../test/Linear_cell_complex/CMakeLists.txt | 7 +- .../Linear_cell_complex_3_test.h | 108 +++++++++++++++++- 2 files changed, 108 insertions(+), 7 deletions(-) diff --git a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt index 9adb636537f1..0b7a094a29d1 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Linear_cell_complex_Tests) -find_package(CGAL REQUIRED) +find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) set(hfiles Linear_cell_complex_2_test.h Linear_cell_complex_3_test.h Linear_cell_complex_3_test.h) @@ -26,6 +26,11 @@ target_compile_definitions(Linear_cell_complex_3_test_index PUBLIC USE_COMPACT_C target_link_libraries(Linear_cell_complex_3_test_index PUBLIC CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_3_test_index) +if(CGAL_Qt5_FOUND) + target_link_libraries(Linear_cell_complex_3_test PUBLIC CGAL::CGAL_Basic_viewer) + target_link_libraries(Linear_cell_complex_3_test_index PUBLIC CGAL::CGAL_Basic_viewer) +endif() + add_executable(Linear_cell_complex_4_test_index Linear_cell_complex_4_test.cpp ${hfiles}) target_compile_definitions(Linear_cell_complex_4_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) target_link_libraries(Linear_cell_complex_4_test_index PUBLIC CGAL CGAL::Data) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h index 7235848f2e84..d5811fbfff11 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h @@ -20,7 +20,7 @@ #include "Linear_cell_complex_2_test.h" #include #include - +#include template bool check_number_of_cells_3(LCC& lcc, unsigned int nbv, unsigned int nbe, unsigned int nbf, unsigned int nbvol, @@ -63,6 +63,13 @@ bool check_number_of_cells_3(LCC& lcc, unsigned int nbv, unsigned int nbe, return true; } +template +void create_attributes_3(Map& map) +{ + create_attributes_2(map); + CreateAttributes::run(map); +} + template typename LCC::Dart_descriptor make_loop(LCC& lcc, const typename LCC::Point& p1) { @@ -96,6 +103,7 @@ bool test_LCC_3() Dart_descriptor dh1=lcc.make_segment(Point(0,0,0),Point(1,0,0), true); Dart_descriptor dh2=lcc.make_segment(Point(2,0,0),Point(2,1,0), true); Dart_descriptor dh3=lcc.make_segment(Point(2,2,0),Point(3,1,0), true); + create_attributes_3(lcc); if ( !check_number_of_cells_3(lcc, 6, 3, 6, 3, 3) ) return false; @@ -210,6 +218,7 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 11, 13, 8, 2, 2) ) return false; + // CGAL::draw(lcc); trace_test_begin(); lcc.template remove_cell<0>(dh9); if ( !check_number_of_cells_3(lcc, 10, 12, 8, 2, 2) ) @@ -320,6 +329,7 @@ bool test_LCC_3() dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); lcc.template sew<3>(dh1, dh2); + create_attributes_3(lcc); dh2 = lcc.previous(dh1); dh3 = lcc.next(dh1); lcc.template contract_cell<1>(dh1); @@ -341,6 +351,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); dh2 = lcc.next(dh2); @@ -373,6 +384,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); dh2 = lcc.next(dh2); @@ -405,6 +417,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); dh3 = lcc.make_triangle(Point(5,5,4),Point(7,5,4),Point(6,6,4)); @@ -445,6 +458,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); dh3 = lcc.make_triangle(Point(5,5,4),Point(7,5,4),Point(6,6,4)); @@ -483,6 +497,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_tetrahedron(Point(9, 9, 0),Point(9, 0, 9), Point(0, 9, 9),Point(0, 0, 0)); + create_attributes_3(lcc); typename LCC::Vector v=CGAL::compute_normal_of_cell_0(lcc, dh1); if (v!=typename LCC::Vector(-9,-9,9)) { @@ -496,7 +511,7 @@ bool test_LCC_3() dh1 = lcc. make_hexahedron(Point(0,0,0),Point(1,0,0),Point(1,2,0),Point(0,2,0), Point(0,3,4),Point(0,0,4),Point(6,0,4),Point(6,3,4)); - + create_attributes_3(lcc); v=CGAL::compute_normal_of_cell_2(lcc, lcc.template opposite<2>(lcc.previous(dh1))); if (v!=typename LCC::Vector(0,0,1)) @@ -529,6 +544,7 @@ bool test_LCC_3() make_hexahedron(Point(0,3,0),Point(1,3,0),Point(1,4,0),Point(0,4,0), Point(0,4,1),Point(0,3,1),Point(1,3,1),Point(1,4,1)); dh2 = lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh2)))); + create_attributes_3(lcc); lcc.template sew<3>(dh1,dh2); lcc.template contract_cell<1>(lcc.previous(dh1)); @@ -560,12 +576,14 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_loop(lcc, Point(0,0,0)); + create_attributes_3(lcc); lcc.template contract_cell<2>(dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) return false; trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0), true); + create_attributes_3(lcc); lcc.template sew<1>(lcc.template opposite<2>(dh1), lcc.other_orientation(lcc.template opposite<2>(dh1))); lcc.template contract_cell<2>(dh1); @@ -575,6 +593,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0),true); + create_attributes_3(lcc); lcc.template sew<1>(dh1, lcc.other_orientation(dh1)); lcc.template sew<1>(lcc.template opposite<2>(dh1), lcc.other_orientation(lcc.template opposite<2>(dh1))); @@ -586,6 +605,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_face_two_edges(lcc, Point(0,0,0), Point(1,0,0)); dh2 = make_face_two_edges(lcc, Point(0,0,1), Point(1,0,1)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); lcc.template contract_cell<2>(dh1); if ( !check_number_of_cells_3(lcc, 2, 2, 1, 1, 1) ) @@ -600,6 +620,7 @@ bool test_LCC_3() dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); dh3 = lcc.make_triangle(Point(5,3,3),Point(7,3,3),Point(6,0,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); lcc.template sew<2>(lcc.next(dh2), dh3); @@ -615,6 +636,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.create_dart(Point(0,0,0)); + create_attributes_3(lcc); lcc.template sew<3>(dh1, lcc.create_dart(Point(1,0,0))); lcc.template contract_cell<2>(dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) @@ -623,6 +645,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_loop(lcc, Point(0,0,0)); dh2 = make_loop(lcc, Point(0,0,1)); + create_attributes_3(lcc); lcc.template sew<3>(dh1, dh2); lcc.template contract_cell<2>(dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) @@ -630,6 +653,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0), true); + create_attributes_3(lcc); lcc.template sew<3>(dh1, lcc.make_segment(Point(0,0,1),Point(1,0,1), true)); lcc.template sew<3>(lcc.template opposite<2>(dh1), lcc.template opposite<2>(lcc.template opposite<3>(dh1))); @@ -640,8 +664,10 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0), true); + create_attributes_3(lcc); lcc.template sew<1>(dh1, lcc.other_orientation(dh1)); dh2 = lcc.make_segment(Point(0,0,1),Point(1,0,1), true); + create_attributes_3(lcc); lcc.template sew<1>(dh2, lcc.other_orientation(dh2)); lcc.template sew<3>(dh1, dh2); lcc.template contract_cell<2>(dh1); @@ -651,10 +677,12 @@ bool test_LCC_3() trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0), true); + create_attributes_3(lcc); lcc.template sew<1>(dh1, lcc.other_orientation(dh1)); lcc.template sew<1>(lcc.template opposite<2>(dh1), lcc.other_orientation(lcc.template opposite<2>(dh1))); dh2 = lcc.make_segment(Point(0,0,1),Point(1,0,1), true); + create_attributes_3(lcc); lcc.template sew<1>(dh2, lcc.other_orientation(dh2)); lcc.template sew<1>(lcc.template opposite<2>(dh2), lcc.other_orientation(lcc.template opposite<2>(dh2))); @@ -669,6 +697,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_face_two_edges(lcc, Point(0,0,0), Point(1,0,0)); dh2 = make_face_two_edges(lcc, Point(0,0,1), Point(1,0,1)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); lcc.template sew<3>(dh1, make_face_two_edges(lcc, Point(0,0,1), Point(1,0,1))); @@ -686,6 +715,7 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_face_two_edges(lcc, Point(0,0,0), Point(1,0,0)); dh2 = make_face_two_edges(lcc, Point(0,0,1), Point(1,0,1)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); lcc.template sew<3>(dh1, make_face_two_edges(lcc, Point(0,0,1), Point(1,0,1))); @@ -706,6 +736,7 @@ bool test_LCC_3() dh1 = lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); dh3 = lcc.make_triangle(Point(5,3,3),Point(7,3,3),Point(6,0,3)); + create_attributes_3(lcc); lcc.template sew<2>(dh1, dh2); lcc.template sew<2>(lcc.next(dh2), dh3); lcc.template sew<3>(dh1, lcc.make_triangle(Point(5,5,4),Point(7,5,4), @@ -737,18 +768,21 @@ bool test_LCC_3() trace_test_begin(); dh1 = make_loop(lcc, Point(0,0,0)); + create_attributes_3(lcc); lcc.template contract_cell<3>(dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) return false; trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0)); + create_attributes_3(lcc); lcc.template contract_cell<3>(dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) return false; trace_test_begin(); dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0), true); + create_attributes_3(lcc); lcc.template sew<1>(dh1, lcc.other_orientation(dh1)); lcc.template sew<1>(lcc.template opposite<2>(dh1), lcc.other_orientation(lcc.template opposite<2>(dh1))); @@ -764,6 +798,7 @@ bool test_LCC_3() dh2 = lcc. make_hexahedron(Point(0,3,0),Point(1,3,0),Point(1,4,0),Point(0,4,0), Point(0,4,1),Point(0,3,1),Point(1,3,1),Point(1,4,1)); + create_attributes_3(lcc); dh2 = lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh2)))); lcc.template sew<3>(dh1,dh2); @@ -813,6 +848,7 @@ bool test_LCC_3() dh3 = lcc. make_hexahedron(Point(0,6,0),Point(1,6,0),Point(1,7,0),Point(0,7,0), Point(0,7,1),Point(0,6,1),Point(1,6,1),Point(1,7,1)); + create_attributes_3(lcc); dh3 = lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh3)))); lcc.template sew<3>(dh2,dh3); dh2 = lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh2)))); @@ -861,6 +897,12 @@ bool test_LCC_3() Point(1,2,0),Point(0,2,0), Point(0,3,4),Point(0,0,4), Point(6,0,4),Point(6,3,4)); + + dh2=lcc.insert_cell_1_in_cell_2(lcc.next(dh1), lcc.previous(dh1)); + if ( !check_number_of_cells_3(lcc, 8, 13, 7, 1, 1) ) + return false; + lcc.template remove_cell<1>(dh2); + dh2 = lcc. make_hexahedron(Point(0,0,4),Point(1,0,4), Point(1,2,4),Point(0,2,4), @@ -871,16 +913,24 @@ bool test_LCC_3() Point(6,2,4),Point(5,2,4), Point(5,3,8),Point(5,0,8), Point(11,0,8),Point(11,3,8)); - lcc.template sew<3>(dh1,lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh2))))); - lcc.template sew<3>(lcc.template opposite<2>(lcc.next(dh1)), lcc.template opposite<2>(lcc.previous(dh3))); + create_attributes_3(lcc); + lcc.template sew<3>(dh1,lcc.template opposite<2> + (lcc.next(lcc.next(lcc.template opposite<2>(dh2))))); + lcc.template sew<3>(lcc.template opposite<2>(lcc.next(dh1)), + lcc.template opposite<2>(lcc.previous(dh3))); lcc.template close<3>(); if ( !check_number_of_cells_3(lcc, 16, 28, 16, 4, 1) ) return false; - lcc.insert_cell_1_in_cell_2(lcc.next(dh1), Alpha1::run(lcc, lcc.previous(dh1))); + lcc.insert_cell_1_in_cell_2(lcc.next(dh1), lcc.previous(dh1)); + if ( !check_number_of_cells_3(lcc, 16, 29, 17, 4, 1) ) + return false; + dh2=lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh1)))); - lcc.insert_cell_1_in_cell_2(dh2, Alpha1::run(lcc, lcc.next(lcc.next(dh2)))); + lcc.insert_cell_1_in_cell_2(dh2, lcc.next(lcc.next(dh2))); + if ( !check_number_of_cells_3(lcc, 16, 30, 18, 4, 1) ) + return false; std::vector path; path.push_back(lcc.next(dh1)); @@ -891,6 +941,52 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 16, 30, 19, 5, 1) ) return false; + // Test insertion between two different 2-cells + trace_test_begin(); + lcc.clear(); + dh1 = lcc. + make_hexahedron(Point(0,0,0),Point(1,0,0), + Point(1,2,0),Point(0,2,0), + Point(0,3,4),Point(0,0,4), + Point(6,0,4),Point(6,3,4)); + dh2 = lcc. + make_hexahedron(Point(0,0,4),Point(1,0,4), + Point(1,2,4),Point(0,2,4), + Point(0,3,8),Point(0,0,8), + Point(6,0,8),Point(6,3,8)); + create_attributes_3(lcc); + lcc.template sew<3>(dh1,lcc.template opposite<2>(lcc.next(lcc.next(lcc.template opposite<2>(dh2))))); + + lcc.insert_cell_1_between_two_cells_2(lcc.template opposite<2>(dh1), + lcc.template opposite<2>(lcc.next(dh1))); + if ( !check_number_of_cells_3(lcc, 12, 21, 10, 2, 1) ) + return false; + + trace_test_begin(); + lcc.clear(); + dh1=lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), + Point(5,5,0), Point(0,5,0), + Point(0,5,4), Point(0,0,4), + Point(5,0,4), Point(5,5,4)); + dh2=lcc.make_hexahedron(Point(5,0,0), Point(10,0,0), + Point(10,5,0), Point(5,5,0), + Point(5,5,4), Point(5,0,4), + Point(10,0,4), Point(10,5,4)); + dh3=lcc.make_quadrangle(Point(5,2,2), Point(5,1,2), + Point(5,1,1), Point(5,2,1)); + create_attributes_3(lcc); + lcc.template sew<3>(lcc.template opposite<2>(lcc.next(lcc.next(dh1))), + lcc.other_orientation(lcc.template opposite<2>(dh2))); + lcc.template sew<3>(dh3, lcc.make_combinatorial_polygon(4)); + + // Create an hole in the face between the two cubes + lcc.insert_cell_1_between_two_cells_2(lcc.template opposite<2>(lcc.next(lcc.next(dh1))), + lcc.next(lcc.next(dh3))); + + CGAL::draw(lcc); // TODO remove + if (!check_number_of_cells_3(lcc, 16, 25, 11, 2, 1) ) + return false; + // Construction from Polyhedron_3 { trace_test_begin(); From 57f0b8908d198643a9b41cf379aa638cf77f7539 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 25 Apr 2023 14:47:33 +0200 Subject: [PATCH 0249/1398] bug fix in insert cell 1 between two 2 cells --- .../include/CGAL/Combinatorial_map.h | 6 +++- .../Combinatorial_map_group_functors.h | 34 +++++++++++-------- .../include/CGAL/Generalized_map.h | 7 ++++ .../Linear_cell_complex_3_test.h | 2 +- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index b65e30614dd9..77af5bbc736c 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -4583,8 +4583,12 @@ namespace CGAL { { // Here we group all enabled attributes starting from 2 to dimension Helper::template Foreach_enabled_attributes , 2>::run(*this, adart1, adart2); + // And we need to group also beta_i(adart1) and beta_i(adart2) for all + // enabled attributes starting from 3 dimension. Indeed when two i-cells + // are grouped for adart1 and adart2, this group also all beta_j two by two + // except for beta_i. Helper::template Foreach_enabled_attributes - , 3>::run(*this, adart1, adart2); // TODO DEBUG + , 3>::run(*this, adart1, adart2); } else // Here we degroup 2-attributes { internal::Degroup_attribute_functor_run::run(*this, adart1, adart2); } 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 08dd26c00c75..6fd93934b2c1 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 @@ -36,6 +36,9 @@ * non nullptr, we overide all the i-attribute of the second i-cell to the * first i-attribute. * + * Group_neighboor_attribute to group the -attributes of beta_i(d1) and + * beta_i(d2) if they exist. + * * Degroup_attribute_functor_run to degroup one i-attributes in two * (except for j-adim). * @@ -488,6 +491,22 @@ struct Group_attribute_functor run(amap,adart1,adart2); } }; // ************************************************************************ +/// Group i-attribute of beta_i(d1) and beta_i(d2) if they exist. +template +struct Group_neighboor_attribute +{ + template + static void run(CMap& amap, typename CMap::Dart_descriptor d1, + typename CMap::Dart_descriptor d2) + { + if(!amap.template is_free(d1) && !amap.template is_free(d2)) + { + CGAL::internal::Group_attribute_functor_run::run + (amap, amap.template opposite(d1), amap.template opposite(d2), false); + } + } +}; +// ************************************************************************ // Functor used to degroup one i-attribute of one i-cell in two, except the // attribute of j. template {} }; // ************************************************************************ -template -struct Toto // TODO UPDATE -{ - template - static void run(CMap& amap, typename CMap::Dart_descriptor d1, - typename CMap::Dart_descriptor d2) - { - if(!amap.template is_free(d1) && !amap.template is_free(d2)) - { - Group_attribute_functor_run::run - (amap, amap.template beta(d1), amap.template beta(d2), false); - } - } -}; -// ************************************************************************ } // namespace internal } // namespace CGAL diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index 273d8b32bf27..d65292ed5a0b 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -3695,6 +3695,13 @@ namespace CGAL { Helper::template Foreach_enabled_attributes , 2>:: run(*this, adart1, adart2); + // And we need to group also alpha_i(adart1) and alpha_i(adart2) for all + // enabled attributes starting from 3 dimension. Indeed when two i-cells + // are grouped for adart1 and adart2, this group also all alpha_j two by two + // except for alpha_i. + Helper::template Foreach_enabled_attributes + , 3>::run(*this, adart1, adart2); + } else // Here we degroup 2-attributes { diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h index d5811fbfff11..8b8d55ea375e 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h @@ -974,10 +974,10 @@ bool test_LCC_3() Point(10,0,4), Point(10,5,4)); dh3=lcc.make_quadrangle(Point(5,2,2), Point(5,1,2), Point(5,1,1), Point(5,2,1)); - create_attributes_3(lcc); lcc.template sew<3>(lcc.template opposite<2>(lcc.next(lcc.next(dh1))), lcc.other_orientation(lcc.template opposite<2>(dh2))); lcc.template sew<3>(dh3, lcc.make_combinatorial_polygon(4)); + create_attributes_3(lcc); // Create an hole in the face between the two cubes lcc.insert_cell_1_between_two_cells_2(lcc.template opposite<2>(lcc.next(lcc.next(dh1))), From 24451c03e1ef4a81a346f9dc4e7158be1e5aa1cc Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Tue, 25 Apr 2023 17:01:09 +0200 Subject: [PATCH 0250/1398] Add doc which constructions are trivial/exact. --- ..._predicates_inexact_constructions_kernel.h | 205 +++++++++++++++++- 1 file changed, 197 insertions(+), 8 deletions(-) diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h index 1063561e3d65..a24ad8901c22 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h @@ -4,16 +4,205 @@ namespace CGAL { /*! \ingroup kernel_predef -A typedef to a kernel which has the following properties: - -

-Since i-cells are not explicitely represented in combinatorial maps, the association between i-cells and i-attributes is transferred to darts: if attribute a is associated to i-cell c, all the darts belonging to c are associated to a. +Since i-cells are not explicitly represented in combinatorial maps, the association between i-cells and i-attributes is transferred to darts: if attribute a is associated to i-cell c, all the darts belonging to c are associated to a. We can see two examples of combinatorial maps having some attributes in \cgalFigureRef{fig_cmap_with_attribs}. In the first example (Left), a 2D combinatorial map has 1-attributes containing a float, for example corresponding to the length of the associated 1-cell, and 2-attributes containing a color in RGB format. In the second example (Right), a 3D combinatorial map has 2-attributes containing a color in RGB format. @@ -280,7 +280,7 @@ There are also two different classes of ranges containing one dart per i- The iterators of the \link GenericMap::Dart_range `Dart_range`\endlink are bidirectional iterators, while the iterators of the other four ranges are forward iterators. The value type of all these iterators is `Dart` thus all these iterators can be directly used as \link GenericMap::Dart_descriptor `Dart_descriptor`\endlink. -Additionally, there is a range over non void i-attributes: \link GenericMap::Attribute_range `Attribute_range::type`\endlink, having a bidirectional iterator with value type \link GenericMap::Attribute_type Attribute_type::type`\endlink. +Additionally, there is a range over non void i-attributes: \link GenericMap::Attribute_range `Attribute_range::type`\endlink, having a bidirectional iterator with value type \link GenericMap::Attribute_type `Attribute_type::type`\endlink. For each range, there is an associated const range, a model of the `ConstRange` concept. You can find some examples of ranges in Section \ref ssecexample3DCM "A 3D Combinatorial Map". diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h index 007d8b424c56..03f492d1b081 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h @@ -4,7 +4,7 @@ The concept `CombinatorialMap` defines a d-dimensional combinatorial map. -\cgalRefines `GenericMap` +\cgalRefines{GenericMap} \cgalHasModel \link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index 31bcaf161d65..790d378bd074 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -4,7 +4,7 @@ The concept `GenericMap` defines a d-dimensional generic map. This concept is defined only to factorize the common notions between \link CombinatorialMap `CombinatorialMap`\endlink and \link GeneralizedMap `GeneralizedMap`\endlink concepts. -\cgalRefines DefaultConstructible +\cgalRefines{DefaultConstructible} A generic map has a set of darts D, and functions \f$ f_0\f$,\f$ \ldots\f$,\f$ f_{d}\f$ that link these darts between them. @@ -450,28 +450,28 @@ template const Attribute_type::type::Info& info_of_attribute(typename Attribute_const_descriptor::type ah) const; /*! -A shorcut for \link GenericMap::info_of_attribute `info_of_attribute`\endlink`(`\link GenericMap::attribute `attribute`\endlink`(adart))`. +A shortcut for \link GenericMap::info_of_attribute `info_of_attribute`\endlink`(`\link GenericMap::attribute `attribute`\endlink`(adart))`. \pre \link GenericMap::attribute `attribute`\endlink`(adart)!=nullptr`. */ template typename Attribute_type::type::Info & info(Dart_descriptor adart); /*! -A shorcut for \link GenericMap::info_of_attribute(typename Attribute_const_descriptor::type)const `info_of_attribute`\endlink`(`\link GenericMap::attribute(Dart_const_descriptor)const `attribute`\endlink`(adart))` for const descriptor. +A shortcut for \link GenericMap::info_of_attribute(typename Attribute_const_descriptor::type)const `info_of_attribute`\endlink`(`\link GenericMap::attribute(Dart_const_descriptor)const `attribute`\endlink`(adart))` for const descriptor. \pre \link GenericMap::attribute(Dart_const_descriptor)const `attribute`\endlink`(adart)!=nullptr`. */ template const typename Attribute_type::type::Info & info(Dart_const_descriptor adart) const; /*! -A shorcut for \link GenericMap::dart_of_attribute `dart_of_attribute`\endlink`(`\link GenericMap::attribute `attribute`\endlink`(adart))`. +A shortcut for \link GenericMap::dart_of_attribute `dart_of_attribute`\endlink`(`\link GenericMap::attribute `attribute`\endlink`(adart))`. \pre `attribute(adart)!=nullptr`. */ template Dart_descriptor & dart(Dart_descriptor adart); /*! -A shorcut for \link GenericMap::dart_of_attribute(typename Attribute_const_descriptor::type)const `dart_of_attribute`\endlink`(`\link GenericMap::attribute(Dart_const_descriptor)const `attribute`\endlink`(adart))` for const descriptor. +A shortcut for \link GenericMap::dart_of_attribute(typename Attribute_const_descriptor::type)const `dart_of_attribute`\endlink`(`\link GenericMap::attribute(Dart_const_descriptor)const `attribute`\endlink`(adart))` for const descriptor. \pre `attribute(adart)!=nullptr`. */ template @@ -679,7 +679,7 @@ Returns the status of the management of the attributes of the generic map. (ca1.dart()).size(); CMap_3::size_type nb2=mmap.darts_of_cell<2>(ca2.dart()).size(); mmap.info<2>(ca1.dart())*=(double(nb1)/(nb1+nb2)); diff --git a/Combinatorial_map/include/CGAL/Cell_attribute.h b/Combinatorial_map/include/CGAL/Cell_attribute.h index 091fb5730a1d..0c931f0e30d9 100644 --- a/Combinatorial_map/include/CGAL/Cell_attribute.h +++ b/Combinatorial_map/include/CGAL/Cell_attribute.h @@ -176,11 +176,11 @@ struct Init_id; { return !operator==(other); } protected: - /// Contructor without parameter. + /// Constructor without parameter. Cell_attribute_without_info(): mrefcounting(0), m_for_cc(Refs::null_descriptor) {} - /// Copy contructor. + /// Copy constructor. Cell_attribute_without_info(const Cell_attribute_without_info& acell): mrefcounting(acell.mrefcounting) {} @@ -301,12 +301,12 @@ struct Init_id; { return !operator==(other); } protected: - /// Contructor without parameter. + /// Constructor without parameter. Cell_attribute_without_info() : mdart(Refs::null_descriptor), mrefcounting(0) {} - /// Copy contructor. + /// Copy constructor. Cell_attribute_without_info(const Cell_attribute_without_info& acell): mdart(acell.mdart), mrefcounting(acell.mrefcounting) @@ -398,7 +398,7 @@ struct Init_id; typedef void Info; protected: - /// Default contructor. + /// Default constructor. Cell_attribute() {} }; @@ -461,11 +461,11 @@ struct Init_id; { return !operator==(other); } protected: - /// Default contructor. + /// Default constructor. Cell_attribute() {} - /// Contructor with an info in parameter. + /// Constructor with an info in parameter. Cell_attribute(const Info_& ainfo) : Info_for_cell_attribute(ainfo) {} diff --git a/Combinatorial_map/include/CGAL/Cell_attribute_with_id.h b/Combinatorial_map/include/CGAL/Cell_attribute_with_id.h index 768e0b82aeb5..7366d1189284 100644 --- a/Combinatorial_map/include/CGAL/Cell_attribute_with_id.h +++ b/Combinatorial_map/include/CGAL/Cell_attribute_with_id.h @@ -42,11 +42,11 @@ namespace CGAL { friend class Concurrent_compact_container; protected: - /// Default contructor. + /// Default constructor. Cell_attribute_with_id() {} - /// Contructor with an info in parameter. + /// Constructor with an info in parameter. Cell_attribute_with_id(const Info_& ainfo) : Cell_attribute(ainfo) {} @@ -64,7 +64,7 @@ namespace CGAL { friend class Concurrent_compact_container; protected: - /// Default contructor. + /// Default constructor. Cell_attribute_with_id() {} }; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 77af5bbc736c..ee80b2978c2c 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -219,7 +219,7 @@ namespace CGAL { * @param dartinfoconverter functor to transform original information of darts into information of copies * @param pointconverter functor to transform points in original map into points of copies. * @param copy_perforated_darts true to copy also darts marked perforated (if any) - * @param mark_perforated_darts true to mark darts wich are copies of perforated darts (if any) + * @param mark_perforated_darts true to mark darts which are copies of perforated darts (if any) * @post *this is valid. */ template ::value> (mattribute_containers).emplace(args...); // Reinitialize the ref counting of the new attribute. This is normally - // not required except if create_attribute is used as "copy contructor". + // not required except if create_attribute is used as "copy constructor". this->template init_attribute_ref_counting(res); internal::Init_id::type>::run (this->template attributes(), res); @@ -1639,8 +1639,8 @@ namespace CGAL { CGAL_static_assertion(i<=dimension); CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "set_attribute but i-attributes are disabled"); - - for (typename Dart_of_cell_range::iterator it(*this, dh); it.cont(); ++it) + for (typename Dart_of_cell_range::iterator it(*this, dh); + it.cont(); ++it) { this->template set_dart_attribute(it, ah); } @@ -3543,7 +3543,7 @@ namespace CGAL { ::run(*this, map2, current, other); } - // We test if the injection is valid with its neighboors. + // We test if the injection is valid with its neighbors. // We go out as soon as it is not satisfied. for (i=0; match && i<=dimension; ++i) { @@ -3772,7 +3772,7 @@ namespace CGAL { /** Test if a face is a combinatorial polygon of length alg * (a cycle of alg darts beta1 links together). - * @param adart an intial dart + * @param adart an initial dart * @return true iff the face containing adart is a polygon of length alg. */ bool is_face_combinatorial_polygon(Dart_const_descriptor adart, @@ -3858,7 +3858,7 @@ namespace CGAL { } /** Test if a volume is a combinatorial tetrahedron. - * @param adart an intial dart + * @param adart an initial dart * @return true iff the volume containing adart is a combinatorial tetrahedron. */ bool is_volume_combinatorial_tetrahedron(Dart_const_descriptor d1) const @@ -3951,7 +3951,7 @@ namespace CGAL { } /** Test if a volume is a combinatorial hexahedron. - * @param adart an intial dart + * @param adart an initial dart * @return true iff the volume containing adart is a combinatorial hexahedron. */ bool is_volume_combinatorial_hexahedron(Dart_const_descriptor d1) const @@ -4145,7 +4145,7 @@ namespace CGAL { } /** Insert a vertex in the given 2-cell which is split in triangles, - * once for each inital edge of the facet. + * once for each initial edge of the facet. * @param adart a dart of the facet to triangulate. * @param update_attributes a boolean to update the enabled attributes * (deprecated, now we use are_attributes_automatically_managed()) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h index d3d11cbdfc7a..5cbf7b7861a6 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_copy_functors.h @@ -41,7 +41,7 @@ namespace internal // **************************************************************************** // Map1 is the existing map, to convert into map2. // Functor called only when both i-attributes have non void info. -// General cases when both info are differents. +// General cases when both info are different. template< typename Map1, typename Map2, unsigned int i, typename Info1=typename Map1::template Attribute_type::type::Info, @@ -439,7 +439,7 @@ struct Default_converter_cmap_attributes }; // **************************************************************************** // Cast converter always copy attributes, doing a cast. This can work only -// if both types are convertible and this is user responsability +// if both types are convertible and this is user responsibility // to use it only in this case. template< typename Map1, typename Map2, unsigned int i> struct Cast_converter_cmap_attributes @@ -480,7 +480,7 @@ struct Default_converter_dart_info }; // **************************************************************************** // Cast converter of dart info. This can work only if both types are -// convertible and this is user responsability to use it only in this case. +// convertible and this is user responsibility to use it only in this case. template< typename Map1, typename Map2> struct Cast_converter_dart_info { 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 6fd93934b2c1..d86c152c503a 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 @@ -33,7 +33,7 @@ * Group_attribute_functor to group the -attributes of two * given i-cells (except for j-adim). If one i-attribute is nullptr, we set the * darts of its i-cell to the second attribute. If both i-attributes are - * non nullptr, we overide all the i-attribute of the second i-cell to the + * non nullptr, we override all the i-attribute of the second i-cell to the * first i-attribute. * * Group_neighboor_attribute to group the -attributes of beta_i(d1) and @@ -609,6 +609,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/internal/Combinatorial_map_internal_functors.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h index 5fe14f3217b2..3e0b147942c5 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h @@ -39,7 +39,7 @@ * valid (all its darts are linked to the same attribute, no other dart is * linked with this attribute). * - * internal::Count_cell_functor to count the nuber of i-cells. + * internal::Count_cell_functor to count the number of i-cells. * * internal::Count_bytes_one_attribute_functor to count the memory * occupied by i-attributes. @@ -66,7 +66,7 @@ * internal::Test_is_same_attribute_functor to test if two * i-attributes of two darts are isomorphic (ie they have the same info). * - * inernal::Test_is_same_attribute_point_functor to test if + * internal::Test_is_same_attribute_point_functor to test if * the point of two i-attributes are equal. * * internal::Reverse_orientation_of_map_functor to reverse the diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h index 884c4f80b981..4488da87fe19 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_utility.h @@ -533,7 +533,7 @@ namespace CGAL struct Attribute_type { typedef Void type; }; - // Helper class allowing to retreive the d-cell-descriptor attribute + // Helper class allowing to retrieve the d-cell-descriptor attribute template::type, typename WithIndex=typename CMap::Use_index> struct Attribute_descriptor @@ -550,7 +550,7 @@ namespace CGAL struct Attribute_descriptor { typedef typename CMap::Dart_index type; }; - // Helper class allowing to retreive the d-cell-const descriptor attribute + // Helper class allowing to retrieve the d-cell-const descriptor attribute template::type> struct Attribute_const_descriptor { @@ -562,7 +562,7 @@ namespace CGAL struct Attribute_const_descriptor { typedef CGAL::Void* type; }; - // Helper class allowing to retreive the d-cell-iterator attribute + // Helper class allowing to retrieve the d-cell-iterator attribute template::type> struct Attribute_iterator { @@ -574,7 +574,7 @@ namespace CGAL struct Attribute_iterator { typedef CGAL::Void* type; }; - // Helper class allowing to retreive the d-cell-const descriptor attribute + // Helper class allowing to retrieve the d-cell-const descriptor attribute template::type> struct Attribute_const_iterator { @@ -586,7 +586,7 @@ namespace CGAL struct Attribute_const_iterator { typedef CGAL::Void* type; }; - // Helper class allowing to retreive the d-cell-attribute range + // Helper class allowing to retrieve the d-cell-attribute range template::type> struct Attribute_range { diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h index eeb2c40b1460..0b2c39bc7204 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h @@ -28,7 +28,7 @@ namespace CGAL { * Basic classes that serve as tools for definition of iterators. There are 3 classes: * - CMap_dart_iterator is the basic generic class defining - * what is an interator on darts. + * what is an iterator on darts. * - CMap_extend_iterator to extend the given iterator by adding * the involution Bi. * - CMap_non_basic_iterator to transform the basic iterator Ite diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_save_load.h b/Combinatorial_map/include/CGAL/Combinatorial_map_save_load.h index 31e8cff3946a..e691fce122c6 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_save_load.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_save_load.h @@ -347,7 +347,7 @@ namespace CGAL { using boost::property_tree::ptree; ptree pt; - // update pt adding nodes containing attributes informations + // update pt adding nodes containing attributes information CMap::Helper::template Foreach_enabled_attributes >::run(const_cast(amap), pt, myDarts); @@ -371,7 +371,7 @@ namespace CGAL { tree.put("data", ""); /** First we save general information of the map (by default nothing, - the fuction can be specialized by users). */ + the function can be specialized by users). */ f(tree); // map dart => number @@ -818,7 +818,7 @@ namespace CGAL { read_xml(input, pt); /** First we load general information of the map (by default nothing, - the fuction can be specialized by users). */ + the function can be specialized by users). */ f(pt); // Then we load darts and attributes. 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 aad7d6437877..584442412c54 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 c3ddb24005be..d3d67c57a88d 100644 --- a/Combinatorial_map/include/CGAL/Compact_container_with_index.h +++ b/Combinatorial_map/include/CGAL/Compact_container_with_index.h @@ -755,16 +755,21 @@ class Compact_container_with_index return false; } - bool owns_dereferencable(const_iterator cit) const + bool owns(size_type i) const + { return i=n) return; - capacity_=n; increase_size(); } diff --git a/Combinatorial_map/include/CGAL/Dart.h b/Combinatorial_map/include/CGAL/Dart.h index 761e9023249a..3308def61039 100644 --- a/Combinatorial_map/include/CGAL/Dart.h +++ b/Combinatorial_map/include/CGAL/Dart.h @@ -241,7 +241,7 @@ namespace CGAL { } protected: - /// Neighboors for each dimension +1 (from 0 to dimension). + /// Neighbors for each dimension +1 (from 0 to dimension). Dart_descriptor mf[dimension+1]; /// Values of Boolean marks. diff --git a/Combinatorial_map/include/CGAL/Info_for_cell_attribute.h b/Combinatorial_map/include/CGAL/Info_for_cell_attribute.h index f45b23d76f8a..ba13c664c213 100644 --- a/Combinatorial_map/include/CGAL/Info_for_cell_attribute.h +++ b/Combinatorial_map/include/CGAL/Info_for_cell_attribute.h @@ -19,10 +19,10 @@ namespace CGAL { class Info_for_cell_attribute { public: - /// Contructor without parameter. + /// Constructor without parameter. Info_for_cell_attribute()=default; // default => zero-initializing built-in types - /// Contructor with an info in parameter. + /// Constructor with an info in parameter. Info_for_cell_attribute(const Info& ainfo) : minfo(ainfo) {} diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index 94b110c4ac7c..6357af2198d4 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -24,9 +24,17 @@ 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) + message(STATUS "Found OpenMesh") + target_link_libraries(Combinatorial_map_copy_test PRIVATE OpenMesh::OpenMesh) + target_compile_definitions(Combinatorial_map_copy_test PRIVATE -DCGAL_USE_OPENMESH) target_link_libraries(Combinatorial_map_copy_test_index PRIVATE OpenMesh::OpenMesh) + target_compile_definitions(Combinatorial_map_copy_test_index PRIVATE -DCGAL_USE_OPENMESH) +else() + message(STATUS "NOTICE: Tests will not use OpenMesh.") endif() 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 000000000000..49e8795eef77 --- /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/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h index 172e2481899f..91c430a9d914 100644 --- a/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h +++ b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h @@ -4,7 +4,7 @@ The concept `GeneralizedMap` defines a d-dimensional generalized map. -\cgalRefines `GenericMap` +\cgalRefines{GenericMap} \cgalHasModel \link CGAL::Generalized_map `CGAL::Generalized_map`\endlink diff --git a/Generalized_map/doc/Generalized_map/Generalized_map.txt b/Generalized_map/doc/Generalized_map/Generalized_map.txt index 0b08884f40ac..491a8c9ed3d3 100644 --- a/Generalized_map/doc/Generalized_map/Generalized_map.txt +++ b/Generalized_map/doc/Generalized_map/Generalized_map.txt @@ -117,7 +117,7 @@ To answer this need, a generalized map allows to create attributes which
  • an i-cell may have no associated i-attribute. -Since i-cells are not explicitely represented in generalized maps, the association between i-cells and i-attributes is transferred to darts: if attribute a is associated to i-cell c, all the darts belonging to c are associated to a. +Since i-cells are not explicitly represented in generalized maps, the association between i-cells and i-attributes is transferred to darts: if attribute a is associated to i-cell c, all the darts belonging to c are associated to a. We can see two examples of generalized maps having some attributes in \cgalFigureRef{fig_gmap_with_attribs}. In the first example (Left), a 2D generalized map has 1-attributes containing a float, for example corresponding to the length of the associated 1-cell, and 2-attributes containing a color in RGB format. In the second example (Right), a 3D generalized map has 2-attributes containing a color in RGB format. @@ -279,7 +279,7 @@ There are also two different classes of ranges containing one dart per i- The iterators of the \link GenericMap::Dart_range `Dart_range`\endlink are bidirectional iterators, while the iterators of the other four ranges are forward iterators. The value type of all these iterators is `Dart` thus all these iterators can be directly used as \link GenericMap::Dart_descriptor `Dart_descriptor`\endlink. -Additionally, there is a range over non void i-attributes: \link GenericMap::Attribute_range `Attribute_range::type`\endlink, having a bidirectional iterator with value type \link GenericMap::Attribute_type Attribute_type::type`\endlink. +Additionally, there is a range over non void i-attributes: \link GenericMap::Attribute_range `Attribute_range::type`\endlink, having a bidirectional iterator with value type \link GenericMap::Attribute_type `Attribute_type::type`\endlink. For each range, there is an associated const range, a model of the `ConstRange` concept. You can find some examples of ranges in Section \ref ssecexample3DGM "A 3D Generalized Map". diff --git a/Generalized_map/examples/Generalized_map/gmap_3_dynamic_onmerge.cpp b/Generalized_map/examples/Generalized_map/gmap_3_dynamic_onmerge.cpp index 48651e5ef92c..4c8717af339d 100644 --- a/Generalized_map/examples/Generalized_map/gmap_3_dynamic_onmerge.cpp +++ b/Generalized_map/examples/Generalized_map/gmap_3_dynamic_onmerge.cpp @@ -40,7 +40,7 @@ struct Split_functor // operator() automatically called after a split. void operator()(Face_attribute& ca1, Face_attribute& ca2) { - // We need to reinitalize the weight of the two faces + // We need to reinitialize the weight of the two faces GMap_3::size_type nb1=mmap.darts_of_cell<2>(ca1.dart()).size(); GMap_3::size_type nb2=mmap.darts_of_cell<2>(ca2.dart()).size(); mmap.info<2>(ca1.dart())*=(double(nb1)/(nb1+nb2)); diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index d65292ed5a0b..4f4b29152fbd 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -193,7 +193,7 @@ namespace CGAL { * @param dartinfoconverter functor to transform original information of darts into information of copies * @param pointconverter functor to transform points in original map into points of copies. * @param copy_perforated_darts true to copy also darts marked perforated (if any) - * @param mark_perforated_darts true to mark darts wich are copies of perforated darts (if any) + * @param mark_perforated_darts true to mark darts which are copies of perforated darts (if any) * @post *this is valid. */ template ::value> (mattribute_containers).emplace(args...); // Reinitialize the ref counting of the new attribute. This is normally - // not required except if create_attribute is used as "copy contructor". + // not required except if create_attribute is used as "copy constructor". this->template init_attribute_ref_counting(res); internal::Init_id::type>::run (this->template attributes(), res); @@ -2635,7 +2635,7 @@ namespace CGAL { ::run(*this, map2, current, other); } - // We test if the injection is valid with its neighboors. + // We test if the injection is valid with its neighbors. // We go out as soon as it is not satisfied. for (i = 0; match && i <= dimension; ++i) { @@ -3024,7 +3024,7 @@ namespace CGAL { /** Test if a face is a combinatorial polygon of length alg * (a cycle of alg edges alpha1 links together). - * @param adart an intial dart + * @param adart an initial dart * @return true iff the face containing adart is a polygon of length alg. */ bool is_face_combinatorial_polygon(Dart_const_descriptor adart, @@ -3118,7 +3118,7 @@ namespace CGAL { } /** Test if a volume is a combinatorial tetrahedron. - * @param adart an intial dart + * @param adart an initial dart * @return true iff the volume containing adart is a combinatorial tetrahedron. */ bool is_volume_combinatorial_tetrahedron(Dart_const_descriptor d1) const @@ -3195,7 +3195,7 @@ namespace CGAL { } /** Test if a volume is a combinatorial hexahedron. - * @param adart an intial dart + * @param adart an initial dart * @return true iff the volume containing adart is a combinatorial hexahedron. */ bool is_volume_combinatorial_hexahedron(Dart_const_descriptor d1) const @@ -3388,7 +3388,7 @@ namespace CGAL { } /** Insert a vertex in the given 2-cell which is split in triangles, - * once for each inital edge of the facet. + * once for each initial edge of the facet. * @param adart a dart of the facet to triangulate. * @return A dart incident to the new vertex. */ @@ -3643,10 +3643,13 @@ namespace CGAL { d2 = create_dart(); mark(it1,treated); + if (!isfree1) + { d3 = create_dart(); d4 = create_dart(); this->template basic_link_alpha<2>(d1, d3); this->template basic_link_alpha<2>(d2, d4); + } for (unsigned int dim=3; dim<=dimension; ++dim) { @@ -3654,21 +3657,30 @@ namespace CGAL { is_marked(alpha(it1, dim), treated) ) { basic_link_alpha(alpha(it1, dim, 1), d1, dim); - basic_link_alpha(alpha(it1, dim, 1, 0), d2, dim); + basic_link_alpha(alpha(d1, dim, 0), d2, dim); - basic_link_alpha(alpha(it1, dim, 1, 2), d3, dim); - basic_link_alpha(alpha(it1, dim, 1, 2, 0), d4, dim); + if (!isfree1) + { + basic_link_alpha(alpha(it1, 1, dim, 1), d3, dim); + basic_link_alpha(alpha(d3, dim, 0), d4, dim); + } } } if (!isfree1) - { this->template link_alpha<1>(this->template alpha<1>(it1), d3); } - this->template link_alpha<1>(it1, d1); + { + this->template link_alpha<1>(this->template alpha<1>(it1), d3); + if ( adart2!=null_descriptor ) + { + CGAL_assertion (it2.cont()); + this->template link_alpha<1>(this->template alpha<1>(it2), d4); + } + } + this->template link_alpha<1>(it1, d1); if (adart2!=null_descriptor) { CGAL_assertion (it2.cont()); - this->template link_alpha<1>(this->template alpha<1>(it2), d4); this->template link_alpha<1>(it2, d2); ++it2; } @@ -3678,14 +3690,18 @@ namespace CGAL { update_attributes && ah!=null_descriptor) { internal::Set_i_attribute_of_dart_functor::run(*this, d2, ah); - internal::Set_i_attribute_of_dart_functor::run(*this, d4, ah); + if (!isfree1) + { + internal::Set_i_attribute_of_dart_functor::run(*this, d4, ah); + } } } // We do the link_alpha<0> after the link_alpha<1> to update the // possible attributes of d2. this->template link_alpha<0>(d1, d2); - this->template link_alpha<0>(d3, d4); + if (!isfree1) + { this->template link_alpha<0>(d3, d4); } } if (are_attributes_automatically_managed() && update_attributes) @@ -3705,10 +3721,9 @@ namespace CGAL { } else // Here we degroup 2-attributes { - // TODO if ( !this->template is_free<2>(d1) && d2!=null_descriptor ) - if (adart2!=null_descriptor) + if (!this->template is_free<2>(d1) && d2!=null_descriptor) { CGAL::internal::GMap_degroup_attribute_functor_run:: - run(*this, adart1, adart2); } + run(*this, d1, this->template alpha<2>(d1)); } } } 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 7514a5a0089c..69179ad118c9 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 @@ -34,7 +34,7 @@ * GMap_group_attribute_functor to group the -attributes of two * given i-cells (except for j-adim). If one i-attribute is nullptr, we set the * darts of its i-cell to the second attribute. If both i-attributes are - * non nullptr, we overide all the i-attribute of the second i-cell to the + * non nullptr, we override all the i-attribute of the second i-cell to the * first i-attribute. * * GMap_degroup_attribute_functor_run to degroup one i-attributes in two @@ -304,6 +304,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 80044bdc7d3f..828004b84164 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/test/Generalized_map/CMakeLists.txt b/Generalized_map/test/Generalized_map/CMakeLists.txt index d712bb061dc5..e773e5c32187 100644 --- a/Generalized_map/test/Generalized_map/CMakeLists.txt +++ b/Generalized_map/test/Generalized_map/CMakeLists.txt @@ -7,20 +7,10 @@ project(Generalized_map_Tests) # CGAL and its components find_package(CGAL REQUIRED) -# Boost and its components -find_package(Boost REQUIRED) - -if(NOT Boost_FOUND) - - message( - STATUS "This project requires the Boost library, and will not be compiled.") - - return() - -endif() - -set(hfiles Generalized_map_2_test.h Generalized_map_3_test.h - Generalized_map_4_test.h GMap_test_insertions.h) +set(hfiles Generalized_map_2_test.h + Generalized_map_3_test.h + Generalized_map_4_test.h + GMap_test_insertions.h) create_single_source_cgal_program("Generalized_map_test.cpp" ${hfiles}) @@ -28,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 000000000000..6dd17ee0a84f --- /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/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake b/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake index 7dc0446bf45b..a4b0902e60d4 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake @@ -10,7 +10,7 @@ # CGAL_USE_FILE - CMake file to use CGAL. # -# Construct consitent error messages for use below. +# Construct consistent error messages for use below. set(CGAL_DIR_DESCRIPTION "directory containing CGALConfig.cmake. This is either the binary directory where CGAL was configured or PREFIX/lib/CGAL for an installation.") set(CGAL_DIR_MESSAGE "CGAL not found. Set the CGAL_DIR cmake variable or environment variable to the ${CGAL_DIR_DESCRIPTION}") diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h index 889ee37db5d1..f092321e4a9e 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h @@ -705,7 +705,7 @@ class Surface_mesh { public: - /// default constructur + /// default constructor Halfedge_around_face_circulator(const Surface_mesh* m=NULL, Face f=Face()) : mesh_(m) { diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Vector.h b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Vector.h index 8f9487c28cc7..21aa768dbfb4 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Vector.h +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Vector.h @@ -137,7 +137,7 @@ class Vector } - /// assign a scalar to all componenets + /// assign a scalar to all components Vector& operator=(const Scalar s) { for (int i=0; iset_dart_attribute<0>(scene.lcc->beta(d2,1),(scene.lcc)->create_vertex_attribute(scene.lcc->point(d1))); (scene.lcc)->set_dart_attribute<0>(scene.lcc->beta(d3,1),(scene.lcc)->create_vertex_attribute(scene.lcc->point(d2))); (scene.lcc)->set_dart_attribute<0>(scene.lcc->beta(d1,1),(scene.lcc)->create_vertex_attribute(scene.lcc->point(d3))); diff --git a/Linear_cell_complex/examples/Linear_cell_complex/README.txt b/Linear_cell_complex/examples/Linear_cell_complex/README.txt index 6326da0e6650..e461312f2dd2 100644 --- a/Linear_cell_complex/examples/Linear_cell_complex/README.txt +++ b/Linear_cell_complex/examples/Linear_cell_complex/README.txt @@ -5,7 +5,7 @@ Examples for Linear_cell_complex package: linear_cell_complex_3_with_colored_vertices.cpp linear_cell_complex_4.cpp - Three "basic" examples, detailled in the user manual. + Three "basic" examples, detailed in the user manual. * plane_graph_to_lcc_2.cpp diff --git a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt index 0b7a094a29d1..9adb636537f1 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Linear_cell_complex_Tests) -find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED) set(hfiles Linear_cell_complex_2_test.h Linear_cell_complex_3_test.h Linear_cell_complex_3_test.h) @@ -26,11 +26,6 @@ target_compile_definitions(Linear_cell_complex_3_test_index PUBLIC USE_COMPACT_C target_link_libraries(Linear_cell_complex_3_test_index PUBLIC CGAL CGAL::Data) cgal_add_compilation_test(Linear_cell_complex_3_test_index) -if(CGAL_Qt5_FOUND) - target_link_libraries(Linear_cell_complex_3_test PUBLIC CGAL::CGAL_Basic_viewer) - target_link_libraries(Linear_cell_complex_3_test_index PUBLIC CGAL::CGAL_Basic_viewer) -endif() - add_executable(Linear_cell_complex_4_test_index Linear_cell_complex_4_test.cpp ${hfiles}) target_compile_definitions(Linear_cell_complex_4_test_index PUBLIC USE_COMPACT_CONTAINER_WITH_INDEX) target_link_libraries(Linear_cell_complex_4_test_index PUBLIC CGAL CGAL::Data) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h index 8b8d55ea375e..1f696a418113 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h @@ -20,7 +20,6 @@ #include "Linear_cell_complex_2_test.h" #include #include -#include template bool check_number_of_cells_3(LCC& lcc, unsigned int nbv, unsigned int nbe, unsigned int nbf, unsigned int nbvol, @@ -218,7 +217,6 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 11, 13, 8, 2, 2) ) return false; - // CGAL::draw(lcc); trace_test_begin(); lcc.template remove_cell<0>(dh9); if ( !check_number_of_cells_3(lcc, 10, 12, 8, 2, 2) ) @@ -983,7 +981,6 @@ bool test_LCC_3() lcc.insert_cell_1_between_two_cells_2(lcc.template opposite<2>(lcc.next(lcc.next(dh1))), lcc.next(lcc.next(dh3))); - CGAL::draw(lcc); // TODO remove if (!check_number_of_cells_3(lcc, 16, 25, 11, 2, 1) ) return false; From 134b464aaa4280e1ba9c70e5839b47b61a657e08 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 26 Apr 2023 11:51:43 +0100 Subject: [PATCH 0253/1398] Allocate the QJSEngine on the heap --- AABB_tree/demo/AABB_tree/MainWindow.cpp | 12 ++++++------ AABB_tree/demo/AABB_tree/MainWindow.h | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index 7064d50ba5a3..4321e396b8d4 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -16,7 +16,7 @@ MainWindow::MainWindow(QWidget* parent) -: CGAL::Qt::DemosMainWindow(parent) + : CGAL::Qt::DemosMainWindow(parent), myEngine(new QJSEngine()) { ui = new Ui::MainWindow; ui->setupUi(this); @@ -40,14 +40,14 @@ MainWindow::MainWindow(QWidget* parent) connect(this, SIGNAL(openRecentFile(QString)), this, SLOT(open(QString))); - QJSValue mainWindow = myEngine.newQObject(this); - myEngine.globalObject().setProperty("main_window", mainWindow); + QJSValue mainWindow = myEngine->newQObject(this); + myEngine->globalObject().setProperty("main_window", mainWindow); readSettings(); std::ifstream script("init.js"); if(script.good()){ std::string line; while(getline(script, line)){ - myEngine.evaluate(line.c_str()); + myEngine->evaluate(line.c_str()); } } } @@ -57,8 +57,8 @@ MainWindow::~MainWindow() m_pViewer->makeCurrent(); // AF I thought this helps to avoid the exception when the program // terminates, but it does not - myEngine.globalObject().setProperty("main_window", QJSValue()); - myEngine.collectGarbage(); + myEngine->globalObject().setProperty("main_window", QJSValue()); + myEngine->collectGarbage(); delete ui; } diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index 7a28f7cde919..50cd927a7cb4 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -20,18 +20,19 @@ struct Foo : public QObject Q_OBJECT public: - QJSEngine myEngine; + QJSEngine* myEngine; Foo() + : myEngine(new QJSEngine()) { - QJSValue baz = myEngine.newQObject(this); - myEngine.globalObject().setProperty("baz", baz); + QJSValue baz = myEngine->newQObject(this); + myEngine->.globalObject().setProperty("baz", baz); } void bar() { std::cout << "bar()" << std::endl; - myEngine.evaluate("baz.hello()"); + myEngine->evaluate("baz.hello()"); } public slots: @@ -112,7 +113,7 @@ class MainWindow : void on_actionView_cutting_plane_triggered(); private: - QJSEngine myEngine; + QJSEngine* myEngine; Scene* m_pScene; Viewer* m_pViewer; Ui::MainWindow* ui; From 585e79b67e5750a541d18e97487f9b23d07d5d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 26 Apr 2023 13:06:19 +0200 Subject: [PATCH 0254/1398] add authors from the history section --- .../doc/Polygon_mesh_processing/PackageDescription.txt | 2 +- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 9c8b5d6f2948..bf667377a96a 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -79,7 +79,7 @@ \cgalPkgPicture{hole_filling_ico.png} \cgalPkgSummaryBegin -\cgalPkgAuthors{Sébastien Loriot, Mael Rouxel-Labbé, Jane Tournois, and Ilker %O. Yaz} +\cgalPkgAuthors{David Coeurjolly, Jaques-Olivier Lachaud, Konstantinos Katriopla, Sébastien Loriot, Mael Rouxel-Labbé, Hossam Saeed, Jane Tournois, and Ilker %O. Yaz} \cgalPkgDesc{This package provides a collection of methods and classes for polygon mesh processing, ranging from basic operations on simplices, to complex geometry processing algorithms such as Boolean operations, remeshing, repairing, collision and intersection detection, and more.} diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index ead5b5a8c80c..eac246d8ab47 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -4,7 +4,7 @@ namespace CGAL { \anchor Chapter_PolygonMeshProcessing \cgalAutoToc -\authors Sébastien Loriot, Mael Rouxel-Labbé, Jane Tournois, Ilker %O. Yaz +\authors David Coeurjolly, Jaques-Olivier Lachaud, Konstantinos Katriopla, Sébastien Loriot, Mael Rouxel-Labbé, Hossam Saeed, Jane Tournois, and Ilker %O. Yaz \image html neptun_head.jpg \image latex neptun_head.jpg From cfa16aa95fb754181e40acb18e8203ab76652211 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 27 Apr 2023 12:14:36 +0200 Subject: [PATCH 0255/1398] Document which constructions are exact in EPIC. --- .../doc/resources/1.9.3/BaseDoxyfile.in | 3 +- Kernel_23/doc/Kernel_23/CGAL/Circle_2.h | 8 + Kernel_23/doc/Kernel_23/CGAL/Circle_3.h | 8 +- Kernel_23/doc/Kernel_23/CGAL/Direction_2.h | 6 + Kernel_23/doc/Kernel_23/CGAL/Direction_3.h | 9 + ..._predicates_inexact_constructions_kernel.h | 357 +++++++++--------- Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h | 21 ++ .../doc/Kernel_23/CGAL/Iso_rectangle_2.h | 18 + Kernel_23/doc/Kernel_23/CGAL/Line_2.h | 5 + Kernel_23/doc/Kernel_23/CGAL/Line_3.h | 5 + Kernel_23/doc/Kernel_23/CGAL/Plane_3.h | 9 + Kernel_23/doc/Kernel_23/CGAL/Point_2.h | 11 + Kernel_23/doc/Kernel_23/CGAL/Point_3.h | 13 + Kernel_23/doc/Kernel_23/CGAL/Ray_2.h | 2 + Kernel_23/doc/Kernel_23/CGAL/Ray_3.h | 2 + Kernel_23/doc/Kernel_23/CGAL/Segment_2.h | 10 + Kernel_23/doc/Kernel_23/CGAL/Segment_3.h | 10 + Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h | 9 + Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h | 4 + Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h | 5 + Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h | 4 + Kernel_23/doc/Kernel_23/CGAL/Vector_2.h | 10 + Kernel_23/doc/Kernel_23/CGAL/Vector_3.h | 13 + .../doc/Kernel_23/CGAL/Weighted_point_2.h | 15 +- .../doc/Kernel_23/CGAL/Weighted_point_3.h | 15 + 25 files changed, 392 insertions(+), 180 deletions(-) diff --git a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in index 3fcdb56be680..0a56ea1fc37e 100644 --- a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in @@ -382,7 +382,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd= \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalEpicExact=
    Exactness
    This construction is trivial and therefore always exact in `Exact_predicates_inexact_constructions_kernel`.
    " # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For diff --git a/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h index 1e9eacdeb0e4..ecb9d969847a 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h @@ -29,6 +29,8 @@ It is initialized to the circle with center `center`, squared radius `squared_radius` and orientation `ori`. \pre `ori != COLLINEAR` and `squared_radius >= 0`. + +\cgalEpicExact */ Circle_2(const Point_2 ¢er, const Kernel::FT &squared_radius, @@ -65,6 +67,8 @@ It is initialized to the circle with center `center`, squared radius zero and orientation `ori`. \pre `ori != COLLINEAR`. \post `c.is_degenerate()` = `true`. + +\cgalEpicExact */ Circle_2( const Point_2 ¢er, const Orientation &ori = COUNTERCLOCKWISE); @@ -77,18 +81,21 @@ Circle_2( const Point_2 ¢er, /*! returns the center of `c`. +\cgalEpicExact */ const Point_2 ¢er( ) const; /*! returns the squared radius of `c`. +\cgalEpicExact */ const Kernel::FT& squared_radius( ) const; /*! returns the orientation of `c`. +\cgalEpicExact */ Orientation orientation( ) const; @@ -172,6 +179,7 @@ bool has_on_unbounded_side(const Point_2 &p) const; returns the circle with the same center and squared radius as `c` but with opposite orientation. +\cgalEpicExact */ Circle_2 opposite() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h b/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h index 1fcdcab6e68f..f152c18e2953 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h @@ -22,6 +22,8 @@ introduces a variable `c` of type `Circle_3`. It is initialized to the circle of center `center` and squared radius `sq_r` in plane `plane`. \pre `center` lies in `plane` and `sq_r >= 0`. + +\cgalEpicExact */ Circle_3(const Point_3 ¢er, const Kernel::FT &sq_r, @@ -60,7 +62,7 @@ It is initialized to the circle along which the sphere and the plane intersect. \pre The sphere and the plane intersect along a circle. */ - Circle_3(constSphere_3 & sphere, + Circle_3(const Sphere_3 & sphere, const Plane_3 & plane); /*! @@ -80,24 +82,28 @@ Circle_3(const Plane_3 & plane, /*! returns the center of `c`. +\cgalEpicExact */ const Point_3 & center( ) const; /*! returns the squared radius of `c`. +\cgalEpicExact */ const Kernel::FT & squared_radius( ) const; /*! returns the supporting plane of `c`. +\cgalEpicExact */ const Plane_3 & supporting_plane( ) const; /*! returns the diametral sphere of `c`. +\cgalEpicExact */ const Sphere_3 & diametral_sphere( ) const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h b/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h index 00a2e8d74a57..3c3355de785b 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h @@ -26,6 +26,7 @@ class Direction_2 { /*! introduces the direction `d` of vector `v`. +\cgalEpicExact */ Direction_2(const Vector_2 &v); @@ -47,6 +48,7 @@ Direction_2(const Segment_2 &s); /*! introduces a direction `d` passing through the origin and the point with %Cartesian coordinates \f$ (x, y)\f$. +\cgalEpicExact */ Direction_2(const Kernel::RT &x, const Kernel::RT &y); @@ -61,16 +63,20 @@ Direction_2(const Kernel::RT &x, const Kernel::RT &y); /*! returns values, such that `d``== Direction_2(delta(0),delta(1))`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::RT delta(int i) const; /*! returns `delta(0)`. +\cgalEpicExact */ Kernel::RT dx() const; /*! returns `delta(1)`. +\cgalEpicExact */ Kernel::RT dy() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h b/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h index 81b096ac359a..32dd7834bdb7 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h @@ -26,6 +26,7 @@ class Direction_3 { /*! introduces a direction `d` initialized with the direction of vector `v`. +\cgalEpicExact */ Direction_3(const Vector_3 &v); @@ -47,6 +48,7 @@ Direction_3(const Segment_3 &s); /*! introduces a direction `d` initialized with the direction from the origin to the point with %Cartesian coordinates \f$ (x, y, z)\f$. +\cgalEpicExact */ Direction_3(const Kernel::RT &x, const Kernel::RT &y, const Kernel::RT &z); @@ -58,21 +60,26 @@ Direction_3(const Kernel::RT &x, const Kernel::RT &y, const Kernel::RT &z); /*! returns values, such that `d``== Direction_3(delta(0),delta(1),delta(2))`. \pre `0 <= i <= 2`. + +\cgalEpicExact */ Kernel::RT delta(int i) const; /*! returns `delta(0)`. +\cgalEpicExact */ Kernel::RT dx() const; /*! returns `delta(1)`. +\cgalEpicExact */ Kernel::RT dy() const; /*! returns `delta(2)`. +\cgalEpicExact */ Kernel::RT dz() const; @@ -88,11 +95,13 @@ bool operator!=(const Direction_3 &e) const; /*! The direction opposite to `d`. +\cgalEpicExact */ Direction_3 operator-() const; /*! returns a vector that has the same direction as `d`. +\cgalEpicExact */ Vector_3 vector() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h index a24ad8901c22..8a5e33aa5fc8 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h @@ -14,193 +14,196 @@ coordinates. constructions are not exact in general. -

    Trivial Constructions

    - -Some geometric constructions, however, are exact because they only +
    Trivial Constructions
    +

    Some geometric constructions, however, are exact because they only copy parameters and do not involve any computations that could lead to roundoff errors. We call such a construction trivial. For instance, all copy constructors, such as `Point_2::Point_2(const Point_2&)`, are trivial constructions. In addition, the following constructions in `CGAL::Exact_predicates_inexact_constructions_kernel` -are trivial: +are trivial:

    -
      -
    • `Point_2::Point_2(double,double)` -
    • `Point_2::Point_2(const Weighted_point_2&)` +
        +
      • `Point_2::Point_2(FT, FT)` +
      • `Point_2::Point_2(Weighted_point_2)`
      • `Point_2::Point_2(Origin)` -
      • `Weighted_point_2::Weighted_point_2(double,double)` -
      • `Weighted_point_2::Weighted_point_2(const Point_2&, double = 0)` +
      • `FT Point_2::x()` +
      • `FT Point_2::y()` +
      • `FT Point_2::cartesian(int)` +
      • `FT Point_2::operator[](int)` +
      • `Bbox_2 Point_2::bbox()` +
      • `Vector_2 operator-(Point_2, Origin)` +
      • `Vector_2 operator-(Origin, Point_2)` +
      • `Weighted_point_2::Weighted_point_2(FT, FT)` +
      • `Weighted_point_2::Weighted_point_2(Point_2, FT)` +
      • `Weighted_point_2::Weighted_point_2(Point_2)`
      • `Weighted_point_2::Weighted_point_2(Origin)` -
      • `Vector_2::Vector_2(double,double)` -
      • `Direction_2::Direction_2(double,double)` -
      • `Direction_2::Direction_2(const Vector_2&)` -
      • `Line_2::Line_2(double,double,double)` -
      • `Ray_2::Ray_2(const Point_2&, const Point_2&)` -
      • `Segment_2::Segment_2(const Point_2&, const Point_2&)` -
      • `Triangle_2::Triangle_2(const Point_2&, const Point_2&, const Point_2&)` -
      • `Iso_rectangle_2::Iso_rectangle_2(const Point_2&, const Point_2&)` -
      • `Iso_rectangle_2::Iso_rectangle_2(const Point_2&, const Point_2&, int)` -
      • `Iso_rectangle_2::Iso_rectangle_2(const Point_2&, const Point_2&, const Point_2&, const Point_2&)` -
      • `Iso_rectangle_2::Iso_rectangle_2(const Bbox_2&)` -
      • `Circle_2::Circle_2(const Point_2&, double, Orientation = COUNTERCLOCKWISE)` -
      • `Kernel::ConstructPoint_2()(const Weighted_point_2&)` -
      • `Kernel::ConstructPoint_2()(Origin)` -
      • `Kernel::ConstructWeightedPoint_2()(const Point_2&, double = 0)` -
      • `Kernel::ConstructWeightedPoint_2()(Origin)` -
      • `Kernel::ConstructVector_2()(Origin, const Point_2&)` -
      • `Kernel::ConstructVector_2()(const Point_2&, Origin)` -
      • `Kernel::ConstructVector_2()(Null_vector)` -
      • `Kernel::ConstructDirection_2()(const Vector_2&)` -
      • `Kernel::ConstructSegment_2()(const Point_2&, const Point_2&)` -
      • `Kernel::ConstructRay_2()(const Point_2&, const Point_2&)` -
      • `Kernel::ConstructCircle_2()(const Point_2&, double, Orientation = COUNTERCLOCKWISE)` -
      • `Kernel::ConstructCircle_2()(const Point_2&, Orientation = COUNTERCLOCKWISE)` -
      • `Kernel::ConstructTriangle_2()(const Point_2&, const Point_2&, const Point_2&)` -
      • `Kernel::ConstructIsoRectangle_2()(const Point_2&, const Point_2&)` -
      • `Kernel::ConstructIsoRectangle_2()(const Point_2&, const Point_2&, int)` -
      • `Kernel::ConstructIsoRectangle_2()(const Point_2&, const Point_2&, const Point_2&, const Point_2&)` -
      • `Kernel::ConstructVertex_2()(const Segment_2&, int)` -
      • `Kernel::ConstructVertex_2()(const Triangle_2&, int)` -
      • `Kernel::ConstructVertex_2()(const Iso_rectangle_2&, int)` -
      • `Kernel::ConstructBbox_2()(const Point_2&)` -
      • `Kernel::ConstructBbox_2()(const Segment_2&)` -
      • `Kernel::ConstructBbox_2()(const Triangle_2&)` -
      • `Kernel::ConstructBbox_2()(const Iso_rectangle_2&)` -
      • `Kernel::ConstructCenter_2()(const Circle_2&)` -
      • `Kernel::ConstructOppositeVector_2()(const Vector_2&)` -
      • `Kernel::ConstructOppositeDirection_2()(const Direction_2&)` -
      • `Kernel::ConstructOppositeSegment_2()(const Segment_2&)` -
      • `Kernel::ConstructOppositeRay_2()(const Ray_2&)` -
      • `Kernel::ConstructOppositeLine_2()(const Line_2&)` -
      • `Kernel::ConstructOppositeTriangle_2()(const Triangle_2&)` -
      • `Kernel::ConstructOppositeCircle_2()(const Circle_2&)` -
      • `Kernel::ConstructSource_2()(const Segment_2&)` -
      • `Kernel::ConstructSource_2()(const Ray_2&)` -
      • `Kernel::ConstructSecondPoint_2()(const Ray_2&)` -
      • `Kernel::ConstructTarget_2()(const Target_2&)` -
      • `Kernel::ConstructMinVertex_2()(const Segment_2&)` -
      • `Kernel::ConstructMinVertex_2()(const Iso_rectangle_2&)` -
      • `Kernel::ConstructMaxVertex_2()(const Segment_2&)` -
      • `Kernel::ConstructMaxVertex_2()(const Iso_rectangle_2&)` -
      • `Kernel::ComputeWeight_2()(const Weighted_point_2&)` -
      • `Kernel::ComputeX_2()(const Point_2&)` -
      • `Kernel::ComputeX_2()(const Vector_2&)` -
      • `Kernel::ComputeY_2()(const Point_2&)` -
      • `Kernel::ComputeY_2()(const Vector_2&)` -
      • `Kernel::ComputeA_2()(const Line_2&)` -
      • `Kernel::ComputeB_2()(const Line_2&)` -
      • `Kernel::ComputeC_2()(const Line_2&)` -
      • `Kernel::ComputeDx_2()(const Direction_2&)` -
      • `Kernel::ComputeDy_2()(const Direction_2&)` -
      • `Kernel::ComputeXmin_2()(const Iso_rectangle_2&)` -
      • `Kernel::ComputeXmax_2()(const Iso_rectangle_2&)` -
      • `Kernel::ComputeYmin_2()(const Iso_rectangle_2&)` -
      • `Kernel::ComputeYmax_2()(const Iso_rectangle_2&)` -
      • `Kernel::ComputeSquaredRadius_2()(const Circle_2&)` -
      • `Kernel::ComputeSquaredRadius_2()(const Point_2&)` -
      • `Kernel::CartesianConstIterator_2()(const Point_2&)` -
      • `Kernel::CartesianConstIterator_2()(const Point_2&, int)` -
      • `Kernel::CartesianConstIterator_2()(const Vector_2&)` -
      • `Kernel::CartesianConstIterator_2()(const Vector_2&, int)` -
      • `Point_3::Point_3(double,double,double)` -
      • `Point_3::Point_3(const Weighted_point_3&)` +
      • `Point_2 Weighted_point_2::point()` +
      • `FT Weighted_point_2::weight()` +
      • `FT Weighted_point_2::x()` +
      • `FT Weighted_point_2::y()` +
      • `FT Weighted_point_2::cartesian(int)` +
      • `FT Weighted_point_2::operator[](int)` +
      • `Bbox_2 Weighted_point_2::bbox()` +
      • `Vector_2::Vector_2(FT, FT)` +
      • `FT Vector_2::x()` +
      • `FT Vector_2::y()` +
      • `FT Vector_2::cartesian(int)` +
      • `FT Vector_2::operator[](int)` +
      • `Direction_2 Vector_2::direction()` +
      • `Vector_2 Vector_2::operator-()` +
      • `Direction_2::Direction_2(FT, FT)` +
      • `Direction_2::Direction_2(Vector_2)` +
      • `RT Direction_2::delta(int)` +
      • `RT Direction_2::dx()` +
      • `RT Direction_2::dy()` +
      • `Direction_2 Direction_2::operator-()` +
      • `Vector_2 Direction_2::vector()` +
      • `Line_2::Line_2(RT, RT, RT)` +
      • `RT Line_2::a()` +
      • `RT Line_2::b()` +
      • `Line_2 Line_2::opposite()` +
      • `Ray_2::Ray_2(Point_2, Point_2)` +
      • `Point_2 Ray_2::source()` +
      • `Segment_2::Segment_2(Point_2, Point_2)` +
      • `Point_2 Segment_2::source()` +
      • `Point_2 Segment_2::target()` +
      • `Point_2 Segment_2::min()` +
      • `Point_2 Segment_2::max()` +
      • `Point_2 Segment_2::vertex(int)` +
      • `Point_2 Segment_2::point(int)` +
      • `Point_2 Segment_2::operator[](int)` +
      • `Segment_2 Segment_2::opposite()` +
      • `Bbox_2 Segment_2::bbox()` +
      • `Triangle_2::Triangle_2(Point_2, Point_2, Point_2)` +
      • `Point_2 Triangle_2::vertex(int)` +
      • `Point_2 Triangle_2::operator[](int)` +
      • `Triangle_2 Triangle_2::opposite()` +
      • `Bbox_2 Triangle_2::bbox()` +
      • `Iso_rectangle_2::Iso_rectangle_2(Point_2, Point_2)` +
      • `Iso_rectangle_2::Iso_rectangle_2(Point_2, Point_2, int)` +
      • `Iso_rectangle_2::Iso_rectangle_2(Point_2, Point_2, Point_2, Point_2)` +
      • `Iso_rectangle_2::Iso_rectangle_2(Bbox_2)` +
      • `Point_2 Iso_rectangle_2::vertex(int)` +
      • `Point_2 Iso_rectangle_2::operator[](int)` +
      • `Point_2 Iso_rectangle_2::min()` +
      • `Point_2 Iso_rectangle_2::max()` +
      • `FT Iso_rectangle_2::xmin()` +
      • `FT Iso_rectangle_2::ymin()` +
      • `FT Iso_rectangle_2::xmax()` +
      • `FT Iso_rectangle_2::ymax()` +
      • `FT Iso_rectangle_2::min_coord(int)` +
      • `FT Iso_rectangle_2::max_coord(int)` +
      • `Bbox_2 Iso_rectangle_2::bbox()` +
      • `Circle_2::Circle_2(Point_2, FT, Orientation)` +
      • `Circle_2::Circle_2(Point_2, Orientation)` +
      • `Point_2 Circle_2::center()` +
      • `FT Circle_2::squared_radius()` +
      • `Orientation Circle_2::orientation()` +
      • `Circle_2 Circle_2::opposite()` +
      • `Point_3::Point_3(FT, FT, FT)` +
      • `Point_3::Point_3(Weighted_point_3)`
      • `Point_3::Point_3(Origin)` -
      • `Weighted_point_3::Weighted_point_3(double,double)` -
      • `Weighted_point_3::Weighted_point_3(const Point_3&, double = 0)` +
      • `FT Point_3::x()` +
      • `FT Point_3::y()` +
      • `FT Point_3::z()` +
      • `FT Point_3::cartesian(int)` +
      • `FT Point_3::operator[](int)` +
      • `Bbox_3 Point_3::bbox()` +
      • `Vector_3 operator-(Point_3, Origin)` +
      • `Vector_3 operator-(Origin, Point_3)` +
      • `Weighted_point_3::Weighted_point_3(FT, FT, FT)` +
      • `Weighted_point_3::Weighted_point_3(Point_3, FT)` +
      • `Weighted_point_3::Weighted_point_3(Point_3)`
      • `Weighted_point_3::Weighted_point_3(Origin)` -
      • `Vector_3::Vector_3(double,double,double)` -
      • `Direction_3::Direction_3(double,double,double)` -
      • `Direction_3::Direction_3(const Vector_3&)` -
      • `Line_3::Line_3(const Point_3&, const Vector_3&)` -
      • `Line_3::Line_3(const Point_3&, const Direction_3&)` -
      • `Plane_3::Plane_3(double,double,double,double)` -
      • `Circle_3::Circle_3(const Point_3&, double, const Plane_3&)` -
      • `Sphere_3::Sphere_3(const Point_3&, double, Orientation = COUNTERCLOCKWISE)` -
      • `Ray_3::Ray_3(const Point_3&, const Point_3&)` -
      • `Segment_3::Segment_3(const Point_3&, const Point_3&)` -
      • `Triangle_3::Triangle_3(const Point_3&, const Point_3&, const Point_3&)` -
      • `Tetrahedron_3::Tetrahedron_3(const Point_3&, const Point_3&, const Point_3&, const Point_3&)` -
      • `Iso_cuboid_3::Iso_cuboid_3(const Point_3&, const Point_3&)` -
      • `Iso_cuboid_3::Iso_cuboid_3(const Point_3&, const Point_3&, int)` -
      • `Iso_cuboid_3::Iso_cuboid_3(const Point_3&, const Point_3&, const Point_3&, const Point_3&, const Point_3&, const Point_3&)` -
      • `Iso_cuboid_3::Iso_cuboid_3(const Bbox_3&)` -
      • `Kernel::ConstructPoint_3()(const Weighted_point_3&)` -
      • `Kernel::ConstructPoint_3()(Origin)` -
      • `Kernel::ConstructWeightedPoint_3()(const Point_3&, double = 0)` -
      • `Kernel::ConstructWeightedPoint_3()(Origin)` -
      • `Kernel::ConstructVector_3()(Origin, const Point_3&)` -
      • `Kernel::ConstructVector_3()(const Point_3&, Origin)` -
      • `Kernel::ConstructVector_3()(Null_vector)` -
      • `Kernel::ConstructDirection_3()(const Vector_3&)` -
      • `Kernel::ConstructPlane_3()(double,double,double,double)` -
      • `Kernel::ConstructIsoCuboid_3()(const Point_3&, const Point_3&)` -
      • `Kernel::ConstructIsoCuboid_3()(const Point_3&, const Point_3&, int)` -
      • `Kernel::ConstructIsoCuboid_3()(const Point_3&, const Point_3&, const Point_3&, const Point_3&, const Point_3&, const Point_3&)` -
      • `Kernel::ConstructLine_3()(const Point_3&, const Vector_3&)` -
      • `Kernel::ConstructLine_3()(const Point_3&, const Direction_3&)` -
      • `Kernel::ConstructRay_3()(const Point_3&, const Point_3&)` -
      • `Kernel::ConstructSphere_3()(const Point_3&, double, Orientation = COUNTERCLOCKWISE)` -
      • `Kernel::ConstructSphere_3()(const Point_3&, Orientation = COUNTERCLOCKWISE)` -
      • `Kernel::ConstructSegment_3()(const Point_3&, const Point_3&)` -
      • `Kernel::ConstructTriangle_3()(const Point_3&, const Point_3&, const Point_3&)` -
      • `Kernel::ConstructTetrahedron_3()(const Point_3&, const Point_3&, const Point_3&, const Point_3&)` -
      • `Kernel::ConstructCircle_3()(const Point_3&, double, const Plane_3&)` -
      • `Kernel::ConstructCircle_3()( -
      • `Kernel::ConstructVertex_3()(const Segment_3&, int)` -
      • `Kernel::ConstructVertex_3()(const Triangle_3&, int)` -
      • `Kernel::ConstructVertex_3()(const Tetrahedron_3&, int)` -
      • `Kernel::ConstructVertex_3()(const Iso_cuboid_3&, int)` -
      • `Kernel::ConstructSource_3()(const Segment_3&)` -
      • `Kernel::ConstructSource_3()(const Ray_3&)` -
      • `Kernel::ConstructTarget_3()(const Target_3&)` -
      • `Kernel::ConstructMinVertex_3()(const Segment_3&)` -
      • `Kernel::ConstructMinVertex_3()(const Iso_cuboid_3&)` -
      • `Kernel::ConstructMaxVertex_3()(const Segment_3&)` -
      • `Kernel::ConstructMaxVertex_3()(const Iso_cuboid_3&)` -
      • `Kernel::ConstructBbox_3()(const Point_3&)` -
      • `Kernel::ConstructBbox_3()(const Segment_3&)` -
      • `Kernel::ConstructBbox_3()(const Triangle_3&)` -
      • `Kernel::ConstructBbox_3()(const Tetrahedron_3&)` -
      • `Kernel::ConstructBbox_3()(const Iso_cuboid_3&)` -
      • `Kernel::ConstructCenter_3()(const Sphere_3&)` -
      • `Kernel::ConstructCenter_3()(const Circle_3&)` -
      • `Kernel::ConstructSecondPoint_3()(const Ray_3&)` -
      • `Kernel::ConstructOppositeVector_3()(const Vector_3&)` -
      • `Kernel::ConstructOppositeDirection_3()(const Direction_3&)` -
      • `Kernel::ConstructOppositeSegment_3()(const Segment_3&)` -
      • `Kernel::ConstructOppositeRay_3()(const Ray_3&)` -
      • `Kernel::ConstructOppositeLine_3()(const Line_3&)` -
      • `Kernel::ConstructOppositeTriangle_3()(const Triangle_3&)` -
      • `Kernel::ConstructOppositePlane_3()(const Plane_3&)` -
      • `Kernel::ConstructOppositeSphere_3()(const Sphere_3&)` -
      • `Kernel::ConstructOppositeCircle_3()(const Circle_3&)` -
      • `Kernel::ComputeWeight_3()(const Weighted_point_3&)` -
      • `Kernel::ComputeX_3()(const Point_3&)` -
      • `Kernel::ComputeX_3()(const Vector_3&)` -
      • `Kernel::ComputeY_3()(const Point_3&)` -
      • `Kernel::ComputeY_3()(const Vector_3&)` -
      • `Kernel::ComputeZ_3()(const Point_3&)` -
      • `Kernel::ComputeZ_3()(const Vector_3&)` -
      • `Kernel::ComputeA_3()(const Line_3&)` -
      • `Kernel::ComputeB_3()(const Line_3&)` -
      • `Kernel::ComputeC_3()(const Line_3&)` -
      • `Kernel::ComputeD_3()(const Line_3&)` -
      • `Kernel::ComputeDx_3()(const Direction_3&)` -
      • `Kernel::ComputeDy_3()(const Direction_3&)` -
      • `Kernel::ComputeDz_3()(const Direction_3&)` -
      • `Kernel::ComputeXmin_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeXmax_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeYmin_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeYmax_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeZmin_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeZmax_3()(const Iso_cuboid_3&)` -
      • `Kernel::ComputeSquaredRadius_3()(const Sphere_3&)` -
      • `Kernel::ComputeSquaredRadius_3()(const Circle_3&)` -
      • `Kernel::ComputeSquaredRadius_3()(const Point_3&)` -
      • `Kernel::CartesianConstIterator_3()(const Point_3&)` -
      • `Kernel::CartesianConstIterator_3()(const Point_3&, int)` -
      • `Kernel::CartesianConstIterator_3()(const Vector_3&)` -
      • `Kernel::CartesianConstIterator_3()(const Vector_3&, int)` +
      • `Point_3 Weighted_point_3::point()` +
      • `FT Weighted_point_3::weight()` +
      • `FT Weighted_point_3::x()` +
      • `FT Weighted_point_3::y()` +
      • `FT Weighted_point_3::z()` +
      • `FT Weighted_point_3::cartesian(int)` +
      • `FT Weighted_point_3::operator[](int)` +
      • `Bbox_3 Weighted_point_3::bbox()` +
      • `Vector_3::Vector_3(FT, FT, FT)` +
      • `Vector_3::Vector_3(Null_vector)` +
      • `FT Vector_3::x()` +
      • `FT Vector_3::y()` +
      • `FT Vector_3::z()` +
      • `FT Vector_3::cartesian(int)` +
      • `FT Vector_3::operator[](int)` +
      • `Direction_3 Vector_3::direction()` +
      • `Vector_3 Vector_3::opposite()` +
      • `Direction_3::Direction_3(RT, RT, RT)` +
      • `Direction_3::Direction_3(Vector_3)` +
      • `RT Direction_3::delta(int)` +
      • `RT Direction_3::dx()` +
      • `RT Direction_3::dy()` +
      • `RT Direction_3::dz()` +
      • `Direction_3 Direction_3::opposite()` +
      • `Vector_3 Direction_3::vector()` +
      • `Line_3::Line_3(Point_3, Vector_3)` +
      • `Line_3::Line_3(Point_3, Direction_3)` +
      • `Line_3 Line_3::opposite()` +
      • `Vector_3 Line_3::to_vector()` +
      • `Direction_3 Line_3::direction()` +
      • `Plane_3::Plane_3(FT, FT, FT, FT)` +
      • `Plane_3::Plane_3(Circle_3)` +
      • `FT Plane_3::a()` +
      • `FT Plane_3::b()` +
      • `FT Plane_3::c()` +
      • `FT Plane_3::d()` +
      • `Plane_3 Plane_3::opposite()` +
      • `Vector_3 Plane_3::orthogonal_vector()` +
      • `Direction_3 Plane_3::orthogonal_direction()` +
      • `Circle_3::Circle_3(Point_3, FT, Plane_3)` +
      • `Point_3 Circle_3::center()` +
      • `FT Circle_3::squared_radius()` +
      • `FT Circle_3::supporting_plane()` +
      • `Sphere_3 Circle_3::diametral_sphere()` +
      • `Sphere_3::Sphere_3(Point_3, FT, Orientation)` +
      • `Sphere_3::Sphere_3(Point_3, Orientation)` +
      • `Sphere_3::Sphere_3(Circle_3)` +
      • `Point_3 Sphere_3::center()` +
      • `FT Sphere_3::squared_radius()` +
      • `Orientation Sphere_3::orientation()` +
      • `Sphere_3 Sphere_3::opposite()` +
      • `Ray_3::Ray_3(Point_3, Point_3)` +
      • `Point_3 Ray_3::source()` +
      • `Segment_3::Segment_3(Point_3, Point_3)` +
      • `Point_3 Segment_3::source()` +
      • `Point_3 Segment_3::target()` +
      • `Point_3 Segment_3::min()` +
      • `Point_3 Segment_3::max()` +
      • `Point_3 Segment_3::vertex(int)` +
      • `Point_3 Segment_3::point(int)` +
      • `Point_3 Segment_3::operator[](int)` +
      • `Segment_3 Segment_3::opposite()` +
      • `Bbox_3 Segment_3::bbox()` +
      • `Triangle_3::Triangle_3(Point_3, Point_3, Point_3)` +
      • `Point_3 Triangle_3::vertex(int)` +
      • `Point_3 Triangle_3::operator[](int)` +
      • `Bbox_3 Triangle_3::bbox()` +
      • `Tetrahedron_3::Tetrahedron_3(Point_3, Point_3, Point_3, Point_3)` +
      • `Point_3 Tetrahedron_3::vertex(int)` +
      • `Point_3 Tetrahedron_3::operator[](int)` +
      • `Bbox_3 Tetrahedron_3::bbox()` +
      • `Iso_cuboid_3::Iso_cuboid_3(Point_3, Point_3)` +
      • `Iso_cuboid_3::Iso_cuboid_3(Point_3, Point_3, int)` +
      • `Iso_cuboid_3::Iso_cuboid_3(Point_3, Point_3, Point_3, Point_3, Point_3, Point_3)` +
      • `Iso_cuboid_3::Iso_cuboid_3(Bbox_3)` +
      • `Point_3 Iso_cuboid_3::vertex(int)` +
      • `Point_3 Iso_cuboid_3::operator[](int)` +
      • `Point_3 Iso_cuboid_3::min()` +
      • `Point_3 Iso_cuboid_3::max()` +
      • `FT Iso_cuboid_3::xmin()` +
      • `FT Iso_cuboid_3::ymin()` +
      • `FT Iso_cuboid_3::zmin()` +
      • `FT Iso_cuboid_3::xmax()` +
      • `FT Iso_cuboid_3::ymax()` +
      • `FT Iso_cuboid_3::zmax()` +
      • `FT Iso_cuboid_3::min_coord(int)` +
      • `FT Iso_cuboid_3::max_coord(int)` +
      • `Bbox_3 Iso_cuboid_3::bbox()`
      \cgalModels `Kernel` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h b/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h index a32da1d2490d..d2e9a734ad41 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h @@ -31,6 +31,7 @@ class Iso_cuboid_3 { introduces an iso-oriented cuboid `c` with diagonal opposite vertices `p` and `q`. Note that the object is brought in the canonical form. +\cgalEpicExact */ Iso_cuboid_3(const Point_3 &p, const Point_3 &q); @@ -40,6 +41,8 @@ introduces an iso-oriented cuboid `c` with diagonal opposite vertices `p` and `q`. The `int` argument value is only used to distinguish the two overloaded functions. \pre `p.x()<=q.x()`, `p.y()<=q.y()` and `p.z()<=q.z()`. + +\cgalEpicExact */ Iso_cuboid_3(const Point_3 &p, const Point_3 &q, int); @@ -52,6 +55,7 @@ minimal \f$ y\f$ coordinate is the one of `bottom`, the maximal \f$ y\f$ coordinate is the one of `top`, the minimal \f$ z\f$ coordinate is the one of `far`, the maximal \f$ z\f$ coordinate is the one of `close`. +\cgalEpicExact */ Iso_cuboid_3(const Point_3 &left, const Point_3 &right, @@ -75,6 +79,7 @@ const Kernel::RT& hw = RT(1)); /*! If `Kernel::RT` is constructible from double, introduces an iso-oriented cuboid from `bbox`. +\cgalEpicExact */ Iso_cuboid_3(const Bbox_3& bbox); @@ -97,6 +102,7 @@ bool operator!=(const Iso_cuboid_3 &c2) const; /*! returns the i'th vertex modulo 8 of `c`. starting with the lower left vertex. +\cgalEpicExact */ Point_3 vertex(int i) const; @@ -104,52 +110,62 @@ Point_3 vertex(int i) const; returns `vertex(i)`, as indicated in the figure below: \image html IsoCuboid.png \image latex IsoCuboid.png + +\cgalEpicExact */ Point_3 operator[](int i) const; /*! returns the smallest vertex of `c` (= `vertex(0)`). +\cgalEpicExact */ Point_3 min() const; /*! returns the largest vertex of `c` (= `vertex(7)`). +\cgalEpicExact */ Point_3 max() const; /*! returns smallest %Cartesian \f$ x\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT xmin() const; /*! returns smallest %Cartesian \f$ y\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT ymin() const; /*! returns smallest %Cartesian \f$ z\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT zmin() const; /*! returns largest %Cartesian \f$ x\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT xmax() const; /*! returns largest %Cartesian \f$ y\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT ymax() const; /*! returns largest %Cartesian \f$ z\f$-coordinate in `c`. +\cgalEpicExact */ Kernel::FT zmax() const; @@ -157,6 +173,8 @@ Kernel::FT zmax() const; returns `i`-th %Cartesian coordinate of the smallest vertex of `c`. \pre `0 <= i <= 2`. + +\cgalEpicExact */ Kernel::FT min_coord(int i) const; @@ -164,6 +182,8 @@ Kernel::FT min_coord(int i) const; returns `i`-th %Cartesian coordinate of the largest vertex of `c`. \pre `0 <= i <= 2`. + +\cgalEpicExact */ Kernel::FT max_coord(int i) const; @@ -213,6 +233,7 @@ Kernel::FT volume() const; /*! returns a bounding box containing `c`. +\cgalEpicExact */ Bbox_3 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h index d7228803e0e2..764b6ac796f7 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h @@ -32,6 +32,7 @@ class Iso_rectangle_2 { introduces an iso-oriented rectangle `r` with diagonal opposite vertices `p` and `q`. Note that the object is brought in the canonical form. +\cgalEpicExact */ Iso_rectangle_2(const Point_2 &p, const Point_2 &q); @@ -41,6 +42,8 @@ introduces an iso-oriented rectangle `r` with diagonal opposite vertices `p` and `q`. The `int` argument value is only used to distinguish the two overloaded functions. \pre `p.x()<=q.x()` and `p.y()<=q.y()`. + +\cgalEpicExact */ Iso_rectangle_2(const Point_2 &p, const Point_2 &q, @@ -52,6 +55,7 @@ minimal \f$ x\f$ coordinate is the one of `left`, the maximal \f$ x\f$ coordinate is the one of `right`, the minimal \f$ y\f$ coordinate is the one of `bottom`, the maximal \f$ y\f$ coordinate is the one of `top`. +\cgalEpicExact */ Iso_rectangle_2(const Point_2 &left, const Point_2 &right, @@ -71,6 +75,7 @@ const Kernel::RT& hw = RT(1)); /*! If `Kernel::RT` is constructible from double, introduces an iso-oriented rectangle from `bbox`. +\cgalEpicExact */ Iso_rectangle_2(const Bbox_2& bbox); @@ -93,41 +98,49 @@ bool operator!=(const Iso_rectangle_2 &r2) const; /*! returns the i'th vertex modulo 4 of `r` in counterclockwise order, starting with the lower left vertex. +\cgalEpicExact */ Point_2 vertex(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_2 operator[](int i) const; /*! returns the lower left vertex of `r` (= `vertex(0)`). +\cgalEpicExact */ Point_2 min() const; /*! returns the upper right vertex of `r` (= `vertex(2)`). +\cgalEpicExact */ Point_2 max() const; /*! returns the \f$ x\f$ coordinate of lower left vertex of `r`. +\cgalEpicExact */ Kernel::FT xmin() const; /*! returns the \f$ y\f$ coordinate of lower left vertex of `r`. +\cgalEpicExact */ Kernel::FT ymin() const; /*! returns the \f$ x\f$ coordinate of upper right vertex of `r`. +\cgalEpicExact */ Kernel::FT xmax() const; /*! returns the \f$ y\f$ coordinate of upper right vertex of `r`. +\cgalEpicExact */ Kernel::FT ymax() const; @@ -135,6 +148,8 @@ Kernel::FT ymax() const; returns the `i`'th %Cartesian coordinate of the lower left vertex of `r`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT min_coord(int i) const; @@ -142,6 +157,8 @@ Kernel::FT min_coord(int i) const; returns the `i`'th %Cartesian coordinate of the upper right vertex of `r`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT max_coord(int i) const; @@ -191,6 +208,7 @@ Kernel::FT area() const; /*! returns a bounding box containing `r`. +\cgalEpicExact */ Bbox_2 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Line_2.h b/Kernel_23/doc/Kernel_23/CGAL/Line_2.h index 079c65a6eb6c..2cd4a22a791b 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Line_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Line_2.h @@ -47,6 +47,7 @@ class Line_2 { /*! introduces a line `l` with the line equation in %Cartesian coordinates \f$ ax +by +c = 0\f$. +\cgalEpicExact */ Line_2(const Kernel::RT &a, const Kernel::RT &b, const Kernel::RT &c); @@ -98,16 +99,19 @@ bool operator!=(const Line_2 &h) const; /*! returns the first coefficient of `l`. +\cgalEpicExact */ Kernel::RT a() const; /*! returns the second coefficient of `l`. +\cgalEpicExact */ Kernel::RT b() const; /*! returns the third coefficient of `l`. +\cgalEpicExact */ Kernel::RT c() const; @@ -205,6 +209,7 @@ Direction_2 direction() const; /*! returns the line with opposite direction. +\cgalEpicExact */ Line_2 opposite() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Line_3.h b/Kernel_23/doc/Kernel_23/CGAL/Line_3.h index e7b19f591073..57be8fabf5b1 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Line_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Line_3.h @@ -25,12 +25,14 @@ Line_3(const Point_3 &p, const Point_3 &q); /*! introduces a line `l` passing through point `p` with direction `d`. +\cgalEpicExact */ Line_3(const Point_3 &p, const Direction_3&d); /*! introduces a line `l` passing through point `p` and oriented by `v`. +\cgalEpicExact */ Line_3(const Point_3 &p, const Vector_3&v); @@ -100,16 +102,19 @@ Plane_3 perpendicular_plane(const Point_3 &p) const; /*! returns the line with opposite direction. +\cgalEpicExact */ Line_3 opposite() const; /*! returns a vector having the same direction as `l`. +\cgalEpicExact */ Vector_3 to_vector() const; /*! returns the direction of `l`. +\cgalEpicExact */ Direction_3 direction() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h b/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h index 9ef778c7c174..88c71c73700b 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h @@ -29,6 +29,7 @@ creates a plane `h` defined by the equation \f$ a\, px +b\, py +c\, pz + d = 0\f$. Notice that `h` is degenerate if \f$ a = b = c = 0\f$. +\cgalEpicExact */ Plane_3(const Kernel::RT &a, const Kernel::RT &b, @@ -84,6 +85,7 @@ const Point_3 &p); /*! introduces a plane `h` that is defined as the plane containing the circle. +\cgalEpicExact */ Plane_3(const Circle_3 &c); @@ -105,21 +107,25 @@ bool operator!=(const Plane_3 &h2) const; /*! returns the first coefficient of `h`. +\cgalEpicExact */ Kernel::RT a() const; /*! returns the second coefficient of `h`. +\cgalEpicExact */ Kernel::RT b() const; /*! returns the third coefficient of `h`. +\cgalEpicExact */ Kernel::RT c() const; /*! returns the fourth coefficient of `h`. +\cgalEpicExact */ Kernel::RT d() const; @@ -137,6 +143,7 @@ Point_3 projection(const Point_3 &p) const; /*! returns the plane with opposite orientation. +\cgalEpicExact */ Plane_3 opposite() const; @@ -148,12 +155,14 @@ Point_3 point() const; /*! returns a vector that is orthogonal to `h` and that is directed to the positive side of `h`. +\cgalEpicExact */ Vector_3 orthogonal_vector() const; /*! returns the direction that is orthogonal to `h` and that is directed to the positive side of `h`. +\cgalEpicExact */ Direction_3 orthogonal_direction() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Point_2.h b/Kernel_23/doc/Kernel_23/CGAL/Point_2.h index 00ea07ef2fbc..ffa2cf49cc92 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Point_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Point_2.h @@ -55,6 +55,7 @@ typedef unspecified_type Cartesian_const_iterator; /*! introduces a variable `p` with %Cartesian coordinates \f$ (0,0)\f$. +\cgalEpicExact */ Point_2(const Origin &ORIGIN); @@ -66,6 +67,7 @@ Point_2(int x, int y); /*! introduces a point `p` initialized to `(x,y)` provided `RT` supports construction from `double`. +\cgalEpicExact */ Point_2(double x, double y); @@ -77,11 +79,13 @@ Point_2(const Kernel::RT &hx, const Kernel::RT &hy, const Kernel::RT &hw = RT(1) /*! introduces a point `p` initialized to `(x,y)`. +\cgalEpicExact */ Point_2(const Kernel::FT &x, const Kernel::FT &y); /*! introduces a point from a weighted point. +\cgalEpicExact \warning The `explicit` keyword is used to avoid accidental implicit conversions between Point_2 and Weighted_point_2. @@ -141,11 +145,13 @@ Kernel::RT hw() const; /*! returns the %Cartesian \f$ x\f$ coordinate, that is `hx()`/`hw()`. +\cgalEpicExact */ Kernel::FT x() const; /*! returns the %Cartesian \f$ y\f$ coordinate, that is `hy()`/`hw()`. +\cgalEpicExact */ Kernel::FT y() const; @@ -166,12 +172,16 @@ Kernel::RT homogeneous(int i) const; /*! returns the i'th %Cartesian coordinate of `p`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -194,6 +204,7 @@ int dimension() const; /*! returns a bounding box containing `p`. +\cgalEpicExact */ Bbox_2 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Point_3.h b/Kernel_23/doc/Kernel_23/CGAL/Point_3.h index 0babd70a4c84..70db98ff117c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Point_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Point_3.h @@ -40,6 +40,7 @@ typedef unspecified_type Cartesian_const_iterator; /*! introduces a point with %Cartesian coordinates\f$ (0,0,0)\f$. +\cgalEpicExact */ Point_3(const Origin &ORIGIN); @@ -51,6 +52,7 @@ Point_3(int x, int y, int z); /*! introduces a point `p` initialized to `(x,y,z)` provided `RT` supports it. +\cgalEpicExact */ Point_3(double x, double y, double z); @@ -62,6 +64,7 @@ Point_3(const Kernel::RT &hx, const Kernel::RT &hy, const Kernel::RT &hz, const /*! introduces a point `p` initialized to `(x,y,z)`. +\cgalEpicExact */ Point_3(const Kernel::FT &x, const Kernel::FT &y, const Kernel::FT &z); @@ -70,6 +73,8 @@ introduces a point from a weighted point. \warning The `explicit` keyword is used to avoid accidental implicit conversions between Point_3 and Weighted_point_3. + +\cgalEpicExact */ explicit Point_3(const Kernel::Weighted_point_3 &wp); @@ -131,16 +136,19 @@ Kernel::RT hw() const; /*! returns the %Cartesian \f$ x\f$ coordinate, that is `hx()`/`hw()`. +\cgalEpicExact */ Kernel::FT x() const; /*! returns the %Cartesian \f$ y\f$ coordinate, that is `hy()`/`hw()`. +\cgalEpicExact */ Kernel::FT y() const; /*! returns the %Cartesian \f$ z\f$ coordinate, that is `hz()`/`hw()`. +\cgalEpicExact */ Kernel::FT z() const; @@ -161,12 +169,16 @@ Kernel::RT homogeneous(int i) const; /*! returns the i'th %Cartesian coordinate of `p`. \pre `0 <= i <= 2`. + +\cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 2`. + +\cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -189,6 +201,7 @@ int dimension() const; /*! returns a bounding box containing `p`. +\cgalEpicExact */ Bbox_3 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h b/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h index c153b0f9ee38..c38f84606eea 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h @@ -20,6 +20,7 @@ class Ray_2 { /*! introduces a ray `r` with source `p` and passing through point `q`. +\cgalEpicExact */ Ray_2(const Point_2 &p, const Point_2&q); @@ -59,6 +60,7 @@ bool operator!=(const Ray_2 &h) const; /*! returns the source of `r`. +\cgalEpicExact */ Point_2 source() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h b/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h index 86e6efce248a..766e7403240c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h @@ -20,6 +20,7 @@ class Ray_3 { /*! introduces a ray `r` with source `p` and passing through point `q`. +\cgalEpicExact */ Ray_3(const Point_3 &p, const Point_3 &q); @@ -59,6 +60,7 @@ bool operator!=(const Ray_3 &h) const; /*! returns the source of `r` +\cgalEpicExact */ Point_3 source() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h b/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h index 71ae42573350..b2ce17ed50f0 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h @@ -29,6 +29,7 @@ class Segment_2 { introduces a segment `s` with source `p` and target `q`. The segment is directed from the source towards the target. +\cgalEpicExact */ Segment_2(const Point_2 &p, const Point_2 &q); @@ -50,21 +51,25 @@ bool operator!=(const Segment_2 &q) const; /*! returns the source of `s`. +\cgalEpicExact */ Point_2 source() const; /*! returns the target of `s`. +\cgalEpicExact */ Point_2 target() const; /*! returns the point of `s` with lexicographically smallest coordinate. +\cgalEpicExact */ Point_2 min() const; /*! returns the point of `s` with lexicographically largest coordinate. +\cgalEpicExact */ Point_2 max() const; @@ -73,16 +78,19 @@ returns source or target of `s`: `vertex(0)` returns the source of `s`, `vertex(1)` returns the target of `s`. The parameter `i` is taken modulo 2, which gives easy access to the other vertex. +\cgalEpicExact */ Point_2 vertex(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_2 point(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_2 operator[](int i) const; @@ -103,6 +111,7 @@ Vector_2 to_vector() const; /*! returns a segment with source and target point interchanged. +\cgalEpicExact */ Segment_2 opposite() const; @@ -152,6 +161,7 @@ bool collinear_has_on(const Point_2 &p) const; /*! returns a bounding box containing `s`. +\cgalEpicExact */ Bbox_2 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h b/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h index 36dcda524944..dc3dd9b4f1c8 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h @@ -29,6 +29,7 @@ class Segment_3 { introduces a segment `s` with source `p` and target `q`. It is directed from the source towards the target. +\cgalEpicExact */ Segment_3(const Point_3 &p, const Point_3 &q); @@ -50,21 +51,25 @@ bool operator!=(const Segment_3 &q) const; /*! returns the source of `s`. +\cgalEpicExact */ Point_3 source() const; /*! returns the target of `s`. +\cgalEpicExact */ Point_3 target() const; /*! returns the point of `s` with smallest coordinate (lexicographically). +\cgalEpicExact */ Point_3 min() const; /*! returns the point of `s` with largest coordinate (lexicographically). +\cgalEpicExact */ Point_3 max() const; @@ -73,16 +78,19 @@ returns source or target of `s`: `vertex(0)` returns the source, `vertex(1)` returns the target. The parameter `i` is taken modulo 2, which gives easy access to the other vertex. +\cgalEpicExact */ Point_3 vertex(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_3 point(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_3 operator[](int i) const; @@ -103,6 +111,7 @@ Direction_3 direction() const; /*! returns a segment with source and target interchanged. +\cgalEpicExact */ Segment_3 opposite() const; @@ -126,6 +135,7 @@ bool has_on(const Point_3 &p) const; /*! returns a bounding box containing `s`. +\cgalEpicExact */ Bbox_3 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h b/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h index f8541de6dd30..04fef101b3c9 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h @@ -29,6 +29,8 @@ It is initialized to the sphere with center `center`, squared radius `squared_radius` and orientation `orientation`. \pre `orientation != COPLANAR` and `squared_radius >= 0`. + +\cgalEpicExact */ Sphere_3( const Point_3 & center, const Kernel::FT & squared_radius, @@ -78,6 +80,8 @@ It is initialized to the sphere with center `center`, squared radius zero and orientation `orientation`. \pre `orientation != COPLANAR`. \post `c.is_degenerate()` = `true`. + +\cgalEpicExact */ Sphere_3( const Point_3 & center, const Orientation& orientation = COUNTERCLOCKWISE); @@ -86,6 +90,7 @@ Sphere_3( const Point_3 & center, introduces a variable `c` of type `Sphere_3`. It is initialized to the diametral sphere of the circle. +\cgalEpicExact */ Sphere_3( const Circle_3 & c ); @@ -97,18 +102,21 @@ Sphere_3( const Circle_3 & c ); /*! returns the center of `c`. +\cgalEpicExact */ const Point_3 & center( ) const; /*! returns the squared radius of `c`. +\cgalEpicExact */ Kernel::FT const& squared_radius( ) const; /*! returns the orientation of `c`. +\cgalEpicExact */ Orientation const& orientation( ) const; @@ -202,6 +210,7 @@ bool has_on(const Circle_3 &p) const; returns the sphere with the same center and squared radius as `c` but with opposite orientation. +\cgalEpicExact */ Sphere_3 opposite() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h b/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h index 649a874e2423..d045765309e6 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h @@ -29,6 +29,7 @@ class Tetrahedron_3 { /*! introduces a tetrahedron `t` with vertices `p0`, `p1`, `p2` and `p3`. +\cgalEpicExact */ Tetrahedron_3(const Point_3 &p0, const Point_3 &p1, @@ -54,11 +55,13 @@ bool operator!=(const Tetrahedron_3 &t2) const; /*! returns the i'th vertex modulo 4 of `t`. +\cgalEpicExact */ Point_3 vertex(int i) const; /*! returns `vertex(int i)`. +\cgalEpicExact */ Point_3 operator[](int i) const; @@ -129,6 +132,7 @@ Kernel::FT volume() const; /*! returns a bounding box containing `t`. +\cgalEpicExact */ Bbox_3 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h index e19f43bc5226..8812fe4d09cb 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h @@ -25,6 +25,7 @@ class Triangle_2 { /*! introduces a triangle `t` with vertices `p`, `q` and `r`. +\cgalEpicExact */ Triangle_2(const Point_2 &p, const Point_2 &q, @@ -49,11 +50,13 @@ bool operator!=(const Triangle_2 &t2) const; /*! returns the i'th vertex modulo 3 of `t`. +\cgalEpicExact */ Point_2 vertex(int i) const; /*! returns `vertex(i)`. +\cgalEpicExact */ Point_2 operator[](int i) const; @@ -127,6 +130,7 @@ bool has_on_unbounded_side(const Point_2 &p) const; returns a triangle where the boundary is oriented the other way round (this flips the positive and the negative side, but not the bounded and unbounded side). +\cgalEpicExact */ Triangle_2 opposite(); @@ -137,6 +141,7 @@ Kernel::FT area() const; /*! returns a bounding box containing `t`. +\cgalEpicExact */ Bbox_2 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h b/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h index d0dadad48b80..1f9396d91e54 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h @@ -20,6 +20,7 @@ class Triangle_3 { /*! introduces a triangle `t` with vertices `p`, `q` and `r`. +\cgalEpicExact */ Triangle_3(const Point_3 &p, const Point_3 &q, @@ -44,11 +45,13 @@ bool operator!=(const Triangle_3 &t2) const; /*! returns the i'th vertex modulo 3 of `t`. +\cgalEpicExact */ Point_3 vertex(int i) const; /*! returns `vertex(int i)`. +\cgalEpicExact */ Point_3 operator[](int i) const; @@ -86,6 +89,7 @@ Kernel::FT squared_area() const; /*! returns a bounding box containing `t`. +\cgalEpicExact */ Bbox_3 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h index eaeab03a882a..c8b45010ae48 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h @@ -66,6 +66,7 @@ Vector_2(int x, int y); /*! introduces a vector `v` initialized to `(x,y)`. +\cgalEpicExact */ Vector_2(double x, double y); @@ -77,6 +78,7 @@ Vector_2(const Kernel::RT &hx, const Kernel::RT &hy, const Kernel::RT &hw = RT(1 /*! introduces a vector `v` initialized to `(x,y)`. +\cgalEpicExact */ Vector_2(const Kernel::FT &x, const Kernel::FT &y); @@ -107,11 +109,13 @@ Kernel::RT hw() const; /*! returns the `x`-coordinate of `v`, that is `hx()`/`hw()`. +\cgalEpicExact */ Kernel::FT x() const; /*! returns the `y`-coordinate of `v`, that is `hy()`/`hw()`. +\cgalEpicExact */ Kernel::FT y() const; @@ -133,12 +137,16 @@ Kernel::RT homogeneous(int i) const; /*! returns the i'th Cartesian coordinate of `v`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 1`. + +\cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -161,6 +169,7 @@ int dimension() const; /*! returns the direction which passes through `v`. +\cgalEpicExact */ Direction_2 direction() const; @@ -216,6 +225,7 @@ Vector_2& operator-=(const Vector_2 &w); /*! returns the opposite vector. +\cgalEpicExact */ Vector_2 operator-() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h index d126bd977403..e1c38752e677 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h @@ -59,6 +59,7 @@ Vector_3(const Line_3 &l); /*! introduces a null vector `v`. +\cgalEpicExact */ Vector_3(const Null_vector &NULL_VECTOR); @@ -69,6 +70,7 @@ Vector_3(int x, int y, int z); /*! introduces a vector `v` initialized to `(x, y, z)`. +\cgalEpicExact */ Vector_3(double x, double y, double z); @@ -79,6 +81,7 @@ Vector_3(const Kernel::RT &hx, const Kernel::RT &hy, const Kernel::RT &hz, const /*! introduces a vector `v` initialized to `(x, y, z)`. +\cgalEpicExact */ Vector_3(const Kernel::FT &x, const Kernel::FT &y, const Kernel::FT &z); @@ -114,16 +117,19 @@ Kernel::RT hw() const; /*! returns the `x`-coordinate of `v`, that is `hx()`/`hw()`. +\cgalEpicExact */ Kernel::FT x() const; /*! returns the `y`-coordinate of `v`, that is `hy()`/`hw()`. +\cgalEpicExact */ Kernel::FT y() const; /*! returns the `z` coordinate of `v`, that is `hz()`/`hw()`. +\cgalEpicExact */ Kernel::FT z() const; @@ -144,12 +150,16 @@ Kernel::RT homogeneous(int i) const; /*! returns the i'th %Cartesian coordinate of `v`. \pre `0 <= i <= 2` + +\cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 2` + +\cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -177,6 +187,8 @@ Vector_3 transform(const Aff_transformation_3 &t) const; /*! returns the direction of `v`. + +\cgalEpicExact */ Direction_3 direction() const; @@ -220,6 +232,7 @@ Vector_3& operator-=(const Vector_3 &w); /*! Returns the opposite vector. +\cgalEpicExact */ Vector_3 operator-() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h index 01a147e6d645..a61368add0ed 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h @@ -43,12 +43,14 @@ class Weighted_point_2 /*! introduces a weighted point with %Cartesian coordinates `(0,0)` and weight `0`. + \cgalEpicExact */ Weighted_point_2(const Origin &ORIGIN); /*! introduces a weighted point from point `p` and weight `0`. - + \cgalEpicExact + \warning The `explicit` keyword is used to avoid accidental implicit conversions between Point_2 and Weighted_point_2. */ @@ -56,11 +58,13 @@ class Weighted_point_2 /*! introduces a weighted point from point `p` and weight `w`. + \cgalEpicExact */ Weighted_point_2(const Point_2& p, Kernel::FT& w); /*! introduces a weighted point with coordinates `x`, `y`, and weight `0`. + \cgalEpicExact */ Weighted_point_2(const Kernel::FT& x, const Kernel::FT& y); @@ -71,11 +75,13 @@ class Weighted_point_2 /*! returns the point of the weighted point. + \cgalEpicExact */ Point_2 point() const; /*! returns the weight of the weighted point. + \cgalEpicExact */ Kernel::FT weight() const; /// @} @@ -129,11 +135,13 @@ class Weighted_point_2 /*! returns the %Cartesian \f$ x\f$ coordinate, that is `hx()`/`hw()`. + \cgalEpicExact */ Kernel::FT x() const; /*! returns the %Cartesian \f$ y\f$ coordinate, that is `hy()`/`hw()`. + \cgalEpicExact */ Kernel::FT y() const; @@ -154,12 +162,16 @@ class Weighted_point_2 /*! returns the i'th %Cartesian coordinate of `p`. \pre `0 <= i <= 1` + + \cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 1` + + \cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -182,6 +194,7 @@ class Weighted_point_2 /*! returns a bounding box containing `p`. + \cgalEpicExact */ Bbox_2 bbox() const; diff --git a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h index 3dcb39e1786b..22a1f071fe74 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h @@ -43,6 +43,7 @@ class Weighted_point_3 /*! introduces a weighted point with %Cartesian coordinates `(0,0,0)` and weight `0`. + \cgalEpicExact */ Weighted_point_3(const Origin &ORIGIN); @@ -51,16 +52,20 @@ class Weighted_point_3 \warning The `explicit` keyword is used to avoid accidental implicit conversions between Point_3 and Weighted_point_3. + + \cgalEpicExact */ explicit Weighted_point_3(const Point_3& p); /*! introduces a weighted point from point `p` and weight `w`. + \cgalEpicExact */ Weighted_point_3(const Point_3& p, Kernel::FT& w); /*! introduces a weighted point with coordinates `x`, `y`, `z` and weight `0`. + \cgalEpicExact */ Weighted_point_3(const Kernel::FT& x, const Kernel::FT& y, const Kernel::FT& z); @@ -71,11 +76,13 @@ class Weighted_point_3 /*! returns the point of the weighted point. + \cgalEpicExact */ Point_3 point() const; /*! returns the weight of the weighted point. + \cgalEpicExact */ Kernel::FT weight() const; /// @} @@ -134,16 +141,19 @@ class Weighted_point_3 /*! returns the %Cartesian \f$ x\f$ coordinate, that is `hx()`/`hw()`. + \cgalEpicExact */ Kernel::FT x() const; /*! returns the %Cartesian \f$ y\f$ coordinate, that is `hy()`/`hw()`. + \cgalEpicExact */ Kernel::FT y() const; /*! returns the %Cartesian \f$ z\f$ coordinate, that is `hz()`/`hw()`. + \cgalEpicExact */ Kernel::FT z() const; @@ -164,12 +174,16 @@ class Weighted_point_3 /*! returns the i'th %Cartesian coordinate of `p`. \pre `0 <= i <= 2` + + \cgalEpicExact */ Kernel::FT cartesian(int i) const; /*! returns `cartesian(i)`. \pre `0 <= i <= 2` + + \cgalEpicExact */ Kernel::FT operator[](int i) const; @@ -192,6 +206,7 @@ class Weighted_point_3 /*! returns a bounding box containing `p`. + \cgalEpicExact */ Bbox_3 bbox() const; From f6451700d13abd352ff3426effb37ff5c4038bef Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 27 Apr 2023 15:19:35 +0200 Subject: [PATCH 0256/1398] fix memory leak --- AABB_tree/demo/AABB_tree/MainWindow.cpp | 2 +- AABB_tree/demo/AABB_tree/MainWindow.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index 4321e396b8d4..cd1444b9968c 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -16,7 +16,7 @@ MainWindow::MainWindow(QWidget* parent) - : CGAL::Qt::DemosMainWindow(parent), myEngine(new QJSEngine()) + : CGAL::Qt::DemosMainWindow(parent), myEngine(new QJSEngine(this)) { ui = new Ui::MainWindow; ui->setupUi(this); diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index 50cd927a7cb4..87f6de0c76c9 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -23,7 +23,7 @@ struct Foo : public QObject QJSEngine* myEngine; Foo() - : myEngine(new QJSEngine()) + : myEngine(new QJSEngine(this)) { QJSValue baz = myEngine->newQObject(this); myEngine->.globalObject().setProperty("baz", baz); From 003ce240b65d2563fbb9799262c9912df32b5893 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 27 Apr 2023 15:34:53 +0200 Subject: [PATCH 0257/1398] Added EPIC exact tag for the (two relevant) global functions. --- .../CGAL/Exact_predicates_inexact_constructions_kernel.h | 4 ++++ Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h index 8a5e33aa5fc8..3349ebca9777 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h @@ -204,6 +204,10 @@ are trivial:

    • `FT Iso_cuboid_3::min_coord(int)`
    • `FT Iso_cuboid_3::max_coord(int)`
    • `Bbox_3 Iso_cuboid_3::bbox()` +
    • `Point_2 min_vertex(Iso_rectangle_2)` +
    • `Point_2 min_vertex(Iso_cuboid_3)` +
    • `Point_2 max_vertex(Iso_rectangle_2)` +
    • `Point_2 max_vertex(Iso_cuboid_3)`
    \cgalModels `Kernel` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h b/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h index 6be2530b49b6..7ac44aca209b 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h @@ -2242,12 +2242,14 @@ const CGAL::Point_3& q); /*! computes the vertex with the lexicographically largest coordinates of the iso rectangle `ir`. +\cgalEpicExact */ template CGAL::Point_2 max_vertex( const CGAL::Iso_rectangle_2& ir ); /*! computes the vertex with the lexicographically largest coordinates of the iso cuboid `ic`. +\cgalEpicExact */ template CGAL::Point_3 max_vertex( const CGAL::Iso_cuboid_3& ic ); @@ -2292,12 +2294,14 @@ CGAL::Point_3 midpoint( const CGAL::Segment_3& s ); /*! computes the vertex with the lexicographically smallest coordinates of the iso rectangle `ir`. +\cgalEpicExact */ template CGAL::Point_2 min_vertex( const CGAL::Iso_rectangle_2& ir ); /*! computes the vertex with the lexicographically smallest coordinates of the iso cuboid `ic`. +\cgalEpicExact */ template CGAL::Point_3 min_vertex( const CGAL::Iso_cuboid_3& ic ); From 4ad2561b39332ed3a82f6b7e33e352705d96d372 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 27 Apr 2023 16:52:25 +0200 Subject: [PATCH 0258/1398] remove trailing whitespace --- .../Exact_predicates_inexact_constructions_kernel.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h index 3349ebca9777..aa14c521c2e9 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h @@ -6,12 +6,12 @@ namespace CGAL { A typedef to a kernel that has the following properties: -
      -
    • It uses %Cartesian representation. -
    • It supports constructions of points from `double` %Cartesian -coordinates. -
    • It provides exact geometric predicates, but geometric -constructions are not exact in general. +
        +
      • It uses %Cartesian representation. +
      • It supports constructions of points from `double` %Cartesian +coordinates. +
      • It provides exact geometric predicates, but geometric +constructions are not exact in general.
      Trivial Constructions
      From 721aafd22ed39c7ad46d7ea20d90cc2bb6dfa10c Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 27 Apr 2023 17:49:50 +0200 Subject: [PATCH 0259/1398] remove trailing whitespace --- Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h index a61368add0ed..2b0fe496d5e6 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h @@ -50,7 +50,7 @@ class Weighted_point_2 /*! introduces a weighted point from point `p` and weight `0`. \cgalEpicExact - + \warning The `explicit` keyword is used to avoid accidental implicit conversions between Point_2 and Weighted_point_2. */ @@ -162,7 +162,7 @@ class Weighted_point_2 /*! returns the i'th %Cartesian coordinate of `p`. \pre `0 <= i <= 1` - + \cgalEpicExact */ Kernel::FT cartesian(int i) const; @@ -170,7 +170,7 @@ class Weighted_point_2 /*! returns `cartesian(i)`. \pre `0 <= i <= 1` - + \cgalEpicExact */ Kernel::FT operator[](int i) const; From a5cfd5ebad33a96b2ffc28b77f983ca90b0e63d3 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Fri, 28 Apr 2023 09:09:55 +0200 Subject: [PATCH 0260/1398] add cgalepicexact macro for all doxygen versions --- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.14/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.20/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.4/BaseDoxyfile.in | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 69351ed254e8..1cc6aa39585e 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -359,7 +359,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd=
    \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalEpicExact=
    Exactness
    This construction is trivial and therefore always exact in `Exact_predicates_inexact_constructions_kernel`.
    " # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" diff --git a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in index 1a59e5d2d97f..3a280dbad850 100644 --- a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in @@ -353,7 +353,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd= \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalEpicExact=
    Exactness
    This construction is trivial and therefore always exact in `Exact_predicates_inexact_constructions_kernel`.
    " # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For diff --git a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in index f950a6836db9..1c3073af6f9a 100644 --- a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in @@ -375,7 +375,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd= \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalEpicExact=
    Exactness
    This construction is trivial and therefore always exact in `Exact_predicates_inexact_constructions_kernel`.
    " # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources diff --git a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in index 70267fd649dc..4532a3fc4a18 100644 --- a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in @@ -365,6 +365,7 @@ ALIASES+= "cgalParamNEnd= \htmlonly[block] \endhtmlonly
    Exactness
    This construction is trivial and therefore always exact in `Exact_predicates_inexact_constructions_kernel`.
    " # This tag can be used to specify a number of word-keyword mappings (TCL only). From a10460dd31365c64f5ddf581eb24ce9cfdf1430a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 28 Apr 2023 14:05:01 +0200 Subject: [PATCH 0261/1398] Remove trailing whitespaces --- Polyhedron/demo/Polyhedron/MainWindow.h | 2 +- Three/include/CGAL/Three/exceptions.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index f0c3adca0078..d970c1813ef3 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -451,7 +451,7 @@ protected Q_SLOTS: //! Calls evaluate_script(script, filename, true). void evaluate_script_quiet(QString script, const QString & fileName = QString()); - #endif + #endif QMutex mutex; QWaitCondition wait_condition; diff --git a/Three/include/CGAL/Three/exceptions.h b/Three/include/CGAL/Three/exceptions.h index 15fa13cd320d..417798cd469f 100644 --- a/Three/include/CGAL/Three/exceptions.h +++ b/Three/include/CGAL/Three/exceptions.h @@ -127,7 +127,7 @@ wrap_a_call_to_cpp(Callable f, return Return_type(); } } -#endif +#endif } // end namespace Three } // end namespace CGAL From db652acef2a84f940c627b1681c58c6f2ae9f985 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 28 Apr 2023 15:31:35 +0200 Subject: [PATCH 0262/1398] add Qt6 to the CI tests --- .github/install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/install.sh b/.github/install.sh index 32b8552aa8f6..d19a714ae79a 100755 --- a/.github/install.sh +++ b/.github/install.sh @@ -2,7 +2,8 @@ sudo apt-get update sudo apt-get install -y libmpfr-dev \ libeigen3-dev qtbase5-dev libqt5sql5-sqlite libqt5opengl5-dev qtscript5-dev \ - libqt5svg5-dev qttools5-dev qttools5-dev-tools libboost-dev libinsighttoolkit4-dev zsh + libqt5svg5-dev qttools5-dev qttools5-dev-tools libboost-dev libinsighttoolkit4-dev zsh \ + qt6-base-dev qt6-declarative-dev #update cmake to 3.18.4 sudo apt purge --auto-remove cmake cd /tmp From 932ba31013d494b191261ed15455b491ad07d155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:08:58 +0200 Subject: [PATCH 0263/1398] bump CGAL version to 6.0 --- Installation/include/CGAL/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index d90474f89134..482cd7db1a64 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,12 +17,12 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 5.6-beta1 +#define CGAL_VERSION 6.0-beta1 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1050600910 +#define CGAL_VERSION_NR 1060000910 #define CGAL_SVN_REVISION 99999 -#define CGAL_RELEASE_DATE 20230430 +#define CGAL_RELEASE_DATE 20231001 #include From fcd71fa9f3612a3e04a4413a7940e756d5109b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:16:28 +0200 Subject: [PATCH 0264/1398] CGAL now requires C++17 --- Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake index 7329be331166..de0f5eb7fa4f 100644 --- a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake @@ -97,8 +97,8 @@ function(CGAL_setup_CGAL_dependencies target) target_compile_definitions(${target} INTERFACE CGAL_TEST_SUITE=1) endif() - # CGAL now requires C++14. `decltype(auto)` is used as a marker of C++14. - target_compile_features(${target} INTERFACE cxx_decltype_auto) + # CGAL now requires C++17 + target_compile_features(${target} INTERFACE cxx_std_17) use_CGAL_Boost_support(${target} INTERFACE) From 4fb4ca2b53dc64a9deab3b05d3e0aacfa075369d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 23:37:15 +0200 Subject: [PATCH 0265/1398] std::empty needs c++17 remove this commit before merging in 6.0 --- BGL/include/CGAL/boost/graph/helpers.h | 2 +- Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index fb585f04acc0..34597b221923 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -993,7 +993,7 @@ void clear(FaceGraph& g) template bool is_empty(const FaceGraph& g) { - return std::empty(vertices(g)); + return boost::empty(vertices(g)); } /// \ingroup PkgBGLHelperFct diff --git a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp index fb464e110f7c..7b3051fdd3e7 100644 --- a/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_c3t3_item.cpp @@ -306,7 +306,7 @@ void Scene_c3t3_item::compute_bbox() const _bbox = Bbox(result.xmin(), result.ymin(), result.zmin(), result.xmax(), result.ymax(), result.zmax()); - if (std::empty(c3t3().cells_in_complex())) + if (boost::empty(c3t3().cells_in_complex())) { for (Tr::Vertex_handle v : c3t3().triangulation().finite_vertex_handles()) { From af337edf4db8ced98bea5b59d72333a7d56aee45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sat, 29 Apr 2023 08:35:13 +0200 Subject: [PATCH 0266/1398] boost::reference_wrapper ---> std::reference_wrapper --- BGL/include/CGAL/boost/graph/visitor.h | 339 ++++++++++++------------- 1 file changed, 168 insertions(+), 171 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/visitor.h b/BGL/include/CGAL/boost/graph/visitor.h index 085c6ce01d9f..f7df1e748b21 100644 --- a/BGL/include/CGAL/boost/graph/visitor.h +++ b/BGL/include/CGAL/boost/graph/visitor.h @@ -14,13 +14,13 @@ #include #include -#include +#include namespace boost { template struct graph_traits< - boost::tuple, boost::reference_wrapper > > + boost::tuple, std::reference_wrapper > > : boost::graph_traits< Graph > { typedef boost::graph_traits Base; @@ -29,20 +29,20 @@ namespace boost template struct graph_traits< - boost::tuple, boost::reference_wrapper > const > + boost::tuple, std::reference_wrapper > const > : boost::graph_traits< Graph > {}; template struct property_map< - boost::tuple, boost::reference_wrapper >, + boost::tuple, std::reference_wrapper >, PropertyTag> : public property_map {}; template struct property_map< - const boost::tuple, boost::reference_wrapper >, + const boost::tuple, std::reference_wrapper >, PropertyTag> : public property_map {}; @@ -52,11 +52,11 @@ namespace boost namespace CGAL { template -boost::tuple, - boost::reference_wrapper > +boost::tuple, + std::reference_wrapper > make_graph_with_visitor(V& v, Graph& g) { - return boost::make_tuple(boost::ref(v), boost::ref(g)); + return boost::make_tuple(std::ref(v), std::ref(g)); } template @@ -67,11 +67,8 @@ class Visitor_base typedef typename gt::halfedge_descriptor halfedge_descriptor; typedef typename gt::edge_descriptor edge_descriptor; typedef typename gt::vertex_descriptor vertex_descriptor; - - }; - //// OVERLOADS FOR Visitor template @@ -260,119 +257,119 @@ void get(PropertyTag ptag, const Visitor_base& w) template typename boost::graph_traits::vertices_size_type -num_vertices(const boost::tuple, - boost::reference_wrapper >& w) +num_vertices(const boost::tuple, + std::reference_wrapper >& w) { - num_vertices(boost::unwrap_ref(w.get<0>())); - return num_vertices(boost::unwrap_ref(w.get<1>())); + num_vertices(get<0>(w).get()); + return num_vertices(get<1>(w).get()); } template typename boost::graph_traits::edges_size_type -num_edges(const boost::tuple, - boost::reference_wrapper >& w) +num_edges(const boost::tuple, + std::reference_wrapper >& w) { - num_edges(boost::unwrap_ref(w.get<0>())); - return num_edges(boost::unwrap_ref(w.get<1>())); + num_edges(get<0>(w).get()); + return num_edges(get<1>(w).get()); } template typename boost::graph_traits::degree_size_type degree(typename boost::graph_traits::vertex_descriptor v - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - degree(v, boost::unwrap_ref(w.get<0>())); - return degree(v, boost::unwrap_ref(w.get<1>())); + degree(v, get<0>(w).get()); + return degree(v, get<1>(w).get()); } template typename boost::graph_traits::degree_size_type out_degree(typename boost::graph_traits::vertex_descriptor v - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - out_degree(v, boost::unwrap_ref(w.get<0>())); - return out_degree(v, boost::unwrap_ref(w.get<1>())); + out_degree(v, get<0>(w).get()); + return out_degree(v, get<1>(w).get()); } template typename boost::graph_traits::degree_size_type in_degree(typename boost::graph_traits::vertex_descriptor v - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - in_degree(v, boost::unwrap_ref(w.get<0>())); - return in_degree(v, boost::unwrap_ref(w.get<1>())); + in_degree(v, get<0>(w).get()); + return in_degree(v, get<1>(w).get()); } template typename boost::graph_traits::vertex_descriptor source(typename boost::graph_traits::edge_descriptor e - , const boost::tuple, - boost::reference_wrapper > & w) + , const boost::tuple, + std::reference_wrapper > & w) { - source(e, boost::unwrap_ref(w.get<0>())); - return source(e, boost::unwrap_ref(w.get<1>())); + source(e, get<0>(w).get()); + return source(e, get<1>(w).get); } template typename boost::graph_traits::vertex_descriptor target(typename boost::graph_traits::edge_descriptor e - , const boost::tuple, - boost::reference_wrapper > & w) + , const boost::tuple, + std::reference_wrapper > & w) { - target(e, boost::unwrap_ref(w.get<0>())); - return target(e, boost::unwrap_ref(w.get<1>())); + target(e, get<0>(w).get()); + return target(e, get<1>(w).get()); } template std::pair::edge_descriptor, bool> edge(typename boost::graph_traits::vertex_descriptor u , typename boost::graph_traits::vertex_descriptor v - , const boost::tuple, - boost::reference_wrapper > & w) + , const boost::tuple, + std::reference_wrapper > & w) { - edge(u, v, boost::unwrap_ref(w.get<0>())); - return edge(u, v, boost::unwrap_ref(w.get<1>())); + edge(u, v, get<0>(w).get()); + return edge(u, v, get<1>(w).get); } template inline CGAL::Iterator_range::vertex_iterator> -vertices(const boost::tuple, - boost::reference_wrapper >& w) +vertices(const boost::tuple, + std::reference_wrapper >& w) { - vertices(boost::unwrap_ref(w.get<0>())); - return vertices(boost::unwrap_ref(w.get<1>())); + vertices(get<0>(w).get()); + return vertices(get<1>(w).get()); } template inline CGAL::Iterator_range::edge_iterator> -edges(const boost::tuple, - boost::reference_wrapper >& w) +edges(const boost::tuple, + std::reference_wrapper >& w) { - edges(boost::unwrap_ref(w.get<0>())); - return edges(boost::unwrap_ref(w.get<1>())); + edges(get<0>(w).get()); + return edges(get<1>(w).get()); } template inline CGAL::Iterator_range::in_edge_iterator> in_edges(typename boost::graph_traits::vertex_descriptor u - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - in_edges(u, boost::unwrap_ref(w.get<0>())); - return in_edges(u, boost::unwrap_ref(w.get<1>())); + in_edges(u, get<0>(w).get()); + return in_edges(u, get<1>(w).get()); } template inline CGAL::Iterator_range::out_edge_iterator> out_edges(typename boost::graph_traits::vertex_descriptor u - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - out_edges(u, boost::unwrap_ref(w.get<0>())); - return out_edges(u, boost::unwrap_ref(w.get<1>())); + out_edges(u, get<0>(w).get()); + return out_edges(u, get<1>(w).get()); } // @@ -381,72 +378,72 @@ out_edges(typename boost::graph_traits::vertex_descriptor u template typename boost::graph_traits< Graph >::vertex_descriptor -add_vertex(boost::tuple, - boost::reference_wrapper >& w) +add_vertex(boost::tuple, + std::reference_wrapper >& w) { - add_vertex(boost::unwrap_ref(w.get<0>())); - return add_vertex(boost::unwrap_ref(w.get<1>())); + add_vertex(get<0>(w).get()); + return add_vertex(get<1>(w).get()); } template typename boost::graph_traits< Graph >::vertex_descriptor add_vertex(const typename boost::graph_traits::vertex_property_type& p - , boost::tuple, - boost::reference_wrapper >& w) + , boost::tuple, + std::reference_wrapper >& w) { - add_vertex(p, boost::unwrap_ref(w.get<0>())); - return add_vertex(p, boost::unwrap_ref(w.get<1>())); + add_vertex(p, get<0>(w).get()); + return add_vertex(p, get<1>(w).get()); } template void remove_vertex(typename boost::graph_traits< Graph >::vertex_descriptor v - , boost::tuple, - boost::reference_wrapper >& w) + , boost::tuple, + std::reference_wrapper >& w) { - remove_vertex(v, boost::unwrap_ref(w.get<0>())); - remove_vertex(v, boost::unwrap_ref(w.get<1>())); + remove_vertex(v, get<0>(w).get()); + remove_vertex(v, get<1>(w).get()); } template typename boost::graph_traits< Graph >::edge_descriptor -add_edge(boost::tuple, - boost::reference_wrapper >& w) +add_edge(boost::tuple, + std::reference_wrapper >& w) { - add_edge(boost::unwrap_ref(w.get<0>())); - return add_edge(boost::unwrap_ref(w.get<1>())); + add_edge(get<0>(w).get()); + return add_edge(get<1>(w).get()); } template void remove_edge(typename boost::graph_traits< Graph >::edge_descriptor e -, boost::tuple, - boost::reference_wrapper >& w) +, boost::tuple, + std::reference_wrapper >& w) { - remove_edge(e, boost::unwrap_ref(w.get<0>())); - remove_edge(e, boost::unwrap_ref(w.get<1>())); + remove_edge(e, get<0>(w).get()); + remove_edge(e, get<1>(w).get()); } template void set_target(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::vertex_descriptor v -, boost::tuple, - boost::reference_wrapper >& w) +, boost::tuple, + std::reference_wrapper >& w) { - set_target(h1, v, boost::unwrap_ref(w.get<0>())); - set_target(h1, v, boost::unwrap_ref(w.get<1>())); + set_target(h1, v, get<0>(w).get()); + set_target(h1, v, get<1>(w).get()); } template void set_next(typename boost::graph_traits< Graph >::halfedge_descriptor h1 , typename boost::graph_traits< Graph >::halfedge_descriptor h2 - , boost::tuple, - boost::reference_wrapper >& w) + , boost::tuple, + std::reference_wrapper >& w) { - set_next(h1, h2, boost::unwrap_ref(w.get<0>())); - set_next(h1, h2, boost::unwrap_ref(w.get<1>())); + set_next(h1, h2, get<0>(w).get()); + set_next(h1, h2, get<1>(w).get()); } // @@ -454,65 +451,65 @@ set_next(typename boost::graph_traits< Graph >::halfedge_descriptor h1 // template typename boost::graph_traits< Graph >::face_descriptor -add_face(boost::tuple, - boost::reference_wrapper >& w) +add_face(boost::tuple, + std::reference_wrapper >& w) { - add_face(boost::unwrap_ref(w.get<0>())); - return add_face(boost::unwrap_ref(w.get<1>())); + add_face(get<0>(w).get()); + return add_face(get<1>(w).get()); } template typename boost::graph_traits< Graph >::face_descriptor add_face(InputIterator begin, InputIterator end, - boost::tuple, - boost::reference_wrapper >& w) + boost::tuple, + std::reference_wrapper >& w) { - add_face(begin, end, boost::unwrap_ref(w.get<0>())); - return add_face(begin, end, boost::unwrap_ref(w.get<1>())); + add_face(begin, end, get<0>(w).get()); + return add_face(begin, end, get<1>(w).get()); } template void remove_face(typename boost::graph_traits< Graph >::face_descriptor f -, boost::tuple, -boost::reference_wrapper >& w) +, boost::tuple, +std::reference_wrapper >& w) { - remove_face(f, boost::unwrap_ref(w.get<0>())); - return remove_face(f, boost::unwrap_ref(w.get<1>())); + remove_face(f, get<0>(w).get()); + return remove_face(f, get<1>(w).get()); } template void set_face(typename boost::graph_traits< Graph >::halfedge_descriptor h , typename boost::graph_traits< Graph >::face_descriptor f -, const boost::tuple, -boost::reference_wrapper >& w) +, const boost::tuple, +std::reference_wrapper >& w) { - set_face(h, f, boost::unwrap_ref(w.get<0>())); - set_face(h, f, boost::unwrap_ref(w.get<1>())); + set_face(h, f, get<0>(w).get()); + set_face(h, f, get<1>(w).get()); } template void set_halfedge(typename boost::graph_traits< Graph >::face_descriptor f , typename boost::graph_traits< Graph >::halfedge_descriptor h -, boost::tuple, -boost::reference_wrapper >& w) +, boost::tuple, +std::reference_wrapper >& w) { - set_halfedge(f, h, boost::unwrap_ref(w.get<0>())); - set_halfedge(f, h, boost::unwrap_ref(w.get<1>())); + set_halfedge(f, h, get<0>(w).get()); + set_halfedge(f, h, get<1>(w).get()); } template void set_halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v , typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, -boost::reference_wrapper >& w) +, const boost::tuple, +std::reference_wrapper >& w) { - set_halfedge(v, h, boost::unwrap_ref(w.get<0>())); - set_halfedge(v, h, boost::unwrap_ref(w.get<1>())); + set_halfedge(v, h, get<0>(w).get()); + set_halfedge(v, h, get<1>(w).get()); } // @@ -521,31 +518,31 @@ boost::reference_wrapper >& w) template typename boost::graph_traits< Graph >::edge_descriptor edge(typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, - boost::reference_wrapper >& w) +, const boost::tuple, + std::reference_wrapper >& w) { - edge(h, boost::unwrap_ref(w.get<0>())); - return edge(h, boost::unwrap_ref(w.get<1>())); + edge(h, get<0>(w).get()); + return edge(h, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::edge_descriptor e -, const boost::tuple, - boost::reference_wrapper >& w) +, const boost::tuple, + std::reference_wrapper >& w) { - halfedge(e, boost::unwrap_ref(w.get<0>())); - return halfedge(e, boost::unwrap_ref(w.get<1>())); + halfedge(e, get<0>(w).get()); + return halfedge(e, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::vertex_descriptor v -, const boost::tuple, - boost::reference_wrapper >& w) +, const boost::tuple, + std::reference_wrapper >& w) { - halfedge(v, boost::unwrap_ref(w.get<0>())); - return halfedge(v, boost::unwrap_ref(w.get<1>())); + halfedge(v, get<0>(w).get()); + return halfedge(v, get<1>(w).get()); } template @@ -553,58 +550,58 @@ std::pair< typename boost::graph_traits< Graph >::halfedge_descriptor , bool> halfedge(typename boost::graph_traits< Graph >::vertex_descriptor u , typename boost::graph_traits< Graph >::vertex_descriptor v - , const boost::tuple, - boost::reference_wrapper >& w) + , const boost::tuple, + std::reference_wrapper >& w) { - halfedge(u, v, boost::unwrap_ref(w.get<0>())); - return halfedge(u, v, boost::unwrap_ref(w.get<1>())); + halfedge(u, v, get<0>(w).get()); + return halfedge(u, v, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor opposite(typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, - boost::reference_wrapper >& w) +, const boost::tuple, + std::reference_wrapper >& w) { - opposite(h, boost::unwrap_ref(w.get<0>())); - return opposite(h, boost::unwrap_ref(w.get<1>())); + opposite(h, get<0>(w).get()); + return opposite(h, get<1>(w).get()); } template typename boost::graph_traits< Graph >::vertex_descriptor source(typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, - boost::reference_wrapper >& w) +, const boost::tuple, + std::reference_wrapper >& w) { - source(h, boost::unwrap_ref(w.get<0>())); - return source(h, boost::unwrap_ref(w.get<1>())); + source(h, get<0>(w).get()); + return source(h, get<1>(w).get()); } template typename boost::graph_traits< Graph >::vertex_descriptor target(typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, boost::reference_wrapper >& w) +, const boost::tuple, std::reference_wrapper >& w) { - target(h, boost::unwrap_ref(w.get<0>())); - return target(h, boost::unwrap_ref(w.get<1>())); + target(h, get<0>(w).get()); + return target(h, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor next(typename boost::graph_traits< Graph >::halfedge_descriptor outedge -, const boost::tuple, boost::reference_wrapper >& w) +, const boost::tuple, std::reference_wrapper >& w) { - next(outedge, boost::unwrap_ref(w.get<0>())); - return next(outedge, boost::unwrap_ref(w.get<1>())); + next(outedge, get<0>(w).get()); + return next(outedge, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor prev(typename boost::graph_traits< Graph >::halfedge_descriptor outedge -, const boost::tuple, boost::reference_wrapper >& w) +, const boost::tuple, std::reference_wrapper >& w) { - prev(outedge, boost::unwrap_ref(w.get<0>())); - return prev(outedge, boost::unwrap_ref(w.get<1>())); + prev(outedge, get<0>(w).get()); + return prev(outedge, get<1>(w).get()); } // @@ -612,73 +609,73 @@ prev(typename boost::graph_traits< Graph >::halfedge_descriptor outedge // template CGAL::Iterator_range::halfedge_iterator> -halfedges(const boost::tuple, boost::reference_wrapper >& w) +halfedges(const boost::tuple, std::reference_wrapper >& w) { - halfedges(boost::unwrap_ref(w.get<0>())); - return halfedges(boost::unwrap_ref(w.get<1>())); + halfedges(get<0>(w).get()); + return halfedges(get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedges_size_type -num_halfedges(const boost::tuple, boost::reference_wrapper >& w) +num_halfedges(const boost::tuple, std::reference_wrapper >& w) { - num_halfedges(boost::unwrap_ref(w.get<0>())); - return num_halfedges(boost::unwrap_ref(w.get<1>())); + num_halfedges(get<0>(w).get()); + return num_halfedges(get<1>(w).get()); } // Graph template typename boost::graph_traits< Graph >::face_descriptor face(typename boost::graph_traits< Graph >::halfedge_descriptor h -, const boost::tuple, boost::reference_wrapper >& w) +, const boost::tuple, std::reference_wrapper >& w) { - face(h, boost::unwrap_ref(w.get<0>())); - return face(h, boost::unwrap_ref(w.get<1>())); + face(h, get<0>(w).get()); + return face(h, get<1>(w).get()); } template typename boost::graph_traits< Graph >::halfedge_descriptor halfedge(typename boost::graph_traits< Graph >::face_descriptor f -, const boost::tuple, boost::reference_wrapper >& w) +, const boost::tuple, std::reference_wrapper >& w) { - halfedge(f, boost::unwrap_ref(w.get<0>())); - return halfedge(f, boost::unwrap_ref(w.get<1>())); + halfedge(f, get<0>(w).get()); + return halfedge(f, get<1>(w).get()); } template inline CGAL::Iterator_range::face_iterator > -faces(const boost::tuple, boost::reference_wrapper >& w) +faces(const boost::tuple, std::reference_wrapper >& w) { - faces(boost::unwrap_ref(w.get<0>())); - return faces(boost::unwrap_ref(w.get<1>())); + faces(get<0>(w).get()); + return faces(get<1>(w).get()); } template typename boost::graph_traits::faces_size_type -num_faces(const boost::tuple, - boost::reference_wrapper >& w) +num_faces(const boost::tuple, + std::reference_wrapper >& w) { - num_faces(boost::unwrap_ref(w.get<0>())); - return num_faces(boost::unwrap_ref(w.get<1>())); + num_faces(get<0>(w).get()); + return num_faces(get<1>(w).get()); } template -bool is_valid(const boost::tuple, - boost::reference_wrapper >& w +bool is_valid(const boost::tuple, + std::reference_wrapper >& w , bool verbose = false) { - is_valid(boost::unwrap_ref(w.get<0>()), verbose); - return is_valid(boost::unwrap_ref(w.get<1>()), verbose); + is_valid(get<0>(w).get(), verbose); + return is_valid(get<1>(w).get(), verbose); } template typename boost::property_map< Graph, PropertyTag >::type get(PropertyTag ptag, - const boost::tuple, - boost::reference_wrapper >& w) + const boost::tuple, + std::reference_wrapper >& w) { - get(ptag, boost::unwrap_ref(w.get<0>())); - return get(ptag, boost::unwrap_ref(w.get<1>())); + get(ptag, get<0>(w).get()); + return get(ptag, get<1>(w).get()); } }//end namespace CGAL From 769fca359769ebb207559e199f2c6ad23cf0d72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sat, 29 Apr 2023 08:54:05 +0200 Subject: [PATCH 0267/1398] std::size is also c++17 remove this commit before merging to master --- .../Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h index 4322f62676f9..a3ba31c27262 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -207,7 +208,7 @@ bool is_polygon_soup_a_polygon_mesh(const PolygonRange& polygons) for(const Polygon& polygon : polygons) { - std::size_t nb_edges = std::size(polygon); + std::size_t nb_edges = boost::size(polygon); if(nb_edges < 3) return false; From c1294a0eaaae49fd85f0619966e2122300379463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sat, 29 Apr 2023 09:22:12 +0200 Subject: [PATCH 0268/1398] boost::integral_constant ---> std::integral_constant --- .../Algebraic_kernel_d/Curve_analysis_2.h | 4 ++-- .../include/CGAL/Arr_conic_traits_2.h | 2 +- .../Arr_geodesic_arc_on_sphere_traits_2.h | 18 +++++++-------- .../Arrangement_on_surface_2_global.h | 12 +++++----- .../Arrangement_2/arrangement_type_traits.h | 8 +++---- .../benchmark/DxfArrayBenchmarks/benchmark.h | 2 +- .../benchmark/arrangement_traits/benchmark.h | 2 +- Circular_kernel_2/benchmark/benchmark.h | 2 +- Circular_kernel_2/benchmark/benchmark_CK2.cpp | 4 ++-- .../incremental_insertion/benchmark.h | 2 +- Convex_hull_3/include/CGAL/convex_hull_3.h | 6 ++--- .../quick_hull_default_traits.cpp | 2 +- .../Envelope_diagram_on_surface_2.h | 4 ++-- Filtered_kernel/include/CGAL/Lazy_kernel.h | 2 +- .../CGAL/NewKernel_d/Cartesian_LA_base.h | 22 +++++++++---------- .../include/CGAL/NewKernel_d/LA_eigen/LA.h | 8 +++---- .../include/CGAL/NewKernel_d/Vector/array.h | 2 +- .../include/CGAL/NewKernel_d/Vector/avx4.h | 12 +++++----- ...rator_to_points_from_iterator_to_vectors.h | 2 +- ...minant_of_iterator_to_points_from_points.h | 10 ++++----- ...nant_of_iterator_to_vectors_from_vectors.h | 10 ++++----- .../determinant_of_points_from_vectors.h | 10 ++++----- ...eterminant_of_vectors_small_dim_internal.h | 10 ++++----- .../include/CGAL/NewKernel_d/Vector/sse2.h | 10 ++++----- .../include/CGAL/NewKernel_d/Vector/v2int.h | 8 +++---- .../include/CGAL/NewKernel_d/Vector/vector.h | 2 +- .../CGAL/NewKernel_d/functor_properties.h | 2 +- .../include/CGAL/NewKernel_d/functor_tags.h | 22 +++++++++---------- NewKernel_d/include/CGAL/NewKernel_d/utils.h | 2 +- .../Optimal_transportation_reconstruction_2.h | 4 ++-- .../Polygon_mesh_processing/intersection.h | 8 +++---- STL_Extension/include/CGAL/is_convertible.h | 4 ++-- 32 files changed, 109 insertions(+), 109 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index 757a71e20750..70db25837e94 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -65,7 +65,7 @@ namespace internal { template struct Is_derived_from_Handle_with_policy { - typedef boost::false_type Tag; + typedef std::false_type Tag; }; template @@ -89,7 +89,7 @@ template struct Compare_for_vert_line_map_ }; template - struct Compare_for_vert_line_map_ { + struct Compare_for_vert_line_map_ { bool operator() (const Comparable& a, const Comparable& b) const { return CGAL::Handle_id_less_than< Comparable >()(a,b); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h index 8c3e7f6533e5..7d541c690119 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h @@ -71,7 +71,7 @@ class Arr_conic_traits_2 typedef Tag_true Has_left_category; typedef Tag_true Has_merge_category; typedef Tag_false Has_do_intersect_category; - //typedef boost::true_type Has_line_segment_constructor; + //typedef std::true_type Has_line_segment_constructor; typedef Arr_oblivious_side_tag Left_side_category; typedef Arr_oblivious_side_tag Bottom_side_category; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index 1468d38bc67e..476a20f466c8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -65,7 +65,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { typedef Arr_contracted_side_tag Top_side_category; typedef Arr_identified_side_tag Right_side_category; - typedef boost::integral_constant Zero_atan_y; + typedef std::integral_constant Zero_atan_y; // Traits objects typedef Arr_extended_direction_3 Point_2; @@ -357,7 +357,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ void intersection_with_identification(const X_monotone_curve_2& xcv, Direction_3& dp, - boost::true_type) const + std::true_type) const { const Direction_3& normal = xcv.normal(); dp = (CGAL::sign(normal.dz()) == POSITIVE) ? @@ -370,7 +370,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ void intersection_with_identification(const X_monotone_curve_2& xcv, Direction_3& dp, - boost::false_type) const + std::false_type) const { const Direction_3& normal = xcv.normal(); FT z((atan_x * normal.dx() + atan_y * normal.dy()) / @@ -382,7 +382,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] cv the curve */ bool overlap_with_identification(const X_monotone_curve_2& xcv, - boost::true_type) const + std::true_type) const { const Direction_3& normal = xcv.normal(); return ((x_sign(normal) == ZERO) && @@ -394,7 +394,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] cv the curve */ bool overlap_with_identification(const X_monotone_curve_2& xcv, - boost::false_type) const + std::false_type) const { const Direction_3& normal = xcv.normal(); const Direction_3& iden_normal = identification_normal(); @@ -440,7 +440,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { Point_2 p; Direction_3& d(p); d = Direction_3(x, y, z); - init(p, boost::integral_constant()); + init(p, std::integral_constant()); return p; } @@ -453,14 +453,14 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { Point_2 p; Direction_3& d(p); d = Direction_3(other); - init(p, boost::integral_constant()); + init(p, std::integral_constant()); return p; } /*! Initialize a point on the sphere, * \param[in] p the point to initialize. */ - void init(Point_2& p, boost::true_type) const + void init(Point_2& p, std::true_type) const { const Direction_3& dir = p; if (y_sign(dir) != ZERO) { @@ -479,7 +479,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Initialize a point on the sphere, * \param[in] p the point to initialize. */ - void init(Point_2& p, boost::false_type) const + void init(Point_2& p, std::false_type) const { const Direction_3& dir = p; if ((x_sign(dir) == ZERO) && (y_sign(dir) == ZERO)) { diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index c39c34099a53..d54f4c2cb0e1 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -61,7 +61,7 @@ namespace Ss2 = Surface_sweep_2; // The last parameter is used to resolve ambiguity between this function and // do_intersect of X_monotone_curve_2 in case that X_monotone_curve_2 and // Curve_2 are the same class. -// The last parameter should be boost::false_type but we used a +// The last parameter should be std::false_type but we used a // workaround since it didn't compile in FC3_g++-3.4.4 with the error of: // // error: no matching function for call to `do_intersect(Arrangement_2<>&, @@ -132,7 +132,7 @@ void insert(Arrangement_on_surface_2& arr, // // The last parameter is used to resolve ambiguity between this function and // do_intersect of Curve_2 in case that X_monotone_curve_2 and Curve_2 are the -// same class. The last parameter should be boost::true_type but we used a +// same class. The last parameter should be std::true_type but we used a // workaround since it didn't compile in FC3_g++-3.4.4 with the error of: // // error: no matching function for call to `do_intersect(Arrangement_2<>&, @@ -406,7 +406,7 @@ void insert_non_empty(Arrangement_on_surface_2&, @@ -460,7 +460,7 @@ void insert(Arrangement_on_surface_2& arr, // // The last parameter is used to resolve ambiguity between this function and // insert of Curve_2 in case that X_monotone_curve_2 and Curve_2 are the -// same class. The last parameter should be boost::true_type but we used a +// same class. The last parameter should be std::true_type but we used a // workaround since it didn't compile in FC3_g++-3.4.4 with the error of: // // error: no matching function for call to `do_intersect(Arrangement_2<>&, @@ -1522,7 +1522,7 @@ zone(Arrangement_on_surface_2& arr, // Checks whether the given x-monotone curve intersects the existing arrangement. // The last parameter is used to resolve ambiguity between this function and // do_intersect of Curve_2 in case that X_monotone_curve_2 and Curve_2 are the -// same class. The last parameter should be boost::true_type but we used a +// same class. The last parameter should be std::true_type but we used a // workaround since it didn't compile in FC3_g++-3.4.4 with the error of: // // error: no matching function for call to `do_intersect(Arrangement_on_surface_2<>&, @@ -1559,7 +1559,7 @@ do_intersect(Arrangement_on_surface_2& arr, // The last parameter is used to resolve ambiguity between this function and // do_intersect of X_monotone_curve_2 in case that X_monotone_curve_2 and // Curve_2 are the same class. -// The last parameter should be boost::false_type but we used a +// The last parameter should be std::false_type but we used a // workaround since it didn't compile in FC3_g++-3.4.4 with the error of: // // error: no matching function for call to diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/arrangement_type_traits.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/arrangement_type_traits.h index a97588ecde2f..93788c728d02 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/arrangement_type_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/arrangement_type_traits.h @@ -24,7 +24,7 @@ #include -#include +#include namespace CGAL { @@ -62,7 +62,7 @@ namespace CGAL // In the meanwhile we use a default implementation. template -class is_arrangement_2 : public boost::false_type +class is_arrangement_2 : public std::false_type {}; //-------------------------------- Arrangement_2 @@ -74,7 +74,7 @@ class Arrangement_2; template class is_arrangement_2< Arrangement_2 -> : public boost::false_type +> : public std::false_type {}; @@ -87,7 +87,7 @@ class Arrangement_on_surface_2; template class is_arrangement_2< Arrangement_on_surface_2 -> : public boost::true_type +> : public std::true_type {}; } // namespace CGAL diff --git a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h index 1e7db3856c0e..6c37f7e69072 100644 --- a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h +++ b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h @@ -267,7 +267,7 @@ class Bench try{ this->start(); - insert(_pm,ac.begin(),ac.end(),boost::false_type()); + insert(_pm,ac.begin(),ac.end(),std::false_type()); this->stop(); } catch (...) { diff --git a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h index 36210feffcb8..179ea2b2f82b 100644 --- a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h +++ b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h @@ -214,7 +214,7 @@ class Bench try{ this->start(); - insert(_pm,ac.begin(),ac.end(),boost::false_type()); + insert(_pm,ac.begin(),ac.end(),std::false_type()); this->stop(); } diff --git a/Circular_kernel_2/benchmark/benchmark.h b/Circular_kernel_2/benchmark/benchmark.h index 9d13d728f659..92ba72909ca6 100644 --- a/Circular_kernel_2/benchmark/benchmark.h +++ b/Circular_kernel_2/benchmark/benchmark.h @@ -219,7 +219,7 @@ typedef std::size_t size_type; Point_location _pl(_pm); try{ this->start(); - insert(_pm,ac.begin(),ac.end(),boost::false_type()); + insert(_pm,ac.begin(),ac.end(),std::false_type()); this->stop(); } catch (std::exception &e) { this->fail(); diff --git a/Circular_kernel_2/benchmark/benchmark_CK2.cpp b/Circular_kernel_2/benchmark/benchmark_CK2.cpp index 54a4137e4ce8..fca082283401 100644 --- a/Circular_kernel_2/benchmark/benchmark_CK2.cpp +++ b/Circular_kernel_2/benchmark/benchmark_CK2.cpp @@ -87,7 +87,7 @@ void do_main(const char *s) { struct rusage before, after; struct timeval utime, stime; getrusage(RUSAGE_SELF,&before); - insert(_pm,ac.begin(),ac.end(),boost::false_type()); + insert(_pm,ac.begin(),ac.end(),std::false_type()); getrusage(RUSAGE_SELF,&after); timersub(&(after.ru_utime),&(before.ru_utime),&utime); timersub(&(after.ru_stime),&(before.ru_stime),&stime); @@ -177,7 +177,7 @@ void do_main(int k) { struct rusage before, after; struct timeval utime, stime; getrusage(RUSAGE_SELF,&before); - insert(_pm,ac.begin(),ac.end(),boost::false_type()); + insert(_pm,ac.begin(),ac.end(),std::false_type()); getrusage(RUSAGE_SELF,&after); timersub(&(after.ru_utime),&(before.ru_utime),&utime); timersub(&(after.ru_stime),&(before.ru_stime),&stime); diff --git a/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h b/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h index 3787adde5222..1a251c11978a 100644 --- a/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h +++ b/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h @@ -217,7 +217,7 @@ class Bench this->start(); for (typename ArcContainer::const_iterator it=ac.begin(); it != ac.end(); ++it) { - insert(_pm,*it,_pl,boost::false_type()); + insert(_pm,*it,_pl,std::false_type()); }; this->stop(); } diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index 70c2f5ea0972..51555a5d57b0 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -155,7 +155,7 @@ struct Default_traits_for_Chull_3{ //FT is a floating point type and Kernel is a filtered kernel template -struct Default_traits_for_Chull_3{ +struct Default_traits_for_Chull_3{ typedef Convex_hull_traits_3< typename Kernel_traits::Kernel, PolygonMesh, Tag_true > type; }; @@ -172,7 +172,7 @@ struct Default_polyhedron_for_Chull_3 >{ template struct Is_cartesian_kernel { - typedef boost::false_type type; + typedef std::false_type type; }; template @@ -233,7 +233,7 @@ class Is_on_positive_side_of_plane_3< Extreme_points_traits_adapter_3 -class Is_on_positive_side_of_plane_3, boost::true_type >{ +class Is_on_positive_side_of_plane_3, std::true_type >{ typedef Simple_cartesian::Type> Exact_K; typedef Simple_cartesian Approx_K; typedef Convex_hull_traits_3 Traits; diff --git a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp index d1bca0f468f5..90bf87cfa8cd 100644 --- a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp +++ b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp @@ -29,6 +29,6 @@ int main() CGAL_static_assertion( (std::is_same::type>::value) ); CGAL_static_assertion( (std::is_same::type>::value) ); CGAL_static_assertion( (std::is_same,Default_traits_for_Chull_3::type>::value) ); - CGAL_static_assertion( (std::is_same, boost::true_type >::Protector,CGAL::Protect_FPU_rounding >::value) ); + CGAL_static_assertion( (std::is_same, std::true_type >::Protector,CGAL::Protect_FPU_rounding >::value) ); return 0; } diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_diagram_on_surface_2.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_diagram_on_surface_2.h index c8aa90f709b7..b9f922ef6995 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_diagram_on_surface_2.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_diagram_on_surface_2.h @@ -129,14 +129,14 @@ class Envelope_diagram_2 : template class is_arrangement_2< Envelope_diagram_on_surface_2 -> : public boost::true_type +> : public std::true_type {}; // specialization template class is_arrangement_2< Envelope_diagram_2 -> : public boost::true_type +> : public std::true_type {}; diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index a510d4c43739..3ceb706c3b98 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -61,7 +61,7 @@ class Has_result_type_helper template struct Has_result_type - : boost::integral_constant< bool, + : std::integral_constant< bool, Has_result_type_helper< std::remove_cv_t>::value> {}; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h index b5de315b902e..9aecb942bb17 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_LA_base.h @@ -13,7 +13,7 @@ #define CGAL_KERNEL_D_CARTESIAN_LA_BASE_H #include #include -#include +#include #include #include #include @@ -89,7 +89,7 @@ struct Cartesian_LA_base_d : public Dimension_base ::add::type Iterator_list; - template > struct Functor { + template > struct Functor { typedef Null_functor type; }; template struct Functor,D> { @@ -105,19 +105,19 @@ struct Cartesian_LA_base_d : public Dimension_base typedef CartesianDVectorBase::Construct_cartesian_const_iterator type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Sum_of_vectors type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Difference_of_vectors type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Opposite_vector type; }; template struct Functor::value || !LA_vector::template Property::value> > { typedef CartesianDVectorBase::Midpoint type; @@ -135,24 +135,24 @@ struct Cartesian_LA_base_d : public Dimension_base typedef CartesianDVectorBase::PV_dimension type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Orientation_of_vectors type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Orientation_of_points type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Scalar_product type; }; template struct Functor::value> > { + std::integral_constant::value> > { typedef CartesianDVectorBase::Squared_distance_to_origin_stored type; }; // Use integral_constant in case of failure, to distinguish from the previous one. template struct Functor::value || !LA_vector::template Property::value)*2> > { typedef CartesianDVectorBase::Squared_distance_to_origin_via_dotprod type; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/LA.h b/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/LA.h index c96e0eea6479..7124d799251d 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/LA.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/LA_eigen/LA.h @@ -38,10 +38,10 @@ template struct LA_eigen { struct Rebind_dimension { typedef LA_eigen< NT, D2, D3 > Other; }; - template struct Property : boost::false_type {}; - template struct Property : boost::true_type {}; - template struct Property : boost::true_type {}; - template struct Property : boost::true_type {}; + template struct Property : std::false_type {}; + template struct Property : std::true_type {}; + template struct Property : std::true_type {}; + template struct Property : std::true_type {}; typedef Eigen::Matrix::value,1,Eigen::ColMajor|Eigen::AutoAlign,Eigen_dimension::value,1> Vector; typedef Eigen::Matrix Dynamic_vector; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h index 88a4ed421a99..0ac98f7261ba 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h @@ -38,7 +38,7 @@ template struct Array_vector { struct Rebind_dimension { typedef Array_vector< NT, D2, D3 > Other; }; - template struct Property : boost::false_type {}; + template struct Property : std::false_type {}; static const unsigned d_=Max_dim_::value; CGAL_static_assertion(d_ != (unsigned)UNKNOWN_DIMENSION); diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/avx4.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/avx4.h index 950910925a32..90a35986e500 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/avx4.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/avx4.h @@ -31,19 +31,19 @@ namespace CGAL { typedef Dimension_tag<4> Dimension; typedef Dimension_tag<4> Max_dimension; // No Rebind_dimension, this is a building block - template struct Property : boost::false_type {}; + template struct Property : std::false_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; /* MAYBE? template struct Property - : boost::true_type {}; + : std::true_type {}; */ template struct Property - : boost::true_type {}; + : std::true_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; typedef __m256d Vector; struct Construct_vector { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h index 2a222f81d728..293fdfdc1d34 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h @@ -42,7 +42,7 @@ struct Add_determinant_of_iterator_to_points_from_iterator_to_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; // TODO: use std::minus, boost::bind, etc template struct Minus_fixed { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h index 5e135e530be0..110305fe61e6 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h @@ -42,7 +42,7 @@ struct Add_determinant_of_iterator_to_points_from_points }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){ @@ -74,7 +74,7 @@ struct Add_determinant_of_iterator_to_points_from_points }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){ @@ -108,7 +108,7 @@ struct Add_determinant_of_iterator_to_points_from_points }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){ @@ -144,7 +144,7 @@ struct Add_determinant_of_iterator_to_points_from_points }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){ @@ -182,7 +182,7 @@ struct Add_determinant_of_iterator_to_points_from_points }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){ diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h index e6db622451c3..bf7ab454eac4 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h @@ -42,7 +42,7 @@ struct Add_determinant_of_iterator_to_vectors_from_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){ @@ -72,7 +72,7 @@ struct Add_determinant_of_iterator_to_vectors_from_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){ @@ -104,7 +104,7 @@ struct Add_determinant_of_iterator_to_vectors_from_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){ @@ -138,7 +138,7 @@ struct Add_determinant_of_iterator_to_vectors_from_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){ @@ -174,7 +174,7 @@ struct Add_determinant_of_iterator_to_vectors_from_vectors }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; template static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){ diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h index 653ac9c8dd61..66edfeba37d6 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h @@ -42,7 +42,7 @@ struct Add_determinant_of_points_from_vectors_and_minus }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT determinant_of_points(Vector const&a, Vector const&b, Vector const&c){ @@ -66,7 +66,7 @@ struct Add_determinant_of_points_from_vectors_and_minus }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT determinant_of_points(Vector const&a, Vector const&b, Vector const&c, Vector const&d){ @@ -90,7 +90,7 @@ struct Add_determinant_of_points_from_vectors_and_minus }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT determinant_of_points(Vector const&a, Vector const&b, Vector const&c, Vector const&d, Vector const&e){ @@ -114,7 +114,7 @@ struct Add_determinant_of_points_from_vectors_and_minus }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT determinant_of_points(Vector const&a, Vector const&b, Vector const&c, Vector const&d, Vector const&e, Vector const&f){ @@ -138,7 +138,7 @@ struct Add_determinant_of_points_from_vectors_and_minus }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT determinant_of_points(Vector const&a, Vector const&b, Vector const&c, Vector const&d, Vector const&e, Vector const&f, diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h index f423bf8b0935..59a3752f61cc 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h @@ -46,7 +46,7 @@ struct CGAL_CLASS }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT CGAL_FUNC(Vector const&a, Vector const&b){ return CGAL::determinant_of_vectors(a,b); @@ -69,7 +69,7 @@ struct CGAL_CLASS }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT CGAL_FUNC(Vector const&a, Vector const&b, Vector const&c){ @@ -93,7 +93,7 @@ struct CGAL_CLASS }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT CGAL_FUNC(Vector const&a, Vector const&b, Vector const&c, Vector const&d){ @@ -117,7 +117,7 @@ struct CGAL_CLASS }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT CGAL_FUNC(Vector const&a, Vector const&b, Vector const&c, Vector const&d, Vector const&e){ @@ -141,7 +141,7 @@ struct CGAL_CLASS }; template struct Property : LA::template Property

    {}; template struct Property : - boost::true_type {}; + std::true_type {}; static NT CGAL_FUNC(Vector const&a, Vector const&b, Vector const&c, Vector const&d, Vector const&e, Vector const&f){ diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/sse2.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/sse2.h index 1330bf6fa775..24607f39e697 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/sse2.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/sse2.h @@ -32,17 +32,17 @@ namespace CGAL { typedef Dimension_tag<2> Dimension; typedef Dimension_tag<2> Max_dimension; // No Rebind_dimension, this is a building block - template struct Property : boost::false_type {}; + template struct Property : std::false_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; /* MAYBE? template struct Property - : boost::true_type {}; + : std::true_type {}; */ template struct Property - : boost::true_type {}; + : std::true_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; typedef __m128d Vector; struct Construct_vector { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/v2int.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/v2int.h index d864c67bbc50..d02965cd4e74 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/v2int.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/v2int.h @@ -70,13 +70,13 @@ namespace CGAL { typedef Dimension_tag<2> Dimension; typedef Dimension_tag<2> Max_dimension; // No Rebind_dimension, this is a building block - template struct Property : boost::false_type {}; + template struct Property : std::false_type {}; //template struct Property - // : boost::true_type {}; + // : std::true_type {}; template struct Property - : boost::true_type {}; + : std::true_type {}; //template struct Property - // : boost::true_type {}; + // : std::true_type {}; // Advertise somehow that the sign_of_determinant* are exact? typedef std::array Vector; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/vector.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/vector.h index 9dfda2c38b10..89ccbace2011 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/vector.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/vector.h @@ -29,7 +29,7 @@ template struct Vector_vector { struct Rebind_dimension { typedef Vector_vector< NT, D2, D3 > Other; }; - template struct Property : boost::false_type {}; + template struct Property : std::false_type {}; struct Construct_vector { struct Dimension { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h b/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h index f8608d9fd4dc..a1e788113af5 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/functor_properties.h @@ -20,7 +20,7 @@ namespace CGAL { BOOST_MPL_HAS_XXX_TRAIT_DEF(Is_pretty) \ } \ template::value> \ - struct Is_pretty : boost::false_type {}; \ + struct Is_pretty : std::false_type {}; \ template \ struct Is_pretty : T::Is_pretty {} diff --git a/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h b/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h index 99a28ab578f1..a3255d25eb00 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h @@ -69,19 +69,19 @@ namespace CGAL { Provides_functor::type>, Provides_functors::type> > {}; template - struct Provides_functors : boost::true_type {}; + struct Provides_functors : std::true_type {}; template::type::value> struct Provides_types : boost::mpl::and_ < Provides_type::type>, Provides_types::type> > {}; template - struct Provides_types : boost::true_type {}; + struct Provides_types : std::true_type {}; namespace internal { BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_Type,template Type,false) } template::value /* false */> - struct Provides_type_i : boost::false_type {}; + struct Provides_type_i : std::false_type {}; template struct Provides_type_i : Has_type_different_from, Null_type> {}; @@ -93,7 +93,7 @@ namespace CGAL { template::value /* false */> - struct Provides_functor_i : boost::false_type {}; + struct Provides_functor_i : std::false_type {}; template struct Provides_functor_i : Has_type_different_from, Null_functor> {}; @@ -332,19 +332,19 @@ namespace CGAL { struct Stores_squared_norm_tag {}; template struct Preserved_by_non_linear_extra_coordinate - : boost::false_type {}; + : std::false_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; template<> struct Preserved_by_non_linear_extra_coordinate - : boost::true_type {}; + : std::true_type {}; // Kernel properties struct Point_stores_squared_distance_to_origin_tag {}; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/utils.h b/NewKernel_d/include/CGAL/NewKernel_d/utils.h index adc632e50c67..a1ac6faeddd2 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/utils.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/utils.h @@ -35,7 +35,7 @@ namespace internal { } template ::value /*false*/> -struct Has_type_different_from : boost::false_type {}; +struct Has_type_different_from : std::false_type {}; template struct Has_type_different_from : boost::mpl::not_ > {}; diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h index ba6ebd878120..b8d09a2dbfd4 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/Optimal_transportation_reconstruction_2.h @@ -1184,9 +1184,9 @@ class Optimal_transportation_reconstruction_2 // number type (like a multiprecision), the coordinates of the points // will increase a lot due to the relocation step. These functions // simply turn a relocated point to a rounded to double version. - void relocate_on_the_double_grid(Point&, boost::true_type) const + void relocate_on_the_double_grid(Point&, std::true_type) const {} - void relocate_on_the_double_grid(Point& p, boost::false_type) const + void relocate_on_the_double_grid(Point& p, std::false_type) const { double x=to_double(m_traits.compute_x_2_object()(p)); double y=to_double(m_traits.compute_y_2_object()(p)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index 470ca6ed2325..30b0fef1855e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -1147,7 +1147,7 @@ bool do_intersect(const PolylineRange& polylines1, typename boost::mpl::eval_if< boost::has_range_iterator, boost::range_value, - boost::false_type >::type + std::false_type >::type >::value >* = 0//end enable_if #endif @@ -1194,7 +1194,7 @@ bool do_intersect(const Polyline& polyline1, typename boost::mpl::eval_if< boost::has_range_iterator, boost::range_value, - boost::false_type + std::false_type >::type >::value >* = 0//end enable_if @@ -1365,7 +1365,7 @@ bool do_intersect(const TriangleMesh& tm, typename boost::mpl::eval_if< boost::has_range_iterator, boost::range_value, - boost::false_type + std::false_type >::type >::value >* = 0//end enable_if @@ -1435,7 +1435,7 @@ bool do_intersect(const TriangleMesh& tm, typename boost::mpl::eval_if< boost::has_range_iterator, boost::range_value, - boost::false_type + std::false_type >::type >::type // not a range of a range >::value diff --git a/STL_Extension/include/CGAL/is_convertible.h b/STL_Extension/include/CGAL/is_convertible.h index 1daa86cb63b3..1dfcda697459 100644 --- a/STL_Extension/include/CGAL/is_convertible.h +++ b/STL_Extension/include/CGAL/is_convertible.h @@ -17,7 +17,7 @@ #ifndef CGAL_IS_CONVERTIBLE_H #define CGAL_IS_CONVERTIBLE_H -#include +#include #ifdef CGAL_USE_GMPXX #include #endif @@ -30,7 +30,7 @@ templatestruct is_implicit_convertible #ifdef CGAL_USE_GMPXX // Work around a gmpxx misfeature templatestruct is_implicit_convertible<__gmp_expr,mpz_class> - : boost::false_type {}; + : std::false_type {}; #endif // TODO: add is_explicit_convertible (using boost::is_constructible?) From b2a330bbdfb25fd9572b163381e1aec0b7c29eb9 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 30 Apr 2023 14:21:54 +0100 Subject: [PATCH 0269/1398] WIP re-adding scripting --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 4 +- Polyhedron/demo/Polyhedron/MainWindow.cpp | 192 +++++++--------------- Polyhedron/demo/Polyhedron/MainWindow.h | 25 +-- 3 files changed, 71 insertions(+), 150 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index ce49786fd28c..c6d91a0cf727 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -46,7 +46,7 @@ endif() # Find Qt6 itself find_package(Qt6 QUIET - COMPONENTS OpenGLWidgets Widgets + COMPONENTS OpenGLWidgets Widgets Qml OPTIONAL_COMPONENTS WebSockets Network) set_package_properties( @@ -211,7 +211,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) Primitive_container.cpp Polyhedron_demo_plugin_helper.cpp CGAL_double_edit.cpp) - target_link_libraries(demo_framework PUBLIC Qt6::OpenGLWidgets Qt6::Widgets Qt6::Gui + target_link_libraries(demo_framework PUBLIC Qt6::OpenGLWidgets Qt6::Widgets Qt6::Gui Qt6::Qml CGAL::CGAL_Qt6) if(TARGET Qt6::WebSockets) target_link_libraries(demo_framework PUBLIC Qt6::WebSockets) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 40e14de0d22c..b481ce58d009 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -46,15 +46,10 @@ #include #include #include -#include #include #include -#ifdef QT_SCRIPT_LIB -# include -# ifdef QT_SCRIPTTOOLS_LIB -# include -# endif -#endif +#include + #include #include @@ -75,58 +70,25 @@ #include "Color_map.h" -#ifdef QT_SCRIPT_LIB -# include -# include - - using namespace CGAL::Three; -QScriptValue -myScene_itemToScriptValue(QScriptEngine *engine, +QJSValue +myScene_itemToScriptValue(QJSEngine *engine, CGAL::Three::Scene_item* const &in) { return engine->newQObject(in); } -void myScene_itemFromScriptValue(const QScriptValue &object, +void myScene_itemFromScriptValue(const QJSValue &object, CGAL::Three::Scene_item* &out) { out = qobject_cast(object.toQObject()); } -#endif // QT_SCRIPT_LIB - -#ifdef QT_SCRIPT_LIB -# ifdef QT_SCRIPTTOOLS_LIB - -const QScriptEngineDebugger::DebuggerWidget debug_widgets[9] = { - QScriptEngineDebugger::ConsoleWidget, - QScriptEngineDebugger::StackWidget, - QScriptEngineDebugger::ScriptsWidget, - QScriptEngineDebugger::LocalsWidget, - QScriptEngineDebugger::CodeWidget, - QScriptEngineDebugger::CodeFinderWidget, - QScriptEngineDebugger::BreakpointsWidget, - QScriptEngineDebugger::DebugOutputWidget, - QScriptEngineDebugger::ErrorLogWidget -}; -const QString debug_widgets_names[9] = { - "Script console", - "Stack", - "Scripts", - "Locals", - "Code", - "CodeFinder", - "Breakpoints", - "DebugOutput", - "ErrorLog" -}; - -# endif -#endif + + #if 0 -QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine) +QJSValue myPrintFunction(QScriptContext *context, QJSEngine *engine) { MainWindow* mw = qobject_cast(engine->parent()); QString result; @@ -168,11 +130,7 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren menu_map[ui->menuOperations->title()] = ui->menuOperations; this->verbose = verbose; is_locked = false; - // remove the Load Script menu entry, when the demo has not been compiled with QT_SCRIPT_LIB -#if !defined(QT_SCRIPT_LIB) - // ui->menuBar->removeAction(ui->actionLoadScript); - // ui->menuBar->removeAction(ui->on_actionLoad_a_Scene_from_a_Script_File); -#endif + // Save some pointers from ui, for latter use. sceneView = ui->sceneView; viewer_window = new SubViewer(ui->mdiArea, this, nullptr); @@ -329,54 +287,36 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren // Reset the "Operation menu" clearMenu(ui->menuOperations); -#ifdef QT_SCRIPT_LIB std::cerr << "Enable scripts.\n"; - script_engine = new QScriptEngine(this); + script_engine = new QJSEngine(this); + +#if 0 qScriptRegisterMetaType(script_engine, myScene_itemToScriptValue, myScene_itemFromScriptValue); -# ifdef QT_SCRIPTTOOLS_LIB - QScriptEngineDebugger* debugger = new QScriptEngineDebugger(this); - debugger->setObjectName("qt script debugger"); - QAction* debuggerMenuAction = - menuBar()->addMenu(debugger->createStandardMenu()); - debuggerMenuAction->setText(tr("Qt Script &Debug")); - for(unsigned int i = 0; i < 9; ++i) - { - QDockWidget* dock = new QDockWidget(debug_widgets_names[i], this); - dock->setObjectName(debug_widgets_names[i]); - dock->setWidget(debugger->widget(debug_widgets[i])); - this->QMainWindow::addDockWidget(Qt::BottomDockWidgetArea, dock); - dock->hide(); - } - debugger->setAutoShowStandardWindow(false); - debugger->attachTo(script_engine); -# endif // QT_SCRIPTTOOLS_LIB - QScriptValue fun = script_engine->newFunction(myPrintFunction); - script_engine->globalObject().setProperty("print", fun); + + QJSValue fun = script_engine->newFunction(myPrintFunction); + script_engine->globalObject().setProperty("print", fun); +#endif // evaluate_script("print('hello', 'world', 'from QtScript!')"); - QScriptValue mainWindowObjectValue = script_engine->newQObject(this); + QJSValue mainWindowObjectValue = script_engine->newQObject(this); script_engine->globalObject().setProperty("main_window", mainWindowObjectValue); - QScriptValue sceneObjectValue = script_engine->newQObject(scene); + QJSValue sceneObjectValue = script_engine->newQObject(scene); mainWindowObjectValue.setProperty("scene", sceneObjectValue); script_engine->globalObject().setProperty("scene", sceneObjectValue); - QScriptValue viewerObjectValue = script_engine->newQObject(viewer); + QJSValue viewerObjectValue = script_engine->newQObject(viewer); mainWindowObjectValue.setProperty("viewer", viewerObjectValue); script_engine->globalObject().setProperty("viewer", viewerObjectValue); - QScriptValue cameraObjectValue = script_engine->newQObject(viewer->camera()); + QJSValue cameraObjectValue = script_engine->newQObject(viewer->camera()); viewerObjectValue.setProperty("camera", cameraObjectValue); script_engine->globalObject().setProperty("camera", cameraObjectValue); evaluate_script("var plugins = new Array();"); -# ifdef QT_SCRIPTTOOLS_LIB - QScriptValue debuggerObjectValue = script_engine->newQObject(debugger); - script_engine->globalObject().setProperty("debugger", debuggerObjectValue); -# endif -#endif + readSettings(); // Among other things, the column widths are stored. @@ -415,18 +355,15 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren actionResetDefaultLoaders = new QAction("Reset Default Loaders",this); -#ifdef QT_SCRIPT_LIB // evaluate_script("print(plugins);"); Q_FOREACH(QAction* action, findChildren()) { if(action->objectName() != "") { - QScriptValue objectValue = script_engine->newQObject(action); + QJSValue objectValue = script_engine->newQObject(action); script_engine->globalObject().setProperty(action->objectName(), objectValue); } } filterOperations(true); - // debugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); -#endif } void addActionToMenu(QAction* action, QMenu* menu) @@ -532,23 +469,33 @@ void MainWindow::filterOperations(bool) #include -#if 0 + void MainWindow::evaluate_script(QString script, const QString& filename, const bool quiet) { +#if 0 QScriptContext* context = script_engine->currentContext(); - QScriptValue object = context->activationObject(); - QScriptValue former_current_filename = object.property("current_filename");; + QJSValue object = context->activationObject(); + QJSValue former_current_filename = object.property("current_filename");; object.setProperty("current_filename", filename); +#endif + + QJSValue value = script_engine->evaluate(script, filename); + if (value.isError()) + if(! quiet){ + qDebug() << "Uncaught exception at line" + << value.property("lineNumber").toInt() + << ":" << value.toString(); + } +#if 0 - QScriptValue value = script_engine->evaluate(script, filename); if(script_engine->hasUncaughtException()) { - QScriptValue js_exception = script_engine->uncaughtException(); - QScriptValue js_bt =js_exception.property("backtrace"); + QJSValue js_exception = script_engine->uncaughtException(); + QJSValue js_bt =js_exception.property("backtrace"); QStringList bt = script_engine->uncaughtExceptionBacktrace(); if(js_bt.isValid()) { QStringList other_bt; - qScriptValueToSequence(js_bt, other_bt); + qJSValueToSequence(js_bt, other_bt); if(!other_bt.isEmpty()) bt = other_bt; } if(!quiet) { @@ -569,6 +516,7 @@ void MainWindow::evaluate_script(QString script, } object.setProperty("current_filename", former_current_filename); +#endif } void MainWindow::evaluate_script_quiet(QString script, @@ -577,30 +525,7 @@ void MainWindow::evaluate_script_quiet(QString script, evaluate_script(script, filename, true); } -void MainWindow::enableScriptDebugger(bool b /* = true */) -{ - Q_UNUSED(b); -#ifdef QT_SCRIPT_LIB -# ifdef QT_SCRIPTTOOLS_LIB - QScriptEngineDebugger* debugger = - findChild("qt script debugger"); - if(debugger) { - if(b) { - debugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); - } - else { - std::cerr << "Detach the script debugger\n"; - debugger->detach(); - } - } - return; -# endif -#endif - // If we are here, then the debugger is not available - this->error(tr("Your version of Qt is too old, and for that reason " - "the Qt Script Debugger is not available.")); -} -#endif + namespace { bool actionsByName(QAction* x, QAction* y) { @@ -704,12 +629,10 @@ bool MainWindow::load_plugin(QString fileName, bool blacklisted) pluginsStatus_map[name] = QString("Not for this program."); } else{ -#ifdef QT_SCRIPT_LIB - QScriptValue objectValue = + QJSValue objectValue = script_engine->newQObject(obj); script_engine->globalObject().setProperty(obj->objectName(), objectValue); evaluate_script_quiet(QString("plugins.push(%1);").arg(obj->objectName())); -#endif pluginsStatus_map[name] = QString("success"); } } @@ -927,11 +850,10 @@ void MainWindow::addAction(QString actionName, QAction* action = new QAction(actionText, this); action->setObjectName(actionName); menu->addAction(action); -#ifdef QT_SCRIPT_LIB - QScriptValue objectValue = script_engine->newQObject(action); + + QJSValue objectValue = script_engine->newQObject(action); script_engine->globalObject().setProperty(action->objectName(), objectValue); -#endif } void MainWindow::viewerShow(float xmin, @@ -1165,7 +1087,6 @@ void MainWindow::open(QString filename) { QFileInfo fileinfo(filename); -#ifdef QT_SCRIPT_LIB // Handles the loading of script file from the command line arguments, // and the special command line arguments that start with "javascript:" // or "qtscript:" @@ -1193,7 +1114,6 @@ void MainWindow::open(QString filename) QApplication::restoreOverrideCursor(); return; } -#endif if ( !fileinfo.exists() ){ QMessageBox::warning(this, @@ -1290,8 +1210,11 @@ bool MainWindow::open(QString filename, QString loader_name) { std::cerr << e.what() << std::endl; return false; } +#else + bool ok; + loadItem(fileinfo, findLoader(loader_name), ok); + return ok; #endif - return true; } @@ -1894,9 +1817,10 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } -#if 0 + bool MainWindow::loadScript(QString filename) { +#if 0 QFileInfo fileinfo(filename); boost::optional opt = wrap_a_call_to_cpp ([this, fileinfo] { @@ -1904,11 +1828,15 @@ bool MainWindow::loadScript(QString filename) }, this, __FILE__, __LINE__, CGAL::Three::PARENT_CONTEXT); if(!opt) return false; else return *opt; +#else + QFileInfo fileinfo(filename); + return loadScript(fileinfo); +#endif } bool MainWindow::loadScript(QFileInfo info) { -#if defined(QT_SCRIPT_LIB) + QString program; QString filename = info.absoluteFilePath(); QFile script_file(filename); @@ -1925,10 +1853,9 @@ bool MainWindow::loadScript(QFileInfo info) evaluate_script(program, filename); return true; } -#endif return false; } -#endif + void MainWindow::throw_exception() { #if 0 // AF @@ -1936,14 +1863,15 @@ void MainWindow::throw_exception() { throw std::runtime_error("Exception thrown in " "MainWindow::throw_exception()"); }, this, __FILE__, __LINE__); +#else + throw std::runtime_error("Exception thrown in " + "MainWindow::throw_exception()"); #endif } void MainWindow::on_actionLoadScript_triggered() { -#if defined(QT_SCRIPT_LIB) -#endif } void MainWindow::on_actionLoad_triggered() @@ -3874,7 +3802,7 @@ void MainWindow::on_actionLoad_a_Scene_from_a_Script_File_triggered() if(filename.isEmpty()) return; } - + loadScript(QFileInfo(filename)); if(do_download){ QFile tmp_file(filename); tmp_file.remove(); diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index d970c1813ef3..ea43c7a482f6 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -1,5 +1,8 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H + +#define QT_SCRIPT_LIB + #include "config.h" #include "MainWindow_config.h" @@ -7,10 +10,7 @@ #include #include -// AF @todo Scripting has changed -// #include -// #include - +#include #include #include @@ -62,7 +62,6 @@ class MAINWINDOW_EXPORT MainWindow : public CGAL::Qt::DemosMainWindow, public Messages_interface, public CGAL::Three::Three - // AF , protected QScriptable { Q_OBJECT Q_INTERFACES(Messages_interface) @@ -148,13 +147,12 @@ public Q_SLOTS: index of the item to be reloaded as data attached to the action. The index must identify a valid `Scene_item`.*/ void reloadItem(); -#if 0 + //! Loads a script. Returns true if it worked. bool loadScript(QString filename); //! Loads a script. Returns true if it worked. bool loadScript(QFileInfo); -#endif /*! * Gives the keyboard input focus to the widget searchEdit. @@ -259,11 +257,6 @@ public Q_SLOTS: //!Returns true if the target plugin is present. If not, returns false. bool hasPlugin(const QString&) const; - /*! - * If able, finds a script debugger and interrupts current action. Default - * value for parameter is true. - */ - // void enableScriptDebugger(bool = true); /// This slot is used to test exception handling in Qt Scripts. void throw_exception(); @@ -331,7 +324,7 @@ protected Q_SLOTS: bool on_actionErase_triggered(); //!Duplicates the selected item and selects the new item. void on_actionDuplicate_triggered(); - //!If QT_SCRIPT_LIB is defined, opens a dialog to choose a script. + //!Opens a dialog to choose a script. void on_actionLoadScript_triggered(); //!Loads a plugin from a specified directory void on_actionLoadPlugin_triggered(); @@ -439,8 +432,8 @@ protected Q_SLOTS: bool verbose; void insertActionBeforeLoadPlugin(QMenu*, QAction *actionToInsert); -#ifdef QT_SCRIPT_LIB - QScriptEngine* script_engine; + + QJSEngine* script_engine; public: /*! Evaluates a script and search for uncaught exceptions. If quiet is false, prints the *backtrace of the uncaught exceptions. @@ -451,7 +444,7 @@ protected Q_SLOTS: //! Calls evaluate_script(script, filename, true). void evaluate_script_quiet(QString script, const QString & fileName = QString()); - #endif + QMutex mutex; QWaitCondition wait_condition; From ae5d32ba2e425853d4cf822ffd64e19c1d45e7ad Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 1 May 2023 12:23:20 +0200 Subject: [PATCH 0270/1398] citing/referencing "corrected curvature measures" + refining the theo background --- Documentation/doc/biblio/geom.bib | 12 +++++++ .../Polygon_mesh_processing.txt | 33 ++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 7c9fec6e420d..f072116a2e27 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -152065,3 +152065,15 @@ @article{lachaud2020 month = jul, year = {2020} } + +@article{lachaud2022 + author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert}, + journal = {Discrete & Computational Geometry}, + title = {Corrected Curvature Measures}, + volume = {68}, + pages = {477-524}, + month = jul, + year = {2022}, + url = {https://doi.org/10.1007/s00454-022-00399-4} +} + diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index eac246d8ab47..354c622f0e99 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -898,18 +898,21 @@ they give accurate results, on the condition that the correct vertex normals are \subsection ICCBackground Brief Background -Curvatures are quantities that describe the local geometry of a surface. They are important in many -geometry processing applications. since surfaces are 2-dimensional objects (embedded in 3D), they can bend +Surface curvatures are quantities that describe the local geometry of a surface. They are important in many +geometry processing applications. As surfaces are 2-dimensional objects (embedded in 3D), they can bend in 2 independent directions. These directions are called principal directions, and the amount of bending -in each direction is called the principal curvature: \f$ k_1 \f$ and \f$ k_2 \f$. Curvature is usually -expressed as scalar quantities like the mean curvature \f$ H \f$ and the Gaussian curvature \f$ K \f$ -which are defined in terms of the principal curvatures. - -The algorithms are based on the following paper \cgalCite{lachaud2020}. It introduces a new way to -compute curvatures on polygonal meshes. The main idea is based on decoupling the normal information from -the position information, which is useful for dealing with digital surfaces, or meshes with noise on -vertex positions. To compute the curvatures, we first compute interpolated curvature measures for each face -as described below. For a triangle \f$ \tau_{ijk} \f$, with vertices \a i, \a j, \a k: +in each direction is called the principal curvature: \f$ k_1 \f$ and \f$ k_2 \f$ (denoting max and min +curvatures). Curvature is usually expressed as scalar quantities like the mean curvature \f$ H \f$ and +the Gaussian curvature \f$ K \f$ which are defined in terms of the principal curvatures. + +The algorithms are based on the two papers \cgalCite{lachaud2022} and \cgalCite{lachaud2020}. They +introduce a new way to compute curvatures on polygonal meshes. The main idea in \cgalCite{lachaud2022} is +based on decoupling the normal information from the position information, which is useful for dealing with +digital surfaces, or meshes with noise on vertex positions. \cgalCite{lachaud2020} introduces some +extensions to this framework. As it uses linear interpolation on the corrected normal vector field +to derive new closed form equations for the corrected curvature measures. These interpolated +curvature measures are the first step for computing the curvatures. For a triangle \f$ \tau_{ijk} \f$, +with vertices \a i, \a j, \a k: \f[ \begin{align*} @@ -923,10 +926,10 @@ as described below. For a triangle \f$ \tau_{ijk} \f$, with vertices \a i, \a j, where \f$ \langle \cdot \mid \cdot \rangle \f$ denotes the usual scalar product, \f$ \bar{\mathbf{u}}=\frac{1}{3}( \mathbf{u}_i + \mathbf{u}_j + \mathbf{u}_k )\f$. -The first measure \f$ \mu^{(0)} \f$ is the area measure of the triangle, and the second and third measures -\f$ \mu^{(1)} \f$ and \f$ \mu^{(2)} \f$ are the mean and Gaussian corrected curvature measures of the triangle. -The last measure \f$ \mu^{\mathbf{X},\mathbf{Y}} \f$ is the anisotropic corrected curvature measure of the triangle. -The anisotropic measure is later used to compute the principal curvatures and directions through an eigenvalue +The first measure \f$ \mu^{(0)} \f$ is the area measure of the triangle, and the measures \f$ \mu^{(1)} \f$ and +\f$ \mu^{(2)} \f$ are the mean and Gaussian corrected curvature measures of the triangle. The last measure +\f$ \mu^{\mathbf{X},\mathbf{Y}} \f$ is the anisotropic corrected curvature measure of the triangle. The +anisotropic measure is later used to compute the principal curvatures and directions through an eigenvalue solver. The interpolated curvature measures are then computed for each vertex \f$ v \f$ as the sum of From 83bf49bf3977565330e6316cd2640fc60c38cb46 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Mon, 1 May 2023 12:29:25 +0200 Subject: [PATCH 0271/1398] Computing curvatures mentioned in the outline section (1.3) --- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 354c622f0e99..6b6f979ba59f 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -49,6 +49,7 @@ mesh, which includes point location and self intersection tests. - \ref PMPCombinatorialRepair : repair of polygon meshes and polygon soups. - \ref PMPGeometricRepair : repair of the geometry of polygon meshes. - \ref PMPNormalComp : normal computation at vertices and on faces of a polygon mesh. +- \ref PMPICC : computing curvatures (mean, gaussian, principal) on a polygon mesh. - \ref PMPSlicer : functor able to compute the intersections of a polygon mesh with arbitrary planes (slicer). - \ref PMPConnectedComponents : methods to deal with connected components of a polygon mesh (extraction, marks, removal, ...). From 0ee9406235728660ecc74122fc20505bacfd21ba Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 30 Jul 2020 15:42:41 +0200 Subject: [PATCH 0272/1398] add possibility to provide a variable sizing field to PMP::isotropic_remeshing # Conflicts: # Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt # Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h --- .../Polygon_mesh_processing/CMakeLists.txt | 1 + ...sotropic_remeshing_with_sizing_example.cpp | 39 ++++++++ .../Isotropic_remeshing/Sizing_field.h | 50 ++++++++++ .../Uniform_sizing_field.h | 92 +++++++++++++++++++ .../Isotropic_remeshing/remesh_impl.h | 60 ++++++------ .../CGAL/Polygon_mesh_processing/remesh.h | 32 +++++-- 6 files changed, 233 insertions(+), 41 deletions(-) create mode 100644 Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index c755ecf63e8e..cf1424b05c92 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -27,6 +27,7 @@ create_single_source_cgal_program("mesh_slicer_example.cpp") #create_single_source_cgal_program( "remove_degeneracies_example.cpp") create_single_source_cgal_program("isotropic_remeshing_example.cpp") create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") +create_single_source_cgal_program("isotropic_remeshing_with_sizing_example.cpp") create_single_source_cgal_program("tangential_relaxation_example.cpp") create_single_source_cgal_program("surface_mesh_intersection.cpp") create_single_source_cgal_program("corefinement_SM.cpp") diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp new file mode 100644 index 000000000000..fa5dc55d7896 --- /dev/null +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -0,0 +1,39 @@ +#include +#include +#include + +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Surface_mesh Mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char* argv[]) +{ + const char* filename = (argc > 1) ? argv[1] : "data/pig.off"; + std::ifstream input(filename); + + Mesh mesh; + if (!input || !(input >> mesh) || !CGAL::is_triangle_mesh(mesh)) { + std::cerr << "Not a valid input file." << std::endl; + return 1; + } + + double target_edge_length = 0.04; + unsigned int nb_iter = 3; + + std::cout << "Start remeshing of " << filename + << " (" << num_faces(mesh) << " faces)..." << std::endl; + + PMP::isotropic_remeshing( + faces(mesh), + target_edge_length, + mesh, + PMP::parameters::number_of_iterations(nb_iter) + ); + + std::cout << "Remeshing done." << std::endl; + + return 0; +} diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h new file mode 100644 index 000000000000..3df70524feca --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -0,0 +1,50 @@ +// Copyright (c) 2020 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) : Jane Tournois + +#ifndef CGAL_SIZING_FIELD_H +#define CGAL_SIZING_FIELD_H + +#include + +#include + +namespace CGAL +{ +/*! +* Sizing field virtual class +*/ +template +class Sizing_field +{ +private: + typedef PolygonMesh PM; + typedef typename boost::property_map::const_type VPMap; + typedef typename boost::property_traits::value_type Point; + typedef typename CGAL::Kernel_traits::Kernel K; + +public: + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef Point Point_3; + typedef typename K::FT FT; + +public: + virtual bool is_too_long(const halfedge_descriptor& h, FT& sql) const = 0; + virtual bool is_too_long(const vertex_descriptor& va, const vertex_descriptor& vb) const = 0; + virtual bool is_too_short(const halfedge_descriptor& h, FT& sqlen) const = 0; + virtual Point_3 split_placement(const halfedge_descriptor& h) const = 0; + +}; + +}//end namespace CGAL + +#endif //CGAL_SIZING_FIELD_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h new file mode 100644 index 000000000000..7b00635ff543 --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -0,0 +1,92 @@ +// Copyright (c) 2020 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) : Jane Tournois + +#ifndef CGAL_UNIFORM_SIZING_FIELD_H +#define CGAL_UNIFORM_SIZING_FIELD_H + +#include + +#include + +#include + +namespace CGAL +{ +template +class Uniform_sizing_field : public CGAL::Sizing_field +{ +private: + typedef CGAL::Sizing_field Base; + +public: + typedef typename Base::FT FT; + typedef typename Base::Point_3 Point_3; + typedef typename Base::halfedge_descriptor halfedge_descriptor; + typedef typename Base::vertex_descriptor vertex_descriptor; + + Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + : m_sq_short( CGAL::square(4./5. * size)) + , m_sq_long( CGAL::square(4./3. * size)) + , m_pmesh(pmesh) + {} + +private: + FT sqlength(const vertex_descriptor& va, + const vertex_descriptor& vb) const + { + typename boost::property_map::const_type + vpmap = get(CGAL::vertex_point, m_pmesh); + return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); + } + + FT sqlength(const halfedge_descriptor& h) const + { + return sqlength(target(h, m_pmesh), source(h, m_pmesh)); + } + +public: + bool is_too_long(const halfedge_descriptor& h, FT& sqlen) const + { + sqlen = sqlength(h); + return sqlen > m_sq_long; + } + + bool is_too_long(const vertex_descriptor& va, + const vertex_descriptor& vb) const + { + FT sqlen = sqlength(va, vb); + return sqlen > m_sq_long; + } + + bool is_too_short(const halfedge_descriptor& h, FT& sqlen) const + { + sqlen = sqlength(h); + return sqlen < m_sq_short; + } + + virtual Point_3 split_placement(const halfedge_descriptor& h) const + { + typename boost::property_map::const_type + vpmap = get(CGAL::vertex_point, m_pmesh); + return CGAL::midpoint(get(vpmap, target(h, m_pmesh)), + get(vpmap, source(h, m_pmesh))); + } + +private: + FT m_sq_short; + FT m_sq_long; + const PolygonMesh& m_pmesh; +}; + +}//end namespace CGAL + +#endif //CGAL_UNIFORM_SIZING_FIELD_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 9cdb76ac76b0..e6911102a683 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -478,13 +478,12 @@ namespace internal { // "visits all edges of the mesh //if an edge is longer than the given threshold `high`, the edge //is split at its midpoint and the two adjacent triangles are bisected (2-4 split)" - void split_long_edges(const double& high) + template + void split_long_edges(const SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << "Split long edges (" << high << ")..." << std::endl; #endif - double sq_high = high*high; - //collect long edges typedef std::pair H_and_sql; std::multiset< H_and_sql, std::function > @@ -497,8 +496,8 @@ namespace internal { { if (!is_split_allowed(e)) continue; - double sqlen = sqlength(e); - if(sqlen > sq_high) + double sqlen; + if(sizing.is_too_long(halfedge(e, mesh_), sqlen)) long_edges.emplace(halfedge(e, mesh_), sqlen); } @@ -528,7 +527,7 @@ namespace internal { Patch_id patch_id_opp = get_patch_id(face(opposite(he, mesh_), mesh_)); //split edge - Point refinement_point = this->midpoint(he); + Point refinement_point = sizing.split_placement(he); halfedge_descriptor hnew = CGAL::Euler::split_edge(he, mesh_); CGAL_assertion(he == next(hnew, mesh_)); put(ecmap_, edge(hnew, mesh_), get(ecmap_, edge(he, mesh_)) ); @@ -548,13 +547,12 @@ namespace internal { halfedge_added(hnew_opp, status(opposite(he, mesh_))); //check sub-edges - double sqlen_new = 0.25 * sqlen; - if (sqlen_new > sq_high) - { - //if it was more than twice the "long" threshold, insert them - long_edges.emplace(hnew, sqlen_new); - long_edges.emplace(next(hnew, mesh_), sqlen_new); - } + //if it was more than twice the "long" threshold, insert them + double sqlen_new; + if(sizing.is_too_long(hnew, sqlen_new)) + long_edges.emplace(hnew, sqlen_new); + if(sizing.is_too_long(next(hnew, mesh_), sqlen_new)) + long_edges.insert(long_edge(next(hnew, mesh_), sqlen_new)); //insert new edges to keep triangular faces, and update long_edges if (!is_on_border(hnew)) @@ -573,8 +571,8 @@ namespace internal { if (snew == PATCH) { - double sql = sqlength(hnew2); - if (sql > sq_high) + double sql; + if(sizing.is_too_long(hnew2, sql)) long_edges.emplace(hnew2, sql); } } @@ -596,8 +594,8 @@ namespace internal { if (snew == PATCH) { - double sql = sqlength(hnew2); - if (sql > sq_high) + double sql; + if (sizing.is_too_long(hnew2, sql)) long_edges.emplace(hnew2, sql); } } @@ -620,8 +618,8 @@ namespace internal { // "collapses and thus removes all edges that are shorter than a // threshold `low`. [...] testing before each collapse whether the collapse // would produce an edge that is longer than `high`" - void collapse_short_edges(const double& low, - const double& high, + template + void collapse_short_edges(const SizingFunction& sizing, const bool collapse_constraints) { typedef boost::bimap< @@ -637,14 +635,13 @@ namespace internal { std::cout << "Fill bimap..."; std::cout.flush(); #endif - double sq_low = low*low; - double sq_high = high*high; Boost_bimap short_edges; for(edge_descriptor e : edges(mesh_)) { - double sqlen = sqlength(e); - if ((sqlen < sq_low) && is_collapse_allowed(e, collapse_constraints)) + double sqlen; + if( sizing.is_too_short(halfedge(e, mesh_), sqlen) + && is_collapse_allowed(e, collapse_constraints)) short_edges.insert(short_edge(halfedge(e, mesh_), sqlen)); } #ifdef CGAL_PMP_REMESHING_VERBOSE_PROGRESS @@ -741,7 +738,7 @@ namespace internal { for(halfedge_descriptor ha : halfedges_around_target(va, mesh_)) { vertex_descriptor va_i = source(ha, mesh_); - if (sqlength(vb, va_i) > sq_high) + if (sizing.is_too_long(vb, va_i)) { collapse_ok = false; break; @@ -796,7 +793,7 @@ namespace internal { //fix constrained case CGAL_assertion((is_constrained(vkept) || is_corner(vkept) || is_on_patch_border(vkept)) == (is_va_constrained || is_vb_constrained || is_va_on_constrained_polyline || is_vb_on_constrained_polyline)); - if (fix_degenerate_faces(vkept, short_edges, sq_low, collapse_constraints)) + if (fix_degenerate_faces(vkept, short_edges, sizing, collapse_constraints)) { #ifdef CGAL_PMP_REMESHING_DEBUG debug_status_map(); @@ -806,8 +803,9 @@ namespace internal { //insert new/remaining short edges for (halfedge_descriptor ht : halfedges_around_target(vkept, mesh_)) { - double sqlen = sqlength(ht); - if ((sqlen < sq_low) && is_collapse_allowed(edge(ht, mesh_), collapse_constraints)) + double sqlen; + if (sizing.is_too_short(ht, sqlen) + && is_collapse_allowed(edge(ht, mesh_), collapse_constraints)) short_edges.insert(short_edge(ht, sqlen)); } } @@ -1645,10 +1643,10 @@ namespace internal { // else keep current status for en and eno } - template + template bool fix_degenerate_faces(const vertex_descriptor& v, Bimap& short_edges, - const double& sq_low, + const SizingFunction& sizing, const bool collapse_constraints) { std::unordered_set degenerate_faces; @@ -1726,8 +1724,8 @@ namespace internal { //insert new edges in 'short_edges' if (is_collapse_allowed(edge(hf, mesh_), collapse_constraints)) { - double sqlen = sqlength(hf); - if (sqlen < sq_low) + double sqlen; + if (sizing.is_too_short(hf, sqlen)) short_edges.insert(typename Bimap::value_type(hf, sqlen)); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 6b37ec946ea9..791a0741a611 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -198,6 +199,21 @@ void isotropic_remeshing(const FaceRange& faces , const double& target_edge_length , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) +{ + isotropic_remeshing(faces, + CGAL::Uniform_sizing_field(target_edge_length, pmesh), + pmesh, + np); +} + +template +void isotropic_remeshing(const FaceRange& faces + , const SizingFunction& sizing + , PolygonMesh& pmesh + , const NamedParameters& np) { if (boost::begin(faces)==boost::end(faces)) return; @@ -261,12 +277,10 @@ void isotropic_remeshing(const FaceRange& faces #endif ) ) ); - double low = 4. / 5. * target_edge_length; - double high = 4. / 3. * target_edge_length; - #if !defined(CGAL_NO_PRECONDITIONS) if(protect) { + double high = 4. / 3. * target_edge_length; std::string msg("Isotropic remeshing : protect_constraints cannot be set to"); msg.append(" true with constraints larger than 4/3 * target_edge_length."); msg.append(" Remeshing aborted."); @@ -313,13 +327,11 @@ void isotropic_remeshing(const FaceRange& faces #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " * Iteration " << (i + 1) << " *" << std::endl; #endif - if (target_edge_length>0) - { - if(do_split) - remesher.split_long_edges(high); - if(do_collapse) - remesher.collapse_short_edges(low, high, collapse_constraints); - } + + if(do_split) + remesher.split_long_edges(sizing); + if(do_collapse) + remesher.collapse_short_edges(sizing, collapse_constraints); if(do_flip) remesher.flip_edges_for_valence_and_shape(); remesher.tangential_relaxation_impl(smoothing_1d, nb_laplacian); From 9de41310fd27bd8d55a7a9b75914f5c2d60f2a1f Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 30 Jul 2020 16:23:03 +0200 Subject: [PATCH 0273/1398] use boost::optional instead of a bool and a double # Conflicts: # Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h --- .../Isotropic_remeshing/Sizing_field.h | 14 ++--- .../Uniform_sizing_field.h | 35 ++++++++----- .../Isotropic_remeshing/remesh_impl.h | 51 ++++++++++--------- 3 files changed, 57 insertions(+), 43 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index 3df70524feca..fc6b14a984f5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -10,12 +10,13 @@ // // Author(s) : Jane Tournois -#ifndef CGAL_SIZING_FIELD_H -#define CGAL_SIZING_FIELD_H +#ifndef CGAL_PMP_REMESHING_SIZING_FIELD_H +#define CGAL_PMP_REMESHING_SIZING_FIELD_H #include #include +#include namespace CGAL { @@ -38,13 +39,14 @@ class Sizing_field typedef typename K::FT FT; public: - virtual bool is_too_long(const halfedge_descriptor& h, FT& sql) const = 0; - virtual bool is_too_long(const vertex_descriptor& va, const vertex_descriptor& vb) const = 0; - virtual bool is_too_short(const halfedge_descriptor& h, FT& sqlen) const = 0; + virtual boost::optional is_too_long(const halfedge_descriptor& h) const = 0; + virtual boost::optional is_too_long(const vertex_descriptor& va, + const vertex_descriptor& vb) const = 0; + virtual boost::optional is_too_short(const halfedge_descriptor& h) const = 0; virtual Point_3 split_placement(const halfedge_descriptor& h) const = 0; }; }//end namespace CGAL -#endif //CGAL_SIZING_FIELD_H +#endif //CGAL_PMP_REMESHING_SIZING_FIELD_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index 7b00635ff543..8704c84ef117 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -10,8 +10,8 @@ // // Author(s) : Jane Tournois -#ifndef CGAL_UNIFORM_SIZING_FIELD_H -#define CGAL_UNIFORM_SIZING_FIELD_H +#ifndef CGAL_PMP_REMESHING_UNIFORM_SIZING_FIELD_H +#define CGAL_PMP_REMESHING_UNIFORM_SIZING_FIELD_H #include @@ -54,23 +54,32 @@ class Uniform_sizing_field : public CGAL::Sizing_field } public: - bool is_too_long(const halfedge_descriptor& h, FT& sqlen) const + boost::optional is_too_long(const halfedge_descriptor& h) const { - sqlen = sqlength(h); - return sqlen > m_sq_long; + const FT sqlen = sqlength(h); + if(sqlen > m_sq_long) + return sqlen; + else + return boost::none; } - bool is_too_long(const vertex_descriptor& va, - const vertex_descriptor& vb) const + boost::optional is_too_long(const vertex_descriptor& va, + const vertex_descriptor& vb) const { - FT sqlen = sqlength(va, vb); - return sqlen > m_sq_long; + const FT sqlen = sqlength(va, vb); + if (sqlen > m_sq_long) + return sqlen; + else + return boost::none; } - bool is_too_short(const halfedge_descriptor& h, FT& sqlen) const + boost::optional is_too_short(const halfedge_descriptor& h) const { - sqlen = sqlength(h); - return sqlen < m_sq_short; + const FT sqlen = sqlength(h); + if (sqlen < m_sq_long) + return sqlen; + else + return boost::none; } virtual Point_3 split_placement(const halfedge_descriptor& h) const @@ -89,4 +98,4 @@ class Uniform_sizing_field : public CGAL::Sizing_field }//end namespace CGAL -#endif //CGAL_UNIFORM_SIZING_FIELD_H +#endif //CGAL_PMP_REMESHING_UNIFORM_SIZING_FIELD_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index e6911102a683..ed95352bab9c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -496,9 +496,9 @@ namespace internal { { if (!is_split_allowed(e)) continue; - double sqlen; - if(sizing.is_too_long(halfedge(e, mesh_), sqlen)) - long_edges.emplace(halfedge(e, mesh_), sqlen); + boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_)); + if(sqlen != boost::none) + long_edges.emplace(halfedge(e, mesh_), sqlen.get()); } //split long edges @@ -548,11 +548,13 @@ namespace internal { //check sub-edges //if it was more than twice the "long" threshold, insert them - double sqlen_new; - if(sizing.is_too_long(hnew, sqlen_new)) - long_edges.emplace(hnew, sqlen_new); - if(sizing.is_too_long(next(hnew, mesh_), sqlen_new)) - long_edges.insert(long_edge(next(hnew, mesh_), sqlen_new)); + boost::optional sqlen_new = sizing.is_too_long(hnew); + if(sqlen_new != boost::none) + long_edges.emplace(hnew, sqlen_new.get()); + + sqlen_new = sizing.is_too_long(next(hnew, mesh_)); + if (sqlen_new != boost::none) + long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); //insert new edges to keep triangular faces, and update long_edges if (!is_on_border(hnew)) @@ -571,9 +573,9 @@ namespace internal { if (snew == PATCH) { - double sql; - if(sizing.is_too_long(hnew2, sql)) - long_edges.emplace(hnew2, sql); + boost::optional sql = sizing.is_too_long(hnew2); + if(sql != boost::none) + long_edges.emplace(hnew2, sql.get()); } } @@ -594,9 +596,9 @@ namespace internal { if (snew == PATCH) { - double sql; - if (sizing.is_too_long(hnew2, sql)) - long_edges.emplace(hnew2, sql); + boost::optional sql = sizing.is_too_long(hnew2); + if (sql != boost::none) + long_edges.emplace(hnew2, sql.get()); } } } @@ -639,10 +641,10 @@ namespace internal { Boost_bimap short_edges; for(edge_descriptor e : edges(mesh_)) { - double sqlen; - if( sizing.is_too_short(halfedge(e, mesh_), sqlen) + boost::optional sqlen = sizing.is_too_short(halfedge(e, mesh_)); + if(sqlen != boost::none && is_collapse_allowed(e, collapse_constraints)) - short_edges.insert(short_edge(halfedge(e, mesh_), sqlen)); + short_edges.insert(short_edge(halfedge(e, mesh_), sqlen.get())); } #ifdef CGAL_PMP_REMESHING_VERBOSE_PROGRESS std::cout << "done." << std::endl; @@ -738,7 +740,8 @@ namespace internal { for(halfedge_descriptor ha : halfedges_around_target(va, mesh_)) { vertex_descriptor va_i = source(ha, mesh_); - if (sizing.is_too_long(vb, va_i)) + boost::optional sqha = sizing.is_too_long(vb, va_i); + if (sqha != boost::none) { collapse_ok = false; break; @@ -803,10 +806,10 @@ namespace internal { //insert new/remaining short edges for (halfedge_descriptor ht : halfedges_around_target(vkept, mesh_)) { - double sqlen; - if (sizing.is_too_short(ht, sqlen) + boost::optional sqlen = sizing.is_too_short(ht); + if (sqlen != boost::none && is_collapse_allowed(edge(ht, mesh_), collapse_constraints)) - short_edges.insert(short_edge(ht, sqlen)); + short_edges.insert(short_edge(ht, sqlen.get())); } } }//end if(collapse_ok) @@ -1724,9 +1727,9 @@ namespace internal { //insert new edges in 'short_edges' if (is_collapse_allowed(edge(hf, mesh_), collapse_constraints)) { - double sqlen; - if (sizing.is_too_short(hf, sqlen)) - short_edges.insert(typename Bimap::value_type(hf, sqlen)); + boost::optional sqlen = sizing.is_too_short(hf); + if (sqlen != boost::none) + short_edges.insert(typename Bimap::value_type(hf, sqlen.get())); } if(!is_border(hf, mesh_) && From ad55b8cd9f7e6dd5cf9a54818c06570b36b861fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 11 Apr 2021 07:45:14 +0200 Subject: [PATCH 0274/1398] fix compilation issues --- .../Isotropic_remeshing/remesh_impl.h | 9 ++++----- .../CGAL/Polygon_mesh_processing/remesh.h | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index ed95352bab9c..6103108cc50e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -227,14 +227,14 @@ namespace internal { template + typename FacePatchMap, + typename SizingFunction> bool constraints_are_short_enough(const PM& pmesh, EdgeConstraintMap ecmap, VertexPointMap vpmap, const FacePatchMap& fpm, - const double& high) + const SizingFunction& sizing) { - double sqh = high*high; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; for(edge_descriptor e : edges(pmesh)) @@ -244,8 +244,7 @@ namespace internal { get(ecmap, e) || get(fpm, face(h,pmesh))!=get(fpm, face(opposite(h,pmesh),pmesh)) ) { - if (sqh < CGAL::squared_distance(get(vpmap, source(h, pmesh)), - get(vpmap, target(h, pmesh)))) + if (sizing.is_too_long(source(h, pmesh), target(h, pmesh))) { return false; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 791a0741a611..8887a0b9beb5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -31,6 +31,16 @@ namespace CGAL { namespace Polygon_mesh_processing { +/*! \todo document me or merge the doc with the original overload*/ +template +void isotropic_remeshing(const FaceRange& faces + , const SizingFunction& sizing + , PolygonMesh& pmesh + , const NamedParameters& np); + /*! * \ingroup PMP_meshing_grp * @@ -200,8 +210,10 @@ void isotropic_remeshing(const FaceRange& faces , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { - isotropic_remeshing(faces, - CGAL::Uniform_sizing_field(target_edge_length, pmesh), + typedef Uniform_sizing_field Default_sizing; + isotropic_remeshing( + faces, + Default_sizing(target_edge_length, pmesh), pmesh, np); } @@ -280,12 +292,11 @@ void isotropic_remeshing(const FaceRange& faces #if !defined(CGAL_NO_PRECONDITIONS) if(protect) { - double high = 4. / 3. * target_edge_length; std::string msg("Isotropic remeshing : protect_constraints cannot be set to"); msg.append(" true with constraints larger than 4/3 * target_edge_length."); msg.append(" Remeshing aborted."); CGAL_precondition_msg( - internal::constraints_are_short_enough(pmesh, ecmap, vpmap, fpmap, high), + internal::constraints_are_short_enough(pmesh, ecmap, vpmap, fpmap, sizing), msg.c_str()); } #endif From 5c1e820c1eff9fba31e6622e7d4737cfcc619fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 11 Apr 2021 08:39:54 +0200 Subject: [PATCH 0275/1398] fix test and demo --- .../internal/Isotropic_remeshing/remesh_impl.h | 4 ++-- .../include/CGAL/Polygon_mesh_processing/remesh.h | 6 ++---- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 6103108cc50e..f0daf9cc20a5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -481,7 +481,7 @@ namespace internal { void split_long_edges(const SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE - std::cout << "Split long edges (" << high << ")..." << std::endl; + std::cout << "Split long edges..." << std::endl; #endif //collect long edges typedef std::pair H_and_sql; @@ -629,7 +629,7 @@ namespace internal { typedef typename Boost_bimap::value_type short_edge; #ifdef CGAL_PMP_REMESHING_VERBOSE - std::cout << "Collapse short edges (" << low << ", " << high << ")..." + std::cout << "Collapse short edges..." << std::endl; #endif #ifdef CGAL_PMP_REMESHING_VERBOSE_PROGRESS diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 8887a0b9beb5..54c99b2de432 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -328,8 +328,7 @@ void isotropic_remeshing(const FaceRange& faces #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << std::endl; - std::cout << "Remeshing (size = " << target_edge_length; - std::cout << ", #iter = " << nb_iterations << ")..." << std::endl; + std::cout << "Remeshing (#iter = " << nb_iterations << ")..." << std::endl; t.reset(); t.start(); #endif @@ -355,8 +354,7 @@ void isotropic_remeshing(const FaceRange& faces #ifdef CGAL_PMP_REMESHING_VERBOSE t.stop(); - std::cout << "Remeshing done (size = " << target_edge_length; - std::cout << ", #iter = " << nb_iterations; + std::cout << "Remeshing done (#iter = " << nb_iterations; std::cout << ", " << t.time() << " sec )." << std::endl; #endif } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 37dcedc8adb2..d20594ec1688 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -406,7 +406,7 @@ public Q_SLOTS: selection_item->constrained_edges_pmap(), get(CGAL::vertex_point, *selection_item->polyhedron()), CGAL::Constant_property_map(1), - 4. / 3. * target_length)) + CGAL::Uniform_sizing_field(target_length, pmesh))) { QApplication::restoreOverrideCursor(); //If facets are selected, splitting edges will add facets that won't be selected, and it will mess up the rest. @@ -606,7 +606,7 @@ public Q_SLOTS: ecm, get(CGAL::vertex_point, pmesh), CGAL::Constant_property_map(1), - 4. / 3. * target_length)) + CGAL::Uniform_sizing_field(target_length, pmesh))) { QApplication::restoreOverrideCursor(); QMessageBox::warning(mw, tr("Error"), From 50bbb4f6828ad0291cee8383c4decb8cb31b23a9 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 12 Apr 2021 07:48:10 +0200 Subject: [PATCH 0276/1398] add namespace to avoid conflicts with Uniform_sizing_field in Mesh_3 --- .../internal/Isotropic_remeshing/Uniform_sizing_field.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index 8704c84ef117..3f32aacb1aa9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -21,6 +21,8 @@ namespace CGAL { +namespace Polygon_mesh_processing +{ template class Uniform_sizing_field : public CGAL::Sizing_field { @@ -96,6 +98,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field const PolygonMesh& m_pmesh; }; +}//end namespace Polygon_mesh_processing }//end namespace CGAL #endif //CGAL_PMP_REMESHING_UNIFORM_SIZING_FIELD_H From 13c4db20dd6f6858cad4eb8aa0b25b6d9b540739 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 12 Apr 2021 11:28:32 +0200 Subject: [PATCH 0277/1398] fix max value for constraints length --- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index d20594ec1688..f1b138c16728 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -406,7 +406,7 @@ public Q_SLOTS: selection_item->constrained_edges_pmap(), get(CGAL::vertex_point, *selection_item->polyhedron()), CGAL::Constant_property_map(1), - CGAL::Uniform_sizing_field(target_length, pmesh))) + CGAL::Polygon_mesh_processing::Uniform_sizing_field( 4. / 3. * target_length, pmesh))) { QApplication::restoreOverrideCursor(); //If facets are selected, splitting edges will add facets that won't be selected, and it will mess up the rest. @@ -606,7 +606,7 @@ public Q_SLOTS: ecm, get(CGAL::vertex_point, pmesh), CGAL::Constant_property_map(1), - CGAL::Uniform_sizing_field(target_length, pmesh))) + CGAL::Polygon_mesh_processing::Uniform_sizing_field(4. / 3. * target_length, pmesh))) { QApplication::restoreOverrideCursor(); QMessageBox::warning(mw, tr("Error"), From a94052388247059d6c6d5ab2f76d1663a43a1d71 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 15 May 2023 15:52:35 +0100 Subject: [PATCH 0278/1398] Mesh_3: Move doxygen into header file --- .../Polyhedral_mesh_domain_with_features_3.h | 105 ------------------ Mesh_3/doc/Mesh_3/Doxyfile.in | 1 + .../Polyhedral_mesh_domain_with_features_3.h | 104 ++++++++++++++--- 3 files changed, 92 insertions(+), 118 deletions(-) delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h diff --git a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h deleted file mode 100644 index 8ee1140044cd..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ /dev/null @@ -1,105 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose -boundary is a simplicial polyhedral surface. -This surface must be free of intersection. -It can either be closed, -included inside another polyhedral surface which is closed and free of intersection, -or open. In the latter case, the meshing process will only take care of the quality -of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. - -It is a model of the concept `MeshDomainWithFeatures_3`. It also -provides a member function to automatically detect sharp features and boundaries from -the input polyhedral surface(s). - -\tparam IGT stands for a geometric traits class providing the types -and functors required to implement the intersection tests and intersection computations -for polyhedral boundary surfaces. This parameter has to be -instantiated with a model of the concept `IntersectionGeometricTraits_3`. - -\cgalModels `MeshDomainWithFeatures_3` - -\sa `CGAL::Mesh_domain_with_polyline_features_3` -\sa `CGAL::Polyhedral_mesh_domain_3` -\sa `CGAL::Mesh_polyhedron_3` -*/ -template< typename IGT > -class Polyhedral_mesh_domain_with_features_3 - : public CGAL::Mesh_domain_with_polyline_features_3< - CGAL::Polyhedral_mesh_domain_3< CGAL::Mesh_polyhedron_3::type, IGT> > - { -public: - -/// \name Types -/// @{ - -/*! -Numerical type. -*/ -typedef unspecified_type FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface of type `Polyhedron`. -The only requirement on type `Polyhedron` is that `CGAL::Mesh_polyhedron_3::%type` should -be constructible from `Polyhedron`. -No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done. -The polyhedron `bounding_polyhedron` has to be closed and free of intersections. -Its interior of `bounding_polyhedron` will be meshed. -*/ -template -Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron); - - -/*! -Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface, and a bounding polyhedral surface. -`CGAL::Mesh_polyhedron_3::%type` should be constructible from `Polyhedron`. -The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed -and free of intersections. -Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. -The inside of `bounding_polyhedron` will be meshed. -*/ -template -Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron, - const Polyhedron& bounding_polyhedron); - -/*! -\deprecated Constructs a `Polyhedral_mesh_domain_with_features_3` from an off file. No feature -detection is done at this level. Users must read the file into a `Polyhedron_3` and call the -constructor above. -*/ -Polyhedral_mesh_domain_with_features_3(const std::string& filename); - -/// @} - -/// \name Operations -/// @{ - -/*! -Detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedron) -and inserts them as features of the domain. `angle_bound` gives the maximum -angle (in degrees) between the two normal vectors of adjacent triangles. -For an edge of the polyhedron, if the angle between the two normal vectors of its -incident facets is bigger than the given bound, then the edge is considered as -a feature edge. -*/ -void detect_features(FT angle_bound=60); - - -/*! -Detects border edges of the bounding polyhedron and inserts them as features of the domain. -This function should be called alone only, and not before or after `detect_features()`. -*/ - void detect_borders(); - -/// @} - -}; /* end Polyhedral_mesh_domain_with_features_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index d3608c7b5a0e..7e8105428e3a 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -4,6 +4,7 @@ ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of points, each pair of contiguous points defines a segment of the polyline. If the first and last points of the polyline are identical, the polyline is closed." INPUT += \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_with_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/generate_label_weights.h \ diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index acaf34553212..bb8eb5df378a 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -57,11 +57,36 @@ namespace CGAL { -/** - * @class Polyhedral_mesh_domain_with_features_3 - * - * - */ +/*! +\ingroup PkgMesh3Domains + +The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose +boundary is a simplicial polyhedral surface. +This surface must be free of intersection. +It can either be closed, +included inside another polyhedral surface which is closed and free of intersection, +or open. In the latter case, the meshing process will only take care of the quality +of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. + +It is a model of the concept `MeshDomainWithFeatures_3`. It also +provides a member function to automatically detect sharp features and boundaries from +the input polyhedral surface(s). + +\tparam IGT stands for a geometric traits class providing the types +and functors required to implement the intersection tests and intersection computations +for polyhedral boundary surfaces. This parameter has to be +instantiated with a model of the concept +`IntersectionGeometricTraits_3`. + + +\tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. + +\cgalModels `MeshDomainWithFeatures_3` + +\sa `CGAL::Mesh_domain_with_polyline_features_3` +\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Mesh_polyhedron_3` +*/ template < class IGT_, class Polyhedron_ = typename Mesh_polyhedron_3::type, class TriangleAccessor= CGAL::Default, @@ -114,27 +139,50 @@ class Polyhedral_mesh_domain_with_features_3 typedef typename Base::R R; typedef typename Base::Point_3 Point_3; + + + /// \name Types + /// @{ + + /*! + Numerical type. + */ typedef typename Base::FT FT; + /// @} + typedef CGAL::Tag_true Has_features; typedef std::vector Bare_polyline; typedef Mesh_3::Polyline_with_context Polyline_with_context; - /// Constructors - Polyhedral_mesh_domain_with_features_3(const Polyhedron& p, + +/// \name Creation +/// @{ + + /*! + Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface. + No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done. + The polyhedron `bounding_polyhedron` has to be closed and free of intersections. + Its interior of `bounding_polyhedron` will be meshed. + */ + Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron, CGAL::Random* p_rng = nullptr) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(1); - stored_polyhedra[0] = p; + stored_polyhedra[0] = bounding_polyhedron; get(face_patch_id_t(), stored_polyhedra[0]); this->add_primitives(stored_polyhedra[0]); this->build(); } #ifndef CGAL_NO_DEPRECATED_CODE - + /*! + \deprecated Constructs a `Polyhedral_mesh_domain_with_features_3` from an off file. No feature + detection is done at this level. Users must read the file into a `Polyhedron` and call the + constructor above. + */ CGAL_DEPRECATED Polyhedral_mesh_domain_with_features_3(const std::string& filename, CGAL::Random* p_rng = nullptr) @@ -155,14 +203,21 @@ class Polyhedral_mesh_domain_with_features_3 } #endif // not CGAL_NO_DEPRECATED_CODE - Polyhedral_mesh_domain_with_features_3(const Polyhedron& p, - const Polyhedron& bounding_p, + /*! + Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface, and a bounding polyhedral surface. + The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed + and free of intersections. + Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes. + The inside of `bounding_polyhedron` will be meshed. + */ + Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron, + const Polyhedron& bounding_polyhedron, CGAL::Random* p_rng = nullptr) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(2); - stored_polyhedra[0] = p; - stored_polyhedra[1] = bounding_p; + stored_polyhedra[0] = polyhedron; + stored_polyhedra[1] = bounding_polyhedron; get(face_patch_id_t(), stored_polyhedra[0]); get(face_patch_id_t(), stored_polyhedra[1]); this->add_primitives(stored_polyhedra[0]); @@ -219,18 +274,41 @@ class Polyhedral_mesh_domain_with_features_3 /// Destructor ~Polyhedral_mesh_domain_with_features_3() {} +/// @} + /// Detect features void initialize_ts(Polyhedron& p); + void detect_features(FT angle_in_degree, std::vector& p); + +/// \name Operations +/// @{ + + /*! + Detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedron) + and inserts them as features of the domain. `angle_bound` gives the maximum + angle (in degrees) between the two normal vectors of adjacent triangles. + For an edge of the polyhedron, if the angle between the two normal vectors of its + incident facets is bigger than the given bound, then the edge is considered as + a feature edge. + */ void detect_features(FT angle_in_degree = FT(60)) { detect_features(angle_in_degree, stored_polyhedra); } void detect_borders(std::vector& p); + + /*! + Detects border edges of the bounding polyhedron and inserts them as features of the domain. + This function should be called alone only, and not before or after `detect_features()`. + */ + void detect_borders() { detect_borders(stored_polyhedra); }; + /// @} + template void add_features(InputIterator first, InputIterator end) From 7171de7b03167ecede862be52f4744153c5498f3 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 15 May 2023 21:59:09 +0100 Subject: [PATCH 0279/1398] Mesh_3: Move doxygen into header file --- Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h | 62 ---------------- Mesh_3/doc/Mesh_3/CGAL/Mesh_triangulation_3.h | 57 --------------- .../Mesh_3/CGAL/Polyhedral_mesh_domain_3.h | 60 ---------------- Mesh_3/doc/Mesh_3/Doxyfile.in | 2 + Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 65 ++++++++++++++++- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 56 ++++++++++++++- .../include/CGAL/Polyhedral_mesh_domain_3.h | 72 +++++++++++++++---- .../Polyhedral_mesh_domain_with_features_3.h | 2 +- 8 files changed, 177 insertions(+), 199 deletions(-) delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_triangulation_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h deleted file mode 100644 index 873a815075d5..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h +++ /dev/null @@ -1,62 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The class `Mesh_cell_criteria_3` is a model of `MeshCellCriteria_3`. It provides, -for the mesh tetrahedra, -a uniform shape criteria -and a sizing field which may be a uniform or variable field. - -\tparam Tr must be identical to the nested type -`Triangulation` of the instance used as model of -`MeshComplex_3InTriangulation_3`. - -\cgalModels `MeshCellCriteria_3` - -\sa `MeshCriteria_3` -\sa `CGAL::Mesh_criteria_3` -\sa `CGAL::make_mesh_3()` - -*/ -template< typename Tr > -class Mesh_cell_criteria_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type -*/ -typedef Tr::FT FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -Returns an object to serve as default criteria for cells. The argument -`radius_edge_bound` is the upper bound for the radius-edge ratio -of the tetrahedra. The argument `radius_bound` is a uniform upper bound -for the circumradii of the tetrahedra in the mesh. See -section \ref introsecparam for further details. -Note that if one parameter is set to 0, then its corresponding criteria is ignored. -*/ - Mesh_cell_criteria_3(const FT& radius_edge_bound, - const FT& radius_bound); - -/*! -Returns an object to serve as default criteria for facets. The type `SizingField` must -be a model of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same -as above, except that the radius bound parameter is a functional instead of a constant. -*/ - template - Mesh_cell_criteria_3(const FT& radius_edge_bound, - const SizingField& radius_bound); - -/// @} - -}; /* end Mesh_cell_criteria_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_triangulation_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_triangulation_3.h deleted file mode 100644 index cb8834e90409..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_triangulation_3.h +++ /dev/null @@ -1,57 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The class `Mesh_triangulation_3` is a class template which provides the triangulation -type to be used for the 3D triangulation embedding the mesh. - -\tparam MD must be a model of `MeshDomain_3`. - -\tparam Gt must be a model of `MeshTriangulationTraits_3` or `Default` -and defaults to `Kernel_traits::%Kernel`. - -\tparam Concurrency_tag enables sequential versus parallel meshing and optimization algorithms. - Possible values are `Sequential_tag` (the default), `Parallel_tag`, - and `Parallel_if_available_tag`. - -\tparam Vertex_base must be a model of `MeshVertexBase_3` or `Default` -and defaults to `Mesh_vertex_base_3`. - -\tparam Cell_base must be a model of `MeshCellBase_3` or `Default` -and defaults to `Compact_mesh_cell_base_3`. - -\warning To improve the robustness of the meshing process, the input traits `Gt` - is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`. - The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors - models of `Kernel::ConstructWeightedCircumcenter_3`, `Kernel::ComputeSquaredRadius_3`, - and `Kernel::ComputeSquaredRadiusSmallestOrthogonalSphere_3` that are - provided by `Gt` to use exact computations when the geometric configuration - is close to degenerate (e.g. almost coplanar points).
    - Users should therefore be aware that the traits class of the triangulation - will have type `Robust_weighted_circumcenter_filtered_traits_3`. - -\sa `make_mesh_3()` -\sa `Mesh_complex_3_in_triangulation_3` - -*/ -template< typename MD, typename Gt, - typename Concurrency_tag, - typename Vertex_base, - typename Cell_base > -struct Mesh_triangulation_3 { - -/// \name Types -/// @{ - -/*! -The triangulation type to be used for the 3D triangulation embedding the mesh. -This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex -and cell base classes are respectively `Vertex_base` and `Cell_base`. -*/ -typedef unspecified_type type; - -/// @} - -}; /* end Mesh_triangulation_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h deleted file mode 100644 index a084e25bfcf8..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h +++ /dev/null @@ -1,60 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Polyhedral_mesh_domain_3` implements -a domain defined by a simplicial polyhedral surface. - -The input polyhedral surface must be free of intersection. -It must include (at least) one closed connected component -that defines the boundary of the domain to be meshed. -Inside this bounding component, -the input polyhedral surface may contain -several other components (closed or not) -that will be represented in the final mesh. -This class is a model of the concept `MeshDomain_3`. - -\tparam Polyhedron stands for the type of the input polyhedral surface(s), -model of `FaceListGraph`. - -\tparam IGT stands for a geometric traits class -providing the types and functors required to implement -the intersection tests and intersection computations -for polyhedral boundary surfaces. This parameter has to be instantiated -with a model of the concept `IntersectionGeometricTraits_3`. - -\cgalModels `MeshDomain_3` - -\sa `IntersectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ -template< typename Polyhedron, typename IGT, typename TriangleAccessor > -class Polyhedral_mesh_domain_3 -{ -public: - -/// \name Creation -/// @{ - -/*! -Construction from a bounding polyhedral surface which must be closed, and free of intersections. -The inside of `bounding_polyhedron` will be meshed. -*/ -Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron); - -/*! -Construction from a polyhedral surface, and a bounding polyhedral surface,. -The first polyhedron must be entirely included inside `bounding_polyhedron`, which must be closed -and free of intersections. -Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. -The inside of `bounding_polyhedron` will be meshed. -*/ -Polyhedral_mesh_domain_3(const Polyhedron& polyhedron, - const Polyhedron& bounding_polyhedron); - -/// @} - -}; /* end Polyhedral_mesh_domain_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 7e8105428e3a..fdbd34718f79 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -4,6 +4,8 @@ ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of points, each pair of contiguous points defines a segment of the polyline. If the first and last points of the polyline are identical, the polyline is closed." INPUT += \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_triangulation_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_with_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h \ diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index 061936937609..27b81bcb2ca0 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -27,6 +27,28 @@ namespace CGAL { +/*! +\ingroup PkgMesh3MeshClasses + +The class `Mesh_cell_criteria_3` is a model of `MeshCellCriteria_3`. It provides, +for the mesh tetrahedra, +a uniform shape criteria +and a sizing field which may be a uniform or variable field. + +\tparam Tr must be identical to the nested type +`Triangulation` of the instance used as model of +`MeshComplex_3InTriangulation_3`. + +@todo What to do with `Visitor_`? + +\cgalModels `MeshCellCriteria_3` + +\sa `MeshCriteria_3` +\sa `CGAL::Mesh_criteria_3` +\sa `CGAL::make_mesh_3()` + +*/ + template > class Mesh_cell_criteria_3 @@ -47,10 +69,34 @@ class Mesh_cell_criteria_3 public: - /** +#ifdef DOXYGEN_RUNNING +/// \name Types +/// @{ + +/*! +Numerical type +@todo: In the code this typedef is private +*/ +typedef Tr::FT FT; + +/// @} +#endif + + + /// \name Creation +/// @{ + + /*! * @brief Constructor - * @param radius_edge_bound the radius-edge bound - * @param radius_bound the radius bound (tet sizing) + + * @param radius_edge_bound is the upper bound for the radius-edge + * ratio of the tetrahedra. + * @param radius_bound is a uniform upper bound + for the circumradii of the tetrahedra in the + * mesh. + * + * See Section \ref introsecparam for further details. + * Note that if one parameter is set to 0, then its corresponding criteria is ignored. */ Mesh_cell_criteria_3(const FT& radius_edge_bound, const FT& radius_bound) @@ -64,6 +110,17 @@ class Mesh_cell_criteria_3 // Nb: SFINAE to avoid wrong matches with built-in numerical types // as int. + + /*! + Returns an object to serve as default criteria for facets. + @tparam SizingField must be a model of the concept + `MeshDomainField_3`. + + The behavior and semantic of the arguments are the same + as above, except that the radius bound parameter is a functional + instead of a constant. + @todo hide the `enable_if_t` + */ template Mesh_cell_criteria_3(const FT& radius_edge_bound, const Sizing_field& radius_bound, @@ -78,6 +135,8 @@ class Mesh_cell_criteria_3 init_radius_edge(radius_edge_bound); } + /// @} + /// Destructor ~Mesh_cell_criteria_3() { } diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index 8d8012806c7f..72d133a36d54 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -122,8 +122,42 @@ class Mesh_3_regular_triangulation_3_wrapper } }; -// Struct Mesh_triangulation_3 -// + +/*! +\ingroup PkgMesh3MeshClasses + +The class `Mesh_triangulation_3` is a class template which provides the triangulation +type to be used for the 3D triangulation embedding the mesh. + +\tparam MD must be a model of `MeshDomain_3`. + +\tparam K_ must be a model of `MeshTriangulationTraits_3` or `Default` +and defaults to `Kernel_traits::%Kernel`. + +\tparam Concurrency_tag_ enables sequential versus parallel meshing and optimization algorithms. + Possible values are `Sequential_tag` (the default), `Parallel_tag`, + and `Parallel_if_available_tag`. + +\tparam Vertex_base__ must be a model of `MeshVertexBase_3` or `Default` +and defaults to `Mesh_vertex_base_3`. + +\tparam Cell_base_ must be a model of `MeshCellBase_3` or `Default` +and defaults to `Compact_mesh_cell_base_3`. + +\warning To improve the robustness of the meshing process, the input traits `K_` + is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`. + The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors + models of `Kernel::ConstructWeightedCircumcenter_3`, `Kernel::ComputeSquaredRadius_3`, + and `Kernel::ComputeSquaredRadiusSmallestOrthogonalSphere_3` that are + provided by `K_` to use exact computations when the geometric configuration + is close to degenerate (e.g. almost coplanar points).
    + Users should therefore be aware that the traits class of the triangulation + will have type `Robust_weighted_circumcenter_filtered_traits_3`. + +\sa `make_mesh_3()` +\sa `Mesh_complex_3_in_triangulation_3` + +*/ template; public: + +#ifndef DOXYGEN_RUNNING using type = Triangulation; using Type = type; +#else + +/// \name Types +/// @{ + +/*! +The triangulation type to be used for the 3D triangulation embedding the mesh. +This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex +and cell base classes are respectively `Vertex_base` and `Cell_base`. +*/ +typedef unspecified_type type; + +#endif + +/// @} + }; // end struct Mesh_triangulation_3 } // end namespace CGAL diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 2d9bf625f57d..f944d1c7739b 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -104,11 +104,39 @@ struct IGT_generator } // end namespace details } // end namespace Mesh_3 -/** - * @class Polyhedral_mesh_domain_3 - * - * - */ + +/*! +\ingroup PkgMesh3Domains + +The class `Polyhedral_mesh_domain_3` implements +a domain defined by a simplicial polyhedral surface. + +The input polyhedral surface must be free of intersection. +It must include (at least) one closed connected component +that defines the boundary of the domain to be meshed. +Inside this bounding component, +the input polyhedral surface may contain +several other components (closed or not) +that will be represented in the final mesh. +This class is a model of the concept `MeshDomain_3`. + +\tparam Polyhedron stands for the type of the input polyhedral surface(s), +model of `FaceListGraph`. + +\tparam IGT stands for a geometric traits class +providing the types and functors required to implement +the intersection tests and intersection computations +for polyhedral boundary surfaces. This parameter has to be instantiated +with a model of the concept `IntersectionGeometricTraits_3`. + +\cgalModels `MeshDomain_3` + +\sa `IntersectionGeometricTraits_3` +\sa `CGAL::make_mesh_3()`. + +*/ + + templateadd_primitives(p); - if(! is_triangle_mesh(p)) { + this->add_primitives(bounding_polyhedron); + if(! is_triangle_mesh(bounding_polyhedron)) { std::cerr << "Your input polyhedron must be triangulated!\n"; CGAL_error_msg("Your input polyhedron must be triangulated!"); } this->build(); } + /*! + Construction from a polyhedral surface, and a bounding polyhedral surface. + The first polyhedron must be entirely included inside `bounding_polyhedron`, which must be closed + and free of intersections. + Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. + The inside of `bounding_polyhedron` will be meshed. +*/ Polyhedral_mesh_domain_3(const Polyhedron& p, const Polyhedron& bounding_polyhedron, CGAL::Random* p_rng = nullptr) @@ -241,7 +281,8 @@ class Polyhedral_mesh_domain_3 this->build(); } - /** + /*! + * @todo was not in doxygen * Constructor. * * Constructor from a sequence of polyhedral surfaces, and a bounding @@ -274,7 +315,8 @@ class Polyhedral_mesh_domain_3 this->build(); } - /** + /*! + * @todo was not in doxygen * Constructor. * * Constructor from a sequence of polyhedral surfaces, without bounding @@ -309,6 +351,8 @@ class Polyhedral_mesh_domain_3 void set_surface_only() { bounding_tree_ = 0; } +/// @} + /** * Constructs a set of \ccc{n} points on the surface, and output them to diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index bb8eb5df378a..0d01d4159222 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -222,7 +222,7 @@ class Polyhedral_mesh_domain_with_features_3 get(face_patch_id_t(), stored_polyhedra[1]); this->add_primitives(stored_polyhedra[0]); this->add_primitives(stored_polyhedra[1]); - if(CGAL::is_empty(bounding_p)) { + if(CGAL::is_empty(bounding_polyhedron)) { this->set_surface_only(); } else { this->add_primitives_to_bounding_tree(stored_polyhedra[1]); From f1780e39ddb2bfa3857e410caf386f29ad071fa6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 09:32:15 +0100 Subject: [PATCH 0280/1398] Mesh_3: Move doxygen into header file --- .../Mesh_3/CGAL/Gray_image_mesh_domain_3.h | 80 ------------------- .../doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h | 80 ------------------- .../Implicit_to_labeling_function_wrapper.h | 66 --------------- .../Mesh_3/CGAL/Labeled_image_mesh_domain_3.h | 63 --------------- .../CGAL/Mesh_constant_domain_field_3.h | 73 ----------------- Mesh_3/doc/Mesh_3/CGAL/Mesh_edge_criteria_3.h | 53 ------------ .../doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h | 77 ------------------ Mesh_3/doc/Mesh_3/CGAL/Mesh_polyhedron_3.h | 34 -------- Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h | 49 ------------ Mesh_3/doc/Mesh_3/Doxyfile.in | 10 +++ .../include/CGAL/Gray_image_mesh_domain_3.h | 73 +++++++++++++++-- Mesh_3/include/CGAL/Implicit_mesh_domain_3.h | 72 +++++++++++++++-- .../Implicit_to_labeling_function_wrapper.h | 59 +++++++++++++- .../CGAL/Labeled_image_mesh_domain_3.h | 63 +++++++++++++-- .../CGAL/Mesh_constant_domain_field_3.h | 70 +++++++++++++++- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 53 ++++++++++-- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 75 ++++++++++++++++- Mesh_3/include/CGAL/Mesh_polyhedron_3.h | 30 ++++++- Mesh_3/include/CGAL/Triangle_accessor_3.h | 35 ++++++++ 19 files changed, 506 insertions(+), 609 deletions(-) delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Implicit_to_labeling_function_wrapper.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_constant_domain_field_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_edge_criteria_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_polyhedron_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h diff --git a/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h deleted file mode 100644 index 02428df510e9..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h +++ /dev/null @@ -1,80 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Gray_image_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_gray_image_mesh_domain()`. - -The class `Gray_image_mesh_domain_3` implements a domain described by a 3D -gray image. A 3D gray image is a grid of voxels, -where each voxel is associated with a gray level value. -This class is a model of the concept `MeshDomain_3`. -The domain to be discretized is the union of voxels that lie inside a surface -described by an isolevel value, called \a isovalue. The voxels lying inside the -domain have gray level values that are larger than the isovalue. - -This class includes a member function that provides, by interpolation, -a gray level value at any query point. -An intersection between a segment and bounding -surfaces is detected when both segment endpoints are associated with gray level -values which are on both sides of the isovalue. -The intersection is then constructed by bisection. -The bisection stops when the query segment is shorter than a given error bound -`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the -length of the diagonal of the bounding box (in world coordinates) and -`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. - - -\tparam Image is the type of the input image. -This parameter must be `CGAL::Image_3`. - -\tparam BGT is a geometric traits class which provides -the basic operations to implement -intersection tests and intersection computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -\tparam Image_word_type is the data type encoded in the `Image` -input file - - -\cgalModels `MeshDomain_3` - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ -template -class Gray_image_mesh_domain_3 -{ -public: - -/// \name Creation -/// @{ - -/*! -Construction from an image. -The object to be meshed is described by the voxels that have a gray-level -value higher than the input isovalue. -@param image the input image -@param iso_value the isovalue, inside `image`, - of the surface describing the boundary of the object to be meshed. -@param value_outside the value attached to voxels outside of the domain - to be meshed. It should be lower than `iso_value` -@param error_bound is relative to the size of the image. -*/ - Gray_image_mesh_domain_3( - const Image& image, - const Image_word_type iso_value, - const Image_word_type value_outside = 0., - const BGT::FT& error_bound = BGT::FT(1e-3)); - -/// @} - -}; /* end Labeled_image_mesh_domain_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h deleted file mode 100644 index e2595b9d6fb9..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h +++ /dev/null @@ -1,80 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Implicit_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_implicit_mesh_domain()`. - -The class `Implicit_mesh_domain_3` implements a domain whose bounding surface is -described -implicitly as the zero level set of a function. -The domain to be discretized is assumed to be the domain where -the function has negative values. -This class is a model of the concept `MeshDomain_3`. - - -\tparam Function provides the definition of the function. -This parameter stands for a model of the concept -`ImplicitFunction` described in the -surface mesh generation package. -The number types `Function::FT` -and `BGT::FT` are required to match. - -\tparam BGT is a geometric traits which provides the basic operations to implement -intersection tests and computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -The constructor of `Implicit_mesh_domain_3` -takes as argument a bounding sphere which is required -to circumscribe the surface and to have its center inside the -domain. -This domain constructs intersection points -between -the surface and segments/rays/lines by -bisection. It needs an -`error_bound` such that the bisection process is stopped -when the query segment is smaller than the error bound. -The `error_bound` passed as argument to the domain constructor -is a relative error bound expressed as a ratio to the bounding sphere radius. - -\cgalModels `MeshDomain_3` - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ -template< typename Function, typename BGT > -class Implicit_mesh_domain_3 -{ -public: - -/// \name Creation -/// @{ - -/*! -`f` is the object of type `Function` that represents the implicit -surface. - -`bounding_sphere` is a bounding sphere of the implicit surface. The -value of `f` at the sphere center `c` must be -negative: \f$ f(c)<0\f$. - -`error_bound` is the relative error bound -used to compute intersection points between the implicit surface -and query segments. The -bisection is stopped when the length of the intersected -segment is less than the product of `error_bound` by the -radius of `bounding_sphere`. -*/ - Implicit_mesh_domain_3(Function f, - const BGT::Sphere_3& bounding_sphere, - const BGT::FT& error_bound = FT(1e-3)); - -/// @} - -}; /* end Implicit_mesh_domain_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/doc/Mesh_3/CGAL/Implicit_to_labeling_function_wrapper.h deleted file mode 100644 index 9a5b38be16d4..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Implicit_to_labeling_function_wrapper.h +++ /dev/null @@ -1,66 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Implicit_multi_domain_to_labeling_function_wrapper` is a helping class to get a function with integer values -labeling the components of a multi-domain. The multidomain is described through a set of functions {fi(p), i=1, ...n}. -Each component corresponds to a sign vector [s1, s2, ..., sn] where si is the sign of the function fi(p) at a point p of the component. -This wrapper class can be passed to `Labeled_mesh_domain_3` as first template parameter. - -\par Example -For example, the multidomain described by the three functions [f1,f2,f3] and the two sign vectors [-,-,+] and [+,-,+] - includes two components.
    -The first one matches the locus of points satisfying f1(p)<0 and f2(p)<0 and f3(p)>0.
    -The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3(p)>0.
    - -\tparam Function provides the definition of the function. -This parameter stands for a model of the concept ImplicitFunction described in the surface mesh generation package. -The number types Function::FT and BGT::FT are required to match. - -\sa `Labeled_mesh_domain_3`. - -*/ -template -class Implicit_multi_domain_to_labeling_function_wrapper -{ -public: - /// \name Types - /// @{ - //! - typedef std::vector Function_vector; - //! - typedef typename Function::Point Point_3; - /// @} - - /// \name Creation - /// @{ - /*! - * \brief Construction from a vector of implicit functions. - * \param implicit_functions the vector of implicit functions. - * - * Position vectors are built automatically so that the union of components equals the union of the functions. - */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions); - - /*! - * \brief Construction from a vector of implicit functions and a vector of vector of signs. - * \param implicit_functions the vector of implicit functions. - * \param position_vectors the vector of vector of signs. Each vector of positions describes a component. - * \sa `Sign` - */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, - const std::vector >& position_vectors); - - /*! - * \brief Construction from a vector of implicit functions and a vector of strings. - * \param implicit_functions the vector of implicit functions. - * \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component. - */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, - const std::vector& position_strings); -/// @} - -}; /* end Implicit_multi_domain_to_labeling_function_wrapper */ - -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h deleted file mode 100644 index 9109b74f1824..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h +++ /dev/null @@ -1,63 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Labeled_image_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_labeled_image_mesh_domain()`. - -The class `Labeled_image_mesh_domain_3` implements a domain described by a 3D labeled image. A 3D -labeled image is a grid of voxels, where each voxel is associated with an index -(a subdomain index) characterizing the subdomain in which the voxel lies. This -class is a model of the concept `MeshDomain_3`. The domain to be discretized -is the union of voxels that have an non-default index (different from the -default constructed value of the type `Image::Type`). - -This class includes a member function that provides, by interpolation, the index -of the subdomain in which any query point lies. An intersection between a segment and bounding -surfaces is detected when both segment endpoints are associated with different -values of subdomain indices. The intersection is then constructed by bisection. -The bisection stops when the query segment is shorter than a given error bound -`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the -length of the diagonal of the bounding box (in world coordinates) and -`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. - - -\tparam Image is the type of the input image. -This parameter must be `CGAL::Image_3`. - -\tparam BGT is a geometric traits class which provides -the basic operations to implement -intersection tests and intersection computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -\cgalModels `MeshDomain_3` - -An executable that uses `Labeled_image_mesh_domain_3` must be linked with -the CGAL_ImageIO library. - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ -template< typename Image, typename BGT > -class Labeled_image_mesh_domain_3 { -public: - -/// \name Creation -/// @{ - -/*! -Construction from an image. -The parameter `error_bound` is relative to the size of the image. -*/ - Labeled_Image_mesh_domain_3(const Image& image, - const BGT::FT& error_bound = FT(1e-3)); - -/// @} - -}; /* end Labeled_image_mesh_domain_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_constant_domain_field_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_constant_domain_field_3.h deleted file mode 100644 index b660a43e23bf..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_constant_domain_field_3.h +++ /dev/null @@ -1,73 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Mesh_constant_domain_field_3` is a model of concept `MeshDomainField_3`. It provides -a constant field accessible using queries on 3D-points. - -The class `Mesh_constant_domain_field_3` can also be customized through `set_size()` operations to become -a piecewise constant field, i.e.\ a sizing field with a constant size on each subpart -of the domain. - -\tparam Gt is the geometric traits class. It must match the type `Triangulation::Geom_traits`, -where `Triangulation` is the nested type of the model of `MeshComplex_3InTriangulation_3` used -in the meshing process. - -\tparam Index is the type of index of the vertices of the triangulation. -It must match the type `%Index` of the model of `MeshDomain_3` used in the meshing process. - -\cgalModels `MeshDomainField_3` - -\sa `MeshDomainField_3` - -*/ -template< typename Gt, typename Index > -class Mesh_constant_domain_field_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type. -*/ -typedef Gt::FT FT; - -/*! -Point type. -*/ -typedef Gt::Point_3 Point_3; - -/*! -Type of index of the vertices of the triangulation. -*/ -typedef Index Index; - -/// @} - -/// \name Creation -/// @{ - -/*! - -Builds a constant domain field with size `size`. -*/ -Mesh_constant_domain_field_3(FT size); - -/// @} - -/// \name Operations -/// @{ - -/*! - -Sets the size such as `operator()` will return size `size` -at any query point of dimension `dimension` and index `index`. -*/ -void set_size(FT size, int dimension, const Index& index); - -/// @} - -}; /* end Mesh_constant_domain_field_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_edge_criteria_3.h deleted file mode 100644 index 3acbda1bd27f..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_edge_criteria_3.h +++ /dev/null @@ -1,53 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The function object class `Mesh_edge_criteria_3` is a model of `MeshEdgeCriteria_3`. It -provides a bound for the size criterion. - -\cgalModels `MeshEdgeCriteria_3` - -\sa `MeshCriteria_3` -\sa `CGAL::Mesh_criteria_3` -\sa `MeshDomainField_3` - -*/ -template< typename Tr > -class Mesh_edge_criteria_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type. -*/ -typedef Tr::Geom_traits::FT FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -Returns an object to serve as criteria for edges. -The argument `length_bound` is an upper bound -for the length of the edges which are used to discretize the curves. -Note that if one parameter is set to 0, then its corresponding criteria is ignored. -*/ -Mesh_edge_criteria_3(const FT& length_bound); - -/*! -Returns an object to serve as criteria for edges. The type `SizingField` -must be a model of concept `MeshDomainField_3`. The behavior and semantic of the argument are the same -as above, except that the length -parameter is a functional instead of a constant. -*/ -template -Mesh_edge_criteria_3(const SizingField& length_bound); - -/// @} - -}; /* end Mesh_edge_criteria_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h deleted file mode 100644 index ab5b440dc6f0..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h +++ /dev/null @@ -1,77 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The class `Mesh_facet_criteria_3` is a model of `MeshFacetCriteria_3`. -It provides a uniform bound for the shape criterion, -a uniform or variable sizing field -for the size criterion and/or -a uniform or variable distance field -for the approximation error criterion. - -\tparam Tr must be identical to the nested type -`Triangulation` of the instance used as model of -`MeshComplex_3InTriangulation_3`. - -\cgalModels `MeshFacetCriteria_3` - -\sa `CGAL::Mesh_facet_topology` -\sa `MeshCriteria_3` -\sa `MeshFacetCriteria_3` -\sa `CGAL::Mesh_criteria_3` -\sa `MeshDomainField_3` -\sa `CGAL::make_mesh_3()` - -*/ -template< typename Tr > -class Mesh_facet_criteria_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type -*/ -typedef Tr::Geom_traits::FT FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -Returns an object to serve as criteria for facets. -\param angle_bound is the lower bound for the angle in degrees of the -surface mesh facets. -\param radius_bound is a uniform upper bound -for the radius of the surface Delaunay balls. -\param distance_bound is an upper bound for the center-center distances -of the surface mesh facets. -\param topology is the set of topological constraints -which have to be verified by each surface facet. See -section \ref Mesh_3DelaunayRefinement for further details. -Note that if one parameter is set to 0, then its corresponding criteria is ignored. -*/ - Mesh_facet_criteria_3(const FT& angle_bound, - const FT& radius_bound, - const FT& distance_bound, - Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE); - -/*! -Returns an object to serve as criteria for facets. The types `SizingField` and -`DistanceField` must -be models of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same -as above, except that the radius and distance bound parameters are functionals instead of constants. -*/ - template - Mesh_facet_criteria_3(const FT& angle_bound, - const SizingField& radius_bound, - const DistanceField& distance_bound, - Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE); - -/// @} - -}; /* end Mesh_facet_criteria_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_polyhedron_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_polyhedron_3.h deleted file mode 100644 index 4ec7e8481fa9..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_polyhedron_3.h +++ /dev/null @@ -1,34 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses -as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and -Halfedge class. Those data are required to use our sharp features -detection algorithm. - -\tparam IGT stands for the geometric traits associated -to the meshing process. It should be a model of the two concepts -`PolyhedronTraits_3` and `IntersectionGeometricTraits_3`. - -\sa `CGAL::Polyhedron_3` -\sa `CGAL::Polyhedral_mesh_domain_with_features_3` - -*/ -template< typename IGT > -struct Mesh_polyhedron_3 { - -/// \name Types -/// @{ - -/*! -`CGAL::Polyhedron_3` type with customized `PolyhedronItems_3` -designed to handle sharp feature detection. -*/ -typedef unspecified_type type; - -/// @} - -}; /* end Mesh_polyhedron_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h b/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h deleted file mode 100644 index e72ee14e2865..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h +++ /dev/null @@ -1,49 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -The class `Triangle_accessor_3` is a model for the concept `TriangleAccessor_3`. It is -designed to serve as accessor for objects of type `Polyhedron_3`. - -\attention Actually, the class `Triangle_accessor_3` is a partial specialization of the class -template `template -Triangle_accessor_3`. One may give another partial -specialization of this class to handle one's own polyhedron data structure. - - -\tparam K is the geometric traits class. - -\cgalModels `TriangleAccessor_3` - -\sa `CGAL::Polyhedral_mesh_domain_3` - -*/ -template< CGAL::Polyhedron, typename K > -class Triangle_accessor_3 { -public: - -/// \name Types -/// @{ - -/*! -Triangle iterator. -*/ -typedef Polyhedron_3::Facet_const_iterator -Triangle_iterator; - -/*! -Triangle -handle. -*/ -typedef Polyhedron_3::Facet_const_handle Triangle_handle; - -/*! -Triangle type. -*/ -typedef K::Triangle_3 Triangle_3; - -/// @} - -}; /* end Triangle_accessor_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index fdbd34718f79..7d0a3aa1ccf8 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -5,9 +5,14 @@ ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of poin INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_triangulation_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_polyhedron_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_with_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Gray_image_mesh_domain_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Labeled_image_mesh_domain_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Implicit_mesh_domain_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Implicit_to_labeling_function_wrapper.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/generate_label_weights.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/exude_mesh_3.h \ @@ -17,7 +22,12 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_mesh_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/make_mesh_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Labeled_mesh_domain_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Triangle_accessor_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_criteria_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_constant_domain_field_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_cell_criteria_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_facet_criteria_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_edge_criteria_3.h \ ${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 \ diff --git a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h index 99bc1e6b3136..65cb1690f93b 100644 --- a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h @@ -26,11 +26,55 @@ namespace CGAL { -/** - * @class Gray_image_mesh_domain_3 - * - * - */ + +/*! +\ingroup PkgMesh3Domains + +\deprecated The class template `Gray_image_mesh_domain_3` is deprecated +since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and +its static function +`Labeled_mesh_domain_3::create_gray_image_mesh_domain()`. + +The class `Gray_image_mesh_domain_3` implements a domain described by a 3D +gray image. A 3D gray image is a grid of voxels, +where each voxel is associated with a gray level value. +This class is a model of the concept `MeshDomain_3`. +The domain to be discretized is the union of voxels that lie inside a surface +described by an isolevel value, called \a isovalue. The voxels lying inside the +domain have gray level values that are larger than the isovalue. + +This class includes a member function that provides, by interpolation, +a gray level value at any query point. +An intersection between a segment and bounding +surfaces is detected when both segment endpoints are associated with gray level +values which are on both sides of the isovalue. +The intersection is then constructed by bisection. +The bisection stops when the query segment is shorter than a given error bound +`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the +length of the diagonal of the bounding box (in world coordinates) and +`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. + + +\tparam Image is the type of the input image. +This parameter must be `CGAL::Image_3`. + +\tparam BGT is a geometric traits class which provides +the basic operations to implement +intersection tests and intersection computations +through a bisection method. This parameter must be instantiated +with a model of the concept `BisectionGeometricTraits_3`. + +\tparam Image_word_type is the data type encoded in the `Image` +input file + + +\cgalModels `MeshDomain_3` + +\sa `BisectionGeometricTraits_3` +\sa `CGAL::make_mesh_3()`. + +*/ + template > @@ -62,6 +101,25 @@ Implicit_mesh_domain_3 * @param bounding_sphere a bounding sphere of the domain * @param error_bound the error bound relative to the sphere radius */ + /// \name Creation + /// @{ + + /*! + @param f is the object of type `Function_` that represents the implicit + surface. + + @param bounding_sphere is a bounding sphere of the implicit surface. The + value of `f` at the sphere center `c` must be + negative: \f$ f(c)<0\f$. + + @param error_bound is the relative error bound + used to compute intersection points between the implicit surface + and query segments. The + bisection is stopped when the length of the intersected + segment is less than the product of `error_bound` by the + radius of `bounding_sphere`. + @todo Fix for `p_rng` + */ Implicit_mesh_domain_3(Function_ f, const Sphere_3& bounding_sphere, const FT& error_bound = FT(1e-6), @@ -69,6 +127,8 @@ Implicit_mesh_domain_3 : Base(parameters::function = Wrapper(f), parameters::bounding_object = bounding_sphere, parameters::relative_error_bound = error_bound, parameters::null_subdomain_index = Null_subdomain_index(), parameters::p_rng = p_rng) {} + /// @} + /// Destructor virtual ~Implicit_mesh_domain_3() {} diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index 59cd91281cc1..48bd6d03cfef 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -142,6 +142,29 @@ class Implicit_vector_to_labeling_function_wrapper }; // end class Implicit_to_labeling_function_wrapper + + /*! +\ingroup PkgMesh3Domains + +The class `Implicit_multi_domain_to_labeling_function_wrapper` is a helping class to get a function with integer values +labeling the components of a multi-domain. The multidomain is described through a set of functions {fi(p), i=1, ...n}. +Each component corresponds to a sign vector [s1, s2, ..., sn] where si is the sign of the function fi(p) at a point p of the component. +This wrapper class can be passed to `Labeled_mesh_domain_3` as first template parameter. + +\par Example +For example, the multidomain described by the three functions [f1,f2,f3] and the two sign vectors [-,-,+] and [+,-,+] + includes two components.
    +The first one matches the locus of points satisfying f1(p)<0 and f2(p)<0 and f3(p)>0.
    +The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3(p)>0.
    + +\tparam ImplicitFunction provides the definition of the function. +This parameter stands for a model of the concept `ImplicitFunction` described in the surface mesh generation package. +The number types `ImplicitFunction::FT` and `BGT::FT` are required to match. + +\sa `Labeled_mesh_domain_3`. + +*/ + template class Implicit_multi_domain_to_labeling_function_wrapper { @@ -164,7 +187,18 @@ class Implicit_multi_domain_to_labeling_function_wrapper typedef int return_type; typedef ImplicitFunction Function; typedef typename Implicit_function_traits::Point Point_3; + + /// \name Types + /// @{ + //! typedef std::vector Function_vector; +#ifdef DOXYGEN_RUNNING + //! + /// @todo different from code + typedef typename Function::Point Point_3; +#endif + /// @} + private: std::vector funcs; @@ -172,6 +206,17 @@ class Implicit_multi_domain_to_labeling_function_wrapper std::vector bmasks; public: + + + /// \name Creation + /// @{ + + /*! + * \brief Construction from a vector of implicit functions and a vector of vector of signs. + * \param implicit_functions the vector of implicit functions. + * \param position_vectors the vector of vector of signs. Each vector of positions describes a component. + * \sa `Sign` + */ Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf, const std::vector >& vps) : funcs(vf), bmasks(vps.size(), Bmask(funcs.size() * 2, false)) { @@ -200,7 +245,12 @@ class Implicit_multi_domain_to_labeling_function_wrapper } std::sort(bmasks.begin(), bmasks.end()); } - + /*! + * \brief Construction from a vector of implicit functions. + * \param implicit_functions the vector of implicit functions. + * + * Position vectors are built automatically so that the union of components equals the union of the functions. + */ Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf) : funcs(vf) { @@ -227,6 +277,11 @@ class Implicit_multi_domain_to_labeling_function_wrapper std::sort(bmasks.begin(), bmasks.end()); } + /*! + * \brief Construction from a vector of implicit functions and a vector of strings. + * \param implicit_functions the vector of implicit functions. + * \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component. + */ Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf, const std::vector& vps) : funcs(vf), bmasks(vps.size(), Bmask(funcs.size() * 2, false)) { @@ -256,6 +311,8 @@ class Implicit_multi_domain_to_labeling_function_wrapper std::sort(bmasks.begin(), bmasks.end()); } + /// @} + return_type operator() (const Point_3& p) const { Bmask bmask(funcs.size() * 2, false); 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 d9bd487410a5..34491151faac 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -32,11 +32,52 @@ namespace CGAL { -/** - * @class Labeled_image_mesh_domain_3 - * - * - */ +/*! +\ingroup PkgMesh3Domains + +\deprecated The class template `Labeled_image_mesh_domain_3` is deprecated +since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and +its static function +`Labeled_mesh_domain_3::create_labeled_image_mesh_domain()`. + +The class `Labeled_image_mesh_domain_3` implements a domain described by a 3D labeled image. A 3D +labeled image is a grid of voxels, where each voxel is associated with an index +(a subdomain index) characterizing the subdomain in which the voxel lies. This +class is a model of the concept `MeshDomain_3`. The domain to be discretized +is the union of voxels that have an non-default index (different from the +default constructed value of the type `Image::Type`). + +This class includes a member function that provides, by interpolation, the index +of the subdomain in which any query point lies. An intersection between a segment and bounding +surfaces is detected when both segment endpoints are associated with different +values of subdomain indices. The intersection is then constructed by bisection. +The bisection stops when the query segment is shorter than a given error bound +`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the +length of the diagonal of the bounding box (in world coordinates) and +`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. + + +\tparam Image is the type of the input image. +This parameter must be `CGAL::Image_3`. + +\tparam BGT is a geometric traits class which provides +the basic operations to implement +intersection tests and intersection computations +through a bisection method. This parameter must be instantiated +with a model of the concept `BisectionGeometricTraits_3`. + +\cgalModels `MeshDomain_3` + +An executable that uses `Labeled_image_mesh_domain_3` must be linked with +the CGAL_ImageIO library. + +@todo Document or comment the other parameters + +\sa `BisectionGeometricTraits_3` +\sa `CGAL::make_mesh_3()`. + +*/ + template Identity; - /// Constructor + + /// \name Creation + /// @{ + + /*! + Construction from an image. + The parameter `error_bound` is relative to the size of the image. + @todo Document or comment the other parameters + */ Labeled_image_mesh_domain_3(const Image& image, const FT& error_bound = FT(1e-3), Subdomain_index value_outside = 0, @@ -83,6 +132,8 @@ Labeled_image_mesh_domain_3 parameters::p_rng = p_rng) {} + /// @} + Labeled_image_mesh_domain_3(const Image& image, const FT error_bound, CGAL::Random* p_rng) diff --git a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h index 002117b14ae2..2cc8550ce057 100644 --- a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h +++ b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h @@ -28,24 +28,73 @@ namespace CGAL { +/*! + \ingroup PkgMesh3Domains + + The class `Mesh_constant_domain_field_3` is a model of concept `MeshDomainField_3`. It provides + a constant field accessible using queries on 3D-points. + + The class `Mesh_constant_domain_field_3` can also be customized through `set_size()` operations to become + a piecewise constant field, i.e.\ a sizing field with a constant size on each subpart + of the domain. + + \tparam Gt is the geometric traits class. It must match the type `Triangulation::Geom_traits`, + where `Triangulation` is the nested type of the model of `MeshComplex_3InTriangulation_3` used + in the meshing process. + + \tparam Index_ is the type of index of the vertices of the triangulation. + It must match the type `%Index` of the model of `MeshDomain_3` used in the meshing process. + + \cgalModels `MeshDomainField_3` + + \sa `MeshDomainField_3` + +*/ + template class Mesh_constant_domain_field_3 { public: + /// \name Types + /// @{ + + /*! + Numerical type. + */ typedef typename Gt::FT FT; + + /*! + Point type. +@todo in the code `eval_if` for `Bare_point_type` + */ +#ifdef DOXYGEN_RUNNING +typedef Gt::Point_3 Point_3; +#else typedef typename boost::mpl::eval_if_c< internal::Has_nested_type_Bare_point::value, typename internal::Bare_point_type, boost::mpl::identity >::type Point_3; +#endif + /*! + Type of index of the vertices of the triangulation. + */ typedef Index_ Index; + /// @} + private: // Map to store field values typedef std::map,FT> Values; public: - /// Constructor + + /// \name Creation + /// @{ + + /*! + Builds a constant domain field with size `size`. + */ Mesh_constant_domain_field_3(const FT& d) : d_(d) {} /// Returns size @@ -57,11 +106,24 @@ class Mesh_constant_domain_field_3 return d_; } - /// Sets size at any point of dimension `dim` and index `index`. - void set_size(const FT& size, const int dim, const Index& index) + /// @} + + /// \name Operations + /// @{ + + /*! + + Sets the size such as `operator()` will return size `size` + at any query point of dimension `dimension` and index `index`. + + @todo docunment `operator()`? + */ + + void set_size(const FT& size, const int dimension, const Index& index) { - values_.insert(std::make_pair(std::make_pair(dim,index),size)); + values_.insert(std::make_pair(std::make_pair(dimension,index),size)); } + /// @} private: // default value diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index d45ff426f9f7..811d7690055f 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -85,18 +85,52 @@ namespace internal { } // end namespace internal } // end namespace Mesh_3 + + /*! + \ingroup PkgMesh3MeshClasses + + The function object class `Mesh_edge_criteria_3` is a model of `MeshEdgeCriteria_3`. It + provides a bound for the size criterion. + + \cgalModels `MeshEdgeCriteria_3` + + \sa `MeshCriteria_3` + \sa `CGAL::Mesh_criteria_3` + \sa `MeshDomainField_3` + +*/ + template < typename Tr > class Mesh_edge_criteria_3 { typedef Mesh_edge_criteria_3 Self; public: + + /// \name Types + /// @{ + + /*! + Numerical type. + */ + typedef typename Tr::Geom_traits::FT FT; + + /// @} + typedef typename Tr::Vertex::Index Index; typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; typedef typename Tr::Bare_point Point_3; - /// Constructors + /// \name Creation + /// @{ + + /*! + Returns an object to serve as criteria for edges. + The argument `length_bound` is an upper bound + for the length of the edges which are used to discretize the curves. + Note that if one parameter is set to 0, then its corresponding criteria is ignored. + */ + Mesh_edge_criteria_3(const FT& value) : p_size_(new Mesh_3::internal::Sizing_field_container< Mesh_constant_domain_field_3 , @@ -107,14 +141,21 @@ class Mesh_edge_criteria_3 // Nb: SFINAE to avoid wrong matches with built-in numerical types // as int. - template < typename Sizing_field > + + /*! + Returns an object to serve as criteria for edges. The type `SizingField` + must be a model of concept `MeshDomainField_3`. The behavior and semantic of the argument are the same + as above, except that the length + parameter is a functional instead of a constant. + */ + template < typename SizingField > Mesh_edge_criteria_3 ( - const Sizing_field& size, - std::enable_if_t::value>* = 0 + const SizingField& size, + std::enable_if_t::value>* = 0 ) { - p_size_ = new Mesh_3::internal::Sizing_field_container(size); diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index 86972063b11d..0e595d7a79b0 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -27,6 +27,30 @@ namespace CGAL { +/*! + \ingroup PkgMesh3MeshClasses + + The class `Mesh_facet_criteria_3` is a model of `MeshFacetCriteria_3`. + It provides a uniform bound for the shape criterion, + a uniform or variable sizing field + for the size criterion and/or + a uniform or variable distance field + for the approximation error criterion. + + \tparam Tr must be identical to the nested type + `Triangulation` of the instance used as model of + `MeshComplex_3InTriangulation_3`. + + \cgalModels `MeshFacetCriteria_3` + + \sa `CGAL::Mesh_facet_topology` + \sa `MeshCriteria_3` + \sa `MeshFacetCriteria_3` + \sa `CGAL::Mesh_criteria_3` + \sa `MeshDomainField_3` + \sa `CGAL::make_mesh_3()` + +*/ template > class Mesh_facet_criteria_3 @@ -48,9 +72,36 @@ class Mesh_facet_criteria_3 public: typedef CGAL::Tag_true Has_manifold_criterion; - /** - * @brief Constructor - */ +#ifdef DOXYGEN_RUNNING +/// \name Types +/// @{ + +/*! +Numerical type +@todo: In the code this typedef is private +*/ +typedef Tr::FT FT; + +/// @} +#endif + + + /// \name Creation + /// @{ + + /*! + Returns an object to serve as criteria for facets. + \param angle_bound is the lower bound for the angle in degrees of the + surface mesh facets. + \param radius_bound is a uniform upper bound + for the radius of the surface Delaunay balls. + \param distance_bound is an upper bound for the center-center distances + of the surface mesh facets. + \param topology is the set of topological constraints + which have to be verified by each surface facet. See + section \ref Mesh_3DelaunayRefinement for further details. + Note that if one parameter is set to 0, then its corresponding criteria is ignored. + */ template < typename Sizing_field, typename Sizing_field2 > Mesh_facet_criteria_3(const FT& angle_bound, const Sizing_field & radius_bound, @@ -69,6 +120,24 @@ class Mesh_facet_criteria_3 init_topo(topology); } +#ifdef DOXYGEN_RUNNING + /*! + Returns an object to serve as criteria for facets. The types `SizingField` and + `DistanceField` must + be models of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same + as above, except that the radius and distance bound parameters are + functionals instead of constants. + + @todo This one is only in the doc + */ + template + Mesh_facet_criteria_3(const FT& angle_bound, + const SizingField& radius_bound, + const DistanceField& distance_bound, + Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE); +#endif + /// @} + /// Destructor ~Mesh_facet_criteria_3() { } diff --git a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h index 4461e5ec478b..f179ca9233d9 100644 --- a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h +++ b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h @@ -209,12 +209,38 @@ class Mesh_polyhedron_items : public CGAL::Polyhedron_items_3 { } // end namespace Mesh_3 +/*! +\ingroup PkgMesh3Domains -template +The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses +as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and +Halfedge class. Those data are required to use the detection of sharp features. + +\tparam IGT stands for the geometric traits associated +to the meshing process. It must be a model of the two concepts +`PolyhedronTraits_3` and `IntersectionGeometricTraits_3`. + +\sa `CGAL::Polyhedron_3` +\sa `CGAL::Polyhedral_mesh_domain_with_features_3` + +*/ +template struct Mesh_polyhedron_3 { - typedef Polyhedron_3 > type; +#ifdef DOXYGEN_RUNNING + /// \name Types + /// @{ + + /*! + `CGAL::Polyhedron_3` type with customized `PolyhedronItems_3` + */ + typedef unspecified_type type; + + /// @} +#else + typedef Polyhedron_3 > type; typedef type Type; +#endif }; } // end namespace CGAL diff --git a/Mesh_3/include/CGAL/Triangle_accessor_3.h b/Mesh_3/include/CGAL/Triangle_accessor_3.h index 03e8313e6875..cba5e955c7dc 100644 --- a/Mesh_3/include/CGAL/Triangle_accessor_3.h +++ b/Mesh_3/include/CGAL/Triangle_accessor_3.h @@ -34,6 +34,26 @@ class Triangle_accessor_3 { }; +/*! +\ingroup PkgMesh3Domains + +The class `Triangle_accessor_3` is a model for the concept `TriangleAccessor_3`. It is +designed to serve as accessor for objects of type `Polyhedron_3`. + +\attention Actually, the class `Triangle_accessor_3` is a partial specialization of the class +template `template +Triangle_accessor_3`. One may give another partial +specialization of this class to handle one's own polyhedron data structure. + +@todo Document the other partial specializations + +\tparam K is the geometric traits class. + +\cgalModels `TriangleAccessor_3` + +\sa `CGAL::Polyhedral_mesh_domain_3` + +*/ template < class K,class Items, template < class T, class I, class A> class T_HDS, @@ -42,10 +62,25 @@ class Triangle_accessor_3, K > { typedef Polyhedron_3 Polyhedron; public: + /// \name Types + /// @{ + /*! + Triangle type. + */ typedef typename K::Triangle_3 Triangle_3; + + /*! + Triangle iterator. + */ typedef typename Polyhedron::Facet_const_iterator Triangle_iterator; + + /*! + Triangle handle. + */ typedef typename Polyhedron::Facet_const_handle Triangle_handle; + /// @} + Triangle_accessor_3() { } Triangle_iterator triangles_begin(const Polyhedron& p) const From c97ce3ee5574c35b2df07296c96c39f473b5f40e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 10:30:03 +0100 Subject: [PATCH 0281/1398] Remove doc files --- Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h | 69 ---------------- .../doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h | 82 ------------------- 2 files changed, 151 deletions(-) delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h delete mode 100644 Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h deleted file mode 100644 index bdba19131c8f..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h +++ /dev/null @@ -1,69 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The class `Mesh_cell_criteria_3` is a model of `MeshCellCriteria_3`. It provides, -for the mesh tetrahedra, -a uniform shape criteria -and a sizing field which may be a uniform or variable field. - -\tparam Tr must be identical to the nested type -`Triangulation` of the instance used as model of -`MeshComplex_3InTriangulation_3`. - -\cgalModels `MeshCellCriteria_3` - -\sa `MeshCriteria_3` -\sa `CGAL::Mesh_criteria_3` -\sa `CGAL::make_mesh_3()` - -*/ -template< typename Tr > -class Mesh_cell_criteria_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type -*/ -typedef Tr::FT FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -* Returns an object to serve as default criteria for cells. -* @param radius_edge_bound is the upper bound for the radius-edge ratio -* of the tetrahedra. -* @param radius_bound is a uniform upper bound -* for the circumradii of the tetrahedra in the mesh. See -* section \ref introsecparam for further details. -* @param min_radius_bound is a uniform lower bound for the -* circumradii of the tetrahedra in the mesh. -* Only cells with a circumradius larger than that -* bound will be refined. -* Note that if one parameter is set to 0, then its corresponding criteria is ignored. -*/ - Mesh_cell_criteria_3(const FT& radius_edge_bound, - const FT& radius_bound, - const FT& min_radius_bound = 0.); - -/*! -Returns an object to serve as default criteria for facets. The type `SizingField` must -be a model of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same -as above, except that the radius bound parameter is a functional instead of a constant. -*/ - template - Mesh_cell_criteria_3(const FT& radius_edge_bound, - const SizingField& radius_bound, - const FT& min_radius_bound = 0.); - -/// @} - -}; /* end Mesh_cell_criteria_3 */ -} /* end namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h deleted file mode 100644 index bfbd79dfe399..000000000000 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h +++ /dev/null @@ -1,82 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgMesh3MeshClasses - -The class `Mesh_facet_criteria_3` is a model of `MeshFacetCriteria_3`. -It provides a uniform bound for the shape criterion, -a uniform or variable sizing field -for the size criterion and/or -a uniform or variable distance field -for the approximation error criterion. - -\tparam Tr must be identical to the nested type -`Triangulation` of the instance used as model of -`MeshComplex_3InTriangulation_3`. - -\cgalModels `MeshFacetCriteria_3` - -\sa `CGAL::Mesh_facet_topology` -\sa `MeshCriteria_3` -\sa `MeshFacetCriteria_3` -\sa `CGAL::Mesh_criteria_3` -\sa `MeshDomainField_3` -\sa `CGAL::make_mesh_3()` - -*/ -template< typename Tr > -class Mesh_facet_criteria_3 { -public: - -/// \name Types -/// @{ - -/*! -Numerical type -*/ -typedef Tr::Geom_traits::FT FT; - -/// @} - -/// \name Creation -/// @{ - -/*! -Returns an object to serve as criteria for facets. -\param angle_bound is the lower bound for the angle in degrees of the -surface mesh facets. -\param radius_bound is a uniform upper bound -for the radius of the surface Delaunay balls. -\param distance_bound is an upper bound for the center-center distances -of the surface mesh facets. -\param topology is the set of topological constraints -which have to be verified by each surface facet. See -section \ref Mesh_3DelaunayRefinement for further details. -Note that if one parameter is set to 0, then its corresponding criteria is ignored. -\param min_radius_bound is a uniform lower bound for the radius of -the surface Delaunay balls. Only facets with a radius larger than that -bound will be refined. -*/ - Mesh_facet_criteria_3(const FT& angle_bound, - const FT& radius_bound, - const FT& distance_bound, - Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, - const FT& min_radius_bound = 0.); - -/*! -Returns an object to serve as criteria for facets. The types `SizingField` and -`DistanceField` must -be models of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same -as above, except that the radius and distance bound parameters are functionals instead of constants. -*/ - template - Mesh_facet_criteria_3(const FT& angle_bound, - const SizingField& radius_bound, - const DistanceField& distance_bound, - Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, - const FT& min_radius_bound = 0.); - -/// @} - -}; /* end Mesh_facet_criteria_3 */ -} /* end namespace CGAL */ From cec7c3dccce46a1cb89bfd34df42bab0339bcbde Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 11:57:32 +0100 Subject: [PATCH 0282/1398] Fix some warnings --- .../Implicit_to_labeling_function_wrapper.h | 16 ++++++------- .../include/CGAL/Polyhedral_mesh_domain_3.h | 24 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index 48bd6d03cfef..7ef8933b5a0b 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -217,13 +217,13 @@ class Implicit_multi_domain_to_labeling_function_wrapper * \param position_vectors the vector of vector of signs. Each vector of positions describes a component. * \sa `Sign` */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf, const std::vector >& vps) - : funcs(vf), bmasks(vps.size(), Bmask(funcs.size() * 2, false)) + Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, const std::vector >& position_vectors) + : funcs(implicit_functions), bmasks(position_vectors.size(), Bmask(funcs.size() * 2, false)) { CGAL_assertion(funcs.size() != 0); std::size_t mask_index = 0; - for (std::vector >::const_iterator mask_iter = vps.begin(), mask_end_iter = vps.end(); + for (std::vector >::const_iterator mask_iter = position_vectors.begin(), mask_end_iter = position_vectors.end(); mask_iter != mask_end_iter; ++mask_iter) { @@ -251,8 +251,8 @@ class Implicit_multi_domain_to_labeling_function_wrapper * * Position vectors are built automatically so that the union of components equals the union of the functions. */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf) - : funcs(vf) + Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions) + : funcs(implicit_functions) { CGAL_assertion(funcs.size() != 0); @@ -282,13 +282,13 @@ class Implicit_multi_domain_to_labeling_function_wrapper * \param implicit_functions the vector of implicit functions. * \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component. */ - Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& vf, const std::vector& vps) - : funcs(vf), bmasks(vps.size(), Bmask(funcs.size() * 2, false)) + Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, const std::vector& position_strings) + : funcs(implicit_functions), bmasks(position_strings.size(), Bmask(funcs.size() * 2, false)) { CGAL_assertion(funcs.size() != 0); std::size_t mask_index = 0; - for (std::vector::const_iterator mask_iter = vps.begin(), mask_end_iter = vps.end(); + for (std::vector::const_iterator mask_iter = position_strings.begin(), mask_end_iter = position_strings.end(); mask_iter != mask_end_iter; ++mask_iter) { diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index f944d1c7739b..230863ee3def 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -355,9 +355,9 @@ class Polyhedral_mesh_domain_3 /** - * Constructs a set of \ccc{n} points on the surface, and output them to - * the output iterator \ccc{pts} whose value type is required to be - * \ccc{std::pair}. + * Constructs a set of `n points on the surface, and output them to + * the output iterator `pts` whose value type is required to be + * `std::pair`. */ struct Construct_initial_points { @@ -386,9 +386,9 @@ class Polyhedral_mesh_domain_3 /** - * Returns true if point~\ccc{p} is in the domain. If \ccc{p} is in the + * Returns true if point `p` is in the domain. If `p` is in the * domain, the parameter index is set to the index of the subdomain - * including $p$. It is set to the default value otherwise. + * including `p`. It is set to the default value otherwise. */ struct Is_in_domain { @@ -411,12 +411,12 @@ class Polyhedral_mesh_domain_3 typedef boost::mpl::vector Allowed_query_types; /** - * Returns true is the element \ccc{type} intersect properly any of the + * Returns true is the element `type` intersect properly any of the * surface patches describing the either the domain boundary or some * subdomain boundary. - * \ccc{Type} is either \ccc{Segment_3}, \ccc{Ray_3} or \ccc{Line_3}. + * `Type` is either `Segment_3`, `Ray_3` or `Line_3`. * Parameter index is set to the index of the intersected surface patch - * if \ccc{true} is returned and to the default \ccc{Surface_patch_index} + * if `true` is returned and to the default `Surface_patch_index` * value otherwise. */ struct Do_intersect_surface @@ -452,12 +452,12 @@ class Polyhedral_mesh_domain_3 } /** - * Returns a point in the intersection of the primitive \ccc{type} + * Returns a point in the intersection of the primitive `type` * with some boundary surface. - * \ccc{Type1} is either \ccc{Segment_3}, \ccc{Ray_3} or \ccc{Line_3}. - * The integer \ccc{dimension} is set to the dimension of the lowest + * `Type1` is either `Segment_3`, `Ray_3` or `Line_3`. + * The integer `dimension` is set to the dimension of the lowest * dimensional face in the input complex containing the returned point, and - * \ccc{index} is set to the index to be stored at a mesh vertex lying + * `index` is set to the index to be stored at a mesh vertex lying * on this face. */ struct Construct_intersection From 26369cb81b0e70453dfada9cb91998dc51880519 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 12:33:14 +0100 Subject: [PATCH 0283/1398] fixes --- .../CGAL/Mesh_constant_domain_field_3.h | 2 +- .../include/CGAL/Polyhedral_mesh_domain_3.h | 33 ++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h index 20de215efd51..fc5ea3f7538a 100644 --- a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h +++ b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h @@ -115,7 +115,7 @@ class Mesh_constant_domain_field_3 */ void set_size(const FT& size, const int dim, const Index& index) { - values_.insert(std::make_pair(std::make_pair(dimension,index),size)); + values_.insert(std::make_pair(std::make_pair(dim,index),size)); } /// @} diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 230863ee3def..f1bf80dab4e1 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -243,8 +243,11 @@ class Polyhedral_mesh_domain_3 The inside of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + , CGAL::Random* p_rng = nullptr +#endif + ) : tree_() , bounding_tree_(&tree_) // the bounding tree is tree_ , p_rng_(p_rng) @@ -288,16 +291,19 @@ class Polyhedral_mesh_domain_3 * Constructor from a sequence of polyhedral surfaces, and a bounding * polyhedral surface. * - * @param InputPolyhedraPtrIterator must an iterator of a sequence of - * pointers to polyhedra + * @tparam InputPolyhedraPtrIterator must an iterator of a sequence of + * pointers to polyhedra @todo fix what the type is * * @param bounding_polyhedron reference to the bounding surface */ template - Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin, - InputPolyhedraPtrIterator end, - const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin + ,InputPolyhedraPtrIterator end + ,const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : p_rng_(p_rng) , delete_rng_(false) { @@ -323,13 +329,16 @@ class Polyhedral_mesh_domain_3 * surface. The domain will always answer false to "is_in_domain" * queries. * - * @param InputPolyhedraPtrIterator must an iterator of a sequence of + * @tparam InputPolyhedraPtrIterator must an iterator of a sequence of * pointers to polyhedra */ template - Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin, - InputPolyhedraPtrIterator end, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin + , InputPolyhedraPtrIterator end +#ifndef DOXYGEN_RUNNING + , CGAL::Random* p_rng = nullptr +#endif + ) : p_rng_(p_rng) { if(begin != end) { From e9583a69d0654d139f0533cd4085c607ebbcbaff Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 12:38:50 +0100 Subject: [PATCH 0284/1398] fixes --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index f1bf80dab4e1..66e7bf8f3891 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -291,9 +291,11 @@ class Polyhedral_mesh_domain_3 * Constructor from a sequence of polyhedral surfaces, and a bounding * polyhedral surface. * - * @tparam InputPolyhedraPtrIterator must an iterator of a sequence of - * pointers to polyhedra @todo fix what the type is + * @tparam InputPolyhedraPtrIterator must be a model of + * `ForwardIterator` and value type `Polyhedron*` * + * @param begin iterator for a sequence of pointers to polyhedra + * @param end iterator for a sequence of pointers to polyhedra * @param bounding_polyhedron reference to the bounding surface */ template From 90773e880618c96771b467876526ee1b435b5c47 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 12:41:17 +0100 Subject: [PATCH 0285/1398] fixes --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 66e7bf8f3891..25005e5748b8 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -328,11 +328,15 @@ class Polyhedral_mesh_domain_3 * Constructor. * * Constructor from a sequence of polyhedral surfaces, without bounding - * surface. The domain will always answer false to "is_in_domain" + * surface. The domain will always answer `false` to `is_in_domain()` * queries. * - * @tparam InputPolyhedraPtrIterator must an iterator of a sequence of - * pointers to polyhedra + * @tparam InputPolyhedraPtrIterator must be a model of + * `ForwardIterator` and value type `Polyhedron*` + * + * @param begin iterator for a sequence of pointers to polyhedra + * @param end iterator for a sequence of pointers to polyhedra + * @param bounding_polyhedron reference to the bounding surface */ template Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin From fdcdd1a9eb0b82e725b53c4edb159f782fd8f49e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 12:50:07 +0100 Subject: [PATCH 0286/1398] fixes --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 25005e5748b8..077dfcd3603f 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -336,7 +336,6 @@ class Polyhedral_mesh_domain_3 * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra - * @param bounding_polyhedron reference to the bounding surface */ template Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin From b6531a76d19690a318d0e682d0b625bd7c6b32a6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 16 May 2023 16:22:48 +0100 Subject: [PATCH 0287/1398] fixes --- Mesh_3/doc/Mesh_3/examples.txt | 3 +++ Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 11 ++++++----- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 4 ++-- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/examples.txt b/Mesh_3/doc/Mesh_3/examples.txt index ce8dbbb1b343..d9c2eb95d718 100644 --- a/Mesh_3/doc/Mesh_3/examples.txt +++ b/Mesh_3/doc/Mesh_3/examples.txt @@ -20,9 +20,12 @@ \example Mesh_3/mesh_optimization_example.cpp \example Mesh_3/mesh_optimization_lloyd_example.cpp \example Mesh_3/mesh_polyhedral_domain.cpp +\example Mesh_3/mesh_polyhedral_domain_sm.cpp \example Mesh_3/mesh_polyhedral_complex.cpp +\example Mesh_3/mesh_polyhedral_complex_sm.cpp \example Mesh_3/remesh_polyhedral_surface.cpp \example Mesh_3/mesh_polyhedral_domain_with_features.cpp +\example Mesh_3/mesh_polyhedral_domain_with_features_sm.cpp \example Mesh_3/mesh_polyhedral_domain_with_features_sizing.cpp \example Mesh_3/mesh_polyhedral_domain_with_surface_inside.cpp \example Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index f782ea9ffeff..7ef85ff8adda 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -126,15 +126,16 @@ typedef Tr::FT FT; The behavior and semantic of the arguments are the same as above, except that the radius bound parameter is a functional instead of a constant. - @todo hide the `enable_if_t` */ template - Mesh_cell_criteria_3(const FT& radius_edge_bound, - const Sizing_field& radius_bound, - const FT& min_radius_bound = 0., - std::enable_if_t< + Mesh_cell_criteria_3(const FT& radius_edge_bound + ,const Sizing_field& radius_bound + ,const FT& min_radius_bound = 0. +#ifndef DOXYGEN_RUNNING + ,std::enable_if_t< Mesh_3::Is_mesh_domain_field_3::value >* = 0 +#endif ) { if (FT(0) != min_radius_bound) diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index 72d133a36d54..560d2983f415 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -206,9 +206,9 @@ and cell base classes are respectively `Vertex_base` and `Cell_base`. */ typedef unspecified_type type; -#endif + /// @} -/// @} +#endif }; // end struct Mesh_triangulation_3 } // end namespace CGAL diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 077dfcd3603f..f1791c3d847e 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -369,7 +369,7 @@ class Polyhedral_mesh_domain_3 /** - * Constructs a set of `n points on the surface, and output them to + * Constructs a set of `n` points on the surface, and output them to * the output iterator `pts` whose value type is required to be * `std::pair`. */ From e1ac0e56e025e468cc2155161fe587027f308759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 17 May 2023 09:21:33 +0200 Subject: [PATCH 0288/1398] add new macro --- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.14/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.20/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.8.4/BaseDoxyfile.in | 3 ++- Documentation/doc/resources/1.9.3/BaseDoxyfile.in | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 69351ed254e8..831c8ae9edf6 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -2187,7 +2187,8 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_MSG_DEPRECATED # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in index 1a59e5d2d97f..545860df0c40 100644 --- a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in @@ -2171,7 +2171,8 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_DEPRECATED_MSG # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in index bc0ca527ff2e..b445780d98b7 100644 --- a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in @@ -2255,7 +2255,8 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_DEPRECATED_MSG # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in index 70267fd649dc..66cefaad4f2d 100644 --- a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in @@ -1778,7 +1778,8 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_DEPRECATED_MSG # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. diff --git a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in index 21d24dd6ecd2..50fb0eddfe1b 100644 --- a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in @@ -2267,7 +2267,8 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_DEPRECATED_MSG # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this From a78afb74bfe0295d83aaa311db31ab3fb56e541f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 17 May 2023 09:58:33 +0200 Subject: [PATCH 0289/1398] fix syntax --- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.8.14/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.8.20/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.8.4/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.9.3/BaseDoxyfile.in | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 831c8ae9edf6..caaa6b37982a 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -2188,7 +2188,7 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ CGAL_DEPRECATED \ - CGAL_MSG_DEPRECATED + CGAL_DEPRECATED_MSG(name)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in index 545860df0c40..e8f8336f1121 100644 --- a/Documentation/doc/resources/1.8.14/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.14/BaseDoxyfile.in @@ -2172,7 +2172,7 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ CGAL_DEPRECATED \ - CGAL_DEPRECATED_MSG + CGAL_DEPRECATED_MSG(name)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in index b445780d98b7..822440929e06 100644 --- a/Documentation/doc/resources/1.8.20/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.20/BaseDoxyfile.in @@ -2256,7 +2256,7 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ CGAL_DEPRECATED \ - CGAL_DEPRECATED_MSG + CGAL_DEPRECATED_MSG(name)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in index 66cefaad4f2d..af6e905ef0f4 100644 --- a/Documentation/doc/resources/1.8.4/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.4/BaseDoxyfile.in @@ -1779,7 +1779,7 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ CGAL_DEPRECATED \ - CGAL_DEPRECATED_MSG + CGAL_DEPRECATED_MSG(name)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. diff --git a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in index 50fb0eddfe1b..6a80966eb82a 100644 --- a/Documentation/doc/resources/1.9.3/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.3/BaseDoxyfile.in @@ -2268,7 +2268,7 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ CGAL_DEPRECATED \ - CGAL_DEPRECATED_MSG + CGAL_DEPRECATED_MSG(name)= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this From 3ca05f491827ae5966f0e296090e83485174c92a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 17 May 2023 09:28:25 +0100 Subject: [PATCH 0290/1398] fixes --- Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h | 15 ++++++++------- Mesh_3/include/CGAL/Implicit_mesh_domain_3.h | 11 +++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h index 65cb1690f93b..44e555b90278 100644 --- a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h @@ -115,14 +115,15 @@ Gray_image_mesh_domain_3 @param value_outside the value attached to voxels outside of the domain to be meshed. It should be lower than `iso_value` @param error_bound is relative to the size of the image. - - @todo deal with p_rng */ - Gray_image_mesh_domain_3(const Image& image, - const Image_word_type iso_value, - const Image_word_type value_outside = 0., - const FT& error_bound = FT(1e-3), - CGAL::Random* p_rng = nullptr) + Gray_image_mesh_domain_3(const Image& image + ,const Image_word_type iso_value + ,const Image_word_type value_outside = 0. + ,const FT& error_bound = FT(1e-3) +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(parameters::function = Wrapper(image, Transform(iso_value), Transform(iso_value)(value_outside)), diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h index 67b8ac251e1d..47421dee5321 100644 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h @@ -120,10 +120,13 @@ Implicit_mesh_domain_3 radius of `bounding_sphere`. @todo Fix for `p_rng` */ - Implicit_mesh_domain_3(Function_ f, - const Sphere_3& bounding_sphere, - const FT& error_bound = FT(1e-6), - CGAL::Random* p_rng = nullptr) + Implicit_mesh_domain_3(Function_ f + ,const Sphere_3& bounding_sphere + ,const FT& error_bound = FT(1e-6) +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(parameters::function = Wrapper(f), parameters::bounding_object = bounding_sphere, parameters::relative_error_bound = error_bound, parameters::null_subdomain_index = Null_subdomain_index(), parameters::p_rng = p_rng) {} From a827d9ab676b760a22b198574cf3f42c787c1342 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 17 May 2023 11:11:25 +0100 Subject: [PATCH 0291/1398] fixes --- Mesh_3/include/CGAL/Implicit_mesh_domain_3.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h index 47421dee5321..59ad97066501 100644 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h @@ -118,7 +118,6 @@ Implicit_mesh_domain_3 bisection is stopped when the length of the intersected segment is less than the product of `error_bound` by the radius of `bounding_sphere`. - @todo Fix for `p_rng` */ Implicit_mesh_domain_3(Function_ f ,const Sphere_3& bounding_sphere From bf79ecd8ad377cf4e32a2768740b6dde456a3991 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 17 May 2023 21:05:29 +0100 Subject: [PATCH 0292/1398] fixes --- Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h | 13 ++++++++----- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) 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 34491151faac..9992d44a56f4 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -120,11 +120,14 @@ Labeled_image_mesh_domain_3 The parameter `error_bound` is relative to the size of the image. @todo Document or comment the other parameters */ - Labeled_image_mesh_domain_3(const Image& image, - const FT& error_bound = FT(1e-3), - Subdomain_index value_outside = 0, - Null null = Null(), - CGAL::Random* p_rng = nullptr) + Labeled_image_mesh_domain_3(const Image& image + ,const FT& error_bound = FT(1e-3) + ,Subdomain_index value_outside = 0 + ,Null null = Null() +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(parameters::function = Wrapper(image, Identity(), value_outside), parameters::bounding_object = compute_bounding_box(image), parameters::relative_error_bound = error_bound, diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index f1791c3d847e..0e3937e4c7da 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -267,9 +267,12 @@ class Polyhedral_mesh_domain_3 Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_3(const Polyhedron& p, - const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_3(const Polyhedron& p + ,const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : tree_() , bounding_tree_(new AABB_tree_) , p_rng_(p_rng) @@ -425,8 +428,8 @@ class Polyhedral_mesh_domain_3 typedef boost::mpl::vector Allowed_query_types; /** - * Returns true is the element `type` intersect properly any of the - * surface patches describing the either the domain boundary or some + * Returns `true` if the element `type` intersects properly any of the + * surface patches describing either the domain boundary or some * subdomain boundary. * `Type` is either `Segment_3`, `Ray_3` or `Line_3`. * Parameter index is set to the index of the intersected surface patch From 9f241c89c5471a1cd6d5fcdefba01aec4c351304 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 19 May 2023 18:42:56 +0100 Subject: [PATCH 0293/1398] rename template parameters --- .../Mesh_domain_with_polyline_features_3.h | 23 +++++++------- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 30 +++++++++---------- .../include/CGAL/Polyhedral_mesh_domain_3.h | 4 ++- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 47b9bf495ade..9fa436fe842b 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -523,7 +523,7 @@ features into any model of the `MeshDomain_3` concept. The 1-dimensional features are described as polylines whose endpoints are the added corners. -\tparam MeshDomain_3 is the type +\tparam MD is the type of the domain which should be extended. It has to be a model of the `MeshDomain_3` concept. @@ -536,16 +536,17 @@ It has to be a model of the `MeshDomain_3` concept. \sa `CGAL::Labeled_image_mesh_domain_3` */ -template < typename MeshDomain_3 > +template < typename MD > class Mesh_domain_with_polyline_features_3 - : public MeshDomain_3 + : public MD { - typedef Mesh_domain_with_polyline_features_3 Self; + typedef Mesh_domain_with_polyline_features_3 Self; + public: /// \name Types /// @{ - typedef typename MeshDomain_3::Surface_patch_index Surface_patch_index; - typedef typename MeshDomain_3::Subdomain_index Subdomain_index; + typedef typename MD::Surface_patch_index Surface_patch_index; + typedef typename MD::Subdomain_index Subdomain_index; typedef int Curve_index; typedef int Corner_index; @@ -553,14 +554,14 @@ class Mesh_domain_with_polyline_features_3 typedef unspecified_type Index; #else typedef typename Mesh_3::internal::Index_generator_with_features< - typename MeshDomain_3::Subdomain_index, + typename MD::Subdomain_index, Surface_patch_index, Curve_index, Corner_index>::type Index; #endif typedef CGAL::Tag_true Has_features; - typedef typename MeshDomain_3::R::FT FT; + typedef typename MD::R::FT FT; /// @} #ifndef DOXYGEN_RUNNING @@ -569,9 +570,9 @@ class Mesh_domain_with_polyline_features_3 typedef Curve_index Curve_segment_index; #endif - typedef typename MeshDomain_3::R Gt; + typedef typename MD::R Gt; typedef Gt R; - typedef typename MeshDomain_3::Point_3 Point_3; + typedef typename MD::Point_3 Point_3; #endif // DOXYGEN_RUNNING /// \name Creation @@ -581,7 +582,7 @@ class Mesh_domain_with_polyline_features_3 template Mesh_domain_with_polyline_features_3(const T& ...o) - : MeshDomain_3(o...) + : MD(o...) , current_corner_index_(1) , current_curve_index_(1) , curves_aabb_tree_is_built(false) {} diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index 560d2983f415..ee7d53ab7105 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -131,7 +131,7 @@ type to be used for the 3D triangulation embedding the mesh. \tparam MD must be a model of `MeshDomain_3`. -\tparam K_ must be a model of `MeshTriangulationTraits_3` or `Default` +\tparam Gt must be a model of `MeshTriangulationTraits_3` or `Default` and defaults to `Kernel_traits::%Kernel`. \tparam Concurrency_tag_ enables sequential versus parallel meshing and optimization algorithms. @@ -139,51 +139,51 @@ and defaults to `Kernel_traits::%Kernel`. and `Parallel_if_available_tag`. \tparam Vertex_base__ must be a model of `MeshVertexBase_3` or `Default` -and defaults to `Mesh_vertex_base_3`. +and defaults to `Mesh_vertex_base_3`. \tparam Cell_base_ must be a model of `MeshCellBase_3` or `Default` -and defaults to `Compact_mesh_cell_base_3`. +and defaults to `Compact_mesh_cell_base_3`. -\warning To improve the robustness of the meshing process, the input traits `K_` +\warning To improve the robustness of the meshing process, the input traits `Gt` is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`. - The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors + The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors models of `Kernel::ConstructWeightedCircumcenter_3`, `Kernel::ComputeSquaredRadius_3`, and `Kernel::ComputeSquaredRadiusSmallestOrthogonalSphere_3` that are - provided by `K_` to use exact computations when the geometric configuration + provided by `Gt` to use exact computations when the geometric configuration is close to degenerate (e.g. almost coplanar points).
    Users should therefore be aware that the traits class of the triangulation - will have type `Robust_weighted_circumcenter_filtered_traits_3`. + will have type `Robust_weighted_circumcenter_filtered_traits_3`. \sa `make_mesh_3()` \sa `Mesh_complex_3_in_triangulation_3` */ template + class Gt = Default, + class ConcurrencyTag = Sequential_tag, + class VertexBase = Default, + class CellBase = Default> struct Mesh_triangulation_3 { private: - using K = typename Default::Lazy_get >::type; + using K = typename Default::Lazy_get >::type; using Geom_traits = typename details::Mesh_geom_traits_generator::type; using Indices_tuple = Mesh_3::internal::Indices_tuple_t; using Vertex_base = typename Default::Get< - Vertex_base_, + VertexBase, Mesh_vertex_generator_3 >::type; using Cell_base = typename Default::Get< - Cell_base_, + CellBase, Compact_mesh_cell_generator_3 >::type; using Concurrency_tag = - typename Default::Get::type; + typename Default::Get::type; struct Tds : public Triangulation_data_structure_3 {}; using Triangulation = diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 0e3937e4c7da..a07b9d106ff6 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -129,6 +129,8 @@ the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. +@todo Document TriangleAccessor as it was template parameter. What about the two others? + \cgalModels `MeshDomain_3` \sa `IntersectionGeometricTraits_3` @@ -139,7 +141,7 @@ with a model of the concept `IntersectionGeometricTraits_3`. template class Polyhedral_mesh_domain_3 From 7326fb52ceea2c98462000cb6170e28ee1d8e0be Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 16 May 2023 22:56:41 +0200 Subject: [PATCH 0294/1398] Add initial preparations for adaptive sizing field Add Adaptive_sizing_field header with edge min and max limits, and tolerance Adjust the example --- ...sotropic_remeshing_with_sizing_example.cpp | 10 +- .../Adaptive_sizing_field.h | 112 ++++++++++++++++++ .../CGAL/Polygon_mesh_processing/remesh.h | 18 +++ 3 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index fa5dc55d7896..96325e6d8619 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -11,7 +11,7 @@ namespace PMP = CGAL::Polygon_mesh_processing; int main(int argc, char* argv[]) { - const char* filename = (argc > 1) ? argv[1] : "data/pig.off"; + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/pig.off"); std::ifstream input(filename); Mesh mesh; @@ -20,7 +20,8 @@ int main(int argc, char* argv[]) return 1; } - double target_edge_length = 0.04; + const std::pair edge_min_max{0.1, 0.4}; + const double tol = 0.1; unsigned int nb_iter = 3; std::cout << "Start remeshing of " << filename @@ -28,11 +29,14 @@ int main(int argc, char* argv[]) PMP::isotropic_remeshing( faces(mesh), - target_edge_length, + edge_min_max, + tol, mesh, PMP::parameters::number_of_iterations(nb_iter) ); + CGAL::IO::write_polygon_mesh("out.off", mesh, CGAL::parameters::stream_precision(17)); + std::cout << "Remeshing done." << std::endl; return 0; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h new file mode 100644 index 000000000000..6b48181388e4 --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -0,0 +1,112 @@ +// Copyright (c) 2020 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) : Jane Tournois + +#ifndef CGAL_PMP_REMESHING_ADAPTIVE_SIZING_FIELD_H +#define CGAL_PMP_REMESHING_ADAPTIVE_SIZING_FIELD_H + +#include + +#include + +#include + +namespace CGAL +{ +namespace Polygon_mesh_processing +{ +template +class Adaptive_sizing_field : public CGAL::Sizing_field +{ +private: + typedef CGAL::Sizing_field Base; + +public: + typedef typename Base::FT FT; + typedef typename Base::Point_3 Point_3; + typedef typename Base::halfedge_descriptor halfedge_descriptor; + typedef typename Base::vertex_descriptor vertex_descriptor; + + Adaptive_sizing_field(const std::pair& edge_len_min_max + , const FT& tolerance + , const PolygonMesh& pmesh) + : m_sq_short( CGAL::square(edge_len_min_max.first)) + , m_sq_long( CGAL::square(edge_len_min_max.second)) + , tol(tolerance) + , m_pmesh(pmesh) + { + // calculate and store curvature and sizing field here in constructor? + // todo what about updating it? + } + +private: + FT sqlength(const vertex_descriptor& va, + const vertex_descriptor& vb) const + { + typename boost::property_map::const_type + vpmap = get(CGAL::vertex_point, m_pmesh); + return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); + } + + FT sqlength(const halfedge_descriptor& h) const + { + return sqlength(target(h, m_pmesh), source(h, m_pmesh)); + } + +public: + boost::optional is_too_long(const halfedge_descriptor& h) const + { + const FT sqlen = sqlength(h); + if(sqlen > m_sq_long) + return sqlen; + else + return boost::none; + } + + boost::optional is_too_long(const vertex_descriptor& va, + const vertex_descriptor& vb) const + { + const FT sqlen = sqlength(va, vb); + if (sqlen > m_sq_long) + return sqlen; + else + return boost::none; + } + + boost::optional is_too_short(const halfedge_descriptor& h) const + { + const FT sqlen = sqlength(h); + if (sqlen < m_sq_long) + return sqlen; + else + return boost::none; + } + + virtual Point_3 split_placement(const halfedge_descriptor& h) const + { + typename boost::property_map::const_type + vpmap = get(CGAL::vertex_point, m_pmesh); + return CGAL::midpoint(get(vpmap, target(h, m_pmesh)), + get(vpmap, source(h, m_pmesh))); + } + +private: + FT m_sq_short; + FT m_sq_long; + FT tol; + const PolygonMesh& m_pmesh; + //todo add property map containing sizing field form m_pmesh here +}; + +}//end namespace Polygon_mesh_processing +}//end namespace CGAL + +#endif //CGAL_PMP_REMESHING_ADAPTIVE_SIZING_FIELD_H diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 54c99b2de432..4ba686e9e191 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -218,6 +219,23 @@ void isotropic_remeshing(const FaceRange& faces np); } +template +void isotropic_remeshing(const FaceRange& faces + , const std::pair& edge_len_min_max //todo add defaults? + , const double& tolerance //todo add defaults? + , PolygonMesh& pmesh + , const NamedParameters& np = parameters::default_values()) +{ + typedef Adaptive_sizing_field Adaptive_sizing; + isotropic_remeshing( + faces, + Adaptive_sizing(edge_len_min_max, tolerance, pmesh), + pmesh, + np); +} + template Date: Fri, 19 May 2023 22:42:32 +0200 Subject: [PATCH 0295/1398] Create a vertex property map that will contain sizing info (WIP) Also, update target length checks --- ...sotropic_remeshing_with_sizing_example.cpp | 5 +- .../Adaptive_sizing_field.h | 57 +++++++++++++++---- .../Uniform_sizing_field.h | 2 + .../Isotropic_remeshing/remesh_impl.h | 7 ++- .../CGAL/Polygon_mesh_processing/remesh.h | 8 +-- 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index 96325e6d8619..1e1335ccfa6d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -20,8 +20,8 @@ int main(int argc, char* argv[]) return 1; } - const std::pair edge_min_max{0.1, 0.4}; - const double tol = 0.1; + //todo ip - update + const std::pair edge_min_max{0.1, 0.12}; unsigned int nb_iter = 3; std::cout << "Start remeshing of " << filename @@ -30,7 +30,6 @@ int main(int argc, char* argv[]) PMP::isotropic_remeshing( faces(mesh), edge_min_max, - tol, mesh, PMP::parameters::number_of_iterations(nb_iter) ); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 6b48181388e4..1293577ad4f8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -34,17 +34,22 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename Base::Point_3 Point_3; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; + typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type VertexSizingMap; - Adaptive_sizing_field(const std::pair& edge_len_min_max - , const FT& tolerance - , const PolygonMesh& pmesh) + Adaptive_sizing_field(const std::pair& edge_len_min_max + , PolygonMesh& pmesh) : m_sq_short( CGAL::square(edge_len_min_max.first)) , m_sq_long( CGAL::square(edge_len_min_max.second)) - , tol(tolerance) , m_pmesh(pmesh) { - // calculate and store curvature and sizing field here in constructor? - // todo what about updating it? + //todo ip: initialize sizing map with default values + //todo ip: might end up using directly the property map of the curvature calculation (if mutable)? + vertex_sizing_map_ = get(Vertex_property_tag(), m_pmesh); + for(vertex_descriptor v : vertices(m_pmesh)){ + put(vertex_sizing_map_, v, m_sq_long); + } } private: @@ -62,10 +67,24 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } public: + void calc_sizing_map() + { + //todo ip + // calculate curvature + + // loop over curvature property field and calculate the target mesh size for a vertex + // don't forget to store squared length + + } + boost::optional is_too_long(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - if(sqlen > m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), + get(vertex_sizing_map_, target(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); + if(sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -75,7 +94,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field const vertex_descriptor& vb) const { const FT sqlen = sqlength(va, vb); - if (sqlen > m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, va), + get(vertex_sizing_map_, vb)); + CGAL_assertion(get(vertex_sizing_map_, va)); + CGAL_assertion(get(vertex_sizing_map_, vb)); + if (sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -84,7 +107,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_short(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - if (sqlen < m_sq_long) + FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), + get(vertex_sizing_map_, target(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); + CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); + if (sqlen < sqtarg_len) return sqlen; else return boost::none; @@ -98,12 +125,18 @@ class Adaptive_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } + void update_sizing_map(const vertex_descriptor& vnew) + { + //todo ip: calculate curvature for the vertex + //dummy + put(vertex_sizing_map_, vnew, m_sq_short); + } + private: FT m_sq_short; FT m_sq_long; - FT tol; - const PolygonMesh& m_pmesh; - //todo add property map containing sizing field form m_pmesh here + PolygonMesh& m_pmesh; + VertexSizingMap vertex_sizing_map_; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index 3f32aacb1aa9..fbb522b7c787 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -92,6 +92,8 @@ class Uniform_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } + void update_sizing_map(const vertex_descriptor& vnew) const {} //todo ip- rewrite to remove this? + private: FT m_sq_short; FT m_sq_long; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index f0daf9cc20a5..19651ded9ae5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -478,7 +478,7 @@ namespace internal { //if an edge is longer than the given threshold `high`, the edge //is split at its midpoint and the two adjacent triangles are bisected (2-4 split)" template - void split_long_edges(const SizingFunction& sizing) + void split_long_edges(SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << "Split long edges..." << std::endl; @@ -536,6 +536,8 @@ namespace internal { //move refinement point vertex_descriptor vnew = target(hnew, mesh_); put(vpmap_, vnew, refinement_point); + //todo ip-add + sizing.update_sizing_map(vnew); #ifdef CGAL_PMP_REMESHING_VERY_VERBOSE std::cout << " Refinement point : " << refinement_point << std::endl; #endif @@ -1080,6 +1082,7 @@ namespace internal { Point proj = trees[patch_id_to_index_map[get_patch_id(face(halfedge(v, mesh_), mesh_))]]->closest_point(get(vpmap_, v)); put(vpmap_, v, proj); + //todo ip - also update sizing field here? } CGAL_assertion(!input_mesh_is_valid_ || is_valid_polygon_mesh(mesh_)); #ifdef CGAL_PMP_REMESHING_DEBUG @@ -1108,6 +1111,7 @@ namespace internal { continue; //note if v is constrained, it has not moved put(vpmap_, v, proj(v)); + //todo ip: also update sizing field here? } CGAL_assertion(is_valid(mesh_)); #ifdef CGAL_PMP_REMESHING_DEBUG @@ -2010,6 +2014,7 @@ namespace internal { VertexIsConstrainedMap vcmap_; FaceIndexMap fimap_; CGAL_assertion_code(bool input_mesh_is_valid_;) + //todo ip: maybe make sizing field member (reference) here? easier to handle updates };//end class Incremental_remesher }//end namespace internal diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 4ba686e9e191..858f34958109 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -38,7 +38,7 @@ template void isotropic_remeshing(const FaceRange& faces - , const SizingFunction& sizing + , SizingFunction& sizing , PolygonMesh& pmesh , const NamedParameters& np); @@ -224,14 +224,14 @@ template void isotropic_remeshing(const FaceRange& faces , const std::pair& edge_len_min_max //todo add defaults? - , const double& tolerance //todo add defaults? , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { typedef Adaptive_sizing_field Adaptive_sizing; + Adaptive_sizing sizing(edge_len_min_max, pmesh); isotropic_remeshing( faces, - Adaptive_sizing(edge_len_min_max, tolerance, pmesh), + sizing, pmesh, np); } @@ -241,7 +241,7 @@ template void isotropic_remeshing(const FaceRange& faces - , const SizingFunction& sizing + , SizingFunction& sizing , PolygonMesh& pmesh , const NamedParameters& np) { From b1137e9d83a98704f152e586d9decbad008702fc Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 12:19:44 +0100 Subject: [PATCH 0296/1398] various --- Mesh_3/doc/Mesh_3/Doxyfile.in | 5 ++ Mesh_3/doc/Mesh_3/Mesh_3.txt | 2 +- Mesh_3/doc/Mesh_3/PackageDescription.txt | 1 - .../Implicit_to_labeling_function_wrapper.h | 1 - .../CGAL/Labeled_image_mesh_domain_3.h | 26 +++---- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 35 +++++---- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 76 ++++++++++--------- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 26 +++---- .../include/CGAL/Polyhedral_mesh_domain_3.h | 23 +++--- .../Polyhedral_mesh_domain_with_features_3.h | 40 ++++++---- 10 files changed, 124 insertions(+), 111 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index b228592fd953..b7f0fd996208 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -1,4 +1,9 @@ @INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} +# custom options for this package + +EXTRACT_ALL = false +HIDE_UNDOC_CLASSES = true +WARN_IF_UNDOCUMENTED = false # macros to be used inside the code ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of points, each pair of contiguous points defines a segment of the polyline. If the first and last points of the polyline are identical, the polyline is closed." diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index b7057a757a27..90afbe72b31b 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -1428,6 +1428,6 @@ and Mariette Yvinec. It appeared first in the release 3.8 of \cgal. In 2013, Clément Jamin made the meshing and optimization algorithms parallel on multi-core shared-memory architectures. -\todo Add reference to paper or research report when it is available. + */ } /* namespace CGAL */ diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 553358a202bc..24a8d1786a30 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -41,7 +41,6 @@ /*! \addtogroup PkgMesh3Ref -\todo check generated documentation \cgalPkgDescriptionBegin{3D Mesh Generation,PkgMesh3} \cgalPkgPicture{Mesh_3/fig/multilabel_mesher_small.jpg} \cgalPkgSummaryBegin diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index 7ef8933b5a0b..cc4e8c96c9ea 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -194,7 +194,6 @@ class Implicit_multi_domain_to_labeling_function_wrapper typedef std::vector Function_vector; #ifdef DOXYGEN_RUNNING //! - /// @todo different from code typedef typename Function::Point Point_3; #endif /// @} 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 9992d44a56f4..da495b895a3d 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -71,19 +71,20 @@ with a model of the concept `BisectionGeometricTraits_3`. An executable that uses `Labeled_image_mesh_domain_3` must be linked with the CGAL_ImageIO library. -@todo Document or comment the other parameters - \sa `BisectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. */ -template +template class CGAL_DEPRECATED_MSG ( "The class template `CGAL::Labeled_image_mesh_domain_3` is now deprecated. " @@ -117,14 +118,13 @@ Labeled_image_mesh_domain_3 /*! Construction from an image. - The parameter `error_bound` is relative to the size of the image. - @todo Document or comment the other parameters + @param error_bound is relative to the size of the image. */ Labeled_image_mesh_domain_3(const Image& image ,const FT& error_bound = FT(1e-3) +#ifndef DOXYGEN_RUNNING ,Subdomain_index value_outside = 0 ,Null null = Null() -#ifndef DOXYGEN_RUNNING ,CGAL::Random* p_rng = nullptr #endif ) @@ -146,13 +146,13 @@ Labeled_image_mesh_domain_3 parameters::p_rng = p_rng) {} - /// Destructor + // Destructor virtual ~Labeled_image_mesh_domain_3() {} using Base::bbox; private: - /// Returns a box enclosing image `im` + // Returns a box enclosing image `im` Bbox_3 compute_bounding_box(const Image& im) const { return Bbox_3(-im.vx()+im.tx(), diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index 7ef85ff8adda..2b8331a7b644 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -39,8 +39,6 @@ and a sizing field which may be a uniform or variable field. `Triangulation` of the instance used as model of `MeshComplex_3InTriangulation_3`. -@todo What to do with `Visitor_`? - \cgalModels `MeshCellCriteria_3` \sa `MeshCriteria_3` @@ -49,11 +47,22 @@ and a sizing field which may be a uniform or variable field. */ -template > +template +#endif + > class Mesh_cell_criteria_3 { public: + /// \name Types + /// @{ + + /*! + Numerical type + */ + typedef typename Tr::Geom_traits::FT FT; + typedef Visitor_ Visitor; typedef typename Visitor::Cell_quality Cell_quality; typedef typename Visitor::Is_cell_bad Is_cell_bad; @@ -67,21 +76,9 @@ class Mesh_cell_criteria_3 typedef Mesh_cell_criteria_3 Self; -public: - -#ifdef DOXYGEN_RUNNING -/// \name Types -/// @{ - -/*! -Numerical type -@todo: In the code this typedef is private -*/ -typedef Tr::FT FT; - -/// @} -#endif + /// @} +public: /// \name Creation /// @{ @@ -162,10 +159,12 @@ typedef Tr::FT FT; return criteria_(tr, cell); } +#ifndef DOXYGEN_RUNNING void add(Abstract_criterion* criterion) { criteria_.add(criterion); } +#endif private: void init_radius_edge(const FT& radius_edge_bound) diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index 7a14a3ea20b5..d35f24e024f8 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -51,11 +51,23 @@ namespace CGAL { \sa `CGAL::make_mesh_3()` */ -template > +template +#endif + > class Mesh_facet_criteria_3 { public: + + /// \name Types + /// @{ + + /*! + Numerical type + */ + typedef typename Tr::Geom_traits::FT FT; + typedef Visitor_ Visitor; typedef typename Visitor::Facet_quality Facet_quality; typedef typename Visitor::Is_facet_bad Is_facet_bad; @@ -65,31 +77,21 @@ class Mesh_facet_criteria_3 typedef Mesh_3::Criteria Criteria; typedef typename Tr::Facet Facet; - typedef typename Tr::Geom_traits::FT FT; + typedef Mesh_facet_criteria_3 Self; public: typedef CGAL::Tag_true Has_manifold_criterion; -#ifdef DOXYGEN_RUNNING -/// \name Types -/// @{ - -/*! -Numerical type -@todo: In the code this typedef is private -*/ -typedef Tr::FT FT; - /// @} -#endif /// \name Creation /// @{ - /*! +#ifdef DOXYGEN_RUNNING + /*! Returns an object to serve as criteria for facets. \param angle_bound is the lower bound for the angle in degrees of the surface mesh facets. @@ -100,17 +102,32 @@ typedef Tr::FT FT; \param topology is the set of topological constraints which have to be verified by each surface facet. See section \ref Mesh_3DelaunayRefinement for further details. - Note that if one parameter is set to 0, then its corresponding - criteria is ignored. \param min_radius_bound is a uniform lower bound for the radius of the surface Delaunay balls. Only facets with a radius larger than that bound will be refined. -@todo Does the Note also apply to min_radius_bound? + @note If one parameter is set to 0, then its corresponding + criterion is ignored. */ - template < typename Sizing_field, typename Sizing_field2 > + Mesh_facet_criteria_3(const FT& angle_bound, + const FT& radius_bound, + const FT& distance_bound, + const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, + const FT& min_radius_bound = 0.); + +#endif + + + /*! + Returns an object to serve as criteria for facets. The types `SizingField` and + `DistanceField` must + be models of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same + as above, except that the radius and distance bound parameters are + functionals instead of constants. + */ + template < typename Sizing_field, typename DistanceField > Mesh_facet_criteria_3(const FT& angle_bound, const Sizing_field & radius_bound, - const Sizing_field2& distance_bound, + const DistanceField& distance_bound, const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, const FT& min_radius_bound = 0.) { @@ -124,30 +141,15 @@ typedef Tr::FT FT; Mesh_3::Is_mesh_domain_field_3()); init_distance(distance_bound, - Mesh_3::Is_mesh_domain_field_3()); + Mesh_3::Is_mesh_domain_field_3()); init_topo(topology); } -#ifdef DOXYGEN_RUNNING - /*! - Returns an object to serve as criteria for facets. The types `SizingField` and - `DistanceField` must - be models of the concept `MeshDomainField_3`. The behavior and semantic of the arguments are the same - as above, except that the radius and distance bound parameters are - functionals instead of constants. - @todo This one is only in the doc - */ - template - Mesh_facet_criteria_3(const FT& angle_bound, - const SizingField& radius_bound, - const DistanceField& distance_bound, - Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE); -#endif /// @} -/// Destructor + // Destructor ~Mesh_facet_criteria_3() { } /** diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 17e69ff984cb..ca0ed7f8fc37 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -85,7 +85,7 @@ surface, the sub-domain indices on both sides are known. \tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. -\tparam IGT_ stands for a geometric traits class +\tparam IGT stands for a geometric traits class providing the types and functors required to implement the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated @@ -96,16 +96,16 @@ with a model of the concept `IntersectionGeometricTraits_3`. \sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. \sa `CGAL::Mesh_domain_with_polyline_features_3` -\sa `CGAL::Polyhedral_mesh_domain_3` -\sa `CGAL::Mesh_polyhedron_3` +\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Mesh_polyhedron_3` */ template < class IGT_, - class Polyhedron_ = typename Mesh_polyhedron_3::type, + class Polyhedron = typename Mesh_polyhedron_3::type, class TriangleAccessor=CGAL::Default > class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron_, + Polyhedral_mesh_domain_3< Polyhedron, IGT_, CGAL::Default, int, //Use_patch_id_tag @@ -113,14 +113,14 @@ class Polyhedral_complex_mesh_domain_3 { public: /// The base class - typedef Polyhedron_ Polyhedron; + typedef Polyhedron Polyhedron; typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron, IGT_, CGAL::Default, int, Tag_true > > Base; /// @cond DEVELOPERS private: - typedef IGT_ IGT; + typedef Polyhedral_mesh_domain_3 BaseBase; typedef Polyhedral_complex_mesh_domain_3 Self; @@ -178,7 +178,7 @@ class Polyhedral_complex_mesh_domain_3 boost::setS, // this avoids parallel edges boost::vecS, boost::undirectedS, - typename IGT::Point_3, + typename IGT_::Point_3, Set_of_indices> Featured_edges_copy_graph; /// @endcond @@ -378,7 +378,7 @@ class Polyhedral_complex_mesh_domain_3 typedef typename C3t3::Triangulation Tr; typedef typename Tr::Weighted_point Weighted_point; - typedef typename IGT::Sphere_3 Sphere_3; + typedef typename IGT_::Sphere_3 Sphere_3; typedef typename Polyhedron::Vertex_const_handle Vertex_const_handle; Tr& tr = c3t3.triangulation(); @@ -565,8 +565,8 @@ class Polyhedral_complex_mesh_domain_3 } // Shoot ray - typename IGT::Construct_ray_3 ray = IGT().construct_ray_3_object(); - typename IGT::Construct_vector_3 vector = IGT().construct_vector_3_object(); + typename IGT_::Construct_ray_3 ray = IGT_().construct_ray_3_object(); + typename IGT_::Construct_vector_3 vector = IGT_().construct_vector_3_object(); while(true) { Random_points_on_sphere_3 random_point(1.); @@ -598,7 +598,7 @@ class Polyhedral_complex_mesh_domain_3 Surface_patch_index face_id = r_domain_.make_surface_index(*opt); const std::pair& pair = r_domain_.incident_subdomains_indices(face_id); - const typename IGT::Triangle_3 triangle = + const typename IGT_::Triangle_3 triangle = BaseBase::template Primitive_type::datum(*opt); const Point_3& a = triangle[0]; const Point_3& b = triangle[1]; @@ -723,7 +723,7 @@ detect_features(FT angle_in_degree, G_copy g_copy; typedef typename boost::graph_traits::vertex_descriptor graph_vertex_descriptor; - typedef std::map P2vmap; // TODO: replace this map by and unordered_map P2vmap p2vmap; diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index a07b9d106ff6..394ec07be02d 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -129,7 +129,7 @@ the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. -@todo Document TriangleAccessor as it was template parameter. What about the two others? +@todo Comment TriangleAccessor as well as the others \cgalModels `MeshDomain_3` @@ -139,11 +139,14 @@ with a model of the concept `IntersectionGeometricTraits_3`. */ -template +template class Polyhedral_mesh_domain_3 { public: @@ -290,9 +293,6 @@ class Polyhedral_mesh_domain_3 } /*! - * @todo was not in doxygen - * Constructor. - * * Constructor from a sequence of polyhedral surfaces, and a bounding * polyhedral surface. * @@ -329,9 +329,6 @@ class Polyhedral_mesh_domain_3 } /*! - * @todo was not in doxygen - * Constructor. - * * Constructor from a sequence of polyhedral surfaces, without bounding * surface. The domain will always answer `false` to `is_in_domain()` * queries. @@ -360,7 +357,7 @@ class Polyhedral_mesh_domain_3 bounding_tree_ = 0; } - /// Destructor + // Destructor ~Polyhedral_mesh_domain_3() { if(bounding_tree_ != 0 && bounding_tree_ != &tree_) { delete bounding_tree_; diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 0d01d4159222..41fc06a2207f 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -88,13 +88,13 @@ instantiated with a model of the concept \sa `CGAL::Mesh_polyhedron_3` */ template < class IGT_, - class Polyhedron_ = typename Mesh_polyhedron_3::type, + class Polyhedron = typename Mesh_polyhedron_3::type, class TriangleAccessor= CGAL::Default, class Patch_id=int, class Use_exact_intersection_construction_tag = Tag_true > class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron_, + Polyhedral_mesh_domain_3< Polyhedron, IGT_, TriangleAccessor, Patch_id, @@ -102,7 +102,7 @@ class Polyhedral_mesh_domain_with_features_3 { typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< - Polyhedron_, IGT_, TriangleAccessor, + Polyhedron, IGT_, TriangleAccessor, Patch_id, Use_exact_intersection_construction_tag > > Base; typedef boost::adjacency_list< @@ -112,7 +112,7 @@ class Polyhedral_mesh_domain_with_features_3 typename IGT_::Point_3, std::set > Featured_edges_copy_graph; public: - typedef Polyhedron_ Polyhedron; + typedef Polyhedron Polyhedron; typedef Polyhedron Polyhedron_type; // Index types @@ -166,8 +166,11 @@ class Polyhedral_mesh_domain_with_features_3 The polyhedron `bounding_polyhedron` has to be closed and free of intersections. Its interior of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(1); @@ -184,13 +187,17 @@ class Polyhedral_mesh_domain_with_features_3 constructor above. */ CGAL_DEPRECATED - Polyhedral_mesh_domain_with_features_3(const std::string& filename, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_with_features_3(const std::string& filename +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(p_rng) , borders_detected_(false) { load_from_file(filename.c_str()); } +#ifndef DOXYGEN_RUNNING // The following is needed, because otherwise, when a "const char*" is // passed, the constructors templates are a better match, than the // constructor with `std::string`. @@ -201,6 +208,7 @@ class Polyhedral_mesh_domain_with_features_3 { load_from_file(filename); } +#endif #endif // not CGAL_NO_DEPRECATED_CODE /*! @@ -210,9 +218,12 @@ class Polyhedral_mesh_domain_with_features_3 Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron, - const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron + ,const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + ,CGAL::Random* p_rng = nullptr +#endif + ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(2); @@ -287,15 +298,16 @@ class Polyhedral_mesh_domain_with_features_3 /*! Detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedron) - and inserts them as features of the domain. `angle_bound` gives the maximum + and inserts them as features of the domain. + @param angle_bound gives the maximum angle (in degrees) between the two normal vectors of adjacent triangles. For an edge of the polyhedron, if the angle between the two normal vectors of its incident facets is bigger than the given bound, then the edge is considered as a feature edge. */ - void detect_features(FT angle_in_degree = FT(60)) + void detect_features(FT angle_bound = FT(60)) { - detect_features(angle_in_degree, stored_polyhedra); + detect_features(angle_bound, stored_polyhedra); } void detect_borders(std::vector& p); From 1b4d4e0eb07edaf31eea75cac9c8bd72a9bb15e1 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 12:49:33 +0100 Subject: [PATCH 0297/1398] various --- Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h | 1 + 1 file changed, 1 insertion(+) 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 da495b895a3d..952d4fc2187c 100644 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h @@ -118,6 +118,7 @@ Labeled_image_mesh_domain_3 /*! Construction from an image. + @param image the image @param error_bound is relative to the size of the image. */ Labeled_image_mesh_domain_3(const Image& image From 710219ed6d4be7d8d9742ce84b69e409a542fda0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 13:12:46 +0100 Subject: [PATCH 0298/1398] various --- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 1 - .../CGAL/Polyhedral_complex_mesh_domain_3.h | 11 +++++++--- .../include/CGAL/Polyhedral_mesh_domain_3.h | 11 +++++----- .../Polyhedral_mesh_domain_with_features_3.h | 21 ++++++++++++------- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index 2b8331a7b644..09ccdd883578 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -72,7 +72,6 @@ class Mesh_cell_criteria_3 typedef Mesh_3::Criteria Criteria; typedef typename Tr::Cell_handle Cell_handle; - typedef typename Tr::Geom_traits::FT FT; typedef Mesh_cell_criteria_3 Self; diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index ca0ed7f8fc37..98a766c97142 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -85,7 +85,7 @@ surface, the sub-domain indices on both sides are known. \tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. -\tparam IGT stands for a geometric traits class +\tparam IGT_ stands for a geometric traits class providing the types and functors required to implement the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated @@ -99,10 +99,15 @@ with a model of the concept `IntersectionGeometricTraits_3`. \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ +#ifdef DOXYGEN_RUNNING +template < class IGT, + class Polyhedron = typename Mesh_polyhedron_3::type, + class TriangleAccessor=CGAL::Default> +#else template < class IGT_, class Polyhedron = typename Mesh_polyhedron_3::type, - class TriangleAccessor=CGAL::Default - > + class TriangleAccessor=CGAL::Default> +#endif class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron, diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 394ec07be02d..4dc89cf407ec 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -129,8 +129,6 @@ the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. -@todo Comment TriangleAccessor as well as the others - \cgalModels `MeshDomain_3` \sa `IntersectionGeometricTraits_3` @@ -138,15 +136,16 @@ with a model of the concept `IntersectionGeometricTraits_3`. */ - +#ifdef DOXYGEN_RUNNING +template +#else template #endif - > class Polyhedral_mesh_domain_3 { public: diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 41fc06a2207f..99c4123eead3 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -87,14 +87,19 @@ instantiated with a model of the concept \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ -template < class IGT_, - class Polyhedron = typename Mesh_polyhedron_3::type, - class TriangleAccessor= CGAL::Default, - class Patch_id=int, - class Use_exact_intersection_construction_tag = Tag_true > +#ifdef DOXYGEN_RUNNING +template < class IGT + ,class Polyhedron = typename Mesh_polyhedron_3::type> +#else +template < class IGT_ + ,class Polyhedron_ = typename Mesh_polyhedron_3::type + ,class TriangleAccessor= CGAL::Default + ,class Patch_id=int + ,class Use_exact_intersection_construction_tag = Tag_true> +#endif class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron, + Polyhedral_mesh_domain_3< Polyhedron_, IGT_, TriangleAccessor, Patch_id, @@ -102,7 +107,7 @@ class Polyhedral_mesh_domain_with_features_3 { typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< - Polyhedron, IGT_, TriangleAccessor, + Polyhedron_, IGT_, TriangleAccessor, Patch_id, Use_exact_intersection_construction_tag > > Base; typedef boost::adjacency_list< @@ -112,7 +117,7 @@ class Polyhedral_mesh_domain_with_features_3 typename IGT_::Point_3, std::set > Featured_edges_copy_graph; public: - typedef Polyhedron Polyhedron; + typedef Polyhedron_ Polyhedron; typedef Polyhedron Polyhedron_type; // Index types From 585dc0f42458bd3b4e8225353de76af763dee2e0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 13:36:24 +0100 Subject: [PATCH 0299/1398] various --- Mesh_3/doc/Mesh_3/Doxyfile.in | 1 + Mesh_3/doc/Mesh_3/PackageDescription.txt | 4 ++-- Mesh_3/doc/Mesh_3/dependencies | 2 +- Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h | 2 +- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 4 ++-- Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h | 4 ++-- Mesher_level/include/CGAL/Mesh_optimization_return_code.h | 5 ++++- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index b7f0fd996208..86ae0b5b5b42 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -9,6 +9,7 @@ WARN_IF_UNDOCUMENTED = false ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of points, each pair of contiguous points defines a segment of the polyline. If the first and last points of the polyline are identical, the polyline is closed." INPUT += \ + ${CGAL_Mesher_level_INCLUDE_DIR}/CGAL/Mesh_optimization_return_code.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_triangulation_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_polyhedron_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_3.h \ diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 24a8d1786a30..3e907c426861 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -85,7 +85,7 @@ related to the template parameters of some models of the main concepts: \cgalCRPSection{Classes} -- `CGAL::Mesh_triangulation_3` +- `CGAL::Mesh_triangulation_3` - `CGAL::Mesh_vertex_base_3` - `CGAL::Compact_mesh_cell_base_3` - `CGAL::Mesh_cell_base_3` @@ -102,7 +102,7 @@ and their associated classes: - `CGAL::Polyhedral_mesh_domain_3` - `CGAL::Polyhedral_mesh_domain_with_features_3` - `CGAL::Polyhedral_complex_mesh_domain_3` -- `CGAL::Mesh_domain_with_polyline_features_3` +- `CGAL::Mesh_domain_with_polyline_features_3` - `CGAL::Mesh_polyhedron_3` - `CGAL::Triangle_accessor_3,K>` - `CGAL::Implicit_multi_domain_to_labeling_function_wrapper` diff --git a/Mesh_3/doc/Mesh_3/dependencies b/Mesh_3/doc/Mesh_3/dependencies index be614f85b311..5f5120071393 100644 --- a/Mesh_3/doc/Mesh_3/dependencies +++ b/Mesh_3/doc/Mesh_3/dependencies @@ -12,6 +12,6 @@ TDS_3 Polyhedron Miscellany Mesh_2 +Mesher_level Polygon_mesh_processing SMDS_3 - diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index cc4e8c96c9ea..8c1c880cb708 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -161,7 +161,7 @@ The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3 This parameter stands for a model of the concept `ImplicitFunction` described in the surface mesh generation package. The number types `ImplicitFunction::FT` and `BGT::FT` are required to match. -\sa `Labeled_mesh_domain_3`. +\sa `CGAL::Labeled_mesh_domain_3`. */ diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 6e810c060c4d..3782f9d46f47 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -340,8 +340,8 @@ The function type can be any model of the concept `Callable` compatible with the \cgalModels `MeshDomain_3` -\sa `Implicit_multi_domain_to_labeling_function_wrapper` -\sa `CGAL::make_mesh_3()`. +\sa `CGAL::Implicit_multi_domain_to_labeling_function_wrapper` +\sa `CGAL::make_mesh_3()` */ template` +\sa `CGAL::make_mesh_3()` +\sa `CGAL::Mesh_domain_with_polyline_features_3` \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ diff --git a/Mesher_level/include/CGAL/Mesh_optimization_return_code.h b/Mesher_level/include/CGAL/Mesh_optimization_return_code.h index 4717055c5303..3643395667c2 100644 --- a/Mesher_level/include/CGAL/Mesh_optimization_return_code.h +++ b/Mesher_level/include/CGAL/Mesh_optimization_return_code.h @@ -18,7 +18,10 @@ #define CGAL_MESH_OPTIMIZATION_RETURN_CODE_H namespace CGAL { - + /*! + * \brief bla bla + @todo document correctly + */ enum Mesh_optimization_return_code { MESH_OPTIMIZATION_UNKNOWN_ERROR=-1, From 95f150a16ce6cc0bf8eea69470d3ed64b0351153 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 16:51:33 +0100 Subject: [PATCH 0300/1398] various --- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 14 +++++++++----- .../CGAL/Polyhedral_mesh_domain_with_features_3.h | 6 +++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 8a284018e136..8550178efb4a 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -101,24 +101,28 @@ with a model of the concept `IntersectionGeometricTraits_3`. */ #ifdef DOXYGEN_RUNNING template < class IGT, - class Polyhedron = typename Mesh_polyhedron_3::type, + class Polyhedron = typename Mesh_polyhedron_3::type, class TriangleAccessor=CGAL::Default> +class Polyhedral_complex_mesh_domain_3 + : public Mesh_domain_with_polyline_features_3< + Polyhedral_mesh_domain_3< Polyhedron, + IGT> #else template < class IGT_, - class Polyhedron = typename Mesh_polyhedron_3::type, + class Polyhedron_ = typename Mesh_polyhedron_3::type, class TriangleAccessor=CGAL::Default> -#endif class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron, + Polyhedral_mesh_domain_3< Polyhedron_, IGT_, CGAL::Default, int, //Use_patch_id_tag Tag_true > >//Use_exact_intersection_tag +#endif { public: /// The base class - typedef Polyhedron Polyhedron; + typedef Polyhedron_ Polyhedron; typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron, IGT_, CGAL::Default, diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 99c4123eead3..8361c3edd2b4 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -90,13 +90,16 @@ instantiated with a model of the concept #ifdef DOXYGEN_RUNNING template < class IGT ,class Polyhedron = typename Mesh_polyhedron_3::type> +class Polyhedral_mesh_domain_with_features_3 + : public Mesh_domain_with_polyline_features_3< + Polyhedral_mesh_domain_3< Polyhedron, + IGT> > #else template < class IGT_ ,class Polyhedron_ = typename Mesh_polyhedron_3::type ,class TriangleAccessor= CGAL::Default ,class Patch_id=int ,class Use_exact_intersection_construction_tag = Tag_true> -#endif class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron_, @@ -104,6 +107,7 @@ class Polyhedral_mesh_domain_with_features_3 TriangleAccessor, Patch_id, Use_exact_intersection_construction_tag > > +#endif { typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< From 78ab4fab704560c0ae8806716d7917e94349423f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 22 May 2023 18:24:06 +0200 Subject: [PATCH 0301/1398] add special cases for header only packages --- Documentation/doc/CMakeLists.txt | 9 +++++++++ Mesh_3/doc/Mesh_3/dependencies | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index bec8ffbb22f3..13853e567353 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -402,6 +402,15 @@ else() endforeach() endif() +#special cases +foreach(pkg "Mesh_level") + if(CGAL_BRANCH_BUILD) + set(CGAL_${pkg}_INCLUDE_DIR "${CGAL_ROOT}/${pkg}/include") + else() + set(CGAL_${pkg}_INCLUDE_DIR "${CGAL_ROOT}/include") + endif() +endforeach() + option(CGAL_BUILD_THREE_DOC "Build the documentation of the Three package" OFF) if(NOT CGAL_BUILD_THREE_DOC) diff --git a/Mesh_3/doc/Mesh_3/dependencies b/Mesh_3/doc/Mesh_3/dependencies index 5f5120071393..c8703db07823 100644 --- a/Mesh_3/doc/Mesh_3/dependencies +++ b/Mesh_3/doc/Mesh_3/dependencies @@ -12,6 +12,5 @@ TDS_3 Polyhedron Miscellany Mesh_2 -Mesher_level Polygon_mesh_processing SMDS_3 From 79ce772e71f56f7bfac7aba96a6c74d0cc2a7a58 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 22 May 2023 18:46:09 +0100 Subject: [PATCH 0302/1398] various --- Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h | 3 ++- Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h | 10 +++++----- Mesh_3/include/CGAL/Implicit_mesh_domain_3.h | 17 +++++++---------- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 2 +- .../include/CGAL/Mesh_constant_domain_field_3.h | 14 +++++++------- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 2 +- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 4 ++-- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 2 +- .../include/CGAL/Sizing_field_with_aabb_tree.h | 14 +++++++------- 10 files changed, 34 insertions(+), 36 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h index ea4a1f33ea38..07cd4f12acdc 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h @@ -16,9 +16,10 @@ The concept `MeshCriteria_3` encapsulates these concepts. \sa `MeshFacetCriteria_3` \sa `MeshCellCriteria_3` +\sa `MeshCriteriaWithFeatures_3` \sa `CGAL::make_mesh_3()` \sa `CGAL::refine_mesh_3()` -\sa `MeshCriteriaWithFeatures_3` + */ diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h index bfe6e4b8d982..b2a0fb4fa9c2 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h @@ -2,7 +2,7 @@ \ingroup PkgMesh3SecondaryConcepts \cgalConcept -The concept `MeshPolyline_3` implements a container of points designed to represent a polyline (i.e.\ a sequence of points). +The concept `MeshPolyline_3` implements a container of points designed to represent a polyline (i.e., a sequence of points). Types and functions provided in this concept are such as standard template library containers are natural models of this concept. diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h index 03f9ff4880ad..958e64ea360d 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h @@ -19,19 +19,19 @@ class TriangleAccessor_3 { /// @{ /*! -Triangle type. Must be a model of DefaultConstructible and -CopyConstructible. +Triangle type. Must be a model of `DefaultConstructible` and +`CopyConstructible`. */ typedef unspecified_type Triangle_3; /*! -Triangle iterator type. Must be a model of InputIterator. +Triangle iterator type. Must be a model of `InputIterator`. */ typedef unspecified_type Triangle_iterator; /*! -Handle to a `Triangle_3`. Must be -constructible from `Triangle_iterator`. It may be `Triangle_Iterator` itself. +%Handle to a `Triangle_3`. Must be +constructible from `Triangle_iterator`. It may be `Triangle_iterator` itself. */ typedef unspecified_type Triangle_handle; diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h index 59ad97066501..b8c1d72e0bd4 100644 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h @@ -75,9 +75,12 @@ is a relative error bound expressed as a ratio to the bounding sphere radius. \sa `CGAL::make_mesh_3()`. */ -template > +template +#endif + > class CGAL_DEPRECATED_MSG ( "The class template `CGAL::Implicit_mesh_domain_3` is now deprecated. " @@ -95,12 +98,6 @@ Implicit_mesh_domain_3 typedef typename Base::FT FT; typedef BGT Geom_traits; - /** - * Constructor - * @param f the function which negative values defines the domain - * @param bounding_sphere a bounding sphere of the domain - * @param error_bound the error bound relative to the sphere radius - */ /// \name Creation /// @{ @@ -131,7 +128,7 @@ Implicit_mesh_domain_3 /// @} - /// Destructor + // Destructor virtual ~Implicit_mesh_domain_3() {} using Base::bbox; diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index 09ccdd883578..eab9f7944409 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -145,7 +145,7 @@ class Mesh_cell_criteria_3 /// @} - /// Destructor + // Destructor ~Mesh_cell_criteria_3() { } /** diff --git a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h index fc5ea3f7538a..46b23a408c3e 100644 --- a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h +++ b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h @@ -37,7 +37,7 @@ namespace CGAL { * a piecewise constant field, i.e. a sizing field with a constant size on each subpart * of the domain. * -* @tparam Gt is the geometric traits class. It must match the type `Triangulation::Geom_traits`, +* @tparam GT is the geometric traits class. It must match the type `Triangulation::Geom_traits`, * where `Triangulation` is the nested type of the model of `MeshComplex_3InTriangulation_3` used * in the meshing process. * @@ -46,7 +46,7 @@ namespace CGAL { * * @cgalModels `MeshDomainField_3` */ -template +template class Mesh_constant_domain_field_3 { public: @@ -56,19 +56,19 @@ class Mesh_constant_domain_field_3 /*! * Numerical type. */ - typedef typename Gt::FT FT; + typedef typename GT::FT FT; /*! * Point type. */ #ifdef DOXYGEN_RUNNING - typedef Gt::Point_3 Point_3; + typedef GT::Point_3 Point_3; #else typedef typename boost::mpl::eval_if_c< - internal::Has_nested_type_Bare_point::value, - typename internal::Bare_point_type, - boost::mpl::identity + internal::Has_nested_type_Bare_point::value, + typename internal::Bare_point_type, + boost::mpl::identity >::type Point_3; #endif diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index a297dd42e0f0..e7f3c4fa983b 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -134,7 +134,7 @@ class Mesh_edge_criteria_3 * break all the surface topology guarantees of the meshing algorithm. * It is not guaranteed to be exactly respected in the output mesh. * - * Note that if one parameter is set to 0, then its corresponding criterion is ignored. + * \note if one parameter is set to 0, then its corresponding criterion is ignored. */ Mesh_edge_criteria_3(const FT& length_bound, const FT& min_length_bound = 0) diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index d35f24e024f8..b35a7e78f95b 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -43,11 +43,11 @@ namespace CGAL { \cgalModels `MeshFacetCriteria_3` - \sa `CGAL::Mesh_facet_topology` \sa `MeshCriteria_3` \sa `MeshFacetCriteria_3` - \sa `CGAL::Mesh_criteria_3` \sa `MeshDomainField_3` + \sa `CGAL::Mesh_facet_topology` + \sa `CGAL::Mesh_criteria_3` \sa `CGAL::make_mesh_3()` */ diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 8550178efb4a..5f707903fbba 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -106,7 +106,7 @@ template < class IGT, class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron, - IGT> + IGT> > #else template < class IGT_, class Polyhedron_ = typename Mesh_polyhedron_3::type, diff --git a/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h b/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h index b3a0379c989e..1104b45322ed 100644 --- a/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h +++ b/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h @@ -52,7 +52,7 @@ namespace CGAL { * protecting ball will intersect a surface patch to which the * corresponding vertex does not belong. * -* @tparam GeomTraits is the geometric traits class. It must match the type `Triangulation::Geom_traits`, +* @tparam GT is the geometric traits class. It must match the type `Triangulation::Geom_traits`, * where `Triangulation` is the nested type of the model of `MeshComplex_3InTriangulation_3` used * in the meshing process. * @tparam MeshDomain is the type of the domain. It must be a model of `MeshDomainWithFeatures_3`, @@ -61,7 +61,7 @@ namespace CGAL { * @cgalModels `MeshDomainField_3` */ -template struct Sizing_field_with_aabb_tree { - using FT = typename GeomTraits::FT; - using Point_3 = typename GeomTraits::Point_3; + using FT = typename GT::FT; + using Point_3 = typename GT::Point_3; using Index = typename MeshDomain::Index; private: @@ -89,7 +89,7 @@ struct Sizing_field_with_aabb_tree typedef std::vector Corners_incident_patches; typedef std::vector Curves_incident_patches; - typedef GeomTraits Kernel_; + typedef GT Kernel_; typedef CGAL::Delaunay_triangulation_3 Dt; using Input_facets_AABB_tree = typename CGAL::Default::Get< @@ -532,8 +532,8 @@ struct Sizing_field_with_aabb_tree 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; + typedef typename GT::Segment_3 Segment_3; + typedef typename GT::Plane_3 Plane_3; const typename Input_curves_AABB_tree_::Point_and_primitive_id& ppid = d_ptr->domain.curves_aabb_tree().closest_point_and_primitive(p); From c4d6c232181458655b3f7f83e112d7f2beb2fb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 23 May 2023 08:43:52 +0200 Subject: [PATCH 0303/1398] add macro --- Documentation/doc/resources/1.9.6/BaseDoxyfile.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 5e86cb89cc18..6759b86cc65e 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -655,7 +655,9 @@ PREDEFINED = DOXYGEN_RUNNING \ "CGAL_NP_CLASS_1=NamedParameters1" \ "CGAL_NP_TEMPLATE_PARAMETERS_2=NamedParameters2 = CGAL::parameters::Default_named_parameter" \ "CGAL_NP_CLASS_2=NamedParameters2" \ - CGAL_DEPRECATED + CGAL_DEPRECATED \ + CGAL_DEPRECATED_MSG(name)= + #--------------------------------------------------------------------------- # Configuration options related to external references From 0c29013c3d45cb49505127e1f69503bacbc7f087 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 23 May 2023 09:58:41 +0100 Subject: [PATCH 0304/1398] Polish --- .../doc/Mesh_3/Concepts/MeshCellCriteria_3.h | 2 +- .../Concepts/MeshDomainWithFeatures_3.h | 6 ++--- Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h | 2 +- .../doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h | 2 +- .../doc/Mesh_3/Concepts/TriangleAccessor_3.h | 5 ++-- Mesh_3/include/CGAL/Triangle_accessor_3.h | 25 +++++++++++-------- 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h index d3b0b83f0a64..242c25189b5a 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h @@ -26,7 +26,7 @@ class MeshCellCriteria_3 { /// @{ /*! -Handle type for the cells of the +%Handle type for the cells of the triangulation. Must match the `Cell_handle` type in the triangulation type used by the mesh generation function. */ diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h index 18e97b9a2753..8e91075c5814 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h @@ -17,7 +17,7 @@ between two ordered points on the same curve. \cgalRefines{MeshDomain_3} -\cgalHasModel `CGAL::Mesh_domain_with_polyline_features_3` +\cgalHasModel `CGAL::Mesh_domain_with_polyline_features_3` \cgalHasModel `CGAL::Polyhedral_mesh_domain_with_features_3` \sa `MeshDomain_3` @@ -47,7 +47,7 @@ Point type. typedef unspecified_type Point_3; /*! -Type of indices for curves (i.e. \f$ 1\f$-dimensional features) +Type of indices for curves (i.e., \f$ 1\f$-dimensional features) of the input domain. Must be a model of CopyConstructible, Assignable, DefaultConstructible and LessThanComparable. The default constructed value must be the value of an edge which @@ -56,7 +56,7 @@ does not approximate a 1-dimensional feature of the input domain. typedef unspecified_type Curve_index; /*! -Type of indices for corners (i.e.\f$ 0\f$--dimensional features) +Type of indices for corners (i.e., \f$ 0\f$--dimensional features) of the input domain. Must be a model of CopyConstructible, Assignable, DefaultConstructible and LessThanComparable. diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h index 240f9b0f1fbf..929790c0d462 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h @@ -29,7 +29,7 @@ A segment, ray or line is said to intersect properly the domain boundary if it includes points which are strictly inside and strictly outside the domain (resp. the subdomain). -\cgalHasModel `CGAL::Polyhedral_mesh_domain_3` +\cgalHasModel `CGAL::Polyhedral_mesh_domain_3` \cgalHasModel `CGAL::Labeled_mesh_domain_3` \sa `MeshVertexBase_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h index 4c044751069f..50b9374fa983 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h @@ -46,7 +46,7 @@ typedef unspecified_type FT; /*! -Returns the value of the sizing field (i.e.\ the maximum edge length) at point `p`. +Returns the value of the sizing field (i.e., the maximum edge length) at point `p`. */ FT sizing_field(const Point_3& p); diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h index 958e64ea360d..5df33f35db1d 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h @@ -5,9 +5,8 @@ The concept `TriangleAccessor_3` represents an accessor to a triangulated polyhedral surface, intersection free and without boundaries. -\cgalHasModel `CGAL::Triangle_accessor_3,K>` +\cgalHasModel `CGAL::Triangle_accessor_3` -\sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::make_mesh_3()` */ @@ -36,7 +35,7 @@ constructible from `Triangle_iterator`. It may be `Triangle_iterator` itself. typedef unspecified_type Triangle_handle; /*! -Polyhedron type. +Polyhedron type which must be a model of `FaceGraph`. */ typedef unspecified_type Polyhedron; diff --git a/Mesh_3/include/CGAL/Triangle_accessor_3.h b/Mesh_3/include/CGAL/Triangle_accessor_3.h index cba5e955c7dc..578833fd494a 100644 --- a/Mesh_3/include/CGAL/Triangle_accessor_3.h +++ b/Mesh_3/include/CGAL/Triangle_accessor_3.h @@ -37,23 +37,26 @@ class Triangle_accessor_3 { /*! \ingroup PkgMesh3Domains -The class `Triangle_accessor_3` is a model for the concept `TriangleAccessor_3`. It is -designed to serve as accessor for objects of type `Polyhedron_3`. +The class `Triangle_accessor_3` is a model for the concept +`TriangleAccessor_3`. It is no longer used in the 3D Mesh +Generation package, and it is only kept for backward compatibility. -\attention Actually, the class `Triangle_accessor_3` is a partial specialization of the class -template `template -Triangle_accessor_3`. One may give another partial -specialization of this class to handle one's own polyhedron data structure. - -@todo Document the other partial specializations +\attention Actually, the class generic class template of +`Triangle_accessor_3` must not be used. Partial specializations +are provided for `CGAL::Polyhedron` and `CGAL::Graph_with_descriptor_with_graph>`. +\tparam Polyhdron must be model of FaceGraph \tparam K is the geometric traits class. \cgalModels `TriangleAccessor_3` +*/ -\sa `CGAL::Polyhedral_mesh_domain_3` +#ifdef DOXYGEN_RUNNING +template +class Triangle_accessor_3 +{}; -*/ +#else template < class K,class Items, template < class T, class I, class A> class T_HDS, @@ -142,7 +145,7 @@ class Triangle_accessor_3 >, K return Triangle_3(a,b,c); } }; - +#endif } // end namespace CGAL From a15956d231a5639cd850c6dde9f37891fdad1e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 24 May 2023 16:09:31 +0200 Subject: [PATCH 0305/1398] add clear function and input must mesh should be const in principle --- .../Non_manifold_feature_map.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Non_manifold_feature_map.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Non_manifold_feature_map.h index 8177a02d178b..e8901ebd727b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Non_manifold_feature_map.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Non_manifold_feature_map.h @@ -28,8 +28,8 @@ struct Non_manifold_feature_map typedef typename Graph_traits::halfedge_descriptor halfedge_descriptor; typedef dynamic_edge_property_t Edge_to_id_tag; typedef dynamic_vertex_property_t Vertex_to_id_tag; - typedef typename boost::property_map::type Edge_to_nm_id; - typedef typename boost::property_map::type Vertex_to_nm_id; + typedef typename boost::property_map::const_type Edge_to_nm_id; + typedef typename boost::property_map::const_type Vertex_to_nm_id; Edge_to_nm_id e_nm_id; Vertex_to_nm_id v_nm_id; std::vector< std::vector > non_manifold_edges; @@ -39,7 +39,7 @@ struct Non_manifold_feature_map {} template - Non_manifold_feature_map(PolygonMesh& pm, Vpm vpm) + Non_manifold_feature_map(const PolygonMesh& pm, Vpm vpm) : e_nm_id(get(Edge_to_id_tag(), pm)) , v_nm_id(get(Vertex_to_id_tag(), pm)) { @@ -99,6 +99,14 @@ struct Non_manifold_feature_map } } } + + void clear() + { + non_manifold_edges.clear(); + non_manifold_vertices.clear(); + e_nm_id = Edge_to_nm_id(); + v_nm_id = Vertex_to_nm_id(); + } }; } } // end of CGAL::Polygon_mesh_processing From 5d73a7addd778919f50b60b37d87e70886703035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 25 May 2023 10:06:51 +0200 Subject: [PATCH 0306/1398] add TODOs for parallelism --- .../examples/Polygon_mesh_processing/CMakeLists.txt | 1 + .../CGAL/Polygon_mesh_processing/autorefinement.h | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index d2faeb70cb28..306e216be408 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -120,6 +120,7 @@ if(TARGET CGAL::TBB_support) target_link_libraries(self_intersections_example PUBLIC CGAL::TBB_support) target_link_libraries(hausdorff_distance_remeshing_example PUBLIC CGAL::TBB_support) target_link_libraries(hausdorff_bounded_error_distance_example PUBLIC CGAL::TBB_support) + target_link_libraries(soup_autorefinement PUBLIC CGAL::TBB_support) create_single_source_cgal_program("corefinement_parallel_union_meshes.cpp") target_link_libraries(corefinement_parallel_union_meshes PUBLIC CGAL::TBB_support) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index e38f64ff3010..a46f2664803f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1116,7 +1116,7 @@ void autorefine_soup_output(const PointRange& input_points, typedef std::size_t Input_TID; typedef std::pair Pair_of_triangle_ids; - std::vector si_pairs; + std::vector si_pairs; // TODO: check std::vector is fine with Parallel_tag // collect intersecting pairs of triangles CGAL_PMP_AUTOREFINE_VERBOSE("collect intersecting pairs"); @@ -1170,6 +1170,7 @@ void autorefine_soup_output(const PointRange& input_points, CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); std::set > intersecting_triangles; + //TODO: PARALLEL_FOR #2 for (const Pair_of_triangle_ids& p : si_pairs) { int i1 = tri_inter_ids[p.first], @@ -1217,6 +1218,7 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef DEDUPLICATE_SEGMENTS // deduplicate inserted segments + //TODO: PARALLEL_FOR #3 std::vector>> all_segments_ids(all_segments.size()); for(std::size_t ti=0; ti> new_triangles; + std::vector> new_triangles; // Need to be threadsafe #ifdef USE_PROGRESS_DISPLAY boost::timer::progress_display pd(triangles.size()); #endif + //TODO: PARALLEL_FOR #1 for(std::size_t ti=0; ti to_input; + // TODO: reuse the fact that maps per triangle are already sorted std::map point_id_map; #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) std::vector exact_soup_points; @@ -1348,6 +1352,7 @@ void autorefine_soup_output(const PointRange& input_points, } // import refined triangles + //TODO: PARALLEL_FOR #4 for (const std::array& t : new_triangles) { soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); @@ -1355,11 +1360,11 @@ void autorefine_soup_output(const PointRange& input_points, #ifndef CGAL_NDEBUG CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - CGAL_assertion( !does_triangle_soup_self_intersect(exact_soup_points, soup_triangles) ); + CGAL_assertion( !does_triangle_soup_self_intersect(exact_soup_points, soup_triangles) ); #else #ifdef CGAL_DEBUG_PMP_AUTOREFINE CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles)) + if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles)) throw std::runtime_error("ERROR: invalid output, there is most probably a bug"); #endif #endif From bc45a0019425a03d5e31cbf993204ed95603e71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 25 May 2023 12:08:01 +0200 Subject: [PATCH 0307/1398] Undocument TriangleAccessor_3 and CGAL::Triangle_accessor_3 as they are unused --- .../doc/Mesh_3/Concepts/TriangleAccessor_3.h | 65 ------------------- Mesh_3/doc/Mesh_3/Doxyfile.in | 1 - Mesh_3/doc/Mesh_3/PackageDescription.txt | 1 - Mesh_3/include/CGAL/Triangle_accessor_3.h | 25 ------- 4 files changed, 92 deletions(-) delete mode 100644 Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h deleted file mode 100644 index 5df33f35db1d..000000000000 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ /dev/null @@ -1,65 +0,0 @@ -/*! -\ingroup PkgMesh3SecondaryConcepts -\cgalConcept - -The concept `TriangleAccessor_3` represents an accessor to a triangulated polyhedral -surface, intersection free and without boundaries. - -\cgalHasModel `CGAL::Triangle_accessor_3` - -\sa `CGAL::make_mesh_3()` - -*/ - -class TriangleAccessor_3 { -public: - -/// \name Types -/// @{ - -/*! -Triangle type. Must be a model of `DefaultConstructible` and -`CopyConstructible`. -*/ -typedef unspecified_type Triangle_3; - -/*! -Triangle iterator type. Must be a model of `InputIterator`. -*/ -typedef unspecified_type Triangle_iterator; - -/*! -%Handle to a `Triangle_3`. Must be -constructible from `Triangle_iterator`. It may be `Triangle_iterator` itself. -*/ -typedef unspecified_type Triangle_handle; - -/*! -Polyhedron type which must be a model of `FaceGraph`. -*/ -typedef unspecified_type Polyhedron; - -/// @} - -/// \name Operations -/// @{ - -/*! -Returns a `Triangle_iterator` to visit the triangles of polyhedron `p`. -*/ -Triangle_iterator triangles_begin(Polyhedron p); - -/*! -Returns the past-the-end iterator for the above iterator. -*/ -Triangle_iterator triangles_end(Polyhedron p); - -/*! -Returns a `Triangle_3` -object from handle `h`. -*/ -Triangle_3 triangle(Triangle_handle h); - -/// @} - -}; /* end TriangleAccessor_3 */ diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 86ae0b5b5b42..741c77a18f5b 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -30,7 +30,6 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_mesh_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/make_mesh_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Labeled_mesh_domain_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Triangle_accessor_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_criteria_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_constant_domain_field_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_cell_criteria_3.h \ diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 3e907c426861..c3b82d6b25bc 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -104,7 +104,6 @@ and their associated classes: - `CGAL::Polyhedral_complex_mesh_domain_3` - `CGAL::Mesh_domain_with_polyline_features_3` - `CGAL::Mesh_polyhedron_3` -- `CGAL::Triangle_accessor_3,K>` - `CGAL::Implicit_multi_domain_to_labeling_function_wrapper` - `CGAL::Implicit_mesh_domain_3` (deprecated) - `CGAL::Labeled_image_mesh_domain_3` (deprecated) diff --git a/Mesh_3/include/CGAL/Triangle_accessor_3.h b/Mesh_3/include/CGAL/Triangle_accessor_3.h index 578833fd494a..03c091ccdb42 100644 --- a/Mesh_3/include/CGAL/Triangle_accessor_3.h +++ b/Mesh_3/include/CGAL/Triangle_accessor_3.h @@ -33,30 +33,6 @@ class Triangle_accessor_3 { typedef typename Polyhedron::Error_bad_match Error_bad_match; }; - -/*! -\ingroup PkgMesh3Domains - -The class `Triangle_accessor_3` is a model for the concept -`TriangleAccessor_3`. It is no longer used in the 3D Mesh -Generation package, and it is only kept for backward compatibility. - -\attention Actually, the class generic class template of -`Triangle_accessor_3` must not be used. Partial specializations -are provided for `CGAL::Polyhedron` and `CGAL::Graph_with_descriptor_with_graph>`. - -\tparam Polyhdron must be model of FaceGraph -\tparam K is the geometric traits class. - -\cgalModels `TriangleAccessor_3` -*/ - -#ifdef DOXYGEN_RUNNING -template -class Triangle_accessor_3 -{}; - -#else template < class K,class Items, template < class T, class I, class A> class T_HDS, @@ -145,7 +121,6 @@ class Triangle_accessor_3 >, K return Triangle_3(a,b,c); } }; -#endif } // end namespace CGAL From 13f804402789dfa8e97df003cdef069f5d998caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 25 May 2023 14:56:16 +0200 Subject: [PATCH 0308/1398] Remove more (needless) doc appearances of TriangleAccessor --- Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h | 2 +- Mesh_3/doc/Mesh_3/PackageDescription.txt | 3 +-- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 2 +- Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h | 5 ++--- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h index a1b35060f858..7583cc6957e1 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h @@ -12,7 +12,7 @@ and construction of intersections between segments and triangles. \cgalHasModel All models of the `Kernel` concept. \sa `BisectionGeometricTraits_3` -\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Polyhedral_mesh_domain_3` */ class IntersectionGeometricTraits_3 { diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index c3b82d6b25bc..a2480bc71ac0 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -81,7 +81,6 @@ related to the template parameters of some models of the main concepts: - `MeshVertexBase_3` - `MeshDomainField_3` - `MeshPolyline_3` -- `TriangleAccessor_3` \cgalCRPSection{Classes} @@ -99,7 +98,7 @@ The following classes are models of domain concepts and their associated classes: - `CGAL::Labeled_mesh_domain_3` -- `CGAL::Polyhedral_mesh_domain_3` +- `CGAL::Polyhedral_mesh_domain_3` - `CGAL::Polyhedral_mesh_domain_with_features_3` - `CGAL::Polyhedral_complex_mesh_domain_3` - `CGAL::Mesh_domain_with_polyline_features_3` diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 9fa436fe842b..a4f81ce18124 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -532,7 +532,7 @@ It has to be a model of the `MeshDomain_3` concept. \sa `MeshDomain_3` \sa `MeshPolyline_3` \sa `CGAL::Implicit_mesh_domain_3` -\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Labeled_image_mesh_domain_3` */ diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 5f707903fbba..68687f526bec 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -96,13 +96,12 @@ with a model of the concept `IntersectionGeometricTraits_3`. \sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()` \sa `CGAL::Mesh_domain_with_polyline_features_3` -\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ #ifdef DOXYGEN_RUNNING template < class IGT, - class Polyhedron = typename Mesh_polyhedron_3::type, - class TriangleAccessor=CGAL::Default> + class Polyhedron = typename Mesh_polyhedron_3::type> class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron, diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 8361c3edd2b4..7c07b8a5ef21 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -84,7 +84,7 @@ instantiated with a model of the concept \cgalModels `MeshDomainWithFeatures_3` \sa `CGAL::Mesh_domain_with_polyline_features_3` -\sa `CGAL::Polyhedral_mesh_domain_3` +\sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ #ifdef DOXYGEN_RUNNING From c3873374ceb18111f776a7e4ba983d61ed0fc38d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 25 May 2023 14:56:46 +0200 Subject: [PATCH 0309/1398] Carry the template parameter (as it should be if it were actually in use) It is in fact CGAL::Default and unused everywhere, but it's clearer this way. --- Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 68687f526bec..56fabd998135 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -114,7 +114,7 @@ class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron_, IGT_, - CGAL::Default, + TriangleAccessor, int, //Use_patch_id_tag Tag_true > >//Use_exact_intersection_tag #endif @@ -124,7 +124,7 @@ class Polyhedral_complex_mesh_domain_3 typedef Polyhedron_ Polyhedron; typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< - Polyhedron, IGT_, CGAL::Default, + Polyhedron, IGT_, TriangleAccessor, int, Tag_true > > Base; /// @cond DEVELOPERS private: From 6d3d60c6e27b1cab5939fdb50694007bfa5491fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 25 May 2023 15:19:13 +0200 Subject: [PATCH 0310/1398] Do not document Mesh_3 classes' members that are not explicitely documented --- Mesh_3/doc/Mesh_3/Doxyfile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 741c77a18f5b..70e7712b5745 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -3,6 +3,7 @@ EXTRACT_ALL = false HIDE_UNDOC_CLASSES = true +HIDE_UNDOC_MEMBERS = true WARN_IF_UNDOCUMENTED = false # macros to be used inside the code From abad43a63db368aec51a5a0ec6b1fe918c082596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 25 May 2023 15:19:36 +0200 Subject: [PATCH 0311/1398] Add missing doc dependency --- Mesh_3/doc/Mesh_3/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Mesh_3/doc/Mesh_3/dependencies b/Mesh_3/doc/Mesh_3/dependencies index c8703db07823..3219d3896f46 100644 --- a/Mesh_3/doc/Mesh_3/dependencies +++ b/Mesh_3/doc/Mesh_3/dependencies @@ -10,6 +10,7 @@ Triangulation_3 Periodic_3_triangulation_3 TDS_3 Polyhedron +Surface_mesh Miscellany Mesh_2 Polygon_mesh_processing From 525338eec262979fd676da4a53a120f18166239e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 26 May 2023 12:52:35 +0200 Subject: [PATCH 0312/1398] Haronize Gt/GT/etc. --- Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h | 4 +- .../doc/Mesh_3/Concepts/MeshDomainField_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h | 2 +- Mesh_3/doc/Mesh_3/PackageDescription.txt | 10 +-- Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 72 ++++++++--------- .../Mesh_3/Cell_criteria_visitor_with_balls.h | 8 +- .../CGAL/Mesh_3/Detect_features_in_image.h | 6 +- .../Facet_criteria_visitor_with_balls.h | 12 +-- Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h | 48 ++++++------ .../CGAL/Mesh_3/Mesh_global_optimizer.h | 50 ++++++------ .../include/CGAL/Mesh_3/Mesh_sizing_field.h | 16 ++-- Mesh_3/include/CGAL/Mesh_3/Odt_move.h | 28 +++---- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 36 ++++----- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 26 +++---- Mesh_3/include/CGAL/Mesh_3/Sizing_grid.h | 14 ++-- Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h | 14 ++-- Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h | 24 +++--- .../CGAL/Mesh_3/Triangle_accessor_primitive.h | 16 ++-- .../CGAL/Mesh_3/Triangulation_helpers.h | 32 ++++---- .../CGAL/Mesh_3/Triangulation_sizing_field.h | 22 +++--- .../CGAL/Mesh_3/Uniform_sizing_field.h | 4 +- ...tialize_triangulation_from_labeled_image.h | 12 +-- .../CGAL/Mesh_3/mesh_standard_cell_criteria.h | 14 ++-- .../Mesh_3/mesh_standard_facet_criteria.h | 44 +++++------ Mesh_3/include/CGAL/Mesh_3/sliver_criteria.h | 8 +- .../include/CGAL/Mesh_3/vertex_perturbation.h | 78 +++++++++---------- .../Mesh_domain_with_polyline_features_3.h | 10 +-- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 6 +- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 16 ++-- .../include/CGAL/Polyhedral_mesh_domain_3.h | 16 ++-- Mesh_3/test/Mesh_3/test_criteria.cpp | 4 +- Mesh_3/test/Mesh_3/test_mesh_3_issue_1554.cpp | 4 +- .../test/Mesh_3/test_meshing_polyhedron.cpp | 6 +- .../test_meshing_polyhedron_with_features.cpp | 6 +- Mesh_3/test/Mesh_3/test_min_size_criteria.cpp | 6 +- 35 files changed, 337 insertions(+), 339 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h index 028d9e70d9fe..68138d36775e 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h @@ -43,8 +43,8 @@ each cell (see below). \cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible} -\cgalHasModel `CGAL::Compact_mesh_cell_base_3` -\cgalHasModel `CGAL::Mesh_cell_base_3` +\cgalHasModel `CGAL::Compact_mesh_cell_base_3` +\cgalHasModel `CGAL::Mesh_cell_base_3` \sa `CGAL::make_mesh_3()` \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h index 644a3a46046b..c90469bf8354 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h @@ -5,7 +5,7 @@ The concept `MeshDomainField_3` describes a scalar field which could be queried at any point of the space. -\cgalHasModel `CGAL::Mesh_constant_domain_field_3` +\cgalHasModel `CGAL::Mesh_constant_domain_field_3` \sa `MeshDomain_3` \sa `MeshDomainWithFeatures_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h index 4739741b01c7..a80d9c5b28f4 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h @@ -22,7 +22,7 @@ each cell (see below). \cgalRefines{SimplicialMeshVertexBase_3,RegularTriangulationVertexBase_3,SurfaceMeshVertexBase_3} -\cgalHasModel `CGAL::Mesh_vertex_base_3` +\cgalHasModel `CGAL::Mesh_vertex_base_3` \sa `CGAL::make_mesh_3()` \sa `CGAL::refine_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index a2480bc71ac0..bad6b7e691e1 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -84,15 +84,15 @@ related to the template parameters of some models of the main concepts: \cgalCRPSection{Classes} -- `CGAL::Mesh_triangulation_3` -- `CGAL::Mesh_vertex_base_3` -- `CGAL::Compact_mesh_cell_base_3` -- `CGAL::Mesh_cell_base_3` +- `CGAL::Mesh_triangulation_3` +- `CGAL::Mesh_vertex_base_3` +- `CGAL::Compact_mesh_cell_base_3` +- `CGAL::Mesh_cell_base_3` - `CGAL::Mesh_criteria_3` - `CGAL::Mesh_cell_criteria_3` - `CGAL::Mesh_facet_criteria_3` - `CGAL::Mesh_edge_criteria_3` -- `CGAL::Mesh_constant_domain_field_3` +- `CGAL::Mesh_constant_domain_field_3` The following classes are models of domain concepts and their associated classes: diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 6a15d8cce50c..a7826a3d56b4 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -378,10 +378,10 @@ template class C3T3_helpers_base { protected: - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef typename Tr::Facet Facet; @@ -450,7 +450,7 @@ template class C3T3_helpers_base { protected: - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Vertex_handle Vertex_handle; @@ -625,14 +625,14 @@ class C3T3_helpers typedef typename Base::Lock_data_structure Lock_data_structure; typedef typename C3T3::Triangulation Tr; typedef Tr Triangulation; - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::Vector_3 Vector_3; - typedef typename Gt::Plane_3 Plane_3; - typedef typename Gt::Tetrahedron_3 Tetrahedron; + typedef typename GT::Vector_3 Vector_3; + typedef typename GT::Plane_3 Plane_3; + typedef typename GT::Tetrahedron_3 Tetrahedron; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Facet Facet; @@ -1118,17 +1118,17 @@ class C3T3_helpers const bool update_c3t3, const bool update_surface_center) const { - typedef typename C3T3::Triangulation::Geom_traits Gt; - typedef typename Gt::Segment_3 Segment_3; - typedef typename Gt::Ray_3 Ray_3; - typedef typename Gt::Line_3 Line_3; + typedef typename C3T3::Triangulation::Geom_traits GT; + typedef typename GT::Segment_3 Segment_3; + typedef typename GT::Ray_3 Ray_3; + typedef typename GT::Line_3 Line_3; // Nothing to do for infinite facets if ( c3t3_.triangulation().is_infinite(facet) ) return Surface_patch(); // Functors - typename Gt::Is_degenerate_3 is_degenerate = + typename GT::Is_degenerate_3 is_degenerate = c3t3_.triangulation().geom_traits().is_degenerate_3_object(); // Get dual of facet @@ -2476,7 +2476,7 @@ update_mesh_no_topo_change(const Vertex_handle& old_vertex, << " " << new_position << ")" << std::endl; #endif - typename Gt::Construct_opposite_vector_3 cov = tr_.geom_traits().construct_opposite_vector_3_object(); + typename GT::Construct_opposite_vector_3 cov = tr_.geom_traits().construct_opposite_vector_3_object(); //backup metadata std::set cells_backup; @@ -2685,7 +2685,7 @@ C3T3_helpers:: rebuild_restricted_delaunay(OutdatedCells& outdated_cells, Moving_vertices_set& moving_vertices) { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); typename OutdatedCells::iterator first_cell = outdated_cells.begin(); typename OutdatedCells::iterator last_cell = outdated_cells.end(); @@ -2815,9 +2815,9 @@ rebuild_restricted_delaunay(ForwardIterator first_cell, ForwardIterator last_cell, Moving_vertices_set& moving_vertices) { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Construct_vector_3 vector = tr_.geom_traits().construct_vector_3_object(); - typename Gt::Equal_3 equal = tr_.geom_traits().equal_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_vector_3 vector = tr_.geom_traits().construct_vector_3_object(); + typename GT::Equal_3 equal = tr_.geom_traits().equal_3_object(); Update_c3t3 updater(domain_,c3t3_); @@ -2953,9 +2953,9 @@ move_point(const Vertex_handle& old_vertex, << " " << move << ")\n"; #endif - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); Cell_vector incident_cells_; incident_cells_.reserve(64); @@ -3004,9 +3004,9 @@ move_point(const Vertex_handle& old_vertex, << " " << move << ")\n"; #endif - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); Cell_vector incident_cells_; incident_cells_.reserve(64); @@ -3068,9 +3068,9 @@ move_point(const Vertex_handle& old_vertex, } //======= /Get incident cells ========== - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); const Weighted_point& position = tr_.point(old_vertex); const Weighted_point& new_position = cwp(translate(cp(position), move)); @@ -3372,14 +3372,14 @@ project_on_surface_aux(const Bare_point& p, const Bare_point& ref_point, const Vector_3& projection_vector) const { - typedef typename Gt::Segment_3 Segment_3; + typedef typename GT::Segment_3 Segment_3; // Build a segment directed as projection_direction, - typename Gt::Compute_squared_distance_3 sq_distance = tr_.geom_traits().compute_squared_distance_3_object(); - typename Gt::Compute_squared_length_3 sq_length = tr_.geom_traits().compute_squared_length_3_object(); - typename Gt::Construct_scaled_vector_3 scale = tr_.geom_traits().construct_scaled_vector_3_object(); - typename Gt::Is_degenerate_3 is_degenerate = tr_.geom_traits().is_degenerate_3_object(); - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Compute_squared_distance_3 sq_distance = tr_.geom_traits().compute_squared_distance_3_object(); + typename GT::Compute_squared_length_3 sq_length = tr_.geom_traits().compute_squared_length_3_object(); + typename GT::Construct_scaled_vector_3 scale = tr_.geom_traits().construct_scaled_vector_3_object(); + typename GT::Is_degenerate_3 is_degenerate = tr_.geom_traits().is_degenerate_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); typename MD::Construct_intersection construct_intersection = domain_.construct_intersection_object(); @@ -3432,7 +3432,7 @@ get_least_square_surface_plane(const Vertex_handle& v, Surface_patch_index patch_index) const { typedef typename C3T3::Triangulation::Triangle Triangle; - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); // Get incident facets Facet_vector facets; @@ -3521,8 +3521,8 @@ project_on_surface_if_possible(const Vertex_handle& v, { // return domain_.project_on_surface(p); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Equal_3 equal = tr_.geom_traits().equal_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Equal_3 equal = tr_.geom_traits().equal_3_object(); // Get plane std::pair, Bare_point> pl_rp diff --git a/Mesh_3/include/CGAL/Mesh_3/Cell_criteria_visitor_with_balls.h b/Mesh_3/include/CGAL/Mesh_3/Cell_criteria_visitor_with_balls.h index 4e9393a01e53..3e6824d27ea8 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Cell_criteria_visitor_with_balls.h +++ b/Mesh_3/include/CGAL/Mesh_3/Cell_criteria_visitor_with_balls.h @@ -45,8 +45,8 @@ class Cell_criteria_visitor_with_balls typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; int nb_weighted_points; std::vector points; @@ -59,9 +59,9 @@ class Cell_criteria_visitor_with_balls Cell_criteria_visitor_with_balls(const Tr& tr, const Cell_handle& ch) : Base(tr, ch) { - typename Gt::Compare_weighted_squared_radius_3 compare_sq_radius = + typename GT::Compare_weighted_squared_radius_3 compare_sq_radius = tr.geom_traits().compare_weighted_squared_radius_3_object(); - typename Gt::Squared_radius_orthogonal_sphere sq_radius_ortho_sphere = + typename GT::Squared_radius_orthogonal_sphere sq_radius_ortho_sphere = tr.geom_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); const Weighted_point& p = tr.point(ch, 0); 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 index 8efaf67f799d..5df9393ce5d2 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h +++ b/Mesh_3/include/CGAL/Mesh_3/Detect_features_in_image.h @@ -57,9 +57,9 @@ std::vector> detect_features_in_image_with_know_word_type(const CGAL::Image_3& image, CGAL::Image_3& weights) { - using Gt = typename CGAL::Kernel_traits

    ::Kernel; + using GT = typename CGAL::Kernel_traits

    ::Kernel; using Point_3 = P; - using Vector_3 = typename Gt::Vector_3; + using Vector_3 = typename GT::Vector_3; using Polyline_type = std::vector; using Polylines = std::vector; @@ -86,7 +86,7 @@ detect_features_in_image_with_know_word_type(const CGAL::Image_3& image, using CGAL::IMAGEIO::static_evaluate; - using Del = CGAL::Delaunay_triangulation_3; + using Del = CGAL::Delaunay_triangulation_3; using Cell_handle = typename Del::Cell_handle; using Vertex_handle = typename Del::Vertex_handle; Del triangulation; diff --git a/Mesh_3/include/CGAL/Mesh_3/Facet_criteria_visitor_with_balls.h b/Mesh_3/include/CGAL/Mesh_3/Facet_criteria_visitor_with_balls.h index ec638dd29efb..0db721cd9d97 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Facet_criteria_visitor_with_balls.h +++ b/Mesh_3/include/CGAL/Mesh_3/Facet_criteria_visitor_with_balls.h @@ -50,8 +50,8 @@ class Facet_criterion_visitor_with_balls typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; int wp_nb_; double radius_ortho_shpere; @@ -68,13 +68,13 @@ class Facet_criterion_visitor_with_balls , radius_ortho_shpere(0.) , ratio(0.) { - typename Gt::Compare_weighted_squared_radius_3 compare_sq_radius = + typename GT::Compare_weighted_squared_radius_3 compare_sq_radius = tr.geom_traits().compare_weighted_squared_radius_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = tr.geom_traits().compute_weight_3_object(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Squared_radius_orthogonal_sphere sq_radius_ortho_sphere = + typename GT::Squared_radius_orthogonal_sphere sq_radius_ortho_sphere = tr.geom_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); Weighted_point wp1 = tr.point(fh.first, (fh.second+1)&3); diff --git a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h index f709f4b4f1a3..74dbb09b2ca5 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h +++ b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h @@ -44,7 +44,7 @@ template Facet_vector; typedef typename std::vector Cell_vector; - typedef typename Gt::FT FT; - typedef typename Gt::Point_2 Point_2; - typedef typename Gt::Vector_3 Vector_3; - typedef typename Gt::Tetrahedron_3 Tetrahedron_3; - typedef typename Gt::Plane_3 Plane_3; - typedef typename Gt::Aff_transformation_3 Aff_transformation_3; + typedef typename GT::FT FT; + typedef typename GT::Point_2 Point_2; + typedef typename GT::Vector_3 Vector_3; + typedef typename GT::Tetrahedron_3 Tetrahedron_3; + typedef typename GT::Plane_3 Plane_3; + typedef typename GT::Aff_transformation_3 Aff_transformation_3; public: typedef SizingField Sizing_field; @@ -261,7 +261,7 @@ class Lloyd_move { const Tr& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); Facet_vector incident_facets; incident_facets.reserve(64); @@ -306,8 +306,8 @@ class Lloyd_move const C3T3& c3t3, const Sizing_field& sizing_field) const { - typename Gt::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); + typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); + typename GT::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); const Weighted_point position = c3t3.triangulation().point(v); const Bare_point& p = cp(position); @@ -329,8 +329,8 @@ class Lloyd_move const C3T3& c3t3, const Sizing_field& sizing_field) const { - typename Gt::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); + typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); + typename GT::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); const Weighted_point& position = c3t3.triangulation().point(v); const Bare_point& p = cp(position); @@ -409,10 +409,10 @@ class Lloyd_move { CGAL_precondition(std::distance(first,last) >= 3); - typename Gt::Compute_area_3 area = c3t3.triangulation().geom_traits().compute_area_3_object(); - typename Gt::Construct_centroid_3 centroid = c3t3.triangulation().geom_traits().construct_centroid_3_object(); - typename Gt::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); + typename GT::Compute_area_3 area = c3t3.triangulation().geom_traits().compute_area_3_object(); + typename GT::Construct_centroid_3 centroid = c3t3.triangulation().geom_traits().construct_centroid_3_object(); + typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); + typename GT::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); // Vertex current position const Weighted_point& vertex_weighted_position = c3t3.triangulation().point(v); @@ -460,8 +460,8 @@ class Lloyd_move const Bare_point& reference_point, const C3T3& c3t3) const { - typename Gt::Construct_base_vector_3 base = c3t3.triangulation().geom_traits().construct_base_vector_3_object(); - typename Gt::Construct_orthogonal_vector_3 orthogonal_vector = c3t3.triangulation().geom_traits().construct_orthogonal_vector_3_object(); + typename GT::Construct_base_vector_3 base = c3t3.triangulation().geom_traits().construct_base_vector_3_object(); + typename GT::Construct_orthogonal_vector_3 orthogonal_vector = c3t3.triangulation().geom_traits().construct_orthogonal_vector_3_object(); Vector_3 u = base(plane, 1); u = u / CGAL::sqrt(u*u); @@ -542,12 +542,12 @@ class Lloyd_move const Tr& tr = c3t3.triangulation(); - typename Gt::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Construct_tetrahedron_3 tetrahedron = tr.geom_traits().construct_tetrahedron_3_object(); - typename Gt::Construct_translated_point_3 translate = tr.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_vector_3 vector = tr.geom_traits().construct_vector_3_object(); - typename Gt::Compute_volume_3 volume = tr.geom_traits().compute_volume_3_object(); + typename GT::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_tetrahedron_3 tetrahedron = tr.geom_traits().construct_tetrahedron_3_object(); + typename GT::Construct_translated_point_3 translate = tr.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_vector_3 vector = tr.geom_traits().construct_vector_3_object(); + typename GT::Compute_volume_3 volume = tr.geom_traits().compute_volume_3_object(); Cell_circulator current_cell = tr.incident_cells(edge); Cell_circulator done = current_cell; diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h index 7b83d8b05bcf..0014ff0e5e04 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h @@ -68,9 +68,9 @@ template class Mesh_global_optimizer_base { protected: - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Lock_data_structure Lock_data_structure; // The sizing field info is stored inside the move vector because it is computed @@ -127,9 +127,9 @@ class Mesh_global_optimizer_base { protected: - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Lock_data_structure Lock_data_structure; typedef tbb::concurrent_vector > Moves_vector; @@ -240,7 +240,7 @@ class Mesh_global_optimizer using Base::increment_frozen_points; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -249,8 +249,8 @@ class Mesh_global_optimizer typedef typename Tr::Edge Edge; typedef typename Tr::Vertex Vertex; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename std::vector Cell_vector; typedef typename std::vector Vertex_vector; @@ -380,7 +380,7 @@ class Mesh_global_optimizer Moves_vector_ & m_moves; bool m_do_freeze; Vertex_conc_vector & m_vertices_not_moving_any_more; - const Gt & m_gt; + const GT & m_gt; public: // Constructor @@ -389,7 +389,7 @@ class Mesh_global_optimizer Moves_vector_ &moves, bool do_freeze, Vertex_conc_vector &vertices_not_moving_any_more, - const Gt >) + const GT >) : m_mgo(mgo), m_sizing_field(sizing_field), m_moves(moves), @@ -411,8 +411,8 @@ class Mesh_global_optimizer // operator() void operator()(const Vertex_handle& oldv) const { - typename Gt::Construct_point_3 cp = m_gt.construct_point_3_object(); - typename Gt::Construct_translated_point_3 translate = m_gt.construct_translated_point_3_object(); + typename GT::Construct_point_3 cp = m_gt.construct_point_3_object(); + typename GT::Construct_translated_point_3 translate = m_gt.construct_translated_point_3_object(); Vector_3 move = m_mgo.compute_move(oldv); if ( CGAL::NULL_VECTOR != move ) @@ -451,13 +451,13 @@ class Mesh_global_optimizer class Compute_sizing_field_value { MGO & m_mgo; - const Gt & m_gt; + const GT & m_gt; Local_list_ & m_local_lists; public: // Constructor Compute_sizing_field_value(MGO &mgo, - const Gt >, + const GT >, Local_list_ &local_lists) : m_mgo(mgo), m_gt(gt), @@ -474,7 +474,7 @@ class Mesh_global_optimizer // operator() void operator()(Vertex& v) const { - typename Gt::Construct_point_3 cp = m_gt.construct_point_3_object(); + typename GT::Construct_point_3 cp = m_gt.construct_point_3_object(); Vertex_handle vh = Tr::Triangulation_data_structure::Vertex_range::s_iterator_to(v); @@ -827,8 +827,8 @@ compute_moves(Moving_vertices_set& moving_vertices) else #endif // CGAL_LINKED_WITH_TBB { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); // Get move for each moving vertex typename Moving_vertices_set::iterator vit = moving_vertices.begin(); @@ -879,10 +879,10 @@ typename Mesh_global_optimizer::Vector_3 Mesh_global_optimizer:: compute_move(const Vertex_handle& v) { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Compute_squared_length_3 sq_length = tr_.geom_traits().compute_squared_length_3_object(); - typename Gt::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_vector_3 vector = tr_.geom_traits().construct_vector_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Compute_squared_length_3 sq_length = tr_.geom_traits().compute_squared_length_3_object(); + typename GT::Construct_translated_point_3 translate = tr_.geom_traits().construct_translated_point_3_object(); + typename GT::Construct_vector_3 vector = tr_.geom_traits().construct_vector_3_object(); Cell_vector incident_cells; incident_cells.reserve(64); @@ -1061,7 +1061,7 @@ fill_sizing_field() else #endif //CGAL_LINKED_WITH_TBB { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); // Fill map with local size for(typename Tr::Finite_vertices_iterator vit = tr_.finite_vertices_begin(); @@ -1195,8 +1195,8 @@ typename Mesh_global_optimizer::FT Mesh_global_optimizer:: sq_circumradius_length(const Cell_handle& cell, const Vertex_handle& v) const { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Compute_squared_distance_3 sq_distance = tr_.geom_traits().compute_squared_distance_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Compute_squared_distance_3 sq_distance = tr_.geom_traits().compute_squared_distance_3_object(); const Bare_point circumcenter = tr_.dual(cell); const Weighted_point& position = tr_.point(cell, cell->index(v)); diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h index e1d52d202f2c..03e3262ef6bd 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h @@ -88,10 +88,10 @@ class Mesh_sizing_field typename Tr::Concurrency_tag> { // Types - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; @@ -169,7 +169,7 @@ fill(const std::map& value_map) { typedef typename Tr::Finite_vertices_iterator Fvi; - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); for ( Fvi vit = tr_.finite_vertices_begin(); vit != tr_.finite_vertices_end(); ++ vit ) { @@ -196,7 +196,7 @@ typename Mesh_sizing_field::FT Mesh_sizing_field:: operator()(const Bare_point& p, const Cell_handle& c) const { - typename Gt::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); + typename GT::Construct_weighted_point_3 cwp = tr_.geom_traits().construct_weighted_point_3_object(); #ifdef CGAL_MESH_3_SIZING_FIELD_INEXACT_LOCATE //use the inexact locate (much faster than locate) to get a hint @@ -239,8 +239,8 @@ typename Mesh_sizing_field::FT Mesh_sizing_field:: interpolate_on_cell_vertices(const Bare_point& p, const Cell_handle& cell) const { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); - typename Gt::Compute_volume_3 volume = tr_.geom_traits().compute_volume_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Compute_volume_3 volume = tr_.geom_traits().compute_volume_3_object(); // Interpolate value using tet vertices values const FT& va = cell->vertex(0)->meshing_info(); @@ -275,9 +275,9 @@ typename Mesh_sizing_field::FT Mesh_sizing_field:: interpolate_on_facet_vertices(const Bare_point& p, const Cell_handle& cell) const { - typename Gt::Compute_area_3 area = tr_.geom_traits().compute_area_3_object(); + typename GT::Compute_area_3 area = tr_.geom_traits().compute_area_3_object(); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); // Find infinite vertex and put it in k0 int k0 = 0; int k1 = 1; diff --git a/Mesh_3/include/CGAL/Mesh_3/Odt_move.h b/Mesh_3/include/CGAL/Mesh_3/Odt_move.h index a2cbcc78cc5a..4ec48adaf2ed 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Odt_move.h +++ b/Mesh_3/include/CGAL/Mesh_3/Odt_move.h @@ -34,7 +34,7 @@ template Facet_vector; typedef typename std::vector Cell_vector; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; public: typedef SizingField Sizing_field; @@ -66,8 +66,8 @@ class Odt_move // Compute move const Tr& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Construct_vector_3 vector = tr.geom_traits().construct_vector_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_vector_3 vector = tr.geom_traits().construct_vector_3_object(); Vector_3 move = CGAL::NULL_VECTOR; FT sum_volume(0); @@ -117,8 +117,8 @@ class Odt_move const Tr& tr, const Sizing_field& sizing_field) const { - typename Gt::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); - typename Gt::Compute_volume_3 volume = tr.geom_traits().compute_volume_3_object(); + typename GT::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); + typename GT::Compute_volume_3 volume = tr.geom_traits().compute_volume_3_object(); Bare_point c = centroid(tr.tetrahedron(cell)); FT s = sizing_field(c, std::make_pair(cell, true)); @@ -195,8 +195,8 @@ class Odt_move // const Tr& tr, // const Sizing_field& sizing_field) const // { -// typename Gt::Compute_area_3 area = tr.geom_traits().compute_area_3_object(); -// typename Gt::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); +// typename GT::Compute_area_3 area = tr.geom_traits().compute_area_3_object(); +// typename GT::Construct_centroid_3 centroid = tr.geom_traits().construct_centroid_3_object(); // // Bare_point c = centroid(tr.triangle(facet)); // FT s = sizing_field(c, facet.first->vertex(0)); @@ -211,9 +211,9 @@ class Odt_move // const Tr& tr, // const Sizing_field& sizing_field) const // { -// typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); -// typename Gt::Construct_midpoint_3 midpoint = tr.geom_traits().construct_midpoint_3_object(); -// typename Gt::Compute_squared_distance_3 sq_distance = tr.geom_traits().compute_squared_distance_3_object(); +// typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); +// typename GT::Construct_midpoint_3 midpoint = tr.geom_traits().construct_midpoint_3_object(); +// typename GT::Compute_squared_distance_3 sq_distance = tr.geom_traits().compute_squared_distance_3_object(); // // const Weighted_point& wp1 = tr.point(cell, vertex_index_1); // const Weighted_point& wp2 = tr.point(cell, vertex_index_2); @@ -251,8 +251,8 @@ class Odt_move // // Vector_3 normal_outside(const Facet& f, const C3T3& c3t3) const // { -// typename Gt::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); -// typename Gt::Construct_normal_3 normal = c3t3.triangulation().geom_traits().construct_normal_3_object(); +// typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); +// typename GT::Construct_normal_3 normal = c3t3.triangulation().geom_traits().construct_normal_3_object(); // // const Cell_handle& cell = f.first; // const int& i = f.second; diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 3bd65976493f..197b71916fe9 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -118,8 +118,8 @@ class Protect_edges_sizing_field typedef typename Tr::Weighted_point Weighted_point; typedef typename Weighted_point::Weight Weight; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename C3T3::Cell_handle Cell_handle; typedef typename C3T3::Vertex_handle Vertex_handle; @@ -394,7 +394,7 @@ class Protect_edges_sizing_field /// Returns the radius of the ball of vertex `v`. FT get_radius(const Vertex_handle& v) const { - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = c3t3_.triangulation().geom_traits().compute_weight_3_object(); const Weighted_point& v_wp = c3t3_.triangulation().point(v); @@ -643,7 +643,7 @@ insert_point(const Bare_point& p, const Weight& w, int dim, const Index& index, // Insert point CGAL_assertion_code(size_type nb_vertices_before = c3t3_.triangulation().number_of_vertices()); - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object(); const Weighted_point wp = cwp(p,w*weight_modifier); @@ -712,13 +712,13 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, #endif const Tr& tr = c3t3_.triangulation(); - typename Gt::Compute_squared_distance_3 sq_distance = + typename GT::Compute_squared_distance_3 sq_distance = tr.geom_traits().compute_squared_distance_3_object(); - typename Gt::Compare_weighted_squared_radius_3 cwsr = + typename GT::Compare_weighted_squared_radius_3 cwsr = tr.geom_traits().compare_weighted_squared_radius_3_object(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = tr.geom_traits().construct_weighted_point_3_object(); bool add_handle_to_unchecked = false; // add or not the new vertex to the set 'unchecked_vertices' @@ -972,7 +972,7 @@ insert_balls_on_edges() } else { - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object(); // Even if the curve is a cycle, it can intersect other curves at @@ -1026,7 +1026,7 @@ typename Protect_edges_sizing_field::Vertex_handle Protect_edges_sizing_field:: get_vertex_corner_from_point(const Bare_point& p, const Index&) const { - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object(); // Get vertex_handle associated to corner (dim=0) point @@ -1470,13 +1470,13 @@ bool Protect_edges_sizing_field:: do_balls_intersect(const Vertex_handle& va, const Vertex_handle& vb) const { - typename Gt::Construct_sphere_3 sphere = + typename GT::Construct_sphere_3 sphere = c3t3_.triangulation().geom_traits().construct_sphere_3_object(); - typename Gt::Do_intersect_3 do_intersect = + typename GT::Do_intersect_3 do_intersect = c3t3_.triangulation().geom_traits().do_intersect_3_object(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = c3t3_.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = c3t3_.triangulation().geom_traits().compute_weight_3_object(); const Weighted_point& wa = c3t3_.triangulation().point(va); @@ -1516,7 +1516,7 @@ change_ball_size(const Vertex_handle& v, const FT squared_size, const bool speci } // Store point data - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = c3t3_.triangulation().geom_traits().construct_point_3_object(); Index index = c3t3_.index(v); @@ -1535,7 +1535,7 @@ change_ball_size(const Vertex_handle& v, const FT squared_size, const bool speci // Change v size c3t3_.triangulation().remove(v); - CGAL_assertion_code(typename Gt::Construct_weighted_point_3 cwp = + CGAL_assertion_code(typename GT::Construct_weighted_point_3 cwp = c3t3_.triangulation().geom_traits().construct_weighted_point_3_object();) CGAL_assertion_code(const Weighted_point wp = cwp(p,w);) CGAL_assertion_code(Tr& tr = c3t3_.triangulation()); @@ -1724,9 +1724,9 @@ is_sampling_dense_enough(const Vertex_handle& v1, const Vertex_handle& v2, using CGAL::Mesh_3::internal::min_intersection_factor; CGAL_precondition(c3t3_.curve_index(v1,v2) == curve_index); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = c3t3_.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = c3t3_.triangulation().geom_traits().compute_weight_3_object(); // Get sizes diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index ded63f9b139a..06f3d16139be 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -244,10 +244,10 @@ class Refine_facets_3_base typedef typename Tr::Cell_handle Cell_handle; typedef typename Triangulation_mesher_level_traits_3::Zone Zone; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::Segment_3 Segment_3; - typedef typename Gt::Ray_3 Ray_3; - typedef typename Gt::Line_3 Line_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::Segment_3 Segment_3; + typedef typename GT::Ray_3 Ray_3; + typedef typename GT::Line_3 Line_3; public: Refine_facets_3_base(Tr& tr, Complex3InTriangulation3& c3t3, @@ -892,8 +892,8 @@ class Refine_facets_3 typedef typename Tr::Cell_handle Cell_handle; typedef typename MeshDomain::Surface_patch_index Surface_patch_index; typedef typename MeshDomain::Index Index; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::Ray_3 Ray_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::Ray_3 Ray_3; private: // Disabled copy constructor @@ -1628,11 +1628,11 @@ compute_facet_properties(const Facet& facet, typedef typename MD::Intersection Intersection; // Functor - typename Gt::Is_degenerate_3 is_degenerate = + typename GT::Is_degenerate_3 is_degenerate = r_tr_.geom_traits().is_degenerate_3_object(); - typename Gt::Compare_xyz_3 compare_xyz = + typename GT::Compare_xyz_3 compare_xyz = r_tr_.geom_traits().compare_xyz_3_object(); - typename Gt::Construct_segment_3 construct_segment = + typename GT::Construct_segment_3 construct_segment = r_tr_.geom_traits().construct_segment_3_object(); #ifndef CGAL_MESH_3_NO_LONGER_CALLS_DO_INTERSECT_3 typename MD::Do_intersect_surface do_intersect_surface = @@ -1752,13 +1752,13 @@ Refine_facets_3_base:: is_encroached_facet_refinable(Facet& facet) const { typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; - typename Gt::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = + typename GT::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = r_tr_.geom_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = r_tr_.geom_traits().compute_weight_3_object(); - typename Gt::Compare_weighted_squared_radius_3 compare = + typename GT::Compare_weighted_squared_radius_3 compare = r_tr_.geom_traits().compare_weighted_squared_radius_3_object(); const Cell_handle& c = facet.first; diff --git a/Mesh_3/include/CGAL/Mesh_3/Sizing_grid.h b/Mesh_3/include/CGAL/Mesh_3/Sizing_grid.h index 9fe82752715c..ac261599db87 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Sizing_grid.h +++ b/Mesh_3/include/CGAL/Mesh_3/Sizing_grid.h @@ -31,12 +31,12 @@ namespace CGAL { namespace Mesh_3 { -template +template class Sizing_grid_node { public: - typedef typename Gt::Point_3 Point; - typedef typename Gt::FT FT; + typedef typename GT::Point_3 Point; + typedef typename GT::FT FT; FT m_init_size; FT m_size; @@ -108,14 +108,14 @@ template class Sizing_grid { public: - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Bare_point Bare_point; - typedef typename Gt::Vector_3 Vector; - typedef Sizing_grid_node Node; + typedef typename GT::Vector_3 Vector; + typedef Sizing_grid_node Node; typedef typename std::pair Constraint; private: diff --git a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h index 87a0416f7b32..875ea6983788 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h +++ b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h @@ -317,8 +317,8 @@ class Sliver_perturber_base { protected: typedef typename Tr::Vertex_handle Vertex_handle; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename std::vector Bad_vertices_vector; typedef typename Tr::Lock_data_structure Lock_data_structure; @@ -345,8 +345,8 @@ class Sliver_perturber_base { protected: typedef typename Tr::Vertex_handle Vertex_handle; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename tbb::concurrent_vector Bad_vertices_vector; typedef typename Tr::Lock_data_structure Lock_data_structure; @@ -437,7 +437,7 @@ class Sliver_perturber typename C3T3::Triangulation, Concurrency_tag> Base; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Cell_handle Cell_handle; typedef typename Base::Vertex_handle Vertex_handle; @@ -450,7 +450,7 @@ class Sliver_perturber typedef typename std::vector Vertex_vector; typedef typename Base::Bad_vertices_vector Bad_vertices_vector; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; // Helper typedef class C3T3_helpers C3T3_helpers; @@ -1261,7 +1261,7 @@ perturb_vertex( PVertex pv , bool *could_lock_zone ) const { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); #ifdef CGAL_CONCURRENT_MESH_3_PROFILING static Profile_branch_counter_3 bcounter( diff --git a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h index 03eb91e812b5..cbe8056b23a0 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h +++ b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h @@ -107,8 +107,8 @@ class Slivers_exuder_base typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::vector Cell_vector; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename std::vector Bad_vertices_vector; typedef typename Tr::Lock_data_structure Lock_data_structure; @@ -197,8 +197,8 @@ class Slivers_exuder_base typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::vector Cell_vector; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename tbb::concurrent_vector Bad_vertices_vector; typedef typename Tr::Lock_data_structure Lock_data_structure; @@ -353,9 +353,9 @@ class Slivers_exuder typedef typename Base::Queue_value_type Queue_value_type; typedef typename Base::Cell_vector Cell_vector; - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Base::FT FT; - typedef typename Gt::Tetrahedron_3 Tetrahedron_3; + typedef typename GT::Tetrahedron_3 Tetrahedron_3; typedef typename C3T3::Cells_in_complex_iterator Cell_iterator; typedef std::vector Facet_vector; @@ -1045,14 +1045,14 @@ pump_vertex(const Vertex_handle& pumped_vertex, if (could_lock_zone && *could_lock_zone == false) return false; - typename Gt::Compare_weighted_squared_radius_3 compare_sq_radius = + typename GT::Compare_weighted_squared_radius_3 compare_sq_radius = tr_.geom_traits().compare_weighted_squared_radius_3_object(); // If best_weight <= pumped_vertex weight, nothing to do const Weighted_point& pumped_vertex_wp = tr_.point(pumped_vertex); if ( compare_sq_radius(pumped_vertex_wp, - best_weight) == CGAL::LARGER ) // best_weight > v's weight { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); const Weighted_point& pwp = tr_.point(pumped_vertex); Weighted_point wp(cp(pwp), best_weight); @@ -1115,8 +1115,8 @@ expand_prestar(const Cell_handle& cell_to_add, Pre_star& pre_star, Sliver_values& criterion_values) const { - typename Gt::Compute_weight_3 cw = tr_.geom_traits().compute_weight_3_object(); - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Compute_weight_3 cw = tr_.geom_traits().compute_weight_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); // Delete first facet of pre_star Facet start_facet = pre_star.front()->second; @@ -1332,13 +1332,13 @@ get_best_weight(const Vertex_handle& v, bool *could_lock_zone) const } // end while(... can pump...) #ifdef CGAL_MESH_3_DEBUG_SLIVERS_EXUDER - typename Gt::Compare_weighted_squared_radius_3 compare_sq_radius = + typename GT::Compare_weighted_squared_radius_3 compare_sq_radius = tr_.geom_traits().compare_weighted_squared_radius_3_object(); const Weighted_point& vwp = tr_.point(v); if ( compare_sq_radius(vwp, - best_weight) == CGAL::LARGER ) // best_weight > v's weight { - typename Gt::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr_.geom_traits().construct_point_3_object(); const Weighted_point& wpv = tr_.point(v); Weighted_point wp(cp(wpv), best_weight); check_pre_star(pre_star_copy, wp, v); diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangle_accessor_primitive.h b/Mesh_3/include/CGAL/Mesh_3/Triangle_accessor_primitive.h index a3436fbdb919..a5a132329093 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangle_accessor_primitive.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangle_accessor_primitive.h @@ -24,13 +24,13 @@ namespace CGAL { namespace Mesh_3 { -template +template class Triangle_accessor_primitive { public: typedef typename TriangleAccessor::Triangle_handle Id; - typedef typename Gt::Triangle_3 Datum; - typedef typename Gt::Point_3 Point; + typedef typename GT::Triangle_3 Datum; + typedef typename GT::Point_3 Point; Triangle_accessor_primitive(const Id& h) : handle_(h) {} @@ -55,15 +55,15 @@ class Triangle_accessor_primitive Id handle_; }; -//template -//class Triangle_accessor_primitive,Gt>, Gt> +//template +//class Triangle_accessor_primitive,GT>, GT> //{ -// typedef class Triangle_accessor,Gt> Triangle_accessor; +// typedef class Triangle_accessor,GT> Triangle_accessor; // //public: // typedef typename Triangle_accessor::Triangle_iterator Id; -// typedef typename Gt::Triangle_3 Datum; -// typedef typename Gt::Point_3 Point; +// typedef typename GT::Triangle_3 Datum; +// typedef typename GT::Point_3 Point; // // Triangle_accessor_primitive(const Id& h) // : handle_(h) {} diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h index 7de442b25fbb..644cdc5399f3 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h @@ -43,17 +43,17 @@ namespace Mesh_3 { template class Triangulation_helpers { - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; // If `Tr` is not a triangulation that has defined Bare_point, // use Point_3 as defined in the traits class. typedef typename boost::mpl::eval_if_c< CGAL::internal::Has_nested_type_Bare_point::value, typename CGAL::internal::Bare_point_type, - boost::mpl::identity + boost::mpl::identity >::type Bare_point; // 'Point' is either a bare point or a weighted point, depending on the triangulation. @@ -190,7 +190,7 @@ no_topological_change(Tr& tr, if(std::is_same::value) return false; - typename Gt::Construct_opposite_vector_3 cov = + typename GT::Construct_opposite_vector_3 cov = tr.geom_traits().construct_opposite_vector_3_object(); bool np = true; @@ -382,7 +382,7 @@ inside_protecting_balls(const Tr& tr, const Vertex_handle v, const Bare_point& p) const { - typename Gt::Compare_weighted_squared_radius_3 cwsr = + typename GT::Compare_weighted_squared_radius_3 cwsr = tr.geom_traits().compare_weighted_squared_radius_3_object(); Vertex_handle nv = tr.nearest_power_vertex(p, v->cell()); @@ -416,8 +416,8 @@ get_sq_distance_to_closest_vertex(const Tr& tr, // There is no need to use tr.min_squared_distance() here because we are computing // distances between 'v' and a neighbor within their common cell, which means // that even if we are using a periodic triangulation, the distance is correctly computed. - typename Gt::Compute_squared_distance_3 csqd = tr.geom_traits().compute_squared_distance_3_object(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Compute_squared_distance_3 csqd = tr.geom_traits().compute_squared_distance_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); Vertex_container treated_vertices; FT min_sq_dist = std::numeric_limits::infinity(); @@ -477,8 +477,8 @@ get_sq_distance_to_closest_vertex(const Tr& tr, // There is no need to use tr.min_squared_distance() here because we are computing // distances between 'v' and a neighbor within their common cell, which means // that even if we are using a periodic triangulation, the distance is correctly computed. - typename Gt::Compute_squared_distance_3 csqd = tr.geom_traits().compute_squared_distance_3_object(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Compute_squared_distance_3 csqd = tr.geom_traits().compute_squared_distance_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); Vertex_container treated_vertices; FT min_sq_dist = std::numeric_limits::infinity(); @@ -524,9 +524,9 @@ Triangulation_helpers:: well_oriented(const Tr& tr, const Cell_vector& cells_tos) const { - typedef typename Tr::Geom_traits Gt; - typename Gt::Orientation_3 orientation = tr.geom_traits().orientation_3_object(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typedef typename Tr::Geom_traits GT; + typename GT::Orientation_3 orientation = tr.geom_traits().orientation_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); typename Cell_vector::const_iterator it = cells_tos.begin(); for( ; it != cells_tos.end() ; ++it) @@ -570,9 +570,9 @@ well_oriented(const Tr& tr, const Cell_vector& cells_tos, const Point_getter& pg) const { - typedef typename Tr::Geom_traits Gt; - typename Gt::Orientation_3 orientation = tr.geom_traits().orientation_3_object(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typedef typename Tr::Geom_traits GT; + typename GT::Orientation_3 orientation = tr.geom_traits().orientation_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); typename Cell_vector::const_iterator it = cells_tos.begin(); for( ; it != cells_tos.end() ; ++it) diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangulation_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Triangulation_sizing_field.h index 547365f9a1e7..aa607e7b088f 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangulation_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangulation_sizing_field.h @@ -43,18 +43,18 @@ template class Triangulation_sizing_field { // Types - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; - typedef Triangulation_vertex_base_with_info_3 Vbb; - typedef Regular_triangulation_vertex_base_3 Vb; - typedef Triangulation_cell_base_3 Cbb; + typedef Triangulation_vertex_base_with_info_3 Vbb; + typedef Regular_triangulation_vertex_base_3 Vb; + typedef Triangulation_cell_base_3 Cbb; typedef Regular_triangulation_cell_base_3< - Gt, Cbb, Discard_hidden_points> Cb; + GT, Cbb, Discard_hidden_points> Cb; typedef Triangulation_data_structure_3 Tds; - typedef Regular_triangulation_3 Compact_triangulation; + typedef Regular_triangulation_3 Compact_triangulation; typedef Compact_triangulation Ctr; typedef typename Tr::Vertex_handle Vertex_handle; @@ -181,8 +181,8 @@ typename Triangulation_sizing_field::FT Triangulation_sizing_field:: interpolate_on_cell_vertices(const Weighted_point& p, const CCell_handle& cell) const { - typename Gt::Construct_point_3 cp = ctr_.geom_traits().construct_point_3_object(); - typename Gt::Compute_volume_3 volume = ctr_.geom_traits().compute_volume_3_object(); + typename GT::Construct_point_3 cp = ctr_.geom_traits().construct_point_3_object(); + typename GT::Compute_volume_3 volume = ctr_.geom_traits().compute_volume_3_object(); // Interpolate value using tet vertices values const FT& va = cell->vertex(0)->info(); @@ -217,8 +217,8 @@ typename Triangulation_sizing_field::FT Triangulation_sizing_field:: interpolate_on_facet_vertices(const Weighted_point& p, const CCell_handle& cell) const { - typename Gt::Construct_point_3 cp = ctr_.geom_traits().construct_point_3_object(); - typename Gt::Compute_area_3 area = ctr_.geom_traits().compute_area_3_object(); + typename GT::Construct_point_3 cp = ctr_.geom_traits().construct_point_3_object(); + typename GT::Compute_area_3 area = ctr_.geom_traits().compute_area_3_object(); // Find infinite vertex and put it in k0 int k0 = 0; diff --git a/Mesh_3/include/CGAL/Mesh_3/Uniform_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Uniform_sizing_field.h index 273ba6b6f372..3e552737ee68 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Uniform_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Uniform_sizing_field.h @@ -27,9 +27,9 @@ namespace Mesh_3 { template class Uniform_sizing_field { - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::FT FT; + typedef typename GT::FT FT; public: // Vertices of mesh triangulation do not need to be updated diff --git a/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h b/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h index d2dfef196e0a..edfef11f0397 100644 --- a/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h +++ b/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h @@ -96,25 +96,25 @@ void initialize_triangulation_from_labeled_image(C3T3& c3t3, TransformOperator transform = CGAL::Identity()) { typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Segment Segment_3; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; - typedef typename Gt::Vector_3 Vector_3; + typedef typename GT::Vector_3 Vector_3; typedef MeshDomain Mesh_domain; Tr& tr = c3t3.triangulation(); - typename Gt::Compare_weighted_squared_radius_3 cwsr = + typename GT::Compare_weighted_squared_radius_3 cwsr = tr.geom_traits().compare_weighted_squared_radius_3_object(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = tr.geom_traits().construct_weighted_point_3_object(); if(protect_features) { diff --git a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h index 5fed977c7ef8..c5a148d78fa8 100644 --- a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h +++ b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h @@ -395,8 +395,8 @@ class Cell_criteria_visitor_with_features typedef Criterion_visitor Base; typedef Cell_criteria_visitor_with_features Self; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; typedef typename Tr::Weighted_point Weighted_point; @@ -414,11 +414,11 @@ class Cell_criteria_visitor_with_features , ratio_(0) , size_ratio_(0.5*0.5*4.) { - typename Gt::Compare_weighted_squared_radius_3 compare = + typename GT::Compare_weighted_squared_radius_3 compare = tr.geom_traits().compare_weighted_squared_radius_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = tr.geom_traits().compute_weight_3_object(); - typename Gt::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = + typename GT::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = tr.geom_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); int k1 = 0; @@ -560,8 +560,8 @@ class Cell_criterion_visitor_with_radius_lower_bound typedef Cell_criteria_visitor_with_features Base; typedef Cell_criterion_visitor_with_radius_lower_bound Self; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; public: typedef typename Base::Quality Cell_quality; diff --git a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_facet_criteria.h b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_facet_criteria.h index ed57357bda90..4e42d3810054 100644 --- a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_facet_criteria.h +++ b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_facet_criteria.h @@ -102,14 +102,14 @@ class Aspect_ratio_criterion : CGAL_assertion (f.first->is_facet_on_surface(f.second)); CGAL_assertion (B_ != 0); - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Gt::Compute_squared_area_3 Area; - typedef typename Gt::Compute_squared_distance_3 Distance; - typedef typename Gt::Construct_point_3 Construct_point_3; - typedef typename Gt::Construct_triangle_3 Construct_triangle_3; + typedef typename GT::Compute_squared_area_3 Area; + typedef typename GT::Compute_squared_distance_3 Distance; + typedef typename GT::Construct_point_3 Construct_point_3; + typedef typename GT::Construct_triangle_3 Construct_triangle_3; Area area = tr.geom_traits().compute_squared_area_3_object(); Distance distance = tr.geom_traits().compute_squared_distance_3_object(); @@ -127,7 +127,7 @@ class Aspect_ratio_criterion : const FT d12 = distance(p1,p2); const FT d13 = distance(p1,p3); const FT d23 = distance(p2,p3); - const FT min_d123 = details::min_3(d12,d13,d23); + const FT min_d123 = details::min_3(d12,d13,d23); const FT aspect_ratio = 4 * triangle_area * min_d123 / (d12*d13*d23); @@ -193,11 +193,11 @@ class Uniform_curvature_size_criterion : CGAL_assertion(f.first->is_facet_on_surface(f.second)); CGAL_assertion (B_ != 0); - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Bare_point Bare_point; - typename Gt::Construct_weighted_circumcenter_3 weighted_circumcenter = + typename GT::Construct_weighted_circumcenter_3 weighted_circumcenter = tr.geom_traits().construct_weighted_circumcenter_3_object(); const Weighted_point& p1 = tr.point(f.first, (f.second+1)&3); @@ -264,11 +264,11 @@ class Variable_curvature_size_criterion : { CGAL_assertion (f.first->is_facet_on_surface(f.second)); - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Bare_point Bare_point; - typename Gt::Construct_weighted_circumcenter_3 weighted_circumcenter = + typename GT::Construct_weighted_circumcenter_3 weighted_circumcenter = tr.geom_traits().construct_weighted_circumcenter_3_object(); const Weighted_point& p1 = tr.point(f.first, (f.second+1)&3); @@ -346,11 +346,11 @@ class Variable_size_criterion : { CGAL_assertion (f.first->is_facet_on_surface(f.second)); - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); const Weighted_point& wp1 = tr.point(f.first, (f.second+1)&3); const Bare_point& p1 = cp(wp1); @@ -426,11 +426,11 @@ class Uniform_size_criterion : CGAL_assertion (f.first->is_facet_on_surface(f.second)); CGAL_assertion (B_ != 0); - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); const Weighted_point& wp1 = tr.point(f.first, (f.second+1)&3); const Bare_point p1 = cp(wp1); @@ -653,8 +653,8 @@ class Facet_criterion_visitor_with_features typedef Mesh_3::Criterion_visitor Base; typedef Facet_criterion_visitor_with_features Self; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; public: typedef typename Base::Quality Facet_quality; @@ -672,15 +672,15 @@ class Facet_criterion_visitor_with_features , angle_ratio_(0.5*0.5*4.) , size_ratio_(0.4*0.4*4.) { - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Cell_handle Cell_handle; - typename Gt::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = + typename GT::Compute_squared_radius_smallest_orthogonal_sphere_3 sq_radius = tr.geom_traits().compute_squared_radius_smallest_orthogonal_sphere_3_object(); - typename Gt::Compute_weight_3 cw = + typename GT::Compute_weight_3 cw = tr.geom_traits().compute_weight_3_object(); - typename Gt::Compare_weighted_squared_radius_3 compare = + typename GT::Compare_weighted_squared_radius_3 compare = tr.geom_traits().compare_weighted_squared_radius_3_object(); const Cell_handle& c = fh.first; @@ -817,8 +817,8 @@ class Facet_criterion_visitor_with_radius_lower_bound typedef Facet_criterion_visitor_with_features Base; typedef Facet_criterion_visitor_with_radius_lower_bound Self; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; public: typedef typename Base::Quality Facet_quality; diff --git a/Mesh_3/include/CGAL/Mesh_3/sliver_criteria.h b/Mesh_3/include/CGAL/Mesh_3/sliver_criteria.h index 335bd89291c1..6ecabd1aa906 100644 --- a/Mesh_3/include/CGAL/Mesh_3/sliver_criteria.h +++ b/Mesh_3/include/CGAL/Mesh_3/sliver_criteria.h @@ -36,9 +36,9 @@ template Base; typedef typename Base::Tetrahedron_3 Tetrahedron_3; typedef typename Base::Cell_vector Cell_vector; - typedef typename Base::Gt Gt; + typedef typename Base::GT GT; public: typedef typename Base::Cell_handle Cell_handle; @@ -163,7 +163,7 @@ class Radius_ratio_criterion { protected: typedef Sliver_criterion Base; - typedef typename Base::Gt Gt; + typedef typename Base::GT GT; typedef typename Base::Tetrahedron_3 Tetrahedron_3; typedef typename Base::Cell_vector Cell_vector; typedef Radius_ratio_criterion RR_criterion; diff --git a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h index 1b1e53c93052..d33523015da0 100644 --- a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h +++ b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h @@ -115,13 +115,13 @@ typename Tr::Geom_traits::FT edge_sq_length(const typename Tr::Edge& e, const Tr& tr) { - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Compute_squared_distance_3 sq_distance = + typename GT::Compute_squared_distance_3 sq_distance = tr.geom_traits().compute_squared_distance_3_object(); const Weighted_point& wp = tr.point(e.first, e.second); @@ -390,9 +390,9 @@ class Gradient_based_perturbation typedef typename Base::Cell_handle Cell_handle; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -447,15 +447,15 @@ class Gradient_based_perturbation const Tr& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = tr.geom_traits().construct_weighted_point_3_object(); - typename Gt::Compute_squared_length_3 sq_length = + typename GT::Compute_squared_length_3 sq_length = tr.geom_traits().compute_squared_length_3_object(); - typename Gt::Construct_translated_point_3 translate = + typename GT::Construct_translated_point_3 translate = tr.geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_vector_3 vector = + typename GT::Construct_vector_3 vector = tr.geom_traits().construct_vector_3_object(); // create a helper @@ -548,9 +548,9 @@ class Sq_radius_perturbation typedef typename Base::Vertex_handle Vertex_handle; typedef typename Base::Cell_handle Cell_handle; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -650,9 +650,9 @@ class Sq_radius_perturbation { const Triangulation& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Construct_translated_point_3 translate = + typename GT::Construct_translated_point_3 translate = c3t3.triangulation().geom_traits().construct_translated_point_3_object(); unsigned int index = cell->index(v); @@ -724,9 +724,9 @@ class Volume_perturbation typedef typename Base::Cell_handle Cell_handle; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -827,7 +827,7 @@ class Volume_perturbation CGAL_precondition(cell->has_vertex(v)); const typename C3T3::Triangulation& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); const int i = cell->index(v); @@ -875,9 +875,9 @@ class Dihedral_angle_perturbation typedef typename Base::Cell_handle Cell_handle; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -979,9 +979,9 @@ class Dihedral_angle_perturbation CGAL_assertion(cell->has_vertex(v)); const typename C3T3::Triangulation& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Compute_squared_distance_3 sq_distance = + typename GT::Compute_squared_distance_3 sq_distance = tr.geom_traits().compute_squared_distance_3_object(); const int i = cell->index(v); @@ -1041,9 +1041,9 @@ class Dihedral_angle_perturbation { const typename C3T3::Triangulation& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Compute_approximate_dihedral_angle_3 approx_dihedral_angle = + typename GT::Compute_approximate_dihedral_angle_3 approx_dihedral_angle = tr.geom_traits().compute_approximate_dihedral_angle_3_object(); const Weighted_point& wp1 = tr.point(cell, k1); @@ -1069,7 +1069,7 @@ class Dihedral_angle_perturbation { const typename C3T3::Triangulation& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); int k1 = (i+1)&3; int k2 = (i+2)&3; @@ -1108,9 +1108,9 @@ class Random_based_perturbation typedef typename Base::Cell_handle Cell_handle; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; @@ -1171,7 +1171,7 @@ class Random_based_perturbation Vector_3 random_vector_fixed_size(const C3T3& c3t3, const FT& vector_sq_size) const { - typename Gt::Compute_squared_length_3 sq_length = + typename GT::Compute_squared_length_3 sq_length = c3t3.triangulation().geom_traits().compute_squared_length_3_object(); Vector_3 rnd_vector(random_ft(),random_ft(),random_ft()); @@ -1236,9 +1236,9 @@ class Li_random_perturbation typedef typename Base::Cell_handle Cell_handle; typedef typename C3T3::Triangulation Tr; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; - typedef typename Gt::Vector_3 Vector_3; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; + typedef typename GT::Vector_3 Vector_3; typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; @@ -1313,13 +1313,13 @@ class Li_random_perturbation { typedef Triangulation_helpers Th; - typename Gt::Construct_point_3 cp = + typename GT::Construct_point_3 cp = c3t3.triangulation().geom_traits().construct_point_3_object(); - typename Gt::Construct_weighted_point_3 cwp = + typename GT::Construct_weighted_point_3 cwp = c3t3.triangulation().geom_traits().construct_weighted_point_3_object(); - typename Gt::Construct_translated_point_3 translate = + typename GT::Construct_translated_point_3 translate = c3t3.triangulation().geom_traits().construct_translated_point_3_object(); - typename Gt::Construct_vector_3 vector = + typename GT::Construct_vector_3 vector = c3t3.triangulation().geom_traits().construct_vector_3_object(); modified_vertices.clear(); diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index a4f81ce18124..4014f13835c2 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -452,7 +452,7 @@ class Polyline }; // end class Polyline -template +template struct Mesh_domain_segment_of_curve_primitive{ typedef typename std::iterator_traits::value_type Map_value_type; typedef typename Map_value_type::first_type Curve_id; @@ -464,7 +464,7 @@ struct Mesh_domain_segment_of_curve_primitive{ typedef typename std::iterator_traits< typename Polyline::const_iterator>::value_type Point; - typedef typename Gt::Segment_3 Datum; + typedef typename GT::Segment_3 Datum; Id id_; @@ -844,17 +844,17 @@ class Mesh_domain_with_polyline_features_3 private: typedef std::map Corners; - typedef Mesh_3::internal::Polyline Polyline; + typedef Mesh_3::internal::Polyline Polyline; typedef std::map Edges; typedef std::map Edges_incidences; typedef std::map > Corners_tmp_incidences; typedef std::map Corners_incidences; typedef Mesh_3::internal::Mesh_domain_segment_of_curve_primitive< - Gt, + GT, typename Edges::const_iterator> Curves_primitives; - typedef CGAL::AABB_traits AABB_curves_traits; Corners corners_; diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index e7f3c4fa983b..cbaf1add1119 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -97,15 +97,13 @@ provides a bound for the size criterion. \sa `MeshCriteria_3` \sa `CGAL::Mesh_criteria_3` \sa `MeshDomainField_3` - */ - template < typename Tr > class Mesh_edge_criteria_3 { private: typedef Mesh_edge_criteria_3 Self; - typedef typename Tr::Geom_traits Gt; + typedef typename Tr::Geom_traits GT; public: @@ -140,7 +138,7 @@ class Mesh_edge_criteria_3 const FT& min_length_bound = 0) : p_size_(new Mesh_3::internal::Sizing_field_container< - Mesh_constant_domain_field_3 , + Mesh_constant_domain_field_3 , FT, Point_3, Index>(length_bound)) diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index ee7d53ab7105..3f3ca673523e 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -131,7 +131,7 @@ type to be used for the 3D triangulation embedding the mesh. \tparam MD must be a model of `MeshDomain_3`. -\tparam Gt must be a model of `MeshTriangulationTraits_3` or `Default` +\tparam GT must be a model of `MeshTriangulationTraits_3` or `Default` and defaults to `Kernel_traits::%Kernel`. \tparam Concurrency_tag_ enables sequential versus parallel meshing and optimization algorithms. @@ -144,29 +144,29 @@ and defaults to `Mesh_vertex_base_3`. \tparam Cell_base_ must be a model of `MeshCellBase_3` or `Default` and defaults to `Compact_mesh_cell_base_3`. -\warning To improve the robustness of the meshing process, the input traits `Gt` +\warning To improve the robustness of the meshing process, the input traits `GT` is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`. - The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors + The class `Robust_weighted_circumcenter_filtered_traits_3` upgrades the functors models of `Kernel::ConstructWeightedCircumcenter_3`, `Kernel::ComputeSquaredRadius_3`, and `Kernel::ComputeSquaredRadiusSmallestOrthogonalSphere_3` that are - provided by `Gt` to use exact computations when the geometric configuration - is close to degenerate (e.g. almost coplanar points).
    + provided by `GT` to use exact computations when the geometric configuration + is close to degenerate (e.g. almost coplanar points).

    Users should therefore be aware that the traits class of the triangulation - will have type `Robust_weighted_circumcenter_filtered_traits_3`. + will have type `Robust_weighted_circumcenter_filtered_traits_3`. \sa `make_mesh_3()` \sa `Mesh_complex_3_in_triangulation_3` */ template struct Mesh_triangulation_3 { private: - using K = typename Default::Lazy_get >::type; + using K = typename Default::Lazy_get >::type; using Geom_traits = typename details::Mesh_geom_traits_generator::type; diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 4dc89cf407ec..6d50190ac98f 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -79,25 +79,25 @@ max_length(const Bbox_3& b) // ----------------------------------- // Geometric traits generator // ----------------------------------- -template < typename Gt, +template < typename GT, typename Use_exact_intersection_construction_tag > struct IGT_generator {}; -template < typename Gt > -struct IGT_generator +template < typename GT > +struct IGT_generator { #ifdef CGAL_MESH_3_NEW_ROBUST_INTERSECTION_TRAITS - typedef CGAL::Mesh_3::Robust_intersection_traits_3_new type; + typedef CGAL::Mesh_3::Robust_intersection_traits_3_new type; #else // NOT CGAL_MESH_3_NEW_ROBUST_INTERSECTION_TRAITS - typedef CGAL::Mesh_3::Robust_intersection_traits_3 type; + typedef CGAL::Mesh_3::Robust_intersection_traits_3 type; #endif // NOT CGAL_MESH_3_NEW_ROBUST_INTERSECTION_TRAITS typedef type Type; }; -template < typename Gt > -struct IGT_generator +template < typename GT > +struct IGT_generator { - typedef Gt type; + typedef GT type; typedef type Type; }; diff --git a/Mesh_3/test/Mesh_3/test_criteria.cpp b/Mesh_3/test/Mesh_3/test_criteria.cpp index 317fcb5f3e96..a10460ceee22 100644 --- a/Mesh_3/test/Mesh_3/test_criteria.cpp +++ b/Mesh_3/test/Mesh_3/test_criteria.cpp @@ -49,8 +49,8 @@ struct Tester typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Weighted_point Weighted_point; - typedef typename Tr::Geom_traits Gt; - typedef typename Gt::FT FT; + typedef typename Tr::Geom_traits GT; + typedef typename GT::FT FT; C3t3 c3t3_; // Cells & facets diff --git a/Mesh_3/test/Mesh_3/test_mesh_3_issue_1554.cpp b/Mesh_3/test/Mesh_3/test_mesh_3_issue_1554.cpp index fe31c62f6a44..f0371d3a96d3 100644 --- a/Mesh_3/test/Mesh_3/test_mesh_3_issue_1554.cpp +++ b/Mesh_3/test/Mesh_3/test_mesh_3_issue_1554.cpp @@ -24,7 +24,7 @@ typedef CGAL::Parallel_if_available_tag Concurrency_tag; typedef CGAL::Mesh_triangulation_3::type Tr; -typedef Tr::Geom_traits Gt; +typedef Tr::Geom_traits GT; typedef CGAL::Mesh_complex_3_in_triangulation_3(domain, criteria, no_perturb(), no_exude()); - Gt::Construct_weighted_circumcenter_3 w_circumcenter = + GT::Construct_weighted_circumcenter_3 w_circumcenter = c3t3.triangulation().geom_traits().construct_weighted_circumcenter_3_object(); int return_code = 0; diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp index 9a0c5677168f..c44966f9cce9 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp @@ -31,9 +31,9 @@ struct Polyhedron_tester : public Tester { void polyhedron() const { - typedef K Gt; - typedef CGAL::Polyhedron_3 Polyhedron; - typedef CGAL::Polyhedral_mesh_domain_3 Mesh_domain; + typedef K GT; + typedef CGAL::Polyhedron_3 Polyhedron; + typedef CGAL::Polyhedral_mesh_domain_3 Mesh_domain; CGAL_static_assertion((std::is_same< typename Mesh_domain::Surface_patch_index, diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedron_with_features.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedron_with_features.cpp index 5cfdd17ca792..ad3c190e0565 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedron_with_features.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedron_with_features.cpp @@ -75,9 +75,9 @@ struct Polyhedron_with_features_tester : public Tester } void operator()() const { - typedef CGAL::Mesh_3::Robust_intersection_traits_3 Gt; - typedef typename CGAL::Mesh_polyhedron_3::type Polyhedron; - typedef CGAL::Polyhedral_mesh_domain_with_features_3 GT; + typedef typename CGAL::Mesh_polyhedron_3::type Polyhedron; + typedef CGAL::Polyhedral_mesh_domain_with_features_3 Mesh_domain; diff --git a/Mesh_3/test/Mesh_3/test_min_size_criteria.cpp b/Mesh_3/test/Mesh_3/test_min_size_criteria.cpp index 427030c4c701..d42bef33f806 100644 --- a/Mesh_3/test/Mesh_3/test_min_size_criteria.cpp +++ b/Mesh_3/test/Mesh_3/test_min_size_criteria.cpp @@ -37,7 +37,7 @@ struct Image_tester : public Tester Concurrency_tag>::type; using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3; - using Gt = typename Tr::Geom_traits; + using GT = typename Tr::Geom_traits; using FT = typename Tr::Geom_traits::FT; using Bare_point = typename Tr::Bare_point; @@ -79,8 +79,8 @@ struct Image_tester : public Tester CGAL::parameters::no_perturb()); const Tr& tr = c3t3.triangulation(); - typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); - typename Gt::Compute_squared_radius_3 sq_radius = tr.geom_traits().compute_squared_radius_3_object(); + typename GT::Construct_point_3 cp = tr.geom_traits().construct_point_3_object(); + typename GT::Compute_squared_radius_3 sq_radius = tr.geom_traits().compute_squared_radius_3_object(); double max_sq_facet_radius = 0.; double max_sq_cell_radius = 0.; From 97097f1f040472b2fa8b02d778ecb22b55109d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 26 May 2023 13:19:19 +0200 Subject: [PATCH 0313/1398] misc fixes --- Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h | 2 +- .../include/CGAL/Gray_image_mesh_domain_3.h | 8 +- .../Implicit_to_labeling_function_wrapper.h | 38 ++--- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 29 ++-- Mesh_3/include/CGAL/Mesh_cell_base_3.h | 23 +-- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 6 +- .../Mesh_domain_with_polyline_features_3.h | 136 ++++++++--------- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 12 +- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 10 +- Mesh_3/include/CGAL/Mesh_polyhedron_3.h | 18 ++- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 41 +++-- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 87 ++++++----- .../include/CGAL/Polyhedral_mesh_domain_3.h | 64 ++++---- .../Polyhedral_mesh_domain_with_features_3.h | 141 ++++++++++-------- Mesh_3/include/CGAL/Triangle_accessor_3.h | 19 +-- 15 files changed, 318 insertions(+), 316 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h index 68138d36775e..f1b619635db0 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h @@ -41,7 +41,7 @@ and `is_facet_visited(1)` in parallel must be safe) Moreover, the parallel algorithms require an erase counter in each cell (see below). -\cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible} +\cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3} \cgalHasModel `CGAL::Compact_mesh_cell_base_3` \cgalHasModel `CGAL::Mesh_cell_base_3` diff --git a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h index 44e555b90278..cb5f6cc262f3 100644 --- a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h @@ -67,7 +67,6 @@ with a model of the concept `BisectionGeometricTraits_3`. \tparam Image_word_type is the data type encoded in the `Image` input file - \cgalModels `MeshDomain_3` \sa `BisectionGeometricTraits_3` @@ -149,13 +148,12 @@ Gray_image_mesh_domain_3 CGAL_assertion(transform(value_outside) == 0); } - /// Destructor + // Destructor virtual ~Gray_image_mesh_domain_3() {} -}; // end class Gray_image_mesh_domain_3 +}; -} // end namespace CGAL +} // namespace CGAL #include - #endif // CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index 8c1c880cb708..c57f4e4d3b38 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -157,15 +157,17 @@ For example, the multidomain described by the three functions [f1,f2,f3] and the The first one matches the locus of points satisfying f1(p)<0 and f2(p)<0 and f3(p)>0.
    The second one matches the locus of points satisfying f1(p)>0 and f2(p)<0 and f3(p)>0.
    -\tparam ImplicitFunction provides the definition of the function. +\tparam Function provides the definition of the function. This parameter stands for a model of the concept `ImplicitFunction` described in the surface mesh generation package. -The number types `ImplicitFunction::FT` and `BGT::FT` are required to match. +The number types `Function::FT` and `BGT::FT` are required to match. \sa `CGAL::Labeled_mesh_domain_3`. - */ - +#ifdef DOXYGEN_RUNNING +template +#else template +#endif class Implicit_multi_domain_to_labeling_function_wrapper { template @@ -184,20 +186,20 @@ class Implicit_multi_domain_to_labeling_function_wrapper }; public: - typedef int return_type; - typedef ImplicitFunction Function; - typedef typename Implicit_function_traits::Point Point_3; - /// \name Types /// @{ - //! - typedef std::vector Function_vector; + #ifdef DOXYGEN_RUNNING - //! - typedef typename Function::Point Point_3; + typedef typename Function::Point Point_3; +#else + typedef ImplicitFunction Function; + typedef typename Implicit_function_traits::Point Point_3; + typedef int return_type; #endif - /// @} + typedef std::vector Function_vector; + + /// @} private: std::vector funcs; @@ -205,15 +207,15 @@ class Implicit_multi_domain_to_labeling_function_wrapper std::vector bmasks; public: - - /// \name Creation /// @{ /*! * \brief Construction from a vector of implicit functions and a vector of vector of signs. + * * \param implicit_functions the vector of implicit functions. * \param position_vectors the vector of vector of signs. Each vector of positions describes a component. + * * \sa `Sign` */ Implicit_multi_domain_to_labeling_function_wrapper (const Function_vector& implicit_functions, const std::vector >& position_vectors) @@ -246,6 +248,7 @@ class Implicit_multi_domain_to_labeling_function_wrapper } /*! * \brief Construction from a vector of implicit functions. + * \param implicit_functions the vector of implicit functions. * * Position vectors are built automatically so that the union of components equals the union of the functions. @@ -278,6 +281,7 @@ class Implicit_multi_domain_to_labeling_function_wrapper /*! * \brief Construction from a vector of implicit functions and a vector of strings. + * * \param implicit_functions the vector of implicit functions. * \param position_strings the vector of strings. The strings contained in this vector must contain '+' or '-' only. Each string (vector of positions) describes a component. */ @@ -337,9 +341,7 @@ class Implicit_multi_domain_to_labeling_function_wrapper } }; -} // end namespace CGAL - - +} // end namespace CGAL #if defined(BOOST_MSVC) # pragma warning(pop) diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 3782f9d46f47..b273da9af2e3 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -336,7 +336,9 @@ Let `p` be a Point. `CGAL::Implicit_multi_domain_to_labeling_function_wrapper` is a good candidate for this template parameter if there are several components to mesh. -The function type can be any model of the concept `Callable` compatible with the signature `Subdomain_index(const Point_3&)`: it can be a function, a function object, a lambda expression... that takes a `%Point_3` as argument, and returns a type convertible to `Subdomain_index`. +The function type can be any model of the concept `Callable` compatible with the signature +`Subdomain_index(const %Point_3&)`: it can be a function, a function object, a lambda expression... +that takes a `%Point_3` as argument, and returns a type convertible to `Subdomain_index`. \cgalModels `MeshDomain_3` @@ -350,9 +352,9 @@ template > class Labeled_mesh_domain_3 #ifndef DOXYGEN_RUNNING -: protected details::Labeled_mesh_domain_3_impl + : protected details::Labeled_mesh_domain_3_impl #endif { public: @@ -381,7 +383,7 @@ class Labeled_mesh_domain_3 /// The number type (a field type) of the geometric traits class typedef typename Geom_traits::FT FT; ///@} -#else +#else // DOXYGEN_RUNNING typedef boost::optional Subdomain; // Type of indexes for cells of the input complex @@ -428,7 +430,7 @@ class Labeled_mesh_domain_3 typedef typename BGT::FT FT; typedef BGT Geom_traits; using Impl_details::construct_pair_functor; -#endif +#endif // DOXYGEN_RUNNING /// \name Creation /// @{ @@ -451,16 +453,19 @@ class Labeled_mesh_domain_3 * \cgalParamDefault{FT(1e-3)} * \cgalParamNEnd * \cgalNamedParamsEnd + * * \cgalHeading{Example} * From the example (\ref Mesh_3/mesh_implicit_domains_2.cpp): * \snippet Mesh_3/mesh_implicit_domains_2.cpp Domain creation - * */ template Labeled_mesh_domain_3(const Function& function, const Bounding_object& bounding_object, - const CGAL_NP_CLASS& np = parameters::default_values(), - typename std::enable_if>::type* = nullptr) + const CGAL_NP_CLASS& np = parameters::default_values() +#ifndef DOXYGEN_RUNNING + , typename std::enable_if>::type* = nullptr +#endif // DOXYGEN_RUNNING + ) :Impl_details(function, bounding_object, parameters::choose_parameter(parameters::get_parameter(np, internal_np::error_bound), FT(1e-3)), @@ -496,7 +501,7 @@ class Labeled_mesh_domain_3 template #if !defined(BOOST_MSVC) CGAL_DEPRECATED -#endif +#endif // BOOST_MSVC Labeled_mesh_domain_3(const Function& function, const Bounding_object& bounding_object, double error_bound, @@ -505,8 +510,8 @@ class Labeled_mesh_domain_3 bounding_object, parameters::relative_error_bound(error_bound)) {} -#endif -#endif +#endif // CGAL_NO_DEPRECATED_CODE +#endif // DOXYGEN_RUNNING /// \name Creation of domains from 3D images /// @{ diff --git a/Mesh_3/include/CGAL/Mesh_cell_base_3.h b/Mesh_3/include/CGAL/Mesh_cell_base_3.h index 787124c3ec75..14f18f4a09bd 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_base_3.h @@ -125,15 +125,14 @@ of the concept `RegularTriangulationCellBaseWithWeightedCircumcenter_3` and defa \sa `CGAL::Compact_mesh_cell_base_3` */ -template< class GT, - class MD, - class Cb= CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3< - GT, CGAL::Regular_triangulation_cell_base_3 > > +template > > class Mesh_cell_base_3 -: public Mesh_3::Mesh_surface_cell_base_3 #ifndef DOXYGEN_RUNNING -, public Mesh_cell_base_3_base< - typename Mesh_3::Mesh_surface_cell_base_3::Tds::Concurrency_tag> + : public Mesh_3::Mesh_surface_cell_base_3, + public Mesh_cell_base_3_base::Tds::Concurrency_tag> #endif { typedef typename GT::FT FT; @@ -163,7 +162,6 @@ class Mesh_cell_base_3 typedef Mesh_cell_base_3 Other; }; - // Constructors Mesh_cell_base_3() : Base() , subdomain_index_() @@ -225,6 +223,9 @@ class Mesh_cell_base_3 bool is_cache_valid() const { return sliver_cache_validity_; } void reset_cache_validity() const { sliver_cache_validity_ = false; } + /// \name I/O + ///@{ + static std::string io_signature() { @@ -233,6 +234,8 @@ class Mesh_cell_base_3 + Get_io_signature()(); } + /// @} + #ifdef CGAL_INTRUSIVE_LIST public: Cell_handle next_intrusive() const { return next_intrusive_; } @@ -248,8 +251,9 @@ class Mesh_cell_base_3 } #endif // CGAL_INTRUSIVE_LIST - /// For the determinism of Compact_container iterators + /// \name Determinism ///@{ + typedef Tag_true Has_timestamp; std::size_t time_stamp() const { @@ -258,6 +262,7 @@ class Mesh_cell_base_3 void set_time_stamp(const std::size_t& ts) { time_stamp_ = ts; } + ///@} private: diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index eab9f7944409..b13a99555211 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -44,9 +44,7 @@ and a sizing field which may be a uniform or variable field. \sa `MeshCriteria_3` \sa `CGAL::Mesh_criteria_3` \sa `CGAL::make_mesh_3()` - */ - template @@ -63,6 +61,8 @@ class Mesh_cell_criteria_3 */ typedef typename Tr::Geom_traits::FT FT; + /// @} + typedef Visitor_ Visitor; typedef typename Visitor::Cell_quality Cell_quality; typedef typename Visitor::Is_cell_bad Is_cell_bad; @@ -75,8 +75,6 @@ class Mesh_cell_criteria_3 typedef Mesh_cell_criteria_3 Self; - /// @} - public: /// \name Creation diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 4014f13835c2..a8cfa8a26108 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -62,7 +62,7 @@ class Polyline Polyline() {} ~Polyline() {} - /// Add a point at the end of the polyline + /// adds a point at the end of the polyline void add_point(const Point_3& p) { if( points_.empty() || p != end_point() ) { @@ -70,27 +70,27 @@ class Polyline } } - /// Returns the starting point of the polyline + /// returns the starting point of the polyline const Point_3& start_point() const { CGAL_assertion( ! points_.empty() ); return points_.front(); } - /// Returns the ending point of the polyline + /// returns the ending point of the polyline const Point_3& end_point() const { CGAL_assertion( ! points_.empty() ); return points_.back(); } - /// Returns `true` if the polyline is not degenerated + /// returns `true` if the polyline is not degenerated bool is_valid() const { return points_.size() > 1; } - /// Returns `true` if polyline is a loop + /// returns `true` if polyline is a loop bool is_loop() const { return start_point() == end_point(); @@ -201,7 +201,7 @@ class Polyline } - /// Returns the angle at the first point. + /// returns the angle at the first point. /// \pre The polyline must be a loop. Angle angle_at_first_point() const { CGAL_precondition(is_loop()); @@ -211,7 +211,7 @@ class Polyline return angle(prev, first, next_p); } - /// Returns the length of the polyline + /// returns the length of the polyline FT length() const { //TODO: cache result @@ -227,7 +227,7 @@ class Polyline return result; } - /// Returns signed geodesic distance between `p` and `q`. + /// returns signed geodesic distance between `p` and `q`. FT signed_geodesic_distance(const Point_3& p, const Point_3& q) const { // Locate p & q on polyline @@ -259,7 +259,7 @@ class Polyline } - /// Returns a point at geodesic distance `distance` from p along the + /// returns a point at geodesic distance `distance` from p along the /// polyline. The polyline is oriented from starting point to end point. /// The distance could be negative. Point_3 point_at(const Point_3& p, FT distance) const @@ -332,7 +332,7 @@ class Polyline return (points_.end() - 2); } - /// Returns an iterator on the starting point of the segment of the + /// returns an iterator on the starting point of the segment of the /// polyline which contains p /// if end_point_first is true, then --end is returned instead of begin /// if p is the starting point of a loop. @@ -523,28 +523,25 @@ features into any model of the `MeshDomain_3` concept. The 1-dimensional features are described as polylines whose endpoints are the added corners. -\tparam MD is the type -of the domain which should be extended. -It has to be a model of the `MeshDomain_3` concept. +\tparam MD is the type of the domain which is extended. It has to be a model of the `MeshDomain_3` concept. \cgalModels `MeshDomainWithFeatures_3` -\sa `MeshDomain_3` \sa `MeshPolyline_3` \sa `CGAL::Implicit_mesh_domain_3` \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Labeled_image_mesh_domain_3` - */ template < typename MD > class Mesh_domain_with_polyline_features_3 : public MD { - typedef Mesh_domain_with_polyline_features_3 Self; + typedef Mesh_domain_with_polyline_features_3 Self; public: -/// \name Types -/// @{ + /// \name Types + /// @{ + typedef typename MD::Surface_patch_index Surface_patch_index; typedef typename MD::Subdomain_index Subdomain_index; typedef int Curve_index; @@ -562,24 +559,21 @@ class Mesh_domain_with_polyline_features_3 typedef CGAL::Tag_true Has_features; typedef typename MD::R::FT FT; -/// @} -#ifndef DOXYGEN_RUNNING + /// @} #ifndef CGAL_NO_DEPRECATED_CODE - typedef Curve_index Curve_segment_index; + typedef Curve_index Curve_segment_index; #endif - typedef typename MD::R Gt; - typedef Gt R; - typedef typename MD::Point_3 Point_3; -#endif // DOXYGEN_RUNNING + typedef typename MD::R GT; + typedef GT R; + typedef typename MD::Point_3 Point_3; -/// \name Creation -/// Constructors. Forwards the arguments to the constructor -/// of the base class. -/// @{ + /// \name Creation + /// @{ + // forwards the arguments to the constructor of the base class. template Mesh_domain_with_polyline_features_3(const T& ...o) : MD(o...) @@ -589,15 +583,14 @@ class Mesh_domain_with_polyline_features_3 Mesh_domain_with_polyline_features_3(const Mesh_domain_with_polyline_features_3&) = default; -/// @} + /// @} -/// \name Operations -/// @{ + /// \name Operations + /// @{ /// @cond DEVELOPERS - /// @{ - /// Add a 0-dimensional feature in the domain. + /// adds a 0-dimensional feature in the domain. Corner_index add_corner(const Point_3& p); /// Overload where the last parameter `out` is not `CGAL::Emptyset_iterator()`. @@ -607,8 +600,9 @@ class Mesh_domain_with_polyline_features_3 IndicesOutputIterator out /*= CGAL::Emptyset_iterator()*/); /*! - Add 0-dimensional features in the domain. The value type of `InputIterator` must - be `Point_3`. + adds 0-dimensional features in the domain. + + The value type of `InputIterator` must be `Point_3`. */ template void @@ -641,11 +635,13 @@ class Mesh_domain_with_polyline_features_3 add_features_with_context(InputIterator first, InputIterator end, IndicesOutputIterator out /*= CGAL::Emptyset_iterator()*/); - /// @} - /// \endcond + + /// @endcond + /*! - Add 1-dimensional features in the domain. `InputIterator` value type must - be a model of the concept `MeshPolyline_3`. + adds 1-dimensional features in the domain. + + The value type of `InputIterator` must be a model of the concept `MeshPolyline_3`. */ template void @@ -653,16 +649,17 @@ class Mesh_domain_with_polyline_features_3 { add_features(first, end, CGAL::Emptyset_iterator()); } /// @cond DEVELOPERS - /// Undocumented function, kept for backward-compatibility with existing - /// code + + /// Undocumented function, kept for backward-compatibility with existing code template void add_features_with_context(InputIterator first, InputIterator end) { add_features_with_context(first, end, CGAL::Emptyset_iterator()); } + /// @endcond /*! - Add 1-dimensional features (curves) from the range `[first, end)` in the domain with their incidences + adds 1-dimensional features (curves) from the range `[first, end)` in the domain with their incidences with 2-dimensional features (patches) of the domain. \tparam InputIterator input iterator over curves @@ -695,57 +692,57 @@ class Mesh_domain_with_polyline_features_3 incident_patches_indices_pmap, CGAL::Emptyset_iterator()); } -/// @} -/// \name Implementation of the concept MeshDomainWithFeatures_3 -/// The following methods implement the requirement of the concept -/// `MeshDomainWithFeatures_3`. -/// @{ + /// @} - /// Implements `MeshDomainWithFeatures_3::get_corners()`. - /// OutputIterator value type is std::pair + /// \name Implementation of the concept MeshDomainWithFeatures_3 + /// The following methods implement the requirement of the concept + /// `MeshDomainWithFeatures_3`. + /// @{ + + /// implements `MeshDomainWithFeatures_3::get_corners()`. + /// OutputIterator is std::pair template OutputIterator get_corners(OutputIterator out) const; - /// Implements `MeshDomainWithFeatures_3::get_curves()`. + /// implements `MeshDomainWithFeatures_3::get_curves()`. /// OutputIterator value type is std::tuple, std::pair > template OutputIterator get_curves(OutputIterator out) const; - /// Implements `MeshDomainWithFeatures_3::curve_segment_length()`. + /// implements `MeshDomainWithFeatures_3::curve_segment_length()`. FT curve_segment_length(const Point_3& p, const Point_3 q, const Curve_index& curve_index, CGAL::Orientation orientation) const; - /// Implements `MeshDomainWithFeatures_3::curve_length()`. + /// implements `MeshDomainWithFeatures_3::curve_length()`. FT curve_length(const Curve_index& curve_index) const; - /// Implements `MeshDomainWithFeatures_3::construct_point_on_curve()`. + /// implements `MeshDomainWithFeatures_3::construct_point_on_curve()`. Point_3 construct_point_on_curve(const Point_3& starting_point, const Curve_index& curve_index, FT distance) const; - /// Implements `MeshDomainWithFeatures_3::distance_sign_along_loop()`. + /// implements `MeshDomainWithFeatures_3::distance_sign_along_loop()`. CGAL::Sign distance_sign_along_loop(const Point_3& p, const Point_3& q, const Point_3& r, const Curve_index& index) const; - /// Implements `MeshDomainWithFeatures_3::distance_sign()`. + /// implements `MeshDomainWithFeatures_3::distance_sign()`. CGAL::Sign distance_sign(const Point_3& p, const Point_3& q, const Curve_index& index) const; - /// Implements `MeshDomainWithFeatures_3::is_loop()`. + /// implements `MeshDomainWithFeatures_3::is_loop()`. bool is_loop(const Curve_index& index) const; - /// Implements `MeshDomainWithFeatures_3::is_curve_segment_covered()`. + /// implements `MeshDomainWithFeatures_3::is_curve_segment_covered()`. bool is_curve_segment_covered(const Curve_index& index, CGAL::Orientation orientation, const Point_3& c1, const Point_3& c2, const FT sq_r1, const FT sq_r2) const; - /** * Returns the index to be stored in a vertex lying on the surface identified * by `index`. @@ -760,11 +757,11 @@ class Mesh_domain_with_polyline_features_3 Index index_from_subdomain_index(const Subdomain_index& index) const { return Index(index); } - /// Returns an `Index` from a `Curve_index` + /// returns an `Index` from a `Curve_index` Index index_from_curve_index(const Curve_index& index) const { return Index(index); } - /// Returns an `Index` from a `Corner_index` + /// returns an `Index` from a `Corner_index` Index index_from_corner_index(const Corner_index& index) const { return Index(index); } @@ -782,11 +779,11 @@ class Mesh_domain_with_polyline_features_3 Subdomain_index subdomain_index(const Index& index) const { return boost::get(index); } - /// Returns a `Curve_index` from an `Index` + /// returns a `Curve_index` from an `Index` Curve_index curve_index(const Index& index) const { return boost::get(index); } - /// Returns a `Corner_index` from an `Index` + /// returns a `Corner_index` from an `Index` Corner_index corner_index(const Index& index) const { return boost::get(index); } @@ -832,12 +829,12 @@ class Mesh_domain_with_polyline_features_3 Curve_index insert_edge(InputIterator first, InputIterator end); /// @endcond -/// @} + /// @} private: void compute_corners_incidences(); - /// Returns Index associated to p (p must be the coordinates of a corner + /// returns Index associated to p (p must be the coordinates of a corner /// point) Index point_corner_index(const Point_3& p) const; @@ -918,9 +915,11 @@ class Mesh_domain_with_polyline_features_3 timer.stop(); std::cerr << " done (" << timer.time() * 1000 << " ms)" << std::endl; #endif - } // end build_curves_aabb_tree() + } // build_curves_aabb_tree() + /// @endcond -}; // end class Mesh_domain_with_polyline_features_3 + +}; // class Mesh_domain_with_polyline_features_3 @@ -1548,9 +1547,6 @@ is_curve_segment_covered(const Curve_index& index, c1, c2, sq_r1, sq_r2); } - - } //namespace CGAL - #endif // CGAL_MESH_DOMAIN_WITH_POLYLINE_FEATURES_3_H diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index cbaf1add1119..ca001d12072f 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -122,7 +122,8 @@ class Mesh_edge_criteria_3 /// \name Creation /// @{ /*! - * Returns an object to serve as criteria for edges. + * returns an object to serve as criteria for edges. + * * \param length_bound is an upper bound * for the length of the edges which are used to discretize the curves. * \param min_length_bound is a desired lower bound @@ -132,7 +133,7 @@ class Mesh_edge_criteria_3 * break all the surface topology guarantees of the meshing algorithm. * It is not guaranteed to be exactly respected in the output mesh. * - * \note if one parameter is set to 0, then its corresponding criterion is ignored. + * \note If one parameter is set to 0, then its corresponding criterion is ignored. */ Mesh_edge_criteria_3(const FT& length_bound, const FT& min_length_bound = 0) @@ -149,13 +150,12 @@ class Mesh_edge_criteria_3 // as int. /*! - * @tparam SizingField a model of `MeshDomainField_3` - * - * Returns an object to serve as criteria for edges. + * returns an object to serve as criteria for edges. * The behavior and semantic of the argument are the same * as above, except that the `length_bound` * parameter is a functional instead of a constant. - + * + * @tparam SizingField a model of `MeshDomainField_3` */ template < typename SizingField > Mesh_edge_criteria_3 diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index b35a7e78f95b..30adfbd26f40 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -68,6 +68,8 @@ class Mesh_facet_criteria_3 */ typedef typename Tr::Geom_traits::FT FT; + /// @} + typedef Visitor_ Visitor; typedef typename Visitor::Facet_quality Facet_quality; typedef typename Visitor::Is_facet_bad Is_facet_bad; @@ -84,15 +86,13 @@ class Mesh_facet_criteria_3 public: typedef CGAL::Tag_true Has_manifold_criterion; -/// @} - - /// \name Creation /// @{ #ifdef DOXYGEN_RUNNING /*! - Returns an object to serve as criteria for facets. + returns an object to serve as criteria for facets. + \param angle_bound is the lower bound for the angle in degrees of the surface mesh facets. \param radius_bound is a uniform upper bound @@ -105,6 +105,7 @@ class Mesh_facet_criteria_3 \param min_radius_bound is a uniform lower bound for the radius of the surface Delaunay balls. Only facets with a radius larger than that bound will be refined. + @note If one parameter is set to 0, then its corresponding criterion is ignored. */ @@ -154,6 +155,7 @@ class Mesh_facet_criteria_3 /** * @brief returns whether the facet `facet` is bad or not. + * * @param tr the triangulation within which `facet` lives * @param facet the facet */ diff --git a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h index f179ca9233d9..8e053945d604 100644 --- a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h +++ b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h @@ -214,34 +214,40 @@ class Mesh_polyhedron_items : public CGAL::Polyhedron_items_3 { The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and -Halfedge class. Those data are required to use the detection of sharp features. +Halfedge classes. Those data are required to use the detection of sharp features. \tparam IGT stands for the geometric traits associated to the meshing process. It must be a model of the two concepts `PolyhedronTraits_3` and `IntersectionGeometricTraits_3`. -\sa `CGAL::Polyhedron_3` +\sa `CGAL::Polyhedron_3` \sa `CGAL::Polyhedral_mesh_domain_with_features_3` */ -template +#ifdef DOXYGEN_RUNNING +template struct Mesh_polyhedron_3 { -#ifdef DOXYGEN_RUNNING /// \name Types /// @{ /*! - `CGAL::Polyhedron_3` type with customized `PolyhedronItems_3` + `CGAL::Polyhedron_3` type with customized `PolyhedronItems_3` designed to handle sharp feature detection. */ typedef unspecified_type type; /// @} +}; #else +template +struct Mesh_polyhedron_3 +{ typedef Polyhedron_3 > type; typedef type Type; -#endif }; +#endif + } // end namespace CGAL #endif // CGAL_MESH_POLYHEDRON_3_H diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index 3f3ca673523e..3aca87748439 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -134,15 +134,15 @@ type to be used for the 3D triangulation embedding the mesh. \tparam GT must be a model of `MeshTriangulationTraits_3` or `Default` and defaults to `Kernel_traits::%Kernel`. -\tparam Concurrency_tag_ enables sequential versus parallel meshing and optimization algorithms. - Possible values are `Sequential_tag` (the default), `Parallel_tag`, - and `Parallel_if_available_tag`. +\tparam ConcurrencyTag enables sequential versus parallel meshing and optimization algorithms. + Possible values are `Sequential_tag` (the default), `Parallel_tag`, + and `Parallel_if_available_tag`. -\tparam Vertex_base__ must be a model of `MeshVertexBase_3` or `Default` -and defaults to `Mesh_vertex_base_3`. +\tparam VertexBase must be a model of `MeshVertexBase_3` or `Default` +and defaults to `Mesh_vertex_base_3`. -\tparam Cell_base_ must be a model of `MeshCellBase_3` or `Default` -and defaults to `Compact_mesh_cell_base_3`. +\tparam CellBase must be a model of `MeshCellBase_3` or `Default` +and defaults to `Compact_mesh_cell_base_3`. \warning To improve the robustness of the meshing process, the input traits `GT` is wrapped with the traits class `Robust_weighted_circumcenter_filtered_traits_3`. @@ -162,7 +162,7 @@ template + class CellBase = Default> struct Mesh_triangulation_3 { private: @@ -190,28 +190,25 @@ struct Mesh_triangulation_3 Mesh_3_regular_triangulation_3_wrapper; public: - #ifndef DOXYGEN_RUNNING using type = Triangulation; using Type = type; #else + /// \name Types + /// @{ -/// \name Types -/// @{ - -/*! -The triangulation type to be used for the 3D triangulation embedding the mesh. -This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex -and cell base classes are respectively `Vertex_base` and `Cell_base`. -*/ -typedef unspecified_type type; + /*! + The triangulation type to be used for the 3D triangulation embedding the mesh. + This type is a wrapper around the type `CGAL::Regular_triangulation_3`, whose vertex + and cell base classes are respectively `VertexBase` and `CellBase`. + */ + typedef unspecified_type type; /// @} +#endif // DOXYGEN_RUNNING +}; -#endif - -}; // end struct Mesh_triangulation_3 -} // end namespace CGAL +} // end namespace CGAL #include diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 56fabd998135..987acca1567f 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -85,7 +85,7 @@ surface, the sub-domain indices on both sides are known. \tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. -\tparam IGT_ stands for a geometric traits class +\tparam IGT stands for a geometric traits class providing the types and functors required to implement the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated @@ -93,7 +93,6 @@ with a model of the concept `IntersectionGeometricTraits_3`. \cgalModels `MeshDomainWithFeatures_3` -\sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()` \sa `CGAL::Mesh_domain_with_polyline_features_3` \sa `CGAL::Polyhedral_mesh_domain_3` @@ -104,53 +103,47 @@ template < class IGT, class Polyhedron = typename Mesh_polyhedron_3::type> class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron, - IGT> > + Polyhedral_mesh_domain_3 > #else template < class IGT_, class Polyhedron_ = typename Mesh_polyhedron_3::type, - class TriangleAccessor=CGAL::Default> + class TriangleAccessor = CGAL::Default> class Polyhedral_complex_mesh_domain_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron_, IGT_, TriangleAccessor, - int, //Use_patch_id_tag - Tag_true > >//Use_exact_intersection_tag + int, // Use_patch_id_tag + Tag_true > >// Use_exact_intersection_tag #endif { public: - /// The base class + // The base class typedef Polyhedron_ Polyhedron; typedef Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< - Polyhedron, IGT_, TriangleAccessor, - int, Tag_true > > Base; - /// @cond DEVELOPERS -private: + Polyhedral_mesh_domain_3< + Polyhedron, IGT_, TriangleAccessor, int, Tag_true > > Base; +private: + /// @cond DEVELOPERS typedef Polyhedral_mesh_domain_3 BaseBase; typedef Polyhedral_complex_mesh_domain_3 Self; /// @endcond public: - /*! - Numerical type. - */ + // Numerical type typedef typename Base::FT FT; - /// The polyhedron type + // The polyhedron type typedef Polyhedron Polyhedron_type; - /// \name Index types - /// @{ - /// The types are `int` or types compatible with `int`. + // The types are `int` or types compatible with `int`. typedef typename Base::Corner_index Corner_index; typedef typename Base::Curve_index Curve_index; typedef typename Base::Surface_patch_index Surface_patch_index; typedef typename Base::Subdomain_index Subdomain_index; - /// @} /// @cond DEVELOPERS typedef typename Base::Ray_3 Ray_3; @@ -162,6 +155,7 @@ class Polyhedral_complex_mesh_domain_3 typedef typename Base::AABB_primitive AABB_primitive; typedef typename Base::AABB_primitive_id AABB_primitive_id; typedef typename Base::Surface_patch_index Patch_id; + // Backward compatibility #ifndef CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX typedef Surface_patch_index Surface_index; @@ -192,9 +186,12 @@ class Polyhedral_complex_mesh_domain_3 /// @endcond public: - /// Constructor - /*! Constructs a domain defined by a set of polyhedral surfaces, - describing a polyhedral complex. + /// \name Creation + /// @{ + + /*! + constructs a domain defined by a set of polyhedral surfaces, describing a polyhedral complex. + @param begin first iterator on the input polyhedral surfaces @param end past the end iterator on the input polyhedral surfaces @param indices_begin first iterator on the pairs of subdomain indices @@ -214,15 +211,14 @@ class Polyhedral_complex_mesh_domain_3 */ template - Polyhedral_complex_mesh_domain_3 - ( InputPolyhedraIterator begin, - InputPolyhedraIterator end, - InputPairOfSubdomainIndicesIterator indices_begin, - InputPairOfSubdomainIndicesIterator indices_end + Polyhedral_complex_mesh_domain_3(InputPolyhedraIterator begin, + InputPolyhedraIterator end, + InputPairOfSubdomainIndicesIterator indices_begin, + InputPairOfSubdomainIndicesIterator indices_end #ifndef DOXYGEN_RUNNING - , CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif - ) + ) : Base(p_rng) , patch_indices(indices_begin, indices_end) , borders_detected_(false) @@ -254,7 +250,10 @@ class Polyhedral_complex_mesh_domain_3 this->build(); } + /// @} + /// @cond DEVELOPERS + Polyhedral_complex_mesh_domain_3 ( CGAL::Random* p_rng = nullptr @@ -266,17 +265,15 @@ class Polyhedral_complex_mesh_domain_3 const std::vector& polyhedra() const { return stored_polyhedra; } - /// @endcond - /// @cond DEVELOPERS /*! * construct_initial_points_object() is one of the very first functions called - * when make_mesh_3 starts + * when make_mesh_3 starts. * BEFORE make_mesh_3 starts, we have to make sure that (at least) the borders have * been detected, and the polyhedral complex internal data structures initialized * So, this function is overloaded to make sure they are (checking that - * borders_detected_ is false is enough) - * Then, call the base class function + * borders_detected_ is false is enough). + * Then, call the base class function. */ typename BaseBase::Construct_initial_points construct_initial_points_object() const { @@ -289,9 +286,13 @@ class Polyhedral_complex_mesh_domain_3 void detect_features(FT angle_in_degree, std::vector& p, const bool dont_protect);//if true, features will not be protected + + void detect_borders(std::vector& p, const bool dont_protect); + /// @endcond + /*! - Detects sharp features and boundaries of the polyhedral components of the complex + detects sharp features and boundaries of the polyhedral components of the complex (including potential internal polyhedra), and inserts them as features of the domain. `angle_bound` gives the maximum angle (in degrees) between the two normal vectors of adjacent triangles. @@ -303,13 +304,10 @@ class Polyhedral_complex_mesh_domain_3 detect_features(angle_bound, stored_polyhedra, false/*do protect*/); } - /// @cond DEVELOPERS - void detect_borders(std::vector& p, const bool dont_protect); - /// @endcond /*! - Detects border edges of the polyhedral components of the complex, + detects border edges of the polyhedral components of the complex, and inserts them as features of the domain. - This function should be called alone only, and not before or after `detect_features()`. + This function should only be called alone, and not before or after `detect_features()`. */ void detect_borders() { detect_borders(stored_polyhedra, false/*do protect*/); @@ -373,11 +371,10 @@ class Polyhedral_complex_mesh_domain_3 this->boundary_polyhedra_ids.push_back(poly_id); } } - /// @endcond - /// @cond DEVELOPERS template - void add_vertices_to_c3t3_on_patch_without_feature_edges(C3t3& c3t3) const { + void add_vertices_to_c3t3_on_patch_without_feature_edges(C3t3& c3t3) const + { #ifdef CGAL_MESH_3_VERBOSE std::cout << "add_vertices_to_c3t3_on_patch_without_feature_edges..."; std::cout.flush(); diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 6d50190ac98f..2abd37c3d77b 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -133,19 +133,17 @@ with a model of the concept `IntersectionGeometricTraits_3`. \sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. - */ - #ifdef DOXYGEN_RUNNING template -#else -template -#endif +#else // DOXYGEN_RUNNING +template +#endif // DOXYGEN_RUNNING class Polyhedral_mesh_domain_3 { public: @@ -155,7 +153,7 @@ class Polyhedral_mesh_domain_3 typedef Patch_id_ Patch_id; - /// Geometric object types + // Geometric object types typedef typename IGT::Point_3 Point_3; typedef typename IGT::Segment_3 Segment_3; typedef typename IGT::Ray_3 Ray_3; @@ -166,25 +164,25 @@ class Polyhedral_mesh_domain_3 //------------------------------------------------------- // Index Types //------------------------------------------------------- - /// Type of indexes for cells of the input complex + // Type of indexes for cells of the input complex typedef int Subdomain_index; typedef boost::optional Subdomain; - /// Type of indexes for surface patch of the input complex + // Type of indexes for surface patch of the input complex typedef typename boost::property_map >::type Face_patch_id_pmap; typedef typename boost::property_traits< Face_patch_id_pmap>::value_type Surface_patch_index; typedef boost::optional Surface_patch; - /// Type of indexes to characterize the lowest dimensional face of the input - /// complex on which a vertex lie + + // Type of indexes to characterize the lowest dimensional face of the input + // complex on which a vertex lie typedef typename Mesh_3::internal::Index_generator< Subdomain_index, Surface_patch_index>::type Index; typedef std::tuple Intersection; - typedef typename IGT::FT FT; // Kernel_traits compatibility @@ -229,8 +227,6 @@ class Polyhedral_mesh_domain_3 typedef typename AABB_traits::Bounding_box Bounding_box; public: - - /// Default constructor Polyhedral_mesh_domain_3(CGAL::Random* p_rng = nullptr) : tree_() , bounding_tree_(&tree_) @@ -238,15 +234,13 @@ class Polyhedral_mesh_domain_3 { } - -/// \name Creation -/// @{ + /// \name Creation + /// @{ /*! Construction from a bounding polyhedral surface which must be closed, and free of intersections. The inside of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_3(const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr @@ -270,11 +264,11 @@ class Polyhedral_mesh_domain_3 and free of intersections. Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. -*/ - Polyhedral_mesh_domain_3(const Polyhedron& p - ,const Polyhedron& bounding_polyhedron + */ + Polyhedral_mesh_domain_3(const Polyhedron& p, + const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif ) : tree_() @@ -300,14 +294,14 @@ class Polyhedral_mesh_domain_3 * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra - * @param bounding_polyhedron reference to the bounding surface + * @param bounding_polyhedron the bounding surface */ template - Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin - ,InputPolyhedraPtrIterator end - ,const Polyhedron& bounding_polyhedron + Polyhedral_mesh_domain_3(InputPolyhedraPtrIterator begin, + InputPolyhedraPtrIterator end, + const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif ) : p_rng_(p_rng) @@ -328,7 +322,7 @@ class Polyhedral_mesh_domain_3 } /*! - * Constructor from a sequence of polyhedral surfaces, without bounding + * Constructor from a sequence of polyhedral surfaces, without a bounding * surface. The domain will always answer `false` to `is_in_domain()` * queries. * @@ -356,6 +350,8 @@ class Polyhedral_mesh_domain_3 bounding_tree_ = 0; } + /// @} + // Destructor ~Polyhedral_mesh_domain_3() { if(bounding_tree_ != 0 && bounding_tree_ != &tree_) { @@ -366,11 +362,9 @@ class Polyhedral_mesh_domain_3 void set_surface_only() { bounding_tree_ = 0; } -/// @} - /** - * Constructs a set of `n` points on the surface, and output them to + * constructs a set of `n` points on the surface, and output them to * the output iterator `pts` whose value type is required to be * `std::pair`. */ @@ -422,7 +416,7 @@ class Polyhedral_mesh_domain_3 return tree_.closest_point(p); } - /// Allowed query types + // Allowed query types typedef boost::mpl::vector Allowed_query_types; /** diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 7c07b8a5ef21..38c2b9570f19 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -62,14 +62,14 @@ namespace CGAL { The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose boundary is a simplicial polyhedral surface. -This surface must be free of intersection. -It can either be closed, + +This surface must be free of intersection. It can either be closed, included inside another polyhedral surface which is closed and free of intersection, or open. In the latter case, the meshing process will only take care of the quality of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. -It is a model of the concept `MeshDomainWithFeatures_3`. It also -provides a member function to automatically detect sharp features and boundaries from +It is a model of the concept `MeshDomainWithFeatures_3`. It also provides +a member function to automatically detect sharp features and boundaries from the input polyhedral surface(s). \tparam IGT stands for a geometric traits class providing the types @@ -78,7 +78,6 @@ for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. - \tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. \cgalModels `MeshDomainWithFeatures_3` @@ -88,25 +87,25 @@ instantiated with a model of the concept \sa `CGAL::Mesh_polyhedron_3` */ #ifdef DOXYGEN_RUNNING -template < class IGT - ,class Polyhedron = typename Mesh_polyhedron_3::type> +template ::type> class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron, - IGT> > + Polyhedral_mesh_domain_3 > #else -template < class IGT_ - ,class Polyhedron_ = typename Mesh_polyhedron_3::type - ,class TriangleAccessor= CGAL::Default - ,class Patch_id=int - ,class Use_exact_intersection_construction_tag = Tag_true> +template ::type, + class TriangleAccessor = CGAL::Default, + class Patch_id = int, + class Use_exact_intersection_construction_tag = Tag_true> class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< - Polyhedral_mesh_domain_3< Polyhedron_, - IGT_, - TriangleAccessor, - Patch_id, - Use_exact_intersection_construction_tag > > + Polyhedral_mesh_domain_3 > #endif { typedef Mesh_domain_with_polyline_features_3< @@ -131,8 +130,9 @@ class Polyhedral_mesh_domain_with_features_3 typedef typename Base::Surface_patch_index Surface_patch_index; typedef typename Base::Subdomain_index Subdomain_index; + // Backward-compatibility #ifndef CGAL_NO_DEPRECATED_CODE - typedef Curve_index Curve_segment_index; ///< Backward-compatibility + typedef Curve_index Curve_segment_index; #endif typedef typename boost::property_map Bare_polyline; typedef Mesh_3::Polyline_with_context Polyline_with_context; -/// \name Creation -/// @{ + /// \name Creation + /// @{ /*! - Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface. + Constructor from a polyhedral surface. No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done. The polyhedron `bounding_polyhedron` has to be closed and free of intersections. Its interior of `bounding_polyhedron` will be meshed. */ Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) @@ -191,14 +182,13 @@ class Polyhedral_mesh_domain_with_features_3 #ifndef CGAL_NO_DEPRECATED_CODE /*! - \deprecated Constructs a `Polyhedral_mesh_domain_with_features_3` from an off file. No feature - detection is done at this level. Users must read the file into a `Polyhedron` and call the - constructor above. + \deprecated Constructor from an OFF file. No feature detection is done at this level. + Users must read the file into a `Polyhedron` and call the constructor above. */ CGAL_DEPRECATED Polyhedral_mesh_domain_with_features_3(const std::string& filename #ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) @@ -217,20 +207,20 @@ class Polyhedral_mesh_domain_with_features_3 { load_from_file(filename); } -#endif +#endif // DOXYGEN_RUNNING #endif // not CGAL_NO_DEPRECATED_CODE /*! - Constructs a `Polyhedral_mesh_domain_with_features_3` from a polyhedral surface, and a bounding polyhedral surface. + Constructor from a polyhedral surface, and a bounding polyhedral surface. The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed and free of intersections. Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. */ - Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron - ,const Polyhedron& bounding_polyhedron + Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron, + const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr + , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) @@ -249,10 +239,24 @@ class Polyhedral_mesh_domain_with_features_3 } } + /*! + * Constructor from a sequence of polyhedral surfaces, without a bounding + * surface. The domain will always answer `false` to `is_in_domain()` + * queries. + * + * @tparam InputPolyhedraPtrIterator must be a model of + * `ForwardIterator` and value type `Polyhedron*` + * + * @param begin iterator for a sequence of pointers to polyhedra + * @param end iterator for a sequence of pointers to polyhedra + */ template Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin, - InputPolyhedraPtrIterator end, - CGAL::Random* p_rng = nullptr) + InputPolyhedraPtrIterator end +#ifndef DOXYGEN_RUNNING + , CGAL::Random* p_rng = nullptr +#endif + ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.reserve(std::distance(begin, end)); @@ -265,11 +269,25 @@ class Polyhedral_mesh_domain_with_features_3 this->build(); } + /*! + * Constructor from a sequence of polyhedral surfaces, and a bounding + * polyhedral surface. + * + * @tparam InputPolyhedraPtrIterator must be a model of + * `ForwardIterator` and value type `Polyhedron*` + * + * @param begin iterator for a sequence of pointers to polyhedra + * @param end iterator for a sequence of pointers to polyhedra + * @param bounding_polyhedron the bounding surface + */ template Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin, InputPolyhedraPtrIterator end, - const Polyhedron& bounding_polyhedron, - CGAL::Random* p_rng = nullptr) + const Polyhedron& bounding_polyhedron +#ifndef DOXYGEN_RUNNING + , CGAL::Random* p_rng = nullptr +#endif + ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.reserve(std::distance(begin, end)+1); @@ -291,26 +309,27 @@ class Polyhedral_mesh_domain_with_features_3 this->build(); } - /// Destructor - ~Polyhedral_mesh_domain_with_features_3() {} + /// @} -/// @} + // Destructor + ~Polyhedral_mesh_domain_with_features_3() {} - /// Detect features + // Detect features void initialize_ts(Polyhedron& p); + void detect_borders(std::vector& p); void detect_features(FT angle_in_degree, std::vector& p); -/// \name Operations -/// @{ + /// \name Operations + /// @{ /*! - Detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedron) - and inserts them as features of the domain. - @param angle_bound gives the maximum - angle (in degrees) between the two normal vectors of adjacent triangles. - For an edge of the polyhedron, if the angle between the two normal vectors of its + detects sharp features and boundaries of the internal bounding polyhedron (and the potential + internal polyhedra) and inserts them as features of the domain. + + @param angle_bound gives the maximum angle (in degrees) between the two normal vectors of adjacent triangles. + For an edge of a polyhedron, if the angle between the two normal vectors of its incident facets is bigger than the given bound, then the edge is considered as a feature edge. */ @@ -319,13 +338,11 @@ class Polyhedral_mesh_domain_with_features_3 detect_features(angle_bound, stored_polyhedra); } - void detect_borders(std::vector& p); - /*! - Detects border edges of the bounding polyhedron and inserts them as features of the domain. - This function should be called alone only, and not before or after `detect_features()`. - */ + detects border edges of the bounding polyhedron and inserts them as features of the domain. + This function should only be called alone, and not before or after `detect_features()`. + */ void detect_borders() { detect_borders(stored_polyhedra); }; /// @} diff --git a/Mesh_3/include/CGAL/Triangle_accessor_3.h b/Mesh_3/include/CGAL/Triangle_accessor_3.h index 03c091ccdb42..4e336aea354b 100644 --- a/Mesh_3/include/CGAL/Triangle_accessor_3.h +++ b/Mesh_3/include/CGAL/Triangle_accessor_3.h @@ -19,7 +19,6 @@ #include - #include #include #include @@ -40,26 +39,14 @@ template < class K,class Items, class Triangle_accessor_3, K > { typedef Polyhedron_3 Polyhedron; + public: - /// \name Types - /// @{ - /*! - Triangle type. - */ typedef typename K::Triangle_3 Triangle_3; - /*! - Triangle iterator. - */ typedef typename Polyhedron::Facet_const_iterator Triangle_iterator; - /*! - Triangle handle. - */ typedef typename Polyhedron::Facet_const_handle Triangle_handle; - /// @} - Triangle_accessor_3() { } Triangle_iterator triangles_begin(const Polyhedron& p) const @@ -82,8 +69,7 @@ class Triangle_accessor_3, K > } }; - - template +template class Triangle_accessor_3 >, K > { typedef Graph_with_descriptor_with_graph > Polyhedron; @@ -124,5 +110,4 @@ class Triangle_accessor_3 >, K } // end namespace CGAL - #endif // POLYHEDRON_TRIANGLE_ACCESSOR_H From b3fe07a51d8673fd7dcac79433510cd1f453956b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 26 May 2023 13:36:15 +0200 Subject: [PATCH 0314/1398] Remove deprecated labeled mesh domains --- Mesh_3/benchmark/Mesh_3/StdAfx.h | 2 +- Mesh_3/benchmark/Mesh_3/concurrency.cpp | 17 +- Mesh_3/doc/Mesh_3/Doxyfile.in | 3 - Mesh_3/doc/Mesh_3/PackageDescription.txt | 3 - .../include/CGAL/Gray_image_mesh_domain_3.h | 159 ---------------- Mesh_3/include/CGAL/Implicit_mesh_domain_3.h | 148 --------------- .../CGAL/Labeled_image_mesh_domain_3.h | 174 ------------------ .../Mesh_domain_with_polyline_features_3.h | 2 - .../test_meshing_3D_gray_image_deprecated.cpp | 103 ----------- .../test_meshing_3D_image_deprecated.cpp | 73 -------- ...t_meshing_implicit_function_deprecated.cpp | 102 ---------- 11 files changed, 11 insertions(+), 775 deletions(-) delete mode 100644 Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h delete mode 100644 Mesh_3/include/CGAL/Implicit_mesh_domain_3.h delete mode 100644 Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h delete mode 100644 Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp delete mode 100644 Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp delete mode 100644 Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index a07ee4b3f167..6cb2d1e0c6c1 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -201,7 +201,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Mesh_3/benchmark/Mesh_3/concurrency.cpp b/Mesh_3/benchmark/Mesh_3/concurrency.cpp index 006c917b990d..153f235d2b8e 100644 --- a/Mesh_3/benchmark/Mesh_3/concurrency.cpp +++ b/Mesh_3/benchmark/Mesh_3/concurrency.cpp @@ -236,11 +236,10 @@ class XML_perf_data #include #include +#include #include #include -#include #include -#include #include #include @@ -579,7 +578,7 @@ bool make_mesh_3D_images(const std::string &input_filename, // Domain typedef Kernel K; - typedef CGAL::Labeled_image_mesh_domain_3 Mesh_domain; + typedef CGAL::Labeled_mesh_domain_3 Mesh_domain; // Triangulation #ifdef CGAL_CONCURRENT_MESH_3 @@ -600,7 +599,7 @@ bool make_mesh_3D_images(const std::string &input_filename, image.read(input_filename.c_str()); // Create domain - Mesh_domain domain(image); + Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain(image); std::cerr << "done." << std::endl; Mesh_parameters params; @@ -686,10 +685,10 @@ bool make_mesh_implicit(double facet_approx, { // Domain #ifdef CGAL_MESH_3_IMPLICIT_WITH_FEATURES - typedef CGAL::Implicit_mesh_domain_3 Implicit_domain; + typedef CGAL::Labeled_mesh_domain_3 Implicit_domain; typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; #else - typedef CGAL::Implicit_mesh_domain_3 Mesh_domain; + typedef CGAL::Labeled_mesh_domain_3 Mesh_domain; #endif // Triangulation @@ -708,7 +707,11 @@ bool make_mesh_implicit(double facet_approx, // Create domain Sphere bounding_sphere(CGAL::ORIGIN, 10.0 * 10.0); - Mesh_domain domain(func, bounding_sphere/*, 1e-7*/); + + namespace p = CGAL::parameters; + Mesh_domain domain = Mesh_domain::create_implicit_mesh_domain(p::function = func, + p::bounding_object = bounding_sphere + /*, p::relative_error_bound = 1e-7*/); #ifdef CGAL_MESH_3_IMPLICIT_WITH_FEATURES // Add 12 feature creases diff --git a/Mesh_3/doc/Mesh_3/Doxyfile.in b/Mesh_3/doc/Mesh_3/Doxyfile.in index 70e7712b5745..18c58c248e66 100644 --- a/Mesh_3/doc/Mesh_3/Doxyfile.in +++ b/Mesh_3/doc/Mesh_3/Doxyfile.in @@ -16,9 +16,6 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_mesh_domain_with_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Gray_image_mesh_domain_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Labeled_image_mesh_domain_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Implicit_mesh_domain_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Implicit_to_labeling_function_wrapper.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/generate_label_weights.h \ diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index bad6b7e691e1..63141c257e05 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -104,9 +104,6 @@ and their associated classes: - `CGAL::Mesh_domain_with_polyline_features_3` - `CGAL::Mesh_polyhedron_3` - `CGAL::Implicit_multi_domain_to_labeling_function_wrapper` -- `CGAL::Implicit_mesh_domain_3` (deprecated) -- `CGAL::Labeled_image_mesh_domain_3` (deprecated) -- `CGAL::Gray_image_mesh_domain_3` (deprecated) The following functors are available for feature detection: diff --git a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h deleted file mode 100644 index cb5f6cc262f3..000000000000 --- a/Mesh_3/include/CGAL/Gray_image_mesh_domain_3.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2009 INRIA Sophia-Antipolis (France). -// Copyright (c) 2012 GeometryFactory Sarl (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, Laurent Rineau -// - -#ifndef CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H -#define CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H - -#include - -#include - -#include -#include -#include -#include - -namespace CGAL { - - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Gray_image_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_gray_image_mesh_domain()`. - -The class `Gray_image_mesh_domain_3` implements a domain described by a 3D -gray image. A 3D gray image is a grid of voxels, -where each voxel is associated with a gray level value. -This class is a model of the concept `MeshDomain_3`. -The domain to be discretized is the union of voxels that lie inside a surface -described by an isolevel value, called \a isovalue. The voxels lying inside the -domain have gray level values that are larger than the isovalue. - -This class includes a member function that provides, by interpolation, -a gray level value at any query point. -An intersection between a segment and bounding -surfaces is detected when both segment endpoints are associated with gray level -values which are on both sides of the isovalue. -The intersection is then constructed by bisection. -The bisection stops when the query segment is shorter than a given error bound -`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the -length of the diagonal of the bounding box (in world coordinates) and -`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. - - -\tparam Image is the type of the input image. -This parameter must be `CGAL::Image_3`. - -\tparam BGT is a geometric traits class which provides -the basic operations to implement -intersection tests and intersection computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -\tparam Image_word_type is the data type encoded in the `Image` -input file - -\cgalModels `MeshDomain_3` - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ - -template, - typename Subdomain_index = int> -class -CGAL_DEPRECATED_MSG -( "The class template `CGAL::Gray_image_mesh_domain_3` is now deprecated. " - "Use the static member function template " - "`Labeled_mesh_domain_3::create_gray_image_mesh_domain` instead.") -Gray_image_mesh_domain_3 - : public Labeled_mesh_domain_3 -{ -public: - typedef Image_word_type_ Image_word_type; - typedef Mesh_3::Image_to_labeled_function_wrapper Wrapper; - - typedef Labeled_mesh_domain_3 Base; - - typedef typename Base::Sphere_3 Sphere_3; - typedef typename Base::FT FT; - typedef BGT Geom_traits; - typedef CGAL::Bbox_3 Bbox_3; - - /// \name Creation - /// @{ - - /*! - Construction from an image. - The object to be meshed is described by the voxels that have a gray-level - value higher than the input isovalue. - @param image the input image - @param iso_value the isovalue, inside `image`, - of the surface describing the boundary of the object to be meshed. - @param value_outside the value attached to voxels outside of the domain - to be meshed. It should be lower than `iso_value` - @param error_bound is relative to the size of the image. - */ - Gray_image_mesh_domain_3(const Image& image - ,const Image_word_type iso_value - ,const Image_word_type value_outside = 0. - ,const FT& error_bound = FT(1e-3) -#ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr -#endif - ) - : Base(parameters::function = Wrapper(image, - Transform(iso_value), - Transform(iso_value)(value_outside)), - parameters::bounding_object = Mesh_3::internal::compute_bounding_box(image), - parameters::relative_error_bound = error_bound, - parameters::p_rng = p_rng) - { - CGAL_assertion(Transform(iso_value)(value_outside) == 0); - } - - /// @} - - Gray_image_mesh_domain_3(const Image& image, - const Transform& transform, - const Image_word_type value_outside = 0., - const FT& error_bound = FT(1e-3), - CGAL::Random* p_rng = nullptr) - : Base(parameters::function = Wrapper(image, transform, transform(value_outside)), - parameters::bounding_object = Mesh_3::internal::compute_bounding_box(image), - parameters::relative_error_bound = error_bound, - parameters::p_rng = p_rng) - { - CGAL_assertion(transform(value_outside) == 0); - } - - // Destructor - virtual ~Gray_image_mesh_domain_3() {} -}; - -} // namespace CGAL - -#include - -#endif // CGAL_GRAY_IMAGE_MESH_DOMAIN_3_H diff --git a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h deleted file mode 100644 index b8c1d72e0bd4..000000000000 --- a/Mesh_3/include/CGAL/Implicit_mesh_domain_3.h +++ /dev/null @@ -1,148 +0,0 @@ -// 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) : Stéphane Tayeb -// -//****************************************************************************** -// File Description : -// class Implicit_mesh_domain_3. See class description. -//****************************************************************************** - -#ifndef CGAL_IMPLICIT_MESH_DOMAIN_3_H -#define CGAL_IMPLICIT_MESH_DOMAIN_3_H - -#include - -#include - -#include -#include -#include -#include - -namespace CGAL { - - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Implicit_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_implicit_mesh_domain()`. - -The class `Implicit_mesh_domain_3` implements a domain whose bounding surface is -described -implicitly as the zero level set of a function. -The domain to be discretized is assumed to be the domain where -the function has negative values. -This class is a model of the concept `MeshDomain_3`. - - -\tparam Function_ provides the definition of the function. -This parameter stands for a model of the concept -`ImplicitFunction` described in the -surface mesh generation package. -The number types `Function::FT` -and `BGT::FT` are required to match. - -\tparam BGT is a geometric traits which provides the basic operations to implement -intersection tests and computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -The constructor of `Implicit_mesh_domain_3` -takes as argument a bounding sphere which is required -to circumscribe the surface and to have its center inside the -domain. -This domain constructs intersection points between -the surface and segments/rays/lines by bisection. It needs an -`error_bound` such that the bisection process is stopped -when the query segment is smaller than the error bound. -The `error_bound` passed as argument to the domain constructor -is a relative error bound expressed as a ratio to the bounding sphere radius. - -\cgalModels `MeshDomain_3` - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ -template -#endif - > -class -CGAL_DEPRECATED_MSG -( "The class template `CGAL::Implicit_mesh_domain_3` is now deprecated. " - "Use the static member function template " - "`Labeled_mesh_domain_3::create_implicit_image_mesh_domain` instead.") -Implicit_mesh_domain_3 - : public Labeled_mesh_domain_3 -{ -public: - /// Base type - typedef Labeled_mesh_domain_3 Base; - - /// Public types - typedef typename Base::Sphere_3 Sphere_3; - typedef typename Base::FT FT; - typedef BGT Geom_traits; - - /// \name Creation - /// @{ - - /*! - @param f is the object of type `Function_` that represents the implicit - surface. - - @param bounding_sphere is a bounding sphere of the implicit surface. The - value of `f` at the sphere center `c` must be - negative: \f$ f(c)<0\f$. - - @param error_bound is the relative error bound - used to compute intersection points between the implicit surface - and query segments. The - bisection is stopped when the length of the intersected - segment is less than the product of `error_bound` by the - radius of `bounding_sphere`. - */ - Implicit_mesh_domain_3(Function_ f - ,const Sphere_3& bounding_sphere - ,const FT& error_bound = FT(1e-6) -#ifndef DOXYGEN_RUNNING - ,CGAL::Random* p_rng = nullptr -#endif - ) - : Base(parameters::function = Wrapper(f), parameters::bounding_object = bounding_sphere, parameters::relative_error_bound = error_bound, - parameters::null_subdomain_index = Null_subdomain_index(), parameters::p_rng = p_rng) {} - - /// @} - - // Destructor - virtual ~Implicit_mesh_domain_3() {} - - using Base::bbox; -private: - // Disabled copy constructor & assignment operator - typedef Implicit_mesh_domain_3 Self; - Implicit_mesh_domain_3(const Self& src); - Self& operator=(const Self& src); - -}; // end class Implicit_mesh_domain_3 - - -} // end namespace CGAL - -#include - -#endif // CGAL_IMPLICIT_MESH_DOMAIN_3_H diff --git a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h deleted file mode 100644 index 952d4fc2187c..000000000000 --- a/Mesh_3/include/CGAL/Labeled_image_mesh_domain_3.h +++ /dev/null @@ -1,174 +0,0 @@ -// 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 -// -//****************************************************************************** -// File Description : -// -// -//****************************************************************************** - -#ifndef CGAL_LABELED_IMAGE_MESH_DOMAIN_3_H -#define CGAL_LABELED_IMAGE_MESH_DOMAIN_3_H - -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace CGAL { - -/*! -\ingroup PkgMesh3Domains - -\deprecated The class template `Labeled_image_mesh_domain_3` is deprecated -since CGAL-4.13, in favor of the class template `Labeled_mesh_domain_3` and -its static function -`Labeled_mesh_domain_3::create_labeled_image_mesh_domain()`. - -The class `Labeled_image_mesh_domain_3` implements a domain described by a 3D labeled image. A 3D -labeled image is a grid of voxels, where each voxel is associated with an index -(a subdomain index) characterizing the subdomain in which the voxel lies. This -class is a model of the concept `MeshDomain_3`. The domain to be discretized -is the union of voxels that have an non-default index (different from the -default constructed value of the type `Image::Type`). - -This class includes a member function that provides, by interpolation, the index -of the subdomain in which any query point lies. An intersection between a segment and bounding -surfaces is detected when both segment endpoints are associated with different -values of subdomain indices. The intersection is then constructed by bisection. -The bisection stops when the query segment is shorter than a given error bound -`e`. This error bound is given by `e=d`\f$ \times\f$`bound` where `d` is the -length of the diagonal of the bounding box (in world coordinates) and -`bound` is the argument passed to the constructor of `Labeled_image_mesh_domain_3`. - - -\tparam Image is the type of the input image. -This parameter must be `CGAL::Image_3`. - -\tparam BGT is a geometric traits class which provides -the basic operations to implement -intersection tests and intersection computations -through a bisection method. This parameter must be instantiated -with a model of the concept `BisectionGeometricTraits_3`. - -\cgalModels `MeshDomain_3` - -An executable that uses `Labeled_image_mesh_domain_3` must be linked with -the CGAL_ImageIO library. - -\sa `BisectionGeometricTraits_3` -\sa `CGAL::make_mesh_3()`. - -*/ - -template -class -CGAL_DEPRECATED_MSG -( "The class template `CGAL::Labeled_image_mesh_domain_3` is now deprecated. " - "Use the static member function template " - "`Labeled_mesh_domain_3::create_labeled_image_mesh_domain` instead.") -Labeled_image_mesh_domain_3 - : public Labeled_mesh_domain_3 -{ -public: - typedef Image_word_type_ Image_word_type; - typedef typename Default::Get - - >::type Wrapper; - typedef typename Default::Get::type Null; - - typedef Labeled_mesh_domain_3 Base; - - typedef typename Base::Sphere_3 Sphere_3; - typedef typename Base::FT FT; - typedef BGT Geom_traits; - typedef CGAL::Bbox_3 Bbox_3; - typedef CGAL::Identity Identity; - - - /// \name Creation - /// @{ - - /*! - Construction from an image. - @param image the image - @param error_bound is relative to the size of the image. - */ - Labeled_image_mesh_domain_3(const Image& image - ,const FT& error_bound = FT(1e-3) -#ifndef DOXYGEN_RUNNING - ,Subdomain_index value_outside = 0 - ,Null null = Null() - ,CGAL::Random* p_rng = nullptr -#endif - ) - : Base(parameters::function = Wrapper(image, Identity(), value_outside), - parameters::bounding_object = compute_bounding_box(image), - parameters::relative_error_bound = error_bound, - parameters::null_subdomain_index = null, - parameters::p_rng = p_rng) - {} - - /// @} - - Labeled_image_mesh_domain_3(const Image& image, - const FT error_bound, - CGAL::Random* p_rng) - : Base(parameters::function = Wrapper(image), - parameters::bounding_object = compute_bounding_box(image), - parameters::relative_error_bound = error_bound, - parameters::p_rng = p_rng) - {} - - // Destructor - virtual ~Labeled_image_mesh_domain_3() {} - - using Base::bbox; - -private: - // Returns a box enclosing image `im` - Bbox_3 compute_bounding_box(const Image& im) const - { - return Bbox_3(-im.vx()+im.tx(), - -im.vy()+im.ty(), - -im.vz()+im.tz(), - double(im.xdim()+1)*im.vx()+im.tx(), - double(im.ydim()+1)*im.vy()+im.ty(), - double(im.zdim()+1)*im.vz()+im.tz()); - } -}; // end class Labeled_image_mesh_domain_3 - - - -} // end namespace CGAL - -#include - -#endif // CGAL_LABELED_IMAGE_MESH_DOMAIN_3_H diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index a8cfa8a26108..4934f22a7e90 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -528,9 +528,7 @@ whose endpoints are the added corners. \cgalModels `MeshDomainWithFeatures_3` \sa `MeshPolyline_3` -\sa `CGAL::Implicit_mesh_domain_3` \sa `CGAL::Polyhedral_mesh_domain_3` -\sa `CGAL::Labeled_image_mesh_domain_3` */ template < typename MD > class Mesh_domain_with_polyline_features_3 diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp deleted file mode 100644 index b2ba365111f8..000000000000 --- a/Mesh_3/test/Mesh_3/test_meshing_3D_gray_image_deprecated.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include - -#include "test_meshing_utilities.h" - -#include -#include -#include - -#include - -// To avoid verbose function and named parameters call -using namespace CGAL::parameters; - -template -struct Greater_than { - typedef T argument_type; - Greater_than(const T& second) : second(second) {} - bool operator()(const T& first) const { - return std::greater()(first, second); - } - T second; -}; - -template -struct Image_tester : public Tester -{ -public: - void image() const - { - typedef float Image_word_type; - typedef CGAL::Image_3 Image; - typedef CGAL::Gray_image_mesh_domain_3< - Image, - K_e_i, - Image_word_type, - Greater_than > 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; - - CGAL_USE_TYPE(typename Mesh_domain::Surface_patch_index); - - //------------------------------------------------------- - // Data generation - //------------------------------------------------------- - Image image; - if (!image.read(CGAL::data_file_path("images/skull_2.9.inr"))) - { - std::cout << "Image reading error. Exit test.\n"; - return; - } - - std::cout << "\tSeed is\t" - << CGAL::get_default_random().get_seed() << std::endl; - - // Domain - Mesh_domain domain(image, - 2.9f, //isovalue - 0.f, //value_outside - 1e-3, //error_bound - &CGAL::get_default_random());//random generator for determinism - - // Mesh criteria - Mesh_criteria criteria(facet_angle = 30, - facet_size = 6, - facet_distance = 2, - facet_topology = CGAL::MANIFOLD, - cell_radius_edge_ratio = 3, - cell_size = 8); - - // Mesh generation - C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, - no_perturb(), - no_exude(), - mesh_3_options(number_of_initial_points = 30), - non_manifold() - ); - - // Verify - this->verify_c3t3_volume(c3t3, 1236086 * 0.95, 1236086 * 1.05); - this->verify(c3t3, domain, criteria, Bissection_tag()); - } -}; - - -int main() -{ - Image_tester<> test_epic; - std::cerr << "Mesh generation from a 3D image:\n"; - test_epic.image(); - -#ifdef CGAL_LINKED_WITH_TBB - Image_tester test_epic_p; - std::cerr << "Parallel mesh generation from a 3D image:\n"; - test_epic_p.image(); -#endif - - return EXIT_SUCCESS; -} diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp deleted file mode 100644 index 8107c4cefb59..000000000000 --- a/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#define CGAL_MESH_3_VERBOSE 1 -#include - -#include "test_meshing_utilities.h" - -#include -#include -#include - -template -struct Image_tester : public Tester -{ -public: - void image() const - { - typedef CGAL::Image_3 Image; - typedef CGAL::Labeled_image_mesh_domain_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; - typedef typename Mesh_criteria::Facet_criteria Facet_criteria; - typedef typename Mesh_criteria::Cell_criteria Cell_criteria; - - //------------------------------------------------------- - // Data generation - //------------------------------------------------------- - Image image; - image.read(CGAL::data_file_path("images/liver.inr.gz")); - - std::cout << "\tSeed is\t" - << CGAL::get_default_random().get_seed() << std::endl; - Mesh_domain domain(image, 1e-6, &CGAL::get_default_random()); - - // Set mesh criteria - Facet_criteria facet_criteria(25, 20*image.vx(), 5*image.vx()); - Cell_criteria cell_criteria(4, 25*image.vx()); - Mesh_criteria criteria(facet_criteria, cell_criteria); - - // Mesh generation - C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, - CGAL::parameters::no_exude(), - CGAL::parameters::no_perturb()); - - // Verify - this->verify_c3t3_volume(c3t3, 1772330*0.95, 1772330*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); - } - -}; - -int main() -{ - Image_tester<> test_epic; - std::cerr << "Mesh generation from a 3D image:\n"; - test_epic.image(); - -#ifdef CGAL_LINKED_WITH_TBB - Image_tester test_epic_p; - std::cerr << "Parallel mesh generation from a 3D image:\n"; - test_epic_p.image(); -#endif - - return EXIT_SUCCESS; -} diff --git a/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp deleted file mode 100644 index 6a7a8aa0b57e..000000000000 --- a/Mesh_3/test/Mesh_3/test_meshing_implicit_function_deprecated.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include - -#include "test_meshing_utilities.h" - -#include - -template -struct Implicit_tester : public Tester -{ - typedef typename K::Point_3 Point; - typedef typename K::FT FT; - static FT sphere_function (const Point& p) - { - const FT x2=p.x()*p.x(), y2=p.y()*p.y(), z2=p.z()*p.z(); - return x2+y2+z2-1; - } - - void implicit() const - { - typedef FT (Function)(const Point&); - typedef CGAL::Implicit_mesh_domain_3 Mesh_domain; - - typedef typename CGAL::Mesh_triangulation_3< - Mesh_domain, - typename CGAL::Kernel_traits::Kernel, - Concurrency_tag>::type Tr; - typedef CGAL::Mesh_complex_3_in_triangulation_3 C3t3; - - typedef CGAL::Mesh_criteria_3 Mesh_criteria; - typedef typename Mesh_criteria::Facet_criteria Facet_criteria; - typedef typename Mesh_criteria::Cell_criteria Cell_criteria; - - typedef typename K::Sphere_3 Sphere_3; - - typedef typename Mesh_domain::Surface_patch_index Surface_patch_index; - - //------------------------------------------------------- - // Data generation - //------------------------------------------------------- - std::cout << "\tSeed is\t" - << CGAL::get_default_random().get_seed() << std::endl; - - Mesh_domain domain(Implicit_tester::sphere_function, - Sphere_3(CGAL::ORIGIN,2.), - 1e-3, - &CGAL::get_default_random()); - - // Set mesh criteria - Facet_criteria facet_criteria(0, 0, 0.3); - Cell_criteria cell_criteria(0, 0.5); - Mesh_criteria criteria(facet_criteria, cell_criteria); - - std::vector initial_points; - initial_points.push_back(Point(1,0,0)); - initial_points.push_back(Point(0,1,0)); - initial_points.push_back(Point(0,0,1)); - initial_points.push_back(Point(-1,0,0)); - initial_points.push_back(Point(0,-1,0)); - initial_points.push_back(Point(0,0,-1)); - - // Mesh generation - C3t3 c3t3; - c3t3.insert_surface_points(initial_points.begin(), - initial_points.end(), - domain.index_from_surface_patch_index(Surface_patch_index(0,1))); - - CGAL::refine_mesh_3(c3t3, domain, criteria, - CGAL::parameters::no_exude(), - CGAL::parameters::no_perturb()); - - CGAL::remove_far_points_in_mesh_3(c3t3); - -#ifdef CGAL_LINKED_WITH_TBB - // Parallel - if (boost::is_convertible::value) - { - this->verify(c3t3, domain, criteria, Bissection_tag(), 40, 65, 60, 110); - } - else -#endif //CGAL_LINKED_WITH_TBB - { - // Verify - this->verify(c3t3, domain, criteria, Bissection_tag(), 50, 58, 80, 90); - } - } -}; - - -int main() -{ - Implicit_tester test_epic; - std::cerr << "Mesh generation from an implicit function:\n"; - test_epic.implicit(); - -#ifdef CGAL_LINKED_WITH_TBB - Implicit_tester test_epic_p; - std::cerr << "Parallel mesh generation from an implicit function:\n"; - test_epic_p.implicit(); -#endif - return EXIT_SUCCESS; -} From 7b91a3d972551759756d06e01c5d049109e12ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 26 May 2023 13:47:20 +0200 Subject: [PATCH 0315/1398] Fix compilation --- Mesh_3/test/Mesh_3/XML_exporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/test/Mesh_3/XML_exporter.h b/Mesh_3/test/Mesh_3/XML_exporter.h index 8ecb25600b67..5be7055d3204 100644 --- a/Mesh_3/test/Mesh_3/XML_exporter.h +++ b/Mesh_3/test/Mesh_3/XML_exporter.h @@ -185,7 +185,7 @@ class Streaming_XML_exporter m_xml_fstream << " " << std::endl; // Save current pointer position - std::ofstream::streampos pos = m_xml_fstream.tellp(); + std::streampos pos = m_xml_fstream.tellp(); // Close the XML file (temporarily) so that the XML file is always correct m_xml_fstream << "" << std::endl; // Restore the pointer position so that the next "add_element" will overwrite From 278e1867aa322600cd236413ba305f96b013258e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 26 May 2023 17:12:28 +0100 Subject: [PATCH 0316/1398] parallize #1 --- .../soup_autorefinement.cpp | 7 +- .../Polygon_mesh_processing/autorefinement.h | 89 +++++++++++++------ 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index d955734853bf..f12306689485 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -29,11 +30,13 @@ int main(int argc, char** argv) PMP::repair_polygon_soup(input_points, input_triangles); PMP::triangulate_polygons(input_points, input_triangles); + CGAL::Real_timer t; + t.start(); std::vector output_points; std::vector> output_triangles; PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles); - - CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); + std::cout << "#points = " << output_points.size() << " and #triangles = " << output_triangles.size() << " in " << t.time() << " sec." << std::endl; + // CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); return 0; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index a46f2664803f..e862d6839609 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -39,6 +39,11 @@ #define CGAL_PMP_AUTOREFINE_VERBOSE(MSG) #endif +#ifdef CGAL_LINKED_WITH_TBB +#include +#include +#endif + #include #define TEST_RESOLVE_INTERSECTION @@ -656,7 +661,12 @@ void generate_subtriangles(std::size_t ti, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, const std::vector>& triangles, - std::vector>& new_triangles) +#ifdef CGAL_LINKED_WITH_TBB + tbb::concurrent_vector>& new_triangles +#else + std::vector>& new_triangles +#endif + ) { // std::cout << "generate_subtriangles()\n"; // std::cout << std::setprecision(17); @@ -1266,46 +1276,67 @@ void autorefine_soup_output(const PointRange& input_points, CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles - std::vector> new_triangles; // Need to be threadsafe +#ifdef CGAL_LINKED_WITH_TBB + tbb::concurrent_vector> new_triangles; +#else + std::vector> new_triangles; +#endif #ifdef USE_PROGRESS_DISPLAY boost::timer::progress_display pd(triangles.size()); #endif - //TODO: PARALLEL_FOR #1 - for(std::size_t ti=0; ti& t = triangles[ti]; - auto is_constant_in_dim = [](const std::array& t, int dim) - { - return t[0][dim]==t[1][dim] && t[0][dim]!=t[2][dim]; - }; + if (all_segments[ti].empty() && all_points[ti].empty()) + new_triangles.push_back(triangles[ti]); + else + { +#ifdef USE_FIXED_PROJECTION_TRAITS + const std::array& t = triangles[ti]; + auto is_constant_in_dim = [](const std::array& t, int dim) + { + return t[0][dim] == t[1][dim] && t[0][dim] != t[2][dim]; + }; - typename EK::Vector_3 orth = CGAL::normal(t[0], t[1], t[2]); // TODO::avoid construction? - int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; - c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; + typename EK::Vector_3 orth = CGAL::normal(t[0], t[1], t[2]); // TODO::avoid construction? + int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; + c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; - if(c == 0) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } else if(c == 1) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } else if(c == 2) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } - #else - autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - #endif - } + if (c == 0) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + else if (c == 1) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + else if (c == 2) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } +#else + autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); +#endif + } #ifdef USE_PROGRESS_DISPLAY - ++pd; + ++pd; #endif + }; + +#ifdef CGAL_LINKED_WITH_TBB + tbb::parallel_for(tbb::blocked_range(0, triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + func(ti); + } + ); +#else + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + func(ti); } +#endif + + // brute force output: create a soup, orient and to-mesh CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); From 1c1ed53c76457c841dab781f76f3eacfb299071c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 30 May 2023 08:03:29 +0100 Subject: [PATCH 0317/1398] Parallelize deduplicate_segments() --- .../Polygon_mesh_processing/autorefinement.h | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index e862d6839609..ad88f3a6aceb 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1178,7 +1178,8 @@ void autorefine_soup_output(const PointRange& input_points, std::vector< std::vector > all_in_triangle_ids(triangles.size()); CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); - + Real_timer t; + t.start(); std::set > intersecting_triangles; //TODO: PARALLEL_FOR #2 for (const Pair_of_triangle_ids& p : si_pairs) @@ -1225,16 +1226,22 @@ void autorefine_soup_output(const PointRange& input_points, intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); } } + std::cout << t.time() << " sec. for #2" << std::endl; #ifdef DEDUPLICATE_SEGMENTS // deduplicate inserted segments //TODO: PARALLEL_FOR #3 + Real_timer t3; + t3.start(); std::vector>> all_segments_ids(all_segments.size()); - for(std::size_t ti=0; ti point_id_map; + + auto get_point_id = [&](const typename EK::Point_3& pt) { auto insert_res = point_id_map.insert(std::make_pair(pt, all_points[ti].size())); @@ -1243,6 +1250,7 @@ void autorefine_soup_output(const PointRange& input_points, return insert_res.first->second; }; + if (!all_points[ti].empty()) { std::vector tmp; @@ -1271,9 +1279,25 @@ void autorefine_soup_output(const PointRange& input_points, if (all_segments_ids[ti].size()!=nbs) filtered_in_triangle_ids.swap(all_in_triangle_ids[ti]); } + }; + +#ifdef CGAL_LINKED_WITH_TBB + tbb::parallel_for(tbb::blocked_range(0, triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + deduplicate_inserted_segments(ti); + } + ); +#else + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + deduplicate_inserted_segments(ti); } #endif + + std::cout << t.time() << " sec. for #3" << std::endl; +#endif + CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles #ifdef CGAL_LINKED_WITH_TBB From 2695834873b41052bb2b8669d74e93de41fb89ea Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 30 May 2023 08:10:06 +0100 Subject: [PATCH 0318/1398] Rename lambdas --- .../Polygon_mesh_processing/soup_autorefinement.cpp | 2 +- .../CGAL/Polygon_mesh_processing/autorefinement.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index f12306689485..d5ebeb78c3f5 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -36,7 +36,7 @@ int main(int argc, char** argv) std::vector> output_triangles; PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles); std::cout << "#points = " << output_points.size() << " and #triangles = " << output_triangles.size() << " in " << t.time() << " sec." << std::endl; - // CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); return 0; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index ad88f3a6aceb..40a3ed87cbc7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1226,7 +1226,7 @@ void autorefine_soup_output(const PointRange& input_points, intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); } } - std::cout << t.time() << " sec. for #2" << std::endl; + std::cout << t.time() << " sec. for compute_intersections()" << std::endl; #ifdef DEDUPLICATE_SEGMENTS // deduplicate inserted segments @@ -1295,7 +1295,7 @@ void autorefine_soup_output(const PointRange& input_points, #endif - std::cout << t.time() << " sec. for #3" << std::endl; + std::cout << t.time() << " sec. for deduplicate_segments()" << std::endl; #endif CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); @@ -1311,7 +1311,7 @@ void autorefine_soup_output(const PointRange& input_points, #endif - auto func = [&](std::size_t ti) + auto refine_triangles = [&](std::size_t ti) { if (all_segments[ti].empty() && all_points[ti].empty()) new_triangles.push_back(triangles[ti]); @@ -1351,12 +1351,12 @@ void autorefine_soup_output(const PointRange& input_points, tbb::parallel_for(tbb::blocked_range(0, triangles.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) - func(ti); + refine_triangles(ti); } ); #else for (std::size_t ti = 0; ti < triangles.size(); ++ti) { - func(ti); + refine_triangles(ti); } #endif From e34a79864a78c7a19402af066698881d54a22d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 May 2023 10:13:28 +0200 Subject: [PATCH 0319/1398] debug macro --- .../Polygon_mesh_processing/autorefinement.h | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 40a3ed87cbc7..eb24d60804a7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -48,15 +48,20 @@ #define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS +#define USE_DEBUG_PARALLEL_TIMERS //#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH +#ifdef USE_DEBUG_PARALLEL_TIMERS +#include +#endif + #ifdef USE_FIXED_PROJECTION_TRAITS #include #endif -#ifdef DEBUG_COUNTERS +#if defined(DEBUG_COUNTERS) || defined(USE_DEBUG_PARALLEL_TIMERS) #include #endif @@ -1178,8 +1183,10 @@ void autorefine_soup_output(const PointRange& input_points, std::vector< std::vector > all_in_triangle_ids(triangles.size()); CGAL_PMP_AUTOREFINE_VERBOSE("compute intersections"); +#ifdef USE_DEBUG_PARALLEL_TIMERS Real_timer t; t.start(); +#endif std::set > intersecting_triangles; //TODO: PARALLEL_FOR #2 for (const Pair_of_triangle_ids& p : si_pairs) @@ -1226,7 +1233,9 @@ void autorefine_soup_output(const PointRange& input_points, intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); } } - std::cout << t.time() << " sec. for compute_intersections()" << std::endl; +#ifdef USE_DEBUG_PARALLEL_TIMERS + std::cout << t.time() << " sec. for #2" << std::endl; +#endif #ifdef DEDUPLICATE_SEGMENTS // deduplicate inserted segments @@ -1294,8 +1303,9 @@ void autorefine_soup_output(const PointRange& input_points, } #endif - - std::cout << t.time() << " sec. for deduplicate_segments()" << std::endl; +#ifdef USE_DEBUG_PARALLEL_TIMERS + std::cout << t.time() << " sec. for #3" << std::endl; +#endif #endif CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); @@ -1347,6 +1357,11 @@ void autorefine_soup_output(const PointRange& input_points, #endif }; + +#ifdef USE_DEBUG_PARALLEL_TIMERS + t.reset(); + t.start(); +#endif #ifdef CGAL_LINKED_WITH_TBB tbb::parallel_for(tbb::blocked_range(0, triangles.size()), [&](const tbb::blocked_range& r) { @@ -1360,7 +1375,11 @@ void autorefine_soup_output(const PointRange& input_points, } #endif - +#ifdef USE_DEBUG_PARALLEL_TIMERS + t.stop(); + std::cout << t.time() << " sec. for #1" << std::endl; + t.reset(); +#endif // brute force output: create a soup, orient and to-mesh CGAL_PMP_AUTOREFINE_VERBOSE("create output soup"); @@ -1408,10 +1427,19 @@ void autorefine_soup_output(const PointRange& input_points, // import refined triangles //TODO: PARALLEL_FOR #4 +#ifdef USE_DEBUG_PARALLEL_TIMERS + t.reset(); + t.start(); +#endif for (const std::array& t : new_triangles) { soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); } +#ifdef USE_DEBUG_PARALLEL_TIMERS + t.stop(); + std::cout << t.time() << " sec. for #4" << std::endl; + t.reset(); +#endif #ifndef CGAL_NDEBUG CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); From 3d6d9b3edce9890d2b0dae38c2d1231602f98411 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 30 May 2023 11:10:36 +0100 Subject: [PATCH 0320/1398] parallelize unique points --- .../Polygon_mesh_processing/autorefinement.h | 73 ++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index eb24d60804a7..e5f96d26c3bd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -41,6 +41,7 @@ #ifdef CGAL_LINKED_WITH_TBB #include +#include #include #endif @@ -1386,11 +1387,18 @@ void autorefine_soup_output(const PointRange& input_points, Cartesian_converter to_input; // TODO: reuse the fact that maps per triangle are already sorted + +#ifdef CGAL_LINKED_WITH_TBB + tbb::concurrent_map point_id_map; +#else std::map point_id_map; +#endif + #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) std::vector exact_soup_points; #endif + /// Lambda get_point_id() auto get_point_id = [&](const typename EK::Point_3& pt) { auto insert_res = point_id_map.insert(std::make_pair(pt, soup_points.size())); @@ -1404,6 +1412,8 @@ void autorefine_soup_output(const PointRange& input_points, return insert_res.first->second; }; + + std::vector input_point_ids; input_point_ids.reserve(input_points.size()); for (const auto& p : input_points) @@ -1431,13 +1441,70 @@ void autorefine_soup_output(const PointRange& input_points, t.reset(); t.start(); #endif - for (const std::array& t : new_triangles) - { + + bool sequential = +#ifdef CGAL_LINKED_WITH_TBB + false; +#else + true; +#endif + + + std::size_t offset = soup_triangles.size(); + std::string mode; + if(sequential || new_triangles.size() < 100){ + mode = "sequential"; + soup_triangles.reserve(offset + new_triangles.size()); + for (const std::array& t : new_triangles) + { soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + } } + else { + mode = "parallel"; +#ifdef CGAL_LINKED_WITH_TBB + + tbb::concurrent_vector concurrent_soup_points; + /// Lambda concurrent_get_point_id() + auto concurrent_get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, concurrent_soup_points.size())); + if (insert_res.second) + { + concurrent_soup_points.push_back(to_input(pt)); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.push_back(pt); +#endif + } + return insert_res.first->second; + }; + + + soup_triangles.resize(offset + new_triangles.size()); + std::cout << "soup_triangles.size() = " << soup_triangles.size() << std::endl; + std::cout << "new_triangles.size() = " << new_triangles.size() << std::endl; + tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) { + if (offset + ti > soup_triangles.size()) { + std::cout << "ti = " << ti << std::endl; + } + const std::array& t = new_triangles[ti]; + soup_triangles[offset + ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); + } + } + ); + + soup_points.reserve(soup_points.size() + concurrent_soup_points.size()); + soup_points.insert(soup_points.end(), concurrent_soup_points.begin(), concurrent_soup_points.end()); + } +#endif + + + #ifdef USE_DEBUG_PARALLEL_TIMERS t.stop(); - std::cout << t.time() << " sec. for #4" << std::endl; + std::cout << t.time() << " sec. for #4 (" << mode << ")" << std::endl; t.reset(); #endif From a1fbd105dacff034f89de7db2b5086c2f24999ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 May 2023 15:07:13 +0200 Subject: [PATCH 0321/1398] add TODO --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index e5f96d26c3bd..16c788c22ecc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -164,7 +164,9 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, } } + // supporting_line intersects: points are coplanar + // TODO: check if we can write a dedicated predicate taking advantage of p,q being shared ::CGAL::Orientation pqr = cpl_orient(p, q, r); ::CGAL::Orientation pqs = cpl_orient(p, q, s); From 4b2f3e6ec7c10e0d7acf8d40608f4e548db7e091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 30 May 2023 16:01:05 +0200 Subject: [PATCH 0322/1398] take np into account for concurrency --- .../soup_autorefinement.cpp | 4 +- .../Polygon_mesh_processing/autorefinement.h | 211 ++++++++++-------- 2 files changed, 115 insertions(+), 100 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index d5ebeb78c3f5..823c50974dcc 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -34,7 +34,9 @@ int main(int argc, char** argv) t.start(); std::vector output_points; std::vector> output_triangles; - PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles); + PMP::autorefine_soup_output(input_points, input_triangles, + output_points, output_triangles, + CGAL::parameters::concurrency_tag(CGAL::Parallel_if_available_tag())); std::cout << "#points = " << output_points.size() << " and #triangles = " << output_triangles.size() << " in " << t.time() << " sec." << std::endl; CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 16c788c22ecc..ae383a4af293 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -658,10 +658,11 @@ void collect_intersections(const std::array& t1, ////////////////////////////////// ////////////////////////////////// -template void generate_subtriangles(std::size_t ti, std::vector>& segments, @@ -669,11 +670,7 @@ void generate_subtriangles(std::size_t ti, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, const std::vector>& triangles, -#ifdef CGAL_LINKED_WITH_TBB - tbb::concurrent_vector>& new_triangles -#else - std::vector>& new_triangles -#endif + PointVector& new_triangles ) { // std::cout << "generate_subtriangles()\n"; @@ -1131,6 +1128,14 @@ void autorefine_soup_output(const PointRange& input_points, Sequential_tag > ::type Concurrency_tag; + constexpr bool parallel_execution = std::is_same_v; + +#ifndef CGAL_LINKED_WITH_TBB + CGAL_static_assertion_msg (parallel_execution, + "Parallel_tag is enabled but TBB is unavailable."); +#endif + + typedef std::size_t Input_TID; typedef std::pair Pair_of_triangle_ids; @@ -1294,16 +1299,20 @@ void autorefine_soup_output(const PointRange& input_points, }; #ifdef CGAL_LINKED_WITH_TBB - tbb::parallel_for(tbb::blocked_range(0, triangles.size()), - [&](const tbb::blocked_range& r) { - for (size_t ti = r.begin(); ti != r.end(); ++ti) - deduplicate_inserted_segments(ti); - } - ); -#else - for (std::size_t ti = 0; ti < triangles.size(); ++ti) { - deduplicate_inserted_segments(ti); + if (parallel_execution) + { + tbb::parallel_for(tbb::blocked_range(0, triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + deduplicate_inserted_segments(ti); + } + ); } + else +#else + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + deduplicate_inserted_segments(ti); + } #endif #ifdef USE_DEBUG_PARALLEL_TIMERS @@ -1314,7 +1323,9 @@ void autorefine_soup_output(const PointRange& input_points, CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles #ifdef CGAL_LINKED_WITH_TBB - tbb::concurrent_vector> new_triangles; + std::conditional_t>, + std::vector>> new_triangles; #else std::vector> new_triangles; #endif @@ -1325,40 +1336,40 @@ void autorefine_soup_output(const PointRange& input_points, auto refine_triangles = [&](std::size_t ti) + { + if (all_segments[ti].empty() && all_points[ti].empty()) + new_triangles.push_back(triangles[ti]); + else { - if (all_segments[ti].empty() && all_points[ti].empty()) - new_triangles.push_back(triangles[ti]); - else - { #ifdef USE_FIXED_PROJECTION_TRAITS - const std::array& t = triangles[ti]; - auto is_constant_in_dim = [](const std::array& t, int dim) - { - return t[0][dim] == t[1][dim] && t[0][dim] != t[2][dim]; - }; + const std::array& t = triangles[ti]; + auto is_constant_in_dim = [](const std::array& t, int dim) + { + return t[0][dim] == t[1][dim] && t[0][dim] != t[2][dim]; + }; - typename EK::Vector_3 orth = CGAL::normal(t[0], t[1], t[2]); // TODO::avoid construction? - int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; - c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; + typename EK::Vector_3 orth = CGAL::normal(t[0], t[1], t[2]); // TODO::avoid construction? + int c = CGAL::abs(orth[0]) > CGAL::abs(orth[1]) ? 0 : 1; + c = CGAL::abs(orth[2]) > CGAL::abs(orth[c]) ? 2 : c; - if (c == 0) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } - else if (c == 1) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } - else if (c == 2) { - autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); - } + if (c == 0) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + else if (c == 1) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } + else if (c == 2) { + autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + } #else - autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); #endif - } + } #ifdef USE_PROGRESS_DISPLAY - ++pd; + ++pd; #endif - }; + }; #ifdef USE_DEBUG_PARALLEL_TIMERS @@ -1366,16 +1377,20 @@ void autorefine_soup_output(const PointRange& input_points, t.start(); #endif #ifdef CGAL_LINKED_WITH_TBB - tbb::parallel_for(tbb::blocked_range(0, triangles.size()), - [&](const tbb::blocked_range& r) { - for (size_t ti = r.begin(); ti != r.end(); ++ti) - refine_triangles(ti); - } - ); -#else - for (std::size_t ti = 0; ti < triangles.size(); ++ti) { - refine_triangles(ti); + if (parallel_execution) + { + tbb::parallel_for(tbb::blocked_range(0, triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + refine_triangles(ti); + } + ); } + else +#else + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + refine_triangles(ti); + } #endif #ifdef USE_DEBUG_PARALLEL_TIMERS @@ -1391,7 +1406,9 @@ void autorefine_soup_output(const PointRange& input_points, // TODO: reuse the fact that maps per triangle are already sorted #ifdef CGAL_LINKED_WITH_TBB - tbb::concurrent_map point_id_map; + std::conditional_t, + std::map> point_id_map; #else std::map point_id_map; #endif @@ -1444,63 +1461,59 @@ void autorefine_soup_output(const PointRange& input_points, t.start(); #endif - bool sequential = -#ifdef CGAL_LINKED_WITH_TBB - false; -#else - true; + std::size_t offset = soup_triangles.size(); +#ifdef USE_DEBUG_PARALLEL_TIMERS + std::string mode = "parallel"; #endif - - std::size_t offset = soup_triangles.size(); - std::string mode; - if(sequential || new_triangles.size() < 100){ - mode = "sequential"; - soup_triangles.reserve(offset + new_triangles.size()); - for (const std::array& t : new_triangles) - { - soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); - } - } - else { - mode = "parallel"; + //TODO: 100 should be fined tune and depends on #threads #ifdef CGAL_LINKED_WITH_TBB - - tbb::concurrent_vector concurrent_soup_points; - /// Lambda concurrent_get_point_id() - auto concurrent_get_point_id = [&](const typename EK::Point_3& pt) - { - auto insert_res = point_id_map.insert(std::make_pair(pt, concurrent_soup_points.size())); - if (insert_res.second) - { - concurrent_soup_points.push_back(to_input(pt)); + if(parallel_execution && new_triangles.size() > 100) + { + tbb::concurrent_vector concurrent_soup_points; + /// Lambda concurrent_get_point_id() + auto concurrent_get_point_id = [&](const typename EK::Point_3& pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, concurrent_soup_points.size())); + if (insert_res.second) + { + concurrent_soup_points.push_back(to_input(pt)); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.push_back(pt); + exact_soup_points.push_back(pt); #endif - } - return insert_res.first->second; - }; + } + return insert_res.first->second; + }; - soup_triangles.resize(offset + new_triangles.size()); - std::cout << "soup_triangles.size() = " << soup_triangles.size() << std::endl; - std::cout << "new_triangles.size() = " << new_triangles.size() << std::endl; - tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), - [&](const tbb::blocked_range& r) { - for (size_t ti = r.begin(); ti != r.end(); ++ti) { - if (offset + ti > soup_triangles.size()) { - std::cout << "ti = " << ti << std::endl; - } - const std::array& t = new_triangles[ti]; - soup_triangles[offset + ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); - } - } - ); + soup_triangles.resize(offset + new_triangles.size()); + std::cout << "soup_triangles.size() = " << soup_triangles.size() << std::endl; + std::cout << "new_triangles.size() = " << new_triangles.size() << std::endl; + tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) { + if (offset + ti > soup_triangles.size()) { + std::cout << "ti = " << ti << std::endl; + } + const std::array& t = new_triangles[ti]; + soup_triangles[offset + ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); + } + } + ); - soup_points.reserve(soup_points.size() + concurrent_soup_points.size()); - soup_points.insert(soup_points.end(), concurrent_soup_points.begin(), concurrent_soup_points.end()); + soup_points.reserve(soup_points.size() + concurrent_soup_points.size()); + soup_points.insert(soup_points.end(), concurrent_soup_points.begin(), concurrent_soup_points.end()); } + else +#endif + { +#ifdef USE_DEBUG_PARALLEL_TIMERS + mode = "sequential"; #endif + soup_triangles.reserve(offset + new_triangles.size()); + for (const std::array& t : new_triangles) + soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + } From 388ae042c6913dca60fbf135edcd18ca6da67c62 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Wed, 31 May 2023 09:11:28 +0200 Subject: [PATCH 0323/1398] Fix typo --- Documentation/doc/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index 404d93efa663..f6cb41191d5e 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -403,7 +403,7 @@ else() endif() #special cases -foreach(pkg "Mesh_level") +foreach(pkg "Mesher_level") if(CGAL_BRANCH_BUILD) set(CGAL_${pkg}_INCLUDE_DIR "${CGAL_ROOT}/${pkg}/include") else() From 3d6c0da44cdf28be1ebfc4e7818ba78987c7209c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 31 May 2023 09:14:42 +0200 Subject: [PATCH 0324/1398] remove debug --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index ae383a4af293..18bbfa2ce40f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1323,9 +1323,9 @@ void autorefine_soup_output(const PointRange& input_points, CGAL_PMP_AUTOREFINE_VERBOSE("triangulate faces"); // now refine triangles #ifdef CGAL_LINKED_WITH_TBB - std::conditional_t>, - std::vector>> new_triangles; + std::conditional_t>, + std::vector>> new_triangles; #else std::vector> new_triangles; #endif @@ -1487,8 +1487,6 @@ void autorefine_soup_output(const PointRange& input_points, soup_triangles.resize(offset + new_triangles.size()); - std::cout << "soup_triangles.size() = " << soup_triangles.size() << std::endl; - std::cout << "new_triangles.size() = " << new_triangles.size() << std::endl; tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { From 8f0a9dd99685d6b7704b2297baede974b5a84543 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 31 May 2023 11:34:37 +0200 Subject: [PATCH 0325/1398] Fix two links --- Mesh_3/doc/Mesh_3/Mesh_3.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index 90afbe72b31b..4b4a67432708 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -296,7 +296,7 @@ also inserts a small set of auxiliary vertices that belong to the triangulation but are isolated from the complex at the end of the meshing process. These so-called \em isolated vertices belong to the triangulation but not to any cell -of the `C3T3`. They can be removed using the function `remove_isolated_vertices()`. +of the `C3T3`. They can be removed using the function `CGAL::Polygon_mesh_processing::remove_isolated_vertices()`. \section Mesh_3_section_interface Interface @@ -725,7 +725,7 @@ to the voxels surface, causing an aliasing effect. A solution to generate a smooth and accurate output surface was described by Stalling et al in \cgalCite{stalling1998weighted}. It consists in generating a second input image, made of integer coefficients called *weights*, and use those weights to define smoother domain boundaries. -The 3D image of weights can be generated using `CGAL::Mesh_3::generate_weights()` as shown in +The 3D image of weights can be generated using `CGAL::Mesh_3::generate_label_weights()` as shown in the following example. \cgalExample{Mesh_3/mesh_3D_weighted_image.cpp} From 21358ac490cad6635cb7198b7cbef268e78c9d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 31 May 2023 17:41:39 +0200 Subject: [PATCH 0326/1398] Clean CMakelists.txt --- Mesh_3/test/Mesh_3/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index 2a8e19e1c383..b0e9e250c27a 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -30,17 +30,14 @@ 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" ) create_single_source_cgal_program( "test_min_size_criteria.cpp") else() message(STATUS "NOTICE: The test 'test_meshing_3D_image' requires the ZLIB library, and will not be compiled.") endif() create_single_source_cgal_program( "test_meshing_implicit_function.cpp" ) -create_single_source_cgal_program( "test_meshing_implicit_function_deprecated.cpp" ) create_single_source_cgal_program( "test_meshing_polyhedral_complex.cpp" ) create_single_source_cgal_program( "test_meshing_polyhedron.cpp" ) create_single_source_cgal_program( "test_meshing_polylines_only.cpp" ) @@ -66,12 +63,9 @@ foreach(target test_mesh_criteria_creation 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 - test_meshing_implicit_function_deprecated test_meshing_polyhedral_complex test_meshing_polyhedron test_meshing_polylines_only From 163dd738d9b17facd54a9e9cfc2770b34354afda Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 5 Jun 2023 11:31:39 +0100 Subject: [PATCH 0327/1398] PSP: wlop_simplify() performance improvement --- .../include/CGAL/wlop_simplify_and_regularize_point_set.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h b/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h index 41412051408c..149944d50a29 100644 --- a/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h +++ b/Point_set_processing_3/include/CGAL/wlop_simplify_and_regularize_point_set.h @@ -525,6 +525,7 @@ wlop_simplify_and_regularize_point_set( if (require_uniform_sampling)//default value is false { + original_density_weights.reserve(number_of_original); //todo: this part could also be parallelized if needed for (it = first_original_iter, i = 0; it != points.end() ; ++it, ++i) { @@ -552,6 +553,7 @@ wlop_simplify_and_regularize_point_set( // Compute sample density weight for sample points std::vector sample_density_weights; + sample_density_weights.reserve(number_of_sample); for (sample_iter = sample_points.begin(); sample_iter != sample_points.end(); ++sample_iter) @@ -602,9 +604,7 @@ wlop_simplify_and_regularize_point_set( if (interrupted) return output; - sample_iter = sample_points.begin(); - for (std::size_t i = 0; i < sample_points.size(); ++ i) - sample_points[i] = update_sample_points[i]; + sample_points.swap(update_sample_points); } // final output From 854aacd671b9936730e97f8bf003bf2969e016fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 6 Jun 2023 15:31:19 +0200 Subject: [PATCH 0328/1398] add comments --- .../Triangle_3_Triangle_3_intersection.h | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 4cc5f9be5600..99dcd24ff457 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -59,6 +59,19 @@ coplanar_segment_segment_alpha_intersection(const typename K::Point_3& p1, const template struct Point_on_triangle { + // triangle points are not stored in this class but are expected + // to always be passed in the same order. For a triangle pqr, + // edge 0 is pq, edge 1 qr and edge 2 rp. Point 0 is p, 1 is q and 2 is r. + // + // (id, -1) point on t1 + // (-1, id) point on t2 + // (id1, id2) intersection of edges + std::pair t1_t2_ids; + boost::container::flat_set extra_t1; // store other ids of edges containing the point + typename Kernel::FT alpha; // + +////// + static inline const typename Kernel::Point_3& @@ -83,13 +96,7 @@ struct Point_on_triangle , alpha(alpha) {} - // (id, -1) point on t1 - // (-1, id) point on t2 - // (id1, id2) intersection of edges - std::pair t1_t2_ids; - boost::container::flat_set extra_t1; - typename Kernel::FT alpha; - + // orientation of the current point wrt to edge id1 (p1q1) Orientation orientation (const typename Kernel::Point_3& p1, // source of edge edge_id1 const typename Kernel::Point_3& q1, // target of edge edge_id1 @@ -116,7 +123,7 @@ struct Point_on_triangle CGAL_assertion((t1_t2_ids.first+1)%3==edge_id1); if (alpha==1) return ZERO; return alpha<=1?POSITIVE:NEGATIVE; - } + } else { //this is an input point of t2 @@ -129,6 +136,7 @@ struct Point_on_triangle int id1() const { return t1_t2_ids.first; } int id2() const { return t1_t2_ids.second; } + // construct the intersection point from the info stored typename Kernel::Point_3 point(const typename Kernel::Point_3& p1, const typename Kernel::Point_3& q1, @@ -147,6 +155,12 @@ struct Point_on_triangle } }; +// the intersection of two triangles is computed by interatively intersection t2 +// with halfspaces defined by edges of t1. The following function is called +// for each each on t1 on edge of the current intersection. +// pq is such an edge and p1q1 from t1 defines the halfspace intersection +// we are currently interseted in. We return the intersection point of +// pq with p1q1 template Point_on_triangle intersection(const Point_on_triangle& p, @@ -172,7 +186,7 @@ intersection(const Point_on_triangle& p, { switch(q.id1()) { - case -1: // (-1, ip2) - (-1, iq2) + case -1: // A: (-1, ip2) - (-1, iq2) { CGAL_assertion((p.id2()+1)%3 == q.id2() || (q.id2()+1)%3 == p.id2()); // CGAL_assertion(p.extra_t1.empty() && q.extra_t1.empty()); // TMP to see if it's worth implementing special case @@ -187,7 +201,7 @@ intersection(const Point_on_triangle& p, return Point_on_triangle(edge_id_t1, id2, alpha); // intersection with an original edge of t2 } default: - if (q.id2()!=-1) // (-1, ip2) - (iq1, iq2) + if (q.id2()!=-1) // B: (-1, ip2) - (iq1, iq2) { if (p.id2() == q.id2() || p.id2() == (q.id2()+1)%3) { @@ -210,7 +224,7 @@ intersection(const Point_on_triangle& p, int eid1 = p.extra_t1.count(q.id1())!=0 ? q.id1() : 3-q.id1()-edge_id_t1; return Point_on_triangle((eid1+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3, -1); // vertex of t1 } - // (-1, ip2) - (iq1, -1) + // C: (-1, ip2) - (iq1, -1) //vertex of t1, special case t1 edge passed thru a vertex of t2 CGAL_assertion(edge_id_t1 == 2); #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION @@ -229,7 +243,7 @@ intersection(const Point_on_triangle& p, { switch(q.id1()) { - case -1: // (ip1, -1) - (-1, iq2) + case -1: // G: (ip1, -1) - (-1, iq2) //vertex of t1, special case t1 edge passed thru a vertex of t2 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " -- case 5\n"; @@ -243,8 +257,8 @@ intersection(const Point_on_triangle& p, #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " -- case 6\n"; #endif - CGAL_assertion(q.id2()!=-1); // (ip1, -1) - (iq2, -1) - //(ip1,-1), (iq1, iq2) + CGAL_assertion(q.id2()!=-1); // I: (ip1, -1) - (iq2, -1) + //H: (ip1,-1), (iq1, iq2) CGAL_assertion(edge_id_t1==2); // p and q are on the same edge of t1 CGAL_assertion(p.id1()==q.id1() || p.id1()==(q.id1()+1)%3); @@ -256,7 +270,7 @@ intersection(const Point_on_triangle& p, { switch(q.id1()) { - case -1: // (ip1, ip2) - (-1, iq2) + case -1: // D: (ip1, ip2) - (-1, iq2) { if (q.id2() == p.id2() || q.id2() == (p.id2()+1)%3) { @@ -284,7 +298,7 @@ intersection(const Point_on_triangle& p, { switch(q.id2()) { - case -1: // (ip1, ip2) - (iq1, -1) + case -1: // F: (ip1, ip2) - (iq1, -1) { // p and q are on the same edge of t1 CGAL_assertion(q.id1()==p.id1() || q.id1()==(p.id1()+1)%3); @@ -293,7 +307,7 @@ intersection(const Point_on_triangle& p, #endif return Point_on_triangle((p.id1()+1)%3==edge_id_t1?edge_id_t1:(edge_id_t1+1)%3 , -1); } - default: // (ip1, ip2) - (iq1, iq2) + default: // E: (ip1, ip2) - (iq1, iq2) { if (p.id2()==q.id2()) { From 1c646c0db234adde54f900f0dcdbb4964815c5b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 7 Jun 2023 10:28:35 +0200 Subject: [PATCH 0329/1398] Do not take a const& to the oracle in AW3 No changes to existing oracles as AW3's oracles use a shared ptr to AABB Tree --- Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 20982e9beaaa..62c9f81c45d5 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -173,7 +173,7 @@ class Alpha_wrap_3 using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>; protected: - const Oracle& m_oracle; + const Oracle m_oracle; SC_Iso_cuboid_3 m_bbox; FT m_alpha, m_sq_alpha; From 5c8acef03564129faf1a214b915ec1403071115e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 7 Jun 2023 10:29:42 +0200 Subject: [PATCH 0330/1398] Add the possibility to interrupt AW3 (whether iterative visu is used or not) --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 1 + .../Alpha_wrap_3/Alpha_wrap_3_plugin.cpp | 558 +++++++++++++----- .../Alpha_wrap_3/alpha_wrap_3_dialog.ui | 370 ++++++------ 3 files changed, 598 insertions(+), 331 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 62c9f81c45d5..51d0fc17db42 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1343,6 +1343,7 @@ class Alpha_wrap_3 return true; } +public: // Not the best complexity, but it's very cheap compared to the rest of the algorithm. void make_manifold() { diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp index bb686a60f98e..bbee40716425 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp @@ -10,7 +10,6 @@ #include "Scene_points_with_normal_item.h" #include -#include #include #include @@ -20,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -31,44 +32,85 @@ #include "ui_alpha_wrap_3_dialog.h" -struct Iterative_AW3_visualization_visitor +using TS_Oracle = CGAL::Alpha_wraps_3::internal::Triangle_soup_oracle; +using SS_Oracle = CGAL::Alpha_wraps_3::internal::Segment_soup_oracle; +using Oracle = CGAL::Alpha_wraps_3::internal::Point_set_oracle; +using Wrapper = CGAL::Alpha_wraps_3::internal::Alpha_wrap_3; + +// Here is the pipeline for the interruption box: +// - The main window is connected to a wrapping thread, which performs the wrapping. +// - The wrapping has a visitor, AW3_interrupter_visitor, which has a shared_ptr to a Boolean +// - When the user clicks the box, the Boolean is switched to *false*, and the visitor throws +// - The wrapping thread catches the exception, and creates the wip mesh + +// Here is the pipeline for the iterative visualization: +// - The main window is connected to a wrapping thread, which performs the wrapping. +// - The wrapping has a visitor, Iterative_AW3_visualization_visitor +// - The visitor has a shared pointer to an emiter (can't emit directly from the visitor) +// - The visitor has shared pointers to a polygon soup (+ colors), which it updates itself +// before emitting a signal +// - There is a pause in the emition because it needs to wait for the main thread to draw the +// polygon soup before the visitor updates the polygon soup. + +struct Iterative_update_emiter + : public QObject { -private: - bool m_do_snapshot; - Scene_polygon_soup_item* m_iterative_wrap_item = nullptr; - int sid = 0; + Q_OBJECT public: - template - Iterative_AW3_visualization_visitor(Scene* scene, - const bool visualize_iterations, - const bool do_snapshot) - : m_do_snapshot(do_snapshot) + void emit_new_iteration(int sid) { - if(!visualize_iterations) - return; + Q_EMIT new_iteration(sid); + CGAL::Three::Three::getMutex()->lock(); + Three::getWaitCondition()->wait(CGAL::Three::Three::getMutex()); + CGAL::Three::Three::getMutex()->unlock(); + } - m_iterative_wrap_item = new Scene_polygon_soup_item(); - m_iterative_wrap_item->setName(QString("Iterative wrap")); - scene->addItem(m_iterative_wrap_item); + void emit_last_iteration(int sid) + { + // Last iteration only updates the (existing) soup item's properties, but there is no change + // in geometry, so there is no need to wait for the main thread to update the main window. + Q_EMIT last_iteration(sid); } -public: - template - void on_alpha_wrapping_begin(const AlphaWrapper&) { } +Q_SIGNALS: + void new_iteration(int); + void last_iteration(int sid); +}; - template - void on_flood_fill_begin(const AlphaWrapper&) { } +struct Iterative_AW3_visualization_visitor + : public CGAL::Alpha_wraps_3::internal::Wrapping_default_visitor +{ +private: + const bool visualize_iterations; - template - void before_facet_treatment(const AlphaWrapper&, - const Facet&) { } + std::shared_ptr > points; + std::shared_ptr > > faces; + std::shared_ptr > fcolors; + std::shared_ptr > vcolors; + std::shared_ptr emiter; + int sid = 0; + +public: + Iterative_AW3_visualization_visitor(const bool visualize_iterations, + std::shared_ptr > points, + std::shared_ptr > > faces, + std::shared_ptr > fcolors, + std::shared_ptr > vcolors, + std::shared_ptr emiter) + : visualize_iterations(visualize_iterations), + points(points), faces(faces), fcolors(fcolors), vcolors(vcolors), + emiter(emiter) + { } template void before_Steiner_point_insertion(const AlphaWrapper& wrapper, const Point& /* p */) { - if(m_iterative_wrap_item == nullptr) + if(!visualize_iterations) + return; + + if(!points || !faces || !fcolors || !vcolors) return; // If the next top of the queue has vertices on the bbox, don't draw (as to avoid producing @@ -82,18 +124,20 @@ struct Iterative_AW3_visualization_visitor return; // Extract the wrap as a triangle soup + points->clear(); + faces->clear(); + fcolors->clear(); + vcolors->clear(); using Dt = typename std::decay::type; using Vertex_handle = typename Dt::Vertex_handle; using Facet = typename Dt::Facet; using Cell_handle = typename Dt::Cell_handle; - std::vector points; - std::vector > faces; - std::unordered_map vertex_to_id; std::size_t nv = 0; +#if 0 // This is used to compute colors depending on what is old and what is new. // It is not currently used (a uniform gray color is used), but leaving it as it might be useful. std::size_t min_time_stamp = -1, max_time_stamp = 0; @@ -104,9 +148,7 @@ struct Iterative_AW3_visualization_visitor if(cit->time_stamp() < min_time_stamp) min_time_stamp = cit->time_stamp(); } - - std::vector vcolors; - std::vector fcolors; +#endif for(auto fit=wrapper.triangulation().finite_facets_begin(), fend=wrapper.triangulation().finite_facets_end(); fit!=fend; ++fit) { @@ -127,85 +169,143 @@ struct Iterative_AW3_visualization_visitor auto insertion_res = vertex_to_id.emplace(vh, nv); if(insertion_res.second) // successful insertion, never-seen-before vertex { - points.push_back(wrapper.triangulation().point(vh)); - vcolors.push_back(CGAL::IO::Color(0, 0, 0)); + points->push_back(wrapper.triangulation().point(vh)); + vcolors->push_back(CGAL::IO::Color(0, 0, 0)); ++nv; } ids[pos] = insertion_res.first->second; } - faces.emplace_back(std::vector{ids[0], ids[1], ids[2]}); - double color_val = double(c->time_stamp() - min_time_stamp) / double(max_time_stamp - min_time_stamp); - color_val = int(256. * color_val); + faces->emplace_back(std::vector{ids[0], ids[1], ids[2]}); - // fcolors.push_back(CGAL::IO::Color(color_val, 10, 150)); // young is red, old is blue +#if 0 + double color_val = double(c->time_stamp() - min_time_stamp) / double(max_time_stamp - min_time_stamp); + color_val = int(256. * color_val); + fcolors.push_back(CGAL::IO::Color(color_val, 10, 150)); // young is red, old is blue // fcolors.push_back(CGAL::IO::Color(256 - color_val, 256 - color_val, 256 - color_val)); // young is light, old is dark - fcolors.push_back(CGAL::IO::Color(100, 100, 100)); // uniform darkish gray +#endif + fcolors->push_back(CGAL::IO::Color(100, 100, 100)); // uniform darkish gray } - // Update the wrap item's visualization - m_iterative_wrap_item->load(points, faces, fcolors, vcolors); - m_iterative_wrap_item->setName(QString("Iterative wrap #%1").arg(sid)); - m_iterative_wrap_item->setAlpha(255 / 2); + emiter->emit_new_iteration(sid++); + } - m_iterative_wrap_item->invalidateOpenGLBuffers(); - m_iterative_wrap_item->redraw(); - m_iterative_wrap_item->itemChanged(); + template + void on_alpha_wrapping_end(const AlphaWrapper&) + { + if(!visualize_iterations) + return; - // Refresh the view - QApplication::processEvents(); + emiter->emit_last_iteration(sid); + } +}; - if(m_do_snapshot) - { - std::stringstream oss; - oss << "Wrap_iteration-" << sid << ".png" << std::ends; - QString filename = QString::fromStdString(oss.str().c_str()); +// Use a throw to get out of the AW3 refinement loop +class Out_of_patience_exception : public std::exception { }; - CGAL::Three::Viewer_interface* viewer = CGAL::Three::Three::activeViewer(); - viewer->saveSnapshot(filename, 1920, 1080, true /*expand*/, 2.0 /*oversampling*/); - } +template +struct AW3_interrupter_visitor + : BaseVisitor +{ + // shared pointer because visitors are copied + std::shared_ptr should_stop = std::make_shared(false); + + AW3_interrupter_visitor(const BaseVisitor base) + : BaseVisitor(base) + { } - ++sid; + // Only overload this one because it gives a better state of the wrap (for other visitor calls, + // we often get tetrahedral spikes because there are artificial gates in the queue) + template + void before_Steiner_point_insertion(const Wrapper& wrapper, const Point& p) + { + if(*should_stop) + throw Out_of_patience_exception(); + + return BaseVisitor::before_Steiner_point_insertion(wrapper, p); } +}; - template - void after_Steiner_point_insertion(const AlphaWrapper&, - const VertexHandle) { } +struct Wrapper_thread + : public QThread +{ + Q_OBJECT - template - void on_flood_fill_end(const AlphaWrapper&) { } + using Visitor = AW3_interrupter_visitor; - template - void on_alpha_wrapping_end(const AlphaWrapper&) +public: + Wrapper wrapper; + const Oracle oracle; + const double alpha, offset; + const bool enforce_manifoldness; + Visitor visitor; + + SMesh wrap; + + QTimer* timer; + +public: + Wrapper_thread(const Oracle& oracle, + const double alpha, + const double offset, + const bool enforce_manifoldness, + Visitor visitor) + : wrapper(oracle), + alpha(alpha), offset(offset), + enforce_manifoldness(enforce_manifoldness), + visitor(visitor), + timer(new QTimer(this)) { - if(m_iterative_wrap_item == nullptr) - return; + connect(timer, SIGNAL(timeout()), + this, SLOT(emit_status())); - m_iterative_wrap_item->setName(QString("Iterative wrap #%1").arg(sid)); + timer->start(1000); + } - m_iterative_wrap_item->setAlpha(255); - m_iterative_wrap_item->invalidateOpenGLBuffers(); - m_iterative_wrap_item->redraw(); - m_iterative_wrap_item->itemChanged(); + ~Wrapper_thread() + { + delete timer; + } - QApplication::processEvents(); + void run() override + { + QElapsedTimer elapsed_timer; + elapsed_timer.start(); - if(m_do_snapshot) + // try-catch because the stop visitor currently uses a throw + try { - std::stringstream oss; - oss << "Wrap_iteration-" << sid << ".png" << std::ends; - QString filename = QString::fromStdString(oss.str().c_str()); + wrapper(alpha, offset, wrap, + CGAL::parameters::do_enforce_manifoldness(enforce_manifoldness) + .visitor(visitor)); - CGAL::Three::Viewer_interface* viewer = CGAL::Three::Three::activeViewer(); - viewer->saveSnapshot(filename); + Q_EMIT done(this); } + catch(const Out_of_patience_exception&) + { + if(enforce_manifoldness) + wrapper.make_manifold(); - m_iterative_wrap_item->setVisible(false); + // extract the wrap in its current state + wrapper.extract_surface(wrap, CGAL::get(CGAL::vertex_point, wrap), !enforce_manifoldness); - // Refresh the view - QApplication::processEvents(); + Q_EMIT interrupted(this); + } + + std::cout << "Wrapping took " << elapsed_timer.elapsed() / 1000. << "s" << std::endl; } + +public Q_SLOTS: + void emit_status() + { + Q_EMIT status_report(QString("%1 vertices").arg(wrapper.triangulation().number_of_vertices())); + } + +Q_SIGNALS: + void interrupted(Wrapper_thread*); + void done(Wrapper_thread*); + void status_report(QString); }; class Polyhedron_demo_alpha_wrap_3_plugin @@ -220,17 +320,24 @@ class Polyhedron_demo_alpha_wrap_3_plugin using Segments = std::vector; using Points = std::vector; - using TS_Oracle = CGAL::Alpha_wraps_3::internal::Triangle_soup_oracle; - using SS_Oracle = CGAL::Alpha_wraps_3::internal::Segment_soup_oracle; - using Oracle = CGAL::Alpha_wraps_3::internal::Point_set_oracle; - private: - CGAL::Bbox_3 wrap_bbox; - double wrap_bbox_diag_length; + CGAL::Bbox_3 m_wrap_bbox; + double m_wrap_bbox_diag_length; - QAction* actionAlpha_wrap_3_; + QAction* actionAlpha_wrap_3_ = nullptr; Ui::alpha_wrap_3_dialog ui; + // GUI for the interruption + QMessageBox* m_message_box = nullptr; + + // storage of intermediate wraps for iterative visualization + std::shared_ptr > m_iter_points; + std::shared_ptr > > m_iter_faces; + std::shared_ptr > m_iter_fcolors; + std::shared_ptr > m_iter_vcolors; + Scene_polygon_soup_item* m_iterative_wrap_item = nullptr; + bool m_do_snapshot = false; + public: void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, @@ -241,26 +348,30 @@ class Polyhedron_demo_alpha_wrap_3_plugin actionAlpha_wrap_3_ = new QAction("3D Alpha Wrapping", this->mw); if(actionAlpha_wrap_3_) - connect(actionAlpha_wrap_3_, SIGNAL(triggered()), this, SLOT(on_actionAlpha_wrap_3_triggered())); + { + connect(actionAlpha_wrap_3_, SIGNAL(triggered()), + this, SLOT(on_actionAlpha_wrap_3_triggered())); + } } bool applicable(QAction*) const { + if(scene->selectionIndices().empty()) + return false; + Q_FOREACH(int index, scene->selectionIndices()) { - if(qobject_cast(scene->item(index))) - return true; - if(qobject_cast(scene->item(index))) - return true; - if(qobject_cast(scene->item(index))) - return true; - if(qobject_cast(scene->item(index))) - return true; - if(qobject_cast(scene->item(index))) - return true; + if(!qobject_cast(scene->item(index)) && + !qobject_cast(scene->item(index)) && + !qobject_cast(scene->item(index)) && + !qobject_cast(scene->item(index)) && + !qobject_cast(scene->item(index))) + { + return false; + } } - return false; + return true; } QList actions() const @@ -275,28 +386,29 @@ class Polyhedron_demo_alpha_wrap_3_plugin } public Q_SLOTS: + // This is UI stuff void on_alphaValue_changed(double) { QSignalBlocker block(ui.relativeAlphaValue); - ui.relativeAlphaValue->setValue(wrap_bbox_diag_length / ui.alphaValue->value()); + ui.relativeAlphaValue->setValue(m_wrap_bbox_diag_length / ui.alphaValue->value()); } void on_relativeAlphaValue_changed(double) { QSignalBlocker block(ui.alphaValue); - ui.alphaValue->setValue(wrap_bbox_diag_length / ui.relativeAlphaValue->value()); + ui.alphaValue->setValue(m_wrap_bbox_diag_length / ui.relativeAlphaValue->value()); } void on_offsetValue_changed(double) { QSignalBlocker block(ui.relativeOffsetValue); - ui.relativeOffsetValue->setValue(wrap_bbox_diag_length / ui.offsetValue->value()); + ui.relativeOffsetValue->setValue(m_wrap_bbox_diag_length / ui.offsetValue->value()); } void on_relativeOffsetValue_changed(double) { QSignalBlocker block(ui.offsetValue); - ui.offsetValue->setValue(wrap_bbox_diag_length / ui.relativeOffsetValue->value()); + ui.offsetValue->setValue(m_wrap_bbox_diag_length / ui.relativeOffsetValue->value()); } void update_iteration_snapshot_checkbox() @@ -304,6 +416,108 @@ public Q_SLOTS: ui.snapshotIterations->setCheckable(ui.visualizeIterations->isChecked()); } + // This is for the visualization + void update_iterative_wrap_item(int sid) + { + if(m_iterative_wrap_item == nullptr) + return; + + // Update the wrap item's visualization + m_iterative_wrap_item->load(*m_iter_points, *m_iter_faces, *m_iter_fcolors, *m_iter_vcolors); + m_iterative_wrap_item->setName(QString("Iterative wrap #%1").arg(sid)); + m_iterative_wrap_item->setAlpha(255 / 2); + m_iterative_wrap_item->setRenderingMode(FlatPlusEdges); + + m_iterative_wrap_item->invalidateOpenGLBuffers(); + m_iterative_wrap_item->redraw(); + m_iterative_wrap_item->itemChanged(); + + // Refresh the view + CGAL::Three::Viewer_interface* viewer = CGAL::Three::Three::activeViewer(); + viewer->update(); + + CGAL::Three::Three::getWaitCondition()->wakeAll(); + + if(m_do_snapshot) + { + std::stringstream oss; + oss << "Wrap_iteration-" << sid << ".png" << std::ends; + QString filename = QString::fromStdString(oss.str().c_str()); + + viewer->saveSnapshot(filename, 1920, 1080, true /*expand*/, 2.0 /*oversampling*/); + } + } + + void finish_iterative_wrap_item(int sid) + { + if(m_iterative_wrap_item == nullptr) + return; + + if(m_do_snapshot) + { + m_iterative_wrap_item->setName(QString("Iterative wrap #%1").arg(sid)); + + m_iterative_wrap_item->setAlpha(255); + m_iterative_wrap_item->invalidateOpenGLBuffers(); + m_iterative_wrap_item->redraw(); + m_iterative_wrap_item->itemChanged(); + + // Refresh the view + CGAL::Three::Viewer_interface* viewer = CGAL::Three::Three::activeViewer(); + viewer->update(); + + std::stringstream oss; + oss << "Wrap_iteration-" << sid << ".png" << std::ends; + QString filename = QString::fromStdString(oss.str().c_str()); + + viewer->saveSnapshot(filename); + } + + CGAL_assertion(m_iterative_wrap_item); + scene->erase(scene->item_id(m_iterative_wrap_item)); + } + + void reset_iterative_wrap_item() + { + m_iterative_wrap_item = nullptr; + } + + // This is for the message box and thread interruption + void wrapping_done(Wrapper_thread* wrapper_thread) + { + Scene_surface_mesh_item* wrap_item = new Scene_surface_mesh_item(wrapper_thread->wrap); + wrap_item->setName(tr("Wrap with alpha %2 offset %3").arg(wrapper_thread->alpha) + .arg(wrapper_thread->offset)); + wrap_item->setColor(Qt::gray); + const int wrap_item_id = scene->addItem(wrap_item); + scene->setSelectedItem(wrap_item_id); + + wrapper_thread->terminate(); + wrapper_thread->wait(); + delete wrapper_thread; + + if(m_message_box) + { + m_message_box->done(0); + m_message_box = nullptr; + } + } + + // In case we wish to do something more one day + void wrapping_interrupted(Wrapper_thread* wrapper_thread) + { + wrapping_done(wrapper_thread); + } + + void status_report(const QString& msg) + { + if(m_message_box == nullptr) + return; + + m_message_box->setInformativeText(msg); + } + + // Main call void on_actionAlpha_wrap_3_triggered() { QDialog dialog(mw); @@ -341,7 +555,7 @@ public Q_SLOTS: boost::graph_traits::halfedge_descriptor h = halfedge(f, *pMesh); if(!is_triangle(h, *pMesh)) { - print_message("Warning: non-triangular face in input"); + print_message("Warning: a non-triangular face in input has been ignored"); continue; } @@ -349,7 +563,7 @@ public Q_SLOTS: get(vpm, target(next(h, *pMesh), *pMesh)), get(vpm, source(h, *pMesh))); - wrap_bbox += triangles.back().bbox(); + m_wrap_bbox += triangles.back().bbox(); } continue; @@ -365,7 +579,7 @@ public Q_SLOTS: { if(p.size() != 3) { - print_message("Warning: non-triangular face in input"); + print_message("Warning: a non-triangular face in input has been ignored"); continue; } @@ -373,7 +587,7 @@ public Q_SLOTS: soup_item->points()[p[1]], soup_item->points()[p[2]]); - wrap_bbox += triangles.back().bbox(); + m_wrap_bbox += triangles.back().bbox(); } continue; @@ -393,7 +607,7 @@ public Q_SLOTS: boost::graph_traits::halfedge_descriptor h = halfedge(f, *pMesh); if(!is_triangle(h, *pMesh)) { - print_message("Warning: non-triangular face in input"); + print_message("Warning: a non-triangular face in input has been ignored"); continue; } @@ -401,7 +615,7 @@ public Q_SLOTS: get(vpm, target(next(h, *pMesh), *pMesh)), get(vpm, source(h, *pMesh))); - wrap_bbox += triangles.back().bbox(); + m_wrap_bbox += triangles.back().bbox(); } segments.reserve(segments.size() + selection_item->selected_edges.size()); @@ -410,7 +624,7 @@ public Q_SLOTS: segments.emplace_back(get(vpm, target(halfedge(e, *pMesh), *pMesh)), get(vpm, target(opposite(halfedge(e, *pMesh), *pMesh), *pMesh))); - wrap_bbox += segments.back().bbox(); + m_wrap_bbox += segments.back().bbox(); } points.reserve(points.size() + selection_item->selected_vertices.size()); @@ -418,7 +632,7 @@ public Q_SLOTS: { points.push_back(get(vpm, v)); - wrap_bbox += points.back().bbox(); + m_wrap_bbox += points.back().bbox(); } continue; @@ -460,14 +674,14 @@ public Q_SLOTS: // The relative value uses the bbox of the full scene and not that of selected items to wrap // This is intentional, both because it's tedious to make it otherwise, and because it seems // to be simpler to compare between "all wrapped" / "some wrapped" - wrap_bbox_diag_length = std::sqrt(CGAL::square(wrap_bbox.xmax() - wrap_bbox.xmin()) + - CGAL::square(wrap_bbox.ymax() - wrap_bbox.ymin()) + - CGAL::square(wrap_bbox.zmax() - wrap_bbox.zmin())); + m_wrap_bbox_diag_length = std::sqrt(CGAL::square(m_wrap_bbox.xmax() - m_wrap_bbox.xmin()) + + CGAL::square(m_wrap_bbox.ymax() - m_wrap_bbox.ymin()) + + CGAL::square(m_wrap_bbox.zmax() - m_wrap_bbox.zmin())); ui.relativeAlphaValue->setValue(20.); ui.relativeOffsetValue->setValue(600.); - ui.alphaValue->setValue(wrap_bbox_diag_length / ui.relativeAlphaValue->value()); - ui.offsetValue->setValue(wrap_bbox_diag_length / ui.relativeOffsetValue->value()); + ui.alphaValue->setValue(m_wrap_bbox_diag_length / ui.relativeAlphaValue->value()); + ui.offsetValue->setValue(m_wrap_bbox_diag_length / ui.relativeOffsetValue->value()); // EXECUTION int i = dialog.exec(); @@ -476,16 +690,6 @@ public Q_SLOTS: QApplication::setOverrideCursor(Qt::WaitCursor); - Q_FOREACH(int index, this->scene->selectionIndices()) - { - Scene_surface_mesh_item* sm_item = qobject_cast(this->scene->item(index)); - if(sm_item != nullptr) - sm_item->setRenderingMode(Flat); - Scene_polygon_soup_item* soup_item = qobject_cast(scene->item(index)); - if(soup_item != nullptr) - soup_item->setRenderingMode(Flat); - } - const bool wrap_triangles = ui.wrapTriangles->isChecked(); const bool wrap_segments = ui.wrapSegments->isChecked(); const bool wrap_points = ui.wrapPoints->isChecked(); @@ -495,9 +699,12 @@ public Q_SLOTS: const bool enforce_manifoldness = ui.runManifoldness->isChecked(); const bool visualize_iterations = ui.visualizeIterations->isChecked(); - const bool do_snapshot_iterations = ui.snapshotIterations->isChecked(); + m_do_snapshot = ui.snapshotIterations->isChecked(); + + const bool use_message_box = ui.enableMessageBox->isChecked(); - std::cout << "do wrap edges/faces: " << wrap_segments << " " << wrap_triangles << std::endl; + std::cout << "Wrapping edges? " << std::boolalpha << wrap_segments << std::endl; + std::cout << "Wrapping faces? " << std::boolalpha << wrap_triangles << std::endl; if(!wrap_triangles) { @@ -554,22 +761,91 @@ public Q_SLOTS: return; } - // Oracles are now set up, main function call - CGAL::Alpha_wraps_3::internal::Alpha_wrap_3 aw3(oracle); + // Switch from 'wait' to 'busy' + QApplication::restoreOverrideCursor(); + QApplication::setOverrideCursor(Qt::BusyCursor); + + Q_FOREACH(int index, this->scene->selectionIndices()) + { + Scene_surface_mesh_item* sm_item = qobject_cast(this->scene->item(index)); + if(sm_item != nullptr) + sm_item->setRenderingMode(Flat); + Scene_polygon_soup_item* soup_item = qobject_cast(scene->item(index)); + if(soup_item != nullptr) + soup_item->setRenderingMode(Flat); + } + + if(visualize_iterations) + { + m_iterative_wrap_item = new Scene_polygon_soup_item(); + m_iterative_wrap_item->setName(QString("Iterative wrap")); + const int iterative_wrap_item_id = scene->addItem(m_iterative_wrap_item); + scene->setSelectedItem(iterative_wrap_item_id); + + // Deal with independent (e.g. manual from the main window) destruction of the iterative item + connect(m_iterative_wrap_item, SIGNAL(aboutToBeDestroyed()), + this, SLOT(reset_iterative_wrap_item())); + } + + // Visitors + m_iter_points = std::make_shared >(); + m_iter_faces = std::make_shared > >(); + m_iter_fcolors = std::make_shared >(); + m_iter_vcolors = std::make_shared >(); + std::shared_ptr emiter = std::make_shared(); + Iterative_AW3_visualization_visitor visu_visitor(visualize_iterations, m_iter_points, m_iter_faces, m_iter_fcolors, m_iter_vcolors, emiter); + AW3_interrupter_visitor visitor(visu_visitor); + + connect(emiter.get(), SIGNAL(new_iteration(int)), + this, SLOT(update_iterative_wrap_item(int))); + connect(emiter.get(), SIGNAL(last_iteration(int)), + this, SLOT(finish_iterative_wrap_item(int))); + + Wrapper_thread* wrapper_thread = new Wrapper_thread(oracle, alpha, offset, enforce_manifoldness, visitor); + if(wrapper_thread == nullptr) + { + QMessageBox::critical(mw, tr(""), tr("ERROR: failed to create thread")); + return; + } - Iterative_AW3_visualization_visitor visitor(scene, - visualize_iterations, - do_snapshot_iterations); + // Connect main thread to wrapping thread + QObject::connect(wrapper_thread, SIGNAL(done(Wrapper_thread*)), + this, SLOT(wrapping_done(Wrapper_thread*))); + QObject::connect(wrapper_thread, SIGNAL(interrupted(Wrapper_thread*)), + this, SLOT(wrapping_interrupted(Wrapper_thread*))); + QObject::connect(wrapper_thread, SIGNAL(status_report(QString)), + this, SLOT(status_report(QString))); + + // Launch thread + CGAL::Three::Three::getMutex()->lock(); + CGAL::Three::Three::isLocked() = true; + CGAL::Three::Three::getMutex()->unlock(); + + // Create message box with stop button + if(use_message_box) + { + m_message_box = new QMessageBox(QMessageBox::NoIcon, + "Wrapping", + "Wrapping in progress...", + QMessageBox::Cancel, + mw); + m_message_box->setDefaultButton(QMessageBox::Cancel); + QAbstractButton* cancelButton = m_message_box->button(QMessageBox::Cancel); + cancelButton->setText(tr("Stop")); + + // Connect the message box to the thread + connect(cancelButton, &QAbstractButton::clicked, + this, [wrapper_thread]() { *(wrapper_thread->visitor.should_stop) = true; }); + + m_message_box->open(); + } - SMesh wrap; - aw3(alpha, offset, wrap, - CGAL::parameters::do_enforce_manifoldness(enforce_manifoldness) - .visitor(visitor)); + // Actual start + wrapper_thread->start(); - Scene_surface_mesh_item* wrap_item = new Scene_surface_mesh_item(wrap); - wrap_item->setName(tr("Wrap with alpha %2 offset %3").arg(alpha).arg(offset)); - wrap_item->setColor(Qt::gray); - scene->addItem(wrap_item); + CGAL::Three::Three::getMutex()->lock(); + CGAL::Three::Three::isLocked() = false; + CGAL::Three::Three::getMutex()->unlock(); QApplication::restoreOverrideCursor(); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/alpha_wrap_3_dialog.ui b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/alpha_wrap_3_dialog.ui index cc6cce927223..c02ccc3b17d3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/alpha_wrap_3_dialog.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/alpha_wrap_3_dialog.ui @@ -9,7 +9,7 @@ 0 0 - 646 + 839 673 @@ -17,47 +17,57 @@ 3D Alpha Wrapping + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + 3D Alpha Wrapping - - - - Offset value (absolute): - - - - - + + - <html><head/><body><p>Offset value (relative):<br/><span style=" font-size:9pt;">As ratio of the length of the bbox's diagonal<br/>(i.e., value </span><span style=" font-size:9pt; font-style:italic;">x </span><span style=" font-size:9pt;">means </span><span style=" font-size:9pt; font-style:italic;">offset := bbox_diag_l / x)</span></p></body></html> + - - - - 10 - - - 0.000000000000000 - - - 100000000.000000000000000 + + + + true - - 1.000000000000000 + + <html><head/><body><p>Enforce 2-manifold output</p></body></html> - - 0.000000000000000 + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + Qt::Vertical @@ -69,41 +79,8 @@ - - - - 10 - - - 0.000000000000000 - - - 10000000.000000000000000 - - - 1.000000000000000 - - - 0.000000000000000 - - - - - - - <html><head/><body><p>Snapshot iterations<br/><span style=" font-size:9pt;">For each iteration, save a snapshot of the viewer <br/>to a file named </span><span style=" font-size:9pt; font-style:italic;">Wrap-iteration_i.png</span></p></body></html> - - - - - - - Qt::Horizontal - - - - - + + Qt::Vertical @@ -115,22 +92,22 @@ - - + + - Visualize iterations + <html><head/><body><p>Wrap faces / triangles</p></body></html> - - + + - <html><head/><body><p>Alpha value (absolute):</p></body></html> + <html><head/><body><p align="center">Absolute value</p></body></html> - - + + @@ -139,8 +116,15 @@ - - + + + + Qt::Horizontal + + + + + Qt::Vertical @@ -152,50 +136,79 @@ - - + + + + 7 + + + 0.000000000000000 + + + 10000000.000000000000000 + + + 1.000000000000000 + + + 0.000000000000000 + + + + + - + <html><head/><body><p align="center">Relative value<br/><span style=" font-size:9pt;">As the ratio of the length of the bbox's diagonal<br/>(i.e., a value </span><span style=" font-size:9pt; font-style:italic;">x </span><span style=" font-size:9pt;">means value</span><span style=" font-size:9pt; font-style:italic;"> := bbox_diag_l / x)</span></p></body></html> - - true + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + + + Visualize iterations + + + + + Qt::Horizontal - - + + - - - - true + <html><head/><body><p>Wrap edges / segments</p></body></html> - - - - Qt::Vertical + + + + 7 - - - 20 - 40 - + + 0.000000000000000 - + + 100000000.000000000000000 + + + 1.000000000000000 + + + 0.000000000000000 + + - + - 10 + 7 0.000000000000000 @@ -211,17 +224,44 @@ - - + + - - false + + true + + + + + + + Qt::Horizontal + + + + + + + Offset value: - + + + + Qt::Vertical + + + + 20 + 40 + + + + + Qt::Vertical @@ -234,49 +274,32 @@ - - + + Wrap points / vertices - - - - Qt::Horizontal - - - - - - - true - + + - <html><head/><body><p>Enforce 2-manifold output</p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + <html><head/><body><p>Alpha value:</p></body></html> - - + + - - - - - - <html><head/><body><p>Wrap faces / triangles</p></body></html> + + true - - + + @@ -285,10 +308,10 @@ - - + + - 10 + 7 0.000000000000000 @@ -304,87 +327,54 @@ - - + + - <html><head/><body><p>Alpha value (relative):<br/><span style=" font-size:9pt;">As the ratio of the length of the bbox's diagonal<br/>(i.e., value </span><span style=" font-size:9pt; font-style:italic;">x </span><span style=" font-size:9pt;">means alpha</span><span style=" font-size:9pt; font-style:italic;"> := bbox_diag_l / x)</span></p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + <html><head/><body><p>Snapshot iterations<br/><span style=" font-size:9pt;">For each iteration, save a snapshot of the viewer <br/>to a file named </span><span style=" font-size:9pt; font-style:italic;">Wrap-iteration_i.png</span></p></body></html> - - - - Qt::Vertical - - - - 20 - 40 - + + + + <html><head/><body><p>Enable interruption </p></body></html> - + - - + + - <html><head/><body><p>Wrap edges / segments</p></body></html> + + + + true - - - - Qt::Vertical + + + + - - - 20 - 40 - + + false - + + false + + - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - alphaValue - relativeAlphaValue - offsetValue - relativeOffsetValue wrapTriangles wrapSegments runManifoldness visualizeIterations - snapshotIterations From 0551cefa5d315c4071dec5c1118bceaaa6bdfcdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 7 Jun 2023 15:02:10 +0200 Subject: [PATCH 0331/1398] add more test from errors while testing thingi10k models --- .../triangle_3_triangle_3_intersection.cpp | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Intersections_3/test/Intersections_3/triangle_3_triangle_3_intersection.cpp b/Intersections_3/test/Intersections_3/triangle_3_triangle_3_intersection.cpp index 0098bcd01422..f0875a55ee8b 100644 --- a/Intersections_3/test/Intersections_3/triangle_3_triangle_3_intersection.cpp +++ b/Intersections_3/test/Intersections_3/triangle_3_triangle_3_intersection.cpp @@ -96,6 +96,13 @@ void test_coplanar_triangles(){ assert(CGAL::object_cast(&obj)!=nullptr); obj=CGAL::intersection(t2,t1); assert(CGAL::object_cast(&obj)!=nullptr); + // TK10 case C' + t1=Triangle(Point(88.7921, 89.0007, 1.25), Point(88.1912, 88.3997, 1.25), Point(89.8224, 90.031, 1.25)); + t2=Triangle(Point(88.0497, 88.2583, 1.25), Point(82.9292, 81.8747, 1.25), Point(91.1726, 91.3812, 1.25)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); //Intersection is a point //edges are collinear, one vertex in common t1=Triangle( Point(0,0,0),Point(0,1,0),Point(1,0,0) ); @@ -153,6 +160,13 @@ void test_coplanar_triangles(){ assert(CGAL::object_cast(&obj)!=nullptr); obj=CGAL::intersection(t2,t1); assert(CGAL::object_cast(&obj)!=nullptr); + // TK10 case D + t1=Triangle(Point(-34.893700000000003, -16.0351, 3.1334899999999998e-12), Point(-34.893700000000003, -18.5351, 3.1334899999999998e-12), Point(-42.393700000000003, -16.0351, 3.1334899999999998e-12)); + t2=Triangle(Point(-34.893700000000003, -32.0351, 3.1334899999999998e-12), Point(-34.893700000000003, -9.7851400000000002, 3.1334899999999998e-12), Point(-31.643699999999999, -17.201799999999999, 3.1334899999999998e-12)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); //Intersection is a polygon //David's star t1=Triangle( Point(0,0,0),Point(1,0,0),Point(0.5,1.5,0) ); @@ -181,6 +195,51 @@ void test_coplanar_triangles(){ obj=CGAL::intersection(t2,t1); assert(CGAL::object_cast(&obj)!=nullptr); assert(CGAL::object_cast(&obj)->size()==4); + // TK10 case A + t1=Triangle(Point(3.74861, 12.4822, 14.0112), Point(5.40582, 12.4822, 15.6895), Point(5.37748, 12.4822, 15.7206)); + t2=Triangle(Point(5.49972, 12.4822, 13.491), Point(5.27627, 12.4822, 15.8106), Point(5.32119, 12.4822, 15.8126)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + // TK10 case C + t1=Triangle(Point(5, -94.6659, 3.85175), Point(5, -94.5682, 3.08638), Point(5, -94.8182, 3.08638)); + t2=Triangle(Point(5, -94.4317, 3.76399), Point(5, -97.6182, 3.08638), Point(5, -94.5659, 2.99682)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + // TK10 case E + t1=Triangle(Point(-955.858, -45.032, -0.016), Point(-955.856, -45.032, -0.004), Point(-955.856, -45.032, -0.002)); + t2=Triangle(Point(-955.856, -45.032, 0.006), Point(-955.854, -45.032, -0.002), Point(-955.876, -45.032, -0.034)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + // TK10 case F + t1=Triangle(Point(141.172, 20.576, 155.764), Point(141.172, 20.588, 155.766), Point(141.172, 20.59, 155.766)); + t2=Triangle(Point(141.172, 20.602, 155.768), Point(141.172, 20.594, 155.766), Point(141.172, 20.574, 155.764)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + // TK10 case D + t1=Triangle(Point(152.864, 126.324, 0.950001), Point(152.77, 126.483, 0.950001), Point(153.072, 125.973, 0.950001)); + t2=Triangle(Point(153.322, 125.551, 0.950001), Point(152.218, 127.415, 0.950001), Point(153.66, 124.768, 0.950001)); + obj=CGAL::intersection(t1,t2); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); + obj=CGAL::intersection(t2,t1); + assert(CGAL::object_cast(&obj)!=nullptr); + assert(CGAL::object_cast(&obj)->size()==4); //Intersection is empty t1=Triangle( Point(0,0,0),Point(0,1,0),Point(1,0,0) ); t2=Triangle( Point(-0.1,-0.1,0),Point(-0.1,-0.9,0),Point(-1,-0.1,0) ); From 48712f7862f02ce63558de039c603e0d018ae31d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 8 Jun 2023 14:04:55 +0200 Subject: [PATCH 0332/1398] don't use c++17 features --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 18bbfa2ce40f..6b664ec360bc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1128,7 +1128,7 @@ void autorefine_soup_output(const PointRange& input_points, Sequential_tag > ::type Concurrency_tag; - constexpr bool parallel_execution = std::is_same_v; + constexpr bool parallel_execution = std::is_same::value; #ifndef CGAL_LINKED_WITH_TBB CGAL_static_assertion_msg (parallel_execution, From 003bf47781ef69354d9cd388f2fce00168c2e762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 8 Jun 2023 14:05:09 +0200 Subject: [PATCH 0333/1398] move alpha computation into a functor --- .../Triangle_3_Triangle_3_intersection.h | 52 +++++-------------- .../include/CGAL/Kernel/function_objects.h | 31 +++++++++++ .../include/CGAL/Kernel/interface_macros.h | 2 + .../Polygon_mesh_processing/autorefinement.h | 6 +-- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 99dcd24ff457..68166f18c6e2 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -34,28 +34,6 @@ namespace CGAL { namespace Intersections { namespace internal{ -//TODO: move into a functor -template -typename K::FT -coplanar_segment_segment_alpha_intersection(const typename K::Point_3& p1, const typename K::Point_3& p2, // segment 1 - const typename K::Point_3& p3, const typename K::Point_3& p4, // segment 2 - const K& k) -{ - const typename K::Vector_3 v1 = p2-p1; - const typename K::Vector_3 v2 = p4-p3; - - CGAL_assertion(k.coplanar_3_object()(p1,p2,p3,p4)); - - const typename K::Vector_3 v3 = p3 - p1; - const typename K::Vector_3 v3v2 = cross_product(v3,v2); - const typename K::Vector_3 v1v2 = cross_product(v1,v2); - const typename K::FT sl = v1v2.squared_length(); - CGAL_assertion(!certainly(is_zero(sl))); - - const typename K::FT t = ((v3v2.x()*v1v2.x()) + (v3v2.y()*v1v2.y()) + (v3v2.z()*v1v2.z())) / sl; - return t; // p1 + (p2-p1) * t -} - template struct Point_on_triangle { @@ -179,6 +157,8 @@ intersection(const Point_on_triangle& p, std::cout << " (" << p.id1() << "," << p.id2() << ",[" << p.alpha << "]) -"; std::cout << " (" << q.id1() << "," << q.id2() << ",[" << q.alpha << "]) || e" << edge_id_t1; #endif + typename Kernel::Compute_alpha_for_coplanar_triangle_intersection_3 compute_alpha + = k.compute_alpha_for_coplanar_triangle_intersection_3_object(); typedef Point_on_triangle Pot; switch(p.id1()) { @@ -193,10 +173,9 @@ intersection(const Point_on_triangle& p, #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " -- case 1\n"; #endif - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, p.id2()), - Pot::point_from_id(p2, q2, r2, q.id2()), k); + typename Kernel::FT alpha = compute_alpha(p1, q1, + Pot::point_from_id(p2, q2, r2, p.id2()), + Pot::point_from_id(p2, q2, r2, q.id2())); int id2 = (p.id2()+1)%3 == q.id2() ? p.id2() : q.id2(); return Point_on_triangle(edge_id_t1, id2, alpha); // intersection with an original edge of t2 } @@ -209,10 +188,9 @@ intersection(const Point_on_triangle& p, std::cout << " -- case 2\n"; #endif // points are on the same edge of t2 --> we shorten an already cut edge - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, q.id2()), - Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); + typename Kernel::FT alpha = compute_alpha(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3)); return Point_on_triangle(edge_id_t1, q.id2(), alpha); } @@ -278,10 +256,9 @@ intersection(const Point_on_triangle& p, std::cout << " -- case 7\n"; #endif // points are on the same edge of t2 --> we shorten an already cut edge - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, p.id2()), - Pot::point_from_id(p2, q2, r2, (p.id2()+1)%3), k); + typename Kernel::FT alpha = compute_alpha(p1, q1, + Pot::point_from_id(p2, q2, r2, p.id2()), + Pot::point_from_id(p2, q2, r2, (p.id2()+1)%3)); return Point_on_triangle(edge_id_t1, p.id2(), alpha); } @@ -314,10 +291,9 @@ intersection(const Point_on_triangle& p, #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " -- case 10\n"; #endif - typename Kernel::FT alpha = - coplanar_segment_segment_alpha_intersection(p1, q1, - Pot::point_from_id(p2, q2, r2, q.id2()), - Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3), k); + typename Kernel::FT alpha = compute_alpha(p1, q1, + Pot::point_from_id(p2, q2, r2, q.id2()), + Pot::point_from_id(p2, q2, r2, (q.id2()+1)%3)); return Point_on_triangle(edge_id_t1, q.id2(), alpha); } // we are intersecting an edge of t1 diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 71aa268e6d35..780c0b2d4e50 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -2149,6 +2149,37 @@ namespace CommonKernelFunctors { } }; + template + class Compute_alpha_for_coplanar_triangle_intersection_3 + { + typedef typename K::Point_3 Point_3; + typedef typename K::Vector_3 Vector_3; + public: + typedef typename K::FT result_type; + result_type + operator()(const Point_3& p1, const Point_3& p2, // segment 1 + const Point_3& p3, const Point_3& p4) const // segment 2 + { + typename K::Construct_vector_3 vector = K().construct_vector_3_object(); + typename K::Construct_cross_product_vector_3 cross_product = + K().construct_cross_product_vector_3_object(); + + const Vector_3 v1 = vector(p1, p2); + const Vector_3 v2 = vector(p3, p4); + + CGAL_assertion(K().coplanar_3_object()(p1,p2,p3,p4)); + + const Vector_3 v3 = vector(p1, p3); + const Vector_3 v3v2 = cross_product(v3,v2); + const Vector_3 v1v2 = cross_product(v1,v2); + const typename K::FT sl = K().compute_squared_length_3_object()(v1v2); + CGAL_assertion(!certainly(is_zero(sl))); + + const typename K::FT t = ((v3v2.x()*v1v2.x()) + (v3v2.y()*v1v2.y()) + (v3v2.z()*v1v2.z())) / sl; + return t; // p1 + (p2-p1) * t + } + }; + template class Construct_point_on_2 { diff --git a/Kernel_23/include/CGAL/Kernel/interface_macros.h b/Kernel_23/include/CGAL/Kernel/interface_macros.h index 9c85643a977e..e5a2ebf81210 100644 --- a/Kernel_23/include/CGAL/Kernel/interface_macros.h +++ b/Kernel_23/include/CGAL/Kernel/interface_macros.h @@ -396,6 +396,8 @@ CGAL_Kernel_cons(Construct_plane_3, construct_plane_3_object) CGAL_Kernel_cons(Construct_plane_line_intersection_point_3, construct_plane_line_intersection_point_3_object) +CGAL_Kernel_cons(Compute_alpha_for_coplanar_triangle_intersection_3, + compute_alpha_for_coplanar_triangle_intersection_3_object) CGAL_Kernel_cons(Construct_point_on_2, construct_point_on_2_object) CGAL_Kernel_cons(Construct_point_on_3, diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 6b664ec360bc..6c8ba3f8cd27 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -386,7 +386,7 @@ void coplanar_intersections(const std::array& t1, //intersect t2 with the three half planes which intersection defines t1 K k; - intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,l_inter_pts); //line p1q1 + Intersections::internal::intersection_coplanar_triangles_cutoff(p1,q1,r1,0,p2,q2,r2,k,l_inter_pts); //line p1q1 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); @@ -401,7 +401,7 @@ void coplanar_intersections(const std::array& t1, } } #endif - intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,l_inter_pts); //line q1r1 + Intersections::internal::intersection_coplanar_triangles_cutoff(q1,r1,p1,1,p2,q2,r2,k,l_inter_pts); //line q1r1 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); @@ -416,7 +416,7 @@ void coplanar_intersections(const std::array& t1, } } #endif - intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,l_inter_pts); //line r1p1 + Intersections::internal::intersection_coplanar_triangles_cutoff(r1,p1,q1,2,p2,q2,r2,k,l_inter_pts); //line r1p1 #ifdef CGAL_DEBUG_COPLANAR_T3_T3_INTERSECTION std::cout << " ipts size: " << l_inter_pts.size() << "\n"; print_points(); From 0684bd203fa818c1dbf6cb4b3fae839e08da94a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 8 Jun 2023 14:17:18 +0200 Subject: [PATCH 0334/1398] hide debug --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 6c8ba3f8cd27..90174e42753d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -49,7 +49,7 @@ #define TEST_RESOLVE_INTERSECTION #define DEDUPLICATE_SEGMENTS -#define USE_DEBUG_PARALLEL_TIMERS +//#define USE_DEBUG_PARALLEL_TIMERS //#define DEBUG_COUNTERS //#define USE_FIXED_PROJECTION_TRAITS //#define DEBUG_DEPTH @@ -1248,8 +1248,6 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef DEDUPLICATE_SEGMENTS // deduplicate inserted segments //TODO: PARALLEL_FOR #3 - Real_timer t3; - t3.start(); std::vector>> all_segments_ids(all_segments.size()); auto deduplicate_inserted_segments = [&](std::size_t ti) From c5fab1c874248e87abe1f769616f624f8bd0efdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 8 Jun 2023 14:21:59 +0200 Subject: [PATCH 0335/1398] fix sequential run --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 90174e42753d..11b15fa4ec47 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1307,11 +1307,10 @@ void autorefine_soup_output(const PointRange& input_points, ); } else -#else - for (std::size_t ti = 0; ti < triangles.size(); ++ti) { - deduplicate_inserted_segments(ti); - } #endif + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + deduplicate_inserted_segments(ti); + } #ifdef USE_DEBUG_PARALLEL_TIMERS std::cout << t.time() << " sec. for #3" << std::endl; @@ -1385,11 +1384,10 @@ void autorefine_soup_output(const PointRange& input_points, ); } else -#else - for (std::size_t ti = 0; ti < triangles.size(); ++ti) { - refine_triangles(ti); - } #endif + for (std::size_t ti = 0; ti < triangles.size(); ++ti) { + refine_triangles(ti); + } #ifdef USE_DEBUG_PARALLEL_TIMERS t.stop(); From 9fbfd93b56af9be923a5e1297e45a353a786c608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 8 Jun 2023 18:09:44 +0200 Subject: [PATCH 0336/1398] Fix function name --- .../Polyhedron/Plugins/IO/Polylines_io_plugin.cpp | 2 +- .../demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp | 4 ++-- .../Plugins/PMP/Repair_polyhedron_plugin.cpp | 2 +- .../Point_set/Point_set_shape_detection_plugin.cpp | 2 +- Polyhedron/demo/Polyhedron/Scene_item.cpp | 2 +- .../demo/Polyhedron/Scene_item_rendering_helper.cpp | 10 +++++----- .../Polyhedron/Scene_points_with_normal_item.cpp | 2 +- Three/include/CGAL/Three/Scene_item.h | 12 ++++++------ .../include/CGAL/Three/Scene_item_rendering_helper.h | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp index fa09b6036548..e500ffb92a8a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp @@ -343,7 +343,7 @@ void Polyhedron_demo_polylines_io_plugin::simplify() { Scene_polylines_item* item = qobject_cast(scene->item(scene->mainSelectionIndex())); bool ok; - double err = QInputDialog::getDouble(mw, "Squared Frechet Distance", "Enter the squared approximation error:", pow(0.01*item->diagonalBbox(),2),0,999,8,&ok); + double err = QInputDialog::getDouble(mw, "Squared Frechet Distance", "Enter the squared approximation error:", pow(0.01*item->bboxDiagonal(),2),0,999,8,&ok); if(!ok) return; for(Scene_polylines_item::Polylines_container::iterator diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp index 308bd503d958..caea10065a9c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp @@ -404,8 +404,8 @@ private Q_SLOTS: // compute centroid Point c = CGAL::centroid(triangles.begin(),triangles.end()); - oliver_queen = new Scene_arrow_item(Vec(c.x(),c.y(),c.z()), fg_item->diagonalBbox() / 50.0f, - fg_item->diagonalBbox()/3.0f); + oliver_queen = new Scene_arrow_item(Vec(c.x(),c.y(),c.z()), fg_item->bboxDiagonal() / 50.0f, + fg_item->bboxDiagonal()/3.0f); Vec dir(plane.orthogonal_vector().x(), plane.orthogonal_vector().y(), plane.orthogonal_vector().z()); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp index 1cae60b9a70e..5ecc8921433e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp @@ -192,7 +192,7 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionRemoveNeedlesAndCaps_tri QDialog dialog; Ui::NeedleDialog ui; ui.setupUi(&dialog); - ui.collapseBox->setValue(sm_item->diagonalBbox()*0.01); + ui.collapseBox->setValue(sm_item->bboxDiagonal()*0.01); if(dialog.exec() != QDialog::Accepted) return; CGAL::Polygon_mesh_processing::remove_almost_degenerate_faces(*sm_item->face_graph(), diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp index fc344cec857c..68a1fe2c6d3a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp @@ -928,7 +928,7 @@ void Polyhedron_demo_point_set_shape_detection_plugin::on_actionDetectShapesSM_t dialog.m_cluster_epsilon_field->setEnabled(false); dialog.groupBox_3->setEnabled(false); //todo: check default values - dialog.m_epsilon_field->setValue(0.01*sm_item->diagonalBbox()); + dialog.m_epsilon_field->setValue(0.01*sm_item->bboxDiagonal()); std::size_t nb_faces = mesh->number_of_faces(); dialog.m_min_pts_field->setValue((std::max)(static_cast(0.01*nb_faces), 1)); if(!dialog.exec()) return; diff --git a/Polyhedron/demo/Polyhedron/Scene_item.cpp b/Polyhedron/demo/Polyhedron/Scene_item.cpp index 1951ee8ff7c2..1b54ec529938 100644 --- a/Polyhedron/demo/Polyhedron/Scene_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_item.cpp @@ -22,7 +22,7 @@ CGAL::Three::Scene_item::Scene_item(int buffers_size, int vaos_size) CGAL::QGLViewer::QGLViewerPool().first()->makeCurrent(); is_bbox_computed = false; - is_diag_bbox_computed = false; + is_bbox_diag_computed = false; for(int i=0; iis_diag_bbox_computed) +double Scene_item_rendering_helper::bboxDiagonal() const { + if(!priv->is_bbox_diag_computed) priv->compute_diag_bbox(); - priv->is_diag_bbox_computed = true; + priv->is_bbox_diag_computed = true; return priv->_diag_bbox; } diff --git a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp index 7ad2931f252b..75bea895cfac 100644 --- a/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_points_with_normal_item.cpp @@ -321,7 +321,7 @@ void Scene_points_with_normal_item_priv::compute_normals_and_vertices() const positions_selected_normals.resize(m_points->nb_selected_points() * 3); // we can't afford computing real average spacing just for display, 0.5% of bbox will do - average_spacing = 0.005 * item->diagonalBbox(); + average_spacing = 0.005 * item->bboxDiagonal(); normal_length = (std::min)(average_spacing, std::sqrt( region_of_interest.squared_radius() / 1000.)); length_factor = 10.0/100*normal_Slider->value(); diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index f22b9be5f52d..ca65c413f3c1 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -187,11 +187,11 @@ class SCENE_ITEM_EXPORT Scene_item : public QObject{ //! If the diagonal's length has never been computed, computes it and //! saves the result for further calls. //! @returns the item's bounding box's diagonal length. - virtual double diagonalBbox() const { - if(!is_diag_bbox_computed) - compute_diag_bbox(); - is_diag_bbox_computed = true; - return _diag_bbox; + virtual double bboxDiagonal() const { + if(!is_bbox_diag_computed) + compute_diag_bbox(); + is_bbox_diag_computed = true; + return _diag_bbox; } // Function about manipulation @@ -413,7 +413,7 @@ public Q_SLOTS: mutable Bbox _bbox; mutable double _diag_bbox; mutable bool is_bbox_computed; - mutable bool is_diag_bbox_computed; + mutable bool is_bbox_diag_computed; virtual void compute_bbox()const{} virtual void compute_diag_bbox()const; // The four basic properties diff --git a/Three/include/CGAL/Three/Scene_item_rendering_helper.h b/Three/include/CGAL/Three/Scene_item_rendering_helper.h index f654139c2a69..72fd4ce154a9 100644 --- a/Three/include/CGAL/Three/Scene_item_rendering_helper.h +++ b/Three/include/CGAL/Three/Scene_item_rendering_helper.h @@ -174,7 +174,7 @@ class DEMO_FRAMEWORK_EXPORT Scene_item_rendering_helper //! saves the result for further calls. //! @returns the item's bounding box's diagonal length. //! @todo must replace the one from Scene_item eventually - virtual double diagonalBbox() const Q_DECL_OVERRIDE; + virtual double bboxDiagonal() const Q_DECL_OVERRIDE; //! //! \brief newViewer adds Vaos for `viewer`. //! \param viewer the new viewer. From f85b8398582e1f2e7b86c8003e5e6d443a40d074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 8 Jun 2023 18:09:53 +0200 Subject: [PATCH 0337/1398] Do not proceed if user cancels --- .../Subdivision_methods_plugin.cpp | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp index 84e3b4702ce2..87bb50fd96fe 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Subdivision_methods/Subdivision_methods_plugin.cpp @@ -95,16 +95,19 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_loop(FaceGraphItem* item, void Polyhedron_demo_subdivision_methods_plugin::on_actionLoop_triggered() { CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); - - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); + Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(index)); if(!sm_item) return; + + bool ok = true; int nb_steps = QInputDialog::getInt(mw, QString("Number of Iterations"), QString("Choose number of iterations"), - 1, - 1); + 1 /* value */, 1 /* min */, (std::numeric_limits::max)() /* max */, 1 /*step*/, + &ok); + if(!ok) + return; + apply_loop(sm_item, nb_steps); } @@ -123,18 +126,23 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_catmullclark(FaceGraphIte item->invalidateOpenGLBuffers(); scene->itemChanged(item); } + void Polyhedron_demo_subdivision_methods_plugin::on_actionCatmullClark_triggered() { CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); + Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(index)); if(!sm_item) return; + + bool ok = true; int nb_steps = QInputDialog::getInt(mw, QString("Number of Iterations"), QString("Choose number of iterations"), - 1, - 1); + 1 /* value */, 1 /* min */, (std::numeric_limits::max)() /* max */, 1 /*step*/, + &ok); + if(!ok) + return; + apply_catmullclark(sm_item, nb_steps); } @@ -157,15 +165,19 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_sqrt3(FaceGraphItem* item void Polyhedron_demo_subdivision_methods_plugin::on_actionSqrt3_triggered() { CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); + Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(index)); if(!sm_item) return; + + bool ok = true; int nb_steps = QInputDialog::getInt(mw, QString("Number of Iterations"), QString("Choose number of iterations"), - 1, - 1); + 1 /* value */, 1 /* min */, (std::numeric_limits::max)() /* max */, 1 /*step*/, + &ok); + if(!ok) + return; + apply_sqrt3(sm_item, nb_steps); } @@ -189,16 +201,19 @@ void Polyhedron_demo_subdivision_methods_plugin::apply_doosabin(FaceGraphItem* i void Polyhedron_demo_subdivision_methods_plugin::on_actionDooSabin_triggered() { CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); - - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); + Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(index)); if(!sm_item) return; + + bool ok = true; int nb_steps = QInputDialog::getInt(mw, QString("Number of Iterations"), QString("Choose number of iterations"), - 1, - 1); + 1 /* value */, 1 /* min */, (std::numeric_limits::max)() /* max */, 1 /*step*/, + &ok); + if(!ok) + return; + apply_doosabin(sm_item, nb_steps); } From 1237c7a39873bc2d7a6c4efae7e7f3decaee6fed Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 9 Jun 2023 12:45:19 +0200 Subject: [PATCH 0338/1398] Remove a warning for lcc tests --- .../test/Linear_cell_complex/Linear_cell_complex_2_test.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.cpp b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.cpp index 28195f353548..89f981f53d1b 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.cpp +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_2_test.cpp @@ -32,7 +32,8 @@ struct Myattrib : public CGAL::Cell_attribute_with_point struct MonInfo { - MonInfo(int i=0) : mnb(i==0?rand():i), ptr(reinterpret_cast(this)) + MonInfo(long long int i=0) : mnb(i==0?rand():static_cast(i)), + ptr(reinterpret_cast(this)) {} bool operator==(const MonInfo& info) const From efd68a5f922ca427bc17e841ce8df3c2387481b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 9 Jun 2023 19:15:16 +0200 Subject: [PATCH 0339/1398] Update offset meshing plugin - fixed not working for polygon soups - fixed broken formula for both giving Mesh_3 assertions and inverted meshes - fixed applicable() allowing wrong combinations - fixed inflate() needlessly normalizing normals - fixed crashing for non triangulated inputs - fixed some memory leaks - fixed dialog name - removed useless sqrts - avoid recomputing bbox 4 times - cleaned UI - etc. --- .../Polyhedron/Plugins/Mesh_3/CMakeLists.txt | 13 + .../Offset_meshing_dialog.ui} | 124 +-- .../Plugins/Mesh_3/Offset_meshing_plugin.cpp | 765 ++++++++++++++++++ .../Plugins/Surface_mesh/CMakeLists.txt | 12 - .../Surface_mesh/Offset_meshing_plugin.cpp | 691 ---------------- 5 files changed, 846 insertions(+), 759 deletions(-) rename Polyhedron/demo/Polyhedron/Plugins/{Surface_mesh/Remeshing_dialog.ui => Mesh_3/Offset_meshing_dialog.ui} (81%) create mode 100644 Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_plugin.cpp delete mode 100644 Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index eb4e9c5b57d0..2cc3f58854f2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -116,3 +116,16 @@ if(TBB_FOUND) target_link_libraries(c3t3_io_plugin PUBLIC CGAL::TBB_support) target_link_libraries(c3t3_rib_exporter_plugin PUBLIC CGAL::TBB_support) endif() + +qt5_wrap_ui(offsetMeshingUI_FILES Offset_meshing_dialog.ui) +polyhedron_demo_plugin(offset_meshing_plugin Offset_meshing_plugin + ${offsetMeshingUI_FILES}) +target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_item + scene_polygon_soup_item + scene_polylines_item) +if(TARGET CGAL::Eigen3_support) + target_link_libraries(offset_meshing_plugin PUBLIC CGAL::Eigen3_support) +endif() +if(TARGET CGAL::TBB_support) + target_link_libraries(offset_meshing_plugin PUBLIC CGAL::TBB_support) +endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Remeshing_dialog.ui b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_dialog.ui similarity index 81% rename from Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Remeshing_dialog.ui rename to Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_dialog.ui index 37b9073000f6..33df99c77bbc 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Remeshing_dialog.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_dialog.ui @@ -1,64 +1,70 @@ - Remeshing_dialog - + Offset_meshing_dialog + 0 0 - 376 - 216 + 413 + 294 Meshing criteria - + 25.0 - - - - 0.00 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + - Approximation &error: + Edge size Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + + + true + 0.00 - - - - &Topological criterion: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + Qt::Vertical - - tags + + + 20 + 40 + - + - + @@ -77,69 +83,75 @@ - - - - Qt::Vertical - - - - 20 - 40 - + + + + Topological criterion - - - - - - Qt::Horizontal + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + tags - - - true - + 0.00 - - + + - &Edge size: + Approximation error Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + 0.00 + + + + - &Size: + Size Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - &Angle: + Angle Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + 15 + + + + Meshing Criteria + + + @@ -154,7 +166,7 @@ buttonBox accepted() - Remeshing_dialog + Offset_meshing_dialog accept() @@ -170,7 +182,7 @@ buttonBox rejected() - Remeshing_dialog + Offset_meshing_dialog reject() diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_plugin.cpp new file mode 100644 index 000000000000..8b0e0bab57b5 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Offset_meshing_plugin.cpp @@ -0,0 +1,765 @@ +#include "config.h" + +#ifdef CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER + +#include +#include "ui_Offset_meshing_dialog.h" + +#include "C3t3_type.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include "Scene_surface_mesh_item.h" +#include "Scene_polygon_soup_item.h" +#include "Scene_polylines_item.h" +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace CGAL::Three; + +namespace CGAL { + +template +class Offset_function +{ + using Primitive = AABB_face_graph_triangle_primitive; + using Traits = AABB_traits; + using Tree = AABB_tree; + using Side_of = Side_of_triangle_mesh; + + using FT = typename GeomTraits::FT; + using Point_3 = typename GeomTraits::Point_3; + +public: + Offset_function(const TriangleMesh& tm, + double offset_distance) + : m_tree_ptr(std::make_shared(std::begin(faces(tm)), std::end(faces(tm)), tm)), + m_side_of_ptr(std::make_shared(*m_tree_ptr)), + m_is_inset(offset_distance < 0), + m_sq_offset_distance(CGAL::square(offset_distance)), + m_is_closed(is_closed(tm)) + { + CGAL_assertion(!m_tree_ptr->empty()); + } + + // we only need negative inside, and positive outside, so we can compare square roots + double operator()(const Point_3& p) const + { + const Bounded_side side = m_is_closed ? m_side_of_ptr->operator()(p) : ON_UNBOUNDED_SIDE; + + if(m_is_inset) // also means that the mesh is closed + { + // - ON_UNBOUNDED_SIDE is outside the offset since we are insetting + // - ON_BOUNDARY is outside the offset since we are insetting + if(side != ON_BOUNDED_SIDE) + return 1; + + // inside the offset if the distance to the input mesh is greater than the offset distance + const FT sq_distance = m_tree_ptr->squared_distance(p); + return (sq_distance > m_sq_offset_distance) ? -1 : 1; + } + else // outset + { + // - ON_BOUNDED_SIDE can only happen if it's a closed mesh, and in that case, being inside + // the mesh is being inside the offset + // - ON_BOUNDARY is in the offset whether the mesh is open or closed + if(side != ON_UNBOUNDED_SIDE) + return - 1; + + // inside the offset if the distance to the input mesh is smaller than the offset distance + const FT sq_distance = m_tree_ptr->squared_distance(p); + return (sq_distance < m_sq_offset_distance) ? -1 : 1; + } + } + +private: + std::shared_ptr m_tree_ptr; + std::shared_ptr m_side_of_ptr; + const bool m_is_inset; + const double m_sq_offset_distance; + const bool m_is_closed; +}; + +template +class Polygon_soup_offset_function +{ + using Polygon_iterator = typename Polygons::const_iterator; + + class Polygon_soup_point_property_map + { + const Points* points_vector_ptr; + + public: + using key_type = Polygon_iterator; + using value_type = EPICK::Point_3; + using reference = const value_type&; + using category = boost::readable_property_map_tag; + + Polygon_soup_point_property_map() = default; + Polygon_soup_point_property_map(const Points* ptr) : points_vector_ptr(ptr) { } + + friend reference get(Polygon_soup_point_property_map map, + key_type polygon_it) + { + return (*map.points_vector_ptr)[*polygon_it->begin()]; + } + }; + + class Polygon_soup_triangle_property_map + { + const Points* points_vector_ptr; + + public: + using key_type = Polygon_iterator; + using value_type = EPICK::Triangle_3; + using reference = value_type; + using category = boost::readable_property_map_tag; + + Polygon_soup_triangle_property_map() = default; + Polygon_soup_triangle_property_map(const Points* ptr) : points_vector_ptr(ptr) { } + + friend value_type get(Polygon_soup_triangle_property_map map, + key_type polygon_it) + { + auto it = polygon_it->begin(); + CGAL_assertion(it != polygon_it->end()); + const auto id0 = *it++; + CGAL_assertion(it != polygon_it->end()); + const auto id1 = *it++; + CGAL_assertion(it != polygon_it->end()); + const auto id2 = *it++; + CGAL_assertion(it == polygon_it->end()); + + return value_type((*map.points_vector_ptr)[id0], + (*map.points_vector_ptr)[id1], + (*map.points_vector_ptr)[id2]); + } + }; + + struct AABB_polygon_soup_triangle_primitive + : public CGAL::AABB_primitive + { + using Base = CGAL::AABB_primitive; + + using Id = Polygon_iterator; + + template + AABB_polygon_soup_triangle_primitive(Id id, + ObjectPmap&& opmap, + PointPmap&& ppmap) + : Base(id, std::forward(opmap), std::forward(ppmap)) + { + } + + template + AABB_polygon_soup_triangle_primitive(Iterator it, + ObjectPmap&& opmap, + PointPmap&& ppmap) + : Base(*it, std::forward(opmap), std::forward(ppmap)) + { + } + }; // struct template Polygon_soup_primitive + + using AABB_traits = CGAL::AABB_traits; + using AABB_tree = CGAL::AABB_tree; + + std::shared_ptr m_tree_ptr; + double m_sq_offset_distance; + +public: + Polygon_soup_offset_function(const Points& points, + const Polygons& polygons, + const double offset_distance) + : m_tree_ptr(std::make_shared(std::begin(polygons), + std::end(polygons), + Polygon_soup_triangle_property_map(&points), + Polygon_soup_point_property_map(&points))), + m_sq_offset_distance(square(offset_distance)) + { + CGAL_assertion(!m_tree_ptr->empty()); + } + + // we only need negative inside, and positive outside, so we can compare square roots + double operator()(const EPICK::Point_3& p) const + { + // it's a soup so it's open by definition ==> treat inset and outset identically + const double sq_distance = m_tree_ptr->squared_distance(p); + return sq_distance - m_sq_offset_distance; + } + +}; // class Polygon_soup_offset_function + +} // namespace CGAL + +CGAL::Offset_function +offset_function(Scene_surface_mesh_item* item, double offset_value) +{ + return { *(item->face_graph()), offset_value }; +} + +CGAL::Polygon_soup_offset_function +offset_function(Scene_polygon_soup_item* item, double offset_value) +{ + return { item->points(), item->polygons(), offset_value }; +} + +class MeshGuard +{ + SMesh* mesh; + bool done; + +public: + MeshGuard(SMesh* mesh) : mesh(mesh), done(false) { } + void setDone() { done = true; } + ~MeshGuard() + { + if(!done) + delete mesh; + } +}; + +// declare the CGAL function +template +SMesh* cgal_off_meshing(QWidget*, + SourceItem* source_item, + Scene_polylines_item* polylines_item, + const double offset_value, + const double angle, + const double sizing, + const double approx, + const double edge_size, + int tag) +{ + using GT = EPICK; + using Sphere_3 = GT::Sphere_3; + + using Mesh_domain_base = CGAL::Labeled_mesh_domain_3; + using Mesh_domain = CGAL::Mesh_domain_with_polyline_features_3; + using Tr = C3t3::Triangulation; + using Mesh_criteria = CGAL::Mesh_criteria_3; + + const CGAL::Bbox_3 bbox = source_item->bbox(); + + const GT::Point_3 center((bbox.xmax() + bbox.xmin()) / 2, + (bbox.ymax() + bbox.ymin()) / 2, + (bbox.zmax() + bbox.zmin()) / 2); + const double rad = 0.6 * std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())) + + offset_value; + const double sqrad = CGAL::square(rad); + + CGAL::Timer timer; + timer.start(); + + namespace p = CGAL::parameters; + + Mesh_domain domain = + Mesh_domain::create_implicit_mesh_domain + (p::function = offset_function(source_item, offset_value), + p::bounding_object = Sphere_3(center, sqrad), + p::relative_error_bound = 1e-7, + p::construct_surface_patch_index = [](int i, int j) { return (i * 1000 + j); }); + + const CGAL::Mesh_facet_topology topology = CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH; + auto manifold_option = p::non_manifold(); + if(tag == 1) + manifold_option = p::manifold_with_boundary(); + if(tag == 2) + manifold_option = p::manifold(); + + Mesh_criteria criteria(p::facet_angle = angle, + p::facet_size = sizing, + p::facet_distance = approx, + p::facet_topology = topology, + p::edge_size = edge_size); + + if(polylines_item != nullptr) + { + typedef std::vector Surface_patch_ids; + std::vector surface_patch_ids; + + domain.add_features_and_incidences(polylines_item->polylines.begin(), + polylines_item->polylines.end(), + CGAL::Identity_property_map(), + CGAL::Constant_property_map(surface_patch_ids)); + } + + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, + p::no_perturb(), + p::no_exude(), + manifold_option); + + timer.stop(); + std::cerr << "done (" << timer.time() << " ms, " << c3t3.triangulation().number_of_vertices() << " vertices)" << std::endl; + + if(c3t3.number_of_facets_in_complex() > 0) + { + SMesh* pRemesh = new SMesh(); + + // if the thread is interrupted before the mesh is returned, delete it. + MeshGuard guard(pRemesh); + CGAL::facets_in_complex_3_to_triangle_mesh(c3t3, *pRemesh); + guard.setDone(); + + CGAL_postcondition(CGAL::Polygon_mesh_processing::is_outward_oriented(*pRemesh)); + + return pRemesh; + } + else + { + return nullptr; + } +} + +struct Mesher_thread + : public QThread +{ + Q_OBJECT + +private: + Scene_surface_mesh_item* sm_item; + Scene_polygon_soup_item* soup_item; + Scene_polylines_item* polylines_item; + + const double offset_value; + const double angle; + const double sizing; + const double approx; + const double edge_size; + int tag_index; + +public: + Mesher_thread(Scene_surface_mesh_item* sm_item, + Scene_polygon_soup_item* soup_item, + Scene_polylines_item* polylines_item, + const double offset_value, + const double angle, + const double sizing, + const double approx, + const double edge_size, + int tag) + : sm_item(sm_item), soup_item(soup_item), polylines_item(polylines_item), + offset_value(offset_value), + angle(angle), sizing(sizing), approx(approx), edge_size(edge_size), tag_index(tag) + { + } + + void run() override + { + SMesh* offset_mesh = nullptr; + + if(soup_item) + { + offset_mesh = cgal_off_meshing(Three::mainWindow(), + soup_item, polylines_item, + offset_value, + angle, sizing, approx, edge_size, tag_index); + } + else + { + offset_mesh = cgal_off_meshing(Three::mainWindow(), + sm_item, polylines_item, + offset_value, + angle, sizing, approx, edge_size, tag_index); + } + + Three::getMutex()->lock(); + Three::getWaitCondition()->wakeAll(); + Three::getMutex()->unlock(); + + Q_EMIT resultReady(offset_mesh); + } + +Q_SIGNALS: + void resultReady(SMesh *offset_mesh); +}; + +class Polyhedron_demo_offset_meshing_plugin + : public QObject, + protected Polyhedron_demo_plugin_interface +{ + Q_OBJECT + Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) + Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") + +private: + QAction* actionOffsetMeshing; + QAction* actionInflateMesh; + + Scene_interface *scene; + QMainWindow *mw; + +public: + void init(QMainWindow* mainWindow, + Scene_interface* scene_interface, + Messages_interface*) + { + this->scene = scene_interface; + this->mw = mainWindow; + + actionOffsetMeshing = new QAction(tr("Offset Meshing"), mw); + actionOffsetMeshing->setProperty("subMenuName", "3D Surface Mesh Generation"); + connect(actionOffsetMeshing, SIGNAL(triggered()), + this, SLOT(offset_meshing())); + + actionInflateMesh = new QAction(tr("Inflate Mesh"), mw); + actionInflateMesh->setProperty("subMenuName", "Operations on Polyhedra"); + connect(actionInflateMesh, SIGNAL(triggered()), + this, SLOT(inflate_mesh())); + } + + bool applicable(QAction* action) const + { + if(action == actionOffsetMeshing) + { + if(scene->selectionIndices().size() == 1) + { + const int index = scene->mainSelectionIndex(); + return (qobject_cast(scene->item(index)) || + qobject_cast(scene->item(index))); + } + + // Can provide a polyline item for feature protection + if(scene->selectionIndices().size() != 2) + return false; + + // One needs to be a surface mesh or polygon soup item, and the other a polyline item + const int index1 = scene->selectionIndices().at(0); + const int index2 = scene->selectionIndices().at(1); + Scene_item* item1 = scene->item(index1); + Scene_item* item2 = scene->item(index2); + + if((qobject_cast(item1) || + qobject_cast(item1)) && + qobject_cast(item2)) + return true; + + if((qobject_cast(item2) || + qobject_cast(item2)) && + qobject_cast(item1)) + return true; + } + else if(action == actionInflateMesh) + { + if(scene->selectionIndices().size() == 1) + { + const int index = scene->mainSelectionIndex(); + return qobject_cast(scene->item(index)); + } + } + + return false; + } + + QList actions() const + { + return QList() << actionOffsetMeshing + << actionInflateMesh; + } + +public Q_SLOTS: + void offset_meshing(); + void inflate_mesh(); +}; // class Polyhedron_demo_offset_meshing_plugin + +void +Polyhedron_demo_offset_meshing_plugin:: +offset_meshing() +{ + Scene_item* item = nullptr; + Scene_surface_mesh_item* sm_item = nullptr; + Scene_polygon_soup_item* soup_item = nullptr; + Scene_polylines_item* polylines_item = nullptr; + + bool mesh_or_soup_item_found = false; + Q_FOREACH(Scene_interface::Item_id index, scene->selectionIndices()) + { + if(!mesh_or_soup_item_found) + { + sm_item = qobject_cast(scene->item(index)); + if(sm_item == nullptr) + { + soup_item = qobject_cast(scene->item(index)); + if(soup_item != nullptr) + { + item = scene->item(index); + mesh_or_soup_item_found = true; + continue; + } + } + else + { + item = scene->item(index); + mesh_or_soup_item_found = true; + continue; + } + } + + polylines_item = qobject_cast(scene->item(index)); + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + + if(!mesh_or_soup_item_found) + return; + + if(sm_item) + { + if(!is_triangle_mesh(*(sm_item->face_graph()))) + { + QMessageBox::critical(mw, + tr("Offset Meshing"), + tr("The selected mesh is not a triangle mesh.")); + return; + } + } + else + { + for(const auto& p : soup_item->polygons()) + { + if(p.size() != 3) + { + QMessageBox::critical(mw, + tr("Offset Meshing"), + tr("The selected polygon soup is not a triangle soup.")); + return; + } + } + } + + double diag; + if(sm_item) + diag = sm_item->bboxDiagonal(); + else + diag = soup_item->bboxDiagonal(); + + QApplication::restoreOverrideCursor(); + + bool ok = true; + double offset_value = QInputDialog::getDouble(mw, + QString("Choose Offset Value"), + QString("Offset Value (use a negative number to compute the inset of a closed mesh)"), + 0.1 * diag, + - (std::numeric_limits::max)(), + (std::numeric_limits::max)(), 10, &ok); + if(!ok) + return; + + if(offset_value < 0 && (!sm_item || !is_closed(*(sm_item->face_graph())))) + { + QMessageBox::critical(mw, + tr("Offset Meshing"), + tr("Insetting is only possible for closed polygon meshes.")); + return; + } + + QDialog dialog(mw); + Ui::Offset_meshing_dialog ui; + ui.setupUi(&dialog); + ui.angle->setRange(1.0, 30.0); + + connect(ui.buttonBox, SIGNAL(accepted()), + &dialog, SLOT(accept())); + connect(ui.buttonBox, SIGNAL(rejected()), + &dialog, SLOT(reject())); + + ui.sizing->setRange(diag * 10e-6, diag); + ui.sizing->setValue(diag * 0.05); // default value + ui.approx->setRange(diag * 10e-7, diag); + ui.approx->setValue(diag * 0.005); + + if(polylines_item != nullptr) + { + ui.edge_sizing->setRange(diag * 10e-6, diag); + ui.edge_sizing->setValue(diag * 0.05); // default value + } + else + { + ui.edge_sizing->setEnabled(false); + } + + int i = dialog.exec(); + if(i == QDialog::Rejected) + return; + + const double angle = ui.angle->value(); + const double approx = ui.approx->value(); + const double sizing = ui.sizing->value(); + const double edge_size = (polylines_item != nullptr) ? ui.edge_sizing->value() : 0; + const int tag_index = ui.tags->currentIndex(); + + if(tag_index < 0) + return; + + QApplication::setOverrideCursor(Qt::BusyCursor); + + std::cerr << "mesh with:" + << "\n angle= " << angle + << "\n sizing= " << sizing + << "\n approx= " << approx + << "\n tag= " << tag_index + << std::boolalpha + << std::endl; + + Mesher_thread* worker = nullptr; + if(soup_item) + { + worker = new Mesher_thread(nullptr, soup_item, polylines_item, + offset_value, + angle, sizing, approx, edge_size, tag_index); + } + else + { + worker = new Mesher_thread(sm_item, nullptr, polylines_item, + offset_value, + angle, sizing, approx, edge_size, tag_index); + } + + connect(worker, &QThread::finished, + worker, &QObject::deleteLater); + + connect(worker, &Mesher_thread::resultReady, + this, [item, angle, sizing, approx, offset_value/* , index */](SMesh* offset_mesh) + { + if(!offset_mesh) + { + QApplication::restoreOverrideCursor(); + + Three::getMutex()->lock(); + Three::isLocked() = false; + Three::getMutex()->unlock(); + + return; + } + + Scene_surface_mesh_item* offset_item = new Scene_surface_mesh_item(offset_mesh); + offset_item->setName(tr("%1 offset %5 (%2 %3 %4)").arg(item->name()) + .arg(angle) + .arg(sizing) + .arg(approx) + .arg(offset_value)); + offset_item->setColor(Qt::magenta); + offset_item->setRenderingMode(Wireframe); + Three::scene()->addItem(offset_item); + + QApplication::restoreOverrideCursor(); + + Three::getMutex()->lock(); + Three::isLocked() = false; + Three::getMutex()->unlock(); + }); + + QMessageBox* message_box = new QMessageBox(QMessageBox::NoIcon, + "Meshing", + "Offset meshing in progress...", + QMessageBox::Cancel, + mw); + message_box->setDefaultButton(QMessageBox::Cancel); + QAbstractButton* cancelButton = message_box->button(QMessageBox::Cancel); + cancelButton->setText(tr("Stop")); + + connect(cancelButton, &QAbstractButton::clicked, + this, [worker](){ worker->terminate(); }); + connect(worker, &Mesher_thread::finished, + message_box, &QMessageBox::close); + + Three::getMutex()->lock(); + Three::isLocked() = true; + Three::getMutex()->unlock(); + + message_box->open(); + worker->start(); +} + +void +Polyhedron_demo_offset_meshing_plugin:: +inflate_mesh() +{ + const Scene_interface::Item_id index = scene->mainSelectionIndex(); + Scene_item* item = scene->item(index); + if(item == nullptr) + return; + + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(sm_item == nullptr) + return; + + SMesh* sMesh = sm_item->face_graph(); + if(sMesh == nullptr) + return; + + const double diag = sm_item->bboxDiagonal(); + + bool ok = true; + const double offset_value = QInputDialog::getDouble(mw, + QString("Choose Inflate Distance"), + QString("Inflate Distance (use a negative number to deflate)"), + 0.1 * diag, + -(std::numeric_limits::max)(), + (std::numeric_limits::max)(), + 10, + &ok); + if(!ok) + return; + + auto vpm = get(CGAL::vertex_point, *sMesh); + auto vnm = sMesh->property_map("v:normal").first; + + QApplication::setOverrideCursor(Qt::WaitCursor); + + for(const auto& v : vertices(*sMesh)) + { + const EPICK::Vector_3& n = get(vnm, v); + put(vpm, v, get(vpm, v) + offset_value * n); + } + + sm_item->invalidateOpenGLBuffers(); + sm_item->itemChanged(); + sm_item->itemVisibilityChanged(); + + QApplication::restoreOverrideCursor(); +} + +#include "Offset_meshing_plugin.moc" + +#endif // CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt index 508716a21e10..845dedbc31f3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt @@ -41,18 +41,6 @@ if(NOT CGAL_DISABLE_GMP) polyhedron_demo_plugin(mesh_simplification_plugin Mesh_simplification_plugin ${mesh_simplificationUI_FILES}) target_link_libraries(mesh_simplification_plugin PUBLIC scene_surface_mesh_item scene_selection_item) - qt5_wrap_ui(remeshingUI_FILES Remeshing_dialog.ui) - polyhedron_demo_plugin(offset_meshing_plugin Offset_meshing_plugin - ${remeshingUI_FILES}) - target_link_libraries(offset_meshing_plugin PUBLIC scene_surface_mesh_item - scene_polygon_soup_item - scene_polylines_item) - if(TARGET CGAL::Eigen3_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::Eigen3_support) - endif() - if(TARGET CGAL::TBB_support) - target_link_libraries(offset_meshing_plugin PUBLIC CGAL::TBB_support) - endif() qt5_wrap_ui(shortestPathUI_FILES Shortest_path_widget.ui) polyhedron_demo_plugin(shortest_path_plugin Shortest_path_plugin diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp deleted file mode 100644 index 860cc2d66e9d..000000000000 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/Offset_meshing_plugin.cpp +++ /dev/null @@ -1,691 +0,0 @@ -#include "config.h" -#ifdef CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER -#include -#include "ui_Remeshing_dialog.h" - -#include -#include -#include -#include -#include -#include -#include -#include "Scene_surface_mesh_item.h" -#include "Scene_polygon_soup_item.h" -#include "Scene_polylines_item.h" -#include -#include -#include -#include - -#include "C3t3_type.h" - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include // std::shared_ptr - -namespace CGAL{ - -template -class Offset_function -{ - typedef AABB_face_graph_triangle_primitive Primitive; - typedef AABB_traits Traits; - typedef AABB_tree Tree; - typedef Side_of_triangle_mesh Side_of; - -public: - - Offset_function(TriangleMesh& tm, double offset_distance) - : m_tree_ptr(new Tree(boost::begin(faces(tm)), - boost::end(faces(tm)), - tm) ) - , m_side_of_ptr( new Side_of(*m_tree_ptr) ) - , m_offset_distance(offset_distance) - , m_is_closed( is_closed(tm) ) - { - CGAL_assertion(!m_tree_ptr->empty()); - } - - double operator()(const typename GeomTraits::Point_3& p) const - { - using CGAL::sqrt; - - Bounded_side side = m_is_closed?m_side_of_ptr->operator()(p):ON_UNBOUNDED_SIDE; - if (side==ON_BOUNDARY) return m_offset_distance; - - typename GeomTraits::Point_3 closest_point = m_tree_ptr->closest_point(p); - double distance = sqrt(squared_distance(p, closest_point)); - - return (side == ON_UNBOUNDED_SIDE ? -distance : distance) + m_offset_distance; - } - -private: - std::shared_ptr m_tree_ptr; - std::shared_ptr m_side_of_ptr; - double m_offset_distance; - bool m_is_closed; - -}; - -class Polygon_soup_offset_function { - typedef Scene_polygon_soup_item::Points Points; - typedef Scene_polygon_soup_item::Polygons Polygons; - - typedef Polygons::const_iterator Polygon_iterator; - - - class Polygon_soup_point_property_map { - const Points* points_vector_ptr; - public: - typedef Polygon_iterator key_type; - typedef EPICK::Point_3 value_type; - typedef const value_type& reference; - typedef boost::readable_property_map_tag category; - - Polygon_soup_point_property_map() = default; - Polygon_soup_point_property_map(const Points* ptr) - : points_vector_ptr(ptr) - {} - - friend reference get(Polygon_soup_point_property_map map, - key_type polygon_it) - { - return (*map.points_vector_ptr)[*polygon_it->begin()]; - } - }; - - - class Polygon_soup_triangle_property_map { - const Points* points_vector_ptr; - public: - typedef Polygon_iterator key_type; - typedef EPICK::Triangle_3 value_type; - typedef value_type reference; - typedef boost::readable_property_map_tag category; - - Polygon_soup_triangle_property_map() = default; - Polygon_soup_triangle_property_map(const Points* ptr) - : points_vector_ptr(ptr) - {} - - friend value_type get(Polygon_soup_triangle_property_map map, - key_type polygon_it) - { - auto it = polygon_it->begin(); - CGAL_assertion(it != polygon_it->end()); - const auto id0 = *it++; - CGAL_assertion(it != polygon_it->end()); - const auto id1 = *it++; - CGAL_assertion(it != polygon_it->end()); - const auto id2 = *it++; - CGAL_assertion(it == polygon_it->end()); - - return value_type( (*map.points_vector_ptr)[id0], - (*map.points_vector_ptr)[id1], - (*map.points_vector_ptr)[id2] ); - } - }; - - struct AABB_primitive : - public CGAL::AABB_primitive - { - typedef CGAL::AABB_primitive Base; - - typedef Polygon_iterator Id; - - template - AABB_primitive(Id id, ObjectPmap&& opmap, PointPmap&& ppmap) - : Base(id, std::forward(opmap), std::forward(ppmap)) - {} - - template - AABB_primitive(Iterator it, ObjectPmap&& opmap, PointPmap&& ppmap) - : Base(*it, std::forward(opmap), std::forward(ppmap)) - {} - }; // end struct template AABB_primitive - - - typedef CGAL::AABB_traits AABB_traits; - typedef CGAL::AABB_tree AABB_tree; - - std::shared_ptr m_tree_ptr; - double m_offset_distance; - - typedef Polygon_soup_triangle_property_map ObjectPmap; - typedef Polygon_soup_point_property_map PointPmap; -public: - Polygon_soup_offset_function(const Scene_polygon_soup_item* soup, - const double offset_distance) - : m_tree_ptr - (std::make_shared(begin(soup->polygons()), - end(soup->polygons()), - ObjectPmap(&soup->points()), - PointPmap(&soup->points())) - ) - , m_offset_distance(offset_distance) - { - CGAL_assertion(! m_tree_ptr->empty() ); - } - - double operator()(const EPICK::Point_3& p) const - { - using CGAL::sqrt; - - EPICK::Point_3 closest_point = m_tree_ptr->closest_point(p); - double distance = sqrt(squared_distance(p, closest_point)); - - return m_offset_distance - distance; - } - -}; // end class Polygon_soup_offset_function - -} //end of CGAL namespace - -Scene_surface_mesh_item* make_item(SMesh* sm) -{ - return new Scene_surface_mesh_item(sm); -} - -CGAL::Offset_function -offset_function(SMesh* surface_mesh_ptr, double offset_value) { - return { *surface_mesh_ptr, offset_value }; -} - -CGAL::Polygon_soup_offset_function -offset_function(Scene_polygon_soup_item* item, double offset_value) { - return { item, offset_value }; -} - -template -struct Result_type { - typedef T type; -}; - -template <> -struct Result_type { - typedef SMesh type; -}; - -template -CGAL::Bbox_3 bbox(Mesh* mesh_ptr) { - return CGAL::Polygon_mesh_processing::bbox(*mesh_ptr); -} - -CGAL::Bbox_3 bbox(Scene_polygon_soup_item* item) { - return item->bbox(); -} -class MeshGuard{ - SMesh* mesh; - bool done; -public: - MeshGuard(SMesh* mesh):mesh(mesh), done(false){} - void setDone(){done = true;} - ~MeshGuard(){ - if(!done) - delete mesh; - } -}; -// declare the CGAL function -template -SMesh* cgal_off_meshing(QWidget*, - Mesh* tm_ptr, - Scene_polylines_item* polylines_item, - const double offset_value, - const double angle, - const double sizing, - const double approx, - const double edge_size, - int tag) -{ - typedef EPICK GT; - typedef CGAL::Labeled_mesh_domain_3 Mesh_domain_base; - typedef CGAL::Mesh_domain_with_polyline_features_3 Mesh_domain; - typedef C3t3::Triangulation Tr; - typedef CGAL::Mesh_criteria_3 Mesh_criteria; - typedef GT::Sphere_3 Sphere_3; - - CGAL::Bbox_3 bbox = ::bbox(tm_ptr); - - GT::Point_3 center((bbox.xmax()+bbox.xmin())/2, - (bbox.ymax()+bbox.ymin())/2, - (bbox.zmax()+bbox.zmin())/2); - double sqrad = 0.6 * std::sqrt( CGAL::square(bbox.xmax()-bbox.xmin())+ - CGAL::square(bbox.ymax()-bbox.ymin())+ - CGAL::square(bbox.zmax()-bbox.zmin()) ) - + offset_value; - sqrad=CGAL::square(sqrad); - - CGAL::Timer timer; - timer.start(); - - namespace p = CGAL::parameters; - - Mesh_domain domain = - Mesh_domain::create_implicit_mesh_domain - (p::function = offset_function(tm_ptr, offset_value), - p::bounding_object = Sphere_3(center, sqrad), - p::relative_error_bound = 1e-7, - p::construct_surface_patch_index = [](int i, int j) { return (i * 1000 + j); }); - - const CGAL::Mesh_facet_topology topology = CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH; - auto manifold_option = p::non_manifold(); - if(tag == 1) manifold_option = p::manifold_with_boundary(); - if(tag == 2) manifold_option = p::manifold(); - Mesh_criteria criteria(p::facet_angle = angle, - p::facet_size = sizing, - p::facet_distance = approx, - p::facet_topology = topology, - p::edge_size = edge_size); - - if (polylines_item!=nullptr) - { - typedef std::vector Surface_patch_ids; - std::vector surface_patch_ids; - - domain.add_features_and_incidences(polylines_item->polylines.begin(), - polylines_item->polylines.end(), - CGAL::Identity_property_map(), - CGAL::Constant_property_map( - surface_patch_ids)); - } - - C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, - p::no_perturb(), - p::no_exude(), - manifold_option); - - const Tr& tr = c3t3.triangulation(); - - timer.stop(); - std::cerr << "done (" << timer.time() << " ms, " << tr.number_of_vertices() << " vertices)" << std::endl; - - if(tr.number_of_vertices() > 0) - { - typedef typename Result_type::type Result_mesh; - // add remesh as new polyhedron - Result_mesh *pRemesh = new Result_mesh; - //if the thread is interrupted before the mesh is returned, delete it. - MeshGuard guard(pRemesh); - CGAL::facets_in_complex_3_to_triangle_mesh(c3t3, *pRemesh); - guard.setDone(); - if(CGAL::is_closed(*pRemesh) - && ! CGAL::Polygon_mesh_processing::is_outward_oriented(*pRemesh)) - { - CGAL::Polygon_mesh_processing::reverse_face_orientations(*pRemesh); - } - - return pRemesh; - } - else - return nullptr; -} - -struct Mesher_thread:public QThread{ - Q_OBJECT - -private: - SMesh* sMesh; - Scene_polygon_soup_item* soup_item; - Scene_polylines_item* polylines_item; - const double offset_value; - const double angle; - const double sizing; - const double approx; - const double edge_size; - int tag_index; -public: - Mesher_thread( SMesh* tm_ptr, - Scene_polygon_soup_item* soup_item, - Scene_polylines_item* polylines_item, - const double offset_value, - const double angle, - const double sizing, - const double approx, - const double edge_size, - int tag) - :sMesh(tm_ptr), soup_item(soup_item), polylines_item(polylines_item), - offset_value(offset_value), angle(angle), - sizing(sizing), approx(approx), edge_size(edge_size), tag_index(tag){ - } - void run() override { - SMesh* new_mesh= nullptr; - if(soup_item) - new_mesh = cgal_off_meshing(CGAL::Three::Three::mainWindow(), - soup_item, - polylines_item, - offset_value, - angle, - sizing, - approx, - edge_size, - tag_index); - else - new_mesh = cgal_off_meshing(CGAL::Three::Three::mainWindow(), - sMesh, - polylines_item, - offset_value, - angle, - sizing, - approx, - edge_size, - tag_index); - CGAL::Three::Three::getMutex()->lock(); - CGAL::Three::Three::getWaitCondition()->wakeAll(); - CGAL::Three::Three::getMutex()->unlock(); - Q_EMIT resultReady(new_mesh); - } -Q_SIGNALS: - void resultReady(SMesh *new_mesh); -}; - -using namespace CGAL::Three; -class Polyhedron_demo_offset_meshing_plugin : - public QObject, - protected Polyhedron_demo_plugin_interface -{ - Q_OBJECT - Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) - Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") - -public: - void init(QMainWindow* mainWindow, CGAL::Three::Scene_interface* scene_interface, Messages_interface*) { - this->scene = scene_interface; - this->mw = mainWindow; - actionOffsetMeshing = new QAction(tr("Offset Meshing"), mw); - actionOffsetMeshing->setProperty("subMenuName", "3D Surface Mesh Generation"); - if(actionOffsetMeshing) { - connect(actionOffsetMeshing, SIGNAL(triggered()), - this, SLOT(offset_meshing())); - } - - actionInflateMesh= new QAction(tr("Inflate Mesh"), mw); - actionInflateMesh->setProperty("subMenuName", "Operations on Polyhedra"); - if(actionInflateMesh) { - connect(actionInflateMesh, SIGNAL(triggered()), - this, SLOT(inflate_mesh())); - } - } - - bool applicable(QAction*) const { - if ( scene->selectionIndices().size() != 1 && - scene->selectionIndices().size() != 2 ) - { - return false; - } - - Q_FOREACH(CGAL::Three::Scene_interface::Item_id index, scene->selectionIndices()) - { - if ( qobject_cast(scene->item(index)) || - qobject_cast(scene->item(index)) ) - return true; - } - return false; - } - - QList actions() const { - return QList() << actionOffsetMeshing - << actionInflateMesh; - } -public Q_SLOTS: - void offset_meshing(); - void inflate_mesh(); - -private: - QAction* actionOffsetMeshing; - QAction* actionInflateMesh; - Scene_interface *scene; - QMainWindow *mw; -}; // end class Polyhedron_demo_offset_meshing_plugin - -void Polyhedron_demo_offset_meshing_plugin::inflate_mesh() -{ - const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); - Scene_item* item = scene->item(index); - if(item == nullptr){ - return; - } - - Scene_surface_mesh_item* sm_item = - qobject_cast(item); - - if(sm_item == nullptr){ - return; - } - - SMesh* sMesh = sm_item->face_graph(); - - if(sMesh == nullptr){ - return; - } - - double diag = sm_item->diagonalBbox(); - double offset_value = QInputDialog::getDouble(mw, - QString("Choose Inflate Distance"), - QString("Inflate Distance (use negative number for deflate)"), - 0.1*diag, - -(std::numeric_limits::max)(), - (std::numeric_limits::max)(), 10); - - auto vpm = get(CGAL::vertex_point,*sMesh); - auto vnm = - sMesh->property_map("v:normal").first; - - for(const auto& v : vertices(*sMesh)) - { - Point_3 p = get(vpm, v); - EPICK::Vector_3 n = get(vnm, v); - n/=(CGAL::sqrt(n.squared_length())); - put(vpm, v, p + offset_value*n); - } - sm_item->invalidateOpenGLBuffers(); -} - -void Polyhedron_demo_offset_meshing_plugin::offset_meshing() -{ - Scene_surface_mesh_item* sm_item = nullptr; - Scene_polygon_soup_item* soup_item = nullptr; - Scene_polylines_item* polylines_item = nullptr; - Scene_item* item = nullptr; - - bool mesh_or_soup_item_found = false; - - Q_FOREACH(CGAL::Three::Scene_interface::Item_id index, scene->selectionIndices()) - { - if (!mesh_or_soup_item_found) - { - sm_item = qobject_cast(scene->item(index)); - if (sm_item == nullptr) - { - soup_item = qobject_cast(item); - if (soup_item != nullptr) - { - item=scene->item(index); - mesh_or_soup_item_found = true; - continue; - } - } - else - { - item=scene->item(index); - mesh_or_soup_item_found = true; - continue; - } - } - polylines_item = qobject_cast(scene->item(index)); - } - - SMesh* sMesh = nullptr; - double diag = 0; - Scene_item::Bbox box; - if(sm_item) - { - sMesh = sm_item->face_graph(); - if(!sMesh) - return; - box = bbox(sMesh); - } - else if(soup_item != nullptr) - { - box = bbox(soup_item); - } - else if(soup_item == nullptr) - return; - double X=(box.max)(0)-(box.min)(0), - Y = (box.max)(1)-(box.min)(1), - Z = (box.max)(2)-(box.min)(2); - diag = CGAL::sqrt(X*X+Y*Y+Z*Z); - double offset_value = QInputDialog::getDouble(mw, - QString("Choose Offset Value"), - QString("Offset Value (use negative number for inset)"), - 0.1*diag, - -(std::numeric_limits::max)(), - (std::numeric_limits::max)(), 10); - - QDialog dialog(mw); - Ui::Remeshing_dialog ui; - ui.setupUi(&dialog); - ui.angle->setRange(1.0, 30.0); - connect(ui.buttonBox, SIGNAL(accepted()), - &dialog, SLOT(accept())); - connect(ui.buttonBox, SIGNAL(rejected()), - &dialog, SLOT(reject())); - - ui.sizing->setRange(diag * 10e-6, // min - diag); // max - ui.sizing->setValue(diag * 0.05); // default value - - ui.approx->setRange(diag * 10e-7, // min - diag); // max - ui.approx->setValue(diag * 0.005); - - if (polylines_item!=nullptr) - { - ui.edge_sizing->setRange(diag * 10e-6, // min - diag); // max - ui.edge_sizing->setValue(diag * 0.05); // default value - } - else - ui.edge_sizing->setEnabled(false); - - int i = dialog.exec(); - if(i == QDialog::Rejected) - return; - - const double angle = ui.angle->value(); - const double approx = ui.approx->value(); - const double sizing = ui.sizing->value(); - const double edge_size=polylines_item!=nullptr?ui.edge_sizing->value():0; - const int tag_index = ui.tags->currentIndex(); - - if(tag_index < 0) return; - - QApplication::setOverrideCursor(Qt::WaitCursor); - - std::cerr << "mesh with:" - << "\n angle=" << angle - << "\n sizing=" << sizing - << "\n approx=" << approx - << "\n tag=" << tag_index - << std::boolalpha - << std::endl; - Mesher_thread* worker = nullptr; - if(soup_item) - worker = new Mesher_thread(nullptr, - soup_item, - polylines_item, - offset_value, - angle, - sizing, - approx, - edge_size, - tag_index); - else - worker = new Mesher_thread(sMesh, - nullptr, - polylines_item, - offset_value, - angle, - sizing, - approx, - edge_size, - tag_index); - connect(worker, &QThread::finished, worker, &QObject::deleteLater); - connect(worker, &Mesher_thread::resultReady, this, - [item, angle, sizing, approx, offset_value/* , index */] - (SMesh *new_mesh){ - QApplication::restoreOverrideCursor(); - if(!new_mesh){ - CGAL::Three::Three::getMutex()->lock(); - CGAL::Three::Three::isLocked() = false; - CGAL::Three::Three::getMutex()->unlock(); - return; - } - Scene_surface_mesh_item* new_item = new Scene_surface_mesh_item(new_mesh); - new_item->setName(tr("%1 offset %5 (%2 %3 %4)") - .arg(item->name()) - .arg(angle) - .arg(sizing) - .arg(approx) - .arg(offset_value)); - new_item->setColor(Qt::magenta); - new_item->setWireframeMode(); - CGAL::Three::Three::scene()->addItem(new_item); -// CGAL::Three::Three::scene()->itemChanged(index); - QApplication::restoreOverrideCursor(); - CGAL::Three::Three::getMutex()->lock(); - CGAL::Three::Three::isLocked() = false; - CGAL::Three::Three::getMutex()->unlock(); - }); - QMessageBox* message_box = new QMessageBox(QMessageBox::NoIcon, - "Meshing", - "Offset meshing in progress...", - QMessageBox::Cancel, - mw); - message_box->setDefaultButton(QMessageBox::Cancel); - QAbstractButton* cancelButton = message_box->button(QMessageBox::Cancel); - cancelButton->setText(tr("Stop")); - - connect(cancelButton, &QAbstractButton::clicked, - this, [worker](){ - worker->terminate(); - QApplication::restoreOverrideCursor();//waitcursor - QApplication::restoreOverrideCursor();//busycursor - }); - connect(worker, &Mesher_thread::finished, - message_box, &QMessageBox::close); - message_box->open(); - - QApplication::setOverrideCursor(Qt::BusyCursor); - CGAL::Three::Three::getMutex()->lock(); - CGAL::Three::Three::isLocked() = true; - CGAL::Three::Three::getMutex()->unlock(); - worker->start(); -} - -#include "Offset_meshing_plugin.moc" - -#endif // CGAL_POLYHEDRON_DEMO_USE_SURFACE_MESHER From 45c7b0015f8f54e8f2fb517b6f5bc54181979467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 12 Jun 2023 10:55:56 +0200 Subject: [PATCH 0340/1398] add stop --- .../examples/Polygon_mesh_processing/soup_autorefinement.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index 823c50974dcc..9e4999287f7b 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -37,6 +37,7 @@ int main(int argc, char** argv) PMP::autorefine_soup_output(input_points, input_triangles, output_points, output_triangles, CGAL::parameters::concurrency_tag(CGAL::Parallel_if_available_tag())); + t.stop(); std::cout << "#points = " << output_points.size() << " and #triangles = " << output_triangles.size() << " in " << t.time() << " sec." << std::endl; CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); From 41449d71cd3c3d7b8be578f0e3f56a3a14fc5842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 12 Jun 2023 11:05:11 +0200 Subject: [PATCH 0341/1398] fix bug when setting the ids of points 2 options, one with mutex and one without. As this section is not critical, we do not really see a runtime difference (without mutex seems faster so I pick that one as default) --- .../Polygon_mesh_processing/autorefinement.h | 127 ++++++++++++++---- 1 file changed, 102 insertions(+), 25 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 11b15fa4ec47..9bbc67efb487 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -43,6 +43,9 @@ #include #include #include +#ifdef SET_POINT_IDS_USING_MUTEX +#include +#endif #endif #include @@ -1242,12 +1245,17 @@ void autorefine_soup_output(const PointRange& input_points, } } #ifdef USE_DEBUG_PARALLEL_TIMERS + t.stop(); std::cout << t.time() << " sec. for #2" << std::endl; + t.reset(); #endif #ifdef DEDUPLICATE_SEGMENTS +#ifdef USE_DEBUG_PARALLEL_TIMERS + t.start(); +#endif + // deduplicate inserted segments - //TODO: PARALLEL_FOR #3 std::vector>> all_segments_ids(all_segments.size()); auto deduplicate_inserted_segments = [&](std::size_t ti) @@ -1313,7 +1321,9 @@ void autorefine_soup_output(const PointRange& input_points, } #ifdef USE_DEBUG_PARALLEL_TIMERS + t.stop(); std::cout << t.time() << " sec. for #3" << std::endl; + t.reset(); #endif #endif @@ -1370,7 +1380,6 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef USE_DEBUG_PARALLEL_TIMERS - t.reset(); t.start(); #endif #ifdef CGAL_LINKED_WITH_TBB @@ -1427,8 +1436,7 @@ void autorefine_soup_output(const PointRange& input_points, return insert_res.first->second; }; - - + // TODO: parallel_for? std::vector input_point_ids; input_point_ids.reserve(input_points.size()); for (const auto& p : input_points) @@ -1451,9 +1459,7 @@ void autorefine_soup_output(const PointRange& input_points, } // import refined triangles - //TODO: PARALLEL_FOR #4 #ifdef USE_DEBUG_PARALLEL_TIMERS - t.reset(); t.start(); #endif @@ -1466,37 +1472,108 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef CGAL_LINKED_WITH_TBB if(parallel_execution && new_triangles.size() > 100) { - tbb::concurrent_vector concurrent_soup_points; + +#ifdef SET_POINT_IDS_USING_MUTEX + //option 1 (using a mutex) + CGAL_MUTEX point_container_mutex; /// Lambda concurrent_get_point_id() - auto concurrent_get_point_id = [&](const typename EK::Point_3& pt) + auto concurrent_get_point_id = [&](const typename EK::Point_3 pt) { - auto insert_res = point_id_map.insert(std::make_pair(pt, concurrent_soup_points.size())); - if (insert_res.second) - { - concurrent_soup_points.push_back(to_input(pt)); + auto insert_res = point_id_map.insert(std::make_pair(pt, -1)); + + if (insert_res.second) + { + CGAL_SCOPED_LOCK(point_container_mutex); + insert_res.first->second=soup_points.size(); + soup_points.push_back(to_input(pt)); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.push_back(pt); + exact_soup_points.push_back(pt); #endif - } - return insert_res.first->second; + } + return insert_res.first; }; + soup_triangles.resize(offset + new_triangles.size()); + //use map iterator triple for triangles to create them concurrently and safely + std::vector::iterator, 3>> triangle_buffer(new_triangles.size()); + tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) { + const std::array& t = new_triangles[ti]; + triangle_buffer[ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); + } + } + ); + tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + { + soup_triangles[offset + ti] = + CGAL::make_array(triangle_buffer[ti][0]->second, + triangle_buffer[ti][1]->second, + triangle_buffer[ti][2]->second); + } + } + ); +#else + //option 2 (without mutex) + /// Lambda concurrent_get_point_id() + tbb::concurrent_vector::iterator> iterators; + auto concurrent_get_point_id = [&](const typename EK::Point_3 pt) + { + auto insert_res = point_id_map.insert(std::make_pair(pt, -1)); + if (insert_res.second) + iterators.push_back(insert_res.first); + return insert_res.first; + }; + //use map iterator triple for triangles to create them concurrently and safely soup_triangles.resize(offset + new_triangles.size()); + std::vector::iterator, 3>> triangle_buffer(new_triangles.size()); tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), - [&](const tbb::blocked_range& r) { - for (size_t ti = r.begin(); ti != r.end(); ++ti) { - if (offset + ti > soup_triangles.size()) { - std::cout << "ti = " << ti << std::endl; - } - const std::array& t = new_triangles[ti]; - soup_triangles[offset + ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); - } + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) { + if (offset + ti > soup_triangles.size()) { + std::cout << "ti = " << ti << std::endl; + } + const std::array& t = new_triangles[ti]; + triangle_buffer[ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); + } + } + ); + + // the map is now filled we can safely set the point ids + std::size_t pid_offset=soup_points.size(); + soup_points.resize(pid_offset+iterators.size()); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.resize(soup_points.size()); +#endif + + tbb::parallel_for(tbb::blocked_range(0, iterators.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + { + soup_points[pid_offset+ti] = to_input(iterators[ti]->first); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points[pid_offset+ti] = iterators[ti]->first; +#endif + iterators[ti]->second=pid_offset+ti; } + } ); - soup_points.reserve(soup_points.size() + concurrent_soup_points.size()); - soup_points.insert(soup_points.end(), concurrent_soup_points.begin(), concurrent_soup_points.end()); + tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), + [&](const tbb::blocked_range& r) { + for (size_t ti = r.begin(); ti != r.end(); ++ti) + { + soup_triangles[offset + ti] = + CGAL::make_array(triangle_buffer[ti][0]->second, + triangle_buffer[ti][1]->second, + triangle_buffer[ti][2]->second); + } + } + ); +#endif } else #endif From ddb405a2c23db2416808271f9181804113cea5e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Jun 2023 10:40:06 +0200 Subject: [PATCH 0342/1398] move specialization into the header (avoid superflous include) --- Number_types/include/CGAL/Lazy_exact_nt.h | 21 ++++++++++++++++++- .../internal/Exact_type_selector.h | 16 -------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index 38c55c62d325..5af1544eb082 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -34,6 +34,8 @@ #include #include #include +#include + #include @@ -1427,7 +1429,24 @@ class Modular_traits > #undef CGAL_int #undef CGAL_To_interval -} //namespace CGAL +namespace internal { + +template < typename ET > +struct Exact_field_selector > +: Exact_field_selector +{ + // We have a choice here : + // - using ET gets rid of the DAG computation as well as redoing the interval + // - using Lazy_exact_nt might use sharper intervals. + // typedef ET Type; + // typedef Lazy_exact_nt Type; +}; +template < typename ET > +struct Exact_ring_selector > +: Exact_ring_selector +{}; + +} } //namespace CGAL::internal namespace Eigen { template struct NumTraits; diff --git a/Number_types/include/CGAL/Number_types/internal/Exact_type_selector.h b/Number_types/include/CGAL/Number_types/internal/Exact_type_selector.h index f69df29f2bf7..f0d8e961c325 100644 --- a/Number_types/include/CGAL/Number_types/internal/Exact_type_selector.h +++ b/Number_types/include/CGAL/Number_types/internal/Exact_type_selector.h @@ -22,7 +22,6 @@ #include #include #include -#include #include @@ -280,21 +279,6 @@ struct Exact_ring_selector::Rational> { typedef Exact_NT_backend::Rational Type; }; #endif -template < typename ET > -struct Exact_field_selector > -: Exact_field_selector -{ - // We have a choice here : - // - using ET gets rid of the DAG computation as well as redoing the interval - // - using Lazy_exact_nt might use sharper intervals. - // typedef ET Type; - // typedef Lazy_exact_nt Type; -}; -template < typename ET > -struct Exact_ring_selector > -: Exact_ring_selector -{}; - #ifndef CGAL_NO_DEPRECATED_CODE // Added for backward compatibility template < typename ET > From 5564cb247f45a1c24ad3131a994a87126f97aef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:08:58 +0200 Subject: [PATCH 0343/1398] bump CGAL version to 6.0 --- Installation/include/CGAL/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index d90474f89134..482cd7db1a64 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,12 +17,12 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 5.6-beta1 +#define CGAL_VERSION 6.0-beta1 #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1050600910 +#define CGAL_VERSION_NR 1060000910 #define CGAL_SVN_REVISION 99999 -#define CGAL_RELEASE_DATE 20230430 +#define CGAL_RELEASE_DATE 20231001 #include From a9e1d599aa8bbe679bc8ae025b467c4db674c9ef Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 13 Jun 2023 12:45:58 +0200 Subject: [PATCH 0344/1398] more warnings lcc --- .../test/Linear_cell_complex/Linear_cell_complex_3_test.cpp | 3 ++- .../test/Linear_cell_complex/Linear_cell_complex_4_test.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.cpp b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.cpp index c1d6eb4cdfef..6e04cbb07a3a 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.cpp +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.cpp @@ -32,7 +32,8 @@ struct Myattrib : public CGAL::Cell_attribute_with_point struct MonInfo { - MonInfo(int i=0) : mnb(i==0?rand():i), ptr(reinterpret_cast(this)) + MonInfo(long long int i=0) : mnb(i==0?rand():static_cast(i)), + ptr(reinterpret_cast(this)) {} bool operator==(const MonInfo& info) const diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.cpp b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.cpp index 737e6b965ba2..b4d882132755 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.cpp +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_4_test.cpp @@ -35,7 +35,8 @@ struct Myattrib : public CGAL::Cell_attribute_with_point struct MonInfo { - MonInfo(int i=0) : mnb(i==0?rand():i), ptr(reinterpret_cast(this)) + MonInfo(long long int i=0) : mnb(i==0?rand():static_cast(i)), + ptr(reinterpret_cast(this)) {} bool operator==(const MonInfo& info) const From 29b84248f844608560adeda5afd1641d38403612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 23:08:22 +0200 Subject: [PATCH 0345/1398] missing 6.0 updates # Conflicts: # Documentation/doc/resources/1.8.20/menu_version.js # Documentation/doc/resources/1.8.4/menu_version.js # Documentation/doc/resources/1.9.3/menu_version.js --- Documentation/doc/resources/1.8.13/menu_version.js | 3 ++- Documentation/doc/resources/1.9.6/menu_version.js | 3 ++- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/menu_version.js b/Documentation/doc/resources/1.8.13/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.8.13/menu_version.js +++ b/Documentation/doc/resources/1.8.13/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Documentation/doc/resources/1.9.6/menu_version.js b/Documentation/doc/resources/1.9.6/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.9.6/menu_version.js +++ b/Documentation/doc/resources/1.9.6/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index e71784c4c52c..fc443126c186 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ -set(CGAL_MAJOR_VERSION 5) -set(CGAL_MINOR_VERSION 6) +set(CGAL_MAJOR_VERSION 6) +set(CGAL_MINOR_VERSION 0) set(CGAL_BUGFIX_VERSION 0) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.6-beta1") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta1") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From 12cc83e7d57f806fd98f032cd18220b922a778db Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 13 Jun 2023 13:32:56 +0200 Subject: [PATCH 0346/1398] prepare the creation of 5.6-beta2 and 6.0-dev --- Installation/include/CGAL/version.h | 4 ++-- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 2 +- .../cgal.geometryfactory.com/bin/cgal_release.py | 3 +++ .../bin/create_internal_release_of_the_day.py | 8 ++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Installation/include/CGAL/version.h b/Installation/include/CGAL/version.h index 482cd7db1a64..584452d7d679 100644 --- a/Installation/include/CGAL/version.h +++ b/Installation/include/CGAL/version.h @@ -17,10 +17,10 @@ #define CGAL_VERSION_H #ifndef SWIG -#define CGAL_VERSION 6.0-beta1 +#define CGAL_VERSION 6.0-dev #define CGAL_GIT_HASH abcdef #endif -#define CGAL_VERSION_NR 1060000910 +#define CGAL_VERSION_NR 1060000900 #define CGAL_SVN_REVISION 99999 #define CGAL_RELEASE_DATE 20231001 diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index fc443126c186..2687e75956ee 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -2,7 +2,7 @@ set(CGAL_MAJOR_VERSION 6) set(CGAL_MINOR_VERSION 0) set(CGAL_BUGFIX_VERSION 0) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta1") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-dev") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py index 506343940945..a835da2c812f 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/cgal_release.py @@ -72,6 +72,9 @@ def beta_release_from_master(beta_number): rel.cwd = "$HOME/CGAL/create_internal_release" return rel +def beta_release(branch, beta_number): + """Convenience function to create a beta release from a branch""" + return BetaRelease(branch, beta_number) def release(branch): """Convenience function to create a release from a branch""" diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py index 36daeb35eaf0..cd976dd2d01e 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py @@ -8,7 +8,7 @@ import datetime import locale import argparse -from cgal_release import release, integration, master, beta_release_from_master +from cgal_release import release, integration, master, beta_release, master, beta_release_from_master # Define a dictionary that maps day of the week to an action actions = { @@ -16,9 +16,9 @@ "Tuesday": integration, "Wednesday": integration, "Thursday": integration, - "Friday": release("5.5"), - "Saturday": release("5.4"), - "Sunday": beta_release_from_master(1), + "Friday": beta_release("5.6", 2), + "Saturday": release("5.5"), + "Sunday": master, } From 5459870e311be1302ad823ed7f25aed217c8d8a0 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 13 Jun 2023 14:18:02 +0200 Subject: [PATCH 0347/1398] create a new CMake function CGAL_setup_CGAL_flags That new CMake function will ease the work with the Conan CGAL package. --- .../cmake/modules/CGAL_SetupCGALDependencies.cmake | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake index 7329be331166..fb5e92371e63 100644 --- a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake @@ -97,9 +97,6 @@ function(CGAL_setup_CGAL_dependencies target) target_compile_definitions(${target} INTERFACE CGAL_TEST_SUITE=1) endif() - # CGAL now requires C++14. `decltype(auto)` is used as a marker of C++14. - target_compile_features(${target} INTERFACE cxx_decltype_auto) - use_CGAL_Boost_support(${target} INTERFACE) # Make CGAL depend on threads-support (for Epeck and Epeck_d) @@ -119,6 +116,14 @@ function(CGAL_setup_CGAL_dependencies target) target_link_options(${target} INTERFACE -fsanitize=address) endif() # Now setup compilation flags + CGAL_setup_CGAL_flags(${target}) +endfunction() + +function(CGAL_setup_CGAL_flags target) + # CGAL now requires C++14. `decltype(auto)` is used as a marker of + # C++14. + target_compile_features(${target} INTERFACE cxx_decltype_auto) + if(MSVC) target_compile_options(${target} INTERFACE "-D_SCL_SECURE_NO_DEPRECATE;-D_SCL_SECURE_NO_WARNINGS") From 2251c438fa55a092cac42f8b49c53346a2b0d019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Jun 2023 14:30:01 +0200 Subject: [PATCH 0348/1398] enable exact serialization of triangulations with EPECK --- .../include/CGAL/Convex_hull_vertex_base_2.h | 2 +- Stream_support/include/CGAL/IO/io.h | 19 +++++++++++++++++++ .../Regular_triangulation_vertex_base_2.h | 2 +- .../CGAL/Triangulation_vertex_base_2.h | 2 +- .../Regular_triangulation_vertex_base_3.h | 2 +- .../CGAL/Triangulation_vertex_base_3.h | 3 ++- .../test/Triangulation_3/CMakeLists.txt | 1 + 7 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h index 2ec965bb8092..a7f311246463 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h @@ -77,7 +77,7 @@ template std::ostream& operator<<(std::ostream &os, const Convex_hull_vertex_base_2& v) { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index e287fe8e16f2..1034f74abff0 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -698,6 +698,25 @@ inline const char* mode_name( IO::Mode m ) return names[m]; } +namespace internal { + +template constexpr auto has_exact(int) -> decltype(exact(P()), bool()) { return true; } +template constexpr bool has_exact(...) { return false; } + +} + +template +auto +serialize(const P& p) { + if constexpr (internal::has_exact

    *vps = boost::get>(&*res); assert(vps!=nullptr); } diff --git a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h index ab57d5cfb67a..88afb8e5bfff 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h @@ -81,7 +81,7 @@ typedef Line_3 Line_2; A construction object. Provides the operator : -`boost::optional< boost::variant > operator()(Segment_2 s1, Segment_2 s2);` +`std::optional< boost::variant > operator()(Segment_2 s1, Segment_2 s2);` which returns a 3D object whose projection on the xy-plane is the intersection of the projections of `s1` and `s2`. If non empty, the returned object is either a segment or a point. diff --git a/Kernel_23/doc/Kernel_23/CGAL/intersections.h b/Kernel_23/doc/Kernel_23/CGAL/intersections.h index 1b6c85341a3a..430e37cbcc09 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/intersections.h +++ b/Kernel_23/doc/Kernel_23/CGAL/intersections.h @@ -103,7 +103,7 @@ The following tables give the possible values for `Type1` and `Type2`. The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`boost::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< boost::variant< T... > >`, the last column in the table providing the template parameter pack.

    @@ -193,7 +193,7 @@ the template parameter pack.
    Additional overloads are provided for the type `Point_2` combined with any other type with the result type being -`boost::optional< boost::variant< Point_2 > >`. +`std::optional< boost::variant< Point_2 > >`. Overloads are also provided for the type `Bbox_2`, for all intersections existing with the type `Iso_rectangle_2`. Note that the return type for `Bbox_2` - `Bbox_2` is `Bbox_2` and not `Iso_rectangle_2`. @@ -202,7 +202,7 @@ intersections existing with the type `Iso_rectangle_2`. Note that the return typ The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`boost::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< boost::variant< T... > >`, the last column in the table providing the template parameter pack.
    @@ -351,7 +351,7 @@ the template parameter pack.
    Additional overloads are provided for the type `Point_3` combined with any other type with the result type being -`boost::optional< boost::variant< Point_3 > >`. Overloads are also provided for the type `Bbox_3`, for all +`std::optional< boost::variant< Point_3 > >`. Overloads are also provided for the type `Bbox_3`, for all intersections existing with the type `Iso_cuboid_3`. Note that the return type for `Bbox_3` - `Bbox_3` is `Bbox_3` and not `Iso_cuboid_3`. @@ -363,10 +363,10 @@ The following examples demonstrate the most common use of In the first two examples we intersect a segment and a line. The result type can be specified through the placeholder type specifier `auto`, -but you must anyway know that the result type is a `boost::optional >`, +but you must anyway know that the result type is a `std::optional >`, in order to unpack the point or segment. -`boost::optional` comes in +`std::optional` comes in as there might be no intersection. `boost::variant` comes in as, if there is an intersection, it is either a point or a segment. diff --git a/Kernel_23/doc/Kernel_23/Kernel_23.txt b/Kernel_23/doc/Kernel_23/Kernel_23.txt index 51eeea986db2..451829f8eaee 100644 --- a/Kernel_23/doc/Kernel_23/Kernel_23.txt +++ b/Kernel_23/doc/Kernel_23/Kernel_23.txt @@ -495,7 +495,7 @@ especially integer types and rationals. Some functions, for example \link intersection_linear_grp `intersection()`\endlink, can return different types of objects. To achieve this in a type-safe way \cgal uses -return values of type `boost::optional< boost::variant< T... > >` where `T...` is a +return values of type `std::optional< boost::variant< T... > >` where `T...` is a list of all possible resulting geometric objects. The exact result type of an intersection can be specified through the placeholder type specifier `auto`. diff --git a/Kernel_23/include/CGAL/Kernel/Type_mapper.h b/Kernel_23/include/CGAL/Kernel/Type_mapper.h index 683b7fe9255c..a33224fcd59d 100644 --- a/Kernel_23/include/CGAL/Kernel/Type_mapper.h +++ b/Kernel_23/include/CGAL/Kernel/Type_mapper.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include @@ -54,8 +54,8 @@ struct Type_mapper_impl, K1, K2 > { }; template < typename T, typename K1, typename K2 > -struct Type_mapper_impl, K1, K2 > { - typedef boost::optional< typename Type_mapper_impl::type > type; +struct Type_mapper_impl, K1, K2 > { + typedef std::optional< typename Type_mapper_impl::type > type; }; diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 07468ad23a89..29d74179a87c 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -1764,7 +1764,7 @@ namespace CommonKernelFunctors { Line l2 = construct_line(l21, l22); const auto res = typename K::Intersect_3()(l1,l2); - CGAL_assertion(res!=boost::none); + CGAL_assertion(res!=std::nullopt); const Point* e_pt = boost::get(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; @@ -2172,7 +2172,7 @@ namespace CommonKernelFunctors { Line line = construct_line( l1, l2 ); const auto res = typename K::Intersect_3()(plane,line); - CGAL_assertion(res!=boost::none); + CGAL_assertion(res!=std::nullopt); const Point* e_pt = boost::get(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; @@ -2185,7 +2185,7 @@ namespace CommonKernelFunctors { Line line = construct_line( l1, l2 ); const auto res = typename K::Intersect_3()(plane,line); - CGAL_assertion(res!=boost::none); + CGAL_assertion(res!=std::nullopt); const Point* e_pt = boost::get(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; @@ -3618,7 +3618,7 @@ namespace CommonKernelFunctors { operator()(const T1& t1, const T2& t2) const { return Intersections::internal::intersection(t1, t2, K() ); } - boost::optional > + std::optional > operator()(const Plane_3& pl1, const Plane_3& pl2, const Plane_3& pl3)const { return Intersections::internal::intersection(pl1, pl2, pl3, K() ); } }; @@ -3635,7 +3635,7 @@ namespace CommonKernelFunctors { typedef typename K::Point_3 Point_3; typedef typename K::Line_3 Line_3; typedef typename K::Plane_3 Plane_3; - typedef typename boost::optional result_type; + typedef typename std::optional result_type; result_type operator()(const Plane_3& pl1, const Plane_3& pl2, const Plane_3& pl3) const diff --git a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h index 9f9896ac7eb3..d1cb83d135de 100644 --- a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h +++ b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h @@ -428,7 +428,7 @@ class Intersect_projected_3 - boost::optional< boost::variant > + std::optional< boost::variant > operator()(const Segment_3& s1, const Segment_3& s2) const { typedef boost::variant variant_type; @@ -447,7 +447,7 @@ class Intersect_projected_3 auto o = intersection(s1_2,s2_2); if(! o){ - return boost::none; + return std::nullopt; } if(const Segment_2* si = boost::get(&*o)){ @@ -468,7 +468,7 @@ class Intersect_projected_3 src[Projector::y_index] = si->source().y(); tgt[Projector::x_index] = si->target().x(); tgt[Projector::y_index] = si->target().y(); - return boost::make_optional(variant_type(Segment_3( Point_3(src[0],src[1],src[2]),Point_3(tgt[0],tgt[1],tgt[2]) ) ) ); + return std::make_optional(variant_type(Segment_3( Point_3(src[0],src[1],src[2]),Point_3(tgt[0],tgt[1],tgt[2]) ) ) ); } @@ -484,7 +484,7 @@ class Intersect_projected_3 Point_3 res(coords[0],coords[1],coords[2]); CGAL_assertion(x(res)==pi->x() && y(res)==pi->y()); - return boost::make_optional(variant_type(res)); + return std::make_optional(variant_type(res)); } }; diff --git a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h index 42c3bc318592..873ad1bcb144 100644 --- a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h +++ b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h @@ -182,7 +182,7 @@ class Projected_intersect_3 CGAL_TIME_PROFILER("Construct Projected_intersect_3") } - boost::optional > + std::optional > operator()(const Segment& s1, const Segment& s2) { CGAL_PROFILER("Projected_intersect_3::operator()") @@ -204,7 +204,7 @@ class Projected_intersect_3 #ifdef CGAL_T2_PTB_3_DEBUG std::cerr << "planes_intersection is empty\n"; #endif - return boost::none; + return std::nullopt; } if(const Line* line = boost::get(&*planes_intersection)) { @@ -222,7 +222,7 @@ class Projected_intersect_3 #ifdef CGAL_T2_PTB_3_DEBUG std::cerr << "intersection not inside\n"; #endif - return boost::none; + return std::nullopt; } else { @@ -233,10 +233,10 @@ class Projected_intersect_3 cross_product(s1.to_vector(), s2.to_vector()))); if(! inter){ - return boost::none; + return std::nullopt; } if(const Point* point = boost::get(&*inter)){ - return boost::make_optional(variant_type(*point)); + return std::make_optional(variant_type(*point)); } } } @@ -255,50 +255,50 @@ class Projected_intersect_3 bool src1_in_s2 = is_inside_segment(s2, s1.source()); bool tgt1_in_s2 = is_inside_segment(s2, s1.target()); - if (src1_in_s2 && tgt1_in_s2) return boost::make_optional(variant_type(s1)); - if (src2_in_s1 && tgt2_in_s1) return boost::make_optional(variant_type(s2)); + if (src1_in_s2 && tgt1_in_s2) return std::make_optional(variant_type(s1)); + if (src2_in_s1 && tgt2_in_s1) return std::make_optional(variant_type(s2)); if (src1_in_s2) { if (src2_in_s1) { if (cross_product(normal, Vector_3(s1.source(), s2.source())) != NULL_VECTOR) - return boost::make_optional(variant_type(Segment(s1.source(), s2.source()))); + return std::make_optional(variant_type(Segment(s1.source(), s2.source()))); else - return boost::make_optional(variant_type((s1.source()))); + return std::make_optional(variant_type((s1.source()))); } if (tgt2_in_s1) { if (cross_product(normal, Vector_3(s1.source(), s2.target())) != NULL_VECTOR) - return boost::make_optional(variant_type(Segment(s1.source(), s2.target()))); + return std::make_optional(variant_type(Segment(s1.source(), s2.target()))); else - return boost::make_optional(variant_type(s1.source())); + return std::make_optional(variant_type(s1.source())); } // should never get here with a Kernel with exact constructions - return boost::make_optional(variant_type(s1.source())); + return std::make_optional(variant_type(s1.source())); } if (tgt1_in_s2) { if (src2_in_s1) { if (cross_product(normal, Vector_3(s1.target(), s2.source())) != NULL_VECTOR) - return boost::make_optional(variant_type(Segment(s1.target(), s2.source()))); + return std::make_optional(variant_type(Segment(s1.target(), s2.source()))); else - return boost::make_optional(variant_type(s1.target())); + return std::make_optional(variant_type(s1.target())); } if (tgt2_in_s1) { if (cross_product(normal, Vector_3(s1.target(), s2.target())) != NULL_VECTOR) - return boost::make_optional(variant_type(Segment(s1.target(), s2.target()))); + return std::make_optional(variant_type(Segment(s1.target(), s2.target()))); else - return boost::make_optional(variant_type(s1.target())); + return std::make_optional(variant_type(s1.target())); } // should never get here with a Kernel with exact constructions - return boost::make_optional(variant_type(s1.target())); + return std::make_optional(variant_type(s1.target())); } - return boost::none; + return std::nullopt; } - return boost::none; + return std::nullopt; } }; // end class Projected_intersect_3 diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_all_linear_intersections.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_all_linear_intersections.h index 4d2b09ac3b24..2e9aab53fbad 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_all_linear_intersections.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_all_linear_intersections.h @@ -1,9 +1,9 @@ #include #include -#include +#include template -bool is_intersection_empty(const boost::optional& t) +bool is_intersection_empty(const std::optional& t) { return bool(t); } diff --git a/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h b/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h index 1ac4f08cf2da..16448e7eff50 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h @@ -36,7 +36,7 @@ The following table gives the possible values for `Type1` and `Type2`. The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`boost::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< boost::variant< T... > >`, the last column in the table providing the template parameter pack. @@ -155,7 +155,7 @@ void foo(Segment_d seg, Line_d lin) \sa `do_intersect` \sa `Kernel_d::Intersect_d` -\sa `boost::optional` +\sa `std::optional` \sa `boost::variant` */ diff --git a/Kernel_d/doc/Kernel_d/Kernel_d.txt b/Kernel_d/doc/Kernel_d/Kernel_d.txt index fcfbfe0afecf..1e1e3361096c 100644 --- a/Kernel_d/doc/Kernel_d/Kernel_d.txt +++ b/Kernel_d/doc/Kernel_d/Kernel_d.txt @@ -477,7 +477,7 @@ Intersections on kernel objects currently cover only those objects that are part of flats (`R::Segment_d`, `R::Ray_d`, `R::Line_d`, and `R::Hyperplane_d`). For any pair of objects \f$ o1\f$, \f$ o2\f$ of these types the operation `intersection(o1,o2)` -returns a `boost::optional< boost::variant< T... > >` +returns a `std::optional< boost::variant< T... > >` where `T...` is a list of all possible resulting geometric objects. The return type of intersecting two objects of the types `Type1` and `Type2` can be diff --git a/Kernel_d/include/CGAL/Kernel_d/function_objects.h b/Kernel_d/include/CGAL/Kernel_d/function_objects.h index 221c3c7bbdb2..0e073c0272d4 100644 --- a/Kernel_d/include/CGAL/Kernel_d/function_objects.h +++ b/Kernel_d/include/CGAL/Kernel_d/function_objects.h @@ -76,22 +76,22 @@ class Intersect template struct result - { typedef boost::optional< boost::variant< Point_d, Line_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Line_d > > type; }; template struct result - { typedef boost::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; template struct result : result { }; template struct result - { typedef boost::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; template struct result - { typedef boost::optional< boost::variant< Point_d, Ray_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Ray_d > > type; }; template struct result : result @@ -99,7 +99,7 @@ class Intersect template struct result - { typedef boost::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; template struct result : result @@ -107,25 +107,25 @@ class Intersect template struct result - { typedef boost::optional< boost::variant< Point_d, Segment_d, Ray_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Segment_d, Ray_d > > type; }; template struct result - { typedef boost::optional< boost::variant< Point_d, Line_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Line_d > > type; }; template struct result : result { }; template struct result - { typedef boost::optional< boost::variant< Point_d, Ray_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Ray_d > > type; }; template struct result : result { }; template struct result - { typedef boost::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; template struct result : result { }; diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index a07ee4b3f167..9ca9eb02fa71 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -63,7 +63,7 @@ #include #include #include -#include +#include //#include //#include //#include diff --git a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h index a1b35060f858..93b25870c210 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h @@ -53,9 +53,9 @@ Function object that constructs the intersection between a 3D segment and a 3D triangle. Partial model of `::Kernel::Intersect_3`. Provides the operators: -- `boost::optional< boost::variant< Point_3, Segment_3 > > operator()(Segment_3 seg, Triangle_3 tr)` +- `std::optional< boost::variant< Point_3, Segment_3 > > operator()(Segment_3 seg, Triangle_3 tr)` -- `boost::optional< boost::variant< Point_3, Segment_3 > > operator()(Triangle_3 tr, Segment_3 seg)` +- `std::optional< boost::variant< Point_3, Segment_3 > > operator()(Triangle_3 tr, Segment_3 seg)` which computes the intersection between the triangle and the segment. */ diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h index d3b0b83f0a64..909f490b3ae4 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h @@ -48,7 +48,7 @@ the cell is good with regard to the criteria. In addition, an object of this type must contain an object of type `Cell_quality` if it represents a bad cell. `Cell_quality` must be accessible by `operator*()`. -Note that `boost::optional` is a natural model of this concept. +Note that `std::optional` is a natural model of this concept. */ typedef unspecified_type Is_cell_bad; diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h index 240f9b0f1fbf..3a96bdc4c04d 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h @@ -138,7 +138,7 @@ A function object to query whether a point is in the input domain or not. In the positive case, it outputs the subdomain which includes the query point. Provides the operator: -`boost::optional operator()(Point_3 p)` +`std::optional operator()(Point_3 p)` */ typedef unspecified_type Is_in_domain; @@ -148,11 +148,11 @@ intersection queries between the surface patches of the domain and objects of type `Segment_3`, `Ray_3` or `Line_3`. Provides the operators: -`boost::optional operator()(Segment_3 s)` +`std::optional operator()(Segment_3 s)` -`boost::optional operator()(Ray_3 r)` +`std::optional operator()(Ray_3 r)` -`boost::optional operator()(Line_3 l)` +`std::optional operator()(Line_3 l)` The return type of the operators tell whether or not the query intersects a surface patch. In the positive case, it provides (through operator*()) the diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h index 325dedeff053..f25f9a0f4f39 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h @@ -55,7 +55,7 @@ the facet is good with regard to the criteria. In addition, an object of this type must contain an object of type `Facet_quality` if it represents a bad facet. `Facet_quality` must be accessible by -`operator*()`. Note that `boost::optional` is +`operator*()`. Note that `std::optional` is a natural model of this concept. */ typedef unspecified_type Is_facet_bad; diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h index e4d5a977a1c1..63fcddb7a40c 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h @@ -312,11 +312,11 @@ class MeshTriangulationTraits_3 /*! A constructor object that must provide the function operators: - `boost::optional< boost::variant< T... > > operator()(Segment_3 s, Plane_3 p)` + `std::optional< boost::variant< T... > > operator()(Segment_3 s, Plane_3 p)` - `boost::optional< boost::variant< T... > > operator()(Ray_3 r, Iso_cuboid i)` + `std::optional< boost::variant< T... > > operator()(Ray_3 r, Iso_cuboid i)` - `boost::optional< boost::variant< T... > > operator()(Segment_3 s, Iso_cuboid i)` + `std::optional< boost::variant< T... > > operator()(Segment_3 s, Iso_cuboid i)` which returns the intersection region of two geometrical objects. */ diff --git a/Mesh_3/examples/Mesh_3/mesh_hybrid_mesh_domain.cpp b/Mesh_3/examples/Mesh_3/mesh_hybrid_mesh_domain.cpp index fb528891cd16..32a612b7b1d0 100644 --- a/Mesh_3/examples/Mesh_3/mesh_hybrid_mesh_domain.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_hybrid_mesh_domain.cpp @@ -99,9 +99,9 @@ class Hybrid_domain { Is_in_domain(const Hybrid_domain& domain) : r_domain_(domain) {} - boost::optional operator()(const K::Point_3& p) const + std::optional operator()(const K::Point_3& p) const { - boost::optional subdomain_index = + std::optional subdomain_index = r_domain_.implicit_domain.is_in_domain_object()(p); if(subdomain_index) return 2; else return r_domain_.polyhedron_domain.is_in_domain_object()(p); diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index ecc81e96046f..a6fd33ab1eca 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -47,7 +47,7 @@ #ifdef CGAL_MESH_3_VERBOSE # include #endif -#include +#include #include #include @@ -374,11 +374,11 @@ class Labeled_mesh_domain_3 typedef typename Geom_traits::FT FT; ///@} #else - typedef boost::optional Subdomain; + typedef std::optional Subdomain; // Type of indexes for cells of the input complex typedef Surface_patch_index_ Surface_patch_index; - typedef boost::optional Surface_patch; + typedef std::optional Surface_patch; // Type of indexes to characterize the lowest dimensional face of the input // complex on which a vertex lie diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 6a812e5581b6..4d4ec6d698ec 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include #include @@ -643,8 +643,8 @@ class C3T3_helpers typedef typename C3T3::Subdomain_index Subdomain_index; typedef typename C3T3::Index Index; - typedef boost::optional Surface_patch; - typedef boost::optional Subdomain; + typedef std::optional Surface_patch; + typedef std::optional Subdomain; typedef std::vector Cell_vector; typedef std::set Cell_set; @@ -683,7 +683,7 @@ class C3T3_helpers // ----------------------------------- // Public interface // ----------------------------------- - typedef boost::optional Update_mesh; + typedef std::optional Update_mesh; using Base::try_lock_point; using Base::try_lock_vertex; @@ -1677,7 +1677,7 @@ class C3T3_helpers /** * Returns the least square plane from v, using adjacent surface points */ - std::pair, Bare_point> + std::pair, Bare_point> get_least_square_surface_plane(const Vertex_handle& v, Surface_patch_index index = Surface_patch_index()) const; @@ -1686,15 +1686,15 @@ class C3T3_helpers * @param v The vertex from which p was moved * @param p The point to project * @param index The index of the surface patch where v lies, if known. - * @return a `boost::optional` with the projected point if the projection - * was possible, or `boost::none`. + * @return a `std::optional` with the projected point if the projection + * was possible, or `std::nullopt`. * * `p` is projected using the normal of least square fitting plane * on `v` incident surface points. If `index` is specified, only * surface points that are on the same surface patch are used to compute * the fitting plane. */ - boost::optional + std::optional project_on_surface_if_possible(const Vertex_handle& v, const Bare_point& p, Surface_patch_index index = Surface_patch_index()) const; @@ -2778,7 +2778,7 @@ rebuild_restricted_delaunay(OutdatedCells& outdated_cells, ++it ) { const Weighted_point& initial_position = tr_.point(*it); - boost::optional opt_new_pos = project_on_surface(*it, cp(initial_position)); + std::optional opt_new_pos = project_on_surface(*it, cp(initial_position)); if ( opt_new_pos ) { @@ -2890,7 +2890,7 @@ rebuild_restricted_delaunay(ForwardIterator first_cell, { Vertex_handle vh = it->first; const Weighted_point& initial_position = tr_.point(vh); - boost::optional opt_new_pos = project_on_surface(vh, cp(initial_position), it->second); + std::optional opt_new_pos = project_on_surface(vh, cp(initial_position), it->second); if ( opt_new_pos ) { @@ -3418,7 +3418,7 @@ project_on_surface_aux(const Bare_point& p, template -std::pair::Plane_3>, +std::pair::Plane_3>, typename C3T3_helpers::Bare_point> C3T3_helpers:: get_least_square_surface_plane(const Vertex_handle& v, @@ -3471,7 +3471,7 @@ get_least_square_surface_plane(const Vertex_handle& v, // In some cases point is not a real surface point if ( triangles.empty() ) - return std::make_pair(boost::none, Bare_point()); + return std::make_pair(std::nullopt, Bare_point()); // Compute least square fitting plane Plane_3 plane; @@ -3498,7 +3498,7 @@ project_on_surface(const Vertex_handle& v, const Bare_point& p, Surface_patch_index index) const { - boost::optional opt_point = + std::optional opt_point = project_on_surface_if_possible(v, p, index); if(opt_point) return *opt_point; else return p; @@ -3506,7 +3506,7 @@ project_on_surface(const Vertex_handle& v, template -boost::optional::Bare_point> +std::optional::Bare_point> C3T3_helpers:: project_on_surface_if_possible(const Vertex_handle& v, const Bare_point& p, @@ -3518,11 +3518,11 @@ project_on_surface_if_possible(const Vertex_handle& v, typename Gt::Equal_3 equal = tr_.geom_traits().equal_3_object(); // Get plane - std::pair, Bare_point> pl_rp + std::pair, Bare_point> pl_rp = get_least_square_surface_plane(v, index); - boost::optional opt_plane = pl_rp.first; - if(!opt_plane) return boost::none; + std::optional opt_plane = pl_rp.first; + if(!opt_plane) return std::nullopt; // Project const Weighted_point& position = tr_.point(v); diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index 2fe2261344c9..d2f1065785a4 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -53,7 +53,7 @@ #ifndef CGAL_NO_ASSERTIONS # include // for float_prior #endif -#include +#include #include #include #include @@ -1524,7 +1524,7 @@ change_ball_size(const Vertex_handle& v, const FT squared_size, const bool speci Bare_point p = cp(c3t3_.triangulation().point(v)); // intentional copy // Remove v from the set of corners - boost::optional corner_index = boost::make_optional(false, Corner_index()); + std::optional corner_index = std::make_optional(false, Corner_index()); if ( c3t3_.is_in_complex(v) ) { corner_index = c3t3_.corner_index(v); diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h index 4ee48c865ea2..59526d1adc90 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -926,7 +926,7 @@ void Refine_cells_3:: treat_new_cell(const Cell_handle& cell) { - typedef boost::optional Subdomain; + typedef std::optional Subdomain; // treat cell const Subdomain subdomain = r_oracle_.is_in_domain_object()(r_tr_.dual(cell)); diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index ded63f9b139a..1f9c064f1d89 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include #include @@ -397,7 +397,7 @@ class Refine_facets_3_base typedef typename MeshDomain::Surface_patch_index Surface_patch_index; typedef typename MeshDomain::Index Index; - typedef typename boost::optional< + typedef typename std::optional< std::tuple > Facet_properties; @@ -1624,7 +1624,7 @@ compute_facet_properties(const Facet& facet, CGAL_assertion( r_tr_.dimension() == 3 ); // types - typedef boost::optional Surface_patch; + typedef std::optional Surface_patch; typedef typename MD::Intersection Intersection; // Functor diff --git a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h index e8c2c214e48d..1f420ffd432f 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h +++ b/Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include @@ -498,7 +498,7 @@ class Slivers_exuder /** * Returns the umbrella of internal_facets vector */ - boost::optional + std::optional get_umbrella(const Facet_vector& internal_facets, const Vertex_handle& v) const; @@ -1351,7 +1351,7 @@ get_best_weight(const Vertex_handle& v, bool *could_lock_zone) const template -boost::optional::Umbrella > +std::optional::Umbrella > Slivers_exuder:: get_umbrella(const Facet_vector& facets, // internal_facets of conflict zone const Vertex_handle& /* v, no longer used */) const @@ -1387,7 +1387,7 @@ get_umbrella(const Facet_vector& facets, // internal_facets of conflict zone { std::size_t count = (*uit).second.second; if(count == 2) //there will be more than 3 after insertion - return boost::none; //non-manifold configuration + return std::nullopt; //non-manifold configuration umbrella.insert(uit, std::make_pair(oe, @@ -1563,8 +1563,8 @@ update_mesh(const Weighted_point& new_point, Boundary_facets_from_outside boundary_facets_from_outside = get_boundary_facets_from_outside(boundary_facets); - boost::optional umbrella = get_umbrella(internal_facets, old_vertex); - if(umbrella == boost::none) + std::optional umbrella = get_umbrella(internal_facets, old_vertex); + if(umbrella == std::nullopt) return false; //abort pumping this vertex // Delete old cells from queue (they aren't in the triangulation anymore) 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 11319fe065df..a35b11727915 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 @@ -228,11 +228,11 @@ struct Sizing_field_with_aabb_tree } } - boost::optional + std::optional closest_point_on_surfaces(const Point_3& p, const Patches_ids& patch_ids_to_ignore) const { - boost::optional result{}; + std::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); @@ -325,7 +325,7 @@ struct Sizing_field_with_aabb_tree const auto closest_point_and_primitive = closest_point_on_surfaces(p, ids); - if(closest_point_and_primitive != boost::none) { + if(closest_point_and_primitive != std::nullopt) { result = (std::min)(0.9 / CGAL::sqrt(CGAL::Mesh_3::internal::weight_modifier) * CGAL_NTS @@ -379,7 +379,7 @@ struct Sizing_field_with_aabb_tree if(!d_ptr->aabb_tree.empty()) { //Compute distance to surface patches const auto closest_point_and_primitive = closest_point_on_surfaces(p, ids); - if(closest_point_and_primitive == boost::none) { + if(closest_point_and_primitive == std::nullopt) { #ifdef CGAL_MESH_3_PROTECTION_HIGH_VERBOSITY std::cerr << result << " (projection not found) ids:"; for(Patch_index i : ids) { diff --git a/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h b/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h index d2dfef196e0a..bc705dc40de6 100644 --- a/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h +++ b/Mesh_3/include/CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h @@ -159,8 +159,8 @@ void initialize_triangulation_from_labeled_image(C3T3& c3t3, : domain.is_in_domain_object()( seed_cell->weighted_circumcenter(tr.geom_traits())); - if ( seed_label != boost::none - && seed_cell_label != boost::none + if ( seed_label != std::nullopt + && seed_cell_label != std::nullopt && *seed_label == *seed_cell_label) continue; //this means the connected component has already been initialized diff --git a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_criteria.h b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_criteria.h index 268bffcc4c14..a3564c1b946c 100644 --- a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_criteria.h +++ b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_criteria.h @@ -22,7 +22,7 @@ -#include +#include #include namespace CGAL { @@ -41,7 +41,7 @@ class Abstract_criterion public: typedef FT Quality; - typedef boost::optional Is_bad; + typedef std::optional Is_bad; typedef typename Visitor_::Handle Handle; /// Destructor @@ -81,7 +81,7 @@ class Criterion_visitor public: typedef std::pair Quality; - typedef boost::optional Is_bad; + typedef std::optional Is_bad; // Constructor 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 e42bc0acff77..e95871871634 100644 --- a/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h +++ b/Mesh_3/include/CGAL/Mesh_3/polylines_to_protect.h @@ -30,7 +30,7 @@ #include #include // for boost::prior -#include +#include #include #include @@ -452,7 +452,7 @@ polylines_to_protect InterpolationFunctor interpolate, PolylineInputIterator existing_polylines_begin, PolylineInputIterator existing_polylines_end, - boost::optional scalar_interpolation_value = boost::none, + std::optional scalar_interpolation_value = std::nullopt, int prec = 10) { typedef typename DomainFunctor::result_type Domain_type; @@ -587,7 +587,7 @@ polylines_to_protect pixel[1], pixel[2]); square[ii][jj].domain = domain_fct(square[ii][jj].word); - if(scalar_interpolation_value != boost::none) { + if(scalar_interpolation_value != std::nullopt) { square[ii][jj].word = Image_word_type(square[ii][jj].word - (*scalar_interpolation_value)); @@ -735,7 +735,7 @@ polylines_to_protect square[1][0], null); Isoline_equation equation = - (scalar_interpolation_value == boost::none) ? + (scalar_interpolation_value == std::nullopt) ? Isoline_equation(1, -1, -1, 0) : Isoline_equation(v00, v10, v01, v11); insert_curve_in_graph.insert_curve(equation, @@ -745,7 +745,7 @@ polylines_to_protect p00, p10 - p00, p01 - p00); - if(scalar_interpolation_value == boost::none) { + if(scalar_interpolation_value == std::nullopt) { equation = Isoline_equation(0, -1, -1, 1); } insert_curve_in_graph.insert_curve(equation, @@ -872,7 +872,7 @@ polylines_to_protect square[1][1], null); vertex_descriptor bottom = g_manip.split(square[0][0], square[1][0], null); - if(scalar_interpolation_value == boost::none) { + if(scalar_interpolation_value == std::nullopt) { g_manip.try_add_edge(top, bottom); } else { insert_curve_in_graph.insert_curve(Isoline_equation(v00, v10, @@ -891,7 +891,7 @@ polylines_to_protect CGAL_assertion(square[1][0].domain==square[0][1].domain); CGAL_assertion(square[0][0].domain!=square[0][1].domain); - if(scalar_interpolation_value != boost::none) { + if(scalar_interpolation_value != std::nullopt) { // Compute the squared distance between the two branches of // the hyperbola. const double discrimant = double(v00) * v11 - double(v01) * v10; @@ -964,7 +964,7 @@ polylines_to_protect square[1][1], null); Isoline_equation equation = - (scalar_interpolation_value == boost::none) ? + (scalar_interpolation_value == std::nullopt) ? Isoline_equation(1, -1, 1, 1) : Isoline_equation(v00, v10, v01, v11); diff --git a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h index 1b1e53c93052..7dc31bfbf398 100644 --- a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h +++ b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h @@ -34,7 +34,7 @@ #endif #endif -#include +#include #include #include #include diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 17e69ff984cb..66178d3906f1 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -519,13 +519,13 @@ class Polyhedral_complex_mesh_domain_3 Is_in_domain(const Polyhedral_complex_mesh_domain_3& domain) : r_domain_(domain) {} - boost::optional shoot_a_ray_1(const Ray_3 ray) const { + std::optional shoot_a_ray_1(const Ray_3 ray) const { return r_domain_.bounding_aabb_tree_ptr()-> first_intersected_primitive(ray); } #if USE_ALL_INTERSECTIONS - boost::optional shoot_a_ray_2(const Ray_3 ray) const { + std::optional shoot_a_ray_2(const Ray_3 ray) const { const Point_3& p = ray.source(); typedef typename AABB_tree:: template Intersection_and_primitive_id::Type Inter_and_prim; @@ -533,7 +533,7 @@ class Polyhedral_complex_mesh_domain_3 r_domain_.bounding_aabb_tree_ptr()-> all_intersections(ray, std::back_inserter(all_intersections)); if(all_intersections.empty()) - return boost::none; + return std::nullopt; else { for(const Inter_and_prim& i_p: all_intersections) { if(boost::get( &i_p.first) == 0) return AABB_primitive_id(); @@ -575,13 +575,13 @@ class Polyhedral_complex_mesh_domain_3 #define USE_ALL_INTERSECTIONS 0 #if USE_ALL_INTERSECTIONS - boost::optional opt = shoot_a_ray_2(ray_shot); + std::optional opt = shoot_a_ray_2(ray_shot); #else // first_intersected_primitive - boost::optional opt = shoot_a_ray_1(ray_shot); + std::optional opt = shoot_a_ray_1(ray_shot); #endif // first_intersected_primitive // for(int i = 0; i < 20; ++i) { // const Ray_3 ray_shot2 = ray(p, vector(CGAL::ORIGIN,*random_point)); - // boost::optional opt2 = shoot_a_ray_1(ray_shot2); + // std::optional opt2 = shoot_a_ray_1(ray_shot2); // if(opt != opt2) { // if(!opt && *opt2 == 0) continue; // if(!opt2 && *opt == 0) continue; diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 2d9bf625f57d..5ac9a12411a5 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include #include @@ -136,7 +136,7 @@ class Polyhedral_mesh_domain_3 //------------------------------------------------------- /// Type of indexes for cells of the input complex typedef int Subdomain_index; - typedef boost::optional Subdomain; + typedef std::optional Subdomain; /// Type of indexes for surface patch of the input complex typedef typename boost::property_map::type Face_patch_id_pmap; typedef typename boost::property_traits< Face_patch_id_pmap>::value_type Surface_patch_index; - typedef boost::optional Surface_patch; + typedef std::optional Surface_patch; /// Type of indexes to characterize the lowest dimensional face of the input /// complex on which a vertex lie typedef typename Mesh_3::internal::Index_generator< @@ -388,7 +388,7 @@ class Polyhedral_mesh_domain_3 { CGAL_MESH_3_PROFILER(std::string("Mesh_3 profiler: ") + std::string(CGAL_PRETTY_FUNCTION)); - boost::optional primitive_id = r_domain_.tree_.any_intersected_primitive(q); + std::optional primitive_id = r_domain_.tree_.any_intersected_primitive(q); if ( primitive_id ) { r_domain_.cache_primitive(q, *primitive_id); @@ -430,7 +430,7 @@ class Polyhedral_mesh_domain_3 CGAL_MESH_3_PROFILER(std::string("Mesh_3 profiler: ") + std::string(CGAL_PRETTY_FUNCTION)); typedef typename AABB_tree_::template Intersection_and_primitive_id::Type Intersection_and_primitive_id; - typedef boost::optional AABB_intersection; + typedef std::optional AABB_intersection; typedef Point_3 Bare_point; AABB_intersection intersection; @@ -447,7 +447,7 @@ class Polyhedral_mesh_domain_3 { #ifndef CGAL_MESH_3_NO_LONGER_CALLS_DO_INTERSECT_3 CGAL_precondition(r_domain_.do_intersect_surface_object()(q) - != boost::none); + != std::nullopt); #endif // NOT CGAL_MESH_3_NO_LONGER_CALLS_DO_INTERSECT_3 intersection = r_domain_.tree_.any_intersection(q); diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_traversal_traits_with_join.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_traversal_traits_with_join.h index d2cfbd994369..b44438f24e8e 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_traversal_traits_with_join.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_traversal_traits_with_join.h @@ -17,7 +17,7 @@ #include -#include +#include namespace CGAL { @@ -69,7 +69,7 @@ class First_intersection_traits public: typedef - boost::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > + std::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > Result; public: First_intersection_traits(const AABBTraits& traits) @@ -124,7 +124,7 @@ class Listing_intersection_traits void intersection(const Query& query, const Primitive& primitive) { - boost::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > + std::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > intersection = m_traits.intersection_object()(query, primitive); if(intersection) @@ -211,7 +211,7 @@ class First_primitive_traits { if( m_traits.do_intersect_object()(query, primitive) ) { - m_result = boost::optional(primitive.id()); + m_result = std::optional(primitive.id()); m_is_found = true; } } @@ -221,12 +221,12 @@ class First_primitive_traits return m_traits.do_intersect_object()(query, node.bbox()); } - boost::optional result() const { return m_result; } + std::optional result() const { return m_result; } bool is_intersection_found() const { return m_is_found; } private: bool m_is_found; - boost::optional m_result; + std::optional m_result; const AABBTraits& m_traits; }; diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h index a528585c5c6a..8ca02f1b229b 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include #ifdef CGAL_HAS_THREADS #include @@ -252,7 +252,7 @@ namespace CGAL { /// `do_intersect` predicates are defined /// in the traits class `AABBTraits`. template - boost::optional any_intersected_primitive(const Query& query) const; + std::optional any_intersected_primitive(const Query& query) const; ///@} @@ -276,7 +276,7 @@ namespace CGAL { /// for which `do_intersect` predicates /// and intersections are defined in the traits class AABBTraits. template - boost::optional< typename Intersection_and_primitive_id::Type > + std::optional< typename Intersection_and_primitive_id::Type > any_intersection(const Query& query) const; ///@} @@ -764,7 +764,7 @@ namespace CGAL { template template - boost::optional< typename AABB_tree_with_join::template Intersection_and_primitive_id::Type > + std::optional< typename AABB_tree_with_join::template Intersection_and_primitive_id::Type > AABB_tree_with_join::any_intersection(const Query& query) const { using namespace CGAL::internal::AABB_tree_with_join; @@ -776,7 +776,7 @@ namespace CGAL { template template - boost::optional::Primitive_id> + std::optional::Primitive_id> AABB_tree_with_join::any_intersected_primitive(const Query& query) const { using namespace CGAL::internal::AABB_tree_with_join; diff --git a/Nef_2/include/CGAL/Nef_2/HDS_items.h b/Nef_2/include/CGAL/Nef_2/HDS_items.h index e0b342e9e688..48a44c50fd72 100644 --- a/Nef_2/include/CGAL/Nef_2/HDS_items.h +++ b/Nef_2/include/CGAL/Nef_2/HDS_items.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO #include @@ -73,7 +73,7 @@ class Nef_vertex_2 { Halfedge_handle _h; Face_handle _f; Point _p; - boost::optional _ivit; + std::optional _ivit; Mark _m; GenPtr _i; public: @@ -127,7 +127,7 @@ class Nef_vertex_2 { iv_iterator ivit() const { return *_ivit; } void set_ivit(iv_iterator it) { _ivit = it; } - void reset_ivit() { _ivit = boost::none; } + void reset_ivit() { _ivit = std::nullopt; } }; @@ -162,7 +162,7 @@ class Nef_halfedge_2 { Halfedge_handle opp, prv, nxt; Vertex_handle _v; Face_handle _f; - boost::optional _fcit; + std::optional _fcit; Mark _m; GenPtr _i; public: @@ -223,7 +223,7 @@ class Nef_halfedge_2 { fc_iterator fcit() const { return *_fcit; } void set_fcit(fc_iterator it) { _fcit = it; } - void reset_fcit() { _fcit = boost::none; } + void reset_fcit() { _fcit = std::nullopt; } bool is_hole_entry() const /*{\Mop returns true iff |\Mvar| is entry point into a hole face diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h index 99b71db68a11..7b944428601c 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h @@ -36,7 +36,7 @@ struct Exact_intersect_xy_2 typedef boost::variant variant_type; - boost::optional + std::optional operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -55,18 +55,18 @@ struct Exact_intersect_xy_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(p2.x(),p2.y(),0))); + return std::make_optional(variant_type(Point_3(p2.x(),p2.y(),0))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3(p2.x(),p2.y(),0), + return std::make_optional(variant_type(Segment_3(Point_3(p2.x(),p2.y(),0), Point_3(q2.x(),q2.y(),0) ) )); } }; @@ -82,7 +82,7 @@ struct Exact_intersect_xy_2 typedef boost::variant variant_type; - boost::optional operator() (Segment_3 s3, Segment_3 t3) + std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -102,18 +102,18 @@ struct Exact_intersect_xy_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(p2.hx(),p2.hy(),0,p2.hw()))); + return std::make_optional(variant_type(Point_3(p2.hx(),p2.hy(),0,p2.hw()))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3 (p2.hx(),p2.hy(),0,p2.hw()), + return std::make_optional(variant_type(Segment_3(Point_3 (p2.hx(),p2.hy(),0,p2.hw()), Point_3 (q2.hx(),q2.hy(),0,q2.hw())) )); } }; diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h index 7d77eaae669d..773295292490 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h @@ -35,7 +35,7 @@ struct Exact_intersect_xz_2 typedef boost::variant variant_type; - boost::optional + std::optional operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -54,18 +54,18 @@ struct Exact_intersect_xz_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(p2.x(),0,p2.y()))); + return std::make_optional(variant_type(Point_3(p2.x(),0,p2.y()))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3(p2.x(),0,p2.y()), + return std::make_optional(variant_type(Segment_3(Point_3(p2.x(),0,p2.y()), Point_3(q2.x(),0,q2.y()) ) )); } }; @@ -81,7 +81,7 @@ struct Exact_intersect_xz_2 typedef boost::variant variant_type; - boost::optional operator() (Segment_3 s3, Segment_3 t3) + std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -101,18 +101,18 @@ struct Exact_intersect_xz_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(p2.hx(),0,p2.hy(),p2.hw()))); + return std::make_optional(variant_type(Point_3(p2.hx(),0,p2.hy(),p2.hw()))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3 (p2.hx(),0,p2.hy(),p2.hw()), + return std::make_optional(variant_type(Segment_3(Point_3 (p2.hx(),0,p2.hy(),p2.hw()), Point_3 (q2.hx(),0,q2.hy(),q2.hw())) )); } diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h index a98b74fd1443..ac2007ce5565 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h @@ -36,7 +36,7 @@ struct Exact_intersect_yz_2 typedef boost::variant variant_type; - boost::optional + std::optional operator() (const Segment_3& s3, const Segment_3& t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -55,18 +55,18 @@ struct Exact_intersect_yz_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(0,p2.x(),p2.y()))); + return std::make_optional(variant_type(Point_3(0,p2.x(),p2.y()))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3(0,p2.x(),p2.y()), + return std::make_optional(variant_type(Segment_3(Point_3(0,p2.x(),p2.y()), Point_3(0,q2.x(),q2.y()) ) )); } }; @@ -82,7 +82,7 @@ struct Exact_intersect_yz_2 typedef boost::variant variant_type; - boost::optional operator() (Segment_3 s3, Segment_3 t3) + std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; Point_3 p3, q3; @@ -102,18 +102,18 @@ struct Exact_intersect_yz_2 // so all third components are faked! auto obj = intersection (s2,t2); if(! obj){ - return boost::none; + return std::nullopt; } if (const Point_2* pi = boost::get(&*obj)) { - return boost::make_optional(variant_type(Point_3(0,p2.hx(),p2.hy(),p2.hw()))); + return std::make_optional(variant_type(Point_3(0,p2.hx(),p2.hy(),p2.hw()))); } const Segment_2* si = boost::get(&*obj); p2 = si->source(); q2 = si->target(); - return boost::make_optional(variant_type(Segment_3(Point_3 (0,p2.hx(),p2.hy(),p2.hw()), + return std::make_optional(variant_type(Segment_3(Point_3 (0,p2.hx(),p2.hy(),p2.hw()), Point_3 (0,q2.hx(),q2.hy(),q2.hw())) )); } }; diff --git a/Nef_3/include/CGAL/Nef_3/SNC_structure.h b/Nef_3/include/CGAL/Nef_3/SNC_structure.h index 27a3c5c414d7..8806122cadb6 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_structure.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_structure.h @@ -34,7 +34,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -384,13 +384,13 @@ the local graph or added for the comfort of the user.}*/ expensive operation.}*/ SNC_structure() : - boundary_item_(boost::none), sm_boundary_item_(boost::none), + boundary_item_(std::nullopt), sm_boundary_item_(std::nullopt), vertices_(), halfedges_(), halffacets_(), volumes_(), shalfedges_(), shalfloops_(), sfaces_() {} ~SNC_structure() { CGAL_NEF_TRACEN("~SNC_structure: clearing "< bool is_boundary_object(H h) const - { return boundary_item_[h]!=boost::none; } + { return boundary_item_[h]!=std::nullopt; } template bool is_sm_boundary_object(H h) const - { return sm_boundary_item_[h]!=boost::none; } + { return sm_boundary_item_[h]!=std::nullopt; } template Object_iterator& boundary_item(H h) @@ -462,12 +462,12 @@ the local graph or added for the comfort of the user.}*/ template void undef_boundary_item(H h) - { CGAL_assertion(boundary_item_[h]!=boost::none); - boundary_item_[h] = boost::none; } + { CGAL_assertion(boundary_item_[h]!=std::nullopt); + boundary_item_[h] = std::nullopt; } template void undef_sm_boundary_item(H h) - { CGAL_assertion(sm_boundary_item_[h]!=boost::none); - sm_boundary_item_[h] = boost::none; } + { CGAL_assertion(sm_boundary_item_[h]!=std::nullopt); + sm_boundary_item_[h] = std::nullopt; } void reset_iterator_hash(Object_iterator it) { SVertex_handle sv; @@ -1035,7 +1035,7 @@ the local graph or added for the comfort of the user.}*/ protected: void pointer_update(const Self& D); - typedef boost::optional Optional_object_iterator ; + typedef std::optional Optional_object_iterator ; private: Generic_handle_map boundary_item_; Generic_handle_map sm_boundary_item_; diff --git a/Nef_S2/include/CGAL/Nef_S2/Sphere_map.h b/Nef_S2/include/CGAL/Nef_S2/Sphere_map.h index 4c89dbf4ecd4..aaa74f14fe47 100644 --- a/Nef_S2/include/CGAL/Nef_S2/Sphere_map.h +++ b/Nef_S2/include/CGAL/Nef_S2/Sphere_map.h @@ -30,7 +30,7 @@ #define CGAL_NEF_DEBUG 109 #include -#include +#include #include namespace CGAL { @@ -128,7 +128,7 @@ the HDS design of Kettner.}*/ typedef std::list Object_list; typedef typename Object_list::iterator Object_iterator; typedef typename Object_list::const_iterator Object_const_iterator; - typedef boost::optional Optional_object_iterator ; + typedef std::optional Optional_object_iterator ; typedef Generic_handle_map Handle_to_iterator_map; typedef Sphere_map* Constructor_parameter; @@ -226,7 +226,7 @@ the HDS design of Kettner.}*/ construction means cloning an isomorphic structure and is thus an expensive operation.}*/ - Sphere_map(bool = false) : boundary_item_(boost::none), + Sphere_map(bool = false) : boundary_item_(std::nullopt), svertices_(), sedges_(), sfaces_(), shalfloop_() {} ~Sphere_map() noexcept(!CGAL_ASSERTIONS_ENABLED) @@ -236,7 +236,7 @@ the HDS design of Kettner.}*/ ); } - Sphere_map(const Self& D) : boundary_item_(boost::none), + Sphere_map(const Self& D) : boundary_item_(std::nullopt), svertices_(D.svertices_), sedges_(D.sedges_), sfaces_(D.sfaces_), @@ -258,7 +258,7 @@ the HDS design of Kettner.}*/ void clear() { - boundary_item_.clear(boost::none); + boundary_item_.clear(std::nullopt); svertices_.destroy(); sfaces_.destroy(); while ( shalfedges_begin() != shalfedges_end() ) @@ -268,7 +268,7 @@ the HDS design of Kettner.}*/ template bool is_sm_boundary_object(H h) const - { return boundary_item_[h]!=boost::none; } + { return boundary_item_[h]!=std::nullopt; } template Object_iterator& sm_boundary_item(H h) @@ -280,8 +280,8 @@ the HDS design of Kettner.}*/ template void undef_sm_boundary_item(H h) - { CGAL_assertion(boundary_item_[h]!=boost::none); - boundary_item_[h] = boost::none; } + { CGAL_assertion(boundary_item_[h]!=std::nullopt); + boundary_item_[h] = std::nullopt; } void reset_sm_iterator_hash(Object_iterator it) { SVertex_handle sv; 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 c49303dd42da..4a562530c75a 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h +++ b/Number_types/include/CGAL/Sqrt_extension/Sqrt_extension_type.h @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include @@ -92,7 +92,7 @@ template <> class Interval_optional_caching< ::CGAL::Tag_true > { protected: - typedef boost::optional< std::pair > Cached_interval; + typedef std::optional< std::pair > Cached_interval; mutable Cached_interval interval_; void invalidate_interval() {interval_=Cached_interval();} bool is_cached() const {return (interval_?true:false);} diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h index 16fe600bb345..fecb03e33a19 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h @@ -35,7 +35,7 @@ #include #include #include -#include +#include // STL #include @@ -764,7 +764,7 @@ class Reconstruction_triangulation_2 // signed distance from t to the intersection of line(a,b) and line(t,s) // the pair::first is false if sign==-1 and true otherwise - std::pair > + std::pair > signed_distance_from_intersection(Vertex_handle a, Vertex_handle b, Vertex_handle t, Vertex_handle s) const { const Point& pa = a->point(); @@ -776,20 +776,20 @@ class Reconstruction_triangulation_2 // signed distance from t to the intersection of line(a,b) and line(t,s) // the pair::first is false if sign==-1 and true otherwise - std::pair > + std::pair > compute_signed_distance_from_intersection( const Point& pa, const Point& pb, const Point& pt, const Point& ps) const { FT Dabt = compute_signed_distance(pa, pb, pt); if (Dabt == FT(0)) - return std::make_pair(true,boost::make_optional(FT(0))); + return std::make_pair(true,std::make_optional(FT(0))); Line lab = geom_traits().construct_line_2_object()( pa, geom_traits().construct_vector_2_object()(pa, pb)); Line lts = geom_traits().construct_line_2_object()( pt, geom_traits().construct_vector_2_object()(pt, ps)); - boost::optional Dqt; + std::optional Dqt; const auto result = intersection(lab, lts); if (result) { @@ -996,24 +996,24 @@ class Reconstruction_triangulation_2 std::cout <<"( " << (edge).priority() << ") ( " << a << " , " << b << " )" << std::endl; } - bool is_p_infinity(const std::pair >& p) const + bool is_p_infinity(const std::pair >& p) const { - return p.first && p.second==boost::none; + return p.first && p.second==std::nullopt; } - bool is_m_infinity(const std::pair >& p) const + bool is_m_infinity(const std::pair >& p) const { - return !p.first && p.second==boost::none; + return !p.first && p.second==std::nullopt; } - bool is_infinity(const std::pair >& p) const + bool is_infinity(const std::pair >& p) const { - return p.second==boost::none; + return p.second==std::nullopt; } - std::pair > m_infinity() const + std::pair > m_infinity() const { - return std::pair >(false,boost::optional()); + return std::pair >(false,std::optional()); } template // value_type = Edge @@ -1028,9 +1028,9 @@ class Reconstruction_triangulation_2 Edge ab = twin_edge(*it); Vertex_handle a = source_vertex(ab); Vertex_handle b = target_vertex(ab); - std::pair > D = signed_distance_from_intersection(a, b, target, source); + std::pair > D = signed_distance_from_intersection(a, b, target, source); if (!D.first ) { - CGAL_assertion(D.second!=boost::none); + CGAL_assertion(D.second!=std::nullopt); multi_ind.insert(Rec_edge_2(ab, *D.second)); } } @@ -1053,11 +1053,11 @@ class Reconstruction_triangulation_2 Vertex_handle c = target_vertex(bc); Vertex_handle d = target_vertex(cd); - std::pair > Dac=m_infinity(); + std::pair > Dac=m_infinity(); if (a != c && is_triangle_ccw(a, b, c)) Dac = signed_distance_from_intersection(a, c, target, source); - std::pair > Dbd=m_infinity(); + std::pair > Dbd=m_infinity(); if (b != d && is_triangle_ccw(b, c, d)) Dbd = signed_distance_from_intersection(b, d, target, source); diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h index a8936abb6ffd..4a644675add6 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h @@ -53,7 +53,7 @@ #ifndef CGAL_NO_ASSERTIONS # include // for float_prior #endif -#include +#include #include #include #include @@ -2479,7 +2479,7 @@ change_ball_size(Vertex_handle& v, const FT squared_size, const bool special_bal const Bare_point p = cp(c3t3_.triangulation().point(v)); // intentional copy // Remove v from the set of corners - boost::optional corner_index = boost::make_optional(false, Corner_index()); + std::optional corner_index = std::make_optional(false, Corner_index()); if(c3t3_.is_in_complex(v)) { corner_index = c3t3_.corner_index(v); diff --git a/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/Voronoi_covariance_3/voronoi_covariance_3.h b/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/Voronoi_covariance_3/voronoi_covariance_3.h index 93b3f93581ac..ad4badb0431c 100644 --- a/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/Voronoi_covariance_3/voronoi_covariance_3.h +++ b/Point_set_processing_3/include/CGAL/Point_set_processing_3/internal/Voronoi_covariance_3/voronoi_covariance_3.h @@ -166,7 +166,7 @@ namespace CGAL { (planes.begin(), planes.end(), P, - boost::make_optional(Point(CGAL::ORIGIN))); + std::make_optional(Point(CGAL::ORIGIN))); // apply f to the triangles on the boundary of P for(typename boost::graph_traits::face_descriptor fd : faces(P)) diff --git a/Point_set_processing_3/include/CGAL/structure_point_set.h b/Point_set_processing_3/include/CGAL/structure_point_set.h index 58b3cbee86d0..335ba8226471 100644 --- a/Point_set_processing_3/include/CGAL/structure_point_set.h +++ b/Point_set_processing_3/include/CGAL/structure_point_set.h @@ -58,8 +58,8 @@ is a vertex). The implementation follow \cgalCite{cgal:la-srpss-13}. \tparam Kernel a model of `EfficientRANSACTraits` that must provide in addition a function `Intersect_3 intersection_3_object() const` and a functor `Intersect_3` with: -- `boost::optional< boost::variant< Traits::Plane_3, Traits::Line_3 > > operator()(typename Traits::Plane_3, typename Traits::Plane_3)` -- `boost::optional< boost::variant< Traits::Line_3, Traits::Point_3 > > operator()(typename Traits::Line_3, typename Traits::Plane_3)` +- `std::optional< boost::variant< Traits::Plane_3, Traits::Line_3 > > operator()(typename Traits::Plane_3, typename Traits::Plane_3)` +- `std::optional< boost::variant< Traits::Line_3, Traits::Point_3 > > operator()(typename Traits::Line_3, typename Traits::Plane_3)` */ template diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp index ffa6f9aeb2e1..9148d56bd07f 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) } Mesh out_union, out_intersection; - std::array, 4> output; + std::array, 4> output; output[PMP::Corefinement::UNION] = &out_union; output[PMP::Corefinement::INTERSECTION] = &out_intersection; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h index 5167a240f18e..08068a664f37 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h @@ -69,7 +69,7 @@ enum Boolean_operation_type {UNION = 0, INTERSECTION=1, * \ingroup PMP_corefinement_grp * * \link coref_def_subsec corefines \endlink `tm1` and `tm2` and for each triangle mesh `tm_out` passed - * as an optional in `output` different from `boost::none`, the triangulated surface mesh + * as an optional in `output` different from `std::nullopt`, the triangulated surface mesh * \link coref_def_subsec bounding \endlink the result of a particular Boolean operation * between the volumes bounded by `tm1` and `tm2` will be put in the corresponding triangle mesh. * The positions of the meshes in the array `output` are specific to the Boolean operation to compute @@ -186,7 +186,7 @@ std::array corefine_and_compute_boolean_operations( TriangleMesh& tm1, TriangleMesh& tm2, - const std::array< boost::optional,4>& output, + const std::array< std::optional,4>& output, const NamedParameters1& np1 = parameters::default_values(), const NamedParameters2& np2 = parameters::default_values(), const std::tuple VPM_out_tuple_helper; typedef std::tuple< - boost::optional< typename std::tuple_element<0, VPM_out_tuple_helper>::type::type >, - boost::optional< typename std::tuple_element<1, VPM_out_tuple_helper>::type::type >, - boost::optional< typename std::tuple_element<2, VPM_out_tuple_helper>::type::type >, - boost::optional< typename std::tuple_element<3, VPM_out_tuple_helper>::type::type > + std::optional< typename std::tuple_element<0, VPM_out_tuple_helper>::type::type >, + std::optional< typename std::tuple_element<1, VPM_out_tuple_helper>::type::type >, + std::optional< typename std::tuple_element<2, VPM_out_tuple_helper>::type::type >, + std::optional< typename std::tuple_element<3, VPM_out_tuple_helper>::type::type > > VPM_out_tuple; VPM_out_tuple vpm_out_tuple( @@ -251,24 +251,24 @@ corefine_and_compute_boolean_operations( // for now edges in a coplanar patch are not constrained so there is nothing to constrained here // \todo marked edges from input to output are not ported - if (output[Corefinement::UNION] != boost::none) + if (output[Corefinement::UNION] != std::nullopt) if (&tm1 != *output[Corefinement::UNION]) copy_face_graph(tm1, *(*output[Corefinement::UNION]), parameters::vertex_point_map(vpm1), parameters::vertex_point_map(*std::get(vpm_out_tuple))); - if (output[Corefinement::INTERSECTION] != boost::none) + if (output[Corefinement::INTERSECTION] != std::nullopt) if (&tm1 != *output[Corefinement::INTERSECTION]) copy_face_graph(tm1, *(*output[Corefinement::INTERSECTION]), parameters::vertex_point_map(vpm1), parameters::vertex_point_map(*std::get(vpm_out_tuple))); - if (output[Corefinement::TM1_MINUS_TM2] != boost::none) + if (output[Corefinement::TM1_MINUS_TM2] != std::nullopt) if (&tm1 == *output[Corefinement::TM1_MINUS_TM2]) clear(tm1); - if (output[Corefinement::TM2_MINUS_TM1] != boost::none) + if (output[Corefinement::TM2_MINUS_TM1] != std::nullopt) if (&tm1 == *output[Corefinement::TM2_MINUS_TM1]) clear(tm1); @@ -281,22 +281,22 @@ corefine_and_compute_boolean_operations( if(faces(tm2).empty()) { for (int i=0; i<4; ++i) - if (output[i] != boost::none) + if (output[i] != std::nullopt) clear(*(*output[i])); return CGAL::make_array(true, true, true, true); } // tm2 is not empty - if (output[Corefinement::UNION] != boost::none) + if (output[Corefinement::UNION] != std::nullopt) if (&tm2 != *output[Corefinement::UNION]) copy_face_graph(tm2, *(*output[Corefinement::UNION]), parameters::vertex_point_map(vpm2), parameters::vertex_point_map(*std::get(vpm_out_tuple))); - if (output[Corefinement::INTERSECTION] != boost::none) + if (output[Corefinement::INTERSECTION] != std::nullopt) clear(*(*output[Corefinement::INTERSECTION])); - if (output[Corefinement::TM1_MINUS_TM2] != boost::none) + if (output[Corefinement::TM1_MINUS_TM2] != std::nullopt) clear(*(*output[Corefinement::TM1_MINUS_TM2])); - if (output[Corefinement::TM2_MINUS_TM1] != boost::none) + if (output[Corefinement::TM2_MINUS_TM1] != std::nullopt) if (&tm2 != *output[Corefinement::TM2_MINUS_TM1]) copy_face_graph(tm2, *(*output[Corefinement::TM2_MINUS_TM1]), @@ -308,17 +308,17 @@ corefine_and_compute_boolean_operations( if (faces(tm2).empty()) { // tm1 is not empty - if (output[Corefinement::UNION] != boost::none) + if (output[Corefinement::UNION] != std::nullopt) if (&tm1 != *output[Corefinement::UNION]) copy_face_graph(tm1, *(*output[Corefinement::UNION]), parameters::vertex_point_map(vpm1), parameters::vertex_point_map(*std::get(vpm_out_tuple))); - if (output[Corefinement::INTERSECTION] != boost::none) + if (output[Corefinement::INTERSECTION] != std::nullopt) clear(*(*output[Corefinement::INTERSECTION])); - if (output[Corefinement::TM2_MINUS_TM1] != boost::none) + if (output[Corefinement::TM2_MINUS_TM1] != std::nullopt) clear(*(*output[Corefinement::TM2_MINUS_TM1])); - if (output[Corefinement::TM1_MINUS_TM2] != boost::none) + if (output[Corefinement::TM1_MINUS_TM2] != std::nullopt) if (&tm1 != *output[Corefinement::TM1_MINUS_TM2]) copy_face_graph(tm1, *(*output[Corefinement::TM1_MINUS_TM2]), @@ -394,10 +394,10 @@ corefine_and_compute_boolean_operations( // special case used for clipping open meshes if (choose_parameter(get_parameter(np1, internal_np::use_bool_op_to_clip_surface), false)) { - CGAL_assertion(output[Corefinement::INTERSECTION] != boost::none); - CGAL_assertion(output[Corefinement::UNION] == boost::none); - CGAL_assertion(output[Corefinement::TM1_MINUS_TM2] == boost::none); - CGAL_assertion(output[Corefinement::TM2_MINUS_TM1] == boost::none); + CGAL_assertion(output[Corefinement::INTERSECTION] != std::nullopt); + CGAL_assertion(output[Corefinement::UNION] == std::nullopt); + CGAL_assertion(output[Corefinement::TM1_MINUS_TM2] == std::nullopt); + CGAL_assertion(output[Corefinement::TM2_MINUS_TM1] == std::nullopt); const bool use_compact_clipper = choose_parameter(get_parameter(np1, internal_np::use_compact_clipper), true); ob.setup_for_clipping_a_surface(use_compact_clipper); @@ -523,7 +523,7 @@ corefine_and_compute_union( TriangleMesh& tm1, const NamedParametersOut& np_out = parameters::default_values()) { using namespace CGAL::parameters; - std::array< boost::optional,4> output; + std::array< std::optional,4> output; output[Corefinement::UNION]=&tm_out; return @@ -555,7 +555,7 @@ corefine_and_compute_intersection( TriangleMesh& tm1, const NamedParametersOut& np_out = parameters::default_values()) { using namespace CGAL::parameters; - std::array< boost::optional,4> output; + std::array< std::optional,4> output; output[Corefinement::INTERSECTION]=&tm_out; return @@ -588,7 +588,7 @@ corefine_and_compute_difference( TriangleMesh& tm1, { using namespace CGAL::parameters; using namespace CGAL::Polygon_mesh_processing::Corefinement; - std::array< boost::optional,4> output; + std::array< std::optional,4> output; output[TM1_MINUS_TM2]=&tm_out; return diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h index 89a3cd82904b..3e536e1c19da 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/Face_graph_output_builder.h @@ -181,7 +181,7 @@ class Face_graph_output_builder Node_id_map vertex_to_node_id1, vertex_to_node_id2; // output meshes - const std::array, 4>& requested_output; + const std::array, 4>& requested_output; // input meshes closed ? /// \todo do we really need this? bool is_tm1_closed; @@ -411,7 +411,7 @@ class Face_graph_output_builder const VpmOutTuple& output_vpms, EdgeMarkMapTuple& out_edge_mark_maps, UserVisitor& user_visitor, - const std::array, 4 >& requested_output) + const std::array, 4 >& requested_output) : tm1(tm1), tm2(tm2) , vpm1(vpm1), vpm2(vpm2) , fids1(fids1), fids2(fids2) @@ -513,10 +513,10 @@ class Face_graph_output_builder const boost::dynamic_bitset<>& is_node_of_degree_one, const Mesh_to_map_node&) { - const bool used_to_classify_patches = requested_output[UNION]==boost::none && - requested_output[TM1_MINUS_TM2]==boost::none && - requested_output[TM2_MINUS_TM1]==boost::none && - requested_output[INTERSECTION]==boost::none; + const bool used_to_classify_patches = requested_output[UNION]==std::nullopt && + requested_output[TM1_MINUS_TM2]==std::nullopt && + requested_output[TM2_MINUS_TM1]==std::nullopt && + requested_output[INTERSECTION]==std::nullopt; CGAL_assertion( vertex_to_node_id1.size() <= nodes.size() ); CGAL_assertion( vertex_to_node_id2.size() <= nodes.size() ); @@ -1661,8 +1661,8 @@ class Face_graph_output_builder // special code to handle non-manifold vertices on the boundary for (vertex_descriptor vd : vertices(tm1)) { - boost::optional op_h = is_border(vd, tm1); - if (op_h == boost::none) continue; + std::optional op_h = is_border(vd, tm1); + if (op_h == std::nullopt) continue; halfedge_descriptor h = *op_h; CGAL_assertion( target(h, tm1) == vd); // check if the target of h is a non-manifold vertex diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h index ee3d3159491a..9bc653058063 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h @@ -399,20 +399,20 @@ struct TweakedGetVertexPointMap }; template -boost::optional< typename TweakedGetVertexPointMap::type > -get_vpm(const NP& np, boost::optional opm, std::true_type) +std::optional< typename TweakedGetVertexPointMap::type > +get_vpm(const NP& np, std::optional opm, std::true_type) { - if (boost::none == opm) return boost::none; + if (std::nullopt == opm) return std::nullopt; return parameters::choose_parameter( parameters::get_parameter(np, internal_np::vertex_point), get_property_map(boost::vertex_point, *(*opm)) ); } template -boost::optional< typename TweakedGetVertexPointMap::type > -get_vpm(const NP&, boost::optional opm, std::false_type) +std::optional< typename TweakedGetVertexPointMap::type > +get_vpm(const NP&, std::optional opm, std::false_type) { - if (boost::none == opm) return boost::none; + if (std::nullopt == opm) return std::nullopt; return typename TweakedGetVertexPointMap::type(); } // diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h index 81f3ca6478db..468acfaf5b47 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h @@ -266,7 +266,7 @@ class Intersection_nodes(&(*inter_res)); CGAL_assertion(pt!=nullptr); @@ -387,7 +387,7 @@ class Intersection_nodes(&(*inter_res)); CGAL_assertion(pt!=nullptr); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h index 5e84ba9e6947..978ca2cd4b07 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Hole_filling/Triangulate_hole_polyline.h @@ -797,7 +797,7 @@ class Triangulate_hole_polyline_DT Triangulation tr; std::vector edge_exist; std::pair range(0, n-1); - std::tuple, bool, bool> res = construct_3D_triangulation(P, range, tr, edge_exist); + std::tuple, bool, bool> res = construct_3D_triangulation(P, range, tr, edge_exist); if(!std::get<2>(res)) { #ifdef CGAL_HOLE_FILLING_VERBOSE #ifndef CGAL_TEST_SUITE @@ -944,14 +944,14 @@ class Triangulate_hole_polyline_DT } // returns [h.first-h.second edge, true if all edges inside 3D triangulation, true if tr.dimension() >= 2] - std::tuple, bool, bool> + std::tuple, bool, bool> construct_3D_triangulation(const Polyline_3& P, std::pair h, Triangulation& tr, std::vector& edge_exist) const { // construct 3D tr with P[h.first], P[h.second] also assign ids from h.first to h.second - boost::optional e; + std::optional e; int n_border = h.second - h.first + 1; tr.insert(boost::make_transform_iterator(std::next(P.begin(), h.first), Auto_count(h.first)), boost::make_transform_iterator(std::next(P.begin(), h.second +1), Auto_count(h.first))); @@ -999,7 +999,7 @@ class Triangulate_hole_polyline_DT * + when switched to all-space, we use map based lookup tables. ************************************************************************/ Weight fill_by_incomplete_patches(Triangulation& tr, - boost::optional start_edge, + std::optional start_edge, std::vector& edge_exist, const Polyline_3& P, const Polyline_3& Q, @@ -1072,7 +1072,7 @@ class Triangulate_hole_polyline_DT // construct tr for next coming hole h = remaining_holes.back(); tr.clear(); - std::tuple, bool, bool> res = construct_3D_triangulation(P, h, tr, edge_exist); + std::tuple, bool, bool> res = construct_3D_triangulation(P, h, tr, edge_exist); if(!std::get<0>(res)) { #ifdef CGAL_HOLE_FILLING_VERBOSE CGAL_warning_msg(false, "Returning no output. Filling hole with incomplete patches is not successful!"); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 9cdb76ac76b0..2a8c5551e90a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include @@ -1944,7 +1944,7 @@ namespace internal { bool check_normals(const HalfedgeRange& hedges) const { std::size_t nb_patches = patch_id_to_index_map.size(); - //std::vector > normal_per_patch(nb_patches,boost::none); + //std::vector > normal_per_patch(nb_patches,std::nullopt); std::vector initialized(nb_patches,false); std::vector normal_per_patch(nb_patches); @@ -1968,7 +1968,7 @@ namespace internal { return false; } } - //normal_per_patch[index] = boost::make_optional(n); + //normal_per_patch[index] = std::make_optional(n); normal_per_patch[index] = n; initialized[index] = true; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h index 49cfea2a7247..92c5871d2909 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h @@ -14,7 +14,7 @@ #include #include -#include +#include #include @@ -96,7 +96,7 @@ class Axis_parallel_plane_traits const typename Traits::Construct_target_3 m_target_3; typedef boost::variant Variant_type; - typedef boost::optional< Variant_type > result_type; + typedef std::optional< Variant_type > result_type; Intersect_3(const Axis_parallel_plane_traits& traits) : m_cst_coord(traits.m_cst_coord) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Point_inside_vertical_ray_cast.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Point_inside_vertical_ray_cast.h index e282e092fa12..aabe4d201998 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Point_inside_vertical_ray_cast.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Side_of_triangle_mesh/Point_inside_vertical_ray_cast.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -78,9 +78,9 @@ class Point_inside_vertical_ray_cast //the direction of the vertical ray depends on the position of the point in the bbox //in order to limit the expected number of nodes visited. Ray query = ray_functor(point, vector_functor(0,0,(2*point.z() < bbox.zmax()+bbox.zmin()?-1:1))); - boost::optional res = is_inside_ray_tree_traversal(query, tree); + std::optional res = is_inside_ray_tree_traversal(query, tree); - if(res == boost::none) + if(res == std::nullopt) { CGAL::Random rg(seed); // seed some value for make it easy to debug Random_points_on_sphere_3 random_point(1.,rg); @@ -88,14 +88,14 @@ class Point_inside_vertical_ray_cast do { //retry with a random ray query = ray_functor(point, vector_functor(CGAL::ORIGIN,*random_point++)); res = is_inside_ray_tree_traversal(query, tree); - } while (res == boost::none); + } while (res == std::nullopt); } return *res; } private: template - boost::optional + std::optional is_inside_ray_tree_traversal(const Ray& ray, const AABBTree& tree) const { std::pair @@ -114,7 +114,7 @@ class Point_inside_vertical_ray_cast //otherwise the point is on the facet return ON_BOUNDARY; } - return boost::optional(); // indeterminate + return std::optional(); // indeterminate } }; 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 9dea9e3b4c18..3ac7b6b08f80 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 @@ -102,7 +102,7 @@ class Shape_smoother constrained_flags_[get(vimap_, v)] = true; // scaling things cannot preserve the position of more than a single constrained point - if(anchor_point == boost::none) + if(anchor_point == std::nullopt) anchor_point = get(vpmap_, v); else scale_volume_after_smoothing_ = false; @@ -230,7 +230,7 @@ class Shape_smoother // 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) + if(anchor_point != std::nullopt) pre_smooth_anchor_point = *anchor_point; else pre_smooth_anchor_point = PMP::centroid(mesh_, parameters::vertex_point_map(vpmap_).geom_traits(traits_)); @@ -247,7 +247,7 @@ class Shape_smoother } Point post_smooth_anchor_point; - if(anchor_point != boost::none) + if(anchor_point != std::nullopt) post_smooth_anchor_point = *anchor_point; else post_smooth_anchor_point = PMP::centroid(mesh_, parameters::vertex_point_map(vpmap_).geom_traits(traits_)); @@ -364,7 +364,7 @@ class Shape_smoother // 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_; - boost::optional anchor_point; + std::optional anchor_point; // linear system data std::vector diagonal_; // index of vector -> index of vimap_ diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 04e5cc6a1441..090f0c775e2d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -1846,7 +1846,7 @@ locate_with_AABB_tree(const typename internal::Location_traits AABB_traits; typedef AABB_tree AABB_face_graph_tree; typedef typename AABB_face_graph_tree::template Intersection_and_primitive_id::Type Intersection_type; - typedef boost::optional Ray_intersection; + typedef std::optional Ray_intersection; using parameters::get_parameter; using parameters::choose_parameter; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h index 798499f430b7..860ba20da7a9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_degeneracies.h @@ -197,7 +197,7 @@ bool is_collapse_geometrically_valid(typename boost::graph_traits: // @todo handle boundary edges template -boost::optional +std::optional get_collapse_volume(typename boost::graph_traits::halfedge_descriptor h, const TriangleMesh& tmesh, const VPM& vpm, @@ -244,7 +244,7 @@ get_collapse_volume(typename boost::graph_traits::halfedge_descrip Vector_3 n1 = gt.construct_cross_product_vector_3_object()(v_ar, v_ab); Vector_3 n2 = gt.construct_cross_product_vector_3_object()(v_ak, v_ab); if(gt.compute_scalar_product_3_object()(n1, n2) <= 0) - return boost::none; + return std::nullopt; delta_vol += volume(b, a, removed, origin) + volume(a, b, kept, origin); // opposite orientation } @@ -268,27 +268,27 @@ get_best_edge_orientation(typename boost::graph_traits::edge_descr halfedge_descriptor h = halfedge(e, tmesh), ho = opposite(h, tmesh); - boost::optional dv1 = get_collapse_volume(h, tmesh, vpm, gt); - boost::optional dv2 = get_collapse_volume(ho, tmesh, vpm, gt); + std::optional dv1 = get_collapse_volume(h, tmesh, vpm, gt); + std::optional dv2 = get_collapse_volume(ho, tmesh, vpm, gt); // the resulting point of the collapse of a halfedge is the target of the halfedge before collapse if(get(vcm, source(h, tmesh))) - return dv2 != boost::none ? ho + return dv2 != std::nullopt ? ho : boost::graph_traits::null_halfedge(); if(get(vcm, target(h, tmesh))) - return dv1 != boost::none ? h + return dv1 != std::nullopt ? h : boost::graph_traits::null_halfedge(); - if(dv1 != boost::none) + if(dv1 != std::nullopt) { - if(dv2 != boost::none) + if(dv2 != std::nullopt) return (*dv1 < *dv2) ? h : ho; return h; } - if(dv2 != boost::none) + if(dv2 != std::nullopt) return ho; return boost::graph_traits::null_halfedge(); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h index ff04ca9bfcca..56733b660fdd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h @@ -63,7 +63,7 @@ namespace CGAL { /// - `Point_3` /// - `Segment_3` /// - `Oriented_side_3` with `Oriented_side operator()(Plane_3, Point_3)` -/// - `Do_intersect_3` with `boost::optional operator()(Plane_3,Segment_3)` +/// - `Do_intersect_3` with `std::optional operator()(Plane_3,Segment_3)` /// - `Do_intersect_3` with `bool operator()(Plane_3, Bbox_3)` /// /// \todo If we keep the traits for plane orthogonal to a frame axis, `Traits` must also provide: @@ -277,7 +277,7 @@ class Polygon_mesh_slicer get(m_vpmap,target(ed, m_tmesh)) ); const auto inter = intersect_3(m_plane, s); - CGAL_assertion(inter != boost::none); + CGAL_assertion(inter != std::nullopt); const Point_3* pt_ptr = boost::get(&(*inter)); current_poly.push_back( *pt_ptr ); } diff --git a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h index c8a311a37aee..7a377a935c94 100644 --- a/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h +++ b/Polygon_mesh_processing/include/CGAL/Polyhedral_envelope.h @@ -825,7 +825,7 @@ struct Polyhedral_envelope { for (unsigned int i = 0; i < cutp.size(); i++){ const Plane& plane_i = prism[cutp[i]]; - boost::optional op = intersection_point_for_polyhedral_envelope(line, plane_i.eplane); + std::optional op = intersection_point_for_polyhedral_envelope(line, plane_i.eplane); if(! op){ std::cout << "there must be an intersection 2" << std::endl; } @@ -950,7 +950,7 @@ struct Polyhedral_envelope { } for (unsigned int j = 0; j < cidl.size(); j++) { - boost::optional op = intersection_point_for_polyhedral_envelope(line, + std::optional op = intersection_point_for_polyhedral_envelope(line, halfspace[prismindex[queue[i]]][cidl[j]].eplane); const ePoint_3& ip = *op; inter = Implicit_Seg_Facet_interpoint_Out_Prism_return_local_id @@ -1142,7 +1142,7 @@ struct Polyhedral_envelope { const Plane& plane_i = prism[cutp[i]]; const eLine_3& eline = *(seg[k]); - boost::optional op = intersection_point_for_polyhedral_envelope(eline, plane_i.eplane); + std::optional op = intersection_point_for_polyhedral_envelope(eline, plane_i.eplane); if(! op){ #ifdef CGAL_ENVELOPE_DEBUG std::cout << "there must be an intersection 6" << std::endl; @@ -1227,7 +1227,7 @@ struct Polyhedral_envelope { } - boost::optional ipp = intersection_point_for_polyhedral_envelope(tri_eplane, prism[cutp[i]].eplane, prism[cutp[j]].eplane); + std::optional ipp = intersection_point_for_polyhedral_envelope(tri_eplane, prism[cutp[i]].eplane, prism[cutp[j]].eplane); if(ipp){ inter = is_3_triangle_cut_float_fast(etri0, etri1, etri2, n, @@ -1667,7 +1667,7 @@ struct Polyhedral_envelope { if (!cut) continue; for (unsigned int j = 0; j < cidl.size(); j++) { - boost::optional op = intersection_point_for_polyhedral_envelope(eline, + std::optional op = intersection_point_for_polyhedral_envelope(eline, halfspace[prismindex[queue[i]]][cidl[j]].eplane); const ePoint_3& ip = *op; inter = Implicit_Seg_Facet_interpoint_Out_Prism_return_local_id(ip, idlist, jump1, check_id); @@ -1751,7 +1751,7 @@ struct Polyhedral_envelope { } // now we know that there exists an intesection point - boost::optional op = intersection_point_for_polyhedral_envelope(eline, + std::optional op = intersection_point_for_polyhedral_envelope(eline, halfspace[filtered_intersection[queue[i]]][intersect_face[queue[i]][j]].eplane); const ePoint_3& ip = *op; @@ -1834,7 +1834,7 @@ struct Polyhedral_envelope { // We moved the intersection here // In case there is no intersection point we continue - boost::optional + std::optional op = intersection_point_for_polyhedral_envelope(etriangle_eplane, halfspace[jump1][intersect_face[queue[i]][k]].eplane, halfspace[jump2][intersect_face[queue[j]][h]].eplane); @@ -2113,7 +2113,7 @@ struct Polyhedral_envelope { } ePoint_3 origin(env_vertices[env_faces[i][0]].x(), env_vertices[env_faces[i][0]].y(),env_vertices[env_faces[i][0]].z()); Surface_mesh esm; - halfspace_intersection_3(eplanes.begin(),eplanes.end(),esm , boost::make_optional(origin)); + halfspace_intersection_3(eplanes.begin(),eplanes.end(),esm , std::make_optional(origin)); copy_face_graph(esm,sm); } diff --git a/Polygon_mesh_processing/include/CGAL/Side_of_triangle_mesh.h b/Polygon_mesh_processing/include/CGAL/Side_of_triangle_mesh.h index 89e281534089..eff54edea7c2 100644 --- a/Polygon_mesh_processing/include/CGAL/Side_of_triangle_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Side_of_triangle_mesh.h @@ -99,7 +99,7 @@ class Side_of_triangle_mesh typename GeomTraits::Construct_ray_3 ray_functor; typename GeomTraits::Construct_vector_3 vector_functor; const TriangleMesh* tm_ptr; - boost::optional opt_vpm; + std::optional opt_vpm; bool own_tree; CGAL::Bbox_3 box; #ifdef CGAL_HAS_THREADS @@ -255,7 +255,7 @@ class Side_of_triangle_mesh CGAL_SCOPED_LOCK(tree_mutex); tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_relaxed)); #endif - CGAL_assertion(tm_ptr != nullptr && opt_vpm!=boost::none); + CGAL_assertion(tm_ptr != nullptr && opt_vpm!=std::nullopt); if (tree_ptr==nullptr) { tree_ptr = new AABB_tree(faces(*tm_ptr).first, @@ -297,7 +297,7 @@ class Side_of_triangle_mesh CGAL_SCOPED_LOCK(tree_mutex); tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_relaxed)); #endif - CGAL_assertion(tm_ptr != nullptr && opt_vpm!=boost::none); + CGAL_assertion(tm_ptr != nullptr && opt_vpm!=std::nullopt); if (tree_ptr==nullptr) { tree_ptr = new AABB_tree(faces(*tm_ptr).first, diff --git a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h index c12178a1b9cf..c171510f1f91 100644 --- a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h +++ b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -34,8 +34,8 @@ namespace internal { struct Dummy_filter2 { template inline - const boost::optional - operator()(const Profile&, const boost::optional& op) const + const std::optional + operator()(const Profile&, const std::optional& op) const { return op; } @@ -109,8 +109,8 @@ class Polyhedral_envelope_filter template - boost::optional - operator()(const Profile& profile, boost::optional op) const + std::optional + operator()(const Profile& profile, std::optional op) const { typedef typename Profile::Point Point; typedef typename Profile::vertex_descriptor_vector Link; @@ -127,7 +127,7 @@ class Polyhedral_envelope_filter if(! (*m_envelope)(p)){ // the new placement is outside envelope - return boost::none; + return std::nullopt; } const Link link = profile.link(); @@ -141,7 +141,7 @@ class Polyhedral_envelope_filter if(! (*m_envelope)(p, pv, pw)){ // the triangle intersects the envelope - return boost::none; + return std::nullopt; } pv = pw; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp index 1eec758737e8..3f3af6c44ae1 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp @@ -164,11 +164,11 @@ void test_bool_op_no_copy( assert( count_constrained_edges(tm1, ecm1)==307 ); assert( count_constrained_edges(tm2, ecm2)==307 ); - typedef boost::optional OTM; + typedef std::optional OTM; Triangle_mesh *ptr = nullptr; const std::array output = - reverse ? CGAL::make_array(OTM(&tm2), OTM(&tm1), boost::make_optional(false,ptr), boost::make_optional(false,ptr)) - : CGAL::make_array(OTM(&tm1), OTM(&tm2), boost::make_optional(false,ptr), boost::make_optional(false,ptr)); + reverse ? CGAL::make_array(OTM(&tm2), OTM(&tm1), std::make_optional(false,ptr), std::make_optional(false,ptr)) + : CGAL::make_array(OTM(&tm1), OTM(&tm2), std::make_optional(false,ptr), std::make_optional(false,ptr)); PMP::corefine_and_compute_boolean_operations(tm1, tm2, output, diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_bool_op.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_bool_op.cpp index cc0123859967..a0f7679dc4c0 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_bool_op.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_bool_op.cpp @@ -88,7 +88,7 @@ void run_boolean_operations( { std::cout << "Scenario #" << id << " - " << scenario << "\n"; - typedef boost::optional OSM; + typedef std::optional OSM; std::array output; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp index 8aeaab049db5..17b357660082 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include @@ -393,8 +393,8 @@ void test_predicates(const G& g, CGAL::Random& rnd) loc.second[id_of_h] = FT(1); loc.second[(id_of_h+1)%3] = FT(0); loc.second[(id_of_h+2)%3] = FT(0); - boost::optional opt_hd = CGAL::is_border(source(h, g), g); - assert(PMP::is_on_mesh_border(loc, g) == (opt_hd != boost::none)); + std::optional opt_hd = CGAL::is_border(source(h, g), g); + assert(PMP::is_on_mesh_border(loc, g) == (opt_hd != std::nullopt)); loc.second[id_of_h] = FT(0.5); loc.second[(id_of_h+1)%3] = FT(0.5); diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index b797ecf7a70e..fe7d8ddad06e 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1267,7 +1267,7 @@ void MainWindow::open(QString filename) bool MainWindow::open(QString filename, QString loader_name) { QFileInfo fileinfo(filename); - boost::optional item_opt; + std::optional item_opt; try { item_opt = wrap_a_call_to_cpp ([this, fileinfo, loader_name]() @@ -1890,7 +1890,7 @@ void MainWindow::closeEvent(QCloseEvent *event) bool MainWindow::loadScript(QString filename) { QFileInfo fileinfo(filename); - boost::optional opt = wrap_a_call_to_cpp + std::optional opt = wrap_a_call_to_cpp ([this, fileinfo] { return loadScript(fileinfo); }, this, __FILE__, __LINE__, CGAL::Three::PARENT_CONTEXT); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 68c3053d876b..4c13bccee7cb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -67,7 +67,7 @@ #include #include -#include +#include #include #include @@ -119,13 +119,13 @@ public Q_SLOTS: void x(QString); public: - void setIC(const IntConverter& x) { ic = x; fc = boost::optional(); } - void setFC(const DoubleConverter& x) { fc = x; ic = boost::optional(); } + void setIC(const IntConverter& x) { ic = x; fc = std::optional(); } + void setFC(const DoubleConverter& x) { fc = x; ic = std::optional(); } void setViewer(Viewer_interface* viewer) { this->viewer = viewer; } private: - boost::optional ic; - boost::optional fc; + std::optional ic; + std::optional fc; Viewer_interface* viewer; void getPixel(const QPoint& e) { 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 eb3ce6042ae9..da298acf6ff7 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -29,7 +29,7 @@ auto make_not_null(T&& t) { } #include -#include +#include #include "Scene_polylines_item.h" #ifdef CGAL_MESH_3_DEMO_ACTIVATE_IMPLICIT_FUNCTIONS @@ -130,7 +130,7 @@ class Mesh_3_plugin : } public Q_SLOTS: - boost::optional get_items_or_return_error_string() const; + std::optional get_items_or_return_error_string() const; void set_defaults(); void mesh_3_volume(); void mesh_3_surface(); @@ -231,7 +231,7 @@ public Q_SLOTS: IMAGE_MESH_ITEMS, IMPLICIT_MESH_ITEMS }; - mutable boost::optional> items; @@ -277,7 +277,7 @@ void Mesh_3_plugin::mesh_3_volume() mesh_3(Mesh_type::VOLUME); } -boost::optional Mesh_3_plugin::get_items_or_return_error_string() const +std::optional Mesh_3_plugin::get_items_or_return_error_string() const { using boost::get; items = {}; @@ -355,7 +355,7 @@ boost::optional Mesh_3_plugin::get_items_or_return_error_string() const //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) + if (polylines_item != nullptr && items != std::nullopt) { auto poly_items_ptr = get(&*items); auto image_items_ptr = get(&*items); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp index 6f2e1eed542b..a25fa8072f02 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include using namespace CGAL::Three; @@ -189,11 +189,11 @@ public Q_SLOTS: void on_Sample_random_points_from_bbox() { // calculate bbox of selected polyhedron items - boost::optional bbox - = boost::make_optional(false, CGAL::Three::Scene_interface::Bbox()); + std::optional bbox + = std::make_optional(false, CGAL::Three::Scene_interface::Bbox()); // Workaround a bug in g++-4.8.3: // https://stackoverflow.com/a/21755207/1728537 - // Using boost::make_optional to copy-initialize 'bbox' hides the + // Using std::make_optional to copy-initialize 'bbox' hides the // warning about '*bbox' not being initialized. // -- Laurent Rineau, 2014/10/30 diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp index 5f543518f2f8..f4134ecfd150 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Selection_plugin.cpp @@ -497,7 +497,7 @@ public Q_SLOTS: return; } - boost::optional minimum = + std::optional minimum = selection_item->select_isolated_components(ui_widget.Threshold_size_spin_box->value()); if(minimum) { ui_widget.Threshold_size_spin_box->setValue((int) *minimum); @@ -512,7 +512,7 @@ public Q_SLOTS: print_message("Error: there is no selected polyhedron selection item!"); return; } - boost::optional minimum = selection_item->get_minimum_isolated_component(); + std::optional minimum = selection_item->get_minimum_isolated_component(); if(minimum) { ui_widget.Threshold_size_spin_box->setValue((int) *minimum); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp index 9385ee2442ba..724ed194fc51 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp @@ -309,7 +309,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_Select_isolated_components_butto Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type - boost::optional minimum = + std::optional minimum = edit_item->select_isolated_components(ui_widget.Threshold_size_spin_box->value()); if(minimum) { ui_widget.Threshold_size_spin_box->setValue((int) *minimum); @@ -321,7 +321,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::on_Get_minimum_button_clicked() { Scene_edit_polyhedron_item* edit_item = qobject_cast(scene->item(item_id)); if(!edit_item) return; // the selected item is not of the right type - boost::optional minimum = edit_item->get_minimum_isolated_component(); + std::optional minimum = edit_item->get_minimum_isolated_component(); if(minimum) { ui_widget.Threshold_size_spin_box->setValue((int) *minimum); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp index 28163a38043a..c4a060696cdb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp @@ -1621,7 +1621,7 @@ void Scene_edit_polyhedron_item::reset_deform_object() refresh_all_group_centers(); } -boost::optional Scene_edit_polyhedron_item::get_minimum_isolated_component() { +std::optional Scene_edit_polyhedron_item::get_minimum_isolated_component() { Travel_isolated_components::Minimum_visitor visitor; Travel_isolated_components(*surface_mesh()).travel (vertices(*surface_mesh()).first, vertices(*surface_mesh()).second, @@ -1630,7 +1630,7 @@ boost::optional Scene_edit_polyhedron_item::get_minimum_isolated_co } -boost::optional Scene_edit_polyhedron_item::select_isolated_components(std::size_t threshold) { +std::optional Scene_edit_polyhedron_item::select_isolated_components(std::size_t threshold) { typedef boost::function_output_iterator > Output_iterator; Output_iterator out(d->deform_sm_mesh); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h index 3fc7b02d1ddf..b78d140ffe3d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.h @@ -379,7 +379,7 @@ public Q_SLOTS: } }; - boost::optional get_minimum_isolated_component(); + std::optional get_minimum_isolated_component(); template struct Select_roi_output{ typedef typename CGAL::Surface_mesh_deformation select_isolated_components(std::size_t threshold) ; + std::optional select_isolated_components(std::size_t threshold) ; protected: // Deformation related functions // diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h index 8164cdacf8fc..15b6171cf287 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h @@ -289,14 +289,14 @@ friend class Polyhedron_demo_selection_plugin; { // Workaround a bug in g++-4.8.3: // https://stackoverflow.com/a/21755207/1728537 - // Using boost::make_optional to copy-initialize 'item_bbox' hides the + // Using std::make_optional to copy-initialize 'item_bbox' hides the // warning about '*item_bbox' not being initialized. // -- Laurent Rineau, 2014/10/30 constVPmap vpm = get(CGAL::vertex_point, *polyhedron()); - boost::optional item_bbox - = boost::make_optional(false, CGAL::Bbox_3()); + std::optional item_bbox + = std::make_optional(false, CGAL::Bbox_3()); for(Selection_set_vertex::const_iterator v_it = selected_vertices.begin(); @@ -488,7 +488,7 @@ friend class Polyhedron_demo_selection_plugin; clear(); } - boost::optional get_minimum_isolated_component() { + std::optional get_minimum_isolated_component() { switch(get_active_handle_type()) { case Active_handle::VERTEX: return get_minimum_isolated_component(); @@ -499,7 +499,7 @@ friend class Polyhedron_demo_selection_plugin; } } template // use fg_vertex_descriptor, fg_face_descriptor, fg_edge_descriptor - boost::optional get_minimum_isolated_component() { + std::optional get_minimum_isolated_component() { Selection_traits tr(this); Travel_isolated_components::Minimum_visitor visitor; Travel_isolated_components(*polyhedron()).travel @@ -507,7 +507,7 @@ friend class Polyhedron_demo_selection_plugin; return visitor.minimum; } - boost::optional select_isolated_components(std::size_t threshold) { + std::optional select_isolated_components(std::size_t threshold) { switch(get_active_handle_type()) { case Active_handle::VERTEX: return select_isolated_components(threshold); @@ -518,7 +518,7 @@ friend class Polyhedron_demo_selection_plugin; } } template // use fg_vertex_descriptor, fg_face_descriptor, fg_edge_descriptor - boost::optional select_isolated_components(std::size_t threshold) { + std::optional select_isolated_components(std::size_t threshold) { typedef Selection_traits Tr; Tr tr(this); typedef std::insert_iterator Output_iterator; diff --git a/Polyhedron/demo/Polyhedron/Travel_isolated_components.h b/Polyhedron/demo/Polyhedron/Travel_isolated_components.h index 5cdd2dfdeb92..c1e1124f6b22 100644 --- a/Polyhedron/demo/Polyhedron/Travel_isolated_components.h +++ b/Polyhedron/demo/Polyhedron/Travel_isolated_components.h @@ -1,7 +1,7 @@ #ifndef TRAVEL_ISOLATED_COMPONENTS_H #define TRAVEL_ISOLATED_COMPONENTS_H -#include +#include #include #include "One_ring_iterators.h" #include diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h index 4722bcaa72c8..b945f7760173 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h @@ -27,7 +27,7 @@ Given a vertex in constraint iterator `viq` computes `vip=std::prev(viq)` and `v \param ct The underlying constrained Delaunay triangulation which embeds the polyline constraints \param viq The vertex in constraint iterator of the vertex to remove -\returns The cost for removing `*viq`. The value `boost::none` can be returned to indicate an infinite or uncomputable cost. +\returns The cost for removing `*viq`. The value `std::nullopt` can be returned to indicate an infinite or uncomputable cost. \tparam CDT must be `CGAL::Constrained_triangulation_plus_2` with a vertex type that is model of `PolylineSimplificationVertexBase_2`. `CDT::Geom_traits` must be model of @@ -35,7 +35,7 @@ the concept `ConstrainedDelaunayTriangulationTraits_2`. */ template - boost::optional + std::optional operator()(CGAL::Constrained_triangulation_plus_2 const& ct, CGAL::Constrained_triangulation_plus_2::Vertices_in_constraint_iterator viq) const;} diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h index d7f169997b78..9af95a9e422b 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h @@ -49,7 +49,7 @@ class Hybrid_squared_distance_cost /// \tparam CDT must be `CGAL::Constrained_Delaunay_triangulation_2` with a vertex type that /// is model of `PolylineSimplificationVertexBase_2`. template - boost::optional + std::optional operator()( const Constrained_triangulation_plus_2& pct , typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator vicq) const { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h index 53ecf34cc6fc..9a5b53e4259a 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h @@ -44,7 +44,7 @@ class Scaled_squared_distance_cost /// \tparam CDT must be `CGAL::Constrained_Delaunay_triangulation_2` with a vertex type that /// is model of `PolylineSimplificationVertexBase_2`. template - boost::optional + std::optional operator()(const Constrained_triangulation_plus_2& pct , typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator vicq) const { @@ -94,8 +94,8 @@ class Scaled_squared_distance_cost }while(vc != done); return d2_uninitialized ? - boost::optional(boost::none) : - boost::optional(d1 / d2); + std::optional(std::nullopt) : + std::optional(d1 / d2); } }; diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h index 08ca152ddd0c..bf1badd8612d 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h @@ -50,7 +50,7 @@ class Squared_distance_cost /// is model of `PolylineSimplificationVertexBase_2`. template - boost::optional + std::optional operator()(const Constrained_triangulation_plus_2& pct , typename Constrained_triangulation_plus_2::Vertices_in_constraint_iterator vicq)const { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index d5497788a02a..02552570841f 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -211,7 +211,7 @@ class Polyline_simplification_2 it != pct.vertices_in_constraint_end(cid); ++it){ if((*it)->is_removable()){ - boost::optional dist = cost(pct, it); + std::optional dist = cost(pct, it); if(dist){ (*it)->set_cost(*dist); if(! (*mpq).contains(*it)){ @@ -326,7 +326,7 @@ operator()() pct.simplify(vit); if((*u)->is_removable()){ - boost::optional dist = cost(pct, u); + std::optional dist = cost(pct, u); if(! dist){ // cost is undefined if( mpq->contains(*u) ){ @@ -344,7 +344,7 @@ operator()() } if((*w)->is_removable()){ - boost::optional dist = cost(pct, w); + std::optional dist = cost(pct, w); if(! dist){ // cost is undefined if( mpq->contains(*w) ){ diff --git a/STL_Extension/doc/STL_Extension/CGAL/Object.h b/STL_Extension/doc/STL_Extension/CGAL/Object.h index c75541b0ae95..ddf919ef64a6 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Object.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Object.h @@ -117,9 +117,9 @@ Object(boost::variant); /*! Implicit converting constructor for compatibility with -`boost::optional` and `boost::variant`. +`std::optional` and `boost::variant`. */ -Object(boost::optional< boost::variant >); +Object(std::optional< boost::variant >); /// @} diff --git a/STL_Extension/doc/STL_Extension/CGAL/iterator.h b/STL_Extension/doc/STL_Extension/CGAL/iterator.h index fdc82bb1ffda..5e1e1acce56a 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/iterator.h +++ b/STL_Extension/doc/STL_Extension/CGAL/iterator.h @@ -107,9 +107,9 @@ The class `Dispatch_or_drop_output_iterator` defines an dispatches among those based on the type of the value type which is put in it. Besides defining assignment for all parameters of `V` and for a tuple of type `V`, it is also defined for the types `boost::variant` and -`boost::optional >`, where `T...` +`std::optional >`, where `T...` must be a subset of the parameters of `V`. Should the -`boost::optional` be empty, it will be discarded. +`std::optional` be empty, it will be discarded. \cgalHeading{Parameters} @@ -195,7 +195,7 @@ put in it. Other types are also accepted, and the object is discarded in this case. Besides defining assignment for all parameters of `V` and for a tuple of type `V`, it is also defined for the types `boost::variant` and -`boost::optional >`, where `T...` +`std::optional >`, where `T...` can be a list of arbitrary types. It also inherits from `O`, which makes it easy to treat like a diff --git a/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp b/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp index f55d06db3923..44ff692c7885 100644 --- a/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp +++ b/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include int main() { diff --git a/STL_Extension/include/CGAL/Modifiable_priority_queue.h b/STL_Extension/include/CGAL/Modifiable_priority_queue.h index 2f24c67cd77d..e4fe97cda417 100644 --- a/STL_Extension/include/CGAL/Modifiable_priority_queue.h +++ b/STL_Extension/include/CGAL/Modifiable_priority_queue.h @@ -12,7 +12,7 @@ #define CGAL_MODIFIABLE_PRIORITY_QUEUE_H #include // Needed by the following Boost header for CHAR_BIT. -#include +#include #include #include @@ -66,14 +66,14 @@ class Modifiable_priority_queue bool contains ( value_type const& v ) { return mHeap.contains(v) ; } - boost::optional extract_top() + std::optional extract_top() { - boost::optional r ; + std::optional r ; if ( !empty() ) { value_type v = top(); pop(); - r = boost::optional(v) ; + r = std::optional(v) ; } return r ; } @@ -238,14 +238,14 @@ struct Modifiable_priority_queue extract_top() + std::optional extract_top() { - boost::optional r; + std::optional r; if(!empty()) { value_type v = top(); pop(); - r = boost::optional(v); + r = std::optional(v); } return r; diff --git a/STL_Extension/include/CGAL/Object.h b/STL_Extension/include/CGAL/Object.h index fdfd59bd5141..33a01aac875d 100644 --- a/STL_Extension/include/CGAL/Object.h +++ b/STL_Extension/include/CGAL/Object.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -65,7 +65,7 @@ class Object // implicit constructor from optionals containing variants template - Object(const boost::optional< boost::variant >& t) + Object(const std::optional< boost::variant >& t) : obj( t ? boost::apply_visitor(Any_from_variant(), *t) : nullptr) { } // implicit constructor from variants diff --git a/STL_Extension/include/CGAL/STL_Extension/internal/boost/relaxed_heap.hpp b/STL_Extension/include/CGAL/STL_Extension/internal/boost/relaxed_heap.hpp index a02a831f0445..96f9f2aa08cc 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/boost/relaxed_heap.hpp +++ b/STL_Extension/include/CGAL/STL_Extension/internal/boost/relaxed_heap.hpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include // for CHAR_BIT #include @@ -79,13 +79,13 @@ class relaxed_heap /** The value associated with this group. This value is only valid * when @c kind!=largest_key (which indicates a deleted - * element). Note that the use of boost::optional increases the + * element). Note that the use of std::optional increases the * memory requirements slightly but does not result in extraneous * memory allocations or deallocations. The optional could be * eliminated when @c value_type is a model of * DefaultConstructible. */ - ::boost::optional< value_type > value; + ::std::optional< value_type > value; /** * The kind of key stored at this group. This may be @c @@ -205,14 +205,14 @@ class relaxed_heap value_type& top() { find_smallest(); - CGAL_assertion(smallest_value->value != boost::none); + CGAL_assertion(smallest_value->value != std::nullopt); return *smallest_value->value; } const value_type& top() const { find_smallest(); - CGAL_assertion(smallest_value->value != boost::none); + CGAL_assertion(smallest_value->value != std::nullopt); return *smallest_value->value; } @@ -238,7 +238,7 @@ class relaxed_heap rank_type r = x->rank; group* p = x->parent; { - CGAL_assertion(x->value != boost::none); + CGAL_assertion(x->value != std::nullopt); // Find x's group size_type start = get(id, *x->value) - get(id, *x->value) % log_n; @@ -727,7 +727,7 @@ class relaxed_heap * are each log_n long, with the last group potentially being * smaller. */ - std::vector< ::boost::optional< value_type > > groups; + std::vector< ::std::optional< value_type > > groups; /** The list of active groups, indexed by rank. When A[r] is null, * there is no active group of rank r. Otherwise, A[r] is the active diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index 956cc88a8c20..4928d3d519fb 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -1388,7 +1388,7 @@ class Dispatch_output_iterator < std::tuple, std::tuple > } template - Self& operator=(const boost::optional< boost::variant >& t) { + Self& operator=(const std::optional< boost::variant >& t) { internal::Output_visitor visitor(this); if(t) boost::apply_visitor(visitor, *t); return *this; diff --git a/STL_Extension/test/STL_Extension/test_Object.cpp b/STL_Extension/test/STL_Extension/test_Object.cpp index 705779bee86b..36cacb0f3343 100644 --- a/STL_Extension/test/STL_Extension/test_Object.cpp +++ b/STL_Extension/test/STL_Extension/test_Object.cpp @@ -4,14 +4,14 @@ #include #include -#include +#include #include void from_opt_var() { int i = 0; double j = 0.0; - boost::optional< boost::variant > v(23); + std::optional< boost::variant > v(23); CGAL::Object o = v; assert(!o.empty()); assert(CGAL::assign(i, o)); @@ -23,7 +23,7 @@ void from_opt_var() { assert(CGAL::assign(j, o)); assert(j == 2.0); //empty optional - boost::optional< boost::variant > v2; + std::optional< boost::variant > v2; CGAL::Object o2 = v2; assert(o2.empty()); } diff --git a/STL_Extension/test/STL_Extension/test_dispatch_output.cpp b/STL_Extension/test/STL_Extension/test_dispatch_output.cpp index 9dffd636b515..b4340772add8 100644 --- a/STL_Extension/test/STL_Extension/test_dispatch_output.cpp +++ b/STL_Extension/test/STL_Extension/test_dispatch_output.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include struct A{}; struct B{}; @@ -92,7 +92,7 @@ void complete_test(std::vector data1,std::list data2){ void variant_test() { typedef boost::variant var; - typedef boost::optional< var > ovar; + typedef std::optional< var > ovar; std::vector a; std::vector b; std::vector c; diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h index b36cc8fb9733..0d6141ea2f03 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h @@ -188,7 +188,7 @@ The types `FuzzyQueryItem::Point_d` and `Point_d` must be equivalent. To use this function `Traits` must be a model of the concept `RangeSearchTraits`. */ template -boost::optional search_any_point(FuzzyQueryItem q) const; +std::optional search_any_point(FuzzyQueryItem q) const; /*! Reports the points that are approximately contained by `q`. diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree_node.h b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree_node.h index 8d7d50f373e5..3d92ae2dc361 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree_node.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree_node.h @@ -45,7 +45,7 @@ OutputIterator search(OutputIterator it, FuzzyQueryItem q) const; Reports any point from the subtree of the node, that is approximately contained by `q`. */ template -boost::optional search_any_point(OutputIterator it, FuzzyQueryItem q) const; +std::optional search_any_point(OutputIterator it, FuzzyQueryItem q) const; /*! Reports all the points contained by the subtree of the node. diff --git a/Spatial_searching/examples/Spatial_searching/searching_with_circular_query.cpp b/Spatial_searching/examples/Spatial_searching/searching_with_circular_query.cpp index 3f08f1278a4c..de8f75f57db2 100644 --- a/Spatial_searching/examples/Spatial_searching/searching_with_circular_query.cpp +++ b/Spatial_searching/examples/Spatial_searching/searching_with_circular_query.cpp @@ -30,7 +30,7 @@ int main() Point center(0.2, 0.2); Fuzzy_circle default_range(center, 0.2); - boost::optional any = tree.search_any_point(default_range); + std::optional any = tree.search_any_point(default_range); if(any) std::cout << *any << " is in the query circle\n"; else diff --git a/Spatial_searching/include/CGAL/Kd_tree.h b/Spatial_searching/include/CGAL/Kd_tree.h index 317f6a78bad5..54a344f3705c 100644 --- a/Spatial_searching/include/CGAL/Kd_tree.h +++ b/Spatial_searching/include/CGAL/Kd_tree.h @@ -31,7 +31,7 @@ #include #include -#include +#include #ifdef CGAL_HAS_THREADS #include @@ -594,7 +594,7 @@ class Kd_tree { template - boost::optional + std::optional search_any_point(const FuzzyQueryItem& q) const { if(! pts.empty()){ @@ -605,7 +605,7 @@ class Kd_tree { Kd_tree_rectangle b(*bbox); return tree_root->search_any_point(q,b,begin(),cache_begin(),dim_); } - return boost::none; + return std::nullopt; } diff --git a/Spatial_searching/include/CGAL/Kd_tree_node.h b/Spatial_searching/include/CGAL/Kd_tree_node.h index 02af0663d6ab..8eb6602f17b3 100644 --- a/Spatial_searching/include/CGAL/Kd_tree_node.h +++ b/Spatial_searching/include/CGAL/Kd_tree_node.h @@ -175,14 +175,14 @@ namespace CGAL { } - boost::optional + std::optional any_tree_item() const { - boost::optional result = boost::none; + std::optional result = std::nullopt; if (is_leaf()) { Leaf_node_const_handle node = static_cast(this); if (node->size()>0){ - return boost::make_optional(*(node->begin())); + return std::make_optional(*(node->begin())); } } else { @@ -273,14 +273,14 @@ namespace CGAL { template - boost::optional + std::optional search_any_point(const FuzzyQueryItem& q, Kd_tree_rectangle& b, typename Kdt::const_iterator tree_points_begin, typename std::vector::const_iterator cache_begin, int dim) const { - boost::optional result = boost::none; + std::optional result = std::nullopt; if (is_leaf()) { Leaf_node_const_handle node = static_cast(this); @@ -376,7 +376,7 @@ namespace CGAL { // With cache template - boost::optional search_any_point_in_leaf( + std::optional search_any_point_in_leaf( Leaf_node_const_handle node, const FuzzyQueryItem &q, typename Kdt::const_iterator tree_points_begin, @@ -384,7 +384,7 @@ namespace CGAL { int dim, Tag_true /*has_points_cache*/) const { - boost::optional result = boost::none; + std::optional result = std::nullopt; typename Kdt::iterator it_node_point = node->begin(), it_node_point_end = node->end(); typename std::vector::const_iterator cache_point_it = cache_begin + dim*(it_node_point - tree_points_begin); for (; it_node_point != it_node_point_end; ++it_node_point, cache_point_it += dim) @@ -401,7 +401,7 @@ namespace CGAL { // Without cache template - boost::optional search_any_point_in_leaf( + std::optional search_any_point_in_leaf( Leaf_node_const_handle node, const FuzzyQueryItem &q, typename Kdt::const_iterator /*tree_points_begin*/, @@ -409,7 +409,7 @@ namespace CGAL { int /*dim*/, Tag_false /*has_points_cache*/) const { - boost::optional result = boost::none; + std::optional result = std::nullopt; for (iterator i = node->begin(); i != node->end(); ++i) { if (q.contains(*i)) diff --git a/Spatial_searching/include/CGAL/Point_container.h b/Spatial_searching/include/CGAL/Point_container.h index eb96024348e2..4c2b180b6ba1 100644 --- a/Spatial_searching/include/CGAL/Point_container.h +++ b/Spatial_searching/include/CGAL/Point_container.h @@ -25,7 +25,7 @@ #include #include -#include +#include namespace CGAL { @@ -45,8 +45,8 @@ class Point_container { private: Traits traits; // the iterator range of the Point_container - boost::optional m_b ; - boost::optional m_e ; + std::optional m_b ; + std::optional m_e ; int built_coord; // a coordinate for which the pointer list is built Kd_tree_rectangle bbox; // bounding box, i.e. rectangle of node diff --git a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp index 438017f36f6a..be86a93b4dd9 100644 --- a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp +++ b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp @@ -54,7 +54,7 @@ int main() if ( i->opposite()->vertex()->has_infinite_time() ) { - boost::optional op= + std::optional op= builder.Construct_offset_point(offset , i->opposite()); if(!op) continue; p=*op; @@ -64,7 +64,7 @@ int main() if( i->vertex()->has_infinite_time() ) { - boost::optional op= + std::optional op= builder.Construct_offset_point(offset , i); if(!op) continue; q=*op; diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h index 1c0c422aa365..0dced9ac3f5f 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h @@ -154,7 +154,7 @@ typedef Traits::Point_2 Point_2; /*! constructs the builder class. */ -Straight_skeleton_builder_2(boost::optional max_time = boost::none, +Straight_skeleton_builder_2(std::optional max_time = std::nullopt, const Traits& traits = Traits(), const Visitor& visitor = Visitor()); diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/compute_outer_frame_margin.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/compute_outer_frame_margin.h index 050c6dfba90b..7db792ad14ec 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/compute_outer_frame_margin.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/compute_outer_frame_margin.h @@ -47,7 +47,7 @@ the kernel in which the type `InputIterator::value_type` is defined. \sa `CGAL::Polygon_offset_builder_traits_2` */ template -boost::optional< typename Traits::FT > +std::optional< typename Traits::FT > compute_outer_frame_margin( InputIterator first, InputIterator beyond, typename Traits::FT offset, const Traits& traits = Default_traits ); diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h index cc2cf00a120a..2f65f3507bde 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h @@ -33,7 +33,7 @@ typedef unspecified_type Compare_offset_against_event_time_2; /*! A construction object type. -Must provide `boost::optional operator()(const FT& t, const Segment_2& e0, Segment_2_with_ID const& e1, const Trisegment_2_ptr& et) const`, +Must provide `std::optional operator()(const FT& t, const Segment_2& e0, Segment_2_with_ID const& e1, const Trisegment_2_ptr& et) const`, which constructs the point of intersection of the lines obtained by offsetting the oriented lines given by `e0` and `e0` an Euclidean distance `t`. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h index f4fd0166ebbb..4da7ab2118fa 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h @@ -62,7 +62,7 @@ typedef boost::intrusive_ptr Trisegment_2_ptr; /*! A predicate object type. -Must provide `bool operator()( const Trisegment_2_ptr& tri_segment, boost::optional max_time ) const`, +Must provide `bool operator()( const Trisegment_2_ptr& tri_segment, std::optional max_time ) const`, which determines if, given the three oriented lines defined by the three input edges, there exists an Euclidean distance `t >= 0` and `t <= max_time` for which the corresponding three offset lines at `t` (parallel lines at an Euclidean distance of `t`) intersect in a single point. @@ -100,7 +100,7 @@ typedef unspecified_type Are_ss_events_simultaneous_2; /*! A construction object type. -Must provide `boost::optional< boost::tuple > operator()( const Trisegment_2_ptr& e)`, +Must provide `std::optional< boost::tuple > operator()( const Trisegment_2_ptr& e)`, which returns the Euclidean distance `t >= 0` and the intersection point at which the corresponding three offset lines at `t` intersect if they do. diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp index 52e405a4dd31..71e66194c6c5 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp @@ -66,7 +66,7 @@ int main() // First we need to determine the proper separation between the polygon and the frame. // We use this helper function provided in the package. - boost::optional margin = CGAL::compute_outer_frame_margin(star.begin(),star.end(),offset); + std::optional margin = CGAL::compute_outer_frame_margin(star.begin(),star.end(),offset); // Proceed only if the margin was computed (an extremely sharp corner might cause overflow) if ( margin ) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp index d2da4691924c..18b4e900b57e 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp @@ -31,7 +31,7 @@ exterior_offset_of_disjoint_polygons_with_holes(double lOffset, const std::vecto outer_vertices.insert(outer_vertices.end(), pwh.outer_boundary().container().begin(), pwh.outer_boundary().container().end()); - boost::optional margin = compute_outer_frame_margin(outer_vertices.begin(), + std::optional margin = compute_outer_frame_margin(outer_vertices.begin(), outer_vertices.end(), lOffset); diff --git a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h index 3ddac56aa28d..2eae95de48a5 100644 --- a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include @@ -69,7 +69,7 @@ public : typedef typename Traits::FT FT ; typedef typename Traits::Point_2 Point_2 ; - typedef boost::optional OptionalPoint_2 ; + typedef std::optional OptionalPoint_2 ; typedef std::shared_ptr ContainerPtr ; @@ -149,7 +149,7 @@ public : return r ; } public: - boost::optional Construct_offset_point( FT aT, Halfedge_const_handle aBisector ) const + std::optional Construct_offset_point( FT aT, Halfedge_const_handle aBisector ) const { CGAL_assertion(aBisector->is_bisector()); CGAL_assertion(handle_assigned(aBisector->opposite())); diff --git a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_traits_2.h b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_traits_2.h index 558a0a6fccba..d8d12c903201 100644 --- a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_traits_2.h +++ b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_traits_2.h @@ -18,7 +18,7 @@ #include #include -#include +#include namespace CGAL { @@ -51,7 +51,7 @@ struct Construct_offset_point_2 : Functor_base_2 typedef typename Base::Segment_2_with_ID Segment_2_with_ID ; typedef typename Base::Trisegment_2_ptr Trisegment_2_ptr ; - typedef boost::optional result_type ; + typedef std::optional result_type ; result_type operator() ( FT const& aT @@ -60,7 +60,7 @@ struct Construct_offset_point_2 : Functor_base_2 , Trisegment_2_ptr const& aNode ) const { - typedef boost::optional< Line_2 > Optional_line; + typedef std::optional< Line_2 > Optional_line; No_cache lCoeff_cache; result_type p = construct_offset_pointC2(aT,aE0,aE1,aNode,lCoeff_cache); diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_offset_builder_2_impl.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_offset_builder_2_impl.h index 95fe522f3b33..471ed51ffacd 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_offset_builder_2_impl.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_offset_builder_2_impl.h @@ -312,7 +312,7 @@ OutputIterator Polygon_offset_builder_2::construct_offset_co mVisitor.on_construction_started(aTime); - mLastPoint = boost::none ; + mLastPoint = std::nullopt ; ResetBisectorData(); diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h index 8a2ad91ab869..2d2741edde48 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_2_impl.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_2_impl.h index f36c3d6d1791..47da401bc326 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_2_impl.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_2_impl.h @@ -32,7 +32,7 @@ namespace CGAL { template -Straight_skeleton_builder_2::Straight_skeleton_builder_2 ( boost::optional aMaxTime, Traits const& aTraits, Visitor const& aVisitor ) +Straight_skeleton_builder_2::Straight_skeleton_builder_2 ( std::optional aMaxTime, Traits const& aTraits, Visitor const& aVisitor ) : mTraits(aTraits) ,mVisitor(aVisitor) diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h index 7744f44d3773..519085bf934a 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -42,7 +42,7 @@ namespace CGAL { namespace CGAL_SS_i { template -T const& validate ( boost::optional const& o ) +T const& validate ( std::optional const& o ) { if ( !o ) throw std::overflow_error("Arithmetic overflow"); @@ -57,17 +57,17 @@ NT const& validate( NT const& n ) return n ; } -// boost::make_optional is provided in Boost >= 1.34, but not before, so we define our own versions here. +// std::make_optional is provided in Boost >= 1.34, but not before, so we define our own versions here. template -boost::optional cgal_make_optional( T const& v ) +std::optional cgal_make_optional( T const& v ) { - return boost::optional(v) ; + return std::optional(v) ; } template -boost::optional cgal_make_optional( bool cond, T const& v ) +std::optional cgal_make_optional( bool cond, T const& v ) { - return cond ? boost::optional(v) : boost::optional() ; + return cond ? std::optional(v) : std::optional() ; } template @@ -210,7 +210,7 @@ template struct FPU_checker; template -struct FPU_checker > > +struct FPU_checker > > { static bool is_valid() { @@ -220,7 +220,7 @@ struct FPU_checker > > }; template -struct FPU_checker > > +struct FPU_checker > > { static bool is_valid() { @@ -269,10 +269,10 @@ struct Info_cache }; template -using Time_cache = Info_cache< boost::optional< CGAL_SS_i::Rational< typename K::FT > > > ; +using Time_cache = Info_cache< std::optional< CGAL_SS_i::Rational< typename K::FT > > > ; template -using Coeff_cache = Info_cache< boost::optional< Line_2 > > ; +using Coeff_cache = Info_cache< std::optional< Line_2 > > ; template struct Functor_base_2 @@ -315,17 +315,17 @@ struct SS_converter : Converter typedef boost::tuple Source_time_and_point_2 ; typedef boost::tuple Target_time_and_point_2 ; - typedef boost::optional Source_opt_FT ; - typedef boost::optional Target_opt_FT ; + typedef std::optional Source_opt_FT ; + typedef std::optional Target_opt_FT ; - typedef boost::optional Source_opt_point_2 ; - typedef boost::optional Target_opt_point_2 ; + typedef std::optional Source_opt_point_2 ; + typedef std::optional Target_opt_point_2 ; - typedef boost::optional Source_opt_time_and_point_2 ; - typedef boost::optional Target_opt_time_and_point_2 ; + typedef std::optional Source_opt_time_and_point_2 ; + typedef std::optional Target_opt_time_and_point_2 ; - typedef boost::optional Source_opt_segment_2 ; - typedef boost::optional Target_opt_segment_2 ; + typedef std::optional Source_opt_segment_2 ; + typedef std::optional Target_opt_segment_2 ; typedef typename Source_trisegment_2::Self_ptr Source_trisegment_2_ptr ; typedef typename Target_trisegment_2::Self_ptr Target_trisegment_2_ptr ; diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/debug.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/debug.h index 72887141335c..b54af3973aa5 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/debug.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/debug.h @@ -42,11 +42,11 @@ bool sEnableTrace = true ; Straight_skeleton_external_trace(s); \ } -#include +#include #include template -inline std::string o2str( boost::optional const& o ) +inline std::string o2str( std::optional const& o ) { std::ostringstream ss ; ss << std::setprecision(19) ; if ( o ) diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h index c7e3f77fbd7b..6fcb719b7956 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h @@ -218,7 +218,7 @@ private : public: - Straight_skeleton_builder_2 ( boost::optional aMaxTime = boost::none, Traits const& = Traits(), Visitor const& aVisitor = Visitor() ) ; + Straight_skeleton_builder_2 ( std::optional aMaxTime = std::nullopt, Traits const& = Traits(), Visitor const& aVisitor = Visitor() ) ; SSkelPtr construct_skeleton( bool aNull_if_failed = true ) ; @@ -1011,7 +1011,7 @@ private : boost::tuple ConstructEventTimeAndPoint( Trisegment_2_ptr const& aS ) const { - boost::optional< boost::tuple > r = Construct_ss_event_time_and_point_2(mTraits)(aS); + std::optional< boost::tuple > r = Construct_ss_event_time_and_point_2(mTraits)(aS); CGAL_postcondition_msg(!!r, "Unable to compute skeleton node coordinates"); return *r ; } @@ -1179,7 +1179,7 @@ private : int mEventID ; int mStepID ; - boost::optional mMaxTime ; + std::optional mMaxTime ; PQ mPQ ; diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h index a2537158295a..22da0b8fe358 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -69,7 +69,7 @@ struct Do_ss_event_exist_2 : Functor_base_2 : mTime_cache(aTime_cache), mCoeff_cache(aCoeff_cache) {} - Uncertain operator() ( Trisegment_2_ptr const& aTrisegment, boost::optional aMaxTime ) const + Uncertain operator() ( Trisegment_2_ptr const& aTrisegment, std::optional aMaxTime ) const { Uncertain rResult = exist_offset_lines_isec2(aTrisegment,aMaxTime,mTime_cache,mCoeff_cache) ; @@ -276,7 +276,7 @@ struct Construct_ss_event_time_and_point_2 : Functor_base_2 typedef boost::tuple rtype ; - typedef boost::optional result_type ; + typedef std::optional result_type ; Construct_ss_event_time_and_point_2(Time_cache& aTime_cache, Coeff_cache& aCoeff_cache) : mTime_cache(aTime_cache), mCoeff_cache(aCoeff_cache) @@ -289,13 +289,13 @@ struct Construct_ss_event_time_and_point_2 : Functor_base_2 FT t(0) ; Point_2 i = ORIGIN ; - boost::optional< Rational > ot = compute_offset_lines_isec_timeC2(aTrisegment,mTime_cache,mCoeff_cache); + std::optional< Rational > ot = compute_offset_lines_isec_timeC2(aTrisegment,mTime_cache,mCoeff_cache); if ( !!ot && certainly( CGAL_NTS certified_is_not_zero(ot->d()) ) ) { t = ot->n() / ot->d(); - boost::optional oi = construct_offset_lines_isecC2(aTrisegment,mCoeff_cache); + std::optional oi = construct_offset_lines_isecC2(aTrisegment,mCoeff_cache); if ( oi ) { i = *oi ; @@ -509,7 +509,7 @@ class Straight_skeleton_builder_traits_2_impltrisegment() ; - boost::optional > lOptTime = + std::optional > lOptTime = CGAL_SS_i::compute_offset_lines_isec_timeC2(tri, mTime_cache, mCoeff_cache); if ( lOptTime && lOptTime->to_nt() > *mFilteringBound ) @@ -542,7 +542,7 @@ class Straight_skeleton_builder_traits_2_implis_contour() ) return ; @@ -556,8 +556,8 @@ class Straight_skeleton_builder_traits_2_implpoint(), lNext->point()); // @todo? These are not input segments, but it might still worth caching (just gotta assign them an ID) - boost::optional< Line_2 > l1 = CGAL_SS_i::compute_normalized_line_ceoffC2(s1); - boost::optional< Line_2 > l2 = CGAL_SS_i::compute_normalized_line_ceoffC2(s2); + std::optional< Line_2 > l1 = CGAL_SS_i::compute_normalized_line_ceoffC2(s1); + std::optional< Line_2 > l2 = CGAL_SS_i::compute_normalized_line_ceoffC2(s2); Vector_2 lV1(l1->a(), l1->b()) ; Vector_2 lV2(l2->a(), l2->b()) ; @@ -581,7 +581,7 @@ class Straight_skeleton_builder_traits_2_impl lh = CGAL_SS_i::compute_normalized_line_ceoffC2(s_h); + std::optional< Line_2 > lh = CGAL_SS_i::compute_normalized_line_ceoffC2(s_h); typename K::FT lBound = ( - lh->c() - lh->a()*aNode->point().x() - lh->b()*aNode->point().y() ) / ( lh->a()*lV12.x() + lh->b()*lV12.y() ); @@ -598,7 +598,7 @@ class Straight_skeleton_builder_traits_2_impl mTime_cache ; mutable CGAL_SS_i::Coeff_cache mCoeff_cache ; - mutable boost::optional< typename K::FT > mFilteringBound ; + mutable std::optional< typename K::FT > mFilteringBound ; } ; template @@ -817,7 +817,7 @@ class Straight_skeleton_builder_traits_2_impl > lOptTime = + std::optional > lOptTime = CGAL_SS_i::compute_offset_lines_isec_timeC2( tri, mApproximate_traits.mTime_cache, mApproximate_traits.mCoeff_cache); @@ -840,7 +840,7 @@ class Straight_skeleton_builder_traits_2_implis_contour() ) return ; @@ -860,8 +860,8 @@ class Straight_skeleton_builder_traits_2_implpoint())); // @todo? These are not input segments, but it might still worth caching (just gotta assign them an ID) - boost::optional< Target_Line_2 > l1 = CGAL_SS_i::compute_normalized_line_ceoffC2(s1); - boost::optional< Target_Line_2 > l2 = CGAL_SS_i::compute_normalized_line_ceoffC2(s2); + std::optional< Target_Line_2 > l1 = CGAL_SS_i::compute_normalized_line_ceoffC2(s1); + std::optional< Target_Line_2 > l2 = CGAL_SS_i::compute_normalized_line_ceoffC2(s2); Target_Vector_2 lV1(l1->a(), l1->b()) ; Target_Vector_2 lV2(l2->a(), l2->b()) ; @@ -887,7 +887,7 @@ class Straight_skeleton_builder_traits_2_impl lh = CGAL_SS_i::compute_normalized_line_ceoffC2(s_h); + std::optional< Target_Line_2 > lh = CGAL_SS_i::compute_normalized_line_ceoffC2(s_h); typename FK::FT lBound = ( - lh->c() - lh->a()*laP.x() - lh->b()*laP.y() ) / ( lh->a()*lV12.x() + lh->b()*lV12.y() ); diff --git a/Straight_skeleton_2/include/CGAL/compute_outer_frame_margin.h b/Straight_skeleton_2/include/CGAL/compute_outer_frame_margin.h index dc80fb743136..564bc5adbe7e 100644 --- a/Straight_skeleton_2/include/CGAL/compute_outer_frame_margin.h +++ b/Straight_skeleton_2/include/CGAL/compute_outer_frame_margin.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include @@ -25,7 +25,7 @@ namespace CGAL { template -boost::optional< typename Traits::FT > compute_outer_frame_margin ( ForwardPointIterator aBegin +std::optional< typename Traits::FT > compute_outer_frame_margin ( ForwardPointIterator aBegin , ForwardPointIterator aEnd , typename Traits::FT aOffset , Traits const& aTraits @@ -44,7 +44,7 @@ boost::optional< typename Traits::FT > compute_outer_frame_margin ( ForwardPoint typename Kernel::Compute_squared_distance_2 squared_distance = kernel.compute_squared_distance_2_object(); typename Kernel::Construct_segment_2 construct_segment = kernel.construct_segment_2_object(); - typedef boost::optional OptionalPoint_2 ; + typedef std::optional OptionalPoint_2 ; FT lMaxSDist(0) ; @@ -89,15 +89,15 @@ boost::optional< typename Traits::FT > compute_outer_frame_margin ( ForwardPoint { FT lDist = CGAL_SS_i::inexact_sqrt(lMaxSDist) ; - return boost::optional( lDist + ( aOffset * FT(1.05) ) ) ; // Add a %5 gap + return std::optional( lDist + ( aOffset * FT(1.05) ) ) ; // Add a %5 gap } else - return boost::optional(); + return std::optional(); } template -boost::optional compute_outer_frame_margin ( ForwardPointIterator aBegin, ForwardPointIterator aEnd, +std::optional compute_outer_frame_margin ( ForwardPointIterator aBegin, ForwardPointIterator aEnd, FT aOffset ) { typedef typename std::iterator_traits::value_type Point_2 ; diff --git a/Straight_skeleton_2/include/CGAL/constructions/Polygon_offset_cons_ftC2.h b/Straight_skeleton_2/include/CGAL/constructions/Polygon_offset_cons_ftC2.h index 03b25b3352d4..5b6e79f6f140 100644 --- a/Straight_skeleton_2/include/CGAL/constructions/Polygon_offset_cons_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/constructions/Polygon_offset_cons_ftC2.h @@ -15,7 +15,7 @@ #include -#include +#include #include namespace CGAL { @@ -32,7 +32,7 @@ namespace CGAL_SS_i { // POSTCONDITION: In case of overflow an empty optional is returned. // template -boost::optional< Point_2 > construct_offset_pointC2 ( typename K::FT const& t, +std::optional< Point_2 > construct_offset_pointC2 ( typename K::FT const& t, Segment_2_with_ID const& e0, Segment_2_with_ID const& e1, boost::intrusive_ptr< Trisegment_2 > > const& tri, @@ -43,8 +43,8 @@ boost::optional< Point_2 > construct_offset_pointC2 ( typename K::FT const& t typedef Point_2 Point_2 ; typedef Line_2 Line_2 ; - typedef boost::optional Optional_point_2 ; - typedef boost::optional Optional_line_2 ; + typedef std::optional Optional_point_2 ; + typedef std::optional Optional_line_2 ; FT x(0.0),y(0.0) ; diff --git a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h index 1076f7ae680b..414de78d51b0 100644 --- a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h @@ -19,7 +19,7 @@ #include #include -#include +#include #include @@ -112,7 +112,7 @@ inline Lazy_exact_nt inexact_sqrt( Lazy_exact_nt const& lz) // POSTCONDITION: [a,b] is the leftward normal _unit_ (a²+b²=1) vector. // POSTCONDITION: In case of overflow, an empty optional<> is returned. template -boost::optional< Line_2 > compute_normalized_line_ceoffC2( Segment_2 const& e ) +std::optional< Line_2 > compute_normalized_line_ceoffC2( Segment_2 const& e ) { bool finite = true ; @@ -201,13 +201,13 @@ boost::optional< Line_2 > compute_normalized_line_ceoffC2( Segment_2 const } template -boost::optional< Line_2 > compute_normalized_line_ceoffC2( Segment_2_with_ID const& e, +std::optional< Line_2 > compute_normalized_line_ceoffC2( Segment_2_with_ID const& e, CoeffCache& aCoeff_cache ) { if ( aCoeff_cache.IsCached(e.mID) ) return aCoeff_cache.Get(e.mID) ; - boost::optional< Line_2 > rRes = compute_normalized_line_ceoffC2 ( static_cast const&>(e) ) ; + std::optional< Line_2 > rRes = compute_normalized_line_ceoffC2 ( static_cast const&>(e) ) ; aCoeff_cache.Set(e.mID, rRes) ; @@ -266,7 +266,7 @@ construct_trisegment ( Segment_2_with_ID const& e0, // NOTE: The segments (e0,e1,e2) are stored in the argument as the trisegment st.event() // template -boost::optional< Rational< typename K::FT> > +std::optional< Rational< typename K::FT> > compute_normal_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache ) { @@ -274,7 +274,7 @@ compute_normal_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 Line_2 ; - typedef boost::optional Optional_line_2 ; + typedef std::optional Optional_line_2 ; CGAL_STSKEL_TRAITS_TRACE("Computing normal offset lines isec time for: " << tri ) ; @@ -332,7 +332,7 @@ compute_normal_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Point_2 > compute_oriented_midpoint ( Segment_2_with_ID const& e0, +std::optional< Point_2 > compute_oriented_midpoint ( Segment_2_with_ID const& e0, Segment_2_with_ID const& e1 ) { bool ok = false ; @@ -391,12 +391,12 @@ boost::optional< Point_2 > compute_oriented_midpoint ( Segment_2_with_ID c // If you request the point of such degenerate pseudo seed the oriented midpoint between e0 and e2 is returned. // template -boost::optional< Point_2 > +std::optional< Point_2 > compute_seed_pointC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, typename Trisegment_2 >::SEED_ID sid, CoeffCache& aCoeff_cache) { - boost::optional< Point_2 > p ; + std::optional< Point_2 > p ; typedef Trisegment_2 > Trisegment_2 ; @@ -430,7 +430,7 @@ compute_seed_pointC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Point_2 > +std::optional< Point_2 > compute_degenerate_seed_pointC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache ) { @@ -448,7 +448,7 @@ compute_degenerate_seed_pointC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Rational< typename K::FT> > +std::optional< Rational< typename K::FT> > compute_degenerate_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache ) { @@ -457,8 +457,8 @@ compute_degenerate_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 typedef Point_2 Point_2 ; typedef Line_2 Line_2 ; - typedef boost::optional Optional_point_2 ; - typedef boost::optional Optional_line_2 ; + typedef std::optional Optional_point_2 ; + typedef std::optional Optional_line_2 ; CGAL_STSKEL_TRAITS_TRACE("Computing degenerate offset lines isec time for: " << tri ) ; @@ -540,7 +540,7 @@ compute_degenerate_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 // Calls the appropriate function depending on the collinearity of the edges. // template -boost::optional< Rational< typename K::FT > > +std::optional< Rational< typename K::FT > > compute_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, TimeCache& aTime_cache, CoeffCache& aCoeff_cache) @@ -550,7 +550,7 @@ compute_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2collinearity() != TRISEGMENT_COLLINEARITY_ALL ) ; - boost::optional< Rational< typename K::FT > > rRes = + std::optional< Rational< typename K::FT > > rRes = tri->collinearity() == TRISEGMENT_COLLINEARITY_NONE ? compute_normal_offset_lines_isec_timeC2 (tri, aCoeff_cache) : compute_degenerate_offset_lines_isec_timeC2(tri, aCoeff_cache); @@ -571,7 +571,7 @@ compute_offset_lines_isec_timeC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Point_2 > +std::optional< Point_2 > construct_normal_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache) { @@ -579,7 +579,7 @@ construct_normal_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 Line_2 ; - typedef boost::optional Optional_line_2 ; + typedef std::optional Optional_line_2 ; CGAL_STSKEL_TRAITS_TRACE("Computing normal offset lines isec point for: " << tri ) ; @@ -632,7 +632,7 @@ construct_normal_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Point_2 > +std::optional< Point_2 > construct_degenerate_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache) { @@ -641,8 +641,8 @@ construct_degenerate_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 Point_2 ; typedef Line_2 Line_2 ; - typedef boost::optional Optional_point_2 ; - typedef boost::optional Optional_line_2 ; + typedef std::optional Optional_point_2 ; + typedef std::optional Optional_line_2 ; CGAL_STSKEL_TRAITS_TRACE("Computing degenerate offset lines isec point for: " << tri ) ; @@ -694,7 +694,7 @@ construct_degenerate_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 -boost::optional< Point_2 > +std::optional< Point_2 > construct_offset_lines_isecC2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, CoeffCache& aCoeff_cache) { diff --git a/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h b/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h index 9a8a97012cb6..e0bfb7bdce01 100644 --- a/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h +++ b/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -126,7 +126,7 @@ create_partial_interior_straight_skeleton_2 ( FT const& aMaxTime Cartesian_converter conv ; typename InputKernel::FT lMaxTime = aMaxTime; - boost::optional lOptMaxTime(conv(lMaxTime)) ; + std::optional lOptMaxTime(conv(lMaxTime)) ; SsBuilder ssb( lOptMaxTime ) ; @@ -160,7 +160,7 @@ create_partial_exterior_straight_skeleton_2 ( FT const& aMaxOffset // @todo This likely should be done in the kernel K rather than the input kernel (i.e. the same // converter stuff that is done in `create_partial_exterior_straight_skeleton_2`?). - boost::optional margin = compute_outer_frame_margin(aVerticesBegin, + std::optional margin = compute_outer_frame_margin(aVerticesBegin, aVerticesEnd, lOffset); diff --git a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h index d88fb85ac505..967c89f1bf01 100644 --- a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -159,7 +159,7 @@ create_exterior_straight_skeleton_2 ( FT const& aMaxOffset // @todo This likely should be done in the kernel K rather than the input kernel (i.e. the same // converter stuff that is done in `create_partial_exterior_straight_skeleton_2`?). - boost::optional margin = compute_outer_frame_margin( aVerticesBegin, + std::optional margin = compute_outer_frame_margin( aVerticesBegin, aVerticesEnd, lOffset ); diff --git a/Straight_skeleton_2/include/CGAL/predicates/Polygon_offset_pred_ftC2.h b/Straight_skeleton_2/include/CGAL/predicates/Polygon_offset_pred_ftC2.h index 88edb2da5fdb..51488b838735 100644 --- a/Straight_skeleton_2/include/CGAL/predicates/Polygon_offset_pred_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/predicates/Polygon_offset_pred_ftC2.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -38,12 +38,12 @@ compare_offset_against_isec_timeC2 ( typename K::FT const& t, typedef Rational Rational ; typedef Quotient Quotient ; - typedef boost::optional Optional_rational ; + typedef std::optional Optional_rational ; Uncertain rResult = Uncertain::indeterminate(); - No_cache > > lTime_cache ; - No_cache > > lCoeff_cache ; + No_cache > > lTime_cache ; + No_cache > > lCoeff_cache ; Optional_rational et_ = compute_offset_lines_isec_timeC2(tri, lTime_cache, lCoeff_cache); if ( et_ ) diff --git a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h index 16ee90a800ff..c3bdaedf2f33 100644 --- a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include @@ -176,13 +176,13 @@ Uncertain certified_trisegment_collinearity ( Segment_2 // template Uncertain exist_offset_lines_isec2 ( boost::intrusive_ptr< Trisegment_2 > > const& tri, - boost::optional const& aMaxTime, + std::optional const& aMaxTime, TimeCache& aTime_cache, CoeffCache& aCoeff_cache ) { typedef Rational Rational ; - typedef boost::optional Optional_rational ; + typedef std::optional Optional_rational ; typedef Quotient Quotient ; Uncertain rResult = Uncertain::indeterminate(); @@ -247,7 +247,7 @@ compare_offset_lines_isec_timesC2 ( boost::intrusive_ptr< Trisegment_2 Rational ; typedef Quotient Quotient ; - typedef boost::optional Optional_rational ; + typedef std::optional Optional_rational ; Uncertain rResult = Uncertain::indeterminate(); @@ -301,7 +301,7 @@ Uncertain compare_isec_anglesC2 ( Vector_2 const& aBV1 // Returns true if the point aP is on the positive side of the line supporting the edge // template -Uncertain is_edge_facing_pointC2 ( boost::optional< Point_2 > const& aP, +Uncertain is_edge_facing_pointC2 ( std::optional< Point_2 > const& aP, Segment_2_with_ID const& aEdge ) { typedef typename K::FT FT ; @@ -527,8 +527,8 @@ Uncertain are_events_simultaneousC2 ( boost::intrusive_ptr< Trisegment_2 Rational ; typedef Quotient Quotient ; - typedef boost::optional Optional_rational ; - typedef boost::optional Optional_point_2 ; + typedef std::optional Optional_rational ; + typedef std::optional Optional_point_2 ; Uncertain rResult = Uncertain::indeterminate(); diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_aux.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_aux.cpp index 9569d50c9f57..3726a9500cd5 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_aux.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_traits_aux.cpp @@ -36,7 +36,7 @@ void report( int idx, bool ok, std::string const& info = std::string("") ) bool exist_event( Traits const& aTraits, triple const& aTriple ) { - boost::optional lMaxTime ; + std::optional lMaxTime ; return CGAL::Do_ss_event_exist_2(aTraits)(aTriple.trisegment(), lMaxTime ); } diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls.cpp index 709158ffbc2f..186d7408b430 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls.cpp @@ -315,7 +315,7 @@ IRegionPtr load_region( string file, int aShift, int& rStatus ) return rRegion ; } -void update_bbox ( IRegionPtr const& aRegion, boost::optional& rBBox ) +void update_bbox ( IRegionPtr const& aRegion, std::optional& rBBox ) { if ( aRegion ) { @@ -396,7 +396,7 @@ string change_extension ( string aFilename, string aNewExt ) void dump_to_eps ( TestCase const& aCase ) { - boost::optional lBBox ; + std::optional lBBox ; update_bbox(aCase.Inner.Input, lBBox ) ; update_bbox(aCase.Outer.Input, lBBox ) ; @@ -577,7 +577,7 @@ IPolygonPtr create_outer_frame ( IPolygon const& aOuter ) IFT lOffset = s * 0.3 ; - boost::optional lOptMargin = compute_outer_frame_margin(aOuter.begin(),aOuter.end(),lOffset) ; + std::optional lOptMargin = compute_outer_frame_margin(aOuter.begin(),aOuter.end(),lOffset) ; if ( lOptMargin ) { @@ -667,7 +667,7 @@ bool is_skeleton_valid( IRegion const& aRegion, ISls const& aSkeleton, bool is_p } -int create_skeleton ( Zone& rZone, boost::optional const& aMaxTime = boost::optional() ) +int create_skeleton ( Zone& rZone, std::optional const& aMaxTime = std::optional() ) { int rStatus = cUnknown ; @@ -742,7 +742,7 @@ int test_zone ( Zone& rZone ) if ( sMaxTime > 0 ) { - boost::optional lMaxTime = static_cast(sMaxTime) ; + std::optional lMaxTime = static_cast(sMaxTime) ; rStatus = create_skeleton(rZone,lMaxTime) ; } else diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp index db7ec3b16224..3480435ec814 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp @@ -517,7 +517,7 @@ void test_offset_multiple_CCs() std::vector input(pts, pts+12); const FT offset = 50; - boost::optional margin = CGAL::compute_outer_frame_margin(input.begin(), input.end(), offset); + std::optional margin = CGAL::compute_outer_frame_margin(input.begin(), input.end(), offset); assert(margin); // Get the bbox of the polygon diff --git a/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp b/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp index 6fe14b01e7a5..60174dc2fc4d 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp @@ -16,8 +16,8 @@ typedef CGAL::Surface_mesh Mesh; typedef CGAL::AABB_face_graph_triangle_primitive Primitive; typedef CGAL::AABB_traits Traits; typedef CGAL::AABB_tree Tree; -typedef boost::optional< Tree::Intersection_and_primitive_id::Type > Segment_intersection; -typedef boost::optional< Tree::Intersection_and_primitive_id::Type > Plane_intersection; +typedef std::optional< Tree::Intersection_and_primitive_id::Type > Segment_intersection; +typedef std::optional< Tree::Intersection_and_primitive_id::Type > Plane_intersection; typedef Tree::Primitive_id Primitive_id; int main() diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 566aec602d73..71608d8d80e7 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -581,9 +581,9 @@ class Variational_shape_approximation { return num_teleported; // find the best merge pair - boost::optional< std::pair > best_proxies = + std::optional< std::pair > best_proxies = find_best_merge(!no_threshold_test); - if (best_proxies==boost::none) + if (best_proxies==std::nullopt) return num_teleported; if (px_worst == best_proxies->first || px_worst == best_proxies->second) return num_teleported; @@ -662,7 +662,7 @@ class Variational_shape_approximation { * it is returned only if the error change after the merge is lower than the half of the maximum proxy error. * @return if the best merge pair is found the optional returned contains the proxy indices, and is empty otherwise. */ - boost::optional< std::pair > + std::optional< std::pair > find_best_merge(const bool use_threshold_test) { typedef std::pair Proxy_pair; typedef std::set Pair_set; @@ -705,7 +705,7 @@ class Variational_shape_approximation { } if (merged_set.empty()) - return boost::none; + return std::nullopt; // test if merge worth it if (use_threshold_test) { @@ -715,7 +715,7 @@ class Variational_shape_approximation { max_error = m_proxies[i].err; } if (min_error_change > max_error / FT(2.0)) - return boost::none; + return std::nullopt; } return std::make_pair(px0, px1); diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp index 40e6885e5ec0..4e6717374899 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_correctness_test.cpp @@ -69,8 +69,8 @@ bool test_shape(const Mesh &mesh, const std::size_t target_num_proxies) approx.run(num_iterations); // eliminate redundant area (local minima) by merging - boost::optional > best_pair = boost::none; - while ((best_pair = approx.find_best_merge(true)) != boost::none) { + std::optional > best_pair = std::nullopt; + while ((best_pair = approx.find_best_merge(true)) != std::nullopt) { approx.merge(best_pair->first, best_pair->second); approx.run(num_iterations); } diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp index 2ea7139f548d..13a43f965574 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_teleportation_test.cpp @@ -153,7 +153,7 @@ int main() } // force teleportation test - if ( approx.find_best_merge(true) != boost::none ) + if ( approx.find_best_merge(true) != std::nullopt ) { std::cout << "Failed: should be no possible merge with test." << std::endl; return EXIT_FAILURE; diff --git a/Surface_mesh_deformation/test/Surface_mesh_deformation/Surface_mesh_deformation_test_commons.h b/Surface_mesh_deformation/test/Surface_mesh_deformation/Surface_mesh_deformation_test_commons.h index a10cdd1f09c1..bdc14cee74e7 100644 --- a/Surface_mesh_deformation/test/Surface_mesh_deformation/Surface_mesh_deformation_test_commons.h +++ b/Surface_mesh_deformation/test/Surface_mesh_deformation/Surface_mesh_deformation_test_commons.h @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traversal_traits.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traversal_traits.h index 18a7c1f2fa76..13216a31fdcd 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traversal_traits.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/AABB_traversal_traits.h @@ -54,7 +54,7 @@ class Listing_intersection_traits_ray_or_segment_triangle if ( GeomTraits().do_intersect_3_object()(query, primitive.datum(m_traits.shared_data())) ) { - boost::optional intersection + std::optional intersection = m_traits.intersection_object()(query, primitive); if(intersection) { *m_out_it++ = *intersection; diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/Filters.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/Filters.h index 2f361642acfc..7afb29eecf20 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/Filters.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/Filters.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include @@ -63,8 +63,8 @@ class Bilateral_filtering void operator()(const Polyhedron& mesh, std::size_t window_size, ValuePropertyMap values, - boost::optional spatial_parameter = boost::optional(), - boost::optional range_parameter = boost::optional() + std::optional spatial_parameter = std::optional(), + std::optional range_parameter = std::optional() ) const { typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::face_iterator face_iterator; diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h index 9ccde9421a5e..f221ee28c45b 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h @@ -26,7 +26,7 @@ #include #include -#include +#include #define CGAL_NUMBER_OF_MAD 1.5 @@ -200,7 +200,7 @@ class SDF_calculation disk_sampler(number_of_rays, std::back_inserter(disk_samples)); for( ; facet_begin != facet_end; ++facet_begin) { - boost::optional sdf_value = calculate_sdf_value_of_facet(*facet_begin, + std::optional sdf_value = calculate_sdf_value_of_facet(*facet_begin, cone_angle, true, disk_samples); if(sdf_value) { @@ -233,7 +233,7 @@ class SDF_calculation * \note: normal should have unit length */ template - boost::optional calculate_sdf_value_of_point( + std::optional calculate_sdf_value_of_point( Point center, Vector normal, SkipPrimitiveFunctor skip, @@ -250,7 +250,7 @@ class SDF_calculation * Overload for taking DiskSampling as template parameter */ template - boost::optional calculate_sdf_value_of_point( + std::optional calculate_sdf_value_of_point( Point center, Vector normal, SkipPrimitiveFunctor skip, @@ -270,7 +270,7 @@ class SDF_calculation * Overload for directly taking sampled points from disk as parameter */ template - boost::optional calculate_sdf_value_of_point( + std::optional calculate_sdf_value_of_point( const Point& center, const Vector& normal, SkipPrimitiveFunctor skip, @@ -346,10 +346,10 @@ class SDF_calculation } if(ray_distances.empty()) { - return boost::none; + return std::nullopt; } - return boost::optional(remove_outliers_and_calculate_sdf_value( + return std::optional(remove_outliers_and_calculate_sdf_value( ray_distances)); } @@ -369,7 +369,7 @@ class SDF_calculation * @param samples sampled points from a unit-disk which are corresponds to rays picked from cone * @return calculated SDF value */ - boost::optional calculate_sdf_value_of_facet( + std::optional calculate_sdf_value_of_facet( face_handle facet, double cone_angle, bool accept_if_acute, @@ -379,11 +379,11 @@ class SDF_calculation const Point p2 = get(vertex_point_map,target(next(halfedge(facet,mesh),mesh),mesh)); const Point p3 = get(vertex_point_map,target(prev(halfedge(facet,mesh),mesh),mesh)); const Point center = centroid_functor(p1, p2, p3); - if (collinear_functor(p1, p2, p3)) return boost::none; + if (collinear_functor(p1, p2, p3)) return std::nullopt; Vector normal = normal_functor(p2, p1, p3); normal=scale_functor(normal, FT(1.0/std::sqrt(to_double(normal.squared_length())))); - if (normal!=normal) return boost::none; + if (normal!=normal) return std::nullopt; CGAL::internal::SkipPrimitiveFunctor skip(facet); CGAL::internal::FirstIntersectionVisitor @@ -478,7 +478,7 @@ class SDF_calculation boost::tuple ray_casting( const Ray& query, SkipFunctor s, bool accept_if_acute) const { - const boost::optional< typename Tree::template Intersection_and_primitive_id::Type > + const std::optional< typename Tree::template Intersection_and_primitive_id::Type > min_intersection = tree.first_intersection(query, s); if(!min_intersection) return boost::make_tuple(false, false, 0.0, Primitive_id()); diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h index 652c3457496d..e44cd401304d 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h @@ -152,7 +152,7 @@ class SurfaceMeshShortestPathTraits /*! Function object type. Must provide - `boost::optional< boost::variant< T... > > operator()(A obj1, B obj2)` + `std::optional< boost::variant< T... > > operator()(A obj1, B obj2)` to compute the intersection between `obj1` and `obj2`, where `A` and `B` can be any type amongst `Line_2`, `Ray_2`, `Segment_2`. */ diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h index 0b94bf1d71cd..241c96473501 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h @@ -3049,7 +3049,7 @@ class Surface_mesh_shortest_path typename Traits::Construct_barycentric_coordinates cbc(traits.construct_barycentric_coordinates_object()); typename Traits::Compute_squared_distance_3 csd3(traits.compute_squared_distance_3_object()); typedef typename AABB_face_graph_tree::template Intersection_and_primitive_id::Type Intersection_type; - typedef boost::optional Ray_intersection; + typedef std::optional Ray_intersection; std::vector intersections; diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 5fa7e3c33959..9e62e74917f3 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -46,7 +46,7 @@ class Bounded_distance_placement // Returns the placement computed by `base_placement`, provided the distance between the input // and this placement is smaller than `d`. Otherwise, nothing is returned. - boost::optional operator()(const Edge_profile& profile) const; + std::optional operator()(const Edge_profile& profile) const; // @} }; diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h index 53cfb706bd68..adc991a675ed 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h @@ -44,8 +44,8 @@ class Bounded_normal_change_filter { returns the placement, if it does not get filtered by the wrapped filter and if no triangle in the profile has its normal changed by more than 90 degrees. */ - boost::optional operator()(const Edge_profile& profile, - boost::optional op) const; + std::optional operator()(const Edge_profile& profile, + std::optional op) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h index 8f08e9a071c5..90e68a5320dc 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h @@ -46,7 +46,7 @@ class Bounded_normal_change_placement { Returns the placement computed by `get_placement`, if no triangle in the profile has its normal changed by more than 90 degree. */ - boost::optional operator()(const Edge_profile& profile) const; + std::optional operator()(const Edge_profile& profile) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h index f9b904bfb3f2..814c64f2793b 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h @@ -32,7 +32,7 @@ class Constrained_placement const Get_placement_& get_placement = Get_placement_()); /// @} - boost::optional operator()(const Edge_profile& profile) const + std::optional operator()(const Edge_profile& profile) const }; diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h index 52c7c54dee8f..8c9080554929 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h @@ -36,8 +36,8 @@ class Edge_length_cost The argument `placement` is unused. */ - boost::optional operator()(const Edge_profile& profile, - const boost::optional& placement) const; + std::optional operator()(const Edge_profile& profile, + const std::optional& placement) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h index 36e68f95263b..433a8a64755f 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h @@ -36,9 +36,9 @@ LindstromTurk_cost(const FT factor = FT(0.5)); Returns the cost of collapsing the edge (represented by its profile) considering the new `placement` computed for it. */ -boost::optional +std::optional operator()(const Edge_profile& edge_profile, - const boost::optional& placement) const; + const std::optional& placement) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h index 20ae3890439a..8471efae84df 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h @@ -38,7 +38,7 @@ class LindstromTurk_placement Returns the new position for the remaining vertex after collapsing the edge (represented by its profile). */ - boost::optional + std::optional operator()(const Edge_profile& profile) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h index 2cd81de679e6..11fda0b9f253 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h @@ -36,7 +36,7 @@ class Midpoint_placement the points of the source and target vertices (`profile.p0()` and `profile.p1()`) */ - boost::optional operator()(const Edge_profile& profile) const; + std::optional operator()(const Edge_profile& profile) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h index dadccaa8e4d8..61440bec09e1 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h @@ -50,8 +50,8 @@ class Polyhedral_envelope_filter { returns the placement, if it does not get filtered by the wrapped filter, and if all triangles in the profile are inside the polyhedral envelope. */ - boost::optional operator()(const Edge_profile& profile, - boost::optional op) const; + std::optional operator()(const Edge_profile& profile, + std::optional op) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/EdgeCollapseSimplificationVisitor.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/EdgeCollapseSimplificationVisitor.h index 264f56319c71..0bbb8e880785 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/EdgeCollapseSimplificationVisitor.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/EdgeCollapseSimplificationVisitor.h @@ -47,7 +47,7 @@ for each edge collected. */ void OnCollected(const Edge_profile& profile, - boost::optional cost); + std::optional cost); /*! Called during the processing phase (when edges are collapsed), @@ -63,7 +63,7 @@ the edge will not be collapsed. */ void OnSelected(const Edge_profile& profile, - boost::optional cost, + std::optional cost, const Edge_profile::edges_size_type initial_edge_count, const Edge_profile::edges_size_type current_edge_count); @@ -76,7 +76,7 @@ the edge will not be collapsed. */ void OnCollapsing(const Edge_profile& profile, - boost::optional placement); + std::optional placement); /*! Called when an edge has been collapsed and replaced by the vertex `vd` diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h index 24a05f636c29..d07a362bb199 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h @@ -5,7 +5,7 @@ The concept `GetCost` describes the requirements for the policy function object which gets the collapse cost of an edge. -The cost returned is a `boost::optional` value (i.e.\ it can be absent). +The cost returned is a `std::optional` value (i.e.\ it can be absent). An absent cost indicates that the edge should not be collapsed. This could be the result of a computational limitation (such as an overflow), or can be intentionally returned to prevent the edge from being collapsed. @@ -31,8 +31,8 @@ class GetCost Computes and returns the cost of collapsing the edge (represented by its profile), using the calculated placement. */ - boost::optional operator()(const Edge_profile& edge_profile, - const boost::optional& placement) const; + std::optional operator()(const Edge_profile& edge_profile, + const std::optional& placement) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h index e576472cb34e..fa9347cdd284 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h @@ -7,7 +7,7 @@ function object
    which gets the collapse placement of an edge, that is, the new position of the vertex that remains after a halfedge-collapse operation. -The placement returned is a `boost::optional` value (i.e., it can +The placement returned is a `std::optional` value (i.e., it can be absent). An absent result indicates that the edge should not be collapsed. This could be the result of a computational limitation (such as an overflow), or can be intentionally returned to prevent the edge from being collapsed. @@ -36,7 +36,7 @@ class GetPlacement Computes and returns the placement, that is, the position of the vertex which replaces the collapsing edge (represented by its profile). */ - boost::optionaloperator()(const Edge_profile& profile) const; + std::optionaloperator()(const Edge_profile& profile) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h index 324c87f45ee7..a2a493e904d0 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h @@ -9,8 +9,8 @@ an edge is taken from the priority queue in order to get collapsed, and neither when the edge is inserted nor when it is updated in the priority queue. -The placement returned is a `boost::optional` value (i.e., it can -be absent). The value `boost::none` indicates that the edge should not be collapsed. +The placement returned is a `std::optional` value (i.e., it can +be absent). The value `std::nullopt` indicates that the edge should not be collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} @@ -33,7 +33,7 @@ class PlacementFilter filters the placement. */ - boost::optional operator()(const Edge_profile& profile, boost::optional placement) const; + std::optional operator()(const Edge_profile& profile, std::optional placement) const; /// @} diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt index 31c3939c9265..4dcf3ccfb12b 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Surface_mesh_simplification.txt @@ -369,7 +369,7 @@ Simple mesh before and after the collapse of edge `v-w` into vertex `w`. While t The class `Surface_mesh_simplification::Bounded_normal_change_filter` checks if a placement would invert the normal of a face around the stars of the two vertices of an edge that is candidate for an edge collapse. It then -rejects this placement by returning `boost::none`. +rejects this placement by returning `std::nullopt`. \note This filter class replaces the usage of the class `Surface_mesh_simplification::Bounded_normal_change_placement`. Using the filter is faster as it is only performed on the edge to be collapsed next, diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_bounded_normal_change.cpp b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_bounded_normal_change.cpp index bc89a3b77aa4..04561d2239cf 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_bounded_normal_change.cpp +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_bounded_normal_change.cpp @@ -19,13 +19,13 @@ namespace SMS = CGAL::Surface_mesh_simplification; struct Dummy_placement { template - boost::optional operator()(const Profile&) const + std::optional operator()(const Profile&) const { - return boost::none; + return std::nullopt; } template - boost::optional operator()(const Profile&, const boost::optional& op) const + std::optional operator()(const Profile&, const std::optional& op) const { return op; } diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_visitor_surface_mesh.cpp b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_visitor_surface_mesh.cpp index 16427c55226b..ec9993b87ddb 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_visitor_surface_mesh.cpp +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_visitor_surface_mesh.cpp @@ -44,7 +44,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base My_visitor(Stats* s) : stats(s) {} // Called during the collecting phase for each edge collected. - void OnCollected(const Profile&, const boost::optional&) + void OnCollected(const Profile&, const std::optional&) { ++(stats->collected); std::cerr << "\rEdges collected: " << stats->collected << std::flush; @@ -53,7 +53,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base // Called during the processing phase for each edge selected. // If cost is absent the edge won't be collapsed. void OnSelected(const Profile&, - boost::optional cost, + std::optional cost, std::size_t initial, std::size_t current) { @@ -69,7 +69,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base // Called during the processing phase for each edge being collapsed. // If placement is absent the edge is left uncollapsed. void OnCollapsing(const Profile&, - boost::optional placement) + std::optional placement) { if(!placement) ++(stats->placement_uncomputable); diff --git a/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h b/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h index 34a14497364e..7cc2858020b3 100644 --- a/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h +++ b/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h @@ -18,7 +18,7 @@ #include #include -#include +#include namespace CGAL { @@ -200,11 +200,11 @@ MatrixC33 adjoint_matrix(const MatrixC33& m) } template -boost::optional< MatrixC33 > inverse_matrix(const MatrixC33& m) +std::optional< MatrixC33 > inverse_matrix(const MatrixC33& m) { typedef typename R::RT RT; typedef MatrixC33 Matrix; - typedef boost::optional result_type; + typedef std::optional result_type; result_type rInverse; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h index 94870fb968cc..87d24f3dd887 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h @@ -46,9 +46,9 @@ struct Edge_collapse_visitor_base void OnStarted(Triangle_mesh&) {} void OnFinished(Triangle_mesh&) {} void OnStopConditionReached(const Profile&) {} - void OnCollected(const Profile&, const boost::optional&) {} - void OnSelected(const Profile&, const boost::optional&, size_type, size_type) {} - void OnCollapsing(const Profile&, const boost::optional&) {} + void OnCollected(const Profile&, const std::optional&) {} + void OnSelected(const Profile&, const std::optional&, size_type, size_type) {} + void OnCollapsing(const Profile&, const std::optional&) {} void OnCollapsed(const Profile&, const vertex_descriptor&) {} void OnNonCollapsable(const Profile&) {} }; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 36f2f855312e..103eec6878ba 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -93,12 +93,12 @@ class Bounded_distance_placement } template - boost::optional + std::optional operator()(const Profile& profile) const { typedef typename Profile::Point Point; - boost::optional op = m_base_placement(profile); + std::optional op = m_base_placement(profile); if(op) { if(m_tree_ptr == nullptr) @@ -121,7 +121,7 @@ class Bounded_distance_placement m_tree_ptr->do_intersect(CGAL::Sphere_3(p, m_sq_threshold_dist))) return op; - return boost::optional(); + return std::optional(); } return op; @@ -153,13 +153,13 @@ class Bounded_distance_placement > { } template - boost::optional + std::optional operator()(const Profile& profile) const { typedef typename Profile::Geom_traits Geom_traits; typedef typename Profile::Point Point; - boost::optional op = m_base_placement(profile); + std::optional op = m_base_placement(profile); if(op) { CGAL_assertion(m_tree_ptr != nullptr); @@ -173,7 +173,7 @@ class Bounded_distance_placement > m_tree_ptr->do_intersect(CGAL::Sphere_3(p, m_sq_threshold_dist))) return op; - return boost::optional(); + return std::optional(); } return op; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h index 41e8af443377..036d5bb9b447 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h @@ -15,7 +15,7 @@ #include #include -#include +#include namespace CGAL { namespace Surface_mesh_simplification { @@ -31,8 +31,8 @@ class Bounded_normal_change_filter template - boost::optional - operator()(const Profile& profile, boost::optional op) const + std::optional + operator()(const Profile& profile, std::optional op) const { typedef typename Profile::VertexPointMap Vertex_point_map; @@ -78,7 +78,7 @@ class Bounded_normal_change_filter Vector n2 = gt.construct_cross_product_vector_3_object()(eq2p, eq2r); if(!is_positive(gt.compute_scalar_product_3_object()(n1, n2))) - return boost::optional(); + return std::optional(); ++it; } diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h index 379847d3ffee..1a1b9aafd129 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h @@ -15,7 +15,7 @@ #include -#include +#include namespace CGAL { namespace Surface_mesh_simplification { @@ -29,7 +29,7 @@ class Bounded_normal_change_placement {} template - boost::optional + std::optional operator()(const Profile& profile) const { typedef typename Profile::VertexPointMap Vertex_point_map; @@ -43,7 +43,7 @@ class Bounded_normal_change_placement const Geom_traits& gt = profile.geom_traits(); const Vertex_point_map& vpm = profile.vertex_point_map(); - boost::optional op = m_get_placement(profile); + std::optional op = m_get_placement(profile); if(op) { // triangles returns the triangles of the star of the vertices of the edge to collapse @@ -76,7 +76,7 @@ class Bounded_normal_change_placement Vector n2 = gt.construct_cross_product_vector_3_object()(eq2p, eq2r); if(!is_positive(gt.compute_scalar_product_3_object()(n1, n2))) - return boost::optional(); + return std::optional(); ++it; } diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h index 07749bdc643a..38f4b478ad35 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h @@ -31,7 +31,7 @@ class Constrained_placement {} template - boost::optional operator()(const Profile& profile) const + std::optional operator()(const Profile& profile) const { typedef typename Profile::TM TM; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h index 079f480076ee..7b5cab2ba26d 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h @@ -27,9 +27,9 @@ class Edge_length_cost Edge_length_cost() {} template - boost::optional operator()(const Profile& profile, const T& /*placement*/) const + std::optional operator()(const Profile& profile, const T& /*placement*/) const { - typedef boost::optional result_type; + typedef std::optional result_type; return result_type(profile.geom_traits().compute_squared_distance_3_object()(profile.p0(), profile.p1())); } }; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h index 2f0abb387892..bd576f56530a 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -97,8 +97,8 @@ class FastEnvelope_filter template - boost::optional - operator()(const Profile& profile, boost::optional op) const + std::optional + operator()(const Profile& profile, std::optional op) const { typedef typename Profile::Point Point; typedef typename Profile::vertex_descriptor_vector Link; @@ -116,7 +116,7 @@ class FastEnvelope_filter if(m_fast_envelope->is_outside(vecp)){ // the new placement is outside envelope - return boost::none; + return std::nullopt; } const Link link = profile.link(); @@ -134,7 +134,7 @@ class FastEnvelope_filter if(m_fast_envelope->is_outside(triangle)){ // the triangle intersects the envelope - return boost::none; + return std::nullopt; } vecv = vecw; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h index 8a3a11a1213f..b1421d750fae 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h @@ -32,9 +32,9 @@ class LindstromTurk_cost {} template - boost::optional + std::optional operator()(const Profile& profile, - const boost::optional& placement) const + const std::optional& placement) const { return internal::LindstromTurkCore(m_LT_params, profile).compute_cost(placement); } diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h index 9dc14adcf942..82bf9cc33efc 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h @@ -31,7 +31,7 @@ class LindstromTurk_placement {} template - boost::optional operator()(const Profile& profile) const + std::optional operator()(const Profile& profile) const { return internal::LindstromTurkCore(m_LT_params, profile).compute_placement(); } diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h index 7429f670b5c0..c76fb670318a 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h @@ -29,9 +29,9 @@ class Midpoint_placement Midpoint_placement() {} template - boost::optional operator()(const Profile& profile) const + std::optional operator()(const Profile& profile) const { - typedef boost::optional result_type; + typedef std::optional result_type; return result_type(profile.geom_traits().construct_midpoint_3_object()(profile.p0(), profile.p1())); } }; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h index d669e44f3178..590747a252b3 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h @@ -22,7 +22,7 @@ #include -#include +#include namespace CGAL { namespace Surface_mesh_simplification { @@ -199,14 +199,14 @@ class GarlandHeckbert_cost_and_placement public: // Cost template - boost::optional + std::optional operator()(const Profile& profile, - const boost::optional& placement) const + const std::optional& placement) const { - typedef boost::optional Optional_FT; + typedef std::optional Optional_FT; if(!placement) - return boost::optional(); + return std::optional(); CGAL_precondition(!get(vcm(), profile.v0()).isZero(0)); CGAL_precondition(!get(vcm(), profile.v1()).isZero(0)); @@ -222,7 +222,7 @@ class GarlandHeckbert_cost_and_placement public: // Placement template - boost::optional operator()(const Profile& profile) const + std::optional operator()(const Profile& profile) const { CGAL_precondition(!get(vcm(), profile.v0()).isZero(0)); CGAL_precondition(!get(vcm(), profile.v1()).isZero(0)); @@ -236,7 +236,7 @@ class GarlandHeckbert_cost_and_placement const Col_4 opt = construct_optimum(combined_matrix, p0, p1); - boost::optional pt = typename Profile::Point(opt(0) / opt(3), + std::optional pt = typename Profile::Point(opt(0) / opt(3), opt(1) / opt(3), opt(2) / opt(3)); diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index b0fce64b6d91..59002f636814 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -55,9 +55,9 @@ class LindstromTurkCore typedef typename Geom_traits::FT FT; typedef typename Geom_traits::Vector_3 Vector; - typedef boost::optional Optional_FT; - typedef boost::optional Optional_point; - typedef boost::optional Optional_vector; + typedef std::optional Optional_FT; + typedef std::optional Optional_point; + typedef std::optional Optional_vector; typedef MatrixC33 Matrix; @@ -152,7 +152,7 @@ private : static bool is_finite(const Matrix& m) { return is_finite(m.r0()) && is_finite(m.r1()) && is_finite(m.r2()); } template - static boost::optional filter_infinity(const T& n) { return is_finite(n) ? boost::optional(n) : boost::optional(); } + static std::optional filter_infinity(const T& n) { return is_finite(n) ? std::optional(n) : std::optional(); } private: @@ -298,7 +298,7 @@ compute_placement() if(mConstraints_n == 3) { // If the matrix is singular it's inverse cannot be computed so an 'absent' value is returned. - boost::optional lOptional_Ai = inverse_matrix(mConstraints_A); + std::optional lOptional_Ai = inverse_matrix(mConstraints_A); if(lOptional_Ai) { const Matrix& lAi = *lOptional_Ai; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h index a11066435a3f..4ed45a02d1e6 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include #include @@ -40,8 +40,8 @@ namespace internal { struct Dummy_filter { template inline - const boost::optional - operator()(const Profile&, const boost::optional& op) const + const std::optional + operator()(const Profile&, const std::optional& op) const { return op; } @@ -94,7 +94,7 @@ inline std::string matrix_to_string(const Matrix& m) { } template -inline std::string optional_to_string(const boost::optional& o) { +inline std::string optional_to_string(const std::optional& o) { if(o) return boost::str(boost::format("%1%") % *o); else return std::string("NONE"); diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h index a662b4c24c0b..0e45e5353ca5 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h @@ -127,8 +127,8 @@ class EdgeCollapse typedef typename Geom_traits::Vector_3 Vector; typedef typename Geom_traits::Equal_3 Equal_3; - typedef boost::optional Cost_type; - typedef boost::optional Placement_type; + typedef std::optional Cost_type; + typedef std::optional Placement_type; struct Compare_id { @@ -149,7 +149,7 @@ class EdgeCollapse bool operator()(const halfedge_descriptor a, const halfedge_descriptor b) const { - // NOTE: A cost is a boost::optional<> value. + // NOTE: A cost is a std::optional<> value. // Absent optionals are ordered first; that is, "none < T" and "T > none" for any defined T != none. // In consequence, edges with undefined costs will be promoted to the top of the priority queue and popped out first. return m_algorithm->get_data(a).cost() < m_algorithm->get_data(b).cost(); @@ -333,9 +333,9 @@ class EdgeCollapse CGAL_expensive_assertion(!mPQ->contains(h)); } - boost::optional pop_from_PQ() + std::optional pop_from_PQ() { - boost::optional opt_h = mPQ->extract_top(); + std::optional opt_h = mPQ->extract_top(); if(opt_h) { CGAL_assertion(is_primary_edge(*opt_h)); @@ -592,7 +592,7 @@ loop() // Pops and processes each edge from the PQ - boost::optional opt_h; + std::optional opt_h; #ifdef CGAL_SURF_SIMPL_INTERMEDIATE_STEPS_PRINTING int i_rm = 0; @@ -630,7 +630,7 @@ loop() std::cout << "step " << i_rm << " " << get(m_vpm, source(*h, m_tm)) << " " << get(m_vpm, target(*h, m_tm)) << "\n"; #endif - if(m_should_ignore(profile, placement)!= boost::none){ + if(m_should_ignore(profile, placement)!= std::nullopt){ collapse(profile, placement); } else diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Envelope.cpp b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Envelope.cpp index 0f5c8e99109d..f24432ba3ad3 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Envelope.cpp +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Envelope.cpp @@ -46,7 +46,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base My_visitor(Stats* s) : stats(s) {} // Called during the collecting phase for each edge collected. - void OnCollected(const Profile&, const boost::optional&) + void OnCollected(const Profile&, const std::optional&) { ++(stats->collected); std::cerr << "\rEdges collected: " << stats->collected << std::endl; @@ -55,7 +55,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base // Called during the processing phase for each edge selected. // If cost is absent the edge won't be collapsed. void OnSelected(const Profile&, - boost::optional cost, + std::optional cost, std::size_t /* initial */, std::size_t /* current */) { @@ -67,7 +67,7 @@ struct My_visitor : SMS::Edge_collapse_visitor_base // Called during the processing phase for each edge being collapsed. // If placement is absent the edge is left uncollapsed. void OnCollapsing(const Profile&, - boost::optional placement) + std::optional placement) { if(!placement) ++(stats->placement_uncomputable); diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Polyhedron_3.cpp b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Polyhedron_3.cpp index e1b27a66d551..00e6cf685019 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Polyhedron_3.cpp +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_Polyhedron_3.cpp @@ -198,7 +198,7 @@ void write (SurfaceSP aSurface, string aName) } template -string opt2str (const boost::optional& o) +string opt2str (const std::optional& o) { ostringstream ss; if(o) @@ -222,7 +222,7 @@ string point2str (const P& p) } template -string optpoint2str (const boost::optional

    & p) +string optpoint2str (const std::optional

    & p) { ostringstream ss; if(p) @@ -232,7 +232,7 @@ string optpoint2str (const boost::optional

    & p) return ss.str(); } template -string optfloat2str (const boost::optional& n) +string optfloat2str (const std::optional& n) { ostringstream ss; if(n) @@ -258,7 +258,7 @@ string edge2str (const E& e) return ss.str(); } -template ostream& operator << (ostream& os, const boost::optional& o) { return os << opt2str(o); } +template ostream& operator << (ostream& os, const std::optional& o) { return os << opt2str(o); } string normalize_EOL (string line) { @@ -304,12 +304,12 @@ public : CHECK(aSurface.is_valid()); } - virtual void OnCollected(const Profile& aProfile, const boost::optional& aCost) const + virtual void OnCollected(const Profile& aProfile, const std::optional& aCost) const { TEST_TRACE(str (boost::format("Collecting %1% : cost=%2%") % edge2str(aProfile.v0_v1()) % optfloat2str(aCost))); } - virtual void OnCollapsing(const Profile& aProfile, const boost::optional& aP) const + virtual void OnCollapsing(const Profile& aProfile, const std::optional& aP) const { TEST_TRACE(str (boost::format("S %1% - Collapsing %2% : placement=%3%") % mStep % edge2str(aProfile.v0_v1()) % optpoint2str(aP))); diff --git a/Surface_mesher/include/CGAL/AABB_polyhedral_oracle.h b/Surface_mesher/include/CGAL/AABB_polyhedral_oracle.h index a57dc122563d..d03fe0b0fe51 100644 --- a/Surface_mesher/include/CGAL/AABB_polyhedral_oracle.h +++ b/Surface_mesher/include/CGAL/AABB_polyhedral_oracle.h @@ -84,7 +84,7 @@ namespace CGAL { Object operator()(const Surface_3& surface, const Segment_3& segment) const { - boost::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > + std::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > intersection = surface.tree()->any_intersection(segment); if ( intersection ) @@ -95,7 +95,7 @@ namespace CGAL { Object operator()(const Surface_3& surface, const Line_3& line) const { - boost::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > + std::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > intersection = surface.tree()->any_intersection(line); if ( intersection ) @@ -105,7 +105,7 @@ namespace CGAL { } Object operator()(const Surface_3& surface, const Ray_3& ray) const { - boost::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > + std::optional< typename AABB_traits::template Intersection_and_primitive_id::Type > intersection = surface.tree()->any_intersection(ray); if ( intersection ) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h index 4fbe11807561..17b2c7edd358 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include @@ -317,7 +317,7 @@ Sliver_removal_result flip_3_to_2(typename C3t3::Edge& edge, } ch->vertex(v)->set_cell(ch); - inc_cells[ch->vertex(v)] = boost::none; + inc_cells[ch->vertex(v)] = std::nullopt; ch->reset_cache_validity(); } } @@ -596,8 +596,8 @@ void find_best_flip_to_improve_dh(C3t3& c3t3, if(tr.is_infinite(vh)) continue; - boost::optional>& o_inc_vh = inc_cells[vh]; - if (o_inc_vh == boost::none) + std::optional>& o_inc_vh = inc_cells[vh]; + if (o_inc_vh == std::nullopt) { boost::container::small_vector inc_vec; tr.incident_cells(vh, std::back_inserter(inc_vec)); @@ -761,8 +761,8 @@ Sliver_removal_result flip_n_to_m(C3t3& c3t3, facet_circulator++; facet_circulator++; - boost::optional>& o_inc_vh = inc_cells[vh]; - if (o_inc_vh == boost::none) + std::optional>& o_inc_vh = inc_cells[vh]; + if (o_inc_vh == std::nullopt) { boost::container::small_vector inc_vec; tr.incident_cells(vh, std::back_inserter(inc_vec)); @@ -948,7 +948,7 @@ Sliver_removal_result flip_n_to_m(C3t3& c3t3, } ch->vertex(v)->set_cell(ch); - inc_cells[ch->vertex(v)] = boost::none; + inc_cells[ch->vertex(v)] = std::nullopt; ch->reset_cache_validity(); } } @@ -1186,14 +1186,14 @@ std::size_t flip_all_edges(const std::vector& edges, Tr& tr = c3t3.triangulation(); std::unordered_map > > inc_cells; + std::optional > > inc_cells; std::size_t count = 0; for (const VertexPair& vp : edges) { - boost::optional>& + std::optional>& o_inc_vh = inc_cells[vp.first]; - if (o_inc_vh == boost::none) + if (o_inc_vh == std::nullopt) { boost::container::small_vector inc_vec; tr.incident_cells(vp.first, std::back_inserter(inc_vec)); diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h index 24874936248b..7628e653699a 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/smooth_vertices.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -91,7 +91,7 @@ class Tetrahedral_remeshing_smoother } template - boost::optional + std::optional find_adjacent_facet_on_surface(const Facet& f, const Edge& edge, const C3t3& c3t3, @@ -211,7 +211,7 @@ class Tetrahedral_remeshing_smoother for (const std::array& ei : edges) { Edge edge(ch, ei[0], ei[1]); - if (boost::optional neighbor + if (std::optional neighbor = find_adjacent_facet_on_surface(f, edge, c3t3, cell_selector)) { const Facet neigh = *neighbor; //already a canonical_facet @@ -307,7 +307,7 @@ class Tetrahedral_remeshing_smoother #endif } - boost::optional project(const Surface_patch_index& si, + std::optional project(const Surface_patch_index& si, const Vector_3& gi) { CGAL_assertion(subdomain_FMLS_indices.find(si) != subdomain_FMLS_indices.end()); @@ -537,7 +537,7 @@ class Tetrahedral_remeshing_smoother = project_on_tangent_plane(smoothed_position, current_pos, vertices_normals[v][si]); //Check if the mls surface exists to avoid degenerated cases - if (boost::optional mls_projection = project(si, normal_projection)) { + if (std::optional mls_projection = project(si, normal_projection)) { final_position = final_position + *mls_projection; } else { @@ -574,7 +574,7 @@ class Tetrahedral_remeshing_smoother { //Check if the mls surface exists to avoid degenerated cases - if (boost::optional mls_projection = project(si, current_pos)) { + if (std::optional mls_projection = project(si, current_pos)) { final_position = final_position + *mls_projection; } else { @@ -660,7 +660,7 @@ class Tetrahedral_remeshing_smoother current_pos, vertices_normals[v][si]); - if (boost::optional mls_projection = project(si, normal_projection)) + if (std::optional mls_projection = project(si, normal_projection)) final_position = final_position + *mls_projection; else final_position = smoothed_position; @@ -682,7 +682,7 @@ class Tetrahedral_remeshing_smoother const Vector_3 current_pos(CGAL::ORIGIN, point(v->point())); - if (boost::optional mls_projection = project(si, current_pos)) + if (std::optional mls_projection = project(si, current_pos)) { const typename Tr::Point new_pos(CGAL::ORIGIN + *mls_projection); if(check_inversion_and_move(v, new_pos, inc_cells[vid], tr, total_move)){ diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h index 4c8fac7609cf..b9147708c012 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace CGAL { @@ -321,15 +321,15 @@ class Adaptive_remesher Cell_handle c = c_i.first; const std::array& f_on_surface = c_i.second; - boost::optional patch; + std::optional patch; for (int i = 0; i < 4; ++i) { if (f_on_surface[i]) { Surface_patch_index spi = m_c3t3.surface_patch_index(c, i); - if (patch != boost::none && patch != spi) + if (patch != std::nullopt && patch != spi) { - patch = boost::none; + patch = std::nullopt; break; } else @@ -338,7 +338,7 @@ class Adaptive_remesher } } } - if(patch == boost::none) + if(patch == std::nullopt) continue; for (int i = 0; i < 4; ++i) diff --git a/Three/include/CGAL/Three/exceptions.h b/Three/include/CGAL/Three/exceptions.h index cf3640d5b46a..dd923aa5b2b9 100644 --- a/Three/include/CGAL/Three/exceptions.h +++ b/Three/include/CGAL/Three/exceptions.h @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include namespace CGAL{ @@ -44,7 +44,7 @@ class Script_exception : public std::runtime_error { template struct Optional_or_bool { - typedef boost::optional type; + typedef std::optional type; template static type invoke(Callable f) { return type(f()); } diff --git a/Triangulation/include/CGAL/Delaunay_triangulation.h b/Triangulation/include/CGAL/Delaunay_triangulation.h index 262f451fdc10..1dd1929cb682 100644 --- a/Triangulation/include/CGAL/Delaunay_triangulation.h +++ b/Triangulation/include/CGAL/Delaunay_triangulation.h @@ -130,12 +130,12 @@ class Delaunay_triangulation // Wrapper struct Side_of_oriented_subsphere_d { - boost::optional* fop; + std::optional* fop; Construct_flat_orientation_d cfo; In_flat_side_of_oriented_sphere_d ifsoos; Side_of_oriented_subsphere_d( - boost::optional& x, + std::optional& x, Construct_flat_orientation_d const&y, In_flat_side_of_oriented_sphere_d const&z) : fop(&x), cfo(y), ifsoos(z) {} diff --git a/Triangulation/include/CGAL/Regular_triangulation.h b/Triangulation/include/CGAL/Regular_triangulation.h index 2d63893e38aa..8294cb655980 100644 --- a/Triangulation/include/CGAL/Regular_triangulation.h +++ b/Triangulation/include/CGAL/Regular_triangulation.h @@ -129,12 +129,12 @@ class Regular_triangulation // Wrapper struct Power_side_of_power_sphere_for_non_maximal_dim_d { - boost::optional* fop; + std::optional* fop; Construct_flat_orientation_d cfo; In_flat_power_side_of_power_sphere_d ifpt; Power_side_of_power_sphere_for_non_maximal_dim_d( - boost::optional& x, + std::optional& x, Construct_flat_orientation_d const&y, In_flat_power_side_of_power_sphere_d const&z) : fop(&x), cfo(y), ifpt(z) {} diff --git a/Triangulation/include/CGAL/Triangulation.h b/Triangulation/include/CGAL/Triangulation.h index 55a118a7b69c..1dc8e1a34592 100644 --- a/Triangulation/include/CGAL/Triangulation.h +++ b/Triangulation/include/CGAL/Triangulation.h @@ -88,12 +88,12 @@ class Triangulation // Wrapper struct Coaffine_orientation_d { - boost::optional* fop; + std::optional* fop; Construct_flat_orientation_d cfo; In_flat_orientation_d ifo; Coaffine_orientation_d( - boost::optional& x, + std::optional& x, Construct_flat_orientation_d const&y, In_flat_orientation_d const&z) : fop(&x), cfo(y), ifo(z) {} @@ -117,7 +117,7 @@ class Triangulation flat_orientation_ = *preset_flat_orientation_.second; } else - flat_orientation_ = boost::none; + flat_orientation_ = std::nullopt; } typedef typename TriangulationTraits::Orientation_d @@ -188,7 +188,7 @@ class Triangulation Triangulation_ds tds_; const Geom_traits kernel_; Vertex_handle infinity_; - mutable boost::optional flat_orientation_; + mutable std::optional flat_orientation_; // The user can specify a Flat_orientation_d object to be used for // orienting simplices of a specific dimension // (= preset_flat_orientation_.first) diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h index 6f7a9e5ea858..652cb033ab83 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h @@ -40,7 +40,7 @@ class ConstrainedTriangulationTraits_2 { /*! A function object whose `operator()` computes the intersection of two segments. -`boost::optional > operator()(Segment_2 s1, Segment_2 s2);` +`std::optional > operator()(Segment_2 s1, Segment_2 s2);` Returns the intersection of `s1` and `s2`. */ typedef unspecified_type Intersect_2; From 557b64e4a67febfe1e8940b21adc8267206aa17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:54:15 +0200 Subject: [PATCH 0361/1398] boost::any ==> std::any --- .../Option_parser.cpp | 12 +++++----- .../Option_parser.hpp | 2 +- .../include/CGAL/sibson_gradient_fitting.h | 10 ++++----- .../Intersections_2/variant_any_object.cpp | 16 +++++++------- Nef_2/include/CGAL/Nef_2/HDS_items.h | 8 +++---- Nef_2/include/CGAL/Nef_2/PM_const_decorator.h | 4 ++-- Nef_2/include/CGAL/Nef_2/PM_decorator.h | 2 +- Nef_2/include/CGAL/Nef_2/PM_overlayer.h | 22 +++++++++---------- Nef_2/include/CGAL/Nef_2/PM_point_locator.h | 16 +++++++------- Nef_2/include/CGAL/Nef_2/gen_point_location.h | 16 +++++++------- Nef_2/include/CGAL/Nef_2/geninfo.h | 2 +- Nef_3/include/CGAL/Nef_3/Halfedge.h | 4 ++-- Nef_3/include/CGAL/Nef_3/SFace.h | 4 ++-- Nef_3/include/CGAL/Nef_3/SHalfedge.h | 4 ++-- Nef_3/include/CGAL/Nef_3/SNC_FM_decorator.h | 6 ++--- Nef_3/include/CGAL/Nef_3/SNC_SM_overlayer.h | 2 +- .../include/CGAL/Nef_3/SNC_const_decorator.h | 4 ++-- Nef_3/include/CGAL/Nef_3/SNC_decorator.h | 4 ++-- Nef_3/include/CGAL/Nef_3/SNC_io_parser.h | 4 ++-- Nef_3/include/CGAL/Nef_3/Vertex.h | 4 ++-- .../include/CGAL/Nef_S2/SM_const_decorator.h | 4 ++-- Nef_S2/include/CGAL/Nef_S2/SM_decorator.h | 4 ++-- Nef_S2/include/CGAL/Nef_S2/SM_items.h | 10 ++++----- Nef_S2/include/CGAL/Nef_S2/SM_overlayer.h | 22 +++++++++---------- Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h | 2 +- Nef_S2/include/CGAL/Nef_S2/SM_triangulator.h | 14 ++++++------ .../CGAL/Polygon_mesh_processing/distance.h | 16 +++++++------- .../Polyhedron/Plugins/Mesh_3/Mesh_function.h | 8 +++---- STL_Extension/doc/STL_Extension/CGAL/Object.h | 2 +- .../doc/STL_Extension/STL_Extension.txt | 2 +- STL_Extension/include/CGAL/Object.h | 20 ++++++++--------- 31 files changed, 125 insertions(+), 125 deletions(-) diff --git a/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.cpp b/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.cpp index 8a2bb5dd03ca..a1032551da22 100644 --- a/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.cpp +++ b/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.cpp @@ -18,7 +18,7 @@ char * Option_parser::s_strategy_opts[] = { }; template -void Option_parser::my_validate(boost::any & v, +void Option_parser::my_validate(std::any & v, const std::vector & values) { typedef std::vector Vector_id; @@ -28,11 +28,11 @@ void Option_parser::my_validate(boost::any & v, if (v.empty()) { Vector_id vec; vec.push_back(MyId(i)); - v = boost::any(vec); + v = std::any(vec); } else { - Vector_id vec = boost::any_cast(v); + Vector_id vec = std::any_cast(v); vec.push_back(MyId(i)); - v = boost::any(vec); + v = std::any(vec); } return; } @@ -41,14 +41,14 @@ void Option_parser::my_validate(boost::any & v, } /* Overload the 'validate' function for the user-defined class */ -void validate(boost::any & v, const std::vector & values, +void validate(std::any & v, const std::vector & values, Option_parser::Vector_type_id * target_type, int) { Option_parser::my_validate(v, values); } /* Overload the 'validate' function for the user-defined class */ -void validate(boost::any & v, const std::vector & values, +void validate(std::any & v, const std::vector & values, Option_parser::Vector_strategy_id * target_type, int) { Option_parser::my_validate(v, values); diff --git a/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.hpp b/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.hpp index 4fcfc0aafd6a..a20f3b804c22 100644 --- a/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.hpp +++ b/Arrangement_on_surface_2/benchmark/Arrangement_on_surface_2/Option_parser.hpp @@ -124,7 +124,7 @@ class Option_parser : public cb::Option_parser { unsigned int get_height() const { return m_win_height; } template - static void my_validate(boost::any & v, + static void my_validate(std::any & v, const std::vector & values); protected: diff --git a/Interpolation/include/CGAL/sibson_gradient_fitting.h b/Interpolation/include/CGAL/sibson_gradient_fitting.h index 074ca037afb1..f08600a4603c 100644 --- a/Interpolation/include/CGAL/sibson_gradient_fitting.h +++ b/Interpolation/include/CGAL/sibson_gradient_fitting.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -229,7 +229,7 @@ sibson_gradient_fitting_nn_2(const Dt& dt, // of the value functor is 'DT::Point' or 'DT::Vertex_handle' std::enable_if_t< std::is_constructible< - std::function, + std::function, ValueFunctor >::value>* = nullptr) { @@ -255,7 +255,7 @@ sibson_gradient_fitting_nn_2(const Dt& dt, const Traits& traits, std::enable_if_t< std::is_constructible< - std::function, + std::function, ValueFunctor >::value>* = nullptr) { @@ -299,7 +299,7 @@ sibson_gradient_fitting_rn_2(const Rt& rt, // of the value functor is 'Rt::Point' (weighted point) or 'Rt::Vertex_handle' std::enable_if_t< std::is_constructible< - std::function, + std::function, ValueFunctor >::value>* = nullptr) { @@ -325,7 +325,7 @@ sibson_gradient_fitting_rn_2(const Rt& rt, const Traits& traits, std::enable_if_t< std::is_constructible< - std::function, + std::function, ValueFunctor >::value>* = nullptr) { diff --git a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp index a7765e4b3c1d..c5176eda212c 100644 --- a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp +++ b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include @@ -78,7 +78,7 @@ intersection_variant(const typename K::Segment_2 &seg1, } template -boost::any intersection_any(const typename K::Segment_2 &seg1, +std::any intersection_any(const typename K::Segment_2 &seg1, const typename K::Segment_2 &seg2, const K&) { @@ -88,11 +88,11 @@ boost::any intersection_any(const typename K::Segment_2 &seg1, switch (ispair.intersection_type()) { case is_t::NO_INTERSECTION: default: - return boost::any(); + return std::any(); case is_t::POINT: - return boost::any(ispair.intersection_point()); + return std::any(ispair.intersection_point()); case is_t::SEGMENT: - return boost::any(ispair.intersection_segment()); + return std::any(ispair.intersection_segment()); } } @@ -165,10 +165,10 @@ struct Any_f : Vec_holder { Vec_holder(p, s) { } void operator()(const Segment& s1, const Segment& s2) { - boost::any obj = intersection_any(s1, s2, K()); - if (const Point * point = boost::any_cast(&obj)) { + std::any obj = intersection_any(s1, s2, K()); + if (const Point * point = std::any_cast(&obj)) { p->push_back(*point); - } else if (const Segment * segment = boost::any_cast(&obj)) { + } else if (const Segment * segment = std::any_cast(&obj)) { s->push_back(*segment); } } diff --git a/Nef_2/include/CGAL/Nef_2/HDS_items.h b/Nef_2/include/CGAL/Nef_2/HDS_items.h index 48a44c50fd72..12e1d32d8735 100644 --- a/Nef_2/include/CGAL/Nef_2/HDS_items.h +++ b/Nef_2/include/CGAL/Nef_2/HDS_items.h @@ -22,7 +22,7 @@ #include #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -62,7 +62,7 @@ class Nef_vertex_2 { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Traits::Point Point; // geometric embedding @@ -151,7 +151,7 @@ class Nef_halfedge_2 { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename std::list::iterator fc_iterator; @@ -248,7 +248,7 @@ class Nef_face_2 { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Traits::Mark Mark; // mark information diff --git a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h index 7748f4b1f611..5a685f9e3108 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_const_decorator.h @@ -28,7 +28,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif #include @@ -137,7 +137,7 @@ typedef size_t Size_type; /*{\Mtypemember The size type.}*/ typedef void* GenPtr; #else -typedef boost::any GenPtr; +typedef std::any GenPtr; #endif diff --git a/Nef_2/include/CGAL/Nef_2/PM_decorator.h b/Nef_2/include/CGAL/Nef_2/PM_decorator.h index 914a6a58d6ab..6cc528c7dabd 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_decorator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_decorator.h @@ -19,7 +19,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include diff --git a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h index 5ce03215db3d..882a349c9c99 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h +++ b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h @@ -23,7 +23,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #undef CGAL_NEF_DEBUG #define CGAL_NEF_DEBUG 13 @@ -92,7 +92,7 @@ struct PMO_from_segs { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::access(G.info(v)) = e; #else - *boost::any_cast(&G.info(v)) = e; + *std::any_cast(&G.info(v)) = e; #endif } @@ -102,7 +102,7 @@ struct PMO_from_segs { return geninfo::access(G.info(v)); #else return - boost::any_cast(G.info(v)); + std::any_cast(G.info(v)); #endif } @@ -112,7 +112,7 @@ struct PMO_from_segs { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(G.info(v)); #else - G.info(v)=boost::any(); + G.info(v)=std::any(); #endif } @@ -674,7 +674,7 @@ void discard_info(Vertex_handle v) const #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(info(v)); #else - info(v)=boost::any(); + info(v)=std::any(); #endif } @@ -684,7 +684,7 @@ vertex_info& ginfo(Vertex_handle v) const return geninfo::access(info(v)); #else return - *boost::any_cast(&info(v)); + *std::any_cast(&info(v)); #endif } @@ -729,8 +729,8 @@ void discard_info(Halfedge_handle e) const geninfo::clear(info(e)); geninfo::clear(info(twin(e))); #else - info(e)=boost::any(); - info(twin(e))=boost::any(); + info(e)=std::any(); + info(twin(e))=std::any(); #endif } @@ -740,7 +740,7 @@ halfedge_info& ginfo(Halfedge_handle e) const return geninfo::access(info(e)); #else return - *boost::any_cast(&info(e)); + *std::any_cast(&info(e)); #endif } @@ -782,7 +782,7 @@ void discard_info(Face_handle f) const #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(info(f)); #else - info(f)=boost::any(); + info(f)=std::any(); #endif } @@ -792,7 +792,7 @@ face_info& ginfo(Face_handle f) const return geninfo::access(info(f)); #else return - *boost::any_cast(&info(f)); + *std::any_cast(&info(f)); #endif } diff --git a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h index ede8d2b033a9..12a4a0812675 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h @@ -28,7 +28,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #ifdef CGAL_USE_LEDA_LIBRARY @@ -497,7 +497,7 @@ class PM_point_locator : public return geninfo::const_access(CT.info(v)).first; #else return - boost::any_cast(CT.info(v)).first; + std::any_cast(CT.info(v)).first; #endif } @@ -507,7 +507,7 @@ class PM_point_locator : public return geninfo::const_access(CT.info(e)).first; #else return - boost::any_cast(CT.info(e)).first; + std::any_cast(CT.info(e)).first; #endif } @@ -517,7 +517,7 @@ class PM_point_locator : public return geninfo::const_access(CT.info(e)).second; #else return - boost::any_cast(CT.info(e)).second; + std::any_cast(CT.info(e)).second; #endif } @@ -584,10 +584,10 @@ class PM_point_locator : public f = geninfo::access(info(e_from)).second; #else f = - boost::any_cast(info(source(e))).second; + std::any_cast(info(source(e))).second; else f = - boost::any_cast(info(e_from)).second; + std::any_cast(info(e_from)).second; #endif mark(e) = _DP.mark(f); #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO @@ -968,7 +968,7 @@ PM_point_locator:: #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(CT.info(vit)); #else - CT.info(vit)=boost::any(); + CT.info(vit)=std::any(); #endif } Halfedge_iterator eit, eend = CT.halfedges_end(); @@ -976,7 +976,7 @@ PM_point_locator:: #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(CT.info(eit)); #else - CT.info(eit)=boost::any(); + CT.info(eit)=std::any(); #endif } CT.clear(); diff --git a/Nef_2/include/CGAL/Nef_2/gen_point_location.h b/Nef_2/include/CGAL/Nef_2/gen_point_location.h index c479a9af62a2..1430b785ae07 100644 --- a/Nef_2/include/CGAL/Nef_2/gen_point_location.h +++ b/Nef_2/include/CGAL/Nef_2/gen_point_location.h @@ -27,7 +27,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif @@ -55,7 +55,7 @@ class GenericLocation { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif public: /*{\Mtypes}*/ @@ -89,7 +89,7 @@ class GenericLocation { return geninfo::const_access(value); #else return - *boost::any_cast(&value); + *std::any_cast(&value); #endif } /*{\Mconversion converts |\Mvar| into a node.\\ @@ -105,7 +105,7 @@ class GenericLocation { return geninfo::const_access(value); #else return - *boost::any_cast(&value); + *std::any_cast(&value); #endif } /*{\Mconversion converts |\Mvar| into an edge.\\ @@ -159,8 +159,8 @@ class GenericLocation { case NODE: geninfo::clear(value); break; case EDGE: geninfo::clear(value); break; #else - case NODE: value=boost::any(); break; - case EDGE: value=boost::any(); break; + case NODE: value=std::any(); break; + case EDGE: value=std::any(); break; #endif case NIL: break; } @@ -174,14 +174,14 @@ class GenericLocation { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::access(value) = geninfo::const_access(L.value); #else - *boost_any_cast(&value) = boost::any_cast(L.value); + *boost_any_cast(&value) = std::any_cast(L.value); #endif break; case EDGE: #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::access(value) = geninfo::const_access(L.value); #else - *boost::any_cast(&value) = boost::any_cast(L.value); + *std::any_cast(&value) = std::any_cast(L.value); #endif break; case NIL: break; diff --git a/Nef_2/include/CGAL/Nef_2/geninfo.h b/Nef_2/include/CGAL/Nef_2/geninfo.h index 08273c2e23ed..41fab418e915 100644 --- a/Nef_2/include/CGAL/Nef_2/geninfo.h +++ b/Nef_2/include/CGAL/Nef_2/geninfo.h @@ -17,7 +17,7 @@ #define CGAL_DEPRECATED_HEADER "" #define CGAL_DEPRECATED_MESSAGE_DETAILS \ - "Something like boost::any or boost::variant should be used instead." + "Something like std::any or boost::variant should be used instead." #include #include diff --git a/Nef_3/include/CGAL/Nef_3/Halfedge.h b/Nef_3/include/CGAL/Nef_3/Halfedge.h index b4fc70657408..01c8df55785d 100644 --- a/Nef_3/include/CGAL/Nef_3/Halfedge.h +++ b/Nef_3/include/CGAL/Nef_3/Halfedge.h @@ -31,7 +31,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -42,7 +42,7 @@ class Halfedge_base #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Vector_3 Vector_3; diff --git a/Nef_3/include/CGAL/Nef_3/SFace.h b/Nef_3/include/CGAL/Nef_3/SFace.h index 3ee882271d61..c723b2cd4d0f 100644 --- a/Nef_3/include/CGAL/Nef_3/SFace.h +++ b/Nef_3/include/CGAL/Nef_3/SFace.h @@ -29,7 +29,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -39,7 +39,7 @@ class SFace_base { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Vertex_handle Vertex_handle; diff --git a/Nef_3/include/CGAL/Nef_3/SHalfedge.h b/Nef_3/include/CGAL/Nef_3/SHalfedge.h index 19339312f20d..2191e73bbe67 100644 --- a/Nef_3/include/CGAL/Nef_3/SHalfedge.h +++ b/Nef_3/include/CGAL/Nef_3/SHalfedge.h @@ -30,7 +30,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -40,7 +40,7 @@ class SHalfedge_base { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Sphere_circle Sphere_circle; diff --git a/Nef_3/include/CGAL/Nef_3/SNC_FM_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_FM_decorator.h index 6f60c1885706..6cbc6be0ed84 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_FM_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_FM_decorator.h @@ -18,7 +18,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include @@ -413,7 +413,7 @@ class SNC_FM_decorator : public SNC_decorator { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO Edge_of[geninfo::access(info(e_min->twin()->source()->twin()->source()))]; #else - Edge_of[ boost::any_cast(info(e_min->twin()->source()->twin()->source())) ]; + Edge_of[ std::any_cast(info(e_min->twin()->source()->twin()->source())) ]; #endif CGAL_assertion( e_below != SHalfedge_handle() ); CGAL_NEF_TRACEN(" edge below " << debug(e_below)); @@ -652,7 +652,7 @@ create_facet_objects(const Plane_3& plane_supporting_facet, #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO Edge_of[geninfo::access(info(l->incident_sface()->center_vertex()))]; #else - Edge_of[ boost::any_cast(info(l->incident_sface()->center_vertex())) ]; + Edge_of[ std::any_cast(info(l->incident_sface()->center_vertex())) ]; #endif CGAL_assertion( e_below != SHalfedge_handle() ); diff --git a/Nef_3/include/CGAL/Nef_3/SNC_SM_overlayer.h b/Nef_3/include/CGAL/Nef_3/SNC_SM_overlayer.h index 8c45ba71566b..2c29bca697c1 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_SM_overlayer.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_SM_overlayer.h @@ -23,7 +23,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include diff --git a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h index 83f89e413b34..47e85c817ae3 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_const_decorator.h @@ -32,7 +32,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -118,7 +118,7 @@ class SNC_const_decorator { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif SNC_const_decorator() : sncp_(0) {} diff --git a/Nef_3/include/CGAL/Nef_3/SNC_decorator.h b/Nef_3/include/CGAL/Nef_3/SNC_decorator.h index 61dcbb983ef4..281fb0d0dcd0 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_decorator.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_decorator.h @@ -36,7 +36,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -157,7 +157,7 @@ class SNC_decorator : public SNC_const_decorator { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif SNC_decorator() : Base(), sncp_() {} diff --git a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h index 9aa445f38a1d..c546843ffc5e 100644 --- a/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h +++ b/Nef_3/include/CGAL/Nef_3/SNC_io_parser.h @@ -37,7 +37,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif #include @@ -963,7 +963,7 @@ class SNC_io_parser : public SNC_decorator #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif using Base::visit_shell_objects; diff --git a/Nef_3/include/CGAL/Nef_3/Vertex.h b/Nef_3/include/CGAL/Nef_3/Vertex.h index 0a1d7bc280ee..fdccc06bd036 100644 --- a/Nef_3/include/CGAL/Nef_3/Vertex.h +++ b/Nef_3/include/CGAL/Nef_3/Vertex.h @@ -30,7 +30,7 @@ #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -41,7 +41,7 @@ class Vertex_base { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Point_3 Point_3; diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_const_decorator.h b/Nef_S2/include/CGAL/Nef_S2/SM_const_decorator.h index e1e1762dc8fa..eb83d34928f3 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_const_decorator.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_const_decorator.h @@ -32,7 +32,7 @@ #define CGAL_NEF_DEBUG 67 #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -75,7 +75,7 @@ typedef size_t Size_type; #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else -typedef boost::any GenPtr; +typedef std::any GenPtr; #endif diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_decorator.h b/Nef_S2/include/CGAL/Nef_S2/SM_decorator.h index 4328b38f44cc..8576d4488c8a 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_decorator.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_decorator.h @@ -31,7 +31,7 @@ #include #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -84,7 +84,7 @@ typedef typename Sphere_kernel::Aff_transformation_3 Aff_transformation_3; #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else -typedef boost::any GenPtr; +typedef std::any GenPtr; #endif typedef typename Map::SVertex SVertex; typedef typename Map::SVertex_handle SVertex_handle; diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_items.h b/Nef_S2/include/CGAL/Nef_S2/SM_items.h index d1141a21311f..4508f4cc1155 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_items.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_items.h @@ -27,7 +27,7 @@ #include #include #ifndef CGAL_I_DO_WANT_TO_USE_GENINFO -#include +#include #endif namespace CGAL { @@ -45,7 +45,7 @@ struct SM_items { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Sphere_point Sphere_point; @@ -127,7 +127,7 @@ struct SM_items { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Sphere_circle Sphere_circle; @@ -228,7 +228,7 @@ struct SM_items { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Sphere_circle Sphere_circle; @@ -306,7 +306,7 @@ struct SM_items { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO typedef void* GenPtr; #else - typedef boost::any GenPtr; + typedef std::any GenPtr; #endif typedef typename Refs::Mark Mark; typedef typename Refs::Object_handle Object_handle; diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_overlayer.h b/Nef_S2/include/CGAL/Nef_S2/SM_overlayer.h index 52c94bad7086..24496cae9878 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_overlayer.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_overlayer.h @@ -23,7 +23,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include @@ -106,7 +106,7 @@ struct SMO_from_segs { return geninfo::access(G.info(v)); #else return - boost::any_cast( G.info(v) ); + std::any_cast( G.info(v) ); #endif } @@ -122,7 +122,7 @@ struct SMO_from_segs { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(G.info(v)); #else - G.info(v)=boost::any(); + G.info(v)=std::any(); #endif } @@ -141,7 +141,7 @@ struct SMO_from_segs { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(G.info(v)); #else - G.info(v)=boost::any(); + G.info(v)=std::any(); #endif } @@ -564,7 +564,7 @@ class SM_overlayer : public SM_decorator_ { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(info(v)); #else - info(v)=boost::any(); + info(v)=std::any(); #endif } @@ -574,7 +574,7 @@ class SM_overlayer : public SM_decorator_ { return geninfo::access(info(v)); #else return - *boost::any_cast(&info(v)); + *std::any_cast(&info(v)); #endif } @@ -618,8 +618,8 @@ class SM_overlayer : public SM_decorator_ { geninfo::clear(info(e)); geninfo::clear(info(e->twin())); #else - info(e)=boost::any(); - info(e->twin())=boost::any(); + info(e)=std::any(); + info(e->twin())=std::any(); #endif } @@ -629,7 +629,7 @@ class SM_overlayer : public SM_decorator_ { return geninfo::access(info(e)); #else return - *boost::any_cast(&info(e)); + *std::any_cast(&info(e)); #endif } @@ -671,7 +671,7 @@ class SM_overlayer : public SM_decorator_ { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(info(f)); #else - info(f)=boost::any(); + info(f)=std::any(); #endif } @@ -681,7 +681,7 @@ class SM_overlayer : public SM_decorator_ { return geninfo::access(info(f)); #else return - *boost::any_cast(&info(f)); + *std::any_cast(&info(f)); #endif } diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h b/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h index 8dbce0ced5ed..ef9d45a7a6d6 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h @@ -21,7 +21,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_triangulator.h b/Nef_S2/include/CGAL/Nef_S2/SM_triangulator.h index af50600aa4ad..8c33ff31cc71 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_triangulator.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_triangulator.h @@ -22,7 +22,7 @@ #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO #include #else -#include +#include #endif #include #include @@ -213,7 +213,7 @@ class SM_triangulator : public Decorator_ { #ifdef CGAL_I_DO_WANT_TO_USE_GENINFO geninfo::clear(info(v)); #else - info(v)=boost::any(); + info(v)=std::any(); #endif } @@ -223,7 +223,7 @@ class SM_triangulator : public Decorator_ { return geninfo::access(info(v)); #else return - *boost::any_cast(&info(v)); + *std::any_cast(&info(v)); #endif } @@ -258,8 +258,8 @@ class SM_triangulator : public Decorator_ { geninfo::clear(info(e)); geninfo::clear(info(e->twin())); #else - info(e)=boost::any(); - info(e->twin())=boost::any(); + info(e)=std::any(); + info(e->twin())=std::any(); #endif } @@ -269,7 +269,7 @@ class SM_triangulator : public Decorator_ { return geninfo::access(info(e)); #else return - *boost::any_cast(&info(e)); + *std::any_cast(&info(e)); #endif } @@ -288,7 +288,7 @@ class SM_triangulator : public Decorator_ { return geninfo::const_access(info(e)); #else return - *boost::any_cast(&info(e)); + *std::any_cast(&info(e)); #endif } const Mark& incident_mark(SHalfedge_const_handle e) const diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 6d221c77bb9e..28b6195b540c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -43,7 +43,7 @@ #include #endif // CGAL_LINKED_WITH_TBB -#include +#include #include #include @@ -1818,10 +1818,10 @@ struct Bounded_error_preprocessing #ifdef CGAL_HAUSDORFF_DEBUG using Timer = CGAL::Real_timer; #endif - std::vector& tm_wrappers; + std::vector& tm_wrappers; // Constructor. - Bounded_error_preprocessing(std::vector& tm_wrappers) + Bounded_error_preprocessing(std::vector& tm_wrappers) : tm_wrappers(tm_wrappers) { } @@ -1830,8 +1830,8 @@ struct Bounded_error_preprocessing : tm_wrappers(s.tm_wrappers) { } - bool is_tm1_wrapper(const boost::any& operand) const { return operand.type() == typeid(TM1Wrapper); } - bool is_tm2_wrapper(const boost::any& operand) const { return operand.type() == typeid(TM2Wrapper); } + bool is_tm1_wrapper(const std::any& operand) const { return operand.type() == typeid(TM1Wrapper); } + bool is_tm2_wrapper(const std::any& operand) const { return operand.type() == typeid(TM2Wrapper); } // TODO: make AABB tree build parallel! void operator()(const tbb::blocked_range& range) @@ -1849,12 +1849,12 @@ struct Bounded_error_preprocessing auto& tm_wrapper = tm_wrappers[i]; if(is_tm1_wrapper(tm_wrapper)) { - TM1Wrapper& object = boost::any_cast(tm_wrapper); + TM1Wrapper& object = std::any_cast(tm_wrapper); object.build_tree(); } else if(is_tm2_wrapper(tm_wrapper)) { - TM2Wrapper& object = boost::any_cast(tm_wrapper); + TM2Wrapper& object = std::any_cast(tm_wrapper); object.build_tree(); } else @@ -2031,7 +2031,7 @@ bounded_error_squared_one_sided_Hausdorff_distance_impl(const TriangleMesh1& tm1 std::vector tm1_parts; std::vector tm1_trees; - std::vector tm_wrappers; + std::vector tm_wrappers; #endif // defined(CGAL_LINKED_WITH_TBB) && defined(CGAL_METIS_ENABLED) #ifdef CGAL_HAUSDORFF_DEBUG diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h index db87cc01bfd2..c7fa41d15d52 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_function.h @@ -34,7 +34,7 @@ #include // for C3t3_initializer #include -#include +#include namespace CGAL { class Image_3; @@ -114,7 +114,7 @@ class Mesh_function void tweak_criteria(Mesh_criteria&, Mesh_fnt::Domain_tag) {} void tweak_criteria(Mesh_criteria&, Mesh_fnt::Polyhedral_domain_tag); private: - boost::any object_to_destroy; + std::any object_to_destroy; C3t3& c3t3_; Domain* const domain_; Mesh_parameters const p_; @@ -268,10 +268,10 @@ edge_criteria(double edge_size, Mesh_fnt::Polyhedral_domain_tag) domain_->aabb_tree(), *domain_); // The sizing field object, as well as the `patch_ids_vector` are - // allocated on the heap, and the following `boost::any` object, + // allocated on the heap, and the following `std::any` object, // containing two shared pointers, is used to make the allocated // objects be destroyed at the destruction of the thread object, using - // type erasure (`boost::any`). + // type erasure (`std::any`). object_to_destroy = std::make_pair(QSharedPointer(sizing_field_ptr), QSharedPointer(patches_ids_vector_p)); diff --git a/STL_Extension/doc/STL_Extension/CGAL/Object.h b/STL_Extension/doc/STL_Extension/CGAL/Object.h index ddf919ef64a6..7a329af795f8 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Object.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Object.h @@ -19,7 +19,7 @@ this is done with the global function `make_object()`. This encapsulation mechanism requires the use of `assign` or `object_cast` to use the functionality of the encapsulated class. -This class is similar in spirit to `boost::any`. +This class is similar in spirit to `std::any`. \cgalHeading{Example} diff --git a/STL_Extension/doc/STL_Extension/STL_Extension.txt b/STL_Extension/doc/STL_Extension/STL_Extension.txt index b793a86550a7..b37ecb282e88 100644 --- a/STL_Extension/doc/STL_Extension/STL_Extension.txt +++ b/STL_Extension/doc/STL_Extension/STL_Extension.txt @@ -142,7 +142,7 @@ For handles and indices of vertices, halfedges, faces, etc., we provide speciali The class `Object` can store an object of whatever other type. It can be used by a function to return objects of different types. A mechanism to extract the stored object based on its type is also provided. -This class is similar to `boost::any`. +This class is similar to `std::any`. \section stl_uncertainty Uncertainty Management diff --git a/STL_Extension/include/CGAL/Object.h b/STL_Extension/include/CGAL/Object.h index 33a01aac875d..24d6ecc1b127 100644 --- a/STL_Extension/include/CGAL/Object.h +++ b/STL_Extension/include/CGAL/Object.h @@ -29,20 +29,20 @@ #include #include -#include +#include #include namespace CGAL { class Object { - std::shared_ptr obj; + std::shared_ptr obj; // returns an any pointer from a variant - struct Any_from_variant : public boost::static_visitor { + struct Any_from_variant : public boost::static_visitor { template - boost::any* operator()(const T& t) const { - return new boost::any(t); + std::any* operator()(const T& t) const { + return new std::any(t); } }; @@ -61,7 +61,7 @@ class Object Object() : obj() { } template - Object(T && t, private_tag) : obj(new boost::any(std::forward(t))) { } + Object(T && t, private_tag) : obj(new std::any(std::forward(t))) { } // implicit constructor from optionals containing variants template @@ -76,7 +76,7 @@ class Object template bool assign(T &t) const { - const T* res = boost::any_cast(obj.get()); + const T* res = std::any_cast(obj.get()); if (!res) return false; t = *res; return true; @@ -105,7 +105,7 @@ class Object template bool is() const { - return obj && boost::any_cast(obj.get()); + return obj && std::any_cast(obj.get()); } const std::type_info & type() const @@ -159,14 +159,14 @@ template inline const T * object_cast(const Object * o) { - return boost::any_cast((o->obj).get()); + return std::any_cast((o->obj).get()); } template inline T object_cast(const Object & o) { - const T * result = boost::any_cast((o.obj).get()); + const T * result = std::any_cast((o.obj).get()); if (!result) throw Bad_object_cast(); return *result; From 9a0bdb5d96ce92734cb9dd7dd26b4a53ba8c6f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 21:36:57 +0200 Subject: [PATCH 0362/1398] boost::variant ---> std::variant --- .../doc/AABB_tree/Concepts/AABBGeomTraits.h | 2 +- ..._polyhedron_facet_intersection_example.cpp | 4 +- .../AABB_tree/AABB_ray_shooting_example.cpp | 4 +- .../internal/AABB_ray_intersection.h | 7 +- .../AABB_tree/aabb_test_ray_intersection.cpp | 2 +- .../Arrangement_on_surface_2.txt | 16 +- .../CGAL/Arr_circular_line_arc_traits_2.h | 2 +- .../CGAL/Arr_point_location_result.h | 4 +- .../Concepts/ArrTraits--Intersect_2.h | 2 +- .../Concepts/ArrTraits--MakeXMonotone_2.h | 2 +- .../algebraic_segments.cpp | 4 +- .../circular_line_arcs.cpp | 8 +- .../edge_manipulation_curve_history.cpp | 2 +- .../incremental_insertion.cpp | 2 +- .../point_location_utils.h | 12 +- .../polycurve_bezier.cpp | 4 +- .../sgm_point_location.cpp | 6 +- .../unb_planar_vertical_decomposition.cpp | 10 +- .../include/CGAL/Arr_Bezier_curve_traits_2.h | 2 +- .../include/CGAL/Arr_accessor.h | 6 +- .../CGAL/Arr_algebraic_segment_traits_2.h | 16 +- .../include/CGAL/Arr_batched_point_location.h | 2 +- .../Arr_bounded_planar_topology_traits_2.h | 8 +- .../CGAL/Arr_circle_segment_traits_2.h | 2 +- .../include/CGAL/Arr_circular_arc_traits_2.h | 2 +- .../CGAL/Arr_circular_line_arc_traits_2.h | 97 +++--- .../include/CGAL/Arr_conic_traits_2.h | 2 +- .../include/CGAL/Arr_curve_data_traits_2.h | 18 +- .../Arr_geodesic_arc_on_sphere_traits_2.h | 8 +- .../CGAL/Arr_geometry_traits/Arr_plane_3.h | 4 +- .../Bezier_bounding_rational_traits.h | 8 +- .../Arr_geometry_traits/Bezier_x_monotone_2.h | 2 +- .../Arr_geometry_traits/Circle_segment_2.h | 2 +- .../Conic_x_monotone_arc_2.h | 4 +- .../include/CGAL/Arr_line_arc_traits_2.h | 2 +- .../include/CGAL/Arr_linear_traits_2.h | 8 +- .../CGAL/Arr_non_caching_segment_traits_2.h | 10 +- .../Arr_lm_nearest_neighbor.h | 2 +- .../Arr_trapezoid_ric_pl_impl.h | 26 +- .../CGAL/Arr_point_location/Td_X_trapezoid.h | 54 +-- .../CGAL/Arr_point_location/Td_active_edge.h | 2 +- .../Td_active_fictitious_vertex.h | 2 +- .../Arr_point_location/Td_active_trapezoid.h | 6 +- .../Arr_point_location/Td_active_vertex.h | 2 +- .../CGAL/Arr_point_location/Td_dag_node.h | 6 +- .../Arr_point_location/Td_inactive_edge.h | 2 +- .../Td_inactive_fictitious_vertex.h | 2 +- .../Td_inactive_trapezoid.h | 2 +- .../Arr_point_location/Td_inactive_vertex.h | 2 +- .../CGAL/Arr_point_location/Td_traits.h | 14 +- .../Trapezoidal_decomposition_2.h | 116 +++---- .../Trapezoidal_decomposition_2_impl.h | 318 +++++++++--------- .../include/CGAL/Arr_point_location_result.h | 10 +- .../include/CGAL/Arr_polycurve_traits_2.h | 32 +- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 2 +- .../CGAL/Arr_rational_function_traits_2.h | 2 +- .../include/CGAL/Arr_segment_traits_2.h | 8 +- .../Arr_spherical_gaussian_map_3.h | 28 +- .../Arr_transform_on_sphere.h | 6 +- .../CGAL/Arr_spherical_topology_traits_2.h | 4 +- .../Arr_bounded_planar_vert_decomp_helper.h | 2 +- .../Arr_spherical_topology_traits_2_impl.h | 8 +- .../Arr_spherical_vert_decomp_helper.h | 2 +- .../Arr_unb_planar_topology_traits_2_impl.h | 8 +- .../Arr_unb_planar_vert_decomp_helper.h | 2 +- .../include/CGAL/Arr_tracing_traits_2.h | 14 +- .../CGAL/Arr_unb_planar_topology_traits_2.h | 4 +- .../Arrangement_2/Arr_compute_zone_visitor.h | 8 +- .../CGAL/Arrangement_2/Arr_traits_adaptor_2.h | 6 +- .../Arrangement_on_surface_2_global.h | 38 +-- .../Arrangement_on_surface_2_impl.h | 6 +- .../Arrangement_2/Arrangement_zone_2_impl.h | 24 +- .../include/CGAL/Arrangement_zone_2.h | 2 +- .../Curved_kernel_via_analysis_2_functors.h | 6 +- .../Make_x_monotone_2.h | 8 +- .../Sweep_curves_adapter_2.h | 6 +- .../Surface_sweep_2/Arr_insertion_traits_2.h | 8 +- .../Surface_sweep_2/Arr_overlay_ss_visitor.h | 19 +- .../Surface_sweep_2/Arr_overlay_traits_2.h | 18 +- .../Arr_vert_decomp_ss_visitor.h | 4 +- .../Batched_point_location_test.h | 32 +- .../Arrangement_on_surface_2/IO_base_test.h | 12 +- .../Point_location_test.h | 38 +-- .../Arrangement_on_surface_2/Traits_test.h | 12 +- .../Vertical_decomposition_test.h | 36 +- .../test_arc_polycurve.cpp | 24 +- .../test_bezier_polycurve.cpp | 6 +- .../test_circular_arc_polycurve.cpp | 2 +- .../test_conic_polycurve.cpp | 4 +- .../test_vert_ray_shoot_vert_segments.cpp | 6 +- .../Arrangement_on_surface_2/test_zone.cpp | 2 +- BGL/examples/BGL_triangulation_2/dijkstra.cpp | 4 +- .../ArrDirectionalTraits--Intersect_2.h | 2 +- .../Gps_agg_meta_traits.h | 8 +- .../Gps_simplifier_traits.h | 8 +- .../Polygon_conversions.h | 4 +- .../test_general_polygon_constructions.cpp | 6 +- CGAL_ImageIO/include/CGAL/SEP_header.h | 6 +- .../include/CGAL/Cartesian_converter.h | 22 +- .../benchmark/DxfArrayBenchmarks/benchmark.h | 2 +- .../benchmarks_arrangement.cpp | 4 +- .../benchmark/arrangement_traits/benchmark.h | 2 +- .../benchmarks_arrangement.cpp | 2 +- Circular_kernel_2/benchmark/benchmark.h | 2 +- Circular_kernel_2/benchmark/benchmark_CK2.cpp | 4 +- .../benchmark/benchmarks_arrangement.cpp | 4 +- .../benchmark/bff_reader/Breader.cpp | 2 +- .../benchmark/dxf_to_bff/dxf_converter.h | 2 +- .../incremental_insertion/benchmark.h | 2 +- .../benchmarks_arrangement.cpp | 2 +- .../Circular_kernel_2/Intersection_traits.h | 18 +- .../internal_functions_on_line_arc_2.h | 12 +- .../include/CGAL/IO/Dxf_variant_reader.h | 4 +- .../CGAL/Circular_kernel_3/Circular_arc_3.h | 8 +- .../Circular_kernel_3/Circular_arc_point_3.h | 24 +- .../Circular_kernel_3/Intersection_traits.h | 20 +- .../CGAL/Circular_kernel_3/Line_arc_3.h | 12 +- .../internal_functions_on_sphere_3.h | 16 +- .../dual/halfspace_intersection_3.h | 6 +- .../Cartesian_coordinate_iterator_2.h | 10 +- .../Cartesian_coordinate_iterator_3.h | 10 +- Filtered_kernel/include/CGAL/Lazy.h | 38 +-- .../test_lazy_vector_objects.cpp | 4 +- .../internal/Qt/HyperbolicPainterOstream.h | 4 +- .../internal/Qt/HyperbolicPainterOstreamCK.h | 4 +- ...bolic_Delaunay_triangulation_CK_traits_2.h | 2 +- ...perbolic_Delaunay_triangulation_traits_2.h | 2 +- ...bolic_Delaunay_triangulation_CK_traits_2.h | 22 +- ...perbolic_Delaunay_triangulation_traits_2.h | 34 +- Installation/CHANGES.md | 1 + .../Intersections_2/variant_any_object.cpp | 14 +- .../include/CGAL/Intersection_traits.h | 18 +- .../include/CGAL/Intersection_traits_2.h | 18 +- .../CGAL/Intersections_2/Bbox_2_Bbox_2.h | 4 +- .../Intersections_2/test_intersections_2.cpp | 2 +- .../include/CGAL/Intersection_traits_3.h | 72 ++-- .../CGAL/Intersections_3/Bbox_3_Bbox_3.h | 6 +- .../internal/Bbox_3_Segment_3_intersection.h | 6 +- .../Iso_cuboid_3_Triangle_3_intersection.h | 4 +- .../Plane_3_Plane_3_Plane_3_intersection.h | 6 +- .../Segment_3_Segment_3_intersection.h | 4 +- .../Triangle_3_Triangle_3_intersection.h | 2 +- .../tetrahedron_lines_intersections_3.h | 4 +- .../intersection_test_helper.h | 4 +- .../test_intersections_Iso_cuboid_3.cpp | 18 +- .../test_intersections_Plane_3.cpp | 2 +- .../test_intersections_Tetrahedron_3.cpp | 14 +- .../Kernel_23/CGAL/Projection_traits_xy_3.h | 2 +- .../CGAL/Spherical_kernel_intersections.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/intersections.h | 16 +- Kernel_23/doc/Kernel_23/Kernel_23.txt | 6 +- .../Kernel_23/cartesian_converter.cpp | 2 +- .../examples/Kernel_23/intersection_get.cpp | 4 +- .../Kernel_23/intersection_visitor.cpp | 2 +- Kernel_23/include/CGAL/Kernel/Type_mapper.h | 16 +- .../include/CGAL/Kernel/function_objects.h | 10 +- .../Kernel_23/internal/Projection_traits_3.h | 8 +- .../internal/Projection_traits_base_3.h | 10 +- .../test/Kernel_23/include/CGAL/_test_depth.h | 2 +- Kernel_d/doc/Kernel_d/CGAL/intersections_d.h | 6 +- Kernel_d/doc/Kernel_d/Kernel_d.txt | 6 +- .../include/CGAL/Kernel_d/function_objects.h | 18 +- Mesh_3/benchmark/Mesh_3/StdAfx.h | 2 +- .../Concepts/IntersectionGeometricTraits_3.h | 4 +- .../Concepts/MeshTriangulationTraits_3.h | 6 +- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 8 +- .../Sizing_field_with_aabb_tree.h | 2 +- .../Mesh_domain_with_polyline_features_3.h | 10 +- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 6 +- .../include/CGAL/Polyhedral_mesh_domain_3.h | 12 +- .../Mesh_3/test_labeled_mesh_domain_3.cpp | 12 +- .../Minkowski_sum_2/Arr_labeled_traits_2.h | 8 +- Nef_2/include/CGAL/Nef_2/geninfo.h | 2 +- ...xact_triangulation_euclidean_traits_xy_3.h | 12 +- ...xact_triangulation_euclidean_traits_xz_3.h | 12 +- ...xact_triangulation_euclidean_traits_yz_3.h | 12 +- .../CGAL/NewKernel_d/KernelD_converter.h | 2 +- .../OTR_2/Reconstruction_triangulation_2.h | 2 +- .../Protect_edges_sizing_field.h | 14 +- .../include/CGAL/refine_periodic_3_mesh_3.h | 2 +- .../internal/Qt/HyperbolicPainterOstream.h | 4 +- .../hyperbolic_free_motion_animation.h | 6 +- ...perbolic_Delaunay_triangulation_traits_2.h | 24 +- .../include/CGAL/structure_point_set.h | 14 +- .../Corefinement/intersection_nodes.h | 4 +- .../Axis_parallel_plane_traits.h | 4 +- .../CGAL/Polygon_mesh_processing/locate.h | 30 +- .../include/CGAL/Polygon_mesh_slicer.h | 22 +- .../test_pmp_locate.cpp | 6 +- .../Plugins/Mesh_3/C3t3_io_plugin.cpp | 6 +- .../Plugins/Mesh_3/Mesh_3_plugin.cpp | 2 +- .../PMP/Surface_intersection_plugin.cpp | 8 +- Polyhedron/demo/Polyhedron/Scene.h | 2 +- .../Polyhedron/Scene_surface_mesh_item.cpp | 8 +- .../demo/Polyhedron/include/id_printing.h | 4 +- SMDS_3/include/CGAL/IO/output_to_vtu.h | 16 +- .../internal/Handle_IO_for_pair_of_int.h | 10 +- .../CGAL/SMDS_3/internal/indices_management.h | 23 +- SMDS_3/include/CGAL/SMDS_3/io_signature.h | 14 +- .../CGAL/Simplicial_mesh_vertex_base_3.h | 4 +- SMDS_3/test/SMDS_3/data/c3t3_io-hetero.cgal | 2 +- SMDS_3/test/SMDS_3/test_c3t3_io.cpp | 6 +- STL_Extension/doc/STL_Extension/CGAL/Object.h | 8 +- .../doc/STL_Extension/CGAL/iterator.h | 8 +- .../Dispatch_output_iterator.cpp | 4 +- STL_Extension/include/CGAL/Object.h | 16 +- STL_Extension/include/CGAL/iterator.h | 16 +- .../test/STL_Extension/test_Object.cpp | 8 +- .../STL_Extension/test_dispatch_output.cpp | 4 +- .../internal/Contour_base_2.h | 4 +- .../examples/Surface_mesh/sm_aabbtree.cpp | 8 +- .../internal/SDF_calculation.h | 4 +- .../Concepts/SurfaceMeshShortestPathTraits.h | 2 +- .../shortest_path_sequence.cpp | 11 +- .../Surface_mesh_shortest_path.h | 12 +- .../function_objects.h | 4 +- .../include/CGAL/Surface_sweep_2.h | 2 +- .../Surface_sweep_2/Surface_sweep_2_impl.h | 14 +- .../Surface_sweep_2/Surface_sweep_2_utils.h | 6 +- .../internal/tetrahedral_remeshing_helpers.h | 2 +- .../ConstrainedTriangulationTraits_2.h | 2 +- .../CGAL/Constrained_triangulation_2.h | 6 +- .../simple_polygon_visibility_2.cpp | 2 +- .../CGAL/Simple_polygon_visibility_2.h | 4 +- .../CGAL/Voronoi_diagram_2.h | 2 +- .../Concepts/AdaptationTraits_2.h | 2 +- .../Voronoi_diagram_2/vd_2_point_location.cpp | 6 +- .../vd_2_point_location_sdg_linf.cpp | 6 +- .../include/CGAL/Voronoi_diagram_2.h | 10 +- .../Apollonius_graph_nearest_site_2.h | 4 +- .../Delaunay_triangulation_nearest_site_2.h | 4 +- .../Regular_triangulation_nearest_site_2.h | 4 +- .../Segment_Delaunay_graph_nearest_site_2.h | 4 +- .../include/vda_test_concept.h | 8 +- .../include/vda_test_locate.h | 14 +- .../Voronoi_diagram_2/include/vda_test_vda.h | 6 +- 236 files changed, 1249 insertions(+), 1273 deletions(-) diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h index e6d51ffdb756..5c7a45edb671 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h @@ -47,7 +47,7 @@ Provides the operator: `return_type operator()(const Query& q, const Primitive::Datum& d)`, which computes the intersection between `q` and `d`. The type of the returned object -must be a `std::optional` of a `boost::variant` of the possible intersection types. +must be a `std::optional` of a `std::variant` of the possible intersection types. */ typedef unspecified_type Intersect_3; diff --git a/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp b/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp index e01e49c0b6ec..6ced34c02340 100644 --- a/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp +++ b/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp @@ -57,7 +57,7 @@ int main() if(intersection) { // gets intersection object - const Point* p = boost::get(&(intersection->first)); + const Point* p = std::get_if(&(intersection->first)); if(p) std::cout << "intersection object is a point " << *p << std::endl; @@ -81,7 +81,7 @@ int main() if(plane_intersection) { - if(boost::get(&(plane_intersection->first))) + if(std::get_if(&(plane_intersection->first))) std::cout << "intersection object is a segment" << std::endl; } diff --git a/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp b/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp index fc450abd5a80..e9ed0fe87c5d 100644 --- a/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp +++ b/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp @@ -70,8 +70,8 @@ int main(int argc, char* argv[]) Ray_intersection intersection = tree.first_intersection(ray, skip); if(intersection) { - if(boost::get(&(intersection->first))){ - const Point* p = boost::get(&(intersection->first) ); + if(std::get_if(&(intersection->first))){ + const Point* p = std::get_if(&(intersection->first) ); std::cout << *p << std::endl; } } diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h index 1bc03ff4cf4d..075d48ffda33 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h @@ -20,7 +20,6 @@ #include #include #include -#include # if defined(BOOST_MSVC) # pragma warning(push) # pragma warning(disable: 4996) @@ -84,7 +83,7 @@ class AABB_ray_intersection { if(!skip(current.node->left_data().id()) /* && do_intersect_obj(query, current.node->left_data()) */) { intersection = intersection_obj(query, current.node->left_data()); if(intersection) { - FT ray_distance = boost::apply_visitor(param_visitor, intersection->first); + FT ray_distance = std::visit(param_visitor, intersection->first); if(ray_distance < t) { t = ray_distance; p = intersection; @@ -96,7 +95,7 @@ class AABB_ray_intersection { if(!skip(current.node->right_data().id()) /* && do_intersect_obj(query, current.node->right_data()) */) { intersection = intersection_obj(query, current.node->right_data()); if(intersection) { - FT ray_distance = boost::apply_visitor(param_visitor, intersection->first); + FT ray_distance = std::visit(param_visitor, intersection->first); if(ray_distance < t) { t = ray_distance; p = intersection; @@ -111,7 +110,7 @@ class AABB_ray_intersection { if(!skip(current.node->left_data().id()) /* && do_intersect_obj(query, current.node->left_data()) */) { intersection = intersection_obj(query, current.node->left_data()); if(intersection) { - FT ray_distance = boost::apply_visitor(param_visitor, intersection->first); + FT ray_distance = std::visit(param_visitor, intersection->first); if(ray_distance < t) { t = ray_distance; p = intersection; diff --git a/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp b/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp index cbe92baaf705..da3b5436eddf 100644 --- a/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp +++ b/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp @@ -51,7 +51,7 @@ min_intersection(const Tree& tree, const Ray& ray) { > mini = std::nullopt; for(IntersectionVector::iterator it2 = all_intersections.begin(); it2 != all_intersections.end(); ++it2) { - if(Point* point = boost::get(&(it2->first))) { + if(Point* point = std::get_if(&(it2->first))) { Vector i_ray(*point, ray.source()); Tree::FT new_distance = i_ray.squared_length(); if(new_distance < min_distance) { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index 2050328161b8..bd0c7339172c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -1320,7 +1320,7 @@ Arrangement_on_surface_2::Face_const_handle `Face_const_handle`\endlink. Depending on whether the query point is located inside a face, lies on an edge, or coincides with a vertex, the appropriate handle can be obtained with value retrieval -by `boost::get` as demonstrated in the example below. +by `std::get` as demonstrated in the example below. Note that the handles returned by the \link ArrangementPointLocation_2::locate() `locate()`\endlink functions are @@ -1361,7 +1361,7 @@ The function template `locate_point()` calls an instance of the function template `print_point_location()`, which inserts the result of the query into the standard output-stream. It is listed below, and defined in the header file `point_location_utils.h`. -Observe how the function `boost::get()` is used to cast the +Observe how the function `std::get()` is used to cast the resulting object into a handle to an arrangement feature. The point-location object `pl` is assumed to be already attached to an arrangement. @@ -1383,13 +1383,13 @@ void print_point_location const Face_const_handle* f; std::cout << "The point (" << q << ") is located "; - if (f = boost::get(&obj)) // located inside a face + if (f = std::get_if(&obj)) // located inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face.\n"; - else if (e = boost::get(&obj)) // located on an edge + else if (e = std::get_if(&obj)) // located on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; - else if (v = boost::get(&obj)) // located on a vertex + else if (v = std::get_if(&obj)) // located on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; else CGAL_error_msg("Invalid object."); @@ -1603,12 +1603,12 @@ void shoot_vertical_ray(const RayShoot& vrs, const Face_const_handle* f; std::cout << "Shooting up from (" << q << ") : "; - if (v = boost::get(&obj)) // we hit a vertex + if (v = std::get_if(&obj)) // we hit a vertex std::cout << "hit " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; - else if (e = boost::get(&obj)) // we hit an edge + else if (e = std::get_if(&obj)) // we hit an edge std::cout << "hit an edge: " << (*e)->curve() << std::endl; - else if (f = boost::get(&obj)) { // we hit nothing + else if (f = std::get_if(&obj)) { // we hit nothing CGAL_assertion((*f)->is_unbounded()); std::cout << "hit nothing.\n"; } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h index b12a51541cf4..90abb7e19e2b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h @@ -10,7 +10,7 @@ of both types `CGAL::Line_arc_2` or `CGAL::Circular_arc_2`. -It uses the boost::variant. +It uses the std::variant. \cgalModels `ArrangementTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h index 20a6787d7e5c..32b4e443326e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h @@ -11,7 +11,7 @@ is included. - `CGAL_ARR_POINT_LOCATION_VERSION` == 1, the result type is set to be `CGAL::Object`. - `CGAL_ARR_POINT_LOCATION_VERSION` == 2, the result type is set to be -`boost::variant`, where `Vertex_const_handle`, `Halfedge_const_handle`, and +`std::variant`, where `Vertex_const_handle`, `Halfedge_const_handle`, and `Face_const_handle` are the corresponding nested types in a `CGAL::Arrangement_2` instance. @@ -44,7 +44,7 @@ struct Arr_point_location_result { /*! The type of the arrangement feature that is the result of a * point-location query or a vertical ray-shoot query, namely, - * `boost::variant` + * `std::variant` * if `::CGAL_ARR_POINT_LOCATION_VERSION` == 2, which is the default, otherwise * `CGAL::Object`. */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h index 0350b6ce6543..a4bfaebef7ac 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h @@ -17,7 +17,7 @@ class Intersect_2 { /*! computes the intersections of `xc1` and `xc2` and writes them in an * ascending lexicographic \f$xy\f$-order into a range beginning at * `oi`. The type `OutputIterator` must dereference a polymorphic object of - * type `boost::variant` that wraps objects of type either type + * type `std::variant` that wraps objects of type either type * `pair` or * `ArrTraits::X_monotone_curve_2`. An object of the former type represents an * intersection point with its multiplicity (in case the multiplicity is diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h index db0df3c8cc80..32c5efccb0b3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h @@ -16,7 +16,7 @@ class MakeXMonotone_2 { /*! subdivides the input curve `c` into \f$x\f$-monotone subcurves and * isolated points, and inserts the results into a range beginning at the given * output iterator `oi`. The type `OutputIterator` dereferences a - * `boost::variant` that wraps either an `ArrTraits::Point_2` object or an + * `std::variant` that wraps either an `ArrTraits::Point_2` object or an * `ArrTraits::X_monotone_curve_2` object. The operator returns a past-the-end * iterator for the output sequence. */ diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp index 95eb729bb66f..c1bc7c4779d9 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp @@ -29,7 +29,7 @@ typedef Traits::Algebraic_real_1 Algebraic_real; typedef Traits::X_monotone_curve_2 X_monotone_curve; typedef Traits::Point_2 Point; -typedef boost::variant Make_x_monotone_result; +typedef std::variant Make_x_monotone_result; int main() { Traits traits; @@ -52,7 +52,7 @@ int main() { // but not in this case). std::vector segs; for(size_t i = 0; i < pre_segs.size(); ++i) { - auto* curr_p = boost::get(&pre_segs[i]); + auto* curr_p = std::get(&pre_segs[i]); assert(curr_p); segs.push_back(*curr_p); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp index 1e7854b74826..735403352577 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include @@ -25,7 +25,7 @@ typedef Circular_k::Circle_2 Circle_2; typedef Circular_k::Circular_arc_2 Circular_arc_2; typedef Circular_k::Line_arc_2 Line_arc_2; -typedef boost::variant< Circular_arc_2, Line_arc_2> Arc_2; +typedef std::variant< Circular_arc_2, Line_arc_2> Arc_2; typedef std::vector< Arc_2> ArcContainer; typedef CGAL::Arr_circular_line_arc_traits_2 Traits; @@ -52,7 +52,7 @@ int main() { } while((x1 == x2) && (y1 == y2)); std::cout << x1 << " " << y1 << " " << x2 << " " << y2 << std::endl; - boost::variant< Circular_arc_2, Line_arc_2 > v = + std::variant< Circular_arc_2, Line_arc_2 > v = Line_arc_2(Point_2(x1,y1), Point_2(x2,y2)); ac.push_back( v); } @@ -63,7 +63,7 @@ int main() { y1 = theRandom.get_int(random_min,random_max); } while(x1==0 && y1==0); - boost::variant< Circular_arc_2, Line_arc_2 > v = + std::variant< Circular_arc_2, Line_arc_2 > v = Circle_2( Point_2(x1,y1), x1*x1 + y1*y1); ac.push_back(v); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp index e89d8b57d89a..c1ee293fd271 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp @@ -45,7 +45,7 @@ int main() { Point_location pl(arr); const Point q{_7_halves, 7}; Point_location::result_type obj = pl.locate(q); - auto* e = boost::get(&obj); + auto* e = std::get(&obj); // Split the edge e to two edges e1 and e2; auto e1 = arr.split_edge(arr.non_const_handle(*e), q); diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp index 51112be6c50f..425b187d17ed 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp @@ -32,7 +32,7 @@ int main() { // the boundary of the face that contains it. Point q(4, 1); auto obj = pl.locate(q); - auto* f = boost::get(&obj); + auto* f = std::get(&obj); std::cout << "The query point (" << q << ") is located in: "; print_face(*f); diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h index 70bc38bce3f3..f50236bb3e51 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h @@ -46,13 +46,13 @@ void print_point_location const Face_const_handle* f; std::cout << "The point (" << q << ") is located "; - if ((f = boost::get(&obj))) // inside a face + if ((f = std::get(&obj))) // inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face." << std::endl; - else if ((e = boost::get(&obj))) // on an edge + else if ((e = std::get(&obj))) // on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; - else if ((v = boost::get(&obj))) // on a vertex + else if ((v = std::get(&obj))) // on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; else CGAL_error_msg("Invalid object."); @@ -101,12 +101,12 @@ void shoot_vertical_ray(const VerticalRayShooting& vrs, std::cout << "Shooting up from (" << q << ") : hit "; - if ((v = boost::get(&obj))) // hit a vertex + if ((v = std::get(&obj))) // hit a vertex std::cout << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; - else if ((e = boost::get(&obj)) ) // hit an edge + else if ((e = std::get(&obj)) ) // hit an edge std::cout << "an edge: " << (*e)->curve() << std::endl; - else if ((f = boost::get(&obj))) { // hit nothing + else if ((f = std::get(&obj))) { // hit nothing assert((*f)->is_unbounded()); std::cout << "nothing." << std::endl; } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp index 287fd51786ac..bc4168f2da0e 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp @@ -24,7 +24,7 @@ typedef Polycurve_bezier_traits::Point_2 Point; typedef Polycurve_bezier_traits::X_monotone_curve_2 X_mono_polycurve; typedef CGAL::Arrangement_2 Arrangement_2; -typedef boost::variant Make_x_monotone_result; +typedef std::variant Make_x_monotone_result; int main() { Polycurve_bezier_traits pc_traits; @@ -58,7 +58,7 @@ int main() { // convert it into x-monotone bezier curve. std::vector obj_vector; bezier_traits.make_x_monotone_2_object()(B, std::back_inserter(obj_vector)); - auto* x_seg_p = boost::get(&obj_vector[0]); + auto* x_seg_p = std::get(&obj_vector[0]); x_curves.push_back(*x_seg_p); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp index 1ba6d9b52322..5cd1a8367c24 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp @@ -99,15 +99,15 @@ int main() { for (auto it = results.begin(); it != results.end(); ++it) { std::cout << "The point (" << it->first << ") is located "; if (const Face_const_handle* f = - boost::get(&(it->second))) // inside a face + std::get(&(it->second))) // inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face.\n"; else if (const Halfedge_const_handle* e = - boost::get(&(it->second))) // on an edge + std::get(&(it->second))) // on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; else if (const Vertex_const_handle* v = - boost::get(&(it->second))) // on a vertex + std::get(&(it->second))) // on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp index 95bdc262b299..d51f4fae3894 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp @@ -8,7 +8,7 @@ #include "arr_linear.h" -typedef boost::variant Cell_type; typedef std::optional Vert_decomp_type; typedef std::pair Vert_decomp_pair; @@ -41,10 +41,10 @@ int main() { std::cout << " feature below: "; if (! curr.first) std::cout << "EMPTY"; else { - auto* vh = boost::get(&*(curr.first));; + auto* vh = std::get(&*(curr.first));; if (vh) std::cout << '(' << (*vh)->point() << ')'; else { - auto* hh = boost::get(&*(curr.first)); + auto* hh = std::get(&*(curr.first)); if (! (*hh)->is_fictitious()) std::cout << '[' << (*hh)->curve() << ']'; else std::cout << "NONE"; @@ -54,10 +54,10 @@ int main() { std::cout << " feature above: "; if (! curr.second) std::cout << "EMPTY\n"; else { - auto* vh = boost::get(&*(curr.second));; + auto* vh = std::get(&*(curr.second));; if (vh) std::cout << '(' << (*vh)->point() << ")\n"; else { - auto* hh = boost::get(&*(curr.second)); + auto* hh = std::get(&*(curr.second)); if (! (*hh)->is_fictitious()) std::cout << '[' << (*hh)->curve() << "]\n"; else std::cout << "NONE\n"; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_Bezier_curve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_Bezier_curve_traits_2.h index 7aedff1530de..461cadf34a10 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_Bezier_curve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_Bezier_curve_traits_2.h @@ -499,7 +499,7 @@ class Arr_Bezier_curve_traits_2 template OutputIterator operator() (const Curve_2& B, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; typedef typename Bounding_traits::Vertical_tangency_point Vertical_tangency_point; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h b/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h index 90ae69d90cac..202ca448b5e9 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h @@ -114,13 +114,13 @@ class Arr_accessor { auto obj = p_arr->topology_traits()->locate_curve_end(cv, ind, ps_x, ps_y); // Return a handle to the DCEL feature. - DFace** f_p = boost::get(&obj); + DFace** f_p = std::get(&obj); if (f_p) return (Pl_result::make_result(p_arr->_const_handle_for(*f_p))); - DHalfedge** he_p = boost::get(&obj); + DHalfedge** he_p = std::get(&obj); if (he_p) return (Pl_result::make_result(p_arr->_const_handle_for(*he_p))); - DVertex** v_p = boost::get(&obj); + DVertex** v_p = std::get(&obj); if (v_p) return (Pl_result::make_result(p_arr->_const_handle_for(*v_p))); // We should never reach here: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h index 02e44f64cef6..b1678fe4acdd 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h @@ -271,7 +271,7 @@ class Arr_algebraic_segment_traits_2 { std::optional end, OutputIterator out) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; //CGAL_assertion(is_one_one(cv,p)); @@ -286,11 +286,11 @@ class Arr_algebraic_segment_traits_2 { this->_ckva()->make_x_monotone_2_object()(cv, std::back_inserter(arcs)); auto it = arcs.begin(); auto helper = it; - const auto* it_seg_p = boost::get(&(*it)); + const auto* it_seg_p = std::get(&(*it)); while (it != arcs.end()) { if ( on_arc(p, *it_seg_p) ) break; it++; - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); } bool left_on_arc = start && on_arc(start.get(), *it_seg_p); @@ -348,11 +348,11 @@ class Arr_algebraic_segment_traits_2 { } CGAL_assertion(it != arcs.begin()); it--; - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); while (! on_arc(point_it, *it_seg_p)) { CGAL_assertion(it != arcs.begin()); it--; - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); } if (start && on_arc(start.get(),*it_seg_p)) { segs.push_front(it_seg_p->trim(start.get(), right(*it_seg_p))); @@ -365,7 +365,7 @@ class Arr_algebraic_segment_traits_2 { } if (! right_on_arc) { it = helper; // reset - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); Point_2 point_it; while (true) { if (it_seg_p->is_finite(CGAL::ARR_MAX_END) && @@ -378,11 +378,11 @@ class Arr_algebraic_segment_traits_2 { } it++; CGAL_assertion(it != arcs.end()); - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); while(! on_arc(point_it, *it_seg_p)) { it++; CGAL_assertion(it != arcs.end()); - it_seg_p = boost::get(&(*it)); + it_seg_p = std::get(&(*it)); } if(end && on_arc(end.get(),*it_seg_p)) { segs.push_back(it_seg_p->trim(left(*it_seg_p),end.get())); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h index 81fec7a37855..e1f9ad986a31 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h @@ -41,7 +41,7 @@ namespace Ss2 = Surface_sweep_2; * \param oi Output: An output iterator for the query results. * \pre The value-type of PointsIterator is Arrangement::Point_2, * and the value-type of OutputIterator is is pair, - * where Result is std::optional >. * It represents the arrangement feature containing the point. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h index e7aea3a8d19d..8f1339b6a227 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h @@ -14,7 +14,7 @@ #ifndef CGAL_ARR_BOUNDED_PLANAR_TOPOLOGY_TRAITS_2_H #define CGAL_ARR_BOUNDED_PLANAR_TOPOLOGY_TRAITS_2_H -#include +#include #include @@ -305,7 +305,7 @@ class Arr_bounded_planar_topology_traits_2 : * \pre The curve has a boundary condition in either x or y. * \return An object that wraps the curve end. */ - std::optional > + std::optional > place_boundary_vertex(Face*, const X_monotone_curve_2&, Arr_curve_end, @@ -347,13 +347,13 @@ class Arr_bounded_planar_topology_traits_2 : * \pre The curve end is incident to the boundary. * \return An object that contains the curve end. */ - boost::variant + std::variant locate_curve_end(const X_monotone_curve_2&, Arr_curve_end, Arr_parameter_space /* ps_x */, Arr_parameter_space /* ps_y */) { - typedef boost::variant Result; + typedef std::variant Result; // This function should never be called: CGAL_error(); Vertex* v(nullptr); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h index 3dabf7971842..7eb42ef70845 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h @@ -404,7 +404,7 @@ class Arr_circle_segment_traits_2 { template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; // Increment the serial number of the curve cv, which will serve as its diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h index 6827889a4f1b..f790bcac2460 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h @@ -178,7 +178,7 @@ class Arr_circular_arc_traits_2 { template OutputIterator operator()(const Curve_2& arc, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::vector objs; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index e913bc9f7db5..4efc598b81d4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -35,7 +35,7 @@ #include -#include +#include #include #include @@ -51,17 +51,17 @@ namespace CGAL { OutputIterator res2) { typedef typename CK::Circular_arc_point_2 Point_2; - typedef boost::variant X_monotone_curve_2; - typedef boost::variant + typedef std::variant X_monotone_curve_2; + typedef std::variant Make_x_monotone_result; for (auto it = res1.begin(); it != res1.end(); ++it) { if (const Arc1* arc = CGAL::object_cast(&*it)) { - boost::variant v = *arc; + std::variant v = *arc; *res2++ = Make_x_monotone_result(v); } else if (const Arc2* line = CGAL::object_cast(&*it)) { - boost::variant v = *line; + std::variant v = *line; *res2++ = Make_x_monotone_result(v); } else if (const Point_2* p = CGAL::object_cast(&*it)) { @@ -81,27 +81,27 @@ namespace CGAL { Circular_arc_point_2; result_type - operator()(const boost::variant< Arc1, Arc2 > &a1, - const boost::variant< Arc1, Arc2 > &a2, + operator()(const std::variant< Arc1, Arc2 > &a1, + const std::variant< Arc1, Arc2 > &a2, const Circular_arc_point_2 &p) const { - if ( const Arc1* arc1 = boost::get( &a1 ) ){ - if ( const Arc1* arc2 = boost::get( &a2 ) ){ + if ( const Arc1* arc1 = std::get( &a1 ) ){ + if ( const Arc1* arc2 = std::get( &a2 ) ){ return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2, p); } else { - const Arc2* arc2e = boost::get( &a2 ); + const Arc2* arc2e = std::get( &a2 ); return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2e, p); } } - const Arc2* arc1 = boost::get( &a1 ); - if ( const Arc1* arc2 = boost::get( &a2 ) ){ + const Arc2* arc1 = std::get( &a1 ); + if ( const Arc1* arc2 = std::get( &a2 ) ){ return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2, p); } - const Arc2* arc2e = boost::get( &a2 ); + const Arc2* arc2e = std::get( &a2 ); return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2e, p); } @@ -110,7 +110,6 @@ namespace CGAL { template class Variant_Equal_2 - : public boost::static_visitor { public : @@ -136,7 +135,7 @@ namespace CGAL { : public CircularKernel::Equal_2 { public: - typedef boost::variant< Arc1, Arc2 > Curve_2; + typedef std::variant< Arc1, Arc2 > Curve_2; typedef bool result_type; using CircularKernel::Equal_2::operator(); typedef typename CircularKernel::Circular_arc_point_2 @@ -169,7 +168,7 @@ namespace CGAL { result_type operator()(const Curve_2 &a0, const Curve_2 &a1) const { - return boost::apply_visitor + return std::visit ( Variant_Equal_2(), a0, a1 ); } @@ -188,20 +187,20 @@ namespace CGAL { result_type operator() (const Circular_arc_point_2 &p, - const boost::variant< Arc1, Arc2 > &A1) const + const std::variant< Arc1, Arc2 > &A1) const { - if ( const Arc1* arc1 = boost::get( &A1 ) ){ + if ( const Arc1* arc1 = std::get( &A1 ) ){ return CircularKernel().compare_y_at_x_2_object()(p, *arc1); } else { - const Arc2* arc2 = boost::get( &A1 ); + const Arc2* arc2 = std::get( &A1 ); return CircularKernel().compare_y_at_x_2_object()(p, *arc2); } } }; template - class Variant_Do_overlap_2 : public boost::static_visitor + class Variant_Do_overlap_2 { public: template < typename T > @@ -229,10 +228,10 @@ namespace CGAL { typedef bool result_type; result_type - operator()(const boost::variant< Arc1, Arc2 > &A0, - const boost::variant< Arc1, Arc2 > &A1) const + operator()(const std::variant< Arc1, Arc2 > &A0, + const std::variant< Arc1, Arc2 > &A1) const { - return boost::apply_visitor + return std::visit ( Variant_Do_overlap_2(), A0, A1 ); } }; @@ -248,10 +247,10 @@ namespace CGAL { template < class OutputIterator,class Not_X_Monotone > OutputIterator - operator()(const boost::variant &A, + operator()(const std::variant &A, OutputIterator res) const { - if ( const Arc1* arc1 = boost::get( &A ) ) { + if ( const Arc1* arc1 = std::get( &A ) ) { std::vector container; CircularKernel(). make_x_monotone_2_object()(*arc1,std::back_inserter(container)); @@ -259,7 +258,7 @@ namespace CGAL { (container, res); } else { - const Arc2* arc2 = boost::get( &A ); + const Arc2* arc2 = std::get( &A ); std::vector container; CircularKernel(). make_x_monotone_2_object()(*arc2,std::back_inserter(container)); @@ -278,23 +277,23 @@ namespace CGAL { template < class OutputIterator > OutputIterator - operator()(const boost::variant< Arc1, Arc2 > &c1, - const boost::variant< Arc1, Arc2 > &c2, + operator()(const std::variant< Arc1, Arc2 > &c1, + const std::variant< Arc1, Arc2 > &c2, OutputIterator oi) const { - if ( const Arc1* arc1 = boost::get( &c1 ) ){ - if ( const Arc1* arc2 = boost::get( &c2 ) ){ + if ( const Arc1* arc1 = std::get( &c1 ) ){ + if ( const Arc1* arc2 = std::get( &c2 ) ){ return CircularKernel().intersect_2_object()(*arc1, *arc2, oi); } - const Arc2* arc2 = boost::get( &c2 ); + const Arc2* arc2 = std::get( &c2 ); return CircularKernel().intersect_2_object()(*arc1, *arc2, oi); } - const Arc2* arc1e = boost::get( &c1 ); - if ( const Arc1* arc2 = boost::get( &c2 ) ){ + const Arc2* arc1e = std::get( &c1 ); + if ( const Arc1* arc2 = std::get( &c2 ) ){ return CircularKernel().intersect_2_object()(*arc1e, *arc2, oi); } - const Arc2* arc2 = boost::get( &c2 ); + const Arc2* arc2 = std::get( &c2 ); return CircularKernel().intersect_2_object()(*arc1e, *arc2, oi); } @@ -309,13 +308,13 @@ namespace CGAL { Circular_arc_point_2; typedef void result_type; result_type - operator()(const boost::variant< Arc1, Arc2 > &A, + operator()(const std::variant< Arc1, Arc2 > &A, const Circular_arc_point_2 &p, - boost::variant< Arc1, Arc2 > &ca1, - boost::variant< Arc1, Arc2 > &ca2) const + std::variant< Arc1, Arc2 > &ca1, + std::variant< Arc1, Arc2 > &ca2) const { // TODO : optimize by extracting the references from the variants ? - if ( const Arc1* arc1 = boost::get( &A ) ){ + if ( const Arc1* arc1 = std::get( &A ) ){ Arc1 carc1; Arc1 carc2; CircularKernel().split_2_object()(*arc1, p, carc1, carc2); @@ -325,7 +324,7 @@ namespace CGAL { } else{ - const Arc2* arc2 = boost::get( &A ); + const Arc2* arc2 = std::get( &A ); Arc2 cline1; Arc2 cline2; CircularKernel().split_2_object()(*arc2, p, cline1, cline2); @@ -340,7 +339,6 @@ namespace CGAL { template class Variant_Construct_min_vertex_2 - : public boost::static_visitor { typedef typename CircularKernel::Circular_arc_point_2 @@ -372,9 +370,9 @@ namespace CGAL { //typename boost::remove_reference::type result_type - operator() (const boost::variant< Arc1, Arc2 > & cv) const + operator() (const std::variant< Arc1, Arc2 > & cv) const { - return boost::apply_visitor + return std::visit ( Variant_Construct_min_vertex_2(), cv ); } }; @@ -385,8 +383,6 @@ namespace CGAL { template class Variant_Construct_max_vertex_2 - : public boost::static_visitor { typedef typename CircularKernel::Circular_arc_point_2 Circular_arc_point_2; @@ -422,16 +418,15 @@ namespace CGAL { //typename boost::remove_reference::type result_type - operator() (const boost::variant< Arc1, Arc2 > & cv) const + operator() (const std::variant< Arc1, Arc2 > & cv) const { - return boost::apply_visitor + return std::visit ( Variant_Construct_max_vertex_2(), cv ); } }; template class Variant_Is_vertical_2 - : public boost::static_visitor { public : @@ -449,9 +444,9 @@ namespace CGAL { public: typedef bool result_type; - bool operator() (const boost::variant< Arc1, Arc2 >& cv) const + bool operator() (const std::variant< Arc1, Arc2 >& cv) const { - return boost::apply_visitor + return std::visit ( Variant_Is_vertical_2(), cv ); } }; @@ -499,8 +494,8 @@ namespace CGAL { typedef internal_Argt_traits::Not_X_Monotone Not_X_Monotone; - typedef boost::variant< Arc1, Arc2, Not_X_Monotone > Curve_2; - typedef boost::variant< Arc1, Arc2 > X_monotone_curve_2; + typedef std::variant< Arc1, Arc2, Not_X_Monotone > Curve_2; + typedef std::variant< Arc1, Arc2 > X_monotone_curve_2; private: CircularKernel ck; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h index 8c3e7f6533e5..19b2ade6c275 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h @@ -469,7 +469,7 @@ class Arr_conic_traits_2 template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; // Increment the serial number of the curve cv, which will serve as its diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h index 1455a276f6db..f487c0552215 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h @@ -23,7 +23,7 @@ #include -#include +#include #include #include @@ -126,9 +126,9 @@ class Arr_curve_data_traits_2 : public Traits_ { template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Base_make_x_monotone_result; - typedef boost::variant + typedef std::variant Make_x_monotone_result; // Make the original curve x-monotone. @@ -138,12 +138,12 @@ class Arr_curve_data_traits_2 : public Traits_ { // Attach the data to each of the resulting x-monotone curves. X_monotone_curve_data xdata = Convert()(cv.data()); for (const auto& base_obj : base_objects) { - if (const auto* bxcv = boost::get(&base_obj)) { + if (const auto* bxcv = std::get(&base_obj)) { *oi++ = Make_x_monotone_result(X_monotone_curve_2(*bxcv, xdata)); continue; } // Current object is an isolated point: Leave it as is. - const auto* bp = boost::get(&base_obj); + const auto* bp = std::get(&base_obj); CGAL_assertion(bp); *oi++ = Make_x_monotone_result(*bp); } @@ -208,9 +208,9 @@ class Arr_curve_data_traits_2 : public Traits_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; - typedef boost::variant + typedef std::variant Intersection_base_result; // Use the base functor to obtain all intersection objects. @@ -223,7 +223,7 @@ class Arr_curve_data_traits_2 : public Traits_ { // Go over all intersection objects and prepare the output. for (const auto& item : base_objects) { const Base_x_monotone_curve_2* base_cv = - boost::get(&item); + std::get(&item); if (base_cv != nullptr) { // The current intersection object is an overlapping x-monotone // curve: Merge the data fields of both intersecting curves and @@ -234,7 +234,7 @@ class Arr_curve_data_traits_2 : public Traits_ { } // The current intersection object is an intersection point: // Copy it as is. - const Intersection_point* ip = boost::get(&item); + const Intersection_point* ip = std::get(&item); *oi++ = Intersection_result(*ip); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index 1468d38bc67e..3d4634ee6652 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -26,7 +26,7 @@ #include -#include +#include #include #include @@ -2062,7 +2062,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ template OutputIterator operator()(const Curve_2& c, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; // std::cout << "full: " << c.is_full() << std::endl; // std::cout << "vert: " << c.is_vertical() << std::endl; @@ -2320,7 +2320,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; const Kernel& kernel = m_traits; typename Kernel::Equal_2 equal = kernel.equal_2_object(); @@ -2559,7 +2559,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { typedef typename Kernel::Equal_3 Equal_3; typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; const Kernel& kernel = m_traits; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Arr_plane_3.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Arr_plane_3.h index ba37b21f1870..d966a52b41a0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Arr_plane_3.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Arr_plane_3.h @@ -201,7 +201,7 @@ class Arr_plane_3 { * intersection or a plane in case plane1 and plane2 coincide. */ template -boost::variant > +std::variant > intersect(const Arr_plane_3 & plane1, const Arr_plane_3 & plane2) { @@ -209,7 +209,7 @@ intersect(const Arr_plane_3 & plane1, typedef typename Kernel::Direction_3 Direction_3; typedef typename Kernel::Line_3 Line_3; typedef typename Kernel::FT FT; - typedef boost::variant > Intersection_result; + typedef std::variant > Intersection_result; // We know that the plane goes through the origin const FT& a1 = plane1.a(); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h index e287978f9e30..8b3abe1f57f2 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h @@ -1264,22 +1264,22 @@ class Bezier_bounding_rational_traits Control_points aux_vec; auto res1 = f_intersect(skew1a, skew2a); - const Point_2* p1 = boost::get(&*res1); + const Point_2* p1 = std::get(&*res1); if (! p1) CGAL_error(); aux_vec.push_back(*p1); auto res2 = f_intersect(skew1a, skew2b); - const Point_2* p2 = boost::get(&*res2); + const Point_2* p2 = std::get(&*res2); if (! p2) CGAL_error(); aux_vec.push_back(*p2); auto res3 = f_intersect(skew1b, skew2a); - const Point_2* p3 = boost::get(&*res3); + const Point_2* p3 = std::get(&*res3); if (! p3) CGAL_error(); aux_vec.push_back(*p3); auto res4 = f_intersect (skew1b, skew2b); - const Point_2* p4 = boost::get(&*res4); + const Point_2* p4 = std::get(&*res4); if (! p4) CGAL_error(); aux_vec.push_back(*p4); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h index cf7d00135b0d..12f3f3a7c66d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h @@ -318,7 +318,7 @@ class _Bezier_x_monotone_2 Bezier_cache& cache, OutputIterator oi) const { - typedef boost::variant Intersection_result; + typedef std::variant Intersection_result; // In case we have two x-monotone subcurves of the same Bezier curve, // check if they have a common left endpoint. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h index c6f11cc8a342..051390155d5b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h @@ -996,7 +996,7 @@ class _X_monotone_circle_segment_2 { Intersection_map* inter_map = nullptr) const { typedef std::pair Intersection_point; - typedef boost::variant Intersection_result; + typedef std::variant Intersection_result; // First check whether the two arcs have the same supporting curve. if (has_same_supporting_curve(cv)) { diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Conic_x_monotone_arc_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Conic_x_monotone_arc_2.h index 7579788a8a43..57352a12ece8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Conic_x_monotone_arc_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Conic_x_monotone_arc_2.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include @@ -813,7 +813,7 @@ class _Conic_x_monotone_arc_2 : private Conic_arc_ { Intersection_map& inter_map, OutputIterator oi) const { - typedef boost::variant Intersection_result; + typedef std::variant Intersection_result; if (_has_same_supporting_conic(arc)) { // Check for overlaps between the two arcs. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_line_arc_traits_2.h index 20ccbe9c7583..9c0cda934db4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_line_arc_traits_2.h @@ -125,7 +125,7 @@ class Arr_line_arc_traits_2 { template OutputIterator operator()(const Curve_2& line, OutputIterator oi) const { - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; *oi++ = Make_x_monotone_result(line); return oi; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h index b2354fe98950..079f5534e832 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h @@ -26,7 +26,7 @@ #include -#include +#include #include #include @@ -1249,7 +1249,7 @@ class Arr_linear_traits_2 : public Kernel_ { OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { // Wrap the segment with a variant. - typedef boost::variant + typedef std::variant Make_x_monotone_result; *oi++ = Make_x_monotone_result(cv); return oi; @@ -1326,7 +1326,7 @@ class Arr_linear_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; CGAL_precondition(! cv1.is_degenerate()); @@ -1340,7 +1340,7 @@ class Arr_linear_traits_2 : public Kernel_ { if (! res) return oi; // Check whether we have a single intersection point. - const Point_2* ip = boost::get(&*res); + const Point_2* ip = std::get(&*res); if (ip != nullptr) { // Check whether the intersection point ip lies on both segments. const bool ip_on_cv1 = cv1.is_vertical() ? diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h index 42d0457c32b9..636d669eb36f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h @@ -27,7 +27,7 @@ * functors required by the concept it models. */ -#include +#include #include #include @@ -131,7 +131,7 @@ class Arr_non_caching_segment_traits_2 : OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { // Wrap the segment with a variant. - typedef boost::variant + typedef std::variant Make_x_monotone_result; *oi++ = Make_x_monotone_result(cv); return oi; @@ -224,7 +224,7 @@ class Arr_non_caching_segment_traits_2 : OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; const Kernel& kernel = m_traits; @@ -234,7 +234,7 @@ class Arr_non_caching_segment_traits_2 : if (! res) return oi; // Check if the intersection is a point: - const Point_2* p_p = boost::get(&*res); + const Point_2* p_p = std::get(&*res); if (p_p != nullptr) { // Create a pair representing the point with its multiplicity, // which is always 1 for line segments for all practical purposes. @@ -246,7 +246,7 @@ class Arr_non_caching_segment_traits_2 : } // The intersection is a segment. - const X_monotone_curve_2* cv_p = boost::get(&*res); + const X_monotone_curve_2* cv_p = std::get(&*res); CGAL_assertion(cv_p != nullptr); Comparison_result cmp1 = m_traits.compare_endpoints_xy_2_object()(cv1); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h index e7c4a5b1dd52..61fe87106b54 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h @@ -26,7 +26,7 @@ #include #include -#include +#include #include namespace CGAL { diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h index 8f28269f1998..a52086ce117f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h @@ -75,7 +75,7 @@ Arr_trapezoid_ric_point_location::locate(const Point_2& p) const case TD::POINT: { //p is interior so it should fall on Td_active_vertex - Td_active_vertex& v (boost::get(tr)); + Td_active_vertex& v (std::get(tr)); CGAL_TRAP_PRINT_DEBUG("POINT"); CGAL_assertion(!v.vertex()->is_at_open_boundary()); return make_result(v.vertex()); @@ -84,7 +84,7 @@ Arr_trapezoid_ric_point_location::locate(const Point_2& p) const case TD::CURVE: { - Td_active_edge& e (boost::get(tr)); + Td_active_edge& e (std::get(tr)); Halfedge_const_handle h = e.halfedge(); CGAL_TRAP_PRINT_DEBUG("CURVE"); if ( m_traits->is_in_x_range_2_object()(h->curve(),p) && @@ -100,7 +100,7 @@ Arr_trapezoid_ric_point_location::locate(const Point_2& p) const case TD::TRAPEZOID: { - Td_active_trapezoid t (boost::get(tr)); + Td_active_trapezoid t (std::get(tr)); Halfedge_const_handle h = t.top(); CGAL_TRAP_PRINT_DEBUG("TRAPEZOID"); bool is_p_above_h = (m_traits->is_in_x_range_2_object()(h->curve(),p)) @@ -160,7 +160,7 @@ Arr_trapezoid_ric_point_location:: _get_unbounded_face(const Td_map_item& item,const Point_2& p, Arr_not_all_sides_oblivious_tag) const { - Td_active_trapezoid tr (boost::get(item)); + Td_active_trapezoid tr (std::get(item)); // Halfedge_const_handle h = tr.top(); if (!tr.is_on_top_boundary() || !tr.is_on_bottom_boundary()) { //if one of top or bottom edges is defined @@ -184,13 +184,13 @@ _get_unbounded_face(const Td_map_item& item,const Point_2& p, Td_map_item& left_v_item = td.locate(tr.left(),td_lt); CGAL_assertion(td_lt == TD::POINT); Halfedge_const_handle he; - if (boost::get(&left_v_item) != nullptr) { - Td_active_vertex v(boost::get(left_v_item)); + if (std::get(&left_v_item) != nullptr) { + Td_active_vertex v(std::get(left_v_item)); he = v.cw_he(); } else { Td_active_fictitious_vertex - v(boost::get(left_v_item)); + v(std::get(left_v_item)); he = v.cw_he(); } //cw_he() holds the "smallest" curve clockwise starting from 12 o'clock @@ -216,13 +216,13 @@ _get_unbounded_face(const Td_map_item& item,const Point_2& p, Td_map_item& right_v_item = td.locate(tr.right(),td_lt); CGAL_assertion(td_lt == TD::POINT); Halfedge_const_handle he; - if (boost::get(&right_v_item)!= nullptr) { - Td_active_vertex v(boost::get(right_v_item)); + if (std::get(&right_v_item)!= nullptr) { + Td_active_vertex v(std::get(right_v_item)); he = v.cw_he(); } else { Td_active_fictitious_vertex - v(boost::get(right_v_item)); + v(std::get(right_v_item)); he = v.cw_he(); } //its cw_he() holds the "smallest" curve clockwise starting from @@ -270,13 +270,13 @@ _vertical_ray_shoot(const Point_2& p, bool shoot_up) const case TD::POINT: { //p fell on Td_active_vertex - Td_active_vertex& v (boost::get(item)); + Td_active_vertex& v (std::get(item)); return (make_result(v.vertex())); } break; case TD::CURVE: { - Td_active_edge& e (boost::get(item)); + Td_active_edge& e (std::get(item)); Halfedge_const_handle h = e.halfedge(); if ((shoot_up && h->direction() == ARR_LEFT_TO_RIGHT) || @@ -289,7 +289,7 @@ _vertical_ray_shoot(const Point_2& p, bool shoot_up) const break; case TD::TRAPEZOID: { - Td_active_trapezoid trpz (boost::get(item)); + Td_active_trapezoid trpz (std::get(item)); Halfedge_const_handle h = (shoot_up) ? trpz.top() : trpz.bottom(); bool is_p_above_h = (m_traits->is_in_x_range_2_object()(h->curve(),p)) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_X_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_X_trapezoid.h index 169864e1de1e..9904b1705420 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_X_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_X_trapezoid.h @@ -22,7 +22,7 @@ */ #include -#include +#include #include @@ -92,9 +92,9 @@ class Td_X_trapezoid : public Handle // type flag + on boundaries flags, // left-bottom neighbor trapezoid, left-top neighbor trapezoid, // right-bottom neighbor trapezoid, right-top neighbor trapezoid - typedef Td_ninetuple, - boost::variant, - boost::variant, + std::variant, + std::variant >, Halfedge_const_handle, unsigned char, @@ -239,7 +239,7 @@ class Td_X_trapezoid : public Handle Curve_end v_ce(left()->curve_end()); ptr()->e2 = (std::shared_ptr)(new X_monotone_curve_2(v_ce.cv())); - //CGAL_assertion(boost::get>( &(ptr()->e2)) != nullptr); + //CGAL_assertion(std::get>( &(ptr()->e2)) != nullptr); ptr()->e1 = (v_ce.ce() == ARR_MIN_END ) ? CGAL_TD_CV_MIN_END : CGAL_TD_CV_MAX_END; @@ -443,8 +443,8 @@ class Td_X_trapezoid : public Handle CGAL_TD_INLINE Vertex_const_handle left_unsafe() const { CGAL_precondition(is_active()); - CGAL_assertion(boost::get(&(ptr()->e0)) != nullptr); - return boost::get(ptr()->e0); + CGAL_assertion(std::get(&(ptr()->e0)) != nullptr); + return std::get(ptr()->e0); } /*! Access trapezoid left. @@ -466,8 +466,8 @@ class Td_X_trapezoid : public Handle CGAL_TD_INLINE Vertex_const_handle right_unsafe() const { CGAL_precondition(is_active()); - CGAL_assertion(boost::get(&(ptr()->e1)) != nullptr); - return boost::get(ptr()->e1); + CGAL_assertion(std::get(&(ptr()->e1)) != nullptr); + return std::get(ptr()->e1); } /*! Access trapezoid right. @@ -489,8 +489,8 @@ class Td_X_trapezoid : public Handle CGAL_TD_INLINE Halfedge_const_handle bottom_unsafe () const { CGAL_precondition(is_active()); - CGAL_assertion(boost::get(&(ptr()->e2)) != nullptr); - return boost::get(ptr()->e2); + CGAL_assertion(std::get(&(ptr()->e2)) != nullptr); + return std::get(ptr()->e2); } /*! Access trapezoid bottom. @@ -526,8 +526,8 @@ class Td_X_trapezoid : public Handle CGAL_precondition(type() == TD_VERTEX); CGAL_precondition(!is_on_boundaries()); - CGAL_assertion(boost::get( &(ptr()->e0)) != nullptr); - return boost::get( ptr()->e0 ); + CGAL_assertion(std::get( &(ptr()->e0)) != nullptr); + return std::get( ptr()->e0 ); } CGAL_TD_INLINE std::pair curve_end_pair_for_boundary_rem_vtx() const @@ -536,13 +536,13 @@ class Td_X_trapezoid : public Handle CGAL_precondition(type() == TD_VERTEX); CGAL_precondition(is_on_boundaries()); - CGAL_assertion(boost::get( &(ptr()->e1)) != nullptr); - CGAL_assertion(boost::get >(&(ptr()->e2)) != nullptr); - X_monotone_curve_2* cv_ptr = (boost::get >(ptr()->e2)).get(); + CGAL_assertion(std::get( &(ptr()->e1)) != nullptr); + CGAL_assertion(std::get >(&(ptr()->e2)) != nullptr); + X_monotone_curve_2* cv_ptr = (std::get >(ptr()->e2)).get(); CGAL_assertion(cv_ptr != nullptr); Arr_curve_end ce = - (boost::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? + (std::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? ARR_MIN_END : ARR_MAX_END; return std::make_pair(cv_ptr, ce); @@ -554,13 +554,13 @@ class Td_X_trapezoid : public Handle CGAL_precondition(type() == TD_VERTEX); CGAL_precondition(is_on_boundaries()); - CGAL_assertion(boost::get( &(ptr()->e1)) != nullptr); - CGAL_assertion(boost::get >(&(ptr()->e2)) != nullptr); - X_monotone_curve_2* cv_ptr = (boost::get >(ptr()->e2)).get(); + CGAL_assertion(std::get( &(ptr()->e1)) != nullptr); + CGAL_assertion(std::get >(&(ptr()->e2)) != nullptr); + X_monotone_curve_2* cv_ptr = (std::get >(ptr()->e2)).get(); CGAL_assertion(cv_ptr != nullptr); Arr_curve_end ce = - (boost::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? + (std::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? ARR_MIN_END : ARR_MAX_END; return Curve_end(*cv_ptr, ce); @@ -571,13 +571,13 @@ class Td_X_trapezoid : public Handle CGAL_precondition(!is_active()); CGAL_precondition(type() == TD_VERTEX); - CGAL_assertion(boost::get( &(ptr()->e1)) != nullptr); - CGAL_assertion(boost::get >(&(ptr()->e2)) != nullptr); - X_monotone_curve_2* cv_ptr = (boost::get >(ptr()->e2)).get(); + CGAL_assertion(std::get( &(ptr()->e1)) != nullptr); + CGAL_assertion(std::get >(&(ptr()->e2)) != nullptr); + X_monotone_curve_2* cv_ptr = (std::get >(ptr()->e2)).get(); CGAL_assertion(cv_ptr != nullptr); Arr_curve_end ce = - (boost::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? + (std::get(ptr()->e1) == CGAL_TD_CV_MIN_END) ? ARR_MIN_END : ARR_MAX_END; return Curve_end(*cv_ptr, ce); @@ -587,8 +587,8 @@ class Td_X_trapezoid : public Handle { CGAL_precondition(!is_active() && type() == TD_EDGE); - CGAL_assertion(boost::get >(&(ptr()->e2)) != nullptr); - X_monotone_curve_2* cv_ptr = (boost::get >(ptr()->e2)).get(); + CGAL_assertion(std::get >(&(ptr()->e2)) != nullptr); + X_monotone_curve_2* cv_ptr = (std::get >(ptr()->e2)).get(); CGAL_assertion(cv_ptr != nullptr); return *cv_ptr; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h index eb161a353c52..b026673d4a6b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h @@ -21,7 +21,7 @@ */ #include -#include +#include #include diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_fictitious_vertex.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_fictitious_vertex.h index 06e13b29c241..f709a463bc11 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_fictitious_vertex.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_fictitious_vertex.h @@ -21,7 +21,7 @@ */ #include -#include +#include #include #ifdef CGAL_TD_DEBUG diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h index 2872d2563109..44834852a2b4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include @@ -461,12 +461,12 @@ class Td_active_trapezoid : public Handle if (ptr()->rb.which() != 0) { - Self tr(boost::get(rb())); + Self tr(std::get(rb())); tr.set_lb(item); } if (ptr()->rt.which() != 0) { - Self tr(boost::get(rt())); + Self tr(std::get(rt())); tr.set_lt(item); } CGAL_assertion(is_on_right_boundary() == right.is_on_right_boundary()); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_vertex.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_vertex.h index 514686d303d1..23cbc480c9ba 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_vertex.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_vertex.h @@ -21,7 +21,7 @@ */ #include -#include +#include #include diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_dag_node.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_dag_node.h index 72fd48526c87..340bb0b6d7a2 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_dag_node.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_dag_node.h @@ -28,7 +28,7 @@ #include #include -#include +#include namespace CGAL { @@ -112,7 +112,7 @@ class Td_dag_node : public Td_dag_node_base public: - class clear_neighbors_visitor : public boost::static_visitor< void > + class clear_neighbors_visitor { public: void operator()(Td_active_trapezoid& t) const @@ -142,7 +142,7 @@ class Td_dag_node : public Td_dag_node_base //d'tor ~Node() { - boost::apply_visitor(clear_neighbors_visitor(), m_data); + std::visit(clear_neighbors_visitor(), m_data); } bool is_inner_node() const //MICHAL: a node with only left child (like removed node) will be considered as a leaf diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_edge.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_edge.h index 55c8e5a457b7..97de5cae60a4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_edge.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_edge.h @@ -21,7 +21,7 @@ */ #include -#include +#include #include diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_fictitious_vertex.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_fictitious_vertex.h index db3019d46b7c..eea96c8327fc 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_fictitious_vertex.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_fictitious_vertex.h @@ -21,7 +21,7 @@ */ #include -#include +#include #ifdef CGAL_TD_DEBUG diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_trapezoid.h index 908be87c0789..312d7d8c5062 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_trapezoid.h @@ -21,7 +21,7 @@ */ #include -#include +#include #ifdef CGAL_TD_DEBUG diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_vertex.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_vertex.h index e9cad94daf81..766401446041 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_vertex.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_inactive_vertex.h @@ -21,7 +21,7 @@ */ #include -#include +#include #ifdef CGAL_TD_DEBUG diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h index 45ba665a1d5a..59a3dd7f6b6d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h @@ -113,7 +113,7 @@ class Td_traits : public Pm_traits_ Td_inactive_fictitious_vertex; //! type of td map item (Td_halfedge, Td_vertex or Td_trapezoid) - typedef boost::variant< Td_nothing, + typedef std::variant< Td_nothing, Td_active_trapezoid, Td_inactive_trapezoid, Td_active_edge, Td_inactive_edge, Td_active_vertex, Td_active_fictitious_vertex, @@ -895,8 +895,8 @@ class Td_traits : public Pm_traits_ CGAL_precondition(is_active(left_item) && is_active(right_item)); CGAL_precondition(is_td_trapezoid(left_item) && is_td_trapezoid(right_item)); - Td_active_trapezoid left (boost::get(left_item)); - Td_active_trapezoid right(boost::get(right_item)); + Td_active_trapezoid left (std::get(left_item)); + Td_active_trapezoid right(std::get(right_item)); if (left.is_on_bottom_boundary()) return (right.is_on_bottom_boundary()); @@ -915,8 +915,8 @@ class Td_traits : public Pm_traits_ CGAL_precondition(is_active(left_item) && is_active(right_item)); CGAL_precondition(is_td_trapezoid(left_item) && is_td_trapezoid(right_item)); - Td_active_trapezoid left (boost::get(left_item)); - Td_active_trapezoid right(boost::get(right_item)); + Td_active_trapezoid left (std::get(left_item)); + Td_active_trapezoid right(std::get(right_item)); if (left.is_on_top_boundary()) return (right.is_on_top_boundary()); @@ -1049,7 +1049,7 @@ class Td_traits : public Pm_traits_ CGAL_precondition(is_active(item)); //MICHAL: assumes item is of active edge item - also fails in case of a vertical asymptote //MICHAL: check when this is used exactly - Td_active_edge& e (boost::get(item)); + Td_active_edge& e (std::get(item)); Halfedge_const_handle he = e.halfedge(); return (this->compare_curve_end_x_2_object() (Curve_end(he,ARR_MIN_END), Curve_end(he,ARR_MAX_END))== EQUAL); @@ -1061,7 +1061,7 @@ class Td_traits : public Pm_traits_ { CGAL_precondition( is_active(item) ); CGAL_precondition( is_td_trapezoid(item) ); - Td_active_trapezoid tr (boost::get(item)); + Td_active_trapezoid tr (std::get(item)); return ( tr.is_on_left_boundary() || diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index 7b3b224a2239..be7d7ac72b3c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include @@ -93,16 +93,16 @@ struct Non_recursive_td_map_item_destructor void operator()(Td_active_trapezoid& item) { - boost::apply_visitor(m_child_visitor, item.lb()); - boost::apply_visitor(m_child_visitor, item.lt()); - boost::apply_visitor(m_child_visitor, item.rb()); - boost::apply_visitor(m_child_visitor, item.rt()); + std::visit(m_child_visitor, item.lb()); + std::visit(m_child_visitor, item.lt()); + std::visit(m_child_visitor, item.rb()); + std::visit(m_child_visitor, item.rt()); item.clear_neighbors(); } void operator()(Td_active_edge& item) { - boost::apply_visitor(m_child_visitor, item.next()); + std::visit(m_child_visitor, item.next()); item.set_next(Td_map_item(0)); } @@ -124,7 +124,7 @@ struct Non_recursive_td_map_item_destructor { Td_map_item item = queue.back(); queue.pop_back(); - boost::apply_visitor(item_visitor, item); + std::visit(item_visitor, item); } } @@ -138,7 +138,7 @@ struct Non_recursive_td_map_item_destructor { Td_map_item item = queue.back(); queue.pop_back(); - boost::apply_visitor(item_visitor, item); + std::visit(item_visitor, item); } } }; @@ -384,7 +384,7 @@ class Trapezoidal_decomposition_2 if (traits->is_td_trapezoid(m_cur_item)) { //if the map item is a trapezoid - Td_active_trapezoid tr (boost::get(m_cur_item)); + Td_active_trapezoid tr (std::get(m_cur_item)); #ifndef CGAL_TD_DEBUG CGAL_warning_code(Dag_node* tt = tr.dag_node();) @@ -436,7 +436,7 @@ class Trapezoidal_decomposition_2 { //if the map item is an edge - Td_active_edge e (boost::get(m_cur_item)); + Td_active_edge e (std::get(m_cur_item)); CGAL_assertion_code(Dag_node* tt = e.dag_node();) CGAL_assertion(tt != nullptr); CGAL_assertion(tt->is_inner_node()); @@ -453,7 +453,7 @@ class Trapezoidal_decomposition_2 while(traits->is_td_vertex(m_cur_item)) { Dag_node* node = - boost::apply_visitor(dag_node_visitor(),m_cur_item); + std::visit(dag_node_visitor(),m_cur_item); m_cur_item = node->left_child().get_data(); } @@ -481,7 +481,7 @@ class Trapezoidal_decomposition_2 CGAL_precondition (!traits->is_empty_item(m_cur_item)); CGAL_precondition (traits->is_active(m_cur_item) && traits->is_td_trapezoid(m_cur_item)); - return boost::get(m_cur_item); + return std::get(m_cur_item); } Td_active_edge& e() @@ -489,13 +489,13 @@ class Trapezoidal_decomposition_2 CGAL_precondition (!traits->is_empty_item(m_cur_item)); CGAL_precondition (traits->is_active(m_cur_item) && traits->is_td_edge(m_cur_item)); - return boost::get(m_cur_item); + return std::get(m_cur_item); } }; /*! Visitors for accessing td map items methods */ - class rb_visitor : public boost::static_visitor + class rb_visitor { public: Td_map_item operator()(Td_active_trapezoid& t) const @@ -511,7 +511,7 @@ class Trapezoidal_decomposition_2 } }; - class set_rb_visitor : public boost::static_visitor + class set_rb_visitor { public: set_rb_visitor (const Td_map_item& rb) : m_rb(rb) {} @@ -532,7 +532,7 @@ class Trapezoidal_decomposition_2 const Td_map_item& m_rb; }; - class rt_visitor : public boost::static_visitor + class rt_visitor { public: Td_map_item operator()(Td_active_trapezoid& t) const @@ -548,7 +548,7 @@ class Trapezoidal_decomposition_2 } }; - class set_rt_visitor : public boost::static_visitor + class set_rt_visitor { public: set_rt_visitor (const Td_map_item& rt) : m_rt(rt) {} @@ -568,7 +568,7 @@ class Trapezoidal_decomposition_2 const Td_map_item& m_rt; }; - class lb_visitor : public boost::static_visitor + class lb_visitor { public: Td_map_item operator()(Td_active_trapezoid& t) const @@ -584,7 +584,7 @@ class Trapezoidal_decomposition_2 } }; - class set_lb_visitor : public boost::static_visitor + class set_lb_visitor { public: set_lb_visitor (const Td_map_item& lb) : m_lb(lb) {} @@ -604,7 +604,7 @@ class Trapezoidal_decomposition_2 const Td_map_item& m_lb; }; - class set_lt_visitor : public boost::static_visitor + class set_lt_visitor { public: set_lt_visitor (const Td_map_item& lt) : m_lt(lt) {} @@ -624,7 +624,7 @@ class Trapezoidal_decomposition_2 const Td_map_item& m_lt; }; - class bottom_he_visitor : public boost::static_visitor + class bottom_he_visitor { public: Halfedge_const_handle operator()(Td_active_trapezoid& t) const @@ -640,7 +640,7 @@ class Trapezoidal_decomposition_2 } }; - class set_bottom_he_visitor : public boost::static_visitor< void > + class set_bottom_he_visitor { public: set_bottom_he_visitor (Halfedge_const_handle he) : m_bottom_he(he) {} @@ -659,7 +659,7 @@ class Trapezoidal_decomposition_2 Halfedge_const_handle m_bottom_he; }; - class top_he_visitor : public boost::static_visitor + class top_he_visitor { public: Halfedge_const_handle operator()(Td_active_trapezoid& t) const @@ -675,7 +675,7 @@ class Trapezoidal_decomposition_2 } }; - class set_top_he_visitor : public boost::static_visitor + class set_top_he_visitor { public: set_top_he_visitor (Halfedge_const_handle he) : m_top_he(he) {} @@ -694,7 +694,7 @@ class Trapezoidal_decomposition_2 Halfedge_const_handle m_top_he; }; - class cw_he_visitor : public boost::static_visitor< Halfedge_const_handle > + class cw_he_visitor { public: Halfedge_const_handle operator()(Td_active_vertex& t) const @@ -716,7 +716,7 @@ class Trapezoidal_decomposition_2 /*! A visitor to set the cw halfedge of a vertex node. */ - class set_cw_he_visitor : public boost::static_visitor { + class set_cw_he_visitor public: set_cw_he_visitor(Halfedge_const_handle he) : m_cw_he(he) {} @@ -734,7 +734,7 @@ class Trapezoidal_decomposition_2 /*! A visitor to reset the cw halfedge of a vertex node. */ - class reset_cw_he_visitor : public boost::static_visitor { + class reset_cw_he_visitor public: void operator()(Td_active_vertex& t) const { t.reset_cw_he(); } @@ -744,7 +744,7 @@ class Trapezoidal_decomposition_2 void operator()(T& /*t*/) const { CGAL_assertion(false); } }; - class dag_node_visitor : public boost::static_visitor + class dag_node_visitor { public: Dag_node* operator()(Td_nothing& /* t */) const @@ -765,7 +765,7 @@ class Trapezoidal_decomposition_2 } }; - class set_dag_node_visitor : public boost::static_visitor + class set_dag_node_visitor { public: set_dag_node_visitor(Dag_node* node):m_node(node) {} @@ -789,8 +789,7 @@ class Trapezoidal_decomposition_2 Dag_node* m_node; }; - class curve_end_for_fict_vertex_visitor : - public boost::static_visitor > + class curve_end_for_fict_vertex_visitor { public: std::optional operator()(Td_active_fictitious_vertex& t) const @@ -812,7 +811,7 @@ class Trapezoidal_decomposition_2 } }; - class point_for_vertex_visitor : public boost::static_visitor< Point > + class point_for_vertex_visitor { public: Point operator()(Td_active_vertex& t) const @@ -833,8 +832,7 @@ class Trapezoidal_decomposition_2 } }; - class curve_end_for_active_vertex_visitor : - public boost::static_visitor > + class curve_end_for_active_vertex_visitor { public: std::optional operator()(Td_active_vertex& t) const @@ -855,8 +853,7 @@ class Trapezoidal_decomposition_2 } }; - class vertex_for_active_vertex_visitor : - public boost::static_visitor + class vertex_for_active_vertex_visitor { public: Vertex_const_handle operator()(Td_active_vertex& t) const @@ -877,8 +874,7 @@ class Trapezoidal_decomposition_2 } }; - class cv_for_edge_visitor : - public boost::static_visitor > + class cv_for_edge_visitor { public: std::optional @@ -998,11 +994,11 @@ class Trapezoidal_decomposition_2 bool is_fict_vtx = traits->is_fictitious_vertex(vtx_item); if (is_fict_vtx) { return (compare(t, - *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(), + *(std::visit(curve_end_for_fict_vertex_visitor(), vtx_item))) == SMALLER); } else { - return (compare(t, boost::apply_visitor(point_for_vertex_visitor(), + return (compare(t, std::visit(point_for_vertex_visitor(), vtx_item)) == SMALLER); } } @@ -1039,12 +1035,12 @@ class Trapezoidal_decomposition_2 bool is_fict_vtx = traits->is_fictitious_vertex(vtx_item); if (is_fict_vtx) { return (compare(t, - *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(), + *(std::visit(curve_end_for_fict_vertex_visitor(), vtx_item))) == LARGER); } else { return (compare(t, - boost::apply_visitor(point_for_vertex_visitor(), + std::visit(point_for_vertex_visitor(), vtx_item)) == LARGER); } } @@ -1058,12 +1054,12 @@ class Trapezoidal_decomposition_2 bool is_fict_vtx = traits->is_fictitious_vertex(vtx_item); if (is_fict_vtx) { return equal(t, - *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(), + *(std::visit(curve_end_for_fict_vertex_visitor(), vtx_item))); } else { return equal(t, - boost::apply_visitor(point_for_vertex_visitor(), + std::visit(point_for_vertex_visitor(), vtx_item)); } } @@ -1090,24 +1086,24 @@ class Trapezoidal_decomposition_2 //if ( traits->is_fictitious_vertex(item) ) //{ // CGAL_precondition(traits->equal_curve_end_2_object() - // (Curve_end(cv,ARR_MIN_END), *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),item)))); + // (Curve_end(cv,ARR_MIN_END), *(std::visit(curve_end_for_fict_vertex_visitor(),item)))); //} //else //{ // CGAL_precondition(traits->equal_curve_end_2_object() - // (Curve_end(cv,ARR_MIN_END), boost::apply_visitor(point_for_vertex_visitor(), item))); + // (Curve_end(cv,ARR_MIN_END), std::visit(point_for_vertex_visitor(), item))); //} //find the node of the curve's leftmost trapezoid Dag_node cv_leftmost_node(left_cv_end_node.right_child()); if (traits->is_fictitious_vertex(item) ) { - Curve_end ce( *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(), + Curve_end ce( *(std::visit(curve_end_for_fict_vertex_visitor(), item))); search_using_dag_with_cv(cv_leftmost_node, traits, ce, &cv, cres); } else { - Point p( boost::apply_visitor(point_for_vertex_visitor(), item)); + Point p( std::visit(point_for_vertex_visitor(), item)); search_using_dag_with_cv(cv_leftmost_node, traits, p, &cv, cres); } return cv_leftmost_node; @@ -1159,8 +1155,8 @@ class Trapezoidal_decomposition_2 if (traits->is_empty_item(left_item) || traits->is_empty_item(right_item)) return false; - Td_active_trapezoid& left (boost::get(left_item)); - Td_active_trapezoid& right (boost::get(right_item)); + Td_active_trapezoid& left (std::get(left_item)); + Td_active_trapezoid& right (std::get(right_item)); if (traits->is_trapezoids_top_equal(left,right) && traits->is_trapezoids_bottom_equal(left,right) && @@ -1966,7 +1962,7 @@ class Trapezoidal_decomposition_2 for (typename std::list::iterator it = representatives.begin(); it != representatives.end(); ++it) { - Td_active_edge e(boost::get(*it)); + Td_active_edge e(std::get(*it)); container.push_back(e.halfedge()); //it represents an active trapezoid } } @@ -2152,7 +2148,7 @@ class Trapezoidal_decomposition_2 // traits may be initialized later m_dag_root = new Dag_node(Td_active_trapezoid()); //(*m_dag_root)->set_dag_node(m_dag_root); - boost::apply_visitor(set_dag_node_visitor(m_dag_root), + std::visit(set_dag_node_visitor(m_dag_root), m_dag_root->get_data()); m_number_of_curves = 0; @@ -2200,11 +2196,11 @@ class Trapezoidal_decomposition_2 //{ // if ( traits->is_fictitious_vertex(item) ) // { - // res = traits->equal_curve_end_2_object()(ce, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),item))); + // res = traits->equal_curve_end_2_object()(ce, *(std::visit(curve_end_for_fict_vertex_visitor(),item))); // } // else // { - // res = traits->equal_curve_end_2_object()(ce, boost::apply_visitor(point_for_vertex_visitor(), item)); + // res = traits->equal_curve_end_2_object()(ce, std::visit(point_for_vertex_visitor(), item)); // } //} if (traits->is_td_trapezoid(item)) @@ -2218,11 +2214,11 @@ class Trapezoidal_decomposition_2 //{ // if ( traits->is_fictitious_vertex(item) ) // { - // res = traits->equal_curve_end_2_object()(ce, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),item))); + // res = traits->equal_curve_end_2_object()(ce, *(std::visit(curve_end_for_fict_vertex_visitor(),item))); // } // else // { - // res = traits->equal_curve_end_2_object()(ce, boost::apply_visitor(point_for_vertex_visitor(), item)); + // res = traits->equal_curve_end_2_object()(ce, std::visit(point_for_vertex_visitor(), item)); // } //} if (traits->is_td_trapezoid(item)) @@ -2234,7 +2230,7 @@ class Trapezoidal_decomposition_2 lt=POINT; else { - Td_active_trapezoid tr (boost::get(item)); + Td_active_trapezoid tr (std::get(item)); lt = tr.is_on_boundaries()? UNBOUNDED_TRAPEZOID : TRAPEZOID; } } @@ -2343,12 +2339,12 @@ class Trapezoidal_decomposition_2 // if the map item represents a fictitious vertex if (traits->is_fictitious_vertex(item)) { - const Curve_end left_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),item))); + const Curve_end left_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),item))); print_ce_data(left_ce.cv(), left_ce.ce(), out); } else // if the map item represents a vertex { - Point p = boost::apply_visitor(point_for_vertex_visitor(),item); + Point p = std::visit(point_for_vertex_visitor(),item); print_point_data(p, out); } out << " (void *)left_child: " << (void*)(&(curr.left_child())) @@ -2363,7 +2359,7 @@ class Trapezoidal_decomposition_2 { // bool is_active = traits->is_active(item); // if the map item represents an edge - const X_monotone_curve_2& he_cv = *(boost::apply_visitor(cv_for_edge_visitor(), item)); + const X_monotone_curve_2& he_cv = *(std::visit(cv_for_edge_visitor(), item)); // so top() is a real Halfedge with a curve() if curr is active // or curr holds the curve if curr is not active diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h index b912b9facc72..7da418861f07 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h @@ -52,7 +52,7 @@ split_trapezoid_by_vertex(Dag_node& split_node, Dag_node left_node, right_node; if (traits->is_td_trapezoid(curr_item)) { - Td_active_trapezoid& tr(boost::get(curr_item)); + Td_active_trapezoid& tr(std::get(curr_item)); CGAL_warning(traits->is_in_closure(tr, traits->vtx_to_ce(v))); @@ -63,9 +63,9 @@ split_trapezoid_by_vertex(Dag_node& split_node, (v, tr.right(), tr.bottom(), tr.top())); Td_active_trapezoid& - left_tr(boost::get(left_node.get_data())); + left_tr(std::get(left_node.get_data())); Td_active_trapezoid& - right_tr(boost::get(right_node.get_data())); + right_tr(std::get(right_node.get_data())); CGAL_warning(traits->is_trapezoids_top_equal(left_tr,right_tr)); CGAL_warning(traits->is_trapezoids_bottom_equal(left_tr,right_tr)); @@ -77,25 +77,25 @@ split_trapezoid_by_vertex(Dag_node& split_node, right_tr.init_neighbors(left_node.get_data(), left_node.get_data(), tr.rb(), tr.rt()); if (!traits->is_empty_item(tr.lb())) { - Td_active_trapezoid& lb(boost::get(tr.lb())); + Td_active_trapezoid& lb(std::get(tr.lb())); lb.set_rb(left_node.get_data()); } if (!traits->is_empty_item(tr.lt())) { - Td_active_trapezoid& lt(boost::get(tr.lt())); + Td_active_trapezoid& lt(std::get(tr.lt())); lt.set_rt(left_node.get_data()); } if (!traits->is_empty_item(tr.rb())) { - Td_active_trapezoid& rb(boost::get(tr.rb())); + Td_active_trapezoid& rb(std::get(tr.rb())); rb.set_lb(right_node.get_data()); } if (!traits->is_empty_item(tr.rt())) { - Td_active_trapezoid& rt(boost::get(tr.rt())); + Td_active_trapezoid& rt(std::get(tr.rt())); rt.set_lt(right_node.get_data()); } } else { // the curr_item is an edge - Td_active_edge& e(boost::get(curr_item)); + Td_active_edge& e(std::get(curr_item)); CGAL_warning(traits->is_in_closure(e, traits->vtx_to_ce(v))); @@ -103,8 +103,8 @@ split_trapezoid_by_vertex(Dag_node& split_node, right_node.set_data(Td_active_edge(e.halfedge())); - Td_active_edge& left_e(boost::get(left_node.get_data())); - Td_active_edge& right_e(boost::get(right_node.get_data())); + Td_active_edge& left_e(std::get(left_node.get_data())); + Td_active_edge& right_e(std::get(right_node.get_data())); //CGAL_warning(left_e.is_on_left_boundary() == e.is_on_left_boundary()); //CGAL_warning(right_e.is_on_right_boundary() == e.is_on_right_boundary()); @@ -132,10 +132,10 @@ split_trapezoid_by_vertex(Dag_node& split_node, const Dag_node* left_ptr = &split_node.left_child(); const Dag_node* right_ptr = &split_node.right_child(); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)left_ptr), + std::visit(set_dag_node_visitor((Dag_node*)left_ptr), left_ptr->get_data()); //(*left_ptr)->set_dag_node((Dag_node*)left_ptr); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)right_ptr), + std::visit(set_dag_node_visitor((Dag_node*)right_ptr), right_ptr->get_data()); //(*right_ptr)->set_dag_node((Dag_node*)right_ptr); @@ -219,7 +219,7 @@ deactivate_trapezoid(Dag_node& trpz_node, Dag_node* active_node) const CGAL_precondition(traits->is_active(trpz_node.get_data())); CGAL_precondition(traits->is_td_trapezoid(trpz_node.get_data())); if (Td_active_trapezoid* trap = - boost::get(&trpz_node.get_data())) + std::get(&trpz_node.get_data())) trap->non_recursive_clear_neighbors(); trpz_node.set_data(Td_inactive_trapezoid()); if (active_node) trpz_node.set_left_child(*active_node); @@ -233,11 +233,11 @@ deactivate_vertex(Dag_node& vtx_node) const CGAL_precondition(traits->is_td_vertex(vtx_node.get_data())); if (traits->is_fictitious_vertex(vtx_node.get_data())) { Td_active_fictitious_vertex& - v(boost::get(vtx_node.get_data())); + v(std::get(vtx_node.get_data())); vtx_node.set_data(Td_inactive_fictitious_vertex(v.vertex(), &vtx_node)); } else { - Td_active_vertex& v(boost::get(vtx_node.get_data())); + Td_active_vertex& v(std::get(vtx_node.get_data())); vtx_node.set_data(Td_inactive_vertex(v.vertex(), &vtx_node)); } } @@ -274,7 +274,7 @@ split_trapezoid_by_halfedge(Dag_node& split_node, CGAL_precondition(traits->is_td_trapezoid(split_node.get_data())); Td_map_item curr_item(split_node.get_data()); - Td_active_trapezoid& split_tr = boost::get(curr_item); + Td_active_trapezoid& split_tr = std::get(curr_item); // sets left and right according to td_edge's source and target positions // sets bottom and top to Halfedge itself @@ -303,9 +303,9 @@ split_trapezoid_by_halfedge(Dag_node& split_node, // CGAL_TD_ON_BOTTOM_BOUNDARY ))); Td_active_trapezoid& bottom = - boost::get(bottom_node.get_data()); + std::get(bottom_node.get_data()); Td_active_trapezoid& top = - boost::get(top_node.get_data()); + std::get(top_node.get_data()); top.init_neighbors(prev_top_tr, split_tr.lt(), std::nullopt , split_tr.rt()); bottom.init_neighbors(split_tr.lb(), prev_bottom_tr, split_tr.rb(), @@ -313,27 +313,27 @@ split_trapezoid_by_halfedge(Dag_node& split_node, if (!traits->is_empty_item(prev_bottom_tr)) { Td_active_trapezoid& - prev_btm(boost::get(prev_bottom_tr)); + prev_btm(std::get(prev_bottom_tr)); prev_btm.set_rt(bottom_node.get_data()); } if (!traits->is_empty_item(prev_top_tr)) { - Td_active_trapezoid& prev_top(boost::get(prev_top_tr)); + Td_active_trapezoid& prev_top(std::get(prev_top_tr)); prev_top.set_rb(top_node.get_data()); } if (!traits->is_empty_item(split_tr.lb())) { - Td_active_trapezoid& lb(boost::get(split_tr.lb())); + Td_active_trapezoid& lb(std::get(split_tr.lb())); lb.set_rb(bottom_node.get_data()); } if (!traits->is_empty_item(split_tr.lt())) { - Td_active_trapezoid& lt(boost::get(split_tr.lt())); + Td_active_trapezoid& lt(std::get(split_tr.lt())); lt.set_rt(top_node.get_data()); } if (!traits->is_empty_item(split_tr.rb())) { - Td_active_trapezoid& rb(boost::get(split_tr.rb())); + Td_active_trapezoid& rb(std::get(split_tr.rb())); rb.set_lb(bottom_node.get_data()); } if (!traits->is_empty_item(split_tr.rt())) { - Td_active_trapezoid& rt(boost::get(split_tr.rt())); + Td_active_trapezoid& rt(std::get(split_tr.rt())); rt.set_lt(top_node.get_data()); } split_node.replace(sep,bottom_node,top_node); //nodes depth are updated here @@ -348,14 +348,14 @@ split_trapezoid_by_halfedge(Dag_node& split_node, const Dag_node* bottomPtr = &split_node.left_child(); const Dag_node* topPtr = &split_node.right_child(); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)bottomPtr), + std::visit(set_dag_node_visitor((Dag_node*)bottomPtr), bottomPtr->get_data()); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)topPtr), + std::visit(set_dag_node_visitor((Dag_node*)topPtr), topPtr->get_data()); - // Td_active_edge& new_e = boost::get(split_node.get_data()); + // Td_active_edge& new_e = std::get(split_node.get_data()); if (!traits->is_empty_item(prev_e)) { - Td_active_edge& e( boost::get(prev_e)); + Td_active_edge& e( std::get(prev_e)); e.set_next(split_node.get_data()); } //update these trapezoids pointers. @@ -404,14 +404,14 @@ update_vtx_with_new_edge(Halfedge_const_handle he, //set cw to hold the halfedge whose source is p, // which is clockwise "smallest" starting from top (12 o'clock) - Halfedge_const_handle cw_he(boost::apply_visitor(cw_he_visitor(), vtx_item)); + Halfedge_const_handle cw_he(std::visit(cw_he_visitor(), vtx_item)); if (traits->compare_cw_around_point_2_object()(he->curve(), is_edge_to_right(he,p), cw_he->curve(), is_edge_to_right(cw_he,p), p) == SMALLER) { - boost::apply_visitor(set_cw_he_visitor(he),vtx_item);//v_tr->set_top(he); + std::visit(set_cw_he_visitor(he),vtx_item);//v_tr->set_top(he); } return vtx_item; @@ -430,7 +430,7 @@ insert_curve_at_vtx_using_dag(Halfedge_const_handle he, { CGAL_precondition(lt==TRAPEZOID || lt==UNBOUNDED_TRAPEZOID); - Dag_node* node = boost::apply_visitor(dag_node_visitor(), item); + Dag_node* node = std::visit(dag_node_visitor(), item); CGAL_assertion(node != nullptr); CGAL_assertion(he != m_empty_he_handle); @@ -458,13 +458,13 @@ insert_curve_at_vtx_using_dag(Halfedge_const_handle he, // CGAL_precondition(traits->is_td_vertex(vtx_item)); // CGAL_precondition(traits->is_active(vtx_item)); // -// Halfedge_const_handle cw_he (boost::apply_visitor(cw_he_visitor(), vtx_item)); +// Halfedge_const_handle cw_he (std::visit(cw_he_visitor(), vtx_item)); // // //make sure the cw_he is added in same direction as before // // such that vtx_item is the source (done inside the set methods) // if (cw_he == old_he || cw_he->twin() == old_he) // { -// boost::apply_visitor(set_cw_he_visitor(new_he), vtx_item); +// std::visit(set_cw_he_visitor(new_he), vtx_item); // } //} @@ -479,12 +479,12 @@ update_vtx_cw_he_after_merge(const X_monotone_curve_2& old_cv, CGAL_precondition(traits->is_td_vertex(vtx_item)); CGAL_precondition(traits->is_active(vtx_item)); - Halfedge_const_handle cw_he(boost::apply_visitor(cw_he_visitor(), vtx_item)); + Halfedge_const_handle cw_he(std::visit(cw_he_visitor(), vtx_item)); //make sure the cw_he is added in same direction as before // such that v_tr is the source (done inside the set methods) if (traits->equal_2_object()(cw_he->curve(), old_cv)) - boost::apply_visitor(set_cw_he_visitor(new_he), vtx_item); + std::visit(set_cw_he_visitor(new_he), vtx_item); } //----------------------------------------------------------------------------- @@ -499,12 +499,12 @@ update_vtx_cw_he_after_remove(Halfedge_const_handle old_he, CGAL_precondition(traits->is_td_vertex(vtx_item)); CGAL_precondition(traits->is_active(vtx_item)); - Halfedge_const_handle cw_he(boost::apply_visitor(cw_he_visitor(), vtx_item)); + Halfedge_const_handle cw_he(std::visit(cw_he_visitor(), vtx_item)); if ((old_he == cw_he) || (old_he->twin() == cw_he)) { Halfedge_const_handle new_he = cw_he->twin()->next(); if (new_he != cw_he) - boost::apply_visitor(set_cw_he_visitor(new_he), vtx_item); - else boost::apply_visitor(reset_cw_he_visitor(), vtx_item); // dangling edge removed + std::visit(set_cw_he_visitor(new_he), vtx_item); + else std::visit(reset_cw_he_visitor(), vtx_item); // dangling edge removed } } @@ -520,20 +520,20 @@ update_vtx_cw_he_after_remove(Halfedge_const_handle old_he, // CGAL_precondition(traits->is_td_vertex(vtx_item)); // CGAL_precondition(traits->is_active(vtx_item)); // -// Halfedge_const_handle top_he (boost::apply_visitor(top_he_visitor(), vtx_item)); -// Halfedge_const_handle bottom_he (boost::apply_visitor(bottom_he_visitor(), vtx_item)); +// Halfedge_const_handle top_he (std::visit(top_he_visitor(), vtx_item)); +// Halfedge_const_handle bottom_he (std::visit(bottom_he_visitor(), vtx_item)); // // //make sure the top & bottom are added in same direction as before // // such that sep is the source (done inside the set methods) // if ((top_he == he1) || (top_he == he1->twin()) || // (top_he == he2) || (top_he == he2->twin()) ) // { -// boost::apply_visitor(set_top_he_visitor(new_he), vtx_item); //v_tr.set_top(new_he); +// std::visit(set_top_he_visitor(new_he), vtx_item); //v_tr.set_top(new_he); // } // if ((bottom_he == he1) || (bottom_he == he1->twin()) || // (bottom_he == he2) || (bottom_he == he2->twin()) ) // { -// boost::apply_visitor(set_bottom_he_visitor(new_he), vtx_item); //v_tr.set_bottom(new_he); +// std::visit(set_bottom_he_visitor(new_he), vtx_item); //v_tr.set_bottom(new_he); // } //} @@ -561,22 +561,22 @@ update_map_items_after_merge(In_face_iterator& it, CGAL_assertion(traits->is_active(curr_item)); if (traits->is_td_edge(curr_item)) { - Td_active_edge& e(boost::get(curr_item)); + Td_active_edge& e(std::get(curr_item)); if (e.halfedge() == old_he || e.halfedge() == old_he->twin()) e.set_halfedge(new_he); } else if (traits->is_td_trapezoid(curr_item)) { - Td_active_trapezoid& tr(boost::get(curr_item)); + Td_active_trapezoid& tr(std::get(curr_item)); if (tr.bottom() == old_he || tr.bottom() == old_he->twin()) tr.set_bottom(new_he); if (tr.top() == old_he || tr.top() == old_he->twin()) tr.set_top(new_he); } else { //if is_td_vertex - Halfedge_const_handle cw_he(boost::apply_visitor(cw_he_visitor(), + Halfedge_const_handle cw_he(std::visit(cw_he_visitor(), curr_item)); if (cw_he == old_he || cw_he == old_he->twin()) - boost::apply_visitor(set_cw_he_visitor(new_he), curr_item); + std::visit(set_cw_he_visitor(new_he), curr_item); } last_item = *it; @@ -615,20 +615,20 @@ search_using_dag(Dag_node& curr_node, if (traits->is_td_vertex(curr_item)) { // the curr_item represents a vertex //bool is_fict_vtx = traits->is_fictitious_vertex(curr_item); - //if ((is_fict_vtx && is_end_point_left_low(p, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)))) || - // (!is_fict_vtx && is_end_point_left_low(p, boost::apply_visitor(point_for_vertex_visitor(), curr_item))) ) + //if ((is_fict_vtx && is_end_point_left_low(p, *(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)))) || + // (!is_fict_vtx && is_end_point_left_low(p, std::visit(point_for_vertex_visitor(), curr_item))) ) if (is_end_point_left_low(p, curr_node)) { curr_node = curr_node.left_child(); continue; } - //else if ((is_fict_vtx && is_end_point_right_top(p, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)))) || - // (!is_fict_vtx && is_end_point_right_top(p, boost::apply_visitor(point_for_vertex_visitor(), curr_item))) ) + //else if ((is_fict_vtx && is_end_point_right_top(p, *(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)))) || + // (!is_fict_vtx && is_end_point_right_top(p, std::visit(point_for_vertex_visitor(), curr_item))) ) else if (is_end_point_right_top(p, curr_node)) { curr_node = curr_node.right_child(); continue; } - //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || - // (!is_fict_vtx && traits->equal_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item), p)) ) + //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || + // (!is_fict_vtx && traits->equal_2_object()(std::visit(point_for_vertex_visitor(), curr_item), p)) ) else if (are_equal_end_points(p, curr_node)) { if (he == m_empty_he_handle) { // he is the empty handle @@ -663,13 +663,13 @@ search_using_dag(Dag_node& curr_node, are_equal_end_points(p,curr_node)); //(is_fict_vtx && - // (is_end_point_left_low(p,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // is_end_point_right_top(p,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)),p))) || + // (is_end_point_left_low(p,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // is_end_point_right_top(p,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)),p))) || // (!is_fict_vtx && - // (is_end_point_left_low(p,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // is_end_point_right_top(p,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // traits->equal_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item),p)))); + // (is_end_point_left_low(p,std::visit(point_for_vertex_visitor(), curr_item)) || + // is_end_point_right_top(p,std::visit(point_for_vertex_visitor(), curr_item)) || + // traits->equal_2_object()(std::visit(point_for_vertex_visitor(), curr_item),p)))); return Locate_type(); } @@ -678,7 +678,7 @@ search_using_dag(Dag_node& curr_node, // curr_item represents an edge, // so top() is a real Halfedge with a curve() if curr_item is active // or curr_item holds the curve if it is not active - const X_monotone_curve_2& he_cv = *(boost::apply_visitor(cv_for_edge_visitor(), curr_item)); + const X_monotone_curve_2& he_cv = *(std::visit(cv_for_edge_visitor(), curr_item)); Comparison_result cres = traits->compare_y_at_x_2_object()(p, he_cv); if (cres == SMALLER) { @@ -753,7 +753,7 @@ search_using_dag(Dag_node& curr_node, else { // if is_degenerate() == 0, meaning: curr_item is a real trapezoid if (traits->is_active(curr_item)) { - Td_active_trapezoid& tr = boost::get(curr_item); + Td_active_trapezoid& tr = std::get(curr_item); return tr.is_on_boundaries() ? UNBOUNDED_TRAPEZOID : TRAPEZOID; } curr_node = curr_node.left_child(); @@ -810,30 +810,30 @@ search_using_dag(Dag_node& curr_node, // bool is_fict_vtx = traits->is_fictitious_vertex(curr_item); // if (is_fict_vtx) // { -// Curve_end vtx_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))); +// Curve_end vtx_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))); // print_ce_data(vtx_ce.cv(), vtx_ce.ce(), out); // } // else // { -// print_point_data(boost::apply_visitor(point_for_vertex_visitor(),curr_item), out); +// print_point_data(std::visit(point_for_vertex_visitor(),curr_item), out); // } // -// if ((is_fict_vtx && is_end_point_left_low(p, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)))) || -// (!is_fict_vtx && is_end_point_left_low(p, boost::apply_visitor(point_for_vertex_visitor(),curr_item))) ) +// if ((is_fict_vtx && is_end_point_left_low(p, *(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)))) || +// (!is_fict_vtx && is_end_point_left_low(p, std::visit(point_for_vertex_visitor(),curr_item))) ) // { // out << " Going left " << std::endl; // curr_node = curr_node.left_child(); // continue; // } -// else if ((is_fict_vtx && is_end_point_right_top(p, *(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)))) || -// (!is_fict_vtx && is_end_point_right_top(p, boost::apply_visitor(point_for_vertex_visitor(),curr_item))) ) +// else if ((is_fict_vtx && is_end_point_right_top(p, *(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)))) || +// (!is_fict_vtx && is_end_point_right_top(p, std::visit(point_for_vertex_visitor(),curr_item))) ) // { // out << " Going right " << std::endl; // curr_node = curr_node.right_child(); // continue; // } -// else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || -// (!is_fict_vtx && traits->equal_2_object()(boost::apply_visitor(point_for_vertex_visitor(),curr_item), p)) ) +// else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || +// (!is_fict_vtx && traits->equal_2_object()(std::visit(point_for_vertex_visitor(),curr_item), p)) ) // { // out << " Equal to query " << std::endl; // if (he == m_empty_he_handle) //if he is the empty handle @@ -876,7 +876,7 @@ search_using_dag(Dag_node& curr_node, // // if curr_item represents an edge, // // so top() is a real Halfedge with a curve() if curr_item is active // // or curr_item holds the curve if it is not active -// const X_monotone_curve_2& he_cv = *(boost::apply_visitor(cv_for_edge_visitor(), curr_item)); +// const X_monotone_curve_2& he_cv = *(std::visit(cv_for_edge_visitor(), curr_item)); // // out << " EDGE : " ; // if (traits->is_active(curr_item)) @@ -951,7 +951,7 @@ search_using_dag(Dag_node& curr_node, // if (traits->is_active(curr_item)) // { // out << " (active) "; -// Td_active_trapezoid tr = boost::get(curr_item); +// Td_active_trapezoid tr = std::get(curr_item); // if (tr.is_on_boundaries()) // out << " UNBOUNDED! "; // else @@ -1023,20 +1023,20 @@ search_using_dag_with_cv(Dag_node& curr_node, if (traits->is_td_vertex(curr_item)) { // the curr_item represents a vertex //bool is_fict_vtx = traits->is_fictitious_vertex(curr_item); - //if ((is_fict_vtx && is_end_point_right_top(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || - // (!is_fict_vtx && is_end_point_right_top(boost::apply_visitor(point_for_vertex_visitor(), curr_item), ce)) ) + //if ((is_fict_vtx && is_end_point_right_top(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || + // (!is_fict_vtx && is_end_point_right_top(std::visit(point_for_vertex_visitor(), curr_item), ce)) ) if (is_end_point_left_low(ce, curr_node)) { curr_node = curr_node.left_child(); continue; } - //else if ((is_fict_vtx && is_end_point_left_low(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || - // (!is_fict_vtx && is_end_point_left_low(boost::apply_visitor(point_for_vertex_visitor(), curr_item), ce)) ) + //else if ((is_fict_vtx && is_end_point_left_low(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || + // (!is_fict_vtx && is_end_point_left_low(std::visit(point_for_vertex_visitor(), curr_item), ce)) ) else if (is_end_point_right_top(ce, curr_node)) { curr_node = curr_node.right_child(); continue; } - //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || - // (!is_fict_vtx && traits->equal_curve_end_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item), ce)) ) + //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), ce)) || + // (!is_fict_vtx && traits->equal_curve_end_2_object()(std::visit(point_for_vertex_visitor(), curr_item), ce)) ) else if (are_equal_end_points(ce, curr_node)) { if (!p_cv) { // p_cv was not given @@ -1070,13 +1070,13 @@ search_using_dag_with_cv(Dag_node& curr_node, is_end_point_right_top(ce, curr_node) || are_equal_end_points(ce, curr_node)); //(is_fict_vtx && - // (is_end_point_left_low(ce,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // is_end_point_right_top(ce,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)),ce))) || + // (is_end_point_left_low(ce,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // is_end_point_right_top(ce,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)),ce))) || // (!is_fict_vtx && - // (is_end_point_left_low(ce,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // is_end_point_right_top(ce,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // traits->equal_curve_end_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item),ce)))); + // (is_end_point_left_low(ce,std::visit(point_for_vertex_visitor(), curr_item)) || + // is_end_point_right_top(ce,std::visit(point_for_vertex_visitor(), curr_item)) || + // traits->equal_curve_end_2_object()(std::visit(point_for_vertex_visitor(), curr_item),ce)))); return Locate_type(); } } @@ -1086,7 +1086,7 @@ search_using_dag_with_cv(Dag_node& curr_node, // or curr_item holds the curve if it is not active const X_monotone_curve_2& he_cv = - *(boost::apply_visitor(cv_for_edge_visitor(), curr_item)); + *(std::visit(cv_for_edge_visitor(), curr_item)); Comparison_result cres = traits->compare_curve_end_y_at_x_2_object()(ce, he_cv); if (cres == SMALLER) { @@ -1174,7 +1174,7 @@ search_using_dag_with_cv(Dag_node& curr_node, else { // if is_degenerate() == 0, meaning: curr_item is a real trapezoid if (traits->is_active(curr_item)) { - Td_active_trapezoid& tr = boost::get(curr_item); + Td_active_trapezoid& tr = std::get(curr_item); return tr.is_on_boundaries() ? UNBOUNDED_TRAPEZOID : TRAPEZOID; } curr_node = curr_node.left_child(); @@ -1213,20 +1213,20 @@ search_using_dag_with_cv(Dag_node& curr_node, if (traits->is_td_vertex(curr_item)) { // the curr_item represents a vertex //bool is_fict_vtx = traits->is_fictitious_vertex(curr_item); - //if ((is_fict_vtx && is_end_point_right_top(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || - // (!is_fict_vtx && is_end_point_right_top(boost::apply_visitor(point_for_vertex_visitor(), curr_item), p)) ) + //if ((is_fict_vtx && is_end_point_right_top(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || + // (!is_fict_vtx && is_end_point_right_top(std::visit(point_for_vertex_visitor(), curr_item), p)) ) if (is_end_point_left_low(p, curr_node)) { curr_node = curr_node.left_child(); continue; } - //else if ((is_fict_vtx && is_end_point_left_low(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || - // (!is_fict_vtx && is_end_point_left_low(boost::apply_visitor(point_for_vertex_visitor(), curr_item), p)) ) + //else if ((is_fict_vtx && is_end_point_left_low(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || + // (!is_fict_vtx && is_end_point_left_low(std::visit(point_for_vertex_visitor(), curr_item), p)) ) else if (is_end_point_right_top(p, curr_node)) { curr_node = curr_node.right_child(); continue; } - //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || - // (!is_fict_vtx && traits->equal_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item), p)) ) + //else if ((is_fict_vtx && traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), p)) || + // (!is_fict_vtx && traits->equal_2_object()(std::visit(point_for_vertex_visitor(), curr_item), p)) ) else if (are_equal_end_points(p, curr_node)) { if (!p_cv) { // p_cv was not given @@ -1260,13 +1260,13 @@ search_using_dag_with_cv(Dag_node& curr_node, is_end_point_right_top(p, curr_node) || are_equal_end_points(p, curr_node)); //CGAL_assertion((is_fict_vtx && - // (is_end_point_left_low(p,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // is_end_point_right_top(p,*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item))) || - // traits->equal_curve_end_2_object()(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)),p))) || + // (is_end_point_left_low(p,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // is_end_point_right_top(p,*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item))) || + // traits->equal_curve_end_2_object()(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)),p))) || // (!is_fict_vtx && - // (is_end_point_left_low(p,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // is_end_point_right_top(p,boost::apply_visitor(point_for_vertex_visitor(), curr_item)) || - // traits->equal_2_object()(boost::apply_visitor(point_for_vertex_visitor(), curr_item),p)))); + // (is_end_point_left_low(p,std::visit(point_for_vertex_visitor(), curr_item)) || + // is_end_point_right_top(p,std::visit(point_for_vertex_visitor(), curr_item)) || + // traits->equal_2_object()(std::visit(point_for_vertex_visitor(), curr_item),p)))); return Locate_type(); } } @@ -1275,7 +1275,7 @@ search_using_dag_with_cv(Dag_node& curr_node, // so top() is a real Halfedge with a curve() if curr_item is active // or curr_item holds the curve if it is not active const X_monotone_curve_2& he_cv = - *(boost::apply_visitor(cv_for_edge_visitor(), curr_item)); + *(std::visit(cv_for_edge_visitor(), curr_item)); Comparison_result cres = traits->compare_y_at_x_2_object()(p, he_cv); if (cres == SMALLER) { curr_node = curr_node.left_child(); @@ -1351,7 +1351,7 @@ search_using_dag_with_cv(Dag_node& curr_node, else { // is_degenerate() == 0, meaning: curr_item is a real trapezoid if (traits->is_active(curr_item)) { - Td_active_trapezoid& tr = boost::get(curr_item); + Td_active_trapezoid& tr = std::get(curr_item); return tr.is_on_boundaries() ? UNBOUNDED_TRAPEZOID : TRAPEZOID; } curr_node = curr_node.left_child(); @@ -1377,7 +1377,7 @@ container2dag(Nodes_map& ar, int left, int right, int& num_of_new_nodes) const CGAL_assertion(traits->is_active(item)); CGAL_assertion(traits->is_td_trapezoid(item)); Dag_node& tr_node( ar.find(d)->second); - Td_active_trapezoid& tr(boost::get(tr_node.get_data())); + Td_active_trapezoid& tr(std::get(tr_node.get_data())); Vertex_const_handle v = tr.right(); Curve_end ce(traits->vtx_to_ce(v)); @@ -1397,15 +1397,15 @@ container2dag(Nodes_map& ar, int left, int right, int& num_of_new_nodes) const } num_of_new_nodes++; - boost::apply_visitor(set_dag_node_visitor((Dag_node*)&(curr_node.left_child())), curr_node.left_child().get_data()); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)&(curr_node.right_child())), curr_node.right_child().get_data()); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)&curr_node), + std::visit(set_dag_node_visitor((Dag_node*)&(curr_node.left_child())), curr_node.left_child().get_data()); + std::visit(set_dag_node_visitor((Dag_node*)&(curr_node.right_child())), curr_node.right_child().get_data()); + std::visit(set_dag_node_visitor((Dag_node*)&curr_node), curr_node.get_data()); //curr_node.left_child()->set_dag_node(&curr_node.left_child()); //curr_node.right_child()->set_dag_node(&curr_node.right_child()); //curr_node->set_dag_node(&curr_node);// fake temporary node deactivate_vertex(curr_node); //curr_node->remove(); // mark as deleted - boost::apply_visitor(set_dag_node_visitor((Dag_node*)nullptr), + std::visit(set_dag_node_visitor((Dag_node*)nullptr), curr_node.get_data());//curr_node->set_dag_node(0); return curr_node; @@ -1423,7 +1423,7 @@ is_last_edge(Halfedge_const_handle /* he */ , Td_map_item& vtx_item) CGAL_precondition(traits->is_active(vtx_item)); Vertex_const_handle - v(boost::apply_visitor(vertex_for_active_vertex_visitor(), vtx_item)); + v(std::visit(vertex_for_active_vertex_visitor(), vtx_item)); typename Arrangement_on_surface_2::Halfedge_around_vertex_const_circulator first, second; @@ -1518,8 +1518,8 @@ Trapezoidal_decomposition_2::insert(Halfedge_const_handle he) // locate and insert end points of the input halfedge to the Td_map_item // Dag if needed - Dag_node p1_node(*(boost::apply_visitor(dag_node_visitor(), p1_item))); - //Dag_node p2_node(*(boost::apply_visitor(dag_node_visitor(), p2_item)));// Not in use + Dag_node p1_node(*(std::visit(dag_node_visitor(), p1_item))); + //Dag_node p2_node(*(std::visit(dag_node_visitor(), p2_item)));// Not in use // create the Td_map_item iterator for traveling along the Trapezoids that // intersect the input Halfedge, using left-low to right-high order @@ -1568,7 +1568,7 @@ Trapezoidal_decomposition_2::insert(Halfedge_const_handle he) traits->is_active(new_btm_item)); if (merge_if_possible(prev_bottom_tr, new_btm_item)) { Dag_node* left_child_node = - boost::apply_visitor(dag_node_visitor(),prev_bottom_tr); + std::visit(dag_node_visitor(),prev_bottom_tr); node->set_left_child(*left_child_node); old_bottom_tr = prev_bottom_tr; m_number_of_dag_nodes--; //update number of nodes in the DAG after merge @@ -1581,7 +1581,7 @@ Trapezoidal_decomposition_2::insert(Halfedge_const_handle he) CGAL_assertion(traits->is_td_trapezoid(new_top_item) && traits->is_active(new_top_item)); if (merge_if_possible(prev_top_tr, new_top_item)) { - Dag_node* right_child_node = boost::apply_visitor(dag_node_visitor(), + Dag_node* right_child_node = std::visit(dag_node_visitor(), prev_top_tr); node->set_right_child(*right_child_node); old_top_tr = prev_top_tr; @@ -1654,12 +1654,12 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) if (lt1 != POINT || lt2 != POINT) return; - CGAL_warning(boost::apply_visitor(dag_node_visitor(), p1_item) != nullptr); - CGAL_warning(boost::apply_visitor(dag_node_visitor(), p2_item) != nullptr); + CGAL_warning(std::visit(dag_node_visitor(), p1_item) != nullptr); + CGAL_warning(std::visit(dag_node_visitor(), p2_item) != nullptr); //retrieve the Dag_nodes of the two point-degenerate trapezoid - Dag_node& p1_node = *(boost::apply_visitor(dag_node_visitor(), p1_item)); - Dag_node& p2_node = *(boost::apply_visitor(dag_node_visitor(), p2_item)); + Dag_node& p1_node = *(std::visit(dag_node_visitor(), p1_item)); + Dag_node& p2_node = *(std::visit(dag_node_visitor(), p2_item)); //calculate the immediate lower, central and upper neighborhood of // the curve in the data structure @@ -1725,7 +1725,7 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) //copy trapezoid data from btm and top trapezoids Dag_node& new_node = (new_array.find(sz))->second; ++sz; - Td_active_trapezoid& tr(boost::get(new_node.get_data())); + Td_active_trapezoid& tr(std::get(new_node.get_data())); tr.set_dag_node(&new_node); tr.set_lb(btm_it_tr.lb()); tr.set_lt(top_it_tr.lt()); @@ -1741,13 +1741,13 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) } if (!traits->is_empty_item(tr.lb())) { Td_map_item lb_item = tr.lb(); - Td_active_trapezoid& lb_tr(boost::get(lb_item)); + Td_active_trapezoid& lb_tr(std::get(lb_item)); lb_tr.set_rb(new_node.get_data()); } if (!traits->is_empty_item(tr.lt())) { Td_map_item lt_item = tr.lt(); - Td_active_trapezoid& lt_tr(boost::get(lt_item)); + Td_active_trapezoid& lt_tr(std::get(lt_item)); lt_tr.set_rt(new_node.get_data()); } @@ -1769,23 +1769,23 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) if (!btm_it || (inc_btm && !traits->is_trpz_bottom_equal(old_tr_item, *curr_it))) { - Td_map_item rb(boost::apply_visitor(rb_visitor(), old_tr_item)); + Td_map_item rb(std::visit(rb_visitor(), old_tr_item)); if (!traits->is_empty_item(rb)) { - boost::apply_visitor(set_lb_visitor(last_new_tr_item), rb); + std::visit(set_lb_visitor(last_new_tr_item), rb); //rb->set_lb(last_new_tr); - boost::apply_visitor(set_rb_visitor(rb), last_new_tr_item); + std::visit(set_rb_visitor(rb), last_new_tr_item); //last_new_tr->set_rb(rb); } } if (!top_it || (!inc_btm && !traits->is_trpz_top_equal(old_tr_item,*curr_it))) { - Td_map_item rt(boost::apply_visitor(rt_visitor(), old_tr_item)); + Td_map_item rt(std::visit(rt_visitor(), old_tr_item)); if (!traits->is_empty_item(rt)) { - boost::apply_visitor(set_lt_visitor(last_new_tr_item), rt); + std::visit(set_lt_visitor(last_new_tr_item), rt); //rt->set_lt(last_new_tr); - boost::apply_visitor(set_rt_visitor(rt), last_new_tr_item); + std::visit(set_rt_visitor(rt), last_new_tr_item); //last_new_tr->set_rt(rt); } } @@ -1793,7 +1793,7 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) //set the no longer relevant trapezoids as removed and add the new nodes // as their replacement - Dag_node* last_tr_node(boost::apply_visitor(dag_node_visitor(), + Dag_node* last_tr_node(std::visit(dag_node_visitor(), last_tr_item)); if (prev_inc_btm != inc_btm) { @@ -1827,7 +1827,7 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) // update the dag node pointer in the trapezoid const Dag_node* real = &last_tr_node->left_child(); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)real),real->get_data()); //(*real)->set_dag_node((Dag_node*)real); + std::visit(set_dag_node_visitor((Dag_node*)real),real->get_data()); //(*real)->set_dag_node((Dag_node*)real); } while(!end_reached); @@ -1853,18 +1853,18 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) m_number_of_dag_nodes += num_of_new_nodes; //new node (tmp) was added const Dag_node* real = &tr.dag_node()->left_child(); - boost::apply_visitor(set_dag_node_visitor((Dag_node*)real),real->get_data()); //(*real)->set_dag_node((Dag_node*)real); + std::visit(set_dag_node_visitor((Dag_node*)real),real->get_data()); //(*real)->set_dag_node((Dag_node*)real); if (!traits->is_empty_item(rb)) { - boost::apply_visitor(set_rb_visitor(rb),last_new_tr_item); + std::visit(set_rb_visitor(rb),last_new_tr_item); //last_new_tr->set_rb(rb); - boost::apply_visitor(set_lb_visitor(last_new_tr_item),rb); + std::visit(set_lb_visitor(last_new_tr_item),rb); //rb->set_lb(last_new_tr); } if (!traits->is_empty_item(rt)) { - boost::apply_visitor(set_rt_visitor(rt),last_new_tr_item); + std::visit(set_rt_visitor(rt),last_new_tr_item); //last_new_tr->set_rt(rt); - boost::apply_visitor(set_lt_visitor(last_new_tr_item),rt); + std::visit(set_lt_visitor(last_new_tr_item),rt); //rt->set_lt(last_new_tr); } @@ -1876,7 +1876,7 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) //Base_trapezoid_iterator last_mid = mid_it; Dag_node* e_node = nullptr; while (!!++mid_it) { - e_node = boost::apply_visitor(dag_node_visitor(),*last_edge_fragment_it); + e_node = std::visit(dag_node_visitor(),*last_edge_fragment_it); deactivate_edge(removed_cv_ptr,*e_node); //last_mid->remove(); last_edge_fragment_it = mid_it; } @@ -1885,7 +1885,7 @@ void Trapezoidal_decomposition_2::remove(Halfedge_const_handle he) //4. remove adjacency at right end point //remove the final trapezoid representing the removed halfedge - e_node = boost::apply_visitor(dag_node_visitor(),*last_edge_fragment_it); + e_node = std::visit(dag_node_visitor(),*last_edge_fragment_it); deactivate_edge(removed_cv_ptr,*e_node); //last_mid->remove(); //----------------------------------- @@ -1945,7 +1945,7 @@ vertical_ray_shoot(const Point & p,Locate_type & lt, p x------x */ - Td_active_trapezoid& tr(boost::get(item)); + Td_active_trapezoid& tr(std::get(item)); if ((up_direction && !tr.is_on_right_boundary() && (traits->compare_curve_end_x_2_object() @@ -2637,9 +2637,9 @@ merge_edge(Halfedge_const_handle he1, Td_map_item mrgp_item = locate(ce, lt); //varifying that all trapezoids are not nullptr and are of type POINT - CGAL_warning(boost::apply_visitor(dag_node_visitor(), leftp_item) != nullptr); - CGAL_warning(boost::apply_visitor(dag_node_visitor(), rightp_item)!= nullptr); - CGAL_warning(boost::apply_visitor(dag_node_visitor(), mrgp_item) != nullptr); + CGAL_warning(std::visit(dag_node_visitor(), leftp_item) != nullptr); + CGAL_warning(std::visit(dag_node_visitor(), rightp_item)!= nullptr); + CGAL_warning(std::visit(dag_node_visitor(), mrgp_item) != nullptr); //define the left curve and the right curve, according // to the common point (that is merged) @@ -2679,8 +2679,8 @@ merge_edge(Halfedge_const_handle he1, #endif //get the nodes of leftmost point and merge point - Dag_node& leftp_node = *(boost::apply_visitor(dag_node_visitor(), leftp_item)); - Dag_node& mrgp_node = *(boost::apply_visitor(dag_node_visitor(), mrgp_item)); + Dag_node& leftp_node = *(std::visit(dag_node_visitor(), leftp_item)); + Dag_node& mrgp_node = *(std::visit(dag_node_visitor(), mrgp_item)); //set iterators for below left curve, on left curve & above left curve In_face_iterator @@ -2760,15 +2760,15 @@ merge_edge(Halfedge_const_handle he1, merge_if_possible(below_cv_left, below_cv_right); // mark older trapezoids as inactive - nodes depth are updated here - Dag_node* above_cv_right_node(boost::apply_visitor(dag_node_visitor(), + Dag_node* above_cv_right_node(std::visit(dag_node_visitor(), above_cv_right)); - Dag_node* above_cv_left_node(boost::apply_visitor(dag_node_visitor(), + Dag_node* above_cv_left_node(std::visit(dag_node_visitor(), above_cv_left)); deactivate_trapezoid( *above_cv_right_node, above_cv_left_node); //above_cv_right->remove(above_cv_left->dag_node()); - Dag_node* below_cv_right_node(boost::apply_visitor(dag_node_visitor(), + Dag_node* below_cv_right_node(std::visit(dag_node_visitor(), below_cv_right)); - Dag_node* below_cv_left_node(boost::apply_visitor(dag_node_visitor(), + Dag_node* below_cv_left_node(std::visit(dag_node_visitor(), below_cv_left)); deactivate_trapezoid( *below_cv_right_node, below_cv_left_node); //below_cv_right->remove(below_cv_left->dag_node()); @@ -2788,7 +2788,7 @@ merge_edge(Halfedge_const_handle he1, CGAL_assertion(traits->is_td_edge(on_cv_left) && traits->is_active(on_cv_left)); - Td_active_edge& e_left(boost::get(on_cv_left)); + Td_active_edge& e_left(std::get(on_cv_left)); e_left.set_next(on_cv_right); CGAL_assertion(traits->is_td_edge(on_cv_right) && @@ -2830,17 +2830,17 @@ longest_query_path_length_rec(bool minus_inf, Dag_node& min_node, if (!minus_inf && !plus_inf) { Td_map_item min_node_item(min_node.get_data()); if (traits->is_fictitious_vertex(min_node_item)) { - const Curve_end min_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),min_node_item))); + const Curve_end min_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),min_node_item))); Td_map_item max_node_item(max_node.get_data()); if (traits->is_fictitious_vertex(max_node_item)) { - const Curve_end max_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),max_node_item))); + const Curve_end max_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),max_node_item))); //min-fict, max-fict if (!is_end_point_left_low(min_ce, max_ce)) return 0; } else { - const Point& max_p(boost::apply_visitor(point_for_vertex_visitor(), + const Point& max_p(std::visit(point_for_vertex_visitor(), max_node_item)); //min-fict, max-pt @@ -2849,18 +2849,18 @@ longest_query_path_length_rec(bool minus_inf, Dag_node& min_node, } } else { - const Point& min_p(boost::apply_visitor(point_for_vertex_visitor(), + const Point& min_p(std::visit(point_for_vertex_visitor(), min_node_item)); Td_map_item max_node_item(max_node.get_data()); if (traits->is_fictitious_vertex(max_node_item)) { - const Curve_end max_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),max_node_item))); + const Curve_end max_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),max_node_item))); //min-pt, max-fict if (!is_end_point_left_low(min_p, max_ce)) return 0; } else { - const Point& max_p(boost::apply_visitor(point_for_vertex_visitor(), + const Point& max_p(std::visit(point_for_vertex_visitor(), max_node_item)); //min-pt, max-pt @@ -2893,19 +2893,19 @@ longest_query_path_length_rec(bool minus_inf, Dag_node& min_node, if (!minus_inf) { Td_map_item min_node_item(min_node.get_data()); if (traits->is_fictitious_vertex(min_node_item)) { - const Curve_end min_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),min_node_item))); + const Curve_end min_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),min_node_item))); //if smaller than the point represented by min_node - //if ((is_fict_vtx && is_end_point_left_low(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), min_ce)) || - // (!is_fict_vtx && is_end_point_left_low(boost::apply_visitor(point_for_vertex_visitor(), curr_item), min_ce) )) + //if ((is_fict_vtx && is_end_point_left_low(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), min_ce)) || + // (!is_fict_vtx && is_end_point_left_low(std::visit(point_for_vertex_visitor(), curr_item), min_ce) )) if (is_end_point_right_top(min_ce, node)) { new_min_node = min_node; } } else { - const Point& min_p(boost::apply_visitor(point_for_vertex_visitor(),min_node_item)); + const Point& min_p(std::visit(point_for_vertex_visitor(),min_node_item)); //if smaller than the point represented by min_node - //if ((is_fict_vtx && is_end_point_left_low(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), min_p)) || - // (!is_fict_vtx && is_end_point_left_low(boost::apply_visitor(point_for_vertex_visitor(), curr_item), min_p) )) + //if ((is_fict_vtx && is_end_point_left_low(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), min_p)) || + // (!is_fict_vtx && is_end_point_left_low(std::visit(point_for_vertex_visitor(), curr_item), min_p) )) if (is_end_point_right_top(min_p, node)) { new_min_node = min_node; } @@ -2917,21 +2917,21 @@ longest_query_path_length_rec(bool minus_inf, Dag_node& min_node, if (!plus_inf) { Td_map_item max_node_item(max_node.get_data()); if (traits->is_fictitious_vertex(max_node_item)) { - const Curve_end max_ce(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),max_node_item))); + const Curve_end max_ce(*(std::visit(curve_end_for_fict_vertex_visitor(),max_node_item))); //if larger than the point represented by max_node - //if ((is_fict_vtx && is_end_point_right_top(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), max_ce)) || - // (!is_fict_vtx && is_end_point_right_top(boost::apply_visitor(point_for_vertex_visitor(), curr_item), max_ce) )) + //if ((is_fict_vtx && is_end_point_right_top(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), max_ce)) || + // (!is_fict_vtx && is_end_point_right_top(std::visit(point_for_vertex_visitor(), curr_item), max_ce) )) if (is_end_point_left_low(max_ce, node)) { new_max_node = max_node; } } else { - const Point& max_p(boost::apply_visitor(point_for_vertex_visitor(), + const Point& max_p(std::visit(point_for_vertex_visitor(), max_node_item)); //if smaller than the point represented by min_node - //if ((is_fict_vtx && is_end_point_right_top(*(boost::apply_visitor(curve_end_for_fict_vertex_visitor(),curr_item)), max_p)) || - // (!is_fict_vtx && is_end_point_right_top(boost::apply_visitor(point_for_vertex_visitor(), curr_item), max_p) )) + //if ((is_fict_vtx && is_end_point_right_top(*(std::visit(curve_end_for_fict_vertex_visitor(),curr_item)), max_p)) || + // (!is_fict_vtx && is_end_point_right_top(std::visit(point_for_vertex_visitor(), curr_item), max_p) )) if (is_end_point_left_low(max_p, node)) { new_max_node = max_node; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h index db555da63f4c..8516cc85be2d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h @@ -19,7 +19,7 @@ // The macro CGAL_ARR_POINT_LOCATION_VERSION controls which version of the // point location is used. Currently two values are supported: // 1. Point location with CGAL::Object -// 2. Point location with std::optional > +// 2. Point location with std::optional > // The default value is 2. #if !defined(CGAL_ARR_POINT_LOCATION_VERSION) @@ -29,7 +29,7 @@ #include #include -#include +#include #ifdef CGAL_CFG_BOOST_VARIANT_SWAP_BUG #if CGAL_ARR_POINT_LOCATION_VERSION > 1 @@ -64,7 +64,7 @@ struct Arr_point_location_result { #if CGAL_ARR_POINT_LOCATION_VERSION < 2 typedef CGAL::Object Type; #else - typedef typename boost::variant Type; #endif @@ -73,7 +73,7 @@ struct Arr_point_location_result { // This function returns either make_object() or a result_type constructor // to generate return values. The Object version takes a dummy template // argument, which is needed for the return of the other option, e.g., - // std::optional >. + // std::optional >. // In theory a one parameter variant could be returned, but this _could_ // lead to conversion overhead, and so we rather go for the real type. // Overloads for empty returns are also provided. @@ -99,7 +99,7 @@ struct Arr_point_location_result { template static - inline const T* assign(const Type* obj) { return boost::get(obj); } + inline const T* assign(const Type* obj) { return std::get(obj); } #endif // CGAL_ARR_POINT_LOCATION_VERSION < 2 //this one is only to remove warnings in functions diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index db9b12395f9c..4998f53d6463 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include @@ -185,9 +185,9 @@ class Arr_polycurve_traits_2 : OutputIterator operator_impl(const Curve_2& cv, OutputIterator oi, Arr_all_sides_oblivious_tag) const { - typedef boost::variant + typedef std::variant Make_x_monotone_subresult; - typedef boost::variant + typedef std::variant Make_x_monotone_result; // If the polycurve is empty, return. @@ -212,7 +212,7 @@ class Arr_polycurve_traits_2 : for (auto its = cv.subcurves_begin(); its != cv.subcurves_end(); ++its) make_seg_x_monotone(*its, std::back_inserter(x_seg_objects)); auto it = x_seg_objects.begin(); - const auto* x_seg_p = boost::get(&(*it)); + const auto* x_seg_p = std::get(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -260,7 +260,7 @@ class Arr_polycurve_traits_2 : #endif for (++it; it != x_seg_objects.end(); ++it) { - const auto* x_seg_p = boost::get(&(*it)); + const auto* x_seg_p = std::get(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -318,9 +318,9 @@ class Arr_polycurve_traits_2 : OutputIterator operator_impl(const Curve_2& cv, OutputIterator oi, Arr_not_all_sides_oblivious_tag) const { - typedef boost::variant + typedef std::variant Make_x_monotone_subresult; - typedef boost::variant + typedef std::variant Make_x_monotone_result; // If the polycurve is empty, return. @@ -350,7 +350,7 @@ class Arr_polycurve_traits_2 : for (auto its = cv.subcurves_begin(); its != cv.subcurves_end(); ++its) make_seg_x_monotone(*its, std::back_inserter(x_seg_objects)); auto it = x_seg_objects.begin(); - const auto* x_seg_p = boost::get(&(*it)); + const auto* x_seg_p = std::get(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -398,7 +398,7 @@ class Arr_polycurve_traits_2 : #endif for (++it; it != x_seg_objects.end(); ++it) { - const auto* x_seg_p = boost::get(&(*it)); + const auto* x_seg_p = std::get(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -696,9 +696,9 @@ class Arr_polycurve_traits_2 : OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_base_result; - typedef boost::variant + typedef std::variant Intersection_result; const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); @@ -824,7 +824,7 @@ class Arr_polycurve_traits_2 : intersect(cv1[i1], cv2[i2], std::back_inserter(xections)); for (const auto& xection : xections) { const X_monotone_subcurve_2* subcv_p = - boost::get(&xection); + std::get(&xection); if (subcv_p != nullptr) { ocv.push_back(*subcv_p); oi = output_ocv (ocv, invert_ocv, oi); @@ -832,7 +832,7 @@ class Arr_polycurve_traits_2 : } const Intersection_point* p_p = - boost::get(&xection); + std::get(&xection); if (p_p != nullptr) *oi++ = Intersection_result(*p_p); } } @@ -846,7 +846,7 @@ class Arr_polycurve_traits_2 : for (const auto& item : sub_xections) { const X_monotone_subcurve_2* x_seg = - boost::get(&item); + std::get(&item); if (x_seg != nullptr) { X_monotone_subcurve_2 seg = *x_seg; // We maintain the variant that if the input curves have opposite @@ -863,7 +863,7 @@ class Arr_polycurve_traits_2 : } const Intersection_point* p_ptr = - boost::get(&item); + std::get(&item); if (p_ptr != nullptr) { // Any point that is not equal to the max_vertex of the // subcurve should be inserted into oi. @@ -990,7 +990,7 @@ class Arr_polycurve_traits_2 : (std::vector& ocv, bool invert_ocv, OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; X_monotone_curve_2 curve; if (invert_ocv) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index da8875c47681..bb418c5d87ba 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -2038,7 +2038,7 @@ class Continuous_rational_arc_d_1: OutputIterator intersect(const Self& arc, OutputIterator oi, const Cache& cache) const { - typedef boost::variant Intersection_result; + typedef std::variant Intersection_result; CGAL_precondition(this->is_valid()); CGAL_precondition(this->is_continuous()); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rational_function_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_rational_function_traits_2.h index 6e775b4917f9..f908224fe265 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rational_function_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rational_function_traits_2.h @@ -827,7 +827,7 @@ class Arr_rational_function_traits_2 template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef boost::variant + typedef std::variant Make_x_monotone_result; // Make the rational arc continuous. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h index 1e3b908faa6e..b34649af583e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h @@ -25,7 +25,7 @@ #include -#include +#include #include #include @@ -565,7 +565,7 @@ class Arr_segment_traits_2 : public Kernel_ { OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { // Wrap the segment with a variant. - typedef boost::variant + typedef std::variant Make_x_monotone_result; *oi++ = Make_x_monotone_result(cv); return oi; @@ -705,7 +705,7 @@ class Arr_segment_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; // Early ending with Bbox overlapping test @@ -723,7 +723,7 @@ class Arr_segment_traits_2 : public Kernel_ { CGAL_assertion(bool(res)); // Check if we have a single intersection point. - const Point_2* ip = boost::get(&*res); + const Point_2* ip = std::get(&*res); if (ip != nullptr) { CGAL_assertion(cv1.is_vertical() ? m_traits.is_in_y_range_2_object()(cv1, *ip) : diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h index 54264ab18e6c..a042f80a5845 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h @@ -154,14 +154,14 @@ class Arr_sgm_initializer { OutputIterator insert(const Vector_3 & normal1, const Vector_3 & normal2, OutputIterator oi) { - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::list x_objects; make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); - const auto* xc = boost::get(&(*it)); + const auto* xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "1.a. insert_in_face_interior(" << *xc << ")" << std::endl; #endif @@ -172,7 +172,7 @@ class Arr_sgm_initializer { ++it; if (it == x_objects.end()) return oi; - xc = boost::get(&(*it)); + xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "1.b. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -195,14 +195,14 @@ class Arr_sgm_initializer { const Vector_3 & normal2, OutputIterator oi) { - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::list x_objects; make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); - const auto* xc = boost::get(&(*it)); + const auto* xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "2.a. insert_from_vertex(" << *xc << ", " << vertex1->point() << ")" << std::endl; @@ -216,7 +216,7 @@ class Arr_sgm_initializer { ++it; if (it == x_objects.end()) return oi; - xc = boost::get(&(*it)); + xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "2.b. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -239,7 +239,7 @@ class Arr_sgm_initializer { const Vector_3 & normal2, Vertex_handle vertex2, OutputIterator oi) { - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::list x_objects; @@ -247,7 +247,7 @@ class Arr_sgm_initializer { auto it = x_objects.begin(); if (x_objects.size() == 1) { - const auto* xc = boost::get(&(*it)); + const auto* xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "3. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -258,8 +258,8 @@ class Arr_sgm_initializer { return oi; } - const X_monotone_curve_2* xc1 = boost::get(&(*it++)); - const X_monotone_curve_2* xc2 = boost::get(&(*it)); + const X_monotone_curve_2* xc1 = std::get(&(*it++)); + const X_monotone_curve_2* xc2 = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "3.a. insert_from_vertex(" << *xc2 << ")" << std::endl; @@ -294,13 +294,13 @@ class Arr_sgm_initializer { const Vector_3 & normal2, Vertex_handle vertex2, OutputIterator oi) { - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::list x_objects; make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); if (x_objects.size() == 1) { - const auto* xc = boost::get(&(*it)); + const auto* xc = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "4. insert_at_vertices(" << *xc << ")" << std::endl; #endif @@ -308,8 +308,8 @@ class Arr_sgm_initializer { return oi; } - const X_monotone_curve_2 * xc1 = boost::get(&(*it++)); - const X_monotone_curve_2 * xc2 = boost::get(&(*it)); + const X_monotone_curve_2 * xc1 = std::get(&(*it++)); + const X_monotone_curve_2 * xc2 = std::get(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "4.a. insert_from_vertex(" << *xc1 diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_transform_on_sphere.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_transform_on_sphere.h index 5116ef4ca45e..78eb6bc2f473 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_transform_on_sphere.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_transform_on_sphere.h @@ -46,7 +46,7 @@ void Arr_transform_on_sphere(Arrangement & arr, typedef typename Arrangement::Halfedge_around_vertex_circulator Halfedge_around_vertex_circulator; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; const Geometry_traits_2 * geom_traits = arr.geometry_traits(); Topology_traits * topol_traits = arr.topology_traits(); @@ -156,10 +156,10 @@ void Arr_transform_on_sphere(Arrangement & arr, auto it = objects.begin(); // The curve that its left vertex lies on the identification curve - const auto* sub_cv1 = boost::get(&(*it)); + const auto* sub_cv1 = std::get(&(*it)); ++it; //The curve that its right vertex lies on the identification curve - const auto* sub_cv2 = boost::get(&(*it)); + const auto* sub_cv2 = std::get(&(*it)); bool eq1 = (*sub_cv1).source() == hei1->source()->point(); bool eq2 = (*sub_cv2).target() == hei1->target()->point(); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h index 97e451bda5f9..edb2a63f9956 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h @@ -506,7 +506,7 @@ class Arr_spherical_topology_traits_2 { * \pre The curve has a boundary condition in either x or y. * \return An object that contains the curve end. */ - std::optional > + std::optional > place_boundary_vertex(Face* f, const X_monotone_curve_2& xc, Arr_curve_end ind, @@ -538,7 +538,7 @@ class Arr_spherical_topology_traits_2 { * \pre The curve end is incident to the boundary. * \return An object that contains the curve end. */ - boost::variant + std::variant locate_curve_end(const X_monotone_curve_2& xc, Arr_curve_end ce, Arr_parameter_space ps_x, Arr_parameter_space ps_y); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h index b9f94fd92fcf..ba76651f9d77 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h @@ -47,7 +47,7 @@ class Arr_bounded_planar_vert_decomp_helper { typedef typename Arrangement_2::Face_const_handle Face_const_handle; typedef typename Arrangement_2::Topology_traits Topology_traits; - typedef boost::variant Cell_type; typedef std::optional Vert_type; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h index ef4da091be75..34149d15af30 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h @@ -572,7 +572,7 @@ let_me_decide_the_outer_ccb(std::pair< CGAL::Sign, CGAL::Sign> signs1, */ template std::optional - ::Vertex*, typename Arr_spherical_topology_traits_2::Halfedge*> > Arr_spherical_topology_traits_2:: @@ -585,7 +585,7 @@ place_boundary_vertex(Face* /* f */, , Arr_parameter_space ps_y) { - typedef boost::variant Non_optional_result; + typedef std::variant Non_optional_result; typedef std::optional Result; // std::cout << "place_boundary_vertex()" << std::endl; @@ -647,7 +647,7 @@ locate_around_boundary_vertex(Vertex* v, /*! \brief locates a DCEL feature that contains a given curve end. */ template -boost::variant +std::variant ::Vertex*, typename Arr_spherical_topology_traits_2::Halfedge*, typename Arr_spherical_topology_traits_2::Face*> @@ -660,7 +660,7 @@ locate_curve_end(const X_monotone_curve_2& xc, Arr_curve_end ind, , Arr_parameter_space ps_y) { - typedef boost::variant Result; + typedef std::variant Result; // Act according to the boundary conditions. if (ps_y == ARR_TOP_BOUNDARY) { // In case the curve end coincides with the north pole, return the vertex diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h index f83aab57b858..931359c3f116 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h @@ -48,7 +48,7 @@ class Arr_spherical_vert_decomp_helper { typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle; typedef typename Arrangement_2::Face_const_handle Face_const_handle; - typedef boost::variant Cell_type; typedef std::optional Vert_type; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h index f9c7f957c34a..2736919a601f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h @@ -297,7 +297,7 @@ are_equal(const Vertex *v, // template std::optional - ::Vertex*, typename Arr_unb_planar_topology_traits_2::Halfedge*> > Arr_unb_planar_topology_traits_2:: @@ -305,7 +305,7 @@ place_boundary_vertex(Face* f, const X_monotone_curve_2& cv, Arr_curve_end ind, Arr_parameter_space ps_x, Arr_parameter_space ps_y) { - typedef boost::variant Non_optional_result; + typedef std::variant Non_optional_result; typedef std::optional Result; // Get a halfedge on the outer CCB of f and start traversing the CCB. @@ -338,7 +338,7 @@ place_boundary_vertex(Face* f, // Locate a DCEL feature that contains the given unbounded curve end. // template -boost::variant +std::variant ::Vertex*, typename Arr_unb_planar_topology_traits_2::Halfedge*, typename Arr_unb_planar_topology_traits_2::Face*> @@ -346,7 +346,7 @@ Arr_unb_planar_topology_traits_2:: locate_curve_end (const X_monotone_curve_2& cv, Arr_curve_end ind, Arr_parameter_space ps_x, Arr_parameter_space ps_y) { - typedef boost::variant Result; + typedef std::variant Result; // Start traversing the inner CCB of the fictitious face and try to locate // a feature that contains the curve end. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h index befc27bb89f0..2b0abaceb4bd 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h @@ -46,7 +46,7 @@ class Arr_unb_planar_vert_decomp_helper { typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle; typedef typename Arrangement_2::Face_const_handle Face_const_handle; - typedef boost::variant Cell_type; typedef std::optional Vert_type; 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 f631bef376ad..06f095fb54c4 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 @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include @@ -531,7 +531,7 @@ class Arr_tracing_traits_2 : public Base_traits { std::cout << "make_x_monotone" << std::endl << " cv: " << cv << std::endl; - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::list container; @@ -540,12 +540,12 @@ class Arr_tracing_traits_2 : public Base_traits { size_t i = 0; for (auto it = container.begin(); it != container.end(); ++it) { - if (const auto* xcv = boost::get(&*it)) { + if (const auto* xcv = std::get(&*it)) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; continue; } - if (const auto* p = boost::get(&*it)) { + if (const auto* p = std::get(&*it)) { std::cout << " result[" << i++ << "]: p: " << *p << std::endl; continue; } @@ -618,7 +618,7 @@ class Arr_tracing_traits_2 : public Base_traits { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; if (! m_enabled) return m_object(xcv1, xcv2, oi); @@ -632,13 +632,13 @@ class Arr_tracing_traits_2 : public Base_traits { unsigned int i = 0; for (const auto& item : container) { - const X_monotone_curve_2* xcv = boost::get(&item); + const X_monotone_curve_2* xcv = std::get(&item); if (xcv != nullptr) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; continue; } - const Intersection_point* ip = boost::get(&item); + const Intersection_point* ip = std::get(&item); if (ip != nullptr) { std::cout << " result[" << i++ << "]: p: " << ip->first << ", multiplicity: " << ip->second << std::endl; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h index 86df601c06ad..cfe427625df3 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h @@ -291,7 +291,7 @@ class Arr_unb_planar_topology_traits_2 : * \return An object that contains the curve end. * In our case this object always wraps a fictitious edge. */ - std::optional > + std::optional > place_boundary_vertex(Face* f, const X_monotone_curve_2& cv, Arr_curve_end ind, @@ -330,7 +330,7 @@ class Arr_unb_planar_topology_traits_2 : * In our case this object may either wrap an unbounded face, * or an edge with an end-vertex at infinity (in case of an overlap). */ - boost::variant + std::variant locate_curve_end(const X_monotone_curve_2& cv, Arr_curve_end ind, Arr_parameter_space ps_x, diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_compute_zone_visitor.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_compute_zone_visitor.h index 27f1a980debc..2abcd426bf4d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_compute_zone_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_compute_zone_visitor.h @@ -20,7 +20,7 @@ * Definition of the Arr_compute_zone_visitor class. */ -#include +#include namespace CGAL { @@ -55,7 +55,7 @@ class Arr_compute_zone_visitor const Vertex_handle invalid_v; // Invalid vertex. OutputIterator& out_iter; // for outputting the zone objects. - // Its value type is boost::variant. + // Its value type is std::variant. bool output_left; // Determines whether we should // output the left end point of a // subcurve (to avoid outputting @@ -97,7 +97,7 @@ class Arr_compute_zone_visitor Vertex_handle left_v, Halfedge_handle left_he, Vertex_handle right_v, Halfedge_handle right_he) { - typedef boost::variant + typedef std::variant Zone_result; if (output_left) { @@ -138,7 +138,7 @@ class Arr_compute_zone_visitor Halfedge_handle he, Vertex_handle left_v, Vertex_handle right_v) { - typedef boost::variant + typedef std::variant Zone_result; if (output_left) { 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 d98f1c1307c0..9c74e4ef9d71 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 @@ -643,7 +643,7 @@ class Arr_traits_basic_adaptor_2 : public ArrangementBasicTraits_ { Tag_false) const { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; std::list intersections; m_self->intersect_2_object()(xcv1, xcv2, back_inserter(intersections)); @@ -3370,7 +3370,7 @@ class Arr_traits_adaptor_2 : */ class Compare_xy_2 { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; public: @@ -3580,7 +3580,7 @@ class Arr_traits_adaptor_2 : // Verify the first intersection is an overlap, remove it, and // recursively call. const X_monotone_curve_2* xcv = - boost::get(&(intersections.front())); + std::get(&(intersections.front())); if (! xcv) { CGAL_error_msg("The first intersection is not an overlap!"); return SMALLER; diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index c39c34099a53..0338b67e73e7 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -83,7 +83,7 @@ void insert(Arrangement_on_surface_2& arr, typedef typename Gt2::Point_2 Point_2; typedef typename Gt2::X_monotone_curve_2 X_monotone_curve_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; // Obtain an arrangement accessor. Arr_accessor arr_access(arr); @@ -100,7 +100,7 @@ void insert(Arrangement_on_surface_2& arr, // Insert each x-monotone curve into the arrangement. for (const auto& x_obj : x_objects) { // Act according to the type of the current object. - const auto* x_curve = boost::get(&x_obj); + const auto* x_curve = std::get(&x_obj); if (x_curve != nullptr) { // Inserting an x-monotone curve: // Initialize the zone-computation object with the given curve. @@ -118,7 +118,7 @@ void insert(Arrangement_on_surface_2& arr, arr_access.notify_after_global_change(); continue; } - const auto* iso_p = boost::get(&x_obj); + const auto* iso_p = std::get(&x_obj); CGAL_assertion(iso_p != nullptr); // Inserting a point into the arrangement: @@ -683,7 +683,7 @@ insert_non_intersecting_curve // The endpoint must not lie on an existing edge, but may coincide with // and existing vertex vh1. - CGAL_precondition_msg(boost::get(&obj1) == nullptr, + CGAL_precondition_msg(std::get(&obj1) == nullptr, "The curve must not intersect an existing edge."); } @@ -691,7 +691,7 @@ insert_non_intersecting_curve // We have a left end with boundary conditions. Use the accessor to locate // the feature that contains it. obj1 = arr_access.locate_curve_end(c, ARR_MIN_END, bx1, by1); - CGAL_precondition_msg(boost::get(&obj1) == nullptr, + CGAL_precondition_msg(std::get(&obj1) == nullptr, "The curve must not overlap an existing edge."); } vh1 = Pl_result::template assign(&obj1); @@ -710,7 +710,7 @@ insert_non_intersecting_curve // The endpoint must not lie on an existing edge, but may coincide with // and existing vertex vh2. - CGAL_precondition_msg(boost::get(&obj2) == nullptr, + CGAL_precondition_msg(std::get(&obj2) == nullptr, "The curve must not intersect an existing edge."); } else { @@ -721,7 +721,7 @@ insert_non_intersecting_curve // << ", by2: " << by2 // << std::endl; obj2 = arr_access.locate_curve_end(c, ARR_MAX_END, bx2, by2); - CGAL_precondition_msg(boost::get(&obj2) == nullptr, + CGAL_precondition_msg(std::get(&obj2) == nullptr, "The curve must not overlap an existing edge."); } vh2 = Pl_result::template assign(&obj2); @@ -766,8 +766,8 @@ insert_non_intersecting_curve // we must insert the curve in the interior of a face. // In this case insert_in_face_interior() already returns a halfedge // directed from left to right. - const Face_const_handle* fh1 = boost::get(&obj1); - const Face_const_handle* fh2 = boost::get(&obj2); + const Face_const_handle* fh1 = std::get(&obj1); + const Face_const_handle* fh2 = std::get(&obj2); // std::cout << arr << std::endl; // std::cout << "(*fh1)->number_of_outer_ccbs(): " @@ -1144,14 +1144,14 @@ insert_point(Arrangement_on_surface_2& arr, arr_access.notify_before_global_change(); - const Face_const_handle* fh = boost::get(&obj); + const Face_const_handle* fh = std::get(&obj); if (fh != nullptr) { // p lies inside a face: Insert it as an isolated vertex it the interior of // this face. vh_for_p = arr.insert_in_face_interior(p, arr.non_const_handle(*fh)); } else { - const Halfedge_const_handle* hh = boost::get(&obj); + const Halfedge_const_handle* hh = std::get(&obj); if (hh != nullptr) { // p lies in the interior of an edge: Split this edge to create a new // vertex associated with p. @@ -1167,7 +1167,7 @@ insert_point(Arrangement_on_surface_2& arr, } else { // p lies on an existing vertex, so we just update this vertex. - const Vertex_const_handle* vh = boost::get(&obj); + const Vertex_const_handle* vh = std::get(&obj); CGAL_assertion(vh != nullptr); vh_for_p = arr.modify_vertex (arr.non_const_handle (*vh), p); } @@ -1381,14 +1381,14 @@ is_valid(const Arrangement_on_surface_2& arr) auto obj = def_pl.ray_shoot_down(curr_v->point()); // if (CGAL::assign(he_below, obj)) { - if (auto* he_below_p = boost::get(&obj)) { + if (auto* he_below_p = std::get(&obj)) { // Hit an edge; take the incident face of the halfedge directed to the // right. auto he_below = *he_below_p; in_face = (he_below->direction() == ARR_RIGHT_TO_LEFT) ? he_below->twin()->face() : he_below->face(); } - else if (auto* v_below_p = boost::get(&obj)) { + else if (auto* v_below_p = std::get(&obj)) { auto v_below = *v_below_p; // Hit a vertex. if (v_below->is_isolated()) in_face = v_below->face(); @@ -1446,7 +1446,7 @@ is_valid(const Arrangement_on_surface_2& arr) } } else { - auto* in_face_p = boost::get(&obj); + auto* in_face_p = std::get(&obj); CGAL_assertion(in_face_p); in_face = *in_face_p; // Hit nothing (an unbounded face is returned). @@ -1584,7 +1584,7 @@ do_intersect(Arrangement_on_surface_2& arr, typedef typename Gt2::Point_2 Point_2; typedef typename Gt2::X_monotone_curve_2 X_monotone_curve_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; typedef typename Arr::Face_const_handle Face_const_handle; const Traits_adaptor_2* traits = @@ -1596,20 +1596,20 @@ do_intersect(Arrangement_on_surface_2& arr, // Insert each x-monotone curve into the arrangement. for (const auto& x_obj : x_objects) { // Act according to the type of the current object. - const X_monotone_curve_2* x_curve = boost::get(&x_obj); + const X_monotone_curve_2* x_curve = std::get(&x_obj); if (x_curve != nullptr) { // Check if the x-monotone subcurve intersects the arrangement. if (do_intersect(arr, *x_curve, pl) == true) return true; continue; } - const Point_2* iso_p = boost::get(&x_obj); + const Point_2* iso_p = std::get(&x_obj); CGAL_assertion(iso_p != nullptr); // Check whether the isolated point lies inside a face (otherwise, // it coincides with a vertex or an edge). auto obj = pl.locate(*iso_p); - if (boost::get(&x_obj) != nullptr) return true; + if (std::get(&x_obj) != nullptr) return true; } // If we reached here, the curve does not intersect the arrangement. diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h index 78e0850352dc..cbadba8f07ac 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h @@ -31,7 +31,7 @@ * class-template. */ -#include +#include #include #include @@ -2253,7 +2253,7 @@ _place_and_set_curve_end(DFace* f, return v; } - DHalfedge** fict_he_p = boost::get(&*obj); + DHalfedge** fict_he_p = std::get(&*obj); if (fict_he_p != nullptr) { DHalfedge* fict_he = *fict_he_p; CGAL_assertion(fict_he != nullptr); @@ -2273,7 +2273,7 @@ _place_and_set_curve_end(DFace* f, Halfedge_handle((*p_pred)->next())); return v; } - DVertex** v_p = boost::get(&*obj); + DVertex** v_p = std::get(&*obj); CGAL_assertion(v_p != nullptr); DVertex* v = *v_p; CGAL_assertion(v != nullptr); diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index feb429273eec..484f2a46efe4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -103,7 +103,7 @@ void Arrangement_zone_2::compute_zone() const Vertex_const_handle* vh; const Halfedge_const_handle* hh; - if ((vh = boost::get(&m_obj)) != nullptr) { + if ((vh = std::get(&m_obj)) != nullptr) { CGAL_assertion(m_has_left_pt); // The left endpoint coincides with an existing vertex: @@ -125,7 +125,7 @@ void Arrangement_zone_2::compute_zone() #endif } - else if ((hh = boost::get(&m_obj)) != nullptr) { + else if ((hh = std::get(&m_obj)) != nullptr) { if (m_has_left_pt) { // Obtain the right halfedge from the halfedge-pair containing m_left_pt // in their interior. @@ -139,7 +139,7 @@ void Arrangement_zone_2::compute_zone() // Compute the overlapping subcurve. bool dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); - m_overlap_cv = boost::get(*obj); + m_overlap_cv = std::get(*obj); // Remove the overlap from the map. _remove_next_intersection(m_intersect_he); @@ -155,7 +155,7 @@ void Arrangement_zone_2::compute_zone() bool dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); - m_overlap_cv = boost::get(*obj); + m_overlap_cv = std::get(*obj); // Remove the overlap from the map. _remove_next_intersection(m_intersect_he); @@ -166,7 +166,7 @@ void Arrangement_zone_2::compute_zone() } else { // The left endpoint lies inside a face. - const Face_const_handle* fh = boost::get(&m_obj); + const Face_const_handle* fh = std::get(&m_obj); CGAL_assertion_msg(fh != nullptr, "Invalid object returned by the point-location query."); @@ -213,7 +213,7 @@ void Arrangement_zone_2::compute_zone() // Compute the overlapping subcurve to the right of curr_v. bool dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); - m_overlap_cv = boost::get(*obj); + m_overlap_cv = std::get(*obj); // Remove the overlap from the map. _remove_next_intersection(m_intersect_he); @@ -546,7 +546,7 @@ _compute_next_intersection(Halfedge_handle he, // (if the left point exists). while (! inter_list.empty()) { // Compare that current object with m_left_pt (if exists). - ip = boost::get(&(inter_list.front())); + ip = std::get(&(inter_list.front())); if (ip != nullptr) { // We have an intersection point if (m_left_on_boundary) { @@ -570,7 +570,7 @@ _compute_next_intersection(Halfedge_handle he, } else { // We have an overlapping subcurve. - icv = boost::get(&(inter_list.front())); + icv = std::get(&(inter_list.front())); CGAL_assertion(icv != nullptr); if (is_closed(*icv, ARR_MIN_END)) { @@ -608,7 +608,7 @@ _compute_next_intersection(Halfedge_handle he, // Discard all intersection lying to the left of m_left_pt (if exists). while (! inter_list.empty()) { // Compare that current object with m_left_pt (if exists). - ip = boost::get(&(inter_list.front())); + ip = std::get(&(inter_list.front())); if (ip != nullptr) { // We have an intersection point - @@ -638,7 +638,7 @@ _compute_next_intersection(Halfedge_handle he, } else { // We have an overlapping subcurve. - icv = boost::get(&(inter_list.front())); + icv = std::get(&(inter_list.front())); CGAL_assertion(icv != nullptr); if (is_closed(*icv, ARR_MIN_END)) { @@ -832,7 +832,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, if (iobj) { // We have found an intersection (either a simple point or an // overlapping x-monotone curve). - const Intersection_point* int_p = boost::get(&*iobj); + const Intersection_point* int_p = std::get(&*iobj); if (int_p != nullptr) { Point_2 ip = int_p->first; @@ -854,7 +854,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, else { // We have located an overlapping curve. Assign ip as its left // endpoint. - const X_monotone_curve_2* icv = boost::get(&*iobj); + const X_monotone_curve_2* icv = std::get(&*iobj); CGAL_assertion(icv != nullptr); Point_2 ip = min_vertex(*icv); diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 71fbfd48f9fa..b8acaece4aa8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -101,7 +101,7 @@ class Arrangement_zone_2 { // Types used for caching intersection points: typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; typedef std::optional Optional_intersection; typedef std::list Intersect_list; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h index 89c4b6595f83..a26e51a1e4ba 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h @@ -1426,7 +1426,7 @@ class Intersect_2 : typedef unsigned int Multiplicity; typedef std::pair Intersection_point; - typedef boost::variant Intersection_result; + typedef std::variant Intersection_result; //! the result type typedef CGAL::cpp98::iterator @@ -1905,7 +1905,7 @@ Curved_kernel_via_analysis_2_functor_base { { typedef typename Curved_kernel_via_analysis_2::Point_2 Point_2; typedef typename Curved_kernel_via_analysis_2::Arc_2 Arc_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; *oi++ = Make_x_monotone_result(cv); return oi; } @@ -1945,7 +1945,7 @@ Curved_kernel_via_analysis_2_functor_base { typedef typename Curved_kernel_via_analysis_2::Arc_2 Arc_2; typedef typename Curved_kernel_via_analysis_2::Non_x_monotone_arc_2 Non_x_monotone_arc_2; - typedef boost::variant + typedef std::variant Make_x_monotone_result; Curve_analysis_2 curve; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Make_x_monotone_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Make_x_monotone_2.h index 69f9db2015e5..aae3aea01e9d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Make_x_monotone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Make_x_monotone_2.h @@ -54,11 +54,11 @@ struct Make_x_monotone_2 : public CGAL::cpp98::binary_function< typename CurvedKernelViaAnalysis_2::Curve_2, CGAL::cpp98::iterator >, CGAL::cpp98::iterator > > { @@ -132,7 +132,7 @@ struct Make_x_monotone_2 : template OutputIterator operator()(Curve_analysis_2 curve, OutputIterator oi) { - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; Construct_arc_2 construct_arc_2 = _m_curved_kernel->construct_arc_2_object(); @@ -290,7 +290,7 @@ struct Make_x_monotone_2 : Coordinate_1 x, std::vector pts, OutputIterator oi) const { - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; Construct_arc_2 construct_arc_2 = _m_curved_kernel->construct_arc_2_object(); diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h index 03d6fcadfbe3..018992c467b4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h @@ -726,7 +726,7 @@ class Make_x_monotone_2 typedef typename SweepCurvesAdapter_2::Native_arc_2 Native_arc_2; typedef typename SweepCurvesAdapter_2::Native_point_2 Native_point_2; typedef typename SweepCurvesAdapter_2::Generic_point_2 Generic_point_2; - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::vector objs; @@ -734,11 +734,11 @@ class Make_x_monotone_2 make_x_monotone(cv, std::back_inserter(objs)); // sort out normal and degenerate arcs for (auto& obj : objs) { - if (auto* arc = boost::get(&obj)) { + if (auto* arc = std::get(&obj)) { *oi++ = Generic_arc_2(*arc); continue; } - auto* pt = boost::get(&obj); + auto* pt = std::get(&obj); CGAL_assertion(pt); *oi++ = Generic_arc_2(Generic_point_2(*pt)); } diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h index f3de33d7fe72..b7c2907bf583 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h @@ -98,9 +98,9 @@ class Arr_insertion_traits_2 : OutputIterator oi) { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; - typedef boost::variant + typedef std::variant Intersection_base_result; Halfedge_handle invalid_he; @@ -120,13 +120,13 @@ class Arr_insertion_traits_2 : // X_monotone_curve_2 for (const auto& xection : xections) { const Intersection_point* - p_p = boost::get(&xection); + p_p = std::get(&xection); if (p_p != nullptr) { *oi++ = Intersection_result(xection); continue; } const Base_x_monotone_curve_2* base_cv_p = - boost::get(&xection); + std::get(&xection); CGAL_assertion(base_cv_p); // Add halfedge handles to the resulting curve. diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h index 7a011211706b..e0b85f393906 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h @@ -22,9 +22,8 @@ * Definition of the Arr_overlay_ss_visitor class-template. */ -#include +#include #include -#include #include @@ -344,7 +343,7 @@ class Arr_overlay_ss_visitor : //@} /*! A visitor class to facilitate the call to create_vertex(). */ - class Create_vertex_visitor : public boost::static_visitor<> { + class Create_vertex_visitor { private: Overlay_traits* m_overlay_traits; Vertex_handle m_vertex_handle; @@ -563,7 +562,7 @@ void Arr_overlay_ss_visitor::after_sweep() const Cell_handle_blue& blue_handle = info.second; Vertex_handle v = (*it).first; Create_vertex_visitor visitor(m_overlay_traits, v); - boost::apply_visitor(visitor, red_handle, blue_handle); + std::visit(visitor, red_handle, blue_handle); } // When the sweep-line process is over, the remaining arrangement face @@ -938,8 +937,8 @@ _map_boundary_vertices(Event* event, Vertex_handle v, boost::mpl::bool_) const Cell_handle_red* red_handle_p = pt.red_cell_handle(); if (red_handle_p) info.first = *red_handle_p; - if (!boost::get(&(info.first)) && - !boost::get(&(info.second))) + if (!std::get(&(info.first)) && + !std::get(&(info.second))) { // If both, the red and blue, variants do not represent face handles, // they must represt either vertex or edge handles. In this case it is @@ -949,7 +948,7 @@ _map_boundary_vertices(Event* event, Vertex_handle v, boost::mpl::bool_) const Cell_handle_blue& blue_handle = info.second; Vertex_handle v = (*it).first; Create_vertex_visitor visitor(m_overlay_traits, v); - boost::apply_visitor(visitor, red_handle, blue_handle); + std::visit(visitor, red_handle, blue_handle); m_vertices_map.erase(it); } } @@ -1035,7 +1034,7 @@ _create_vertex(Event* event, CGAL_assertion(blue_handle != nullptr); const Vertex_handle_blue& blue_v = - boost::get(*blue_handle); + std::get(*blue_handle); m_overlay_traits->create_vertex(red_f, blue_v, new_v); return; } @@ -1049,13 +1048,13 @@ _create_vertex(Event* event, CGAL_assertion(red_handle != nullptr); const Vertex_handle_red& red_v = - boost::get(*red_handle); + std::get(*red_handle); m_overlay_traits->create_vertex(red_v, blue_f, new_v); return; } Create_vertex_visitor visitor(m_overlay_traits, new_v); - boost::apply_visitor(visitor, *red_handle, *blue_handle); + std::visit(visitor, *red_handle, *blue_handle); } //----------------------------------------------------------------------------- diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h index 717b31a0d377..e981e5326581 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h @@ -22,7 +22,7 @@ * Definition of the Arr_overlay_traits_2 class-template. */ -#include +#include #include #include @@ -105,11 +105,11 @@ class Arr_overlay_traits_2 { RB_OVERLAP // Red-blue overlap. }; - typedef boost::variant Cell_handle_red; typedef std::optional Optional_cell_red; - typedef boost::variant Cell_handle_blue; typedef std::optional Optional_cell_blue; @@ -323,14 +323,14 @@ class Arr_overlay_traits_2 { /*! Obtain the red vertex handle or nullptr if it doesn't exist. */ const Vertex_handle_red* red_vertex_handle() const { - return m_red_cell ? boost::get(&(*m_red_cell)) : nullptr; + return m_red_cell ? std::get(&(*m_red_cell)) : nullptr; } /*! Obtain the blue vertex handle or nullptr if it doesn't exist. */ const Vertex_handle_blue* blue_vertex_handle() const { return - m_blue_cell ? boost::get(&(*m_blue_cell)) : nullptr; + m_blue_cell ? std::get(&(*m_blue_cell)) : nullptr; } }; @@ -371,10 +371,10 @@ class Arr_overlay_traits_2 { OutputIterator oi) { typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; typedef std::pair Intersection_base_point; - typedef boost::variant + typedef std::variant Intersection_base_result; // In case the curves originate from the same arrangement, they are @@ -440,7 +440,7 @@ class Arr_overlay_traits_2 { // the extended X_monotone_curve_2. for (const auto& xection : xections) { const Intersection_base_point* base_ipt = - boost::get(&xection); + std::get(&xection); if (base_ipt != nullptr) { // We have a red-blue intersection point, so we attach the // intersecting red and blue halfedges to it. @@ -470,7 +470,7 @@ class Arr_overlay_traits_2 { } const Base_x_monotone_curve_2* overlap_xcv = - boost::get(&xection); + std::get(&xection); CGAL_assertion(overlap_xcv != nullptr); // We have a red-blue overlap, so we mark the curve accordingly. diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h index 952bf00e183e..cf26fa9a7739 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h @@ -20,7 +20,7 @@ * Definition of the Arr_vert_decomp_ss_visitor class-template. */ -#include +#include namespace CGAL { @@ -66,7 +66,7 @@ class Arr_vert_decomp_ss_visitor : typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle; typedef typename Arrangement_2::Face_const_handle Face_const_handle; - typedef boost::variant Cell_type; typedef std::optional Vert_type; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h index 256d101a3863..f84aee4da6dd 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Batched_point_location_test.h @@ -45,7 +45,7 @@ class Batched_point_location_test : public IO_test { typedef typename Points_vector::iterator Point_iterator; - typedef typename boost::variant Cell_handle; @@ -226,10 +226,10 @@ compare(const Cell_handle& expected, const Cell_handle& actual) { // Assign object to a face const Face_const_handle* fh_expected = - boost::get(&(expected)); + std::get_if(&(expected)); if (fh_expected) { const Face_const_handle* fh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (fh_actual) { if ((*fh_actual) == (*fh_expected)) return true; @@ -241,13 +241,13 @@ compare(const Cell_handle& expected, const Cell_handle& actual) std::cout << "Error: batched point location!" << std::endl; std::cout << "Expected a face." << std::endl; const Halfedge_const_handle* hh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (hh_actual) { std::cout << "Actual: a halfedge." << std::endl; return false; } const Vertex_const_handle* vh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (vh_actual) { std::cout << "Actual: a vertex." << std::endl; return false; @@ -258,10 +258,10 @@ compare(const Cell_handle& expected, const Cell_handle& actual) // Assign object to a halfedge const Halfedge_const_handle* hh_expected = - boost::get(&(expected)); + std::get_if(&(expected)); if (hh_expected) { const Halfedge_const_handle* hh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (hh_actual) { if (((*hh_actual) == (*hh_expected)) || ((*hh_actual)->twin() == (*hh_expected))) @@ -279,13 +279,13 @@ compare(const Cell_handle& expected, const Cell_handle& actual) std::cout << "Expected: a halfedge, " << (*hh_expected)->curve() << std::endl; const Face_const_handle* fh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (fh_actual) { std::cout << "Actual: a face." << std::endl; return false; } const Vertex_const_handle* vh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (vh_actual) { std::cout << "Actual: a vertex." << std::endl; return false; @@ -296,10 +296,10 @@ compare(const Cell_handle& expected, const Cell_handle& actual) // Assign object to a vertex const Vertex_const_handle* vh_expected = - boost::get(&(expected)); + std::get_if(&(expected)); if (vh_expected) { const Vertex_const_handle* vh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (vh_actual) { if ((*vh_actual) == (*vh_expected)) return true; @@ -313,13 +313,13 @@ compare(const Cell_handle& expected, const Cell_handle& actual) std::cout << "Error: batched point location!"; std::cout << "Expected: a vertex, "<< (*vh_expected)->point() << std::endl; const Face_const_handle* fh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (fh_actual) { std::cout << "Actual: a face" << std::endl; return false; } const Halfedge_const_handle* hh_actual = - boost::get(&(actual)); + std::get_if(&(actual)); if (hh_actual) { std::cout << "Actual: a halfedge." << std::endl; return false; @@ -436,15 +436,15 @@ print(const std::pair& res) // Print the results. std::cout << "The point (" << res.first << ") is located "; if (const Face_const_handle* f = - boost::get(&(res.second))) // inside a face + std::get_if(&(res.second))) // inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face." << std::endl; else if (const Halfedge_const_handle* e = - boost::get(&(res.second))) // on an edge + std::get_if(&(res.second))) // on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; else if (const Vertex_const_handle* v = - boost::get(&(res.second))) // on a vertex + std::get_if(&(res.second))) // on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/IO_base_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/IO_base_test.h index 9065587101ed..c7fdc1eab1e0 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/IO_base_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/IO_base_test.h @@ -693,11 +693,11 @@ bool IO_base_test::read_xsegment(InputStream_& is, Subcurve_2 seg(point_vector.begin(), point_vector.end()); //convert it into x-monotone bezier segment. - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; std::vector objs; bezier_traits.make_x_monotone_2_object()(seg, std::back_inserter(objs)); assert(! objs.empty()); - const auto* x_seg_p = boost::get(&(objs[0])); + const auto* x_seg_p = std::get_if(&(objs[0])); assert(x_seg_p); xseg = *x_seg_p; @@ -720,7 +720,7 @@ bool IO_base_test::read_xcurve(InputStream_& is, unsigned int number_of_segments; is >> number_of_segments; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; auto make_x_monotone = bezier_traits.make_x_monotone_2_object(); if ((type == 'x') || (type == 'X')) { for (unsigned int i=0; i::read_xcurve(InputStream_& is, std::vector objs; make_x_monotone(seg, std::back_inserter(objs)); assert(! objs.empty()); - const auto* x_seg_p = boost::get(&(objs[0])); + const auto* x_seg_p = std::get_if(&(objs[0])); assert(x_seg_p); x_segments.push_back(*x_seg_p); @@ -1470,7 +1470,7 @@ bool IO_base_test::read_xcurve(InputStream_& is, X_monotone_curve_2& xcv) { std::cout << std::endl; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; std::list x_objs; Curve_2 tmp_cv; is >> tmp_cv; @@ -1488,7 +1488,7 @@ bool IO_base_test::read_xcurve(InputStream_& is, size_t id(0); if (! is.eof()) is >> id; std::advance(xoit, id); - const auto* xcv_p = boost::get(&*xoit); + const auto* xcv_p = std::get_if(&*xoit); assert(xcv_p); xcv = *xcv_p; return false; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h index f4b717db1806..6b7628a05193 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h @@ -70,7 +70,7 @@ class Point_location_test : public IO_test { typedef std::vector Objects_vector; typedef Objects_vector::iterator Object_iterator; - typedef typename boost::variant Cell_handle; typedef std::vector Variants_vector; @@ -148,7 +148,7 @@ class Point_location_test : public IO_test { NUM_PL_STRATEGIES }; - typedef boost::variant { template void deallocate_pl() { - Strategy* strategy = boost::get(m_locators[id].m_variant); + Strategy* strategy = std::get(m_locators[id].m_variant); if (strategy) { delete strategy; m_locators[id].m_variant = static_cast(nullptr); @@ -302,7 +302,7 @@ class Point_location_test : public IO_test { void attach_pl() { if (! m_locators[id].m_active) return; - Strategy* strategy = boost::get(m_locators[id].m_variant); + Strategy* strategy = std::get(m_locators[id].m_variant); strategy->attach(*m_arr); } @@ -311,7 +311,7 @@ class Point_location_test : public IO_test { void attach_pl(Generator* generator) { if (! m_locators[id].m_active) return; - Strategy* strategy = boost::get(m_locators[id].m_variant); + Strategy* strategy = std::get(m_locators[id].m_variant); strategy->attach(*m_arr, generator); } @@ -321,7 +321,7 @@ class Point_location_test : public IO_test { { if (! m_locators[id].m_active) return; const std::string& name = m_locators[id].m_name; - Strategy* strategy = boost::get(m_locators[id].m_variant); + Strategy* strategy = std::get(m_locators[id].m_variant); query(*strategy, name.c_str(), m_query_points.begin(), m_query_points.end(), std::back_inserter(objs)); } @@ -625,7 +625,7 @@ class Point_location_test : public IO_test { #define ATTACH_PL_TRAPEZOID_RIC_NO_GUARANTEE() \ Pl_variant& var = m_locators[TRAPEZOID_RIC_NO_GUARANTEE_PL].m_variant; \ - Trapezoid_ric_pl* strategy = boost::get(var); \ + Trapezoid_ric_pl* strategy = std::get(var); \ strategy->with_guarantees(false); \ attach_pl() @@ -1088,11 +1088,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign and check results for (size_t qi = 0; qi < size; ++qi) { // Assign object to a face - Face_const_handle* fh_ref = boost::get(&(objs[0][qi])); + Face_const_handle* fh_ref = std::get_ifFace_const_handle>(&(objs[0][qi])); if (fh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Face_const_handle* fh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifFace_const_handle>(&(objs[pl][qi])); if (fh_cur) { if ((*fh_cur) != (*fh_ref)) { std::cout << "Error: point location number " << pl << std::endl; @@ -1107,13 +1107,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) std::cout << "Expected: a face." << std::endl; result += -1; Halfedge_const_handle* hh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); if (hh_cur) { std::cout << "Actual: a halfedge." << std::endl; continue; } Vertex_const_handle* vh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifVertex_const_handle>(&(objs[pl][qi])); if (vh_cur) { std::cout << "Actual: a vertex." << std::endl; continue; @@ -1129,11 +1129,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign object to a halfedge Halfedge_const_handle* hh_ref = - boost::get(&(objs[0][qi])); + std::get_ifHalfedge_const_handle>(&(objs[0][qi])); if (hh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Halfedge_const_handle* hh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); if (hh_cur) { if (((*hh_cur) != (*hh_ref)) && ((*hh_cur)->twin() != (*hh_ref))) { std::cout << "Error: point location number " << pl << std::endl; @@ -1150,13 +1150,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) << std::endl; result += -1; Face_const_handle* fh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifFace_const_handle>(&(objs[pl][qi])); if (fh_cur) { std::cout << "Actual: a face." << std::endl; continue; } Vertex_const_handle* vh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifVertex_const_handle>(&(objs[pl][qi])); if (vh_cur) { std::cout << "Actual: a vertex." << std::endl; continue; @@ -1168,11 +1168,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign object to a vertex Vertex_const_handle* vh_ref = - boost::get(&(objs[0][qi])); + std::get_ifVertex_const_handle>(&(objs[0][qi])); if (vh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Vertex_const_handle* vh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifVertex_const_handle>(&(objs[pl][qi])); if (vh_cur) { if ((*vh_cur) != (*vh_ref)) { std::cout << "Error: point location number " << pl << std::endl; @@ -1188,13 +1188,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) std::cout << "Expected: a vertex: "<< (*vh_ref)->point() << std::endl; result += -1; Face_const_handle* fh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifFace_const_handle>(&(objs[pl][qi])); if (fh_cur) { std::cout << "Actual: a face." << std::endl; continue; } Halfedge_const_handle* hh_cur = - boost::get(&(objs[pl][qi])); + std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); if (hh_cur) { std::cout << "Actual: a halfedge." << std::endl; continue; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h index 680ae201d405..fb912860f591 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h @@ -913,7 +913,7 @@ make_x_monotone_wrapper(std::istringstream& str_stream) typedef Geom_traits_T Traits; typedef typename Traits::Point_2 Point_2; typedef typename Traits::X_monotone_curve_2 X_monotone_curve_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; CGAL_USE_TYPE(typename Traits::Curve_2); unsigned int id; @@ -934,14 +934,14 @@ make_x_monotone_wrapper(std::istringstream& str_stream) unsigned int id; // The id of the point or x-monotone str_stream >> id; // ... curve respectively - const auto* xcv_ptr = boost::get(&(objs[i])); + const auto* xcv_ptr = std::get_if(&(objs[i])); if (xcv_ptr != nullptr) { if (!this->compare(type, 1u, "type")) return false; if (!this->compare_curves(this->m_xcurves[id], *xcv_ptr)) return false; continue; } - const auto* pt_ptr = boost::get(&(objs[i])); + const auto* pt_ptr = std::get_if(&(objs[i])); assert(pt_ptr != nullptr); if (!this->compare(type, 0u, "type")) return false; if (!this->compare_points(this->m_points[id], *pt_ptr)) return false; @@ -969,7 +969,7 @@ intersect_wrapper(std::istringstream& str_stream) typedef typename Traits::Multiplicity Multiplicity; typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; unsigned int id1, id2; @@ -995,7 +995,7 @@ intersect_wrapper(std::istringstream& str_stream) unsigned int exp_type = 1; const X_monotone_curve_2* cv_p = - boost::get(&(xections[i])); + std::get_if(&(xections[i])); if (cv_p != nullptr) { if (! this->compare(type, exp_type, "type")) return false; @@ -1005,7 +1005,7 @@ intersect_wrapper(std::istringstream& str_stream) exp_type = 0; const Intersection_point* p_p = - boost::get(&(xections[i])); + std::get_if(&(xections[i])); assert(p_p != nullptr); if (! this->compare(type, exp_type, "type")) return false; if (! this->compare_points(this->m_points[id], p_p->first)) return false; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h index 881c939b5ffb..1fd487652e8b 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h @@ -44,7 +44,7 @@ class Vertical_decomposition_test : public IO_test { typedef typename Arrangement::Edge_const_iterator Edge_const_iterator; typedef typename Arrangement::Vertex_const_iterator Vertex_const_iterator; - typedef boost::variant Cell_type; typedef std::optional Vert_type; typedef typename std::pair Vert_pair; @@ -196,14 +196,14 @@ compare(const Result_type& expected, Vert_type actual) auto obj = *actual; // Assign object to a face. - if (const auto* fh_expected = boost::get(&(expected))) { - if (boost::get(&obj)) { + if (const auto* fh_expected = std::get_if(&(expected))) { + if (std::get_if(&obj)) { std::cout << "Error: vertical decomposition!" << std::endl; std::cout << "Expected: a face." << std::endl; std::cout << "Actual: a vertex." << std::endl; return false; } - if (boost::get(&obj)) { + if (std::get_if(&obj)) { std::cout << "Error: vertical decomposition!" << std::endl; std::cout << "Expected: a face." << std::endl; std::cout << "Actual: a halfedge." << std::endl; @@ -213,9 +213,9 @@ compare(const Result_type& expected, Vert_type actual) } // Assign object to a halfedge. - const auto* hh_expected = boost::get(&(expected)); + const auto* hh_expected = std::get_if(&(expected)); if (hh_expected) { - if (const auto* hh_actual = boost::get(&obj)) { + if (const auto* hh_actual = std::get_if(&obj)) { if (*hh_expected == *hh_actual) return true; std::cout << "Error: vertical decomposition!" << std::endl; @@ -230,13 +230,13 @@ compare(const Result_type& expected, Vert_type actual) std::cout << "Expected: a halfedge, " << (*hh_expected)->curve() << std::endl; - if (const auto* vh_actual = boost::get(&obj)) { + if (const auto* vh_actual = std::get_if(&obj)) { std::cout << "Actual: a vertex, " << (*vh_actual)->point() << std::endl; return false; } Face_const_handle fh_actual; - if (boost::get(&obj)) { + if (std::get_if(&obj)) { std::cout << "Actual: a face." << std::endl; return false; } @@ -245,9 +245,9 @@ compare(const Result_type& expected, Vert_type actual) } // Assign object to a vertex. - const auto* vh_expected = boost::get(&(expected)); + const auto* vh_expected = std::get_if(&(expected)); if (vh_expected) { - if (const auto* vh_actual = boost::get(&obj)) { + if (const auto* vh_actual = std::get_if(&obj)) { if (*vh_expected == *vh_actual) return true; std::cout << "Error: vertical decomposition!" << std::endl; @@ -261,12 +261,12 @@ compare(const Result_type& expected, Vert_type actual) std::cout << "Error: vertical decomposition!" << std::endl; std::cout << "Expected: a vertex, " << (*vh_expected)->point() << std::endl; - if (const auto* hh_actual = boost::get(&obj)) { + if (const auto* hh_actual = std::get_if(&obj)) { std::cout << "Actual: a halfedge, " << (*hh_actual)->curve() << std::endl; return false; } - if (boost::get(&obj)) { + if (std::get_if(&obj)) { std::cout << "Actual: a face." << std::endl; return false; } @@ -291,22 +291,22 @@ print(const Vert_decomp_entry& result) assert(obj_below); auto obj = *obj_below; std::cout << " feature below: "; - if (const auto* hh = boost::get(&obj)) + if (const auto* hh = std::get_if(&obj)) std::cout << '[' << (*hh)->curve() << ']'; - else if (const auto* vh = boost::get(&obj)) + else if (const auto* vh = std::get_if(&obj)) std::cout << '(' << (*vh)->point() << ')'; - else if (const auto* fh = boost::get(&obj)) + else if (const auto* fh = std::get_if(&obj)) std::cout << "NONE"; else std::cout << "EMPTY"; assert(obj_above); obj = *obj_above; std::cout << " feature above: "; - if (const auto* hh = boost::get(&obj)) + if (const auto* hh = std::get_if(&obj)) std::cout << '[' << (*hh)->curve() << ']'; - else if (const auto* vh = boost::get(&obj)) + else if (const auto* vh = std::get_if(&obj)) std::cout << '(' << (*vh)->point() << ')'; - else if (const auto* vh = boost::get(&obj)) + else if (const auto* vh = std::get_if(&obj)) std::cout << "NONE"; else std::cout << "EMPTY"; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp index 2856f82b0761..ff71cbf9ac9e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_arc_polycurve.cpp @@ -19,7 +19,7 @@ typedef Sub_traits_2::CoordNT CoordNT; typedef Sub_traits_2::Point_2 Point_2; typedef Sub_traits_2::Curve_2 Subcurve_2; typedef Sub_traits_2::X_monotone_curve_2 Subcurve_x_monotone_2; -typedef boost::variant +typedef std::variant Make_sub_x_monotone_result; void check_equal() @@ -81,8 +81,8 @@ void check_intersect(Traits_2::Make_x_monotone_2 make_x_monotone_2(curve1, std::back_inserter(x_monotone_curves)); make_x_monotone_2(curve2, std::back_inserter(x_monotone_curves)); - const auto* x_curve1 = boost::get(curves[0]); - const auto* x_curve2 = boost::get(curves[1]); + const auto* x_curve1 = std::get(curves[0]); + const auto* x_curve2 = std::get(curves[1]); std::vector Points_of_intersection; @@ -100,7 +100,7 @@ void check_intersect(Traits_2::Make_x_monotone_2 curve3 = Subcurve_2(c6, 1, CGAL::CLOCKWISE, s6, t6); make_x_monotone_2(curve3, std::back_inserter(x_curves)); - const auto* x_curve2 = boost::get<>(&x_curves[2]); + const auto* x_curve2 = std::get<>(&x_curves[2]); Points_of_intersection.clear(); //intersect_2(X_monotone_curve1, X_monotone_curve2, @@ -131,8 +131,8 @@ check_compare_end_points_xy_2(Traits_2::Compare_endpoints_xy_2 std::vector x_curves; make_x_monotone_2(curve1, std::back_inserter(x_curves)); - const auto* x_curve1 = boost::get(&x_curves[0]); - const auto* x_curve2 = boost::get(&x_curves[1]); + const auto* x_curve1 = std::get_if(&x_curves[0]); + const auto* x_curve2 = std::get_if(&x_curves[1]); auto res = compare_endpoints_xy_2(x_curve1); std::cout<< "The first result is: " << res << std::endl; @@ -143,7 +143,7 @@ check_compare_end_points_xy_2(Traits_2::Compare_endpoints_xy_2 Point_2 s2 = Point_2(one_plus_sqrt_3, CoordNT(1)); curve2 = Subcurve_2(circ2, s1, t1); make_x_monotone_2(curve2, std::back_inserter(x_curves)); - const auto* x_curve2 = boost::get(&x_curves[1]); + const auto* x_curve2 = std::get_if(&x_curves[1]); res = compare_endpoints_xy_2(x_curve2); @@ -170,7 +170,7 @@ void check_split(Traits_2::Split_2 split_2, //make x_monotone std::vector x_curves; make_x_monotone_2(curve, std::back_inserter(x_curves)); - const auto* x_curve1 = boost::get(&x_curves[0]); + const auto* x_curve1 = std::get_if(&x_curves[0]); // Subcurve_x_monotone_2 split_x_monotone_curve1, split_x_monotone_curve2 ; //split_2(X_monotone_curve, Kernel::Point_2::Kernel::Point_2(1, 4), @@ -200,8 +200,8 @@ void check_is_vertical(Traits_2::Make_x_monotone_2 //std::vector x_monotone_polycurves; - const auto* x_polycurve1 = boost::get(&x_curves[0]); - const auto* x_polycurve2 = boost::get(&x_curves[1]); + const auto* x_polycurve1 = std::get_if(&x_curves[0]); + const auto* x_polycurve2 = std::get_if(&x_curves[1]); bool res = is_vertical(x_polycurve1); std::cout << "Is_verticle:: The xmonotone curve (quarter circle) is : " @@ -232,8 +232,8 @@ void check_compare_y_at_x_2(Traits_2::Make_x_monotone_2 make_x_monotone_2, for (const auto& cv : curves) make_x_monotone_2(cv, std::back_inserter(x_curves)); - const auto* x_polycurve1 = boost::get(&x_curves[0]); - const auto* x_polycurve2 = boost::get(&x_curves[1]); + const auto* x_polycurve1 = std::get_if(&x_curves[0]); + const auto* x_polycurve2 = std::get_if(&x_curves[1]); Kernel::Point_2 p_test = Kernel::Point_2(3, 1); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp index 9936d4648ecf..f36f4cc5b2a5 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_bezier_polycurve.cpp @@ -34,7 +34,7 @@ typedef CGAL::Arr_polyline_traits_2 Bezier_polycurve_traits; typedef Bezier_polycurve_traits::Curve_2 Polycurve_bezier; typedef Bezier_polycurve_traits::X_monotone_curve_2 X_polycurve_bezier; -typedef boost::variant +typedef std::variant Make_x_monotone_result; int main (int argc, char *argv[]) @@ -60,7 +60,7 @@ int main (int argc, char *argv[]) //creating x-mono bezier bezier_traits.make_x_monotone_2_object()(curve_1, std::back_inserter(objs)); //std::cout << "number of x_curves: " << obj_vector.size() << std::endl; - const auto* x_curve_1 = boost::get(&(obj_vector[0])); + const auto* x_curve_1 = std::get_if(&(obj_vector[0])); assert(x_curve_1); //std::cout << x_curve << std::endl; @@ -74,7 +74,7 @@ int main (int argc, char *argv[]) //creating x-monotne obj_vector.clear(); bezier_traits.make_x_monotone_2_object()( curve_2, std::back_inserter(objs)); - const auto* x_curve_2 = boost::get(&(obj_vector[0])); + const auto* x_curve_2 = std::get_if(&(obj_vector[0])); //push curves into polyline vectors curves_vector.push_back(curve_1); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp index 32395799ae57..9c65e0f3ca9b 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_circular_arc_polycurve.cpp @@ -92,7 +92,7 @@ void check_make_x_monotone(typename GeometryTraits::Curve_2 cv, typedef typename Geometry_traits_2::Point_2 Point_2; typedef typename Geometry_traits_2::X_monotone_traits_2 X_monotone_traits_2; - typedef boost::variant + typedef std::variant Make_x_monotone_result; std::vector objs; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp index 02f85dc22e7d..0ef7631c479b 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_conic_polycurve.cpp @@ -110,7 +110,7 @@ void check_equal() typedef typename Traits::Point_2 Point_2; typedef typename Traits::X_monotone_curve_2 X_monotone_curve_2; typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; std::vector intersection_points; @@ -644,7 +644,7 @@ void check_make_x_monotne_curve(const typename GeometryTraits::Curve_2& c1) { typename GeometryTraits::Point_2 Point_2; typename GeometryTraits::X_monotone_curve_2 X_monotone_curve_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; Polycurve_conic_traits_2 traits; std::vector objs; traits.make_x_monotone_2_object()(c1, std::back_inserter(objs)); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vert_ray_shoot_vert_segments.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vert_ray_shoot_vert_segments.cpp index 07cfc97e199d..3dd0399d9dd8 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vert_ray_shoot_vert_segments.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_vert_ray_shoot_vert_segments.cpp @@ -22,17 +22,17 @@ void vertical_ray_shooting_query if (shoot_up) std::cout << " Shooting up from (" << q << ") : "; else std::cout << " Shooting down from (" << q << ") : "; - if (auto* e_p = boost::get(&obj)) { + if (auto* e_p = std::get_if(&obj)) { // We hit an edge: std::cout << "hit an edge: " << (*e_p)->curve() << std::endl; } - else if (auto* v_p = boost::get(&obj)) { + else if (auto* v_p = std::get_if(&obj)) { // We hit a vertex: if ((*v_p)->is_isolated()) std::cout << "hit an isolated vertex: " << (*v_p)->point() << std::endl; else std::cout << "hit a vertex: " << (*v_p)->point() << std::endl; } - else if (auto* f_p = boost::get(&obj)) { + else if (auto* f_p = std::get_if(&obj)) { // We did not hit anything: assert((*f_p)->is_unbounded()); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_zone.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_zone.cpp index 54291b4bf5a3..78b9cbadd4d0 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_zone.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_zone.cpp @@ -17,7 +17,7 @@ typedef CGAL::Arrangement_2 Arrangement_2; typedef Arrangement_2::Vertex_handle Vertex_handle; typedef Arrangement_2::Halfedge_handle Halfedge_handle; typedef Arrangement_2::Face_handle Face_handle; -typedef boost::variant +typedef std::variant Zone_result; #define N_SEGMENTS 3 diff --git a/BGL/examples/BGL_triangulation_2/dijkstra.cpp b/BGL/examples/BGL_triangulation_2/dijkstra.cpp index 3a1b061eb9e3..87c308e18bb2 100644 --- a/BGL/examples/BGL_triangulation_2/dijkstra.cpp +++ b/BGL/examples/BGL_triangulation_2/dijkstra.cpp @@ -60,9 +60,9 @@ int main(int argc,char* argv[]) for(vertex_descriptor vd : vertices(tr)) { std::cout << vd->point() << " [" << vertex_id_map[vd] << "] "; - std::cout << " has distance = " << boost::get(distance_pmap,vd) + std::cout << " has distance = " << std::get(distance_pmap,vd) << " and predecessor "; - vd = boost::get(predecessor_pmap,vd); + vd = std::get(predecessor_pmap,vd); std::cout << vd->point() << " [" << vertex_id_map[vd] << "]\n "; } diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h index 0d90fbacb2f9..0ceae84b195e 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h @@ -18,7 +18,7 @@ class Intersect_2 { /*! computes the intersections of `xc1` and `xc2` and inserts them in an * ascending lexicographic \f$ xy\f$-order into a range beginning at - * `oi`. The type `OutputIterator` dereferences a `boost::variant` of either the + * `oi`. The type `OutputIterator` dereferences a `std::variant` of either the * type `pair` or the type * `ArrDirectionalTraits::X_monotone_curve_2`. An object of the former type diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h index ef8cc06083f9..d5372d0be793 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h @@ -160,10 +160,10 @@ class Gps_agg_meta_traits : typedef const std::pair Intersection_base_point; - typedef boost::variant + typedef std::variant Intersection_base_result; typedef const std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; const auto* base_traits = m_traits.m_base_traits; @@ -183,7 +183,7 @@ class Gps_agg_meta_traits : // the extenede X_monotone_curve_2 for (const auto& xection : xections) { const Intersection_base_point* base_pt = - boost::get(&xection); + std::get_if(&xection); if (base_pt != nullptr) { Point_2 point_plus(base_pt->first); // the extended point *oi++ = @@ -192,7 +192,7 @@ class Gps_agg_meta_traits : } const Base_x_monotone_curve_2* overlap_cv = - boost::get(&xection); + std::get_if(&xection); CGAL_assertion(overlap_cv != nullptr); unsigned int ov_bc; unsigned int ov_twin_bc; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h index fdc111751de8..0776b8336130 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h @@ -133,10 +133,10 @@ class Gps_simplifier_traits : { typedef const std::pair Intersection_base_point; - typedef boost::variant + typedef std::variant Intersection_base_result; typedef const std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; const auto* base_traits = m_traits.m_base_traits; @@ -170,7 +170,7 @@ class Gps_simplifier_traits : // the extenede X_monotone_curve_2 for (const auto& xection : xections) { const Intersection_base_point* base_pt = - boost::get(&xection); + std::get_if(&xection); if (base_pt != nullptr) { Point_data pt_data(m_traits.invalid_index()); Point_2 point_plus(base_pt->first, pt_data); // the extended point @@ -180,7 +180,7 @@ class Gps_simplifier_traits : } const Base_x_monotone_curve_2* overlap_cv = - boost::get(&xection); + std::get_if(&xection); CGAL_assertion(overlap_cv != nullptr); unsigned int ov_bc; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Polygon_conversions.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Polygon_conversions.h index f974c628e319..0f880d66ad20 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Polygon_conversions.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Polygon_conversions.h @@ -92,7 +92,7 @@ convert_polygon(const Polygon_2& polygon, if (polygon.is_empty()) return General_polygon_2(); using Point = typename ArrTraits::Point_2; using X_monotone_curve = typename ArrTraits::X_monotone_curve_2; - using Make_x_monotone_result = boost::variant; + using Make_x_monotone_result = std::variant; auto cv = ctr(boost::range::join(CGAL::make_range(polygon.vertices_begin(), polygon.vertices_end()), CGAL::make_single(*polygon.vertices_begin()))); @@ -101,7 +101,7 @@ convert_polygon(const Polygon_2& polygon, make_x_mtn(cv, boost::make_function_output_iterator ([&](const Make_x_monotone_result& obj) - { gpgn.push_back(*(boost::get(&obj))); })); + { gpgn.push_back(*(std::get_if(&obj))); })); return gpgn; } diff --git a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_general_polygon_constructions.cpp b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_general_polygon_constructions.cpp index be2fb2d3e5b0..81add300c235 100644 --- a/Boolean_set_operations_2/test/Boolean_set_operations_2/test_general_polygon_constructions.cpp +++ b/Boolean_set_operations_2/test/Boolean_set_operations_2/test_general_polygon_constructions.cpp @@ -66,11 +66,11 @@ int main() { ctr(boost::range::join(CGAL::make_range(points.begin(), points.end()), CGAL::make_single(*points.begin()))); General_pgn gpgn2; - using Make_x_monotone_result = boost::variant; + using Make_x_monotone_result = std::variant; make_x_mtn(curve2, boost::make_function_output_iterator ([&](const Make_x_monotone_result& obj) - { gpgn2.push_back(*(boost::get(&obj))); })); + { gpgn2.push_back(*(std::get_if(&obj))); })); std::cout << "gpgn2: " << gpgn2 << std::endl; // Case 3: Polyline-based GPS from polyline of segments @@ -81,7 +81,7 @@ int main() { make_x_mtn(curve3, boost::make_function_output_iterator ([&](const Make_x_monotone_result& obj) - { gpgn3.push_back(*(boost::get(&obj))); })); + { gpgn3.push_back(*(std::get_if(&obj))); })); std::cout << "gpgn3: " << gpgn3 << std::endl; if (! eql(gpgn2, gpgn3)) { diff --git a/CGAL_ImageIO/include/CGAL/SEP_header.h b/CGAL_ImageIO/include/CGAL/SEP_header.h index 17c40493ef54..d7a26eda8ffd 100644 --- a/CGAL_ImageIO/include/CGAL/SEP_header.h +++ b/CGAL_ImageIO/include/CGAL/SEP_header.h @@ -57,12 +57,12 @@ struct SEP_header_aux { using boost::get; visitor vis(this, get<0>(tuple)); - boost::apply_visitor(vis, get<1>(tuple)); + std::visit(vis, get<1>(tuple)); return *this; } private: - struct visitor : public boost::static_visitor<> { + struct visitor { SEP_header_aux* self; std::string key; visitor(SEP_header_aux* header, std::string key) @@ -262,7 +262,7 @@ class SEP_header { #endif // CGAL_SEP_READER_DEBUG } // end constructor of sep_header_grammar - typedef boost::variant value; typedef boost::tuple entry_type; diff --git a/Cartesian_kernel/include/CGAL/Cartesian_converter.h b/Cartesian_kernel/include/CGAL/Cartesian_converter.h index c2e9806c2bb7..9333fa9f5437 100644 --- a/Cartesian_kernel/include/CGAL/Cartesian_converter.h +++ b/Cartesian_kernel/include/CGAL/Cartesian_converter.h @@ -55,7 +55,7 @@ struct Default_converter { // Out will be a variant, source kernel and target kernel template -struct Converting_visitor : boost::static_visitor<> { +struct Converting_visitor{ Converting_visitor(const Converter& conv, Output& out) : conv(&conv), out(&out) {} const Converter* conv; Output* out; @@ -138,13 +138,13 @@ class Cartesian_converter : public Enum_converter // from the sequence, transform with the type mapper and throw the // new list into a variant // visit to get the type, and copy construct inside the return type - template + template typename - Type_mapper< std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, + Type_mapper< std::optional< std::variant< U ... > >, K1, K2 >::type - operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(const std::optional< std::variant< U ... > >& o) const { typedef typename - Type_mapper< std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, + Type_mapper< std::optional< std::variant< U ... > >, K1, K2 >::type result_type; result_type res; if(!o) { @@ -154,22 +154,22 @@ class Cartesian_converter : public Enum_converter internal::Converting_visitor conv_visitor = internal::Converting_visitor(*this, res); - boost::apply_visitor(conv_visitor, *o); + std::visit(conv_visitor, *o); return res; } - template + template typename - Type_mapper< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) >, + Type_mapper< std::variant< U ... >, K1, K2 >::type - operator()(const boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > & o) const { + operator()(const std::variant< U ... > & o) const { typedef typename - Type_mapper< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) >, + Type_mapper< std::variant< U ... >, K1, K2 >::type result_type; result_type res; internal::Converting_visitor conv_visitor = internal::Converting_visitor(*this, res); - boost::apply_visitor(conv_visitor, o); + std::visit(conv_visitor, o); return res; } diff --git a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h index 1e7db3856c0e..a20f96ce0dda 100644 --- a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h +++ b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmark.h @@ -11,7 +11,7 @@ #include #include #include "Input_data.h" -#include +#include diff --git a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmarks_arrangement.cpp b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmarks_arrangement.cpp index 674e5a0ea533..a0958077ead5 100644 --- a/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmarks_arrangement.cpp +++ b/Circular_kernel_2/benchmark/DxfArrayBenchmarks/benchmarks_arrangement.cpp @@ -72,7 +72,7 @@ for(i=1;i<6;i++){ typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CGAL::Variant_traits CircularK_Variant_Traits; - typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; + typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; bench.kernel("CK VarTraits"); @@ -93,7 +93,7 @@ for(i=1;i<6;i++){ typedef BBCircularKernel::Circular_arc_2 Circular_arc_6; typedef BBCircularKernel::Line_arc_2 Line_arc_6; - typedef boost::variant BBCircVarArc; + typedef std::variant BBCircVarArc; typedef std::vector BBCircVarContainer; typedef CGAL::Variant_traits BBCircVariantTraits; diff --git a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h index 36210feffcb8..3e51c351e485 100644 --- a/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h +++ b/Circular_kernel_2/benchmark/arrangement_traits/benchmark.h @@ -11,7 +11,7 @@ #include #include #include "Input_data.h" -#include +#include class Bench { diff --git a/Circular_kernel_2/benchmark/arrangement_traits/benchmarks_arrangement.cpp b/Circular_kernel_2/benchmark/arrangement_traits/benchmarks_arrangement.cpp index 5ebf26838bcf..056ae74e3920 100644 --- a/Circular_kernel_2/benchmark/arrangement_traits/benchmarks_arrangement.cpp +++ b/Circular_kernel_2/benchmark/arrangement_traits/benchmarks_arrangement.cpp @@ -166,7 +166,7 @@ Bench bench(Htmlfilename,Texfilename,Dxffilename[i]); typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CGAL::Variant_traits CircularK_Variant_Traits; - typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; + typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; bench.kernel("Circular kernel Variant traits"); diff --git a/Circular_kernel_2/benchmark/benchmark.h b/Circular_kernel_2/benchmark/benchmark.h index 9d13d728f659..94b00a889060 100644 --- a/Circular_kernel_2/benchmark/benchmark.h +++ b/Circular_kernel_2/benchmark/benchmark.h @@ -11,7 +11,7 @@ #include #include #include "Input_data.h" -#include +#include #include diff --git a/Circular_kernel_2/benchmark/benchmark_CK2.cpp b/Circular_kernel_2/benchmark/benchmark_CK2.cpp index 54a4137e4ce8..814bb3c0481f 100644 --- a/Circular_kernel_2/benchmark/benchmark_CK2.cpp +++ b/Circular_kernel_2/benchmark/benchmark_CK2.cpp @@ -38,7 +38,7 @@ typedef std::vector CircularKArcContainer; typedef CircularKernel::Circular_arc_2 Circular_arc_2; typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CGAL::Arr_circular_line_arc_traits_2 CircularK_Variant_Traits; -typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; +typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; @@ -55,7 +55,7 @@ typedef BBCircularKernel::Circular_arc_2 Circular_arc_6; typedef BBCircularKernel::Line_arc_2 Line_arc_6; -typedef boost::variant +typedef std::variant BBCircVarArc; typedef std::vector BBCircVarContainer; diff --git a/Circular_kernel_2/benchmark/benchmarks_arrangement.cpp b/Circular_kernel_2/benchmark/benchmarks_arrangement.cpp index 3b548a20e2aa..59867dbd1e3d 100644 --- a/Circular_kernel_2/benchmark/benchmarks_arrangement.cpp +++ b/Circular_kernel_2/benchmark/benchmarks_arrangement.cpp @@ -163,7 +163,7 @@ Bench bench; //If you want create table with all datasets typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CGAL::Arr_circular_line_arc_traits_2 CircularK_Variant_Traits; - typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; + typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; bench.kernel("CKVar"); @@ -197,7 +197,7 @@ bench.Compute_no_dxf BBCircVarArc; + typedef std::variant BBCircVarArc; typedef std::vector BBCircVarContainer; typedef CGAL::Arr_circular_line_arc_traits_2 BBCircVariantTraits; diff --git a/Circular_kernel_2/benchmark/bff_reader/Breader.cpp b/Circular_kernel_2/benchmark/bff_reader/Breader.cpp index 3fac248eb683..ac18cceab92f 100644 --- a/Circular_kernel_2/benchmark/bff_reader/Breader.cpp +++ b/Circular_kernel_2/benchmark/bff_reader/Breader.cpp @@ -189,7 +189,7 @@ int main( int argc, char* argv[] ) { typedef CK::Circular_arc_2 Circular_arc_2; typedef CK::Line_arc_2 Line_arc_2; typedef CGAL::Variant_traits CircularK_Variant_Traits; - typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; + typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; CircularKVarArcContainer arc; typedef CGAL::Arrangement_2 Pmwx; diff --git a/Circular_kernel_2/benchmark/dxf_to_bff/dxf_converter.h b/Circular_kernel_2/benchmark/dxf_to_bff/dxf_converter.h index b8ad60ea3c13..3b54da14f930 100644 --- a/Circular_kernel_2/benchmark/dxf_to_bff/dxf_converter.h +++ b/Circular_kernel_2/benchmark/dxf_to_bff/dxf_converter.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h b/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h index 3787adde5222..75218b2430b4 100644 --- a/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h +++ b/Circular_kernel_2/benchmark/incremental_insertion/benchmark.h @@ -11,7 +11,7 @@ #include #include #include "Input_data.h" -#include +#include class Bench { diff --git a/Circular_kernel_2/benchmark/incremental_insertion/benchmarks_arrangement.cpp b/Circular_kernel_2/benchmark/incremental_insertion/benchmarks_arrangement.cpp index 8895b11f3725..c00db5e079a0 100644 --- a/Circular_kernel_2/benchmark/incremental_insertion/benchmarks_arrangement.cpp +++ b/Circular_kernel_2/benchmark/incremental_insertion/benchmarks_arrangement.cpp @@ -157,7 +157,7 @@ Bench bench(Htmlfilename,Texfilename,Dxffilename[i],true); typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CGAL::Variant_traits CircularK_Variant_Traits; - typedef boost::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; + typedef std::variant< Circular_arc_2, Line_arc_2 > CircularKVarArc; typedef std::vector CircularKVarArcContainer; bench.kernel("Circular kernel Variant traits"); diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Intersection_traits.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Intersection_traits.h index 674b4ca27b20..34ba0ccc3868 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/Intersection_traits.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/Intersection_traits.h @@ -19,7 +19,7 @@ #include -#include +#include namespace CGAL { @@ -40,7 +40,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename CK::Circle_2, + std::variant< typename CK::Circle_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -52,7 +52,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename CK::Circular_arc_2, + std::variant< typename CK::Circular_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -64,7 +64,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename CK::Line_arc_2, + std::variant< typename CK::Line_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -76,7 +76,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename std::pair< typename CK::Circular_arc_point_2, + std::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL > @@ -92,7 +92,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename std::pair< typename CK::Circular_arc_point_2, + std::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL > @@ -108,7 +108,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename CK::Line_arc_2, + std::variant< typename CK::Line_arc_2, typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -125,7 +125,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename std::pair< typename CK::Circular_arc_point_2, + std::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL > @@ -155,7 +155,7 @@ template struct CK2_Intersection_traits { typedef typename - boost::variant< typename std::pair< typename CK::Circular_arc_point_2, + std::variant< typename std::pair< typename CK::Circular_arc_point_2, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL > diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h index baecb2157250..ce3bb2e507fe 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h @@ -497,7 +497,7 @@ namespace CircularFunctors { } template - struct Has_on_visitor : public boost::static_visitor { + struct Has_on_visitor { Has_on_visitor(const T* l) : l(l){} const T* l; bool operator()(const std::pair& pair) const { @@ -527,7 +527,7 @@ namespace CircularFunctors { for (typename solutions_container::iterator it = solutions.begin(); it != solutions.end(); ++it) { - if(boost::apply_visitor(Has_on_visitor(&l), *it)) + if(std::visit(Has_on_visitor(&l), *it)) *res++ = *it; } @@ -681,8 +681,8 @@ namespace CircularFunctors { for (typename solutions_container::iterator it = solutions.begin(); it != solutions.end(); ++it) { - if(boost::apply_visitor(Has_on_visitor(&l), *it) && - boost::apply_visitor(Has_on_visitor(&c), *it) ) + if(std::visit(Has_on_visitor(&l), *it) && + std::visit(Has_on_visitor(&c), *it) ) { *res++ = *it; } @@ -757,7 +757,7 @@ namespace CircularFunctors { v = intersection(l, la.supporting_line()); if(!v) return res; - const Point_2 *pt = boost::get(&*v); + const Point_2 *pt = std::get_if(&*v); if(pt == nullptr) return res; Circular_arc_point_2 intersect_point = Circular_arc_point_2(*pt); @@ -790,7 +790,7 @@ namespace CircularFunctors { for (typename solutions_container::const_iterator it = solutions.begin(); it != solutions.end(); ++it) { - if(boost::apply_visitor(Has_on_visitor(&c), *it)) + if(std::visit(Has_on_visitor(&c), *it)) *res++ = *it; } return res; diff --git a/Circular_kernel_2/include/CGAL/IO/Dxf_variant_reader.h b/Circular_kernel_2/include/CGAL/IO/Dxf_variant_reader.h index d0ace79c85c3..f6eb3d8fd78c 100644 --- a/Circular_kernel_2/include/CGAL/IO/Dxf_variant_reader.h +++ b/Circular_kernel_2/include/CGAL/IO/Dxf_variant_reader.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include @@ -47,7 +47,7 @@ template typedef typename CK::Line_2 Line_2; typedef typename CK::Point_2 Point_2; typedef typename CK::Circle_2 Circle_2; - typedef typename boost::variant< Circular_arc_2, Line_arc_2 > Arc; + typedef typename std::variant< Circular_arc_2, Line_arc_2 > Arc; typedef std::list Polygon; typedef std::list Polygons; typedef std::list Circles; diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h index 9ef9b35f1340..fb5420471dbb 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_3.h @@ -167,11 +167,11 @@ namespace CGAL { CGAL_kernel_precondition(sols1.size() > 0); CGAL_kernel_precondition(sols2.size() > 0); const std::pair& pair1= - *boost::get >( + *std::get >( &sols1[(sols1.size()==1)?(0):(less_xyz_s1?0:1)] ); const std::pair& pair2= - *boost::get >( + *std::get >( &sols2[(sols2.size()==1)?(0):(less_xyz_s2?0:1)] ); // the source and target must be different @@ -194,11 +194,11 @@ namespace CGAL { CGAL_kernel_precondition(sols1.size() > 0); CGAL_kernel_precondition(sols2.size() > 0); const std::pair& pair1= - *boost::get >( + *std::get >( &sols1[(sols1.size()==1)?(0):(less_xyz_p1?0:1)] ); const std::pair& pair2= - *boost::get >( + *std::get >( &sols2[(sols2.size()==1)?(0):(less_xyz_p2?0:1)] ); // the source and target must be different diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_point_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_point_3.h index bfb44edf9245..99eb521e1fa6 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_point_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Circular_arc_point_3.h @@ -81,13 +81,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } @@ -104,13 +104,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } @@ -127,13 +127,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } @@ -149,13 +149,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } @@ -171,13 +171,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } @@ -193,13 +193,13 @@ class Circular_arc_point_3 if(sols.size() == 1) { // the intersection must be a point const std::pair* pair= - boost::get >(&sols[0]); + std::get_if >(&sols[0]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } else { // the intersections must be a point const std::pair* pair= - boost::get >(&sols[less_xyz?0:1]); + std::get_if >(&sols[less_xyz?0:1]); CGAL_kernel_precondition(pair!=nullptr); *this = pair->first.rep(); } diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h index 7a90c240e03a..02da04e08975 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h @@ -15,7 +15,7 @@ #include -#include +#include #include namespace CGAL { @@ -36,7 +36,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int > CGAL_ADDITIONAL_VARIANT_FOR_ICL > type; @@ -49,7 +49,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int >, typename SK::Circle_3 CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -63,7 +63,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int >, typename SK::Circle_3 CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -77,7 +77,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair , typename SK::Circle_3 CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -87,7 +87,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair CGAL_ADDITIONAL_VARIANT_FOR_ICL > type; @@ -100,7 +100,7 @@ struct SK3_Intersection_traits template struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< typename SK::Circle_3, std::pair , typename SK::Circular_arc_3 @@ -111,7 +111,7 @@ struct SK3_Intersection_traits struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair , typename SK::Circular_arc_3 CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -125,7 +125,7 @@ struct SK3_Intersection_traits struct SK3_Intersection_traits { - typedef boost::variant< + typedef std::variant< std::pair , typename SK::Line_arc_3 CGAL_ADDITIONAL_VARIANT_FOR_ICL @@ -136,7 +136,7 @@ struct SK3_Intersection_traits struct SK3_intersect_ternary { - typedef boost::variant< + typedef std::variant< typename SK::Circle_3, typename SK::Plane_3, typename SK::Sphere_3, diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Line_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Line_arc_3.h index 9d10940f0aaf..de30249490da 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Line_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Line_arc_3.h @@ -94,9 +94,9 @@ namespace CGAL { // l must intersect s in 2 points CGAL_kernel_precondition(sols.size() == 2); const std::pair& pair1= - *boost::get >(&sols[0]); + *std::get_if >(&sols[0]); const std::pair& pair2= - *boost::get >(&sols[1]); + *std::get_if >(&sols[1]); if(less_xyz_first) { *this = Line_arc_3(l, pair1.first, pair2.first); } else { @@ -115,9 +115,9 @@ namespace CGAL { CGAL_kernel_precondition(sols1.size() > 0); CGAL_kernel_precondition(sols2.size() > 0); const std::pair& pair1= - *boost::get >(&sols1[(sols1.size()==1)?(0):(less_xyz_s1?0:1)]); + *std::get_if >(&sols1[(sols1.size()==1)?(0):(less_xyz_s1?0:1)]); const std::pair& pair2= - *boost::get >(&sols2[(sols2.size()==1)?(0):(less_xyz_s2?0:1)]); + *std::get_if >(&sols2[(sols2.size()==1)?(0):(less_xyz_s2?0:1)]); // the source and target must be different CGAL_kernel_precondition(pair1.first != pair2.first); *this = Line_arc_3(l, pair1.first, pair2.first); @@ -134,8 +134,8 @@ namespace CGAL { typedef typename SK3_Intersection_traits::type Intersection; Intersection i1 = SK().intersect_3_object()(l, p1); Intersection i2 = SK().intersect_3_object()(l, p2); - const typename SK::Point_3* point1=boost::get( & *i1 ); - const typename SK::Point_3* point2=boost::get( & *i2 ); + const typename SK::Point_3* point1=std::get_if( & *i1 ); + const typename SK::Point_3* point2=std::get_if( & *i2 ); CGAL_assertion(point1!=nullptr); CGAL_assertion(point2!=nullptr); // the source and target must be different diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h index 43a371937ecf..f17acf269084 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h @@ -223,7 +223,7 @@ namespace CGAL { // (again: converting to RT before assigning to the Iterator is // just to keep object working) template - struct Point_conversion_visitor : public boost::static_visitor { + struct Point_conversion_visitor { Point_conversion_visitor(const OutputIterator& it) : it(it) {} template OutputIterator operator()(const T& t) { *it++ = RT(t); return it; } @@ -291,7 +291,7 @@ namespace CGAL { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(s1, s3)) { internal::Point_conversion_visitor visitor(res); - return boost::apply_visitor(visitor, + return std::visit(visitor, *v); } return res; @@ -300,7 +300,7 @@ namespace CGAL { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(s1, s2)) { internal::Point_conversion_visitor visitor(res); - return boost::apply_visitor( + return std::visit( visitor, *v); } @@ -342,7 +342,7 @@ namespace CGAL { const typename SK::Sphere_3 & s2, OutputIterator res) { - typedef typename boost::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, + typedef typename std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, typename SK::Circle_3 > result_type; typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomial_for_spheres_2_3 Equation_sphere; @@ -357,7 +357,7 @@ namespace CGAL { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p, s1)) { internal::Point_conversion_visitor visitor(res); - return boost::apply_visitor( + return std::visit( visitor, *v); } @@ -368,7 +368,7 @@ namespace CGAL { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p, s1)) { internal::Point_conversion_visitor visitor(res); - return boost::apply_visitor( + return std::visit( visitor, *v); } @@ -391,7 +391,7 @@ namespace CGAL { const typename SK::Sphere_3 & s, OutputIterator res) { - typedef typename boost::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, + typedef typename std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, typename SK::Circle_3 > result_type; typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomial_for_spheres_2_3 Equation_sphere; @@ -406,7 +406,7 @@ namespace CGAL { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p1, s)) { internal::Point_conversion_visitor visitor(res); - return boost::apply_visitor( + return std::visit( visitor, *v); } diff --git a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h index 7a1921c698d9..be2ca1e37fb4 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h @@ -67,7 +67,7 @@ namespace CGAL // Typedefs for intersection typedef typename Kernel::Plane_3 Plane_3; typedef typename Kernel::Line_3 Line_3; - typedef std::optional< boost::variant< Point_3, + typedef std::optional< std::variant< Point_3, Line_3, Plane_3 > > result_inter; @@ -97,10 +97,10 @@ namespace CGAL result_inter result = CGAL::intersection(pp1, pp2, pp3); CGAL_assertion_msg(bool(result), "halfspace_intersection_3: no intersection"); - CGAL_assertion_msg(boost::get(& *result) != nullptr, + CGAL_assertion_msg(std::get_if(& *result) != nullptr, "halfspace_intersection_3: intersection is not a point"); - const Point_3* pp = boost::get(& *result); + const Point_3* pp = std::get_if(& *result); // Primal vertex associated to the current dual plane Point_3 ppp(origin.x() + pp->x(), diff --git a/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_2.h b/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_2.h index e2909ff4dd0d..b21d123ab68d 100644 --- a/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_2.h +++ b/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_2.h @@ -15,14 +15,14 @@ #include #include -#include +#include namespace CGAL { // This class should go away. // It is now only used by the Filtered_kernel. // It allows to iterate over the coordinates of both a Point_2 and a Vector_2, -// using a boost::variant, as the iterator types are the same at the kernel level. +// using a std::variant, as the iterator types are the same at the kernel level. template class Cartesian_coordinate_iterator_2 @@ -31,7 +31,7 @@ class Cartesian_coordinate_iterator_2 protected: typedef typename K::Point_2 P; typedef typename K::Vector_2 V; - boost::variant var; + std::variant var; int index; typedef Cartesian_coordinate_iterator_2 Self; @@ -57,9 +57,9 @@ class Cartesian_coordinate_iterator_2 reference operator*() const { - if (const P* const* p = boost::get(&var)) + if (const P* const* p = std::get_if(&var)) return (*p)->cartesian(index); - const V* const* v = boost::get(&var); + const V* const* v = std::get_if(&var); CGAL_assertion(v != 0); return (*v)->cartesian(index); } diff --git a/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_3.h b/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_3.h index c5a16320dc0d..2dfc7bcf27d1 100644 --- a/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_3.h +++ b/Filtered_kernel/include/CGAL/Filtered_kernel/Cartesian_coordinate_iterator_3.h @@ -15,14 +15,14 @@ #include #include -#include +#include namespace CGAL { // This class should go away. // It is now only used by the Filtered_kernel. // It allows to iterate over the coordinates of both a Point_3 and a Vector_3, -// using a boost::variant, as the iterator types are the same at the kernel level. +// using a std::variant, as the iterator types are the same at the kernel level. template class Cartesian_coordinate_iterator_3 @@ -31,7 +31,7 @@ class Cartesian_coordinate_iterator_3 protected: typedef typename K::Point_3 P; typedef typename K::Vector_3 V; - boost::variant var; + std::variant var; int index; typedef Cartesian_coordinate_iterator_3 Self; @@ -57,9 +57,9 @@ class Cartesian_coordinate_iterator_3 reference operator*() const { - if (const P* const* p = boost::get(&var)) + if (const P* const* p = std::get_if(&var)) return (*p)->cartesian(index); - const V* const* v = boost::get(&var); + const V* const* v = std::get_if(&var); CGAL_assertion(v != 0); return (*v)->cartesian(index); } diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index c9ff97618c31..41e1e371db75 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -31,7 +31,7 @@ #include #include -#include +#include #ifdef CGAL_LAZY_KERNEL_DEBUG # include #endif @@ -1425,19 +1425,19 @@ struct Ith_for_intersection_with_variant { : i(i_) {} - template< BOOST_VARIANT_ENUM_PARAMS(typename U) > + template< typename ... U > const T2& - operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const + operator()(const std::optional< std::variant< U ... > >& o) const { - const std::vector* ptr = (boost::get >(&(*o))); + const std::vector* ptr = (std::get_if >(&(*o))); return (*ptr)[i]; } - template< BOOST_VARIANT_ENUM_PARAMS(typename U) > + template< typename ... U > const T2& - operator()(const boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) >& o) const + operator()(const std::variant< U ... >& o) const { - const std::vector* ptr = (boost::get >(&o)); + const std::vector* ptr = (std::get_if >(&o)); return (*ptr)[i]; } }; @@ -1856,26 +1856,26 @@ template struct Variant_cast { typedef T result_type; - template + template const T& - operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(const std::optional< std::variant< U ... > >& o) const { // can throw but should never because we always build it inside // a static visitor with the right type - return boost::get(*o); + return std::get(*o); } - template + template T& - operator()(std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(std::optional< std::variant< U ... > >& o) const { // can throw but should never because we always build it inside // a static visitor with the right type, if it throws bad_get - return boost::get(*o); + return std::get(*o); } }; template -struct Fill_lazy_variant_visitor_2 : boost::static_visitor<> { +struct Fill_lazy_variant_visitor_2 { Fill_lazy_variant_visitor_2(Result& r, Origin& o) : r(&r), o(&o) {} Result* r; Origin* o; @@ -1912,7 +1912,7 @@ struct Fill_lazy_variant_visitor_2 : boost::static_visitor<> { }; template -struct Fill_lazy_variant_visitor_0 : boost::static_visitor<> { +struct Fill_lazy_variant_visitor_0 { Fill_lazy_variant_visitor_0(Result& r) : r(&r) {} Result* r; @@ -1998,7 +1998,7 @@ struct Lazy_construction_variant { // the static visitor fills the result_type with the correct unwrapped type internal::Fill_lazy_variant_visitor_2< result_type, AK, LK, EK, Lazy > visitor(res, lazy); - boost::apply_visitor(visitor, *approx_v); + std::visit(visitor, *approx_v); return res; } catch (Uncertain_conversion_exception&) {} @@ -2014,7 +2014,7 @@ struct Lazy_construction_variant { } internal::Fill_lazy_variant_visitor_0 visitor(res); - boost::apply_visitor(visitor, *exact_v); + std::visit(visitor, *exact_v); return res; } @@ -2052,7 +2052,7 @@ struct Lazy_construction_variant { // the static visitor fills the result_type with the correct unwrapped type internal::Fill_lazy_variant_visitor_2< result_type, AK, LK, EK, Lazy > visitor(res, lazy); - boost::apply_visitor(visitor, *approx_v); + std::visit(visitor, *approx_v); return res; } catch (Uncertain_conversion_exception&) {} @@ -2068,7 +2068,7 @@ struct Lazy_construction_variant { } internal::Fill_lazy_variant_visitor_0< result_type, AK, LK, EK> visitor(res); - boost::apply_visitor(visitor, *exact_v); + std::visit(visitor, *exact_v); return res; } }; diff --git a/Filtered_kernel/test/Filtered_kernel/test_lazy_vector_objects.cpp b/Filtered_kernel/test/Filtered_kernel/test_lazy_vector_objects.cpp index 041f6022a0ec..dd998fce87c8 100644 --- a/Filtered_kernel/test/Filtered_kernel/test_lazy_vector_objects.cpp +++ b/Filtered_kernel/test/Filtered_kernel/test_lazy_vector_objects.cpp @@ -42,7 +42,7 @@ int main() } V = nullptr; - if( !(V = boost::get >(&(*o_variant))) ){ + if( !(V = std::get_if >(&(*o_variant))) ){ std::cerr << "ERROR, something other than vector< point_2 >" << std::endl; return EXIT_FAILURE; } @@ -82,7 +82,7 @@ int main() } V = nullptr; - if( !(V = boost::get > (&(*o_variant))) ){ + if( !(V = std::get_if > (&(*o_variant))) ){ std::cerr << "ERROR" << std::endl; return EXIT_FAILURE; } diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h index 73eea1976402..81522776a5b3 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h @@ -80,12 +80,12 @@ class PainterOstream< Hyperbolic_Delaunay_triangulation_traits_2 > PainterOstream& operator<<(const Hyperbolic_segment_2& s) { - if(const Euclidean_segment_2* seg = boost::get(&s)) { + if(const Euclidean_segment_2* seg = std::get_if(&s)) { CGAL::Qt::PainterOstream::operator << (*seg); return *this; } - const Circular_arc_2& arc = boost::get(s); + const Circular_arc_2& arc = std::get(s); if(arc.squared_radius() > 100) { Euclidean_segment_2 seg(arc.source(), arc.target()); diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h index 8f434a5a41f1..61d6630eeb3a 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h @@ -44,12 +44,12 @@ namespace Qt { PainterOstream& operator <<(const Hyperbolic_segment_2& s) { - if(const Line_arc* seg = boost::get(&s)) { + if(const Line_arc* seg = std::get_if(&s)) { operator << (*seg); return *this; } - const Circular_arc& arc = boost::get(s); + const Circular_arc& arc = std::get(s); if(arc.squared_radius() > 10) { diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h index 8913899a2710..3dcd277ab47b 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h @@ -35,7 +35,7 @@ class Hyperbolic_Delaunay_triangulation_CK_traits_2 : public K { typedef typename K::Circular_arc_point_2 Hyperbolic_Voronoi_point_2; typedef typename K::Circular_arc_2 Circular_arc_2; typedef typename K::Line_arc_2 Line_arc_2; - typedef boost::variant Hyperbolic_segment_2; typedef typename K::Triangle_2 Hyperbolic_triangle_2; /// @} diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h index 8eab67ea0836..c1131a1e1ef1 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h @@ -35,7 +35,7 @@ class Hyperbolic_Delaunay_triangulation_traits_2 : public K { typedef Hyperbolic_point_2 Hyperbolic_Voronoi_point_2; typedef unspecified_type Circular_arc_2; typedef typename K::Segment_2 Euclidean_segment_2; - typedef boost::variant< Circular_arc_2, + typedef std::variant< Circular_arc_2, Euclidean_segment_2 > Hyperbolic_segment_2; typedef typename K::Triangle_2 Hyperbolic_triangle_2; /// @} diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h index da42c7429f98..ee95f6c0f859 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_CK_traits_2.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include @@ -69,9 +69,9 @@ namespace internal { Euclidean_line_2* l; Circle_2* c; - if(Circle_2* c_pq = boost::get(&bis_pq)) + if(Circle_2* c_pq = std::get_if(&bis_pq)) { - if(Circle_2* c_qr = boost::get(&bis_qr)) + if(Circle_2* c_qr = std::get_if(&bis_qr)) { typedef typename CK2_Intersection_traits::type Intersection_result; std::vector< Intersection_result > inters; @@ -90,14 +90,14 @@ namespace internal { } // here bis_qr is a line - l = boost::get(&bis_qr); + l = std::get_if(&bis_qr); c = c_pq; } else { // here bis_pq is a line, and bis_qr is necessarily a circle - l = boost::get(&bis_pq); - c = boost::get(&bis_qr); + l = std::get_if(&bis_pq); + c = std::get_if(&bis_qr); } typedef typename CK2_Intersection_traits::type Intersection_result; @@ -157,7 +157,7 @@ namespace internal { } Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c = boost::get(&bis_pq); + Circle_2* c = std::get_if(&bis_pq); if(_gt.less_y_2_object()(po, c->center())) return Circular_arc_2(*c, l_inf, true, l_inf, false); @@ -200,7 +200,7 @@ namespace internal { Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c_pq = boost::get(&bis_pq); + Circle_2* c_pq = std::get_if(&bis_pq); if(_gt.compare_distance_2_object()(po, p, q) == POSITIVE) { @@ -251,7 +251,7 @@ namespace internal { } Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c_pq = boost::get(&bis_pq); + Circle_2* c_pq = std::get_if(&bis_pq); Hyperbolic_point_2 approx_a(to_double(a.x()),to_double(a.y())); @@ -311,14 +311,14 @@ class Hyperbolic_Delaunay_triangulation_CK_traits_2 typedef typename R::Point_2 Hyperbolic_point_2; typedef typename R::Circle_2 Circle_2; typedef typename R::Line_2 Euclidean_line_2; - typedef boost::variant Euclidean_circle_or_line_2; + typedef std::variant Euclidean_circle_or_line_2; typedef typename R::Circular_arc_2 Circular_arc_2; typedef typename R::Line_arc_2 Line_arc_2; typedef typename R::Circular_arc_point_2 Circular_arc_point_2; typedef Circular_arc_point_2 Hyperbolic_Voronoi_point_2; typedef typename R::Segment_2 Euclidean_segment_2; // only used internally here - typedef boost::variant Hyperbolic_segment_2; + typedef std::variant Hyperbolic_segment_2; typedef typename R::Triangle_2 Hyperbolic_triangle_2; diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h index 801ee71d9934..e54c4cb75a8d 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include @@ -187,9 +187,9 @@ class Construct_intersection_2 Hyperbolic_point_2 operator()(Hyperbolic_segment_2 s1, Hyperbolic_segment_2 s2) { - if(Circular_arc_2* c1 = boost::get(&s1)) + if(Circular_arc_2* c1 = std::get_if(&s1)) { - if(Circular_arc_2* c2 = boost::get(&s2)) + if(Circular_arc_2* c2 = std::get_if(&s2)) { std::pair res = operator()(c1->supporting_circle(), c2->supporting_circle()); Hyperbolic_point_2 p1 = res.first; @@ -202,7 +202,7 @@ class Construct_intersection_2 } else { - Euclidean_segment_2* ell2 = boost::get(&s2); + Euclidean_segment_2* ell2 = std::get_if(&s2); std::pair res = operator()(c1->supporting_circle(), ell2->supporting_line()); Hyperbolic_point_2 p1 = res.first; @@ -216,8 +216,8 @@ class Construct_intersection_2 } else { - Euclidean_segment_2* ell1 = boost::get(&s1); - if(Circular_arc_2* c2 = boost::get(&s2)) + Euclidean_segment_2* ell1 = std::get_if(&s1); + if(Circular_arc_2* c2 = std::get_if(&s2)) { std::pair res = operator()(ell1->supporting_line(), c2->supporting_circle()); @@ -231,7 +231,7 @@ class Construct_intersection_2 } else { - Euclidean_segment_2* ell2 = boost::get(&s2); + Euclidean_segment_2* ell2 = std::get_if(&s2); Hyperbolic_point_2 p1 = operator()(ell1->supporting_line(), ell2->supporting_line()); CGAL_assertion(p1.x()*p1.x() + p1.y()*p1.y() < FT(1)); return p1; @@ -279,9 +279,9 @@ class Construct_hyperbolic_circumcenter_2 Euclidean_line_2* l; Circle_2* c; - if(Circle_2* c_pq = boost::get(&bis_pq)) + if(Circle_2* c_pq = std::get_if(&bis_pq)) { - if(Circle_2* c_qr = boost::get(&bis_qr)) + if(Circle_2* c_qr = std::get_if(&bis_qr)) { std::pair inters = ci(*c_pq, *c_qr); @@ -291,14 +291,14 @@ class Construct_hyperbolic_circumcenter_2 return inters.second; } - l = boost::get(&bis_qr); + l = std::get_if(&bis_qr); c = c_pq; } else { // here bis_pq is a line - l = boost::get(&bis_pq); - c = boost::get(&bis_qr); + l = std::get_if(&bis_pq); + c = std::get_if(&bis_qr); } std::pair inters = ci(*c, *l); @@ -348,7 +348,7 @@ class Construct_hyperbolic_bisector_2 } Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c = boost::get(&bis_pq); + Circle_2* c = std::get_if(&bis_pq); std::pair inters = ci(*c, l_inf); if(_gt.orientation_2_object()(c->center(), inters.first, inters.second) == POSITIVE) @@ -388,7 +388,7 @@ class Construct_hyperbolic_bisector_2 } Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c_pq = boost::get(&bis_pq); + Circle_2* c_pq = std::get_if(&bis_pq); if(_gt.compare_distance_2_object()(po, p, q) == POSITIVE) { // then p is inside the supporting circle @@ -430,7 +430,7 @@ class Construct_hyperbolic_bisector_2 } Euclidean_circle_or_line_2 bis_pq = cclsb(p, q); - Circle_2* c_pq = boost::get(&bis_pq); + Circle_2* c_pq = std::get_if(&bis_pq); std::pair inters = ci(*c_pq, l_inf); Hyperbolic_point_2 approx_pinf = inters.first; @@ -468,10 +468,10 @@ class Hyperbolic_Delaunay_triangulation_traits_2 typedef Hyperbolic_point_2 Hyperbolic_Voronoi_point_2; typedef typename Kernel::Circle_2 Circle_2; typedef typename Kernel::Line_2 Euclidean_line_2; - typedef boost::variant Euclidean_circle_or_line_2; + typedef std::variant Euclidean_circle_or_line_2; typedef internal::HDT_2_Circular_arc_2 Circular_arc_2; typedef typename Kernel::Segment_2 Euclidean_segment_2; // only used internally here - typedef boost::variant Hyperbolic_segment_2; + typedef std::variant Hyperbolic_segment_2; typedef typename Kernel::Triangle_2 Hyperbolic_triangle_2; diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 386d2a272020..d4f9b06a8435 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -12,6 +12,7 @@ Release date: October 2023 - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. - **Breaking change**: The usage of `boost::shared_ptr` has been replaced by `std::shared_ptr`. Packages affected are 2D Straight Line Skeleton and Shape Detection. - **Breaking change**: The usage of `boost::optional` has been replaced by `std::optional`. Packages affected are 2D Straight Line Skeleton, 3D Fast Intersection and Distance Computation (AABB Tree), and the Kernel intersection. +- **Breaking change**: The usage of `boost::variant` has been replaced by `std::variant`. Packages affected are 2D Arrangements, and the Kernel intersection. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) diff --git a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp index c5176eda212c..7fa07b4760a5 100644 --- a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp +++ b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include @@ -26,7 +26,7 @@ struct Intersection_traits; template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -54,7 +54,7 @@ OutputIterator intersect_do_iterator(const typename K::Segment_2 &seg1, template std::optional< - boost::variant + std::variant > intersection_variant(const typename K::Segment_2 &seg1, const typename K::Segment_2 &seg2, @@ -62,7 +62,7 @@ intersection_variant(const typename K::Segment_2 &seg1, { typedef CGAL::internal::Segment_2_Segment_2_pair is_t; - typedef boost::variant Variant; + typedef std::variant Variant; typedef std::optional OptVariant; is_t ispair(&seg1, &seg2); @@ -122,7 +122,7 @@ struct Vec_holder { std::vector* s; }; -struct Visitor : public boost::static_visitor<>, Vec_holder +struct Visitor { Visitor(std::vector* p, std::vector* s) : Vec_holder(p, s) { } @@ -141,7 +141,7 @@ struct Variant_f { void operator()(const Segment& s1, const Segment& s2) { result_type obj = intersection_variant(s1, s2, K()); if(obj) { - boost::apply_visitor(v, *obj); + std::visit(v, *obj); } } }; @@ -224,7 +224,7 @@ std::tuple intersect_each_variant_overload(const Vector& segs) { std::function( [&ret](const Point& p) { (void)p; ++(std::get<0>(ret)); }))); - boost::apply_visitor(v, *obj); + std::visit(v, *obj); } else { ++(std::get<2>(ret)); } diff --git a/Intersections_2/include/CGAL/Intersection_traits.h b/Intersections_2/include/CGAL/Intersection_traits.h index ca313a2c8524..35dcf6540fad 100644 --- a/Intersections_2/include/CGAL/Intersection_traits.h +++ b/Intersections_2/include/CGAL/Intersection_traits.h @@ -18,14 +18,14 @@ #include #include -#include +#include #include #define CGAL_INTERSECTION_TRAITS_2(A, B, R1, R2) \ template \ struct Intersection_traits { \ - typedef typename boost::variant \ + typedef typename std::variant \ variant_type; \ typedef typename std::optional< variant_type > result_type; \ }; @@ -33,7 +33,7 @@ #define CGAL_INTERSECTION_TRAITS_3(A, B, R1, R2, R3) \ template \ struct Intersection_traits { \ - typedef typename boost::variant variant_type; \ typedef typename std::optional< variant_type > result_type; \ }; @@ -118,16 +118,16 @@ const T* intersect_get(const CGAL::Object& o) { return CGAL::object_cast(&o); } -template +template inline -const T* intersect_get(const std::optional< boost::variant >& v) { - return boost::get(&*v); +const T* intersect_get(const std::optional< std::variant >& v) { + return std::get_if(&*v); } -template +template inline -const T* intersect_get(const boost::variant & v) { - return boost::get(&v); +const T* intersect_get(const std::variant & v) { + return std::get_if(&v); } template diff --git a/Intersections_2/include/CGAL/Intersection_traits_2.h b/Intersections_2/include/CGAL/Intersection_traits_2.h index df4d10a6c2a6..bf43d9a079ac 100644 --- a/Intersections_2/include/CGAL/Intersection_traits_2.h +++ b/Intersections_2/include/CGAL/Intersection_traits_2.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include @@ -49,7 +49,7 @@ CGAL_INTERSECTION_TRAITS_2(Ray_2, Triangle_2, Point_2, Segment_2) template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_2, typename K::Segment_2, + std::variant< typename K::Point_2, typename K::Segment_2, typename K::Triangle_2, typename std::vector< typename K::Point_2 > > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -69,7 +69,7 @@ CGAL_INTERSECTION_TRAITS_2(Ray_2, Iso_rectangle_2, Point_2, Segment_2) // Variants of one for backwards compatibility template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; @@ -77,26 +77,26 @@ struct Intersection_traits struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; template struct Intersection_traits { - typedef typename boost::variant > variant_type; typedef typename std::optional < variant_type > result_type; @@ -118,13 +118,13 @@ struct Intersection_traits { template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; template struct Intersection_traits { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef std::optional result_type; }; diff --git a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h index 4081086aa1c5..2ebd27332ad2 100644 --- a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h @@ -25,12 +25,12 @@ do_intersect(const CGAL::Bbox_2& c, return CGAL::do_overlap(c, bbox); } -typename std::optional< typename boost::variant > +typename std::optional< typename std::variant > inline intersection(const CGAL::Bbox_2& a, const CGAL::Bbox_2& b) { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef typename std::optional result_type; if(!do_intersect(a, b)) diff --git a/Intersections_2/test/Intersections_2/test_intersections_2.cpp b/Intersections_2/test/Intersections_2/test_intersections_2.cpp index 5c15555404af..38a81c0a29a5 100644 --- a/Intersections_2/test/Intersections_2/test_intersections_2.cpp +++ b/Intersections_2/test/Intersections_2/test_intersections_2.cpp @@ -490,7 +490,7 @@ struct Test std::set ds; auto test = [&ds](S s1, S s2) { - P i = boost::get

    (*CGAL::intersection(s1,s2)); + P i = std::get

    (*CGAL::intersection(s1,s2)); ds.insert(CGAL::to_double(i.x())); ds.insert(CGAL::to_double(i.y())); assert(ds.size()==2); }; diff --git a/Intersections_3/include/CGAL/Intersection_traits_3.h b/Intersections_3/include/CGAL/Intersection_traits_3.h index a72f5cac9231..2d2b8ca64ff3 100644 --- a/Intersections_3/include/CGAL/Intersection_traits_3.h +++ b/Intersections_3/include/CGAL/Intersection_traits_3.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include @@ -84,7 +84,7 @@ CGAL_INTERSECTION_TRAITS_3(Sphere_3, Sphere_3, Point_3, Circle_3, Sphere_3) template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, typename std::vector< typename K::Point_3 > > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -108,7 +108,7 @@ CGAL_INTERSECTION_TRAITS_2(Iso_cuboid_3, Ray_3, Point_3, Segment_3) template struct Intersection_traits { typedef typename - boost::variant< typename K::Iso_cuboid_3 > variant_type; + std::variant< typename K::Iso_cuboid_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -118,7 +118,7 @@ struct Intersection_traits struct Intersection_traits { typedef typename - boost::variant< typename K::Segment_3, typename K::Point_3 > variant_type; + std::variant< typename K::Segment_3, typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -148,7 +148,7 @@ struct Intersection_traits : template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -156,14 +156,14 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -172,7 +172,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Iso_cuboid_3 > variant_type; + std::variant< typename K::Iso_cuboid_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -184,7 +184,7 @@ struct Intersection_traits template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -192,7 +192,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -201,7 +201,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -211,7 +211,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -220,7 +220,7 @@ struct Intersection_traits template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -230,7 +230,7 @@ struct Intersection_traits template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -239,7 +239,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -249,7 +249,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -258,7 +258,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3, typename K::Segment_3, + std::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; @@ -268,7 +268,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -276,7 +276,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -284,7 +284,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -292,7 +292,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -300,7 +300,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -308,7 +308,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -316,7 +316,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -324,7 +324,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -332,7 +332,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -340,7 +340,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -348,7 +348,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -356,7 +356,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -364,7 +364,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -372,7 +372,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -380,7 +380,7 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 > variant_type; + std::variant< typename K::Point_3 > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -389,7 +389,7 @@ template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 , typename K::Segment_3, + std::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -399,7 +399,7 @@ template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 , typename K::Segment_3, + std::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -409,7 +409,7 @@ template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 , typename K::Segment_3, + std::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; }; @@ -419,7 +419,7 @@ template struct Intersection_traits { typedef typename - boost::variant< typename K::Point_3 , typename K::Segment_3, + std::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; typedef typename std::optional< variant_type > result_type; }; diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h index 44af7d691c05..c3303e93e80a 100644 --- a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include @@ -39,12 +39,12 @@ do_intersect(const CGAL::Bbox_3& c, return CGAL::do_overlap(c, bbox); } -typename std::optional< typename boost::variant< Bbox_3> > +typename std::optional< typename std::variant< Bbox_3> > inline intersection(const CGAL::Bbox_3& a, const CGAL::Bbox_3& b) { - typedef typename boost::variant variant_type; + typedef typename std::variant variant_type; typedef typename std::optional result_type; if(!do_intersect(a,b)) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h index df219948c4ef..1ec423af9c96 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h @@ -23,7 +23,7 @@ #include #include -#include +#include namespace CGAL { namespace Intersections { @@ -34,7 +34,7 @@ namespace internal { // But it must be a template function since the original kernel must be // taken into account. template -typename std::optional< boost::variant > +typename std::optional< std::variant > intersection_bl(const Bbox_3& box, double lpx, double lpy, double lpz, double ldx, double ldy, double ldz, @@ -45,7 +45,7 @@ intersection_bl(const Bbox_3& box, typedef typename K::Vector_3 Vector_3; typedef typename K::Segment_3 Segment_3; - typedef typename std::optional > result_type; + typedef typename std::optional > result_type; double seg_min = 0.0, seg_max = 1.0; // first on x value diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_intersection.h index ccdba585679f..2c834588f6ba 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_intersection.h @@ -67,7 +67,7 @@ void clip_poly_halfspace( SP_type inter = k.intersect_3_object()(seg, pl); if(inter) { - Point* p_inter = boost::get(&*inter); + Point* p_inter = std::get_if(&*inter); if(p_inter && !(k.equal_3_object()(*p_inter, p1)) && !(k.equal_3_object()(*p_inter, p2))) @@ -90,7 +90,7 @@ void clip_poly_halfspace( SP_type inter = typename K::Intersect_3()(seg, pl); if(inter) { - Point* p_inter = boost::get(&*inter); + Point* p_inter = std::get_if(&*inter); if(p_inter && !(k.equal_3_object()(*p_inter, p1)) && !(k.equal_3_object()(*p_inter, p2))) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h index bdc881bf75aa..b0cc8f3ec226 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h @@ -19,7 +19,7 @@ #include #include -#include +#include namespace CGAL { namespace Intersections { @@ -74,13 +74,13 @@ intersection_point(const typename K::Plane_3& plane1, } template -std::optional > +std::optional > intersection(const typename K::Plane_3& plane1, const typename K::Plane_3& plane2, const typename K::Plane_3& plane3, const K& k) { - typedef typename std::optional > result_type; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Segment_3_Segment_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Segment_3_Segment_3_intersection.h index 9bf2ed97ac70..c231137fd7d5 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Segment_3_Segment_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Segment_3_Segment_3_intersection.h @@ -76,8 +76,6 @@ intersection_collinear_segments(const typename K::Segment_3& s1, template struct L_p_visitor - : public boost::static_visitor< - typename Intersection_traits::result_type> { typedef typename Intersection_traits::result_type result_type; @@ -117,7 +115,7 @@ intersection(const typename K::Segment_3& s1, v = internal::intersection(s1.supporting_line(), s2.supporting_line(), k); if(v) - return apply_visitor(L_p_visitor(s1, s2) , *v); + return std::visit(L_p_visitor(s1, s2) , *v); return intersection_return(); } diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h index 424e1fc93616..41a25d4eca05 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Triangle_3_Triangle_3_intersection.h @@ -209,7 +209,7 @@ intersection(const typename K::Triangle_3& t1, return intersection_return(); } - return boost::apply_visitor(Triangle_Line_visitor(), *inter1, *inter2); + return std::visit(Triangle_Line_visitor(), *inter1, *inter2); } return intersection_return(); diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/tetrahedron_lines_intersections_3.h b/Intersections_3/include/CGAL/Intersections_3/internal/tetrahedron_lines_intersections_3.h index 1dc059a20f16..4aba04c9e1a7 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/tetrahedron_lines_intersections_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/tetrahedron_lines_intersections_3.h @@ -68,7 +68,7 @@ struct Tetrahedron_lines_intersection_3_base if(do_intersect(o, triangle)) { tr_seg[i] = typename K::Intersect_3()(o, triangle); - if(boost::get(&*tr_seg[i]) != nullptr) + if(std::get_if(&*tr_seg[i]) != nullptr) { res_id = i; break; @@ -91,7 +91,7 @@ struct Tetrahedron_lines_intersection_3_base { if(tr_seg[i]) { - if(const typename K::Point_3* p = boost::get(&*tr_seg[i])) + if(const typename K::Point_3* p = std::get_if(&*tr_seg[i])) { if(res_points.empty()) { diff --git a/Intersections_3/test/Intersections_3/intersection_test_helper.h b/Intersections_3/test/Intersections_3/intersection_test_helper.h index a38e2bad55f3..2e9806ad03b6 100644 --- a/Intersections_3/test/Intersections_3/intersection_test_helper.h +++ b/Intersections_3/test/Intersections_3/intersection_test_helper.h @@ -311,7 +311,7 @@ struct Intersection_3_tester { if(ov->type() == typeid(T)) { - auto* r = boost::get(&*ov); // ov is an optional + auto* r = std::get_if(&*ov); // ov is an optional assert(r); return (t == *r); } @@ -363,7 +363,7 @@ struct Intersection_3_tester assert(ires12 && ires34); Variant_visitor vis(ires12); - boost::apply_visitor(vis, *ires34); + std::visit(vis, *ires34); assert(vis.equal); } } diff --git a/Intersections_3/test/Intersections_3/test_intersections_Iso_cuboid_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Iso_cuboid_3.cpp index 91e91913a48c..e5ef0e492844 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Iso_cuboid_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Iso_cuboid_3.cpp @@ -208,7 +208,7 @@ struct Iso_cuboid_3_intersection_tester // face auto res = CGAL::intersection(cub, Pl(p(1,1,1), p(1,2,1), p(1,2,2))); - const std::vector

    * poly = boost::get >(&*res); + const std::vector

    * poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); for(const P& pt : *poly) @@ -217,7 +217,7 @@ struct Iso_cuboid_3_intersection_tester } res = CGAL::intersection(cub, Pl(p(1,1,1), p(1,2,1), p(2,2,2))); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); for(const P& pt : *poly) { @@ -227,7 +227,7 @@ struct Iso_cuboid_3_intersection_tester // other edge Pl pln(p(1,1,1), p(1,2,1), P(1.5, 1, 2)); res = CGAL::intersection(cub, pln); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); for(const P& pt : *poly) { @@ -245,7 +245,7 @@ struct Iso_cuboid_3_intersection_tester // random pln = Pl(0.265189, 0.902464, 0.33946, -2.47551); res = CGAL::intersection(cub, pln); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 5); for(const P& pt : *poly) { @@ -575,7 +575,7 @@ struct Iso_cuboid_3_intersection_tester // face in a tr Tr tr(p(-3, -3, 1), p(3, -3, 1), P(1.5, 6, 1)); Res res = CGAL::intersection(cub, tr); - Pol* poly = boost::get >(&*res); + Pol* poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); if(this->has_exact_c) @@ -618,7 +618,7 @@ struct Iso_cuboid_3_intersection_tester // tr through tr = Tr(p(2, 4, 2), P(1, 3.5, -0.5), p(1, -1, 1)); res = CGAL::intersection(cub, tr); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); if(this->has_exact_c) @@ -635,7 +635,7 @@ struct Iso_cuboid_3_intersection_tester // cutting in half along diagonal (intersection included in triangle) tr = Tr(p(1, 1, 10), p(10, 10, 1), p(1, 1, 1)); res = CGAL::intersection(cub, tr); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); if(this->has_exact_c) @@ -647,7 +647,7 @@ struct Iso_cuboid_3_intersection_tester // 6 points intersection tr = Tr(P(18.66, -5.4, -11.33), P(-2.41, -7.33, 19.75), P(-10.29, 20.15, -10.33)); res = CGAL::intersection(cub, tr); - poly = boost::get >(&*res); + poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 6); if(this->has_exact_c) @@ -659,7 +659,7 @@ struct Iso_cuboid_3_intersection_tester // triangle clipping a cuboid corner tr = Tr(P(1.02, 1.33, 0.62), P(1.95, 2.54, 0.95), P(0.79, 2.36, 1.92)); res = CGAL::intersection(cub, tr); - Tr* tr_res = boost::get(&*res); + Tr* tr_res = std::get_if(&*res); assert(tr_res != nullptr); if(this->has_exact_c) { diff --git a/Intersections_3/test/Intersections_3/test_intersections_Plane_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Plane_3.cpp index fc32a571b4c5..265435329e50 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Plane_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Plane_3.cpp @@ -286,7 +286,7 @@ struct Plane_3_intersection_tester // Don't have the right values to test further. auto res = CGAL::intersection(tet, pln); - const std::vector

    * poly = boost::get >(&*res); + const std::vector

    * poly = std::get_if >(&*res); assert(poly != nullptr); assert(poly->size() == 4); } diff --git a/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp index 29b21af670f1..f6b40f5e7789 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp @@ -226,7 +226,7 @@ struct Tetrahedron_3_intersection_tester Tr tr(p(-2,2,0), p(2,2,0), P(0.25,0.25,0)); auto res = CGAL::intersection(tet, tr); - const Poly* poly = boost::get(&*res); + const Poly* poly = std::get_if(&*res); assert(poly != nullptr); assert(poly->size() == 4); for(const P& pt : *poly) { @@ -235,7 +235,7 @@ struct Tetrahedron_3_intersection_tester tr = Tr(P(0.45, 0.20, 0.1), P(0.1, 0.20, 0.5), P(-0.5, 0.25, -0.5)); res = CGAL::intersection(tet, tr); - const Poly* inter = boost::get(&*res); + const Poly* inter = std::get_if(&*res); assert(inter != nullptr); assert(inter->size() == 5); for(const P& pt : *inter) { @@ -287,22 +287,22 @@ struct Tetrahedron_3_intersection_tester auto res = CGAL::intersection(tet, tr); std::vector

    points; - if(const P* pt = boost::get

    (&*res)) + if(const P* pt = std::get_if

    (&*res)) { points.push_back(*pt); } - else if(const S* s = boost::get(&*res)) + else if(const S* s = std::get_if(&*res)) { points.push_back(s->source()); points.push_back(s->target()); } - else if(const Tr* itr = boost::get(&*res)) + else if(const Tr* itr = std::get_if(&*res)) { points.push_back(itr->operator[](0)); points.push_back(itr->operator[](1)); points.push_back(itr->operator[](2)); } - else if(const Poly* poly = boost::get(&*res)) + else if(const Poly* poly = std::get_if(&*res)) { points = *poly; @@ -323,7 +323,7 @@ struct Tetrahedron_3_intersection_tester Tet tet(P(0, -1, 0), P(-1, 0, 0), P(0, 0, 0), P(0, 0, -1)); auto res = intersection(tri, tet); assert(res != std::nullopt); - const std::vector

    *vps = boost::get>(&*res); + const std::vector

    *vps = std::get_if>(&*res); assert(vps!=nullptr); } diff --git a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h index 88afb8e5bfff..fec8c6c80a11 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h @@ -81,7 +81,7 @@ typedef Line_3 Line_2; A construction object. Provides the operator : -`std::optional< boost::variant > operator()(Segment_2 s1, Segment_2 s2);` +`std::optional< std::variant > operator()(Segment_2 s1, Segment_2 s2);` which returns a 3D object whose projection on the xy-plane is the intersection of the projections of `s1` and `s2`. If non empty, the returned object is either a segment or a point. diff --git a/Kernel_23/doc/Kernel_23/CGAL/Spherical_kernel_intersections.h b/Kernel_23/doc/Kernel_23/CGAL/Spherical_kernel_intersections.h index f235beb0e798..855543689845 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Spherical_kernel_intersections.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Spherical_kernel_intersections.h @@ -102,7 +102,7 @@ intersection(const SphericalType1 &obj1, const SphericalType2 &obj2, /*! Copies in the output iterator the intersection elements between the three objects. `intersections` iterates on -elements of type `boost::variant< Circle_3, Plane_3, Sphere_3, std::pair< Circular_arc_point_3, unsigned > >`, in lexicographic order +elements of type `std::variant< Circle_3, Plane_3, Sphere_3, std::pair< Circular_arc_point_3, unsigned > >`, in lexicographic order when this ordering is defined on the computed objects where `Type1`, `Type2` and `Type3` diff --git a/Kernel_23/doc/Kernel_23/CGAL/intersections.h b/Kernel_23/doc/Kernel_23/CGAL/intersections.h index 430e37cbcc09..160bb35d7ebc 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/intersections.h +++ b/Kernel_23/doc/Kernel_23/CGAL/intersections.h @@ -103,7 +103,7 @@ The following tables give the possible values for `Type1` and `Type2`. The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`std::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< std::variant< T... > >`, the last column in the table providing the template parameter pack.

    @@ -193,7 +193,7 @@ the template parameter pack.
    Additional overloads are provided for the type `Point_2` combined with any other type with the result type being -`std::optional< boost::variant< Point_2 > >`. +`std::optional< std::variant< Point_2 > >`. Overloads are also provided for the type `Bbox_2`, for all intersections existing with the type `Iso_rectangle_2`. Note that the return type for `Bbox_2` - `Bbox_2` is `Bbox_2` and not `Iso_rectangle_2`. @@ -202,7 +202,7 @@ intersections existing with the type `Iso_rectangle_2`. Note that the return typ The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`std::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< std::variant< T... > >`, the last column in the table providing the template parameter pack.
    @@ -351,7 +351,7 @@ the template parameter pack.
    Additional overloads are provided for the type `Point_3` combined with any other type with the result type being -`std::optional< boost::variant< Point_3 > >`. Overloads are also provided for the type `Bbox_3`, for all +`std::optional< std::variant< Point_3 > >`. Overloads are also provided for the type `Bbox_3`, for all intersections existing with the type `Iso_cuboid_3`. Note that the return type for `Bbox_3` - `Bbox_3` is `Bbox_3` and not `Iso_cuboid_3`. @@ -363,18 +363,18 @@ The following examples demonstrate the most common use of In the first two examples we intersect a segment and a line. The result type can be specified through the placeholder type specifier `auto`, -but you must anyway know that the result type is a `std::optional >`, +but you must anyway know that the result type is a `std::optional >`, in order to unpack the point or segment. `std::optional` comes in -as there might be no intersection. `boost::variant` comes in +as there might be no intersection. `std::variant` comes in as, if there is an intersection, it is either a point or a segment. -As explained in the boost manual pages for `boost::variant`, there are two ways to access the variants. The first examples uses `boost::get`. +As explained in the boost manual pages for `std::variant`, there are two ways to access the variants. The first examples uses `boost::get`. \cgalExample{Kernel_23/intersection_get.cpp} -The second example uses `boost::apply_visitor`. +The second example uses `std::visit`. \cgalExample{Kernel_23/intersection_visitor.cpp} diff --git a/Kernel_23/doc/Kernel_23/Kernel_23.txt b/Kernel_23/doc/Kernel_23/Kernel_23.txt index 451829f8eaee..0919077d3ab3 100644 --- a/Kernel_23/doc/Kernel_23/Kernel_23.txt +++ b/Kernel_23/doc/Kernel_23/Kernel_23.txt @@ -495,7 +495,7 @@ especially integer types and rationals. Some functions, for example \link intersection_linear_grp `intersection()`\endlink, can return different types of objects. To achieve this in a type-safe way \cgal uses -return values of type `std::optional< boost::variant< T... > >` where `T...` is a +return values of type `std::optional< std::variant< T... > >` where `T...` is a list of all possible resulting geometric objects. The exact result type of an intersection can be specified through the placeholder type specifier `auto`. @@ -521,10 +521,10 @@ std::cin >> segment_1 >> segment_2; auto v = intersection(segment_1, segment_2); if (v) { /* not empty */ - if (const Point_2 *p = boost::get(&*v) ) { + if (const Point_2 *p = std::get_if(&*v) ) { /* do something with *p */ } else { - const Segment_2 *s = boost::get(&*v); + const Segment_2 *s = std::get_if(&*v); /* do something with *s */ } } else { diff --git a/Kernel_23/examples/Kernel_23/cartesian_converter.cpp b/Kernel_23/examples/Kernel_23/cartesian_converter.cpp index ebd4343d3040..6d13c05bce16 100644 --- a/Kernel_23/examples/Kernel_23/cartesian_converter.cpp +++ b/Kernel_23/examples/Kernel_23/cartesian_converter.cpp @@ -30,7 +30,7 @@ int main(){ // As we are sure that there IS an intersection // and that the intersection IS a point // we do not have to check for this, or put it in a try/catch - const EK::Point_3& exact_pt = boost::get(*inter); + const EK::Point_3& exact_pt = std::get(*inter); EK_to_IK to_inexact; diff --git a/Kernel_23/examples/Kernel_23/intersection_get.cpp b/Kernel_23/examples/Kernel_23/intersection_get.cpp index ff2332a153cc..b245edd4a56d 100644 --- a/Kernel_23/examples/Kernel_23/intersection_get.cpp +++ b/Kernel_23/examples/Kernel_23/intersection_get.cpp @@ -14,10 +14,10 @@ int main() const auto result = intersection(seg, lin); if (result) { - if (const Segment_2* s = boost::get(&*result)) { + if (const Segment_2* s = std::get_if(&*result)) { std::cout << *s << std::endl; } else { - const Point_2* p = boost::get(&*result); + const Point_2* p = std::get_if(&*result); std::cout << *p << std::endl; } } diff --git a/Kernel_23/examples/Kernel_23/intersection_visitor.cpp b/Kernel_23/examples/Kernel_23/intersection_visitor.cpp index ffe5c09c7d89..61d0dbba7e27 100644 --- a/Kernel_23/examples/Kernel_23/intersection_visitor.cpp +++ b/Kernel_23/examples/Kernel_23/intersection_visitor.cpp @@ -28,7 +28,7 @@ int main() const auto result = intersection(seg, lin); if (result) { - boost::apply_visitor(Intersection_visitor(), *result); + std::visit(Intersection_visitor(), *result); } else { // no intersection } diff --git a/Kernel_23/include/CGAL/Kernel/Type_mapper.h b/Kernel_23/include/CGAL/Kernel/Type_mapper.h index a33224fcd59d..af76c7469566 100644 --- a/Kernel_23/include/CGAL/Kernel/Type_mapper.h +++ b/Kernel_23/include/CGAL/Kernel/Type_mapper.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -66,9 +66,9 @@ struct Type_mapper_impl, K1, K2 > { #define CGAL_VARIANT_TYPEMAP(z, n, d) \ template< typename K1, typename K2, BOOST_PP_ENUM_PARAMS(n, class T) > \ -struct Type_mapper_impl, K1, K2> { \ +struct Type_mapper_impl, K1, K2> { \ BOOST_PP_REPEAT(n, CGAL_TYPEMAP_TYPEDEFS, T) \ - typedef boost::variant type; \ + typedef std::variant type; \ }; BOOST_PP_REPEAT_FROM_TO(1, 10, CGAL_VARIANT_TYPEMAP, _) @@ -76,16 +76,6 @@ BOOST_PP_REPEAT_FROM_TO(1, 10, CGAL_VARIANT_TYPEMAP, _) #undef CGAL_TYPEMAP_TYPEDEFS #undef CGAL_VARIANT_TYPEMAP -// CODE_TAG -//template -//struct Type_mapper_impl, K1, K2 > { -// typedef typename boost::make_variant_over< -// typename boost::mpl::transform< -// typename boost::variant::types, -// Type_mapper_impl >::type -// >::type type; -//}; - // Then we specialize for all kernel objects. // More details on why it is like that are here: https://github.com/CGAL/cgal/pull/4878#discussion_r459986501 #define CGAL_Kernel_obj(X) \ diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 29d74179a87c..b60b44a28259 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -1765,7 +1765,7 @@ namespace CommonKernelFunctors { const auto res = typename K::Intersect_3()(l1,l2); CGAL_assertion(res!=std::nullopt); - const Point* e_pt = boost::get(&(*res)); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -2173,7 +2173,7 @@ namespace CommonKernelFunctors { const auto res = typename K::Intersect_3()(plane,line); CGAL_assertion(res!=std::nullopt); - const Point* e_pt = boost::get(&(*res)); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -2186,7 +2186,7 @@ namespace CommonKernelFunctors { const auto res = typename K::Intersect_3()(plane,line); CGAL_assertion(res!=std::nullopt); - const Point* e_pt = boost::get(&(*res)); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -3413,7 +3413,7 @@ namespace CommonKernelFunctors { const Plane_3& plane = circ.supporting_plane(); const auto optional = K().intersect_3_object()(plane, Segment_3(a, b)); CGAL_kernel_assertion_msg(bool(optional) == true, "the segment does not intersect the supporting plane"); - const Point_3* p = boost::get(&*optional); + const Point_3* p = std::get_if(&*optional); CGAL_kernel_assertion_msg(p != 0, "the segment intersection with the plane is not a point"); return squared_distance(circ.center(), *p) < circ.squared_radius(); } @@ -3618,7 +3618,7 @@ namespace CommonKernelFunctors { operator()(const T1& t1, const T2& t2) const { return Intersections::internal::intersection(t1, t2, K() ); } - std::optional > + std::optional > operator()(const Plane_3& pl1, const Plane_3& pl2, const Plane_3& pl3)const { return Intersections::internal::intersection(pl1, pl2, pl3, K() ); } }; diff --git a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h index d1cb83d135de..dd4e24005a48 100644 --- a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h +++ b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_3.h @@ -428,10 +428,10 @@ class Intersect_projected_3 - std::optional< boost::variant > + std::optional< std::variant > operator()(const Segment_3& s1, const Segment_3& s2) const { - typedef boost::variant variant_type; + typedef std::variant variant_type; Point_2 s1_source = project(s1.source()); Point_2 s1_target = project(s1.target()); @@ -450,7 +450,7 @@ class Intersect_projected_3 return std::nullopt; } - if(const Segment_2* si = boost::get(&*o)){ + if(const Segment_2* si = std::get_if(&*o)){ FT src[3],tgt[3]; //the third coordinate is the midpoint between the points on s1 and s2 FT z1 = s1.source()[dim] + ( alpha(si->source(), s1_source, s1_target) * ( s1.target()[dim] - s1.source()[dim] )); @@ -472,7 +472,7 @@ class Intersect_projected_3 } - const Point_2* pi = boost::get(&*o); + const Point_2* pi = std::get_if(&*o); FT coords[3]; //compute the third coordinate of the projected intersection point onto 3D segments FT z1 = s1.source()[dim] + ( alpha(*pi, s1_source, s1_target) * ( s1.target()[dim] - s1.source()[dim] )); diff --git a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h index 873ad1bcb144..089fe5ba6cb0 100644 --- a/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h +++ b/Kernel_23/include/CGAL/Kernel_23/internal/Projection_traits_base_3.h @@ -182,12 +182,12 @@ class Projected_intersect_3 CGAL_TIME_PROFILER("Construct Projected_intersect_3") } - std::optional > + std::optional > operator()(const Segment& s1, const Segment& s2) { CGAL_PROFILER("Projected_intersect_3::operator()") CGAL_TIME_PROFILER("Projected_intersect_3::operator()") - typedef boost::variant variant_type; + typedef std::variant variant_type; const Vector_3 u1 = cross_product(s1.to_vector(), normal); if(u1 == NULL_VECTOR) return K().intersect_3_object()(s1.supporting_line(), s2); @@ -206,7 +206,7 @@ class Projected_intersect_3 #endif return std::nullopt; } - if(const Line* line = boost::get(&*planes_intersection)) + if(const Line* line = std::get_if(&*planes_intersection)) { // check if the intersection line intersects both segments by // checking if a point on the intersection line is between @@ -235,12 +235,12 @@ class Projected_intersect_3 if(! inter){ return std::nullopt; } - if(const Point* point = boost::get(&*inter)){ + if(const Point* point = std::get_if(&*inter)){ return std::make_optional(variant_type(*point)); } } } - if(boost::get(&*planes_intersection)) + if(std::get_if(&*planes_intersection)) { #ifdef CGAL_T2_PTB_3_DEBUG std::cerr << "coplanar supporting lines\n"; diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_depth.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_depth.h index 313d448c8715..b3e519f29792 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_depth.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_depth.h @@ -14,7 +14,7 @@ _test_depth(const R& ) Point_3 m = CGAL::midpoint(p,q); auto result = CGAL::intersection(s0, s1); - const Point_3* ip = boost::get(&*result); + const Point_3* ip = std::get_if(&*result); assert(CGAL::depth(p) == 0); assert(CGAL::depth(q) == 0); diff --git a/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h b/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h index 16448e7eff50..769b4a3d0a2b 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/intersections_d.h @@ -36,7 +36,7 @@ The following table gives the possible values for `Type1` and `Type2`. The return type of intersecting two objects of the types `Type1` and `Type2` can be specified through the placeholder type specifier `auto`. It is equivalent to -`std::optional< boost::variant< T... > >`, the last column in the table providing +`std::optional< std::variant< T... > >`, the last column in the table providing the template parameter pack. @@ -147,7 +147,7 @@ void foo(Segment_d seg, Line_d lin) { // use auto auto result = intersection(seg, lin); - if(result) { boost::apply_visitor(Intersection_visitor(), *result); } + if(result) { std::visit(Intersection_visitor(), *result); } else { // no intersection } } @@ -156,7 +156,7 @@ void foo(Segment_d seg, Line_d lin) \sa `do_intersect` \sa `Kernel_d::Intersect_d` \sa `std::optional` -\sa `boost::variant` +\sa `std::variant` */ decltype(auto) diff --git a/Kernel_d/doc/Kernel_d/Kernel_d.txt b/Kernel_d/doc/Kernel_d/Kernel_d.txt index 1e1e3361096c..ab2154269a8d 100644 --- a/Kernel_d/doc/Kernel_d/Kernel_d.txt +++ b/Kernel_d/doc/Kernel_d/Kernel_d.txt @@ -477,7 +477,7 @@ Intersections on kernel objects currently cover only those objects that are part of flats (`R::Segment_d`, `R::Ray_d`, `R::Line_d`, and `R::Hyperplane_d`). For any pair of objects \f$ o1\f$, \f$ o2\f$ of these types the operation `intersection(o1,o2)` -returns a `std::optional< boost::variant< T... > >` +returns a `std::optional< std::variant< T... > >` where `T...` is a list of all possible resulting geometric objects. The return type of intersecting two objects of the types `Type1` and `Type2` can be @@ -501,10 +501,10 @@ std::cin >> s1 >> s2; auto v = intersection(s1, s2); if (v) { // not empty - if (const Point *p = boost::get(&*v) ) { + if (const Point *p = std::get_if(&*v) ) { // do something with *p } else { - const Segment *s = boost::get(&*v) ) { + const Segment *s = std::get_if(&*v) ) { // do something with *s } } else { diff --git a/Kernel_d/include/CGAL/Kernel_d/function_objects.h b/Kernel_d/include/CGAL/Kernel_d/function_objects.h index 0e073c0272d4..0a20e339cf01 100644 --- a/Kernel_d/include/CGAL/Kernel_d/function_objects.h +++ b/Kernel_d/include/CGAL/Kernel_d/function_objects.h @@ -76,22 +76,22 @@ class Intersect template struct result - { typedef std::optional< boost::variant< Point_d, Line_d > > type; }; + { typedef std::optional< std::variant< Point_d, Line_d > > type; }; template struct result - { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< std::variant< Point_d, Segment_d > > type; }; template struct result : result { }; template struct result - { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< std::variant< Point_d, Segment_d > > type; }; template struct result - { typedef std::optional< boost::variant< Point_d, Ray_d > > type; }; + { typedef std::optional< std::variant< Point_d, Ray_d > > type; }; template struct result : result @@ -99,7 +99,7 @@ class Intersect template struct result - { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< std::variant< Point_d, Segment_d > > type; }; template struct result : result @@ -107,25 +107,25 @@ class Intersect template struct result - { typedef std::optional< boost::variant< Point_d, Segment_d, Ray_d > > type; }; + { typedef std::optional< std::variant< Point_d, Segment_d, Ray_d > > type; }; template struct result - { typedef std::optional< boost::variant< Point_d, Line_d > > type; }; + { typedef std::optional< std::variant< Point_d, Line_d > > type; }; template struct result : result { }; template struct result - { typedef std::optional< boost::variant< Point_d, Ray_d > > type; }; + { typedef std::optional< std::variant< Point_d, Ray_d > > type; }; template struct result : result { }; template struct result - { typedef std::optional< boost::variant< Point_d, Segment_d > > type; }; + { typedef std::optional< std::variant< Point_d, Segment_d > > type; }; template struct result : result { }; diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index 9ca9eb02fa71..53157d070a2f 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -143,7 +143,7 @@ #include #include #include -#include +#include #include // CGAL diff --git a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h index 93b25870c210..5212ed6ea861 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h @@ -53,9 +53,9 @@ Function object that constructs the intersection between a 3D segment and a 3D triangle. Partial model of `::Kernel::Intersect_3`. Provides the operators: -- `std::optional< boost::variant< Point_3, Segment_3 > > operator()(Segment_3 seg, Triangle_3 tr)` +- `std::optional< std::variant< Point_3, Segment_3 > > operator()(Segment_3 seg, Triangle_3 tr)` -- `std::optional< boost::variant< Point_3, Segment_3 > > operator()(Triangle_3 tr, Segment_3 seg)` +- `std::optional< std::variant< Point_3, Segment_3 > > operator()(Triangle_3 tr, Segment_3 seg)` which computes the intersection between the triangle and the segment. */ diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h index 63fcddb7a40c..8958ab919a7c 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h @@ -312,11 +312,11 @@ class MeshTriangulationTraits_3 /*! A constructor object that must provide the function operators: - `std::optional< boost::variant< T... > > operator()(Segment_3 s, Plane_3 p)` + `std::optional< std::variant< T... > > operator()(Segment_3 s, Plane_3 p)` - `std::optional< boost::variant< T... > > operator()(Ray_3 r, Iso_cuboid i)` + `std::optional< std::variant< T... > > operator()(Ray_3 r, Iso_cuboid i)` - `std::optional< boost::variant< T... > > operator()(Segment_3 s, Iso_cuboid i)` + `std::optional< std::variant< T... > > operator()(Segment_3 s, Iso_cuboid i)` which returns the intersection region of two geometrical objects. */ diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index a6fd33ab1eca..7e7f98b86e57 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -1096,7 +1096,7 @@ class Labeled_mesh_domain_3 { const auto clipped = CGAL::intersection(query, r_domain_.bbox_); if(clipped) - if(const Segment_3* s = boost::get(&*clipped)) + if(const Segment_3* s = std::get_if(&*clipped)) return this->operator()(*s); return Surface_patch(); @@ -1224,7 +1224,7 @@ class Labeled_mesh_domain_3 { const auto clipped = CGAL::intersection(query, r_domain_.bbox_); if(clipped) - if(const Segment_3* s = boost::get(&*clipped)) + if(const Segment_3* s = std::get_if(&*clipped)) return this->operator()(*s); return Intersection(); @@ -1259,14 +1259,14 @@ class Labeled_mesh_domain_3 * where lies a vertex with dimension 2 and index `index`. */ Surface_patch_index surface_patch_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /* * Returns the index of the subdomain containing a vertex * with dimension 3 and index `index`. */ Subdomain_index subdomain_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } // ----------------------------------- // Backward Compatibility 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 a35b11727915..344654e42b12 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 @@ -501,7 +501,7 @@ struct Sizing_field_with_aabb_tree const auto int_res = CGAL::intersection(prim.datum(), curr_ortho_plane); if (int_res) { - if (const Point_3* pp = boost::get(&*int_res)) + if (const Point_3* pp = std::get_if(&*int_res)) { FT new_sqd = CGAL::squared_distance(p, *pp); FT dist = CGAL::abs(d_ptr->domain.signed_geodesic_distance(p, *pp, curve_id)); diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 47b9bf495ade..47e8fe5d205e 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -38,7 +38,7 @@ #include #include // for boost::prior and boost::next -#include +#include #include namespace CGAL { @@ -772,22 +772,22 @@ class Mesh_domain_with_polyline_features_3 * where lies a vertex with dimension 2 and index `index`. */ Surface_patch_index surface_patch_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /** * Returns the index of the subdomain containing a vertex * with dimension 3 and index `index`. */ Subdomain_index subdomain_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /// Returns a `Curve_index` from an `Index` Curve_index curve_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /// Returns a `Corner_index` from an `Index` Corner_index corner_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /// @cond DEVELOPERS #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index 66178d3906f1..73430e2aec56 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -536,15 +536,15 @@ class Polyhedral_complex_mesh_domain_3 return std::nullopt; else { for(const Inter_and_prim& i_p: all_intersections) { - if(boost::get( &i_p.first) == 0) return AABB_primitive_id(); + if(std::get_if( &i_p.first) == 0) return AABB_primitive_id(); } auto it = std::min_element (all_intersections.begin(), all_intersections.end(), [p](const Inter_and_prim& a, const Inter_and_prim& b) { - const Point_3& pa = boost::get(a.first); - const Point_3& pb = boost::get(b.first); + const Point_3& pa = std::get(a.first); + const Point_3& pb = std::get(b.first); return compare_distance_to_point(p, pa, pb) == CGAL::SMALLER; }); diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 5ac9a12411a5..417c27777a61 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include @@ -459,7 +459,7 @@ class Polyhedral_mesh_domain_3 // intersection may be either a point or a segment if ( const Bare_point* p_intersect_pt = - boost::get( &(intersection->first) ) ) + std::get_if( &(intersection->first) ) ) { return Intersection(*p_intersect_pt, r_domain_.index_from_surface_patch_index( @@ -467,7 +467,7 @@ class Polyhedral_mesh_domain_3 2); } else if ( const Segment_3* p_intersect_seg = - boost::get(&(intersection->first))) + std::get_if(&(intersection->first))) { CGAL_MESH_3_PROFILER("Mesh_3 profiler: Intersection is a segment"); @@ -533,14 +533,14 @@ class Polyhedral_mesh_domain_3 * where lies a vertex with dimension 2 and index `index`. */ Surface_patch_index surface_patch_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } /** * Returns the index of the subdomain containing a vertex * with dimension 3 and index `index`. */ Subdomain_index subdomain_index(const Index& index) const - { return boost::get(index); } + { return std::get(index); } // ----------------------------------- // Backward Compatibility @@ -607,7 +607,7 @@ class Polyhedral_mesh_domain_3 AABB_tree_* bounding_tree_; // cache queries and intersected primitive - typedef typename boost::make_variant_over::type Cached_query; + typedef typename std::variant::type Cached_query; struct Query_cache { Query_cache() : has_cache(false) {} diff --git a/Mesh_3/test/Mesh_3/test_labeled_mesh_domain_3.cpp b/Mesh_3/test/Mesh_3/test_labeled_mesh_domain_3.cpp index 25a468bbf6f4..e5e5cf7f04fb 100644 --- a/Mesh_3/test/Mesh_3/test_labeled_mesh_domain_3.cpp +++ b/Mesh_3/test/Mesh_3/test_labeled_mesh_domain_3.cpp @@ -205,7 +205,7 @@ struct LM3_tester Intersection i = construct_intersection(s); assert(std::get<0>(i) != Point_3(1., 0., 0.)); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 2); } @@ -213,7 +213,7 @@ struct LM3_tester Segment_3 s(Point_3(1.5, 1.5, 0.), Point_3(1.5, 0., 0.)); Intersection i = construct_intersection(s); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 0); } @@ -222,7 +222,7 @@ struct LM3_tester Intersection i = construct_intersection(r); assert(std::get<0>(i) != Point_3(1., 0., 0.)); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 2); } @@ -230,7 +230,7 @@ struct LM3_tester Ray_3 r(Point_3(1.5, 0., 0.), Vector_3(0., 1., 0.)); Intersection i = construct_intersection(r); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 0); } @@ -239,7 +239,7 @@ struct LM3_tester Intersection i = construct_intersection(l); assert(std::get<0>(i) != Point_3(1., 0., 0.)); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 2); } @@ -247,7 +247,7 @@ struct LM3_tester Line_3 l(Point_3(1.5, 0., 0.), Point_3(1.5, 0.5, 0.)); Intersection i = construct_intersection(l); Index ii = std::get<1>(i); - assert(boost::get(&ii)); + assert(std::get_if(&ii)); assert(std::get<2>(i) == 0); } } diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h index 8db0bd9849af..1cb47858c429 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h @@ -297,10 +297,10 @@ class Arr_labeled_traits_2 : public Traits_ { OutputIterator oi) const { typedef std::pair Intersection_base_point; - typedef boost::variant + typedef std::variant Intersection_base_result; typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; // In case the curves are adjacent in their curve sequence, we do @@ -317,7 +317,7 @@ class Arr_labeled_traits_2 : public Traits_ { // Attach labels to the intersection objects. for (const auto& xection : xections) { const Intersection_base_point* base_pt = - boost::get(&xection); + std::get_if(&xection); if (base_pt != nullptr) { // Attach an invalid label to an itersection point. @@ -327,7 +327,7 @@ class Arr_labeled_traits_2 : public Traits_ { } const Base_x_monotone_curve_2* base_xcv = - boost::get(&xection); + std::get_if(&xection); CGAL_assertion(base_xcv != nullptr); // Attach a merged label to the overlapping curve. diff --git a/Nef_2/include/CGAL/Nef_2/geninfo.h b/Nef_2/include/CGAL/Nef_2/geninfo.h index 41fab418e915..eb723de0fcd7 100644 --- a/Nef_2/include/CGAL/Nef_2/geninfo.h +++ b/Nef_2/include/CGAL/Nef_2/geninfo.h @@ -17,7 +17,7 @@ #define CGAL_DEPRECATED_HEADER "" #define CGAL_DEPRECATED_MESSAGE_DETAILS \ - "Something like std::any or boost::variant should be used instead." + "Something like std::any or std::variant should be used instead." #include #include diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h index 7b944428601c..c35cfd303f5f 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xy_3.h @@ -34,7 +34,7 @@ struct Exact_intersect_xy_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (const Segment_3& s3, const Segment_3& t3) @@ -57,12 +57,12 @@ struct Exact_intersect_xy_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(p2.x(),p2.y(),0))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); @@ -80,7 +80,7 @@ struct Exact_intersect_xy_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; @@ -104,12 +104,12 @@ struct Exact_intersect_xy_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(p2.hx(),p2.hy(),0,p2.hw()))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h index 773295292490..b68849ee87ed 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_xz_3.h @@ -33,7 +33,7 @@ struct Exact_intersect_xz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (const Segment_3& s3, const Segment_3& t3) @@ -56,12 +56,12 @@ struct Exact_intersect_xz_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(p2.x(),0,p2.y()))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); @@ -79,7 +79,7 @@ struct Exact_intersect_xz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; @@ -103,12 +103,12 @@ struct Exact_intersect_xz_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(p2.hx(),0,p2.hy(),p2.hw()))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); diff --git a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h index ac2007ce5565..6b396bf9dd92 100644 --- a/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h +++ b/Nef_3/include/CGAL/Nef_3/Exact_triangulation_euclidean_traits_yz_3.h @@ -34,7 +34,7 @@ struct Exact_intersect_yz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (const Segment_3& s3, const Segment_3& t3) @@ -57,12 +57,12 @@ struct Exact_intersect_yz_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(0,p2.x(),p2.y()))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); @@ -80,7 +80,7 @@ struct Exact_intersect_yz_2 typedef typename R::Point_3 Point_3; typedef typename R::Segment_3 Segment_3; - typedef boost::variant variant_type; + typedef std::variant variant_type; std::optional operator() (Segment_3 s3, Segment_3 t3) { Point_2 p2, q2; @@ -104,12 +104,12 @@ struct Exact_intersect_yz_2 if(! obj){ return std::nullopt; } - if (const Point_2* pi = boost::get(&*obj)) + if (const Point_2* pi = std::get_if(&*obj)) { return std::make_optional(variant_type(Point_3(0,p2.hx(),p2.hy(),p2.hw()))); } - const Segment_2* si = boost::get(&*obj); + const Segment_2* si = std::get_if(&*obj); p2 = si->source(); q2 = si->target(); diff --git a/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h b/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h index 09ed5664c46a..d62b8215cc52 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h @@ -182,7 +182,7 @@ typename typeset_intersection()(obj,*this); } - //TODO: convert boost::variant + //TODO: convert std::variant }; diff --git a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h index fecb03e33a19..979ec116b108 100644 --- a/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h +++ b/Optimal_transportation_reconstruction_2/include/CGAL/OTR_2/Reconstruction_triangulation_2.h @@ -793,7 +793,7 @@ class Reconstruction_triangulation_2 const auto result = intersection(lab, lts); if (result) { - const Point* iq = boost::get(&(*result)); + const Point* iq = std::get_if(&(*result)); if (iq) Dqt = CGAL::approximate_sqrt(geom_traits().compute_squared_distance_2_object()(*iq, pt)); } diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h index 4a644675add6..d46e847a2c09 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h @@ -980,7 +980,7 @@ dump_dummy_points(const std::string filename) const for(; vit!=vend; ++vit) { Index index = c3t3_.index(vit); - const int* i = boost::get(&index); + const int* i = std::get_if(&index); if(i && *i == 0) dummy_out << cp(c3t3_.triangulation().point(vit)) << std::endl; } @@ -994,7 +994,7 @@ try_to_remove_dummy_vertex(const Vertex_handle dummy_vertex) const { // 'dummy_vertex' must correspond to a dummy point CGAL_precondition_code(Index index = c3t3_.index(dummy_vertex);) - CGAL_precondition_code(if(const int* i = boost::get(&index)) {) + CGAL_precondition_code(if(const int* i = std::get_if(&index)) {) CGAL_precondition(*i == 0); CGAL_precondition_code(}) @@ -1340,7 +1340,7 @@ try_to_solve_close_dummy_point(Vertex_handle& protection_vertex, { // dummy_vertex must be a dummy point CGAL_precondition_code(Index index = c3t3_.index(dummy_vertex);) - CGAL_precondition_code(if(const int* i = boost::get(&index)) {) + CGAL_precondition_code(if(const int* i = std::get_if(&index)) {) CGAL_precondition(*i == 0); CGAL_precondition_code(}) @@ -1608,7 +1608,7 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, Vertex_handle v = ch->vertex(li); Index existing_vertex_index = c3t3_.index(v); - const int* i = boost::get(&existing_vertex_index); + const int* i = std::get_if(&existing_vertex_index); if(i && *i == 0) { @@ -1677,7 +1677,7 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, << "at distance: " << sq_d << std::endl; Index nearest_vh_index = c3t3_.index(nearest_vh); - int* i = boost::get(&nearest_vh_index); + int* i = std::get_if(&nearest_vh_index); if(i && *i == 0) std::cerr << "Nearest power vertex is a dummy point" << std::endl; #endif @@ -1745,7 +1745,7 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, #ifdef CGAL_PERIODIC_PROTECTION_ATTEMPT_TO_REMOVE_DUMMY_PTS Index v_index = c3t3_.index(v); - const int* id = boost::get(&v_index); + const int* id = std::get_if(&v_index); bool is_v_dummy_vertex(id && *id == 0); #endif @@ -1792,7 +1792,7 @@ smart_insert_point(const Bare_point& p, Weight w, int dim, const Index& index, << c3t3_.triangulation().point(nearest_vertex) << ")\n"; Index nearest_vertex_index = c3t3_.index(nearest_vertex); - i = boost::get(&nearest_vertex_index); + i = std::get_if(&nearest_vertex_index); if(i && *i == 0) std::cerr << "reduced due to dummy" << std::endl; #endif diff --git a/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h b/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h index 5197b36d7522..0e907a9b3740 100644 --- a/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h +++ b/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h @@ -69,7 +69,7 @@ void find_points_to_project(C3T3& c3t3, OutputIterator vertices) Vertex_handle v = c->vertex((ind+i)&3); typename C3T3::Index index = c3t3.index(v); - if(const int* i = boost::get(&index)) + if(const int* i = std::get_if(&index)) { if(*i == 0) // '0' is the index of dummies *vertices++ = v; diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h index 36cfbb488e98..97fc3e0d06ad 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h @@ -77,12 +77,12 @@ namespace Qt { using Base::operator <<; PainterOstream& operator << (Hyperbolic_segment_2 s) { - if(const Euclidean_segment_2* seg = boost::get(&s)) { + if(const Euclidean_segment_2* seg = std::get_if(&s)) { CGAL::Qt::PainterOstream::operator << (*seg); return *this; } - Circular_arc_2* arc = boost::get(&s); + Circular_arc_2* arc = std::get_if(&s); if(arc->squared_radius() > 100) { Euclidean_segment_2 seg(arc->source(), arc->target()); diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_free_motion_animation.h b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_free_motion_animation.h index 5651f2c614a9..80f9808370b1 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_free_motion_animation.h +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_free_motion_animation.h @@ -28,7 +28,7 @@ MainWindow::initialize_animation_parameters() { source = Point(rx1, ry1); target = Point(rx2, ry2); Segment_2 seg = Construct_hyperbolic_segment_2()(source, target); - Circular_arc_2* carc = boost::get(&seg); + Circular_arc_2* carc = std::get_if(&seg); source = carc->source(); target = carc->target(); @@ -118,7 +118,7 @@ Point MainWindow::get_image(Point src, Point tgt, double time) { //std::cout << " ..getting image "; std::cout.flush(); Segment_2 seg = Construct_hyperbolic_segment_2()(src, tgt); - Circular_arc_2* carc = boost::get(&seg); + Circular_arc_2* carc = std::get_if(&seg); Circle_2 crc = carc->supporting_circle(); double sx = CGAL::to_double(((src.x()) - crc.center().x())/sqrt(crc.squared_radius())); @@ -233,7 +233,7 @@ MainWindow::animate() { // Correct in case of wrong orientation. //std::cout << " ..making line..." << std::endl; Segment_2 seg = Construct_hyperbolic_segment_2()(source, target); - Circular_arc_2* carc = boost::get(&seg); + Circular_arc_2* carc = std::get_if(&seg); std::pair inters = Construct_inexact_intersection_2()(carc->supporting_circle(), poincare); if(squared_distance(source, inters.first) < squared_distance(source, inters.second)) { source = inters.first; diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h index 8304f78bf989..9c89cc574d08 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include @@ -371,9 +371,9 @@ class Compute_approximate_hyperbolic_diameter Hyperbolic_point_2 operator()(const Hyperbolic_segment_2& s1, const Hyperbolic_segment_2& s2) { - if(Circular_arc_2* c1 = boost::get(&s1)) + if(Circular_arc_2* c1 = std::get_if(&s1)) { - if(Circular_arc_2* c2 = boost::get(&s2)) + if(Circular_arc_2* c2 = std::get_if(&s2)) { std::pair res = operator()(c1->circle(), c2->circle()); @@ -387,7 +387,7 @@ class Compute_approximate_hyperbolic_diameter } else { - Euclidean_segment_2* ell2 = boost::get(&s2); + Euclidean_segment_2* ell2 = std::get_if(&s2); std::pair res = operator()(c1->circle(), ell2->supporting_line()); Hyperbolic_point_2 p1 = res.first; @@ -401,8 +401,8 @@ class Compute_approximate_hyperbolic_diameter } else { - Euclidean_segment_2* ell1 = boost::get(&s1); - if(Circular_arc_2* c2 = boost::get(&s2)) + Euclidean_segment_2* ell1 = std::get_if(&s1); + if(Circular_arc_2* c2 = std::get_if(&s2)) { std::pair res = operator()(ell1->supporting_line(), c2->circle()); @@ -416,7 +416,7 @@ class Compute_approximate_hyperbolic_diameter } else { - Euclidean_segment_2* ell2 = boost::get(&s2); + Euclidean_segment_2* ell2 = std::get_if(&s2); Hyperbolic_point_2 p1 = operator()(ell1->supporting_line(), ell2->supporting_line()); CGAL_assertion(p1.x()*p1.x() + p1.y()*p1.y()) < FT(1); return p1; @@ -465,9 +465,9 @@ class Compute_approximate_hyperbolic_diameter Euclidean_line_2* l; Circle_2* c; - if(Circle_2* c_pq = boost::get(&bis_pq)) + if(Circle_2* c_pq = std::get_if(&bis_pq)) { - if(Circle_2* c_qr = boost::get(&bis_qr)) + if(Circle_2* c_qr = std::get_if(&bis_qr)) { std::pair inters = _gt.construct_inexact_intersection_2_object()(*c_pq, *c_qr); @@ -477,14 +477,14 @@ class Compute_approximate_hyperbolic_diameter return inters.second; } // here bis_qr is a line - l = boost::get(&bis_qr); + l = std::get_if(&bis_qr); c = c_pq; } else { // here bis_pq is a line - l = boost::get(&bis_pq); - c = boost::get(&bis_qr); + l = std::get_if(&bis_pq); + c = std::get_if(&bis_qr); } std::pair inters = _gt.construct_inexact_intersection_2_object()(*c, *l); diff --git a/Point_set_processing_3/include/CGAL/structure_point_set.h b/Point_set_processing_3/include/CGAL/structure_point_set.h index 335ba8226471..59fba116ed9a 100644 --- a/Point_set_processing_3/include/CGAL/structure_point_set.h +++ b/Point_set_processing_3/include/CGAL/structure_point_set.h @@ -58,8 +58,8 @@ is a vertex). The implementation follow \cgalCite{cgal:la-srpss-13}. \tparam Kernel a model of `EfficientRANSACTraits` that must provide in addition a function `Intersect_3 intersection_3_object() const` and a functor `Intersect_3` with: -- `std::optional< boost::variant< Traits::Plane_3, Traits::Line_3 > > operator()(typename Traits::Plane_3, typename Traits::Plane_3)` -- `std::optional< boost::variant< Traits::Line_3, Traits::Point_3 > > operator()(typename Traits::Line_3, typename Traits::Plane_3)` +- `std::optional< std::variant< Traits::Plane_3, Traits::Line_3 > > operator()(typename Traits::Plane_3, typename Traits::Plane_3)` +- `std::optional< std::variant< Traits::Line_3, Traits::Point_3 > > operator()(typename Traits::Line_3, typename Traits::Plane_3)` */ template @@ -808,7 +808,7 @@ class Point_set_with_structure continue; } - if (const Line* l = boost::get(&*result)) + if (const Line* l = std::get_if(&*result)) m_edges[i].support = *l; else { @@ -1029,7 +1029,7 @@ class Point_set_with_structure auto result = CGAL::intersection (plane1, ortho); if (result) { - if (const Line* l = boost::get(&*result)) + if (const Line* l = std::get_if(&*result)) { if (!(pts1.empty())) { @@ -1066,7 +1066,7 @@ class Point_set_with_structure result = CGAL::intersection (plane2,ortho); if (result) { - if (const Line* l = boost::get(&*result)) + if (const Line* l = std::get_if(&*result)) { if (!(pts2.empty())) { @@ -1193,12 +1193,12 @@ class Point_set_with_structure const auto result = CGAL::intersection(plane1, plane2); if (result) { - if (const Line* l = boost::get(&*result)) + if (const Line* l = std::get_if(&*result)) { const auto result2 = CGAL::intersection(*l, plane3); if (result2) { - if (const Point* p = boost::get(&*result2)) + if (const Point* p = std::get_if(&*result2)) m_corners[i].support = *p; else { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h index 468acfaf5b47..9c32aa05b3a5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h @@ -268,7 +268,7 @@ class Intersection_nodes(&(*inter_res)); + std::get_if(&(*inter_res)); CGAL_assertion(pt!=nullptr); add_new_node(*pt); } @@ -389,7 +389,7 @@ class Intersection_nodes(&(*inter_res)); + std::get_if(&(*inter_res)); CGAL_assertion(pt!=nullptr); add_new_node(*pt); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h index 92c5871d2909..99483e93abce 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Polygon_mesh_slicer/Axis_parallel_plane_traits.h @@ -15,7 +15,7 @@ #include #include -#include +#include #ifndef CGAL_INTERNAL_POLYGON_MESH_SLICER_AXIS_PARALLEL_PLANE_TRAITS_H @@ -95,7 +95,7 @@ class Axis_parallel_plane_traits const typename Traits::Construct_source_3 m_source_3; const typename Traits::Construct_target_3 m_target_3; - typedef boost::variant Variant_type; + typedef std::variant Variant_type; typedef std::optional< Variant_type > result_type; Intersect_3(const Axis_parallel_plane_traits& traits) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 090f0c775e2d..670556ecec4a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -31,7 +31,7 @@ #include #include -#include +#include #include #include @@ -95,7 +95,7 @@ struct Location_traits /// /// A variant used in the function `get_descriptor_from_location()`. template -using descriptor_variant = boost::variant::vertex_descriptor, +using descriptor_variant = std::variant::vertex_descriptor, typename boost::graph_traits::halfedge_descriptor, typename boost::graph_traits::face_descriptor>; @@ -149,13 +149,13 @@ incident_faces(const std::pair::face_ const descriptor_variant dv = get_descriptor_from_location(location, tm); - if(const vertex_descriptor* vd_ptr = boost::get(&dv)) + if(const vertex_descriptor* vd_ptr = std::get_if(&dv)) { const vertex_descriptor vd = *vd_ptr; for(face_descriptor fd : faces_around_target(halfedge(vd, tm), tm)) *out++ = fd; } - else if(const halfedge_descriptor* hd_ptr = boost::get(&dv)) + else if(const halfedge_descriptor* hd_ptr = std::get_if(&dv)) { const halfedge_descriptor hd = *hd_ptr; *out++ = face(hd, tm); @@ -163,7 +163,7 @@ incident_faces(const std::pair::face_ } else { - const face_descriptor fd = boost::get(dv); + const face_descriptor fd = std::get(dv); *out++ = fd; } @@ -664,7 +664,7 @@ is_on_vertex(const std::pair::face_de const descriptor_variant dv = get_descriptor_from_location(loc, tm); - if(const vertex_descriptor* vd_ptr = boost::get(&dv)) + if(const vertex_descriptor* vd_ptr = std::get_if(&dv)) return (vd == *vd_ptr); return false; @@ -709,9 +709,9 @@ is_on_halfedge(const std::pair::face_ const descriptor_variant dv = get_descriptor_from_location(loc, tm); - if(const vertex_descriptor* vd_ptr = boost::get(&dv)) + if(const vertex_descriptor* vd_ptr = std::get_if(&dv)) return (*vd_ptr == source(hd, tm) || *vd_ptr == target(hd, tm)); - else if(const halfedge_descriptor* hd_ptr = boost::get(&dv)) + else if(const halfedge_descriptor* hd_ptr = std::get_if(&dv)) return (*hd_ptr == hd); return false; @@ -1193,14 +1193,14 @@ locate_in_adjacent_face(const std::pair loc_in_fd = std::make_pair(fd, CGAL::make_array(FT(0), FT(0), FT(0))); const descriptor_variant dv = get_descriptor_from_location(loc, tm); - if(const vertex_descriptor* vd_ptr = boost::get(&dv)) + if(const vertex_descriptor* vd_ptr = std::get_if(&dv)) { int index_of_vd = vertex_index_in_face(*vd_ptr, fd, tm); loc_in_fd.second[index_of_vd] = FT(1); // Note that the barycentric coordinates were initialized to 0, // so the second and third coordinates are already set up properly. } - else if(const halfedge_descriptor* hd_ptr = boost::get(&dv)) + else if(const halfedge_descriptor* hd_ptr = std::get_if(&dv)) { // Note that, here, we know that we are _not_ on a vertex const halfedge_descriptor hd = *hd_ptr; @@ -1225,7 +1225,7 @@ locate_in_adjacent_face(const std::pair(dv);) + CGAL_assertion_code(const face_descriptor fd2 = std::get(dv);) CGAL_assertion(fd2 != boost::graph_traits::null_face()); CGAL_assertion(fd2 != fd); @@ -1264,7 +1264,7 @@ locate_in_common_face(std::pair::face bool is_query_location_in_face = false; - if(const vertex_descriptor* vd_ptr = boost::get(&dv)) + if(const vertex_descriptor* vd_ptr = std::get_if(&dv)) { const vertex_descriptor vd = *vd_ptr; halfedge_descriptor hd = halfedge(vd, tm); @@ -1284,7 +1284,7 @@ locate_in_common_face(std::pair::face break; } } - else if(const halfedge_descriptor* hd_ptr = boost::get(&dv)) + else if(const halfedge_descriptor* hd_ptr = std::get_if(&dv)) { const halfedge_descriptor hd = *hd_ptr; if(!is_border(hd, tm)) @@ -1304,7 +1304,7 @@ locate_in_common_face(std::pair::face } else { - const face_descriptor fd = boost::get(dv); + const face_descriptor fd = std::get(dv); CGAL_precondition(fd != boost::graph_traits::null_face()); query_location = locate_in_face(query, fd, tm, np); @@ -1866,7 +1866,7 @@ locate_with_AABB_tree(const typename internal::Location_traits(&(intersections[i]->first)); + Point_3* intersection_point = std::get_if(&(intersections[i]->first)); if(intersection_point) { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h index 56733b660fdd..f1b88540a606 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include @@ -102,7 +102,7 @@ class Polygon_mesh_slicer typedef typename Traits::FT FT; /// typedefs for internal graph to get connectivity of the polylines - typedef boost::variant AL_vertex_info; + typedef std::variant AL_vertex_info; typedef boost::adjacency_list < boost::vecS, boost::vecS, @@ -181,9 +181,9 @@ class Polygon_mesh_slicer AL_vertex_info v1 = al_graph[nodes_for_orient.first]; AL_vertex_info v2 = al_graph[nodes_for_orient.second]; - if (const vertex_descriptor* vd1_ptr = boost::get(&v1) ) + if (const vertex_descriptor* vd1_ptr = std::get_if(&v1) ) { - if (const vertex_descriptor* vd2_ptr = boost::get(&v2) ) + if (const vertex_descriptor* vd2_ptr = std::get_if(&v2) ) { CGAL_assertion( halfedge(*vd1_ptr, *vd2_ptr, m_tmesh).second ); halfedge_descriptor h_opp = halfedge(*vd1_ptr, *vd2_ptr, m_tmesh).first; @@ -207,7 +207,7 @@ class Polygon_mesh_slicer else { // e2 is intersected in its interior - edge_descriptor e2 = boost::get(v2); + edge_descriptor e2 = std::get(v2); halfedge_descriptor h2 = halfedge(e2, m_tmesh); if ( target(next(h2, m_tmesh), m_tmesh) != *vd1_ptr ) h2=opposite(h2, m_tmesh); @@ -216,9 +216,9 @@ class Polygon_mesh_slicer } else { - edge_descriptor e1 = boost::get(v1); + edge_descriptor e1 = std::get(v1); halfedge_descriptor h1 = halfedge(e1, m_tmesh); - if (const vertex_descriptor* vd2_ptr = boost::get(&v2) ) + if (const vertex_descriptor* vd2_ptr = std::get_if(&v2) ) { // e1 is intersected in its interior if ( target(next(h1, m_tmesh), m_tmesh) != *vd2_ptr ) @@ -228,7 +228,7 @@ class Polygon_mesh_slicer else { // intersection in the interior of both edges - edge_descriptor e2 = boost::get(v2); + edge_descriptor e2 = std::get(v2); halfedge_descriptor h2 = halfedge(e2, m_tmesh); if ( face(h1, m_tmesh) != face(h2,m_tmesh) ) { @@ -265,20 +265,20 @@ class Polygon_mesh_slicer nodes_for_orient.second=node_id; AL_vertex_info v = al_graph[node_id]; - if (const vertex_descriptor* vd_ptr = boost::get(&v) ) + if (const vertex_descriptor* vd_ptr = std::get_if(&v) ) { current_poly.push_back( get(m_vpmap, *vd_ptr) ); } else { - edge_descriptor ed = boost::get(v); + edge_descriptor ed = std::get(v); Segment_3 s( get(m_vpmap, source(ed, m_tmesh)), get(m_vpmap,target(ed, m_tmesh)) ); const auto inter = intersect_3(m_plane, s); CGAL_assertion(inter != std::nullopt); - const Point_3* pt_ptr = boost::get(&(*inter)); + const Point_3* pt_ptr = std::get_if(&(*inter)); current_poly.push_back( *pt_ptr ); } } diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp index 17b357660082..93e4b9eded25 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp @@ -209,19 +209,19 @@ void test_constructions(const G& g, // --------------------------------------------------------------------------- loc = std::make_pair(f, CGAL::make_array(FT(0.3), FT(0.4), FT(0.3))); descriptor_variant dv = PMP::get_descriptor_from_location(loc, g); - const face_descriptor* fd = boost::get(&dv); + const face_descriptor* fd = std::get_if(&dv); assert(fd); loc = std::make_pair(f, CGAL::make_array(FT(0.5), FT(0.5), FT(0))); dv = PMP::get_descriptor_from_location(loc, g); - const halfedge_descriptor* hd = boost::get(&dv); + const halfedge_descriptor* hd = std::get_if(&dv); assert(hd); loc = std::make_pair(f, CGAL::make_array(FT(1), FT(0), FT(0))); assert(PMP::is_on_vertex(loc, source(halfedge(f, g), g), g)); dv = PMP::get_descriptor_from_location(loc, g); - if(const vertex_descriptor* v = boost::get(&dv)) { } else { assert(false); } + if(const vertex_descriptor* v = std::get_if(&dv)) { } else { assert(false); } // --------------------------------------------------------------------------- // just to check the API diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp index 7a889e4da14d..c83911ea93f1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/C3t3_io_plugin.cpp @@ -265,7 +265,7 @@ struct Fake_mesh_domain { typedef std::pair Surface_patch_index; typedef int Curve_index; typedef int Corner_index; - typedef boost::variant Index; + typedef std::variant Index; }; typedef Geom_traits Fake_gt; @@ -417,12 +417,12 @@ struct Update_vertex case 2: { const typename V1::Index& index = v1.index(); - const Sp_index sp_index = boost::get(index); + const Sp_index sp_index = std::get(index); v2.set_index((std::max)(sp_index.first, sp_index.second)); } break; default:// -1, 0, 1, 3 - v2.set_index(boost::get(v1.index())); + v2.set_index(std::get(v1.index())); } return true; } 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 da298acf6ff7..cb10a9a806a1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -231,7 +231,7 @@ public Q_SLOTS: IMAGE_MESH_ITEMS, IMPLICIT_MESH_ITEMS }; - mutable std::optional> items; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp index b39fd8b8f0a5..036cdc430261 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Surface_intersection_plugin.cpp @@ -216,13 +216,13 @@ void Polyhedron_demo_intersection_plugin::intersectionPolylines() CGAL::cpp11::result_of::type result = CGAL::intersection(segA, segB); if (result) { - if (const Kernel::Segment_3* s = boost::get(&*result)) { + if (const Kernel::Segment_3* s = std::get_if(&*result)) { Polyline_3 p; p.push_back(s->point(0)); p.push_back(s->point(1)); new_pol_item->polylines.push_back(p); } else { - const Kernel::Point_3* p = boost::get(&*result); + const Kernel::Point_3* p = std::get_if(&*result); new_point_item->point_set()->insert(*p); } } @@ -326,13 +326,13 @@ void Polyhedron_demo_intersection_plugin::intersectionSurfacePolyline() CGAL::cpp11::result_of::type result = CGAL::intersection(triangle, segment); if (result) { - if (const Kernel::Segment_3* s = boost::get(&*result)) { + if (const Kernel::Segment_3* s = std::get_if(&*result)) { Polyline_3 p; p.push_back(s->point(0)); p.push_back(s->point(1)); new_pol_item->polylines.push_back(p); } else { - const Kernel::Point_3* p = boost::get(&*result); + const Kernel::Point_3* p = std::get_if(&*result); new_point_item->point_set()->insert(*p); } } diff --git a/Polyhedron/demo/Polyhedron/Scene.h b/Polyhedron/demo/Polyhedron/Scene.h index b661ed7baa83..af6a0b55f0ec 100644 --- a/Polyhedron/demo/Polyhedron/Scene.h +++ b/Polyhedron/demo/Polyhedron/Scene.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include class QEvent; class QMouseEvent; diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 75db7480aaa0..c1b8d2a46193 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -1214,7 +1214,7 @@ Scene_surface_mesh_item::select(double orig_x, { const EPICK::Point_3* closest_point = - boost::get(&(closest->first)); + std::get_if(&(closest->first)); for(Intersections::iterator it = boost::next(intersections.begin()), end = intersections.end(); @@ -1225,7 +1225,7 @@ Scene_surface_mesh_item::select(double orig_x, } else { const EPICK::Point_3* it_point = - boost::get(&it->first); + std::get_if(&it->first); if(it_point && (ray_dir * (*it_point - *closest_point)) < 0) { @@ -1923,7 +1923,7 @@ void Scene_surface_mesh_item::zoomToPosition(const QPoint &point, CGAL::Three::V if(!intersections.empty()) { Intersections::iterator closest = intersections.begin(); const EPICK::Point_3* closest_point = - boost::get(&closest->first); + std::get_if(&closest->first); for(Intersections::iterator it = boost::next(intersections.begin()), end = intersections.end(); @@ -1934,7 +1934,7 @@ void Scene_surface_mesh_item::zoomToPosition(const QPoint &point, CGAL::Three::V } else { const EPICK::Point_3* it_point = - boost::get(&it->first); + std::get_if(&it->first); if(it_point && (ray_dir * (*it_point - *closest_point)) < 0) { diff --git a/Polyhedron/demo/Polyhedron/include/id_printing.h b/Polyhedron/demo/Polyhedron/include/id_printing.h index 46d142a24bb0..89276883dc36 100644 --- a/Polyhedron/demo/Polyhedron/include/id_printing.h +++ b/Polyhedron/demo/Polyhedron/include/id_printing.h @@ -153,7 +153,7 @@ bool find_primitive_id(const QPoint& point, return false; typename Intersections::iterator closest = intersections.begin(); const Point* closest_point = - boost::get(&closest->first); + std::get_if(&closest->first); for(typename Intersections::iterator it = boost::next(intersections.begin()), end = intersections.end(); @@ -164,7 +164,7 @@ bool find_primitive_id(const QPoint& point, } else { const Point* it_point = - boost::get(&it->first); + std::get_if(&it->first); if(it_point && (ray_dir * (*it_point - *closest_point)) < 0) { diff --git a/SMDS_3/include/CGAL/IO/output_to_vtu.h b/SMDS_3/include/CGAL/IO/output_to_vtu.h index e78f1b680a24..37cd018570f8 100644 --- a/SMDS_3/include/CGAL/IO/output_to_vtu.h +++ b/SMDS_3/include/CGAL/IO/output_to_vtu.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include @@ -273,7 +273,7 @@ enum VTU_ATTRIBUTE_TYPE{ SIZE_TYPE }; -typedef boost::variant*, const std::vector*, const std::vector* > Vtu_attributes; +typedef std::variant*, const std::vector*, const std::vector* > Vtu_attributes; template void output_to_vtu_with_attributes(std::ostream& os, @@ -316,13 +316,13 @@ void output_to_vtu_with_attributes(std::ostream& os, { switch(attributes[i].second.which()){ case 0: - write_attribute_tag(os,attributes[i].first, *boost::get* >(attributes[i].second), binary,offset); + write_attribute_tag(os,attributes[i].first, *std::get* >(attributes[i].second), binary,offset); break; case 1: - write_attribute_tag(os,attributes[i].first, *boost::get* >(attributes[i].second), binary,offset); + write_attribute_tag(os,attributes[i].first, *std::get* >(attributes[i].second), binary,offset); break; default: - write_attribute_tag(os,attributes[i].first, *boost::get* >(attributes[i].second), binary,offset); + write_attribute_tag(os,attributes[i].first, *std::get* >(attributes[i].second), binary,offset); break; } } @@ -336,13 +336,13 @@ void output_to_vtu_with_attributes(std::ostream& os, for(std::size_t i = 0; i< attributes.size(); ++i) switch(attributes[i].second.which()){ case 0: - write_attributes(os, *boost::get* >(attributes[i].second)); + write_attributes(os, *std::get* >(attributes[i].second)); break; case 1: - write_attributes(os, *boost::get* >(attributes[i].second)); + write_attributes(os, *std::get* >(attributes[i].second)); break; default: - write_attributes(os, *boost::get* >(attributes[i].second)); + write_attributes(os, *std::get* >(attributes[i].second)); break; } } diff --git a/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h b/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h index cd3c8f135a9d..977909a463d1 100644 --- a/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h +++ b/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h @@ -21,7 +21,7 @@ #include #include #include -#include +#include namespace CGAL { template <> @@ -52,19 +52,19 @@ class Output_rep > : public IO_rep_is_specialized { }; template <> -class Output_rep > > : public IO_rep_is_specialized { - typedef boost::variant > Variant; + typedef std::variant > Variant; const Variant& v; public: Output_rep(const Variant& v) : v(v) {} std::ostream& operator()( std::ostream& out) const { if(v.which() == 1) { - out << IO::oformat(boost::get >(v)); + out << IO::oformat(std::get >(v)); } else { - out << boost::get(v); + out << std::get(v); } return out; } diff --git a/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h b/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h index 0e4e8901ce57..5ea95241e696 100644 --- a/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h +++ b/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h @@ -23,7 +23,6 @@ #include #include -#include #include #include @@ -36,12 +35,12 @@ namespace internal { // ----------------------------------- // Index_generator -// Don't use boost::variant if types are the same type +// Don't use std::variant if types are the same type // ----------------------------------- template < typename Subdomain_index, typename Surface_patch_index > struct Index_generator { - typedef boost::variant Index; + typedef std::variant Index; typedef Index type; }; @@ -72,19 +71,19 @@ struct Indices_tuple_generator template using Indices_tuple_t = typename Indices_tuple_generator::type; -// Nasty meta-programming to get a boost::variant of four types that +// Nasty meta-programming to get a std::variant of four types that // may not be all different. template struct seq1 { typedef T0 type; }; template struct seq2 { - typedef boost::variant type; + typedef std::variant type; }; template struct seq3 { - typedef boost::variant type; + typedef std::variant type; }; template struct seq4 { - typedef boost::variant type; + typedef std::variant type; }; template struct insert; @@ -145,7 +144,7 @@ struct Index_generator_with_features template const T& get_index(const Boost_variant& x, std::enable_if_t::value > * = 0) -{ return boost::get(x); } +{ return std::get(x); } template const T& get_index(const T& x) { return x; } @@ -305,8 +304,8 @@ struct Variant_read_visitor { }; template -struct Read_write_index> { - using Index = boost::variant; +struct Read_write_index> { + using Index = std::variant; using index_seq = std::make_index_sequence::value>; template @@ -317,12 +316,12 @@ struct Read_write_index> { void operator()(std::ostream& os, int, Index index) const { Variant_write_visitor visitor{os}; - apply_visitor(visitor, index); + std::visit(visitor, index); } Index operator()(std::istream& is, int dimension) const { Index index = get_index(dimension, index_seq{}); Variant_read_visitor visitor{is, index}; - apply_visitor(visitor, index); + std::visit(visitor, index); return index; } }; diff --git a/SMDS_3/include/CGAL/SMDS_3/io_signature.h b/SMDS_3/include/CGAL/SMDS_3/io_signature.h index ba50d850123c..22022ba6051f 100644 --- a/SMDS_3/include/CGAL/SMDS_3/io_signature.h +++ b/SMDS_3/include/CGAL/SMDS_3/io_signature.h @@ -33,7 +33,7 @@ #include #endif -#include +#include #include #include @@ -149,10 +149,10 @@ struct Get_io_signature }; template -struct Get_io_signature > +struct Get_io_signature > { std::string operator()() { - return std::string("boost::variant<") + + return std::string("std::variant<") + Get_io_signature()() + "," + Get_io_signature()() + ">"; } @@ -179,10 +179,10 @@ struct Get_io_signature > }; template -struct Get_io_signature > +struct Get_io_signature > { std::string operator()() { - return std::string("boost::variant<") + + return std::string("std::variant<") + Get_io_signature()() + "," + Get_io_signature()() + "," + Get_io_signature()() + ">"; @@ -191,10 +191,10 @@ struct Get_io_signature > template -struct Get_io_signature > +struct Get_io_signature > { std::string operator()() { - return std::string("boost::variant<") + + return std::string("std::variant<") + Get_io_signature()() + "," + Get_io_signature()() + "," + Get_io_signature()() + "," + diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index 3f1a9c92d428..04b6f19af185 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -28,7 +28,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -53,7 +53,7 @@ private : using Vertex_handle = typename Vb::Vertex_handle; // Types - using Index = boost::variant; + using Index = std::variant; using FT = typename GT::FT; // Constructor diff --git a/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.cgal b/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.cgal index f0c10161e35f..e32557d8173d 100644 --- a/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.cgal +++ b/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.cgal @@ -1,4 +1,4 @@ -CGAL c3t3 Triangulation_3(Weighted_point,Vb(Tvb_3+i+boost::variant,i,d>),Cb(enum+RTcb_3+(std::pair)[4])) +CGAL c3t3 Triangulation_3(Weighted_point,Vb(Tvb_3+i+std::variant,i,d>),Cb(enum+RTcb_3+(std::pair)[4])) 3 6 10 11 12 0 0 7 diff --git a/SMDS_3/test/SMDS_3/test_c3t3_io.cpp b/SMDS_3/test/SMDS_3/test_c3t3_io.cpp index ef8d9e16d7a4..7105303ee34e 100644 --- a/SMDS_3/test/SMDS_3/test_c3t3_io.cpp +++ b/SMDS_3/test/SMDS_3/test_c3t3_io.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include @@ -48,7 +48,7 @@ struct MD_heterogeneous_types { typedef std::pair Surface_patch_index; typedef int Curve_index; typedef double Corner_index; - typedef boost::variant Index; @@ -63,7 +63,7 @@ struct MD_heterogeneous_types { static std::string reference_format_string() { - return "Triangulation_3(Weighted_point,Vb(Tvb_3+i+boost::variant,i,d>),Cb(enum+RTcb_3+(std::pair)[4]))"; + return "Triangulation_3(Weighted_point,Vb(Tvb_3+i+std::variant,i,d>),Cb(enum+RTcb_3+(std::pair)[4]))"; } }; diff --git a/STL_Extension/doc/STL_Extension/CGAL/Object.h b/STL_Extension/doc/STL_Extension/CGAL/Object.h index 7a329af795f8..4c8439359962 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Object.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Object.h @@ -110,16 +110,16 @@ Object(const Object &o); /*! Implicit converting constructor for compatibility with -`boost::variant`. +`std::variant`. */ -Object(boost::variant); +Object(std::variant); /*! Implicit converting constructor for compatibility with -`std::optional` and `boost::variant`. +`std::optional` and `std::variant`. */ -Object(std::optional< boost::variant >); +Object(std::optional< std::variant >); /// @} diff --git a/STL_Extension/doc/STL_Extension/CGAL/iterator.h b/STL_Extension/doc/STL_Extension/CGAL/iterator.h index 5e1e1acce56a..2ba1736893dd 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/iterator.h +++ b/STL_Extension/doc/STL_Extension/CGAL/iterator.h @@ -106,8 +106,8 @@ The class `Dispatch_or_drop_output_iterator` defines an `OutputIterator` that contains a tuple of output iterators, and dispatches among those based on the type of the value type which is put in it. Besides defining assignment for all parameters of `V` -and for a tuple of type `V`, it is also defined for the types `boost::variant` and -`std::optional >`, where `T...` +and for a tuple of type `V`, it is also defined for the types `std::variant` and +`std::optional >`, where `T...` must be a subset of the parameters of `V`. Should the `std::optional` be empty, it will be discarded. @@ -194,8 +194,8 @@ dispatches among those based on the type of the value type which is put in it. Other types are also accepted, and the object is discarded in this case. Besides defining assignment for all parameters of `V` and for a tuple of type `V`, it is also defined for the types -`boost::variant` and -`std::optional >`, where `T...` +`std::variant` and +`std::optional >`, where `T...` can be a list of arbitrary types. It also inherits from `O`, which makes it easy to treat like a diff --git a/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp b/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp index 44ff692c7885..89abf64fbcc8 100644 --- a/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp +++ b/STL_Extension/examples/STL_Extension/Dispatch_output_iterator.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include int main() @@ -21,7 +21,7 @@ int main() std::back_inserter(b), std::back_inserter(c)); - typedef boost::variant var; + typedef std::variant var; var va = 23; var vb = 4.2; var vc = 'x'; // goes to a diff --git a/STL_Extension/include/CGAL/Object.h b/STL_Extension/include/CGAL/Object.h index 24d6ecc1b127..7b6bdc37bba2 100644 --- a/STL_Extension/include/CGAL/Object.h +++ b/STL_Extension/include/CGAL/Object.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include #include @@ -39,7 +39,7 @@ class Object std::shared_ptr obj; // returns an any pointer from a variant - struct Any_from_variant : public boost::static_visitor { + struct Any_from_variant { template std::any* operator()(const T& t) const { return new std::any(t); @@ -64,14 +64,14 @@ class Object Object(T && t, private_tag) : obj(new std::any(std::forward(t))) { } // implicit constructor from optionals containing variants - template - Object(const std::optional< boost::variant >& t) - : obj( t ? boost::apply_visitor(Any_from_variant(), *t) : nullptr) { } + template + Object(const std::optional< std::variant >& t) + : obj( t ? std::visit(Any_from_variant(), *t) : nullptr) { } // implicit constructor from variants - template - Object(const boost::variant& v) - : obj(boost::apply_visitor(Any_from_variant(), v)) { } + template + Object(const std::variant& v) + : obj(std::visit(Any_from_variant(), v)) { } template bool assign(T &t) const diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index 4928d3d519fb..95295f89f836 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include @@ -1262,7 +1262,7 @@ filter_output_iterator(I e, const P& p) namespace internal { template -struct Output_visitor : boost::static_visitor { +struct Output_visitor { Output_visitor(OutputIterator* it) : out(it) {} OutputIterator* out; @@ -1380,17 +1380,17 @@ class Dispatch_output_iterator < std::tuple, std::tuple > return *this; } - template - Self& operator=(const boost::variant& t) { + template + Self& operator=(const std::variant< T ... >& t) { internal::Output_visitor visitor(this); - t.apply_visitor(visitor); + std::visit(visitor, t); return *this; } - template - Self& operator=(const std::optional< boost::variant >& t) { + template + Self& operator=(const std::optional< std::variant< T ... > >& t) { internal::Output_visitor visitor(this); - if(t) boost::apply_visitor(visitor, *t); + if(t) std::visit(visitor, *t); return *this; } diff --git a/STL_Extension/test/STL_Extension/test_Object.cpp b/STL_Extension/test/STL_Extension/test_Object.cpp index 36cacb0f3343..1e65bf5cf97f 100644 --- a/STL_Extension/test/STL_Extension/test_Object.cpp +++ b/STL_Extension/test/STL_Extension/test_Object.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include @@ -11,7 +11,7 @@ void from_opt_var() { int i = 0; double j = 0.0; - std::optional< boost::variant > v(23); + std::optional< std::variant > v(23); CGAL::Object o = v; assert(!o.empty()); assert(CGAL::assign(i, o)); @@ -23,7 +23,7 @@ void from_opt_var() { assert(CGAL::assign(j, o)); assert(j == 2.0); //empty optional - std::optional< boost::variant > v2; + std::optional< std::variant > v2; CGAL::Object o2 = v2; assert(o2.empty()); } @@ -31,7 +31,7 @@ void from_opt_var() { void from_var() { int i = 0; - boost::variant v(23); + std::variant v(23); CGAL::Object o = v; assert(!o.empty()); assert(CGAL::assign(i, o)); diff --git a/STL_Extension/test/STL_Extension/test_dispatch_output.cpp b/STL_Extension/test/STL_Extension/test_dispatch_output.cpp index b4340772add8..250fe0a57ca6 100644 --- a/STL_Extension/test/STL_Extension/test_dispatch_output.cpp +++ b/STL_Extension/test/STL_Extension/test_dispatch_output.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include struct A{}; @@ -91,7 +91,7 @@ void complete_test(std::vector data1,std::list data2){ } void variant_test() { - typedef boost::variant var; + typedef std::variant var; typedef std::optional< var > ovar; std::vector a; std::vector b; diff --git a/Shape_regularization/include/CGAL/Shape_regularization/internal/Contour_base_2.h b/Shape_regularization/include/CGAL/Shape_regularization/internal/Contour_base_2.h index 1f8a5b8aafd5..bbd1a13132ee 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/internal/Contour_base_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/internal/Contour_base_2.h @@ -755,10 +755,10 @@ namespace internal { typename CGAL::cpp11::result_of::type result = CGAL::intersection(line_1, line_2); if (result) { - if (const Line_2* line = boost::get(&*result)) { + if (const Line_2* line = std::get_if(&*result)) { return false; } else { - const Point_2* point = boost::get(&*result); + const Point_2* point = std::get_if(&*result); in_point = *point; return true; } } diff --git a/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp b/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp index 60174dc2fc4d..eba06f7b5780 100644 --- a/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp +++ b/Surface_mesh/examples/Surface_mesh/sm_aabbtree.cpp @@ -53,8 +53,8 @@ int main() tree.any_intersection(segment_query); if(intersection){ // gets intersection object - if(boost::get(&(intersection->first))){ - Point* p = boost::get(&(intersection->first)); + if(std::get_if(&(intersection->first))){ + Point* p = std::get_if(&(intersection->first)); std::cout << "intersection object is a point " << *p << std::endl; std::cout << "with face "<< intersection->second << std::endl; } @@ -77,8 +77,8 @@ int main() // (generally a segment) Plane_intersection plane_intersection = tree.any_intersection(plane_query); if(plane_intersection){ - if(boost::get(&(plane_intersection->first))){ - Segment* s = boost::get(&(plane_intersection->first)); + if(std::get_if(&(plane_intersection->first))){ + Segment* s = std::get_if(&(plane_intersection->first)); std::cout << "one intersection object is the segment " << s << std::endl; std::cout << "with face "<< intersection->second << std::endl; } diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h index f221ee28c45b..5709694f491f 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/SDF_calculation.h @@ -434,7 +434,7 @@ class SDF_calculation } const Point* i_point; - if(!(i_point = boost::get(&object))) { + if(!(i_point = std::get_if(&object))) { continue; // continue in case of segment. } @@ -483,7 +483,7 @@ class SDF_calculation if(!min_intersection) return boost::make_tuple(false, false, 0.0, Primitive_id()); - const Point* i_point = boost::get( &min_intersection->first ); + const Point* i_point = std::get_if( &min_intersection->first ); if (!i_point) //segment case ignored return boost::make_tuple(false, false, 0.0, Primitive_id()); diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h index e44cd401304d..2095e3389432 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h @@ -152,7 +152,7 @@ class SurfaceMeshShortestPathTraits /*! Function object type. Must provide - `std::optional< boost::variant< T... > > operator()(A obj1, B obj2)` + `std::optional< std::variant< T... > > operator()(A obj1, B obj2)` to compute the intersection between `obj1` and `obj2`, where `A` and `B` can be any type amongst `Line_2`, `Ray_2`, `Segment_2`. */ diff --git a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_path_sequence.cpp b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_path_sequence.cpp index 98340eb00006..857321096b2f 100644 --- a/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_path_sequence.cpp +++ b/Surface_mesh_shortest_path/examples/Surface_mesh_shortest_path/shortest_path_sequence.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include @@ -26,10 +26,10 @@ typedef Graph_traits::face_descriptor face_descriptor; typedef Graph_traits::halfedge_descriptor halfedge_descriptor; // A model of SurfacemeshShortestPathVisitor storing simplicies -// using boost::variant +// using std::variant struct Sequence_collector { - typedef boost::variant< vertex_descriptor, + typedef std::variant< vertex_descriptor, std::pair, std::pair > Simplex; std::vector< Simplex > sequence; @@ -50,9 +50,8 @@ struct Sequence_collector } }; -// A visitor to print what a variant contains using boost::apply_visitor +// A visitor to print what a variant contains using std::visit struct Print_visitor - : public boost::static_visitor<> { int i; Triangle_mesh& g; @@ -123,7 +122,7 @@ int main(int argc, char** argv) // print the sequence using the visitor pattern Print_visitor print_visitor(tmesh); for (size_t i = 0; i < sequence_collector.sequence.size(); ++i) - boost::apply_visitor(print_visitor, sequence_collector.sequence[i]); + std::visit(print_visitor, sequence_collector.sequence[i]); return 0; } diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h index 241c96473501..7c16da8876cb 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h @@ -1082,7 +1082,7 @@ class Surface_mesh_shortest_path { const auto cgalIntersection = i2(cl2(segment), cl2(leftBoundary)); - if (!cgalIntersection || !boost::get(&*cgalIntersection)) + if (!cgalIntersection || !std::get_if(&*cgalIntersection)) { if (m_debugOutput) { @@ -1092,7 +1092,7 @@ class Surface_mesh_shortest_path } else { - const Point_2* result = boost::get(&*cgalIntersection); + const Point_2* result = std::get_if(&*cgalIntersection); FT t0 = pdas2(cs2(segment), ct2(segment), *result); if (t0 >= FT(1)) @@ -1140,7 +1140,7 @@ class Surface_mesh_shortest_path { const auto cgalIntersection = i2(cl2(segment), cl2(rightBoundary)); - if (!cgalIntersection || !boost::get(&*cgalIntersection)) + if (!cgalIntersection || !std::get_if(&*cgalIntersection)) { if (m_debugOutput) { @@ -1150,7 +1150,7 @@ class Surface_mesh_shortest_path } else { - const Point_2* result = boost::get(&*cgalIntersection); + const Point_2* result = std::get_if(&*cgalIntersection); FT t0 = pdas2(cs2(segment), ct2(segment), *result); if (t0 <= FT(0)) @@ -1778,7 +1778,7 @@ class Surface_mesh_shortest_path CGAL_assertion(bool(cgalIntersection)); - const Point_2* result = boost::get(&*cgalIntersection); + const Point_2* result = std::get_if(&*cgalIntersection); if (!result) result = ¤tSourceImage; @@ -3064,7 +3064,7 @@ class Surface_mesh_shortest_path { if (intersections[i]) { - Point_3* intersectionPoint = boost::get(&(intersections[i]->first)); + Point_3* intersectionPoint = std::get_if(&(intersections[i]->first)); if (intersectionPoint) { diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/function_objects.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/function_objects.h index 19a2ed5105b3..227d20833c46 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/function_objects.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/function_objects.h @@ -465,7 +465,7 @@ class Compare_relative_intersection_along_segment_2 CGAL_assertion(bool(intersectResult1)); if (!intersectResult1) return CGAL::SMALLER; - const Point_2* p1_ptr = boost::get(&*intersectResult1); + const Point_2* p1_ptr = std::get_if(&*intersectResult1); CGAL_assertion(p1_ptr && "Intersection should have been a point"); if (!p1_ptr) return CGAL::SMALLER; @@ -477,7 +477,7 @@ class Compare_relative_intersection_along_segment_2 CGAL_assertion(bool(intersectResult2)); if (!intersectResult2) return CGAL::SMALLER; - const Point_2* p2_ptr = boost::get(&*intersectResult2); + const Point_2* p2_ptr = std::get_if(&*intersectResult2); CGAL_assertion(p2_ptr && "Intersection should have been a point"); if (!p2_ptr) return CGAL::SMALLER; diff --git a/Surface_sweep_2/include/CGAL/Surface_sweep_2.h b/Surface_sweep_2/include/CGAL/Surface_sweep_2.h index 16c2fdedb385..2241424c8e4e 100644 --- a/Surface_sweep_2/include/CGAL/Surface_sweep_2.h +++ b/Surface_sweep_2/include/CGAL/Surface_sweep_2.h @@ -102,7 +102,7 @@ class Surface_sweep_2 : public No_intersection_surface_sweep_2 { typedef typename Base::Status_line_iterator Status_line_iterator; typedef std::pair Intersection_point; - typedef boost::variant + typedef std::variant Intersection_result; typedef std::vector Intersection_vector; typedef Random_access_output_iterator diff --git a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h index 52f2dde71b16..9eece3004a92 100644 --- a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h +++ b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_impl.h @@ -624,7 +624,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, intersector(xc, (*sc_it)->last_curve(), vector_inserter(xections)); CGAL_assertion(xections.size() == 1); auto& item = xections.front(); - xc = *boost::get(&item); + xc = *std::get_if(&item); } CGAL_assertion @@ -667,7 +667,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, this->m_traits->is_closed_2_object()(c1->last_curve(), ARR_MIN_END) && this->m_traits->is_closed_2_object()(c2->last_curve(), ARR_MIN_END)) { - if ((boost::get(&(*vi)) != nullptr) && + if ((std::get_if(&(*vi)) != nullptr) && this->m_traits->equal_2_object()(ctr_min(c1->last_curve()), ctr_min(c2->last_curve()))) { @@ -685,7 +685,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, vector_inserter vi_last = vi_end; --vi_last; - if (boost::get(&(*vi_last)) != nullptr) { + if (std::get_if(&(*vi_last)) != nullptr) { CGAL_SS_PRINT_TEXT("Skipping common right endpoint..."); CGAL_SS_PRINT_EOL(); --vi_end; @@ -712,7 +712,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, vector_inserter vi_last = vi_end; --vi_last; - if (boost::get(&(*vi_last)) != nullptr) { + if (std::get_if(&(*vi_last)) != nullptr) { CGAL_SS_PRINT_TEXT("Skipping common right endpoint on boundary..."); CGAL_SS_PRINT_EOL(); --vi_end; @@ -725,7 +725,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, // SL: curves are split and no event strictly before the current event should // be reported if (vi != vi_end) { - const Intersection_point* xp_point = boost::get(&(*vi)); + const Intersection_point* xp_point = std::get_if(&(*vi)); if (xp_point != nullptr) { // Skip the intersection point if it is not larger than the current event. // To correctly do so, we have to set the ps_x and ps_y for xp_point->first @@ -744,7 +744,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, bool first_i = true; for (; vi != vi_end; ++vi) { Multiplicity multiplicity = 0; - const Intersection_point* xp_point = boost::get(&(*vi)); + const Intersection_point* xp_point = std::get_if(&(*vi)); if (xp_point != nullptr) { Point_2 xp = xp_point->first; multiplicity = xp_point->second; @@ -753,7 +753,7 @@ void Surface_sweep_2::_intersect(Subcurve* c1, Subcurve* c2, _create_intersection_point(xp, multiplicity, c1, c2); } else { - const X_monotone_curve_2 icv = *boost::get(&(*vi)); + const X_monotone_curve_2 icv = *std::get_if(&(*vi)); // CGAL_assertion(icv != nullptr); CGAL_SS_PRINT_TEXT("Found an overlap"); diff --git a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_utils.h b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_utils.h index d3c785ea8f2c..1fdbd1ab0944 100644 --- a/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_utils.h +++ b/Surface_sweep_2/include/CGAL/Surface_sweep_2/Surface_sweep_2_utils.h @@ -51,7 +51,7 @@ void make_x_monotone(CurveInputIter begin, CurveInputIter end, { typedef typename Traits::Point_2 Point_2; typedef typename Traits::X_monotone_curve_2 X_monotone_curve_2; - typedef boost::variant Make_x_monotone_result; + typedef std::variant Make_x_monotone_result; // Split the input curves into x-monotone objects. std::size_t num_of_curves = std::distance(begin, end); @@ -63,14 +63,14 @@ void make_x_monotone(CurveInputIter begin, CurveInputIter end, // Transform each object to either a point or an x-monotone curve. for (const auto& obj : object_vec) { - const X_monotone_curve_2* xcv = boost::get(&obj); + const X_monotone_curve_2* xcv = std::get_if(&obj); if (xcv != nullptr) { // The object is an x-monotone curve. *x_curves++ = *xcv; continue; } // The object is an isolated point. - const Point_2* pt = boost::get(&obj); + const Point_2* pt = std::get_if(&obj); CGAL_assertion(pt != nullptr); *iso_points++ = *pt; } diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h index be81a7809a4a..5cf73bf46517 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h @@ -535,7 +535,7 @@ void set_index(typename C3t3::Vertex_handle v, const C3t3& c3t3) v->set_index(typename C3t3::Curve_index(1)); break; case 0: - v->set_index(boost::get(v->index())); + v->set_index(std::get(v->index())); break; default: CGAL_assertion(false); diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h index 652cb033ab83..e57a8ebb6f40 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h @@ -40,7 +40,7 @@ class ConstrainedTriangulationTraits_2 { /*! A function object whose `operator()` computes the intersection of two segments. -`std::optional > operator()(Segment_2 s1, Segment_2 s2);` +`std::optional > operator()(Segment_2 s1, Segment_2 s2);` Returns the intersection of `s1` and `s2`. */ typedef unspecified_type Intersect_2; diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 42867cfbb074..692b34199c09 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -1891,16 +1891,16 @@ compute_intersection(const Gt& gt, #ifdef CGAL_CDT_2_DEBUG_INTERSECTIONS typedef typename Gt::Segment_2 Segment_2; if(result){ - if (const Segment_2* s = boost::get(&*result)){ + if (const Segment_2* s = std::get_if(&*result)){ std::cerr << CGAL::internal::cdt_2_indent_level << "compute_intersection: " << *s << '\n'; - }else if(const Point_2* p = boost::get(&*result)) + }else if(const Point_2* p = std::get_if(&*result)) std::cerr << CGAL::internal::cdt_2_indent_level << "compute_intersection: " << *p << '\n'; } #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS if(result){ - if(const Point_2* p = boost::get(&*result)){ + if(const Point_2* p = std::get_if(&*result)){ pi = *p; return true; } diff --git a/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp b/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp index be460a836261..9df70f7f868d 100644 --- a/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp +++ b/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp @@ -38,7 +38,7 @@ int main() { CGAL::Arr_naive_point_location pl(env); CGAL::Arr_point_location_result::Type obj = pl.locate(q); // The query point locates in the interior of a face - face = boost::get (&obj); + face = std::get (&obj); // compute non regularized visibility area // Define visibility object type that computes non-regularized visibility area diff --git a/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h b/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h index f5cf4d1873dc..384d99acb305 100644 --- a/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h +++ b/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h @@ -306,7 +306,7 @@ namespace CGAL { Location_result result = point_location.ray_shoot_up(q); if(const Halfedge_const_handle* e = - boost::get(&(result))) + std::get_if(&(result))) { CGAL_assertion((*e)->face() == face); Point_2 p(q.x(), @@ -321,7 +321,7 @@ namespace CGAL { return (*e)->next()->ccb(); } else if (const Vertex_const_handle* v = - boost::get(&(result))) + std::get_if(&(result))) { Halfedge_around_vertex_const_circulator cir = (*v)->incident_halfedges(); diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h index e0dd1cdc4616..344fed3378c6 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h @@ -720,7 +720,7 @@ typedef unspecified_type Site_iterator; /*! The result type of the point location queries. */ -typedef boost::variant +typedef std::variant Locate_result; /// @} diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h index bdd875609361..45693eaf6f98 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h @@ -113,7 +113,7 @@ It must provide the following operator:
    `result_type operator()(Delaunay_graph dg, Point_2 p)`
    where the result type `result_type` is -`boost::variant`. +`std::variant`. This type is required only if `Has_nearest_site_2` is equal to `CGAL::Tag_true`. diff --git a/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location.cpp b/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location.cpp index 8451c216bded..967660d2efb3 100644 --- a/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location.cpp +++ b/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location.cpp @@ -60,17 +60,17 @@ int main() << ") lies on a Voronoi " << std::flush; Locate_result lr = vd.locate(p); - if ( Vertex_handle* v = boost::get(&lr) ) { + if ( Vertex_handle* v = std::get_if(&lr) ) { std::cout << "vertex." << std::endl; std::cout << "The Voronoi vertex is:" << std::endl; std::cout << "\t" << (*v)->point() << std::endl; - } else if ( Halfedge_handle* e = boost::get(&lr) ) { + } else if ( Halfedge_handle* e = std::get_if(&lr) ) { std::cout << "edge." << std::endl; std::cout << "The source and target vertices " << "of the Voronoi edge are:" << std::endl; print_endpoint(*e, true); print_endpoint(*e, false); - } else if ( Face_handle* f = boost::get(&lr) ) { + } else if ( Face_handle* f = std::get_if(&lr) ) { std::cout << "face." << std::endl; std::cout << "The vertices of the Voronoi face are" << " (in counterclockwise order):" << std::endl; diff --git a/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location_sdg_linf.cpp b/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location_sdg_linf.cpp index 3fa8850e2cc7..59ec3453781b 100644 --- a/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location_sdg_linf.cpp +++ b/Voronoi_diagram_2/examples/Voronoi_diagram_2/vd_2_point_location_sdg_linf.cpp @@ -62,17 +62,17 @@ int main() << ") lies on a Voronoi " << std::flush; Locate_result lr = vd.locate(p); - if ( Vertex_handle* v = boost::get(&lr) ) { + if ( Vertex_handle* v = std::get_if(&lr) ) { std::cout << "vertex." << std::endl; std::cout << "The Voronoi vertex is:" << std::endl; std::cout << "\t" << (*v)->point() << std::endl; - } else if ( Halfedge_handle* e = boost::get(&lr) ) { + } else if ( Halfedge_handle* e = std::get_if(&lr) ) { std::cout << "edge." << std::endl; std::cout << "The source and target vertices " << "of the Voronoi edge are:" << std::endl; print_endpoint(*e, true); print_endpoint(*e, false); - } else if ( Face_handle* f = boost::get(&lr) ) { + } else if ( Face_handle* f = std::get_if(&lr) ) { std::cout << "face." << std::endl; std::cout << "The vertices of the Voronoi face are" << " (in counterclockwise order):" << std::endl; diff --git a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2.h b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2.h index 82f0bdc6d678..9d4e37852152 100644 --- a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2.h +++ b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2.h @@ -41,7 +41,7 @@ #include -#include +#include #include namespace CGAL { @@ -268,7 +268,7 @@ class Voronoi_diagram_2 public: typedef typename Adaptation_traits::Point_2 Point_2; - typedef boost::variant + typedef std::variant Locate_result; private: @@ -634,15 +634,15 @@ class Voronoi_diagram_2 Query_result ns_qr = nearest_site(dual_, p); if ( const Delaunay_vertex_handle* dv = - boost::get(&ns_qr) ) { + std::get_if(&ns_qr) ) { return Face_handle( Face(this, *dv) ); } else if ( const Delaunay_face_handle *df = - boost::get(&ns_qr) ) { + std::get_if(&ns_qr) ) { Find_valid_vertex vertex_finder; Delaunay_face_handle dfvalid = vertex_finder(this, *df); return Vertex_handle( Vertex(this, dfvalid) ); } else if ( const Delaunay_edge* de = - boost::get(&ns_qr) ) { + std::get_if(&ns_qr) ) { CGAL_assertion( !edge_rejector()(dual_, *de) ); if ( dual_.dimension() == 1 ) { Delaunay_vertex_handle v1 = diff --git a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Apollonius_graph_nearest_site_2.h b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Apollonius_graph_nearest_site_2.h index d0f1fbf11a64..6bf63d83fdee 100644 --- a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Apollonius_graph_nearest_site_2.h +++ b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Apollonius_graph_nearest_site_2.h @@ -20,7 +20,7 @@ #include #include -#include +#include namespace CGAL { @@ -48,7 +48,7 @@ class Apollonius_graph_nearest_site_2 typedef typename Delaunay_graph::Edge_circulator Edge_circulator; public: - typedef boost::variant result_type; + typedef std::variant result_type; result_type operator()(const Delaunay_graph& dg, const Point_2& p) const { CGAL_precondition( dg.dimension() >= 0 ); diff --git a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Delaunay_triangulation_nearest_site_2.h b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Delaunay_triangulation_nearest_site_2.h index 6014724302f6..f3739a2da68b 100644 --- a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Delaunay_triangulation_nearest_site_2.h +++ b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Delaunay_triangulation_nearest_site_2.h @@ -19,7 +19,7 @@ #include #include -#include +#include namespace CGAL { @@ -48,7 +48,7 @@ class Delaunay_triangulation_nearest_site_2 typedef typename Delaunay_graph::Edge_circulator Edge_circulator; public: - typedef boost::variant result_type; + typedef std::variant result_type; result_type operator()(const Delaunay_graph& dg, const Point_2& p) const { CGAL_precondition( dg.dimension() >= 0 ); diff --git a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Regular_triangulation_nearest_site_2.h b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Regular_triangulation_nearest_site_2.h index 9b9c88965d92..ebc19ed6e1fc 100644 --- a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Regular_triangulation_nearest_site_2.h +++ b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Regular_triangulation_nearest_site_2.h @@ -19,7 +19,7 @@ #include #include -#include +#include namespace CGAL { @@ -50,7 +50,7 @@ class Regular_triangulation_nearest_site_2 typedef typename Geom_traits::Weighted_point_2 Weighted_point_2; public: - typedef boost::variant result_type; + typedef std::variant result_type; result_type operator()(const Delaunay_graph& dg, const Point_2& p) const { CGAL_precondition( dg.dimension() >= 0 ); diff --git a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Segment_Delaunay_graph_nearest_site_2.h b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Segment_Delaunay_graph_nearest_site_2.h index 8031047d03b0..5d89d1c737a6 100644 --- a/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Segment_Delaunay_graph_nearest_site_2.h +++ b/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Segment_Delaunay_graph_nearest_site_2.h @@ -19,7 +19,7 @@ #include #include -#include +#include namespace CGAL { @@ -95,7 +95,7 @@ class Segment_Delaunay_graph_nearest_site_2 } public: - typedef boost::variant result_type; + typedef std::variant result_type; result_type operator()(const Delaunay_graph& dg, const Point_2& p) const { CGAL_precondition( dg.dimension() >= 0 ); diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_concept.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_concept.h index 9628e9ab45fa..b97617522045 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_concept.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_concept.h @@ -17,7 +17,7 @@ #include #include "helper_functions.h" #include -#include +#include template @@ -567,11 +567,11 @@ void test_ns_concept(const DG& dg, const AT& at, CGAL::Tag_true) result_type qr = ns(dg, p); - if ( Face_handle* f = boost::get(&qr) ) { + if ( Face_handle* f = std::get_if(&qr) ) { kill_warning(f); - } else if ( Edge* e = boost::get(&qr) ) { + } else if ( Edge* e = std::get_if(&qr) ) { kill_warning(e); - } else if ( Vertex_handle* v = boost::get(&qr) ) { + } else if ( Vertex_handle* v = std::get_if(&qr) ) { kill_warning(v); } else { // we should have reached this line diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h index 285e03cb62ba..cfcff23df763 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_locate.h @@ -15,7 +15,7 @@ #include #include -#include +#include #include "helper_functions.h" @@ -81,13 +81,13 @@ void test_locate_dg(const VDA& vda, const Projector& , for (unsigned int i = 0; i < vecp.size(); ++i) { os << vecp[i] << "\t --> \t" << std::flush; ns_qr = nearest_site(vda.dual(), vecp[i]); - if ( Vertex_handle* v = boost::get(&ns_qr) ) { + if ( Vertex_handle* v = std::get_if(&ns_qr) ) { os << "FACE"; kill_warning( v ); - } else if ( Edge* e = boost::get(&ns_qr) ) { + } else if ( Edge* e = std::get_if(&ns_qr) ) { os << "EDGE"; kill_warning( e ); - } else if ( Face_handle* f = boost::get(&ns_qr) ) { + } else if ( Face_handle* f = std::get_if(&ns_qr) ) { os << "VERTEX"; kill_warning( f ); } else { @@ -114,7 +114,7 @@ void test_locate_vd(const VDA& vda, const Point_vector& vecp, for (unsigned int i = 0; i < vecp.size(); ++i) { os << vecp[i] << "\t --> \t" << std::flush; lr = vda.locate(vecp[i]); - if ( Halfedge_handle* ee = boost::get(&lr) ) { + if ( Halfedge_handle* ee = std::get_if(&lr) ) { Halfedge_handle e = *ee; os << "VORONOI EDGE"; if ( print_sites ) { @@ -135,7 +135,7 @@ void test_locate_vd(const VDA& vda, const Point_vector& vecp, } } // if ( print_sites ) kill_warning( e ); - } else if ( Vertex_handle* vv = boost::get(&lr) ) { + } else if ( Vertex_handle* vv = std::get_if(&lr) ) { os << "VORONOI VERTEX"; Vertex_handle v = *vv; if ( print_sites ) { @@ -145,7 +145,7 @@ void test_locate_vd(const VDA& vda, const Point_vector& vecp, } } kill_warning( v ); - } else if ( Face_handle* ff = boost::get(&lr) ) { + } else if ( Face_handle* ff = std::get_if(&lr) ) { typename VDA::Face_handle f = *ff; kill_warning( f ); os << "VORONOI FACE"; diff --git a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h index 2b2974ae273c..bb9ea6b426ea 100644 --- a/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h +++ b/Voronoi_diagram_2/test/Voronoi_diagram_2/include/vda_test_vda.h @@ -223,13 +223,13 @@ void test_vdqr_concept(const VDA& vda, const CGAL::Tag_true&) Point_2 p(0,0); Locate_result lr = vda.locate(p); - if ( Vertex_handle* vv = boost::get(&lr) ) { + if ( Vertex_handle* vv = std::get_if(&lr) ) { Vertex_handle v = *vv; kill_warning(v); - } else if ( Halfedge_handle* ee = boost::get(&lr) ) { + } else if ( Halfedge_handle* ee = std::get_if(&lr) ) { Halfedge_handle e = *ee; kill_warning(e); - } else if ( Face_handle* ff = boost::get(&lr) ) { + } else if ( Face_handle* ff = std::get_if(&lr) ) { Face_handle f = *ff; kill_warning(f); } From 56499e017d1992cb578324b49b4420f2e78e2c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 3 May 2023 18:52:01 +0200 Subject: [PATCH 0363/1398] do not use API that did not go into the standard --- .../include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h | 4 +--- Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h | 2 +- .../CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h | 2 +- .../test_corefinement_and_constraints.cpp | 4 ++-- .../Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp | 3 +-- Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h | 4 +--- 6 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h index af0f793f4eda..f813f8ccc9a5 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h @@ -609,9 +609,7 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, // This is the rightmost vertex in the current minimization diagram (out_d). // The intersection points/curves that interest us are the ones in // [v_leftmost, v]. - // Without using make_optional we get a "maybe uninitialized" warning with gcc -Wall - std::optional v_leftmost = - std::make_optional(false, Vertex_const_handle()); + std::optional v_leftmost; if (is_leftmost1 == true) { if (is_leftmost2 == false) diff --git a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h index d2f1065785a4..81140cdc66e1 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Protect_edges_sizing_field.h @@ -1524,7 +1524,7 @@ change_ball_size(const Vertex_handle& v, const FT squared_size, const bool speci Bare_point p = cp(c3t3_.triangulation().point(v)); // intentional copy // Remove v from the set of corners - std::optional corner_index = std::make_optional(false, Corner_index()); + std::optional corner_index; if ( c3t3_.is_in_complex(v) ) { corner_index = c3t3_.corner_index(v); diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h index d46e847a2c09..e35eb180ba6b 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_mesh_3/Protect_edges_sizing_field.h @@ -2479,7 +2479,7 @@ change_ball_size(Vertex_handle& v, const FT squared_size, const bool special_bal const Bare_point p = cp(c3t3_.triangulation().point(v)); // intentional copy // Remove v from the set of corners - std::optional corner_index = std::make_optional(false, Corner_index()); + std::optional corner_index; if(c3t3_.is_in_complex(v)) { corner_index = c3t3_.corner_index(v); diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp index 3f3af6c44ae1..7642f81f4939 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp @@ -167,8 +167,8 @@ void test_bool_op_no_copy( typedef std::optional OTM; Triangle_mesh *ptr = nullptr; const std::array output = - reverse ? CGAL::make_array(OTM(&tm2), OTM(&tm1), std::make_optional(false,ptr), std::make_optional(false,ptr)) - : CGAL::make_array(OTM(&tm1), OTM(&tm2), std::make_optional(false,ptr), std::make_optional(false,ptr)); + reverse ? CGAL::make_array(OTM(&tm2), OTM(&tm1), std::optional(), std::optional()) + : CGAL::make_array(OTM(&tm1), OTM(&tm2), std::optional(), std::optional()); PMP::corefine_and_compute_boolean_operations(tm1, tm2, output, diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp index a25fa8072f02..85238d26ff43 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Point_inside_polyhedron_plugin.cpp @@ -189,8 +189,7 @@ public Q_SLOTS: void on_Sample_random_points_from_bbox() { // calculate bbox of selected polyhedron items - std::optional bbox - = std::make_optional(false, CGAL::Three::Scene_interface::Bbox()); + std::optional bbox; // Workaround a bug in g++-4.8.3: // https://stackoverflow.com/a/21755207/1728537 // Using std::make_optional to copy-initialize 'bbox' hides the diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h index 15b6171cf287..a65e7adf764b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.h @@ -295,9 +295,7 @@ friend class Polyhedron_demo_selection_plugin; constVPmap vpm = get(CGAL::vertex_point, *polyhedron()); - std::optional item_bbox - = std::make_optional(false, CGAL::Bbox_3()); - + std::optional item_bbox; for(Selection_set_vertex::const_iterator v_it = selected_vertices.begin(); v_it != selected_vertices.end(); ++v_it) { From edc317d771fb9b4d747c4c3d240c9e246a694edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 4 May 2023 10:26:16 +0200 Subject: [PATCH 0364/1398] variant::which() => variant::index() + typos --- .../include/CGAL/Arr_circular_line_arc_traits_2.h | 1 - .../CGAL/Arr_point_location/Td_active_trapezoid.h | 4 ++-- .../include/CGAL/Arr_point_location/Td_traits.h | 14 +++++++------- .../Trapezoidal_decomposition_2.h | 2 ++ .../CGAL/Hyperbolic_triangulation_face_base_2.h | 2 +- SMDS_3/include/CGAL/IO/output_to_vtu.h | 4 ++-- .../SMDS_3/internal/Handle_IO_for_pair_of_int.h | 2 +- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index 4efc598b81d4..c48fa96917c7 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -339,7 +339,6 @@ namespace CGAL { template class Variant_Construct_min_vertex_2 - { typedef typename CircularKernel::Circular_arc_point_2 Circular_arc_point_2; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h index 44834852a2b4..d8a775c41793 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h @@ -459,12 +459,12 @@ class Td_active_trapezoid : public Handle Td_map_item item (*this); - if (ptr()->rb.which() != 0) + if (ptr()->rb.index() != 0) { Self tr(std::get(rb())); tr.set_lb(item); } - if (ptr()->rt.which() != 0) + if (ptr()->rt.index() != 0) { Self tr(std::get(rt())); tr.set_lt(item); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h index 59a3dd7f6b6d..391fb2646580 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_traits.h @@ -957,13 +957,13 @@ class Td_traits : public Pm_traits_ //returns true if the trapezoid is a curve bool is_empty_item(const Td_map_item& tr) const { - return (tr.which() == 0); + return (tr.index() == 0); } //returns true if the trapezoid is a point or a curve bool is_trapezoid(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_TRAPEZOID: case TD_INACTIVE_TRAPEZOID: @@ -976,7 +976,7 @@ class Td_traits : public Pm_traits_ //returns true if the map item is a vertex bool is_td_vertex(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_VERTEX: case TD_ACTIVE_FICTITIOUS_VERTEX: @@ -991,7 +991,7 @@ class Td_traits : public Pm_traits_ //returns true if the map item is an edge bool is_td_edge(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_EDGE: case TD_INACTIVE_EDGE: @@ -1004,7 +1004,7 @@ class Td_traits : public Pm_traits_ //returns true if the map item is an edge bool is_td_trapezoid(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_TRAPEZOID: case TD_INACTIVE_TRAPEZOID: @@ -1017,7 +1017,7 @@ class Td_traits : public Pm_traits_ //returns true if the trapezoid is a curve bool is_fictitious_vertex(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_FICTITIOUS_VERTEX: case TD_INACTIVE_FICTITIOUS_VERTEX: @@ -1030,7 +1030,7 @@ class Td_traits : public Pm_traits_ //returns true if the trapezoid is a curve bool is_active(const Td_map_item& tr) const { - switch (tr.which()) + switch (tr.index()) { case TD_ACTIVE_TRAPEZOID: case TD_ACTIVE_EDGE: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index be7d7ac72b3c..3888b097bb8b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -717,6 +717,7 @@ class Trapezoidal_decomposition_2 /*! A visitor to set the cw halfedge of a vertex node. */ class set_cw_he_visitor + { public: set_cw_he_visitor(Halfedge_const_handle he) : m_cw_he(he) {} @@ -735,6 +736,7 @@ class Trapezoidal_decomposition_2 /*! A visitor to reset the cw halfedge of a vertex node. */ class reset_cw_he_visitor + { public: void operator()(Td_active_vertex& t) const { t.reset_cw_he(); } diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h index 32d730aab7c3..724f45794e65 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_triangulation_face_base_2.h @@ -23,7 +23,7 @@ namespace CGAL { class Hyperbolic_data { - typedef boost::int8_t Id; + typedef std::int8_t Id; private: // - 2 for infinite face diff --git a/SMDS_3/include/CGAL/IO/output_to_vtu.h b/SMDS_3/include/CGAL/IO/output_to_vtu.h index 37cd018570f8..863bba2cebbb 100644 --- a/SMDS_3/include/CGAL/IO/output_to_vtu.h +++ b/SMDS_3/include/CGAL/IO/output_to_vtu.h @@ -314,7 +314,7 @@ void output_to_vtu_with_attributes(std::ostream& os, os << " \n"; for(std::size_t i = 0; i< attributes.size(); ++i) { - switch(attributes[i].second.which()){ + switch(attributes[i].second.index()){ case 0: write_attribute_tag(os,attributes[i].first, *std::get* >(attributes[i].second), binary,offset); break; @@ -334,7 +334,7 @@ void output_to_vtu_with_attributes(std::ostream& os, write_c3t3_points(os,tr,V); // fills V if the mode is BINARY write_cells(os,c3t3,V); for(std::size_t i = 0; i< attributes.size(); ++i) - switch(attributes[i].second.which()){ + switch(attributes[i].second.index()){ case 0: write_attributes(os, *std::get* >(attributes[i].second)); break; diff --git a/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h b/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h index 977909a463d1..87d4e5863d5b 100644 --- a/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h +++ b/SMDS_3/include/CGAL/SMDS_3/internal/Handle_IO_for_pair_of_int.h @@ -61,7 +61,7 @@ class Output_rep >(v)); } else { out << std::get(v); From bbc48b2c7e3479db56b993f55829a5ca44ce1939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 4 May 2023 13:03:22 +0200 Subject: [PATCH 0365/1398] more fixes use Mesh_3::internal::get_index std::dynamic_point_cast std::get_if --- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 4 +- .../Mesh_domain_with_polyline_features_3.h | 8 +-- .../include/CGAL/Polyhedral_mesh_domain_3.h | 2 +- .../Plugins/Mesh_3/Mesh_3_plugin.cpp | 53 +++++++++---------- .../Point_set_shape_detection_plugin.cpp | 2 +- .../CGAL/SMDS_3/internal/indices_management.h | 6 +-- .../Efficient_RANSAC/Efficient_RANSAC.h | 2 +- .../test_efficient_RANSAC_cone_parameters.cpp | 2 +- ...t_efficient_RANSAC_cylinder_parameters.cpp | 2 +- ...test_efficient_RANSAC_plane_parameters.cpp | 2 +- ...est_efficient_RANSAC_sphere_parameters.cpp | 2 +- ...test_efficient_RANSAC_torus_parameters.cpp | 2 +- .../internal/flip_edges.h | 6 +-- .../tetrahedral_adaptive_remeshing_impl.h | 2 +- .../internal/tetrahedral_remeshing_helpers.h | 2 +- 15 files changed, 48 insertions(+), 49 deletions(-) diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 7e7f98b86e57..0455d1711bbe 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -1259,14 +1259,14 @@ class Labeled_mesh_domain_3 * where lies a vertex with dimension 2 and index `index`. */ Surface_patch_index surface_patch_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } /* * Returns the index of the subdomain containing a vertex * with dimension 3 and index `index`. */ Subdomain_index subdomain_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } // ----------------------------------- // Backward Compatibility diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 47e8fe5d205e..183be5170165 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -772,22 +772,22 @@ class Mesh_domain_with_polyline_features_3 * where lies a vertex with dimension 2 and index `index`. */ Surface_patch_index surface_patch_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } /** * Returns the index of the subdomain containing a vertex * with dimension 3 and index `index`. */ Subdomain_index subdomain_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } /// Returns a `Curve_index` from an `Index` Curve_index curve_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } /// Returns a `Corner_index` from an `Index` Corner_index corner_index(const Index& index) const - { return std::get(index); } + { return Mesh_3::internal::get_index(index); } /// @cond DEVELOPERS #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 417c27777a61..723290bbd357 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -607,7 +607,7 @@ class Polyhedral_mesh_domain_3 AABB_tree_* bounding_tree_; // cache queries and intersected primitive - typedef typename std::variant::type Cached_query; + typedef std::variant Cached_query; struct Query_cache { Query_cache() : has_cache(false) {} 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 cb10a9a806a1..a51be995cc11 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -279,7 +279,6 @@ void Mesh_3_plugin::mesh_3_volume() std::optional Mesh_3_plugin::get_items_or_return_error_string() const { - using boost::get; items = {}; features_protection_available = false; item = nullptr; @@ -322,7 +321,7 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const { if (!items) continue; - auto poly_items_ptr = get(&*items); + auto poly_items_ptr = std::get_if(&items.value()); if(poly_items_ptr) { if (poly_items_ptr->polylines_item) { return tr("Only one polyline item is accepted"); @@ -331,7 +330,7 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const } } else { - if(auto image_items_ptr = get(&*items)) + if(auto image_items_ptr = std::get_if(&items.value())) { if (image_items_ptr->polylines_item) { return tr("Only one polyline item is accepted"); @@ -357,8 +356,8 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const //because of selection order if (polylines_item != nullptr && items != std::nullopt) { - auto poly_items_ptr = get(&*items); - auto image_items_ptr = get(&*items); + auto poly_items_ptr = std::get_if(&items.value()); + auto image_items_ptr = std::get_if(&items.value()); if(poly_items_ptr && poly_items_ptr == nullptr) poly_items_ptr->polylines_item = polylines_item; else if(image_items_ptr && image_items_ptr == nullptr) @@ -368,7 +367,7 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const if (!items) { return tr("Selected objects can't be meshed"); } item = nullptr; features_protection_available = false; - if (auto poly_items = get(&*items)) { + if (auto poly_items = std::get_if(&items.value())) { auto& sm_items = poly_items->sm_items; if(sm_items.empty()) { return tr("ERROR: there must be at least one surface mesh item."); @@ -389,12 +388,12 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const features_protection_available = true; } # ifdef CGAL_MESH_3_DEMO_ACTIVATE_IMPLICIT_FUNCTIONS - else if (auto implicit_mesh_items = get(&*items)) { + else if (auto implicit_mesh_items = std::get_if(&items.value())) { item = implicit_mesh_items->function_item; } # endif # ifdef CGAL_MESH_3_DEMO_ACTIVATE_SEGMENTED_IMAGES - else if (auto image_mesh_items = get(&*items)) { + else if (auto image_mesh_items = std::get_if(&items.value())) { auto& image_item = image_mesh_items->image_item; item = image_item; features_protection_available = true; @@ -403,7 +402,7 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const if(item) { bbox = item->bbox(); - if (auto poly_items = get(&*items)) { + if (auto poly_items = std::get_if(&items.value())) { for (auto it : poly_items->sm_items) { bbox = bbox + it->bbox(); } @@ -435,28 +434,28 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, QMessageBox::warning(mw, tr("Mesh_3 plugin"), *error_string); return; } - using boost::get; + const bool more_than_one_item = - get(&*items) && - (get(&*items)->sm_items.size() > 1); + std::get_if(&items.value()) && + (std::get_if(&items.value())->sm_items.size() > 1); Scene_image_item* image_item = - get(&*items) - ? get(&*items)->image_item.get() + std::get_if(&items.value()) + ? std::get_if(&items.value())->image_item.get() : nullptr; Scene_surface_mesh_item* bounding_sm_item = - get(&*items) - ? get(&*items)->bounding_sm_item + std::get_if(&items.value()) + ? std::get_if(&items.value())->bounding_sm_item : nullptr; Scene_polylines_item* polylines_item = - get(&*items) - ? get(&*items)->polylines_item + std::get_if(&items.value()) + ? std::get_if(&items.value())->polylines_item : nullptr; - if (polylines_item == nullptr && get(&*items) != nullptr) - polylines_item = get(&*items)->polylines_item; + if (polylines_item == nullptr && std::get_if(&items.value()) != nullptr) + polylines_item = std::get_if(&items.value())->polylines_item; Scene_implicit_function_item* function_item = - get(&*items) - ? get(&*items)->function_item.get() + std::get_if(&items.value()) + ? std::get_if(&items.value())->function_item.get() : nullptr; // ----------------------------------- // Create Mesh dialog @@ -576,13 +575,13 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, ui.initializationGroup->setVisible(input_is_labeled_img); ui.grayImgGroup->setVisible(input_is_gray_img); - if (items->which() == POLYHEDRAL_MESH_ITEMS) + if (items->index() == POLYHEDRAL_MESH_ITEMS) ui.volumeGroup->setVisible(mesh_type == Mesh_type::VOLUME && nullptr != bounding_sm_item); else ui.volumeGroup->setVisible(mesh_type == Mesh_type::VOLUME); ui.sharpEdgesAngle->setValue(sharp_edges_angle_bound); - if (items->which() != POLYHEDRAL_MESH_ITEMS || polylines_item != nullptr) { + if (items->index() != POLYHEDRAL_MESH_ITEMS || polylines_item != nullptr) { ui.sharpEdgesAngleLabel->setVisible(false); ui.sharpEdgesAngle->setVisible(false); @@ -604,13 +603,13 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, const QString on_cube("Polylines on cube"); const QString triple_lines("Triple+ lines"); if (features_protection_available) { - if (items->which() == POLYHEDRAL_MESH_ITEMS) { + if (items->index() == POLYHEDRAL_MESH_ITEMS) { if (mesh_type == Mesh_type::SURFACE_ONLY) { ui.protectEdges->addItem(sharp_and_boundary); ui.protectEdges->addItem(boundary_only); } else ui.protectEdges->addItem(sharp_edges); - } else if (items->which() == IMAGE_MESH_ITEMS) { + } else if (items->index() == IMAGE_MESH_ITEMS) { if (polylines_item != nullptr) { ui.protectEdges->addItem(QString(input_polylines).append(" only")); ui.protectEdges->addItem(QString(on_cube).append(" and input polylines")); @@ -688,7 +687,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, : false; Meshing_thread* thread = nullptr; - switch (items->which()) { + switch (items->index()) { case POLYHEDRAL_MESH_ITEMS: { auto& poly_items = get(*items); auto& sm_items = poly_items.sm_items; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp index b8117997037c..8a46fc95c379 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp @@ -732,7 +732,7 @@ class Polyhedron_demo_point_set_shape_detection_plugin : ss << item->name().toStdString() << "_plane_"; std::shared_ptr > pshape - = boost::dynamic_pointer_cast > (shape); + = std::dynamic_pointer_cast > (shape); Kernel::Point_3 ref = CGAL::ORIGIN + pshape->plane_normal (); diff --git a/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h b/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h index 5ea95241e696..18d5e4b6cc83 100644 --- a/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h +++ b/SMDS_3/include/CGAL/SMDS_3/internal/indices_management.h @@ -141,9 +141,9 @@ struct Index_generator_with_features typedef Index type; }; -template -const T& get_index(const Boost_variant& x, - std::enable_if_t::value > * = 0) +template +const T& get_index(const Variant& x, + std::enable_if_t::value > * = 0) { return std::get(x); } template diff --git a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h index 3612ac02c705..88089e89e01a 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h +++ b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h @@ -895,7 +895,7 @@ class Efficient_RANSAC { for (std::size_t i = 0; i < m_extracted_shapes->size(); ++i) { std::shared_ptr pshape - = boost::dynamic_pointer_cast((*m_extracted_shapes)[i]); + = std::dynamic_pointer_cast((*m_extracted_shapes)[i]); // Ignore all shapes other than plane if (pshape != std::shared_ptr()) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp index e907bbbfe0be..5d995f6faa38 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp @@ -74,7 +74,7 @@ bool test_cone_parameters() { if (shapes.size() != 1) continue; - std::shared_ptr cone = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr cone = std::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cone. if (!cone) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp index 4d05c98d0681..8c3780e0368d 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp @@ -73,7 +73,7 @@ bool test_cylinder_parameters() { if (shapes.size() != 1) continue; - std::shared_ptr cyl = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr cyl = std::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cylinder. if (!cyl) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp index e47a2f472161..f0a8e772baa1 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp @@ -67,7 +67,7 @@ bool test_plane_parameters() { if (shapes.size() != 1) continue; - std::shared_ptr pl = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr pl = std::dynamic_pointer_cast((*shapes.first)); if (!pl) continue; diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp index c6dcb0e0999a..88f78d5326a9 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp @@ -70,7 +70,7 @@ bool test_sphere_parameters() { if (shapes.size() != 1) continue; - std::shared_ptr sphere = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr sphere = std::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cylinder. if (!sphere) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp index c380d26c7f95..3d39f70b4735 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp @@ -73,7 +73,7 @@ bool test_torus_parameters() { continue; std::shared_ptr torus = - boost::dynamic_pointer_cast((*shapes.first)); + std::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a torus. if (!torus) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h index 17b2c7edd358..798284fa04ea 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/flip_edges.h @@ -620,7 +620,7 @@ void find_best_flip_to_improve_dh(C3t3& c3t3, indices(facet_circulator->second, i)); if (curr_vertex != vh0 && curr_vertex != vh1) { - if (is_edge_uv(vh, curr_vertex, boost::get(o_inc_vh))) + if (is_edge_uv(vh, curr_vertex, o_inc_vh.value())) { is_edge = true; break; @@ -778,7 +778,7 @@ Sliver_removal_result flip_n_to_m(C3t3& c3t3, indices(facet_circulator->second, i)); if (curr_vertex != vh0 && curr_vertex != vh1) { - if (is_edge_uv(vh, curr_vertex, boost::get(o_inc_vh))) + if (is_edge_uv(vh, curr_vertex, o_inc_vh.value())) return NOT_FLIPPABLE; } } @@ -1202,7 +1202,7 @@ std::size_t flip_all_edges(const std::vector& edges, Cell_handle ch; int i0, i1; - if (is_edge_uv(vp.first, vp.second, boost::get(o_inc_vh), ch, i0, i1)) + if (is_edge_uv(vp.first, vp.second, o_inc_vh.value(), ch, i0, i1)) { Edge edge(ch, i0, i1); diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h index b9147708c012..d06a9c52a977 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_adaptive_remeshing_impl.h @@ -346,7 +346,7 @@ class Adaptive_remesher if(f_on_surface[i]) m_c3t3.remove_from_complex(c, i); else - m_c3t3.add_to_complex(c, i, patch.get()); + m_c3t3.add_to_complex(c, i, patch.value()); } m_c3t3.remove_from_complex(c); diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h index 5cf73bf46517..07848cbe492f 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h @@ -535,7 +535,7 @@ void set_index(typename C3t3::Vertex_handle v, const C3t3& c3t3) v->set_index(typename C3t3::Curve_index(1)); break; case 0: - v->set_index(std::get(v->index())); + v->set_index(Mesh_3::internal::get_index(v->index())); break; default: CGAL_assertion(false); From bdfa15c08f020308eb2899c30e212c9eb72fc6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Jun 2023 18:28:11 +0200 Subject: [PATCH 0366/1398] fixes after merge --- .../test/Intersections_3/intersection_test_helper.h | 4 +--- Intersections_3/test/Intersections_3/issue_5428.cpp | 2 +- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 2 +- Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h | 2 +- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 4 ++-- .../CGAL/constructions/Straight_skeleton_cons_ftC2.h | 8 ++++---- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Intersections_3/test/Intersections_3/intersection_test_helper.h b/Intersections_3/test/Intersections_3/intersection_test_helper.h index 2e9806ad03b6..167e18661fc4 100644 --- a/Intersections_3/test/Intersections_3/intersection_test_helper.h +++ b/Intersections_3/test/Intersections_3/intersection_test_helper.h @@ -309,10 +309,8 @@ struct Intersection_3_tester template bool compare_to_other_variant(const T& t) const { - if(ov->type() == typeid(T)) + if(auto* r = std::get_if(&*ov)) { - auto* r = std::get_if(&*ov); // ov is an optional - assert(r); return (t == *r); } diff --git a/Intersections_3/test/Intersections_3/issue_5428.cpp b/Intersections_3/test/Intersections_3/issue_5428.cpp index ba39e1bd1096..ba905ed12c5b 100644 --- a/Intersections_3/test/Intersections_3/issue_5428.cpp +++ b/Intersections_3/test/Intersections_3/issue_5428.cpp @@ -15,7 +15,7 @@ int main(int, char**) auto result = intersection(cub, pl); - const std::vector* res = boost::get >(&*result); + const std::vector* res = std::get_if >(&*result); for(const Point& p : *res) std::cout << p << std::endl; diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 49584ff06a7a..8e51389c173c 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -1148,7 +1148,7 @@ class Labeled_mesh_domain_3 Intersection operator()(const Segment_3& s) const { #ifndef CGAL_MESH_3_NO_LONGER_CALLS_DO_INTERSECT_3 - CGAL_precondition(r_domain_.do_intersect_surface_object()(s) != boost::none); + CGAL_precondition(r_domain_.do_intersect_surface_object()(s) != std::nullopt); #endif // NOT CGAL_MESH_3_NO_LONGER_CALLS_DO_INTERSECT_3 return this->operator()(s.source(),s.target()); } diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h index 309e39ae64f5..60abbe5d0bef 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -751,7 +751,7 @@ Refine_cells_3:: number_of_bad_elements_impl() { typedef typename MD::Subdomain_index Subdomain_index; - typedef boost::optional Subdomain; + typedef std::optional Subdomain; typedef typename Tr::Finite_cells_iterator Finite_cell_iterator; int count = 0; diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index 9802c09dd60a..5d242c1a604b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -1053,7 +1053,7 @@ Refine_facets_3:: number_of_bad_elements_impl() { typedef typename MD::Subdomain_index Subdomain_index; - typedef boost::optional Subdomain; + typedef std::optional Subdomain; typedef typename Tr::Finite_facets_iterator Finite_facet_iterator; int count = 0, count_num_bad_surface_facets = 0; @@ -1735,7 +1735,7 @@ is_facet_encroached(const Facet& facet, const Weighted_point& point) const { typedef typename MD::Subdomain_index Subdomain_index; - typedef boost::optional Subdomain; + typedef std::optional Subdomain; if ( r_tr_.is_infinite(facet) || ! this->is_facet_on_surface(facet) ) return false; diff --git a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h index 53397c44c21c..54ed84a64eaf 100644 --- a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h @@ -572,7 +572,7 @@ compute_artifical_isec_timeC2 ( Trisegment_2_ptr< Trisegment_2(&*inter_res)) + if(const Segment_2* seg = std::get_if(&*inter_res)) { // get the segment extremity closest to the seed Boolean res = (K().compare_distance_2_object()(*seed, seg->source(), seg->target()) == CGAL::SMALLER); @@ -581,7 +581,7 @@ compute_artifical_isec_timeC2 ( Trisegment_2_ptr< Trisegment_2(&*inter_res); + const Point_2* inter_pt = std::get_if(&*inter_res); if(!CGAL_NTS is_finite(inter_pt->x()) || !CGAL_NTS is_finite(inter_pt->y())) return std::nullopt; t = l0->a() * inter_pt->x() + l0->b() * inter_pt->y() + l0->c() ; @@ -879,12 +879,12 @@ construct_artifical_isecC2 ( Trisegment_2_ptr< Trisegment_2(&*inter_res)) + if(const Point_2* inter_pt = std::get_if(&*inter_res)) { bool ok = CGAL_NTS is_finite(inter_pt->x()) && CGAL_NTS is_finite(inter_pt->y()) ; return cgal_make_optional(ok, *inter_pt) ; } - else if(const Segment_2* seg = std::get(&*inter_res)) + else if(const Segment_2* seg = std::get_if(&*inter_res)) { // get the segment extremity closest to the seed const Point_2& pt = (K().compare_distance_2_object()(*seed, From 640c98f21e37d078e186e39c113f3025684f9d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Jun 2023 18:36:38 +0200 Subject: [PATCH 0367/1398] add utility to avoid duplicate in variant + use it in SMDS_3 --- .../CGAL/Simplicial_mesh_vertex_base_3.h | 4 +- STL_Extension/include/CGAL/variant.h | 87 +++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 STL_Extension/include/CGAL/variant.h diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index 04b6f19af185..24656da85e17 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -26,9 +26,9 @@ #include #include +#include #include -#include #include namespace CGAL { @@ -53,7 +53,7 @@ private : using Vertex_handle = typename Vb::Vertex_handle; // Types - using Index = std::variant; + using Index = Variant_with_no_duplicate_t; using FT = typename GT::FT; // Constructor diff --git a/STL_Extension/include/CGAL/variant.h b/STL_Extension/include/CGAL/variant.h new file mode 100644 index 000000000000..41bd836d8ccf --- /dev/null +++ b/STL_Extension/include/CGAL/variant.h @@ -0,0 +1,87 @@ +// Copyright (c) 2023 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Sébastien Loriot +// + +#ifndef CGAL_VARIANT_H +#define CGAL_VARIANT_H + +#include + +namespace CGAL +{ + +template +struct Is_in_variant; + +template +struct Is_in_variant> +{ + inline static constexpr bool value = + std::is_same_v || Is_in_variant>::value; +}; + +template +struct Is_in_variant> +{ + inline static constexpr bool value = std::is_same_v; +}; + +/// equals true iif `T` is a possible type in `Variant` with `Variant` being a `std::variant` +template +inline constexpr bool Is_in_variant_v = Is_in_variant::value; + +// -- +template +struct Add_to_variant; + +template +struct Add_to_variant> +{ + using type = std::variant; +}; + +/// a `std::variant` with `T` appended to the types of the `std::variant` `Variant` +template< class T, class Variant > +using Add_to_variant_t = typename Add_to_variant::type; + +namespace internal{ +template +struct Get_variant_impl +{ + using type = typename Get_variant_impl< + std::conditional_t, + Variant, + Add_to_variant_t>, + Tn...>::type; +}; + +template +struct Get_variant_impl +{ + using type = std::conditional_t, + Variant, + Add_to_variant_t>; +}; +} // end of internal namespace + +template +struct Variant_with_no_duplicate +{ + using type = typename internal::Get_variant_impl, Tn ...>::type; +}; + +/// a `std::variant` with types being all different +template< class ... Tn > +using Variant_with_no_duplicate_t = typename Variant_with_no_duplicate::type; + +} //end of CGAL namespace + +#endif From cb840ac84b153c286dd1e5879083df04c74462de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Jun 2023 18:42:13 +0200 Subject: [PATCH 0368/1398] boost::optional::get -> std::optional::value --- .../Algebraic_kernel_d/Curve_analysis_2.h | 20 +++++++------- .../Curve_pair_analysis_2.h | 6 ++--- .../CGAL/Arr_algebraic_segment_traits_2.h | 26 +++++++++---------- BGL/examples/BGL_triangulation_2/dijkstra.cpp | 4 +-- .../include/CGAL/Delaunay_triangulation.h | 2 +- .../include/CGAL/Regular_triangulation.h | 2 +- Triangulation/include/CGAL/Triangulation.h | 4 +-- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index a11c4283a988..ef940f968877 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -584,7 +584,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { */ void set_f(Polynomial_2 f) { CGAL_precondition(! has_defining_polynomial()); - if((! this->ptr()->f) || f!=this->ptr()->f.get()) { + if((! this->ptr()->f) || f!=this->ptr()->f.value()) { this->copy_on_write(); this->ptr()->f=f; } @@ -639,7 +639,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { //! Returns the defining polynomial Polynomial_2 polynomial_2() const { CGAL_precondition(bool(this->ptr()->f)); - return this->ptr()->f.get(); + return this->ptr()->f.value(); } public: @@ -714,8 +714,8 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { = event_line; event_coordinates()[i].stack = event_line; } - CGAL_postcondition(event_coordinates()[i].stack.get().is_event()); - return event_coordinates()[i].stack.get(); + CGAL_postcondition(event_coordinates()[i].stack.value().is_event()); + return event_coordinates()[i].stack.value(); } public: @@ -1349,7 +1349,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { } } } - return intermediate_values()[i].get(); + return intermediate_values()[i].value(); } @@ -1370,7 +1370,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->content) { compute_content_and_primitive_part(); } - return this->ptr()->content.get(); + return this->ptr()->content.value(); } public: @@ -1389,7 +1389,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->f_primitive) { compute_content_and_primitive_part(); } - return this->ptr()->f_primitive.get(); + return this->ptr()->f_primitive.value(); } Algebraic_kernel_with_analysis_2* kernel() const { @@ -1582,7 +1582,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->resultant_of_primitive_and_derivative_y) { compute_resultant_of_primitive_and_derivative_y(); } - return this->ptr()->resultant_of_primitive_and_derivative_y.get(); + return this->ptr()->resultant_of_primitive_and_derivative_y.value(); } private: @@ -1714,7 +1714,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->event_coordinates) { compute_event_coordinates(); } - return this->ptr()->event_coordinates.get(); + return this->ptr()->event_coordinates.value(); } private: @@ -1727,7 +1727,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { event_coordinates(); CGAL_assertion(bool(this->ptr()->intermediate_values)); } - return this->ptr()->intermediate_values.get(); + return this->ptr()->intermediate_values.value(); } diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index a38cf2ab659a..d350a27a2df8 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -1030,7 +1030,7 @@ class Curve_pair_analysis_2 : this->ptr()->event_slices[i] = create_event_slice(i); } CGAL_assertion(bool(this->ptr()->event_slices[i])); - return this->ptr()->event_slices[i].get(); + return this->ptr()->event_slices[i].value(); } @@ -1045,7 +1045,7 @@ class Curve_pair_analysis_2 : } - return intermediate_slices()[i].get(); + return intermediate_slices()[i].valuen(); } //! Returns bound representative value at the ith interval @@ -1074,7 +1074,7 @@ class Curve_pair_analysis_2 : } } CGAL_assertion(bool(intermediate_values()[i])); - return intermediate_values()[i].get(); + return intermediate_values()[i].value(); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h index b1678fe4acdd..ca15a9b2752a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h @@ -293,39 +293,39 @@ class Arr_algebraic_segment_traits_2 { it_seg_p = std::get(&(*it)); } - bool left_on_arc = start && on_arc(start.get(), *it_seg_p); - bool right_on_arc = end && on_arc(end.get(), *it_seg_p); + bool left_on_arc = start && on_arc(start.value(), *it_seg_p); + bool right_on_arc = end && on_arc(end.value(), *it_seg_p); if ( left_on_arc && right_on_arc ) { - segs.push_back(it_seg_p->trim(start.get(),end.get())); + segs.push_back(it_seg_p->trim(start.value(),end.value())); } if (left_on_arc && (!right_on_arc)) { if (!it_seg_p->is_finite(CGAL::ARR_MAX_END) || - !equal(start.get(),right(*it_seg_p))) { + !equal(start.value(),right(*it_seg_p))) { if (it_seg_p->is_finite(CGAL::ARR_MIN_END) && - equal(start.get(),left(*it_seg_p))) + equal(start.value(),left(*it_seg_p))) { segs.push_back(*it_seg_p); } else { X_monotone_curve_2 split1,split2; - it_seg_p->split(start.get(),split1,split2); + it_seg_p->split(start.value(),split1,split2); segs.push_back(split2); } } } if ((!left_on_arc) && right_on_arc) { if (!it_seg_p->is_finite(CGAL::ARR_MIN_END) || - ! equal(left(*it_seg_p), end.get())) + ! equal(left(*it_seg_p), end.value())) { if (it_seg_p->is_finite(CGAL::ARR_MAX_END) && - equal(end.get(), right(*it_seg_p))) + equal(end.value(), right(*it_seg_p))) { segs.push_back(*it_seg_p); } else { X_monotone_curve_2 split1,split2; - it_seg_p->split(end.get(), split1, split2); + it_seg_p->split(end.value(), split1, split2); segs.push_back(split1); } } @@ -354,8 +354,8 @@ class Arr_algebraic_segment_traits_2 { it--; it_seg_p = std::get(&(*it)); } - if (start && on_arc(start.get(),*it_seg_p)) { - segs.push_front(it_seg_p->trim(start.get(), right(*it_seg_p))); + if (start && on_arc(start.value(),*it_seg_p)) { + segs.push_front(it_seg_p->trim(start.value(), right(*it_seg_p))); break; } else { @@ -384,8 +384,8 @@ class Arr_algebraic_segment_traits_2 { CGAL_assertion(it != arcs.end()); it_seg_p = std::get(&(*it)); } - if(end && on_arc(end.get(),*it_seg_p)) { - segs.push_back(it_seg_p->trim(left(*it_seg_p),end.get())); + if(end && on_arc(end.value(),*it_seg_p)) { + segs.push_back(it_seg_p->trim(left(*it_seg_p),end.value())); break; } else { diff --git a/BGL/examples/BGL_triangulation_2/dijkstra.cpp b/BGL/examples/BGL_triangulation_2/dijkstra.cpp index 87c308e18bb2..1e63fc8810f1 100644 --- a/BGL/examples/BGL_triangulation_2/dijkstra.cpp +++ b/BGL/examples/BGL_triangulation_2/dijkstra.cpp @@ -60,9 +60,9 @@ int main(int argc,char* argv[]) for(vertex_descriptor vd : vertices(tr)) { std::cout << vd->point() << " [" << vertex_id_map[vd] << "] "; - std::cout << " has distance = " << std::get(distance_pmap,vd) + std::cout << " has distance = " << get(distance_pmap,vd) << " and predecessor "; - vd = std::get(predecessor_pmap,vd); + vd = get(predecessor_pmap,vd); std::cout << vd->point() << " [" << vertex_id_map[vd] << "]\n "; } diff --git a/Triangulation/include/CGAL/Delaunay_triangulation.h b/Triangulation/include/CGAL/Delaunay_triangulation.h index 1dd1929cb682..a2203ee762ef 100644 --- a/Triangulation/include/CGAL/Delaunay_triangulation.h +++ b/Triangulation/include/CGAL/Delaunay_triangulation.h @@ -145,7 +145,7 @@ class Delaunay_triangulation { if(!*fop) *fop=cfo(a,b); - return ifsoos(fop->get(),a,b,p); + return ifsoos(fop->value(),a,b,p); } }; public: diff --git a/Triangulation/include/CGAL/Regular_triangulation.h b/Triangulation/include/CGAL/Regular_triangulation.h index 8294cb655980..b2e6a651d492 100644 --- a/Triangulation/include/CGAL/Regular_triangulation.h +++ b/Triangulation/include/CGAL/Regular_triangulation.h @@ -144,7 +144,7 @@ class Regular_triangulation { if(!*fop) *fop=cfo(a,b); - return ifpt(fop->get(),a,b,p); + return ifpt(fop->value(),a,b,p); } }; diff --git a/Triangulation/include/CGAL/Triangulation.h b/Triangulation/include/CGAL/Triangulation.h index 1dc8e1a34592..9a3e4aecb47b 100644 --- a/Triangulation/include/CGAL/Triangulation.h +++ b/Triangulation/include/CGAL/Triangulation.h @@ -101,10 +101,10 @@ class Triangulation template CGAL::Orientation operator()(Iter a, Iter b) const { + return ifo(fop->value(),a,b); if (*fop) - return ifo(fop->get(),a,b); *fop = cfo(a,b); - CGAL_assertion(ifo(fop->get(),a,b) == CGAL::POSITIVE); + CGAL_assertion(ifo(fop->value(),a,b) == CGAL::POSITIVE); return CGAL::POSITIVE; } }; From f240a47451a2323d6ac589cfdd885e2b10428e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 14 Jun 2023 18:45:35 +0200 Subject: [PATCH 0369/1398] boost::get -> std::get_if --- .../algebraic_segments.cpp | 2 +- .../edge_manipulation_curve_history.cpp | 2 +- .../point_location_utils.h | 12 +++---- .../unb_planar_vertical_decomposition.cpp | 8 ++--- .../include/CGAL/Arr_accessor.h | 6 ++-- .../CGAL/Arr_algebraic_segment_traits_2.h | 14 ++++---- .../CGAL/Arr_circular_line_arc_traits_2.h | 36 +++++++++---------- .../include/CGAL/Arr_curve_data_traits_2.h | 4 +-- .../Bezier_bounding_rational_traits.h | 8 ++--- .../include/CGAL/Arr_linear_traits_2.h | 2 +- .../CGAL/Arr_non_caching_segment_traits_2.h | 4 +-- .../Trapezoidal_decomposition_2_impl.h | 2 +- .../include/CGAL/Arr_point_location_result.h | 2 +- .../include/CGAL/Arr_polycurve_traits_2.h | 16 ++++----- .../include/CGAL/Arr_segment_traits_2.h | 2 +- .../include/CGAL/Arr_tracing_traits_2.h | 8 ++--- .../Arrangement_on_surface_2_global.h | 34 +++++++++--------- .../Arrangement_on_surface_2_impl.h | 4 +-- .../Arrangement_2/Arrangement_zone_2_impl.h | 18 +++++----- .../Surface_sweep_2/Arr_insertion_traits_2.h | 6 ++-- .../Surface_sweep_2/Arr_overlay_ss_visitor.h | 4 +-- .../Surface_sweep_2/Arr_overlay_traits_2.h | 8 ++--- .../simple_polygon_visibility_2.cpp | 2 +- 23 files changed, 102 insertions(+), 102 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp index c1bc7c4779d9..69c4a66ea689 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp @@ -52,7 +52,7 @@ int main() { // but not in this case). std::vector segs; for(size_t i = 0; i < pre_segs.size(); ++i) { - auto* curr_p = std::get(&pre_segs[i]); + auto* curr_p = std::get_if(&pre_segs[i]); assert(curr_p); segs.push_back(*curr_p); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp index c1ee293fd271..bd636bc94fe5 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/edge_manipulation_curve_history.cpp @@ -45,7 +45,7 @@ int main() { Point_location pl(arr); const Point q{_7_halves, 7}; Point_location::result_type obj = pl.locate(q); - auto* e = std::get(&obj); + auto* e = std::get_if(&obj); // Split the edge e to two edges e1 and e2; auto e1 = arr.split_edge(arr.non_const_handle(*e), q); diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h index f50236bb3e51..d6c29e08bac7 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h @@ -46,13 +46,13 @@ void print_point_location const Face_const_handle* f; std::cout << "The point (" << q << ") is located "; - if ((f = std::get(&obj))) // inside a face + if ((f = std::get_if(&obj))) // inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face." << std::endl; - else if ((e = std::get(&obj))) // on an edge + else if ((e = std::get_if(&obj))) // on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; - else if ((v = std::get(&obj))) // on a vertex + else if ((v = std::get_if(&obj))) // on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; else CGAL_error_msg("Invalid object."); @@ -101,12 +101,12 @@ void shoot_vertical_ray(const VerticalRayShooting& vrs, std::cout << "Shooting up from (" << q << ") : hit "; - if ((v = std::get(&obj))) // hit a vertex + if ((v = std::get_if(&obj))) // hit a vertex std::cout << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; - else if ((e = std::get(&obj)) ) // hit an edge + else if ((e = std::get_if(&obj)) ) // hit an edge std::cout << "an edge: " << (*e)->curve() << std::endl; - else if ((f = std::get(&obj))) { // hit nothing + else if ((f = std::get_if(&obj))) { // hit nothing assert((*f)->is_unbounded()); std::cout << "nothing." << std::endl; } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp index d51f4fae3894..0b31dc9655bf 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp @@ -41,10 +41,10 @@ int main() { std::cout << " feature below: "; if (! curr.first) std::cout << "EMPTY"; else { - auto* vh = std::get(&*(curr.first));; + auto* vh = std::get_if(&*(curr.first));; if (vh) std::cout << '(' << (*vh)->point() << ')'; else { - auto* hh = std::get(&*(curr.first)); + auto* hh = std::get_if(&*(curr.first)); if (! (*hh)->is_fictitious()) std::cout << '[' << (*hh)->curve() << ']'; else std::cout << "NONE"; @@ -54,10 +54,10 @@ int main() { std::cout << " feature above: "; if (! curr.second) std::cout << "EMPTY\n"; else { - auto* vh = std::get(&*(curr.second));; + auto* vh = std::get_if(&*(curr.second));; if (vh) std::cout << '(' << (*vh)->point() << ")\n"; else { - auto* hh = std::get(&*(curr.second)); + auto* hh = std::get_if(&*(curr.second)); if (! (*hh)->is_fictitious()) std::cout << '[' << (*hh)->curve() << "]\n"; else std::cout << "NONE\n"; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h b/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h index 202ca448b5e9..bb60e54d2245 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_accessor.h @@ -114,13 +114,13 @@ class Arr_accessor { auto obj = p_arr->topology_traits()->locate_curve_end(cv, ind, ps_x, ps_y); // Return a handle to the DCEL feature. - DFace** f_p = std::get(&obj); + DFace** f_p = std::get_if(&obj); if (f_p) return (Pl_result::make_result(p_arr->_const_handle_for(*f_p))); - DHalfedge** he_p = std::get(&obj); + DHalfedge** he_p = std::get_if(&obj); if (he_p) return (Pl_result::make_result(p_arr->_const_handle_for(*he_p))); - DVertex** v_p = std::get(&obj); + DVertex** v_p = std::get_if(&obj); if (v_p) return (Pl_result::make_result(p_arr->_const_handle_for(*v_p))); // We should never reach here: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h index ca15a9b2752a..af9b28db6f21 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h @@ -286,11 +286,11 @@ class Arr_algebraic_segment_traits_2 { this->_ckva()->make_x_monotone_2_object()(cv, std::back_inserter(arcs)); auto it = arcs.begin(); auto helper = it; - const auto* it_seg_p = std::get(&(*it)); + const auto* it_seg_p = std::get_if(&(*it)); while (it != arcs.end()) { if ( on_arc(p, *it_seg_p) ) break; it++; - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); } bool left_on_arc = start && on_arc(start.value(), *it_seg_p); @@ -348,11 +348,11 @@ class Arr_algebraic_segment_traits_2 { } CGAL_assertion(it != arcs.begin()); it--; - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); while (! on_arc(point_it, *it_seg_p)) { CGAL_assertion(it != arcs.begin()); it--; - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); } if (start && on_arc(start.value(),*it_seg_p)) { segs.push_front(it_seg_p->trim(start.value(), right(*it_seg_p))); @@ -365,7 +365,7 @@ class Arr_algebraic_segment_traits_2 { } if (! right_on_arc) { it = helper; // reset - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); Point_2 point_it; while (true) { if (it_seg_p->is_finite(CGAL::ARR_MAX_END) && @@ -378,11 +378,11 @@ class Arr_algebraic_segment_traits_2 { } it++; CGAL_assertion(it != arcs.end()); - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); while(! on_arc(point_it, *it_seg_p)) { it++; CGAL_assertion(it != arcs.end()); - it_seg_p = std::get(&(*it)); + it_seg_p = std::get_if(&(*it)); } if(end && on_arc(end.value(),*it_seg_p)) { segs.push_back(it_seg_p->trim(left(*it_seg_p),end.value())); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index c48fa96917c7..ba387ee0804e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -85,23 +85,23 @@ namespace CGAL { const std::variant< Arc1, Arc2 > &a2, const Circular_arc_point_2 &p) const { - if ( const Arc1* arc1 = std::get( &a1 ) ){ - if ( const Arc1* arc2 = std::get( &a2 ) ){ + if ( const Arc1* arc1 = std::get_if( &a1 ) ){ + if ( const Arc1* arc2 = std::get_if( &a2 ) ){ return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2, p); } else { - const Arc2* arc2e = std::get( &a2 ); + const Arc2* arc2e = std::get_if( &a2 ); return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2e, p); } } - const Arc2* arc1 = std::get( &a1 ); - if ( const Arc1* arc2 = std::get( &a2 ) ){ + const Arc2* arc1 = std::get_if( &a1 ); + if ( const Arc1* arc2 = std::get_if( &a2 ) ){ return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2, p); } - const Arc2* arc2e = std::get( &a2 ); + const Arc2* arc2e = std::get_if( &a2 ); return CircularKernel() .compare_y_to_right_2_object()(*arc1, *arc2e, p); } @@ -189,11 +189,11 @@ namespace CGAL { operator() (const Circular_arc_point_2 &p, const std::variant< Arc1, Arc2 > &A1) const { - if ( const Arc1* arc1 = std::get( &A1 ) ){ + if ( const Arc1* arc1 = std::get_if( &A1 ) ){ return CircularKernel().compare_y_at_x_2_object()(p, *arc1); } else { - const Arc2* arc2 = std::get( &A1 ); + const Arc2* arc2 = std::get_if( &A1 ); return CircularKernel().compare_y_at_x_2_object()(p, *arc2); } } @@ -250,7 +250,7 @@ namespace CGAL { operator()(const std::variant &A, OutputIterator res) const { - if ( const Arc1* arc1 = std::get( &A ) ) { + if ( const Arc1* arc1 = std::get_if( &A ) ) { std::vector container; CircularKernel(). make_x_monotone_2_object()(*arc1,std::back_inserter(container)); @@ -258,7 +258,7 @@ namespace CGAL { (container, res); } else { - const Arc2* arc2 = std::get( &A ); + const Arc2* arc2 = std::get_if( &A ); std::vector container; CircularKernel(). make_x_monotone_2_object()(*arc2,std::back_inserter(container)); @@ -281,19 +281,19 @@ namespace CGAL { const std::variant< Arc1, Arc2 > &c2, OutputIterator oi) const { - if ( const Arc1* arc1 = std::get( &c1 ) ){ - if ( const Arc1* arc2 = std::get( &c2 ) ){ + if ( const Arc1* arc1 = std::get_if( &c1 ) ){ + if ( const Arc1* arc2 = std::get_if( &c2 ) ){ return CircularKernel().intersect_2_object()(*arc1, *arc2, oi); } - const Arc2* arc2 = std::get( &c2 ); + const Arc2* arc2 = std::get_if( &c2 ); return CircularKernel().intersect_2_object()(*arc1, *arc2, oi); } - const Arc2* arc1e = std::get( &c1 ); - if ( const Arc1* arc2 = std::get( &c2 ) ){ + const Arc2* arc1e = std::get_if( &c1 ); + if ( const Arc1* arc2 = std::get_if( &c2 ) ){ return CircularKernel().intersect_2_object()(*arc1e, *arc2, oi); } - const Arc2* arc2 = std::get( &c2 ); + const Arc2* arc2 = std::get_if( &c2 ); return CircularKernel().intersect_2_object()(*arc1e, *arc2, oi); } @@ -314,7 +314,7 @@ namespace CGAL { std::variant< Arc1, Arc2 > &ca2) const { // TODO : optimize by extracting the references from the variants ? - if ( const Arc1* arc1 = std::get( &A ) ){ + if ( const Arc1* arc1 = std::get_if( &A ) ){ Arc1 carc1; Arc1 carc2; CircularKernel().split_2_object()(*arc1, p, carc1, carc2); @@ -324,7 +324,7 @@ namespace CGAL { } else{ - const Arc2* arc2 = std::get( &A ); + const Arc2* arc2 = std::get_if( &A ); Arc2 cline1; Arc2 cline2; CircularKernel().split_2_object()(*arc2, p, cline1, cline2); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h index f487c0552215..e8bb9a707035 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h @@ -138,12 +138,12 @@ class Arr_curve_data_traits_2 : public Traits_ { // Attach the data to each of the resulting x-monotone curves. X_monotone_curve_data xdata = Convert()(cv.data()); for (const auto& base_obj : base_objects) { - if (const auto* bxcv = std::get(&base_obj)) { + if (const auto* bxcv = std::get_if(&base_obj)) { *oi++ = Make_x_monotone_result(X_monotone_curve_2(*bxcv, xdata)); continue; } // Current object is an isolated point: Leave it as is. - const auto* bp = std::get(&base_obj); + const auto* bp = std::get_if(&base_obj); CGAL_assertion(bp); *oi++ = Make_x_monotone_result(*bp); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h index 8b3abe1f57f2..705682f05ca9 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_bounding_rational_traits.h @@ -1264,22 +1264,22 @@ class Bezier_bounding_rational_traits Control_points aux_vec; auto res1 = f_intersect(skew1a, skew2a); - const Point_2* p1 = std::get(&*res1); + const Point_2* p1 = std::get_if(&*res1); if (! p1) CGAL_error(); aux_vec.push_back(*p1); auto res2 = f_intersect(skew1a, skew2b); - const Point_2* p2 = std::get(&*res2); + const Point_2* p2 = std::get_if(&*res2); if (! p2) CGAL_error(); aux_vec.push_back(*p2); auto res3 = f_intersect(skew1b, skew2a); - const Point_2* p3 = std::get(&*res3); + const Point_2* p3 = std::get_if(&*res3); if (! p3) CGAL_error(); aux_vec.push_back(*p3); auto res4 = f_intersect (skew1b, skew2b); - const Point_2* p4 = std::get(&*res4); + const Point_2* p4 = std::get_if(&*res4); if (! p4) CGAL_error(); aux_vec.push_back(*p4); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h index 079f5534e832..ef830934d74b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h @@ -1340,7 +1340,7 @@ class Arr_linear_traits_2 : public Kernel_ { if (! res) return oi; // Check whether we have a single intersection point. - const Point_2* ip = std::get(&*res); + const Point_2* ip = std::get_if(&*res); if (ip != nullptr) { // Check whether the intersection point ip lies on both segments. const bool ip_on_cv1 = cv1.is_vertical() ? diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h index 636d669eb36f..d3397599ae68 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h @@ -234,7 +234,7 @@ class Arr_non_caching_segment_traits_2 : if (! res) return oi; // Check if the intersection is a point: - const Point_2* p_p = std::get(&*res); + const Point_2* p_p = std::get_if(&*res); if (p_p != nullptr) { // Create a pair representing the point with its multiplicity, // which is always 1 for line segments for all practical purposes. @@ -246,7 +246,7 @@ class Arr_non_caching_segment_traits_2 : } // The intersection is a segment. - const X_monotone_curve_2* cv_p = std::get(&*res); + const X_monotone_curve_2* cv_p = std::get_if(&*res); CGAL_assertion(cv_p != nullptr); Comparison_result cmp1 = m_traits.compare_endpoints_xy_2_object()(cv1); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h index 7da418861f07..9b0a76171141 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h @@ -219,7 +219,7 @@ deactivate_trapezoid(Dag_node& trpz_node, Dag_node* active_node) const CGAL_precondition(traits->is_active(trpz_node.get_data())); CGAL_precondition(traits->is_td_trapezoid(trpz_node.get_data())); if (Td_active_trapezoid* trap = - std::get(&trpz_node.get_data())) + std::get_if(&trpz_node.get_data())) trap->non_recursive_clear_neighbors(); trpz_node.set_data(Td_inactive_trapezoid()); if (active_node) trpz_node.set_left_child(*active_node); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h index 8516cc85be2d..15320d02bcdb 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h @@ -99,7 +99,7 @@ struct Arr_point_location_result { template static - inline const T* assign(const Type* obj) { return std::get(obj); } + inline const T* assign(const Type* obj) { return std::get_if(obj); } #endif // CGAL_ARR_POINT_LOCATION_VERSION < 2 //this one is only to remove warnings in functions diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index 4998f53d6463..a7aa0c32786d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -212,7 +212,7 @@ class Arr_polycurve_traits_2 : for (auto its = cv.subcurves_begin(); its != cv.subcurves_end(); ++its) make_seg_x_monotone(*its, std::back_inserter(x_seg_objects)); auto it = x_seg_objects.begin(); - const auto* x_seg_p = std::get(&(*it)); + const auto* x_seg_p = std::get_if(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -260,7 +260,7 @@ class Arr_polycurve_traits_2 : #endif for (++it; it != x_seg_objects.end(); ++it) { - const auto* x_seg_p = std::get(&(*it)); + const auto* x_seg_p = std::get_if(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -350,7 +350,7 @@ class Arr_polycurve_traits_2 : for (auto its = cv.subcurves_begin(); its != cv.subcurves_end(); ++its) make_seg_x_monotone(*its, std::back_inserter(x_seg_objects)); auto it = x_seg_objects.begin(); - const auto* x_seg_p = std::get(&(*it)); + const auto* x_seg_p = std::get_if(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -398,7 +398,7 @@ class Arr_polycurve_traits_2 : #endif for (++it; it != x_seg_objects.end(); ++it) { - const auto* x_seg_p = std::get(&(*it)); + const auto* x_seg_p = std::get_if(&(*it)); #if ! defined (CGAL_NO_ASSERTIONS) CGAL_assertion(x_seg_p != nullptr); #endif @@ -824,7 +824,7 @@ class Arr_polycurve_traits_2 : intersect(cv1[i1], cv2[i2], std::back_inserter(xections)); for (const auto& xection : xections) { const X_monotone_subcurve_2* subcv_p = - std::get(&xection); + std::get_if(&xection); if (subcv_p != nullptr) { ocv.push_back(*subcv_p); oi = output_ocv (ocv, invert_ocv, oi); @@ -832,7 +832,7 @@ class Arr_polycurve_traits_2 : } const Intersection_point* p_p = - std::get(&xection); + std::get_if(&xection); if (p_p != nullptr) *oi++ = Intersection_result(*p_p); } } @@ -846,7 +846,7 @@ class Arr_polycurve_traits_2 : for (const auto& item : sub_xections) { const X_monotone_subcurve_2* x_seg = - std::get(&item); + std::get_if(&item); if (x_seg != nullptr) { X_monotone_subcurve_2 seg = *x_seg; // We maintain the variant that if the input curves have opposite @@ -863,7 +863,7 @@ class Arr_polycurve_traits_2 : } const Intersection_point* p_ptr = - std::get(&item); + std::get_if(&item); if (p_ptr != nullptr) { // Any point that is not equal to the max_vertex of the // subcurve should be inserted into oi. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h index ccaa389826aa..15a3cffe63d8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h @@ -724,7 +724,7 @@ class Arr_segment_traits_2 : public Kernel_ { CGAL_assertion(bool(res)); // Check if we have a single intersection point. - const Point_2* ip = std::get(&*res); + const Point_2* ip = std::get_if(&*res); if (ip != nullptr) { CGAL_assertion(cv1.is_vertical() ? m_traits.is_in_y_range_2_object()(cv1, *ip) : 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 06f095fb54c4..4778a4fe9131 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 @@ -540,12 +540,12 @@ class Arr_tracing_traits_2 : public Base_traits { size_t i = 0; for (auto it = container.begin(); it != container.end(); ++it) { - if (const auto* xcv = std::get(&*it)) { + if (const auto* xcv = std::get_if(&*it)) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; continue; } - if (const auto* p = std::get(&*it)) { + if (const auto* p = std::get_if(&*it)) { std::cout << " result[" << i++ << "]: p: " << *p << std::endl; continue; } @@ -632,13 +632,13 @@ class Arr_tracing_traits_2 : public Base_traits { unsigned int i = 0; for (const auto& item : container) { - const X_monotone_curve_2* xcv = std::get(&item); + const X_monotone_curve_2* xcv = std::get_if(&item); if (xcv != nullptr) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; continue; } - const Intersection_point* ip = std::get(&item); + const Intersection_point* ip = std::get_if(&item); if (ip != nullptr) { std::cout << " result[" << i++ << "]: p: " << ip->first << ", multiplicity: " << ip->second << std::endl; diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index 0338b67e73e7..ee81a3e8a874 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -100,7 +100,7 @@ void insert(Arrangement_on_surface_2& arr, // Insert each x-monotone curve into the arrangement. for (const auto& x_obj : x_objects) { // Act according to the type of the current object. - const auto* x_curve = std::get(&x_obj); + const auto* x_curve = std::get_if(&x_obj); if (x_curve != nullptr) { // Inserting an x-monotone curve: // Initialize the zone-computation object with the given curve. @@ -118,7 +118,7 @@ void insert(Arrangement_on_surface_2& arr, arr_access.notify_after_global_change(); continue; } - const auto* iso_p = std::get(&x_obj); + const auto* iso_p = std::get_if(&x_obj); CGAL_assertion(iso_p != nullptr); // Inserting a point into the arrangement: @@ -683,7 +683,7 @@ insert_non_intersecting_curve // The endpoint must not lie on an existing edge, but may coincide with // and existing vertex vh1. - CGAL_precondition_msg(std::get(&obj1) == nullptr, + CGAL_precondition_msg(std::get_if(&obj1) == nullptr, "The curve must not intersect an existing edge."); } @@ -691,7 +691,7 @@ insert_non_intersecting_curve // We have a left end with boundary conditions. Use the accessor to locate // the feature that contains it. obj1 = arr_access.locate_curve_end(c, ARR_MIN_END, bx1, by1); - CGAL_precondition_msg(std::get(&obj1) == nullptr, + CGAL_precondition_msg(std::get_if(&obj1) == nullptr, "The curve must not overlap an existing edge."); } vh1 = Pl_result::template assign(&obj1); @@ -710,7 +710,7 @@ insert_non_intersecting_curve // The endpoint must not lie on an existing edge, but may coincide with // and existing vertex vh2. - CGAL_precondition_msg(std::get(&obj2) == nullptr, + CGAL_precondition_msg(std::get_if(&obj2) == nullptr, "The curve must not intersect an existing edge."); } else { @@ -721,7 +721,7 @@ insert_non_intersecting_curve // << ", by2: " << by2 // << std::endl; obj2 = arr_access.locate_curve_end(c, ARR_MAX_END, bx2, by2); - CGAL_precondition_msg(std::get(&obj2) == nullptr, + CGAL_precondition_msg(std::get_if(&obj2) == nullptr, "The curve must not overlap an existing edge."); } vh2 = Pl_result::template assign(&obj2); @@ -766,8 +766,8 @@ insert_non_intersecting_curve // we must insert the curve in the interior of a face. // In this case insert_in_face_interior() already returns a halfedge // directed from left to right. - const Face_const_handle* fh1 = std::get(&obj1); - const Face_const_handle* fh2 = std::get(&obj2); + const Face_const_handle* fh1 = std::get_if(&obj1); + const Face_const_handle* fh2 = std::get_if(&obj2); // std::cout << arr << std::endl; // std::cout << "(*fh1)->number_of_outer_ccbs(): " @@ -1144,14 +1144,14 @@ insert_point(Arrangement_on_surface_2& arr, arr_access.notify_before_global_change(); - const Face_const_handle* fh = std::get(&obj); + const Face_const_handle* fh = std::get_if(&obj); if (fh != nullptr) { // p lies inside a face: Insert it as an isolated vertex it the interior of // this face. vh_for_p = arr.insert_in_face_interior(p, arr.non_const_handle(*fh)); } else { - const Halfedge_const_handle* hh = std::get(&obj); + const Halfedge_const_handle* hh = std::get_if(&obj); if (hh != nullptr) { // p lies in the interior of an edge: Split this edge to create a new // vertex associated with p. @@ -1167,7 +1167,7 @@ insert_point(Arrangement_on_surface_2& arr, } else { // p lies on an existing vertex, so we just update this vertex. - const Vertex_const_handle* vh = std::get(&obj); + const Vertex_const_handle* vh = std::get_if(&obj); CGAL_assertion(vh != nullptr); vh_for_p = arr.modify_vertex (arr.non_const_handle (*vh), p); } @@ -1381,14 +1381,14 @@ is_valid(const Arrangement_on_surface_2& arr) auto obj = def_pl.ray_shoot_down(curr_v->point()); // if (CGAL::assign(he_below, obj)) { - if (auto* he_below_p = std::get(&obj)) { + if (auto* he_below_p = std::get_if(&obj)) { // Hit an edge; take the incident face of the halfedge directed to the // right. auto he_below = *he_below_p; in_face = (he_below->direction() == ARR_RIGHT_TO_LEFT) ? he_below->twin()->face() : he_below->face(); } - else if (auto* v_below_p = std::get(&obj)) { + else if (auto* v_below_p = std::get_if(&obj)) { auto v_below = *v_below_p; // Hit a vertex. if (v_below->is_isolated()) in_face = v_below->face(); @@ -1446,7 +1446,7 @@ is_valid(const Arrangement_on_surface_2& arr) } } else { - auto* in_face_p = std::get(&obj); + auto* in_face_p = std::get_if(&obj); CGAL_assertion(in_face_p); in_face = *in_face_p; // Hit nothing (an unbounded face is returned). @@ -1596,20 +1596,20 @@ do_intersect(Arrangement_on_surface_2& arr, // Insert each x-monotone curve into the arrangement. for (const auto& x_obj : x_objects) { // Act according to the type of the current object. - const X_monotone_curve_2* x_curve = std::get(&x_obj); + const X_monotone_curve_2* x_curve = std::get_if(&x_obj); if (x_curve != nullptr) { // Check if the x-monotone subcurve intersects the arrangement. if (do_intersect(arr, *x_curve, pl) == true) return true; continue; } - const Point_2* iso_p = std::get(&x_obj); + const Point_2* iso_p = std::get_if(&x_obj); CGAL_assertion(iso_p != nullptr); // Check whether the isolated point lies inside a face (otherwise, // it coincides with a vertex or an edge). auto obj = pl.locate(*iso_p); - if (std::get(&x_obj) != nullptr) return true; + if (std::get_if(&x_obj) != nullptr) return true; } // If we reached here, the curve does not intersect the arrangement. diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h index cbadba8f07ac..7ac1332586d8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h @@ -2253,7 +2253,7 @@ _place_and_set_curve_end(DFace* f, return v; } - DHalfedge** fict_he_p = std::get(&*obj); + DHalfedge** fict_he_p = std::get_if(&*obj); if (fict_he_p != nullptr) { DHalfedge* fict_he = *fict_he_p; CGAL_assertion(fict_he != nullptr); @@ -2273,7 +2273,7 @@ _place_and_set_curve_end(DFace* f, Halfedge_handle((*p_pred)->next())); return v; } - DVertex** v_p = std::get(&*obj); + DVertex** v_p = std::get_if(&*obj); CGAL_assertion(v_p != nullptr); DVertex* v = *v_p; CGAL_assertion(v != nullptr); diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index 484f2a46efe4..5d1e19f73c73 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -103,7 +103,7 @@ void Arrangement_zone_2::compute_zone() const Vertex_const_handle* vh; const Halfedge_const_handle* hh; - if ((vh = std::get(&m_obj)) != nullptr) { + if ((vh = std::get_if(&m_obj)) != nullptr) { CGAL_assertion(m_has_left_pt); // The left endpoint coincides with an existing vertex: @@ -125,7 +125,7 @@ void Arrangement_zone_2::compute_zone() #endif } - else if ((hh = std::get(&m_obj)) != nullptr) { + else if ((hh = std::get_if(&m_obj)) != nullptr) { if (m_has_left_pt) { // Obtain the right halfedge from the halfedge-pair containing m_left_pt // in their interior. @@ -166,7 +166,7 @@ void Arrangement_zone_2::compute_zone() } else { // The left endpoint lies inside a face. - const Face_const_handle* fh = std::get(&m_obj); + const Face_const_handle* fh = std::get_if(&m_obj); CGAL_assertion_msg(fh != nullptr, "Invalid object returned by the point-location query."); @@ -546,7 +546,7 @@ _compute_next_intersection(Halfedge_handle he, // (if the left point exists). while (! inter_list.empty()) { // Compare that current object with m_left_pt (if exists). - ip = std::get(&(inter_list.front())); + ip = std::get_if(&(inter_list.front())); if (ip != nullptr) { // We have an intersection point if (m_left_on_boundary) { @@ -570,7 +570,7 @@ _compute_next_intersection(Halfedge_handle he, } else { // We have an overlapping subcurve. - icv = std::get(&(inter_list.front())); + icv = std::get_if(&(inter_list.front())); CGAL_assertion(icv != nullptr); if (is_closed(*icv, ARR_MIN_END)) { @@ -608,7 +608,7 @@ _compute_next_intersection(Halfedge_handle he, // Discard all intersection lying to the left of m_left_pt (if exists). while (! inter_list.empty()) { // Compare that current object with m_left_pt (if exists). - ip = std::get(&(inter_list.front())); + ip = std::get_if(&(inter_list.front())); if (ip != nullptr) { // We have an intersection point - @@ -638,7 +638,7 @@ _compute_next_intersection(Halfedge_handle he, } else { // We have an overlapping subcurve. - icv = std::get(&(inter_list.front())); + icv = std::get_if(&(inter_list.front())); CGAL_assertion(icv != nullptr); if (is_closed(*icv, ARR_MIN_END)) { @@ -832,7 +832,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, if (iobj) { // We have found an intersection (either a simple point or an // overlapping x-monotone curve). - const Intersection_point* int_p = std::get(&*iobj); + const Intersection_point* int_p = std::get_if(&*iobj); if (int_p != nullptr) { Point_2 ip = int_p->first; @@ -854,7 +854,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, else { // We have located an overlapping curve. Assign ip as its left // endpoint. - const X_monotone_curve_2* icv = std::get(&*iobj); + const X_monotone_curve_2* icv = std::get_if(&*iobj); CGAL_assertion(icv != nullptr); Point_2 ip = min_vertex(*icv); diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h index b7c2907bf583..0abc509bcd59 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_insertion_traits_2.h @@ -120,13 +120,13 @@ class Arr_insertion_traits_2 : // X_monotone_curve_2 for (const auto& xection : xections) { const Intersection_point* - p_p = std::get(&xection); + p_p = std::get_if(&xection); if (p_p != nullptr) { - *oi++ = Intersection_result(xection); + *oi++ = Intersection_result(*p_p); continue; } const Base_x_monotone_curve_2* base_cv_p = - std::get(&xection); + std::get_if(&xection); CGAL_assertion(base_cv_p); // Add halfedge handles to the resulting curve. diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h index e0b85f393906..30c8b38b4a0d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h @@ -937,8 +937,8 @@ _map_boundary_vertices(Event* event, Vertex_handle v, boost::mpl::bool_) const Cell_handle_red* red_handle_p = pt.red_cell_handle(); if (red_handle_p) info.first = *red_handle_p; - if (!std::get(&(info.first)) && - !std::get(&(info.second))) + if (!std::get_if(&(info.first)) && + !std::get_if(&(info.second))) { // If both, the red and blue, variants do not represent face handles, // they must represt either vertex or edge handles. In this case it is diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h index e981e5326581..3067ba6715d3 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h @@ -323,14 +323,14 @@ class Arr_overlay_traits_2 { /*! Obtain the red vertex handle or nullptr if it doesn't exist. */ const Vertex_handle_red* red_vertex_handle() const { - return m_red_cell ? std::get(&(*m_red_cell)) : nullptr; + return m_red_cell ? std::get_if(&(*m_red_cell)) : nullptr; } /*! Obtain the blue vertex handle or nullptr if it doesn't exist. */ const Vertex_handle_blue* blue_vertex_handle() const { return - m_blue_cell ? std::get(&(*m_blue_cell)) : nullptr; + m_blue_cell ? std::get_if(&(*m_blue_cell)) : nullptr; } }; @@ -440,7 +440,7 @@ class Arr_overlay_traits_2 { // the extended X_monotone_curve_2. for (const auto& xection : xections) { const Intersection_base_point* base_ipt = - std::get(&xection); + std::get_if(&xection); if (base_ipt != nullptr) { // We have a red-blue intersection point, so we attach the // intersecting red and blue halfedges to it. @@ -470,7 +470,7 @@ class Arr_overlay_traits_2 { } const Base_x_monotone_curve_2* overlap_xcv = - std::get(&xection); + std::get_if(&xection); CGAL_assertion(overlap_xcv != nullptr); // We have a red-blue overlap, so we mark the curve accordingly. diff --git a/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp b/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp index 9df70f7f868d..dc23e31bfaff 100644 --- a/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp +++ b/Visibility_2/examples/Visibility_2/simple_polygon_visibility_2.cpp @@ -38,7 +38,7 @@ int main() { CGAL::Arr_naive_point_location pl(env); CGAL::Arr_point_location_result::Type obj = pl.locate(q); // The query point locates in the interior of a face - face = std::get (&obj); + face = std::get_if (&obj); // compute non regularized visibility area // Define visibility object type that computes non-regularized visibility area From 522183bd002fce8c6b013761a094ee959a342fbe Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 15 Jun 2023 16:08:55 +0200 Subject: [PATCH 0370/1398] add version_enforcer.h to ease the use of forked headers in external code --- Installation/include/CGAL/config.h | 1 + Installation/include/CGAL/version_enforcer.h | 41 ++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Installation/include/CGAL/version_enforcer.h diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index af4a81c86070..f37531001398 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -117,6 +117,7 @@ #include #include +#include //----------------------------------------------------------------------// // platform specific workaround flags (CGAL_CFG_...) diff --git a/Installation/include/CGAL/version_enforcer.h b/Installation/include/CGAL/version_enforcer.h new file mode 100644 index 000000000000..a07979fb1f62 --- /dev/null +++ b/Installation/include/CGAL/version_enforcer.h @@ -0,0 +1,41 @@ +// Copyright (c) 2023 GeometryFactory. +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : - + +#ifndef CGAL_VERSION_ENFORCER_H +#define CGAL_VERSION_ENFORCER_H + +#include + +// All files including this header are meant to work with a given version of CGAL +// When using forked headers, set the 4 following macros to the version of CGAL +// you want to use. +#define CGAL_AUTHORIZED_VERSION CGAL_VERSION_STR +#define CGAL_AUTHORIZED_VERSION_MAJOR CGAL_VERSION_MAJOR +#define CGAL_AUTHORIZED_VERSION_MINOR CGAL_VERSION_MINOR +#define CGAL_AUTHORIZED_VERSION_PATCH CGAL_VERSION_PATCH + +// Check that the version of CGAL used is the one expected +#if (CGAL_VERSION_MAJOR != CGAL_AUTHORIZED_VERSION_MAJOR) +#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." +#error This header is meant to be with used with CGAL 5.5 only. +#endif + +#if (CGAL_VERSION_MINOR != CGAL_AUTHORIZED_VERSION_MINOR) +#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." +#error This header is meant to be with used with CGAL 5.5 only. +#endif + +#if (CGAL_VERSION_PATCH != CGAL_AUTHORIZED_VERSION_PATCH) +#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." +#error This header is meant to be with used with CGAL 5.5 only. +#endif + +#endif // CGAL_VERSION_ENFORCER_H From 5a7f0252ac2b13481f6d6a0db9dc2150e3a463c5 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 15 Jun 2023 16:27:08 +0200 Subject: [PATCH 0371/1398] fix error message --- Installation/include/CGAL/version_enforcer.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Installation/include/CGAL/version_enforcer.h b/Installation/include/CGAL/version_enforcer.h index a07979fb1f62..c5c1181cee4f 100644 --- a/Installation/include/CGAL/version_enforcer.h +++ b/Installation/include/CGAL/version_enforcer.h @@ -17,7 +17,7 @@ // All files including this header are meant to work with a given version of CGAL // When using forked headers, set the 4 following macros to the version of CGAL // you want to use. -#define CGAL_AUTHORIZED_VERSION CGAL_VERSION_STR +#define CGAL_AUTHORIZED_VERSION_STR CGAL_VERSION_STR #define CGAL_AUTHORIZED_VERSION_MAJOR CGAL_VERSION_MAJOR #define CGAL_AUTHORIZED_VERSION_MINOR CGAL_VERSION_MINOR #define CGAL_AUTHORIZED_VERSION_PATCH CGAL_VERSION_PATCH @@ -25,17 +25,17 @@ // Check that the version of CGAL used is the one expected #if (CGAL_VERSION_MAJOR != CGAL_AUTHORIZED_VERSION_MAJOR) #pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL 5.5 only. +#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only." #endif #if (CGAL_VERSION_MINOR != CGAL_AUTHORIZED_VERSION_MINOR) #pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL 5.5 only. +#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only. #endif #if (CGAL_VERSION_PATCH != CGAL_AUTHORIZED_VERSION_PATCH) #pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL 5.5 only. +#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only." #endif #endif // CGAL_VERSION_ENFORCER_H From 11a5b394b844d4d49c8fa4b0343240cb7200cc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 15 Jun 2023 18:44:20 +0200 Subject: [PATCH 0372/1398] use Range::size() --- BGL/include/CGAL/boost/graph/Dual.h | 2 +- BGL/test/BGL/test_Euler_operations.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Dual.h b/BGL/include/CGAL/boost/graph/Dual.h index 1255e0b08d93..7d7481b1625d 100644 --- a/BGL/include/CGAL/boost/graph/Dual.h +++ b/BGL/include/CGAL/boost/graph/Dual.h @@ -458,7 +458,7 @@ out_degree(typename boost::graph_traits >::vertex_descriptor v, const Dual

    & dual) { const typename Dual

    ::Primal& primal = dual.primal(); - return std::distance(halfedges_around_face(halfedge(v,primal),primal)); + return halfedges_around_face(halfedge(v,primal),primal).size(); } template diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index a72d33306476..fe7c3275dd12 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -270,8 +270,8 @@ join_vertex_interior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 3); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m).size() == 3); + assert(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m).size() == 3); assert(degree(f.x, f.m) == 4); assert(CGAL::is_valid_polygon_mesh(f.m)); } @@ -295,8 +295,8 @@ join_vertex_exterior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m).size() == 4); + assert(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m).size() == 3); assert(degree(f.y, f.m) == 3); assert(CGAL::is_valid_polygon_mesh(f.m)); } @@ -314,8 +314,8 @@ join_vertex_exterior_test() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_vertices(f.m) == 5); assert(CGAL::internal::exact_num_edges(f.m) == 6); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m)) == 4); - assert(std::distance(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m)) == 3); + assert(CGAL::halfedges_around_face(halfedge(f.f1, f.m), f.m).size() == 4); + assert(CGAL::halfedges_around_face(halfedge(f.f2, f.m), f.m).size() == 3); assert(CGAL::is_valid_polygon_mesh(f.m)); assert(degree(f.w, f.m) == 3); @@ -344,8 +344,8 @@ split_vertex() assert(CGAL::is_valid_polygon_mesh(f.m)); assert(CGAL::internal::exact_num_vertices(f.m) == 7); assert(CGAL::internal::exact_num_edges(f.m) == 8); - assert(std::distance(CGAL::halfedges_around_face(h1, f.m)) == 5); - assert(std::distance(CGAL::halfedges_around_face(h2, f.m)) == 7); + assert(CGAL::halfedges_around_face(h1, f.m).size() == 5); + assert(CGAL::halfedges_around_face(h2, f.m).size() == 7); } template @@ -371,8 +371,8 @@ split_join_vertex_inverse() assert(CGAL::internal::exact_num_faces(f.m) == 2); assert(CGAL::internal::exact_num_edges(f.m) == 6); assert(CGAL::internal::exact_num_halfedges(f.m) == 12); - assert(std::distance(CGAL::halfedges_around_face(h1, f.m)) == 3); - assert(std::distance(CGAL::halfedges_around_face(h2, f.m)) == 3); + assert(CGAL::halfedges_around_face(h1, f.m).size() == 3); + assert(CGAL::halfedges_around_face(h2, f.m).size() == 3); } From 0ee31a5d4fd8b3290351902baeca75829a869cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 19 Jun 2023 19:17:49 +0200 Subject: [PATCH 0373/1398] remove extra parenthesis --- .../internal/AABB_ray_intersection.h | 2 +- .../Algebraic_foundations/fraction_traits.cpp | 4 +- .../Algebraic_foundations/interoperable.cpp | 2 +- .../include/CGAL/Algebraic_structure_traits.h | 3 +- .../include/CGAL/Coercion_traits.h | 4 +- .../include/CGAL/Scalar_factor_traits.h | 4 +- .../CGAL/Test/_test_algebraic_structure.h | 45 ++++++------ .../include/CGAL/Test/_test_coercion_traits.h | 6 +- .../include/CGAL/Test/_test_fraction_traits.h | 10 +-- .../include/CGAL/Test/_test_rational_traits.h | 2 +- .../include/CGAL/Test/_test_real_embeddable.h | 16 ++--- .../Algebraic_extension_traits.cpp | 20 +++--- .../Algebraic_structure_traits.cpp | 6 +- .../Algebraic_foundations/Coercion_traits.cpp | 19 ++---- .../Real_embeddable_traits.cpp | 4 +- .../Scalar_factor_traits.cpp | 16 ++--- .../Algebraic_curve_kernel_2.h | 24 +++---- .../algebraic_curve_kernel_2_tools.h | 8 +-- .../Real_embeddable_traits_extension.cpp | 16 ++--- .../CGAL/_test_algebraic_curve_kernel_2.h | 16 ++--- .../include/CGAL/_test_algebraic_kernel_1.h | 10 +-- .../include/CGAL/_test_algebraic_kernel_2.h | 22 +++--- .../include/CGAL/_test_real_comparable.h | 16 ++--- Alpha_shapes_2/include/CGAL/Alpha_shape_2.h | 4 +- .../Alpha_shapes_2/internal/Lazy_alpha_nt_2.h | 8 +-- Alpha_shapes_3/include/CGAL/Alpha_shape_3.h | 4 +- .../Alpha_shapes_3/internal/Lazy_alpha_nt_3.h | 8 +-- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 2 +- .../internal/Triangle_mesh_oracle.h | 2 +- .../internal/Triangle_soup_oracle.h | 2 +- .../Get_arithmetic_kernel.cpp | 6 +- .../Arr_bounded_planar_topology_traits_2.h | 8 +-- .../include/CGAL/Arr_overlay_2.h | 8 +-- .../CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h | 6 +- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 6 +- .../CGAL/Arr_spherical_topology_traits_2.h | 16 ++--- .../CGAL/Arr_unb_planar_topology_traits_2.h | 16 ++--- .../include/CGAL/Arrangement_on_surface_2.h | 4 +- .../include/CGAL/Arrangement_zone_2.h | 4 +- .../graph/IO/Generic_facegraph_builder.h | 8 +-- BGL/test/BGL/test_Properties.cpp | 8 +-- .../Gps_agg_meta_traits.h | 16 ++--- .../Gps_traits_decorator.h | 16 ++--- Circulator/include/CGAL/circulator.h | 14 ++-- .../include/CGAL/Cell_iterators.h | 12 ++-- .../include/CGAL/Combinatorial_map.h | 4 +- .../CGAL/Combinatorial_map_basic_operations.h | 16 ++--- .../CGAL/Combinatorial_map_iterators_base.h | 12 ++-- .../quick_hull_default_traits.cpp | 14 ++-- .../include/CGAL/GMap_cell_iterators.h | 8 +-- .../include/CGAL/GMap_dart_iterators.h | 6 +- .../include/CGAL/Generalized_map.h | 4 +- .../CGAL/Generalized_map_iterators_base.h | 4 +- .../Surface_mesh_geodesic_distances_3.h | 4 +- .../Installation/test_configuration_qt5.cpp | 2 +- .../include/CGAL/Intersection_traits.h | 6 +- .../internal/Bbox_3_Segment_3_do_intersect.h | 2 +- .../Test/_test_bigfloat_interval_traits.h | 2 +- .../include/CGAL/Test/_test_convert_to_bfi.h | 2 +- .../include/CGAL/Test/_test_interval_traits.h | 4 +- Kernel_23/include/CGAL/Circle_2.h | 2 +- Kernel_23/include/CGAL/Circle_3.h | 2 +- Kernel_23/include/CGAL/Direction_2.h | 2 +- Kernel_23/include/CGAL/Direction_3.h | 2 +- Kernel_23/include/CGAL/Has_conversion.h | 12 ++-- Kernel_23/include/CGAL/Iso_cuboid_3.h | 2 +- Kernel_23/include/CGAL/Iso_rectangle_2.h | 2 +- Kernel_23/include/CGAL/Line_2.h | 2 +- Kernel_23/include/CGAL/Line_3.h | 2 +- Kernel_23/include/CGAL/Plane_3.h | 2 +- Kernel_23/include/CGAL/Point_2.h | 2 +- Kernel_23/include/CGAL/Point_3.h | 2 +- Kernel_23/include/CGAL/Ray_2.h | 2 +- Kernel_23/include/CGAL/Ray_3.h | 2 +- Kernel_23/include/CGAL/Segment_2.h | 2 +- Kernel_23/include/CGAL/Segment_3.h | 2 +- Kernel_23/include/CGAL/Sphere_3.h | 2 +- Kernel_23/include/CGAL/Tetrahedron_3.h | 2 +- Kernel_23/include/CGAL/Triangle_2.h | 2 +- Kernel_23/include/CGAL/Triangle_3.h | 2 +- Kernel_23/include/CGAL/Vector_2.h | 2 +- Kernel_23/include/CGAL/Vector_3.h | 2 +- Kernel_23/include/CGAL/Weighted_point_2.h | 2 +- Kernel_23/include/CGAL/Weighted_point_3.h | 2 +- .../Kernel_23/test_RT_or_FT_predicates.cpp | 4 +- .../include/CGAL/Compact_mesh_cell_base_3.h | 4 +- Mesh_3/include/CGAL/Mesh_criteria_3.h | 8 +-- .../test/Mesh_3/test_meshing_polyhedron.cpp | 4 +- Nef_2/include/CGAL/Nef_2/PM_overlayer.h | 2 +- .../CGAL/NewKernel_d/Kernel_d_interface.h | 4 +- .../CGAL/NewKernel_d/Wrapper/Hyperplane_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Point_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Ref_count_obj.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Segment_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Sphere_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Vector_d.h | 2 +- NewKernel_d/test/NewKernel_d/Epick_d.cpp | 10 +-- Number_types/include/CGAL/Lazy_exact_nt.h | 8 +-- Number_types/include/CGAL/Root_of_traits.h | 2 +- .../include/CGAL/Test/test_root_of_traits.h | 12 ++-- .../CGAL/simplest_rational_in_interval.h | 4 +- Number_types/include/CGAL/to_rational.h | 4 +- .../test/Number_types/Lazy_exact_nt_new.cpp | 10 +-- .../test/Number_types/Quotient_new.cpp | 6 +- .../test/Number_types/Sqrt_extension.h | 8 +-- .../include/CGAL/Test/test_root_of_2_traits.h | 6 +- .../internal/optimize_2.h | 2 +- .../oriented_bounding_box.h | 2 +- .../compute_registration_transformation.h | 8 +-- .../include/CGAL/OpenGR/register_point_sets.h | 8 +-- .../compute_registration_transformation.h | 12 ++-- .../include/CGAL/structure_point_set.h | 2 +- .../CGAL/Polygon_mesh_processing/clip.h | 4 +- .../connected_components.h | 2 +- .../Polygon_mesh_processing/corefinement.h | 8 +-- .../CGAL/Polygon_mesh_processing/distance.h | 2 +- .../intersect_triangle_and_segment_3.h | 2 +- .../Corefinement/intersection_nodes.h | 12 ++-- .../intersection_of_coplanar_triangles_3.h | 4 +- .../internal/Snapping/snap_vertices.h | 2 +- .../Polygon_mesh_processing/intersection.h | 6 +- .../CGAL/Polygon_mesh_processing/locate.h | 4 +- .../CGAL/Polygon_mesh_processing/measure.h | 4 +- .../orient_polygon_soup_extension.h | 4 +- .../polygon_mesh_to_polygon_soup.h | 2 +- .../polygon_soup_to_polygon_mesh.h | 2 +- .../repair_self_intersections.h | 2 +- .../Rigid_triangle_mesh_collision_detection.h | 4 +- .../Polyhedral_envelope_filter.h | 2 +- .../test_pmp_locate.cpp | 4 +- Polynomial/include/CGAL/Exponent_vector.h | 2 +- .../Polynomial/Algebraic_structure_traits.h | 4 +- .../include/CGAL/Polynomial/Polynomial_type.h | 4 +- Polynomial/include/CGAL/Polynomial_traits_d.h | 2 +- .../CGAL/Test/_test_polynomial_traits_d.h | 68 +++++++++---------- .../Polynomial/Polynomial_type_generator.cpp | 6 +- Polynomial/test/Polynomial/test_polynomial.h | 6 +- .../test_polynomial_Coercion_traits.cpp | 4 +- .../test_polynomial_Get_arithmetic_kernel.cpp | 4 +- Ridges_3/include/CGAL/Ridges.h | 8 +-- Ridges_3/include/CGAL/Umbilics.h | 8 +-- .../include/CGAL/Handle_with_policy.h | 12 ++-- .../include/CGAL/Named_function_parameters.h | 4 +- .../include/CGAL/transforming_pair_iterator.h | 2 +- .../test/STL_Extension/test_Cache.cpp | 12 ++-- .../STL_Extension/test_cgal_named_params.cpp | 18 ++--- .../test/STL_Extension/test_is_iterator.cpp | 12 ++-- .../test/STL_Extension/test_is_streamable.cpp | 4 +- .../test/STL_Extension/test_stl_extension.cpp | 18 ++--- .../Shape_regularization/regularize_planes.h | 2 +- .../include/CGAL/Snap_rounding_kd_2.h | 2 +- .../Bounded_distance_placement.h | 2 +- .../Edge_collapse/FastEnvelope_filter.h | 2 +- .../CGAL/Surface_mesher/Combining_oracle.h | 4 +- .../CGAL/No_intersection_surface_sweep_2.h | 4 +- .../CGAL/Delaunay_triangulation_on_sphere_2.h | 4 +- 156 files changed, 510 insertions(+), 521 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h index ff091ce6c24b..87ebbe012ab8 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h @@ -201,7 +201,7 @@ template boost::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > AABB_tree::first_intersection(const Ray& query, const SkipFunctor& skip) const { - static_assert((std::is_same::value), + static_assert(std::is_same::value, "Ray and Ray_3 must be the same type"); switch(size()) // copy-paste from AABB_tree::traversal diff --git a/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp index 42c1e8d92883..4ecbef7420c7 100644 --- a/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp +++ b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp @@ -9,8 +9,8 @@ int main(){ typedef FT::Numerator_type Numerator_type; typedef FT::Denominator_type Denominator_type; - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); Numerator_type numerator; Denominator_type denominator; diff --git a/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp b/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp index 0963f5f9d368..e85c2e8d73b8 100644 --- a/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp +++ b/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp @@ -9,7 +9,7 @@ binary_func(const A& a , const B& b){ typedef CGAL::Coercion_traits CT; // check for explicit interoperability - static_assert((CT::Are_explicit_interoperable::value)); + static_assert(CT::Are_explicit_interoperable::value); // CT::Cast is used to to convert both types into the coercion type typename CT::Cast cast; diff --git a/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h b/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h index a632e12a1972..e0d5eee6706c 100644 --- a/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h +++ b/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h @@ -353,8 +353,7 @@ class Algebraic_structure_traits_base< Type_, typedef Coercion_traits< NT1, NT2 > CT; typedef typename CT::Type Coercion_type_NT1_NT2; CGAL_USE_TYPE(Coercion_type_NT1_NT2); - static_assert(( - ::std::is_same::value)); + static_assert(::std::is_same::value); typename Coercion_traits< NT1, NT2 >::Cast cast; operator()( cast(x), cast(y), q, r ); diff --git a/Algebraic_foundations/include/CGAL/Coercion_traits.h b/Algebraic_foundations/include/CGAL/Coercion_traits.h index 09c387b5a092..f6c9092dec6e 100644 --- a/Algebraic_foundations/include/CGAL/Coercion_traits.h +++ b/Algebraic_foundations/include/CGAL/Coercion_traits.h @@ -35,9 +35,9 @@ #define CGAL_IMPLICIT_INTEROPERABLE_BINARY_OPERATOR_WITH_RT( NT, Result_type ) \ template < class CT_Type_1, class CT_Type_2 > \ Result_type operator()( const CT_Type_1& x, const CT_Type_2& y ) const { \ - static_assert((::std::is_same< \ + static_assert(::std::is_same< \ typename Coercion_traits< CT_Type_1, CT_Type_2 >::Type, NT \ - >::value)); \ + >::value) ; \ \ typename Coercion_traits< CT_Type_1, CT_Type_2 >::Cast cast; \ return operator()( cast(x), cast(y) ); \ diff --git a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h index 2d7840511976..5453868a1324 100644 --- a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h +++ b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h @@ -85,13 +85,13 @@ class Scalar_factor_traits { // determine extractable scalar factor Scalar operator () (const NT& a) { - static_assert(( ::std::is_same< NT,Scalar >::value)); + static_assert(::std::is_same< NT,Scalar >::value); typedef typename Algebraic_structure_traits::Algebraic_category SAT; return scalar_factor(a, SAT()); } // determine extractable scalar factor Scalar operator () (const NT& a, const Scalar& d) { - static_assert(( ::std::is_same< NT,Scalar >::value)); + static_assert(::std::is_same< NT,Scalar >::value); typedef typename Algebraic_structure_traits::Algebraic_category SAT; return scalar_factor(a,d,SAT()); } diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 68970af7441c..82483c0dccee 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -44,7 +44,7 @@ template void check_result_type(AdaptableFunctor, ResultType){ typedef typename AdaptableFunctor::result_type result_type; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); CGAL_USE_TYPE(result_type); } // check nothing for CGAL::Null_functor @@ -122,12 +122,11 @@ void test_algebraic_structure_intern( const CGAL::Integral_domain_tag& ) { CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - static_assert( - (!::std::is_same< Integral_division, Null_functor >::value)); - static_assert((!::std::is_same< Divides, Null_functor >::value)); - static_assert((!::std::is_same< Is_zero, Null_functor >::value)); - static_assert((!::std::is_same< Is_one, Null_functor >::value)); - static_assert((!::std::is_same< Square, Null_functor >::value)); + static_assert(!::std::is_same< Integral_division, Null_functor >::value); + static_assert(!::std::is_same< Divides, Null_functor >::value); + static_assert(!::std::is_same< Is_zero, Null_functor >::value); + static_assert(!::std::is_same< Is_one, Null_functor >::value); + static_assert(!::std::is_same< Square, Null_functor >::value); // functor const Is_zero is_zero = Is_zero(); @@ -206,7 +205,7 @@ void test_algebraic_structure_intern( CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - static_assert((!::std::is_same< Gcd, Null_functor>::value)); + static_assert(!::std::is_same< Gcd, Null_functor>::value); const Gcd gcd = Gcd(); assert( gcd( AS ( 0), AS ( 0)) == unit_normal( AS (0) ) ); @@ -268,9 +267,9 @@ void test_algebraic_structure_intern( const CGAL::Euclidean_ring_tag&) { CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - static_assert((!::std::is_same< Div, Null_functor>::value)); - static_assert((!::std::is_same< Mod, Null_functor>::value)); - static_assert((!::std::is_same< Div_mod, Null_functor>::value)); + static_assert(!::std::is_same< Div, Null_functor>::value); + static_assert(!::std::is_same< Mod, Null_functor>::value); + static_assert(!::std::is_same< Div_mod, Null_functor>::value); const Div div=Div(); const Mod mod=Mod(); @@ -387,7 +386,7 @@ void test_algebraic_structure_intern( const CGAL::Field_with_sqrt_tag& ) { CGAL_SNAP_AST_FUNCTORS(AST); - static_assert((!::std::is_same< Sqrt, Null_functor>::value)); + static_assert(!::std::is_same< Sqrt, Null_functor>::value); const Sqrt sqrt =Sqrt(); AS a(4); @@ -617,7 +616,7 @@ class Test_is_square { ( ::std::is_same< AS , First_argument_type>::value)); static_assert( ( ::std::is_same< AS& , Second_argument_type>::value)); - //static_assert(( ::std::is_same< bool , Result_type>::value)); + //static_assert(::std::is_same< bool , Result_type>::value); bool b = Result_type(true); CGAL_USE(b); AS test_number = AS(3)*AS(3); @@ -649,8 +648,8 @@ class Test_sqrt { typedef typename Sqrt::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - static_assert(( ::std::is_same< AS , Argument_type>::value)); - static_assert(( ::std::is_same< AS , Result_type>::value)); + static_assert(::std::is_same< AS , Argument_type>::value); + static_assert(::std::is_same< AS , Result_type>::value); typedef Algebraic_structure_traits AST; typedef typename AST::Is_exact Is_exact; assert( !Is_exact::value || AS (3) == sqrt( AS (9))); @@ -803,7 +802,7 @@ void test_algebraic_structure(){ typedef CGAL::Algebraic_structure_traits< AS > AST; CGAL_SNAP_AST_FUNCTORS(AST); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef typename AST::Boolean Boolean; assert(!Boolean()); @@ -816,14 +815,12 @@ void test_algebraic_structure(){ using CGAL::Integral_domain_without_division_tag; using CGAL::Null_functor; // Test for desired exactness - static_assert( - ( ::std::is_same< typename AST::Is_exact, Is_exact >::value)); - - static_assert(( ::boost::is_convertible< Tag, - Integral_domain_without_division_tag >::value )); - static_assert(( ::std::is_same< Tag, Algebraic_category>::value)); - static_assert((!::std::is_same< Simplify, Null_functor>::value)); - static_assert((!::std::is_same< Unit_part, Null_functor>::value)); + static_assert(::std::is_same< typename AST::Is_exact, Is_exact >::value); + static_assert(::std::is_convertible< Tag, + Integral_domain_without_division_tag >::value ); + static_assert(::std::is_same< Tag, Algebraic_category>::value); + static_assert(!::std::is_same< Simplify, Null_functor>::value); + static_assert(!::std::is_same< Unit_part, Null_functor>::value); const Simplify simplify=Simplify();; const Unit_part unit_part= Unit_part(); diff --git a/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h index fab14e92e981..cff190a023d0 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h @@ -346,9 +346,9 @@ void test_explicit_interoperable_one_way(){ typedef typename CT::Cast Cast; typedef typename Cast::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); - static_assert((::std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value); + static_assert(::std::is_same::value); typename CT::Cast cast; A a(3); diff --git a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h index c12411757b2f..6d11b6f2c555 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h @@ -37,11 +37,11 @@ void test_fraction_traits(){ typedef typename FT::Compose Compose; CGAL_USE_TYPE(Is_fraction); - static_assert( (::std::is_same::value)); - static_assert( (::std::is_same::value)); - static_assert(!(::std::is_same::value)); - static_assert(!(::std::is_same::value)); - static_assert(!(::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); + static_assert(!::std::is_same::value); + static_assert(!::std::is_same::value); + static_assert(!::std::is_same::value); // Decompose diff --git a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h index 26dce67e619b..68e648e69c5b 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h @@ -29,7 +29,7 @@ void test_rational_traits(){ typedef Rational_traits Rational_traits; typedef typename Rational_traits::RT RT; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); assert( Rational_traits().numerator(x) == RT(7)); assert( Rational_traits().denominator(x) == RT(2)); diff --git a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h index 1f7e818d2d36..fbe5b66132b8 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h @@ -48,9 +48,9 @@ namespace CGAL { void operator() (const ToDouble& to_double) { typedef typename ToDouble::argument_type Argument_type; typedef typename ToDouble::result_type Result_type; - static_assert(( ::std::is_same::value)); + static_assert( ::std::is_same::value); CGAL_USE_TYPE(Argument_type); - static_assert(( ::std::is_same::value)); + static_assert( ::std::is_same::value); CGAL_USE_TYPE(Result_type); assert(42.0 == to_double(Type(42))); } @@ -71,9 +71,9 @@ namespace CGAL { typedef typename To_interval::argument_type Argument_type; typedef typename To_interval::result_type Result_type; typedef std::pair Interval_type; - static_assert(( ::std::is_same::value)); + static_assert( ::std::is_same::value); CGAL_USE_TYPE(Argument_type); - static_assert(( ::std::is_same::value)); + static_assert( ::std::is_same::value); CGAL_USE_TYPE(Result_type); CGAL_USE_TYPE(Interval_type); // assert(NiX::in(42.0,to_Interval(Type(42)))); @@ -139,7 +139,7 @@ void test_real_embeddable() { CGAL_SNAP_RET_FUNCTORS(RET); typedef typename RET::Is_real_embeddable Is_real_embeddable; using CGAL::Tag_true; - static_assert(( ::std::is_same< Is_real_embeddable, Tag_true>::value)); + static_assert(::std::is_same< Is_real_embeddable, Tag_true>::value); CGAL_USE_TYPE(Is_real_embeddable); typedef typename RET::Boolean Boolean; @@ -246,7 +246,7 @@ void test_not_real_embeddable() { typedef CGAL::Real_embeddable_traits RET; typedef typename RET::Is_real_embeddable Is_real_embeddable; using CGAL::Tag_false; - static_assert(( ::std::is_same< Is_real_embeddable, Tag_false>::value)); + static_assert(::std::is_same< Is_real_embeddable, Tag_false>::value); CGAL_USE_TYPE(Is_real_embeddable); } @@ -254,13 +254,13 @@ void test_not_real_embeddable() { //template //void test_rounded_log2_abs(Type zero, CGAL::Null_functor, CeilLog2Abs) { // typedef CGAL::Null_functor Null_functor; -// static_assert(( ::std::is_same< CeilLog2Abs, Null_functor>::value)); +// static_assert(::std::is_same< CeilLog2Abs, Null_functor>::value); //} // //template //void test_rounded_log2_abs(Type zero, FloorLog2Abs fl_log, CeilLog2Abs cl_log) { // typedef CGAL::Null_functor Null_functor; -// static_assert((!::std::is_same< CeilLog2Abs, Null_functor>::value)); +// static_assert(!::std::is_same< CeilLog2Abs, Null_functor>::value); // // assert( fl_log(Type( 7)) == 2 ); // assert( cl_log(Type( 7)) == 3 ); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp index 03ee581bcbfa..95c89235190b 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp @@ -9,7 +9,7 @@ int main(){ typedef AET::Type Type; CGAL_USE_TYPE(Type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef AET::Is_extended Is_extended; CGAL_USE_TYPE(Is_extended); @@ -20,10 +20,10 @@ int main(){ { typedef Normalization_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef Normalization_factor::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); Normalization_factor nfac; assert(nfac(3)==1); } @@ -31,10 +31,10 @@ int main(){ { typedef DFAI::argument_type argument_type; CGAL_USE_TYPE(argument_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef DFAI::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); DFAI dfai; assert(dfai(3)==1); } @@ -45,7 +45,7 @@ int main(){ typedef AET::Type Type; CGAL_USE_TYPE(Type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef AET::Is_extended Is_extended; CGAL_USE_TYPE(Is_extended); @@ -56,10 +56,10 @@ int main(){ { typedef Normalization_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef Normalization_factor::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); Normalization_factor nfac; assert(nfac(EXT(3))==1); assert(nfac(EXT(3,0,5))==1); @@ -69,10 +69,10 @@ int main(){ { typedef DFAI::argument_type argument_type; CGAL_USE_TYPE(argument_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef DFAI::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); DFAI dfai; assert(dfai(EXT(3))==1); assert(dfai(EXT(3,0,5))==1); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp index f8cb5910ce1e..efd31636c51d 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp @@ -16,7 +16,7 @@ int main(){ typedef AST::Type Type; CGAL_USE_TYPE(Type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef AST::Algebraic_category Algebraic_category; CGAL_USE_TYPE(Algebraic_category); @@ -25,10 +25,10 @@ int main(){ typedef AST::Is_exact Is_exact; CGAL_USE_TYPE(Is_exact); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef AST::Is_numerical_sensitive Is_sensitive; CGAL_USE_TYPE(Is_sensitive); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); CGAL_IS_AST_NULL_FUNCTOR ( Simplify); CGAL_IS_AST_NULL_FUNCTOR ( Unit_part); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp index 7fcb803e94c4..a0ec9d741a4e 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp @@ -6,22 +6,17 @@ int main(){ { typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); - static_assert(( std::is_same::value)); - static_assert( - ( std::is_same::value)); - static_assert( - ( std::is_same::value)); + static_assert( std::is_same::value); + static_assert( std::is_same::value); + static_assert( std::is_same::value); assert( 5 == CT::Cast()(5)); } { typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); -// static_assert(( std::is_same::value)); - static_assert( - ( std::is_same::value)); - static_assert( - ( std::is_same::value)); - static_assert( - ( std::is_same::value)); +// static_assert( std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); } } diff --git a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp index 3d03fb37e388..f215c8484582 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp @@ -16,11 +16,11 @@ int main(){ typedef RET::Type Type; CGAL_USE_TYPE(Type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef RET::Is_real_embeddable Is_real_embeddable; CGAL_USE_TYPE(Is_real_embeddable); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); CGAL_IS_RET_NULL_FUNCTOR(Abs); CGAL_IS_RET_NULL_FUNCTOR(Sgn); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp index af4cc52c0d60..1fe2fcf620d8 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp @@ -7,33 +7,31 @@ int main(){ typedef CGAL::Scalar_factor_traits SFT; CGAL_USE_TYPE(SFT); - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); typedef SFT::Scalar_factor Scalar_factor; { typedef Scalar_factor::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef Scalar_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); } typedef SFT::Scalar_div Scalar_div; { typedef Scalar_div::result_type result_type; CGAL_USE_TYPE(result_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef Scalar_div::first_argument_type first_argument_type; CGAL_USE_TYPE(first_argument_type); - static_assert( - (::std::is_same::value)); + static_assert(::std::is_same::value); typedef Scalar_div::second_argument_type second_argument_type; CGAL_USE_TYPE(second_argument_type); - static_assert( - (::std::is_same::value)); + static_assert(::std::is_same::value); } int i; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h index a02edebb8e13..e92e01e0669b 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h @@ -481,18 +481,18 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ Curve_analysis_2 _construct_defining_polynomial_from(Bound b) const { typedef CGAL::Fraction_traits FT; // We rely on the fact that the Bound is a fraction - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - static_assert((::std::is_same + static_assert(::std::is_same ::value)); + typename Num_coercion::Type>::value); typedef CGAL::Coercion_traits Denom_coercion; - static_assert((::std::is_same + static_assert(::std::is_same ::value)); + typename Denom_coercion::Type>::value); typename Num_coercion::Cast num_cast; typename Denom_coercion::Cast denom_cast; typename FT::Decompose decompose; @@ -2541,18 +2541,18 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ Polynomial_1 operator() (const Polynomial_2& f, Bound b) const { typedef CGAL::Fraction_traits FT; // We rely on the fact that the Bound is a fraction - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - static_assert((::std::is_same + static_assert(::std::is_same ::value)); + typename Num_coercion::Type>::value); typedef CGAL::Coercion_traits Denom_coercion; - static_assert((::std::is_same + static_assert(::std::is_same ::value)); + typename Denom_coercion::Type>::value); typename Num_coercion::Cast num_cast; typename Denom_coercion::Cast denom_cast; typename FT::Decompose decompose; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h index 4a2b7bd038ea..e9ff71e3e66c 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h @@ -224,14 +224,14 @@ template void cast_back_utcf(const Poly_coer_1& p,Polynomial_1& q) { // We can assume that both template arguments are polynomial types typedef CGAL::Fraction_traits FT; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - static_assert((::std::is_same + static_assert(::std::is_same ::value)); + typename Num_coercion::Type>::value); Numerator p_num; Denominator p_denom; typename FT::Decompose()(p,p_num,p_denom); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp index c56969868c1a..d5917a016e50 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp @@ -47,8 +47,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Floor::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - static_assert(( ::std::is_same::value)); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); assert(Integer(42) == floor(NT(42))); assert(Integer(-42) == floor(NT(-42))); } @@ -59,8 +59,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Floor_log2_abs::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - static_assert(( ::std::is_same::value)); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); assert(long(0) == floor_log2_abs(NT(1))); assert(long(0) == floor_log2_abs(NT(-1))); @@ -86,8 +86,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Ceil::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - static_assert(( ::std::is_same::value)); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); assert(Integer(42) == ceil(NT(42))); assert(Integer(-42) == ceil(NT(-42))); } @@ -98,8 +98,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Ceil_log2_abs::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - static_assert(( ::std::is_same::value)); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); assert(long(0) == ceil_log2_abs(NT(1))); assert(long(0) == ceil_log2_abs(NT(-1))); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h index e110e2b7c955..f3332c1a4d28 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h @@ -62,20 +62,20 @@ void test_algebraic_curve_kernel_2() { typedef AlgebraicCurveKernel_2 AK_2; - /* static_assert( (::std::is_same< - Algebraic_real_1, typename AK::Algebraic_real_1 >::value) ); + /* static_assert(::std::is_same< + Algebraic_real_1, typename AK::Algebraic_real_1 >::value); - static_assert((::std::is_same< + static_assert(::std::is_same< Isolator, - typename AK::Isolator >::value) ); + typename AK::Isolator >::value); - static_assert((::std::is_same< + static_assert(::std::is_same< Coefficient, - typename AK::Coefficient >::value)); + typename AK::Coefficient >::value); - static_assert((::std::is_same< + static_assert(::std::is_same< Polynomial_1, - typename AK::Polynomial_1 >::value));*/ + typename AK::Polynomial_1 >::value);*/ typedef typename AK_2::Polynomial_2 Poly_2; typedef typename AK_2::Curve_analysis_2 Curve_analysis_2; diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h index 7d12134feff2..abe5ebfd32d4 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h @@ -109,8 +109,8 @@ void test_algebraic_kernel_1(const AlgebraicKernel_d_1& ak_1){ typedef typename Name::result_type RT_; \ CGAL_USE_TYPE(AT_); \ CGAL_USE_TYPE(RT_); \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ } #define CGAL_CHECK_BFUNCTION(Name,AT1,AT2,RT) \ { \ @@ -120,9 +120,9 @@ void test_algebraic_kernel_1(const AlgebraicKernel_d_1& ak_1){ CGAL_USE_TYPE(AT1_); \ CGAL_USE_TYPE(AT2_); \ CGAL_USE_TYPE(RT_); \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ } // TODO: missing check for Construct_algebraic_real_1 diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h index 4db859ddb25c..bebcd0118e74 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h @@ -93,8 +93,8 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { typedef typename Name::result_type RT_; \ CGAL_USE_TYPE(AT_); \ CGAL_USE_TYPE(RT_); \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ } #define CGAL_CHECK_BFUNCTION(Name,AT1,AT2,RT) \ { \ @@ -104,22 +104,22 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { CGAL_USE_TYPE(AT1_); \ CGAL_USE_TYPE(AT2_); \ CGAL_USE_TYPE(RT_); \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ - {static_assert(( ::std::is_same::value));} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ + {static_assert(::std::is_same::value);} \ } - static_assert(( ::std::is_same + static_assert(::std::is_same - ::value)); + ::value); CGAL_CHECK_UFUNCTION(Is_square_free_2,Polynomial_2,bool); CGAL_CHECK_UFUNCTION(Make_square_free_2,Polynomial_2,Polynomial_2); // TODO: missing check for Square_free_factorize_2 CGAL_CHECK_BFUNCTION(Is_coprime_2,Polynomial_2,Polynomial_2,bool); - static_assert(( ::std::is_same - ::value)); + static_assert(::std::is_same + ::value); CGAL_CHECK_BFUNCTION(Number_of_solutions_2,Polynomial_2,Polynomial_2, size_type); CGAL_CHECK_UFUNCTION(Compute_x_2,Algebraic_real_2,Algebraic_real_1); @@ -128,8 +128,8 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { CGAL_CHECK_UFUNCTION(Compute_polynomial_y_2,Algebraic_real_2,Polynomial_1); CGAL_CHECK_BFUNCTION(Isolate_x_2,Algebraic_real_2,Polynomial_1,BInterval); CGAL_CHECK_BFUNCTION(Isolate_y_2,Algebraic_real_2,Polynomial_1,BInterval); - static_assert(( ::std::is_same - < BArray,typename Isolate_2::result_type>::value)); + static_assert(::std::is_same + < BArray,typename Isolate_2::result_type>::value); CGAL_CHECK_BFUNCTION(Sign_at_2,Polynomial_2,Algebraic_real_2,Sign); CGAL_CHECK_BFUNCTION(Is_zero_at_2,Polynomial_2,Algebraic_real_2,bool); CGAL_CHECK_BFUNCTION(Compare_x_2,Algebraic_real_2,Algebraic_real_2,Sign); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h index dc9f13e3a038..fa5bd929abef 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h @@ -39,8 +39,8 @@ namespace internal { void operator() (ToDouble to_double) { typedef typename ToDouble::argument_type Argument_type; typedef typename ToDouble::result_type Result_type; - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); assert(42.0 == to_double(NT(42))); } }; @@ -59,8 +59,8 @@ namespace internal { void operator() (ToInterval to_Interval) { typedef typename ToInterval::argument_type Argument_type; typedef typename ToInterval::result_type Result_type; - static_assert((::std::is_same::value)); - static_assert((::std::is_same< typename Argument_type::Interval, Result_type>::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same< typename Argument_type::Interval, Result_type>::value); // TODO: NiX::in not available!? //assert(NiX::in(42.0,to_Interval(NT(42)))); @@ -99,7 +99,7 @@ void test_real_comparable() { typedef CGAL::Real_embeddable_traits Traits; typedef typename Traits::Is_real_embeddable Is_real_comparable; using ::CGAL::Tag_true; - static_assert((::std::is_same< Is_real_comparable, Tag_true>::value)); + static_assert(::std::is_same< Is_real_comparable, Tag_true>::value); typename Traits::Compare compare; typename Traits::Sign sign; typename Traits::Abs abs; @@ -168,20 +168,20 @@ void test_not_real_comparable() { typedef CGAL::Real_embeddable_traits Traits; typedef typename Traits::Is_real_embeddable Is_real_comparable; using ::CGAL::Tag_false; - static_assert((::std::is_same< Is_real_comparable, Tag_false>::value)); + static_assert(::std::is_same< Is_real_comparable, Tag_false>::value); } template void test_rounded_log2_abs(NT zero, ::CGAL::Null_functor, CeilLog2Abs) { typedef ::CGAL::Null_functor Nulltype; - static_assert((::std::is_same< CeilLog2Abs, Nulltype>::value)); + static_assert(::std::is_same< CeilLog2Abs, Nulltype>::value); } template void test_rounded_log2_abs(NT zero, FloorLog2Abs fl_log, CeilLog2Abs cl_log) { typedef ::CGAL::Null_functor Null_functor; - static_assert((!::std::is_same< CeilLog2Abs, Null_functor>::value)); + static_assert(!::std::is_same< CeilLog2Abs, Null_functor>::value); assert( fl_log(NT( 7)) == 2 ); assert( cl_log(NT( 7)) == 3 ); diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h index 56e52417684c..43be24070229 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h @@ -76,8 +76,8 @@ class Alpha_shape_2 : public Dt typedef Type_of_alpha FT; // check that simplices are correctly instantiated - static_assert( (std::is_same::value) ); - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); + static_assert(std::is_same::value); typedef typename Dt::Point Point; diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h index 22565c21d859..7ce92e13c347 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h @@ -148,8 +148,8 @@ class Lazy_alpha_nt_2 Approx_point to_approx(const Input_point& wp) const { // The traits class' Point_2 must be convertible using the Cartesian converter - static_assert((Is_traits_point_convertible_2< - Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); + static_assert(Is_traits_point_convertible_2< + Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value); To_approx converter; return converter(wp); @@ -158,8 +158,8 @@ class Lazy_alpha_nt_2 Exact_point to_exact(const Input_point& wp) const { // The traits class' Point_2 must be convertible using the Cartesian converter - static_assert((Is_traits_point_convertible_2< - Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); + static_assert(Is_traits_point_convertible_2< + Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value); To_exact converter; return converter(wp); diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h index a7fdc406b041..a4a93f825158 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h @@ -108,8 +108,8 @@ class Alpha_shape_3 : public Dt typedef typename Gt::FT Coord_type; //checks whether tags are correctly set in Vertex and Cell classes - static_assert( (std::is_same::value) ); - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); + static_assert(std::is_same::value); typedef typename Dt::Point Point; diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h index f20b050c1a2c..cf732c40d67f 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h @@ -139,8 +139,8 @@ class Lazy_alpha_nt_3{ Approx_point to_approx(const Input_point& wp) const { // The traits class' Point_3 must be convertible using the Cartesian converter - static_assert((Is_traits_point_convertible_3< - Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); + static_assert(Is_traits_point_convertible_3< + Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value); To_approx converter; return converter(wp); @@ -149,8 +149,8 @@ class Lazy_alpha_nt_3{ Exact_point to_exact(const Input_point& wp) const { // The traits class' Point_3 must be convertible using the Cartesian converter - static_assert((Is_traits_point_convertible_3< - Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); + static_assert(Is_traits_point_convertible_3< + Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value); To_exact converter; return converter(wp); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 0d81f8b81936..648835842e3b 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -193,7 +193,7 @@ class Alpha_wrap_3 { // Due to the Steiner point computation being a dichotomy, the algorithm is inherently inexact // and passing exact kernels is explicitly disabled to ensure no misunderstanding. - static_assert((std::is_floating_point::value)); + static_assert(std::is_floating_point::value); } public: diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h index 122599a7d50b..c87f82ac75fe 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h @@ -146,7 +146,7 @@ class Triangle_mesh_oracle VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, tmesh)); - static_assert((std::is_same::value_type, Point_3>::value)); + static_assert(std::is_same::value_type, Point_3>::value); Splitter_base::reserve(num_faces(tmesh)); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h index e602b708f955..0a8f589fc2df 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h @@ -143,7 +143,7 @@ class Triangle_soup_oracle #endif PPM pm = choose_parameter(get_parameter(np, internal_np::point_map)); - static_assert((std::is_same::value_type, Point_3>::value)); + static_assert(std::is_same::value_type, Point_3>::value); Splitter_base::reserve(faces.size()); diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp index 2947c3a3761a..7c48e66a2c12 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp @@ -18,17 +18,17 @@ int main() { { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } return 0; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h index 8b4a3e1eca23..8686132cc41f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h @@ -90,10 +90,10 @@ class Arr_bounded_planar_topology_traits_2 : typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value)); - static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value)); - static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value)); - static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value)); + static_assert(std::is_same< Left_side_category, Arr_oblivious_side_tag >::value); + static_assert(std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value); + static_assert(std::is_same< Top_side_category, Arr_oblivious_side_tag >::value); + static_assert(std::is_same< Right_side_category, Arr_oblivious_side_tag >::value); //@} /*! \struct diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 5a32bb997d75..19a95a662f66 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -172,14 +172,14 @@ overlay(const Arrangement_on_surface_2& arr1 typedef typename Agt2::Point_2 A_point; typedef typename Bgt2::Point_2 B_point; typedef typename Rgt2::Point_2 Res_point; - static_assert((boost::is_convertible::value)); - static_assert((boost::is_convertible::value)); + static_assert(std::is_convertible::value); + static_assert(std::is_convertible::value); typedef typename Agt2::X_monotone_curve_2 A_xcv; typedef typename Bgt2::X_monotone_curve_2 B_xcv; typedef typename Rgt2::X_monotone_curve_2 Res_xcv; - static_assert((boost::is_convertible::value)); - static_assert((boost::is_convertible::value)); + static_assert(std::is_convertible::value); + static_assert(std::is_convertible::value); typedef Arr_traits_basic_adaptor_2 Gt_adaptor_2; typedef Arr_overlay_traits_2 diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h index f72169eea37e..f0ff24f1291b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h @@ -62,9 +62,9 @@ class Base_rational_arc_ds_1 typedef std::vector > Root_multiplicity_vector; - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); public: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index da8875c47681..8b0765062279 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -100,9 +100,9 @@ class Base_rational_arc_d_1 typedef Algebraic_point_2 Point_2; - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); public: const Rational_function& get_rational_function(const Polynomial_1& numerator, diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h index d7b170e979b8..67202ce862f5 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h @@ -91,14 +91,14 @@ class Arr_spherical_topology_traits_2 { typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Left_side_category, Arr_identified_side_tag >::value)); - static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Bottom_side_category, Arr_contracted_side_tag >::value)); - static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Top_side_category, Arr_contracted_side_tag >::value)); - static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Right_side_category, Arr_identified_side_tag >::value)); + static_assert(std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Left_side_category, Arr_identified_side_tag >::value); + static_assert(std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Bottom_side_category, Arr_contracted_side_tag >::value); + static_assert(std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Top_side_category, Arr_contracted_side_tag >::value); + static_assert(std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Right_side_category, Arr_identified_side_tag >::value); //@} /*! \struct diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h index 30181d7270f3..09cc7c94710f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h @@ -87,14 +87,14 @@ class Arr_unb_planar_topology_traits_2 : typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Left_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Bottom_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag>::value || - std::is_same< Top_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Right_side_category, Arr_open_side_tag >::value)); + static_assert(std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Left_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Bottom_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Top_side_category, Arr_oblivious_side_tag>::value || + std::is_same< Top_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Right_side_category, Arr_open_side_tag >::value); //@} /*! \struct diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h index cf4ae5eb11ba..ae87c8ddb28c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h @@ -77,10 +77,10 @@ class Arrangement_on_surface_2 { typedef typename Traits_adaptor_2::Top_side_category Top_side_category; typedef typename Traits_adaptor_2::Right_side_category Right_side_category; - static_assert((Arr_sane_identified_tagging::value)); + Right_side_category>::value); public: typedef Arrangement_on_surface_2 diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index d011306472ee..81f1c8bad04f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -67,10 +67,10 @@ class Arrangement_zone_2 { typedef typename Traits_adaptor_2::Top_side_category Top_side_category; typedef typename Traits_adaptor_2::Right_side_category Right_side_category; - static_assert((Arr_sane_identified_tagging::value)); + Right_side_category>::value); public: typedef ZoneVisitor_ Visitor; diff --git a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h index 3ec900827933..1dd6235a28cd 100644 --- a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h +++ b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h @@ -49,10 +49,10 @@ class Generic_facegraph_builder typedef typename CGAL::GetVertexPointMap::type VPM; // usually will be true, but might not be the case if using custom type points -// static_assert((std::is_same::value_type>::value)); -// static_assert((std::is_same::type>::value)); +// static_assert(std::is_same::value_type>::value); +// static_assert(std::is_same::type>::value); typedef typename internal_np::Lookup_named_param_def< internal_np::vertex_normal_map_t, NamedParameters, diff --git a/BGL/test/BGL/test_Properties.cpp b/BGL/test/BGL/test_Properties.cpp index ca63a2f78032..04c8ae7beb67 100644 --- a/BGL/test/BGL/test_Properties.cpp +++ b/BGL/test/BGL/test_Properties.cpp @@ -98,7 +98,7 @@ void test_vertex_index_map_uniqueness(const Graph& g, typedef typename CGAL::GetInitializedVertexIndexMap::const_type CVIM; // in the case where the map is passed by NP, its type doesn't depend on whether the mesh is const or not - static_assert((std::is_same::value), "VIM, CVIM must be the same type"); + static_assert(std::is_same::value, "VIM, CVIM must be the same type"); VIM ivim = CGAL::get_initialized_vertex_index_map(g, np); @@ -114,7 +114,7 @@ void test_halfedge_index_map_uniqueness(const Graph& g, typedef typename CGAL::GetInitializedHalfedgeIndexMap::const_type CHIM; // in the case where the map is passed by NP, its type doesn't depend on whether the mesh is const or not - static_assert((std::is_same::value), "HIM, CHIM must be the same type"); + static_assert(std::is_same::value, "HIM, CHIM must be the same type"); HIM ihim = CGAL::get_initialized_halfedge_index_map(g, np); @@ -130,7 +130,7 @@ void test_edge_index_map_uniqueness(const Graph& g, typedef typename CGAL::GetInitializedEdgeIndexMap::const_type CEIM; // in the case where the map is passed by NP, its type doesn't depend on whether the mesh is const or not - static_assert((std::is_same::value), "EIM, CEIM must be the same type"); + static_assert(std::is_same::value, "EIM, CEIM must be the same type"); EIM ieim = CGAL::get_initialized_edge_index_map(g, np); @@ -146,7 +146,7 @@ void test_face_index_map_uniqueness(const Graph& g, typedef typename CGAL::GetInitializedFaceIndexMap::const_type CFIM; // in the case where the map is passed by NP, its type doesn't depend on whether the mesh is const or not - static_assert((std::is_same::value), "FIM, CFIM must be the same type"); + static_assert(std::is_same::value, "FIM, CFIM must be the same type"); FIM ifim = CGAL::get_initialized_face_index_map(g, np); diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h index ef8cc06083f9..8a0744933e3a 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h @@ -123,14 +123,14 @@ class Gps_agg_meta_traits : typedef typename Arr::Right_side_category Right_side_category; // a side is either oblivious or open (unbounded) - static_assert((std::is_same::value || - std::is_same::value)); - static_assert((std::is_same::value || - std::is_same::value)); - static_assert((std::is_same::value || - std::is_same::value)); - static_assert((std::is_same::value || - std::is_same::value)); + static_assert(std::is_same::value || + std::is_same::value); + static_assert(std::is_same::value || + std::is_same::value); + static_assert(std::is_same::value || + std::is_same::value); + static_assert(std::is_same::value || + std::is_same::value); typedef typename Arr::Halfedge_handle Halfedge_handle; typedef typename Arr::Vertex_handle Vertex_handle; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h index 9c59b4f32753..d9d6f19c1c90 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h @@ -53,14 +53,14 @@ class Gps_traits_decorator typedef typename Base::Right_side_category Right_side_category; // a side is either oblivious or open (unbounded) - static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Left_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Bottom_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Top_side_category, Arr_open_side_tag >::value)); - static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || - std::is_same< Right_side_category, Arr_open_side_tag >::value)); + static_assert(std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Left_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Bottom_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Top_side_category, Arr_open_side_tag >::value); + static_assert(std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + std::is_same< Right_side_category, Arr_open_side_tag >::value); class Ex_point_2 { diff --git a/Circulator/include/CGAL/circulator.h b/Circulator/include/CGAL/circulator.h index d985eba576c2..2dcb0200ba67 100644 --- a/Circulator/include/CGAL/circulator.h +++ b/Circulator/include/CGAL/circulator.h @@ -193,45 +193,45 @@ template inline void Assert_circulator( const C &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_iterator( const I &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_input_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_output_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_forward_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_bidirectional_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } template inline void Assert_random_access_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - static_assert((boost::is_convertible::value)); + static_assert(boost::is_convertible::value); } // The assert at-least-category functions use the following // functions to resolve properly. Note the proper order of the diff --git a/Combinatorial_map/include/CGAL/Cell_iterators.h b/Combinatorial_map/include/CGAL/Cell_iterators.h index 9f7095c1900f..93104ba01e20 100644 --- a/Combinatorial_map/include/CGAL/Cell_iterators.h +++ b/Combinatorial_map/include/CGAL/Cell_iterators.h @@ -82,8 +82,8 @@ namespace CGAL { Ite(amap, adart, amap.get_new_mark()), mcell_mark_number(amap.get_new_mark()) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mcell_mark_number)); mark_cell(amap, adart, mcell_mark_number); @@ -196,8 +196,8 @@ namespace CGAL { Ite(amap, adart), mmark_number(amap.get_new_mark()) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, adart, mmark_number); } @@ -303,8 +303,8 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); } diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 7266c4cd5419..e2145afb1f3c 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -1524,8 +1524,8 @@ namespace CGAL { template < class Ite > std::ostream& display_orbits(std::ostream & aos) const { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); unsigned int nb = 0; size_type amark = get_new_mark(); for ( typename Dart_range::const_iterator it1(darts().begin()), diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h index 56991cc55d16..7cb121ff1d80 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h @@ -34,8 +34,8 @@ namespace CGAL typename Map::Dart_const_descriptor adart1, typename Map::Dart_const_descriptor adart2) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); bool found=false; for (Iterator it(amap, adart1); !found && it.cont(); ++it) @@ -57,8 +57,8 @@ namespace CGAL typename Map::Dart_const_descriptor adart, typename Map::size_type amark) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); bool res=true; for ( Iterator it(amap, adart); res && it.cont(); ++it ) @@ -98,8 +98,8 @@ namespace CGAL typename Map::Dart_const_descriptor adart, typename Map::size_type amark) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion( (is_whole_orbit_unmarked > (amap, adart, amark)) ); @@ -305,8 +305,8 @@ namespace CGAL typename Map::size_type amark, typename Map::size_type amark2=Map::INVALID_MARK) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion( (is_whole_orbit_unmarked > (amap, adart, amark)) ); diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h index 25419ab98c05..a50266f76592 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h @@ -305,8 +305,8 @@ namespace CGAL { typedef typename Map::size_type size_type; - static_assert( (Bi<=Map::dimension && - std::is_same::value) ); + static_assert(Bi<=Map::dimension && + std::is_same::value); public: /// Main constructor. @@ -493,8 +493,8 @@ namespace CGAL { typedef typename Map::size_type size_type; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); /// Main constructor. CMap_non_basic_iterator(Map& amap, Dart_descriptor adart1): @@ -579,8 +579,8 @@ namespace CGAL { /// True iff this iterator is basic typedef Tag_false Basic_iterator; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); /// Main constructor. CMap_non_basic_iterator(Map& amap, Dart_descriptor adart): diff --git a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp index cbb64ac931c7..c52ef82bf227 100644 --- a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp +++ b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp @@ -23,12 +23,12 @@ using namespace CGAL::Convex_hull_3::internal; int main() { - static_assert( (std::is_same::type>::value) ); - static_assert( (std::is_same::type>::value) ); - static_assert( (std::is_same::type>::value) ); - static_assert( (std::is_same::type>::value) ); - static_assert( (std::is_same::type>::value) ); - static_assert( (std::is_same,Default_traits_for_Chull_3::type>::value) ); - static_assert( (std::is_same, boost::true_type >::Protector,CGAL::Protect_FPU_rounding >::value) ); + static_assert(std::is_same::type>::value); + static_assert(std::is_same::type>::value); + static_assert(std::is_same::type>::value); + static_assert(std::is_same::type>::value); + static_assert(std::is_same::type>::value); + static_assert(std::is_same,Default_traits_for_Chull_3::type>::value); + static_assert(std::is_same, boost::true_type >::Protector,CGAL::Protect_FPU_rounding >::value); return 0; } diff --git a/Generalized_map/include/CGAL/GMap_cell_iterators.h b/Generalized_map/include/CGAL/GMap_cell_iterators.h index f708a3a1321b..55dbbff83086 100644 --- a/Generalized_map/include/CGAL/GMap_cell_iterators.h +++ b/Generalized_map/include/CGAL/GMap_cell_iterators.h @@ -70,8 +70,8 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); } @@ -183,8 +183,8 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); } diff --git a/Generalized_map/include/CGAL/GMap_dart_iterators.h b/Generalized_map/include/CGAL/GMap_dart_iterators.h index 1545166af3aa..b2eaaf97b70a 100644 --- a/Generalized_map/include/CGAL/GMap_dart_iterators.h +++ b/Generalized_map/include/CGAL/GMap_dart_iterators.h @@ -154,7 +154,7 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - static_assert( (0<=Ai && Ai+delta<=Map::dimension && delta>1) ); + static_assert(0<=Ai && Ai+delta<=Map::dimension && delta>1); public: /// Main constructor. @@ -468,9 +468,9 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - static_assert( (0<=Ai && delta11) ); + delta1>1); public: /// Main constructor. diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index bc9b60c0f905..d7f75bd151ac 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -1347,8 +1347,8 @@ namespace CGAL { template < class Ite > std::ostream& display_orbits(std::ostream & aos) const { - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); unsigned int nb = 0; size_type amark = get_new_mark(); for ( typename Dart_range::const_iterator it1(darts().begin()), diff --git a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h index 6e9976bca4b7..034b1600f936 100644 --- a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h +++ b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h @@ -59,8 +59,8 @@ namespace CGAL { typedef Tag_true Use_mark; - static_assert( (Ai<=Map::dimension && - std::is_same::value) ); + static_assert(Ai<=Map::dimension && + std::is_same::value); public: /// Main constructor. diff --git a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h index 150efcbf88e0..0d688be64ede 100644 --- a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h +++ b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h @@ -752,8 +752,8 @@ class Surface_mesh_geodesic_distances_3 > #endif { - static_assert((std::is_same::value) || - (std::is_same::value)); + static_assert(std::is_same::value) || + (std::is_same::value); // extract real types from Default #ifdef CGAL_EIGEN3_ENABLED diff --git a/Installation/test/Installation/test_configuration_qt5.cpp b/Installation/test/Installation/test_configuration_qt5.cpp index 9a869cc25b6d..73206ca0b4fe 100644 --- a/Installation/test/Installation/test_configuration_qt5.cpp +++ b/Installation/test/Installation/test_configuration_qt5.cpp @@ -13,7 +13,7 @@ template typename CGAL::Coercion_traits::Type binary_func(const A& a , const B& b){ typedef CGAL::Coercion_traits CT; - static_assert((CT::Are_explicit_interoperable::value)); + static_assert(CT::Are_explicit_interoperable::value); typename CT::Cast cast; return cast(a)*cast(b); } diff --git a/Intersections_2/include/CGAL/Intersection_traits.h b/Intersections_2/include/CGAL/Intersection_traits.h index 3bfb327db9e6..67dc75125819 100644 --- a/Intersections_2/include/CGAL/Intersection_traits.h +++ b/Intersections_2/include/CGAL/Intersection_traits.h @@ -181,8 +181,8 @@ do_intersect_impl(const A& a, const B& b, Dynamic_dimension_tag) { // inline // typename Intersection_traits< typename Kernel_traits::Kernel, A, B>::result_type >::type // intersection(const A& a, const B& b) { -// static_assert( (std::is_same::value), -// "intersection with objects of different dimensions not supported"); +// static_assert(std::is_same::value), +// "intersection with objects of different dimensions not supported"; // return internal::intersection_impl(a, b, typename A::Ambient_dimension()); // } @@ -190,7 +190,7 @@ do_intersect_impl(const A& a, const B& b, Dynamic_dimension_tag) { // inline // auto // K::Boolean // do_intersect(const A& a, const B& b) { -// static_assert((std::is_same::value), +// static_assert(std::is_same::value, // "do_intersect with objects of different dimensions not supported"); // return internal::do_intersect_impl(a, b, typename A::Ambient_dimension()); // } diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h index 183158050e80..b62510e78923 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h @@ -66,7 +66,7 @@ class Do_intersect_bbox_segment_aux_is_greater double dmax; public: - static_assert((std::is_same::value)); + static_assert(std::is_same::value); Do_intersect_bbox_segment_aux_is_greater() : error(0.), tmax(0.), dmax(0.) {} diff --git a/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h b/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h index b82269dbf141..ba0ac8f14e73 100644 --- a/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h +++ b/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h @@ -41,7 +41,7 @@ void test_bigfloat_interval_traits() { typedef typename BFIT::Is_bigfloat_interval Is_bigfloat_interval; CGAL_USE_TYPE(Is_bigfloat_interval); // using CGAL::Tag_true; - static_assert(( ::std::is_same< Is_bigfloat_interval, CGAL::Tag_true>::value)); + static_assert(::std::is_same< Is_bigfloat_interval, CGAL::Tag_true>::value); const typename BFIT::Construct construct = typename BFIT::Construct(); const typename BFIT::Set_precision set_precision = typename BFIT::Set_precision(); diff --git a/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h b/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h index 59addf6a1fed..8235c825644a 100644 --- a/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h +++ b/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h @@ -41,7 +41,7 @@ template void test_convert_to_bfi_from(BFI,From){ typedef typename CGAL::Coercion_traits::Type CT_type; CGAL_USE_TYPE(CT_type); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); assert(CGAL::convert_to_bfi(From(0)) == BFI(0)); assert(CGAL::convert_to_bfi(From(1)) == BFI(1)); assert(CGAL::convert_to_bfi(From(2)) == BFI(2)); diff --git a/Interval_support/include/CGAL/Test/_test_interval_traits.h b/Interval_support/include/CGAL/Test/_test_interval_traits.h index dffa0a292e9d..e90f8616ff2e 100644 --- a/Interval_support/include/CGAL/Test/_test_interval_traits.h +++ b/Interval_support/include/CGAL/Test/_test_interval_traits.h @@ -74,8 +74,8 @@ void test_interval_traits() { typedef typename IT::With_empty_interval With_empty_interval; CGAL_USE_TYPE(Is_interval); using CGAL::Tag_true; - static_assert(( ::std::is_same< Is_interval, Tag_true>::value)); - static_assert(( ::std::is_same< Interval_, Interval>::value)); + static_assert(::std::is_same< Is_interval, Tag_true>::value); + static_assert(::std::is_same< Interval_, Interval>::value); test_with_empty_interval(With_empty_interval()); diff --git a/Kernel_23/include/CGAL/Circle_2.h b/Kernel_23/include/CGAL/Circle_2.h index 48a4896fe4e8..b6020ff75282 100644 --- a/Kernel_23/include/CGAL/Circle_2.h +++ b/Kernel_23/include/CGAL/Circle_2.h @@ -35,7 +35,7 @@ class Circle_2 : public R_::Kernel_base::Circle_2 typedef typename R_::Aff_transformation_2 Aff_transformation_2; typedef Circle_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Circle_3.h b/Kernel_23/include/CGAL/Circle_3.h index 4da79afd351a..b23e651e9fc8 100644 --- a/Kernel_23/include/CGAL/Circle_3.h +++ b/Kernel_23/include/CGAL/Circle_3.h @@ -43,7 +43,7 @@ template typedef typename R_::Direction_3 Direction_3; typedef Circle_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Direction_2.h b/Kernel_23/include/CGAL/Direction_2.h index d3376d740213..407d4e31ed10 100644 --- a/Kernel_23/include/CGAL/Direction_2.h +++ b/Kernel_23/include/CGAL/Direction_2.h @@ -38,7 +38,7 @@ class Direction_2 : public R_::Kernel_base::Direction_2 typedef typename R_::Kernel_base::Direction_2 RDirection_2; typedef Direction_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Direction_3.h b/Kernel_23/include/CGAL/Direction_3.h index 6c0d13596578..18a88f7954d5 100644 --- a/Kernel_23/include/CGAL/Direction_3.h +++ b/Kernel_23/include/CGAL/Direction_3.h @@ -37,7 +37,7 @@ class Direction_3 : public R_::Kernel_base::Direction_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Direction_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Has_conversion.h b/Kernel_23/include/CGAL/Has_conversion.h index 0a042781facb..4e5d46032545 100644 --- a/Kernel_23/include/CGAL/Has_conversion.h +++ b/Kernel_23/include/CGAL/Has_conversion.h @@ -23,9 +23,9 @@ namespace internal { template struct Converter_selector { - static_assert((std::is_same::value), - "Kernels must have the same representation"); + static_assert(std::is_same::value, + "Kernels must have the same representation"); typedef CGAL::Cartesian_converter type; }; @@ -33,9 +33,9 @@ struct Converter_selector template struct Converter_selector { - static_assert((std::is_same::value), - "Kernels must have the same representation"); + static_assert(std::is_same::value, + "Kernels must have the same representation"); typedef CGAL::Homogeneous_converter type; }; diff --git a/Kernel_23/include/CGAL/Iso_cuboid_3.h b/Kernel_23/include/CGAL/Iso_cuboid_3.h index 22eeefbd4aaa..d279426727f0 100644 --- a/Kernel_23/include/CGAL/Iso_cuboid_3.h +++ b/Kernel_23/include/CGAL/Iso_cuboid_3.h @@ -35,7 +35,7 @@ class Iso_cuboid_3 : public R_::Kernel_base::Iso_cuboid_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Iso_cuboid_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Iso_rectangle_2.h b/Kernel_23/include/CGAL/Iso_rectangle_2.h index e02aad3d267f..7d3dc5a47096 100644 --- a/Kernel_23/include/CGAL/Iso_rectangle_2.h +++ b/Kernel_23/include/CGAL/Iso_rectangle_2.h @@ -33,7 +33,7 @@ class Iso_rectangle_2 : public R_::Kernel_base::Iso_rectangle_2 typedef typename R_::Aff_transformation_2 Aff_transformation_2; typedef Iso_rectangle_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Line_2.h b/Kernel_23/include/CGAL/Line_2.h index 141e6d6fb130..33406d119a5b 100644 --- a/Kernel_23/include/CGAL/Line_2.h +++ b/Kernel_23/include/CGAL/Line_2.h @@ -41,7 +41,7 @@ class Line_2 : public R_::Kernel_base::Line_2 typedef typename R_::Kernel_base::Line_2 RLine_2; typedef Line_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Line_3.h b/Kernel_23/include/CGAL/Line_3.h index 8ceb47b6280e..ebfb32c7972a 100644 --- a/Kernel_23/include/CGAL/Line_3.h +++ b/Kernel_23/include/CGAL/Line_3.h @@ -38,7 +38,7 @@ class Line_3 : public R_::Kernel_base::Line_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Line_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Plane_3.h b/Kernel_23/include/CGAL/Plane_3.h index f41fc96bb813..b391b4388d28 100644 --- a/Kernel_23/include/CGAL/Plane_3.h +++ b/Kernel_23/include/CGAL/Plane_3.h @@ -41,7 +41,7 @@ class Plane_3 : public R_::Kernel_base::Plane_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Plane_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Point_2.h b/Kernel_23/include/CGAL/Point_2.h index ee8df80b3298..96bffa243e22 100644 --- a/Kernel_23/include/CGAL/Point_2.h +++ b/Kernel_23/include/CGAL/Point_2.h @@ -37,7 +37,7 @@ class Point_2 : public R_::Kernel_base::Point_2 typedef typename R_::Kernel_base::Point_2 RPoint_2; typedef Point_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Point_3.h b/Kernel_23/include/CGAL/Point_3.h index 27d1d19e0dfe..f2444a9506c0 100644 --- a/Kernel_23/include/CGAL/Point_3.h +++ b/Kernel_23/include/CGAL/Point_3.h @@ -34,7 +34,7 @@ class Point_3 : public R_::Kernel_base::Point_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Point_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Ray_2.h b/Kernel_23/include/CGAL/Ray_2.h index 73eecc1c025d..626730bbc864 100644 --- a/Kernel_23/include/CGAL/Ray_2.h +++ b/Kernel_23/include/CGAL/Ray_2.h @@ -42,7 +42,7 @@ class Ray_2 : public R_::Kernel_base::Ray_2 typedef typename R_::Kernel_base::Ray_2 RRay_2; typedef Ray_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Ray_3.h b/Kernel_23/include/CGAL/Ray_3.h index c2880eab254e..b415af7ad01b 100644 --- a/Kernel_23/include/CGAL/Ray_3.h +++ b/Kernel_23/include/CGAL/Ray_3.h @@ -36,7 +36,7 @@ class Ray_3 : public R_::Kernel_base::Ray_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Ray_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Segment_2.h b/Kernel_23/include/CGAL/Segment_2.h index b789fe25aac8..d5d89246f3ba 100644 --- a/Kernel_23/include/CGAL/Segment_2.h +++ b/Kernel_23/include/CGAL/Segment_2.h @@ -40,7 +40,7 @@ class Segment_2 : public R_::Kernel_base::Segment_2 typedef typename R_::Kernel_base::Segment_2 RSegment_2; typedef Segment_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Segment_3.h b/Kernel_23/include/CGAL/Segment_3.h index 45aa885fe1d2..61e02d657db1 100644 --- a/Kernel_23/include/CGAL/Segment_3.h +++ b/Kernel_23/include/CGAL/Segment_3.h @@ -38,7 +38,7 @@ class Segment_3 : public R_::Kernel_base::Segment_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Segment_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Sphere_3.h b/Kernel_23/include/CGAL/Sphere_3.h index 76fa374f831c..b0a7c271e246 100644 --- a/Kernel_23/include/CGAL/Sphere_3.h +++ b/Kernel_23/include/CGAL/Sphere_3.h @@ -37,7 +37,7 @@ class Sphere_3 : public R_::Kernel_base::Sphere_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Sphere_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Tetrahedron_3.h b/Kernel_23/include/CGAL/Tetrahedron_3.h index 58710cbd72ce..549680d25544 100644 --- a/Kernel_23/include/CGAL/Tetrahedron_3.h +++ b/Kernel_23/include/CGAL/Tetrahedron_3.h @@ -33,7 +33,7 @@ class Tetrahedron_3 : public R_::Kernel_base::Tetrahedron_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Tetrahedron_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Triangle_2.h b/Kernel_23/include/CGAL/Triangle_2.h index 1e1d38e707e8..8deabe91f6ea 100644 --- a/Kernel_23/include/CGAL/Triangle_2.h +++ b/Kernel_23/include/CGAL/Triangle_2.h @@ -35,7 +35,7 @@ class Triangle_2 : public R_::Kernel_base::Triangle_2 typedef typename R_::Kernel_base::Triangle_2 RTriangle_2; typedef Triangle_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Triangle_3.h b/Kernel_23/include/CGAL/Triangle_3.h index 93d30cc4de2a..19bbd8064eca 100644 --- a/Kernel_23/include/CGAL/Triangle_3.h +++ b/Kernel_23/include/CGAL/Triangle_3.h @@ -36,7 +36,7 @@ class Triangle_3 : public R_::Kernel_base::Triangle_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Triangle_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Vector_2.h b/Kernel_23/include/CGAL/Vector_2.h index dcb85eaeb4ad..4449fc3ef9f0 100644 --- a/Kernel_23/include/CGAL/Vector_2.h +++ b/Kernel_23/include/CGAL/Vector_2.h @@ -42,7 +42,7 @@ class Vector_2 : public R_::Kernel_base::Vector_2 typedef typename R_::Kernel_base::Vector_2 RVector_2; typedef Vector_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Vector_3.h b/Kernel_23/include/CGAL/Vector_3.h index 0d3f16fc2fc5..9220f3e8527b 100644 --- a/Kernel_23/include/CGAL/Vector_3.h +++ b/Kernel_23/include/CGAL/Vector_3.h @@ -42,7 +42,7 @@ class Vector_3 : public R_::Kernel_base::Vector_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Vector_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/include/CGAL/Weighted_point_2.h b/Kernel_23/include/CGAL/Weighted_point_2.h index d2c4f4a48e1d..32ca07df1535 100644 --- a/Kernel_23/include/CGAL/Weighted_point_2.h +++ b/Kernel_23/include/CGAL/Weighted_point_2.h @@ -34,7 +34,7 @@ class Weighted_point_2 : public R_::Kernel_base::Weighted_point_2 typedef typename R_::FT RT; typedef Weighted_point_2 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: typedef Dimension_tag<2> Ambient_dimension; diff --git a/Kernel_23/include/CGAL/Weighted_point_3.h b/Kernel_23/include/CGAL/Weighted_point_3.h index b9358604af8d..28e8f9489a55 100644 --- a/Kernel_23/include/CGAL/Weighted_point_3.h +++ b/Kernel_23/include/CGAL/Weighted_point_3.h @@ -34,7 +34,7 @@ class Weighted_point_3 : public R_::Kernel_base::Weighted_point_3 typedef typename R_::FT FT; typedef Weighted_point_3 Self; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); public: diff --git a/Kernel_23/test/Kernel_23/test_RT_or_FT_predicates.cpp b/Kernel_23/test/Kernel_23/test_RT_or_FT_predicates.cpp index 03b2787cc0b3..b0771f329ca7 100644 --- a/Kernel_23/test/Kernel_23/test_RT_or_FT_predicates.cpp +++ b/Kernel_23/test/Kernel_23/test_RT_or_FT_predicates.cpp @@ -229,12 +229,12 @@ void generate_atomic_compilation_test(const std::string& FT_name, if(check != NO_CHECK) { - out << " static_assert((std::is_same::value));\n"; diff --git a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h index e336fe53d397..d30acbcb141c 100644 --- a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h @@ -485,8 +485,8 @@ class Compact_mesh_cell_3 template const Point_3& weighted_circumcenter(const GT_& gt) const { - static_assert((std::is_same::value)); + static_assert(std::is_same::value); if (internal_tbb::is_null(weighted_circumcenter_)) { this->try_to_set_circumcenter( new Point_3(gt.construct_weighted_circumcenter_3_object() diff --git a/Mesh_3/include/CGAL/Mesh_criteria_3.h b/Mesh_3/include/CGAL/Mesh_criteria_3.h index cd46b813cd64..0fa4cf439021 100644 --- a/Mesh_3/include/CGAL/Mesh_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_criteria_3.h @@ -101,19 +101,19 @@ class Mesh_criteria_3_impl template void add_facet_criterion(Facet_criterion* criterion) { - static_assert((boost::is_base_of< + static_assert(boost::is_base_of< typename Facet_criteria::Abstract_criterion, Facet_criterion - >::value)); + >::value); facet_criteria_.add(criterion); } template void add_cell_criterion(Cell_criterion* criterion) { - static_assert((boost::is_base_of< + static_assert(boost::is_base_of< typename Cell_criteria::Abstract_criterion, Cell_criterion - >::value)); + >::value); cell_criteria_.add(criterion); } diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp index 76addcd6f618..cb8bcbe6125b 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp @@ -35,10 +35,10 @@ struct Polyhedron_tester : public Tester typedef CGAL::Polyhedron_3 Polyhedron; typedef CGAL::Polyhedral_mesh_domain_3 Mesh_domain; - static_assert((std::is_same< + static_assert(std::is_same< typename Mesh_domain::Surface_patch_index, std::pair - >::value)); + >::value); typedef typename CGAL::Mesh_triangulation_3< Mesh_domain, diff --git a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h index 5ce03215db3d..a1aced0e3ff2 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h +++ b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h @@ -959,7 +959,7 @@ bool is_forward_edge(const Const_decorator& N, void assert_type_precondition() const { typename PM_decorator_::Point p1; Point p2; - static_assert((std::is_same::value)); } + static_assert(std::is_same::value); } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h index b00b0af2d161..31f86c5c43a0 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h @@ -135,8 +135,8 @@ template struct Kernel_d_interface : public Base_ { typedef typename Base::Point_cartesian_const_iterator result_type; // Kernel_d requires a common iterator type for points and vectors // TODO: provide this mixed functor in preKernel? - // static_assert((std::is_same::type>::type, result_type>::value)); - // static_assert((std::is_same::type, result_type>::value)); + // static_assert(std::is_same::type>::type, result_type>::value); + // static_assert(std::is_same::type, result_type>::value); template auto operator()(Point_d const&p, Tag_ t)const{ return CPI(this->kernel())(p,t); diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h index c4f7a47040b5..4efc63d87a64 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h @@ -32,7 +32,7 @@ class Hyperplane_d : public Get_type:: typedef typename Get_functor::type HTBase; typedef Hyperplane_d Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h index ed038e9c95f9..af2d970f3f28 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h @@ -40,7 +40,7 @@ class Point_d : public Get_type::type typedef Point_d Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h index 364a4184e96d..097a41f97554 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h @@ -33,7 +33,7 @@ class Ref_count_obj typedef typename Get_functor >::type CBase; typedef Ref_count_obj Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: typedef R_ R; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h index a45ce922e124..c450300b5873 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h @@ -35,7 +35,7 @@ class Segment_d : public Get_type::type typedef typename Get_functor::type CSEBase; typedef Segment_d Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h index 409c9b65e3f3..611217e9acd4 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h @@ -32,7 +32,7 @@ class Sphere_d : public Get_type::type typedef typename Get_functor::type SRBase; typedef Sphere_d Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h index 9593ef91bbc6..1b150be0aae5 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h @@ -39,7 +39,7 @@ class Vector_d : public Get_type::type typedef typename Get_functor::type SLBase; typedef Vector_d Self; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); public: diff --git a/NewKernel_d/test/NewKernel_d/Epick_d.cpp b/NewKernel_d/test/NewKernel_d/Epick_d.cpp index 1e88061cbf15..18ac1657ee63 100644 --- a/NewKernel_d/test/NewKernel_d/Epick_d.cpp +++ b/NewKernel_d/test/NewKernel_d/Epick_d.cpp @@ -740,11 +740,11 @@ template struct CGAL::Epick_d; typedef CGAL::Epick_d > Ker2; typedef CGAL::Epick_d > Ker3; typedef CGAL::Epick_d Kerd; -static_assert((std::is_same,Ker2::Dimension>::value)); -static_assert((std::is_same,Ker3::Dimension>::value)); -static_assert((std::is_same::value)); -static_assert((std::is_same,CGAL::Ambient_dimension::type>::value)); -static_assert((std::is_same,CGAL::Ambient_dimension::type>::value)); +static_assert(std::is_same,Ker2::Dimension>::value); +static_assert(std::is_same,Ker3::Dimension>::value); +static_assert(std::is_same::value); +static_assert(std::is_same,CGAL::Ambient_dimension::type>::value); +static_assert(std::is_same,CGAL::Ambient_dimension::type>::value); int main(){ //Broken with Linear_base_d (output iterator) //test2 >(); diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index be91713a6749..0bca67f5c930 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -944,9 +944,9 @@ struct Div_mod_selector { void operator()( const NT1& x, const NT2& y, NT& q, NT& r ) const { - static_assert((::std::is_same< + static_assert(::std::is_same< typename Coercion_traits< NT1, NT2 >::Type, NT - >::value)); + >::value); typename Coercion_traits< NT1, NT2 >::Cast cast; operator()( cast(x), cast(y), q, r ); @@ -1029,8 +1029,8 @@ template < typename ET > class Real_embeddable_traits< Lazy_exact_nt > : public INTERN_RET::Real_embeddable_traits_base< Lazy_exact_nt , CGAL::Tag_true > { // Every type ET of Lazy_exact_nt has to be real embeddable. - static_assert((::std::is_same< typename Real_embeddable_traits< ET > - ::Is_real_embeddable, Tag_true >::value)); + static_assert(::std::is_same< typename Real_embeddable_traits< ET > + ::Is_real_embeddable, Tag_true >::value); public: typedef Lazy_exact_nt Type; diff --git a/Number_types/include/CGAL/Root_of_traits.h b/Number_types/include/CGAL/Root_of_traits.h index c014e667293d..32d81e481a97 100644 --- a/Number_types/include/CGAL/Root_of_traits.h +++ b/Number_types/include/CGAL/Root_of_traits.h @@ -150,7 +150,7 @@ struct Root_of_traits_helper < FT, Field_tag > // We have the typedef as VC10 fails with // static_assert(FrT::Is_fraction::value) typedef typename FrT::Is_fraction ISF; - static_assert((ISF::value)); + static_assert(ISF::value); typedef typename FrT::Numerator_type RT; diff --git a/Number_types/include/CGAL/Test/test_root_of_traits.h b/Number_types/include/CGAL/Test/test_root_of_traits.h index 23f4b5dafc73..58c1340335f7 100644 --- a/Number_types/include/CGAL/Test/test_root_of_traits.h +++ b/Number_types/include/CGAL/Test/test_root_of_traits.h @@ -28,8 +28,8 @@ void test_root_of_traits(){ typedef typename RoT::Root_of_1 Root_of_1; typedef typename RoT::Root_of_2 Root_of_2; - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); typedef typename RoT::Make_root_of_2 Make_root_of_2; typedef typename RoT::Make_sqrt Make_sqrt; @@ -41,10 +41,10 @@ void test_root_of_traits(){ const Inverse& inverse = Inverse(); const Square& square = Square(); - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); { diff --git a/Number_types/include/CGAL/simplest_rational_in_interval.h b/Number_types/include/CGAL/simplest_rational_in_interval.h index a93bcc855b49..fbb5206ffbee 100644 --- a/Number_types/include/CGAL/simplest_rational_in_interval.h +++ b/Number_types/include/CGAL/simplest_rational_in_interval.h @@ -43,10 +43,10 @@ simplest_rational_in_interval(double x, double y) { // Must be a fraction CGAL_USE_TYPE(Is_fraction); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); // Numerator_type,Denominator_type must be the same CGAL_USE_TYPE(Denominator_type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); if(x == y){ diff --git a/Number_types/include/CGAL/to_rational.h b/Number_types/include/CGAL/to_rational.h index d60f56b3eb24..3ce75dd80327 100644 --- a/Number_types/include/CGAL/to_rational.h +++ b/Number_types/include/CGAL/to_rational.h @@ -34,9 +34,9 @@ to_rational(double x) typedef typename FT::Denominator_type Denominator_type; typename FT::Compose compose; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); CGAL_USE_TYPE(Is_fraction); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); CGAL_USE_TYPE(Denominator_type); Numerator_type num(0),den(1); diff --git a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp index f80b17bc1bae..fffb0108143f 100644 --- a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp +++ b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp @@ -81,9 +81,9 @@ void test_lazy_exact_nt() { typedef CGAL::Lazy_exact_nt< typename AK::Integer > LI; typedef CGAL::Lazy_exact_nt< typename AK::Rational > LR; typedef CGAL::Coercion_traits CT; - static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); - static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - static_assert((std::is_same< typename CT::Type,LR>::value)); + static_assert(std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value); + static_assert(std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value); + static_assert(std::is_same< typename CT::Type,LR>::value); LI i(4); LR r(4); @@ -99,8 +99,8 @@ void test_lazy_exact_nt() { typedef CGAL::Lazy_exact_nt T1; typedef CGAL::Lazy_exact_nt T2; typedef CGAL::Coercion_traits CT; - static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_false>::value)); - static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_false>::value)); + static_assert(std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_false>::value); + static_assert(std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_false>::value); #endif #endif } diff --git a/Number_types/test/Number_types/Quotient_new.cpp b/Number_types/test/Number_types/Quotient_new.cpp index 079ea8fbc02b..dfa2c37da05b 100644 --- a/Number_types/test/Number_types/Quotient_new.cpp +++ b/Number_types/test/Number_types/Quotient_new.cpp @@ -62,9 +62,9 @@ void test_quotient() { typedef CGAL::Quotient QI; typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); - static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); - static_assert((std::is_same< typename CT::Type,QI>::value)); + static_assert(std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value); + static_assert(std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value); + static_assert(std::is_same< typename CT::Type,QI>::value); } } diff --git a/Number_types/test/Number_types/Sqrt_extension.h b/Number_types/test/Number_types/Sqrt_extension.h index 547aaf10ab92..825ba19d2522 100644 --- a/Number_types/test/Number_types/Sqrt_extension.h +++ b/Number_types/test/Number_types/Sqrt_extension.h @@ -24,7 +24,7 @@ void convert_to(const NT& x, RT& r){ typedef CGAL::Coercion_traits CT; typedef typename CT::Type Type; CGAL_USE_TYPE(Type); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); r = typename CT::Cast()(x); } } //namespace CGAL @@ -700,17 +700,17 @@ void test_get_arithmetic_kernel(){ typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } { typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } { typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } } diff --git a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h index fddad9865341..2ffb9133345a 100644 --- a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h +++ b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h @@ -7,12 +7,12 @@ void test_root_of_traits(){ typedef typename RoT::Root_of_1 Root_of_1; typedef typename RoT::Root_of_2 Root_of_2; - static_assert((::std::is_same::value)); - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); + static_assert(::std::is_same::value); typedef typename RoT::Make_root_of_2 Make_root_of_2; typedef typename Make_root_of_2::result_type result_type; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); const Make_root_of_2& make_root_of_2 = Make_root_of_2(); Root_of_2 r = make_root_of_2(T(0),T(-1),T(2)); //-sqrt(2) diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h index c4ce9993cf03..ae450d781e8d 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h @@ -119,7 +119,7 @@ void optimize_along_OBB_axes(typename Traits::Matrix& rot, typedef typename Traits::Matrix Matrix; typedef typename Traits::Vector Vector; - static_assert((std::is_same::type, Point>::value)); + static_assert(std::is_same::type, Point>::value); std::vector rotated_points; rotated_points.reserve(points.size()); diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h index 0e59be503105..d64b73e699bf 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h @@ -202,7 +202,7 @@ void construct_oriented_bounding_box(const PointRange& points, { typedef typename Traits::Point_3 Point; - static_assert((std::is_same::type, Point>::value)); + static_assert(std::is_same::type, Point>::value); if(use_ch) // construct the convex hull to reduce the number of points { diff --git a/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h b/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h index 43bf9c7db420..229ceab85ff6 100644 --- a/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h +++ b/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h @@ -309,14 +309,14 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point typedef Point_set_processing_3_np_helper NP_helper2; typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The vector type of input ranges must be the same"); typedef typename NP_helper1::Geom_traits Kernel; diff --git a/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h b/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h index 08012fe33977..5f45ba40acbe 100644 --- a/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h +++ b/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h @@ -222,14 +222,14 @@ register_point_sets (const PointRange1& point_set_1, PointRange2& point_set_2, typedef Point_set_processing_3_np_helper NP_helper2; typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The vector type of input ranges must be the same"); typedef typename NP_helper1::Geom_traits Kernel; diff --git a/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h b/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h index cb47b1a69c1d..6130aadaaf17 100644 --- a/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h +++ b/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h @@ -607,14 +607,14 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point // property map types typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The vector type of input ranges must be the same"); typedef typename std::iterator_traits::value_type key_type1; @@ -630,8 +630,8 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point NormalMap2 normal_map2 = NP_helper2::get_normal_map(point_set_2, np2); auto weight_map2 = choose_parameter(get_parameter(np2, internal_np::scalar_map), DefaultWeightMap2(Scalar(1))); - static_assert((std::is_same< typename boost::property_traits::value_type, - typename boost::property_traits::value_type> ::value), + static_assert(std::is_same< typename boost::property_traits::value_type, + typename boost::property_traits::value_type> ::value, "The scalar type of input ranges must be the same"); // initial transformation diff --git a/Point_set_processing_3/include/CGAL/structure_point_set.h b/Point_set_processing_3/include/CGAL/structure_point_set.h index 58b3cbee86d0..0b5174363943 100644 --- a/Point_set_processing_3/include/CGAL/structure_point_set.h +++ b/Point_set_processing_3/include/CGAL/structure_point_set.h @@ -234,7 +234,7 @@ class Point_set_with_structure typedef typename Point_set_processing_3::GetPlaneIndexMap::type PlaneIndexMap; CGAL_assertion_msg(NP_helper::has_normal_map(points, np), "Error: no normal map"); - static_assert((!is_default_parameter::value), + static_assert(!is_default_parameter::value, "Error: no plane index map"); PointMap point_map = NP_helper::get_const_point_map(points, np); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h index 691ddfa6a3bf..988e6c3a7eee 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h @@ -444,8 +444,8 @@ generic_clip_impl( typedef typename GetVertexPointMap::type Vpm2; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); Vpm vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), get_property_map(boost::vertex_point, tm1)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h index 991c4b33c4b2..bffa8e6dca16 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h @@ -553,7 +553,7 @@ std::size_t keep_large_connected_components(PolygonMesh& pmesh, >::type FaceSizeMap; typedef typename boost::property_traits::value_type Face_size; - static_assert((std::is_convertible::value)); + static_assert(std::is_convertible::value); typedef typename internal_np::Lookup_named_param_def::type VPM1; typedef typename GetVertexPointMap::type VPM2; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); VPM1 vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), get_property_map(boost::vertex_point, tm1)); @@ -694,8 +694,8 @@ corefine( TriangleMesh& tm1, typedef typename GetVertexPointMap::type VPM1; typedef typename GetVertexPointMap::type VPM2; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); VPM1 vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), get_property_map(boost::vertex_point, tm1)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 6d221c77bb9e..21024ad5c046 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -1037,7 +1037,7 @@ sample_triangle_soup(const PointRange& points, typedef typename PointRange::value_type Point_3; typedef typename Kernel_traits::Kernel GeomTraits; - static_assert((std::is_same::value), "Wrong point type."); + static_assert(std::is_same::value, "Wrong point type."); CGAL_precondition(!triangles.empty()); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h index aaf34efd11d7..652d0b09952c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h @@ -98,7 +98,7 @@ intersection_type( typedef typename boost::property_traits::value_type Point_3; typedef typename Kernel_traits::Kernel Kernel; - static_assert((std::is_same::value_type>::value)); + static_assert(std::is_same::value_type>::value); halfedge_descriptor h_2=halfedge(f_2,tm2); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h index 81f3ca6478db..38f137cad012 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h @@ -49,8 +49,8 @@ class Intersection_nodes::value_type Point_3; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); typedef typename Kernel_traits::Kernel Input_kernel; typedef std::vector Nodes_vector; @@ -151,8 +151,8 @@ class Intersection_nodes::value_type Point_3; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); typedef typename Kernel_traits::Kernel Input_kernel; @@ -328,8 +328,8 @@ class Intersection_nodes::value_type Point_3; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); typedef typename Kernel_traits::Kernel Input_kernel; typedef std::vector Nodes_vector; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h index 7929697aec2a..b2047d2627ea 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h @@ -32,8 +32,8 @@ struct Intersect_coplanar_faces_3 // typedefs typedef typename boost::property_traits::value_type Point; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); typedef typename CGAL::Kernel_traits::Kernel Input_kernel; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h index 9a724ee2a4a2..5adbf99ff6f5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h @@ -730,7 +730,7 @@ std::size_t snap_vertices_two_way(const HalfedgeRange_A& halfedge_range_A, using parameters::get_parameter; using parameters::get_parameter_reference; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); GT gt = choose_parameter(get_parameter(np_A, internal_np::geom_traits)); VPM_A vpm_A = choose_parameter(get_parameter(np_A, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index 4f66b558cc7e..d4fc6d730e44 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -681,7 +681,7 @@ compute_face_polylines_intersection(const FaceRange& face_range, get_const_property_map(boost::vertex_point, tm)); typedef typename boost::property_traits::value_type Point; typedef typename boost::range_value::type Polyline; - static_assert((std::is_same::type>::value)); + static_assert(std::is_same::type>::value); std::vector faces; faces.reserve(std::distance( boost::begin(face_range), boost::end(face_range) )); @@ -1742,8 +1742,8 @@ surface_intersection(const TriangleMesh& tm1, typedef typename GetVertexPointMap::const_type VPM1; typedef typename GetVertexPointMap::const_type VPM2; - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value)); + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value); VPM1 vpm1 = parameters::choose_parameter(parameters::get_parameter(np1, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, tm1)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 3f1a66508725..26d0266e03ad 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -1661,7 +1661,7 @@ locate_with_AABB_tree(const typename internal::Location_traits AABB_traits; typedef typename Primitive::Point Point_3; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); typedef typename GetVertexPointMap::const_type VertexPointMap; typedef internal::Point_to_Point_3_VPM WrappedVPM; @@ -1754,7 +1754,7 @@ locate(const typename internal::Location_traits:: using parameters::get_parameter; using parameters::choose_parameter; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); const VertexPointMap vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), get_const_property_map(boost::vertex_point, tm)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h index 8e4f54ed5a16..8f1c60347eed 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h @@ -989,8 +989,8 @@ void match_faces(const PolygonMesh1& m1, get_const_property_map(vertex_point, m1)); const VPMap2 vpm2 = choose_parameter(get_parameter(np2, internal_np::vertex_point), get_const_property_map(vertex_point, m2)); - static_assert((std::is_same::value_type, - typename boost::property_traits::value_type>::value), + static_assert(std::is_same::value_type, + typename boost::property_traits::value_type>::value, "Both vertex point maps must have the same point type."); const VIMap1 vim1 = get_initialized_vertex_index_map(m1, np1); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h index e395080f4a72..a7e9cf2480a3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h @@ -159,7 +159,7 @@ void orient_triangle_soup_with_reference_triangle_soup(const ReferencePointRange typedef typename boost::property_traits::reference PM2_Point_ref; typedef typename boost::property_traits::value_type Point_3; - static_assert((std::is_same::value_type>::value)); + static_assert(std::is_same::value_type>::value); typedef typename CGAL::Kernel_traits::Kernel K; typedef typename K::Triangle_3 Triangle; @@ -309,7 +309,7 @@ void orient_triangle_soup_with_reference_triangle_mesh(const TriangleMesh& tm_re PointMap point_map = NP_helper::get_const_point_map(points, np2); - static_assert((std::is_same::value_type>::value)); + static_assert(std::is_same::value_type>::value); K k = choose_parameter(get_parameter(np1, internal_np::geom_traits)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h index f247b361f435..eed98878632b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h @@ -39,7 +39,7 @@ struct PM_to_PS_point_converter { PS_Point operator()(const PM_Point& p) const { - static_assert((std::is_convertible::value)); + static_assert(std::is_convertible::value); return PS_Point(p); } }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h index cc1d299702f5..df32555bc530 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h @@ -43,7 +43,7 @@ namespace internal { template PM_Point convert_to_pm_point(const PS_Point& p) { - static_assert((std::is_convertible::value)); + static_assert(std::is_convertible::value); return PM_Point(p); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h index 9d4f5837d8ee..3a5f9fca82fa 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h @@ -178,7 +178,7 @@ FaceOutputIterator replace_faces_with_patch(const std::vector::value_type, Point>::value)); + static_assert(std::is_same::value_type, Point>::value); typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h b/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h index 3ed4b89f06ed..761ca6ec9bf3 100644 --- a/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h +++ b/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h @@ -250,7 +250,7 @@ class Rigid_triangle_mesh_collision_detection { // handle vpm typedef typename CGAL::GetVertexPointMap::const_type Local_vpm; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); Vpm vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), @@ -562,7 +562,7 @@ class Rigid_triangle_mesh_collision_detection parameters::get_parameter(np, internal_np::apply_per_connected_component), true); typedef typename CGAL::GetVertexPointMap::const_type Local_vpm; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); Vpm vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h index c12178a1b9cf..458fc0a703cf 100644 --- a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h +++ b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h @@ -58,7 +58,7 @@ class Polyhedral_envelope_filter template void initialize_envelope(const Profile& profile) const { - static_assert((std::is_same::value)); + static_assert(std::is_same::value); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp index 8aeaab049db5..60c14ec9604a 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp @@ -522,7 +522,7 @@ struct Locate_with_AABB_tree_Tester // 2D case typedef CGAL::AABB_face_graph_triangle_primitive AABB_face_graph_primitive; typedef CGAL::AABB_traits AABB_face_graph_traits; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); Intrinsic_point_to_Point_3 to_p3; @@ -633,7 +633,7 @@ struct Locate_with_AABB_tree_Tester // 3D typedef CGAL::AABB_traits AABB_face_graph_traits; typedef typename K::Point_3 Point_3; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); CGAL::AABB_tree tree_a; Point_reference p3_a = get(vpm, v); diff --git a/Polynomial/include/CGAL/Exponent_vector.h b/Polynomial/include/CGAL/Exponent_vector.h index 826a9417ffd6..1a06965514d6 100644 --- a/Polynomial/include/CGAL/Exponent_vector.h +++ b/Polynomial/include/CGAL/Exponent_vector.h @@ -59,7 +59,7 @@ class Exponent_vector : :v(begin,end){ typedef typename std::iterator_traits::value_type value_type; CGAL_USE_TYPE(value_type); - static_assert(( ::std::is_same::value)); + static_assert(::std::is_same::value); } diff --git a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h index d75f6f291d55..f989b8ff2019 100644 --- a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h +++ b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h @@ -273,9 +273,9 @@ class Polynomial_algebraic_structure_traits_base< POLY, Field_tag > template < class NT1, class NT2 > void operator()( const NT1& x, const NT2& y, POLY& q, POLY& r ) const { - static_assert((::std::is_same< + static_assert(::std::is_same< typename Coercion_traits< NT1, NT2 >::Type, POLY - >::value)); + >::value); typename Coercion_traits< NT1, NT2 >::Cast cast; operator()( cast(x), cast(y), q, r ); diff --git a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h index 9c2c27b6fc75..e2529d2e3495 100644 --- a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h +++ b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h @@ -545,8 +545,8 @@ class Polynomial * Also available as non-member function. */ CGAL::Sign sign() const { -// static_assert( (std::is_same< typename Real_embeddable_traits::Is_real_embeddable, -// CGAL::Tag_true>::value) ); +// static_assert(std::is_same< typename Real_embeddable_traits::Is_real_embeddable, +// CGAL::Tag_true>::value); return CGAL::sign(lcoeff()); } diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index 1a377fc5c179..f7a4d3993e32 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -566,7 +566,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, template Polynomial_d construct_value_type(Input_iterator begin, Input_iterator end, NT) const { typedef CGAL::Coercion_traits CT; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); typename CT::Cast cast; return Polynomial_d( boost::make_transform_iterator(begin,cast), diff --git a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h index 7547bd302815..b40a6d882f78 100644 --- a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h @@ -50,7 +50,7 @@ static CGAL::Random my_rnd(346); // some seed #define ASSERT_IS_NULL_FUNCTOR(T) \ - static_assert((std::is_same::value)) + static_assert(std::is_same::value) @@ -1802,23 +1802,23 @@ void test_rebind(const PT& /*traits*/){ { typedef typename PT:: template Rebind::Other PT_IC_1; CGAL_USE_TYPE(PT_IC_1); - static_assert((std::is_same< typename PT_IC_1::Innermost_coefficient_type, - IC>::value)); - static_assert((PT_IC_1::d==1)); + static_assert(std::is_same< typename PT_IC_1::Innermost_coefficient_type, + IC>::value); + static_assert(PT_IC_1::d==1); } { typedef typename PT:: template Rebind::Other PT_IC_2; CGAL_USE_TYPE(PT_IC_2); - static_assert((std::is_same< typename PT_IC_2::Innermost_coefficient_type, - IC>::value)); - static_assert((PT_IC_2::d==2)); + static_assert(std::is_same< typename PT_IC_2::Innermost_coefficient_type, + IC>::value); + static_assert(PT_IC_2::d==2); } { typedef typename PT:: template Rebind::Other PT_IC_3; CGAL_USE_TYPE(PT_IC_3); - static_assert((std::is_same< typename PT_IC_3::Innermost_coefficient_type, - IC>::value)); - static_assert((PT_IC_3::d==3)); + static_assert(std::is_same< typename PT_IC_3::Innermost_coefficient_type, + IC>::value); + static_assert(PT_IC_3::d==3); } { typedef typename PT:: template Rebind::Other PT_IC_1; @@ -1831,12 +1831,12 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT_IC_1::Polynomial_d Poly1; typedef typename PT_IC_2::Polynomial_d Poly2; - static_assert((std::is_same< typename PT_IC_1::Coefficient_type, - IC>::value)); - static_assert((std::is_same< typename PT_IC_2::Coefficient_type, - Poly1>::value)); - static_assert((std::is_same< typename PT_IC_3::Coefficient_type, - Poly2>::value)); + static_assert(std::is_same< typename PT_IC_1::Coefficient_type, + IC>::value); + static_assert(std::is_same< typename PT_IC_2::Coefficient_type, + Poly1>::value); + static_assert(std::is_same< typename PT_IC_3::Coefficient_type, + Poly2>::value); } @@ -1850,12 +1850,12 @@ void test_rebind(const PT& /*traits*/){ CGAL_USE_TYPE(PT_Integer_4); typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Rational_4); - static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, - Integer>::value)); - static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, - Rational>::value)); - static_assert((PT_Integer_4::d==dimension)); - static_assert((PT_Rational_4::d==dimension)); + static_assert(std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + Integer>::value); + static_assert(std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + Rational>::value); + static_assert(PT_Integer_4::d==dimension); + static_assert(PT_Rational_4::d==dimension); } #endif #ifdef CGAL_USE_CORE @@ -1867,12 +1867,12 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Integer_4); CGAL_USE_TYPE(PT_Rational_4); - static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, - Integer>::value)); - static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, - Rational>::value)); - static_assert((PT_Integer_4::d==4)); - static_assert((PT_Rational_4::d==4)); + static_assert(std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + Integer>::value); + static_assert(std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + Rational>::value); + static_assert(PT_Integer_4::d==4); + static_assert(PT_Rational_4::d==4); } #endif { @@ -1880,12 +1880,12 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Integer_4); CGAL_USE_TYPE(PT_Rational_4); - static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, - int>::value)); - static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, - double>::value)); - static_assert((PT_Integer_4::d==4)); - static_assert((PT_Rational_4::d==4)); + static_assert(std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + int>::value); + static_assert(std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + double>::value); + static_assert(PT_Integer_4::d==4); + static_assert(PT_Rational_4::d==4); } } diff --git a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp index 56e11a393579..8d8497ed139e 100644 --- a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp +++ b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp @@ -12,14 +12,14 @@ int main(){ { typedef CGAL::Polynomial_type_generator::Type Polynomial; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); } { typedef CGAL::Polynomial_type_generator::Type Polynomial; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); } { typedef CGAL::Polynomial_type_generator::Type Polynomial; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); } } diff --git a/Polynomial/test/Polynomial/test_polynomial.h b/Polynomial/test/Polynomial/test_polynomial.h index 7cd7a2e17c2d..c1943d96ae94 100644 --- a/Polynomial/test/Polynomial/test_polynomial.h +++ b/Polynomial/test/Polynomial/test_polynomial.h @@ -34,7 +34,7 @@ inline void convert_to(const NT& x, RT& r){ typedef CGAL::Coercion_traits CT; typedef typename CT::Coercion_type RET; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); r = typename CT::Cast()(x); } } //namespace CGAL @@ -887,7 +887,7 @@ void test_scalar_factor_traits(){ typedef CGAL::Scalar_factor_traits SFT; typedef typename AT::Integer Scalar; typedef typename SFT::Scalar Scalar_; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typename SFT::Scalar_factor sfac; @@ -913,7 +913,7 @@ void test_scalar_factor_traits(){ typedef CGAL::Scalar_factor_traits SFT; typedef typename AT::Integer Scalar; typedef typename SFT::Scalar Scalar_; - static_assert((::std::is_same::value)); + static_assert(::std::is_same::value); typename SFT::Scalar_factor sfac; diff --git a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp index d2ad9d2019cb..ca30d9e8ed03 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp @@ -147,9 +147,9 @@ void test_coercion_traits(){ /* { typedef CGAL::Coercion_traits CT; - static_assert(( + static_assert( ::std::is_same< typename CT::Are_implicit_interoperable, - CGAL::Tag_false>::value)); + CGAL::Tag_false>::value); } */ diff --git a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp index f52f33ae5846..5edd4a40835e 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp @@ -7,11 +7,11 @@ void test_get_arithmetic_kernel(){ { typedef CGAL::Polynomial POLY; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); }{ typedef CGAL::Polynomial > POLY; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; - static_assert((std::is_same::value)); + static_assert(std::is_same::value); } } diff --git a/Ridges_3/include/CGAL/Ridges.h b/Ridges_3/include/CGAL/Ridges.h index 47fd6019ebd2..d4052642864c 100644 --- a/Ridges_3/include/CGAL/Ridges.h +++ b/Ridges_3/include/CGAL/Ridges.h @@ -190,10 +190,10 @@ class Ridge_approximation //requirements for the templates TriangleMesh and VertexFTMap or VertexVectorMap - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); typedef std::pair< halfedge_descriptor, FT> Ridge_halfedge; typedef Ridge_halfedge Ridge_halfhedge; // kept for backward compatibility diff --git a/Ridges_3/include/CGAL/Umbilics.h b/Ridges_3/include/CGAL/Umbilics.h index 424708b2897b..f815b9c18cac 100644 --- a/Ridges_3/include/CGAL/Umbilics.h +++ b/Ridges_3/include/CGAL/Umbilics.h @@ -110,10 +110,10 @@ class Umbilic_approximation typedef typename boost::graph_traits::vertex_iterator Vertex_const_iterator; //requirements for the templates TriangleMesh and VertexFTMap or VertexVectorMap - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); typedef CGAL::Umbilic Umbilic; diff --git a/STL_Extension/include/CGAL/Handle_with_policy.h b/STL_Extension/include/CGAL/Handle_with_policy.h index 978fa9ec1c36..5f952a66e15f 100644 --- a/STL_Extension/include/CGAL/Handle_with_policy.h +++ b/STL_Extension/include/CGAL/Handle_with_policy.h @@ -355,8 +355,8 @@ namespace Intern { typedef ::CGAL::Reference_counted_hierarchy_with_union Reference_counted_hierarchy_with_union; CGAL_USE_TYPE(Reference_counted_hierarchy_with_union); - static_assert(( - ::CGAL::is_same_or_derived< Reference_counted_hierarchy_with_union, T >::value )); + static_assert( + ::CGAL::is_same_or_derived< Reference_counted_hierarchy_with_union, T >::value ); } typedef T Rep; }; @@ -855,8 +855,8 @@ class Handle_with_policy { //! argument, and the single argument template constructor no other //! constructor will work for class hierarchies of representations. Handle_with_policy( Rep* p) : ptr_( p) { - static_assert(( - ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value )); + static_assert( + ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value ); //Bind bind_; // trigger compile-time check //(void)bind_; (void)Bind(); @@ -869,8 +869,8 @@ class Handle_with_policy { //! version of \c initialize_with is applicable in this case except //! the template version with one argument. void initialize_with( Rep* p) { - static_assert(( - ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value )); + static_assert( + ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value ); //Bind bind_; // trigger compile-time check //(void)bind_; (void)Bind(); diff --git a/STL_Extension/include/CGAL/Named_function_parameters.h b/STL_Extension/include/CGAL/Named_function_parameters.h index b116f6d51495..d0f1648f816e 100644 --- a/STL_Extension/include/CGAL/Named_function_parameters.h +++ b/STL_Extension/include/CGAL/Named_function_parameters.h @@ -182,7 +182,7 @@ typename Get_param, Query_tag>::type get_parameter_impl(const Named_params_impl& np, Query_tag tag) { #ifndef CGAL_NO_STATIC_ASSERTION_TEST - static_assert( (!std::is_same::value) ); + static_assert(!std::is_same::value); #endif return get_parameter_impl(static_cast(np), tag); } @@ -243,7 +243,7 @@ template typename Get_param, Query_tag>::reference get_parameter_reference_impl(const Named_params_impl& np, Query_tag tag) { - static_assert( (!std::is_same::value) ); + static_assert(!std::is_same::value); return get_parameter_reference_impl(static_cast(np), tag); } diff --git a/STL_Extension/include/CGAL/transforming_pair_iterator.h b/STL_Extension/include/CGAL/transforming_pair_iterator.h index abc52a584e3b..020a0b6d7c72 100644 --- a/STL_Extension/include/CGAL/transforming_pair_iterator.h +++ b/STL_Extension/include/CGAL/transforming_pair_iterator.h @@ -25,7 +25,7 @@ namespace CGAL { namespace internal { template ::value> struct Min_category { - static_assert((boost::is_convertible::value)); + static_assert(std::is_convertible::value); typedef Cat1 type; }; diff --git a/STL_Extension/test/STL_Extension/test_Cache.cpp b/STL_Extension/test/STL_Extension/test_Cache.cpp index 609eb6ab8299..fc645fe5be0b 100644 --- a/STL_Extension/test/STL_Extension/test_Cache.cpp +++ b/STL_Extension/test/STL_Extension/test_Cache.cpp @@ -57,16 +57,16 @@ struct Int_t : public CGAL::Handle_with_policy< Int_rep, Unify > { void test_typedefs(){ typedef CGAL::Cache Cache; CGAL_USE_TYPE(Cache); - static_assert(( ::std::is_same< Cache::Input, int >::value )); - static_assert(( ::std::is_same< Cache::Output,double>::value )); + static_assert(::std::is_same< Cache::Input, int >::value ); + static_assert(::std::is_same< Cache::Output,double>::value ); typedef CGAL::Creator_1 Creator_double; CGAL_USE_TYPE(Creator_double); - static_assert(( ::std::is_same::value )); + static_assert(::std::is_same::value ); typedef CGAL::Creator_1 Creator_int; CGAL_USE_TYPE(Creator_int); - static_assert(( ::std::is_same::value )); - static_assert(( ::std::is_same >::value )); - static_assert(( ::std::is_same >::value )); + static_assert(::std::is_same::value ); + static_assert(::std::is_same >::value ); + static_assert(::std::is_same >::value ); } int main(){ { diff --git a/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp b/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp index 1f474eebabb1..c5fba6ce23b1 100644 --- a/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp +++ b/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp @@ -46,7 +46,7 @@ template void test_no_copyable(const NamedParameters& np) { typedef typename inp::Get_param::type NP_type; - static_assert( (std::is_same >::value) ); + static_assert(std::is_same >::value); const A<4>& a = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), A<4>(4)); assert(a.v==4); @@ -60,31 +60,31 @@ void test_references(const NamedParameters& np) // std::reference_wrapper typedef typename inp::Lookup_named_param_def::reference Visitor_reference_type; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); Visitor_reference_type vis_ref = params::choose_parameter(params::get_parameter_reference(np, inp::visitor), default_value); CGAL_USE(vis_ref); // std::reference_wrapper of const typedef typename inp::Lookup_named_param_def::reference FIM_reference_type; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); FIM_reference_type fim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::face_index), default_value); CGAL_USE(fim_ref); // non-copyable typedef typename inp::Lookup_named_param_def::reference VPM_reference_type; - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); VPM_reference_type vpm_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_point), default_value); CGAL_USE(vpm_ref); // passed by copy typedef typename inp::Lookup_named_param_def::reference VIM_reference_type; - static_assert( (std::is_same, VIM_reference_type>::value) ); + static_assert(std::is_same, VIM_reference_type>::value); VIM_reference_type vim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_index), default_value); CGAL_USE(vim_ref); // default typedef typename inp::Lookup_named_param_def::reference EIM_reference_type; - static_assert(( std::is_same::value) ); + static_assert(std::is_same::value); EIM_reference_type eim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), default_value); assert(&eim_ref==&default_value); } @@ -103,12 +103,12 @@ int main() ); auto d = CGAL::parameters::default_values(); - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); #ifndef CGAL_NO_DEPRECATED_CODE auto d1 = CGAL::parameters::all_default(); - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); auto d2 = CGAL::Polygon_mesh_processing::parameters::all_default(); - static_assert( (std::is_same::value) ); + static_assert(std::is_same::value); #endif return EXIT_SUCCESS; diff --git a/STL_Extension/test/STL_Extension/test_is_iterator.cpp b/STL_Extension/test/STL_Extension/test_is_iterator.cpp index d1c3b157aaaa..f308d9b48807 100644 --- a/STL_Extension/test/STL_Extension/test_is_iterator.cpp +++ b/STL_Extension/test/STL_Extension/test_is_iterator.cpp @@ -23,11 +23,11 @@ int main() { static_assert(!is_iterator::value); static_assert(is_iterator::value); - static_assert((is_iterator_type::value)); - static_assert((!is_iterator_type::value)); - static_assert((!is_iterator_type::value)); + static_assert(is_iterator_type::value); + static_assert(!is_iterator_type::value); + static_assert(!is_iterator_type::value); - static_assert((is_iterator_to::value)); - static_assert((!is_iterator_to::value)); - static_assert((!is_iterator_to::value)); + static_assert(is_iterator_to::value); + static_assert(!is_iterator_to::value); + static_assert(!is_iterator_to::value); } diff --git a/STL_Extension/test/STL_Extension/test_is_streamable.cpp b/STL_Extension/test/STL_Extension/test_is_streamable.cpp index 6e574cfdec15..fc248fc7e6e2 100644 --- a/STL_Extension/test/STL_Extension/test_is_streamable.cpp +++ b/STL_Extension/test/STL_Extension/test_is_streamable.cpp @@ -27,6 +27,6 @@ int main() { static_assert(!is_streamable::value); static_assert(is_streamable::value); static_assert(is_streamable::value); - static_assert(! (is_streamable >::value) ); - static_assert( (is_streamable >::value) ); + static_assert(!is_streamable >::value); + static_assert(is_streamable >::value); } diff --git a/STL_Extension/test/STL_Extension/test_stl_extension.cpp b/STL_Extension/test/STL_Extension/test_stl_extension.cpp index 1895935f787e..29e078c46c7a 100644 --- a/STL_Extension/test/STL_Extension/test_stl_extension.cpp +++ b/STL_Extension/test/STL_Extension/test_stl_extension.cpp @@ -8120,7 +8120,7 @@ void test_tuple(){ static_assert( std::tuple_size::value == 0 ); static_assert( std::tuple_size::value == 2 ); static_assert( std::tuple_size::value == 4 ); - static_assert( (std::is_same::type,My_to_int>::value) ); + static_assert( std::is_same::type,My_to_int>::value ); T1 t1=std::make_tuple(1,2); T1 t1_2=std::make_tuple(1,2); @@ -8206,17 +8206,17 @@ void test_make_sorted_pair() { assert(p3==p4); int i=2; assert( CGAL::make_sorted_pair(1,i) == std::make_pair(1,i) ); - static_assert( (std::is_same< + static_assert( std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1L,i)), - std::pair >::value) ); + std::pair >::value); assert( (CGAL::make_sorted_pair(i,1L) == std::pair(1L,2L)) ); - static_assert( (std::is_same< + static_assert( std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1,2L)), - std::pair >::value) ); - static_assert( (std::is_same< + std::pair >::value) ; + static_assert( std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1,2L)), - std::pair >::value) ); + std::pair >::value); } void test_result_of() { @@ -8237,8 +8237,8 @@ void test_result_of() { typedef CGAL::cpp11::result_of::type result_type_float; CGAL_USE_TYPE(result_type); CGAL_USE_TYPE(result_type_float); - static_assert((std::is_same::value)); - static_assert((std::is_same::value)); + static_assert(std::is_same::value); + static_assert(std::is_same::value); } diff --git a/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h b/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h index a5a5c5e58cbd..b86325e6d390 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h @@ -296,7 +296,7 @@ namespace Planes { using PlaneIndexMap = typename CGAL::Point_set_processing_3::GetPlaneIndexMap::type; - static_assert((!is_default_parameter::value), + static_assert(!is_default_parameter::value, "Error: no plane index map"); const PlaneIndexMap index_map = diff --git a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h index ff11623a892b..f7894c74eb51 100644 --- a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h +++ b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h @@ -107,7 +107,7 @@ class Search_traits_kd_tree_2 { template class Multiple_kd_tree { - static_assert((boost::is_pointer::value), "SAVED_OBJECT is not a pointer."); + static_assert(boost::is_pointer::value, "SAVED_OBJECT is not a pointer."); private: typedef Traits_ Traits; typedef typename Traits::FT NT; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 36f2f855312e..04303b903534 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -49,7 +49,7 @@ class Bounded_distance_placement template void initialize_tree(const Profile& profile) const { - static_assert((std::is_same::value)); + static_assert(std::is_same::value); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h index 2f0abb387892..86fd7c87544c 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h @@ -43,7 +43,7 @@ class FastEnvelope_filter template void initialize_envelope(const Profile& profile) const { - static_assert((std::is_same::value)); + static_assert(std::is_same::value); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h b/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h index 1340c1700e31..2541ef6ff30e 100644 --- a/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h +++ b/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h @@ -51,9 +51,9 @@ namespace CGAL { typedef typename Oracle_a::Intersection_point Intersection_point; - static_assert((::std::is_same< + static_assert(::std::is_same< Intersection_point, - typename Oracle_b::Intersection_point>::value)); + typename Oracle_b::Intersection_point>::value); typedef ::CGAL::Multi_surface_3::value)); + static_assert(Arr_sane_identified_tagging< Left_side_category, Bottom_side_category, + Top_side_category, Right_side_category >::value); protected: /*! diff --git a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h index f85c473285e2..c6751c2a3cbd 100644 --- a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h +++ b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h @@ -631,8 +631,8 @@ insert(InputIterator first, InputIterator beyond, { typedef Point_3_with_iterator P3_wit; - static_assert((std::is_same::value_type, Point>::value)); - static_assert(!(std::is_same::value)); + static_assert(std::is_same::value_type, Point>::value); + static_assert(!std::is_same::value); const size_type n = number_of_vertices(); From 11586736c746cf2a7eb2ea9697d0a7af46ca7cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 10:48:41 +0200 Subject: [PATCH 0374/1398] add missing include --- Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h index e96dfaa5fcbf..919fec145ec4 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h @@ -19,6 +19,7 @@ #include #include #include +#include //------------------------------------------------------------------- namespace CGAL { From 6abf126e102afb46d5b1e8f71447075ccf86ec41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 10:48:49 +0200 Subject: [PATCH 0375/1398] fix typo --- .../CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h index 0d688be64ede..330e5005d537 100644 --- a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h +++ b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h @@ -752,8 +752,8 @@ class Surface_mesh_geodesic_distances_3 > #endif { - static_assert(std::is_same::value) || - (std::is_same::value); + static_assert(std::is_same::value || + std::is_same::value); // extract real types from Default #ifdef CGAL_EIGEN3_ENABLED From b994bc35745b424a7480057f96f314c626a3bc1f Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 20 Jun 2023 11:47:31 +0200 Subject: [PATCH 0376/1398] True and on-merge in doc --- .../Combinatorial_map/Concepts/GenericMap.h | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index 790d378bd074..adccc875cd0f 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -267,12 +267,12 @@ using One_dart_per_cell_const_range = unspecified_type; /// @{ /*! -Returns true iff the generic map is empty, i.e.\ it contains no dart. +Returns `true` iff the generic map is empty, i.e.\ it contains no dart. */ bool is_empty() const; /*! -Returns true iff the generic map is without i-boundary. +Returns `true` iff the generic map is without i-boundary. The map is without i-boundary if there is no `i`-free dart. \pre 1\f$ \leq \f$ i \f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink. @@ -280,7 +280,7 @@ The map is without i-boundary if there is no `i`-free dart. bool is_without_boundary(unsigned int i) const; /*! -Returns true iff the generic map is without boundary in all dimensions. +Returns `true` iff the generic map is without boundary in all dimensions. */ bool is_without_boundary() const; @@ -308,18 +308,18 @@ Returns an upper bound of the id of i-attributes descriptors if indices a template size_type upper_bound_on_attribute_ids() const; -/*! Returns true if `d` is a descriptor of a used dart (i.e.\ valid). +/*! Returns `true` if `d` is a descriptor of a used dart (i.e.\ valid). */ bool is_dart_used(Dart_const_descriptor d) const; /*! -Returns true iff dart `d` is i-free. +Returns `true` iff dart `d` is i-free. \pre 0 \f$ \leq \f$ i \f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink. */ bool is_free(Dart_const_descriptor d, unsigned int i) const; /*! -Returns true iff dart `d` is i-free. +Returns `true` iff dart `d` is i-free. \pre 0 \f$ \leq \f$ i \f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink. */ template @@ -477,7 +477,7 @@ A shortcut for \link GenericMap::dart_of_attribute(typename Attribute_const_desc template Dart_const_descriptor dart(Dart_const_descriptor adart) const; -/*! Returns true if ah points to a used i-attribute (i.e.\ valid). +/*! Returns `true` if ah points to a used i-attribute (i.e.\ valid). \pre 0 \f$ \leq \f$ i \f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink, and i-attributes are non `void`. */ template @@ -703,13 +703,13 @@ void correct_invalid_attributes(); /// \cond SKIP_IN_MANUAL boost::function \endcond -/// \name Dynamic Onmerge/Onsplit functors +/// \name Dynamic On-Merge/On-Split functors /// @{ /*! - Return the current dynamic onsplit function associated with i-attributes. + Return the current dynamic on-split function associated with i-attributes. This is a boost::function returning void and having two references to \link GenericMap::Attribute_type `Attribute_type::type`\endlink as parameters. - The onsplit function is returned by reference so that we can modify it. + The on-split function is returned by reference so that we can modify it. */ template boost::function::type&, @@ -717,7 +717,7 @@ void correct_invalid_attributes(); onsplit_function(); /*! - Return the current dynamic onsplit function associated with i-attributes, when *this is const. + Return the current dynamic on-split function associated with i-attributes, when *this is const. This is a boost::function returning void and having two references to \link GenericMap::Attribute_type `Attribute_type::type`\endlink as parameters. */ template @@ -726,9 +726,9 @@ void correct_invalid_attributes(); onsplit_function() const; /*! - Return the current dynamic onmerge function associated with i-attributes. + Return the current dynamic on-merge function associated with i-attributes. This is a boost::function returning void and having two references to \link GenericMap::Attribute_type `Attribute_type::type`\endlink as parameters. - The onmerge function is returned by reference so that we can modify it. + The on-merge function is returned by reference so that we can modify it. */ template boost::function::type&, @@ -736,7 +736,7 @@ void correct_invalid_attributes(); onmerge_function(); /*! - Return the current dynamic onmerge function associated with i-attributes, when *this is const. + Return the current dynamic on-merge function associated with i-attributes, when *this is const. This is a boost::function returning void and having two references to \link GenericMap::Attribute_type `Attribute_type::type`\endlink as parameters. */ template @@ -756,13 +756,13 @@ index. If there is no more available free mark, throw the exception Exception_no size_type get_new_mark() const; /*! -Returns true iff `m` is a reserved mark of the generic map. +Returns `true` iff `m` is a reserved mark of the generic map. \pre 0\f$ \leq \f$ m \f$ < \f$ \link GenericMap::NB_MARKS `NB_MARKS`\endlink. */ bool is_reserved(size_type m) const; /*! -Returns true iff dart `d` is marked for `m`. +Returns `true` iff dart `d` is marked for `m`. \pre \link GenericMap::is_reserved `is_reserved(m)`\endlink and `d`\f$ \in \f$ `darts()`. */ bool is_marked(Dart_const_descriptor d, size_type m) const; @@ -868,7 +868,7 @@ Inserts a 0-cell in the 1-cell containing `d`. Returns `next(d)`, a descriptor o See examples for combinatorial map in \cgalFigureRef{fig_cmap_insert_vertex} and for generalized map in \cgalFigureRef{fig_gmap_insert_vertex}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 1-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<1>::type::On_split`\endlink(a,a') is called, with a the original 1-attribute associated with d and a' the new 1-attribute created during the operation. If set, the dynamic onsplit function of 1-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 1-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<1>::type::On_split`\endlink(a,a') is called, with a the original 1-attribute associated with d and a' the new 1-attribute created during the operation. If set, the dynamic on-split function of 1-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -889,7 +889,7 @@ Inserts a 0-cell in the 2-cell containing `d`. The 2-cell is split in triangles, See examples for combinatorial map in \cgalFigureRef{fig_cmap_triangulation} and for generalized map in \cgalFigureRef{fig_gmap_triangulation}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d` and a' each new 2-attribute created during the operation. If set, the dynamic onsplit function of 2-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d` and a' each new 2-attribute created during the operation. If set, the dynamic on-split function of 2-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -910,7 +910,7 @@ Inserts a 1-cell in the 2-cell containing `d1` and `d2`. Returns `previous(d1)`, See examples for combinatorial map in \cgalFigureRef{fig_cmap_insert_edge} and for generalized map in \cgalFigureRef{fig_gmap_insert_edge}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic onsplit function of 2-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic on-split function of 2-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -930,7 +930,7 @@ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor d1, Dart_descriptor d2); Inserts a 1-cell between the 2-cell containing `d1` and the one containing `d2`. Returns `previous(d1)`, a descriptor on one dart belonging to the new 1-cell. \pre `is_insertable_cell_1_between_two_cells_2(d1,d2)`. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, call \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a,a') is called for all enabled i-attributes, for i>=2, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic onmerge function of i-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, call \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a,a') is called for all enabled i-attributes, for i>=2, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic on-merge function of i-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -959,7 +959,7 @@ Inserts a 2-cell along the path of 1-cells containing darts given by the range ` See examples for combinatorial map in \cgalFigureRef{fig_cmap_insert_facet} and for generalized map in \cgalFigureRef{fig_gmap_insert_facet}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 3-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<3>::type::On_split`\endlink(a,a') is called, with a the original 3-attribute associated with `d` and a' the new 3-attribute created during the operation. If set, the dynamic onsplit function of 3-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 3-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<3>::type::On_split`\endlink(a,a') is called, with a the original 3-attribute associated with `d` and a' the new 3-attribute created during the operation. If set, the dynamic on-split function of 3-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -997,7 +997,7 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa Dart_descriptor insert_dangling_cell_1_in_cell_2(Dart_descriptor d); /*! -Returns true iff it is possible to insert a 1-cell in the generic map between `d1` and `d2`. +Returns `true` iff it is possible to insert a 1-cell in the generic map between `d1` and `d2`. This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can be reached from `d2` by using some `previous` and `next` calls. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 2, `d1`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink, and `d2`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. @@ -1009,7 +1009,7 @@ This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can be reached from `d2` by u bool is_insertable_cell_1_in_cell_2(Dart_const_descriptor d1, Dart_const_descriptor d2); /*! -Returns true iff it is possible to insert a 1-cell in the generic map between `d1` and `d2`. +Returns `true` iff it is possible to insert a 1-cell in the generic map between `d1` and `d2`. This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can not be reached from `d2` by using some `previous` and `next` calls. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 2, `d1`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink, and `d2`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. @@ -1020,7 +1020,7 @@ This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can not be reached from `d2` bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor d1, Dart_const_descriptor d2); /*! -Returns true iff it is possible to insert a 2-cell in the generic map along the path of darts given by the range `[afirst,alast)`. The 2-cell can be inserted iff the ordered list of darts form a closed path of edges inside a same volume. +Returns `true` iff it is possible to insert a 2-cell in the generic map along the path of darts given by the range `[afirst,alast)`. The 2-cell can be inserted iff the ordered list of darts form a closed path of edges inside a same volume. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 3. \sa `insert_cell_2_in_cell_3` @@ -1031,7 +1031,7 @@ template bool is_insertable_cell_2_in_cell_3(InputIterator afirst, InputIterator alast); /*! -Returns true iff the i-cell containing `d` can be removed. +Returns `true` iff the i-cell containing `d` can be removed. An i-cell can be removed if `i`==\link GenericMap::dimension `dimension`\endlink or if `i`==\link GenericMap::dimension `dimension`\endlink-1 or if `i`\f$ < \f$ \link GenericMap::dimension `dimension`\endlink-1 and the i-cell containing `d` is incident to at most two (i+1)-cells. \pre 0\f$ \leq \f$ `i`\f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink and `d`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. @@ -1047,9 +1047,9 @@ Removes the i-cell containing `d`. Returns the number of darts removed fr See examples in \cgalFigureRef{fig_cmap_insert_vertex}, \cgalFigureRef{fig_cmap_insert_edge} and \cgalFigureRef{fig_cmap_insert_facet}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if `i`\f$ < \f$ \link GenericMap::dimension `dimension`\endlink, and i+1-attributes are non `void`, and if there are two distinct (i+1)-cells around dart `d`, \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a1,a2) is called, with a1 the (i+1)-attribute associated to `d`, and a2 the (i+1)-attribute associated to \f$ \beta_{i+1}\f$(d). If set, the dynamic onmerge function of i+1-attributes is also called on a1 and a2. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if `i`\f$ < \f$ \link GenericMap::dimension `dimension`\endlink, and i+1-attributes are non `void`, and if there are two distinct (i+1)-cells around dart `d`, \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a1,a2) is called, with a1 the (i+1)-attribute associated to `d`, and a2 the (i+1)-attribute associated to \f$ \beta_{i+1}\f$(d). If set, the dynamic on-merge function of i+1-attributes is also called on a1 and a2. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if a j-cell is disconnected in two j-cells during the operation, and if j-attributes are non void, \link CellAttribute::On_split `Attribute_type::type::On_split`\endlink(a,a') is called with a the original j-attribute and a' the new j-attribute created due to the disconnection. If set, the dynamic onsplit function of j-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if a j-cell is disconnected in two j-cells during the operation, and if j-attributes are non void, \link CellAttribute::On_split `Attribute_type::type::On_split`\endlink(a,a') is called with a the original j-attribute and a' the new j-attribute created due to the disconnection. If set, the dynamic on-split function of j-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. From 32655a75b85c77684ce5c09fcd1904b851e4dc69 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 20 Jun 2023 12:03:00 +0200 Subject: [PATCH 0377/1398] Add () after function names in sa --- .../Combinatorial_map/Concepts/GenericMap.h | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index adccc875cd0f..c080e2166d4c 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -820,9 +820,9 @@ void free_mark(size_type m) const; Creates a combinatorial hexahedron (six combinatorial quadrangles 2-sewn together), and adds it in the generic map. Returns a descriptor on one dart of this combinatorial hexahedron. \pre `dimension` \f$\geq\f$ 2. -\sa `make_edge` -\sa `make_combinatorial_polygon` -\sa `make_combinatorial_tetrahedron` +\sa `make_edge()` +\sa `make_combinatorial_polygon()` +\sa `make_combinatorial_tetrahedron()` */ Dart_descriptor make_combinatorial_hexahedron(); @@ -831,9 +831,9 @@ Dart_descriptor make_combinatorial_hexahedron(); Creates a combinatorial polygon of length `lg` (a cycle of `lg` edges), and adds it in the generic map. Returns a descriptor on one dart of this combinatorial polygon. \pre `dimension`\f$ \geq\f$ 1 and `lg`\f$ >\f$ 0. -\sa `make_edge` -\sa `make_combinatorial_tetrahedron` -\sa `make_combinatorial_hexahedron` +\sa `make_edge()` +\sa `make_combinatorial_tetrahedron()` +\sa `make_combinatorial_hexahedron()` */ Dart_descriptor make_combinatorial_polygon(unsigned int lg); @@ -841,9 +841,9 @@ Dart_descriptor make_combinatorial_polygon(unsigned int lg); Creates a combinatorial tetrahedron (four combinatorial triangles 2-sewn together), and adds it in the generic map. Returns a descriptor on one dart of this combinatorial tetrahedron. \pre `dimension`\f$ \geq\f$ 2. -\sa `make_edge` -\sa `make_combinatorial_polygon` -\sa `make_combinatorial_hexahedron` +\sa `make_edge()` +\sa `make_combinatorial_polygon()` +\sa `make_combinatorial_hexahedron()` */ Dart_descriptor make_combinatorial_tetrahedron(); @@ -851,9 +851,9 @@ Dart_descriptor make_combinatorial_tetrahedron(); Creates an isolated edge (two darts sewn to represent one edge and two vertices) and adds it in the generic map. Returns a descriptor on one dart of this edge. \pre `dimension`\f$ \geq\f$ 2. -\sa `make_combinatorial_polygon` -\sa `make_combinatorial_tetrahedron` -\sa `make_combinatorial_hexahedron` +\sa `make_combinatorial_polygon()` +\sa `make_combinatorial_tetrahedron()` +\sa `make_combinatorial_hexahedron()` */ Dart_descriptor make_edge(); @@ -874,12 +874,12 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `insert_cell_2_in_cell_3` -\sa `remove_cell` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `insert_cell_2_in_cell_3()` +\sa `remove_cell()` */ Dart_descriptor insert_cell_0_in_cell_1(Dart_descriptor d); @@ -895,12 +895,12 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `insert_cell_2_in_cell_3` -\sa `remove_cell` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `insert_cell_2_in_cell_3()` +\sa `remove_cell()` */ Dart_descriptor insert_cell_0_in_cell_2(Dart_descriptor d); @@ -916,13 +916,13 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `is_insertable_cell_1_in_cell_2` -\sa `insert_cell_0_in_cell_1` -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `insert_cell_2_in_cell_3` -\sa `remove_cell` +\sa `is_insertable_cell_1_in_cell_2()` +\sa `insert_cell_0_in_cell_1()` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `insert_cell_2_in_cell_3()` +\sa `remove_cell()` */ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor d1, Dart_descriptor d2); @@ -936,20 +936,20 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `is_insertable_cell_1_between_two_cells_2` -\sa `insert_cell_0_in_cell_1` -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `insert_cell_2_in_cell_3` -\sa `remove_cell` +\sa `is_insertable_cell_1_between_two_cells_2()` +\sa `insert_cell_0_in_cell_1()` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `insert_cell_2_in_cell_3()` +\sa `remove_cell()` */ Dart_descriptor insert_cell_1_between_two_cells_2(Dart_descriptor d1, Dart_descriptor d2); -/*! Call `insert_cell_1_in_cell_2` if `is_insertable_cell_1_in_cell_2(d1, d2)`, otherwise call `insert_cell_1_between_two_cells_2`. -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `is_insertable_cell_1_in_cell_2` +/*! Call `insert_cell_1_in_cell_2()` if `is_insertable_cell_1_in_cell_2(d1, d2)`, otherwise call `insert_cell_1_between_two_cells_2()`. +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `is_insertable_cell_1_in_cell_2()` */ Dart_descriptor insert_cell_1(Dart_descriptor d1, Dart_descriptor d2); @@ -965,13 +965,13 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `is_insertable_cell_2_in_cell_3` -\sa `insert_cell_0_in_cell_1` -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `remove_cell` +\sa `is_insertable_cell_2_in_cell_3()` +\sa `insert_cell_0_in_cell_1()` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `remove_cell()` */ template Dart_descriptor insert_cell_2_in_cell_3(InputIterator afirst, InputIterator alast); @@ -986,12 +986,12 @@ See examples for combinatorial map in \cgalFigureRef{fig_cmap_insert_edge} and f If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `insert_cell_0_in_cell_1` -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_cell_2_in_cell_3` -\sa `remove_cell` +\sa `insert_cell_0_in_cell_1()` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_cell_2_in_cell_3()` +\sa `remove_cell()` */ Dart_descriptor insert_dangling_cell_1_in_cell_2(Dart_descriptor d); @@ -1002,8 +1002,8 @@ Returns `true` iff it is possible to insert a 1-cell in the generic map between This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can be reached from `d2` by using some `previous` and `next` calls. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 2, `d1`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink, and `d2`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. -\sa `insert_cell_1_in_cell_2` -\sa `is_insertable_cell_2_in_cell_3` +\sa `insert_cell_1_in_cell_2()` +\sa `is_insertable_cell_2_in_cell_3()` */ bool is_insertable_cell_1_in_cell_2(Dart_const_descriptor d1, Dart_const_descriptor d2); @@ -1014,7 +1014,7 @@ Returns `true` iff it is possible to insert a 1-cell in the generic map between This is possible if `d1`\f$ \neq \f$ `d2` and `d1` can not be reached from `d2` by using some `previous` and `next` calls. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 2, `d1`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink, and `d2`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. -\sa `insert_cell_1_between_two_cells_2` +\sa `insert_cell_1_between_two_cells_2()` */ bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor d1, Dart_const_descriptor d2); @@ -1023,8 +1023,8 @@ bool is_insertable_cell_1_between_two_cells_2(Dart_const_descriptor d1, Dart_con Returns `true` iff it is possible to insert a 2-cell in the generic map along the path of darts given by the range `[afirst,alast)`. The 2-cell can be inserted iff the ordered list of darts form a closed path of edges inside a same volume. \pre \link GenericMap::dimension `dimension`\endlink \f$ \geq\f$ 3. -\sa `insert_cell_2_in_cell_3` -\sa `is_insertable_cell_1_in_cell_2` +\sa `insert_cell_2_in_cell_3()` +\sa `is_insertable_cell_1_in_cell_2()` */ template @@ -1036,7 +1036,7 @@ Returns `true` iff the i-cell containing `d` can be removed. An i-cell can be removed if `i`==\link GenericMap::dimension `dimension`\endlink or if `i`==\link GenericMap::dimension `dimension`\endlink-1 or if `i`\f$ < \f$ \link GenericMap::dimension `dimension`\endlink-1 and the i-cell containing `d` is incident to at most two (i+1)-cells. \pre 0\f$ \leq \f$ `i`\f$ \leq \f$ \link GenericMap::dimension `dimension`\endlink and `d`\f$ \in \f$ \link GenericMap::darts `darts()`\endlink. -\sa `remove_cell` +\sa `remove_cell()` */ template bool is_removable(Dart_const_descriptor d); @@ -1055,13 +1055,13 @@ If \link GenericMap::are_attributes_automatically_managed `are_attributes_automa If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. \cgalAdvancedEnd -\sa `is_removable` -\sa `insert_cell_0_in_cell_1` -\sa `insert_cell_0_in_cell_2` -\sa `insert_cell_1_in_cell_2` -\sa `insert_cell_1_between_two_cells_2` -\sa `insert_dangling_cell_1_in_cell_2` -\sa `insert_cell_2_in_cell_3` +\sa `is_removable()` +\sa `insert_cell_0_in_cell_1()` +\sa `insert_cell_0_in_cell_2()` +\sa `insert_cell_1_in_cell_2()` +\sa `insert_cell_1_between_two_cells_2()` +\sa `insert_dangling_cell_1_in_cell_2()` +\sa `insert_cell_2_in_cell_3()` */ template size_type remove_cell(Dart_descriptor d); From 936ff74dde3ba5aea89099854491cb8fc93ef905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 13:42:58 +0200 Subject: [PATCH 0378/1398] add missing include --- Filtered_kernel/include/CGAL/Filtered_kernel.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Filtered_kernel.h b/Filtered_kernel/include/CGAL/Filtered_kernel.h index 182ba3c4d99b..69b4cb9925ac 100644 --- a/Filtered_kernel/include/CGAL/Filtered_kernel.h +++ b/Filtered_kernel/include/CGAL/Filtered_kernel.h @@ -21,9 +21,7 @@ #include #include -#include -#include -#include +#include #include #include From 846dd8025338928d855d645c8f81314f878033b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 13:57:56 +0200 Subject: [PATCH 0379/1398] move it to a more suitable place --- Filtered_kernel/include/CGAL/Filtered_kernel.h | 2 -- Filtered_kernel/include/CGAL/Lazy_kernel.h | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Filtered_kernel.h b/Filtered_kernel/include/CGAL/Filtered_kernel.h index 69b4cb9925ac..3a41cabf3f08 100644 --- a/Filtered_kernel/include/CGAL/Filtered_kernel.h +++ b/Filtered_kernel/include/CGAL/Filtered_kernel.h @@ -21,8 +21,6 @@ #include #include -#include - #include #include diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 08a6ebb41a0a..183c322257e8 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -31,6 +31,7 @@ #include #include #include +#include #if defined(BOOST_MSVC) # pragma warning(push) From 27e303b5984fab1cb9a9dc5d3a174bcd282034ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 14:18:39 +0200 Subject: [PATCH 0380/1398] add more missing include directives --- NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h | 1 + .../Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h | 1 + .../test/Surface_mesher/implicit_surface_mesher_test.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h index 26741caf72a3..6e6b496840e1 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h index 37a9307dcaf0..d521dc4257c1 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include diff --git a/Surface_mesher/test/Surface_mesher/implicit_surface_mesher_test.cpp b/Surface_mesher/test/Surface_mesher/implicit_surface_mesher_test.cpp index 31dd6c116525..374c5b6941ca 100644 --- a/Surface_mesher/test/Surface_mesher/implicit_surface_mesher_test.cpp +++ b/Surface_mesher/test/Surface_mesher/implicit_surface_mesher_test.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include From ccc5462b28f701ceca3394c0f5d0fb72c6d86b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 14:45:43 +0200 Subject: [PATCH 0381/1398] add missing include directives --- Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h | 1 + .../include/CGAL/Regular_triangulation_vertex_base_2.h | 2 +- Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h | 1 + .../include/CGAL/Regular_triangulation_vertex_base_3.h | 1 + Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h index a7f311246463..cef5f5eeac86 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_vertex_base_2.h @@ -18,6 +18,7 @@ #include #include +#include #include diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h index a2ca48dac151..cc937b133c6c 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h @@ -16,8 +16,8 @@ #include - #include +#include namespace CGAL { diff --git a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h index ecbb1083689d..0e2bb5e03332 100644 --- a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h @@ -18,6 +18,7 @@ #include #include +#include namespace CGAL { diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h index cd697f179781..cdd1bce326b4 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace CGAL { diff --git a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h index 60e11f6233eb..99a589740e26 100644 --- a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h @@ -17,6 +17,7 @@ #include #include +#include namespace CGAL { From ec8c01a71949726d307240e74099a26fb1a004e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 10:48:41 +0200 Subject: [PATCH 0382/1398] add missing include --- Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h index e96dfaa5fcbf..919fec145ec4 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shape_vertex_base_2.h @@ -19,6 +19,7 @@ #include #include #include +#include //------------------------------------------------------------------- namespace CGAL { From cedad3eee0a2afd339434e65b7884103cd0a502f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 17:34:36 +0200 Subject: [PATCH 0383/1398] remove dependency --- Alpha_shapes_2/package_info/Alpha_shapes_2/dependencies | 1 - 1 file changed, 1 deletion(-) diff --git a/Alpha_shapes_2/package_info/Alpha_shapes_2/dependencies b/Alpha_shapes_2/package_info/Alpha_shapes_2/dependencies index eee8e076278c..6c1597376389 100644 --- a/Alpha_shapes_2/package_info/Alpha_shapes_2/dependencies +++ b/Alpha_shapes_2/package_info/Alpha_shapes_2/dependencies @@ -2,7 +2,6 @@ Algebraic_foundations Alpha_shapes_2 Arithmetic_kernel Cartesian_kernel -Filtered_kernel Hash_map Homogeneous_kernel Installation From 76f16d7c3850411dc572d64f387b1cf6407ed800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 16 Jun 2023 18:57:15 +0200 Subject: [PATCH 0384/1398] use std::get_if, get()->value() and remove CGAL::Object usage in Envelope changes in arrangement based packages --- .../Algebraic_kernel_d/Curve_analysis_2.h | 12 +- .../Curve_pair_analysis_2.h | 64 ++-- .../Algebraic_kernel_d/Status_line_CA_1.h | 2 +- .../CGAL/Arr_batched_point_location.h | 12 - .../CGAL/Arr_landmarks_point_location.h | 1 - .../CGAL/Arr_naive_point_location.h | 1 - .../CGAL/Arr_point_location_result.h | 24 -- .../CGAL/Arr_trapezoid_ric_point_location.h | 1 - .../CGAL/Arr_triangulation_point_location.h | 1 - .../CGAL/Arr_walk_along_line_point_location.h | 1 - .../Concepts/ArrangementPointLocation_2.h | 11 - .../Concepts/ArrangementVerticalRayShoot_2.h | 11 - .../PackageDescription.txt | 3 - .../circular_line_arcs.cpp | 3 +- .../incremental_insertion.cpp | 2 +- .../point_location_utils.h | 28 -- .../polycurve_bezier.cpp | 2 +- .../sgm_point_location.cpp | 6 +- .../include/CGAL/Arr_conic_traits_2.h | 50 ++-- .../include/CGAL/Arr_curve_data_traits_2.h | 10 +- .../Arr_geodesic_arc_on_sphere_traits_2.h | 49 ++-- .../Arr_geometry_traits/Bezier_x_monotone_2.h | 10 +- .../Arr_geometry_traits/Circle_segment_2.h | 11 +- .../include/CGAL/Arr_linear_traits_2.h | 8 +- .../CGAL/Arr_point_location/Td_active_edge.h | 6 +- .../Arr_point_location/Td_active_trapezoid.h | 16 +- .../Trapezoidal_decomposition_2.h | 12 +- .../include/CGAL/Arr_point_location_result.h | 55 +--- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 8 +- .../include/CGAL/Arr_segment_traits_2.h | 12 +- .../include/CGAL/Arr_simple_point_location.h | 9 - .../Arr_spherical_gaussian_map_3.h | 20 +- .../include/CGAL/Arr_tracing_traits_2.h | 4 +- .../Curved_kernel_via_analysis_2_functors.h | 4 +- .../Point_location_test.h | 5 - .../Arrangement_on_surface_2/cgal_test.cmake | 10 - .../cgal_test_with_cmake | 11 - .../Gps_agg_meta_traits.h | 7 +- .../Gps_simplifier_traits.h | 7 +- .../Envelope_2/Env_divide_and_conquer_2.h | 10 +- .../Env_divide_and_conquer_2_impl.h | 10 +- Envelope_3/include/CGAL/Env_plane_traits_3.h | 88 +++--- Envelope_3/include/CGAL/Env_sphere_traits_3.h | 71 +++-- .../include/CGAL/Env_tracing_traits_3.h | 16 +- .../include/CGAL/Env_triangle_traits_3.h | 276 ++++++++---------- .../Envelope_3/Env_plane_traits_3_functions.h | 136 ++++----- .../Envelope_divide_and_conquer_3.h | 21 +- .../Envelope_3/Envelope_element_visitor_3.h | 69 ++--- Envelope_3/test/Envelope_3/Envelope_test_3.h | 29 +- .../Envelope_3/Envelope_triangles_test_3.h | 40 +-- Installation/CHANGES.md | 8 + .../Minkowski_sum_2/Arr_labeled_traits_2.h | 13 +- 52 files changed, 503 insertions(+), 793 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index ef940f968877..c4a8a3a84cdb 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -631,7 +631,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { event_coordinates(); CGAL_assertion(this->ptr()->has_vertical_component); } - return this->ptr()->has_vertical_component.get(); + return this->ptr()->has_vertical_component.value(); } public: @@ -1437,7 +1437,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->sturm_habicht_of_primitive) { compute_sturm_habicht_of_primitive(); } - return this->ptr()->sturm_habicht_of_primitive.get(); + return this->ptr()->sturm_habicht_of_primitive.value(); } public: @@ -1558,7 +1558,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->resultant_of_primitive_and_derivative_y) { this->ptr()->resultant_of_primitive_and_derivative_y = stha[0][0]; if(this->ptr()->resultant_of_primitive_and_derivative_y. - get().is_zero()) { + value().is_zero()) { throw internal::Zero_resultant_exception (polynomial_2()); } @@ -1593,7 +1593,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->resultant_of_primitive_and_derivative_x) { compute_resultant_of_primitive_and_derivative_x(); } - return this->ptr()->resultant_of_primitive_and_derivative_x.get(); + return this->ptr()->resultant_of_primitive_and_derivative_x.value(); } private: @@ -2111,7 +2111,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { compute_horizontal_asymptotes(); } std::vector& asym_info - = this->ptr()->horizontal_asymptotes_left.get(); + = this->ptr()->horizontal_asymptotes_left.value(); CGAL_precondition(arcno>=0 && arcno(asym_info.size())); return asym_info[arcno]; @@ -2121,7 +2121,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { compute_horizontal_asymptotes(); } std::vector& asym_info - = this->ptr()->horizontal_asymptotes_right.get(); + = this->ptr()->horizontal_asymptotes_right.value(); CGAL_precondition(arcno>=0 && arcno(asym_info.size())); return asym_info[arcno]; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index d350a27a2df8..e3ef4a0f4bc0 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -547,7 +547,7 @@ class Curve_pair_analysis_2 : compute_resultant(); } CGAL_assertion(bool(this->ptr()->resultant)); - return this->ptr()->resultant.get(); + return this->ptr()->resultant.value(); } std::vector& resultant_roots() const { @@ -555,7 +555,7 @@ class Curve_pair_analysis_2 : compute_resultant_roots_with_multiplicities(); } CGAL_assertion(bool(this->ptr()->resultant_roots)); - return this->ptr()->resultant_roots.get(); + return this->ptr()->resultant_roots.value(); } Algebraic_real_1& resultant_roots(size_type i) const { @@ -569,7 +569,7 @@ class Curve_pair_analysis_2 : compute_resultant_roots_with_multiplicities(); } CGAL_assertion(bool(this->ptr()->multiplicities_of_resultant_roots)); - return this->ptr()->multiplicities_of_resultant_roots.get(); + return this->ptr()->multiplicities_of_resultant_roots.value(); } size_type multiplicities_of_resultant_roots(size_type i) const { @@ -586,10 +586,10 @@ class Curve_pair_analysis_2 : (kernel(), resultant_roots().begin(), resultant_roots().end(), - std::back_inserter(this->ptr()->stripe_values.get())); + std::back_inserter(this->ptr()->stripe_values.value())); } CGAL_assertion(bool(this->ptr()->stripe_values)); - return this->ptr()->stripe_values.get(); + return this->ptr()->stripe_values.value(); } std::vector& event_x_coordinates() const { @@ -597,7 +597,7 @@ class Curve_pair_analysis_2 : compute_event_x_coordinates_with_event_indices(); } CGAL_assertion(bool(this->ptr()->event_x_coordinates)); - return this->ptr()->event_x_coordinates.get(); + return this->ptr()->event_x_coordinates.value(); } std::vector& event_indices() const { @@ -605,7 +605,7 @@ class Curve_pair_analysis_2 : compute_event_x_coordinates_with_event_indices(); } CGAL_assertion(bool(this->ptr()->event_indices)); - return this->ptr()->event_indices.get(); + return this->ptr()->event_indices.value(); } public: @@ -633,7 +633,7 @@ class Curve_pair_analysis_2 : compute_intermediate_values_and_slices(); } CGAL_assertion(bool(this->ptr()->intermediate_values)); - return this->ptr()->intermediate_values.get(); + return this->ptr()->intermediate_values.value(); } std::vector& intermediate_slices() const { @@ -641,7 +641,7 @@ class Curve_pair_analysis_2 : compute_intermediate_values_and_slices(); } CGAL_assertion(bool(this->ptr()->intermediate_slices)); - return this->ptr()->intermediate_slices.get(); + return this->ptr()->intermediate_slices.value(); } @@ -652,7 +652,7 @@ class Curve_pair_analysis_2 : compute_subresultants(); } CGAL_assertion(bool(this->ptr()->subresultants)); - return this->ptr()->subresultants.get(); + return this->ptr()->subresultants.value(); } Polynomial_2& subresultants(size_type i) const { @@ -666,7 +666,7 @@ class Curve_pair_analysis_2 : compute_subresultants(); } CGAL_assertion(bool(this->ptr()->principal_subresultants)); - return this->ptr()->principal_subresultants.get(); + return this->ptr()->principal_subresultants.value(); } Polynomial_1& principal_subresultants(size_type i) const { @@ -681,7 +681,7 @@ class Curve_pair_analysis_2 : compute_subresultants(); } CGAL_assertion(bool(this->ptr()->coprincipal_subresultants)); - return this->ptr()->coprincipal_subresultants.get(); + return this->ptr()->coprincipal_subresultants.value(); } Polynomial_1& coprincipal_subresultants(size_type i) const { @@ -1045,7 +1045,7 @@ class Curve_pair_analysis_2 : } - return intermediate_slices()[i].valuen(); + return intermediate_slices()[i].value(); } //! Returns bound representative value at the ith interval @@ -1312,11 +1312,11 @@ void Curve_pair_analysis_2::compute_resultant() compute_subresultants(); this->ptr()->resultant - = this->ptr()->principal_subresultants.get()[0]; + = this->ptr()->principal_subresultants.value()[0]; } - if(this->ptr()->resultant.get().is_zero()) { + if(this->ptr()->resultant.value().is_zero()) { throw CGAL::internal::Zero_resultant_exception (this->ptr()->f, this->ptr()->g); @@ -1345,8 +1345,8 @@ compute_resultant_roots_with_multiplicities() const { solve_1(resultant(), std::back_inserter(res_pairs)); for(int i=0; i < static_cast(res_pairs.size()); i++ ) { - this->ptr()->resultant_roots.get().push_back(res_pairs[i].first); - this->ptr()->multiplicities_of_resultant_roots.get() + this->ptr()->resultant_roots.value().push_back(res_pairs[i].first); + this->ptr()->multiplicities_of_resultant_roots.value() .push_back(res_pairs[i].second); } @@ -1357,13 +1357,13 @@ compute_resultant_roots_with_multiplicities() const { #if CGAL_ACK_DEBUG_FLAG for(size_type i = 0; i - (this->ptr()->resultant_roots.get().size()); + (this->ptr()->resultant_roots.value().size()); i++) { CGAL_ACK_DEBUG_PRINT << "Root at " - << CGAL::to_double(this->ptr()->resultant_roots.get()[i]) + << CGAL::to_double(this->ptr()->resultant_roots.value()[i]) << " with multiplicity " - << this->ptr()->multiplicities_of_resultant_roots.get()[i] + << this->ptr()->multiplicities_of_resultant_roots.value()[i] << std::endl; } #endif @@ -1401,18 +1401,18 @@ compute_event_x_coordinates_with_event_indices() const { one_curve_events.end(), resultant_roots().begin(), resultant_roots().end(), - std::back_inserter(this->ptr()->event_x_coordinates.get()), + std::back_inserter(this->ptr()->event_x_coordinates.value()), std::back_inserter(events_type), compare); std::vector& events - = this->ptr()->event_x_coordinates.get(); + = this->ptr()->event_x_coordinates.value(); typename std::vector::iterator one_curve_it =one_curve_events_type.begin(); size_type inter_count=0, f_count=0,g_count=0; this->ptr()->event_indices = std::vector(); std::vector& event_indices - = this->ptr()->event_indices.get(); + = this->ptr()->event_indices.value(); for(size_type i=0;i(events.size());i++) { /* #if CGAL_ACK_DEBUG_FLAG @@ -1519,8 +1519,8 @@ compute_intermediate_values_and_slices() const { std::size_t size = event_x_coordinates().size()+1; this->ptr()->intermediate_values=std::vector(); this->ptr()->intermediate_slices=std::vector(); - this->ptr()->intermediate_values.get().resize(size); - this->ptr()->intermediate_slices.get().resize(size); + this->ptr()->intermediate_values.value().resize(size); + this->ptr()->intermediate_slices.value().resize(size); #if CGAL_ACK_DEBUG_FLAG CGAL_ACK_DEBUG_PRINT << "done" << std::endl; #endif @@ -1539,25 +1539,25 @@ compute_subresultants() const { if(CGAL::degree(f,1)ptr()->subresultants.get())); + (g,f,std::back_inserter(this->ptr()->subresultants.value())); #else typename CGAL::Polynomial_traits_d ::Polynomial_subresultants() - (g,f,std::back_inserter(this->ptr()->subresultants.get())); + (g,f,std::back_inserter(this->ptr()->subresultants.value())); #endif } else { #if CGAL_ACK_USE_BEZOUT_MATRIX_FOR_SUBRESULTANTS CGAL::internal::bezout_polynomial_subresultants - (f,g,std::back_inserter(this->ptr()->subresultants.get())); + (f,g,std::back_inserter(this->ptr()->subresultants.value())); #else typename CGAL::Polynomial_traits_d ::Polynomial_subresultants() - (f,g,std::back_inserter(this->ptr()->subresultants.get())); + (f,g,std::back_inserter(this->ptr()->subresultants.value())); #endif } std::vector& subresultants - = this->ptr()->subresultants.get(); + = this->ptr()->subresultants.value(); size_type n = static_cast(subresultants.size()); @@ -1584,11 +1584,11 @@ compute_subresultants() const { // This must be corrected, if f and g have same degree: if(CGAL::degree(f,1) == CGAL::degree(g,1)) { if(n>=1) { - this->ptr()->principal_subresultants.get()[n-1] + this->ptr()->principal_subresultants.value()[n-1] = Polynomial_1(CGAL::leading_coefficient(g)); } if(n>=2) { - this->ptr()->coprincipal_subresultants.get()[n-2] + this->ptr()->coprincipal_subresultants.value()[n-2] = Polynomial_1(g[CGAL::degree(g,1)-1]); } } diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h index c1260d26a456..a8ecf22eac1c 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h @@ -555,7 +555,7 @@ class Status_line_CA_1 //! Returns the isolator instance Bitstream_descartes& isolator() const { CGAL_assertion(bool(this->ptr()->isolator)); - return this->ptr()->isolator.get(); + return this->ptr()->isolator.value(); } //! Returns whether an isolator has been given for that status line diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h index 82c932fca8b2..bafb54b7db7b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h @@ -22,19 +22,7 @@ the output sequence. `std::pair::%Type>`. -\cgalHeading{A Note on Backwards Compatibility} -This function used to return `CGAL::Object` up to -\cgal version 4.2. Starting with \cgal version 4.3 the return type -is determined by the metafunction `CGAL::Arr_point_location_result`. -To preserve backwards compatibility -`CGAL::Object` can be constructed from the new return type -implicitly, but switching to the new style is recommended. To enable -the old style without any overhead, the macro -`::CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any -\cgal header is included. - \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template< typename Arrangement, typename Generator > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h index 1ef49902c8cf..b79e948e3e79 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h @@ -19,7 +19,6 @@ time-consuming process when applied to dense arrangements. \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template< typename Arrangement > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h index 32b4e443326e..ed8cc09f5d06 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h @@ -1,25 +1,4 @@ /*! -\ingroup PkgArrangementOnSurface2PointLocation - -The macro `CGAL_ARR_POINT_LOCATION_VERSION` can be used to configure -the point-location query API. In particular, it determines which version -of the result type of the point-location and vertical ray-shooting queries -should be used by models of the concepts `ArrangementPointLocation_2` -and `ArrangementVerticalRayShoot_2`, and by the free function -`locate`. The `CGAL_ARR_POINT_LOCATION_VERSION` should be defined before any \cgal header -is included. - -- `CGAL_ARR_POINT_LOCATION_VERSION` == 1, the result type is set to be `CGAL::Object`. -- `CGAL_ARR_POINT_LOCATION_VERSION` == 2, the result type is set to be -`std::variant`, where `Vertex_const_handle`, `Halfedge_const_handle`, and -`Face_const_handle` are the corresponding nested types in a `CGAL::Arrangement_2` instance. - - -\sa `ArrangementPointLocation_2` -\sa `ArrangementVerticalRayShoot_2` -\sa `CGAL::Arr_point_location_result` -*/ -#define CGAL_ARR_POINT_LOCATION_VERSION namespace CGAL { @@ -37,7 +16,6 @@ or vertical ray-shoot query. \sa `CGAL::Arr_walk_along_line_point_location` \sa `CGAL::Arr_landmarks_point_location` \sa `CGAL::Arr_trapezoid_ric_point_location` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template struct Arr_point_location_result @@ -45,8 +23,6 @@ struct Arr_point_location_result /*! The type of the arrangement feature that is the result of a * point-location query or a vertical ray-shoot query, namely, * `std::variant` - * if `::CGAL_ARR_POINT_LOCATION_VERSION` == 2, which is the default, otherwise - * `CGAL::Object`. */ typedef unspecified_type Type; }; /* end Arr_point_location_result */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h index 0027ec53409c..45c0d8c8470f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h @@ -32,7 +32,6 @@ This strategy supports arbitrary subdivisions, including unbounded ones. \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template< typename Arrangement > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h index ed9c1e12e3d1..4ad6dfeb8eb7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h @@ -21,7 +21,6 @@ namespace CGAL { * \sa `ArrangementPointLocation_2` * \sa `ArrangementVerticalRayShoot_2` * \sa `CGAL::Arr_point_location_result` - * \sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h index ed5df33be960..e6141a6779d8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h @@ -29,7 +29,6 @@ of issued queries is not large. \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ template< typename Arrangement > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h index c2f6a0437f2c..b2fa1c3aae49 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h @@ -10,16 +10,6 @@ containing it. In the general case, the query point is contained inside an arrangement face, but in degenerate situations it may lie on an edge or coincide with an arrangement vertex. -\cgalHeading{A note on Backwards compatibility} -The `locate` member function used to return `CGAL::Object` up to -\cgal version 4.2. Starting with \cgal version 4.3 the return type -is determined by a metafunction. To preserve backwards compatibility -`CGAL::Object` can be constructed from the new return types -implicitly, but switching to the new style is recommended. To enable -the old style without any overhead, the macro -`CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any -\cgal header is included. - \cgalHasModel `CGAL::Arr_naive_point_location` \cgalHasModel `CGAL::Arr_walk_along_line_point_location` \cgalHasModel `CGAL::Arr_trapezoid_ric_point_location` @@ -30,7 +20,6 @@ the old style without any overhead, the macro \sa `CGAL::Arr_trapezoid_ric_point_location` \sa `CGAL::Arr_landmarks_point_location` \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h index 4a1febdc2d23..e676fefcf164 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h @@ -18,16 +18,6 @@ emanating from the query point goes to infinity without hitting any arrangement feature on its way. In this case the unbounded face is returned. -\cgalHeading{A Note on Backwards Compatibility} -The `ray_shoot_up` and `ray_shoot_down` member functions used -to return `CGAL::Object` up to \cgal version 4.2. Starting with -\cgal version 4.3 the return type is determined by a metafunction. To -preserve backwards compatibility `CGAL::Object` can be constructed -from the new return types implicitly, but switching to the new style -is recommended. To enable the old style without any overhead, the macro -`CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any -\cgal header is included. - \cgalHasModel `CGAL::Arr_naive_point_location` \cgalHasModel `CGAL::Arr_walk_along_line_point_location` \cgalHasModel `CGAL::Arr_trapezoid_ric_point_location` @@ -38,7 +28,6 @@ is recommended. To enable the old style without any overhead, the macro \sa `CGAL::Arr_trapezoid_ric_point_location` \sa `CGAL::Arr_landmarks_point_location` \sa `CGAL::Arr_point_location_result` -\sa `CGAL_ARR_POINT_LOCATION_VERSION` */ class ArrangementVerticalRayShoot_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt index 04ce3c47c289..4427a20e151b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt @@ -239,9 +239,6 @@ implemented as peripheral classes or as free (global) functions. - `CGAL::Arr_unb_planar_topology_traits_2` - `CGAL::Arr_spherical_topology_traits_2` -\cgalCRPSection{Macros} -- \link CGAL_ARR_POINT_LOCATION_VERSION `CGAL_ARR_POINT_LOCATION_VERSION` \endlink - \cgalCRPSection{Functions} - `CGAL::is_valid()` diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp index 735403352577..750986dda1eb 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/circular_line_arcs.cpp @@ -72,7 +72,8 @@ int main() { Point_location _pl(arr); for (ArcContainer::const_iterator it = ac.begin(); it != ac.end(); ++it) { //insert(arr,_pl,*it); - insert(arr, *it, _pl); + //DONOTCOMMIT + //~ insert(arr, *it, _pl); }; return 0; diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp index 425b187d17ed..59a0203a4b45 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/incremental_insertion.cpp @@ -32,7 +32,7 @@ int main() { // the boundary of the face that contains it. Point q(4, 1); auto obj = pl.locate(q); - auto* f = std::get(&obj); + auto* f = std::get_if(&obj); std::cout << "The query point (" << q << ") is located in: "; print_face(*f); diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h index d6c29e08bac7..d5a729edc6d9 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/point_location_utils.h @@ -4,33 +4,6 @@ //----------------------------------------------------------------------------- // Print the result of a point-location query. // -#if CGAL_ARR_POINT_LOCATION_VERSION < 2 -template -void print_point_location(const typename Arrangement_::Point_2& q, - CGAL::Object obj) -{ - typedef Arrangement_ Arrangement_2; - typename Arrangement_2::Vertex_const_handle v; - typename Arrangement_2::Halfedge_const_handle e; - typename Arrangement_2::Face_const_handle f; - - std::cout << "The point (" << q << ") is located "; - if (CGAL::assign(f, obj)) { // q is located inside a face - if (f->is_unbounded()) - std::cout << "inside the unbounded face." << std::endl; - else std::cout << "inside a bounded face." << std::endl; - } - else if (CGAL::assign(e, obj)) { // q is located on an edge - std::cout << "on an edge: " << e->curve() << std::endl; - } - else if (CGAL::assign(v, obj)) { // q is located on a vertex - if (v->is_isolated()) - std::cout << "on an isolated vertex: " << v->point() << std::endl; - else std::cout << "on a vertex: " << v->point() << std::endl; - } - else CGAL_error_msg( "Invalid object."); -} -#else template void print_point_location (const typename Arrangement_::Point_2& q, @@ -57,7 +30,6 @@ void print_point_location << " vertex: " << (*v)->point() << std::endl; else CGAL_error_msg("Invalid object."); } -#endif //----------------------------------------------------------------------------- // Perform a point-location query and print the result. diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp index bc4168f2da0e..70184f7f4bb5 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/polycurve_bezier.cpp @@ -58,7 +58,7 @@ int main() { // convert it into x-monotone bezier curve. std::vector obj_vector; bezier_traits.make_x_monotone_2_object()(B, std::back_inserter(obj_vector)); - auto* x_seg_p = std::get(&obj_vector[0]); + auto* x_seg_p = std::get_if(&obj_vector[0]); x_curves.push_back(*x_seg_p); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp index 5cd1a8367c24..98515d5d0c9d 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/sgm_point_location.cpp @@ -99,15 +99,15 @@ int main() { for (auto it = results.begin(); it != results.end(); ++it) { std::cout << "The point (" << it->first << ") is located "; if (const Face_const_handle* f = - std::get(&(it->second))) // inside a face + std::get_if(&(it->second))) // inside a face std::cout << "inside " << (((*f)->is_unbounded()) ? "the unbounded" : "a bounded") << " face.\n"; else if (const Halfedge_const_handle* e = - std::get(&(it->second))) // on an edge + std::get_if(&(it->second))) // on an edge std::cout << "on an edge: " << (*e)->curve() << std::endl; else if (const Vertex_const_handle* v = - std::get(&(it->second))) // on a vertex + std::get_if(&(it->second))) // on a vertex std::cout << "on " << (((*v)->is_isolated()) ? "an isolated" : "a") << " vertex: " << (*v)->point() << std::endl; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h index 2445f06cfa33..462101d028e8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_conic_traits_2.h @@ -862,8 +862,6 @@ class Arr_conic_traits_2 { */ template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef std::variant - Make_x_monotone_result; auto ctr_xcv = m_traits.construct_x_monotone_curve_2_object(); @@ -877,7 +875,7 @@ class Arr_conic_traits_2 { auto n_vtan_ps = m_traits.vertical_tangency_points(cv, vtan_ps); if (n_vtan_ps == 0) { // In case the given curve is already x-monotone: - *oi++ = Make_x_monotone_result(ctr_xcv(cv, conic_id)); + *oi++ = ctr_xcv(cv, conic_id); return oi; } @@ -889,19 +887,15 @@ class Arr_conic_traits_2 { // In case the curve is a full conic, split it into two x-monotone // arcs, one going from ps[0] to ps[1], and the other from ps[1] to // ps[0]. - *oi++ = Make_x_monotone_result(ctr_xcv(cv, vtan_ps[0], vtan_ps[1], - conic_id)); - *oi++ = Make_x_monotone_result(ctr_xcv(cv, vtan_ps[1], vtan_ps[0], - conic_id)); + *oi++ = ctr_xcv(cv, vtan_ps[0], vtan_ps[1], conic_id); + *oi++ = ctr_xcv(cv, vtan_ps[1], vtan_ps[0], conic_id); } else { if (n_vtan_ps == 1) { // Split the arc into two x-monotone sub-curves: one going from the // arc source to ps[0], and the other from ps[0] to the target. - *oi++ = Make_x_monotone_result(ctr_xcv(cv, cv.source(), vtan_ps[0], - conic_id)); - *oi++ = Make_x_monotone_result(ctr_xcv(cv, vtan_ps[0], cv.target(), - conic_id)); + *oi++ = ctr_xcv(cv, cv.source(), vtan_ps[0], conic_id); + *oi++ = ctr_xcv(cv, vtan_ps[0], cv.target(), conic_id); } else { CGAL_assertion(n_vtan_ps == 2); @@ -931,16 +925,16 @@ class Arr_conic_traits_2 { } // Split the arc into three x-monotone sub-curves. - *oi++ = Make_x_monotone_result(ctr_xcv(cv, cv.source(), - vtan_ps[ind_first], - conic_id)); + *oi++ = ctr_xcv(cv, cv.source(), + vtan_ps[ind_first], + conic_id); - *oi++ = Make_x_monotone_result(ctr_xcv(cv, vtan_ps[ind_first], - vtan_ps[ind_second], - conic_id)); + *oi++ = ctr_xcv(cv, vtan_ps[ind_first], + vtan_ps[ind_second], + conic_id); - *oi++ = Make_x_monotone_result(ctr_xcv(cv, vtan_ps[ind_second], - cv.target(), conic_id)); + *oi++ = ctr_xcv(cv, vtan_ps[ind_second], + cv.target(), conic_id); } } @@ -1314,17 +1308,15 @@ class Arr_conic_traits_2 { OutputIterator intersect(const X_monotone_curve_2& xcv1, const X_monotone_curve_2& xcv2, Intersection_map& inter_map, - OutputIterator oi) const { - typedef std::variant - Intersection_result; - + OutputIterator oi) const + { if (m_traits.has_same_supporting_conic(xcv1, xcv2)) { // Check for overlaps between the two arcs. X_monotone_curve_2 overlap; if (compute_overlap(xcv1, xcv2, overlap)) { // There can be just a single overlap between two x-monotone arcs: - *oi++ = Intersection_result(overlap); + *oi++ = overlap; return oi; } @@ -1337,22 +1329,22 @@ class Arr_conic_traits_2 { auto eq = alg_kernel->equal_2_object(); if (eq(xcv1.left(), xcv2.left())) { Intersection_point ip(xcv1.left(), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } if (eq(xcv1.right(), xcv2.right())) { Intersection_point ip(xcv1.right(), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } if (eq(xcv1.left(), xcv2.right())) { Intersection_point ip(xcv1.left(), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } if (eq(xcv1.right(), xcv2.left())) { Intersection_point ip(xcv1.right(), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } return oi; @@ -1395,7 +1387,7 @@ class Arr_conic_traits_2 { if (m_traits.is_between_endpoints(xcv1, (*iter).first) && m_traits.is_between_endpoints(xcv2, (*iter).first)) { - *oi++ = Intersection_result(*iter); + *oi++ = *iter; } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h index e8bb9a707035..d0a68b2885ba 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_curve_data_traits_2.h @@ -208,8 +208,6 @@ class Arr_curve_data_traits_2 : public Traits_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; typedef std::variant Intersection_base_result; @@ -223,19 +221,19 @@ class Arr_curve_data_traits_2 : public Traits_ { // Go over all intersection objects and prepare the output. for (const auto& item : base_objects) { const Base_x_monotone_curve_2* base_cv = - std::get(&item); + std::get_if(&item); if (base_cv != nullptr) { // The current intersection object is an overlapping x-monotone // curve: Merge the data fields of both intersecting curves and // associate the result with the overlapping curve. X_monotone_curve_2 cv(*base_cv, Merge()(cv1.data(), cv2.data())); - *oi++ = Intersection_result(cv); + *oi++ = cv; continue; } // The current intersection object is an intersection point: // Copy it as is. - const Intersection_point* ip = std::get(&item); - *oi++ = Intersection_result(*ip); + const Intersection_point* ip = std::get_if(&item); + *oi++ = *ip; } return oi; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index 5c07971538e3..7d94b289992d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -2321,8 +2321,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; + const Kernel& kernel = m_traits; typename Kernel::Equal_2 equal = kernel.equal_2_object(); @@ -2337,14 +2336,14 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { if (equal(l1, r1)) { bool is_full = equal(l2, r2); X_monotone_curve_2 xc(l2_3, r2_3, normal, vertical, true, is_full); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } if (equal(l2, r2)) { CGAL_assertion(! equal(l1, r1)); // already handled above X_monotone_curve_2 xc(l1_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2358,19 +2357,19 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { // 5. l1 = r2 < r1 < l2 = l1 | One overlap (handled above) if (in_between(r1, r2, l2)) { // Case 1. - *oi++ = Intersection_result(Intersection_point(l1_3, 1)); + *oi++ = Intersection_point(l1_3, 1); return oi; } if (equal(r1, l2)) { // Case 2. - *oi++ = Intersection_result(Intersection_point(l1_3, 1)); - *oi++ = Intersection_result(Intersection_point(l2_3, 1)); + *oi++ = Intersection_point(l1_3, 1); + *oi++ = Intersection_point(l2_3, 1); return oi; } CGAL_assertion(in_between(r1, l2, r2)); // Case 3. X_monotone_curve_2 xc(l2_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2383,12 +2382,12 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { // 5. l1 < l1 = r1 = l2 < r2 | One overlap (handled above) if (in_between(r2, r1, l1)) { // Case 1. - *oi++ = Intersection_result(Intersection_point(l2_3, 1)); + *oi++ = Intersection_point(l2_3, 1); return oi; } // Case 3. X_monotone_curve_2 xc(l1_3, r2_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2400,13 +2399,13 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { if (in_between(r1, l2, r2) || equal(r1, r2)) { // Cases 1 & 2 X_monotone_curve_2 xc(l1_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } // Case 3 CGAL_assertion(in_between(r2, l2, r1)); X_monotone_curve_2 xc(l2_3, r2_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2418,13 +2417,13 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { if (in_between(l1, r2, l2)) { // Cases 1 X_monotone_curve_2 xc(l2_3, r2_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } // Case 3 CGAL_assertion(in_between(l1, l2, l2)); X_monotone_curve_2 xc(l1_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2442,12 +2441,12 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { if (in_between(l2, r2, l1)) { // Case 2 X_monotone_curve_2 xc(l1_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } // Case 3 X_monotone_curve_2 xc(l2_3, r1_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2457,12 +2456,12 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { // Case 4 if (in_between(l1, r1, l2)) { X_monotone_curve_2 xc(l2_3, r2_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } // Case 5 X_monotone_curve_2 xc(l1_3, r2_3, normal, vertical, true); - *oi++ = Intersection_result(xc); + *oi++ = xc; return oi; } @@ -2560,8 +2559,6 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { typedef typename Kernel::Equal_3 Equal_3; typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; const Kernel& kernel = m_traits; @@ -2584,9 +2581,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { (res && (xc1.is_directed_right() != xc2.is_directed_right()))) { if (xc1.left().is_min_boundary() && xc2.left().is_min_boundary()) - *oi++ = Intersection_result(Intersection_point(xc1.left(), 1)); + *oi++ = Intersection_point(xc1.left(), 1); if (xc1.right().is_max_boundary() && xc2.right().is_max_boundary()) - *oi++ = Intersection_result(Intersection_point(xc1.right(), 1)); + *oi++ = Intersection_point(xc1.right(), 1); return oi; } @@ -2594,11 +2591,11 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * the other arc is completely overlapping. */ if (xc1.left().is_min_boundary() && xc1.right().is_max_boundary()) { - *oi++ = Intersection_result(xc2); + *oi++ = xc2; return oi; } if (xc2.left().is_min_boundary() && xc2.right().is_max_boundary()) { - *oi++ = Intersection_result(xc1); + *oi++ = xc1; return oi; } /*! Find an endpoint that does not coincide with a pole, and project @@ -2646,12 +2643,12 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { // Observe that xc1 and xc2 may share two endpoints. Point_2 ed = m_traits.construct_point_2_object()(v.direction()); if (is_in_between(ed, xc1) && is_in_between(ed, xc2)) - *oi++ = Intersection_result(Intersection_point(ed, 1)); + *oi++ = Intersection_point(ed, 1); Vector_3 vo(kernel.construct_opposite_vector_3_object()(v)); Point_2 edo = m_traits.construct_point_2_object()(vo.direction()); if (is_in_between(edo, xc1) && is_in_between(edo, xc2)) - *oi++ = Intersection_result(Intersection_point(edo, 1)); + *oi++ = Intersection_point(edo, 1); return oi; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h index 12f3f3a7c66d..f8589b2953b6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Bezier_x_monotone_2.h @@ -318,13 +318,11 @@ class _Bezier_x_monotone_2 Bezier_cache& cache, OutputIterator oi) const { - typedef std::variant Intersection_result; - // In case we have two x-monotone subcurves of the same Bezier curve, // check if they have a common left endpoint. if (_curve.is_same(cv._curve)) { if (left().is_same(cv.left()) || left().is_same(cv.right())) - *oi++ = Intersection_result(Intersection_point(left(), 0)); + *oi++ = Intersection_point(left(), 0); } // Compute the intersections of the two sucurves. Note that for caching @@ -341,7 +339,7 @@ class _Bezier_x_monotone_2 // In case of overlap, just report the overlapping subcurve. if (do_ovlp) { - *oi++ = Intersection_result(ovlp_cv); + *oi++ = ovlp_cv; return oi; } @@ -349,14 +347,14 @@ class _Bezier_x_monotone_2 // xy-lexicorgraphical order, and insert them to the output iterator. std::sort(ipts.begin(), ipts.end(), Less_intersection_point(cache)); for (auto ip_it = ipts.begin(); ip_it != ipts.end(); ++ip_it) { - *oi++ = Intersection_result(*ip_it); + *oi++ = *ip_it; } // In case we have two x-monotone subcurves of the same Bezier curve, // check if they have a common right endpoint. if (_curve.is_same(cv._curve)) { if (right().is_same(cv.left()) || right().is_same(cv.right())) { - *oi++ = Intersection_result(Intersection_point(right(), 0)); + *oi++ = Intersection_point(right(), 0); } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h index 051390155d5b..f46489ba9690 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geometry_traits/Circle_segment_2.h @@ -995,9 +995,6 @@ class _X_monotone_circle_segment_2 { OutputIterator intersect(const Self& cv, OutputIterator oi, Intersection_map* inter_map = nullptr) const { - typedef std::pair Intersection_point; - typedef std::variant Intersection_result; - // First check whether the two arcs have the same supporting curve. if (has_same_supporting_curve(cv)) { // Check for overlaps between the two arcs. @@ -1005,7 +1002,7 @@ class _X_monotone_circle_segment_2 { if (_compute_overlap(cv, overlap)) { // There can be just a single overlap between two x-monotone arcs: - *oi++ = Intersection_result(overlap); + *oi++ = overlap; return oi; } @@ -1016,11 +1013,11 @@ class _X_monotone_circle_segment_2 { // intersection points we report. Multiplicity mult = 0; if (left().equals(cv.left()) || left().equals(cv.right())) { - *oi++ = Intersection_result(std::make_pair(left(), mult)); + *oi++ = std::make_pair(left(), mult); } if (right().equals(cv.right()) || right().equals(cv.left())) { - *oi++ = Intersection_result(std::make_pair(right(), mult)); + *oi++ = std::make_pair(right(), mult); } return oi; @@ -1072,7 +1069,7 @@ class _X_monotone_circle_segment_2 { if (this->_is_between_endpoints (iter->first) && cv._is_between_endpoints (iter->first)) { - *oi++ = Intersection_result(*iter); + *oi++ = *iter; } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h index ef830934d74b..f712190f0df0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_linear_traits_2.h @@ -1326,8 +1326,6 @@ class Arr_linear_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; CGAL_precondition(! cv1.is_degenerate()); CGAL_precondition(! cv2.is_degenerate()); @@ -1354,7 +1352,7 @@ class Arr_linear_traits_2 : public Kernel_ { // Create a pair representing the point with its multiplicity, // which is always 1 for line segments. Intersection_point ip_mult(*ip, 1); - *oi++ = Intersection_result(ip_mult); + *oi++ = ip_mult; } } return oi; @@ -1398,14 +1396,14 @@ class Arr_linear_traits_2 : public Kernel_ { if (cmp_res == SMALLER) { // We have discovered a true overlapping subcurve: - *oi++ = Intersection_result(ovlp); + *oi++ = ovlp; } else if (cmp_res == EQUAL) { // The two objects have the same supporting line, but they just share // a common endpoint. Thus we have an intersection point, but we leave // the multiplicity of this point undefined. Intersection_point ip_mult(ovlp.left(), 0); - *oi++ = Intersection_result(ip_mult); + *oi++ = ip_mult; } return oi; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h index b026673d4a6b..c1a177e5ab62 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h @@ -145,13 +145,13 @@ class Td_active_edge : public Handle //Dag_node* m_dag_node; //pointer to the search structure (DAG) node /*! Initialize the trapezoid's neighbors. */ - inline void init_neighbors(std::optional next) + inline void init_neighbors(std::optional> next) { set_next((next) ? *next : Td_map_item(0)); } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ - CGAL_DEPRECATED inline void init_neighbours(std::optional next) + CGAL_DEPRECATED inline void init_neighbours(std::optional> next) { init_neighbors(next); } /*! Set the DAG node. */ @@ -199,7 +199,7 @@ class Td_active_edge : public Handle /*! Constructor given Vertex & Halfedge handles. */ Td_active_edge (Halfedge_const_handle he , Dag_node* node = 0, - std::optional next = std::nullopt) + std::optional> next = std::nullopt) { PTR = new Data(he, (next) ? *next : Td_map_item(0), node); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h index d8a775c41793..f226db992d9c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h @@ -163,8 +163,8 @@ class Td_active_trapezoid : public Handle //Dag_node* m_dag_node; //pointer to the search structure (DAG) node /*! Initialize the trapezoid's neighbors. */ - inline void init_neighbors(std::optional lb, std::optional lt, - std::optional rb, std::optional rt) + inline void init_neighbors(std::optional> lb, std::optional> lt, + std::optional> rb, std::optional> rt) { set_lb((lb) ? *lb : Td_map_item(0)); set_lt((lt) ? *lt : Td_map_item(0)); @@ -173,8 +173,8 @@ class Td_active_trapezoid : public Handle } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ - CGAL_DEPRECATED inline void init_neighbours(std::optional lb, std::optional lt, - std::optional rb, std::optional rt) + CGAL_DEPRECATED inline void init_neighbours(std::optional> lb, std::optional> lt, + std::optional> rb, std::optional> rt) { init_neighbors(lb, lt, rb, rt); } /*! Set the DAG node. */ @@ -267,10 +267,10 @@ class Td_active_trapezoid : public Handle /*! Constructor given Vertex & Halfedge handles. */ Td_active_trapezoid (Vertex_const_handle l, Vertex_const_handle r, Halfedge_const_handle b, Halfedge_const_handle t, - std::optional lb = std::nullopt, - std::optional lt = std::nullopt, - std::optional rb = std::nullopt, - std::optional rt = std::nullopt, + std::optional> lb = std::nullopt, + std::optional> lt = std::nullopt, + std::optional> rb = std::nullopt, + std::optional> rt = std::nullopt, Dag_node* node = 0) { PTR = new Data (l, r, b, t, (lb) ? *lb : Td_map_item(0), (lt) ? *lt : Td_map_item(0), diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index 3888b097bb8b..e461b86a4432 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -272,7 +272,7 @@ class Trapezoidal_decomposition_2 Base_map_item_iterator() : traits(0), m_cur_item(Td_map_item(0)){ } Base_map_item_iterator(const Traits* traits_, - std::optional curr = std::nullopt) + std::optional> curr = std::nullopt) :traits(traits_), m_cur_item((curr) ? *curr : Td_map_item(0) ) { } Base_map_item_iterator(const Base_map_item_iterator &it) @@ -332,12 +332,12 @@ class Trapezoidal_decomposition_2 public: //constructors In_face_iterator(const Traits* traits_, Halfedge_const_handle sep, - std::optional curr = std::nullopt) + std::optional> curr = std::nullopt) :Base_map_item_iterator(traits_,curr), m_sep(sep->curve()) { } In_face_iterator(const Traits* traits_, const X_monotone_curve_2& sep, - std::optional curr = std::nullopt) + std::optional> curr = std::nullopt) :Base_map_item_iterator(traits_,curr), m_sep(sep) { } @@ -879,20 +879,20 @@ class Trapezoidal_decomposition_2 class cv_for_edge_visitor { public: - std::optional + std::optional> operator()(Td_active_edge& t) const { return t.halfedge()->curve(); } - std::optional + std::optional> operator()(Td_inactive_edge& t) const { return t.curve(); } template - std::optional operator()(T& /* t */) const + std::optional> operator()(T& /* t */) const { CGAL_assertion(false); return std::nullopt; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h index 15320d02bcdb..4651b64c4dd6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h @@ -16,41 +16,9 @@ #include -// The macro CGAL_ARR_POINT_LOCATION_VERSION controls which version of the -// point location is used. Currently two values are supported: -// 1. Point location with CGAL::Object -// 2. Point location with std::optional > -// The default value is 2. - -#if !defined(CGAL_ARR_POINT_LOCATION_VERSION) -#define CGAL_ARR_POINT_LOCATION_VERSION 2 -#endif - -#include - #include #include -#ifdef CGAL_CFG_BOOST_VARIANT_SWAP_BUG -#if CGAL_ARR_POINT_LOCATION_VERSION > 1 -#include -// workaround for this bug: -// https://svn.boost.org/trac/boost/ticket/2839 -namespace boost{ namespace detail { namespace variant { - -template -inline void move_swap( - ::CGAL::I_Filtered_const_iterator& lhs, - ::CGAL::I_Filtered_const_iterator& rhs) -{ - ::CGAL::I_Filtered_const_iterator tmp( boost::detail::variant::move(lhs) ); - lhs = boost::detail::variant::move(rhs); - rhs = boost::detail::variant::move(tmp); -} -} } } -#endif -#endif - namespace CGAL { template @@ -61,34 +29,16 @@ struct Arr_point_location_result { typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle; typedef typename Arrangement_2::Face_const_handle Face_const_handle; -#if CGAL_ARR_POINT_LOCATION_VERSION < 2 - typedef CGAL::Object Type; -#else typedef typename std::variant Type; -#endif typedef Type type; - // This function returns either make_object() or a result_type constructor - // to generate return values. The Object version takes a dummy template - // argument, which is needed for the return of the other option, e.g., - // std::optional >. + // This function returns a result_type constructor + // to generate return values. // In theory a one parameter variant could be returned, but this _could_ // lead to conversion overhead, and so we rather go for the real type. // Overloads for empty returns are also provided. -#if CGAL_ARR_POINT_LOCATION_VERSION < 2 - template - static - inline Type make_result(T t) { return CGAL::make_object(t); } - - static - inline CGAL::Object empty_optional_result() { return CGAL::Object(); } - - template - static - inline const T* assign(const Type* obj) { return CGAL::object_cast(obj); } -#else template static inline Type make_result(T t) { return Type(t); } @@ -100,7 +50,6 @@ struct Arr_point_location_result { template static inline const T* assign(const Type* obj) { return std::get_if(obj); } -#endif // CGAL_ARR_POINT_LOCATION_VERSION < 2 //this one is only to remove warnings in functions static diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index bb418c5d87ba..345d9d89caf8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -2047,7 +2047,7 @@ class Continuous_rational_arc_d_1: if (this->equals(arc)) { Self overlap_arc(*this); - *oi++ = Intersection_result(overlap_arc); + *oi++ = overlap_arc; return oi; } @@ -2170,7 +2170,7 @@ class Continuous_rational_arc_d_1: (this->SRC_AT_Y_MINUS_INFTY | this->SRC_AT_Y_PLUS_INFTY) == 0) { Intersection_point ip(p_left, 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } return oi; @@ -2189,7 +2189,7 @@ class Continuous_rational_arc_d_1: this->IS_DIRECTED_RIGHT | this->IS_CONTINUOUS | this->IS_VALID); - *oi++ = Intersection_result(overlap_arc); + *oi++ = overlap_arc; return oi; } @@ -2221,7 +2221,7 @@ class Continuous_rational_arc_d_1: Algebraic_point_2 p(this->_f, *x_iter); // Output the intersection point: Intersection_point ip(p, *m_iter); - *oi++ = Intersection_result(ip); + *oi++ = ip; } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h index 15a3cffe63d8..b080305c6f8f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_segment_traits_2.h @@ -706,8 +706,6 @@ class Arr_segment_traits_2 : public Kernel_ { OutputIterator oi) const { typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; // Early ending with Bbox overlapping test if (! do_bboxes_overlap(cv1, cv2)) return oi; @@ -733,7 +731,7 @@ class Arr_segment_traits_2 : public Kernel_ { m_traits.is_in_y_range_2_object()(cv2, *ip) : m_traits.is_in_x_range_2_object()(cv2, *ip)); Intersection_point ip_mult(*ip, 1); - *oi++ = Intersection_result(ip_mult); + *oi++ = ip_mult; return oi; } @@ -754,7 +752,7 @@ class Arr_segment_traits_2 : public Kernel_ { // a common endpoint. Thus we have an intersection point, but we leave // the multiplicity of this point undefined. Intersection_point ip_mult(p_r, 0); - *oi++ = Intersection_result(ip_mult); + *oi++ = ip_mult; return oi; } @@ -765,17 +763,17 @@ class Arr_segment_traits_2 : public Kernel_ { // in the overlap segment if (cv1.is_directed_right()) { X_monotone_curve_2 overlap_seg(cv1.line(), p_l, p_r); - *oi++ = Intersection_result(overlap_seg); + *oi++ = overlap_seg; return oi; } X_monotone_curve_2 overlap_seg(cv1.line(), p_r, p_l); - *oi++ = Intersection_result(overlap_seg); + *oi++ = overlap_seg; return oi; } // cv1 and cv2 have opposite directions, the overlap segment // will be directed from left to right X_monotone_curve_2 overlap_seg(cv1.line(), p_l, p_r); - *oi++ = Intersection_result(overlap_seg); + *oi++ = overlap_seg; return oi; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h index efdaa8d65d9b..ab14028c0805 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h @@ -57,11 +57,7 @@ class Arr_simple_point_location { typedef Result_type result_type; protected: -#if CGAL_ARR_POINT_LOCATION_VERSION < 2 - typedef Result_type Optional_result_type; -#else typedef typename std::optional Optional_result_type; -#endif typedef typename Topology_traits::Dcel Dcel; typedef Arr_traits_basic_adaptor_2 Traits_adaptor_2; @@ -71,13 +67,8 @@ class Arr_simple_point_location { const Traits_adaptor_2* m_geom_traits; // Its associated geometry traits. const Topology_traits* m_topol_traits; // Its associated topology traits. -#if CGAL_ARR_POINT_LOCATION_VERSION < 2 - inline bool optional_empty(const CGAL::Object& obj) const { return obj.empty(); } - inline const Result_type& optional_assign(const CGAL::Object& t) const { return t; } -#else inline bool optional_empty(const std::optional& t) const { return (!t); } inline const Result_type& optional_assign(const std::optional& t) const { return *t; } -#endif template Result_type make_result(T t) const { return Result::make_result(t); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h index a042f80a5845..f9f587347382 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_gaussian_map_3/Arr_spherical_gaussian_map_3.h @@ -161,7 +161,7 @@ class Arr_sgm_initializer { make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); - const auto* xc = std::get(&(*it)); + const auto* xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "1.a. insert_in_face_interior(" << *xc << ")" << std::endl; #endif @@ -172,7 +172,7 @@ class Arr_sgm_initializer { ++it; if (it == x_objects.end()) return oi; - xc = std::get(&(*it)); + xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "1.b. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -202,7 +202,7 @@ class Arr_sgm_initializer { make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); - const auto* xc = std::get(&(*it)); + const auto* xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "2.a. insert_from_vertex(" << *xc << ", " << vertex1->point() << ")" << std::endl; @@ -216,7 +216,7 @@ class Arr_sgm_initializer { ++it; if (it == x_objects.end()) return oi; - xc = std::get(&(*it)); + xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "2.b. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -247,7 +247,7 @@ class Arr_sgm_initializer { auto it = x_objects.begin(); if (x_objects.size() == 1) { - const auto* xc = std::get(&(*it)); + const auto* xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "3. insert_from_vertex(" << *xc << ")" << std::endl; #endif @@ -258,8 +258,8 @@ class Arr_sgm_initializer { return oi; } - const X_monotone_curve_2* xc1 = std::get(&(*it++)); - const X_monotone_curve_2* xc2 = std::get(&(*it)); + const X_monotone_curve_2* xc1 = std::get_if(&(*it++)); + const X_monotone_curve_2* xc2 = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "3.a. insert_from_vertex(" << *xc2 << ")" << std::endl; @@ -300,7 +300,7 @@ class Arr_sgm_initializer { make_x_monotone(normal1, normal2, std::back_inserter(x_objects)); auto it = x_objects.begin(); if (x_objects.size() == 1) { - const auto* xc = std::get(&(*it)); + const auto* xc = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "4. insert_at_vertices(" << *xc << ")" << std::endl; #endif @@ -308,8 +308,8 @@ class Arr_sgm_initializer { return oi; } - const X_monotone_curve_2 * xc1 = std::get(&(*it++)); - const X_monotone_curve_2 * xc2 = std::get(&(*it)); + const X_monotone_curve_2 * xc1 = std::get_if(&(*it++)); + const X_monotone_curve_2 * xc2 = std::get_if(&(*it)); #if CGAL_ARR_SPHERICAL_GAUSSIAN_MAP_3_DEBUG==1 std::cout << "4.a. insert_from_vertex(" << *xc1 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 4778a4fe9131..66dd1834a8c8 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 @@ -635,6 +635,7 @@ class Arr_tracing_traits_2 : public Base_traits { const X_monotone_curve_2* xcv = std::get_if(&item); if (xcv != nullptr) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; + *oi++ = *xcv; continue; } @@ -642,12 +643,11 @@ class Arr_tracing_traits_2 : public Base_traits { if (ip != nullptr) { std::cout << " result[" << i++ << "]: p: " << ip->first << ", multiplicity: " << ip->second << std::endl; + *oi++ = *ip; continue; } } - for (auto it = container.begin(); it != container.end(); ++it) *oi++ = *it; - container.clear(); return oi; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h index a26e51a1e4ba..8fe1efa48c79 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h @@ -1469,13 +1469,13 @@ class Intersect_2 : // point-wise intersections std::vector arcs; if (cv1._trim_if_overlapped(cv2, std::back_inserter(arcs))) { - for (const auto& item : arcs) *oi++ = Intersection_result(item); + for (const auto& item : arcs) *oi++ = item; return oi; } // process non-ov erlapping case std::vector vec; Arc_2::_intersection_points(cv1, cv2, std::back_inserter(vec)); - for (const auto& item : vec) *oi++ = Intersection_result(item); + for (const auto& item : vec) *oi++ = item; return oi; } diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h index 6b7628a05193..eedde5108af7 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h @@ -901,12 +901,7 @@ bool Point_location_test::attach_pl_strategies() template bool Point_location_test::perform() { -#if ((CGAL_ARR_POINT_LOCATION_VERSION < 2) || \ - defined(CGAL_ARR_POINT_LOCATION_CONVERSION)) - Objects_vector objs[NUM_PL_STRATEGIES]; -#else Variants_vector objs[NUM_PL_STRATEGIES]; -#endif // Locate the points in the list using all point location strategies. diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake index 898b96445fee..783ba994ab88 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test.cmake @@ -706,15 +706,6 @@ function(test_point_location_segments) compile_and_run_with_flags(test_point_location segments "${flags}" segments) endfunction() -# For backward compatibility -function(test_point_location_segments_version) - set(nt ${CGAL_GMPQ_NT}) - set(kernel ${CARTESIAN_KERNEL}) - set(geom_traits ${SEGMENT_GEOM_TRAITS}) - set(flags "-DTEST_NT=${nt} -DTEST_KERNEL=${kernel} -DTEST_GEOM_TRAITS=${geom_traits} -DCGAL_ARR_POINT_LOCATION_VERSION=1") - compile_and_run_with_flags(test_point_location segments "${flags}" segments_version) -endfunction() - # For backward compatibility function(test_point_location_segments_conversion) set(nt ${CGAL_GMPQ_NT}) @@ -1366,7 +1357,6 @@ test_overlay_segments() test_overlay_spherical_arcs() test_point_location_segments() -test_point_location_segments_version() test_point_location_segments_conversion() test_point_location_circle_segments() test_point_location_linear() diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake index ee92d955c823..4d62ce617774 100755 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/cgal_test_with_cmake @@ -911,16 +911,6 @@ test_point_location_segments() compile_and_run_with_flags test_point_location segments "$flags" } -# For backward compatibility -test_point_location_segments_version() -{ - local nt=$CGAL_GMPQ_NT; - local kernel=$CARTESIAN_KERNEL; - local geom_traits=$SEGMENT_GEOM_TRAITS; - local flags="-DTEST_NT=$nt -DTEST_KERNEL=$kernel -DTEST_GEOM_TRAITS=$geom_traits -DCGAL_ARR_POINT_LOCATION_VERSION=1"; - compile_and_run_with_flags test_point_location segments "$flags" -} - # For backward compatibility test_point_location_segments_conversion() { @@ -1706,7 +1696,6 @@ test_overlay_segments test_overlay_spherical_arcs test_point_location_segments -test_point_location_segments_version test_point_location_segments_conversion test_point_location_circle_segments test_point_location_linear diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h index d5372d0be793..06606b659151 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h @@ -162,9 +162,6 @@ class Gps_agg_meta_traits : Intersection_base_point; typedef std::variant Intersection_base_result; - typedef const std::pair Intersection_point; - typedef std::variant - Intersection_result; const auto* base_traits = m_traits.m_base_traits; auto base_cmp_xy = base_traits->compare_xy_2_object(); @@ -187,7 +184,7 @@ class Gps_agg_meta_traits : if (base_pt != nullptr) { Point_2 point_plus(base_pt->first); // the extended point *oi++ = - Intersection_result(std::make_pair(point_plus, base_pt->second)); + std::make_pair(point_plus, base_pt->second); continue; } @@ -214,7 +211,7 @@ class Gps_agg_meta_traits : Curve_data cv_data(cv1.data().arr(), Halfedge_handle(), ov_bc, ov_twin_bc); - *oi++ = Intersection_result(X_monotone_curve_2(*overlap_cv, cv_data)); + *oi++ = X_monotone_curve_2(*overlap_cv, cv_data); } return oi; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h index 0776b8336130..24b69369a43a 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_simplifier_traits.h @@ -135,9 +135,6 @@ class Gps_simplifier_traits : Intersection_base_point; typedef std::variant Intersection_base_result; - typedef const std::pair Intersection_point; - typedef std::variant - Intersection_result; const auto* base_traits = m_traits.m_base_traits; auto base_cmp_xy = base_traits->compare_xy_2_object(); @@ -175,7 +172,7 @@ class Gps_simplifier_traits : Point_data pt_data(m_traits.invalid_index()); Point_2 point_plus(base_pt->first, pt_data); // the extended point *oi++ = - Intersection_result(std::make_pair(point_plus, base_pt->second)); + std::make_pair(point_plus, base_pt->second); continue; } @@ -202,7 +199,7 @@ class Gps_simplifier_traits : } Curve_data cv_data(ov_bc, ov_twin_bc, m_traits.invalid_index()); - *oi++ = Intersection_result(X_monotone_curve_2(*overlap_cv, cv_data)); + *oi++ = X_monotone_curve_2(*overlap_cv, cv_data); } return oi; diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h index 433a6a4949c0..4e17e189b114 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h @@ -116,9 +116,7 @@ class Envelope_divide_and_conquer_2 { // Subdivide the curves into x-monotone subcurves. CurvesIterator it; - std::list objects; - std::list::iterator obj_it; - X_monotone_curve_2 xcv; + std::list> objects; std::list x_curves; for (it = begin; it != end; it++) @@ -127,10 +125,10 @@ class Envelope_divide_and_conquer_2 objects.clear(); traits->make_x_monotone_2_object()(*it, std::back_inserter(objects)); - for (obj_it = objects.begin(); obj_it != objects.end(); ++obj_it) + for (auto obj_it = objects.begin(); obj_it != objects.end(); ++obj_it) { - if(CGAL::assign (xcv, *obj_it)) - x_curves.push_back (xcv); + if(const X_monotone_curve_2* xcv_ptr = std::get_if(&(*obj_it))) + x_curves.push_back (*xcv_ptr); } } diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h index f813f8ccc9a5..657bb0168ea0 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h @@ -630,9 +630,7 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, // Find the next intersection of the envelopes to the right of the current // rightmost point in the merged diagram. - // \todo Use the faster object_cast. - std::list objects; - CGAL::Object obj; + std::list> objects; const X_monotone_curve_2* intersection_curve; const Intersection_point* intersection_point; @@ -641,10 +639,10 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, while (! objects.empty()) { // Pop the xy-lexicographically smallest intersection object. - obj = objects.front(); + auto obj = objects.front(); objects.pop_front(); - if ((intersection_point = CGAL::object_cast(&obj)) != + if ((intersection_point = std::get_if(&obj)) != nullptr) { // We have a simple intersection point. @@ -725,7 +723,7 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, else { // We have an x-monotone curve representing an overlap of the two // curves. - intersection_curve = CGAL::object_cast(&obj); + intersection_curve = std::get_if(&obj); if (intersection_curve == nullptr) CGAL_error_msg("unrecognized intersection object."); diff --git a/Envelope_3/include/CGAL/Env_plane_traits_3.h b/Envelope_3/include/CGAL/Env_plane_traits_3.h index 1bf7f790a10b..85fbbf161be3 100644 --- a/Envelope_3/include/CGAL/Env_plane_traits_3.h +++ b/Envelope_3/include/CGAL/Env_plane_traits_3.h @@ -47,7 +47,6 @@ class Env_plane_traits_3 : public Arr_linear_traits_2 typedef typename Kernel::Ray_2 Ray_2; typedef typename Kernel::Line_2 Line_2; typedef typename Kernel::Line_3 Line_3; - typedef typename Kernel::Object_3 Object_3; typedef std::pair Intersection_curve; typedef typename Base::Left_side_category Left_side_category; @@ -326,8 +325,8 @@ class Env_plane_traits_3 : public Arr_linear_traits_2 const Plane_3& h = s.plane(); Line_2 proj_line(h.a(), h.b(), h.d()); - *o++ = make_object(std::make_pair(X_monotone_curve_2(proj_line), - ON_ORIENTED_BOUNDARY)); + *o++ = std::make_pair(X_monotone_curve_2(proj_line), + ON_ORIENTED_BOUNDARY); return o; } @@ -339,7 +338,7 @@ class Env_plane_traits_3 : public Arr_linear_traits_2 Oriented_side side = (res == SMALLER) ? ON_POSITIVE_SIDE : ON_NEGATIVE_SIDE; - *o++ = make_object(std::make_pair(X_monotone_curve_2(s.line()), side)); + *o++ = std::make_pair(X_monotone_curve_2(s.line()), side); return o; } }; @@ -369,11 +368,10 @@ class Env_plane_traits_3 : public Arr_linear_traits_2 { Line_2 l1(h1.a(), h1.b(), h1.d()); Line_2 l2(h2.a(), h2.b(), h2.d()); - Object obj = k.intersect_2_object()(l1, l2); + auto obj = k.intersect_2_object()(l1, l2); - Point_2 p; - if(assign(p, obj)) - *o++ = make_object(p); + if(const Point_2* p = std::get_if(&(*obj))) + *o++ = *p; // otherwise, the vertical planes are parallel or overlap, so we return // nothing. @@ -382,90 +380,82 @@ class Env_plane_traits_3 : public Arr_linear_traits_2 if(s1.is_all_plane() && s2.is_all_plane()) { - Object obj = k.intersect_3_object()(h1, h2); - Line_3 l; - if(assign(l, obj)) - *o++ = make_object(Intersection_curve(project_xy(l, k), 1)); + auto obj = k.intersect_3_object()(h1, h2); + CGAL_assertion(obj != std::nullopt); + if(const Line_3* l = std::get_if(&(*obj))) + *o++ = Intersection_curve(project_xy(*l, k), 1); return o; } if(s1.is_all_plane() && !s2.is_all_plane()) { - Object obj = plane_half_plane_proj_intersection(h1, - h2, - s2.line(), - k); - if(obj.is_empty()) + auto obj = plane_half_plane_proj_intersection(h1, + h2, + s2.line(), + k); + if(obj ==std::nullopt) return o; - Line_2 temp_l; - if(assign(temp_l, obj)) + if(const Line_2* line = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(temp_l, 1)); + *o++ = Intersection_curve(*line, 1); return o; } - Ray_2 ray; - if(assign(ray, obj)) + if(const Ray_2* ray = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(ray, 1)); + *o++ = Intersection_curve(*ray, 1); return o; } return o; } if(!s2.is_all_plane() && s2.is_all_plane()) { - Object obj = plane_half_plane_proj_intersection(h2, - h1, - s1.line(), - k); - if(obj.is_empty()) + auto obj = plane_half_plane_proj_intersection(h2, + h1, + s1.line(), + k); + if(obj == std::nullopt) return o; - Line_2 line; - if(assign(line, obj)) + if(const Line_2* line = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(line, 1)); + *o++ = Intersection_curve(*line, 1); return o; } - Ray_2 ray; - if(assign(ray, obj)) + if(const Ray_2* ray = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(ray, 1)); + *o++ = Intersection_curve(*ray, 1); return o; } return o; - } CGAL_assertion(!s2.is_all_plane() && !s2.is_all_plane()); - Object obj = + auto obj = half_plane_half_plane_proj_intersection(h1, s1.line(), h2, s2.line(), k); - if(obj.is_empty()) + if(obj ==std::nullopt ) return o; - Line_2 line; - if(assign(line, obj)) + + if(const Line_2* line = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(line, 1)); + *o++ = Intersection_curve(*line, 1); return o; } - Ray_2 ray; - if(assign(ray, obj)) + if(const Ray_2* ray = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(ray, 1)); + *o++ = Intersection_curve(*ray, 1); return o; } - Segment_2 seg; - if(assign(seg, obj)) + if(const Segment_2* seg = std::get_if(&(*obj))) { - *o++ = make_object(Intersection_curve(seg, 1)); + *o++ = Intersection_curve(*seg, 1); return o; } - Point_2 p; - if(assign(p, obj)) + if(const Point_2* p = std::get_if(&(*obj))) { - *o++ = make_object(p); + *o++ = *p; return o; } return o; diff --git a/Envelope_3/include/CGAL/Env_sphere_traits_3.h b/Envelope_3/include/CGAL/Env_sphere_traits_3.h index 9dcfa59fe5cd..bec2a5b72a94 100644 --- a/Envelope_3/include/CGAL/Env_sphere_traits_3.h +++ b/Envelope_3/include/CGAL/Env_sphere_traits_3.h @@ -18,7 +18,6 @@ #include -#include #include #include #include @@ -109,28 +108,28 @@ class Env_sphere_traits_3 : public ConicTraits_2 { Rat_point_2 proj_center = parent.project(s.center()); Rat_circle_2 circ(proj_center, s.squared_radius()); Curve_2 curve = gt_2->construct_curve_2_object()(circ); - Object objs[2]; - CGAL_assertion_code(Object *p = ) + typedef std::variant Variant; + Variant objs[2]; + + CGAL_assertion_code(Variant* p = ) parent.make_x_monotone_2_object()(curve, objs); CGAL_assertion(p == objs + 2); - X_monotone_curve_2 cv1, cv2; - - CGAL_assertion(assign(cv1, objs[0])); - CGAL_assertion(assign(cv2, objs[1])); + const X_monotone_curve_2* cv1 = std::get_if(&(objs[0])); + const X_monotone_curve_2* cv2 = std::get_if(&(objs[1])); - assign(cv1, objs[0]); - assign(cv2, objs[1]); + CGAL_assertion(cv1!=nullptr); + CGAL_assertion(cv2!=nullptr); - if (cv1.is_lower()) { - CGAL_assertion(cv2.is_upper()); - *o++ = make_object(std::make_pair(cv1, ON_POSITIVE_SIDE)); - *o++ = make_object(std::make_pair(cv2, ON_NEGATIVE_SIDE)); + if (cv1->is_lower()) { + CGAL_assertion(cv2->is_upper()); + *o++ = std::make_pair(*cv1, ON_POSITIVE_SIDE); + *o++ = std::make_pair(*cv2, ON_NEGATIVE_SIDE); } else { - CGAL_assertion(cv2.is_lower()); - *o++ = make_object(std::make_pair(cv1, ON_NEGATIVE_SIDE)); - *o++ = make_object(std::make_pair(cv2, ON_POSITIVE_SIDE)); + CGAL_assertion(cv2->is_lower()); + *o++ = std::make_pair(*cv1, ON_NEGATIVE_SIDE); + *o++ = std::make_pair(*cv2, ON_POSITIVE_SIDE); } return o; @@ -237,7 +236,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { if (n_ys == 1) { // intersection is a point Point_2 inter_point(xs , ys[0]); - *o++ = make_object(inter_point); + *o++ = inter_point; return o; } @@ -254,7 +253,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { Curve_2 res = ctr_cv(0, 0, 0, 2*a_diff, 0, -m, COLLINEAR, end1, end2); parent.add_curve_to_output(res, o); - //*o++ = make_object(Intersection_curve(res, TRANSVERSAL)); + //*o++ = Intersection_curve(res, TRANSVERSAL); } else { // here we have c1 == c2, b1 != b2. @@ -308,7 +307,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { if (n_xs == 1) { // intersection is a point Point_2 inter_point(xs[0], (-2*a_diff*xs[0] + m)/(2*b_diff) ); - *o++ = make_object(inter_point); + *o++ = inter_point; return o; } @@ -328,7 +327,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { Curve_2 res = ctr_cv(0,0,0, 2*a_diff, 2*b_diff, -m, COLLINEAR, end1, end2); parent.add_curve_to_output(res, o); - //*o++ = make_object(Intersection_curve(res, TRANSVERSAL)); + //*o++ = Intersection_curve(res, TRANSVERSAL); } } // now the potential intersection is (a part of) a circle, @@ -439,7 +438,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { // should check if the point is in the non-negative side of the // line if (CGAL_NTS sign(la*px + lb*py +lc) != NEGATIVE) - *o++ = make_object(Point_2(px, py)); + *o++ = Point_2(px, py); return o; } @@ -460,7 +459,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { if (sign_lc != NEGATIVE) { Curve_2 res = ctr_cv(R, S, T, U, V, W); parent.add_curve_to_output(res, o); - //*o++ = make_object(Intersection_curve(res, TRANSVERSAL)); + //*o++ = Intersection_curve(res, TRANSVERSAL); } return o; } @@ -609,13 +608,13 @@ class Env_sphere_traits_3 : public ConicTraits_2 { if (lval_sign == POSITIVE) { // the full ellipse is in the positive side parent.add_curve_to_output(inter_cv, o); - //*o++ = make_object(Intersection_curve(inter_cv, TRANSVERSAL)); + //*o++ = Intersection_curve(inter_cv, TRANSVERSAL); return o; } else if (lval_sign == NEGATIVE) { // the full ellipse is in the negative side, except maybe the point // source in the case n_inter_points = 1 (which lies on the line) - if (n_inter_points == 1) *o++ = make_object(Point_2(source)); + if (n_inter_points == 1) *o++ = Point_2(source); return o; } @@ -630,8 +629,8 @@ class Env_sphere_traits_3 : public ConicTraits_2 { CGAL_assertion(lval_sign != ZERO); if (lval_sign == POSITIVE) parent.add_curve_to_output(inter_cv, o); - //*o++ = make_object(Intersection_curve(inter_cv, TRANSVERSAL)); - else *o++ = make_object(Point_2(source)); + //*o++ = Intersection_curve(inter_cv, TRANSVERSAL); + else *o++ = Point_2(source); return o; } @@ -651,7 +650,7 @@ class Env_sphere_traits_3 : public ConicTraits_2 { Curve_2 res = ctr_cv(R, S, T, U, V, W, orient, source, target); CGAL_assertion(res.is_valid()); parent.add_curve_to_output(res, o); - //*o++ = make_object(Intersection_curve(res, TRANSVERSAL)); + //*o++ = Intersection_curve(res, TRANSVERSAL); } return o; @@ -1118,16 +1117,16 @@ class Env_sphere_traits_3 : public ConicTraits_2 { template OutputIterator add_curve_to_output(const Curve_2& c, OutputIterator oi) const { - Object objs[2]; - Object* p_obj = this->make_x_monotone_2_object()(c, objs); - for(Object* o = objs; o != p_obj; ++o) { - X_monotone_curve_2 cv; - if(assign(cv, *o)) *oi++ = make_object(Intersection_curve(cv, 1)); + std::variant objs[2]; + + std::variant* p_obj = this->make_x_monotone_2_object()(c, objs); + for(std::variant* o = objs; o != p_obj; ++o) { + if(const X_monotone_curve_2* cv = std::get_if(o)) + *oi++ = Intersection_curve(*cv, 1); else { - Point_2 pt; - CGAL_assertion(assign(pt, *o)); - assign(pt, *o); - *oi++ = make_object(pt); + const Point_2* pt = std::get_if(o); + CGAL_assertion(pt!=nullptr); + *oi++ = *pt; } } return oi; diff --git a/Envelope_3/include/CGAL/Env_tracing_traits_3.h b/Envelope_3/include/CGAL/Env_tracing_traits_3.h index 06171831a1a1..471299a7484b 100644 --- a/Envelope_3/include/CGAL/Env_tracing_traits_3.h +++ b/Envelope_3/include/CGAL/Env_tracing_traits_3.h @@ -194,14 +194,15 @@ class Env_tracing_traits_3 : public Traits_ Base base; std::cerr << "Construct_projected_boundary_2: JUST FIRST" << std::endl; std::cerr << "Surface: " << s << std::endl; - std::list l; + // TODO UPDATE CONCEPT + CHANGES.md + std::list< std::variant, Point_2 > > l; base.construct_projected_boundary_2_object() (s, std::back_inserter(l)); if (l.size() > 0) { - std::pair i; - if (CGAL::assign(i, l.front())) - std::cerr << "First: " << i.first << std::endl; + if (const std::pair* i = + std::get_if>(&l.front())) + std::cerr << "First: " << i->first << std::endl; else std::cerr << "First intersection is a point" << std::endl; } @@ -232,15 +233,14 @@ class Env_tracing_traits_3 : public Traits_ << std::endl; std::cerr << "Surface1: " << s1 << std::endl; std::cerr << "Surface2: " << s2 << std::endl; - std::list l; + std::list< std::variant > l; base.construct_projected_intersections_2_object() (s1, s2, std::back_inserter(l)); if (l.size() > 0) { - Intersection_curve i; - if (CGAL::assign(i, l.front())) - std::cerr << "First: " << i.first << std::endl; + if (const Intersection_curve* i = std::get_if(&l.front())) + std::cerr << "First: " << i->first << std::endl; else std::cerr << "First intersection is not a point" << std::endl; } diff --git a/Envelope_3/include/CGAL/Env_triangle_traits_3.h b/Envelope_3/include/CGAL/Env_triangle_traits_3.h index 3587d9224154..00ccc69e8faf 100644 --- a/Envelope_3/include/CGAL/Env_triangle_traits_3.h +++ b/Envelope_3/include/CGAL/Env_triangle_traits_3.h @@ -20,8 +20,6 @@ #include - -#include #include #include #include @@ -546,9 +544,9 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 s2 != ON_ORIENTED_BOUNDARY && s3 != ON_ORIENTED_BOUNDARY); - *o++ = make_object(std::make_pair(A, s1)); - *o++ = make_object(std::make_pair(B, s2)); - *o++ = make_object(std::make_pair(C, s3)); + *o++ = std::make_pair(A, s1); + *o++ = std::make_pair(B, s2); + *o++ = std::make_pair(C, s3); } else { @@ -561,8 +559,8 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 b2 = parent->project(a2); CGAL_assertion(b1 != b2); - *o++ = make_object(std::make_pair(X_monotone_curve_2(b1, b2), - ON_ORIENTED_BOUNDARY)); + *o++ = std::make_pair(X_monotone_curve_2(b1, b2), + ON_ORIENTED_BOUNDARY); } return o; } @@ -611,32 +609,30 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 return o; } - Object inter_obj = parent->intersection(s1,s2); - if (inter_obj.is_empty()) + std::optional> inter_obj + = parent->intersection(s1,s2); + if (inter_obj == std::nullopt) { return o; } - Point_3 point; - Segment_3 curve; - if (k.assign_3_object()(point, inter_obj)) - *o++ = make_object(parent->project(point)); + if (const Point_3* point = std::get_if(&(*inter_obj))) + *o++ = parent->project(*point); else { - CGAL_assertion_code(bool b = ) - k.assign_3_object()(curve, inter_obj); - CGAL_assertion(b); + const Segment_3* curve = std::get_if(&(*inter_obj)); + CGAL_assertion(curve != nullptr); - Segment_2 proj_seg = parent->project(curve); + Segment_2 proj_seg = parent->project(*curve); if (! k.is_degenerate_2_object() (proj_seg)) { Intersection_curve inter_cv (proj_seg, 1); - *o++ = make_object(inter_cv); + *o++ = inter_cv; } else { const Point_2& p = k.construct_point_on_2_object() (proj_seg, 0); - *o++ = make_object(p); + *o++ = p; } } @@ -1044,8 +1040,9 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 // intersect two xy-monotone surfaces (3D-triangles or segments) // if the triangles overlap, the result is empty // the result can be a segment or a point - Object intersection(const Xy_monotone_surface_3& s1, - const Xy_monotone_surface_3& s2) const + std::optional< std::variant> + intersection(const Xy_monotone_surface_3& s1, + const Xy_monotone_surface_3& s2) const { CGAL_precondition(s1.is_xy_monotone()); CGAL_precondition(s2.is_xy_monotone()); @@ -1054,14 +1051,13 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 // first, try to intersect the bounding boxes of the triangles, // efficiently return empty object when the triangles are faraway if (!CGAL::do_overlap(s1.bbox(), s2.bbox())) - return Object(); + return std::nullopt; // if intersecting two segment - alculate the intersection // as in the case of dimension 2 if (s1.is_segment() && s2.is_segment()) { - Object res = intersection_of_segments(s1, s2); - return res; + return intersection_of_segments(s1, s2); } // if both triangles lie on the same (non-vertical) plane, they overlap @@ -1070,96 +1066,92 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 Plane_3 p1 = s1.plane(); Plane_3 p2 = s2.plane(); if (p1 == p2 || p1 == p2.opposite()) - return Object(); + return std::nullopt; // calculate intersection between a triangle and the other triangle's // supporting plane // if there is no intersection - then the triangles have no intersection // between them. - Object inter_obj = intersection(p1, s2); + auto inter_obj = intersection(p1, s2); - if (inter_obj.is_empty()) - return Object(); + if (inter_obj == std::nullopt) + return std::nullopt; // otherwise, if the intersection in a point, we should check if it lies // inside the first triangle - Assign_3 assign_obj = k.assign_3_object(); - Point_3 inter_point; - if (assign_obj(inter_point, inter_obj)) + if (const Point_3* inter_point = std::get_if(&(*inter_obj))) { - Object res = intersection_on_plane_3(p1, s1, inter_point); - return res; + std::optional res = intersection_on_plane_3(p1, s1, *inter_point); + if (res != std::nullopt) + return res.value(); } else { // if the intersection is a segment, we check the intersection of the // other plane-triangle pair - Segment_3 inter_seg; - CGAL_assertion(assign_obj(inter_seg, inter_obj)); - assign_obj(inter_seg, inter_obj); + const Segment_3* inter_seg = std::get_if(&(*inter_obj)); + CGAL_assertion(inter_seg != nullptr); - inter_obj = intersection(p2, s1); + auto inter_obj2 = intersection(p2, s1); // if there is no intersection - then the triangles have no intersection // between them. - if (inter_obj.is_empty()) - return Object(); + if (inter_obj2 == std::nullopt) + return std::nullopt; - if (assign_obj(inter_point, inter_obj)) + if (const Point_3* inter_point = std::get_if(&(*inter_obj2))) { - // if the intersection is a point, which lies on the segment, - // than it is the result, - // otherwise, empty result - if (k.has_on_3_object()(inter_seg, inter_point)) - return make_object(inter_point); - else - return Object(); + // if the intersection is a point, which lies on the segment, + // than it is the result, + // otherwise, empty result + if (k.has_on_3_object()(*inter_seg, *inter_point)) + return *inter_point; + else + return std::nullopt; } else { - // both plane-triangle intersections are segments, which are collinear, - // and lie on the line which is the intersection of the two supporting - // planes - Segment_3 inter_seg2; - CGAL_assertion(assign_obj(inter_seg2, inter_obj)); - assign_obj(inter_seg2, inter_obj); - - Point_3 min1 = k.construct_min_vertex_3_object()(inter_seg), - max1 = k.construct_max_vertex_3_object()(inter_seg); - Point_3 min2 = k.construct_min_vertex_3_object()(inter_seg2), - max2 = k.construct_max_vertex_3_object()(inter_seg2); - - CGAL_assertion((k.collinear_3_object()(min1, min2, max1) && + // both plane-triangle intersections are segments, which are collinear, + // and lie on the line which is the intersection of the two supporting + // planes + const Segment_3* inter_seg2 = std::get_if(&(*inter_obj)); + CGAL_assertion(inter_seg2 != nullptr); + + Point_3 min1 = k.construct_min_vertex_3_object()(*inter_seg), + max1 = k.construct_max_vertex_3_object()(*inter_seg); + Point_3 min2 = k.construct_min_vertex_3_object()(*inter_seg2), + max2 = k.construct_max_vertex_3_object()(*inter_seg2); + + CGAL_assertion((k.collinear_3_object()(min1, min2, max1) && k.collinear_3_object()(min1, max2, max1))); - // we need to find the overlapping part, if exists - Point_3 min, max; - if (k.less_xyz_3_object()(min1, min2)) - min = min2; - else - min = min1; - if (k.less_xyz_3_object()(max1, max2)) - max = max1; - else - max = max2; - - Object res; - Comparison_result comp_res = k.compare_xyz_3_object()(min, max); - if (comp_res == EQUAL) - res = make_object(min); - else if (comp_res == SMALLER) - res = make_object(Segment_3(min, max)); - // else - empty result - - return res; + // we need to find the overlapping part, if exists + Point_3 min, max; + if (k.less_xyz_3_object()(min1, min2)) + min = min2; + else + min = min1; + if (k.less_xyz_3_object()(max1, max2)) + max = max1; + else + max = max2; + + Comparison_result comp_res = k.compare_xyz_3_object()(min, max); + if (comp_res == EQUAL) + return min; + else if (comp_res == SMALLER) + return Segment_3(min, max); + // else - empty result } } + return std::nullopt; } // calculate intersection between triangle & point on the same plane plane - Object intersection_on_plane_3(const Plane_3& plane, - const Xy_monotone_surface_3& triangle, - const Point_3& point) const + std::optional + intersection_on_plane_3(const Plane_3& plane, + const Xy_monotone_surface_3& triangle, + const Point_3& point) const { Kernel k; CGAL_precondition( triangle.is_xy_monotone() ); @@ -1177,14 +1169,15 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 else has_on = k.has_on_3_object()(static_cast(triangle), point); if (has_on) - return make_object(point); + return point; else - return Object(); + return std::nullopt; } // calculate intersection between 2 segments on the same vertical plane plane - Object intersection_of_segments(const Xy_monotone_surface_3& s1, - const Xy_monotone_surface_3& s2) const + std::optional< std::variant> + intersection_of_segments(const Xy_monotone_surface_3& s1, + const Xy_monotone_surface_3& s2) const { Kernel k; CGAL_precondition( s1.is_xy_monotone() && s1.is_segment()); @@ -1193,14 +1186,14 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 // if the segments are not coplanar, they cannot intersect if (!k.coplanar_3_object()(s1.vertex(0), s1.vertex(1), s2.vertex(0), s2.vertex(1))) - return Object(); + return std::nullopt; const Plane_3& plane = s1.plane(); if (s2.plane() != plane && s2.plane() != plane.opposite()) // todo: this case is not needed in the algorithm, // so we don't implement it - return Object(); + return std::nullopt; CGAL_precondition( !k.is_degenerate_3_object()(plane) ); CGAL_precondition( s2.plane() == plane || @@ -1212,30 +1205,24 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 v2 = plane.to_2d(s1.vertex(1)); Segment_2 seg1_t(v1, v2); - Point_2 u1 = plane.to_2d(s2.vertex(0)), + Point_2 u1 = plane.to_2d(s2.vertex(0)), u2 = plane.to_2d(s2.vertex(1)); - Segment_2 seg2_t(u1, u2); + Segment_2 seg2_t(u1, u2); - Object inter_obj = k.intersect_2_object()(seg1_t, seg2_t); - Assign_2 assign_2 = k.assign_2_object(); - if (inter_obj.is_empty()) - return inter_obj; + auto inter_obj = k.intersect_2_object()(seg1_t, seg2_t); + if (inter_obj == std::nullopt) + return std::nullopt; - Point_2 inter_point; - Segment_2 inter_segment; - - if (assign_2(inter_point, inter_obj)) - return make_object(plane.to_3d(inter_point)); + if (const Point_2* inter_point = std::get_if(&(*inter_obj))) + return plane.to_3d(*inter_point); else { - CGAL_assertion_code(bool b = ) - assign_2(inter_segment, inter_obj); - CGAL_assertion(b); - - return make_object - (Segment_3 - (plane.to_3d(k.construct_vertex_2_object()(inter_segment, 0)), - plane.to_3d(k.construct_vertex_2_object()(inter_segment, 1)))); + const Segment_2* inter_segment = std::get_if(&(*inter_obj)); + CGAL_assertion(inter_segment!=nullptr); + + return Segment_3 + (plane.to_3d(k.construct_vertex_2_object()(*inter_segment, 0)), + plane.to_3d(k.construct_vertex_2_object()(*inter_segment, 1))); } } @@ -1244,8 +1231,9 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 // and a (non degenerate) plane in 3d // the result object can be empty, a point, a segment or the original // triangle - Object intersection(const Plane_3& pl, - const Xy_monotone_surface_3& tri) const + std::optional> + intersection(const Plane_3& pl, + const Xy_monotone_surface_3& tri) const { Kernel k; CGAL_precondition( tri.is_xy_monotone() ); @@ -1278,24 +1266,23 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 points_on_plane[n_points_on_plane++] = i; } - CGAL_assertion(n_points_on_plane + - n_points_on_positive + n_points_on_negative == 3); + CGAL_assertion(n_points_on_plane + n_points_on_positive + n_points_on_negative == 3); // if all vertices of tri lie on the same size (positive/negative) of pl, // there is no intersection if (n_points_on_positive == 3 || n_points_on_negative == 3) - return Object(); + return std::nullopt; // if all vertices of tri lie on pl then we return tri if (n_points_on_plane == 3) - return make_object(tri); + return tri; // if 2 vertices lie on pl, then return the segment between them if (n_points_on_plane == 2) { int point_idx1 = points_on_plane[0], point_idx2 = points_on_plane[1]; - return make_object (Segment_3(tri.vertex(point_idx1), - tri.vertex(point_idx2))); + return Segment_3(tri.vertex(point_idx1), + tri.vertex(point_idx2)); } // if only 1 lie on pl, should check the segment opposite to it on tri @@ -1306,7 +1293,7 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 // if the other 2 vertices are on the same side of pl, // then the answer is just this vertex if (n_points_on_negative == 2 || n_points_on_positive == 2) - return make_object(tri.vertex(point_on_plane_idx)); + return tri.vertex(point_on_plane_idx); // now it is known that one vertex is on pl, and the segment of tri // opposite to it should intersect pl @@ -1315,15 +1302,14 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 Segment_3 tri_segment(tri.vertex(point_on_plane_idx+1), tri.vertex(point_on_plane_idx+2)); - Object inter_result = k.intersect_3_object()(pl, tri_segment); - Point_3 inter_point; - CGAL_assertion( k.assign_3_object()(inter_point, inter_result) ); - k.assign_3_object()(inter_point, inter_result); + auto inter_result = k.intersect_3_object()(pl, tri_segment); + const Point_3* inter_point = std::get_if(&(*inter_result)); + CGAL_assertion( inter_point != nullptr ); // create the resulting segment // (between tri[point_on_plane_idx] and inter_point) - return make_object(Segment_3(tri.vertex(point_on_plane_idx), - inter_point)); + return Segment_3(tri.vertex(point_on_plane_idx), + *inter_point); } @@ -1341,16 +1327,14 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 { Segment_3 seg(tri.vertex(points_on_positive[pos_it]), tri.vertex(points_on_negative[neg_it])); - Object inter_result = k.intersect_3_object()(pl, seg); - Point_3 inter_point; - // the result of the intersection must be a point - CGAL_assertion( k.assign_3_object()(inter_point, inter_result) ); - k.assign_3_object()(inter_point, inter_result); - inter_points[n_inter_points++] = inter_point; + auto inter_result = k.intersect_3_object()(pl, seg); + const Point_3* inter_point = std::get_if(&(*inter_result)); + CGAL_assertion( inter_point != nullptr ); + inter_points[n_inter_points++] = *inter_point; } CGAL_assertion( n_inter_points == 2 ); - return make_object(Segment_3(inter_points[0], inter_points[1])); + return Segment_3(inter_points[0], inter_points[1]); } // compare the value of s1 in p1 to the value of s2 in p2 @@ -1394,13 +1378,12 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 Line_3 vl = k.construct_line_3_object() (point, dir); const Plane_3& plane = s.plane(); - Object res = k.intersect_3_object()(plane, vl); - CGAL_assertion(!res.is_empty()); - Point_3 ip; - CGAL_assertion(k.assign_3_object()(ip, res)); - k.assign_3_object()(ip, res); + auto res = k.intersect_3_object()(plane, vl); + CGAL_assertion(res != std::nullopt); + const Point_3* ip = std::get_if(&(*res)); + CGAL_assertion(ip != nullptr); - return ip; + return *ip; } } @@ -1438,12 +1421,10 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 Line_2 l(tvl_point1, tvl_point2); Segment_2 seg(t1, t2); - Object inter_obj = k.intersect_2_object()(seg, l); - Point_2 inter_point; - CGAL_assertion_code(bool is_inter_point =) - k.assign_2_object()(inter_point, inter_obj); - CGAL_assertion(is_inter_point); - return plane.to_3d(inter_point); + auto inter_obj = k.intersect_2_object()(seg, l); + const Point_2* inter_point = std::get_if(&(*inter_obj)); + CGAL_assertion(inter_point != nullptr); + return plane.to_3d(*inter_point); } Point_2 construct_middle_point(const Point_2& p1, const Point_2& p2) const @@ -1495,14 +1476,11 @@ class Env_triangle_traits_3 : public Arr_segment_traits_2 typename Kernel::Line_2 vl = k.construct_line_2_object() (pt, dir); // Compute the intersetion between the vertical line and the given curve. - Object res = k.intersect_2_object()(seg, vl); - Point_2 ip; - bool ray_shoot_successful = k.assign_2_object()(ip, res); - - if (! ray_shoot_successful) - CGAL_assertion (ray_shoot_successful); + auto res = k.intersect_2_object()(seg, vl); + const Point_2* ip = std::get_if(&(*res)); + CGAL_assertion (ip != nullptr); - return (ip); + return *ip; } }; diff --git a/Envelope_3/include/CGAL/Envelope_3/Env_plane_traits_3_functions.h b/Envelope_3/include/CGAL/Envelope_3/Env_plane_traits_3_functions.h index e0caf43d5cd6..8ca94fb2049e 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Env_plane_traits_3_functions.h +++ b/Envelope_3/include/CGAL/Envelope_3/Env_plane_traits_3_functions.h @@ -16,65 +16,62 @@ #include -#include #include namespace CGAL { template -Object plane_half_plane_proj_intersection(const typename K::Plane_3 &h1, - const typename K::Plane_3 &h2, - const typename K::Line_2 &l, - const K& k) +std::optional< std::variant > +plane_half_plane_proj_intersection(const typename K::Plane_3 &h1, + const typename K::Plane_3 &h2, + const typename K::Line_2 &l, + const K& k) { typedef typename K::Line_3 Line_3; typedef typename K::Line_2 Line_2; typedef typename K::Plane_3 Plane_3; // intersect the two planes - Object h_obj = k.intersect_3_object()(h1, h2); - if(h_obj.is_empty()) - return Object(); // no intersection at all (parallel planes) + auto h_obj = k.intersect_3_object()(h1, h2); + if(h_obj == std::nullopt) + return std::nullopt; // no intersection at all (parallel planes) Plane_3 p; - if(assign(p, h_obj)) - return Object(); + if(std::get_if(&(*h_obj))==nullptr) + return std::nullopt; // if two planes are not parallel they must intersect at a 3D line - Line_3 l3; - CGAL_assertion_code(bool b =) - assign(l3, h_obj); - CGAL_assertion(b); + const Line_3* l3 = std::get_if(&(*h_obj)); + CGAL_assertion(l3!=nullptr); - const Line_2& proj_inter_line = project_xy(l3, k); + const Line_2& proj_inter_line = project_xy(*l3, k); - return line_under_linear_constraint(proj_inter_line, l, k); + return line_under_linear_constraint(proj_inter_line, l, k); //LR } template -Object half_plane_half_plane_proj_intersection(const typename K::Plane_3 &h1, - const typename K::Line_2 &l1, - const typename K::Plane_3 &h2, - const typename K::Line_2 &l2, - const K& k) +std::optional< std::variant > +half_plane_half_plane_proj_intersection(const typename K::Plane_3 &h1, + const typename K::Line_2 &l1, + const typename K::Plane_3 &h2, + const typename K::Line_2 &l2, + const K& k) { typedef typename K::Ray_2 Ray_2; typedef typename K::Line_2 Line_2; - Object obj = plane_half_plane_proj_intersection(h1, h2, l2, k); - if(obj.is_empty()) - return Object(); + auto obj = plane_half_plane_proj_intersection(h1, h2, l2, k); + if(obj == std::nullopt) + return std::nullopt; - Line_2 l; - if(assign(l, obj)) - return line_under_linear_constraint(l, l1, k); + if(const Line_2* line = std::get_if(&(*obj))) + return line_under_linear_constraint(*line, l1, k); - Ray_2 ray; - if(assign(ray, obj)) - return ray_under_linear_constraint(ray, l1, k); + if(const Ray_2* ray = std::get_if(&(*obj))) + return ray_under_linear_constraint(*ray, l1, k); CGAL_error(); // doesn't suppose to reach here - return Object(); + return std::nullopt; } template @@ -97,96 +94,91 @@ typename K::Line_2 project_xy(const typename K::Line_3& l, // l1 is a line, l2 is a linear constraint (determined by the direction // of the line). template -Object line_under_linear_constraint(const typename K::Line_2& l1, - const typename K::Line_2& l2, - const K& k) +std::optional< std::variant > +line_under_linear_constraint(const typename K::Line_2& l1, + const typename K::Line_2& l2, + const K& k) { typedef typename K::Ray_2 Ray_2; - typedef typename K::Line_2 Line_2; typedef typename K::Vector_2 Vector_2; typedef typename K::Point_2 Point_2; - Object obj = k.intersect_2_object()(l1, l2); - Point_2 p; - if(assign(p, obj)) + auto obj = k.intersect_2_object()(l1, l2); + + if(obj == std::nullopt)// the two lines are parallel { - const Vector_2& vec = k.construct_vector_2_object()(l1); - const Point_2& s = k.construct_translated_point_2_object()(p, vec); - const Ray_2& ray = k.construct_ray_2_object()(p, s); + const Point_2& s = k.construct_point_on_2_object()(l1, 0); Oriented_side side = k.oriented_side_2_object()(l2, s); + if(side == ON_NEGATIVE_SIDE) - { - return make_object(k.construct_opposite_ray_2_object()(ray)); - } + return std::nullopt; - CGAL_assertion(side == ON_POSITIVE_SIDE); //the two lines are not parallel - return make_object(ray); + CGAL_assertion(side == ON_POSITIVE_SIDE); // the two lines are parallel + return l1; } - if(obj.is_empty()) // the two lines are parallel + if(const Point_2* p = std::get_if(&(*obj))) { - const Point_2& s = k.construct_point_on_2_object()(l1, 0); + const Vector_2& vec = k.construct_vector_2_object()(l1); + const Point_2& s = k.construct_translated_point_2_object()(*p, vec); + const Ray_2& ray = k.construct_ray_2_object()(*p, s); Oriented_side side = k.oriented_side_2_object()(l2, s); - if(side == ON_NEGATIVE_SIDE) - return Object(); + { + return k.construct_opposite_ray_2_object()(ray); + } - CGAL_assertion(side == ON_POSITIVE_SIDE); // the two lines are parallel - return make_object(l1); + CGAL_assertion(side == ON_POSITIVE_SIDE); //the two lines are not parallel + return ray; } // the two lines overlap - CGAL_USE_TYPE(Line_2); - CGAL_assertion_code(Line_2 dummy;); - CGAL_assertion_code(bool b = assign(dummy, obj);); - CGAL_assertion(b); - - return make_object(l1); + return l1; } template -Object ray_under_linear_constraint(const typename K::Ray_2& ray, - const typename K::Line_2& l, - const K& k) +std::optional< std::variant > +ray_under_linear_constraint(const typename K::Ray_2& ray, + const typename K::Line_2& l, + const K& k) { typedef typename K::Vector_2 Vector_2; typedef typename K::Point_2 Point_2; const Point_2& s = k.construct_point_on_2_object()(ray, 0); Oriented_side side = k.oriented_side_2_object()(l, s); - Object obj = k.intersect_2_object()(ray, l); - if(obj.is_empty()) + auto obj = k.intersect_2_object()(ray, l); + if(obj == std::nullopt) { if(side == ON_NEGATIVE_SIDE) - return Object(); + return std::nullopt; CGAL_assertion(side == ON_POSITIVE_SIDE); - return make_object(ray); + return ray; } - Point_2 p; - if(assign(p, obj)) + if(const Point_2* p = std::get_if(&(*obj))) { if(side == ON_POSITIVE_SIDE) - return make_object(k.construct_segment_2_object()(s, p)); + return k.construct_segment_2_object()(s, *p); Vector_2 vec = k.construct_vector_2_object()(ray); if(side == ON_NEGATIVE_SIDE) - return make_object(k.construct_ray_2_object()(p, vec)); + return k.construct_ray_2_object()(*p, vec); CGAL_assertion(side == ON_ORIENTED_BOUNDARY); const Vector_2& vec_of_l = k.construct_vector_2_object()(l); Orientation orient = k.orientation_2_object()(vec_of_l, vec); if(orient == LEFT_TURN) - return make_object(ray); + return ray; CGAL_assertion(orient == RIGHT_TURN); - return make_object(s); + return s; } // the ray and the line overlap - return make_object(ray); + return ray; } diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h index 35b172c62336..a15422a19d2f 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_divide_and_conquer_3.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -307,9 +306,8 @@ class Envelope_divide_and_conquer_3 void deal_with_one_surface(Xy_monotone_surface_3& surf, Minimization_diagram_2& result) { - typedef std::list Boundary_list; typedef std::pair Boundary_xcurve; - typedef Boundary_list::iterator Boundary_iterator; + typedef std::list> Boundary_list; Boundary_list boundary; m_geom_traits-> @@ -325,17 +323,15 @@ class Envelope_divide_and_conquer_3 return; } - for (Boundary_iterator boundary_it = boundary.begin(); + for (auto boundary_it = boundary.begin(); boundary_it != boundary.end(); ++boundary_it) { - const Object& obj = *boundary_it; - Boundary_xcurve boundary_cv; - if (assign(boundary_cv, obj)) + if (const Boundary_xcurve* boundary_cv = std::get_if(&(*boundary_it))) { - Oriented_side side = boundary_cv.second; + Oriented_side side = boundary_cv->second; Halfedge_handle he = - insert_non_intersecting_curve(result, boundary_cv.first); + insert_non_intersecting_curve(result, boundary_cv->first); if (side == ON_ORIENTED_BOUNDARY) { @@ -408,10 +404,9 @@ class Envelope_divide_and_conquer_3 else { // the xy-surface is an isolated point - Point_2 p; - CGAL_assertion(assign(p, obj)); - assign(p, obj); - insert_point(result, p); + const Point_2* p = std::get_if(&(*boundary_it)); + CGAL_assertion(p!=nullptr); + insert_point(result, *p); } } diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h index 0376a0c11193..e5184ba9a2a7 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_element_visitor_3.h @@ -131,7 +131,8 @@ class Envelope_element_visitor_3 Vertices_to_edges_map; typedef std::pair Intersection_curve; - typedef std::list Intersections_list; + typedef std::list> Intersections_list; // this is used in the resolve edge process typedef Triple Point_2_with_info; @@ -199,7 +200,8 @@ class Envelope_element_visitor_3 // find the projected intersections of the surfaces. if none - we have // a simple case: // need only resolve non-intersecting and return - std::list inter_objs; + std::list> inter_objs; + get_projected_intersections(surf1, surf2, std::back_inserter(inter_objs)); if (inter_objs.size() == 0) @@ -243,11 +245,6 @@ class Envelope_element_visitor_3 map_copied_to_orig_faces[copied_face] = face; - // insert the projected intersections into the temporary minimization diagram - Point_2 point; - Intersection_curve curve; - Object cur_obj; - // we use our zone visitor, which only inserts into the arrangement the // points and curves which are inside the copied face // it updates the result arrangement at the same time (action after action @@ -287,12 +284,10 @@ class Envelope_element_visitor_3 this); Md_point_location pl(copied_face_arr); - std::list::iterator inter_objs_it = inter_objs.begin(); - for (; inter_objs_it != inter_objs.end(); ++inter_objs_it) + for (auto inter_objs_it = inter_objs.begin(); + inter_objs_it != inter_objs.end(); ++inter_objs_it) { - cur_obj = *inter_objs_it; - CGAL_assertion(!cur_obj.is_empty()); - if (assign(point, cur_obj)) + if (const Point_2* point = std::get_if(&(*inter_objs_it))) { // intersection can be a point when the surfaces only touch each other. // we are only interested in the points that are inside the face or @@ -302,12 +297,12 @@ class Envelope_element_visitor_3 // should use observer for split_edge // if not in a sub-face of "face", shouldn't insert it // the above information is available in zone_visitor - insert_point(copied_face_arr, point, pl, zone_visitor); + insert_point(copied_face_arr, *point, pl, zone_visitor); } - else if (assign(curve, cur_obj)) + else if (const Intersection_curve* curve = std::get_if(&(*inter_objs_it))) { - zone_visitor.set_current_intersection_type(curve.second); - insert(copied_face_arr, curve.first, pl, zone_visitor); + zone_visitor.set_current_intersection_type(curve->second); + insert(copied_face_arr, curve->first, pl, zone_visitor); CGAL_assertion(copied_face_arr.is_valid()); CGAL_assertion(result.is_valid()); } @@ -485,7 +480,7 @@ class Envelope_element_visitor_3 const Xy_monotone_surface_3& surf2 = get_aux_surface(edge, 1); // find the projected intersections - std::list inter_objs; + std::list> inter_objs; get_projected_intersections(surf1, surf2, std::back_inserter(inter_objs)); if (inter_objs.size() == 0) @@ -522,48 +517,38 @@ class Envelope_element_visitor_3 bool is_min_end_at_inf = false; bool is_max_end_at_inf = false; - Point_2 point; - Intersection_curve icurve; - Object cur_obj; - - std::list::iterator inter_objs_it = inter_objs.begin(); - for (; inter_objs_it != inter_objs.end(); ++inter_objs_it) + for (auto inter_objs_it = inter_objs.begin(); + inter_objs_it != inter_objs.end(); ++inter_objs_it) { - cur_obj = *inter_objs_it; - CGAL_assertion(!cur_obj.is_empty()); - if (assign(point, cur_obj)) + if (const Point_2* point = std::get_if(&(*inter_objs_it))) { // if the point is on the curve, should add it the split points // list, otherwise, it is irrelevant and should be ignored - if (is_point_on_curve(point, original_cv)) - split_points.push_back(Point_2_with_info(point, false, false)); + if (is_point_on_curve(*point, original_cv)) + split_points.push_back(Point_2_with_info(*point, false, false)); } - else if (assign(icurve, cur_obj)) + else if (const Intersection_curve* icurve = std::get_if(&(*inter_objs_it))) { - const X_monotone_curve_2& x_curve = icurve.first; + const X_monotone_curve_2& x_curve = icurve->first; // find the intersection points and overlapping segments with the // original curve and insert them to the list of split points // intersect the x-monotone curve with the edge's curve typedef std::pair Intersect_point_2; - std::list intersections_list; - const Intersect_point_2* ip; - const X_monotone_curve_2* icv; + std::list> intersections_list; m_traits->intersect_2_object()(x_curve, original_cv, std::back_inserter(intersections_list)); - std::list::iterator inter_it = intersections_list.begin(); - for (; inter_it != intersections_list.end(); ++inter_it) + for (auto inter_it = intersections_list.begin(); inter_it != intersections_list.end(); ++inter_it) { - ip = object_cast(&(*inter_it)); - if (ip != nullptr) + if (const Intersect_point_2* ip = std::get_if(&(*inter_it))) { split_points.push_back(Point_2_with_info(ip->first, false, false)); } else { - icv = object_cast(&(*inter_it)); + const X_monotone_curve_2* icv = std::get_if(&(*inter_it)); CGAL_assertion(icv != nullptr); // we will add the *icv end points to the split_points, unless @@ -791,15 +776,15 @@ class Envelope_element_visitor_3 const Vertex_const_handle* vh; Vertex_handle vh_for_p; - CGAL::Object obj = pl.locate(p); + auto obj = pl.locate(p); visitor.init(&arr); - if ((fh = object_cast(&obj)) + if ((fh = std::get_if(&obj)) != nullptr) { vh_for_p = visitor.found_point_in_face(p, arr.non_const_handle(*fh)); } - else if ((hh = object_cast(&obj)) != nullptr) + else if ((hh = std::get_if(&obj))) { vh_for_p = visitor.found_point_on_edge(p , arr.non_const_handle(*hh)); } @@ -807,7 +792,7 @@ class Envelope_element_visitor_3 { // In this case p lies on an existing vertex, so we just update this // vertex. - vh = object_cast(&obj); + vh = std::get_if(&obj); CGAL_assertion(vh != nullptr); vh_for_p = visitor.found_point_on_vertex(p, arr.non_const_handle(*vh)); } diff --git a/Envelope_3/test/Envelope_3/Envelope_test_3.h b/Envelope_3/test/Envelope_3/Envelope_test_3.h index 997c4aced68f..80656676ca7d 100644 --- a/Envelope_3/test/Envelope_3/Envelope_test_3.h +++ b/Envelope_3/test/Envelope_3/Envelope_test_3.h @@ -18,7 +18,6 @@ #include #include -#include #include #include @@ -116,49 +115,41 @@ class Envelope_test_3 Xy_monotone_surface_3 &cur_surface = surfaces[i]; // first insert all the projected curves of the boundary of the current surface // collect the curve in this list, and use sweepline at the end - std::list boundary_list; typedef std::pair Boundary_xcurve; + std::list> boundary_list; - typedef std::list::const_iterator Boundary_iterator; traits.construct_projected_boundary_2_object()(cur_surface, std::back_inserter(boundary_list)); - for(Boundary_iterator boundary_it = boundary_list.begin(); + for(auto boundary_it = boundary_list.begin(); boundary_it != boundary_list.end(); ++boundary_it) { - const Object& obj = *boundary_it; - Boundary_xcurve boundary_cv; - assert(assign(boundary_cv, obj)); - assign(boundary_cv, obj); - curves_col.push_back(boundary_cv.first); + const Boundary_xcurve* boundary_cv = std::get_if(&(*boundary_it)); + assert(boundary_cv!=nullptr); + curves_col.push_back(boundary_cv->first); } // second, intersect it with all surfaces before it - Object cur_obj; for(j=0; j inter_objs; + std::vector> inter_objs; traits.construct_projected_intersections_2_object()(cur_surface, prev_surface, std::back_inserter(inter_objs)); // we collect all intersections and use sweep to insert them - Point_2 point; - Intersection_curve curve; for(std::size_t k=0; k(&inter_objs[k])) { #ifdef CGAL_DEBUG_ENVELOPE_TEST_3 std::cout << "intersection between surfaces is a point: " << point << std::endl; #endif //insert_vertex(result, point, pl); - points_col.push_back(point); + points_col.push_back(*point); } - else if (CGAL::assign(curve, cur_obj)) + else if (const Intersection_curve* curve = std::get_if(&inter_objs[k])) { - curves_col.push_back(curve.first); + curves_col.push_back(curve->first); /*#ifdef CGAL_DEBUG_ENVELOPE_TEST_3 std::cout << "intersection between surfaces is a curve: " << curve.first << std::endl; #endif diff --git a/Envelope_3/test/Envelope_3/Envelope_triangles_test_3.h b/Envelope_3/test/Envelope_3/Envelope_triangles_test_3.h index 29577fefa43a..194b9fb7a120 100644 --- a/Envelope_3/test/Envelope_3/Envelope_triangles_test_3.h +++ b/Envelope_3/test/Envelope_3/Envelope_triangles_test_3.h @@ -17,7 +17,6 @@ #include #include -#include #include #include @@ -130,48 +129,40 @@ class Envelope_triangles_test_3 { #endif // collect the curve in this list, and use sweepline at the end - std::list boundary_list; typedef std::pair Boundary_xcurve; + std::list> boundary_list; traits.construct_projected_boundary_2_object() (cur_surface, std::back_inserter(boundary_list)); - std::list::const_iterator bit; - for (bit = boundary_list.begin(); bit != boundary_list.end(); ++bit) { - const Object& obj = *bit; - Boundary_xcurve boundary_cv; - assert(assign(boundary_cv, obj)); - assign(boundary_cv, obj); - curves_col.push_back(boundary_cv.first); + for (auto bit = boundary_list.begin(); bit != boundary_list.end(); ++bit) { + const Boundary_xcurve* boundary_cv = std::get_if(&(*bit)); + assert(boundary_cv!=nullptr); + curves_col.push_back(boundary_cv->first); } // second, intersect it with all surfaces before it - Object cur_obj; for (unsigned int j = 0; j < i; ++j) { Xy_monotone_surface_3& prev_surface = surfaces[j]; - std::vector inter_objs; + std::vector> inter_objs; traits.construct_projected_intersections_2_object() (cur_surface, prev_surface, std::back_inserter(inter_objs)); // we collect all intersections and use sweep to insert them - Point_2 point; - Intersection_curve curve; for(std::size_t k=0; k(&inter_objs[k])) { #ifdef CGAL_DEBUG_ENVELOPE_TRIANGLES_TEST_3 std::cout << "intersection between surfaces is a point: " << point << std::endl; #endif //insert_vertex(result, point, pl); - points_col.push_back(point); + points_col.push_back(*point); } - else if (CGAL::assign(curve, cur_obj)) { + else if (const Intersection_curve* curve = std::get_if(&inter_objs[k])) { #ifdef CGAL_DEBUG_ENVELOPE_TRIANGLES_TEST_3 std::cout << "intersection between surfaces is a curve: " << curve.first << std::endl; #endif - curves_col.push_back(curve.first); + curves_col.push_back(curve->first); //insert(result, curve.first, pl); } else @@ -262,20 +253,17 @@ class Envelope_triangles_test_3 { // foreach face in the test envelope, compute a point inside the face, // locate it in the other envelope and compare the surfaces over the 2 faces Md_point_location pl(env); - Object pl_obj; - Face_const_handle pl_fh; - Face_iterator fi = test_env.faces_begin(); bool eq, result = true; for (; fi != test_env.faces_end(); ++fi) { Face_handle fh = fi; if (!fh->is_unbounded()) { Point_2 inside_test = compute_point_inside_face(test_env, fh); - pl_obj = pl.locate(inside_test); + auto pl_obj = pl.locate(inside_test); // faces of env must contain the faces of test - bool located_in_face = assign(pl_fh, pl_obj); - assert(located_in_face); - eq = fh->is_equal_data(pl_fh->begin_data(), pl_fh->end_data()); + const Face_const_handle* pl_fh = std::get_if(&pl_obj); + assert(pl_fh!=nullptr); + eq = fh->is_equal_data((*pl_fh)->begin_data(), (*pl_fh)->end_data()); assert(eq); result &= eq; } diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 3d9dc82938a0..55f5daa8da7c 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -14,6 +14,14 @@ Release date: October 2023 - **Breaking change**: The usage of `boost::optional` has been replaced by `std::optional`. Packages affected are 2D Straight Line Skeleton, 3D Fast Intersection and Distance Computation (AABB Tree), and the Kernel intersection. - **Breaking change**: The usage of `boost::variant` has been replaced by `std::variant`. Packages affected are 2D Arrangements, and the Kernel intersection. +#### 2D Arrangements + +- **Breaking change**: The type of the result of point location queries changed to + `std::variant`. The support for the old macro `CGAL_ARR_POINT_LOCATION_VERSION` + has been removed. + +#### Envelopes of Surfaces in 3D +- ** Breaking change**: Construct_projected_boundary_2 in `EnvelopeTraits_3` is now using `std::variant` instead of `Object` [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h index 1cb47858c429..72a3c3758ac3 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Arr_labeled_traits_2.h @@ -299,9 +299,6 @@ class Arr_labeled_traits_2 : public Traits_ { typedef std::pair Intersection_base_point; typedef std::variant Intersection_base_result; - typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; // In case the curves are adjacent in their curve sequence, we do // not have to compute their intersection (we already know that they @@ -321,8 +318,7 @@ class Arr_labeled_traits_2 : public Traits_ { if (base_pt != nullptr) { // Attach an invalid label to an itersection point. - *oi++ = Intersection_result(std::make_pair(Point_2(base_pt->first), - base_pt->second)); + *oi++ = std::make_pair(Point_2(base_pt->first), base_pt->second); continue; } @@ -331,10 +327,9 @@ class Arr_labeled_traits_2 : public Traits_ { CGAL_assertion(base_xcv != nullptr); // Attach a merged label to the overlapping curve. - *oi++ = - Intersection_result(X_monotone_curve_2(*base_xcv, - X_curve_label(cv1.label(), - cv2.label()))); + *oi++ = X_monotone_curve_2(*base_xcv, + X_curve_label(cv1.label(), + cv2.label())); } return oi; From fb2f2c6642c73b3421860025d736d018e4fd3c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 20 Jun 2023 19:11:00 +0200 Subject: [PATCH 0385/1398] remove Object from Minkowski_sum_2 --- .../CGAL/Arr_circle_segment_traits_2.h | 95 +++++++++---------- .../Minkowski_sum_2/Approx_offset_base_2.h | 26 +++-- .../Minkowski_sum_2/Exact_offset_base_2.h | 22 ++--- 3 files changed, 65 insertions(+), 78 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h index dbb909f1e524..f6fbe6217396 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circle_segment_traits_2.h @@ -584,9 +584,6 @@ class Arr_circle_segment_traits_2 { template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { - typedef std::variant - Make_x_monotone_result; - // Increment the serial number of the curve cv, which will serve as its // unique identifier. unsigned int index = 0; @@ -594,10 +591,10 @@ class Arr_circle_segment_traits_2 { if (cv.orientation() == COLLINEAR) { // The curve is a line segment. - *oi++ = Make_x_monotone_result(X_monotone_curve_2(cv.supporting_line(), - cv.source(), - cv.target(), - index)); + *oi++ = X_monotone_curve_2(cv.supporting_line(), + cv.source(), + cv.target(), + index); return oi; } @@ -608,8 +605,8 @@ class Arr_circle_segment_traits_2 { if (sign_rad == ZERO) { // Create an isolated point. - *oi++ = Make_x_monotone_result(Point_2(circ.center().x(), - circ.center().y())); + *oi++ = Point_2(circ.center().x(), + circ.center().y()); return oi; } @@ -622,59 +619,59 @@ class Arr_circle_segment_traits_2 { CGAL_assertion (n_vpts == 2); // Subdivide the circle into two arcs (an upper and a lower half). - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - vpts[0], vpts[1], - cv.orientation(), - index)); - - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - vpts[1], vpts[0], - cv.orientation(), - index)); + *oi++ = X_monotone_curve_2(circ, + vpts[0], vpts[1], + cv.orientation(), + index); + + *oi++ = X_monotone_curve_2(circ, + vpts[1], vpts[0], + cv.orientation(), + index); } else { // Act according to the number of vertical tangency points. if (n_vpts == 2) { // Subdivide the circular arc into three x-monotone arcs. - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - cv.source(), vpts[0], - cv.orientation(), - index)); - - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - vpts[0], vpts[1], - cv.orientation(), - index)); - - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - vpts[1], - cv.target(), - cv.orientation(), - index)); + *oi++ = X_monotone_curve_2(circ, + cv.source(), vpts[0], + cv.orientation(), + index); + + *oi++ = X_monotone_curve_2(circ, + vpts[0], vpts[1], + cv.orientation(), + index); + + *oi++ = X_monotone_curve_2(circ, + vpts[1], + cv.target(), + cv.orientation(), + index); } else if (n_vpts == 1) { // Subdivide the circular arc into two x-monotone arcs. - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - cv.source(), - vpts[0], - cv.orientation(), - index)); - - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - vpts[0], - cv.target(), - cv.orientation(), - index)); + *oi++ = X_monotone_curve_2(circ, + cv.source(), + vpts[0], + cv.orientation(), + index); + + *oi++ = X_monotone_curve_2(circ, + vpts[0], + cv.target(), + cv.orientation(), + index); } else { CGAL_assertion(n_vpts == 0); // The arc is already x-monotone: - *oi++ = Make_x_monotone_result(X_monotone_curve_2(circ, - cv.source(), - cv.target(), - cv.orientation(), - index)); + *oi++ = X_monotone_curve_2(circ, + cv.source(), + cv.target(), + cv.orientation(), + index); } } diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Approx_offset_base_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Approx_offset_base_2.h index ffbb4e4249fe..8a9ed4a74552 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Approx_offset_base_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Approx_offset_base_2.h @@ -168,12 +168,10 @@ class Approx_offset_base_2 typename Kernel::Orientation_2 f_orient = ker.orientation_2_object(); Traits_2 traits; - std::list xobjs; - std::list::iterator xobj_it; + std::list> xobjs; typename Traits_2::Make_x_monotone_2 f_make_x_monotone = traits.make_x_monotone_2_object(); Curve_2 arc; - X_monotone_curve_2 xarc; do { @@ -517,12 +515,11 @@ class Approx_offset_base_2 // convolution cycle. xobjs.clear(); f_make_x_monotone (arc, std::back_inserter(xobjs)); - for (xobj_it = xobjs.begin(); xobj_it != xobjs.end(); ++xobj_it) { - assign_success = CGAL::assign (xarc, *xobj_it); - CGAL_assertion (assign_success); - CGAL_USE(assign_success); - *oi++ = Labeled_curve_2 (xarc, - X_curve_label (xarc.is_directed_right(), + for (auto xobj_it = xobjs.begin(); xobj_it != xobjs.end(); ++xobj_it) { + const X_monotone_curve_2* xarc = std::get_if(&(*xobj_it)); + CGAL_assertion(xarc!=nullptr); + *oi++ = Labeled_curve_2 (*xarc, + X_curve_label (xarc->is_directed_right(), cycle_id, curve_index++)); } } @@ -571,18 +568,17 @@ class Approx_offset_base_2 xobjs.clear(); f_make_x_monotone (arc, std::back_inserter(xobjs)); - xobj_it = xobjs.begin(); + auto xobj_it = xobjs.begin(); while (xobj_it != xobjs.end()) { - assign_success = CGAL::assign (xarc, *xobj_it); - CGAL_assertion (assign_success); - CGAL_USE(assign_success); + const X_monotone_curve_2* xarc = std::get_if(&(*xobj_it)); + CGAL_assertion (xarc != nullptr); ++xobj_it; bool is_last = (xobj_it == xobjs.end()); - *oi++ = Labeled_curve_2 (xarc, - X_curve_label (xarc.is_directed_right(), + *oi++ = Labeled_curve_2 (*xarc, + X_curve_label (xarc->is_directed_right(), cycle_id, curve_index++, is_last)); } diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Exact_offset_base_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Exact_offset_base_2.h index ca77157ec5c0..2220f1f536e9 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Exact_offset_base_2.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Exact_offset_base_2.h @@ -117,7 +117,7 @@ class Exact_offset_base_2 { Algebraic a, b, c; unsigned int curve_index(0); - std::list xobjs; + std::list> xobjs; Traits_2 traits; auto nt_traits = traits.nt_traits(); @@ -127,8 +127,6 @@ class Exact_offset_base_2 { auto alg_ker = traits.alg_kernel(); auto f_equal = alg_ker->equal_2_object(); - bool assign_success; - do { // Get a circulator for the next vertex (in the proper orientation). if (forward) ++next; @@ -185,13 +183,11 @@ class Exact_offset_base_2 { f_make_x_monotone(arc, std::back_inserter(xobjs)); for (auto xobj_it = xobjs.begin(); xobj_it != xobjs.end(); ++xobj_it) { - X_monotone_curve_2 xarc; - assign_success = CGAL::assign(xarc, *xobj_it); - CGAL_assertion (assign_success); - CGAL_USE(assign_success); + const X_monotone_curve_2* xarc = std::get_if(&(*xobj_it)); + CGAL_assertion (xarc!=nullptr); - *oi++ = Labeled_curve_2(xarc, X_curve_label(xarc.is_directed_right(), - cycle_id, curve_index)); + *oi++ = Labeled_curve_2(*xarc, X_curve_label(xarc->is_directed_right(), + cycle_id, curve_index)); curve_index++; } } @@ -237,15 +233,13 @@ class Exact_offset_base_2 { auto xobj_it = xobjs.begin(); while (xobj_it != xobjs.end()) { - X_monotone_curve_2 xarc; - assign_success = CGAL::assign(xarc, *xobj_it); - CGAL_assertion (assign_success); - CGAL_USE(assign_success); + const X_monotone_curve_2* xarc = std::get_if(&(*xobj_it)); + CGAL_assertion (xarc!=nullptr); ++xobj_it; is_last = (xobj_it == xobjs.end()); - *oi++ = Labeled_curve_2(xarc, X_curve_label(xarc.is_directed_right(), + *oi++ = Labeled_curve_2(*xarc, X_curve_label(xarc->is_directed_right(), cycle_id, curve_index, is_last)); curve_index++; From 9969210023349623cb0d6670b68abd78fc8231f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 21 Jun 2023 11:17:55 +0200 Subject: [PATCH 0386/1398] make is compatible with back inserter --- Boolean_set_operations_2/include/CGAL/General_polygon_2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Boolean_set_operations_2/include/CGAL/General_polygon_2.h b/Boolean_set_operations_2/include/CGAL/General_polygon_2.h index 93469d5e93b5..f43a41e27098 100644 --- a/Boolean_set_operations_2/include/CGAL/General_polygon_2.h +++ b/Boolean_set_operations_2/include/CGAL/General_polygon_2.h @@ -38,6 +38,7 @@ class General_polygon_2 typedef std::list Containter; typedef typename Containter::iterator Curve_iterator; typedef typename Containter::const_iterator Curve_const_iterator; + typedef X_monotone_curve_2 value_type; protected: std::list m_xcurves; From 7d0dd109b3ce554bd62550e59c0865a76d28717b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 21 Jun 2023 11:19:58 +0200 Subject: [PATCH 0387/1398] fix for variant/optional --- STL_Extension/include/CGAL/iterator.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index 95295f89f836..e8651c072939 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -1457,6 +1457,19 @@ class Dispatch_or_drop_output_iterator < std::tuple, std::tuple > template Self& operator=(const T&) { return *this; } + template + Self& operator=(const std::variant< T ... >& t) { + internal::Output_visitor visitor(this); + std::visit(visitor, t); + return *this; + } + + template + Self& operator=(const std::optional< std::variant< T ... > >& t) { + internal::Output_visitor visitor(this); + if(t) std::visit(visitor, *t); + return *this; + } }; From f65aa68bd23f6e26fbbf0966d3c13db2ee00d526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 21 Jun 2023 11:20:31 +0200 Subject: [PATCH 0388/1398] use dispatch_or_drop_output to replace Object --- .../bezier_traits_adapter2.cpp | 12 ++----- .../circle_segment.cpp | 18 ++++------ .../conic_traits_adapter.cpp | 11 ++---- .../Boolean_set_operations_2/set_union.cpp | 16 +++------ .../include/CGAL/IO/Dxf_bsop_reader.h | 34 +++++-------------- 5 files changed, 23 insertions(+), 68 deletions(-) diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/bezier_traits_adapter2.cpp b/Boolean_set_operations_2/examples/Boolean_set_operations_2/bezier_traits_adapter2.cpp index 853340f86d22..d99e287d40b3 100644 --- a/Boolean_set_operations_2/examples/Boolean_set_operations_2/bezier_traits_adapter2.cpp +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/bezier_traits_adapter2.cpp @@ -3,6 +3,7 @@ */ #include +#include #ifndef CGAL_USE_CORE #include @@ -108,22 +109,13 @@ bool read_bezier(char const* aFileName, Bezier_polygon_set& rSet) for (unsigned int k = 0; k < n_curves; ++k) { // Read the current curve and subdivide it into x-monotone subcurves. - std::list x_objs; - std::list::const_iterator xoit; - Bezier_X_monotone_curve xcv; Bezier_traits traits; Bezier_traits::Make_x_monotone_2 make_x_monotone = traits.make_x_monotone_2_object(); Bezier_curve B = read_bezier_curve(in_file, lDoubleFormat); if (B.number_of_control_points() >= 2) { - - make_x_monotone(B, std::back_inserter(x_objs)); - - for (xoit = x_objs.begin(); xoit != x_objs.end(); ++xoit) { - if (CGAL::assign(xcv, *xoit)) - xcvs.push_back(xcv); - } + make_x_monotone(B, CGAL::dispatch_or_drop_output(std::back_inserter(xcvs))); } } diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/circle_segment.cpp b/Boolean_set_operations_2/examples/Boolean_set_operations_2/circle_segment.cpp index 7cf3ec3dc7be..02bf08f58caf 100644 --- a/Boolean_set_operations_2/examples/Boolean_set_operations_2/circle_segment.cpp +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/circle_segment.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -24,22 +25,15 @@ typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2; // Construct a polygon from a circle. Polygon_2 construct_polygon (const Circle_2& circle) { - // Subdivide the circle into two x-monotone arcs. + // Subdivide the circle into two x-monotone arcs and construct the polygon. Traits_2 traits; Curve_2 curve (circle); - std::list objects; - traits.make_x_monotone_2_object() (curve, std::back_inserter(objects)); - assert(objects.size() == 2); - - // Construct the polygon. Polygon_2 pgn; - X_monotone_curve_2 arc; - std::list::iterator iter; - for (iter = objects.begin(); iter != objects.end(); ++iter) { - CGAL::assign (arc, *iter); - pgn.push_back (arc); - } + traits.make_x_monotone_2_object() (curve, + CGAL::dispatch_or_drop_output(std::back_inserter(pgn))); + std::cout << "size: " << pgn.size() << "\n"; + assert(pgn.size() == 2); return pgn; } diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/conic_traits_adapter.cpp b/Boolean_set_operations_2/examples/Boolean_set_operations_2/conic_traits_adapter.cpp index a35c90e29c64..f215b1a5267b 100644 --- a/Boolean_set_operations_2/examples/Boolean_set_operations_2/conic_traits_adapter.cpp +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/conic_traits_adapter.cpp @@ -3,6 +3,7 @@ */ #include +#include #ifndef CGAL_USE_CORE #include @@ -42,14 +43,8 @@ typedef Traits_2::Point_2 Point_2; // sub-arcs and append these sub-arcs as polygon edges. void append_conic_arc(Polygon_2& polygon, const Curve_2& arc) { Conic_traits_2 traits; - std::list objects; - X_monotone_curve_2 xarc; - - traits.make_x_monotone_2_object() (arc, std::back_inserter(objects)); - for (auto it = objects.begin(); it != objects.end(); ++it) { - if (CGAL::assign (xarc, *it)) - polygon.push_back (xarc); - } + traits.make_x_monotone_2_object() (arc, + CGAL::dispatch_or_drop_output(std::back_inserter(polygon))); } int main() { diff --git a/Boolean_set_operations_2/examples/Boolean_set_operations_2/set_union.cpp b/Boolean_set_operations_2/examples/Boolean_set_operations_2/set_union.cpp index cecacc9a107d..8ff0ced217f7 100644 --- a/Boolean_set_operations_2/examples/Boolean_set_operations_2/set_union.cpp +++ b/Boolean_set_operations_2/examples/Boolean_set_operations_2/set_union.cpp @@ -25,22 +25,14 @@ typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2; // Construct a polygon from a circle. Polygon_2 construct_polygon (const Circle_2& circle) { - // Subdivide the circle into two x-monotone arcs. + // Subdivide the circle into two x-monotone arcs and construct the polygon Traits_2 traits; Curve_2 curve (circle); - std::list objects; - traits.make_x_monotone_2_object() (curve, std::back_inserter(objects)); - assert(objects.size() == 2); - - // Construct the polygon. Polygon_2 pgn; - X_monotone_curve_2 arc; - std::list::iterator iter; - for (iter = objects.begin(); iter != objects.end(); ++iter) { - CGAL::assign (arc, *iter); - pgn.push_back (arc); - } + traits.make_x_monotone_2_object() (curve, + CGAL::dispatch_or_drop_output(std::back_inserter(pgn))); + assert(pgn.size() == 2); return pgn; } diff --git a/Boolean_set_operations_2/include/CGAL/IO/Dxf_bsop_reader.h b/Boolean_set_operations_2/include/CGAL/IO/Dxf_bsop_reader.h index 1645afc1354e..986ba9e86e12 100644 --- a/Boolean_set_operations_2/include/CGAL/IO/Dxf_bsop_reader.h +++ b/Boolean_set_operations_2/include/CGAL/IO/Dxf_bsop_reader.h @@ -25,6 +25,7 @@ #include #include #include +#include namespace CGAL { @@ -97,29 +98,19 @@ class Dxf_bsop_reader typename Traits_2::Make_x_monotone_2 make_x_monotone = traits.make_x_monotone_2_object(); typename Dxf_circles_list::iterator circ_it; - CGAL::Object obj_vec[3]; - CGAL::Object *obj_begin = (obj_vec + 0); - CGAL::Object *obj_end; - X_monotone_curve_2 cv1, cv2; for (circ_it = circles.begin(); circ_it != circles.end(); ++circ_it) { // Break the circle into two x-monotone circular arcs. const Dxf_circle_2& dxf_circ = *circ_it; Curve_2 circ (dxf_circ.first, dxf_circ.second); + Circ_polygon_2 pgn; - obj_end = make_x_monotone (circ, obj_begin); - CGAL_assertion(obj_end - obj_begin == 2); - - CGAL::assign(cv1, obj_vec[0]); - CGAL::assign(cv2, obj_vec[1]); + make_x_monotone (circ, + CGAL::dispatch_or_drop_output(std::back_inserter(pgn))); + CGAL_assertion(pgn.size() == 2); - // Generate the corresponding polygon. - Circ_polygon_2 pgn; - pgn.push_back (cv1); - pgn.push_back (cv2); - *pgns = pgn; - ++pgns; + *pgns++ = pgn; } circles.clear(); @@ -131,8 +122,6 @@ class Dxf_bsop_reader typename Dxf_polygon_2::iterator curr, next; Point_2 ps, pt; Circle_2 supp_circ; - std::size_t n_subarcs; - std::size_t i; for (pgn_it = polygons.begin(); pgn_it != polygons.end(); ++pgn_it) { @@ -184,15 +173,8 @@ class Dxf_bsop_reader // Break the arc into x-monotone subarcs (there can be at most // three subarcs) and add them to the polygon. - obj_end = make_x_monotone (circ_arc, obj_begin); - n_subarcs = (obj_end - obj_begin); - CGAL_assertion (n_subarcs <= 3); - - for (i = 0; i < n_subarcs; i++) - { - if (CGAL::assign (cv1, obj_vec[i])) - pgn.push_back (cv1); - } + make_x_monotone (circ_arc, + CGAL::dispatch_or_drop_output(std::back_inserter(pgn))); } else { From c4f4bc4cac82b8226d605cdb72fb713bc0c5ddaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 21 Jun 2023 13:15:56 +0200 Subject: [PATCH 0389/1398] Work on display property plugin (+ heat method) - separated property display and Heat method into two independent plugins - redesigned UIs - added "Largest Angle per face" and "face areas" to the display properties - enable using a selection item to select heat method's source vertices - fixed smallest angle computation - fixed storing wrong display values - fixed applicable() returning true too often - fixed zoom not working for property maps other than the plugin's - fixed zoom not working for simplices other than faces - fixed zoom not working for point sets - fixed color map ignoring the user's color choice - fixed property combobox resetting on pretty much other action - fixed not resetting colors when items are modified - fixed broken connections in the heat method plugin - fixed not actually emitting anything when a list selection is changed - much more stuff --- Polyhedron/demo/Polyhedron/Color_map.h | 32 +- Polyhedron/demo/Polyhedron/MainWindow.cpp | 4 +- .../Polyhedron/Plugins/Display/CMakeLists.txt | 21 +- .../Plugins/Display/Display_property.ui | 448 +-- .../Display/Display_property_plugin.cpp | 2833 +++++++---------- .../Polyhedron/Plugins/Display/Heat_method.ui | 294 ++ .../Plugins/Display/Heat_method_plugin.cpp | 822 +++++ .../PMP/Join_and_split_polyhedra_plugin.cpp | 2 +- Polyhedron/demo/Polyhedron/SMesh_type.h | 10 +- Polyhedron/demo/Polyhedron/Scene.cpp | 97 +- Polyhedron/demo/Polyhedron/Scene.h | 37 +- .../Polyhedron/Scene_surface_mesh_item.cpp | 13 +- .../demo/Polyhedron/include/id_printing.h | 415 ++- .../demo/Polyhedron/triangulate_primitive.h | 320 +- Three/include/CGAL/Three/Scene_interface.h | 1 - Three/include/CGAL/Three/Scene_item.h | 2 +- Three/include/CGAL/Three/Viewer_interface.h | 2 +- 17 files changed, 2982 insertions(+), 2371 deletions(-) create mode 100644 Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method.ui create mode 100644 Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp diff --git a/Polyhedron/demo/Polyhedron/Color_map.h b/Polyhedron/demo/Polyhedron/Color_map.h index a55f0c658d28..150d1424b92f 100644 --- a/Polyhedron/demo/Polyhedron/Color_map.h +++ b/Polyhedron/demo/Polyhedron/Color_map.h @@ -3,13 +3,17 @@ #include -inline QColor generate_color(double h, double s_min = 0.35) +#include +#include + +inline QColor generate_color(double h, + double s_min = 0.35) { - std::size_t s_max=255; - if(h >0.8 && h < 0.95) //span of ugly pink, desaturates make it less garish IMO + std::size_t s_max = 255; + if(h > 0.8 && h < 0.95) // span of ugly pink, desaturates make it less garish IMO s_max = 160; std::size_t s = std::rand() % (s_max-static_cast(s_min*255)) + static_cast(s_min*255); - return QColor::fromHsvF(h,s/255.0,1.0); + return QColor::fromHsvF(h, s/255.0, 1.0); } @@ -22,19 +26,23 @@ compute_color_map(QColor base_color, qreal hue = base_color.hueF(); const qreal step = (static_cast(1)) / nb_of_colors; - qreal h = hue==-1 ? 0 - :hue; - for(unsigned i = 0; i < nb_of_colors; ++i) { - if (h!=-1) h += step; - if ( h > 1 ) { h -= 1; } + qreal h = (hue == -1) ? 0 : hue; + for(std::size_t i=0; i 1) + h -= 1; *out++ = generate_color(h); } + return out; } -inline QColor generate_random_color() { +inline QColor generate_random_color() +{ std::size_t h = static_cast(std::rand() % 360); - return generate_color(h/359.0); + return generate_color(h / 359.0); } -#endif +#endif // _COLOR_MAP_H diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 39c537dea5b0..99c722048ee3 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1440,7 +1440,7 @@ QList MainWindow::getSelectedSceneItemIndices() const void MainWindow::selectionChanged() { scene->setSelectedItemIndex(getSelectedSceneItemIndex()); - scene->setSelectedItemsList(getSelectedSceneItemIndices()); + scene->setSelectedItemIndices(getSelectedSceneItemIndices()); CGAL::Three::Scene_item* item = scene->item(getSelectedSceneItemIndex()); Q_FOREACH(CGAL::QGLViewer* vi, CGAL::QGLViewer::QGLViewerPool()) { @@ -2193,7 +2193,7 @@ void MainWindow::on_actionEraseAll_triggered() QList all_ids; for(int i = 0; i < scene->numberOfEntries(); ++i) all_ids.push_back(i); - scene->setSelectedItemsList(all_ids); + scene->setSelectedItemIndices(all_ids); on_actionErase_triggered(); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt index 6e1c99909175..10b1c254b1e1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/CMakeLists.txt @@ -1,11 +1,16 @@ include(polyhedron_demo_macros) + +qt5_wrap_ui(display_propertyUI_FILES Display_property.ui) +polyhedron_demo_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES} KEYWORDS Viewer) +target_link_libraries(display_property_plugin PUBLIC scene_surface_mesh_item + scene_points_with_normal_item + scene_color_ramp) + if(TARGET CGAL::Eigen3_support) - qt5_wrap_ui( display_propertyUI_FILES Display_property.ui ) - polyhedron_demo_plugin(display_property_plugin Display_property_plugin ${display_propertyUI_FILES} KEYWORDS Viewer) - target_link_libraries(display_property_plugin - PUBLIC - scene_surface_mesh_item - scene_points_with_normal_item - scene_color_ramp - CGAL::Eigen3_support) + qt5_wrap_ui(heat_methodUI_FILES Heat_method.ui) + polyhedron_demo_plugin(heat_method_plugin Heat_method_plugin ${heat_methodUI_FILES} KEYWORDS Viewer) + target_link_libraries(heat_method_plugin PUBLIC scene_surface_mesh_item + scene_selection_item + scene_color_ramp + CGAL::Eigen3_support) endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui index 7a5a19621f42..656ec4827c55 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui @@ -2,26 +2,202 @@ DisplayPropertyWidget + + false + 0 0 - 292 - 508 + 514 + 695 + + + 514 + 695 + + - Property Displaying + Property Display - - - - - - - Qt::ScrollBarAlwaysOff + + + + + + Cantarell + true + + + + Color Item + + + + + + + Property + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + QComboBox::AdjustToContents + + + + Smallest Angle Per Face + + + + + Scaled Jacobian + + + + + Heat Intensity + + + + + Heat Intensity (Intrinsic Delaunay) + + + + + + + + + + + + + Qt::Vertical + + + 20 + 40 + + + + + + + + Color Visualization + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Random colors + + + + + + + + + + + + + + + + + First color + + + + + + + Max color + + + + + + + Color Ramp + + + true + + + + + + + + + + + + + + + + + + + + + Min color + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + true @@ -30,12 +206,12 @@ 0 0 - 127 - 430 + 236 + 397 - - + + RAMP DISPLAYING @@ -46,206 +222,70 @@ - - - - - - - - - - - - - - - - - - - - Colorize - - - - - - - 0 - - - - Ramp - - - - - - Ramp Colors - - - - - - Color Min... - - - - - - - Color Max... - - - - - - - - - - - Map - - - - - - Initial Color... - - - - - - - - - - - Select Source Points - - - true - - - - - - - Zoom - - - - - - Zoom to min - - - - - - - Zoom to max - - - - - - - - - - Ramp Extrema - - - - - - 0.00 - - - - - - - 2.00 - - - - - - - - - - false - - - Delete Group - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QComboBox::AdjustToContents - - + + + + false + + + Extreme Values + + + + - Smallest Angle Per Face + Min Value - - + + + + - Scaled Jacobian + Max Value - - + + + + - Heat Intensity + 2.00 + + + true - - + + + + - Heat Intensity (Intrinsic Delaunay) + Zoom to max value - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + + Zoom to min value + + + + + + + 0.00 + + + true + + + true + + + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index af1eef9e115c..5924212cb398 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -1,400 +1,148 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "Scene_points_with_normal_item.h" +#include "ui_Display_property.h" -#include "Messages_interface.h" -#include "Scene_surface_mesh_item.h" -#include "Color_ramp.h" #include "Color_map.h" -#include "ui_Display_property.h" +#include "Color_ramp.h" #include "id_printing.h" +#include "Messages_interface.h" + #include "Scene.h" +#include "Scene_surface_mesh_item.h" +#include "Scene_points_with_normal_item.h" #include "triangulate_primitive.h" -#include -#include -#include -#include -#include - -#define ARBITRARY_DBL_MIN 1.0E-30 -#define ARBITRARY_DBL_MAX 1.0E+30 - - - -//Item for heat values -typedef CGAL::Three::Triangle_container Tri; -typedef CGAL::Three::Viewer_interface VI; - -class Scene_heat_item - : public CGAL::Three::Scene_item_rendering_helper -{ - Q_OBJECT - -public: - Scene_heat_item(Scene_surface_mesh_item* item) - :sm(item->face_graph()), parent(item) - { - setTriangleContainer(0, new Triangle_container(VI::PROGRAM_HEAT_INTENSITY, - true)); - setRenderingMode(Gouraud); - } - Scene_item* clone() const Q_DECL_OVERRIDE {return nullptr;} - QString toolTip() const Q_DECL_OVERRIDE{return QString(); } - void select(double orig_x, - double orig_y, - double orig_z, - double dir_x, - double dir_y, - double dir_z) Q_DECL_OVERRIDE - { - parent->select( orig_x, orig_y, orig_z, - dir_x, dir_y, dir_z); - } - - void initializeBuffers(CGAL::Three::Viewer_interface *viewer) const Q_DECL_OVERRIDE - { - getTriangleContainer(0)->initializeBuffers(viewer); - getTriangleContainer(0)->setIdxSize(nb_idx); - verts.resize(0); - normals .resize(0); - colors.resize(0); - idx.clear(); - idx.shrink_to_fit(); - colors.shrink_to_fit(); - verts.shrink_to_fit(); - normals.shrink_to_fit(); - } - - void draw(CGAL::Three::Viewer_interface *viewer) const Q_DECL_OVERRIDE - { - if(!visible()) - return; - if(!isInit(viewer)) - initGL(viewer); - if ( getBuffersFilled() && - ! getBuffersInit(viewer)) - { - initializeBuffers(viewer); - setBuffersInit(viewer, true); - } - if(!getBuffersFilled()) - { - computeElements(); - initializeBuffers(viewer); - } - - getTriangleContainer(0)->setAlpha(1.0f); - getTriangleContainer(0)->draw(viewer, false); - } - void compute_bbox() const Q_DECL_OVERRIDE - { - SMesh::Property_map pprop = sm->points(); - CGAL::Bbox_3 bbox ; - - for(vertex_descriptor vd :vertices(*sm)) - { - bbox = bbox + pprop[vd].bbox(); - } - _bbox = Bbox(bbox.xmin(),bbox.ymin(),bbox.zmin(), - bbox.xmax(),bbox.ymax(),bbox.zmax()); - is_bbox_computed = true; - } - Scene_item::Bbox bbox() const Q_DECL_OVERRIDE { - if(!is_bbox_computed) - compute_bbox(); - is_bbox_computed = true; - return _bbox; - } - - ~Scene_heat_item(){} - virtual bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE { return m==Gouraud; } - virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE - { - - setBuffersFilled(false); - compute_bbox(); - getTriangleContainer(0)->reset_vbos(NOT_INSTANCED); - is_bbox_computed = false; - } - void triangulate_convex_facet(face_descriptor fd, - boost::property_map< SMesh, boost::vertex_index_t >::type *im) const - { - const CGAL::qglviewer::Vec v_offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); - EPICK::Vector_3 offset = EPICK::Vector_3(v_offset.x, v_offset.y, v_offset.z); - EPICK::Point_3 p0,p1,p2; - SMesh::Halfedge_around_face_circulator he(halfedge(fd, *sm), *sm); - SMesh::Halfedge_around_face_circulator he_end = he; - - while(next(*he, *sm) != prev(*he_end, *sm)) - { - ++he; - vertex_descriptor v0(target(*he_end, *sm)), - v1(target(*he, *sm)), - v2(target(next(*he, *sm), *sm)); - p0 = sm->point(v0) + offset; - p1 = sm->point(v1) + offset; - p2 = sm->point(v2) + offset; - idx.push_back((*im)[v0]); - idx.push_back((*im)[v1]); - idx.push_back((*im)[v2]); - } - } - void triangulate_facet(face_descriptor fd, - SMesh::Property_map *fnormals, - boost::property_map< SMesh, boost::vertex_index_t >::type *im) const - { - //Computes the normal of the facet - EPICK::Vector_3 normal = get(*fnormals, fd); +#include +#include +#include +#include +#include - //check if normal contains NaN values - if (normal.x() != normal.x() || normal.y() != normal.y() || normal.z() != normal.z()) - { - qDebug()<<"Warning : normal is not valid. Facet not displayed"; - return; - } +#include +#include +#include +#include +#include - typedef FacetTriangulator::vertex_descriptor> FT; - const CGAL::qglviewer::Vec off = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); - EPICK::Vector_3 offset(off.x,off.y,off.z); - FT triangulation(fd,normal,sm, offset); - //iterates on the internal faces - for(FT::CDT::Finite_faces_iterator - ffit = triangulation.cdt->finite_faces_begin(), - end = triangulation.cdt->finite_faces_end(); - ffit != end; ++ffit) - { - if(ffit->info().is_external) - continue; - //add the vertices to the positions - //adds the vertices, normals and colors to the appropriate vectors - //adds the indices to the appropriate vector - idx.push_back((*im)[triangulation.v2v[ffit->vertex(0)]]); - idx.push_back((*im)[triangulation.v2v[ffit->vertex(1)]]); - idx.push_back((*im)[triangulation.v2v[ffit->vertex(2)]]); - } - } +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include - void computeElements() const Q_DECL_OVERRIDE - { - typedef EPICK::Point_3 Point; - QApplication::setOverrideCursor(Qt::WaitCursor); - const CGAL::qglviewer::Vec o = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); - EPICK::Vector_3 offset(o.x, o.y, o.z); - SMesh::Property_map positions = - sm->points(); - SMesh::Property_map vnormals = - sm->property_map("v:normal").first; - SMesh::Property_map fnormals = - sm->property_map("f:normal").first; - typedef boost::graph_traits::face_descriptor face_descriptor; - typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef boost::graph_traits::vertex_descriptor vertex_descriptor; - SMesh::Property_map vcolors = - sm->property_map("v:color").first; - SMesh::Property_map vdist= - sm->property_map("v:dist").first; - typedef CGAL::Buffer_for_vao CPF; - verts.clear(); - normals.clear(); - idx.clear(); - colors.clear(); - boost::property_map< SMesh, boost::vertex_index_t >::type - im = get(boost::vertex_index, *sm); - - idx.reserve(num_faces(*sm) * 3); - for(face_descriptor fd : faces(*sm)) - { - if(is_triangle(halfedge(fd,*sm),*sm)) - { - for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, *sm),*sm)) - { - idx.push_back(source(hd, *sm)); - } - } - else - { - std::vector facet_points; - for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, *sm),*sm)) - { - facet_points.push_back(positions[target(hd, *sm)]); - } - bool is_convex = CPF::is_facet_convex(facet_points, fnormals[fd]); +#include +#include - if(is_convex && is_quad(halfedge(fd,*sm),*sm) ) - { - halfedge_descriptor hd = halfedge(fd,*sm); - //1st half - idx.push_back(source(hd, *sm)); - idx.push_back(source(next(hd, *sm), *sm)); - idx.push_back(source(next(next(hd, *sm), *sm), *sm)); - - //2nd half - idx.push_back(source(hd, *sm)); - idx.push_back(source(next(next(hd, *sm), *sm), *sm)); - idx.push_back(source(prev(hd, *sm), *sm)); - } - else if(is_convex) - { - triangulate_convex_facet(fd, &im); - } - else - { - triangulate_facet(fd, &fnormals, &im); - } - } - } - for(vertex_descriptor vd : vertices(*sm)) - { - CGAL::IO::Color c = vcolors[vd]; - colors.push_back((float)c.red()/255); - colors.push_back((float)c.green()/255); - colors.push_back((float)c.blue()/255); +#include +#include +#include +#define ARBITRARY_DBL_MIN 1.0E-17 +#define ARBITRARY_DBL_MAX 1.0E+17 - Point p = positions[vd] + offset; - CPF::add_point_in_buffer(p, verts); - EPICK::Vector_3 n = vnormals[vd]; - CPF::add_normal_in_buffer(n, normals); - heat_values.push_back(vdist[vd]); - } - nb_idx = idx.size(); - getTriangleContainer(0)->allocate(Tri::Vertex_indices, idx.data(), - static_cast(idx.size()*sizeof(unsigned int))); - getTriangleContainer(0)->allocate(Tri::Smooth_vertices, verts.data(), - static_cast(num_vertices(*sm)*3*sizeof(float))); - - getTriangleContainer(0)->allocate(Tri::Smooth_normals, normals.data(), - static_cast(num_vertices(*sm)*3*sizeof(float))); - getTriangleContainer(0)->allocate(Tri::VColors, colors.data(), - static_cast(colors.size()*sizeof(float))); - getTriangleContainer(0)->allocate(Tri::Distances, heat_values.data(), - static_cast(heat_values.size()*sizeof(float))); - compute_bbox(); - setBuffersFilled(true); - QApplication::restoreOverrideCursor(); - } +using namespace CGAL::Three; - bool isEmpty() const Q_DECL_OVERRIDE {return false;} - SMesh *face_graph() { return sm;} - Scene_surface_mesh_item* getParent() { return parent; } +Viewer_interface* (&getActiveViewer)() = Three::activeViewer; -private: - SMesh* sm; - Scene_surface_mesh_item* parent; - mutable std::vector normals; - mutable std::vector idx; - mutable std::vector verts; - mutable std::vector colors; - mutable std::vector heat_values; - mutable std::size_t nb_idx; -}; // end class Scene_heat_item - -class DockWidget : - public QDockWidget, +class DockWidget + : public QDockWidget, public Ui::DisplayPropertyWidget { public: - DockWidget(QString name, QWidget *parent) - :QDockWidget(name,parent) + DockWidget(const QString& name, QWidget *parent) + : QDockWidget(name, parent) { setupUi(this); } }; -typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; -typedef boost::graph_traits::face_descriptor face_descriptor; -CGAL::Three::Viewer_interface* (&getActiveViewer)() = CGAL::Three::Three::activeViewer; -class DisplayPropertyPlugin : - public QObject, - public CGAL::Three::Polyhedron_demo_plugin_helper +class Display_property_plugin + : public QObject, + public Polyhedron_demo_plugin_helper { Q_OBJECT Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") - typedef SMesh::Property_map::vertex_descriptor, double> Vertex_distance_map; - typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; - typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method_idt; - typedef CGAL::dynamic_vertex_property_t Vertex_source_tag; - typedef boost::property_map::type Vertex_source_map; -public: +private: + QAction* actionDisplayProperties; + + DockWidget* dock_widget; + + // coloring choice and legend + double rm = 1.; + double gm = 0.; + double bm = 0.; + double rM = 0.; + double gM = 1.; + double bM = 0.; + double rI = 0.; + double gI = 1.; + double bI = 0.; - bool applicable(QAction* action) const Q_DECL_OVERRIDE + Color_ramp color_ramp; + std::vector color_map; + QPixmap legend; + + // tracks whether property 'i' (aka i-th in propertyBox) applies to vertices or faces + enum class Property_simplex_type { VERTEX, FACE }; + std::vector property_simplex_types; + + enum Extremum { - CGAL::Three::Scene_item* item = scene->item(scene->mainSelectionIndex()); - if(action == _actions.back()) - return qobject_cast(item); - else - return qobject_cast(item) - || qobject_cast(item); - } + MIN_VALUE, + MAX_VALUE + }; - QList actions() const Q_DECL_OVERRIDE +public: + bool applicable(QAction*) const Q_DECL_OVERRIDE { - return _actions; + Scene_item* item = scene->item(scene->mainSelectionIndex()); + if(!item) + return false; + + return qobject_cast(item) || + qobject_cast(item); } - QColor textColor(const QColor& color) + QList actions() const Q_DECL_OVERRIDE { - QColor text_color (255, 255, 255); - if (color.red() * 0.299 + color.green() * 0.587 + color.blue() * 0.114 > 128) - text_color = QColor (0, 0, 0); - return text_color; + return QList() << actionDisplayProperties; } - void init(QMainWindow* mw, CGAL::Three::Scene_interface* sc, Messages_interface*) Q_DECL_OVERRIDE + void init(QMainWindow* mw, + Scene_interface* sc, + Messages_interface*) Q_DECL_OVERRIDE { this->scene = sc; this->mw = mw; - this->current_item = nullptr; - - QAction *actionDisplayProperties= new QAction(QString("Display Properties"), mw); - QAction *actionHeatMethod= new QAction(QString("Heat Method"), mw); - actionHeatMethod->setProperty("submenuName", "Color"); - - rm = 1.0; - rM = 0.0; - gm = 0.0; - gM = 1.0; - bm = 0.0; - bM = 0.0; + + // Main action + actionDisplayProperties = new QAction(QString("Display Properties"), mw); actionDisplayProperties->setProperty("submenuName", "Color"); - if(actionDisplayProperties) { - connect(actionDisplayProperties, SIGNAL(triggered()), - this, SLOT(openDialog())); - if(actionHeatMethod) - { - connect(actionHeatMethod, &QAction::triggered, - this, [this](){ - this->dock_widget->propertyBox->setCurrentIndex(2); - this->dock_widget->show(); - }); - } - _actions << actionDisplayProperties; - _actions << actionHeatMethod; + connect(actionDisplayProperties, SIGNAL(triggered()), + this, SLOT(openDialog())); - } - dock_widget = new DockWidget("Property Displaying", mw); - dock_widget->setVisible(false); + Scene* scene_item = static_cast(scene); + connect(scene_item, SIGNAL(itemIndexSelected(int)), + this, SLOT(onItemIndexSelected(int))); + + // Dock Widget + dock_widget = new DockWidget("Property Display", mw); addDockWidget(dock_widget); + + dock_widget->setVisible(false); + dock_widget->setEnabled(false); + + connect(dock_widget->propertyBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(onNewPropertySelected(int))); + QPalette palette(Qt::red); dock_widget->minColorButton->setPalette(palette); dock_widget->minColorButton->setStyle(QStyleFactory::create("Fusion")); @@ -410,1288 +158,1066 @@ class DisplayPropertyPlugin : dock_widget->initColorButton->setStyle(QStyleFactory::create("Fusion")); dock_widget->initColorButton->update(); - connect(dock_widget->colorizeButton, SIGNAL(clicked(bool)), - this, SLOT(colorize())); + displayRampLegend(); - connect(dock_widget->propertyBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(on_propertyBox_currentIndexChanged(int))); - connect(dock_widget->zoomToMinButton, &QPushButton::pressed, - this, &DisplayPropertyPlugin::on_zoomToMinButton_pressed); - connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, - this, &DisplayPropertyPlugin::on_zoomToMaxButton_pressed); - connect(dock_widget->minColorButton, &QPushButton::pressed, - this, [this]() - { - QColor minColor = QColorDialog::getColor(); - if (!minColor.isValid()) - { - return; - } + // lambda to generate the three connect(), for each color button (min, max, map) + auto connect_color_buttons = [this](QPushButton* colorButton, + double& r, double& g, double& b) + { + connect(colorButton, &QPushButton::pressed, + this, [this, colorButton, &r, &g, &b]() + { + QColor color = QColorDialog::getColor(); + if(!color.isValid()) + return; - rm = minColor.redF(); - gm = minColor.greenF(); - bm = minColor.blueF(); - QPalette palette(minColor); - dock_widget->minColorButton->setPalette(palette); - dock_widget->minColorButton->update(); - replaceRamp(); - }); - connect(dock_widget->maxColorButton, &QPushButton::pressed, - this, [this]() - { - QColor maxColor = QColorDialog::getColor(); - if(!maxColor.isValid()) - return; - QPalette palette(maxColor); - rM = maxColor.redF(); - gM = maxColor.greenF(); - bM = maxColor.blueF(); - - dock_widget->maxColorButton->setPalette(palette); - dock_widget->maxColorButton->update(); - replaceRamp(); - }); - - connect(dock_widget->initColorButton, &QPushButton::pressed, - this, [this]() - { - QColor initColor = QColorDialog::getColor(); - if (!initColor.isValid()) - { - return; - } + r = color.redF(); + g = color.greenF(); + b = color.blueF(); - QPalette palette(initColor); - rI = initColor.redF(); - gI = initColor.greenF(); - bI = initColor.blueF(); - dock_widget->initColorButton->setPalette(palette); - dock_widget->initColorButton->update(); - }); + QPalette palette(color); + colorButton->setPalette(palette); + colorButton->update(); - connect(dock_widget->sourcePointsButton, SIGNAL(toggled(bool)), - this, SLOT(on_sourcePointsButton_toggled(bool))); - connect(dock_widget->deleteButton, &QPushButton::clicked, - this, &DisplayPropertyPlugin::delete_group); + displayLegend(); + }); + }; - dock_widget->zoomToMaxButton->setEnabled(false); - dock_widget->zoomToMinButton->setEnabled(false); - Scene* scene_obj =static_cast(scene); - connect(scene_obj, SIGNAL(itemIndexSelected(int)), - this,SLOT(enableButtons(int))); - connect(scene_obj, SIGNAL(itemIndexSelected(int)), - this,SLOT(detectScalarProperties(int))); + connect_color_buttons(dock_widget->minColorButton, rm, gm, bm); + connect_color_buttons(dock_widget->maxColorButton, rM, gM, bM); + connect_color_buttons(dock_widget->initColorButton, rI, gI, bI); - on_propertyBox_currentIndexChanged(0); + displayLegend(); + connect(dock_widget->colorizeButton, SIGNAL(clicked(bool)), + this, SLOT(colorize())); + connect(dock_widget->zoomToMinButton, &QPushButton::pressed, + this, &Display_property_plugin::on_zoomToMinButton_pressed); + connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, + this, &Display_property_plugin::on_zoomToMaxButton_pressed); } -private: - void detectSMScalarProperties(SMesh* smesh) +private Q_SLOTS: + void openDialog() { - std::vector vprop = smesh->properties(); - std::vector fprop = smesh->properties(); - for(auto s : vprop) - if(is_property_scalar(s, smesh)) - { - dock_widget->propertyBox->addItem(s.c_str()); - } - for(auto s : fprop) - if(is_property_scalar(s, smesh)) - { - dock_widget->propertyBox->addItem(s.c_str()); - } + if(!dock_widget->isVisible()) + dock_widget->show(); + dock_widget->raise(); } - void detectPSScalarProperties(Point_set* ps) + void closure() Q_DECL_OVERRIDE { - for(auto s : ps->properties()) - if(is_property_scalar(s, ps)) - { - dock_widget->propertyBox->addItem(s.c_str()); - } + dock_widget->hide(); } -private Q_SLOTS: - void detectScalarProperties(int i) - { - for(int j = dock_widget->propertyBox->count(); j>=0; --j) - dock_widget->propertyBox->removeItem(j); - - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(i)); - Scene_points_with_normal_item* p_item = - qobject_cast(scene->item(i)); - if(sm_item) - { - dock_widget->propertyBox->addItem("Smallest Angle Per Face"); - dock_widget->propertyBox->addItem("Scaled Jacobian"); - dock_widget->propertyBox->addItem("Heat Intensity"); - dock_widget->propertyBox->addItem("Heat Intensity (Intrinsic Delaunay)"); - detectSMScalarProperties(sm_item->face_graph()); - - } - else if(p_item) - { - detectPSScalarProperties(p_item->point_set()); - } - int width = dock_widget->propertyBox->minimumSizeHint().width(); - dock_widget->propertyBox->view()->setMinimumWidth(width); +private: + void disableExtremeValues() + { + dock_widget->extremeValuesGroup->setEnabled(false); + dock_widget->zoomToMinButton->setEnabled(false); + dock_widget->zoomToMaxButton->setEnabled(false); } - void openDialog() + void enableExtremeValues() { - if(dock_widget->isVisible()) { dock_widget->hide(); } - else{ - dock_widget->show(); - dock_widget->raise(); } + dock_widget->extremeValuesGroup->setEnabled(true); + dock_widget->zoomToMinButton->setEnabled(true); + dock_widget->zoomToMaxButton->setEnabled(true); } - void colorizePS(Scene_points_with_normal_item* ps_item) + void resetExtremeValues() { - ps_item->point_set()->add_colors(); - if(!treat_point_property(dock_widget->propertyBox->currentText().toStdString(), ps_item->point_set())) + // setup some dummy values such that the legend can be displayed + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); + + if(property_name == "Smallest Angle Per Face" || property_name == "Largest Angle Per Face") { - QApplication::restoreOverrideCursor(); - return; + dock_widget->minBox->setRange(0, 360); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(0, 360); + dock_widget->maxBox->setValue(0); } - ps_item->setPointsMode(); - ps_item->invalidateOpenGLBuffers(); - ps_item->itemChanged(); - } - void colorize() - { - Scene_points_with_normal_item* p_item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(p_item) + else if(property_name == "Scaled Jacobian") { - colorizePS(p_item); - return; + dock_widget->minBox->setRange(-1000, 1000); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-1000, 1000); + dock_widget->maxBox->setValue(0); } - Scene_heat_item* h_item = nullptr; - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(!sm_item) + else if(property_name == "Face Area") { - h_item = qobject_cast(scene->item(scene->mainSelectionIndex())); - if(!h_item) - return; - sm_item = h_item->getParent(); + dock_widget->minBox->setRange(-1000, 1000); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-1000, 1000); + dock_widget->maxBox->setValue(0); } - QApplication::setOverrideCursor(Qt::WaitCursor); - sm_item->face_graph()->collect_garbage(); - - switch(dock_widget->propertyBox->currentIndex()){ - case 0: - displayAngles(sm_item); - break; - case 1: - displayScaledJacobian(sm_item); - break; - case 2: - dock_widget->colorChoiceWidget->setCurrentIndex(0); - if(!displayHeatIntensity(sm_item)){ - QApplication::restoreOverrideCursor(); - return; - } - sm_item->setRenderingMode(Gouraud); - break; - case 3:// Heat Method (Intrinsic Delaunay) - dock_widget->colorChoiceWidget->setCurrentIndex(0); - if(!displayHeatIntensity(sm_item, true)) - return; - sm_item->setRenderingMode(Gouraud); - break; - default: - if(dock_widget->propertyBox->currentText().contains("v:")) - { - if(!treat_sm_property(dock_widget->propertyBox->currentText().toStdString(), sm_item->face_graph())) - { - QApplication::restoreOverrideCursor(); - return; - } - sm_item->setRenderingMode(Gouraud); - } - else if(dock_widget->propertyBox->currentText().contains("f:")) - { - if(!treat_sm_property(dock_widget->propertyBox->currentText().toStdString(), sm_item->face_graph())) - { - QApplication::restoreOverrideCursor(); - return; - } - sm_item->setRenderingMode(Flat); - } - break; + else + { + dock_widget->minBox->setRange(-99999999, 99999999); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-99999999, 99999999); + dock_widget->maxBox->setValue(0); } - - connect(sm_item, &Scene_surface_mesh_item::itemChanged, - this, [sm_item](){ - bool does_exist; - SMesh::Property_map pmap; - std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:jacobian"); - if(does_exist) - sm_item->face_graph()->remove_property_map(pmap); - std::tie(pmap, does_exist) = - sm_item->face_graph()->property_map("f:angle"); - if(does_exist) - sm_item->face_graph()->remove_property_map(pmap); - }); - QApplication::restoreOverrideCursor(); - sm_item->invalidateOpenGLBuffers(); - sm_item->redraw(); - if(dock_widget->propertyBox->currentIndex() != 2){ - dock_widget->zoomToMinButton->setEnabled(true); - dock_widget->zoomToMaxButton->setEnabled(true);} } - void enableButtons(int i) + void displayRampLegend() { - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(i)); + color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); + + const int height = 256; + const int width = 140; + const int cell_width = width / 3; + const int top_margin = 5; + const int left_margin = 5; + const int drawing_height = height - 2*top_margin; + const int text_height = 20; - Scene_points_with_normal_item* ps_item = - qobject_cast(scene->item(i)); + legend = QPixmap(width, height + text_height); + legend.fill(QColor(200, 200, 200)); - if(! sm_item && ! ps_item) - { - dock_widget->zoomToMinButton->setEnabled(false); - dock_widget->zoomToMaxButton->setEnabled(false); - } - else if(ps_item) + QPainter painter(&legend); + painter.setPen(Qt::black); + painter.setBrush(QColor(200, 200, 200)); + + const double min_value = dock_widget->minBox->value(); + const double max_value = dock_widget->maxBox->value(); + + // Build legend data + std::vector graduations(100); + for(int i=0; i<100; ++i) + graduations[i] = i / 100.0; + + int i = 0; + for(std::vector::iterator it = graduations.begin(), end = graduations.end(); it != end; ++it, i+=2) { - dock_widget->zoomToMinButton->setEnabled(false); - dock_widget->zoomToMaxButton->setEnabled(false); - } - else if(sm_item){ - switch(dock_widget->propertyBox->currentIndex()) - { - case 0: - dock_widget->zoomToMinButton->setEnabled(angles_max.count(sm_item)>0 ); - dock_widget->zoomToMaxButton->setEnabled(angles_max.count(sm_item)>0 ); - break; - case 1: - dock_widget->zoomToMinButton->setEnabled(jacobian_max.count(sm_item)>0); - dock_widget->zoomToMaxButton->setEnabled(jacobian_max.count(sm_item)>0); - break; - default: - break; - } + QColor color(255 * color_ramp.r(*it), + 255 * color_ramp.g(*it), + 255 * color_ramp.b(*it)); + painter.fillRect(left_margin, drawing_height - top_margin - i, cell_width, 2, color); } - } - void resetProperty() - { - Scene_surface_mesh_item* item = - qobject_cast(sender()); - if(!item) - return; - SMesh& smesh = *item->face_graph(); - SMesh::Property_map jacobians; - bool found; - std::tie(jacobians, found) = smesh.property_map("f:jacobian"); - if(found) - { - smesh.remove_property_map(jacobians); - } - SMesh::Property_map angles; - std::tie(angles, found) = smesh.property_map("f:angle"); - if(found) - { - smesh.remove_property_map(angles); - } + // draw right vertical line + painter.setPen(Qt::blue); + painter.drawLine(QPoint(left_margin + cell_width + 10, + drawing_height - top_margin + 2), + QPoint(left_margin + cell_width + 10, + drawing_height - top_margin - static_cast(graduations.size())*2 + 2)); + + // draw min value and max value + painter.setPen(Qt::blue); + QRect min_text_rect(left_margin + cell_width + 10, + drawing_height - top_margin, 100, text_height); + painter.drawText(min_text_rect, Qt::AlignCenter, QObject::tr("%1").arg(min_value, 0, 'f', 3)); + + QRect max_text_rect(left_margin + cell_width + 10, + drawing_height - top_margin - 200, 100, text_height); + painter.drawText(max_text_rect, Qt::AlignCenter, QObject::tr("%1").arg(max_value, 0, 'f', 3)); + + dock_widget->legendLabel->setPixmap(legend); } - void displayScaledJacobian(Scene_surface_mesh_item* item) + template + void displayMapLegend(const std::vector& values) { + const std::size_t size = (std::min)(color_map.size(), std::size_t(1024)); - SMesh& smesh = *item->face_graph(); - //compute and store the jacobian per face - bool non_init; - SMesh::Property_map fjacobian; - std::tie(fjacobian, non_init) = smesh.add_property_map("f:jacobian", 0); - if(non_init) + const int text_height = 20; + const int height = text_height * static_cast(size) + text_height; + const int width = 140; + const int cell_width = width / 3; + const int top_margin = 15; + const int left_margin = 5; + const int drawing_height = height - text_height + top_margin; + + legend = QPixmap(width, height); + legend.fill(QColor(200, 200, 200)); + + QPainter painter(&legend); + painter.setPen(Qt::black); + painter.setBrush(QColor(200, 200, 200)); + + int j = 0; + int tick_height = text_height; + for(std::size_t i=0; i::face_iterator fit = faces(smesh).begin(); - fit != faces(smesh).end(); - ++fit) - { - fjacobian[*fit] = scaled_jacobian(*fit, smesh); - if(fjacobian[*fit] > res_max) - { - res_max = fjacobian[*fit]; - max_index = *fit; - } - if(fjacobian[*fit] < res_min) - { - res_min = fjacobian[*fit]; - min_index = *fit; - } - } - jacobian_min.erase(item); - jacobian_min.insert(std::make_pair(item, std::make_pair(res_min, min_index))); - jacobian_max.erase(item); - jacobian_max.insert(std::make_pair(item, std::make_pair(res_max, max_index))); - connect(item, &Scene_surface_mesh_item::itemChanged, - this, &DisplayPropertyPlugin::resetProperty); + QColor color(color_map[i].red(), + color_map[i].green(), + color_map[i].blue()); + + painter.fillRect(left_margin, + drawing_height - top_margin - j, + cell_width, + tick_height, + color); + + QRect text_rect(left_margin + cell_width + 10, drawing_height - top_margin - j, 50, text_height); + painter.drawText(text_rect, Qt::AlignCenter, QObject::tr("%1").arg(values[i], 0, 'f', 3, QLatin1Char(' '))); } - treat_sm_property("f:jacobian", item->face_graph()); - } - bool resetScaledJacobian(Scene_surface_mesh_item* item) - { - SMesh& smesh = *item->face_graph(); - if(!smesh.property_map("f:jacobian").second) + if(color_map.size() > size) { - return false; + QRect text_rect(left_margin + cell_width + 10, 0, 50, text_height); + painter.drawText(text_rect, Qt::AlignCenter, QObject::tr("[...]")); } - dock_widget->minBox->setValue(jacobian_min[item].first-0.01); - dock_widget->maxBox->setValue(jacobian_max[item].first); - return true; + + // draw right vertical line + painter.setPen(Qt::blue); + painter.drawLine(QPoint(left_margin + cell_width + 10, + drawing_height - top_margin + tick_height), + QPoint(left_margin + cell_width + 10, + drawing_height - top_margin - static_cast(size)*tick_height + tick_height)); + + dock_widget->legendLabel->setPixmap(legend); } + void displayLegend() + { + if(dock_widget->colorRampRadioButton->isChecked()) + displayRampLegend(); + else + color_map.clear(); + } - void displayAngles(Scene_surface_mesh_item* item) +private: + template + bool isSMPropertyScalar(const std::string& name, + const SMesh& mesh) const; + + void detectSMScalarProperties(SMesh& mesh) { - SMesh& smesh = *item->face_graph(); - typedef boost::property_map::type PMap; - PMap pmap = get(boost::vertex_point, smesh); - //compute and store smallest angle per face - bool non_init; - SMesh::Property_map fangle; - std::tie(fangle, non_init) = smesh.add_property_map("f:angle", 0); - if(non_init) + std::vector vprop = mesh.properties(); + for(const std::string& s : vprop) { - double res_min = ARBITRARY_DBL_MAX, - res_max = -ARBITRARY_DBL_MAX; - SMesh::Face_index index_min, index_max; - for(boost::graph_traits::face_iterator fit = faces(smesh).begin(); - fit != faces(smesh).end(); - ++fit) + if(isSMPropertyScalar(s, mesh)) { - bool is_face_triangle = is_triangle(halfedge(*fit, smesh), smesh); - bool normal_is_ok = true; - EPICK::Vector_3 normal(0,0,0); - - EPICK::Orientation orientation = CGAL::POSITIVE; - if(!is_face_triangle) - { - face_descriptor f = *fit; - CGAL::Halfedge_around_face_circulator - he(halfedge(f, smesh), smesh), - he_end(he); - do{ - normal_is_ok = true; - - //Initializes the facet orientation - - EPICK::Point_3 S,T; - T = get(pmap, source(*he, smesh)); - S = get(pmap, target(*he, smesh)); - EPICK::Vector_3 V1((T-S).x(), (T-S).y(), (T-S).z()); - S = get(pmap,source(next(*he,smesh), smesh)); - T = get(pmap, target(next(*he,smesh), smesh)); - EPICK::Vector_3 V2((T-S).x(), (T-S).y(), (T-S).z()); - - if(normal == EPICK::Vector_3(0,0,0)) - normal_is_ok = false; - { - normal = CGAL::cross_product(V1, V2); - } - if(normal_is_ok) - { - orientation = EPICK::Orientation_3()(V1, V2, normal); - if( orientation == CGAL::COPLANAR ) - normal_is_ok = false; - } - }while( ++he != he_end && !normal_is_ok); - } - - std::vector local_angles; - local_angles.reserve(degree(*fit, smesh)); - for(halfedge_descriptor hd : - halfedges_around_face(halfedge(*fit, smesh),smesh)) - { - halfedge_descriptor hdn = next(hd, smesh); - EPICK::Vector_3 v1(get(pmap, source(hd, smesh)), get(pmap, target(hd, smesh))), - v2(get(pmap, target(hdn, smesh)), get(pmap, source(hdn, smesh))); - float norm1(CGAL::approximate_sqrt(v1.squared_length())), norm2(CGAL::approximate_sqrt(v2.squared_length())); - float dot_prod = v1*v2; - float angle = std::acos(dot_prod/(norm1*norm2)); - if(is_face_triangle || !normal_is_ok) - local_angles.push_back(angle * 180/CGAL_PI); - else - { - bool is_convex = true; - EPICK::Orientation res = EPICK::Orientation_3()(v1, v2, normal) ; - if(res!= orientation && res != CGAL::ZERO) - is_convex = false; - local_angles.push_back(is_convex ? angle * 180/CGAL_PI : 360 - angle * 180/CGAL_PI ); - } - } - std::sort(local_angles.begin(), local_angles.end()); - fangle[*fit]=local_angles.front(); - - if(fangle[*fit] > res_max) - { - res_max = fangle[*fit]; - index_max = *fit; - } - if(fangle[*fit] < res_min) - { - res_min = fangle[*fit]; - index_min = *fit; - } + dock_widget->propertyBox->addItem(s.c_str()); + property_simplex_types.push_back(Property_simplex_type::VERTEX); } - angles_min.erase(item); - angles_min.insert(std::make_pair(item, std::make_pair(res_min, index_min))); - angles_max.erase(item); - angles_max.insert(std::make_pair(item, std::make_pair(res_max, index_max))); + } - connect(item, &Scene_surface_mesh_item::itemChanged, - this, &DisplayPropertyPlugin::resetProperty); + std::vector fprop = mesh.properties(); + for(const std::string& s : fprop) + { + if(isSMPropertyScalar(s, mesh)) + { + dock_widget->propertyBox->addItem(s.c_str()); + property_simplex_types.push_back(Property_simplex_type::FACE); + } } - treat_sm_property("f:angle", item->face_graph()); } - bool resetAngles(Scene_surface_mesh_item* item) + bool isPSPropertyScalar(const std::string& name, + const Point_set& ps) const; + + void detectPSScalarProperties(const Point_set& ps) { - SMesh& smesh = *item->face_graph(); - if(!smesh.property_map("f:angle").second) - { - return false; - } - dock_widget->minBox->setValue(angles_min[item].first); - dock_widget->maxBox->setValue(angles_max[item].first); - return true; + for(const auto& s : ps.properties()) + if(isPSPropertyScalar(s, ps)) + dock_widget->propertyBox->addItem(s.c_str()); } - // AF: This function gets called when we click on the button "Colorize" - bool displayHeatIntensity(Scene_surface_mesh_item* item, bool iDT = false) +private: + // This fills "dock_widget->propertyBox" with the properties that can be displayed for the item at position 'item_index' + void detectScalarProperties(int item_index) { - SMesh& mesh = *item->face_graph(); - bool found = is_source.find(item) != is_source.end(); - if(!found - || ! source_points - || source_points->point_set()->is_empty()) + dock_widget->propertyBox->clear(); // calls onNewPropertySelected(-1) + property_simplex_types.clear(); + + Scene_surface_mesh_item* sm_item = qobject_cast(scene->item(item_index)); + Scene_points_with_normal_item* ps_item = qobject_cast(scene->item(item_index)); + + if(sm_item) { - QApplication::restoreOverrideCursor(); - QMessageBox::warning(mw, "Warning","Source vertices are needed for this property."); - return false; + dock_widget->propertyBox->addItems({"Smallest Angle Per Face", + "Largest Angle Per Face", + "Scaled Jacobian", + "Face Area"}); + property_simplex_types = { Property_simplex_type::FACE, + Property_simplex_type::FACE, + Property_simplex_type::FACE, + Property_simplex_type::FACE }; + detectSMScalarProperties(*(sm_item->face_graph())); } - if(!is_triangle_mesh(mesh)) + else if(ps_item) { - QApplication::restoreOverrideCursor(); - QMessageBox::warning(mw,"Error","The mesh must be triangulated."); - return false; - } - Heat_method * hm = nullptr; - Heat_method_idt * hm_idt = nullptr; - SMesh::Property_map heat_intensity = - mesh.add_property_map("v:heat_intensity", 0).first; - if(! iDT){ - if(mesh_heat_method_map.find(item) != mesh_heat_method_map.end()){ - hm = mesh_heat_method_map[item]; - }else { - hm = new Heat_method(mesh); - mesh_heat_method_map[item] = hm; - } - connect(item, &Scene_surface_mesh_item::aboutToBeDestroyed, - [this,item](){ - auto it = mesh_heat_method_map.find(item); - if(it == mesh_heat_method_map.end()) - return; - delete it->second; - mesh_heat_method_map.erase(it); - } - ); - } else { - if(mesh_heat_method_idt_map.find(item) != mesh_heat_method_idt_map.end()){ - hm_idt = mesh_heat_method_idt_map[item]; - }else { - hm_idt = new Heat_method_idt(mesh); - mesh_heat_method_idt_map[item] = hm_idt; - } - connect(item, &Scene_surface_mesh_item::aboutToBeDestroyed, - [this,item](){ - auto it = mesh_heat_method_idt_map.find(item); - if(it == mesh_heat_method_idt_map.end()) - return; - Heat_method_idt *hm_idt = it->second; - delete hm_idt; - mesh_heat_method_idt_map.erase(it); - } - ); + detectPSScalarProperties(*(ps_item->point_set())); } - for(vertex_descriptor vd : vertices(mesh)){ - if(get(is_source[item], vd)){ - if(iDT){ - hm_idt->add_source(vd); - } else - hm->add_source(vd); - } - else - { - if(iDT){ - hm_idt->remove_source(vd); - } else - hm->remove_source(vd); - } - } + int width = dock_widget->propertyBox->minimumSizeHint().width(); + dock_widget->propertyBox->view()->setMinimumWidth(width); + } - if(iDT){ - hm_idt->estimate_geodesic_distances(heat_intensity); - }else{ - hm->estimate_geodesic_distances(heat_intensity); - } +private Q_SLOTS: + // Called when a new geometric object is selected in the scene + void onItemIndexSelected(int item_index) + { + // try to keep the same selected property, if possible + const QString selected_property = dock_widget->propertyBox->currentText(); - double max = 0; - double min = (std::numeric_limits::max)(); + detectScalarProperties(item_index); - for(vertex_descriptor vd : vertices(mesh)){ - double hi = heat_intensity[vd]; - if(hi < min) - min = hi; - if(hi > max) - max = hi; - } - color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); - dock_widget->minBox->setValue(min); - dock_widget->maxBox->setValue(max); + if(dock_widget->propertyBox->count() == 0) + return; + + const int property_index = dock_widget->propertyBox->findText(selected_property); + if(property_index == -1) + dock_widget->propertyBox->setCurrentIndex(0); + else + dock_widget->propertyBox->setCurrentIndex(property_index); + } + + // Called when a new property is selected in the combo box. + // This function is only called if the index actually changed (doesn't trigger + // if you click again the item) + void onNewPropertySelected(int property_index) + { + resetExtremeValues(); // reset extreme value before the legend to get the proper values displayLegend(); - //} - SMesh::Property_map vcolors = - mesh.add_property_map("v:color", CGAL::IO::Color()).first; - SMesh::Property_map vdist= - mesh.add_property_map("v:dist", 0.0).first; - for(boost::graph_traits::vertex_iterator vit = vertices(mesh).begin(); - vit != vertices(mesh).end(); - ++vit) - { - double h =(heat_intensity[*vit]-min)/(max-min); - CGAL::IO::Color color( - 255*color_ramp.r(h), - 255*color_ramp.g(h), - 255*color_ramp.b(h)); - vcolors[*vit] = color; - vdist[*vit]=h; - } - Scene_group_item* group; - if(mesh_heat_item_map.find(item) != mesh_heat_item_map.end()) + + if(property_index >= 0 && property_index < dock_widget->propertyBox->count()) // valid property { - group = mesh_heat_item_map[item]->parentGroup(); - group->unlockChild(mesh_heat_item_map[item]); - scene->erase(scene->item_id(mesh_heat_item_map[item])); + dock_widget->setEnabled(true); + disableExtremeValues(); // only available after coloring } - else + else // no or broken property { - group = new Scene_group_item("Heat Visualization"); - group->setProperty("heat_group", true); - scene->addItem(group); - scene->changeGroup(item, group); - scene->changeGroup(source_points, group); - group->lockChild(item); - group->lockChild(source_points); - dock_widget->deleteButton->setEnabled(true); - connect(group, &Scene_group_item::aboutToBeDestroyed, - this, [this](){ - this->dock_widget->deleteButton->setEnabled(false); - }); + dock_widget->setEnabled(false); + dock_widget->propertyBox->setEnabled(true); } - mesh_heat_item_map[item] = new Scene_heat_item(item); - mesh_heat_item_map[item]->setName(tr("%1 heat").arg(item->name())); - scene->addItem(mesh_heat_item_map[item]); - scene->changeGroup(mesh_heat_item_map[item], group); - group->lockChild(mesh_heat_item_map[item]); - item->setVisible(false); - displayLegend(); - if(dock_widget->sourcePointsButton->isChecked()) - dock_widget->sourcePointsButton->toggle(); - return true; } - void replaceRamp() +private: + void colorizePS(Scene_points_with_normal_item* ps_item) { - if(dock_widget->colorChoiceWidget->currentIndex() == 0) + ps_item->point_set()->add_colors(); + if(!displayPSProperty(dock_widget->propertyBox->currentText().toStdString(), + *(ps_item->point_set()))) { - color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); - displayLegend(); - minBox = dock_widget->minBox->value(); - maxBox = dock_widget->maxBox->value(); + return; } - } - void on_propertyBox_currentIndexChanged(int) - { - dock_widget->sourcePointsButton->setEnabled(false); - Scene_surface_mesh_item* item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(! item ) - dock_widget->maxBox->setValue(180); - else{ - switch(dock_widget->propertyBox->currentIndex()) - { - case 0: - { - dock_widget->groupBox-> setEnabled(true); - dock_widget->groupBox_3->setEnabled(true); - - dock_widget->minBox->setMinimum(0); - dock_widget->minBox->setMaximum(360); - dock_widget->minBox->setValue(0); - dock_widget->maxBox->setMinimum(0); - dock_widget->maxBox->setMaximum(360); - if(is_triangle_mesh(*item->face_graph())) - dock_widget->maxBox->setValue(60); - else if(is_quad_mesh(*item->face_graph())) - dock_widget->maxBox->setValue(90); - replaceRamp(); - break; - } - case 1: - dock_widget->groupBox-> setEnabled(true); - dock_widget->groupBox_3->setEnabled(true); - - dock_widget->minBox->setMinimum(-1000); - dock_widget->minBox->setMaximum(1000); - dock_widget->minBox->setValue(0); - - dock_widget->maxBox->setMinimum(-1000); - dock_widget->maxBox->setMaximum(1000); - dock_widget->maxBox->setValue(2); - break; - case 2: - case 3: - dock_widget->sourcePointsButton->setEnabled(true); - CGAL_FALLTHROUGH; - default: - dock_widget->maxBox->setMinimum(-99999999); - dock_widget->maxBox->setMaximum(99999999); - dock_widget->minBox->setMinimum(-99999999); - dock_widget->minBox->setMaximum(99999999); - dock_widget->groupBox-> setEnabled(false); - dock_widget->groupBox_3->setEnabled(false); - } - } + ps_item->invalidateOpenGLBuffers(); + ps_item->setRenderingMode(Points); + ps_item->redraw(); } - void closure()Q_DECL_OVERRIDE + void colorizeSM(Scene_surface_mesh_item* sm_item) { - dock_widget->hide(); - } + CGAL_assertion(static_cast(dock_widget->propertyBox->count()) == property_simplex_types.size()); - void on_zoomToMinButton_pressed() - { + // leave it flat if it was, otherwise set to flat+edges + if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges) + sm_item->setRenderingMode(FlatPlusEdges); - Scene_surface_mesh_item* item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(!item) - return; - face_descriptor dummy_fd; - Point_3 dummy_p; - switch(dock_widget->propertyBox->currentIndex()) + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); + if(property_name == "Smallest Angle Per Face") { - case 0: + displayExtremumAnglePerFace(sm_item, MIN_VALUE); + } + else if(property_name == "Largest Angle Per Face") { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(angles_min[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + displayExtremumAnglePerFace(sm_item, MAX_VALUE); } - break; - case 1: + else if(property_name == "Scaled Jacobian") { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(jacobian_min[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); + displayScaledJacobian(sm_item); } - break; - default: - break; + else if(property_name == "Face Area") + { + displayArea(sm_item); + } + else + { + const int property_index = dock_widget->propertyBox->currentIndex(); + if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX) + { + if(!displaySMProperty(dock_widget->propertyBox->currentText().toStdString(), + *(sm_item->face_graph()))) + { + return; + } + sm_item->setRenderingMode(GouraudPlusEdges); + } + else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE) + { + if(!displaySMProperty(dock_widget->propertyBox->currentText().toStdString(), + *(sm_item->face_graph()))) + { + return; + } + } } + + sm_item->invalidateOpenGLBuffers(); + sm_item->redraw(); } - void on_zoomToMaxButton_pressed() +private Q_SLOTS: + void colorize() { - Scene_surface_mesh_item* item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(!item) + const int property_index = dock_widget->propertyBox->currentIndex(); + if(property_index < 0 || property_index >= dock_widget->propertyBox->count()) return; - face_descriptor dummy_fd; - Point_3 dummy_p; - switch(dock_widget->propertyBox->currentIndex()) - { - case 0: - { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(angles_max[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); - } - break; - case 1: - { - ::zoomToId(*item->face_graph(), - QString("f%1").arg(jacobian_max[item].second), - getActiveViewer(), - dummy_fd, - dummy_p); - } - break; - default: - break; - } + + QApplication::setOverrideCursor(Qt::WaitCursor); + + enableExtremeValues(); + + Scene_item* item = scene->item(scene->mainSelectionIndex()); + Scene_points_with_normal_item* ps_item = qobject_cast(item); + Scene_surface_mesh_item* sm_item = qobject_cast(item); + + if(sm_item) + colorizeSM(sm_item); + else if(ps_item) + colorizePS(ps_item); + + // @todo emit a new SIGNAL on successful coloring, something like "colorChanged()" + // itemChanged is too strong and would conflict with the connection below + + QApplication::restoreOverrideCursor(); + + // below is a hackish way to call the connection only once. + // This is required because the itemChanged signal is currently emitted when the colors are reset... + // + // @todo do not emit itemChanged when the colors are reset + // @todo with qt6, single connection can be performed with `static_cast(Qt::SingleShotConnection)` + // see https://www.kdab.com/single-shot-connections/ + auto connection = std::make_shared(); + *connection = connect(item, &Scene_surface_mesh_item::itemChanged, + this, [this, item, ps_item, sm_item, connection]() + { + QObject::disconnect(*connection); + + this->removeDisplayPluginProperties(item); // meaningful only for sm_item + + // @todo Scene_item doesn't have resetColors()... + if(ps_item) + ps_item->resetColors(); + else if(sm_item) + sm_item->resetColors(); + + if(item == scene->item(scene->mainSelectionIndex())) + onItemIndexSelected(scene->item_id(item)); + }); } - void delete_group() +private: + void removeDisplayPluginProperty(Scene_item* item, + const std::string& property_name) { - if(scene->selectionIndices().empty()) + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(!sm_item) return; - Scene_item* item = scene->item(scene->selectionIndices().first()); - Scene_group_item* group = qobject_cast(item); - if(!group || !group->property("heat_group").toBool()) + + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) return; - for(auto child_id : group->getChildren()) - { - if(Scene_surface_mesh_item* child = qobject_cast(scene->item(child_id))){ - auto it = mesh_heat_method_map.find(child); - if(it != mesh_heat_method_map.end()) - mesh_heat_method_map.erase(it); - - auto it2 = mesh_heat_item_map.find(child); - if(it2 != mesh_heat_item_map.end()) - mesh_heat_item_map.erase(it2); - - auto it3 = mesh_heat_method_idt_map.find(child); - if(it3 != mesh_heat_method_idt_map.end()) - mesh_heat_method_idt_map.erase(it3); - - group->unlockChild(child); - group->removeChild(child); - scene->addChild(child); - child->setVisible(true); - child->resetColors(); - break; - } - } - scene->erase(scene->item_id(group)); - source_points = nullptr; + // Here we only target the property maps added by this plugin, so 'double' is fine + SMesh::Property_map property; + bool found; + std::tie(property, found) = sm->property_map(property_name); + if(found) + sm->remove_property_map(property); } - void on_sourcePointsButton_toggled(bool b) + void removeDisplayPluginProperties(Scene_item* item) { - if(b) + removeDisplayPluginProperty(item, "f:display_plugin_smallest_angle"); + removeDisplayPluginProperty(item, "f:display_plugin_largest_angle"); + removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian"); + removeDisplayPluginProperty(item, "f:display_plugin_area"); + } + + void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item, + const Extremum extremum) + { + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) + return; + + // if the face is already a triangle, do not extract it from the mesh + auto triangular_face_sector_angle = [](halfedge_descriptor h, + const SMesh& mesh) -> double + { + auto vpm = get(boost::vertex_point, mesh); + return CGAL::approximate_angle(get(vpm, source(h, mesh)), + get(vpm, target(h, mesh)), + get(vpm, target(next(h, mesh), mesh))); + }; + + // for non-triangular faces, extract a one-face mesh and triangulate it + auto single_face_sector_angle = [](halfedge_descriptor h, + const SMesh& mesh) -> double + { + CGAL_precondition(!is_border(h, mesh) && is_border(opposite(h, mesh), mesh)); + + auto vpm = get(boost::vertex_point, mesh); + + double sector_angle = 0; + do + { + sector_angle += CGAL::approximate_angle(get(vpm, source(h, mesh)), + get(vpm, target(h, mesh)), + get(vpm, target(next(h, mesh), mesh))); + h = opposite(next(h, mesh), mesh); + } + while(!is_border(h, mesh)); + + return sector_angle; + }; + + bool not_initialized; + SMesh::Property_map fangle; + + if(extremum == MIN_VALUE) + std::tie(fangle, not_initialized) = sm->add_property_map("f:display_plugin_smallest_angle", 0); + else + std::tie(fangle, not_initialized) = sm->add_property_map("f:display_plugin_largest_angle", 0); + + SMesh& mesh = *sm; + auto vpm = get(boost::vertex_point, mesh); + + if(not_initialized) { - Scene_heat_item* h_item = nullptr; - Scene_surface_mesh_item* item = - qobject_cast(scene->item(scene->mainSelectionIndex())); - if(!item) - { - h_item = qobject_cast(scene->item(scene->mainSelectionIndex())); - if(h_item) - item = h_item->getParent(); - } - if(!item) - { - QMessageBox::warning(mw, "Warning", "You must select a Surface_mesh_item to make this work. Aborting."); - dock_widget->sourcePointsButton->setChecked(false); - return; - } - current_item = item; - connect(current_item, &Scene_surface_mesh_item::aboutToBeDestroyed, - this, [this]() - { - dock_widget->sourcePointsButton->setChecked(false); - }); - if(mesh_sources_map.find(item) == mesh_sources_map.end()) + for(face_descriptor f : faces(mesh)) { - source_points = new Scene_points_with_normal_item(); - source_points->setName(QString("Source vertices for %1").arg(current_item->name())); - source_points->setColor(QColor(Qt::red)); - source_points->setPointSize(5); - scene->addItem(source_points); - connect(source_points, &Scene_points_with_normal_item::aboutToBeDestroyed, - [this](){ - std::unordered_map::iterator it; - for(it = mesh_sources_map.begin(); - it != mesh_sources_map.end(); - ++it) + if(CGAL::is_triangle(halfedge(f, mesh), mesh)) + { + if(extremum == MIN_VALUE) { - if(it->second == source_points) - { - mesh_sources_map.erase(it); - break; - } + fangle[f] = (std::min)({triangular_face_sector_angle(halfedge(f, mesh), mesh), + triangular_face_sector_angle(next(halfedge(f, mesh), mesh), mesh), + triangular_face_sector_angle(prev(halfedge(f, mesh), mesh), mesh)}); } - }); - mesh_sources_map[current_item] = source_points; - } - else - { - source_points=mesh_sources_map[current_item]; - } - connect(item, SIGNAL(selected_vertex(void*)), this, SLOT(on_vertex_selected(void*))); - bool non_init = is_source.find(item) == is_source.end(); - if(non_init) - { - Vertex_source_map map = get(Vertex_source_tag(), *item->face_graph()); - is_source.insert(std::make_pair(item, map)); - connect(item, &Scene_surface_mesh_item::itemChanged, - this, &DisplayPropertyPlugin::resetProperty); - connect(item, &Scene_surface_mesh_item::aboutToBeDestroyed, - [this, item](){ - if(is_source.find(item) != is_source.end()) + else + { + fangle[f] = (std::max)({triangular_face_sector_angle(halfedge(f, mesh), mesh), + triangular_face_sector_angle(next(halfedge(f, mesh), mesh), mesh), + triangular_face_sector_angle(prev(halfedge(f, mesh), mesh), mesh)}); + } + } + else + { + SMesh local_smesh; + auto local_vpm = get(boost::vertex_point, local_smesh); + std::vector local_vertices; + + for(halfedge_descriptor h : halfedges_around_face(halfedge(f, mesh), mesh)) + { + local_vertices.push_back(CGAL::add_vertex(local_smesh)); + put(local_vpm, local_vertices.back(), get(vpm, target(h, mesh))); + } + + face_descriptor local_f = CGAL::Euler::add_face(local_vertices, local_smesh); + + // walk the border of the face to walk the halfedge of the pre-triangulation face + halfedge_descriptor local_border_h = opposite(halfedge(local_f, local_smesh), local_smesh); + CGAL_assertion(is_border(local_border_h, local_smesh)); + + CGAL::Polygon_mesh_processing::triangulate_faces(local_smesh); + + double extremum_angle_in_face = ARBITRARY_DBL_MAX; + halfedge_descriptor local_border_end_h = local_border_h; + do { - is_source.erase(item); + double angle = single_face_sector_angle(opposite(local_border_h, local_smesh), local_smesh); + if(extremum == MIN_VALUE) + extremum_angle_in_face = (std::min)(extremum_angle_in_face, angle); + else + extremum_angle_in_face = (std::max)(extremum_angle_in_face, angle); + + local_border_h = next(local_border_h, local_smesh); } - }); + while(local_border_h != local_border_end_h); + + fangle[f] = extremum_angle_in_face; + } } } + + if(extremum == MIN_VALUE) + displaySMProperty("f:display_plugin_smallest_angle", mesh); else + displaySMProperty("f:display_plugin_largest_angle", mesh); + } + + double scaled_jacobian(const face_descriptor f, + const SMesh& mesh) const; + + void displayScaledJacobian(Scene_surface_mesh_item* sm_item) + { + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) + return; + + bool not_initialized; + SMesh::Property_map fjacobian; + std::tie(fjacobian, not_initialized) = sm->add_property_map("f:display_plugin_scaled_jacobian", 0); + + if(not_initialized) { - if(!current_item) - return; - disconnect(current_item, SIGNAL(selected_vertex(void*)), this, SLOT(on_vertex_selected(void*))); - current_item = nullptr; + for(face_descriptor f : faces(*sm)) + fjacobian[f] = scaled_jacobian(f, *sm); } + + displaySMProperty("f:display_plugin_scaled_jacobian", *sm); } - void on_vertex_selected(void* void_ptr) + double area(const face_descriptor f, + const SMesh& mesh) const { - typedef boost::graph_traits::vertices_size_type size_type; - size_type h = static_cast(reinterpret_cast(void_ptr)); - vertex_descriptor vd = static_cast(h) ; - bool found = is_source.find(current_item) != is_source.end(); - if(found) + if(CGAL::is_triangle(halfedge(f, mesh), mesh)) + return CGAL::Polygon_mesh_processing::face_area(f, mesh); + + auto vpm = get(boost::vertex_point, mesh); + + // create a local version of the mesh, triangulate it, sum the triangle areas + SMesh local_smesh; + auto local_vpm = get(boost::vertex_point, local_smesh); + std::vector local_vertices; + + for(halfedge_descriptor h : halfedges_around_face(halfedge(f, mesh), mesh)) { - if(!get(is_source[current_item], vd)) - { - put(is_source[current_item], vd, true); - source_points->point_set()->insert(current_item->face_graph()->point(vd)); - } - else - { - put(is_source[current_item], vd, false); - Point_set::iterator it; - for(it = source_points->point_set()->begin(); it != source_points->point_set()->end(); ++it) - if(source_points->point_set()->point(*it) == current_item->face_graph()->point(vd)) - { - source_points->point_set()->remove(it); - source_points->point_set()->collect_garbage(); - break; - } - } + local_vertices.push_back(CGAL::add_vertex(local_smesh)); + put(local_vpm, local_vertices.back(), get(vpm, target(h, mesh))); } - source_points->invalidateOpenGLBuffers(); - source_points->itemChanged(); + CGAL::Euler::add_face(local_vertices, local_smesh); + CGAL::Polygon_mesh_processing::triangulate_faces(local_smesh); + return CGAL::Polygon_mesh_processing::area(local_smesh); } + + void displayArea(Scene_surface_mesh_item* sm_item) + { + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) + return; + + bool not_initialized; + SMesh::Property_map farea; + std::tie(farea, not_initialized) = sm->add_property_map("f:display_plugin_area", 0); + + if(not_initialized) + { + for(face_descriptor f : faces(*sm)) + farea[f] = area(f, *sm); + } + + displaySMProperty("f:display_plugin_area", *sm); + } + +private: + template + bool call_on_PS_property(const std::string& name, + const Point_set& ps, + const Functor& functor) const; + + template + bool call_on_SM_property(const std::string& name, + const SMesh& sm, + const Functor& functor) const; + private: template - bool displayPSProperty(Point_set* ps, PM pm); + bool displayPSProperty(Point_set& ps, + PM pm) + { + PSDisplayer display_property(ps, pm, this); + return display_property(); + } + + bool displayPSProperty(const std::string& name, + Point_set& ps); + + // - template - bool displaySMProperty(SMesh& smesh, PM pm, vertex_descriptor); + bool displaySMProperty(SMesh& mesh, + PM pm, + vertex_descriptor) + { + SMVertexDisplayer display_property(mesh, pm, this); + return display_property(); + } + template - bool displaySMProperty(SMesh& smesh, PM pm, face_descriptor); - template - bool treat_sm_property(std::string name, SMesh* sm); - //cannot be treated as a sm_property because the property_map<>() function takes only 1 template arg. - bool treat_point_property(std::string name, Point_set* sm); + bool displaySMProperty(SMesh& mesh, + PM pm, + face_descriptor) + { + SMFaceDisplayer display_property(mesh, pm, this); + return display_property(); + } + template - bool is_property_scalar(std::string name, const SMesh* sm); - //same problem of number of templates - bool is_property_scalar(std::string name, const Point_set* ps); - template - void displayMapLegend(const std::vector& values) + bool displaySMProperty(const std::string& name, + SMesh& mesh); + +private: + template + auto SimplexWithPropertyExtremum(const SimplexRange& simplex_range, + const SMesh& mesh, + const std::string& property_name, + const Extremum extremum) const { - // Create a legend_ and display it - const std::size_t size = (std::min)(color_map.size(), (std::size_t)256); - const int text_height = 20; - const int height = text_height*static_cast(size) + text_height; - const int width = 140; - const int cell_width = width/3; - const int top_margin = 15; - const int left_margin = 5; - const int drawing_height = height - text_height + top_margin; + using Simplex = typename boost::range_value::type; + + // We don't know what's the type of the property map so we can't simply do + // mesh.property_map(property_name), + // we have to try all acceptable types. + Simplex extremum_s; + call_on_SM_property(property_name, mesh, + [extremum, &extremum_s, &simplex_range](const auto pmap) -> bool + { + double extremum_value = (extremum == MIN_VALUE) ? ARBITRARY_DBL_MAX : - ARBITRARY_DBL_MAX; + + for(Simplex s : simplex_range) + { + if((extremum == MIN_VALUE && get(pmap, s) < extremum_value) || + (extremum == MAX_VALUE && get(pmap, s) > extremum_value)) + { + extremum_value = get(pmap, s); + extremum_s = s; + } + } + + return true; + }); + + CGAL_assertion(extremum_s != Simplex()); + return extremum_s; + } - legend_ = QPixmap(width, height ); - legend_.fill(QColor(200, 200, 200)); + template + void zoomToSimplexWithPropertyExtremum(const SimplexRange& simplex_range, + const SMesh& mesh, + const std::string& property_name, + const Extremum extremum) const + { + using Simplex = typename boost::range_value::type; - QPainter painter(&legend_); - painter.setPen(Qt::black); - painter.setBrush(QColor(200, 200, 200)); + const Simplex extremum_s = SimplexWithPropertyExtremum(simplex_range, mesh, property_name, extremum); - int j = 0; - int tick_height = text_height; - for (std::size_t i = 0; i< size; ++i, j+=tick_height) - { - QColor color(color_map[i].red(), - color_map[i].green(), - color_map[i].blue()); - painter.fillRect(left_margin, - drawing_height - top_margin - j, - cell_width, - tick_height, - color); - QRect text_rect(left_margin + cell_width+10, drawing_height - top_margin - j, - 50, text_height); - painter.drawText(text_rect, Qt::AlignCenter, tr("%1").arg(values[i], 0, 'f', 3, QLatin1Char(' '))); - } - if(color_map.size() > size){ - QRect text_rect(left_margin + cell_width+10, 0, - 50, text_height); - painter.drawText(text_rect, Qt::AlignCenter, tr("[...]")); - } - // draw right vertical line - painter.setPen(Qt::blue); + QString sid; + if(std::is_same::value) + sid = QString("v%1").arg(extremum_s); + else + sid = QString("f%1").arg(extremum_s); - painter.drawLine(QPoint(left_margin + cell_width+10, drawing_height - top_margin +tick_height), - QPoint(left_margin + cell_width+10, - drawing_height - top_margin - static_cast(size)*tick_height+tick_height)); - dock_widget->legendLabel->setPixmap(legend_); - } - void displayLegend() + face_descriptor unused_fd; + Point_3 unused_p; + ::zoomToId(mesh, sid, + getActiveViewer(), + unused_fd, unused_p); + }; + + void zoomToPointWithPropertyExtremum(const Point_set& ps, + const std::string& property_name, + const Extremum extremum) const { - // Create a legend_ and display it - const int height = 256; - const int width = 140; - const int cell_width = width/3; - const int top_margin = 5; - const int left_margin = 5; - const int drawing_height = height - top_margin * 2; - const int text_height = 20; + Point_set::Index extremum_i = -1; + call_on_PS_property(property_name, ps, + [extremum, &extremum_i, &ps](const auto pmap) -> bool + { + double extremum_value = (extremum == MIN_VALUE) ? ARBITRARY_DBL_MAX : - ARBITRARY_DBL_MAX; + + for(Point_set::Index i : ps) + { + if((extremum == MIN_VALUE && get(pmap, i) < extremum_value) || + (extremum == MAX_VALUE && get(pmap, i) > extremum_value)) + { + extremum_value = get(pmap, i); + extremum_i = i; + } + } + + return true; + }); + + CGAL_assertion(extremum_i != Point_set::Index(-1)); + Point_3 unused_p; + ::zoomToPoint(ps, extremum_i, + getActiveViewer(), + unused_p); + } - legend_ = QPixmap(width, height + text_height); - legend_.fill(QColor(200, 200, 200)); + void on_zoomToButton_pressed(const Extremum extremum) + { + const int property_index = dock_widget->propertyBox->currentIndex(); + if(property_index < 0 || property_index >= dock_widget->propertyBox->count()) + return; - QPainter painter(&legend_); - painter.setPen(Qt::black); - painter.setBrush(QColor(200, 200, 200)); + Scene_item* item = scene->item(scene->mainSelectionIndex()); + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(sm_item) + { + const SMesh& mesh = *sm_item->face_graph(); - double min_value(dock_widget->minBox->value()), - max_value(dock_widget->maxBox->value()); - // Build legend_ data - std::vector graduations(100); - for(int i=0; i<100; ++i) - graduations[i] = i/100.0; + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); + if(property_name == "Smallest Angle Per Face") + zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_smallest_angle", extremum); + else if(property_name == "Largest Angle Per Face") + zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_largest_angle", extremum); + else if(property_name == "Scaled Jacobian") + zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum); + else if(property_name == "Face Area") + zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum); + else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX) + zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum); + else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE) + zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, property_name, extremum); + } - int i=0; - for (std::vector::iterator it = graduations.begin(), end = graduations.end(); - it != end; ++it, i+=2) + Scene_points_with_normal_item* ps_item = qobject_cast(item); + if(ps_item) { - QColor color(255*color_ramp.r(*it), - 255*color_ramp.g(*it), - 255*color_ramp.b(*it)); - painter.fillRect(left_margin, - drawing_height - top_margin - i, - cell_width, - 2, - color); - } - // draw right vertical line - painter.setPen(Qt::blue); + const Point_set& ps = *ps_item->point_set(); - painter.drawLine(QPoint(left_margin + cell_width+10, drawing_height - top_margin + 2), - QPoint(left_margin + cell_width+10, - drawing_height - top_margin - static_cast(graduations.size())*2 + 2)); - // draw min value and max value - painter.setPen(Qt::blue); - QRect min_text_rect(left_margin + cell_width+10,drawing_height - top_margin, - 100, text_height); - painter.drawText(min_text_rect, Qt::AlignCenter, tr("%1").arg(min_value, 0, 'f', 1)); + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); + zoomToPointWithPropertyExtremum(ps, property_name, extremum); + } + } - QRect max_text_rect(left_margin + cell_width+10, drawing_height - top_margin - 200, - 100, text_height); - painter.drawText(max_text_rect, Qt::AlignCenter, tr("%1").arg(max_value, 0, 'f', 1)); +private Q_SLOTS: + void on_zoomToMinButton_pressed() + { + on_zoomToButton_pressed(MIN_VALUE); + } - dock_widget->legendLabel->setPixmap(legend_); + void on_zoomToMaxButton_pressed() + { + on_zoomToButton_pressed(MAX_VALUE); } - double scaled_jacobian(const face_descriptor& f , const SMesh &mesh); - QList _actions; - Color_ramp color_ramp; - std::vector color_map; - DockWidget* dock_widget; - double rm; - double rM; - double rI; - double gm; - double gM; - double gI; - double bm; - double bM; - double bI; - std::unordered_map > jacobian_min; - std::unordered_map > jacobian_max; - - std::unordered_map > angles_min; - std::unordered_map > angles_max; - std::unordered_map is_source; - - - double minBox; - double maxBox; - QPixmap legend_; - - Scene_surface_mesh_item* current_item; - Scene_points_with_normal_item* source_points; - std::unordered_map mesh_sources_map; - std::unordered_map mesh_heat_item_map; - - std::unordered_map mesh_heat_method_map; - std::unordered_map mesh_heat_method_idt_map; - - template friend class PropertyDisplayer; - - //CRTP used to display properties of surface meshes(vertex and face) and point set. +private: + template + friend class PropertyDisplayer; + + // CRTP used to display properties of surface meshes (vertex and face) and point sets. template struct PropertyDisplayer { - typedef typename PM::value_type Value_type; - PropertyDisplayer(DataSet& ds, PM pm, DisplayPropertyPlugin* parent) - :dataset(ds), property_map(pm), parent(parent) - {} + using value_type = typename PM::value_type; + + DataSet& dataset; + PM property_map; + std::vector values; + Display_property_plugin* parent; + + PropertyDisplayer(DataSet& ds, + PM pm, + Display_property_plugin* parent) + : dataset(ds), property_map(pm), parent(parent) + { } - virtual void fill_values(){} - virtual void set_colors_map(std::unordered_map &){} - virtual void set_colors_ramp(){} bool operator()() { - parent->minBox = ARBITRARY_DBL_MAX; - parent->maxBox = -ARBITRARY_DBL_MAX; static_cast(this)->fill_values(); std::sort(values.begin(), values.end()); auto end = std::unique(values.begin(), values.end()); + parent->dock_widget->minBox->setValue(*values.begin()); + parent->dock_widget->maxBox->setValue(*(std::prev(end))); - parent->minBox = *values.begin(); - parent->maxBox = *(end-1); - parent->dock_widget->minBox->setValue(parent->minBox); - parent->dock_widget->maxBox->setValue(parent->maxBox); - - //fill color pmap - if(parent->dock_widget->colorChoiceWidget->currentIndex() == 1) + // fill color pmap + if(parent->dock_widget->colorRampRadioButton->isChecked()) { - std::unordered_map value_index_map; - //fill map - std::size_t counter = 0; - for(auto it = values.begin(); it != end; ++it) - { - value_index_map[*it] = counter++; - } - parent->color_map.clear(); - compute_color_map(QColor(parent->rI, parent->gI, parent->bI),std::distance(values.begin(), end), - std::back_inserter(parent->color_map)); - static_cast(this)->set_colors_map(value_index_map); - parent->displayMapLegend(values); + // scale a color ramp between min and max + parent->displayRampLegend(); + static_cast(this)->color_with_ramp(); } else { - //scale a color ramp between min and max - parent->replaceRamp(); - static_cast(this)->set_colors_ramp(); + CGAL_assertion(parent->dock_widget->randomColorsRadioButton->isChecked()); + + // generate color map + parent->color_map.clear(); + compute_color_map(QColor(255 * parent->rI, 255 * parent->gI, 255 * parent->bI), + std::distance(values.begin(), end), + std::back_inserter(parent->color_map)); + + // fill map + std::unordered_map value_index_map; + std::size_t counter = 0; + for(auto it=values.begin(); it!=end; ++it) + value_index_map[*it] = counter++; + + static_cast(this)->color_with_map(value_index_map); + parent->displayMapLegend(values); } + return true; } - - - DataSet& dataset; - PM property_map; - std::vector values; - DisplayPropertyPlugin* parent; - }; + }; // struct PropertyDisplayer template struct PSDisplayer : public PropertyDisplayer > { - typedef typename PM::value_type Value_type; - typedef PropertyDisplayer > Base; - PSDisplayer(Point_set& ds, PM pm, DisplayPropertyPlugin* parent) - :Base(ds, pm, parent) + using Base = PropertyDisplayer >; + using value_type = typename PM::value_type; + + PSDisplayer(Point_set& ps, + PM pm, + Display_property_plugin* parent) + : Base(ps, pm, parent) {} + void fill_values() { - for(auto p : this->dataset) - { + for(const auto& p : this->dataset) this->values.push_back(this->property_map[p]); - } } - void set_colors_map(std::unordered_map &value_index_map) + void color_with_map(std::unordered_map& value_index_map) { - for(Point_set::iterator pit = this->dataset.begin(); - pit != this->dataset.end(); - ++pit) + for(const auto& p : this->dataset) { - CGAL::IO::Color color( - this->parent->color_map[value_index_map[this->property_map[*pit]]].red(), - this->parent->color_map[value_index_map[this->property_map[*pit]]].green(), - this->parent->color_map[value_index_map[this->property_map[*pit]]].blue()); - this->dataset.set_color(*pit, color.red(), color.green(), color.blue()); + CGAL::IO::Color color(this->parent->color_map[value_index_map[this->property_map[p]]].red(), + this->parent->color_map[value_index_map[this->property_map[p]]].green(), + this->parent->color_map[value_index_map[this->property_map[p]]].blue()); + this->dataset.set_color(p, color.red(), color.green(), color.blue()); } } - void set_colors_ramp() + void color_with_ramp() const { - float max = this->parent->maxBox; - float min = this->parent->minBox; - for(Point_set::iterator pit = this->dataset.begin(); - pit != this->dataset.end(); - ++pit) + double min = this->parent->dock_widget->minBox->value(); + double max = this->parent->dock_widget->maxBox->value(); + for(const auto& p : this->dataset) { if(min == max) - --min; - float f = (static_cast(this->property_map[*pit])-min)/(max-min); - if(f<0) - f = 0; - if(f>1) - f = 1; - CGAL::IO::Color color( - 255*this->parent->color_ramp.r(f), - 255*this->parent->color_ramp.g(f), - 255*this->parent->color_ramp.b(f)); - this->dataset.set_color(*pit, color.red(), color.green(), color.blue()); - } - } + min -= 1.; - }; + double val = (this->property_map[p] - min) / (max - min); + val = boost::algorithm::clamp(val, 0., 1.); + CGAL::IO::Color color(255 * this->parent->color_ramp.r(val), + 255 * this->parent->color_ramp.g(val), + 255 * this->parent->color_ramp.b(val)); + this->dataset.set_color(p, color.red(), color.green(), color.blue()); + } + } + }; // PSDisplayer template struct SMVertexDisplayer : public PropertyDisplayer > { - typedef typename PM::value_type Value_type; - typedef PropertyDisplayer > Base; - SMVertexDisplayer(SMesh& ds, PM pm, DisplayPropertyPlugin* parent) - :Base(ds, pm, parent) + using Base = PropertyDisplayer > ; + using value_type = typename PM::value_type; + + SMVertexDisplayer(SMesh& mesh, + PM pm, + Display_property_plugin* parent) + : Base(mesh, pm, parent) {} void fill_values() { - for(auto v : vertices(this->dataset)) - { + for(vertex_descriptor v : vertices(this->dataset)) this->values.push_back(this->property_map[v]); - } } - void set_colors_map(std::unordered_map &value_index_map) + void color_with_map(std::unordered_map& value_index_map) const { SMesh::Property_map vcolors = this->dataset.template add_property_map("v:color", CGAL::IO::Color()).first; - for(boost::graph_traits::vertex_iterator vit = vertices(this->dataset).begin(); - vit != vertices(this->dataset).end(); - ++vit) + for(vertex_descriptor v : vertices(this->dataset)) { - CGAL::IO::Color color( - this->parent->color_map[value_index_map[this->property_map[*vit]]].red(), - this->parent->color_map[value_index_map[this->property_map[*vit]]].green(), - this->parent->color_map[value_index_map[this->property_map[*vit]]].blue()); - vcolors[*vit] = color; + CGAL::IO::Color color(this->parent->color_map[value_index_map[this->property_map[v]]].red(), + this->parent->color_map[value_index_map[this->property_map[v]]].green(), + this->parent->color_map[value_index_map[this->property_map[v]]].blue()); + vcolors[v] = color; } } - void set_colors_ramp() + void color_with_ramp() const { SMesh::Property_map vcolors = this->dataset.template add_property_map("v:color", CGAL::IO::Color()).first; - float max = this->parent->maxBox; - float min = this->parent->minBox; - for(boost::graph_traits::vertex_iterator vit = vertices(this->dataset).begin(); - vit != vertices(this->dataset).end(); - ++vit) + + double min = this->parent->dock_widget->minBox->value(); + double max = this->parent->dock_widget->maxBox->value(); + + if(min == max) + min -= 1.; + + for(vertex_descriptor v : vertices(this->dataset)) { - if(min == max) - --min; - float f = (static_cast(this->property_map[*vit])-min)/(max-min); - if(f<0) - f = 0; - if(f>1) - f = 1; - CGAL::IO::Color color( - 255*this->parent->color_ramp.r(f), - 255*this->parent->color_ramp.g(f), - 255*this->parent->color_ramp.b(f)); - vcolors[*vit] = color; + double val = (this->property_map[v] - min) / (max - min); + val = boost::algorithm::clamp(val, 0., 1.); + + CGAL::IO::Color color(255 * this->parent->color_ramp.r(val), + 255 * this->parent->color_ramp.g(val), + 255 * this->parent->color_ramp.b(val)); + vcolors[v] = color; } } - }; + }; // struct SMVertexDisplayer template struct SMFaceDisplayer : public PropertyDisplayer > { - typedef PropertyDisplayer > Base; - typedef typename PM::value_type Value_type; - SMFaceDisplayer(SMesh& ds, PM pm, DisplayPropertyPlugin* parent) - :Base(ds, pm, parent) - {} + using Base = PropertyDisplayer >; + using value_type = typename PM::value_type; + + SMFaceDisplayer(SMesh& mesh, + PM pm, + Display_property_plugin* parent) + : Base(mesh, pm, parent) + { } + void fill_values() { - for(auto f : faces(this->dataset)) - { + for(face_descriptor f : faces(this->dataset)) this->values.push_back(this->property_map[f]); - } } - void set_colors_map(std::unordered_map &value_index_map) + void color_with_map(std::unordered_map& value_index_map) const { SMesh::Property_map fcolors = this->dataset.template add_property_map("f:color", CGAL::IO::Color()).first; - for(boost::graph_traits::face_iterator fit = faces(this->dataset).begin(); - fit != faces(this->dataset).end(); - ++fit) + for(face_descriptor f : faces(this->dataset)) { - CGAL::IO::Color color( - this->parent->color_map[value_index_map[this->property_map[*fit]]].red(), - this->parent->color_map[value_index_map[this->property_map[*fit]]].green(), - this->parent->color_map[value_index_map[this->property_map[*fit]]].blue()); - fcolors[*fit] = color; + CGAL::IO::Color color(this->parent->color_map[value_index_map[this->property_map[f]]].red(), + this->parent->color_map[value_index_map[this->property_map[f]]].green(), + this->parent->color_map[value_index_map[this->property_map[f]]].blue()); + fcolors[f] = color; } } - void set_colors_ramp() + void color_with_ramp() const { SMesh::Property_map fcolors = this->dataset.template add_property_map("f:color", CGAL::IO::Color()).first; - float max = this->parent->maxBox; - float min = this->parent->minBox; - for(boost::graph_traits::face_iterator fit = faces(this->dataset).begin(); - fit != faces(this->dataset).end(); - ++fit) + + double min = this->parent->dock_widget->minBox->value(); + double max = this->parent->dock_widget->maxBox->value(); + + if(min == max) + min -= 1.; + + for(face_descriptor f : faces(this->dataset)) { - if(min == max) - --min; - float f = (static_cast(this->property_map[*fit])-min)/(max-min); - if(f<0) - f = 0; - if(f>1) - f = 1; - CGAL::IO::Color color( - 255*this->parent->color_ramp.r(f), - 255*this->parent->color_ramp.g(f), - 255*this->parent->color_ramp.b(f)); - fcolors[*fit] = color; + double val = (this->property_map[f] - min) / (max - min); + val = boost::algorithm::clamp(val, 0., 1.); + + CGAL::IO::Color color(255 * this->parent->color_ramp.r(val), + 255 * this->parent->color_ramp.g(val), + 255 * this->parent->color_ramp.b(val)); + fcolors[f] = color; } } - }; - + }; // struct SMFaceDisplayer }; /// Code based on the verdict module of vtk - /*========================================================================= +/*========================================================================= Copyright (c) 2006 Sandia Corporation. All rights reserved. See Copyright.txt or https://www.kitware.com/Copyright.htm for details. @@ -1701,381 +1227,170 @@ private Q_SLOTS: PURPOSE. See the above copyright notice for more information. =========================================================================*/ - double DisplayPropertyPlugin::scaled_jacobian( const face_descriptor& f , const SMesh& mesh) - { - boost::property_map::type - pmap = get(boost::vertex_point, mesh); - std::vector corner_areas(degree(f, mesh)); - std::vector edges; - for(halfedge_descriptor hd : CGAL::halfedges_around_face(halfedge(f, mesh), mesh)) - { - edges.push_back(EPICK::Vector_3(get(pmap, source(hd, mesh)), get(pmap, target(hd, mesh)))); - } - std::vector corner_normals; - for(std::size_t i = 0; i < edges.size(); ++i) - { - corner_normals.push_back(CGAL::cross_product(edges[i], edges[(i+1)%(edges.size())])); - } - +double +Display_property_plugin:: +scaled_jacobian(const face_descriptor f, + const SMesh& mesh) const +{ + boost::property_map::type vpm = get(boost::vertex_point, mesh); + std::vector corner_areas(degree(f, mesh)); - EPICK::Vector_3 unit_center_normal = CGAL::Polygon_mesh_processing::compute_face_normal(f, mesh); - unit_center_normal *= 1.0/CGAL::approximate_sqrt(unit_center_normal.squared_length()); + std::vector edges; + for(halfedge_descriptor hd : CGAL::halfedges_around_face(halfedge(f, mesh), mesh)) + { + edges.emplace_back(get(vpm, source(hd, mesh)), + get(vpm, target(hd, mesh))); + } - for(std::size_t i = 0; i < corner_areas.size(); ++i) - { - corner_areas[i] = unit_center_normal*corner_normals[i]; - } - std::vector length; - for(std::size_t i=0; i corner_normals; + for(std::size_t i=0; i 0 ) - return (double) (std::min)( min_scaled_jac, ARBITRARY_DBL_MAX ); - return (double) (std::max)( min_scaled_jac, -ARBITRARY_DBL_MAX ); + EPICK::Vector_3 unit_center_normal = CGAL::Polygon_mesh_processing::compute_face_normal(f, mesh); - } + for(std::size_t i=0; i length; + for(std::size_t i=0; itemplate property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - if(ps->template property_map(name).second) - { - return true; - } - return false; + length.push_back(CGAL::approximate_sqrt(edges[i].squared_length())); + if(length[i] < ARBITRARY_DBL_MIN) + return 0.; } - template - bool DisplayPropertyPlugin::is_property_scalar(std::string name, const SMesh* sm) + double min_scaled_jac = ARBITRARY_DBL_MAX; + for(std::size_t i=0; itemplate property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - if(sm->template property_map(name).second) - { - return true; - } - return false; + double scaled_jac = corner_areas[i] / (length[i] * length[(i+edges.size()-1)%(edges.size())]); + min_scaled_jac = (std::min)(scaled_jac, min_scaled_jac); } - bool DisplayPropertyPlugin::treat_point_property(std::string name, Point_set* ps) - { - typedef typename Point_set::template Property_map Int8_map; - typedef typename Point_set::template Property_map Uint8_map; - typedef typename Point_set::template Property_map Int16_map; - typedef typename Point_set::template Property_map Uint16_map; - typedef typename Point_set::template Property_map Int32_map; - typedef typename Point_set::template Property_map Uint32_map; - typedef typename Point_set::template Property_map Int64_map; - typedef typename Point_set::template Property_map Uint64_map; - typedef typename Point_set::template Property_map Float_map; - typedef typename Point_set::template Property_map Double_map; - - bool okay = false; - { - Int8_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Uint8_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Int16_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Uint16_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Int32_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Uint32_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Int64_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } - - { - Uint64_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } + if(min_scaled_jac > 0) + return (std::min)(min_scaled_jac, ARBITRARY_DBL_MAX); - { - Float_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } + return (std::max)(min_scaled_jac, -ARBITRARY_DBL_MAX); +} - { - Double_map pmap; - std::tie(pmap, okay) = ps->property_map(name); - if(okay) - { - return displayPSProperty(ps, pmap); - } - } +bool +Display_property_plugin:: +isPSPropertyScalar(const std::string& name, + const Point_set& ps) const +{ + if(name == "red" || name == "green" || name == "blue") return false; - } - - template - bool DisplayPropertyPlugin::treat_sm_property(std::string name, SMesh* sm) - { - typedef typename SMesh::template Property_map Int8_map; - typedef typename SMesh::template Property_map Uint8_map; - typedef typename SMesh::template Property_map Int16_map; - typedef typename SMesh::template Property_map Uint16_map; - typedef typename SMesh::template Property_map Int32_map; - typedef typename SMesh::template Property_map Uint32_map; - typedef typename SMesh::template Property_map Int64_map; - typedef typename SMesh::template Property_map Uint64_map; - typedef typename SMesh::template Property_map Float_map; - typedef typename SMesh::template Property_map Double_map; - - bool okay = false; - { - Int8_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Uint8_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Int16_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Uint16_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Int32_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Uint32_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Int64_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Uint64_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - - { - Float_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } - { - Double_map pmap; - std::tie(pmap, okay) = sm->property_map(name); - if(okay) - { - return displaySMProperty(*sm, pmap, TAG()); - } - } + // the dispatch function does the filtering we want: if it founds a property + // with which it can call the functor, then it already has a property we want + return call_on_PS_property(name, ps, [](auto) -> bool { return true; }); +} + +// Shenanigans to deal with the fact that the value type is not known +// +// find the property map with the correct value, and call the functor +template +bool +Display_property_plugin:: +isSMPropertyScalar(const std::string& name, + const SMesh& mesh) const +{ + // do not detect this plugin's properties + if(name == "f:display_plugin_smallest_angle" || + name == "f:display_plugin_largest_angle" || + name == "f:display_plugin_scaled_jacobian" || + name == "f:display_plugin_area") return false; - } - - template - bool DisplayPropertyPlugin::displayPSProperty(Point_set* ps, PM pm) - { - PSDisplayer display_property(*ps, pm, this); - return display_property(); - } - template - bool DisplayPropertyPlugin::displaySMProperty(SMesh& smesh, PM pm, vertex_descriptor) - { - SMVertexDisplayer display_property(smesh, pm, this); - return display_property(); - } + // the dispatch function does the filtering we want: if it founds a property + // with which it can call the functor, then it already has a property we want + return call_on_SM_property(name, mesh, [](auto) -> bool { return true; }); +} - template - bool DisplayPropertyPlugin::displaySMProperty(SMesh& smesh, PM pm, face_descriptor) - { - SMFaceDisplayer display_property(smesh, pm, this); - return display_property(); - } +bool +Display_property_plugin:: +displayPSProperty(const std::string& name, + Point_set& ps) +{ + return call_on_PS_property(name, ps, + [this, &ps](auto pmap) -> bool + { + return this->displayPSProperty(ps, pmap); + }); +} + +template +bool +Display_property_plugin:: +displaySMProperty(const std::string& name, + SMesh& mesh) +{ + return call_on_SM_property(name, mesh, + [this, &mesh](auto pmap) -> bool + { + return this->displaySMProperty(mesh, pmap, Simplex()); + }); +} + +template +bool +Display_property_plugin:: +call_on_PS_property(const std::string& name, + const Point_set& ps, + const Functor& functor) const +{ + if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + else if(ps.template property_map(name).second) + return functor(ps.template property_map(name).first); + + return false; +} + +template +bool +Display_property_plugin:: +call_on_SM_property(const std::string& name, + const SMesh& mesh, + const Functor& functor) const +{ + if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + else if(mesh.template property_map(name).second) + return functor(mesh.template property_map(name).first); + + return false; +} #include "Display_property_plugin.moc" diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method.ui new file mode 100644 index 000000000000..0c7440b2236b --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method.ui @@ -0,0 +1,294 @@ + + + HeatMethodWidget + + + true + + + + 0 + 0 + 365 + 708 + + + + + 365 + 708 + + + + Heat Method + + + + + + + + + true + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + true + + + true + + + + + 0 + 0 + 161 + 371 + + + + + + + true + + + RAMP DISPLAYING + + + + + + + + + + + true + + + Color Ramp + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + Min color + + + + + + + true + + + + + + + + + + + + + true + + + Max color + + + + + + + true + + + + + + + + + + + + + true + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + true + + + Method + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + true + + + + + + + + + + true + + + Extreme Value + + + + + + true + + + Zoom to max value + + + + + + + true + + + Max Value + + + + + + + true + + + 0 + + + true + + + + + + + + + + true + + + + Cantarell + true + + + + Estimate Geodesic Distances + + + + + + + true + + + Source Vertices + + + + + + true + + + + + + 1 + + + Create Source Vertices Selection Item + + + + + + + + + + + + DoubleEdit + QLineEdit +
    CGAL_double_edit.h
    +
    +
    + + +
    diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp new file mode 100644 index 000000000000..4de8e8fe41f4 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp @@ -0,0 +1,822 @@ +#include "ui_Heat_method.h" + +#include "Color_ramp.h" +#include "id_printing.h" +#include "Messages_interface.h" +#include "triangulate_primitive.h" + +#include "Scene.h" +#include "Scene_polyhedron_selection_item.h" +#include "Scene_surface_mesh_item.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// @fixme multiple selection items are broken, so don't create a selection item if there is already one + +using namespace CGAL::Three; + +Viewer_interface* (&getActiveViewer)() = Three::activeViewer; + +class Scene_heat_item + : public Scene_item_rendering_helper +{ + Q_OBJECT + +private: + Scene_surface_mesh_item* parent; + SMesh* sm; + + mutable std::vector verts; + mutable std::vector normals; + mutable std::vector idx; + mutable std::vector colors; + mutable std::vector heat_values; + mutable std::size_t nb_idx; + +public: + Scene_heat_item(Scene_surface_mesh_item* item) + : parent(item), sm(item->face_graph()) + { + CGAL_precondition(is_triangle_mesh(*sm)); + + setTriangleContainer(0, new Triangle_container(Viewer_interface::PROGRAM_HEAT_INTENSITY, true)); + setRenderingMode(Gouraud); + } + + ~Scene_heat_item(){} + + Scene_item* clone() const Q_DECL_OVERRIDE { return nullptr; } + QString toolTip() const Q_DECL_OVERRIDE{ return QString(); } + Scene_surface_mesh_item* getParent() { return parent; } + bool isEmpty() const Q_DECL_OVERRIDE { return false; } + + SMesh* face_graph() { return sm; } + + void initializeBuffers(Viewer_interface *viewer) const Q_DECL_OVERRIDE + { + getTriangleContainer(0)->initializeBuffers(viewer); + getTriangleContainer(0)->setIdxSize(nb_idx); + + verts.resize(0); + verts.shrink_to_fit(); + normals.resize(0); + normals.shrink_to_fit(); + colors.resize(0); + colors.shrink_to_fit(); + idx.clear(); + idx.shrink_to_fit(); + } + + void draw(Viewer_interface *viewer) const Q_DECL_OVERRIDE + { + if(!visible()) + return; + + if(!isInit(viewer)) + initGL(viewer); + + if(getBuffersFilled() && !getBuffersInit(viewer)) + { + initializeBuffers(viewer); + setBuffersInit(viewer, true); + } + + if(!getBuffersFilled()) + { + computeElements(); + initializeBuffers(viewer); + } + + getTriangleContainer(0)->setAlpha(1.0f); + getTriangleContainer(0)->draw(viewer, false); + } + + void compute_bbox() const Q_DECL_OVERRIDE + { + setBbox(parent->bbox()); + } + + virtual bool supportsRenderingMode(RenderingMode m) const Q_DECL_OVERRIDE + { + return (m == Gouraud); + } + + virtual void invalidateOpenGLBuffers() Q_DECL_OVERRIDE + { + setBuffersFilled(false); + compute_bbox(); + getTriangleContainer(0)->reset_vbos(NOT_INSTANCED); + } + + void computeElements() const Q_DECL_OVERRIDE + { + typedef CGAL::Buffer_for_vao CPF; + + QApplication::setOverrideCursor(Qt::WaitCursor); + + auto vpm = CGAL::get(CGAL::vertex_point, *sm); + auto vnormals = sm->property_map("v:normal").first; + auto fnormals = sm->property_map("f:normal").first; + + auto [vcolors, vcolors_found] = sm->property_map("v:color"); + CGAL_assertion(vcolors_found); + auto [vdist, vdist_found] = sm->property_map("v:HM_Plugin_heat_intensity"); + CGAL_assertion(vdist_found); + + verts.clear(); + normals.clear(); + idx.clear(); + colors.clear(); + + idx.reserve(3 * num_faces(*sm)); + for(face_descriptor fd : faces(*sm)) + { + for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, *sm),*sm)) + idx.push_back(source(hd, *sm)); + } + + const CGAL::qglviewer::Vec& o = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); + EPICK::Vector_3 offset(o.x, o.y, o.z); + + for(vertex_descriptor vd : vertices(*sm)) + { + const CGAL::IO::Color& c = vcolors[vd]; + colors.push_back(float(c.red()) / 255); + colors.push_back(float(c.green()) / 255); + colors.push_back(float(c.blue()) / 255); + + const EPICK::Point_3& p = get(vpm, vd) + offset; + CPF::add_point_in_buffer(p, verts); + + const EPICK::Vector_3& n = vnormals[vd]; + CPF::add_normal_in_buffer(n, normals); + + heat_values.push_back(vdist[vd]); + } + + nb_idx = idx.size(); + getTriangleContainer(0)->allocate(Triangle_container::Vertex_indices, idx.data(), + static_cast(idx.size()*sizeof(unsigned int))); + getTriangleContainer(0)->allocate(Triangle_container::Smooth_vertices, verts.data(), + static_cast(num_vertices(*sm)*3*sizeof(float))); + getTriangleContainer(0)->allocate(Triangle_container::Smooth_normals, normals.data(), + static_cast(num_vertices(*sm)*3*sizeof(float))); + getTriangleContainer(0)->allocate(Triangle_container::VColors, colors.data(), + static_cast(colors.size()*sizeof(float))); + getTriangleContainer(0)->allocate(Triangle_container::Distances, heat_values.data(), + static_cast(heat_values.size()*sizeof(float))); + + compute_bbox(); + setBuffersFilled(true); + + QApplication::restoreOverrideCursor(); + } +}; // class Scene_heat_item + +class DockWidget + : public QDockWidget, + public Ui::HeatMethodWidget +{ +public: + DockWidget(const QString& name, QWidget *parent) + : QDockWidget(name, parent) + { + setupUi(this); + } +}; + +class Heat_method_plugin + : public QObject, + public Polyhedron_demo_plugin_helper +{ + Q_OBJECT + Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) + Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") + + using Vertex_distance_map = SMesh::Property_map; + using Heat_method = CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3; + using Heat_method_idt = CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3; + +private: + QAction* actionHeatMethod; + + DockWidget* dock_widget; + + // coloring choice and legend + double rm = 1.; + double gm = 0.; + double bm = 0.; + double rM = 0.; + double gM = 1.; + double bM = 0.; + + Color_ramp color_ramp; + QPixmap legend; + + // tracking which scene items have which sources, and which heat method builders + boost::bimap, + boost::bimaps::set_of > item_source_vertices; + + // the point of storing this is that in the Heat Method(s), a number of computations are only + // dependent on the mesh, and not the sources, and such can be performed just once. + std::unordered_map heat_methods; + std::unordered_map idt_heat_methods; + +public: + bool applicable(QAction*) const Q_DECL_OVERRIDE + { + // Single item => it must be a mesh and the selection item will be created through the plugin's button + if(scene->selectionIndices().size() == 1) + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + return qobject_cast(item); + } + // Two items => it must be a surface mesh and a selection item (in any order) + else if(scene->selectionIndices().size() == 2) + { + Scene_item* item1 = scene->item(scene->selectionIndices().front()); + Scene_item* item2 = scene->item(scene->selectionIndices().back()); + return ((qobject_cast(item1) && + qobject_cast(item2)) || + (qobject_cast(item1) && + qobject_cast(item2))); + } + + return false; + } + + QList actions() const Q_DECL_OVERRIDE + { + return QList() << actionHeatMethod; + } + + void init(QMainWindow* mw, + Scene_interface* sc, + Messages_interface*) Q_DECL_OVERRIDE + { + this->scene = sc; + this->mw = mw; + + actionHeatMethod = new QAction(QString("Heat Method"), mw); + actionHeatMethod->setProperty("submenuName", "Color"); + + connect(actionHeatMethod, SIGNAL(triggered()), + this, SLOT(openDialog())); + + Scene* scene_item = static_cast(scene); + connect(scene_item, SIGNAL(itemIndicesSelected(QList)), + this, SLOT(onItemIndicesSelected(QList))); + + // Dock Widget + dock_widget = new DockWidget("Heat Method", mw); + addDockWidget(dock_widget); + dock_widget->setVisible(false); + + connect(dock_widget->methodBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(onNewMethodSelected(int))); + + dock_widget->methodBox->addItems({"Heat Method", + "Heat Method (Intrinsic Delaunay)"}); + + connect(dock_widget->createSourceVerticesButton, SIGNAL(clicked()), + this, SLOT(createSourceVerticesSelectionItem())); + + QPalette palette(Qt::red); + dock_widget->minColorButton->setPalette(palette); + dock_widget->minColorButton->setStyle(QStyleFactory::create("Fusion")); + dock_widget->minColorButton->update(); + + palette = QPalette(Qt::green); + dock_widget->maxColorButton->setPalette(palette); + dock_widget->maxColorButton->setStyle(QStyleFactory::create("Fusion")); + dock_widget->maxColorButton->update(); + + // lambda to generate the three connect(), for each color button (min, max, map) + auto connect_color_buttons = [this](QPushButton* colorButton, + double& r, double& g, double& b) + { + connect(colorButton, &QPushButton::pressed, + this, [this, colorButton, &r, &g, &b]() + { + QColor color = QColorDialog::getColor(); + if(!color.isValid()) + return; + + r = color.redF(); + g = color.greenF(); + b = color.blueF(); + + QPalette palette(color); + colorButton->setPalette(palette); + colorButton->update(); + + displayRampLegend(); + }); + }; + + connect_color_buttons(dock_widget->minColorButton, rm, gm, bm); + connect_color_buttons(dock_widget->maxColorButton, rM, gM, bM); + + // Main action connection + connect(dock_widget->estimateDistancesButton, SIGNAL(clicked(bool)), + this, SLOT(estimateDistances())); + + // Post coloring connection + connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, + this, &Heat_method_plugin::on_zoomToMaxButton_pressed); + } + +private Q_SLOTS: + void openDialog() + { + if(!dock_widget->isVisible()) + dock_widget->show(); + dock_widget->raise(); + } + + void closure() Q_DECL_OVERRIDE + { + dock_widget->hide(); + } + +private: + void disableExtremeValue() + { + dock_widget->extremeValueGroup->setEnabled(false); + dock_widget->zoomToMaxButton->setEnabled(false); + } + + void enableExtremeValue() + { + dock_widget->extremeValueGroup->setEnabled(true); + dock_widget->zoomToMaxButton->setEnabled(true); + } + + void resetExtremeValue() + { + dock_widget->maxBox->setRange(0, 99999999); + dock_widget->maxBox->setValue(0); + } + + void displayRampLegend() + { + color_ramp = Color_ramp(rm, rM, gm, gM, bm, bM); + + const int height = 256; + const int width = 140; + const int cell_width = width / 3; + const int top_margin = 5; + const int left_margin = 5; + const int drawing_height = height - 2*top_margin; + const int text_height = 20; + + legend = QPixmap(width, height + text_height); + legend.fill(QColor(200, 200, 200)); + + QPainter painter(&legend); + painter.setPen(Qt::black); + painter.setBrush(QColor(200, 200, 200)); + + const double min_value = 0; + const double max_value = dock_widget->maxBox->value(); + + // Build legend data + std::vector graduations(100); + for(int i=0; i<100; ++i) + graduations[i] = i / 100.0; + + int i = 0; + for(std::vector::iterator it = graduations.begin(), end = graduations.end(); it != end; ++it, i+=2) + { + QColor color(255 * color_ramp.r(*it), + 255 * color_ramp.g(*it), + 255 * color_ramp.b(*it)); + painter.fillRect(left_margin, drawing_height - top_margin - i, cell_width, 2, color); + } + + // draw right vertical line + painter.setPen(Qt::blue); + painter.drawLine(QPoint(left_margin + cell_width + 10, + drawing_height - top_margin + 2), + QPoint(left_margin + cell_width + 10, + drawing_height - top_margin - static_cast(graduations.size())*2 + 2)); + + // draw min value and max value + painter.setPen(Qt::blue); + QRect min_text_rect(left_margin + cell_width + 10, + drawing_height - top_margin, 100, text_height); + painter.drawText(min_text_rect, Qt::AlignCenter, QObject::tr("%1").arg(min_value, 0, 'f', 3)); + + QRect max_text_rect(left_margin + cell_width + 10, + drawing_height - top_margin - 200, 100, text_height); + painter.drawText(max_text_rect, Qt::AlignCenter, QObject::tr("%1").arg(max_value, 0, 'f', 3)); + + dock_widget->legendLabel->setPixmap(legend); + } + +private Q_SLOTS: + // Called when new geometric objects are selected in the scene + void onItemIndicesSelected(QList selected_items) + { + resetExtremeValue(); + dock_widget->setEnabled(false); + + Scene_surface_mesh_item* sm_item = nullptr; + Scene_polyhedron_selection_item* source_vertices = nullptr; + + if(selected_items.size() == 1) + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + source_vertices = qobject_cast(item); + if(source_vertices) + { + // While selecting a selection item, enable coloring if the selection item is linked to a sm_item + if(item_source_vertices.right.count(source_vertices) == 0) + return; + + dock_widget->setEnabled(true); + dock_widget->createSourceVerticesButton->setEnabled(false); + dock_widget->estimateDistancesButton->setEnabled(true); + disableExtremeValue(); + return; + } + else if(qobject_cast(item)) + { + dock_widget->setEnabled(true); + dock_widget->createSourceVerticesButton->setEnabled(false); + dock_widget->estimateDistancesButton->setEnabled(false); + disableExtremeValue(); + return; + } + + sm_item = qobject_cast(item); + } + else if(selected_items.size() == 2) + { + Scene_item* item1 = scene->item(selected_items.front()); + Scene_item* item2 = scene->item(selected_items.back()); + sm_item = qobject_cast(item1); + source_vertices = qobject_cast(item2); + if(!sm_item) + { + sm_item = qobject_cast(item2); + source_vertices = qobject_cast(item1); + } + } + + if(!sm_item) + return; + + dock_widget->setEnabled(true); + const bool has_sources = (source_vertices || item_source_vertices.left.count(sm_item) != 0); + dock_widget->estimateDistancesButton->setEnabled(has_sources); + dock_widget->createSourceVerticesButton->setEnabled(!has_sources); + disableExtremeValue(); + } + + // This function is only called if the index actually changed (doesn't trigger + // if you click again the item) + void onNewMethodSelected(int method_index) + { + resetExtremeValue(); // reset extreme value before the legend to get the proper values + displayRampLegend(); + + if(method_index >= 0 && method_index < dock_widget->methodBox->count()) // valid method + { + dock_widget->setEnabled(true); + disableExtremeValue(); // only available after displaying geodesic distances + } + else // no or broken method? + { + dock_widget->setEnabled(false); + dock_widget->methodBox->setEnabled(true); + } + } + +private: + bool displayHeatIntensity(Scene_surface_mesh_item* sm_item, + Scene_polyhedron_selection_item* source_vertices, + const bool use_iDT = false) + { + SMesh& mesh = *sm_item->face_graph(); + + SMesh::Property_map heat_intensity = + mesh.add_property_map("v:HM_Plugin_heat_intensity", 0).first; + + auto initialize_hm_map = [this, sm_item, &mesh] (auto*& hm_ptr, auto& hm_map) -> void + { + using Method = std::decay_t; + + auto it = hm_map.find(sm_item); + if(it != hm_map.end()) // method already exists + { + hm_ptr = it->second; + + for(vertex_descriptor v : vertices(mesh)) + hm_ptr->remove_source(v); + } + else + { + hm_ptr = new Method(mesh); + hm_map[sm_item] = hm_ptr; + } + + connect(sm_item, &Scene_surface_mesh_item::aboutToBeDestroyed, + this, [this, sm_item, &hm_map]() + { + item_source_vertices.left.erase(sm_item); + + auto it = hm_map.find(sm_item); + if(it == hm_map.end()) + return; + delete it->second; + hm_map.erase(it); + }); + }; + + Heat_method* hm = nullptr; + Heat_method_idt* hm_idt = nullptr; + + if(use_iDT) + initialize_hm_map(hm_idt, idt_heat_methods); + else + initialize_hm_map(hm, heat_methods); + + for(auto v : source_vertices->selected_vertices) + { + if(use_iDT) + hm_idt->add_source(v); + else + hm->add_source(v); + } + + if(use_iDT) + hm_idt->estimate_geodesic_distances(heat_intensity); + else + hm->estimate_geodesic_distances(heat_intensity); + + // Post treatment + double max = 0; + for(vertex_descriptor v : vertices(mesh)) + { + double hi = heat_intensity[v]; + if(hi > max) + max = hi; + } + + displayRampLegend(); + + auto [vcolors, vcolors_added] = mesh.add_property_map("v:color", CGAL::IO::Color()); + for(vertex_descriptor v : vertices(mesh)) + { + double h = heat_intensity[v] / max; + CGAL::IO::Color color(255 * color_ramp.r(h), + 255 * color_ramp.g(h), + 255 * color_ramp.b(h)); + vcolors[v] = color; + } + + // Create the colored item + Scene_heat_item* heat_item = new Scene_heat_item(sm_item); + heat_item->setName(tr("%1 (distance isolines)").arg(sm_item->name())); + heat_item->setVisible(false); + + sm_item->invalidateOpenGLBuffers(); + sm_item->setRenderingMode(GouraudPlusEdges); + sm_item->redraw(); + + scene->addItem(heat_item); + scene->setSelectedItem(scene->item_id(sm_item)); + + // any change of sm_item destroys everything + connect(sm_item, &Scene_surface_mesh_item::itemChanged, + this, [this, sm_item, heat_item]() + { + sm_item->resetColors(); + removePluginProperties(sm_item); + scene->erase(scene->item_id(heat_item)); + onItemIndicesSelected(scene->selectionIndices()); + }); + + connect(sm_item, &Scene_surface_mesh_item::aboutToBeDestroyed, + this, [this, heat_item]() + { + scene->erase(scene->item_id(heat_item)); + onItemIndicesSelected(scene->selectionIndices()); + }); + + // here because if it's put above, the setSelectedItem() might reset the value + dock_widget->maxBox->setValue(max); + + return true; + } + +private Q_SLOTS: + void estimateDistances() + { + // Get the mesh and source vertices items + Scene_surface_mesh_item* sm_item = nullptr; + Scene_polyhedron_selection_item* source_vertices = nullptr; + + if(scene->selectionIndices().size() == 1) + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + sm_item = qobject_cast(item); + if(sm_item) + { + // a surface mesh item is selected, an existing associated selection item must exist + source_vertices = item_source_vertices.left.at(sm_item); + } + else + { + // a selection item is selected, an existing associated mesh item must exist + source_vertices = qobject_cast(item); + if(source_vertices) + sm_item = item_source_vertices.right.at(source_vertices); + } + } + else if(scene->selectionIndices().size() == 2) + { + // two items, for (possibly unlinked) sm_item and its associated selection + Scene_item* item1 = scene->item(scene->selectionIndices().front()); + Scene_item* item2 = scene->item(scene->selectionIndices().back()); + sm_item = qobject_cast(item1); + source_vertices = qobject_cast(item2); + if(!sm_item) + { + sm_item = qobject_cast(item2); + source_vertices = qobject_cast(item1); + } + + link_mesh_and_selection(sm_item, source_vertices); + } + else + { + QMessageBox::critical(mw, "Error","Unsupported selection of items."); + return; + } + + CGAL_assertion(sm_item && source_vertices); + + if(!is_triangle_mesh(*sm_item->face_graph())) + { + QApplication::restoreOverrideCursor(); + QMessageBox::critical(mw, "Error","The mesh must be triangulated."); + return; + } + + if(source_vertices->selected_vertices.empty()) + { + QApplication::restoreOverrideCursor(); + QMessageBox::critical(mw, "Error","At least one source vertex is required."); + return; + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + + enableExtremeValue(); + + const std::string& method_name = dock_widget->methodBox->currentText().toStdString(); + if(method_name == "Heat Method") + displayHeatIntensity(sm_item, source_vertices); + else if(method_name == "Heat Method (Intrinsic Delaunay)") + displayHeatIntensity(sm_item, source_vertices, true /*use IDT*/); + + // @todo emit a new SIGNAL on successful coloring, something like "colorChanged()" + // itemChanged is too strong and would conflict with the connection below + sm_item->invalidateOpenGLBuffers(); + sm_item->redraw(); + + QApplication::restoreOverrideCursor(); + } + +private: + void removePluginProperty(Scene_item* item, + const std::string& property_name) + { + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(!sm_item) + return; + + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) + return; + + // Here we only target the property maps added by this plugin, so 'double' is fine + SMesh::Property_map property; + bool found; + std::tie(property, found) = sm->property_map(property_name); + if(found) + sm->remove_property_map(property); + } + + void removePluginProperties(Scene_item* item) + { + removePluginProperty(item, "v:HM_Plugin_heat_intensity"); + } + +private Q_SLOTS: + // deletion of the selection item removes the pair from the map + void link_mesh_and_selection(Scene_surface_mesh_item* sm_item, + Scene_polyhedron_selection_item* source_vertices) + { + item_source_vertices.left.insert(std::make_pair(sm_item, source_vertices)); + + connect(source_vertices, &Scene_polyhedron_selection_item::aboutToBeDestroyed, + this, [this, sm_item]() + { + item_source_vertices.left.erase(sm_item); + onItemIndicesSelected(scene->selectionIndices()); + }); + } + + void createSourceVerticesSelectionItem() + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(!sm_item) + { + QMessageBox::warning(mw, "Warning", "Select a surface mesh to add source vertices"); + dock_widget->createSourceVerticesButton->setChecked(false); + return; + } + + CGAL_assertion(item_source_vertices.left.count(sm_item) == 0); + + Scene_polyhedron_selection_item* source_vertices = new Scene_polyhedron_selection_item(sm_item, mw); + source_vertices->setName(tr("%1 (source vertices)").arg(sm_item->name())); + scene->addItem(source_vertices); + + link_mesh_and_selection(sm_item, source_vertices); + + dock_widget->createSourceVerticesButton->setEnabled(false); + dock_widget->estimateDistancesButton->setEnabled(true); + } + +private Q_SLOTS: + void on_zoomToMaxButton_pressed() + { + Scene_surface_mesh_item* sm_item = nullptr; + if(scene->selectionIndices().size() == 1) + { + Scene_item* item = scene->item(scene->mainSelectionIndex()); + sm_item = qobject_cast(item); + } + else if(scene->selectionIndices().size() == 2) + { + Scene_item* item1 = scene->item(scene->selectionIndices().front()); + Scene_item* item2 = scene->item(scene->selectionIndices().back()); + sm_item = qobject_cast(item1); + if(!sm_item) + sm_item = qobject_cast(item2); + } + + const SMesh& mesh = *(sm_item->face_graph()); + + auto [heat_intensity, found] = mesh.property_map("v:HM_Plugin_heat_intensity"); + CGAL_assertion(found); + + double max = 0; + vertex_descriptor max_v = boost::graph_traits::null_vertex(); + for(vertex_descriptor v : vertices(mesh)) + { + if(heat_intensity[v] > max) + { + max = heat_intensity[v]; + max_v = v; + } + } + + CGAL_assertion(max_v != boost::graph_traits::null_vertex()); + + face_descriptor unused_fd; + Point_3 unused_p; + ::zoomToId(mesh, + QString("v%1").arg(max_v), + getActiveViewer(), + unused_fd, unused_p); + } +}; + +#include "Heat_method_plugin.moc" diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp index 15f65cb1df81..49e21cc66351 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Join_and_split_polyhedra_plugin.cpp @@ -217,7 +217,7 @@ void Polyhedron_demo_join_and_split_polyhedra_plugin::on_actionColorConnectedCom item->computeItemColorVectorAutomatically(true); item->invalidateOpenGLBuffers(); item->setProperty("NbPatchIds", nb_patch_ids); - scene->itemChanged(item); + scene->itemChanged(item); // @todo emits } else { diff --git a/Polyhedron/demo/Polyhedron/SMesh_type.h b/Polyhedron/demo/Polyhedron/SMesh_type.h index f79a819cb9a6..c6fd5020b8ed 100644 --- a/Polyhedron/demo/Polyhedron/SMesh_type.h +++ b/Polyhedron/demo/Polyhedron/SMesh_type.h @@ -7,21 +7,20 @@ #include #include - typedef CGAL::Exact_predicates_inexact_constructions_kernel EPICK; typedef EPICK::Point_3 Point_3; + typedef CGAL::Surface_mesh SMesh; + typedef boost::graph_traits::face_descriptor face_descriptor; typedef boost::graph_traits::vertex_descriptor vertex_descriptor; typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; - namespace boost { template struct property_map, CGAL::vertex_selection_t> { - typedef typename boost::graph_traits >::vertex_descriptor vertex_descriptor; typedef typename CGAL::Surface_mesh

    ::template Property_map type; @@ -32,7 +31,6 @@ struct property_map, CGAL::vertex_selection_t> template struct property_map, CGAL::face_selection_t> { - typedef typename boost::graph_traits >::face_descriptor face_descriptor; typedef typename CGAL::Surface_mesh

    ::template Property_map type; @@ -41,11 +39,11 @@ struct property_map, CGAL::face_selection_t> } // namespace boost - namespace CGAL { template -struct Get_pmap_of_surface_mesh_ { +struct Get_pmap_of_surface_mesh_ +{ typedef typename boost::property_map, Property_tag >::type type; }; diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index c70929ab4a5e..dc601ccbf758 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -172,20 +172,22 @@ Scene::replaceItem(Scene::Item_id index, CGAL::Three::Scene_item* item, bool emi Scene::Item_id Scene::erase(Scene::Item_id index) { - if(index <0 || index >= numberOfEntries()) + if(index < 0 || index >= numberOfEntries()) return -1; CGAL::Three::Scene_item* item = m_entries[index]; + if(qobject_cast(item)) { - setSelectedItemsList(QList()<() << item_id(item)); return erase(selectionIndices()); } + m_groups.removeAll(index); - if(item->parentGroup() - && item->parentGroup()->isChildLocked(item)) + if(item->parentGroup() && item->parentGroup()->isChildLocked(item)) return -1; - //clears the Scene_view + + // clears the Scene_view clear(); index_map.clear(); if(item->parentGroup()) @@ -286,12 +288,12 @@ Scene::erase(QList indices) void Scene::remove_item_from_groups(Scene_item* item) { - CGAL::Three::Scene_group_item* group = item->parentGroup(); - if(group) - { - group->removeChild(item); - children.push_back(item_id(item)); - } + CGAL::Three::Scene_group_item* group = item->parentGroup(); + if(group) + { + group->removeChild(item); + children.push_back(item_id(item)); + } } Scene::~Scene() { @@ -315,19 +317,19 @@ Scene::~Scene() CGAL::Three::Scene_item* Scene::item(Item_id index) const { - return m_entries.value(index); // QList::value checks bounds + return m_entries.value(index); // QList::value checks bounds } Scene::Item_id Scene::item_id(CGAL::Three::Scene_item* scene_item) const { - return m_entries.indexOf(scene_item); + return m_entries.indexOf(scene_item); } int Scene::numberOfEntries() const { - return m_entries.size(); + return m_entries.size(); } // Duplicate a scene item. @@ -335,20 +337,23 @@ Scene::numberOfEntries() const Scene::Item_id Scene::duplicate(Item_id index) { - if(index < 0 || index >= m_entries.size()) - return -1; - - const CGAL::Three::Scene_item* item = m_entries[index]; - CGAL::Three::Scene_item* new_item = item->clone(); - if(new_item) { - new_item->setName(tr("%1 (copy)").arg(item->name())); - new_item->setColor(item->color()); - new_item->setVisible(item->visible()); - addItem(new_item); - return m_entries.size() - 1; - } - else - return -1; + if(index < 0 || index >= m_entries.size()) + return -1; + + const CGAL::Three::Scene_item* item = m_entries[index]; + CGAL::Three::Scene_item* new_item = item->clone(); + if(new_item) + { + new_item->setName(tr("%1 (copy)").arg(item->name())); + new_item->setColor(item->color()); + new_item->setVisible(item->visible()); + addItem(new_item); + return m_entries.size() - 1; + } + else + { + return -1; + } } void Scene::initializeGL(CGAL::Three::Viewer_interface* viewer) @@ -486,33 +491,33 @@ void Scene::initializeGL(CGAL::Three::Viewer_interface* viewer) void Scene::s_itemAboutToBeDestroyed(CGAL::Three::Scene_item *rmv_itm) { - Q_FOREACH(CGAL::Three::Scene_item* item, m_entries) - { - if(item == rmv_itm) - item->itemAboutToBeDestroyed(item); - } + Q_FOREACH(CGAL::Three::Scene_item* item, m_entries) + { + if(item == rmv_itm) + item->itemAboutToBeDestroyed(item); + } } bool -Scene::keyPressEvent(QKeyEvent* e){ - bool res=false; - for (QList::iterator it=selected_items_list.begin(),endit=selected_items_list.end(); - it!=endit;++it) - { - CGAL::Three::Scene_item* item=m_entries[*it]; - res |= item->keyPressEvent(e); - } - return res; +Scene::keyPressEvent(QKeyEvent* e) +{ + bool res = false; + Q_FOREACH(int i, selected_items_list) + { + CGAL::Three::Scene_item* item = m_entries[i]; + res |= item->keyPressEvent(e); + } + return res; } void Scene::draw(CGAL::Three::Viewer_interface* viewer) { - draw_aux(false, viewer); + draw_aux(false, viewer); } void Scene::drawWithNames(CGAL::Three::Viewer_interface* viewer) { - draw_aux(true, viewer); + draw_aux(true, viewer); } bool item_should_be_skipped_in_draw(Scene_item* item) { @@ -615,12 +620,10 @@ void Scene::renderWireScene(const QList &items, viewer->setGlPointSize(2.f); if(index == selected_item || selected_items_list.contains(index)) { - item.selection_changed(true); } else { - item.selection_changed(false); } item.drawEdges(viewer); @@ -1122,12 +1125,14 @@ bool Scene::dropMimeData(const QMimeData * /*data*/, if(group) { Q_FOREACH(int id, selected_items_list) + { if(group->getChildren().contains(id)) { one_contained = true; break; } + } } //if the drop item is not a group_item or if it already contains the item, then the drop action must be ignored if(!group ||one_contained) diff --git a/Polyhedron/demo/Polyhedron/Scene.h b/Polyhedron/demo/Polyhedron/Scene.h index b661ed7baa83..38114309886e 100644 --- a/Polyhedron/demo/Polyhedron/Scene.h +++ b/Polyhedron/demo/Polyhedron/Scene.h @@ -195,8 +195,10 @@ public Q_SLOTS: ++i; } } + //! Sets the target list of indices as the selected indices. - QList setSelectedItemsList(QList l ) + const QList& setSelectedItemIndices(QList l, + const bool do_emit = true) { Q_FOREACH(int i,l) { @@ -206,13 +208,38 @@ public Q_SLOTS: { QList list; Q_FOREACH(Item_id id, group->getChildrenForSelection()) - list<& setSelectedItemList(QList l, + const bool do_emit = true) + { + Q_FOREACH(int i,l) + { + CGAL::Three::Scene_group_item* group = + qobject_cast(item(i)); + if(group) + { + QList list; + Q_FOREACH(Item_id id, group->getChildrenForSelection()) + list << id; + l << setSelectedItemList(list, false /*do not emit*/); + } + } + + selected_items_list = l; + if(do_emit) + Q_EMIT selectionChanged(selected_items_list); + return selected_items_list; } // Accessors (setters) @@ -249,6 +276,8 @@ public Q_SLOTS: void selectionChanged(QList is); //! Used when you don't want to update the selectedItem in the Geometric Objects view. void itemIndexSelected(int i); + //! Used when you don't want to update the selectedItem in the Geometric Objects view. + void itemIndicesSelected(QList is); //! Emit this to reset the collapsed state of all groups after the Geometric Objects view has been redrawn. void restoreCollapsedState(); //! Is emitted when draw() is finished. diff --git a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp index 21a550c6b70c..3d228f88a860 100644 --- a/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_surface_mesh_item.cpp @@ -1175,11 +1175,11 @@ void* Scene_surface_mesh_item_priv::get_aabb_tree() void Scene_surface_mesh_item::select(double orig_x, - double orig_y, - double orig_z, - double dir_x, - double dir_y, - double dir_z) + double orig_y, + double orig_z, + double dir_x, + double dir_y, + double dir_z) { SMesh *sm = d->smesh_; std::size_t vertex_to_emit = 0; @@ -2005,7 +2005,7 @@ void Scene_surface_mesh_item::resetColors() d->has_feature_edges = false; } invalidate(COLORS); - itemChanged(); + itemChanged(); // @fixme really shouldn't call something that strong } QMenu* Scene_surface_mesh_item::contextMenu() @@ -2387,7 +2387,6 @@ void Scene_surface_mesh_item::computeElements() const { d->compute_elements(ALL); setBuffersFilled(true); - const_cast(this)->itemChanged(); } void diff --git a/Polyhedron/demo/Polyhedron/include/id_printing.h b/Polyhedron/demo/Polyhedron/include/id_printing.h index 46d142a24bb0..2418496aa5ea 100644 --- a/Polyhedron/demo/Polyhedron/include/id_printing.h +++ b/Polyhedron/demo/Polyhedron/include/id_printing.h @@ -1,79 +1,96 @@ -#ifndef ID_PRINTING_H -#define ID_PRINTING_H +#ifndef CGAL_POLYHEDRON_DEMO_ID_PRINTING_H +#define CGAL_POLYHEDRON_DEMO_ID_PRINTING_H + #include +#include +#include +#include + #include #include #include -#include -#include + #include #define POINT_SIZE 11 template -struct VKRingPMAP{ - typedef typename boost::graph_traits::vertex_descriptor key_type; - typedef bool value_type; - typedef value_type reference; - typedef boost::read_write_property_map_tag category; - typedef typename boost::property_map::type IDmap; +struct VKRingPMAP +{ + using key_type = typename boost::graph_traits::vertex_descriptor; + using value_type = bool; + using reference = value_type; + using category = boost::read_write_property_map_tag; + + using IDmap = typename boost::property_map::type; std::vector* vec; Mesh* poly; IDmap idmap; VKRingPMAP(std::vector* vec, Mesh* poly) - :vec(vec), poly(poly) + : vec(vec), poly(poly) { idmap = get(boost::vertex_index, *poly); } - friend value_type get(const VKRingPMAP& map, const key_type& v){ + friend value_type get(const VKRingPMAP& map, const key_type& v) + { return (*map.vec)[get(map.idmap, v)]; } - friend void put(VKRingPMAP& map, const key_type& v, const value_type i){ + + friend void put(VKRingPMAP& map, const key_type& v, const value_type i) + { (*map.vec)[get(map.idmap, v)] = i; } }; + template -struct EdgeKRingPMAP{ - typedef typename boost::graph_traits::edge_descriptor key_type; - typedef bool value_type; - typedef value_type reference; - typedef boost::read_write_property_map_tag category; - typedef typename boost::property_map::type IDmap; +struct EdgeKRingPMAP +{ + using key_type = typename boost::graph_traits::edge_descriptor; + using value_type = bool; + using reference = value_type; + using category = boost::read_write_property_map_tag; + + using IDmap = typename boost::property_map::type; std::vector* vec; Mesh* poly; IDmap idmap; EdgeKRingPMAP(std::vector* vec, Mesh* poly) - :vec(vec), poly(poly) + : vec(vec), poly(poly) { idmap = get(boost::halfedge_index, *poly); } - friend value_type get(const EdgeKRingPMAP& map, const key_type& e){ + friend value_type get(const EdgeKRingPMAP& map, const key_type& e) + { return (*map.vec)[get(map.idmap, halfedge(e, *map.poly))/2]; } - friend void put(EdgeKRingPMAP& map, const key_type& e, const value_type i){ + + friend void put(EdgeKRingPMAP& map, const key_type& e, const value_type i) + { (*map.vec)[get(map.idmap, halfedge(e, *map.poly))/2] = i; } }; template -struct FKRingPMAP{ - typedef typename boost::graph_traits::face_descriptor key_type; - typedef bool value_type; - typedef value_type reference; - typedef boost::read_write_property_map_tag category; - typedef typename boost::property_map::type IDmap; +struct FKRingPMAP +{ + using key_type = typename boost::graph_traits::face_descriptor; + using value_type = bool; + using reference = value_type; + using category = boost::read_write_property_map_tag; + + using IDmap = typename boost::property_map::type; std::vector* vec; Mesh* poly; IDmap idmap; FKRingPMAP(std::vector* vec, Mesh* poly) - :vec(vec), poly(poly) + : vec(vec), poly(poly) { idmap = get(boost::face_index, *poly); } @@ -81,7 +98,9 @@ struct FKRingPMAP{ friend value_type get(const FKRingPMAP& map, const key_type& f){ return (*map.vec)[get(map.idmap, f)]; } - friend void put(FKRingPMAP& map, const key_type& f, const value_type i){ + + friend void put(FKRingPMAP& map, const key_type& f, const value_type i) + { (*map.vec)[get(map.idmap, f)] = i; } }; @@ -91,26 +110,28 @@ void deleteIds(CGAL::Three::Viewer_interface* viewer, TextListItem* fitems, std::vector* targeted_ids) { - TextRenderer *renderer = viewer->textRenderer(); + TextRenderer* renderer = viewer->textRenderer(); + for(TextItem* it : vitems->textList()) - delete it; + delete it; for(TextItem* it : eitems->textList()) - delete it; + delete it; for(TextItem* it : fitems->textList()) - delete it; + delete it; + vitems->clear(); renderer->removeTextList(vitems); + eitems->clear(); renderer->removeTextList(eitems); + fitems->clear(); renderer->removeTextList(fitems); + targeted_ids->clear(); viewer->update(); } - - - template bool find_primitive_id(const QPoint& point, Tree* aabb_tree, @@ -118,12 +139,13 @@ bool find_primitive_id(const QPoint& point, Handle& selected_fh, Point& pt_under) { - typedef typename CGAL::Kernel_traits::Kernel Traits; + using Traits = typename CGAL::Kernel_traits::Kernel; + bool found = false; CGAL::qglviewer::Vec point_under = viewer->camera()->pointUnderPixel(point,found); const CGAL::qglviewer::Vec offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); - //find clicked facet + // find clicked facet CGAL::qglviewer::Vec dir; Point ray_origin; if(viewer->camera()->type() == CGAL::qglviewer::Camera::PERSPECTIVE) @@ -151,38 +173,39 @@ bool find_primitive_id(const QPoint& point, if(intersections.empty()) return false; + typename Intersections::iterator closest = intersections.begin(); - const Point* closest_point = - boost::get(&closest->first); - for(typename Intersections::iterator - it = boost::next(intersections.begin()), - end = intersections.end(); - it != end; ++it) - { - if(! closest_point) { + const Point* closest_point = boost::get(&closest->first); + for(typename Intersections::iterator it = boost::next(intersections.begin()), + end = intersections.end(); it != end; ++it) + { + if(! closest_point) + { closest = it; } - else { - const Point* it_point = - boost::get(&it->first); - if(it_point && - (ray_dir * (*it_point - *closest_point)) < 0) + else + { + const Point* it_point = boost::get(&it->first); + if(it_point && (ray_dir * (*it_point - *closest_point)) < 0) { closest = it; closest_point = it_point; } } } + if(!closest_point) return false; + pt_under = Point(point_under.x, point_under.y, point_under.z); selected_fh = closest->second; + return true; } -template +template void compute_displayed_ids(Mesh& mesh, - CGAL::Three::Viewer_interface *viewer, + CGAL::Three::Viewer_interface* viewer, const typename boost::graph_traits::face_descriptor& selected_fh, const Point& pt_under, const CGAL::qglviewer::Vec& offset, @@ -191,21 +214,21 @@ void compute_displayed_ids(Mesh& mesh, TextListItem* fitems, std::vector* targeted_ids) { - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::graph_traits::edge_descriptor edge_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + using halfedge_descriptor = typename boost::graph_traits::halfedge_descriptor; + using edge_descriptor = typename boost::graph_traits::edge_descriptor; + using face_descriptor = typename boost::graph_traits::face_descriptor; - typedef typename boost::property_map::type Ppmap; + using Ppmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); - typedef typename boost::property_map::type VIDmap; + using VIDmap = typename boost::property_map::type; VIDmap vidmap = get(boost::vertex_index, mesh); - typedef typename boost::property_map::type HIDmap; + using HIDmap = typename boost::property_map::type; HIDmap hidmap = get(boost::halfedge_index, mesh); - typedef typename boost::property_map::type FIDmap; + using FIDmap = typename boost::property_map::type; FIDmap fidmap = get(boost::face_index, mesh); QFont font; @@ -214,70 +237,77 @@ void compute_displayed_ids(Mesh& mesh, std::vector displayed_vertices; std::vector displayed_edges; std::vector displayed_faces; - //Test spots around facet to find the closest to point + // Test spots around facet to find the closest to point double min_dist = (std::numeric_limits::max)(); // test the vertices of the closest face for(vertex_descriptor vh : vertices_around_face(halfedge(selected_fh, mesh), mesh)) { - Point test=Point(get(ppmap, vh).x()+offset.x, - get(ppmap, vh).y()+offset.y, - get(ppmap, vh).z()+offset.z); + Point test=Point(get(ppmap, vh).x() + offset.x, + get(ppmap, vh).y() + offset.y, + get(ppmap, vh).z() + offset.z); double dist = CGAL::squared_distance(test, pt_under); - if( dist < min_dist){ + if(dist < min_dist) + { min_dist = dist; displayed_vertices.clear(); displayed_vertices.push_back(vh); } } - QVector3D point( - float(get(ppmap, displayed_vertices[0]).x() + offset.x), - float(get(ppmap, displayed_vertices[0]).y() + offset.y), - float(get(ppmap, displayed_vertices[0]).z() + offset.z)); - //test if we want to erase or not + QVector3D point(float(get(ppmap, displayed_vertices[0]).x() + offset.x), + float(get(ppmap, displayed_vertices[0]).y() + offset.y), + float(get(ppmap, displayed_vertices[0]).z() + offset.z)); + + // test if we want to erase or not for(TextItem* text_item : *targeted_ids) { if(text_item->position() == point) { - //hide and stop + // hide and stop deleteIds(viewer, vitems, eitems, fitems, targeted_ids); return; } } + deleteIds(viewer, vitems, eitems, fitems, targeted_ids); + // test the midpoint of edges of the closest face for(halfedge_descriptor e : halfedges_around_face(halfedge(selected_fh, mesh), mesh)) { - Point test=CGAL::midpoint(get(ppmap, source(e, mesh)),get(ppmap, target(e, mesh))); + Point test = CGAL::midpoint(get(ppmap, source(e, mesh)),get(ppmap, target(e, mesh))); test = Point(test.x()+offset.x, test.y()+offset.y, test.z()+offset.z); double dist = CGAL::squared_distance(test, pt_under); - if(dist < min_dist){ + if(dist < min_dist) + { min_dist = dist; displayed_vertices.clear(); displayed_edges.clear(); displayed_edges.push_back(edge(e, mesh)); } } + // test the centroid of the closest face double x(0), y(0), z(0); int total(0); for(vertex_descriptor vh : vertices_around_face(halfedge(selected_fh, mesh), mesh)) { - x+=get(ppmap, vh).x(); - y+=get(ppmap, vh).y(); - z+=get(ppmap, vh).z(); + x += get(ppmap, vh).x(); + y += get(ppmap, vh).y(); + z += get(ppmap, vh).z(); ++total; } - Point test(x/total+offset.x, - y/total+offset.y, - z/total+offset.z); + Point test(x / total+offset.x, + y / total+offset.y, + z / total+offset.z); + double dist = CGAL::squared_distance(test, pt_under); - if(dist < min_dist){ + if(dist < min_dist) + { min_dist = dist; displayed_vertices.clear(); displayed_edges.clear(); @@ -293,23 +323,21 @@ void compute_displayed_ids(Mesh& mesh, if(f != boost::graph_traits::null_face()) displayed_faces.push_back(f); } + for(halfedge_descriptor h : CGAL::halfedges_around_target(halfedge(displayed_vertices[0], mesh), mesh)) - { displayed_edges.push_back(edge(h, mesh)); - } } else if(!displayed_edges.empty()) { displayed_vertices.push_back(target(halfedge(displayed_edges[0], mesh), mesh)); displayed_vertices.push_back(target(opposite(halfedge(displayed_edges[0], mesh), mesh),mesh)); face_descriptor f1(face(halfedge(displayed_edges[0], mesh),mesh)), - f2(face(opposite(halfedge(displayed_edges[0], mesh), mesh),mesh)); + f2(face(opposite(halfedge(displayed_edges[0], mesh), mesh),mesh)); if(f1 != boost::graph_traits::null_face()) displayed_faces.push_back(f1); if(f2 != boost::graph_traits::null_face()) displayed_faces.push_back(f2); } - else if(!displayed_faces.empty()) { for(halfedge_descriptor h : CGAL::halfedges_around_face(halfedge(displayed_faces[0], mesh), mesh)) @@ -318,7 +346,8 @@ void compute_displayed_ids(Mesh& mesh, displayed_vertices.push_back(target(h, mesh)); } } - //fill TextItems + + // fill TextItems std::vector vertex_selection(false); vertex_selection.resize(num_vertices(mesh)); VKRingPMAP vpmap(&vertex_selection, &mesh); @@ -345,9 +374,7 @@ void compute_displayed_ids(Mesh& mesh, face_selection.resize(num_faces(mesh)); FKRingPMAP fpmap(&face_selection, &mesh); for(face_descriptor f_h : displayed_faces) - { - put(fpmap, f_h, true); - } + put(fpmap, f_h, true); CGAL::expand_face_selection(displayed_faces, mesh, 1, @@ -356,9 +383,9 @@ void compute_displayed_ids(Mesh& mesh, for(vertex_descriptor vh : displayed_vertices) { - Point pos=Point(get(ppmap, vh).x()+offset.x, - get(ppmap, vh).y()+offset.y, - get(ppmap, vh).z()+offset.z); + Point pos = Point(get(ppmap, vh).x() + offset.x, + get(ppmap, vh).y() + offset.y, + get(ppmap, vh).z() + offset.z); TextItem* text_item = new TextItem(float(pos.x()), float(pos.y()), float(pos.z()), @@ -366,13 +393,14 @@ void compute_displayed_ids(Mesh& mesh, vitems->append(text_item); targeted_ids->push_back(text_item); } + for(edge_descriptor e : displayed_edges) { - halfedge_descriptor h(halfedge(e, mesh)); - Point pos=CGAL::midpoint(get(ppmap, source(h, mesh)),get(ppmap, target(h, mesh))); - pos = Point(pos.x()+offset.x, - pos.y()+offset.y, - pos.z()+offset.z); + halfedge_descriptor h(halfedge(e, mesh)); + Point pos = CGAL::midpoint(get(ppmap, source(h, mesh)),get(ppmap, target(h, mesh))); + pos = Point(pos.x() + offset.x, + pos.y() + offset.y, + pos.z() + offset.z); TextItem* text_item = new TextItem(float(pos.x()), float(pos.y()), @@ -387,15 +415,15 @@ void compute_displayed_ids(Mesh& mesh, int total(0); for(vertex_descriptor vh :vertices_around_face(halfedge(f, mesh), mesh)) { - x+=get(ppmap, vh).x(); - y+=get(ppmap, vh).y(); - z+=get(ppmap, vh).z(); + x += get(ppmap, vh).x(); + y += get(ppmap, vh).y(); + z += get(ppmap, vh).z(); ++total; } - Point pos(x/total+offset.x, - y/total+offset.y, - z/total+offset.z); + Point pos(x/total + offset.x, + y/total + offset.y, + z/total + offset.z); TextItem* text_item = new TextItem(float(pos.x()), float(pos.y()), float(pos.z()), @@ -408,18 +436,20 @@ template bool printVertexIds(const Mesh& mesh, TextListItem* vitems) { - typedef typename boost::property_map::const_type Ppmap; - typedef typename boost::property_traits::value_type Point; - typedef typename boost::property_map::type IDmap; + using Ppmap = typename boost::property_map::const_type; + using Point = typename boost::property_traits::value_type; + using IDmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); IDmap idmap = get(boost::vertex_index, mesh); + const CGAL::qglviewer::Vec offset = CGAL::Three::Three::mainViewer()->offset(); + QFont font; font.setBold(true); font.setPointSize(POINT_SIZE); - //fills textItems + // fills textItems for(typename boost::graph_traits::vertex_descriptor vh : vertices(mesh)) { const Point& p = get(ppmap, vh); @@ -429,7 +459,8 @@ bool printVertexIds(const Mesh& mesh, QString("%1").arg(get(idmap, vh)), true, font, Qt::red)); } - //add the QList to the render's pool + + // add the QList to the render's pool bool res = true; Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) { @@ -437,10 +468,9 @@ bool printVertexIds(const Mesh& mesh, renderer->addTextList(vitems); v->update(); if(vitems->size() > static_cast(renderer->getMax_textItems())) - { res = false; - } } + return res; } @@ -448,13 +478,15 @@ template bool printEdgeIds(const Mesh& mesh, TextListItem* eitems) { - typedef typename boost::property_map::const_type Ppmap; - typedef typename boost::property_traits::value_type Point; - typedef typename boost::property_map::type IDmap; + using Ppmap = typename boost::property_map::const_type; + using Point = typename boost::property_traits::value_type; + using IDmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); IDmap idmap = get(boost::halfedge_index, mesh); + const CGAL::qglviewer::Vec offset = CGAL::Three::Three::mainViewer()->offset(); + QFont font; font.setBold(true); font.setPointSize(POINT_SIZE); @@ -468,7 +500,8 @@ bool printEdgeIds(const Mesh& mesh, float((p1.z() + p2.z()) / 2 + offset.z), QString("%1").arg(get(idmap, halfedge(e, mesh)) / 2), true, font, Qt::green)); } - //add the QList to the render's pool + + // add the QList to the render's pool bool res = true; Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) { @@ -476,10 +509,9 @@ bool printEdgeIds(const Mesh& mesh, renderer->addTextList(eitems); v->update(); if(eitems->size() > static_cast(renderer->getMax_textItems())) - { res = false; - } } + return res; } @@ -487,15 +519,18 @@ template bool printFaceIds(const Mesh& mesh, TextListItem* fitems) { - typedef typename boost::property_map::const_type Ppmap; - typedef typename boost::property_map::type IDmap; + using Ppmap = typename boost::property_map::const_type; + using IDmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); IDmap idmap = get(boost::face_index, mesh); + const CGAL::qglviewer::Vec offset = CGAL::Three::Three::mainViewer()->offset(); + QFont font; font.setBold(true); font.setPointSize(POINT_SIZE); + for(typename boost::graph_traits::face_descriptor fh : faces(mesh)) { double x(0), y(0), z(0); @@ -513,7 +548,8 @@ bool printFaceIds(const Mesh& mesh, float(z / total + offset.z), QString("%1").arg(get(idmap, fh)), true, font, Qt::blue)); } - //add the QList to the render's pool + + // add the QList to the render's pool bool res = true; Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) { @@ -521,9 +557,7 @@ bool printFaceIds(const Mesh& mesh, renderer->addTextList(fitems); v->update(); if(fitems->size() > static_cast(renderer->getMax_textItems())) - { res = false; - } } return res; } @@ -535,14 +569,15 @@ int zoomToId(const Mesh& mesh, typename boost::graph_traits::face_descriptor& selected_fh, Point& p) { - typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; - typedef typename boost::property_map::const_type Ppmap; - typedef typename boost::property_map::type VIDmap; - typedef typename boost::property_map::type EIDmap; - typedef typename boost::property_map::type FIDmap; - typedef typename CGAL::Kernel_traits::Kernel Traits; + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + using face_descriptor = typename boost::graph_traits::face_descriptor; + using Ppmap = typename boost::property_map::const_type; + using VIDmap = typename boost::property_map::type; + using EIDmap = typename boost::property_map::type; + using FIDmap = typename boost::property_map::type; + + using Traits = typename CGAL::Kernel_traits::Kernel; Ppmap ppmap = get(boost::vertex_point, mesh); VIDmap vidmap = get(boost::vertex_index, mesh); @@ -555,10 +590,11 @@ int zoomToId(const Mesh& mesh, if((first != QString("v") && first != QString("e") && first != QString("f")) || - !is_int) + !is_int) { return 1; //("Input must be of the form [v/e/f][int]" } + const CGAL::qglviewer::Vec offset = viewer->offset(); typename Traits::Vector_3 normal; if(first == QString("v")) @@ -567,26 +603,25 @@ int zoomToId(const Mesh& mesh, for(vertex_descriptor vh : vertices(mesh)) { std::size_t cur_id = get(vidmap, vh); - if( cur_id == id) + if(cur_id == id) { p = Point(get(ppmap, vh).x() + offset.x, get(ppmap, vh).y() + offset.y, get(ppmap, vh).z() + offset.z); + typename boost::graph_traits::halfedge_descriptor hf = halfedge(vh, mesh); if(CGAL::is_border(hf, mesh)) - { hf = opposite(hf, mesh); - } + selected_fh = face(hf, mesh); normal = CGAL::Polygon_mesh_processing::compute_vertex_normal(vh, mesh); found = true; break; } } + if(!found) - { - return 2;//"No vertex with id %1").arg(id) - } + return 2; // "No vertex with id %1").arg(id) } else if(first == QString("e")) { @@ -604,10 +639,10 @@ int zoomToId(const Mesh& mesh, typename Traits::Vector_3 normal1(0,0,0); if(!is_border(hf, mesh)) { - normal1= CGAL::Polygon_mesh_processing::compute_face_normal(face(hf,mesh), - mesh); + normal1 = CGAL::Polygon_mesh_processing::compute_face_normal(face(hf,mesh), mesh); selected_fh = face(hf, mesh); } + typename Traits::Vector_3 normal2(0,0,0); if(!is_border(opposite(hf, mesh), mesh)) { @@ -615,15 +650,15 @@ int zoomToId(const Mesh& mesh, mesh); selected_fh = face(hf, mesh); } - normal = 0.5*normal1+0.5*normal2; + + normal = 0.5*normal1 + 0.5*normal2; found = true; break; } } + if(!found) - { - return 3;//"No edge with id %1").arg(id) - } + return 3; // "No edge with id %1").arg(id) } else if(first == QString("f")) { @@ -634,30 +669,30 @@ int zoomToId(const Mesh& mesh, { if(get(fidmap, fh) != id) continue; + for(vertex_descriptor vh : vertices_around_face(halfedge(fh, mesh), mesh)) { - x+=get(ppmap, vh).x(); - y+=get(ppmap, vh).y(); - z+=get(ppmap, vh).z(); + x += get(ppmap, vh).x(); + y += get(ppmap, vh).y(); + z += get(ppmap, vh).z(); ++total; } + p = Point(x/total + offset.x, - y/total + offset.y, - z/total + offset.z); - normal = CGAL::Polygon_mesh_processing::compute_face_normal( - fh, - mesh); + y/total + offset.y, + z/total + offset.z); + normal = CGAL::Polygon_mesh_processing::compute_face_normal(fh, mesh); selected_fh = fh; found = true; break; } + if(!found) - { - return 4; //"No face with id %1").arg(id) - } + return 4; // "No face with id %1").arg(id) } + CGAL::qglviewer::Quaternion new_orientation(CGAL::qglviewer::Vec(0,0,-1), - CGAL::qglviewer::Vec(-normal.x(), -normal.y(), -normal.z())); + CGAL::qglviewer::Vec(-normal.x(), -normal.y(), -normal.z())); Point new_pos = p + 0.25*CGAL::qglviewer::Vec( viewer->camera()->position().x - viewer->camera()->pivotPoint().x, @@ -665,19 +700,69 @@ int zoomToId(const Mesh& mesh, viewer->camera()->position().z - viewer->camera()->pivotPoint().z) .norm() * normal ; - viewer->camera()->setPivotPoint(CGAL::qglviewer::Vec(p.x(), - p.y(), - p.z())); + viewer->camera()->setPivotPoint(CGAL::qglviewer::Vec(p.x(), p.y(), p.z())); viewer->moveCameraToCoordinates(QString("%1 %2 %3 %4 %5 %6 %7").arg(new_pos.x()) - .arg(new_pos.y()) - .arg(new_pos.z()) - .arg(new_orientation[0]) - .arg(new_orientation[1]) - .arg(new_orientation[2]) - .arg(new_orientation[3])); + .arg(new_pos.y()) + .arg(new_pos.z()) + .arg(new_orientation[0]) + .arg(new_orientation[1]) + .arg(new_orientation[2]) + .arg(new_orientation[3])); viewer->update(); - return 0; //all clear; + + return 0; // all clear; } -#endif // ID_PRINTING_H + +template +int zoomToPoint(const PointSet& ps, + const typename PointSet::Index& index, + CGAL::Three::Viewer_interface* viewer, + typename PointSet::Point_3& p) +{ + const CGAL::qglviewer::Vec offset = viewer->offset(); + + using Point_3 = typename PointSet::Point_3; + using Vector_3 = typename PointSet::Vector_3; + + const Point_3& op = ps.point(index); + + p = Point_3(op.x() + offset.x, + op.y() + offset.y, + op.z() + offset.z); + + Vector_3 normal; + if(ps.has_normal_map()) + normal = ps.normal(index); + else + normal = { viewer->camera()->position().x - viewer->camera()->pivotPoint().x, + viewer->camera()->position().y - viewer->camera()->pivotPoint().y, + viewer->camera()->position().z - viewer->camera()->pivotPoint().z }; + + Point_3 new_pos = p + + 0.25 * CGAL::qglviewer::Vec( + viewer->camera()->position().x - viewer->camera()->pivotPoint().x, + viewer->camera()->position().y - viewer->camera()->pivotPoint().y, + viewer->camera()->position().z - viewer->camera()->pivotPoint().z) + .norm() * normal ; + + viewer->camera()->setPivotPoint(CGAL::qglviewer::Vec(p.x(), p.y(), p.z())); + + CGAL::qglviewer::Quaternion new_orientation(CGAL::qglviewer::Vec(0,0,-1), + CGAL::qglviewer::Vec(-normal.x(), -normal.y(), -normal.z())); + + viewer->moveCameraToCoordinates(QString("%1 %2 %3 %4 %5 %6 %7").arg(new_pos.x()) + .arg(new_pos.y()) + .arg(new_pos.z()) + .arg(new_orientation[0]) + .arg(new_orientation[1]) + .arg(new_orientation[2]) + .arg(new_orientation[3])); + + viewer->update(); + + return 0; +} + +#endif // CGAL_POLYHEDRON_DEMO_ID_PRINTING_H diff --git a/Polyhedron/demo/Polyhedron/triangulate_primitive.h b/Polyhedron/demo/Polyhedron/triangulate_primitive.h index c80ceb08acac..cf7aa8a457bb 100644 --- a/Polyhedron/demo/Polyhedron/triangulate_primitive.h +++ b/Polyhedron/demo/Polyhedron/triangulate_primitive.h @@ -1,234 +1,246 @@ -#ifndef TRIANGULATE_PRIMITIVE -#define TRIANGULATE_PRIMITIVE +#ifndef CGAL_DEMO_TRIANGULATE_PRIMITIVE_H +#define CGAL_DEMO_TRIANGULATE_PRIMITIVE_H + +#include + #include #include #include + #include -#include -#include #include -//Make sure all the facets are triangles +#include +#include + +#include +#include +#include + +// Ensure that all the facets are triangles +// @todo just use PMP::triangulate_face()...? +// or at least mark_faces_in_domain() + template class FacetTriangulator { - typedef Kernel Traits; +public: + using Traits = Kernel; + using Point = typename Kernel::Point_3; + using Vector = typename Kernel::Vector_3; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + using P_traits = CGAL::Projection_traits_3; - typedef typename Kernel::Vector_3 Vector; + using halfedge_descriptor = typename boost::graph_traits::halfedge_descriptor; + using face_descriptor = typename boost::graph_traits::face_descriptor; + struct Face_info + { + typename boost::graph_traits::halfedge_descriptor e[3]; + bool is_external; + }; - typedef CGAL::Projection_traits_3 P_traits; + using Vb = CGAL::Triangulation_vertex_base_with_info_2; + using Fbb = CGAL::Triangulation_face_base_with_info_2; + using Fb = CGAL::Constrained_triangulation_face_base_2; + using TDS = CGAL::Triangulation_data_structure_2; + using Itag = CGAL::Exact_predicates_tag; + using CDT = CGAL::Constrained_Delaunay_triangulation_2; - typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; + using Vertex_handle = typename CDT::Vertex_handle; + using Face_handle = typename CDT::Face_handle; - struct Face_info { - typename boost::graph_traits::halfedge_descriptor e[3]; - bool is_external; - }; + struct PointAndId + { + Point point; + Index_type id; + PointAndId() = default; + PointAndId(const Point& point, const Index_type id) : point(point), id(id) { } + }; - typedef CGAL::Triangulation_face_base_with_info_2 Fb1; - typedef CGAL::Constrained_triangulation_face_base_2 Fb; - typedef CGAL::Triangulation_data_structure_2 TDS; - typedef CGAL::Exact_predicates_tag Itag; +public: + CDT* cdt; + CGAL::Unique_hash_map v2v; public: - struct PointAndId { - typename Kernel::Point_3 point; - Index_type id; - }; - - typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; - CDT *cdt; - CGAL::Unique_hash_map v2v; - - //Constructor - FacetTriangulator(typename boost::graph_traits::face_descriptor fd, + // Constructor + FacetTriangulator(face_descriptor fd, const Vector& normal, - Mesh *poly, + Mesh* poly, Vector offset = Vector(0,0,0)) { std::vector idPoints; - for(halfedge_descriptor he_circ : halfedges_around_face( halfedge(fd, *poly), *poly)) - { - PointAndId idPoint; - idPoint.point = get(boost::vertex_point,*poly,source(he_circ, *poly))+offset; - idPoint.id = source(he_circ, *poly); - idPoints.push_back(idPoint); + for(halfedge_descriptor he_circ : halfedges_around_face(halfedge(fd, *poly), *poly)) + idPoints.emplace_back(get(CGAL::vertex_point, *poly, source(he_circ, *poly)) + offset, + source(he_circ, *poly)); - } if(!triangulate(idPoints, normal)) - std::cerr<<"Facet not displayed"<::face_descriptor fd, - const std::vector& more_points, + + FacetTriangulator(face_descriptor fd, + const std::vector& more_points, const Vector& normal, - Mesh *poly, + Mesh* poly, Vector offset = Vector(0,0,0)) { - std::vector idPoints; - for(halfedge_descriptor he_circ : halfedges_around_face( halfedge(fd, *poly), *poly)) - { - PointAndId idPoint; - idPoint.point = get(boost::vertex_point,*poly,source(he_circ, *poly))+offset; - idPoint.id = source(he_circ, *poly); - idPoints.push_back(idPoint); - - } - if(!triangulate_with_points(idPoints,more_points, normal)) - std::cerr<<"Facet not displayed"< idPoints; + for(halfedge_descriptor he_circ : halfedges_around_face(halfedge(fd, *poly), *poly)) + idPoints.emplace_back(get(CGAL::vertex_point, *poly, source(he_circ, *poly)) + offset, + source(he_circ, *poly)); + + if(!triangulate_with_points(idPoints, more_points, normal)) + std::cerr << "Facet not displayed" << std::endl; } - FacetTriangulator(std::vector &idPoints, - const Vector& normal) + FacetTriangulator(std::vector& idPoints, + const Vector& normal) { if(!triangulate(idPoints, normal)) - std::cerr<<"Facet not displayed"< &idPoints, - const std::vector& more_points, + FacetTriangulator(std::vector& idPoints, + const std::vector& more_points, const Vector& normal) { - if(!triangulate_with_points(idPoints, more_points, normal)) - std::cerr<<"Facet not displayed"< &idPoints, - const Vector& normal ) + bool triangulate(std::vector& idPoints, + const Vector& normal) { P_traits cdt_traits(normal); cdt = new CDT(cdt_traits); - typename CDT::Vertex_handle previous, first, last_inserted; + + Vertex_handle previous, first, last_inserted; // Iterate the points of the facet and decide if they must be inserted in the CDT typename Kernel::FT x(0), y(0), z(0); - for(PointAndId idPoint : idPoints) + for(const PointAndId& idPoint : idPoints) { - x += idPoint.point.x(); - y += idPoint.point.y(); - z += idPoint.point.z(); - typename CDT::Vertex_handle vh; - //Always insert the first point, then only insert - // if the distance with the previous is reasonable. - if(first == typename CDT::Vertex_handle() || idPoint.point != previous->point()) - { - vh = cdt->insert(idPoint.point); - v2v[vh] = idPoint.id; - if(first == typename CDT::Vertex_handle()) { - first = vh; - } - if(previous != nullptr && previous != vh) { - cdt->insert_constraint(previous, vh); - last_inserted = previous; - } - previous = vh; - } + y += idPoint.point.y(); + z += idPoint.point.z(); + + Vertex_handle vh; + // Always insert the first point, then only insert if the distance with the previous is reasonable. + if(first == Vertex_handle() || idPoint.point != previous->point()) + { + vh = cdt->insert(idPoint.point); + v2v[vh] = idPoint.id; + if(first == Vertex_handle()) + first = vh; + + if(previous != nullptr && previous != vh) + { + cdt->insert_constraint(previous, vh); + last_inserted = previous; + } + previous = vh; + } } - if(last_inserted == typename CDT::Vertex_handle()) + + if(last_inserted == Vertex_handle()) return false; + if(previous != first) cdt->insert_constraint(previous, first); + // sets mark is_external - for(typename CDT::All_faces_iterator - fit2 = cdt->all_faces_begin(), - end = cdt->all_faces_end(); - fit2 != end; ++fit2) - { - fit2->info().is_external = false; - } - //check if the facet is external or internal + for(Face_handle f2 : cdt->all_face_handles()) + f2->info().is_external = false; + + // check if the facet is external or internal std::queue face_queue; face_queue.push(cdt->infinite_vertex()->face()); - while(! face_queue.empty() ) { + while(! face_queue.empty()) + { typename CDT::Face_handle fh = face_queue.front(); face_queue.pop(); - if(fh->info().is_external) continue; + if(fh->info().is_external) + continue; + fh->info().is_external = true; - for(int i = 0; i <3; ++i) { + for(int i = 0; i <3; ++i) + { if(!cdt->is_constrained(std::make_pair(fh, i))) - { face_queue.push(fh->neighbor(i)); - } } } + return true; } - bool triangulate_with_points( std::vector &idPoints, - const std::vector& more_points, - const Vector& normal) - { - P_traits cdt_traits(normal); - cdt = new CDT(cdt_traits); - typename CDT::Vertex_handle previous, first, last_inserted; - // Iterate the points of the facet and decide if they must be inserted in the CDT - for(PointAndId idPoint : idPoints) - { - typename CDT::Vertex_handle vh; - //Always insert the first point, then only insert - // if the distance with the previous is reasonable. - if(first == typename CDT::Vertex_handle() || idPoint.point != previous->point()) + bool triangulate_with_points(std::vector& idPoints, + const std::vector& more_points, + const Vector& normal) + { + P_traits cdt_traits(normal); + cdt = new CDT(cdt_traits); + + // Iterate the points of the facet and decide if they must be inserted in the CDT + Vertex_handle previous, first, last_inserted; + for(const PointAndId& idPoint : idPoints) + { + Vertex_handle vh; + // Always insert the first point, then only insert if the distance with the previous is reasonable. + if(first == Vertex_handle() || idPoint.point != previous->point()) { vh = cdt->insert(idPoint.point); v2v[vh] = idPoint.id; - if(first == typename CDT::Vertex_handle()) { + if(first == Vertex_handle()) first = vh; - } - if(previous != nullptr && previous != vh) { + + if(previous != nullptr && previous != vh) + { cdt->insert_constraint(previous, vh); last_inserted = previous; } - previous = vh; + previous = vh; + } + } + + if(last_inserted == Vertex_handle()) + return false; + + cdt->insert_constraint(previous, first); + for(const Point& point : more_points) + cdt->insert(point); + + // sets mark is_external + for(Face_handle f2 : cdt->all_face_handles()) + f2->info().is_external = false; + + // check if the facet is external or internal + std::queue face_queue; + face_queue.push(cdt->infinite_vertex()->face()); + while(!face_queue.empty()) + { + typename CDT::Face_handle fh = face_queue.front(); + face_queue.pop(); + if(fh->info().is_external) + continue; + fh->info().is_external = true; + for(int i = 0; i <3; ++i) + { + if(!cdt->is_constrained(std::make_pair(fh, i))) + face_queue.push(fh->neighbor(i)); } - } - if(last_inserted == typename CDT::Vertex_handle()) - return false; - cdt->insert_constraint(previous, first); - for(typename Kernel::Point_3 point : more_points) - { - cdt->insert(point); - } - // sets mark is_external - for(typename CDT::All_faces_iterator - fit2 = cdt->all_faces_begin(), - end = cdt->all_faces_end(); - fit2 != end; ++fit2) - { - fit2->info().is_external = false; - } - //check if the facet is external or internal - std::queue face_queue; - face_queue.push(cdt->infinite_vertex()->face()); - while(! face_queue.empty() ) { - typename CDT::Face_handle fh = face_queue.front(); - face_queue.pop(); - if(fh->info().is_external) continue; - fh->info().is_external = true; - for(int i = 0; i <3; ++i) { - if(!cdt->is_constrained(std::make_pair(fh, i))) - { - face_queue.push(fh->neighbor(i)); - } - } - } - return true; + } + + return true; } }; -#endif // TRIANGULATE_PRIMITIVE +#endif // CGAL_DEMO_TRIANGULATE_PRIMITIVE_H diff --git a/Three/include/CGAL/Three/Scene_interface.h b/Three/include/CGAL/Three/Scene_interface.h index e60049c91a0a..64441fe197db 100644 --- a/Three/include/CGAL/Three/Scene_interface.h +++ b/Three/include/CGAL/Three/Scene_interface.h @@ -58,7 +58,6 @@ namespace Three{ * */ class Scene_interface { public: - //!A bounding box is a box with each face corresponding to an extremum of its contents. typedef CGAL::Bbox_3 Bbox; diff --git a/Three/include/CGAL/Three/Scene_item.h b/Three/include/CGAL/Three/Scene_item.h index f22b9be5f52d..c7920cbefed8 100644 --- a/Three/include/CGAL/Three/Scene_item.h +++ b/Three/include/CGAL/Three/Scene_item.h @@ -81,7 +81,7 @@ class SCENE_ITEM_EXPORT Scene_item : public QObject{ PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. - PROGRAM_HEAT_INTENSITY, //! Used to render special item in Display_property_plugin + PROGRAM_HEAT_INTENSITY, //! Used to render special item in Heat_method_plugin NB_OF_PROGRAMS //! Holds the number of different programs in this enum. }; typedef CGAL::Bbox_3 Bbox; diff --git a/Three/include/CGAL/Three/Viewer_interface.h b/Three/include/CGAL/Three/Viewer_interface.h index c1330a12301f..2bdba0aadd39 100644 --- a/Three/include/CGAL/Three/Viewer_interface.h +++ b/Three/include/CGAL/Three/Viewer_interface.h @@ -70,7 +70,7 @@ class VIEWER_EXPORT Viewer_interface : public CGAL::QGLViewer{ PROGRAM_OLD_FLAT, /** Used to render flat shading without pre computing normals without geometry shader*/ PROGRAM_SOLID_WIREFRAME, //! Used to render edges with width superior to 1. PROGRAM_NO_INTERPOLATION, //! Used to render faces without interpolating their color. - PROGRAM_HEAT_INTENSITY, //! Used to render special item in Display_property_plugin + PROGRAM_HEAT_INTENSITY, //! Used to render special item in Heat_method_plugin PROGRAM_TETRA_FILTERING, //! Used in Scene_tetrahedra_item with Tetrahedra_filtering_plugin NB_OF_PROGRAMS //! Holds the number of different programs in this enum. }; From 96ce2a28afde8747435ed68c9cec6206864becf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 21 Jun 2023 14:36:17 +0200 Subject: [PATCH 0390/1398] Apply suggestion from @lrineau --- .../Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp index bbee40716425..a105d1ba12e4 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp @@ -485,7 +485,7 @@ public Q_SLOTS: // This is for the message box and thread interruption void wrapping_done(Wrapper_thread* wrapper_thread) { - Scene_surface_mesh_item* wrap_item = new Scene_surface_mesh_item(wrapper_thread->wrap); + Scene_surface_mesh_item* wrap_item = new Scene_surface_mesh_item(std::move(wrapper_thread->wrap)); wrap_item->setName(tr("Wrap with alpha %2 offset %3").arg(wrapper_thread->alpha) .arg(wrapper_thread->offset)); wrap_item->setColor(Qt::gray); From e4d98ef92a1dcc81e0fae1cfe7ad5f0cd6652040 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 21 Jun 2023 15:32:58 +0200 Subject: [PATCH 0391/1398] add an example for cmap insert cell 1 between two cells 2 --- .../Combinatorial_map/map_3_insert.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Combinatorial_map/examples/Combinatorial_map/map_3_insert.cpp diff --git a/Combinatorial_map/examples/Combinatorial_map/map_3_insert.cpp b/Combinatorial_map/examples/Combinatorial_map/map_3_insert.cpp new file mode 100644 index 000000000000..4963fcb23a70 --- /dev/null +++ b/Combinatorial_map/examples/Combinatorial_map/map_3_insert.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +typedef CGAL::Combinatorial_map<3> CMap_3; +typedef CMap_3::Dart_descriptor Dart_descriptor; + +int main() +{ + CMap_3 cm; + + // Create one combinatorial hexahedron + Dart_descriptor d1 = cm.make_combinatorial_hexahedron(); + + // Create one square face + Dart_descriptor d2=cm.make_combinatorial_polygon(4); + + assert(cm.is_insertable_cell_1_between_two_cells_2(d1,d2)); + + // Insert the square face as a hole of the face of the hexahedron containing d1 + cm.insert_cell_1_between_two_cells_2(d1, d2); + + // Display the combinatorial map characteristics. + cm.display_characteristics(std::cout)<<", valid=" + <(dh)) ++nb; } + std::cout<<"Number of 2-free darts: "< Date: Wed, 21 Jun 2023 15:33:03 +0200 Subject: [PATCH 0392/1398] add one example in the user manual --- .../doc/Combinatorial_map/Combinatorial_map.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 2e36037ea231..0ff995a3cddb 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -393,6 +393,8 @@ Example of \link GenericMap::insert_cell_1_in_cell_2 `insert_cell_1_in_cell_2`\e `cm.`\link GenericMap::insert_dangling_cell_1_in_cell_2 `insert_dangling_cell_1_in_cell_2(d0)`\endlink adds a 1-cell in the 2-cell containing dart `d0`, the 1-cell being attached by only one of its vertex to the 0-cell containing dart `d0`. This operation is possible if `d0`\f$ \in \f$ \link GenericMap::darts `cm.darts()`\endlink. +`cm.`\link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2(d1,d2)`\endlink adds a 1-cell between the two faces containing containing darts `d1` and `d2`, between the two 0-cells containing darts `d1` and `d2`. The 2-cells are merged in one. This operation is possible if d1\f$ \not \in \f$ \f$ \langle{}\f$\f$ \beta_1\f$\f$ \rangle{}\f$(d2) which can be tested thanks to `cm.`\link GenericMap::is_insertable_cell_1_between_two_cells_2 `is_insertable_cell_1_between_two_cells_2(d1,d2)`\endlink. + `cm.`\link GenericMap::insert_cell_2_in_cell_3 `insert_cell_2_in_cell_3(itbegin,itend)`\endlink adds a 2-cell in the 3-cell containing all the darts between `itbegin` and `itend`, along the path of 1-cells containing darts in [`itbegin`,`itend`). The 3-cell is split in two. This operation is possible if all the darts in [`itbegin`,`itend`) form a closed path inside a same 3-cell which can be tested thanks to `cm.`\link GenericMap::is_insertable_cell_2_in_cell_3 `is_insertable_cell_2_in_cell_3(itbegin,itend)`\endlink (see example on \cgalFigureRef{fig_cmap_insert_facet}). \cgalFigureBegin{fig_cmap_insert_facet,cmap_insert_facet.svg} @@ -456,6 +458,20 @@ The second line is the result after the removal operations. We retrieve the orig Example of high level operations. Left: Initial 3D combinatorial map after the creation of the combinatorial hexahedron. Middle: Combinatorial map obtained after the two 1-cell insertions. The two 2-cells were split in two. Right: Combinatorial map obtained after the 2-cell insertion. The 3-cell was split in two. \cgalFigureEnd +\subsection Combinatorial_mapHighLevelOperations Insert an edge between two different faces + +\anchor ssecexempleinsertion + +This example shows the use of \link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2`\endlink operation. First we create a combinatorial hexahedron and a face with 4 edges. This face is inserted in the face of the hexahedron containing dart d1. We display the characteristics of the combinatorial map and check its validity. Then we count and display the number of 2-free darts. + +The output is: +\verbatim +#Darts=30, #0-cells=12, #1-cells=17, #2-cells=6, #3-cells=1, #ccs=1, valid=1 +Number of 2-free darts: 4 +\endverbatim + +We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 4 2-free darts, which are the 4 darts of the squared face. Since they bounded an hole, there is no face filling the hole and thus there 4 darts are 2-free. + \subsection Combinatorial_mapA4DGenericMap A 4D Combinatorial Map In this example, a 4-dimensional combinatorial map is used. Two tetrahedral cells are created and sewn by \f$ \beta_4\f$. Then the numbers of cells of the combinatorial map are displayed, and its validity is checked. From 24b38f2d93cef2236193dced6b51864d2344231d Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 21 Jun 2023 15:34:39 +0200 Subject: [PATCH 0393/1398] add example --- Combinatorial_map/doc/Combinatorial_map/examples.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Combinatorial_map/doc/Combinatorial_map/examples.txt b/Combinatorial_map/doc/Combinatorial_map/examples.txt index ce72b6a64a2b..c77e4e6c5221 100644 --- a/Combinatorial_map/doc/Combinatorial_map/examples.txt +++ b/Combinatorial_map/doc/Combinatorial_map/examples.txt @@ -6,4 +6,5 @@ \example Combinatorial_map/map_3_with_colored_facets.cpp \example Combinatorial_map/map_3_dynamic_onmerge.cpp \example Combinatorial_map/map_3_index.cpp +\example Combinatorial_map/map_3_insert.cpp */ From 8fb08a14055a3bf515398136edff281c736c5cac Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 21 Jun 2023 15:37:11 +0200 Subject: [PATCH 0394/1398] Update changes.md --- Installation/CHANGES.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index c4ce7a51d6d1..229d1145c8a3 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1,6 +1,15 @@ Release History =============== +[Release 6.0](https://github.com/CGAL/cgal/releases/tag/v6.0) +----------- + +Release date: XXX + +### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) + +- Added the function `insert_cell_1_between_two_cells_2()` to the `GenericMap` concept, which enables users to insert an edge between two different faces in order to create faces with holes. + [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- From 4798874609572913e41a863919132855437e9caa Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 21 Jun 2023 15:44:56 +0200 Subject: [PATCH 0395/1398] add the example and update the anchor --- Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 0ff995a3cddb..6b95790b57be 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -458,12 +458,14 @@ The second line is the result after the removal operations. We retrieve the orig Example of high level operations. Left: Initial 3D combinatorial map after the creation of the combinatorial hexahedron. Middle: Combinatorial map obtained after the two 1-cell insertions. The two 2-cells were split in two. Right: Combinatorial map obtained after the 2-cell insertion. The 3-cell was split in two. \cgalFigureEnd -\subsection Combinatorial_mapHighLevelOperations Insert an edge between two different faces +\subsection Combinatorial_mapInsertion Insert an edge between two different faces \anchor ssecexempleinsertion This example shows the use of \link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2`\endlink operation. First we create a combinatorial hexahedron and a face with 4 edges. This face is inserted in the face of the hexahedron containing dart d1. We display the characteristics of the combinatorial map and check its validity. Then we count and display the number of 2-free darts. +\cgalExample{Combinatorial_map/map_3_insert.cpp} + The output is: \verbatim #Darts=30, #0-cells=12, #1-cells=17, #2-cells=6, #3-cells=1, #ccs=1, valid=1 From 61a39cc95bcf5a0e72e1f13d2e921423c24bc04b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 22 Jun 2023 10:11:24 +0200 Subject: [PATCH 0396/1398] disable MSVC 2015 starting with CGAL 6.0 --- .../run_testsuite_with_ctest | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index 8c93c47f0747..9c47517049e1 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -105,6 +105,13 @@ collect_all_current_platforms() build_platforms_list() { for LOCAL_PLATFORM in $1; do + # MSVC2015 does not support C++17 + if [ $1 \> "CGAL-6.0" ]; then + if [ "LOCAL_PLATFORM" = "MSVC2015-Release-64bits" ]; then + continue + fi + fi + if [ "${LOCAL_PLATFORM}" = "all" ] ; then USE_REFERENCE_PLATFORMS='y' else @@ -116,7 +123,7 @@ build_platforms_list() # ---------------------------------------------------------------------------------------- # Sets up the variables indicating the directories to use. -# Crates all platform directories under the current release binary folder. +# Creates all platform directories under the current release binary folder. # ---------------------------------------------------------------------------------------- setup_dirs() { @@ -170,8 +177,8 @@ setup_dirs() # directories existing in the reference release are added to $PLATFORMS # PLATFORMS="" - build_platforms_list "`value_of BUILD_ON_${HOST}`" - build_platforms_list "`value_of COMPILERS_${HOST}`" + build_platforms_list "`value_of BUILD_ON_${HOST}`" "${CGAL_RELEASE_ID}" + build_platforms_list "`value_of COMPILERS_${HOST}`" "${CGAL_RELEASE_ID}" if [ -n "${USE_REFERENCE_PLATFORMS}" ]; then collect_all_reference_platforms @@ -214,17 +221,17 @@ put_demos_on_web() collect_demos_binaries() { PLATFORM=${1} - + cd "${CGAL_TEST_DIR}" echo "COLLECT_DEMOS_BINARIES=$COLLECT_DEMOS_BINARIES" if [ -n "$COLLECT_DEMOS_BINARIES" ]; then echo 'COLLECTING DEMOS BINARIES' - + DEMOS_TEST_DIR="${CGAL_DIR}/cmake/platforms/${PLATFORM}/test" cp "${CGAL_DIR}/${SCRIPTS_DIR}developer_scripts/cgal_demo_copy_all_dlls_cygwin.sh" "${DEMOS_TEST_DIR}" - + cd ${DEMOS_TEST_DIR} for demo_dir in *_Demo; do From 98e3dbb6e372732741f3400be83c6974a5cbde12 Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Thu, 22 Jun 2023 10:26:19 +0200 Subject: [PATCH 0397/1398] D'oh! Co-authored-by: Laurent Rineau --- Scripts/developer_scripts/run_testsuite_with_ctest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index 9c47517049e1..b86a5b9f705e 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -106,7 +106,7 @@ build_platforms_list() { for LOCAL_PLATFORM in $1; do # MSVC2015 does not support C++17 - if [ $1 \> "CGAL-6.0" ]; then + if [ $2 \> "CGAL-6.0" ]; then if [ "LOCAL_PLATFORM" = "MSVC2015-Release-64bits" ]; then continue fi From a2ab7a2090532ff7f75f0ef7ae9934dad9ea2007 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 10:47:28 +0200 Subject: [PATCH 0398/1398] Small corrections in the doc --- Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt | 2 +- Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 6b95790b57be..08afd5085870 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -472,7 +472,7 @@ The output is: Number of 2-free darts: 4 \endverbatim -We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 4 2-free darts, which are the 4 darts of the squared face. Since they bounded an hole, there is no face filling the hole and thus there 4 darts are 2-free. +We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 4 2-free darts, which are the 4 darts of the squared face. Since they bound an hole, there is no face filling the hole and thus 4 darts are 2-free. \subsection Combinatorial_mapA4DGenericMap A 4D Combinatorial Map diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index c080e2166d4c..2439a614f03c 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -910,7 +910,7 @@ Inserts a 1-cell in the 2-cell containing `d1` and `d2`. Returns `previous(d1)`, See examples for combinatorial map in \cgalFigureRef{fig_cmap_insert_edge} and for generalized map in \cgalFigureRef{fig_gmap_insert_edge}. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic on-split function of 2-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, if 2-attributes are non `void`, \link CellAttribute::On_split `Attribute_type<2>::type::On_split`\endlink(a,a') is called, with a the original 2-attribute associated with `d1` and a' the new 2-attribute created during the operation. If set, the dynamic on-split function of 2-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. @@ -930,7 +930,7 @@ Dart_descriptor insert_cell_1_in_cell_2(Dart_descriptor d1, Dart_descriptor d2); Inserts a 1-cell between the 2-cell containing `d1` and the one containing `d2`. Returns `previous(d1)`, a descriptor on one dart belonging to the new 1-cell. \pre `is_insertable_cell_1_between_two_cells_2(d1,d2)`. -If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, call \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a,a') is called for all enabled i-attributes, for i>=2, with a the original 2-attribute associated with `d` and a' the new 2-attribute created during the operation. If set, the dynamic on-merge function of i-attributes is also called on a and a'. +If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==true`, call \link CellAttribute::On_merge `Attribute_type::type::On_merge`\endlink(a,a') is called for all enabled i-attributes, for i>=2, with a the original 2-attribute associated with `d1` and a' the original 2-attribute associated with `d2`. If set, the dynamic on-merge function of i-attributes is also called on a and a'. \cgalAdvancedBegin If \link GenericMap::are_attributes_automatically_managed `are_attributes_automatically_managed()`\endlink`==false`, non void attributes are not updated; thus the generic map can be no more valid after this operation. From 28ea0d42e02985677056b3b8b28c7fcb6fbe656c Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 22 Jun 2023 12:11:57 +0200 Subject: [PATCH 0399/1398] Using --- Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 08afd5085870..6e7960fe4b02 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -168,7 +168,7 @@ Considering these different advantages and drawbacks, you can choose to use gene The diagram in \cgalFigureRef{fig_cmap_diagramme_class} shows the different classes of the package. `Combinatorial_map` is the main class (see Section \ref sseccombinatorialmap "Combinatorial Maps"). It allows to manage darts and attributes (see Section \ref ssecattributes "Cell Attributes"). Users can customize a combinatorial map thanks to an items class (see Section \ref ssecitem "Combinatorial Map Items"), which defines the information associated with darts and the attribute types. These types may be different for different dimensions, and they may also be void (note that the main concepts of `GenericMap`, `GenericMapItems` and `CellAttribute` are shared between combinatorial maps and generalized maps). -The darts and attributes are accessed through descriptors (either Indices or Handles). A handle is a model of the `Handle` concept, thus supporting the two dereference operators `operator*` and `operator->`. All handles are model of `LessThanComparable` and `Hashable`, that is they can be used as keys in containers such as `std::map` and `std::unordered_map`. An index is a model of the `Index` concept, which is mainly an integer which is convertible from and to std::size_t. Indices can be used as index into vectors which store properties (cf. one example in Section \ref ssecexample3DCMWI "3D Combinatorial Map using Indices"). +The darts and attributes are accessed through descriptors (either Indices or Handles). A handle is a model of the `Handle` concept, thus supporting the two dereference operators `operator*` and `operator->`. All handles are model of `LessThanComparable` and `Hashable`, that is they can be used as keys in containers such as `std::map` and `std::unordered_map`. An index is a model of the `Index` concept, which is mainly an integer which is convertible from and to std::size_t. Indices can be used as index into vectors which store properties (cf. one example in Section \ref ssecexample3DCMWI "3D Combinatorial Map Using Indices"). \cgalFigureBegin{fig_cmap_diagramme_class,cmap_diagramme_class.svg} UML diagram of the main classes of the package. k is the number of non void attributes. @@ -520,7 +520,7 @@ Lastly we remove the dynamic onmerge functor (step 7). This is done by initializ \cgalExample{Combinatorial_map/map_3_dynamic_onmerge.cpp} -\subsection ssecexample3DCMWI 3D Combinatorial Map using Indices +\subsection ssecexample3DCMWI 3D Combinatorial Map Using Indices In this example, a 3-dimensional combinatorial map is used, but using indices instead of handles. Two vectors are created to store some external information associated with darts and 3-attributes. Since descriptors are indices, they can directly be used to access elements of the vector. From 571536f09c2b0afc7f42485276d95f74d1e159ca Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 22 Jun 2023 14:38:23 +0200 Subject: [PATCH 0400/1398] fix version checker the 3 major/minor/patch are needed to compare integrals if they are defined, the version check is done and warning or error are displayed --- Installation/include/CGAL/config.h | 2 +- Installation/include/CGAL/version_checker.h | 53 ++++++++++++++++++++ Installation/include/CGAL/version_enforcer.h | 41 --------------- 3 files changed, 54 insertions(+), 42 deletions(-) create mode 100644 Installation/include/CGAL/version_checker.h delete mode 100644 Installation/include/CGAL/version_enforcer.h diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index f37531001398..13379cf2a3c8 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -117,7 +117,7 @@ #include #include -#include +#include //----------------------------------------------------------------------// // platform specific workaround flags (CGAL_CFG_...) diff --git a/Installation/include/CGAL/version_checker.h b/Installation/include/CGAL/version_checker.h new file mode 100644 index 000000000000..9061ee89c54d --- /dev/null +++ b/Installation/include/CGAL/version_checker.h @@ -0,0 +1,53 @@ +// Copyright (c) 2023 GeometryFactory. +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : - + +#ifndef CGAL_VERSION_CHECKER_H +#define CGAL_VERSION_CHECKER_H + +#include + +// All files including this header are meant to work with a given version of CGAL +// When using forked headers, set the following macro to the version of CGAL +// you want to use. + +//// Set the 3 following macros to the version of CGAL you want to use +//#define CGAL_AUTHORIZED_VERSION_MAJOR 6 +//#define CGAL_AUTHORIZED_VERSION_MINOR 0 +//#define CGAL_AUTHORIZED_VERSION_PATCH 0 + +// Set the following macros to 1 to get a warning/an error +// when using a bad version of CGAL +#define CGAL_VERSION_CHECKER_ERROR 0 +#define CGAL_VERSION_CHECKER_WARNING 0 + +#define CGAL_AUTHORIZED_VERSION_STR CGAL_STR(CGAL_AUTHORIZED_VERSION_MAJOR) "." \ + CGAL_STR(CGAL_AUTHORIZED_VERSION_MINOR) "." \ + CGAL_STR(CGAL_AUTHORIZED_VERSION_PATCH) + + +// Check that the version of CGAL used is the one expected +#if CGAL_AUTHORIZED_VERSION_MAJOR != CGAL_VERSION_MAJOR \ + || CGAL_AUTHORIZED_VERSION_MINOR != CGAL_VERSION_MINOR \ + || CGAL_AUTHORIZED_VERSION_PATCH != CGAL_VERSION_PATCH + + #if CGAL_VERSION_CHECKER_WARNING || CGAL_VERSION_CHECKER_ERROR + #pragma message("These headers are meant to be used with CGAL " CGAL_AUTHORIZED_VERSION_STR " only."\ + " You are using CGAL version: " CGAL_STR(CGAL_VERSION) ".") + + #ifdef CGAL_VERSION_CHECKER_ERROR + #error "Wrong version of CGAL" + #endif + + #endif + +#endif + +#endif // CGAL_VERSION_CHECKER_H diff --git a/Installation/include/CGAL/version_enforcer.h b/Installation/include/CGAL/version_enforcer.h deleted file mode 100644 index c5c1181cee4f..000000000000 --- a/Installation/include/CGAL/version_enforcer.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2023 GeometryFactory. -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : - - -#ifndef CGAL_VERSION_ENFORCER_H -#define CGAL_VERSION_ENFORCER_H - -#include - -// All files including this header are meant to work with a given version of CGAL -// When using forked headers, set the 4 following macros to the version of CGAL -// you want to use. -#define CGAL_AUTHORIZED_VERSION_STR CGAL_VERSION_STR -#define CGAL_AUTHORIZED_VERSION_MAJOR CGAL_VERSION_MAJOR -#define CGAL_AUTHORIZED_VERSION_MINOR CGAL_VERSION_MINOR -#define CGAL_AUTHORIZED_VERSION_PATCH CGAL_VERSION_PATCH - -// Check that the version of CGAL used is the one expected -#if (CGAL_VERSION_MAJOR != CGAL_AUTHORIZED_VERSION_MAJOR) -#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only." -#endif - -#if (CGAL_VERSION_MINOR != CGAL_AUTHORIZED_VERSION_MINOR) -#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only. -#endif - -#if (CGAL_VERSION_PATCH != CGAL_AUTHORIZED_VERSION_PATCH) -#pragma message "You are using CGAL version: " CGAL_STR(CGAL_VERSION) "." -#error This header is meant to be with used with CGAL "CGAL_AUTHORIZED_VERSION_STR" only." -#endif - -#endif // CGAL_VERSION_ENFORCER_H From 3ed60dc64908e65c1ae2d003585b576bd979b67a Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Jun 2023 08:22:00 +0200 Subject: [PATCH 0401/1398] Examples for insert between two different 2-cells --- .../Generalized_map/gmap_3_insert.cpp | 34 ++++++++++++++++++ .../Linear_cell_complex/CMakeLists.txt | 4 ++- .../linear_cell_complex_3_insert.cpp | 35 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Generalized_map/examples/Generalized_map/gmap_3_insert.cpp create mode 100644 Linear_cell_complex/examples/Linear_cell_complex/linear_cell_complex_3_insert.cpp diff --git a/Generalized_map/examples/Generalized_map/gmap_3_insert.cpp b/Generalized_map/examples/Generalized_map/gmap_3_insert.cpp new file mode 100644 index 000000000000..56c4a5cbd2f8 --- /dev/null +++ b/Generalized_map/examples/Generalized_map/gmap_3_insert.cpp @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +typedef CGAL::Generalized_map<3> GMap_3; +typedef GMap_3::Dart_descriptor Dart_descriptor; + +int main() +{ + GMap_3 gm; + + // Create one combinatorial hexahedron + Dart_descriptor d1 = gm.make_combinatorial_hexahedron(); + + // Create one square face + Dart_descriptor d2=gm.make_combinatorial_polygon(4); + + assert(gm.is_insertable_cell_1_between_two_cells_2(d1,d2)); + + // Insert the square face as a hole of the face of the hexahedron containing d1 + gm.insert_cell_1_between_two_cells_2(d1, d2); + + // Display the combinatorial map characteristics. + gm.display_characteristics(std::cout)<<", valid=" + <(dh)) ++nb; } + std::cout<<"Number of 2-free darts: "< +#include +#include + +typedef CGAL::Linear_cell_complex_for_combinatorial_map<3> LCC1; +typedef CGAL::Linear_cell_complex_for_generalized_map<3> LCC2; + +template +void test() +{ + LCC lcc; + using Point=typename LCC::Point; + + typename LCC::Dart_descriptor d1= + lcc.make_hexahedron(Point(0,0,0), Point(5,0,0), + Point(5,5,0), Point(0,5,0), + Point(0,5,4), Point(0,0,4), + Point(5,0,4), Point(5,5,4)); + typename LCC::Dart_descriptor d2= + lcc.make_quadrangle(Point(5,2,2), Point(5,1,2), + Point(5,1,1), Point(5,2,1)); + + lcc.insert_cell_1_between_two_cells_2 + (lcc.template opposite<2>(lcc.next(lcc.next(d1))), + lcc.next(lcc.next(d2))); + + CGAL::draw(lcc); +} + +int main() +{ + test(); + test(); + return EXIT_SUCCESS; +} From edc11a8bc002d47f1d57da3cfe313bb9817b6af0 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Jun 2023 08:43:36 +0200 Subject: [PATCH 0402/1398] Example of insert edge between two different 2-cells, for cmap, gmap and lcc --- .../Combinatorial_map/Combinatorial_map.txt | 6 ++++-- .../doc/Generalized_map/Generalized_map.txt | 20 ++++++++++++++++++ .../doc/Generalized_map/examples.txt | 1 + .../Linear_cell_complex.txt | 11 +++++++++- .../doc/Linear_cell_complex/examples.txt | 1 + .../fig/lcc_insert_example.png | Bin 0 -> 19200 bytes 6 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 Linear_cell_complex/doc/Linear_cell_complex/fig/lcc_insert_example.png diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 6e7960fe4b02..d1216129f48f 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -458,7 +458,7 @@ The second line is the result after the removal operations. We retrieve the orig Example of high level operations. Left: Initial 3D combinatorial map after the creation of the combinatorial hexahedron. Middle: Combinatorial map obtained after the two 1-cell insertions. The two 2-cells were split in two. Right: Combinatorial map obtained after the 2-cell insertion. The 3-cell was split in two. \cgalFigureEnd -\subsection Combinatorial_mapInsertion Insert an edge between two different faces +\subsection Combinatorial_mapInsertion Insert an Edge Between Two Different Faces \anchor ssecexempleinsertion @@ -472,7 +472,9 @@ The output is: Number of 2-free darts: 4 \endverbatim -We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 4 2-free darts, which are the 4 darts of the squared face. Since they bound an hole, there is no face filling the hole and thus 4 darts are 2-free. +We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 4 2-free darts, which are the darts of the squared face. Since they bound an hole, there is no face filling the hole and thus 4 darts are 2-free. + +See also a similar example for Linear cell complex \ref Linear_cell_complexInsert "Insert an Edge Between Two Different Faces". \subsection Combinatorial_mapA4DGenericMap A 4D Combinatorial Map diff --git a/Generalized_map/doc/Generalized_map/Generalized_map.txt b/Generalized_map/doc/Generalized_map/Generalized_map.txt index 491a8c9ed3d3..39aa3e1b2e0d 100644 --- a/Generalized_map/doc/Generalized_map/Generalized_map.txt +++ b/Generalized_map/doc/Generalized_map/Generalized_map.txt @@ -399,6 +399,8 @@ Example of \link GenericMap::insert_cell_1_in_cell_2 `insert_cell_1_in_cell_2`\e `gm.`\link GenericMap::insert_dangling_cell_1_in_cell_2 `insert_dangling_cell_1_in_cell_2(d0)`\endlink adds a 1-cell in the 2-cell containing dart `d0`, the 1-cell being attached by only one of its vertex to the 0-cell containing dart `d0`. This operation is possible if `d0` \f$ \in \f$ \link GenericMap::darts `gm.darts()`\endlink. +`gm.`\link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2(d1,d2)`\endlink adds a 1-cell between the two faces containing containing darts `d1` and `d2`, between the two 0-cells containing darts `d1` and `d2`. The 2-cells are merged in one. This operation is possible if d1\f$ \not \in \f$ \f$ \langle{}\f$\f$ \alpha_0, \alpha_1\f$\f$ \rangle{}\f$(d2) which can be tested thanks to `gm.`\link GenericMap::is_insertable_cell_1_between_two_cells_2 `is_insertable_cell_1_between_two_cells_2(d1,d2)`\endlink. + `gm.`\link GenericMap::insert_cell_2_in_cell_3 `insert_cell_2_in_cell_3(itbegin,itend)`\endlink adds a 2-cell in the 3-cell containing all the darts between `itbegin` and `itend`, along the path of 1-cells containing darts in [`itbegin`,`itend`). The 3-cell is split in two. This operation is possible if all the darts in [`itbegin`,`itend`) form a closed path inside a same 3-cell which can be tested thanks to `gm.`\link GenericMap::is_insertable_cell_2_in_cell_3 `is_insertable_cell_2_in_cell_3(itbegin,itend)`\endlink (see example on \cgalFigureRef{fig_gmap_insert_facet}). \cgalFigureBegin{fig_gmap_insert_facet,gmap_insert_facet.svg} @@ -478,6 +480,24 @@ The second line is the result after the removal operations. We retrieve the orig Example of high level operations. Left: Initial 3D generalized map after the creation of the generalized hexahedron. Middle: Generalized map obtained after the two 1-cell insertions. The two 2-cells were split in two. Right: Generalized map obtained after the 2-cell insertion. The 3-cell was split in two. \cgalFigureEnd +\subsection Generalized_mapInsertion Insert an edge between two different faces + +\anchor ssecexempleinsertiongmap + +This example shows the use of \link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2`\endlink operation. First we create a combinatorial hexahedron and a face with 4 edges. This face is inserted in the face of the hexahedron containing dart d1. We display the characteristics of the generalized map and check its validity. Then we count and display the number of 2-free darts. + +\cgalExample{Generalized_map/gmap_3_insert.cpp} + +The output is: +\verbatim +#Darts=60, #0-cells=12, #1-cells=17, #2-cells=6, #3-cells=1, #ccs=1, orientable=true, valid=1 +Number of 2-free darts: 8 +\endverbatim + +We can verify that there are 6 2-cells after the insertion since the squared face was inserted as a hole in one face of the hexahedron. We can also see that there are 8 2-free darts, which are the darts of the squared face. Since they bound an hole, there is no face filling the hole and thus 8 darts are 2-free. + +See also a similar example for Linear cell complex \ref Linear_cell_complexInsert "Insert an Edge Between Two Different Faces". + \subsection Generalized_mapA4DGeneralizedMap A 4D Generalized Map In this example, a 4-dimensional generalized map is used. Two tetrahedral cells are created and sewn by \f$ \alpha_4\f$. Then the numbers of cells of the generalized map are displayed, and its validity is checked. diff --git a/Generalized_map/doc/Generalized_map/examples.txt b/Generalized_map/doc/Generalized_map/examples.txt index c38131ac9fbc..1ea597a39759 100644 --- a/Generalized_map/doc/Generalized_map/examples.txt +++ b/Generalized_map/doc/Generalized_map/examples.txt @@ -7,4 +7,5 @@ \example Generalized_map/gmap_3_with_colored_facets.cpp \example Generalized_map/gmap_3_dynamic_onmerge.cpp \example Generalized_map/gmap_3_index.cpp +\example Generalized_map/gmap_3_insert.cpp */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt index 6eae9275a757..0cb7753c302a 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt @@ -76,7 +76,7 @@ The class `Linear_cell_complex_min_items` is a model of `LinearCellComplexIte \section Linear_cell_complexOperations Operations -Several operations defined in the combinatorial maps or generalized maps package can be used on a linear cell complex. This is the case for all the iteration operations that do not modify the model (see example in Section \ref ssec3Dlcc "A 3D Linear Cell Complex"). This is also the case for all the operations that do not create new 0-cells: `sew`, `unsew`, \link GenericMap::remove_cell `remove_cell`\endlink, \link GenericMap::insert_cell_1_in_cell_2 `insert_cell_1_in_cell_2`\endlink or \link GenericMap::insert_cell_2_in_cell_3 `insert_cell_2_in_cell_3`\endlink. Indeed, all these operations update non `void` attributes, and thus update vertex attributes of a linear cell complex. Note that some existing 0-attributes can be duplicated by the `unsew` method, but these 0-attributes are not new but copies of existing old 0-attributes. +Several operations defined in the combinatorial maps or generalized maps package can be used on a linear cell complex. This is the case for all the iteration operations that do not modify the model (see example in Section \ref ssec3Dlcc "A 3D Linear Cell Complex"). This is also the case for all the operations that do not create new 0-cells: `sew`, `unsew`, \link GenericMap::remove_cell `remove_cell`\endlink, \link GenericMap::insert_cell_1_in_cell_2 `insert_cell_1_in_cell_2`\endlink, \link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2`\endlink or \link GenericMap::insert_cell_2_in_cell_3 `insert_cell_2_in_cell_3`\endlink. Indeed, all these operations update non `void` attributes, and thus update vertex attributes of a linear cell complex. Note that some existing 0-attributes can be duplicated by the `unsew` method, but these 0-attributes are not new but copies of existing old 0-attributes. However, operations that create a new 0-cell can not be directly used since the new 0-cell would not be associated with a vertex attribute. Indeed, it is not possible for these operations to automatically decide which point to create. These operations are: \link GenericMap::insert_cell_0_in_cell_1 `insert_cell_0_in_cell_1`\endlink, \link GenericMap::insert_cell_0_in_cell_2 `insert_cell_0_in_cell_2`\endlink, \link GenericMap::insert_dangling_cell_1_in_cell_2 `insert_dangling_cell_1_in_cell_2`\endlink, plus all the creation operations. For these operations, new versions are proposed taking some points as additional parameters. Lastly, some new operations are defined, which use the geometry (see sections \ref ssecconstructionsop "Construction Operations" and \ref ssecmodifop "Modification Operations"). @@ -278,6 +278,15 @@ The following example shows the incremental builder. \cgalExample{Linear_cell_complex/linear_cell_complex_3_incremental_builder.cpp} +\subsection Linear_cell_complexInsert Insert an Edge Between Two Different Faces + +The following example shows the use of \link GenericMap::insert_cell_1_between_two_cells_2 `insert_cell_1_between_two_cells_2`\endlink operation that inserts an edge between two different faces, thus creating an hole in the first face. + +\cgalExample{Linear_cell_complex/linear_cell_complex_3_insert.cpp} + +\cgalFigureBegin{fig_lcc_insert,lcc_insert_example.png} +Result of the run of the linear_cell_complex_3_insert program. A window shows the 3D cube where one face has a hole. +\cgalFigureEnd \section Linear_cell_complexDesign Design and Implementation History diff --git a/Linear_cell_complex/doc/Linear_cell_complex/examples.txt b/Linear_cell_complex/doc/Linear_cell_complex/examples.txt index 4f178f666d19..def1f1a28fee 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/examples.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/examples.txt @@ -5,4 +5,5 @@ \example Linear_cell_complex/linear_cell_complex_3_attributes_management.cpp \example Linear_cell_complex/linear_cell_complex_3_incremental_builder.cpp \example Linear_cell_complex/draw_linear_cell_complex.cpp +\example Linear_cell_complex/linear_cell_complex_3_insert.cpp */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/fig/lcc_insert_example.png b/Linear_cell_complex/doc/Linear_cell_complex/fig/lcc_insert_example.png new file mode 100644 index 0000000000000000000000000000000000000000..959598345aaa333b01be13f721ce70577bf7e52a GIT binary patch literal 19200 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 V@pu|;^a&`;;OXk;vd$@?2>{a8I)wlL literal 0 HcmV?d00001 From 21f945ef99c05a070c1ffd0b8ad0413f2def27be Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 23 Jun 2023 08:48:00 +0200 Subject: [PATCH 0403/1398] Update change (insert concerns both cmap and gmap) --- Installation/CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 02f9b3654ec5..72aa6cf6103b 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -11,7 +11,7 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. -### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) +### [Combinatorial Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgCombinatorialMaps) and [Generalized Maps](https://doc.cgal.org/6.0/Manual/packages.html#PkgGeneralizedMaps) - Added the function `insert_cell_1_between_two_cells_2()` to the `GenericMap` concept, which enables users to insert an edge between two different faces in order to create faces with holes. From 518c32e193d80b74c0bfded1fbffb42d9b38b2cc Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sat, 24 Jun 2023 10:21:22 +0100 Subject: [PATCH 0404/1398] Update change log --- Installation/CHANGES.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 3c60725161c5..e909d9ea8f52 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1,6 +1,15 @@ Release History =============== +### [3D Mesh Generation](https://doc.cgal.org/6.0/Manual/packages.html#PkgMesh3) + +- **Breaking change**: Removed the concept `TriangleAccessor`, the template parameter `TriangleAccessor`, as well + as the class `Triangle_accessor`. They were no longer used for several releases. + +- Removed the class templates `Gray_image_mesh_domain_3` and `Labeled_image_mesh_domain_3` + which are deprecated since CGAL-4.13. + + [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- From 28dbd6b8eef13b78c6318efda196e423548e1aec Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sat, 24 Jun 2023 10:37:39 +0100 Subject: [PATCH 0405/1398] allow -> enable --- Mesh_3/doc/Mesh_3/CGAL/Mesh_3/parameters.h | 24 +++++++++---------- Mesh_3/doc/Mesh_3/Mesh_3.txt | 4 ++-- Mesh_3/doc/Mesh_3/PackageDescription.txt | 2 +- .../include/CGAL/Compact_mesh_cell_base_3.h | 2 +- Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h | 2 +- .../Mesh_domain_with_polyline_features_3.h | 2 +- Mesh_3/include/CGAL/Mesh_triangulation_3.h | 2 +- .../include/CGAL/Polyhedral_mesh_domain_3.h | 2 +- Mesh_3/include/CGAL/refine_mesh_3.h | 6 ++--- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_3/parameters.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_3/parameters.h index 65fa962d5125..acfb0b6efd8b 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_3/parameters.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Mesh_3/parameters.h @@ -60,9 +60,9 @@ unspecified_type manifold_with_boundary(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::exude()` allows the user to trigger a call to `exude_mesh_3()` in the + * The function `parameters::exude()` enables the user to trigger a call to `exude_mesh_3()` in the * `make_mesh_3()` and `refine_mesh_3()` mesh generation functions. - * It also allows the user to pass parameters + * It also enables the user to pass parameters * to the optimization function `exude_mesh_3()` through these mesh generation functions. * * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -131,9 +131,9 @@ unspecified_type features(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::lloyd()` allows the user to trigger a call of + * The function `parameters::lloyd()` enables the user to trigger a call of * `lloyd_optimize_mesh_3()` in the mesh generation functions - * `make_mesh_3()` and `refine_mesh_3()`. It also allows the user to pass + * `make_mesh_3()` and `refine_mesh_3()`. It also enables the user to pass * parameters to the optimization function * `lloyd_optimize_mesh_3()` through these mesh generation functions. * @@ -210,7 +210,7 @@ unspecified_type lloyd(const Named_function_parameters& np = parameters::default /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::no_exude()` allows the user to tell the mesh generation functions + * The function `parameters::no_exude()` enables the user to tell the mesh generation functions * `make_mesh_3()` and `refine_mesh_3()` that no exudation must be done. * * \cgalHeading{Example} @@ -246,7 +246,7 @@ unspecified_type no_features(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::no_lloyd()` allows the user to tell the mesh generation functions + * The function `parameters::no_lloyd()` enables the user to tell the mesh generation functions * `make_mesh_3()` and `refine_mesh_3()` that no lloyd optimization must be done. * * \cgalHeading{Example} @@ -269,7 +269,7 @@ unspecified_type no_lloyd(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::no_odt()` allows the user to tell the mesh generation functions + * The function `parameters::no_odt()` enables the user to tell the mesh generation functions * `make_mesh_3()` and `refine_mesh_3()` that no ODT optimization must be done. * * \cgalHeading{Example} @@ -292,7 +292,7 @@ unspecified_type no_odt(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::no_perturb()` allows the user to tell mesh generation global functions + * The function `parameters::no_perturb()` enables the user to tell mesh generation global functions * `make_mesh_3()` and `refine_mesh_3()` that no perturbation must be done. * * \cgalHeading{Example} @@ -315,10 +315,10 @@ unspecified_type no_perturb(); /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::odt()` allows the user to trigger a call to + * The function `parameters::odt()` enables the user to trigger a call to * `CGAL::odt_optimize_mesh_3()` in * `CGAL::make_mesh_3()` and `CGAL::refine_mesh_3()` mesh optimization functions. It also - * allows the user to pass parameters to the optimization function + * enables the user to pass parameters to the optimization function * `odt_optimize_mesh_3()` through these mesh generation functions. * * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @@ -395,10 +395,10 @@ unspecified_type odt(const Named_function_parameters& np = parameters::default_v /*! * \ingroup PkgMesh3Parameters * - * The function `parameters::perturb()` allows the user to trigger a call to + * The function `parameters::perturb()` enables the user to trigger a call to * `perturb_mesh_3()` in * `make_mesh_3()` and `refine_mesh_3()` mesh generation functions. It also - * allows the user to pass parameters + * enables the user to pass parameters * to the optimization function `perturb_mesh_3()` through these mesh generation functions. * * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index a802ac4df08b..43660034018c 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -494,7 +494,7 @@ protecting ball centers that are consecutive on a 1-feature. This parameter has The four additional parameters are optimization parameters. They control which optimization processes are performed -and allow the user to tune the parameters of the activated optimization processes. +and enables the user to tune the parameters of the activated optimization processes. These parameters have internal types which are not described but the library provides global functions to generate appropriate values of these types: @@ -679,7 +679,7 @@ View of 3D meshes produced from a polyhedral domain with a nested surface. The following code creates a polyhedral domain, with only one polyhedron, and no "bounding polyhedron", so the volumetric part of the domain will be empty. -This allows to remesh a surface, and is equivalent to the function `make_surface_mesh()`. +This enables to remesh a surface, and is equivalent to the function `make_surface_mesh()`. \cgalExample{Mesh_3/remesh_polyhedral_surface.cpp} diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index 63141c257e05..c4221f3cfbf2 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -27,7 +27,7 @@ /// \defgroup PkgMesh3Functions Mesh Generation Functions /// \ingroup PkgMesh3Ref /// The two main functions to generate a mesh are `make_mesh_3()` and `refine_mesh_3()`. -/// The other functions allow to optimize an existing mesh. +/// The other functions enable to optimize an existing mesh. /// \defgroup PkgMesh3Parameters Parameter Functions /// \ingroup PkgMesh3Ref diff --git a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h index d30acbcb141c..1e5ee7657311 100644 --- a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h @@ -437,7 +437,7 @@ class Compact_mesh_cell_3 // CHECKING - // the following trivial is_valid allows + // the following trivial is_valid enables // the user of derived cell base classes // to add their own purpose checking bool is_valid(bool = false, int = 0) const diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h index 2abcb9f3241d..dad06a5540b3 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -673,7 +673,7 @@ scan_triangulation_impl() typedef typename Tr::All_cells_iterator All_cells_iterator; // WITH PARALLEL_FOR - // Copy cells into an std::vector to allow the use of tbb::parallel_for + // Copy cells into an std::vector to enable the use of tbb::parallel_for // which requires random-access. // Note that we're using all_cells_begin() instead of finite_cells_begin() // because it's faster to do the is_infinite() test in parallel. diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index f6de5e1a0785..7e5a82c03bf1 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -517,7 +517,7 @@ struct Display_incidences_to_curves_aux { /*! \ingroup PkgMesh3Domains -The class `Mesh_domain_with_polyline_features_3` is designed to allow the user +The class `Mesh_domain_with_polyline_features_3` enables the user to add some 0- and 1-dimensional features into any model of the `MeshDomain_3` concept. The 1-dimensional features are described as polylines diff --git a/Mesh_3/include/CGAL/Mesh_triangulation_3.h b/Mesh_3/include/CGAL/Mesh_triangulation_3.h index a63c09a07826..db6db640c79d 100644 --- a/Mesh_3/include/CGAL/Mesh_triangulation_3.h +++ b/Mesh_3/include/CGAL/Mesh_triangulation_3.h @@ -77,7 +77,7 @@ class Mesh_3_regular_triangulation_3_wrapper // because of Periodic_3_mesh_3: they are functions for which both triangulations // have fundamentally different implementations (usually, Periodic_3_mesh_3 // does not know the offset of a point and must brute-force check for all - // possibilities). To allow Periodic_3_mesh_3 to use Mesh_3's files, + // possibilities). To enable Periodic_3_mesh_3 to use Mesh_3's files, // each mesh triangulation implements its own version. const Bare_point& get_closest_point(const Bare_point& /*p*/, const Bare_point& q) const diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 2abd37c3d77b..8ffc5d6f93a7 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -262,7 +262,7 @@ class Polyhedral_mesh_domain_3 Construction from a polyhedral surface, and a bounding polyhedral surface. The first polyhedron must be entirely included inside `bounding_polyhedron`, which must be closed and free of intersections. - Using this constructor allows to mesh a polyhedral surface which is not closed, or has holes. + Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. */ Polyhedral_mesh_domain_3(const Polyhedron& p, diff --git a/Mesh_3/include/CGAL/refine_mesh_3.h b/Mesh_3/include/CGAL/refine_mesh_3.h index 3f11e81ce8a2..78778059d351 100644 --- a/Mesh_3/include/CGAL/refine_mesh_3.h +++ b/Mesh_3/include/CGAL/refine_mesh_3.h @@ -170,11 +170,11 @@ class Insert_vertex_in_c3t3 * of 1-dimensional exposed features. * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below. * They control which optimization processes are performed - * and allow the user to tune the parameters of the optimization processes. + * and enable the user to tune the parameters of the optimization processes. * Individual optimization parameters are not described here as they are * internal types (see instead the documentation page of each optimizer). * For each optimization algorithm, there exist two global functions - * that allow to enable or disable the optimizer. + * that enable to enable or disable the optimizer. * * \cgalNamedParamsBegin * \cgalParamSectionBegin{Topological options (manifoldness)} @@ -310,7 +310,7 @@ void refine_mesh_3(C3T3& c3t3, const MeshDomain& domain, const MeshCriteria& cri * done at the end of refinement process * @param reset_c3t3 if `true`, a new C3T3 will be construct from param c3t3. * The new c3t3 keeps only the vertices (as NON-weighted points with their - * dimension and Index) of the triangulation. That allows to refine a mesh + * dimension and Index) of the triangulation. That enables to refine a mesh * which has been exuded. * @param mesh_3_options is a struct object used to pass non-documented options, * for debugging purpose. From aa0d50b84c40d7962ad5c8e7aade3189aefadb0d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 26 Jun 2023 15:08:05 +0100 Subject: [PATCH 0406/1398] Fix Arrangement_on_surface_2 examples --- .../examples/Arrangement_on_surface_2/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt index bd3e707c4b45..a7d1965c8cd4 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Arrangement_on_surface_2_Examples) -find_package(CGAL REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Qt5) +find_package(CGAL REQUIRED COMPONENTS Core OPTIONAL_COMPONENTS Qt6) # create a target per cppfile file( @@ -15,7 +15,7 @@ foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") endforeach() -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) target_link_libraries(draw_arr PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(linear_conics PUBLIC CGAL::CGAL_Basic_viewer) target_link_libraries(parabolas PUBLIC CGAL::CGAL_Basic_viewer) From 1066af14f4c04f827a27d288792eb03597f2ff15 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 26 Jun 2023 15:09:10 +0100 Subject: [PATCH 0407/1398] Add #include --- Polyhedron/demo/Polyhedron/MainWindow.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index ea43c7a482f6..b58fa02912fc 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -9,6 +9,7 @@ #include #include #include +#include #include From a015b1de233e2bbf5fba397833c60f041dd67c76 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 26 Jun 2023 15:37:44 +0100 Subject: [PATCH 0408/1398] Fix Straight_skeleton_extrusion test --- .../test/Straight_skeleton_extrusion_2/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt b/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt index f29dcb4e9296..8dd920fdf64f 100644 --- a/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt +++ b/Straight_skeleton_extrusion_2/test/Straight_skeleton_extrusion_2/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Straight_skeleton_extrusion_2_Tests) -find_package(CGAL REQUIRED COMPONENTS Qt5 Core) +find_package(CGAL REQUIRED COMPONENTS Qt6 Core) include_directories(BEFORE "include") @@ -17,6 +17,6 @@ foreach(cppfile ${cppfiles}) create_single_source_cgal_program("${cppfile}") endforeach() -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) target_link_libraries(test_sls_extrude PUBLIC CGAL::CGAL_Basic_viewer) endif() From 4854c500b0b275b80c0de677763c32d5cf836b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 26 Jun 2023 17:41:16 +0200 Subject: [PATCH 0409/1398] restore usage of boost prior/next that breaks at runtime --- .../include/CGAL/Polyline_simplification_2/simplify.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index 85404f86c2d1..17ddecd3ba46 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -30,6 +30,7 @@ #include // Needed for Polygon_2 +#include #include #include @@ -154,11 +155,11 @@ class Polyline_simplification_2 (*it)->set_removable(false); ++it; for(; it != ite; ++it){ - if((std::next(it) != ite) && (std::prev(it)== std::next(it))){ + if((boost::next(it) != ite) && (boost::prior(it)==boost::prior(it))){ (*it)->set_removable(false); } } - it = std::prev(it); + it = boost::prior(it); (*it)->set_removable(false); } @@ -245,9 +246,9 @@ class Polyline_simplification_2 } Vertex_handle vh = *it; - Vertices_in_constraint_iterator u = std::prev(it); + Vertices_in_constraint_iterator u = boost::prior(it); Vertex_handle uh = *u; - Vertices_in_constraint_iterator w = std::next(it); + Vertices_in_constraint_iterator w = boost::next(it); Vertex_handle wh = *w; typename Geom_traits::Orientation_2 orientation_2 = pct.geom_traits().orientation_2_object(); @@ -322,7 +323,7 @@ operator()() Vertices_in_constraint_iterator vit = vertex_to_iterator[v].front(); if(is_removable(vit)){ - Vertices_in_constraint_iterator u = std::prev(vit), w = std::next(vit); + Vertices_in_constraint_iterator u = boost::prior(vit), w = boost::next(vit); pct.simplify(vit); if((*u)->is_removable()){ From 04f52791d6793a8198cb7cf98414fd8234a90159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 27 Jun 2023 09:40:27 +0200 Subject: [PATCH 0410/1398] manually fix iterator category that seems to not work correctly when stacking boost::iterator_adaptor also restore std::prev --- .../include/CGAL/Polyline_simplification_2/simplify.h | 11 +++++------ .../internal/Polyline_constraint_hierarchy_2.h | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h index 17ddecd3ba46..85404f86c2d1 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/simplify.h @@ -30,7 +30,6 @@ #include // Needed for Polygon_2 -#include #include #include @@ -155,11 +154,11 @@ class Polyline_simplification_2 (*it)->set_removable(false); ++it; for(; it != ite; ++it){ - if((boost::next(it) != ite) && (boost::prior(it)==boost::prior(it))){ + if((std::next(it) != ite) && (std::prev(it)== std::next(it))){ (*it)->set_removable(false); } } - it = boost::prior(it); + it = std::prev(it); (*it)->set_removable(false); } @@ -246,9 +245,9 @@ class Polyline_simplification_2 } Vertex_handle vh = *it; - Vertices_in_constraint_iterator u = boost::prior(it); + Vertices_in_constraint_iterator u = std::prev(it); Vertex_handle uh = *u; - Vertices_in_constraint_iterator w = boost::next(it); + Vertices_in_constraint_iterator w = std::next(it); Vertex_handle wh = *w; typename Geom_traits::Orientation_2 orientation_2 = pct.geom_traits().orientation_2_object(); @@ -323,7 +322,7 @@ operator()() Vertices_in_constraint_iterator vit = vertex_to_iterator[v].front(); if(is_removable(vit)){ - Vertices_in_constraint_iterator u = boost::prior(vit), w = boost::next(vit); + Vertices_in_constraint_iterator u = std::prev(vit), w = std::next(vit); pct.simplify(vit); if((*u)->is_removable()){ 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 2280ed0cf9eb..0c5b174e92c2 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 @@ -85,7 +85,7 @@ class Polyline_constraint_hierarchy_2 Vertex_it , typename Vertex_list::skip_iterator , Vertex_handle - , boost::use_default + , std::bidirectional_iterator_tag , Vertex_handle> { public: From 891fd47365ae2d722023e45f1853db18e5b245d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 27 Jun 2023 10:01:58 +0200 Subject: [PATCH 0411/1398] add missing test --- STL_Extension/test/STL_Extension/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index d25906091092..88bfc93ca5dc 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -50,6 +50,7 @@ create_single_source_cgal_program("test_Uncertain.cpp") create_single_source_cgal_program("test_vector.cpp") create_single_source_cgal_program("test_join_iterators.cpp") create_single_source_cgal_program("test_for_each.cpp") +create_single_source_cgal_program("test_skiplist.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) From 0cddd1abf5e7674ddc791aba84a5774354e0a1eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 27 Jun 2023 10:38:24 +0200 Subject: [PATCH 0412/1398] don't recurse --- BGL/examples/BGL_LCC/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BGL/examples/BGL_LCC/CMakeLists.txt b/BGL/examples/BGL_LCC/CMakeLists.txt index f9230373e23e..84a67c0f9606 100644 --- a/BGL/examples/BGL_LCC/CMakeLists.txt +++ b/BGL/examples/BGL_LCC/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(CGAL REQUIRED) # create a target per cppfile file( - GLOB_RECURSE cppfiles + GLOB cppfiles RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) foreach(cppfile ${cppfiles}) From efd8b2d38b1ba5bca886fed4c5d307d7a38ecaa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 27 Jun 2023 11:18:20 +0200 Subject: [PATCH 0413/1398] add more missing tests --- Arithmetic_kernel/test/Arithmetic_kernel/CMakeLists.txt | 1 + BGL/test/BGL/CMakeLists.txt | 1 + Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt | 1 + Mesh_3/examples/Mesh_3/CMakeLists.txt | 3 +++ Mesh_3/test/Mesh_3/CMakeLists.txt | 1 + Number_types/test/Number_types/CMakeLists.txt | 2 ++ .../test/Point_set_processing_3/CMakeLists.txt | 3 +++ STL_Extension/test/STL_Extension/CMakeLists.txt | 2 ++ .../test/Shape_regularization/CMakeLists.txt | 3 ++- Skin_surface_3/examples/Skin_surface_3/CMakeLists.txt | 1 + Spatial_searching/examples/Spatial_searching/CMakeLists.txt | 2 ++ Triangulation/examples/Triangulation/CMakeLists.txt | 6 +++++- Triangulation_3/test/Triangulation_3/CMakeLists.txt | 3 +++ 13 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/CMakeLists.txt b/Arithmetic_kernel/test/Arithmetic_kernel/CMakeLists.txt index 08d054ea54cb..d23762f811ec 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/CMakeLists.txt +++ b/Arithmetic_kernel/test/Arithmetic_kernel/CMakeLists.txt @@ -39,6 +39,7 @@ if(GMP_FOUND) create_single_source_cgal_program("Arithmetic_kernel.cpp") create_single_source_cgal_program("LEDA_arithmetic_kernel.cpp") create_single_source_cgal_program("CORE_arithmetic_kernel.cpp") + create_single_source_cgal_program("GMPXX_arithmetic_kernel.cpp") create_single_source_cgal_program("Get_arithmetic_kernel.cpp") else() diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 3b4304b5056b..0cbb7c3b9fc4 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -35,6 +35,7 @@ create_single_source_cgal_program("test_test_face.cpp" ) create_single_source_cgal_program("test_Collapse_edge.cpp" ) create_single_source_cgal_program("test_Collapse_edge_with_constraints.cpp" ) create_single_source_cgal_program("test_graph_traits.cpp") +create_single_source_cgal_program("test_Surface_mesh.cpp") create_single_source_cgal_program("test_Properties.cpp") create_single_source_cgal_program("bench_read_from_stream_vs_add_face_and_add_faces.cpp") create_single_source_cgal_program("graph_traits_inheritance.cpp" ) diff --git a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt index 9adb636537f1..b5adbf664ec6 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/test/Linear_cell_complex/CMakeLists.txt @@ -14,6 +14,7 @@ create_single_source_cgal_program(Linear_cell_complex_2_test.cpp ${hfiles}) create_single_source_cgal_program(Linear_cell_complex_3_test.cpp ${hfiles}) create_single_source_cgal_program(Linear_cell_complex_4_test.cpp ${hfiles}) create_single_source_cgal_program(Linear_cell_complex_copy_test.cpp ${hfiles}) +create_single_source_cgal_program(LCC_3_incremental_builder_test.cpp ${hfiles}) # Same targets, defining USE_COMPACT_CONTAINER_WITH_INDEX to test index version add_executable(Linear_cell_complex_2_test_index Linear_cell_complex_2_test.cpp ${hfiles}) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index dbcd3ea7cfa9..0b59088e04a2 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -49,6 +49,9 @@ target_link_libraries(mesh_hybrid_mesh_domain PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_implicit_sphere.cpp") target_link_libraries(mesh_implicit_sphere PUBLIC CGAL::Eigen3_support) +create_single_source_cgal_program("mesh_implicit_ellipsoid.cpp") +target_link_libraries(mesh_implicit_ellipsoid PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("mesh_implicit_sphere_variable_size.cpp") target_link_libraries(mesh_implicit_sphere_variable_size PUBLIC CGAL::Eigen3_support) diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index 2a8e19e1c383..5332a40702ac 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -55,6 +55,7 @@ create_single_source_cgal_program( "test_mesh_polyhedral_domain_with_features_de create_single_source_cgal_program( "test_meshing_with_one_step.cpp" ) create_single_source_cgal_program( "test_mesh_cell_base_3.cpp") create_single_source_cgal_program( "test_min_edge_length.cpp") +create_single_source_cgal_program( "implicit_functions.cpp") foreach(target test_boost_has_xxx diff --git a/Number_types/test/Number_types/CMakeLists.txt b/Number_types/test/Number_types/CMakeLists.txt index 400d76fdd1c6..b3dd989c7664 100644 --- a/Number_types/test/Number_types/CMakeLists.txt +++ b/Number_types/test/Number_types/CMakeLists.txt @@ -63,6 +63,8 @@ create_single_source_cgal_program("_test_valid_finite_float.cpp") create_single_source_cgal_program("to_interval_test.cpp") create_single_source_cgal_program("unsigned.cpp") create_single_source_cgal_program("utilities.cpp") +create_single_source_cgal_program("Exact_rational.cpp") +create_single_source_cgal_program("Mpzf_new.cpp") find_package( GMP ) if( GMP_FOUND AND NOT CGAL_DISABLE_GMP ) diff --git a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt index 3f5583bb8b8b..cbd77792290f 100644 --- a/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt +++ b/Point_set_processing_3/test/Point_set_processing_3/CMakeLists.txt @@ -68,6 +68,9 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("jet_pointer_as_property_map.cpp") target_link_libraries(jet_pointer_as_property_map PUBLIC CGAL::Eigen3_support) + + create_single_source_cgal_program("psp_jet_includes.cpp") + target_link_libraries(psp_jet_includes PUBLIC CGAL::Eigen3_support) else() message(STATUS "NOTICE: Some tests require Eigen 3.1 (or greater), and will not be compiled.") endif() diff --git a/STL_Extension/test/STL_Extension/CMakeLists.txt b/STL_Extension/test/STL_Extension/CMakeLists.txt index 88bfc93ca5dc..efa222f2e7bc 100644 --- a/STL_Extension/test/STL_Extension/CMakeLists.txt +++ b/STL_Extension/test/STL_Extension/CMakeLists.txt @@ -51,6 +51,8 @@ create_single_source_cgal_program("test_vector.cpp") create_single_source_cgal_program("test_join_iterators.cpp") create_single_source_cgal_program("test_for_each.cpp") create_single_source_cgal_program("test_skiplist.cpp") +create_single_source_cgal_program("test_leak.cpp") +create_single_source_cgal_program("test_nth_element.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") target_link_libraries(test_for_each PUBLIC CGAL::TBB_support) diff --git a/Shape_regularization/test/Shape_regularization/CMakeLists.txt b/Shape_regularization/test/Shape_regularization/CMakeLists.txt index ddaa6f3ea31a..b465c7cfa16c 100644 --- a/Shape_regularization/test/Shape_regularization/CMakeLists.txt +++ b/Shape_regularization/test/Shape_regularization/CMakeLists.txt @@ -22,7 +22,8 @@ if(TARGET CGAL::OSQP_support) test_3_segments test_4_segments test_100_segments_angles - test_100_segments_offsets) + test_100_segments_offsets + test_cgal_solver) foreach(osqp_target ${osqp_targets}) create_single_source_cgal_program("${osqp_target}.cpp") diff --git a/Skin_surface_3/examples/Skin_surface_3/CMakeLists.txt b/Skin_surface_3/examples/Skin_surface_3/CMakeLists.txt index f637565bc518..0041dc4ccd07 100644 --- a/Skin_surface_3/examples/Skin_surface_3/CMakeLists.txt +++ b/Skin_surface_3/examples/Skin_surface_3/CMakeLists.txt @@ -19,6 +19,7 @@ create_single_source_cgal_program("skin_surface_subdiv.cpp") create_single_source_cgal_program("skin_surface_subdiv_with_normals.cpp") create_single_source_cgal_program("union_of_balls_simple.cpp") create_single_source_cgal_program("union_of_balls_subdiv.cpp") +create_single_source_cgal_program("skin_surface_retrieve_defining_weighted_points.cpp") find_package(ESBTL QUIET) if(ESBTL_FOUND) diff --git a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt index 33a3969adc60..f9546507bd49 100644 --- a/Spatial_searching/examples/Spatial_searching/CMakeLists.txt +++ b/Spatial_searching/examples/Spatial_searching/CMakeLists.txt @@ -27,6 +27,8 @@ create_single_source_cgal_program("searching_polyhedron_vertices_with_fuzzy_sphe create_single_source_cgal_program("user_defined_point_and_distance.cpp") create_single_source_cgal_program("using_fair_splitting_rule.cpp") create_single_source_cgal_program("weighted_Minkowski_distance.cpp") +create_single_source_cgal_program("searching_sphere_orthogonally.cpp") +create_single_source_cgal_program("splitter_worst_cases.cpp") find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) include(CGAL_Eigen3_support) diff --git a/Triangulation/examples/Triangulation/CMakeLists.txt b/Triangulation/examples/Triangulation/CMakeLists.txt index 3ad27172e581..bed700a1b857 100644 --- a/Triangulation/examples/Triangulation/CMakeLists.txt +++ b/Triangulation/examples/Triangulation/CMakeLists.txt @@ -21,6 +21,8 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("triangulation.cpp") create_single_source_cgal_program("triangulation_data_structure_dynamic.cpp") create_single_source_cgal_program("triangulation_data_structure_static.cpp") + create_single_source_cgal_program("triangulation1.cpp") + create_single_source_cgal_program("triangulation2.cpp") foreach( target @@ -30,7 +32,9 @@ if(TARGET CGAL::Eigen3_support) regular_triangulation triangulation triangulation_data_structure_dynamic - triangulation_data_structure_static) + triangulation_data_structure_static + triangulation1 + triangulation2) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() else() diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index 88d63413f646..f6da43d10cea 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -29,6 +29,9 @@ create_single_source_cgal_program("test_static_filters.cpp") create_single_source_cgal_program("test_triangulation_3.cpp") create_single_source_cgal_program("test_io_triangulation_3.cpp") create_single_source_cgal_program("test_triangulation_serialization_3.cpp") +create_single_source_cgal_program("test_dt_deterministic_3.cpp") +create_single_source_cgal_program("test_Triangulation_with_transform_iterator.cpp") +create_single_source_cgal_program("test_Triangulation_with_zip_iterator.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") From 6ed484250ecb62259088f16e422d3739ce1e6752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 27 Jun 2023 11:24:30 +0200 Subject: [PATCH 0414/1398] test that all .cpp in examples and test are compiled --- .../developer_scripts/test_merge_of_branch | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Scripts/developer_scripts/test_merge_of_branch b/Scripts/developer_scripts/test_merge_of_branch index cdf1070fa875..2b3d91ecd0b5 100755 --- a/Scripts/developer_scripts/test_merge_of_branch +++ b/Scripts/developer_scripts/test_merge_of_branch @@ -92,6 +92,33 @@ for i in `ls -d ^build*/examples/*/ ^build*/test/*/ ^build*/demo/^(icons|resourc fi done +#check all tests/examples are tested +echo '.. Checking if all .cpp files in examples/test are compiled...' +CML_ERRORS="" +for CML in `grep -L "GLOB cppfiles" */test/*/CMakeLists.txt */examples/*/CMakeLists.txt`; do + DIR=`dirname $CML` + + if [ "Arrangement_on_surface_2/test/Arrangement_on_surface_2" = $DIR ]; then + continue + fi + if [ "Installation/test/Installation" = $DIR ]; then + continue + fi + + for i in `ls ${DIR}/*.cpp`; do + f=`basename $i .cpp` + if ! grep -q $f ${CML}; then + CML_ERRORS=`echo "${CML_ERRORS}\n$i is not tested!"` + fi + done +done + + +if [ -n "${CML_ERRORS}" ]; then + echo -n "Some tests/examples are not tested:" + echo ${CML_ERRORS} + exit 1 +fi # check project in cmake scripts is correct echo '.. Checking if all CMakeLists.txt project names are correct...' From 61ec729952daadbc7a3b31453bb11e8959967fe7 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 27 Jun 2023 12:55:18 +0100 Subject: [PATCH 0415/1398] The category is just bidirectional when the reference IS a reference, otherwise input --- BGL/examples/BGL_triangulation_2/dijkstra.cpp | 4 ++++ .../internal/Polyline_constraint_hierarchy_2.h | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/BGL/examples/BGL_triangulation_2/dijkstra.cpp b/BGL/examples/BGL_triangulation_2/dijkstra.cpp index 3a1b061eb9e3..5f9ab2a55fd9 100644 --- a/BGL/examples/BGL_triangulation_2/dijkstra.cpp +++ b/BGL/examples/BGL_triangulation_2/dijkstra.cpp @@ -32,6 +32,10 @@ int main(int argc,char* argv[]) VertexIndexMap vertex_id_map; VertexIdPropertyMap vertex_index_pmap(vertex_id_map); int index = 0; + { + vertex_iterator vit = vertices(tr).begin(); + vit = std::prev(vit); + } for(vertex_descriptor vd : vertices(tr)) vertex_id_map[vd] = index++; 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 0c5b174e92c2..531cc089f871 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 @@ -51,7 +51,7 @@ class Polyline_constraint_hierarchy_2 : vertex_(vh), point_(vertex_->point()), input(input) {} const Point& point() const { return point_; } - Vertex_handle vertex() const { return vertex_; } + const Vertex_handle& vertex() const { return vertex_; } private: Vertex_handle vertex_; Point point_; @@ -68,7 +68,7 @@ class Polyline_constraint_hierarchy_2 : public boost::iterator_adaptor< Point_it , typename Vertex_list::all_iterator - , const Point + , const Point& > { public: @@ -85,8 +85,8 @@ class Polyline_constraint_hierarchy_2 Vertex_it , typename Vertex_list::skip_iterator , Vertex_handle - , std::bidirectional_iterator_tag - , Vertex_handle> + , boost::use_default + , const Vertex_handle&> { public: Vertex_it() : Vertex_it::iterator_adaptor_() {} @@ -95,7 +95,7 @@ class Polyline_constraint_hierarchy_2 bool& input() { return this->base()->input; } private: friend class boost::iterator_core_access; - Vertex_handle dereference() const { return this->base()->vertex(); } + const Vertex_handle& dereference() const { return this->base()->vertex(); } }; typedef typename Constraint_list::iterator Constraint_it; From be83ab856ee9f35a013b4f0929bb87e89184d953 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 27 Jun 2023 12:57:54 +0100 Subject: [PATCH 0416/1398] Undo of accidental change --- BGL/examples/BGL_triangulation_2/dijkstra.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/BGL/examples/BGL_triangulation_2/dijkstra.cpp b/BGL/examples/BGL_triangulation_2/dijkstra.cpp index 5f9ab2a55fd9..3a1b061eb9e3 100644 --- a/BGL/examples/BGL_triangulation_2/dijkstra.cpp +++ b/BGL/examples/BGL_triangulation_2/dijkstra.cpp @@ -32,10 +32,6 @@ int main(int argc,char* argv[]) VertexIndexMap vertex_id_map; VertexIdPropertyMap vertex_index_pmap(vertex_id_map); int index = 0; - { - vertex_iterator vit = vertices(tr).begin(); - vit = std::prev(vit); - } for(vertex_descriptor vd : vertices(tr)) vertex_id_map[vd] = index++; From 46b756da123ad8b3a5a51ea56fc5d8fcc2014627 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 27 Jun 2023 13:24:27 +0100 Subject: [PATCH 0417/1398] We know that it is bidirectional, and we prefer that to using const Vertex_handle& --- .../internal/Polyline_constraint_hierarchy_2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 531cc089f871..b8bcaac8f18a 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 @@ -51,7 +51,7 @@ class Polyline_constraint_hierarchy_2 : vertex_(vh), point_(vertex_->point()), input(input) {} const Point& point() const { return point_; } - const Vertex_handle& vertex() const { return vertex_; } + Vertex_handle vertex() const { return vertex_; } private: Vertex_handle vertex_; Point point_; @@ -85,8 +85,8 @@ class Polyline_constraint_hierarchy_2 Vertex_it , typename Vertex_list::skip_iterator , Vertex_handle - , boost::use_default - , const Vertex_handle&> + , std::bidirectional_iterator_tag + , Vertex_handle> { public: Vertex_it() : Vertex_it::iterator_adaptor_() {} @@ -95,7 +95,7 @@ class Polyline_constraint_hierarchy_2 bool& input() { return this->base()->input; } private: friend class boost::iterator_core_access; - const Vertex_handle& dereference() const { return this->base()->vertex(); } + Vertex_handle dereference() const { return this->base()->vertex(); } }; typedef typename Constraint_list::iterator Constraint_it; From c7eb4f9fdd4f9dcc199430685fb5b0c05e01396c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 27 Jun 2023 13:33:48 +0100 Subject: [PATCH 0418/1398] Deal with prev() for graph_traits::iterator --- .../graph/internal/graph_traits_2D_triangulation_helper.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Triangulation_2/include/CGAL/boost/graph/internal/graph_traits_2D_triangulation_helper.h b/Triangulation_2/include/CGAL/boost/graph/internal/graph_traits_2D_triangulation_helper.h index 8585bc33db10..0c2904243c5f 100644 --- a/Triangulation_2/include/CGAL/boost/graph/internal/graph_traits_2D_triangulation_helper.h +++ b/Triangulation_2/include/CGAL/boost/graph/internal/graph_traits_2D_triangulation_helper.h @@ -156,7 +156,7 @@ struct Dereference_to_handle_enforcer Dereference_to_handle_enforcer, Iterator /*base*/, Handle /*value*/, - boost::use_default, + typename std::iterator_traits::iterator_category, Handle /*reference*/ > { @@ -166,7 +166,8 @@ struct Dereference_to_handle_enforcer private: typedef Dereference_to_handle_enforcer Self; typedef Iterator I; - typedef boost::iterator_adaptor Base; + typedef typename std::iterator_traits::iterator_category Category; + typedef boost::iterator_adaptor Base; public: Dereference_to_handle_enforcer() { } From 28383a9faf348a68142014265cf5f9ed6084253d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 09:07:34 +0100 Subject: [PATCH 0419/1398] Remove a test_Surface_mesh.cpp as incomplete code --- BGL/test/BGL/CMakeLists.txt | 1 - BGL/test/BGL/test_Surface_mesh.cpp | 125 ----------------------------- 2 files changed, 126 deletions(-) delete mode 100644 BGL/test/BGL/test_Surface_mesh.cpp diff --git a/BGL/test/BGL/CMakeLists.txt b/BGL/test/BGL/CMakeLists.txt index 0cbb7c3b9fc4..3b4304b5056b 100644 --- a/BGL/test/BGL/CMakeLists.txt +++ b/BGL/test/BGL/CMakeLists.txt @@ -35,7 +35,6 @@ create_single_source_cgal_program("test_test_face.cpp" ) create_single_source_cgal_program("test_Collapse_edge.cpp" ) create_single_source_cgal_program("test_Collapse_edge_with_constraints.cpp" ) create_single_source_cgal_program("test_graph_traits.cpp") -create_single_source_cgal_program("test_Surface_mesh.cpp") create_single_source_cgal_program("test_Properties.cpp") create_single_source_cgal_program("bench_read_from_stream_vs_add_face_and_add_faces.cpp") create_single_source_cgal_program("graph_traits_inheritance.cpp" ) diff --git a/BGL/test/BGL/test_Surface_mesh.cpp b/BGL/test/BGL/test_Surface_mesh.cpp deleted file mode 100644 index f47f4f49f94c..000000000000 --- a/BGL/test/BGL/test_Surface_mesh.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#define BOOST_TEST_MODULE graph_traits test -#include -#include - -BOOST_AUTO_TEST_CASE( edges_test ) -{ - edge_iterator eb, ee; - vertex_iterator vb, ve; - - Surface_fixture f; - boost::tie(eb, ee) = edges(f.m); - boost::tie(vb, ve) = vertices(f.m); - BOOST_CHECK(std::distance(eb, ee) == 7); - BOOST_CHECK(std::distance(vb, ve) == 5); - - Cube_fixture cf; - boost::tie(eb, ee) = edges(cf.m); - boost::tie(vb, ve) = vertices(cf.m); - BOOST_CHECK(std::distance(eb, ee) == 18); - BOOST_CHECK(std::distance(vb, ve) == 8); -} - -BOOST_AUTO_TEST_CASE( out_edges_test ) -{ - Surface_fixture f; - - BOOST_CHECK(out_degree(f.u, f.m) == 2); - BOOST_CHECK(out_degree(f.v, f.m) == 4); - std::pair out = out_edges(f.v, f.m); - BOOST_CHECK(std::distance(out.first, out.second) == 4); - out_edge_iterator it = out.first; - while(it != out.second) { - // the source should always be u - BOOST_CHECK(source(*it, f.m) == f.v); - // the target never - BOOST_CHECK(target(*it, f.m) != f.v); - ++it; - } -} - -BOOST_AUTO_TEST_CASE( in_edges_test ) -{ - Surface_fixture f; - BOOST_CHECK(in_degree(f.u, f.m) == 2); - BOOST_CHECK(in_degree(f.x, f.m) == 3); - BOOST_CHECK(in_degree(f.v, f.m) == 4); - std::pair in = in_edges(f.v, f.m); - BOOST_CHECK(std::distance(in.first, in.second) == 4); - - in_edge_iterator it = in.first; - while(it != in.second) { - // the source should never be u - BOOST_CHECK(source(*it, f.m) != f.v); - // the target must always be u - BOOST_CHECK(target(*it, f.m) == f.v); - ++it; - } -} - -BOOST_AUTO_TEST_CASE( in_out_equality ) -{ - // in and out degrees must be equal for each vertex - Cube_fixture f; - for(Sm::Vertex_iterator it = f.m.vertices_begin(); - it != f.m.vertices_end(); ++it) { - BOOST_CHECK(in_degree(*it, f.m) == out_degree(*it, f.m)); - } -} - -BOOST_AUTO_TEST_CASE( face_test ) -{ - Surface_fixture f; - std::pair - enc = enclosure(f.f1, f.m); - BOOST_CHECK(enc.first != enc.second); - BOOST_CHECK(std::distance(enc.first, enc.second) == 3); - enclosure_iterator begin = enc.first; - while(begin != enc.second) - { - BOOST_CHECK(face(*begin, f.m) == f.f1); - ++begin; - } -} - -BOOST_AUTO_TEST_CASE( weight_map_test ) -{ - Surface_fixture f; - Cube_fixture c; - - CGAL::SM_edge_weight_pmap wm1 = boost::get(boost::edge_weight, c.m); - edge_iterator eb, ee; - boost::test_tools::check_is_close_t check_close; - for(boost::tie(eb, ee) = edges(c.m); eb != ee; ++eb) { - BOOST_CHECK( - check_close(wm1[*eb], 2.0, boost::test_tools::percent_tolerance_t(0.00001)) - || check_close(wm1[*eb], 2.82843, boost::test_tools::percent_tolerance_t(0.001))); - } -} - - -BOOST_AUTO_TEST_CASE( vertices_test ) -{ - Surface_fixture f; - - // boost::property_map::type vi_map = get(f.m, boost::vertex_index); - - // vertex_iterator b,e; - - // for(boost::tie(b,e) = vertices(f.m); - // b!= e; - // ++b){ - // std::cout << boost::get(vi_map, *(b)) << std::endl; - // } - - // boost::property_map::type ew_map = get(f.m, boost::edge_weight); - - // edge_iterator be, ee; - - // for(boost::tie(be,ee) = edges(f.m); - // be!= ee; - // ++be){ - // std::cout << boost::get(ew_map, *(be)) << std::endl; - // } - -} From a469d128e79f9049fea54a2b33256b3980d0bfa5 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 09:11:07 +0100 Subject: [PATCH 0420/1398] Deduplicate file names for IO test --- BGL/test/BGL/test_deprecated_io.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/BGL/test/BGL/test_deprecated_io.cpp b/BGL/test/BGL/test_deprecated_io.cpp index 65459a997fd0..8c22b9f17df6 100644 --- a/BGL/test/BGL/test_deprecated_io.cpp +++ b/BGL/test/BGL/test_deprecated_io.cpp @@ -21,18 +21,18 @@ int main() SM sm_in, sm_out; Point_3 p0(0,0,0), p1(1,0,0), p2(0,1,0); CGAL::make_triangle(p0, p1, p2, sm_out); - bool ok = CGAL::write_off("tmp.off", sm_out); + bool ok = CGAL::write_off("tmp_deprecated.off", sm_out); assert(ok); - ok = CGAL::read_off("tmp.off", sm_in); + ok = CGAL::read_off("tmp_deprecated.off", sm_in); assert(ok); assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); sm_in.clear(); - std::ofstream os("tmp.off"); + std::ofstream os("tmp_deprecated.off"); ok = CGAL::write_off(os, sm_out); assert(ok); os.close(); - std::ifstream is("tmp.off"); + std::ifstream is("tmp_deprecated.off"); ok = CGAL::read_off(is, sm_in); assert(ok); assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); @@ -40,18 +40,18 @@ int main() sm_in.clear(); #ifdef CGAL_USE_VTK //vtk - os.open("tmp.vtp"); + os.open("tmp_deprecated.vtp"); ok = CGAL::write_vtp(os, sm_out); assert(ok); os.close(); - ok = CGAL::IO::read_VTP("tmp.vtp", sm_in); + ok = CGAL::IO::read_VTP("tmp_deprecated.vtp", sm_in); assert(ok); assert(num_vertices(sm_in) == 3 && num_faces(sm_in) == 1); sm_in.clear(); #endif //wrl - os.open("tmp.wrl"); + os.open("tmp_deprecated.wrl"); ok = CGAL::write_wrl(os, sm_out); assert(ok); os.close(); From a9d99b3ece594c7965e02344065c44cdf6992b04 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 09:24:15 +0100 Subject: [PATCH 0421/1398] int -> std::size_t --- .../test/STL_Extension/{leak.cpp => test_leak.cpp} | 0 STL_Extension/test/STL_Extension/test_nth_element.cpp | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename STL_Extension/test/STL_Extension/{leak.cpp => test_leak.cpp} (100%) diff --git a/STL_Extension/test/STL_Extension/leak.cpp b/STL_Extension/test/STL_Extension/test_leak.cpp similarity index 100% rename from STL_Extension/test/STL_Extension/leak.cpp rename to STL_Extension/test/STL_Extension/test_leak.cpp diff --git a/STL_Extension/test/STL_Extension/test_nth_element.cpp b/STL_Extension/test/STL_Extension/test_nth_element.cpp index 67077424ddfa..f9f0e8230daa 100644 --- a/STL_Extension/test/STL_Extension/test_nth_element.cpp +++ b/STL_Extension/test/STL_Extension/test_nth_element.cpp @@ -12,18 +12,18 @@ int test() { CGAL::nth_element(nbs, nbs+pivot, nbs+sizeof(nbs) / sizeof(int), cmp); std::cerr << "After nth_element, nbs["<< pivot << "] = " << nbs[pivot] << std::endl; assert(nbs[pivot]==expected_value); - for(int i = 0; i < sizeof(nbs) / sizeof(int); ++i) { + for(std::size_t i = 0; i < sizeof(nbs) / sizeof(int); ++i) { std::cerr << " " << nbs[i]; } std::cerr << std::endl; for(pivot=0; pivot < 10; ++pivot) CGAL::nth_element(nbs, nbs+pivot, nbs+sizeof(nbs) / sizeof(int), cmp); std::cerr << "After sort:\n"; - for(int i = 0; i < sizeof(nbs) / sizeof(int); ++i) { + for(std::size_t i = 0; i < sizeof(nbs) / sizeof(int); ++i) { std::cerr << " " << nbs[i]; } std::cerr << std::endl; - for(int i = 1; i < sizeof(nbs) / sizeof(int); ++i) { + for(std::size_t i = 1; i < sizeof(nbs) / sizeof(int); ++i) { assert(nbs[i]>=nbs[i-1]); } return 0; From e8b64d2e2807b095cca4912064d3517fd53f8426 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 09:29:22 +0100 Subject: [PATCH 0422/1398] @soesau can you please test that locally --- .../test/Shape_regularization/test_cgal_solver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shape_regularization/test/Shape_regularization/test_cgal_solver.cpp b/Shape_regularization/test/Shape_regularization/test_cgal_solver.cpp index 35904a073938..84a09fdda246 100644 --- a/Shape_regularization/test/Shape_regularization/test_cgal_solver.cpp +++ b/Shape_regularization/test/Shape_regularization/test_cgal_solver.cpp @@ -21,7 +21,7 @@ void test_cgal_solver() { using NQ = SR::Segments::Delaunay_neighbor_query_2; using AR = SR::Segments::Angle_regularization_2; - using QP = CGAL::CGAL_quadratic_program_traits; + using QP = CGAL::OSQP_quadratic_program_traits; using QP_AR = SR::QP_regularization; From 11a5bfc84f6e2e73282569f246c491f4661f6929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:42:25 +0200 Subject: [PATCH 0423/1398] fix warnings --- AABB_tree/test/AABB_tree/AABB_test_util.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AABB_tree/test/AABB_tree/AABB_test_util.h b/AABB_tree/test/AABB_tree/AABB_test_util.h index 61ddd98f3bd0..fae5abfe17c6 100644 --- a/AABB_tree/test/AABB_tree/AABB_test_util.h +++ b/AABB_tree/test/AABB_tree/AABB_test_util.h @@ -98,6 +98,9 @@ void test_all_intersection_query_types(Tree& tree) std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > r = tree.any_intersection(ray); std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > l = tree.any_intersection(line); std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > s = tree.any_intersection(segment); + CGAL_USE(r); + CGAL_USE(l); + CGAL_USE(s); // any_intersected_primitive std::optional optional_primitive; From 84abdc75822c3c153ad922a0daf9701b6b3918c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:43:21 +0200 Subject: [PATCH 0424/1398] add partial specialization of Output_rep for optional and variant --- Stream_support/include/CGAL/IO/io.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index e287fe8e16f2..8634c38f88dd 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -32,6 +32,8 @@ #include #include #include +#include +#include namespace CGAL { @@ -186,6 +188,30 @@ class Output_rep std::ostream& operator()( std::ostream& os) const { return (os << t); } }; +template +class Output_rep, F> +{ + const std::optional& t; + +public: + Output_rep( const std::optional& tt) : t(tt) {} + std::ostream& operator()( std::ostream& os) const { + if (t==std::nullopt) return (os << "--"); + return (os << t.value()); } +}; + +template +class Output_rep, F> +{ + const std::variant& t; + +public: + Output_rep( const std::variant& tt) : t(tt) {} + std::ostream& operator()( std::ostream& os) const { + return (os << "--"); + } +}; + /*! \relates Output_rep \brief stream output of the \c Output_rep calls its \c operator(). From 62f22e9a6cbf09081c31e882552a011b30a99933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:43:56 +0200 Subject: [PATCH 0425/1398] use oformat for optional --- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 4 ++-- Mesh_3/test/Mesh_3/test_meshing_utilities.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index 5d242c1a604b..ef64b75890f6 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -1149,9 +1149,9 @@ number_of_bad_elements_impl() const Subdomain mc_subdomain = this->r_oracle_.is_in_domain_object()(this->r_tr_.dual(mc)); std::cerr << "*** Is in complex? c is marked in domain: " << this->r_c3t3_.is_in_complex(c) - << " / c is really in subdomain: " << c_subdomain + << " / c is really in subdomain: " << oformat(c_subdomain) << " / mc is marked in domain: " << this->r_c3t3_.is_in_complex(mc) - << " / mc is really in subdomain: " << mc_subdomain + << " / mc is really in subdomain: " << oformat(mc_subdomain) << std::endl; diff --git a/Mesh_3/test/Mesh_3/test_meshing_utilities.h b/Mesh_3/test/Mesh_3/test_meshing_utilities.h index a9c545a75553..8450754a767d 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_utilities.h +++ b/Mesh_3/test/Mesh_3/test_meshing_utilities.h @@ -333,13 +333,13 @@ struct Tester else { std::cerr << "\nc1 circumcenter: " << tr.dual(c1); std::cerr << "\nc1 is in domain: " - << domain.is_in_domain_object()(tr.dual(c1)); + << CGAL::oformat(domain.is_in_domain_object()(tr.dual(c1))); } if(tr.is_infinite(c2)) std::cerr << "\nc2 is infinite"; else { std::cerr << "\nc2 circumcenter: "<< tr.dual(c2); std::cerr << "\nc2 is in domain: " - << domain.is_in_domain_object()(tr.dual(c2)); + << CGAL::oformat(domain.is_in_domain_object()(tr.dual(c2))); } std::cerr << std::endl; assert(false); From 209549df22409830954a666ae79cd99cd2149242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:44:25 +0200 Subject: [PATCH 0426/1398] use value instead of get_ptr --- Triangulation/include/CGAL/Delaunay_triangulation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation/include/CGAL/Delaunay_triangulation.h b/Triangulation/include/CGAL/Delaunay_triangulation.h index a2203ee762ef..8fa25e4d08ca 100644 --- a/Triangulation/include/CGAL/Delaunay_triangulation.h +++ b/Triangulation/include/CGAL/Delaunay_triangulation.h @@ -416,7 +416,7 @@ ::remove( Vertex_handle v ) Dark_triangulation dark_side( maximal_dimension(), flat_orientation_ ? - std::pair(current_dimension(), flat_orientation_.get_ptr()) + std::pair(current_dimension(), &flat_orientation_.value()) : std::pair((std::numeric_limits::max)(), (Flat_orientation_d*) nullptr) ); Dark_s_handle dark_s; From 39878ed33a458eb1c7b7502198c456f3241c0b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:48:36 +0200 Subject: [PATCH 0427/1398] fix typos --- .../Point_location_test.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h index eedde5108af7..72f8306f6987 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Point_location_test.h @@ -1083,11 +1083,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign and check results for (size_t qi = 0; qi < size; ++qi) { // Assign object to a face - Face_const_handle* fh_ref = std::get_ifFace_const_handle>(&(objs[0][qi])); + Face_const_handle* fh_ref = std::get_if(&(objs[0][qi])); if (fh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Face_const_handle* fh_cur = - std::get_ifFace_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (fh_cur) { if ((*fh_cur) != (*fh_ref)) { std::cout << "Error: point location number " << pl << std::endl; @@ -1102,13 +1102,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) std::cout << "Expected: a face." << std::endl; result += -1; Halfedge_const_handle* hh_cur = - std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (hh_cur) { std::cout << "Actual: a halfedge." << std::endl; continue; } Vertex_const_handle* vh_cur = - std::get_ifVertex_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (vh_cur) { std::cout << "Actual: a vertex." << std::endl; continue; @@ -1124,11 +1124,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign object to a halfedge Halfedge_const_handle* hh_ref = - std::get_ifHalfedge_const_handle>(&(objs[0][qi])); + std::get_if(&(objs[0][qi])); if (hh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Halfedge_const_handle* hh_cur = - std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (hh_cur) { if (((*hh_cur) != (*hh_ref)) && ((*hh_cur)->twin() != (*hh_ref))) { std::cout << "Error: point location number " << pl << std::endl; @@ -1145,13 +1145,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) << std::endl; result += -1; Face_const_handle* fh_cur = - std::get_ifFace_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (fh_cur) { std::cout << "Actual: a face." << std::endl; continue; } Vertex_const_handle* vh_cur = - std::get_ifVertex_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (vh_cur) { std::cout << "Actual: a vertex." << std::endl; continue; @@ -1163,11 +1163,11 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) // Assign object to a vertex Vertex_const_handle* vh_ref = - std::get_ifVertex_const_handle>(&(objs[0][qi])); + std::get_if(&(objs[0][qi])); if (vh_ref) { for (size_t pl = 1; pl < pls_num; ++pl) { Vertex_const_handle* vh_cur = - std::get_ifVertex_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (vh_cur) { if ((*vh_cur) != (*vh_ref)) { std::cout << "Error: point location number " << pl << std::endl; @@ -1183,13 +1183,13 @@ verify(Variants_vector objs[NUM_PL_STRATEGIES], size_t size, size_t pls_num) std::cout << "Expected: a vertex: "<< (*vh_ref)->point() << std::endl; result += -1; Face_const_handle* fh_cur = - std::get_ifFace_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (fh_cur) { std::cout << "Actual: a face." << std::endl; continue; } Halfedge_const_handle* hh_cur = - std::get_ifHalfedge_const_handle>(&(objs[pl][qi])); + std::get_if(&(objs[pl][qi])); if (hh_cur) { std::cout << "Actual: a halfedge." << std::endl; continue; From 9526dc8661b74598d74f4a2ad5970f7ad779bde2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:49:26 +0200 Subject: [PATCH 0428/1398] use oformat --- .../include/CGAL/Curved_kernel_via_analysis_2/Point_2.h | 9 ++++----- .../test/Arrangement_on_surface_2/Traits_base_test.h | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index a3c07a486906..c134c8cc9011 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -700,14 +700,13 @@ class Point_2 : default: // ASCII os << "Point_2("; - - os << this->ptr()->_m_xy; + os << oformat(this->ptr()->_m_xy); os << ","; - os << this->ptr()->_m_x; + os << oformat(this->ptr()->_m_x); os << ","; - os << this->ptr()->_m_curve; + os << oformat(this->ptr()->_m_curve); os << ","; - os << this->ptr()->_m_arcno; + os << oformat(this->ptr()->_m_arcno); os << ","; os << this->ptr()->_m_location; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h index 9bfe463e3bf3..696c03ebb69e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h @@ -136,8 +136,8 @@ class Traits_base_test : public IO_test { typename Traits::Equal_2 equal = this->m_geom_traits.equal_2_object(); if (equal(exp_answer, real_answer)) return true; - std::string exp_answer_str = boost::lexical_cast(exp_answer); - std::string real_answer_str = boost::lexical_cast(real_answer); + std::string exp_answer_str = boost::lexical_cast( oformat(exp_answer) ); + std::string real_answer_str = boost::lexical_cast( oformat(real_answer) ); this->print_answer(exp_answer_str, real_answer_str, "x-monotone curve"); return false; } From f8323e7df8e4d646b9f8e2cbb757f27e78a2ca60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 10:52:25 +0200 Subject: [PATCH 0429/1398] use std API --- .../Algebraic_curve_kernel_2.h | 2 +- ...gebraic_real_quadratic_refinement_rep_bfi.h | 18 +++++++++--------- .../Arr_trapezoid_ric_pl_impl.h | 4 ++-- .../CGAL/Arrangement_2/Arr_traits_adaptor_2.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h index b249fbf4629d..01798000c555 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h @@ -368,7 +368,7 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ result_type operator() (const argument_type& arg) const { CGAL_assertion(bool(_inner)); CGAL_assertion(bool(_outer)); - return _outer.get()(_inner.get()(arg)); + return _outer.value()(_inner.value()(arg)); } private: ::std::optional _inner; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h index 9e1cff2083b8..06effd6b5dd5 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h @@ -113,8 +113,8 @@ class Algebraic_real_quadratic_refinement_rep_bfi low_bfi_ = CGAL::convert_to_bfi(this->low()); high_bfi_ = CGAL::convert_to_bfi(this->high()); - f_low_bfi_ = f_bfi_.get().evaluate(low_bfi_.get()); - f_high_bfi_ = f_bfi_.get().evaluate(high_bfi_.get()); + f_low_bfi_ = f_bfi_.value().evaluate(low_bfi_.value()); + f_high_bfi_ = f_bfi_.value().evaluate(high_bfi_.value()); } @@ -125,7 +125,7 @@ class Algebraic_real_quadratic_refinement_rep_bfi } m_bfi = CGAL::convert_to_bfi(m); - f_m_bfi = f_bfi_.get().evaluate(m_bfi); + f_m_bfi = f_bfi_.value().evaluate(m_bfi); if(CGAL::zero_in(f_m_bfi)) { @@ -329,25 +329,25 @@ class Algebraic_real_quadratic_refinement_rep_bfi low_bfi_ = CGAL::convert_to_bfi(this->low()); } if(! f_low_bfi_) { - f_low_bfi_ = f_bfi_.get().evaluate(low_bfi_.get()); + f_low_bfi_ = f_bfi_.value().evaluate(low_bfi_.value()); } if(! high_bfi_) { high_bfi_ = CGAL::convert_to_bfi(this->high()); } if(! f_high_bfi_) { - f_high_bfi_ = f_bfi_.get().evaluate(high_bfi_.get()); + f_high_bfi_ = f_bfi_.value().evaluate(high_bfi_.value()); } Integer i; while(true) { - if(CGAL::zero_in(f_low_bfi_.get() - f_high_bfi_.get())) { + if(CGAL::zero_in(f_low_bfi_.value() - f_high_bfi_.value())) { _set_prec(2*prec_); continue; } - BFI denom = f_low_bfi_.get()-f_high_bfi_.get(); + BFI denom = f_low_bfi_.value()-f_high_bfi_.value(); - BFI z = f_low_bfi_.get() / denom; + BFI z = f_low_bfi_.value() / denom; std::pair int_pair = _to_integer_interval(z,N); Integer i_low = int_pair.first; @@ -458,7 +458,7 @@ class Algebraic_real_quadratic_refinement_rep_bfi f_bfi_ = _convert_polynomial_to_bfi(this->polynomial()); } - BFI eval = f_bfi_.get().evaluate(convert_to_bfi(m)); + BFI eval = f_bfi_.value().evaluate(convert_to_bfi(m)); CGAL::Sign s = CGAL::sign(CGAL::lower(eval)); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h index a52086ce117f..188343887bc2 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_trapezoid_ric_pl_impl.h @@ -184,7 +184,7 @@ _get_unbounded_face(const Td_map_item& item,const Point_2& p, Td_map_item& left_v_item = td.locate(tr.left(),td_lt); CGAL_assertion(td_lt == TD::POINT); Halfedge_const_handle he; - if (std::get(&left_v_item) != nullptr) { + if (std::get_if(&left_v_item) != nullptr) { Td_active_vertex v(std::get(left_v_item)); he = v.cw_he(); } @@ -216,7 +216,7 @@ _get_unbounded_face(const Td_map_item& item,const Point_2& p, Td_map_item& right_v_item = td.locate(tr.right(),td_lt); CGAL_assertion(td_lt == TD::POINT); Halfedge_const_handle he; - if (std::get(&right_v_item)!= nullptr) { + if (std::get_if(&right_v_item)!= nullptr) { Td_active_vertex v(std::get(right_v_item)); he = v.cw_he(); } 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 9c74e4ef9d71..8f88642aed8a 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 @@ -3580,7 +3580,7 @@ class Arr_traits_adaptor_2 : // Verify the first intersection is an overlap, remove it, and // recursively call. const X_monotone_curve_2* xcv = - std::get(&(intersections.front())); + std::get_if(&(intersections.front())); if (! xcv) { CGAL_error_msg("The first intersection is not an overlap!"); return SMALLER; From 63bf2a85b92f559e09c08ceacc9742fc3612ee9d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 09:54:50 +0100 Subject: [PATCH 0430/1398] Fix for deprecated warning --- .../include/CGAL/Qt/manipulatedFrame_impl.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h b/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h index dbf263c30d49..c1cd449d0016 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedFrame_impl.h @@ -93,10 +93,10 @@ illustration. */ CGAL_INLINE_FUNCTION void ManipulatedFrame::checkIfGrabsMouse(int x, int y, const Camera *const camera) { - const int thresold = 10; + const int threshold = 10; const Vec proj = camera->projectedCoordinatesOf(position()); - setGrabsMouse(keepsGrabbingMouse_ || ((fabs(x - proj.x) < thresold) && - (fabs(y - proj.y) < thresold))); + setGrabsMouse(keepsGrabbingMouse_ || ((fabs(x - proj.x) < threshold) && + (fabs(y - proj.y) < threshold))); } @@ -219,8 +219,8 @@ int ManipulatedFrame::mouseOriginalDirection(const QMouseEvent *const e) { CGAL_INLINE_FUNCTION qreal ManipulatedFrame::deltaWithPrevPos(QMouseEvent *const event, Camera *const camera) const { - qreal dx = qreal(event->x() - prevPos_.x()) / camera->screenWidth(); - qreal dy = qreal(event->y() - prevPos_.y()) / camera->screenHeight(); + qreal dx = qreal(event->position().x() - prevPos_.x()) / camera->screenWidth(); + qreal dy = qreal(event->position().y() - prevPos_.y()) / camera->screenHeight(); qreal value = fabs(dx) > fabs(dy) ? dx : dy; return value * zoomSensitivity(); @@ -319,7 +319,7 @@ void ManipulatedFrame::mouseMoveEvent(QMouseEvent *const event, const qreal prev_angle = atan2(prevPos_.y() - trans[1], prevPos_.x() - trans[0]); - const qreal angle = atan2(event->y() - trans[1], event->x() - trans[0]); + const qreal angle = atan2(event->position().y() - trans[1], event->position().x() - trans[0]); const Vec axis = transformOf(camera->frame()->inverseTransformOf(Vec(0.0, 0.0, -1.0))); @@ -336,9 +336,9 @@ void ManipulatedFrame::mouseMoveEvent(QMouseEvent *const event, Vec trans; int dir = mouseOriginalDirection(event); if (dir == 1) - trans.setValue(event->x() - prevPos_.x(), 0.0, 0.0); + trans.setValue(event->position().x() - prevPos_.x(), 0.0, 0.0); else if (dir == -1) - trans.setValue(0.0, prevPos_.y() - event->y(), 0.0); + trans.setValue(0.0, prevPos_.y() - event->position().y(), 0.0); switch (camera->type()) { case Camera::PERSPECTIVE: @@ -367,7 +367,7 @@ void ManipulatedFrame::mouseMoveEvent(QMouseEvent *const event, case ROTATE: { Vec trans = camera->projectedCoordinatesOf(position()); - Quaternion rot = deformedBallQuaternion(event->x(), event->y(), trans[0], + Quaternion rot = deformedBallQuaternion(event->position().x(), event->position().y(), trans[0], trans[1], camera); trans = Vec(-rot[0], -rot[1], -rot[2]); trans = camera->frame()->orientation().rotate(trans); From 2a1cf486bb10c32205cf5dc167c20e7194b39a94 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 10:05:13 +0100 Subject: [PATCH 0431/1398] These .cpp files are used like .h files --- Triangulation/examples/Triangulation/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Triangulation/examples/Triangulation/CMakeLists.txt b/Triangulation/examples/Triangulation/CMakeLists.txt index bed700a1b857..d473f6864187 100644 --- a/Triangulation/examples/Triangulation/CMakeLists.txt +++ b/Triangulation/examples/Triangulation/CMakeLists.txt @@ -21,8 +21,6 @@ if(TARGET CGAL::Eigen3_support) create_single_source_cgal_program("triangulation.cpp") create_single_source_cgal_program("triangulation_data_structure_dynamic.cpp") create_single_source_cgal_program("triangulation_data_structure_static.cpp") - create_single_source_cgal_program("triangulation1.cpp") - create_single_source_cgal_program("triangulation2.cpp") foreach( target From 7a26a6af583852f17559a3baf462b4283c434a54 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 10:14:48 +0100 Subject: [PATCH 0432/1398] Remove files in test that are also in examples (and compiled there) --- Mesh_3/test/Mesh_3/CMakeLists.txt | 1 - Mesh_3/test/Mesh_3/implicit_functions.cpp | 303 ---------------------- Mesh_3/test/Mesh_3/implicit_functions.h | 36 --- 3 files changed, 340 deletions(-) delete mode 100644 Mesh_3/test/Mesh_3/implicit_functions.cpp delete mode 100644 Mesh_3/test/Mesh_3/implicit_functions.h diff --git a/Mesh_3/test/Mesh_3/CMakeLists.txt b/Mesh_3/test/Mesh_3/CMakeLists.txt index 5332a40702ac..2a8e19e1c383 100644 --- a/Mesh_3/test/Mesh_3/CMakeLists.txt +++ b/Mesh_3/test/Mesh_3/CMakeLists.txt @@ -55,7 +55,6 @@ create_single_source_cgal_program( "test_mesh_polyhedral_domain_with_features_de create_single_source_cgal_program( "test_meshing_with_one_step.cpp" ) create_single_source_cgal_program( "test_mesh_cell_base_3.cpp") create_single_source_cgal_program( "test_min_edge_length.cpp") -create_single_source_cgal_program( "implicit_functions.cpp") foreach(target test_boost_has_xxx diff --git a/Mesh_3/test/Mesh_3/implicit_functions.cpp b/Mesh_3/test/Mesh_3/implicit_functions.cpp deleted file mode 100644 index 0ede1606d8b2..000000000000 --- a/Mesh_3/test/Mesh_3/implicit_functions.cpp +++ /dev/null @@ -1,303 +0,0 @@ -///////////////// Code for functions of famous surfaces ///////////////// - - -// Sphere (r=1) - -double sphere_function (double x, double y, double z) { - double x2=x*x, y2=y*y, z2=z*z; - - return x2+y2+z2-1; -} - - -// Ellipsoid (r=1) - -double ellipsoid_function (double x, double y, double z) { - double x2=x*x, y2=y*y, z2=z*z; - - return x2+2*y2+4*z2-1; -} - - -// Torus (r=2) - -double torus_function (double x, double y, double z) { - double x2=x*x, y2=y*y, z2=z*z; - double x4=x2*x2, y4=y2*y2, z4=z2*z2; - - return x4 + y4 + z4 + 2 *x2* y2 + 2* - x2*z2 + 2*y2* z2 - 5 *x2 + 4* y2 - 5*z2+4; -} - - -// "Chair" (r=6) - -double chair_function (double x, double y, double z) { - double x2=x*x, y2=y*y, z2=z*z; - double x4=x2*x2, y4=y2*y2, z4=z2*z2; - - return x4-1.2*x2*y2+3.6*x2*z2-7.50*x2+y4+3.6*y2*z2-7.50*y2+.2*z4-7.50*z2+64.0625-16.0*z*y2+16.0*x2*z; -} - - -// "Tanglecube" (r=4) - -double tanglecube_function (double x, double y, double z) { - double x2=x*x, y2=y*y, z2=z*z; - double x4=x2*x2, y4=y2*y2, z4=z2*z2; - - return x4 - 5*x2 + y4 - 5*y2 + z4 - 5*z2 + 11.8; -} - -double cube_function (double x, double y, double z){ - if( x < 1 && -x < 1 && - y < 1 && -y < 1 && - z < 1 && -z < 1 ) - return -1.; - return 1.; -} - -// Barth's octic surface (degree 8) - -double octic_function (double x, double y, double z) { // r=2 - double x2=x*x, y2=y*y, z2=z*z; - double x4=x2*x2, y4=y2*y2, z4=z2*z2; - double x6=x4*x2, y6=y4*y2, z6=z4*z2; - double x8=x4*x4, y8=y4*y4, z8=z4*z4; - - return 43.30495169 *x2* y2 + 43.30495169 *x2* z2 + 43.30495169 *y2 * z2 + 44.36067980 *x6* y2 + 44.36067980* x6 * z2 + 66.54101970* x4* y4 + 66.54101970* x4 * z4 + 44.36067980 *x2 * y6 - 11.70820393* x2 - 11.70820393* y2 - 11.70820393* z2 + 37.65247585 *x4 + 37.65247585 *y4 + 37.65247585* z4 + 11.09016995* x8 + 11.09016995 *y8 + 11.09016995* z8 + 133.0820394 *x2* y4* z2 + 133.0820394 *x2 * y2 * z4 + 44.36067980* x2 * z6 + 44.36067980 *y6 * z2 + 66.54101970 *y4 * z4 + 44.36067980 *y2 * z6 + 133.0820394* x4* y2 * z2 - 91.95742756 *x4 * y2 - 91.95742756 *x4 *z2 - 91.95742756* x2 * y4 - 91.95742756 *x2 *z4 - 91.95742756* y4 * z2 - 183.9148551* x2 *y2 *z2 - 30.65247585 *x6 - 30.65247585* y6 - 91.95742756 *y2 * z4 - 30.65247585* z6 + 1.618033988; -} - - -// "Heart" - -double heart_function (double x, double y, double z) { // radius = 2 - - return (2*x*x+y*y+z*z-1)*(2*x*x+y*y+z*z-1)*(2*x*x+y*y+z*z-1) - (0.1*x*x+y*y)*z*z*z; -} - - -// Klein's bottle - -double klein_function (double x, double y, double z) { // radius = 4 - - return (x*x+y*y+z*z+2*y-1)*((x*x+y*y+z*z-2*y-1)*(x*x+y*y+z*z-2*y-1)-8*z*z)+16*x*z*(x*x+y*y+z*z-2*y-1); -} - - -// Ring - -double ring_function (double x, double y, double z) { // radius = ? - double e=0.1; - - double f1 = x*x+y*y+z*z-1; - double f2 = x; - - f1 = f1*f1-e*e; - f2 = f2*f2-e*e; - - if (f1 < 0 && f2 < 0) - return -1.; - else if (f1 > 0 || f2 > 0) - return 1.; - else - return 0.; -} - - -// False knot - -double false_knot_function (double x, double y, double z) { // radius = 1 - double d=1.2, e=0.1; - - double f1 = x*(x*x-z*z)-2*x*z*z-y*y+d*d-x*x-z*z-y*y; - - double m2 = z*(x*x-z*z)+2*x*x*z; - double f2 = 4*y*y*(d*d-x*x-z*z-y*y) - m2*m2; - - f1 = f1*f1-e*e; - f2 = f2*f2-e*e; - - if (f1 < 0 && f2 < 0) - return -1.; - else if (f1 > 0 || f2 > 0) - return 1.; - else - return 0.; -} - - -// Knot 1 - -void puiss(double& x, double& y, int n) { - - double xx = 1, yy = 0; - - while(n>0) { - if (n&1) { - double xxx = xx, yyy = yy; - xx = xxx*x - yyy*y; - yy = xxx*y + yyy*x; - } - - double xxx = x, yyy = y; - x=xxx*xxx-yyy*yyy; - y=2*xxx*yyy; - - n/=2; - } - - x = xx; - y = yy; -} - - - -double knot1_function (double a, double b, double c) { // radius = 4 - double e=0.1; - - double x, y, z, t, den; - den=1+a*a+b*b+c*c; - x=2*a/den; - y=2*b/den; - z=2*c/den; - t=(1-a*a-b*b-c*c)/den; - - double x3=x, y3=y, z2=z, t2=t; - puiss(x3,y3,3); - puiss(z2,t2,2); - - double f1 = z2-x3; - double f2 = t2-y3; - - f1 = f1*f1; - f2 = f2*f2; - e=e*e/(den-1); - - if (f1+f2-e < 0) - return -1.; - else if (f1+f2-e > 0) - return 1.; - else - return 0.; -} - -/* -double knot1_function (double x, double y, double z) { // radius = 4 - double e=0.1; - - double c1, c2, c3, c4, den; - den=1+x*x+y*y+z*z; - c1=2*x/den; - c2=2*y/den; - c3=2*z/den; - c4=(1-x*x-y*y-z*z)/den; - - double f1 = c1*(c1*c1-c2*c2)-2*c1*c2*c2-c3*c3+c4*c4; - double f2 = c2*(c1*c1-c2*c2)+2*c1*c1*c2-2*c3*c4; - - f1 = f1*f1; - f2 = f2*f2; - e=e*e/(den-1); - - if (f1+f2-e < 0) - return -1.; - else if (f1+f2-e > 0) - return 1.; - else - return 0.; -} -*/ - -double knot1_surf1_function (double x, double y, double z) { // radius = 4 - double c1, c2, c3, c4, den; - den=1+x*x+y*y+z*z; - c1=2*x/den; - c2=2*y/den; - c3=2*z/den; - c4=(1-x*x-y*y-z*z)/den; - - return c1*(c1*c1-c2*c2)-2*c1*c2*c2-c3*c3+c4*c4; -} - - -double knot1_surf2_function (double x, double y, double z) { // radius = 4 - double c1, c2, c3, c4, den; - den=1+x*x+y*y+z*z; - c1=2*x/den; - c2=2*y/den; - c3=2*z/den; - c4=(1-x*x-y*y-z*z)/den; - - return c2*(c1*c1-c2*c2)+2*c1*c1*c2-2*c3*c4; -} - - -// Knot 2 - -double knot2_function (double a, double b, double c) { // radius = 4 - double e=0.025; - - double x, y, z, t, den; - den=1+a*a+b*b+c*c; - x=2*a/den; - y=2*b/den; - z=2*c/den; - t=(1-a*a-b*b-c*c)/den; - - double x7=x, y7=y, x13=x, y13=y; - puiss(x7,y7,7); - puiss(x13,y13,13); - - double z3=z, t3=t; - puiss(z3,t3,3); - - double f1t = (z3-x7)*(z3-x7+100*x13) - (t3-y7)*(t3-y7+100*y13); - double f2t = (z3-x7)*(t3-y7+100*y13) + (t3-y7)*(z3-x7+100*x13); - double f1 = f1t*(z3-x7-100*x13) - f2t*(t3-y7-100*y13); - double f2 = f1t*(t3-y7-100*y13) + f2t*(z3-x7-100*x13); - - f1 = f1*f1; - f2 = f2*f2; - e=e*e/(den-1); - - if (f1+f2-e < 0) - return -1.; - else if (f1+f2-e > 0) - return 1.; - else - return 0.; -} - - -// Knot 3 - - -double knot3_function (double a, double b, double c) { // radius = 4 - double e=0.025; - - double x, y, z, t, den; - den=1+a*a+b*b+c*c; - x=2*a/den; - y=2*b/den; - z=2*c/den; - t=(1-a*a-b*b-c*c)/den; - - double x19=x, y19=y, z17=z, t17=t; - puiss(x19,y19,19); - puiss(z17,t17,17); - - double f1 = z17-x19; - double f2 = t17-y19; - - f1 = f1*f1; - f2 = f2*f2; - e=e*e/(den-1); - - if (f1+f2-e < 0) - return -1.; - else if (f1+f2-e > 0) - return 1.; - else - return 0.; -} diff --git a/Mesh_3/test/Mesh_3/implicit_functions.h b/Mesh_3/test/Mesh_3/implicit_functions.h deleted file mode 100644 index f5293a87028f..000000000000 --- a/Mesh_3/test/Mesh_3/implicit_functions.h +++ /dev/null @@ -1,36 +0,0 @@ -///////////////// Definitions of several famous surfaces ///////////////// -double sphere_function (double, double, double); // (c=(0,0,0), r=1) -double ellipsoid_function (double, double, double); // (c=(0,0,0), r=1) -double torus_function (double, double, double); // (c=(0,0,0), r=2) -double chair_function (double, double, double); // (c=(0,0,0), r=6) -double tanglecube_function (double, double, double); // (c=(0,0,0), r=4) -double octic_function (double, double, double); // (c=(0,0,0), r=2) -double heart_function (double, double, double); // (c=(0,0,0), r=2) -double klein_function (double, double, double); // (c=(0,0,0), r=4) -double ring_function (double, double, double); // (c=(0,0,0), r=?) -double false_knot_function (double, double, double); // (c=(0,0,0), r=1) -double knot1_function (double, double, double); // (c=(0,0,0), r=4) -double knot2_function (double, double, double); // (c=(0,0,0), r=4) -double knot3_function (double, double, double); // (c=(0,0,0), r=4) -double cube_function (double, double, double); // (c=(0,0,0), r=2) - - -template -double sphere_function (double x, double y, double z) // (c=(0,0,0), r=Sq_radius) -{ - double x2=x*x, y2=y*y, z2=z*z; - return (x2+y2+z2)/Sq_radius - 1; -} - - - -template -class FT_to_point_function_wrapper : public CGAL::cpp98::unary_function -{ - typedef FT (*Implicit_function)(FT, FT, FT); - Implicit_function function; -public: - typedef P Point; - FT_to_point_function_wrapper(Implicit_function f) : function(f) {} - FT operator()(Point p) const { return function(p.x(), p.y(), p.z()); } -}; From d88d2157bf9357d8bac958d42e7e266ab7b82e5e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 10:16:45 +0100 Subject: [PATCH 0433/1398] Fix CMakeLists.txt --- Triangulation/examples/Triangulation/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Triangulation/examples/Triangulation/CMakeLists.txt b/Triangulation/examples/Triangulation/CMakeLists.txt index d473f6864187..3ad27172e581 100644 --- a/Triangulation/examples/Triangulation/CMakeLists.txt +++ b/Triangulation/examples/Triangulation/CMakeLists.txt @@ -30,9 +30,7 @@ if(TARGET CGAL::Eigen3_support) regular_triangulation triangulation triangulation_data_structure_dynamic - triangulation_data_structure_static - triangulation1 - triangulation2) + triangulation_data_structure_static) target_link_libraries(${target} PUBLIC CGAL::Eigen3_support) endforeach() else() From 65680a428b1c1733b64be4f5e51ad7bd0d303560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 11:19:21 +0200 Subject: [PATCH 0434/1398] more oformat use --- .../Arrangement_on_surface_2/Traits_test.h | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h index fb912860f591..fe340b4a88cd 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h @@ -733,7 +733,7 @@ min_vertex_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; Point_2& exp_answer = this->m_points[id2]; - std::cout << "Test: min_vertex( " << this->m_xcurves[id1] << " ) ? " + std::cout << "Test: min_vertex( " << CGAL::oformat(this->m_xcurves[id1]) << " ) ? " << exp_answer << " "; Point_2 real_answer = @@ -751,7 +751,7 @@ max_vertex_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; Point_2& exp_answer = this->m_points[id2]; - std::cout << "Test: max_vertex( " << this->m_xcurves[id1] << " ) ? " + std::cout << "Test: max_vertex( " << CGAL::oformat(this->m_xcurves[id1]) << " ) ? " << exp_answer << " "; Point_2 real_answer = @@ -767,7 +767,7 @@ is_vertical_wrapper(std::istringstream& str_stream) unsigned int id; str_stream >> id; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: is_vertical( " << this->m_xcurves[id] << " ) ? " + std::cout << "Test: is_vertical( " << CGAL::oformat(this->m_xcurves[id]) << " ) ? " << exp_answer << " "; bool real_answer = @@ -789,7 +789,7 @@ compare_y_at_x_wrapper(std::istringstream& str_stream) str_stream >> id1 >> id2; unsigned int exp_answer = this->get_expected_enum(str_stream); std::cout << "Test: compare_y_at_x( " << this->m_points[id1] << "," - << this->m_xcurves[id2] << " ) ? " << exp_answer << " "; + << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; unsigned int real_answer = this->m_geom_traits.compare_y_at_x_2_object()(this->m_points[id1], @@ -853,8 +853,8 @@ compare_y_at_x_right_wrapper(std::istringstream& str_stream) unsigned int id1, id2, id3; str_stream >> id1 >> id2 >> id3; unsigned int exp_answer = this->get_expected_enum(str_stream); - std::cout << "Test: compare_y_at_x_right( " << this->m_xcurves[id1] << "," - << this->m_xcurves[id2] << ", " << this->m_points[id3] << " ) ? " + std::cout << "Test: compare_y_at_x_right( " << CGAL::oformat(this->m_xcurves[id1]) << "," + << CGAL::oformat(this->m_xcurves[id2]) << ", " << this->m_points[id3] << " ) ? " << exp_answer << " "; unsigned int real_answer = @@ -891,8 +891,8 @@ equal_curves_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: equal( " << this->m_xcurves[id1] << ", " - << this->m_xcurves[id2] << " ) ? " << exp_answer << " "; + std::cout << "Test: equal( " << CGAL::oformat(this->m_xcurves[id1]) << ", " + << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; bool real_answer = this->m_geom_traits.equal_2_object()(this->m_xcurves[id1], this->m_xcurves[id2]); @@ -918,7 +918,7 @@ make_x_monotone_wrapper(std::istringstream& str_stream) unsigned int id; str_stream >> id; - std::cout << "Test: make_x_monotone( " << this->m_curves[id] << " ) ? "; + std::cout << "Test: make_x_monotone( " << CGAL::oformat(this->m_curves[id]) << " ) ? "; std::vector objs; this->m_geom_traits.make_x_monotone_2_object()(this->m_curves[id], std::back_inserter(objs)); @@ -979,8 +979,8 @@ intersect_wrapper(std::istringstream& str_stream) this->m_xcurves[id2], std::back_inserter(xections)); - std::cout << "Test: intersect( " << this->m_xcurves[id1] << "," - << this->m_xcurves[id2] << " ) ? "; + std::cout << "Test: intersect( " << CGAL::oformat(this->m_xcurves[id1]) << "," + << CGAL::oformat(this->m_xcurves[id2]) << " ) ? "; size_t num; str_stream >> num; if (! this->compare(num, xections.size(), "size")) return false; @@ -1031,7 +1031,7 @@ bool Traits_test::split_wrapper(std::istringstream& str_stream) unsigned int id1, id2, id3, id4; str_stream >> id1 >> id2 >> id3 >> id4; X_monotone_curve_2 cv1, cv2; - std::cout << "Test: split( " << this->m_xcurves[id1] << "," + std::cout << "Test: split( " << CGAL::oformat(this->m_xcurves[id1]) << "," << this->m_points[id2] << " ) ? "; this->m_geom_traits.split_2_object()(this->m_xcurves[id1], @@ -1069,8 +1069,8 @@ are_mergeable_wrapper_imp(std::istringstream& str_stream, CGAL::Tag_true) unsigned int id1, id2; str_stream >> id1 >> id2; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: are_mergeable( " << this->m_xcurves[id1] << ", " - << this->m_xcurves[id2] << " ) ? " << exp_answer << " "; + std::cout << "Test: are_mergeable( " << CGAL::oformat(this->m_xcurves[id1]) << ", " + << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; bool real_answer = this->m_geom_traits.are_mergeable_2_object()(this->m_xcurves[id1], @@ -1107,8 +1107,8 @@ Traits_test::merge_wrapper_imp(std::istringstream& str_stream, unsigned int id1, id2, id; str_stream >> id1 >> id2 >> id; X_monotone_curve_2 cv; - std::cout << "Test: merge( " << this->m_xcurves[id1] << ", " - << this->m_xcurves[id2] << " ) ? " << this->m_xcurves[id] << " "; + std::cout << "Test: merge( " << CGAL::oformat(this->m_xcurves[id1]) << ", " + << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << CGAL::oformat(this->m_xcurves[id]) << " "; this->m_geom_traits.merge_2_object()(this->m_xcurves[id1], this->m_xcurves[id2], cv); @@ -1181,7 +1181,7 @@ parameter_space_in_x_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = CGAL::ARR_MIN_END; if (curves_op) { cv_end = static_cast(next_input.second); - std::cout << "Test: parameter_space_x( " << this->m_xcurves[id] << " , " + std::cout << "Test: parameter_space_x( " << CGAL::oformat(this->m_xcurves[id]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1248,8 +1248,8 @@ compare_y_near_boundary_wrapper_imp(std::istringstream& str_stream, assert(next_input.first == Base::CURVE_END); CGAL::Arr_curve_end cv_end = static_cast(next_input.second); - std::cout << "Test: compare_y_near_boundary( " << this->m_xcurves[id1] - << " , " << this->m_xcurves[id2] << " , " + std::cout << "Test: compare_y_near_boundary( " << CGAL::oformat(this->m_xcurves[id1]) + << " , " << CGAL::oformat(this->m_xcurves[id2]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1309,7 +1309,7 @@ parameter_space_in_y_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = CGAL::ARR_MIN_END; if (curves_op) { cv_end = static_cast(next_input.second); - std::cout << "Test: parameter_space_y( " << this->m_xcurves[id] << " , " + std::cout << "Test: parameter_space_y( " << CGAL::oformat(this->m_xcurves[id]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1381,8 +1381,8 @@ compare_x_near_boundary_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = static_cast(next_input.second); - std::cout << this->m_xcurves[id1] << ", " - << this->m_xcurves[id2] << " , " + std::cout << CGAL::oformat(this->m_xcurves[id1]) << ", " + << CGAL::oformat(this->m_xcurves[id2]) << " , " << this->curve_end_str(cv_end) << " ) ? "; next_input = this->get_next_input(str_stream); From 60571eeea2d7041b0273f9de4f6a49f89e5ac866 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 10:28:17 +0100 Subject: [PATCH 0435/1398] Rename file extensions --- Triangulation/examples/Triangulation/triangulation.cpp | 4 ++-- .../Triangulation/{triangulation1.cpp => triangulation1.h} | 0 .../Triangulation/{triangulation2.cpp => triangulation2.h} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename Triangulation/examples/Triangulation/{triangulation1.cpp => triangulation1.h} (100%) rename Triangulation/examples/Triangulation/{triangulation2.cpp => triangulation2.h} (100%) diff --git a/Triangulation/examples/Triangulation/triangulation.cpp b/Triangulation/examples/Triangulation/triangulation.cpp index 0044bc1da770..0e791d871a28 100644 --- a/Triangulation/examples/Triangulation/triangulation.cpp +++ b/Triangulation/examples/Triangulation/triangulation.cpp @@ -36,8 +36,8 @@ int main() std::cout << "There are " << edges.size() << " vertices on the convex hull." << std::endl; -#include "triangulation1.cpp" // See below -#include "triangulation2.cpp" +#include "triangulation1.h" // See below +#include "triangulation2.h" return 0; } diff --git a/Triangulation/examples/Triangulation/triangulation1.cpp b/Triangulation/examples/Triangulation/triangulation1.h similarity index 100% rename from Triangulation/examples/Triangulation/triangulation1.cpp rename to Triangulation/examples/Triangulation/triangulation1.h diff --git a/Triangulation/examples/Triangulation/triangulation2.cpp b/Triangulation/examples/Triangulation/triangulation2.h similarity index 100% rename from Triangulation/examples/Triangulation/triangulation2.cpp rename to Triangulation/examples/Triangulation/triangulation2.h From 7f7e2efefc63be0a5e37bf83fbcf9b3b5b08db62 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 11:05:13 +0100 Subject: [PATCH 0436/1398] SLS: Fix warnings --- .../examples/Straight_skeleton_2/extrude_skeleton.cpp | 3 ++- .../examples/Straight_skeleton_2/include/CGAL/input_helpers.h | 2 +- .../test_sls_weighted_polygons_with_holes.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/extrude_skeleton.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/extrude_skeleton.cpp index 073b50964c09..0be087a09ebf 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/extrude_skeleton.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/extrude_skeleton.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -62,7 +63,7 @@ int main(int argc, char** argv) // below is only used for random weight generation double min_weight = 1., max_weight = 10.; - int seed = std::time(nullptr); + int seed = CGAL::get_default_random().get_seed(); for(int i = 1; i < argc; ++i) { diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h index b42c29df4a48..35077e38c2e3 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h @@ -247,7 +247,7 @@ void generate_random_weights(const PolygonWithHoles& p, std::vector weights; for(auto it=c.begin(); it 1) ? std::atoi(argv[1]) : 2; int hole_nv = (argc > 2) ? std::atoi(argv[2]) : 10; - int seed = (argc > 3) ? std::atoi(argv[3]) : std::time(nullptr); + int seed = (argc > 3) ? std::atoi(argv[3]) : CGAL::get_default_random().get_seed(); CGAL::Random rnd(seed); From e759fb46fab445fd269c6cf835c213a94aeda5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 12:57:53 +0200 Subject: [PATCH 0437/1398] remove usage of old Object API --- .../include/CGAL/Arr_circular_arc_traits_2.h | 6 +- .../CGAL/Arr_circular_line_arc_traits_2.h | 14 +- .../CGAL/Arr_non_caching_segment_traits_2.h | 8 +- .../include/CGAL/Arr_polycurve_traits_2.h | 28 +- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 2 - .../test_polycurve_intersection.cpp | 13 +- .../function_objects_polynomial_circular.h | 2 +- .../internal_functions_on_circle_2.h | 8 +- .../internal_functions_on_circular_arc_2.h | 226 +++++----- .../internal_functions_on_line_arc_2.h | 71 ++- .../CGAL/_test_circles_constructions.h | 163 +++---- .../include/CGAL/_test_circles_extention.h | 25 +- .../test/Circular_kernel_2/test_Line_arc.cpp | 220 +++++----- .../functor_compare_theta_3.cpp | 18 +- .../intersecting_spheres.cpp | 12 +- .../Circular_kernel_3/Intersection_traits.h | 21 - .../internal_functions_on_circular_arc_3.h | 52 ++- .../internal_functions_on_line_arc_3.h | 33 +- .../internal_functions_on_sphere_3.h | 64 +-- .../CGAL/_test_functionalities_on_sphere.h | 76 ++-- .../include/CGAL/_test_sphere_constructions.h | 403 ++++++++++-------- 21 files changed, 717 insertions(+), 748 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h index f790bcac2460..151bcf5644a0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_arc_traits_2.h @@ -181,14 +181,14 @@ class Arr_circular_arc_traits_2 { typedef std::variant Make_x_monotone_result; - std::vector objs; + std::vector objs; CircularKernel().make_x_monotone_2_object()(arc, std::back_inserter(objs)); for (const auto& obj : objs) { - if (const auto* p = CGAL::object_cast(&obj)) { + if (const auto* p = std::get_if(&obj)) { *oi++ = Make_x_monotone_result(*p); continue; } - if (const auto* xcv = CGAL::object_cast(&obj)) { + if (const auto* xcv = std::get_if(&obj)) { *oi++ = Make_x_monotone_result(*xcv); continue; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index ba387ee0804e..5fb30dd0bd7a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -251,19 +251,13 @@ namespace CGAL { OutputIterator res) const { if ( const Arc1* arc1 = std::get_if( &A ) ) { - std::vector container; - CircularKernel(). - make_x_monotone_2_object()(*arc1,std::back_inserter(container)); - return object_to_object_variant - (container, res); + return CircularKernel(). + make_x_monotone_2_object()(*arc1, res); } else { const Arc2* arc2 = std::get_if( &A ); - std::vector container; - CircularKernel(). - make_x_monotone_2_object()(*arc2,std::back_inserter(container)); - return object_to_object_variant - (container, res); + return CircularKernel(). + make_x_monotone_2_object()(*arc2, res); } } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h index d3397599ae68..58acefda211f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_non_caching_segment_traits_2.h @@ -224,8 +224,6 @@ class Arr_non_caching_segment_traits_2 : OutputIterator oi) const { typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; const Kernel& kernel = m_traits; auto res = kernel.intersect_2_object()(cv1, cv2); @@ -241,7 +239,7 @@ class Arr_non_caching_segment_traits_2 : // If the two segments intersect at their endpoints, then the // multiplicity is undefined, but we deliberately ignore it for // efficiency reasons. - *oi++ = Intersection_result(Intersection_point(*p_p, 1)); + *oi++ = Intersection_point(*p_p, 1); return oi; } @@ -257,11 +255,11 @@ class Arr_non_caching_segment_traits_2 : // in the overlap segment if (m_traits.compare_endpoints_xy_2_object()(*cv_p) != cmp1) { auto ctr_opposite = kernel.construct_opposite_segment_2_object(); - *oi++ = Intersection_result(ctr_opposite(*cv_p)); + *oi++ = ctr_opposite(*cv_p); return oi; } } - *oi++ = Intersection_result(*cv_p); + *oi++ = *cv_p; return oi; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index a7aa0c32786d..488ed21dea79 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -698,8 +698,7 @@ class Arr_polycurve_traits_2 : typedef std::pair Intersection_point; typedef std::variant Intersection_base_result; - typedef std::variant - Intersection_result; + const Subcurve_traits_2* geom_traits = m_poly_traits.subcurve_traits_2(); auto cmp_y_at_x = m_poly_traits.compare_y_at_x_2_object(); @@ -744,7 +743,7 @@ class Arr_polycurve_traits_2 : // cv1's right endpoint equals cv2's left endpoint // Thus we can return this single(!) intersection point Intersection_point p(max_vertex(cv1[i1]), 0); - *oi++ = Intersection_result(p); + *oi++ = p; return oi; } dir1 == SMALLER ? @@ -767,7 +766,7 @@ class Arr_polycurve_traits_2 : // cv2's right endpoint equals cv1's left endpoint // Thus we can return this single(!) intersection point Intersection_point p(max_vertex(cv2[i2]), 0); - *oi++ = Intersection_result(p); + *oi++ = p; return oi; } @@ -833,7 +832,7 @@ class Arr_polycurve_traits_2 : const Intersection_point* p_p = std::get_if(&xection); - if (p_p != nullptr) *oi++ = Intersection_result(*p_p); + if (p_p != nullptr) *oi++ = *p_p; } } else if (right_coincides && left_coincides) { @@ -871,7 +870,7 @@ class Arr_polycurve_traits_2 : // will be taken care of as the min_vertex of in the next // iteration. if (! equal(p_ptr->first, max_vertex(cv1[i1]))) - *oi++ = Intersection_result(*p_ptr); + *oi++ = *p_ptr; } } } @@ -896,11 +895,11 @@ class Arr_polycurve_traits_2 : // it multiplicity 0. if (left_res == SMALLER) { Intersection_point p(min_vertex(cv2[i2]), 0); - *oi++ = Intersection_result(p); + *oi++ = p; } else { Intersection_point p(min_vertex(cv1[i1]), 0); - *oi++ = Intersection_result(p); + *oi++ = p; } } } @@ -941,7 +940,7 @@ class Arr_polycurve_traits_2 : (i1 != Polycurve_traits_2::INVALID_INDEX) ? return_point(max_vertex(cv1[i1+1]), 0) : return_point(max_vertex(cv1[0]), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } else if (right_res == LARGER) { ip = (dir2 == SMALLER) ? @@ -949,7 +948,7 @@ class Arr_polycurve_traits_2 : (i2 != Polycurve_traits_2::INVALID_INDEX) ? return_point(max_vertex(cv2[i2+1]), 0) : return_point(max_vertex(cv2[0]), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } else if (((i1 > 0) && (dir1 == SMALLER)) || ((i1 < n1) && (dir1 != SMALLER)) || @@ -961,7 +960,7 @@ class Arr_polycurve_traits_2 : (i1 != Polycurve_traits_2::INVALID_INDEX) ? return_point(max_vertex(cv1[i1+1]), 0) : return_point(max_vertex(cv1[0]), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } else { CGAL_assertion_msg((dir2 == SMALLER && i2 > 0) || @@ -976,7 +975,7 @@ class Arr_polycurve_traits_2 : (i2 != Polycurve_traits_2::INVALID_INDEX) ? return_point(max_vertex(cv2[i2+1]), 0) : return_point(max_vertex(cv2[0]), 0); - *oi++ = Intersection_result(ip); + *oi++ = ip; } } @@ -989,15 +988,12 @@ class Arr_polycurve_traits_2 : inline OutputIterator output_ocv (std::vector& ocv, bool invert_ocv, OutputIterator oi) const { - typedef std::pair Intersection_point; - typedef std::variant - Intersection_result; X_monotone_curve_2 curve; if (invert_ocv) std::reverse (ocv.begin(), ocv.end()); for (X_monotone_subcurve_2& sc : ocv) curve.push_back (sc); - *(oi ++) = Intersection_result(curve); + *(oi ++) = curve; ocv.clear(); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index 345d9d89caf8..c71c4f4f268d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -2038,8 +2038,6 @@ class Continuous_rational_arc_d_1: OutputIterator intersect(const Self& arc, OutputIterator oi, const Cache& cache) const { - typedef std::variant Intersection_result; - CGAL_precondition(this->is_valid()); CGAL_precondition(this->is_continuous()); CGAL_precondition(arc.is_valid()); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_polycurve_intersection.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_polycurve_intersection.cpp index 2c0a68510c79..dda2f0c27c9f 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_polycurve_intersection.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_polycurve_intersection.cpp @@ -26,18 +26,19 @@ struct Test_functor Test_functor (const X_monotone_polyline& reference) : reference (&reference) { } - void operator() (const CGAL::Object& obj) const + void operator()(std::pair) { - const X_monotone_polyline* poly - = CGAL::object_cast(&obj); - assert(poly != nullptr); // Intersection is not a polyline + assert(!"This overload should not be called"); + } + void operator() (const X_monotone_polyline& poly) const + { typename X_monotone_polyline::Point_const_iterator itref = reference->points_begin(), - itpoly = poly->points_begin(); + itpoly = poly.points_begin(); for (; itref != reference->points_end() - && itpoly != poly->points_end(); + && itpoly != poly.points_end(); ++ itref, ++ itpoly) assert(*itref == *itpoly); } diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h index 09696e5069c3..b68746e4a3d5 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/function_objects_polynomial_circular.h @@ -308,7 +308,7 @@ namespace CircularFunctors { operator()(const Circular_arc_2 &A, OutputIterator res) const { typedef std::pair relat_pos; - typedef std::pair< CGAL::Object, relat_pos> Obj_descr_2; + typedef std::pair< Circular_arc_2, relat_pos> Obj_descr_2; std::vector vec; CircularFunctors::advanced_make_xy_monotone (A, std::back_inserter(vec)); diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h index 9ced0754a2c6..9e799e497f0d 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circle_2.h @@ -120,8 +120,6 @@ namespace CircularFunctors { const typename CK::Circle_2 & c2, OutputIterator res ) { - typedef typename CK2_Intersection_traits - ::type result_type; typedef typename CK::Algebraic_kernel AK; typedef typename CK::Polynomial_for_circles_2_2 Equation; typedef typename CK::Root_for_circles_2_2 Root_for_circles_2_2; @@ -129,7 +127,7 @@ namespace CircularFunctors { Equation e2 = CircularFunctors::get_equation(c2); if (e1 == e2) { - *res++ = CGAL::internal::ck2_intersection_return(c1); + *res++ = c1; return res; } @@ -145,9 +143,7 @@ namespace CircularFunctors { for ( typename solutions_container::iterator it = solutions.begin(); it != solutions.end(); ++it ) { - *res++ = CGAL::internal::ck2_intersection_return - (std::make_pair(Circular_arc_point_2(it->first), - it->second )); + *res++ = std::make_pair(Circular_arc_point_2(it->first), it->second ); } return res; diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circular_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circular_arc_2.h index 61fdc75b4b6d..1e577eea5b3a 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circular_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_circular_arc_2.h @@ -536,17 +536,15 @@ namespace CircularFunctors { const typename CK::Circular_arc_2 &a2, OutputIterator res ) { - typedef typename CK2_Intersection_traits::type result_type; - - typedef std::vector solutions_container; typedef typename CK::Circular_arc_2 Circular_arc_2; + typedef typename CK::Circle_2 Circle_2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE + typedef std::vector solutions_container; // same curve if(a1.number() == a2.number()) { - *res++ = result_type(a1); + *res++ = a1; return res; } @@ -571,14 +569,14 @@ namespace CircularFunctors { if((a1s_a2s && a1t_a2t) || (a1s_a2t && a1t_a2s)){ // Case 1 if( (a1.supporting_circle() == a2.supporting_circle()) && ((a1.on_upper_part() && a2.on_upper_part())|| (! a1.on_upper_part() && (! a2.on_upper_part())))){ - *res++ = result_type(a1); + *res++ = a1; } else { if(compare_x(a1.source(), a1.target()) == SMALLER){ - *res++ = result_type(std::make_pair(a1.source(),1u)); - *res++ = result_type(std::make_pair(a1.target(),1u)); + *res++ = std::make_pair(a1.source(),1u); + *res++ = std::make_pair(a1.target(),1u); } else { - *res++ = result_type(std::make_pair(a1.target(),1u)); - *res++ = result_type(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.target(),1u); + *res++ = std::make_pair(a1.source(),1u); } } return res; @@ -625,7 +623,7 @@ namespace CircularFunctors { if(return_q){ - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } @@ -634,16 +632,14 @@ namespace CircularFunctors { const bool sqr1_eq_sqr2 = (a1.squared_radius() == a2.squared_radius()); const bool c1_eq_c2 = (a1.center() == a2.center()); - typedef typename CK2_Intersection_traits::type result_type; if(sqr1_eq_sqr2 && c1_eq_c2) { if(a1.is_full()) { - *res++ =CGAL::internal::ck2_intersection_return(a2); + *res++ = a2; //return res; } else if(a2.is_full()) { - *res++ =CGAL::internal::ck2_intersection_return(a1); + *res++ = a1; //return res; } else { bool t2_in_a1 = has_on(a1,a2.target(),true); @@ -656,66 +652,66 @@ namespace CircularFunctors { CircularFunctors::compare_xy(a1.source(), a2.source()); if(comp < 0) { if(a1.source() == a2.target()) { - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); } else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a1.source(),a2.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } if(a2.source() == a1.target()) { - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a2.source(),a1.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } } else if (comp > 0) { if(a2.source() == a1.target()) { - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a2.source(),a1.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } if(a1.source() == a2.target()) { - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); } else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a1.source(),a2.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } } else { - *res++ =CGAL::internal::ck2_intersection_return(a1); + *res++ = a1; } } else { - *res++ =CGAL::internal::ck2_intersection_return(a2); + *res++ = a2; //return res; } } else if(t2_in_a1) { if(a1.source() == a2.target()) - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a1.source(),a2.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } //return res; } else if(s2_in_a1) { if(a2.source() == a1.target()) { - *res++ =CGAL::internal::ck2_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_2 & arc = Circular_arc_2(a1.supporting_circle(),a2.source(),a1.target()); - *res++ =CGAL::internal::ck2_intersection_return(arc); + *res++ = arc; } //return res; } else if(has_on(a2,a1.source(),true)) { - *res++ =CGAL::internal::ck2_intersection_return(a1); + *res++ = a1; //return res; } //return res; } } else if(!c1_eq_c2) { - solutions_container solutions; + std::vector< std::variant> > solutions; #ifdef CGAL_INTERSECTION_MAP_FOR_SUPPORTING_CIRCLES if(!Circular_arc_2::template @@ -736,24 +732,23 @@ namespace CircularFunctors { if(solutions.size() == 0) return res; else { // The supporting circles are not the same and intersects - for (typename solutions_container::iterator it = solutions.begin(); - it != solutions.end(); ++it) { + for (const auto& v : solutions) { const std::pair - *result = CGAL::object_cast - > (&(*it)); + *result = std::get_if + > (&v); #ifdef CGAL_CK_TEST_BBOX_BEFORE_HAS_ON Bbox_2 rb = result->first.bbox(); if(do_overlap(a1.bbox(), rb) && do_overlap(a2.bbox(),rb)){ if (has_on(a1,result->first,true) && has_on(a2,result->first,true)) { - *res++ =CGAL::internal::ck2_intersection_return(*result); + *res++ = *result; } } #else if (has_on(a1,result->first,true) && has_on(a2,result->first,true)) { - *res++ =CGAL::internal::ck2_intersection_return(*result); + *res++ = *result; } #endif } @@ -1069,7 +1064,7 @@ template < class CK, class OutputIterator > A.circle_number(); #endif - *res++ = make_object(A); + *res++ = A; return res; } @@ -1101,8 +1096,8 @@ template < class CK, class OutputIterator > ca2.set_circle_number(cn); #endif - *res++ = make_object(ca1); - *res++ = make_object(ca2); + *res++ = ca1; + *res++ = ca2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point1,1u))); @@ -1131,7 +1126,7 @@ template < class CK, class OutputIterator > unsigned int cn = ca1.circle_number(); #endif - *res++ = make_object(ca1); + *res++ = ca1; if (cmp_end > 0) { // We must cut in 3 parts. const Circular_arc_2 &ca2 = Circular_arc_2(A.supporting_circle(), @@ -1148,8 +1143,8 @@ template < class CK, class OutputIterator > ca3.set_circle_number(cn); #endif - *res++ = make_object(ca2); - *res++ = make_object(ca3); + *res++ = ca2; + *res++ = ca3; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point1,1u))); intersecs2.push_back(make_object(std::make_pair(x_extremal_point2,1u))); @@ -1171,7 +1166,7 @@ template < class CK, class OutputIterator > ca2.set_circle_number(cn); #endif - *res++ = make_object(ca2); + *res++ = ca2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point1,1u))); @@ -1191,7 +1186,7 @@ template < class CK, class OutputIterator > unsigned int cn = ca1.circle_number(); #endif - *res++ = make_object(ca1); + *res++ = ca1; if (cmp_end < 0) { const Circular_arc_2 &ca2 = Circular_arc_2(A.supporting_circle(), x_extremal_point2, @@ -1207,8 +1202,8 @@ template < class CK, class OutputIterator > ca3.set_circle_number(cn); #endif - *res++ = make_object(ca2); - *res++ = make_object(ca3); + *res++ = ca2; + *res++ = ca3; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point2,1u))); @@ -1232,7 +1227,7 @@ template < class CK, class OutputIterator > ca2.set_circle_number(cn); #endif - *res++ = make_object(ca2); + *res++ = ca2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point2,1u))); @@ -1259,8 +1254,8 @@ template < class CK, class OutputIterator > ca2.set_circle_number(cn); #endif - *res++ = make_object(ca1); - *res++ = make_object(ca2); + *res++ = ca1; + *res++ = ca2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point2,1u))); @@ -1287,8 +1282,8 @@ template < class CK, class OutputIterator > ca2.set_circle_number(cn); #endif - *res++ = make_object(ca1); - *res++ = make_object(ca2); + *res++ = ca1; + *res++ = ca2; #ifdef CGAL_INTERSECTION_MAP_FOR_XMONOTONIC_ARC_WITH_SAME_SUPPORTING_CIRCLE intersecs1.push_back(make_object(std::make_pair(x_extremal_point1,1u))); @@ -1317,7 +1312,7 @@ template < class CK, class OutputIterator > OutputIterator res ) { typedef typename CK::Circular_arc_2 Circular_arc_2; - typedef std::pair S_pair; + typedef std::pair S_pair; int cmp_begin_y = CGAL::compare @@ -1332,13 +1327,13 @@ template < class CK, class OutputIterator > ((((cmp_begin_y > 0) || (cmp_end_y > 0)) && (cmp_x > 0)) || (((cmp_begin_y < 0) || (cmp_end_y < 0)) && (cmp_x < 0)))) { - *res++ = S_pair(make_object(A),(cmp_begin_y>0 || cmp_end_y>0) ); + *res++ = S_pair(A,(cmp_begin_y>0 || cmp_end_y>0) ); return res; } // Half circles if (cmp_begin_y == 0 && cmp_end_y == 0 && cmp_x != 0) { - *res++ = std::make_pair(make_object(A), cmp_x>0 ); + *res++ = std::make_pair(A, cmp_x>0 ); return res; } @@ -1347,67 +1342,67 @@ template < class CK, class OutputIterator > if (cmp_begin_y > 0) { *res++ = S_pair - (make_object(Circular_arc_2(A.supporting_circle(), A.source(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true))), + (Circular_arc_2(A.supporting_circle(), A.source(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true)), true); if (cmp_end_y > 0) { // We must cut in 3 parts. *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false))), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false)), false); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false), + A.target()), true); } else { *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true), + A.target()), false); } } else if (cmp_begin_y < 0) { // Very similar to the previous case. *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - A.source(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false))), + (Circular_arc_2 (A.supporting_circle(), + A.source(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false)), false); if (cmp_end_y < CGAL::EQUAL) { // We must cut in 3 parts. *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true))) , + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true)) , true ); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true), + A.target()), false); } else { *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false), + A.target()), true); } } @@ -1415,34 +1410,34 @@ template < class CK, class OutputIterator > if ( compare(A.source().x(),A.supporting_circle().center().x())< 0) { CGAL_assertion(cmp_end_y >= 0); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - A.source(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false))), + (Circular_arc_2 (A.supporting_circle(), + A.source(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false)), false); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),false), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),false), + A.target()), true); } else { CGAL_assertion( compare(A.source().x(),A.supporting_circle().center().x())< 0); CGAL_assertion(cmp_end_y != LARGER); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - A.source(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true))), + (Circular_arc_2 (A.supporting_circle(), + A.source(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true)), true); *res++ = std::make_pair - (make_object(Circular_arc_2 (A.supporting_circle(), - CircularFunctors::x_extremal_point - (A.supporting_circle(),true), - A.target())), + (Circular_arc_2 (A.supporting_circle(), + CircularFunctors::x_extremal_point + (A.supporting_circle(),true), + A.target()), false); } } @@ -1469,8 +1464,8 @@ advanced_make_xy_monotone( const typename CK::Circular_arc_2 &a, typedef typename CK::Circular_arc_2 Circular_arc_2; typedef std::pair relat_pos; - typedef std::pair< CGAL::Object, bool> Obj_descr_1; - typedef std::pair< CGAL::Object, relat_pos> Obj_descr_2; + typedef std::pair< Circular_arc_2, bool> Obj_descr_1; + typedef std::pair< Circular_arc_2, relat_pos> Obj_descr_2; typedef std::vector Obj_vector_1; typedef std::vector Obj_vector_2; @@ -1481,8 +1476,7 @@ advanced_make_xy_monotone( const typename CK::Circular_arc_2 &a, advanced_make_x_monotone(a,std::back_inserter(vec)); for(unsigned int i=0;i(&vec.at(i).first); + const Circular_arc_2 *tmp_arc = (&vec.at(i).first); int cmp_begin_x = CGAL::compare (tmp_arc->source().x(), tmp_arc->supporting_circle().center().x()); @@ -1501,22 +1495,21 @@ advanced_make_xy_monotone( const typename CK::Circular_arc_2 &a, Obj_descr_1 tmp=vec.at(i); Obj_descr_2 tmp1,tmp2; - const Circular_arc_2 *tmp_arc = - CGAL::object_cast(&tmp.first); + const Circular_arc_2 *tmp_arc = &tmp.first; - tmp1.first = make_object - (Circular_arc_2(a.supporting_circle(),tmp_arc->source(), + tmp1.first = + Circular_arc_2(a.supporting_circle(),tmp_arc->source(), CircularFunctors::y_extremal_point - (a.supporting_circle(),!tmp.second))); + (a.supporting_circle(),!tmp.second)); tmp1.second.first=tmp.second; tmp1.second.second= (tmp.second)? false : true ; - tmp2.first = make_object - (Circular_arc_2(a.supporting_circle(), + tmp2.first = + Circular_arc_2(a.supporting_circle(), CircularFunctors::y_extremal_point (a.supporting_circle(),!tmp.second), - tmp_arc->target())); + tmp_arc->target()); tmp2.second.first=tmp.second; tmp2.second.second= (tmp.second)? true : false ; @@ -1528,7 +1521,6 @@ advanced_make_xy_monotone( const typename CK::Circular_arc_2 &a, } return res; - } template diff --git a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h index ce3bb2e507fe..6b3d632cbfb9 100644 --- a/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h +++ b/Circular_kernel_2/include/CGAL/Circular_kernel_2/internal_functions_on_line_arc_2.h @@ -377,8 +377,6 @@ namespace CircularFunctors { const typename CK::Circle_2 & c, OutputIterator res ) { - typedef typename CK2_Intersection_traits - ::type result_type; typedef typename CK::Algebraic_kernel AK; typedef typename CK::Polynomial_1_2 Equation_line; typedef typename CK::Polynomial_for_circles_2_2 Equation_circle; @@ -399,8 +397,7 @@ namespace CircularFunctors { for ( typename solutions_container::iterator it = solutions.begin(); it != solutions.end(); ++it ) { - *res++ = CGAL::internal::ck2_intersection_return - (std::make_pair(Circular_arc_point_2(it->first), it->second )); + *res++ = std::make_pair(Circular_arc_point_2(it->first), it->second ); } return res; @@ -412,8 +409,6 @@ namespace CircularFunctors { const typename CK::Line_arc_2 &a2, OutputIterator res ) { - typedef typename CK2_Intersection_traits - ::type result_type; typedef typename CK::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Line_arc_2 Line_arc_2; typedef typename CK::Point_2 Point_2; @@ -427,13 +422,13 @@ namespace CircularFunctors { if((a1s_a2s && a1t_a2t) || (a1s_a2t && a1t_a2s)){ - *res++ = result_type(a1); + *res++ = a1; return res; } if(a1s_a2s || a1s_a2t || a1t_a2s || a1t_a2t) { if(! LinearFunctors::non_oriented_equal(a1.supporting_line(),a2.supporting_line())){ - if(a1s_a2s || a1s_a2t) *res++ = CGAL::internal::ck2_intersection_return(std::make_pair(a1.source(), 1u)); - if(a1t_a2s || a1t_a2t) *res++ = CGAL::internal::ck2_intersection_return(std::make_pair(a1.target(), 1u)); + if(a1s_a2s || a1s_a2t) *res++ = std::make_pair(a1.source(), 1u); + if(a1t_a2s || a1t_a2t) *res++ = std::make_pair(a1.target(), 1u); return res; } } @@ -445,16 +440,13 @@ namespace CircularFunctors { int comparison = compare_xy(a2.left(),a1.right()); if(comparison < 0){ if(compare_xy(a1.right(),a2.right()) <= 0){ - *res++ = CGAL::internal::ck2_intersection_return - (Line_arc_2(a1.supporting_line(), a2.left(), a1.right() )); + *res++ = Line_arc_2(a1.supporting_line(), a2.left(), a1.right() ); } else{ - *res++ = CGAL::internal::ck2_intersection_return - (Line_arc_2(a1.supporting_line(), a2.left(), a2.right() )); + *res++ = Line_arc_2(a1.supporting_line(), a2.left(), a2.right() ); } } else if (comparison == 0){ - *res++ =CGAL::internal::ck2_intersection_return - ( std::make_pair(a2.left(),1u)); + *res++ = std::make_pair(a2.left(),1u); } return res; } @@ -462,17 +454,14 @@ namespace CircularFunctors { int comparison = compare_xy(a1.left(),a2.right()); if(comparison < 0){ if(compare_xy(a1.right(),a2.right()) <= 0){ - *res++ = CGAL::internal::ck2_intersection_return - (Line_arc_2(a1.supporting_line(), a1.left(), a1.right() )); + *res++ = Line_arc_2(a1.supporting_line(), a1.left(), a1.right() ); } else{ - *res++ = CGAL::internal::ck2_intersection_return - (Line_arc_2(a1.supporting_line(), a1.left(), a2.right() )); + *res++ = Line_arc_2(a1.supporting_line(), a1.left(), a2.right() ); } } else if (comparison == 0){ - *res++ = CGAL::internal::ck2_intersection_return - ( std::make_pair(a1.left(),1u)); + *res++ = std::make_pair(a1.left(),1u); } return res; } @@ -491,7 +480,7 @@ namespace CircularFunctors { CircularFunctors::compare_xy(intersect_point, a1.target())) && (CircularFunctors::compare_xy(intersect_point, a2.source()) != CircularFunctors::compare_xy(intersect_point, a2.target()))) - *res++ = CGAL::internal::ck2_intersection_return(std::make_pair(intersect_point, 1u)); + *res++ = std::make_pair(intersect_point, 1u); return res; } @@ -528,7 +517,7 @@ namespace CircularFunctors { for (typename solutions_container::iterator it = solutions.begin(); it != solutions.end(); ++it) { if(std::visit(Has_on_visitor(&l), *it)) - *res++ = *it; + *res++ = std::get>(*it); } return res; @@ -565,11 +554,11 @@ namespace CircularFunctors { if((ls_cs && lt_ct) || (ls_ct && lt_cs)){ // Case 0 if (compare_xy(l.source(), l.target()) == SMALLER){ - *res++ = result_type(std::make_pair(l.source(), 1u)); - *res++ = result_type(std::make_pair(l.target(), 1u)); + *res++ = std::make_pair(l.source(), 1u); + *res++ = std::make_pair(l.target(), 1u); } else { - *res++ = result_type(std::make_pair(l.target(), 1u)); - *res++ = result_type(std::make_pair(l.source(), 1u)); + *res++ = std::make_pair(l.target(), 1u); + *res++ = std::make_pair(l.source(), 1u); } return res; } else if (ls_cs || lt_ct || ls_ct || lt_cs) { @@ -594,20 +583,20 @@ namespace CircularFunctors { } if( (CircularFunctors::compare_x(p,q) == EQUAL) || CircularFunctors::point_in_x_range(p,r,q)){ // Case 1 - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } else if(c.on_upper_part()){ // Case 2 if(CircularFunctors::compare_x(r,q) == LARGER){ if(CircularFunctors::orientation(q,r,p) == RIGHT_TURN // Case 2 || CircularFunctors::compare_y_to_right(l,c,q) == LARGER){ // Case 3a - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } } else { if(CircularFunctors::orientation(r,q,p) == RIGHT_TURN // Case 2 || CircularFunctors::compare_y_to_left(l,c,q) == LARGER){ // Case 3c - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } } @@ -615,13 +604,13 @@ namespace CircularFunctors { if(CircularFunctors::compare_x(r,q) == LARGER){ if (CircularFunctors::orientation(q,r,p) == LEFT_TURN // Case 2 || CircularFunctors::compare_y_to_right(l,c,q) == SMALLER){ // Case 3b - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } } else { if(CircularFunctors::orientation(r,q,p) == LEFT_TURN || CircularFunctors::compare_y_to_left(l,c,q) == SMALLER){ // Case 3d - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } } @@ -629,7 +618,7 @@ namespace CircularFunctors { typename CK::Linear_kernel::Bounded_side bs = CircularFunctors::bounded_side(c.supporting_circle(),p); if(bs == ON_BOUNDED_SIDE){ - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } else { //Case 4b typedef std::vector::type> @@ -639,12 +628,12 @@ namespace CircularFunctors { std::back_inserter(solutions) ); if(CircularFunctors::compare_x(r,q) == LARGER){ - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); *res++ = solutions.back(); return res; } else { *res++ = solutions.front(); - *res++ = result_type(std::make_pair(q,1u)); + *res++ = std::make_pair(q,1u); return res; } @@ -684,7 +673,7 @@ namespace CircularFunctors { if(std::visit(Has_on_visitor(&l), *it) && std::visit(Has_on_visitor(&c), *it) ) { - *res++ = *it; + *res++ = std::get>(*it); } } return res; @@ -746,11 +735,9 @@ namespace CircularFunctors { typedef typename CK::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Point_2 Point_2; typedef typename CK::Line_2 Line_2; - typedef typename CK::Line_arc_2 Line_arc_2; - typedef typename CK2_Intersection_traits::type result_type; if(LinearFunctors::non_oriented_equal(l, la.supporting_line())) { - *res++ = result_type(la); + *res++ = la; } typename Intersection_traits::result_type @@ -764,7 +751,7 @@ namespace CircularFunctors { if (CircularFunctors::compare_xy(intersect_point, la.source()) != CircularFunctors::compare_xy(intersect_point, la.target())) - *res++ = result_type(std::make_pair(intersect_point, 1u)); + *res++ = std::make_pair(intersect_point, 1u); return res; } @@ -791,7 +778,7 @@ namespace CircularFunctors { for (typename solutions_container::const_iterator it = solutions.begin(); it != solutions.end(); ++it) { if(std::visit(Has_on_visitor(&c), *it)) - *res++ = *it; + *res++ = std::get>(*it); } return res; } @@ -810,7 +797,7 @@ namespace CircularFunctors { make_x_monotone( const typename CK::Line_arc_2 &A, OutputIterator res ) { - *res++ = make_object(A); + *res++ = A; return res; } diff --git a/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_constructions.h b/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_constructions.h index 6755d3634447..dfc1c688ea80 100644 --- a/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_constructions.h +++ b/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_constructions.h @@ -19,6 +19,17 @@ #include #include +template +bool assign_variant(Expected& e, const V& v) +{ + if (std::get_if(&v) != nullptr) + { + e = std::get(v); + return true; + } + return false; +} + //#define typename template void _test_circle_construct(CK ck) @@ -33,8 +44,9 @@ void _test_circle_construct(CK ck) typedef typename CK::FT FT; typedef typename CK::Construct_circle_2 Construct_circle_2; typedef typename CK::Intersect_2 Intersect_2; + typedef std::variant> Intersection_result; typedef typename CK::Make_x_monotone_2 Make_x_monotone_2; - typedef typename CK::Make_xy_monotone_2 Make_xy_monotone_2; + typedef typename CK::Make_xy_monotone_2 Make_xy_monotone_2; typedef typename CK::Split_2 Split_2; typedef typename CK::Get_equation Get_equation; typedef typename CK::Compare_xy_2 Compare_xy_2; @@ -107,8 +119,7 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_2(center_circ_intersections_2_2, circ_intersection_2_1_r); - std::vector< CGAL::Object > - vector_for_intersection_1, vector_for_intersection_1l; + std::vector< Intersection_result > vector_for_intersection_1, vector_for_intersection_1l; theConstruct_intersect_2(circ_intersections_2_1, circ_intersections_2_2, @@ -120,12 +131,12 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_intersections_2_1, circ_intersections_2_1)); assert(do_intersect(circ_intersections_2_1, circ_intersections_2_1)); std::pair the_pair; - assert(assign(the_pair, vector_for_intersection_1[0])); - assert(assign(the_pair, vector_for_intersection_1l[0])); + assert(assign_variant(the_pair, vector_for_intersection_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_1l[0])); Circular_arc_point_2 first = the_pair.first; std::cout << first << std::endl; - assert(assign(the_pair, vector_for_intersection_1[1])); - assert(assign(the_pair, vector_for_intersection_1l[1])); + assert(assign_variant(the_pair, vector_for_intersection_1[1])); + assert(assign_variant(the_pair, vector_for_intersection_1l[1])); Circular_arc_point_2 second = the_pair.first; std::cout << second << std::endl; Compare_xy_2 theCompare_xy_2 = ck.compare_xy_2_object(); @@ -146,14 +157,13 @@ void _test_circle_construct(CK ck) CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_3, false); - std::vector< CGAL::Object > - vector_for_intersection_2; + std::vector< Intersection_result > vector_for_intersection_2; theConstruct_intersect_2(circ_intersections_2_1, circ_intersections_2_3, std::back_inserter(vector_for_intersection_2)); assert(theDo_intersect_2(circ_intersections_2_1, circ_intersections_2_3)); assert(vector_for_intersection_2.size() == 1); - assign(the_pair, vector_for_intersection_2[0]); + assign_variant(the_pair, vector_for_intersection_2[0]); assert(the_pair.first == the_intersection_point_1); assert(the_pair.first == the_intersection_point_2); @@ -163,14 +173,13 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_3_bis(center_circ_intersections_2_3_bis, circ_intersection_2_1_r * circ_intersection_2_1_r * 4); - std::vector< CGAL::Object > - vector_for_intersection_2_bis; + std::vector< Intersection_result > vector_for_intersection_2_bis; theConstruct_intersect_2(circ_intersections_2_1, circ_intersections_2_3_bis, std::back_inserter(vector_for_intersection_2_bis)); assert(theDo_intersect_2(circ_intersections_2_1, circ_intersections_2_3_bis)); assert(vector_for_intersection_2_bis.size() == 1); - assign(the_pair, vector_for_intersection_2_bis[0]); + assign_variant(the_pair, vector_for_intersection_2_bis[0]); assert(the_pair.second == 2u); @@ -202,8 +211,7 @@ void _test_circle_construct(CK ck) ////////////// std::cout << "OH NO!" << std::endl; //////////////} else std::cout << "OK" << std::endl; - std::vector< CGAL::Object > - vector_for_intersection_3; + std::vector< Intersection_result > vector_for_intersection_3; theConstruct_intersect_2(circ_arc_2_1_part_low, circ_arc_2_1_low_part_high, std::back_inserter(vector_for_intersection_3)); @@ -211,12 +219,12 @@ void _test_circle_construct(CK ck) /////////////std::cout << "The size: " << vector_for_intersection_3.size() << std::endl; assert(vector_for_intersection_3.size() == 2); - assign(the_pair, vector_for_intersection_3[0]); + assign_variant(the_pair, vector_for_intersection_3[0]); assert(the_pair.second == 1u); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_1_low, true)); - assign(the_pair, vector_for_intersection_3[1]); + assign_variant(the_pair, vector_for_intersection_3[1]); assert(the_pair.second == 1u); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_1_low, @@ -270,23 +278,21 @@ void _test_circle_construct(CK ck) ); std::cout << "Intersection : same circular arc" << std::endl; - std::vector< CGAL::Object > - vector_for_intersection_the_same_arc; + std::vector< Intersection_result > vector_for_intersection_the_same_arc; theConstruct_intersect_2(circ_arc_overlap_1, circ_arc_overlap_1, std::back_inserter(vector_for_intersection_the_same_arc)); assert(theDo_intersect_2(circ_arc_overlap_1, circ_arc_overlap_1)); assert(vector_for_intersection_the_same_arc.size() == 1); Circular_arc_2 res_same; - assert(assign(res_same, vector_for_intersection_the_same_arc[0])); + assert(assign_variant(res_same, vector_for_intersection_the_same_arc[0])); assert(res_same.source() == circ_arc_overlap_1.source()); assert(res_same.target() == circ_arc_overlap_1.target()); std::cout << "Intersection : overlap on a circular arc" << std::endl; Circular_arc_2 circ_arc_in_overlap; Circular_arc_2 circ_arc_in_overlap_2; - std::vector< CGAL::Object > - vector_for_intersection_overlap_1_1; + std::vector< Intersection_result > vector_for_intersection_overlap_1_1; theConstruct_intersect_2(circ_arc_overlap_2, circ_arc_overlap_1, std::back_inserter(vector_for_intersection_overlap_1_1)); @@ -295,30 +301,29 @@ void _test_circle_construct(CK ck) line_arc_overlap_low_left, true, line_arc_overlap_low_right, false); assert(vector_for_intersection_overlap_1_1.size() == 1); - assign(circ_arc_in_overlap, vector_for_intersection_overlap_1_1[0]); + assign_variant(circ_arc_in_overlap, vector_for_intersection_overlap_1_1[0]); assert(circ_arc_in_overlap.source() == circ_arc_overlap_result.source()); assert(circ_arc_in_overlap.target() == circ_arc_overlap_result.target()); - std::vector< CGAL::Object > - vector_for_intersection_overlap_1_2; + std::vector< Intersection_result > vector_for_intersection_overlap_1_2; theConstruct_intersect_2(circ_arc_overlap_2, circ_arc_overlap_1, std::back_inserter(vector_for_intersection_overlap_1_2)); assert(theDo_intersect_2(circ_arc_overlap_2, circ_arc_overlap_1)); assert(vector_for_intersection_overlap_1_2.size() == 1); - assign(circ_arc_in_overlap, vector_for_intersection_overlap_1_2[0]); + assign_variant(circ_arc_in_overlap, vector_for_intersection_overlap_1_2[0]); assert(circ_arc_in_overlap.source() == circ_arc_overlap_result.source()); assert(circ_arc_in_overlap.target() == circ_arc_overlap_result.target()); std::cout << "Intersection : overlap in one point" << std::endl; - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_overlap_2_1; theConstruct_intersect_2(circ_arc_overlap_1, circ_arc_overlap_3, std::back_inserter(vector_for_intersection_overlap_2_1)); assert(theDo_intersect_2(circ_arc_overlap_1, circ_arc_overlap_3)); assert(vector_for_intersection_overlap_2_1.size() == 1); - assign(the_pair, vector_for_intersection_overlap_2_1[0]); + assign_variant(the_pair, vector_for_intersection_overlap_2_1[0]); std::cout << "x = " << the_pair.first.x() << " the result must be = " << center_circ_intersection_2_1_x + circ_intersection_2_1_r * sqrt2 << std::endl; @@ -337,14 +342,14 @@ void _test_circle_construct(CK ck) assert(square(the_pair.first.y() - RT(center_circ_intersection_2_1_y)) == (circ_intersection_2_1_r * circ_intersection_2_1_r / typename CK::RT(2))); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_overlap_2_2; theConstruct_intersect_2(circ_arc_overlap_3, circ_arc_overlap_1, std::back_inserter(vector_for_intersection_overlap_2_2)); assert(theDo_intersect_2(circ_arc_overlap_3, circ_arc_overlap_1)); assert(vector_for_intersection_overlap_2_2.size() == 1); - assign(the_pair, vector_for_intersection_overlap_2_2[0]); + assign_variant(the_pair, vector_for_intersection_overlap_2_2[0]); std::cout << "x = " << the_pair.first.x() << " the result must be = " << center_circ_intersection_2_1_x + circ_intersection_2_1_r * sqrt2 << std::endl; @@ -362,7 +367,7 @@ void _test_circle_construct(CK ck) std::cout << "Intersection : overlap in two points: " << "lower_part_arc , upper_part_arc" << std::endl; - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_overlap_3_1; theConstruct_intersect_2(circ_arc_overlap_upper_part, circ_arc_overlap_lower_part, @@ -370,13 +375,13 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_arc_overlap_upper_part, circ_arc_overlap_lower_part)); assert(vector_for_intersection_overlap_3_1.size() == 2); - assign(the_pair, vector_for_intersection_overlap_3_1[0]); + assign_variant(the_pair, vector_for_intersection_overlap_3_1[0]); assert(the_pair.first == circ_arc_overlap_lower_part.source()); //assert(the_pair.first.is_left()); - assign(the_pair, vector_for_intersection_overlap_3_1[1]); + assign_variant(the_pair, vector_for_intersection_overlap_3_1[1]); assert(the_pair.first == circ_arc_overlap_lower_part.target()); //assert(!the_pair.first.is_left()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_overlap_3_2; theConstruct_intersect_2(circ_arc_overlap_lower_part, circ_arc_overlap_upper_part, @@ -384,10 +389,10 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_arc_overlap_lower_part, circ_arc_overlap_upper_part)); assert(vector_for_intersection_overlap_3_2.size() == 2); - assign(the_pair, vector_for_intersection_overlap_3_2[0]); + assign_variant(the_pair, vector_for_intersection_overlap_3_2[0]); assert(the_pair.first == circ_arc_overlap_lower_part.source()); //assert(the_pair.first.is_left()); - assign(the_pair, vector_for_intersection_overlap_3_2[1]); + assign_variant(the_pair, vector_for_intersection_overlap_3_2[1]); assert(the_pair.first == circ_arc_overlap_lower_part.target()); //assert(!the_pair.first.is_left()); @@ -404,20 +409,20 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_4(center_circ_intersections_2_4, circ_intersection_2_1_r * circ_intersection_2_1_r); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_1; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_4, std::back_inserter(vector_for_intersection_no_x_monotone_1_1)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_4)); assert(vector_for_intersection_no_x_monotone_1_1.size() == 2); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_1[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_4, true)); assert(the_pair.second == 1u); //assert(the_pair.first.is_left()); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_1[1])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_1[1])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_4, false)); @@ -432,14 +437,14 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_5(center_circ_intersections_2_5, circ_intersection_2_1_r * circ_intersection_2_1_r); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_2; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_5, std::back_inserter(vector_for_intersection_no_x_monotone_1_2)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_5)); assert(vector_for_intersection_no_x_monotone_1_2.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_2[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_2[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_5, true)); @@ -454,14 +459,14 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_6(center_circ_intersections_2_6, circ_intersection_2_1_r * circ_intersection_2_1_r); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_3; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_6, std::back_inserter(vector_for_intersection_no_x_monotone_1_3)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_6)); assert(vector_for_intersection_no_x_monotone_1_3.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_3[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_3[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_6, true)); @@ -475,14 +480,14 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_7(center_circ_intersections_2_7, circ_intersection_2_1_r * circ_intersection_2_1_r); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_4; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_7, std::back_inserter(vector_for_intersection_no_x_monotone_1_4)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_7)); assert(vector_for_intersection_no_x_monotone_1_4.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_4[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_4[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_7, true)); @@ -495,14 +500,14 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_8(center_circ_intersections_2_8, circ_intersection_2_1_r * circ_intersection_2_1_r * 4); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_5; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_8, std::back_inserter(vector_for_intersection_no_x_monotone_1_5)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_8)); assert(vector_for_intersection_no_x_monotone_1_5.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_5[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_5[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_8, true)); @@ -515,14 +520,14 @@ void _test_circle_construct(CK ck) Circle_2 circ_intersections_2_9(center_circ_intersections_2_9, circ_intersection_2_1_r * circ_intersection_2_1_r * 4); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_1_6; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_9, std::back_inserter(vector_for_intersection_no_x_monotone_1_6)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_intersections_2_9)); assert(vector_for_intersection_no_x_monotone_1_6.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_1_6[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_1_6[0])); assert(the_pair.first == CGAL::circle_intersect(circ_intersections_2_1, circ_intersections_2_9, true)); @@ -535,14 +540,14 @@ void _test_circle_construct(CK ck) Circular_arc_2 circ_arc_no_x_monotone_2(circ_intersections_2_1, line_arc_overlap_low_left, true, line_arc_overlap_low_left, false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_1; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_arc_no_x_monotone_2, std::back_inserter(vector_for_intersection_no_x_monotone_2_1)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_arc_no_x_monotone_2)); assert(vector_for_intersection_no_x_monotone_2_1.size() == 1); - assert(assign(circ_arc_in_overlap, vector_for_intersection_no_x_monotone_2_1[0])); + assert(assign_variant(circ_arc_in_overlap, vector_for_intersection_no_x_monotone_2_1[0])); assert(circ_arc_in_overlap.is_x_monotone()); assert(circ_arc_in_overlap.source() == circ_arc_overlap_result.source()); assert(circ_arc_in_overlap.target() == circ_arc_overlap_result.target()); @@ -556,14 +561,14 @@ void _test_circle_construct(CK ck) line_arc_overlap_low_left, true); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_2; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_arc_no_x_monotone_3, std::back_inserter(vector_for_intersection_no_x_monotone_2_2)); assert(theDo_intersect_2(circ_arc_no_x_monotone_1, circ_arc_no_x_monotone_3)); assert(vector_for_intersection_no_x_monotone_2_2.size() == 1); - assert(assign(circ_arc_in_overlap, vector_for_intersection_no_x_monotone_2_2[0])); + assert(assign_variant(circ_arc_in_overlap, vector_for_intersection_no_x_monotone_2_2[0])); assert(circ_arc_in_overlap.source() == circ_arc_no_x_monotone_1.source()); assert(circ_arc_in_overlap.target() == circ_arc_no_x_monotone_3.target()); @@ -575,7 +580,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 circ_arc_no_x_monotone_4(circ_intersections_2_1, line_arc_overlap_low_left, true, line_arc_overlap_low_right, true); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_3; theConstruct_intersect_2(circ_arc_no_x_monotone_1, circ_arc_no_x_monotone_4, @@ -586,9 +591,9 @@ void _test_circle_construct(CK ck) std::cout << vector_for_intersection_no_x_monotone_2_3.size() << std::endl; assert(vector_for_intersection_no_x_monotone_2_3.size() == 2); - assert(assign(circ_arc_in_overlap, + assert(assign_variant(circ_arc_in_overlap, vector_for_intersection_no_x_monotone_2_3[0])); - assert(assign(the_pair, + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_2_3[1])); assert(circ_arc_in_overlap.is_x_monotone()); assert(circ_arc_in_overlap.source() @@ -605,7 +610,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 circ_arc_no_x_monotone_5(circ_intersections_2_1, line_arc_overlap_low_right, true, line_arc_overlap_low_left, true); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_4; theConstruct_intersect_2(circ_arc_no_x_monotone_4, circ_arc_no_x_monotone_5, @@ -613,10 +618,10 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_arc_no_x_monotone_4, circ_arc_no_x_monotone_5)); std::cout << vector_for_intersection_no_x_monotone_2_4.size() << std::endl; assert(vector_for_intersection_no_x_monotone_2_4.size() == 2); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_2_4[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_2_4[0])); assert(the_pair.first == circ_arc_no_x_monotone_5.target()); assert(the_pair.second == 1u); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_2_4[1])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_2_4[1])); assert(the_pair.first == circ_arc_no_x_monotone_5.source()); assert(the_pair.second == 1u); @@ -626,7 +631,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 circ_arc_no_x_monotone_6(circ_intersections_2_1, line_arc_overlap_low_right, false, line_arc_overlap_low_right, true); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_5; theConstruct_intersect_2(circ_arc_no_x_monotone_6, circ_arc_no_x_monotone_5, @@ -634,7 +639,7 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_arc_no_x_monotone_6, circ_arc_no_x_monotone_5)); std::cout << vector_for_intersection_no_x_monotone_2_5.size() << std::endl; assert(vector_for_intersection_no_x_monotone_2_5.size() == 1); - assert(assign(the_pair, vector_for_intersection_no_x_monotone_2_5[0])); + assert(assign_variant(the_pair, vector_for_intersection_no_x_monotone_2_5[0])); assert(the_pair.first == circ_arc_no_x_monotone_5.source()); assert(the_pair.second == 1u); @@ -644,7 +649,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 circ_arc_no_x_monotone_7(circ_intersections_2_1, line_arc_overlap_low_left, false, line_arc_overlap_low_right, false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_no_x_monotone_2_6; theConstruct_intersect_2(circ_arc_no_x_monotone_7, circ_arc_no_x_monotone_4, @@ -652,8 +657,8 @@ void _test_circle_construct(CK ck) assert(theDo_intersect_2(circ_arc_no_x_monotone_7, circ_arc_no_x_monotone_4)); std::cout << vector_for_intersection_no_x_monotone_2_6.size() << std::endl; assert(vector_for_intersection_no_x_monotone_2_6.size() == 2); - assign(circ_arc_in_overlap,vector_for_intersection_no_x_monotone_2_6[0]); - assign(circ_arc_in_overlap_2,vector_for_intersection_no_x_monotone_2_6[1]); + assign_variant(circ_arc_in_overlap,vector_for_intersection_no_x_monotone_2_6[0]); + assign_variant(circ_arc_in_overlap_2,vector_for_intersection_no_x_monotone_2_6[1]); assert((circ_arc_in_overlap.source() == circ_arc_no_x_monotone_7.source() && circ_arc_in_overlap.target() == circ_arc_no_x_monotone_4.target()) || (circ_arc_in_overlap_2.source() == circ_arc_no_x_monotone_7.source() && @@ -692,7 +697,7 @@ void _test_circle_construct(CK ck) Point_2 center_circ_monotone(x,y); Circle_2 circ_monotone(center_circ_monotone, r*r); Circular_arc_2 theCircular_arc_2_full(circ_monotone); - std::vector< CGAL::Object > outputIterator1, outputIterator1l; + std::vector< Intersection_result > outputIterator1, outputIterator1l; theMake_x_monotone(theCircular_arc_2_full, std::back_inserter(outputIterator1)); make_x_monotone(theCircular_arc_2_full, std::back_inserter(outputIterator1l)); @@ -701,8 +706,8 @@ void _test_circle_construct(CK ck) << circ_monotone << std::endl; Circular_arc_2 circular_arc_2_full, circular_arc_2_fulll; for(std::size_t i = 0; i < outputIterator1.size(); i++){ - assign(circular_arc_2_full, outputIterator1[i]); - assign(circular_arc_2_fulll, outputIterator1l[i]); + assign_variant(circular_arc_2_full, outputIterator1[i]); + assign_variant(circular_arc_2_fulll, outputIterator1l[i]); std::cout << "Circular_arc_2_" << i << " : " << circular_arc_2_full << std::endl; std::cout << "Circular_arc_2_" << i << "source : " @@ -723,8 +728,8 @@ void _test_circle_construct(CK ck) std::back_inserter(outputIterator1l)); assert(outputIterator1.size() == 4); for(std::size_t i = 0; i < outputIterator1.size(); i++){ - assign(circular_arc_2_full, outputIterator1[i]); - assign(circular_arc_2_fulll, outputIterator1l[i]); + assign_variant(circular_arc_2_full, outputIterator1[i]); + assign_variant(circular_arc_2_fulll, outputIterator1l[i]); assert(circular_arc_2_full.is_x_monotone()); assert(circular_arc_2_full.is_y_monotone()); assert(circular_arc_2_full == circular_arc_2_fulll); @@ -767,7 +772,7 @@ void _test_circle_construct(CK ck) std::cout << "T: " << i << " " << j << std::endl; assert(outputIterator1.size() == isize[i][j]); for(std::size_t k = 0; k < outputIterator1.size(); k++) { - assign(circular_arc_2_full, outputIterator1[k]); + assign_variant(circular_arc_2_full, outputIterator1[k]); assert(circular_arc_2_full.is_x_monotone()); assert(circular_arc_2_full.is_y_monotone()); } @@ -782,7 +787,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 theCircular_arc_2_quarter(circ_monotone, theLine_2_1, true, theLine_2_2, true); - std::vector< CGAL::Object > vector_of_object_1; + std::vector< Intersection_result > vector_of_object_1; theMake_x_monotone(theCircular_arc_2_quarter, std::back_inserter(vector_of_object_1)); std::cout << std::endl; @@ -791,7 +796,7 @@ void _test_circle_construct(CK ck) std::cout << vector_of_object_1.size() << std::endl; Circular_arc_2 circular_arc_2_quarter; for(std::size_t i = 0; i < vector_of_object_1.size(); i++){ - assign(circular_arc_2_quarter, vector_of_object_1[i]); + assign_variant(circular_arc_2_quarter, vector_of_object_1[i]); std::cout << "Circular_arc_2_" << i << " : " << circular_arc_2_quarter << std::endl; assert(circular_arc_2_quarter.is_x_monotone()); @@ -801,13 +806,13 @@ void _test_circle_construct(CK ck) Circular_arc_2 theCircular_arc_2_half(circ_monotone, theLine_2_2, false, theLine_2_2, true); - std::vector< CGAL::Object > vector_of_object_1_half; + std::vector< Intersection_result > vector_of_object_1_half; theMake_x_monotone(theCircular_arc_2_half, std::back_inserter(vector_of_object_1_half)); std::cout << std::endl; std::cout << "x_monotone a half circle" << std::endl; assert(vector_of_object_1_half.size() == 1); - assign(circular_arc_2_quarter, vector_of_object_1_half[0]); + assign_variant(circular_arc_2_quarter, vector_of_object_1_half[0]); assert(circular_arc_2_quarter.is_x_monotone()); assert(circular_arc_2_quarter.source() == theCircular_arc_2_half.source()); assert(circular_arc_2_quarter.target() == theCircular_arc_2_half.target()); @@ -837,7 +842,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 theCircular_arc_2_random(circ_monotone, theLine_2_3, true, theLine_2_4, true); - std::vector< CGAL::Object > vector_of_object_2; + std::vector< Intersection_result > vector_of_object_2; theMake_x_monotone(theCircular_arc_2_random, std::back_inserter(vector_of_object_2)); std::cout << std::endl; @@ -845,7 +850,7 @@ void _test_circle_construct(CK ck) << circ_monotone << std::endl; Circular_arc_2 circular_arc_2_random; for(std::size_t i = 0; i < vector_of_object_2.size(); i++){ - assign(circular_arc_2_random, vector_of_object_2[i]); + assign_variant(circular_arc_2_random, vector_of_object_2[i]); std::cout << "Circular_arc_2_" << i << " : " << circular_arc_2_random << std::endl; assert(circular_arc_2_random.is_x_monotone()); @@ -911,7 +916,7 @@ void _test_circle_construct(CK ck) Circular_arc_2 cao8 = Circular_arc_2(Point_2(11,10), Point_2(1,0), Point_2(11,-10)); // = no intersection std::cout << "Testing intersect with lines" << std::endl; - std::vector< CGAL::Object > v_ll1, v_ll2, v_ll3, v_ll4, v_ll5, v_ll6, v_ll7, v_ll8; + std::vector< Intersection_result > v_ll1, v_ll2, v_ll3, v_ll4, v_ll5, v_ll6, v_ll7, v_ll8; theConstruct_intersect_2(lo1, cao1, std::back_inserter(v_ll1)); theConstruct_intersect_2(lo1, cao2, std::back_inserter(v_ll2)); theConstruct_intersect_2(lo1, cao3, std::back_inserter(v_ll3)); @@ -942,7 +947,7 @@ void _test_circle_construct(CK ck) Line_arc_2 llu3 = Line_arc_2(Point_2(-2,-1), Point_2(-2,1)); Circle_2 ccu = Circle_2(Point_2(0,-1), Point_2(-1,0), Point_2(0,1)); - std::vector< CGAL::Object > v_llc1, v_llc2, v_llc3; + std::vector< Intersection_result > v_llc1, v_llc2, v_llc3; theConstruct_intersect_2(llu1, ccu, std::back_inserter(v_llc1)); theConstruct_intersect_2(llu2, ccu, std::back_inserter(v_llc2)); theConstruct_intersect_2(llu3, ccu, std::back_inserter(v_llc3)); @@ -957,7 +962,7 @@ void _test_circle_construct(CK ck) assert(!theDo_intersect_2(llu3, ccu)); assert(!CGAL::do_intersect(llu3, ccu)); - std::vector< CGAL::Object > v_rllc1, v_rllc2, v_rllc3, v_rllc1l, v_rllc2l, v_rllc3l; + std::vector< Intersection_result > v_rllc1, v_rllc2, v_rllc3, v_rllc1l, v_rllc2l, v_rllc3l; theConstruct_intersect_2(llu1.supporting_line(), ccu, std::back_inserter(v_rllc1)); theConstruct_intersect_2(llu2.supporting_line(), ccu, std::back_inserter(v_rllc2)); theConstruct_intersect_2(llu3.supporting_line(), ccu, std::back_inserter(v_rllc3)); diff --git a/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_extention.h b/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_extention.h index 2329bca2acbd..02471d6f61db 100644 --- a/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_extention.h +++ b/Circular_kernel_2/test/Circular_kernel_2/include/CGAL/_test_circles_extention.h @@ -24,7 +24,9 @@ void _test_circle_bbox(CK ck) typedef typename CK::Circle_2 Circle_2; typedef typename CK::Circular_arc_2 Circular_arc_2; typedef typename CK::Point_2 Point_2; + typedef typename CK::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Intersect_2 Intersect_2; + typedef std::variant> Intersection_result; CGAL::Random generatorOfgenerator; int random_seed = generatorOfgenerator.get_int(0, 123456); @@ -55,7 +57,7 @@ void _test_circle_bbox(CK ck) bool box_overlap = do_overlap(box1, box2); Intersect_2 theConstruct_intersect_2 = ck.intersect_2_object(); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(arc1, arc2, @@ -143,6 +145,7 @@ template typedef typename CK::Intersect_2 Intersect_2; typedef typename CK::Make_x_monotone_2 Make_x_monotone_2; typedef typename CK::Line_arc_2 Line_arc_2; + typedef std::variant, Circular_arc_2> Intersection_result; Point_2 center_circ(0,0); Circle_2 circ(center_circ, 100); @@ -151,7 +154,7 @@ template Point_2(0, -15)); Intersect_2 theConstruct_intersect_2 = ck.intersect_2_object(); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(arc, line_vertical, @@ -159,18 +162,18 @@ template Circular_arc_point_2 point_top; Circular_arc_point_2 point_down; std::pair< Circular_arc_point_2, unsigned int> aux; - assign(aux, vector_for_intersection_1[0]); + assign_variant(aux, vector_for_intersection_1[0]); point_down = aux.first; - assign(aux, vector_for_intersection_1[1]); + assign_variant(aux, vector_for_intersection_1[1]); point_top = aux.first; Make_x_monotone_2 theMake_x_monotone = ck.make_x_monotone_2_object(); - std::vector< CGAL::Object > outputIterator1; + std::vector< Intersection_result > outputIterator1; theMake_x_monotone(arc, std::back_inserter(outputIterator1)); Circular_arc_2 arc_top; Circular_arc_2 arc_down; - assign(arc_top,outputIterator1[1]); - assign(arc_down, outputIterator1[0]); + assign_variant(arc_top,outputIterator1[1]); + assign_variant(arc_down, outputIterator1[0]); assert(!ck.has_on_2_object()(arc_top, line_vertical.source())); assert(ck.has_on_2_object()(arc_top, @@ -195,7 +198,7 @@ template typedef typename CK::Point_2 Point_2; typedef typename CK::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Intersect_2 Intersect_2; - + typedef std::variant> Intersection_result; int test_suite_cases[3][2][3] = {{{-7,-8,113},{9,9,162}}, @@ -213,20 +216,20 @@ template Intersect_2 theConstruct_intersect_2 = ck.intersect_2_object(); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(arc, arc2, std::back_inserter(vector_for_intersection_1)); std::pair< Circular_arc_point_2, unsigned int> aux; - assign(aux, vector_for_intersection_1[0]); + assign_variant(aux, vector_for_intersection_1[0]); CGAL::Bbox_2 box1 = aux.first.bbox(); assert(typename CK::FT(box1.xmin()) <= aux.first.x()); assert(typename CK::FT(box1.xmax()) >= aux.first.x()); assert(typename CK::FT(box1.ymin()) <= aux.first.y()); assert(typename CK::FT(box1.ymax()) >= aux.first.y()); std::cout << "Ok" << std::endl; - assign(aux, vector_for_intersection_1[1]); + assign_variant(aux, vector_for_intersection_1[1]); CGAL::Bbox_2 box2 = aux.first.bbox(); assert(typename CK::FT(box2.xmin()) <= aux.first.x()); assert(typename CK::FT(box2.xmax()) >= aux.first.x()); diff --git a/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp b/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp index 38a2174b586f..b1633d4b08fe 100644 --- a/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp +++ b/Circular_kernel_2/test/Circular_kernel_2/test_Line_arc.cpp @@ -27,6 +27,17 @@ #include +template +bool assign_variant(Expected& e, const V& v) +{ + if (std::get_if(&v) != nullptr) + { + e = std::get(v); + return true; + } + return false; +} + template void _test_Line_arc(CK ck) { @@ -87,41 +98,42 @@ void _test_Line_arc(CK ck) //////////////Intersection Line_arc Line_arc////////////////// Intersect_2 theConstruct_intersect_2 = ck.intersect_2_object(); + typedef std::variant, Line_arc_2> Intersection_result; - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(line_arc_horizontal, line_arc_vertical, std::back_inserter(vector_for_intersection_1)); std::pair the_pair; - assert(assign(the_pair, vector_for_intersection_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_1[0])); Circular_arc_point_2 first = the_pair.first; assert(first.x() == 0); assert(first.y() == 0); Line_arc_2 line_arc_3(Point_2(-1, -2), Point_2(2,1)); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_2; theConstruct_intersect_2(line_arc_horizontal, line_arc_3, std::back_inserter(vector_for_intersection_2)); - assert(assign(the_pair, vector_for_intersection_2[0])); + assert(assign_variant(the_pair, vector_for_intersection_2[0])); first = the_pair.first; assert(first.x() == 1); assert(first.y() == 0); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_3; theConstruct_intersect_2(line_arc_vertical, line_arc_3, std::back_inserter(vector_for_intersection_3)); - assert(assign(the_pair, vector_for_intersection_3[0])); + assert(assign_variant(the_pair, vector_for_intersection_3[0])); first = the_pair.first; assert(first.x() == 0); assert(first.y() == -1); Line_arc_2 line_arc_4(Point_2(20, -2), Point_2(20,10)); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_4; theConstruct_intersect_2(line_arc_horizontal, line_arc_4, @@ -131,14 +143,14 @@ void _test_Line_arc(CK ck) ////////////intersection in overlap/////////////// - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_5; theConstruct_intersect_2(line_arc_horizontal, line_arc_horizontal, std::back_inserter(vector_for_intersection_5)); Line_arc_2 line_arc_tmp; assert(vector_for_intersection_5.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_5[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_5[0])); assert(line_arc_tmp == line_arc_horizontal); Line_arc_2 line_arc_horizontal2(Line_2(center_circle1, p2_line_horizontal), @@ -146,25 +158,25 @@ void _test_Line_arc(CK ck) true, circle1, false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_6; theConstruct_intersect_2(line_arc_horizontal, line_arc_horizontal2, std::back_inserter(vector_for_intersection_6)); assert(vector_for_intersection_6.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_6[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_6[0])); assert(line_arc_tmp.source() == line_arc_horizontal.source()); assert(line_arc_tmp.target() == line_arc_horizontal2.target()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_6_reverse; theConstruct_intersect_2(line_arc_horizontal2, line_arc_horizontal, std::back_inserter(vector_for_intersection_6_reverse)); assert(vector_for_intersection_6_reverse.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_6_reverse[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_6_reverse[0])); assert(line_arc_tmp.source() == line_arc_horizontal.source()); assert(line_arc_tmp.target() == line_arc_horizontal2.target()); @@ -175,43 +187,43 @@ void _test_Line_arc(CK ck) true, circle1, false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_7; theConstruct_intersect_2(line_arc_horizontal, line_arc_horizontal3, std::back_inserter(vector_for_intersection_7)); assert(vector_for_intersection_7.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_7[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_7[0])); assert(line_arc_tmp.source() == line_arc_horizontal.source()); assert(line_arc_tmp.target() == line_arc_horizontal3.target()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_8; theConstruct_intersect_2(line_arc_horizontal3, line_arc_horizontal, std::back_inserter(vector_for_intersection_8)); assert(vector_for_intersection_8.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_8[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_8[0])); assert(line_arc_tmp.source() == line_arc_horizontal.source()); assert(line_arc_tmp.target() == line_arc_horizontal3.target()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_8_bis_1; theConstruct_intersect_2(line_arc_horizontal3, line_arc_horizontal2, std::back_inserter(vector_for_intersection_8_bis_1)); assert(vector_for_intersection_8_bis_1.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_8_bis_1[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_8_bis_1[0])); assert(line_arc_tmp.source() == line_arc_horizontal2.source()); assert(line_arc_tmp.target() == line_arc_horizontal3.target()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_8_bis_2; theConstruct_intersect_2(line_arc_horizontal2, line_arc_horizontal3, std::back_inserter(vector_for_intersection_8_bis_2)); assert(vector_for_intersection_8_bis_2.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_8_bis_2[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_8_bis_2[0])); assert(line_arc_tmp.source() == line_arc_horizontal2.source()); assert(line_arc_tmp.target() == line_arc_horizontal3.target()); @@ -221,45 +233,45 @@ void _test_Line_arc(CK ck) true, circle1, true); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_9; theConstruct_intersect_2(line_arc_horizontal4, line_arc_horizontal, std::back_inserter(vector_for_intersection_9)); assert(vector_for_intersection_9.size() == 1); - assert(assign(the_pair, vector_for_intersection_9[0])); + assert(assign_variant(the_pair, vector_for_intersection_9[0])); assert(the_pair.second == 1); assert(the_pair.first == line_arc_horizontal.source()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_10; theConstruct_intersect_2(line_arc_horizontal, line_arc_horizontal4, std::back_inserter(vector_for_intersection_10)); assert(vector_for_intersection_10.size() == 1); - assert(assign(the_pair, vector_for_intersection_10[0])); + assert(assign_variant(the_pair, vector_for_intersection_10[0])); assert(the_pair.second == 1); assert(the_pair.first == line_arc_horizontal.source()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_11; theConstruct_intersect_2(Line_arc_2(Point_2(-1, -1),Point_2(2, 2)), Line_arc_2(Point_2(0, 0), Point_2(1, 1)), std::back_inserter(vector_for_intersection_11)); assert(vector_for_intersection_11.size() == 1); - assert(assign(line_arc_tmp, vector_for_intersection_11[0])); + assert(assign_variant(line_arc_tmp, vector_for_intersection_11[0])); assert(line_arc_tmp == Line_arc_2(Point_2(0, 0), Point_2(1, 1))); //////Split///////////// - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_split_1; theConstruct_intersect_2(line_arc_horizontal, line_arc_3, std::back_inserter(vector_for_intersection_split_1)); - assert(assign(the_pair, vector_for_intersection_split_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_split_1[0])); Circular_arc_point_2 point_of_split = the_pair.first; Split_2 theSplit_2 = ck.split_2_object(); Line_arc_2 first_part_line_arc_horizontal; @@ -291,6 +303,8 @@ void _test_intersection_Line_arc_Circle(CK ck) typedef CGAL::Line_arc_2 Line_arc_2; typedef CGAL::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Intersect_2 Intersect_2; + typedef std::variant, Line_arc_2> Intersection_result; + CGAL::Random generatorOfgenerator; int random_seed = generatorOfgenerator.get_int(0, 123456); std::cout << "random_seed = " << random_seed << std::endl; @@ -368,53 +382,53 @@ void _test_intersection_Line_arc_Circle(CK ck) false); ////////test horizontal////// - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(line_arc_horizontal, circle1, std::back_inserter(vector_for_intersection_1)); std::pair the_pair; assert(vector_for_intersection_1.size() == 2); - assert(assign(the_pair, vector_for_intersection_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_1[0])); Circular_arc_point_2 first = the_pair.first; assert(first == line_arc_horizontal.source()); assert(the_pair.second == 1); - assert(assign(the_pair, vector_for_intersection_1[1])); + assert(assign_variant(the_pair, vector_for_intersection_1[1])); first = the_pair.first; assert(first == line_arc_horizontal2.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_2; theConstruct_intersect_2(line_arc_horizontal, circle2, std::back_inserter(vector_for_intersection_2)); assert(vector_for_intersection_2.size() == 1); - assert(assign(the_pair, vector_for_intersection_2[0])); + assert(assign_variant(the_pair, vector_for_intersection_2[0])); first = the_pair.first; assert(first == line_arc_horizontal.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_3; theConstruct_intersect_2(line_arc_horizontal2, circle2, std::back_inserter(vector_for_intersection_3)); assert(vector_for_intersection_3.size() == 0); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_4; theConstruct_intersect_2(line_arc_horizontal3, circle2, std::back_inserter(vector_for_intersection_4)); assert(vector_for_intersection_4.size() == 1); - assert(assign(the_pair, vector_for_intersection_4[0])); + assert(assign_variant(the_pair, vector_for_intersection_4[0])); first = the_pair.first; assert(first == line_arc_horizontal3.source()); assert(the_pair.second == 1); Line_arc_2 line_arc_aux(p2_high_circle2,p2_high_right_circle2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_5; theConstruct_intersect_2(Line_arc_2(p2_high_left_circle2,p2_high_right_circle2), circle2, @@ -424,17 +438,17 @@ void _test_intersection_Line_arc_Circle(CK ck) circle2, std::back_inserter(vector_for_intersection_5)); assert(vector_for_intersection_5.size() == 2); - assert(assign(the_pair, vector_for_intersection_5[0])); + assert(assign_variant(the_pair, vector_for_intersection_5[0])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); - assert(assign(the_pair, vector_for_intersection_5[1])); + assert(assign_variant(the_pair, vector_for_intersection_5[1])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); line_arc_aux = Line_arc_2(p2_low_circle2,p2_low_right_circle2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_6; theConstruct_intersect_2(Line_arc_2(p2_low_left_circle2,p2_low_right_circle2), circle2, @@ -444,63 +458,63 @@ void _test_intersection_Line_arc_Circle(CK ck) circle2, std::back_inserter(vector_for_intersection_6)); assert(vector_for_intersection_6.size() == 2); - assert(assign(the_pair, vector_for_intersection_6[0])); + assert(assign_variant(the_pair, vector_for_intersection_6[0])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); - assert(assign(the_pair, vector_for_intersection_6[1])); + assert(assign_variant(the_pair, vector_for_intersection_6[1])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); ////////test vertical////// - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_7; theConstruct_intersect_2(line_arc_vertical, circle1, std::back_inserter(vector_for_intersection_7)); assert(vector_for_intersection_7.size() == 2); - assert(assign(the_pair, vector_for_intersection_7[0])); + assert(assign_variant(the_pair, vector_for_intersection_7[0])); first = the_pair.first; assert(first == line_arc_vertical.source()); assert(the_pair.second == 1); - assert(assign(the_pair, vector_for_intersection_7[1])); + assert(assign_variant(the_pair, vector_for_intersection_7[1])); first = the_pair.first; assert(first == line_arc_vertical2.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_8; theConstruct_intersect_2(line_arc_vertical, circle2, std::back_inserter(vector_for_intersection_8)); std::cout << vector_for_intersection_8.size() << std::endl; assert(vector_for_intersection_8.size() == 1); - assert(assign(the_pair, vector_for_intersection_8[0])); + assert(assign_variant(the_pair, vector_for_intersection_8[0])); first = the_pair.first; assert(first == line_arc_vertical.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_9; theConstruct_intersect_2(line_arc_vertical2, circle2, std::back_inserter(vector_for_intersection_9)); assert(vector_for_intersection_9.size() == 0); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_10; theConstruct_intersect_2(line_arc_vertical3, circle2, std::back_inserter(vector_for_intersection_10)); assert(vector_for_intersection_10.size() == 1); - assert(assign(the_pair, vector_for_intersection_10[0])); + assert(assign_variant(the_pair, vector_for_intersection_10[0])); first = the_pair.first; assert(first == line_arc_vertical3.source()); assert(the_pair.second == 1); line_arc_aux = Line_arc_2(p2_right_circle2,p2_high_right_circle2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_11; theConstruct_intersect_2(Line_arc_2(p2_low_right_circle2,p2_high_right_circle2), circle2, @@ -510,17 +524,17 @@ void _test_intersection_Line_arc_Circle(CK ck) circle2, std::back_inserter(vector_for_intersection_11)); assert(vector_for_intersection_11.size() == 2); - assert(assign(the_pair, vector_for_intersection_11[0])); + assert(assign_variant(the_pair, vector_for_intersection_11[0])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); - assert(assign(the_pair, vector_for_intersection_11[1])); + assert(assign_variant(the_pair, vector_for_intersection_11[1])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); line_arc_aux = Line_arc_2(p2_left_circle2,p2_high_left_circle2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_12; theConstruct_intersect_2(Line_arc_2(p2_low_left_circle2,p2_high_left_circle2), circle2, @@ -530,56 +544,56 @@ void _test_intersection_Line_arc_Circle(CK ck) circle2, std::back_inserter(vector_for_intersection_12)); assert(vector_for_intersection_12.size() == 2); - assert(assign(the_pair, vector_for_intersection_12[0])); + assert(assign_variant(the_pair, vector_for_intersection_12[0])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); - assert(assign(the_pair, vector_for_intersection_12[1])); + assert(assign_variant(the_pair, vector_for_intersection_12[1])); first = the_pair.first; assert(first == line_arc_aux.source()); assert(the_pair.second == 2); //test diagonal - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_13; theConstruct_intersect_2(line_arc_diagonal, circle1, std::back_inserter(vector_for_intersection_13)); assert(vector_for_intersection_13.size() == 2); - assert(assign(the_pair, vector_for_intersection_13[0])); + assert(assign_variant(the_pair, vector_for_intersection_13[0])); first = the_pair.first; assert(first == line_arc_diagonal.source()); assert(the_pair.second == 1); - assert(assign(the_pair, vector_for_intersection_13[1])); + assert(assign_variant(the_pair, vector_for_intersection_13[1])); first = the_pair.first; assert(first == line_arc_diagonal2.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_14; theConstruct_intersect_2(line_arc_diagonal, circle2, std::back_inserter(vector_for_intersection_14)); assert(vector_for_intersection_14.size() == 1); - assert(assign(the_pair, vector_for_intersection_14[0])); + assert(assign_variant(the_pair, vector_for_intersection_14[0])); first = the_pair.first; assert(first == line_arc_diagonal.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_15; theConstruct_intersect_2(line_arc_diagonal2, circle2, std::back_inserter(vector_for_intersection_15)); assert(vector_for_intersection_15.size() == 0); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_16; theConstruct_intersect_2(line_arc_diagonal3, circle2, std::back_inserter(vector_for_intersection_16)); assert(vector_for_intersection_16.size() == 1); - assert(assign(the_pair, vector_for_intersection_16[0])); + assert(assign_variant(the_pair, vector_for_intersection_16[0])); first = the_pair.first; assert(first == line_arc_diagonal3.source()); assert(the_pair.second == 1); @@ -587,42 +601,42 @@ void _test_intersection_Line_arc_Circle(CK ck) //Diagonal tangent - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_17; theConstruct_intersect_2(Line_arc_2(Point_2(-10, -5), Point_2(5, 15)), circle1, std::back_inserter(vector_for_intersection_17)); assert(vector_for_intersection_17.size() == 1); - assert(assign(the_pair, vector_for_intersection_17[0])); + assert(assign_variant(the_pair, vector_for_intersection_17[0])); assert(the_pair.second == 2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_18; theConstruct_intersect_2(Line_arc_2(Point_2(10, -5), Point_2(-5, 15)), circle1, std::back_inserter(vector_for_intersection_18)); assert(vector_for_intersection_18.size() == 1); - assert(assign(the_pair, vector_for_intersection_18[0])); + assert(assign_variant(the_pair, vector_for_intersection_18[0])); assert(the_pair.second == 2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_19; theConstruct_intersect_2(Line_arc_2(Point_2(10, 5), Point_2(-5, -15)), circle1, std::back_inserter(vector_for_intersection_19)); assert(vector_for_intersection_19.size() == 1); - assert(assign(the_pair, vector_for_intersection_19[0])); + assert(assign_variant(the_pair, vector_for_intersection_19[0])); assert(the_pair.second == 2); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_20; theConstruct_intersect_2(Line_arc_2(Point_2(-10, 5), Point_2(5, -15)), circle1, std::back_inserter(vector_for_intersection_20)); assert(vector_for_intersection_20.size() == 1); - assert(assign(the_pair, vector_for_intersection_20[0])); + assert(assign_variant(the_pair, vector_for_intersection_20[0])); assert(the_pair.second == 2); } @@ -638,6 +652,7 @@ void _test_intersection_Line_arc_Circular_arc(CK ck) typedef CGAL::Line_arc_2 Line_arc_2; typedef CGAL::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Intersect_2 Intersect_2; + typedef std::variant, Circular_arc_2> Intersection_result; typedef typename CK::Make_x_monotone_2 Make_x_monotone_2; CGAL::Random generatorOfgenerator; int random_seed = generatorOfgenerator.get_int(0, 123456); @@ -699,58 +714,58 @@ void _test_intersection_Line_arc_Circular_arc(CK ck) Line_2(center_circle1, p2_line_vertical), false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(line_arc_horizontal3, arc_1, std::back_inserter(vector_for_intersection_1)); std::pair the_pair; assert(vector_for_intersection_1.size() == 2); - assert(assign(the_pair, vector_for_intersection_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_1[0])); Circular_arc_point_2 first = the_pair.first; assert(first == line_arc_horizontal3.source()); assert(the_pair.second == 1); - assert(assign(the_pair, vector_for_intersection_1[1])); + assert(assign_variant(the_pair, vector_for_intersection_1[1])); first = the_pair.first; assert(first == line_arc_horizontal3.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_2; theConstruct_intersect_2(line_arc_horizontal, arc_1, std::back_inserter(vector_for_intersection_2)); assert(vector_for_intersection_2.size() == 1); - assert(assign(the_pair, vector_for_intersection_2[0])); + assert(assign_variant(the_pair, vector_for_intersection_2[0])); first = the_pair.first; assert(first == line_arc_horizontal.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_3; theConstruct_intersect_2(line_arc_vertical, arc_1, std::back_inserter(vector_for_intersection_3)); assert(vector_for_intersection_3.size() == 1); - assert(assign(the_pair, vector_for_intersection_3[0])); + assert(assign_variant(the_pair, vector_for_intersection_3[0])); first = the_pair.first; assert(first == arc_1.target()); assert(the_pair.second == 1); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_4; theConstruct_intersect_2(Line_arc_2(Point_2(-10, -5), Point_2(5, 15)), arc_2, std::back_inserter(vector_for_intersection_4)); assert(vector_for_intersection_4.size() == 0); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_5; theConstruct_intersect_2(Line_arc_2(Point_2(10, -5), Point_2(-5, 15)), arc_2, std::back_inserter(vector_for_intersection_5)); assert(vector_for_intersection_5.size() == 1); - assert(assign(the_pair, vector_for_intersection_5[0])); + assert(assign_variant(the_pair, vector_for_intersection_5[0])); assert(the_pair.second == 2); //random @@ -778,31 +793,31 @@ void _test_intersection_Line_arc_Circular_arc(CK ck) false); Circular_arc_point_2 first2; - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_random1; theConstruct_intersect_2(Line_arc_2(Point_2(-p_random1.x(),-p_random1.y()), p_random1), arc_random_1, std::back_inserter(vector_for_intersection_random1)); assert(vector_for_intersection_random1.size() > 0); - assert(assign(the_pair, vector_for_intersection_random1[0])); + assert(assign_variant(the_pair, vector_for_intersection_random1[0])); first = the_pair.first; assert(the_pair.second == 1); assert(first == arc_random_1.source()); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_random2; theConstruct_intersect_2(Line_arc_2(Point_2(-p_random2.x(),-p_random2.y()),p_random2), arc_random_1, std::back_inserter(vector_for_intersection_random2)); assert(vector_for_intersection_random2.size() > 0); - assert(assign(the_pair, vector_for_intersection_random2[0])); + assert(assign_variant(the_pair, vector_for_intersection_random2[0])); first = the_pair.first; assert(the_pair.second == 1); if(vector_for_intersection_random2.size() == 2){ - assert(assign(the_pair, vector_for_intersection_random2[1])); + assert(assign_variant(the_pair, vector_for_intersection_random2[1])); first2 = the_pair.first; assert(the_pair.second == 1); assert((first == arc_random_1.target()) || (first2 == arc_random_1.target())); @@ -825,20 +840,20 @@ void _test_intersection_Line_arc_Circular_arc(CK ck) theRandom.get_int(random_min, random_max)); } while (p_random4 == center_circle_random1 || (p_random3 == p_random4)); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_random3; theConstruct_intersect_2(Line_arc_2(p_random3,p_random4), arc_random_1, std::back_inserter(vector_for_intersection_random3)); for( std::size_t i = 0; i < vector_for_intersection_random3.size(); i++){ - assert(assign(the_pair, vector_for_intersection_random3[i])); + assert(assign_variant(the_pair, vector_for_intersection_random3[i])); first = the_pair.first; - std::vector objects_x_monotone; + std::vector objects_x_monotone; theMake_x_monotone( arc_random_1, std::back_inserter(objects_x_monotone)); bool is_on_arc = false; for(std::size_t j = 0; j < objects_x_monotone.size(); j++){ Circular_arc_2 aux; - assign(aux, objects_x_monotone[j]); + assign_variant(aux, objects_x_monotone[j]); if(CGAL::CircularFunctors::has_on(aux, first)){ is_on_arc = true; break; @@ -860,6 +875,7 @@ void _test_compare_y_to_right(CK ck) typedef CGAL::Line_arc_2 Line_arc_2; typedef CGAL::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Intersect_2 Intersect_2; + typedef std::variant, Line_arc_2> Intersection_result; CGAL::Random generatorOfgenerator; int random_seed = generatorOfgenerator.get_int(0, 123456); @@ -883,13 +899,13 @@ void _test_compare_y_to_right(CK ck) p2_line_diagonal), circle1,true, circle2,false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_1; theConstruct_intersect_2(line_arc_horizontal, line_arc_diagonal, std::back_inserter(vector_for_intersection_1)); std::pair the_pair; - assert(assign(the_pair, vector_for_intersection_1[0])); + assert(assign_variant(the_pair, vector_for_intersection_1[0])); Circular_arc_point_2 first = the_pair.first; assert(CGAL::CircularFunctors::compare_y_to_right(line_arc_horizontal, @@ -934,22 +950,22 @@ void _test_compare_y_to_right(CK ck) part_low, line_arc_horizontal_low.source()) == CGAL::SMALLER); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_2; theConstruct_intersect_2(part_high, line_arc_diagonal, std::back_inserter(vector_for_intersection_2)); - assert(assign(the_pair, vector_for_intersection_2[0])); + assert(assign_variant(the_pair, vector_for_intersection_2[0])); first = the_pair.first; assert(CGAL::CircularFunctors::compare_y_to_right(line_arc_diagonal, part_high, first) == CGAL::LARGER); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_3; theConstruct_intersect_2(part_low, line_arc_diagonal, std::back_inserter(vector_for_intersection_3)); - assert(assign(the_pair, vector_for_intersection_3[0])); + assert(assign_variant(the_pair, vector_for_intersection_3[0])); first = the_pair.first; assert(CGAL::CircularFunctors::compare_y_to_right(line_arc_diagonal, part_low, @@ -959,22 +975,22 @@ void _test_compare_y_to_right(CK ck) p2_line_diagonal2), circle1,true, circle2,false); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_4; theConstruct_intersect_2(part_high, line_arc_diagonal2, std::back_inserter(vector_for_intersection_4)); - assert(assign(the_pair, vector_for_intersection_4[0])); + assert(assign_variant(the_pair, vector_for_intersection_4[0])); first = the_pair.first; assert(CGAL::CircularFunctors::compare_y_to_right(line_arc_diagonal2, part_high, first) == CGAL::SMALLER); - std::vector< CGAL::Object > + std::vector< Intersection_result > vector_for_intersection_5; theConstruct_intersect_2(part_low, line_arc_diagonal2, std::back_inserter(vector_for_intersection_5)); - assert(assign(the_pair, vector_for_intersection_5[0])); + assert(assign_variant(the_pair, vector_for_intersection_5[0])); first = the_pair.first; assert(CGAL::CircularFunctors::compare_y_to_right(line_arc_diagonal2, part_low, diff --git a/Circular_kernel_3/examples/Circular_kernel_3/functor_compare_theta_3.cpp b/Circular_kernel_3/examples/Circular_kernel_3/functor_compare_theta_3.cpp index d318216621fc..439b1a55793f 100644 --- a/Circular_kernel_3/examples/Circular_kernel_3/functor_compare_theta_3.cpp +++ b/Circular_kernel_3/examples/Circular_kernel_3/functor_compare_theta_3.cpp @@ -1,4 +1,5 @@ #include +#include typedef CGAL::Exact_spherical_kernel_3 SK; @@ -15,15 +16,20 @@ int main(){ SK::Intersect_3 inter; //create a functor to compare theta-coordinates on sphere s1 SK::Compare_theta_z_3 cmp(s1); - std::vector< CGAL::Object > intersections; - inter(C1,C2,std::back_inserter(intersections)); + + //unsigned integer indicates multiplicity of intersection point - std::pair p1= - CGAL::object_cast< std::pair >(intersections[0]); - std::pair p2= - CGAL::object_cast< std::pair >(intersections[1]); + typedef std::pair Point_and_multiplicity; + + // only recover points + std::vector< Point_and_multiplicity > intersections; + inter(C1,C2, + CGAL::dispatch_or_drop_output(std::back_inserter(intersections))); + + const Point_and_multiplicity& p1=intersections[0]; + const Point_and_multiplicity& p2=intersections[1]; SK::Circular_arc_point_3 t_extreme[2]; //Compute theta extremal points of circle C1 on sphere s1 diff --git a/Circular_kernel_3/examples/Circular_kernel_3/intersecting_spheres.cpp b/Circular_kernel_3/examples/Circular_kernel_3/intersecting_spheres.cpp index 587e53cbe856..a31eef6daf38 100644 --- a/Circular_kernel_3/examples/Circular_kernel_3/intersecting_spheres.cpp +++ b/Circular_kernel_3/examples/Circular_kernel_3/intersecting_spheres.cpp @@ -1,10 +1,12 @@ #include #include -typedef CGAL::Exact_spherical_kernel_3 Spherical_k; +typedef CGAL::Exact_spherical_kernel_3 SK; -typedef CGAL::Point_3 Point_3; -typedef CGAL::Sphere_3 Sphere_3; +typedef CGAL::Point_3 Point_3; +typedef CGAL::Sphere_3 Sphere_3; +typedef CGAL::Circle_3 Circle_3; +typedef CGAL::Circular_arc_point_3 Circular_arc_point_3; int main() { @@ -33,9 +35,9 @@ int main() { Sphere_3 s2 = Sphere_3(Point_3(x2,y2,z2), r); Sphere_3 s3 = Sphere_3(Point_3(x3,y3,z3), r); - std::vector< CGAL::Object > intersecs; + std::vector< std::variant > > intersecs; CGAL::intersection(s1, s2, s3, std::back_inserter(intersecs)); - if(intersecs.size() > 0) count++; + if(intersecs.size() > 0) ++count; } std::cout << "The approximate probability that 3 spheres with radius 1" diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h index 02da04e08975..9612d2ca5787 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/Intersection_traits.h @@ -167,25 +167,4 @@ struct SK3_Intersection_traits - inline RT - sk3_intersection_return(T&& t) { return RT(std::forward(t)); } - template - inline RT - sk3_intersection_return() { return RT(); } - -} } //end of namespace CGAL::internal - - #endif // CGAL_CIRCULAR_KERNEL_2_INTERSECTION_TRAITS_H diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h index 33e0451fc3f7..56fd4d712ff8 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_circular_arc_3.h @@ -189,8 +189,6 @@ namespace CGAL { const typename SK::Circular_arc_3 & ca, OutputIterator res) { - typedef typename SK3_Intersection_traits::type result_type; typedef typename SK::Circular_arc_point_3 Circular_arc_point_3; typedef std::vector< typename SK3_Intersection_traits::type @@ -198,7 +196,7 @@ namespace CGAL { typedef std::pair Solution; if(SK().has_on_3_object()(p,ca.supporting_circle())) { - *res++ = CGAL::internal::sk3_intersection_return(ca); + *res++ = ca; } solutions_container solutions; @@ -208,14 +206,14 @@ namespace CGAL { if(solutions.size() == 1) { const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(ca,sol.first,true)) - *res++ = CGAL::internal::sk3_intersection_return(sol); + *res++ = sol; } else { const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(ca,sol1.first,true)) - *res++ = CGAL::internal::sk3_intersection_return(sol1); + *res++ = sol1; if(SK().has_on_3_object()(ca,sol2.first,true)) - *res++ = CGAL::internal::sk3_intersection_return(sol2); + *res++ = sol2; } return res; } @@ -261,8 +259,6 @@ namespace CGAL { const typename SK::Circular_arc_3 & a2, OutputIterator res) { - typedef typename SK3_Intersection_traits::type result_type; typedef typename SK::Circular_arc_point_3 Circular_arc_point_3; typedef typename SK::Circular_arc_3 Circular_arc_3; typedef std::vector< typename SK3_Intersection_traits @@ -272,11 +268,11 @@ namespace CGAL { if(non_oriented_equal(a1.supporting_circle(), a2.supporting_circle())) { if(a1.rep().is_full()) { - *res++ = CGAL::internal::sk3_intersection_return(a2); + *res++ = a2; //return res; } else if(a2.rep().is_full()) { - *res++ = CGAL::internal::sk3_intersection_return(a1); + *res++ = a1; //return res; } else { bool t2_in_a1 = SK().has_on_3_object()(a1,a2.target(),true); @@ -289,58 +285,58 @@ namespace CGAL { SK().compare_xyz_3_object()(a1.source(), a2.source()); if(comp < 0) { if(a1.source() == a2.target()) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); } else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a1.source(),a2.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } if(a2.source() == a1.target()) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a2.source(),a1.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } } else if(comp > 0) { if(a2.source() == a1.target()) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a2.source(),a1.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } if(a1.source() == a2.target()) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); } else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a1.source(),a2.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } } else { - *res++ = CGAL::internal::sk3_intersection_return(a1); + *res++ = a1; } } else { - *res++ = CGAL::internal::sk3_intersection_return(a2); + *res++ = a2; } } else if(t2_in_a1) { if(a1.source() == a2.target()) - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a1.source(),1u)); + *res++ = std::make_pair(a1.source(),1u); else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a1.source(),a2.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } //return res; } else if(s2_in_a1) { if(a2.source() == a1.target()) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(a2.source(),1u)); + *res++ = std::make_pair(a2.source(),1u); } else { const Circular_arc_3 & arc = Circular_arc_3(a1.supporting_circle(),a2.source(),a1.target()); - *res++ = CGAL::internal::sk3_intersection_return(arc); + *res++ = arc; } } else if(SK().has_on_3_object()(a2,a1.source(),true)) { - *res++ = CGAL::internal::sk3_intersection_return(a1); + *res++ = a1; } } } else { @@ -353,16 +349,16 @@ namespace CGAL { const Solution& sol=*CGAL::Intersections::internal::intersect_get(solutions[0]); if(SK().has_on_3_object()(a1,sol.first,true) && SK().has_on_3_object()(a2,sol.first,true)) - *res++ = solutions[0]; + *res++ = sol; } else { const Solution& sol1=*CGAL::Intersections::internal::intersect_get(solutions[0]); const Solution& sol2=*CGAL::Intersections::internal::intersect_get(solutions[1]); if(SK().has_on_3_object()(a1,sol1.first,true) && SK().has_on_3_object()(a2,sol1.first,true)) - *res++ = solutions[0]; + *res++ = sol1; if(SK().has_on_3_object()(a1,sol2.first,true) && SK().has_on_3_object()(a2,sol2.first,true)) - *res++ = solutions[1]; + *res++ = sol2; } } return res; diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h index f26063282b15..8491e83d5db6 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_line_arc_3.h @@ -83,7 +83,6 @@ namespace CGAL { typedef typename SK::Circular_arc_point_3 Circular_arc_point_3; typedef typename SK::Line_3 Line_3; typedef typename SK::Line_arc_3 Line_arc_3; - typedef typename SK3_Intersection_traits::type result_type; typename Intersection_traits::result_type o = SK().intersect_3_object()(l1.supporting_line(), @@ -96,7 +95,7 @@ namespace CGAL { Circular_arc_point_3 p = *inters_p; if(!SK().has_on_3_object()(l1,p,true)) return res; if(!SK().has_on_3_object()(l2,p,true)) return res; - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(p,1u)); + *res++ = std::make_pair(p,1u); } else if( CGAL::Intersections::internal::intersect_get(o) ) { if(SK().compare_xyz_3_object()(l1.lower_xyz_extremity(), l2.lower_xyz_extremity()) < 0) { @@ -106,15 +105,15 @@ namespace CGAL { if(comparison < 0) { if(SK().compare_xyz_3_object()(l1.higher_xyz_extremity(), l2.higher_xyz_extremity()) <= 0) { - *res++ = CGAL::internal::sk3_intersection_return - (Line_arc_3(l1.supporting_line(), - l2.lower_xyz_extremity(), - l1.higher_xyz_extremity())); + *res++ = + Line_arc_3(l1.supporting_line(), + l2.lower_xyz_extremity(), + l1.higher_xyz_extremity()); } else { - *res++ = CGAL::internal::sk3_intersection_return(l2); + *res++ = l2; } } else if (comparison == 0) { - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(l2.lower_xyz_extremity(),1u)); + *res++ = std::make_pair(l2.lower_xyz_extremity(),1u); } } else { @@ -124,16 +123,16 @@ namespace CGAL { if(comparison < 0){ if(SK().compare_xyz_3_object()(l1.higher_xyz_extremity(), l2.higher_xyz_extremity()) <= 0) { - *res++ = CGAL::internal::sk3_intersection_return(l1); + *res++ = l1; } else { - *res++ = CGAL::internal::sk3_intersection_return - (Line_arc_3(l1.supporting_line(), - l1.lower_xyz_extremity(), - l2.higher_xyz_extremity() )); + *res++ = + Line_arc_3(l1.supporting_line(), + l1.lower_xyz_extremity(), + l2.higher_xyz_extremity() ); } } else if (comparison == 0){ - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(l1.lower_xyz_extremity(),1u)); + *res++ = std::make_pair(l1.lower_xyz_extremity(),1u); } } } @@ -149,8 +148,6 @@ namespace CGAL { typedef typename SK::Point_3 Point_3; typedef typename SK::Circular_arc_point_3 Circular_arc_point_3; typedef typename SK::Line_3 Line_3; - typedef typename SK::Line_arc_3 Line_arc_3; - typedef typename SK3_Intersection_traits::type result_type; typename Intersection_traits::result_type o = SK().intersect_3_object()(l, la.supporting_line()); @@ -159,11 +156,11 @@ namespace CGAL { return res; if(const Line_3* inters_l = CGAL::Intersections::internal::intersect_get(o)) { - *res++ = CGAL::internal::sk3_intersection_return(la); + *res++ = la; } else if(const Point_3* inters_p = CGAL::Intersections::internal::intersect_get(o)) { Circular_arc_point_3 p = *inters_p; if(!SK().has_on_3_object()(la,p,true)) return res; - *res++ = CGAL::internal::sk3_intersection_return(std::make_pair(p,1u)); + *res++ = std::make_pair(p,1u); } return res; diff --git a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h index f17acf269084..3fb21589539c 100644 --- a/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h +++ b/Circular_kernel_3/include/CGAL/Circular_kernel_3/internal_functions_on_sphere_3.h @@ -202,17 +202,10 @@ namespace CGAL { namespace internal { // we need to pass the result_type, to hack around the fact that // object doesn't support operator=(const T&) and so we keep backwards compatibility - template - struct pair_transform { - RT operator()(const std::pair< typename SK::Root_for_spheres_2_3, unsigned >& p) { - return RT(std::make_pair(typename SK::Circular_arc_point_3(p.first), p.second)); - } - }; - template - struct pair_transform { - CGAL::Object operator()(const std::pair< typename SK::Root_for_spheres_2_3, unsigned >& p) { - return CGAL::make_object(std::make_pair(typename SK::Circular_arc_point_3(p.first), p.second)); + struct pair_transform { + auto operator()(const std::pair< typename SK::Root_for_spheres_2_3, unsigned >& p) { + return std::make_pair(typename SK::Circular_arc_point_3(p.first), p.second); } }; @@ -222,15 +215,15 @@ namespace CGAL { // pair, otherwise just dump the value with conversion to RT // (again: converting to RT before assigning to the Iterator is // just to keep object working) - template + template struct Point_conversion_visitor { Point_conversion_visitor(const OutputIterator& it) : it(it) {} template - OutputIterator operator()(const T& t) { *it++ = RT(t); return it; } + OutputIterator operator()(const T& t) { *it++ = t; return it; } OutputIterator operator()(const typename SK::Point_3& p) { // 2 multiplicities - *it++ = RT(std::make_pair(typename SK::Circular_arc_point_3(p), 2u)); + *it++ = std::make_pair(typename SK::Circular_arc_point_3(p), 2u); return it; } OutputIterator it; @@ -244,8 +237,6 @@ namespace CGAL { const typename SK::Line_3 & l, OutputIterator res) { - typedef typename SK3_Intersection_traits - ::type result_type; typedef typename SK::Algebraic_kernel Algebraic_kernel; typedef typename SK::Polynomial_for_spheres_2_3 Equation_sphere; typedef typename SK::Polynomials_for_line_3 Equation_line; @@ -259,7 +250,7 @@ namespace CGAL { solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } // The special 3 object functions @@ -278,19 +269,18 @@ namespace CGAL { typedef typename SK::Point_3 Point_3; typedef typename SK::Sphere_3 Sphere_3; typedef typename SK::Algebraic_kernel Algebraic_kernel; - typedef typename SK3_Intersection_traits::type result_type; CGAL_kernel_precondition(!s1.is_degenerate()); CGAL_kernel_precondition(!s2.is_degenerate()); CGAL_kernel_precondition(!s3.is_degenerate()); if(non_oriented_equal(s1,s2) && non_oriented_equal(s2,s3)) { - *res++ = result_type(s1); + *res++ = s1; return res; } if(non_oriented_equal(s1,s2)) { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(s1, s3)) { - internal::Point_conversion_visitor visitor(res); + internal::Point_conversion_visitor visitor(res); return std::visit(visitor, *v); } @@ -299,7 +289,7 @@ namespace CGAL { if(non_oriented_equal(s1,s3) || non_oriented_equal(s2,s3)) { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(s1, s2)) { - internal::Point_conversion_visitor visitor(res); + internal::Point_conversion_visitor visitor(res); return std::visit( visitor, *v); @@ -312,13 +302,13 @@ namespace CGAL { if(!v) return res; if(const Point_3* p = CGAL::Intersections::internal::intersect_get(v)) { if(SK().has_on_3_object()(s3, *p)) { - *res++ = result_type(std::make_pair(Circular_arc_point_3(*p),2u)); + *res++ = std::make_pair(Circular_arc_point_3(*p),2u); } return res; } if(const Circle_3* c = CGAL::Intersections::internal::intersect_get(v)) { if(SK().has_on_3_object()(s3, *c)) { - *res++ = result_type(*c); + *res++ = *c; } return res; } @@ -332,7 +322,7 @@ namespace CGAL { algebraic_solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, e3, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } template < class SK, class OutputIterator > @@ -342,8 +332,6 @@ namespace CGAL { const typename SK::Sphere_3 & s2, OutputIterator res) { - typedef typename std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, - typename SK::Circle_3 > result_type; typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomial_for_spheres_2_3 Equation_sphere; typedef typename SK::Polynomial_1_3 Equation_plane; @@ -356,7 +344,7 @@ namespace CGAL { if(non_oriented_equal(s1,s2)) { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p, s1)) { - internal::Point_conversion_visitor visitor(res); + internal::Point_conversion_visitor visitor(res); return std::visit( visitor, *v); @@ -367,7 +355,7 @@ namespace CGAL { if(non_oriented_equal(p,radical_p)) { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p, s1)) { - internal::Point_conversion_visitor visitor(res); + internal::Point_conversion_visitor visitor(res); return std::visit( visitor, *v); @@ -381,7 +369,7 @@ namespace CGAL { algebraic_solutions_container; algebraic_solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, e3, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } template < class SK, class OutputIterator > @@ -391,8 +379,6 @@ namespace CGAL { const typename SK::Sphere_3 & s, OutputIterator res) { - typedef typename std::variant< std::pair< typename SK::Circular_arc_point_3, unsigned int>, - typename SK::Circle_3 > result_type; typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomial_for_spheres_2_3 Equation_sphere; typedef typename SK::Polynomial_1_3 Equation_plane; @@ -405,7 +391,7 @@ namespace CGAL { if(non_oriented_equal(p1,p2)) { if(typename Intersection_traits::result_type v = SK().intersect_3_object()(p1, s)) { - internal::Point_conversion_visitor visitor(res); + internal::Point_conversion_visitor visitor(res); return std::visit( visitor, *v); @@ -419,7 +405,7 @@ namespace CGAL { algebraic_solutions_container; algebraic_solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, e3, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } template < class SK, class OutputIterator > @@ -449,13 +435,9 @@ namespace CGAL { typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomials_for_circle_3 Equation_circle; typedef typename SK::Algebraic_kernel Algebraic_kernel; - typedef typename SK::Circle_3 Circle_3; - - typedef typename SK3_Intersection_traits - ::type result_type; if(non_oriented_equal(c1,c2)) { - *res++ = CGAL::internal::sk3_intersection_return(c1); + *res++ = c1; return res; } Equation_circle e1 = get_equation(c1); @@ -464,7 +446,7 @@ namespace CGAL { algebraic_solutions_container; algebraic_solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } template < class SK, class OutputIterator > @@ -476,10 +458,6 @@ namespace CGAL { typedef typename SK::Root_for_spheres_2_3 Root_for_spheres_2_3; typedef typename SK::Polynomials_for_circle_3 Equation_circle; typedef typename SK::Polynomials_for_line_3 Equation_line; - typedef typename SK::Circle_3 Circle_3; - - typedef typename SK3_Intersection_traits - ::type result_type; typedef typename SK::Algebraic_kernel Algebraic_kernel; CGAL_kernel_precondition(!l.is_degenerate()); @@ -489,7 +467,7 @@ namespace CGAL { algebraic_solutions_container; algebraic_solutions_container solutions; Algebraic_kernel().solve_object()(e1, e2, std::back_inserter(solutions)); - return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); + return std::transform(solutions.begin(), solutions.end(), res, internal::pair_transform()); } // At the moment we dont need those functions diff --git a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_functionalities_on_sphere.h b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_functionalities_on_sphere.h index d02daa9fe8a2..a4ba682726df 100644 --- a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_functionalities_on_sphere.h +++ b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_functionalities_on_sphere.h @@ -66,21 +66,21 @@ void test_normal_circle_monotonicity(const typename SK::Circle_3& circle, const typename SK::Sphere_3& ref_sphere) { typename SK::Is_theta_monotone_3 is_t_mon=SK().is_theta_monotone_3_object(ref_sphere); - std::vector vect_obj; + std::vector>> vect_obj; typename SK::FT zcoord = CGAL::SphericalFunctors::extremal_points_z_coordinate(circle,ref_sphere); //create extremal points of circle SK().intersect_3_object()(circle,typename SK::Plane_3(0,0,1,-zcoord),std::back_inserter(vect_obj)); assert(vect_obj.size()==2); typename SK::Circular_arc_point_3 extrems[2]; - extrems[0]=CGAL::object_cast >(&vect_obj[0])->first; - extrems[1]=CGAL::object_cast >(&vect_obj[1])->first; + extrems[0]=std::get_if >(&vect_obj[0])->first; + extrems[1]=std::get_if >(&vect_obj[1])->first; //create non extremal points on circle vect_obj.clear(); SK().intersect_3_object()(circle,typename SK::Plane_3(0,0,1,-zcoord-typename SK::FT(0.1)),std::back_inserter(vect_obj)); assert(vect_obj.size()==2); typename SK::Circular_arc_point_3 other_pts[2]; - other_pts[0]=CGAL::object_cast >(&vect_obj[0])->first; - other_pts[1]=CGAL::object_cast >(&vect_obj[1])->first; + other_pts[0]=std::get_if >(&vect_obj[0])->first; + other_pts[1]=std::get_if >(&vect_obj[1])->first; //Test Make_theta_monotone+[Ii]s_theta_monotone(_3) on monotone arcs test_make_monotone_an_already_monotone_arc(typename SK::Circular_arc_3(circle,extrems[0],extrems[1]),ref_sphere); @@ -122,18 +122,18 @@ void test_threaded_circle_monotonicity(const typename SK::Circle_3& circle, const typename SK::Sphere_3& ref_sphere) { typename SK::Is_theta_monotone_3 is_t_mon=SK().is_theta_monotone_3_object(ref_sphere); - std::vector vect_obj; + std::vector>> vect_obj; SK().intersect_3_object()(circle,typename SK::Plane_3(1,0,0,-ref_sphere.center().x()),std::back_inserter(vect_obj)); assert(vect_obj.size()==2); typename SK::Circular_arc_point_3 pts1[2]; - pts1[0]=CGAL::object_cast >(&vect_obj[0])->first; - pts1[1]=CGAL::object_cast >(&vect_obj[1])->first; + pts1[0]=std::get_if >(&vect_obj[0])->first; + pts1[1]=std::get_if >(&vect_obj[1])->first; vect_obj.clear(); SK().intersect_3_object()(circle,typename SK::Plane_3(1,1,0,-ref_sphere.center().x()-ref_sphere.center().y()),std::back_inserter(vect_obj)); assert(vect_obj.size()==2); typename SK::Circular_arc_point_3 pts2[2]; - pts2[0]=CGAL::object_cast >(&vect_obj[0])->first; - pts2[1]=CGAL::object_cast >(&vect_obj[1])->first; + pts2[0]=std::get_if >(&vect_obj[0])->first; + pts2[1]=std::get_if >(&vect_obj[1])->first; //assertions test_make_monotone_an_already_monotone_arc(typename SK::Circular_arc_3(circle,pts1[0],pts1[1]),ref_sphere); test_make_monotone_an_already_monotone_arc(typename SK::Circular_arc_3(circle,pts2[0],pts2[1]),ref_sphere); @@ -154,12 +154,12 @@ void test_polar_circle_monotonicity(const typename SK::Circle_3& circle, const typename SK::Sphere_3& ref_sphere) { typename SK::Is_theta_monotone_3 is_t_mon=SK().is_theta_monotone_3_object(ref_sphere); - std::vector vect_obj; + std::vector>> vect_obj; SK().intersect_3_object()(circle,typename SK::Plane_3(0,0,1,-circle.center().z()),std::back_inserter(vect_obj)); assert(vect_obj.size()==2); typename SK::Circular_arc_point_3 pts[2]; - pts[0]=CGAL::object_cast >(&vect_obj[0])->first; - pts[1]=CGAL::object_cast >(&vect_obj[1])->first; + pts[0]=std::get_if >(&vect_obj[0])->first; + pts[1]=std::get_if >(&vect_obj[1])->first; @@ -262,11 +262,11 @@ void fill_intersections(const typename SK::Circle_3& circle, typename SK::Circular_arc_point_3* inters,unsigned i) { typename SK::Plane_3 meridians=get_meridians(i,ref.center()); - std::vector objs; + std::vector>> objs; SK().intersect_3_object()(circle,meridians,std::back_inserter(objs)); assert(objs.size()==2); - inters[get_num(i,0)]=CGAL::object_cast >(&objs[0])->first; - inters[get_num(i,1)]=CGAL::object_cast >(&objs[1])->first; + inters[get_num(i,0)]=std::get_if >(&objs[0])->first; + inters[get_num(i,1)]=std::get_if >(&objs[1])->first; } @@ -316,7 +316,7 @@ void test_extremal_points(const typename SK::Circle_3& circle, const typename SK::Circular_arc_point_3& inter2=cut_by_M0?xtrms[0]:xtrms[1]; typename SK::Intersect_3 func=SK().intersect_3_object(); - std::vector intersections; + std::vector>> intersections; std::pair vect_pair=get_bounding_vectors(inter1,ref_sphere); func(circle,typename SK::Plane_3(ref_sphere.center(),ref_sphere.center()+typename SK::Vector_3(0,0,1),ref_sphere.center()+vect_pair.first),std::back_inserter(intersections)); @@ -391,11 +391,11 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher assert( cmp_theta(y_xtrems[0],y_xtrems[1])==CGAL::LARGER ); typename SK::FT zcoord=CGAL::SphericalFunctors::extremal_points_z_coordinate(normal_cut_M0,ref_sphere); - CGAL::Object objs[2]; + std::variant> objs[2]; SK().intersect_3_object()(normal_cut_M0,typename SK::Plane_3(0,0,1,-zcoord),objs); typename SK::Circular_arc_point_3 xtrms[2]; - xtrms[0]=CGAL::object_cast >(&objs[0])->first; - xtrms[1]=CGAL::object_cast >(&objs[1])->first; + xtrms[0]=std::get_if >(&objs[0])->first; + xtrms[1]=std::get_if >(&objs[1])->first; assert( cmp_theta(xtrms[0],xtrms[1])==CGAL::LARGER ); assert( cmp_theta(xtrms[0],y_xtrems[0])==CGAL::SMALLER ); @@ -440,11 +440,11 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher //polar circle typename SK::Line_3 line_n(ref_sphere_center,north_polar.center()-ref_sphere_center); typename SK::Line_3 line_s(ref_sphere_center,south_polar.center()-ref_sphere_center); - CGAL::Object objs[2]; + std::variant> objs[2]; SK().intersect_3_object()(line_n,ref_sphere,objs); - typename SK::Circular_arc_point_3 cn=CGAL::object_cast >(&objs[1])->first; + typename SK::Circular_arc_point_3 cn=std::get_if >(&objs[1])->first; SK().intersect_3_object()(line_s,ref_sphere,objs); - typename SK::Circular_arc_point_3 cs=CGAL::object_cast >(&objs[1])->first; + typename SK::Circular_arc_point_3 cs=std::get_if >(&objs[1])->first; assert (cmp_z_at_theta(cn,typename SK::Circular_arc_3(north_polar,north_pole))==CGAL::LARGER ); assert (cmp_z_at_theta(cs,typename SK::Circular_arc_3(north_polar,north_pole))==CGAL::SMALLER ); @@ -472,9 +472,9 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher typename SK::Line_3 line_1(ref_sphere_center,normal1.center()-ref_sphere_center); typename SK::Line_3 line_2(ref_sphere_center,normal2.center()-ref_sphere_center); SK().intersect_3_object()(line_1,ref_sphere,objs); - typename SK::Circular_arc_point_3 c1=CGAL::object_cast >(&objs[1])->first; + typename SK::Circular_arc_point_3 c1=std::get_if >(&objs[1])->first; SK().intersect_3_object()(line_2,ref_sphere,objs); - typename SK::Circular_arc_point_3 c2=CGAL::object_cast >(&objs[1])->first; + typename SK::Circular_arc_point_3 c2=std::get_if >(&objs[1])->first; typename SK::Circular_arc_point_3 xtrms1[2]; typename SK::Circular_arc_point_3 xtrms2[2]; @@ -541,10 +541,10 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher //normal vs normal typename SK::Circle_3 normal3 (ref_sphere,typename SK::Plane_3(0.08,1.1,0.9 ,-1-FT(0.08)*ref_sphere_center.x() -FT(1.1)*ref_sphere_center.y()-FT(0.9)*ref_sphere_center.z())); typename SK::Circle_3 normal4 (ref_sphere,typename SK::Plane_3(0.05,1.1,-0.9 ,-1-FT(0.05)*ref_sphere_center.x() -FT(1.1)*ref_sphere_center.y()+FT(0.9)*ref_sphere_center.z())); - std::vector objs; + std::vector>> objs; SK().intersect_3_object()(normal3,normal4,std::back_inserter(objs)); - typename SK::Circular_arc_point_3 int1=CGAL::object_cast >(&objs[1])->first; - typename SK::Circular_arc_point_3 int2=CGAL::object_cast >(&objs[0])->first; + typename SK::Circular_arc_point_3 int1=std::get_if >(&objs[1])->first; + typename SK::Circular_arc_point_3 int2=std::get_if >(&objs[0])->first; typename SK::Circular_arc_point_3 xtrms3[2]; typename SK::Circular_arc_point_3 xtrms4[2]; CGAL::theta_extremal_points(normal3,ref_sphere,xtrms3); @@ -554,8 +554,8 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher //normal vs threaded objs.clear(); SK().intersect_3_object()(threaded,normal4,std::back_inserter(objs)); - int1=CGAL::object_cast >(&objs[1])->first; - int2=CGAL::object_cast >(&objs[0])->first; + int1=std::get_if >(&objs[1])->first; + int2=std::get_if >(&objs[0])->first; assert ( cmp_right(typename SK::Circular_arc_3(threaded),typename SK::Circular_arc_3(normal4,xtrms4[1],xtrms4[0]),int1)==CGAL::SMALLER ); assert ( cmp_right(typename SK::Circular_arc_3(threaded),typename SK::Circular_arc_3(normal4,xtrms4[1],xtrms4[0]),int2)==CGAL::LARGER ); //normal vs polar @@ -563,8 +563,8 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher typename SK::Circular_arc_point_3 xtrms2[2]; CGAL::theta_extremal_points(normal2,ref_sphere,xtrms2); SK().intersect_3_object()(south_polar,normal2,std::back_inserter(objs)); - int1=CGAL::object_cast >(&objs[1])->first; - int2=CGAL::object_cast >(&objs[0])->first; + int1=std::get_if >(&objs[1])->first; + int2=std::get_if >(&objs[0])->first; assert ( cmp_right(typename SK::Circular_arc_3(south_polar,south_pole),typename SK::Circular_arc_3(normal2,xtrms2[0],xtrms2[1]),int1)==CGAL::LARGER ); assert ( cmp_right(typename SK::Circular_arc_3(south_polar,south_pole),typename SK::Circular_arc_3(normal2,xtrms2[0],xtrms2[1]),int2)==CGAL::SMALLER ); //polar vs polar @@ -574,15 +574,15 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher assert(CGAL::classify(spolar,ref_sphere)==CGAL::POLAR); objs.clear(); SK().intersect_3_object()(npolar,spolar,std::back_inserter(objs)); - int1=CGAL::object_cast >(&objs[1])->first; - int2=CGAL::object_cast >(&objs[0])->first; + int1=std::get_if >(&objs[1])->first; + int2=std::get_if >(&objs[0])->first; assert ( cmp_right(typename SK::Circular_arc_3(npolar,north_pole),typename SK::Circular_arc_3(spolar,south_pole),int1)==CGAL::SMALLER ); assert ( cmp_right(typename SK::Circular_arc_3(npolar,north_pole),typename SK::Circular_arc_3(spolar,south_pole),int2)==CGAL::LARGER ); //polar vs threaded objs.clear(); SK().intersect_3_object()(south_polar,threaded,std::back_inserter(objs)); - int1=CGAL::object_cast >(&objs[1])->first; - int2=CGAL::object_cast >(&objs[0])->first; + int1=std::get_if >(&objs[1])->first; + int2=std::get_if >(&objs[0])->first; assert ( cmp_right(typename SK::Circular_arc_3(south_polar,south_pole),typename SK::Circular_arc_3(threaded),int1)==CGAL::LARGER ); assert ( cmp_right(typename SK::Circular_arc_3(south_polar,south_pole),typename SK::Circular_arc_3(threaded),int2)==CGAL::SMALLER ); //threaded vs threaded @@ -590,8 +590,8 @@ test_functionalities_on_a_reference_sphere(const typename SK::Point_3& ref_spher typename SK::Circle_3 threaded2 (ref_sphere,typename SK::Plane_3(0,1.1,-0.9,-FT(1.1)*ref_sphere_center.y()+FT(0.9)*ref_sphere_center.z())); objs.clear(); SK().intersect_3_object()(threaded1,threaded2,std::back_inserter(objs)); - int1=CGAL::object_cast >(&objs[1])->first; - int2=CGAL::object_cast >(&objs[0])->first; + int1=std::get_if >(&objs[1])->first; + int2=std::get_if >(&objs[0])->first; assert ( cmp_right(typename SK::Circular_arc_3(threaded1),typename SK::Circular_arc_3(threaded2),int1)==CGAL::SMALLER ); assert ( cmp_right(typename SK::Circular_arc_3(threaded1),typename SK::Circular_arc_3(threaded2),int2)==CGAL::LARGER ); //tangency tests global diff --git a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_constructions.h b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_constructions.h index 363d4b2087b1..cac9217e3711 100644 --- a/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_constructions.h +++ b/Circular_kernel_3/test/Circular_kernel_3/include/CGAL/_test_sphere_constructions.h @@ -15,6 +15,31 @@ #include #include +#include +#include + +template +bool assign_variant(Expected& e, const V& v) +{ + if (std::get_if(&v) != nullptr) + { + e = std::get(v); + return true; + } + return false; +} + +template +bool assign_variant(Expected& e, const std::optional& ov) +{ + if (ov==std::nullopt) return false; + if (std::get_if(&(ov.value())) != nullptr) + { + e = std::get(ov.value()); + return true; + } + return false; +} template void _test_circular_arc_point_construct(SK sk) { @@ -547,7 +572,7 @@ void _test_intersection_construct(SK sk) { const FT z = FT(vz); Line_3 l1 = theConstruct_line_3(Point_3(-1,0,0), Point_3(x,y,z)); Line_3 l2 = theConstruct_line_3(Point_3(FT(-1)-FT(FT(1) / FT(1000000)),FT(0),FT(0)), Point_3(x,y,z)); - std::vector< CGAL::Object > intersection_1, intersection_2; + std::vector< std::variant< std::pair > > intersection_1, intersection_2; theIntersect_3(s, l1, std::back_inserter(intersection_1)); theIntersect_3(s, l2, std::back_inserter(intersection_2)); @@ -557,7 +582,7 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s, l1)); assert(intersection_1.size() == 1); std::pair the_pair1; - assert(assign(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair1, intersection_1[0])); assert(theHas_on_3(s,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); @@ -572,8 +597,8 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s, l1)); std::pair the_pair1; std::pair the_pair2; - assert(assign(the_pair1, intersection_1[0])); - assert(assign(the_pair2, intersection_1[1])); + assert(assign_variant(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair2, intersection_1[1])); assert(theHas_on_3(s,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); assert(theHas_on_3(s,the_pair2.first)); @@ -583,8 +608,8 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s, l2)); std::pair the_pair3; std::pair the_pair4; - assert(assign(the_pair3, intersection_2[0])); - assert(assign(the_pair4, intersection_2[1])); + assert(assign_variant(the_pair3, intersection_2[0])); + assert(assign_variant(the_pair4, intersection_2[1])); assert(theHas_on_3(s,the_pair3.first)); assert(theHas_on_3(l2,the_pair3.first)); assert(theHas_on_3(s,the_pair4.first)); @@ -604,7 +629,7 @@ void _test_intersection_construct(SK sk) { const FT z = FT(vz); Line_3 l1 = theConstruct_line_3(Point_3(-1,0,0), Point_3(x,y,z)); Line_3 l2 = theConstruct_line_3(Point_3(FT(-1)-FT(FT(1) / FT(1000000)),FT(0),FT(0)), Point_3(x,y,z)); - std::vector< CGAL::Object > intersection_1, intersection_2; + std::vector< std::variant< std::pair > > intersection_1, intersection_2; intersection(s, l1, std::back_inserter(intersection_1)); intersection(s, l2, std::back_inserter(intersection_2)); @@ -614,7 +639,7 @@ void _test_intersection_construct(SK sk) { assert(do_intersect(s, l1)); assert(intersection_1.size() == 1); std::pair the_pair1; - assert(assign(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair1, intersection_1[0])); assert(theHas_on_3(s,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); @@ -629,8 +654,8 @@ void _test_intersection_construct(SK sk) { assert(do_intersect(s, l1)); std::pair the_pair1; std::pair the_pair2; - assert(assign(the_pair1, intersection_1[0])); - assert(assign(the_pair2, intersection_1[1])); + assert(assign_variant(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair2, intersection_1[1])); assert(theHas_on_3(s,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); assert(theHas_on_3(s,the_pair2.first)); @@ -640,8 +665,8 @@ void _test_intersection_construct(SK sk) { assert(do_intersect(s, l2)); std::pair the_pair3; std::pair the_pair4; - assert(assign(the_pair3, intersection_2[0])); - assert(assign(the_pair4, intersection_2[1])); + assert(assign_variant(the_pair3, intersection_2[0])); + assert(assign_variant(the_pair4, intersection_2[1])); assert(theHas_on_3(s,the_pair3.first)); assert(theHas_on_3(l2,the_pair3.first)); assert(theHas_on_3(s,the_pair4.first)); @@ -665,20 +690,20 @@ void _test_intersection_construct(SK sk) { const FT r = 4*FT(vr) / FT(2); Sphere_3 sl = theConstruct_sphere_3( Polynomial_for_spheres_2_3(x,y,z,r*r)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant > > intersection_1; + std::vector< std::variant > > intersection_2; theIntersect_3(s1, s2, sl, std::back_inserter(intersection_1)); theIntersect_3(s1, s3, sl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(theDo_intersect_3(s1, s2, sl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s2,circle)); assert(theHas_on_3(sl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { // This case must never happen assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s2,cap.first)); @@ -688,8 +713,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(theDo_intersect_3(s1, s2, sl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s2,cap1.first)); assert(theHas_on_3(sl,cap1.first)); @@ -702,13 +727,13 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s1, s3, sl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { // This case must never happen assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s3,circle)); assert(theHas_on_3(sl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s3,cap.first)); assert(theHas_on_3(sl,cap.first)); @@ -718,8 +743,8 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s1, s3, sl)); // This case must never happen std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s3,cap1.first)); assert(theHas_on_3(sl,cap1.first)); @@ -743,20 +768,20 @@ void _test_intersection_construct(SK sk) { const FT r = 4*FT(vr) / FT(2); Sphere_3 sl = theConstruct_sphere_3( Polynomial_for_spheres_2_3(x,y,z,r*r)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3, Sphere_3> > intersection_1; + std::vector< std::variant , Circle_3, Sphere_3> > intersection_2; intersection(s1, s2, sl, std::back_inserter(intersection_1)); intersection(s1, s3, sl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(CGAL::do_intersect(s1, s2, sl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s2,circle)); assert(theHas_on_3(sl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { // This case must never happen assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s2,cap.first)); @@ -766,8 +791,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(CGAL::do_intersect(s1, s2, sl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s2,cap1.first)); assert(theHas_on_3(sl,cap1.first)); @@ -780,13 +805,13 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(s1, s3, sl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { // This case must never happen assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s3,circle)); assert(theHas_on_3(sl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s3,cap.first)); assert(theHas_on_3(sl,cap.first)); @@ -796,8 +821,8 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(s1, s3, sl)); // This case must never happen std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s3,cap1.first)); assert(theHas_on_3(sl,cap1.first)); @@ -823,20 +848,20 @@ void _test_intersection_construct(SK sk) { if(a == 0 && b == 0 && c == 0) continue; Plane_3 pl = theConstruct_plane_3( Polynomial_1_3(a,b,c,d)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_1; + std::vector< std::variant , Circle_3> > intersection_2; theIntersect_3(s1, s2, pl, std::back_inserter(intersection_1)); theIntersect_3(s1, s3, pl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(theDo_intersect_3(s1, s2, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s2,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s2,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -845,8 +870,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(theDo_intersect_3(s1, s2, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s2,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -858,12 +883,12 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s1, s3, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s3,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s3,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -872,8 +897,8 @@ void _test_intersection_construct(SK sk) { if(intersection_2.size() == 2) { assert(theDo_intersect_3(s1, s3, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s3,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -898,20 +923,20 @@ void _test_intersection_construct(SK sk) { if(a == 0 && b == 0 && c == 0) continue; Plane_3 pl = theConstruct_plane_3( Polynomial_1_3(a,b,c,d)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_1; + std::vector< std::variant , Circle_3> > intersection_2; intersection(s1, s2, pl, std::back_inserter(intersection_1)); intersection(s1, s3, pl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(CGAL::do_intersect(s1, s2, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s2,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s2,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -920,8 +945,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(CGAL::do_intersect(s1, s2, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s2,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -933,12 +958,12 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(s1, s3, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(s3,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(s3,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -947,8 +972,8 @@ void _test_intersection_construct(SK sk) { if(intersection_2.size() == 2) { assert(CGAL::do_intersect(s1, s3, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(s3,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -976,20 +1001,20 @@ void _test_intersection_construct(SK sk) { if(a == 0 && b == 0 && c == 0) continue; Plane_3 pl = theConstruct_plane_3( Polynomial_1_3(a,b,c,d)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_1; + std::vector< std::variant , Circle_3> > intersection_2; theIntersect_3(s1, p1, pl, std::back_inserter(intersection_1)); theIntersect_3(s1, p2, pl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(theDo_intersect_3(s1, p1, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(p1,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(p1,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -998,8 +1023,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(theDo_intersect_3(s1, p1, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(p1,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -1011,12 +1036,12 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(s1, p2, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(p2,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(p2,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -1025,8 +1050,8 @@ void _test_intersection_construct(SK sk) { if(intersection_2.size() == 2) { assert(theDo_intersect_3(s1, p2, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(p2,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -1051,20 +1076,20 @@ void _test_intersection_construct(SK sk) { if(a == 0 && b == 0 && c == 0) continue; Plane_3 pl = theConstruct_plane_3( Polynomial_1_3(a,b,c,d)); - std::vector< CGAL::Object > intersection_1; - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_1; + std::vector< std::variant , Circle_3> > intersection_2; intersection(s1, p1, pl, std::back_inserter(intersection_1)); intersection(s1, p2, pl, std::back_inserter(intersection_2)); if(intersection_1.size() == 1) { assert(CGAL::do_intersect(s1, p1, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_1[0])) { + if(assign_variant(circle,intersection_1[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(p1,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_1[0])) { + if(assign_variant(cap,intersection_1[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(p1,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -1073,8 +1098,8 @@ void _test_intersection_construct(SK sk) { if(intersection_1.size() == 2) { assert(CGAL::do_intersect(s1, p1, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_1[0])); - assert(assign(cap2,intersection_1[1])); + assert(assign_variant(cap1,intersection_1[0])); + assert(assign_variant(cap2,intersection_1[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(p1,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -1086,12 +1111,12 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(s1, p2, pl)); Circle_3 circle; std::pair cap; - if(assign(circle,intersection_2[0])) { + if(assign_variant(circle,intersection_2[0])) { assert(theHas_on_3(s1,circle)); assert(theHas_on_3(p2,circle)); assert(theHas_on_3(pl,circle)); } - if(assign(cap,intersection_2[0])) { + if(assign_variant(cap,intersection_2[0])) { assert(theHas_on_3(s1,cap.first)); assert(theHas_on_3(p2,cap.first)); assert(theHas_on_3(pl,cap.first)); @@ -1100,8 +1125,8 @@ void _test_intersection_construct(SK sk) { if(intersection_2.size() == 2) { assert(CGAL::do_intersect(s1, p2, pl)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(s1,cap1.first)); assert(theHas_on_3(p2,cap1.first)); assert(theHas_on_3(pl,cap1.first)); @@ -1134,27 +1159,27 @@ void _test_intersection_construct(SK sk) { Circle_3 c2 = theConstruct_circle_3(std::make_pair(es2, pol)); Circle_3 c3 = theConstruct_circle_3(std::make_pair(es3, pol)); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant , Circle_3> > intersection_1; theIntersect_3(c1, c1, std::back_inserter(intersection_1)); assert(intersection_1.size() == 1); assert(theDo_intersect_3(c1, c1)); Circle_3 circle; - assert(assign(circle,intersection_1[0])); + assert(assign_variant(circle,intersection_1[0])); assert(circle == c1); - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_2; theIntersect_3(c1, c2, std::back_inserter(intersection_2)); assert(intersection_2.size() == 2); assert(theDo_intersect_3(c1, c2)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c2,cap1.first)); assert(theHas_on_3(c1,cap2.first)); assert(theHas_on_3(c2,cap2.first)); - std::vector< CGAL::Object > intersection_3; + std::vector< std::variant , Circle_3> > intersection_3; theIntersect_3(c1, c3, std::back_inserter(intersection_3)); if(a != 0) { assert(!theDo_intersect_3(c1, c3)); @@ -1163,7 +1188,7 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(c1, c3)); assert(intersection_3.size() == 1); std::pair cap; - assert(assign(cap,intersection_3[0])); + assert(assign_variant(cap,intersection_3[0])); assert(theHas_on_3(c1,cap.first)); assert(theHas_on_3(c3,cap.first)); } @@ -1175,12 +1200,12 @@ void _test_intersection_construct(SK sk) { const FT dl = 0; Polynomial_1_3 pol2 = Polynomial_1_3(al,bl,cl,dl); Circle_3 c4 = theConstruct_circle_3(std::make_pair(es1, pol2)); - std::vector< CGAL::Object > intersection_4; + std::vector< std::variant , Circle_3> > intersection_4; theIntersect_3(c1, c4, std::back_inserter(intersection_4)); assert(theDo_intersect_3(c1, c4)); assert(intersection_4.size() == 2); - assert(assign(cap1,intersection_4[0])); - assert(assign(cap2,intersection_4[1])); + assert(assign_variant(cap1,intersection_4[0])); + assert(assign_variant(cap2,intersection_4[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c4,cap1.first)); assert(theHas_on_3(c1,cap2.first)); @@ -1193,12 +1218,12 @@ void _test_intersection_construct(SK sk) { const FT d_c = -FT(va) / FT(10); Polynomial_1_3 pol2 = Polynomial_1_3(a_c,b_c,c_c,d_c); Circle_3 c5 = theConstruct_circle_3(std::make_pair(es2, pol2)); - std::vector< CGAL::Object > intersection_5; + std::vector< std::variant , Circle_3> > intersection_5; theIntersect_3(c1, c5, std::back_inserter(intersection_5)); assert(theDo_intersect_3(c1, c5)); assert(intersection_5.size() == 2); - assert(assign(cap1,intersection_5[0])); - assert(assign(cap2,intersection_5[1])); + assert(assign_variant(cap1,intersection_5[0])); + assert(assign_variant(cap2,intersection_5[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c5,cap1.first)); assert(theHas_on_3(c1,cap2.first)); @@ -1217,27 +1242,27 @@ void _test_intersection_construct(SK sk) { Circle_3 c2 = theConstruct_circle_3(std::make_pair(es2, pol)); Circle_3 c3 = theConstruct_circle_3(std::make_pair(es3, pol)); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant , Circle_3> > intersection_1; intersection(c1, c1, std::back_inserter(intersection_1)); assert(intersection_1.size() == 1); assert(CGAL::do_intersect(c1, c1)); Circle_3 circle; - assert(assign(circle,intersection_1[0])); + assert(assign_variant(circle,intersection_1[0])); assert(circle == c1); - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant , Circle_3> > intersection_2; intersection(c1, c2, std::back_inserter(intersection_2)); assert(intersection_2.size() == 2); assert(CGAL::do_intersect(c1, c2)); std::pair cap1, cap2; - assert(assign(cap1,intersection_2[0])); - assert(assign(cap2,intersection_2[1])); + assert(assign_variant(cap1,intersection_2[0])); + assert(assign_variant(cap2,intersection_2[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c2,cap1.first)); assert(theHas_on_3(c1,cap2.first)); assert(theHas_on_3(c2,cap2.first)); - std::vector< CGAL::Object > intersection_3; + std::vector< std::variant , Circle_3> > intersection_3; intersection(c1, c3, std::back_inserter(intersection_3)); if(a != 0) { assert(!do_intersect(c1, c3)); @@ -1246,7 +1271,7 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(c1, c3)); assert(intersection_3.size() == 1); std::pair cap; - assert(assign(cap,intersection_3[0])); + assert(assign_variant(cap,intersection_3[0])); assert(theHas_on_3(c1,cap.first)); assert(theHas_on_3(c3,cap.first)); } @@ -1258,12 +1283,12 @@ void _test_intersection_construct(SK sk) { const FT dl = 0; Polynomial_1_3 pol2 = Polynomial_1_3(al,bl,cl,dl); Circle_3 c4 = theConstruct_circle_3(std::make_pair(es1, pol2)); - std::vector< CGAL::Object > intersection_4; + std::vector< std::variant , Circle_3> > intersection_4; intersection(c1, c4, std::back_inserter(intersection_4)); assert(CGAL::do_intersect(c1, c4)); assert(intersection_4.size() == 2); - assert(assign(cap1,intersection_4[0])); - assert(assign(cap2,intersection_4[1])); + assert(assign_variant(cap1,intersection_4[0])); + assert(assign_variant(cap2,intersection_4[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c4,cap1.first)); assert(theHas_on_3(c1,cap2.first)); @@ -1276,12 +1301,12 @@ void _test_intersection_construct(SK sk) { const FT d_c = -FT(va) / FT(10); Polynomial_1_3 pol2 = Polynomial_1_3(a_c,b_c,c_c,d_c); Circle_3 c5 = theConstruct_circle_3(std::make_pair(es2, pol2)); - std::vector< CGAL::Object > intersection_5; + std::vector< std::variant , Circle_3> > intersection_5; intersection(c1, c5, std::back_inserter(intersection_5)); assert(CGAL::do_intersect(c1, c5)); assert(intersection_5.size() == 2); - assert(assign(cap1,intersection_5[0])); - assert(assign(cap2,intersection_5[1])); + assert(assign_variant(cap1,intersection_5[0])); + assert(assign_variant(cap2,intersection_5[1])); assert(theHas_on_3(c1,cap1.first)); assert(theHas_on_3(c5,cap1.first)); assert(theHas_on_3(c1,cap2.first)); @@ -1310,7 +1335,7 @@ void _test_intersection_construct(SK sk) { Circle_3 c1 = theConstruct_circle_3(std::make_pair(pol_s, pol_pl1)); Circle_3 c2 = theConstruct_circle_3(std::make_pair(pol_s, pol_pl2)); - std::vector< CGAL::Object > intersection_1, intersection_2; + std::vector< std::variant > > intersection_1, intersection_2; theIntersect_3(c1, l1, std::back_inserter(intersection_1)); theIntersect_3(c2, l2, std::back_inserter(intersection_2)); @@ -1320,7 +1345,7 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(c1, l1)); assert(intersection_1.size() == 1); std::pair the_pair1; - assert(assign(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair1, intersection_1[0])); assert(theHas_on_3(c1,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); @@ -1336,8 +1361,8 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(c1, l1)); std::pair the_pair1; std::pair the_pair2; - assert(assign(the_pair1, intersection_1[0])); - assert(assign(the_pair2, intersection_1[1])); + assert(assign_variant(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair2, intersection_1[1])); assert(theHas_on_3(c1,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); assert(theHas_on_3(c1,the_pair2.first)); @@ -1347,8 +1372,8 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(c2, l2)); std::pair the_pair3; std::pair the_pair4; - assert(assign(the_pair3, intersection_2[0])); - assert(assign(the_pair4, intersection_2[1])); + assert(assign_variant(the_pair3, intersection_2[0])); + assert(assign_variant(the_pair4, intersection_2[1])); assert(theHas_on_3(c2,the_pair3.first)); assert(theHas_on_3(l2,the_pair3.first)); assert(theHas_on_3(c2,the_pair4.first)); @@ -1378,7 +1403,7 @@ void _test_intersection_construct(SK sk) { Circle_3 c1 = theConstruct_circle_3(std::make_pair(pol_s, pol_pl1)); Circle_3 c2 = theConstruct_circle_3(std::make_pair(pol_s, pol_pl2)); - std::vector< CGAL::Object > intersection_1, intersection_2; + std::vector< std::variant > > intersection_1, intersection_2; intersection(c1, l1, std::back_inserter(intersection_1)); intersection(c2, l2, std::back_inserter(intersection_2)); @@ -1388,7 +1413,7 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(c1, l1)); assert(intersection_1.size() == 1); std::pair the_pair1; - assert(assign(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair1, intersection_1[0])); assert(theHas_on_3(c1,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); @@ -1404,8 +1429,8 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(c1, l1)); std::pair the_pair1; std::pair the_pair2; - assert(assign(the_pair1, intersection_1[0])); - assert(assign(the_pair2, intersection_1[1])); + assert(assign_variant(the_pair1, intersection_1[0])); + assert(assign_variant(the_pair2, intersection_1[1])); assert(theHas_on_3(c1,the_pair1.first)); assert(theHas_on_3(l1,the_pair1.first)); assert(theHas_on_3(c1,the_pair2.first)); @@ -1415,8 +1440,8 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(c2, l2)); std::pair the_pair3; std::pair the_pair4; - assert(assign(the_pair3, intersection_2[0])); - assert(assign(the_pair4, intersection_2[1])); + assert(assign_variant(the_pair3, intersection_2[0])); + assert(assign_variant(the_pair4, intersection_2[1])); assert(theHas_on_3(c2,the_pair3.first)); assert(theHas_on_3(l2,the_pair3.first)); assert(theHas_on_3(c2,the_pair4.first)); @@ -1444,13 +1469,13 @@ void _test_intersection_construct(SK sk) { for(int t4=t3+1;t4<3;t4++) { Point_3 targetl = Point_3(a*t4,b*t4,c*t4); Line_arc_3 lb = theConstruct_line_arc_3(l,sourcel,targetl); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; theIntersect_3(la, lb, std::back_inserter(intersection_1)); if(t1 == t3) { Line_arc_3 line_a; assert(theDo_intersect_3(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t2 <= t4) { assert(theEqual_3(line_a, la)); } else { @@ -1460,7 +1485,7 @@ void _test_intersection_construct(SK sk) { Line_arc_3 line_a; assert(theDo_intersect_3(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t1 > t3) { assert(theEqual_3(line_a, la)); } else { @@ -1471,14 +1496,14 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(la, lb)); std::pair pair; assert(intersection_1.size() == 1); - assert(assign(pair, intersection_1[0])); + assert(assign_variant(pair, intersection_1[0])); if(t2 == t3) assert(theEqual_3(pair.first,target)); if(t1 == t4) assert(theEqual_3(pair.first,source)); } else if((t1 < t3) && (t3 < t2 )) { Line_arc_3 line_a; assert(theDo_intersect_3(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t2 < t4) { Line_arc_3 line_b; line_b = theConstruct_line_arc_3(l,sourcel,target); @@ -1490,7 +1515,7 @@ void _test_intersection_construct(SK sk) { Line_arc_3 line_a; assert(intersection_1.size() == 1); assert(theDo_intersect_3(la, lb)); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t4 < t2) { Line_arc_3 line_b; line_b = theConstruct_line_arc_3(l,source,targetl); @@ -1562,7 +1587,7 @@ void _test_intersection_construct(SK sk) { int n_of_intersection = 0; for(int j=0;j<6;j++) { if(i == j) continue; - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; theIntersect_3(l[i], l[j], std::back_inserter(intersection_1)); assert((intersection_1.size() == 0) || (intersection_1.size() == 1)); @@ -1570,7 +1595,7 @@ void _test_intersection_construct(SK sk) { assert(theDo_intersect_3(l[i], l[j])); n_of_intersection++; std::pair pair; - assert(assign(pair, intersection_1[0])); + assert(assign_variant(pair, intersection_1[0])); assert(theHas_on_3(l[i],pair.first)); assert(theHas_on_3(l[j],pair.first)); int n_of_edges = 2; @@ -1611,13 +1636,13 @@ void _test_intersection_construct(SK sk) { for(int t4=t3+1;t4<3;t4++) { Point_3 targetl = Point_3(a*t4,b*t4,c*t4); Line_arc_3 lb = theConstruct_line_arc_3(l,sourcel,targetl); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; intersection(la, lb, std::back_inserter(intersection_1)); if(t1 == t3) { Line_arc_3 line_a; assert(CGAL::do_intersect(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t2 <= t4) { assert(theEqual_3(line_a, la)); } else { @@ -1627,7 +1652,7 @@ void _test_intersection_construct(SK sk) { Line_arc_3 line_a; assert(CGAL::do_intersect(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t1 > t3) { assert(theEqual_3(line_a, la)); } else { @@ -1638,14 +1663,14 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(la, lb)); std::pair pair; assert(intersection_1.size() == 1); - assert(assign(pair, intersection_1[0])); + assert(assign_variant(pair, intersection_1[0])); if(t2 == t3) assert(theEqual_3(pair.first,target)); if(t1 == t4) assert(theEqual_3(pair.first,source)); } else if((t1 < t3) && (t3 < t2 )) { Line_arc_3 line_a; assert(CGAL::do_intersect(la, lb)); assert(intersection_1.size() == 1); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t2 < t4) { Line_arc_3 line_b; line_b = theConstruct_line_arc_3(l,sourcel,target); @@ -1657,7 +1682,7 @@ void _test_intersection_construct(SK sk) { Line_arc_3 line_a; assert(intersection_1.size() == 1); assert(CGAL::do_intersect(la, lb)); - assert(assign(line_a, intersection_1[0])); + assert(assign_variant(line_a, intersection_1[0])); if(t4 < t2) { Line_arc_3 line_b; line_b = theConstruct_line_arc_3(l,source,targetl); @@ -1729,7 +1754,7 @@ void _test_intersection_construct(SK sk) { int n_of_intersection = 0; for(int j=0;j<6;j++) { if(i == j) continue; - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; intersection(l[i], l[j], std::back_inserter(intersection_1)); assert((intersection_1.size() == 0) || (intersection_1.size() == 1)); @@ -1737,7 +1762,7 @@ void _test_intersection_construct(SK sk) { assert(CGAL::do_intersect(l[i], l[j])); n_of_intersection++; std::pair pair; - assert(assign(pair, intersection_1[0])); + assert(assign_variant(pair, intersection_1[0])); assert(theHas_on_3(l[i],pair.first)); assert(theHas_on_3(l[j],pair.first)); int n_of_edges = 2; @@ -1801,7 +1826,7 @@ void _test_intersection_construct(SK sk) { for(int t2=0;t2<8;t2++) { if(t1 == t2) continue; Circular_arc_3 cb = theConstruct_circular_arc_3(cc,cp[t1],cp[t2]); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; theIntersect_3(ca, cb, std::back_inserter(intersection_1)); Circular_arc_3 cres, cres2; std::pair< Circular_arc_point_3, unsigned > cp1, cp2; @@ -1809,37 +1834,37 @@ void _test_intersection_construct(SK sk) { if(t2 == j) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca,cres)); } else if(simulate_has_on(i,j,t2)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } } else if(t2 == j) { if(simulate_has_on(i,j,t1)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } } else if(t1 == j) { if(t2 == i) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cp1,intersection_1[0])); - assert(assign(cp2,intersection_1[1])); + assert(assign_variant(cp1,intersection_1[0])); + assert(assign_variant(cp2,intersection_1[1])); assert(theEqual_3(cp1.first, cp[i]) || theEqual_3(cp1.first, cp[j])); assert(theEqual_3(cp2.first, cp[i]) || @@ -1848,13 +1873,13 @@ void _test_intersection_construct(SK sk) { } else if(simulate_has_on(t1,i,t2)) { assert(intersection_1.size() == 1); assert(theDo_intersect_3(ca, cb)); - assert(assign(cp1,intersection_1[0])); + assert(assign_variant(cp1,intersection_1[0])); assert(theEqual_3(cp1.first, cp[t1])); } else { assert(intersection_1.size() == 2); assert(theDo_intersect_3(ca, cb)); - if(assign(cp1,intersection_1[0]) && assign(cres,intersection_1[1])); - else if(assign(cres,intersection_1[0]) && assign(cp1,intersection_1[1])); + if(assign_variant(cp1,intersection_1[0]) && assign_variant(cres,intersection_1[1])); + else if(assign_variant(cres,intersection_1[0]) && assign_variant(cp1,intersection_1[1])); else assert(false); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert(theEqual_3(conf, cres)); @@ -1864,8 +1889,8 @@ void _test_intersection_construct(SK sk) { if(t1 == j) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cp1,intersection_1[0])); - assert(assign(cp2,intersection_1[1])); + assert(assign_variant(cp1,intersection_1[0])); + assert(assign_variant(cp2,intersection_1[1])); assert(theEqual_3(cp1.first, cp[i]) || theEqual_3(cp1.first, cp[j])); assert(theEqual_3(cp2.first, cp[i]) || @@ -1874,13 +1899,13 @@ void _test_intersection_construct(SK sk) { } else if(simulate_has_on(j,i,t1)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cp1,intersection_1[0])); + assert(assign_variant(cp1,intersection_1[0])); assert(theEqual_3(cp1.first, cp[i])); } else { assert(intersection_1.size() == 2); assert(theDo_intersect_3(ca, cb)); - if(assign(cp1,intersection_1[0]) && assign(cres,intersection_1[1])); - else if(assign(cres,intersection_1[0]) && assign(cp1,intersection_1[1])); + if(assign_variant(cp1,intersection_1[0]) && assign_variant(cres,intersection_1[1])); + else if(assign_variant(cres,intersection_1[0]) && assign_variant(cp1,intersection_1[1])); else assert(false); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); assert(theEqual_3(conf, cres)); @@ -1890,19 +1915,19 @@ void _test_intersection_construct(SK sk) { if(simulate_has_on(t1,j,t2)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else if(simulate_has_on(t2,j,i)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); assert(theEqual_3(cres, conf)); } else { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cres,intersection_1[0])); - assert(assign(cres2,intersection_1[1])); + assert(assign_variant(cres,intersection_1[0])); + assert(assign_variant(cres2,intersection_1[1])); Circular_arc_3 conf1 = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); Circular_arc_3 conf2 = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert((theEqual_3(cres, conf1) && theEqual_3(cres2, conf2)) || @@ -1912,20 +1937,20 @@ void _test_intersection_construct(SK sk) { if(simulate_has_on(i,t2,t1)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else if(simulate_has_on(j,i,t1)) { assert(theDo_intersect_3(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert(theEqual_3(cres, conf)); } else { // This case should never happen, because it already happen before assert(intersection_1.size() == 2); assert(theDo_intersect_3(ca, cb)); - assert(assign(cres,intersection_1[0])); - assert(assign(cres2,intersection_1[1])); + assert(assign_variant(cres,intersection_1[0])); + assert(assign_variant(cres2,intersection_1[1])); Circular_arc_3 conf1 = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); Circular_arc_3 conf2 = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert((theEqual_3(cres, conf1) && theEqual_3(cres2, conf2)) || @@ -1935,7 +1960,7 @@ void _test_intersection_construct(SK sk) { // the case whether (i,j) contains (t1,t2) is handled before assert(intersection_1.size() == 1); assert(theDo_intersect_3(ca, cb)); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } else { assert(intersection_1.size() == 0); @@ -1956,7 +1981,7 @@ void _test_intersection_construct(SK sk) { for(int t2=0;t2<8;t2++) { if(t1 == t2) continue; Circular_arc_3 cb = theConstruct_circular_arc_3(cc,cp[t1],cp[t2]); - std::vector< CGAL::Object > intersection_1; + std::vector< std::variant > > intersection_1; intersection(ca, cb, std::back_inserter(intersection_1)); Circular_arc_3 cres, cres2; std::pair< Circular_arc_point_3, unsigned > cp1, cp2; @@ -1964,37 +1989,37 @@ void _test_intersection_construct(SK sk) { if(t2 == j) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca,cres)); } else if(simulate_has_on(i,j,t2)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } } else if(t2 == j) { if(simulate_has_on(i,j,t1)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } } else if(t1 == j) { if(t2 == i) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cp1,intersection_1[0])); - assert(assign(cp2,intersection_1[1])); + assert(assign_variant(cp1,intersection_1[0])); + assert(assign_variant(cp2,intersection_1[1])); assert(theEqual_3(cp1.first, cp[i]) || theEqual_3(cp1.first, cp[j])); assert(theEqual_3(cp2.first, cp[i]) || @@ -2003,13 +2028,13 @@ void _test_intersection_construct(SK sk) { } else if(simulate_has_on(t1,i,t2)) { assert(intersection_1.size() == 1); assert(CGAL::do_intersect(ca, cb)); - assert(assign(cp1,intersection_1[0])); + assert(assign_variant(cp1,intersection_1[0])); assert(theEqual_3(cp1.first, cp[t1])); } else { assert(intersection_1.size() == 2); assert(CGAL::do_intersect(ca, cb)); - if(assign(cp1,intersection_1[0]) && assign(cres,intersection_1[1])); - else if(assign(cres,intersection_1[0]) && assign(cp1,intersection_1[1])); + if(assign_variant(cp1,intersection_1[0]) && assign_variant(cres,intersection_1[1])); + else if(assign_variant(cres,intersection_1[0]) && assign_variant(cp1,intersection_1[1])); else assert(false); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert(theEqual_3(conf, cres)); @@ -2019,8 +2044,8 @@ void _test_intersection_construct(SK sk) { if(t1 == j) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cp1,intersection_1[0])); - assert(assign(cp2,intersection_1[1])); + assert(assign_variant(cp1,intersection_1[0])); + assert(assign_variant(cp2,intersection_1[1])); assert(theEqual_3(cp1.first, cp[i]) || theEqual_3(cp1.first, cp[j])); assert(theEqual_3(cp2.first, cp[i]) || @@ -2029,13 +2054,13 @@ void _test_intersection_construct(SK sk) { } else if(simulate_has_on(j,i,t1)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cp1,intersection_1[0])); + assert(assign_variant(cp1,intersection_1[0])); assert(theEqual_3(cp1.first, cp[i])); } else { assert(intersection_1.size() == 2); assert(CGAL::do_intersect(ca, cb)); - if(assign(cp1,intersection_1[0]) && assign(cres,intersection_1[1])); - else if(assign(cres,intersection_1[0]) && assign(cp1,intersection_1[1])); + if(assign_variant(cp1,intersection_1[0]) && assign_variant(cres,intersection_1[1])); + else if(assign_variant(cres,intersection_1[0]) && assign_variant(cp1,intersection_1[1])); else assert(false); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); assert(theEqual_3(conf, cres)); @@ -2045,19 +2070,19 @@ void _test_intersection_construct(SK sk) { if(simulate_has_on(t1,j,t2)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else if(simulate_has_on(t2,j,i)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); assert(theEqual_3(cres, conf)); } else { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 2); - assert(assign(cres,intersection_1[0])); - assert(assign(cres2,intersection_1[1])); + assert(assign_variant(cres,intersection_1[0])); + assert(assign_variant(cres2,intersection_1[1])); Circular_arc_3 conf1 = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); Circular_arc_3 conf2 = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert((theEqual_3(cres, conf1) && theEqual_3(cres2, conf2)) || @@ -2067,20 +2092,20 @@ void _test_intersection_construct(SK sk) { if(simulate_has_on(i,t2,t1)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(cb, cres)); } else if(simulate_has_on(j,i,t1)) { assert(CGAL::do_intersect(ca, cb)); assert(intersection_1.size() == 1); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); Circular_arc_3 conf = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert(theEqual_3(cres, conf)); } else { // This case should never happen, because it already happen before assert(intersection_1.size() == 2); assert(CGAL::do_intersect(ca, cb)); - assert(assign(cres,intersection_1[0])); - assert(assign(cres2,intersection_1[1])); + assert(assign_variant(cres,intersection_1[0])); + assert(assign_variant(cres2,intersection_1[1])); Circular_arc_3 conf1 = theConstruct_circular_arc_3(cc,cp[t1],cp[j]); Circular_arc_3 conf2 = theConstruct_circular_arc_3(cc,cp[i],cp[t2]); assert((theEqual_3(cres, conf1) && theEqual_3(cres2, conf2)) || @@ -2090,7 +2115,7 @@ void _test_intersection_construct(SK sk) { // the case whether (i,j) contains (t1,t2) is handled before assert(intersection_1.size() == 1); assert(CGAL::do_intersect(ca, cb)); - assert(assign(cres,intersection_1[0])); + assert(assign_variant(cres,intersection_1[0])); assert(theEqual_3(ca, cres)); } else { assert(intersection_1.size() == 0); @@ -2280,11 +2305,11 @@ void _test_bounding_box_construct(SK sk) Circle_3 c1 = theConstruct_circle_3(std::make_pair(es1, pol)); Circle_3 c2 = theConstruct_circle_3(std::make_pair(es2, pol)); - std::vector< CGAL::Object > intersection_2; + std::vector< std::variant > > intersection_2; theIntersect_3(c1, c2, std::back_inserter(intersection_2)); std::pair cap1, cap2; - assign(cap1,intersection_2[0]); - assign(cap2,intersection_2[1]); + assign_variant(cap1,intersection_2[0]); + assign_variant(cap2,intersection_2[1]); _test_bbox(cap1.first); _test_bbox(cap2.first); @@ -2295,10 +2320,10 @@ void _test_bounding_box_construct(SK sk) const FT dl = 0; Polynomial_1_3 pol2 = Polynomial_1_3(al,bl,cl,dl); Circle_3 c4 = theConstruct_circle_3(std::make_pair(es1, pol2)); - std::vector< CGAL::Object > intersection_4; + std::vector< std::variant > > intersection_4; theIntersect_3(c1, c4, std::back_inserter(intersection_4)); - assign(cap1,intersection_4[0]); - assign(cap2,intersection_4[1]); + assign_variant(cap1,intersection_4[0]); + assign_variant(cap2,intersection_4[1]); _test_bbox(cap1.first); _test_bbox(cap2.first); } @@ -2309,10 +2334,10 @@ void _test_bounding_box_construct(SK sk) const FT d_c = -FT(va) / FT(10); Polynomial_1_3 pol2 = Polynomial_1_3(a_c,b_c,c_c,d_c); Circle_3 c5 = theConstruct_circle_3(std::make_pair(es2, pol2)); - std::vector< CGAL::Object > intersection_5; + std::vector< std::variant > > intersection_5; theIntersect_3(c1, c5, std::back_inserter(intersection_5)); - assign(cap1,intersection_5[0]); - assign(cap2,intersection_5[1]); + assign_variant(cap1,intersection_5[0]); + assign_variant(cap2,intersection_5[1]); _test_bbox(cap1.first); _test_bbox(cap2.first); } @@ -2334,15 +2359,15 @@ void _test_bounding_box_construct(SK sk) Sphere_3 sl_2 = theConstruct_sphere_3( Polynomial_for_spheres_2_3(x+10,y+10,z+10,r*r)); int d2 = (vx*vx + vy*vy + vz*vz); - CGAL::Object intersection_1 = theIntersect_3(s, sl_1); - CGAL::Object intersection_2 = theIntersect_3(s_t10, sl_2); + std::optional> intersection_1 = theIntersect_3(s, sl_1); + std::optional> intersection_2 = theIntersect_3(s_t10, sl_2); // No intersection if((d2 > (r+1)*(r+1)) || (d2 < (r-1)*(r-1))) continue; if(x == 0 && y == 0 && z == 0) continue; if((d2 == (r+1)*(r+1)) || (d2 == (r-1)*(r-1))) continue; Circle_3 circle1, circle2; - assign(circle1, intersection_1); - assign(circle2, intersection_2); + assign_variant(circle1, intersection_1); + assign_variant(circle2, intersection_2); _test_bbox(circle1); _test_bbox(circle2); } From 41e8a11e6531d61b7509606befb88940e57a5dbf Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 15:15:34 +0100 Subject: [PATCH 0438/1398] Fix warnings in Arrangement_on_surface --- .../examples/Arrangement_on_surface_2/draw_arr.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp index ea99cca39a85..b62ba6aadc17 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp @@ -22,8 +22,8 @@ std::tuple hsv_to_rgb(float hue, float sat, float value) { float red, green, blue; float fc = value * sat; // Chroma - float hue_prime = fmod(hue / 60.0, 6); - float fx = fc * (1.0 - fabs(fmod(hue_prime, 2) - 1.0)); + float hue_prime = fmod(hue / 60.0f, 6); + float fx = fc * (1.0f - fabs(fmod(hue_prime, 2) - 1.0)); float fm = value - fc; if(0 <= hue_prime && hue_prime < 1) { @@ -98,12 +98,13 @@ int main() { std::size_t id(0); CGAL::draw(arr, [&] (Arrangement_2::Face_const_handle) -> CGAL::IO::Color { - float h = 360.0 * id++ / arr.number_of_faces(); + float h = 360.0f * id++ / arr.number_of_faces(); float s = 0.5; float v = 0.5; float r, g, b; + typedef unsigned char uchar; std::tie(r, g, b) = hsv_to_rgb(h, s, v); - return CGAL::IO::Color(r, g, b); + return CGAL::IO::Color(uchar(r*255), uchar(g*255), uchar(b*255)); }, "hsv colors", true); return EXIT_SUCCESS; From 00b540d79185574d66216408c2990daec6b7fd93 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 29 Jun 2023 15:34:03 +0100 Subject: [PATCH 0439/1398] Fix precomputed data --- .../test_dt_deterministic_3.cpp | 6 +- .../test_dt_deterministic_3.in | 21152 ++++++++-------- 2 files changed, 10579 insertions(+), 10579 deletions(-) diff --git a/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.cpp b/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.cpp index 35d2acc07c92..e1532362bb7d 100644 --- a/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.cpp +++ b/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.cpp @@ -27,9 +27,9 @@ int main() std::stringstream buffer; buffer << dt3; - //~ std::ofstream out ("test_dt_deterministic_3.in"); - //~ out << dt3; - + //std::ofstream out ("test_dt_deterministic_3.in"); + //out << dt3; + //out.close(); //reading the result from a file std::ifstream file ("test_dt_deterministic_3.in"); diff --git a/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.in b/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.in index ec9008c87fe3..c04c6f739de2 100644 --- a/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.in +++ b/Triangulation_3/test/Triangulation_3/test_dt_deterministic_3.in @@ -1001,10698 +1001,10698 @@ 8 1 0 9 0 0 5346 -509 200 354 331 -66 533 547 545 -201 206 27 203 -911 613 923 919 -283 259 282 263 -352 43 445 350 -645 8 648 649 -978 967 968 600 -203 27 193 206 -520 506 522 25 -230 229 224 130 -554 461 459 552 -191 205 190 181 -765 116 12 75 -762 604 12 765 -71 667 73 690 -669 625 14 624 -725 724 723 728 -374 366 373 372 -507 356 505 20 -301 0 289 36 -582 580 0 581 -694 756 695 704 -71 688 686 690 -26 143 0 216 -961 945 929 203 -748 46 757 4 -95 764 705 680 -141 133 147 149 -714 732 721 675 -198 518 40 362 -351 359 368 370 -703 749 702 93 -191 22 205 181 -763 758 429 366 -442 444 57 350 -225 16 0 140 -95 703 702 92 -94 102 99 93 -76 75 12 72 -249 241 335 28 -428 435 360 367 -328 317 329 40 -216 209 210 142 -566 71 686 690 -375 367 365 361 -733 751 93 744 -759 366 364 747 -615 77 74 612 -90 674 722 721 -99 94 93 92 -44 6 360 367 -224 222 226 229 -321 302 312 304 -321 303 39 314 -563 568 0 564 -70 435 559 433 -757 420 366 4 -0 725 723 728 -902 915 984 897 -147 145 0 151 -292 293 282 259 -804 803 812 805 -541 543 540 536 -219 220 223 336 -612 74 610 646 -751 97 734 770 -129 130 131 0 -765 766 767 758 -841 110 843 837 -193 195 181 22 -460 457 454 455 -5 54 421 374 -0 672 674 84 -546 468 0 58 -93 94 102 748 -362 517 510 44 -554 546 465 556 -0 819 821 101 -885 886 840 839 -204 162 195 22 -415 706 417 45 -67 58 546 555 -158 146 153 154 -241 336 335 28 -709 700 88 711 -728 723 0 724 -617 909 619 910 -687 775 764 774 -68 575 577 576 -0 305 852 270 -0 254 248 253 -0 836 846 111 -615 606 607 609 -107 106 851 850 -173 170 134 152 -476 481 479 475 -486 494 0 493 -948 180 177 182 -442 350 435 44 -413 421 373 372 -736 91 735 727 -639 79 80 78 -174 1 171 179 -163 164 174 153 -196 200 203 199 -990 999 987 1000 -812 39 306 814 -176 178 168 0 -798 803 805 795 -491 500 523 156 -307 308 37 383 -492 490 493 148 -737 735 731 727 -290 295 297 390 -0 735 823 736 -192 205 193 190 -262 283 264 263 -284 338 243 337 -388 49 389 48 -0 641 637 643 -278 288 281 280 -303 302 321 304 -306 310 36 37 -170 152 0 135 -135 151 132 133 -755 756 96 773 -485 475 0 473 -178 129 169 0 -156 211 155 202 -410 0 412 409 -544 540 543 537 -520 519 527 602 -600 633 594 9 -957 958 0 164 -673 683 682 672 -160 153 165 163 -231 235 239 221 -204 166 195 162 -160 529 524 523 -195 162 180 22 -21 178 176 0 -132 137 140 151 -899 901 915 938 -183 188 187 28 -178 169 168 0 -213 331 206 200 -368 442 367 44 -465 556 0 458 -184 232 231 0 -295 333 318 282 -686 687 96 566 -318 324 331 329 -218 220 26 0 -694 686 695 756 -795 798 938 797 -304 271 3 269 -675 730 722 714 -302 289 3 304 -613 761 604 605 -287 237 245 34 -196 198 200 199 -0 253 248 256 -255 31 257 263 -187 22 208 191 -155 202 209 186 -202 212 22 27 -732 731 91 727 -733 99 820 102 -338 284 339 0 -364 376 308 747 -134 178 175 230 -121 974 970 960 -187 191 208 28 -406 449 0 405 -242 246 237 238 -0 816 817 38 -216 26 210 209 -27 195 194 193 -538 544 0 475 -205 326 192 206 -353 504 509 356 -881 796 797 805 -379 745 749 708 -805 812 866 814 -0 894 895 898 -361 375 309 364 -206 205 193 192 -201 200 206 203 -83 677 673 679 -751 750 743 741 -692 685 698 696 -329 328 370 313 -301 0 385 289 -322 314 30 39 -274 281 283 262 -36 0 305 38 -37 0 36 38 -264 266 269 273 -501 499 462 61 -294 312 263 282 -206 324 192 199 -34 287 277 278 -318 317 319 324 -944 932 118 943 -324 323 325 199 -346 393 348 0 -209 215 219 336 -302 303 289 304 -791 784 826 831 -365 5 421 374 -671 683 0 665 -68 561 550 549 -558 557 57 70 -185 187 28 183 -0 933 189 253 -251 205 190 191 -20 212 202 27 -263 267 259 260 -211 507 505 20 -346 297 387 0 -302 316 290 41 -0 79 643 8 -435 44 511 516 -387 388 394 386 -326 324 192 206 -33 285 288 286 -283 267 259 263 -360 6 605 761 -328 30 323 363 -287 33 284 0 -301 384 37 310 -517 24 515 516 -45 709 707 703 -210 209 219 17 -185 219 17 175 -353 356 344 349 -56 447 402 0 +469 466 0 471 +316 313 302 321 +229 222 221 231 +251 189 190 253 +129 128 0 131 +0 262 255 267 +175 17 150 219 +136 0 126 138 +310 39 303 314 +629 623 14 641 +831 0 832 833 +63 43 358 359 +316 290 41 390 +467 459 468 546 +897 899 902 915 +176 168 0 178 +191 22 187 208 +648 0 585 653 +826 734 770 827 +116 12 77 618 +233 226 229 234 +512 506 461 520 +79 8 0 80 +522 161 526 527 +23 196 519 927 +762 434 360 763 +168 169 0 178 +244 284 33 293 +361 322 6 801 +628 617 619 629 +806 790 769 829 +26 209 210 216 +171 17 173 175 +301 37 36 310 +85 676 675 777 +792 790 769 794 +0 277 34 287 +218 150 26 219 +83 668 666 670 +4 366 372 373 +202 186 207 209 +621 566 96 687 +698 681 0 699 +304 303 265 311 +458 556 557 558 +526 159 529 596 +19 591 600 601 +322 6 357 361 +199 323 324 325 +28 191 208 249 +924 918 799 931 +95 86 85 97 50 373 46 380 -758 76 429 694 -143 210 217 149 -0 245 34 278 -405 409 0 408 -355 504 358 509 -565 689 688 432 -569 82 662 571 -316 290 294 302 -815 810 807 100 -545 66 541 543 -7 543 0 66 -774 780 625 10 -755 781 792 794 -783 627 787 794 -416 417 706 52 -233 235 221 0 -803 322 39 309 -645 654 650 649 -160 158 153 525 -290 298 300 299 -385 0 300 289 -0 650 649 637 -404 418 0 424 +198 40 323 363 +306 36 37 310 +292 259 288 293 +154 149 146 173 +163 162 155 174 +21 176 0 178 +480 61 62 500 +456 0 462 497 +240 223 220 336 +645 8 638 648 +601 527 519 602 +398 396 47 399 +303 39 311 321 +175 171 21 178 +16 132 137 140 +192 193 205 206 +324 192 199 325 +677 10 0 776 +639 0 81 647 +17 171 173 174 +153 0 146 158 +131 132 16 225 +167 171 176 179 +249 243 242 258 +596 527 161 965 +218 217 150 227 +0 489 158 524 +387 386 41 388 +794 793 773 910 +603 24 19 616 +0 400 401 407 +774 771 96 781 +66 7 0 543 +640 622 629 644 +511 63 350 558 +149 133 150 217 +287 244 33 288 +615 604 614 618 +974 120 952 997 +27 22 202 204 +757 754 752 759 +490 147 149 492 +80 79 78 639 +211 142 209 216 +139 16 137 140 +770 97 734 778 +131 130 129 132 +144 141 0 145 +0 177 948 950 +263 262 264 283 +771 92 768 772 +897 0 898 988 +489 0 484 524 +644 622 623 662 +136 128 0 137 +933 870 0 935 +417 52 416 424 +211 209 214 216 +126 0 127 138 +503 460 461 513 +97 770 772 779 +0 218 220 221 +477 469 467 537 +206 199 200 324 +332 345 2 353 +252 319 325 326 +202 22 162 204 +48 391 392 403 +283 282 259 292 +724 722 0 730 +169 129 0 178 +0 147 146 490 +397 47 382 421 +626 621 14 628 +22 180 181 187 +96 755 756 773 +145 140 139 151 +937 117 873 943 +223 222 184 231 +368 369 357 391 +0 34 237 287 +51 417 52 697 +294 3 264 304 +8 80 638 648 +968 927 967 969 +139 137 0 151 +314 30 39 321 +0 21 178 230 +245 34 278 287 +490 149 148 492 +198 362 363 517 +376 382 372 397 +312 257 263 319 +514 511 515 516 +136 131 128 137 +595 541 528 602 +180 22 181 195 +200 25 196 201 +178 129 0 230 +703 95 705 709 +154 148 142 525 +36 271 289 303 +426 433 428 443 +432 430 431 437 +363 322 30 799 +888 0 877 890 +245 244 237 287 +37 0 36 38 +257 255 31 263 +866 807 811 881 +461 498 503 506 +340 296 332 345 +259 244 258 280 +313 41 302 315 +324 323 317 325 +186 202 207 208 +222 175 184 230 +13 809 810 819 +813 807 818 866 +309 364 308 760 +869 868 109 871 +757 694 756 758 +215 214 209 216 +0 128 135 137 +373 4 46 380 +0 826 831 832 +0 33 285 287 +187 22 186 208 +373 50 46 420 +392 388 48 394 +255 262 263 267 +83 670 673 677 +193 181 22 195 +0 386 387 394 +436 0 69 557 +286 0 275 291 +807 100 806 808 +20 27 202 204 +185 28 186 336 +2 329 354 370 +34 277 278 287 +36 289 301 303 +0 548 549 555 +282 294 312 316 +302 312 316 321 +760 807 100 815 +162 22 180 195 +671 665 670 683 +526 522 527 532 +0 414 416 706 +47 396 395 400 +294 290 291 300 +520 532 536 602 +239 231 223 247 +237 34 245 287 +200 199 40 324 +267 263 259 283 +302 294 290 316 +392 401 403 448 +264 294 304 312 +40 362 198 518 +180 162 1 187 +262 0 255 266 +143 149 210 217 +552 64 67 554 +27 20 202 212 +22 162 180 187 +795 798 799 924 +39 265 303 311 +245 278 244 287 +445 56 439 452 +367 361 365 375 +397 396 47 421 +748 46 379 749 +277 0 285 287 +316 282 318 319 +54 405 422 423 +700 87 699 709 +665 83 666 670 +32 305 265 858 +467 0 465 546 +693 690 692 696 +699 87 53 705 +0 291 298 300 +511 514 70 559 +346 345 0 348 +351 43 347 352 +534 512 64 552 +310 301 37 384 +397 382 372 421 +376 371 310 384 +917 789 114 919 +350 57 435 511 +932 873 190 933 +52 50 414 424 +864 863 867 869 +785 784 782 792 +73 71 564 568 +269 0 272 273 +103 0 101 104 +0 379 380 414 +186 28 187 208 +386 299 0 387 +5 54 428 443 +607 609 612 615 +645 649 652 654 +301 36 303 310 +209 26 210 219 +426 54 374 427 +362 40 198 363 +486 0 488 493 +323 317 40 324 +983 908 912 985 +318 332 295 390 +377 747 752 815 +388 369 42 392 +322 314 309 375 +638 571 644 645 +286 35 0 298 +0 35 33 339 +278 0 245 280 +30 314 39 322 +319 312 257 320 +275 0 272 291 +348 2 345 353 +56 0 439 452 +537 59 468 543 +149 148 143 210 +68 577 588 610 +167 164 0 172 +75 116 12 620 +856 108 109 867 +367 5 428 442 +515 512 64 534 +800 613 604 911 +607 606 559 609 +660 665 666 670 +43 63 358 498 +241 238 242 337 +631 630 0 643 +445 57 350 558 +360 44 367 435 +251 252 190 326 +552 533 534 602 +393 0 387 394 +573 68 550 575 +41 300 302 385 +51 53 0 417 +791 784 785 792 +46 378 379 380 +243 284 293 339 +516 435 360 559 +212 20 202 505 +401 0 402 448 +213 201 20 508 +395 371 48 397 +43 350 352 359 +96 619 620 621 +451 447 445 452 +447 445 43 451 +348 347 351 355 +331 330 332 353 +515 510 23 517 +446 43 355 498 +335 241 240 336 +0 436 438 440 +372 382 381 413 +0 385 386 389 +560 561 573 609 +2 331 332 353 +315 302 289 385 +826 825 827 832 +732 731 742 750 +400 399 396 407 +342 0 344 496 +694 695 704 756 +579 571 574 586 +679 719 720 721 +407 402 55 441 +573 565 560 607 +163 155 154 174 +573 563 570 588 +623 642 82 661 +468 59 7 543 +543 537 536 545 +99 92 93 733 +527 520 519 602 +519 23 19 534 +154 146 148 158 +158 153 0 160 +217 149 141 492 +69 551 549 561 +67 545 58 547 +615 614 115 618 +438 433 425 440 +471 464 0 479 +679 86 85 720 +43 63 350 359 +351 347 393 448 +149 141 133 217 +547 67 535 551 +175 222 224 230 +241 335 240 337 +524 523 18 525 +160 523 524 525 +515 511 510 516 +478 60 0 479 +17 154 155 174 +523 482 491 526 +176 1 177 179 +445 43 352 447 +69 551 553 555 +367 360 428 763 +372 4 373 381 +364 361 365 763 +46 50 52 419 +504 503 498 506 +25 512 23 519 +577 576 578 581 +756 755 754 767 +913 908 912 923 +458 0 439 557 +115 614 611 616 +547 65 542 548 +0 574 575 578 +744 743 741 751 +640 630 631 643 +16 131 136 137 +724 718 714 725 +153 163 164 165 +870 0 253 933 +217 0 143 492 +150 17 210 219 +540 538 539 544 +157 161 159 526 +560 70 436 561 +439 445 452 458 +455 451 446 498 +488 487 489 493 +19 23 515 534 +543 66 7 545 +58 0 7 468 +153 146 154 158 +344 342 496 505 +463 455 456 503 +483 61 500 523 +132 131 16 137 +469 468 467 537 +560 436 438 562 +438 425 0 440 +355 348 347 446 +477 463 464 501 +47 410 413 421 +618 74 77 632 +53 45 417 697 +467 468 0 546 +403 391 368 442 +468 58 0 546 +195 22 27 204 +702 695 696 764 0 625 10 668 -34 287 237 0 -41 315 302 313 -365 428 374 763 -412 0 414 411 -939 914 990 970 -93 708 749 745 -606 604 12 762 -703 751 743 744 -292 286 298 35 -391 5 397 365 -346 387 393 0 -278 276 277 0 -269 266 268 273 -390 2 42 329 -0 273 269 268 -223 241 240 239 -527 965 596 597 -81 599 634 592 -711 750 726 742 -357 314 375 369 -53 699 0 87 -718 724 716 713 -924 918 931 920 -247 236 239 235 -521 201 508 20 -543 7 59 468 -64 534 515 512 -756 94 695 704 -324 40 329 317 -892 878 901 900 -199 945 930 937 -459 554 465 460 -464 466 463 477 -537 543 59 468 -114 911 793 910 -540 541 0 543 -447 43 445 352 -419 424 50 52 -522 161 527 197 -351 355 359 354 -160 524 158 525 -307 0 38 816 -440 436 0 438 -399 406 408 398 -451 454 0 452 -198 362 40 363 -412 409 404 422 -493 486 494 18 -508 509 25 506 -309 310 308 376 -348 349 345 0 +23 24 19 515 +595 533 541 602 +309 364 375 376 +515 23 24 517 +668 10 677 775 +379 706 708 749 +566 621 669 687 +315 41 302 385 +816 106 0 817 +92 93 94 99 +767 756 755 773 +607 565 560 689 +71 565 72 688 +524 18 158 525 +545 459 67 546 +53 51 0 692 +547 535 533 590 +366 364 763 766 +739 734 738 827 +790 785 783 792 +629 628 617 630 +338 340 341 342 +260 256 257 263 +581 576 0 582 +24 608 614 616 +94 704 748 749 +672 673 674 682 +908 122 124 982 +548 551 547 589 +711 726 742 750 +59 0 7 543 +677 676 673 679 +759 100 752 815 +688 686 690 693 +51 419 418 431 +737 0 727 741 +628 621 14 629 +75 72 12 76 +375 364 365 376 +299 0 300 385 +796 802 803 814 +511 64 514 515 +422 50 373 427 +14 623 624 642 +952 951 119 953 +581 578 585 653 +893 935 117 943 +12 116 604 618 +169 134 129 178 +78 631 632 635 +23 519 19 927 +228 0 130 234 +455 454 451 457 +0 786 884 885 +559 434 360 606 +434 429 428 763 +630 628 617 909 +613 605 604 614 +0 66 541 583 +0 630 907 909 +962 120 946 972 +135 129 128 169 +549 551 548 589 +294 264 263 312 +73 662 663 667 +0 634 636 639 +418 50 404 427 +0 540 541 543 +93 92 94 702 +242 245 246 261 +122 0 907 985 +729 728 0 730 +837 835 13 841 +707 88 0 711 +701 90 714 721 +0 624 625 668 +756 754 94 757 +755 99 768 771 +99 93 94 102 +76 429 430 689 +724 723 725 728 +658 665 670 671 +755 94 99 771 +780 768 774 781 +282 290 294 316 +661 82 662 663 +549 0 550 575 +374 426 427 429 +374 373 366 420 +0 779 780 784 +417 45 52 697 +427 420 374 429 +368 44 350 442 +427 423 418 437 +584 587 592 610 +53 87 0 417 +51 0 418 424 +822 791 827 831 +404 405 0 423 +47 0 399 400 +767 75 756 773 +673 83 677 679 +673 671 670 683 +621 623 14 629 +687 667 566 690 +674 673 0 676 +777 731 97 778 +719 679 682 721 +776 97 772 779 +676 675 674 721 +722 717 718 724 +603 9 572 611 +84 0 717 722 +434 433 426 689 +676 86 85 679 +772 771 764 774 +688 76 686 694 +45 415 417 706 +738 103 0 739 +742 726 732 750 +709 703 95 750 +710 701 712 714 +762 761 604 765 +669 666 667 678 +11 728 729 730 +727 91 11 729 +615 12 604 618 +508 25 506 509 +790 786 830 839 +0 981 989 993 +193 27 194 195 +141 145 147 151 +705 696 680 764 +747 366 4 759 +341 207 342 505 +265 304 311 853 +638 586 571 645 +326 324 206 327 +698 696 680 705 +44 357 367 368 +92 768 99 771 +754 752 748 757 +730 675 91 732 +645 637 649 650 +706 379 52 749 +52 45 706 749 +718 714 722 724 +708 706 45 749 +674 0 84 722 +654 651 0 656 +667 71 566 690 +46 704 748 757 +323 799 872 931 +606 559 434 607 +321 314 30 328 +257 256 255 263 +7 66 0 542 +369 328 313 370 +747 364 366 759 +840 839 13 841 +177 176 179 950 +828 753 100 829 +245 237 242 246 +704 52 46 749 +129 132 134 135 +832 827 822 834 +83 678 666 775 +909 787 627 910 +80 586 638 648 +75 686 694 756 +704 694 756 757 +815 377 307 821 +50 46 52 414 +379 745 748 749 +162 163 155 204 +201 27 203 206 42 392 393 394 -345 344 340 0 -511 558 57 70 -395 397 371 48 -358 498 43 63 -2 348 353 345 -212 205 22 27 -543 541 0 66 -64 63 512 510 -440 70 433 57 -345 330 353 332 -63 350 445 43 -411 0 414 416 -487 144 0 490 -559 511 514 516 -684 685 567 678 -404 423 0 418 -673 83 679 683 -551 572 589 68 -573 560 607 565 -955 957 950 947 -224 230 130 129 -235 247 236 0 -0 91 735 736 -514 609 559 608 -160 153 0 165 -557 70 436 440 -550 563 0 562 -750 731 742 741 -462 478 0 464 -510 517 23 515 -548 542 582 65 -704 419 693 694 -490 146 0 158 -131 130 228 0 -539 540 531 538 -757 366 759 4 -498 457 451 43 -425 440 0 438 -461 460 554 459 +0 377 746 821 +11 725 728 730 +725 724 728 730 +11 714 725 730 +748 745 93 749 +740 93 102 745 +725 0 11 728 +708 703 743 744 +723 0 725 728 +102 99 93 733 +0 107 849 855 +714 724 725 730 +24 603 608 616 +791 733 99 820 +834 832 824 838 +594 0 81 633 +241 29 28 249 +238 241 242 246 +508 201 25 509 +728 724 0 730 +72 75 12 620 +850 107 857 861 +62 462 0 497 +91 727 731 735 +819 0 101 821 +291 286 0 298 +99 755 768 792 +251 191 189 254 +3 0 269 271 +817 816 106 818 +879 876 874 936 +241 29 242 246 +110 105 836 846 +852 0 270 854 +34 237 245 279 +0 268 269 270 +311 39 265 812 +176 21 171 178 +106 810 816 819 +838 833 0 846 +856 864 867 869 +196 199 200 203 +796 806 807 881 +667 623 661 669 +116 12 604 765 +909 627 619 910 +844 843 841 845 +770 768 92 772 +195 27 194 204 +760 747 308 815 +822 809 830 837 +835 13 809 837 +881 806 811 886 +835 104 105 837 +722 675 0 730 +724 714 722 730 +805 804 798 864 +106 13 819 835 +716 715 713 723 +833 110 105 837 +105 110 836 837 +811 839 840 886 +818 13 106 850 +836 0 111 846 +187 182 181 191 +165 163 164 166 +799 363 322 801 +764 772 774 775 +181 189 182 934 +615 74 77 618 +866 859 805 880 +81 599 633 634 +113 918 15 940 +983 915 916 992 +759 760 100 815 +141 140 0 145 +841 110 836 845 +170 171 134 178 +83 680 678 775 +592 78 74 635 +615 77 12 618 +125 976 914 992 +601 19 519 927 +190 252 253 933 +9 599 600 633 +20 156 202 211 +521 491 522 526 +182 188 189 191 +611 599 115 616 +841 839 837 843 +0 986 987 989 +0 136 137 138 +912 911 114 913 +579 578 0 653 +636 635 78 639 +995 0 998 1000 +634 0 81 639 +615 115 74 618 +304 311 312 321 +264 262 255 266 +270 265 271 305 +17 185 186 219 +0 182 183 188 +80 0 639 647 +592 584 78 639 +890 0 877 891 +972 952 0 974 +468 459 537 545 140 139 0 145 -232 247 231 0 -152 133 135 134 -375 391 369 371 -525 142 148 154 -354 355 359 358 -971 120 960 962 -78 635 639 636 -24 19 23 515 -507 211 156 20 -208 205 22 212 -196 25 200 518 -69 70 436 557 -366 758 757 759 -425 438 433 440 -69 557 556 553 -0 1000 987 999 -405 423 0 404 -440 557 0 436 -74 78 584 646 -478 501 462 61 -479 481 485 475 -491 521 522 508 -446 347 451 0 -19 23 515 534 -471 472 0 470 -536 543 540 537 -665 670 683 83 -761 604 762 765 -214 216 0 495 -421 413 422 410 -532 520 502 522 -679 681 683 83 -469 59 0 468 -513 477 539 501 -476 471 466 469 -453 460 454 455 -463 453 455 460 -532 536 528 540 -471 470 0 469 -486 493 488 489 -353 356 509 213 -522 519 25 197 -640 646 644 638 -629 644 623 641 -587 572 590 9 -546 465 0 467 -362 6 517 44 -62 495 500 507 -580 576 581 582 -702 704 94 749 -77 74 646 640 -0 725 728 11 -580 577 647 585 -452 56 447 445 -65 582 0 542 -337 240 238 0 -158 146 154 148 -570 71 565 72 -438 436 433 440 -80 638 8 648 -802 795 796 803 -156 521 491 20 -434 435 559 360 -350 511 57 435 -704 757 694 756 -696 678 698 680 -367 6 361 357 -720 699 700 719 -370 328 357 369 -141 144 0 492 -707 709 88 711 -68 551 561 549 -459 467 465 546 -546 545 468 58 -463 466 0 453 -648 638 8 645 -783 794 787 788 -585 647 80 584 -608 609 611 572 -623 621 14 669 -694 686 756 75 -929 196 197 203 -432 688 564 691 -80 79 0 8 -733 827 791 770 -62 495 496 0 -0 177 182 948 -646 588 612 570 -573 565 570 563 -549 575 0 550 -891 877 882 901 -793 911 765 116 -386 49 389 388 -417 51 0 53 -510 515 64 511 -502 508 491 522 -523 483 61 482 -86 679 676 677 -660 658 657 664 -698 685 684 678 -482 502 539 501 -491 523 61 482 -56 402 55 0 -136 127 138 126 -106 13 818 810 -668 670 666 83 -429 374 763 366 -633 81 594 9 -591 601 600 19 -124 983 984 985 -526 157 521 491 -963 960 929 962 -631 632 635 122 -894 996 893 939 -617 913 909 910 -169 135 0 128 -137 131 16 136 -140 145 0 141 -952 974 997 999 -75 773 756 767 -27 205 193 206 -0 737 741 727 -0 668 677 670 -687 690 678 667 -0 637 649 8 -616 922 614 24 -593 590 594 9 -94 695 771 756 -243 293 258 333 -6 44 362 357 -574 563 0 575 -705 53 87 699 -585 586 653 578 -844 885 840 843 -618 116 911 913 -360 6 761 361 -263 257 256 260 -830 792 790 828 -321 314 39 30 -115 614 921 923 -375 364 365 376 -569 663 0 568 -696 687 695 690 -53 692 698 696 -769 794 788 793 -719 701 0 700 -611 609 610 572 -733 751 744 739 -816 821 810 815 -53 698 0 699 -424 51 0 417 -448 401 394 392 -373 381 372 4 -755 99 94 754 -373 420 50 46 -41 313 302 316 -409 0 408 410 -418 51 0 424 -408 406 405 398 -442 367 5 391 -592 599 635 115 -548 582 576 589 -681 684 0 683 -138 127 16 0 -726 732 710 742 -702 705 703 95 -675 777 91 732 -770 768 791 99 -861 860 857 862 -359 362 370 354 -788 794 787 910 -603 616 608 24 -105 837 835 104 -280 258 261 244 -104 103 820 101 -98 786 843 839 -695 686 96 756 -683 670 673 83 -792 790 783 785 -726 714 710 732 -75 765 767 758 -684 681 680 83 -606 516 605 360 -822 98 837 830 -141 147 144 492 -794 788 783 790 -697 419 693 704 -101 746 0 740 -839 886 840 811 -743 744 0 708 -86 679 680 720 -811 818 850 13 -670 665 666 83 -753 754 752 102 -261 242 246 245 -906 910 787 909 -762 758 76 429 -438 433 689 426 -378 377 381 4 -431 688 693 430 -757 758 756 767 -95 86 85 97 -620 773 96 75 -560 433 434 689 -705 53 699 698 -718 717 724 722 -116 617 619 910 -829 769 100 828 -679 677 673 676 -676 679 674 673 -588 577 584 610 -93 102 745 748 -753 752 746 102 -710 712 0 725 -94 754 99 102 -635 632 78 74 -840 841 839 13 -734 778 825 826 -830 98 837 839 -802 322 803 309 -253 252 260 256 -814 39 306 309 -0 728 729 11 -89 701 0 712 -380 46 378 4 -272 275 283 274 -310 371 384 376 -704 46 757 748 -310 301 36 37 -306 308 310 37 -809 753 810 819 -788 794 910 793 -733 827 103 820 -252 933 870 253 -0 627 626 628 -0 103 104 101 -728 730 729 11 -730 728 725 11 -793 808 767 765 -0 846 105 838 -711 89 0 710 -905 915 917 912 -0 730 729 728 -756 755 94 754 -757 46 420 4 -105 822 837 104 -730 724 722 714 -892 936 900 895 -735 91 731 727 -741 750 731 751 -686 695 690 693 -809 822 837 830 -0 898 988 994 -810 13 829 809 -0 836 835 105 -269 0 268 270 -117 875 937 873 -744 740 0 745 -984 912 905 985 -0 274 272 273 -741 739 0 744 -101 820 753 102 -381 0 382 383 -134 178 129 169 -171 176 178 168 -130 234 229 226 -251 250 191 249 -0 833 110 846 -618 116 77 12 -0 852 854 270 -278 285 277 276 -329 324 331 40 -283 275 281 274 -259 258 280 244 -805 814 866 796 -815 760 747 759 -258 249 251 254 -155 204 156 202 -225 234 226 0 -280 261 245 244 -817 107 852 857 -603 19 534 591 -0 738 103 739 -723 716 0 724 -729 91 727 11 -857 32 818 866 -0 103 740 739 -617 907 630 909 -606 516 360 559 -894 898 994 991 -604 618 615 12 -184 231 232 223 -267 260 256 248 -280 248 267 0 -853 270 108 858 -639 79 78 636 -111 845 836 110 -0 902 897 896 -0 845 847 848 -0 112 842 844 -0 845 848 111 -628 621 14 629 -141 145 144 147 -634 599 635 592 -120 961 944 928 -618 116 617 77 -877 878 882 901 -514 561 559 609 -141 151 147 133 -609 573 607 612 -0 627 628 909 -908 985 122 907 -527 597 602 601 -796 760 807 808 -76 758 75 694 -620 96 619 621 -321 317 320 312 -27 204 194 195 -373 366 420 4 -585 584 80 586 -842 840 865 850 -202 204 156 20 -173 170 152 172 -229 234 130 0 -800 604 765 911 -580 647 577 587 -604 116 618 12 -234 228 130 0 -930 196 927 929 -516 24 605 517 -516 517 605 6 -640 643 641 630 -123 967 966 121 -961 195 942 193 -258 249 254 261 -224 229 226 130 -21 183 184 0 -494 480 0 495 -199 324 200 206 -94 702 771 695 -94 756 771 755 -598 966 0 123 -234 229 233 0 -216 215 214 0 -939 894 990 991 -143 216 210 142 -210 219 150 17 -141 145 0 144 -154 174 155 17 -135 169 129 128 -909 910 787 627 -184 231 229 0 -216 26 209 215 -225 140 132 16 +81 592 599 634 +215 209 26 216 +138 16 137 139 +634 635 636 639 +229 226 130 234 +170 171 172 173 +152 134 170 173 +839 829 790 886 +133 149 150 173 +899 897 991 992 +528 536 532 602 +907 617 632 913 +141 147 133 151 +794 619 627 910 +649 637 0 650 +655 0 569 663 +882 878 797 901 +552 536 533 602 +0 487 488 493 +967 960 121 977 +894 990 991 994 +619 626 627 628 +627 626 0 628 +115 599 592 635 +668 83 666 775 +147 144 141 492 +483 480 60 486 +870 252 873 933 +74 632 78 640 +634 592 599 635 +524 158 160 525 +133 135 151 152 +142 209 155 211 +18 483 484 486 +130 129 0 131 +128 131 132 137 +130 224 225 226 +117 876 935 936 +146 149 152 173 +479 475 476 481 +0 275 276 285 +185 184 183 232 +132 133 134 135 +0 144 145 147 +252 190 873 933 +131 128 0 136 +134 135 152 170 +253 252 870 933 +21 171 1 176 +0 126 127 136 131 127 16 136 -82 637 645 650 -734 826 827 770 -132 137 16 140 -211 209 216 142 -587 590 593 9 -160 165 159 157 -226 222 221 229 -137 136 0 128 -126 127 138 0 -128 131 136 0 -131 127 136 0 -600 599 633 9 -598 123 633 600 -211 209 142 155 -597 596 0 965 -580 593 647 587 -78 632 635 631 -0 628 14 641 -569 571 645 82 -0 738 737 823 -147 152 146 149 -140 139 145 151 -145 147 0 144 -137 138 0 136 -175 21 184 230 -154 174 172 153 -640 617 629 77 -151 147 133 152 -129 131 128 0 -242 245 237 246 -292 295 35 290 -135 137 0 128 -522 526 521 491 +132 129 128 135 +128 129 0 169 +250 249 191 251 +178 134 129 230 +181 189 190 191 +219 215 26 220 +486 18 480 494 +355 351 354 359 +131 0 127 136 +128 132 135 137 +27 193 194 203 +132 140 133 151 +131 129 128 132 +136 16 137 138 +136 126 127 138 +217 150 26 218 +139 0 16 140 +133 140 141 151 +137 0 138 139 +22 27 202 212 +183 177 1 187 +191 187 28 208 +156 155 202 211 +372 365 364 376 +479 473 475 485 +934 181 942 948 +140 16 132 225 +137 132 135 151 +252 256 257 260 +176 171 168 178 +135 132 133 151 136 127 16 138 -132 131 16 137 -490 146 158 148 -19 968 616 24 -336 240 241 335 -201 213 206 200 -292 286 291 298 -40 317 324 323 -138 126 0 136 -151 145 0 139 -484 489 0 524 -135 137 132 151 -929 203 197 194 -140 151 141 133 -175 21 178 171 -185 186 17 219 -128 137 132 135 -164 172 0 167 -128 131 129 132 -129 130 132 131 -143 217 492 149 -139 16 0 138 -141 145 147 151 -160 165 0 159 -154 163 174 153 -598 595 0 597 -132 151 140 133 -128 131 132 137 -128 131 137 136 -263 319 260 282 -135 134 133 132 -128 129 135 132 -135 129 134 132 -173 133 152 134 -183 232 184 0 -139 137 16 138 -131 225 132 16 -139 138 0 137 -162 179 166 180 -990 914 125 970 -185 183 184 21 -136 127 126 0 -298 0 291 300 -160 163 165 157 -962 946 964 959 -634 635 982 980 -147 133 152 149 -149 152 146 173 -501 503 499 502 -26 218 0 217 -140 137 16 139 -136 138 16 137 -140 16 0 139 -527 519 601 602 -494 486 480 18 -147 152 0 146 -172 170 0 167 -17 1 175 171 -170 171 178 168 -489 490 158 148 -140 145 141 151 -195 180 181 22 -474 488 0 484 -494 495 216 142 -227 140 0 141 -534 601 602 591 -961 193 945 203 -174 167 172 164 -226 221 218 0 -137 151 0 139 -526 157 159 161 -143 148 492 493 -503 513 506 502 -143 142 148 494 -530 484 0 524 -623 644 662 82 -464 479 471 476 -492 493 0 143 -149 147 492 490 -471 476 470 469 -137 135 0 151 -328 30 363 322 -355 43 359 358 -142 210 154 155 -170 178 134 169 -149 173 154 210 -142 210 148 154 -338 243 334 339 -223 221 220 222 -143 26 210 216 -156 142 155 211 -201 194 203 27 -535 603 590 572 -180 187 181 22 -163 164 153 165 -194 961 929 203 -913 908 985 912 -349 504 355 353 -946 947 195 166 -202 209 211 155 -942 949 941 948 -60 485 474 473 -288 275 285 276 -158 153 0 160 -767 755 756 754 -175 178 134 171 -252 933 873 870 -618 604 911 116 -209 26 219 215 -490 489 493 148 -0 183 188 182 -148 149 146 154 -199 206 203 192 -171 167 172 174 -1 21 175 171 -174 164 172 153 -478 479 0 464 -210 149 148 154 -156 211 202 20 -223 222 220 219 -140 137 139 151 -173 134 175 150 -172 152 0 170 -147 151 0 152 +127 0 16 138 +145 139 0 151 +148 154 142 210 +147 141 133 149 +149 147 141 492 +970 914 125 977 +157 491 521 526 +148 149 154 210 +152 133 134 173 +160 159 157 165 +145 144 141 147 +96 566 686 687 +168 167 170 171 +197 194 201 521 +830 785 791 831 +138 0 16 139 +145 0 147 151 +246 241 29 247 +462 499 501 503 +175 184 185 222 +0 130 131 228 +488 0 484 489 +149 146 148 154 +135 133 134 152 +60 479 481 485 +160 153 0 165 +521 161 157 526 +161 521 522 526 +533 541 66 583 +457 445 63 558 +490 487 492 493 +592 587 9 611 +467 460 453 477 +187 183 182 188 +562 550 0 563 +137 139 140 151 +148 490 492 493 +60 474 484 486 +148 489 490 493 +145 141 140 151 +180 166 162 195 +216 142 143 494 +540 0 538 544 +194 197 201 203 +140 132 137 151 +523 491 157 526 +207 202 209 211 +924 916 919 938 +27 22 205 212 +489 148 18 493 +195 166 946 947 +185 183 1 187 +150 134 173 175 +142 156 155 525 +201 197 196 203 +464 471 476 479 +160 157 163 165 +226 130 224 229 +0 474 486 488 +134 129 135 169 +251 250 249 258 +487 0 492 493 +195 180 166 947 +225 130 226 234 +26 0 217 218 +1 162 17 186 +522 519 197 527 +26 218 219 220 +496 342 214 505 +0 158 160 524 +141 144 0 492 +170 167 0 172 +355 446 498 504 +134 133 150 173 +219 209 215 336 +930 15 920 931 +171 168 167 176 +132 131 130 225 +17 155 162 174 +173 154 17 174 +135 0 137 151 +149 147 146 152 +133 147 149 152 151 135 0 152 -526 161 522 521 -135 151 133 152 -534 552 533 602 -0 786 884 885 -187 22 191 181 -526 482 529 523 -169 129 128 0 -149 173 146 154 -187 177 182 183 -180 187 182 181 -523 157 526 491 -125 977 976 975 -252 190 933 253 -163 166 164 165 -990 986 970 125 -482 523 526 491 -485 538 0 475 -160 523 525 157 -490 149 146 148 -474 488 484 486 -505 344 330 356 -69 561 550 436 -233 229 231 0 -27 22 193 205 -175 171 134 173 -947 166 180 195 -146 153 0 158 -556 465 0 546 -143 149 492 148 -479 485 473 475 -537 476 477 469 -171 21 178 176 -170 178 169 168 -479 60 473 485 -520 519 602 534 -573 565 607 612 -591 600 603 19 -158 525 148 154 -0 994 894 898 -483 485 484 60 -531 482 530 529 -60 486 0 474 -536 513 459 537 -541 540 528 536 -959 964 165 958 -869 864 856 867 -164 165 0 153 -173 175 17 150 -183 188 182 187 -526 522 502 491 -217 227 0 141 -874 872 871 804 -17 171 175 173 -878 900 798 938 -64 535 514 515 -479 60 485 481 -594 595 0 598 -171 170 173 172 -179 1 176 177 -173 172 152 146 -23 926 24 517 -249 191 188 28 -167 170 0 168 -296 332 295 334 -1 177 183 21 -170 135 0 169 -605 614 606 604 -482 526 502 491 -193 22 181 205 -187 22 186 208 -864 874 871 804 -232 241 28 223 -179 167 171 174 -175 185 184 21 -171 168 170 167 -0 183 182 177 -935 117 876 936 -134 169 129 135 -219 150 175 222 -62 507 499 497 -26 215 216 0 -231 247 235 0 -800 911 765 793 -257 325 252 319 -968 922 616 24 -182 188 189 191 -840 887 865 811 -918 931 872 799 -903 882 901 891 -201 521 522 197 -163 162 174 166 -211 207 209 202 -220 239 223 240 -227 225 0 140 -170 169 0 168 -152 170 134 135 -134 170 169 135 -180 1 179 177 -179 1 171 176 -247 246 236 0 -171 167 170 172 -174 162 155 17 -153 172 0 164 -153 146 0 172 -182 189 181 191 -154 153 172 146 -172 146 0 152 -154 172 173 146 -17 1 174 162 -174 155 163 154 -261 280 245 0 -176 168 171 167 -891 877 901 892 -878 797 805 880 -163 166 174 164 -133 134 173 150 -130 224 132 225 -370 368 369 357 -149 150 133 173 +151 0 147 152 +147 0 146 152 +151 147 133 152 +160 0 159 165 +148 142 143 210 +156 142 155 211 +156 491 500 507 +513 506 502 520 +153 0 164 172 +635 634 636 980 +146 149 148 490 +158 146 148 490 +27 194 201 203 +153 160 163 165 +18 158 489 524 +963 962 161 965 +329 331 2 354 +484 0 474 485 +489 18 486 493 +61 481 482 483 +563 550 0 575 +147 149 146 490 +186 1 162 187 +18 148 142 494 +502 491 482 526 +176 168 167 956 +358 355 498 504 +466 464 0 471 +495 494 480 500 +334 338 339 340 +260 319 326 333 +172 167 164 174 +522 491 502 526 +235 0 236 239 +951 952 119 972 +502 520 522 532 +502 513 520 532 +951 119 946 972 +502 522 526 532 +597 601 527 963 +162 22 186 187 +521 197 161 522 +121 0 123 973 +134 171 173 175 +854 852 0 855 +581 0 578 653 +160 153 163 525 +601 519 534 602 +972 120 952 974 +970 960 969 977 +597 0 598 966 +165 0 159 959 +512 25 506 520 +154 163 153 525 +481 479 475 485 +892 878 877 901 +166 163 164 174 +687 669 678 775 +959 159 161 965 +177 1 21 183 +0 153 164 165 +229 130 224 230 +963 601 927 967 +966 0 121 971 +209 202 155 211 +179 162 1 180 +224 132 130 225 +128 0 135 169 +965 597 963 966 +173 17 150 175 149 133 152 173 -170 171 134 178 +541 536 528 602 +185 1 17 186 171 170 134 173 -17 1 171 174 -17 174 171 173 -173 174 171 172 -154 173 172 174 -17 174 173 154 -162 155 163 174 -0 177 950 176 -257 320 325 319 -179 176 171 167 -226 233 221 0 -182 191 181 187 -1 21 171 176 -118 943 935 893 -162 1 179 180 -176 1 21 177 -0 21 177 176 -942 180 948 181 -292 298 290 35 -249 208 191 28 -29 241 249 28 -118 943 873 935 -936 117 876 874 -0 870 933 253 -162 1 174 179 -162 179 174 166 -166 179 174 164 -179 167 174 164 -965 596 0 159 -179 176 950 177 -950 948 947 180 -520 527 519 522 -966 965 971 963 -879 936 876 874 -930 196 199 198 -879 874 864 878 -259 260 258 333 -182 188 191 187 -878 938 798 797 -353 355 354 509 -960 929 969 927 -972 951 952 120 -0 262 274 273 -864 798 874 804 -202 162 22 186 -874 798 872 804 -0 21 183 177 -971 120 974 960 -972 946 951 120 -344 496 342 0 -922 921 976 968 -223 222 184 231 -1 185 175 21 -1 183 185 21 -217 227 141 133 -144 490 487 492 -186 1 187 185 -1 177 187 183 -1 187 185 183 -184 185 175 222 -1 185 17 175 -162 187 22 186 -185 187 186 28 -162 187 180 22 -186 1 185 17 -162 1 186 17 -155 162 186 17 -194 27 193 203 -197 203 196 201 -180 187 177 182 +222 229 184 231 +221 229 231 233 +177 21 0 183 +491 508 521 522 +0 127 16 228 +172 171 167 174 +798 805 864 878 +170 169 168 178 +175 134 171 178 +1 21 176 177 +798 797 805 878 +246 29 242 261 +948 942 941 949 +152 0 146 172 +927 601 19 967 +202 155 186 209 +204 163 157 964 +162 1 17 174 +312 31 257 320 +135 134 169 170 +166 162 163 174 +179 1 177 180 +154 146 172 173 +146 153 154 172 +146 152 172 173 +152 135 0 170 +0 153 146 172 +0 152 170 172 +171 167 170 172 +169 168 0 170 +167 0 168 170 +210 209 142 216 +203 27 193 206 +169 0 135 170 +171 17 1 174 +174 162 1 179 +189 181 182 191 +206 192 199 324 +155 17 162 186 +174 166 162 179 +920 918 113 924 +382 372 381 383 +172 152 170 173 +33 0 284 287 +144 147 490 492 +134 175 224 230 +174 171 167 179 +171 21 1 175 +183 182 177 187 +164 153 172 174 +163 153 164 174 +172 153 154 174 +163 154 153 174 +173 171 172 174 +172 154 173 174 +1 171 174 179 +17 171 1 175 +170 168 171 178 +179 166 162 180 +170 134 169 178 +890 882 889 903 +168 176 0 956 +533 536 541 602 +895 893 0 936 +908 122 907 985 +182 177 0 183 +181 22 187 191 +925 363 198 931 +35 292 290 298 +0 118 933 935 +176 21 0 177 +932 118 873 933 +188 0 182 189 +864 804 798 874 +962 959 161 965 +177 180 948 950 +164 166 174 179 +174 167 164 179 +965 959 0 971 +946 942 195 947 +176 171 1 179 +959 958 0 972 +118 932 873 943 +537 477 476 539 +156 20 202 204 +284 244 33 287 +354 353 2 355 +320 317 312 321 +27 205 206 212 +951 944 941 954 +182 187 188 191 +521 204 157 964 +950 949 0 955 +193 22 27 195 +29 246 0 261 +487 144 490 492 +870 875 876 935 +980 634 979 982 +183 21 0 184 +931 323 199 937 +28 185 183 232 +183 1 21 185 +175 21 1 185 +184 21 175 185 +184 183 21 185 +1 17 175 185 +182 180 177 187 180 1 177 187 -162 1 180 187 -162 1 187 186 -118 933 873 932 -191 190 189 181 -261 242 258 249 -327 330 213 212 -187 208 186 28 -869 874 871 864 -890 887 882 888 -155 162 202 186 -292 293 295 282 -187 191 28 188 -331 40 324 200 -0 182 188 189 -902 896 899 897 -899 900 938 113 -296 339 35 0 -197 194 203 201 -339 295 35 293 -29 249 188 28 -0 254 261 248 -134 178 230 129 -227 140 133 132 -386 0 385 389 -506 508 509 504 -799 918 931 924 -27 212 205 206 -290 299 300 41 -520 519 25 522 -210 26 217 150 -532 602 528 536 -967 966 601 598 -520 461 513 506 -605 24 608 614 -27 195 193 22 -949 941 954 951 -195 162 166 180 -526 161 527 522 -242 237 245 244 -919 795 924 938 -193 205 181 190 -202 27 204 20 -865 861 857 862 -475 538 544 476 -27 204 195 22 -204 162 202 155 -247 241 223 239 -644 643 637 641 -194 961 195 946 -96 566 687 621 -373 366 374 420 -88 415 0 87 -750 742 743 741 -674 673 0 676 -115 618 923 908 -198 200 40 518 -562 550 573 560 -40 328 323 363 -204 162 22 202 -27 204 22 202 -203 206 193 192 -196 200 201 203 -220 215 26 0 -318 324 327 331 -774 772 771 768 -373 427 50 420 -101 753 746 102 -198 40 200 199 -0 118 935 893 -522 527 519 197 -196 25 201 200 +182 181 180 187 +330 344 345 353 +277 276 278 285 +296 334 339 340 +185 17 175 219 +491 156 500 523 +795 797 798 938 +19 24 926 968 +154 173 17 210 +608 605 24 614 +185 28 183 187 +195 162 22 204 +28 185 186 187 +186 185 1 187 +244 242 243 258 +226 221 0 233 +232 223 231 247 +221 226 229 233 +188 28 183 232 +187 28 183 188 +966 965 0 971 +220 219 215 336 +274 272 262 283 +258 244 242 261 +324 319 318 326 +188 187 28 191 +23 196 198 518 +862 859 857 865 +323 198 363 931 +319 252 260 326 +274 262 0 281 +296 0 35 297 +298 297 0 299 +872 804 871 874 +125 988 989 993 +804 864 871 874 +26 215 0 220 +186 155 17 209 +225 131 130 228 +220 221 222 223 +213 200 201 509 +185 223 28 336 +388 48 369 392 +880 882 887 888 +259 248 258 260 +970 120 960 974 +852 107 0 855 +605 604 606 761 +205 193 27 206 +203 200 201 206 +203 199 200 206 +798 864 874 878 +798 804 872 874 +918 15 117 937 +942 932 944 961 +360 516 559 606 +242 243 335 337 +906 114 787 910 +143 26 210 216 +500 61 62 507 +155 156 202 204 +250 191 205 251 +202 162 155 204 +928 944 945 961 +163 157 156 204 +429 366 374 763 197 196 25 201 -175 222 150 224 -437 689 430 426 -2 332 331 329 -199 40 200 324 -328 322 314 30 -6 357 363 322 -759 366 747 4 -598 633 0 594 -678 764 680 696 -68 561 572 609 -211 214 209 207 -375 357 369 391 -330 327 213 331 -201 522 25 197 -494 142 148 18 -149 150 173 210 -232 29 247 0 -330 332 340 334 -208 191 22 205 -31 304 312 264 -186 208 22 202 -186 207 208 202 -322 357 328 314 -508 356 509 504 -359 362 368 370 -210 26 219 209 -203 200 206 199 -239 240 220 0 -155 186 209 17 -231 247 223 239 -231 247 239 235 -121 971 974 960 -522 506 508 25 -157 204 156 163 -163 204 156 155 -162 204 163 155 -163 166 204 162 -161 962 965 963 -600 967 601 598 -521 161 522 197 -327 250 212 205 -202 212 207 208 -141 217 133 149 -492 147 144 490 -210 150 217 149 -262 267 283 263 -29 241 242 249 -189 191 188 254 -287 237 284 244 -239 238 240 0 -29 246 242 241 -104 822 809 820 -214 216 209 215 -211 216 209 214 -209 186 219 17 -143 142 210 148 -142 209 210 155 -336 207 186 209 -134 230 224 129 -493 494 0 143 -219 26 150 218 -202 207 209 186 -201 20 27 213 -155 209 210 17 -143 210 149 148 -155 210 154 17 -210 173 154 17 -230 130 129 0 -276 285 277 0 -219 150 17 175 -210 150 173 17 -217 150 133 149 -284 243 338 339 -280 278 245 0 -356 499 508 507 -149 490 492 148 -210 26 150 219 -495 480 0 62 -143 26 217 210 -26 217 0 143 -412 0 380 414 -347 43 447 352 -356 507 508 20 -213 509 508 356 -331 200 354 40 -208 212 22 202 -20 213 212 27 -213 206 212 27 -201 213 27 206 -368 362 357 370 -391 357 369 368 -389 48 395 371 -396 399 400 47 -752 759 747 4 -496 344 497 0 -251 191 254 249 -241 238 240 239 -339 295 334 296 -16 127 228 0 -241 246 238 247 -130 228 234 225 -213 212 505 20 -287 288 33 285 -218 222 221 226 -227 226 225 224 -227 140 132 225 -214 215 209 207 -223 185 184 222 -185 219 175 222 -278 244 288 280 -131 228 127 0 -224 227 132 225 -219 26 218 220 +604 605 606 614 +17 173 150 210 +963 927 960 967 +773 116 619 910 +196 197 25 519 +281 275 274 283 +116 617 77 620 +431 0 51 692 +432 438 562 689 +705 45 703 709 +364 309 308 376 +375 310 309 376 +240 220 215 336 +669 667 566 687 +196 200 201 203 +645 82 637 650 +757 752 4 759 +209 207 211 214 +0 33 284 339 +205 250 251 326 +205 190 192 326 +192 252 325 326 +22 191 205 208 +560 573 607 609 +757 366 758 759 +188 28 29 249 +196 25 23 519 +209 155 17 210 +209 142 155 210 +199 198 196 200 +199 40 198 200 +291 3 294 300 +495 214 211 496 +186 22 202 208 +423 54 405 449 +276 275 274 281 +210 142 143 216 +150 210 26 219 +209 186 207 336 +17 186 209 219 +192 199 203 206 +203 193 192 206 +130 225 228 234 +854 0 108 860 +606 605 608 614 +162 155 186 202 +22 162 186 202 +21 175 178 230 219 218 150 222 -134 175 150 224 -221 220 218 0 -237 284 337 0 -337 343 240 0 -224 226 225 130 -184 222 175 230 -219 26 220 215 -284 237 337 242 -230 229 130 0 -183 188 232 0 -33 0 286 35 -150 26 217 218 -230 129 178 0 -133 134 224 132 -16 228 225 0 -178 21 175 230 -227 140 141 133 -218 222 220 221 -218 219 220 222 -129 130 224 132 -239 235 236 0 -222 218 150 224 -130 234 226 225 -129 224 134 132 -247 29 246 0 -189 190 251 253 -231 247 232 223 -223 185 222 219 -237 337 238 0 -21 184 230 0 -218 222 226 224 -226 234 233 0 -21 230 178 0 -221 222 223 231 -231 222 184 229 +913 906 912 985 +195 166 162 204 +162 166 163 204 +156 155 163 204 +522 520 519 527 +522 197 161 527 +521 508 201 522 +157 160 523 529 +190 181 191 205 +191 181 22 205 +181 190 193 205 +181 193 22 205 +193 190 192 205 +22 193 27 205 +17 209 210 219 +349 345 344 353 +259 281 283 288 +212 207 341 505 +318 329 331 332 +6 44 360 516 +483 60 484 486 +0 214 215 216 +143 0 26 216 +215 26 0 216 +184 21 0 230 +209 215 26 219 +206 201 27 213 +455 453 460 463 +27 201 20 213 +508 213 201 509 +223 184 185 232 +205 22 208 212 +208 22 202 212 +154 17 155 210 +142 154 155 210 +173 154 149 210 +218 26 0 220 +173 149 150 210 +206 200 201 213 +334 243 293 339 +132 140 225 227 +50 418 404 424 +338 284 243 339 +490 489 487 493 +299 297 0 387 +396 391 5 397 +269 3 271 304 +857 852 858 860 +208 202 207 212 +520 519 25 522 +353 356 504 509 +210 149 150 217 +210 150 26 217 +376 375 371 397 +206 27 212 213 +212 27 20 213 +410 409 412 422 +421 374 54 422 +504 499 503 506 +550 0 436 562 +257 260 263 319 +0 183 184 232 +804 311 320 871 +320 319 317 325 +317 319 324 325 +344 349 353 356 +214 209 207 215 +0 143 26 217 +850 842 861 865 +248 259 258 280 +856 311 804 871 +241 238 239 247 +317 316 313 329 +249 29 254 261 +26 143 210 217 +0 131 127 228 +140 0 16 225 +16 131 225 228 +150 133 224 227 133 134 150 224 -224 227 133 132 -184 229 230 0 -131 130 132 225 -28 185 232 223 -218 226 227 224 -150 218 227 224 -150 227 133 224 -150 227 217 133 -150 217 227 218 -217 218 0 227 -227 226 218 0 -225 226 227 0 -292 275 291 286 -228 130 131 225 -228 225 131 16 -127 228 131 16 -232 185 184 223 -188 29 232 0 -221 222 231 229 -230 222 175 224 -134 175 224 230 -230 222 224 229 -184 222 230 229 -225 228 234 0 -229 231 221 233 -185 232 184 183 -185 28 232 183 -183 188 28 232 -188 29 28 232 -229 233 221 226 -231 235 233 0 -229 234 233 226 -235 233 221 231 -278 288 287 285 -829 839 811 886 -253 190 251 252 -221 239 220 0 -281 288 259 280 -287 285 277 278 -238 239 236 0 -232 29 28 241 -220 240 215 0 -223 239 220 221 -518 509 25 200 -361 322 802 309 -241 246 242 238 -251 205 191 250 -935 875 873 870 -286 0 298 35 -253 256 260 248 -247 241 232 223 -0 188 29 254 -186 28 208 336 -850 841 840 13 -246 236 238 247 -247 29 232 241 -247 29 241 246 -0 188 254 189 -33 287 284 244 -248 260 258 259 -0 278 281 280 -0 266 273 268 -285 33 287 0 -231 239 223 221 -221 235 239 0 -361 6 801 322 -246 236 279 238 -342 341 340 338 -244 287 245 278 -261 249 254 29 -253 252 251 260 -272 283 294 264 -342 330 340 341 -304 302 312 294 -275 286 285 0 -288 244 259 280 -270 265 271 305 -320 319 257 312 -278 244 280 245 -241 247 238 239 -219 336 186 209 -209 215 336 207 -0 904 905 903 -388 392 369 42 -255 267 262 263 -311 321 320 312 -186 336 208 207 -296 297 346 0 -33 284 339 293 -0 109 266 108 -220 215 336 219 -220 240 223 336 -264 266 273 262 -281 267 280 259 -305 858 265 32 -876 875 868 871 -243 341 338 334 -791 831 830 785 -244 237 284 242 -865 840 811 850 -247 236 238 239 -109 869 856 867 -31 311 312 304 -250 205 191 208 -0 118 934 933 -189 190 191 251 -276 275 285 0 -34 277 287 0 -237 287 284 0 -254 191 188 249 -254 249 188 29 -257 260 252 256 -267 248 259 260 -212 250 208 205 -249 250 191 208 -335 336 208 28 -294 290 300 302 -292 294 291 283 -850 865 818 811 -248 258 251 254 -866 880 805 881 -244 288 287 278 -340 339 334 296 -697 51 417 53 -258 242 261 244 -261 242 245 244 -853 311 304 265 -369 391 48 371 -244 237 245 287 -295 334 318 333 -295 318 316 282 -867 864 856 859 -35 298 290 297 -241 223 336 28 -336 185 223 219 -336 219 186 185 +175 185 219 222 +132 130 129 224 +133 132 134 224 +28 188 29 232 +140 133 141 227 +341 338 342 343 +183 0 188 232 +259 280 281 288 +132 129 134 224 +150 175 219 222 +241 239 223 247 +175 150 134 224 +0 141 217 227 +253 251 189 254 +256 252 253 260 +220 0 221 239 +224 129 134 230 +225 0 16 228 +224 130 129 230 +222 221 218 226 +127 131 16 228 +221 218 220 222 +220 218 219 222 +223 221 222 231 +184 229 0 231 +224 222 218 226 +222 184 185 223 +806 796 807 808 +222 185 219 223 +241 240 238 337 +219 220 222 223 +222 218 150 224 +226 222 221 229 +223 185 28 232 +226 224 222 229 +217 141 133 227 +222 150 175 224 +221 0 218 226 +140 132 133 227 +217 133 150 227 +224 133 132 227 +225 224 132 227 +140 141 0 227 +218 0 217 227 +225 140 0 227 +226 0 218 227 +226 225 0 227 +218 224 226 227 +226 224 225 227 +224 218 150 227 +229 224 222 230 +178 175 134 230 +229 222 184 230 +228 225 0 234 +225 226 0 234 +29 188 0 232 +184 223 231 232 +229 0 130 230 +229 184 0 230 +21 184 175 230 +129 130 0 230 +0 229 130 234 +0 226 233 234 +239 238 236 247 +333 243 293 334 +0 184 231 232 +191 188 189 254 +231 229 0 233 +0 276 277 285 +233 229 0 234 +238 242 237 246 +239 220 0 240 +248 0 253 256 +0 231 233 235 +241 223 232 247 +231 221 233 235 +233 221 0 235 +254 251 249 258 +0 238 239 240 +312 294 302 316 +235 221 0 239 +238 236 0 239 +246 238 241 247 +188 29 0 254 +231 223 221 239 +266 264 262 273 +236 238 246 247 +250 243 249 258 +251 249 191 254 +223 220 221 239 +338 243 335 341 +261 258 244 280 +275 286 291 292 +498 461 358 506 +235 231 221 239 +252 251 190 253 +862 859 863 867 +29 188 249 254 +246 29 0 247 +900 117 874 918 +239 235 231 247 +28 188 191 249 +338 337 0 343 +191 190 205 251 +29 241 242 249 +335 28 241 336 +290 297 298 299 +278 245 244 280 +379 378 0 380 +240 239 223 241 +303 271 289 304 +236 235 239 247 +248 258 261 280 +36 265 271 303 +191 189 190 251 +261 244 245 280 +219 186 209 336 +0 235 236 247 +246 0 236 247 +235 0 231 247 +215 209 207 336 +239 223 220 240 223 240 241 336 -557 440 57 70 -28 336 186 185 -321 30 320 317 -253 251 254 248 -264 269 272 273 -275 288 281 276 -0 254 253 189 -189 251 254 253 -189 191 254 251 -248 258 254 261 -29 242 261 249 -0 266 262 273 -29 242 246 261 -271 265 36 305 -0 254 29 261 -246 29 261 0 -336 335 208 207 -246 261 245 0 -284 243 293 244 -238 279 237 0 -288 278 281 276 -810 13 818 811 -312 321 317 316 -991 898 988 897 -321 30 39 311 -303 39 311 321 -321 311 304 312 -44 6 367 357 -0 869 868 109 -0 867 869 109 -310 375 371 376 -311 30 320 321 -0 267 262 255 -0 272 269 273 -102 754 752 748 -400 47 395 396 -0 256 248 267 -242 243 244 258 -858 812 265 32 -248 258 260 251 -253 260 251 248 -853 856 265 858 -249 243 258 250 -258 250 251 249 -242 243 258 249 -266 109 853 108 +220 215 0 240 +240 238 239 241 +320 312 311 321 +253 248 251 254 +249 188 191 254 +29 28 232 241 +28 223 232 241 +208 205 212 250 +0 29 232 247 +232 29 241 247 +231 0 232 247 +244 237 242 245 +262 264 272 273 +249 191 208 250 +293 284 33 339 +272 264 269 273 +291 290 298 300 +207 186 208 336 +237 0 238 279 +40 324 329 331 +327 206 213 331 +200 206 324 331 +391 371 375 397 +213 206 200 331 +440 57 433 443 +795 796 789 800 +335 241 242 337 +386 385 41 388 +219 185 186 336 +280 259 244 288 +242 244 245 261 +282 259 263 283 +255 31 109 868 +295 35 290 297 +0 267 280 281 +328 362 40 370 +257 868 870 875 +252 256 253 870 +265 39 303 306 +249 254 258 261 +868 256 257 870 +246 245 0 261 +869 856 864 871 +208 191 205 250 +254 248 251 258 +258 243 293 333 +454 452 451 457 +34 0 237 279 +293 259 258 333 +919 916 915 938 +915 899 901 938 +284 0 237 287 +266 269 264 273 +285 33 286 288 +892 0 879 936 +244 278 280 288 +283 281 275 288 +278 277 285 287 +253 189 0 254 +189 188 0 254 +0 248 253 254 +284 243 337 338 +236 238 0 279 +359 350 352 368 +242 29 249 261 +281 280 278 288 +855 107 849 861 263 260 256 267 -327 341 330 212 -262 283 272 264 -275 291 286 0 -0 854 268 270 -271 0 3 269 -255 263 256 267 -255 263 264 31 -255 263 262 264 -264 269 3 272 -37 0 301 36 -265 39 311 303 -245 237 279 34 -264 273 272 262 -0 105 834 838 -262 267 281 283 -271 0 269 270 -0 838 834 824 -236 246 279 0 -88 89 0 711 -854 860 108 858 -255 257 256 263 -283 267 281 259 -208 341 207 335 -0 256 267 255 -264 266 262 255 -0 255 262 266 -0 109 255 266 -255 109 31 266 -31 266 264 255 -271 270 853 265 -304 303 289 271 -261 248 280 0 -306 39 303 310 -0 272 3 269 -238 236 279 0 -243 335 337 338 -19 616 603 24 -800 795 796 802 -274 283 272 262 -801 795 803 799 -297 299 290 41 -279 246 245 0 -38 306 36 37 -850 857 818 865 -53 692 0 698 -36 0 289 271 +260 248 256 267 +276 274 0 281 +31 263 264 312 +294 302 304 312 +30 317 320 321 +312 302 304 321 +311 304 303 321 +304 302 303 321 +311 30 320 321 +829 806 790 886 +242 249 258 261 +258 254 248 261 +254 0 248 261 +863 0 867 869 +0 109 867 869 +880 866 865 881 +262 255 263 264 +256 248 0 267 +253 252 251 260 +248 253 251 260 +0 271 36 305 +253 248 256 260 +258 248 251 260 +0 255 256 267 +207 208 212 341 +254 29 0 261 +268 0 269 273 +774 768 771 781 +857 850 861 865 +263 255 31 264 +263 256 255 267 +271 3 0 289 +298 290 299 300 +745 93 102 748 +327 324 206 331 +285 0 275 286 +271 0 270 305 +755 754 94 756 +845 841 847 848 +272 262 273 274 +38 0 36 305 +275 272 283 291 +108 109 0 266 +109 255 0 266 +31 255 109 266 +125 970 977 986 +268 269 266 273 +264 262 272 283 +266 262 0 273 +267 259 248 280 +266 108 109 853 +268 0 108 854 +272 274 275 283 +312 263 282 319 +266 0 268 273 +275 274 0 276 +237 238 246 279 +269 0 270 271 +272 0 3 291 +292 35 286 298 +267 262 263 283 +329 318 316 390 +281 274 262 283 +281 267 259 283 +264 255 31 266 +263 259 260 267 +260 259 248 267 +303 302 315 321 +753 752 815 821 +868 109 0 869 +760 813 807 815 +854 108 858 860 +307 38 37 308 +429 76 430 694 +860 857 855 861 +328 322 30 363 0 108 266 268 -0 305 817 852 -854 852 858 270 -305 852 858 32 -274 272 275 0 -346 390 296 332 -265 311 304 303 -208 250 341 335 +845 111 836 848 +850 847 841 851 +264 3 269 304 +0 3 269 272 +878 863 864 879 +274 0 272 275 +25 508 506 522 +262 267 281 283 +346 0 387 393 +273 0 272 274 +3 264 269 272 33 0 285 286 -304 289 3 271 -276 274 275 0 -248 280 267 259 -34 237 279 0 -248 258 280 259 -262 273 272 274 -246 279 237 238 -386 299 387 41 -25 509 201 200 -298 0 297 35 -288 285 275 286 -290 300 302 41 -292 295 290 282 -272 3 291 0 -817 106 107 818 -291 0 3 300 -279 245 34 0 -245 279 237 246 -300 0 3 289 -34 278 277 0 -0 849 855 107 -332 295 334 318 -342 343 338 0 +0 37 36 301 +35 0 33 286 +270 0 268 854 +304 31 264 312 +238 236 246 279 +273 262 0 274 +342 338 0 343 +292 283 282 294 +389 48 49 395 +245 246 0 279 +0 246 236 279 +0 34 245 279 +506 25 358 509 +297 290 41 299 +289 0 36 301 +246 245 237 279 +290 292 291 298 +277 0 34 278 +276 0 277 278 +293 35 295 339 +148 149 143 492 +278 276 0 281 +284 244 243 293 +289 3 0 300 +301 289 0 385 +271 0 36 289 +288 259 244 293 +244 259 258 293 +293 33 35 339 259 263 260 282 -267 281 280 0 -267 262 281 0 -0 281 274 262 -243 258 293 244 -868 257 256 255 -244 284 243 242 -327 318 334 333 -244 288 33 287 -271 265 303 36 -327 331 206 213 -351 43 359 355 -292 291 290 298 -248 258 261 280 -457 63 498 461 -330 332 327 331 -340 330 344 345 -289 0 3 271 -0 278 276 281 -0 281 276 274 -275 281 274 276 -271 0 270 305 -344 330 353 345 -365 366 374 372 -353 348 349 345 -264 304 312 294 -321 328 313 314 -40 323 199 198 -38 817 32 813 -339 33 35 0 -249 335 242 243 -260 326 251 333 -337 338 343 0 -2 393 42 351 -332 2 390 329 -272 291 275 0 -283 291 292 275 -283 292 282 259 -346 345 2 332 -384 0 389 301 -214 215 343 0 -42 394 387 388 -272 294 3 264 -272 291 294 283 -327 333 334 250 -287 277 285 0 -278 287 245 34 -296 345 340 0 -399 0 400 47 -278 288 285 276 -275 283 281 288 -283 288 259 281 -288 293 292 259 -288 244 293 259 -316 319 317 312 -388 48 389 371 -301 303 289 315 -497 462 0 456 -293 292 33 288 -33 293 35 292 -244 293 33 288 -33 284 293 244 -293 258 259 244 -303 36 289 271 -23 24 515 517 -391 367 5 365 -343 215 240 0 -272 275 291 283 -300 299 385 41 -283 288 292 259 -283 292 288 275 -288 275 292 286 -33 288 292 286 -33 286 292 35 -413 373 381 372 -294 283 282 263 -855 857 860 852 -272 291 3 294 -264 283 294 263 -290 294 291 292 -282 294 290 292 -282 294 292 283 -36 0 271 305 -849 851 847 850 -821 815 307 377 -301 36 289 303 -315 301 303 310 -31 320 257 312 -250 335 208 249 -357 370 362 328 -292 293 35 295 -340 338 339 0 -337 242 238 241 -385 386 389 388 -304 265 303 271 -296 35 297 0 -297 298 290 299 -298 0 299 297 -47 0 400 395 -312 316 282 294 -614 613 604 605 -316 321 313 302 -319 320 325 317 -290 295 35 297 -297 295 35 296 -335 341 243 250 -33 339 35 293 -299 0 298 300 -286 0 291 298 -290 291 300 298 -290 300 291 294 -300 3 291 294 -250 326 251 205 -385 388 389 315 -383 382 381 372 -548 589 576 549 -303 311 304 321 -331 324 206 200 -424 416 0 411 -401 448 394 0 -380 0 378 379 -760 309 814 308 -385 301 289 315 -316 318 390 329 -313 317 329 328 -268 854 108 270 -31 311 320 312 -294 304 3 264 -294 302 3 304 -620 619 96 773 -881 796 789 797 -853 858 108 856 -0 108 854 860 -324 329 318 317 -264 304 3 269 -520 25 519 512 -249 335 208 28 -499 491 508 507 -302 300 3 289 -294 300 3 302 -313 369 315 314 -332 318 327 331 -306 309 310 308 -206 327 212 205 -306 305 265 32 -38 305 306 32 -305 306 36 38 -305 265 36 306 -265 303 36 306 -265 39 303 306 -385 315 289 302 -377 0 383 307 -400 396 395 48 -379 745 748 749 -37 0 38 307 -398 47 421 410 -263 319 257 260 -38 306 37 308 -38 308 37 307 -94 704 757 748 -302 300 289 385 -808 800 766 765 -620 116 773 75 -694 758 75 756 -306 39 310 309 -306 303 36 310 -506 509 358 504 -922 924 916 613 -781 627 794 619 -391 48 392 369 -397 5 421 365 -429 374 428 763 -775 83 86 677 -724 716 0 717 -303 310 39 314 -310 384 37 376 -309 310 314 39 -833 838 832 834 -303 301 36 310 -263 312 257 319 -508 20 201 213 -282 290 294 316 -312 302 316 294 -809 753 819 101 -118 935 873 933 -260 319 326 333 -378 0 381 377 -704 702 695 697 -606 604 762 761 -752 747 815 377 -751 97 770 92 -31 312 257 263 -31 312 263 264 -264 312 263 294 -302 315 303 321 -977 960 969 967 -475 481 538 476 -321 315 314 313 -329 316 318 317 -318 326 319 333 -293 259 258 333 -41 388 385 315 -410 0 408 399 -333 327 326 250 -334 333 243 250 -315 303 289 302 -41 386 385 388 -316 282 319 312 -494 216 143 142 -353 355 349 348 303 310 314 315 -282 295 290 316 -206 326 327 205 -495 214 496 0 -318 324 319 326 -348 345 346 0 -316 282 318 319 -496 214 495 211 -40 323 324 199 -243 333 258 250 -309 314 322 39 -40 328 317 323 -42 392 394 388 -997 944 939 928 -771 768 755 781 -327 330 334 332 -450 439 440 57 -320 317 319 312 -326 250 327 205 -258 250 333 251 -263 312 319 282 -341 207 335 343 -257 319 252 260 -316 318 317 319 -251 326 190 205 -303 315 314 321 +260 252 251 326 +34 0 245 278 +267 248 0 280 +261 0 248 280 +261 245 0 280 +267 0 262 281 +280 267 259 281 +275 285 286 288 +292 290 282 295 +208 28 249 335 +280 278 0 281 +327 318 324 331 +335 243 250 341 +391 365 5 397 +284 237 244 287 +33 35 286 292 +243 244 258 293 +0 452 454 458 +335 337 338 343 +332 329 2 390 +337 243 335 338 +375 365 391 397 +212 250 327 341 +237 244 242 284 +242 244 243 284 +270 268 108 854 +293 292 282 295 +292 35 290 295 +35 292 293 295 +207 335 208 341 +495 0 214 496 +302 3 294 304 +334 250 243 341 +212 208 250 341 +302 289 3 304 +357 361 367 375 +350 435 44 511 +305 32 265 306 +281 276 275 288 +281 278 276 288 +285 276 278 288 +285 275 276 288 +285 278 287 288 +287 33 285 288 +287 278 244 288 +288 244 33 293 +292 288 33 293 +292 33 35 293 +329 324 318 331 +251 260 326 333 +35 295 296 297 +288 33 286 292 +283 259 288 292 +297 0 35 298 +292 282 259 293 +302 290 41 316 +389 371 48 395 +292 286 291 298 +286 275 288 292 +289 271 3 304 +212 206 213 327 +321 313 314 328 +314 303 315 321 +445 451 452 457 +295 290 282 316 +313 314 315 321 +283 275 291 292 +275 283 288 292 +201 200 25 509 +264 263 283 294 +263 282 283 294 +272 264 283 294 +272 3 264 294 +3 272 291 294 +291 272 283 294 +290 292 282 294 +292 290 291 294 +306 37 38 308 +291 283 292 294 316 317 313 321 -302 315 321 313 -841 837 839 13 -841 835 837 13 -822 831 98 830 -800 795 802 801 -312 321 316 302 -333 326 251 250 -194 195 961 193 +309 39 310 314 +357 369 375 391 +43 351 347 355 +334 293 295 339 +106 107 817 818 +32 813 817 818 +317 318 316 329 +40 200 324 331 +419 46 50 420 +752 4 748 757 +752 747 4 759 +38 37 0 307 +315 313 41 388 +332 327 318 334 +334 327 250 341 +250 208 335 341 +297 35 290 298 +291 0 3 300 +0 298 299 300 +299 290 41 300 +320 30 804 872 +382 376 372 383 +381 0 382 383 +316 41 313 390 +48 392 394 401 +707 0 708 743 +315 289 301 385 +312 311 31 320 +334 330 327 341 +31 311 304 853 +385 299 0 386 +48 369 371 388 +0 289 300 385 +314 309 39 322 +289 302 303 304 +619 617 116 620 +0 87 88 415 +369 313 42 370 +294 263 282 312 +326 250 251 333 +265 36 271 305 +817 813 816 818 +300 3 294 302 +300 289 3 302 +300 294 290 302 +300 290 41 302 +369 315 371 388 +444 56 445 447 +282 263 260 319 +258 250 243 333 +312 317 316 321 +740 103 101 820 +303 265 271 304 +305 38 32 306 +36 38 305 306 +305 265 36 306 +303 36 265 306 +100 806 769 829 +36 37 38 306 +207 215 336 343 +369 314 357 375 +685 684 0 698 +42 346 387 393 +380 373 4 381 +920 914 15 969 +760 759 100 808 +306 39 303 310 +39 306 309 310 +306 303 36 310 +308 306 37 310 +44 350 359 368 +306 308 309 310 +708 93 703 744 +395 49 0 400 +695 96 687 771 +357 314 322 375 +755 781 792 794 +759 364 366 766 +30 323 328 363 +326 319 318 333 +875 871 868 876 +354 200 509 518 +13 810 106 819 +361 322 309 375 +362 44 359 368 +695 686 96 756 +807 760 100 808 +443 57 442 444 +405 398 54 422 +914 928 15 969 +330 212 327 341 +72 565 570 612 +335 208 28 336 +499 491 502 508 +2 351 354 355 +632 74 78 635 +761 361 801 802 +769 788 793 794 +322 30 314 328 +302 313 315 321 +31 257 263 312 +729 0 91 730 +311 31 304 312 +25 197 201 522 +327 213 330 331 +257 252 260 319 +759 747 364 760 +804 798 803 805 +319 317 312 320 +333 293 295 334 +326 318 327 333 +382 0 47 395 +258 259 260 333 +366 374 420 429 +303 301 310 315 +303 289 301 315 +302 289 303 315 +313 42 41 388 +5 398 396 421 +0 386 49 389 +258 251 250 333 +282 295 316 318 +251 258 260 333 +551 69 553 561 +296 332 334 340 +41 313 302 316 +401 396 48 403 +869 864 863 879 +321 30 317 328 +803 795 796 805 +369 371 375 391 +416 411 0 424 +381 380 373 413 +28 241 249 335 +311 39 30 321 +760 364 766 802 +312 282 316 319 325 319 324 326 -321 317 313 328 -751 770 733 92 -913 910 911 114 +317 312 316 319 +318 317 316 319 +260 282 319 333 +687 621 669 774 +369 48 371 391 +40 199 198 323 +332 295 296 334 +388 315 371 389 +0 296 35 339 +769 767 755 773 +6 360 361 761 +796 795 789 797 +875 117 874 876 +314 39 303 321 +156 20 491 507 +331 327 318 332 +108 856 858 867 +768 92 99 770 +192 190 252 326 +251 190 205 326 +769 755 792 794 +295 318 333 334 +506 499 502 508 +319 257 252 325 +206 205 326 327 +344 340 330 345 +320 317 323 325 +870 868 0 876 +257 319 320 325 317 30 320 323 -0 889 890 112 -328 30 317 323 +357 362 328 370 +319 318 317 324 +241 28 223 336 +323 40 199 324 +340 0 296 345 +321 317 313 328 +61 491 499 507 +324 206 192 326 +205 192 206 326 325 324 192 326 -324 325 192 199 -733 770 99 92 -319 325 324 317 -327 324 206 331 -324 325 323 317 -325 320 323 317 -313 316 329 317 -326 192 190 205 -317 328 321 30 -328 314 321 30 -252 325 192 326 -252 192 190 326 -251 252 190 326 -260 326 252 251 -260 319 252 326 -326 319 252 325 -212 327 206 213 -332 318 331 329 -206 324 327 326 +212 205 206 327 +326 205 250 327 +250 205 212 327 318 324 326 327 -384 397 371 395 -282 318 319 333 -35 296 295 339 -351 43 347 352 -61 480 483 500 -559 435 511 516 -373 420 46 4 -56 452 0 439 -425 433 426 443 -367 375 365 391 -2 351 355 348 -444 445 57 350 -435 511 57 70 -351 359 370 354 -284 33 339 0 -2 348 345 346 -509 213 201 200 -477 513 503 501 -384 382 397 395 -296 340 345 332 -214 207 342 343 -519 23 25 196 -258 333 260 251 -449 423 0 405 -354 331 40 329 -376 371 384 397 -339 334 295 293 +333 318 327 334 +317 323 40 328 +323 317 30 328 +534 64 535 552 +378 4 377 381 +295 35 296 339 +335 338 341 343 +346 2 348 393 +324 318 317 329 +324 317 40 329 +583 0 65 593 +353 349 348 355 +365 5 367 391 +40 317 328 329 +328 317 313 329 +344 0 340 345 +0 342 214 496 +282 293 295 333 +250 326 327 333 +260 259 282 333 +293 282 259 333 +857 855 852 860 +330 327 331 332 +405 409 410 422 +213 212 327 330 +365 367 375 391 +499 502 503 506 +334 295 296 339 +243 249 242 335 +242 237 284 337 +243 242 284 337 +338 243 334 339 +339 0 296 340 +52 379 46 749 +331 329 2 332 +243 338 334 341 +319 282 318 333 +208 249 250 335 +318 282 295 333 +243 250 249 335 249 241 242 335 -296 345 346 332 -243 335 250 249 -395 396 397 48 -338 337 284 0 -336 335 207 343 -482 501 481 61 -389 395 384 371 -367 357 391 368 -293 333 295 282 -293 259 333 282 -259 260 333 282 -282 260 333 319 -318 327 326 333 -341 334 243 250 -214 343 342 0 -28 185 223 336 -340 332 296 334 -339 243 334 293 -293 243 334 333 -293 334 295 333 -284 243 339 293 -327 332 334 318 -392 48 394 388 -342 207 341 343 -337 237 238 242 -510 358 512 518 -498 506 461 358 -240 337 238 241 -344 342 340 0 -220 240 336 215 -241 337 335 240 -241 242 335 337 -335 242 243 337 -243 284 337 242 -296 340 339 0 -475 476 544 470 -392 352 403 368 -2 353 354 331 -341 340 338 334 -330 340 341 334 -336 240 343 215 -340 330 345 332 -296 346 345 0 -341 327 250 212 -208 212 341 250 -387 299 297 41 -342 338 340 0 -54 423 449 405 -338 339 334 340 -208 212 207 341 -341 327 334 250 -341 330 334 327 -214 207 343 215 -336 343 207 215 -392 403 391 368 -243 335 338 341 -336 240 335 343 +345 0 296 346 +335 207 208 336 +223 185 219 336 +340 332 330 345 +353 2 331 354 +333 250 243 334 +327 250 333 334 +332 318 295 334 +332 330 327 334 +0 340 342 344 +338 0 284 339 +340 338 0 342 +512 510 23 515 +297 296 0 346 +407 403 402 441 +223 219 220 336 +208 186 28 336 +242 238 237 337 +0 284 237 337 +0 237 238 337 +240 0 238 337 +340 330 341 342 +215 240 336 343 +240 335 336 343 +345 332 330 353 +49 388 386 394 337 335 240 343 -337 335 343 338 -338 335 343 341 -342 341 338 343 -348 393 347 0 -410 409 422 405 -439 452 0 458 -398 441 54 5 -396 403 441 5 -370 313 369 42 -451 452 447 445 -404 427 418 50 -526 532 502 522 -358 43 359 63 -309 376 308 364 -726 721 701 714 -62 496 497 0 -342 330 344 340 -450 444 439 57 +382 384 395 397 +597 595 528 602 +391 396 5 403 +337 0 284 338 +499 61 462 501 +339 338 0 340 +20 156 491 521 +334 332 330 340 +337 240 0 343 +395 384 371 397 +550 563 573 575 +240 215 0 343 +341 207 335 343 +336 335 207 343 +340 334 338 341 +330 334 340 341 +342 0 214 343 +214 0 215 343 +342 214 207 343 +207 214 215 343 +207 341 342 343 +342 340 330 344 367 357 375 391 -403 442 441 5 -389 0 385 301 -446 348 347 0 -353 330 213 331 -353 330 331 332 -2 353 331 332 -345 353 2 332 -349 348 446 0 -497 344 349 0 -349 344 345 0 -387 394 393 0 -347 393 348 351 -2 348 393 351 -2 370 351 42 -354 2 331 329 -353 355 509 504 -505 356 213 20 -330 353 213 356 -359 43 350 63 -457 63 43 498 -678 687 764 696 -802 796 808 760 -359 43 352 350 -351 43 352 359 -496 214 342 0 -357 328 363 322 -301 371 310 315 -2 355 354 353 -2 355 353 348 -520 513 502 506 -355 347 348 351 -375 361 365 364 -353 349 344 345 -92 772 770 768 -359 63 510 358 -390 318 295 332 -503 499 462 501 -2 351 354 355 -968 922 24 926 -355 347 351 43 -309 375 376 364 -83 668 670 677 -510 63 511 64 -362 328 40 363 -394 48 49 388 -518 358 25 509 -352 445 444 350 -370 368 392 369 -383 0 384 37 -704 94 695 702 -83 775 666 668 -380 378 381 4 -376 397 382 372 -521 201 522 508 -498 461 503 460 -356 344 330 353 -62 462 0 497 -709 699 87 700 -728 724 0 730 -434 763 762 429 -518 358 512 25 -6 357 362 363 -6 357 322 361 -588 573 610 612 -375 365 391 397 -367 6 360 361 -314 371 315 310 -419 52 50 46 -370 328 369 313 -441 442 443 5 -359 352 368 350 -359 350 368 44 -368 44 367 357 -93 749 94 748 -689 429 430 426 -757 756 94 754 -433 435 57 70 -512 358 506 25 -364 361 802 309 -44 511 350 435 -436 70 560 433 -86 83 679 677 -322 375 314 309 -510 515 511 516 -491 521 508 20 -521 161 197 194 -559 435 516 360 -357 328 362 363 -360 516 605 6 -559 516 608 606 -40 323 198 363 -607 559 606 434 -434 360 762 763 -615 611 609 610 -516 608 606 605 -0 104 819 101 -748 378 46 4 -295 332 296 390 +454 451 0 455 +0 297 346 387 +352 403 442 444 +2 345 346 348 +0 384 389 395 +506 358 504 509 +365 375 376 397 +444 352 402 447 +384 376 371 397 +352 43 347 447 +360 434 428 763 +345 296 332 346 +401 48 392 403 +345 332 2 346 +368 357 367 391 +48 396 391 403 +331 213 330 353 +200 198 196 518 +331 40 200 354 +354 362 40 518 +348 345 0 349 +456 349 0 497 +516 6 44 517 +345 344 0 349 +350 44 359 510 +495 62 0 496 +329 40 331 354 +358 355 354 359 +396 395 48 397 +25 196 23 518 +872 798 874 918 +353 348 2 355 +43 355 358 359 +355 43 351 359 +2 348 351 355 +520 25 506 522 +423 0 425 449 +0 473 472 479 +519 197 25 522 +349 348 345 353 +352 351 43 359 +428 54 426 443 +399 396 47 400 +498 358 504 506 +422 373 374 427 +373 4 366 420 +388 387 386 394 +423 418 404 427 +0 56 402 447 +685 667 678 690 +211 207 202 505 +313 369 42 388 +328 323 40 363 +444 402 56 447 +372 364 366 747 +341 330 212 505 +384 301 0 389 +328 313 314 369 +704 94 702 749 +357 328 369 370 +351 2 354 370 +360 6 361 367 +347 0 348 393 +720 709 95 750 +362 357 44 368 +486 474 484 488 +353 330 344 356 +455 460 498 503 +353 213 330 356 +70 433 435 559 +457 460 461 498 +399 398 396 407 +707 87 88 709 +44 6 362 517 +930 198 199 931 +307 37 0 383 362 354 40 370 -372 366 373 4 -54 443 425 426 -361 375 322 309 -412 422 404 50 -370 368 351 392 -422 427 404 50 -840 843 839 841 -361 357 322 375 -357 367 375 361 -314 375 369 371 -322 357 314 375 -351 352 368 359 -791 784 831 785 -354 329 40 370 -362 370 40 328 -329 313 370 42 -2 329 370 42 -420 757 758 694 -354 2 329 370 -412 0 413 380 -370 329 40 328 -48 396 397 391 -403 401 396 407 -364 366 372 747 -351 352 392 368 -732 85 777 731 +314 322 328 357 +70 553 69 561 +726 720 85 750 +387 42 393 394 +420 694 704 757 +386 0 49 394 +359 351 354 370 +313 328 329 370 +412 409 404 422 +359 352 351 368 +42 329 2 370 +23 512 515 534 +510 63 350 511 +204 156 20 521 +6 357 44 362 +45 707 703 709 +367 368 391 442 +201 27 20 521 +510 44 362 517 +422 54 423 427 +201 197 521 522 +371 310 314 375 +357 322 361 375 +48 388 49 394 +600 598 594 633 +678 667 687 690 +362 328 40 363 +362 357 328 363 +357 322 328 363 +362 6 357 363 +6 322 357 363 +757 4 366 759 +797 795 798 805 310 309 314 375 -406 449 405 398 -359 44 368 362 -368 44 357 362 -433 428 434 426 -383 308 37 376 -373 46 380 4 +314 313 315 369 +379 52 46 414 +359 354 362 370 +351 359 368 370 +313 329 42 370 +378 4 748 752 +422 405 404 423 +705 87 45 709 +369 368 357 370 +384 382 376 397 +380 4 378 381 +359 362 368 370 +368 362 357 370 +310 308 309 376 +37 308 310 376 +357 6 44 367 +361 6 357 367 +746 377 378 752 +381 372 4 747 +391 48 371 397 +102 93 94 748 +44 6 360 367 328 314 357 369 -328 314 369 313 -389 384 301 371 -299 0 387 297 -354 2 370 351 -392 391 369 368 -404 412 411 409 -376 364 365 372 -314 369 315 371 -396 5 397 391 -388 371 389 315 -379 380 46 378 -308 310 37 376 -309 310 376 375 -364 366 365 372 -387 386 394 0 -370 392 351 42 -370 369 392 42 -416 706 414 52 -390 318 332 329 -376 365 397 372 -412 0 411 409 -314 375 371 310 -686 695 693 694 -420 374 427 429 -373 422 50 427 -404 423 418 427 -425 437 426 438 -90 721 722 714 -725 712 0 713 -422 54 427 374 -373 422 427 374 -420 419 50 46 -76 686 694 75 -422 54 423 427 -54 426 423 427 -760 802 814 309 -850 818 106 13 -401 49 400 0 -386 0 299 385 -376 384 37 383 -375 391 371 397 -383 0 37 307 -388 48 369 392 -301 371 384 310 -745 102 746 748 -315 369 313 388 -307 308 383 747 -383 308 376 747 -413 421 422 373 -373 380 381 4 -446 347 355 43 -50 412 411 404 -703 708 749 93 -742 710 0 11 -395 47 397 396 -50 418 404 424 -384 0 301 37 -374 421 372 373 -377 0 381 383 -378 0 380 381 -376 382 383 372 -101 753 819 821 -605 604 606 761 -380 0 379 414 -373 422 412 50 -41 42 313 390 -390 329 42 313 -386 385 299 41 -41 315 313 388 -41 313 316 390 -316 329 390 313 -2 390 346 332 -382 0 384 383 -376 384 383 382 -299 0 300 385 -302 300 385 41 -41 315 385 302 -389 371 301 315 -385 389 301 315 -316 295 290 390 -299 0 386 387 -382 0 395 384 -393 392 42 351 -395 0 389 384 -388 369 313 42 -41 388 313 42 -42 388 387 41 -387 388 386 41 -395 47 382 397 -400 0 49 395 -398 421 422 410 -42 393 346 387 -371 48 369 388 -315 371 369 388 -316 318 295 390 -382 413 381 372 -702 749 94 93 -49 0 386 389 -297 295 296 390 -346 297 296 390 -346 387 297 390 -390 387 297 41 -290 390 297 41 -316 390 290 41 -42 387 390 41 -42 387 346 390 -2 42 346 390 -376 397 384 382 -54 426 427 374 -398 54 449 405 -413 422 412 373 -49 395 389 48 -395 0 49 389 -0 777 735 91 -48 391 397 371 -5 428 54 374 -394 386 49 0 -394 388 49 386 -368 367 442 391 -42 393 387 394 -403 444 441 442 -47 0 395 382 -2 348 346 393 -2 393 346 42 -406 55 0 449 -448 393 394 0 -447 445 444 352 -396 398 399 47 -781 619 794 773 -447 347 448 0 -368 350 442 44 -420 427 419 430 -398 410 422 405 -711 700 88 89 -498 504 358 355 -449 425 0 423 -89 701 712 710 -49 400 395 48 -410 409 405 408 -375 397 371 376 -375 365 397 376 -367 442 435 44 -89 726 700 701 -706 0 379 708 -400 401 407 396 -591 600 9 603 -394 49 401 0 -560 70 561 559 -428 443 54 426 -367 442 428 435 +396 398 47 421 +5 396 397 421 +371 314 369 375 +700 88 709 711 +705 95 702 764 +95 705 680 764 +364 361 309 375 +328 40 329 370 +354 329 40 370 +396 47 395 397 +375 371 310 376 +41 299 300 385 +415 0 87 417 +399 406 0 408 +365 364 366 372 +361 364 365 375 +351 42 2 370 +401 400 396 407 +315 301 310 371 +315 314 369 371 +315 310 314 371 +46 4 378 380 +290 297 41 390 +711 709 726 750 +420 374 373 427 +743 703 750 751 +42 388 392 394 +421 373 374 422 +423 405 0 449 +50 418 419 427 +762 758 429 763 +377 307 0 383 +759 366 758 766 +378 377 0 381 +379 46 380 414 +601 591 595 602 +434 360 428 435 +412 50 373 422 421 54 398 422 -48 394 401 392 -54 425 449 423 -48 394 49 401 -48 401 49 400 -48 401 400 396 -398 47 410 399 -398 410 408 399 -412 373 380 413 -403 396 391 5 -403 48 391 396 -48 401 396 403 -406 405 0 408 -406 55 449 441 -456 349 446 0 -19 926 24 23 -48 401 403 392 -392 48 391 403 -163 155 156 525 +409 405 404 422 +373 366 372 374 +366 365 372 374 +428 426 374 429 +433 426 428 434 +584 586 588 646 +438 433 560 689 +439 444 57 450 +739 0 737 741 +88 707 709 711 +703 702 93 749 +308 364 376 747 +369 313 315 388 +766 760 802 808 +745 378 379 748 +378 46 379 748 +0 301 385 389 +410 0 47 413 +318 295 316 390 +381 377 0 383 +12 75 76 762 +380 378 0 381 +434 559 560 607 +371 48 388 389 +42 387 388 394 +366 4 372 747 +703 45 702 749 +388 386 385 389 +50 411 412 414 +440 439 57 450 +412 380 50 414 +405 398 406 449 +385 41 299 386 +302 300 289 385 +37 307 308 383 +388 48 49 389 +376 37 308 383 +412 0 410 413 +447 43 347 451 +371 301 310 384 +329 316 313 390 +310 37 376 384 +383 376 37 384 +383 37 0 384 +301 0 37 384 +383 0 382 384 +383 382 376 384 +435 428 433 443 +376 372 365 397 +332 318 329 390 +371 315 301 389 +56 55 0 402 +398 410 421 422 +625 621 14 626 +384 0 382 395 +386 41 299 387 +41 297 299 387 +384 371 301 389 +290 295 297 390 +346 297 296 390 +297 295 296 390 +385 315 41 388 +329 42 2 390 +329 313 42 390 +316 295 290 390 +414 50 411 424 +389 384 371 395 +0 346 348 393 +387 41 42 388 +388 385 315 389 +301 315 385 389 +388 49 386 389 +42 346 2 390 +346 332 2 390 +387 41 297 390 +387 297 346 390 +41 387 42 390 +346 42 387 390 +295 332 296 390 +42 313 41 390 +346 296 332 390 +47 382 395 397 +416 52 414 424 +49 0 389 395 +42 351 2 393 +346 42 2 393 +348 2 351 393 +368 352 351 392 +391 368 369 392 +370 369 368 392 +368 351 370 392 +42 369 370 392 +370 351 42 392 +391 369 48 392 +392 351 42 393 +0 405 406 449 +347 348 351 393 +415 87 45 417 +412 380 0 413 +421 410 413 422 +392 391 368 403 +408 405 0 409 +440 433 425 443 +400 0 399 407 +398 405 406 408 +367 44 368 442 +373 372 381 413 +435 367 428 442 +395 0 47 400 +398 406 399 408 +54 374 5 428 +406 398 399 407 +404 411 50 424 +411 0 412 414 +396 48 391 397 +395 48 49 400 +395 396 48 400 +402 56 55 444 +411 404 0 424 +416 414 411 424 +0 380 381 413 +417 51 52 424 +400 396 48 401 +400 48 49 401 +49 48 394 401 +400 49 0 401 +394 0 49 401 +398 54 441 449 +398 405 54 449 +392 368 352 403 +497 456 349 504 +684 681 0 698 +401 394 0 448 +410 398 405 422 +441 402 55 444 +65 0 66 542 +0 406 55 449 +446 0 347 451 +60 473 0 479 +441 406 398 449 +441 55 406 449 +430 418 419 431 +409 408 405 410 +372 373 374 421 +0 415 416 417 +380 50 373 412 +45 87 53 417 +510 350 44 511 +380 412 0 414 +710 714 11 732 405 404 0 409 -410 409 412 422 -399 406 0 408 -699 700 0 87 -45 697 417 53 -450 444 56 439 -391 403 5 442 -347 393 448 0 -400 407 399 396 -399 407 398 396 -399 406 398 407 -407 399 406 0 -407 406 55 0 -402 407 55 0 -401 407 402 0 -401 400 407 0 -407 400 399 0 -403 401 407 402 -398 410 405 408 -430 418 427 419 -411 50 404 424 -447 445 56 444 -47 0 410 399 -47 0 413 410 -424 417 0 416 -398 54 405 422 -428 426 54 374 -422 409 404 405 -413 0 412 410 -422 413 412 410 -413 373 380 381 +0 401 402 407 +403 402 401 407 +403 401 396 407 +447 56 445 452 +442 403 441 444 +406 399 0 407 +406 0 55 407 +402 55 0 407 +393 347 0 448 +57 350 435 442 +408 398 405 410 +405 0 406 408 +412 404 50 422 +420 429 430 694 +399 398 408 410 +0 408 409 410 +0 399 408 410 +0 47 399 410 +47 398 399 410 +701 0 89 712 +412 373 413 422 +0 739 740 744 +410 412 413 422 +0 381 382 413 +421 413 373 422 409 404 0 411 -413 0 381 380 -421 54 422 374 -414 380 46 379 -50 380 46 414 -724 723 716 713 -414 379 46 52 -421 422 373 374 -418 430 431 419 -441 444 55 450 -50 414 46 52 -365 421 372 374 -431 432 430 437 -50 412 414 411 -50 412 380 414 -50 412 373 380 -47 0 382 413 -382 0 381 413 -87 417 0 53 -721 726 720 85 -415 417 87 45 -397 5 396 421 -45 417 87 53 -416 417 0 415 -415 417 0 87 -397 421 372 365 -421 47 413 410 -437 438 0 432 -404 424 0 411 -771 764 92 772 -373 374 427 420 -425 438 0 437 -693 430 688 694 -393 448 394 392 -757 767 754 759 -419 418 50 424 -424 416 414 52 -50 424 414 52 -572 561 514 609 -427 418 50 419 -428 442 443 435 -5 398 396 421 -443 435 57 433 -421 396 47 398 -422 54 405 423 -437 438 689 426 -441 443 54 5 -422 423 404 427 -562 689 432 438 -767 100 759 808 -85 86 679 676 -690 685 692 696 -702 95 92 764 -422 423 405 404 -455 451 0 446 -5 54 398 421 -382 421 47 413 -382 421 413 372 -382 397 421 372 -382 397 47 421 -397 396 47 421 -426 428 443 433 -561 70 514 559 -424 417 416 52 -424 51 417 52 -419 51 424 52 -419 51 418 424 -424 411 414 416 -50 411 414 424 -427 419 50 420 -425 450 440 443 -425 449 450 443 -443 450 440 57 -490 158 0 489 -442 444 443 57 -429 374 427 426 -426 374 428 429 -18 158 524 525 -702 93 94 92 -574 568 571 569 -434 435 360 428 -694 430 688 76 -425 438 426 433 5 374 365 428 -428 435 443 433 -5 428 365 367 -627 782 626 781 -420 374 429 366 -418 431 0 51 -418 431 51 419 -762 606 360 434 -45 705 87 709 -442 352 444 350 -54 425 423 426 -434 428 429 426 -731 85 777 97 -69 70 553 561 -510 516 517 515 -512 23 515 510 -430 693 419 694 -429 427 430 426 -675 85 777 732 -691 685 692 690 -418 437 0 431 -73 568 71 564 -532 526 527 522 -562 565 564 432 -420 427 430 429 -426 437 427 430 -620 686 75 96 -620 686 96 566 -686 687 695 96 -432 565 564 688 -443 440 433 57 -435 44 360 367 -433 435 434 428 -437 418 427 430 -437 432 0 431 -431 437 430 418 -448 401 402 0 -407 402 441 403 -515 514 64 511 -511 44 510 516 -512 515 64 510 -566 690 687 667 +418 404 0 423 +5 365 367 428 +391 5 367 442 +411 409 404 412 +0 409 411 412 +409 0 410 412 +730 91 11 732 +46 50 380 414 +307 0 816 821 +414 411 0 416 +692 685 0 698 +411 404 50 412 +373 380 412 413 +0 382 47 413 +803 39 30 804 +765 758 762 766 +307 377 0 821 +11 710 732 742 +0 51 417 424 +413 382 47 421 +688 690 691 693 +433 425 426 438 +413 372 382 421 +50 419 420 427 +680 696 678 764 +430 419 420 694 +347 43 355 446 +4 373 46 420 +427 426 423 437 +420 373 50 427 +403 368 352 442 +444 443 57 450 +0 418 423 437 +0 423 425 437 +426 423 54 427 +374 54 5 421 +437 0 432 438 +422 374 54 427 436 70 433 440 -805 803 814 796 -931 925 198 363 -361 801 802 322 -512 461 520 506 -368 352 442 350 -396 441 398 5 +410 47 398 421 +413 373 372 421 +425 443 449 450 +404 422 423 427 +422 404 50 427 +54 426 374 428 +0 51 418 431 +415 0 416 706 +0 69 549 550 +397 365 5 421 +397 372 365 421 +374 5 365 421 +374 365 372 421 +5 54 398 421 +360 367 428 435 +72 566 71 686 +442 5 428 443 +710 0 89 711 +770 791 826 827 +696 687 678 764 +416 0 417 424 +419 52 51 424 +419 51 418 424 +419 50 52 424 +418 50 419 424 +404 418 0 424 +436 0 438 562 +57 433 70 440 +576 68 549 589 +460 457 455 498 +5 391 403 442 +5 403 441 442 +691 690 692 693 +667 73 71 690 +425 0 437 438 +355 349 348 446 +535 64 67 552 +702 93 92 703 +705 702 696 764 +696 695 687 764 +686 96 687 695 +709 95 705 720 +442 57 350 444 +426 433 438 689 +428 435 442 443 +425 423 54 426 +360 761 762 763 +538 475 476 544 +778 776 0 779 +435 57 442 443 +429 428 426 434 +99 791 820 828 +68 549 551 561 +586 579 571 645 +575 549 0 576 +570 563 568 574 +427 418 419 430 +437 426 425 438 +429 426 427 430 +429 427 420 430 +427 419 420 430 +685 678 684 698 +693 419 430 694 +439 440 57 557 +696 678 685 698 +548 0 549 576 +512 64 510 515 +436 433 438 440 +55 441 444 450 +605 360 6 761 +442 350 352 444 426 425 423 437 -423 425 0 437 -5 443 54 428 -423 437 0 418 -427 437 423 418 -427 426 423 437 -458 452 0 454 -402 56 444 447 -556 69 0 557 -555 69 553 551 -492 217 141 149 -446 498 43 355 -531 482 526 532 -481 501 478 61 -355 509 358 354 -442 444 441 443 -5 442 443 428 -443 442 57 435 -425 450 0 440 -442 350 57 435 -444 445 56 439 -12 607 72 612 -396 407 441 403 -396 407 398 441 -406 441 398 407 -406 55 441 407 -407 55 441 402 -402 444 352 447 -447 448 402 0 -414 0 379 706 -449 450 0 425 -444 56 55 450 -441 450 55 449 -56 439 0 450 -450 439 0 440 -55 450 0 449 -449 441 450 443 -403 352 442 368 -391 403 442 368 -442 428 5 367 -451 455 0 454 -451 347 447 0 -425 440 433 443 -403 352 444 442 -402 352 444 403 -402 444 441 403 -55 444 441 402 -55 56 444 402 -443 444 450 57 -450 441 444 443 -445 452 56 439 -444 445 439 57 -217 492 0 143 -349 446 348 355 -446 347 348 355 -448 392 393 351 -471 475 470 476 -347 448 393 351 -347 448 351 352 -448 392 351 352 -392 448 403 352 -403 448 402 352 -402 447 352 448 -448 447 352 347 -403 448 401 402 -448 403 401 392 -447 347 451 43 -451 347 446 43 -445 447 451 43 -455 453 0 454 -54 449 425 443 -54 441 449 443 -398 54 441 449 -406 441 449 398 +430 426 427 437 +431 430 418 437 +430 427 418 437 +444 439 57 445 +418 0 431 437 +513 501 477 539 +0 160 159 529 +24 516 517 605 +516 515 24 517 +510 515 516 517 +362 510 517 518 +435 433 57 443 +433 57 70 435 +428 433 434 435 +468 537 543 545 +147 0 144 490 +401 392 394 448 +431 0 432 437 +352 444 445 447 +552 461 64 554 +0 348 349 446 +447 0 56 452 +458 439 445 558 +0 347 348 446 +933 118 873 935 +553 70 69 557 +546 58 0 555 +495 480 62 500 +0 455 456 463 +394 393 0 448 +503 502 501 513 +0 56 439 450 +449 0 425 450 +449 443 441 450 +441 403 402 444 +449 441 55 450 +440 425 0 450 +440 0 439 450 +352 402 403 444 +396 403 407 441 +407 398 396 441 +403 396 5 441 +398 5 396 441 +54 5 398 441 +425 433 426 443 +54 425 426 443 +407 406 398 441 +55 406 407 441 +425 440 443 450 +443 440 57 450 +444 350 352 445 +402 403 401 448 +63 43 350 445 +435 434 360 559 +435 44 367 442 +435 350 44 442 +368 350 352 442 +350 43 352 445 +441 5 442 443 +441 54 5 443 +444 441 443 450 55 56 0 450 -458 454 0 465 -483 480 60 486 -451 447 452 0 -452 447 56 0 -503 499 456 462 -463 464 0 466 -468 7 0 58 -533 67 547 545 -67 535 547 551 -67 546 545 459 -459 546 465 554 -66 547 542 58 -456 455 0 446 -453 467 0 465 -474 485 0 473 -559 435 434 433 -499 497 456 462 -69 70 557 553 -456 463 0 455 -462 499 62 61 -458 445 439 452 -457 445 458 452 -454 457 458 452 -358 461 498 63 -498 451 446 43 -355 498 43 358 -212 207 505 202 -464 479 0 471 -455 463 0 453 -538 530 531 482 -465 454 0 453 -523 156 525 157 -629 641 623 14 -445 63 43 457 -504 499 456 503 -18 142 148 525 -63 461 554 64 -457 445 451 43 -457 445 452 451 -454 457 452 451 -454 457 451 455 -44 510 350 511 -561 560 559 609 -525 142 154 155 -554 459 67 552 -67 556 553 555 -330 356 213 505 -562 573 565 560 -467 469 0 468 -59 7 0 468 -70 511 553 514 -456 462 0 463 -66 545 547 58 -216 143 0 494 -70 435 511 559 -479 472 471 475 -341 505 330 212 -359 510 44 362 -507 500 61 491 -545 67 547 58 -538 539 544 476 -465 453 467 460 -918 15 931 920 -478 462 62 61 -476 479 471 475 -462 464 0 463 -551 69 561 549 -70 511 514 559 -465 457 458 454 -460 457 465 454 -453 460 465 454 -467 453 477 460 -493 487 488 489 -64 534 535 515 -69 556 0 555 -61 62 478 480 -557 439 57 440 -499 356 508 504 -459 465 467 460 -584 639 78 592 -568 73 0 564 -216 494 0 495 -466 471 0 469 -532 536 540 539 -453 466 0 467 -546 468 545 459 -752 754 100 759 -466 469 0 467 -459 467 477 460 -156 157 491 521 -60 474 0 473 -469 470 0 59 -499 508 506 504 -472 473 0 475 -141 147 492 149 -464 471 466 476 -561 70 560 436 -464 471 0 466 -522 201 25 508 -66 7 545 58 -530 529 0 531 -472 475 0 470 -525 158 153 154 -349 504 446 355 -529 526 523 157 -486 493 0 488 -18 525 148 158 -479 472 0 471 -486 483 484 60 -495 211 216 142 -62 478 0 462 -473 472 479 475 -464 476 466 477 -501 513 503 502 -531 529 526 482 -18 483 484 486 -474 484 0 485 -537 477 539 513 -521 194 201 27 -544 539 537 476 -483 481 485 60 -534 552 602 520 -503 455 456 498 -144 487 0 492 -466 453 463 477 -467 453 466 477 -477 469 466 467 +55 0 449 450 +442 441 443 444 +355 353 349 504 +439 56 444 450 +452 451 0 454 +444 57 350 445 +56 439 444 445 +394 392 393 448 +66 65 542 547 +451 445 43 457 +563 0 564 568 +451 0 447 452 +393 392 351 448 +392 352 351 448 +347 351 352 448 +352 392 403 448 +447 0 347 448 +402 0 447 448 +447 352 402 448 +347 352 447 448 +402 352 403 448 +0 447 347 451 +446 347 43 451 +423 425 54 449 +443 54 425 449 +443 441 54 449 +67 546 554 556 +461 460 459 513 +453 454 455 460 +444 56 55 450 +489 487 0 490 +457 455 454 460 +476 466 464 477 +455 0 453 463 +454 0 453 455 +451 446 0 455 +469 0 59 470 +498 456 455 503 +349 0 446 456 +497 62 462 499 +445 439 57 558 +457 63 43 498 +43 446 451 498 +598 0 594 633 +556 69 0 557 476 469 466 477 -67 556 554 553 -62 500 61 507 -477 453 463 460 -354 200 518 40 -487 490 0 489 -475 472 471 470 -530 481 482 538 -473 472 0 479 -479 60 0 473 -478 60 0 479 -500 523 61 491 -62 480 0 478 -480 60 0 478 -156 142 525 155 -493 489 18 148 -486 493 489 18 -490 489 487 493 -495 214 216 211 -20 212 505 202 -580 576 582 589 -147 490 0 144 -489 158 18 148 -507 491 508 20 -433 434 689 426 -61 478 483 480 -481 478 483 61 -157 163 156 525 -513 539 532 502 -539 501 476 481 -484 485 474 60 -483 481 61 482 -562 564 0 432 -483 478 60 480 -359 518 510 362 -499 507 61 491 +436 550 560 561 +452 0 439 458 +452 445 457 458 +457 454 452 458 +474 60 0 486 +477 459 460 513 +70 435 511 559 +503 501 477 513 +548 542 0 582 +641 14 0 642 +455 446 0 456 +553 551 67 555 +510 64 63 511 +465 0 458 556 +463 0 453 466 +530 485 481 538 +464 0 463 466 +62 495 500 507 +473 60 0 474 +468 0 59 469 +0 456 462 463 +476 475 470 544 +63 64 461 554 +445 63 43 457 +342 330 341 505 +200 40 198 518 +354 40 200 518 +557 70 57 558 +72 76 565 607 +556 0 458 557 +465 457 460 554 +212 202 207 505 +440 0 436 557 +0 470 471 472 +0 59 7 468 +563 562 550 573 +468 467 0 469 +462 61 62 478 +460 463 477 503 +496 495 62 507 +456 455 446 498 +545 58 468 546 +469 467 466 477 +470 0 59 544 +471 475 476 479 +200 331 354 509 +464 462 0 478 +462 0 463 464 +472 473 475 479 +515 64 514 535 +454 0 458 465 +0 454 453 465 +460 453 454 465 +454 457 460 465 +458 457 454 465 +436 69 70 557 +440 436 70 557 +435 433 434 559 +556 553 69 557 +609 606 608 615 +542 58 66 547 +476 481 538 539 +471 472 475 479 +216 0 214 495 +466 0 453 467 +453 0 465 467 +479 478 60 481 +465 460 453 467 +465 459 460 467 +141 0 217 492 +453 466 467 477 +470 469 0 471 +467 466 0 469 +491 500 61 523 +23 198 517 518 +511 57 70 558 +148 154 158 525 +539 537 536 540 +0 79 80 639 +519 25 512 520 +471 0 472 479 +453 463 466 477 +501 499 61 502 +446 355 349 504 +363 362 6 517 +467 459 460 477 +471 466 464 476 +471 469 466 476 +475 470 471 476 +574 578 579 586 +471 470 469 476 +481 475 476 538 +478 61 62 480 +523 18 483 524 +489 158 148 490 +475 481 485 538 +462 62 0 478 +478 62 0 480 +606 360 605 761 +463 453 460 477 +463 464 466 477 +60 478 0 480 +472 470 471 475 +473 0 472 475 +472 0 470 475 +487 0 488 489 +489 486 488 493 +545 66 58 547 +144 0 487 490 +0 464 478 479 +545 67 58 546 +493 486 0 494 +217 143 149 492 +204 27 194 521 +644 622 571 646 +60 483 484 485 +519 512 23 534 +60 481 483 485 +537 536 513 539 +0 473 474 485 +158 0 146 490 +0 484 474 488 +474 473 60 485 +494 216 142 495 +20 212 213 505 +216 211 142 495 +211 156 142 500 +159 157 526 529 +500 18 483 523 +478 462 61 501 +500 491 61 507 +18 480 483 486 +7 468 543 545 +0 60 480 486 +154 142 155 525 +489 0 158 490 +477 476 469 537 +540 528 0 541 +0 648 649 652 481 478 60 483 -483 480 486 18 -60 480 0 486 -481 479 60 478 -481 464 479 478 +536 513 459 537 +479 60 473 485 +474 60 484 485 +482 526 529 531 +475 473 0 485 +588 577 584 610 +489 484 18 524 +480 478 61 483 +491 482 61 502 +501 61 482 502 476 464 479 481 -540 528 0 541 -459 477 467 537 -629 630 640 641 -147 146 0 490 -486 488 0 474 -493 494 148 18 -204 194 521 27 -496 344 505 356 -537 477 467 469 -486 484 474 60 +479 464 478 481 +481 61 478 483 +480 60 478 483 +552 459 461 554 +58 66 7 542 +67 64 553 554 +493 18 486 494 +435 57 70 511 +59 469 470 544 +539 536 532 540 +538 476 539 544 +482 501 502 539 +527 532 528 596 +475 0 470 544 +481 61 482 501 +459 461 513 552 +62 61 499 507 +484 486 488 489 +484 18 486 489 +446 349 456 504 +493 148 18 494 +216 143 0 494 +158 148 18 489 +157 163 156 525 +492 0 143 493 +460 455 463 503 +501 463 462 503 +910 617 909 913 +200 213 331 509 +536 528 532 540 +201 508 25 522 +349 356 497 504 +160 0 524 529 +482 529 530 531 +627 787 794 910 +483 18 484 524 +66 58 7 545 +641 0 630 643 +499 462 456 503 +516 44 510 517 +356 213 330 505 +501 477 463 503 +463 456 462 503 +0 144 487 492 +463 462 464 501 +67 459 552 554 +446 456 498 504 +214 211 216 495 +143 148 492 493 +480 0 486 494 +493 0 143 494 +493 143 148 494 +142 148 143 494 +494 480 0 495 +480 62 0 495 +0 216 494 495 331 353 354 509 -163 155 525 154 -158 160 0 524 -524 489 0 158 -529 530 524 523 -486 489 484 18 -143 494 148 493 -503 506 499 502 -488 487 0 489 -488 489 0 484 -486 488 484 489 -465 554 458 457 -147 149 146 490 -64 461 552 512 -524 484 483 530 -530 524 0 529 -464 463 501 477 -476 464 481 501 +517 198 362 518 +330 213 212 505 +496 62 0 497 +496 0 344 497 +349 344 0 497 +344 356 496 497 +356 344 349 497 +356 349 353 504 +495 211 142 500 +494 18 480 500 +480 18 483 500 +509 200 25 518 +142 18 494 500 +61 480 483 500 +202 20 211 505 +506 502 503 513 +356 213 20 508 +507 491 499 508 +25 200 196 518 +511 510 64 515 +433 436 438 560 +451 455 457 498 +43 451 457 498 +63 457 461 498 +355 43 358 498 +461 358 63 498 +462 456 497 499 +330 342 344 505 +214 342 207 505 +61 462 62 499 +538 482 531 539 +142 494 495 500 +481 476 464 501 +464 476 477 501 481 464 478 501 -502 508 499 491 -354 518 362 40 -500 142 156 211 -500 483 61 523 -539 502 513 501 -485 484 0 530 -491 507 156 20 -476 464 501 477 -495 211 500 507 -463 455 456 503 -462 463 456 503 -501 463 462 503 -217 141 0 492 -493 487 0 488 -487 493 0 492 -492 490 487 493 -497 349 456 0 -330 505 213 212 -486 480 0 494 -966 965 963 597 -584 592 78 74 -505 214 496 211 -562 560 565 689 -446 504 498 355 -491 500 156 507 -498 504 506 358 -510 63 350 511 -0 787 909 906 -20 505 211 202 -505 207 211 202 -356 497 344 349 -356 496 344 497 -204 27 521 20 -214 207 211 505 -456 455 446 498 -455 451 446 498 -455 457 451 498 -455 457 498 460 -457 461 498 460 -511 558 553 64 -349 356 504 353 -527 963 965 597 -521 27 201 20 -551 69 553 561 -157 161 526 521 -500 142 494 18 -500 480 483 18 -500 494 495 480 -500 495 62 480 -500 494 480 18 -61 500 62 480 -459 477 537 513 -62 507 61 499 -482 502 61 491 -502 499 61 491 -499 62 497 462 -494 142 500 495 -495 142 500 211 -464 501 462 478 -464 463 462 501 -64 461 554 552 +61 481 478 501 +478 464 462 501 +504 355 353 509 +500 495 211 507 +356 353 213 509 +496 356 505 507 +211 495 496 507 +491 61 499 502 +559 606 608 609 +502 501 499 503 +511 435 44 516 +508 506 504 509 +498 460 461 503 +499 456 497 504 +456 499 503 504 +503 498 456 504 +499 497 356 504 +211 20 156 507 500 211 156 507 -498 504 456 503 -507 356 499 497 -501 502 499 61 -482 502 501 61 -555 556 553 69 -560 70 559 433 -160 529 523 157 -477 463 503 460 -463 455 503 460 -503 455 498 460 -477 463 501 503 -688 689 76 430 -446 456 498 504 -349 456 446 504 -349 456 504 497 -504 497 456 499 -497 356 499 504 -349 497 504 356 -341 207 505 212 -342 207 505 341 -342 505 330 341 -342 344 330 505 -342 344 505 496 -342 496 505 214 -214 207 505 342 -509 358 25 506 -504 499 503 506 -498 504 503 506 -498 503 461 506 -356 507 496 497 -507 62 496 497 -495 62 496 507 -507 496 495 211 -507 505 496 211 -356 505 496 507 -213 200 509 331 -633 81 0 594 -526 529 159 157 -518 23 512 510 -502 506 499 508 -213 356 508 20 -512 23 25 519 -197 519 25 196 -331 353 509 213 -508 213 201 509 -25 508 201 509 -513 461 460 503 -477 513 460 503 -538 531 0 540 -196 518 200 198 -537 468 59 469 -438 436 0 562 -527 528 596 532 -515 514 511 516 -512 506 520 25 -350 510 44 359 -350 63 510 359 -510 63 512 358 -512 63 461 358 -512 358 461 506 -78 632 631 640 -590 591 594 9 -44 6 517 516 -67 546 556 555 -517 362 363 6 -521 194 197 201 -198 362 363 517 -64 63 461 512 +356 344 496 505 +356 330 344 505 +496 214 211 505 +358 63 359 510 +214 207 211 505 +507 356 20 508 +213 356 20 505 +155 156 163 525 +477 460 503 513 +476 470 469 544 +353 331 213 509 +211 496 505 507 +505 20 211 507 +505 356 20 507 +497 496 62 507 +497 356 496 507 +499 497 62 507 +497 499 356 507 +359 63 350 510 +506 504 499 508 +356 499 504 508 +507 20 491 508 +507 499 356 508 +355 354 353 509 +504 358 355 509 +355 358 354 509 +508 356 213 509 +504 356 508 509 +44 362 359 510 +922 24 616 968 +204 20 27 521 +546 0 465 556 +508 201 20 521 +0 546 555 556 503 461 506 513 -527 161 965 963 -156 157 521 204 -561 560 550 436 -459 461 460 513 -459 513 460 477 -532 513 536 539 -695 687 764 771 -436 550 0 562 -44 517 510 516 -198 517 518 362 -560 559 607 434 -72 622 71 566 -550 560 562 436 -599 921 115 616 -510 518 517 362 -620 617 619 116 -25 23 512 518 -44 6 516 360 -435 44 516 360 -542 582 0 548 -709 87 88 700 -574 568 570 571 -596 528 531 532 -782 768 780 781 -359 518 362 354 -359 358 518 354 -518 354 358 509 -518 354 509 200 -359 358 510 518 -23 518 517 510 -23 518 198 517 -23 518 196 198 -23 25 196 518 -160 159 0 529 -529 160 159 157 -591 595 594 598 -481 482 483 530 -64 554 67 552 +528 531 532 540 +513 477 459 537 +539 532 531 540 +538 481 482 539 +508 20 491 521 +73 667 685 690 +612 74 77 615 +506 461 358 512 +485 481 483 530 +25 506 358 512 +510 358 63 512 +358 461 63 512 +64 510 63 512 +64 63 461 512 +523 160 524 529 +160 157 523 525 +160 158 153 525 +491 156 157 521 520 506 502 522 +204 157 156 521 +555 69 0 556 +508 491 502 522 +438 0 432 562 +618 115 74 632 +584 78 74 592 +509 358 354 518 +565 72 607 612 +517 516 6 605 +78 584 80 639 +354 359 362 518 +44 510 511 516 +661 660 659 664 +70 436 433 560 +435 360 44 516 +565 563 570 573 +586 574 578 588 +157 160 163 525 +513 461 506 520 +364 759 760 766 +587 577 68 610 +354 358 359 518 +359 358 510 518 +510 362 359 518 +509 25 358 518 +358 25 512 518 +512 510 358 518 +512 25 23 518 +510 512 23 518 +517 510 23 518 +155 163 154 525 +482 491 61 523 +482 61 483 523 +532 527 528 602 +543 537 59 544 +157 523 526 529 +459 467 468 537 +194 27 201 521 +966 598 601 967 +526 523 482 529 +601 963 966 967 +197 161 194 521 502 506 508 522 -481 530 483 485 -156 204 521 20 -482 481 539 538 -602 519 601 534 -491 156 523 157 -18 483 500 523 -59 470 0 544 -585 647 0 80 -523 530 483 482 -67 553 535 551 -482 532 502 526 -607 565 76 72 -570 565 573 612 -529 482 530 523 -588 575 574 578 -615 607 612 609 -537 477 476 539 -544 470 0 475 -163 525 153 154 -18 524 483 523 -18 484 483 524 -18 489 484 524 -18 158 489 524 -160 525 153 163 -157 525 160 163 -160 524 525 523 -18 525 524 523 -523 500 18 525 +561 550 560 573 +0 595 597 598 +565 560 562 573 +64 515 534 535 +986 973 125 989 +590 535 533 591 +589 587 572 590 +909 906 787 910 +189 253 0 933 +530 529 0 531 +159 160 157 529 +156 491 157 523 +512 519 520 534 +537 513 477 539 +907 630 617 909 +501 481 476 539 +123 0 598 633 +154 153 158 525 +148 18 142 525 500 142 18 525 -500 142 525 156 -523 500 525 156 -577 576 580 589 -485 530 483 484 -532 539 531 482 -538 481 539 476 -513 532 520 502 -476 469 537 544 -523 524 483 530 -564 570 71 565 -12 606 607 615 -160 529 0 524 -9 81 592 599 -539 477 476 501 -583 595 0 594 -591 595 583 594 -652 648 0 649 -520 519 534 512 -534 23 512 519 -515 23 512 534 -577 586 578 588 -533 595 541 583 -595 541 0 528 -588 571 586 574 -460 554 465 457 -553 511 64 514 -520 532 527 522 -482 501 539 481 -545 468 537 459 -545 7 468 58 -69 70 561 436 -558 554 553 64 -540 544 0 538 -538 544 539 540 -527 602 532 520 -535 591 590 603 -19 23 534 519 -481 538 485 475 -611 592 115 599 -544 469 59 470 +500 156 142 525 +523 500 18 525 +523 156 500 525 +148 158 18 525 +157 156 523 525 +460 457 461 554 +513 502 501 539 +538 0 475 544 +670 83 673 683 +573 609 610 612 +585 577 584 586 +482 481 501 539 +551 69 549 555 +483 523 524 530 +484 483 524 530 +483 482 523 530 +553 67 554 556 +7 58 468 545 +476 537 539 544 +540 539 537 544 +611 115 74 615 +594 583 0 595 +194 204 521 964 +485 483 484 530 +531 0 538 540 +527 522 520 532 +59 468 469 537 +532 531 482 539 +482 502 526 532 +483 481 482 530 +524 0 484 530 +485 484 0 530 +477 467 459 537 +529 0 524 530 +529 523 482 530 +524 523 529 530 +537 476 469 544 +958 0 165 959 +0 530 531 538 +531 482 526 532 +540 536 528 541 +562 0 432 564 +587 68 572 610 +816 810 815 821 +531 538 539 540 +459 536 537 545 +564 0 73 568 +0 58 7 542 +501 476 477 539 +545 468 459 546 +532 502 513 539 +0 440 439 557 +467 465 459 546 +514 515 535 603 +595 591 533 602 +548 0 58 555 531 528 0 540 -579 569 0 574 -586 646 584 638 -601 519 19 534 -540 537 539 536 -459 468 467 546 -546 467 0 468 -556 554 458 465 -537 467 468 469 -459 467 468 537 -476 469 544 470 -539 537 513 536 -539 482 532 502 -0 14 625 624 -531 538 0 530 -485 530 0 538 -537 469 59 544 -544 543 59 537 -544 537 539 540 -539 538 531 482 -458 439 558 557 -64 553 514 535 -870 257 252 256 -588 573 612 570 -520 513 536 532 -540 543 0 544 -67 555 553 551 -511 558 70 553 -553 514 535 551 -458 556 557 558 +536 532 513 539 +459 545 67 552 +532 482 502 539 +67 553 555 556 +532 513 520 536 +551 547 67 555 +546 67 58 555 +439 458 557 558 58 67 547 555 -350 558 57 511 -481 530 485 538 -545 537 536 459 -532 540 531 539 -532 540 528 531 -533 66 541 545 -589 580 577 587 -660 665 666 670 -662 623 667 566 -542 66 0 65 -436 433 560 438 -432 564 0 691 -7 66 542 58 -7 542 0 58 -7 66 0 542 -7 59 0 543 -67 545 546 58 -577 586 584 585 +553 69 555 556 +58 547 548 555 +551 549 548 555 +781 773 619 794 +364 365 366 763 +469 59 537 544 +520 513 461 552 +530 481 482 538 +530 482 531 538 543 59 0 544 -545 543 541 536 -533 545 541 536 -545 536 537 543 -537 543 468 545 -543 7 468 545 -66 7 543 545 -562 550 563 573 -548 576 0 549 -513 459 552 536 +0 475 485 538 +0 485 530 538 +610 587 592 611 +543 0 540 544 +660 658 657 664 +547 542 58 548 +0 436 69 550 +547 66 65 583 +576 0 578 581 +837 13 809 839 +32 306 813 814 +642 0 637 650 +598 594 591 600 +66 0 541 543 +540 537 536 543 +541 540 536 543 +543 540 537 544 +578 575 577 588 +541 66 543 545 +541 533 66 545 +536 541 543 545 +536 533 541 545 +555 546 67 556 +350 63 445 558 +545 67 533 547 67 535 533 547 -557 70 558 553 -66 547 65 542 -9 603 611 572 -578 579 0 574 -547 548 65 542 -547 548 542 58 -58 542 0 548 +560 550 562 573 +526 531 532 596 +545 533 66 547 +605 613 604 761 +542 0 58 548 +69 436 70 561 +693 686 690 695 +430 429 426 689 +0 575 576 578 +564 0 432 691 +461 512 520 552 +461 64 512 552 +68 550 561 573 +686 566 71 690 +565 562 563 573 +550 549 68 561 +520 512 534 552 +554 458 457 558 +57 439 557 558 +458 445 457 558 +772 10 776 779 +549 68 551 589 +465 458 457 554 +571 644 82 662 +0 562 563 564 +789 788 114 793 +514 551 553 561 +513 536 459 552 +545 459 536 552 +67 545 533 552 +545 536 533 552 +757 756 754 767 +572 9 587 611 +535 533 534 552 +536 513 520 552 535 67 533 552 -572 603 590 9 -64 552 534 512 -552 461 513 520 -552 461 520 512 -533 552 67 545 -68 572 589 587 -911 800 789 793 -556 546 0 555 -67 545 552 459 -552 545 536 459 -552 520 534 512 -561 560 573 550 -561 69 550 549 -436 69 0 550 -550 69 0 549 -552 513 536 520 -553 70 514 561 -562 563 564 565 -563 564 0 562 -552 461 459 513 -555 546 0 58 -58 548 0 555 -64 67 535 552 -64 535 534 552 -534 535 533 552 -615 606 609 608 -533 536 552 545 -555 551 548 549 -555 551 547 548 -58 555 547 548 -555 67 547 551 -67 546 554 556 -555 69 551 549 -555 549 0 69 -64 67 553 535 -555 548 0 549 -558 63 554 64 -557 69 0 436 -558 439 57 557 -350 63 558 511 -511 63 558 64 -918 799 872 798 -434 360 763 428 -554 67 553 64 -557 458 0 556 -67 546 459 554 -63 457 554 461 -461 457 554 460 -620 72 686 566 -556 557 558 553 -439 557 0 440 -439 458 0 557 -556 558 554 553 -458 556 558 554 -457 458 558 554 -63 457 558 554 -457 558 445 63 -63 350 558 445 -558 350 57 445 -439 57 445 558 -439 558 445 458 -458 558 445 457 -0 936 892 895 -0 660 670 658 -68 561 573 550 -551 553 514 561 -560 559 434 433 -123 633 0 598 -436 560 562 438 -438 562 0 432 -602 536 532 520 -576 68 575 549 -577 587 610 68 -514 603 608 515 -659 660 657 664 -645 648 579 652 -551 549 68 589 -68 573 575 550 -566 690 686 687 -581 578 0 576 -568 574 570 563 -645 648 652 649 -610 577 584 587 -12 615 612 77 -575 68 550 549 -762 765 12 75 -788 769 806 790 -515 24 608 516 -620 72 75 686 -861 842 862 865 -562 573 563 565 -578 574 0 575 -584 592 610 587 -576 578 0 575 -576 575 0 549 +511 350 57 558 +69 0 549 555 +551 548 547 555 +771 755 96 781 +52 419 51 697 +686 687 690 695 +550 436 69 561 +554 546 465 556 +551 535 514 553 +551 67 535 553 +535 64 514 553 +64 535 67 553 +514 511 70 553 +64 511 514 553 +70 514 553 561 +546 459 67 554 +546 465 459 554 +899 901 902 915 +559 514 70 561 +459 465 460 554 +460 461 459 554 +457 63 461 554 +554 465 458 556 +76 72 12 607 +70 57 440 557 +458 554 556 558 +557 556 553 558 +554 553 556 558 +554 457 63 558 +554 63 64 558 +511 64 63 558 +554 64 553 558 +553 64 511 558 +553 511 70 558 +557 553 70 558 +550 69 549 561 +516 511 435 559 +516 514 511 559 +560 559 70 561 +630 629 628 641 +10 677 86 776 +611 610 609 615 +437 432 430 689 +438 437 426 689 +85 95 97 750 +685 692 696 698 +559 433 434 560 +640 77 622 646 +645 638 586 648 +589 572 551 590 +550 436 560 562 +559 70 433 560 +576 575 577 578 +571 568 569 574 +77 612 622 646 +697 52 419 704 +638 8 637 643 568 563 0 574 -72 76 607 12 -687 669 667 678 -683 684 0 665 -575 573 563 550 -72 71 686 566 -0 625 668 624 -620 72 566 622 -683 684 665 83 -547 535 533 590 -629 644 622 623 -678 666 567 684 -666 665 684 83 -678 666 684 83 -575 563 0 550 -589 547 65 590 -0 907 630 631 -567 661 663 664 -949 942 941 951 -115 616 921 614 -125 914 992 976 -613 604 800 911 -568 571 662 570 -0 668 10 677 -582 581 0 576 -578 586 579 574 -527 596 526 532 -612 615 609 610 -582 576 0 548 -569 655 0 663 -579 571 569 574 -12 607 612 615 -90 682 84 674 -564 563 570 565 -640 78 646 638 -589 68 576 549 -568 563 570 564 -568 570 71 564 -762 758 765 75 -12 612 72 77 -613 800 919 911 -650 637 645 649 -590 547 65 583 -585 577 586 578 +674 675 0 722 +74 584 592 610 +621 623 566 669 +77 72 12 620 +571 570 568 574 +581 580 576 582 +586 578 579 653 +645 586 579 648 +564 562 563 565 +432 562 564 565 +687 566 686 690 +437 430 426 689 +566 620 96 686 +620 75 96 686 +566 72 620 686 +620 72 75 686 +72 566 620 622 +672 671 673 683 +676 674 673 679 +805 803 812 814 +617 116 77 618 +86 680 95 720 +0 672 84 682 +756 75 96 773 +565 71 72 570 +586 578 577 588 +533 535 534 591 +549 550 68 575 +655 569 82 663 +636 79 0 639 +755 773 781 794 +599 592 9 611 +73 0 567 663 +591 19 600 603 +527 526 532 596 +590 583 593 594 +589 551 547 590 +528 531 0 596 +924 920 918 931 +533 583 590 591 +0 65 580 582 +657 0 655 664 +588 571 570 646 +588 586 571 646 +159 0 529 596 +565 564 71 570 +563 564 565 570 +568 71 564 570 +564 563 568 570 +574 563 0 575 +631 122 632 635 +594 591 583 595 +591 19 534 601 +586 638 571 646 +921 115 614 923 +587 9 81 592 +583 533 541 595 +535 551 514 572 +551 68 561 572 +561 514 551 572 +82 650 654 655 +80 585 586 648 +579 569 571 645 569 568 0 574 -587 572 610 68 -654 652 0 651 -577 576 578 581 -68 572 561 551 -572 514 561 551 -551 514 535 572 -612 565 607 72 -606 559 360 434 -916 922 923 921 -646 644 622 640 -551 590 547 589 -587 572 589 590 -615 612 74 610 -68 576 577 589 -921 614 922 923 -593 81 587 9 -588 574 570 571 -547 551 589 548 -645 586 648 638 -551 535 547 590 -581 577 585 578 -551 549 589 548 -586 571 579 574 -65 580 0 582 -660 658 665 670 -577 575 578 576 -622 646 612 570 -68 587 589 577 -653 586 579 578 -646 78 584 638 -596 531 526 532 -656 650 655 654 -639 635 78 592 -644 646 571 638 -577 588 584 586 -592 9 611 587 -634 635 639 592 -646 588 610 612 -577 576 581 580 -535 591 533 590 -587 81 592 9 -533 66 583 541 -583 66 0 541 -65 66 0 583 -157 964 521 204 -547 66 65 583 -551 572 590 589 -587 9 611 572 -594 81 593 9 -547 66 583 533 -74 632 78 640 -588 586 578 574 -577 575 588 578 -12 116 77 620 -653 579 648 652 -585 80 0 648 -601 595 602 591 -580 585 0 581 -580 577 585 581 -830 831 98 785 -593 594 0 81 -583 594 0 593 -579 648 645 586 -533 541 602 536 -533 591 583 590 -650 82 655 654 -533 591 595 583 -592 611 74 610 -601 597 602 595 -673 682 674 672 -843 786 885 839 -702 764 771 695 -9 592 611 599 -68 575 588 577 -68 573 588 575 -575 573 588 563 -588 573 570 563 -574 588 570 563 -574 575 588 563 -547 589 65 548 -548 582 589 65 -580 589 582 65 -604 116 12 765 -531 596 0 528 -638 78 643 640 -608 614 611 615 -611 115 74 615 -551 535 590 572 -990 939 991 914 -590 547 583 533 -514 535 572 603 -535 534 533 591 -648 586 80 638 -653 585 648 586 -65 593 0 580 -65 580 589 593 -593 580 589 587 -587 589 593 590 -593 589 65 590 -593 590 65 583 -65 583 0 593 -583 541 0 595 -927 960 929 963 -593 590 583 594 -590 591 583 594 -0 893 935 936 -534 19 601 591 -602 597 528 595 -527 526 596 161 -596 526 159 161 -596 529 159 526 -596 531 529 526 +68 549 575 576 +995 994 0 1000 +12 607 612 615 +586 571 574 588 +574 571 570 588 +535 547 551 590 531 529 0 596 -529 159 0 596 -535 534 591 603 -603 591 590 9 +0 65 66 583 +575 68 576 577 +580 576 577 581 +549 548 576 589 +585 578 577 586 +612 610 74 615 +761 360 361 763 +662 71 566 667 +542 65 0 582 +548 65 542 582 +657 655 656 659 +648 585 586 653 +593 9 590 594 +569 571 574 579 +578 0 574 579 +0 569 574 579 +576 548 0 582 +572 535 551 590 +9 572 587 590 +0 580 581 582 +547 533 66 583 +583 547 533 590 +618 614 115 923 +644 623 82 662 +531 528 532 596 +584 577 587 610 +608 606 614 615 +577 575 68 588 +597 598 601 966 +591 583 590 594 +591 590 9 594 +575 573 68 588 +585 577 580 647 +527 161 526 596 +578 574 575 588 +575 563 573 588 +585 584 80 586 +567 73 663 667 +577 580 581 585 +578 577 581 585 +686 693 694 695 +597 528 527 602 +580 0 581 585 +189 181 190 934 +582 576 548 589 +572 551 68 589 +582 580 576 589 +577 68 576 589 +582 548 65 589 +577 587 68 589 +65 0 580 593 +609 607 606 615 +548 547 65 589 +649 648 645 652 +575 574 563 588 +574 570 563 588 +577 585 584 647 +586 577 584 588 +635 634 592 639 +607 12 606 615 +12 116 77 620 +123 598 600 633 +599 115 592 611 +582 65 580 589 +576 580 577 589 +81 9 593 594 +587 577 580 589 +68 587 572 589 +589 547 65 590 +65 547 583 590 +601 595 597 602 +632 115 74 635 +644 82 637 645 +970 928 120 997 +541 528 0 595 +591 533 583 595 +80 0 585 648 +80 8 0 648 +9 587 81 593 +541 0 583 595 +587 9 590 593 +583 65 590 593 +590 589 587 593 +65 589 590 593 +589 65 580 593 +580 587 589 593 +951 120 952 972 +593 583 0 594 +531 526 529 596 +593 0 81 594 +595 594 591 598 +0 594 595 598 +526 161 159 596 +988 0 898 994 +939 928 914 970 +612 77 12 615 +965 0 597 966 +520 527 532 602 +9 591 594 600 +601 597 527 602 +528 527 596 597 +534 519 520 602 +0 528 596 597 595 528 0 597 -597 528 0 596 -966 121 0 123 -598 966 601 597 -943 117 873 935 -959 946 964 958 -166 946 958 964 -527 596 528 597 -602 552 533 536 -602 541 528 536 -909 628 619 627 -895 893 940 894 -602 533 534 591 -360 761 762 763 -611 115 615 614 -632 908 907 913 -794 627 787 910 -592 635 78 74 -592 115 635 74 -123 600 598 967 -591 594 600 598 -0 643 637 8 -644 638 571 645 -591 594 9 600 -639 636 0 79 -533 602 595 591 -602 552 536 520 -917 919 938 797 -974 999 0 986 -930 196 203 199 -944 961 932 945 -932 942 934 181 -0 981 989 993 -965 966 0 597 -959 965 0 159 +946 120 951 972 +974 0 121 986 +788 884 883 904 +19 519 534 601 +592 9 81 599 +115 592 74 635 +928 120 960 970 +967 123 600 978 +514 535 572 603 +117 15 940 943 +918 900 117 940 +610 612 74 646 +635 592 78 639 +872 323 931 937 +610 588 573 612 +997 995 954 998 +0 973 986 989 +101 0 740 746 +771 96 687 774 +420 4 366 757 +612 609 610 615 +570 573 588 612 +607 573 565 612 +165 159 157 964 +165 157 163 964 +323 363 799 931 +515 24 19 603 +600 9 591 603 591 595 598 601 -601 595 598 597 -591 601 598 600 -602 528 541 595 -533 602 541 595 -527 597 528 602 -527 528 532 602 -994 898 988 991 -68 609 572 610 -514 535 603 515 -535 534 603 515 -603 534 19 515 -24 19 515 603 -606 360 761 762 -788 806 769 793 -702 764 92 771 -757 759 752 4 -516 24 608 605 -514 572 608 603 -434 763 429 428 -19 968 926 927 -603 600 616 19 -678 684 680 83 -0 641 642 637 -605 608 606 614 -684 567 0 665 -434 762 76 429 -755 792 769 794 -669 621 625 774 -651 650 656 654 -609 607 559 606 -609 560 559 607 -608 609 559 606 -919 915 917 938 -603 608 611 572 -609 560 607 573 -561 560 609 573 -603 24 608 515 -611 615 74 610 -577 610 588 68 -68 573 610 588 -923 913 618 911 +598 595 597 601 +19 591 534 603 +515 19 534 603 +204 195 166 964 +591 598 600 601 +534 520 552 602 +520 536 552 602 +534 591 601 602 +534 533 591 602 +535 515 534 603 +590 591 9 603 +590 9 572 603 +591 590 535 603 +590 572 535 603 +591 535 534 603 +600 123 633 978 +633 123 0 979 +616 599 115 921 +572 514 603 608 +794 773 619 910 +516 360 605 606 +561 68 573 609 +570 565 573 612 +572 68 561 609 +608 572 514 609 +572 587 610 611 +921 614 922 923 +785 782 783 792 +572 561 514 609 +763 762 758 766 +325 323 872 937 +360 6 516 605 +763 364 361 766 +754 100 752 759 +374 428 429 763 +619 96 620 773 +116 619 620 773 +592 74 610 611 +592 115 74 611 +614 115 611 615 +605 516 606 608 +605 24 516 608 +515 516 24 608 +515 514 516 608 +606 516 559 608 559 516 514 608 -516 514 608 515 -788 910 787 114 -80 639 78 584 -610 573 609 612 -570 565 612 72 -68 561 609 573 -572 609 514 608 -587 611 610 572 -592 611 610 587 -921 976 975 983 -638 643 637 644 -584 592 74 610 -82 659 642 650 -914 992 976 113 -622 644 571 662 -922 926 920 925 -816 813 38 307 -616 614 608 24 -68 573 609 610 -615 608 609 611 -581 653 0 578 -883 789 114 917 -599 81 633 9 -780 772 779 10 -611 115 592 74 -0 985 124 984 -906 905 114 912 -615 618 77 12 -95 764 772 92 -704 757 756 94 -623 642 641 644 -606 615 12 604 -606 614 615 604 -107 851 849 850 -92 770 99 768 -908 913 618 923 -908 913 923 912 -923 613 916 919 -614 604 613 923 -960 120 929 962 -606 608 615 614 -957 166 179 947 -124 984 983 993 -906 114 787 910 -916 924 938 919 -9 600 616 603 -9 616 611 603 -603 611 608 616 -616 611 608 614 -611 616 115 614 -611 599 115 616 +603 515 24 608 +120 946 951 961 +784 779 770 826 +603 514 515 608 +607 559 560 609 +561 560 559 609 +561 559 514 609 +752 377 815 821 +514 559 608 609 +607 72 12 612 +609 573 607 612 +977 121 973 986 +609 572 68 610 +609 68 573 610 +588 573 68 610 +763 758 366 766 +374 366 365 763 +120 929 928 960 +875 870 873 935 +610 609 572 611 +609 608 572 611 +611 74 610 615 +819 810 816 821 +603 572 608 611 +72 77 12 612 +0 971 972 974 +980 122 635 982 +916 921 922 923 +894 939 940 991 +621 619 620 629 +686 75 96 756 +611 609 608 615 +12 604 606 615 +203 194 197 929 +611 608 614 615 +606 604 614 615 +922 613 605 925 +604 116 765 911 +12 607 606 762 +46 4 420 757 +30 799 803 804 +608 611 614 616 +608 603 611 616 +603 19 600 616 +611 603 9 616 +603 600 9 616 +616 115 614 921 +942 944 951 961 +916 613 919 923 +918 799 798 924 9 599 611 616 -9 599 616 600 -77 617 620 116 -613 924 916 919 -916 983 976 921 -930 196 929 203 -614 115 615 618 -615 115 74 618 -615 618 74 77 -604 618 614 615 -620 72 622 77 -72 77 612 622 -639 635 634 636 -12 72 620 77 -12 72 75 620 -12 116 620 75 -82 655 659 650 -0 122 907 631 -0 787 627 909 -566 96 620 621 -617 628 630 629 -580 647 0 585 -647 577 584 585 -81 639 0 647 -593 81 647 587 -72 612 570 622 -72 570 71 622 -664 658 0 665 -662 644 571 82 -593 81 0 647 -71 622 662 566 -628 626 619 627 -619 620 629 617 -620 77 629 617 -0 626 14 628 -640 632 631 630 -629 628 641 14 -570 571 662 622 -639 79 0 80 -634 636 0 639 -756 686 96 75 -782 784 780 768 -641 644 642 637 -669 621 14 625 -671 672 0 683 -666 665 567 684 -74 78 646 640 -0 626 625 14 -621 626 14 625 -669 774 625 775 -781 774 771 768 -668 669 625 775 -631 635 636 122 -78 635 636 631 -626 621 14 628 -621 623 14 629 -598 633 594 600 -107 861 857 850 -646 584 74 610 -619 621 626 628 -619 629 628 617 -619 621 628 629 -619 620 621 629 -566 629 621 620 -566 622 629 620 -622 77 629 620 -569 82 663 662 -665 658 671 670 -622 623 566 629 -629 623 566 621 -874 117 918 900 -642 644 82 637 -0 981 124 980 -617 630 640 629 -651 652 0 649 -629 640 644 641 -644 643 641 640 -632 618 617 77 -74 618 632 77 -74 115 632 618 -0 907 909 630 -951 961 944 120 -617 116 913 910 -914 920 976 969 -617 909 630 628 -974 120 970 960 -773 619 910 116 -973 975 981 979 -944 943 996 939 -987 989 125 988 -638 79 8 643 -633 978 123 979 -0 636 631 79 -636 79 78 631 -917 915 905 902 -629 628 630 641 -788 910 114 793 -81 633 634 599 -908 985 907 913 -983 982 921 908 -81 633 0 634 -635 115 632 74 -644 645 571 82 -0 122 631 636 -0 628 641 630 -0 14 624 642 -623 642 624 14 -648 80 0 8 -81 634 0 639 -77 640 622 629 -81 634 639 592 -0 624 659 642 -638 637 8 645 -623 661 669 624 -0 631 630 643 -584 78 80 638 -80 79 638 78 -80 79 8 638 +599 9 600 616 +687 764 771 774 +599 9 81 633 +905 902 903 917 +798 900 918 938 +594 81 9 633 +905 903 904 917 +323 199 198 931 +604 765 800 911 +773 765 116 793 +612 72 77 622 +620 77 72 622 +570 71 72 622 +610 74 584 646 +570 72 612 622 +729 727 91 736 +116 773 793 910 +644 637 638 645 +622 644 571 662 +620 566 96 621 +566 72 71 622 +82 569 662 663 +661 655 82 663 +679 674 673 682 +81 587 592 647 +587 584 592 647 +593 587 81 647 +585 580 0 647 +577 584 587 647 +0 593 81 647 +593 0 580 647 +607 434 76 689 +577 587 580 647 +593 580 587 647 586 584 80 638 -586 571 646 638 -647 639 0 80 -78 631 643 640 -640 631 643 630 +655 654 0 656 +661 624 666 669 +77 622 629 640 +665 660 658 670 +0 665 671 683 +683 665 83 684 +683 0 665 684 +770 92 97 772 +625 668 669 775 +624 14 0 625 +668 625 10 775 +774 10 625 775 +639 81 592 647 +644 571 82 645 +630 640 641 643 +973 975 125 989 +626 619 621 628 +628 619 621 629 +625 14 0 626 +6 605 761 801 +941 932 118 944 +968 922 920 976 +14 628 629 641 +626 14 0 628 +620 619 617 629 +620 617 77 629 +622 620 77 629 +623 566 622 629 +623 621 566 629 +638 79 8 643 78 79 638 643 -0 643 630 641 -586 571 638 645 -623 641 642 14 -622 623 662 566 -645 637 8 649 -80 647 639 584 -664 657 0 658 -653 579 0 578 -655 659 650 656 -647 584 577 587 -74 632 640 77 -632 617 640 77 +594 9 600 633 +622 566 620 629 +621 620 566 629 +641 629 623 644 +77 617 618 632 +971 960 120 974 +568 0 73 663 +622 623 629 644 +628 14 0 641 +640 631 78 643 +627 619 628 909 +793 116 910 911 +617 628 619 909 +0 870 876 935 +630 631 0 907 +631 0 122 636 +907 906 0 909 +635 78 631 636 +571 569 82 645 +631 78 79 636 +631 79 0 636 +630 617 632 907 +992 975 983 993 +924 919 795 938 +568 569 0 663 +906 787 0 909 +637 8 0 643 +628 0 630 641 +971 120 972 974 +0 628 630 909 +633 0 81 634 +979 975 973 981 +635 631 122 636 +122 635 636 980 +971 0 121 974 +992 984 897 993 +990 988 125 991 +0 637 641 642 +637 82 642 650 +634 81 592 639 +78 631 79 643 +612 610 588 646 +8 79 0 643 +650 651 654 656 +655 82 650 659 +652 0 648 653 +636 78 79 639 +638 586 584 646 +584 588 610 646 +74 612 77 646 +655 650 654 656 +588 570 612 646 +622 570 571 646 +80 79 8 638 +79 80 78 638 +639 592 584 647 +0 80 585 647 +584 78 80 638 +14 624 0 642 +78 638 640 643 +650 0 651 656 +641 623 14 642 +76 75 72 686 +631 78 632 640 +632 630 631 640 +584 585 80 647 +639 584 80 647 +632 74 77 640 +632 77 617 640 +629 617 77 640 617 630 632 640 -584 647 639 592 -0 14 642 641 +617 629 630 640 +640 629 630 641 +79 631 0 643 +8 638 637 645 +637 0 641 643 +641 640 629 644 +643 640 641 644 +643 638 640 644 +641 637 643 644 +637 638 643 644 +642 637 641 644 +82 637 642 644 +612 570 622 646 +642 641 623 644 +642 623 82 644 +656 650 0 659 +651 649 650 654 +679 681 682 683 +656 0 657 659 +640 74 77 646 +644 640 622 646 +78 74 640 646 +78 584 74 646 +638 78 640 646 +638 584 78 646 +644 638 640 646 +571 638 644 646 +8 637 0 649 +585 0 581 653 +649 645 650 654 +648 579 652 653 +652 579 0 653 +637 8 645 649 +648 645 8 649 648 8 0 649 -638 643 8 637 -0 631 643 79 -78 631 79 643 -77 646 622 640 -71 662 667 566 -647 81 639 592 -638 643 644 640 -587 81 647 592 -587 647 584 592 -629 640 622 644 -580 593 0 647 -648 585 80 586 -623 644 82 642 -569 571 579 645 -579 571 586 645 -644 645 82 637 -644 638 645 637 -571 646 622 570 -571 588 646 570 -588 571 646 586 -588 646 584 586 -646 584 610 588 -622 646 571 644 -77 646 612 622 -77 74 612 646 -0 659 650 642 -0 659 656 650 -664 665 0 567 -653 652 0 579 -581 585 653 578 -581 585 0 653 -645 652 654 649 -569 654 0 655 -82 642 637 650 -0 642 650 637 -932 190 181 934 -0 650 656 651 -0 650 651 649 -653 585 0 648 -579 653 648 586 -652 653 0 648 -663 664 0 567 -656 655 0 654 -654 651 650 649 -651 656 0 654 -568 569 662 571 -569 82 654 655 -652 651 654 649 -645 579 654 652 -654 579 0 652 -569 579 0 654 +86 676 677 679 +667 666 567 678 +651 0 649 652 +670 83 668 677 +586 585 578 653 +648 586 579 653 +650 642 0 659 +0 649 650 651 +83 680 681 684 +654 0 569 655 +656 655 650 659 +569 568 662 663 +579 645 648 652 +649 651 652 654 +650 645 82 654 +645 569 82 654 +652 579 645 654 645 579 569 654 -82 645 569 654 -82 645 654 650 -655 657 0 664 -82 661 659 655 -86 83 680 679 -662 82 661 623 -0 624 660 659 -71 570 662 622 -721 675 722 714 -0 624 668 660 -656 657 0 655 -655 657 659 656 -0 657 656 659 -661 624 659 660 -90 682 0 84 -568 662 663 73 +579 652 0 654 +579 0 569 654 +652 651 0 654 +657 658 0 664 +654 569 82 655 +566 623 622 662 +71 566 622 662 +661 666 667 669 +570 568 71 662 +667 566 623 669 +663 655 0 664 +0 671 672 683 +0 655 656 657 +622 570 71 662 +82 623 661 662 +662 568 73 663 +650 82 642 659 +642 624 0 659 +665 567 666 684 +569 571 82 662 +570 571 568 662 +663 567 661 664 +659 624 0 660 +659 0 657 660 +658 657 0 660 +729 91 11 730 +665 0 567 684 +568 73 71 662 +642 623 624 661 +659 642 624 661 +659 82 642 661 +662 73 71 667 +432 437 438 689 +660 659 624 661 +0 676 677 776 +659 655 82 661 +664 0 567 665 +664 658 0 665 +0 564 73 691 +624 660 661 666 +568 571 569 662 +659 657 655 664 +657 659 660 664 +570 622 571 662 +661 659 655 664 663 661 655 664 -682 683 0 672 -669 661 666 624 -0 785 782 783 -668 625 669 624 -666 668 669 624 -0 660 658 657 -0 659 660 657 -622 644 662 623 -568 71 662 73 -71 568 662 570 -655 664 0 663 -569 82 655 663 -663 73 0 568 -567 73 0 663 -0 677 676 673 -663 82 655 661 -663 82 661 662 -623 642 82 661 -82 661 642 659 -661 624 642 659 -623 642 661 624 -568 569 663 662 -86 677 676 776 -661 660 659 664 -659 664 657 655 -661 664 659 655 -666 664 567 665 -623 669 14 624 -661 664 567 666 -658 671 0 665 -566 669 667 687 -760 308 747 364 -660 658 664 665 -764 678 680 775 -661 660 666 624 -72 686 76 75 -83 775 668 677 -772 774 775 10 -660 664 666 665 -660 664 661 666 -666 660 668 624 -748 94 754 757 +663 0 567 664 0 660 668 670 -660 670 666 668 -674 682 84 672 -667 661 567 666 -663 661 567 667 -663 667 567 73 -663 662 667 73 -662 71 667 73 -663 661 667 662 +567 663 661 667 +664 660 658 665 +564 432 565 688 +778 97 776 779 +660 666 668 670 +688 432 565 689 +670 0 658 671 +683 681 0 684 +52 417 416 706 +71 73 564 691 +567 664 665 666 +664 567 661 666 +665 664 660 666 +664 661 660 666 +662 661 663 667 +672 0 84 674 +677 83 86 679 +666 567 661 667 +662 566 623 667 662 623 661 667 -800 604 761 765 -792 768 782 781 -0 670 673 671 -673 679 674 682 -0 670 671 658 -721 674 722 675 -717 84 0 722 -431 693 419 430 -706 52 417 45 -566 623 669 621 -566 623 667 669 -667 623 661 669 -667 669 661 666 -71 564 691 73 -682 672 0 84 -432 689 430 437 -684 683 681 83 -0 672 673 674 -0 673 672 671 -776 676 85 777 -721 676 674 675 -882 881 887 883 -710 725 0 11 -0 677 673 670 -726 719 701 721 -97 776 779 772 -0 103 101 740 -726 719 700 701 -97 779 770 772 -718 713 0 712 -773 755 756 767 -722 84 0 674 -722 724 0 717 -621 96 781 774 -0 784 782 785 +83 677 86 775 +0 658 660 670 +607 76 565 689 +665 658 0 671 +83 681 683 684 +666 624 660 668 +660 624 0 668 +661 623 624 669 +805 797 796 881 +668 666 624 669 +668 624 625 669 +625 624 14 669 +623 14 624 669 +621 625 14 669 +623 621 14 669 +721 714 726 732 +560 434 607 689 +741 739 0 744 +673 0 672 674 +10 86 772 776 +671 0 672 673 +671 670 0 673 +735 727 731 737 +94 755 756 771 +679 676 674 721 +742 741 0 743 +676 673 0 677 +669 687 774 775 +673 670 0 677 +709 700 711 726 +732 675 91 777 +668 0 670 677 +734 770 778 826 +75 620 96 773 +744 708 93 745 +85 731 97 777 +731 85 732 777 675 674 0 676 -777 675 0 676 -732 714 710 11 -0 776 10 779 -773 756 96 75 -71 565 688 564 -83 677 670 673 -51 697 693 692 -693 694 695 704 -841 844 843 845 -687 566 669 621 -923 614 922 613 -782 792 783 785 -51 697 419 693 -669 666 667 678 -667 666 567 678 -667 567 685 678 -0 626 780 625 -431 432 688 430 -566 71 690 667 -680 681 679 83 -774 772 780 10 -776 86 85 676 -690 691 685 73 -757 758 767 759 -51 693 419 431 -86 720 95 85 -690 678 685 696 -690 667 73 685 -822 832 831 827 -429 76 430 694 -87 700 0 88 -0 780 10 625 -698 681 0 699 -703 95 705 709 -828 830 809 829 -700 89 0 88 -416 417 415 706 -71 691 688 690 -681 683 0 682 -679 681 682 683 -673 683 679 682 -683 670 671 673 -683 671 672 673 -665 670 671 683 -434 429 689 426 +732 85 675 777 +778 770 97 779 +625 0 10 780 +777 0 735 778 +755 769 773 794 +10 0 668 677 +90 0 84 682 +680 83 678 684 +680 679 83 681 +434 429 76 689 +677 10 86 775 +772 770 768 779 +75 758 762 765 +676 86 677 776 +690 71 688 691 +685 73 690 691 +564 565 71 688 +690 73 71 691 +685 0 73 691 +712 710 714 725 +670 665 83 683 +565 432 562 689 +688 564 432 691 +704 695 94 756 +565 76 688 689 +560 565 562 689 +84 672 674 682 +84 674 90 682 +679 83 86 680 +773 767 765 793 +426 429 434 689 +560 433 434 689 +700 699 719 720 +438 560 562 689 +87 45 53 705 +0 89 88 700 +731 735 734 778 +87 0 88 700 +681 679 83 683 +673 679 682 683 +679 673 83 683 +681 0 682 683 +682 0 672 683 +682 672 673 683 +83 665 666 684 +678 666 567 684 +678 83 666 684 +0 431 432 691 71 564 688 691 -678 687 696 690 -607 560 689 565 -562 689 565 432 -689 429 76 430 -432 689 688 430 -73 685 0 691 -562 560 689 438 -432 438 689 437 -688 694 686 693 -688 76 686 694 -560 433 689 438 -432 691 0 431 +567 667 678 685 667 567 73 685 -685 73 0 567 -684 685 0 567 -434 429 76 689 -689 607 76 434 -560 607 689 434 -431 432 691 688 -51 692 693 431 -73 691 0 564 -854 858 108 270 -365 367 428 763 -71 691 690 73 -829 828 100 753 -692 685 0 698 -688 686 76 72 -565 688 76 72 -565 71 688 72 -688 71 686 72 -690 667 685 678 -693 704 695 697 -698 684 681 680 -690 687 695 686 -607 689 76 565 -565 689 76 688 -696 693 695 697 -51 53 697 692 -690 692 693 696 -697 692 53 696 -680 698 684 678 -430 694 419 420 -429 694 430 420 -431 692 0 51 -692 53 0 51 -607 762 606 12 -361 763 365 364 -680 698 699 681 -707 743 0 708 -685 692 0 691 -691 692 0 431 -714 701 712 718 +567 678 684 685 +684 0 567 685 +0 73 567 685 +0 53 692 698 +667 669 678 687 +718 717 716 724 +703 92 95 751 +417 51 53 697 +45 417 52 706 +45 87 707 709 +52 46 419 704 +71 72 686 688 +72 76 686 688 +76 72 565 688 431 691 692 693 -693 691 692 690 -693 692 697 696 -703 93 702 92 -768 771 92 772 -696 678 685 698 -695 696 690 693 -686 688 693 690 -688 691 693 690 -431 691 693 688 -741 731 727 737 -86 679 720 85 -698 684 0 681 -685 684 0 698 -757 767 756 754 -752 746 102 748 -775 669 666 668 -696 697 702 705 -846 110 111 836 -89 712 0 710 -780 772 768 779 -699 705 698 680 -705 696 698 680 -96 774 771 781 -52 51 697 419 -52 51 417 697 -52 697 417 45 -742 741 0 743 -772 10 776 779 -732 85 721 675 -416 0 706 415 -700 701 0 89 -699 720 681 719 -720 681 719 679 -86 680 95 720 -680 681 720 679 -90 84 0 717 -414 706 379 52 -45 53 87 705 -53 697 705 45 -730 724 725 728 -0 713 723 725 -724 722 0 730 -696 695 702 697 -416 0 414 706 -705 697 702 45 -770 779 784 768 -45 705 709 703 +693 688 686 694 +731 85 97 750 +431 688 691 693 +52 416 414 706 +693 430 688 694 +702 697 704 749 +696 680 678 698 +686 76 75 694 +430 432 431 688 +688 432 431 691 +0 675 676 777 +692 690 685 696 +431 430 688 693 +430 76 688 694 +76 430 688 689 +688 430 432 689 +701 89 710 712 +680 86 95 764 +429 434 76 762 +686 71 688 690 +678 685 690 696 +0 87 699 700 +691 0 431 692 +691 685 0 692 +766 765 758 767 +417 415 416 706 +94 102 748 754 +762 604 12 765 +606 434 360 762 +88 87 700 709 +690 685 691 692 +690 693 695 696 +751 97 734 770 +53 698 699 705 +0 675 91 730 +419 430 431 693 +51 431 692 693 +431 51 419 693 +692 53 696 698 +684 680 681 698 +678 680 684 698 +732 726 85 750 +781 768 755 792 +759 754 100 767 +719 700 720 726 +751 92 97 770 +695 687 690 696 +687 678 690 696 +922 616 921 968 +761 765 766 800 740 102 101 746 -378 752 377 4 -45 705 703 702 +713 712 0 718 +693 51 419 697 +692 51 693 697 +692 53 51 697 +698 53 696 705 +53 692 696 697 +692 693 696 697 +696 693 695 697 +698 680 681 699 +698 0 53 699 +87 53 0 699 +414 379 52 706 +724 0 723 728 +709 705 699 720 +719 699 681 720 +86 95 85 720 +680 699 705 720 +86 679 680 720 +700 0 89 701 +697 53 45 705 +699 698 680 705 +731 97 734 751 +696 53 697 705 +702 696 697 705 +695 696 697 702 +762 12 75 765 +415 87 88 707 +706 45 415 707 +0 103 101 740 +702 92 95 703 +737 727 731 741 +414 0 379 706 +739 737 734 741 +768 782 784 792 +95 702 703 705 +45 703 702 705 +420 419 46 704 +694 419 420 704 +419 693 697 704 +694 693 419 704 +697 693 695 704 +695 693 694 704 +697 695 702 704 +695 94 702 704 +428 374 365 763 +45 702 697 705 +116 75 12 765 +87 415 45 707 +0 710 89 712 +694 75 756 758 +716 713 0 718 +0 90 84 717 +713 716 723 724 +706 415 0 707 +88 0 415 707 705 699 87 709 -801 803 802 322 -743 708 707 703 -749 706 708 45 -0 843 786 885 -743 709 750 703 -52 419 704 46 -704 46 419 420 -704 419 694 420 -760 308 364 309 -0 677 776 676 -52 419 697 704 -95 750 709 703 -53 697 696 705 -696 53 705 698 -415 707 706 45 -707 415 87 45 -714 724 725 730 -727 742 0 11 -711 726 710 742 -88 415 87 707 -415 0 707 88 -415 0 706 707 -707 87 88 709 -45 87 707 709 -707 709 743 703 -379 748 46 749 -750 732 726 742 -45 703 707 708 -378 379 0 745 -703 744 708 93 -740 746 0 745 -735 734 778 825 -714 732 730 11 -756 695 771 96 -706 0 708 707 -706 707 708 45 -747 377 752 4 -711 709 750 743 -711 750 742 743 -38 817 305 32 -88 711 0 707 -710 714 725 11 -699 719 0 700 -714 718 712 725 -0 91 729 730 -718 717 716 724 -716 715 0 713 +705 95 680 720 +752 748 102 754 +747 4 377 752 +4 378 377 752 +707 706 45 708 +0 706 707 708 +706 0 379 708 +102 740 745 746 +720 95 85 750 +709 720 726 750 +748 93 94 749 +707 45 703 708 +700 89 88 711 711 710 0 742 -719 681 682 679 -0 729 727 11 -714 710 701 726 -675 722 0 674 -91 730 0 675 -718 716 0 713 -95 97 751 92 -719 90 0 701 -718 722 724 714 -89 710 726 701 -710 701 712 714 -721 719 701 90 -90 719 682 721 -714 721 701 90 -714 730 725 11 -381 747 372 4 -90 722 718 714 -701 718 0 712 -720 719 726 721 -701 90 718 714 +89 0 88 711 +97 731 734 778 +739 103 0 740 +743 0 708 744 +716 717 0 724 +719 90 701 721 +761 605 613 801 +722 0 717 724 +727 91 731 732 +97 731 750 751 +719 701 700 726 +753 102 101 820 +715 713 0 716 +85 679 720 721 +0 710 11 742 +0 715 716 723 +85 731 732 750 +699 700 709 720 +816 813 810 818 +717 90 84 722 +674 84 90 722 +710 726 732 742 +309 322 802 803 +0 778 779 826 701 90 0 718 -90 717 0 718 -718 717 0 716 -750 97 731 751 -721 719 682 679 -90 721 682 674 -721 679 682 674 -675 732 730 714 -679 721 719 720 -730 732 91 11 -85 676 721 675 -679 721 720 85 +716 0 723 724 +714 701 712 718 +90 701 714 718 +726 85 721 732 +712 701 0 718 +717 0 90 718 +717 716 0 718 +713 715 0 723 +722 714 675 730 +719 682 90 721 +682 674 90 721 +712 0 710 725 +676 85 675 721 +701 700 0 719 +699 0 700 719 +699 681 0 719 +682 679 674 721 +712 713 0 725 +718 716 713 724 +681 679 682 719 +0 681 682 719 +682 90 0 719 +721 714 675 722 85 676 679 721 -730 722 0 675 -681 719 0 699 -719 681 0 682 -90 719 0 682 -710 714 712 725 -679 676 674 721 -95 680 705 720 -705 680 699 720 +90 701 0 719 699 680 681 720 -705 699 709 720 -709 699 700 720 -709 95 705 720 -742 732 11 727 -754 100 769 828 -90 674 84 722 -90 722 84 717 +719 681 679 720 +681 680 679 720 +718 713 712 725 +720 700 709 726 +91 0 735 777 +721 674 90 722 +726 710 711 742 +712 714 718 725 90 717 718 722 -93 751 733 92 -703 95 750 751 -723 715 0 716 -716 723 715 713 -0 713 715 723 -718 725 724 713 -724 725 723 713 -725 718 712 713 -718 714 724 725 -753 752 815 821 -91 675 0 777 -95 772 97 92 -708 744 0 745 -45 708 749 703 -93 703 751 92 -11 732 91 727 -703 95 751 92 -709 720 700 726 -720 719 700 726 -711 709 700 726 -89 711 700 726 -89 711 726 710 -75 767 756 758 -730 91 729 11 -0 824 738 823 -102 733 93 740 -381 377 747 4 -751 741 743 744 -731 91 735 777 -0 826 784 831 -773 769 767 793 -735 737 736 727 -0 738 739 737 -0 729 736 727 -703 751 744 93 -732 11 710 742 -75 773 767 765 -822 834 827 103 -695 687 771 96 -760 814 813 308 -45 749 702 703 -0 736 737 727 -93 733 99 92 -102 99 93 733 -751 741 739 734 -703 750 743 751 -95 97 750 751 -721 732 726 85 -721 714 726 732 -675 732 91 730 -76 762 12 75 -740 733 744 739 -827 826 791 770 -0 737 739 741 -734 735 731 737 -752 754 759 757 -696 695 764 702 -707 711 0 743 -741 731 737 734 -739 741 737 734 -760 796 807 814 -621 781 626 774 -755 756 771 96 -837 809 835 104 -729 91 736 727 -0 91 736 729 -776 777 0 676 -97 778 734 770 -0 776 778 777 -772 779 770 768 -769 790 794 792 -740 733 739 103 -742 731 732 727 -0 104 835 819 -794 792 782 781 -889 882 883 903 -0 835 106 819 -814 803 812 39 -753 828 100 754 -739 734 737 738 -822 832 833 831 -740 733 93 744 -833 838 834 105 -727 741 0 742 -741 731 742 727 -744 739 0 740 -741 744 0 743 -45 749 697 702 -749 704 94 748 -621 626 625 774 -378 746 377 752 -52 704 749 46 -749 704 697 702 -747 366 372 4 -731 97 734 751 -759 760 747 364 -707 709 711 743 -711 742 0 743 -703 743 708 744 -745 379 0 708 -749 706 379 708 -751 741 744 739 -52 379 46 749 -865 866 818 811 -93 102 740 745 -93 740 744 745 -93 744 708 745 -52 697 749 704 -745 746 0 378 -746 377 0 378 -745 102 740 746 -749 46 704 748 -93 749 748 745 -814 802 803 309 -0 842 861 847 -816 815 307 821 -307 747 383 377 -377 383 381 747 -747 383 381 372 -747 376 383 372 +714 90 718 722 +721 675 674 722 +721 90 714 722 +713 718 724 725 +714 710 11 725 +104 103 0 834 +723 713 724 725 +0 713 723 725 +710 0 11 725 +903 883 904 917 +701 719 721 726 +721 719 720 726 +714 701 721 726 +85 97 776 777 +720 85 721 726 +89 701 710 726 +89 700 701 726 +711 700 89 726 +89 710 711 726 +86 676 85 776 +91 727 11 732 +750 95 97 751 +95 92 97 751 +714 710 701 726 +94 93 702 749 +730 714 675 732 +714 721 675 732 +721 85 675 732 +730 11 714 732 +726 714 710 732 +810 106 816 818 +735 731 734 737 +11 0 727 729 +729 0 727 736 +190 932 933 934 +308 376 383 747 +728 0 11 729 +758 429 76 762 +791 820 822 827 +915 902 905 917 +626 627 0 782 +796 803 805 814 +917 915 901 938 +744 741 739 751 +0 11 727 742 +739 734 733 751 +743 741 0 744 +734 739 741 751 +741 731 734 751 +750 703 95 751 +711 707 709 743 +694 686 695 756 +765 116 75 773 +0 842 112 888 +741 743 750 751 +697 45 52 749 +0 737 738 739 +735 91 727 736 +784 0 779 826 +778 0 735 825 +0 729 91 736 +0 91 735 736 +756 695 94 771 +94 695 702 771 +94 99 102 754 +747 308 364 760 +383 372 381 747 +835 0 106 851 +739 733 103 740 +848 841 847 851 +727 735 736 737 +704 697 52 749 +736 0 727 737 +383 376 372 747 +93 102 733 740 +819 104 0 835 +0 104 105 835 +98 0 831 833 +104 0 105 834 +791 784 770 826 +0 711 742 743 +383 381 377 747 +737 731 734 741 +737 734 738 739 +792 791 99 828 +732 727 11 742 +741 0 727 742 +741 727 731 742 +731 727 732 742 +744 703 743 751 +744 739 733 751 +744 733 93 751 +744 93 703 751 +0 707 711 743 +709 707 703 743 364 372 376 747 -613 801 761 605 -696 687 764 695 -750 85 731 97 -420 758 429 694 -95 85 750 97 -750 85 732 731 -816 815 810 813 -750 731 732 742 -379 378 46 748 -379 378 748 745 -378 745 746 748 -52 706 749 45 -52 697 45 749 -52 706 379 749 -720 750 95 85 -720 726 750 85 -750 85 726 732 -750 726 720 709 -95 750 720 709 -711 709 726 750 -733 751 739 734 -751 731 741 734 -360 761 763 361 -694 758 756 757 -378 748 752 4 -378 748 746 752 -762 763 758 429 -102 94 754 748 -816 819 810 821 -808 760 807 100 -816 813 307 815 -858 857 860 859 -806 769 100 829 -760 814 807 813 -751 734 733 770 -791 784 785 792 -823 825 737 735 -753 100 752 754 -377 0 307 821 -92 97 770 772 -762 766 761 765 -911 604 765 116 -791 768 784 792 -771 768 99 755 -782 792 784 768 -746 0 821 101 -774 775 764 772 -76 607 762 434 -607 76 762 12 -763 761 766 361 -361 761 802 801 -762 758 766 765 -97 778 770 779 -755 794 769 773 -821 0 307 816 -771 99 92 94 -94 702 92 771 -92 768 99 771 -822 827 791 820 -755 768 792 781 -764 680 95 86 -748 757 752 4 -748 754 752 757 -704 46 420 757 -420 757 694 704 -104 822 820 103 -104 835 819 809 +733 93 740 744 +812 804 805 864 +733 92 93 751 +740 739 733 744 +703 707 708 743 +740 0 744 745 +94 92 99 771 +708 0 379 745 +378 379 0 745 +702 45 697 749 +379 708 745 749 +744 0 708 745 +744 93 740 745 +0 378 745 746 +377 378 0 746 +745 740 0 746 +381 4 377 747 +383 377 307 747 +383 307 308 747 +810 807 813 815 +738 737 823 825 +100 759 767 808 +834 833 832 838 361 367 365 763 -420 366 758 757 +859 856 812 864 +708 45 703 749 +4 46 378 748 +746 378 745 748 +815 307 816 821 +819 816 0 821 +306 39 309 814 +678 669 666 775 +803 309 39 814 +802 760 309 814 +46 420 704 757 +111 110 0 845 +745 102 746 748 +745 708 93 749 +704 46 748 749 +93 708 703 749 +709 711 743 750 +743 711 742 750 +703 709 743 750 +731 741 742 750 +748 94 754 757 +743 742 741 750 +750 731 741 751 +703 93 92 751 +748 746 378 752 +694 76 75 758 +942 181 180 948 +704 94 748 757 +781 627 782 794 +620 75 116 773 +748 102 746 752 +800 761 613 801 +13 840 841 850 +752 100 753 815 +811 829 839 886 +813 760 807 814 +752 102 746 753 +746 102 101 753 +114 789 793 911 +753 752 102 754 +100 752 753 754 +748 4 46 757 +754 94 99 755 +822 103 104 834 +99 768 770 791 +932 941 942 944 +764 695 687 771 +755 96 756 771 +86 97 772 776 +791 99 768 792 +797 796 795 805 +801 800 761 802 +798 795 799 803 +887 865 880 888 +733 99 92 770 +751 733 92 770 +434 607 76 762 +763 761 762 766 +252 192 325 873 +434 606 607 762 +12 76 607 762 +765 762 761 766 +948 947 942 949 +747 377 307 815 +758 757 759 767 +100 807 806 829 +94 704 756 757 +366 420 757 758 420 366 429 758 -764 696 705 680 +757 420 694 758 +694 420 429 758 +756 757 758 767 +761 604 606 762 +765 75 758 767 +758 366 429 763 +839 98 837 843 +813 306 308 814 +0 38 307 816 +100 810 807 829 +694 429 76 758 +762 429 434 763 +428 365 367 763 361 360 367 763 -360 428 367 763 -767 766 759 758 -754 100 759 767 -763 366 365 364 -365 763 374 366 -814 309 306 308 -808 802 766 800 -762 607 606 434 -76 758 762 75 -813 306 38 308 -311 804 39 812 -805 803 796 795 -912 917 114 919 -252 192 873 190 -323 799 931 363 -732 777 91 731 -0 106 816 819 -104 820 809 101 -881 796 805 866 -893 117 936 940 -0 817 305 38 -984 915 905 912 -763 361 766 364 -798 799 803 795 -0 819 816 821 -606 360 605 761 -377 0 821 746 -696 702 764 705 -764 702 95 705 -96 687 774 621 -0 844 843 885 -687 669 774 621 -75 116 773 765 -913 116 911 910 -605 801 761 6 -0 779 10 780 -801 799 803 322 -364 766 759 760 -366 766 759 364 -366 763 766 364 -366 763 758 766 -762 766 758 763 -762 761 766 763 -366 766 758 759 -863 879 869 864 -775 86 764 772 -772 775 86 10 -813 814 306 308 -755 99 771 94 -755 769 767 773 -777 676 85 675 -764 775 680 86 -775 83 678 680 -95 86 772 764 -95 86 97 772 -775 677 86 10 -668 775 625 10 -97 776 85 777 -620 619 773 116 -783 782 627 794 -687 774 764 771 -767 808 766 765 -97 777 778 776 -774 772 764 771 -687 774 771 96 -805 803 812 814 -613 800 761 801 -889 890 112 887 -912 913 923 911 -782 792 785 784 -782 794 783 792 -125 977 914 976 -613 924 919 795 -769 790 788 794 -822 827 831 791 -796 795 800 789 -769 100 754 767 -755 769 754 767 -810 829 100 753 -810 809 829 753 -775 774 625 10 -677 775 668 10 -86 83 775 680 -782 780 626 781 -822 827 820 103 -814 803 39 309 -780 774 626 781 -784 779 780 768 -733 734 827 770 -0 786 785 783 -733 770 791 99 -97 86 776 772 +361 761 763 766 +604 12 606 762 +758 76 75 762 +746 101 0 821 +886 881 883 887 +776 0 676 777 +15 918 920 931 +761 606 360 762 +789 795 800 919 +827 738 103 834 +758 75 756 767 +759 757 754 767 +758 759 766 767 +0 98 110 833 +830 791 822 831 +916 915 912 919 +613 911 919 923 +934 932 118 941 +92 702 95 764 +675 0 91 777 +669 668 666 775 +901 899 900 938 +677 83 668 775 +751 734 733 770 +883 114 904 917 +86 10 772 775 +834 0 105 838 +114 787 788 904 +625 669 774 775 +103 822 827 834 +767 765 75 773 +0 625 626 780 +308 813 760 815 +788 787 884 904 +731 91 735 777 +732 91 731 777 +702 92 94 771 +764 702 695 771 +626 0 780 782 +96 695 756 771 +784 770 768 791 +95 92 764 772 +771 764 92 772 +92 95 97 772 +790 788 769 794 +911 114 789 919 +627 626 781 782 +764 92 702 771 +768 755 771 781 +618 116 604 911 +776 676 85 777 +769 790 828 829 +803 798 795 805 +945 932 193 961 +855 854 852 860 +794 787 788 910 +773 769 767 793 +669 621 625 774 +805 859 864 880 +767 755 754 769 +767 754 100 769 +789 806 796 881 +811 806 807 829 +768 784 791 792 +626 625 621 774 +776 10 0 779 +806 881 883 886 +626 780 781 782 +782 0 780 784 +949 953 0 955 +39 306 812 814 +764 86 95 772 +97 95 86 772 +772 764 86 775 +774 772 10 775 +781 780 768 782 +773 96 755 781 +825 734 826 827 +976 113 914 992 +322 309 39 803 +812 306 32 814 +779 10 0 780 +768 771 772 774 +806 811 807 881 +96 621 687 774 +680 83 86 775 +764 680 86 775 +678 680 764 775 +764 687 678 775 +774 687 764 775 97 86 85 776 -774 772 768 780 -687 678 764 775 -678 775 687 669 -687 669 775 774 -669 666 678 775 -775 666 678 83 -772 86 776 10 -86 677 776 10 -0 677 10 776 -0 782 627 783 -830 822 791 820 -820 102 101 740 -0 892 879 877 -755 792 768 99 -792 791 768 99 -731 735 734 778 -731 778 734 97 -731 777 778 97 -731 777 735 778 -0 778 735 777 -842 847 840 850 +785 791 792 830 +777 97 776 778 +0 782 783 785 +735 731 777 778 +932 190 181 934 +777 776 0 778 +823 0 738 824 +772 774 10 780 +10 774 625 780 +768 772 779 780 +779 772 10 780 +925 922 920 926 +203 193 194 961 774 626 625 780 -97 776 778 779 -0 776 779 778 -806 796 789 881 -755 781 773 96 -773 781 619 96 +772 768 774 780 +781 619 627 794 +919 795 613 924 +784 782 0 785 +773 619 96 781 +774 96 621 781 621 96 619 781 -621 619 626 781 -627 781 626 619 -820 733 740 103 -910 913 906 114 -768 774 780 781 -771 781 755 96 -809 822 830 820 -0 782 780 626 -0 627 782 626 -630 632 631 907 -822 831 830 791 -0 784 779 780 -0 782 784 780 -795 798 797 805 -807 806 100 829 -0 824 832 838 +621 626 774 781 +619 626 621 781 +780 774 626 781 +832 822 831 833 +626 619 627 781 +0 894 895 898 +363 6 322 801 +770 734 733 827 +783 788 790 794 +766 361 761 802 +782 627 0 783 +782 780 768 784 +779 768 780 784 +792 781 782 794 +517 24 605 925 +779 770 768 784 +876 875 117 935 +807 796 760 808 +859 32 857 866 +308 309 760 814 +792 782 783 794 +306 265 39 812 +306 32 265 812 +793 765 116 911 +937 15 117 943 +785 0 98 786 +783 0 785 786 +617 907 909 913 +619 617 909 910 +0 627 628 909 +787 627 0 909 +15 914 113 940 +783 627 0 787 +877 882 888 890 +735 0 736 823 +0 825 826 832 +105 833 834 838 +825 778 0 826 +826 827 831 832 +881 880 797 882 +892 895 0 936 +101 746 753 821 +766 759 760 808 +865 880 881 887 +865 840 842 887 +768 781 782 792 +307 813 815 816 +785 783 786 790 +920 922 916 976 +106 816 0 819 +752 746 377 821 +614 613 605 922 +995 998 999 1000 +916 976 983 992 +765 761 604 800 +813 810 815 816 +767 766 765 808 +767 759 766 808 +783 782 627 794 +176 167 179 956 +783 787 788 794 +787 783 627 794 +822 98 830 831 +813 308 760 814 +806 100 769 808 +800 765 766 808 +834 824 0 838 +770 733 99 791 +783 790 792 794 +793 773 769 794 +910 909 906 913 +98 0 110 843 +788 769 793 806 +871 872 874 875 +0 784 785 831 +804 39 311 812 +733 102 99 820 +800 766 802 808 +887 112 842 888 +822 820 103 827 +110 841 843 845 +13 811 810 829 +812 803 39 814 +828 809 753 829 +734 778 825 826 +796 807 760 814 +802 309 803 814 +807 810 811 829 +819 101 753 821 +983 975 124 993 +753 810 100 829 361 6 761 801 -769 100 767 808 -813 760 308 815 -632 913 618 908 -815 747 307 377 -931 323 872 799 -905 917 114 912 -755 781 794 773 -792 794 783 790 -838 833 846 105 -0 98 785 786 -987 990 125 986 -907 632 631 122 -0 989 987 988 -617 628 619 909 -972 971 120 974 -0 627 787 783 -844 112 840 885 -746 752 821 377 -795 797 789 796 -836 835 837 841 -807 806 808 100 -795 798 924 938 -782 627 794 781 -786 790 785 783 -773 793 767 765 -910 911 793 116 -828 99 820 791 -797 883 789 881 -804 803 39 812 -923 922 916 613 -114 789 788 793 -32 814 306 813 -803 30 39 322 -760 815 807 100 -940 117 936 900 -769 794 793 773 -364 802 760 309 -24 926 922 925 -799 363 322 801 -799 924 931 925 -813 308 38 307 -766 802 808 760 -830 785 786 790 -803 799 30 322 -810 811 807 829 -0 104 105 835 -613 604 761 800 -101 753 821 746 -983 912 984 985 -114 789 919 917 -100 760 815 759 -788 789 806 793 -759 766 808 760 -801 363 322 6 -793 765 773 116 -831 832 826 827 -881 883 789 806 -983 915 912 916 -936 940 900 895 -125 990 991 914 -809 820 828 753 -795 805 797 796 -733 827 820 791 -827 834 822 832 -0 825 778 826 -821 752 815 377 -753 828 754 102 -809 837 13 839 -827 734 739 738 -770 768 784 791 -0 98 831 785 -800 761 766 765 -944 961 945 928 -823 735 737 736 -98 785 786 830 -953 955 949 119 -819 753 810 821 -852 857 858 32 -100 815 752 759 -922 921 916 976 -0 786 783 884 -866 865 880 881 -0 862 888 863 -887 881 886 883 -866 814 807 796 -875 320 325 257 -799 363 30 322 -802 761 800 801 -799 323 30 363 -753 100 815 752 -806 796 881 807 -941 934 932 942 -880 888 862 863 -15 930 945 937 -265 39 306 812 -815 308 747 760 -0 877 888 890 -976 969 968 977 -958 165 0 164 +801 361 322 802 +832 738 827 834 +793 789 788 806 +874 864 869 879 +30 311 320 804 +109 856 867 869 +882 880 877 888 +322 361 309 802 +159 165 959 964 +935 893 118 943 +935 118 873 943 +940 939 893 943 +747 307 308 815 +857 861 862 865 +363 30 323 799 +270 305 852 858 +766 364 361 802 +970 939 928 997 +960 970 121 977 +761 613 604 800 +102 740 101 820 +38 305 32 817 +39 30 322 803 +934 0 182 948 613 795 800 801 -265 812 306 32 -364 802 766 760 -364 361 766 802 -361 761 766 802 +801 605 613 925 +0 843 844 845 766 761 800 802 -821 753 810 815 -753 752 821 746 -0 826 778 779 -850 861 857 865 -0 868 255 109 -759 808 100 760 -311 39 265 812 -32 812 306 814 -806 769 808 100 -798 803 804 805 -801 795 802 803 -804 30 39 803 -804 30 803 799 -804 799 803 798 -876 875 871 874 -252 190 873 933 -181 195 942 180 -117 875 873 935 -311 30 804 320 -0 862 861 842 -0 256 255 868 -863 877 879 878 -873 190 932 933 -311 30 39 804 -815 753 810 100 -814 802 796 803 -809 820 753 101 -810 13 811 829 -793 800 808 765 -808 800 793 789 -806 808 793 789 -796 808 806 789 -796 800 808 789 -800 808 802 796 -807 806 796 808 -769 806 808 793 -769 808 767 793 -767 808 759 766 -838 824 832 834 -103 820 101 740 -0 823 737 736 -858 859 860 867 -104 809 819 101 -811 806 807 829 -829 790 886 806 -0 831 784 785 -849 848 847 851 -825 738 827 832 -860 862 867 859 -268 853 269 270 -760 802 796 814 -875 257 870 868 -0 836 105 846 -837 809 13 835 -941 932 118 944 -816 106 810 819 -830 792 785 790 -0 838 832 833 -829 790 839 886 -877 878 901 892 -867 863 859 862 -115 632 618 908 -0 108 268 854 -106 13 810 819 -819 13 810 809 -0 861 855 849 -0 862 860 861 -854 860 858 852 -814 866 32 812 -817 818 857 32 -752 815 747 759 -846 833 110 105 -807 829 100 810 -877 879 878 892 -266 268 108 853 -38 816 817 813 -843 885 840 839 -38 813 32 306 -815 810 813 807 -760 815 813 807 -853 268 108 270 +760 309 364 802 +361 364 309 802 +39 311 30 804 +859 812 32 866 +866 805 796 881 +810 100 807 815 +801 795 800 802 +800 795 796 802 +799 322 30 803 +322 801 802 803 +322 799 801 803 +802 801 795 803 +801 799 795 803 +802 795 796 803 +810 13 106 818 +861 842 0 862 +912 915 917 919 +323 30 320 872 +799 798 803 804 +802 796 760 814 +740 733 103 820 +788 790 769 806 +826 791 784 831 +308 306 309 814 +796 802 760 808 +822 104 105 834 +746 752 753 821 +784 791 785 831 +804 803 39 812 +869 109 856 871 +100 769 828 829 +793 765 800 808 +793 767 765 808 +793 769 767 808 +806 769 793 808 +806 793 789 808 +800 789 793 808 +806 789 796 808 +800 796 789 808 +796 800 802 808 +100 767 769 808 +809 13 810 829 +0 824 825 832 +818 32 813 866 +737 0 738 823 +832 0 824 838 +753 810 819 821 +815 810 753 821 +778 735 734 825 +737 735 736 823 +105 0 835 836 +828 792 791 830 +828 790 792 830 +740 102 733 820 +101 753 809 819 +833 0 832 838 +734 739 733 827 +809 753 820 828 +831 822 98 833 +839 786 98 843 +829 811 806 886 +841 837 110 843 +880 877 878 882 +860 0 108 867 +786 790 884 886 +810 809 753 819 +803 804 805 812 +109 31 266 853 +810 753 100 815 +107 0 106 817 +104 101 809 819 +98 785 786 830 +305 38 0 817 +38 813 816 817 +826 784 0 831 +816 0 38 817 +308 307 38 813 +38 306 308 813 +104 0 101 819 +827 791 826 831 +306 38 32 813 +859 812 805 864 +855 852 107 857 +760 759 747 815 +759 752 747 815 813 308 307 815 -815 308 307 747 -809 828 829 753 -269 270 853 271 -0 106 107 817 -0 106 817 816 -810 811 818 807 -813 810 818 807 -858 860 108 867 -0 867 860 862 -877 888 882 880 -981 980 982 124 -856 812 265 858 -855 107 857 852 -789 795 919 797 -0 867 108 860 -817 818 32 813 -816 818 817 813 -813 818 810 816 -818 106 810 816 -816 106 817 818 -827 738 834 832 -829 790 806 769 -828 790 829 769 -791 99 820 733 -828 99 754 102 -820 99 828 102 -813 807 866 814 -835 13 819 809 -753 820 828 102 -102 733 740 820 -0 784 826 779 -770 826 784 779 -791 826 784 770 -835 13 106 819 -827 738 739 103 -105 834 822 104 -833 832 822 834 -104 834 822 103 -0 851 836 848 -734 778 826 770 -822 833 98 831 -0 824 823 825 -823 738 825 824 -825 734 737 735 -738 825 737 823 -0 107 106 851 -770 778 826 779 -881 796 866 807 -738 734 737 825 -733 827 739 103 -733 734 739 827 -0 825 735 778 -0 823 735 825 -0 98 833 831 -825 734 827 738 -734 825 827 826 -837 822 809 104 -832 825 826 827 -828 830 791 820 -0 107 851 849 -828 792 790 769 +813 307 38 816 +813 38 32 817 +817 107 0 852 +839 837 13 841 +878 864 874 879 +850 106 107 851 +109 108 0 867 +862 0 860 867 +857 32 818 866 +850 107 849 851 +810 807 811 818 +807 810 813 818 +864 859 856 867 +858 856 859 867 +860 108 858 867 +860 858 859 867 +871 869 868 876 +852 817 107 857 +811 13 810 818 +753 101 809 820 +101 104 809 820 +101 103 104 820 +734 737 738 825 +823 735 0 825 +737 736 0 823 +790 792 769 828 +786 785 790 830 +830 98 785 831 +847 841 840 850 +779 778 770 826 +791 770 733 827 +103 738 0 834 +817 305 32 852 +811 840 850 865 +820 104 809 822 +820 103 104 822 +0 785 98 831 +0 106 819 835 +868 257 31 871 +809 810 753 829 +733 739 103 827 +836 105 0 846 +738 823 824 825 +792 790 785 830 +823 737 735 825 +734 735 737 825 +820 733 103 827 +824 0 738 834 +820 791 733 827 +739 738 103 827 +824 823 0 825 +819 13 809 835 +0 305 817 852 +835 106 13 851 +829 809 13 839 +829 13 811 839 +738 734 825 827 +837 98 110 843 +753 100 754 828 +820 753 102 828 +102 753 754 828 +820 102 99 828 +754 99 102 828 +769 754 100 828 +769 755 754 828 +99 754 755 828 755 769 792 828 -755 828 792 99 -792 828 791 99 -831 827 826 791 -830 829 828 790 -880 797 805 881 -754 828 755 99 -754 769 755 828 -0 833 832 831 -809 830 828 820 -791 792 830 828 -791 792 785 830 -0 834 103 738 -0 834 738 824 -832 738 834 824 -834 738 827 103 -0 832 824 825 -825 738 832 824 -0 832 825 826 -0 831 832 826 -829 839 13 811 -836 110 841 837 -0 833 98 110 -833 834 822 105 -845 841 848 836 -809 830 837 839 -0 104 834 105 -0 104 103 834 -841 844 840 843 -841 843 839 837 -0 844 845 843 -842 112 840 844 -930 199 937 931 -817 818 107 857 -0 833 846 838 -0 846 110 111 -111 845 848 836 -786 884 790 783 -822 98 833 837 +792 99 755 828 +827 822 831 832 +829 828 809 830 +820 809 828 830 +809 820 822 830 +828 791 820 830 +820 791 822 830 +789 796 797 881 +829 790 828 830 +825 738 827 832 +824 738 825 832 +809 104 819 835 +0 107 106 851 +840 811 886 887 +811 881 886 887 +841 836 835 851 +832 824 738 834 +830 829 790 839 +110 833 105 846 +833 822 105 834 +833 832 822 834 +836 835 837 841 +840 13 811 850 +305 0 270 852 +853 265 270 858 +850 13 106 851 +786 0 98 843 +110 0 833 846 +848 0 836 851 +110 111 0 846 +848 836 841 851 +835 809 104 837 +104 822 105 837 +822 104 809 837 +98 822 830 837 +833 822 98 837 +835 105 836 837 +255 257 31 868 +822 833 105 837 833 98 110 837 -105 833 110 837 -105 110 836 837 -0 845 110 843 -836 835 105 837 -105 822 833 837 -840 839 811 13 -110 98 843 837 -265 270 853 858 -850 840 811 13 -786 884 886 790 -889 882 890 887 -0 895 892 896 -829 830 839 790 -830 790 786 839 -98 830 786 839 -809 830 839 829 -809 839 13 829 -0 111 110 845 -841 845 843 110 -811 881 866 807 -105 110 846 836 -0 848 836 111 -850 106 851 13 -860 857 858 852 -884 788 886 790 -843 98 839 837 -0 98 786 843 -0 110 98 843 -886 788 806 790 -845 841 836 110 -847 841 840 850 -109 871 856 869 -859 805 812 866 -875 257 252 870 -118 933 932 934 -864 878 805 880 -862 860 857 859 -0 898 895 896 -0 844 885 112 -845 841 847 848 -857 861 855 860 -849 847 861 850 -271 853 304 265 -0 855 854 852 -0 844 847 845 -845 847 841 844 -841 847 840 844 -847 842 840 844 -0 844 842 847 -851 835 841 13 -850 851 847 841 -879 876 869 874 -883 788 789 806 -0 849 851 848 -0 851 835 836 -850 851 841 13 -851 106 835 13 -107 849 861 850 -0 849 848 847 -851 848 847 841 -851 836 848 841 -851 835 836 841 -866 865 881 811 -0 107 855 852 -0 860 854 855 -0 851 106 835 -0 817 107 852 -852 305 817 32 -305 270 858 852 -858 32 859 812 -857 818 107 850 -107 818 106 850 -861 842 865 850 -817 857 852 32 -861 847 842 850 -856 858 859 812 -854 855 860 852 -266 109 31 853 -31 853 264 266 +838 105 833 846 +836 111 110 846 +837 809 830 839 +809 829 830 839 +806 788 790 886 +934 118 0 941 +786 98 830 839 +837 110 836 841 +847 840 842 850 +830 98 837 839 +847 0 845 848 +32 812 814 866 +841 840 839 843 +843 0 110 845 +850 840 842 865 +818 106 107 850 +839 13 811 840 +856 804 812 864 +885 112 840 887 +871 868 257 875 +849 848 847 851 +0 836 111 848 +0 111 845 848 +836 841 845 848 +818 107 817 857 +256 252 257 870 +807 813 814 866 +818 807 811 866 +838 0 105 846 +842 0 112 844 +112 840 842 844 +111 836 110 845 +843 841 840 844 +887 885 112 889 +841 844 845 847 +844 841 840 847 +844 840 842 847 +841 835 13 851 +841 13 850 851 +305 270 265 858 +849 0 855 861 +844 0 845 847 +844 842 0 847 +857 818 850 865 +968 920 969 976 +107 818 850 857 +850 849 847 851 +265 270 271 853 +836 0 835 851 +304 265 271 853 +271 269 304 853 +31 304 264 853 +107 0 849 851 +850 818 811 865 +256 257 255 868 +866 796 807 881 +848 847 0 849 +0 848 849 851 +887 886 885 889 +852 305 32 858 +806 789 788 883 +817 32 818 857 +32 817 852 857 +858 852 854 860 +323 320 325 872 +818 811 13 850 +270 269 271 853 +269 264 304 853 269 266 264 853 -269 853 264 304 -31 853 304 264 -31 311 304 853 -269 853 304 271 -268 266 269 853 -868 31 257 255 -934 190 181 189 -876 870 868 875 -882 797 880 881 +270 268 269 853 +269 268 266 853 +268 270 108 853 +268 108 266 853 +31 264 266 853 +860 859 862 867 +0 854 855 860 0 862 863 867 -865 862 857 859 -947 166 179 180 -117 874 875 876 -31 856 853 109 -853 856 108 109 -0 109 108 867 -305 270 265 858 -31 311 853 856 -853 311 265 856 -856 311 265 812 -856 311 812 804 -109 31 868 255 -919 800 789 911 -979 975 978 973 -108 856 867 109 -799 804 872 798 -882 883 797 881 -869 876 868 871 -0 861 849 847 -0 860 855 861 +862 861 842 865 +811 865 866 881 +311 804 812 856 +853 31 311 856 +311 265 853 856 +265 311 812 856 +911 912 114 919 +880 862 863 888 +856 265 853 858 +812 32 265 858 +852 32 857 858 +812 265 856 858 +856 853 108 858 +857 858 859 860 +853 270 108 858 +858 812 32 859 858 32 857 859 -0 870 256 868 -813 866 32 814 -859 32 866 812 -858 859 867 856 -0 877 879 863 -865 857 866 859 -15 931 930 937 -857 32 866 859 -107 861 855 857 -107 849 855 861 -813 818 32 866 -805 878 798 797 -806 881 811 807 -939 943 940 15 -866 807 818 811 -863 864 869 867 -31 257 871 868 -0 863 869 867 -938 918 113 900 -873 875 252 870 -916 915 919 938 -868 257 870 256 -870 256 252 253 -938 797 901 917 -0 253 256 870 -856 864 812 859 -859 864 812 805 -864 804 812 805 -864 805 798 804 -856 804 812 864 -932 190 934 933 -813 807 818 866 -865 857 818 866 -858 867 108 856 -867 864 859 863 -31 871 856 109 -613 795 919 800 -31 868 871 109 -31 871 311 856 -934 189 181 182 -897 993 992 984 -109 868 871 869 -871 864 856 869 -786 886 885 839 -916 924 113 938 -871 257 875 868 -875 325 252 257 -933 935 873 870 -900 936 879 874 -943 15 928 945 -919 795 789 800 -869 876 871 874 -804 320 872 871 -252 325 875 873 -0 890 888 112 -179 177 950 180 -114 911 919 789 -856 871 311 804 -871 320 311 804 -31 320 311 871 -31 257 320 871 -804 871 864 856 -119 947 949 951 -871 320 875 257 -892 936 879 900 -928 945 15 930 -323 30 872 799 -872 30 804 799 -872 30 320 804 -323 30 320 872 -323 320 325 872 -899 938 915 113 -252 325 873 192 -884 788 790 783 -865 842 862 888 -879 874 869 864 -874 871 872 875 -872 320 875 871 +853 108 109 856 +853 109 31 856 +270 852 854 858 +108 270 854 858 +255 109 0 868 +107 855 857 861 +856 812 858 859 +847 842 0 861 +855 0 860 861 +842 847 850 861 +849 847 0 861 +849 850 847 861 +889 882 883 903 872 320 325 875 -117 874 872 875 -874 900 798 878 -0 876 868 869 -0 870 868 876 -0 948 182 934 -24 922 614 605 -941 942 932 944 -909 627 619 910 -181 193 932 942 -937 192 945 873 -112 887 890 888 -863 879 864 878 -918 872 931 937 -773 910 793 116 -0 876 869 879 -24 925 605 517 -0 879 869 863 -0 893 936 895 -886 881 887 811 -882 880 887 881 -887 880 865 881 -917 789 919 797 -179 950 947 180 -863 878 864 880 -864 874 798 878 -805 864 798 878 -904 917 883 114 -887 881 865 811 -0 863 888 877 -0 948 934 941 -199 945 937 192 +881 811 865 887 +880 865 862 888 +862 842 0 888 +255 0 256 868 +856 109 31 871 +320 31 257 871 +865 818 811 866 +812 859 805 866 +866 865 859 880 +865 859 857 866 +107 850 849 861 +861 0 860 862 +804 30 799 872 +320 804 871 872 +861 860 857 862 +859 857 860 862 +805 796 814 866 +865 857 818 866 +812 805 814 866 +840 112 842 887 +870 252 257 875 +880 878 797 882 +877 0 879 892 +813 32 814 866 +814 796 807 866 +864 856 804 871 +320 311 31 871 +918 872 799 931 +843 839 786 885 +799 30 323 872 +863 859 864 867 +856 31 311 871 +868 31 109 871 +801 799 363 925 +190 192 252 873 +181 180 195 942 +874 869 871 876 +865 811 840 887 +949 948 947 950 +875 868 870 876 +892 879 900 936 +868 0 256 870 +947 119 949 955 +939 990 894 995 +256 0 253 870 +864 869 871 874 +843 786 0 885 +114 912 917 919 +881 789 806 883 +909 907 906 913 +797 881 882 883 +935 0 893 936 +941 0 948 949 +0 868 869 876 +871 320 872 875 +189 0 182 934 +874 871 875 876 +873 117 875 935 +865 862 859 880 +0 634 979 980 +882 883 887 889 +804 799 798 872 +113 916 920 924 +787 114 788 910 +325 257 252 875 +257 320 871 875 +887 882 889 890 +320 257 325 875 +947 179 166 957 +252 870 873 875 +325 252 873 875 +919 915 917 938 +872 117 874 875 +900 899 113 938 +876 0 935 936 +917 797 789 919 +940 893 117 943 +933 932 118 934 +0 189 933 934 +869 863 0 879 +876 874 869 879 +805 866 880 881 +885 840 839 886 +883 886 887 889 +883 884 886 889 +933 189 190 934 +958 959 946 972 +894 893 0 895 +890 877 882 891 +114 906 912 913 +874 878 879 900 +944 943 928 945 +0 631 122 907 +879 0 876 936 +869 0 876 879 +614 605 24 922 859 862 863 880 859 863 864 880 -859 864 805 880 -859 880 805 866 -859 865 880 866 -859 862 880 865 -0 124 985 122 -877 863 880 878 -950 179 956 176 -901 899 896 892 -890 877 882 891 -0 885 889 112 -0 988 897 993 +0 863 877 879 788 789 114 883 -886 887 840 811 -885 887 840 886 -0 888 842 112 -773 619 794 910 -112 842 887 888 -887 842 865 888 -829 886 811 806 -886 806 881 811 -786 790 886 839 -884 786 886 885 -991 898 895 894 -882 878 877 880 -882 797 878 880 -787 884 783 788 -0 884 783 787 -890 888 882 877 -15 918 931 937 -891 896 901 902 -895 940 991 894 -0 862 842 888 -922 613 614 605 -881 883 806 886 -883 788 806 886 +797 789 881 883 +877 863 878 879 +891 0 877 892 +790 788 884 886 +112 887 889 890 +843 840 839 885 +122 631 632 907 +790 783 786 884 +990 994 995 1000 +844 0 112 885 884 788 883 886 -888 887 882 880 -877 888 880 863 -865 888 862 880 -887 888 865 880 -885 887 112 840 -112 842 840 887 -840 842 865 887 -0 950 948 949 -885 889 112 887 -892 900 879 878 -889 882 887 883 -889 887 886 883 -884 886 883 889 -0 891 902 896 +843 0 844 885 +878 797 805 880 +878 805 864 880 +863 878 864 880 +863 877 878 880 +882 881 880 887 +880 797 805 881 +883 881 882 887 +844 112 840 885 +117 872 874 918 +840 843 844 885 +884 885 886 889 +944 928 939 997 +908 907 913 985 +787 783 788 884 +842 865 887 888 +880 863 877 888 +886 885 840 887 +888 882 887 890 +889 0 112 890 +888 887 112 890 +788 783 790 884 +900 899 895 940 +0 783 787 884 +786 783 0 884 +958 119 0 972 +788 806 883 886 +839 790 786 886 +614 616 921 922 +885 786 884 886 +931 15 918 937 +863 0 877 888 +113 899 940 991 +862 0 863 888 +885 839 786 886 +873 192 325 937 +842 862 865 888 +874 798 878 900 +181 182 180 948 +179 167 164 957 +112 0 888 890 +114 788 883 904 +878 877 879 892 +953 119 0 955 +0 896 897 898 +981 975 973 989 +947 942 180 948 +877 891 892 901 +930 203 929 945 +989 981 975 993 +885 0 112 889 +884 0 885 889 +939 914 15 940 +182 181 934 948 0 950 955 956 -874 918 798 900 -878 900 879 874 -0 885 884 889 -884 886 889 885 -885 887 886 889 -0 892 877 891 -912 915 919 916 -204 166 964 195 -0 896 892 891 -985 983 908 124 -892 900 901 899 -0 891 903 902 -0 891 877 890 -950 177 948 180 -0 898 896 897 -0 903 891 890 -0 893 895 894 -891 901 896 892 -914 928 939 15 -943 117 935 893 +882 891 901 903 +892 899 900 901 +891 890 0 903 +891 877 882 901 +911 800 613 919 +990 914 939 991 +921 922 968 976 +943 15 928 945 +896 0 897 902 +936 893 117 940 +900 918 113 940 +953 949 119 955 +911 789 800 919 +943 118 932 944 +949 119 951 953 +983 124 908 985 +0 902 903 905 +892 896 899 901 +900 895 892 936 +896 891 0 902 +899 895 892 900 +879 878 892 900 +325 192 199 937 +895 892 0 896 +892 891 0 896 +0 895 896 898 +979 0 980 981 +999 0 987 1000 +882 877 878 901 +632 122 907 908 +795 613 800 919 +910 906 114 913 +902 891 0 903 +935 873 117 943 +896 895 892 899 +899 896 897 902 +891 896 901 902 901 896 899 902 -974 972 0 952 -199 323 937 931 -945 15 937 943 -914 991 992 113 -908 124 122 985 -0 953 952 119 -957 179 167 956 -0 952 953 998 -955 947 950 949 -899 940 900 113 -991 899 992 113 -892 900 899 895 -527 161 596 965 -900 117 936 874 -117 943 940 893 -941 118 996 944 -899 940 113 991 -891 902 901 903 -992 897 984 915 -918 940 113 900 -617 116 618 913 -903 890 882 891 -889 890 882 903 -952 972 120 974 -632 908 122 907 -923 604 911 618 -913 912 906 114 -794 627 910 619 -925 198 363 517 -23 198 926 517 -909 913 906 910 -896 899 895 892 -123 973 0 979 -878 797 882 901 -899 896 895 898 -897 896 899 898 -913 906 907 909 -912 913 911 114 -993 125 992 975 -773 794 793 910 -904 883 788 114 -0 909 628 630 +905 0 902 984 +951 946 942 961 +913 911 618 923 +0 903 904 905 +882 890 891 903 +890 889 0 903 +799 801 795 924 +912 905 114 917 +600 599 616 978 +898 895 896 899 +898 896 897 899 +944 943 118 996 +943 939 893 996 +984 897 915 992 +789 800 793 911 +936 895 893 940 +24 23 19 926 +896 892 891 901 +900 878 892 901 +901 891 902 903 +883 889 903 904 +889 883 884 904 +903 889 0 904 +889 884 0 904 +787 0 884 904 +901 797 917 938 +798 918 924 938 +873 870 933 935 +921 908 115 923 +928 914 15 939 +635 122 632 908 +765 793 800 911 +617 619 116 910 +630 632 631 907 +794 788 793 910 +908 913 912 985 +905 114 904 906 +904 114 787 906 +904 0 905 906 +904 787 0 906 +913 907 906 985 +635 632 115 908 +971 121 960 974 +970 960 121 974 +981 0 124 993 +906 907 0 985 +253 189 190 933 +876 117 874 936 +910 114 911 913 +618 617 116 913 +926 925 198 931 +906 905 114 912 +632 618 115 908 +936 117 900 940 +924 795 798 938 +872 799 798 918 +915 113 916 992 +793 788 114 910 +939 893 894 940 +908 632 618 913 +604 618 911 923 +116 617 910 913 +936 900 895 940 +907 632 908 913 632 617 618 913 -0 889 903 890 -787 904 788 114 -0 898 897 988 -114 911 789 793 -0 787 904 884 -787 884 788 904 -884 883 788 904 -884 889 883 904 -904 889 883 903 -0 903 889 904 -0 904 889 884 -933 190 934 189 -927 197 963 929 -914 970 969 977 -0 905 902 903 -0 909 907 906 -632 907 630 617 -918 15 113 940 -121 986 0 973 -0 787 906 904 -906 787 114 904 -905 906 114 904 -0 906 905 904 -992 984 983 915 -902 901 915 899 -939 943 893 940 -801 925 363 6 -926 925 24 517 -932 945 873 943 -895 940 899 991 -975 989 981 993 -635 115 908 632 -635 632 908 122 -0 989 981 973 -925 517 363 6 -614 616 921 922 -253 190 933 189 -902 899 915 897 -125 976 992 975 -983 915 984 912 -903 917 904 905 -924 795 801 799 -971 966 0 965 -117 918 872 874 -903 917 883 904 -986 121 977 973 -613 795 801 924 -918 798 872 874 -922 976 916 920 -121 960 970 977 -903 917 905 902 -913 909 907 617 -632 913 907 617 -992 915 983 916 -918 15 940 117 -918 940 900 117 -912 911 919 114 -614 604 923 618 -0 985 907 122 -902 915 905 984 -882 797 917 901 -955 956 950 957 -903 882 917 901 -917 901 915 902 -0 933 934 189 -903 901 917 902 -882 797 883 917 -883 789 917 797 +114 793 910 911 +203 197 196 929 +932 181 193 942 +928 15 930 945 +911 116 910 913 +911 618 116 913 +114 905 904 917 +921 916 922 976 +915 905 912 917 +915 901 902 917 +902 901 903 917 +954 951 944 997 +901 882 903 917 903 882 883 917 -904 917 114 905 -931 15 930 920 -931 926 930 198 -23 196 926 198 -900 940 899 895 -920 931 926 930 -939 970 990 997 -953 949 954 951 -943 937 873 117 -922 920 916 924 -920 930 926 969 -940 893 939 894 -0 177 948 950 -961 942 932 193 -929 961 928 945 -942 947 180 195 -908 923 921 983 -929 120 928 961 -125 970 914 977 -799 925 931 363 -952 954 997 951 -912 915 917 919 -323 931 199 198 -919 795 938 797 -926 198 925 517 -192 190 932 873 -982 635 908 122 -924 798 918 938 -970 120 928 960 -979 978 123 973 -119 946 947 951 +797 882 901 917 +882 797 883 917 +519 196 197 927 +0 934 941 948 +926 196 23 927 +618 908 913 923 +883 797 789 917 +924 113 916 938 +947 946 942 951 +954 952 951 997 +801 613 795 924 +883 789 114 917 +999 998 0 1000 +925 799 363 931 +614 24 616 922 +965 962 959 971 +117 900 874 936 +968 926 927 969 +925 924 799 931 +177 182 0 948 +945 203 929 961 +0 953 954 998 +0 893 118 935 +924 799 801 925 +900 874 798 918 +15 939 940 943 +978 973 123 979 +967 968 969 977 +920 924 925 931 +797 795 789 919 +908 618 115 923 +897 898 899 991 +926 198 930 931 +164 167 0 957 +600 19 601 967 +918 900 113 938 +912 916 919 923 +15 918 117 940 +919 911 912 923 +913 912 911 923 +942 195 193 961 +940 895 894 991 +924 613 922 925 +962 946 194 964 +634 599 633 979 914 15 113 920 -920 15 113 918 +918 113 15 920 +161 157 159 964 +604 613 614 923 +922 614 613 923 +911 613 604 923 +926 23 19 927 +618 604 614 923 +325 199 323 937 +969 920 914 976 +922 613 916 923 +943 928 939 944 +915 113 899 938 +196 23 198 926 +613 922 916 924 +922 920 916 924 +613 916 919 924 +900 798 878 938 +801 6 605 925 +6 517 605 925 +801 363 6 925 +6 363 517 925 +363 198 517 925 +922 605 24 925 924 922 920 925 -605 925 801 6 -605 517 925 6 -115 614 923 618 -970 960 969 977 -893 117 935 936 -912 923 916 919 -0 902 905 984 -945 961 932 193 -912 911 923 919 -115 923 921 908 -969 928 15 930 -936 893 940 895 -923 604 613 911 -916 920 113 924 -924 920 113 918 -323 931 198 363 -931 930 199 198 -918 799 798 924 -924 799 798 795 -193 190 181 932 -24 922 605 925 -922 613 605 925 -613 605 925 801 -613 801 925 924 -924 801 925 799 -799 801 925 363 -901 917 915 938 -613 922 924 925 -0 118 933 935 -938 798 918 900 -916 915 938 113 -972 119 946 958 -927 196 197 929 +924 801 613 925 +930 920 926 931 +113 915 916 938 920 925 926 931 -924 920 931 925 -925 926 931 198 -121 960 977 967 -194 946 195 964 -161 962 194 964 -927 519 197 196 -927 23 519 196 -926 23 927 196 -19 23 927 926 -19 23 519 927 -19 519 601 927 -194 946 964 962 -964 946 195 166 -600 968 616 19 -945 937 873 943 -946 942 195 947 -943 15 937 117 -951 946 961 120 -921 922 616 968 -997 928 939 970 -951 942 941 944 -964 194 521 204 -947 948 942 180 -926 196 930 198 -926 196 927 930 -914 920 113 976 -959 971 0 965 -945 192 932 873 -0 933 870 935 -192 190 193 932 -161 959 964 159 -972 120 962 946 -944 942 932 961 +925 198 517 926 +198 23 517 926 +925 517 24 926 +517 23 24 926 +927 929 960 969 +24 922 925 926 +204 166 163 964 +159 959 161 964 +920 926 968 969 +967 927 960 969 +926 922 920 968 +976 125 914 977 +19 927 967 968 +616 24 19 968 +944 120 951 961 +946 194 195 961 +929 203 194 961 +927 196 197 929 +15 928 930 969 +978 633 599 979 +971 962 959 972 +997 954 952 998 +945 193 203 961 +194 193 195 961 +944 928 120 961 +198 196 926 930 +198 199 196 930 +203 196 199 930 +928 960 969 970 +969 914 928 970 +929 927 196 930 +927 926 196 930 +196 203 929 930 +901 900 878 938 +901 878 797 938 +873 190 192 932 +190 193 192 932 +190 181 193 932 +941 934 932 942 +124 0 122 985 +181 932 934 942 +118 0 933 934 +195 193 181 942 +958 946 119 972 +0 121 123 966 +949 941 0 954 +878 798 797 938 +959 0 159 965 +180 179 166 947 +879 874 900 936 +935 893 117 936 +945 929 928 961 +325 872 875 937 +873 325 875 937 +117 873 875 937 +875 872 117 937 +199 930 931 937 +950 0 176 956 +161 197 194 962 +942 941 934 948 +119 946 947 951 +958 166 946 964 +918 117 872 937 +931 930 15 937 +931 918 872 937 +919 797 795 938 +919 917 797 938 924 918 113 938 -947 942 949 951 -0 950 949 955 -166 958 164 165 -876 875 935 870 -0 935 870 876 -0 995 994 1000 -0 934 182 189 -194 193 961 203 -937 323 872 931 -117 875 935 876 -929 197 962 194 -944 943 939 928 -0 935 876 936 -0 936 876 879 -0 936 879 892 -875 325 937 873 -873 325 937 192 -199 325 192 937 -960 928 969 929 -161 962 959 965 -161 962 964 959 -194 962 961 946 -199 323 325 937 -937 323 325 872 -875 325 872 937 -117 875 872 937 -918 872 937 117 -15 918 937 117 -947 942 951 946 -899 900 901 938 -878 938 901 900 -878 797 901 938 -940 939 991 894 -0 955 953 119 -165 959 0 159 -914 940 113 15 -914 939 940 15 -998 953 954 952 -996 943 893 939 -119 958 0 957 -968 922 926 920 -0 955 949 953 -951 941 954 944 -928 943 939 15 -928 945 930 929 -941 934 118 932 -0 934 118 941 -117 943 15 940 -942 947 949 948 -929 120 961 962 -181 193 942 195 -118 932 873 943 -119 972 0 958 -929 945 930 203 +990 939 894 991 +932 943 944 945 +194 929 961 962 +15 928 939 943 +895 894 893 940 +976 916 113 992 +976 975 983 992 +899 900 113 940 +0 176 177 950 +941 949 951 954 +179 164 166 957 +120 944 951 997 +599 634 635 982 +928 944 120 997 +177 179 180 950 +180 947 948 950 +942 180 195 947 +974 970 120 997 +193 932 942 961 +961 946 194 962 +601 598 600 967 +961 929 120 962 +961 120 946 962 +937 199 930 945 199 203 930 945 -199 203 945 192 -203 193 945 192 -945 192 193 932 -969 930 926 927 +937 192 199 945 +199 192 203 945 +193 203 192 945 +932 193 192 945 +937 873 192 945 +192 873 932 945 +943 932 873 945 +873 937 943 945 +161 527 963 965 +929 194 197 962 +943 937 15 945 +930 929 928 945 +937 930 15 945 +967 600 19 968 596 161 159 965 -161 965 959 159 -962 120 961 946 -914 977 969 976 -123 121 0 973 -957 167 0 956 -194 929 961 962 -962 197 161 194 -943 944 945 928 -943 944 932 945 -967 963 601 966 -165 958 0 959 -527 963 597 601 -123 967 598 966 -958 972 959 946 -990 995 999 1000 -941 948 934 942 -948 180 182 181 -947 950 949 948 -934 948 182 181 -942 948 934 181 -974 971 0 972 -0 948 941 949 -119 953 952 951 -981 975 124 982 -119 949 953 951 -947 179 957 950 -990 988 125 991 -956 167 168 176 -0 176 956 168 -957 956 0 955 -956 167 0 168 -119 957 955 947 -121 971 0 974 -981 980 979 982 -966 960 971 121 -913 985 906 912 -997 995 990 939 -990 1000 987 994 -952 953 954 951 +983 984 992 993 +636 0 122 980 +180 182 177 948 +596 159 0 965 +194 946 195 964 +194 195 204 964 +521 161 194 964 +959 958 946 964 +951 949 953 954 +977 975 973 978 +987 986 125 989 +119 947 949 951 +988 987 125 989 +963 597 601 966 +947 949 950 955 +947 180 179 950 +949 0 948 950 +950 176 179 956 +944 932 945 961 +949 942 941 951 +944 941 942 951 +949 947 942 951 +120 951 952 997 +994 990 987 1000 +977 973 125 986 +916 113 920 976 +971 959 0 972 +914 969 976 977 +914 939 970 990 +975 973 125 977 +120 962 971 972 0 954 995 998 -119 947 955 949 -981 975 982 979 -958 972 0 959 -982 980 122 124 -972 971 0 959 -899 898 895 991 -957 179 956 950 -119 957 0 955 -954 996 997 944 -990 999 970 986 -0 949 954 953 -0 941 954 949 -956 179 167 176 -0 906 985 905 -960 120 928 929 -0 176 950 956 -963 197 962 929 -951 942 961 946 -946 195 942 961 -959 972 962 946 -0 985 984 905 -957 164 0 167 -164 179 167 957 -164 166 179 957 -966 598 0 597 -951 942 944 961 -958 946 947 119 -957 958 947 119 -957 166 947 958 -958 166 947 946 -164 166 957 958 -959 972 971 962 -972 120 971 962 -966 963 601 597 -967 927 968 19 -966 971 960 963 -964 959 165 159 -969 927 968 967 -19 968 24 926 -985 912 905 906 -633 978 599 600 -977 969 968 967 -960 927 969 967 -990 995 1000 994 -967 960 966 121 -157 964 165 159 -157 161 964 159 -204 964 194 195 -163 166 964 204 -163 166 165 964 -157 964 204 163 -166 964 958 165 -976 992 983 916 -600 967 968 19 -601 519 963 927 -927 519 963 197 -963 519 527 197 -963 527 161 197 -963 197 161 962 -119 946 951 972 -601 519 527 963 -157 964 163 165 -157 161 521 964 -964 161 521 194 -927 968 926 969 -969 968 926 920 -975 125 989 993 -920 969 15 930 -969 928 930 929 -960 971 962 963 -19 967 601 600 -19 927 601 967 -967 927 601 963 -967 927 963 960 -967 960 963 966 -969 929 930 927 -983 923 916 912 -983 908 124 982 -982 908 124 122 -123 977 121 973 -970 928 939 914 -999 995 998 1000 -970 928 969 960 -914 969 15 920 -914 928 15 969 -971 965 962 963 -914 928 969 970 -971 959 962 965 -969 920 976 968 -634 599 982 635 -599 115 982 635 -990 994 988 991 +953 952 951 954 +954 953 952 998 +953 949 0 954 +952 119 0 953 +15 930 920 969 +940 914 113 991 +898 897 988 991 +994 0 894 995 +986 974 0 999 +902 897 915 984 +977 970 121 986 +616 19 600 968 +0 167 168 956 +929 120 928 961 +956 167 179 957 +179 950 956 957 +179 947 950 957 +956 950 955 957 +950 947 955 957 +955 947 119 957 +955 0 956 957 +955 119 0 957 +956 0 167 957 +902 915 905 984 +970 969 914 977 +958 165 166 964 +596 0 597 965 +164 165 166 958 +957 164 166 958 +166 947 957 958 +947 166 946 958 +0 164 957 958 +164 0 165 958 +957 947 119 958 +946 119 947 958 +957 119 0 958 +959 962 946 972 +942 946 195 961 +166 195 946 964 +527 601 519 963 +197 519 927 963 +527 519 197 963 +519 601 927 963 +969 968 976 977 +962 959 946 964 +165 958 959 964 +960 120 929 962 +194 161 962 964 +119 952 0 972 +973 123 977 978 +527 197 161 963 +962 161 197 963 +197 929 962 963 +197 927 929 963 +929 960 962 963 +929 927 960 963 +19 926 927 968 +926 24 922 968 +161 521 157 964 +166 165 163 964 +959 962 161 964 +527 597 963 965 +597 527 596 965 +0 123 598 966 +920 930 926 969 +967 121 123 977 +929 930 928 969 +960 929 928 969 +930 929 927 969 +930 927 926 969 +975 125 976 977 +991 990 988 994 +966 963 960 967 +966 121 123 967 +960 121 966 967 +966 123 598 967 +598 123 600 967 +997 974 970 999 +976 975 977 978 +122 908 124 985 +634 633 0 979 +968 616 921 978 +978 975 973 979 +973 0 123 979 +633 599 600 978 +965 963 962 971 +963 960 962 971 +963 966 960 971 +963 965 966 971 +113 914 920 976 +962 960 120 971 +121 960 966 971 +990 987 988 994 +984 905 0 985 +0 987 988 989 +902 0 897 984 +960 967 969 977 +912 906 905 985 +991 898 894 994 +635 115 599 982 +599 978 979 982 +908 921 115 982 +115 635 908 982 +921 599 115 982 979 973 0 981 -616 600 599 978 -976 920 113 916 -971 121 0 966 -972 119 0 952 -119 951 952 972 -980 635 982 122 -616 978 599 921 -634 982 979 980 -0 993 897 984 -636 635 980 122 -977 978 976 975 -978 921 976 975 -922 968 976 920 -125 986 977 973 -0 902 984 897 -982 115 921 908 -982 115 908 635 -975 983 124 982 -992 976 983 975 -633 599 978 979 -121 967 977 123 -633 979 0 634 -633 123 0 979 -967 600 978 123 -633 123 978 600 -978 968 616 600 -921 968 616 978 -975 989 973 981 -0 994 988 987 -125 977 975 973 -124 993 983 975 -990 994 987 988 -123 978 977 973 -634 980 0 636 -0 980 122 636 +973 121 0 986 +968 967 600 978 +600 616 968 978 +983 124 984 993 +915 916 912 983 +988 0 989 993 +0 984 124 993 +987 990 999 1000 +914 970 125 990 +634 0 636 980 +978 921 975 982 0 124 122 980 -978 975 977 973 -636 635 634 980 -634 979 0 980 -921 923 916 983 -993 992 983 975 -977 967 978 123 -978 977 968 967 -978 976 968 977 -921 976 968 978 -633 599 979 634 -987 999 990 986 -999 995 997 998 -897 988 992 993 -989 986 125 973 -979 981 0 980 -975 978 982 979 -979 599 978 982 -978 599 921 982 -599 115 921 982 -975 978 921 982 -634 599 979 982 -0 988 993 989 -975 125 973 989 -0 954 998 953 -992 897 915 899 -908 923 983 912 -985 906 907 913 -0 993 984 124 -0 981 993 124 -975 993 981 124 -975 982 921 983 -908 985 912 983 -0 985 906 907 -999 974 970 986 -894 994 990 991 -984 992 983 993 +979 978 975 982 +992 897 988 993 +980 635 634 982 +123 121 973 977 +979 634 599 982 +599 921 978 982 +912 905 984 985 +921 616 599 978 +123 967 977 978 +983 912 984 985 +124 983 984 985 +986 125 970 990 +912 915 983 984 +988 898 991 994 +905 915 912 984 +921 975 976 978 +977 968 976 978 +968 921 976 978 +977 967 968 978 +978 123 633 979 +952 974 997 999 +952 997 998 999 +899 898 895 991 +989 975 125 993 +980 0 124 981 +980 124 122 982 +980 979 981 982 +124 980 981 982 +981 979 975 982 +981 975 124 982 +908 635 122 982 +976 921 916 983 +923 912 916 983 +923 916 921 983 +923 908 912 983 +923 921 908 983 +975 921 976 983 +982 921 975 983 +982 908 921 983 +124 908 982 983 +982 975 124 983 +906 0 905 985 +984 0 124 985 +121 970 974 986 +940 899 895 991 +898 894 895 991 +975 981 124 993 +988 897 0 993 +940 939 914 991 +984 0 897 993 +113 915 899 992 +970 990 997 999 +992 125 975 993 +986 987 125 990 +981 973 0 989 +898 0 894 994 +987 0 988 994 +943 893 118 996 +939 943 944 996 +125 975 976 992 +915 897 899 992 +991 113 899 992 +991 125 914 992 +984 915 983 992 +994 987 0 1000 +999 990 995 1000 +994 894 990 995 +998 0 952 999 +941 118 0 996 +893 0 118 996 +893 939 894 996 +987 988 125 990 992 988 125 993 -125 986 970 977 -986 121 970 977 -974 121 970 986 -0 998 1000 999 -121 974 0 986 -991 939 940 914 -991 940 113 914 -997 996 939 944 -0 986 989 973 -0 986 987 989 -986 989 125 987 -0 995 1000 998 -997 998 954 952 -997 995 954 998 -996 894 995 939 -954 941 996 944 -0 999 987 986 -999 998 997 952 -951 954 997 944 -990 987 125 988 -976 992 916 113 -992 915 916 113 -992 899 915 113 -993 988 125 989 -897 898 899 991 -991 897 992 899 -991 988 992 897 +125 914 990 991 +118 941 944 996 991 988 125 992 -125 991 992 914 -995 894 990 939 -0 1000 994 987 -894 994 995 990 -0 995 894 994 -944 118 996 943 -996 118 893 943 -0 118 893 996 -0 996 893 894 -0 996 894 995 -0 954 996 995 -0 941 996 954 -0 118 996 941 -120 928 997 970 -997 974 120 970 -952 974 120 997 -951 997 952 120 -951 944 997 120 -120 944 997 928 -997 996 995 939 -954 996 995 997 -997 974 970 999 -997 999 970 990 +991 897 988 992 +991 914 113 992 +986 970 974 999 990 995 997 999 +998 997 995 999 +990 986 987 999 +954 941 0 996 +954 944 941 996 +0 952 953 998 +893 894 0 996 +995 0 894 996 +954 0 995 996 +894 939 995 996 +944 939 996 997 +996 954 944 997 +995 954 996 997 +996 939 995 997 +990 939 970 997 +970 986 990 999 974 952 0 999 -0 952 998 999 -1216 2641 2757 2818 -2469 2514 2936 3157 -8 834 188 1220 -3339 4966 3103 4970 -1544 1619 227 1581 -325 1968 1944 299 -3492 3049 3481 430 -5179 5244 5242 5261 -475 1120 2 1056 -1164 1088 2776 2829 -690 335 1254 1303 -2987 2506 2720 353 -1100 1063 33 216 -3368 3053 4123 3190 -3190 3053 382 269 -3677 3719 3668 3611 -2913 3589 3565 3396 -86 58 3788 3904 -2021 2112 1567 1110 -1938 219 1214 2756 -1511 1629 1475 193 -3165 3087 403 3131 -290 3657 419 154 -3755 44 3687 3725 -2515 948 832 1211 -5079 838 809 4938 -599 4080 2018 582 -4089 3887 4079 4119 -789 2556 1174 663 -3777 3553 3875 3946 -2661 308 2800 1115 -1156 2025 1830 2032 -2151 3751 2107 3938 -936 12 872 1150 -4088 461 4131 4045 -1828 2406 2347 2329 -795 961 708 1260 -3751 2307 3914 520 -3941 50 75 569 -3367 3064 3597 3948 -84 1680 1009 1844 -2369 4091 2204 2335 -291 2041 1765 1668 -1188 700 713 177 -23 3046 3668 3068 -4086 1953 2029 1826 -3932 3979 502 3898 -2044 3993 1138 4129 -3517 3120 3051 3361 -3619 2082 3873 3895 -2333 3940 4074 38 -1987 2369 1446 2808 -716 690 1303 1276 -1355 1445 122 1786 -1718 493 1779 1444 -2542 2986 3099 3063 -2477 2727 1998 2516 -673 350 599 4087 -17 86 406 3789 -4830 5233 4892 4914 -752 866 765 732 -1854 1581 1596 1070 -4156 4655 4343 4257 -380 911 2950 298 -1373 1416 1372 862 -3411 3145 3517 3120 -3965 4053 1734 3992 -348 738 1199 762 -4092 535 4070 4152 -4523 4506 4498 4535 -804 936 1094 5076 -2502 390 2697 2531 -2257 210 2170 2310 -3606 3645 3628 3631 -2468 2988 428 2906 -4046 566 1995 38 -2799 2519 401 2805 -895 2907 2999 2472 -2116 4064 2017 4115 -543 4410 4671 4753 -140 1104 1118 138 -3622 2275 3814 3686 -2988 2785 2930 2947 -973 2564 411 894 -1397 40 1415 747 -2188 425 3917 2811 -638 1980 17 58 -4714 561 469 4242 -4065 4151 4187 4185 -3133 3121 3039 3181 -4585 624 1565 1513 -1422 162 1425 1080 -3766 4512 4538 4386 -3289 2846 2993 2870 -4539 3335 4588 4461 -963 776 677 989 -375 2526 1740 2630 -1191 2567 310 2678 -1058 441 5102 4804 -2001 2196 2185 2406 -2112 1618 2312 2103 -603 3929 3962 337 -3469 3304 650 3391 -966 940 1013 990 -858 767 837 982 -1158 3253 161 1121 -370 5123 5100 5265 -576 4341 3975 4323 -145 5114 141 619 -4102 4225 4114 4343 -2861 2835 2684 2600 -2052 2096 2101 1702 -852 814 1207 2675 -603 3758 3929 3952 -2153 2157 2134 1647 -4302 4374 337 4468 -1100 5021 1804 187 -1622 1473 1177 1467 -1501 1878 1848 1204 -2166 1599 1966 447 -1107 3245 3477 3282 -1319 1342 1241 1439 -53 1660 208 1738 -583 1508 584 1709 -867 933 963 865 -769 773 869 754 -3653 4209 3644 3960 -2555 2476 897 884 -874 145 1258 618 -842 632 861 833 -2075 2225 511 2252 -380 2917 2918 2925 -796 2894 902 1020 -462 3247 721 3409 -4327 5147 5156 5065 -3562 3177 3692 3690 -837 786 2854 339 -1346 1345 1314 1162 -1096 80 1168 4798 -2645 2856 2728 2871 -1052 804 80 1096 -108 1005 1278 899 -863 769 754 712 -4984 4699 5055 4879 -1071 214 1309 916 -962 108 128 900 -1661 748 2757 1554 -2196 1994 2185 2173 -3012 2462 2907 895 -355 706 777 646 -1818 1412 1853 1411 -1109 2365 3046 2366 -626 1814 1677 1123 -1122 792 1247 1244 -531 22 435 2077 -1027 4947 4225 4250 -1470 1678 4600 1521 -601 3553 3875 3881 -1521 1672 208 1682 -2117 1644 4019 4275 -1477 1590 263 1410 -1127 105 1023 2771 -1331 1455 4652 91 -1735 1486 1472 4602 -1150 173 872 937 -1193 1160 1069 842 -320 1119 217 1217 -603 3913 3970 4106 -4441 4445 3941 4439 -1831 1635 1848 1204 -2102 3593 4018 1916 -1261 1302 1081 848 -3438 4904 1163 5294 -1008 1066 1071 164 -1840 2217 2048 2179 -1527 1869 1327 739 -4409 4111 304 4420 -1157 43 707 832 -1788 1056 1094 672 -2848 884 1103 2892 -225 187 1756 1804 -1155 395 2700 1937 -4290 4482 4109 1674 -268 3998 3997 1697 -4402 629 4156 4549 -4762 4554 906 4807 -1962 2000 1953 2023 -116 1120 180 475 -1158 2 1121 748 -563 331 2003 3655 -1112 3925 604 3943 -3753 498 2306 3721 -1990 2036 1668 2041 -259 1666 20 1923 -493 4261 1764 1136 -1480 1504 1547 627 -4111 1690 197 1626 -196 1508 1698 1475 -275 1423 1374 4596 -2481 374 2724 1958 -1774 1619 1643 1737 -1797 855 693 225 -1320 1540 1590 1389 -1799 1758 1677 1777 -5077 5325 5094 4388 -5048 1797 1762 1801 -1906 1759 273 2177 -1372 1362 1363 851 -1496 158 122 1749 -3927 4480 2033 4448 -72 2266 2338 1714 -3066 3591 3693 3397 -2980 3052 426 3032 -1419 316 2960 3006 -144 1308 1047 1051 -4891 1425 1012 4919 -12 1387 1328 1778 -166 1101 1218 2608 -1394 1544 1465 227 -19 2688 363 2755 -2057 273 1369 2155 -2158 1532 510 246 -3443 3245 438 3494 -2377 1822 2809 2001 -2172 2069 2142 1585 -201 180 1815 1796 -1531 1616 1520 1234 -218 4 1177 1487 -4125 4116 490 2010 -4317 1117 824 1795 -1831 1390 1344 1340 -1719 583 2098 2111 -3055 2352 684 1608 -3824 3827 3795 3823 -1186 701 1195 1157 -1201 1049 1240 758 -2690 1954 2700 1977 -2415 457 2465 2394 -2053 2259 2270 509 -3679 4022 669 551 -1176 763 1196 1210 -1590 1540 1205 1537 -511 2217 2193 2224 -1710 2401 1937 2189 -3700 2367 3698 3731 -3381 3538 728 3419 -1398 1726 221 1725 -4406 4262 4358 4412 -321 2950 2955 2936 -321 2945 2955 2946 -3681 4171 3670 4205 -3972 3286 4235 4078 -3240 431 4150 4244 -3622 2072 2318 3686 -1346 999 1312 1314 -1764 4176 574 4261 -3536 3104 3524 3546 -2564 2854 303 846 -1651 1087 1640 1653 -1539 1704 193 2129 -3104 479 3527 3530 -512 2283 2110 330 -4147 3086 3069 3681 -1390 1524 1389 160 -1781 510 2123 2131 -1715 4095 3718 2338 -326 2268 2075 1212 -782 4930 5206 3196 -183 4010 4004 2107 -14 3741 1732 3333 -3925 3996 3932 3943 -1330 1007 1617 749 -1714 1986 1609 2063 -1932 206 220 2146 -1200 1540 1562 625 -1343 277 198 4601 -2037 2121 1578 2161 -275 610 1343 1452 -1228 960 1106 1418 -724 3231 2701 4824 -658 3463 2872 3450 -3826 3818 3838 4038 -2030 1143 2054 2031 -2227 2273 486 504 -2260 3853 3903 3845 -2524 4992 4972 1085 -1266 1162 336 1382 -1724 2006 2702 1975 -2511 296 2954 2946 -2879 2378 2969 2535 -1971 22 3331 482 -42 1677 750 626 -5056 4801 4785 4393 -4322 4509 4737 5080 -2884 2540 353 2472 -2586 2657 2574 2467 -288 2772 2953 2917 -4254 3449 1792 4858 -321 2925 63 2631 -5 2181 1213 2455 -2292 1989 2320 2290 -5183 1129 1171 1097 -359 1830 1959 1555 -2332 257 2856 2643 -176 3318 4073 1698 -2773 352 413 372 -513 2212 2234 2226 -2393 2464 2501 2427 -1965 2012 2788 30 -2251 2024 2225 2060 -797 2636 2605 97 -2747 1164 1084 2767 -2066 1916 2067 1686 -1931 1759 1929 1568 -2288 2174 1766 2137 -1873 1591 1931 1560 -213 1829 2927 2931 -2169 1223 1847 1817 -1941 1915 2485 2487 -1568 1928 1832 1950 -891 166 1086 364 -3150 249 248 298 -2779 2378 1964 2789 -1998 2368 1419 2380 -1926 1928 1886 1566 -5 2495 1940 3025 -3792 2322 1662 266 -2610 2594 1044 2585 -2775 3301 1822 2529 -3665 3074 454 3710 -2390 261 2080 371 -386 3690 532 189 -2973 3044 3111 3154 -3697 903 2509 3294 -5111 4820 5117 4916 -1199 1265 1190 10 -967 1266 949 286 -101 115 3963 2168 -3291 3301 3308 662 -914 766 136 846 -2380 372 1419 366 -2986 2798 2956 3077 -3982 1112 604 4026 -859 2527 2718 2572 -1608 2353 2352 2820 -409 3188 2964 2810 -2354 3657 3807 541 -894 2328 745 2634 -682 1242 67 1295 -2770 2919 2893 2934 -1138 3275 57 367 -2499 2486 1941 2696 -305 2286 368 2405 -294 11 2794 3015 -752 472 731 795 -949 149 1148 1272 -773 963 776 869 -1409 2030 2095 1143 -829 905 2505 2497 -825 2816 2401 302 -3341 5195 5158 1036 -3365 650 3406 3140 -378 1608 3271 2220 -861 2666 219 2721 -320 1217 1395 1150 -1325 2771 2823 1130 -340 3005 2479 2890 -3673 350 4134 4087 -413 2429 352 2337 -3017 2726 2479 2395 -106 5308 5295 5322 -330 2224 2308 1840 -3005 305 340 3018 -3137 3411 3399 2680 -199 2525 2400 2718 -2897 897 96 923 -1975 450 2006 742 -2428 2309 1924 2454 -2879 3270 2896 362 -2563 393 2595 2569 -131 2904 2952 63 -532 3071 547 3693 -14 4059 3614 1732 -2543 1757 2607 698 -2253 2145 2281 2103 -2829 1914 2886 2866 -3630 331 3669 3689 -2511 2510 2772 2553 -2873 2664 1834 2579 -2544 2589 822 2557 -71 2456 391 2532 -390 2730 2592 2490 -911 2935 2545 1090 -2553 2544 822 379 -2534 2651 2605 2567 -1215 2765 1939 181 -2764 1145 1129 1088 -3141 3499 3097 3117 -3332 2494 3428 3073 -2968 714 3155 3119 -2475 2906 427 895 -2784 76 484 2786 -2668 2591 2753 2708 -3087 21 2609 3146 -3986 2151 3990 1971 -3399 3496 3487 3517 -592 577 3636 58 -3375 3374 3166 680 -2245 1912 2437 2465 -2810 2940 345 3131 -1181 1274 1249 1872 -854 905 745 83 -3724 3306 3379 2869 -2380 368 305 2941 -430 3460 3200 3470 -4102 4359 4344 1503 -2006 2666 2832 2551 -2008 3115 2335 2477 -1829 2406 2001 2931 -4042 22 3331 4083 -3736 3770 1140 3753 -1984 2029 1446 1987 -3842 3916 3780 3891 -2054 985 1990 1633 -2585 2672 539 702 -85 3840 3994 3822 -2528 212 3044 3111 -400 2472 2905 2540 -2889 74 2947 2547 -2546 2490 2586 2467 -3465 6 3126 414 -525 4765 540 252 -3482 674 3375 2838 -501 3293 3308 3321 -3396 3589 3623 3408 -3393 1707 2087 154 -1057 755 3358 4990 -3695 2942 3714 2367 -222 3460 3470 3391 -3950 4181 4179 4291 -1757 1918 1209 2753 -98 4711 4936 943 -2923 3134 3511 3145 -3096 3184 3058 2843 -3077 2982 3052 3062 -661 956 980 4748 -4060 4283 4254 950 -119 1637 2172 2152 -3740 2273 1405 505 -2376 1964 2005 2378 -376 917 2830 2660 -2620 456 2839 2663 -563 3584 2003 2305 -3483 3042 3594 3567 -329 3736 3753 3761 -2664 2887 2725 2912 -451 2713 883 2600 -2237 2461 237 2434 -718 751 784 743 -1440 4434 4397 2091 -547 1972 1963 3605 -4095 34 2342 1715 -3156 133 3324 2758 -5196 904 3214 3261 -4277 3327 4800 3344 -2551 742 878 2704 -3341 5142 5195 3210 -4887 3405 4240 726 -5064 4935 5306 5328 -4842 87 3435 4906 -741 874 704 933 -709 794 771 744 -702 807 803 354 -5341 5309 5344 5335 -3644 3920 3934 3653 -187 8 1086 891 -3758 3981 3939 3951 -1963 3637 3604 3086 -3726 3065 2379 3696 -3481 3492 3245 260 -4712 3319 952 4890 -2783 3156 714 3211 -3833 695 290 694 -1744 1763 1863 1548 -2050 1983 1446 401 -3077 3059 3186 3063 -283 3799 559 3786 -3136 3522 3106 3201 -4410 4505 4121 4245 -4124 3300 4832 850 -4228 4041 1987 228 -1393 1465 1700 1486 -4476 4481 4487 4390 -194 1443 1806 54 -3122 4967 4960 3082 -2061 2195 1962 1953 -3574 3107 3583 3092 -3729 3754 3696 4020 -191 3813 3735 1510 -586 3273 4264 4164 -3779 3842 3641 3855 -3267 3309 433 2015 -3999 3949 4039 46 -4334 4025 4013 4047 -3682 283 559 1510 -448 2248 2319 512 -2206 2288 2452 1663 -3863 2021 2104 1618 -569 598 4483 4139 -2086 238 1823 1125 -1645 221 2124 264 -1746 2193 130 242 -505 261 2321 2343 -2048 2242 306 2217 -1609 2230 2173 2426 -5216 3242 2898 658 -2609 1659 3188 3091 -3066 3688 3630 3760 -1230 764 718 743 -3933 3818 3826 534 -3683 37 4119 3798 -4106 3947 2356 3908 -4198 4181 3336 4298 -4553 1102 4400 4557 -2020 1830 2815 1156 -3240 3303 586 431 -3319 3296 1502 3349 -3961 4274 600 4520 -1406 634 628 1557 -4373 4108 590 4084 -3178 4542 4531 4543 -3393 3833 154 2366 -3655 331 381 3691 -4252 3661 4390 4236 -3651 519 3946 3850 -68 3920 3101 3934 -3669 3281 3630 3728 -2010 4116 643 2016 -573 606 1784 4515 -1175 424 2556 657 -4701 4236 4164 431 -346 3727 3810 3662 -3830 3640 3796 4064 -4752 4522 1316 79 -3910 3744 3996 3984 -3783 3782 3759 3549 -2091 4525 1440 1400 -3075 460 381 2938 -1453 567 4295 4056 -739 1436 1407 1431 -705 2687 4842 3345 -239 3285 4045 4099 -2613 2300 2337 3706 -3924 1973 3797 1730 -2287 3621 3667 3757 -3920 3762 3673 4042 -4183 4023 4145 3675 -3653 2364 1706 1673 -2613 3713 3706 3034 -504 3769 3813 486 -3646 3856 3897 3845 -87 3439 3435 2806 -3894 3720 4438 4051 -3576 564 452 189 -3617 1113 563 3886 -3050 3514 3298 3142 -2099 4010 75 4002 -3763 1126 548 4335 -2083 3636 3885 3767 -4440 38 4046 508 -3158 3241 3454 726 -1782 4522 1335 2027 -4293 4471 4455 3831 -4542 4502 4531 538 -255 4011 1326 3800 -1393 1331 4650 1352 -1708 4096 4176 107 -591 3849 406 597 -3865 3767 2191 3779 -2018 1973 2053 2065 -627 1504 1516 1611 -1842 1719 1449 2098 -26 1703 4009 4082 -1475 123 231 1722 -2066 123 1701 1686 -4305 4398 1727 4170 -4851 3449 499 525 -4175 4214 4291 4465 -1012 4650 880 849 -3384 3387 665 4220 -529 2017 3640 4504 -3921 577 592 597 -406 3862 591 3788 -4152 4253 4362 4370 -4237 1479 4511 4386 -3767 3847 3919 1484 -4945 4234 4112 3447 -591 577 1980 3844 -508 1997 847 695 -1823 57 26 4082 -4472 527 4451 4521 -3856 157 3816 3790 -4287 4823 3030 4692 -167 113 101 3926 -3871 4040 190 342 -3754 3755 2077 3729 -538 4502 4218 4472 -3266 5247 906 4857 -4533 4170 4398 4361 -4520 4274 4386 4571 -1469 4383 1481 277 -5041 4932 4351 5051 -3830 3910 4003 3983 -5165 5146 4277 4112 -1526 1452 1031 1516 -3983 3984 3999 3951 -4444 1126 4195 4360 -2127 1658 2113 2272 -128 945 827 1081 -108 801 979 899 -1313 690 1268 678 -1396 1227 1462 1328 -4405 4512 4511 4499 -3161 3329 681 660 -1514 1469 90 4560 -1200 274 1593 1320 -1072 1841 291 152 -1564 195 580 1594 -528 1357 1606 1525 -4313 4109 2381 184 -3993 4404 4279 4324 -1227 1401 689 1462 -676 129 1105 1166 -1277 1293 1305 1268 -1407 1360 528 978 -4428 4590 4510 4583 -3214 3222 904 3270 -4450 641 3930 4489 -1717 86 2260 3900 -3913 3849 3921 3962 -4638 4660 4635 4403 -3969 3983 637 3640 -3433 3437 4906 4871 -2008 3115 2011 537 -3266 5289 4762 906 -3329 3333 681 3362 -1272 1298 1040 149 -1331 1455 1394 1465 -1455 1545 1497 1523 -3717 1675 4524 4414 -3446 361 3248 102 -4546 3766 4534 4513 -1074 4805 4789 5233 -4556 4575 655 4561 -4508 4565 4555 4754 -4513 4538 4534 653 -3408 3389 3414 3407 -732 539 765 702 -515 3144 280 5215 -4301 5338 4941 3434 -3355 3430 623 4832 -4845 445 4393 4763 -2504 338 2293 2317 -737 28 756 765 -903 2846 3305 3294 -3234 4853 3371 589 -4913 4836 3451 4816 -3176 796 5097 3264 -4048 4368 1943 3958 -1707 2087 239 4099 -4211 3415 3372 1673 -1771 1367 1441 1421 -5173 178 1104 2637 -57 1823 2021 1110 -3471 3504 2948 432 -1381 4589 4204 4782 -2832 861 1101 632 -865 927 925 95 -682 1254 697 620 -4060 950 3084 3614 -3486 2937 725 407 -623 645 3190 850 -348 678 1305 1232 -4990 5201 3358 5016 -4722 685 232 3276 -4959 2010 2784 684 -3477 2633 3475 3429 -5170 3226 5239 5098 -5076 4937 1788 5144 -1351 1428 1064 631 -620 1250 10 52 -777 1275 1035 783 -1209 2543 2707 2678 -1661 1158 201 1135 -3179 482 1971 4075 -3960 4139 598 482 -3226 3035 5098 5150 -890 1277 678 1313 -1584 383 948 1184 -5289 3196 5058 5321 -43 1187 1752 832 -1201 1202 234 1208 -732 424 657 472 -969 1197 994 977 -874 774 470 945 -3240 3371 4714 550 -890 1283 149 1280 -851 1184 948 177 -712 779 36 1237 -743 471 720 1297 -3104 3546 3526 3508 -3950 4179 4455 4471 -793 708 142 744 -43 2571 723 1185 -481 3123 399 3205 -5171 2825 786 766 -1300 1311 52 1235 -719 741 771 733 -518 751 784 458 -720 717 738 771 -784 719 1242 709 -3324 133 3354 5166 -5243 3409 3243 3035 -1188 833 842 713 -1017 3257 279 3225 -3377 680 3204 3503 -467 3406 2782 570 -3389 3491 3457 3387 -3455 3545 245 3506 -4460 4374 3922 3930 -790 2653 789 798 -752 803 863 354 -2610 702 657 60 -751 717 794 780 -1275 1251 1261 941 -858 973 767 993 -3386 3462 3488 3426 -789 869 866 663 -719 874 67 761 -1538 175 549 1098 -1647 1007 1533 1634 -717 470 759 823 -465 376 917 868 -518 794 458 709 -471 712 770 779 -411 802 886 347 -952 1502 5164 5005 -1875 84 1901 1418 -146 188 1833 1220 -1652 1556 271 1294 -1801 1762 1765 291 -784 733 458 718 -354 812 731 60 -2644 817 2852 2650 -142 125 823 759 -1077 5036 838 436 -663 1262 769 803 -899 848 857 1261 -1186 235 1417 1053 -754 774 741 770 -799 5147 810 970 -762 774 770 738 -1284 761 67 1265 -2397 896 240 2439 -518 780 778 795 -60 663 803 657 -5060 2824 715 339 -104 735 2849 977 -3224 5150 3260 924 -756 1082 125 142 -744 759 771 761 -471 717 719 770 -1856 1544 1774 1700 -1259 125 775 356 -775 759 761 704 -1269 773 774 945 -356 95 983 987 -149 691 1255 1307 -794 764 780 793 -708 744 1296 1284 -733 812 778 764 -4608 1096 1003 1014 -4942 882 267 4288 -691 941 1042 1307 -718 751 720 458 -1536 1653 1651 1652 -5187 715 2855 136 -3229 5046 5145 5003 -5224 5226 5256 5215 -987 730 28 737 -927 875 987 730 -2648 2724 2575 1958 -1291 1211 1257 153 -778 795 863 712 -778 471 733 743 -764 354 793 36 -2834 667 132 5186 -2626 2709 310 2678 -974 2634 730 866 -930 760 968 865 -857 920 990 1049 -619 900 942 988 -745 2611 852 2328 -765 756 731 472 -836 70 140 4350 -2650 2578 887 2635 -2571 1752 2716 2543 -472 918 1262 961 -3164 3236 3214 2834 -5082 25 5033 4965 -760 858 1016 856 -1247 1292 999 1235 -752 780 863 823 -5172 3217 2704 2759 -112 820 2647 896 -1951 2648 2575 2790 -1146 2647 1752 1187 -753 2656 2655 2665 -3381 3550 3505 3569 -2526 2557 2630 2489 -1191 2439 814 2674 -1175 1207 2653 2556 -2910 393 389 2443 -867 812 754 741 -4315 1947 1136 229 -1915 359 2487 1555 -1197 2505 1188 829 -618 964 900 988 -1198 860 1147 875 -860 358 826 1187 -1862 1893 1204 1378 -1263 862 1279 1324 -177 700 24 1210 -723 129 2662 2603 -1056 2 2580 1077 -2968 3195 3198 2895 -872 804 1052 877 -914 136 881 104 -25 755 5033 5091 -5286 5121 3338 3451 -1937 1753 2700 2565 -893 5004 5155 5007 -723 129 165 959 -5107 5101 5074 3081 -2476 2552 901 2619 -1388 1593 1424 1531 -339 2643 257 894 -598 3762 4168 3644 -988 892 757 171 -4675 4647 588 4349 -4060 489 681 4837 -1252 207 707 1157 -2604 112 802 2606 -916 1073 943 1255 -875 411 860 886 -1120 5081 201 1158 -810 992 940 968 -757 800 1001 1041 -970 735 104 810 -2489 343 2629 2599 -854 829 828 1196 -2688 676 363 129 -1264 64 1273 831 -812 731 142 793 -1246 915 983 892 -124 799 677 974 -867 798 737 60 -124 866 869 823 -1171 742 2704 1097 -737 356 867 125 -3232 3236 2583 2992 -4761 4793 3803 4309 -33 1000 836 164 -2844 2566 883 2576 -738 470 128 704 -975 854 828 790 -943 916 1046 1058 -1000 5102 836 1058 -465 883 2835 2566 -5229 4893 5248 4162 -4891 588 1317 4349 -5028 837 5175 982 -5292 782 4239 5135 -878 935 456 873 -179 127 2897 2915 -2493 2855 2728 2856 -854 745 1207 2653 -2651 2640 2635 805 -1977 2508 2638 2743 -2793 2981 2890 2980 -706 1312 697 1306 -936 475 320 1094 -989 864 920 848 -1096 4939 841 4608 -846 347 83 971 -400 2975 77 148 -1207 814 1196 763 -127 2573 375 901 -2589 2639 2867 2847 -141 619 1001 757 -145 962 801 827 -844 897 923 2598 -2834 2583 2877 132 -3114 664 2843 333 -3280 636 463 2200 -358 411 2564 2568 -644 185 607 5324 -2619 2570 2582 2863 -2844 2562 2576 2491 -2635 2552 2640 2627 -2711 2933 2911 2958 -392 3233 63 2631 -5177 5096 3229 5162 -1413 1383 4643 4670 -339 970 837 4327 -1201 1202 864 920 -1026 876 144 853 -450 935 742 1914 -807 2672 1043 1291 -4680 938 1034 4704 -892 915 991 800 -4987 1027 5056 4708 -3268 2376 2535 2921 -2582 375 2628 901 -768 1139 2826 2874 -677 992 968 989 -1004 1018 965 966 -974 790 975 677 -4882 1608 4841 2220 -1071 1079 1008 1391 -962 5116 942 799 -1542 1229 1861 2019 -1035 1042 1004 1046 -470 962 964 124 -3334 2117 1644 3283 -917 2713 883 2841 -33 1100 891 70 -1152 1066 164 1050 -919 4689 1032 1067 -1415 1285 1332 1322 -856 103 1016 998 -783 734 1041 1048 -930 968 979 801 -876 441 1035 853 -1011 5038 4962 5035 -704 775 964 618 -1132 1240 1245 1201 -2723 2715 2752 2712 -698 24 1122 707 -336 1312 355 1162 -446 4362 2974 679 -1812 1776 997 4674 -480 746 1960 5010 -1179 972 1026 1073 -4734 1381 4752 4782 -4233 3009 1085 4719 -445 4829 4833 4917 -1171 1145 2787 1975 -1014 982 1168 995 -1193 842 2689 1142 -278 1373 1159 1324 -36 807 1237 1293 -145 930 900 933 -964 356 124 95 -933 945 963 827 -926 4683 1059 1003 -1001 998 926 103 -1483 336 1270 1336 -799 925 856 942 -1055 703 976 995 -760 914 858 971 -974 970 973 894 -1063 1000 953 4667 -971 975 83 735 -798 865 927 971 -927 875 973 993 -1013 969 1054 990 -2642 767 703 995 -1205 1436 1497 634 -942 998 5113 619 -4393 4808 4796 445 -4482 4552 4764 4639 -1015 104 881 958 -864 986 1281 776 -1243 1284 1250 1265 -1222 423 1221 1969 -983 987 1147 1203 -776 790 986 789 -848 827 801 989 -95 892 925 988 -103 991 976 800 -992 920 994 990 -856 925 993 991 -992 735 994 975 -993 1198 703 991 -977 958 969 1167 -1018 5141 1005 4936 -1646 951 1359 4314 -979 940 5138 966 -254 811 1277 1311 -872 877 1026 972 -899 966 1004 857 -4810 1128 5326 1010 -965 781 1060 1013 -932 1005 926 1001 -1004 996 141 1035 -5102 5105 4350 5014 -1414 740 271 1556 -173 929 1680 1396 -40 1079 1322 1178 -3228 1728 1002 5077 -4609 1022 4825 944 -588 215 4652 5020 -103 1014 1003 976 -1015 958 781 1013 -1016 982 5149 1014 -810 1015 5148 940 -3221 3258 5085 724 -996 4683 926 4746 -5014 4729 4804 5103 -1129 1088 2886 132 -5211 5161 2679 4897 -1011 4568 4676 5039 -161 4974 5015 3253 -4731 4718 4792 4703 -1839 1744 1855 1341 -1071 1000 916 953 -155 4639 5057 921 -2401 2641 1937 1949 -5201 5168 3210 5044 -5336 4835 1037 5223 -1526 614 1430 1547 -1034 938 4656 4731 -1050 1152 1069 1118 -4622 919 1032 4902 -932 943 1005 691 -3438 1163 360 4243 -5009 1030 5023 5185 -1946 1873 1226 2744 -5263 5231 5010 4308 -1280 646 1279 1239 -941 857 1042 1049 -783 1041 932 1047 -1262 1174 1289 918 -2675 2585 1175 327 -1047 1051 1053 1061 -876 1047 932 1059 -214 1042 1046 1045 -1240 1251 1239 941 -235 800 1041 1053 -937 1033 1061 1052 -1066 1420 214 1045 -836 140 1050 1060 -1049 758 1054 1045 -1053 1055 976 1061 -1054 1160 969 1069 -8 5033 834 178 -1121 1131 1077 436 -876 98 877 1059 -1046 1058 1060 965 -1059 1052 1061 1003 -1045 1050 1054 1060 -4356 5077 4551 1728 -4603 972 12 1387 -1463 689 1429 1406 -2677 1813 1466 1144 -1334 1051 173 937 -938 4670 4703 4679 -4776 4767 4717 4527 -1033 165 1055 1105 -1853 1533 61 1634 -929 144 1026 173 -1135 1661 1216 626 -953 1339 5032 853 -4847 4892 652 4811 -4646 4699 4821 5055 -1573 1639 1879 1819 -834 1057 2787 755 -1634 1650 1843 1819 -929 1310 1009 1392 -1428 1497 91 1433 -1258 1190 618 171 -769 1282 1237 1262 -1923 1637 2152 2093 -1155 1710 2554 311 -285 4268 4975 955 -1687 475 1219 320 -1612 1532 1506 258 -396 9 1020 1679 -1257 1176 1208 1210 -3233 392 3038 3265 -3227 1170 5098 5095 -2790 1951 2384 2970 -3319 3283 4712 3276 -70 891 1104 178 -5068 4931 3081 5137 -781 893 140 138 -301 2360 868 3216 -1410 1407 1380 739 -4250 3346 4947 4163 -12 4977 116 936 -2692 676 217 1119 -523 4607 3057 4337 -2522 1880 1740 179 -80 1094 1119 672 -1069 632 1167 1118 -278 1161 1361 1332 -120 3395 3429 3312 -5144 4995 5047 1788 -3659 4120 3372 151 -2342 2285 673 18 -2279 3680 3819 3820 -3775 190 342 3838 -3576 3649 564 3631 -3337 4967 4395 4960 -2593 30 2771 1127 -2979 2509 2803 2956 -229 2012 1965 1765 -1033 1119 1105 80 -1118 166 1101 1104 -187 5082 855 8 -188 1057 105 1130 -948 153 1323 1252 -1800 1685 152 1816 -3752 3403 4184 4154 -2324 509 2285 2079 -567 3796 616 4276 -1135 161 1571 1115 -1002 3213 5327 4986 -5182 396 301 1020 -1529 1121 365 1131 -1130 1145 1057 2764 -1267 1246 1301 946 -1996 2363 2300 3629 -1814 1936 1578 1927 -1072 693 1762 1127 -194 1806 824 1154 -1947 4282 1984 1983 -3991 1225 350 47 -2758 924 3409 3035 -4089 420 1942 3595 -2293 3267 3307 3111 -1238 959 2693 1185 -1222 357 1921 282 -1554 1925 1559 1065 -396 1131 957 2560 -2497 2636 2705 816 -1202 828 1176 986 -1270 355 1299 1337 -1861 1884 1769 1886 -33 364 1385 164 -1569 1736 4598 1384 -1217 1033 1153 937 -1173 1152 1193 1368 -2054 1136 2031 1947 -181 1084 2539 1215 -1221 31 524 2049 -851 234 177 1208 -693 855 105 188 -1323 1318 1181 960 -1186 1195 1055 165 -1106 1345 1162 1272 -286 137 949 1161 -1036 172 5120 5118 -311 2560 9 2830 -1166 2616 5176 2792 -632 2223 1167 1165 -1166 995 1105 1168 -138 1167 958 5174 -5211 2791 5184 5045 -1091 3261 3243 5196 -301 957 2007 868 -1395 1687 1772 1888 -1894 1153 1217 2488 -1203 28 2397 1043 -2610 1044 821 539 -1203 240 1147 1089 -227 117 1366 1480 -1844 1429 1009 1182 -1391 1339 1427 953 -1380 1340 1410 1390 -410 1159 1321 1228 -1327 1178 1338 1431 -4218 4108 4084 4472 -707 1238 698 1185 -1184 1142 2607 713 -758 234 1160 1362 -829 1196 816 700 -1195 826 723 43 -1193 1362 1363 1368 -335 1269 1081 1302 -2515 820 2647 97 -1257 1245 1244 1208 -1189 165 1153 959 -1218 1220 1724 2702 -234 1197 1160 1188 -860 896 1187 240 -1198 703 1195 826 -994 1197 1202 828 -67 1258 1254 335 -1589 274 1388 625 -915 235 946 701 -915 1198 701 1147 -986 1174 1176 1289 -830 169 1865 118 -241 978 1342 1360 -1681 1214 2723 2539 -112 896 886 821 -1192 701 1157 1089 -2601 440 2708 692 -1089 240 832 1211 -2439 24 1210 792 -2118 2269 266 2040 -299 2450 1820 2453 -2612 2762 19 1206 -1155 2762 395 2766 -2593 1841 1072 0 -166 1152 1173 364 -1219 217 1194 1233 -1086 1218 1220 1813 -1219 2 748 1194 -1633 985 1156 2050 -985 2059 1852 1143 -317 1851 1599 2166 -1592 1454 2182 2232 -1138 3836 3275 4404 -1930 1918 1038 2691 -1391 631 621 1427 -1181 278 1361 1872 -931 1404 1819 1843 -1242 1260 518 1297 -1336 1361 1338 1327 -1305 1268 1295 682 -2608 1938 1218 2677 -226 1344 1315 1552 -716 811 1276 1263 -1250 1243 1286 1293 -708 1243 961 1082 -1363 1142 1897 1184 -1048 1040 1273 1298 -946 1048 1273 235 -1357 121 1360 1403 -1230 720 348 1297 -1237 984 1236 1282 -153 1264 1252 1192 -1267 946 1264 1192 -1132 1281 1302 864 -153 811 1318 1263 -1848 1274 1390 1253 -1610 410 1576 1902 -1268 984 690 1236 -1301 734 1304 1048 -1122 1372 851 1244 -1869 1878 1380 1248 -678 1199 1283 10 -1299 777 853 1309 -1330 1617 1573 1520 -792 1290 1192 1089 -128 1278 1199 1081 -1269 1282 773 1281 -1305 36 1230 1296 -734 171 1278 757 -756 1043 1082 807 -831 1247 1235 1264 -862 1263 1245 1244 -984 1269 762 335 -336 1321 1346 286 -1287 1132 1276 1245 -633 1250 1232 620 -1259 775 1265 1190 -1434 967 1148 1338 -1317 1426 4891 1387 -1332 646 1161 355 -1240 862 1416 1239 -410 1438 1248 1869 -1283 1278 691 734 -52 1286 1267 1235 -697 999 633 1313 -1258 141 1275 1261 -1040 1345 1300 831 -1304 706 1300 1040 -1246 1288 1259 983 -1082 1259 1243 1288 -1254 1275 706 1304 -984 779 1295 762 -1298 939 1860 1308 -1236 1287 1276 1292 -1286 1288 1267 1290 -1282 1281 1287 1289 -1043 1203 1288 1290 -1291 1287 1257 1289 -1292 918 1290 792 -811 1291 1293 1286 -1292 961 633 1236 -1468 749 1615 1580 -1284 1296 1232 348 -779 1297 1260 1295 -1296 709 1230 1242 -1239 646 1285 1307 -1148 1255 1333 1310 -1280 1306 716 1279 -1132 1302 1303 1251 -1301 1190 171 1246 -52 10 1304 1301 -1303 1283 1280 1251 -682 633 1260 1232 -1314 1311 890 1300 -777 783 1308 1298 -1309 1307 214 1285 -1310 1308 1255 144 -1322 1309 1299 1079 -999 716 1313 1306 -254 890 949 1314 -1277 1311 620 697 -1306 137 1312 254 -1234 1320 1593 1403 -543 4758 4392 4497 -1809 1352 880 1271 -1159 1247 1346 1324 -1357 1375 121 1595 -625 202 1315 1589 -1266 1500 1181 1382 -1009 939 1337 1310 -1610 1122 1159 1874 -1318 831 1345 960 -1529 365 2818 1967 -574 2000 2023 2383 -175 1636 1231 1182 -1385 621 1656 216 -4647 4675 5029 4351 -1530 271 1256 1652 -647 1459 162 575 -939 1272 1106 1337 -1392 1433 1339 1299 -1397 1368 1420 1066 -571 4525 4572 4547 -1382 1231 967 1348 -1322 1332 1338 1148 -1182 1231 1270 1337 -1179 1425 1073 1333 -1180 1605 1552 230 -1025 1525 1394 1458 -121 1545 1205 1562 -275 277 1512 1430 -230 1589 1520 1234 -1324 1279 137 1161 -1266 1318 254 137 -4282 2383 1984 4228 -1500 1527 1336 1483 -1883 1891 1905 1354 -1590 1360 1403 1410 -1392 1433 1429 689 -1810 1459 575 1317 -1622 1586 1467 1587 -1884 1349 2742 1919 -1726 1569 1672 53 -1520 1388 1468 1531 -628 1319 1241 1597 -1432 1565 4613 1495 -1723 1631 1771 997 -634 1205 1350 1241 -1382 1228 1106 1231 -1189 1186 207 1417 -1898 1189 1238 207 -4895 4869 4864 4877 -2071 2139 1766 2097 -1177 1473 1471 1451 -671 1670 1445 1450 -1435 1153 1189 1334 -220 1887 1639 2154 -1865 1650 1605 1831 -1464 1512 4612 1492 -207 64 1252 1874 -1418 64 1874 960 -1430 1478 1490 198 -1523 1319 1487 1545 -1457 1688 1515 4613 -4673 4624 4348 4604 -1883 830 1858 1900 -3167 4488 2033 4222 -1253 1550 1098 1180 -4525 1400 675 954 -1321 1361 286 1336 -913 4621 1448 4548 -1445 1151 4599 1670 -1150 1396 1395 1328 -4551 4919 4986 5072 -216 1427 1271 1063 -1356 1200 1522 845 -1589 263 1540 202 -230 1248 263 1180 -929 1392 1227 1179 -1079 1333 1351 1391 -575 2922 491 1776 -1341 218 647 1523 -1385 364 1172 1889 -1385 1008 1632 621 -1334 1680 84 1435 -1532 1683 246 1654 -1587 1580 1625 1623 -4001 546 1381 1509 -631 1422 1428 1458 -4482 4109 4310 4741 -1315 1350 1241 1552 -1229 1861 1879 1893 -448 2228 3733 3773 -1407 528 1456 1064 -1098 634 1406 549 -1518 4559 4615 4599 -2169 2147 357 1713 -160 1350 1180 1098 -1551 150 1864 1542 -1760 1755 150 2149 -4653 4631 4662 913 -1640 1647 1530 1007 -1860 84 939 1418 -1273 64 1417 1860 -758 1420 1416 1362 -747 1415 1373 278 -323 213 340 2538 -1417 1051 1860 1334 -1793 671 1805 1450 -1401 91 1459 1426 -1452 1478 198 1474 -1439 1564 845 1594 -1426 215 1339 91 -1422 1425 1271 1427 -1227 1426 1387 1179 -689 1080 1557 1401 -1064 1351 1178 1431 -1374 1031 1343 1491 -549 1434 1429 1182 -1691 1626 1358 1553 -1351 1434 1080 1333 -1433 1436 1270 1431 -1488 1368 1849 1397 -978 1507 1434 549 -1548 1605 1550 1865 -1524 1274 1500 1527 -1562 1424 1593 121 -546 4421 4361 459 -1780 1598 1786 671 -4857 5318 5316 3266 -4357 1444 1450 493 -1443 1660 54 1476 -1384 53 1367 1660 -421 1994 484 51 -4669 4338 1448 4709 -1383 1447 4612 4645 -2194 581 2067 2076 -1421 1367 1443 4352 -1366 1491 1489 1546 -1423 277 614 1499 -4081 3763 4046 548 -2109 1696 1224 1642 -647 648 1489 162 -1548 1406 1463 1550 -4329 1376 4586 4427 -1839 1459 1401 1341 -1458 1422 1331 1352 -4427 4524 1675 4615 -1763 1462 1846 1463 -621 631 1461 1773 -1461 1064 1574 1456 -4611 4408 1371 4594 -647 1471 218 491 -2518 1065 1888 1896 -1353 1478 117 1504 -1652 1356 1579 1294 -1669 610 624 4396 -1499 156 1481 1561 -1465 1489 1366 1486 -1736 1494 163 1473 -117 1490 1472 1366 -1499 1586 1423 1678 -20 583 197 2111 -1444 1518 1693 4340 -1524 1537 160 1538 -1526 1467 1374 1423 -3980 1482 594 4503 -1487 195 1177 1546 -610 4418 1565 1470 -4372 4490 4227 1479 -1507 1500 967 1348 -595 3840 2188 3685 -4423 3717 4401 1676 -491 1471 163 1549 -1375 1595 227 1480 -1775 1435 1519 1894 -1471 1451 4354 1455 -1491 1473 1494 1374 -1490 1430 1492 1451 -1493 1491 1371 4338 -4594 1494 1492 4618 -1490 1472 1493 4595 -4524 4559 1358 4418 -1607 1521 1638 208 -648 978 1080 1557 -1718 1709 1708 1693 -1474 1470 1452 1534 -1483 1438 1321 1348 -1903 118 1900 1877 -526 3271 746 3280 -415 4367 1785 4166 -1467 1526 195 580 -4114 4127 4896 4344 -1087 2157 1890 1640 -1436 1537 1483 1538 -123 197 1701 1690 -4660 1400 4337 4587 -3721 504 498 3740 -1561 1607 1626 20 -4408 1343 4396 1371 -4584 4583 90 4111 -4585 3717 624 4401 -4306 1376 4584 4585 -1579 1522 614 580 -2019 1845 2126 2154 -1660 1638 1476 1408 -1649 1488 1632 1889 -1356 226 1256 1344 -1561 156 1496 158 -1516 1388 1563 1564 -1375 1394 1525 648 -1438 1537 263 1477 -628 1523 1341 1557 -614 1504 1031 1478 -1438 175 1348 1538 -1890 2142 2122 2135 -1833 1130 1325 2767 -1639 1414 1330 1641 -1356 1615 226 845 -2130 221 1087 1398 -1755 1624 1070 740 -1536 1579 1499 1621 -4588 4510 4435 4419 -1539 1655 785 1534 -241 1524 1507 1477 -1527 739 1507 1477 -1561 1682 259 1536 -274 1389 241 202 -4637 4580 4475 4399 -1411 1866 1957 931 -1576 1891 1859 1905 -772 1855 4 218 -1342 648 1546 1375 -1547 1545 1451 1480 -195 1031 1546 1563 -1606 1437 1456 483 -1486 4354 4602 4649 -1878 1456 1380 1437 -1411 1588 1857 1866 -1234 1340 1403 1604 -1692 1607 1432 1638 -146 1813 1144 1800 -825 302 1961 1945 -1653 1007 749 1623 -528 1497 1525 1428 -2485 2698 3014 1941 -1685 1144 1926 1769 -1566 315 1886 1919 -1470 1521 1511 1539 -1439 1563 1342 274 -1564 1522 1547 1562 -1563 1522 1424 627 -90 1358 1626 1481 -324 1954 1560 1977 -18 2266 2068 4095 -313 1954 319 1753 -1355 1737 1671 1151 -2055 1741 1806 1790 -4946 1127 2012 1762 -4431 4411 4409 3839 -1256 1076 1831 1650 -1877 1463 1846 1844 -1787 1839 1729 1810 -1543 1249 1848 1903 -2137 1935 1934 2178 -276 2073 1134 2126 -1468 1516 1534 1611 -1294 1614 1611 1399 -61 4 1613 1625 -1928 2126 1845 1832 -1923 2056 2111 2138 -1610 1859 698 1897 -224 2141 1766 2174 -1671 1474 1353 1621 -1399 1353 1611 1621 -1748 1895 1747 1551 -1200 1344 1389 1320 -160 241 202 1350 -315 1879 1887 1836 -1642 1224 2246 2240 -845 625 1439 1315 -1595 1424 1614 627 -1319 1487 1594 1613 -61 1613 1597 1602 -1606 1596 1357 1604 -1771 1441 1751 1777 -1223 2064 2147 119 -1749 1666 1630 1629 -2513 2676 2478 1978 -1616 1604 1596 1603 -1634 1617 1602 1650 -1602 1552 1597 1605 -1437 1604 1340 1370 -628 1597 1548 1744 -1511 1496 1553 1629 -232 344 928 362 -2340 272 1826 514 -1323 1249 1584 1885 -1580 1587 580 1579 -2122 2130 1087 2129 -1596 1581 1595 1614 -1615 1594 1580 1613 -1294 1616 1531 1614 -1615 1617 226 1602 -271 1603 1256 1616 -507 2150 100 2254 -4 200 1622 1625 -4540 4593 4428 4557 -1655 1586 1587 1534 -1619 1737 117 1353 -1399 1556 1624 1654 -1623 1533 1625 1725 -1399 1581 1619 1624 -1565 1432 196 1511 -4567 4558 3335 4380 -4232 4057 4294 4013 -1607 1600 1722 20 -1722 1754 1948 1600 -1359 1735 1670 4688 -1680 1396 1846 1519 -2035 2009 423 1221 -1078 740 1070 1603 -169 1879 1891 1893 -1327 1872 1876 1869 -447 1657 1750 1083 -1553 1496 4559 1518 -1530 1369 1076 1648 -258 1506 1641 1414 -2057 1640 1530 1651 -2144 1454 2176 1592 -1725 200 1726 1751 -159 934 4772 3340 -1781 510 1786 1780 -1802 1799 1771 997 -1648 1414 114 740 -1819 1639 2153 1647 -1858 1846 1519 1900 -1078 1603 1370 1573 -785 258 2129 1641 -785 749 1330 1468 -785 258 1556 1654 -1655 1623 1398 1653 -1621 1654 1683 1536 -1778 1328 1772 1787 -2064 2133 1745 1637 -2150 4016 2115 617 -3098 2957 3129 516 -1445 122 1444 1518 -693 146 1072 1800 -326 2283 2322 2248 -2180 2201 2374 506 -3828 2065 2118 2114 -4096 3937 3808 2090 -1600 1694 2133 193 -2073 2125 1742 2149 -42 192 1790 1803 -3717 4414 1469 4396 -1367 1631 1384 4687 -1678 1586 1569 1672 -158 1671 1355 1683 -4210 557 4149 670 -4247 4256 182 4208 -4661 4611 1460 649 -1485 4581 4430 4396 -1742 203 291 152 -156 1474 4597 1671 -2763 2877 2776 1088 -1397 1008 40 1632 -2612 1206 2624 2660 -1539 158 1704 1683 -1682 1672 1398 1655 -2062 1741 2055 2100 -1123 1559 1814 1866 -312 584 4096 1708 -1172 1086 1756 1813 -1376 4329 1689 1691 -1688 4411 3839 1690 -1508 196 1689 1691 -1692 1690 1688 1432 -1709 1691 1693 1553 -1498 1692 4323 1476 -1749 1704 2131 1666 -2096 4014 4057 2113 -1847 2192 2210 1454 -4010 3825 183 4028 -304 1702 2096 197 -2281 2145 2211 2298 -1776 491 772 1723 -584 1702 4100 1508 -111 1698 4269 1701 -582 3603 3986 3331 -259 1694 2130 1682 -4300 4152 4362 4097 -4123 557 3368 4149 -3920 435 4042 669 -1720 1686 576 1498 -1722 123 1498 1692 -243 2685 1084 2747 -3356 4258 4985 4933 -4839 2183 4213 4251 -2097 2059 1409 2222 -210 2280 272 2276 -265 3278 461 2331 -2003 4146 3598 4173 -3870 3646 3845 638 -1720 54 1754 1498 -2094 2066 581 231 -1718 1764 1708 2047 -4372 4452 3980 4391 -583 1709 1630 1629 -1359 1700 1774 1735 -1194 2766 2762 287 -246 1643 1755 1624 -246 1643 1355 1786 -2116 4376 4360 585 -4675 1062 4986 1010 -1743 1575 1856 1811 -2113 553 4007 2114 -3791 3727 3990 1971 -382 3272 2117 269 -4232 4294 3836 4404 -4058 1791 3854 66 -1723 163 1736 1631 -1737 1472 1151 1735 -200 1622 1569 1736 -1779 122 1781 1749 -5168 5167 4994 4961 -2865 1103 96 2897 -1684 1570 1781 1779 -1777 1677 1803 1667 -1729 1818 1857 1758 -1025 483 1854 1606 -1657 2131 2123 1750 -2226 2212 2246 511 -1772 1787 1588 1857 -1763 1858 1588 1863 -208 1694 1738 1600 -1637 1745 2142 2122 -1774 1598 1643 1760 -700 816 806 2515 -2440 1568 1950 840 -1988 1779 1630 1718 -2134 1725 1412 1533 -1772 1687 180 1815 -1946 440 383 1761 -1789 1743 1816 203 -1887 206 313 1832 -1818 1777 1751 1412 -2607 2754 2681 1757 -205 1135 1571 750 -1773 1461 1748 483 -194 255 1720 2004 -1795 750 1117 42 -1867 1585 1365 314 -5037 5011 5338 5299 -4078 4217 3403 4062 -1149 1866 1559 1896 -2538 2327 1920 2421 -1598 1359 671 1646 -1172 1756 1656 1747 -1787 1839 1462 1763 -1751 772 200 1723 -1849 1904 1868 1488 -1811 1393 1700 951 -203 1598 1760 1742 -1804 216 1656 1809 -1741 54 1738 1754 -1790 1645 1441 1803 -1741 1645 264 1738 -4296 571 1783 4506 -4387 1782 4566 4248 -3167 538 4222 4456 -4344 4316 4328 1503 -1645 1726 53 1441 -1656 1773 1747 1575 -688 5033 178 1108 -1758 1796 1812 1799 -1668 1570 1805 1780 -1798 3898 1734 4053 -297 4849 4215 4124 -4697 1802 1795 1421 -4158 4682 4749 4855 -1793 1765 229 1805 -225 1807 1789 1797 -5043 201 205 1796 -3336 3940 1791 4181 -1801 203 1646 1789 -1661 1554 1123 1815 -1802 750 1799 205 -1793 1801 1646 4698 -1742 1668 1780 2125 -116 1778 180 1808 -1806 1421 1795 1790 -493 1805 1136 1570 -1796 1808 1812 4700 -1804 1809 1807 4104 -1808 1778 1810 1317 -1809 1352 1575 1811 -1812 1810 1729 1776 -951 1807 1789 1811 -1554 1219 1065 1687 -152 1134 2073 1685 -1816 1756 225 1800 -1815 1857 1123 1758 -317 1851 1835 1842 -1743 1856 150 1760 -1229 1078 1076 1648 -1213 2445 1945 1961 -2706 2663 2710 2614 -223 328 2008 2516 -599 2053 673 509 -1908 2420 2437 2465 -2316 2022 2429 2337 -1986 1609 1921 45 -1952 1950 1934 1959 -3026 35 1968 2438 -316 1998 2516 418 -524 2058 302 31 -1573 169 230 1370 -1759 1582 2177 319 -748 1529 2757 2766 -2575 2732 388 2769 -2143 1817 2136 2162 -1886 1845 1861 1591 -1868 1859 1897 2746 -2823 2764 4998 2763 -1575 1458 1773 1025 -371 174 1892 2190 -626 2034 1936 1216 -1817 2162 2194 581 -1864 1078 1862 1229 -1876 1574 40 1178 -1582 1517 1836 1887 -1632 1461 1574 1649 -2042 317 1696 2109 -1248 169 1576 118 -1775 1898 1901 1435 -2400 2620 2725 2887 -1817 2056 1223 2138 -1222 2173 1994 1921 -150 1070 1854 1864 -1855 1853 61 1744 -1856 1854 1544 1025 -1729 1818 772 1855 -1747 1743 1551 1816 -1748 1649 1895 1378 -1543 1946 1584 1837 -1416 1415 1420 1285 -931 1404 1149 1836 -1863 1843 1865 830 -1748 1864 483 1862 -1411 1853 1863 1843 -1862 1370 1437 1204 -1542 1551 1685 1769 -1966 1766 2097 2206 -1775 1905 1837 2741 -175 1636 1253 1274 -1982 2760 2819 2779 -2781 2485 2685 2750 -1636 1228 1875 410 -1891 315 1038 1919 -1885 1372 1323 1373 -1902 747 1872 1876 -1877 1875 1636 1844 -1878 1501 1876 1574 -1253 1877 1550 118 -1635 1076 1591 1404 -2910 2848 2443 1103 -2424 1899 2045 2447 -2641 1936 1927 1949 -1893 1378 1884 1349 -1883 1896 1149 1354 -1610 1898 1874 1901 -324 1836 1149 1560 -1759 1591 1369 1845 -1172 1889 1466 1895 -1888 1519 1395 1894 -1506 2156 1528 2057 -1635 1873 1543 1349 -1840 2164 2299 2207 -1404 1883 1635 830 -2740 1488 1889 1173 -1588 1858 1888 1896 -1769 1895 1466 1884 -1898 1584 1238 1837 -1897 1363 1885 1849 -2425 2059 1881 2222 -1904 1378 1649 1501 -1902 1849 1885 747 -1901 1249 1903 1875 -1904 1576 1501 1902 -1775 1905 1900 1903 -1904 1543 1868 1349 -2231 1924 206 1933 -2251 2187 2193 2225 -2393 3019 2482 1824 -2301 2310 2386 2459 -1922 2386 2214 2409 -2139 2071 2036 1990 -408 2455 2500 2464 -2294 2110 2026 2080 -385 917 2360 2841 -1940 1956 318 825 -170 3808 1962 312 -3861 3850 3946 3638 -1226 1978 440 2752 -1560 1873 1354 2743 -2438 1770 2435 2229 -1143 1826 1852 2029 -1991 1910 2230 2175 -193 2133 1583 1083 -1906 377 1929 2441 -1144 2765 1926 1939 -1559 1927 324 1925 -1926 1134 1928 1882 -1927 1582 324 319 -1924 2219 313 2440 -1931 2676 1226 2690 -315 313 1930 1954 -2180 273 2069 2174 -1934 1952 2444 1906 -1933 1577 1827 2177 -2070 1577 2037 2058 -1134 1841 2039 1882 -243 181 840 1028 -2762 1233 19 2508 -395 2508 1977 1925 -325 2778 1915 1944 -318 351 1558 2495 -4020 1140 3696 4185 -668 4270 4384 4367 -5 1992 1940 1945 -1944 2032 1555 1820 -1859 1038 1757 2745 -824 1137 1154 2009 -1988 1630 2132 2098 -1028 1882 1950 1959 -1753 319 1827 1949 -815 2829 1092 2866 -1933 1827 1961 2441 -3742 495 186 45 -1931 1566 1568 236 -3967 3336 3752 4058 -2779 2819 1915 2778 -1542 2019 2073 2149 -199 2671 791 2466 -302 1949 1827 2058 -4266 5164 5066 952 -1820 1555 2105 1952 -495 1916 186 2067 -477 3655 3598 460 -3008 449 322 2686 -1117 308 2009 2035 -119 2172 1867 2208 -2747 1325 2817 1982 -1828 2347 5 2181 -2059 2071 985 2025 -2111 2094 2096 2127 -694 1731 404 290 -3764 460 3598 4189 -553 2104 579 2114 -2313 2115 2074 2162 -2560 376 287 957 -2768 2731 2698 2750 -1566 1939 236 888 -1601 1918 2715 2572 -2227 2811 3891 3799 -3790 597 3788 86 -4045 3285 3278 2014 -1999 2807 1967 1870 -2009 2786 1137 484 -2028 1347 421 1137 -3305 3145 2923 3299 -272 2095 2195 1826 -490 4090 421 51 -1948 1754 2076 2062 -2265 2086 3805 300 -2055 1911 192 423 -2403 2301 1922 2402 -2385 1993 1944 2032 -2185 2049 2777 1992 -1446 1852 2050 147 -3986 75 4010 2151 -2355 1133 3694 3699 -598 3603 3762 3331 -1829 323 56 2297 -2747 2776 1982 2781 -1326 4265 186 4331 -418 99 223 2503 -2727 2941 2380 2558 -189 452 1716 3549 -2047 1764 2023 2031 -2775 2377 2352 449 -287 2612 416 376 -5092 2787 5189 1171 -2809 643 417 1822 -1965 1983 1947 1633 -685 228 2808 537 -2016 3291 643 3301 -4973 308 1117 1571 -3115 4098 2801 3289 -3237 1981 3010 2345 -501 3090 3297 3321 -3283 537 3276 2011 -4376 78 590 3971 -579 26 4043 4027 -1517 2153 1957 931 -2034 2035 524 2661 -673 507 3991 18 -1825 2348 2203 2457 -2004 1326 186 2028 -2026 2106 2119 309 -2045 2070 1969 31 -1913 2024 2079 2302 -4506 571 4505 4410 -2031 2023 2029 1984 -45 2028 421 1921 -357 2062 2076 282 -282 2004 2028 1154 -1992 31 1945 2045 -4379 1379 4054 209 -2041 2020 2039 1841 -2041 1965 1633 2020 -1911 2037 2121 192 -2036 1935 276 2039 -4042 4022 4083 4087 -2037 2034 2058 1936 -2256 2213 1212 2252 -42 2035 192 2034 -2063 2169 2215 1847 -2199 2409 2241 2216 -3991 4018 47 2068 -1881 2025 2032 2446 -2350 4106 4024 2356 -2004 2076 2067 1720 -2164 513 2460 174 -2050 1156 2519 1993 -484 1221 2049 1994 -2349 2613 2316 2370 -2066 2094 2102 111 -579 2104 1823 238 -282 423 2055 1154 -1684 1990 1570 2054 -2098 2132 1851 1583 -220 1890 1641 2135 -1935 1830 1959 2039 -1222 1969 1899 1713 -2075 2255 309 2106 -2068 2074 4018 495 -2148 1988 2030 1684 -272 2042 2214 2276 -2132 1657 2148 1599 -579 4027 1664 2258 -1719 2052 312 584 -1449 1962 2047 312 -1567 2061 2044 4094 -2171 1932 2135 224 -2137 1935 2071 2025 -1365 2070 1911 1969 -3785 2291 253 3792 -1814 1578 1667 1957 -2280 1974 2061 2195 -2255 2060 130 266 -1449 1988 2047 2030 -3657 3704 154 605 -2330 2362 2342 2285 -2026 1125 2085 2119 -2391 1913 2302 330 -2300 2337 2286 2387 -3553 3864 3861 49 -3643 3789 3905 568 -2163 2085 2257 2088 -2084 2285 2262 2079 -1989 509 3806 2324 -435 669 3597 3705 -2089 2302 2084 2299 -2392 2088 2163 2348 -4011 1665 4265 4384 -459 4539 546 4588 -2144 2239 2201 2209 -2129 2122 1083 2135 -1970 2052 2128 1719 -2169 2194 1986 357 -1698 111 1695 1970 -1713 1365 1867 2147 -581 231 1948 2056 -3763 4029 566 4008 -2139 2123 2148 1684 -2102 4014 4416 111 -170 4017 2101 2052 -2262 2165 100 384 -1973 507 2053 2254 -1961 2398 2454 2441 -2060 2244 2024 2268 -268 32 3829 3911 -3636 3817 3933 3847 -2315 1847 1454 2143 -261 2244 2290 1913 -1475 231 1970 1583 -100 18 2262 2266 -617 4015 1695 1730 -2256 1973 1730 1664 -1658 4017 1974 2128 -4305 78 4276 1727 -1732 4116 159 934 -2416 2258 1212 1664 -2024 2270 2079 2165 -2121 2124 2159 2140 -2036 2120 2125 276 -1612 1528 1750 2093 -2100 2140 1745 264 -2125 2158 2120 510 -2121 2124 1803 1667 -1517 1582 1578 2161 -1970 2128 617 2136 -2127 2115 2162 2094 -259 1612 2093 1651 -1612 2131 1532 1704 -1694 2130 264 1745 -1948 2133 2064 2056 -2132 1666 1657 1923 -114 2158 2149 1755 -2069 1528 2057 2093 -2138 1835 2127 2176 -2070 1577 2442 314 -1583 1851 2136 2167 -1911 2140 1365 2100 -2139 2120 2141 2123 -2142 2159 2140 1585 -1750 1528 2141 224 -2314 1835 2109 2176 -2167 2192 1642 2092 -384 2187 1699 2205 -273 2160 2174 2178 -2097 2148 1599 1409 -2147 2100 2064 2062 -1957 2134 1667 1412 -1618 1658 2312 2272 -1995 2333 32 404 -1083 447 2167 2171 -2019 2154 114 1648 -2153 1517 2155 1369 -2156 2154 2160 220 -1890 2157 2159 2155 -2156 1506 2158 114 -2157 221 2124 2134 -2156 2120 2141 2160 -2155 2161 2159 2146 -2160 2126 276 2178 -1835 2128 1974 1842 -2330 2084 2250 2089 -1892 2048 2249 2459 -2119 2213 2103 2253 -1223 119 2192 2167 -2152 2166 2138 2144 -3926 337 3908 4203 -2095 317 1409 2042 -2250 72 2338 2389 -2152 2201 2069 2172 -447 2171 224 1966 -514 2425 1852 147 -1932 1585 314 2146 -2402 1922 2430 2432 -2136 2143 2271 1642 -206 2178 1934 1832 -2146 2161 1577 2177 -2422 174 2218 2236 -1932 1663 2231 2288 -1968 2414 299 2245 -2211 1224 2298 2233 -4755 4235 4210 1712 -2231 2415 2428 2450 -99 147 1993 2385 -2243 3737 2362 2324 -1907 2249 2242 2145 -3685 1484 3918 85 -243 2487 2683 2685 -2388 1840 2207 2417 -3858 3767 3857 578 -1696 2166 2209 2144 -242 2242 511 1907 -1842 1449 2195 2095 -2074 2194 495 1986 -99 2369 147 2204 -3641 3779 3857 3918 -3997 3998 3834 2416 -2043 2232 2210 2239 -3347 3223 904 3247 -2092 1663 2171 2208 -2317 2504 2727 2558 -2022 2250 2316 2389 -2295 41 2196 2426 -2249 2145 2257 2310 -506 2221 1867 2208 -2190 1892 2348 2457 -2201 2209 2206 1966 -2092 2192 2210 2208 -2199 1696 2216 2209 -2246 2212 2182 1699 -1746 306 2211 2242 -2254 2040 2165 2270 -2063 2230 1910 2215 -2042 2214 2216 2222 -2043 2215 2221 2210 -242 2226 513 174 -2419 2460 2412 2179 -1929 2474 2676 2735 -928 362 5000 5164 -2452 2222 2206 2216 -2215 1899 2221 1713 -2603 2616 2642 1166 -2255 242 2251 371 -309 2253 1907 130 -2217 1746 306 2235 -3680 283 1979 3842 -1405 2277 3787 3774 -2407 2420 1920 2418 -1922 514 2425 2214 -2180 2184 1906 2444 -2233 1224 2199 2240 -2410 2182 2232 2234 -2411 2233 2235 306 -2226 2236 2240 2234 -2179 2237 2235 2412 -2236 457 2238 2413 -2237 2374 2239 2241 -2240 2238 2092 2199 -1592 2235 2239 2232 -2238 2375 2451 2043 -2193 513 2212 2187 -2294 2186 2263 2371 -2110 2283 2323 2106 -2407 2394 2181 408 -1746 2211 1592 2247 -2252 2281 2246 2271 -2278 1662 2318 505 -2299 2187 2205 2164 -2163 2170 2331 2203 -2224 2308 1907 309 -130 2253 2247 2040 -2252 2225 384 2165 -2104 2256 1618 2213 -2283 2075 2060 2224 -2114 2254 2040 2272 -2084 2262 72 2205 -2065 2261 2118 2259 -2258 2265 2269 238 -3901 284 3904 638 -4000 2265 3785 2258 -2085 2112 2257 2103 -3621 2344 2243 2373 -2418 2419 2436 2433 -2261 1989 2292 2259 -2112 1567 210 2280 -3629 2373 2372 3667 -266 2323 2106 2269 -1212 2259 2268 2270 -2213 238 2269 2119 -2272 2311 2247 2176 -2256 2150 2271 617 -448 283 2277 2279 -4034 3879 3945 3866 -2277 3815 81 2279 -2296 2315 1714 2063 -2273 3786 2228 2275 -2279 3778 3686 2248 -2273 1111 2275 2278 -2266 2074 1714 2313 -2247 384 1699 2311 -3037 2372 3703 2286 -1662 2255 2244 261 -3330 3752 4154 3274 -2078 1125 1110 2085 -2282 2388 2081 352 -2336 3704 2354 554 -506 314 2442 2180 -4093 3953 3673 3762 -2110 300 2321 2294 -2072 2292 2318 2322 -2291 2265 300 2323 -662 3308 1141 3112 -2290 2324 2243 1913 -2404 2339 2204 2403 -2298 2276 2310 2386 -1998 2368 2339 2404 -2182 1699 2296 2315 -1892 2308 2088 2249 -552 1133 2081 3703 -2389 1909 1991 2458 -2080 2026 2088 2308 -3703 3037 3702 3698 -4339 4371 4229 4093 -452 3880 3671 3759 -191 3734 3676 2357 -3330 3274 4119 37 -371 2251 2302 2299 -377 2474 2695 2427 -2205 2296 72 1909 -2281 2271 2312 2314 -100 2150 2313 2311 -2280 2312 1974 2314 -2315 2311 2313 2143 -2298 2314 2276 2109 -2339 1825 2051 2203 -2529 662 2202 2984 -253 2291 2319 2248 -3773 2318 2320 505 -2319 300 3772 2321 -512 2290 2320 2344 -326 2291 1662 2323 -2322 2292 2244 2268 -2086 1125 2186 2294 -2327 2429 2326 2405 -2423 2325 2457 2417 -1770 2368 2435 2325 -2644 2594 802 347 -2435 2404 35 2402 -2163 2355 2331 2078 -1715 2349 2330 2250 -303 2857 2568 2853 -50 4075 3751 2151 -3538 3093 3107 2812 -41 3010 2370 417 -2733 3705 3679 2287 -552 1825 368 2081 -265 2340 2170 210 -2297 2316 2370 2295 -3718 1609 2426 2338 -4174 4213 4251 4220 -461 4088 1110 2078 -3739 512 2344 2358 -3674 2321 2263 2343 -3115 2014 4098 3272 -3799 3823 3795 3786 -1968 35 2385 2430 -2387 2089 2022 2207 -2331 3694 2051 3278 -4148 4201 4021 2046 -2984 2703 2890 2479 -232 344 2005 2799 -344 2378 2760 2879 -346 3737 2287 3621 -2363 1996 2330 2362 -2046 521 3777 4141 -2306 3749 3672 3745 -2372 2343 2373 2390 -3100 3627 2542 3570 -1097 2886 1914 3089 -2367 2621 3698 2985 -2355 3738 2078 2186 -2371 2355 1133 2392 -3393 557 2365 3056 -151 3372 3016 2364 -3936 531 151 3729 -3654 437 244 2361 -323 2297 2327 2429 -51 41 2196 2809 -2335 2051 2339 2477 -2243 2363 2373 2391 -3707 2358 2267 2282 -2371 2263 2358 2267 -2238 2415 1663 2451 -2432 2409 2241 2413 -2885 449 2775 922 -2799 2005 223 2503 -449 322 2353 289 -478 3592 3668 3046 -323 413 340 2002 -4359 629 4102 4156 -4840 4973 4943 4993 -3800 1326 1347 4069 -1092 2776 2781 2971 -2347 2185 1992 2424 -1909 2296 1910 2410 -2388 2392 2081 2348 -2286 2390 2387 2190 -2203 2170 2403 2301 -2358 330 2391 2388 -2390 2080 2371 2392 -2387 2391 2363 2089 -307 2462 2484 1908 -2245 2414 237 2434 -3005 3012 369 2536 -2703 2926 3000 2726 -1174 2556 763 2672 -2487 2105 2683 2486 -2841 3138 2864 2576 -374 2615 1850 2659 -2817 359 1028 243 -2436 1991 2329 2175 -2295 2389 2426 1991 -2406 2297 2295 2329 -2421 352 2325 2417 -418 2404 99 35 -2437 2229 2438 2245 -3114 3102 3094 3064 -2375 1910 2043 2410 -2411 2386 2409 2233 -2410 2234 2412 2460 -2413 2411 2236 2218 -2433 2375 2237 2412 -2181 2449 2394 2431 -2374 237 2184 2449 -2198 3785 3792 2118 -2405 2190 2326 2422 -2461 2264 2229 2434 -2422 2218 2423 2264 -2421 2461 2229 1824 -3018 2405 1770 2420 -2417 2179 2419 2461 -2436 2326 2458 2419 -2385 2425 1881 2430 -2424 2173 1899 2230 -2340 514 2204 2403 -2456 307 2502 2309 -2184 2464 377 2453 -2368 1825 2325 368 -2347 2175 2424 2431 -2430 2432 2448 2414 -2175 2375 2431 2433 -2432 2413 2434 2264 -2394 2433 457 2418 -1920 2327 2329 2436 -2402 2435 2423 2264 -1824 2407 2482 408 -3027 1920 1828 2407 -820 1211 763 2672 -2441 1753 2565 1929 -1952 2440 2105 1924 -2137 2444 2446 2288 -1880 822 2526 2595 -2442 1933 2445 2231 -2446 1820 2450 2444 -2045 2445 2447 2442 -2448 1881 2446 2452 -2449 2431 2447 2451 -2450 2448 2415 2414 -1213 2445 2184 2449 -2374 2241 2448 2452 -2221 506 2447 2451 -2454 2455 1213 2428 -2105 2486 2453 377 -2453 2499 299 1912 -2492 2427 390 2490 -2326 2022 2458 2207 -2423 2457 2301 2459 -2458 2460 2164 1909 -2459 2048 2411 2218 -2420 2422 2418 457 -2492 148 2530 2393 -2627 2570 2626 2622 -2465 307 2428 1912 -237 1824 2464 408 -2478 2670 1958 2496 -2559 429 295 2527 -2944 74 2889 2511 -2521 1 2972 2959 -3127 2998 2840 2959 -2547 2976 3013 2947 -77 294 3013 427 -2965 2943 2514 2961 -2309 2219 2694 2480 -400 2492 2523 2546 -127 2552 844 2578 -2370 3034 56 417 -1601 2466 2715 2737 -2960 369 2351 366 -2490 2474 2669 2513 -2712 2525 199 2715 -2437 1908 2483 3028 -2482 2484 2500 3029 -2483 2393 2501 2530 -1558 318 2780 1871 -2454 2398 351 2695 -318 825 2189 2398 -2689 2608 1173 2740 -2569 2559 819 859 -429 2456 391 2480 -908 2919 2596 2914 -2456 2475 2532 2462 -2616 885 2835 2861 -3479 3408 3389 398 -1941 2499 3024 325 -2466 2722 2748 2737 -358 2568 2859 1146 -2720 3004 2789 3014 -2455 351 2495 2500 -1912 2501 2499 2483 -2500 307 2502 2484 -2696 2427 71 2501 -2686 2001 2377 2777 -3290 662 3295 2202 -826 2642 2603 358 -2976 2828 11 3013 -2726 2926 2785 2590 -1938 2677 888 1939 -333 2682 1116 3058 -387 2906 2908 2549 -2468 387 288 2946 -2885 2984 2529 2927 -2527 2480 2670 1601 -2521 2473 2561 1 -1191 2543 1752 24 -1822 2529 56 1829 -2595 2526 2573 2569 -2677 1466 2740 2742 -76 2049 2623 2777 -2600 2624 2684 2591 -2930 2514 2947 2469 -2581 1103 2865 2893 -2533 2540 2532 2475 -4925 285 4956 4768 -2481 2537 374 2572 -2517 2443 96 819 -2467 2513 2719 343 -2980 426 3000 2703 -328 2317 2516 2512 -2484 2462 2531 2652 -2530 2532 71 2884 -2531 2492 390 2523 -2592 2550 2523 2587 -2649 394 2606 2673 -3269 922 289 2991 -2975 3001 2726 2395 -2601 2614 2710 2525 -1770 1419 3018 3006 -1155 2554 2738 1206 -2523 2550 294 427 -3140 2680 3490 3304 -3716 55 2359 3574 -692 383 806 2515 -393 2549 389 2559 -2904 2934 2796 392 -2549 2475 2587 429 -2888 2471 2905 428 -4093 4307 3953 4056 -2510 2546 2588 2544 -2533 2795 2540 2632 -465 416 2792 2835 -2476 2598 844 909 -2837 387 2899 393 -1084 2748 2539 2761 -127 2563 2573 2597 -821 2397 28 539 -389 2574 819 2559 -2002 2793 2890 2202 -2544 2467 2557 2489 -2767 1164 1975 1145 -2889 2514 2943 2955 -3220 2914 908 2656 -2848 379 2595 2555 -83 2849 905 257 -2683 2440 840 2735 -878 2728 2759 873 -2673 2635 394 97 -905 2611 2332 2497 -379 2489 2517 2597 -907 2640 2463 2577 -713 806 2717 2607 -343 1978 2525 2601 -2517 897 2555 2597 -2589 295 2667 2557 -815 791 2664 1834 -873 2399 908 3219 -2570 2646 2626 2851 -2665 2476 2619 805 -388 2911 2711 2847 -834 2702 2637 2787 -2847 2867 2522 2918 -923 907 2625 2831 -3250 902 2978 870 -2694 2722 2731 2669 -2674 424 1044 327 -2592 295 2587 429 -2586 2588 2533 2546 -2549 2587 2639 2589 -2588 2574 898 389 -3020 3011 2507 2999 -2520 2712 402 2710 -391 2729 2533 2586 -1115 2661 1216 2818 -2328 2649 2606 327 -379 2443 2563 2517 -2833 2491 2932 2827 -2569 2598 2573 2555 -2552 2597 901 2599 -2598 859 2628 2602 -456 2520 110 2663 -2602 2572 2537 1209 -2599 2601 2622 2627 -2505 2223 833 2860 -2611 2636 852 2605 -2604 2646 310 394 -2534 2675 852 2594 -1185 2571 1761 383 -2488 2688 217 1233 -516 3189 2862 403 -327 732 1175 2634 -2568 2604 802 2853 -2006 1214 2666 1681 -3694 552 2051 558 -2622 1821 2537 2615 -2614 2620 2400 2625 -2223 2493 2855 1165 -2912 2866 2664 2796 -2658 2865 2887 2873 -844 2640 907 2578 -1850 451 2827 2615 -2942 3037 2361 2986 -2602 2463 2614 2625 -2805 2519 2815 2819 -2520 2714 1681 2712 -2622 2582 2615 2628 -797 2577 2706 2463 -2678 909 2463 2602 -2599 2625 2629 923 -859 2628 2659 2630 -2629 96 2658 819 -2882 298 911 2900 -2639 2909 2711 2550 -686 3428 3448 3426 -347 2610 2653 798 -805 909 887 2567 -1146 2604 310 2647 -2580 2692 672 5013 -888 2756 2691 2744 -2588 2908 898 2632 -2619 909 2570 887 -1028 0 2765 1882 -2505 2849 977 2223 -2871 2644 303 846 -2328 2643 2853 753 -2868 139 2844 2656 -2852 2577 2605 2651 -2636 814 1191 816 -2761 791 815 2748 -2594 2650 2534 2673 -753 805 2651 2649 -2650 2646 394 887 -3022 2530 2884 2907 -886 2634 821 730 -2971 2969 2789 2720 -2863 2868 817 2851 -2871 2562 2645 817 -2732 2667 295 2719 -2659 2618 2667 2630 -2718 2400 2658 2629 -1681 2714 450 2761 -30 2020 2593 2815 -833 2721 2717 2860 -451 2600 2836 1821 -2575 388 455 2617 -817 2915 2863 2578 -363 416 2612 2684 -2657 2873 2574 2658 -2721 402 2754 2717 -2584 2670 2730 2480 -2669 2466 2671 2513 -2670 1958 2732 2719 -424 2439 2397 918 -2649 2567 2534 2674 -820 2585 2675 2673 -2606 2674 112 1044 -2219 1601 1930 2736 -1233 1065 2518 2508 -692 97 797 2627 -2701 5159 3257 1021 -3241 373 3313 2541 -1761 2755 2693 2745 -3697 3698 3702 2509 -2189 2398 2565 2734 -2721 2666 2520 110 -1710 1871 2189 2749 -3007 2503 1964 2778 -550 4870 4874 3371 -2689 861 2608 219 -959 2688 2488 2693 -1930 236 2739 2691 -1226 2690 2751 2638 -2702 2832 1101 2637 -2689 2681 2746 1142 -2695 2734 2584 2474 -2486 2694 2696 2309 -351 2695 2697 2502 -2698 2731 71 2696 -1976 2697 3015 1558 -2891 2885 3008 2927 -181 840 236 2739 -2679 279 5097 2791 -1194 287 2692 2580 -2351 3033 2528 2396 -868 465 5188 813 -1146 2709 2859 2716 -2626 2836 2709 1821 -692 2708 2709 2716 -1209 2710 2707 402 -797 2706 2705 2707 -2708 2537 1821 2591 -2579 910 2795 2632 -2624 2481 947 2591 -2714 456 935 2725 -2624 2713 2660 2724 -1978 2478 2481 947 -2717 2707 806 2705 -2662 2668 2571 2716 -374 343 2659 2719 -2671 2718 2657 2527 -11 2828 2654 2498 -363 2684 2668 2662 -2496 2584 2749 2734 -2738 947 2751 1206 -2714 199 2725 791 -2724 1850 2713 455 -369 2396 2536 2507 -56 3034 2002 2202 -2566 885 2825 139 -2730 2769 2592 2732 -2731 2729 391 2669 -2697 1976 2730 2584 -2671 1834 2729 2657 -3699 2336 3700 3731 -2722 2683 2735 2694 -2734 2565 2736 2219 -2737 2739 2676 2735 -2478 2496 2738 2736 -2539 2737 2739 2723 -2738 2700 2690 2736 -2488 2518 1894 2741 -2740 2742 1868 2746 -2518 1354 2741 2743 -888 2742 2744 1919 -2638 2745 1038 2743 -2681 2746 1946 2744 -2741 2745 1837 2693 -1999 311 1710 1967 -2648 2749 2554 2496 -2748 2750 2685 2722 -2790 1871 2749 1976 -2752 2691 2723 2756 -1918 2751 947 2753 -2752 2754 402 440 -1761 2668 2755 2753 -2681 2754 219 2756 -2755 2751 19 2638 -0 2765 146 1833 -3168 1139 462 3453 -2825 813 2566 3218 -2353 1870 2820 2807 -2554 2660 2830 2648 -1214 1724 1938 1215 -1838 1679 2878 2807 -1838 1131 4997 396 -395 2757 1925 2641 -1833 2767 1215 1724 -2766 1529 311 2560 -1976 2769 2790 2794 -2768 2729 1834 2795 -2900 2892 349 2914 -1115 161 2822 365 -387 2916 2908 296 -2798 3037 3036 305 -2813 3089 3265 3231 -328 2005 3302 2376 -9 1679 1999 2384 -2519 1993 2778 2503 -1956 2777 1940 2686 -2780 1870 1956 322 -2485 2781 2779 2789 -1871 2384 1999 2780 -3388 3474 3158 726 -3247 481 3223 3212 -685 2799 2808 401 -2975 2507 82 2999 -1983 4889 401 2788 -1077 957 2580 2007 -2786 4840 2800 308 -2780 2654 322 2498 -1092 815 2768 2750 -1169 2701 5183 4824 -3152 2832 1165 2551 -2803 889 2558 2979 -2768 2795 2987 353 -2769 2550 2711 2794 -2911 2545 2617 2924 -4151 3179 3936 4020 -341 2773 2803 2981 -2352 2377 2784 76 -2805 30 2788 2821 -2013 3713 3034 3290 -3383 3068 3070 3379 -3036 2798 2793 1116 -3082 3352 5225 5273 -2800 76 2623 2820 -561 4149 3355 3385 -2760 1982 2823 2763 -2010 2809 51 2784 -2808 2008 2369 223 -3091 2966 345 409 -3680 85 1979 3822 -3085 3124 2334 3048 -2935 3138 2774 3191 -4216 4174 3615 3394 -2661 524 2816 2623 -2817 2815 359 2819 -2401 1967 2818 2816 -0 1325 2593 2817 -1870 2623 2816 1956 -2805 344 2760 2821 -2800 4841 2820 2822 -2771 4927 2821 2823 -365 2822 2807 1838 -3221 2871 2825 766 -715 2759 2728 2824 -924 3244 3259 2875 -2839 2831 2596 2620 -2506 2990 2720 3011 -2830 385 9 1951 -1164 450 2829 2761 -2863 2582 2932 2827 -2692 416 676 2792 -2865 2919 2596 2887 -2903 808 902 796 -2493 878 2551 110 -2663 2858 2850 2706 -2848 2949 2899 2553 -3473 3163 432 3374 -2827 451 2844 2868 -2928 2470 2926 3002 -1914 935 2399 2912 -3723 3064 3114 3730 -903 2923 3306 443 -2839 2645 873 908 -3059 3159 3160 3186 -664 3090 93 3094 -2873 2581 2579 898 -2563 179 1880 2837 -2564 767 2642 2854 -2868 2836 2857 2851 -2655 2850 2852 2577 -753 2851 2853 2646 -2644 2852 2332 2611 -2849 136 2855 257 -2854 786 2616 885 -2857 885 139 303 -2856 2850 2858 2332 -2859 2857 2861 2836 -2497 2858 2860 2705 -2603 2861 2662 2859 -2860 2493 110 2858 -2609 2937 3121 3146 -2655 907 2665 2831 -2919 2399 2912 2934 -2618 2522 1740 2833 -385 1951 2617 2924 -2916 2581 2910 898 -2655 2839 2645 2850 -412 3654 3096 3100 -93 3094 3333 3741 -2656 2643 139 2824 -280 3180 3324 3148 -2667 2618 388 2847 -924 3169 2875 3209 -2874 3212 2826 3174 -3492 3427 3049 3533 -2878 2978 1679 902 -2763 2877 2896 2879 -2878 289 378 2353 -3159 3160 3142 3106 -3209 3149 3174 3263 -2631 3224 3262 3209 -3130 3159 3124 3512 -2652 2531 3015 294 -2376 2921 2512 2699 -2360 1020 385 2894 -2618 2833 1850 455 -2909 2933 2547 2953 -2468 428 2561 2954 -2558 889 366 2351 -3011 2699 3004 3020 -179 2770 2893 2925 -2918 349 2892 2522 -3038 2886 132 3265 -3223 835 3222 3147 -2878 2903 5001 378 -884 375 1740 2932 -515 3352 3180 3326 -2553 2837 2910 2916 -2631 2770 2935 3191 -3107 2963 3093 3543 -3137 3471 3472 3513 -2896 3214 2834 5002 -2911 2545 380 2918 -2906 427 2547 2909 -2510 74 2905 400 -2652 148 77 3021 -2510 2772 2639 2909 -2908 2888 2632 2905 -2899 1880 822 2867 -910 2796 2904 2579 -2841 2617 455 2864 -16 3069 3458 3400 -2915 2562 2491 2770 -2914 884 2932 2665 -2899 2917 2867 2772 -296 2916 131 2949 -2904 2893 131 2581 -2491 2864 2833 349 -3006 2929 3019 3028 -2928 922 3002 2885 -1393 4650 4649 4550 -2843 442 3184 1985 -2796 3038 2866 2983 -2949 2892 131 298 -2396 2840 2998 2507 -2960 2512 2699 316 -3113 2840 3033 2921 -3017 2920 3021 3012 -2998 2997 82 2521 -316 418 3007 3026 -2915 2897 2596 2831 -910 2977 2888 2952 -349 2864 2545 2935 -2900 2813 2934 392 -248 2951 1 3149 -680 3135 3204 2862 -547 3605 3132 3600 -3624 3497 3480 3613 -3151 409 2961 2945 -3706 3036 413 2002 -3716 3707 437 2621 -2473 2944 2561 2945 -2966 2468 2943 2945 -2940 2944 2943 249 -2949 249 288 2511 -428 82 2521 2471 -674 3375 3106 3142 -2837 2925 2917 2946 -63 2951 2952 248 -2950 3171 2994 2936 -380 2953 2950 2933 -2954 2888 2952 296 -2889 2953 2955 288 -2954 248 2561 249 -3067 3058 1116 341 -3062 3003 1659 3091 -2977 2983 910 2987 -3072 2469 2470 2967 -2927 3017 2479 213 -2964 2940 2473 3153 -3293 3155 2968 3348 -2901 3059 3088 3484 -345 2961 2965 3187 -2966 2473 2997 2964 -2810 2989 2965 2944 -2972 2992 2990 2959 -3223 399 2962 835 -2978 289 2654 2991 -1092 2983 2971 2987 -2384 2978 2654 2970 -2976 2469 2994 2967 -3119 3135 3108 332 -4363 4858 950 4619 -2988 2536 2785 895 -2977 2506 2471 2972 -2933 2958 2976 2994 -2877 2969 2971 2583 -1116 3032 2793 3295 -2982 212 2528 889 -2982 2798 889 3005 -3001 444 2980 2981 -2924 3250 2970 2958 -2317 3033 2351 2512 -3096 2361 3058 2986 -2621 341 2985 55 -2794 2958 2970 11 -74 2989 82 2975 -3003 2988 2997 2966 -2967 2991 2828 3002 -2992 2969 2990 2535 -2967 870 2991 3199 -3291 3321 3342 93 -2977 2972 2951 3232 -3129 3003 3000 2996 -3125 2997 2995 2998 -2996 2965 2989 2930 -2470 2996 2926 2930 -77 2590 2785 3013 -2528 2995 3001 2396 -2982 2536 3000 3003 -2840 2921 2990 3011 -2957 3001 2995 2989 -2498 2891 3008 3023 -2981 372 366 2395 -2538 213 2920 3027 -3008 2931 2686 3025 -3004 2699 1964 3007 -4622 4902 4975 955 -4091 3278 2335 2014 -3002 2891 2828 2590 -148 2395 2929 3019 -2472 2506 2999 2471 -3015 2498 1558 3023 -2884 353 2698 3014 -3068 2365 3070 3056 -2960 3020 369 2929 -372 2421 2538 3019 -3012 3018 2920 1908 -2891 2590 3017 3021 -3020 3022 2907 2929 -3021 3023 2652 3029 -3022 3004 3014 3024 -3025 2495 3023 3029 -3026 3024 325 3007 -1828 3027 3025 2931 -3026 3028 3006 2438 -3029 2482 2920 3027 -3024 2483 3022 3028 -602 4528 4724 5040 -3132 3618 3567 3604 -2979 3045 212 3307 -2984 3112 2703 2928 -2477 558 2727 2801 -1139 696 722 5241 -3702 2773 2941 2803 -2621 2282 2303 2773 -2924 2894 3250 1090 -3052 3062 3098 89 -3108 3298 3135 3050 -3296 3302 3268 3277 -453 3586 3585 3568 -3162 3541 3049 3170 -3098 332 3129 426 -3067 3052 3032 3182 -3729 151 2379 44 -3061 3087 3110 3322 -3185 3099 3063 2812 -2876 3524 6 3043 -3486 3060 3040 565 -48 3102 3329 3094 -212 444 3039 3045 -13 3948 3101 14 -4437 4545 4164 3273 -3276 3302 232 3296 -3597 2364 3016 3367 -4702 1102 4589 4353 -443 2985 2509 2956 -485 3061 2845 2963 -3310 3050 3501 3313 -3059 3062 3133 3047 -444 2957 3039 3061 -485 3107 3048 55 -4067 2408 39 2842 -3663 478 4186 3592 -3284 211 3071 517 -2956 3077 3045 3183 -44 3016 2802 3725 -3565 3554 2913 262 -2802 3417 3363 3016 -3075 381 3630 3066 -3147 3197 3127 2959 -3569 3421 398 3502 -3398 329 3076 3664 -3071 3076 547 3398 -3075 3281 4189 3074 -341 444 3067 485 -3105 3206 3118 3187 -4221 3467 3370 3433 -3561 3534 3590 3608 -5012 1095 5026 843 -4890 494 3351 2804 -3315 4893 4162 5320 -679 3103 4970 4275 -3390 3571 2812 3538 -4172 4192 477 262 -3047 3091 403 21 -3130 2963 3159 3136 -3138 2360 2774 3216 -2015 3305 3120 2846 -2957 2810 516 3087 -3572 496 3573 3525 -2334 2901 3130 3506 -2846 3051 2870 2408 -3606 3895 3873 3559 -443 2869 2985 3099 -3137 397 3192 3399 -3039 1659 3044 3121 -3096 3100 55 3048 -2869 2359 3099 3571 -535 3053 4099 4070 -3364 3366 3051 2408 -4619 3 3084 4664 -3481 256 260 710 -3153 3207 3197 3078 -2880 487 3128 2948 -3063 2901 2334 496 -3267 3040 2973 3309 -3427 3537 3540 3542 -3047 3128 3146 3133 -3112 426 332 1141 -3033 3111 3113 2293 -3198 3195 3112 2928 -2842 2408 3306 903 -417 2345 2013 643 -3122 5258 4308 4258 -3502 3496 397 3515 -3078 3125 3154 3127 -3154 3205 399 2973 -65 3297 3090 48 -2862 3135 3098 89 -3660 3116 494 4890 -3148 714 3156 3377 -2812 3511 2883 3185 -3129 3187 2996 3118 -3200 430 3478 3170 -3072 3118 3195 2470 -3106 3522 3110 3166 -1659 3125 2995 3044 -3093 3088 2883 3507 -21 409 3189 3202 -3420 2938 3031 3594 -3061 3110 89 3160 -442 3378 3510 3516 -2937 3121 3040 2973 -3088 3484 487 3532 -3468 2902 3097 373 -2399 3089 2813 3219 -3173 3535 3288 3485 -3241 2541 3144 361 -3472 3246 397 3515 -3513 2948 2880 565 -3155 3310 3148 3180 -3140 3463 658 3365 -1985 65 442 3514 -403 3166 2862 3110 -3172 3072 2895 3199 -2872 3143 3123 3500 -3150 2881 2936 3157 -321 3209 3149 3151 -3150 3208 3153 2940 -5013 2792 5176 5188 -3151 3105 3157 2961 -3119 3118 332 3195 -2962 3309 399 3143 -3123 481 462 3168 -3149 3197 1 3153 -2782 3399 3487 570 -3088 2845 2883 2880 -2845 2880 3133 3181 -3355 3366 3368 623 -3043 3533 3521 3532 -3460 3531 3504 2838 -3249 808 3259 3176 -3523 21 3166 3374 -3128 3165 3146 407 -4299 4303 1379 1784 -2758 3382 3156 3169 -3168 3208 3211 2874 -3126 3507 3532 3043 -3233 3232 2951 3263 -3212 3197 3147 3174 -3539 3139 3546 3369 -2875 2881 3172 3249 -3297 3313 3310 3326 -3215 3164 3260 667 -3606 3631 135 3617 -4671 4410 530 3803 -2797 694 3954 3274 -2898 3353 2872 3143 -3160 3298 89 3182 -3183 3181 3045 3299 -3184 3186 3067 3182 -443 3185 3183 2923 -3184 3048 3186 3124 -3183 3185 485 2845 -3188 2964 3125 3078 -3189 3187 345 516 -3188 3131 3203 2609 -13 14 4060 681 -3225 2900 2813 3220 -3474 3499 3097 3476 -3238 3321 3342 3350 -3360 3297 3238 3326 -835 3154 3113 3127 -5297 4288 267 699 -3157 3172 3072 3105 -835 3277 3268 3113 -3236 3147 3222 2992 -3471 414 3126 3504 -3504 3532 487 3531 -3503 3131 3203 3208 -3204 3206 3202 3189 -2937 3205 725 3203 -3206 714 3119 3204 -3078 3207 3205 3203 -3105 3208 3211 3206 -3169 3202 3207 3151 -2882 2874 2881 3150 -466 4867 5199 1029 -3212 3169 481 3207 -2875 3211 2783 3172 -4962 5038 4724 1128 -463 808 636 2903 -3224 3262 3176 3264 -3217 4824 1097 3089 -813 5085 3216 3218 -2759 3217 3219 3221 -2576 3218 3138 3220 -3221 3191 3219 2562 -1017 3220 3218 2824 -636 2895 3269 3199 -2783 2968 2200 2895 -3225 768 3215 2882 -3191 724 3231 3224 -5089 696 687 5221 -5159 3260 5150 1091 -4351 1010 4810 4932 -3230 912 5099 787 -3229 5177 5004 5155 -3225 3264 279 2774 -2994 3171 3250 870 -911 1090 3171 3262 -3384 4714 665 4242 -4935 4770 4807 4969 -3199 808 3249 870 -4133 2014 4041 3272 -3359 3193 3351 3194 -3451 4907 4231 4836 -705 525 4839 252 -570 2680 3242 3140 -3454 3241 3326 515 -1170 5098 5242 722 -3409 3261 2826 3247 -3493 479 222 120 -3478 3455 3509 3141 -133 2200 3244 2783 -3445 3391 650 3392 -3164 3174 3236 3263 -2983 3038 2583 3232 -4947 4651 4728 3292 -5308 5296 5288 5344 -105 5080 1023 3358 -4965 5094 4301 5024 -5105 3528 4715 4320 -4885 5276 5283 4888 -5150 724 2679 4897 -1017 5060 5086 5018 -3260 3261 3164 2826 -768 3227 3176 3259 -1170 3244 463 3259 -2882 3263 3215 3233 -3262 2881 3249 3171 -3215 3265 667 3231 -1090 2894 3264 2774 -1442 5217 644 607 -501 3108 3320 1141 -3269 3041 922 3198 -3270 3268 2535 3222 -378 3271 3269 636 -3270 3296 1502 362 -3237 1732 2345 4116 -4369 499 4280 3054 -2284 4075 3179 2307 -1225 4080 350 3953 -1093 2016 684 3055 -3293 3041 3198 3308 -1715 2349 3010 1981 -5190 5000 5160 5164 -5005 1502 904 3347 -536 4143 3076 3736 -3395 3527 120 3491 -3342 934 1093 2016 -3520 3066 3398 3710 -551 3711 1981 4066 -3968 4072 251 4477 -3987 3402 4122 3396 -3139 3537 3536 3529 -2013 3291 93 3290 -2801 3289 3294 2504 -3289 2011 2993 338 -4984 3251 4648 4945 -433 2962 3277 3349 -333 664 3295 3290 -3294 3307 2979 2504 -3055 3041 3271 526 -3120 3175 2015 3194 -3299 3181 3040 565 -1985 3298 3182 3320 -489 4837 4159 3337 -3302 338 2011 328 -3041 3055 2775 3301 -3345 4856 3449 525 -2541 3468 3482 102 -664 3090 1985 3320 -3114 3378 412 2843 -3295 3320 3032 1141 -338 3277 433 2293 -501 3108 3155 3310 -3309 3060 3143 3175 -5237 5285 3357 5230 -1107 3509 3499 3493 -3175 3411 3060 2680 -3518 3526 3369 3580 -5312 5017 4815 3083 -3381 3390 3569 3515 -4991 4957 4266 5066 -4269 304 4049 4409 -1093 526 480 3350 -3305 3267 3299 3307 -433 2015 3193 2993 -3484 3047 3522 3523 -4278 4733 4922 4751 -462 721 2872 3450 -3776 4126 3670 3768 -3242 3175 3194 2898 -464 5282 5146 4744 -4234 4838 5165 4876 -623 3051 645 3361 -2284 3909 2307 4144 -1997 290 1703 419 -3395 398 3505 3479 -645 269 3334 2870 -3362 3333 934 3342 -1627 4574 94 4475 -522 4076 1955 1798 -3300 1114 3338 4231 -4159 5280 839 3337 -3356 4963 3 4258 -4970 3660 4912 1644 -5075 466 360 5140 -3193 3334 3283 2993 -4608 5111 5154 5149 -5290 5249 5282 464 -3303 550 4215 4875 -1099 4648 3356 4672 -3280 3348 2200 3354 -3349 2962 3347 3353 -3350 526 3348 3293 -3193 3319 3351 3349 -3082 3238 3350 3352 -2804 3351 3353 2898 -3352 3348 3354 3180 -5219 3347 721 3353 -2806 3161 660 3386 -3346 3339 4163 1711 -3311 4308 5258 5178 -436 5079 3253 683 -3360 3362 4960 3238 -3432 3361 3359 3194 -3431 48 3329 3360 -3359 3334 645 4912 -3364 3418 3366 3070 -3516 3378 3363 3102 -5256 3392 361 3144 -3363 3161 3102 3367 -3056 3368 3366 39 -1706 3367 13 3161 -3485 3314 3173 3548 -4240 3079 3456 4913 -705 665 2687 4244 -670 3416 1109 2365 -3448 3426 3413 3437 -2838 3165 407 3503 -2948 432 407 3486 -3473 3382 3498 3461 -3500 725 3123 3382 -3134 3379 3364 3306 -3552 2802 3378 412 -3591 3520 3594 3483 -3455 245 818 3316 -3376 3503 3377 3168 -3480 3497 2802 3552 -4213 3234 589 3412 -3386 3413 2806 3415 -736 3385 3355 3418 -3407 727 589 3400 -4221 3475 3489 2782 -727 2494 656 3448 -3316 3552 3510 3085 -438 3473 102 3248 -3248 3461 3365 5252 -2364 3653 435 531 -4178 2814 4063 4224 -3424 3282 1107 3332 -3401 16 3287 434 -3562 211 3692 3632 -3284 3074 3075 3588 -3097 405 3158 373 -3401 2913 3387 3666 -3400 3396 3987 3407 -4171 3404 4187 3287 -1124 1768 4216 3771 -3402 4147 3764 3565 -5228 3456 467 3406 -3405 3446 726 361 -656 3387 3412 3401 -2494 656 3422 434 -133 3244 722 1139 -4337 4587 4574 4636 -3313 65 3514 373 -3407 3384 3414 4212 -3373 4242 3385 3414 -656 3413 3415 3412 -3416 3414 3385 670 -3415 3372 3417 3422 -3418 3416 3070 3421 -3386 3417 3363 3462 -3578 3583 245 3573 -3618 3693 3132 3591 -3422 3417 3073 3480 -3623 3416 3408 3421 -4910 4791 4825 4898 -3508 3526 3395 3505 -4426 5254 5269 5283 -2633 736 3373 3489 -2876 3530 3540 3109 -3429 398 2633 3502 -686 3428 3499 1107 -660 3488 3431 4854 -3430 3487 3361 3432 -4395 3431 3360 3454 -642 4853 3079 4870 -659 5337 5009 5151 -4124 469 561 4832 -5214 5088 5209 5017 -4853 3373 4242 642 -4952 172 1036 5334 -561 4720 4149 4755 -5127 5218 4620 5246 -5064 5299 5037 5325 -5315 5311 4241 5302 -222 3493 3476 3470 -4953 5241 5238 5243 -3446 3494 3248 3456 -3495 3406 3445 650 -4914 4905 4918 596 -3457 2633 3389 3373 -297 4259 586 3303 -5264 280 3324 3453 -5281 3239 839 666 -5234 4940 5203 5285 -5240 3461 3450 2758 -3432 570 3242 4886 -728 3381 3508 3246 -3405 3445 5253 3370 -3448 3477 4853 727 -3459 3464 3491 2913 -3458 3589 3479 3582 -438 3492 414 3163 -3392 3376 3463 3453 -3502 3418 736 3496 -3144 3498 280 3461 -3581 3518 3458 3551 -3481 430 3509 3493 -3563 3589 3582 3625 -3475 3477 3494 3079 -3469 3471 3137 3304 -3476 3468 102 3470 -3443 414 3469 438 -3468 3200 2902 674 -3141 2902 3478 3512 -3391 2838 3482 3376 -3475 3192 2782 3495 -3467 686 3388 3474 -3443 3192 3495 3469 -686 3457 120 3467 -3246 3126 3507 3472 -3491 3459 2494 3332 -2939 3383 3421 3569 -479 6 3104 3465 -3490 3304 432 3473 -3567 3380 453 3547 -2963 3322 3136 3521 -3519 3139 3556 3369 -3050 680 3501 3375 -3488 405 3431 3158 -736 3487 3430 3489 -3388 3488 3426 4871 -3498 2541 3501 3482 -3479 3282 727 3458 -479 2876 6 3460 -3245 3465 3312 3443 -3495 222 3445 3467 -3494 3476 3474 3446 -3117 3462 405 3516 -2939 3668 3383 3611 -3463 3490 3500 3376 -3429 397 3192 3312 -3498 3501 3148 3377 -3490 3060 3500 3486 -3117 3073 3428 3462 -3382 3374 725 3202 -674 3200 3201 3163 -3424 3579 3332 818 -3507 3544 728 3093 -3478 3170 3506 3130 -710 3424 3509 3455 -3465 3508 3312 3246 -3134 3390 3511 3515 -442 3510 3124 3512 -3472 3513 2883 3511 -2902 3142 3512 3514 -565 3145 3513 3411 -3141 3316 3117 3510 -3134 3364 3496 3517 -65 3516 405 48 -3314 3527 3464 3519 -3485 3529 3518 3557 -3284 3534 3588 3380 -3542 3484 3162 3533 -487 3322 3128 3523 -3531 3322 3522 3165 -3540 256 3049 3541 -3535 3092 3539 3543 -3527 710 3314 3424 -3526 260 3282 3518 -4603 3255 4658 4977 -3288 3537 3530 3519 -3536 3427 260 3529 -3163 3533 3201 3523 -3201 3170 3136 3162 -3531 2876 3162 3521 -3520 3575 3080 3572 -3525 3537 3139 3555 -3530 256 3540 3288 -3535 3109 3288 3529 -245 3085 2334 3583 -3173 3525 3573 3545 -3536 3524 3427 3109 -3542 3524 3043 3544 -3521 3109 3541 3543 -3542 3525 3544 2901 -3543 3545 3541 3506 -3544 3539 3546 728 -256 3173 710 3545 -3483 3572 3586 3555 -3587 3369 3577 3580 -3669 545 2003 4173 -3579 3613 818 3578 -3558 3568 3464 3554 -3390 3383 3379 3571 -157 2082 29 3619 -3602 3604 3551 3069 -3547 3535 3556 3557 -3557 3485 3555 3586 -3556 3519 3568 3555 -3551 3585 3596 3581 -3628 3784 3095 3884 -3610 3574 3570 3583 -3587 3572 3080 3577 -3397 3628 135 3688 -3596 3566 3466 3626 -3661 4193 4180 3648 -16 3566 3069 3404 -3565 3563 3602 3764 -453 3483 3568 3031 -3042 3567 3557 3551 -818 3480 3073 3316 -3611 3560 2359 3571 -3085 3552 3100 3570 -3534 3092 3561 3547 -3577 3092 3419 3539 -2542 496 3560 3575 -3574 3534 3609 3709 -563 1113 3637 3809 -3548 3561 3578 3573 -3550 3612 3419 3577 -3580 3550 3582 3505 -3581 3314 3548 3579 -3464 3580 3558 3582 -3581 3466 3459 3579 -3419 3560 3538 496 -3809 3671 4191 452 -3042 3587 3601 3558 -3547 3556 3587 3042 -3586 3548 3561 3585 -3520 3398 3600 3590 -16 3459 3466 434 -3588 3607 3601 3080 -211 3380 3420 3618 -3065 2379 3659 3624 -170 3993 3808 4324 -3380 3600 3132 453 -4143 4142 4185 1140 -3602 3563 3558 3601 -2087 39 3056 3722 -4172 1963 1716 1972 -4171 4137 3670 4065 -3588 2938 3594 3601 -3590 3596 3600 3585 -3554 3566 3596 3605 -1997 4081 1703 4046 -3605 477 3031 3554 -460 3602 3604 2938 -3628 73 3177 3095 -3590 3664 3626 3608 -3607 3609 3612 3080 -3708 3575 3610 3608 -3611 3609 3560 3612 -15 3610 3570 3497 -3613 3610 3578 3608 -3625 3612 2939 3550 -382 4300 679 4275 -2814 3972 4078 4063 -3691 3632 3618 3637 -3874 3177 3690 564 -3420 3591 3031 3616 -3851 3553 3634 49 -3645 3646 3896 3784 -2354 2263 554 3674 -3774 81 4030 253 -434 3659 3422 3624 -3625 3592 3623 2939 -3466 3626 3624 3613 -3563 3607 3663 3625 -3716 3719 2359 3695 -73 3559 3606 3562 -1133 2267 3703 3700 -386 536 3071 517 -3177 1113 73 3632 -3692 3397 3616 3631 -4141 4148 3964 3671 -3649 3619 3878 3886 -4312 4786 4623 4726 -406 2108 3841 568 -3655 3616 477 3576 -3859 1917 3866 3641 -3776 3642 4182 4206 -4373 542 641 590 -500 2197 3638 3916 -3967 4058 3639 4071 -2083 3865 3905 3853 -847 474 4140 126 -73 3851 3895 3620 -1717 3620 560 3790 -3771 3959 4120 4211 -4160 3564 4379 4224 -1113 3650 3634 3851 -3649 3964 4141 3908 -3841 3933 3832 534 -3776 4126 4207 4192 -3393 557 474 126 -2367 3695 2869 3724 -3637 532 189 1963 -3750 3715 3733 3662 -22 3727 346 2077 -4507 4535 4562 4505 -3623 4122 1109 3592 -4772 4258 3340 3122 -533 3564 4160 4161 -541 3674 3656 3772 -3664 3065 4188 3626 -3074 3665 3663 3607 -329 3726 3664 3708 -4205 3681 3400 4219 -3700 554 2267 3714 -15 2379 3497 44 -386 3549 536 3783 -3325 250 3599 4184 -2305 3633 3584 4183 -3701 3677 3719 2357 -4092 2289 367 555 -3621 2344 3715 3662 -4033 556 3759 3782 -3753 2306 3696 3726 -3708 3672 3726 15 -4284 4165 4292 3978 -2336 3738 239 3699 -3685 1111 2811 2227 -250 262 3666 4126 -3882 504 3743 3760 -3892 3795 3811 520 -4532 4417 4481 4486 -1484 3680 2188 3779 -81 3778 253 2278 -3756 23 3719 3695 -3562 3883 3689 517 -3688 3690 386 3848 -3689 3617 135 331 -3616 3692 532 3693 -3632 135 3691 3397 -3691 211 381 3420 -1996 2613 2349 3711 -437 3687 3627 3654 -497 3676 478 1942 -2682 3730 333 3713 -244 2361 2303 2682 -3679 2733 1996 3711 -2733 3667 3629 244 -3745 3716 3672 3709 -3706 2303 3036 2682 -2300 3629 2282 2303 -2077 3755 2287 3705 -2087 3704 2336 3722 -552 3702 2941 558 -3746 2372 3714 2942 -3709 3677 3665 3609 -3575 3710 3708 3701 -3709 3284 329 3761 -3699 3712 3694 3285 -4066 3711 3713 3730 -3712 558 2801 3697 -437 3757 3667 3707 -3748 3674 3739 3656 -2942 2542 3627 3701 -649 1669 1514 1485 -4091 265 4086 2340 -3672 15 3627 3687 -3976 4169 4417 562 -3761 1510 191 3745 -3597 3723 3725 3705 -3722 2842 3724 3731 -3725 3723 412 3654 -3068 3722 3724 23 -3665 3676 478 3677 -1731 3732 541 3657 -536 3743 3736 3760 -2366 605 3046 497 -3731 2842 3697 3712 -2733 3723 244 3730 -3727 3791 3750 3754 -3735 3656 3740 1405 -3750 3754 2306 3749 -498 3812 3750 3733 -454 3281 420 3728 -3807 2186 3738 2354 -3737 2362 4022 3679 -3740 2343 3715 3746 -448 3739 3733 1510 -269 2870 4067 4098 -4094 1953 4113 4086 -3682 3889 3728 3769 -544 3834 3801 3955 -3746 3701 2357 3721 -3739 3707 3748 3745 -3865 3843 3867 3858 -3749 3715 3757 3746 -2357 3734 3756 3748 -3735 3732 3734 3656 -2333 37 3912 32 -2284 1955 1124 4076 -454 191 420 3676 -3734 605 3732 497 -3756 605 23 3704 -3749 3755 3687 3757 -3756 554 3714 3748 -113 476 3956 3982 -3879 3675 2305 545 -517 3682 3728 3761 -3760 3721 454 3710 -847 1997 2289 555 -2099 1453 4044 567 -3566 1972 3404 4188 -3793 4118 3812 3791 -651 92 4537 4512 -568 595 2191 578 -3967 4178 3325 4184 -3770 3743 3888 559 -420 3769 4089 3813 -3403 4217 3647 4155 -3662 3810 2320 3773 -1405 3774 3772 2319 -2228 3622 4031 3773 -3984 3995 1112 3981 -3652 3639 3325 4190 -3878 29 2356 3945 -3821 3686 2278 3792 -578 3685 2197 500 -3781 3882 422 3889 -3848 3876 3783 3780 -3887 3675 545 4079 -3781 545 3669 3889 -3620 3869 3896 3559 -4032 2261 2072 2416 -486 2346 3787 2277 -3793 3786 2228 3812 -17 592 1980 3816 -3904 58 2083 3902 -3881 1980 601 3646 -1731 3765 3732 3954 -2416 2072 3778 326 -3985 3798 3787 3765 -4178 4298 3967 4447 -3683 233 3798 2346 -1126 542 4008 4195 -3836 553 4043 3988 -520 3938 3793 3795 -1979 2346 3890 486 -574 2383 4127 4344 -3827 3824 3996 3744 -3835 3911 4030 3998 -3178 871 4121 4543 -3811 3943 3824 3837 -3806 3989 1989 3810 -2086 3807 4082 3805 -3737 4083 3806 346 -1916 4265 1665 3593 -3584 3964 3576 4192 -541 4005 3805 3772 -3804 3683 3899 4037 -3765 3813 3787 3735 -559 3770 498 3812 -3835 81 3815 3821 -2275 3823 3814 3819 -3788 3862 601 3906 -2108 3849 3893 3981 -519 3847 281 3919 -3815 3822 3820 1111 -3840 3819 1111 3821 -3834 3814 3820 3778 -2811 425 3823 3819 -3822 233 2346 3815 -3804 3801 233 3994 -4009 4000 1697 4027 -519 281 4026 4035 -3801 3835 3911 233 -3997 4006 4028 1664 -4004 2107 3932 3996 -4006 612 4008 542 -572 4467 4459 4199 -3877 3862 3651 3875 -3936 3960 531 482 -3744 3835 3821 2198 -3827 3802 3814 3834 -3797 1225 3924 1733 -3804 3838 3994 4038 -1112 3995 3837 281 -4584 1689 1572 4111 -3955 3820 425 1484 -3862 3636 3651 3885 -500 2227 422 3882 -3905 3885 3906 3747 -3921 597 3852 3963 -1717 284 560 3870 -3902 3853 3901 3900 -2108 3995 3818 595 -3689 3872 3781 3883 -639 3817 577 3931 -3857 1917 534 3858 -3645 3649 3619 3881 -3881 3908 3947 3844 -3846 3643 284 3870 -1734 3914 3909 3944 -3868 500 3859 3884 -601 3906 3864 560 -3850 2197 2191 3919 -3747 3885 3850 2191 -3855 3861 3860 3638 -3872 3873 3859 3884 -3859 3867 2082 1917 -592 3841 3832 3816 -3991 507 3924 4016 -3856 3867 2082 3897 -3643 578 3747 3868 -3638 2274 3876 3916 -3864 3747 3861 3868 -3869 3865 3867 3855 -3870 3868 3897 3784 -1717 3853 3845 3869 -3992 604 3944 4021 -3848 3874 3876 3860 -3874 3095 49 3860 -3617 3873 3886 3872 -3832 157 29 3947 -3866 3781 3879 3872 -3913 3921 3832 3947 -3634 3777 4141 3880 -2274 3759 3880 3876 -3886 3879 3878 2305 -3851 3852 157 3790 -3842 3682 3780 3883 -3688 3884 3848 3882 -3883 3559 3860 3855 -3843 568 3841 3858 -3634 3874 3880 564 -3888 3892 3782 27 -3889 3890 3887 3769 -3783 3780 3888 3743 -3891 3892 3888 3799 -422 3915 3890 1979 -3887 3890 4037 3683 -3913 3817 3970 3933 -562 4484 3976 4167 -3645 3896 49 3095 -3620 3784 3897 3895 -560 3864 3896 3869 -1791 3940 3912 46 -3944 3943 3914 3811 -3846 638 3901 3902 -3902 3846 2260 3900 -3901 3900 3789 3846 -3904 284 3905 3906 -3789 2260 3903 17 -3643 2083 3903 3843 -3816 3903 3843 3856 -4294 4334 4335 4318 -3650 2168 521 3852 -4058 3854 3330 4145 -612 3997 4004 544 -2107 3938 3827 3802 -3914 3898 3751 3932 -167 639 3893 3877 -3854 3912 37 3899 -3916 3917 4036 3891 -3641 3915 3866 422 -3915 3918 4038 85 -3917 2197 3919 2188 -3818 3857 595 3918 -555 1707 535 474 -639 591 3877 3844 -4458 729 4457 4490 -3979 4002 4445 3941 -3836 3863 553 4015 -3984 270 3999 190 -2168 4202 4106 603 -209 4379 4496 4446 -4370 4253 4264 4140 -3939 101 113 4302 -3977 3951 729 637 -3962 3939 3849 3963 -46 3829 3912 270 -2108 519 3893 3651 -4253 535 4123 474 -4492 4175 4453 4292 -4155 3833 2366 2797 -4138 4230 1665 4052 -32 3798 3911 3985 -3929 476 3931 4374 -1798 50 3898 3941 -3940 3923 168 38 -3957 4039 4040 3999 -190 270 3899 3804 -3871 3899 3854 4023 -4035 2274 3777 3946 -534 3945 29 1917 -3877 3852 3875 521 -3053 39 4099 4067 -502 3983 3969 3979 -4448 439 711 4480 -3957 615 476 3930 -113 3956 4459 4199 -2289 3275 4081 2548 -3179 4118 3791 4020 -3995 3744 3994 3840 -3952 3957 4040 3758 -3956 3977 3942 3951 -4313 4052 4384 668 -4177 3987 3647 4212 -3833 4217 126 695 -4085 527 4472 4387 -101 3931 639 3963 -3962 3931 3844 337 -3650 3809 3633 3966 -4455 66 4071 4200 -4153 4203 3964 4207 -3794 1955 3768 3642 -4236 3286 4476 4164 -4465 641 4214 3949 -167 3893 3982 4026 -4085 3974 2017 4274 -3615 4251 251 4161 -4923 4863 4834 4786 -4449 4107 3971 4582 -4257 107 4176 4156 -3894 4056 4295 3720 -4464 3930 4297 3957 -4485 4456 3678 4452 -46 4003 3949 3923 -1479 4500 4237 1721 -3775 3817 3982 476 -3970 3981 3758 342 -641 612 3949 615 -544 3775 3925 615 -3990 3793 3938 4031 -1703 1995 4009 404 -4205 3287 3959 3401 -4246 3797 4044 4007 -4009 4000 3805 4005 -1731 3985 404 4005 -2021 3863 1138 2044 -66 4040 3871 4200 -3593 47 4128 630 -3837 3955 3824 425 -3775 3955 3838 3847 -544 3829 270 3801 -2198 3910 183 3828 -2198 183 3802 4032 -615 502 3942 3925 -3825 3989 4032 2261 -4642 1400 4579 4660 -4008 4003 566 3923 -612 4004 4002 3979 -3910 268 4003 3829 -3990 3989 3810 4031 -4007 3828 4029 3830 -1730 4006 3988 4117 -3796 3830 2099 4002 -582 3986 3825 3989 -1697 566 268 1995 -574 4176 2090 4359 -4591 4625 4565 4353 -1628 4073 503 4049 -4015 1695 4232 2101 -4016 3924 4014 2113 -1658 3863 4017 4015 -2115 4016 4018 2102 -4017 170 2044 2061 -4125 159 4980 4157 -2797 3954 497 1942 -2350 3871 4023 4024 -239 3738 2038 4088 -4021 3944 556 4033 -2046 4026 4021 4035 -4412 4433 4049 503 -3970 3826 342 4024 -2018 3825 4028 2065 -4029 1697 3828 4027 -2099 4044 4028 4006 -3802 4031 3622 4032 -3985 4030 4005 3774 -3998 4000 4030 3785 -4023 3675 4034 4037 -4035 4033 2274 4036 -3945 3826 4024 4034 -3915 4037 4038 4034 -4036 3892 3811 4033 -4036 281 3837 3917 -3942 4466 4053 502 -3956 3942 3992 604 -4068 4090 490 3237 -555 419 2038 1707 -4080 3797 2018 4044 -3763 3988 4043 4029 -34 551 1981 4132 -3603 1453 75 569 -4305 503 4115 4389 -4262 4249 4339 668 -4415 4013 4025 3318 -4553 4375 4627 4540 -562 4226 4437 4342 -4442 4413 3937 3958 -4179 1791 66 4039 -4160 4488 4061 2033 -4459 4302 4468 4460 -2548 548 3976 4318 -4073 1628 4117 1695 -3642 1955 3909 1734 -4300 382 4070 4133 -3190 446 850 679 -4063 4054 4198 4298 -4197 4139 1768 4076 -4061 3394 3615 4160 -78 4276 542 4117 -4136 4154 3599 88 -4098 3285 3712 4067 -3948 3741 3064 4066 -4332 4113 4041 4133 -4316 2383 4228 4332 -68 4059 3101 4132 -4462 3642 4206 3965 -4264 4140 4235 3286 -304 4013 4115 4057 -50 4075 4139 4076 -3274 4074 694 2333 -4062 4074 3752 3336 -4291 4194 4175 4165 -3615 251 1768 4197 -3782 4144 4142 27 -3275 4043 26 4081 -3953 4080 3603 1453 -599 4083 582 3806 -419 3807 4082 2038 -4175 529 4453 1183 -4443 4376 3961 3971 -3718 3742 4090 45 -367 2038 57 4088 -34 4022 4087 2342 -3770 27 1140 4118 -4091 4086 4041 1987 -3718 4090 3010 41 -4134 3673 68 4371 -2304 2289 4167 2548 -2068 3742 4130 4095 -461 1567 4094 265 -1686 4138 1665 576 -4333 1705 4367 4270 -2013 2345 4066 3741 -3101 3948 669 551 -1701 4269 4138 4411 -4257 4340 4617 4357 -415 4290 109 2381 -4278 4911 4945 4234 -4949 4349 1808 4700 -4943 4973 4317 4233 -3926 167 2046 521 -4389 4115 3974 4420 -4360 4376 529 1183 -629 1402 4463 182 -4263 4969 4826 4962 -3839 196 176 1513 -596 613 4894 4914 -4331 4130 3742 4068 -1505 109 4976 4347 -4047 4073 78 4107 -228 2117 3272 537 -4064 4246 4007 4057 -4119 4089 3765 3954 -520 27 4118 2307 -4122 3647 1109 4155 -488 3803 4555 4507 -3287 4120 3659 4187 -4283 3934 13 1706 -4254 1792 3435 489 -4228 228 4958 4019 -3325 3681 4223 3652 -4272 3800 4267 1505 -4281 3993 4330 4129 -4128 47 4130 4134 -4113 4129 4094 4131 -4132 4134 4130 34 -4131 4045 4133 4070 -4068 4132 3237 4059 -4092 367 4129 4131 -4703 4643 4718 4723 -4144 4065 4137 4142 -4146 4190 3599 4136 -4096 4100 3937 4260 -4074 695 508 4062 -3928 3644 4072 4168 -3878 2356 3650 3633 -4173 4079 4136 3595 -3281 3595 4173 4189 -4136 3330 4079 4145 -4182 3909 4144 556 -4191 4137 4172 1716 -4171 262 4172 3404 -3633 2350 4153 4183 -3439 1706 2806 1673 -4251 252 4161 4193 -4154 2797 4155 88 -1705 68 593 4371 -3966 4206 4148 4201 -2284 4151 1124 4065 -3771 3936 4120 4151 -3975 184 2381 62 -4316 4019 4328 4275 -4717 4784 4527 1794 -3300 4966 4849 3338 -4054 3648 4063 3661 -4236 3661 3972 4150 -5088 3083 879 4942 -1099 4664 4901 3356 -540 499 3968 3054 -4480 4222 4077 3678 -4678 4366 4247 1503 -4093 4168 4229 3894 -4167 847 4140 4484 -3720 4358 4170 4406 -4417 4169 585 608 -250 4147 3599 3402 -4147 3086 4146 3598 -4143 4142 3549 1716 -4177 2341 2814 4219 -587 4084 3935 4077 -255 576 4011 3975 -3959 4174 4216 4205 -3768 3394 3794 4223 -711 439 4053 4466 -4252 3564 4309 4238 -522 4439 1798 439 -4190 3639 4145 4183 -3671 4148 4182 556 -3768 4216 3670 1124 -3595 88 4186 1942 -4187 3065 4188 4185 -3402 88 4122 4186 -4189 4186 3764 3663 -3076 4143 1972 4188 -4191 3776 4137 4182 -4192 4190 4146 3584 -4191 3652 3809 3086 -4150 4244 3564 4220 -4077 4474 4218 4222 -3796 4373 4445 616 -4407 4632 4796 5040 -4198 4062 4478 4078 -522 4197 4479 4061 -3831 4200 4202 3952 -3965 3992 4201 4199 -4153 4200 2350 4202 -4203 4199 4201 3926 -4202 2168 3966 4467 -4547 675 4591 4564 -3666 250 4177 3987 -4207 4071 3639 4153 -4206 4336 3966 3652 -1674 4285 4319 4365 -4210 126 4217 4235 -4211 1673 4209 2183 -4210 4212 3647 670 -4213 3959 4211 3412 -4212 3384 1712 2341 -3969 4373 587 4445 -4838 3345 1792 4842 -4177 2814 3403 4184 -4209 3960 3771 1768 -4194 4486 1183 606 -4174 3666 4220 4224 -2341 4219 589 4193 -4240 3079 4871 3388 -1379 4194 4165 1784 -4178 4126 4224 4446 -3394 4223 4219 3648 -4639 4290 109 155 -4051 4406 4377 4249 -4372 4391 1482 4493 -4125 4069 1347 490 -2304 4370 4342 4167 -4324 4415 4413 3937 -3337 4395 3239 4854 -4014 1628 1733 4416 -4694 955 4105 5034 -4103 3328 596 4924 -2183 4072 4209 251 -540 533 3968 4161 -4405 594 3980 4511 -4303 4180 4543 4299 -882 5302 5265 5311 -467 3370 4836 4221 -3442 5247 5276 5301 -3234 87 3437 3413 -1036 4835 5106 5158 -252 4766 4193 3371 -4780 488 4555 4508 -4294 4117 3988 4335 -1674 4166 4290 4429 -1783 4498 4578 4520 -4342 4048 4226 4368 -4951 1099 155 4976 -1712 3972 2341 4150 -533 4180 4514 4271 -593 3934 4283 3928 -446 4720 4124 297 -4439 4474 4479 4441 -4285 1674 4623 4922 -3975 4101 62 4345 -1711 3339 3660 3116 -4280 3449 4858 4751 -4138 4411 4629 4341 -194 255 4272 4345 -247 4048 4279 4413 -4825 4287 4910 4110 -4851 3928 4072 499 -2090 3808 2000 4330 -3317 4978 4882 1960 -4282 4127 4983 4315 -4992 4943 4982 1085 -1702 3318 4415 4100 -1943 4281 4330 4097 -4252 4530 4390 4303 -4315 4261 4127 4346 -4377 4406 4361 4421 -527 609 3971 4503 -3614 4157 3084 159 -4335 4064 1126 2116 -613 464 5286 4894 -4728 4103 3323 4684 -630 4307 4339 4262 -4364 3273 4259 4569 -4270 4339 4128 4371 -1137 1347 4881 4267 -4123 4720 446 4253 -4473 4480 3678 4496 -4569 4208 4773 4256 -4797 5202 4908 4894 -4928 602 4969 4263 -3196 5320 782 5112 -4444 4417 4360 4486 -182 4247 4102 4225 -4077 4439 439 587 -4452 3678 4436 3935 -572 4336 4495 4467 -1733 1628 4246 3907 -4440 548 4444 3976 -1782 4533 4502 4387 -3977 4450 4470 4466 -4061 4448 522 3794 -3167 4379 4238 4469 -4059 1705 3614 4333 -4938 5093 659 3254 -3929 4374 115 4055 -4271 4531 3167 4238 -5126 5110 5059 5067 -4334 4047 2116 585 -4627 1515 4590 4540 -4404 2548 4279 4318 -3357 4903 1039 3116 -4514 4766 871 4180 -4727 1402 4579 4742 -4321 4735 4606 4771 -4773 4787 3635 4725 -3958 4463 629 4442 -997 4674 4691 4706 -824 4272 4267 4317 -4157 1785 4069 4333 -229 4315 4105 4694 -4307 3907 4056 4358 -4463 4640 4368 4208 -3255 4713 5101 5071 -4311 4738 4777 4778 -293 4814 4634 4693 -107 4329 4340 1693 -3593 630 4230 4416 -4767 4682 4803 4735 -5167 5262 5088 5214 -914 134 5028 5096 -1785 4157 4901 4664 -4341 1688 1457 4323 -4270 4128 4265 4331 -4332 4330 2000 4113 -4333 4331 4069 4068 -4316 4097 4332 4300 -4358 503 3907 4305 -4246 4276 567 3907 -4462 4207 4446 4293 -1102 1509 4589 3410 -4618 1492 1447 4354 -4048 4279 4281 2304 -4323 4616 4101 1476 -107 4260 4402 4329 -4229 4249 4051 4369 -62 4656 109 4347 -415 3800 1505 1785 -4261 4257 4346 4357 -4272 4347 4695 4345 -4114 4343 4622 4346 -4704 4679 4609 1377 -4356 849 880 4104 -4939 1006 804 5076 -1329 3228 5035 611 -4696 4686 1450 4357 -3057 4012 4771 4400 -1549 4338 4628 1489 -4407 4718 4745 4632 -4658 1062 4349 4949 -4345 4101 4352 1443 -4169 247 4318 4334 -415 2381 4011 4384 -616 1727 4108 4289 -4497 4273 608 1440 -1705 593 950 4363 -2974 4364 4366 4362 -4363 4280 4365 4369 -4364 4208 4366 4368 -4363 4365 4166 4367 -1943 1503 4366 4097 -4365 668 4249 4319 -4364 4370 3273 4342 -593 3928 4369 4229 -4281 4092 4152 2304 -4491 1721 1482 4227 -4195 3640 4214 529 -4302 3939 115 729 -4382 4423 4631 4050 -1727 2017 4108 4085 -4226 4273 4758 4640 -4545 4758 4437 4392 -2033 3648 4299 3927 -4576 1627 4570 4575 -4436 4473 4494 4470 -4394 4375 4553 4424 -4418 610 4414 4601 -4359 3958 2090 1943 -4649 4604 4673 4550 -4537 594 92 609 -4443 1783 3961 4296 -204 4827 4713 5071 -4397 4047 4107 4434 -533 4271 492 4488 -1721 4485 4511 4227 -4760 1316 4378 4529 -292 980 4407 661 -4738 4382 4606 4662 -4231 1114 4886 3432 -1669 1469 1676 1512 -4398 4389 4449 459 -608 585 4443 4397 -4637 1541 4625 4626 -523 4626 4353 4424 -4540 1514 4593 1485 -4630 4341 184 4629 -640 4590 4431 4510 -630 1225 4307 1733 -4517 4537 4237 622 -4169 247 4273 4226 -4785 4393 4196 4355 -4414 1464 4601 1512 -4432 1572 3318 176 -79 2027 3178 488 -4260 1689 4100 1572 -4422 4413 247 4025 -4412 4052 4262 4230 -1669 649 4383 4408 -4416 4049 4230 4269 -2101 4232 4324 4415 -3720 4170 4289 3684 -1495 4600 1481 4383 -1535 4583 4420 4461 -4435 176 4107 4419 -4642 4422 4273 1440 -4421 4659 4412 4433 -4430 4661 4375 1485 -4382 4400 4606 4430 -4776 4763 4777 4767 -5129 5109 3425 5119 -1457 1460 4592 4616 -635 1620 4580 4636 -4947 4728 4247 4678 -4423 1676 4424 4612 -4638 1572 4432 4403 -4431 4409 4433 4435 -4434 4025 4432 4422 -4389 4433 4435 459 -1535 4432 4434 4420 -4491 4292 4381 4492 -3054 4051 4438 4378 -4437 562 4476 4481 -168 4291 4181 4255 -569 4295 4441 4483 -4440 4444 168 4255 -4313 4629 4052 4659 -4398 4085 4387 4449 -4441 4295 616 4289 -4214 4195 168 3923 -4447 4336 4223 3927 -4446 3794 4462 4448 -4447 4298 3950 209 -4397 3974 4443 4573 -637 4465 4492 4297 -4453 600 4503 4500 -4292 4500 1721 3978 -3935 4084 4504 4451 -4577 4538 4570 4571 -4462 711 3965 572 -4469 1784 3978 4515 -4458 4468 4493 3922 -4494 4457 3922 4460 -3952 4055 3831 4464 -4055 729 4458 4464 -94 4582 4475 4419 -4336 4447 4071 4455 -4313 4536 4319 4109 -4459 4460 4470 3977 -4450 3969 587 4466 -4297 4465 4179 4039 -3831 4203 4293 4468 -4055 4467 4457 115 -4456 4485 4299 4499 -4297 4381 4464 4471 -4473 711 572 4470 -1183 3961 600 606 -4471 4284 4381 4495 -4194 4255 4486 4487 -3335 4570 1541 4461 -3968 4438 4477 492 -4476 4478 4484 3286 -4479 4197 4483 4477 -4255 4198 4478 4487 -3950 209 4165 4284 -4438 492 4529 3684 -182 1402 4605 981 -4478 508 4440 4484 -4477 4483 3894 4168 -3978 4496 4469 4391 -4474 4289 4218 3684 -492 4474 4479 4488 -4390 1379 4487 4054 -4492 637 4490 4504 -4491 3922 1482 4489 -4490 4372 4494 4436 -4450 3935 4489 4436 -4494 4457 4495 4227 -4491 4493 4458 4381 -4473 4293 4496 4493 -4284 4495 3927 4485 -4522 4361 1316 4533 -69 4248 4518 4546 -4516 4544 622 4469 -4451 4521 3980 4452 -4577 4513 4546 4556 -573 4296 4532 606 -4451 1479 4274 4504 -4453 4489 4503 590 -488 2027 3658 4563 -4542 1782 69 2027 -3658 4519 4121 4561 -4245 4564 654 4781 -4813 4634 4974 293 -4587 635 4403 1535 -4237 594 4391 622 -3766 4534 92 622 -4501 4538 651 655 -4701 4252 4309 4526 -4516 4521 538 4456 -4523 4517 4515 4499 -4516 4518 4521 4405 -4498 4520 4517 4537 -4535 4544 4507 4534 -527 4518 4248 609 -4515 4517 600 4500 -4497 4525 571 543 -4542 69 4516 4544 -649 1460 4613 1495 -4522 546 1335 1381 -4541 4760 4514 4761 -1068 4158 4786 4834 -4843 4799 4554 3030 -4530 4392 4481 4532 -4760 4531 4529 4271 -4530 530 573 4303 -4529 4533 3684 4502 -4497 608 4532 4296 -651 4519 655 4512 -4519 69 4546 3658 -4463 4642 4640 4579 -3766 4386 4518 4405 -4513 92 655 4454 -4573 4572 2091 94 -4306 4401 1620 4050 -4545 4526 4701 4775 -573 4506 4523 530 -530 3803 4544 4238 -4523 4543 4519 4499 -3054 4378 4541 4774 -4498 651 4535 4501 -1335 4204 4567 4563 -4670 1383 4669 4663 -184 4630 4741 4654 -2922 4647 4385 4674 -4658 5071 1386 1062 -981 4740 4730 4732 -4050 4607 4382 523 -4846 4528 4805 185 -4245 4749 654 4121 -4576 653 4501 4562 -4626 1620 523 4636 -4591 4574 1627 4625 -1408 1638 1495 4600 -4593 624 4580 4581 -4562 653 4507 4565 -4563 3658 4561 4556 -4564 4505 4562 4547 -4508 4563 4565 4204 -4564 4012 4561 654 -1783 4572 4573 4578 -4576 4547 4572 1627 -4679 4703 1022 4721 -4280 4285 4774 4751 -4380 4454 4575 4475 -4578 609 4454 4582 -4566 1335 4539 4567 -4449 4566 4539 4582 -4558 3410 3335 4637 -4380 653 4625 4570 -4556 4567 4577 4380 -4501 4576 4578 4454 -4248 4577 4566 4571 -4734 4536 4001 4310 -4428 4560 4583 1541 -4593 4560 4626 1676 -4573 3974 4571 4461 -635 4580 1513 4419 -3839 4590 1515 1513 -1514 1515 90 4613 -4630 4592 1457 4627 -4588 3410 1509 4510 -2091 94 4587 1535 -675 4337 4591 3057 -4306 4584 4403 635 -4204 4589 4558 4012 -4586 4653 4427 4631 -1620 4401 4560 4581 -4610 4595 1464 1493 -4596 1494 4594 4598 -4595 4597 4601 198 -4598 1678 4600 4596 -4597 1151 4595 4599 -1408 4598 4614 1384 -4559 156 4418 4597 -4596 4383 4408 275 -163 1549 4618 4644 -1063 4667 4866 3528 -4385 1377 5029 4710 -4482 4726 4623 4764 -4394 4645 4424 4311 -4553 4633 4743 1102 -781 4729 893 3343 -4348 5035 1011 4707 -4611 4594 4663 4614 -4621 1464 4610 1675 -4621 4430 1448 1371 -4524 1376 4585 1358 -4615 4610 4666 4599 -4616 1460 4614 1408 -4340 4427 4617 4615 -4101 4657 4685 4616 -4602 4338 1493 4665 -2974 4684 3103 4678 -5255 4953 3440 5270 -1383 4612 4611 4661 -1034 3009 4347 4695 -4256 4605 3635 4921 -1377 4669 4679 4709 -4558 4575 4012 4399 -4557 4399 4400 4581 -4635 4050 4586 4306 -4649 4354 4710 4652 -4402 4260 4442 4638 -4402 4549 4586 4635 -1413 4661 4592 4375 -4355 4723 4735 4196 -4635 4742 4607 4660 -4509 4322 4768 4925 -4630 4633 4627 640 -4557 4428 3410 4637 -4399 4636 4574 1541 -640 4629 4659 4431 -1027 4225 981 4732 -4536 4377 4319 4759 -5073 5062 5069 4880 -4421 4001 4536 4659 -913 4645 4662 4135 -4673 4665 4602 4688 -4643 1448 4606 4723 -4831 1075 4987 5025 -4550 849 1329 4681 -3292 3346 4988 4797 -2922 4628 1549 4385 -575 588 4652 2922 -4915 4984 3251 5057 -4650 4628 1012 162 -4654 4592 1413 4657 -4655 4549 4740 4653 -62 4654 4656 4657 -4343 1032 4655 4732 -4655 4653 4689 4617 -4866 4551 4356 3528 -4642 4638 4442 4422 -640 4001 4633 1509 -4621 1675 4631 4423 -4739 4394 4643 1413 -4548 4610 4665 4666 -4678 3103 4328 4163 -4669 4663 4618 4644 -4685 4614 4663 4687 -972 5104 5032 4603 -5290 4830 5227 5267 -4624 4548 1447 4665 -913 4548 1067 4689 -79 3178 4760 4761 -5025 4988 3346 4971 -4385 1377 4644 4691 -951 4550 4314 4681 -1329 849 5020 1728 -1022 4792 4825 4692 -4693 5093 4814 5069 -4166 4619 4664 4429 -4348 1067 4568 4624 -4705 919 4686 4696 -5041 4647 4700 4674 -4717 4754 1794 4325 -4804 4729 965 1018 -4619 4278 4858 4911 -4686 4617 4689 4666 -4352 4685 4680 4687 -4686 4666 4688 1670 -4691 4687 4644 1631 -4670 4657 4685 938 -5026 5110 4954 5126 -4314 4673 4688 4705 -4676 4785 602 5040 -4322 4968 5070 4677 -4695 4233 4317 4697 -4346 4622 4694 4696 -4352 4680 4695 4697 -4696 4698 4694 1793 -4706 5049 4697 1802 -4988 5314 1075 143 -5042 4104 1807 4681 -540 4514 4765 4541 -4771 4778 4757 3057 -1067 4135 1024 4568 -4705 4707 4348 919 -4691 4704 4680 4706 -4314 5050 4705 4698 -4704 5051 4609 4898 -921 4731 4792 4791 -4624 1447 4721 4710 -4604 4709 5030 4628 -5104 5032 4736 441 -4772 1093 4978 480 -5024 4388 5012 4320 -4839 87 705 3234 -4937 3255 5076 4977 -5019 5006 5042 4737 -1068 4682 4756 4158 -1024 4730 4355 4135 -5034 4768 5052 955 -4254 4283 3439 4851 -4568 4723 5039 4709 -4959 684 4882 4978 -4135 4645 4632 4721 -4969 3030 4807 3213 -4734 4752 4759 4312 -4727 3635 4605 4776 -4310 4734 4726 4779 -4429 3251 4922 4278 -1019 4608 4683 5111 -4552 4739 4745 4718 -4708 4732 1024 1032 -4731 4639 4552 4656 -3323 4852 4924 4899 -4579 954 4725 4727 -4777 4325 4632 4311 -5101 5072 5107 4711 -4716 5043 5081 293 -4321 4739 4743 4394 -4730 4740 4738 4662 -4552 4741 4739 4654 -1402 4549 4742 4740 -4310 4741 4633 4743 -4778 4742 4607 4738 -4816 4913 5254 3327 -4730 4763 4355 4777 -5138 5141 1018 5132 -4843 4808 4801 4811 -445 4833 4803 4767 -4784 1794 4555 4793 -5267 5227 5276 4857 -3323 4852 4569 4259 -954 543 4725 4753 -4752 79 4795 4780 -4756 654 4682 4771 -4839 4851 3439 2183 -4757 4717 4754 4781 -4702 4779 4756 4782 -4759 4377 4378 1316 -4640 4725 4758 4773 -4392 4671 4530 4526 -4671 4794 871 4526 -185 4770 644 5131 -4745 4425 4764 661 -981 4763 4605 4845 -4701 431 4860 4766 -4765 4244 4859 4309 -4425 4748 4325 1068 -4719 4634 5053 2524 -4811 4829 4789 4808 -5058 4762 3235 4884 -4702 4754 4311 4353 -1644 4712 4979 3660 -4774 4759 4312 4285 -4545 4773 4775 4569 -4774 4788 4541 4861 -4726 4425 4779 1068 -4321 4745 4735 4425 -4321 4743 4779 4702 -4778 4727 4776 4757 -4781 4245 4753 4784 -4782 4780 4756 4508 -4757 954 4781 675 -5103 5107 5027 4936 -4158 4780 4795 4749 -4792 4407 292 4692 -3635 4787 3973 4527 -4312 4788 4786 4795 -4787 4862 4794 4775 -4769 652 4799 4802 -4916 5115 5141 5027 -4987 4708 3423 4902 -4676 1024 4708 4785 -4794 4865 4749 871 -4795 4793 4761 4788 -4787 4794 4784 4753 -980 4803 4799 4196 -4648 4963 4286 4945 -5004 5173 138 5174 -4808 4796 4789 4528 -5203 4816 464 5286 -5055 4747 4823 292 -4829 4869 4789 4806 -4748 4325 4806 4796 -98 1019 4683 4936 -4847 652 4857 4554 -4833 4803 4855 4802 -3235 185 5328 4724 -4747 4799 980 4769 -5069 5062 5210 5206 -4962 1002 4826 3228 -1074 4879 4769 4747 -5222 5344 4835 5106 -5034 4509 4946 5048 -5008 5006 4677 4322 -4822 3315 5298 5320 -4744 666 4800 5204 -5108 5222 5059 4819 -5138 5090 5132 5148 -5063 5278 5345 4817 -5103 5027 5126 334 -4831 1075 4828 4928 -5314 4815 4828 5317 -4928 4843 602 4801 -5085 279 2791 3216 -1011 4676 3423 4263 -4880 4110 4810 5073 -5325 5307 4388 5332 -5298 4822 4884 4821 -4920 956 4802 4769 -59 4878 5279 4668 -4821 4646 4910 4872 -489 4854 3435 660 -4748 956 4806 4834 -4833 3973 4855 4527 -4243 5335 4812 1030 -666 4240 3239 4887 -850 3300 4912 4970 -3328 4215 4849 5121 -4714 4755 1712 3240 -2788 4889 4948 2382 -4948 928 2821 4927 -4215 550 469 4848 -4823 4528 4747 4846 -5218 5241 4953 5089 -4915 661 5057 4764 -4554 5131 4847 4843 -4846 5316 4805 1074 -4870 4906 4842 5281 -1792 4911 4838 4159 -4893 5259 5192 5291 -586 4720 4755 4264 -4751 4856 4733 4861 -3437 3457 3433 665 -4832 4231 4907 3430 -4834 4806 1794 4864 -4852 3303 4875 4860 -1442 4750 607 4805 -2974 4259 297 4684 -4860 4865 4766 4874 -4861 4856 4859 4765 -4852 4860 4862 4775 -4863 4861 4865 4788 -3973 4899 4864 4862 -4863 4865 1364 4855 -4862 4793 4859 4864 -4603 4919 4891 4658 -5142 3210 4990 5181 -4961 5088 4942 5212 -4905 4802 1364 4964 -4848 5287 2687 3433 -642 3489 4907 4221 -5061 4831 4909 4956 -5300 5089 4900 5296 -4875 4877 4859 2687 -4856 4876 4874 3345 -4875 4924 4877 3328 -4876 1364 4874 5139 -4894 4908 4830 5290 -143 4892 4811 4918 -4826 4935 4641 5064 -4889 4282 4958 4983 -4722 928 4948 4266 -5006 5077 5094 5019 -4828 5131 4770 4928 -3256 5284 5192 5246 -4395 4887 3454 5235 -4836 4950 467 4886 -5246 5218 5300 3256 -2786 4881 4959 4840 -5010 3122 480 3082 -4866 215 1271 880 -5279 59 1074 4879 -5237 4850 879 3083 -4112 4277 4286 4878 -4924 1364 4905 4899 -1505 4982 4976 4901 -3257 5018 1021 5221 -4902 4707 3423 5052 -4733 4863 4895 4923 -5205 5232 4873 5293 -4896 4981 4163 4328 -1034 4898 4791 3009 -5220 4933 5231 4308 -4961 5293 4994 172 -3447 4869 4920 4895 -642 4907 469 4848 -4906 4871 4854 3239 -4286 5178 5313 4878 -5073 4910 5053 4872 -4263 3423 4909 4831 -4684 4103 4849 4966 -4837 4960 3362 3340 -666 3370 4744 5287 -4112 4964 59 3447 -4651 4917 4845 4921 -5132 334 5115 4790 -4915 4920 956 4923 -4879 3447 4920 4984 -4866 5032 215 1386 -4918 4905 4829 4917 -4922 4923 4915 4623 -4728 4921 4256 3323 -4921 4899 4917 3973 -4234 4876 4895 4733 -5193 4929 2524 4634 -5015 4974 4993 4929 -5015 4841 2822 4999 -4884 4823 4287 4821 -4926 4934 4925 4991 -5342 5122 5011 267 -1095 5124 5110 5136 -611 3228 5008 5006 -4971 1711 4957 4903 -5084 5191 5193 4929 -468 5058 3235 4880 -4804 4783 996 441 -4715 4965 688 5024 -4301 5070 25 4941 -893 4350 5007 5014 -5258 3452 5280 4967 -659 4938 5075 5140 -4868 4162 5292 782 -2382 4105 4983 4268 -5310 5336 5124 5304 -3292 4103 4797 596 -4974 1571 4973 4813 -155 3251 4429 1099 -4840 4882 4841 4993 -4356 5019 4104 5021 -4887 5204 5224 5235 -4987 5025 4250 4975 -5140 5208 3438 5333 -5251 4844 4620 3444 -5054 4690 5185 5152 -4956 5017 5209 5061 -4872 4972 2524 4955 -3317 4992 4985 4933 -4881 4125 4959 4980 -4889 4958 685 4722 -4912 1114 3359 494 -1739 4868 4904 5208 -944 3213 4110 4810 -3339 4797 4966 5202 -4914 5146 5233 4869 -4937 5083 809 3254 -3 4963 4911 4159 -4940 5234 1114 494 -4693 5193 5194 5210 -3235 4287 4724 4110 -3084 3 4837 3340 -4972 4672 4933 5220 -4956 5025 285 4971 -2382 2012 4105 4946 -1023 4946 4926 4509 -4976 4951 1085 3009 -4114 4250 4896 4975 -3528 4715 5021 1100 -4979 4722 4266 4712 -4980 4978 4985 4772 -4958 4981 4019 4979 -4982 4985 4901 4980 -4983 4268 4896 4981 -4881 4943 4267 4982 -3292 143 4651 4918 -4957 4981 4979 1711 -1728 5020 1128 1386 -4791 4646 921 4951 -4699 4672 5313 4648 -5152 5099 5078 5185 -436 4867 683 4997 -4993 4929 4992 3317 -4991 4268 4957 285 -4926 2382 4948 4991 -1739 5239 5170 4904 -5004 5173 5003 1108 -5003 5189 5046 5092 -2764 4990 4998 5181 -1838 4997 4999 5001 -4998 5016 4927 5000 -4999 3279 2220 5001 -4998 5002 5000 2896 -5180 5197 5001 2903 -787 4996 5047 4995 -841 4798 3230 4995 -746 3280 5179 5244 -4932 4883 4814 4716 -4939 841 5054 5144 -5053 4932 5073 4814 -5087 3434 1037 5143 -952 5245 1039 4890 -5206 4930 5333 1767 -4713 5068 5151 3081 -2637 3152 5173 5189 -1006 4939 1019 5074 -1023 4926 4927 5016 -683 5084 5015 4999 -5220 3315 3436 4955 -4897 3258 5213 5130 -4949 4883 4716 5083 -4675 5030 4986 1012 -4977 5083 4949 116 -5162 5172 5086 5046 -5087 5145 1037 5158 -4937 3254 5151 4713 -4646 4672 4951 4972 -3081 4690 5054 5074 -4820 5067 4790 4783 -4327 881 5177 5156 -1329 5030 4604 5035 -5029 4710 5038 5020 -5169 5322 5303 5324 -4667 1073 4919 4711 -809 838 1056 1788 -4233 4719 4813 5049 -5029 944 4609 4351 -5092 5091 755 5142 -5069 1767 5093 3441 -944 5039 3213 5030 -1022 4721 5040 5038 -4692 4196 3030 5039 -5042 611 4681 5050 -5043 4716 4700 5041 -5042 4737 5048 1797 -5194 1029 5140 5208 -5213 5086 1169 5046 -787 5022 5045 4996 -5087 1108 5003 5091 -5049 5043 4813 205 -4698 5050 5034 5048 -5049 5051 5041 4706 -5050 5052 611 4707 -5051 5053 4898 4719 -5052 5008 4909 4768 -5143 4954 5007 5026 -5056 143 1075 4801 -5055 292 921 5057 -4651 5056 1027 4845 -699 4770 4935 5297 -4304 4817 5133 5067 -3258 766 5162 5096 -4872 4955 5062 5298 -4641 5061 4809 5297 -5124 5304 4819 5278 -4880 468 3441 5326 -134 5133 5153 5078 -3317 5191 5231 1960 -4304 5136 5059 5027 -5307 5310 5012 1095 -4641 4809 4677 5037 -5079 5194 4938 4693 -4551 4388 4320 5072 -5071 5332 4736 1386 -4641 4909 4826 5008 -5103 843 5014 5026 -5087 5091 3341 4941 -688 4350 70 4715 -4883 1010 204 1062 -5128 5065 4989 5222 -5080 3358 25 5070 -5079 293 5081 3253 -5082 4737 855 5080 -5083 5081 1120 809 -5021 4965 5019 5082 -5016 5190 5201 4934 -5086 1017 4824 3217 -3258 5022 5085 5045 -5009 5047 5023 5075 -4326 3436 4162 4868 -4873 4844 5205 3226 -5116 5115 4818 5147 -5075 5047 5036 838 -2007 4996 5036 5184 -4301 4677 5037 5094 -3254 4883 5093 204 -5159 1091 5200 5198 -5128 5060 912 4327 -5159 667 5186 2701 -1091 696 687 3243 -5145 3229 4989 5128 -5207 106 5169 5343 -5105 4320 843 4736 -877 5104 1006 98 -4783 5074 1019 4820 -5102 4667 5105 4711 -5104 3255 1006 5101 -5130 4812 4243 5118 -843 5137 4783 4736 -5124 5223 5110 4817 -5236 4426 5127 5284 -4931 5108 4690 4304 -5132 334 4729 3343 -5319 4288 5217 5311 -979 5114 5138 5116 -5113 5116 108 5141 -4790 5133 4916 5090 -930 5114 5113 5090 -334 5126 5153 5133 -5106 5296 1163 5221 -5226 5127 4426 5269 -1163 5221 5170 5161 -5165 4838 839 5281 -5321 4930 5339 5343 -5322 5250 5169 106 -4931 4944 5108 5063 -5305 5303 5278 5330 -4820 4304 4690 5117 -5270 5119 3440 5109 -5130 5096 5099 5078 -5254 5204 4426 5224 -5018 5128 5157 5106 -4762 4884 5316 4846 -4746 4916 5111 4818 -5115 5059 5117 5065 -5299 5310 5307 5340 -5288 882 5265 5342 -4931 5278 5067 5137 -1095 5136 5107 5331 -998 5113 4746 4818 -5165 5146 4877 5287 -4941 5044 3341 4952 -4746 4790 5114 996 -5036 466 4867 5184 -5144 5009 5054 5151 -688 5143 1108 5007 -5023 787 5099 5157 -613 4964 5139 3327 -760 5090 5148 134 -4818 5147 5149 1016 -3343 5148 5156 1015 -768 3257 3227 696 -5024 3434 5143 5012 -4954 5153 4989 5155 -5152 5117 5065 5154 -5155 5153 5156 3343 -841 5152 3230 5154 -5154 134 5028 5149 -5158 5213 5145 5130 -360 5157 5023 4243 -5097 3227 2679 5095 -3279 5179 5197 5163 -5195 5200 1021 5120 -5060 5171 5022 912 -5160 5167 5168 5190 -1960 2220 3279 746 -3328 5139 5121 613 -5219 721 5243 5238 -5163 5261 1739 4326 -5163 1739 5199 1029 -5031 5123 5323 5100 -5120 687 4994 5200 -5162 715 5172 5187 -5022 5171 813 5188 -4995 672 4798 5013 -4798 5176 1168 5175 -5177 5187 5174 881 -5174 1165 5187 3152 -912 5028 5175 3230 -4908 3357 5312 5237 -5160 5005 5196 7 -5181 5198 5002 5186 -5182 4867 4997 5180 -1129 5183 5181 5186 -301 5184 5182 2791 -5092 1169 5142 5183 -1037 5223 4989 4954 -5182 5097 5180 796 -5175 786 5171 5176 -5189 3152 5172 2704 -2007 5013 4996 5188 -5191 5084 5163 3279 -5066 4934 5214 5190 -5315 4885 4850 5277 -4968 4925 4934 5209 -5070 5201 5044 4968 -5211 466 5161 360 -1170 463 5179 5197 -5198 5196 5160 5002 -5180 5095 5199 5197 -3210 5200 5168 5198 -5161 5095 5170 5199 -683 5084 1029 5194 -4963 4286 5280 5258 -5204 5236 3452 4800 -4816 5129 4950 5203 -4900 5089 5251 5239 -4809 267 5212 5011 -5303 5295 5100 5266 -5044 4961 4952 5212 -5193 4955 3436 5210 -4968 5209 5212 4809 -1169 5195 1021 5213 -5208 4868 5206 5210 -5045 5211 5018 5157 -5231 4326 5191 3436 -5216 788 658 5275 -5235 5215 515 5273 -3266 5112 5289 5250 -4888 5269 3440 4844 -5166 5225 5244 3354 -4971 5312 4903 5017 -3226 4897 5120 5118 -4817 4812 5223 5078 -1030 5222 5185 5108 -4950 5129 5228 788 -5272 2804 5245 5219 -5119 5257 788 5275 -4668 5233 5282 4750 -5224 5253 3405 5256 -5230 879 5255 5262 -3311 5229 5274 5263 -5214 4903 5066 1039 -4900 5248 5268 5292 -59 5227 652 4964 -4967 3452 5235 5273 -4886 4950 5216 5234 -5203 5109 5285 5249 -3311 5259 4893 5178 -5271 3444 5264 5166 -5260 5205 687 4994 -5257 3453 5264 5241 -4844 5240 3444 3035 -5243 5260 3243 7 -5242 5166 722 3444 -5005 5219 7 5245 -5244 5225 5263 5010 -4888 3440 4885 5277 -5250 4241 5322 607 -5255 5277 5232 879 -5259 5236 5284 3344 -5247 5311 5217 5123 -5255 5205 4953 5260 -5253 3392 5256 5257 -5228 3456 5252 5254 -5129 5253 3425 4744 -5248 5251 4620 5229 -788 5252 5228 3365 -5269 5252 5226 5240 -5202 3357 4940 3116 -5237 5249 4850 5290 -5242 5251 5239 5261 -5167 7 5260 5262 -4326 5261 5229 5263 -5262 5245 5230 1039 -5275 5240 3450 5238 -5135 4239 5308 106 -5305 5309 5207 5343 -5291 4668 4750 5318 -5232 5277 5300 5302 -3425 5257 5119 5218 -5271 5127 4620 5274 -5272 5270 5275 5238 -5273 5274 5271 5225 -5234 5272 5216 2804 -5272 5285 5270 5230 -5271 5226 5215 5264 -5315 3256 4241 4750 -5268 5246 5192 5248 -5063 4819 5136 5125 -4892 5314 5317 4830 -5202 5286 3338 4940 -4848 3451 5121 5287 -3344 3327 5283 5227 -5284 5282 3425 3256 -5283 5109 5249 4885 -3452 3311 5236 5274 -4277 5280 4800 839 -5281 4870 4913 5139 -5294 5135 3252 5341 -5217 699 644 5323 -5259 3344 4668 4878 -5315 4850 5267 5319 -5293 4942 5232 882 -4904 5292 4900 5294 -5293 5288 5296 172 -5207 370 5345 5303 -3252 4873 5294 5118 -5062 5298 3196 5058 -5061 4815 5297 4828 -3441 1767 5134 5339 -5268 4888 4873 5301 -5302 4241 5300 5308 -3442 4239 5301 5268 -5207 5295 5125 5031 -5063 4944 5309 5305 -5125 5304 5266 5340 -5321 5339 468 5329 -4827 5134 5068 5331 -5265 5301 3252 370 -5304 473 5345 5266 -5134 5337 5068 4944 -3442 5112 5250 4239 -5313 5220 3315 5178 -4988 5312 5314 4908 -4699 5313 4822 5279 -3442 5192 5276 5291 -5131 5317 1442 4847 -5279 4822 5316 5318 -5267 5317 1442 5319 -5291 5320 5318 5112 -4815 3083 4288 5319 -699 5122 5306 5323 -5123 5247 370 5031 -5169 5321 5289 5324 -5323 906 5031 5329 -5326 3441 204 4827 -1002 5064 5325 5327 -5326 5328 5332 1128 -468 4807 5329 5327 -5306 5324 5330 5328 -5340 5329 5125 5331 -5307 5330 5137 5332 -4827 5331 5072 5327 -5011 5334 4952 5338 -3438 5333 5341 5335 -5334 5336 473 4835 -5335 1030 5337 4944 -5338 5336 3434 5310 -1767 5333 659 5337 -5306 5122 5299 5340 -5339 5305 5134 5330 -5288 5342 473 5334 -5135 4930 5343 5341 -5266 5342 5100 5122 -5345 3252 473 4812 -5309 5295 5344 4819 +995 939 990 997 +986 0 987 999 +894 2550 2566 2551 +1735 197 1635 1761 +1268 942 941 1277 +4884 1340 1258 1359 +745 734 763 752 +183 1459 1561 215 +385 1254 1053 936 +111 765 682 749 +1787 1555 1636 1702 +3482 3412 3424 517 +4388 4216 3975 178 +1941 2744 350 290 +2065 1659 2146 1611 +2907 408 2910 2831 +3013 5140 5308 4835 +26 58 780 1002 +180 772 1138 1007 +3520 3136 3466 3201 +4220 2317 4178 3645 +671 3074 461 3185 +704 1314 1307 1066 +2813 2970 919 2783 +3202 2557 3474 3463 +3158 201 1170 810 +4919 464 4921 1142 +1919 2345 4098 3745 +123 15 948 970 +1382 1601 1547 1026 +4219 4304 4305 47 +3414 3407 434 3433 +4152 1693 1445 4354 +972 1107 701 260 +936 910 997 72 +54 259 241 1525 +3727 3651 4151 3875 +4145 1794 4281 4444 +193 133 227 1542 +1153 850 1164 766 +3597 231 3530 724 +2083 366 1954 2107 +1154 829 956 168 +794 4185 420 3374 +3878 3777 3776 2213 +221 549 1442 1688 +3022 2922 3021 2508 +3098 3213 3217 2606 +3262 4951 3106 3087 +2036 2008 28 2016 +167 69 4970 1807 +1381 1565 1346 772 +4661 4935 3092 3353 +4191 3040 4173 3783 +177 2267 2227 181 +1961 1077 262 1779 +33 1705 1704 1694 +1551 1602 1610 1608 +738 963 1200 805 +861 333 961 588 +15 140 628 1011 +1108 2398 2700 2571 +613 2713 1930 2499 +1874 1128 1367 1366 +136 3044 3525 3495 +339 914 3224 5170 +1951 2251 1980 2043 +1770 1442 1787 221 +628 1163 949 988 +827 97 777 399 +1097 1812 1157 1177 +4822 48 1813 978 +4166 3579 3036 3656 +3384 3402 694 687 +994 862 975 32 +2599 395 342 967 +777 1242 860 399 +1021 4272 987 859 +1063 1446 1332 1846 +5092 5098 5193 3158 +1284 1294 1288 766 +881 852 105 2614 +1395 2150 1955 2137 +3371 3277 4872 4282 +5004 3347 603 3255 +2060 2233 2185 2207 +2999 4211 1463 3247 +444 2947 393 570 +3428 3497 3512 3392 +2957 2996 3026 1998 +1284 1216 352 708 +1601 1599 1600 1026 +4969 346 540 3339 +5121 5268 5076 915 +119 190 411 770 +3291 1132 4112 555 +787 142 985 888 +3467 2804 2557 3475 +972 110 2604 732 +67 818 767 702 +3839 3645 3652 3749 +1246 763 860 734 +666 743 793 853 +1016 5115 5067 4936 +1483 1625 1496 1452 +638 4183 4143 554 +3218 5137 5295 4789 +2888 2625 79 804 +3550 3148 3373 3428 +176 682 147 745 +3434 1010 4865 383 +2164 2319 2203 3601 +175 2677 96 1133 +783 765 7 749 +2460 2775 2749 2734 +3662 522 3652 3397 +1266 1260 1282 1201 +400 2890 2615 2521 +208 1389 978 1099 +277 322 1883 1922 +1773 1137 1078 1797 +1060 1111 92 1162 +2182 1921 1924 2175 +1610 1608 1532 1399 +645 610 646 3845 +151 26 462 752 +888 2599 2386 868 +2279 242 225 2163 +450 3413 3406 2135 +1049 1007 219 149 +424 3077 4177 4065 +818 784 822 699 +4833 5091 4237 5045 +941 1301 1268 1271 +1637 1923 2170 2028 +207 1419 36 1415 +504 3000 3709 2203 +1515 212 1587 1628 +582 62 3202 3474 +5000 4944 4934 5003 +863 784 818 769 +1770 1787 568 274 +1163 151 1189 58 +193 222 207 1557 +1545 819 94 877 +2563 4984 2687 262 +242 2130 2029 1657 +1225 1489 275 1736 +358 3301 3033 455 +735 107 380 745 +938 1887 415 3199 +185 4669 199 127 +1115 1130 1624 2705 +1305 140 754 123 +2340 1125 534 3802 +2856 2613 2555 785 +1355 194 1358 1550 +2129 1950 2415 2086 +2372 2388 3038 3725 +4341 4319 657 1511 +696 4246 4785 4776 +1570 207 222 1379 +1476 1694 1647 1525 +1465 1736 569 4523 +4184 4604 4581 4553 +369 2775 1338 2734 +1920 1862 1808 1760 +1336 1234 1397 1552 +421 1735 1648 1761 +1800 1229 48 264 +1213 1385 1149 40 +1304 1297 354 802 +4398 1718 4470 4374 +4553 4376 4552 4430 +3963 4232 4333 1126 +4666 4362 4435 1505 +3817 4089 4087 584 +110 701 1186 1231 +760 863 107 934 +2064 52 1699 2287 +4251 10 4248 4407 +1599 227 984 1524 +1149 254 16 907 +1644 2287 2289 52 +2009 1660 2069 1091 +1496 1466 5 1452 +3641 515 3530 2866 +149 1034 5033 1176 +1955 297 1991 255 +2477 2534 2511 2940 +276 1337 616 1471 +4277 1272 1722 4083 +92 1025 2771 218 +1875 1396 1090 1061 +2051 1969 1996 883 +1425 141 36 1542 +1751 259 154 1539 +2926 2997 2913 2364 +1324 1772 498 1674 +1686 1 1441 1324 +4338 665 1506 1722 +149 823 1060 219 +3671 516 3394 495 +2883 3088 905 23 +3720 2306 3799 2269 +2198 2190 1951 2052 +1384 1147 1680 1632 +710 3264 3222 2919 +1065 1255 1345 1329 +141 159 133 625 +1807 1643 116 1146 +1399 1499 1496 1501 +498 1611 1324 1680 +2422 2448 2387 1921 +1439 1528 477 135 +2687 2504 1928 262 +889 1048 219 932 +1479 690 1484 5 +1216 1239 2591 280 +2635 2675 2390 2335 +305 770 1220 190 +214 127 907 199 +3353 4844 4892 4070 +43 65 627 1406 +1600 159 141 1352 +278 389 2236 2439 +2058 1843 1591 4017 +2043 125 2044 2052 +1851 587 4032 2097 +179 1425 36 1313 +1854 1775 1772 1757 +2026 2005 1150 1724 +3823 3855 3746 3738 +38 289 3671 3695 +4565 4612 4585 1593 +2772 2910 408 2544 +3728 3774 3748 2331 +3685 3750 3823 3778 +1384 1654 1653 616 +3014 2485 3033 3008 +1929 2149 1912 1859 +1918 2447 1949 1638 +2971 1821 2976 286 +2126 2123 2121 33 +2282 2309 125 144 +2121 2123 1917 2053 +4146 4681 4709 4928 +2637 1592 2996 2242 +744 3932 1012 5026 +2147 2164 2322 586 +1449 631 1763 4664 +3801 3285 301 4209 +3101 2904 3572 3602 +1522 1383 1462 1516 +4411 4440 3903 3796 +2077 2230 3799 1353 +772 180 1875 1061 +1209 186 2137 1666 +1950 2315 2430 2192 +3249 3120 3176 3314 +3540 3543 3521 3178 +1704 1750 33 194 +1153 1179 1190 31 +2297 501 2294 2304 +53 143 2012 213 +718 2585 2590 841 +1827 1807 167 1819 +4873 5257 4815 5282 +2160 2100 2131 1866 +4417 3311 4081 3826 +2173 2069 1091 1960 +2019 1719 1711 1669 +3403 3372 550 3518 +1609 616 1495 1526 +1553 1134 1782 1526 +1560 1352 1566 1557 +1669 4327 1734 139 +959 1802 1744 145 +1494 1477 188 1518 +117 1948 1940 1912 +2480 223 2392 2402 +336 2385 2829 2884 +871 216 790 1545 +2624 3318 2815 3152 +875 854 898 4950 +3185 611 4047 3814 +4425 4310 1790 4620 +2315 2189 2262 2261 +240 2841 1997 2365 +4967 3363 4804 4324 +2730 3308 3176 567 +231 3597 3393 3605 +2712 2711 2474 11 +1876 1394 1274 608 +2667 3494 379 3435 +2996 2957 2473 2438 +2425 2313 2809 2041 +1792 1793 1556 1340 +3266 3263 717 2993 +186 1989 2400 1521 +3081 1896 3156 2972 +2115 421 2054 1681 +509 2278 3709 429 +249 4192 4164 4360 +1353 2077 2064 2097 +1382 1204 1207 1547 +2424 1104 3032 2809 +2701 2510 2603 218 +2450 2422 2214 2233 +2773 2703 1194 1193 +2039 1937 1895 1612 +1431 1949 350 2428 +3333 3374 4212 3293 +2236 1619 2444 312 +2442 2120 311 363 +1638 1943 403 2178 +1883 322 1925 1840 +2824 417 2380 1871 +2711 855 2475 2286 +1367 1882 1350 355 +2366 402 2511 2325 +2256 2188 2282 982 +2109 1755 2098 1666 +3279 1139 3309 2838 +314 117 1863 1852 +2115 1662 421 1752 +4495 4251 4248 4178 +4037 533 3854 3986 +1980 2060 2185 1951 +2690 396 1834 1868 +3674 584 3949 3809 +3121 2568 2352 3138 +3909 3851 521 3889 +2216 2418 1873 2240 +425 1139 3251 2840 +360 993 57 2825 +3180 3250 3160 2810 +3575 3559 3573 3506 +444 2611 279 2513 +2903 2954 2385 2948 +3996 600 4072 423 +3226 63 3222 1169 +392 3232 2595 464 +878 2555 395 805 +808 852 2792 73 +787 2548 2591 352 +2351 3031 1759 2870 +2586 2923 2958 2589 +3147 688 90 3297 +2184 402 2366 2281 +2588 2559 838 894 +3783 3851 3785 528 +2759 309 11 2423 +2241 2445 2447 2178 +1280 88 343 786 +3005 3123 2920 2959 +1295 986 169 1281 +1885 1274 1394 317 +2859 427 357 2572 +356 730 2791 2790 +2806 2380 146 2706 +2220 2588 2545 2580 +333 861 862 1198 +891 828 2834 2826 +962 574 1021 950 +1918 2389 312 2428 +2490 2924 2870 1759 +1919 4099 4100 2313 +1699 2188 2038 39 +4017 2928 3290 2058 +2322 3712 1644 586 +163 1952 1223 2737 +2595 1142 2558 2822 +2942 3164 3127 3048 +4160 2991 424 1473 +5282 4956 4922 4873 +2909 2922 2508 2480 +3345 679 3350 3297 +3134 2939 3177 2441 +3159 2968 3139 3103 +3952 3941 3987 3944 +292 3430 3404 3485 +147 764 399 750 +3896 602 3901 560 +656 927 880 991 +2846 747 108 4678 +2654 2591 2548 1232 +1179 1153 6 1117 +2640 2877 825 2902 +3217 2606 809 4964 +2965 2479 3034 2808 +2481 2480 2393 223 +2475 2519 2708 2468 +1208 2585 718 2584 +1997 3260 340 414 +2666 2611 2952 85 +2513 2875 410 2905 +341 2855 73 964 +851 2741 2714 327 +2470 2672 2655 2399 +2552 2607 2827 2700 +380 67 735 74 +2831 115 2884 2515 +2325 3684 3046 2707 +2407 318 347 2333 +2394 2286 2334 313 +2674 2720 2671 2579 +2181 2279 2299 2099 +3488 3425 2799 660 +504 3709 3787 2228 +410 233 13 2515 +2002 2290 2329 2182 +2397 408 2520 394 +92 639 1060 1034 +2338 2337 4138 3792 +3400 3656 489 3653 +3255 392 417 4854 +1003 148 2912 3110 +452 1127 1126 2049 +4994 2379 315 414 +3661 4123 3400 3656 +561 4004 558 3830 +1777 1129 41 3056 +299 323 2143 166 +4402 4408 620 4262 +492 4000 338 482 +128 1783 514 372 +3676 3629 3615 332 +3715 3713 3667 3078 +2861 730 356 881 +3011 2589 2907 2916 +1123 3705 3771 300 +2843 3146 3123 2959 +3290 3319 1713 2928 +4475 4468 4389 3981 +3285 4281 4462 4260 +470 3492 3035 29 +1880 1250 1870 1900 +569 1225 1435 779 +3141 3144 3059 2942 +3345 4931 603 1058 +4032 3834 1967 4045 +3378 3677 3694 3631 +5273 5287 5278 5210 +3090 3177 476 2998 +533 4035 2066 3895 +85 336 2933 2513 +3072 515 3527 3639 +4051 4417 665 3291 +2966 2280 3717 3736 +2223 2305 3754 2321 +3984 3798 2090 3970 +517 3412 3407 126 +3019 2102 3483 611 +774 1915 416 2058 +1668 2054 1666 1654 +4299 3939 4352 4346 +2528 146 2706 3009 +2289 1953 2303 2080 +3573 3479 3482 3625 +4814 5134 5131 901 +3531 3520 912 3164 +4833 4710 4314 5041 +4150 540 19 635 +754 123 1000 842 +3104 1731 3438 3484 +673 4968 24 340 +1306 1158 1298 803 +1414 2708 2464 1909 +4774 4796 4680 4769 +3745 1104 567 2424 +3292 1919 4098 2349 +3433 2852 3450 434 +1116 4965 4264 2963 +811 3204 3125 2947 +2852 3437 3450 3435 +3229 5167 5129 5081 +752 934 842 751 +442 3128 2981 2926 +1438 1674 212 1625 +3607 3162 3576 3560 +703 3083 687 5245 +2303 1956 2072 1206 +2949 2947 2937 2616 +4137 3922 2336 423 +1409 952 1398 576 +4883 1005 5030 4726 +610 1737 538 3934 +4563 4422 4507 642 +3838 3991 2091 3822 +3900 3910 3843 3865 +3623 413 3619 3399 +4038 4084 2991 1473 +554 4149 496 617 +2040 3962 600 423 +2967 3731 3660 1509 +599 593 3780 3904 +200 3599 3616 3393 +4000 491 3636 4060 +1463 4215 4176 4206 +210 196 1620 1631 +3376 3607 3377 3559 +887 3081 2353 2307 +2357 505 2085 261 +1954 1749 2067 2083 +4225 4169 3956 4182 +3953 134 407 3710 +1749 501 2358 2067 +2426 2427 2187 1706 +2292 2373 2288 1956 +2936 3055 3150 3380 +2055 300 2228 3778 +2324 2321 2278 2305 +4412 4487 4115 3936 +2071 2260 2026 2232 +2185 1951 2190 2250 +3077 424 4131 4111 +3609 445 3691 184 +200 2866 3071 3634 +9 450 3418 3627 +564 3064 2011 1129 +3639 3650 3072 3631 +3839 4193 4195 3648 +3879 3872 330 3882 +113 2980 3596 4066 +3899 3637 3875 3650 +3707 560 3845 3897 +2992 3327 3348 3269 +3845 3857 562 3819 +2342 3681 3682 2086 +349 3886 3527 3917 +3356 658 4183 4143 +3724 3717 3730 3714 +3742 3710 3795 2179 +3840 3954 4468 4450 +3758 325 443 3859 +3947 1972 4036 152 +3864 3670 3921 3733 +4267 3744 4079 4090 +3528 3706 4025 3552 +485 3570 592 3934 +3570 3930 3370 3918 +461 90 671 3336 +1537 2733 609 1519 +4532 4503 4772 4445 +4794 5241 4882 5302 +639 5014 1034 761 +799 712 822 793 +2284 2048 2337 552 +2017 1646 572 2107 +2715 2503 1182 1906 +1665 4607 4575 43 +2352 270 3044 3107 +1470 1798 1817 1811 +546 3788 3772 3723 +1923 2187 1973 2035 +491 4000 103 1791 +1645 4038 93 3825 +3643 2266 3923 3751 +714 3521 1131 3524 +1851 559 419 3779 +561 558 3953 3710 +646 524 381 3898 +559 4019 419 3828 +526 3858 3054 3608 +3481 3390 3464 3547 +2973 518 2332 3132 +4045 4059 4028 4032 +4661 3242 3254 4663 +2104 4077 288 468 +1734 1764 1617 139 +1466 161 436 4580 +2217 2905 2634 85 +1993 1673 1968 1966 +1713 547 1742 1963 +4422 4050 4538 4542 +5116 5073 5067 362 +4303 4363 4296 4477 +1315 483 1540 1379 +1851 4032 3969 3712 +742 842 751 1253 +4130 4506 4306 4487 +4025 724 669 3697 +2664 636 2845 4243 +3044 136 3115 3389 +3949 3817 3334 3724 +174 4084 1990 328 +2276 4022 3311 4081 +2021 247 2267 368 +595 226 4004 2096 +1168 1111 1167 57 +973 1098 1191 879 +2440 1989 2069 2176 +4263 4104 2276 4008 +593 538 594 597 +610 592 602 494 +602 592 3926 3902 +4031 3834 587 1469 +1469 3831 4006 3972 +3934 592 599 3906 +3987 3841 1708 3998 +597 494 3780 3905 +338 3972 4289 492 +1434 4566 1095 4578 +593 594 646 381 +3346 438 82 3304 +4289 2350 4467 4280 +4378 4279 4016 4502 +3451 3360 2476 3214 +1141 1769 1349 1373 +622 1315 1327 291 +1624 541 1194 2660 +122 485 593 3780 +283 3057 3069 451 +4625 1464 4644 4571 +60 2689 2472 2575 +3635 4135 3955 3846 +4104 4301 4023 4411 +271 236 1613 188 +3759 4067 4486 491 +1311 1258 1333 1359 +1493 1211 1467 1516 +3928 1640 1677 422 +4885 5040 4727 4714 +952 608 800 1349 +4460 4527 4504 651 +1527 4622 911 4509 +1540 1536 1415 207 +4595 1493 1527 1462 +4234 4608 4288 221 +66 780 58 748 +3326 4262 1718 3928 +4513 4554 4526 4388 +248 4310 1410 4431 +1099 1130 5018 1145 +4184 4581 4162 1272 +3620 3552 3554 3612 +3744 3341 3814 461 +713 4241 581 3431 +4293 4560 4331 4558 +103 3397 3662 1791 +2592 5104 411 544 +4317 4133 4416 3963 +4528 4520 4519 4490 +2943 4517 486 4470 +4393 4500 4167 4184 +4518 4522 4517 3974 +3751 122 3871 3054 +3871 122 602 560 +1014 947 3995 1743 +4470 4456 4472 1718 +3870 3820 3853 3850 +651 4524 4525 4504 +4533 4522 650 623 +4716 4499 4052 4542 +4511 4541 4591 4347 +4515 4527 4460 4547 +977 1007 1031 1049 +923 5158 5190 382 +4219 4343 4667 157 +4175 4190 4174 529 +4689 4798 3168 977 +406 671 688 2782 +4159 4715 4642 4641 +4961 3451 700 3357 +4954 4244 4810 4963 +4894 4266 5311 5240 +198 446 4416 1701 +699 100 822 1287 +4557 4549 4293 4533 +949 1000 998 940 +4188 580 4186 3658 +1731 3234 3241 2800 +19 540 660 3220 +4179 5310 5307 5002 +464 5173 955 3232 +747 4884 744 1340 +5215 3421 3357 3355 +773 2701 2739 1025 +899 810 789 944 +1311 977 1031 1013 +3275 375 3354 3187 +4093 4394 4538 4422 +5109 5225 3245 5345 +764 769 7 107 +4886 4723 4956 4609 +912 3523 3060 3139 +3241 3467 703 3438 +4929 4265 3119 5130 +71 3460 479 3451 +2799 660 346 2878 +1370 1441 1442 1738 +215 1500 1330 1452 +1676 1472 4565 4573 +1396 1155 1053 939 +816 1251 1013 1006 +71 3487 3477 2557 +2804 3241 3476 2800 +4736 4722 4802 158 +5343 3329 915 5179 +2903 2385 2907 2831 +784 666 129 767 +729 662 3460 3233 +31 1188 175 1190 +97 769 798 764 +685 479 3183 876 +846 1306 20 840 +994 983 940 969 +940 983 791 746 +1445 4772 4052 4503 +1202 856 937 88 +5324 5309 5308 4948 +205 2828 938 2659 +4902 4901 4240 3442 +869 768 545 786 +636 2664 3277 4207 +2945 3534 557 3519 +3445 3082 3555 3536 +5025 4917 4828 4655 +1003 296 3264 2990 +391 263 844 2584 +4323 5196 5227 5205 +5202 5229 5314 5059 +722 3431 3406 4217 +3413 4242 721 3938 +729 3234 5230 3187 +580 4121 4123 38 +853 787 985 793 +2612 1185 2610 2632 +744 4865 747 4703 +3484 3513 3488 1731 +723 5071 3183 700 +2792 357 427 852 +866 869 806 781 +931 872 96 1144 +1185 2648 2610 2665 +4 803 99 1305 +399 760 147 763 +1293 846 840 933 +4708 5041 4885 4229 +937 965 56 864 +2570 2629 921 2523 +1597 1313 1471 1491 +1226 1041 1195 1045 +806 578 781 1247 +793 799 2386 100 +246 727 674 4668 +107 759 147 4 +966 706 960 806 +727 383 674 1405 +1021 950 628 988 +765 759 7 111 +782 380 759 1265 +475 760 578 763 +123 934 475 4 +1333 1110 843 1381 +1261 151 1296 462 +1359 1173 977 3168 +1085 850 1070 1190 +2696 2679 2636 2610 +1992 1936 1942 1730 +749 750 745 1240 +778 176 735 751 +4204 879 973 544 +768 781 827 1283 +751 735 99 4 +702 682 782 380 +111 782 7 749 +37 847 78 1217 +1241 97 699 798 +822 712 762 1249 +798 702 138 682 +218 1197 831 92 +1048 834 989 926 +254 49 16 1074 +931 676 872 1109 +452 3993 2130 2057 +2623 921 2620 2527 +4044 5050 4798 5031 +74 1205 1241 67 +781 863 827 760 +436 1741 1259 4551 +998 15 628 859 +762 731 778 742 +783 764 765 750 +798 782 111 945 +138 799 129 699 +1199 871 790 153 +352 865 787 712 +725 343 94 786 +5002 1481 5155 5244 +677 809 828 2793 +1200 785 280 805 +856 706 937 806 +3252 839 870 2848 +725 545 743 100 +3064 2339 41 3066 +969 998 859 971 +2832 2006 2836 826 +4360 4115 4446 4192 +767 702 769 783 +867 545 784 743 +1377 1343 1327 622 +2731 2656 2668 1890 +1271 1245 169 1044 +1087 1240 465 734 +105 2647 2584 2600 +341 790 56 877 +791 746 731 742 +921 2596 2620 2545 +927 870 880 342 +387 789 810 5189 +677 23 809 908 +472 3145 3110 2953 +2957 3024 2979 2502 +844 819 1208 1036 +2992 3085 2936 3109 +2578 2549 2564 2546 +693 1031 1068 989 +887 2984 2514 1224 +129 827 138 97 +813 2678 821 142 +1974 1185 2483 2621 +1208 819 832 2573 +768 129 545 666 +1166 199 845 999 +2682 2651 2602 1152 +2865 386 2937 2882 +837 879 3337 796 +778 818 762 67 +789 2830 361 2849 +931 1133 1959 40 +1417 3444 4924 4978 +1196 1029 770 1178 +2650 885 821 2652 +5161 1020 845 5169 +771 1062 1059 1042 +910 936 1256 856 +2748 2613 2858 872 +4904 1130 826 1115 +2523 2629 348 2565 +3253 880 792 2812 +928 1279 704 736 +1974 263 2600 2483 +475 960 462 578 +1332 1322 1756 753 +2654 813 718 2673 +5039 833 5075 823 +704 1299 1158 736 +1288 766 1201 1232 +979 939 889 958 +5172 1170 1169 1947 +1267 756 1201 37 +2715 2743 396 1834 +730 2662 79 342 +2673 2548 725 100 +282 968 969 971 +2676 893 2562 316 +708 835 791 1244 +1365 1070 1361 1190 +4107 4988 5054 5135 +892 75 780 795 +1087 933 74 99 +57 958 360 979 +360 72 995 1057 +138 778 866 176 +868 738 865 888 +864 937 869 786 +966 867 731 863 +868 869 866 799 +954 864 867 124 +865 731 867 712 +918 792 808 2377 +1152 280 785 2682 +732 773 2605 836 +2609 2740 1788 1054 +2794 903 2813 2702 +282 990 967 927 +5245 3454 5250 703 +142 878 888 805 +877 2573 2599 341 +826 589 761 2832 +839 382 808 913 +79 2625 427 2652 +1015 5092 5216 5182 +1863 192 1935 1852 +2598 2621 2889 2600 +2636 2585 832 2648 +2887 2827 2631 2644 +500 3103 1896 817 +877 124 94 864 +214 907 1062 848 +2682 2699 2650 2856 +361 2886 899 2627 +5143 4272 1002 859 +855 1952 2765 2711 +348 0 2565 2495 +2696 2398 2718 2683 +1891 1052 1900 1849 +1715 1605 1776 1078 +1018 990 946 282 +891 905 677 2797 +1326 1356 1325 1362 +5179 904 3211 458 +2883 905 903 2794 +2919 902 2908 874 +5034 3229 901 5051 +201 2886 902 899 +5170 5192 5112 3224 +180 889 219 1162 +1170 810 2006 2836 +5214 5251 5236 5035 +32 835 949 940 +1095 4601 4155 624 +684 459 3520 2942 +920 2812 2792 880 +3226 3265 63 3232 +91 697 3449 3211 +5227 5155 4323 5019 +5194 3153 3221 2839 +5038 4313 2895 870 +1944 21 2558 2785 +913 2855 2825 993 +775 2574 807 739 +4828 4792 4856 4787 +991 1017 961 656 +4025 4189 3640 3706 +5098 1015 5038 4998 +1042 943 771 950 +382 5163 808 875 +1263 1295 1302 840 +955 1118 2835 5173 +3455 5222 1069 5035 +773 732 829 956 +214 962 999 976 +860 736 1286 1246 +974 475 752 176 +5112 5219 3221 5192 +6 835 32 1117 +791 738 708 865 +710 148 1003 2898 +848 692 1062 1046 +706 910 705 668 +1269 131 2 1297 +1312 1320 1066 2 +1039 1006 926 1011 +1171 677 2797 2780 +1265 1262 1240 783 +987 898 994 969 +4747 1100 951 647 +26 998 1000 970 +668 66 1296 910 +1011 362 926 748 +4746 947 5037 2018 +1432 483 1035 622 +5118 4686 4080 5050 +967 965 968 868 +4951 5003 929 673 +1086 40 931 1161 +3253 1032 4997 1113 +975 861 976 848 +4639 275 1663 1736 +1000 974 746 842 +57 923 980 1167 +1048 5073 932 362 +965 995 56 964 +992 963 967 395 +983 963 738 954 +974 968 746 866 +964 954 875 73 +983 854 954 966 +854 705 946 795 +971 974 948 26 +970 795 854 5143 +96 1152 31 1144 +1097 1157 589 761 +966 960 970 934 +958 996 72 997 +932 996 980 958 +655 678 755 659 +69 116 1811 1156 +848 1161 1086 861 +999 976 1017 961 +5058 4696 3092 4963 +3964 1658 1657 319 +706 705 965 968 +1419 1026 179 1134 +94 1036 725 2386 +354 1261 1296 1256 +75 1018 996 946 +1043 997 66 748 +1047 771 816 1006 +992 898 991 875 +990 923 993 382 +993 995 990 964 +992 991 333 920 +946 995 72 705 +862 994 992 963 +987 976 1021 975 +988 1046 32 975 +780 668 948 795 +823 932 5039 980 +462 948 668 960 +4632 4843 4842 4700 +5048 5143 892 15 +938 415 717 2955 +4685 4253 4853 4721 +484 4758 5210 4829 +943 693 989 4936 +16 655 1174 127 +1077 4888 4930 4984 +1541 1652 1495 1583 +2395 108 4939 5032 +943 5067 950 58 +2395 246 4711 1023 +4689 678 1427 693 +1101 1100 1084 647 +925 882 4932 5191 +5074 101 5073 5101 +980 1018 5069 923 +4784 1017 987 898 +5125 1069 4932 5038 +5075 833 4925 5168 +996 362 75 748 +4770 5125 4720 2895 +5090 4315 4813 1012 +2906 2876 2851 2615 +190 1109 1999 676 +89 984 1570 27 +1940 1730 2764 1863 +1686 1370 1440 1744 +1814 1219 831 1097 +5331 5068 4914 5119 +1074 678 655 816 +957 5189 2880 2795 +4170 4799 5113 5115 +411 544 185 1178 +1409 1461 952 1343 +985 813 2673 2587 +4229 3434 3322 4673 +5252 5274 5250 4693 +1189 1226 1045 943 +4970 5047 3242 3362 +741 1067 1278 1059 +1043 1045 834 926 +1042 1046 1044 988 +1043 802 1045 1304 +1042 1044 741 1039 +1053 1043 939 997 +1048 989 1049 5101 +771 1047 214 962 +127 1047 655 4783 +1180 1883 1975 1799 +1596 1425 1313 1543 +896 1850 1760 1845 +6 1245 692 1046 +2860 2552 2849 873 +5037 4892 5056 2018 +5188 5187 5004 4854 +1117 1198 1200 862 +4729 438 1160 3299 +1068 834 1061 1041 +119 411 1166 199 +1062 254 1059 191 +834 889 1061 939 +76 1572 1072 1580 +1321 1307 1066 1282 +206 1378 1319 1301 +20 942 1064 1277 +1041 1251 1248 1068 +1067 816 1074 1059 +1019 930 5219 3221 +857 1128 1874 756 +1483 1498 1488 1475 +1398 1446 1336 1063 +1715 1817 1773 1805 +772 1346 1031 1068 +1926 2553 1938 4975 +4643 4318 4692 4649 +1008 3254 3362 53 +1556 897 118 1741 +1561 1437 1498 1530 +1609 1606 1872 1782 +1209 1654 1351 1609 +1084 4286 1101 4647 +5241 5271 5320 5111 +4679 1082 1014 4659 +1368 1201 756 1188 +1143 1155 956 979 +803 1158 1242 860 +1268 1275 1334 1266 +1624 1194 2658 1203 +1806 191 1861 1278 +2175 268 182 1667 +4763 4071 4311 4750 +1458 1748 1502 1234 +3426 4881 5076 3235 +601 911 4415 4421 +4090 2577 2963 1116 +973 1029 68 1178 +1203 589 1099 1130 +116 1098 1156 632 +4423 4782 947 1014 +1082 1939 1014 4695 +4237 5053 4775 4954 +5117 3351 5077 4063 +3302 468 3278 304 +1576 1394 1848 1846 +4697 2845 4831 4875 +31 1152 1187 1239 +2646 2496 2609 59 +1025 1111 1168 773 +1348 1135 753 1411 +588 1109 119 1161 +5117 5042 5015 4725 +2795 1168 957 2653 +3320 3292 4092 1749 +150 1739 837 1120 +1160 3339 471 1096 +1202 385 1057 936 +5000 5203 929 5186 +4870 3277 3371 3294 +1947 1142 4919 1115 +1488 1498 1424 1151 +3415 3185 1671 3074 +429 3753 3739 2305 +3684 3672 3577 2798 +2001 152 2027 3803 +2033 2093 416 172 +2033 416 2053 2019 +1070 1881 61 1368 +518 420 3706 3554 +1098 837 632 150 +3459 557 3541 3197 +1646 2017 93 1645 +2745 110 1231 829 +1382 1869 272 984 +1675 1793 1815 1110 +1792 1812 1793 1177 +118 1813 1792 4076 +1411 1196 16 1174 +3314 3308 321 332 +2075 4082 2017 4085 +607 1342 1346 1248 +370 24 1120 1938 +1198 1179 1144 1086 +1199 1143 972 732 +1926 632 1146 5017 +2504 1145 208 1779 +1678 204 1653 1629 +2743 2728 1586 2677 +1197 168 180 1162 +2210 2071 2456 229 +1121 1437 1594 1491 +824 1107 972 871 +260 37 385 1217 +1385 1365 1361 40 +1361 1179 692 1086 +1099 1157 978 5085 +68 1156 973 5086 +1298 465 846 1087 +4396 1507 4601 1487 +1058 3151 1116 3298 +956 1162 1111 979 +1161 1149 119 907 +1296 140 1304 66 +1276 1254 1267 37 +5228 4873 4878 4723 +1167 1060 3261 823 +4997 588 1166 961 +588 1113 1109 2748 +339 849 2883 1214 +5181 23 849 908 +2660 2006 944 2773 +2790 2830 2848 2791 +1174 1348 1175 755 +1176 1138 1173 1007 +1177 1176 1173 5028 +1178 1174 1175 185 +1136 68 1175 5027 +1097 831 1176 1034 +260 385 1155 1143 +1050 1230 1948 1932 +1424 1608 1252 1499 +548 1964 2510 1460 +1852 1789 2131 1604 +2809 3289 1931 2041 +820 733 726 2594 +175 1188 2542 1903 +1188 1107 2651 1232 +1187 1186 701 1085 +140 1303 1304 1039 +756 260 857 701 +1193 1219 1203 589 +2578 2655 2466 2461 +307 1220 1191 2003 +1089 609 2767 307 +741 1278 1301 1271 +1197 1375 831 1138 +770 1213 1196 1149 +1143 1199 1057 360 +1198 1144 785 2613 +790 1202 1057 56 +1085 114 850 847 +1216 1117 1200 708 +1089 1191 1391 1098 +303 1639 1849 1309 +1289 1286 1283 777 +2324 2194 2323 480 +303 1849 1869 1429 +391 813 821 2463 +1910 255 2138 1081 +1569 2044 2196 1888 +1615 4576 1515 619 +4589 4616 1839 4613 +2510 1460 1197 168 +1947 1944 1169 2558 +2768 2724 2726 2694 +88 1217 216 1202 +766 1239 1216 1153 +1390 1917 1915 2053 +1220 1616 1191 1029 +1193 2603 1219 218 +1994 2255 1841 2265 +2297 2081 2070 2295 +1844 369 2760 2736 +2325 3046 817 2940 +1684 145 1741 436 +741 1310 1251 1039 +4660 4647 1235 4309 +1229 1800 1802 1744 +1773 167 1228 1805 +2694 1975 2693 1180 +1365 1905 175 1133 +1239 847 384 1187 +4603 1464 4540 4629 +165 1357 1485 1093 +1227 4659 4665 4605 +1308 1255 1327 1369 +2122 1832 1642 1635 +1461 1407 1432 1342 +216 1217 1232 1107 +1265 945 803 759 +1262 777 1289 767 +1087 1262 1265 74 +1285 1294 1284 1244 +1256 1243 1247 856 +1273 1254 802 1053 +1263 1253 933 99 +1253 1244 1285 742 +1300 1373 1067 1141 +1280 1287 1283 768 +1531 1906 1824 435 +1300 1067 1226 693 +1433 1181 1397 1562 +1261 1247 1246 578 +1245 1164 1281 6 +206 1319 1236 1354 +1244 986 1281 835 +1280 1288 1287 2548 +618 1426 1371 3 +1454 1457 779 1405 +1325 1334 1316 114 +754 986 1263 1253 +945 1242 1298 1241 +1305 1261 928 1246 +1282 1270 1277 1266 +1242 945 1240 750 +1267 1088 1264 114 +1164 1275 1266 850 +2 131 1329 1088 +1312 1310 941 1303 +1264 1292 1279 1276 +1195 1273 131 802 +4230 189 4370 633 +1861 1275 1271 1245 +1879 291 355 1369 +1088 1273 1874 1267 +1294 1281 1270 1164 +2 1066 1279 1264 +1041 1374 1195 1090 +1295 1277 840 1270 +1249 1284 1257 352 +1256 354 1276 1254 +1290 1264 1064 114 +1285 1249 1205 762 +1243 78 1280 88 +1283 1286 1243 1247 +1285 1205 1293 933 +1257 1289 1249 666 +1257 78 1290 847 +1287 1291 1205 1241 +1288 1292 1291 1282 +1289 1290 1293 1299 +1293 1290 1294 1270 +1286 1291 1292 736 +78 1243 1292 1276 +354 1297 928 1279 +986 754 1163 949 +169 1303 1295 941 +1299 465 1158 1262 +1307 1298 846 1291 +1251 1376 1248 1328 +1065 1310 1195 131 +1305 928 1303 1306 +1189 1302 1297 1269 +169 1163 1189 1044 +1302 151 1263 734 +704 465 1314 1302 +20 1314 1299 1064 +1331 1356 1236 1326 +1204 1745 1864 1413 +1301 1378 1226 1269 +1427 618 1372 678 +1314 1318 942 1269 +1051 227 740 1543 +1306 1307 20 1312 +576 1492 608 1876 +1368 1323 1366 1260 +4678 1457 1453 1428 +1320 1321 1364 1312 +1065 1377 1255 1374 +1321 1318 1339 942 +1325 1318 1320 1064 +843 1407 1412 1333 +1369 1316 1879 1326 +210 197 196 1439 +1260 900 1339 1321 +900 1323 1308 1430 +1236 800 1331 608 +1461 1427 1342 1300 +1334 1339 206 1268 +1380 1484 1420 690 +1327 1363 1308 1529 +76 843 1685 1857 +1372 618 1322 753 +1260 1329 1366 1088 +1568 1824 1853 1576 +165 1360 1357 1072 +1613 1622 1614 188 +2783 1952 163 2712 +1329 1325 1345 1320 +3 674 1454 295 +4664 4602 4600 4730 +1372 1238 1328 1141 +1376 1363 800 1035 +4754 4941 3239 4933 +1364 206 1356 1339 +1372 49 1141 1074 +1894 1531 1574 1889 +1793 1110 1359 1173 +1858 1432 607 622 +1806 317 1728 1769 +1081 1468 1538 1652 +1360 1423 273 222 +2103 253 302 4002 +1255 1367 1369 1366 +1615 1670 1688 154 +1345 1308 1362 900 +1336 1559 1234 1447 +1688 154 1692 1676 +3 1348 618 755 +1352 1560 1336 1398 +1154 857 1396 1155 +1356 1363 1364 900 +1362 1331 1343 1535 +1378 1345 1362 1318 +1154 1695 857 1231 +61 1316 1354 1334 +317 1806 61 1354 +1897 1316 1128 1085 +1236 1354 1274 1323 +689 1444 1028 1663 +1412 1258 1428 1455 +1311 1333 1342 1346 +1374 1377 607 1248 +1319 1373 1806 1278 +1816 1589 1411 1196 +1377 1378 1343 1300 +800 1319 1376 1373 +1376 1065 1364 1310 +576 1398 159 1579 +1383 1475 1330 1483 +1411 1855 753 49 +1134 1553 303 27 +1420 251 1380 1523 +1468 236 204 1541 +1875 1860 1154 168 +1430 1492 1415 1878 +1604 1935 1643 1827 +1391 1740 1470 1616 +1470 1643 1391 116 +1218 1577 2039 1766 +1389 2658 1388 1203 +2382 2184 2420 2326 +4371 4109 4340 1785 +291 1105 355 1858 +2143 80 2109 2114 +191 1361 1861 692 +1551 1423 1252 165 +1360 483 1072 1379 +209 1626 121 1554 +4666 4624 4523 1480 +1652 2140 1606 1583 +1562 1566 1561 1558 +1985 2050 1804 2012 +4673 4654 4545 1408 +4678 747 4551 1259 +1702 1692 4234 221 +1447 1446 1238 1322 +4551 1404 4675 4580 +1560 1035 483 1534 +4659 4679 4362 631 +1110 1375 1381 1138 +1458 1322 1447 1371 +1309 1416 1685 1572 +1619 466 2482 2437 +1386 625 1536 133 +1748 1413 1838 1552 +4989 4705 830 4116 +4122 3940 4974 3013 +133 1570 984 1877 +1383 1330 1482 4594 +1607 1563 1599 1524 +4727 4674 4253 4656 +1433 1397 1600 1352 +1594 1623 1181 1121 +227 1598 193 1051 +1427 1428 1258 2846 +1328 1426 1311 1013 +1371 1426 1448 1317 +1576 1889 1207 1848 +1386 1535 1529 1326 +2427 1995 1706 309 +1238 1446 952 1349 +1423 1595 1252 1566 +4644 4566 4625 601 +1436 1466 1501 436 +1453 1435 1502 1457 +1079 1546 1151 1491 +477 1528 1736 1465 +1441 212 1324 1587 +1028 1444 1764 1803 +1443 689 197 1439 +1443 65 689 43 +1503 1442 1441 1670 +1440 1370 1770 4309 +4530 707 4393 30 +1407 1072 1432 76 +1448 1357 1407 1412 +1559 1447 1461 1428 +1450 248 4713 4602 +4310 1449 1505 4425 +4604 4256 4715 4642 +1465 102 690 183 +1558 1459 1436 1317 +1556 1455 1259 1340 +1454 1458 1457 1371 +1676 1476 1472 1550 +1436 1259 1455 1317 +1455 1758 1093 1412 +1466 1453 5 4637 +1589 1182 1585 1213 +1035 1448 1238 1328 +251 1482 1490 626 +4149 84 497 4183 +1233 4318 4569 612 +1500 1438 1452 161 +1459 183 1435 569 +1548 1550 1615 619 +1655 1654 1384 1351 +2040 4030 595 596 +1389 1388 1567 551 +188 1563 1524 740 +4509 691 1456 1493 +490 3636 372 4060 +3967 4536 4549 4560 +1530 1522 1071 1380 +1456 1690 4405 160 +1630 1622 276 1488 +1479 1512 1486 4425 +215 1478 1480 4624 +1479 4400 1500 1400 +5141 5123 5259 788 +1420 1490 1462 4596 +1071 1627 102 1380 +1530 1490 1330 215 +1234 1558 1562 1502 +4620 4400 4598 1478 +1159 1581 1527 1512 +1121 1477 1071 1518 +1684 1772 145 1674 +1462 1482 1484 1512 +1437 740 1151 1518 +1529 1540 1386 1315 +1472 4592 619 626 +1653 1629 276 1516 +271 1613 1009 1571 +102 209 1520 183 +2100 2122 2131 1642 +1071 1520 1121 1079 +209 1181 1520 1562 +1480 4599 690 1465 +1502 1435 209 1554 +1485 1436 1501 1093 +1735 1618 1443 1752 +3311 4380 4359 4051 +1450 4687 173 4624 +4013 198 4133 4053 +4433 4589 1159 4623 +1633 2116 4409 1647 +3730 2246 4097 493 +4625 4628 4648 1839 +157 1714 2014 1734 +4598 1490 1487 1478 +4547 4549 4548 4557 +3967 4564 4572 4447 +1211 4593 135 1523 +1523 251 1494 619 +1763 4423 4735 4748 +276 1488 1491 1522 +2837 1944 2660 541 +1499 1498 1496 1561 +297 1698 2149 1910 +1518 1475 1530 251 +1383 1516 1628 1515 +1471 1421 1526 179 +33 1539 2126 160 +1524 1571 271 272 +1487 1581 624 626 +1438 212 1738 4577 +1535 1492 1430 1331 +1079 1522 1475 1484 +1347 1902 1250 1870 +1626 1631 1634 121 +2197 2165 1612 2117 +1535 1536 1540 1409 +1529 1430 1534 1363 +625 1534 1415 1557 +2819 1914 541 2785 +1655 2138 1351 2065 +1525 194 1549 1550 +625 1492 1534 576 +1613 1384 1009 1632 +1557 193 1543 36 +1542 1051 1546 1313 +1823 1639 1553 1584 +2591 2678 142 280 +1437 1566 1595 1543 +1572 303 27 1580 +1653 1668 1679 1467 +1668 2098 1662 1539 +1539 154 1467 1456 +1552 1601 55 1397 +1416 1572 1551 165 +272 1544 1382 1603 +1684 1837 1399 1501 +2063 1618 1750 8 +295 1605 1078 1454 +273 141 1542 1536 +1559 1402 1485 1453 +1558 1357 1560 1448 +273 1559 1360 1409 +1079 1520 1402 5 +1499 1252 1402 1485 +1421 1614 1597 1471 +1620 1582 1583 1631 +1769 1855 1728 49 +1546 1402 1433 273 +1604 1470 1789 1817 +1588 1651 1335 1857 +2308 1210 1577 1830 +159 1026 1419 1579 +1495 1607 1603 1526 +1552 1413 1547 1063 +2482 2529 2480 2437 +1347 1824 1885 1576 +2144 2155 2131 1852 +1335 1574 1429 1105 +1569 1390 1915 1843 +1650 1726 1589 1816 +1580 1847 1570 1379 +1547 1848 1579 1063 +1487 4623 1527 4597 +1564 1835 1584 1610 +1401 1564 1584 1009 +1582 1544 1583 1603 +1651 1460 1898 1860 +1834 1148 1934 2542 +135 1439 1590 1678 +1568 1853 1650 1864 +1651 1578 1460 1375 +1615 1587 1670 1679 +224 1908 2008 2036 +2732 2229 245 2426 +4235 1691 1689 232 +1597 1424 1595 1151 +1596 1594 1433 1546 +1595 1598 1597 1051 +1594 1596 1563 740 +1600 1599 1596 1425 +1421 1598 89 179 +1423 89 1598 222 +27 1602 1551 89 +1601 1603 55 1607 +1553 1584 1602 1571 +1567 1183 1387 1826 +897 1675 1758 1556 +2142 1080 1401 1823 +1571 1614 1602 1421 +55 1623 121 1181 +271 1652 1081 1080 +1838 55 1582 121 +12 1761 210 1681 +308 1533 2148 2105 +616 1541 1495 1337 +1623 1607 1337 1563 +1211 1590 1355 1467 +1388 1842 1814 1219 +1966 568 1809 1621 +1503 1621 1787 1555 +1414 2481 2442 311 +498 1757 2146 1564 +1618 1735 1617 2020 +1337 1634 1623 1477 +1608 1614 1622 1424 +2698 609 1089 150 +1626 1627 477 102 +1532 1625 1674 1399 +1625 1630 1628 1483 +135 1627 1629 1523 +1630 1147 1628 1494 +1627 1634 1629 1477 +1532 498 1632 1564 +204 1634 1631 1541 +1508 4410 1705 1694 +1532 1632 1630 1622 +1809 1 1686 1237 +8 2019 1669 1703 +1766 1908 132 1696 +313 2286 1942 239 +1544 1845 1204 1745 +4550 620 4541 4402 +1677 4587 4376 4420 +1497 1237 1826 1775 +1389 1387 1927 208 +181 2283 3804 368 +4059 555 1132 2025 +547 1132 4417 3826 +1984 4095 1508 160 +1753 2143 2094 166 +1818 1866 1867 1789 +1578 1588 1664 1865 +1585 1568 1589 1855 +1009 1351 1609 1401 +1548 1147 236 1494 +1468 453 236 1081 +1681 2054 1468 1538 +4646 4647 4350 4309 +3971 982 2128 144 +2127 982 2101 2256 +2161 2122 12 1761 +2387 2206 1921 182 +3841 3998 3991 3829 +1549 2152 323 1751 +4660 959 1370 1738 +1726 1650 1901 1867 +549 4577 4606 1738 +255 320 2114 453 +1682 2105 1091 1778 +2115 453 1549 1548 +4180 274 269 1636 +1443 1355 1590 1752 +1122 3294 3414 4870 +3794 3822 2055 3688 +2024 2173 571 1960 +1489 196 477 1626 +1756 1605 1836 1135 +1456 691 1691 1358 +3856 620 1641 4406 +1587 1680 1679 1147 +1590 1678 2115 1548 +210 1681 1678 204 +1611 299 1680 1655 +1781 1667 2094 2062 +2236 2389 1962 2439 +1225 1776 1489 1554 +1864 1413 1756 1332 +1635 197 1028 1774 +4440 4325 4353 3796 +4575 1355 43 1358 +4413 1593 1690 4326 +1689 1691 1694 1476 +1692 1690 1593 1676 +1691 1406 1704 1358 +30 4363 4083 4277 +1633 1690 54 160 +1881 1899 1905 1365 +1711 1637 2045 2042 +2213 2270 2360 3703 +1521 1989 2167 2159 +366 2030 1768 177 +1725 5135 4971 4962 +4015 1722 4255 665 +8 1704 1703 1406 +1707 1636 1702 4024 +259 54 1702 1692 +54 2034 1707 1633 +1431 1720 506 1933 +2033 1703 1705 4356 +3990 598 3647 4033 +2207 2190 2197 2165 +3247 4064 4140 2339 +269 2008 1696 1986 +4226 1794 3084 3759 +431 2075 2814 572 +1961 1511 4319 1820 +1854 1746 897 1073 +4435 4673 4690 4545 +2698 2801 2505 2524 +629 648 170 4347 +269 2049 2008 4312 +1706 2031 1973 2769 +3334 4140 3949 2339 +1701 189 4230 198 +2341 2434 2291 2348 +2081 229 2215 2210 +5009 1700 5020 4867 +1578 1664 1964 1842 +3280 3369 2802 3078 +1875 1350 1860 1565 +2797 1796 2704 2729 +758 1027 1943 1969 +670 463 3196 728 +4305 4069 4222 4304 +4872 4282 4145 4285 +568 1986 1511 274 +1621 1503 1 166 +145 1438 959 161 +3751 3570 485 3958 +1528 689 1663 1665 +2006 2660 1947 1115 +1925 1840 1388 1842 +1078 1225 1797 779 +3963 2814 4416 572 +4153 4399 647 4351 +1028 275 1228 1774 +1639 1795 1309 1835 +1818 1836 1715 1817 +2190 2163 2136 2273 +1837 1758 1416 1093 +505 4086 1114 502 +2061 1555 1751 259 +1662 1750 1752 194 +1751 1503 323 1670 +2150 1648 1960 2161 +2043 2044 2312 2413 +2153 2165 320 1991 +1675 1685 1758 843 +2100 228 1856 1620 +1748 1605 1756 1458 +1987 2986 344 364 +1893 1052 164 1780 +1 1611 1659 166 +1924 1921 2235 2204 +1517 4713 4308 248 +1820 1809 568 1440 +4068 3939 4153 4346 +1390 1637 1778 2045 +2200 2319 2201 2269 +2272 2188 2202 1699 +1858 1565 1350 607 +139 1444 65 4335 +4321 2095 4333 2814 +228 1774 1489 196 +1073 1813 118 1229 +1772 1775 1744 1686 +1774 228 1805 1642 +1854 897 1837 1684 +4158 3640 4185 420 +2039 1766 2175 1667 +3362 53 1807 1146 +1845 1760 1866 2160 +2132 2105 2151 1682 +1823 272 1850 1080 +424 3655 4157 4160 +3131 4304 2368 1970 +4946 4493 4068 1393 +4885 4690 4229 4706 +65 1618 139 8 +2762 873 2739 1892 +1649 1183 1840 1567 +4432 4433 284 4615 +4072 4062 638 554 +295 1137 1136 4668 +1136 1135 295 1348 +1712 35 3655 4485 +1818 1745 1866 1856 +1729 2837 2760 1844 +4698 118 1802 1741 +1815 551 1814 1812 +1862 1050 1833 1907 +167 4590 1228 1803 +4687 3434 4673 4675 +1228 4701 1797 275 +4350 1800 1820 1440 +1403 1968 2032 2013 +1826 1229 1073 1775 +1090 1367 1350 1374 +208 48 264 1779 +1859 164 1833 1850 +1832 1617 1764 1635 +2704 2646 2609 2729 +1812 1813 551 978 +1811 1798 1136 68 +1811 1137 1773 69 +1798 1616 1816 1029 +1816 1836 1798 1135 +1814 1578 1815 1375 +551 1746 1567 1073 +1649 1865 1795 1746 +1961 1831 1820 264 +1764 1714 1819 1803 +2335 2993 240 2841 +4010 2076 2030 3827 +1782 1845 1544 1606 +1250 1898 1574 1335 +2168 2149 2167 1912 +1642 1827 1604 1805 +1831 1387 1826 264 +3175 3206 3212 3125 +2334 1940 2435 1948 +2262 1843 1569 2261 +1832 2050 1827 1819 +1237 1993 1831 1809 +1808 1799 1932 1868 +851 1586 327 1902 +1745 1856 1838 1582 +1746 1865 1675 1815 +1838 1776 1748 1554 +1837 1416 1835 1610 +4155 1212 1510 4415 +1789 314 1867 1740 +1221 2215 2082 2224 +1726 1740 2688 1616 +1908 1577 1830 224 +2702 1223 1796 2731 +1823 1052 1639 1780 +1858 1105 1857 76 +1877 1848 1876 1579 +1847 1429 1105 1580 +1204 896 1207 1853 +1808 1052 1891 1782 +226 577 558 2021 +1575 322 1183 883 +1900 1588 1335 1849 +1856 1715 1776 228 +1857 1651 1565 1381 +1835 1795 1854 1757 +1855 1846 1568 1332 +1394 1846 1769 1349 +1872 1920 238 1808 +1385 1728 1899 1585 +1396 1874 1090 1273 +1883 1799 164 1893 +883 2686 1027 322 +1588 1309 1865 1685 +1864 1818 1650 1836 +1795 1780 1649 266 +1664 1649 1893 1840 +1907 327 1833 1870 +1134 1207 1891 1889 +1531 1868 435 1891 +315 1997 2365 2823 +1859 1910 2141 1080 +2405 331 2410 2234 +1070 61 1861 1275 +191 1728 1385 254 +1878 1847 291 1315 +1847 1878 1889 1419 +1876 1879 1877 1386 +1878 1274 1894 1323 +2503 435 1907 1901 +1882 1695 1897 1128 +1899 1881 1885 317 +314 1050 117 1862 +1955 1991 2009 2153 +1882 1894 1574 355 +1895 2163 2029 2136 +148 3166 3195 3228 +2412 2329 1924 1210 +1869 1429 1347 1877 +2608 801 2561 2716 +1870 1850 896 1869 +2793 2780 1999 1788 +1862 1901 1760 1867 +1897 1347 1885 1879 +1917 308 1886 2148 +3160 298 887 2514 +1903 1894 1881 1368 +1899 1824 1906 1585 +1898 1695 1882 1860 +1853 435 1901 896 +1900 1880 1664 1893 +1903 1904 1531 1834 +1897 1905 1902 1186 +1905 1906 1902 2715 +1903 1695 1904 1231 +1250 1904 1898 548 +1799 2714 1868 1880 +1637 1843 1923 1591 +2468 2467 466 2437 +2157 1521 1209 1872 +2237 2369 2409 2290 +238 1825 277 1922 +2148 2165 2136 1965 +2765 2733 1537 1952 +1218 2130 1577 452 +2451 1962 2389 2409 +1218 1895 2029 243 +2120 2452 363 239 +469 365 25 2079 +2162 1922 1859 164 +120 211 1762 1660 +2155 1912 1920 117 +1908 2002 132 553 +1888 120 1762 2196 +1977 314 2751 1740 +1075 2705 2504 1145 +2505 2524 1935 1643 +213 2505 2805 1985 +1932 2391 1948 238 +2691 60 2212 2471 +1982 2669 2803 1184 +2691 1929 1180 1833 +2769 2759 2229 1706 +2689 1586 2518 2684 +1927 883 2051 1387 +758 2816 1941 2766 +308 2196 2052 2198 +1075 2822 2705 1142 +4941 4754 4893 1101 +1943 1027 1829 277 +1936 11 1942 2711 +1949 758 1941 1638 +313 1730 1940 2168 +1519 2794 1214 919 +2403 2456 2071 2293 +2527 2559 2220 2582 +1739 1214 849 1120 +277 1180 1829 1929 +1942 309 1995 239 +2416 155 256 2304 +203 513 326 64 +1914 369 1338 893 +2067 2297 456 2070 +3248 502 2287 39 +186 1884 2106 80 +480 2302 507 2260 +1962 2450 2392 2133 +2011 3737 2781 3700 +2510 2701 2745 829 +268 1753 2094 1673 +53 2012 1714 1819 +1957 1683 1916 2199 +572 2107 3993 2057 +2688 1182 2503 1726 +2098 1913 2139 2126 +2020 2042 571 1617 +3922 3722 439 3811 +571 2028 1804 2042 +192 1992 2059 1730 +2036 4100 2041 1784 +2149 2178 2241 2394 +534 3832 3833 2340 +553 1720 2032 2000 +2600 2647 841 820 +2742 1230 1977 1050 +2734 2470 2655 2328 +2670 1975 2726 1925 +2536 2485 3047 2383 +2734 2710 2328 2863 +2411 326 2193 64 +3746 2091 3711 3794 +2563 2004 1931 2000 +3362 5047 4949 5017 +2125 2074 2116 1647 +2051 1403 2022 1928 +2014 2042 1711 1734 +1759 2965 3010 2396 +3832 3758 3833 3912 +590 297 2106 1698 +584 4028 4087 3805 +2208 1884 186 1755 +1969 2022 2023 758 +2050 2024 571 1832 +2082 2245 1221 2263 +2169 2023 1431 1949 +192 2059 2024 2144 +286 392 2595 1871 +87 2229 2491 2759 +1892 2771 2795 1025 +1973 1982 2015 2035 +3992 1125 3711 3835 +409 2262 2187 1923 +2771 2773 2832 1193 +1982 2381 2669 2769 +2294 2302 2297 229 +908 1171 1739 796 +2019 2045 2053 2063 +1719 1591 1711 47 +1884 2206 182 2117 +2476 3421 3186 2946 +518 3764 1958 3706 +1961 262 2013 1403 +2014 2012 2015 1804 +1511 2013 2016 1986 +2016 2013 2563 2000 +2014 2015 4219 47 +547 1140 1132 3248 +4153 951 4068 1055 +269 2007 1127 1636 +2094 2062 1966 1621 +586 2077 3779 1851 +1985 2031 1992 2805 +2031 2172 1992 1995 +1996 1673 1993 2145 +1645 4042 3827 4020 +512 2302 229 2082 +3711 1125 3823 3685 +2032 1968 2171 132 +144 1917 1886 2128 +1822 2103 1699 2064 +2032 2023 2022 1720 +1804 2028 2031 1973 +1126 1127 2034 1707 +2033 2123 2118 1705 +2041 553 2036 2000 +2035 1591 1970 47 +3827 4042 4263 4008 +2107 4010 3964 366 +308 1390 2196 1778 +3834 3743 1469 492 +1970 294 2035 1184 +1696 1968 1966 1986 +2299 225 1754 64 +225 2308 1754 1210 +1696 1766 2007 2062 +2091 3642 3836 3746 +4119 2337 2048 3802 +546 3734 2047 3824 +1719 416 2058 4334 +2051 1993 1403 1831 +2050 1985 192 1935 +2163 1937 225 203 +243 1127 1218 2007 +453 299 2114 1655 +509 2179 2226 1672 +2244 2249 2191 2238 +1963 2084 774 2928 +452 224 2049 367 +1996 1969 2174 2166 +326 2235 83 2204 +2121 2063 2132 1750 +2045 1682 2063 2020 +2007 2062 2061 1555 +2030 302 177 4020 +2156 12 2140 1538 +3833 443 4034 3642 +1953 2289 505 502 +3947 3952 3987 4036 +182 590 2106 268 +1953 1222 2257 2225 +2177 1945 1150 512 +2355 2283 480 2323 +4092 4098 3287 3935 +1984 2101 4011 2276 +3319 4113 1713 1140 +2101 2103 1822 4008 +2267 253 2021 302 +2912 3195 3265 3257 +2313 2384 2424 1919 +456 2253 2245 2227 +1724 2134 1222 2312 +2026 1994 1841 2232 +2084 2225 502 39 +2311 2083 3320 2057 +501 3292 2349 2304 +2349 2384 527 155 +3097 3469 3468 3182 +3682 3684 2342 2707 +2291 2111 2436 2374 +449 3800 3630 3954 +3948 2046 487 1981 +3922 4033 2108 2336 +3993 3933 3963 1126 +1648 1682 1960 2020 +4357 4290 4255 1771 +2097 587 4021 4002 +226 2096 4020 302 +2152 320 1965 1549 +2273 405 2119 2250 +2146 1497 266 1757 +2074 1658 3979 2076 +4103 4078 3793 451 +2076 2202 2030 1353 +3308 3629 567 3042 +2117 1781 1612 1667 +1955 2069 1989 2150 +2038 1963 547 39 +4003 2092 4019 3803 +320 2151 2153 1395 +2195 2112 2147 2271 +2089 2420 2408 2362 +2267 2110 2230 2227 +2221 2177 2210 2186 +2137 1666 1395 2054 +1668 323 299 1679 +4012 2118 1984 1508 +1533 2153 2105 2009 +2116 3933 2124 2034 +2099 2255 2180 2265 +2455 2454 312 1918 +241 243 2139 2061 +1659 2145 1497 1237 +2124 243 241 2034 +2123 2125 2128 2118 +2126 2127 2124 1984 +2125 241 1965 1525 +2136 2128 2125 1658 +2029 2124 2127 1657 +155 2382 2343 2384 +2309 1915 144 774 +1497 1575 266 1183 +2152 2139 1781 2061 +2240 1957 2199 2432 +2181 2081 2215 2299 +126 3408 4165 3626 +1747 1886 1913 2127 +2138 255 80 2114 +1209 2137 2156 1538 +2132 1965 2148 2121 +2142 2065 2146 1401 +2142 2162 2157 1872 +2160 2141 2140 1606 +1648 1395 2151 421 +2154 1575 2145 1996 +2161 2144 2122 2024 +2140 12 2100 1620 +2194 2201 247 2110 +1895 1612 1913 2139 +1825 1971 1521 238 +1753 2106 80 2158 +2152 1781 2109 2143 +2151 2098 2132 1662 +1755 2109 2117 1884 +2155 2144 2159 2167 +1575 2154 2162 1922 +2065 2157 2158 2138 +2141 2159 2156 1910 +2159 2161 2156 2150 +2158 2157 2154 1698 +2162 2142 266 1780 +1659 2158 2145 1753 +2160 2155 2141 1920 +1886 2052 125 1747 +247 2201 109 3720 +1913 1533 1709 1755 +2168 2167 2176 2059 +2166 1825 1698 2154 +2166 2178 1825 1943 +2446 2172 2211 1995 +2171 2175 2182 132 +2170 2172 2173 2028 +2174 2171 2169 2023 +2171 2174 268 1673 +2176 2173 2172 2059 +1091 120 2170 1778 +2166 590 2445 2174 +2113 2218 2071 2244 +2168 351 1971 313 +2228 531 2055 3815 +2202 2119 2272 2230 +2255 2257 2134 405 +409 2211 120 2170 +2232 2248 2224 2244 +2415 2419 1392 347 +2238 326 83 513 +2244 2191 2243 2113 +506 2002 2425 553 +319 1768 2300 366 +285 2343 2425 2313 +513 203 1709 1747 +2056 2247 2186 2193 +2259 256 2304 2295 +1980 2238 2417 2191 +2147 1206 2200 2271 +2230 2110 2269 2264 +2039 1210 1937 1924 +2205 1709 2198 1533 +2204 2197 203 1937 +2462 2216 1962 2133 +2324 1767 2194 2258 +2147 1767 2164 2269 +1768 2256 2180 2103 +2320 109 2278 134 +1762 2205 2060 2198 +2206 2207 2204 2197 +1660 2208 2205 2009 +2208 83 2205 1709 +2207 2206 2214 1991 +2458 2221 2210 2414 +1150 2209 2113 1724 +2290 2448 2182 2169 +2649 2661 2735 1930 +42 1697 3756 3600 +2400 306 2387 2208 +1724 1841 2134 2243 +2199 2367 2405 331 +570 2441 3133 3125 +2222 2433 2177 2239 +2454 2455 2468 2394 +1946 359 2620 2497 +2113 2209 2222 2417 +2218 2221 2406 2418 +448 3752 2372 2355 +2243 1841 2248 2183 +2070 2311 2300 2083 +3742 2319 2055 2306 +2080 2272 2112 52 +509 407 2179 3685 +1592 2806 1998 1933 +2195 253 2112 2180 +3926 2277 3927 3902 +2258 2183 2082 512 +2234 2240 83 306 +2233 2235 1873 2422 +2060 2410 2234 1762 +223 311 2392 1683 +2405 2434 1911 2330 +2185 2239 2193 2056 +2240 2418 2238 2218 +2239 2233 331 2133 +2449 2400 351 1971 +2426 2348 2341 245 +2215 2224 2247 2186 +2056 2186 2183 2177 +2303 2080 1994 2271 +1509 2285 4088 2358 +2243 2249 2251 2191 +2224 2265 2249 2183 +2247 2248 2250 2056 +2251 2249 2099 513 +2247 2250 2299 64 +3816 3733 3867 3786 +2257 2255 2080 2272 +3997 3999 3630 3840 +2253 2181 1221 2119 +319 2273 2202 1658 +2253 2070 2181 2300 +2200 2264 2263 2232 +3812 2261 2192 2310 +512 2292 1956 2324 +4099 285 2259 1830 +285 2002 2329 1830 +1994 2271 2264 2258 +2263 2195 2265 2258 +2119 1221 2264 2248 +3918 3926 556 3570 +2112 2077 586 52 +4023 4022 2276 4095 +1767 202 2201 2195 +1697 3705 3041 3740 +2245 2110 2263 2194 +2180 2253 1768 2227 +2279 2099 2256 1747 +4335 3344 4361 4327 +3287 4079 3741 3663 +591 2268 585 2074 +3859 3983 3852 2231 +2203 2319 510 300 +125 405 2282 2273 +2331 3719 447 3665 +2356 2342 347 2415 +242 2279 2300 319 +2359 2289 2072 1644 +2318 4188 546 3723 +3805 2246 2361 2359 +316 403 2455 1638 +181 3343 1954 177 +2370 507 2371 2294 +456 2283 2067 181 +2427 1911 409 2211 +2420 2089 2431 1723 +507 2293 2375 2260 +2370 2333 2292 1945 +2005 261 2288 2344 +2312 2310 1222 2192 +2798 3577 2333 2388 +261 2005 1953 1222 +2326 2366 2535 2808 +2043 2134 405 2251 +2225 2282 2257 2188 +2404 2403 2419 2457 +2005 1956 2303 2026 +480 456 2302 2245 +2085 2192 1950 261 +448 2375 1123 510 +202 3742 3821 2226 +3031 500 2940 2997 +2310 2044 2309 1569 +2311 2308 242 2130 +2308 2311 2295 2259 +2309 2225 2310 2084 +2081 1754 2295 2414 +2189 2079 294 365 +2973 3713 3068 3375 +256 2343 2429 285 +3838 3916 3837 3816 +4412 18 4449 3977 +4189 2284 2338 3764 +2278 109 1767 2226 +2203 2321 2322 3000 +510 2323 2320 448 +247 2320 2323 368 +2322 2321 1206 2072 +510 2200 1206 2260 +2798 401 1224 318 +2298 3020 1392 2383 +2981 3128 3172 3118 +2708 1976 1979 2464 +409 2330 2262 1888 +2237 2429 2329 2412 +234 3716 2280 3747 +3668 564 2781 3576 +2296 2356 402 2293 +2391 403 2562 1829 +217 2995 1821 3007 +4041 3797 2092 482 +412 546 2047 3791 +4064 2318 412 3763 +1710 3001 1721 794 +3824 3781 1972 152 +2438 2369 1723 2242 +2088 3039 527 2281 +2348 2315 2129 2189 +2294 2416 2370 2456 +4075 25 3131 4108 +2500 2640 2865 2570 +4166 3861 3596 4197 +1723 2343 2382 2242 +2086 3681 469 2085 +4491 4480 3982 604 +344 3112 2975 2981 +3116 550 3061 329 +2364 2968 3118 500 +3053 3058 3180 3102 +2223 2359 2373 2072 +2281 2333 3039 2370 +2371 2358 2967 501 +2359 2246 2357 505 +2285 2358 2355 2283 +3757 1697 2363 3702 +2285 3721 3807 3752 +3020 2978 2909 2111 +2360 3041 3723 3737 +2353 3128 3141 195 +2706 1871 286 2788 +347 318 2298 2707 +2431 2462 2406 2216 +1784 3409 2577 3289 +2421 1911 2341 2427 +2293 2288 2356 2344 +2288 2373 3065 2357 +2373 2375 156 2223 +507 2372 2371 2355 +2473 2438 2439 2089 +2388 2372 2292 2305 +2906 2851 2864 2486 +2848 3098 2662 870 +2803 4227 3299 2379 +417 2378 2380 3300 +2379 2669 315 358 +2824 2687 2818 2004 +1392 2348 2129 2383 +2637 1978 2382 2326 +2536 2079 2129 2086 +337 2611 698 279 +2587 985 124 743 +2440 2214 211 1660 +2296 156 2375 3698 +1683 363 1916 2421 +2501 217 2633 2971 +2334 2471 2394 1929 +278 2236 2444 1957 +2473 2979 2922 389 +403 2391 2219 1971 +4315 4865 1010 1012 +2534 2537 3030 1987 +2913 2774 2921 410 +59 2496 895 2684 +397 2499 2466 2489 +2241 2214 2440 297 +2864 2486 2702 2731 +2436 2408 2432 278 +2407 2301 2433 1945 +2431 2406 2301 2458 +2409 2216 2237 1873 +2367 2433 2404 2222 +2403 2408 2419 402 +2402 2111 2407 2909 +2405 1911 1916 2453 +1873 2411 2412 2235 +2413 2410 2417 1980 +2413 2330 2410 1888 +2412 2411 2414 1754 +2413 2209 2430 2312 +155 2416 2184 2281 +2415 1950 2457 2344 +2221 2411 2418 2193 +2417 331 2222 2239 +2420 2301 2407 2184 +2111 2291 2419 1392 +2428 2389 2438 2369 +211 306 2453 2234 +2428 2957 2502 350 +468 304 2536 2079 +2187 2189 2426 294 +506 2425 2242 1592 +2369 2290 506 1431 +363 2421 2423 309 +2315 2434 2430 2330 +256 2429 2458 2414 +2404 2291 2367 2434 +2402 2433 2462 2133 +2403 2406 2432 2218 +2431 1723 2237 2429 +2694 2562 2724 1829 +2462 2089 2402 2439 +1909 1573 1414 2444 +293 2421 2374 2341 +2374 1683 223 2436 +2445 2400 2387 590 +376 2539 2941 2217 +2502 2709 1619 312 +2904 3102 3053 2984 +2392 311 2437 2454 +2446 351 2440 2176 +2447 2445 2448 2169 +2446 2452 351 239 +211 2453 2446 2211 +2241 2452 2450 2454 +2449 2451 306 1957 +2453 2450 2452 1916 +2451 2449 2447 1918 +2448 2422 2451 2409 +2120 2219 2444 2449 +2120 2475 2219 2286 +2457 1150 1945 2344 +2456 2301 2458 2416 +2209 2457 2404 2430 +3003 2874 2956 3011 +2484 2645 112 3016 +2464 1192 2531 2467 +2432 2367 2436 2199 +2587 2614 1208 2584 +2461 2532 2328 466 +2579 2720 2478 2565 +2493 1192 2399 2467 +2466 2461 1909 2530 +2489 1909 390 2219 +2522 2638 2550 2498 +397 1976 2737 2519 +2489 2649 1930 2391 +2716 2713 2757 613 +2978 293 2393 2374 +290 2709 2710 2502 +390 2709 316 2455 +606 2010 2854 3216 +187 2508 2537 2796 +2521 2465 2615 2566 +2838 388 3002 3046 +374 389 1573 278 +2979 2482 389 1619 +1573 2481 2533 1414 +2612 841 820 2497 +2460 2749 2777 2564 +3032 237 1978 2637 +2376 2749 2401 2671 +3133 3141 3134 2964 +3479 3458 3482 3429 +2471 2399 2519 2468 +2920 2918 364 3005 +3026 1998 2706 2788 +2508 3018 2772 2529 +2543 2560 2495 2466 +2574 2931 2935 2784 +2493 2579 894 2526 +2725 1108 2518 2398 +2483 2598 2601 2220 +2469 2884 2515 2513 +2672 2526 2399 60 +2643 2750 2346 2567 +2390 3017 3025 2789 +2474 2442 812 2423 +1964 548 2714 1880 +213 1926 2505 1146 +2504 1717 1928 1927 +2554 2978 3030 3020 +3615 2802 3019 3715 +374 44 2477 2492 +2863 3015 2982 2532 +1959 1182 305 1213 +187 2535 2909 318 +2581 2559 2583 2550 +336 394 2498 444 +2960 1896 2974 817 +2551 2498 400 408 +2571 2575 2608 2716 +2671 2749 2655 2578 +2496 2755 2728 1934 +390 2676 2470 2489 +410 2907 2589 2875 +2549 2478 115 2551 +2933 2638 2643 2469 +739 838 2541 2567 +2686 1717 2658 1927 +2575 2588 2723 2526 +2495 2674 2525 2499 +775 2541 1946 2582 +3006 2911 2841 455 +2492 2533 2530 1573 +2531 2544 2529 2467 +2530 2532 2546 2461 +2509 2531 2533 2464 +2532 2529 2982 2482 +2396 2535 187 2965 +2534 3020 2511 2298 +3042 2424 1978 2384 +2396 2477 3022 2924 +3151 3335 3176 2730 +2586 2441 2939 2634 +2779 2640 2853 2570 +2527 2523 2559 2581 +1586 2677 2685 1186 +2544 2549 2551 2493 +233 2546 2543 2530 +2618 807 2630 359 +815 2544 2547 2531 +2564 2546 2910 3015 +384 343 853 1257 +2521 815 2560 2543 +0 2512 2569 2469 +0 2515 2521 2543 +398 2826 1054 2609 +2687 2824 1075 4992 +2506 3029 2996 2637 +2855 2861 153 341 +2948 2639 2877 2597 +95 694 3083 22 +919 2850 1214 370 +1946 2541 348 2512 +2579 2549 2578 2493 +2729 2628 2731 1890 +2435 2649 855 2334 +1982 4983 143 2015 +2484 815 2890 2547 +2465 838 2566 894 +2478 2565 2569 0 +2569 2523 2500 2581 +3060 329 2811 3139 +2750 2566 2567 2550 +2346 2540 2574 739 +59 2576 2626 2516 +2665 2871 356 2607 +878 821 2614 2652 +2494 2934 2570 921 +2576 2525 2516 613 +2684 2580 2571 2575 +2368 1096 4108 3278 +815 2517 2560 1192 +2465 2560 404 2495 +2576 2612 2632 359 +2567 2541 2583 2512 +2583 2527 2623 1946 +2643 2581 2582 2512 +804 391 2463 718 +263 391 885 2647 +2539 345 2962 2666 +2463 1036 2386 2673 +2630 359 348 2525 +2921 2520 428 345 +2679 2680 2636 263 +1545 343 384 216 +2832 2880 2771 639 +3473 3518 3512 3373 +2881 2621 2596 1185 +1997 340 2850 370 +2784 2594 807 2618 +2915 2851 2556 2619 +2601 884 2623 2497 +124 878 2614 73 +1974 841 804 884 +2620 2621 2598 2497 +2604 2718 2685 824 +2688 2747 305 1220 +2695 2602 2677 96 +2858 2695 2740 872 +2830 45 2848 387 +2572 398 2859 2697 +1890 2722 2723 2516 +1810 1108 873 2552 +726 733 757 2697 +2385 393 2875 336 +726 2679 2483 2580 +836 2825 153 1199 +2599 2573 2463 79 +2894 115 1024 2478 +3199 481 2898 2914 +3178 3529 3466 3526 +2632 2596 2631 2545 +2777 2903 2597 2987 +2601 775 807 2220 +2594 884 2601 820 +3213 2663 2897 2834 +2598 2934 775 2582 +3150 3469 281 3182 +2665 881 105 2648 +2631 2700 2632 2571 +2628 2729 891 2826 +2627 2641 2561 2644 +2630 739 2719 838 +2721 2545 2629 2588 +2626 2618 886 2722 +2618 2626 726 2580 +3016 2390 2675 2645 +570 2905 2539 2666 +3027 2874 217 3007 +757 2590 2650 885 +2554 2485 245 2383 +2750 2522 2929 2469 +2659 2778 2556 2915 +2876 386 2346 2540 +2864 2917 2869 2628 +3149 3225 3088 2828 +2522 2500 2865 2583 +2628 2869 2722 886 +2930 2987 2633 2460 +1810 2757 1108 2716 +2585 804 2648 1974 +885 2647 2625 733 +2212 2676 2562 2471 +890 2636 2681 832 +2680 2685 824 1187 +832 881 2573 2861 +2748 2862 2812 1113 +2680 2678 844 384 +397 2517 1976 1192 +2672 801 2671 2674 +4240 4283 4899 4241 +2751 2524 1089 1391 +2776 2639 2898 710 +1519 1739 1171 609 +2738 2212 2694 2693 +2891 2790 2377 852 +2847 2932 2622 2892 +4156 713 581 4274 +2625 2872 2572 733 +2875 393 2586 2634 +292 3404 3496 3448 +2672 2736 801 2713 +2004 2380 1931 2806 +2688 2742 2747 1977 +2517 2656 2486 404 +2668 2656 397 2499 +1036 844 853 2587 +2723 404 2656 2526 +2633 217 3011 2916 +2737 855 2649 2519 +2604 2542 1148 110 +819 2654 2681 1545 +2590 757 2683 2612 +2651 2681 2590 2654 +2682 2650 2680 2678 +2681 824 890 871 +2684 2685 895 2679 +1934 2683 2398 2576 +2602 2683 2542 2651 +2764 2524 2751 1863 +213 2381 2553 143 +2603 1964 2670 1842 +613 2690 2755 1934 +2691 2692 2689 327 +2690 1930 2693 1932 +2756 2690 2693 2741 +2691 2661 2692 1230 +2435 1215 2661 1230 +2605 2718 2725 2604 +2697 895 2699 757 +2607 2700 2696 2610 +2705 2819 1717 1624 +2696 2718 2857 890 +2697 398 59 2626 +2753 1959 305 676 +2401 2775 874 1844 +307 2746 2767 2747 +1729 2763 2762 1810 +1926 1938 2698 150 +2365 455 358 2491 +401 2088 2808 2366 +2328 2709 390 466 +2708 2474 2475 2442 +1979 2712 2474 3017 +290 893 316 1941 +290 2710 1338 2787 +2735 2472 2668 60 +396 2742 2503 1907 +548 2745 851 1904 +2472 2646 1890 2516 +2885 2902 2779 2932 +895 2695 2699 2602 +2720 2721 2853 2629 +2906 404 2719 2465 +2723 2722 2719 2630 +2721 2608 2644 2631 +2674 2608 2721 2525 +2764 1215 2765 2435 +2728 2740 2496 2695 +2751 2767 1215 1977 +2754 2752 2756 2741 +2518 2752 2725 1148 +2561 1729 2627 1810 +2538 3312 288 3302 +801 1844 2401 2561 +2809 2806 3032 1592 +1914 2768 541 2760 +112 163 1976 1979 +2212 2738 2736 2713 +1223 2737 2735 2668 +2676 2736 369 2470 +2661 2761 2735 2758 +1788 2740 2753 676 +2739 873 2725 2605 +396 2727 2742 2692 +2714 2741 2670 1975 +2745 2752 851 1148 +2759 2817 2786 11 +1959 2743 2715 1133 +2703 2762 2763 2754 +2754 2603 2670 2703 +2653 2825 836 1168 +112 2486 2484 2517 +2638 2894 2500 2569 +2658 2726 2686 1925 +2727 2753 2728 2743 +2739 2752 2754 2701 +2746 2753 2727 2747 +2518 2757 2756 2689 +2727 2755 2758 2692 +2755 2646 2758 2472 +2763 2756 2757 2738 +1998 1933 2744 350 +2761 1796 2733 1223 +2760 2768 2763 2738 +2780 2704 2746 1788 +2761 2746 2704 2758 +2686 2724 2766 1027 +2766 2724 1914 893 +2801 2764 2765 1936 +2726 1194 2768 2703 +2767 2733 1215 2761 +2818 1933 2004 1720 +5004 3765 5188 4931 +2003 2592 1999 190 +2492 3003 2774 233 +2003 2780 1171 307 +2956 2796 2772 2397 +2813 2702 112 163 +2778 2659 2914 3149 +2890 2619 2851 2484 +2776 2902 2639 2885 +2869 2717 2540 2931 +1892 944 2773 2762 +1958 3666 2332 3701 +660 3220 3130 3470 +2787 2785 21 1338 +2887 2881 2494 2596 +2783 2820 919 1537 +2787 2788 2821 2744 +2789 2786 2783 2712 +2786 2789 2365 2491 +2787 2971 2788 2501 +2662 2893 1172 357 +2862 357 2812 1172 +2855 913 730 342 +2795 789 1892 2849 +2837 902 1944 874 +2793 1999 1032 1113 +2477 2774 2924 2997 +899 2837 944 1729 +2899 1124 2325 2296 +3196 406 4890 688 +670 3055 695 3514 +2816 1717 2819 2766 +3313 3251 1727 2507 +3289 4981 2378 1931 +3487 95 695 3478 +2818 1928 2816 2022 +358 2732 2669 2229 +3587 3589 3606 3578 +2707 3047 388 2298 +1184 2732 304 294 +334 3280 2974 3100 +3159 3079 3121 2568 +913 2653 2791 839 +21 874 2930 2775 +4255 1771 1713 1742 +281 2900 3150 3174 +2817 2805 2801 1936 +2821 2818 2816 2744 +2805 2817 2381 2769 +2820 2801 2698 1537 +2822 2821 2819 2785 +2817 2820 2823 2786 +1938 2823 2820 370 +2822 2824 2821 1871 +2823 2553 2381 315 +920 2613 2748 333 +2552 2827 361 2627 +398 2873 2826 886 +3166 710 3222 2642 +2929 2933 2950 279 +2834 2606 1172 828 +400 698 2890 13 +2003 796 2592 879 +5079 2835 5206 3153 +2892 2622 2830 361 +5203 2833 929 5112 +5105 796 908 5049 +1519 2797 2794 1796 +2960 321 2972 2479 +3258 917 3216 3228 +2960 2974 332 3676 +3267 1821 2528 286 +3405 5109 3245 5123 +3080 3093 3270 430 +3143 3045 3207 3192 +1106 581 4283 3446 +383 4712 4884 1426 +3124 2896 2663 2891 +1172 2606 2377 792 +828 2862 1054 2793 +3226 2976 2595 2558 +2376 1024 2597 2777 +470 4240 473 3442 +2540 2906 2869 2719 +2476 3186 3274 5194 +2792 2555 920 395 +2857 153 2861 890 +2856 2859 2858 2699 +836 2857 2860 2605 +2857 356 2860 2607 +2858 2859 2862 1054 +427 2856 2555 2652 +2860 2791 2653 2849 +3017 3016 2509 1979 +2641 2376 2908 2401 +2643 2346 825 2934 +3691 516 3671 184 +3249 3243 3314 3317 +3182 3161 3129 3181 +2853 2641 2779 2644 +2997 2926 364 344 +2893 2872 2873 2572 +2871 2888 2881 2665 +2892 2871 2887 2827 +2459 3023 2918 2635 +2520 2611 2666 394 +2877 2640 2894 1024 +2876 2950 386 2556 +688 3325 3297 3296 +3204 3216 3105 3212 +1032 5105 5104 2592 +2872 2889 2784 2594 +825 2902 2914 2896 +902 3222 201 1169 +400 2929 279 2498 +2717 2917 2778 2897 +905 2897 2917 891 +2931 2873 2784 886 +2889 2872 2891 105 +2888 2935 2881 884 +2831 2777 115 2564 +2888 2893 2847 2662 +2873 2663 2893 2834 +2892 2891 2871 2790 +2750 2929 2876 2615 +918 5176 1022 5163 +2932 2882 2935 2847 +2886 2961 2885 2622 +938 2616 2949 2659 +2969 3063 2984 2798 +3316 3283 2815 3192 +4380 4022 3326 4268 +386 2778 2882 2717 +337 698 2988 2619 +3427 250 2443 3583 +2634 570 2964 394 +1024 2376 2853 2720 +13 428 2520 698 +2864 2915 2917 903 +2362 374 2511 2408 +3012 13 233 2547 +3267 3237 3307 2528 +3266 415 2078 3200 +2397 2925 195 2964 +2616 2882 2776 3091 +2908 2597 2639 2919 +2989 2675 2988 428 +2641 2908 2885 2886 +2924 2956 2874 2490 +2994 205 2915 903 +2923 2490 2998 353 +2923 2397 2956 2589 +44 2978 2393 374 +2920 2925 2921 345 +2796 2918 2537 364 +2998 2913 2923 2939 +195 2998 2870 476 +3277 4207 3084 4210 +3320 431 367 2057 +2829 2894 2638 2884 +2645 2970 2994 2813 +2779 2932 2494 2887 +2717 2896 2931 2663 +2522 2937 2829 444 +2574 2935 2865 2623 +2494 2896 2934 2889 +814 3295 3283 508 +825 2950 2933 481 +3548 3587 3594 3569 +2964 2925 376 2539 +3002 2307 1224 187 +3125 3194 3145 2441 +912 371 437 2968 +4473 4528 4422 642 +4094 4657 4181 4413 +714 3459 3533 3458 +3223 3262 2010 3215 +481 2952 85 472 +337 2949 2950 2556 +2948 2954 481 2898 +2877 2829 2937 2948 +3152 3079 3159 3048 +393 2954 2953 2947 +2962 2952 2955 811 +2952 337 2955 2949 +2953 2954 2990 1003 +2459 2918 2774 2921 +812 293 87 2423 +2959 2962 345 2989 +430 2958 353 2995 +2514 2840 2838 3046 +3149 3088 3213 2897 +3145 2586 2958 2953 +4324 1096 3844 471 +2913 2939 2487 2905 +388 1987 3002 2534 +3001 3748 3165 447 +3681 3065 493 2357 +3048 2942 377 2353 +3698 3673 3583 2899 +2976 2930 2971 21 +240 2970 2390 2789 +2838 3279 298 2975 +564 3736 3064 2314 +2514 2810 2840 3062 +2351 2972 3031 3081 +240 3263 2970 2850 +2979 3024 3021 2982 +2922 2506 2473 2362 +812 2977 2393 2481 +4166 522 4202 3632 +3170 476 2327 2351 +2977 2509 3018 2533 +3148 3564 3373 3403 +3062 2443 2899 817 +4895 4056 4307 4733 +1759 3010 3113 3004 +2988 2645 2994 2619 +2987 2990 2916 2903 +2990 2995 2916 2958 +717 2989 2988 2955 +372 4112 4089 490 +814 3283 525 3143 +296 1821 2995 3080 +2930 3264 2987 2919 +2989 2993 2335 2959 +293 2554 87 245 +195 2870 2796 2307 +2925 2920 2926 442 +4177 84 4149 4065 +3769 134 3051 2320 +3763 2966 2339 3064 +2965 3031 2479 2940 +2772 3018 2459 3012 +3006 2986 3005 3111 +3007 3004 2490 353 +3009 3004 3007 2528 +3005 2635 3006 2335 +3029 3010 3009 237 +3008 3006 3028 455 +2986 1987 3014 3008 +2675 2459 3012 428 +3015 3011 3003 2910 +4912 14 1418 4837 +3010 3034 3310 237 +2509 3016 3012 2547 +2633 3015 2863 2460 +2501 2863 3024 2710 +2492 3021 3003 2982 +3313 4078 2507 451 +2362 2535 2506 2326 +3023 44 2977 3018 +3023 3030 44 2537 +3022 3021 3027 2874 +812 3025 2977 3017 +3026 3027 3024 2501 +3025 87 3028 2491 +3028 3023 3025 2635 +3026 3029 3027 3009 +2554 3030 3028 3008 +3029 2506 3022 2396 +344 2975 3002 2307 +2485 304 3033 2732 +237 3032 3303 146 +3014 388 3309 3047 +3412 3448 3493 434 +3664 3632 70 3661 +3249 3335 3325 3323 +3732 3065 3577 156 +3065 2342 3577 2356 +3919 3718 3832 51 +3755 2363 2270 3728 +3682 2104 3047 2536 +3050 3512 3511 3392 +582 3061 62 550 +3142 3090 2844 3170 +401 2960 1224 2479 +2808 3042 3034 1978 +2951 371 2968 3126 +3117 3138 3058 3585 +3504 3043 3470 3365 +3712 3806 3969 3000 +3447 3501 3419 3495 +3103 3117 2354 2443 +645 562 3899 3650 +508 3295 3368 2800 +3554 420 3627 3418 +611 3185 3366 3328 +2354 3049 3122 3565 +3171 437 3144 3127 +684 3532 3531 2568 +3532 3539 3044 2352 +2974 3100 3063 2984 +3062 3595 3672 2899 +2973 3001 518 794 +2967 3039 3038 2371 +3067 794 3068 3374 +3334 3066 3069 3646 +3069 3066 2314 3070 +3483 3067 3068 611 +3422 3366 3375 3068 +516 3694 3556 3633 +3378 445 3637 519 +4295 4652 3939 4399 +19 3425 4887 1122 +3824 3783 3785 3734 +3677 3657 3693 3608 +3646 128 514 3334 +3367 1727 3099 426 +2951 3182 2811 3129 +3272 3266 2843 2993 +298 3118 500 2975 +3376 3377 715 3549 +2557 479 3467 3441 +2927 1712 3655 4177 +814 3354 3187 3233 +3591 3162 3427 3704 +3347 3256 3259 46 +2961 2642 3158 201 +3212 3137 3154 3206 +3123 3193 3045 442 +3124 3227 3149 2914 +4107 50 4945 981 +3154 2843 3200 3146 +3188 3144 3133 3175 +3555 3586 3548 3557 +3473 3472 3097 3122 +3107 3096 2087 3121 +3124 45 5102 2377 +3101 3078 3100 3667 +3099 2810 3102 3062 +3099 3102 3553 250 +2354 3101 3100 2443 +887 377 3179 3053 +4868 463 3453 4740 +3200 2879 3215 3154 +3232 3265 46 3259 +3518 3097 3468 550 +3147 3284 4866 3350 +3233 3379 814 3203 +415 3204 3200 811 +3113 3237 3142 3004 +3281 3113 3170 2351 +3111 3112 3286 2986 +3471 3549 3465 3541 +3136 582 3201 3161 +3439 2352 3544 3138 +3053 3140 3049 3445 +2353 3126 2327 3081 +5312 686 4742 5138 +257 3220 3184 3313 +3122 2811 3097 329 +3096 3180 3121 3058 +3090 3142 430 353 +3098 3091 3213 2847 +2941 472 1828 2217 +3172 3048 3152 3118 +371 3163 3059 3189 +3169 2327 476 2364 +3079 2868 3531 3164 +3325 2782 3249 3240 +4100 4101 2345 1784 +564 3611 3576 3551 +3094 2487 3134 2217 +3133 2487 3173 376 +3537 3510 3586 3557 +3531 3532 17 3115 +3155 3089 3190 3205 +329 3140 3116 3049 +3140 2568 684 377 +3138 3139 3546 3117 +2487 437 3169 2364 +3123 3045 3271 3111 +2844 3205 3269 2992 +3059 437 3094 3167 +811 2941 3146 2962 +430 3093 3194 3145 +3108 4947 4969 346 +3559 2983 106 3506 +2642 2961 3091 2776 +2815 508 2624 3383 +3339 3338 2538 1160 +3156 281 2951 3126 +2833 5112 917 3258 +3089 3155 3105 3093 +3137 3223 3154 3268 +3318 3152 3160 298 +3387 3382 3181 3163 +3217 3088 77 23 +3179 2951 2811 377 +334 3156 3179 1896 +3389 3115 2868 3486 +478 3593 3701 3086 +3167 3164 3157 3127 +3163 459 3129 371 +3809 3949 2966 3717 +2828 3224 1887 3225 +3520 3163 3382 3144 +4196 4719 659 755 +3128 3173 3171 3141 +2981 3192 3045 3112 +3189 3169 3188 3059 +2327 3189 3174 3126 +3177 3188 3169 3134 +3192 3172 3191 2815 +3385 3209 1828 3094 +3184 2538 257 288 +3193 3173 442 376 +3539 258 2617 3525 +3180 3160 3159 3103 +334 3179 3122 2354 +3486 3383 3157 2868 +2624 2087 3079 2868 +3460 3241 703 729 +3336 3176 3120 3342 +1122 3057 283 19 +2010 3273 2854 5207 +3296 3085 679 723 +3209 3171 3173 3094 +3191 3172 3171 3127 +3137 3214 3360 3203 +3189 3210 3174 3387 +2844 3170 3174 2900 +3194 3208 3090 3177 +3146 3206 3193 2941 +1887 3224 2078 3258 +3234 1731 4879 2799 +1131 3372 3403 3503 +5072 5076 4322 3235 +3228 3204 148 2616 +3110 3105 2912 3093 +17 3115 3202 3477 +3526 3201 136 22 +3381 3190 3205 3109 +2879 3110 3199 472 +3137 3207 3203 3143 +3208 3089 1828 3194 +3210 3205 3208 2844 +3207 3206 3209 3193 +3175 3210 3208 3188 +3207 3209 3388 3191 +915 901 3229 5121 +2879 3214 3089 1828 +45 3124 2961 2622 +606 3190 3212 3384 +2946 3257 3216 3105 +3215 2839 2476 2879 +5098 45 3158 387 +5303 5261 5304 104 +5020 5127 4322 4867 +671 3120 2782 3328 +917 935 1069 5157 +2828 205 339 2883 +2946 3421 3256 3155 +3166 63 3195 906 +5193 3227 3166 2642 +339 3263 914 2850 +3225 5157 3228 3091 +3227 2839 1887 3199 +3211 904 474 3305 +5236 5291 5139 3455 +4859 4786 4134 4744 +914 3106 673 340 +3357 700 3085 3109 +670 3196 723 3296 +1094 5019 3198 3321 +3273 5237 5256 5207 +3271 3276 2911 3111 +4942 4710 4237 4954 +4891 4954 4810 1344 +3470 3368 3462 3130 +695 685 3183 670 +1040 5055 3288 566 +3250 2867 3462 3318 +5130 5012 5328 5339 +2842 681 5302 5236 +4009 3767 4104 3796 +4185 3356 84 1710 +2017 4085 3343 1954 +3037 3130 257 2867 +3243 3472 3280 334 +3280 2802 3314 332 +4964 3253 4313 792 +957 5190 3252 839 +4930 566 1077 4319 +82 3260 3304 414 +3268 3087 3349 3223 +3258 3262 2078 3215 +3195 3153 3257 2839 +3272 3260 3087 3106 +3259 3267 3255 392 +5169 4997 5104 1166 +5079 46 3257 2946 +3264 296 3226 2976 +717 3263 205 2994 +2078 914 3266 3106 +2912 3265 296 3080 +3260 3272 2911 2841 +3256 3269 3270 3155 +525 3271 3268 3143 +3271 3272 3268 2843 +3237 3270 3269 3142 +3267 3259 3270 3080 +5267 5215 3236 3186 +5214 5211 5267 2854 +5234 3350 5255 679 +3307 3327 3282 3237 +1119 713 81 2927 +2577 3298 1104 3289 +3317 321 3281 2972 +3251 3250 1727 2810 +3279 3286 3316 3112 +3286 3312 3324 3276 +2936 3323 2992 2900 +4966 3331 3108 4773 +4233 433 249 4194 +3310 3282 3281 3113 +2275 3319 4075 2073 +3242 5043 4970 4590 +2803 3278 2368 1184 +4321 4101 431 367 +446 93 3760 4058 +469 1114 3812 2085 +3646 3294 4210 310 +3293 4047 1119 1671 +3325 2936 3296 3055 +2878 3295 3187 3234 +2878 3338 346 375 +3302 1160 3299 3278 +3300 3298 1058 2378 +3299 3304 3301 2379 +3303 3300 3307 146 +3303 2730 3298 1104 +3301 3312 3302 3033 +3300 603 3307 3255 +4839 5005 5081 3229 +4448 3977 3956 4228 +3301 3304 3276 2911 +3309 1139 288 2104 +3308 3310 321 3034 +3312 3286 3309 3014 +585 1504 4263 267 +2730 3282 3310 3303 +3328 3120 2802 3019 +3251 257 2867 1139 +5236 5123 5141 5251 +2900 3317 3323 3281 +3318 2867 3316 3279 +3317 281 3243 3156 +2075 431 3287 4092 +2928 3812 1114 2084 +5198 3235 5177 5144 +4865 4691 1037 4703 +3324 3283 3037 3316 +3327 3323 3335 3282 +3130 3037 2878 3295 +2901 4023 4379 629 +3324 3346 525 3276 +3220 3313 3365 3057 +3449 697 3455 5125 +5278 5250 5273 3454 +3284 4972 5281 4910 +5296 4958 5059 4896 +3414 3423 3407 310 +3077 1721 583 3067 +2538 3338 3037 3324 +3339 3184 540 4102 +5093 4904 5007 826 +3151 3297 3335 3345 +90 3151 3336 1116 +4330 4985 4959 4264 +4236 3363 4150 635 +4077 4102 4078 3184 +3248 4028 4059 2287 +4351 2274 4646 4341 +375 438 3346 3338 +3348 3345 603 3327 +5142 3349 82 3087 +3349 3354 3346 525 +3355 3348 3347 3256 +3108 4773 3275 375 +5005 4839 1103 5119 +4117 4953 4972 4978 +220 4864 50 4893 +679 3348 3355 3085 +3349 4846 3354 675 +529 3247 4190 4064 +3360 662 675 3233 +4913 3361 3937 4816 +4952 4864 4979 4941 +3357 3421 606 3190 +3907 4909 3358 4841 +1983 1077 1040 1779 +4869 287 3341 4267 +4236 3371 3680 3950 +3366 3050 3369 3328 +3365 3070 3416 3057 +3375 3369 3558 3078 +3514 3469 3240 3055 +3365 3504 3367 1727 +3955 3958 3931 539 +81 3432 1119 3364 +3495 270 3197 3501 +2983 3588 106 2593 +41 310 3423 3066 +3367 3551 3070 2314 +3538 499 3082 3564 +3082 499 3590 3580 +440 3690 3879 3072 +3380 3402 3381 3109 +3476 3379 3383 508 +3379 3384 3388 3203 +3385 3477 3157 3167 +3380 3387 3181 3150 +3381 71 3385 3214 +3382 3388 3384 3175 +3660 3615 3629 4074 +3388 3157 3383 3191 +3387 3381 3385 3210 +3478 582 3468 3161 +563 3557 3471 3536 +3622 3552 3620 3584 +86 3490 3043 3416 +3614 495 289 3594 +200 3556 3396 3616 +3695 3617 3396 3671 +3571 3395 3600 3394 +4144 113 638 3762 +4121 4129 3400 3623 +3408 489 3624 3479 +3401 418 3398 413 +3400 4129 4175 4200 +3379 3476 71 3460 +3439 3197 270 2983 +3498 2667 379 3493 +5271 2842 4790 5128 +3407 126 721 4214 +3333 450 29 3406 +3413 4132 2135 3399 +3844 4304 4980 2368 +4813 5322 4063 4118 +4261 4570 4806 5001 +3035 9 3429 450 +3429 722 126 3408 +29 3415 3333 1671 +3490 3416 3414 1122 +3415 3392 3422 3366 +3422 3428 3418 3550 +3423 3417 517 3056 +3463 3052 3420 3474 +3419 3480 3461 3475 +675 2010 3360 3223 +3423 3416 3417 3070 +3422 3418 3333 3374 +3428 3505 3497 9 +4902 406 3489 3074 +1094 3449 4880 5221 +3086 3560 3445 2904 +3424 86 106 3417 +2488 3448 3412 3413 +3461 3480 379 3484 +3433 4242 636 721 +4907 4903 4236 3371 +3431 4241 470 29 +1037 4708 108 1801 +4726 473 4871 292 +5100 3453 3441 4726 +3446 473 4683 4883 +3440 3453 685 463 +3542 3403 3116 3564 +3467 3441 3438 3461 +3083 3436 3440 3494 +711 4871 2852 3491 +4302 5099 5300 5065 +5056 4892 830 4208 +715 3427 3538 3117 +4243 3437 2845 4877 +3463 3496 3052 3519 +2667 3035 3429 3450 +915 3329 3426 5129 +470 473 4242 3448 +687 662 5211 606 +4790 5235 5276 5213 +3436 3454 3438 3104 +876 5100 3330 3453 +3230 4880 3329 930 +5297 5249 5099 4851 +5323 5321 5202 5319 +3502 2488 2945 3496 +3561 2945 1131 3503 +3402 3183 687 700 +3494 3420 3430 3440 +3469 3472 3240 3243 +3494 3447 3419 22 +563 3471 3481 3508 +3561 3537 3580 3114 +17 3522 3523 2617 +95 3083 685 3440 +2087 3516 3107 3389 +3462 3368 2087 2624 +3050 3511 3240 2782 +3464 3390 3537 3114 +3504 3462 3096 3250 +3096 2593 3504 3588 +3419 136 3475 22 +3478 3420 3474 95 +3380 3487 3402 695 +3486 3382 694 3201 +3475 3389 3516 2804 +3562 2488 457 3399 +3499 3430 3420 3515 +563 3464 3507 3534 +457 2488 3505 9 +3069 3714 3724 451 +728 3485 3430 463 +379 3484 3491 4871 +3477 3487 3181 3161 +3486 694 3476 2804 +3511 3489 728 406 +3490 3491 3488 3425 +3489 3392 3492 3415 +3485 3489 3492 3442 +3493 3491 3490 434 +3035 3404 3497 3492 +292 3463 3461 3441 +3372 3524 62 3052 +2667 3500 3447 3458 +86 3424 3498 3493 +3497 3500 3499 3404 +3517 3498 3501 3480 +3501 3498 3502 3496 +3499 3500 3372 3052 +3500 3505 3503 3458 +3502 3506 3197 3459 +3473 3050 3472 3369 +3424 3506 3502 3482 +3148 3503 3505 335 +3533 3510 3537 3481 +3521 3464 3540 3534 +3692 3690 3689 3882 +3568 3135 3507 3557 +3470 3043 3513 3488 +3043 2593 3517 86 +3511 3515 3514 728 +3368 3513 3516 2800 +3513 3517 3516 3480 +3514 3515 3468 3478 +3515 3512 3518 3499 +3517 2593 3107 270 +714 3526 3524 3447 +912 459 17 3167 +3541 3508 258 557 +3523 3466 3532 3539 +684 3466 3522 3545 +3525 557 3519 3495 +3524 3526 3178 62 +3519 2617 3525 3202 +445 3609 528 3664 +3696 3700 537 3610 +2617 3540 3547 3534 +4123 3644 184 38 +459 3060 3136 3129 +3060 3522 3136 3061 +3562 3507 3561 2945 +3508 3481 3529 714 +3756 3617 3658 3659 +715 3549 3390 3546 +3465 3507 3135 3471 +3560 3376 3445 3585 +3178 3522 3543 3061 +3547 258 3508 3529 +3542 3114 3521 1131 +3549 3541 3544 3439 +3544 258 3545 3539 +3546 3542 3543 3116 +3547 3546 3543 3523 +3536 3544 3545 3140 +563 3545 3540 3529 +3582 3095 2938 3569 +3082 3114 3536 3542 +106 3551 3611 3417 +3550 3558 3132 3375 +537 634 3391 3610 +3572 3558 3565 3101 +3056 634 1129 3611 +3095 3591 3590 715 +3071 3693 3394 3633 +3135 3510 3095 3390 +3553 3551 3588 3367 +3612 499 3148 335 +3427 478 3538 3572 +3575 3533 3465 3459 +3567 3533 3574 3479 +3696 3695 3571 3603 +2983 3376 3585 3439 +3585 3553 3588 3058 +3604 3590 3591 3593 +3619 3568 3578 3562 +3569 3587 3567 3510 +3568 3614 2938 3548 +2266 538 1737 539 +3703 3563 3396 3581 +3576 3553 3560 250 +3620 3574 335 457 +3573 3578 3575 3562 +335 3574 3580 3561 +2332 3132 478 3572 +3039 1124 3038 2296 +3574 3584 2807 3567 +3664 70 4106 3639 +3377 3575 3589 3465 +3571 3603 3582 3591 +3616 3581 3594 3548 +3602 3669 2969 2904 +3606 3391 3618 3578 +3564 3538 3565 3049 +3095 3589 3587 3135 +2807 2938 3586 3568 +3373 3565 3558 3473 +3586 3590 2807 3580 +3589 3555 3566 3377 +3581 3566 3555 3086 +3597 3644 3614 3619 +3607 3610 3162 3566 +3393 3582 3605 2938 +3598 3667 3673 3063 +522 2347 3652 4193 +38 3592 289 3618 +3672 3675 3732 3595 +3616 495 3634 3614 +2213 3396 3617 3692 +3742 3720 3710 109 +3583 3699 3668 250 +3605 3563 3604 3581 +3610 3606 3603 3566 +3606 289 3603 3594 +3584 3605 3604 2807 +3593 478 3612 499 +562 3677 3631 3076 +3679 3527 515 3613 +3593 3552 3528 3604 +3554 3612 3132 3550 +634 3607 3611 3559 +3661 4186 4123 3609 +3393 3592 3599 3569 +3675 425 3386 2507 +3599 3394 495 3582 +3600 3395 3535 3689 +3619 3597 3622 3584 +489 3592 3618 3567 +3625 3391 634 3573 +4493 4337 4751 4068 +3391 3623 4121 3618 +3624 3398 3622 489 +3625 3626 3623 3399 +3624 3620 3627 457 +3624 3627 4158 2135 +3626 3625 3056 517 +3927 3866 3924 3910 +3386 425 3682 2104 +2254 3944 3941 2090 +3608 440 519 3633 +4066 2980 3036 4126 +3631 3071 3634 3556 +3641 3633 516 3599 +3798 3929 3968 614 +4065 3960 496 1473 +523 3879 3886 3072 +3944 3978 4039 3984 +3641 3579 445 519 +4190 4129 924 1777 +3644 3639 184 3634 +3915 2066 3892 2046 +4120 4136 3651 556 +3641 3530 3656 3592 +4448 4297 18 98 +3293 3077 4047 3067 +4031 4006 4005 1708 +520 3911 3649 3718 +3651 4136 3648 3854 +519 3727 523 3054 +34 3643 3649 3925 +113 3596 4448 98 +4182 4200 4132 413 +3957 4195 4197 3893 +4282 3084 1794 1783 +3644 418 70 413 +3076 3678 3884 3819 +3697 3757 3535 669 +3689 3535 3890 3679 +493 3386 3681 3735 +4126 3613 418 3036 +4228 4201 113 638 +2275 3793 4091 4103 +3036 3579 3917 3527 +3699 2280 3668 3736 +3668 3747 3669 2781 +426 3699 3595 3099 +3602 3665 3666 2332 +3583 3666 3740 3704 +3902 3896 3874 535 +3395 2866 200 231 +1124 3676 3598 3063 +2969 3726 3699 3595 +3960 4084 328 3811 +3731 3598 3615 3715 +3672 3684 425 2840 +440 3678 3076 3608 +3873 3657 3677 3858 +4186 3785 3659 3609 +4365 3364 4157 4131 +3660 527 2967 2349 +527 3629 2088 3042 +3782 3761 3855 3877 +3676 1124 2088 401 +3787 235 2027 2228 +3836 3688 3786 3838 +4381 3839 4195 3929 +3686 3746 3738 1672 +3691 3617 3509 3659 +3509 3694 3691 3378 +2866 3689 3690 515 +3693 3509 3600 3883 +3556 3694 3692 3076 +3071 3690 3693 440 +3563 3697 3395 231 +3563 3702 3697 3528 +3695 3696 3658 580 +3726 2969 3739 2388 +3673 3665 3602 3667 +1958 3702 3701 3528 +3704 2781 3700 3162 +2360 3703 3700 3696 +3704 3702 1697 3571 +3701 3703 3669 3086 +3755 2270 3777 429 +924 2011 1129 537 +3842 3881 524 3869 +3920 3947 4041 3797 +3771 407 134 300 +3601 559 531 504 +1981 2001 2027 3815 +3804 3051 577 368 +3714 3736 426 2314 +530 3713 3715 3483 +426 3675 3714 2507 +2331 3753 3719 3739 +530 3165 3721 447 +3040 3847 3854 3648 +2280 3716 3729 3726 +202 3779 3601 2164 +3730 3717 2361 3729 +3969 1967 4003 3810 +3757 2363 552 2284 +4043 583 530 3483 +3726 3729 3732 156 +3698 3719 3673 3725 +34 4106 4120 3650 +3737 3041 234 3747 +3721 3719 3752 3725 +530 3721 1509 3731 +3732 3675 493 3730 +3038 3598 3731 3725 +3816 535 2252 3913 +4172 2048 4187 3075 +4074 3935 4098 3660 +3665 447 2973 3713 +3728 3764 2363 1958 +230 3877 3688 3778 +1123 3716 3740 3698 +2270 3739 3747 3669 +4091 4113 4269 2275 +2306 3601 531 2226 +3825 4038 3962 2040 +635 3793 536 4102 +25 4108 4077 468 +230 2046 1981 3688 +3740 2331 3728 3666 +3775 3763 234 2966 +98 4124 3762 3789 +3788 235 3772 3777 +556 1737 645 4120 +3729 3754 2361 2223 +3716 3770 3754 1123 +3769 3752 3753 448 +3772 3041 3705 3773 +3776 2213 3757 3535 +3756 2360 3723 3658 +1988 3854 533 3866 +617 1712 4258 4149 +4161 4015 4112 3291 +3892 3909 3848 3683 +3397 3749 4073 3920 +3764 3748 2338 3001 +3737 3763 2318 2011 +5212 4806 2770 4773 +4278 4332 4267 4079 +4055 3246 3831 4325 +3867 3818 3891 3880 +3000 3806 3770 3754 +3769 3774 3771 3753 +3709 3770 3773 429 +3790 552 3750 3755 +3774 3790 3771 3755 +3775 3773 3770 234 +3808 3792 3774 3748 +3888 42 3788 3756 +3778 3750 42 3705 +3777 3738 235 509 +558 3720 3799 2021 +599 494 610 3863 +3784 3855 2340 3823 +3888 3889 3683 3878 +3832 349 3075 51 +3781 3824 3888 3788 +3890 3075 349 3679 +2252 3914 3876 3686 +3685 3813 3790 407 +552 3784 3750 3776 +3749 3946 3847 3839 +3787 3791 3772 3773 +3790 3813 2337 3792 +3791 3810 412 3775 +3814 3663 3744 2102 +1981 3822 3815 1672 +3815 3821 3828 531 +1687 3246 3840 252 +3708 3802 2336 4119 +3985 3980 449 3635 +3830 3779 202 253 +3980 3945 2090 3981 +249 4164 4258 4224 +3803 152 2047 3797 +3802 3813 1125 2108 +3712 4028 3805 1644 +3804 1990 3807 2285 +3808 3051 3807 3769 +3806 3805 3809 2361 +3809 3810 3806 3775 +3807 328 3808 3165 +3811 3722 3808 3792 +1967 3810 3674 3961 +3320 4099 3292 2259 +3791 3787 3803 4003 +3793 635 3950 283 +3795 3711 3794 2179 +3733 2252 3874 2316 +4111 174 4043 583 +3768 3869 3881 3850 +3857 526 3868 3657 +3863 3904 3881 649 +3822 3829 3795 2306 +3821 3794 487 1672 +230 2027 3781 235 +3075 3784 2340 2048 +3743 4057 555 4048 +3827 267 1646 4010 +2037 3826 2025 1822 +561 3835 3829 3795 +3828 1661 3830 3821 +4001 419 3829 3799 +4009 4030 3767 596 +3040 1988 1972 3783 +1988 2066 1972 3892 +3922 439 595 2040 +4019 3998 3828 2001 +3838 2046 3915 3686 +3852 3978 3895 2316 +487 3836 2316 3686 +3687 98 520 3789 +3796 2254 3966 532 +4005 598 3944 1661 +3845 3863 3707 3869 +488 3908 3872 3887 +4330 4049 3409 2963 +3842 524 122 526 +4136 3986 3918 614 +4040 3919 3789 3718 +3914 3761 3908 3876 +4325 4438 4478 4055 +3818 3853 649 3870 +330 3912 3886 349 +2277 3942 3837 3906 +649 3863 3870 3850 +325 3758 3718 3649 +3892 3781 3683 230 +4430 3928 1677 4268 +3858 526 3897 3819 +3857 3894 562 3678 +533 2277 3895 3927 +4342 4299 4180 4312 +4448 3956 4250 2347 +3868 3867 3865 3887 +3780 3820 3842 3853 +3867 3896 3865 535 +3864 3898 3862 488 +3925 3628 3758 3912 +3862 3768 3864 2252 +3862 3897 3869 3819 +3818 3868 3707 3842 +3853 3905 649 3850 +3923 645 646 3885 +3873 3843 521 3884 +3894 3872 3879 3678 +3906 3670 3880 3816 +3925 523 3886 34 +3877 3887 3848 3786 +3876 3683 3878 3738 +3883 3877 3782 42 +3637 3873 521 3378 +3905 3874 3891 3768 +3820 3901 3707 3818 +521 3883 3889 3509 +3882 3884 3878 3692 +3887 3883 3872 3657 +3871 3899 3900 3924 +3637 3851 3875 528 +3876 3884 3843 3862 +3890 3782 3784 3776 +3890 330 3782 3882 +3785 3889 3888 3659 +3880 3896 3901 3768 +3642 3833 3761 3855 +3654 4135 4120 3959 +3858 3900 3899 3873 +3837 443 3859 3916 +381 3891 3670 3864 +524 3898 3857 3868 +3897 560 3900 3865 +3054 3894 3885 523 +3898 3885 3894 488 +381 3904 3891 3881 +3906 594 3670 2231 +4450 3976 4061 252 +3901 494 3905 3820 +3904 599 3880 3870 +597 3902 3874 3852 +4125 3361 4916 4858 +3909 3910 3848 3843 +3761 3912 3908 330 +3908 3628 3921 488 +4193 4151 3648 4191 +3866 3909 1988 3851 +3921 3916 3914 3733 +3848 3913 3915 3786 +3914 3916 3642 3836 +3895 3915 3913 2316 +4151 4191 3664 528 +3983 2266 3846 539 +3920 3847 3947 3040 +3762 3919 3708 4144 +3913 3910 3927 535 +2092 1967 3834 482 +3924 556 3926 3871 +3925 3923 3628 3885 +3651 3924 3866 3875 +2231 3923 2266 594 +2231 3859 3628 3921 +620 3856 4347 629 +3980 4464 3635 3687 +3931 539 3934 3942 +3970 3370 3958 3930 +4711 4719 4196 246 +3971 4012 2093 2118 +3930 538 485 597 +3735 4103 2073 4097 +4292 511 4467 4492 +3358 4911 4912 5154 +4223 4139 4147 722 +3073 4650 454 1765 +1418 4863 4705 4912 +3945 3988 378 3630 +3983 3984 3852 3930 +4124 3988 3945 4389 +3630 3841 378 3638 +3941 3946 3943 3800 +3789 3945 4040 3980 +3708 3919 2068 534 +3992 4034 3991 2091 +1721 328 583 3165 +4047 4131 3364 3814 +4291 4785 4636 4555 +2068 4040 378 4039 +559 3969 4003 504 +3981 532 2090 4377 +3370 3968 3959 614 +3861 3306 4407 503 +4442 4381 4250 3654 +3370 3959 3931 1737 +3955 4247 3958 3893 +3961 3636 4140 3674 +4138 4137 3960 3811 +4481 3743 4060 492 +172 1742 640 2093 +2038 3979 3971 982 +4498 4472 4574 4456 +4353 3840 3997 4459 +1514 4546 4516 1474 +4382 3970 3635 3955 +3953 577 3722 3051 +449 3968 4443 3931 +3993 3964 3933 1657 +4386 3994 596 600 +3974 4456 4497 4411 +644 4383 3973 3976 +10 4391 4114 4455 +4127 4358 3903 3974 +3306 2317 4355 4141 +4035 3638 3991 3837 +4010 4011 3964 2101 +3946 3800 3798 3929 +432 3954 3800 4441 +2350 4486 4384 4067 +3942 2277 3986 3918 +3942 3985 3638 449 +3986 4037 3984 3798 +3983 325 3985 3846 +2068 378 3990 598 +3943 3989 3941 3997 +3996 3990 3988 3994 +4041 3987 3989 1708 +3948 3978 1661 487 +3998 4036 3948 2001 +3971 2093 1963 774 +4006 3997 3989 3972 +647 4414 4543 4399 +4041 3989 4073 338 +3988 3994 2254 3966 +1661 598 3992 3835 +4005 4006 4009 2254 +554 496 4137 423 +4002 4004 4005 3830 +4001 4007 2096 1353 +3953 3722 2108 3813 +4031 587 419 4001 +4001 3647 3999 3841 +596 3999 3647 3994 +4021 4009 4008 4002 +4007 591 2037 2076 +3246 4007 3831 3999 +3826 3979 2038 1822 +4081 4012 3979 2074 +4317 3933 4011 2116 +1506 4268 4338 4430 +4463 4461 4441 4377 +4270 4373 1701 3760 +4388 605 4249 4506 +4099 367 4100 224 +4543 4414 4431 4626 +2108 4033 561 3835 +2097 2025 4059 2064 +2096 4030 4042 4007 +2268 2901 585 4259 +2268 615 3326 4262 +4026 4356 4171 1703 +4121 580 924 537 +4024 4295 4299 4180 +4232 4299 4352 4333 +1990 565 3343 3804 +4539 4548 4557 4515 +4048 4021 1469 3831 +4033 595 4004 3647 +226 439 577 565 +4019 2092 4031 1708 +4035 4036 2066 3948 +443 4039 4034 3978 +4034 2068 534 3992 +4039 325 4040 3985 +490 555 4045 3743 +4037 3952 4035 3638 +3946 3952 3847 4037 +3996 3708 3990 2336 +2037 2025 4048 4021 +4103 3817 4097 3724 +4783 4791 776 4669 +4038 565 4084 439 +4271 4226 4207 4147 +3950 3294 3646 283 +4054 4042 3825 4030 +3844 4329 4069 4324 +4447 4564 4508 573 +4401 1504 446 4058 +707 652 4393 4474 +4298 4552 4276 1506 +4055 4359 4057 4048 +3849 4254 4054 3767 +4852 4903 4146 2985 +3825 4479 4058 4054 +4057 4477 3291 4051 +3343 565 1645 4020 +496 4484 1473 3962 +3903 4358 4130 4454 +4141 4280 4067 1791 +5119 1103 3410 5029 +1710 3356 4138 2338 +4140 3636 2999 128 +522 3632 4191 4173 +617 4164 3982 4062 +1765 2018 3621 1785 +4332 1732 4339 4049 +4345 4351 4153 220 +4635 1092 4760 4256 +1791 4073 4280 338 +4072 3762 4124 3996 +4078 3735 4077 3386 +4079 3287 4101 2345 +4780 4704 4668 1137 +3342 4074 3745 567 +4074 3342 2102 3019 +4075 3766 2275 536 +5120 953 4672 4791 +585 4317 267 4011 +4112 4113 4089 1140 +4163 1693 4096 189 +584 490 4045 3674 +4087 1140 4086 3248 +4092 4088 4085 1749 +4088 174 4085 1990 +4086 4097 4087 2246 +4082 4111 2991 174 +4102 4108 536 1096 +4111 3741 4131 3663 +1114 2073 3319 4086 +4476 680 4392 4535 +4356 4276 2944 4410 +4419 2268 4408 1647 +4300 4083 4303 4338 +3935 4043 4088 1509 +469 25 2073 3735 +4017 365 3812 2261 +365 4017 3131 1970 +4075 3290 4222 3131 +3342 4090 3744 3336 +2102 3663 3935 4043 +615 591 4254 3246 +4752 4717 4500 4167 +3727 4151 4197 3579 +3092 858 4775 4963 +3745 2345 4090 2577 +4830 4812 4946 1393 +4450 4130 4306 4468 +514 4089 4091 3817 +2991 3760 4082 93 +4270 3741 4082 2075 +4525 4513 3975 4284 +511 4275 797 4492 +4349 4953 1417 5240 +4955 3352 4967 4804 +3410 4531 5029 4711 +2047 4142 4148 3797 +3893 3643 3727 3751 +724 4025 3398 3622 +4707 5024 1418 4801 +724 418 3613 3530 +4220 4073 3749 3943 +4909 3907 4928 4786 +4175 4174 3661 3632 +4554 4249 4279 3976 +4134 4786 4875 4697 +3640 3401 3398 4158 +579 4110 4061 4292 +3950 514 3680 4091 +4205 4139 3653 3408 +1506 640 4418 4276 +4862 3231 4128 4759 +3893 4195 4136 614 +4135 3649 3643 3846 +4000 3961 4148 482 +3961 4064 4148 412 +4169 4168 3938 4132 +3960 4065 1710 1721 +4062 4164 3977 4228 +4143 4172 4144 4119 +4142 103 529 4148 +4173 3397 4142 3920 +1733 35 4221 4354 +244 4812 4609 4056 +4168 4046 3938 4217 +4137 4138 4143 4119 +2999 1463 3759 491 +3341 4898 4908 461 +34 3911 4106 3917 +4494 4363 30 4444 +2018 1765 1743 4070 +5077 5013 5117 5087 +4589 1839 4601 911 +4697 4872 2664 4273 +4366 3680 4282 1783 +4165 4129 1777 3626 +4731 4747 661 4414 +4483 4161 1783 372 +4482 4373 4160 3760 +633 4493 4682 4370 +4083 4300 4393 4184 +301 4067 3801 4141 +4158 4213 4205 2135 +4182 2347 2980 70 +4105 4771 643 4682 +4176 4147 4139 4215 +503 4224 4209 4139 +4788 1033 4811 5133 +4181 4295 4024 4234 +4173 4142 4174 3734 +4172 4066 4144 51 +4187 4126 658 4172 +4126 3401 658 4199 +4224 4258 4168 497 +2999 3084 4210 128 +18 324 4475 4297 +5325 672 5064 5220 +4026 4327 3860 1669 +2944 4537 4171 4235 +3653 503 4202 4166 +529 4206 1463 103 +162 633 643 4163 +1777 3247 4211 41 +3613 4187 669 3679 +4186 4174 4188 3734 +4187 4189 669 2284 +924 4188 4190 2318 +4189 658 3640 3356 +3917 3911 4066 51 +4384 4462 797 301 +3596 4197 520 3911 +3285 4239 4209 4223 +520 3654 3687 4135 +3168 5031 3932 5028 +2347 3654 4193 4106 +4466 4461 4469 4377 +4200 4202 4206 4175 +4205 3653 4199 3401 +4202 4225 4206 3662 +4199 4182 4201 2980 +5001 4990 4996 4986 +5014 5007 5013 761 +4132 4200 4215 4165 +497 4199 4201 4183 +713 4046 2927 4217 +4927 4978 3444 4830 +4194 4287 249 4169 +4212 4177 2927 3293 +4212 4213 84 4185 +4210 4214 4211 310 +4215 4211 4214 4165 +4213 4212 4217 3406 +4213 4168 497 4205 +4391 10 4506 4487 +4207 4147 4214 721 +5293 4825 5303 4721 +28 657 4982 2016 +4389 4449 18 4124 +4145 4281 4273 4766 +1732 4332 4321 4101 +4245 4194 4271 3938 +4225 3801 4169 4176 +4224 503 4228 4201 +4046 4233 1712 4258 +4985 4981 4993 2378 +4141 4225 3306 3662 +4691 737 1037 1786 +4357 1722 1272 4298 +4427 4643 4336 4619 +4027 4276 4356 172 +4271 4281 4226 3285 +627 4171 4235 1406 +4612 4234 4181 1593 +3341 3432 4869 3364 +3238 130 5094 1102 +4512 4404 4239 4455 +4238 4260 4769 4194 +4683 2657 711 2852 +2657 636 4870 3433 +3431 3450 4243 722 +4242 3446 581 4245 +5136 663 4797 4962 +4243 4768 4274 4223 +4763 158 4722 4311 +4443 4382 4442 3959 +324 178 4375 4250 +4016 4127 4526 4505 +3861 4248 4297 3957 +4487 178 324 4412 +4655 4684 4750 4751 +1004 1422 4818 4823 +4359 4301 4104 4055 +1701 2095 4270 2814 +4750 4634 4071 1451 +4653 4760 4671 4540 +4226 3801 3759 4176 +4268 4022 4419 4418 +4741 4445 433 4239 +4910 5124 3411 4977 +4023 4456 629 422 +591 3311 4359 2037 +3340 4729 4966 471 +4929 5313 686 5328 +5065 664 5064 5279 +4324 3363 3766 536 +2901 4259 3856 4013 +4278 4365 4270 3741 +4255 4269 4015 4113 +4046 4274 4233 4223 +5145 5116 892 75 +4156 4221 4274 4759 +4271 2664 4273 4245 +4446 4115 4391 4520 +4232 4053 4094 4133 +4373 4367 189 1693 +4269 4290 4364 3766 +4378 4127 605 4466 +604 4062 4449 4072 +35 4233 4221 433 +3655 1733 81 4157 +4683 4831 2657 2845 +4539 4476 4512 4114 +4367 4307 4354 1733 +4706 4690 4688 1082 +4360 4455 4407 4209 +627 4605 4361 4335 +4480 604 4386 600 +2095 4372 4278 4332 +3951 4760 4765 4653 +4465 4130 3936 4454 +637 4539 667 4394 +4300 4374 4474 4437 +4026 4171 3073 4361 +4458 575 4488 4390 +4250 4178 3645 4381 +4053 4352 4658 4230 +4026 454 4027 3860 +4294 4163 4096 4429 +4254 4379 615 4387 +5294 5239 3443 5288 +4096 575 4458 4401 +3409 1732 28 1784 +4312 4342 1732 28 +4110 579 4502 4495 +4586 4285 4368 2985 +1763 4714 4423 4679 +1227 1656 4335 1444 +631 1450 4362 284 +4761 4246 1092 4395 +4334 3860 4305 1719 +5176 4998 3252 918 +5305 4315 460 4939 +1023 4833 4314 2395 +4850 4710 4942 4896 +4418 640 4081 4012 +4603 1076 1464 4648 +4663 3254 157 1714 +4585 4622 4565 4509 +4334 4222 1771 3290 +4757 3198 5341 3219 +5141 719 916 4881 +287 4267 4049 2963 +1687 3849 4386 3767 +4451 4420 4405 1689 +4341 4180 2274 274 +4936 4798 4920 4689 +4339 4049 4927 4830 +3340 4987 4980 3844 +637 4567 4539 4745 +4069 4290 4222 3766 +4334 1771 4027 172 +4333 4312 4321 2049 +4309 2274 4288 1770 +4537 4231 4641 4618 +3621 4581 4715 4650 +198 4013 4401 4096 +4340 4069 4344 4329 +4346 4372 4339 1393 +4327 3344 4343 157 +4344 3860 4343 4305 +4345 4342 4341 657 +4345 4346 4342 4339 +4070 4344 4343 4844 +1765 454 4344 4340 +653 3928 4437 1718 +4636 4645 4603 4627 +4705 4681 4116 4911 +1656 4590 4663 1803 +1743 3344 4695 4070 +4298 4027 454 4357 +4465 1687 4386 3966 +30 4285 4530 4145 +4360 4407 4412 3977 +4024 4232 4094 1707 +2095 4230 4372 4352 +3976 4505 4061 4518 +1504 4254 4263 4054 +797 4287 4355 301 +4295 4288 4399 2274 +4638 1410 173 4310 +4152 575 1693 4482 +4278 4369 4365 4869 +4269 4364 4366 3680 +4373 4365 4367 4157 +4366 4368 4277 4285 +4369 4370 4367 4307 +4368 4364 4371 4852 +4371 1272 4368 4162 +4370 4369 4372 1393 +4290 4357 4371 4340 +4366 4277 4015 4161 +4294 4458 4473 170 +4496 4248 4378 4469 +4657 171 4427 1641 +4198 4014 4443 3954 +4279 605 4388 4375 +3326 4301 4380 4398 +4379 1504 2901 4401 +4464 4297 3957 3687 +4247 4443 4463 3968 +4574 4522 4460 3974 +4192 4491 4385 3982 +4462 4384 4494 4444 +4289 4353 4325 3972 +4398 4403 4301 4438 +4378 4016 630 10 +4459 4220 432 3943 +4478 4489 4296 4438 +4521 3975 4216 4275 +4512 4093 4662 4532 +643 1445 4052 4163 +4476 4293 680 4533 +4828 4655 4311 4749 +4425 4433 4426 1159 +4737 4774 4772 4741 +4387 4379 170 4458 +3995 3073 4361 1743 +4599 1486 4621 1480 +4051 4338 4380 4303 +422 1640 4421 4498 +4387 4497 4411 4439 +4445 4532 4446 4238 +4408 4471 4326 1476 +1677 4408 4420 4419 +4287 178 4355 3956 +4405 4406 422 4095 +4419 4410 4418 1508 +4094 4409 4413 1633 +615 4403 3973 252 +4355 4251 511 2317 +4420 2944 4410 1689 +3995 4159 4018 4641 +4436 4625 1839 1095 +4417 640 665 1742 +267 4416 446 1646 +4317 4259 4133 4409 +4095 4406 4259 4409 +4326 1641 4406 4413 +1095 4471 4436 4402 +486 573 680 2943 +4308 4724 1517 1100 +4498 4428 4511 4541 +4396 1450 284 1478 +4396 4600 4602 4645 +4376 4651 4231 4587 +4578 4572 4424 4644 +4553 4437 4430 4300 +3856 171 4429 4013 +4432 631 4664 4018 +4431 4434 1790 4626 +1790 4434 4396 1507 +4432 4600 4433 4616 +4687 1716 4670 173 +4550 4415 4588 4421 +4347 4429 4591 4294 +4439 4390 3849 4387 +4453 4438 4440 4403 +4454 4439 1687 252 +4014 4475 4464 3981 +3957 4469 4463 4247 +4247 4377 4382 3970 +4485 4152 4385 35 +4462 542 4404 4260 +4455 797 4275 4404 +4050 4534 1514 4561 +3645 3306 3861 3652 +4220 4467 2317 4280 +4466 3903 4110 532 +4585 4588 4471 4326 +4540 4579 4671 4508 +4519 4490 4454 4439 +4061 4453 4292 4440 +4446 3975 4287 4238 +648 3973 3965 4262 +4639 4666 4545 4523 +4303 4296 4374 4398 +4468 4465 4389 3966 +4554 654 623 4383 +4469 4496 4014 4198 +4445 4192 4385 433 +4464 4442 4014 4382 +4463 4441 4381 3929 +4459 4292 4467 4353 +4450 4502 4279 4198 +4449 4465 3936 604 +4110 4459 432 532 +4442 4375 4461 4198 +642 4497 648 170 +4451 4421 4509 4405 +4511 4563 3965 648 +2943 4474 4529 4374 +4542 4052 4473 4294 +4178 4495 432 4441 +4284 4394 4093 4525 +4482 4479 575 4058 +4479 4480 4390 3849 +4477 4481 4478 4057 +4481 2350 4478 4289 +4480 4479 4484 3962 +4477 4363 4483 4161 +4484 4482 4485 4160 +4483 4486 4481 4060 +4444 4486 4483 1794 +4484 4485 3982 617 +4216 4251 579 511 +4489 4529 4494 4296 +4488 4491 4490 4390 +4492 641 4489 4453 +4492 4489 4384 2350 +4115 4490 4491 3936 +3621 4734 4162 1785 +4385 4488 4503 4152 +4306 324 4496 4475 +4495 4375 4502 4461 +3973 4470 4517 4403 +4424 3965 4578 4402 +4500 4762 4671 652 +4105 4499 4634 643 +4574 4563 4516 4507 +4466 4306 605 4496 +707 542 4529 4494 +4526 623 4513 650 +4358 4249 4506 4524 +579 4505 4016 4216 +486 4533 4501 4522 +4591 4452 4050 4542 +624 4320 4471 1472 +4565 4617 4611 4573 +4472 4424 4564 653 +4284 4392 4680 4238 +630 4504 4515 4114 +4574 4516 4583 4547 +654 4513 4527 4029 +4501 3967 4514 4549 +4519 644 642 4497 +4524 644 4519 4358 +4517 641 4518 4453 +641 4535 4521 4275 +4520 4525 4524 4391 +651 4507 644 4383 +4457 1400 4580 161 +650 4518 4521 4505 +4476 650 4521 4114 +4504 630 4554 4249 +4515 623 654 4557 +4529 4535 2943 641 +4503 4528 4473 4488 +4737 1445 4771 4354 +5316 4920 4118 5032 +4535 542 4392 4404 +667 4507 4394 651 +4540 4629 4447 4562 +4093 4528 4532 4520 +4548 1474 4582 4567 +4652 4657 4336 4181 +4739 680 4558 573 +4029 4293 4331 4284 +4257 1233 4452 4534 +4424 4571 653 1640 +4508 652 573 4474 +3995 4018 4659 4605 +4653 4762 4559 4753 +1404 4699 1716 4457 +3967 4572 4583 4582 +1513 4548 4514 654 +1513 4536 4547 4029 +1474 1513 4516 667 +4436 4587 4571 1640 +4654 1408 1405 779 +4657 4658 171 4053 +162 4640 171 4429 +4460 4526 630 4127 +4743 4556 4568 3951 +4562 4555 4753 4653 +667 4029 1513 4527 +4561 4755 637 4538 +4795 4738 4584 4544 +4567 1474 4561 637 +4447 4562 4560 4558 +4534 4568 4561 4556 +4472 4564 4501 486 +4511 1514 4563 4050 +4510 232 4320 691 +4628 1434 4630 601 +4536 4560 4568 4331 +4627 4567 4562 4555 +4579 1464 4651 4571 +4971 5174 3411 4999 +4569 612 4550 4541 +4546 1514 4428 4631 +4592 4575 4510 691 +3965 4501 4514 4383 +4573 4576 549 1688 +4593 4575 4592 1211 +4593 4599 1665 1528 +4583 4428 4498 601 +4640 4452 4569 4591 +4523 4637 1408 569 +633 162 4337 4658 +4630 4583 4546 4536 +4546 4578 4514 4582 +4756 4559 4717 4762 +232 4613 4320 4451 +4733 4771 4682 4307 +4427 4550 4588 1641 +4436 4613 4587 4451 +4155 1507 1212 4622 +4633 3288 4350 1800 +4508 653 4579 4437 +4576 4573 4595 1493 +4577 4576 4594 1515 +4599 4593 4596 1420 +4596 4592 4597 626 +4598 4594 4595 1482 +4617 4598 4595 1581 +1486 4596 4597 1512 +4594 4400 4577 1500 +1341 4426 4434 4649 +4155 4628 1159 911 +1341 1449 4426 4778 +1233 4781 4318 4348 +1451 162 4634 4640 +4543 4608 1235 4288 +4665 4607 4621 1665 +4611 4606 4608 549 +4605 4614 4607 627 +4681 4146 4955 683 +4778 4761 4635 4730 +4510 4615 4614 4607 +232 4614 4618 4235 +4619 1212 4585 4588 +4611 4626 4612 4608 +4617 1790 4611 4620 +4434 4649 1212 4619 +4623 4615 4510 4597 +4336 4619 4626 4612 +4231 4616 4618 4613 +284 4621 4615 1486 +4638 4606 4620 4400 +4589 4623 4320 624 +4622 1507 4617 1581 +1505 4637 1400 1479 +1510 612 1434 4415 +4618 4432 4018 4614 +4348 4630 4629 4568 +4645 1510 4566 4601 +4631 1233 4627 4534 +4627 4566 4631 4582 +4629 4630 4644 4572 +4916 4858 1001 4694 +4701 5043 4688 4590 +4671 4256 4500 4604 +4781 4610 4071 4692 +3951 4778 4781 4348 +4675 4580 4624 1459 +4666 4665 4362 4621 +4457 4699 4660 959 +4553 4604 4651 4579 +661 4652 4336 4414 +4692 661 1451 4643 +4231 4651 4642 1076 +4631 1434 612 4428 +4426 4648 4348 4628 +4663 4695 1656 3344 +1082 4688 1656 1227 +4649 4318 4645 1510 +4648 4600 1076 4616 +4658 4652 4337 3939 +4427 4640 4643 4569 +4650 4537 4641 3073 +4291 4257 4544 4556 +4698 1404 4703 4551 +716 4252 4395 4746 +1422 4787 4736 4732 +4537 4552 4376 2944 +4581 4552 4650 4298 +1235 1084 1410 4543 +4665 4639 1227 1663 +566 50 5055 4893 +4779 4680 4739 4392 +4350 566 4646 4319 +4431 248 1341 4731 +4660 1235 4638 4606 +4638 173 4457 1400 +4930 4982 4940 657 +4076 744 5026 1792 +5075 5033 4044 149 +4435 4690 4714 4679 +4499 4257 4634 4452 +5074 5113 5115 4080 +1801 1037 1716 1404 +5040 4818 1422 4821 +4678 1408 1801 4637 +4811 5113 5150 5110 +5314 5336 5344 5059 +383 1405 4675 1317 +4670 1084 4308 1410 +467 4745 4662 4512 +4349 244 4609 4845 +4586 4167 4734 4162 +4878 4283 4240 3437 +4752 4918 4734 4252 +1004 5041 4708 4939 +5115 953 5036 4920 +4435 4728 1801 1505 +4633 4286 4699 4647 +4328 659 4712 1013 +1716 1786 4670 4286 +4229 3322 4833 5045 +4730 4642 4635 1076 +1038 4826 5245 5211 +4717 4700 4632 4752 +4893 1101 4646 4351 +4977 981 4924 5124 +4895 4156 1106 4128 +4654 4704 4701 1797 +4688 4545 4701 4639 +1001 4738 4763 4694 +4698 4633 4699 1802 +5069 5160 5147 5039 +3322 4704 4654 727 +4703 5044 4698 4076 +3940 5057 1417 4349 +1786 4286 5046 4754 +4974 4952 4122 5066 +4685 737 4727 3434 +4946 244 5057 4923 +460 3238 4316 4809 +4118 5032 3932 1012 +4719 5032 4689 2846 +4732 4728 1763 1449 +4308 4728 621 4670 +1451 4751 4337 661 +652 4779 4762 4739 +4584 4694 4718 4105 +4756 4717 4859 4744 +3168 3932 4712 4884 +5167 5034 1022 5106 +1004 4218 5063 5333 +4803 4842 696 4246 +1165 683 4831 4889 +4821 5040 4782 4423 +4807 1112 5060 4973 +4740 484 3435 3436 +4708 621 1422 4728 +4727 4714 4713 4687 +4985 4931 4264 1058 +4610 4731 4692 1341 +4748 4159 4730 4664 +4735 4656 4713 4776 +4928 4786 4586 2985 +4682 4684 4923 4493 +1517 4787 4732 4749 +4656 4792 4824 696 +4744 4397 4530 4766 +4700 4764 4765 4559 +4716 4662 4755 4538 +4871 4829 4726 3104 +4769 4397 4766 4260 +3119 5313 5122 5314 +4795 4753 4745 4555 +4771 4718 4737 3231 +4743 4755 4680 4331 +4751 4747 4655 951 +4159 4748 4746 947 +4747 4731 4749 1517 +4395 4748 4761 4735 +4256 1092 4752 4252 +3621 4715 4252 4746 +4750 4694 4105 4684 +4544 4755 4743 4556 +1939 1344 5053 4706 +4745 4753 4739 4558 +4584 4718 4796 4774 +4322 5337 5072 4973 +4878 4873 1005 4901 +4766 4134 4768 4273 +4071 4291 4781 4257 +4776 4311 4610 4749 +4544 4499 4584 4716 +4700 4765 4246 1092 +4785 4738 4843 4795 +4738 4785 4763 4291 +4741 4737 4759 4221 +5292 4900 5066 4820 +4759 4862 4769 4245 +4768 467 4741 4239 +5179 1022 5034 5166 +4167 4744 4530 4586 +4397 4779 707 542 +3765 3284 4931 3350 +4397 4756 4779 467 +1102 5055 5054 4107 +158 4761 4778 4732 +5292 5136 5309 5066 +4776 4610 4636 4602 +4772 4774 4716 4662 +4822 5044 5088 4076 +4635 4760 4636 4603 +4979 4724 4941 1100 +5101 4044 4798 1049 +4950 5069 5145 1018 +158 4765 4764 3951 +3231 4125 4128 4733 +4656 4821 922 4735 +5152 4170 4811 5134 +4848 104 4825 4808 +3405 5302 4794 3452 +4044 5074 4080 5075 +4855 922 4803 4736 +4937 5095 5083 5023 +5294 5271 543 4790 +4764 4559 4796 4743 +4795 4756 4861 467 +4244 4942 5296 4867 +776 4328 4783 659 +5148 5151 5048 1033 +4857 4915 4842 4803 +4122 4856 4817 4820 +4843 4832 4842 696 +4828 4800 4792 4722 +4830 4117 4812 287 +5296 5059 5321 5127 +3411 5265 4910 3765 +4906 4725 5094 5062 +5226 4835 4819 4789 +4710 4891 4853 5041 +663 5066 3239 4952 +4676 4788 4170 4814 +4109 4804 4146 4852 +3410 5060 4849 1023 +458 5107 4811 5110 +5210 265 5258 5287 +3358 4841 4838 4832 +4837 4801 4855 4834 +4253 4674 4900 4820 +4832 4808 4836 4824 +4818 4801 4767 4834 +4856 4674 4724 4787 +5084 4970 4780 69 +4824 4825 4834 4253 +4819 4823 4855 4736 +4847 4789 4218 4823 +5272 5274 5235 4693 +5312 5243 4929 5345 +922 716 4803 4395 +1005 4901 4868 4740 +4804 4109 4208 4329 +4723 4886 4283 1106 +4802 4816 4857 4819 +130 460 4315 4691 +4820 4817 4847 4823 +4808 14 4837 4848 +4837 4857 4819 4855 +4835 3013 4836 4817 +5226 5154 5224 4816 +5168 3351 3305 4925 +4898 4922 4956 4908 +3361 4876 4816 4860 +4802 4800 1001 4722 +4860 4802 1001 4764 +4927 220 4940 4345 +4909 4681 4911 4889 +5255 5238 5215 3355 +4834 4848 5270 4825 +4835 4948 4847 4789 +5305 5322 5306 4813 +5318 5305 5306 4316 +5308 5311 3456 5140 +4869 4056 4812 4369 +5063 4809 4900 1004 +4968 1056 4994 414 +4792 4836 4817 4824 +922 4801 5024 4821 +4832 4913 4800 4836 +4860 3907 4859 4632 +3231 4861 4858 4718 +4861 4841 4858 4843 +4862 4860 4859 4796 +4861 4134 4877 4768 +5057 3940 5025 4917 +5058 4892 3359 3353 +108 2395 3322 727 +4947 3108 5283 5232 +4797 5062 3219 1725 +4829 4879 5278 3104 +4852 3363 4236 4364 +1119 4899 4241 1671 +4740 3435 3442 3485 +4895 81 4156 1733 +1165 265 4758 373 +4875 4876 4889 4909 +1106 4877 4874 4128 +5289 4874 4877 4841 +3446 4876 4875 4862 +4883 1165 4758 4683 +4890 5233 4868 3196 +4881 3426 3455 5222 +4880 5291 1094 4323 +5242 5294 543 5272 +484 5289 4878 3437 +4719 674 2846 3 +4933 621 737 1786 +683 4907 4831 4903 +4899 4908 4902 3074 +1008 4949 4990 4991 +4845 4723 5228 4874 +4947 4879 4897 2799 +3239 4900 4809 4933 +1055 4864 3444 220 +3353 1939 4661 4695 +5064 664 5298 4989 +4697 4903 4872 2985 +5063 3332 4316 5318 +4902 4922 4901 4890 +4840 4967 4969 4150 +2657 4907 4887 4870 +4767 4853 4891 4818 +4897 4758 711 4829 +4887 4897 711 3425 +3432 4886 4056 4895 +5008 5023 3337 837 +5033 5077 5031 5028 +5096 5095 4807 5009 +4899 4886 4908 3432 +4887 4907 4840 4150 +3361 4125 4845 4874 +4261 4806 5279 3331 +4845 4349 3937 5262 +4913 3937 3940 3013 +4915 3358 4912 4857 +5070 5338 4926 1030 +4916 4913 4917 4800 +4918 3907 4915 4632 +4915 4863 4918 716 +4923 4916 4917 4684 +5008 5171 24 1120 +5050 4686 4328 4531 +24 4968 5022 4975 +373 4840 4947 4897 +4709 4928 4918 4734 +4989 830 5058 4696 +4839 5120 5051 1020 +5121 4914 5012 5131 +4208 4844 4987 4329 +244 4125 4923 4733 +686 4827 4265 5315 +3254 1008 4935 4667 +2770 4773 4729 438 +5011 1019 5216 1015 +5040 4885 4891 1344 +5200 137 4999 5187 +50 4930 4945 4940 +4328 101 5101 1006 +5007 5042 5013 4793 +5132 5130 5332 5133 +4314 1010 4685 5317 +4667 4987 4935 4844 +1939 3359 1344 4782 +4316 3238 5062 4797 +5214 5267 5213 5180 +5174 5227 5266 137 +4935 4990 3092 4986 +4109 4709 5056 1785 +3147 4866 4922 4890 +5270 709 5137 4848 +1983 4988 4888 5016 +5153 5162 4784 282 +955 5079 5097 46 +4707 5058 3359 4810 +3352 4955 5280 4116 +3239 3238 663 1102 +4956 4953 4117 4609 +4955 4840 373 683 +5014 5077 5168 5033 +5293 3332 5292 5063 +3340 4986 4987 4976 +5103 5178 5175 5078 +5010 5211 5252 662 +4963 5220 1700 4244 +4962 4107 981 663 +3252 4998 5189 387 +4966 4969 4967 471 +4965 4972 3284 4264 +4965 4898 4117 287 +464 5187 4921 4854 +4965 3147 4898 90 +1040 3288 4822 48 +5220 5126 4570 1700 +3352 3331 4966 4976 +4757 5306 4725 5062 +4707 1418 4989 5298 +4992 5016 4921 1075 +4977 4978 4959 4972 +4696 4976 4986 4261 +830 4208 4976 3352 +5037 5024 3359 4782 +4981 4330 4982 3409 +4227 4980 4983 2803 +4983 4980 4667 4219 +4984 4981 4982 2563 +4991 4983 1008 143 +4227 4996 3340 4729 +4203 4945 4959 4977 +4330 4959 4940 4927 +4990 4949 858 5195 +1417 4924 4974 4894 +4888 4988 4945 4203 +4992 4993 4888 4984 +4994 4991 4975 2553 +4994 4996 4991 4227 +4854 4993 4992 417 +5198 5000 5199 5186 +4203 4993 5188 4985 +5190 957 3261 1167 +5191 4964 4313 925 +4934 4570 5195 5001 +4995 5227 137 1118 +3411 4999 5188 4203 +788 5126 5201 672 +137 5097 5187 955 +1056 5142 2770 82 +3305 3351 5015 5070 +5014 5168 5078 5103 +4204 5061 4937 3337 +4904 5184 5021 4919 +5197 5135 1725 4906 +4961 5231 5267 5215 +5167 5125 5129 4932 +5132 5269 3244 4926 +4204 4937 4154 5086 +4957 5006 4204 544 +5144 5005 1112 5072 +5022 4949 5017 4975 +5018 5016 1983 1145 +5017 5083 5023 632 +916 5020 3235 5198 +3219 5019 5155 1725 +5022 5023 5199 5008 +5016 5021 5200 4921 +4793 5021 5018 4904 +4979 5025 4122 4856 +5037 4863 5024 716 +5027 5089 246 4668 +5087 5026 5028 1177 +4905 5027 4196 1175 +5031 4063 5050 4118 +484 5210 5290 5247 +5029 776 4905 4196 +4712 4711 4531 1010 +4905 4669 4957 185 +904 4770 4720 5165 +5204 5194 930 909 +5330 5133 5068 4686 +1055 5025 4979 951 +5102 925 1019 918 +4702 845 5114 999 +4933 4674 621 4724 +4809 737 4685 460 +5144 1112 4937 5095 +5046 5044 3288 4633 +5043 5045 4780 4704 +5044 5046 130 4691 +5053 5045 5043 4706 +5054 1040 5082 1983 +1002 5116 4799 5067 +5093 5178 5182 2836 +4920 776 953 5029 +4925 5110 904 5165 +5169 5106 5156 5161 +5046 5055 1102 4754 +5096 4775 5047 858 +5053 3242 4775 4661 +1055 3444 5057 4946 +4863 5056 4705 4709 +4952 4924 4864 981 +3332 720 4805 4677 +4725 5117 5090 4813 +5080 5078 5093 5007 +4973 4942 4807 4867 +4896 4853 4958 4721 +4894 4179 4266 5124 +3443 4266 5307 5284 +4810 4777 4767 4707 +574 101 5048 1011 +5107 1030 5036 5118 +5159 4702 4784 1017 +4914 5121 5072 5005 +5250 5230 5252 729 +5070 3198 4757 5015 +5114 1016 574 962 +4672 1016 5114 4791 +845 1020 4791 4669 +3198 91 5208 1094 +1103 4957 4154 4905 +4960 5061 5081 5006 +5207 4951 2833 3262 +5177 5081 5061 5144 +474 5078 5080 3305 +5083 5096 5084 5047 +4793 5082 5085 5018 +5085 5082 5088 4822 +5086 5083 5084 1156 +5085 5087 5013 1157 +5086 5089 4154 5027 +5089 5084 5091 4780 +5090 5087 5088 5026 +5089 5091 5060 1023 +5094 5090 5088 130 +5192 882 77 5181 +5049 5183 5061 3337 +5096 4807 5091 4237 +5042 4906 4793 5197 +4906 5094 5082 5054 +5142 5003 5237 4951 +925 5102 77 3217 +3456 3443 5239 5311 +5247 3454 5245 3436 +4936 1016 4783 1047 +5038 5157 5098 3098 +5169 5104 4960 5006 +3261 2880 5103 639 +5178 2880 5189 2836 +5052 5175 5176 4720 +5133 5131 5068 4814 +5213 5180 5209 5128 +2842 5111 681 5301 +5120 4814 5051 4676 +5109 1083 5225 5319 +3153 2835 935 906 +1033 5149 4676 4672 +5073 5147 5074 5039 +101 4672 1033 4686 +4272 5146 5048 574 +4154 1112 1103 5060 +5119 5068 5120 953 +5118 3351 1030 4063 +4925 5118 5110 4080 +4926 91 5070 3211 +5243 5312 4742 5223 +2842 1481 3315 5128 +5220 4261 5064 4696 +1022 3329 5011 1019 +5174 5002 5155 4971 +5341 5244 4805 3219 +5123 5201 5108 3405 +5011 3449 474 5221 +3244 686 4938 5335 +4926 5107 5132 458 +5332 5012 4938 5131 +5036 4938 5107 4170 +4788 5332 458 5179 +5195 1700 5009 858 +5325 4777 5296 4244 +5324 5261 4948 104 +5334 5314 3119 5303 +5343 5345 5326 3230 +4851 5154 5226 14 +5291 3315 1481 4323 +5097 5238 5004 3347 +892 1002 5153 971 +5015 5042 5080 3321 +4784 5146 5153 4272 +5148 5145 5147 5116 +5149 5146 4702 5114 +5149 5151 5146 4799 +5150 5148 5147 5113 +5164 5152 5149 4676 +5153 5148 5152 4799 +5166 5151 5150 4788 +4950 5145 5151 5143 +5262 4838 5140 3937 +5126 788 916 5020 +5190 5052 5176 5158 +3221 5193 5102 3227 +5156 5159 5163 656 +5158 5160 5162 5069 +5164 5159 5161 4702 +5052 5165 5160 833 +5159 5166 5163 4950 +2895 5158 5162 927 +5165 5166 5160 5150 +5164 5161 5034 5051 +4770 5162 5164 5152 +474 4720 5011 5175 +5006 4957 4839 1020 +5103 5052 3261 833 +5173 5172 906 63 +5173 5184 5172 4919 +5171 5181 5170 849 +929 5171 5170 673 +5264 5126 4944 4570 +5106 4960 5191 5167 +5106 4313 5156 2895 +5080 5185 5221 3321 +5191 4960 5105 5049 +697 4770 901 5134 +5256 5108 4943 5251 +5182 5092 5172 1170 +5181 5183 882 5049 +5185 5182 5184 5093 +5186 5183 5171 5008 +5217 5183 5186 5177 +1118 5185 5184 4995 +4934 5003 1056 4968 +2770 5001 1056 4996 +1032 4964 5105 809 +3253 4997 5156 656 +5178 4998 5175 1015 +935 5092 5193 906 +77 5157 5192 3225 +5206 917 5035 2854 +5200 4999 5135 4988 +5251 5256 719 5204 +5009 5198 5199 5095 +5197 5019 4995 3321 +4995 5200 5197 5021 +4934 5195 5199 5022 +5002 5209 5128 5307 +5223 5261 720 3457 +1118 5205 2835 5218 +5196 5206 5205 5035 +5204 5203 719 5222 +5207 2833 5204 5194 +3236 5079 5206 3186 +5326 5299 5268 5076 +5108 5264 5263 5201 +4815 5030 1005 441 +3274 4693 4961 3451 +5255 5265 5238 3765 +3452 4943 5248 5108 +3274 4943 5235 909 +4846 3273 5010 675 +5217 4932 5219 882 +5221 5216 5218 5185 +5222 5217 5219 5203 +1069 5218 5216 935 +4971 5124 4179 4962 +3426 5129 5217 5177 +5218 930 4880 5205 +5304 5202 5122 5319 +5289 5290 5254 4838 +5111 5241 681 5304 +5297 5140 4838 4808 +4944 916 719 5000 +5289 5254 1165 4889 +5303 720 5261 5293 +5234 5071 5233 723 +5248 5252 5253 5010 +5234 5233 5286 4866 +5278 5232 5230 4879 +5230 5232 5253 3275 +5302 4826 3452 5214 +3230 3245 3315 909 +3236 5238 5266 5097 +5212 5237 4846 5142 +5242 5099 4302 5258 +5280 5260 664 4116 +543 1083 5295 5225 +5239 4882 5297 5290 +5313 4827 5122 5329 +5259 5321 5127 788 +5100 876 4693 479 +5285 5248 5253 5263 +5273 5100 5272 5030 +5246 5276 5231 5213 +5295 5320 3456 5324 +5071 1038 3330 876 +3315 5180 5196 909 +5071 5231 1038 4961 +5246 5231 5234 5255 +5224 5257 5228 5262 +4846 5253 5212 3275 +5266 5180 3236 5196 +5254 5258 265 5260 +5257 5290 4815 5239 +5244 5342 5301 1481 +5311 5257 5262 5240 +5229 5202 3218 5137 +5260 5254 5154 4911 +5209 5265 5246 5284 +5265 5209 5266 5174 +5263 5264 5212 4806 +5237 5264 5256 4944 +3274 5010 4943 3273 +5208 5269 5343 91 +5328 5315 5268 5012 +5293 5292 4948 4847 +5300 1083 4794 3405 +4882 5275 4826 5247 +441 3330 5275 5247 +5276 5275 1038 4826 +5274 5277 5273 5272 +5248 5277 5274 3452 +5288 5275 5276 5294 +3330 441 5233 4868 +5281 4266 5284 4910 +5240 5281 5282 4953 +5279 5283 5280 3331 +265 5280 5283 373 +5286 5282 5281 4866 +5279 5065 5285 5263 +5284 5288 5286 5246 +5283 5285 5287 5232 +5286 5288 4815 441 +4302 5287 5285 5277 +5224 5228 4883 4876 +5030 5258 5224 5242 +5326 3230 5141 4881 +5270 4958 4777 4767 +4958 5270 5229 4218 +4882 4302 4794 5277 +5297 5241 5249 104 +4805 5136 3332 4797 +5295 3456 5242 5226 +5308 5309 4894 4974 +5327 5208 5342 5341 +5271 3443 5320 5307 +5319 5259 5329 5109 +3245 543 4790 5235 +5138 5229 3218 4218 +3218 5223 5312 5225 +5317 4849 4850 4314 +4849 5337 4850 4973 +5065 672 5300 5201 +709 5298 4851 14 +5298 709 5325 4777 +672 5325 5323 5321 +664 5099 4851 5260 +4827 3119 5122 5304 +4742 4265 5243 5327 +4677 4742 5138 720 +5343 5269 4929 5332 +5317 5330 5322 4531 +5316 5305 5333 4939 +5336 5333 4850 4896 +3457 5301 5223 5111 +1083 5300 5249 5323 +4805 3457 5310 5244 +5331 4849 5316 3410 +5320 5310 5324 3457 +5249 5323 709 5137 +4179 5309 5310 5136 +5208 5139 5342 5291 +5328 5299 5313 5344 +5327 4265 5269 3244 +5345 5243 5342 5301 +5316 5335 5331 5036 +5322 5330 5338 1030 +5132 4938 5315 5134 +5334 5317 5318 4721 +5333 5336 5335 5138 +5334 5339 5330 5130 +5340 5334 5318 4677 +5340 5338 4757 5306 +4914 5337 5339 5331 +5338 5340 3244 5335 +5344 5339 5337 5336 +4322 5299 5344 5127 +5329 5299 5326 5259 +5315 5139 5268 697 +5341 5327 5340 4677 +4827 5329 5139 681 From d91d010ee7eeb40a84aa8650ff341413bd48cae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:07:48 +0200 Subject: [PATCH 0440/1398] add missing includes --- .../include/CGAL/Arr_point_location_result.h | 1 + .../internal/tetrahedral_remeshing_helpers.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h index 4651b64c4dd6..50aa748ba724 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h @@ -15,6 +15,7 @@ #include #include +#include #include #include diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h index 07848cbe492f..1c4237191d0c 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h @@ -24,6 +24,7 @@ #include #include #include +#include #include From f31d41c1f280aae5030040a0d2c89d02bf4c4ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:08:31 +0200 Subject: [PATCH 0441/1398] missing include --- Envelope_3/include/CGAL/Env_sphere_traits_3.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Envelope_3/include/CGAL/Env_sphere_traits_3.h b/Envelope_3/include/CGAL/Env_sphere_traits_3.h index bec2a5b72a94..2a42d07f0a02 100644 --- a/Envelope_3/include/CGAL/Env_sphere_traits_3.h +++ b/Envelope_3/include/CGAL/Env_sphere_traits_3.h @@ -25,6 +25,8 @@ #include #include +#include + namespace CGAL { template From 9e22fdfcb8df6333d59df93a80b2114820f87c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:08:57 +0200 Subject: [PATCH 0442/1398] iformat for optional --- Stream_support/include/CGAL/IO/io.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index 8634c38f88dd..3460398bea9e 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -267,6 +267,19 @@ class Input_rep std::istream& operator()( std::istream& is) const { return (is >> t); } }; +template +class Input_rep> +{ + std::optional& t; + +public: + //! initialize with a reference to \a t. + Input_rep( std::optional& tt) : t(tt) {} + + //! perform the input, calls \c operator\>\> by default. + std::istream& operator()( std::istream& is) const { return (is >> t.value()); } +}; + #if CGAL_FORCE_IFORMAT_DOUBLE || \ ( ( _MSC_VER > 1600 ) && ( _MSC_VER < 1910 ) && (! defined( CGAL_NO_IFORMAT_DOUBLE )) ) From a32483d885d1672c3d1e9fa5d68574e0e67acd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:09:18 +0200 Subject: [PATCH 0443/1398] use iformat --- .../include/CGAL/Curved_kernel_via_analysis_2/Point_2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index c134c8cc9011..2d194eb5254c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -736,13 +736,13 @@ class Point_2 : swallow(is, '('); // read values - is >> rep._m_xy; + is >> iformat(rep._m_xy); swallow(is, ','); - is >> rep._m_x; + is >> iformat(rep._m_x); swallow(is, ','); - is >> rep._m_curve; + is >> iformat(rep._m_curve); swallow(is, ','); - is >> rep._m_arcno; + is >> iformat(rep._m_arcno); swallow(is, ','); is >> rep._m_location; From 8bc01b14a92734b96c7b52649c7907b1168a445a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:28:28 +0200 Subject: [PATCH 0444/1398] add missing include --- Random_numbers/include/CGAL/Random_impl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Random_numbers/include/CGAL/Random_impl.h b/Random_numbers/include/CGAL/Random_impl.h index 675ed05e814e..3c66dc5d31c3 100644 --- a/Random_numbers/include/CGAL/Random_impl.h +++ b/Random_numbers/include/CGAL/Random_impl.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace CGAL { From b1465645adc0ac9b420d7fc5952b3b54b1f4dc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 29 Jun 2023 18:48:15 +0200 Subject: [PATCH 0445/1398] fix variant output --- Stream_support/include/CGAL/IO/io.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index 3460398bea9e..6a5fa185e6b0 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -191,13 +191,15 @@ class Output_rep template class Output_rep, F> { - const std::optional& t; + const std::optional& t; public: Output_rep( const std::optional& tt) : t(tt) {} - std::ostream& operator()( std::ostream& os) const { + std::ostream& operator()( std::ostream& os) const + { if (t==std::nullopt) return (os << "--"); - return (os << t.value()); } + return (os << t.value()); + } }; template @@ -207,8 +209,10 @@ class Output_rep, F> public: Output_rep( const std::variant& tt) : t(tt) {} - std::ostream& operator()( std::ostream& os) const { - return (os << "--"); + std::ostream& operator()( std::ostream& os) const + { + std::visit([&os](auto&& v) { os << v; }, t); + return os; } }; From a6330295a6817038712b4de6fd3da23706a7a16c Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 30 Jun 2023 07:56:10 +0100 Subject: [PATCH 0446/1398] Fix for deprecated warning --- .../CGAL/Qt/manipulatedCameraFrame_impl.h | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h index 885ce76c7c20..6acb02247465 100644 --- a/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h +++ b/GraphicsView/include/CGAL/Qt/manipulatedCameraFrame_impl.h @@ -193,7 +193,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, } case MOVE_FORWARD: { - Quaternion rot = pitchYawQuaternion(event->x(), event->y(), camera); + Quaternion rot = pitchYawQuaternion(event->position().x(), event->position().y(), camera); rotate(rot); //#CONNECTION# wheelEvent MOVE_FORWARD case // actual translation is made in flyUpdate(). @@ -202,7 +202,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, } case MOVE_BACKWARD: { - Quaternion rot = pitchYawQuaternion(event->x(), event->y(), camera); + Quaternion rot = pitchYawQuaternion(event->position().x(), event->position().y(), camera); rotate(rot); // actual translation is made in flyUpdate(). // translate(inverseTransformOf(Vec(0.0, 0.0, flySpeed()))); @@ -210,10 +210,10 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, } case DRIVE: { - Quaternion rot = turnQuaternion(event->x(), camera); + Quaternion rot = turnQuaternion(event->position().x(), camera); rotate(rot); // actual translation is made in flyUpdate(). - driveSpeed_ = 0.01 * (event->y() - pressPos_.y()); + driveSpeed_ = 0.01 * (event->position().y() - pressPos_.y()); break; } @@ -223,7 +223,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, } case LOOK_AROUND: { - Quaternion rot = pitchYawQuaternion(event->x(), event->y(), camera); + Quaternion rot = pitchYawQuaternion(event->position().x(), event->position().y(), camera); rotate(rot); break; } @@ -233,9 +233,9 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, if (rotatesAroundUpVector_) { // Multiply by 2.0 to get on average about the same speed as with the // deformed ball - qreal dx = 2.0 * rotationSensitivity() * (prevPos_.x() - event->x()) / + qreal dx = 2.0 * rotationSensitivity() * (prevPos_.x() - event->position().x()) / camera->screenWidth(); - qreal dy = 2.0 * rotationSensitivity() * (prevPos_.y() - event->y()) / + qreal dy = 2.0 * rotationSensitivity() * (prevPos_.y() - event->position().y()) / camera->screenHeight(); if (constrainedRotationIsReversed_) dx = -dx; @@ -243,7 +243,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, rot = Quaternion(verticalAxis, dx) * Quaternion(Vec(1.0, 0.0, 0.0), dy); } else { Vec trans = camera->projectedCoordinatesOf(pivotPoint()); - rot = deformedBallQuaternion(event->x(), event->y(), trans[0], trans[1], + rot = deformedBallQuaternion(event->position().x(), event->position().y(), trans[0], trans[1], camera); } //#CONNECTION# These two methods should go together (spinning detection and @@ -257,7 +257,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, case SCREEN_ROTATE: { Vec trans = camera->projectedCoordinatesOf(pivotPoint()); - const qreal angle = atan2(event->y() - trans[1], event->x() - trans[0]) - + const qreal angle = atan2(event->position().y() - trans[1], event->position().x() - trans[0]) - atan2(prevPos_.y() - trans[1], prevPos_.x() - trans[0]); Quaternion rot(Vec(0.0, 0.0, 1.0), angle); @@ -272,7 +272,7 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, case ROLL: { const qreal angle = - CGAL_PI * (event->x() - prevPos_.x()) / camera->screenWidth(); + CGAL_PI * (event->position().x() - prevPos_.x()) / camera->screenWidth(); Quaternion rot(Vec(0.0, 0.0, 1.0), angle); rotate(rot); setSpinningQuaternion(rot); @@ -284,9 +284,9 @@ void ManipulatedCameraFrame::mouseMoveEvent(QMouseEvent *const event, Vec trans; int dir = mouseOriginalDirection(event); if (dir == 1) - trans.setValue(prevPos_.x() - event->x(), 0.0, 0.0); + trans.setValue(prevPos_.x() - event->position().x(), 0.0, 0.0); else if (dir == -1) - trans.setValue(0.0, event->y() - prevPos_.y(), 0.0); + trans.setValue(0.0, event->position().y() - prevPos_.y(), 0.0); switch (camera->type()) { case Camera::PERSPECTIVE: From b5b261cfc27026619d4bca77d62c3149d254e108 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 3 Jul 2023 18:45:51 +0200 Subject: [PATCH 0447/1398] Add support for REUSE https://reuse.software/ The directories `.reuse/` and `LICENSES/` are for the Git layout. The same directories in `Installation/` are for the tarball layout. I have verified that with this patch `v5.5.2` and its release tarball are compliant with the REUSE specifications. The shady part is the file `.reuse/DEP5`, kind of equivalent to that paragraph in `LICENSE.md`: > A lot of files in the Git repository are not distributed in the source > tarballs, for examples all the files in the `doc/` and `test/` > sub-directories of CGAL packages. For all those files, unless they > have an explicit license notice, the license is the > Creative Commons CC0 1.0. We should review the list of files corresponding to the pattern in that file `.reuse/DEP5`. --- .reuse/dep5 | 12 + .../AlgebraicCurveParser.cpp | 2 +- .../AlgebraicCurveParser.h | 2 +- Installation/.reuse/dep5 | 12 + Installation/LICENSES/BSL-1.0.txt | 23 + Installation/LICENSES/CC0-1.0.txt | 121 ++++ Installation/LICENSES/GPL-2.0-or-later.txt | 340 +++++++++ Installation/LICENSES/GPL-3.0-only.txt | 674 ++++++++++++++++++ Installation/LICENSES/GPL-3.0-or-later.txt | 674 ++++++++++++++++++ Installation/LICENSES/LGPL-2.1-only.txt | 178 +++++ Installation/LICENSES/LGPL-3.0-only.txt | 165 +++++ Installation/LICENSES/LGPL-3.0-or-later.txt | 165 +++++ .../LICENSES/LicenseRef-Commercial.txt | 6 + Installation/LICENSES/LicenseRef-RFL.txt | 19 + Installation/LICENSES/MIT.txt | 17 + LICENSES/BSL-1.0.txt | 23 + LICENSES/CC0-1.0.txt | 121 ++++ LICENSES/GPL-2.0-only.txt | 340 +++++++++ LICENSES/GPL-2.0-or-later.txt | 340 +++++++++ LICENSES/GPL-3.0-only.txt | 674 ++++++++++++++++++ LICENSES/GPL-3.0-or-later.txt | 674 ++++++++++++++++++ LICENSES/LGPL-2.1-only.txt | 178 +++++ LICENSES/LGPL-3.0-only.txt | 165 +++++ LICENSES/LGPL-3.0-or-later.txt | 165 +++++ LICENSES/LicenseRef-Commercial.txt | 6 + LICENSES/LicenseRef-RFL.txt | 19 + LICENSES/MIT.txt | 17 + ccpp.yml | 12 - 28 files changed, 5130 insertions(+), 14 deletions(-) create mode 100644 .reuse/dep5 create mode 100644 Installation/.reuse/dep5 create mode 100644 Installation/LICENSES/BSL-1.0.txt create mode 100644 Installation/LICENSES/CC0-1.0.txt create mode 100644 Installation/LICENSES/GPL-2.0-or-later.txt create mode 100644 Installation/LICENSES/GPL-3.0-only.txt create mode 100644 Installation/LICENSES/GPL-3.0-or-later.txt create mode 100644 Installation/LICENSES/LGPL-2.1-only.txt create mode 100644 Installation/LICENSES/LGPL-3.0-only.txt create mode 100644 Installation/LICENSES/LGPL-3.0-or-later.txt create mode 100644 Installation/LICENSES/LicenseRef-Commercial.txt create mode 100644 Installation/LICENSES/LicenseRef-RFL.txt create mode 100644 Installation/LICENSES/MIT.txt create mode 100644 LICENSES/BSL-1.0.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 LICENSES/GPL-2.0-only.txt create mode 100644 LICENSES/GPL-2.0-or-later.txt create mode 100644 LICENSES/GPL-3.0-only.txt create mode 100644 LICENSES/GPL-3.0-or-later.txt create mode 100644 LICENSES/LGPL-2.1-only.txt create mode 100644 LICENSES/LGPL-3.0-only.txt create mode 100644 LICENSES/LGPL-3.0-or-later.txt create mode 100644 LICENSES/LicenseRef-Commercial.txt create mode 100644 LICENSES/LicenseRef-RFL.txt create mode 100644 LICENSES/MIT.txt delete mode 100644 ccpp.yml diff --git a/.reuse/dep5 b/.reuse/dep5 new file mode 100644 index 000000000000..62552ffe07cc --- /dev/null +++ b/.reuse/dep5 @@ -0,0 +1,12 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: CGAL +Upstream-Contact: CGAL Editorial Board +Source: https://github.com/CGAL/cgal + +Files: .* *.cmake *.md .github/* Maintenance/* */TODO */doc/* */deb/* */applications/* */doc_html/* */scripts/* */developer_scripts/* */demo/* */examples/* */src/* */test/* */benchmarks/* */benchmark/* */package_info/* */data/* */cmake/* +Copyright: 1995-2023 The CGAL Project +License: CC0-1.0 + +Files: CMakeLists.txt GraphicsView/include/CGAL/Qt/resources/ImageInterface.ui GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm Installation/AUTHORS Installation/CMakeLists.txt Installation/README Installation/auxiliary/cgal_create_cmake_script.1 Installation/auxiliary/gmp/README Installation/include/CGAL/license/gpl_package_list.txt MacOSX/auxiliary/cgal_app.icns copyright +Copyright: 1995-2023 The CGAL Project +License: CC0-1.0 diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp index 009eede6a798..d54d5242074e 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp @@ -12,7 +12,7 @@ // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // -// SPDX-License-Identifier: GPL-3.0+ +// SPDX-License-Identifier: GPL-3.0-or-later // // Author(s): Saurabh Singh // Ahmed Essam diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h index e838f2e3c0db..5e8ac4b0fd20 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h @@ -12,7 +12,7 @@ // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // -// SPDX-License-Identifier: GPL-3.0+ +// SPDX-License-Identifier: GPL-3.0-or-later // // Author(s): Saurabh Singh // Ahmed Essam diff --git a/Installation/.reuse/dep5 b/Installation/.reuse/dep5 new file mode 100644 index 000000000000..68f659f36af5 --- /dev/null +++ b/Installation/.reuse/dep5 @@ -0,0 +1,12 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: CGAL +Upstream-Contact: CGAL Editorial Board +Source: https://github.com/CGAL/cgal + +Files: *.cmake *.md doc/* doc_html/* scripts/* developer_scripts/* package_info/* demo/* examples/* src/* test/* benchmarks/* benchmark/* data/* cmake/* +Copyright: 1995-2023 The CGAL Project +License: CC0-1.0 + +Files: include/CGAL/Qt/resources/ImageInterface.ui include/CGAL/Qt/resources/qglviewer-icon.xpm AUTHORS CMakeLists.txt README auxiliary/cgal_create_cmake_script.1 auxiliary/gmp/README include/CGAL/license/gpl_package_list.txt auxiliary/cgal_app.icns copyright VERSION +Copyright: 1995-2023 The CGAL Project +License: CC0-1.0 diff --git a/Installation/LICENSES/BSL-1.0.txt b/Installation/LICENSES/BSL-1.0.txt new file mode 100644 index 000000000000..36b7cd93cdfb --- /dev/null +++ b/Installation/LICENSES/BSL-1.0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/Installation/LICENSES/CC0-1.0.txt b/Installation/LICENSES/CC0-1.0.txt new file mode 100644 index 000000000000..0e259d42c996 --- /dev/null +++ b/Installation/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/Installation/LICENSES/GPL-2.0-or-later.txt b/Installation/LICENSES/GPL-2.0-or-later.txt new file mode 100644 index 000000000000..623b6258a134 --- /dev/null +++ b/Installation/LICENSES/GPL-2.0-or-later.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Installation/LICENSES/GPL-3.0-only.txt b/Installation/LICENSES/GPL-3.0-only.txt new file mode 100644 index 000000000000..94a9ed024d38 --- /dev/null +++ b/Installation/LICENSES/GPL-3.0-only.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Installation/LICENSES/GPL-3.0-or-later.txt b/Installation/LICENSES/GPL-3.0-or-later.txt new file mode 100644 index 000000000000..94a9ed024d38 --- /dev/null +++ b/Installation/LICENSES/GPL-3.0-or-later.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Installation/LICENSES/LGPL-2.1-only.txt b/Installation/LICENSES/LGPL-2.1-only.txt new file mode 100644 index 000000000000..b042f57e217b --- /dev/null +++ b/Installation/LICENSES/LGPL-2.1-only.txt @@ -0,0 +1,178 @@ + +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! diff --git a/Installation/LICENSES/LGPL-3.0-only.txt b/Installation/LICENSES/LGPL-3.0-only.txt new file mode 100644 index 000000000000..65c5ca88a67c --- /dev/null +++ b/Installation/LICENSES/LGPL-3.0-only.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Installation/LICENSES/LGPL-3.0-or-later.txt b/Installation/LICENSES/LGPL-3.0-or-later.txt new file mode 100644 index 000000000000..65c5ca88a67c --- /dev/null +++ b/Installation/LICENSES/LGPL-3.0-or-later.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Installation/LICENSES/LicenseRef-Commercial.txt b/Installation/LICENSES/LicenseRef-Commercial.txt new file mode 100644 index 000000000000..1c5db3b7d70f --- /dev/null +++ b/Installation/LICENSES/LicenseRef-Commercial.txt @@ -0,0 +1,6 @@ +The CGAL software consists of several components, each of which is licensed under +an open source license. If the open source license is not suitable to your +needs, it is possible to obtain commercial licenses +from GeometryFactory (www.geometryfactory.com) for each component of CGAL. + +Get more information at "contact@geometryfactory.com". diff --git a/Installation/LICENSES/LicenseRef-RFL.txt b/Installation/LICENSES/LicenseRef-RFL.txt new file mode 100644 index 000000000000..49f77c2445e0 --- /dev/null +++ b/Installation/LICENSES/LicenseRef-RFL.txt @@ -0,0 +1,19 @@ +Copyright (c) 2014 Stefan Walk + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Installation/LICENSES/MIT.txt b/Installation/LICENSES/MIT.txt new file mode 100644 index 000000000000..89de354795ec --- /dev/null +++ b/Installation/LICENSES/MIT.txt @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/LICENSES/BSL-1.0.txt b/LICENSES/BSL-1.0.txt new file mode 100644 index 000000000000..36b7cd93cdfb --- /dev/null +++ b/LICENSES/BSL-1.0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 000000000000..0e259d42c996 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt new file mode 100644 index 000000000000..623b6258a134 --- /dev/null +++ b/LICENSES/GPL-2.0-only.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt new file mode 100644 index 000000000000..623b6258a134 --- /dev/null +++ b/LICENSES/GPL-2.0-or-later.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/LICENSES/GPL-3.0-only.txt b/LICENSES/GPL-3.0-only.txt new file mode 100644 index 000000000000..94a9ed024d38 --- /dev/null +++ b/LICENSES/GPL-3.0-only.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSES/GPL-3.0-or-later.txt b/LICENSES/GPL-3.0-or-later.txt new file mode 100644 index 000000000000..94a9ed024d38 --- /dev/null +++ b/LICENSES/GPL-3.0-or-later.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSES/LGPL-2.1-only.txt b/LICENSES/LGPL-2.1-only.txt new file mode 100644 index 000000000000..b042f57e217b --- /dev/null +++ b/LICENSES/LGPL-2.1-only.txt @@ -0,0 +1,178 @@ + +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! diff --git a/LICENSES/LGPL-3.0-only.txt b/LICENSES/LGPL-3.0-only.txt new file mode 100644 index 000000000000..65c5ca88a67c --- /dev/null +++ b/LICENSES/LGPL-3.0-only.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/LICENSES/LGPL-3.0-or-later.txt b/LICENSES/LGPL-3.0-or-later.txt new file mode 100644 index 000000000000..65c5ca88a67c --- /dev/null +++ b/LICENSES/LGPL-3.0-or-later.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/LICENSES/LicenseRef-Commercial.txt b/LICENSES/LicenseRef-Commercial.txt new file mode 100644 index 000000000000..1c5db3b7d70f --- /dev/null +++ b/LICENSES/LicenseRef-Commercial.txt @@ -0,0 +1,6 @@ +The CGAL software consists of several components, each of which is licensed under +an open source license. If the open source license is not suitable to your +needs, it is possible to obtain commercial licenses +from GeometryFactory (www.geometryfactory.com) for each component of CGAL. + +Get more information at "contact@geometryfactory.com". diff --git a/LICENSES/LicenseRef-RFL.txt b/LICENSES/LicenseRef-RFL.txt new file mode 100644 index 000000000000..49f77c2445e0 --- /dev/null +++ b/LICENSES/LicenseRef-RFL.txt @@ -0,0 +1,19 @@ +Copyright (c) 2014 Stefan Walk + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 000000000000..89de354795ec --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,17 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/ccpp.yml b/ccpp.yml deleted file mode 100644 index 75bbbee49189..000000000000 --- a/ccpp.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: C/C++ CI - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - name: configure all - run: cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON . From b3af96caa1cad9c3bd4483537bf3dcba48e68c80 Mon Sep 17 00:00:00 2001 From: albert-github Date: Tue, 4 Jul 2023 16:23:14 +0200 Subject: [PATCH 0448/1398] issue #7454 Consistency of BigO notations Create `cgalBigO` marco and used it. (`The macro `cgalBigOLarge` is for special situations where we need bigger round brackets) --- AABB_tree/include/CGAL/AABB_tree.h | 2 +- .../doc/Alpha_shapes_2/CGAL/Alpha_shape_2.h | 2 +- .../doc/Alpha_shapes_3/CGAL/Alpha_shape_3.h | 2 +- .../Arrangement_on_surface_2.txt | 18 ++--- .../CGAL/Arr_trapezoid_ric_point_location.h | 4 +- .../CGAL/Arr_polycurve_basic_traits_2.h | 2 +- .../Barycentric_coordinates_2.txt | 22 +++--- .../CGAL/Approximate_min_ellipsoid_d.h | 2 +- .../CGAL/Min_sphere_of_spheres_d.h | 2 +- .../CGAL/rectangular_p_center_2.h | 2 +- .../Concepts/MinSphereOfSpheresTraits.h | 2 +- .../Box_intersection_d/Box_intersection_d.txt | 8 +- .../CGAL/box_intersection_d.h | 12 +-- .../Combinatorial_map/Combinatorial_map.txt | 2 +- .../include/CGAL/Combinatorial_map.h | 2 +- .../doc/Cone_spanners_2/Cone_spanners_2.txt | 6 +- .../Convex_decomposition_3.txt | 4 +- .../PackageDescription.txt | 2 +- .../include/CGAL/convex_decomposition_3.h | 4 +- .../doc/Convex_hull_2/CGAL/ch_akl_toussaint.h | 2 +- .../doc/Convex_hull_2/CGAL/ch_bykat.h | 2 +- .../doc/Convex_hull_2/CGAL/ch_eddy.h | 2 +- .../doc/Convex_hull_2/CGAL/ch_graham_andrew.h | 4 +- .../doc/Convex_hull_2/CGAL/ch_jarvis.h | 4 +- .../doc/Convex_hull_2/CGAL/convex_hull_2.h | 8 +- .../Convex_hull_2/CGAL/convexity_check_2.h | 4 +- .../doc/Convex_hull_2/Convex_hull_2.txt | 12 +-- .../Convex_hull_3/CGAL/convexity_check_3.h | 2 +- .../doc/Convex_hull_d/CGAL/Convex_hull_d.h | 2 +- .../Developer_manual/Chapter_intro.txt | 2 +- .../Developer_manual/Chapter_kernels.txt | 2 +- .../doc/resources/1.8.13/BaseDoxyfile.in | 4 +- .../doc/resources/1.9.6/BaseDoxyfile.in | 4 +- .../doc/Generalized_map/Generalized_map.txt | 2 +- .../include/CGAL/Generalized_map.h | 2 +- .../CGAL/random_convex_hull_in_disc_2.h | 4 +- .../doc/Generator/CGAL/random_convex_set_2.h | 4 +- .../doc/Generator/CGAL/random_polygon_2.h | 4 +- .../doc/HalfedgeDS/CGAL/HalfedgeDS_default.h | 2 +- .../doc/HalfedgeDS/CGAL/HalfedgeDS_list.h | 2 +- .../doc/Heat_method_3/Heat_method_3.txt | 4 +- .../CGAL/Largest_empty_iso_rectangle_2.h | 4 +- .../Inscribed_areas/CGAL/extremal_polygon_2.h | 12 +-- .../CGAL/Largest_empty_iso_rectangle_2.h | 2 +- .../CGAL/Interval_skip_list.h | 6 +- .../CGAL/Kernel_d/Aff_transformation_d.h | 4 +- .../doc/Kernel_d/CGAL/Kernel_d/Direction_d.h | 4 +- .../doc/Kernel_d/CGAL/Kernel_d/Hyperplane_d.h | 4 +- Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Line_d.h | 6 +- Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Point_d.h | 4 +- Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Ray_d.h | 4 +- .../doc/Kernel_d/CGAL/Kernel_d/Segment_d.h | 6 +- .../doc/Kernel_d/CGAL/Kernel_d/Sphere_d.h | 8 +- .../doc/Kernel_d/CGAL/Kernel_d/Vector_d.h | 4 +- .../Matrix_search/CGAL/sorted_matrix_search.h | 2 +- .../CGAL/Polygon_convex_decomposition_2.h | 8 +- .../CGAL/Polygon_vertical_decomposition_2.h | 4 +- ...mall_side_angle_bisector_decomposition_2.h | 2 +- .../doc/Minkowski_sum_2/Minkowski_sum_2.txt | 10 +-- .../Minkowski_sum_2/AABB_tree_with_join.h | 2 +- .../CGAL/Polygon_convex_decomposition_2.h | 6 +- .../doc/Minkowski_sum_3/Minkowski_sum_3.txt | 2 +- .../include/CGAL/minkowski_sum_3.h | 2 +- Miscellany/doc/Miscellany/CGAL/Union_find.h | 2 +- .../doc/Miscellany/CGAL/Unique_hash_map.h | 2 +- Miscellany/doc/Miscellany/Miscellany.txt | 4 +- Nef_2/doc/Nef_2/CGAL/Nef_polyhedron_2.h | 6 +- Nef_S2/doc/Nef_S2/CGAL/Nef_polyhedron_S2.h | 2 +- Orthtree/doc/Orthtree/Orthtree.txt | 2 +- .../doc/Partition_2/CGAL/is_y_monotone_2.h | 2 +- .../doc/Partition_2/CGAL/partition_2.h | 10 +-- .../Partition_2/CGAL/partition_is_valid_2.h | 6 +- .../CGAL/polygon_function_objects.h | 6 +- .../doc/Partition_2/PackageDescription.txt | 10 +-- Partition_2/doc/Partition_2/Partition_2.txt | 8 +- .../Periodic_2_Delaunay_triangulation_2.h | 10 +-- .../CGAL/Periodic_2_triangulation_2.h | 2 +- Polygon/include/CGAL/Polygon_2_algorithms.h | 2 +- .../Polygon_mesh_processing.txt | 4 +- QP_solver/doc/QP_solver/QP_solver.txt | 2 +- .../STL_Extension/CGAL/Compact_container.h | 6 +- .../CGAL/Concurrent_compact_container.h | 6 +- .../doc/STL_Extension/CGAL/In_place_list.h | 2 +- .../doc/STL_Extension/CGAL/Multiset.h | 10 +-- STL_Extension/include/CGAL/Multiset.h | 74 +++++++++---------- .../doc/SearchStructures/CGAL/Range_tree_d.h | 6 +- .../SearchStructures/CGAL/Segment_tree_d.h | 6 +- .../doc/SearchStructures/SearchStructures.txt | 14 ++-- .../Segment_Delaunay_graph_2.txt | 4 +- .../Set_movable_separability_2.txt | 4 +- .../include/CGAL/Eigen_sparse_matrix.h | 4 +- .../internal/K_means_clustering.h | 4 +- .../Surface_mesh_shortest_path.txt | 4 +- .../Surface_mesh_shortest_path.h | 2 +- .../Surface_mesh_topology.txt | 4 +- .../doc/Surface_sweep_2/Surface_sweep_2.txt | 6 +- .../doc/Triangulation/Triangulation.txt | 8 +- .../CGAL/Delaunay_triangulation_2.h | 12 +-- .../Triangulation_2/CGAL/Triangulation_2.h | 8 +- .../doc/Triangulation_2/Triangulation_2.txt | 22 +++--- .../CGAL/Delaunay_triangulation_3.h | 4 +- .../doc/Triangulation_3/Triangulation_3.txt | 2 +- .../CGAL/Rotational_sweep_visibility_2.h | 4 +- .../CGAL/Simple_polygon_visibility_2.h | 4 +- .../CGAL/Triangular_expansion_visibility_2.h | 6 +- .../doc/Visibility_2/visibility_2.txt | 8 +- 106 files changed, 301 insertions(+), 297 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index 0016d4ecc097..ca68663308b2 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -143,7 +143,7 @@ namespace CGAL { /// An explicit call to `build()` must be made to ensure that the next call to /// a query function will not trigger the construction of the data structure. /// A call to `AABBTraits::set_shared_data(t...)` is made using the internally stored traits. - /// This procedure has a complexity of \f$O(n log(n))\f$, where \f$n\f$ is the number of + /// This procedure has a complexity of \cgalBigO{n log(n)}, where \f$n\f$ is the number of /// primitives of the tree. template void build(T&& ...); diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_2.h index 98dedd0f75b6..832be2b8d29e 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_2.h @@ -80,7 +80,7 @@ use binary search. `Alpha_shape_2::number_of_solid_components()` performs a graph traversal and takes time linear in the number of faces of the underlying triangulation. `Alpha_shape_2::find_optimal_alpha()` uses binary search and takes time -\f$ O(n \log n)\f$, where \f$ n\f$ is the number of points. +\cgalBigO{n \log n}, where \f$ n\f$ is the number of points. */ template< typename Dt, typename ExactAlphaComparisonTag > diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_3.h index 70f1bec2182b..7136eed539b1 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_3.h @@ -77,7 +77,7 @@ use binary search. `Alpha_shape_3::number_of_solid_components()` performs a graph traversal and takes time linear in the number of cells of the underlying triangulation. `Alpha_shape_3::find_optimal_alpha()` uses binary search and takes time -\f$ O(n \log n)\f$, where \f$ n\f$ is the number of points. +\cgalBigO{n \log n}, where \f$ n\f$ is the number of points. */ template< typename Dt, typename ExactAlphaComparisonTag > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index 431083db107b..62571bfdee9b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -1223,10 +1223,10 @@ halfedge \f$e_{\mathrm{pred}}\f$ directed toward \f$v\f$, such that \f$c\f$ is located between the curves associated with \f$e_{\mathrm{pred}}\f$ and the next halfedge in the clockwise order in the circular list of halfedges around \f$v\f$; see -\cgalFigureRef{aos_fig-insert}. This search may take \f$O(d)\f$ time, +\cgalFigureRef{aos_fig-insert}. This search may take \cgalBigO{d} time, where \f$d\f$ is the degree of the vertex \f$v\f$. \cgalFootnote{We can store the handles to the halfedges incident to \f$v\f$ in an efficient -search structure to obtain \f$O(\log d)\f$ access time. However, as +search structure to obtain \cgalBigO{\log d} access time. However, as \f$d\f$ is usually very small, this may lead to a waste of storage space without a meaningful improvement in running time in practice.} However, if the halfedge \f$e_{\mathrm{pred}}\f$ is known in advance, @@ -1488,9 +1488,9 @@ keep up-to-date as this arrangement changes. As mentioned above, the triangulation strategy is provided only for educational purposes, and thus we do not elaborate on this strategy. The data structure needed by the landmark and the trapezoidal map RIC -strategies can be constructed in \f$O(N \log N)\f$ time, where \f$N\f$ +strategies can be constructed in \cgalBigO{N \log N} time, where \f$N\f$ is the overall number of edges in the arrangement, but the constant -hidden in the \f$O()\f$ notation for the trapezoidal map RIC strategy +hidden in the \cgalBigO{ } notation for the trapezoidal map RIC strategy is much larger. Thus, construction needed by the landmark algorithm is in practice significantly faster than the construction needed by the trapezoidal map RIC strategy. In addition, although both resulting @@ -1647,7 +1647,7 @@ Section \ref arr_ssecpl. The output pairs are sorted in increasing \f$xy\f$-lexicographical order of the query point. The batched point-location operation is carried out by sweeping the -arrangement. Thus, it takes \f$O((m+N)\log{(m+N)})\f$ time, where +arrangement. Thus, it takes \cgalBigO{(m+N)\log{(m+N)}} time, where \f$N\f$ is the number of edges in the arrangement. Issuing separate queries exploiting a point-location strategy with logarithmic query time per query, such as the trapezoidal map RIC strategy (see Section @@ -2037,11 +2037,11 @@ so it must be construct from scratch. In the first case, we sweep over the input curves, compute their intersection points, and construct the \dcel that represents their -arrangement. This process is performed in \f$O\left((n + k)\log -n\right)\f$ time, where \f$k\f$ is the total number of intersection +arrangement. This process is performed in \cgalBigO{left((n + k)\log +n\right} time, where \f$k\f$ is the total number of intersection points. The running time is asymptotically better than the time needed for incremental insertion if the arrangement is relatively sparse -(when \f$k\f$ is \f$O(\frac{n^2}{\log n}\f$)), but it is recommended +(when \f$k\f$ is \cgalBigO{\frac{n^2}{\log n}}), but it is recommended that this aggregate construction process be used even for dense arrangements, since the plane-sweep algorithm performs fewer geometric operations compared to the incremental insertion algorithms, and hence @@ -4346,7 +4346,7 @@ a point with respect to an \f$x\f$-monotone polyline, we use binary search to locate the relevant segment that contains the point in its \f$x\f$-range. Then, we compute the position of the point with respect to this segment. Thus, operations on \f$x\f$-monotone polylines of -size \f$m\f$ typically take \f$O(\log m)\f$ time. +size \f$m\f$ typically take \cgalBigO{\log m} time. You are free to choose the underlying segment traits class. Your decision could be based, for example, on the number of expected diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h index 0027ec53409c..e662503bee43 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h @@ -12,9 +12,9 @@ Seidel \cgalCite{s-sfira-91} (see also [\cgalCite{bkos-cgaa-00} Chapter 6). It subdivides each arrangement face to pseudo-trapezoidal cells, each of constant complexity, and constructs and maintains a linear-size search structure on top of these cells, such that each query can be answered -in \f$ O(\log n)\f$ time, where \f$ n\f$ is the complexity of the arrangement. +in \cgalBigO{\log n} time, where \f$ n\f$ is the complexity of the arrangement. -Constructing the search structures takes \f$ O(n \log n)\f$ expected time +Constructing the search structures takes \cgalBigO{n \log n} expected time and may require a small number of rebuilds \cgalCite{hkh-iiplgtds-12}. Therefore attaching a trapezoidal point-location object to an existing arrangement may incur some overhead in running times. In addition, the point-location diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h index 84c9cee01d97..c216a07bc9ca 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_basic_traits_2.h @@ -2419,7 +2419,7 @@ class Arr_polycurve_basic_traits_2 { /*! Obtain the index of the subcurve in the polycurve that contains the * point q in its x-range. The function performs a binary search, so if the * point q is in the x-range of the polycurve with n subcurves, the subcurve - * containing it can be located in O(log n) operations. + * containing it can be located in \cgalBigO{log n} operations. * \param cv The polycurve curve. * \param q The point. * \return An index i such that q is in the x-range of cv[i]. diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt index 72588aec4365..b3f13fcf8191 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Barycentric_coordinates_2.txt @@ -451,10 +451,10 @@ To fix the problem, we modify the weights \f$w_i\f$ as After the above normalization, this gives us the precise algorithm to compute Wachspress coordinates -but with \f$O(n^2)\f$ performance only. The max speed \f$O(n)\f$ algorithm uses the standard +but with \cgalBigO{n^2} performance only. The max speed \cgalBigO{n} algorithm uses the standard weights \f$w_i\f$. Note that mathematically this modification does not change the coordinates. One should be cautious when using the unnormalized Wachspress weights. In that case, you must choose the -\f$O(n)\f$ type. +\cgalBigO{n} type. It is known that for strictly convex polygons the denominator's zero set of the Wachspress coordinates (\f$W^{wp} = 0~\f$) is a curve, which (in many cases) lies quite @@ -507,10 +507,10 @@ To fix the problem, similarly to the previous subsection, we modify the weights After the above normalization, this yields the precise algorithm to compute discrete harmonic coordinates -but with \f$O(n^2)\f$ performance only. The max speed \f$O(n)\f$ algorithm uses the standard +but with \cgalBigO{n^2} performance only. The max speed \cgalBigO{n} algorithm uses the standard weights \f$w_i\f$. Again, mathematically this modification does not change the coordinates, one should be cautious when using the unnormalized discrete harmonic weights. In that case, -you must choose the \f$O(n)\f$ type. +you must choose the \cgalBigO{n} type. \b Warning: as for Wachspress coordinates, we do not recommend using discrete harmonic coordinates for exterior points, because the curve \f$W^{dh} = 0\f$ may have several components, @@ -563,7 +563,7 @@ After the normalization of these weights as before \f$b_i = \frac{w_i}{W^{mv}}\qquad\f$ with \f$\qquad W^{mv} = \sum_{j=1}^n w_j\f$ -we obtain the max precision \f$O(n^2)\f$ algorithm. The max speed \f$O(n)\f$ algorithm computes the +we obtain the max precision \cgalBigO{n^2} algorithm. The max speed \cgalBigO{n} algorithm computes the weights \f$w_i\f$ using the pseudocode from here. These weights @@ -575,7 +575,7 @@ with \f$\qquad t_i = \frac{\text{det}(d_i, d_{i+1})}{r_ir_{i+1} + d_id_{i+1}}\f$ are also normalized. Note that they are unstable if a query point is closer than \f$\approx 1.0e-10\f$ to the polygon boundary, similarly to Wachspress and discrete harmonic coordinates and one should be cautious when using the unnormalized mean value weights. In that case, you must choose the -\f$O(n)\f$ type. +\cgalBigO{n} type. \anchor compute_hm_coord @@ -654,17 +654,17 @@ The resulting timings for all closed-form coordinates can be found in the figure \cgalFigureBegin{analytic_timings, analytic_timings.png} Time in seconds to compute \f$n\f$ coordinate values for a polygon with \f$n\f$ vertices -at 1 million query points with the max speed \f$O(n)\f$ algorithms (dashed) and +at 1 million query points with the max speed \cgalBigO{n} algorithms (dashed) and the max precision \f$0(n^2)\f$ algorithms (solid) for Wachspress (blue), discrete harmonic (red), and mean value (green) coordinates. \cgalFigureEnd -From the figure above we observe that the \f$O(n^2)\f$ algorithm is as fast -as the \f$O(n)\f$ algorithm if we have a polygon with a small number of vertices. +From the figure above we observe that the \cgalBigO{n^2} algorithm is as fast +as the \cgalBigO{n} algorithm if we have a polygon with a small number of vertices. But as the number of vertices is increased, the linear algorithm outperforms the squared one, as expected. One of the reasons for this behavior is that for a small number of vertices -the multiplications of \f$n-2\f$ elements inside the \f$O(n^2)\f$ algorithm take almost the -same time as the corresponding divisions in the \f$O(n)\f$ algorithm. For a polygon with +the multiplications of \f$n-2\f$ elements inside the \cgalBigO{n^2} algorithm take almost the +same time as the corresponding divisions in the \cgalBigO{n} algorithm. For a polygon with many vertices, these multiplications are substantially slower. To benchmark harmonic coordinates, we used a MacBook Pro 2018 with 2.2 GHz Intel Core i7 processor (6 cores) diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h index 33d006577bfc..856d1a169296 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h @@ -119,7 +119,7 @@ We implement Khachyian's algorithm for rounding polytopes \cgalCite{cgal:k-rprnm-96}. Internally, we use `double`-arithmetic and (initially a single) Cholesky-decomposition. The algorithm's running time is -\f$ {\cal O}(nd^2(\epsilon^{-1}+\ln d + \ln\ln(n)))\f$, where \f$ n=|P|\f$ and +\cgalBigO{nd^2(\epsilon^{-1}+\ln d + \ln\ln(n))}, where \f$ n=|P|\f$ and \f$ 1+\epsilon\f$ is the desired approximation ratio. \cgalHeading{Example} diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h index 8d360443390e..fbcd5f02e2dc 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h @@ -76,7 +76,7 @@ We implement two algorithms, the LP-algorithm and a heuristic \cgalCite{msw-sblp-92}. As described in the documentation of concept `MinSphereOfSpheresTraits`, each has its advantages and disadvantages: Our implementation of the LP-algorithm has maximal -expected running time \f$ O(2^d n)\f$, while the heuristic comes without +expected running time \cgalBigO{2^d n}, while the heuristic comes without any complexity guarantee. In particular, the LP-algorithm runs in linear time for fixed dimension \f$ d\f$. (These running times hold for the arithmetic model, so they count the number of operations on diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h index f3baaa625f13..519b3eeb24fa 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h @@ -245,7 +245,7 @@ must be a model for `RectangularPCenterTraits_2`. \cgalHeading{Implementation} The runtime is linear for \f$ p \in \{2,\,3\}\f$ and -\f$ \mathcal{O}(n \cdot \log n)\f$ for \f$ p = 4\f$ where \f$ n\f$ is the number of +\cgalBigO{n \cdot \log n} for \f$ p = 4\f$ where \f$ n\f$ is the number of input points. These runtimes are worst case optimal. The \f$ 3\f$-center algorithm uses a prune-and-search technique described in \cgalCite{cgal:h-slacr-99}. The \f$ 4\f$-center implementation uses sorted matrix diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h index 49b32647f3c2..a1a0126cf9e8 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h @@ -79,7 +79,7 @@ The recommended choice is the first, which is a synonym to the one of the other two methods which we consider "the best in practice." In case of `CGAL::LP_algorithm`, the minsphere will be computed using the LP-algorithm \cgalCite{msw-sblp-92}, which in our -implementation has maximal expected running time \f$ O(2^d n)\f$ (in the +implementation has maximal expected running time \cgalBigO{2^d n} (in the number of operations on the number type `FT`). In case of `CGAL::Farthest_first_heuristic`, a simple heuristic will be used instead which seems to work fine in practice, but comes without diff --git a/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt b/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt index 64cead025327..2dcd2db8d30e 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt +++ b/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt @@ -350,12 +350,12 @@ parameter the function switches from the streamed segment-tree algorithm to the two-way-scan algorithm, see \cgalCite{cgal:ze-fsbi-02} for the details. -The streamed segment-tree algorithm needs \f$ O(n \log^d (n) + k)\f$ -worst-case running time and \f$ O(n)\f$ space, where \f$ n\f$ is the number of +The streamed segment-tree algorithm needs \cgalBigO{n \log^d (n) + k} +worst-case running time and \cgalBigO{n} space, where \f$ n\f$ is the number of boxes in both input sequences, \f$ d\f$ the (constant) dimension of the boxes, and \f$ k\f$ the output complexity, i.e., the number of pairwise -intersections of the boxes. The two-way-scan algorithm needs \f$ O(n \log -(n) + l)\f$ worst-case running time and \f$ O(n)\f$ space, where \f$ l\f$ is the +intersections of the boxes. The two-way-scan algorithm needs \cgalBigO{n \log +(n) + l} worst-case running time and \cgalBigO{n} space, where \f$ l\f$ is the number of pairwise overlapping intervals in one dimensions (the dimension where the algorithm is used instead of the segment tree). Note that \f$ l\f$ is not necessarily related to \f$ k\f$ and using the diff --git a/Box_intersection_d/doc/Box_intersection_d/CGAL/box_intersection_d.h b/Box_intersection_d/doc/Box_intersection_d/CGAL/box_intersection_d.h index f9ec7ba1ae13..0f7fd9bccdd1 100644 --- a/Box_intersection_d/doc/Box_intersection_d/CGAL/box_intersection_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/CGAL/box_intersection_d.h @@ -77,7 +77,7 @@ namespace CGAL { \cgalHeading{Implementation} The algorithm is trivially testing all pairs and runs therefore in time - \f$ O(nm)\f$ where \f$ n\f$ is the size of the first sequence and \f$ m\f$ is the + \cgalBigO{nm} where \f$ n\f$ is the size of the first sequence and \f$ m\f$ is the size of the second sequence. */ @@ -219,12 +219,12 @@ void box_intersection_all_pairs_d( algorithm to the two-way-scan algorithm, see \cgalCite{cgal:ze-fsbi-02} for the details. - The streamed segment-tree algorithm needs \f$ O(n \log^d (n) + k)\f$ - worst-case running time and \f$ O(n)\f$ space, where \f$ n\f$ is the number of + The streamed segment-tree algorithm needs \cgalBigO{n \log^d (n) + k} + worst-case running time and \cgalBigO{n} space, where \f$ n\f$ is the number of boxes in both input sequences, \f$ d\f$ the (constant) dimension of the boxes, and \f$ k\f$ the output complexity, i.e., the number of pairwise - intersections of the boxes. The two-way-scan algorithm needs \f$ O(n \log - (n) + l)\f$ worst-case running time and \f$ O(n)\f$ space, where \f$ l\f$ is the + intersections of the boxes. The two-way-scan algorithm needs \cgalBigO{n \log + (n) + l} worst-case running time and \cgalBigO{n} space, where \f$ l\f$ is the number of pairwise overlapping intervals in one dimensions (the dimension where the algorithm is used instead of the segment tree). Note that \f$ l\f$ is not necessarily related to \f$ k\f$ and using the @@ -397,7 +397,7 @@ namespace CGAL { \cgalHeading{Implementation} The algorithm is trivially testing all pairs and runs therefore in time - \f$ O(n^2)\f$ where \f$ n\f$ is the size of the input sequence. This algorithm + \cgalBigO{n^2} where \f$ n\f$ is the size of the input sequence. This algorithm does not use the id-number of the boxes. */ diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt index 2e36037ea231..5a17500431d8 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt +++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt @@ -297,7 +297,7 @@ Several functions allow to create specific configurations of darts into a combin \subsection ssecadvmarks Boolean Marks -It is often necessary to mark darts, for example to retrieve in O(1) if a given dart was already processed during a specific algorithm, for example, iteration over a given range. Users can also mark specific parts of a combinatorial map (for example mark all the darts belonging to objects having specific semantics). To answer these needs, a `GenericMap` has a certain number of Boolean marks (fixed by the constant \link GenericMap::NB_MARKS `NB_MARKS`\endlink). When one wants to use a Boolean mark, the following methods are available (with `cm` an instance of a combinatorial map): +It is often necessary to mark darts, for example to retrieve in \cgalBigO{1} if a given dart was already processed during a specific algorithm, for example, iteration over a given range. Users can also mark specific parts of a combinatorial map (for example mark all the darts belonging to objects having specific semantics). To answer these needs, a `GenericMap` has a certain number of Boolean marks (fixed by the constant \link GenericMap::NB_MARKS `NB_MARKS`\endlink). When one wants to use a Boolean mark, the following methods are available (with `cm` an instance of a combinatorial map):

    • get a new free mark: `size_type m = cm.`\link GenericMap::get_new_mark `get_new_mark()`\endlink (throws the exception Exception_no_more_available_mark if no mark is available);
    • set mark `m` for a given dart `d0`: `cm.`\link GenericMap::mark `mark(d0,m)`\endlink; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index e2145afb1f3c..2141b6e1ab4f 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -1154,7 +1154,7 @@ namespace CGAL { } /** Unmark all the darts of the map for a given mark. - * If all the darts are marked or unmarked, this operation takes O(1) + * If all the darts are marked or unmarked, this operation takes \cgalBigO{1} * operations, otherwise it traverses all the darts of the map. * @param amark the given mark. */ diff --git a/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt b/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt index 8de2f97693de..d21ef3f1aca8 100644 --- a/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt +++ b/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt @@ -160,7 +160,7 @@ In constructing Theta graphs, this functor uses the algorithm from Chapter 4 of the book by Narasimhan and Smid \cgalCite{cgal:ns-gsn-07}. Basically, it is a sweep line algorithm and uses a balanced search tree to store the vertices that have already been scanned. -It has the complexity of \f$O(n \log n)\f$, where \f$n\f$ is the number of vertices in the plane. +It has the complexity of \cgalBigO{n \log n}, where \f$n\f$ is the number of vertices in the plane. This complexity has been proved to be optimal. For more details on how to use this `Construct_theta_graph_2` functor to write an application to build Theta graphs, @@ -178,13 +178,13 @@ The functor `Construct_yao_graph_2` has a similar definition as `Construct_theta The way of using these two template parameters is the same as that of `Construct_theta_graph_2`, so please refer to the previous subsection for the details. We note here that construction algorithm for Yao graph -is a slight adaptation of the algorithm for constructing Theta graph, having a complexity of \f$O(n^2)\f$. +is a slight adaptation of the algorithm for constructing Theta graph, having a complexity of \cgalBigO{n^2}. The increase of complexity in this adaptation is because in constructing Theta graph, the searching of the 'closest' node by projection distance can be done by a balanced search tree, but in constructing Yao graph, the searching of the 'closest' node by Euclidean distance cannot be done by a balanced search tree. -Note that an optimal algorithm for constructing Yao graph with a complexity of \f$O(n \log n)\f$ is +Note that an optimal algorithm for constructing Yao graph with a complexity of \cgalBigO{n \log n} is described in \cgalCite{cgal:cht-oacov-90}. However, this algorithm is much more complex to implement than the current algorithm implemented, and it can hardly reuse the codes for constructing Theta graphs, so it is not implemented in this package right now. diff --git a/Convex_decomposition_3/doc/Convex_decomposition_3/Convex_decomposition_3.txt b/Convex_decomposition_3/doc/Convex_decomposition_3/Convex_decomposition_3.txt index 6720620e075a..98f1e2e2d6a1 100644 --- a/Convex_decomposition_3/doc/Convex_decomposition_3/Convex_decomposition_3.txt +++ b/Convex_decomposition_3/doc/Convex_decomposition_3/Convex_decomposition_3.txt @@ -18,11 +18,11 @@ Minkowski sums of the convex pieces, and unite the pair-wise sums. While it is desirable to have a decomposition into a minimum number of pieces, this problem is known to be NP-hard \cgalCite{c-cpplb-84}. Our -implementation decomposes a Nef polyhedron \f$ N\f$ into \f$ O(r^2)\f$ convex +implementation decomposes a Nef polyhedron \f$ N\f$ into \cgalBigO{r^2} convex pieces, where \f$ r\f$ is the number of edges that have two adjacent facets that span an angle of more than 180 degrees with respect to the interior of the polyhedron. Those edges are also called reflex edges. -The bound of \f$ O(r^2)\f$ convex pieces is worst-case +The bound of \cgalBigO{r^2} convex pieces is worst-case optimal \cgalCite{c-cpplb-84}. \cgalFigureBegin{figverticalDecomposition,two_cubes_all_in_one.png} diff --git a/Convex_decomposition_3/doc/Convex_decomposition_3/PackageDescription.txt b/Convex_decomposition_3/doc/Convex_decomposition_3/PackageDescription.txt index 8d49a1ce844a..4d65e689fade 100644 --- a/Convex_decomposition_3/doc/Convex_decomposition_3/PackageDescription.txt +++ b/Convex_decomposition_3/doc/Convex_decomposition_3/PackageDescription.txt @@ -6,7 +6,7 @@ \cgalPkgPicture{Convex_decomposition_3/fig/Convex_decomposition_3-teaser.png} \cgalPkgSummaryBegin \cgalPkgAuthor{Peter Hachenberger} -\cgalPkgDesc{This packages provides a function for decomposing a bounded polyhedron into convex sub-polyhedra. The decomposition yields \f$ O(r^2)\f$ convex pieces, where \f$ r\f$ is the number of edges, whose adjacent facets form an angle of more than 180 degrees with respect to the polyhedron's interior. This bound is worst-case optimal. } +\cgalPkgDesc{This packages provides a function for decomposing a bounded polyhedron into convex sub-polyhedra. The decomposition yields \cgalBigO{r^2} convex pieces, where \f$ r\f$ is the number of edges, whose adjacent facets form an angle of more than 180 degrees with respect to the polyhedron's interior. This bound is worst-case optimal. } \cgalPkgManuals{Chapter_Convex_Decomposition_of_Polyhedra,PkgConvexDecomposition3Ref} \cgalPkgSummaryEnd \cgalPkgShortInfoBegin diff --git a/Convex_decomposition_3/include/CGAL/convex_decomposition_3.h b/Convex_decomposition_3/include/CGAL/convex_decomposition_3.h index 7993309d4d09..08d6750b7fb7 100644 --- a/Convex_decomposition_3/include/CGAL/convex_decomposition_3.h +++ b/Convex_decomposition_3/include/CGAL/convex_decomposition_3.h @@ -41,12 +41,12 @@ The function `convex_decomposition_3()` inserts additional facets into the given `Nef_polyhedron_3` `N`, such that each bounded marked volume (the outer volume is unbounded) is subdivided into convex pieces. The modified polyhedron represents a decomposition into -\f$ O(r^2)\f$ convex pieces, where \f$ r\f$ is the number of edges that have two +\cgalBigO{r^2} convex pieces, where \f$ r\f$ is the number of edges that have two adjacent facets that span an angle of more than 180 degrees with respect to the interior of the polyhedron. The worst-case running time of our implementation is -\f$ O(n^2r^4\sqrt[3]{nr^2}\log{(nr)})\f$, where \f$ n\f$ is the complexity of +\cgalBigO{n^2r^4\sqrt[3]{nr^2}\log{(nr)}}, where \f$ n\f$ is the complexity of the polyhedron (the complexity of a `Nef_polyhedron_3` is the sum of its `Vertices`, `Halfedges` and `SHalfedges`) and \f$ r\f$ is the number of reflex edges. diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_akl_toussaint.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_akl_toussaint.h index 4df696cd96e2..1b22a5588685 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_akl_toussaint.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_akl_toussaint.h @@ -44,7 +44,7 @@ functions that return instances of these types: \cgalHeading{Implementation} This function uses the algorithm of Akl and -Toussaint \cgalCite{at-fcha-78} that requires \f$ O(n \log n)\f$ time for \f$ n\f$ input +Toussaint \cgalCite{at-fcha-78} that requires \cgalBigO{n \log n} time for \f$ n\f$ input points. diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_bykat.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_bykat.h index 03ca58755185..6bf670ff5aca 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_bykat.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_bykat.h @@ -45,7 +45,7 @@ functions that return instances of these types: This function implements the non-recursive variation of Eddy's algorithm \cgalCite{e-nchap-77} described in \cgalCite{b-chfsp-78}. -This algorithm requires \f$ O(n h)\f$ time +This algorithm requires \cgalBigO{n h} time in the worst case for \f$ n\f$ input points with \f$ h\f$ extreme points. */ template diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_eddy.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_eddy.h index 9a023d340702..836366e0b90c 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_eddy.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_eddy.h @@ -47,7 +47,7 @@ This function implements Eddy's algorithm \cgalCite{e-nchap-77}, which is the two-dimensional version of the quickhull algorithm \cgalCite{bdh-qach-96}. -This algorithm requires \f$ O(n h)\f$ time +This algorithm requires \cgalBigO{n h} time in the worst case for \f$ n\f$ input points with \f$ h\f$ extreme points. */ diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_graham_andrew.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_graham_andrew.h index 20119b4243b7..f2225a2fd338 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_graham_andrew.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_graham_andrew.h @@ -44,7 +44,7 @@ functions that return instances of these types: This function implements Andrew's variant of the Graham scan algorithm \cgalCite{a-aeach-79} and follows the presentation of Mehlhorn -\cgalCite{m-mdscg-84}. This algorithm requires \f$ O(n \log n)\f$ time +\cgalCite{m-mdscg-84}. This algorithm requires \cgalBigO{n \log n} time in the worst case for \f$ n\f$ input points. @@ -101,7 +101,7 @@ functions that return instances of these types: \cgalHeading{Implementation} -This algorithm requires \f$ O(n)\f$ time in the worst case for +This algorithm requires \cgalBigO{n} time in the worst case for \f$ n\f$ input points. \cgalHeading{Example} diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_jarvis.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_jarvis.h index 41478fb06f93..e3ad2818c2f4 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_jarvis.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/ch_jarvis.h @@ -44,7 +44,7 @@ functions that return instances of these types: \cgalHeading{Implementation} This function uses the Jarvis march (gift-wrapping) -algorithm \cgalCite{j-ichfs-73}. This algorithm requires \f$ O(n h)\f$ time +algorithm \cgalCite{j-ichfs-73}. This algorithm requires \cgalBigO{n h} time in the worst case for \f$ n\f$ input points with \f$ h\f$ extreme points. */ @@ -97,7 +97,7 @@ functions that return instances of these types: \cgalHeading{Implementation} The function uses the Jarvis march (gift-wrapping) algorithm \cgalCite{j-ichfs-73}. -This algorithm requires \f$ O(n h)\f$ time in the worst +This algorithm requires \cgalBigO{n h} time in the worst case for \f$ n\f$ input points with \f$ h\f$ extreme points \pre `start_p` and `stop_p` are extreme points with respect to diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_2.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_2.h index 0e54242c874c..20a14e030eb3 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_2.h @@ -47,9 +47,9 @@ functions that return instances of these types: One of two algorithms is used, depending on the type of iterator used to specify the input points. For input iterators, the algorithm used is that of Bykat \cgalCite{b-chfsp-78}, which -has a worst-case running time of \f$ O(n h)\f$, where \f$ n\f$ is the number of input +has a worst-case running time of \cgalBigO{n h}, where \f$ n\f$ is the number of input points and \f$ h\f$ is the number of extreme points. For all other types of -iterators, the \f$ O(n \log n)\f$ algorithm of of Akl and Toussaint +iterators, the \cgalBigO{n \log n} algorithm of of Akl and Toussaint \cgalCite{at-fcha-78} is used. @@ -128,7 +128,7 @@ functions that return instances of these types: This function uses Andrew's variant of Graham's scan algorithm \cgalCite{a-aeach-79}, \cgalCite{m-mdscg-84}. The algorithm has worst-case running time -of \f$ O(n \log n)\f$ for \f$ n\f$ input points. +of \cgalBigO{n \log n} for \f$ n\f$ input points. */ @@ -192,7 +192,7 @@ functions that return instances of these types: This function uses Andrew's variant of Graham's scan algorithm \cgalCite{a-aeach-79}, \cgalCite{m-mdscg-84}. The algorithm -has worst-case running time of \f$ O(n \log n)\f$ for \f$ n\f$ input points. +has worst-case running time of \cgalBigO{n \log n} for \f$ n\f$ input points. */ template diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/convexity_check_2.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/convexity_check_2.h index ae033c8acea5..002cd7f66dea 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/convexity_check_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/convexity_check_2.h @@ -32,7 +32,7 @@ functions that return instances of these types: \cgalHeading{Implementation} -The algorithm requires \f$ O(n)\f$ time for a set of \f$ n\f$ input points. +The algorithm requires \cgalBigO{n} time for a set of \f$ n\f$ input points. @@ -80,7 +80,7 @@ functions that return instances of these types: \cgalHeading{Implementation} -The algorithm requires \f$ O(n)\f$ time for a set of \f$ n\f$ input points. +The algorithm requires \cgalBigO{n} time for a set of \f$ n\f$ input points. diff --git a/Convex_hull_2/doc/Convex_hull_2/Convex_hull_2.txt b/Convex_hull_2/doc/Convex_hull_2/Convex_hull_2.txt index bca9d0f275f2..c07ebc8a8a4b 100644 --- a/Convex_hull_2/doc/Convex_hull_2/Convex_hull_2.txt +++ b/Convex_hull_2/doc/Convex_hull_2/Convex_hull_2.txt @@ -52,17 +52,17 @@ class need not be specified and defaults to types and operations defined in the kernel in which the input point type is defined. Given a sequence of \f$ n\f$ input points with \f$ h\f$ extreme points, -the function `convex_hull_2()` uses either the output-sensitive \f$ O(n h)\f$ algorithm of Bykat \cgalCite{b-chfsp-78} -(a non-recursive version of the quickhull \cgalCite{bdh-qach-96} algorithm) or the algorithm of Akl and Toussaint, which requires \f$ O(n \log n)\f$ time +the function `convex_hull_2()` uses either the output-sensitive \cgalBigO{n h} algorithm of Bykat \cgalCite{b-chfsp-78} +(a non-recursive version of the quickhull \cgalCite{bdh-qach-96} algorithm) or the algorithm of Akl and Toussaint, which requires \cgalBigO{n \log n} time in the worst case. The algorithm chosen depends on the kind of iterator used to specify the input points. These two algorithms are also available via the functions `ch_bykat()` and `ch_akl_toussaint()`, respectively. Also available are -the \f$ O(n \log n)\f$ Graham-Andrew scan algorithm \cgalCite{a-aeach-79}, \cgalCite{m-mdscg-84} +the \cgalBigO{n \log n} Graham-Andrew scan algorithm \cgalCite{a-aeach-79}, \cgalCite{m-mdscg-84} (`ch_graham_andrew()`), -the \f$ O(n h)\f$ Jarvis march algorithm \cgalCite{j-ichfs-73} +the \cgalBigO{n h} Jarvis march algorithm \cgalCite{j-ichfs-73} (`ch_jarvis()`), -and Eddy's \f$ O(n h)\f$ algorithm \cgalCite{e-nchap-77} +and Eddy's \cgalBigO{n h} algorithm \cgalCite{e-nchap-77} (`ch_eddy()`), which corresponds to the two-dimensional version of the quickhull algorithm. The linear-time algorithm of Melkman for producing the convex hull of @@ -105,7 +105,7 @@ provide the computation of the counterclockwise sequence of extreme points on the lower hull and upper hull, respectively. The algorithm used in these functions is Andrew's variant of Graham's scan algorithm \cgalCite{a-aeach-79}, \cgalCite{m-mdscg-84}, -which has worst-case running time of \f$ O(n \log n)\f$. +which has worst-case running time of \cgalBigO{n \log n}. There are also functions available for computing certain subsequences of the sequence of extreme points on the convex hull. The function diff --git a/Convex_hull_3/doc/Convex_hull_3/CGAL/convexity_check_3.h b/Convex_hull_3/doc/Convex_hull_3/CGAL/convexity_check_3.h index 7c51293eb3fd..cd5e70c7b459 100644 --- a/Convex_hull_3/doc/Convex_hull_3/CGAL/convexity_check_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/CGAL/convexity_check_3.h @@ -16,7 +16,7 @@ vertices of the convex hull). \cgalHeading{Implementation} This function implements the tests described in \cgalCite{mnssssu-cgpvg-96} to -determine convexity and requires \f$ O(e + f)\f$ time for a polyhedron with +determine convexity and requires \cgalBigO{e + f} time for a polyhedron with \f$ e\f$ edges and \f$ f\f$ faces. diff --git a/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d.h b/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d.h index aef8523a7d74..aa1d645b3457 100644 --- a/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d.h @@ -69,7 +69,7 @@ The time and space requirements are input dependent. Let \f$C_1\f$, \f$C_2\f$, \ let \f$ k_i\f$ be the number of facets of \f$ C_i\f$ that are visible from \f$ x\f$ and that are not already facets of \f$ C_{i-1}\f$. -Then the time for inserting \f$ x\f$ is \f$ O(dim \sum_i k_i)\f$ and +Then the time for inserting \f$ x\f$ is \cgalBigO{dim \sum_i k_i} and the number of new simplices constructed during the insertion of \f$x\f$ is the number of facets of the hull which were not already facets of the hull before the insertion. diff --git a/Documentation/doc/Documentation/Developer_manual/Chapter_intro.txt b/Documentation/doc/Documentation/Developer_manual/Chapter_intro.txt index ef2ae5bd2767..0f7d11e3f818 100644 --- a/Documentation/doc/Documentation/Developer_manual/Chapter_intro.txt +++ b/Documentation/doc/Documentation/Developer_manual/Chapter_intro.txt @@ -169,7 +169,7 @@ complexity are known. Also, the theoretic interest in efficiency for realistic inputs, as opposed to worst-case situations, is growing \cgalCite{v-ffrim-97}. For practical purposes, insight into the constant factors hidden in the -\f$ O\f$-notation is necessary, especially if there are several competing +\cgalBigO{ }-notation is necessary, especially if there are several competing algorithms. Therefore, different implementations should be supplied if there is diff --git a/Documentation/doc/Documentation/Developer_manual/Chapter_kernels.txt b/Documentation/doc/Documentation/Developer_manual/Chapter_kernels.txt index 30b566871430..78706045ef77 100644 --- a/Documentation/doc/Documentation/Developer_manual/Chapter_kernels.txt +++ b/Documentation/doc/Documentation/Developer_manual/Chapter_kernels.txt @@ -7,7 +7,7 @@ \authors Stefan Schirra The layer of geometry kernels provides -basic geometric entities of constant size\cgalFootnote{In dimension \f$ d\f$, an entity of size \f$ O(d)\f$ is considered to be of constant size.} and +basic geometric entities of constant size\cgalFootnote{In dimension \f$ d\f$, an entity of size \cgalBigO{d} is considered to be of constant size.} and primitive operations on them. Each entity is provided as both a stand-alone class, which is parameterized by a kernel class, and as a type in the kernel class. Each operation in the kernel is provided via diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index ae2cc84f6c17..94bf21fa2bd5 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -188,7 +188,9 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd=
    \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalBigO{1}=\f$O(\1)\f$" \ + "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 1cfd0a6ffd9f..7cda561372e5 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -197,7 +197,9 @@ ALIASES = "cgal=%CGAL" \ "cgalParamNEnd= \htmlonly[block] \endhtmlonly " \ "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ "cgalParamSectionEnd=\cgalParamNEnd" \ - "cgalParamPrecondition{1}=
  • Precondition: \1
  • " + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalBigO{1}=\f$O(\1)\f$" \ + "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given diff --git a/Generalized_map/doc/Generalized_map/Generalized_map.txt b/Generalized_map/doc/Generalized_map/Generalized_map.txt index 491a8c9ed3d3..f2c811e33b6f 100644 --- a/Generalized_map/doc/Generalized_map/Generalized_map.txt +++ b/Generalized_map/doc/Generalized_map/Generalized_map.txt @@ -296,7 +296,7 @@ Several functions allow to create specific configurations of darts into a genera \subsection ssecadvmarksgmap Boolean Marks -It is often necessary to mark darts, for example to retrieve in O(1) if a given dart was already processed during a specific algorithm, for example, iteration over a given range. Users can also mark specific parts of a generalized map (for example mark all the darts belonging to objects having specific semantics). To answer these needs, a `GeneralizedMap` has a certain number of Boolean marks (fixed by the constant \link GenericMap::NB_MARKS `NB_MARKS`\endlink). When one wants to use a Boolean mark, the following methods are available (with `gm` an instance of a generalized map): +It is often necessary to mark darts, for example to retrieve in \cgalBigO{1} if a given dart was already processed during a specific algorithm, for example, iteration over a given range. Users can also mark specific parts of a generalized map (for example mark all the darts belonging to objects having specific semantics). To answer these needs, a `GeneralizedMap` has a certain number of Boolean marks (fixed by the constant \link GenericMap::NB_MARKS `NB_MARKS`\endlink). When one wants to use a Boolean mark, the following methods are available (with `gm` an instance of a generalized map):
    • get a new free mark: `size_type m = gm.`\link GenericMap::get_new_mark `get_new_mark()`\endlink (throws the exception Exception_no_more_available_mark if no mark is available);
    • set mark `m` for a given dart `d0`: `gm.`\link GenericMap::mark `mark(d0,m)`\endlink; diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index d7f75bd151ac..e6daae4eb733 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -1038,7 +1038,7 @@ namespace CGAL { } /** Unmark all the darts of the map for a given mark. - * If all the darts are marked or unmarked, this operation takes O(1) + * If all the darts are marked or unmarked, this operation takes \cgalBigO{1} * operations, otherwise it traverses all the darts of the map. * @param amark the given mark. */ diff --git a/Generator/doc/Generator/CGAL/random_convex_hull_in_disc_2.h b/Generator/doc/Generator/CGAL/random_convex_hull_in_disc_2.h index 6526a99c3778..fb72a01f99a1 100644 --- a/Generator/doc/Generator/CGAL/random_convex_hull_in_disc_2.h +++ b/Generator/doc/Generator/CGAL/random_convex_hull_in_disc_2.h @@ -28,8 +28,8 @@ The generated polygon will have an average number of vertices \f$ n^\frac{1}{3}( The implementation is based on an incremental construction of a convex hull. At each step, we choose a number of points to pick uniformly at random in the disc. Then, a subset of these points, that won't change the convex hull, is evaluated using a Binomial law. As these points won't be generated, the time and size complexities are reduced \cgalCite{Devillers2014Generator}. -A tradeoff between time and memory is provided with the option `fast`, true by default. Using the `fast` option, both time and size expected complexities are \f$O\left(n^\frac{1}{3}\log^\frac{2}{3}n \right)\f$. - If this option is disabled, the expected size complexity becomes \f$O\left(n^\frac{1}{3}\right)\f$ but the expected time complexity becomes \f$O\left(n^\frac{1}{3}\log^2 n \right)\f$. +A tradeoff between time and memory is provided with the option `fast`, true by default. Using the `fast` option, both time and size expected complexities are \cgalBigOLarge{n^\frac{1}{3}\log^\frac{2}{3}n}. + If this option is disabled, the expected size complexity becomes \cgalBigOLarge{n^\frac{1}{3}} but the expected time complexity becomes \cgalBigOLarge{n^\frac{1}{3}\log^2 n}. \cgalHeading{Example} diff --git a/Generator/doc/Generator/CGAL/random_convex_set_2.h b/Generator/doc/Generator/CGAL/random_convex_set_2.h index 41f8613bc65a..7d60fc29664f 100644 --- a/Generator/doc/Generator/CGAL/random_convex_set_2.h +++ b/Generator/doc/Generator/CGAL/random_convex_set_2.h @@ -31,8 +31,8 @@ R >` for some representation class `R`, \cgalHeading{Implementation} The implementation uses the centroid method -described in \cgalCite{cgal:s-zkm-96} and has a worst case running time of \f$ O(r -\cdot n + n \cdot \log n)\f$, where \f$ r\f$ is the time needed by `pg` +described in \cgalCite{cgal:s-zkm-96} and has a worst case running time of \cgalBigO{r +\cdot n + n \cdot \log n}, where \f$ r\f$ is the time needed by `pg` to generate a random point. \cgalHeading{Example} diff --git a/Generator/doc/Generator/CGAL/random_polygon_2.h b/Generator/doc/Generator/CGAL/random_polygon_2.h index 6025350bb990..e42970739660 100644 --- a/Generator/doc/Generator/CGAL/random_polygon_2.h +++ b/Generator/doc/Generator/CGAL/random_polygon_2.h @@ -37,11 +37,11 @@ The default traits class `Default_traits` is the kernel in which The implementation is based on the method of eliminating self-intersections in a polygon by using so-called "2-opt" moves. Such a move eliminates an intersection between two edges by reversing the order of the vertices between -the edges. No more than \f$ O(n^3)\f$ such moves are required to simplify a polygon +the edges. No more than \cgalBigO{n^3} such moves are required to simplify a polygon defined on \f$ n\f$ points \cgalCite{ls-utstp-82}. Intersecting edges are detected using a simple sweep through the vertices and then one intersection is chosen at random to eliminate after each sweep. -The worse-case running time is therefore \f$ O(n^4 \log n)\f$. +The worse-case running time is therefore \cgalBigO{n^4 \log n}. \cgalHeading{Example} diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h index 5d620b9aba36..5f3c33fc739d 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h @@ -24,7 +24,7 @@ removal. \cgalHeading{Implementation} Currently, `HalfedgeDS_default` is derived from `CGAL::HalfedgeDS_list`. -The copy constructor and the assignment operator need \f$ O(n)\f$ time with +The copy constructor and the assignment operator need \cgalBigO{n} time with \f$ n\f$ the total number of vertices, halfedges, and faces. */ diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h index 66407bbf6dd3..34dce0c1363b 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h @@ -20,7 +20,7 @@ iterators that supports removal. \cgalHeading{Implementation} `HalfedgeDS_list` uses internally the `CGAL::In_place_list` container class. -The copy constructor and the assignment operator need \f$ O(n)\f$ time with +The copy constructor and the assignment operator need \cgalBigO{n} time with \f$ n\f$ the total number of vertices, halfedges, and faces. `CGAL_ALLOCATOR(int)` is used as default argument for the diff --git a/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt index 7d747c2a328c..82ad37d2d41b 100644 --- a/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt +++ b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt @@ -223,8 +223,8 @@ The algorithm is as follows: The time complexity of the algorithm is determined primarily by the choice of linear solver. In the current implementation, Cholesky -prefactorization is roughly \f$ O(N^{1.5})\f$ and computation of distances is -roughly \f$ O(N)\f$, where \f$ N\f$ is the number of vertices in the triangulation. +prefactorization is roughly \cgalBigO{N^{1.5}} and computation of distances is +roughly \cgalBigO{N}, where \f$ N\f$ is the number of vertices in the triangulation. The algorithm uses two \f$ N \times N\f$ matrices, both with the same pattern of non-zeros (in average 7 non-zeros per row/column). The cost of computation is independent of the size diff --git a/Inscribed_areas/doc/Inscribed_areas/CGAL/Largest_empty_iso_rectangle_2.h b/Inscribed_areas/doc/Inscribed_areas/CGAL/Largest_empty_iso_rectangle_2.h index 080fc203bfbe..9e7c501bd2bb 100644 --- a/Inscribed_areas/doc/Inscribed_areas/CGAL/Largest_empty_iso_rectangle_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/CGAL/Largest_empty_iso_rectangle_2.h @@ -14,8 +14,8 @@ that do not contain any point of the point set. \cgalHeading{Implementation} The algorithm is an implementation of \cgalCite{o-naler-90}. The runtime of an -insertion or a removal is \f$ O(\log n)\f$. A query takes \f$ O(n^2)\f$ worst -case time and \f$ O(n \log n)\f$ expected time. The working storage is \f$ +insertion or a removal is \cgalBigO{\log n}. A query takes \cgalBigO{n^2} worst +case time and \cgalBigO{n \log n} expected time. The working storage is \f$ O(n)\f$. */ diff --git a/Inscribed_areas/doc/Inscribed_areas/CGAL/extremal_polygon_2.h b/Inscribed_areas/doc/Inscribed_areas/CGAL/extremal_polygon_2.h index a2170b124027..be734082d3be 100644 --- a/Inscribed_areas/doc/Inscribed_areas/CGAL/extremal_polygon_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/CGAL/extremal_polygon_2.h @@ -32,8 +32,8 @@ convex polygon (oriented clock- or counterclockwise). \cgalHeading{Implementation} The implementation uses monotone matrix search -\cgalCite{akmsw-gamsa-87} and has a worst case running time of \f$ O(k -\cdot n + n \cdot \log n)\f$, where \f$ n\f$ is the number of vertices in +\cgalCite{akmsw-gamsa-87} and has a worst case running time of \cgalBigO{k +\cdot n + n \cdot \log n}, where \f$ n\f$ is the number of vertices in \f$ P\f$. */ @@ -89,8 +89,8 @@ where `K` is a model of `Kernel`. \cgalHeading{Implementation} The implementation uses monotone matrix search -\cgalCite{akmsw-gamsa-87} and has a worst case running time of \f$ O(k -\cdot n + n \cdot \log n)\f$, where \f$ n\f$ is the number of vertices in +\cgalCite{akmsw-gamsa-87} and has a worst case running time of \cgalBigO{k +\cdot n + n \cdot \log n}, where \f$ n\f$ is the number of vertices in \f$ P\f$. \cgalHeading{Example} @@ -158,8 +158,8 @@ defined that computes the squareroot of a number. \cgalHeading{Implementation} The implementation uses monotone matrix search -\cgalCite{akmsw-gamsa-87} and has a worst case running time of \f$ O(k -\cdot n + n \cdot \log n)\f$, where \f$ n\f$ is the number of vertices in +\cgalCite{akmsw-gamsa-87} and has a worst case running time of \cgalBigO{k +\cdot n + n \cdot \log n}, where \f$ n\f$ is the number of vertices in \f$ P\f$. \cgalHeading{Example} diff --git a/Inscribed_areas/include/CGAL/Largest_empty_iso_rectangle_2.h b/Inscribed_areas/include/CGAL/Largest_empty_iso_rectangle_2.h index 4ef236892ab2..a76cb0785cea 100644 --- a/Inscribed_areas/include/CGAL/Largest_empty_iso_rectangle_2.h +++ b/Inscribed_areas/include/CGAL/Largest_empty_iso_rectangle_2.h @@ -46,7 +46,7 @@ namespace CGAL { The algorithm checks all the empty rectangles that are bounded by either points or edges of the bounding box (other empty rectangles can be enlarged - and remain empty). There are O(n^2) such rectangles. It is done in three + and remain empty). There are \cgalBigO{n^2} such rectangles. It is done in three phases. In the first one empty rectangles that are bounded by two opposite edges of the bounding box are checked. In the second one, other empty rectangles that are bounded by one or two edges of the bounding box are diff --git a/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list.h b/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list.h index a8fbc32ede1f..f3d71baac8b0 100644 --- a/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list.h +++ b/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list.h @@ -9,10 +9,10 @@ allows to find all members of a set of intervals that overlap a point. \cgalHeading{Implementation} The insertion and deletion of a segment in the interval skip list -takes expected time \f$ O(\log^2 n)\f$, if the segment endpoints are +takes expected time \cgalBigO{\log^2 n}, if the segment endpoints are chosen from a continuous distribution. A stabbing query takes expected -time \f$ O(\log n)\f$, and finding all intervals that contain a point -takes expected time \f$ O(\log n + k)\f$, where \f$ k\f$ is the number of +time \cgalBigO{\log n}, and finding all intervals that contain a point +takes expected time \cgalBigO{\log n + k}, where \f$ k\f$ is the number of intervals. The implementation is based on the code developed by Eric N. Hansen. diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Aff_transformation_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Aff_transformation_d.h index b79f5d360e36..aa572c2df9a5 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Aff_transformation_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Aff_transformation_d.h @@ -17,10 +17,10 @@ by the constructors below. Affine Transformations are implemented by matrices of number type `RT` as a handle type. All operations like creation, initialization, input and output on a transformation \f$ t\f$ take time -\f$ O(t.dimension()^2)\f$. `dimension()` takes constant time. +\cgalBigO{t.dimension()^2}. `dimension()` takes constant time. The operations for inversion and composition have the cubic costs of the used matrix operations. The space requirement is -\f$ O(t.dimension()^2)\f$. +\cgalBigO{t.dimension()^2}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Direction_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Direction_d.h index 27d21d101281..d2010da0b6da 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Direction_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Direction_d.h @@ -22,9 +22,9 @@ We provide the operations of the lower dimensional interface `dx()`, Directions are implemented by arrays of integers as an item type. All operations like creation, initialization, tests, inversion, input and -output on a direction \f$ d\f$ take time \f$ O(d.\mathit{dimension}())\f$. +output on a direction \f$ d\f$ take time \cgalBigO{d.\mathit{dimension}()}. `dimension()`, coordinate access and conversion take constant -time. The space requirement is \f$ O(d.\mathit{dimension}())\f$. +time. The space requirement is \cgalBigO{d.\mathit{dimension}()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Hyperplane_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Hyperplane_d.h index 26db5cca77f4..6323520da58e 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Hyperplane_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Hyperplane_d.h @@ -27,8 +27,8 @@ other. Hyperplanes are implemented by arrays of integers as an item type. All operations like creation, initialization, tests, vector arithmetic, input and output on a hyperplane \f$ h\f$ take time -\f$ O(h.dimension())\f$. coordinate access and `dimension()` take -constant time. The space requirement is \f$ O(h.dimension())\f$. +\cgalBigO{h.dimension()}. coordinate access and `dimension()` take +constant time. The space requirement is \cgalBigO{h.dimension()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Line_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Line_d.h index fe21afdf8a5a..512c13d93b47 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Line_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Line_d.h @@ -11,10 +11,10 @@ An instance of data type `Line_d` is an oriented line in Lines are implemented by a pair of points as an item type. All operations like creation, initialization, tests, direction calculation, input and output on a line \f$ l\f$ take time -\f$ O(l.dimension())\f$. `dimension()`, coordinate and point +\cgalBigO{l.dimension()}. `dimension()`, coordinate and point access, and identity test take constant time. The operations for -intersection calculation also take time \f$ O(l.dimension())\f$. The -space requirement is \f$ O(l.dimension())\f$. +intersection calculation also take time \cgalBigO{l.dimension()}. The +space requirement is \cgalBigO{l.dimension()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Point_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Point_d.h index 3446b32e73b1..15b935188096 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Point_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Point_d.h @@ -24,9 +24,9 @@ dimensional interface `x()`, `y()`, `z()`, `hx()`, Points are implemented by arrays of `RT` items. All operations like creation, initialization, tests, point - vector arithmetic, input -and output on a point \f$ p\f$ take time \f$ O(p.dimension())\f$. +and output on a point \f$ p\f$ take time \cgalBigO{p.dimension()}. `dimension()`, coordinate access and conversions take constant -time. The space requirement for points is \f$ O(p.dimension())\f$. +time. The space requirement for points is \cgalBigO{p.dimension()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Ray_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Ray_d.h index 0f86aaa0d072..658e78f0d6c2 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Ray_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Ray_d.h @@ -12,9 +12,9 @@ it goes to infinity. Rays are implemented by a pair of points as an item type. All operations like creation, initialization, tests, direction calculation, input and output on a ray \f$ r\f$ take time -\f$ O(r.dimension())\f$. `dimension()`, coordinate and point +\cgalBigO{r.dimension()}. `dimension()`, coordinate and point access, and identity test take constant time. The space requirement is -\f$ O(r.dimension())\f$. +\cgalBigO{r.dimension()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Segment_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Segment_d.h index 1f832f54436e..ca4a082da2e2 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Segment_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Segment_d.h @@ -14,11 +14,11 @@ called the target point of \f$ s\f$, both points are called endpoints of Segments are implemented by a pair of points as an item type. All operations like creation, initialization, tests, the calculation of the direction and source - target vector, input and output on a -segment \f$ s\f$ take time \f$ O(s.dimension())\f$. `dimension()`, +segment \f$ s\f$ take time \cgalBigO{s.dimension()}. `dimension()`, coordinate and end point access, and identity test take constant time. The operations for intersection calculation also take time -\f$ O(s.dimension())\f$. The space requirement is -\f$ O(s.dimension())\f$. +\cgalBigO{s.dimension()}. The space requirement is +\cgalBigO{s.dimension()}. */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Sphere_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Sphere_d.h index 96ed16be9b2b..c00376e3aece 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Sphere_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Sphere_d.h @@ -17,11 +17,11 @@ orientation of the defining points, i.e., `orientation(A)`. Spheres are implemented by a vector of points as a handle type. All operations like creation, initialization, tests, input and output of a -sphere \f$ s\f$ take time \f$ O(s.dimension()) \f$. `dimension()`, +sphere \f$ s\f$ take time \cgalBigO{s.dimension()}$. `dimension()`, point access take constant time. The `center()`-operation takes -time \f$ O(d^3)\f$ on its first call and constant time thereafter. The -sidedness and orientation tests take time \f$ O(d^3)\f$. The space -requirement for spheres is \f$ O(s.dimension())\f$ neglecting the +time \cgalBigO{d^3} on its first call and constant time thereafter. The +sidedness and orientation tests take time \cgalBigO{d^3}. The space +requirement for spheres is \cgalBigO{s.dimension()} neglecting the storage room of the points. */ diff --git a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Vector_d.h b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Vector_d.h index c6b38b3d78d3..db6a139309b0 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Vector_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Kernel_d/Vector_d.h @@ -26,9 +26,9 @@ lower dimensional interface `x()`, `y()`, `z()`, Vectors are implemented by arrays of variables of type `RT`. All operations like creation, initialization, tests, vector arithmetic, -input and output on a vector \f$ v\f$ take time \f$ O(v.dimension())\f$. +input and output on a vector \f$ v\f$ take time \cgalBigO{v.dimension()}. coordinate access, `dimension()` and conversions take constant -time. The space requirement of a vector is \f$ O(v.dimension())\f$. +time. The space requirement of a vector is \cgalBigO{v.dimension()}. */ template< typename Kernel > diff --git a/Matrix_search/doc/Matrix_search/CGAL/sorted_matrix_search.h b/Matrix_search/doc/Matrix_search/CGAL/sorted_matrix_search.h index 399740701378..661621e5f437 100644 --- a/Matrix_search/doc/Matrix_search/CGAL/sorted_matrix_search.h +++ b/Matrix_search/doc/Matrix_search/CGAL/sorted_matrix_search.h @@ -52,7 +52,7 @@ true. The implementation uses an algorithm by Frederickson and Johnson\cgalCite{fj-fkppc-83}, \cgalCite{fj-gsrsm-84} and runs in -\f$ \mathcal{O}(n \cdot k + f \cdot \log (n \cdot k))\f$, where \f$ n\f$ is +\cgalBigO{n \cdot k + f \cdot \log (n \cdot k)}, where \f$ n\f$ is the number of input matrices, \f$ k\f$ denotes the maximal dimension of any input matrix and \f$ f\f$ the time needed for one feasibility test. diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_convex_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_convex_decomposition_2.h index eb8a49f43541..3e5baf331823 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_convex_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_convex_decomposition_2.h @@ -5,8 +5,8 @@ namespace CGAL { The `Greene_convex_decomposition_2` class implements the approximation algorithm of Greene for the decomposition of an input polygon into convex -sub-polygons \cgalCite{g-dpcp-83}. This algorithm takes \f$ O(n \log n)\f$ -time and \f$ O(n)\f$ space, where \f$ n\f$ is the size of the input polygon, +sub-polygons \cgalCite{g-dpcp-83}. This algorithm takes \cgalBigO{n \log n} +time and \cgalBigO{n} space, where \f$ n\f$ is the size of the input polygon, and outputs a decomposition whose size is guaranteed to be no more than four times the size of the optimal decomposition. @@ -38,7 +38,7 @@ and Mehlhorn for decomposing a polygon into convex sub-polygons \cgalCite{hm-ftsp-83}. This algorithm constructs a triangulation of the input polygon and proceeds by removing unnecessary triangulation edges. Given the triangulation, the -algorithm requires \f$ O(n)\f$ time and space to construct a convex +algorithm requires \cgalBigO{n} time and space to construct a convex decomposition (where \f$ n\f$ is the size of the input polygon), whose size is guaranteed to be no more than four times the size of the optimal decomposition. @@ -69,7 +69,7 @@ namespace CGAL { The `Optimal_convex_decomposition_2` class provides an implementation of Greene's dynamic programming algorithm for optimal decomposition of a polygon into convex sub-polygons \cgalCite{g-dpcp-83}. Note that -this algorithm requires \f$ O(n^4)\f$ time and \f$ O(n^3)\f$ space in +this algorithm requires \cgalBigO{n^4} time and \cgalBigO{n^3} space in the worst case, where \f$ n\f$ is the size of the input polygon. diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h index 132f04b2963f..eae2b05c67b5 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h @@ -8,8 +8,8 @@ decomposition of a polygon or a polygon with holes into pseudo trapezoids utilizing the CGAL::decompose() free function of the \ref chapterArrangement_on_surface_2 "2D Arrangements" package. -The algorithm operates in \f$ O(n \log n)\f$ time and takes -\f$ O(n)\f$ space at the worst case, where \f$ n\f$ is the +The algorithm operates in \cgalBigO{n \log n} time and takes +\cgalBigO{n} space at the worst case, where \f$ n\f$ is the size of the input polygon. \cgalModels `PolygonWithHolesConvexDecomposition_2` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h index 8688bbd2de93..cfbce57f7a38 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h @@ -12,7 +12,7 @@ connect two reflex vertices with an edge. When this is not possible any more, it eliminates the reflex vertices one by one by connecting them to other convex vertices, such that the new edge best approximates the angle bisector of the reflex vertex. The algorithm operates in -\f$ O(n^2)\f$ time and takes \f$ O(n)\f$ space at the worst case, where +\cgalBigO{n^2} time and takes \cgalBigO{n} space at the worst case, where \f$ n\f$ is the size of the input polygon. \cgalModels `PolygonConvexDecomposition_2` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt b/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt index bb0d0c90cb9a..6c6567f67e95 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Minkowski_sum_2.txt @@ -53,7 +53,7 @@ they form with the \f$ x\f$-axis; see the figure above. The Minkowski sum can therefore be computed using an operation similar to the merge step of the merge-sort algorithm\cgalFootnote{See, for example, -https://en.wikipedia.org/wiki/Merge_sort.} in \f$ O(m + n)\f$ time, +https://en.wikipedia.org/wiki/Merge_sort.} in \cgalBigO{m + n} time, starting from the two bottommost vertices in \f$ P\f$ and in \f$ Q\f$ and merging the ordered list of edges. @@ -294,7 +294,7 @@ the dynamic-programming algorithm of Greene \cgalCite{g-dpcp-83} for computing an optimal decomposition of a polygon into a minimal number of convex sub-polygons. While this algorithm results in a small number of convex polygons, it consumes rather many resources, as it runs in -\f$ O(n^4) \f$ time and \f$ O(n^3) \f$ space in the worst case, where +\cgalBigO{n^4} time and \cgalBigO{n^3} space in the worst case, where \f$ n \f$ is the number of vertices in the input polygon.
    • The `Hertel_Mehlhorn_convex_decomposition_2` class @@ -302,7 +302,7 @@ template implements the approximation algorithm suggested by Hertel and Mehlhorn \cgalCite{hm-ftsp-83}, which triangulates the input polygon and then discards unnecessary triangulation edges. After triangulation (carried out by the constrained-triangulation procedure of CGAL) the -algorithm runs in \f$ O(n) \f$ time and space, and guarantees that the +algorithm runs in \cgalBigO{n} time and space, and guarantees that the number of sub-polygons it generates is not more than four times the optimum. @@ -310,7 +310,7 @@ optimum. implementation of Greene's approximation algorithm \cgalCite{g-dpcp-83}, which computes a convex decomposition of the polygon based on its partitioning into \f$ y\f$-monotone polygons. -This algorithm runs in \f$ O(n \log n)\f$ time and \f$ O(n)\f$ space, +This algorithm runs in \cgalBigO{n \log n} time and \cgalBigO{n} space, and has the same guarantee on the quality of approximation as Hertel and Mehlhorn's algorithm. @@ -318,7 +318,7 @@ and Mehlhorn's algorithm. template is an implementation of a decomposition algorithm introduced in \cgalCite{cgal:afh-pdecm-02}. It is based on the angle-bisector decomposition method suggested by Chazelle and Dobkin -\cgalCite{cd-ocd-85}, which runs in \f$ O(n^2)\f$ time. In addition, +\cgalCite{cd-ocd-85}, which runs in \cgalBigO{n^2} time. In addition, it applies a heuristic by Flato that reduces the number of output polygons in many common cases. The convex decompositions that it produces usually yield efficient running times for Minkowski sum diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h index a528585c5c6a..05d35f8026f3 100644 --- a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_tree_with_join.h @@ -182,7 +182,7 @@ namespace CGAL { /// After one or more calls to `AABB_tree_with_join::insert()` the internal data /// structure of the tree must be reconstructed. This procedure - /// has a complexity of \f$O(n log(n))\f$, where \f$n\f$ is the number of + /// has a complexity of \cgalBigO{n log(n)}, where \f$n\f$ is the number of /// primitives of the tree. This procedure is called implicitly /// at the first call to a query member function. You can call /// AABB_tree_with_join::build() explicitly to ensure that the next call to diff --git a/Minkowski_sum_2/include/CGAL/Polygon_convex_decomposition_2.h b/Minkowski_sum_2/include/CGAL/Polygon_convex_decomposition_2.h index bda03b68ff84..60ddd0b6761c 100644 --- a/Minkowski_sum_2/include/CGAL/Polygon_convex_decomposition_2.h +++ b/Minkowski_sum_2/include/CGAL/Polygon_convex_decomposition_2.h @@ -22,7 +22,7 @@ namespace CGAL { /*! * \class - * The O(n^4) optimal strategy for decomposing a polygon into convex + * The \cgalBigO{n^4} optimal strategy for decomposing a polygon into convex * sub-polygons. */ template ` is implemented with union by rank and path compression. The running time for \f$ m\f$ set operations on \f$ n\f$ elements -is \f$ O(n \alpha(m,n))\f$ where \f$ \alpha(m,n)\f$ is the extremely slow growing +is \cgalBigO{n \alpha(m,n)} where \f$ \alpha(m,n)\f$ is the extremely slow growing inverse of Ackermann's function. */ diff --git a/Miscellany/doc/Miscellany/CGAL/Unique_hash_map.h b/Miscellany/doc/Miscellany/CGAL/Unique_hash_map.h index 05debda348d0..38cfa3c17c08 100644 --- a/Miscellany/doc/Miscellany/CGAL/Unique_hash_map.h +++ b/Miscellany/doc/Miscellany/CGAL/Unique_hash_map.h @@ -28,7 +28,7 @@ of type `Data` specified in the definition of `map`. \cgalHeading{Implementation} `Unique_hash_map` is implemented via a chained hashing scheme. Access -operations `map``[i]` take expected time \f$ O(1)\f$. The `table_size` +operations `map``[i]` take expected time \cgalBigO{1}. The `table_size` parameter passed to chained hashing can be used to avoid unnecessary rehashing when set to the number of expected elements in the map. The design is derived from the \stl `hash_map` and the \leda type diff --git a/Miscellany/doc/Miscellany/Miscellany.txt b/Miscellany/doc/Miscellany/Miscellany.txt index 54dbb62d5621..eb8ed642c346 100644 --- a/Miscellany/doc/Miscellany/Miscellany.txt +++ b/Miscellany/doc/Miscellany/Miscellany.txt @@ -47,7 +47,7 @@ global macro `CGAL_PROFILE`. The class `Unique_hash_map` implements an injective mapping between a set of unique keys and a set of data values. This is implemented using -a chained hashing scheme and access operations take \f$ O(1)\f$ expected time. +a chained hashing scheme and access operations take \cgalBigO{1} expected time. Such a mapping is useful, for example, when keys are pointers, handles, iterators or circulators that refer to unique memory locations. In this case, the default hash function is `Handle_hash_function`. @@ -57,7 +57,7 @@ In this case, the default hash function is `Handle_hash_function`. \cgal also provides a class `Union_find` that implements a partition of values into disjoint sets. This is implemented with union by rank and path compression. The running time for \f$ m\f$ set operations on \f$ n\f$ elements -is \f$ O(n\alpha(m,n))\f$ where \f$ \alpha(m,n)\f$ is the extremely slowly growing +is \cgalBigO{n\alpha(m,n)} where \f$ \alpha(m,n)\f$ is the extremely slowly growing inverse of Ackermann's function. \section MiscellanyProtected Protected Access to Internal Representations diff --git a/Nef_2/doc/Nef_2/CGAL/Nef_polyhedron_2.h b/Nef_2/doc/Nef_2/CGAL/Nef_polyhedron_2.h index 361b38fe5618..9d0bbb4126d4 100644 --- a/Nef_2/doc/Nef_2/CGAL/Nef_polyhedron_2.h +++ b/Nef_2/doc/Nef_2/CGAL/Nef_polyhedron_2.h @@ -33,14 +33,14 @@ Operations like `empty` take constant time. The operations `clear`, `complement`, `interior`, `closure`, `boundary`, `regularization`, input and output take linear time. All binary set operations and comparison operations take time -\f$ O(n \log n)\f$ where \f$ n\f$ is the size of the output plus the size of the +\cgalBigO{n \log n} where \f$ n\f$ is the size of the output plus the size of the input. The point location and ray shooting operations are implemented in two flavors. The `NAIVE` operations run in linear query time without any preprocessing, the `DEFAULT` operations (equals `LMWT`) run in sub-linear query time, but preprocessing is triggered with the -first operation. Preprocessing takes time \f$ O(N^2)\f$, the sub-linear +first operation. Preprocessing takes time \cgalBigO{N^2}, the sub-linear point location time is either logarithmic when LEDA's persistent dictionaries are present or if not then the point location time is worst-case linear, but experiments show often sublinear runtimes. Ray @@ -49,7 +49,7 @@ triangulation overlaid on the plane map representation. The cost of the walk is proportional to the number of triangles passed in direction `d` until an obstacle is met. In a minimum weight triangulation of the obstacles (the plane map representing the -polyhedron) the theory provides a \f$ O(\sqrt{n})\f$ bound for the number +polyhedron) the theory provides a \cgalBigO{\sqrt{n}} bound for the number of steps. Our locally minimum weight triangulation approximates the minimum weight triangulation only heuristically (the calculation of the minimum weight triangulation is conjectured to be NP hard). Thus diff --git a/Nef_S2/doc/Nef_S2/CGAL/Nef_polyhedron_S2.h b/Nef_S2/doc/Nef_S2/CGAL/Nef_polyhedron_S2.h index 7a297d618380..96dfc3d41f5c 100644 --- a/Nef_S2/doc/Nef_S2/CGAL/Nef_polyhedron_S2.h +++ b/Nef_S2/doc/Nef_S2/CGAL/Nef_polyhedron_S2.h @@ -58,7 +58,7 @@ Operations like `empty` take constant time. The operations `clear`, `complement`, `interior`, `closure`, `boundary`, `regularization`, input and output take linear time. All binary set operations and comparison operations take time -\f$ O(n \log n)\f$ where \f$ n\f$ is the size of the output plus the size of the +\cgalBigO{n \log n} where \f$ n\f$ is the size of the output plus the size of the input. The point location and ray shooting operations are implemented in the diff --git a/Orthtree/doc/Orthtree/Orthtree.txt b/Orthtree/doc/Orthtree/Orthtree.txt index 0a957a6fa512..bfe724038666 100644 --- a/Orthtree/doc/Orthtree/Orthtree.txt +++ b/Orthtree/doc/Orthtree/Orthtree.txt @@ -234,7 +234,7 @@ Because of its simplicity, an octree can be constructed faster than a kd-tree. %Orthtree nodes are uniform, so orthtrees will tend to have deeper hierarchies than equivalent kd-trees. As a result, orthtrees will generally perform worse for nearest neighbor searches. -Both nearest neighbor algorithms have a theoretical complexity of O(log(n)), +Both nearest neighbor algorithms have a theoretical complexity of \cgalBigO{log(n)}, but the orthtree can generally be expected to have a higher coefficient. \cgalFigureBegin{Orthtree_nearest_neighbor_benchmark_fig, nearest_neighbor_benchmark.png} diff --git a/Partition_2/doc/Partition_2/CGAL/is_y_monotone_2.h b/Partition_2/doc/Partition_2/CGAL/is_y_monotone_2.h index 2a5768e9613c..ec9e97fc8cfa 100644 --- a/Partition_2/doc/Partition_2/CGAL/is_y_monotone_2.h +++ b/Partition_2/doc/Partition_2/CGAL/is_y_monotone_2.h @@ -22,7 +22,7 @@ type `std::iterator_traits::%value_type` is defined. \cgalHeading{Implementation} -This function requires \f$ O(n)\f$ time for a polygon with \f$ n\f$ vertices. +This function requires \cgalBigO{n} time for a polygon with \f$ n\f$ vertices. \cgalHeading{Example} diff --git a/Partition_2/doc/Partition_2/CGAL/partition_2.h b/Partition_2/doc/Partition_2/CGAL/partition_2.h index 4387d8981a99..7ec0e01596b0 100644 --- a/Partition_2/doc/Partition_2/CGAL/partition_2.h +++ b/Partition_2/doc/Partition_2/CGAL/partition_2.h @@ -46,7 +46,7 @@ with the representation type determined by `std::iterator_traits This function implements the algorithm of Hertel and Mehlhorn \cgalCite{hm-ftsp-83} and is based on the class `Constrained_triangulation_2`. Given a triangulation of -the polygon, the function requires \f$ O(n)\f$ time and +the polygon, the function requires \cgalBigO{n} time and space for a polygon with \f$ n\f$ vertices. \cgalHeading{Example} @@ -116,7 +116,7 @@ with the representation type determined by `std::iterator_traits: \cgalHeading{Implementation} This function implements the approximation algorithm of -Greene \cgalCite{g-dpcp-83} and requires \f$ O(n \log n)\f$ time and \f$ O(n)\f$ space +Greene \cgalCite{g-dpcp-83} and requires \cgalBigO{n \log n} time and \cgalBigO{n} space to produce a convex partitioning given a \f$ y\f$-monotone partitioning of a polygon with \f$ n\f$ vertices. The function `y_monotone_partition_2()` is used to produce the monotone partition. @@ -184,7 +184,7 @@ with the representation type determined by `std::iterator_traits: \cgalHeading{Implementation} This function implements the dynamic programming algorithm of Greene -\cgalCite{g-dpcp-83}, which requires \f$ O(n^4)\f$ time and \f$ O(n^3)\f$ space to +\cgalCite{g-dpcp-83}, which requires \cgalBigO{n^4} time and \cgalBigO{n^3} space to produce a partitioning of a polygon with \f$ n\f$ vertices. \cgalHeading{Example} @@ -254,8 +254,8 @@ with the representation type determined by `std::iterator_traits: \cgalHeading{Implementation} This function implements the algorithm presented by de Berg et al. -\cgalCite{bkos-cgaa-97} which requires \f$ O(n \log n)\f$ time -and \f$ O(n)\f$ space for a polygon with \f$ n\f$ vertices. +\cgalCite{bkos-cgaa-97} which requires \cgalBigO{n \log n} time +and \cgalBigO{n} space for a polygon with \f$ n\f$ vertices. \cgalHeading{Example} diff --git a/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h b/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h index 69ddf012ebf3..20efe4eefc0c 100644 --- a/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h +++ b/Partition_2/doc/Partition_2/CGAL/partition_is_valid_2.h @@ -41,7 +41,7 @@ with the representation type determined by `std::iterator_traits: This function calls `partition_is_valid_2()` using the function object `Is_convex_2` to determine the convexity of each partition polygon. -Thus the time required by this function is \f$ O(n \log n + e \log e)\f$ where +Thus the time required by this function is \cgalBigO{n \log n + e \log e} where \f$ n\f$ is the total number of vertices in the partition polygons and \f$ e\f$ the total number of edges. @@ -103,7 +103,7 @@ with the representation type determined by `std::iterator_traits: \cgalHeading{Implementation} -This function requires \f$ O(n \log n + e \log e + \Sigma_{i=1}^p m_i)\f$ where \f$ n\f$ +This function requires \cgalBigO{n \log n + e \log e + \Sigma_{i=1}^p m_i} where \f$ n\f$ is the total number of vertices of the \f$ p\f$ partition polygons, \f$ e\f$ is the total number of edges of the partition polygons and \f$ m_i\f$ is the time required by `Traits::Is_valid()` to test if partition polygon \f$ p_i\f$ is valid. @@ -161,7 +161,7 @@ with the representation type determined by `std::iterator_traits: This function uses the function `partition_is_valid_2()` together with the function object `Is_y_monotone_2` to determine if each polygon -is \f$ y\f$-monotone or not. Thus the time required is \f$ O(n \log n + e \log e)\f$ +is \f$ y\f$-monotone or not. Thus the time required is \cgalBigO{n \log n + e \log e} where \f$ n\f$ is the total number of vertices of the partition polygons and \f$ e\f$ is the total number of edges. diff --git a/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h b/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h index 4cd55a933760..d7341e0f5f87 100644 --- a/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h +++ b/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h @@ -13,7 +13,7 @@ a convex polygon or not. \cgalHeading{Implementation} -This test requires \f$ O(n)\f$ time for a polygon with \f$ n\f$ vertices. +This test requires \cgalBigO{n} time for a polygon with \f$ n\f$ vertices. */ template< typename Traits > @@ -62,7 +62,7 @@ Function object class that indicates all sequences of points are valid. \cgalHeading{Implementation} -This test requires \f$ O(1)\f$ time. +This test requires \cgalBigO{1} time. */ template< typename Traits > @@ -110,7 +110,7 @@ a \f$ y\f$-monotone polygon or not. \cgalHeading{Implementation} -This test requires \f$ O(n)\f$ time for a polygon with \f$ n\f$ vertices. +This test requires \cgalBigO{n} time for a polygon with \f$ n\f$ vertices. */ template< typename Traits > diff --git a/Partition_2/doc/Partition_2/PackageDescription.txt b/Partition_2/doc/Partition_2/PackageDescription.txt index 4d5b6ba9c918..ec875293336f 100644 --- a/Partition_2/doc/Partition_2/PackageDescription.txt +++ b/Partition_2/doc/Partition_2/PackageDescription.txt @@ -31,8 +31,8 @@ Functions are available for partitioning planar polygons into two types of subpolygons (`y`-monotone polygons and convex polygons). The function that produces a `y`-monotone partitioning is based on the -algorithm presented in \cgalCite{bkos-cgaa-97} which requires \f$ O(n \log n) \f$ time -and \f$ O(n) \f$ space for a polygon with \f$ n \f$ vertices and guarantees nothing +algorithm presented in \cgalCite{bkos-cgaa-97} which requires \cgalBigO{n \log n} time +and \cgalBigO{n} space for a polygon with \f$ n \f$ vertices and guarantees nothing about the number of polygons produced with respect to the optimal number Three functions are provided for producing convex partitions. Two of these functions produce approximately optimal @@ -41,12 +41,12 @@ defined in terms of the number of partition polygons. The two functions that implement approximation algorithms are guaranteed to produce no more than four times the optimal number of convex pieces. The optimal partitioning function provides an implementation of Greene's dynamic programming algorithm -\cgalCite{g-dpcp-83}, which requires \f$ O(n^4) \f$ time and \f$ O(n^3) \f$ space to produce a +\cgalCite{g-dpcp-83}, which requires \cgalBigO{n^4} time and \cgalBigO{n^3} space to produce a convex partitioning. One of the approximation algorithms is also due to -Greene \cgalCite{g-dpcp-83} and requires \f$ O(n \log n) \f$ time and \f$ O(n) \f$ space +Greene \cgalCite{g-dpcp-83} and requires \cgalBigO{n \log n} time and \cgalBigO{n} space to produce a convex partitioning given a `y`-monotone partitioning. The other approximation algorithm is a result of Hertel and -Mehlhorn \cgalCite{hm-ftsp-83}, which requires \f$ O(n) \f$ time and space to produce +Mehlhorn \cgalCite{hm-ftsp-83}, which requires \cgalBigO{n} time and space to produce a convex partitioning from a triangulation of a polygon. Each of the partitioning functions uses a traits class to supply the primitive types and predicates used by the algorithms. diff --git a/Partition_2/doc/Partition_2/Partition_2.txt b/Partition_2/doc/Partition_2/Partition_2.txt index a574547db37b..6402e4fae467 100644 --- a/Partition_2/doc/Partition_2/Partition_2.txt +++ b/Partition_2/doc/Partition_2/Partition_2.txt @@ -39,7 +39,7 @@ is a polygon whose vertices \f$ v_1, \ldots, v_n\f$ can be divided into two chai intersects either chain at most once. For producing a \f$ y\f$-monotone partition of a given polygon, the sweep-line algorithm presented in \cgalCite{bkos-cgaa-97} is implemented by the function -`y_monotone_partition_2()`. This algorithm runs in \f$ O(n \log n)\f$ time and requires \f$ O(n)\f$ space. +`y_monotone_partition_2()`. This algorithm runs in \cgalBigO{n \log n} time and requires \cgalBigO{n} space. This algorithm does not guarantee a bound on the number of polygons produced with respect to the optimal number. @@ -72,7 +72,7 @@ An optimal convex partition can be produced using the function `optimal_convex_p This function provides an implementation of Greene's dynamic programming algorithm for optimal partitioning \cgalCite{g-dpcp-83}. -This algorithm requires \f$ O(n^4)\f$ time and \f$ O(n^3)\f$ space in the worst case. +This algorithm requires \cgalBigO{n^4} time and \cgalBigO{n^3} space in the worst case. The function `approx_convex_partition_2()` implements the simple approximation algorithm of Hertel and Mehlhorn \cgalCite{hm-ftsp-83} that @@ -81,12 +81,12 @@ throwing out unnecessary triangulation edges. The triangulation used in this function is one produced by the 2-dimensional constrained triangulation package of \cgal. For a given triangulation, this convex partitioning -algorithm requires \f$ O(n)\f$ time and space to construct a decomposition into +algorithm requires \cgalBigO{n} time and space to construct a decomposition into no more than four times the optimal number of convex pieces. The sweep-line approximation algorithm of Greene \cgalCite{g-dpcp-83}, which, given a monotone partition of a polygon, produces a convex partition in -\f$ O(n \log n)\f$ time and \f$ O(n)\f$ space, is implemented +\cgalBigO{n \log n} time and \cgalBigO{n} space, is implemented by the function `greene_approx_convex_partition_2()`. The function `y_monotone_partition_2()` described in Section \ref secpartition_2_monotone is used to produce the monotone diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h index b95c3c7f6078..bd100faf0157 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h @@ -28,19 +28,19 @@ CGAL::Triangulation_data_structure_2< \cgalHeading{Implementation} Insertion is implemented by inserting in the triangulation, then -performing a sequence of Delaunay flips. The number of flips is \f$ O(d)\f$ +performing a sequence of Delaunay flips. The number of flips is \cgalBigO{d} if the new vertex is of degree \f$ d\f$ in the new triangulation. For -points distributed uniformly at random, insertion takes time \f$ O(1)\f$ on +points distributed uniformly at random, insertion takes time \cgalBigO{1} on average. Removal calls the removal in the triangulation and then re-triangulates the hole in such a way that the Delaunay criterion is -satisfied. Removal of a vertex of degree \f$ d\f$ takes time \f$ O(d^2)\f$. The -expected degree \f$ d\f$ is \f$ O(1)\f$ for a random vertex in the +satisfied. Removal of a vertex of degree \f$ d\f$ takes time \cgalBigO{d^2}. The +expected degree \f$ d\f$ is \cgalBigO{1} for a random vertex in the triangulation. After a point location step, the nearest neighbor is found in time -\f$ O(n)\f$ in the worst case, but in expected time \f$ O(1)\f$ on average for +\cgalBigO{n} in the worst case, but in expected time \cgalBigO{1} on average for vertices distributed uniformly at random and any query point. \sa `CGAL::Periodic_2_triangulation_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h index af9757a095f8..1689f5187bc4 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h @@ -55,7 +55,7 @@ optional parameter is given). Insertion of a point is done by locating a face that contains the point, and then splitting this face. Apart from the location, -insertion takes a time \f$ O(1)\f$. +insertion takes a time \cgalBigO{1}. Removal of a vertex is more difficult than in the Euclidean space, since the star of a vertex may not be disjoint from the star of a diff --git a/Polygon/include/CGAL/Polygon_2_algorithms.h b/Polygon/include/CGAL/Polygon_2_algorithms.h index 8233269217af..a66bff191bfb 100644 --- a/Polygon/include/CGAL/Polygon_2_algorithms.h +++ b/Polygon/include/CGAL/Polygon_2_algorithms.h @@ -231,7 +231,7 @@ bool is_convex_2(ForwardIterator first, /// /// The simplicity test is implemented by means of a plane sweep algorithm. /// The algorithm is quite robust when used with inexact number types. -/// The running time is `O(n log n)`, where n is the number of vertices of the +/// The running time is \cgalBigO{n log n}, where n is the number of vertices of the /// polygon. /// /// \sa `PolygonTraits_2` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 8d541588736c..00ccfd382f66 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -543,8 +543,8 @@ This can allow a user to stop the algorithm if a timeout needs to be implemented The hole filling algorithm has a complexity which depends on the number of vertices. While \cgalCite{liepa2003filling} has a running -time of \f$ O(n^3)\f$ , \cgalCite{zou2013algorithm} in most cases has -running time of \f$ O(n \log n)\f$. We benchmarked the function +time of \cgalBigO{n^3} , \cgalCite{zou2013algorithm} in most cases has +running time of \cgalBigO{n \log n}. We benchmarked the function `triangulate_refine_and_fair_hole()` for the two meshes below (as well as two more meshes with smaller holes). The machine used was a PC running Windows 10 with an Intel Core i7 CPU clocked at 2.70 GHz. diff --git a/QP_solver/doc/QP_solver/QP_solver.txt b/QP_solver/doc/QP_solver/QP_solver.txt index 56c6a0aa44ec..5328a563deef 100644 --- a/QP_solver/doc/QP_solver/QP_solver.txt +++ b/QP_solver/doc/QP_solver/QP_solver.txt @@ -351,7 +351,7 @@ Similarly, if the solver knows that the program is nonnegative, it will be more efficient than under the general bounds \f$ \qpl\leq \qpx \leq \qpu\f$. You can argue that nonnegativity is something that could easily -be checked in time \f$ O(n)\f$ beforehand, but then again nonnegative +be checked in time \cgalBigO{n} beforehand, but then again nonnegative programs are so frequent that the syntactic sugar aspect becomes somewhat important. After all, we can save four iterators in specifying a nonnegative linear program in terms of the concept diff --git a/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h b/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h index b11ee290e950..9fb98710126d 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Compact_container.h @@ -82,7 +82,7 @@ container. The iterator does not have constant amortized time complexity for the increment and decrement operations in all cases, only when not too many elements have not been freed (i.e.\ when the `size()` is close to the `capacity()`). Iterating from `begin()` to `end()` takes -`O(capacity())` time, not `size()`. In the case where the container +\cgalBigO{capacity()} time, not `size()`. In the case where the container has a small `size()` compared to its `capacity()`, we advise to "defragment the memory" by copying the container if the iterator performance is needed. @@ -661,7 +661,7 @@ void clear(); /// \name Ownership testing /// The following functions are mostly helpful for efficient debugging, since -/// their complexity is \f$ O(\sqrt{\mathrm{c.capacity()}})\f$. +/// their complexity is \cgalBigO{\sqrt{\mathrm{c.capacity()}}}. /// @{ /*! @@ -681,7 +681,7 @@ bool owns_dereferenceable(const_iterator pos); /// @{ /*! adds the items of `cc2` to the end of `cc` and `cc2` becomes empty. -The time complexity is O(`cc`.`capacity()`-`cc`.`size()`). +The time complexity is \cgalBigO{cc.capacity()-cc.size()}. \pre `cc2` must not be the same as `cc`, and the allocators of `cc` and `cc2` must be compatible: `cc.get_allocator() == cc2.get_allocator()`. */ void merge(Compact_container &cc); 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 dd7f392daf2f..4ce97a3e7024 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Concurrent_compact_container.h @@ -92,7 +92,7 @@ container. The iterator does not have constant amortized time complexity for the increment and decrement operations in all cases, only when not too many elements have not been freed (i.e.\ when the `size()` is close to the `capacity()`). Iterating from `begin()` to `end()` takes -`O(capacity())` time, not `size()`. In the case where the container +\cgalBigO{capacity()} time, not `size()`. In the case where the container has a small `size()` compared to its `capacity()`, we advise to \"defragment the memory\" by copying the container if the iterator performance is needed. @@ -289,7 +289,7 @@ complexity. No exception is thrown. /// \name Ownership testing /// The following functions are mostly helpful for efficient debugging, since -/// their complexity is \f$ O(\sqrt{\mathrm{c.capacity()}})\f$. +/// their complexity is \cgalBigO{\sqrt{\mathrm{c.capacity()}}}. /// @{ /// returns whether `pos` is in the range `[ccc.begin(), ccc.end()]` (`ccc.end()` included). bool owns(const_iterator pos); @@ -302,7 +302,7 @@ complexity. No exception is thrown. /// @{ /*! adds the items of `ccc2` to the end of `ccc` and `ccc2` becomes empty. -The time complexity is O(`ccc`.`capacity()`-`ccc`.`size()`). +The time complexity is \cgalBigO{ccc.capacity()-ccc.size()}. \pre `ccc2` must not be the same as `ccc`, and the allocators of `ccc` and `ccc2` must be compatible: `ccc.get_allocator() == ccc2.get_allocator()`. */ void merge(Concurrent_compact_container &ccc2); diff --git a/STL_Extension/doc/STL_Extension/CGAL/In_place_list.h b/STL_Extension/doc/STL_Extension/CGAL/In_place_list.h index d5dc49c9d138..faf647e48040 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/In_place_list.h +++ b/STL_Extension/doc/STL_Extension/CGAL/In_place_list.h @@ -749,7 +749,7 @@ void reverse(); /// @{ /*! sorts the list `ipl` according to the -`operator<` in time \f$ O(n \log n)\f$ where `n = size()`. +`operator<` in time \cgalBigO{n \log n} where `n = size()`. It is stable. \pre a suitable `operator<` for the type `T`. */ diff --git a/STL_Extension/doc/STL_Extension/CGAL/Multiset.h b/STL_Extension/doc/STL_Extension/CGAL/Multiset.h index a81cabb29eaf..f9d8715a1de0 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Multiset.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Multiset.h @@ -73,12 +73,12 @@ less-than operator (`operator<`). `Multiset` uses a proprietary implementation of a red-black tree data-structure. The red-black tree invariants guarantee that the height of a -tree containing \f$ n\f$ elements is \f$ O(\log{n})\f$ (more precisely, it is bounded by +tree containing \f$ n\f$ elements is \cgalBigO{\log{n}} (more precisely, it is bounded by \f$ 2 \log_{2}{n}\f$). As a consequence, all methods that accept an element and need to locate it in the tree (namely `insert(x)`, `erase(x)`, `find(x)`, `count(x)`, `lower_bound(x)` , `upper_bound(x)`, -`find_lower(x)` and `equal_range(x)`) take \f$ O(\log{n})\f$ time and -perform \f$ O(\log{n})\f$ comparison operations. +`find_lower(x)` and `equal_range(x)`) take \cgalBigO{\log{n}} time and +perform \cgalBigO{\log{n}} comparison operations. On the other hand, the set operations that accept a position iterator (namely `insert_before(pos, x)`, `insert_after(pos, x)` and `erase(pos)`) @@ -87,12 +87,12 @@ cost (see \cgalCite{gs-dfbt-78} and \cgalCite{t-dsna-83} for more details). More important, these set operations require no comparison operations. Therefore, it is highly recommended to maintain the set via iterators to the stored elements, whenever possible. The function `insert(pos, x)` -is safer to use, but it takes amortized \f$ O(\min\{d,\log{n}\})\f$ time, where \f$ d\f$ +is safer to use, but it takes amortized \cgalBigO{\min\{d,\log{n}\}} time, where \f$ d\f$ is the distance between the given position and the true position of `x`. In addition, it always performs at least two comparison operations. The `catenate()` and `split()` functions are also very efficient, and -can be performed in \f$ O(\log{n})\f$ time, where \f$ n\f$ is the total number of +can be performed in \cgalBigO{\log{n}} time, where \f$ n\f$ is the total number of elements in the sets, and without performing any comparison operations (see \cgalCite{t-dsna-83} for the details). Note however that the size of two sets resulting from a split operation is diff --git a/STL_Extension/include/CGAL/Multiset.h b/STL_Extension/include/CGAL/Multiset.h index e0193fb4b9a6..e043627ec150 100644 --- a/STL_Extension/include/CGAL/Multiset.h +++ b/STL_Extension/include/CGAL/Multiset.h @@ -544,25 +544,25 @@ class Multiset //@{ /*! - * Default constructor. [takes O(1) operations] + * Default constructor. [takes \cgalBigO{1} operations] */ Multiset (); /*! - * Constructor with a comparison object. [takes O(1) operations] + * Constructor with a comparison object. [takes \cgalBigO{1} operations] * \param comp A comparison object to be used by the tree. */ Multiset (const Compare& comp); /*! - * Copy constructor. [takes O(n) operations] + * Copy constructor. [takes \cgalBigO{n} operations] * \param tree The copied tree. */ Multiset (const Self& tree); /*! * Construct a tree that contains all objects in the given range. - * [takes O(n log n) operations] + * [takes \cgalBigO{n log n} operations] * \param first An iterator for the first object in the range. * \param last A past-the-end iterator for the range. */ @@ -587,18 +587,18 @@ class Multiset } /*! - * Destructor. [takes O(n) operations] + * Destructor. [takes \cgalBigO{n} operations] */ virtual ~Multiset () noexcept(!CGAL_ASSERTIONS_ENABLED); /*! - * Assignment operator. [takes O(n) operations] + * Assignment operator. [takes \cgalBigO{n} operations] * \param tree The copied tree. */ Self& operator= (const Self& tree); /*! - * Swap two trees. [takes O(1) operations] + * Swap two trees. [takes \cgalBigO{1} operations] * \param tree The copied tree. */ void swap (Self& tree); @@ -608,13 +608,13 @@ class Multiset //@{ /*! - * Test two trees for equality. [takes O(n) operations] + * Test two trees for equality. [takes \cgalBigO{n} operations] * \param tree The compared tree. */ bool operator== (const Self& tree) const; /*! - * Check if our tree is lexicographically smaller. [takes O(n) operations] + * Check if our tree is lexicographically smaller. [takes \cgalBigO{n} operations] * \param tree The compared tree. */ bool operator< (const Self& tree) const; @@ -707,8 +707,8 @@ class Multiset } /*! - * Get the size of the tree. [takes O(1) operations, unless the tree - * was involved in a split operation, then it may take O(n) time.] + * Get the size of the tree. [takes \cgalBigO{1} operations, unless the tree + * was involved in a split operation, then it may take \cgalBigO{n} time.] * \return The number of objects stored in the tree. */ size_t size () const; @@ -725,14 +725,14 @@ class Multiset /// \name Insertion functions. /*! - * Insert an object into the tree. [takes O(log n) operations] + * Insert an object into the tree. [takes \cgalBigO{log n} operations] * \param object The object to be inserted. * \return An iterator pointing to the inserted object. */ iterator insert (const Type& object); /*! - * Insert a range of k objects into the tree. [takes O(k log n) operations] + * Insert a range of k objects into the tree. [takes \cgalBigO{k log n} operations] * \param first An iterator for the first object in the range. * \param last A past-the-end iterator for the range. */ @@ -751,7 +751,7 @@ class Multiset /*! * Insert an object to the tree, with a given hint to its position. - * [takes O(log n) operations at worst-case, but only O(1) amortized] + * [takes \cgalBigO{log n} operations at worst-case, but only \cgalBigO{1} amortized] * \param position A hint for the position of the object. * \param object The object to be inserted. * \return An iterator pointing to the inserted object. @@ -761,7 +761,7 @@ class Multiset /*! * Insert an object to the tree, as the successor the given object. - * [takes O(log n) operations at worst-case, but only O(1) amortized] + * [takes \cgalBigO{log n} operations at worst-case, but only \cgalBigO{1} amortized] * \param position Points to the object after which the new object should * be inserted (or an invalid iterator to insert the object * as the tree minimum). @@ -774,7 +774,7 @@ class Multiset /*! * Insert an object to the tree, as the predecessor the given object. - * [takes O(log n) operations at worst-case, but only O(1) amortized] + * [takes \cgalBigO{log n} operations at worst-case, but only \cgalBigO{1} amortized] * \param position Points to the object before which the new object should * be inserted (or an invalid iterator to insert the object * as the tree maximum). @@ -789,7 +789,7 @@ class Multiset //@{ /*! - * Erase objects from the tree. [takes O(log n) operations] + * Erase objects from the tree. [takes \cgalBigO{log n} operations] * \param object The object to be removed. * \return The number of objects removed from the tree. * Note that all iterators to the erased objects become invalid. @@ -798,7 +798,7 @@ class Multiset /*! * Remove the object pointed by the given iterator. - * [takes O(log n) operations at worst-case, but only O(1) amortized] + * [takes \cgalBigO{log n} operations at worst-case, but only \cgalBigO{1} amortized] * \param position An iterator pointing the object to be erased. * \pre The iterator must be a valid. * Note that all iterators to the erased object become invalid. @@ -806,7 +806,7 @@ class Multiset void erase (iterator position); /*! - * Clear the contents of the tree. [takes O(n) operations] + * Clear the contents of the tree. [takes \cgalBigO{n} operations] */ void clear (); @@ -817,7 +817,7 @@ class Multiset /*! * Search the tree for the given key (non-const version). - * [takes O(log n) operations] + * [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return A iterator pointing to the first equivalent object in the tree, @@ -843,7 +843,7 @@ class Multiset /*! * Search the tree for the given key (const version). - * [takes O(log n) operations] + * [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return A iterator pointing to the first equivalent object in the tree, @@ -869,7 +869,7 @@ class Multiset /*! * Count the number of object in the tree equivalent to a given key. - * [takes O(log n + d) operations] + * [takes \cgalBigO{log n + d} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The number of equivalent objects. @@ -905,7 +905,7 @@ class Multiset /*! * Get the first element whose key is not less than a given key - * (non-const version). [takes O(log n) operations] + * (non-const version). [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The lower bound of the key, or end() if the key is not found @@ -931,7 +931,7 @@ class Multiset /*! * Get the first element whose key is not less than a given key - * (non-const version). [takes O(log n) operations] + * (non-const version). [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The lower bound of the key, along with a flag indicating whether @@ -957,7 +957,7 @@ class Multiset /*! * Get the first element whose key is greater than a given key - * (non-const version). [takes O(log n) operations] + * (non-const version). [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The upper bound of the key, or end() if the key is not found @@ -983,7 +983,7 @@ class Multiset /*! * Get the first element whose key is not less than a given key - * (const version). [takes O(log n) operations] + * (const version). [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The lower bound of the key, or end() if the key is not found @@ -1009,7 +1009,7 @@ class Multiset /*! * Get the first element whose key is not less than a given key - * (const version). [takes O(log n) operations] + * (const version). [takes \cgalBigO{log n} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return The lower bound of the key, along with a flag indicating whether @@ -1035,7 +1035,7 @@ class Multiset /*! * Get the first element whose key is greater than a given key - * (const version). [takes O(log n) operations] + * (const version). [takes \cgalBigO{log n} operations] * \param object The query object. * \return The upper bound of the key, or end() if the key is not found * in the tree. @@ -1060,7 +1060,7 @@ class Multiset /*! * Get the range of objects in the tree that are equivalent to a given key - * (non-const version). [takes O(log n + d) operations] + * (non-const version). [takes \cgalBigO{log n + d} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return A pair of (lower_bound(key), upper_bound(key)). @@ -1108,7 +1108,7 @@ class Multiset /*! * Get the range of objects in the tree that are equivalent to a given key - * (const version). [takes O(log n + d) operations] + * (const version). [takes \cgalBigO{log n + d} operations] * \param key The query key. * \param comp_key A comparison functor for comparing keys and objects. * \return A pair of (lower_bound(key), upper_bound(key)). @@ -1163,7 +1163,7 @@ class Multiset /*! * Replace the object pointed by a given iterator with another object. - * [takes O(1) operations] + * [takes \cgalBigO{1} operations] * \param position An iterator pointing the object to be replaced. * \param object The new object. * \pre The given iterator is valid. @@ -1174,7 +1174,7 @@ class Multiset /*! * Swap the location two objects in the tree, given by their positions. - * [takes O(1) operations] + * [takes \cgalBigO{1} operations] * \param pos1 An iterator pointing to the first object. * \param pos1 An iterator pointing to the second object. * \pre The two iterators are valid. @@ -1184,7 +1184,7 @@ class Multiset /*! * Catenate the tree with a given tree, whose minimal object is not less - * than the maximal object of this tree. [takes O(log n) operations] + * than the maximal object of this tree. [takes \cgalBigO{log n} operations] * The function clears the other given tree, but all its iterators remain * valid and can be used with the catenated tree. * \param tree The tree to catenate to out tree. @@ -1196,7 +1196,7 @@ class Multiset /*! * Split the tree such that all remaining objects are less than a given * key, and all objects greater than (or equal to) this key form - * a new output tree. [takes O(log n) operations] + * a new output tree. [takes \cgalBigO{log n} operations] * \param key The split key. * \param comp_key A comparison functor for comparing keys and objects. * \param tree Output: The tree that will eventually contain all objects @@ -1220,7 +1220,7 @@ class Multiset /*! * Split the tree at a given position, such that it contains all objects * in the range [begin, position) and all objects in the range - * [position, end) form a new output tree. [takes O(log n) operations] + * [position, end) form a new output tree. [takes \cgalBigO{log n} operations] * \param position An iterator pointing at the split position. * \param tree Output: The output tree. * \pre The output tree is initially empty. @@ -1240,13 +1240,13 @@ class Multiset bool is_valid() const; /*! - * Get the height of the tree. [takes O(n) operations] + * Get the height of the tree. [takes \cgalBigO{n} operations] * \return The length of the longest path from the root to a leaf node. */ size_t height () const; /*! - * Get the black-height of the tree. [takes O(1) operations] + * Get the black-height of the tree. [takes \cgalBigO{1} operations] * \return The number of black nodes from the root to each leaf node. */ inline size_t black_height () const diff --git a/SearchStructures/doc/SearchStructures/CGAL/Range_tree_d.h b/SearchStructures/doc/SearchStructures/CGAL/Range_tree_d.h index 74f308e00c7a..03b3bbb1c3b6 100644 --- a/SearchStructures/doc/SearchStructures/CGAL/Range_tree_d.h +++ b/SearchStructures/doc/SearchStructures/CGAL/Range_tree_d.h @@ -9,11 +9,11 @@ points that lie inside a given \f$ d\f$-dimensional interval. \cgalHeading{Implementation} -The construction of a \f$ d\f$-dimensional range tree takes \f$ {O}(n\log n^{d-1})\f$ +The construction of a \f$ d\f$-dimensional range tree takes \cgalBigO{n\log n^{d-1}} time. The points in -the query window are reported in time \f$ {O}(k+{\log}^d n )\f$, where \f$ k\f$ +the query window are reported in time \cgalBigO{k+{\log}^d n }, where \f$ k\f$ is the number of reported points. -The tree uses \f$ {O}(n\log n^{d-1})\f$ storage. +The tree uses \cgalBigO{n\log n^{d-1}} storage. */ template< typename Data, typename Window, typename Traits > diff --git a/SearchStructures/doc/SearchStructures/CGAL/Segment_tree_d.h b/SearchStructures/doc/SearchStructures/CGAL/Segment_tree_d.h index 21986c30679c..f440ab4dc29d 100644 --- a/SearchStructures/doc/SearchStructures/CGAL/Segment_tree_d.h +++ b/SearchStructures/doc/SearchStructures/CGAL/Segment_tree_d.h @@ -8,10 +8,10 @@ namespace CGAL { \cgalHeading{Implementation} -A \f$ d\f$-dimensional segment tree is constructed in \f$ {O}(n\log n^d)\f$ time. -An inverse range query is performed in time \f$ {O}(k+{\log}^d n )\f$, where \f$ k\f$ +A \f$ d\f$-dimensional segment tree is constructed in \cgalBigO{n\log n^d} time. +An inverse range query is performed in time \cgalBigO{k+{\log}^d n }, where \f$ k\f$ is the number of reported intervals. -The tree uses \f$ {O}(n\log n^d)\f$ storage. +The tree uses \cgalBigO{n\log n^d} storage. */ template< typename Data, typename Window, typename Traits > diff --git a/SearchStructures/doc/SearchStructures/SearchStructures.txt b/SearchStructures/doc/SearchStructures/SearchStructures.txt index fd27bfc4fec1..e0eb1a4289b2 100644 --- a/SearchStructures/doc/SearchStructures/SearchStructures.txt +++ b/SearchStructures/doc/SearchStructures/SearchStructures.txt @@ -299,9 +299,9 @@ The 2-dimensional tree is a binary search tree on the first dimension. Each subl For the d-dimensional range tree, the figure shows one sublayer tree for each layer of the tree. -The tree can be built in \f$ O(n\log^{d-1} n)\f$ time and -needs \f$ O(n\log^{d-1} n)\f$ space. The ` d`-dimensional points that lie in the -` d`-dimensional query interval can be reported in \f$ O(\log^dn+k)\f$ time, +The tree can be built in \cgalBigO{n\log^{d-1} n} time and +needs \cgalBigO{n\log^{d-1} n} space. The ` d`-dimensional points that lie in the +` d`-dimensional query interval can be reported in \cgalBigO{\log^dn+k} time, where ` n` is the total number of points and ` k` is the number of reported points. @@ -437,11 +437,11 @@ sublayer tree of a vertex `v` is a segment tree according to the second dimension of all data items of `v`. -The tree can be built in \f$ O(n\log^{d} n)\f$ time and -needs \f$ O(n\log^{d} n)\f$ space. +The tree can be built in \cgalBigO{n\log^{d} n} time and +needs \cgalBigO{n\log^{d} n} space. The processing time for inverse range -queries in an ` d`-dimensional segment tree is \f$ O(\log^d n -+k)\f$ time, where ` n` is the total number of intervals and ` k` is +queries in an ` d`-dimensional segment tree is \cgalBigO{\log^d n ++k} time, where ` n` is the total number of intervals and ` k` is the number of reported intervals. One possible application of a two-dimensional segment tree is the diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt index 306fa9e2a91c..db694f9de60b 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Segment_Delaunay_graph_2.txt @@ -276,7 +276,7 @@ homogeneous coordinates of bit size at most \f$ 3b+O(1)\f$. The supporting lines of the segments (they are needed in some of the predicates) have coefficients which are always of bit size \f$ 2b+O(1)\f$. As a result, the bit size of the expressions involved in -our predicates will always be \f$ O(b)\f$, independently of the +our predicates will always be \cgalBigO{b}, independently of the size of the input. The `SegmentDelaunayGraphSite_2` concept encapsulates the ideas presented above. A site is represented in this concept by up to four @@ -348,7 +348,7 @@ intersecting sites represented in homogeneous coordinates of bit size \f$ b\f$, the maximum bit size of the algebraic expressions involved in the predicates is \f$ 40 b+O(1)\f$. Given our site representation given above we can guarantee that even in the case of strongly intersecting sites, -the algebraic degree of the predicates remains \f$ O(b)\f$, independently +the algebraic degree of the predicates remains \cgalBigO{b}, independently of the size of the input. What we want to focus in the remainder of this section are the different kinds of filtering techniques that we have employed in our implementation. diff --git a/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt b/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt index c21ee4bd0f07..1fe21f703456 100644 --- a/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt +++ b/Set_movable_separability_2/doc/Set_movable_separability_2/Set_movable_separability_2.txt @@ -82,8 +82,8 @@ ill-condition. The implementation is based on an algorithm developed by Shamai and Halperin; see \cgalCite{cgal:ss-spfis-16} for the generalization of -the algorithm to 3D. The time and space complexities are in \f$O(n)\f$ -and \f$O(1)\f$, respectively. In order to ensure robustness and +the algorithm to 3D. The time and space complexities are in \cgalBigO{n} +and \cgalBigO{1}, respectively. In order to ensure robustness and correctness you must use a kernel that guarantees exact constructions as well as exact predicates, e,g,. `Exact_predicates_exact_constructions_kernel`. diff --git a/Solver_interface/include/CGAL/Eigen_sparse_matrix.h b/Solver_interface/include/CGAL/Eigen_sparse_matrix.h index 20e8962bb152..8e123deeb527 100644 --- a/Solver_interface/include/CGAL/Eigen_sparse_matrix.h +++ b/Solver_interface/include/CGAL/Eigen_sparse_matrix.h @@ -202,8 +202,8 @@ struct Eigen_sparse_matrix /// Read access to a matrix coefficient. /// /// \warning Complexity: - /// - O(log(n)) if the matrix is already built. - /// - O(n) if the matrix is not built. + /// - \cgalBigO{log(n)} if the matrix is already built. + /// - \cgalBigO{n} if the matrix is not built. /// `n` being the number of entries in the matrix. /// /// \pre 0 <= i < row_dimension(). diff --git a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/K_means_clustering.h b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/K_means_clustering.h index 60892a3a56ad..35ec3e2d3450 100644 --- a/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/K_means_clustering.h +++ b/Surface_mesh_segmentation/include/CGAL/Surface_mesh_segmentation/internal/K_means_clustering.h @@ -48,7 +48,7 @@ class Selector * T2 should be constructable by T1 * * Implementation note: it is a variant of Floyd generator, and has uniform distribution - * where k = number of centers = complexity is O(k log k), and mem overhead is O(k) + * where k = number of centers = complexity is \cgalBigO{k log k}, and mem overhead is \cgalBigO{k} * * I also left previous implementation below, it might be useful where number of centers close to number of points */ @@ -78,7 +78,7 @@ class Selector // To future reference, I also left prev implementation which is a variant of Fisher–Yates shuffle, however to keep `points` intact I use another vector to // store and swap indices. - // where n = number of points; complexity = O(n), memory overhead = O(n) + // where n = number of points; complexity = \cgalBigO{n}, memory overhead = \cgalBigO{n} /* template void forgy_initialization(std::size_t number_of_centers, const std::vector& points, std::vector& centers) diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Surface_mesh_shortest_path.txt b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Surface_mesh_shortest_path.txt index cce82b0061fc..9ea81028369f 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Surface_mesh_shortest_path.txt +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Surface_mesh_shortest_path.txt @@ -46,7 +46,7 @@ type the property map must provide an index between 0 and the number of simplice the class `CGAL::Surface_mesh` as model of `FaceListGraph`. If you use the class `CGAL::Polyhedron_3`, you should use it with the item class `CGAL::Polyhedron_items_with_id_3`, for which default property maps are provided. -This item class associates to each simplex an index that provides a \f$O(1)\f$ time access to the indices. +This item class associates to each simplex an index that provides a \cgalBigO{1} time access to the indices. Note that the initialization of the property maps requires a call to `set_halfedgeds_items_id()`. The access to the embedding of each vertex is done using a point vertex property map associating to each vertex a 3D point. @@ -111,7 +111,7 @@ the kernel's number type to `double`, using the `std::sqrt`, and converting it b with directly supports square roots to get the most precision of the shortest path computations. Using a kernel such as `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` with this package will indeed provide the exact shortest paths, -but it will be extremely slow. Indeed, in order to compute the distance along the surface, it is necessary to unfold sequences of faces, edge-to-edge, out into a common plane. The functor `SurfaceMeshShortestPathTraits::Construct_triangle_3_to_triangle_2_projection` provides an initial layout of the first face in a sequence, by rotating a given face into the `xy`-plane. `SurfaceMeshShortestPathTraits::Construct_triangle_3_along_segment_2_flattening` unfolds a triangle into the plane, using a specified segment as a base. Since this results in a chain of constructed triangles in the plane, the exact representation types used with this kernel (either `CORE::Expr` or `leda_real`) will process extremely slow, even on very simple inputs. This is because the exact representations will effectively add an \f$O(n)\f$ factor to every computation. +but it will be extremely slow. Indeed, in order to compute the distance along the surface, it is necessary to unfold sequences of faces, edge-to-edge, out into a common plane. The functor `SurfaceMeshShortestPathTraits::Construct_triangle_3_to_triangle_2_projection` provides an initial layout of the first face in a sequence, by rotating a given face into the `xy`-plane. `SurfaceMeshShortestPathTraits::Construct_triangle_3_along_segment_2_flattening` unfolds a triangle into the plane, using a specified segment as a base. Since this results in a chain of constructed triangles in the plane, the exact representation types used with this kernel (either `CORE::Expr` or `leda_real`) will process extremely slow, even on very simple inputs. This is because the exact representations will effectively add an \cgalBigO{n} factor to every computation. \section Surface_mesh_shortest_pathExamples Examples diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h index 0b94bf1d71cd..189bf48e16da 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path.h @@ -45,7 +45,7 @@ namespace CGAL { \brief Computes shortest surface paths from one or more source points on a surface mesh. -\details Uses an optimized variation of Chen and Han's \f$ O(n^2) \f$ algorithm by Xin and Wang. +\details Uses an optimized variation of Chen and Han's \cgalBigO{n^2} algorithm by Xin and Wang. Refer to those respective papers for the details of the implementation. \tparam Traits a model of `SurfaceMeshShortestPathTraits`. diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt index c77e981af711..4ce425fb91f2 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt @@ -53,7 +53,7 @@ Given a cycle drawn on a surface one can ask if the cycle can be continuously de The algorithm implemented in this package builds a data structure to efficiently answer queries of the following forms: - Given a combinatorial surface \f$\cal{M}\f$ and a closed combinatorial curve specified as a sequence of edges of \f$\cal{M}\f$, decide if the curve is homotopic to a simple one on \f$\cal{M}\f$. -The algorithm used is based on a paper by Despré and Lazarus \cgalCite{cgal:dl-cginc-19}, providing a \f$O(n + l\log{l})\f$-time algorithm where \f$n\f$ is the complexity of \f$\cal{M}\f$ and \f$l\f$ is the length of the path. +The algorithm used is based on a paper by Despré and Lazarus \cgalCite{cgal:dl-cginc-19}, providing a \cgalBigO{n + l\log{l}}-time algorithm where \f$n\f$ is the complexity of \f$\cal{M}\f$ and \f$l\f$ is the length of the path. \section SMTopology_HowToUse API Description @@ -322,7 +322,7 @@ As the algorithm inductively builds orderings, it has to determine a relative or The red edge is being processed and is compared against the pink edge which is the first edge of the path. The blue and green edges are the first diverging pair when tracing backward. The dashed line means that edges have not been processed yet. Since the green edge lies to the right of the blue edge around the vertex, the red edge must be to the right of the pink edge in the ordering. \cgalFigureEnd -The transverse orderings are stored in red-black trees, one for each edge of the quadrangulation. So each insertion or search takes \f$O(\log{l})\f$ time, where \f$l\f$ is the length of the closed curve. +The transverse orderings are stored in red-black trees, one for each edge of the quadrangulation. So each insertion or search takes \cgalBigO{\log{l}} time, where \f$l\f$ is the length of the closed curve. \subsubsection SMTopology_Simplicity_Test_Verification Verify Ordering After computing a tentative ordering within the edges of the path, we have to verify that such an ordering could result in an intersection free arrangement. Since there is no intersection within an edge, we only need to verify this for each vertex in the quadrangulation. Each vertex is naturally associated with a circular ordering of the incident path edges by concatenating clockwise the orderings computed for every incident edge in the quadrangulation. We consider the two consecutive edges composing a turn (one going in the vertex, one going out of the vertex) at the vertex being verified as a pair. The ordering at the vertex is intersection free if and only if there is no two pairs crossing each other according to the clockwise ordering around the vertex. In other words, for any two pairs \f$(a, a')\f$ and \f$(b, b')\f$, none of the subsequences \f$a, b, a', b'\f$ or \f$a, b', a', b\f$ should appear in the clockwise ordering. This is very similar to verifying balanced parentheses in a string. We traverse clockwise at each vertex and use a stack-based algorithm to verify in linear time that the ordering produces a cycle without self-intersection. diff --git a/Surface_sweep_2/doc/Surface_sweep_2/Surface_sweep_2.txt b/Surface_sweep_2/doc/Surface_sweep_2/Surface_sweep_2.txt index 05eba3e97570..097490409ba1 100644 --- a/Surface_sweep_2/doc/Surface_sweep_2/Surface_sweep_2.txt +++ b/Surface_sweep_2/doc/Surface_sweep_2/Surface_sweep_2.txt @@ -13,7 +13,7 @@ namespace CGAL { Let \f$ {\mathcal C} = \{C_1, C_2, \ldots, C_n\}\f$ be a set of curves. We wish to compute all intersection points between two curves in the set in an output-sensitive manner, without having to go over -all \f$ O(n^2)\f$ curve pairs. To this end, we sweep an imaginary line +all \cgalBigO{n^2} curve pairs. To this end, we sweep an imaginary line \f$ l\f$ from \f$ x = -\infty\f$ to \f$ x = \infty\f$ over the plane. While sweeping the plane, we keep track of the order of curves intersecting it. This order changes at a finite number of event @@ -36,8 +36,8 @@ employs certified computations. This traits class must be a model of the `ArrangementTraits_2` concept - see the Chapter \ref chapterArrangement_on_surface_2 "2D Arrangements" for more details. -The complexity of the surface-sweep algorithm is \f$ O((n + -k)\log{n})\f$ where \f$ n\f$ is the number of the input curves and \f$ +The complexity of the surface-sweep algorithm is \cgalBigO{(n + +k)\log{n}} where \f$ n\f$ is the number of the input curves and \f$ k\f$ is the number of intersection points induced by these curves. \section Surface_sweep_2Example Example diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index c992f6d7cd31..dbe8b0c68a87 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -513,11 +513,11 @@ Then, for each point to insert, it locates it by walking in the triangulation, using the previously inserted vertex as a "hint". Finally, the point is inserted. In the worst case scenario, without spatial sort, the expected complexity is -\f$ O(n^{\lceil\frac{d}{2}\rceil+1}) \f$. +\cgalBigO{(n^{\lceil\frac{d}{2}\rceil+1}}$. When the algorithm is run on uniformly distributed points, the localization complexity is -\f$ O(n^{\frac{1}{d}}) \f$ and the size of the triangulation is \f$ O(n) \f$, which gives -a complexity of \f$ O(n^{1+\frac{1}{d}}) \f$ for the insertion. -With spatial sort and random points, one can expect a complexity of \f$ O(n\log n) \f$. +\cgalBigO{(n^{\frac{1}{d}}}$ and the size of the triangulation is \cgalBigO{(n}$, which gives +a complexity of \cgalBigO{(n^{1+\frac{1}{d}}}$ for the insertion. +With spatial sort and random points, one can expect a complexity of \cgalBigO{(n\log n}$. Please refer to \cgalCite{boissonnat2009Delaunay} for more details. We provide below (\cgalFigureRef{Triangulationfigbenchmarks100}, diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Delaunay_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Delaunay_triangulation_2.h index 45a4fe12c20c..ec43542e73fe 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Delaunay_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Delaunay_triangulation_2.h @@ -54,20 +54,20 @@ All the types defined in `Triangulation_2` are inherited. \cgalHeading{Implementation} Insertion is implemented by inserting in the triangulation, then -performing a sequence of Delaunay flips. The number of flips is \f$ O(d)\f$ +performing a sequence of Delaunay flips. The number of flips is \cgalBigO{d} if the new vertex is of degree \f$ d\f$ in the new triangulation. For -points distributed uniformly at random, insertion takes time \f$ O(1)\f$ on +points distributed uniformly at random, insertion takes time \cgalBigO{1} on average. Removal calls the removal in the triangulation and then re-triangulates the hole in such a way that the Delaunay criterion is satisfied. Removal of a -vertex of degree \f$ d\f$ takes time \f$ O(d^2)\f$. -The degree \f$ d\f$ is \f$ O(1)\f$ for a random +vertex of degree \f$ d\f$ takes time \cgalBigO{d^2}. +The degree \f$ d\f$ is \cgalBigO{1} for a random vertex in the triangulation. After a point location step, the nearest neighbor -is found in time \f$ O(n)\f$ in the -worst case, but in time \f$ O(1)\f$ +is found in time \cgalBigO{n} in the +worst case, but in time \cgalBigO{1} for vertices distributed uniformly at random and any query point. \sa `CGAL::Triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_2.h index f892df6a10c4..570114a5b999 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_2.h @@ -137,20 +137,20 @@ for faces of maximal dimension instead of faces. Locate is implemented by a line walk from a vertex of the face given as optional parameter (or from a finite vertex of `infinite_face()` if no optional parameter is given). It takes -time \f$ O(n)\f$ in the worst case, but only \f$ O(\sqrt{n})\f$ +time \cgalBigO{n} in the worst case, but only \cgalBigO{\sqrt{n}} on average if the vertices are distributed uniformly at random. Insertion of a point is done by locating a face that contains the point, and then splitting this face. If the point falls outside the convex hull, the triangulation is restored by flips. Apart from the location, insertion takes a time -time \f$ O(1)\f$. This bound is only an amortized bound +time \cgalBigO{1}. This bound is only an amortized bound for points located outside the convex hull. Removal of a vertex is done by removing all adjacent triangles, and -re-triangulating the hole. Removal takes time \f$ O(d^2)\f$ in the worst +re-triangulating the hole. Removal takes time \cgalBigO{d^2} in the worst case, if \f$ d\f$ is the degree of the removed vertex, -which is \f$ O(1)\f$ for a random vertex. +which is \cgalBigO{1} for a random vertex. The face, edge, and vertex iterators on finite features are derived from their counterparts visiting all (finite and infinite) diff --git a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt index 1c9dc8781e24..249c5a0117de 100644 --- a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt +++ b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt @@ -412,7 +412,7 @@ The walk begins at a vertex of the face which is given as an optional argument or at an arbitrary vertex of the triangulation if no optional argument is given. It takes -time \f$ O(n)\f$ in the worst case for Delaunay Triangulations, but only \f$ O(\sqrt{n})\f$ +time \cgalBigO{n} in the worst case for Delaunay Triangulations, but only \cgalBigO{\sqrt{n}} on average if the vertices are distributed uniformly at random. The class `Triangulation_hierarchy_2`, described in section \ref Section_2D_Triangulations_Hierarchy, @@ -423,14 +423,14 @@ Insertion of a point is done by locating a face that contains the point, and splitting this face into three new faces. If the point falls outside the convex hull, the triangulation is restored by flips. Apart from the location, insertion takes a -time \f$ O(1)\f$. This bound is only an amortized bound +time \cgalBigO{1}. This bound is only an amortized bound for points located outside the convex hull. Removal of a vertex is done by removing all adjacent triangles, and re-triangulating the hole. Removal takes a time at most proportional to \f$ d^2\f$, where \f$ d\f$ is the degree of the removed vertex, -which is \f$ O(1)\f$ for a random vertex. +which is \cgalBigO{1} for a random vertex. Displacement of a vertex is done by: first, verifying if the triangulation embedding remains planar after the displacement; if yes the vertex is directly placed at the new location; otherwise, a point is inserted at the new location @@ -592,18 +592,18 @@ The insertion of a new point in the Delaunay triangulation is performed using first the insertion member function of the basic triangulation and second performing a sequence of flips to restore the Delaunay property. -The number of flips that have to be performed is \f$ O(d)\f$ +The number of flips that have to be performed is \cgalBigO{d} if the new vertex has degree \f$ d\f$ in the updated Delaunay triangulation. For points distributed uniformly at random, -each insertion takes time \f$ O(1)\f$ on +each insertion takes time \cgalBigO{1} on average, once the point has been located in the triangulation. Removal calls the removal in the triangulation and then re-triangulates the hole created in such a way that the Delaunay criterion is satisfied. Removal of a -vertex of degree \f$ d\f$ takes time \f$ O(d^2)\f$. -The degree \f$ d\f$ is \f$ O(1)\f$ for a random +vertex of degree \f$ d\f$ takes time \cgalBigO{d^2}. +The degree \f$ d\f$ is \cgalBigO{1} for a random vertex in the triangulation. When the degree of the removed vertex is small (\f$ \leq7\f$) a special procedure is used that allows to decrease global removal time by a factor of 2 @@ -611,14 +611,14 @@ for random points \cgalCite{d-vrtdd-09}. The displacement of a vertex \f$ v\f$ at a point \f$ p\f$ to a new location \f$ p'\f$, first checks whether the triangulation embedding remains planar or not after moving \f$ v\f$ to \f$ p'\f$. If yes, it moves \f$ v\f$ to \f$ p'\f$ and simply performs a sequence of flips -to restore the Delaunay property, which is \f$ O(d)\f$ where \f$ d\f$ is the degree of the vertex after the displacement. +to restore the Delaunay property, which is \cgalBigO{d} where \f$ d\f$ is the degree of the vertex after the displacement. Otherwise, the displacement is done by inserting a vertex at the new location, and removing the obsolete vertex. -The complexity is \f$ O(n)\f$ in the worst case, but only \f$ O(1 + \delta \sqrt{n})\f$ for evenly distributed vertices in the unit square, where \f$ \delta\f$ is the Euclidean distance between the new and old locations. +The complexity is \cgalBigO{n} in the worst case, but only \cgalBigO{1 + \delta \sqrt{n}} for evenly distributed vertices in the unit square, where \f$ \delta\f$ is the Euclidean distance between the new and old locations. After having performed a point location, the -nearest neighbor of a point is found in time \f$ O(n)\f$ in the -worst case, but in time \f$ O(1)\f$ +nearest neighbor of a point is found in time \cgalBigO{n} in the +worst case, but in time \cgalBigO{1} for vertices distributed uniformly at random and any query point. \subsection Subsection_2D_Triangulations_Delaunay_Terrain Example: a Delaunay Terrain diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_3.h index 1b185f5383f3..ba49e83c87ab 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_3.h @@ -19,14 +19,14 @@ respectively. \tparam LP is a tag which must be a `Location_policy`: either `CGAL::Fast_location` or `CGAL::Compact_location`. -`CGAL::Fast_location` offers faster (\f$ O(\log n)\f$ time) point +`CGAL::Fast_location` offers faster (\cgalBigO{\log n} time) point location, which can be beneficial when performing point locations or random point insertions (with no good location hint) in large data sets. It is currently implemented using an additional triangulation hierarchy data structure \cgalCite{cgal:d-dh-02}. The default is `CGAL::Compact_location`, which saves memory (3-5%) by avoiding the need for this separate data structure, and point location is then performed roughly in -\f$ O(n^{1/3})\f$ time. +\cgalBigO{n^{1/3}} time. If the triangulation is parallel (see user manual), the default compact location policy must be used. Note that this argument can also come in second position, which can be useful when diff --git a/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt b/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt index f8ebae52e971..0b1170a552ed 100644 --- a/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt +++ b/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt @@ -841,7 +841,7 @@ system when clearing or destroying the triangulation. This can be important for algorithms like simplifications of data sets which will produce fragmented memory usage (doing fresh copies of the data structures are one way out in such cases). The asymptotic memory overhead of `Compact_container` for its -internal bookkeeping is otherwise on the order of \f$ O(\sqrt{n})\f$. +internal bookkeeping is otherwise on the order of \cgalBigO{\sqrt{n}}. \cgalFigureRef{Triangulation3figmemory} shows the number of bytes used per points, as measured empirically using `Memory_sizer` for large triangulations diff --git a/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h index 3ad8ae611443..fcaf29e1a7cd 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h @@ -5,7 +5,7 @@ namespace CGAL { \brief This class is a model of the concept `Visibility_2` can answer visibility queries within a polygon that may have holes. -\details The algorithm does not require preprocessing. It relies on the algorithm of T. Asano \cite ta-aeafvpprh-85 based on angular plane sweep, with a time complexity of \f$O (n \log n)\f$ in the number of vertices. +\details The algorithm does not require preprocessing. It relies on the algorithm of T. Asano \cite ta-aeafvpprh-85 based on angular plane sweep, with a time complexity of \cgalBigO{n \log n} in the number of vertices. \tparam Arrangement_2_ is the type used to represent the input environment. @@ -63,7 +63,7 @@ class Rotational_sweep_visibility_2 { /*! Attaches the given arrangement to the visibility object. -This operation takes \f$O(1)\f$ as the class does no pre-processing. +This operation takes \cgalBigO{1} as the class does no pre-processing. In case the object is already attached to another arrangement, the visibility object gets detached before being attached to `arr`. diff --git a/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h index f073ea8cc24b..daa988c11b2d 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h @@ -12,7 +12,7 @@ It computes the visibility region from a viewpoint that is in the interior or on While scanning the boundary the algorithm uses a stack to manipulate the vertices, and ultimately yields the visibility region. For each scanned edge, at most 2 points are pushed onto the stack. Overall, at most 2\f$ n \f$ points are pushed or popped. Thus, the time and space complexities of the -algorithm are \f$ O(n) \f$ even in case of degeneracies such as needles, where \f$ n \f$ +algorithm are \cgalBigO{n}$ even in case of degeneracies such as needles, where \f$ n \f$ is the number of the vertices of the polygon. \tparam Arrangement_2_ is the type used to represent the input environment. @@ -67,7 +67,7 @@ class Simple_polygon_visibility_2 { /*! Attaches the given arrangement to the visibility object. -This operation takes \f$O(1)\f$ as the class does no pre-processing. +This operation takes \cgalBigO{1} as the class does no pre-processing. In case the object is already attached to another arrangement, the visibility object gets detached before being attached to `arr`. diff --git a/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h index 178a812957dc..6606de87dfa4 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h @@ -6,8 +6,8 @@ namespace CGAL { \details The algorithm obtains a constrained triangulation from the input arrangement, then computes visibility by expanding the triangle that contains the query point. -Preprocessing takes \f$ O(n)\f$ time and \f$ O(n) \f$ space, where \f$ n \f$ is the number of vertices of input polygon. -The query time is \f$ O(nh)\f$, where \f$ h \f$ is the number of holes+1 of input polygon. Thus, for simple polygons (or a polygon with a constant number of holes) the algorithm complexity is linear, but it is \f$ O(n^2)\f$ in the worst case, as the number of holes can be linear in \f$ n \f$. +Preprocessing takes \cgalBigO{n} time and \cgalBigO{n}$ space, where \f$ n \f$ is the number of vertices of input polygon. +The query time is \cgalBigO{nh}, where \f$ h \f$ is the number of holes+1 of input polygon. Thus, for simple polygons (or a polygon with a constant number of holes) the algorithm complexity is linear, but it is \cgalBigO{n^2} in the worst case, as the number of holes can be linear in \f$ n \f$. \tparam Arrangement_2_ is the type used to represent the input environment. @@ -63,7 +63,7 @@ class Triangular_expansion_visibility_2 { /*! Attaches the given arrangement to the visibility object and computes the restricted triangulation. -This takes \f$ O(n) \f$ time, where \f$ n \f$ is the number of vertices. +This takes \cgalBigO{n}$ time, where \f$ n \f$ is the number of vertices. From this moment on the class observes changes in the arrangement. If the arrangement changes a new restricted triangulation is computed. Re-attaching forces re-computation. diff --git a/Visibility_2/doc/Visibility_2/visibility_2.txt b/Visibility_2/doc/Visibility_2/visibility_2.txt index 891d813009fd..d0dcdc09c49b 100644 --- a/Visibility_2/doc/Visibility_2/visibility_2.txt +++ b/Visibility_2/doc/Visibility_2/visibility_2.txt @@ -74,9 +74,9 @@ The following models of the `Visibility_2` concept are provided:
      Class | Function | Preprocessing | Query |Algorithm -------------------------------|-----------------------------------------------------|-------------------------------|-----------------------------------|------------------------------- - `Simple_polygon_visibility_2` | simple polygons | No |\f$ O(n) \f$ time and \f$ O(n) \f$ space | B. Joe and R. B. Simpson \cite bjrb-clvpa-87 - `Rotational_sweep_visibility_2` | polygons with holes | No | \f$ O(n\log n) \f$ time and \f$ O(n) \f$ space | T. Asano \cite ta-aeafvpprh-85 -`Triangular_expansion_visibility_2` | polygons with holes | \f$ O(n) \f$ time and \f$ O(n) \f$ space | \f$ O(nh) \f$ time and \f$ O(n) \f$ space. | Bungiu et al. \cite ecvp-bhhhk-14 + `Simple_polygon_visibility_2` | simple polygons | No |\cgalBigO{n}$ time and \cgalBigO{n}$ space | B. Joe and R. B. Simpson \cite bjrb-clvpa-87 + `Rotational_sweep_visibility_2` | polygons with holes | No | \cgalBigO{n\log n}$ time and \cgalBigO{n}$ space | T. Asano \cite ta-aeafvpprh-85 +`Triangular_expansion_visibility_2` | polygons with holes | \cgalBigO{n}$ time and \cgalBigO{n}$ space | \cgalBigO{nh}$ time and \cgalBigO{n}$ space. | Bungiu et al. \cite ecvp-bhhhk-14
      Where \f$ n \f$ denotes the number of vertices of \f$ f \f$ and \f$ h \f$ the number of holes+1. @@ -158,4 +158,4 @@ During Google Summer of Code 2014 Ning Xu fixed a bug in `CGAL::Simple_polygon_v } -// `Preprocessed_rotational_sweep_visibility_2` | polygons with holes | \f$ O(n^2) \f$ time and \f$ O(n^2) \f$ space | \f$ O(n) \f$ time and \f$ O(n) \f$ space | Takao Asano, Tetsuo Asano etc \cite aaghi-vpsesp-85 +// `Preprocessed_rotational_sweep_visibility_2` | polygons with holes | \cgalBigO{n^2}$ time and \cgalBigO{n^2}$ space | \cgalBigO{n}$ time and \cgalBigO{n}$ space | Takao Asano, Tetsuo Asano etc \cite aaghi-vpsesp-85 From 75a03661609a04949cf81adfbd0f1b30281cfc4e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jul 2023 08:44:38 +0100 Subject: [PATCH 0449/1398] Surface_mesh_approximation: Deal with boundary edges --- .../internal/parameters_interface.h | 1 + .../CGAL/Variational_shape_approximation.h | 119 ++++++++++-------- 2 files changed, 68 insertions(+), 52 deletions(-) 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 7792ad5cdb60..d88c06a5f5ea 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -222,6 +222,7 @@ CGAL_add_named_parameter(number_of_relaxations_t, number_of_relaxations, number_ CGAL_add_named_parameter(use_convex_hull_t, use_convex_hull, use_convex_hull) // meshing parameters +CGAL_add_named_parameter(boundary_subdivision_ratio_t, boundary_subdivision_ratio, boundary_subdivision_ratio) CGAL_add_named_parameter(subdivision_ratio_t, subdivision_ratio, subdivision_ratio) CGAL_add_named_parameter(relative_to_chord_t, relative_to_chord, relative_to_chord) CGAL_add_named_parameter(with_dihedral_angle_t, with_dihedral_angle, with_dihedral_angle) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 566aec602d73..e7c4a2a8a318 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -795,6 +795,12 @@ class Variational_shape_approximation { * \cgalParamDefault{`5.0`} * \cgalParamNEnd * + * \cgalParamNBegin{boundary_subdivision_ratio} + * \cgalParamDescription{the chord subdivision ratio threshold to the chord length or average edge length for boundary edges} + * \cgalParamType{`geom_traits::FT`} + * \cgalParamDefault{`5.0`} + * \cgalParamNEnd + * * \cgalParamNBegin{relative_to_chord} * \cgalParamDescription{If `true`, the `subdivision_ratio` is the ratio of the furthest vertex distance * to the chord length, otherwise is the average edge length} @@ -827,6 +833,7 @@ class Variational_shape_approximation { using parameters::choose_parameter; const FT subdivision_ratio = choose_parameter(get_parameter(np, internal_np::subdivision_ratio), FT(5.0)); + const FT boundary_subdivision_ratio = choose_parameter(get_parameter(np, internal_np::boundary_subdivision_ratio), FT(5.0)); const bool relative_to_chord = choose_parameter(get_parameter(np, internal_np::relative_to_chord), false); const bool with_dihedral_angle = choose_parameter(get_parameter(np, internal_np::with_dihedral_angle), false); const bool optimize_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_anchor_location), true); @@ -848,7 +855,7 @@ class Variational_shape_approximation { // generate anchors find_anchors(); - find_edges(subdivision_ratio, relative_to_chord, with_dihedral_angle); + find_edges(subdivision_ratio, boundary_subdivision_ratio, relative_to_chord, with_dihedral_angle); add_anchors(); // discrete constrained Delaunay triangulation @@ -1519,6 +1526,7 @@ class Variational_shape_approximation { * @param with_dihedral_angle if set to `true`, add dihedral angle weight to the distance. */ void find_edges(const FT subdivision_ratio, + const FT boundary_subdivision_ratio, const bool relative_to_chord, const bool with_dihedral_angle) { // collect candidate halfedges in a set @@ -1550,7 +1558,7 @@ class Variational_shape_approximation { Boundary_chord chord; walk_to_next_anchor(he_start, chord); m_bcycles.back().num_anchors += subdivide_chord(chord.begin(), chord.end(), - subdivision_ratio, relative_to_chord, with_dihedral_angle); + subdivision_ratio, boundary_subdivision_ratio, relative_to_chord, with_dihedral_angle); #ifdef CGAL_SURFACE_MESH_APPROXIMATION_DEBUG std::cerr << "#chord_anchor " << m_bcycles.back().num_anchors << std::endl; @@ -1846,6 +1854,7 @@ class Variational_shape_approximation { const Boundary_chord_iterator &chord_begin, const Boundary_chord_iterator &chord_end, const FT subdivision_ratio, + const FT boundary_subdivision_ratio, const bool relative_to_chord, const bool with_dihedral_angle) { const std::size_t chord_size = std::distance(chord_begin, chord_end); @@ -1854,6 +1863,8 @@ class Variational_shape_approximation { const std::size_t anchor_first = get(m_vanchor_map, source(he_first, *m_ptm)); const std::size_t anchor_last = get(m_vanchor_map, target(he_last, *m_ptm)); + bool is_boundary = is_border_edge(he_first, *m_ptm); + // do not subdivide trivial non-circular chord if ((anchor_first != anchor_last) && (chord_size < 4)) return 1; @@ -1879,67 +1890,71 @@ class Variational_shape_approximation { if_subdivide = true; } else { - FT dist_max(0.0); - Vector_3 chord_vec = vector_functor(pt_begin, pt_end); - const FT chord_len = CGAL::approximate_sqrt(chord_vec.squared_length()); - bool degenerate_chord = false; - if (chord_len > FT(0.0)) { - chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); - for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); - vec = cross_product_functor(chord_vec, vec); - const FT dist = CGAL::approximate_sqrt(vec.squared_length()); - if (dist > dist_max) { - chord_max = citr; - dist_max = dist; - } + FT dist_max(0.0); + Vector_3 chord_vec = vector_functor(pt_begin, pt_end); + const FT chord_len = CGAL::approximate_sqrt(chord_vec.squared_length()); + bool degenerate_chord = false; + if (chord_len > FT(0.0)) { + chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); + for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { + Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); + vec = cross_product_functor(chord_vec, vec); + const FT dist = CGAL::approximate_sqrt(vec.squared_length()); + if (dist > dist_max) { + chord_max = citr; + dist_max = dist; + } + } } - } - else { - degenerate_chord = true; - for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( - pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); - if (dist > dist_max) { - chord_max = citr; - dist_max = dist; - } + else { + degenerate_chord = true; + for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { + const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( + pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); + if (dist > dist_max) { + chord_max = citr; + dist_max = dist; + } + } } - } - FT criterion = dist_max; - if (relative_to_chord && !degenerate_chord) - criterion /= chord_len; - else - criterion /= m_average_edge_length; - - if (with_dihedral_angle) { - // suppose the proxy normal angle is acute - std::size_t px_left = get(m_fproxy_map, face(he_first, *m_ptm)); - std::size_t px_right = px_left; - if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) - px_right = get(m_fproxy_map, face(opposite(he_first, *m_ptm), *m_ptm)); - FT norm_sin(1.0); - if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) { - Vector_3 vec = cross_product_functor( - m_px_planes[px_left].normal, m_px_planes[px_right].normal); - norm_sin = CGAL::approximate_sqrt(vec.squared_length()); + FT criterion = dist_max; + if (relative_to_chord && !degenerate_chord) + criterion /= chord_len; + else + criterion /= m_average_edge_length; + + if (with_dihedral_angle) { + // suppose the proxy normal angle is acute + std::size_t px_left = get(m_fproxy_map, face(he_first, *m_ptm)); + std::size_t px_right = px_left; + if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) + px_right = get(m_fproxy_map, face(opposite(he_first, *m_ptm), *m_ptm)); + FT norm_sin(1.0); + if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) { + Vector_3 vec = cross_product_functor( + m_px_planes[px_left].normal, m_px_planes[px_right].normal); + norm_sin = CGAL::approximate_sqrt(vec.squared_length()); + } + criterion *= norm_sin; + } + if (is_boundary) { + if (criterion > boundary_subdivision_ratio) + if_subdivide = true; + } + else { + if (criterion > subdivision_ratio) + if_subdivide = true; } - criterion *= norm_sin; - } - - if (criterion > subdivision_ratio) - if_subdivide = true; } - if (if_subdivide) { // subdivide at the most remote vertex attach_anchor(*chord_max); const std::size_t num_left = subdivide_chord(chord_begin, chord_max + 1, - subdivision_ratio, relative_to_chord, with_dihedral_angle); + subdivision_ratio, boundary_subdivision_ratio, relative_to_chord, with_dihedral_angle); const std::size_t num_right = subdivide_chord(chord_max + 1, chord_end, - subdivision_ratio, relative_to_chord, with_dihedral_angle); + subdivision_ratio, boundary_subdivision_ratio, relative_to_chord, with_dihedral_angle); return num_left + num_right; } From 72044ffed4ef0ab1f6d3b580b41616258d294b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 5 Jul 2023 09:54:22 +0200 Subject: [PATCH 0450/1398] move test to make sure it is not re-added later --- .../developer_scripts/run_testsuite_with_ctest | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index b86a5b9f705e..3e13edc6a7e3 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -105,13 +105,6 @@ collect_all_current_platforms() build_platforms_list() { for LOCAL_PLATFORM in $1; do - # MSVC2015 does not support C++17 - if [ $2 \> "CGAL-6.0" ]; then - if [ "LOCAL_PLATFORM" = "MSVC2015-Release-64bits" ]; then - continue - fi - fi - if [ "${LOCAL_PLATFORM}" = "all" ] ; then USE_REFERENCE_PLATFORMS='y' else @@ -177,8 +170,8 @@ setup_dirs() # directories existing in the reference release are added to $PLATFORMS # PLATFORMS="" - build_platforms_list "`value_of BUILD_ON_${HOST}`" "${CGAL_RELEASE_ID}" - build_platforms_list "`value_of COMPILERS_${HOST}`" "${CGAL_RELEASE_ID}" + build_platforms_list "`value_of BUILD_ON_${HOST}`" + build_platforms_list "`value_of COMPILERS_${HOST}`" if [ -n "${USE_REFERENCE_PLATFORMS}" ]; then collect_all_reference_platforms @@ -186,6 +179,13 @@ setup_dirs() for PLATFORM in ${PLATFORMS}; do + # MSVC2015 does not support C++17 + if [ "${CGAL_RELEASE_ID}" \> "CGAL-6.0" ]; then + if [ "PLATFORM" = "MSVC2015-Release-64bits" ]; then + continue + fi + fi + CGAL_BINARY_DIR=${CGAL_BINARY_DIR_BASE}/${PLATFORM} if [ ! -d "${CGAL_BINARY_DIR}" ]; then From c0db92d0e906cc78495e70c75bfef06c4e063768 Mon Sep 17 00:00:00 2001 From: albert-github Date: Wed, 5 Jul 2023 12:13:40 +0200 Subject: [PATCH 0451/1398] issue #7395 Improvement of layout of model relations Consistent implementation for the `AABB_tree` in respect to `Has Model` and `Is Model Of` --- AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h | 2 +- AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h | 11 ++++++----- .../AABB_tree/Concepts/AABBPrimitiveWithSharedData.h | 7 ++++--- .../Concepts/AABBRayIntersectionGeomTraits.h | 2 +- .../AABB_tree/Concepts/AABBRayIntersectionTraits.h | 3 ++- AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h | 3 ++- .../include/CGAL/AABB_face_graph_triangle_primitive.h | 2 +- .../CGAL/AABB_halfedge_graph_segment_primitive.h | 4 ++-- .../include/CGAL/AABB_polyhedron_segment_primitive.h | 2 +- .../include/CGAL/AABB_polyhedron_triangle_primitive.h | 2 +- AABB_tree/include/CGAL/AABB_primitive.h | 4 ++-- AABB_tree/include/CGAL/AABB_segment_primitive.h | 2 +- AABB_tree/include/CGAL/AABB_traits.h | 5 ++--- AABB_tree/include/CGAL/AABB_triangle_primitive.h | 2 +- .../CGAL/AABB_triangulation_3_triangle_primitive.h | 2 +- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 10 ++++++++++ Documentation/doc/resources/1.9.6/BaseDoxyfile.in | 10 ++++++++++ 17 files changed, 48 insertions(+), 25 deletions(-) diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h index 2f1fdc3e5c6b..75823eb238ae 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h @@ -11,7 +11,7 @@ and the primitives stored in the AABB tree. \cgalRefines{SearchGeomTraits_3} -\cgalHasModel All models of the concept `Kernel` +\cgalHasModelsBare{All models of the concept `Kernel`} \sa `CGAL::AABB_traits` \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h index 11195b5808ec..4a987a58cbb2 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h @@ -12,11 +12,12 @@ The concept `AABBPrimitive` describes the requirements for the primitives stored The `Primitive` type can be, e.g., a wrapper around a `Handle`. Assume for instance that the input objects are the triangle faces of a mesh stored as a `CGAL::Polyhedron_3`. The `Datum` would be a `Triangle_3` and the `Id` would be a polyhedron `Face_handle`. Method `datum()` can return either a `Triangle_3` constructed on the fly from the face handle or a `Triangle_3` stored internally. This provides a way for the user to trade memory for efficiency. -\cgalHasModel `CGAL::AABB_primitive` -\cgalHasModel `CGAL::AABB_segment_primitive` -\cgalHasModel `CGAL::AABB_triangle_primitive` -\cgalHasModel `CGAL::AABB_halfedge_graph_segment_primitive` -\cgalHasModel `CGAL::AABB_face_graph_triangle_primitive` +\cgalHasModelsBegin CGAL::AABB_primitive +\cgalHasModels CGAL::AABB_segment_primitive +\cgalHasModels CGAL::AABB_triangle_primitive +\cgalHasModels CGAL::AABB_halfedge_graph_segment_primitive +\cgalHasModels CGAL::AABB_face_graph_triangle_primitive +\cgalHasModelsEnd */ class AABBPrimitive { diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h index 3c47d53d5529..8ec9a103acdc 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h @@ -21,9 +21,10 @@ The `Datum` would be a `Triangle_3` and the `Id` a `std::size_t`. The shared dat `std::vector`. The method `datum(const Shared_data&)` then returns a triangle from the vector. -\cgalHasModel `CGAL::AABB_primitive` -\cgalHasModel `CGAL::AABB_halfedge_graph_segment_primitive` -\cgalHasModel `CGAL::AABB_face_graph_triangle_primitive` +\cgalHasModelsBegin CGAL::AABB_primitive +\cgalHasModels CGAL::AABB_halfedge_graph_segment_primitive +\cgalHasModels CGAL::AABB_face_graph_triangle_primitive +\cgalHasModelsEnd */ class AABBPrimitiveWithSharedData { diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h index a90c498a7ec3..f47f1e9464bc 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h @@ -9,7 +9,7 @@ define the Intersection_distance functor. \cgalRefines{AABBGeomTraits} -\cgalHasModel All models of the concept `Kernel` +\cgalHasModelsBare{All models of the concept `Kernel`} \sa `CGAL::AABB_traits` \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h index 215cbd659249..87d139973b5c 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h @@ -7,7 +7,8 @@ The concept `AABBRayIntersectionTraits` is a refinement of the concept `AABBTraits` it also requires function objects to calculate the distance of an intersection along a ray. -\cgalHasModel `CGAL::AABB_traits` +\cgalHasModelsBegin CGAL::AABB_traits +\cgalHasModelsEnd \sa `CGAL::AABB_tree` \sa `AABBPrimitive` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h index c7f0e806faf6..f5e5846322e3 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h @@ -5,7 +5,8 @@ The concept `AABBTraits` provides the geometric primitive types and methods for the class `CGAL::AABB_tree`. -\cgalHasModel `CGAL::AABB_traits` +\cgalHasModelsBegin CGAL::AABB_traits +\cgalHasModelsEnd \cgalRefines{SearchGeomTraits_3} diff --git a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h index 6d12a85adefa..5422c84b2ae6 100644 --- a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h @@ -33,7 +33,7 @@ namespace CGAL { * while the AABB tree holding the primitive is in use. * The triangle type of the primitive (`Datum`) is `CGAL::Kernel_traits< boost::property_traits< VertexPointPMap >::%value_type >::%Kernel::Triangle_3`. * - * \cgalModels `AABBPrimitiveWithSharedData` + * \cgalModels{AABBPrimitiveWithSharedData} * *\tparam FaceGraph is a model of the face graph concept. *\tparam VertexPointPMap is a property map with `boost::graph_traits::%vertex_descriptor` diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index fe85c35d3662..0ac0476616eb 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -41,8 +41,8 @@ namespace CGAL { * of `VertexPointPMap` (using the `Kernel_traits` mechanism). * The segment type of the primitive (`Datum`) is `CGAL::Kernel_traits< boost::property_traits< VertexPointPMap >::%value_type >::%Kernel::Segment_3`. * - * \cgalModels `AABBPrimitive` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`, - * and `AABBPrimitiveWithSharedData` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`. + * \cgalModelsBare{AABBPrimitive if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`, + * AABBPrimitiveWithSharedData if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`} * * \tparam HalfedgeGraph is a model of the halfedge graph concept. * as key type and a \cgal Kernel `Point_3` as value type. diff --git a/AABB_tree/include/CGAL/AABB_polyhedron_segment_primitive.h b/AABB_tree/include/CGAL/AABB_polyhedron_segment_primitive.h index 2ace80acf226..7b8b72697f9a 100644 --- a/AABB_tree/include/CGAL/AABB_polyhedron_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_polyhedron_segment_primitive.h @@ -42,7 +42,7 @@ namespace CGAL { /// AABB tree is built should not be deleted while the AABB tree /// is in use. /// - /// \cgalModels `AABBPrimitive` + /// \cgalModels{AABBPrimitive} /// \tparam GeomTraits must provide a \c %Point_3 /// type, used as \c Point, and a \c %Segment_3 type, used as \c /// Datum and constructible from two arguments of type \c diff --git a/AABB_tree/include/CGAL/AABB_polyhedron_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_polyhedron_triangle_primitive.h index b45ae54039cb..647ae48b4156 100644 --- a/AABB_tree/include/CGAL/AABB_polyhedron_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_polyhedron_triangle_primitive.h @@ -35,7 +35,7 @@ namespace CGAL { /// the polyhedron from which the AABB tree is built should not be /// deleted while the AABB tree is in use. /// - /// \cgalModels `AABBPrimitive` + /// \cgalModels{AABBPrimitive} /// \tparam GeomTraits must provides a \c %Point_3 /// type, used as \c Point, and a \c %Triangle_3 type, used as \c /// Datum and constructible from three arguments of type \c diff --git a/AABB_tree/include/CGAL/AABB_primitive.h b/AABB_tree/include/CGAL/AABB_primitive.h index b0e9abdaf387..d602a349ee0e 100644 --- a/AABB_tree/include/CGAL/AABB_primitive.h +++ b/AABB_tree/include/CGAL/AABB_primitive.h @@ -53,8 +53,8 @@ struct AABB_primitive_base * The two property maps which are template parameters of the class enable to get the datum and the reference point of * the primitive from the identifier. The last template parameter controls whether the primitive class holds a copy of the datum. * - * \cgalModels `AABBPrimitive` if `ExternalPropertyMaps` is `CGAL::Tag_false`. - * \cgalModels `AABBPrimitiveWithSharedData` if `ExternalPropertyMaps` is `CGAL::Tag_true`. + * \cgalModelsBare{AABBPrimitive if `ExternalPropertyMaps` is `CGAL::Tag_false`, + * AABBPrimitiveWithSharedData if `ExternalPropertyMaps` is `CGAL::Tag_true`} * * \tparam ObjectPropertyMap is a model of `ReadablePropertyMap` with `Id` as * `key_type`. It must be a model of `CopyConstructible`, `DefaultConstructible`, and `CopyAssignable`. diff --git a/AABB_tree/include/CGAL/AABB_segment_primitive.h b/AABB_tree/include/CGAL/AABB_segment_primitive.h index a4627c8592ea..f13523ba40ca 100644 --- a/AABB_tree/include/CGAL/AABB_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_segment_primitive.h @@ -54,7 +54,7 @@ namespace internal { * The iterator from which the primitive is built should not be invalided * while the AABB tree holding the primitive is in use. * - * \cgalModels `AABBPrimitive` + * \cgalModels{AABBPrimitive} * * \tparam GeomTraits is a traits class providing the nested type `Point_3` and `Segment_3`. * It also provides the functor `Construct_source_3` that has an operator taking a `Segment_3` diff --git a/AABB_tree/include/CGAL/AABB_traits.h b/AABB_tree/include/CGAL/AABB_traits.h index b2eb87dc8f6a..f44739077303 100644 --- a/AABB_tree/include/CGAL/AABB_traits.h +++ b/AABB_tree/include/CGAL/AABB_traits.h @@ -149,9 +149,8 @@ class AABB_tree; /// computations, and it handles points as query type for distance /// queries. /// -/// \cgalModels AABBTraits -/// \cgalModels AABBRayIntersectionTraits - +/// \cgalModels{AABBTraits,AABBRayIntersectionTraits} +/// /// \tparam GeomTraits must be a model of the concept \ref AABBGeomTraits, /// and provide the geometric types as well as the intersection tests and computations. /// \tparam Primitive provide the type of primitives stored in the AABB_tree. diff --git a/AABB_tree/include/CGAL/AABB_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_triangle_primitive.h index b1b1bd1fe797..1fc1b140c582 100644 --- a/AABB_tree/include/CGAL/AABB_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_triangle_primitive.h @@ -55,7 +55,7 @@ namespace internal { * The iterator from which the primitive is built should not be invalided * while the AABB tree holding the primitive is in use. * - * \cgalModels `AABBPrimitive` + * \cgalModels{AABBPrimitive} * * \tparam GeomTraits is a traits class providing the nested type `Point_3` and `Triangle_3`. * It also provides the functor `Construct_vertex_3` that has an operator taking a `Triangle_3` diff --git a/AABB_tree/include/CGAL/AABB_triangulation_3_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_triangulation_3_triangle_primitive.h index e573dc71f49b..f45a005b99e7 100644 --- a/AABB_tree/include/CGAL/AABB_triangulation_3_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_triangulation_3_triangle_primitive.h @@ -28,7 +28,7 @@ namespace CGAL { // the TriangleMesh from which the AABB tree is built should not be // deleted while the AABB tree is in use. // - // \cgalModels `AABBPrimitive` + // \cgalModels{AABBPrimitive} // \tparam GeomTraits must provides a \c %Point_3 // type, used as \c Point, and a \c %Triangle_3 type, used as \c // Datum and constructible from three arguments of type \c diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index ae2cc84f6c17..7486ae587d78 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -136,8 +136,18 @@ ALIASES = "cgal=%CGAL" \ "cgalRefinesBare{1}=
      @cgalRefines
      \1
      " \ "cgalRefinesBare{2}=
      @cgalRefines
      @c \1
      \2
      " \ "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ + "cgalModelsHeader=Is Model Of" \ + "cgalModels{1}=
      @cgalModelsHeader
      @c \1
      " \ + "cgalModels{2}=
      @cgalModelsHeader
      @c \1
      @c \2
      " \ + "cgalModelsBare{1}=
      @cgalModelsHeader
      \1
      " \ + "cgalModelsBare{2}=
      @cgalModelsHeader
      @c \1
      \2
      " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModel=\xrefitem hasModels \"Has Models\" \"Has Model Relationships\"" \ + "cgalHasModelsHeader=Has Models" \ + "cgalHasModelsBegin=
      @cgalHasModelsHeader
      `" \ + "cgalHasModels=`
      `" \ + "cgalHasModelsEnd=`
      " \ + "cgalHasModelsBare{1}=
      @cgalHasModels
      \1
      " \ "cgalDebugBegin=\htmlonly
      Debugging Support
      \endhtmlonly \n" \ "cgalDebugEnd=\htmlonly
      \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 1cfd0a6ffd9f..3813f3748daf 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -145,8 +145,18 @@ ALIASES = "cgal=%CGAL" \ "cgalRefinesBare{1}=
      @cgalRefines
      \1
      " \ "cgalRefinesBare{2}=
      @cgalRefines
      @c \1
      \2
      " \ "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ + "cgalModelsHeader=Is Model Of" \ + "cgalModels{1}=
      @cgalModelsHeader
      @c \1
      " \ + "cgalModels{2}=
      @cgalModelsHeader
      @c \1
      @c \2
      " \ + "cgalModelsBare{1}=
      @cgalModelsHeader
      \1
      " \ + "cgalModelsBare{2}=
      @cgalModelsHeader
      @c \1
      \2
      " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModel=\xrefitem hasModels \"Has Models\" \"Has Model Relationships\"" \ + "cgalHasModelsHeader=Has Models" \ + "cgalHasModelsBegin=
      @cgalHasModelsHeader
      `" \ + "cgalHasModels=`
      `" \ + "cgalHasModelsEnd=`
      " \ + "cgalHasModelsBare{1}=
      @cgalHasModelsHeader
      \1
      " \ "cgalDebugBegin=\htmlonly[block]
      Debugging Support
      \endhtmlonly ^^" \ "cgalDebugEnd=\htmlonly[block]
      \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ From f14769935ada80f97677d5ec1ea44b94ec1f20bb Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 5 Jul 2023 15:34:41 +0200 Subject: [PATCH 0452/1398] GPLv2: replace TAB by 8 spaces --- Installation/LICENSES/GPL-2.0-or-later.txt | 14 +++++++------- LICENSES/GPL-2.0-only.txt | 14 +++++++------- LICENSES/GPL-2.0-or-later.txt | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Installation/LICENSES/GPL-2.0-or-later.txt b/Installation/LICENSES/GPL-2.0-or-later.txt index 623b6258a134..4a1bd6f39f1d 100644 --- a/Installation/LICENSES/GPL-2.0-or-later.txt +++ b/Installation/LICENSES/GPL-2.0-or-later.txt @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt index 623b6258a134..4a1bd6f39f1d 100644 --- a/LICENSES/GPL-2.0-only.txt +++ b/LICENSES/GPL-2.0-only.txt @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt index 623b6258a134..4a1bd6f39f1d 100644 --- a/LICENSES/GPL-2.0-or-later.txt +++ b/LICENSES/GPL-2.0-or-later.txt @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it From 7df8d95d1b53312cf84707bf0adc2f866155c68b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 5 Jul 2023 16:45:12 +0200 Subject: [PATCH 0453/1398] remove 0x0c (Page break) --- Installation/LICENSES/GPL-2.0-or-later.txt | 10 +++++----- LICENSES/GPL-2.0-only.txt | 10 +++++----- LICENSES/GPL-2.0-or-later.txt | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Installation/LICENSES/GPL-2.0-or-later.txt b/Installation/LICENSES/GPL-2.0-or-later.txt index 4a1bd6f39f1d..0106771c764d 100644 --- a/Installation/LICENSES/GPL-2.0-or-later.txt +++ b/Installation/LICENSES/GPL-2.0-or-later.txt @@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt index 4a1bd6f39f1d..0106771c764d 100644 --- a/LICENSES/GPL-2.0-only.txt +++ b/LICENSES/GPL-2.0-only.txt @@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt index 4a1bd6f39f1d..0106771c764d 100644 --- a/LICENSES/GPL-2.0-or-later.txt +++ b/LICENSES/GPL-2.0-or-later.txt @@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest From 6ed2272c1d7d2b2f524659060e62a9c9f5df63dd Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 6 Jul 2023 07:26:54 +0100 Subject: [PATCH 0454/1398] Classification: Workaround or VC std17 boost bug --- Classification/include/CGAL/Classification/Image.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Classification/include/CGAL/Classification/Image.h b/Classification/include/CGAL/Classification/Image.h index 924e39bde240..084e9572764a 100644 --- a/Classification/include/CGAL/Classification/Image.h +++ b/Classification/include/CGAL/Classification/Image.h @@ -16,6 +16,7 @@ #include #include +#include #define CGAL_CLASSIFICATION_IMAGE_SIZE_LIMIT 100000000 @@ -38,13 +39,16 @@ class Image std::shared_ptr m_sparse; Type m_default; + +public: // Forbid using copy constructor - Image (const Image&) + // Make it public for a strange VC++ std17 boost-1_82 error + // https://github.com/boostorg/core/issues/148 + Image(const Image&) { + CGAL_assertion(false); } -public: - Image () : m_width(0), m_height(0), m_depth(0) { } From 404bc84696ac744bc16f68ab839808909c1ce43f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 09:37:02 +0200 Subject: [PATCH 0455/1398] missing ${} --- Scripts/developer_scripts/run_testsuite_with_ctest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index 3e13edc6a7e3..723b3938d2ce 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -181,7 +181,7 @@ setup_dirs() # MSVC2015 does not support C++17 if [ "${CGAL_RELEASE_ID}" \> "CGAL-6.0" ]; then - if [ "PLATFORM" = "MSVC2015-Release-64bits" ]; then + if [ "${PLATFORM}" = "MSVC2015-Release-64bits" ]; then continue fi fi From 62438e59d318a3165327c64c62deb233d038956c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 12:36:33 +0200 Subject: [PATCH 0456/1398] deduplicate the LICENSES/ directory The script `cgal_create_release_with_cmake.cmake` has been modified. --- Installation/LICENSES/BSL-1.0.txt | 23 - Installation/LICENSES/CC0-1.0.txt | 121 ---- Installation/LICENSES/GPL-2.0-or-later.txt | 340 --------- Installation/LICENSES/GPL-3.0-only.txt | 674 ------------------ Installation/LICENSES/GPL-3.0-or-later.txt | 674 ------------------ Installation/LICENSES/LGPL-2.1-only.txt | 178 ----- Installation/LICENSES/LGPL-3.0-only.txt | 165 ----- Installation/LICENSES/LGPL-3.0-or-later.txt | 165 ----- .../LICENSES/LicenseRef-Commercial.txt | 6 - Installation/LICENSES/LicenseRef-RFL.txt | 19 - Installation/LICENSES/MIT.txt | 17 - .../cgal_create_release_with_cmake.cmake | 3 + 12 files changed, 3 insertions(+), 2382 deletions(-) delete mode 100644 Installation/LICENSES/BSL-1.0.txt delete mode 100644 Installation/LICENSES/CC0-1.0.txt delete mode 100644 Installation/LICENSES/GPL-2.0-or-later.txt delete mode 100644 Installation/LICENSES/GPL-3.0-only.txt delete mode 100644 Installation/LICENSES/GPL-3.0-or-later.txt delete mode 100644 Installation/LICENSES/LGPL-2.1-only.txt delete mode 100644 Installation/LICENSES/LGPL-3.0-only.txt delete mode 100644 Installation/LICENSES/LGPL-3.0-or-later.txt delete mode 100644 Installation/LICENSES/LicenseRef-Commercial.txt delete mode 100644 Installation/LICENSES/LicenseRef-RFL.txt delete mode 100644 Installation/LICENSES/MIT.txt diff --git a/Installation/LICENSES/BSL-1.0.txt b/Installation/LICENSES/BSL-1.0.txt deleted file mode 100644 index 36b7cd93cdfb..000000000000 --- a/Installation/LICENSES/BSL-1.0.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/Installation/LICENSES/CC0-1.0.txt b/Installation/LICENSES/CC0-1.0.txt deleted file mode 100644 index 0e259d42c996..000000000000 --- a/Installation/LICENSES/CC0-1.0.txt +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/Installation/LICENSES/GPL-2.0-or-later.txt b/Installation/LICENSES/GPL-2.0-or-later.txt deleted file mode 100644 index 0106771c764d..000000000000 --- a/Installation/LICENSES/GPL-2.0-or-later.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/Installation/LICENSES/GPL-3.0-only.txt b/Installation/LICENSES/GPL-3.0-only.txt deleted file mode 100644 index 94a9ed024d38..000000000000 --- a/Installation/LICENSES/GPL-3.0-only.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/Installation/LICENSES/GPL-3.0-or-later.txt b/Installation/LICENSES/GPL-3.0-or-later.txt deleted file mode 100644 index 94a9ed024d38..000000000000 --- a/Installation/LICENSES/GPL-3.0-or-later.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/Installation/LICENSES/LGPL-2.1-only.txt b/Installation/LICENSES/LGPL-2.1-only.txt deleted file mode 100644 index b042f57e217b..000000000000 --- a/Installation/LICENSES/LGPL-2.1-only.txt +++ /dev/null @@ -1,178 +0,0 @@ - -GNU LESSER GENERAL PUBLIC LICENSE - -Version 2.1, February 1999 - -Copyright (C) 1991, 1999 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - -This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - -When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - -To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - -For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - -We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - -To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - -Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - -Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - -When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - -We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - -For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - -In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - -Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - -The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - -A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - -The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - -"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - - (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - - a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS -How to Apply These Terms to Your New Libraries - -If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). - -To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - -one line to give the library's name and an idea of what it does. -Copyright (C) year name of author - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in -the library `Frob' (a library for tweaking knobs) written -by James Random Hacker. - -signature of Ty Coon, 1 April 1990 -Ty Coon, President of Vice - -That's all there is to it! diff --git a/Installation/LICENSES/LGPL-3.0-only.txt b/Installation/LICENSES/LGPL-3.0-only.txt deleted file mode 100644 index 65c5ca88a67c..000000000000 --- a/Installation/LICENSES/LGPL-3.0-only.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/Installation/LICENSES/LGPL-3.0-or-later.txt b/Installation/LICENSES/LGPL-3.0-or-later.txt deleted file mode 100644 index 65c5ca88a67c..000000000000 --- a/Installation/LICENSES/LGPL-3.0-or-later.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/Installation/LICENSES/LicenseRef-Commercial.txt b/Installation/LICENSES/LicenseRef-Commercial.txt deleted file mode 100644 index 1c5db3b7d70f..000000000000 --- a/Installation/LICENSES/LicenseRef-Commercial.txt +++ /dev/null @@ -1,6 +0,0 @@ -The CGAL software consists of several components, each of which is licensed under -an open source license. If the open source license is not suitable to your -needs, it is possible to obtain commercial licenses -from GeometryFactory (www.geometryfactory.com) for each component of CGAL. - -Get more information at "contact@geometryfactory.com". diff --git a/Installation/LICENSES/LicenseRef-RFL.txt b/Installation/LICENSES/LicenseRef-RFL.txt deleted file mode 100644 index 49f77c2445e0..000000000000 --- a/Installation/LICENSES/LicenseRef-RFL.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Stefan Walk - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Installation/LICENSES/MIT.txt b/Installation/LICENSES/MIT.txt deleted file mode 100644 index 89de354795ec..000000000000 --- a/Installation/LICENSES/MIT.txt +++ /dev/null @@ -1,17 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake index 1906d885e48f..de8dcfa35d41 100644 --- a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake +++ b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake @@ -164,6 +164,9 @@ file(COPY ${GIT_REPO}/GraphicsView/demo/resources ${GIT_REPO}/GraphicsView/demo/ #copy data file(COPY ${GIT_REPO}/Data/data DESTINATION "${release_dir}/") +#copy LICENSES files +file(COPY ${GIT_REPO}/LICENSES DESTINATION "${release_dir}/" PATTERN "GPL-2.0-only.txt" EXCLUDE) + #create VERSION file(WRITE ${release_dir}/VERSION "${CGAL_VERSION}") From 45fef4f9fdf0758fd50cbf8f0769ef8d9e8e631d Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 13:02:06 +0200 Subject: [PATCH 0457/1398] add the Github Action for REUSE --- .github/workflows/reuse.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/reuse.yml diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml new file mode 100644 index 000000000000..cec8abeb9ae4 --- /dev/null +++ b/.github/workflows/reuse.yml @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2020 Free Software Foundation Europe e.V. +# +# SPDX-License-Identifier: GPL-3.0-or-later + +name: REUSE Compliance Check + +on: [push, pull_request] + +jobs: + reuse: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: REUSE version + uses: fsfe/reuse-action@v1 + with: + args: --version + - name: REUSE lint + uses: fsfe/reuse-action@v1 + with: + args: --include-submodules lint + - name: REUSE SPDX SBOM + uses: fsfe/reuse-action@v1 + with: + args: spdx + - name: install dependencies + run: sudo apt-get install -y libboost-dev libboost-program-options-dev libmpfr-dev libeigen3-dev + - name: Create CGAL internal release + run: | + cmake -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake + - name: REUSE lint release tarball + uses: fsfe/reuse-action@v1 + with: + args: --root /tmp/CGAL-9.9 --include-submodules lint From 21e5ac013667a77f64d3bfdadc3f48ce65b215f6 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 13:03:53 +0200 Subject: [PATCH 0458/1398] dependency: only cmake --- .github/workflows/reuse.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index cec8abeb9ae4..1edeee2bd6ad 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -24,7 +24,7 @@ jobs: with: args: spdx - name: install dependencies - run: sudo apt-get install -y libboost-dev libboost-program-options-dev libmpfr-dev libeigen3-dev + run: sudo apt-get install -y cmake - name: Create CGAL internal release run: | cmake -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake From aeb6b72a246de7306aea04fc599a4e26f2200368 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 14:05:01 +0200 Subject: [PATCH 0459/1398] change the destination --- .github/workflows/reuse.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 1edeee2bd6ad..6c8c54b6981c 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -27,8 +27,9 @@ jobs: run: sudo apt-get install -y cmake - name: Create CGAL internal release run: | - cmake -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake + mkdir -p $HOME/release + cmake -DDESTINATION=$HOME/release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake - name: REUSE lint release tarball uses: fsfe/reuse-action@v1 with: - args: --root /tmp/CGAL-9.9 --include-submodules lint + args: --root $HOME/release/CGAL-9.9 --include-submodules lint From 974df953f9d1be695a4f2d4621ce55963483dd2a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 14:14:28 +0200 Subject: [PATCH 0460/1398] Use RUNNER_TMP instead of HOME --- .github/workflows/reuse.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 6c8c54b6981c..2a97e90458f6 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -27,9 +27,9 @@ jobs: run: sudo apt-get install -y cmake - name: Create CGAL internal release run: | - mkdir -p $HOME/release - cmake -DDESTINATION=$HOME/release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake + mkdir -p $RUNNER_TEMP/release + cmake -DDESTINATION=$RUNNER_TEMP/release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake - name: REUSE lint release tarball uses: fsfe/reuse-action@v1 with: - args: --root $HOME/release/CGAL-9.9 --include-submodules lint + args: --root $RUNNER_TEMP/release/CGAL-9.9 --include-submodules lint From 6c6ae1f732833b0b54d5b23c54da855aa538f4df Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 6 Jul 2023 14:18:49 +0200 Subject: [PATCH 0461/1398] RUNNER_TEMP is not passed from step to step Use ./ instead --- .github/workflows/reuse.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 2a97e90458f6..2113372a8772 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -27,9 +27,9 @@ jobs: run: sudo apt-get install -y cmake - name: Create CGAL internal release run: | - mkdir -p $RUNNER_TEMP/release - cmake -DDESTINATION=$RUNNER_TEMP/release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake + mkdir -p ./release + cmake -DDESTINATION=./release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake - name: REUSE lint release tarball uses: fsfe/reuse-action@v1 with: - args: --root $RUNNER_TEMP/release/CGAL-9.9 --include-submodules lint + args: --root ./release/CGAL-9.9 --include-submodules lint From a8a3d8ab36cf3ad0880aa21dc49c2d29c96df656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 15:39:08 +0200 Subject: [PATCH 0462/1398] add functor to compute the intersection of 3 independant planes --- .../include/CGAL/Kernel/function_objects.h | 36 +++++++++++++++++++ .../include/CGAL/Kernel/interface_macros.h | 2 ++ 2 files changed, 38 insertions(+) diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index e307e28ae1f5..438dc0de14be 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -2192,6 +2192,42 @@ namespace CommonKernelFunctors { } }; + template + class Construct_planes_intersection_point_3 + { + typedef typename K::Plane_3 Plane; + typedef typename K::Point_3 Point; + typename K::Construct_plane_3 construct_plane; + public: + typedef Point result_type; + + Point + operator()(const Point& p1, const Point& q1, const Point& r1, + const Point& p2, const Point& q2, const Point& r2, + const Point& p3, const Point& q3, const Point& r3) const + { + Plane plane1 = construct_plane(p1, q1, r1); + Plane plane2 = construct_plane(p2, q2, r2); + Plane plane3 = construct_plane(p3, q3, r3); + + const auto res = typename K::Intersect_3()(plane1, plane2, plane3); + CGAL_assertion(res!=boost::none); + const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(e_pt!=nullptr); + return *e_pt; + } + + Point + operator()(const Plane& plane1, const Plane& plane2, const Plane& plane3) const + { + const auto res = typename K::Intersect_3()(plane1, plane2, plane3); + CGAL_assertion(res!=boost::none); + const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(e_pt!=nullptr); + return *e_pt; + } + }; + template class Compute_alpha_for_coplanar_triangle_intersection_3 { diff --git a/Kernel_23/include/CGAL/Kernel/interface_macros.h b/Kernel_23/include/CGAL/Kernel/interface_macros.h index 1360aa1bbcdf..0acc0a4c6909 100644 --- a/Kernel_23/include/CGAL/Kernel/interface_macros.h +++ b/Kernel_23/include/CGAL/Kernel/interface_macros.h @@ -398,6 +398,8 @@ CGAL_Kernel_cons(Construct_plane_3, construct_plane_3_object) CGAL_Kernel_cons(Construct_plane_line_intersection_point_3, construct_plane_line_intersection_point_3_object) +CGAL_Kernel_cons(Construct_planes_intersection_point_3, + construct_planes_intersection_point_3_object) CGAL_Kernel_cons(Compute_alpha_for_coplanar_triangle_intersection_3, compute_alpha_for_coplanar_triangle_intersection_3_object) CGAL_Kernel_cons(Construct_point_on_2, From a0658b6423c95f108868f6ce5c65ad1b7b1149ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 15:51:04 +0200 Subject: [PATCH 0463/1398] track coplanar triangles and use direct point construction --- .../Polygon_mesh_processing/autorefinement.h | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 9bbc67efb487..68241773f374 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -167,9 +167,7 @@ do_coplanar_segments_intersect(std::size_t pi, std::size_t qi, } } - // supporting_line intersects: points are coplanar - // TODO: check if we can write a dedicated predicate taking advantage of p,q being shared ::CGAL::Orientation pqr = cpl_orient(p, q, r); ::CGAL::Orientation pqs = cpl_orient(p, q, s); @@ -609,7 +607,7 @@ void test_edge(const typename K::Point_3& p, const typename K::Point_3& q, } template -void collect_intersections(const std::array& t1, +bool collect_intersections(const std::array& t1, const std::array& t2, std::vector& inter_pts) { @@ -626,7 +624,7 @@ void collect_intersections(const std::array& t1, if (depth(p)>2) throw std::runtime_error("Depth is not 4: "+std::to_string(depth(p))); #endif - return; + return true; } for (int i=0; i<3; ++i) @@ -653,6 +651,8 @@ void collect_intersections(const std::array& t1, for (auto p : inter_pts) if (depth(p)>2) throw std::runtime_error("Depth is not 2: "+std::to_string(depth(p))); #endif + + return false; } ////////////////////////////////// @@ -672,6 +672,7 @@ void generate_subtriangles(std::size_t ti, std::vector& points, const std::vector& in_triangle_ids, const std::set >& intersecting_triangles, + const std::set >& coplanar_triangles, const std::vector>& triangles, PointVector& new_triangles ) @@ -789,11 +790,6 @@ void generate_subtriangles(std::size_t ti, { std::size_t nbs = segments.size(); - auto supporting_plane = [](const std::array& t) - { - return typename EK::Plane_3(t[0], t[1], t[2]); - }; - std::vector< std::vector > points_on_segments(nbs); COUNTER_INSTRUCTION(counter.timer1.start();) @@ -868,17 +864,19 @@ void generate_subtriangles(std::size_t ti, } case POINT_INTERSECTION: { - // TODO: use version with no variant - COUNTER_INSTRUCTION(counter.timer6.start();) - auto res = CGAL::intersection(supporting_plane(triangles[in_triangle_ids[i]]), - supporting_plane(triangles[in_triangle_ids[j]]), - supporting_plane(triangles[ti])); - COUNTER_INSTRUCTION(counter.timer6.stop();) - - if (const typename EK::Point_3* pt_ptr = boost::get(&(*res))) + if ( coplanar_triangles.count(CGAL::make_sorted_pair(in_triangle_ids[i], in_triangle_ids[j])) == 0 + && coplanar_triangles.count(CGAL::make_sorted_pair(ti, in_triangle_ids[j])) == 0 + && coplanar_triangles.count(CGAL::make_sorted_pair(in_triangle_ids[i], ti)) == 0) { + COUNTER_INSTRUCTION(counter.timer6.start();) + typename EK::Point_3 pt = typename EK::Construct_planes_intersection_point_3()( + triangles[in_triangle_ids[i]][0], triangles[in_triangle_ids[i]][1],triangles[in_triangle_ids[i]][2], + triangles[in_triangle_ids[j]][0], triangles[in_triangle_ids[j]][1],triangles[in_triangle_ids[j]][2], + triangles[ti][0], triangles[ti][1],triangles[ti][2]); + COUNTER_INSTRUCTION(counter.timer6.stop();) + COUNTER_INSTRUCTION(++counter.c1;) - std::size_t pid = get_point_id(*pt_ptr); + std::size_t pid = get_point_id(pt); points_on_segments[i].push_back(pid); points_on_segments[j].push_back(pid); } @@ -1198,7 +1196,8 @@ void autorefine_soup_output(const PointRange& input_points, Real_timer t; t.start(); #endif - std::set > intersecting_triangles; + std::set > intersecting_triangles; // TODO replace with vector>> + std::set > coplanar_triangles; // TODO replace with vector>> //TODO: PARALLEL_FOR #2 for (const Pair_of_triangle_ids& p : si_pairs) { @@ -1211,7 +1210,7 @@ void autorefine_soup_output(const PointRange& input_points, const std::array& t2 = triangles[i2]; std::vector inter_pts; - autorefine_impl::collect_intersections(t1, t2, inter_pts); + bool triangles_are_coplanar = autorefine_impl::collect_intersections(t1, t2, inter_pts); CGAL_assertion( CGAL::do_intersect(typename EK::Triangle_3(t1[0], t1[1], t1[2]), typename EK::Triangle_3(t2[0], t2[1], t2[2])) @@ -1242,6 +1241,8 @@ void autorefine_soup_output(const PointRange& input_points, } } intersecting_triangles.insert(CGAL::make_sorted_pair(i1, i2)); + if (triangles_are_coplanar) + coplanar_triangles.insert(CGAL::make_sorted_pair(i1, i2)); } } #ifdef USE_DEBUG_PARALLEL_TIMERS @@ -1369,7 +1370,7 @@ void autorefine_soup_output(const PointRange& input_points, autorefine_impl::generate_subtriangles(ti, all_segments[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); } #else - autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, triangles, new_triangles); + autorefine_impl::generate_subtriangles(ti, all_segments_ids[ti], all_points[ti], all_in_triangle_ids[ti], intersecting_triangles, coplanar_triangles, triangles, new_triangles); #endif } From bab2c72674903679a632566debb595c34505efe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 16:53:51 +0200 Subject: [PATCH 0464/1398] add functor to compute intersection point of coplanar segments --- .../include/CGAL/Kernel/function_objects.h | 34 +++++++++++++++++++ .../include/CGAL/Kernel/interface_macros.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 438dc0de14be..6917a06edcf3 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -2228,6 +2228,40 @@ namespace CommonKernelFunctors { } }; + template + class Construct_coplanar_segments_intersection_point_3 + { + typedef typename K::Segment_3 Segment; + typedef typename K::Point_3 Point; + typename K::Construct_segment_3 construct_segment; + public: + typedef Point result_type; + + Point + operator()(const Point& p1, const Point& q1, + const Point& p2, const Point& q2) const + { + Segment s1 = construct_segment(p1, q1); + Segment s2 = construct_segment(p2, q2); + + const auto res = typename K::Intersect_3()(s1, s2); + CGAL_assertion(res!=boost::none); + const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(e_pt!=nullptr); + return *e_pt; + } + + Point + operator()(const Segment& s1, const Segment& s2) const + { + const auto res = typename K::Intersect_3()(s1, s2); + CGAL_assertion(res!=boost::none); + const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(e_pt!=nullptr); + return *e_pt; + } + }; + template class Compute_alpha_for_coplanar_triangle_intersection_3 { diff --git a/Kernel_23/include/CGAL/Kernel/interface_macros.h b/Kernel_23/include/CGAL/Kernel/interface_macros.h index 0acc0a4c6909..a2314aef1b79 100644 --- a/Kernel_23/include/CGAL/Kernel/interface_macros.h +++ b/Kernel_23/include/CGAL/Kernel/interface_macros.h @@ -400,6 +400,8 @@ CGAL_Kernel_cons(Construct_plane_line_intersection_point_3, construct_plane_line_intersection_point_3_object) CGAL_Kernel_cons(Construct_planes_intersection_point_3, construct_planes_intersection_point_3_object) +CGAL_Kernel_cons(Construct_coplanar_segments_intersection_point_3, + construct_coplanar_segments_intersection_point_3_object) CGAL_Kernel_cons(Compute_alpha_for_coplanar_triangle_intersection_3, compute_alpha_for_coplanar_triangle_intersection_3_object) CGAL_Kernel_cons(Construct_point_on_2, From e7490ee31fe90b243c558b3742614bd0785f9796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 16:54:37 +0200 Subject: [PATCH 0465/1398] use direct construction of coplanar segment intersection --- .../Polygon_mesh_processing/autorefinement.h | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 68241773f374..693c00676f05 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -884,20 +884,13 @@ void generate_subtriangles(std::size_t ti, { COUNTER_INSTRUCTION(++counter.c2;) COUNTER_INSTRUCTION(counter.timer4.start();) - //TODO find better! - typename EK::Segment_3 s1(points[segments[i].first], points[segments[i].second]); - typename EK::Segment_3 s2(points[segments[j].first], points[segments[j].second]);// TODO: avoid this construction - auto inter = CGAL::intersection(s1, s2); - if (inter == boost::none) throw std::runtime_error("Unexpected case #2"); - if (const typename EK::Point_3* pt_ptr = boost::get(&(*inter))) - { - std::size_t pid = get_point_id(*pt_ptr); - points_on_segments[i].push_back(pid); - points_on_segments[j].push_back(pid); - break; - } - else - throw std::runtime_error("Unexpected case 1"); + typename EK::Point_3 pt = typename EK::Construct_coplanar_segments_intersection_point_3()( + points[segments[i].first], points[segments[i].second], + points[segments[j].first], points[segments[j].second]); + + std::size_t pid = get_point_id(pt); + points_on_segments[i].push_back(pid); + points_on_segments[j].push_back(pid); COUNTER_INSTRUCTION(counter.timer4.stop();) //~ std::ofstream debug ("/tmp/triangles.polylines.txt"); //~ debug << "4 " << triangles[ti][0] << " " << triangles[ti][1] << " " << triangles[ti][2] << " " << triangles[ti][0] << "\n"; From ee2a55279d072fee46aadbb6c91f52759b1b51a3 Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 6 Jul 2023 17:35:34 +0200 Subject: [PATCH 0466/1398] issue #7395 Improvement of layout of model relations - Completed the cgalHasModel part - corrected spelling of `Has Model` and `Is Model Of` to `Has model` and `Is model of` --- .../AABB_halfedge_graph_segment_primitive.h | 4 +- AABB_tree/include/CGAL/AABB_primitive.h | 4 +- ...ancingFrontSurfaceReconstructionTraits_3.h | 2 +- .../Concepts/AlgebraicStructureTraits.h | 3 +- .../Concepts/FieldNumberType.h | 21 +++--- .../Concepts/FractionTraits.h | 3 +- .../Concepts/FromIntConstructible.h | 7 +- .../Concepts/RealEmbeddableTraits.h | 3 +- .../Concepts/RingNumberType.h | 26 +++---- .../Concepts/AlgebraicKernel_d_1.h | 5 +- .../Concepts/AlphaShapeFace_2.h | 3 +- .../Concepts/AlphaShapeTraits_2.h | 3 +- .../Concepts/AlphaShapeVertex_2.h | 2 +- .../Concepts/WeightedAlphaShapeTraits_2.h | 3 +- .../Concepts/AlphaShapeCell_3.h | 2 +- .../Concepts/AlphaShapeTraits_3.h | 2 +- .../Concepts/AlphaShapeVertex_3.h | 2 +- .../Concepts/FixedAlphaShapeCell_3.h | 2 +- .../Concepts/FixedAlphaShapeTraits_3.h | 2 +- .../Concepts/FixedAlphaShapeVertex_3.h | 2 +- .../FixedWeightedAlphaShapeTraits_3.h | 2 +- .../Concepts/WeightedAlphaShapeTraits_3.h | 2 +- .../Alpha_wrap_3/Concepts/AlphaWrapOracle.h | 9 ++- .../Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h | 2 +- .../Concepts/ApolloniusGraphDataStructure_2.h | 3 +- .../ApolloniusGraphHierarchyVertexBase_2.h | 3 +- .../Concepts/ApolloniusGraphTraits_2.h | 5 +- .../Concepts/ApolloniusGraphVertexBase_2.h | 3 +- .../Concepts/ArrTraits--Approximate_2.h | 3 +- .../Concepts/ArrTraits--AreMergeable_2.h | 3 +- .../ArrTraits--CompareXNearBoundary_2.h | 3 +- ...rrTraits--CompareXOnBoundaryOfCurveEnd_2.h | 7 +- .../ArrTraits--CompareXOnBoundary_2.h | 7 +- .../Concepts/ArrTraits--CompareX_2.h | 3 +- .../Concepts/ArrTraits--CompareXy_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtXLeft_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtXRight_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtX_2.h | 3 +- .../ArrTraits--CompareYNearBoundary_2.h | 3 +- .../ArrTraits--CompareYOnBoundary_2.h | 9 ++- .../Concepts/ArrTraits--ConstructCurve_2.h | 3 +- .../ArrTraits--ConstructMaxVertex_2.h | 3 +- .../ArrTraits--ConstructMinVertex_2.h | 3 +- .../ArrTraits--ConstructXMonotoneCurve_2.h | 3 +- .../Concepts/ArrTraits--Curve_2.h | 3 +- .../Concepts/ArrTraits--Equal_2.h | 3 +- .../Concepts/ArrTraits--Intersect_2.h | 3 +- .../ArrTraits--IsOnXIdentification_2.h | 3 +- .../ArrTraits--IsOnYIdentification_2.h | 3 +- .../Concepts/ArrTraits--IsVertical_2.h | 3 +- .../Concepts/ArrTraits--MakeXMonotone_2.h | 3 +- .../Concepts/ArrTraits--Merge_2.h | 3 +- .../Concepts/ArrTraits--ParameterSpaceInX_2.h | 7 +- .../Concepts/ArrTraits--ParameterSpaceInY_2.h | 7 +- .../Concepts/ArrTraits--Point_2.h | 3 +- .../Concepts/ArrTraits--Split_2.h | 3 +- .../Concepts/ArrTraits--XMonotoneCurve_2.h | 3 +- .../Concepts/ArrangementApproximateTraits_2.h | 17 +++-- .../Concepts/ArrangementBasicTopologyTraits.h | 3 +- .../Concepts/ArrangementBasicTraits_2.h | 31 ++++---- .../ArrangementConstructCurveTraits_2.h | 15 ++-- ...rangementConstructXMonotoneCurveTraits_2.h | 15 ++-- .../Concepts/ArrangementDcel.h | 9 ++- .../Concepts/ArrangementDcelWithRebind.h | 7 +- .../ArrangementHorizontalSideTraits_2.h | 9 ++- .../Concepts/ArrangementInputFormatter.h | 7 +- .../Concepts/ArrangementLandmarkTraits_2.h | 17 +++-- .../ArrangementOpenBoundaryTraits_2.h | 11 +-- .../Concepts/ArrangementOutputFormatter.h | 7 +- .../Concepts/ArrangementPointLocation_2.h | 9 ++- .../ArrangementSphericalBoundaryTraits_2.h | 3 +- .../Concepts/ArrangementTopologyTraits.h | 7 +- .../Concepts/ArrangementTraits_2.h | 29 +++---- .../Concepts/ArrangementVerticalRayShoot_2.h | 9 ++- .../ArrangementVerticalSideTraits_2.h | 9 ++- .../ArrangementWithHistoryInputFormatter.h | 3 +- .../ArrangementWithHistoryOutputFormatter.h | 3 +- .../Concepts/ArrangementXMonotoneTraits_2.h | 29 +++---- .../Concepts/OverlayTraits.h | 5 +- BGL/doc/BGL/Concepts/EdgeListGraph.h | 2 +- BGL/doc/BGL/Concepts/FaceGraph.h | 2 +- BGL/doc/BGL/Concepts/FaceListGraph.h | 2 +- BGL/doc/BGL/Concepts/HalfedgeGraph.h | 2 +- BGL/doc/BGL/Concepts/HalfedgeListGraph.h | 2 +- BGL/doc/BGL/Concepts/MutableFaceGraph.h | 2 +- BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h | 2 +- BGL/doc/BGL/Concepts/VertexListGraph.h | 2 +- .../Concepts/BarycentricCoordinates_2.h | 8 +- .../Concepts/BarycentricTraits_2.h | 11 ++- .../Concepts/DiscretizedDomain_2.h | 3 +- .../ArrDirectionalTraits--AreMergeable_2.h | 3 +- ...rDirectionalTraits--CompareEndpointsXy_2.h | 3 +- ...rrDirectionalTraits--ConstructOpposite_2.h | 3 +- .../ArrDirectionalTraits--Intersect_2.h | 3 +- .../Concepts/ArrDirectionalTraits--Merge_2.h | 3 +- .../Concepts/ArrDirectionalTraits--Split_2.h | 3 +- .../ArrangementDirectionalXMonotoneTraits_2.h | 15 ++-- .../Concepts/GeneralPolygonSetDcel.h | 3 +- .../Concepts/GeneralPolygonSetDcelFace.h | 3 +- .../Concepts/GeneralPolygonSetDcelHalfedge.h | 3 +- .../Concepts/GeneralPolygonSetTraits_2.h | 7 +- .../Concepts/GeneralPolygon_2.h | 3 +- .../GpsTraitsGeneralPolygonWithHoles_2.h | 3 +- .../Concepts/GpsTraitsGeneralPolygon_2.h | 5 +- .../ApproximateMinEllipsoid_d_Traits_d.h | 7 +- .../Concepts/MinCircle2Traits.h | 3 +- .../Concepts/MinEllipse2Traits.h | 3 +- .../Concepts/MinQuadrilateralTraits_2.h | 3 +- .../Concepts/MinSphereAnnulusDTraits.h | 7 +- .../Concepts/MinSphereOfSpheresTraits.h | 14 ++-- .../Concepts/RectangularPCenterTraits_2.h | 3 +- .../Concepts/BoxIntersectionBox_d.h | 5 +- .../Concepts/BoxIntersectionTraits_d.h | 3 +- ...rnelForCircles--PolynomialForCircles_2_2.h | 3 +- ...lgebraicKernelForCircles--Polynomial_1_2.h | 3 +- ...raicKernelForCircles--RootForCircles_2_2.h | 3 +- .../Concepts/AlgebraicKernelForCircles.h | 3 +- .../CircularKernel--CircularArcPoint_2.h | 3 +- .../Concepts/CircularKernel--CircularArc_2.h | 3 +- .../Concepts/CircularKernel--LineArc_2.h | 3 +- .../Concepts/CircularKernel.h | 5 +- ...rnelForSpheres--PolynomialForSpheres_2_3.h | 3 +- ...lgebraicKernelForSpheres--Polynomial_1_3.h | 3 +- ...cKernelForSpheres--PolynomialsForLines_3.h | 3 +- ...raicKernelForSpheres--RootForSpheres_2_3.h | 3 +- .../Concepts/AlgebraicKernelForSpheres.h | 3 +- .../SphericalKernel--CircularArcPoint_3.h | 3 +- .../Concepts/SphericalKernel--CircularArc_3.h | 3 +- .../Concepts/SphericalKernel--LineArc_3.h | 3 +- .../Concepts/SphericalKernel.h | 5 +- .../doc/Circulator/Concepts/ConstHandle.h | 3 +- .../doc/Circulator/Concepts/ConstRange.h | 3 +- Circulator/doc/Circulator/Concepts/Handle.h | 9 ++- Circulator/doc/Circulator/Concepts/Range.h | 2 +- .../doc/Classification/Concepts/Classifier.h | 7 +- .../Classification/Concepts/NeighborQuery.h | 9 ++- .../Concepts/CellAttribute.h | 2 +- .../Concepts/CombinatorialMap.h | 2 +- .../Combinatorial_map/Concepts/GenericMap.h | 4 +- .../Concepts/GenericMapItems.h | 2 +- .../Concepts/ConvexHullTraits_2.h | 13 ++-- .../Concepts/ConvexHullTraits_3.h | 5 +- .../Concepts/IsStronglyConvexTraits_3.h | 4 +- .../Concepts/ConvexHullTraits_d.h | 7 +- .../Concepts/DelaunayLiftedTraits_d.h | 5 +- .../Convex_hull_d/Concepts/DelaunayTraits_d.h | 5 +- .../doc/resources/1.8.13/BaseDoxyfile.in | 11 +-- .../doc/resources/1.9.6/BaseDoxyfile.in | 9 ++- .../Envelope_3/Concepts/EnvelopeTraits_3.h | 9 ++- .../Generalized_map/Concepts/GeneralizedMap.h | 2 +- .../Generator/Concepts/CombinationElement.h | 6 +- .../doc/Generator/Concepts/PointGenerator.h | 29 +++---- .../Concepts/RandomConvexHullTraits_2.h | 2 +- .../Concepts/RandomConvexSetTraits_2.h | 3 +- .../Concepts/RandomPolygonTraits_2.h | 2 +- .../doc/HalfedgeDS/Concepts/HalfedgeDS.h | 7 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSFace.h | 5 +- .../HalfedgeDS/Concepts/HalfedgeDSHalfedge.h | 5 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSItems.h | 7 +- .../HalfedgeDS/Concepts/HalfedgeDSVertex.h | 5 +- .../Concepts/HeatMethodTraits_3.h | 2 +- .../HyperbolicDelaunayTriangulationTraits_2.h | 5 +- .../HyperbolicTriangulationFaceBase_2.h | 3 +- .../Concepts/ExtremalPolygonTraits_2.h | 5 +- .../LargestEmptyIsoRectangleTraits_2.h | 5 +- .../Concepts/GradientFittingTraits.h | 3 +- .../Concepts/InterpolationTraits.h | 5 +- .../Interval_skip_list/Concepts/Interval.h | 5 +- .../doc/Jet_fitting_3/Concepts/DataKernel.h | 5 +- .../doc/Jet_fitting_3/Concepts/LocalKernel.h | 5 +- .../doc/Kernel_23/Concepts/GeomObjects.h | 75 ++++++++++++------- Kernel_23/doc/Kernel_23/Concepts/Kernel.h | 17 +++-- .../Kernel_d/Concepts/KernelWithLifting_d.h | 5 +- Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h | 9 ++- .../Kernel_d/Concepts/LinearAlgebraTraits_d.h | 5 +- .../Concepts/CellAttributeWithPoint.h | 2 +- .../Concepts/LinearCellComplex.h | 4 +- .../Concepts/LinearCellComplexItems.h | 3 +- .../Concepts/LinearCellComplexTraits.h | 2 +- .../doc/Matrix_search/Concepts/BasicMatrix.h | 3 +- .../Concepts/MonotoneMatrixSearchTraits.h | 3 +- .../Concepts/SortedMatrixSearchTraits.h | 3 +- .../ConformingDelaunayTriangulationTraits_2.h | 4 +- .../Mesh_2/Concepts/DelaunayMeshFaceBase_2.h | 3 +- .../Mesh_2/Concepts/DelaunayMeshTraits_2.h | 4 +- .../Concepts/DelaunayMeshVertexBase_2.h | 3 +- .../doc/Mesh_2/Concepts/MeshingCriteria_2.h | 5 +- .../Concepts/BisectionGeometricTraits_3.h | 2 +- .../Concepts/IntersectionGeometricTraits_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h | 5 +- .../doc/Mesh_3/Concepts/MeshCellCriteria_3.h | 3 +- .../Concepts/MeshCriteriaWithFeatures_3.h | 3 +- Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h | 3 +- .../doc/Mesh_3/Concepts/MeshDomainField_3.h | 3 +- .../Concepts/MeshDomainWithFeatures_3.h | 5 +- Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h | 5 +- .../doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h | 3 +- .../doc/Mesh_3/Concepts/MeshFacetCriteria_3.h | 3 +- Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h | 2 +- .../Concepts/MeshTriangulationTraits_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h | 3 +- .../doc/Mesh_3/Concepts/TriangleAccessor_3.h | 3 +- .../Concepts/PolygonConvexDecomposition_2.h | 11 +-- .../PolygonWithHolesConvexDecomposition_2.h | 5 +- .../Miscellany/Concepts/UniqueHashFunction.h | 3 +- .../Concepts/ModularTraits.h | 3 +- .../Concepts/Modularizable.h | 20 ++--- .../Nef_2/Concepts/ExtendedKernelTraits_2.h | 7 +- .../doc/Number_types/Concepts/RootOf_2.h | 4 +- .../Concepts/OrientedBoundingBoxTraits.h | 3 +- ...imalTransportationReconstructionTraits_2.h | 4 +- .../doc/Orthtree/Concepts/OrthtreeTraits.h | 7 +- .../doc/Orthtree/Concepts/OrthtreeTraversal.h | 9 ++- .../Concepts/ConvexPartitionIsValidTraits_2.h | 3 +- .../Concepts/IsYMonotoneTraits_2.h | 5 +- .../Concepts/OptimalConvexPartitionTraits_2.h | 3 +- .../Concepts/PartitionIsValidTraits_2.h | 3 +- .../Partition_2/Concepts/PartitionTraits_2.h | 3 +- .../doc/Partition_2/Concepts/PolygonIsValid.h | 5 +- .../YMonotonePartitionIsValidTraits_2.h | 3 +- .../Periodic_2DelaunayTriangulationTraits_2.h | 3 +- .../Concepts/Periodic_2Offset_2.h | 3 +- .../Periodic_2TriangulationFaceBase_2.h | 3 +- .../Periodic_2TriangulationTraits_2.h | 3 +- .../Periodic_2TriangulationVertexBase_2.h | 3 +- .../Periodic_3MeshDomainWithFeatures_3.h | 4 +- .../Concepts/Periodic_3MeshDomain_3.h | 3 +- .../Periodic_3DelaunayTriangulationTraits_3.h | 3 +- .../Concepts/Periodic_3Offset_3.h | 3 +- ...riodic_3RegularTriangulationDSCellBase_3.h | 7 +- ...odic_3RegularTriangulationDSVertexBase_3.h | 4 +- .../Periodic_3RegularTriangulationTraits_3.h | 3 +- .../Periodic_3TriangulationDSCellBase_3.h | 3 +- .../Periodic_3TriangulationDSVertexBase_3.h | 3 +- .../Periodic_3TriangulationTraits_3.h | 3 +- ...4HyperbolicDelaunayTriangulationTraits_2.h | 3 +- ...iodic_4HyperbolicTriangulationFaceBase_2.h | 3 +- ...dic_4HyperbolicTriangulationVertexBase_2.h | 3 +- .../Concepts/GeneralPolygonWithHoles_2.h | 5 +- .../doc/Polygon/Concepts/PolygonTraits_2.h | 8 +- .../Concepts/PMPCorefinementVisitor.h | 3 +- .../Concepts/PMPDistanceTraits.h | 2 +- .../Concepts/PMPHolefillingVisitor.h | 3 +- .../PMPPolygonSoupOrientationVisitor.h | 3 +- .../Concepts/PMPTriangulateFaceVisitor.h | 3 +- .../Polyhedron/Concepts/PolyhedronItems_3.h | 5 +- .../Polyhedron/Concepts/PolyhedronTraits_3.h | 6 +- .../PolylineSimplificationCostFunction.h | 7 +- .../PolylineSimplificationStopPredicate.h | 7 +- .../PolylineSimplificationVertexBase_2.h | 3 +- .../Polynomial/Concepts/PolynomialTraits_d.h | 3 +- .../doc/Polynomial/Concepts/Polynomial_d.h | 3 +- .../Concepts/AllFurthestNeighborsTraits_2.h | 9 ++- .../Concepts/PolytopeDistanceDTraits.h | 7 +- .../Concepts/WidthTraits_3.h | 3 +- .../doc/QP_solver/Concepts/LinearProgram.h | 7 +- .../Concepts/NonnegativeLinearProgram.h | 14 ++-- .../Concepts/NonnegativeQuadraticProgram.h | 7 +- .../doc/QP_solver/Concepts/QuadraticProgram.h | 7 +- ...shComplexWithFeatures_3InTriangulation_3.h | 3 +- .../Concepts/MeshComplex_3InTriangulation_3.h | 3 +- .../Concepts/SimplicialMeshCellBase_3.h | 9 ++- .../Concepts/SimplicialMeshVertexBase_3.h | 7 +- .../doc/STL_Extension/Concepts/Descriptor.h | 5 +- .../doc/STL_Extension/Concepts/Hashable.h | 6 +- .../doc/STL_Extension/Concepts/Index.h | 5 +- .../STL_Extension/Concepts/ProjectionObject.h | 27 +++---- .../Concepts/SurjectiveLockDataStructure.h | 3 +- .../Concepts/ScaleSpaceMesher.h | 5 +- .../Concepts/ScaleSpaceSmoother.h | 5 +- .../Concepts/RangeSegmentTreeTraits_k.h | 13 ++-- .../SegmentDelaunayGraphDataStructure_2.h | 3 +- .../Concepts/SegmentDelaunayGraphFaceBase_2.h | 3 +- ...egmentDelaunayGraphHierarchyVertexBase_2.h | 3 +- .../Concepts/SegmentDelaunayGraphSite_2.h | 3 +- .../SegmentDelaunayGraphStorageSite_2.h | 3 +- .../SegmentDelaunayGraphStorageTraits_2.h | 3 +- .../Concepts/SegmentDelaunayGraphTraits_2.h | 9 ++- .../SegmentDelaunayGraphVertexBase_2.h | 3 +- .../SegmentDelaunayGraphLinfTraits_2.h | 9 ++- .../Concepts/CastingTraits_2.h | 2 +- .../Concepts/EfficientRANSACTraits.h | 4 +- .../Shape_detection/Concepts/NeighborQuery.h | 10 +-- .../doc/Shape_detection/Concepts/RegionType.h | 16 ++-- .../Concepts/ContourDirections.h | 8 +- .../Concepts/NeighborQuery.h | 4 +- .../Concepts/RegularizationType.h | 6 +- .../Concepts/SkinSurfaceTraits_3.h | 3 +- .../Skin_surface_3/Concepts/SkinSurface_3.h | 5 +- .../Concepts/SnapRoundingTraits_2.h | 21 +++--- .../Concepts/DiagonalizeTraits.h | 3 +- .../Concepts/MixedIntegerProgramTraits.h | 16 ++-- ...ormalEquationSparseLinearAlgebraTraits_d.h | 3 +- .../Concepts/QuadraticProgramTraits.h | 4 +- .../Concepts/SparseLinearAlgebraTraits_d.h | 11 ++- .../SparseLinearAlgebraWithFactorTraits_d.h | 3 +- .../doc/Solver_interface/Concepts/SvdTraits.h | 9 ++- .../Concepts/FuzzyQueryItem.h | 3 +- .../Concepts/GeneralDistance.h | 5 +- .../Concepts/OrthogonalDistance.h | 5 +- .../Concepts/RangeSearchTraits.h | 13 ++-- .../Concepts/SearchGeomTraits_2.h | 2 +- .../Concepts/SearchGeomTraits_3.h | 2 +- .../Spatial_searching/Concepts/SearchTraits.h | 17 +++-- .../Concepts/SpatialSeparator.h | 3 +- .../Spatial_searching/Concepts/SpatialTree.h | 3 +- .../doc/Spatial_searching/Concepts/Splitter.h | 15 ++-- .../Concepts/SpatialSortingTraits_2.h | 4 +- .../Concepts/SpatialSortingTraits_3.h | 4 +- .../Concepts/SpatialSortingTraits_d.h | 4 +- .../Concepts/PolygonOffsetBuilderTraits_2.h | 3 +- .../StraightSkeletonBuilderTraits_2.h | 3 +- .../StraightSkeletonBuilder_2_Visitor.h | 3 +- .../Concepts/StraightSkeletonFace_2.h | 3 +- .../Concepts/StraightSkeletonHalfedge_2.h | 3 +- .../StraightSkeletonItemsConverter_2.h | 3 +- .../Concepts/StraightSkeletonVertex_2.h | 3 +- .../Concepts/StraightSkeleton_2.h | 3 +- .../Stream_lines_2/Concepts/Integrator_2.h | 5 +- .../Concepts/StreamLinesTraits_2.h | 2 +- .../Stream_lines_2/Concepts/VectorField_2.h | 5 +- .../Subdivision_method_3/Concepts/DQQMask_3.h | 3 +- .../Subdivision_method_3/Concepts/PQQMask_3.h | 3 +- .../Subdivision_method_3/Concepts/PTQMask_3.h | 3 +- .../Concepts/Sqrt3Mask_3.h | 3 +- .../Concepts/ErrorMetricProxy.h | 5 +- .../DeformationClosestRotationTraits_3.h | 5 +- .../Concepts/Parameterizer_3.h | 21 +++--- .../Concepts/SegmentationGeomTraits.h | 2 +- .../Concepts/SurfaceMeshShortestPathTraits.h | 3 +- .../Concepts/GetCost.h | 7 +- .../Concepts/GetPlacement.h | 11 +-- .../Concepts/PlacementFilter.h | 5 +- .../Concepts/StopPredicate.h | 11 +-- .../MeanCurvatureSkeletonizationTraits.h | 2 +- .../Concepts/PolygonalSchema.h | 4 +- .../Concepts/PolygonalSchemaItems.h | 2 +- .../Concepts/WeightFunctor.h | 4 +- .../Concepts/ImplicitFunction.h | 4 +- .../Concepts/ImplicitSurfaceTraits_3.h | 2 +- .../Concepts/SurfaceMeshCellBase_3.h | 5 +- .../SurfaceMeshComplex_2InTriangulation_3.h | 3 +- .../Concepts/SurfaceMeshFacetsCriteria_3.h | 3 +- .../Concepts/SurfaceMeshTraits_3.h | 3 +- .../Concepts/SurfaceMeshTriangulation_3.h | 2 +- .../Concepts/SurfaceMeshVertexBase_3.h | 5 +- .../doc/Surface_mesher/Concepts/Surface_3.h | 3 +- .../Concepts/TriangulationDSFaceBase_2.h | 3 +- .../Concepts/TriangulationDSVertexBase_2.h | 3 +- .../Concepts/TriangulationDataStructure_2.h | 9 ++- .../Concepts/TriangulationDSCellBase_3.h | 3 +- .../Concepts/TriangulationDSVertexBase_3.h | 3 +- .../Concepts/TriangulationDataStructure_3.h | 3 +- .../Concepts/RemeshingCellBase_3.h | 3 +- .../Concepts/RemeshingTriangulationTraits_3.h | 2 +- .../Concepts/RemeshingVertexBase_3.h | 3 +- .../Concepts/DelaunayTriangulationTraits.h | 5 +- .../Concepts/RegularTriangulationTraits.h | 5 +- .../Concepts/TriangulationDSFace.h | 3 +- .../Concepts/TriangulationDSFullCell.h | 5 +- .../Concepts/TriangulationDSVertex.h | 5 +- .../Concepts/TriangulationDataStructure.h | 13 ++-- .../Concepts/TriangulationFullCell.h | 3 +- .../Concepts/TriangulationTraits.h | 5 +- .../Concepts/TriangulationVertex.h | 3 +- ...ConstrainedDelaunayTriangulationTraits_2.h | 8 +- .../ConstrainedTriangulationFaceBase_2.h | 3 +- .../ConstrainedTriangulationTraits_2.h | 10 +-- .../Concepts/DelaunayTriangulationTraits_2.h | 12 +-- .../Concepts/RegularTriangulationFaceBase_2.h | 3 +- .../Concepts/RegularTriangulationTraits_2.h | 2 +- .../RegularTriangulationVertexBase_2.h | 3 +- .../Concepts/TriangulationFaceBase_2.h | 3 +- .../TriangulationHierarchyVertexBase_2.h | 3 +- .../Concepts/TriangulationTraits_2.h | 10 +-- .../TriangulationVertexBaseWithInfo_2.h | 3 +- .../Concepts/TriangulationVertexBase_2.h | 3 +- .../DelaunayTriangulationCellBase_3.h | 5 +- .../Concepts/DelaunayTriangulationTraits_3.h | 15 ++-- ...lationCellBaseWithWeightedCircumcenter_3.h | 3 +- .../Concepts/RegularTriangulationCellBase_3.h | 3 +- .../Concepts/RegularTriangulationTraits_3.h | 2 +- .../RegularTriangulationVertexBase_3.h | 3 +- .../TriangulationCellBaseWithInfo_3.h | 3 +- .../Concepts/TriangulationCellBase_3.h | 5 +- .../Concepts/TriangulationTraits_3.h | 2 +- .../TriangulationVertexBaseWithInfo_3.h | 3 +- .../Concepts/TriangulationVertexBase_3.h | 5 +- .../DelaunayTriangulationOnSphereTraits_2.h | 5 +- .../TriangulationOnSphereFaceBase_2.h | 3 +- .../Concepts/TriangulationOnSphereTraits_2.h | 5 +- .../TriangulationOnSphereVertexBase_2.h | 3 +- .../doc/Visibility_2/Concepts/Visibility_2.h | 7 +- .../Concepts/AdaptationPolicy_2.h | 19 ++--- .../Concepts/AdaptationTraits_2.h | 9 ++- .../Concepts/DelaunayGraph_2.h | 14 ++-- .../Weights/Concepts/AnalyticWeightTraits_2.h | 9 +-- .../Weights/Concepts/AnalyticWeightTraits_3.h | 3 +- .../Weights/Concepts/BarycentricWeights_2.h | 8 +- 399 files changed, 1252 insertions(+), 916 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index 0ac0476616eb..7fb8d9cfd960 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -41,8 +41,8 @@ namespace CGAL { * of `VertexPointPMap` (using the `Kernel_traits` mechanism). * The segment type of the primitive (`Datum`) is `CGAL::Kernel_traits< boost::property_traits< VertexPointPMap >::%value_type >::%Kernel::Segment_3`. * - * \cgalModelsBare{AABBPrimitive if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`, - * AABBPrimitiveWithSharedData if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`} + * \cgalModelsBare{`AABBPrimitive` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`, + * `AABBPrimitiveWithSharedData` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`} * * \tparam HalfedgeGraph is a model of the halfedge graph concept. * as key type and a \cgal Kernel `Point_3` as value type. diff --git a/AABB_tree/include/CGAL/AABB_primitive.h b/AABB_tree/include/CGAL/AABB_primitive.h index d602a349ee0e..b31cf5a74de0 100644 --- a/AABB_tree/include/CGAL/AABB_primitive.h +++ b/AABB_tree/include/CGAL/AABB_primitive.h @@ -53,8 +53,8 @@ struct AABB_primitive_base * The two property maps which are template parameters of the class enable to get the datum and the reference point of * the primitive from the identifier. The last template parameter controls whether the primitive class holds a copy of the datum. * - * \cgalModelsBare{AABBPrimitive if `ExternalPropertyMaps` is `CGAL::Tag_false`, - * AABBPrimitiveWithSharedData if `ExternalPropertyMaps` is `CGAL::Tag_true`} + * \cgalModelsBare{`AABBPrimitive` if `ExternalPropertyMaps` is `CGAL::Tag_false`, + * `AABBPrimitiveWithSharedData` if `ExternalPropertyMaps` is `CGAL::Tag_true`} * * \tparam ObjectPropertyMap is a model of `ReadablePropertyMap` with `Id` as * `key_type`. It must be a model of `CopyConstructible`, `DefaultConstructible`, and `CopyAssignable`. diff --git a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h index c68ff917daa3..a56096bcb197 100644 --- a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h @@ -11,7 +11,7 @@ together with a few geometric predicates and constructions on these objects. \cgalRefines{DelaunayTriangulationTraits_3} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the concept `Kernel`} */ class AdvancingFrontSurfaceReconstructionTraits_3 { diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h index 48c92909b80a..0fbc4ea6f174 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h @@ -28,7 +28,8 @@ algebraic operations within that structure. \sa `CGAL::Field_with_kth_root_tag` \sa `CGAL::Field_with_root_of_tag` -\cgalHasModel `CGAL::Algebraic_structure_traits` +\cgalHasModelsBegin CGAL::Algebraic_structure_traits +\cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h index 8609a9a9cbe7..a53ac500cbf9 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h @@ -9,16 +9,17 @@ for Cartesian kernels. \cgalRefines{Field,RealEmbeddable} -\cgalHasModel float -\cgalHasModel double -\cgalHasModel `CGAL::Gmpq` -\cgalHasModel `CGAL::Interval_nt` -\cgalHasModel `CGAL::Interval_nt_advanced` -\cgalHasModel `CGAL::Lazy_exact_nt` -\cgalHasModel `CGAL::Quotient` -\cgalHasModel `leda_rational` -\cgalHasModel `leda_bigfloat` -\cgalHasModel `leda_real` +\cgalHasModelsBegin float +\cgalHasModels double +\cgalHasModels CGAL::Gmpq +\cgalHasModels CGAL::Interval_nt +\cgalHasModels CGAL::Interval_nt_advanced +\cgalHasModels CGAL::Lazy_exact_nt +\cgalHasModels CGAL::Quotient +\cgalHasModels leda_rational +\cgalHasModels leda_bigfloat +\cgalHasModels leda_real +\cgalHasModelsEnd \sa `RingNumberType` \sa `Kernel` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h index eaa438e6c903..35d4b408a679 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h @@ -8,7 +8,8 @@ A model of `FractionTraits` is associated with a type `Type`. In case the associated type is a `Fraction`, a model of `FractionTraits` provides the relevant functionality for decomposing and re-composing as well as the numerator and denominator type. -\cgalHasModel `CGAL::Fraction_traits` +\cgalHasModelsBegin CGAL::Fraction_traits +\cgalHasModelsEnd \sa `FractionTraits_::Decompose` \sa `FractionTraits_::Compose` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h index 58d2190329ad..f8f2f3f8749d 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h @@ -6,9 +6,10 @@ A model of the concept `FromIntConstructible` is required to be constructible from int. -\cgalHasModel int -\cgalHasModel long -\cgalHasModel double +\cgalHasModelsBegin int +\cgalHasModels long +\cgalHasModels double +\cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h index 379390e11e7b..1cd155d7ccff 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h @@ -7,7 +7,8 @@ A model of `RealEmbeddableTraits` is associated to a number type `Type` and reflects the properties of this type with respect to the concept `RealEmbeddable`. -\cgalHasModel `CGAL::Real_embeddable_traits` +\cgalHasModelsBegin CGAL::Real_embeddable_traits +\cgalHasModelsEnd */ class RealEmbeddableTraits { diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h index a2b6c5036f02..462030682589 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h @@ -10,19 +10,19 @@ for Homogeneous kernels. \cgalRefines{IntegralDomainWithoutDivision,RealEmbeddable} -\cgalHasModel \cpp built-in number types -\cgalHasModel `CGAL::Gmpq` -\cgalHasModel `CGAL::Gmpz` -\cgalHasModel `CGAL::Interval_nt` -\cgalHasModel `CGAL::Interval_nt_advanced` -\cgalHasModel `CGAL::Lazy_exact_nt` -\cgalHasModel `CGAL::MP_Float` -\cgalHasModel `CGAL::Gmpzf` -\cgalHasModel `CGAL::Quotient` -\cgalHasModel `leda_integer` -\cgalHasModel `leda_rational` -\cgalHasModel `leda_bigfloat` -\cgalHasModel `leda_real` +\cgalHasModelsBareBegin{\cpp built-in number types} CGAL::Gmpq +\cgalHasModels CGAL::Gmpz +\cgalHasModels CGAL::Interval_nt +\cgalHasModels CGAL::Interval_nt_advanced +\cgalHasModels CGAL::Lazy_exact_nt +\cgalHasModels CGAL::MP_Float +\cgalHasModels CGAL::Gmpzf +\cgalHasModels CGAL::Quotient +\cgalHasModels leda_integer +\cgalHasModels leda_rational +\cgalHasModels leda_bigfloat +\cgalHasModels leda_real +\cgalHasModelsEnd \sa `FieldNumberType` diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h index c9c2f475f8eb..f9b702d436be 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h @@ -8,8 +8,9 @@ algebraic functionalities on univariate polynomials of general degree \f$ d\f$. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModel `CGAL::Algebraic_kernel_rs_gmpz_d_1` -\cgalHasModel `CGAL::Algebraic_kernel_rs_gmpq_d_1` +\cgalHasModelsBegin CGAL::Algebraic_kernel_rs_gmpz_d_1 +\cgalHasModels CGAL::Algebraic_kernel_rs_gmpq_d_1 +\cgalHasModelsEnd \sa `AlgebraicKernel_d_2` diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h index 57b30f90d2f1..562a6aaaa195 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h @@ -9,7 +9,8 @@ The concept `AlphaShapeFace_2` describes the requirements for the base face of a RegularTriangulationFaceBase_2 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_2TriangulationFaceBase_2 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Alpha_shape_face_base_2` (templated with the appropriate triangulation face base class). +\cgalHasModelsBegin CGAL::Alpha_shape_face_base_2 (templated with the appropriate triangulation face base class) +\cgalHasModelsEnd */ class AlphaShapeFace_2 { diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h index a6f1c1fca181..28ad270b7441 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h @@ -9,8 +9,7 @@ class of the underlying Delaunay triangulation of a basic alpha shape. \cgalRefines{DelaunayTriangulationTraits_2 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_2DelaunayTriangulationTraits_2 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} -\cgalHasModel All models of `Kernel`. -\cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3`. +\cgalHasModelsBare{All models of `Kernel`,Projection traits such as `CGAL::Projection_traits_xy_3`} \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h index 5015af963f61..5116683d78b3 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h @@ -9,7 +9,7 @@ The concept `AlphaShapeVertex_2` describes the requirements for the base vertex RegularTriangulationVertexBase_2 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_2TriangulationVertexBase_2 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Alpha_shape_vertex_base_2` (templated with the appropriate triangulation vertex base class). +\cgalHasModelsBare{`CGAL::Alpha_shape_vertex_base_2` (templated with the appropriate triangulation vertex base class)} */ class AlphaShapeVertex_2 { public: diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h index 62d404c3c384..05be16ee5596 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h @@ -9,8 +9,7 @@ of the underlying regular triangulation of a weighted alpha shape. \cgalRefines{RegularTriangulationTraits_2 if the underlying triangulation of the alpha shape is a regular triangulation.} -\cgalHasModel All models of `Kernel`. -\cgalHasModel Projection traits such as `CGAL::Projection_traits_xy_3`. +\cgalHasModelsBare{All models of `Kernel`,Projection traits such as `CGAL::Projection_traits_xy_3`} \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h index 570b419998e4..de5c0aacd622 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h @@ -9,7 +9,7 @@ The concept `AlphaShapeCell_3` describes the requirements for the base cell of a RegularTriangulationCellBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSCellBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class). +\cgalHasModelsBare{`CGAL::Alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class)} \sa `CGAL::Alpha_status` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h index 6d9fbcbe4304..4a5fe7a8bfd0 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h @@ -10,7 +10,7 @@ of the underlying Delaunay triangulation of a basic alpha shape. \cgalRefines{DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_3DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of `Kernel`} \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h index 6e23176c2d94..65f490141802 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h @@ -9,7 +9,7 @@ The concept `AlphaShapeVertex_3` describes the requirements for the base vertex RegularTriangulationVertexBase_3 if the underlying triangulation of the alpha shape is a regular triangulation. Periodic_3TriangulationDSVertexBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class). +\cgalHasModelsBare{`CGAL::Alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class)} \sa `CGAL::Alpha_status` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h index 1fd4060952f9..7707ed14ce16 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h @@ -9,7 +9,7 @@ The concept `FixedAlphaShapeCell_3` describes the requirements for the base cell RegularTriangulationCellBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSCellBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Fixed_alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class). +\cgalHasModelsBare{`CGAL::Fixed_alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class)} */ class FixedAlphaShapeCell_3 { public: diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h index d6b3aa7f35f6..4c63e9618fa0 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h @@ -10,7 +10,7 @@ of the underlying Delaunay triangulation of a basic alpha shape with a fixed val \cgalRefines{DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_3DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of `Kernel`} \sa CGAL::Exact_predicates_inexact_constructions_kernel (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h index 59d9593e5fcf..7b152f16e2e5 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h @@ -9,7 +9,7 @@ The concept `FixedAlphaShapeVertex_3` describes the requirements for the base ve RegularTriangulationVertexBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSVertexBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModel `CGAL::Fixed_alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class). +\cgalHasModelsBare{`CGAL::Fixed_alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class)} */ class FixedAlphaShapeVertex_3 { diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h index e84810fdc788..8b7694d5643c 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h @@ -9,7 +9,7 @@ for the geometric traits class of the underlying regular triangulation of a weig \cgalRefines{RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic regular triangulation} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of `Kernel`} \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h index f0c11a972c7e..10c8009e6c26 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h @@ -10,7 +10,7 @@ of the underlying regular triangulation of a weighted alpha shape. \cgalRefines{RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic regular triangulation} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of `Kernel`} \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h index 85c697f40a8f..145349567d2f 100644 --- a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h +++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h @@ -9,10 +9,11 @@ The concept `AlphaWrapOracle` defines the requirements for an Alpha Wrap Ora that answers a number of queries over the input of the algorithm. The oracle is the template parameter of the class `CGAL::Alpha_wraps_3_::Alpha_wrap_3`. -\cgalHasModel `CGAL::Alpha_wraps_3_::Point_set_oracle` -\cgalHasModel `CGAL::Alpha_wraps_3_::Segment_soup_oracle` -\cgalHasModel `CGAL::Alpha_wraps_3_::Triangle_mesh_oracle` -\cgalHasModel `CGAL::Alpha_wraps_3_::Triangle_soup_oracle` +\cgalHasModelsBegin CGAL::Alpha_wraps_3_::Point_set_oracle +\cgalHasModels CGAL::Alpha_wraps_3_::Segment_soup_oracle +\cgalHasModels CGAL::Alpha_wraps_3_::Triangle_mesh_oracle +\cgalHasModels CGAL::Alpha_wraps_3_::Triangle_soup_oracle +\cgalHasModelsEnd */ template diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h index 63428d4b8893..916aa5aa3daf 100644 --- a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h +++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h @@ -11,7 +11,7 @@ you require Kernel. Stitch_borders doesn't even have clear geometric traits requ The concept `AlphaWrapTraits_3` defines the requirements for the geometric traits class of an alpha wrap oracle. -\cgalHasModel Any 3D %kernel is a model of this traits concept. +\cgalHasModelsBare{Any 3D %kernel is a model of this traits concept} */ class AlphaWrapTraits_3 diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h index cca93a7c829c..e494faa898c8 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h @@ -27,7 +27,8 @@ We only describe the additional requirements with respect to the \cgalRefines{TriangulationDataStructure_2} -\cgalHasModel `CGAL::Triangulation_data_structure_2` +\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `ApolloniusGraphVertexBase_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h index a2ed0353dddc..4cfc7a99223a 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h @@ -19,7 +19,8 @@ next and previous level graphs. `ApolloniusGraphHierarchyVertexBase_2` does not introduce any types in addition to those of `ApolloniusGraphVertexBase_2`. -\cgalHasModel `CGAL::Apollonius_graph_hierarchy_vertex_base_2 >` +\cgalHasModelsBegin CGAL::Apollonius_graph_hierarchy_vertex_base_2 > +\cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` \sa `CGAL::Apollonius_graph_hierarchy_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h index 5fa6db8c6e66..1517dd4fe17f 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h @@ -12,8 +12,9 @@ it provides a type `Site_2`, which must be a model of the concept constructions for sites and several function object types for the predicates. -\cgalHasModel `CGAL::Apollonius_graph_traits_2` -\cgalHasModel `CGAL::Apollonius_graph_filtered_traits_2` +\cgalHasModelsBegin CGAL::Apollonius_graph_traits_2 +\cgalHasModels CGAL::Apollonius_graph_filtered_traits_2 +\cgalHasModelsEnd \sa `CGAL::Apollonius_graph_2` \sa `CGAL::Apollonius_graph_traits_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h index 201d7e9e91a3..cac31092bafe 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h @@ -12,7 +12,8 @@ sites. The container stores the hidden sites related to the vertex. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Apollonius_graph_vertex_base_2` +\cgalHasModelsBegin CGAL::Apollonius_graph_vertex_base_2 +\cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` \sa `CGAL::Apollonius_graph_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h index 956aad8144f9..671d83a69674 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementApproximateTraits_2::Approximate_2 + * \cgalHasModelsBegin ArrangementApproximateTraits_2::Approximate_2 + * \cgalHasModelsEnd */ class Approximate_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h index 66e4e53e8986..56ec39093c7e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementXMonotoneTraits_2::Are_mergeable_2 + * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Are_mergeable_2 + * \cgalHasModelsEnd */ class AreMergeable_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h index 01f854b6426f..9031f72a9bdb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_2 + * \cgalHasModelsBegin ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_ + * \cgalHasModelsEnd */ class CompareXNearBoundary_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h index 3a31719bb756..45fd98fa2d6b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableFunctor} * - * \cgalHasModel ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsBegin ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2 + * \cgalHasModels ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsEnd */ class CompareXOnBoundaryOfCurveEnd_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h index 4339c3f369dd..b02a736b31d3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableFunctor} * - * \cgalHasModel ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementClosedTopTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsBegin ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2 + * \cgalHasModels ArrangementClosedTopTraits_2::Compare_x_on_boundary_2 + * \cgalHasModels ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsEnd */ class CompareXOnBoundary_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h index 413311319d65..fe5d8a4d5059 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h @@ -4,7 +4,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Compare_x_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_x_2 + * \cgalHasModelsEnd */ class CompareX_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h index a485ec1a6238..f571e844bdbd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Compare_xy_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_xy_2 + * \cgalHasModelsEnd */ class CompareXy_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h index 5f50c695ceaa..eeb409061462 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Compare_y_at_x_left_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_left_2 + * \cgalHasModelsEnd */ class CompareYAtXLeft_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h index 670752239a71..1308a75c5bda 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Compare_y_at_x_right_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_right_2 + * \cgalHasModelsEnd */ class CompareYAtXRight_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h index 53bfaa495915..e1e0d6714418 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Compare_y_at_x_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_2 + * \cgalHasModelsEnd */ class CompareYAtX_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h index f4bc83bd1a91..df0c66fae012 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2 + * \cgalHasModelsBegin ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2 + * \cgalHasModelsEnd */ class CompareYNearBoundary_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h index 117023bc8326..8f5c89d89fef 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h @@ -5,10 +5,11 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2 - * \cgalHasModel ArrangementClosedRightTraits_2::Compare_y_on_boundary_2 - * \cgalHasModel ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2 - * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2 + * \cgalHasModelsBegin ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2 + * \cgalHasModels ArrangementClosedRightTraits_2::Compare_y_on_boundary_2 + * \cgalHasModels ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2 + * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2 + * \cgalHasModelsEnd */ class CompareYOnBoundary_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h index 72620babd22d..d6a0c5b1208a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementConstructCurveTraits_2::Construct_curve_2 + * \cgalHasModelsBegin ArrangementConstructCurveTraits_2::Construct_curve_2 + * \cgalHasModelsEnd */ class ConstructCurve_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h index e5c4146c9fa1..e94c601aa7a6 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Construct_max_vertex_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Construct_max_vertex_2 + * \cgalHasModelsEnd */ class ConstructMaxVertex_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h index 472c793d9f4b..00a000f41ced 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Construct_min_vertex_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Construct_min_vertex_2 + * \cgalHasModelsEnd */ class ConstructMinVertex_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h index 6fc6381803af..d25d94e43713 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2 + * \cgalHasModelsBegin ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2 + * \cgalHasModelsEnd */ class ConstructXMonotoneCurve_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h index d923f9b27dba..3994e674cfb7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h @@ -6,7 +6,8 @@ namespace ArrTraits { * represents a general planar curve. * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - * \cgalHasModel ArrangementTraits_2::Curve_2 + * \cgalHasModelsBegin ArrangementTraits_2::Curve_2 + * \cgalHasModelsEnd */ class Curve_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h index 41cf7e2f6c63..71c6da87afcc 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Equal_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Equal_2 + * \cgalHasModelsEnd */ class Equal_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h index 5e11e857548e..7a6d7e307390 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementXMonotoneTraits_2::Intersect_2 + * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Intersect_2 + * \cgalHasModelsEnd */ class Intersect_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h index 47bba6ea7443..f2850203499e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModel ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2 + * \cgalHasModelsBegin ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2 + * \cgalHasModelsEnd */ class IsOnXIdentification_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h index d9a69236ee8f..e07b550923f1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModel ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2 + * \cgalHasModelsBegin ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2 + * \cgalHasModelsEnd */ class IsOnYIdentification_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h index 1831b790c564..e9bbf29d0c8a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModel ArrangementBasicTraits_2::Is_vertical_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Is_vertical_2 + * \cgalHasModelsEnd */ class IsVertical_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h index db0df3c8cc80..46d0e1b5baea 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementTraits_2::Make_x_monotone_2 + * \cgalHasModelsBegin ArrangementTraits_2::Make_x_monotone_2 + * \cgalHasModelsEnd */ class MakeXMonotone_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h index 8e61d8c75009..17e8573bea21 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementXMonotoneTraits_2::Merge_2 + * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Merge_2 + * \cgalHasModelsEnd */ class Merge_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h index a37db7c40f65..4e6a66ede1b1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2 - * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2 + * \cgalHasModelsBegin ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 + * \cgalHasModels ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2 + * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2 + * \cgalHasModelsEnd */ class ParameterSpaceInX_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h index 0844ee649a4c..e443f0498da4 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModel ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2 - * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2 + * \cgalHasModelsBegin ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 + * \cgalHasModels ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2 + * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2 + * \cgalHasModelsEnd */ class ParameterSpaceInY_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h index 78273b889476..182f0a059bad 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h @@ -7,7 +7,8 @@ namespace ArrTraits { * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModel ArrangementBasicTraits_2::Point_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::Point_2 + * \cgalHasModelsEnd */ class Point_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h index 45210b92d0c3..ff6bcb382cbf 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h @@ -4,7 +4,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModel ArrangementXMonotoneTraits_2::Split_2 + * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Split_2 + * \cgalHasModelsEnd */ class Split_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h index 6b23acac29d8..f74e74bf150d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h @@ -6,7 +6,8 @@ namespace ArrTraits { * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModel ArrangementBasicTraits_2::X_monotone_curve_2 + * \cgalHasModelsBegin ArrangementBasicTraits_2::X_monotone_curve_2 + * \cgalHasModelsEnd */ class XMonotoneCurve_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h index b92f249431b3..b4720036574e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h @@ -8,14 +8,15 @@ point. \cgalRefines{ArrangementBasicTraits_2} -\cgalHasModel `CGAL::Arr_conic_traits_2` -\cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` -\cgalHasModel `CGAL::Arr_linear_traits_2` -\cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` -\cgalHasModel `CGAL::Arr_segment_traits_2` -\cgalHasModel `CGAL::Arr_polycurve_traits_2` -\cgalHasModel `CGAL::Arr_polyline_traits_2` -\cgalHasModel `CGAL::Arr_rational_function_traits_2` +\cgalHasModelsBegin CGAL::Arr_conic_traits_2 +\cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 +\cgalHasModels CGAL::Arr_linear_traits_2 +\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 +\cgalHasModels CGAL::Arr_segment_traits_2 +\cgalHasModels CGAL::Arr_polycurve_traits_2 +\cgalHasModels CGAL::Arr_polyline_traits_2 +\cgalHasModels CGAL::Arr_rational_function_traits_2 +\cgalHasModelsEnd \sa `ArrangementConstructXMonotoneCurveTraits_2`, `ArrangementXMonotoneTraits_2`, and diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h index 750182554c39..3e8c60735722 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h @@ -9,7 +9,8 @@ * represent the arrangement cells (i.e., vertices, edges, and facets) and the * incident relations between them. * - * \cgalHasModel `CGAL::Arr_spherical_topology_traits_2` + * \cgalHasModelsBegin CGAL::Arr_spherical_topology_traits_2 + * \cgalHasModelsEnd */ class ArrangementBasicTopologyTraits { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h index 4b8cbbbf7c28..e521ef28b065 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h @@ -27,21 +27,22 @@ * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModel `CGAL::Arr_segment_traits_2` - * \cgalHasModel `CGAL::Arr_non_caching_segment_basic_traits_2` - * \cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_polyline_traits_2` - * \cgalHasModel `CGAL::Arr_circle_segment_traits_2` - * \cgalHasModel `CGAL::Arr_line_arc_traits_2` - * \cgalHasModel `CGAL::Arr_circular_arc_traits_2` - * \cgalHasModel `CGAL::Arr_circular_line_arc_traits_2` - * \cgalHasModel `CGAL::Arr_conic_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` - * \cgalHasModel `CGAL::Arr_Bezier_curve_traits_2` - * \cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` - * \cgalHasModel `CGAL::Arr_curve_data_traits_2` - * \cgalHasModel `CGAL::Arr_consolidated_curve_data_traits_2` + * \cgalHasModelsBegin CGAL::Arr_segment_traits_2 + * \cgalHasModels CGAL::Arr_non_caching_segment_basic_traits_2 + * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 + * \cgalHasModels CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_polyline_traits_2 + * \cgalHasModels CGAL::Arr_circle_segment_traits_2 + * \cgalHasModels CGAL::Arr_line_arc_traits_2 + * \cgalHasModels CGAL::Arr_circular_arc_traits_2 + * \cgalHasModels CGAL::Arr_circular_line_arc_traits_2 + * \cgalHasModels CGAL::Arr_conic_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModels CGAL::Arr_Bezier_curve_traits_2 + * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 + * \cgalHasModels CGAL::Arr_curve_data_traits_2 + * \cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 + * \cgalHasModelsEnd */ class ArrangementBasicTraits_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h index afc3942cba8d..176810a0793e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h @@ -7,13 +7,14 @@ * * \cgalRefines{ArrangementTraits_2} * - * \cgalHasModel `CGAL::Arr_conic_traits_2` - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` - * \cgalHasModel `CGAL::Arr_segment_traits_2` - * \cgalHasModel `CGAL::Arr_polyline_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` + * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 + * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModels CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 + * \cgalHasModels CGAL::Arr_segment_traits_2 + * \cgalHasModels CGAL::Arr_polyline_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementConstructXMonotoneCurveTraits_2`, and * `ArrangementTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h index 394f98f5a3be..99ca431cd467 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h @@ -7,13 +7,14 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModel `CGAL::Arr_conic_traits_2` - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` - * \cgalHasModel `CGAL::Arr_segment_traits_2` - * \cgalHasModel `CGAL::Arr_polyline_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` + * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 + * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModels CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 + * \cgalHasModels CGAL::Arr_segment_traits_2 + * \cgalHasModels CGAL::Arr_polyline_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementApproximateTraits_2`, * `ArrangementXMonotoneTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h index f685263e31e4..81984c4699eb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h @@ -14,10 +14,11 @@ * `ArrangementDcelHalfedge`, `ArrangementDcelFace`, `ArrangementDcelOuterCcb`, * `ArrangementDcelInnerCcb`, and `ArrangementDcelIsolatedVertex` respectively.) * - * \cgalHasModel `CGAL::Arr_dcel_base` - * \cgalHasModel `CGAL::Arr_default_dcel` - * \cgalHasModel `CGAL::Arr_face_extended_dcel` - * \cgalHasModel `CGAL::Arr_extended_dcel` + * \cgalHasModelsBegin CGAL::Arr_dcel_base + * \cgalHasModels CGAL::Arr_default_dcel + * \cgalHasModels CGAL::Arr_face_extended_dcel + * \cgalHasModels CGAL::Arr_extended_dcel + * \cgalHasModelsEnd * * \sa `ArrangementDcelVertex` * \sa `ArrangementDcelHalfedge` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h index 88e4fff19f09..d4f263cf01f1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h @@ -10,9 +10,10 @@ Instantiate a dcel class with many different possible types without ad-hoc limit \cgalRefines{ArrangementDcel} -\cgalHasModel `CGAL::Arr_default_dcel` -\cgalHasModel `CGAL::Arr_face_extended_dcel` -\cgalHasModel `CGAL::Arr_extended_dcel` +\cgalHasModelsBegin CGAL::Arr_default_dcel +\cgalHasModels CGAL::Arr_face_extended_dcel +\cgalHasModels CGAL::Arr_extended_dcel +\cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h index e659a3be2972..60e28710d01a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h @@ -11,10 +11,11 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` - * \cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` + * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 + * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h index 09e87373c1e2..53469ded7bd2 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h @@ -5,9 +5,10 @@ * functions that enable reading an arrangement from an input stream using a * specific format. * - * \cgalHasModel `CGAL::Arr_text_formatter` - * \cgalHasModel `CGAL::Arr_face_extended_text_formatter` - * \cgalHasModel `CGAL::Arr_extended_dcel_text_formatter` + * \cgalHasModelsBegin CGAL::Arr_text_formatter + * \cgalHasModels CGAL::Arr_face_extended_text_formatter + * \cgalHasModels CGAL::Arr_extended_dcel_text_formatter + * \cgalHasModelsEnd * */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h index cc66b479fbe8..b014807650ae 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h @@ -11,14 +11,15 @@ * * \cgalRefines{ArrangementApproximateTraits_2,ArrangementConstructXMonotoneCurveTraits_2} * - * \cgalHasModel `CGAL::Arr_conic_traits_2` - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` - * \cgalHasModel `CGAL::Arr_segment_traits_2` - * \cgalHasModel `CGAL::Arr_polycurve_traits_2` - * \cgalHasModel `CGAL::Arr_polyline_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` + * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 + * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModels CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 + * \cgalHasModels CGAL::Arr_segment_traits_2 + * \cgalHasModels CGAL::Arr_polycurve_traits_2 + * \cgalHasModels CGAL::Arr_polyline_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementXMonotoneTraits_2` and * `ArrangementTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h index 8190767e71c5..16f3ffa51951 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h @@ -39,11 +39,12 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` - * \cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` - * \cgalHasModel `CGAL::Arr_curve_data_traits_2` - * \cgalHasModel `CGAL::Arr_consolidated_curve_data_traits_2` + * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 + * \cgalHasModels CGAL::Arr_curve_data_traits_2 + * \cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementBasicTraits_2` * \sa `ArrangementXMonotoneTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h index 0418ee873b5a..bee9cba77204 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h @@ -6,9 +6,10 @@ A model for the `ArrangementOutputFormatter` concept supports a set of functions that enable writing an arrangement to an output stream using a specific format. -\cgalHasModel `CGAL::Arr_text_formatter` -\cgalHasModel `CGAL::Arr_face_extended_text_formatter` -\cgalHasModel `CGAL::Arr_extended_dcel_text_formatter` +\cgalHasModelsBegin CGAL::Arr_text_formatter +\cgalHasModels CGAL::Arr_face_extended_text_formatter +\cgalHasModels CGAL::Arr_extended_dcel_text_formatter +\cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h index c2f6a0437f2c..31e4bf302320 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h @@ -20,10 +20,11 @@ the old style without any overhead, the macro `CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any \cgal header is included. -\cgalHasModel `CGAL::Arr_naive_point_location` -\cgalHasModel `CGAL::Arr_walk_along_line_point_location` -\cgalHasModel `CGAL::Arr_trapezoid_ric_point_location` -\cgalHasModel `CGAL::Arr_landmarks_point_location` +\cgalHasModelsBegin CGAL::Arr_naive_point_location +\cgalHasModels CGAL::Arr_walk_along_line_point_location +\cgalHasModels CGAL::Arr_trapezoid_ric_point_location +\cgalHasModels CGAL::Arr_landmarks_point_location +\cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` \sa `CGAL::Arr_walk_along_line_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h index 87ff1eb159c6..fe9137b5696a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h @@ -11,7 +11,8 @@ * \cgalRefines{ArrangementBasicTraits_2,ArrangementIdentifiedVerticalTraits_2, * ArrangementContractedBottomTraits_2,ArrangementContractedTopTraits_2} * - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` + * \cgalHasModelsBegin CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementOpenBoundaryTraits_2` * \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h index 2ea883dee115..80660fcda14d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h @@ -20,9 +20,10 @@ * * At this point we do not expose all the requirements of this concept. * - * \cgalHasModel `CGAL::Arr_bounded_planar_topology_traits_2` - * \cgalHasModel `CGAL::Arr_unb_planar_topology_traits_2` - * \cgalHasModel `CGAL::Arr_spherical_topology_traits_2` + * \cgalHasModelsBegin CGAL::Arr_bounded_planar_topology_traits_2 + * \cgalHasModels CGAL::Arr_unb_planar_topology_traits_2 + * \cgalHasModels CGAL::Arr_spherical_topology_traits_2 + * \cgalHasModelsEnd * * \sa `Arrangement_on_surface_2` */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h index 05bac54d5a27..e9bca5d3dc96 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h @@ -30,20 +30,21 @@ that accept such curves, such as `intsert()`. \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModel `CGAL::Arr_segment_traits_2` -\cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` -\cgalHasModel `CGAL::Arr_linear_traits_2` -\cgalHasModel `CGAL::Arr_polyline_traits_2` -\cgalHasModel `CGAL::Arr_circle_segment_traits_2` -\cgalHasModel `CGAL::Arr_line_arc_traits_2` -\cgalHasModel `CGAL::Arr_circular_arc_traits_2` -\cgalHasModel `CGAL::Arr_circular_line_arc_traits_2` -\cgalHasModel `CGAL::Arr_conic_traits_2` -\cgalHasModel `CGAL::Arr_rational_function_traits_2` -\cgalHasModel `CGAL::Arr_Bezier_curve_traits_2` -\cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` -\cgalHasModel `CGAL::Arr_curve_data_traits_2` -\cgalHasModel `CGAL::Arr_consolidated_curve_data_traits_2` +\cgalHasModelsBegin CGAL::Arr_segment_traits_2 +\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 +\cgalHasModels CGAL::Arr_linear_traits_2 +\cgalHasModels CGAL::Arr_polyline_traits_2 +\cgalHasModels CGAL::Arr_circle_segment_traits_2 +\cgalHasModels CGAL::Arr_line_arc_traits_2 +\cgalHasModels CGAL::Arr_circular_arc_traits_2 +\cgalHasModels CGAL::Arr_circular_line_arc_traits_2 +\cgalHasModels CGAL::Arr_conic_traits_2 +\cgalHasModels CGAL::Arr_rational_function_traits_2 +\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 +\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 +\cgalHasModels CGAL::Arr_curve_data_traits_2 +\cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 +\cgalHasModelsEnd \sa `ArrangementBasicTraits_2` \sa `ArrangementXMonotoneTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h index 4a1febdc2d23..eb1b893f460e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h @@ -28,10 +28,11 @@ is recommended. To enable the old style without any overhead, the macro `CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any \cgal header is included. -\cgalHasModel `CGAL::Arr_naive_point_location` -\cgalHasModel `CGAL::Arr_walk_along_line_point_location` -\cgalHasModel `CGAL::Arr_trapezoid_ric_point_location` -\cgalHasModel `CGAL::Arr_landmarks_point_location` +\cgalHasModelsBegin CGAL::Arr_naive_point_location +\cgalHasModels CGAL::Arr_walk_along_line_point_location +\cgalHasModels CGAL::Arr_trapezoid_ric_point_location +\cgalHasModels CGAL::Arr_landmarks_point_location +\cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` \sa `CGAL::Arr_walk_along_line_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h index cc36ec97ea62..e12fda8a889f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h @@ -11,10 +11,11 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModel `CGAL::Arr_linear_traits_2` - * \cgalHasModel `CGAL::Arr_rational_function_traits_2` - * \cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` + * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 + * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 + * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h index fd879fad9a03..4b31986adfb5 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h @@ -9,7 +9,8 @@ specific format. \cgalRefines{ArrangementInputFormatter} -\cgalHasModel `CGAL::Arr_with_history_text_formatter` +\cgalHasModelsBegin CGAL::Arr_with_history_text_formatter +\cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h index e766c2cfc26b..8ff0dc5eda48 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h @@ -9,7 +9,8 @@ specific format. \cgalRefines{ArrangementOutputFormatter} -\cgalHasModel `CGAL::Arr_with_history_text_formatter` +\cgalHasModelsBegin CGAL::Arr_with_history_text_formatter +\cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h index 5eae4b190c2d..99e34f2ae6d1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h @@ -18,20 +18,21 @@ curve splitting. \cgalRefines{ArrangementBasicTraits_2} -\cgalHasModel `CGAL::Arr_segment_traits_2` -\cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` -\cgalHasModel `CGAL::Arr_linear_traits_2` -\cgalHasModel `CGAL::Arr_polyline_traits_2` -\cgalHasModel `CGAL::Arr_circle_segment_traits_2` -\cgalHasModel `CGAL::Arr_line_arc_traits_2` -\cgalHasModel `CGAL::Arr_circular_arc_traits_2` -\cgalHasModel `CGAL::Arr_circular_line_arc_traits_2` -\cgalHasModel `CGAL::Arr_conic_traits_2` -\cgalHasModel `CGAL::Arr_rational_function_traits_2` -\cgalHasModel `CGAL::Arr_Bezier_curve_traits_2` -\cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` -\cgalHasModel `CGAL::Arr_curve_data_traits_2` -\cgalHasModel `CGAL::Arr_consolidated_curve_data_traits_2` +\cgalHasModelsBegin CGAL::Arr_segment_traits_2 +\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 +\cgalHasModels CGAL::Arr_linear_traits_2 +\cgalHasModels CGAL::Arr_polyline_traits_2 +\cgalHasModels CGAL::Arr_circle_segment_traits_2 +\cgalHasModels CGAL::Arr_line_arc_traits_2 +\cgalHasModels CGAL::Arr_circular_arc_traits_2 +\cgalHasModels CGAL::Arr_circular_line_arc_traits_2 +\cgalHasModels CGAL::Arr_conic_traits_2 +\cgalHasModels CGAL::Arr_rational_function_traits_2 +\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 +\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 +\cgalHasModels CGAL::Arr_curve_data_traits_2 +\cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 +\cgalHasModelsEnd \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h index 9221705a709d..2a90dfee44dc 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h @@ -11,8 +11,9 @@ Models for the concept are used by the global `overlay()` function to maintain the auxiliary data stored with the \dcel records of the resulting overlaid arrangement, based on the contents of the input records. -\cgalHasModel `CGAL::Arr_default_overlay_traits` -\cgalHasModel `CGAL::Arr_face_overlay_traits` +\cgalHasModelsBegin CGAL::Arr_default_overlay_traits +\cgalHasModels CGAL::Arr_face_overlay_traits +\cgalHasModelsEnd \sa `overlay` diff --git a/BGL/doc/BGL/Concepts/EdgeListGraph.h b/BGL/doc/BGL/Concepts/EdgeListGraph.h index 3b614c86c079..93b23b76748a 100644 --- a/BGL/doc/BGL/Concepts/EdgeListGraph.h +++ b/BGL/doc/BGL/Concepts/EdgeListGraph.h @@ -11,7 +11,7 @@ and adds the requirement for traversal of all edges in a graph. \cgalRefines{Graph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/FaceGraph.h b/BGL/doc/BGL/Concepts/FaceGraph.h index b7ea012f4c9b..a8b8bbe18935 100644 --- a/BGL/doc/BGL/Concepts/FaceGraph.h +++ b/BGL/doc/BGL/Concepts/FaceGraph.h @@ -20,7 +20,7 @@ A face descriptor must be `DefaultConstructible`, `Assignable`, `EqualityCompara \cgalRefines{HalfedgeGraph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/FaceListGraph.h b/BGL/doc/BGL/Concepts/FaceListGraph.h index 6e7936f5ad9d..046015b67d2f 100644 --- a/BGL/doc/BGL/Concepts/FaceListGraph.h +++ b/BGL/doc/BGL/Concepts/FaceListGraph.h @@ -16,7 +16,7 @@ face iterator must be the same as the face descriptor of the graph. \cgalRefines{FaceGraph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/HalfedgeGraph.h b/BGL/doc/BGL/Concepts/HalfedgeGraph.h index 8a31a1a787ac..7be2d2220d71 100644 --- a/BGL/doc/BGL/Concepts/HalfedgeGraph.h +++ b/BGL/doc/BGL/Concepts/HalfedgeGraph.h @@ -38,7 +38,7 @@ An edge descriptor must be `DefaultConstructible`, `Assignable`, `EqualityCompar A model of `HalfedgeGraph` must have the interior property `vertex_point` attached to its vertices. -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/HalfedgeListGraph.h b/BGL/doc/BGL/Concepts/HalfedgeListGraph.h index 1019f3c336bd..c5f8eeff6898 100644 --- a/BGL/doc/BGL/Concepts/HalfedgeListGraph.h +++ b/BGL/doc/BGL/Concepts/HalfedgeListGraph.h @@ -16,7 +16,7 @@ halfedge iterator must be the same as the halfedge descriptor of the graph. \cgalRefines{HalfedgeGraph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/MutableFaceGraph.h b/BGL/doc/BGL/Concepts/MutableFaceGraph.h index 2ce0c9815546..1f0f86c6a863 100644 --- a/BGL/doc/BGL/Concepts/MutableFaceGraph.h +++ b/BGL/doc/BGL/Concepts/MutableFaceGraph.h @@ -7,7 +7,7 @@ the requirement for operations to add faces and to modify face-halfedge relation \cgalRefines{FaceGraph,MutableHalfedgeGraph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h b/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h index 5ce56824a5ae..86bd650fc867 100644 --- a/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h +++ b/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h @@ -8,7 +8,7 @@ update the incidence information between vertices and halfedges. \cgalRefines{HalfedgeGraph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/VertexListGraph.h b/BGL/doc/BGL/Concepts/VertexListGraph.h index aa88a4d1944d..009fe00dac1b 100644 --- a/BGL/doc/BGL/Concepts/VertexListGraph.h +++ b/BGL/doc/BGL/Concepts/VertexListGraph.h @@ -11,7 +11,7 @@ and adds the requirement for traversal of all vertices in a graph. \cgalRefines{Graph} -\cgalHasModel See \link PkgBGLTraits Boost Graph Traits Specializations \endlink +\cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h index 7f9ea3dfcbbf..9fd9c19943b5 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h @@ -8,10 +8,10 @@ namespace Barycentric_coordinates { A concept that describes the set of methods that should be defined for all coordinate models used to parameterize the class `Generalized_barycentric_coordinates_2`. -\cgalHasModel -- `Wachspress_2` -- `Mean_value_2` -- `Discrete_harmonic_2` +\cgalHasModelsBegin Wachspress_2 +\cgalHasModels Mean_value_2 +\cgalHasModels Discrete_harmonic_2 +\cgalHasModelsEnd \deprecated This part of the package is deprecated since the version 5.4 of \cgal. */ diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h index 1fe3c8fc2bd5..bf07127b14db 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h @@ -9,12 +9,11 @@ A concept that describes the set of requirements of the template parameter `GeomTraits` used to parameterize all classes and functions with 2D barycentric coordinates from the namespace `CGAL::Barycentric_coordinates`. -\cgalHasModel -- All models of `Kernel` -- `CGAL::Projection_traits_3` -- `CGAL::Projection_traits_xy_3` -- `CGAL::Projection_traits_yz_3` -- `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{All models of `Kernel`} CGAL::Projection_traits_3 +\cgalHasModels CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd */ class BarycentricTraits_2 { diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h index 9e6e353958c3..9ace050c0d8b 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h @@ -13,7 +13,8 @@ elements, which share common edges and vertices. These finite elements are then used to approximate certain types of generalized barycentric coordinate functions. The domain is bounded by the polygon. -\cgalHasModel `Delaunay_domain_2` +\cgalHasModelsBegin Delaunay_domain_2 +\cgalHasModelsEnd */ class DiscretizedDomain_2 { diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h index c1f77e40a827..409316c5a4e6 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h index 336b992999dd..f4fcfa096e92 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h @@ -6,7 +6,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h index 5e8c9d034a44..719878346a5c 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h @@ -6,7 +6,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h index 0d90fbacb2f9..1e98facf71d9 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Intersect_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Intersect_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h index 673b60c589b4..2064a3ba0797 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Merge_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Merge_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h index 108eb017796f..91f8903728c8 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModel `ArrangementDirectionalXMonotoneTraits_2::Split_2` +\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Split_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h index 62ce1fb841f8..6b66a66997bb 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h @@ -16,13 +16,14 @@ as its source and the other as its target. \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModel `CGAL::Arr_segment_traits_2` -\cgalHasModel `CGAL::Arr_non_caching_segment_traits_2` -\cgalHasModel `CGAL::Arr_circle_segment_traits_2` -\cgalHasModel `CGAL::Arr_conic_traits_2` -\cgalHasModel `CGAL::Arr_rational_function_traits_2` -\cgalHasModel `CGAL::Arr_Bezier_curve_traits_2` -\cgalHasModel `CGAL::Arr_algebraic_segment_traits_2` +\cgalHasModelsBegin CGAL::Arr_segment_traits_2 +\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 +\cgalHasModels CGAL::Arr_circle_segment_traits_2 +\cgalHasModels CGAL::Arr_conic_traits_2 +\cgalHasModels CGAL::Arr_rational_function_traits_2 +\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 +\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 +\cgalHasModelsEnd \sa `ArrangementXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h index ec5f5909ce3e..9264a822bff7 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h @@ -16,7 +16,8 @@ respectively \cgalRefines{ArrangementDcel} -\cgalHasModel `CGAL::Gps_default_dcel` +\cgalHasModelsBegin CGAL::Gps_default_dcel +\cgalHasModelsEnd \sa `GeneralPolygonSetDcelFace` \sa `GeneralPolygonSetDcelHalfedge` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h index e33f52f22197..029f24e7b3f0 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h @@ -9,7 +9,8 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelFace} -\cgalHasModel `CGAL::Gps_face_base` +\cgalHasModelsBegin CGAL::Gps_face_base +\cgalHasModelsEnd \sa `ArrangementDcel` \sa `ArrangementDcelVertex` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h index 7334559a7eff..900f52372298 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h @@ -8,7 +8,8 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelHalfedge} -\cgalHasModel `CGAL::Gps_face_halfedge` +\cgalHasModelsBegin CGAL::Gps_face_halfedge +\cgalHasModelsEnd \sa `ArrangementDcel` \sa `ArrangementDcelVertex` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h index 99001c39f1c1..5271a7807440 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h @@ -13,9 +13,10 @@ types. \cgalRefines{ArrangementDirectionalXMonotoneTraits_2} -\cgalHasModel `CGAL::Gps_segment_traits_2` -\cgalHasModel `CGAL::Gps_circle_segment_traits_2` -\cgalHasModel `CGAL::Gps_traits_2` +\cgalHasModelsBegin CGAL::Gps_segment_traits_2 +\cgalHasModels CGAL::Gps_circle_segment_traits_2 +\cgalHasModels CGAL::Gps_traits_2 +\cgalHasModelsEnd \sa `ArrangementDirectionalXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h index 2a46c3470bdf..d9103ae6839a 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h @@ -16,7 +16,8 @@ accordingly. Only counterclockwise oriented polygons are valid operands of Boolean set-operations. General polygon that represent holes must be clockwise oriented. -\cgalHasModel `CGAL::General_polygon_2` +\cgalHasModelsBegin CGAL::General_polygon_2 +\cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h index 842290bb47f4..c9d62f6cef64 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h @@ -9,7 +9,8 @@ A model of this concept represents a general polygon with holes. \cgalGeneralizes `GeneralPolygonWithHoles_2` -\cgalHasModel `GeneralPolygonSetTraits_2::Polygon_with_holes2` +\cgalHasModelsBegin GeneralPolygonSetTraits_2::Polygon_with_holes2 +\cgalHasModelsEnd \sa `GeneralPolygonWithHoles_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h index 99324d142277..a9999735b0e7 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h @@ -9,8 +9,9 @@ A model of this concept represents a simple general polygon. \cgalGeneralizes `GeneralPolygon_2` -\cgalHasModel `GeneralPolygonSetTraits_2::Polygon_2` -\cgalHasModel `CGAL::Polygon_2` +\cgalHasModelsBegin GeneralPolygonSetTraits_2::Polygon_2 +\cgalHasModels CGAL::Polygon_2 +\cgalHasModelsEnd \sa `GeneralPolygon_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h index d026e62b5878..05721090917e 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h @@ -8,9 +8,10 @@ This concept defines the requirements for traits classes of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Approximate_min_ellipsoid_d_traits_2` -\cgalHasModel `CGAL::Approximate_min_ellipsoid_d_traits_3` -\cgalHasModel `CGAL::Approximate_min_ellipsoid_d_traits_d` +\cgalHasModelsBegin CGAL::Approximate_min_ellipsoid_d_traits_2 +\cgalHasModels CGAL::Approximate_min_ellipsoid_d_traits_3 +\cgalHasModels CGAL::Approximate_min_ellipsoid_d_traits_d +\cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h index e593f73cb76a..71cb832881ed 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h @@ -6,7 +6,8 @@ This concept defines the requirements for traits classes of `CGAL::Min_circle_2`. -\cgalHasModel `CGAL::Min_circle_2_traits_2` +\cgalHasModelsBegin CGAL::Min_circle_2_traits_2 +\cgalHasModelsEnd \sa `CGAL::Min_circle_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h index f4d480a00ba1..d6cfac02a1fb 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h @@ -6,7 +6,8 @@ This concept defines the requirements for traits classes of `CGAL::Min_ellipse_2`. -\cgalHasModel `CGAL::Min_ellipse_2_traits_2` +\cgalHasModelsBegin CGAL::Min_ellipse_2_traits_2 +\cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h index be4ba5f5a2da..17da54b77741 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h @@ -8,7 +8,8 @@ needed to compute minimum enclosing quadrilaterals of a planar point set using the functions `min_rectangle_2()`, `min_parallelogram_2()` and `min_strip_2()`. -\cgalHasModel `CGAL::Min_quadrilateral_default_traits_2` +\cgalHasModelsBegin CGAL::Min_quadrilateral_default_traits_2 +\cgalHasModelsEnd \sa `CGAL::min_rectangle_2()` \sa `CGAL::min_parallelogram_2()` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h index bbf1b33c2e94..ddd404f13c6b 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h @@ -6,9 +6,10 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional min sphere and min annulus algorithms. -\cgalHasModel `CGAL::Min_sphere_annulus_d_traits_2` -\cgalHasModel `CGAL::Min_sphere_annulus_d_traits_3` -\cgalHasModel `CGAL::Min_sphere_annulus_d_traits_d` +\cgalHasModelsBegin CGAL::Min_sphere_annulus_d_traits_2 +\cgalHasModels CGAL::Min_sphere_annulus_d_traits_3 +\cgalHasModels CGAL::Min_sphere_annulus_d_traits_d +\cgalHasModelsEnd \sa `CGAL::Min_sphere_d` \sa `CGAL::Min_annulus_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h index 49b32647f3c2..163cc679065f 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h @@ -6,13 +6,13 @@ A model of concept `MinSphereOfSpheresTraits` must provide the following constants, types, predicates and operations. -\cgalHasModel `CGAL::Min_sphere_of_spheres_d_traits_2` -\cgalHasModel `CGAL::Min_sphere_of_spheres_d_traits_3` -\cgalHasModel `CGAL::Min_sphere_of_spheres_d_traits_d` - -\cgalHasModel `CGAL::Min_sphere_of_points_d_traits_2` -\cgalHasModel `CGAL::Min_sphere_of_points_d_traits_3` -\cgalHasModel `CGAL::Min_sphere_of_points_d_traits_d` +\cgalHasModelsBegin CGAL::Min_sphere_of_spheres_d_traits_2 +\cgalHasModels CGAL::Min_sphere_of_spheres_d_traits_3 +\cgalHasModels CGAL::Min_sphere_of_spheres_d_traits_d +\cgalHasModels CGAL::Min_sphere_of_points_d_traits_2 +\cgalHasModels CGAL::Min_sphere_of_points_d_traits_3 +\cgalHasModels CGAL::Min_sphere_of_points_d_traits_d +\cgalHasModelsEnd */ class MinSphereOfSpheresTraits { diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h index 9c0727d44bd1..2c9c9ba44d50 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h @@ -7,7 +7,8 @@ The concept `RectangularPCenterTraits_2` defines types and operations needed to compute rectilinear \f$ p\f$-centers of a planar point set using the function `CGAL::rectangular_p_center_2()`. -\cgalHasModel `CGAL::Rectangular_p_center_default_traits_2` +\cgalHasModelsBegin CGAL::Rectangular_p_center_default_traits_2 +\cgalHasModelsEnd \sa `CGAL::rectangular_p_center_2()` diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h index 7d28f370fc8c..594f4c94ebb9 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h @@ -10,8 +10,9 @@ the dimension, the `id`-number, and the boundaries of the box. \cgalRefines{Assignable} -\cgalHasModel CGAL::Box_intersection_d::Box_d -\cgalHasModel CGAL::Box_intersection_d::Box_with_handle_d +\cgalHasModelsBegin CGAL::Box_intersection_d::Box_d +\cgalHasModels CGAL::Box_intersection_d::Box_with_handle_d +\cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink \sa \link PkgBoxIntersectionD_box_self_intersection_d `CGAL::box_self_intersection_d()` \endlink diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h index 03300e29d644..cf6dfcb546dc 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h @@ -9,7 +9,8 @@ the boxes manipulated in these algorithms. \cgalRefines{Assignable,DefaultConstructible} -\cgalHasModel CGAL::Box_intersection_d::Box_traits_d +\cgalHasModelsBegin CGAL::Box_intersection_d::Box_traits_d +\cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink \sa \link PkgBoxIntersectionD_box_self_intersection_d `CGAL::box_self_intersection_d()` \endlink diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h index 322134ed592a..f5a18c372206 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h @@ -11,7 +11,8 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel CGAL::Polynomial_for_circles_2_2 +\cgalHasModelsBegin CGAL::Polynomial_for_circles_2_2 +\cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h index a017fef71637..b01eedc5a49c 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h @@ -9,7 +9,8 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel CGAL::Polynomial_1_2 +\cgalHasModelsBegin CGAL::Polynomial_1_2 +\cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h index 075d69941f9b..d17715759643 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h @@ -7,7 +7,8 @@ Concept to represent the roots of a system of two equations of degree 2 in two variables `x` and `y` that are models of concept `AlgebraicKernelForCircles::PolynomialForCircles_2_2` -\cgalHasModel CGAL::Root_for_circles_2_2 +\cgalHasModelsBegin CGAL::Root_for_circles_2_2 +\cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h index 79dbf30fe5ad..e0d50ab1b572 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h @@ -7,7 +7,8 @@ The `AlgebraicKernelForCircles` concept is meant to provide the curved kernel with all the algebraic functionalities required for the manipulation of circular arcs. -\cgalHasModel `CGAL::Algebraic_kernel_for_circles_2_2` +\cgalHasModelsBegin CGAL::Algebraic_kernel_for_circles_2_2 +\cgalHasModelsEnd \sa `CircularKernel` \sa `CGAL::Circular_kernel_2` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h index add345ad6ff8..603867502f9f 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h @@ -7,7 +7,8 @@ Concept for points on circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Circular_arc_point_2` +\cgalHasModelsBegin CGAL::Circular_arc_point_2 +\cgalHasModelsEnd */ class CircularKernel::CircularArcPoint_2 { public: diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h index 34f8cef50e2e..bd5586d0035c 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h @@ -7,7 +7,8 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Circular_arc_2` +\cgalHasModelsBegin CGAL::Circular_arc_2 +\cgalHasModelsEnd */ diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h index 0400dd4bade1..7f82890c16ae 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h @@ -9,7 +9,8 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Line_arc_2` +\cgalHasModelsBegin CGAL::Line_arc_2 +\cgalHasModelsEnd */ class CircularKernel::LineArc_2 { diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h index 681d46d96790..a151ed891918 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h @@ -5,8 +5,9 @@ \cgalRefines{Kernel} -\cgalHasModel `CGAL::Circular_kernel_2` -\cgalHasModel `CGAL::Exact_circular_kernel_2` +\cgalHasModelsBegin CGAL::Circular_kernel_2 +\cgalHasModels CGAL::Exact_circular_kernel_2 +\cgalHasModelsEnd \sa `Kernel` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h index 54db59349fc0..0dbd299b9cd7 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h @@ -11,7 +11,8 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel CGAL::Polynomial_for_spheres_2_3 +\cgalHasModelsBegin GAL::Polynomial_for_spheres_2_ +\cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h index 023c13ebc201..8cf947c04bae 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h @@ -9,7 +9,8 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel CGAL::Polynomial_1_3 +\cgalHasModelsBegin CGAL::Polynomial_1_3 +\cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h index df2b2ee627bd..70866c01e37d 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h @@ -8,7 +8,8 @@ capable of storing equations of lines. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel CGAL::Polynomials_for_lines_3 +\cgalHasModelsBegin CGAL::Polynomials_for_lines_3 +\cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h index 61ac0d14a8ba..2754b94e0913 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h @@ -7,7 +7,8 @@ Concept to represent the roots of a system of three equations of degree 2 in three variables `x`, `y` and `z` that are models of concept `AlgebraicKernelForSpheres::PolynomialForSpheres_2_3`. -\cgalHasModel CGAL::Root_for_spheres_2_3 +\cgalHasModelsBegin CGAL::Root_for_spheres_2_3 +\cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h index 58ab8c24ff07..e83eca8300dd 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h @@ -7,7 +7,8 @@ The `AlgebraicKernelForSpheres` concept is meant to provide the curved kernel with all the algebraic functionalities required for the manipulation of spheres, circles, and circular arcs in 3D. -\cgalHasModel CGAL::Algebraic_kernel_for_spheres_2_3 +\cgalHasModelsBegin CGAL::Algebraic_kernel_for_spheres_2_3 +\cgalHasModelsEnd \sa `SphericalKernel` \sa `CGAL::Spherical_kernel_3` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h index 4a4494bc216e..81128f2844ee 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h @@ -7,7 +7,8 @@ Concept for points on spheres, circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Circular_arc_point_3` +\cgalHasModelsBegin CGAL::Circular_arc_point_3 +\cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h index ffefeb6aefb9..5a8498f28243 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h @@ -7,7 +7,8 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Circular_arc_3` +\cgalHasModelsBegin CGAL::Circular_arc_3 +\cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h index 5ea1f9aed8ed..07946ba0f146 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h @@ -9,7 +9,8 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Line_arc_3` +\cgalHasModelsBegin CGAL::Line_arc_3 +\cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h index 950115d7c73e..3bafc8659d0b 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h @@ -5,8 +5,9 @@ \cgalRefines{Kernel} -\cgalHasModel `CGAL::Spherical_kernel_3` -\cgalHasModel CGAL::Exact_spherical_kernel_3 +\cgalHasModelsBegin CGAL::Spherical_kernel_3 +\cgalHasModels CGAL::Exact_spherical_kernel_3 +\cgalHasModelsEnd \sa `Kernel` diff --git a/Circulator/doc/Circulator/Concepts/ConstHandle.h b/Circulator/doc/Circulator/Concepts/ConstHandle.h index 3552dc5cb29d..9ff3bea6b33d 100644 --- a/Circulator/doc/Circulator/Concepts/ConstHandle.h +++ b/Circulator/doc/Circulator/Concepts/ConstHandle.h @@ -7,7 +7,8 @@ A constant handle. Refer to the `Handle` concept for more details. \cgalRefines{Descriptor} -\cgalHasModel const T* (const pointers) +\cgalHasModelsBegin const T* (const pointers) +\cgalHasModelsEnd \sa `Handle` diff --git a/Circulator/doc/Circulator/Concepts/ConstRange.h b/Circulator/doc/Circulator/Concepts/ConstRange.h index b690c3d97d38..643dc47c83be 100644 --- a/Circulator/doc/Circulator/Concepts/ConstRange.h +++ b/Circulator/doc/Circulator/Concepts/ConstRange.h @@ -7,8 +7,7 @@ A constant iterator range. Refer to the `Range` concept for more details. \cgalRefinesBare{Boost's %Range concept} -\cgalHasModel STL containers -\cgalHasModel `boost::iterator_range` +\cgalHasModelsBare{STL containers,`boost::iterator_range`} \sa `Range` diff --git a/Circulator/doc/Circulator/Concepts/Handle.h b/Circulator/doc/Circulator/Concepts/Handle.h index 748ab737efb7..a5fade1d46fa 100644 --- a/Circulator/doc/Circulator/Concepts/Handle.h +++ b/Circulator/doc/Circulator/Concepts/Handle.h @@ -23,10 +23,11 @@ operator is concerned (this serves the same purpose as NULL for pointers). (Note that this is not a generally supported feature of iterators of standard containers.) -\cgalHasModel T* (pointer) -\cgalHasModel const T* (const pointers) -\cgalHasModel `Iterator` -\cgalHasModel `Circulator` +\cgalHasModelsBegin T* (pointer) +\cgalHasModels const T* (const pointers) +\cgalHasModels Iterator +\cgalHasModels Circulator +\cgalHasModelsEnd */ class Handle { public: diff --git a/Circulator/doc/Circulator/Concepts/Range.h b/Circulator/doc/Circulator/Concepts/Range.h index 2da31fa59408..ef6cfd56d58b 100644 --- a/Circulator/doc/Circulator/Concepts/Range.h +++ b/Circulator/doc/Circulator/Concepts/Range.h @@ -31,7 +31,7 @@ difference with iterators which are typically passed by value. \cgalRefinesBare{ConstRange,Boost's %Range concept} -\cgalHasModel STL containers +\cgalHasModelsBare{STL containers} */ diff --git a/Classification/doc/Classification/Concepts/Classifier.h b/Classification/doc/Classification/Concepts/Classifier.h index ca1f3cefc97d..9a3505997949 100644 --- a/Classification/doc/Classification/Concepts/Classifier.h +++ b/Classification/doc/Classification/Concepts/Classifier.h @@ -12,9 +12,10 @@ Concept describing a classifier used by classification functions (see `CGAL::Classification::classify()`, `CGAL::Classification::classify_with_local_smoothing()` and `CGAL::Classification::classify_with_graphcut()`). -\cgalHasModel `CGAL::Classification::Sum_of_weighted_features_classifier` -\cgalHasModel `CGAL::Classification::ETHZ::Random_forest_classifier` -\cgalHasModel `CGAL::Classification::OpenCV::Random_forest_classifier` +\cgalHasModelsBegin CGAL::Classification::Sum_of_weighted_features_classifier +\cgalHasModels CGAL::Classification::ETHZ::Random_forest_classifier +\cgalHasModels CGAL::Classification::OpenCV::Random_forest_classifier +\cgalHasModelsEnd */ class Classifier diff --git a/Classification/doc/Classification/Concepts/NeighborQuery.h b/Classification/doc/Classification/Concepts/NeighborQuery.h index eeed7fa074cf..99aeb76cb2f6 100644 --- a/Classification/doc/Classification/Concepts/NeighborQuery.h +++ b/Classification/doc/Classification/Concepts/NeighborQuery.h @@ -10,10 +10,11 @@ namespace Classification Concept describing a neighbor query used for classification. -\cgalHasModel `CGAL::Classification::Point_set_neighborhood::K_neighbor_query` -\cgalHasModel `CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query` -\cgalHasModel `CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query` -\cgalHasModel `CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query` +\cgalHasModelsBegin CGAL::Classification::Point_set_neighborhood::K_neighbor_query +\cgalHasModels CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query +\cgalHasModels CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query +\cgalHasModels CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query +\cgalHasModelsEnd */ class NeighborQuery diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h index cce3235390e6..ad331c7bc22b 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h @@ -5,7 +5,7 @@ The concept `CellAttribute` represents a non void attribute associated with a cell of a generic map. It can keep a descriptor to one dart of its associated cell, and can contain any information. -\cgalHasModel \link CGAL::Cell_attribute `CGAL::Cell_attribute`\endlink +\cgalHasModelsBare{\link CGAL::Cell_attribute `CGAL::Cell_attribute`\endlink} \sa `GenericMap` \sa `GenericMapItems` diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h index 03f492d1b081..ecf28bda596e 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h @@ -6,7 +6,7 @@ The concept `CombinatorialMap` defines a d-dimensional combinatorial map. \cgalRefines{GenericMap} -\cgalHasModel \link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink +\cgalHasModelsBare{\link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink} For a combinatorial map, the function \link GenericMap::next `next`\endlink is equal to \f$ \beta_1\f$, \link GenericMap::previous `previous`\endlink is equal to \f$ \beta_0\f$ and the function \link GenericMap::opposite `opposite`\endlink is equal to \f$ \beta_i\f$. */ diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index ae828e3cdf0d..87113f9aa211 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -8,8 +8,8 @@ The concept `GenericMap` defines a d-dimensional generic map. This concep A generic map has a set of darts D, and functions \f$ f_0\f$,\f$ \ldots\f$,\f$ f_{d}\f$ that link these darts between them. -\cgalHasModel \link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink -\cgalHasModel \link CGAL::Generalized_map `CGAL::Generalized_map`\endlink +\cgalHasModelsBare{\link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink\n + \link CGAL::Generalized_map `CGAL::Generalized_map`\endlink} \sa `CombinatorialMap` \sa `GeneralizedMap` diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h index afd744baab42..6fd24033a72b 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h @@ -4,7 +4,7 @@ The concept `GenericMapItems` allows to customize a dD generic map by choosing the information associated with darts, by enabling and disabling some attributes, and by choosing to use indices or handles. For that, it defines an inner class template named \link GenericMapItems::Dart_wrapper `Dart_wrapper`\endlink, with one template parameter, `Map`, a model of the `GenericMap` concept. This inner class can define the two types `%Dart_info` and `%Attributes`. -\cgalHasModel \link CGAL::Generic_map_min_items `CGAL::Generic_map_min_items`\endlink +\cgalHasModelsBare{\link CGAL::Generic_map_min_items `CGAL::Generic_map_min_items`\endlink} \sa `GenericMap` diff --git a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h index 0bff4725d604..251e12f7fb91 100644 --- a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h @@ -9,12 +9,13 @@ primitives (objects and predicates) that the convex hull algorithms use. functions. The specific subset of these primitives required by each function is specified with each function. -\cgalHasModel `CGAL::Convex_hull_constructive_traits_2` -\cgalHasModel `CGAL::Convex_hull_traits_2` -\cgalHasModel `CGAL::Convex_hull_traits_adapter_2` -\cgalHasModel `CGAL::Projection_traits_xy_3` -\cgalHasModel `CGAL::Projection_traits_yz_3` -\cgalHasModel `CGAL::Projection_traits_xz_3` +\cgalHasModelsBegin CGAL::Convex_hull_constructive_traits_2 +\cgalHasModels CGAL::Convex_hull_traits_2 +\cgalHasModels CGAL::Convex_hull_traits_adapter_2 +\cgalHasModels CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd */ diff --git a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h index 7efcfcb9e93a..711efc4d8aa4 100644 --- a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h @@ -4,8 +4,9 @@ Requirements of the traits class of the function `CGAL::convex_hull_3()`. -\cgalHasModel `CGAL::Convex_hull_traits_3` -\cgalHasModel `CGAL::Extreme_points_traits_adapter_3` +\cgalHasModelsBegin CGAL::Convex_hull_traits_3 +\cgalHasModels CGAL::Extreme_points_traits_adapter_3 +\cgalHasModelsEnd */ class ConvexHullTraits_3 { diff --git a/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h b/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h index d69567d6102a..6f3bad1286ed 100644 --- a/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h @@ -6,8 +6,8 @@ Requirements of the traits class used by the function `CGAL::is_strongly_convex_3()`, which is used for postcondition checking by `CGAL::convex_hull_3()`. -\cgalHasModel `CGAL::Convex_hull_traits_3` -\cgalHasModel All models of `Kernel` +\cgalHasModelsBareBegin{All models of `Kernel`} CGAL::Convex_hull_traits_3 +\cgalHasModelsEnd \sa `ConvexHullTraits_3` \sa `CGAL::is_strongly_convex_3()` diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h index abd9c2928ec7..78e06df722d3 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h @@ -7,9 +7,10 @@ Requirements of the traits class to be used with the class `CGAL::Convex_hull_d`. -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` -\cgalHasModel `CGAL::Convex_hull_d_traits_3` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModels CGAL::Convex_hull_d_traits_3 +\cgalHasModelsEnd */ class ConvexHullTraits_d { diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h index e798f331db49..23352fbe2e6e 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h @@ -7,8 +7,9 @@ Requirements of the second traits class to be used with the class `CGAL::Delaunay_d`. -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsEnd */ class DelaunayLiftedTraits_d { diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h index f2465c575fe5..b8e91a96aa9a 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h @@ -7,8 +7,9 @@ Requirements of the first traits class to be used with the class `CGAL::Delaunay_d`. -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsEnd */ diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 7486ae587d78..97f12d55731a 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -136,18 +136,19 @@ ALIASES = "cgal=%CGAL" \ "cgalRefinesBare{1}=
      @cgalRefines
      \1
      " \ "cgalRefinesBare{2}=
      @cgalRefines
      @c \1
      \2
      " \ "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ - "cgalModelsHeader=Is Model Of" \ + "cgalModelsHeader=Is model of" \ "cgalModels{1}=
      @cgalModelsHeader
      @c \1
      " \ "cgalModels{2}=
      @cgalModelsHeader
      @c \1
      @c \2
      " \ "cgalModelsBare{1}=
      @cgalModelsHeader
      \1
      " \ - "cgalModelsBare{2}=
      @cgalModelsHeader
      @c \1
      \2
      " \ + "cgalModelsBare{2}=
      @cgalModelsHeader
      \1
      \2
      " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ - "cgalHasModel=\xrefitem hasModels \"Has Models\" \"Has Model Relationships\"" \ - "cgalHasModelsHeader=Has Models" \ + "cgalHasModelsHeader=Has models" \ "cgalHasModelsBegin=
      @cgalHasModelsHeader
      `" \ "cgalHasModels=`
      `" \ "cgalHasModelsEnd=`
      " \ - "cgalHasModelsBare{1}=
      @cgalHasModels
      \1
      " \ + "cgalHasModelsBare{1}=
      @cgalHasModelsHeader
      \1
      " \ + "cgalHasModelsBare{2}=
      @cgalHasModelsHeader
      \1
      \2
      " \ + "cgalHasModelsBareBegin{1}=
      @cgalHasModelsHeader
      \1
      `" \ "cgalDebugBegin=\htmlonly
      Debugging Support
      \endhtmlonly \n" \ "cgalDebugEnd=\htmlonly
      \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 3813f3748daf..3a25e3c92bef 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -145,18 +145,19 @@ ALIASES = "cgal=%CGAL" \ "cgalRefinesBare{1}=
      @cgalRefines
      \1
      " \ "cgalRefinesBare{2}=
      @cgalRefines
      @c \1
      \2
      " \ "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ - "cgalModelsHeader=Is Model Of" \ + "cgalModelsHeader=Is model of" \ "cgalModels{1}=
      @cgalModelsHeader
      @c \1
      " \ "cgalModels{2}=
      @cgalModelsHeader
      @c \1
      @c \2
      " \ "cgalModelsBare{1}=
      @cgalModelsHeader
      \1
      " \ - "cgalModelsBare{2}=
      @cgalModelsHeader
      @c \1
      \2
      " \ + "cgalModelsBare{2}=
      @cgalModelsHeader
      \1
      \2
      " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ - "cgalHasModel=\xrefitem hasModels \"Has Models\" \"Has Model Relationships\"" \ - "cgalHasModelsHeader=Has Models" \ + "cgalHasModelsHeader=Has models" \ "cgalHasModelsBegin=
      @cgalHasModelsHeader
      `" \ "cgalHasModels=`
      `" \ "cgalHasModelsEnd=`
      " \ "cgalHasModelsBare{1}=
      @cgalHasModelsHeader
      \1
      " \ + "cgalHasModelsBare{2}=
      @cgalHasModelsHeader
      \1
      \2
      " \ + "cgalHasModelsBareBegin{1}=
      @cgalHasModelsHeader
      \1
      `" \ "cgalDebugBegin=\htmlonly[block]
      Debugging Support
      \endhtmlonly ^^" \ "cgalDebugEnd=\htmlonly[block]
      \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ diff --git a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h index 47b1f7290356..66b3c1f34772 100644 --- a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h +++ b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h @@ -16,10 +16,11 @@ Note however, that these operations usually involve the projection of \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModel `CGAL::Env_triangle_traits_3` -\cgalHasModel `CGAL::Env_sphere_traits_3` -\cgalHasModel `CGAL::Env_plane_traits_3` -\cgalHasModel `CGAL::Env_surface_data_traits_3` +\cgalHasModelsBegin CGAL::Env_triangle_traits_3 +\cgalHasModels CGAL::Env_sphere_traits_3 +\cgalHasModels CGAL::Env_plane_traits_3 +\cgalHasModels CGAL::Env_surface_data_traits_3 +\cgalHasModelsEnd */ diff --git a/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h index 91c430a9d914..f43d4b8944dd 100644 --- a/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h +++ b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h @@ -6,7 +6,7 @@ The concept `GeneralizedMap` defines a d-dimensional generalized map. \cgalRefines{GenericMap} -\cgalHasModel \link CGAL::Generalized_map `CGAL::Generalized_map`\endlink +\cgalHasModelsBare{\link CGAL::Generalized_map `CGAL::Generalized_map`\endlink} For a generalized map, the function \link GenericMap::next `next`\endlink is equal to \f$ \alpha_1\circ\alpha_0\f$, \link GenericMap::previous `previous`\endlink is equal to \f$ \alpha_0\circ\alpha_1\f$ and the function \link GenericMap::opposite `opposite`\endlink is equal to \f$ \alpha_i\circ\alpha_0\f$. */ diff --git a/Generator/doc/Generator/Concepts/CombinationElement.h b/Generator/doc/Generator/Concepts/CombinationElement.h index fc9712bb25c2..8e4747e08392 100644 --- a/Generator/doc/Generator/Concepts/CombinationElement.h +++ b/Generator/doc/Generator/Concepts/CombinationElement.h @@ -4,9 +4,9 @@ A CombinationElement can be used as template parameter for the class `Combination_enumerator`. -\cgalHasModel Any integer type (`char`, `short`, `int`, `long`, etc.) -\cgalHasModel Pointers -\cgalHasModel Random access iterators +\cgalHasModelsBare{Any integer type (`char`, `short`, `int`, `long`, etc.)\n + Pointers\n + Random access iterators} \sa `CGAL::Combination_enumerator` diff --git a/Generator/doc/Generator/Concepts/PointGenerator.h b/Generator/doc/Generator/Concepts/PointGenerator.h index a17946b0cd6e..2f96e53167d9 100644 --- a/Generator/doc/Generator/Concepts/PointGenerator.h +++ b/Generator/doc/Generator/Concepts/PointGenerator.h @@ -5,20 +5,21 @@ The concept `PointGenerator` defines the requirements for a point generator, which can be used in places where input iterators are called for. -\cgalHasModel `CGAL::Random_points_in_ball_d` -\cgalHasModel `CGAL::Random_points_in_disc_2` -\cgalHasModel `CGAL::Random_points_in_square_2` -\cgalHasModel `CGAL::Random_points_in_triangle_2` -\cgalHasModel `CGAL::Random_points_on_circle_2` -\cgalHasModel `CGAL::Random_points_on_segment_2` -\cgalHasModel `CGAL::Random_points_on_square_2` -\cgalHasModel `CGAL::Random_points_in_cube_3` -\cgalHasModel `CGAL::Random_points_in_cube_d` -\cgalHasModel `CGAL::Random_points_in_sphere_3` -\cgalHasModel `CGAL::Random_points_in_triangle_3` -\cgalHasModel `CGAL::Random_points_in_tetrahedron_3` -\cgalHasModel `CGAL::Random_points_on_sphere_3` -\cgalHasModel `CGAL::Random_points_on_sphere_d` +\cgalHasModelsBegin CGAL::Random_points_in_ball_d +\cgalHasModels CGAL::Random_points_in_disc_2 +\cgalHasModels CGAL::Random_points_in_square_2 +\cgalHasModels CGAL::Random_points_in_triangle_2 +\cgalHasModels CGAL::Random_points_on_circle_2 +\cgalHasModels CGAL::Random_points_on_segment_2 +\cgalHasModels CGAL::Random_points_on_square_2 +\cgalHasModels CGAL::Random_points_in_cube_3 +\cgalHasModels CGAL::Random_points_in_cube_d +\cgalHasModels CGAL::Random_points_in_sphere_3 +\cgalHasModels CGAL::Random_points_in_triangle_3 +\cgalHasModels CGAL::Random_points_in_tetrahedron_3 +\cgalHasModels CGAL::Random_points_on_sphere_3 +\cgalHasModels CGAL::Random_points_on_sphere_d +\cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h b/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h index 3dbf4632cb9e..424119d49b9b 100644 --- a/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h @@ -5,7 +5,7 @@ The concept `RandomConvexHullTraits_2` describes the requirements for the traits class used by the function `random_convex_hull_in_disc_2()`. -\cgalHasModel \cgal kernels. +\cgalHasModelsBare{All models of the concept `Kernel`} \cgalHeading{Operations} diff --git a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h index f796452dbeb8..630b93345d17 100644 --- a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h @@ -5,7 +5,8 @@ The concept `RandomConvexSetTraits_2` describes the requirements of the traits class for the function `random_convex_set_2()`. -\cgalHasModel `CGAL::Random_convex_set_traits_2` +\cgalHasModelsBegin CGAL::Random_convex_set_traits_2 +\cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h b/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h index c0c512b6296b..be8badeb6410 100644 --- a/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h @@ -5,7 +5,7 @@ The concept `RandomPolygonTraits_2` describes the requirements for the traits class used by the function `random_polygon_2()`. -\cgalHasModel \cgal kernels. +\cgalHasModelsBare{All models of the concept `Kernel`} \cgalHeading{Operations} diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h index 8fcb7edd26e9..227ae11cc406 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h @@ -67,9 +67,10 @@ allocators internally. A default argument is mandatory for from the `` header file can be used as default allocator. -\cgalHasModel CGAL::HalfedgeDS_default -\cgalHasModel CGAL::HalfedgeDS_list -\cgalHasModel CGAL::HalfedgeDS_vector +\cgalHasModelsBegin CGAL::HalfedgeDS_default +\cgalHasModels CGAL::HalfedgeDS_list +\cgalHasModels CGAL::HalfedgeDS_vector +\cgalHasModelsEnd \sa `HalfedgeDSItems` \sa `CGAL::Polyhedron_3` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h index 5a405bb77708..cacaac7459aa 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h @@ -23,8 +23,9 @@ can be bypassed by the user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} -\cgalHasModel `CGAL::HalfedgeDS_face_base` -\cgalHasModel `CGAL::HalfedgeDS_face_min_base` +\cgalHasModelsBegin CGAL::HalfedgeDS_face_base +\cgalHasModels CGAL::HalfedgeDS_face_min_base +\cgalHasModelsEnd \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h index f4d3652e4e24..5dae57935e8d 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h @@ -33,8 +33,9 @@ more protection is provided for the `set_opposite()` member function. The base class `Base_base` provides access to it. (The protection could be bypassed also by an user, but not by accident.) -\cgalHasModel ::CGAL::HalfedgeDS_halfedge_base -\cgalHasModel ::CGAL::HalfedgeDS_halfedge_min_base +\cgalHasModelsBegin ::CGAL::HalfedgeDS_halfedge_base +\cgalHasModels ::CGAL::HalfedgeDS_halfedge_min_base +\cgalHasModelsEnd \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h index 16d45020f90e..51a99908bc04 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h @@ -16,9 +16,10 @@ and `Face` respectively. The requirements on these types are described on the manual pages of the concepts `HalfedgeDSVertex`, `HalfedgeDSHalfedge`, and `HalfedgeDSFace` respectively. -\cgalHasModel CGAL::HalfedgeDS_min_items -\cgalHasModel CGAL::HalfedgeDS_items_2 -\cgalHasModel CGAL::Polyhedron_items_3 +\cgalHasModelsBegin CGAL::HalfedgeDS_min_items +\cgalHasModels CGAL::HalfedgeDS_items_2 +\cgalHasModels CGAL::Polyhedron_items_3 +\cgalHasModelsEnd \sa `HalfedgeDS` \sa `HalfedgeDSVertex` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h index 172b6b933f1e..38f5afab43c4 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h @@ -23,8 +23,9 @@ could be bypassed by an user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} -\cgalHasModel `CGAL::HalfedgeDS_vertex_base` -\cgalHasModel `CGAL::HalfedgeDS_vertex_min_base` +\cgalHasModelsBegin CGAL::HalfedgeDS_vertex_base +\cgalHasModels CGAL::HalfedgeDS_vertex_min_base +\cgalHasModelsEnd \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h index c7f879712253..cf4b6f8d9d70 100644 --- a/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h +++ b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h @@ -7,7 +7,7 @@ The concept `HeatMethodTraits_3` describes the types, predicates, and constructions required by the traits class parameter of `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3`. -\cgalHasModel All the \cgal kernels +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} */ diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h index 5d2d5a39e3e7..3299b6f89e3b 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h @@ -16,8 +16,9 @@ constructions on these objects. This concept refines `DelaunayTriangulationTraits_2` because the class `CGAL::Hyperbolic_Delaunay_triangulation_2` internally relies on the class `CGAL::Delaunay_triangulation_2`. -\cgalHasModel `CGAL::Hyperbolic_Delaunay_triangulation_traits_2` -\cgalHasModel `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2` +\cgalHasModelsBegin CGAL::Hyperbolic_Delaunay_triangulation_traits_2 +\cgalHasModels CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2 +\cgalHasModelsEnd */ diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h index 368630cc55be..9f57d33da117 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h @@ -41,7 +41,8 @@ This concept provides an interface for the functionality needed in faces to comp Delaunay triangulations in the hyperbolic plane. The function `tds_data()` is used internally by the triangulation class during the insertion of points in the triangulation. -\cgalHasModel `CGAL::Hyperbolic_triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Hyperbolic_triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `HyperbolicFaceData` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h index baa5e8e86b7b..f6de632e04c0 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h @@ -15,8 +15,9 @@ inscribed into a given convex polygon. precondition checking only. Therefore, they need not to be specified, in case that precondition checking is disabled. -\cgalHasModel `CGAL::Extremal_polygon_area_traits_2` -\cgalHasModel `CGAL::Extremal_polygon_perimeter_traits_2` +\cgalHasModelsBegin CGAL::Extremal_polygon_area_traits_2 +\cgalHasModels CGAL::Extremal_polygon_perimeter_traits_2 +\cgalHasModelsEnd \sa `CGAL::maximum_area_inscribed_k_gon_2()` \sa `CGAL::maximum_perimeter_inscribed_k_gon_2()` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h index 2875e0a1abaa..d3e1374d7715 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h @@ -10,8 +10,9 @@ This concept provides the types of the geometric primitives used in this class and some function object types for the required predicates on those primitives. -\cgalHasModel `CGAL::Cartesian` -\cgalHasModel `CGAL::Homogeneous` +\cgalHasModelsBegin CGAL::Cartesian +\cgalHasModels CGAL::Homogeneous +\cgalHasModelsEnd \sa `CGAL::Largest_empty_iso_rectangle_2` diff --git a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h index 8ce13fd4e1db..4cb824c031b1 100644 --- a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h @@ -7,7 +7,8 @@ traits class that defines the primitives used by the algorithm. The concept `GradientFittingTraits` defines this common set of requirements. -\cgalHasModel `CGAL::Interpolation_gradient_fitting_traits_2` +\cgalHasModelsBegin CGAL::Interpolation_gradient_fitting_traits_2 +\cgalHasModelsEnd \sa `InterpolationTraits` \sa `CGAL::Interpolation_traits_2` diff --git a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h index 03be7b11a8dc..a07eb526d3c7 100644 --- a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h @@ -7,8 +7,9 @@ Most interpolation functions are parameterized by a traits class that defines the primitives used in the interpolation algorithms. The concept `InterpolationTraits` defines this common set of requirements. -\cgalHasModel `CGAL::Interpolation_traits_2` -\cgalHasModel `CGAL::Interpolation_gradient_fitting_traits_2` +\cgalHasModelsBegin CGAL::Interpolation_traits_2 +\cgalHasModels CGAL::Interpolation_gradient_fitting_traits_2 +\cgalHasModelsEnd \sa `GradientFittingTraits` \sa `CGAL::sibson_c1_interpolation()` diff --git a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h index 254de6b64cd7..1bc267a684eb 100644 --- a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h +++ b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h @@ -9,8 +9,9 @@ The concept does not specify, whether the interval is open or closed. It is up to the implementer of a model for this concept to define that. -\cgalHasModel `CGAL::Interval_skip_list_interval` -\cgalHasModel `CGAL::Level_interval` +\cgalHasModelsBegin CGAL::Interval_skip_list_interval +\cgalHasModels CGAL::Level_interval +\cgalHasModelsEnd \sa `Interval_skip_list` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h index 041a8eb9feb7..9276d91c6b32 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h @@ -13,8 +13,9 @@ the class Only constructors (from 3 scalars and copy constructors) and access methods to coordinates `x()`, `y()`, `z()` are needed. -\cgalHasModel `CGAL::Cartesian` -\cgalHasModel `CGAL::Simple_cartesian` +\cgalHasModelsBegin CGAL::Cartesian +\cgalHasModels CGAL::Simple_cartesian +\cgalHasModelsEnd \sa `LocalKernel` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h index ba13fc2daadf..75629fb37f15 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h @@ -29,8 +29,9 @@ Only constructors (from 3 scalars and copy constructors) and access methods to coordinates `x()`, `y()`, `z()` are needed for the point and vector types. -\cgalHasModel `CGAL::Cartesian` -\cgalHasModel `CGAL::Simple_cartesian` +\cgalHasModelsBegin CGAL::Cartesian +\cgalHasModels CGAL::Simple_cartesian +\cgalHasModelsEnd \sa `DataKernel` \sa `SvdTraits` diff --git a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h index d7fa271e5600..a732c7891a3c 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h +++ b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h @@ -8,7 +8,8 @@ namespace Kernel { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Circle_2` + \cgalHasModelsBegin CGAL::Circle_2 + \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` \sa `Kernel::ComputeSquaredRadius_2` @@ -38,7 +39,8 @@ class Circle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Circle_3` + \cgalHasModelsBegin CGAL::Circle_3 + \cgalHasModelsEnd \sa `Kernel::ComputeApproximateArea_3` \sa `Kernel::ComputeApproximateSquaredLength_3` @@ -67,7 +69,8 @@ class Circle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Direction_2` + \cgalHasModels CGAL::Direction_2 + \cgalHasModelsEnd \sa `Kernel::CompareAngleWithXAxis_2` \sa `Kernel::ComputeDx_2` @@ -91,7 +94,8 @@ class Direction_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Direction_3` + \cgalHasModels CGAL::Direction_3 + \cgalHasModelsEnd \sa `Kernel::ConstructDirection_3` \sa `Kernel::ConstructOppositeDirection_3` @@ -111,7 +115,8 @@ A type representing isocuboids in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Iso_cuboid_3` +\cgalHasModelsBegin CGAL::Iso_cuboid_3 +\cgalHasModelsEnd \sa `Kernel::BoundedSide_3` \sa `Kernel::ComputeVolume_3` @@ -136,7 +141,8 @@ class IsoCuboid_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Iso_rectangle_2` + \cgalHasModels CGAL::Iso_rectangle_2 + \cgalHasModelsEnd \sa `Kernel::ConstructIsoRectangle_2` \sa `Kernel::ComputeXmin_2` @@ -168,7 +174,8 @@ class IsoRectangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Line_2` + \cgalHasModels CGAL::Line_2 + \cgalHasModelsEnd \sa `Kernel::CompareXAtY_2` \sa `Kernel::ComputeSquaredDistance_2` @@ -204,7 +211,8 @@ class Line_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Line_3` + \cgalHasModels CGAL::Line_3 + \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` \sa `Kernel::ConstructDirection_3` @@ -235,7 +243,8 @@ class Line_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Object` + \cgalHasModels CGAL::Object + \cgalHasModelsEnd \sa `Kernel::Assign_2` \sa `Kernel::ConstructObject_2` @@ -256,7 +265,8 @@ class Object_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Object` + \cgalHasModels CGAL::Object + \cgalHasModelsEnd \sa `Kernel::Assign_3` \sa `Kernel::ConstructObject_3` @@ -275,7 +285,8 @@ class Object_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Plane_3` + \cgalHasModels CGAL::Plane_3 + \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` \sa `Kernel::ConstructBaseVector_3` @@ -312,7 +323,8 @@ class Plane_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Point_2` + \cgalHasModels CGAL::Point_2 + \cgalHasModelsEnd \sa `Kernel::Angle_2` \sa `Kernel::AreOrderedAlongLine_2` @@ -371,7 +383,8 @@ class Point_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Point_3` + \cgalHasModels CGAL::Point_3 + \cgalHasModelsEnd \sa `Kernel::Angle_3` \sa `Kernel::AreOrderedAlongLine_3` @@ -432,7 +445,8 @@ A type representing rays in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Ray_2` +\cgalHasModelsBegin CGAL::Ray_2 +\cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` \sa `Kernel::ComputeSquaredDistance_2` @@ -464,7 +478,8 @@ class Ray_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Ray_3` + \cgalHasModelsBegin CGAL::Ray_3 + \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` \sa `Kernel::ConstructDirection_3` @@ -492,7 +507,8 @@ class Ray_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Segment_2` + \cgalHasModelsBegin CGAL::Segment_2 + \cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` \sa `Kernel::ComputeSquaredDistance_2` @@ -526,7 +542,8 @@ class Segment_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Segment_3` + \cgalHasModelsBegin CGAL::Segment_3 + \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` \sa `Kernel::ComputeSquaredLength_3` @@ -556,7 +573,8 @@ class Segment_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Sphere_3` + \cgalHasModelsBegin CGAL::Sphere_3 + \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` \sa `Kernel::ComputeSquaredRadius_3` @@ -586,7 +604,8 @@ class Sphere_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Tetrahedron_3` + \cgalHasModelsBegin CGAL::Tetrahedron_3 + \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` \sa `Kernel::ComputeVolume_3` @@ -617,7 +636,8 @@ class Tetrahedron_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Triangle_2` + \cgalHasModelsBegin CGAL::Triangle_2 + \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` \sa `Kernel::ComputeArea_2` @@ -650,7 +670,8 @@ class Triangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Triangle_3` + \cgalHasModelsBegin CGAL::Triangle_3 + \cgalHasModelsEnd \sa `Kernel::ComputeSquaredArea_3` \sa `Kernel::ConstructCentroid_3` @@ -675,7 +696,8 @@ class Triangle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModel `CGAL::Vector_2` + \cgalHasModelsBegin CGAL::Vector_2 + \cgalHasModelsEnd \sa `Kernel::ComputeDeterminant_2` \sa `Kernel::ComputeScalarProduct_2` @@ -708,7 +730,8 @@ A type representing vectors in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Vector_3` +\cgalHasModelsBegin CGAL::Vector_3 +\cgalHasModelsEnd \sa `Kernel::CompareDihedralAngle_3` \sa `Kernel::ComputeDeterminant_3` @@ -744,7 +767,8 @@ A type representing weighted points in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Weighted_point_2` +\cgalHasModelsBegin CGAL::Weighted_point_2 +\cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_2` \sa `Kernel::ComputeWeight_2` @@ -771,7 +795,8 @@ A type representing weighted points in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Weighted_point_3` +\cgalHasModelsBegin CGAL::Weighted_point_3 +\cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_3` \sa `Kernel::ComputeWeight_3` diff --git a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h index 3ff7dcfc1336..ad4a0782765f 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h +++ b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h @@ -20,14 +20,15 @@ `Construct_`. If the result type is a number type, the name is prefixed by `Compute_`. When the result type is not determined, no prefix is used. - \cgalHasModel `CGAL::Cartesian` - \cgalHasModel `CGAL::Homogeneous` - \cgalHasModel `CGAL::Simple_cartesian` - \cgalHasModel `CGAL::Simple_homogeneous` - \cgalHasModel `CGAL::Filtered_kernel` - \cgalHasModel `CGAL::Exact_predicates_exact_constructions_kernel` - \cgalHasModel `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` - \cgalHasModel `CGAL::Exact_predicates_inexact_constructions_kernel` + \cgalHasModelsBegin galHasModel `CGAL::Cartesian + \cgalHasModels CGAL::Homogeneous + \cgalHasModels CGAL::Simple_cartesian + \cgalHasModels CGAL::Simple_homogeneous + \cgalHasModels CGAL::Filtered_kernel + \cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel + \cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt + \cgalHasModels CGAL::Exact_predicates_inexact_constructions_kernel + \cgalHasModelsEnd \sa `Kernel_d` \sa `CGAL::Ambient_dimension` diff --git a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h index 57cfbc7d0584..63e05367bafc 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h @@ -8,8 +8,9 @@ general kernel concept. It adds 2 functors, the meaning of which would be unclear in kernels of fixed dimension. \cgalRefines{Kernel_d} -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsEnd */ class KernelWithLifting_d { public: diff --git a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h index 6b1378e66ae9..a56284feab8a 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h @@ -18,10 +18,11 @@ predicates. The former replace constructors of the kernel classes and constructive procedures in the kernel. There are also function objects replacing operators, especially for equality testing. -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModels CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModelsEnd */ class Kernel_d { public: diff --git a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h index 932880c6f89c..f8a25811d421 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h @@ -13,8 +13,9 @@ correct. For example, if the linear system solver declares a linear system \f$ A x = b\f$ unsolvable it also returns a vector \f$ c\f$ such that \f$ c^T A = 0\f$ and \f$ c^T b \neq 0\f$. -\cgalHasModel `CGAL::Linear_algebraHd` -\cgalHasModel `CGAL::Linear_algebraCd` +\cgalHasModelsBegin CGAL::Linear_algebraHd +\cgalHasModels CGAL::Linear_algebraCd +\cgalHasModelsEnd */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h index 4e7e19343b9e..6f97471a99c4 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h @@ -7,7 +7,7 @@ The concept `CellAttributeWithPoint` is a refinement of the `CellAttribute` conc \cgalRefines{CellAttribute} -\cgalHasModel \link CGAL::Cell_attribute_with_point `CGAL::Cell_attribute_with_point`\endlink +\cgalHasModelsBare{\link CGAL::Cell_attribute_with_point `CGAL::Cell_attribute_with_point`\endlink} \sa `LinearCellComplexItems` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h index c64aa00f4ff9..740405fc5b3c 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h @@ -7,8 +7,8 @@ The concept `LinearCellComplex` represents a linear cell complex in dimension `d \cgalRefines{GenericMap} -\cgalHasModel \link CGAL::Linear_cell_complex_for_combinatorial_map `CGAL::Linear_cell_complex_for_combinatorial_map`\endlink -\cgalHasModel \link CGAL::Linear_cell_complex_for_generalized_map `CGAL::Linear_cell_complex_for_generalized_map`\endlink +\cgalHasModelsBare{\link CGAL::Linear_cell_complex_for_combinatorial_map `CGAL::Linear_cell_complex_for_combinatorial_map`\endlink\n + \link CGAL::Linear_cell_complex_for_generalized_map `CGAL::Linear_cell_complex_for_generalized_map`\endlink} \sa `LinearCellComplexItems` \sa `LinearCellComplexTraits` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h index caf8d2608952..25df3bed1833 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h @@ -9,7 +9,8 @@ The concept `LinearCellComplexItems` refines the concept of `GenericMapItems` by The first type in `Attributes` tuple must be a model of the `CellAttributeWithPoint` concept. -\cgalHasModel `CGAL::Linear_cell_complex_min_items` +\cgalHasModelsBegin CGAL::Linear_cell_complex_min_items +\cgalHasModelsEnd \sa `LinearCellComplex` \sa `CellAttributeWithPoint` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h index ef4c0f72cf0a..cb7de2d83823 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h @@ -5,7 +5,7 @@ Required types and functors for the `LinearCellComplexTraits` concept. This geometric traits concept is used in the \link CGAL::Linear_cell_complex_for_combinatorial_map `Linear_cell_complex_for_combinatorial_map`\endlink and \link CGAL::Linear_cell_complex_for_generalized_map `Linear_cell_complex_for_generalized_map`\endlink classes. -\cgalHasModel \link CGAL::Linear_cell_complex_traits `CGAL::Linear_cell_complex_traits`\endlink +\cgalHasModelsBare{\link CGAL::Linear_cell_complex_traits `CGAL::Linear_cell_complex_traits`\endlink} \sa `CGAL::Linear_cell_complex_for_combinatorial_map` \sa `CGAL::Linear_cell_complex_for_generalized_map` diff --git a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h index 287afa307588..37512a501ece 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h +++ b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h @@ -8,7 +8,8 @@ A class `BasicMatrix` has to provide the following types and operations in order to be a model for `BasicMatrix`. -\cgalHasModel `CGAL::Dynamic_matrix` +\cgalHasModelsBegin CGAL::Dynamic_matrix +\cgalHasModelsEnd \sa `MonotoneMatrixSearchTraits` \sa `SortedMatrixSearchTraits` diff --git a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h index 483a45b68a01..3f44b807ffd0 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h @@ -21,7 +21,8 @@ add most of the functionality described above to arbitrary matrix classes.
    -\cgalHasModel `CGAL::Dynamic_matrix` +\cgalHasModelsBegin CGAL::Dynamic_matrix +\cgalHasModelsEnd \sa `CGAL::monotone_matrix_search()` diff --git a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h index ad49f24d3496..e96a49bfdbeb 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h @@ -8,7 +8,8 @@ needed to compute the smallest entry in a set of sorted matrices that fulfills a certain feasibility criterion using the function `CGAL::sorted_matrix_search`. -\cgalHasModel `CGAL::Sorted_matrix_search_traits_adaptor` +\cgalHasModelsBegin CGAL::Sorted_matrix_search_traits_adaptor +\cgalHasModelsEnd \sa `CGAL::sorted_matrix_search()` \sa `BasicMatrix` diff --git a/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h b/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h index 04cebff70d04..745c85b0d9f6 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h @@ -17,8 +17,8 @@ points on constrained edges. \cgalRefines{DelaunayTriangulationTraits_2} -\cgalHasModel Any model of `Kernel` concept. In particular, all \cgal kernels -\cgalHasModel `Projection_traits_xy_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 +\cgalHasModelsEnd */ diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h index 4c9bd5eec8b9..abe11ca79a86 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h @@ -13,7 +13,8 @@ meshing domain or not. \cgalRefines{ConstrainedTriangulationFaceBase_2} -\cgalHasModel `CGAL::Delaunay_mesh_face_base_2` +\cgalHasModelsBegin CGAL::Delaunay_mesh_face_base_2 +\cgalHasModelsEnd */ diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h index 042980a96840..25d8388d962a 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h @@ -12,8 +12,8 @@ object `Construct_circumcenter_2`. \cgalRefines{ConformingDelaunayTriangulationTraits_2} -\cgalHasModel Any model of the `Kernel` concept. In particular, all \cgal kernels -\cgalHasModel `CGAL::Projection_traits_xy_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 +\cgalHasModelsEnd */ diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h index 9385dae29ae3..341888021197 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h @@ -13,7 +13,8 @@ the mesh density everywhere while modifying the mesh. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Delaunay_mesh_vertex_base_2` +\cgalHasModelsBegin CGAL::Delaunay_mesh_vertex_base_2 +\cgalHasModelsEnd */ diff --git a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h index c7ff08ec1005..929119fb29af 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h @@ -37,8 +37,9 @@ comparable as the meshing algorithm will order bad triangles by quality, to split those with smallest quality first. The predicate `Is_bad` computes the quality of the triangle as a by-product. -\cgalHasModel `CGAL::Delaunay_mesh_criteria_2` -\cgalHasModel `CGAL::Delaunay_mesh_size_criteria_2` +\cgalHasModelsBegin CGAL::Delaunay_mesh_criteria_2 +\cgalHasModels CGAL::Delaunay_mesh_size_criteria_2 +\cgalHasModelsEnd */ diff --git a/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h index 8d6b076a3efa..0ca302d56fb5 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h @@ -16,7 +16,7 @@ function from \f$ \mathbb{R}^3\f$ to \f$ \mathbb{R}\f$), the do-intersect predic is computed by evaluations of the function values at both end points of the segment. -\cgalHasModel Any \cgal Kernel. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `ImplicitSurfaceTraits_3` \sa `IntersectionGeometricTraits_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h index a1b35060f858..d5637c9b8e15 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h @@ -9,7 +9,7 @@ forming its boundary. The concept `IntersectionGeometricTraits_3` mainly provides the detection and construction of intersections between segments and triangles. -\cgalHasModel All models of the `Kernel` concept. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `BisectionGeometricTraits_3` \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h index 028d9e70d9fe..7ad4c56ad1cd 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h @@ -43,8 +43,9 @@ each cell (see below). \cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible} -\cgalHasModel `CGAL::Compact_mesh_cell_base_3` -\cgalHasModel `CGAL::Mesh_cell_base_3` +\cgalHasModelsBegin CGAL::Compact_mesh_cell_base_3 +\cgalHasModels CGAL::Mesh_cell_base_3 +\cgalHasModelsEnd \sa `CGAL::make_mesh_3()` \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h index d3b0b83f0a64..4691571e9f1b 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h @@ -9,7 +9,8 @@ that concern either mesh tetrahedra or surface facets. The concept `MeshCellCriteria_3` describes the types that handle the refinement criteria for mesh tetrahedra. -\cgalHasModel `CGAL::Mesh_cell_criteria_3` +\cgalHasModelsBegin CGAL::Mesh_cell_criteria_3 +\cgalHasModelsEnd \sa `MeshEdgeCriteria_3` \sa `MeshFacetCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h index c53644cb36fc..e1570416dd7f 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h @@ -14,7 +14,8 @@ that describes the requirements, in terms of sizing, for the discretization of t \cgalRefines{MeshCriteria_3} -\cgalHasModel `CGAL::Mesh_criteria_3` +\cgalHasModelsBegin CGAL::Mesh_criteria_3 +\cgalHasModelsEnd \sa `MeshEdgeCriteria_3` \sa `MeshFacetCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h index ea4a1f33ea38..189afcbffcb9 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h @@ -12,7 +12,8 @@ while the refinement criteria for surface facets are described by the concept `MeshFacetCriteria_3`. The concept `MeshCriteria_3` encapsulates these concepts. -\cgalHasModel `CGAL::Mesh_criteria_3` +\cgalHasModelsBegin CGAL::Mesh_criteria_3 +\cgalHasModelsEnd \sa `MeshFacetCriteria_3` \sa `MeshCellCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h index 644a3a46046b..fbb2f2cc8eed 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h @@ -5,7 +5,8 @@ The concept `MeshDomainField_3` describes a scalar field which could be queried at any point of the space. -\cgalHasModel `CGAL::Mesh_constant_domain_field_3` +\cgalHasModelsBegin CGAL::Mesh_constant_domain_field_3 +\cgalHasModelsEnd \sa `MeshDomain_3` \sa `MeshDomainWithFeatures_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h index 18e97b9a2753..80df66b599ad 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h @@ -17,8 +17,9 @@ between two ordered points on the same curve. \cgalRefines{MeshDomain_3} -\cgalHasModel `CGAL::Mesh_domain_with_polyline_features_3` -\cgalHasModel `CGAL::Polyhedral_mesh_domain_with_features_3` +\cgalHasModelsBegin CGAL::Mesh_domain_with_polyline_features_3 +\cgalHasModels CGAL::Polyhedral_mesh_domain_with_features_3 +\cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h index 240f9b0f1fbf..56c6ed59ad1c 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h @@ -29,8 +29,9 @@ A segment, ray or line is said to intersect properly the domain boundary if it includes points which are strictly inside and strictly outside the domain (resp. the subdomain). -\cgalHasModel `CGAL::Polyhedral_mesh_domain_3` -\cgalHasModel `CGAL::Labeled_mesh_domain_3` +\cgalHasModelsBegin CGAL::Polyhedral_mesh_domain_3 +\cgalHasModels CGAL::Labeled_mesh_domain_3 +\cgalHasModelsEnd \sa `MeshVertexBase_3` \sa `MeshCellBase_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h index 4c044751069f..41b3bab44515 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h @@ -7,7 +7,8 @@ the 1-dimensional features of the domain. It provides an upper bound for the distance between two protecting ball centers that are consecutive on a 1-feature. -\cgalHasModel `CGAL::Mesh_edge_criteria_3` +\cgalHasModelsBegin CGAL::Mesh_edge_criteria_3 +\cgalHasModelsEnd \sa `MeshCellCriteria_3` \sa `MeshFacetCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h index 325dedeff053..f8bad1f29ccf 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h @@ -9,7 +9,8 @@ that concern either mesh tetrahedra or surface facets. The concept `MeshFacetCriteria_3` describes the types that handle the refinement criteria for surface facets. -\cgalHasModel `CGAL::Mesh_facet_criteria_3` +\cgalHasModelsBegin CGAL::Mesh_facet_criteria_3 +\cgalHasModelsEnd \sa `MeshCellCriteria_3` \sa `MeshEdgeCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h index bfe6e4b8d982..ce8469eb8aa8 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h @@ -6,7 +6,7 @@ The concept `MeshPolyline_3` implements a container of points designed to repres Types and functions provided in this concept are such as standard template library containers are natural models of this concept. -\cgalHasModel `std::vector` for any Kernel of \cgal is a natural model of this concept. +\cgalHasModelsBare{`std::vector` for any Kernel of \cgal is a natural model of this concept.} \sa `CGAL::Mesh_domain_with_polyline_features_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h index 99b7a9d82707..3e1a8cf734d0 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h @@ -9,7 +9,7 @@ a mesh generation process. \cgalRefines{RegularTriangulationTraits_3} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} In addition to the requirements described for the traits class RegularTriangulationTraits_3, the geometric traits class of a diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h index 4739741b01c7..f4f2ff9d9b84 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h @@ -22,7 +22,8 @@ each cell (see below). \cgalRefines{SimplicialMeshVertexBase_3,RegularTriangulationVertexBase_3,SurfaceMeshVertexBase_3} -\cgalHasModel `CGAL::Mesh_vertex_base_3` +\cgalHasModelsBegin CGAL::Mesh_vertex_base_3 +\cgalHasModelsEnd \sa `CGAL::make_mesh_3()` \sa `CGAL::refine_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h index 03f9ff4880ad..1d3a376d3de1 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h @@ -5,7 +5,8 @@ The concept `TriangleAccessor_3` represents an accessor to a triangulated polyhedral surface, intersection free and without boundaries. -\cgalHasModel `CGAL::Triangle_accessor_3,K>` +\cgalHasModelsBegin CGAL::Triangle_accessor_3,K> +\cgalHasModelsEnd \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::make_mesh_3()` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h index 20b4cf23fb72..0f81aaa6a90e 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h @@ -6,11 +6,12 @@ A model of the `PolygonConvexDecomposition_2` concept is capable of decomposing an input polygon \f$ P\f$ into a set of convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \f$ \cup_{i=1}^{k}{P_k} = P\f$. -\cgalHasModel `CGAL::Small_side_angle_bisector_decomposition_2` -\cgalHasModel `CGAL::Optimal_convex_decomposition_2` -\cgalHasModel `CGAL::Hertel_Mehlhorn_convex_decomposition_2` -\cgalHasModel `CGAL::Greene_convex_decomposition_2` -\cgalHasModel `CGAL::Polygon_nop_decomposition_2` +\cgalHasModelsBegin CGAL::Small_side_angle_bisector_decomposition_2 +\cgalHasModels CGAL::Optimal_convex_decomposition_2 +\cgalHasModels CGAL::Hertel_Mehlhorn_convex_decomposition_2 +\cgalHasModels CGAL::Greene_convex_decomposition_2 +\cgalHasModels CGAL::Polygon_nop_decomposition_2 +\cgalHasModelsEnd */ diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h index 7c27e91a6c80..64b8d0995076 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h @@ -9,8 +9,9 @@ convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \cgalRefines{PolygonConvexDecomposition_2} -\cgalHasModel `CGAL::Polygon_vertical_decomposition_2` -\cgalHasModel `CGAL::Polygon_triangulation_decomposition_2` +\cgalHasModelsBegin CGAL::Polygon_vertical_decomposition_2 +\cgalHasModels CGAL::Polygon_triangulation_decomposition_2 +\cgalHasModelsEnd */ diff --git a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h index c315deb05fd8..1bf64f2a9c94 100644 --- a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h +++ b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h @@ -9,7 +9,8 @@ function object. It maps objects of its domain type `Key` to the integral image type `std::size_t`. The image values have to be unique for all keys in the domain type `Key`. -\cgalHasModel `CGAL::Handle_hash_function` +\cgalHasModelsBegin CGAL::Handle_hash_function +\cgalHasModelsEnd \sa `CGAL::Unique_hash_map` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h index 022ed5c526bd..0e0467a9f390 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h @@ -8,7 +8,8 @@ In case this associated type is a model of `Modularizable`, this is indicated by Boolean tag `ModularTraits::Is_modularizable`. The mapping into the `Residue_type` is provided by the functor `ModularTraits::Modular_image`. -\cgalHasModel CGAL::Modular_traits +\cgalHasModelsBegin CGAL::Modular_traits +\cgalHasModelsEnd \sa `CGAL::Residue` \sa `Modularizable` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h index 0001b5b400b2..8db45a2f4287 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h @@ -18,18 +18,20 @@ of denominator, are not `Modularizable`. This is due to the fact that the denominator may be zero modulo the prime, which can not be represented. -\cgalHasModel `int` -\cgalHasModel `long` -\cgalHasModel `CORE::BigInt` -\cgalHasModel `CGAL::Gmpz` -\cgalHasModel `leda_integer` -\cgalHasModel `mpz_class` +\cgalHasModelsBegin int +\cgalHasModels long +\cgalHasModels CORE::BigInt +\cgalHasModels CGAL::Gmpz +\cgalHasModels leda_integer +\cgalHasModels mpz_class +\cgalHasModelsEnd The following types are `Modularizable` iff their template arguments are. -\cgalHasModel `CGAL::Lazy_exact_nt` -\cgalHasModel `CGAL::Sqrt_extension` -\cgalHasModel `CGAL::Polynomial` +\cgalHasModelsBegin CGAL::Lazy_exact_nt +\cgalHasModels CGAL::Sqrt_extension +\cgalHasModels CGAL::Polynomial +\cgalHasModelsEnd \sa `CGAL::Residue` \sa `CGAL::Modular_traits` diff --git a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h index 8d5e82f7fed8..7161d6725e76 100644 --- a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h +++ b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h @@ -38,9 +38,10 @@ functionality for changing between standard affine and extended geometry. At the same time it provides extensible geometric primitives on the extended geometric objects. -\cgalHasModel `CGAL::Extended_cartesian` -\cgalHasModel `CGAL::Extended_homogeneous` -\cgalHasModel `CGAL::Filtered_extended_homogeneous` +\cgalHasModelsBegin CGAL::Extended_cartesian +\cgalHasModels CGAL::Extended_homogeneous +\cgalHasModels CGAL::Filtered_extended_homogeneous +\cgalHasModelsEnd */ diff --git a/Number_types/doc/Number_types/Concepts/RootOf_2.h b/Number_types/doc/Number_types/Concepts/RootOf_2.h index a772693794da..c29f30b3ab2b 100644 --- a/Number_types/doc/Number_types/Concepts/RootOf_2.h +++ b/Number_types/doc/Number_types/Concepts/RootOf_2.h @@ -30,8 +30,8 @@ special construction for extensions of degree 2: \cgalRefines{DefaultConstructible,CopyConstructible,FromIntConstructible, ImplicitInteroperable with `RT`,ImplicitInteroperable with `FT`} -\cgalHasModel `double` (not exact) -\cgalHasModel `CGAL::Sqrt_extension` +\cgalHasModelsBareBegin{`double` (not exact)} CGAL::Sqrt_extension +\cgalHasModelsEnd \sa `CGAL::make_root_of_2` \sa `CGAL::make_sqrt` diff --git a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h index dceb2345f0cd..fad3d71782a0 100644 --- a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h +++ b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h @@ -8,7 +8,8 @@ a 3x3 matrix type. \cgalRefines{Kernel} -\cgalHasModel `CGAL::Oriented_bounding_box_traits_3` +\cgalHasModelsBegin CGAL::Oriented_bounding_box_traits_3 +\cgalHasModelsEnd */ class OrientedBoundingBoxTraits_3 diff --git a/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h b/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h index fe99dd293c4c..39b2c65b4e15 100644 --- a/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h +++ b/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h @@ -8,8 +8,8 @@ for the traits class of `CGAL::Optimal_transportation_reconstruction_2`. \cgalRefines{DelaunayTriangulationTraits_2} -\cgalHasModel Any model of the `Kernel` concept -\cgalHasModel `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended) +\cgalHasModelsBare{All models of the \cgal concept `Kernel`, + `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended)} \sa `CGAL::Optimal_transportation_reconstruction_2` diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h index eac6e2e914de..8b6e0e06631e 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h @@ -5,9 +5,10 @@ The concept `OrthtreeTraits` defines the requirements for the template parameter of the `CGAL::Orthtree` class. - \cgalHasModel `CGAL::Orthtree_traits_2` - \cgalHasModel `CGAL::Orthtree_traits_3` - \cgalHasModel `CGAL::Orthtree_traits_d` + \cgalHasModelsBegin galHasModel `CGAL::Orthtree_traits_2 + \cgalHasModels CGAL::Orthtree_traits_3 + \cgalHasModels CGAL::Orthtree_traits_d + \cgalHasModelsEnd */ class OrthtreeTraits { diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h index d763be714e54..c03e9deb2070 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h @@ -9,10 +9,11 @@ A traversal is used to iterate on a tree with a user-selected order (e.g. preorder, postorder). - \cgalHasModel `CGAL::Orthtrees::Preorder_traversal` - \cgalHasModel `CGAL::Orthtrees::Postorder_traversal` - \cgalHasModel `CGAL::Orthtrees::Leaves_traversal` - \cgalHasModel `CGAL::Orthtrees::Level_traversal` + \cgalHasModelsBegin galHasModel `CGAL::Orthtrees::Preorder_traversal + \cgalHasModels CGAL::Orthtrees::Postorder_traversal + \cgalHasModels CGAL::Orthtrees::Leaves_traversal + \cgalHasModels CGAL::Orthtrees::Level_traversal + \cgalHasModelsEnd */ class OrthtreeTraversal { diff --git a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h index c1919ce24449..ff7c9417c08b 100644 --- a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h @@ -6,7 +6,8 @@ Requirements of a traits class used by `convex_partition_is_valid_2` for testing the validity of a convex partition of a polygon. -\cgalHasModel `CGAL::Partition_traits_2` +\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::greene_approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h index d677751f991f..0c0d7e3fc974 100644 --- a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h @@ -6,8 +6,9 @@ Requirements of a traits class to be used with the function `is_y_monotone_2()` that tests whether a sequence of 2D points defines a \f$ y\f$-monotone polygon or not. -\cgalHasModel `CGAL::Partition_traits_2` -\cgalHasModel `CGAL::Kernel_traits_2` +\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModels CGAL::Kernel_traits_2 +\cgalHasModelsEnd \sa `CGAL::Is_y_monotone_2` \sa `CGAL::y_monotone_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h index 3f1e4722dc2b..85676075bb4e 100644 --- a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h @@ -8,7 +8,8 @@ an optimal convex partition of a polygon. \cgalRefines{PartitionTraits_2} -\cgalHasModel `CGAL::Partition_traits_2` +\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsEnd \sa `CGAL::convex_partition_is_valid_2()` \sa `CGAL::Partition_is_valid_traits_2` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h index 31f7e3c0136f..b91ad8109352 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h @@ -14,7 +14,8 @@ function `CGAL::is_convex_2()` and the concept `YMonotonePartitionTraits_2` for the additional requirements for testing for convexity and \f$ y\f$-monotonicity, respectively. -\cgalHasModel `CGAL::Partition_is_valid_traits_2` +\cgalHasModelsBegin CGAL::Partition_is_valid_traits_2 +\cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::greene_approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h index c4c3827f6642..2ad93228b1bf 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h @@ -8,7 +8,8 @@ common to all traits classes. The concept `PartitionTraits_2` defines this common set of requirements. -\cgalHasModel `CGAL::Partition_traits_2` +\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::greene_approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h index b0e5ff298d14..ab72c01a9f09 100644 --- a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h +++ b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h @@ -6,8 +6,9 @@ Function object that determines if a sequence of points represents a valid partition polygon or not, where "valid" can assume any of several meanings (e.g., convex or \f$ y\f$-monotone). -\cgalHasModel `CGAL::Is_convex_2` -\cgalHasModel `CGAL::Is_y_monotone_2` +\cgalHasModelsBegin CGAL::Is_convex_2 +\cgalHasModels CGAL::Is_y_monotone_2 +\cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::convex_partition_is_valid_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h index a7500c62d6bf..6212b11620a4 100644 --- a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h @@ -6,7 +6,8 @@ Requirements of a traits class that is used by `y_monotone_partition_is_valid_2` for testing the validity of a \f$ y\f$-monotone partition of a polygon. -\cgalHasModel `CGAL::Partition_traits_2` +\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsEnd \sa `CGAL::partition_is_valid_2()` \sa `CGAL::y_monotone_partition_2()` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h index 402a3eca8062..bda0b95ab293 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h @@ -27,7 +27,8 @@ dual functions are called. The additional predicate type `::Periodic_2DelaunayTriangulationTraits_2::Compare_distance_2` is required if calls to `nearest_vertex(..)` are issued. -\cgalHasModel `CGAL::Periodic_2_Delaunay_triangulation_traits_2` +\cgalHasModelsBegin CGAL::Periodic_2_Delaunay_triangulation_traits_2 +\cgalHasModelsEnd \sa `DelaunayTriangulationTraits_2` */ diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h index c3d9e3b3c7b9..56d28d5a2171 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h @@ -7,7 +7,8 @@ The concept `Periodic_2Offset_2` describes a two-/dimensional integer vector with some specialized access functions and operations. -\cgalHasModel `CGAL::Periodic_2_offset_2` +\cgalHasModelsBegin CGAL::Periodic_2_offset_2 +\cgalHasModelsEnd \sa `Periodic_2TriangulationTraits_2` \sa `Periodic_2DelaunayTriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h index 7d7771d981ee..96769827f334 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h @@ -13,7 +13,8 @@ vertex \f$ i\f$. \cgalRefines{TriangulationFaceBase_2} -\cgalHasModel `CGAL::Periodic_2_triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Periodic_2_triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `TriangulationFaceBase_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h index 71bfd55b2688..58dad3ed62d0 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h @@ -24,7 +24,8 @@ In addition to the requirements described for the traits class Periodic triangulation must fulfill the following requirements: -\cgalHasModel `CGAL::Periodic_2_triangulation_traits_2` +\cgalHasModelsBegin CGAL::Periodic_2_triangulation_traits_2 +\cgalHasModelsEnd \sa `TriangulationTraits_2` \sa `CGAL::Periodic_2_triangulation_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h index 26c88f7b1579..33d799fec248 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h @@ -16,7 +16,8 @@ The storage of the offset is only needed when a triangulation is copied. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel` CGAL::Periodic_2_triangulation_vertex_base_2` +\cgalHasModelsBegin CGAL::Periodic_2_triangulation_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `TriangulationVertexBase_2` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h index 51a0f2dff739..2794a7f365ae 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h @@ -22,8 +22,8 @@ Wrapping any model of `Periodic_3MeshDomain_3` with the class `CGAL::Mesh_domain_with_polyline_features_3` gives a model of `Periodic_3MeshDomainWithFeatures_3`. -\cgalHasModel `CGAL::Mesh_domain_with_polyline_features_3< - CGAL::Labeled_mesh_domain_3 >` +\cgalHasModelsBegin CGAL::Mesh_domain_with_polyline_features_3 > +\cgalHasModelsEnd \sa `CGAL::Periodic_3_function_wrapper` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h index d646476f1398..63170e01edb0 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h @@ -20,7 +20,8 @@ The class `CGAL::Labeled_mesh_domain_3` paired with a periodic labeling fun is a model of this concept. It is possible to create artificially periodic functions through the class `CGAL::Periodic_3_function_wrapper`. -\cgalHasModel `CGAL::Labeled_mesh_domain_3` +\cgalHasModelsBegin CGAL::Labeled_mesh_domain_3 +\cgalHasModelsEnd \sa `CGAL::Labeled_mesh_domain_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h index 9ca96674cc79..1d72f2281804 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h @@ -15,7 +15,8 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,DelaunayTriangulationTraits_3} -\cgalHasModel `CGAL::Periodic_3_Delaunay_triangulation_traits_3` +\cgalHasModelsBegin CGAL::Periodic_3_Delaunay_triangulation_traits_3 +\cgalHasModelsEnd In addition to the requirements described by the concepts `Periodic_3TriangulationTraits_3` and `DelaunayTriangulationTraits_3`, diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h index 1896b2291dc8..b5a467b4cd82 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h @@ -6,7 +6,8 @@ The concept `Periodic_3Offset_3` describes a three-dimensional integer vector with some specialized access functions and operations. -\cgalHasModel `CGAL::Periodic_3_offset_3` +\cgalHasModelsBegin CGAL::Periodic_3_offset_3 +\cgalHasModelsEnd \sa `Periodic_3TriangulationTraits_3` \sa `Periodic_3DelaunayTriangulationTraits_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h index 803505e302eb..29c9fae1dc68 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h @@ -5,10 +5,9 @@ \cgalRefines{RegularTriangulationCellBase_3,Periodic_3TriangulationDSCellBase_3} -\cgalHasModel `CGAL::Regular_triangulation_cell_base_3 >` -\cgalHasModel `CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 >` +\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_3 > +\cgalHasModels CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 > +\cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the traits class used in `CGAL::Periodic_3_regular_triangulation_3`. diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h index 762aceede946..8f5ce76dab56 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h @@ -5,8 +5,8 @@ \cgalRefines{RegularTriangulationVertexBase_3,Periodic_3TriangulationDSVertexBase_3} -\cgalHasModel `CGAL::Regular_triangulation_vertex_base_3 >` +\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_3 > +\cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the traits class used in `CGAL::Periodic_3_regular_triangulation_3`. diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h index c84d4e8885c1..c128b08f82e9 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h @@ -15,7 +15,8 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,RegularTriangulationTraits_3} -\cgalHasModel `CGAL::Periodic_3_regular_triangulation_traits_3` +\cgalHasModelsBegin CGAL::Periodic_3_regular_triangulation_traits_3 +\cgalHasModelsEnd In addition to the requirements described for the traits class RegularTriangulationTraits_3, the geometric traits class of a diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h index 048264c8c7b1..9f575b848695 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h @@ -18,7 +18,8 @@ does not contain any information. \cgalRefines{TriangulationDSCellBase_3} -\cgalHasModel `CGAL::Periodic_3_triangulation_ds_cell_base_3` +\cgalHasModelsBegin CGAL::Periodic_3_triangulation_ds_cell_base_3 +\cgalHasModelsEnd \sa `TriangulationDataStructure_3` \sa `TriangulationDSCellBase_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h index cc3de413a708..14b032fc1bc0 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h @@ -12,7 +12,8 @@ a vertex provides access to one of its incident cells through a handle. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModel `CGAL::Periodic_3_triangulation_ds_vertex_base_3` +\cgalHasModelsBegin CGAL::Periodic_3_triangulation_ds_vertex_base_3 +\cgalHasModelsEnd \sa `TriangulationDataStructure_3` \sa `TriangulationDSVertexBase_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h index f786b27ea94f..ace2ebb8199b 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h @@ -14,7 +14,8 @@ functor the version without offsets. \cgalRefines{TriangulationTraits_3} -\cgalHasModel `CGAL::Periodic_3_triangulation_traits_3` +\cgalHasModelsBegin CGAL::Periodic_3_triangulation_traits_3 +\cgalHasModelsEnd \sa `Periodic_3DelaunayTriangulationTraits_3` \sa `Periodic_3RegularTriangulationTraits_3` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h index 6628fffd89f5..7532e1b0797d 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h @@ -12,7 +12,8 @@ to `Periodic_4HyperbolicTriangulationTraits_2` that needs to be fulfilled by any class used to instantiate the first template parameter of the class `CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_2`. -\cgalHasModel `CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2` +\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2 +\cgalHasModelsEnd */ diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h index 959e3c3a25e9..9766710af1ed 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h @@ -20,7 +20,8 @@ corresponding vertex produces the canonical representative of the face in the hy Hyperbolic translations are represented by a nested type which is provided by the concept `Periodic_4HyperbolicDelaunayTriangulationTraits_2`. -\cgalHasModel `CGAL::Periodic_4_hyperbolic_triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `Periodic_4HyperbolicTriangulationVertexBase_2` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h index 3221dc57a11e..eb8bfe0b89dd 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h @@ -14,7 +14,8 @@ translation during the insertion process. A boolean flag indicates whether the face stores a translation or not. The value of the flag is automatically set when storing or removing a translation. -\cgalHasModel `CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2` +\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `Periodic_4HyperbolicTriangulationFaceBase_2` diff --git a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h index 97517ca4a3d1..f17b26f951ae 100644 --- a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h +++ b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h @@ -8,8 +8,9 @@ * represents the outer boundary and the general polygons that represent * the holes. * - * \cgalHasModel `CGAL::General_polygon_with_holes_2` - * \cgalHasModel `CGAL::Polygon_with_holes_2` + * \cgalHasModelsBegin CGAL::General_polygon_with_holes_2 + * \cgalHasModels CGAL::Polygon_with_holes_2 + * \cgalHasModelsEnd */ class GeneralPolygonWithHoles_2 { diff --git a/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h b/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h index 674a57e4374b..068194985bce 100644 --- a/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h +++ b/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h @@ -14,10 +14,10 @@ and refer to the description of the kernel concept for details. \cgalRefines{DefaultConstructible,CopyConstructable} -\cgalHasModel The kernels supplied by \cgal are models of `PolygonTraits_2`. -\cgalHasModel `CGAL::Projection_traits_xy_3` -\cgalHasModel `CGAL::Projection_traits_yz_3` -\cgalHasModel `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{The kernels supplied by \cgal are models of `PolygonTraits_2`} CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd \sa `CGAL::Polygon_2` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h index a46ff1fe7a24..facce5d714b0 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h @@ -6,7 +6,8 @@ /// the creation of new faces and new edges. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModel `CGAL::Polygon_mesh_processing::Corefinement::Default_visitor`. +/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Corefinement::Default_visitor +/// \cgalHasModelsEnd class PMPCorefinementVisitor{ public: diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h index 61575e3ff892..ec9839512208 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h @@ -7,7 +7,7 @@ /// `sample_triangle_mesh()`, `approximate_Hausdorff_distance()` and `max_distance_to_triangle_mesh()` /// /// \cgalRefines{AABBGeomTraits,SpatialSortingTraits_3} -/// \cgalHasModel Any 3D Kernel is a model of this concept. +/// \cgalHasModelsBare{Any 3D Kernel is a model of this concept} class PMPDistanceTraits{ public: diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h index 9ef06093cb22..11af2abad0fd 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h @@ -9,7 +9,8 @@ /// If that fails, it uses an algorithm with cubic running time (*cubic phase*). /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModel `CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor`. +/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor +/// \cgalHasModelsEnd class PMPHolefillingVisitor{ public: diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h index a4efc83d7039..d0597a5c90e5 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h @@ -7,7 +7,8 @@ /// during the orientation process. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModel `CGAL::Polygon_mesh_processing::Default_orientation_visitor`. +/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Default_orientation_visitor +/// \cgalHasModelsEnd class PMPPolygonSoupOrientationVisitor{ public: diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h index f3fdef28beba..a8c885e7b13d 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h @@ -6,7 +6,8 @@ /// the creation of new faces. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModel `CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor`. +/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor +/// \cgalHasModelsEnd class PMPTriangulateFaceVisitor { diff --git a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h index 62c23598c49f..c4b306a73a23 100644 --- a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h +++ b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h @@ -13,8 +13,9 @@ polyhedral surface renames faces to facets. \cgalRefines{HalfedgeDSItems} -\cgalHasModel `CGAL::Polyhedron_items_3` -\cgalHasModel `CGAL::Polyhedron_min_items_3` +\cgalHasModelsBegin CGAL::Polyhedron_items_3 +\cgalHasModels CGAL::Polyhedron_min_items_3 +\cgalHasModelsEnd \sa `CGAL::Polyhedron_3` \sa `HalfedgeDSItems` diff --git a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h index 6849eb7f1750..5dc824c7d553 100644 --- a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h +++ b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h @@ -10,9 +10,9 @@ and can be used directly as template argument. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModel `CGAL::Polyhedron_traits_3` -\cgalHasModel `CGAL::Polyhedron_traits_with_normals_3` -\cgalHasModel All models of the `Kernel` concept, e.g., `CGAL::Simple_cartesian` +\cgalHasModelsBareBegin{All models of the `Kernel` concept, e.g. `CGAL::Simple_cartesian`} CGAL::Polyhedron_traits_3 +\cgalHasModels CGAL::Polyhedron_traits_with_normals_3 +\cgalHasModelsEnd \sa `CGAL::Polyhedron_3` diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h index 4722bcaa72c8..525753e4c75a 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h @@ -12,9 +12,10 @@ preserve the overall polyline set shape as much as possible \cgalRefines{CopyConstructible,Assignable} -\cgalHasModel `CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost` -\cgalHasModel `CGAL::Polyline_simplification_2::Scaled_squared_distance_cost` -\cgalHasModel `CGAL::Polyline_simplification_2::Squared_distance_cost` +\cgalHasModelsBegin CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost +\cgalHasModels CGAL::Polyline_simplification_2::Scaled_squared_distance_cost +\cgalHasModels CGAL::Polyline_simplification_2::Squared_distance_cost +\cgalHasModelsEnd */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h index 62e84c66f489..bb5b1d98948d 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h @@ -5,9 +5,10 @@ Models of this concept are passed to the polyline simplification algorithm to indicate when to stop the process. -\cgalHasModel `CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold` -\cgalHasModel `CGAL::Polyline_simplification_2::Stop_below_count_threshold` -\cgalHasModel `CGAL::Polyline_simplification_2::Stop_above_cost_threshold` +\cgalHasModelsBegin CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold +\cgalHasModels CGAL::Polyline_simplification_2::Stop_below_count_threshold +\cgalHasModels CGAL::Polyline_simplification_2::Stop_above_cost_threshold +\cgalHasModelsEnd */ class PolylineSimplificationStopPredicate diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h index c51684ad8d63..20aff75a93bd 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h @@ -8,7 +8,8 @@ whether a vertex can be removed, and the cost of the removal. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Polyline_simplification_2::Vertex_base_2` +\cgalHasModelsBegin CGAL::Polyline_simplification_2::Vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationFaceBase_2` \sa `CGAL::Constrained_triangulation_plus_2` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h index d5552d6b328e..7ce0406f0644 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h @@ -31,7 +31,8 @@ is possible to select a certain variable. \sa `Polynomial_d` -\cgalHasModel `CGAL::Polynomial_traits_d` +\cgalHasModelsBegin CGAL::Polynomial_traits_d +\cgalHasModelsEnd */ diff --git a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h index ed86c99c6838..6a5a0c84a05f 100644 --- a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h +++ b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h @@ -32,7 +32,8 @@ coefficient is a `Field` the polynomial is model of `EuclideanRing`. \sa `AlgebraicStructureTraits` \sa `PolynomialTraits_d` -\cgalHasModel `CGAL::Polynomial` +\cgalHasModelsBegin CGAL::Polynomial +\cgalHasModelsEnd */ diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h index a792e16ee381..64c1383c051f 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h @@ -7,10 +7,11 @@ The concept `AllFurthestNeighborsTraits_2` defines types and operations needed to compute all furthest neighbors for the vertices of a convex polygon using the function `all_furthest_neighbors_2()`. -\cgalHasModel `CGAL::Cartesian` -\cgalHasModel `CGAL::Homogeneous` -\cgalHasModel `CGAL::Simple_cartesian` -\cgalHasModel `CGAL::Simple_homogeneous` +\cgalHasModelsBegin CGAL::Cartesian +\cgalHasModels CGAL::Homogeneous +\cgalHasModels CGAL::Simple_cartesian +\cgalHasModels CGAL::Simple_homogeneous +\cgalHasModelsEnd \sa `CGAL::all_furthest_neighbors_2()` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h index cfece60d3a40..34286f63b4bc 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h @@ -6,9 +6,10 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional optimisation algorithms. -\cgalHasModel `CGAL::Polytope_distance_d_traits_2` -\cgalHasModel `CGAL::Polytope_distance_d_traits_3` -\cgalHasModel `CGAL::Polytope_distance_d_traits_d` +\cgalHasModelsBegin CGAL::Polytope_distance_d_traits_2 +\cgalHasModels CGAL::Polytope_distance_d_traits_3 +\cgalHasModels CGAL::Polytope_distance_d_traits_d +\cgalHasModelsEnd \sa `CGAL::Polytope_distance_d` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h index 6f882dd12808..5794f4716580 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h @@ -12,7 +12,8 @@ Whatever the coordinates of the points are, it is required for the width-algorithm to have access to the homogeneous representation of points. -\cgalHasModel CGAL::Width_default_traits_3 +\cgalHasModelsBegin CGAL::Width_default_traits_3 +\cgalHasModelsEnd \sa `CGAL::Width_3` diff --git a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h index 6cc3639cff50..1882b05c73ee 100644 --- a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h @@ -35,9 +35,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModel `CGAL::Quadratic_program` -\cgalHasModel `CGAL::Quadratic_program_from_mps` -\cgalHasModel `CGAL::Linear_program_from_iterators` +\cgalHasModelsBegin CGAL::Quadratic_program +\cgalHasModels CGAL::Quadratic_program_from_mps +\cgalHasModels CGAL::Linear_program_from_iterators +\cgalHasModelsEnd and the other concepts diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h index e3a75a9aaf7c..0e4c2928cec3 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h @@ -29,17 +29,19 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModel `CGAL::Quadratic_program` -\cgalHasModel `CGAL::Quadratic_program_from_mps` -\cgalHasModel `CGAL::Nonnegative_linear_program_from_iterators` +\cgalHasModelsBegin CGAL::Quadratic_program +\cgalHasModels CGAL::Quadratic_program_from_mps +\cgalHasModels CGAL::Nonnegative_linear_program_from_iterators +\cgalHasModelsEnd The value types of all iterator types (nested iterator types, respectively, for `A_iterator`) must be convertible to some common `IntegralDomain` `ET`. -\cgalHasModel `CGAL::Quadratic_program` -\cgalHasModel `CGAL::Quadratic_program_from_mps` -\cgalHasModel `CGAL::Nonnegative_linear_program_from_iterators` +\cgalHasModelsBegin CGAL::Quadratic_program +\cgalHasModels CGAL::Quadratic_program_from_mps +\cgalHasModels CGAL::Nonnegative_linear_program_from_iterators +\cgalHasModelsEnd \sa `QuadraticProgram` \sa `LinearProgram` diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h index 585eb911b0a9..f531f27550c4 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h @@ -33,9 +33,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModel `CGAL::Quadratic_program` -\cgalHasModel `CGAL::Quadratic_program_from_mps` -\cgalHasModel `CGAL::Nonnegative_quadratic_program_from_iterators` +\cgalHasModelsBegin CGAL::Quadratic_program +\cgalHasModels CGAL::Quadratic_program_from_mps +\cgalHasModels CGAL::Nonnegative_quadratic_program_from_iterators +\cgalHasModelsEnd The value types of all iterator types (nested iterator types, respectively, for `A_iterator` and `D_iterator`) must be diff --git a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h index 6070e27ceb91..e25310153888 100644 --- a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h @@ -34,9 +34,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModel `CGAL::Quadratic_program` -\cgalHasModel `CGAL::Quadratic_program_from_mps` -\cgalHasModel `CGAL::Quadratic_program_from_iterators` +\cgalHasModelsBegin CGAL::Quadratic_program +\cgalHasModels CGAL::Quadratic_program_from_mps +\cgalHasModels CGAL::Quadratic_program_from_iterators +\cgalHasModelsEnd The value types of all iterator types (nested iterator types, respectively, for `A_iterator` and `D_iterator`) must be diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h index d76e8032e54c..1359f35074e4 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h @@ -48,7 +48,8 @@ of the input complex. \cgalRefines{MeshComplex_3InTriangulation_3} -\cgalHasModel `CGAL::Mesh_complex_3_in_triangulation_3` +\cgalHasModelsBegin CGAL::Mesh_complex_3_in_triangulation_3 +\cgalHasModelsEnd \sa `MeshComplex_3InTriangulation_3` \sa `MeshDomainWithFeatures_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h index c3b1696a58da..fa640570e27e 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h @@ -42,7 +42,8 @@ the current approximation of each subdomain and each boundary surface patch. The data structure encodes the final mesh at the end of the meshing process. -\cgalHasModel `CGAL::Mesh_complex_3_in_triangulation_3` +\cgalHasModelsBegin CGAL::Mesh_complex_3_in_triangulation_3 +\cgalHasModelsEnd \sa `MeshDomain_3` \sa `MeshComplexWithFeatures_3InTriangulation_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h index ff424c1281da..50ac974f9797 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h @@ -18,10 +18,11 @@ of the triangulation that are surface facets. \cgalRefines{TriangulationCellBase_3,CopyConstructible} -\cgalHasModel `CGAL::Compact_mesh_cell_base_3` -\cgalHasModel `CGAL::Mesh_cell_base_3` -\cgalHasModel `CGAL::Simplicial_mesh_cell_base_3` -\cgalHasModel `CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3` +\cgalHasModelsBegin CGAL::Compact_mesh_cell_base_3 +\cgalHasModels CGAL::Mesh_cell_base_3 +\cgalHasModels CGAL::Simplicial_mesh_cell_base_3 +\cgalHasModels CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 +\cgalHasModelsEnd */ diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h index ad034bbb9823..938ce50e7e27 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h @@ -16,9 +16,10 @@ and to an index characteristic of this face. \cgalRefines{TriangulationVertexBase_3} -\cgalHasModel `CGAL::Mesh_vertex_base_3` -\cgalHasModel `CGAL::Simplicial_mesh_vertex_base_3` -\cgalHasModel `CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3` +\cgalHasModelsBegin CGAL::Mesh_vertex_base_3 +\cgalHasModels CGAL::Simplicial_mesh_vertex_base_3 +\cgalHasModels CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3 +\cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h index 8235e55f4f01..4c700b18520a 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h @@ -6,8 +6,9 @@ The concept `Descriptor` allows to describe a unique object in an abstract model \cgalRefines{DefaultConstructible,CopyConstructible,Assignable,EqualityComparable} -\cgalHasModel `Index` -\cgalHasModel `Handle` +\cgalHasModelsBegin Index +\cgalHasModels Handle +\cgalHasModelsEnd */ class Descriptor {}; diff --git a/STL_Extension/doc/STL_Extension/Concepts/Hashable.h b/STL_Extension/doc/STL_Extension/Concepts/Hashable.h index 3c7f0b5cf712..ab5c0429a90e 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Hashable.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Hashable.h @@ -6,10 +6,8 @@ A type `Key` is a model of the concept `Hashable` if the specializations `boost::hash` and `std::hash` exist. -\cgalHasModel All handles and indices of \cgal data structures. -\cgalHasModel All handles of OpenMesh, by including the specializations -of the `graph_traits` header files provided by \cgal. -They can be disables by defining the macro `CGAL_DISABLE_HASH_OPENMESH`. +\cgalHasModelsBare{All handles and indices of \cgal data structures, + All handles of OpenMesh\, by including the specializations of the `graph_traits` header files provided by \cgal. They can be disables by defining the macro `CGAL_DISABLE_HASH_OPENMESH`.} \sa `CGAL::Unique_hash_map` \sa `std::unordered_set` diff --git a/STL_Extension/doc/STL_Extension/Concepts/Index.h b/STL_Extension/doc/STL_Extension/Concepts/Index.h index 544e714fa8a8..c94791cd287b 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Index.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Index.h @@ -6,8 +6,9 @@ The concept `Index` is a refinement of `Descriptor` which must be convertible fr \cgalRefines{Descriptor} -\cgalHasModel int -\cgalHasModel size_t +\cgalHasModelsBegin int +\cgalHasModels size_t +\cgalHasModelsEnd \cgalHeading{Notation} diff --git a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h index 3a2856032712..00f421a6c679 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h +++ b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h @@ -12,19 +12,20 @@ The concept `ProjectionObject` is modeled after the STL concept `UnaryFunction`, but takes also care of (const) references. -\cgalHasModel CGAL::Identity -\cgalHasModel CGAL::Dereference -\cgalHasModel CGAL::Get_address -\cgalHasModel CGAL::Cast_function_object -\cgalHasModel CGAL::Project_vertex -\cgalHasModel CGAL::Project_facet -\cgalHasModel CGAL::Project_point -\cgalHasModel CGAL::Project_normal -\cgalHasModel CGAL::Project_plane -\cgalHasModel CGAL::Project_next -\cgalHasModel CGAL::Project_prev -\cgalHasModel CGAL::Project_next_opposite -\cgalHasModel CGAL::Project_opposite_prev +\cgalHasModelsBegin CGAL::Identity +\cgalHasModels CGAL::Dereference +\cgalHasModels CGAL::Get_address +\cgalHasModels CGAL::Cast_function_object +\cgalHasModels CGAL::Project_vertex +\cgalHasModels CGAL::Project_facet +\cgalHasModels CGAL::Project_point +\cgalHasModels CGAL::Project_normal +\cgalHasModels CGAL::Project_plane +\cgalHasModels CGAL::Project_next +\cgalHasModels CGAL::Project_prev +\cgalHasModels CGAL::Project_next_opposite +\cgalHasModels CGAL::Project_opposite_prev +\cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h index e11d85a35a13..02e8a3211506 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h +++ b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h @@ -21,7 +21,8 @@ We call `S` the surjective function such that `S(object)` is the \"thing\" that is locked when one tries to lock `object`. In the previous example, `S(point)` is the voxel containing `point`. -\cgalHasModel `CGAL::Spatial_lock_grid_3` +\cgalHasModelsBegin CGAL::Spatial_lock_grid_3 +\cgalHasModelsEnd */ class SurjectiveLockDataStructure { diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h index e083e399ac7c..35367ad681fd 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h @@ -11,8 +11,9 @@ namespace Scale_space_reconstruction_3 { * A mesher is a functor that can be applied to a range of * points and that returns a set of facets. * - * \cgalHasModel CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher - * \cgalHasModel CGAL::Scale_space_reconstruction_3::Advancing_front_mesher + * \cgalHasModelsBegin CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher + * \cgalHasModels CGAL::Scale_space_reconstruction_3::Advancing_front_mesher + * \cgalHasModelsEnd * */ class Mesher diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h index 0cfdd7b5499f..326cc4ff2df8 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h @@ -15,8 +15,9 @@ namespace Scale_space_reconstruction_3 { * \note the functor can be applied several times by the scale space * reconstruction algorithm. * - * \cgalHasModel CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother - * \cgalHasModel CGAL::Scale_space_reconstruction_3::Jet_smoother + * \cgalHasModelsBegin CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother + * \cgalHasModels CGAL::Scale_space_reconstruction_3::Jet_smoother + * \cgalHasModelsEnd */ class Smoother { diff --git a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h index 71373681e989..f61385ec5896 100644 --- a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h +++ b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h @@ -9,12 +9,13 @@ the keys and intervals, and provide comparison functions that are needed for window queries. -\cgalHasModel `CGAL::Range_segment_tree_set_traits_2` -\cgalHasModel `CGAL::Range_segment_tree_set_traits_3` -\cgalHasModel `CGAL::Range_tree_map_traits_2` -\cgalHasModel `CGAL::Range_tree_map_traits_3` -\cgalHasModel `CGAL::Segment_tree_map_traits_2` -\cgalHasModel `CGAL::Segment_tree_map_traits_3` +\cgalHasModelsBegin CGAL::Range_segment_tree_set_traits_2 +\cgalHasModels CGAL::Range_segment_tree_set_traits_3 +\cgalHasModels CGAL::Range_tree_map_traits_2 +\cgalHasModels CGAL::Range_tree_map_traits_3 +\cgalHasModels CGAL::Segment_tree_map_traits_2 +\cgalHasModels CGAL::Segment_tree_map_traits_3 +\cgalHasModelsEnd \cgalHeading{Example} diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h index 566beb42485e..f5be21ae15ea 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h @@ -33,7 +33,8 @@ We only describe the additional requirements with respect to the \cgalRefines{ApolloniusGraphDataStructure_2} -\cgalHasModel `CGAL::Triangulation_data_structure_2` +\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `ApolloniusGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h index 4b96dab0907b..ee8181103a40 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h @@ -9,7 +9,8 @@ requirements for the face base class of the \cgalRefines{TriangulationFaceBase_2} -\cgalHasModel `CGAL::Segment_Delaunay_graph_face_base_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_face_base_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h index 7ab5a65a26b7..d53cbd55ccf5 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h @@ -26,7 +26,8 @@ The `SegmentDelaunayGraphHierarchyVertexBase_2` concept does not introduce any constructors in addition to those of the `SegmentDelaunayGraphVertexBase_2` concept. -\cgalHasModel CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 > +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 > +\cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` \sa `SegmentDelaunayGraphVertexBase_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h index 5370b1b30262..99d6bf2ca9ee 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h @@ -8,7 +8,8 @@ requirements for the sites of a segment Delaunay graph. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Segment_Delaunay_graph_site_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_site_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Segment_Delaunay_graph_site_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h index 3f391babafa1..d79098a554c1 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h @@ -11,7 +11,8 @@ by storing handles to points instead of points. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Segment_Delaunay_graph_storage_site_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_storage_site_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Segment_Delaunay_graph_site_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h index 78e8bda7d6e7..e4866423c159 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h @@ -15,7 +15,8 @@ See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more informati \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Segment_Delaunay_graph_storage_traits_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_storage_traits_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` */ diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h index e68b4212b191..78e56ed2f6cf 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h @@ -14,10 +14,11 @@ the concept `SegmentDelaunayGraphSite_2`. It also provides constructions for sites and several function object types for the predicates. -\cgalHasModel `CGAL::Segment_Delaunay_graph_traits_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_filtered_traits_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_traits_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_traits_without_intersections_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_filtered_traits_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` \sa `CGAL::Segment_Delaunay_graph_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h index 778a709b5a68..48097737f247 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h @@ -11,7 +11,8 @@ requirements for the vertex base class of the site of the segment Delaunay graph and provides access to one of its incident faces through a `Face_handle`. -\cgalHasModel `CGAL::Segment_Delaunay_graph_vertex_base_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_vertex_base_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` \sa `SegmentDelaunayGraphSite_2` diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h index 4a4a626b8eba..4a8ec7f78fc8 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h @@ -36,10 +36,11 @@ with respect to the \cgalRefines{SegmentDelaunayGraphTraits_2} -\cgalHasModel `CGAL::Segment_Delaunay_graph_Linf_traits_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2` +\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_Linf_traits_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 +\cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` \sa `CGAL::Segment_Delaunay_graph_Linf_2` diff --git a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h index 4f0424d96645..cb1e7eed119a 100644 --- a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h +++ b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h @@ -7,7 +7,7 @@ \cgalRefines{DefaultConstructible,PolygonTraits_2} - \cgalHasModel Any CGAL kernel, e.g., CGAL::Exact_predicates_exact_constructions_kernel. + \cgalHasModelsBare{Any CGAL kernel, e.g., CGAL::Exact_predicates_exact_constructions_kernel.} */ diff --git a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h index 5441f324e943..e581f066cb63 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h +++ b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h @@ -12,8 +12,8 @@ input data has to be provided in form of a random access iterator. Point and normal property maps have to be provided to extract the points and the normals from the input. -\cgalHasModel -- `CGAL::Shape_detection::Efficient_RANSAC_traits` +\cgalHasModelsBegin CGAL::Shape_detection::Efficient_RANSAC_traits +\cgalHasModelsEnd */ class EfficientRANSACTraits{ diff --git a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h index 5495e5d0c9a9..88df769ec099 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h +++ b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h @@ -5,11 +5,11 @@ A concept that describes the set of methods used by the `CGAL::Shape_detection::Region_growing` to access neighbors of an item. -\cgalHasModel -- `CGAL::Shape_detection::Point_set::K_neighbor_query` -- `CGAL::Shape_detection::Point_set::Sphere_neighbor_query` -- `CGAL::Shape_detection::Polygon_mesh::Polyline_graph` -- `CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query` +\cgalHasModelsBegin CGAL::Shape_detection::Point_set::K_neighbor_query +\cgalHasModels CGAL::Shape_detection::Point_set::Sphere_neighbor_query +\cgalHasModels CGAL::Shape_detection::Polygon_mesh::Polyline_graph +\cgalHasModels CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query +\cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h index f1366dc8aba6..af3212c67593 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h +++ b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h @@ -7,14 +7,14 @@ to maintain a region. A region is represented by a set items, which are included in this region. -\cgalHasModel -- `CGAL::Shape_detection::Point_set::Least_squares_line_fit_region` -- `CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region` -- `CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region` -- `CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region` -- `CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region` -- `CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region` -- `CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region` +\cgalHasModelsBegin CGAL::Shape_detection::Point_set::Least_squares_line_fit_region +\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region +\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region +\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region +\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region +\cgalHasModels CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region +\cgalHasModels CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region +\cgalHasModelsEnd */ class RegionType { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h index f0e4a54c1a10..9ed67563fdcc 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h @@ -10,10 +10,10 @@ a model of this concept, the user sets such directions and provides a way to ori contour edges towards these directions. All contour regularization functions in this package are parameterized by this concept. -\cgalHasModel -- `Contours::Longest_direction_2` -- `Contours::Multiple_directions_2` -- `Contours::User_defined_directions_2` +\cgalHasModelsBegin Contours::Longest_direction_2 +\cgalHasModels Contours::Multiple_directions_2 +\cgalHasModels Contours::User_defined_directions_2 +\cgalHasModelsEnd */ class ContourDirections { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h index 4d8074eee9dd..20dbf1801e12 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h @@ -9,8 +9,8 @@ A concept that describes the set of methods used by the class `QP_regularization` to access neighbors of a geometric object being regularized. -\cgalHasModel -- `Segments::Delaunay_neighbor_query_2` +\cgalHasModelsBegin Segments::Delaunay_neighbor_query_2 +\cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h index eb3a764af8e4..ab3bbb08b7b6 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h @@ -9,9 +9,9 @@ A concept that describes the set of methods used by the class `QP_regularization` to access various data required for setting up the the global regularization problem. -\cgalHasModel -- `Segments::Angle_regularization_2` -- `Segments::Offset_regularization_2` +\cgalHasModelsBegin Segments::Angle_regularization_2 +\cgalHasModels Segments::Offset_regularization_2 +\cgalHasModelsEnd */ class RegularizationType { diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h index 6551020f4f05..180cbeeb64d2 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h @@ -10,7 +10,8 @@ polyhedral mesh approximating a skin surface \cgalRefines{RegularTriangulationTraits_3} -\cgalHasModel `CGAL::Skin_surface_traits_3` +\cgalHasModelsBegin CGAL::Skin_surface_traits_3 +\cgalHasModelsEnd \sa `CGAL::Skin_surface_3` \sa `CGAL::Skin_surface_traits_3` diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h index a4dad53d72e8..237a5d3049d6 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h @@ -9,8 +9,9 @@ The concept requires a constructor from an iterator range of weighted points and a shrink factor. By default the input balls are grown in such that the skin surface wraps around the input balls. -\cgalHasModel `CGAL::Skin_surface_3` -\cgalHasModel `CGAL::Union_of_balls_3` +\cgalHasModelsBegin CGAL::Skin_surface_3 +\cgalHasModels CGAL::Union_of_balls_3 +\cgalHasModelsEnd */ diff --git a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h index 0138ce98d6bd..163d17faa16a 100644 --- a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h +++ b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h @@ -11,7 +11,8 @@ some function object types for the required predicates on those primitives. \cgalRefines{ArrangementTraits_2} -\cgalHasModel `CGAL::Snap_rounding_traits_2` +\cgalHasModelsBegin CGAL::Snap_rounding_traits_2 +\cgalHasModelsEnd */ class SnapRoundingTraits_2 { @@ -171,7 +172,7 @@ namespace SRTraits_2{ \cgalConcept Represents an iso rectangle \cgalRefines{DefaultConstructible,CopyConstructible,Assignable} - \cgalHasModel \link SnapRoundingTraits_2::Iso_rectangle_2 `Snap_rounding_traits_2::Iso_rectangle_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Iso_rectangle_2 `Snap_rounding_traits_2::Iso_rectangle_2` \endlink} */ class IsoRectangle_2 {}; @@ -180,7 +181,7 @@ class IsoRectangle_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Construct_vertex_2 `Snap_rounding_traits_2::Construct_vertex_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_vertex_2 `Snap_rounding_traits_2::Construct_vertex_2` \endlink} */ class ConstructVertex_2 { @@ -197,7 +198,7 @@ class ConstructVertex_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Construct_segment_2 `Snap_rounding_traits_2::Construct_segment_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_segment_2 `Snap_rounding_traits_2::Construct_segment_2` \endlink} */ class ConstructSegment_2 { @@ -214,7 +215,7 @@ class ConstructSegment_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableQuaternaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Construct_iso_rectangle_2 `Snap_rounding_traits_2::Construct_iso_rectangle_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_iso_rectangle_2 `Snap_rounding_traits_2::Construct_iso_rectangle_2` \endlink} */ class ConstructIsoRectangle_2 { @@ -235,7 +236,7 @@ class ConstructIsoRectangle_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Compare_x_2 `Snap_rounding_traits_2::Compare_x_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Compare_x_2 `Snap_rounding_traits_2::Compare_x_2` \endlink} */ class CompareX_2 { @@ -251,7 +252,7 @@ class CompareX_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Compare_y_2 `Snap_rounding_traits_2::Compare_y_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Compare_y_2 `Snap_rounding_traits_2::Compare_y_2` \endlink} */ class CompareY_2 { @@ -268,7 +269,7 @@ class CompareY_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableQuaternaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Snap_2 `Snap_rounding_traits_2::Snap_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Snap_2 `Snap_rounding_traits_2::Snap_2` \endlink} */ class Snap_2 { @@ -287,7 +288,7 @@ class Snap_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Integer_grid_point_2 `Snap_rounding_traits_2::Integer_grid_point_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Integer_grid_point_2 `Snap_rounding_traits_2::Integer_grid_point_2` \endlink} */ class IntegerGridPoint_2 @@ -308,7 +309,7 @@ class IntegerGridPoint_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableTernaryFunction} - \cgalHasModel \link SnapRoundingTraits_2::Minkowski_sum_with_pixel_2 `Snap_rounding_traits_2::Minkowski_sum_with_pixel_2` \endlink + \cgalHasModelsBare{\link SnapRoundingTraits_2::Minkowski_sum_with_pixel_2 `Snap_rounding_traits_2::Minkowski_sum_with_pixel_2` \endlink} */ class MinkowskiSumWithPixel_2 { diff --git a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h index 7b00e83e1195..41594f6cbfeb 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h @@ -19,7 +19,8 @@ For example, a matrix of dimension 3 is defined as \tparam FT Number type \tparam dim Dimension of the matrices and vectors -\cgalHasModel `CGAL::Eigen_diagonalize_traits` +\cgalHasModelsBegin CGAL::Eigen_diagonalize_traits +\cgalHasModelsEnd */ template class DiagonalizeTraits diff --git a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h index 8504337f1fce..015153dd3240 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h @@ -7,7 +7,8 @@ class MixedIntegerProgramTraits `MixedIntegerProgramVariable` is a concept of a variable in a Mixed Integer Programming (MIP) problem. -\cgalHasModel `CGAL::Variable` +\cgalHasModelsBegin CGAL::Variable +\cgalHasModelsEnd */ template class MixedIntegerProgramVariable @@ -112,7 +113,8 @@ class MixedIntegerProgramVariable `MixedIntegerProgramLinearConstraint` is a concept of a linear constraint in a Mixed Integer Programming (MIP) problem. -\cgalHasModel `CGAL::Linear_constraint` +\cgalHasModelsBegin CGAL::Linear_constraint +\cgalHasModelsEnd */ template class MixedIntegerProgramLinearConstraint @@ -209,7 +211,8 @@ class MixedIntegerProgramLinearConstraint `MixedIntegerProgramLinearObjective` is a concept of the linear objective function in a Mixed Integer Programming (MIP) problem. -\cgalHasModel `CGAL::Linear_objective` +\cgalHasModelsBegin CGAL::Linear_objective +\cgalHasModelsEnd */ template class MixedIntegerProgramLinearObjective @@ -277,9 +280,10 @@ Mixed Integer Programming (MIP) problems. A model of this concept stores the int variables, linear objective, and linear constraints (if any) and provides a method to solve the problem. -\cgalHasModel `CGAL::Mixed_integer_program_traits` -\cgalHasModel `CGAL::GLPK_mixed_integer_program_traits` -\cgalHasModel `CGAL::SCIP_mixed_integer_program_traits` +\cgalHasModelsBegin CGAL::Mixed_integer_program_traits +\cgalHasModels CGAL::GLPK_mixed_integer_program_traits +\cgalHasModels CGAL::SCIP_mixed_integer_program_traits +\cgalHasModelsEnd */ template class MixedIntegerProgramTraits diff --git a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h index 36c16f629ea4..07781ed7265a 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h @@ -7,7 +7,8 @@ Concept describing the set of requirements for solving the normal equation \f$ A \sa `SparseLinearAlgebraTraits_d` -\cgalHasModel `CGAL::Eigen_solver_traits` +\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsEnd */ class NormalEquationSparseLinearAlgebraTraits_d { diff --git a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h index 189f0da26b72..f929f231c7b5 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h @@ -24,8 +24,8 @@ where \f$ l_i \in \mathbb{R} \cup \{-\infty\} \f$ for all \f$ i \f$, where \f$ u_i \in \mathbb{R} \cup \{+\infty\} \f$ for all \f$ i \f$. -\cgalHasModel -`CGAL::OSQP_quadratic_program_traits` +\cgalHasModelsBegin CGAL::OSQP_quadratic_program_traits +\cgalHasModelsEnd */ class QuadraticProgramTraits { diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h index e05554478123..7c04f914bd48 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h @@ -4,7 +4,8 @@ The concept `SparseLinearAlgebraTraits_d` is used to solve sparse linear systems A\f$ \times \f$ X = B. -\cgalHasModel `CGAL::Eigen_solver_traits` +\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsEnd */ class SparseLinearAlgebraTraits_d { @@ -62,7 +63,8 @@ by a sparse matrix. \cgalRefines{DefaultConstructible} -\cgalHasModel `CGAL::Eigen_vector` +\cgalHasModelsBegin CGAL::Eigen_vector +\cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` \sa `SparseLinearAlgebraTraits_d::Matrix` @@ -129,8 +131,9 @@ NT& operator[](Index row); \cgalRefines{Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Eigen_sparse_matrix` -\cgalHasModel `CGAL::Eigen_sparse_symmetric_matrix` +\cgalHasModelsBegin CGAL::Eigen_sparse_matrix +\cgalHasModels CGAL::Eigen_sparse_symmetric_matrix +\cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` \sa `SparseLinearAlgebraTraits_d::Vector` diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h index 0313402d3560..34df486f1e63 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h @@ -8,7 +8,8 @@ method to solve the system for different right-hand vectors. \cgalRefines{SparseLinearAlgebraTraits_d} -\cgalHasModel `CGAL::Eigen_solver_traits` +\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsEnd */ class SparseLinearAlgebraWithFactorTraits_d { public: diff --git a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h index 939b29a4959c..2c843090296b 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h @@ -5,7 +5,8 @@ The concept `SvdTraits` describes the linear algebra types and algorithms needed to solve in the least square sense a linear system with a singular value decomposition - \cgalHasModel `CGAL::Eigen_svd` +\cgalHasModelsBegin galHasModel `CGAL::Eigen_svd +\cgalHasModelsEnd */ class SvdTraits { @@ -51,7 +52,8 @@ class SvdTraits \cgalConcept Concept of vector type used by the concept `SvdTraits`. -\cgalHasModel `CGAL::Eigen_vector` +\cgalHasModelsBegin CGAL::Eigen_vector +\cgalHasModelsEnd */ class SvdTraits::Vector { @@ -88,7 +90,8 @@ Concept of matrix type used by the concept `SvdTraits`. \cgalRefines{DefaultConstructible,Assignable} -\cgalHasModel `CGAL::Eigen_matrix` +\cgalHasModelsBegin CGAL::Eigen_matrix +\cgalHasModelsEnd */ class SvdTraits::Matrix { diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h index a8aa2640a2c3..4e0837b36be0 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h @@ -4,8 +4,9 @@ The concept `FuzzyQueryItem` describes the requirements for fuzzy `d`-dimensional spatial objects. -\cgalHasModel `CGAL::Fuzzy_sphere` +\cgalHasModelsBegin CGAL::Fuzzy_sphere \cgalHasModel `CGAL::Fuzzy_iso_box` +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h index fd72ee75e07a..7a8506131f61 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h @@ -8,8 +8,9 @@ To optimize distance computations transformed distances are used, e.g., for a Euclidean distance the transformed distance is the squared Euclidean distance. -\cgalHasModel `CGAL::Manhattan_distance_iso_box_point` -\cgalHasModel `CGAL::Euclidean_distance_sphere_point` +\cgalHasModelsBegin CGAL::Manhattan_distance_iso_box_point +\cgalHasModels CGAL::Euclidean_distance_sphere_point +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h index d2a398589d80..b2f826e4074a 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h @@ -8,8 +8,9 @@ E.g., for an Euclidean distance the transformed distance is the squared Euclidea \cgalRefines{GeneralDistance} -\cgalHasModel `CGAL::Euclidean_distance` -\cgalHasModel `CGAL::Weighted_Minkowski_distance` +\cgalHasModelsBegin CGAL::Euclidean_distance +\cgalHasModels CGAL::Weighted_Minkowski_distance +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h index 5e7e310f0a59..feb9af6f79ed 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h @@ -8,12 +8,13 @@ range search queries in a model of `SpatialTree`. \cgalRefines{SearchTraits} -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` -\cgalHasModel `CGAL::Search_traits_2` -\cgalHasModel `CGAL::Search_traits_3` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModels CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModels CGAL::Search_traits_2 +\cgalHasModels CGAL::Search_traits_3 +\cgalHasModelsEnd \sa `SearchTraits` \sa `CGAL::Search_traits_adapter` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h index df585ebf4fc0..96857238a64a 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h @@ -5,7 +5,7 @@ The concept `SearchGeomTraits_2` defines the requirements for the template parameter of the search traits classes. -\cgalHasModel Any \cgal Kernel +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} */ class SearchGeomTraits_2 { diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h index 243277705d87..85191a1b0962 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h @@ -5,7 +5,7 @@ The concept `SearchGeomTraits_3` defines the requirements for the template parameter of the search traits classes. -\cgalHasModel All models of the concept `Kernel` +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h index 65240b519ce7..6bfe70109e01 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h @@ -5,14 +5,15 @@ The concept `SearchTraits` defines the requirements for the template parameter of the search classes. -\cgalHasModel `CGAL::Cartesian_d` -\cgalHasModel `CGAL::Homogeneous_d` -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` -\cgalHasModel `CGAL::Search_traits_2` -\cgalHasModel `CGAL::Search_traits_3` -\cgalHasModel `CGAL::Search_traits_d` -\cgalHasModel `CGAL::Search_traits` +\cgalHasModelsBegin CGAL::Cartesian_d +\cgalHasModels CGAL::Homogeneous_d +\cgalHasModels CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModels CGAL::Search_traits_2 +\cgalHasModels CGAL::Search_traits_3 +\cgalHasModels CGAL::Search_traits_d +\cgalHasModels CGAL::Search_traits +\cgalHasModelsEnd \sa `RangeSearchTraits` \sa `CGAL::Search_traits_adapter` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h index 271d102b0673..ecdc521ce9fe 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h @@ -11,7 +11,8 @@ space is said to be on the negative side of the separator and the other part of space is said to be on the positive side of the separator. -\cgalHasModel `CGAL::Plane_separator` +\cgalHasModelsBegin CGAL::Plane_separator +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h index 6ff8b6d31b0d..58d396cec22c 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h @@ -5,7 +5,8 @@ The concept `SpatialTree` defines the requirements for a tree supporting both neighbor searching and approximate range searching. -\cgalHasModel `CGAL::Kd_tree` +\cgalHasModelsBegin CGAL::Kd_tree +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h index ee5534298371..88a18887640d 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h @@ -7,13 +7,14 @@ The concept `Splitter` defines the requirements for a function object class implementing a splitting rule. \cgalAdvancedEnd -\cgalHasModel `CGAL::Fair` -\cgalHasModel `CGAL::Median_of_rectangle` -\cgalHasModel `CGAL::Median_of_max_spread` -\cgalHasModel `CGAL::Midpoint_of_rectangle` -\cgalHasModel `CGAL::Midpoint_of_max_spread` -\cgalHasModel `CGAL::Sliding_fair` -\cgalHasModel `CGAL::Sliding_midpoint` +\cgalHasModelsBegin CGAL::Fair +\cgalHasModels CGAL::Median_of_rectangle +\cgalHasModels CGAL::Median_of_max_spread +\cgalHasModels CGAL::Midpoint_of_rectangle +\cgalHasModels CGAL::Midpoint_of_max_spread +\cgalHasModels CGAL::Sliding_fair +\cgalHasModels CGAL::Sliding_midpoint +\cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h index e2bb9ee88819..8a48e705bd00 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h @@ -9,8 +9,8 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_2` defines the complete set of primitives required in these functions and functors. -\cgalHasModel Any \cgal kernel. -\cgalHasModel `CGAL::Spatial_sort_traits_adapter_2` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Spatial_sort_traits_adapter_2 +\cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h index 7fad8da4666d..2cef4c17269a 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h @@ -9,8 +9,8 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_3` defines the complete set of primitives required in these functions and functors. -\cgalHasModel Any \cgal kernel. -\cgalHasModel `CGAL::Spatial_sort_traits_adapter_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Spatial_sort_traits_adapter_3 +\cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h index c91e76a99cd8..a0c4dfd031d4 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h @@ -9,8 +9,8 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_d` defines the complete set of primitives required in these functions and functors. -\cgalHasModel Any \cgal `d`-dimensional kernel. -\cgalHasModel `CGAL::Spatial_sort_traits_adapter_d` +\cgalHasModelsBareBegin{Any \cgal `d`-dimensional kernel.} CGAL::Spatial_sort_traits_adapter_d +\cgalHasModelsEnd */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h index d0c364262cbb..15aa1efc7dab 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h @@ -7,7 +7,8 @@ The concept `PolygonOffsetBuilderTraits_2` describes the requirements for the geometric traits class required by the algorithm class `CGAL::Polygon_offset_builder_2`. -\cgalHasModel `CGAL::Polygon_offset_builder_traits_2` +\cgalHasModelsBegin CGAL::Polygon_offset_builder_traits_2 +\cgalHasModelsEnd \sa `CGAL::Polygon_offset_builder_2` */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h index f971c1c880c2..a19486171c43 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h @@ -7,7 +7,8 @@ The concept `StraightSkeletonBuilderTraits_2` describes the requirements for the geometric traits class required by the algorithm class `CGAL::Straight_skeleton_builder_2`. -\cgalHasModel `CGAL::Straight_skeleton_builder_traits_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_builder_traits_2 +\cgalHasModelsEnd */ class StraightSkeletonBuilderTraits_2 { public: diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h index 4860b9ab6b83..316fbc4b0e04 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h @@ -5,7 +5,8 @@ The concept `StraightSkeletonBuilder_2_Visitor` describes the requirements of the visitor class required by the algorithm class `CGAL::Straight_skeleton_builder_2` in its third template parameter. -\cgalHasModel `CGAL::Dummy_straight_skeleton_builder_2_visitor` +\cgalHasModelsBegin CGAL::Dummy_straight_skeleton_builder_2_visitor +\cgalHasModelsEnd \sa `CGAL::Straight_skeleton_builder_2` */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h index 311987667fb9..16bf5a396b50 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h @@ -8,7 +8,8 @@ The concept `StraightSkeletonFace_2` describes the requirements for the face typ `StraightSkeleton_2` concept. It is a refinement of the `HalfedgeDSFace` concept with support for storage of the incident halfedge. -\cgalHasModel `CGAL::Straight_skeleton_face_base_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_face_base_2 +\cgalHasModelsEnd \sa `StraightSkeletonVertex_2` \sa `StraightSkeletonHalfedge_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h index 6225e4f613f8..22caa9419c04 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h @@ -12,7 +12,8 @@ The only geometric embedding used by the Straight Skeleton Data Structure are th in the contour and skeleton vertices. However, for any halfedge, there is a 2D segment implicitly given by its `source` and `target` vertices. -\cgalHasModel `CGAL::Straight_skeleton_halfedge_base_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_halfedge_base_2 +\cgalHasModelsEnd \sa `StraightSkeleton_2` \sa `StraightSkeletonHalfedge_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h index 55f5c799095f..a95688dc6e78 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h @@ -6,7 +6,8 @@ The concept `StraightSkeletonItemsConverter_2` describes the requirements for it as the third template argument to the class `Straight_skeleton_converter_2`. It converts the `HDS` items from one type of straight skeleton to another. -\cgalHasModel `CGAL::Straight_skeleton_items_converter_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_items_converter_2 +\cgalHasModelsEnd \sa `CGAL::Straight_skeleton_converter_2` */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h index 7a26285dccfc..a53a002940ef 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h @@ -9,7 +9,8 @@ The concept `StraightSkeletonVertex_2` describes the requirements for the vertex with support for storage of the incident halfedge. The `StraightSkeletonVertex_2` concept requires the geometric embedding to be a 2D point. -\cgalHasModel `CGAL::Straight_skeleton_vertex_base_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_vertex_base_2 +\cgalHasModelsEnd \sa `StraightSkeletonHalfedge_2` \sa `StraightSkeletonFace_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h index 18a85973c5ba..52dcfe61484e 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h @@ -9,7 +9,8 @@ used to represent a straight skeleton. It refines the concept `HalfedgeDS` and adds additional requirements on the nested types `Vertex`, `Halfedge`, and `Face` of the halfedge data structure. -\cgalHasModel `CGAL::Straight_skeleton_2` +\cgalHasModelsBegin CGAL::Straight_skeleton_2 +\cgalHasModelsEnd \attention This concept explicitly protects all the modifying operations of the base `HalfedgeDS` concept. Only the algorithm diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h index ec96722d9262..6f001fda04ee 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h @@ -9,8 +9,9 @@ the second template parameter of the class provides the operation that integrates a new point from a given point with a predefined step, and according to a specified vector. -\cgalHasModel `CGAL::Euler_integrator_2` -\cgalHasModel `CGAL::Runge_kutta_integrator_2` +\cgalHasModelsBegin CGAL::Euler_integrator_2 +\cgalHasModels CGAL::Runge_kutta_integrator_2 +\cgalHasModelsEnd */ diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h index a55c74b6ac2c..e1394b709454 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h @@ -9,7 +9,7 @@ the template parameter of the class This concept provides the types handled by the `CGAL::Stream_lines_2` class. -\cgalHasModel The kernels of \cgal are models for this traits class. +\cgalHasModelsBare{The kernels of \cgal are models for this traits class.} */ class StreamLinesTraits_2 { diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h index 9b44da48a2f7..b42a88dba950 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h @@ -9,8 +9,9 @@ the first template parameter of the class provides the types of the geometric primitives used in the placement of streamlines and some functions for answering different queries. -\cgalHasModel `CGAL::Regular_grid_2` -\cgalHasModel `CGAL::Triangular_field_2` +\cgalHasModelsBegin CGAL::Regular_grid_2 +\cgalHasModels CGAL::Triangular_field_2 +\cgalHasModelsEnd */ diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h index c5a06d956182..2a0e662a0e82 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h @@ -11,7 +11,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModel `CGAL::DooSabin_mask_3` +\cgalHasModelsBegin CGAL::DooSabin_mask_3 +\cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h index bb28f171b025..22c59d45ad22 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h @@ -11,7 +11,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModel `CGAL::CatmullClark_mask_3` +\cgalHasModelsBegin CGAL::CatmullClark_mask_3 +\cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h index 6050b444ad3e..2faff045bd6d 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h @@ -10,7 +10,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModel `CGAL::Loop_mask_3` +\cgalHasModelsBegin CGAL::Loop_mask_3 +\cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` */ diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h index ee5fc38d9079..ed311db671a3 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h @@ -9,7 +9,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModel `CGAL::Sqrt3_mask_3` +\cgalHasModelsBegin CGAL::Sqrt3_mask_3 +\cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h index f84b271c2899..68364e07863a 100644 --- a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h +++ b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h @@ -6,8 +6,9 @@ The concept `ErrorMetricProxy` defines the notion of proxy, computes the fitting error from a face to a proxy, and fits a proxy from a range of faces. -\cgalHasModel `CGAL::Surface_mesh_approximation::L21_metric_plane_proxy` -\cgalHasModel `CGAL::Surface_mesh_approximation::L2_metric_plane_proxy` +\cgalHasModelsBegin CGAL::Surface_mesh_approximation::L21_metric_plane_proxy +\cgalHasModels CGAL::Surface_mesh_approximation::L2_metric_plane_proxy +\cgalHasModelsEnd */ class ErrorMetricProxy { diff --git a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h index a8dbb00b46b7..65137707986d 100644 --- a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h +++ b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h @@ -9,8 +9,9 @@ to implement models of this concept. \cgalRefines{DefaultConstructible} -\cgalHasModel `CGAL::Deformation_Eigen_closest_rotation_traits_3` -\cgalHasModel `CGAL::Deformation_Eigen_polar_closest_rotation_traits_3` +\cgalHasModelsBegin CGAL::Deformation_Eigen_closest_rotation_traits_3 +\cgalHasModels CGAL::Deformation_Eigen_polar_closest_rotation_traits_3 +\cgalHasModelsEnd */ class DeformationClosestRotationTraits_3{ diff --git a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h index 32a71b17f71d..67002d031aec 100644 --- a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h +++ b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h @@ -12,16 +12,17 @@ the border of a given mesh. Construction and destruction are undefined. -\cgalHasModel `CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3` -\cgalHasModel `CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3` +\cgalHasModelsBegin CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3 +\cgalHasModels CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3 +\cgalHasModelsEnd \sa `CGAL::Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3` */ diff --git a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h index 93450589cfcf..2e0a58fa0a28 100644 --- a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h +++ b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h @@ -5,7 +5,7 @@ The concept `SegmentationGeomTraits` describes the set of requirements of the geometric traits needed by the segmentation functions. -\cgalHasModel All the \cgal Kernels +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \cgalRefines{AABBGeomTraits} diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h index 652c3457496d..51d4ae712eb6 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h @@ -8,7 +8,8 @@ predicates, and constructions required by the traits class parameter of `CGAL::Surface_mesh_shortest_path`. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModel `CGAL::Surface_mesh_shortest_path_traits` +\cgalHasModelsBegin CGAL::Surface_mesh_shortest_path_traits +\cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h index 24a05f636c29..f31143efcc62 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h @@ -12,9 +12,10 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModel `CGAL::Surface_mesh_simplification::Edge_length_cost` -\cgalHasModel `CGAL::Surface_mesh_simplification::LindstromTurk_cost` -\cgalHasModel `CGAL::Surface_mesh_simplification::GarlandHeckbert_policies` +\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Edge_length_cost +\cgalHasModels CGAL::Surface_mesh_simplification::LindstromTurk_cost +\cgalHasModels CGAL::Surface_mesh_simplification::GarlandHeckbert_policies +\cgalHasModelsEnd */ class GetCost diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h index e576472cb34e..bb66ff08d050 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h @@ -14,11 +14,12 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModel `CGAL::Surface_mesh_simplification::Midpoint_placement` -\cgalHasModel `CGAL::Surface_mesh_simplification::LindstromTurk_placement` -\cgalHasModel `CGAL::Surface_mesh_simplification::GarlandHeckbert_policies` -\cgalHasModel `CGAL::Surface_mesh_simplification::Bounded_normal_change_placement` -\cgalHasModel `CGAL::Surface_mesh_simplification::Constrained_placement` +\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Midpoint_placement +\cgalHasModels CGAL::Surface_mesh_simplification::LindstromTurk_placement +\cgalHasModels CGAL::Surface_mesh_simplification::GarlandHeckbert_policies +\cgalHasModels CGAL::Surface_mesh_simplification::Bounded_normal_change_placement +\cgalHasModels CGAL::Surface_mesh_simplification::Constrained_placement +\cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h index 324c87f45ee7..b66544074009 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h @@ -14,8 +14,9 @@ be absent). The value `boost::none` indicates that the edge should not be collap \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModel `CGAL::Surface_mesh_simplification::Bounded_normal_change_filter` -\cgalHasModel `CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter` +\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Bounded_normal_change_filter +\cgalHasModels CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter +\cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h index ad5f22d4ccb3..df8fc845f5b4 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h @@ -4,11 +4,12 @@ The concept `StopPredicate` describes the requirements for the predicate which indicates if the simplification process must finish. -\cgalHasModel `CGAL::Surface_mesh_simplification::Edge_count_stop_predicate` -\cgalHasModel `CGAL::Surface_mesh_simplification::Face_count_stop_predicate` -\cgalHasModel `CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate` -\cgalHasModel `CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate` -\cgalHasModel `CGAL::Surface_mesh_simplification::Edge_length_stop_predicate` +\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Edge_count_stop_predicate +\cgalHasModels CGAL::Surface_mesh_simplification::Face_count_stop_predicate +\cgalHasModels CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate +\cgalHasModels CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate +\cgalHasModels CGAL::Surface_mesh_simplification::Edge_length_stop_predicate +\cgalHasModelsEnd */ class StopPredicate { diff --git a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h index 824b21454e51..b7466a2ecd45 100644 --- a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h +++ b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h @@ -5,7 +5,7 @@ * * Traits class concept defining the requirements of the class `CGAL::Mean_curvature_flow_skeletonization`. * - * \cgalHasModel Any \cgal `Kernel` with `double` as `%Kernel::%FT` + * \cgalHasModelsBare{Any \cgal `Kernel` with `double` as `%Kernel::%FT`} * * */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h index 01c344d316cb..6f6355c93901 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h @@ -9,8 +9,8 @@ \cgalRefines{GenericMap} - \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`\endlink - \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map`\endlink + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`\endlink\n + \link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map`\endlink} */ class PolygonalSchema diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h index 8ee52354e37e..0bf077baf427 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h @@ -6,7 +6,7 @@ \cgalRefines{GenericMapItems} - \cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_min_items `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`\endlink + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_min_items `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`\endlink} */ class PolygonalSchemaItems diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h index 0062dd18e484..4650a313f02a 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h @@ -5,8 +5,8 @@ The concept `WeightFunctor` defines a functor to calculate the weight of an edge. - \cgalHasModel \link CGAL::Surface_mesh_topology::Unit_weight_functor `CGAL::Surface_mesh_topology::Unit_weight_functor`\endlink - \cgalHasModel \link CGAL::Surface_mesh_topology::Euclidean_length_weight_functor `CGAL::Surface_mesh_topology::Euclidean_length_weight_functor`\endlink + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Unit_weight_functor `CGAL::Surface_mesh_topology::Unit_weight_functor`\endlink, + \link CGAL::Surface_mesh_topology::Euclidean_length_weight_functor `CGAL::Surface_mesh_topology::Euclidean_length_weight_functor`\endlink} */ class WeightFunctor { public: diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h index a713151a311d..319bf352f0c6 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h @@ -7,8 +7,8 @@ The concept `ImplicitFunction` describes a function object whose `operator()` computes the values of a function \f$ f : \mathbb{R}^3 \longrightarrow \mathbb{R}\f$. -\cgalHasModel CGAL::Gray_level_image_3 -\cgalHasModel any pointer to a function of type `FT (*)(Point)` +\cgalHasModelsBareBegin{any pointer to a function of type `FT (*)(Point)`} CGAL::Gray_level_image_3 +\cgalHasModelsEnd \sa `CGAL::Implicit_surface_3` \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h index fed39a225af3..28814f2648ea 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h @@ -15,7 +15,7 @@ the concept `ImplicitSurfaceTraits_3` provides the types, predicates and constru that are passed to the generated model of `SurfaceMeshTraits_3`. -\cgalHasModel Any \cgal Kernel. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `CGAL::Implicit_surface_3` \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h index f418f71e47b7..1b16bc506f14 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h @@ -37,8 +37,9 @@ of the restriction to the surface of a three dimensional triangulation. In the following we call surface center of a facet, the center of its biggest Delaunay surface ball. -\cgalHasModel `CGAL::Surface_mesh_cell_base_3` -\cgalHasModel `CGAL::Surface_mesh_default_triangulation_3::Cell` +\cgalHasModelsBegin CGAL::Surface_mesh_cell_base_3 +\cgalHasModels CGAL::Surface_mesh_default_triangulation_3::Cell +\cgalHasModelsEnd \sa `SurfaceMeshTriangulation_3` \sa `SurfaceMeshComplex_2InTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h index 1f8cb4f169f1..ec9eba193720 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h @@ -30,7 +30,8 @@ A model of this concept is a type to be plugged as first template parameter in the function template `CGAL::make_surface_mesh()`. -\cgalHasModel `CGAL::Surface_mesh_complex_2_in_triangulation_3` +\cgalHasModelsBegin CGAL::Surface_mesh_complex_2_in_triangulation_3 +\cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h index 28b866387ea1..7380607aca07 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h @@ -33,7 +33,8 @@ is just a lexicographical comparison. The meshing algorithm handles facets with lowest quality first. The qualities are computed by a function `is_bad(const Facet& f, const Quality& q)`. -\cgalHasModel `CGAL::Surface_mesh_default_criteria_3` +\cgalHasModelsBegin CGAL::Surface_mesh_default_criteria_3 +\cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h index 15d0256b2bc7..dd728781a7f7 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h @@ -11,7 +11,8 @@ and to compute some intersection points if any exists. The concept `SurfaceMeshTraits_3` also includes a funcctor able to provide a small set of initial points on the surface. -\cgalHasModel `CGAL::Surface_mesh_traits_generator_3::type` +\cgalHasModelsBegin CGAL::Surface_mesh_traits_generator_3::type +\cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h index 7d502a9bf413..7af1aba64cae 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h @@ -17,7 +17,7 @@ the requirements for the triangulation type plugged in the class `CGAL::Surface_mesh_complex_2_in_triangulation_3`. -\cgalHasModel Any 3D Delaunay triangulation class of \cgal +\cgalHasModelsBare{Any 3D Delaunay triangulation class of \cgal} \sa `CGAL::Triangulation_3` \sa `CGAL::Delaunay_triangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h index 5e1f3b3098dc..086b7759ac90 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h @@ -31,8 +31,9 @@ integers, which, when they are valid, store respectively the number of complex facets incident to the vertex and the number of connected components of the adjacency graph of those facets. -\cgalHasModel `CGAL::Surface_mesh_vertex_base_3` -\cgalHasModel `CGAL::Surface_mesh_default_triangulation_3::Vertex` +\cgalHasModelsBegin CGAL::Surface_mesh_vertex_base_3 +\cgalHasModels CGAL::Surface_mesh_default_triangulation_3::Vertex +\cgalHasModelsEnd \sa `SurfaceMeshComplex_2InTriangulation_3` \sa `CGAL::Surface_mesh_complex_2_in_triangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h index 6e0694fda562..0e5cca74dfef 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h @@ -8,7 +8,8 @@ The surface types are required to be copy constructible and assignable. -\cgalHasModel `CGAL::Implicit_surface_3` +\cgalHasModelsBegin CGAL::Implicit_surface_3 +\cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` \sa `SurfaceMeshTraits_3` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h index d3bc61921c50..e10d068c1b1a 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h @@ -48,7 +48,8 @@ that the `CGAL::Triangulation_data_structure_2` actually uses as a base class for the class `CGAL::Triangulation_data_structure_2::Face`. -\cgalHasModel `CGAL::Triangulation_ds_face_base_2` +\cgalHasModelsBegin CGAL::Triangulation_ds_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` \sa `CGAL::Triangulation_data_structure_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h index 8402f4f4442c..e47b7cfbf3f8 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h @@ -44,7 +44,8 @@ that the `CGAL::Triangulation_data_structure_2` actually uses as a base class for the class of `CGAL::Triangulation_data_structure_2::Vertex`. -\cgalHasModel `CGAL::Triangulation_ds_vertex_base_2` +\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` \sa `CGAL::Triangulation_data_structure_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h index b2c1b5a0886c..a5daedcbc28e 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h @@ -64,7 +64,8 @@ the rank of this item in the output order. When dimension \f$ <\f$ 2, the same information is output for faces of maximal dimension instead of faces. -\cgalHasModel `CGAL::Triangulation_data_structure_2` +\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2::Face` \sa `TriangulationDataStructure_2::Vertex` @@ -726,7 +727,8 @@ In order to obtain new vertices or destruct unused vertices, the user must call the `create_vertex()` and `delete_vertex()` methods of the triangulation data structure. -\cgalHasModel `CGAL::Triangulation_ds_vertex_base_2` +\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` \sa `TriangulationDataStructure_2::Face` @@ -847,7 +849,8 @@ The methods `create_face()` and have to be used to define new faces and to delete no longer used faces. -\cgalHasModel `CGAL::Triangulation_ds_face_base_2` +\cgalHasModelsBegin CGAL::Triangulation_ds_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` \sa `TriangulationDataStructure_2` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h index 4ce03689c740..59f5b45bbe2a 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h @@ -33,7 +33,8 @@ cell classes. The rebound base classes so obtained are the classes which are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. -\cgalHasModel `CGAL::Triangulation_ds_cell_base_3` +\cgalHasModelsBegin CGAL::Triangulation_ds_cell_base_3 +\cgalHasModelsEnd \sa `TriangulationDSVertexBase_3` \sa `CGAL::Triangulation_data_structure_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h index eef2cf0d3d4f..9ef2cd34bbc6 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h @@ -28,7 +28,8 @@ cell classes. The rebound base classes so obtained are the classes which are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. -\cgalHasModel `CGAL::Triangulation_ds_vertex_base_3` +\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_3 +\cgalHasModelsEnd \sa `TriangulationDSCellBase_3` \sa `CGAL::Triangulation_data_structure_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h index 081f9f985138..a2c6d41e9334 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h @@ -65,7 +65,8 @@ neighbors of each cell, where the index corresponds to the preceding list of cells. When dimension < 3, the same information is stored for faces of maximal dimension instead of cells. -\cgalHasModel `CGAL::Triangulation_data_structure_3` +\cgalHasModelsBegin CGAL::Triangulation_data_structure_3 +\cgalHasModelsEnd \sa `TriangulationDataStructure_3::Vertex` \sa `TriangulationDataStructure_3::Cell` diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h index 01d05c5c873d..aa3f4d68dc1c 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h @@ -6,7 +6,8 @@ Cell base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. -\cgalHasModel `CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3` +\cgalHasModelsBegin CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 +\cgalHasModelsEnd */ class RemeshingCellBase_3 diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h index d275fbc03a71..ad71f044d997 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h @@ -10,7 +10,7 @@ of the class `Remeshing_triangulation_3`. It defines the geometric objects (points, segments, triangles, and tetrahedra) forming the triangulation together with a few geometric predicates and constructions on these objects. -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `CGAL::Triangulation_3` */ diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h index 0e9b0e86003e..2b1b5bc8fc3f 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h @@ -6,7 +6,8 @@ Vertex base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. -\cgalHasModel `Tetrahedral_remeshing::Remeshing_vertex_base_3` +\cgalHasModelsBegin Tetrahedral_remeshing::Remeshing_vertex_base_3 +\cgalHasModelsEnd */ class RemeshingVertexBase_3 diff --git a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h index 670217bb50db..14395b71b936 100644 --- a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h @@ -9,8 +9,9 @@ a Delaunay triangulation. It corresponds to the first template parameter of the \cgalRefines{TriangulationTraits} -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` +\cgalHasModelsBegin CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModelsEnd \sa `TriangulationTraits` */ diff --git a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h index 00ec18a9e8cd..35b31839b7ab 100644 --- a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h @@ -9,8 +9,9 @@ a regular triangulation. It corresponds to the first template parameter of the c \cgalRefines{TriangulationTraits} -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` +\cgalHasModelsBegin CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModelsEnd \sa `TriangulationTraits` */ diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h index 24188ada1035..d92afbd427e6 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h @@ -15,7 +15,8 @@ The dimension of a face is implicitly set when `TriangulationDSFace::set_index` is called two times to set the first two vertices (`i = 0` and `i = 1`), then the dimension is 1. -\cgalHasModel `CGAL::Triangulation_face` +\cgalHasModelsBegin CGAL::Triangulation_face +\cgalHasModelsEnd \sa `TriangulationDSFullCell` \sa `TriangulationDSVertex` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h index a29eef833969..3e32c2423a22 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h @@ -36,8 +36,9 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::FullCell} -\cgalHasModel `CGAL::Triangulation_ds_full_cell` -\cgalHasModel `CGAL::Triangulation_full_cell` +\cgalHasModelsBegin CGAL::Triangulation_ds_full_cell +\cgalHasModels CGAL::Triangulation_full_cell +\cgalHasModelsEnd \sa `TriangulationDSVertex` \sa `TriangulationDSFace` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h index 30b22c4994b0..c23aaabe1ea7 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h @@ -36,8 +36,9 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::Vertex} -\cgalHasModel `CGAL::Triangulation_ds_vertex` -\cgalHasModel `CGAL::Triangulation_vertex` +\cgalHasModelsBegin CGAL::Triangulation_ds_vertex +\cgalHasModels CGAL::Triangulation_vertex +\cgalHasModelsEnd \sa `TriangulationDSFullCell` \sa `TriangulationDSFace` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h index 3e3228db4c99..c17ded6feb1e 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h @@ -69,7 +69,8 @@ The classes `Vertex` and `Full_cell` have to provide the relevant I/O operators (possibly empty). -\cgalHasModel `CGAL::Triangulation_data_structure` +\cgalHasModelsBegin CGAL::Triangulation_data_structure +\cgalHasModelsEnd \sa `TriangulationDataStructure::Vertex` \sa `TriangulationDataStructure::FullCell` @@ -660,8 +661,9 @@ It sets requirements of combinatorial nature only, as geometry is not concerned here. In particular, we only require that the vertex holds a handle to a full cell incident to it in the triangulation. -\cgalHasModel `CGAL::Triangulation_ds_vertex` -\cgalHasModel `CGAL::Triangulation_vertex` +\cgalHasModelsBegin CGAL::Triangulation_ds_vertex +\cgalHasModels CGAL::Triangulation_vertex +\cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` \sa `TriangulationDataStructure::Face` @@ -767,8 +769,9 @@ full cell as well as handles to the adjacent full cells. Two full cells are said to be adjacent when they share a facet. Adjacent full cells are called hereafter neighbors. -\cgalHasModel `CGAL::Triangulation_ds_full_cell` -\cgalHasModel `CGAL::Triangulation_full_cell` +\cgalHasModelsBegin CGAL::Triangulation_ds_full_cell +\cgalHasModels CGAL::Triangulation_full_cell +\cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` \sa `TriangulationDataStructure::Face` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h index 74750c4117a2..eba0214810a1 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h @@ -10,7 +10,8 @@ represent a full cell. \cgalRefines{TriangulationDSFullCell We only list below the additional specific requirements of `TriangulationFullCell`} -\cgalHasModel `CGAL::Triangulation_full_cell` +\cgalHasModelsBegin CGAL::Triangulation_full_cell +\cgalHasModelsEnd \sa `CGAL::Triangulation_full_cell` \sa `TriangulationVertex` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h index 87018c11c3ce..3d004b52c286 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h @@ -14,8 +14,9 @@ traits must refine `SpatialSortingTraits_d`. The insertion is then optimized using spatial sorting. This is not required if the points are inserted one by one. -\cgalHasModel `CGAL::Epick_d` -\cgalHasModel `CGAL::Epeck_d` +\cgalHasModelsBegin CGAL::Epick_d +\cgalHasModels CGAL::Epeck_d +\cgalHasModelsEnd \sa `DelaunayTriangulationTraits` */ diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h index 0ea829717934..956acd269f14 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h @@ -12,7 +12,8 @@ We only list below the additional specific requirements of ::TriangulationVertex Compared to ::TriangulationDSVertex, the main difference is the addition of an association of the vertex with a geometric point. -\cgalHasModel `CGAL::Triangulation_vertex` +\cgalHasModelsBegin CGAL::Triangulation_vertex +\cgalHasModelsEnd \cgalHeading{Input/Output} diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h index f0483d539cc8..bf4b52d43c46 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h @@ -17,10 +17,10 @@ The concept `ConstrainedDelaunayTriangulationTraits_2` refines both the concept \cgalRefines{DelaunayTriangulationTraits_2,ConstrainedTriangulationTraits_2} -\cgalHasModel All \cgal Kernels -\cgalHasModel `CGAL::Projection_traits_xy_3` -\cgalHasModel `CGAL::Projection_traits_yz_3` -\cgalHasModel `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd \sa `TriangulationTraits_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h index 1d49d678c471..a5a98882faa6 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h @@ -19,7 +19,8 @@ constraints. Defines the same types as the `TriangulationFaceBase_2` concept -\cgalHasModel `CGAL::Constrained_triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Constrained_triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationFaceBase_2` \sa `CGAL::Constrained_triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h index 6f7a9e5ea858..0af956128561 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h @@ -19,11 +19,11 @@ to compute the squared distance between a point and a line \cgalRefines{TriangulationTraits_2} -\cgalHasModel All \cgal Kernels -\cgalHasModel `CGAL::Projection_traits_3` -\cgalHasModel `CGAL::Projection_traits_xy_3` -\cgalHasModel `CGAL::Projection_traits_yz_3` -\cgalHasModel `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_3 +\cgalHasModels CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd \sa `TriangulationTraits_2` \sa `ConstrainedDelaunayTriangulationTraits_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h index 32b251a50604..d223c281d3c0 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h @@ -22,12 +22,12 @@ required if the method `nearest_vertex()` is used. \cgalRefines{TriangulationTraits_2} -\cgalHasModel \cgal kernels -\cgalHasModel `CGAL::Projection_traits_3` (not for dual Voronoi functions) -\cgalHasModel `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions) -\cgalHasModel `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions) -\cgalHasModel `CGAL::Projection_traits_yz_3` (not for dual Voronoi functions) -\cgalHasModel `CGAL::Projection_traits_xz_3` (not for dual Voronoi functions) +\cgalHasModelsBare{All models of the \cgal concept `Kernel`\n + `CGAL::Projection_traits_3` (not for dual Voronoi functions)\n + `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)\n + `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)\n + `CGAL::Projection_traits_yz_3` (not for dual Voronoi functions)\n + `CGAL::Projection_traits_xz_3` (not for dual Voronoi functions)} \sa `TriangulationTraits_2` */ diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h index 6d69fe98604e..26c24a4e86ba 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h @@ -34,7 +34,8 @@ in the face a list to store hidden vertices. \cgalRefines{TriangulationFaceBase_2} -\cgalHasModel `CGAL::Regular_triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Regular_triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationFaceBase_2` \sa `RegularTriangulationVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h index 89ae384c8bfa..e935587ab864 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h @@ -18,7 +18,7 @@ of Delaunay triangulations. \cgalRefines{TriangulationTraits_2} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `CGAL::Regular_triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h index 62230e270a73..af73baa96815 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h @@ -35,7 +35,8 @@ vertex of the triangulation or a hidden vertex. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Regular_triangulation_vertex_base_2` +\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationVertexBase_2` \sa `CGAL::Regular_triangulation_vertex_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h index 353f56310609..17ee831ec0be 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h @@ -16,7 +16,8 @@ and only provided for symmetry with the vertex case. \cgalRefines{TriangulationDSFaceBase_2} -\cgalHasModel `CGAL::Triangulation_face_base_2` +\cgalHasModelsBegin CGAL::Triangulation_face_base_2 +\cgalHasModelsEnd \sa `TriangulationVertexBase_2` \sa `CGAL::Triangulation_face_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h index 5d473eabfb6d..497c1fadde72 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h @@ -14,7 +14,8 @@ next and previous level triangulations. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Triangulation_hierarchy_vertex_base_2` +\cgalHasModelsBegin CGAL::Triangulation_hierarchy_vertex_base_2 +\cgalHasModelsEnd \sa `CGAL::Triangulation_hierarchy_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h index eeee95725166..f158bbeea8d6 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h @@ -12,11 +12,11 @@ provides the types of the geometric primitives used in the triangulation and some function object types for the required predicates on those primitives. -\cgalHasModel All models of `Kernel`. -\cgalHasModel `CGAL::Projection_traits_3` -\cgalHasModel `CGAL::Projection_traits_xy_3` -\cgalHasModel `CGAL::Projection_traits_yz_3` -\cgalHasModel `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_3 +\cgalHasModels CGAL::Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd \sa `CGAL::Triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h index 0ce1e0012c96..c5e59974834d 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModel `CGAL::Triangulation_vertex_base_with_info_2` +\cgalHasModelsBegin CGAL::Triangulation_vertex_base_with_info_2 +\cgalHasModelsEnd */ diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h index bec156dc516f..816e93b382ac 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h @@ -15,7 +15,8 @@ the vertex base of a triangulation stores a point. \cgalRefines{TriangulationDSVertexBase_2} -\cgalHasModel `CGAL::Triangulation_vertex_base_2` +\cgalHasModelsBegin CGAL::Triangulation_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `TriangulationDataStructure_2::Vertex` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h index b6e1a9b25158..4df0ce0f7527 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h @@ -11,8 +11,9 @@ in the cell an operator that computes its circumcenter. \cgalRefines{TriangulationCellBase_3} -\cgalHasModel `CGAL::Delaunay_triangulation_cell_base_3` -\cgalHasModel `CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3` +\cgalHasModelsBegin CGAL::Delaunay_triangulation_cell_base_3 +\cgalHasModels CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3 +\cgalHasModelsEnd \sa `DelaunayTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h index c1f46f3fb4ff..b727b6013c9d 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h @@ -10,13 +10,14 @@ predicates and constructions on these objects. \cgalRefines{TriangulationTraits_3} -\cgalHasModel `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended) -\cgalHasModel `CGAL::Exact_predicates_exact_constructions_kernel` (recommended for Voronoi) -\cgalHasModel `CGAL::Filtered_kernel` -\cgalHasModel `CGAL::Cartesian` -\cgalHasModel `CGAL::Simple_cartesian` -\cgalHasModel `CGAL::Homogeneous` -\cgalHasModel `CGAL::Simple_homogeneous` +\cgalHasModelsBegin CGAL::Exact_predicates_inexact_constructions_kernel (recommended) +\cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel (recommended for Voronoi) +\cgalHasModels CGAL::Filtered_kernel +\cgalHasModels CGAL::Cartesian +\cgalHasModels CGAL::Simple_cartesian +\cgalHasModels CGAL::Homogeneous +\cgalHasModels CGAL::Simple_homogeneous +\cgalHasModelsEnd In addition to the requirements described for the traits class of `CGAL::Triangulation_3`, the geometric traits class of a diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h index 4f83db499d7f..9c7764481069 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h @@ -19,7 +19,8 @@ circumcenter by calling `invalidate_weighted_circumcenter_cache()`. \cgalRefines{RegularTriangulationCellBase_3} -\cgalHasModel `CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3` +\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 +\cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h index 7a00e04f1d8b..b7362aca63ff 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h @@ -35,7 +35,8 @@ and an operator to compute its weighted circumcenter. \cgalRefines{TriangulationCellBase_3} -\cgalHasModel `CGAL::Regular_triangulation_cell_base_3` +\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_3 +\cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h index 91057fe887f9..41cd3c59fbc1 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h @@ -15,7 +15,7 @@ or the weighted point \f$ {p}^{(w)}=(p,w_p)\f$. \cgalRefines{TriangulationTraits_3} -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `CGAL::Regular_triangulation_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h index 3881593c2d3f..aa5da85428da 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h @@ -9,7 +9,8 @@ by adding a geometric point member. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModel `CGAL::Regular_triangulation_vertex_base_3` +\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_3 +\cgalHasModelsEnd \sa `RegularTriangulationCellBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h index 5064256e4454..4efba49955ac 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationCellBase_3} -\cgalHasModel `CGAL::Triangulation_cell_base_with_info_3` +\cgalHasModelsBegin CGAL::Triangulation_cell_base_with_info_3 +\cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h index 69ae982347cb..419ba6c4417a 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h @@ -10,8 +10,9 @@ structure apply. \cgalRefines{TriangulationDSCellBase_3} -\cgalHasModel `CGAL::Triangulation_cell_base_3` -\cgalHasModel `CGAL::Triangulation_cell_base_with_info_3` +\cgalHasModelsBegin CGAL::Triangulation_cell_base_3 +\cgalHasModels CGAL::Triangulation_cell_base_with_info_3 +\cgalHasModelsEnd \sa `TriangulationVertexBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h index d7c62d3e4c62..96a428da0503 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h @@ -11,7 +11,7 @@ triangles and tetrahedra) forming the triangulation together with a few geometric predicates and constructions on these objects: lexicographical comparison, orientation in case of coplanar points and orientation in space. -\cgalHasModel All models of `Kernel`. +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} \sa `CGAL::Triangulation_3` */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h index c9cf46d00629..2801c4580136 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_3} -\cgalHasModel `CGAL::Triangulation_vertex_base_with_info_3` +\cgalHasModelsBegin CGAL::Triangulation_vertex_base_with_info_3 +\cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h index cd91c12e9a86..75d23eb5581a 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h @@ -9,8 +9,9 @@ for the triangulation data structure. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModel `CGAL::Triangulation_vertex_base_3` -\cgalHasModel `CGAL::Triangulation_vertex_base_with_info_3` +\cgalHasModelsBegin CGAL::Triangulation_vertex_base_3 +\cgalHasModels CGAL::Triangulation_vertex_base_with_info_3 +\cgalHasModelsEnd \sa `TriangulationCellBase_3` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h index 397c3a7e7992..d73727aaabc0 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h @@ -11,8 +11,9 @@ parameter of the class `CGAL::Delaunay_triangulation_on_sphere_2`. To the requirements listed within the concept `TriangulationOnSphereTraits_2`, this concept adds types and functors requirements related to build the dual on the sphere. -\cgalHasModel `CGAL::Delaunay_triangulation_on_sphere_traits_2` -\cgalHasModel `CGAL::Projection_on_sphere_traits_3` +\cgalHasModelsBegin CGAL::Delaunay_triangulation_on_sphere_traits_2 +\cgalHasModels CGAL::Projection_on_sphere_traits_3 +\cgalHasModelsEnd */ class DelaunayTriangulationOnSphereTraits_2 { diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h index fbb6ac030edc..0d1fe175810c 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h @@ -19,7 +19,8 @@ then the triangulation is not an orientable triangulated surface without boundar In this case, fictitious faces are added to the triangulation, called ghost faces, such that the triangulation is a topological sphere. -\cgalHasModel `CGAL::Triangulation_on_sphere_face_base_2` +\cgalHasModelsBegin CGAL::Triangulation_on_sphere_face_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `TriangulationOnSphereVertexBase_2` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h index 0dad5563ff72..4ccf99b9a261 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h @@ -13,8 +13,9 @@ triangulation and the function object types for the required predicates on those In particular, the traits class is expected to contain information about the sphere (center and radius) on which the points of the triangulation lie, as well as to provide means to change this information. -\cgalHasModel `CGAL::Delaunay_triangulation_on_sphere_traits_2` -\cgalHasModel `CGAL::Projection_on_sphere_traits_3` +\cgalHasModelsBegin CGAL::Delaunay_triangulation_on_sphere_traits_2 +\cgalHasModels CGAL::Projection_on_sphere_traits_3 +\cgalHasModelsEnd \sa `DelaunayTriangulationOnSphereTraits_2` */ diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h index 23b6971fd895..7701fde798b9 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h @@ -9,7 +9,8 @@ of a triangulation data structure to be plugged in a triangulation on the sphere It refines the concept `TriangulationDSVertexBase_2`, adding geometric information: the vertex base of a triangulation stores a point. -\cgalHasModel `CGAL::Triangulation_on_sphere_vertex_base_2` +\cgalHasModelsBegin CGAL::Triangulation_on_sphere_vertex_base_2 +\cgalHasModelsEnd \sa `TriangulationDataStructure_2` \sa `TriangulationOnSphereFaceBase_2` diff --git a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h index 46213272fa93..3d656b13a16f 100644 --- a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h +++ b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h @@ -6,9 +6,10 @@ A model of the `Visibility_2` concept can be attached to an `Arrangement_2` instance to answer visibility queries within the faces of this arrangement. -\cgalHasModel `CGAL::Simple_polygon_visibility_2` -\cgalHasModel `CGAL::Rotational_sweep_visibility_2` -\cgalHasModel `CGAL::Triangular_expansion_visibility_2` +\cgalHasModelsBegin CGAL::Simple_polygon_visibility_2 +\cgalHasModels CGAL::Rotational_sweep_visibility_2 +\cgalHasModels CGAL::Triangular_expansion_visibility_2 +\cgalHasModelsEnd */ class Visibility_2 { diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h index 218a51a9d103..916a678290fa 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h @@ -13,15 +13,16 @@ graph they take as an argument, the last ones does. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Identity_policy_2` -\cgalHasModel `CGAL::Apollonius_graph_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Delaunay_triangulation_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Regular_triangulation_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2` +\cgalHasModelsBegin CGAL::Identity_policy_2 +\cgalHasModels CGAL::Apollonius_graph_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Delaunay_triangulation_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Regular_triangulation_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2 +\cgalHasModelsEnd \sa `DelaunayGraph_2` \sa `AdaptationTraits_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h index bdd875609361..941a0b9dfbe9 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h @@ -11,10 +11,11 @@ tag is provided for determining whether this functor is defined or not. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModel `CGAL::Apollonius_graph_adaptation_traits_2` -\cgalHasModel `CGAL::Delaunay_triangulation_adaptation_traits_2` -\cgalHasModel `CGAL::Regular_triangulation_adaptation_traits_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_adaptation_traits_2` +\cgalHasModelsBegin CGAL::Apollonius_graph_adaptation_traits_2 +\cgalHasModels CGAL::Delaunay_triangulation_adaptation_traits_2 +\cgalHasModels CGAL::Regular_triangulation_adaptation_traits_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_adaptation_traits_2 +\cgalHasModelsEnd \sa `DelaunayGraph_2` \sa `CGAL::Voronoi_diagram_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h index 3459c48dc9f4..01749c2be48b 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h @@ -18,13 +18,13 @@ iterators and circulators that allow to traverse it (completely or partially). All iterators and circulators must be convertible to the corresponding handles. -\cgalHasModel `CGAL::Delaunay_triangulation_2` -\cgalHasModel `CGAL::Regular_triangulation_2` -\cgalHasModel `CGAL::Triangulation_hierarchy_2` provided that `Tr` is a model of `DelaunayGraph_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_2` -\cgalHasModel `CGAL::Segment_Delaunay_graph_hierarchy_2` -\cgalHasModel `CGAL::Apollonius_graph_2` -\cgalHasModel `CGAL::Apollonius_graph_hierarchy_2` +\cgalHasModelsBareBegin{ `CGAL::Triangulation_hierarchy_2` provided that `Tr` is a model of `DelaunayGraph_2`} CGAL::Delaunay_triangulation_2 +\cgalHasModels CGAL::Regular_triangulation_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_2 +\cgalHasModels CGAL::Segment_Delaunay_graph_hierarchy_2 +\cgalHasModels CGAL::Apollonius_graph_2 +\cgalHasModels CGAL::Apollonius_graph_hierarchy_2 +\cgalHasModelsEnd \sa `AdaptationTraits_2` \sa `AdaptationPolicy_2` diff --git a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h index 4b882bd82d51..a6f6793d19c3 100644 --- a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h +++ b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h @@ -5,11 +5,10 @@ A concept that describes the set of requirements of classes used in the computation of analytic weights in 2D. -\cgalHasModel -- All models of `Kernel` -- `CGAL::Projection_traits_xy_3` -- `CGAL::Projection_traits_yz_3` -- `CGAL::Projection_traits_xz_3` +\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} sCGAL:Projection_traits_xy_3 +\cgalHasModels CGAL::Projection_traits_yz_3 +\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsEnd */ class AnalyticWeightTraits_2 { diff --git a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h index 3560a85f4789..5aab656b6128 100644 --- a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h +++ b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h @@ -5,8 +5,7 @@ A concept that describes the set of requirements of classes used in the computation of analytic weights in 3D. -\cgalHasModel -- All models of `Kernel` +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} */ class AnalyticWeightTraits_3 { diff --git a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h index 89638d209f6d..95d700e8e512 100644 --- a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h +++ b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h @@ -5,10 +5,10 @@ A concept that describes the set of methods required in all classes used in the computation of 2D generalized barycentric weights. -\cgalHasModel -- `CGAL::Weights::Wachspress_weights_2` -- `CGAL::Weights::Mean_value_weights_2` -- `CGAL::Weights::Discrete_harmonic_weights_2` +\cgalHasModelsBegin CGAL::Weights::Wachspress_weights_2 +\cgalHasModels CGAL::Weights::Mean_value_weights_2 +\cgalHasModels CGAL::Weights::Discrete_harmonic_weights_2 +\cgalHasModelsEnd */ class BarycentricWeights_2 { From 806ffa9385e985216b34f870ad21b32982c2272e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 17:40:28 +0200 Subject: [PATCH 0467/1398] remove TODO I don't think a predicate sorting planes along a ray would be faster than directly using intersection coordinates --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 693c00676f05..122c595b13e8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -959,7 +959,6 @@ void generate_subtriangles(std::size_t ti, { if(!points_on_segments[i].empty()) { - // TODO: predicate on input triangles int coord = 0; std::size_t src_id = segments[i].first, tgt_id = segments[i].second; typename EK::Point_3 src = points[src_id], tgt=points[tgt_id]; From d55638cfd18dbee452a710e0a852909dafd9c5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 17:49:14 +0200 Subject: [PATCH 0468/1398] remove unused variable --- STL_Extension/test/STL_Extension/test_skiplist.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/STL_Extension/test/STL_Extension/test_skiplist.cpp b/STL_Extension/test/STL_Extension/test_skiplist.cpp index f0f61b5f803f..52d21b0ce25a 100644 --- a/STL_Extension/test/STL_Extension/test_skiplist.cpp +++ b/STL_Extension/test/STL_Extension/test_skiplist.cpp @@ -60,7 +60,6 @@ BOOST_FIXTURE_TEST_CASE( test_insert, Fixture ) skips.begin(), skips.end()); // the same goes for inserting at an arbitrary position - skip::all_iterator pos = boost::next(l.all_begin(), 3); l.insert(boost::next(l.all_begin(), 3) , 20); all.insert(boost::next(all.begin(), 3) From 01ecc02e71bb86203c2c86e8b2e3728e19659fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 17:51:07 +0200 Subject: [PATCH 0469/1398] fix conversion warnings --- STL_Extension/test/STL_Extension/test_skiplist.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STL_Extension/test/STL_Extension/test_skiplist.cpp b/STL_Extension/test/STL_Extension/test_skiplist.cpp index 52d21b0ce25a..54ee29a352b0 100644 --- a/STL_Extension/test/STL_Extension/test_skiplist.cpp +++ b/STL_Extension/test/STL_Extension/test_skiplist.cpp @@ -50,8 +50,8 @@ BOOST_FIXTURE_TEST_CASE( test_insert, Fixture ) // clear and try again l.clear(); - BOOST_CHECK_EQUAL(l.all_size(), 0); - BOOST_CHECK_EQUAL(l.skip_size(), 0); + BOOST_CHECK_EQUAL(l.all_size(), std::size_t(0)); + BOOST_CHECK_EQUAL(l.skip_size(), std::size_t(0)); l.insert(l.all_begin(), all.begin(), all.end()); skips += 8, 9; BOOST_CHECK_EQUAL_COLLECTIONS(l.all_begin(), l.all_end(), @@ -123,7 +123,7 @@ BOOST_FIXTURE_TEST_CASE( skip_all_case, Fixture ) l.skip(l.all_begin(), l.all_end()); skips.clear(); BOOST_CHECK_EQUAL(l.all_size(), all.size()); - BOOST_CHECK_EQUAL(l.skip_size(), 0); + BOOST_CHECK_EQUAL(l.skip_size(), std::size_t(0)); BOOST_CHECK_EQUAL_COLLECTIONS(l.skip_begin(), l.skip_end(), skips.begin(), skips.end()); } From 5673ccfc7185e2e66e9d2d034caa029605e5ea3c Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 6 Jul 2023 18:04:38 +0200 Subject: [PATCH 0470/1398] Spelling corrections Spelling correction `a edge` to `an edge` --- AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h | 2 +- BGL/include/CGAL/boost/graph/Face_filtered_graph.h | 2 +- .../benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h | 2 +- Nef_2/include/CGAL/Nef_2/PM_point_locator.h | 2 +- Nef_3/include/CGAL/Nef_3/SNC_simplify.h | 2 +- Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h | 2 +- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 2 +- .../CGAL/Straight_skeleton_2/Straight_skeleton_builder_2_impl.h | 2 +- .../CGAL/Surface_mesh_simplification/internal/Edge_collapse.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index fe85c35d3662..62484d59653b 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -33,7 +33,7 @@ namespace CGAL { /*! * \ingroup PkgAABBTreeRef - * Primitive type for a edge of a polyhedral surface. + * Primitive type for an edge of a polyhedral surface. * It wraps an `edge_descriptor` into a 3D segment. * The class model of `HalfedgeGraph` from which the primitive is built should not be deleted * while the AABB tree holding the primitive is in use. diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index e6f4136481d9..3a0a851b6826 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -42,7 +42,7 @@ namespace CGAL { * boost::filtered_graph, * this class only requires a way to access the selected faces and will automatically select the * edges/halfedges and vertices present in the adapted graph. A vertex is selected if it is incident to at least one - * selected face. A edge is selected if it is incident to at least a selected face. A halfedge is selected if its edge + * selected face. An edge is selected if it is incident to at least a selected face. A halfedge is selected if its edge * is selected. * * Since this class is a model of the `FaceGraph` concept, there is a restriction on the set of selected faces: diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h index f092321e4a9e..295b1c8ba2b2 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/surface_mesh/Surface_mesh.h @@ -1103,7 +1103,7 @@ class Surface_mesh { return Halfedge_property(hprops_.add(name, t)); } - /** add a edge property of type \c T with name \c name and default value \c t. + /** add an edge property of type \c T with name \c name and default value \c t. fails if a property named \c name exists already, since the name has to be unique. in this case it returns an invalid property */ template Edge_property add_edge_property(const std::string& name, const T t=T()) diff --git a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h index ede8d2b033a9..c03e60e3fcfc 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_point_locator.h +++ b/Nef_2/include/CGAL/Nef_2/PM_point_locator.h @@ -159,7 +159,7 @@ class PM_naive_point_locator : public PM_decorator_ { const Direction& d, bool& collinear) const /*{\Xop returns a halfedge |e| bounding a wedge in between two neighbored edges in the adjacency list of |v| which contains |d|. - If |d| extends along a edge then |e| is this edge. If |d| extends + If |d| extends along an edge then |e| is this edge. If |d| extends into the interior of such a wedge then |e| is the first edge hit when |d| is rotated clockwise. \precond |v| is not isolated.}*/ { CGAL_NEF_TRACEN("out_wedge "< { } bool is_part_of_edge(Vertex_handle v) { - /* determines if a vertex v is part of a edge, checking at its local + /* determines if a vertex v is part of an edge, checking at its local graph for exactly two antipodal vertices */ SM_decorator SD(&*v); diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h b/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h index 8dbce0ced5ed..563c5471b455 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_point_locator.h @@ -119,7 +119,7 @@ class SM_point_locator : public SM_decorator { bool& collinear) const /*{\Xop returns a halfedge |e| bounding a wedge in between two neighbored edges in the adjacency list of |v| which contains |d|. - If |d| extends along a edge then |e| is this edge. If |d| extends + If |d| extends along an edge then |e| is this edge. If |d| extends into the interior of such a wedge then |e| is the first edge hit when |d| is rotated clockwise. \precond |v| is not isolated.}*/ { CGAL_NEF_TRACEN("out_wedge "<::CollectNewEvents( Vertex_handle aNode // or vertex events (or edge events of course). // // Each vertex wavefront (reflex or not) results in one and only one event from a set of possible events. - // It can result in a edge event against the vertex wavefronts emerging from the adjacent vertices (in the current polygon, not + // It can result in an edge event against the vertex wavefronts emerging from the adjacent vertices (in the current polygon, not // in the input polygon); or it can result in a split event (or vertex event) against any other wavefront in the rest of // current polygon. diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h index a662b4c24c0b..612b9182046c 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Edge_collapse.h @@ -697,7 +697,7 @@ is_constrained(const vertex_descriptor v) const } // Some edges are NOT collapsible: doing so would break the topological consistency of the mesh. -// This function returns true if a edge 'p->q' can be collapsed. +// This function returns true if an edge 'p->q' can be collapsed. // // An edge p->q can be collapsed iff it satisfies the "link condition" // (as described in the "Mesh Optimization" article of Hoppe et al (1993)) From 86ae851ee2d1487425082a0d3b5b7b9600af8a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 6 Jul 2023 18:20:35 +0200 Subject: [PATCH 0471/1398] renaming requires to update the doc too... --- Triangulation/doc/Triangulation/Triangulation.txt | 4 ++-- Triangulation/doc/Triangulation/examples.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index c992f6d7cd31..b64ad247c361 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -347,8 +347,8 @@ ask the triangulation to construct the set of edges (\f$ 1\f$ dimensional faces) incident to the vertex at infinity. It is easy to see that these edges are in bijection with the vertices on the convex hull of the points. This gives us a handy way to count the convex hull vertices -(include files triangulation1.cpp and -triangulation2.cpp are given and commented below). +(include files triangulation1.h and +triangulation2.h are given and commented below). \cgalExample{triangulation.cpp} diff --git a/Triangulation/doc/Triangulation/examples.txt b/Triangulation/doc/Triangulation/examples.txt index 36db1597b8f4..5ced981de5e9 100644 --- a/Triangulation/doc/Triangulation/examples.txt +++ b/Triangulation/doc/Triangulation/examples.txt @@ -3,8 +3,8 @@ \example delaunay_triangulation.cpp \example regular_triangulation.cpp \example triangulation.cpp -\example triangulation1.cpp -\example triangulation2.cpp +\example triangulation1.h +\example triangulation2.h \example triangulation_data_structure_dynamic.cpp \example triangulation_data_structure_static.cpp */ From 5759ce49ae1ff163cda54d07062e8488c1326cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 7 Jul 2023 02:04:01 +0200 Subject: [PATCH 0472/1398] Add unique simplex iterators --- .../include/CGAL/Periodic_2_triangulation_2.h | 151 ++++++- .../Periodic_2_triangulation_iterators_2.h | 325 ++++++++------ .../include/interface_test.h | 26 +- .../include/CGAL/Periodic_3_triangulation_3.h | 413 ++++++++++++------ .../Periodic_3_triangulation_iterators_3.h | 327 ++++++-------- .../CGAL/_test_cls_periodic_3_iterator.h | 160 ++++++- .../_test_cls_periodic_3_triangulation_3.h | 8 +- 7 files changed, 905 insertions(+), 505 deletions(-) diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h index a4ca4e36a30c..2ce4755742a8 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h @@ -119,6 +119,14 @@ class Periodic_2_triangulation_2 /// Unique_vertex_iterator iterates over exactly one representative. typedef Periodic_2_triangulation_unique_vertex_iterator_2 Unique_vertex_iterator; + /// Iterator over the canonical edges, i.e. for each set of periodic copies the + /// Unique_edge_iterator iterates over exactly one representative. + typedef Periodic_2_triangulation_unique_edge_iterator_2 + Unique_edge_iterator; + /// Iterator over the canonical faces, i.e. for each set of periodic copies the + /// Unique_face_iterator iterates over exactly one representative. + typedef Periodic_2_triangulation_unique_face_iterator_2 + Unique_face_iterator; /// \name For compatibility with the Triangulation_2 class // \{ @@ -676,6 +684,32 @@ class Periodic_2_triangulation_2 Periodic_2_triangulation_2_internal::Domain_tester(this)); } + Unique_edge_iterator unique_edges_begin() const + { + return CGAL::filter_iterator(edges_end(), + Periodic_2_triangulation_2_internal::Domain_tester(this), + edges_begin()); + } + /// past-the-end iterator over the canonical edges + Unique_edge_iterator unique_edges_end() const + { + return CGAL::filter_iterator(edges_end(), + Periodic_2_triangulation_2_internal::Domain_tester(this)); + } + + Unique_face_iterator unique_faces_begin() const + { + return CGAL::filter_iterator(faces_end(), + Periodic_2_triangulation_2_internal::Domain_tester(this), + faces_begin()); + } + /// past-the-end iterator over the non-virtual vertices + Unique_face_iterator unique_faces_end() const + { + return CGAL::filter_iterator(faces_end(), + Periodic_2_triangulation_2_internal::Domain_tester(this)); + } + // \} /// \name Geometric iterators //\{ @@ -972,6 +1006,32 @@ class Periodic_2_triangulation_2 return Offset(); } + // Gets the canonicalized offsets of a face. + void get_offsets(Face_handle fh, + Offset& off0, Offset& off1, Offset& off2) const + { + Offset face_off0 = int_to_off(fh->offset(0)); + Offset face_off1 = int_to_off(fh->offset(1)); + Offset face_off2 = int_to_off(fh->offset(2)); + Offset diff_off((face_off0.x() == 1 && face_off1.x() == 1 && face_off2.x() == 1) ? -1 : 0, + (face_off0.y() == 1 && face_off1.y() == 1 && face_off2.y() == 1) ? -1 : 0); + off0 = combine_offsets(get_offset(fh, 0), diff_off); + off1 = combine_offsets(get_offset(fh, 1), diff_off); + off2 = combine_offsets(get_offset(fh, 2), diff_off); + } + + // Gets the canonicalized offsets of an edge. + void get_offsets(const Edge& e, + Offset& off0, Offset& off1) const + { + Offset edge_off0 = int_to_off(e.first->offset(cw(e.second))); + Offset edge_off1 = int_to_off(e.first->offset(ccw(e.second))); + Offset diff_off((edge_off0.x() == 1 && edge_off1.x() == 1) ? -1 : 0, + (edge_off0.y() == 1 && edge_off1.y() == 1) ? -1 : 0); + off0 = combine_offsets(get_offset(e.first, cw(e.second)), diff_off); + off1 = combine_offsets(get_offset(e.first, ccw(e.second)), diff_off); + } + /// Converts an offset to a bit pattern where bit1==offx and bit0==offy. int off_to_int(const Offset & off) const { @@ -986,13 +1046,12 @@ class Periodic_2_triangulation_2 return Offset((i >> 1) & 1, i & 1); } - // \} - // Protected functions of Periodic_2_triangulation_2 - /// Const accessor to the virtual vertices reverse map, - /// used to optimize point location for periodic copies. - const Virtual_vertex_reverse_map &virtual_vertices_reverse() const + /// Tests whether a vertex is a periodic copy of a vertex in the 3-cover. + bool is_virtual(Vertex_handle v) const { - return _virtual_vertices_reverse; + if (is_1_cover()) + return false; + return (_virtual_vertices.find(v) != _virtual_vertices.end()); } /// [Undoc] Returns the non-virtual copy of the vertex. @@ -1007,15 +1066,6 @@ class Periodic_2_triangulation_2 return vh; } - - /// Tests whether a vertex is a periodic copy of a vertex in the 3-cover. - bool is_virtual(Vertex_handle v) - { - if (is_1_cover()) - return false; - return (_virtual_vertices.find(v) != _virtual_vertices.end()); - } - const std::vector& periodic_copies(const Vertex_handle v) const { CGAL_precondition(number_of_sheets() != make_array(1, 1) ); @@ -1024,6 +1074,77 @@ class Periodic_2_triangulation_2 return _virtual_vertices_reverse.find(v)->second; } + // Protected functions of Periodic_2_triangulation_2 + /// Const accessor to the virtual vertices reverse map, + /// used to optimize point location for periodic copies. + const Virtual_vertex_reverse_map& virtual_vertices_reverse() const + { + return _virtual_vertices_reverse; + } + + // check whether pos points onto a unique edge or not. + // If we are computing in 1-sheeted covering this should + // always be true. + bool is_canonical(Face_handle fh) const + { + if(is_1_cover()) + return true; + + Offset off0, off1, off2; + get_offsets(fh, off0, off1, off2); + + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical triangle. + if (off0.x() > 1) return false; + if (off0.y() > 1) return false; + if (off1.x() > 1) return false; + if (off1.y() > 1) return false; + if (off2.x() > 1) return false; + if (off2.y() > 1) return false; + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x() & off2.x(); + int offy = off0.y() & off1.y() & off2.y(); + + return (offx == 0 && offy == 0); + } + + bool is_canonical(const Edge& e) const + { + if(is_1_cover()) + return true; + + // fetch all offsets + Offset off0, off1; + get_offsets(e, off0, off1); + + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical edge. + if (off0.x() > 1) return false; + if (off0.y() > 1) return false; + if (off1.x() > 1) return false; + if (off1.y() > 1) return false; + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x(); + int offy = off0.y() & off1.y(); + + return (offx == 0 && offy == 0); + } + + // checks whether pos points onto a vertex inside the original domain + bool is_canonical(Vertex_handle vh) const + { + return !is_virtual(vh); + } + +public: template Stream& draw_triangulation(Stream& os) const { diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h index afa1a55fce52..9b2afd4ba649 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h @@ -66,7 +66,7 @@ class Periodic_2_triangulation_triangle_iterator_2 { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->faces_end() && !is_canonical() ) + while (pos != _t->faces_end() && !_t->is_canonical(pos) ) ++pos; } } @@ -88,7 +88,7 @@ class Periodic_2_triangulation_triangle_iterator_2 { ++pos; } - while (pos != _t->faces_end() && !is_canonical()); + while (pos != _t->faces_end() && !_t->is_canonical(pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -112,7 +112,7 @@ class Periodic_2_triangulation_triangle_iterator_2 { --pos; } - while (pos != _t->faces_begin() && !is_canonical()); + while (pos != _t->faces_begin() && !_t->is_canonical(pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -172,37 +172,6 @@ class Periodic_2_triangulation_triangle_iterator_2 mutable Periodic_triangle periodic_triangle; // current triangle. private: - // check whether pos points onto a unique edge or not. - // If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() - { - // fetch all offsets - Offset off0, off1, off2; - get_edge_offsets(off0, off1, off2); - - if (_t->number_of_sheets() != make_array(1, 1)) - { - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if (off0.x() > 1) return false; - if (off0.y() > 1) return false; - if (off1.x() > 1) return false; - if (off1.y() > 1) return false; - if (off2.x() > 1) return false; - if (off2.y() > 1) return false; - } - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x() & off2.x(); - int offy = off0.y() & off1.y() & off2.y(); - - return (offx == 0 && offy == 0); - } - // Artificial incrementation function that takes periodic // copies into account. void increment_domain() @@ -217,7 +186,7 @@ class Periodic_2_triangulation_triangle_iterator_2 ++pos; } while (_it == T::UNIQUE_COVER_DOMAIN - && pos != _t->faces_end() && !is_canonical()); + && pos != _t->faces_end() && !_t->is_canonical(pos)); } else { @@ -241,7 +210,7 @@ class Periodic_2_triangulation_triangle_iterator_2 { --pos; } - while (_it == T::UNIQUE_COVER_DOMAIN && !is_canonical()); + while (_it == T::UNIQUE_COVER_DOMAIN && !_t->is_canonical(pos)); _off = get_drawing_offsets(); } else @@ -256,25 +225,6 @@ class Periodic_2_triangulation_triangle_iterator_2 } } - // Get the canonicalized offsets of an edge. - // This works in any cover that is encoded in _t->combine_offsets - void get_edge_offsets(Offset &off0, Offset &off1, - Offset &off2) const - { - Offset face_off0 = _t->int_to_off(pos->offset(0)); - Offset face_off1 = _t->int_to_off(pos->offset(1)); - Offset face_off2 = _t->int_to_off(pos->offset(2)); - Offset diff_off((face_off0.x() == 1 - && face_off1.x() == 1 - && face_off2.x() == 1) ? -1 : 0, - (face_off0.y() == 1 - && face_off1.y() == 1 - && face_off2.y() == 1) ? -1 : 0); - off0 = _t->combine_offsets(_t->get_offset(pos, 0), diff_off); - off1 = _t->combine_offsets(_t->get_offset(pos, 1), diff_off); - off2 = _t->combine_offsets(_t->get_offset(pos, 2), diff_off); - } - // return an integer that encodes the translations which have to be // applied to the edge *pos int get_drawing_offsets() @@ -287,7 +237,7 @@ class Periodic_2_triangulation_triangle_iterator_2 // internally stored inside the cell telling us that this cell // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) - get_edge_offsets(off0, off1, off2); + _t->get_offsets(pos, off0, off1, off2); else { CGAL_assertion(_it == T::STORED_COVER_DOMAIN); @@ -319,7 +269,7 @@ class Periodic_2_triangulation_triangle_iterator_2 { CGAL_assertion(pos != typename T::Face_handle()); Offset off0, off1, off2; - get_edge_offsets(off0, off1, off2); + _t->get_offsets(pos, off0, off1, off2); Offset transl_off = Offset((((_off >> 1) & 1) == 1 ? -1 : 0), (((_off ) & 1) == 1 ? -1 : 0)); if (_it == T::STORED_COVER_DOMAIN) @@ -385,7 +335,7 @@ class Periodic_2_triangulation_segment_iterator_2 { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->edges_end() && !is_canonical() ) + while (pos != _t->edges_end() && !_t->is_canonical(*pos) ) ++pos; } } @@ -407,7 +357,7 @@ class Periodic_2_triangulation_segment_iterator_2 { ++pos; } - while (pos != _t->edges_end() && !is_canonical()); + while (pos != _t->edges_end() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -431,7 +381,7 @@ class Periodic_2_triangulation_segment_iterator_2 { --pos; } - while (pos != _t->edges_begin() && !is_canonical()); + while (pos != _t->edges_begin() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -490,35 +440,6 @@ class Periodic_2_triangulation_segment_iterator_2 mutable Periodic_segment periodic_segment; // current segment. private: - // check whether pos points onto a unique edge or not. - // If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() - { - // fetch all offsets - Offset off0, off1; - get_edge_offsets(off0, off1); - - if (_t->number_of_sheets() != make_array(1, 1)) - { - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if (off0.x() > 1) return false; - if (off0.y() > 1) return false; - if (off1.x() > 1) return false; - if (off1.y() > 1) return false; - } - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x(); - int offy = off0.y() & off1.y(); - - return (offx == 0 && offy == 0); - } - // Artificial incrementation function that takes periodic // copies into account. void increment_domain() @@ -533,7 +454,7 @@ class Periodic_2_triangulation_segment_iterator_2 ++pos; } while (_it == T::UNIQUE_COVER_DOMAIN - && pos != _t->edges_end() && !is_canonical()); + && pos != _t->edges_end() && !_t->is_canonical(*pos)); } else { @@ -557,7 +478,7 @@ class Periodic_2_triangulation_segment_iterator_2 { --pos; } - while (_it == T::UNIQUE_COVER_DOMAIN && !is_canonical()); + while (_it == T::UNIQUE_COVER_DOMAIN && !_t->is_canonical(*pos)); _off = get_drawing_offsets(); } else @@ -572,20 +493,6 @@ class Periodic_2_triangulation_segment_iterator_2 } } - // Get the canonicalized offsets of an edge. - // This works in any cover that is encoded in _t->combine_offsets - void get_edge_offsets(Offset &off0, Offset &off1) const - { - Offset cell_off0 = _t->int_to_off(pos->first->offset(_t->cw(pos->second))); - Offset cell_off1 = _t->int_to_off(pos->first->offset(_t->ccw(pos->second))); - Offset diff_off((cell_off0.x() == 1 && cell_off1.x() == 1) ? -1 : 0, - (cell_off0.y() == 1 && cell_off1.y() == 1) ? -1 : 0); - off0 = _t->combine_offsets(_t->get_offset(pos->first, _t->cw(pos->second)), - diff_off); - off1 = _t->combine_offsets(_t->get_offset(pos->first, _t->ccw(pos->second)), - diff_off); - } - // return an integer that encodes the translations which have to be // applied to the edge *pos int get_drawing_offsets() @@ -598,7 +505,7 @@ class Periodic_2_triangulation_segment_iterator_2 // internally stored inside the cell telling us that this cell // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) - get_edge_offsets(off0, off1); + _t->get_offsets(*pos, off0, off1); else { CGAL_assertion(_it == T::STORED_COVER_DOMAIN); @@ -618,7 +525,7 @@ class Periodic_2_triangulation_segment_iterator_2 { CGAL_assertion(pos->first != typename T::Face_handle()); Offset off0, off1; - get_edge_offsets(off0, off1); + _t->get_offsets(*pos, off0, off1); Offset transl_off = Offset((((_off >> 1) & 1) == 1 ? -1 : 0), (( _off & 1) == 1 ? -1 : 0)); if (_it == T::STORED_COVER_DOMAIN) @@ -681,7 +588,7 @@ class Periodic_2_triangulation_point_iterator_2 { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->vertices_end() && !is_canonical() ) + while (pos != _t->vertices_end() && !_t->is_canonical(pos) ) ++pos; } } @@ -705,7 +612,7 @@ class Periodic_2_triangulation_point_iterator_2 { ++pos; } - while (pos != _t->vertices_end() && !is_canonical()); + while (pos != _t->vertices_end() && !_t->is_canonical(pos)); break; default: CGAL_assertion(false); @@ -727,7 +634,7 @@ class Periodic_2_triangulation_point_iterator_2 { --pos; } - while (pos != _t->vertices_begin() && !is_canonical()); + while (pos != _t->vertices_begin() && !_t->is_canonical(pos)); break; default: CGAL_assertion(false); @@ -785,14 +692,6 @@ class Periodic_2_triangulation_point_iterator_2 mutable Periodic_point periodic_point; // current point. private: - // check whether pos points onto a vertex inside the original - // domain. If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() - { - return (_t->get_offset(pos).is_null()); - } - Periodic_point construct_periodic_point() const { CGAL_assertion(pos != typename T::Vertex_handle()); @@ -801,23 +700,91 @@ class Periodic_2_triangulation_point_iterator_2 } }; -namespace Periodic_2_triangulation_2_internal -{ +namespace Periodic_2_triangulation_2_internal { + +// returns `true` if the simplex is not canonical, and has to be filtered out template class Domain_tester { - const T *t; + typedef typename T::Offset Offset; + + const T *t; + +public: + Domain_tester() {} + Domain_tester(const T *tr) : t(tr) {} + + bool operator()(const typename T::Vertex_iterator v) const + { + return !(t->get_offset(v).is_null()); + } + + bool operator()(const typename T::Edge_iterator e) const + { + Offset eo_0 = t->int_to_off(e->first->offset(t->cw(e->second))); + Offset eo_1 = t->int_to_off(e->first->offset(t->ccw(e->second))); + + Offset diff_off((eo_0.x() == 1 && eo_1.x() == 1) ? -1 : 0, + (eo_0.y() == 1 && eo_1.y() == 1) ? -1 : 0); + Offset off0 = t->combine_offsets(t->get_offset(e->first, t->cw(e->second)), diff_off); + Offset off1 = t->combine_offsets(t->get_offset(e->first, t->ccw(e->second)), diff_off); + + if (t->number_of_sheets() != make_array(1, 1)) + { + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical edge. + if (off0.x() > 1) return true; + if (off0.y() > 1) return true; + if (off1.x() > 1) return true; + if (off1.y() > 1) return true; + } + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x(); + int offy = off0.y() & off1.y(); + + return (offx != 0 || offy != 0); + } + + bool operator()(const typename T::Face_iterator f) const + { + Offset fo_0 = t->int_to_off(f->offset(0)); + Offset fo_1 = t->int_to_off(f->offset(1)); + Offset fo_2 = t->int_to_off(f->offset(2)); - public: - Domain_tester() {} - Domain_tester(const T *tr) : t(tr) {} + Offset diff_off((fo_0.x() == 1 && fo_1.x() == 1 && fo_2.x() == 1) ? -1 : 0, + (fo_0.y() == 1 && fo_1.y() == 1 && fo_2.y() == 1) ? -1 : 0); + Offset off0 = t->combine_offsets(t->get_offset(f, 0), diff_off); + Offset off1 = t->combine_offsets(t->get_offset(f, 1), diff_off); + Offset off2 = t->combine_offsets(t->get_offset(f, 2), diff_off); - bool operator()(const typename T::Vertex_iterator & v) const + if (t->number_of_sheets() != make_array(1, 1)) { - return (t->get_offset(v) != typename T::Offset(0, 0)); + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical triangle. + if (off0.x() > 1) return true; + if (off0.y() > 1) return true; + if (off1.x() > 1) return true; + if (off1.y() > 1) return true; + if (off2.x() > 1) return true; + if (off2.y() > 1) return true; } + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x() & off2.x(); + int offy = off0.y() & off1.y() & off2.y(); + + return (offx != 0 || offy != 0); + } }; -} + +} // Periodic_2_triangulation_2_internal // Iterates over the vertices in a periodic triangulation that are // located inside the original cube. @@ -872,6 +839,108 @@ class Periodic_2_triangulation_unique_vertex_iterator_2 } }; -} //namespace CGAL +// Iterates over the canonical edges in a periodic triangulation. +// Derives from Filter_iterator in order to add a conversion to handle +// +// Comments: +// When computing in 1-sheeted covering, there will be no difference +// between a normal Edge_iterator and this iterator +template +class Periodic_2_triangulation_unique_edge_iterator_2 + : public Filter_iterator > +{ + typedef typename T::Edge Edge; + typedef typename T::Edge_iterator Edge_iterator; + + typedef typename Periodic_2_triangulation_2_internal::Domain_tester Tester; + + typedef Filter_iterator Base; + typedef Periodic_2_triangulation_unique_edge_iterator_2 Self; + +public: + Periodic_2_triangulation_unique_edge_iterator_2() : Base() {} + Periodic_2_triangulation_unique_edge_iterator_2(const Base &b) : Base(b) {} + + Self & operator++() + { + Base::operator++(); + return *this; + } + Self & operator--() + { + Base::operator--(); + return *this; + } + Self operator++(int) + { + Self tmp(*this); + ++(*this); + return tmp; + } + Self operator--(int) + { + Self tmp(*this); + --(*this); + return tmp; + } + + operator Edge() const + { + return Base::base(); + } +}; + +// Iterates over the canonical faces in a periodic triangulation. +// Derives from Filter_iterator in order to add a conversion to handle +// +// Comments: +// When computing in 1-sheeted covering, there will be no difference +// between a normal Face_iterator and this iterator +template +class Periodic_2_triangulation_unique_face_iterator_2 + : public Filter_iterator > +{ + typedef typename T::Face_handle Face_handle; + typedef typename T::Face_iterator Face_iterator; + + typedef typename Periodic_2_triangulation_2_internal::Domain_tester Tester; + + typedef Filter_iterator Base; + typedef Periodic_2_triangulation_unique_face_iterator_2 Self; + +public: + Periodic_2_triangulation_unique_face_iterator_2() : Base() {} + Periodic_2_triangulation_unique_face_iterator_2(const Base &b) : Base(b) {} + + Self & operator++() + { + Base::operator++(); + return *this; + } + Self & operator--() + { + Base::operator--(); + return *this; + } + Self operator++(int) + { + Self tmp(*this); + ++(*this); + return tmp; + } + Self operator--(int) + { + Self tmp(*this); + --(*this); + return tmp; + } + + operator Face_handle() const + { + return Base::base(); + } +}; + +} // namespace CGAL #endif // CGAL_PERIODIC_2_TRIANGULATION_ITERATORS_2_H diff --git a/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h b/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h index efbd3cf0be47..7c50e0a4252d 100644 --- a/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h +++ b/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h @@ -217,19 +217,19 @@ void test_iterators() } assert(size == t_const.number_of_stored_vertices()); size = 0; - for (typename T::Unique_vertex_iterator uvit = t_const.unique_vertices_begin(); - uvit != t_const.unique_vertices_end(); ++uvit) + for (typename T::Vertex_iterator vit = t_const.all_vertices_begin(); + vit != t_const.all_vertices_end(); ++vit) { ++size; } - assert(size == t_const.number_of_vertices()); + assert(size == t_const.number_of_stored_vertices()); size = 0; - for (typename T::Vertex_iterator vit = t_const.all_vertices_begin(); - vit != t_const.all_vertices_end(); ++vit) + for (typename T::Unique_vertex_iterator uvit = t_const.unique_vertices_begin(); + uvit != t_const.unique_vertices_end(); ++uvit) { ++size; } - assert(size == t_const.number_of_stored_vertices()); + assert(size == t_const.number_of_vertices()); // edges size = 0; @@ -246,6 +246,13 @@ void test_iterators() ++size; } assert(size == t_const.number_of_stored_edges()); + size = 0; + for (typename T::Unique_edge_iterator uvit = t_const.unique_edges_begin(); + uvit != t_const.unique_edges_end(); ++uvit) + { + ++size; + } + assert(size == t_const.number_of_edges()); // faces size = 0; @@ -262,6 +269,13 @@ void test_iterators() ++size; } assert(size == t_const.number_of_stored_faces()); + size = 0; + for (typename T::Unique_face_iterator uvit = t_const.unique_faces_begin(); + uvit != t_const.unique_faces_end(); ++uvit) + { + ++size; + } + assert(size == t_const.number_of_faces()); /// Geometric iterators for (typename T::Periodic_point_iterator ppit = t_const.periodic_points_begin(); diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h index c6399eeaa0fc..19c56b919509 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h @@ -169,6 +169,13 @@ class Periodic_3_triangulation_3 typedef Facet_iterator All_facets_iterator; typedef Edge_iterator All_edges_iterator; typedef Vertex_iterator All_vertices_iterator; + + typedef Periodic_3_triangulation_unique_cell_iterator_3 + Unique_cell_iterator; + typedef Periodic_3_triangulation_unique_facet_iterator_3 + Unique_facet_iterator; + typedef Periodic_3_triangulation_unique_edge_iterator_3 + Unique_edge_iterator; typedef Periodic_3_triangulation_unique_vertex_iterator_3 Unique_vertex_iterator; @@ -397,26 +404,14 @@ class Periodic_3_triangulation_3 } const Covering_sheets& number_of_sheets() const { return _cover; } - const std::pair original_vertex(const Vertex_handle v) const - { - return (virtual_vertices.find(v) == virtual_vertices.end()) ? - std::make_pair(v,Offset()) : virtual_vertices.find(v)->second; - } - const std::vector& periodic_copies(const Vertex_handle v) const - { - CGAL_precondition(number_of_sheets() != CGAL::make_array(1,1,1)); - CGAL_precondition(virtual_vertices.find(v) == virtual_vertices.end()); - CGAL_assertion( - virtual_vertices_reverse.find(v) != virtual_vertices_reverse.end()); - return virtual_vertices_reverse.find(v)->second; - } bool is_triangulation_in_1_sheet() const; - void convert_to_1_sheeted_covering(); + virtual void update_cover_data_after_converting_to_27_sheeted_covering() { } void convert_to_27_sheeted_covering(); +public: size_type number_of_cells() const { if(is_1_cover()) return _tds.number_of_cells(); else return _tds.number_of_cells()/27; @@ -460,14 +455,6 @@ class Periodic_3_triangulation_3 _cover = cover; } -public: - bool is_virtual(Vertex_handle v) - { - if(is_1_cover()) - return false; - return (virtual_vertices.find(v) != virtual_vertices.end()); - } - public: // Offset converters int off_to_int(const Offset& off) const @@ -549,6 +536,232 @@ class Periodic_3_triangulation_3 c->set_offsets(o0i,o1i,o2i,o3i); } +public: + // undocumented access functions + Offset get_offset(Cell_handle ch, int i) const + { + if(is_1_cover()) + return int_to_off(ch->offset(i)); + + Virtual_vertex_map_it it = virtual_vertices.find(ch->vertex(i)); + if(it != virtual_vertices.end()) + return combine_offsets(it->second.second, int_to_off(ch->offset(i))); + else + return combine_offsets(Offset(), int_to_off(ch->offset(i))); + } + + Offset get_offset(Vertex_handle vh) const + { + if(is_1_cover()) + return Offset(); + + Virtual_vertex_map_it it = virtual_vertices.find(vh); + if(it != virtual_vertices.end()) + return it->second.second; + else + return Offset(); + } + + // Get the canonicalized offsets of a cell. + void get_offsets(Cell_handle ch, + Offset& off0, Offset& off1, Offset& off2, Offset& off3) const + { + Offset cell_off0 = int_to_off(ch->offset(0)); + Offset cell_off1 = int_to_off(ch->offset(1)); + Offset cell_off2 = int_to_off(ch->offset(2)); + Offset cell_off3 = int_to_off(ch->offset(3)); + Offset diff_off((cell_off0.x() == 1 && cell_off1.x() == 1 && + cell_off2.x() == 1 && cell_off3.x() == 1) ? -1 : 0, + (cell_off0.y() == 1 && cell_off1.y() == 1 && + cell_off2.y() == 1 && cell_off3.y() == 1) ? -1 : 0, + (cell_off0.z() == 1 && cell_off1.z() == 1 && + cell_off2.z() == 1 && cell_off3.z() == 1) ? -1 : 0); + off0 = combine_offsets(get_offset(ch,0), diff_off); + off1 = combine_offsets(get_offset(ch,1), diff_off); + off2 = combine_offsets(get_offset(ch,2), diff_off); + off3 = combine_offsets(get_offset(ch,3), diff_off); + } + + // Gets the canonicalized offsets of a face. + void get_offsets(const Facet& f, + Offset& off0, Offset& off1, Offset& off2) const + { + Offset cell_off0 = int_to_off(f.first->offset((f.second+1)&3)); + Offset cell_off1 = int_to_off(f.first->offset((f.second+2)&3)); + Offset cell_off2 = int_to_off(f.first->offset((f.second+3)&3)); + Offset diff_off((cell_off0.x() == 1 && cell_off1.x() == 1 && cell_off2.x() == 1) ? -1 : 0, + (cell_off0.y() == 1 && cell_off1.y() == 1 && cell_off2.y() == 1) ? -1 : 0, + (cell_off0.z() == 1 && cell_off1.z() == 1 && cell_off2.z() == 1) ? -1 : 0); + off0 = combine_offsets(get_offset(f.first, (f.second+1)&3), diff_off); + off1 = combine_offsets(get_offset(f.first, (f.second+2)&3), diff_off); + off2 = combine_offsets(get_offset(f.first, (f.second+3)&3), diff_off); + } + + // Gets the canonicalized offsets of an edge. + void get_offsets(const Edge& e, + Offset& off0, Offset& off1) const + { + Offset cell_off0 = int_to_off(e.first->offset(e.second)); + Offset cell_off1 = int_to_off(e.first->offset(e.third)); + Offset diff_off((cell_off0.x()==1 && cell_off1.x()==1) ? -1 : 0, + (cell_off0.y()==1 && cell_off1.y()==1) ? -1 : 0, + (cell_off0.z()==1 && cell_off1.z()==1) ? -1 : 0); + off0 = combine_offsets(get_offset(e.first, e.second), diff_off); + off1 = combine_offsets(get_offset(e.first, e.third), diff_off); + } + +public: + Offset combine_offsets(const Offset& o_c, const Offset& o_t) const + { + Offset o_ct(_cover[0]*o_t.x(), _cover[1]*o_t.y(), _cover[2]*o_t.z()); + return o_c + o_ct; + } + +public: + Offset neighbor_offset(Cell_handle ch, int i, Cell_handle nb) const; + + Offset neighbor_offset(Cell_handle ch, int i) const + { + return neighbor_offset(ch, i, ch->neighbor(i)); + } + +public: + /// Tests whether a vertex is a periodic copy of a vertex in the 3-cover. + bool is_virtual(Vertex_handle vh) const + { + if(is_1_cover()) + return false; + return (virtual_vertices.find(vh) != virtual_vertices.end()); + } + + /// Returns the non-virtual (i.e. canonical) copy of the vertex. + Vertex_handle get_original_vertex(Vertex_handle vh) const + { + if(is_1_cover()) + return vh; + + Virtual_vertex_map_it it = virtual_vertices.find(vh); + if(it != virtual_vertices.end()) + return it->second.first; + else + return vh; + } + + const std::pair original_vertex(const Vertex_handle v) const + { + return (virtual_vertices.find(v) == virtual_vertices.end()) ? + std::make_pair(v,Offset()) : virtual_vertices.find(v)->second; + } + + const std::vector& periodic_copies(const Vertex_handle v) const + { + CGAL_precondition(number_of_sheets() != CGAL::make_array(1,1,1)); + CGAL_precondition(virtual_vertices.find(v) == virtual_vertices.end()); + CGAL_assertion( + virtual_vertices_reverse.find(v) != virtual_vertices_reverse.end()); + return virtual_vertices_reverse.find(v)->second; + } + +public: + bool is_canonical(Cell_handle ch) const + { + if(is_1_cover()) + return true; + + Offset off0, off1, off2, off3; + get_offsets(ch, off0, off1, off2, off3); + + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical triangle. + if (off0.x() > 1) return false; + if (off0.y() > 1) return false; + if (off0.z() > 1) return false; + if (off1.x() > 1) return false; + if (off1.y() > 1) return false; + if (off1.z() > 1) return false; + if (off2.x() > 1) return false; + if (off2.y() > 1) return false; + if (off2.z() > 1) return false; + if (off3.x() > 1) return false; + if (off3.y() > 1) return false; + if (off3.z() > 1) return false; + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x() & off2.x() & off3.x(); + int offy = off0.y() & off1.y() & off2.y() & off3.y(); + int offz = off0.z() & off1.z() & off2.z() & off3.z(); + + return (offx == 0 && offy == 0 && offz == 0); + } + + bool is_canonical(const Edge& e) const + { + if(is_1_cover()) + return true; + + Offset off0, off1; + get_offsets(e, off0, off1); + + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical edge. + if (off0.x() > 1) return false; + if (off0.y() > 1) return false; + if (off0.z() > 1) return false; + if (off1.x() > 1) return false; + if (off1.y() > 1) return false; + if (off1.z() > 1) return false; + + // If there is one direction of space for which all offsets are + // non-zero then the edge is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x(); + int offy = off0.y() & off1.y(); + int offz = off0.z() & off1.z(); + + return (offx == 0 && offy == 0 && offz == 0); + } + + bool is_canonical(const Facet& f) const + { + if(is_1_cover()) + return true; + + Offset off0, off1, off2; + get_offsets(f, off0, off1, off2); + + // If there is one offset with entries larger than 1 then we are + // talking about a vertex that is too far away from the original + // domain to belong to a canonical triangle. + if(off0.x() > 1) return false; + if(off0.y() > 1) return false; + if(off0.z() > 1) return false; + if(off1.x() > 1) return false; + if(off1.y() > 1) return false; + if(off1.z() > 1) return false; + if(off2.x() > 1) return false; + if(off2.y() > 1) return false; + if(off2.z() > 1) return false; + + // If there is one direction of space for which all offsets are + // non-zero then the facet is not canonical because we can + // take the copy closer towards the origin in that direction. + int offx = off0.x() & off1.x() & off2.x(); + int offy = off0.y() & off1.y() & off2.y(); + int offz = off0.z() & off1.z() & off2.z(); + + return (offx == 0 && offy == 0 && offz == 0); + } + + /// Tests whether a vertex belongs to the original (canonical) domain. + bool is_canonical(Vertex_handle vh) const + { + return !is_virtual(vh); + } + public: /** @name Wrapping the traits */ // Note that calling functors with "construct_point(p), offset" and not @@ -988,6 +1201,14 @@ class Periodic_3_triangulation_3 // end of geometric functions public: + // These functions give the pair (vertex, offset) that corresponds to the + // i-th vertex of cell ch or vertex vh, respectively. + void get_vertex(Cell_handle ch, int i, Vertex_handle& vh, Offset& off) const; + void get_vertex(Vertex_handle vh_i, Vertex_handle& vh, Offset& off) const; + + // Auxiliary functions + Cell_handle get_cell(const Vertex_handle* vh) const; + /** @name Queries */ bool is_vertex(const Point& p, Vertex_handle& v) const; @@ -1305,6 +1526,14 @@ class Periodic_3_triangulation_3 std::vector insert_generic_dummy_points(); protected: + template + Offset get_location_offset(const Conflict_tester& tester, + Cell_handle c) const; + + template + Offset get_location_offset(const Conflict_tester& tester, + Cell_handle c, bool& found) const; + // this is needed for compatibility reasons template @@ -1530,6 +1759,16 @@ class Periodic_3_triangulation_3 return _tds.facets_end(); } + // Unique iterators + + Unique_cell_iterator unique_cells_begin() const { + return CGAL::filter_iterator(cells_end(), Domain_tester(this), + cells_begin()); + } + Unique_cell_iterator unique_cells_end() const { + return CGAL::filter_iterator(cells_end(), Domain_tester(this)); + } + Unique_vertex_iterator unique_vertices_begin() const { return CGAL::filter_iterator(vertices_end(), Domain_tester(this), vertices_begin()); @@ -1538,6 +1777,22 @@ class Periodic_3_triangulation_3 return CGAL::filter_iterator(vertices_end(), Domain_tester(this)); } + Unique_edge_iterator unique_edges_begin() const { + return CGAL::filter_iterator(edges_end(), Domain_tester(this), + edges_begin()); + } + Unique_edge_iterator unique_edges_end() const { + return CGAL::filter_iterator(edges_end(), Domain_tester(this)); + } + + Unique_facet_iterator unique_facets_begin() const { + return CGAL::filter_iterator(facets_end(), Domain_tester(this), + facets_begin()); + } + Unique_facet_iterator unique_facets_end() const { + return CGAL::filter_iterator(facets_end(), Domain_tester(this)); + } + // Geometric iterators Periodic_tetrahedron_iterator periodic_tetrahedra_begin( Iterator_type it = STORED) const { @@ -1695,75 +1950,6 @@ class Periodic_3_triangulation_3 } }; -public: - // undocumented access functions - Offset get_offset(Cell_handle ch, int i) const - { - if(is_1_cover()) - return int_to_off(ch->offset(i)); - - Virtual_vertex_map_it it = virtual_vertices.find(ch->vertex(i)); - if(it != virtual_vertices.end()) - return combine_offsets(it->second.second, int_to_off(ch->offset(i))); - else - return combine_offsets(Offset(), int_to_off(ch->offset(i))); - } - - Offset get_offset(Vertex_handle vh) const - { - if(is_1_cover()) - return Offset(); - - Virtual_vertex_map_it it = virtual_vertices.find(vh); - if(it != virtual_vertices.end()) - return it->second.second; - else - return Offset(); - } - - Vertex_handle get_original_vertex(Vertex_handle vh) const - { - if(is_1_cover()) - return vh; - - Virtual_vertex_map_it it = virtual_vertices.find(vh); - if(it != virtual_vertices.end()) - return it->second.first; - else - return vh; - } - - Offset combine_offsets(const Offset& o_c, const Offset& o_t) const - { - Offset o_ct(_cover[0]*o_t.x(), _cover[1]*o_t.y(), _cover[2]*o_t.z()); - return o_c + o_ct; - } - - // These functions give the pair (vertex, offset) that corresponds to the - // i-th vertex of cell ch or vertex vh, respectively. - void get_vertex(Cell_handle ch, int i, Vertex_handle& vh, Offset& off) const; - void get_vertex(Vertex_handle vh_i, Vertex_handle& vh, Offset& off) const; - -protected: - // Auxiliary functions - Cell_handle get_cell(const Vertex_handle* vh) const; - - template - Offset get_location_offset(const Conflict_tester& tester, - Cell_handle c) const; - - template - Offset get_location_offset(const Conflict_tester& tester, - Cell_handle c, bool& found) const; - - Offset neighbor_offset(Cell_handle ch, int i, Cell_handle nb) const; - -public: - Offset neighbor_offset(Cell_handle ch, int i) const - { - return neighbor_offset(ch, i, ch->neighbor(i)); - } - protected: /** @name Friends */ friend std::istream& operator>> <> @@ -1788,51 +1974,6 @@ class Periodic_3_triangulation_3 return construct_periodic_point(p); } -public: - bool is_canonical(const Facet& f) const - { - if(number_of_sheets() == CGAL::make_array(1,1,1)) - return true; - - Offset cell_off0 = int_to_off(f.first->offset((f.second+1)&3)); - Offset cell_off1 = int_to_off(f.first->offset((f.second+2)&3)); - Offset cell_off2 = int_to_off(f.first->offset((f.second+3)&3)); - Offset diff_off((cell_off0.x() == 1 - && cell_off1.x() == 1 - && cell_off2.x() == 1) ? -1 : 0, - (cell_off0.y() == 1 - && cell_off1.y() == 1 - && cell_off2.y() == 1) ? -1 : 0, - (cell_off0.z() == 1 - && cell_off1.z() == 1 - && cell_off2.z() == 1) ? -1 : 0); - Offset off0 = combine_offsets(get_offset(f.first, (f.second+1)&3), diff_off); - Offset off1 = combine_offsets(get_offset(f.first, (f.second+2)&3), diff_off); - Offset off2 = combine_offsets(get_offset(f.first, (f.second+3)&3), diff_off); - - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if(off0.x() > 1) return false; - if(off0.y() > 1) return false; - if(off0.z() > 1) return false; - if(off1.x() > 1) return false; - if(off1.y() > 1) return false; - if(off1.z() > 1) return false; - if(off2.x() > 1) return false; - if(off2.y() > 1) return false; - if(off2.z() > 1) return false; - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x() & off2.x(); - int offy = off0.y() & off1.y() & off2.y(); - int offz = off0.z() & off1.z() & off2.z(); - - return (offx == 0 && offy == 0 && offz == 0); - } - protected: template bool canonical_dual_segment(Cell_handle c, int i, Periodic_segment_3& ps, diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h index 947b8b553e52..719060bed29d 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h @@ -63,7 +63,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { Iterator_type it = T::STORED) : _t(t), pos(_t->cells_begin()), _it(it), _off(0) { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->cells_end() && !is_canonical() ) + while (pos != _t->cells_end() && !_t->is_canonical(pos) ) ++pos; } } @@ -79,7 +79,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { ++pos; break; case T::UNIQUE: - do { ++pos; } while (pos != _t->cells_end() && !is_canonical()); + do { ++pos; } while (pos != _t->cells_end() && !_t->is_canonical(pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -97,7 +97,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { --pos; break; case T::UNIQUE: - do { --pos; } while (pos != _t->cells_begin() && !is_canonical()); + do { --pos; } while (pos != _t->cells_begin() && !_t->is_canonical(pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -156,42 +156,6 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { mutable Periodic_tetrahedron periodic_tetrahedron; // current tetrahedron. private: - // check whether pos points onto a unique edge or not. - // If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() { - // fetch all offsets - Offset off0, off1, off2, off3; - get_edge_offsets(off0, off1, off2, off3); - - if (_t->number_of_sheets() != make_array(1,1,1)) { - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if (off0.x() > 1) return false; - if (off0.y() > 1) return false; - if (off0.z() > 1) return false; - if (off1.x() > 1) return false; - if (off1.y() > 1) return false; - if (off1.z() > 1) return false; - if (off2.x() > 1) return false; - if (off2.y() > 1) return false; - if (off2.z() > 1) return false; - if (off3.x() > 1) return false; - if (off3.y() > 1) return false; - if (off3.z() > 1) return false; - } - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x() & off2.x() & off3.x(); - int offy = off0.y() & off1.y() & off2.y() & off3.y(); - int offz = off0.z() & off1.z() & off2.z() & off3.z(); - - return (offx == 0 && offy == 0 && offz == 0); - } - // Artificial incrementation function that takes periodic // copies into account. void increment_domain() { @@ -200,7 +164,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { if (_off == off) { _off = 0; do { ++pos; } while (_it == T::UNIQUE_COVER_DOMAIN - && pos != _t->cells_end() && !is_canonical()); + && pos != _t->cells_end() && !_t->is_canonical(pos)); } else { do { ++_off; @@ -214,7 +178,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { void decrement_domain() { if (_off == 0) { if (pos == _t->cells_begin()) return; - do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !is_canonical()); + do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !_t->is_canonical(pos)); _off = get_drawing_offsets(); } else { int off = get_drawing_offsets(); @@ -225,32 +189,6 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { } } - // Get the canonicalized offsets of an edge. - // This works in any cover that is encoded in _t->combine_offsets - void get_edge_offsets(Offset &off0, Offset &off1, - Offset &off2, Offset &off3) const { - Offset cell_off0 = _t->int_to_off(pos->offset(0)); - Offset cell_off1 = _t->int_to_off(pos->offset(1)); - Offset cell_off2 = _t->int_to_off(pos->offset(2)); - Offset cell_off3 = _t->int_to_off(pos->offset(3)); - Offset diff_off((cell_off0.x() == 1 - && cell_off1.x() == 1 - && cell_off2.x() == 1 - && cell_off3.x() == 1)?-1:0, - (cell_off0.y() == 1 - && cell_off1.y() == 1 - && cell_off2.y() == 1 - && cell_off3.y() == 1)?-1:0, - (cell_off0.z() == 1 - && cell_off1.z() == 1 - && cell_off2.z() == 1 - && cell_off3.z() == 1)?-1:0); - off0 = _t->combine_offsets(_t->get_offset(pos,0), diff_off); - off1 = _t->combine_offsets(_t->get_offset(pos,1), diff_off); - off2 = _t->combine_offsets(_t->get_offset(pos,2), diff_off); - off3 = _t->combine_offsets(_t->get_offset(pos,3), diff_off); - } - // return an integer that encodes the translations which have to be // applied to the edge *pos int get_drawing_offsets() { @@ -262,7 +200,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { // internally stored inside the cell telling us that this cell // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) - get_edge_offsets(off0,off1,off2,off3); + _t->get_offsets(pos, off0, off1, off2, off3); else { CGAL_assertion(_it == T::STORED_COVER_DOMAIN); off0 = _t->int_to_off(pos->offset(0)); @@ -303,7 +241,7 @@ class Periodic_3_triangulation_tetrahedron_iterator_3 { Periodic_tetrahedron construct_periodic_tetrahedron() const { CGAL_assertion(pos != typename T::Cell_handle()); Offset off0, off1, off2, off3; - get_edge_offsets(off0, off1, off2, off3); + _t->get_offsets(pos, off0, off1, off2, off3); Offset transl_off = Offset((((_off>>2)&1)==1 ? -1:0), (((_off>>1)&1)==1 ? -1:0), (( _off &1)==1 ? -1:0)); @@ -369,7 +307,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { Iterator_type it = T::STORED) : _t(t), pos(_t->facets_begin()), _it(it), _off(0) { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->facets_end() && !is_canonical() ) + while (pos != _t->facets_end() && !_t->is_canonical(*pos) ) ++pos; } } @@ -385,7 +323,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { ++pos; break; case T::UNIQUE: - do { ++pos; } while (pos != _t->facets_end() && !is_canonical()); + do { ++pos; } while (pos != _t->facets_end() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -403,7 +341,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { --pos; break; case T::UNIQUE: - do { --pos; } while (pos != _t->facets_begin() && !is_canonical()); + do { --pos; } while (pos != _t->facets_begin() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -462,39 +400,6 @@ class Periodic_3_triangulation_triangle_iterator_3 { mutable Periodic_triangle periodic_triangle; // current segment. private: - // check whether pos points onto a unique edge or not. - // If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() { - // fetch all offsets - Offset off0, off1, off2; - get_edge_offsets(off0, off1, off2); - - if (_t->number_of_sheets() != make_array(1,1,1)) { - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if (off0.x() > 1) return false; - if (off0.y() > 1) return false; - if (off0.z() > 1) return false; - if (off1.x() > 1) return false; - if (off1.y() > 1) return false; - if (off1.z() > 1) return false; - if (off2.x() > 1) return false; - if (off2.y() > 1) return false; - if (off2.z() > 1) return false; - } - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x() & off2.x(); - int offy = off0.y() & off1.y() & off2.y(); - int offz = off0.z() & off1.z() & off2.z(); - - return (offx == 0 && offy == 0 && offz == 0); - } - // Artificial incrementation function that takes periodic // copies into account. void increment_domain() { @@ -503,7 +408,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { if (_off == off) { _off = 0; do { ++pos; } while (_it == T::UNIQUE_COVER_DOMAIN - && pos != _t->facets_end() && !is_canonical()); + && pos != _t->facets_end() && !_t->is_canonical(*pos)); } else { do { ++_off; @@ -517,7 +422,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { void decrement_domain() { if (_off == 0) { if (pos == _t->facets_begin()) return; - do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !is_canonical()); + do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !_t->is_canonical(*pos)); _off = get_drawing_offsets(); } else { int off = get_drawing_offsets(); @@ -528,32 +433,6 @@ class Periodic_3_triangulation_triangle_iterator_3 { } } - // Get the canonicalized offsets of an edge. - // This works in any cover that is encoded in _t->combine_offsets - void get_edge_offsets(Offset &off0, Offset &off1, Offset &off2) const { - Offset cell_off0 = _t->int_to_off(pos->first->offset((pos->second+1)&3)); - Offset cell_off1 = _t->int_to_off(pos->first->offset((pos->second+2)&3)); - Offset cell_off2 = _t->int_to_off(pos->first->offset((pos->second+3)&3)); - Offset diff_off((cell_off0.x() == 1 - && cell_off1.x() == 1 - && cell_off2.x() == 1)?-1:0, - (cell_off0.y() == 1 - && cell_off1.y() == 1 - && cell_off2.y() == 1)?-1:0, - (cell_off0.z() == 1 - && cell_off1.z() == 1 - && cell_off2.z() == 1)?-1:0); - off0 = _t->combine_offsets(_t->get_offset(pos->first, - (pos->second+1)&3), - diff_off); - off1 = _t->combine_offsets(_t->get_offset(pos->first, - (pos->second+2)&3), - diff_off); - off2 = _t->combine_offsets(_t->get_offset(pos->first, - (pos->second+3)&3), - diff_off); - } - // return an integer that encodes the translations which have to be // applied to the edge *pos int get_drawing_offsets() { @@ -565,7 +444,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { // internally stored inside the cell telling us that this cell // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) - get_edge_offsets(off0,off1,off2); + _t->get_offsets(*pos, off0, off1, off2); else { CGAL_assertion(_it == T::STORED_COVER_DOMAIN); off0 = _t->int_to_off(pos->first->offset((pos->second+1)&3)); @@ -596,7 +475,7 @@ class Periodic_3_triangulation_triangle_iterator_3 { Periodic_triangle construct_periodic_triangle() const { CGAL_assertion(pos->first != typename T::Cell_handle()); Offset off0, off1, off2; - get_edge_offsets(off0, off1, off2); + _t->get_offsets(*pos, off0, off1, off2); Offset transl_off = Offset((((_off>>2)&1)==1 ? -1:0), (((_off>>1)&1)==1 ? -1:0), (( _off &1)==1 ? -1:0)); @@ -659,7 +538,7 @@ class Periodic_3_triangulation_segment_iterator_3 { Iterator_type it = T::STORED) : _t(t), pos(_t->edges_begin()), _it(it), _off(0) { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->edges_end() && !is_canonical() ) + while (pos != _t->edges_end() && !_t->is_canonical(*pos) ) ++pos; } } @@ -675,7 +554,7 @@ class Periodic_3_triangulation_segment_iterator_3 { ++pos; break; case T::UNIQUE: - do { ++pos; } while (pos != _t->edges_end() && !is_canonical()); + do { ++pos; } while (pos != _t->edges_end() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -693,7 +572,7 @@ class Periodic_3_triangulation_segment_iterator_3 { --pos; break; case T::UNIQUE: - do { --pos; } while (pos != _t->edges_begin() && !is_canonical()); + do { --pos; } while (pos != _t->edges_begin() && !_t->is_canonical(*pos)); break; case T::STORED_COVER_DOMAIN: case T::UNIQUE_COVER_DOMAIN: @@ -751,36 +630,6 @@ class Periodic_3_triangulation_segment_iterator_3 { mutable Periodic_segment periodic_segment; // current segment. private: - // check whether pos points onto a unique edge or not. - // If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() { - // fetch all offsets - Offset off0, off1; - get_edge_offsets(off0, off1); - - if (_t->number_of_sheets() != make_array(1,1,1)) { - // If there is one offset with entries larger than 1 then we are - // talking about a vertex that is too far away from the original - // domain to belong to a canonical triangle. - if (off0.x() > 1) return false; - if (off0.y() > 1) return false; - if (off0.z() > 1) return false; - if (off1.x() > 1) return false; - if (off1.y() > 1) return false; - if (off1.z() > 1) return false; - } - - // If there is one direction of space for which all offsets are - // non-zero then the edge is not canonical because we can - // take the copy closer towards the origin in that direction. - int offx = off0.x() & off1.x(); - int offy = off0.y() & off1.y(); - int offz = off0.z() & off1.z(); - - return (offx == 0 && offy == 0 && offz == 0); - } - // Artificial incrementation function that takes periodic // copies into account. void increment_domain() { @@ -789,7 +638,7 @@ class Periodic_3_triangulation_segment_iterator_3 { if (_off == off) { _off = 0; do { ++pos; } while (_it == T::UNIQUE_COVER_DOMAIN - && pos != _t->edges_end() && !is_canonical()); + && pos != _t->edges_end() && !_t->is_canonical(*pos)); } else { do { ++_off; @@ -803,7 +652,7 @@ class Periodic_3_triangulation_segment_iterator_3 { void decrement_domain() { if (_off == 0) { if (pos == _t->edges_begin()) return; - do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !is_canonical()); + do { --pos; } while (_it == T::UNIQUE_COVER_DOMAIN && !_t->is_canonical(*pos)); _off = get_drawing_offsets(); } else { int off = get_drawing_offsets(); @@ -814,20 +663,6 @@ class Periodic_3_triangulation_segment_iterator_3 { } } - // Get the canonicalized offsets of an edge. - // This works in any cover that is encoded in _t->combine_offsets - void get_edge_offsets(Offset &off0, Offset &off1) const { - Offset cell_off0 = _t->int_to_off(pos->first->offset(pos->second)); - Offset cell_off1 = _t->int_to_off(pos->first->offset(pos->third)); - Offset diff_off((cell_off0.x()==1 && cell_off1.x()==1)?-1:0, - (cell_off0.y()==1 && cell_off1.y()==1)?-1:0, - (cell_off0.z()==1 && cell_off1.z()==1)?-1:0); - off0 = _t->combine_offsets(_t->get_offset(pos->first,pos->second), - diff_off); - off1 = _t->combine_offsets(_t->get_offset(pos->first,pos->third), - diff_off); - } - // return an integer that encodes the translations which have to be // applied to the edge *pos int get_drawing_offsets() { @@ -839,7 +674,7 @@ class Periodic_3_triangulation_segment_iterator_3 { // internally stored inside the cell telling us that this cell // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) - get_edge_offsets(off0,off1); + _t->get_offsets(*pos, off0, off1); else { CGAL_assertion(_it == T::STORED_COVER_DOMAIN); off0 = _t->int_to_off(pos->first->offset(pos->second)); @@ -859,7 +694,7 @@ class Periodic_3_triangulation_segment_iterator_3 { Periodic_segment construct_periodic_segment() const { CGAL_assertion(pos->first != typename T::Cell_handle()); Offset off0, off1; - get_edge_offsets(off0, off1); + _t->get_offsets(*pos, off0, off1); Offset transl_off = Offset((((_off>>2)&1)==1 ? -1:0), (((_off>>1)&1)==1 ? -1:0), (( _off &1)==1 ? -1:0)); @@ -918,7 +753,7 @@ class Periodic_3_triangulation_point_iterator_3 { Iterator_type it = T::STORED) : _t(t), pos(_t->vertices_begin()), _it(it) { if (_it == T::UNIQUE || _it == T::UNIQUE_COVER_DOMAIN) { - while (pos != _t->vertices_end() && !is_canonical() ) + while (pos != _t->vertices_end() && !_t->is_canonical(pos) ) ++pos; } } @@ -936,7 +771,7 @@ class Periodic_3_triangulation_point_iterator_3 { break; case T::UNIQUE: case T::UNIQUE_COVER_DOMAIN: - do { ++pos; } while (pos != _t->vertices_end() && !is_canonical()); + do { ++pos; } while (pos != _t->vertices_end() && !_t->is_canonical(pos)); break; default: CGAL_assertion(false); @@ -952,7 +787,7 @@ class Periodic_3_triangulation_point_iterator_3 { break; case T::UNIQUE: case T::UNIQUE_COVER_DOMAIN: - do { --pos; } while (pos != _t->vertices_begin() && !is_canonical()); + do { --pos; } while (pos != _t->vertices_begin() && !_t->is_canonical(pos)); break; default: CGAL_assertion(false); @@ -1009,13 +844,6 @@ class Periodic_3_triangulation_point_iterator_3 { mutable Periodic_point periodic_point; // current point. private: - // check whether pos points onto a vertex inside the original - // domain. If we are computing in 1-sheeted covering this should - // always be true. - bool is_canonical() { - return (_t->get_offset(pos) == Offset(0,0,0)); - } - Periodic_point construct_periodic_point() const { CGAL_assertion(pos != typename T::Vertex_handle()); Offset off = _t->get_offset(pos); @@ -1031,9 +859,54 @@ class Domain_tester { Domain_tester() {} Domain_tester(const T *tr) : t(tr) {} - bool operator()(const typename T::Vertex_iterator & v) const { - return (t->get_offset(v) != typename T::Offset(0,0,0)); + bool operator()(const typename T::Cell_iterator c) const + { + return !t->is_canonical(c); } + + bool operator()(const typename T::Facet_iterator f) const + { + return !t->is_canonical(*f); + } + + bool operator()(const typename T::Edge_iterator e) const + { + return !t->is_canonical(*e); + } + + bool operator()(const typename T::Vertex_iterator v) const + { + return !t->is_canonical(v); + } + +}; + +// Iterates over the canonical cells in a periodic triangulation. +// Derives from Filter_iterator in order to add a conversion to handle +// +// Comments: +// When computing in 1-sheeted covering, there will be no difference +// between a normal Cell_iterator and this iterator +template +class Periodic_3_triangulation_unique_cell_iterator_3 + : public Filter_iterator > +{ + typedef typename T::Cell_handle Cell_handle; + typedef typename T::Cell_iterator Cell_iterator; + + typedef Filter_iterator > Base; + typedef Periodic_3_triangulation_unique_cell_iterator_3 Self; + +public: + Periodic_3_triangulation_unique_cell_iterator_3() : Base() {} + Periodic_3_triangulation_unique_cell_iterator_3(const Base &b) : Base(b) {} + + Self & operator++() { Base::operator++(); return *this; } + Self & operator--() { Base::operator--(); return *this; } + Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } + Self operator--(int) { Self tmp(*this); --(*this); return tmp; } + + operator Cell_handle() const { return Base::base(); } }; // Iterates over the vertices in a periodic triangulation that are @@ -1065,6 +938,62 @@ class Periodic_3_triangulation_unique_vertex_iterator_3 operator Vertex_handle() const { return Base::base(); } }; -} //namespace CGAL +// Iterates over the canonical edges in a periodic triangulation. +// Derives from Filter_iterator in order to add a conversion to handle +// +// Comments: +// When computing in 1-sheeted covering, there will be no difference +// between a normal Edge_iterator and this iterator +template +class Periodic_3_triangulation_unique_edge_iterator_3 + : public Filter_iterator > +{ + typedef typename T::Edge Edge; + typedef typename T::Edge_iterator Edge_iterator; + + typedef Filter_iterator > Base; + typedef Periodic_3_triangulation_unique_edge_iterator_3 Self; + +public: + Periodic_3_triangulation_unique_edge_iterator_3() : Base() {} + Periodic_3_triangulation_unique_edge_iterator_3(const Base &b) : Base(b) {} + + Self & operator++() { Base::operator++(); return *this; } + Self & operator--() { Base::operator--(); return *this; } + Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } + Self operator--(int) { Self tmp(*this); --(*this); return tmp; } + + operator Edge() const { return Base::base(); } +}; + +// Iterates over the canonical facets in a periodic triangulation. +// Derives from Filter_iterator in order to add a conversion to handle +// +// Comments: +// When computing in 1-sheeted covering, there will be no difference +// between a normal Facet_iterator and this iterator +template +class Periodic_3_triangulation_unique_facet_iterator_3 + : public Filter_iterator > +{ + typedef typename T::Facet Facet; + typedef typename T::Facet_iterator Facet_iterator; + + typedef Filter_iterator > Base; + typedef Periodic_3_triangulation_unique_facet_iterator_3 Self; +public: + + Periodic_3_triangulation_unique_facet_iterator_3() : Base() {} + Periodic_3_triangulation_unique_facet_iterator_3(const Base &b) : Base(b) {} + + Self & operator++() { Base::operator++(); return *this; } + Self & operator--() { Base::operator--(); return *this; } + Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } + Self operator--(int) { Self tmp(*this); --(*this); return tmp; } + + operator Facet() const { return Base::base(); } +}; + +} // namespace CGAL #endif // CGAL_PERIODIC_3_TRIANGULATION_ITERATORS_3_H diff --git a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_iterator.h b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_iterator.h index a77afb5fbc07..49bdfff51cd5 100644 --- a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_iterator.h +++ b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_iterator.h @@ -86,32 +86,158 @@ _test_unique_vertex_iterator( const Triangulation &T ) size_type n = 0; for (Unique_vertex_iterator ovit = T.unique_vertices_begin(); - ovit != T.unique_vertices_end(); ++ovit) - { - Vertex_handle vh = ovit; // Test the conversion. - n++; - const Vertex & v = *ovit; // Test operator*; - Cell_handle c = ovit->cell(); // Test operator->; - (void) vh; - (void) v; - (void) c; - } + ovit != T.unique_vertices_end(); ++ovit) + { + Vertex_handle vh = ovit; // Test the conversion. + ++n; + const Vertex & v = *ovit; // Test operator*; + Cell_handle c = ovit->cell(); // Test operator->; + (void) vh; + (void) v; + (void) c; + } assert( n == T.number_of_vertices() ); // Test Backward-ness of the iterators. - n=0; + n = 0; for (Unique_vertex_iterator ovit = T.unique_vertices_end(); - ovit != T.unique_vertices_begin(); --ovit) - { - Vertex_handle vh = ovit; // Test the conversion. - (void) vh; - n++; - } + ovit != T.unique_vertices_begin(); --ovit) + { + Vertex_handle vh = ovit; // Test the conversion. + (void) vh; + ++n; + } assert( n == T.number_of_vertices() ); return n; } + +template < class Triangulation > +typename Triangulation::size_type +_test_unique_edge_iterator( const Triangulation &T ) +{ + typedef typename Triangulation::size_type size_type; + typedef typename Triangulation::Edge Edge; + typedef typename Triangulation::Cell_handle Cell_handle; + typedef typename Triangulation::Unique_edge_iterator + Unique_edge_iterator; + + size_type n = 0; + + for (Unique_edge_iterator oeit = T.unique_edges_begin(); + oeit != T.unique_edges_end(); ++oeit) + { + ++n; + const Edge& e = *oeit; // Test operator*; + Cell_handle c = oeit->first; // Test operator->; + assert(c != Cell_handle()); + (void) e; + (void) c; + } + assert( n == T.number_of_edges() ); + + // Test Backward-ness of the iterators. + n = 0; + for (Unique_edge_iterator oeit = T.unique_edges_end(); + oeit != T.unique_edges_begin(); --oeit) + { + ++n; + } + assert( n == T.number_of_edges() ); + + return n; +} + +template < class Triangulation > +typename Triangulation::size_type +_test_unique_facet_iterator( const Triangulation &T ) +{ + typedef typename Triangulation::size_type size_type; + typedef typename Triangulation::Facet Facet; + typedef typename Triangulation::Cell_handle Cell_handle; + typedef typename Triangulation::Unique_facet_iterator + Unique_facet_iterator; + + size_type n = 0; + + for (Unique_facet_iterator ofit = T.unique_facets_begin(); + ofit != T.unique_facets_end(); ++ofit) + { + ++n; + const Facet& f = *ofit; // Test operator*; + Cell_handle c = ofit->first; // Test operator->; + assert(c != Cell_handle()); + (void) f; + (void) c; + } + assert( n == T.number_of_facets() ); + + // Test Backward-ness of the iterators. + n = 0; + for (Unique_facet_iterator ofit = T.unique_facets_end(); + ofit != T.unique_facets_begin(); --ofit) + { + ++n; + } + assert( n == T.number_of_facets() ); + + return n; +} + +template < class Triangulation > +typename Triangulation::size_type +_test_unique_cell_iterator( const Triangulation &T ) +{ + typedef typename Triangulation::size_type size_type; + typedef typename Triangulation::Cell Cell; + typedef typename Triangulation::Vertex_handle Vertex_handle; + typedef typename Triangulation::Cell_handle Cell_handle; + typedef typename Triangulation::Unique_cell_iterator + Unique_cell_iterator; + + size_type n = 0; + + for (Unique_cell_iterator ocit = T.unique_cells_begin(); + ocit != T.unique_cells_end(); ++ocit) + { + Cell_handle ch = ocit; // Test the conversion. + n++; + const Cell& c = *ocit; // Test operator*; + Vertex_handle vh = ocit->vertex(0); // Test operator->; + (void) ch; + (void) c; + (void) vh; + } + assert( n == T.number_of_cells() ); + + // Test Backward-ness of the iterators. + n=0; + for (Unique_cell_iterator ocit = T.unique_cells_end(); + ocit != T.unique_cells_begin(); --ocit) + { + Cell_handle ch = ocit; // Test the conversion. + (void) ch; + ++n; + } + assert( n == T.number_of_cells() ); + + return n; +} + +template < class Triangulation > +typename Triangulation::size_type +_test_triangulation_unique_iterator( const Triangulation &T ) +{ + typedef typename Triangulation::size_type size_type; + const size_type nc = _test_unique_cell_iterator(T); + const size_type nf = _test_unique_facet_iterator(T); + const size_type ne = _test_unique_edge_iterator(T); + const size_type nv = _test_unique_vertex_iterator(T); + assert((nv-ne+nf-nc) == 0); + return nv-ne+nf-nc; +} + template < class Triangulation > typename Triangulation::size_type _test_triangulation_iterator( const Triangulation &T ) diff --git a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_triangulation_3.h b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_triangulation_3.h index 0cb56c38824f..b5d08b90ec6a 100644 --- a/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_triangulation_3.h +++ b/Periodic_3_triangulation_3/test/Periodic_3_triangulation_3/include/CGAL/_test_cls_periodic_3_triangulation_3.h @@ -479,10 +479,10 @@ _test_cls_periodic_3_triangulation_3(const PeriodicTriangulation &, _test_vertex_iterator(PT3_deg); _test_vertex_iterator(PT1_deg); - _test_unique_vertex_iterator(PT3); - _test_unique_vertex_iterator(PT1); - _test_unique_vertex_iterator(PT3_deg); - _test_unique_vertex_iterator(PT1_deg); + _test_triangulation_unique_iterator(PT3); + _test_triangulation_unique_iterator(PT1); + _test_triangulation_unique_iterator(PT3_deg); + _test_triangulation_unique_iterator(PT1_deg); _test_triangulation_iterator(PT3); _test_triangulation_iterator(PT1); From f41e69a5fe2fe6e093dbc4779bc6c1db56c8a006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 7 Jul 2023 02:09:35 +0200 Subject: [PATCH 0473/1398] Misc fixes --- .../Periodic_2_Delaunay_triangulation_2.h | 8 ++--- .../PackageDescription.txt | 4 +-- .../Periodic_2_triangulation_2.txt | 6 ++-- .../p2t2_find_conflicts.cpp | 33 +++++++++---------- .../include/CGAL/Periodic_2_triangulation_2.h | 6 ++-- .../Periodic_2_triangulation_iterators_2.h | 11 +++---- .../include/interface_test.h | 2 ++ .../include/CGAL/Periodic_3_triangulation_3.h | 9 +++-- .../Periodic_3_triangulation_iterators_3.h | 6 ++-- 9 files changed, 44 insertions(+), 41 deletions(-) diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h index b95c3c7f6078..9abd4e93570c 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_2.h @@ -198,7 +198,7 @@ class Periodic_2_Delaunay_triangulation_2 : public Periodic_2_triangulation_2(c) Any cell has its vertices ordered according to positive +(c) Any face has its vertices ordered according to positive orientation. See \cgalFigureRef{P2Triangulation2figorient}. \section P2T2_Delaunay Delaunay Triangulation @@ -264,7 +264,7 @@ to support periodicity: the vertex and face must be models of `Periodic_2TriangulationVertexBase_2` and `Periodic_2TriangulationFaceBase_2`. A model of such concept is `CGAL::Triangulation_data_structure_2`. It is parameterized by a vertex base class and a face base class, which gives the -possibility to customize the vertices and cells used by the triangulation data +possibility to customize the vertices and faces used by the triangulation data structure, and hence by the geometric triangulation using it. Basic models of the vertex and face concepts are provided: `CGAL::Periodic_2_triangulation_vertex_base_2` and `CGAL::Periodic_2_triangulation_face_base_2`. @@ -272,7 +272,7 @@ and `CGAL::Periodic_2_triangulation_face_base_2`. A default value for the triangulation data structure parameter is provided in all the triangulation classes, so it does not need to be specified by the user unless he wants to use a different triangulation data -structure or a different vertex or cell base class. +structure or a different vertex or face base class. \subsection P2T2FlexDesign Flexibility of the Design diff --git a/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/p2t2_find_conflicts.cpp b/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/p2t2_find_conflicts.cpp index 0491e319a8c8..b3bc862f3088 100644 --- a/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/p2t2_find_conflicts.cpp +++ b/Periodic_2_triangulation_2/examples/Periodic_2_triangulation_2/p2t2_find_conflicts.cpp @@ -27,24 +27,21 @@ int main() // Gets the conflict region of 100 random points // in the Delaunay tetrahedralization for (int i = 0; i != 100; ++i) - { - Point p = (*rnd++); - - // Locate the point - Delaunay::Locate_type lt; - int li; - Face_handle f = T.locate(p, lt, li); - if (lt == Delaunay::VERTEX) - continue; // Point already exists - - // Get the cells that conflict with p in a vector V, - // and a facet on the boundary of this hole in f. - std::vector V; - - T.get_conflicts(p, - std::back_inserter(V), // Conflict cells in V - f); - } + { + Point p = (*rnd++); + + // Locate the point + Delaunay::Locate_type lt; + int li; + Face_handle f = T.locate(p, lt, li); + if (lt == Delaunay::VERTEX) + continue; // Point already exists + + // Get the faces that conflict with p in a vector V. + std::vector V; + + T.get_conflicts(p, std::back_inserter(V), f); + } std::cout << "Final triangulation has " << T.number_of_vertices() << " vertices." << std::endl; diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h index 2ce4755742a8..2d2e3878f82a 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_2.h @@ -133,6 +133,7 @@ class Periodic_2_triangulation_2 typedef Face_iterator Finite_faces_iterator; typedef Edge_iterator Finite_edges_iterator; typedef Vertex_iterator Finite_vertices_iterator; + typedef Vertex_iterator All_vertices_iterator; typedef Face_iterator All_faces_iterator; // \} @@ -389,10 +390,11 @@ class Periodic_2_triangulation_2 /// Checks whether the triangulation is a valid simplicial complex in the one cover. bool is_triangulation_in_1_sheet() const; - /// Convert a 9 sheeted cover (used for sparse triangulations) to a single sheeted cover. + /// Converts a 9 sheeted cover (used for sparse triangulations) to a single sheeted cover. /// \pre !is_1_cover(); void convert_to_1_sheeted_covering(); - /// Convert a single sheeted cover (used for dense triangulations) to a 9 sheeted cover. + + /// Converts a single sheeted cover (used for dense triangulations) to a 9 sheeted cover. /// \pre is_1_cover(); void convert_to_9_sheeted_covering(); // \} diff --git a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h index 9b2afd4ba649..c3e7fb1164a4 100644 --- a/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h +++ b/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_iterators_2.h @@ -14,13 +14,11 @@ #include - #include #include #include -namespace CGAL -{ +namespace CGAL { template < class T > class Periodic_2_triangulation_triangle_iterator_2 @@ -234,7 +232,7 @@ class Periodic_2_triangulation_triangle_iterator_2 // intersect the boundary of the periodic domain. In UNIQUE mode // this means that the offset with respect to drawing should // differ in some entries. Otherwise we consider the offsets - // internally stored inside the cell telling us that this cell + // internally stored inside the face telling us that this face // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) _t->get_offsets(pos, off0, off1, off2); @@ -502,7 +500,7 @@ class Periodic_2_triangulation_segment_iterator_2 // intersect the boundary of the periodic domain. In UNIQUE mode // this means that the offset with respect to drawing should // differ in some entries. Otherwise we consider the offsets - // internally stored inside the cell telling us that this cell + // internally stored inside the face telling us that this face // wraps around the domain. if (_it == T::UNIQUE_COVER_DOMAIN) _t->get_offsets(*pos, off0, off1); @@ -797,7 +795,6 @@ template class Periodic_2_triangulation_unique_vertex_iterator_2 : public Filter_iterator > { - typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Vertex_iterator Vertex_iterator; @@ -805,8 +802,8 @@ class Periodic_2_triangulation_unique_vertex_iterator_2 typedef Filter_iterator Base; typedef Periodic_2_triangulation_unique_vertex_iterator_2 Self; -public: +public: Periodic_2_triangulation_unique_vertex_iterator_2() : Base() {} Periodic_2_triangulation_unique_vertex_iterator_2(const Base &b) : Base(b) {} diff --git a/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h b/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h index 7c50e0a4252d..c69f2858ef99 100644 --- a/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h +++ b/Periodic_2_triangulation_2/test/Periodic_2_triangulation_2/include/interface_test.h @@ -208,6 +208,8 @@ void test_iterators() Vertex_handle vh2 = t.insert(Point(0.7, 0.7)); CGAL_USE(vh2); + std::cout << "Cover = " << t.number_of_sheets()[0] << " " << t.number_of_sheets()[1] << std::endl; + // vertices size_t size = 0; for (typename T::Vertex_iterator vit = t_const.vertices_begin(); diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h index 19c56b919509..c1001de10c5c 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3.h @@ -1703,6 +1703,8 @@ class Periodic_3_triangulation_3 return _tds.facets_end(); } + // Finite iterators (= all iterators, for periodic triangulations) + Cell_iterator finite_cells_begin() const { return _tds.cells_begin(); } @@ -1731,6 +1733,8 @@ class Periodic_3_triangulation_3 return _tds.facets_end(); } + // All iterators (= finite, for periodic triangulations) + All_cells_iterator all_cells_begin() const { return _tds.cells_begin(); } @@ -1831,6 +1835,7 @@ class Periodic_3_triangulation_3 } // Circulators + Cell_circulator incident_cells(const Edge& e) const { return _tds.incident_cells(e); } @@ -3451,7 +3456,7 @@ periodic_remove(Vertex_handle v, nr_vec.push_back(boost::make_tuple(o_ch,o_i,new_ch)); nr_vec.push_back(boost::make_tuple(new_ch,i_i,o_ch)); - // for the other faces check, if they can also be glued + // for the other facets check, if they can also be glued for(unsigned int i = 0; i < 4; i++) { if(i != i_i) { Facet f = std::pair(new_ch,i); @@ -3463,7 +3468,7 @@ periodic_remove(Vertex_handle v, std::swap(vt.second,vt.third); outer_map[vt]= f; } else { - // glue the faces + // glue the facets typename Vertex_triple_Facet_map::value_type o_vt_f_pair2 = *oit2; Cell_handle o_ch2 = o_vt_f_pair2.second.first; int o_i2 = o_vt_f_pair2.second.second; diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h index 719060bed29d..67cacfe10841 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_triangulation_3/internal/Periodic_3_triangulation_iterators_3.h @@ -918,15 +918,15 @@ class Periodic_3_triangulation_unique_cell_iterator_3 // between a normal Vertex_iterator and this iterator template class Periodic_3_triangulation_unique_vertex_iterator_3 - : public Filter_iterator > { - + : public Filter_iterator > +{ typedef typename T::Vertex_handle Vertex_handle; typedef typename T::Vertex_iterator Vertex_iterator; typedef Filter_iterator > Base; typedef Periodic_3_triangulation_unique_vertex_iterator_3 Self; -public: +public: Periodic_3_triangulation_unique_vertex_iterator_3() : Base() {} Periodic_3_triangulation_unique_vertex_iterator_3(const Base &b) : Base(b) {} From 54c318b79481ed166ebfb385f6102ac14e0976cf Mon Sep 17 00:00:00 2001 From: albert-github Date: Fri, 7 Jul 2023 13:14:30 +0200 Subject: [PATCH 0474/1398] Spelling corrections Overnight test build gave a small error. --- .../doc/Polygon_mesh_processing/Polygon_mesh_processing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 13027e51161c..8d541588736c 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -21,7 +21,7 @@ given in Botsch et al.'s book on polygon mesh processing \cgalCite{botsch2010PMP A \a polygon \a mesh is a consistent and orientable surface mesh, that can have one or more boundaries. The \a faces are simple polygons. -The \an edges are segments. Each edge connects two \a vertices, +The \a edges are segments. Each edge connects two \a vertices, and is shared by two faces (including the \a null \a face for boundary edges). A polygon mesh can have any number of connected components, and also some self-intersections. In this package, a polygon mesh is considered to have the topology of a 2-manifold. From 549e3a1710e70c189430c78bce90cc10bf4e92a6 Mon Sep 17 00:00:00 2001 From: albert-github Date: Fri, 7 Jul 2023 14:29:42 +0200 Subject: [PATCH 0475/1398] Possibility to disable special CGAL documentation setting In the past it was possible by means of the option `-DCGAL_EXTRACT_ALL_NO_DETAILED_IF_EMPTY=OFF` with CMake to disable the specific CGAL setting though currently with the 1.8.13 version this didn't work (anymore). Also the setting has been renamed for the 1.9.6 version (and newer) to `NO_ADDITIONAL_DETAILS` this has now been made more flexible as well. --- Documentation/doc/CMakeLists.txt | 12 ++++++++++++ Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.9.6/BaseDoxyfile.in | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index fdb659ea2b5d..415fb56131ef 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -241,6 +241,18 @@ else() "#EXTRACT_ALL_NO_DETAILED_IF_EMPTY = NO") endif() +option(CGAL_NO_ADDITIONAL_DETAILS + "Use CGAL special doxygen setting NO_ADDITIONAL_DETAILS." ON) +if(CGAL_NO_ADDITIONAL_DETAILS) + set(CGAL_OPT_NO_ADDITIONAL_DETAILS + "NO_ADDITIONAL_DETAILS = YES") +else() + # The default is NO, so we could leave it out, but it is better to have a commented out placeholder + # this will work for versions with and without the setting. + set(CGAL_OPT_NO_ADDITIONAL_DETAILS + "#NO_ADDITIONAL_DETAILS = NO") +endif() + #we use two directories for the generation/reading of tag files to prevent issues #if the targets are built in parallel set(CGAL_DOC_TAG_GEN_DIR "${CMAKE_BINARY_DIR}/doc_gen_tags") diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index ae2cc84f6c17..b575adcb7826 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -262,7 +262,7 @@ EXTRACT_ALL = YES # the EXTRACT_ALL tag is set to NO. # The default value is: NO. -EXTRACT_ALL_NO_DETAILED_IF_EMPTY = YES +${CGAL_OPT_EXTRACT_ALL_NO_DETAILED_IF_EMPTY} # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 1cfd0a6ffd9f..0e32893b2c6c 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -791,5 +791,5 @@ GENERATE_LEGEND = NO # NO_ADDITIONAL_DETAILS tag is set to YES. This tag has no effect if # the EXTRACT_ALL tag is set to NO. # The default value is: NO. -NO_ADDITIONAL_DETAILS = YES +${CGAL_OPT_NO_ADDITIONAL_DETAILS} From 301728a8a9d4701aee5f9160fb319b59a4499cb2 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sun, 9 Jul 2023 12:43:36 +0200 Subject: [PATCH 0476/1398] issue #7395 Improvement of layout of model relations - Completed the cgalModels part --- .../CGAL/Algebraic_structure_traits.h | 18 +++++------ .../CGAL/Fraction_traits.h | 2 +- .../CGAL/Real_embeddable_traits.h | 2 +- .../CGAL/Algebraic_kernel_d_1.h | 2 +- .../CGAL/Algebraic_kernel_d_2.h | 2 +- .../CGAL/Algebraic_kernel_rs_gmpq_d_1.h | 2 +- .../CGAL/Algebraic_kernel_rs_gmpz_d_1.h | 2 +- .../CGAL/Alpha_shape_face_base_2.h | 2 +- .../CGAL/Alpha_shape_vertex_base_2.h | 2 +- .../CGAL/Alpha_shape_cell_base_3.h | 2 +- .../CGAL/Alpha_shape_vertex_base_3.h | 2 +- .../CGAL/Fixed_alpha_shape_cell_base_3.h | 2 +- .../CGAL/Fixed_alpha_shape_vertex_base_3.h | 2 +- .../CGAL/Apollonius_graph_2.h | 2 +- .../CGAL/Apollonius_graph_filtered_traits_2.h | 2 +- ...Apollonius_graph_hierarchy_vertex_base_2.h | 2 +- .../CGAL/Apollonius_graph_traits_2.h | 2 +- .../CGAL/Apollonius_graph_vertex_base_2.h | 2 +- .../CGAL/Apollonius_site_2.h | 2 +- .../CGAL/Arr_Bezier_curve_traits_2.h | 3 +- .../CGAL/Arr_algebraic_segment_traits_2.h | 2 +- .../Arr_bounded_planar_topology_traits_2.h | 2 +- .../CGAL/Arr_circle_segment_traits_2.h | 3 +- .../CGAL/Arr_circular_arc_traits_2.h | 2 +- .../CGAL/Arr_circular_line_arc_traits_2.h | 2 +- .../CGAL/Arr_conic_traits_2.h | 4 +-- .../Arr_consolidated_curve_data_traits_2.h | 2 +- .../CGAL/Arr_curve_data_traits_2.h | 2 +- .../CGAL/Arr_dcel_base.h | 8 ++--- .../CGAL/Arr_default_dcel.h | 2 +- .../CGAL/Arr_default_overlay_traits.h | 4 +-- .../CGAL/Arr_extended_dcel.h | 10 +++---- .../CGAL/Arr_face_index_map.h | 5 +--- .../Arr_geodesic_arc_on_sphere_traits_2.h | 29 ++++-------------- .../CGAL/Arr_landmarks_point_location.h | 3 +- .../CGAL/Arr_line_arc_traits_2.h | 2 +- .../CGAL/Arr_linear_traits_2.h | 4 +-- .../CGAL/Arr_naive_point_location.h | 3 +- .../Arr_non_caching_segment_basic_traits_2.h | 2 +- .../CGAL/Arr_non_caching_segment_traits_2.h | 4 +-- .../CGAL/Arr_polycurve_traits_2.h | 7 ++--- .../CGAL/Arr_polyline_traits_2.h | 9 ++---- .../CGAL/Arr_rational_function_traits_2.h | 20 ++++--------- .../CGAL/Arr_segment_traits_2.h | 4 +-- .../CGAL/Arr_spherical_topology_traits_2.h | 2 +- .../CGAL/Arr_trapezoid_ric_point_location.h | 3 +- .../CGAL/Arr_triangulation_point_location.h | 3 +- .../CGAL/Arr_unb_planar_topology_traits_2.h | 2 +- .../CGAL/Arr_vertex_index_map.h | 5 +--- .../CGAL/Arr_walk_along_line_point_location.h | 3 +- .../CGAL/IO/Arr_text_formatter.h | 9 ++---- .../CGAL/IO/Arr_with_history_text_formatter.h | 3 +- .../CGAL/HalfedgeDS_face_max_base_with_id.h | 2 +- .../HalfedgeDS_halfedge_max_base_with_id.h | 2 +- .../CGAL/HalfedgeDS_vertex_max_base_with_id.h | 2 +- .../CGAL/Linear_cell_complex_bgl_min_items.h | 2 +- BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h | 2 +- .../CGAL/Triangulation_face_base_with_id_2.h | 2 +- .../Triangulation_vertex_base_with_id_2.h | 2 +- BGL/doc/BGL/CGAL/boost/graph/properties.h | 10 +++---- BGL/include/CGAL/boost/graph/Dual.h | 2 +- .../CGAL/boost/graph/Face_filtered_graph.h | 4 +-- .../graph/Graph_with_descriptor_with_graph.h | 6 ++-- BGL/include/CGAL/boost/graph/Seam_mesh.h | 15 ++++------ BGL/include/CGAL/boost/graph/iterator.h | 28 ++++++++--------- .../Delaunay_domain_2.h | 2 +- .../Discrete_harmonic_2.h | 2 +- .../Barycentric_coordinates_2/Mean_value_2.h | 2 +- .../Barycentric_coordinates_2/Wachspress_2.h | 2 +- .../Gps_default_dcel.h | 6 ++-- .../CGAL/General_polygon_2.h | 2 +- .../CGAL/Gps_circle_segment_traits_2.h | 2 +- .../CGAL/Gps_segment_traits_2.h | 2 +- .../CGAL/Gps_traits_2.h | 2 +- .../Approximate_min_ellipsoid_d_traits_2.h | 2 +- .../Approximate_min_ellipsoid_d_traits_3.h | 2 +- .../Approximate_min_ellipsoid_d_traits_d.h | 2 +- .../CGAL/Min_circle_2_traits_2.h | 2 +- .../CGAL/Min_ellipse_2_traits_2.h | 2 +- .../CGAL/Min_quadrilateral_traits_2.h | 2 +- .../CGAL/Min_sphere_annulus_d_traits_2.h | 2 +- .../CGAL/Min_sphere_annulus_d_traits_3.h | 2 +- .../CGAL/Min_sphere_annulus_d_traits_d.h | 2 +- .../CGAL/Min_sphere_of_points_d_traits_2.h | 2 +- .../CGAL/Min_sphere_of_points_d_traits_3.h | 2 +- .../CGAL/Min_sphere_of_points_d_traits_d.h | 2 +- .../CGAL/Min_sphere_of_spheres_d_traits_2.h | 2 +- .../CGAL/Min_sphere_of_spheres_d_traits_3.h | 2 +- .../CGAL/Min_sphere_of_spheres_d_traits_d.h | 2 +- .../CGAL/rectangular_p_center_2.h | 2 +- .../CGAL/Box_intersection_d/Box_d.h | 2 +- .../CGAL/Box_intersection_d/Box_traits_d.h | 2 +- .../Box_intersection_d/Box_with_handle_d.h | 2 +- .../CGAL/Algebraic_kernel_for_circles_2_2.h | 2 +- .../Circular_kernel_2/CGAL/Circular_arc_2.h | 2 +- .../CGAL/Circular_arc_point_2.h | 2 +- .../CGAL/Circular_kernel_2.h | 2 +- .../CGAL/Exact_circular_kernel_2.h | 2 +- .../doc/Circular_kernel_2/CGAL/Line_arc_2.h | 2 +- .../Circular_kernel_2/CGAL/Polynomials_1_2.h | 2 +- .../Circular_kernel_2/CGAL/Polynomials_2_2.h | 2 +- .../CGAL/Root_for_circles_2_2.h | 2 +- .../CGAL/Algebraic_kernel_for_spheres_2_3.h | 2 +- .../Circular_kernel_3/CGAL/Circular_arc_3.h | 2 +- .../CGAL/Circular_arc_point_3.h | 2 +- .../CGAL/Exact_spherical_kernel_3.h | 2 +- .../doc/Circular_kernel_3/CGAL/Line_arc_3.h | 2 +- .../Circular_kernel_3/CGAL/Polynomials_1_3.h | 2 +- .../Circular_kernel_3/CGAL/Polynomials_2_3.h | 2 +- .../CGAL/Polynomials_for_line_3.h | 2 +- .../CGAL/Root_for_spheres_2_3.h | 2 +- .../CGAL/Spherical_kernel_3.h | 2 +- .../ETHZ/Random_forest_classifier.h | 2 +- .../CGAL/Classification/Feature_base.h | 2 +- .../include/CGAL/Classification/Label.h | 2 +- .../CGAL/Classification/Mesh_neighborhood.h | 4 +-- .../OpenCV/Random_forest_classifier.h | 2 +- .../Classification/Point_set_neighborhood.h | 4 +-- .../Sum_of_weighted_features_classifier.h | 2 +- .../CGAL/Classification/property_maps.h | 4 +-- .../Combinatorial_map/CGAL/Cell_attribute.h | 2 +- .../CGAL/Cell_attribute_with_id.h | 2 +- .../CGAL/Combinatorial_map.h | 2 +- .../CGAL/Generic_map_min_items.h | 2 +- .../CGAL/Convex_hull_traits_adapter_2.h | 2 +- .../CGAL/convex_hull_constructive_traits_2.h | 2 +- .../Convex_hull_2/CGAL/convex_hull_traits_2.h | 2 +- .../Convex_hull_3/CGAL/Convex_hull_traits_3.h | 3 +- .../CGAL/Extreme_points_traits_adapter_3.h | 3 +- .../CGAL/Convex_hull_d_traits_3.h | 2 +- .../doc/resources/1.8.13/BaseDoxyfile.in | 5 +++- .../doc/resources/1.9.6/BaseDoxyfile.in | 5 +++- .../doc/Envelope_2/CGAL/Envelope_diagram_1.h | 2 +- .../doc/Envelope_3/CGAL/Env_plane_traits_3.h | 2 +- .../doc/Envelope_3/CGAL/Env_sphere_traits_3.h | 2 +- .../CGAL/Env_surface_data_traits_3.h | 2 +- .../Envelope_3/CGAL/Env_triangle_traits_3.h | 2 +- .../Generalized_map/CGAL/Generalized_map.h | 2 +- .../CGAL/Random_convex_set_traits_2.h | 2 +- .../doc/Generator/CGAL/point_generators_2.h | 28 +++++++---------- .../doc/Generator/CGAL/point_generators_3.h | 30 +++++++------------ .../doc/Generator/CGAL/point_generators_d.h | 9 ++---- .../doc/HalfedgeDS/CGAL/HalfedgeDS_default.h | 2 +- .../HalfedgeDS/CGAL/HalfedgeDS_face_base.h | 2 +- .../CGAL/HalfedgeDS_face_min_base.h | 2 +- .../CGAL/HalfedgeDS_halfedge_base.h | 2 +- .../CGAL/HalfedgeDS_halfedge_min_base.h | 2 +- .../doc/HalfedgeDS/CGAL/HalfedgeDS_items_2.h | 2 +- .../doc/HalfedgeDS/CGAL/HalfedgeDS_list.h | 2 +- .../HalfedgeDS/CGAL/HalfedgeDS_min_items.h | 2 +- .../doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h | 2 +- .../HalfedgeDS/CGAL/HalfedgeDS_vertex_base.h | 2 +- .../CGAL/HalfedgeDS_vertex_min_base.h | 2 +- .../Intrinsic_Delaunay_triangulation_3.h | 2 +- ...bolic_Delaunay_triangulation_CK_traits_2.h | 2 +- ...perbolic_Delaunay_triangulation_traits_2.h | 2 +- .../Hyperbolic_triangulation_face_base_2.h | 2 +- .../CGAL/Extremal_polygon_traits_2.h | 4 +-- .../Interpolation_gradient_fitting_traits_2.h | 3 +- .../CGAL/Interpolation_traits_2.h | 2 +- .../CGAL/Voronoi_intersection_2_traits_3.h | 2 +- .../CGAL/Interval_skip_list_interval.h | 2 +- .../Interval_skip_list/CGAL/Level_interval.h | 2 +- .../doc/Kernel_23/CGAL/Aff_transformation_2.h | 2 +- .../doc/Kernel_23/CGAL/Aff_transformation_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Bbox_2.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Bbox_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Cartesian.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Circle_2.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Circle_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Direction_2.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Direction_3.h | 2 +- ...ct_predicates_exact_constructions_kernel.h | 2 +- ...exact_constructions_kernel_with_kth_root.h | 2 +- ..._exact_constructions_kernel_with_root_of.h | 2 +- ...tes_exact_constructions_kernel_with_sqrt.h | 2 +- ..._predicates_inexact_constructions_kernel.h | 2 +- .../doc/Kernel_23/CGAL/Filtered_kernel.h | 4 +-- Kernel_23/doc/Kernel_23/CGAL/Homogeneous.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h | 3 +- .../doc/Kernel_23/CGAL/Iso_rectangle_2.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Line_2.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Line_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Plane_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Point_2.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Point_3.h | 3 +- .../doc/Kernel_23/CGAL/Projection_traits_3.h | 7 +---- .../Kernel_23/CGAL/Projection_traits_xy_3.h | 16 ++++------ Kernel_23/doc/Kernel_23/CGAL/Ray_2.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Ray_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Segment_2.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Segment_3.h | 3 +- .../doc/Kernel_23/CGAL/Simple_cartesian.h | 2 +- .../doc/Kernel_23/CGAL/Simple_homogeneous.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/Vector_2.h | 3 +- Kernel_23/doc/Kernel_23/CGAL/Vector_3.h | 3 +- .../doc/Kernel_23/CGAL/Weighted_point_2.h | 3 +- .../doc/Kernel_23/CGAL/Weighted_point_3.h | 3 +- Kernel_d/doc/Kernel_d/CGAL/Cartesian_d.h | 2 +- Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h | 16 ++++------ Kernel_d/doc/Kernel_d/CGAL/Epick_d.h | 16 ++++------ Kernel_d/doc/Kernel_d/CGAL/Homogeneous_d.h | 2 +- Kernel_d/doc/Kernel_d/CGAL/Linear_algebraCd.h | 2 +- Kernel_d/doc/Kernel_d/CGAL/Linear_algebraHd.h | 2 +- .../Kernel--CartesianConstIterator_d.h | 2 +- .../CGAL/Cell_attribute_with_point.h | 2 +- .../CGAL/Cell_attribute_with_point_and_id.h | 2 +- ...inear_cell_complex_for_combinatorial_map.h | 3 +- .../Linear_cell_complex_for_generalized_map.h | 3 +- .../CGAL/Linear_cell_complex_min_items.h | 2 +- .../CGAL/Linear_cell_complex_traits.h | 2 +- .../doc/Matrix_search/CGAL/Dynamic_matrix.h | 3 +- .../Sorted_matrix_search_traits_adaptor.h | 2 +- .../Mesh_2/CGAL/Delaunay_mesh_criteria_2.h | 2 +- .../Mesh_2/CGAL/Delaunay_mesh_face_base_2.h | 2 +- .../CGAL/Delaunay_mesh_size_criteria_2.h | 2 +- .../Mesh_2/CGAL/Delaunay_mesh_vertex_base_2.h | 2 +- .../Mesh_3/CGAL/Gray_image_mesh_domain_3.h | 2 +- .../doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h | 2 +- .../Mesh_3/CGAL/Labeled_image_mesh_domain_3.h | 2 +- Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h | 2 +- .../doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h | 2 +- .../Mesh_3/CGAL/Polyhedral_mesh_domain_3.h | 2 +- .../Polyhedral_mesh_domain_with_features_3.h | 2 +- Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h | 2 +- .../include/CGAL/Compact_mesh_cell_base_3.h | 2 +- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 2 +- Mesh_3/include/CGAL/Mesh_cell_base_3.h | 2 +- .../CGAL/Mesh_constant_domain_field_3.h | 2 +- Mesh_3/include/CGAL/Mesh_criteria_3.h | 2 +- .../Mesh_domain_with_polyline_features_3.h | 2 +- Mesh_3/include/CGAL/Mesh_edge_criteria_3.h | 2 +- Mesh_3/include/CGAL/Mesh_vertex_base_3.h | 2 +- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 2 +- .../CGAL/Sizing_field_with_aabb_tree.h | 2 +- .../CGAL/Polygon_convex_decomposition_2.h | 6 ++-- .../CGAL/Polygon_nop_decomposition_2.h | 2 +- .../Polygon_triangulation_decomposition_2.h | 2 +- .../CGAL/Polygon_vertical_decomposition_2.h | 2 +- ...mall_side_angle_bisector_decomposition_2.h | 2 +- .../Miscellany/CGAL/Handle_hash_function.h | 2 +- .../Modular_arithmetic/CGAL/Modular_traits.h | 2 +- .../doc/Modular_arithmetic/CGAL/Residue.h | 2 +- Nef_2/doc/Nef_2/CGAL/Extended_cartesian.h | 2 +- Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h | 2 +- .../CGAL/Filtered_extended_homogeneous.h | 2 +- .../doc/Number_types/CGAL/CORE_BigFloat.h | 4 +-- .../doc/Number_types/CGAL/CORE_BigInt.h | 3 +- .../doc/Number_types/CGAL/CORE_BigRat.h | 5 +--- .../doc/Number_types/CGAL/CORE_Expr.h | 4 +-- Number_types/doc/Number_types/CGAL/Gmpfi.h | 3 +- Number_types/doc/Number_types/CGAL/Gmpfr.h | 3 +- Number_types/doc/Number_types/CGAL/Gmpq.h | 4 +-- Number_types/doc/Number_types/CGAL/Gmpz.h | 3 +- Number_types/doc/Number_types/CGAL/Gmpzf.h | 3 +- .../doc/Number_types/CGAL/Interval_nt.h | 3 +- .../doc/Number_types/CGAL/Lazy_exact_nt.h | 5 ++-- Number_types/doc/Number_types/CGAL/MP_Float.h | 3 +- Number_types/doc/Number_types/CGAL/Mpzf.h | 3 +- .../doc/Number_types/CGAL/NT_converter.h | 2 +- .../Number_types/CGAL/Number_type_checker.h | 3 +- Number_types/doc/Number_types/CGAL/Quotient.h | 4 +-- .../doc/Number_types/CGAL/Sqrt_extension.h | 16 +++++----- Number_types/doc/Number_types/CGAL/double.h | 3 +- Number_types/doc/Number_types/CGAL/float.h | 3 +- Number_types/doc/Number_types/CGAL/gmpxx.h | 7 ++--- .../doc/Number_types/CGAL/leda_bigfloat.h | 4 +-- .../doc/Number_types/CGAL/leda_integer.h | 3 +- .../doc/Number_types/CGAL/leda_rational.h | 5 +--- .../doc/Number_types/CGAL/leda_real.h | 4 +-- .../doc/Number_types/CGAL/long_long.h | 3 +- .../doc/Number_types/CGAL/utils_classes.h | 6 ++-- Number_types/include/CGAL/Exact_algebraic.h | 5 +--- Number_types/include/CGAL/Exact_integer.h | 3 +- Number_types/include/CGAL/Exact_rational.h | 5 +--- .../Oriented_bounding_box_traits_3.h | 2 +- Orthtree/include/CGAL/Orthtree/Node.h | 2 +- Orthtree/include/CGAL/Orthtree/Traversals.h | 8 ++--- Orthtree/include/CGAL/Orthtree_traits_2.h | 2 +- Orthtree/include/CGAL/Orthtree_traits_3.h | 2 +- Orthtree/include/CGAL/Orthtree_traits_d.h | 2 +- .../CGAL/Partition_is_valid_traits_2.h | 2 +- .../doc/Partition_2/CGAL/Partition_traits_2.h | 6 +--- .../CGAL/polygon_function_objects.h | 6 ++-- ...riodic_2_Delaunay_triangulation_traits_2.h | 2 +- .../CGAL/Periodic_2_triangulation_2.h | 2 +- .../Periodic_2_triangulation_face_base_2.h | 2 +- .../CGAL/Periodic_2_triangulation_traits_2.h | 2 +- .../Periodic_2_triangulation_vertex_base_2.h | 2 +- ...riodic_3_Delaunay_triangulation_traits_3.h | 2 +- .../CGAL/Periodic_3_offset_3.h | 2 +- ...eriodic_3_regular_triangulation_traits_3.h | 2 +- .../Periodic_3_triangulation_ds_cell_base_3.h | 2 +- ...eriodic_3_triangulation_ds_vertex_base_3.h | 2 +- .../CGAL/Periodic_3_triangulation_traits_3.h | 2 +- ...perbolic_Delaunay_triangulation_traits_2.h | 2 +- ...c_4_hyperbolic_triangulation_face_base_2.h | 2 +- ...4_hyperbolic_triangulation_vertex_base_2.h | 2 +- Point_set_3/include/CGAL/Point_set_3.h | 10 +++---- .../include/CGAL/Point_with_normal_3.h | 2 +- .../include/CGAL/Lightweight_vector_3.h | 2 +- .../CGAL/Poisson_reconstruction_function.h | 2 +- .../CGAL/General_polygon_with_holes_2.h | 2 +- Polygon/include/CGAL/Polygon_with_holes_2.h | 2 +- .../doc/Polyhedron/CGAL/Polyhedron_items_3.h | 2 +- .../Polyhedron/CGAL/Polyhedron_min_items_3.h | 2 +- .../doc/Polyhedron/CGAL/Polyhedron_traits_3.h | 2 +- .../CGAL/Polyhedron_traits_with_normals_3.h | 2 +- .../Hybrid_squared_distance_cost.h | 2 +- .../Scaled_squared_distance_cost.h | 2 +- .../Squared_distance_cost.h | 2 +- .../Stop_above_cost_threshold.h | 2 +- .../Stop_below_count_ratio_threshold.h | 2 +- .../Stop_below_count_threshold.h | 2 +- .../Polyline_simplification_2/Vertex_base_2.h | 2 +- .../doc/Polynomial/CGAL/Exponent_vector.h | 7 +---- Polynomial/doc/Polynomial/CGAL/Polynomial.h | 20 ++++++------- .../doc/Polynomial/CGAL/Polynomial_traits_d.h | 2 +- .../CGAL/Polytope_distance_d_traits_2.h | 2 +- .../CGAL/Polytope_distance_d_traits_3.h | 2 +- .../CGAL/Polytope_distance_d_traits_d.h | 2 +- .../CGAL/Width_default_traits_3.h | 2 +- Property_map/include/CGAL/property_map.h | 20 ++++++------- QP_solver/doc/QP_solver/CGAL/QP_models.h | 23 ++++---------- .../CGAL/Mesh_complex_3_in_triangulation_3.h | 2 +- .../CGAL/Simplicial_mesh_cell_base_3.h | 2 +- .../CGAL/Simplicial_mesh_vertex_base_3.h | 4 +-- .../doc/STL_Extension/CGAL/Complexity_tags.h | 6 ++-- .../doc/STL_Extension/CGAL/Default.h | 3 +- .../doc/STL_Extension/CGAL/Location_policy.h | 3 +- .../STL_Extension/CGAL/Spatial_lock_grid_3.h | 2 +- .../doc/STL_Extension/CGAL/function_objects.h | 26 ++++++++-------- .../doc/STL_Extension/CGAL/iterator.h | 20 ++++++------- STL_Extension/doc/STL_Extension/CGAL/tags.h | 4 +-- .../Advancing_front_mesher.h | 2 +- .../Alpha_shape_mesher.h | 2 +- .../Jet_smoother.h | 2 +- .../Weighted_PCA_smoother.h | 2 +- .../CGAL/Range_segment_tree_traits.h | 12 ++++---- .../CGAL/Segment_Delaunay_graph_2.h | 2 +- .../CGAL/Segment_Delaunay_graph_face_base_2.h | 2 +- ...Segment_Delaunay_graph_filtered_traits_2.h | 10 ++----- .../CGAL/Segment_Delaunay_graph_hierarchy_2.h | 4 +-- ...t_Delaunay_graph_hierarchy_vertex_base_2.h | 2 +- .../CGAL/Segment_Delaunay_graph_site_2.h | 2 +- .../Segment_Delaunay_graph_storage_site_2.h | 2 +- ..._Delaunay_graph_storage_site_with_info_2.h | 2 +- .../Segment_Delaunay_graph_storage_traits_2.h | 2 +- ...elaunay_graph_storage_traits_with_info_2.h | 2 +- .../CGAL/Segment_Delaunay_graph_traits_2.h | 4 +-- .../Segment_Delaunay_graph_vertex_base_2.h | 2 +- .../CGAL/Segment_Delaunay_graph_Linf_2.h | 2 +- ...nt_Delaunay_graph_Linf_filtered_traits_2.h | 4 +-- .../Segment_Delaunay_graph_Linf_traits_2.h | 4 +-- .../Efficient_RANSAC_traits.h | 2 +- .../Point_set/K_neighbor_query.h | 2 +- .../Least_squares_circle_fit_region.h | 2 +- .../Least_squares_cylinder_fit_region.h | 2 +- .../Point_set/Least_squares_line_fit_region.h | 2 +- .../Least_squares_plane_fit_region.h | 2 +- .../Least_squares_sphere_fit_region.h | 2 +- .../Point_set/Sphere_neighbor_query.h | 2 +- .../Least_squares_plane_fit_region.h | 2 +- .../Polygon_mesh/One_ring_neighbor_query.h | 2 +- .../Polygon_mesh/Polyline_graph.h | 2 +- .../Least_squares_line_fit_region.h | 2 +- .../Contours/Longest_direction_2.h | 2 +- .../Contours/Multiple_directions_2.h | 2 +- .../Contours/User_defined_directions_2.h | 2 +- .../Segments/Angle_regularization_2.h | 2 +- .../Segments/Delaunay_neighbor_query_2.h | 2 +- .../Segments/Offset_regularization_2.h | 2 +- .../doc/Skin_surface_3/CGAL/Skin_surface_3.h | 2 +- .../CGAL/Skin_surface_traits_3.h | 2 +- .../Skin_surface_3/CGAL/Union_of_balls_3.h | 2 +- .../CGAL/Snap_rounding_traits_2.h | 2 +- .../include/CGAL/Default_diagonalize_traits.h | 2 +- .../include/CGAL/Diagonalize_traits.h | 2 +- .../include/CGAL/Eigen_diagonalize_traits.h | 2 +- Solver_interface/include/CGAL/Eigen_matrix.h | 2 +- .../include/CGAL/Eigen_solver_traits.h | 2 +- .../include/CGAL/Eigen_sparse_matrix.h | 4 +-- Solver_interface/include/CGAL/Eigen_svd.h | 2 +- Solver_interface/include/CGAL/Eigen_vector.h | 3 +- .../CGAL/GLPK_mixed_integer_program_traits.h | 2 +- .../CGAL/Mixed_integer_program_traits.h | 8 ++--- .../CGAL/OSQP_quadratic_program_traits.h | 2 +- .../CGAL/SCIP_mixed_integer_program_traits.h | 2 +- .../CGAL/Euclidean_distance.h | 2 +- .../CGAL/Euclidean_distance_sphere_point.h | 2 +- .../Spatial_searching/CGAL/Fuzzy_iso_box.h | 2 +- .../doc/Spatial_searching/CGAL/Fuzzy_sphere.h | 2 +- .../CGAL/Manhattan_distance_iso_box_point.h | 2 +- .../Spatial_searching/CGAL/Plane_separator.h | 2 +- .../Spatial_searching/CGAL/Search_traits.h | 2 +- .../Spatial_searching/CGAL/Search_traits_2.h | 3 +- .../Spatial_searching/CGAL/Search_traits_3.h | 3 +- .../CGAL/Search_traits_adapter.h | 8 ++--- .../Spatial_searching/CGAL/Search_traits_d.h | 3 +- .../doc/Spatial_searching/CGAL/Splitters.h | 14 ++++----- .../CGAL/Weighted_Minkowski_distance.h | 2 +- .../CGAL/Hilbert_policy_tags.h | 9 ++---- .../CGAL/Spatial_sort_traits_adapter_2.h | 2 +- .../CGAL/Spatial_sort_traits_adapter_3.h | 2 +- .../CGAL/Spatial_sort_traits_adapter_d.h | 2 +- .../CGAL/Polygon_offset_builder_traits_2.h | 2 +- .../CGAL/Straight_skeleton_2.h | 2 +- .../CGAL/Straight_skeleton_builder_2.h | 2 +- .../CGAL/Straight_skeleton_builder_traits_2.h | 2 +- .../CGAL/Straight_skeleton_converter_2.h | 2 +- .../CGAL/Straight_skeleton_face_base_2.h | 2 +- .../CGAL/Straight_skeleton_halfedge_base_2.h | 2 +- .../CGAL/Straight_skeleton_vertex_base_2.h | 2 +- .../Stream_lines_2/CGAL/Euler_integrator_2.h | 2 +- .../doc/Stream_lines_2/CGAL/Regular_grid_2.h | 2 +- .../CGAL/Runge_kutta_integrator_2.h | 2 +- .../Stream_lines_2/CGAL/Triangular_field_2.h | 2 +- .../include/CGAL/IO/Istream_iterator.h | 2 +- .../include/CGAL/IO/Ostream_iterator.h | 2 +- .../subdivision_masks_3.h | 8 ++--- .../include/CGAL/Surface_mesh/Properties.h | 2 +- .../include/CGAL/Surface_mesh/Surface_mesh.h | 18 ++++------- .../L21_metric_plane_proxy.h | 2 +- .../L2_metric_plane_proxy.h | 2 +- ...ormation_Eigen_closest_rotation_traits_3.h | 2 +- ...on_Eigen_polar_closest_rotation_traits_3.h | 2 +- .../ARAP_parameterizer_3.h | 2 +- .../Barycentric_mapping_parameterizer_3.h | 2 +- .../Circular_border_parameterizer_3.h | 6 ++-- .../Discrete_authalic_parameterizer_3.h | 2 +- .../Discrete_conformal_map_parameterizer_3.h | 2 +- .../Fixed_border_parameterizer_3.h | 2 +- .../LSCM_parameterizer_3.h | 2 +- .../MVC_post_processor_3.h | 2 +- .../Mean_value_coordinates_parameterizer_3.h | 2 +- .../Square_border_parameterizer_3.h | 6 ++-- .../Two_vertices_parameterizer_3.h | 2 +- .../Surface_mesh_shortest_path_traits.h | 4 +-- .../Edge_collapse_visitor_base.h | 2 +- .../Bounded_distance_placement.h | 2 +- .../Bounded_normal_change_filter.h | 2 +- .../Bounded_normal_change_placement.h | 2 +- .../Edge_collapse/Constrained_placement.h | 2 +- .../Count_ratio_stop_predicate.h | 2 +- .../Edge_collapse/Count_stop_predicate.h | 2 +- .../Edge_count_ratio_stop_predicate.h | 2 +- .../Edge_collapse/Edge_count_stop_predicate.h | 2 +- .../Policies/Edge_collapse/Edge_length_cost.h | 2 +- .../Edge_length_stop_predicate.h | 2 +- .../Face_count_ratio_stop_predicate.h | 2 +- .../Edge_collapse/Face_count_stop_predicate.h | 2 +- .../Edge_collapse/LindstromTurk_cost.h | 2 +- .../Edge_collapse/LindstromTurk_placement.h | 2 +- .../Edge_collapse/Midpoint_placement.h | 2 +- .../Polyhedral_envelope_filter.h | 2 +- .../CGAL/Polygonal_schema_min_items.h | 2 +- .../Surface_mesher/CGAL/Gray_level_image_3.h | 2 +- .../Surface_mesher/CGAL/Implicit_surface_3.h | 2 +- .../CGAL/Surface_mesh_cell_base_3.h | 2 +- ...urface_mesh_complex_2_in_triangulation_3.h | 2 +- .../CGAL/Surface_mesh_default_criteria_3.h | 2 +- .../Surface_mesh_default_triangulation_3.h | 2 +- .../CGAL/Surface_mesh_vertex_base_3.h | 2 +- .../CGAL/Triangulation_data_structure_2.h | 2 +- .../TDS_2/CGAL/Triangulation_ds_face_base_2.h | 2 +- .../CGAL/Triangulation_ds_vertex_base_2.h | 2 +- .../Concepts/TriangulationDataStructure_2.h | 4 +-- .../CGAL/Triangulation_data_structure_3.h | 2 +- .../TDS_3/CGAL/Triangulation_ds_cell_base_3.h | 2 +- .../CGAL/Triangulation_ds_vertex_base_3.h | 2 +- .../Remeshing_cell_base_3.h | 3 +- .../Remeshing_vertex_base_3.h | 3 +- .../CGAL/Triangulation_data_structure.h | 4 +-- .../CGAL/Triangulation_ds_full_cell.h | 2 +- .../CGAL/Triangulation_ds_vertex.h | 2 +- .../Triangulation/CGAL/Triangulation_face.h | 2 +- .../CGAL/Triangulation_full_cell.h | 4 +-- .../Triangulation/CGAL/Triangulation_vertex.h | 4 +-- .../Constrained_triangulation_face_base_2.h | 2 +- .../CGAL/Regular_triangulation_face_base_2.h | 2 +- .../Regular_triangulation_vertex_base_2.h | 2 +- .../CGAL/Triangulation_face_base_2.h | 2 +- .../Triangulation_face_base_with_info_2.h | 6 ++-- .../CGAL/Triangulation_hierarchy_2.h | 2 +- .../CGAL/Triangulation_vertex_base_2.h | 2 +- .../Triangulation_vertex_base_with_info_2.h | 6 ++-- .../CGAL/Delaunay_triangulation_cell_base_3.h | 2 +- ...angulation_cell_base_with_circumcenter_3.h | 2 +- .../CGAL/Regular_triangulation_cell_base_3.h | 2 +- ...n_cell_base_with_weighted_circumcenter_3.h | 2 +- ...Regular_triangulation_euclidean_traits_3.h | 2 +- .../Regular_triangulation_vertex_base_3.h | 2 +- .../CGAL/Triangulation_cell_base_3.h | 2 +- .../Triangulation_cell_base_with_info_3.h | 3 +- .../CGAL/Triangulation_vertex_base_3.h | 2 +- .../Triangulation_vertex_base_with_info_3.h | 3 +- .../CGAL/Triangulation_segment_traverser_3.h | 2 +- ...elaunay_triangulation_on_sphere_traits_2.h | 2 +- .../CGAL/Projection_on_sphere_traits_3.h | 2 +- .../Triangulation_on_sphere_face_base_2.h | 2 +- .../Triangulation_on_sphere_vertex_base_2.h | 2 +- .../CGAL/Rotational_sweep_visibility_2.h | 2 +- .../CGAL/Simple_polygon_visibility_2.h | 2 +- .../CGAL/Triangular_expansion_visibility_2.h | 2 +- .../Apollonius_graph_adaptation_policies_2.h | 4 +-- .../Apollonius_graph_adaptation_traits_2.h | 2 +- ...unay_triangulation_adaptation_policies_2.h | 4 +-- ...launay_triangulation_adaptation_traits_2.h | 2 +- .../CGAL/Identity_policy_2.h | 2 +- ...ular_triangulation_adaptation_policies_2.h | 4 +-- ...egular_triangulation_adaptation_traits_2.h | 2 +- ...ent_Delaunay_graph_adaptation_policies_2.h | 4 +-- ...gment_Delaunay_graph_adaptation_traits_2.h | 2 +- .../CGAL/Voronoi_diagram_2.h | 18 ++--------- .../CGAL/Weights/discrete_harmonic_weights.h | 2 +- .../include/CGAL/Weights/mean_value_weights.h | 2 +- .../include/CGAL/Weights/wachspress_weights.h | 2 +- 521 files changed, 738 insertions(+), 964 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Algebraic_structure_traits.h b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Algebraic_structure_traits.h index ebc961629571..4b83632b1a45 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Algebraic_structure_traits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Algebraic_structure_traits.h @@ -5,7 +5,7 @@ namespace CGAL { An instance of `Algebraic_structure_traits` is a model of `AlgebraicStructureTraits`, where T is the associated type. -\cgalModels `AlgebraicStructureTraits` +\cgalModels{AlgebraicStructureTraits} */ template< typename T > @@ -22,7 +22,7 @@ namespace CGAL { Tag indicating that a type is a model of the `EuclideanRing` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `EuclideanRing` \sa `AlgebraicStructureTraits` @@ -38,7 +38,7 @@ struct Euclidean_ring_tag : public Unique_factorization_domain_tag { Tag indicating that a type is a model of the `Field` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `Field` \sa `AlgebraicStructureTraits` @@ -54,7 +54,7 @@ struct Field_tag : public Integral_domain_tag { Tag indicating that a type is a model of the `FieldWithKthRoot` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `FieldWithKthRoot` \sa `AlgebraicStructureTraits` @@ -70,7 +70,7 @@ struct Field_with_kth_root_tag : public Field_with_sqrt_tag { Tag indicating that a type is a model of the `FieldWithRootOf` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `FieldWithRootOf` \sa `AlgebraicStructureTraits` @@ -86,7 +86,7 @@ struct Field_with_root_of_tag : public Field_with_kth_root_tag { Tag indicating that a type is a model of the `FieldWithSqrt` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `FieldWithSqrt` \sa `AlgebraicStructureTraits` @@ -102,7 +102,7 @@ struct Field_with_sqrt_tag : public Field_tag { Tag indicating that a type is a model of the `IntegralDomain` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `IntegralDomain` \sa `AlgebraicStructureTraits` @@ -118,7 +118,7 @@ struct Integral_domain_tag : public Integral_domain_without_division_tag { Tag indicating that a type is a model of the `IntegralDomainWithoutDivision` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `IntegralDomainWithoutDivision` @@ -133,7 +133,7 @@ struct Integral_domain_without_division_tag { Tag indicating that a type is a model of the `UniqueFactorizationDomain` concept. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `UniqueFactorizationDomain` \sa `AlgebraicStructureTraits` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Fraction_traits.h b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Fraction_traits.h index d54d382dfd9f..025487d32486 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Fraction_traits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Fraction_traits.h @@ -6,7 +6,7 @@ namespace CGAL { An instance of `Fraction_traits` is a model of `FractionTraits`, where `T` is the associated type. -\cgalModels `FractionTraits` +\cgalModels{FractionTraits} */ template< typename T > diff --git a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Real_embeddable_traits.h b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Real_embeddable_traits.h index 90953f33c910..5c4966645e7c 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Real_embeddable_traits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/CGAL/Real_embeddable_traits.h @@ -6,7 +6,7 @@ namespace CGAL { An instance of `Real_embeddable_traits` is a model of `RealEmbeddableTraits`, where T is the associated type. -\cgalModels `RealEmbeddableTraits` +\cgalModels{RealEmbeddableTraits} */ template< typename T > diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_1.h index a3e31bea51db..05b59d29f72a 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_1.h @@ -27,7 +27,7 @@ approximation of an algebraic real root is a slightly modified (filtered) version of the one presented in \cgalCite{abbott-qir-06}. The method has quadratic convergence. -\cgalModels `AlgebraicKernel_d_1` +\cgalModels{AlgebraicKernel_d_1} \sa `AlgebraicKernel_d_1` \sa `Polynomial_d` diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_2.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_2.h index c4b643bfab93..35472409ffbf 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_2.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_d_2.h @@ -47,7 +47,7 @@ above. `ROOT` should be one of the integer types. See also the documentation of `Sqrt_extension`. \cgalAdvancedEnd -\cgalModels `AlgebraicKernel_d_2` +\cgalModels{AlgebraicKernel_d_2} \sa `AlgebraicKernel_d_1` \sa `AlgebraicKernel_d_2` diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpq_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpq_d_1.h index 204f5b233fc7..dc0f525aeeb3 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpq_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpq_d_1.h @@ -12,7 +12,7 @@ rational univariate polynomial root isolation. It is a model of the isolate integer polynomials, the operations of this kernel have the overhead of converting the polynomials to integer. -\cgalModels `AlgebraicKernel_d_1` +\cgalModels{AlgebraicKernel_d_1} \sa `Algebraic_kernel_rs_gmpz_d_1` diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpz_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpz_d_1.h index 029066a0119c..7f4e7eb0966f 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpz_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/CGAL/Algebraic_kernel_rs_gmpz_d_1.h @@ -10,7 +10,7 @@ This univariate algebraic kernel uses the Rs library to perform integer univariate polynomial root isolation. It is a model of the `AlgebraicKernel_d_1` concept. -\cgalModels `AlgebraicKernel_d_1` +\cgalModels{AlgebraicKernel_d_1} \sa `Algebraic_kernel_rs_gmpz_d_1` diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_face_base_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_face_base_2.h index fe8988c8f712..6e2c29329cc3 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_face_base_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_face_base_2.h @@ -16,7 +16,7 @@ if `Alpha_shape_face_base_2` is intended to be used with an alpha-shape class ba \link Tag_true `Tag_true`\endlink, triggers exact comparisons between alpha values. See the description provided in the documentation of `Alpha_shape_2` for more details. The default value is \link Tag_false `Tag_false`\endlink. -\cgalModels `AlphaShapeFace_2` +\cgalModels{AlphaShapeFace_2} \sa `Triangulation_face_base_2` \sa `Regular_triangulation_face_base_2` diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_vertex_base_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_vertex_base_2.h index 2c0602ce5126..f440c0b2d4de 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_vertex_base_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/CGAL/Alpha_shape_vertex_base_2.h @@ -17,7 +17,7 @@ if `Alpha_shape_vertex_base_2` is intended to be used with an alpha-shape class \link Tag_true `Tag_true`\endlink, triggers exact comparisons between alpha values. See the description provided in the documentation of `Alpha_shape_2` for more details. The default value is \link Tag_false `Tag_false`\endlink. -\cgalModels `AlphaShapeVertex_2` +\cgalModels{AlphaShapeVertex_2} \sa `Triangulation_vertex_base_2` \sa `Regular_triangulation_vertex_base_2` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_cell_base_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_cell_base_3.h index 5a92d16b0dc2..a64151eb7649 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_cell_base_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_cell_base_3.h @@ -19,7 +19,7 @@ provided in the documentation of `Alpha_shape_3` for more details. The default v must be \link Tag_true `Tag_true`\endlink if the underlying triangulation of the alpha shape to be used is a regular triangulation and \link Tag_false `Tag_false`\endlink otherwise. The default is \link Tag_false `Tag_false`\endlink. -\cgalModels `AlphaShapeCell_3` +\cgalModels{AlphaShapeCell_3} \sa `Delaunay_triangulation_cell_base_3` \sa `Regular_triangulation_cell_base_3` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_vertex_base_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_vertex_base_3.h index 0ba47d5cb6fe..ad88466cd48b 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_vertex_base_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Alpha_shape_vertex_base_3.h @@ -19,7 +19,7 @@ provided in the documentation of `Alpha_shape_3` for more details. The default v must be \link Tag_true `Tag_true`\endlink if the underlying triangulation of the alpha shape to be used is a regular triangulation and \link Tag_false `Tag_false`\endlink otherwise. The default is \link Tag_false `Tag_false`\endlink. -\cgalModels `AlphaShapeVertex_3` +\cgalModels{AlphaShapeVertex_3} \sa `Triangulation_vertex_base_3` \sa `Regular_triangulation_vertex_base_3` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_cell_base_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_cell_base_3.h index fc558a82d759..b7fcb067dee7 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_cell_base_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_cell_base_3.h @@ -13,7 +13,7 @@ to the `Alpha_shape_3` class. By default, it is instantiated with `Delaunay_triangulation_cell_base_3`, which is appropriate for basic alpha shapes. -\cgalModels `FixedAlphaShapeCell_3` +\cgalModels{FixedAlphaShapeCell_3} \sa `Alpha_shape_cell_base_3` \sa `Delaunay_triangulation_cell_base_3` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_vertex_base_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_vertex_base_3.h index 4b237a562f2b..0d4e36a13c40 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_vertex_base_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/CGAL/Fixed_alpha_shape_vertex_base_3.h @@ -13,7 +13,7 @@ to the `Alpha_shape_3` class. By default, it is instantiated with `Triangulation_vertex_base_3`, which is appropriate for basic alpha shapes. -\cgalModels `FixedAlphaShapeVertex_3` +\cgalModels{FixedAlphaShapeVertex_3} \sa `Alpha_shape_vertex_base_3` \sa `Triangulation_vertex_base_3` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_2.h index bf41824e4a44..92cd1c06b4d7 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_2.h @@ -46,7 +46,7 @@ ag.incident_edges(ag.infinite_vertex()); ag.incident_edges(ag.infinite_vertex(), f); \endcode -\cgalModels `DelaunayGraph_2` +\cgalModels{DelaunayGraph_2} \sa `CGAL::Apollonius_graph_traits_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_filtered_traits_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_filtered_traits_2.h index 155a7b240cb3..a8c3dfc63f0a 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_filtered_traits_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_filtered_traits_2.h @@ -37,7 +37,7 @@ The default values for the template parameters are as follows: `FK = CGAL::Simple_cartesian >`, `FM = CM`. -\cgalModels `ApolloniusGraphTraits_2` +\cgalModels{ApolloniusGraphTraits_2} \sa `Kernel` \sa `ApolloniusGraphTraits_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_vertex_base_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_vertex_base_2.h index c09d6255ab53..7e05e28f2a31 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_vertex_base_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_hierarchy_vertex_base_2.h @@ -11,7 +11,7 @@ vertex base required by the `Apollonius_graph_hierarchy_vertex_base_2` is templated by a class `Agvb` which must be a model of the `ApolloniusGraphVertexBase_2` concept. -\cgalModels `ApolloniusGraphHierarchyVertexBase_2` +\cgalModels{ApolloniusGraphHierarchyVertexBase_2} \sa `CGAL::Apollonius_graph_vertex_base_2` \sa `CGAL::Triangulation_data_structure_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_traits_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_traits_2.h index 3fe29ef740bc..dd8543868818 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_traits_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_traits_2.h @@ -20,7 +20,7 @@ default value for `Method_tag` is `CGAL::Integral_domain_without_division_tag`. The way the predicates are evaluated is discussed in \cgalCite{cgal:ke-ppawv-02}, \cgalCite{cgal:ke-rctac-03}. -\cgalModels `ApolloniusGraphTraits_2` +\cgalModels{ApolloniusGraphTraits_2} \sa `CGAL::Apollonius_graph_2` \sa `CGAL::Apollonius_graph_filtered_traits_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_vertex_base_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_vertex_base_2.h index ae9eca3dc6ec..042408867403 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_vertex_base_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_graph_vertex_base_2.h @@ -17,7 +17,7 @@ site can become visible. If `StoreHidden` is set to `true`, hidden sites are stored, otherwise they are discarded. By default `StoreHidden` is set to `true`. -\cgalModels `ApolloniusGraphVertexBase_2` +\cgalModels{ApolloniusGraphVertexBase_2} \sa `CGAL::Triangulation_data_structure_2` \sa `CGAL::Apollonius_graph_hierarchy_vertex_base_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_site_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_site_2.h index 162a6e462597..8d55878c7e8d 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_site_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/CGAL/Apollonius_site_2.h @@ -8,7 +8,7 @@ The class `Apollonius_site_2` is a model for the concept `ApolloniusSite_2`. It is parametrized by a template parameter `K` which must be a model of the `Kernel` concept. -\cgalModels `ApolloniusSite_2` +\cgalModels{ApolloniusSite_2} \cgalHeading{Types} diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_Bezier_curve_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_Bezier_curve_traits_2.h index b013c2be1ad4..7976f939c74c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_Bezier_curve_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_Bezier_curve_traits_2.h @@ -52,8 +52,7 @@ the `Are_mergeable_2` operation does not enforce the input curves to have the same direction as a precondition. Moreover, `Arr_Bezier_curve_traits_2` supports the merging of curves of opposite directions. -\cgalModels `ArrangementTraits_2` -\cgalModels `ArrangementDirectionalXMonotoneTraits_2` +\cgalModels{ArrangementTraits_2,ArrangementDirectionalXMonotoneTraits_2} */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h index 165e9cbd5872..069d91859ee7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h @@ -22,7 +22,7 @@ the types `leda::integer` and `CORE::BigInt` are supported as well as any instance of `CGAL::Sqrt_extension` that is instantiated with one of the integral types above. -\cgalModels `ArrangementTraits_2` +\cgalModels{ArrangementTraits_2} */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_bounded_planar_topology_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_bounded_planar_topology_traits_2.h index 06cafbd5e13c..f839b4967ef8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_bounded_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_bounded_planar_topology_traits_2.h @@ -21,7 +21,7 @@ namespace CGAL { * `Arr_default_dcel`. * * - * \cgalModels `ArrangementBasicTopologyTraits` + * \cgalModels{ArrangementBasicTopologyTraits} * * \sa `Arr_default_dcel` * \sa `CGAL::Arr_geodesic_arc_on_sphere_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h index 43b7d56bcf8c..4a82982e7519 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h @@ -32,8 +32,7 @@ namespace CGAL { * same direction as a precondition. Moreover, `Arr_circle_segment_traits_2` * supports the merging of curves of opposite directions. * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementDirectionalXMonotoneTraits_2` + * \cgalModels{ArrangementTraits_2,ArrangementDirectionalXMonotoneTraits_2} * */ template< typename Kernel > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_arc_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_arc_traits_2.h index f8307dbca1b0..014e1f5ec21e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_arc_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_arc_traits_2.h @@ -8,7 +8,7 @@ This class is a traits class for \cgal arrangements, built on top of a model of concept `CircularKernel`. It provides curves of type `CGAL::Circular_arc_2`. -\cgalModels `ArrangementTraits_2` +\cgalModels{ArrangementTraits_2} */ template< typename CircularKernel > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h index b12a51541cf4..9bd3569f1145 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circular_line_arc_traits_2.h @@ -12,7 +12,7 @@ of both types It uses the boost::variant. -\cgalModels `ArrangementTraits_2` +\cgalModels{ArrangementTraits_2} */ template< typename CircularKernel > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h index fe6e70de9c59..fe052cd26e5b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h @@ -80,9 +80,7 @@ namespace CGAL { * to have the same direction as a precondition. Moreover, `Arr_conic_traits_2` * supports the merging of curves of opposite directions. * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementLandmarkTraits_2` - * \cgalModels `ArrangementDirectionalXMonotoneTraits_2` + * \cgalModels{ArrangementTraits_2,ArrangementLandmarkTraits_2,ArrangementDirectionalXMonotoneTraits_2} * * \cgalHeading{Types} */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_consolidated_curve_data_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_consolidated_curve_data_traits_2.h index bbf6205037d8..2ed18e6be6bc 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_consolidated_curve_data_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_consolidated_curve_data_traits_2.h @@ -21,7 +21,7 @@ both resulting subcurves. In case two (or more) \f$ x\f$-monotone curves overlap, their data sets are consolidated, and are inserted into the set of the \f$ x\f$-monotone curve that represents the overlap. -\cgalModels `ArrangementTraits_2` +\cgalModels{ArrangementTraits_2} */ template< typename Traits, typename Data > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_curve_data_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_curve_data_traits_2.h index a0d7d72ce422..e75623e8cd72 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_curve_data_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_curve_data_traits_2.h @@ -49,7 +49,7 @@ namespace CGAL { * `d1` and `d2`. The \f$ x\f$-monotone curve that represents the overlap is * associated with the output of this functor. * - * \cgalModels `ArrangementTraits_2` + * \cgalModels{ArrangementTraits_2} */ template class Arr_curve_data_traits_2 : public Tr { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_dcel_base.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_dcel_base.h index 8f9202a3a137..9fa8f5f4d96e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_dcel_base.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_dcel_base.h @@ -16,7 +16,7 @@ must be instantiated with models of the concepts `ArrangementDcelVertex`, `ArrangementDcelHalfedge`, and `ArrangementDcelFace` respectively. -\cgalModels `ArrangementDcel` +\cgalModels{ArrangementDcel} */ template< typename V, typename H, typename F > @@ -29,7 +29,7 @@ class Arr_dcel_base { The basic \dcel face type. Serves as a basis class for an extended face record with auxiliary data fields. -\cgalModels `ArrangementDcelFace` +\cgalModels{ArrangementDcelFace} */ class Arr_face_base { @@ -43,7 +43,7 @@ The basic \dcel halfedge type. Serves as a basis class for an extended halfedge record with auxiliary data fields. The `Curve` parameter is the type of \f$ x\f$-monotone curves associated with the vertices. -\cgalModels `ArrangementDcelHalfedge` +\cgalModels{ArrangementDcelHalfedge} */ template< typename Curve > @@ -58,7 +58,7 @@ The basic \dcel vertex type. Serves as a basis class for an extended vertex record with auxiliary data fields. The `Point` parameter is the type of points associated with the vertices. -\cgalModels `ArrangementDcelVertex` +\cgalModels{ArrangementDcelVertex} */ template< typename Point > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_dcel.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_dcel.h index 8da592fa207f..453a7f050925 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_dcel.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_dcel.h @@ -12,7 +12,7 @@ the base vertex and halfedge types, respectively. Thus, the default \dcel records store no other information, except for the topological incidence relations and the geometric data attached to vertices and edges. -\cgalModels `ArrangementDcelWithRebind` +\cgalModels{ArrangementDcelWithRebind} \sa `Arr_dcel_base` */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_overlay_traits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_overlay_traits.h index 6419b1af7ae3..5b5677b74588 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_overlay_traits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_default_overlay_traits.h @@ -10,7 +10,7 @@ of type `Arrangement` that store no auxiliary data with their \dcel records, whe \dcel data as well. This class simply gives empty implementation for all traits-class functions. -\cgalModels `OverlayTraits` +\cgalModels{OverlayTraits} \sa `overlay` @@ -43,7 +43,7 @@ it uses the functor `OvlFaceData`, which accepts a `FaceData_A` object and a `FaceData_B` object and computes a corresponding `FaceData_R` object, in order to set the auxiliary data of the overlay face. -\cgalModels `OverlayTraits` +\cgalModels{OverlayTraits} \sa `overlay` \sa `CGAL::Arr_face_extended_dcel` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_extended_dcel.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_extended_dcel.h index b06910d1e140..b36aa2a7eb7c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_extended_dcel.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_extended_dcel.h @@ -33,7 +33,7 @@ The default values follow: -\cgalModels `ArrangementDcelWithRebind` +\cgalModels{ArrangementDcelWithRebind} \sa `Arr_dcel_base` @@ -57,7 +57,7 @@ The `Arr_extended_face` class-template extends the face topological-features of \dcel. It is parameterized by a face base-type `FaceBase` and a data type `FData` used to extend the face base-type. -\cgalModels `ArrangementDcelFace` +\cgalModels{ArrangementDcelFace} \sa `Arr_dcel_base` @@ -109,7 +109,7 @@ The `Arr_extended_halfedge` class-template extends the halfedge topological-feat the \dcel. It is parameterized by a halfedge base-type `HalfedgeBase` and a data type `HData` used to extend the halfedge base-type. -\cgalModels `ArrangementDcelHalfedge` +\cgalModels{ArrangementDcelHalfedge} \sa `Arr_dcel_base` @@ -162,7 +162,7 @@ topological-features of the \dcel. It is parameterized by a vertex base-type `VertexBase` and a data type `VData` used to extend the vertex base-type. -\cgalModels `ArrangementDcelVertex` +\cgalModels{ArrangementDcelVertex} \sa `Arr_dcel_base` @@ -235,7 +235,7 @@ as follows: -\cgalModels `ArrangementDcelWithRebind` +\cgalModels{ArrangementDcelWithRebind} \sa `Arr_dcel_base` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_face_index_map.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_face_index_map.h index ae70704f3b56..bcb0d5c378f2 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_face_index_map.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_face_index_map.h @@ -19,10 +19,7 @@ existing faces might be removed, the notification mechanism is used to dynamically maintain the mapping of face handles to indices. -\cgalModels DefaultConstructible -\cgalModels CopyConstructible -\cgalModels Assignable -\cgalModels `ReadablePropertyMap` +\cgalModels{DefaultConstructible,CopyConstructible,Assignable,ReadablePropertyMap} \sa `Arr_observer` \sa `Arr_vertex_index_map` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index c6c4c608690b..d34b40072a93 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -39,9 +39,7 @@ namespace CGAL { * normalized vector \f$(x,y)\f$ in the \f$xy\f$-plane that bisects the * identification curve. - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementLandmarkTraits_2` - * \cgalModels `ArrangementSphericalBoundaryTraits_2` + * \cgalModels{ArrangementTraits_2,ArrangementLandmarkTraits_2,ArrangementSphericalBoundaryTraits_2} */ template @@ -52,9 +50,7 @@ namespace CGAL { * not-necessarily normalized 3D direction extended with information that * specifies the location of the point pre-image in the parameter space. * - * \cgalModels `Assignable` - * \cgalModels `DefaultConstructible` - * \cgalModels `CopyConstructible` + * \cgalModels{Assignable,DefaultConstructible,CopyConstructible} */ class Point_2 { public: @@ -118,9 +114,7 @@ namespace CGAL { * intersect the identified left and right sides of the boundary of the * parameter space. * - * \cgalModels `Assignable` - * \cgalModels `DefaultConstructible` - * \cgalModels `CopyConstructible` + * \cgalModels{Assignable,DefaultConstructible,CopyConstructible} */ class X_monotone_curve_2 { public: @@ -287,10 +281,7 @@ namespace CGAL { /*! Construction functor of a point. * - * \cgalModels `Assignable` - * \cgalModels `CopyConstructible` - * \cgalModels `AdaptableUnaryFunction` - * \cgalModels `AdaptableTernaryFunction` + * \cgalModels{Assignable,CopyConstructible,AdaptableUnaryFunction,AdaptableTernaryFunction} */ /*! */ @@ -325,11 +316,7 @@ namespace CGAL { /*! Construction functor of \f$x\f$-monotone geodesic arcs. * - * \cgalModels `Assignable` - * \cgalModels `CopyConstructible` - * \cgalModels `AdaptableUnaryFunction` - * \cgalModels `AdaptableBinaryFunction` - * \cgalModels `AdaptableTernaryFunction` + * \cgalModels{Assignable,CopyConstructible,AdaptableUnaryFunction,AdaptableBinaryFunction,AdaptableTernaryFunction} */ class Construct_x_monotone_curve_2 { public: @@ -393,11 +380,7 @@ namespace CGAL { /*! Construction functor of geodesic arcs. * - * \cgalModels `Assignable` - * \cgalModels `CopyConstructible` - * \cgalModels `AdaptableUnaryFunction` - * \cgalModels `AdaptableBinaryFunction` - * \cgalModels `AdaptableTernaryFunction` + * \cgalModels{Assignable,CopyConstructible,AdaptableUnaryFunction,AdaptableBinaryFunction,AdaptableTernaryFunction} */ class Construct_curve_2 { public: diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_landmarks_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_landmarks_point_location.h index 92490f47f2a1..761f83a10448 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_landmarks_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_landmarks_point_location.h @@ -47,8 +47,7 @@ when the application frequently issues point-location queries on a rather static arrangement that the changes applied to it are mainly insertions of curves and not deletions of them. -\cgalModels `ArrangementPointLocation_2` -\cgalModels `ArrangementVerticalRayShoot_2` +\cgalModels{ArrangementPointLocation_2,ArrangementVerticalRayShoot_2} \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_line_arc_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_line_arc_traits_2.h index b1b230c0393b..909792816a7b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_line_arc_traits_2.h @@ -8,7 +8,7 @@ This class is a traits class for \cgal arrangements, built on top of a model of concept `CircularKernel`. It provides curves of type `CGAL::Line_arc_2`. -\cgalModels `ArrangementTraits_2` +\cgalModels{ArrangementTraits_2} */ template< typename CircularKernel > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_linear_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_linear_traits_2.h index c46342987f83..7f1d5825c01b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_linear_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_linear_traits_2.h @@ -21,9 +21,7 @@ namespace CGAL { * we can find out its actual type and convert it to the respective kernel * object (say, to a `Kernel::Ray_2`). * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementLandmarkTraits_2` - * \cgalModels `ArrangementOpenBoundaryTraits_2` + * \cgalModels{ArrangementTraits_2,ArrangementLandmarkTraits_2,ArrangementOpenBoundaryTraits_2} */ template< typename Kernel > class Arr_linear_traits_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h index 1ef49902c8cf..d354aba10568 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_naive_point_location.h @@ -13,8 +13,7 @@ The query time is therefore linear in the complexity of the arrangement. Naturally, this point-location strategy could turn into a heavy time-consuming process when applied to dense arrangements. -\cgalModels `ArrangementPointLocation_2` -\cgalModels `ArrangementVerticalRayShoot_2` +\cgalModels{ArrangementPointLocation_2,ArrangementVerticalRayShoot_2} \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_basic_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_basic_traits_2.h index 2a97525dc225..e85664bdb761 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_basic_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_basic_traits_2.h @@ -21,7 +21,7 @@ instantiations for the kernel. Using other (inexact) number types `Simple_cartesian`) is also possible, at the user's own risk. -\cgalModels `ArrangementLandmarkTraits_2` +\cgalModels{ArrangementLandmarkTraits_2} */ template< typename Kernel > diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_traits_2.h index c5b1ad7bf9b0..32a67f5162df 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_non_caching_segment_traits_2.h @@ -32,9 +32,7 @@ the `Are_mergeable_2` operation does not enforce the input curves to have the same direction as a precondition. Moreover, `Arr_non_caching_segment_traits_2` supports the merging of curves of opposite directions. -\cgalModels `ArrangementTraits_2` -\cgalModels `ArrangementLandmarkTraits_2` -\cgalModels `ArrangementDirectionalXMonotoneTraits_2` +\cgalModels{ArrangementTraits_2,ArrangementLandmarkTraits_2,ArrangementDirectionalXMonotoneTraits_2} \sa `Arr_segment_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h index 787873149135..a1bb1b331d12 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h @@ -72,10 +72,9 @@ namespace CGAL { * set the macro `CGAL_ALWAYS_LEFT_TO_RIGHT` to 1 before any \cgal header is * included. * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementDirectionalXMonotoneTraits_2` - * \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes - * the template parameter `SubcurveTraits_2` models the concept as well) + * \cgalModels{ArrangementTraits_2,ArrangementDirectionalXMonotoneTraits_2, + * ArrangementApproximateTraits_2 (if the type that substitutes + * the template parameter `SubcurveTraits_2` models the concept as well)} * * \sa `Arr_algebraic_segment_traits_2` * \sa `Arr_Bezier_curve_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polyline_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polyline_traits_2.h index 9c86561f925c..8f63945a3afa 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polyline_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polyline_traits_2.h @@ -77,12 +77,9 @@ namespace CGAL { * the macro `CGAL_ALWAYS_LEFT_TO_RIGHT` to 1 before any \cgal header is * included. * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementDirectionalXMonotoneTraits_2` - * \cgalModels `ArrangementConstructXMonotoneCurveTraits_2` - * \cgalModels `ArrangementConstructCurveTraits_2` - * \cgalModels `ArrangementApproximateTraits_2` (if the type that substitutes - * the template parameter `SegmentTraits_2` models the concept as well) + * \cgalModels{ArrangementTraits_2,ArrangementDirectionalXMonotoneTraits_2,`ArrangementConstructXMonotoneCurveTraits_2` + * ArrangementConstructCurveTraits_2,ArrangementApproximateTraits_2 (if the type that substitutes + * the template parameter `SegmentTraits_2` models the concept as well)} * * \sa `Arr_polycurve_traits_2` * \sa `Arr_Bezier_curve_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_rational_function_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_rational_function_traits_2.h index b773cddf170b..7c121ebf8976 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_rational_function_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_rational_function_traits_2.h @@ -52,9 +52,7 @@ namespace CGAL { to have the same direction as a precondition. Moreover, `Arr_rational_function_traits_2` supports the merging of curves of opposite directions. - \cgalModels `ArrangementTraits_2` - \cgalModels `ArrangementDirectionalXMonotoneTraits_2` - \cgalModels `ArrangementOpenBoundaryTraits_2` + \cgalModels{ArrangementTraits_2,ArrangementDirectionalXMonotoneTraits_2,ArrangementOpenBoundaryTraits_2} */ template< typename AlgebraicKernel_d_1 > class Arr_rational_function_traits_2 { @@ -134,10 +132,7 @@ Functor to construct a `Curve_2`. To enable caching the class is not default constructible and must be obtained via the function `construct_curve_2_object()`, which is a member of the traits. -\cgalModels `Assignable` -\cgalModels `CopyConstructible` -\cgalModels `AdaptableBinaryFunction` -\cgalModels `AdaptableUnaryFunction` +\cgalModels{Assignable,CopyConstructible,AdaptableBinaryFunction,AdaptableUnaryFunction} */ class Construct_curve_2 { @@ -289,10 +284,7 @@ Functor to construct a `X_monotone_curve_2`. To enable caching the class is not default constructible and must be obtained via the function `construct_x_monotone_curve_2_object()`, which is a member of the traits. -\cgalModels `Assignable` -\cgalModels `CopyConstructible` -\cgalModels `AdaptableBinaryFunction` -\cgalModels `AdaptableUnaryFunction` +\cgalModels{Assignable,CopyConstructible,AdaptableBinaryFunction,AdaptableUnaryFunction} */ class Construct_x_monotone_curve_2 { @@ -460,7 +452,7 @@ const Algebraic_real_1& lower, const Algebraic_real_1& upper); const The `Curve_2` class nested within the traits is used to represent rational functions which may be restricted to a certain x-range. -\cgalModels `ArrTraits::Curve_2` +\cgalModels{ArrTraits::Curve_2} */ class Curve_2 { @@ -531,7 +523,7 @@ Algebraic_real_1 right_x() const; /*! -\cgalModels `ArrTraits::Point_2` +\cgalModels{ArrTraits::Point_2} */ class Point_2 { @@ -633,7 +625,7 @@ The `X_monotone_curve_2` class nested within the traits is used to represent \f$ x\f$-monotone parts of rational functions. In particular, such an \f$ x\f$-monotone curve may not contain a vertical asymptote in its interior \f$ x\f$-range. -\cgalModels `ArrTraits::XMonotoneCurve_2` +\cgalModels{ArrTraits::XMonotoneCurve_2} */ class X_monotone_curve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_segment_traits_2.h index 3d7d3ab58267..9036308edaa9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_segment_traits_2.h @@ -52,9 +52,7 @@ namespace CGAL { * same direction as a precondition. Moreover, `Arr_segment_traits_2` supports * the merging of curves of opposite directions. * - * \cgalModels `ArrangementTraits_2` - * \cgalModels `ArrangementLandmarkTraits_2` - * \cgalModels `ArrangementDirectionalXMonotoneTraits_2` + * \cgalModels{ArrangementTraits_2,ArrangementLandmarkTraits_2,ArrangementDirectionalXMonotoneTraits_2} */ template class Arr_segment_traits_2 : public Kernel { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_spherical_topology_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_spherical_topology_traits_2.h index 3969c0a92cc7..5c1775e331f3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_spherical_topology_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_spherical_topology_traits_2.h @@ -21,7 +21,7 @@ namespace CGAL { * `Arr_default_dcel`. * * - * \cgalModels `ArrangementBasicTopologyTraits` + * \cgalModels{ArrangementBasicTopologyTraits} * * \sa `Arr_default_dcel` * \sa `CGAL::Arr_geodesic_arc_on_sphere_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h index 0027ec53409c..75994a31f173 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_trapezoid_ric_point_location.h @@ -26,8 +26,7 @@ is relatively large. This strategy supports arbitrary subdivisions, including unbounded ones. -\cgalModels `ArrangementPointLocation_2` -\cgalModels `ArrangementVerticalRayShoot_2` +\cgalModels{ArrangementPointLocation_2,ArrangementVerticalRayShoot_2} \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h index ed9c1e12e3d1..5e1f74d0326e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_triangulation_point_location.h @@ -15,8 +15,7 @@ namespace CGAL { * (especially when the number of modifications applied to the arrangement is * high) and provided only for educational purposes. * - * \cgalModels `ArrangementPointLocation_2` - * \cgalModels `ArrangementVerticalRayShoot_2` + * \cgalModels{ArrangementPointLocation_2,ArrangementVerticalRayShoot_2} * * \sa `ArrangementPointLocation_2` * \sa `ArrangementVerticalRayShoot_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_unb_planar_topology_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_unb_planar_topology_traits_2.h index 4c7c69fa5aed..06efe81c731a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_unb_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_unb_planar_topology_traits_2.h @@ -21,7 +21,7 @@ namespace CGAL { * `Arr_default_dcel`. * * - * \cgalModels `ArrangementBasicTopologyTraits` + * \cgalModels{ArrangementBasicTopologyTraits} * * \sa `Arr_default_dcel` * \sa `CGAL::Arr_geodesic_arc_on_sphere_traits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertex_index_map.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertex_index_map.h index 992a9862b9bb..1c915a6b23cf 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertex_index_map.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertex_index_map.h @@ -19,10 +19,7 @@ existing vertices might be removed, the notification mechanism is used to dynamically maintain the mapping of vertex handles to indices. -\cgalModels DefaultConstructible -\cgalModels CopyConstructible -\cgalModels Assignable -\cgalModels `ReadablePropertyMap` +\cgalModels{DefaultConstructible,CopyConstructible,Assignable,ReadablePropertyMap} \sa `Arr_observer` \sa `Arr_face_index_map` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h index ed5df33be960..508d85801ba3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_walk_along_line_point_location.h @@ -23,8 +23,7 @@ It is therefore recommended to use the "walk" point-location strategy for arrangements that are constantly changing, especially if the number of issued queries is not large. -\cgalModels `ArrangementPointLocation_2` -\cgalModels `ArrangementVerticalRayShoot_2` +\cgalModels{ArrangementPointLocation_2,ArrangementVerticalRayShoot_2} \sa `ArrangementPointLocation_2` \sa `ArrangementVerticalRayShoot_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_text_formatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_text_formatter.h index fa5d3ff96987..4695aa5cfb58 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_text_formatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_text_formatter.h @@ -18,8 +18,7 @@ defined by the `Arrangement` template-parameter, as well as the `VertexData`, `HalfedgeData` and `FaceData` types, can all be written to an input stream using the `<<` operator and read from an input stream using the `>>` operator. -\cgalModels `ArrangementInputFormatter` -\cgalModels `ArrangementOutputFormatter` +\cgalModels{ArrangementInputFormatter,ArrangementOutputFormatter} \sa `PkgArrangementOnSurface2Read` \sa `PkgArrangementOnSurface2Write` @@ -50,8 +49,7 @@ The `Arr_face_extended_text_formatter` class assumes that the nested `Point_2` a defined by the `Arrangement` template-parameter and that the `FaceData` type can all be written to an input stream using the `<<` operator and read from an input stream using the `>>` operator. -\cgalModels `ArrangementInputFormatter` -\cgalModels `ArrangementOutputFormatter` +\cgalModels{ArrangementInputFormatter,ArrangementOutputFormatter} \sa `PkgArrangementOnSurface2Read` \sa `PkgArrangementOnSurface2Write` @@ -81,8 +79,7 @@ defined by the `Arrangement` template-parameter can both be written to an input stream using the `<<` operator and read from an input stream using the `>>` operator. -\cgalModels `ArrangementInputFormatter` -\cgalModels `ArrangementOutputFormatter` +\cgalModels{ArrangementInputFormatter,ArrangementOutputFormatter} \sa `PkgArrangementOnSurface2Read` \sa `PkgArrangementOnSurface2Write` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_with_history_text_formatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_with_history_text_formatter.h index 9c02ec33400c..564b6534b349 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_with_history_text_formatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/IO/Arr_with_history_text_formatter.h @@ -15,8 +15,7 @@ the base arrangement, while the derived class is responsible for reading and writing the set of curves inducing the arrangement and maintaining the relations between these curves and the edges they induce. -\cgalModels `ArrangementWithHistoryInputFormatter` -\cgalModels `ArrangementWithHistoryOutputFormatter` +\cgalModels{ArrangementWithHistoryInputFormatter,ArrangementWithHistoryOutputFormatter} \sa `PkgArrangementOnSurface2Read` \sa `PkgArrangementOnSurface2Write` diff --git a/BGL/doc/BGL/CGAL/HalfedgeDS_face_max_base_with_id.h b/BGL/doc/BGL/CGAL/HalfedgeDS_face_max_base_with_id.h index 5518ffb5c0c2..37c3f74bbd4b 100644 --- a/BGL/doc/BGL/CGAL/HalfedgeDS_face_max_base_with_id.h +++ b/BGL/doc/BGL/CGAL/HalfedgeDS_face_max_base_with_id.h @@ -19,7 +19,7 @@ running a graph algorithm. \tparam Refs must be an instantiation of a `HalfedgeDS`. -\cgalModels `HalfedgeDSFace` +\cgalModels{HalfedgeDSFace} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/BGL/doc/BGL/CGAL/HalfedgeDS_halfedge_max_base_with_id.h b/BGL/doc/BGL/CGAL/HalfedgeDS_halfedge_max_base_with_id.h index f57951dc82ec..e94aebb22e32 100644 --- a/BGL/doc/BGL/CGAL/HalfedgeDS_halfedge_max_base_with_id.h +++ b/BGL/doc/BGL/CGAL/HalfedgeDS_halfedge_max_base_with_id.h @@ -17,7 +17,7 @@ running a graph algorithm. \tparam Refs must be an instantiation of a `HalfedgeDS`. -\cgalModels `HalfedgeDSHalfedge` +\cgalModels{HalfedgeDSHalfedge} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/BGL/doc/BGL/CGAL/HalfedgeDS_vertex_max_base_with_id.h b/BGL/doc/BGL/CGAL/HalfedgeDS_vertex_max_base_with_id.h index 15fad92af976..ccc9f962a238 100644 --- a/BGL/doc/BGL/CGAL/HalfedgeDS_vertex_max_base_with_id.h +++ b/BGL/doc/BGL/CGAL/HalfedgeDS_vertex_max_base_with_id.h @@ -17,7 +17,7 @@ running a graph algorithm. \tparam Refs must be an instantiation of a `HalfedgeDS`. -\cgalModels `HalfedgeDSVertex` +\cgalModels{HalfedgeDSVertex} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/BGL/doc/BGL/CGAL/Linear_cell_complex_bgl_min_items.h b/BGL/doc/BGL/CGAL/Linear_cell_complex_bgl_min_items.h index 611ff3cd88b5..72ef25afe5e9 100644 --- a/BGL/doc/BGL/CGAL/Linear_cell_complex_bgl_min_items.h +++ b/BGL/doc/BGL/CGAL/Linear_cell_complex_bgl_min_items.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Linear_cell_complex_bgl_min_items` defines `void` as the information associated with darts, darts have ids and 0- and 2-attributes are enabled and have ids. -\cgalModels `LinearCellComplexItems` +\cgalModels{LinearCellComplexItems} \cgalHeading{Example} diff --git a/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h b/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h index 7db19153e876..7c4f69185dd6 100644 --- a/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h +++ b/BGL/doc/BGL/CGAL/Polyhedron_items_with_id_3.h @@ -13,7 +13,7 @@ the point and the plane equation. Vertices and facets both contain a halfedge handle to an incident halfedge. -\cgalModels `PolyhedronItems_3` +\cgalModels{PolyhedronItems_3} \cgalHeading{Operations} diff --git a/BGL/doc/BGL/CGAL/Triangulation_face_base_with_id_2.h b/BGL/doc/BGL/CGAL/Triangulation_face_base_with_id_2.h index e6bdbbc65773..3ebf243d5f13 100644 --- a/BGL/doc/BGL/CGAL/Triangulation_face_base_with_id_2.h +++ b/BGL/doc/BGL/CGAL/Triangulation_face_base_with_id_2.h @@ -19,7 +19,7 @@ and must be a model of `TriangulationTraits_2`. `Triangulation_face_base_with_id_2` derives. It has the default value `Triangulation_face_base_2`. -\cgalModels `TriangulationFaceBase_2` +\cgalModels{TriangulationFaceBase_2} \sa `CGAL::Triangulation_face_base_2` */ diff --git a/BGL/doc/BGL/CGAL/Triangulation_vertex_base_with_id_2.h b/BGL/doc/BGL/CGAL/Triangulation_vertex_base_with_id_2.h index d9a587610623..1f267eb5b213 100644 --- a/BGL/doc/BGL/CGAL/Triangulation_vertex_base_with_id_2.h +++ b/BGL/doc/BGL/CGAL/Triangulation_vertex_base_with_id_2.h @@ -19,7 +19,7 @@ and must be a model of `TriangulationTraits_2`. `Triangulation_vertex_base_with_id_2` derives. It has the default value `Triangulation_vertex_base_2`. -\cgalModels `TriangulationVertexBase_2` +\cgalModels{TriangulationVertexBase_2} \sa `CGAL::Triangulation_vertex_base_2` */ diff --git a/BGL/doc/BGL/CGAL/boost/graph/properties.h b/BGL/doc/BGL/CGAL/boost/graph/properties.h index 01f6df7b62f9..57b9f10c1cbe 100644 --- a/BGL/doc/BGL/CGAL/boost/graph/properties.h +++ b/BGL/doc/BGL/CGAL/boost/graph/properties.h @@ -6,31 +6,31 @@ namespace CGAL { /// The constant `vertex_index` is a property tag which identifies the index property of a vertex of a \bgl /// Graph. -/// \cgalModels PropertyTag +/// \cgalModelsBare{PropertyTag} enum vertex_index_t { vertex_index }; /// The constant `halfedge_index` is a property tag which identifies the index property of a halfedge of a `HalfedgeGraph`. /// /// This is a property tag introduced by \cgal. -/// \cgalModels PropertyTag +/// \cgalModelsBare{PropertyTag} enum halfedge_index_t { halfedge_index }; /// The constant `edge_index` is a property tag which identifies the index property of an edge of a \bgl /// Graph. -/// \cgalModels PropertyTag +/// \cgalModelsBare{PropertyTag} enum edge_index_t { edge_index }; /// The constant `face_index` is a property tag which identifies the index property of a face of a `FaceGraph`. /// /// This is a property tag introduced by \cgal. -/// \cgalModels PropertyTag +/// \cgalModelsBare{PropertyTag} enum face_index_t { face_index }; /// The constant `vertex_point` is a property tag which refers to the geometric embedding property of /// a vertex of a `HalfedgeGraph`. /// /// This is a property tag introduced by \cgal. -/// \cgalModels PropertyTag +/// \cgalModelsBare{PropertyTag} enum vertex_point_t { vertex_point }; /// @} diff --git a/BGL/include/CGAL/boost/graph/Dual.h b/BGL/include/CGAL/boost/graph/Dual.h index 7d7481b1625d..4ca45b9bcec7 100644 --- a/BGL/include/CGAL/boost/graph/Dual.h +++ b/BGL/include/CGAL/boost/graph/Dual.h @@ -44,7 +44,7 @@ error. \tparam Primal_ must be a model of `FaceGraph` -\cgalModels `FaceGraph` +\cgalModels{FaceGraph} */ template diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index e6f4136481d9..326a839cee61 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -66,9 +66,7 @@ namespace CGAL { * \tparam VIMap a model of `ReadablePropertyMap` with `graph_traits::%vertex_descriptor` as key and `graph_traits::%vertices_size_type` as value * \tparam HIMap a model of `ReadablePropertyMap` with `graph_traits::%halfedge_descriptor` as key and `graph_traits::%halfedges_size_type` as value * - * \cgalModels `FaceListGraph` - * \cgalModels `HalfedgeListGraph` - * \cgalModels \bgllink{VertexListGraph} + * \cgalModels{FaceListGraph,HalfedgeListGraph,\bgllink{VertexListGraph}} */ template @@ -689,7 +687,7 @@ is_valid(const Graph_with_descriptor_with_graph & w, bool verbose = false \ingroup PkgBGLAdaptors `Graph_with_descriptor_with_graph_property_map` enables to forward properties from a `Graph` to a `Graph_with_descriptor_with_graph`. - \cgalModels `Graph_with_descriptor_with_graph_property_map` the same property map concept as `PM` + \cgalModels{Graph_with_descriptor_with_graph_property_map the same property map concept as `PM`} @tparam Graph a model of the `FaceListGraph` and `HalfedgeListGraph` concepts. @tparam PM a property_map of a `Graph`. diff --git a/BGL/include/CGAL/boost/graph/Seam_mesh.h b/BGL/include/CGAL/boost/graph/Seam_mesh.h index 34c6e61e0a6f..2db6b170e5bd 100644 --- a/BGL/include/CGAL/boost/graph/Seam_mesh.h +++ b/BGL/include/CGAL/boost/graph/Seam_mesh.h @@ -185,7 +185,7 @@ class Seam_mesh_edge_descriptor /// a border edge (that is, such that either halfedge or the edge have null_face() /// as incident face). Marking a border edge as seam will not do anything. /// -/// \cgalModels `FaceGraph` or `FaceListGraph`, depending on the underlying mesh `TM`. +/// \cgalModels{FaceGraph or `FaceListGraph` depending on the underlying mesh `TM`.} /// /// \tparam TM a model of `FaceGraph` or `FaceListGraph` /// \tparam SEM a model of `ReadablePropertyMap` with `boost::graph_traits::%edge_descriptor` as key type and `bool` as value type. @@ -271,9 +271,7 @@ class Seam_mesh /// Implementation note: a halfedge of the seam mesh is represented as a halfedge /// of the mesh and a boolean to indicate whether the halfedge is on a seam or not. /// - /// \cgalModels `Descriptor` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Descriptor,LessThanComparable,Hashable} /// class halfedge_descriptor { @@ -356,9 +354,7 @@ class Seam_mesh /// Implementation note: to properly duplicate vertices that are on seams, /// a vertex_descriptor is in fact represented as a halfedge of the seam mesh. /// - /// \cgalModels `Descriptor` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Descriptor,LessThanComparable,Hashable} /// class vertex_descriptor { @@ -461,8 +457,7 @@ class Seam_mesh #ifdef DOXYGEN_RUNNING /// This class represents an edge of the seam mesh. /// - /// \cgalModels `Descriptor` - /// \cgalModels `Hashable` + /// \cgalModels{Descriptor,Hashable} /// class edge_descriptor { @@ -562,7 +557,7 @@ class Seam_mesh /// This class represents a face of the seam mesh. /// - /// \cgalModels `Descriptor` + /// \cgalModels{Descriptor} /// typedef typename boost::graph_traits::face_descriptor face_descriptor; diff --git a/BGL/include/CGAL/boost/graph/iterator.h b/BGL/include/CGAL/boost/graph/iterator.h index 87ff3383f21b..54b54c08ecbc 100644 --- a/BGL/include/CGAL/boost/graph/iterator.h +++ b/BGL/include/CGAL/boost/graph/iterator.h @@ -182,7 +182,7 @@ struct Opposite_face { * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_source_iterator` `havi` with `h = *havi;` * the following holds: Either `++havi` is the past the end iterator, or `next(opposite(h,g),g) == *++havi`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalIterator` + * \cgalModels{BidirectionalIterator} */ template class Halfedge_around_source_iterator { @@ -274,7 +274,7 @@ class Halfedge_around_source_iterator { * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_target_iterator` `havi` with `h = *havi;` * the following holds: Either `++havi` is the past the end iterator, or `opposite(next(h,g),g) == *++havi`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalIterator` + * \cgalModels{BidirectionalIterator} */ template @@ -369,7 +369,7 @@ class Halfedge_around_target_iterator { * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_face_iterator` `hafi` with `h = *hafi` * the following holds: Either `++hafi` is the past the end iterator, or `next(h,g) == *++hafi`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalIterator` + * \cgalModels{BidirectionalIterator} */ template @@ -465,7 +465,7 @@ class Halfedge_around_target_circulator; * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_source_circulator` `havc` with `h = *havc;` * the following holds: `next(opposite(h,g),g) == *++havc`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template class Halfedge_around_source_circulator @@ -531,7 +531,7 @@ class Halfedge_around_source_circulator * It circulates over the same halfedges as the `Halfedge_around_target_circulator`. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template @@ -590,7 +590,7 @@ class Face_around_target_circulator * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_target_circulator` `havc` with `h = *havc;` * the following holds: `opposite(next(h,g),g) == *++havc`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ @@ -692,7 +692,7 @@ class Halfedge_around_target_circulator { * Let `h` be a halfedge of graph `g`. For a `Halfedge_around_face_circulator` `hafc` with `h = *hafc` * the following holds: `next(h,g) == *++hafc`. * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template @@ -844,7 +844,7 @@ halfedges_around_face(typename boost::graph_traits::halfedge_descriptor h * may be the null face, and it may be several times the same face descriptor. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template class Face_around_face_iterator @@ -882,7 +882,7 @@ class Face_around_face_iterator * may be the null face, and it may be several times the same face descriptor. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template class Face_around_face_circulator @@ -896,7 +896,7 @@ class Face_around_face_circulator * may be the null face, and it may be several times the same face descriptor. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalIterator` + * \cgalModels{BidirectionalIterator} */ template class Face_around_target_iterator @@ -956,7 +956,7 @@ faces_around_face(typename boost::graph_traits::halfedge_descriptor h, co * \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` + * \cgalModels{BidirectionalIterator} */ template class Vertex_around_face_circulator @@ -1013,7 +1013,7 @@ class Vertex_around_face_circulator * A bidirectional iterator 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` + * \cgalModels{BidirectionalIterator} */ template class Vertex_around_face_iterator @@ -1135,7 +1135,7 @@ edges_around_face(typename boost::graph_traits::halfedge_descriptor h, co * It circulates over the same halfedges as the `Halfedge_around_target_circulator`. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalCirculator` + * \cgalModels{BidirectionalCirculator} */ template class Vertex_around_target_circulator @@ -1194,7 +1194,7 @@ class Vertex_around_target_circulator * It iterates over the same halfedges as the `Halfedge_around_target_iterator`. * * \tparam Graph must be a model of the concept `HalfedgeGraph` - * \cgalModels `BidirectionalIterator` + * \cgalModels{BidirectionalIterator} */ template class Vertex_around_target_iterator diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h index bb66bd3d577c..fe24383aa534 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Delaunay_domain_2.h @@ -51,7 +51,7 @@ namespace Barycentric_coordinates { a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and value type is `Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `DiscretizedDomain_2` + \cgalModels{DiscretizedDomain_2} */ template< typename VertexRange, diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h index 91d96c2f1c40..392a7d38b909 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h @@ -48,7 +48,7 @@ namespace Barycentric_coordinates { \tparam Traits must be a model of the concepts `BarycentricTraits_2` and `PolygonTraits_2`. -\cgalModels `BarycentricCoordinates_2` +\cgalModels{BarycentricCoordinates_2} \pre The provided polygon is strictly convex. diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h index ef895698b0ae..f61c6be8bdd9 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h @@ -100,7 +100,7 @@ template \tparam Traits must be a model of the concept `BarycentricTraits_2`. -\cgalModels `BarycentricCoordinates_2` +\cgalModels{BarycentricCoordinates_2} */ template diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h index 469b84a09a30..221ed7ad21be 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h @@ -48,7 +48,7 @@ namespace Barycentric_coordinates { \tparam Traits must be a model of the concepts `BarycentricTraits_2` and `PolygonTraits_2`. -\cgalModels `BarycentricCoordinates_2` +\cgalModels{BarycentricCoordinates_2} \pre The provided polygon is strictly convex. diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2/Gps_default_dcel.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2/Gps_default_dcel.h index 64158347a425..9aed558f9247 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2/Gps_default_dcel.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Boolean_set_operations_2/Gps_default_dcel.h @@ -15,7 +15,7 @@ You need to extend this template with auxiliary data only if you intend to obtain the underlying arrangement of the general polygon set and process it further. -\cgalModels `GeneralPolygonSetDcelFace` +\cgalModels{GeneralPolygonSetDcelFace} \sa `Arr_face_base` */ @@ -35,7 +35,7 @@ You need to extend this template with auxiliary data only if you intend to obtain the underlying arrangement of the general polygon set and process it further. -\cgalModels `GeneralPolygonSetDcelHalfedge` +\cgalModels{GeneralPolygonSetDcelHalfedge} \sa `Arr_halfedge_base` */ @@ -62,7 +62,7 @@ You need to override this default and use a different \dcel only if you intend to obtain the underlying arrangement of the general polygon set and process it further. -\cgalModels `GeneralPolygonSetDcel` +\cgalModels{GeneralPolygonSetDcel} \sa `Arr_dcel_base` \sa `Gps_halfedge_base` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/General_polygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/General_polygon_2.h index 636853b0ed91..c5c628cc757b 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/General_polygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/General_polygon_2.h @@ -20,7 +20,7 @@ support the following functions: This class supports a few convenient operations in addition to the requirements that the concept `GeneralPolygon_2` lists. -\cgalModels `GeneralPolygon_2` +\cgalModels{GeneralPolygon_2} */ template< typename ArrTraits > diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_circle_segment_traits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_circle_segment_traits_2.h index c93ff9e02752..c2b0b4b0e6d8 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_circle_segment_traits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_circle_segment_traits_2.h @@ -9,7 +9,7 @@ concept. It enables Boolean set-operations on general polygons bounded by linear segments or circular arcs. It should be parameterized with a kernel. -\cgalModels `GeneralPolygonSetTraits_2` +\cgalModels{GeneralPolygonSetTraits_2} \sa `CGAL::Arr_circle_segment_traits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_segment_traits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_segment_traits_2.h index dbe5f325b011..7dd12f6f1075 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_segment_traits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_segment_traits_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgBooleanSetOperations2Ref -\cgalModels `GeneralPolygonSetTraits_2` +\cgalModels{GeneralPolygonSetTraits_2} \sa `CGAL::Arr_segment_traits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_traits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_traits_2.h index 050bada2dece..6d65a9e5e430 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_traits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/Gps_traits_2.h @@ -13,7 +13,7 @@ the concept `ArrangementXMonotoneTraits_2`). The template parameter of `GpsTraitsGeneralPolygon_2`. By default, the latter is instantiated by `CGAL::General_polygon_2`. -\cgalModels `GeneralPolygonSetTraits_2` +\cgalModels{GeneralPolygonSetTraits_2} */ template< typename ArrTraits, typename GeneralPolygon_t > diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_2.h index a83c5184807b..afecb15c8dc9 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_2.h @@ -18,7 +18,7 @@ exact computations. `CGAL::Tag_true`. (Examples of such a number-type are `MP_Float`, `CORE::Expr`, and `Gmpq`.) -\cgalModels `ApproximateMinEllipsoid_d_Traits_d` +\cgalModels{ApproximateMinEllipsoid_d_Traits_d} \sa `CGAL::Approximate_min_ellipsoid_d_traits_3` \sa `CGAL::Approximate_min_ellipsoid_d_traits_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_3.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_3.h index ce851ee9f458..b980e60bf1e9 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_3.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_3.h @@ -19,7 +19,7 @@ exact computations. `Tag_true` (Examples of such a number-type are `MP_Float`, `CORE::Expr`, and `Gmpq`.) -\cgalModels `ApproximateMinEllipsoid_d_Traits_d` +\cgalModels{ApproximateMinEllipsoid_d_Traits_d} \sa `CGAL::Approximate_min_ellipsoid_d_traits_2` \sa `CGAL::Approximate_min_ellipsoid_d_traits_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_d.h index 44caa851a38d..1c655e7f242f 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d_traits_d.h @@ -18,7 +18,7 @@ exact computations. `CGAL::Tag_true` (Examples of such a number-type are `MP_Float`, `CORE::Expr`, and `Gmpq`.) -\cgalModels `ApproximateMinEllipsoid_d_Traits_d` +\cgalModels{ApproximateMinEllipsoid_d_Traits_d} \sa `CGAL::Approximate_min_ellipsoid_d_traits_2` \sa `CGAL::Approximate_min_ellipsoid_d_traits_3` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_circle_2_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_circle_2_traits_2.h index 466674a71de2..66560c136546 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_circle_2_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_circle_2_traits_2.h @@ -9,7 +9,7 @@ using the two-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. -\cgalModels `MinCircle2Traits` +\cgalModels{MinCircle2Traits} \sa `CGAL::Min_circle_2` \sa `MinCircle2Traits` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h index 25b54759c1a2..ab207e354fb9 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h @@ -9,7 +9,7 @@ using the two-dimensional \cgal kernel. The template parameter `K` must be a model for `Kernel`. -\cgalModels `MinEllipse2Traits` +\cgalModels{MinEllipse2Traits} \sa `CGAL::Min_ellipse_2` \sa `MinEllipse2Traits` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_quadrilateral_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_quadrilateral_traits_2.h index f44fcbe475ed..7357ae30f294 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_quadrilateral_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_quadrilateral_traits_2.h @@ -10,7 +10,7 @@ functions `min_rectangle_2()`, `min_parallelogram_2()` and \tparam K must be a model for `Kernel`. -\cgalModels `MinQuadrilateralTraits_2` +\cgalModels{MinQuadrilateralTraits_2} \sa `CGAL::min_rectangle_2()` \sa `CGAL::min_parallelogram_2()` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h index 3273105434a2..d3c56d3b0956 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_2.h @@ -10,7 +10,7 @@ optimisation algorithms using the two-dimensional \cgal kernel. \tparam K must bea model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. -\cgalModels `MinSphereAnnulusDTraits` +\cgalModels{MinSphereAnnulusDTraits} \sa `CGAL::Min_sphere_d` \sa `CGAL::Min_annulus_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h index 32f770b0703b..84284beefc55 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_3.h @@ -10,7 +10,7 @@ optimisation algorithms using the three-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. -\cgalModels `MinSphereAnnulusDTraits` +\cgalModels{MinSphereAnnulusDTraits} \sa `CGAL::Min_sphere_d` \sa `CGAL::Min_annulus_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h index 198967340a53..f2bc035794b9 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_annulus_d_traits_d.h @@ -10,7 +10,7 @@ optimisation algorithms using the \f$ d\f$-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. \tparam ET NT are models for `RingNumberType`. Their default type is `K::RT`. -\cgalModels `MinSphereAnnulusDTraits` +\cgalModels{MinSphereAnnulusDTraits} \sa `CGAL::Min_sphere_d` \sa `CGAL::Min_annulus_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_2.h index 58a514025cfd..c50875cb3c10 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_2.h @@ -8,7 +8,7 @@ The class model for concept `MinSphereOfSpheresTraits`. It uses the \cgal type `Point_2` to represent circles. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_3.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_3.h index f54cfe542045..d6fc8ff305d3 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_3.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_3.h @@ -8,7 +8,7 @@ The class model for concept `MinSphereOfSpheresTraits`. It uses the \cgal type `Point_3` to represent spheres. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_d.h index 1e0838c0e6a7..a4843602cbb2 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_points_d_traits_d.h @@ -8,7 +8,7 @@ The class a model for concept `MinSphereOfSpheresTraits`. It uses the \cgal type `Point_d` to represent circles. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} \tparam K is a model for `Kernel`. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_2.h index 36f9721ad0d2..fa1761c75313 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_2.h @@ -8,7 +8,7 @@ The class model for concept `MinSphereOfSpheresTraits`. It uses a pair of \cgal `Point_2` and `FT` to represent circles. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} The last two template parameters, `UseSqrt` and `Algorithm`, have diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_3.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_3.h index 71786791402e..cf98855e846d 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_3.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_3.h @@ -8,7 +8,7 @@ The class model for concept `MinSphereOfSpheresTraits`. It uses a pair of \cgal `Point_3` and `FT` to represent spheres. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} \tparam K must be a model for `Kernel`. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_d.h index 96e0b6f7ecb6..ad8fdf4f1fbf 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d_traits_d.h @@ -8,7 +8,7 @@ The class a model for concept `MinSphereOfSpheresTraits`. It uses the \cgal type `Point_d` to represent circles. -\cgalModels `MinSphereOfSpheresTraits` +\cgalModels{MinSphereOfSpheresTraits} \tparam K is a model for `Kernel`. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h index f3baaa625f13..1f6b388ee710 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/rectangular_p_center_2.h @@ -10,7 +10,7 @@ using the function `rectangular_p_center_2()`. \tparam K must be a model for `Kernel`. -\cgalModels `RectangularPCenterTraits_2` +\cgalModels{RectangularPCenterTraits_2} \sa `CGAL::rectangular_p_center_2()` diff --git a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_d.h b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_d.h index 6c4b4dd6819c..ea73e62242e0 100644 --- a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_d.h @@ -40,7 +40,7 @@ creates copies of the boxes that would not have identical `id`-numbers. -\cgalModels `BoxIntersectionBox_d` +\cgalModels{BoxIntersectionBox_d} \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink \sa \link PkgBoxIntersectionD_box_self_intersection_d `CGAL::box_self_intersection_d()` \endlink diff --git a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h index 49823cfe609d..a3731b377d46 100644 --- a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h @@ -20,7 +20,7 @@ cases it just uses the pointer type. const-pointer `const B*`, where `B` is a model of the `BoxIntersectionBox_d` concept. -\cgalModels `BoxIntersectionTraits_d` +\cgalModels{BoxIntersectionTraits_d} \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink \sa \link PkgBoxIntersectionD_box_self_intersection_d `CGAL::box_self_intersection_d()` \endlink diff --git a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_with_handle_d.h b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_with_handle_d.h index 32f04c82c383..7ceb1b14348e 100644 --- a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_with_handle_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_with_handle_d.h @@ -52,7 +52,7 @@ the safe default implementation. available for the `CGAL::Box_intersection_d::Box_d` type that does not store a handle. -\cgalModels `BoxIntersectionBox_d` +\cgalModels{BoxIntersectionBox_d} \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink \sa \link PkgBoxIntersectionD_box_self_intersection_d `CGAL::box_self_intersection_d()` \endlink diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Algebraic_kernel_for_circles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Algebraic_kernel_for_circles_2_2.h index 86598adf69d9..d9e36e19f518 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Algebraic_kernel_for_circles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Algebraic_kernel_for_circles_2_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2AlgebraicClasses -\cgalModels `AlgebraicKernelForCircles` +\cgalModels{AlgebraicKernelForCircles} */ template< typename RT > diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_2.h index 546ac0080557..684ac669ce5e 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2GeometricClasses -\cgalModels `CircularKernel::CircularArc_2` +\cgalModels{CircularKernel::CircularArc_2} \sa `CGAL::Circular_arc_point_2` \sa `CGAL::Line_arc_2` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_point_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_point_2.h index cb8325f4e928..052216f2a8c9 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_point_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_arc_point_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2GeometricClasses -\cgalModels `CircularKernel::CircularArcPoint_2` +\cgalModels{CircularKernel::CircularArcPoint_2} \sa `CGAL::Circular_arc_2` \sa `CGAL::Line_arc_2` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_kernel_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_kernel_2.h index 65401ed2778a..b0ddfe1ca784 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_kernel_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Circular_kernel_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2GeometricClasses -\cgalModels `CircularKernel` +\cgalModels{CircularKernel} \cgalHeading{Parameters} diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Exact_circular_kernel_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Exact_circular_kernel_2.h index 46ff1b15b481..6347918a36d0 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Exact_circular_kernel_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Exact_circular_kernel_2.h @@ -8,7 +8,7 @@ A typedef to a circular kernel that provides both exact geometric predicates and exact geometric constructions. This kernel uses some geometric filtering (based on bounding boxes) to gain efficiency. -\cgalModels `CircularKernel` +\cgalModels{CircularKernel} \sa `CGAL::Circular_kernel_2` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Line_arc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Line_arc_2.h index c8e2fca1e771..53b3a7b34e5a 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Line_arc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Line_arc_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2GeometricClasses -\cgalModels `CircularKernel::LineArc_2` +\cgalModels{CircularKernel::LineArc_2} \cgalHeading{I/O} diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_1_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_1_2.h index c7a3fb71072d..3c0865a74289 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_1_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_1_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2AlgebraicClasses -\cgalModels `AlgebraicKernelForCircles::Polynomial_1_2` +\cgalModels{AlgebraicKernelForCircles::Polynomial_1_2} */ template< typename RT > diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_2_2.h index 80ff654207e8..c287ffd4ed30 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Polynomials_2_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2AlgebraicClasses -\cgalModels `AlgebraicKernelForCircles::PolynomialForCircles_2_2` +\cgalModels{AlgebraicKernelForCircles::PolynomialForCircles_2_2} \sa `CGAL::Sqrt_extension` \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Root_for_circles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Root_for_circles_2_2.h index db7c4ed3a6ad..f0a49daf7771 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Root_for_circles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/CGAL/Root_for_circles_2_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel2AlgebraicClasses -\cgalModels `AlgebraicKernelForCircles::RootForCircles_2_2` +\cgalModels{AlgebraicKernelForCircles::RootForCircles_2_2} */ template< typename FT > diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Algebraic_kernel_for_spheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Algebraic_kernel_for_spheres_2_3.h index db2aec890a4b..b54b34522ea5 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Algebraic_kernel_for_spheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Algebraic_kernel_for_spheres_2_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3AlgebraicClasses -\cgalModels `AlgebraicKernelForSpheres` +\cgalModels{AlgebraicKernelForSpheres} */ template< typename RT > diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_3.h index 6accd5fdda72..018a713b6c4e 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3GeometricClasses -\cgalModels `SphericalKernel::CircularArc_3` +\cgalModels{SphericalKernel::CircularArc_3} \cgalHeading{I/O} diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_point_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_point_3.h index 637452fe2017..bfc56e02fe71 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_point_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Circular_arc_point_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3GeometricClasses -\cgalModels `SphericalKernel::CircularArcPoint_3` +\cgalModels{SphericalKernel::CircularArcPoint_3} \sa `CGAL::Circular_arc_3` \sa `CGAL::Line_arc_3` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Exact_spherical_kernel_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Exact_spherical_kernel_3.h index c92182af28b1..a33f4c72cfc5 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Exact_spherical_kernel_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Exact_spherical_kernel_3.h @@ -9,7 +9,7 @@ both exact geometric predicates and exact geometric constructions. It defines the same types as `CGAL::Spherical_kernel_3`. -\cgalModels `SphericalKernel` +\cgalModels{SphericalKernel} */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Line_arc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Line_arc_3.h index 7cc639959de9..744b2e5a0247 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Line_arc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Line_arc_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3GeometricClasses -\cgalModels `SphericalKernel::LineArc_3` +\cgalModels{SphericalKernel::LineArc_3} \sa `CGAL::Circular_arc_point_3` \sa `CGAL::Circular_arc_3` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_1_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_1_3.h index df3532cedfc5..715108154ad1 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_1_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_1_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3AlgebraicClasses -\cgalModels `AlgebraicKernelForSpheres::Polynomial_1_3` +\cgalModels{AlgebraicKernelForSpheres::Polynomial_1_3} */ template< typename RT > diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_2_3.h index 6084f63779df..ee510c4d1ebb 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_2_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3AlgebraicClasses -\cgalModels `AlgebraicKernelForSpheres::PolynomialForSpheres_2_3` +\cgalModels{AlgebraicKernelForSpheres::PolynomialForSpheres_2_3} \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_for_line_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_for_line_3.h index 9c51a9e834a9..2081dee35d2d 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_for_line_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Polynomials_for_line_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3AlgebraicClasses -\cgalModels `AlgebraicKernelForSpheres::PolynomialsForLines_3` +\cgalModels{AlgebraicKernelForSpheres::PolynomialsForLines_3} \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Root_for_spheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Root_for_spheres_2_3.h index 0590e3e0c3dc..0c46aab5c9a8 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Root_for_spheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Root_for_spheres_2_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3AlgebraicClasses -\cgalModels `AlgebraicKernelForSpheres::RootForSpheres_2_3` +\cgalModels{AlgebraicKernelForSpheres::RootForSpheres_2_3} */ template< typename RT > diff --git a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Spherical_kernel_3.h b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Spherical_kernel_3.h index 5c4212c32d5a..cf225ac32606 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Spherical_kernel_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/CGAL/Spherical_kernel_3.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgCircularKernel3GeometricClasses -\cgalModels `SphericalKernel` +\cgalModels{SphericalKernel} \cgalHeading{Parameters} diff --git a/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h b/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h index fbf3b43a4bcf..29c46fef711d 100644 --- a/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h +++ b/Classification/include/CGAL/Classification/ETHZ/Random_forest_classifier.h @@ -63,7 +63,7 @@ namespace ETHZ { \note This classifier is distributed under the MIT license. - \cgalModels `CGAL::Classification::Classifier` + \cgalModels{CGAL::Classification::Classifier} */ class Random_forest_classifier { diff --git a/Classification/include/CGAL/Classification/Feature_base.h b/Classification/include/CGAL/Classification/Feature_base.h index 89ba6e603841..b73dd7154f72 100644 --- a/Classification/include/CGAL/Classification/Feature_base.h +++ b/Classification/include/CGAL/Classification/Feature_base.h @@ -68,7 +68,7 @@ class Feature_base \brief %Handle to a `Feature_base`. - \cgalModels Handle + \cgalModels{Handle} */ class Feature_handle { }; #else diff --git a/Classification/include/CGAL/Classification/Label.h b/Classification/include/CGAL/Classification/Label.h index 7801942afcb3..ba0b4c38f632 100644 --- a/Classification/include/CGAL/Classification/Label.h +++ b/Classification/include/CGAL/Classification/Label.h @@ -105,7 +105,7 @@ class Label \brief %Handle to a classification `Label`. - \cgalModels Handle + \cgalModels{Handle} */ class Label_handle { }; #else diff --git a/Classification/include/CGAL/Classification/Mesh_neighborhood.h b/Classification/include/CGAL/Classification/Mesh_neighborhood.h index 6a00a4138207..bad561d6c0fd 100644 --- a/Classification/include/CGAL/Classification/Mesh_neighborhood.h +++ b/Classification/include/CGAL/Classification/Mesh_neighborhood.h @@ -77,7 +77,7 @@ class Mesh_neighborhood /*! Functor that computes the 1-ring neighborhood of the face of an input mesh. - \cgalModels CGAL::Classification::NeighborQuery + \cgalModels{CGAL::Classification::NeighborQuery} \sa Mesh_neighborhood */ @@ -110,7 +110,7 @@ class Mesh_neighborhood /*! Functor that computes the N-ring neighborhood of the face of an input mesh. - \cgalModels CGAL::Classification::NeighborQuery + \cgalModels{CGAL::Classification::NeighborQuery} \sa Mesh_neighborhood */ diff --git a/Classification/include/CGAL/Classification/OpenCV/Random_forest_classifier.h b/Classification/include/CGAL/Classification/OpenCV/Random_forest_classifier.h index 6e7d5e1f1d0f..b7105279a921 100644 --- a/Classification/include/CGAL/Classification/OpenCV/Random_forest_classifier.h +++ b/Classification/include/CGAL/Classification/OpenCV/Random_forest_classifier.h @@ -47,7 +47,7 @@ namespace OpenCV { \note This class requires the \ref thirdpartyOpenCV library. - \cgalModels `CGAL::Classification::Classifier` + \cgalModels{CGAL::Classification::Classifier} */ class Random_forest_classifier { diff --git a/Classification/include/CGAL/Classification/Point_set_neighborhood.h b/Classification/include/CGAL/Classification/Point_set_neighborhood.h index 156bd68d1cbb..c27c874f0c23 100644 --- a/Classification/include/CGAL/Classification/Point_set_neighborhood.h +++ b/Classification/include/CGAL/Classification/Point_set_neighborhood.h @@ -96,7 +96,7 @@ class Point_set_neighborhood Functor that computes the neighborhood of an input point with a fixed number of neighbors. - \cgalModels CGAL::Classification::NeighborQuery + \cgalModels{CGAL::Classification::NeighborQuery} \sa Point_set_neighborhood */ @@ -131,7 +131,7 @@ class Point_set_neighborhood as the points lying in a sphere of fixed radius centered at the input point. - \cgalModels CGAL::Classification::NeighborQuery + \cgalModels{CGAL::Classification::NeighborQuery} \sa Point_set_neighborhood */ diff --git a/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h b/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h index 7f16459723ad..fac51686e142 100644 --- a/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h +++ b/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h @@ -48,7 +48,7 @@ namespace Classification { \brief %Classifier based on the sum of weighted features with user-defined effects on labels. - \cgalModels `CGAL::Classification::Classifier` + \cgalModels{CGAL::Classification::Classifier} */ class Sum_of_weighted_features_classifier { diff --git a/Classification/include/CGAL/Classification/property_maps.h b/Classification/include/CGAL/Classification/property_maps.h index 44a0a75f0c01..f03e837d8067 100644 --- a/Classification/include/CGAL/Classification/property_maps.h +++ b/Classification/include/CGAL/Classification/property_maps.h @@ -32,7 +32,7 @@ namespace Classification \brief Property map that constructs the center of mass of the face of a mesh on-the-fly. - \cgalModels `ReadablePropertyMap` + \cgalModels{ReadablePropertyMap} \tparam FaceGraph model of `FaceGraph`. @@ -85,7 +85,7 @@ class Face_descriptor_to_center_of_mass_map \brief Property map that constructs a face descriptor with a `bbox()` method from a face descriptor. - \cgalModels `ReadablePropertyMap` + \cgalModels{ReadablePropertyMap} \tparam FaceGraph model of `FaceGraph`. diff --git a/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute.h b/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute.h index 3256326a53c2..60846dd21975 100644 --- a/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute.h +++ b/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Cell_attribute` represents an attribute containing (or not) an information. -\cgalModels `CellAttribute` +\cgalModels{CellAttribute} \tparam Map a model of the `GenericMap` concept. diff --git a/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute_with_id.h b/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute_with_id.h index a99045fbeedf..3733c29241c0 100644 --- a/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute_with_id.h +++ b/Combinatorial_map/doc/Combinatorial_map/CGAL/Cell_attribute_with_id.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Cell_attribute_with_id` represents an attribute containing (or not) an information, and having an id. -\cgalModels `CellAttribute` +\cgalModels{CellAttribute} \tparam Map a model of the `GenericMap` concept. diff --git a/Combinatorial_map/doc/Combinatorial_map/CGAL/Combinatorial_map.h b/Combinatorial_map/doc/Combinatorial_map/CGAL/Combinatorial_map.h index 9dba99d6718a..0038999e7e2a 100644 --- a/Combinatorial_map/doc/Combinatorial_map/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/doc/Combinatorial_map/CGAL/Combinatorial_map.h @@ -8,7 +8,7 @@ The class `Combinatorial_map` represents a dD combinatorial map. Two versions exist: one where Darts and non void attributes are stored in memory using `Compact_container`, using `Alloc` as allocator, and use handles as descriptors; a second one where Darts and non void attributes are stored in an internal std::vector like data-structure, and use indices as descriptors. The choice between the two versions is done through the item class. -\cgalModels `CombinatorialMap` +\cgalModels{CombinatorialMap} \tparam d the dimension of the map. diff --git a/Combinatorial_map/doc/Combinatorial_map/CGAL/Generic_map_min_items.h b/Combinatorial_map/doc/Combinatorial_map/CGAL/Generic_map_min_items.h index 8cbfbf1be14b..434193a8e3cc 100644 --- a/Combinatorial_map/doc/Combinatorial_map/CGAL/Generic_map_min_items.h +++ b/Combinatorial_map/doc/Combinatorial_map/CGAL/Generic_map_min_items.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Generic_map_min_items` defines `void` as the information associated with darts, and no attribute is enabled. -\cgalModels `GenericMapItems` +\cgalModels{GenericMapItems} \cgalHeading{Example} diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/Convex_hull_traits_adapter_2.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/Convex_hull_traits_adapter_2.h index 051d148e06cd..97bac6496bae 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/Convex_hull_traits_adapter_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/Convex_hull_traits_adapter_2.h @@ -10,7 +10,7 @@ Given a property map associating a key to a point, the class `Convex_hull_traits to compute the sequence of keys for which the associated points form a convex hull, performing the predicates of the base traits class on the points associated to the keys. -\cgalModels `ConvexHullTraits_2` +\cgalModels{ConvexHullTraits_2} \sa `CGAL::Convex_hull_constructive_traits_2` \sa `CGAL::Projection_traits_xy_3` diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_constructive_traits_2.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_constructive_traits_2.h index 74534126ab7e..6090cd6785c1 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_constructive_traits_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_constructive_traits_2.h @@ -11,7 +11,7 @@ in the sidedness tests, lines (of type `R::Line_2`) are constructed, which is equivalent to the precomputation of subdeterminants of the orientation-determinant for three points. -\cgalModels `ConvexHullTraits_2` +\cgalModels{ConvexHullTraits_2} \sa `CGAL::Projection_traits_xy_3` \sa `CGAL::Projection_traits_yz_3` diff --git a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_traits_2.h b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_traits_2.h index 5d3fb688ae01..431f04e1b46d 100644 --- a/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_traits_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/CGAL/convex_hull_traits_2.h @@ -7,7 +7,7 @@ The class `Convex_hull_traits_2` serves as a traits class for all the two-dimens convex hull and extreme point calculation function. This class corresponds to the default traits class for these functions. -\cgalModels `ConvexHullTraits_2` +\cgalModels{ConvexHullTraits_2} \sa `CGAL::Convex_hull_constructive_traits_2` \sa `CGAL::Convex_hull_traits_adapter_2` diff --git a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_traits_3.h b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_traits_3.h index b02b0542e186..0258193c16f2 100644 --- a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_traits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_traits_3.h @@ -9,8 +9,7 @@ function when `R` is a kernel with exact predicates but inexact constructions (note that the type `Plane_3` is a triple of `Point_3` and not `R::Plane_3`). \tparam PolygonMesh must be a model of the concept `MutableFaceGraph`. -\cgalModels `ConvexHullTraits_3` -\cgalModels `IsStronglyConvexTraits_3` +\cgalModels{ConvexHullTraits_3,IsStronglyConvexTraits_3} \attention The user must include the header file of the polygon mesh type, even for the default type. diff --git a/Convex_hull_3/doc/Convex_hull_3/CGAL/Extreme_points_traits_adapter_3.h b/Convex_hull_3/doc/Convex_hull_3/CGAL/Extreme_points_traits_adapter_3.h index 5154ffa29686..9f63632758c2 100644 --- a/Convex_hull_3/doc/Convex_hull_3/CGAL/Extreme_points_traits_adapter_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/CGAL/Extreme_points_traits_adapter_3.h @@ -15,8 +15,7 @@ namespace CGAL { * (in practice we check `R::Has_filtered_predicates_tag` is `Tag_true` and `R::FT` is a floating point type), * then the default traits class used is `Convex_hull_traits_3`, and `R` otherwise. * - * \cgalModels `ConvexHullTraits_3` - * \cgalModels `IsStronglyConvexTraits_3` + * \cgalModels{ConvexHullTraits_3,IsStronglyConvexTraits_3} */ template class Extreme_points_traits_adapter_3 diff --git a/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d_traits_3.h b/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d_traits_3.h index 190d83f58fa8..dbba9f5c475f 100644 --- a/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d_traits_3.h +++ b/Convex_hull_d/doc/Convex_hull_d/CGAL/Convex_hull_d_traits_3.h @@ -13,7 +13,7 @@ low-dimensional standard kernel model, e.g. `Homogeneous` or `Cartesian` for the fixed 3-dimensional usage of `Convex_hull_d`. -\cgalModels `ConvexHullTraits_d` +\cgalModels{ConvexHullTraits_d} */ template< typename R > diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 97f12d55731a..dd815e357593 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -135,10 +135,13 @@ ALIASES = "cgal=%CGAL" \ "cgalRefines{5}=
    @cgalRefines
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ "cgalRefinesBare{1}=
    @cgalRefines
    \1
    " \ "cgalRefinesBare{2}=
    @cgalRefines
    @c \1
    \2
    " \ - "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ "cgalModelsHeader=Is model of" \ "cgalModels{1}=
    @cgalModelsHeader
    @c \1
    " \ "cgalModels{2}=
    @cgalModelsHeader
    @c \1
    @c \2
    " \ + "cgalModels{3}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    " \ + "cgalModels{4}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    " \ + "cgalModels{5}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ + "cgalModels{6}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    @c \6
    " \ "cgalModelsBare{1}=
    @cgalModelsHeader
    \1
    " \ "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 3a25e3c92bef..9e73ce583ee0 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -144,10 +144,13 @@ ALIASES = "cgal=%CGAL" \ "cgalRefines{5}=
    @cgalRefines
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ "cgalRefinesBare{1}=
    @cgalRefines
    \1
    " \ "cgalRefinesBare{2}=
    @cgalRefines
    @c \1
    \2
    " \ - "cgalModels=\xrefitem models \"Is Model Of\" \"Is Model Relationships\"" \ "cgalModelsHeader=Is model of" \ "cgalModels{1}=
    @cgalModelsHeader
    @c \1
    " \ "cgalModels{2}=
    @cgalModelsHeader
    @c \1
    @c \2
    " \ + "cgalModels{3}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    " \ + "cgalModels{4}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    " \ + "cgalModels{5}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ + "cgalModels{6}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    @c \6
    " \ "cgalModelsBare{1}=
    @cgalModelsHeader
    \1
    " \ "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ diff --git a/Envelope_2/doc/Envelope_2/CGAL/Envelope_diagram_1.h b/Envelope_2/doc/Envelope_2/CGAL/Envelope_diagram_1.h index 1e91a176b619..abb127ae839f 100644 --- a/Envelope_2/doc/Envelope_2/CGAL/Envelope_diagram_1.h +++ b/Envelope_2/doc/Envelope_2/CGAL/Envelope_diagram_1.h @@ -15,7 +15,7 @@ model of the `ArrangementXMonotoneTraits_2` concept, in case we handle only envelopes of \f$ x\f$-monotone curves, or of the refined `ArrangementTraits_2` concept in case we handle arbitrary planar curves. -\cgalModels `EnvelopeDiagram_1` +\cgalModels{EnvelopeDiagram_1} */ template< typename Traits > diff --git a/Envelope_3/doc/Envelope_3/CGAL/Env_plane_traits_3.h b/Envelope_3/doc/Envelope_3/CGAL/Env_plane_traits_3.h index 0164f27e26af..81d5861e3c8b 100644 --- a/Envelope_3/doc/Envelope_3/CGAL/Env_plane_traits_3.h +++ b/Envelope_3/doc/Envelope_3/CGAL/Env_plane_traits_3.h @@ -28,7 +28,7 @@ in case of an entire plane, or from `Kernel::Plane_3` and `Kernel::Line_2` in case of a half-plane. The line orientation determines which half is considered. -\cgalModels `EnvelopeTraits_3` +\cgalModels{EnvelopeTraits_3} */ template< typename Kernel > diff --git a/Envelope_3/doc/Envelope_3/CGAL/Env_sphere_traits_3.h b/Envelope_3/doc/Envelope_3/CGAL/Env_sphere_traits_3.h index 6f81385717ea..12e170ce5f99 100644 --- a/Envelope_3/doc/Envelope_3/CGAL/Env_sphere_traits_3.h +++ b/Envelope_3/doc/Envelope_3/CGAL/Env_sphere_traits_3.h @@ -25,7 +25,7 @@ The `Xy_monotone_surface_3` type is the same as the nested hemisphere when it computes lower envelopes, and ignores the lower hemisphere when it computes upper envelopes. -\cgalModels `EnvelopeTraits_3` +\cgalModels{EnvelopeTraits_3} */ template< typename ConicTraits > diff --git a/Envelope_3/doc/Envelope_3/CGAL/Env_surface_data_traits_3.h b/Envelope_3/doc/Envelope_3/CGAL/Env_surface_data_traits_3.h index 193f8d891481..bcd4f97ab418 100644 --- a/Envelope_3/doc/Envelope_3/CGAL/Env_surface_data_traits_3.h +++ b/Envelope_3/doc/Envelope_3/CGAL/Env_surface_data_traits_3.h @@ -39,7 +39,7 @@ is trivial and just copies the data object: -\cgalModels `EnvelopeTraits_3` +\cgalModels{EnvelopeTraits_3} */ template< typename Traits, typename XyData, typename SData, typename Cnv > diff --git a/Envelope_3/doc/Envelope_3/CGAL/Env_triangle_traits_3.h b/Envelope_3/doc/Envelope_3/CGAL/Env_triangle_traits_3.h index 759a006de54e..746463520525 100644 --- a/Envelope_3/doc/Envelope_3/CGAL/Env_triangle_traits_3.h +++ b/Envelope_3/doc/Envelope_3/CGAL/Env_triangle_traits_3.h @@ -31,7 +31,7 @@ instance and are also convertible to a `Kernel::Triangle_3` object. Both types, `Xy_monotone_surface_3` and `Surface_3`, refer to the same class, as every triangle is (weakly) \f$ xy\f$-monotone). -\cgalModels `EnvelopeTraits_3` +\cgalModels{EnvelopeTraits_3} */ template< typename Kernel > diff --git a/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h b/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h index 519e80ce4adf..8d030fa2fec4 100644 --- a/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h +++ b/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h @@ -8,7 +8,7 @@ The class `Generalized_map` represents a dD generalized map. Two versions exist: one where darts and non void attributes are stored in memory using `Compact_container`, using `Alloc` as allocator, and use handles as descriptors; a second one where darts and non void attributes are stored in an internal `std::vector` like data-structure, and use indices as descriptors. The choice between the two versions is done through the item class. -\cgalModels `GeneralizedMap` +\cgalModels{GeneralizedMap}} \tparam d the dimension of the map. diff --git a/Generator/doc/Generator/CGAL/Random_convex_set_traits_2.h b/Generator/doc/Generator/CGAL/Random_convex_set_traits_2.h index b478186e0343..e3f6a2a15ed8 100644 --- a/Generator/doc/Generator/CGAL/Random_convex_set_traits_2.h +++ b/Generator/doc/Generator/CGAL/Random_convex_set_traits_2.h @@ -5,7 +5,7 @@ namespace CGAL { The class `Random_convex_set_traits_2` serves as a traits class for the function `random_convex_set_2()`. -\cgalModels `RandomConvexSetTraits_2` +\cgalModels{RandomConvexSetTraits_2} */ template< typename Kernel > diff --git a/Generator/doc/Generator/CGAL/point_generators_2.h b/Generator/doc/Generator/CGAL/point_generators_2.h index 459e856ac8dd..aec175967500 100644 --- a/Generator/doc/Generator/CGAL/point_generators_2.h +++ b/Generator/doc/Generator/CGAL/point_generators_2.h @@ -143,8 +143,7 @@ The class `Random_points_in_disc_2` is an input iterator creating points uniform distributed in an open disc. The default `Creator` is `Creator_uniform_2::Kernel::RT,Point_2>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_square_2` @@ -207,8 +206,7 @@ The class `Random_points_in_square_2` is an input iterator creating points unifo distributed in a half-open square. The default `Creator` is `Creator_uniform_2::Kernel::RT,Point_2>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_triangle_2` @@ -272,8 +270,7 @@ The class `Random_points_in_triangle_2` is an input iterator creating points uni distributed inside a triangle. The default `Creator` is `Creator_uniform_2::Kernel::RT,Point_2>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -345,8 +342,7 @@ typedef const Point_2& reference; The triangulation must be valid and unchanged while the iterator is used. - \cgalModels `InputIterator` - \cgalModels `PointGenerator` + \cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -413,8 +409,7 @@ get_default_random() ); The triangle range must be valid and unchanged while the iterator is used. - \cgalModels `InputIterator` - \cgalModels `PointGenerator` + \cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -483,8 +478,7 @@ The generated points are computed using floating point arithmetic, whatever the Kernel is, thus they are on the circle/sphere only up to rounding errors. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -550,8 +544,7 @@ The class `Random_points_on_segment_2` is an input iterator creating points unif distributed on a segment. The default `Creator` is `Creator_uniform_2::Kernel::RT,Point_2>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -616,8 +609,7 @@ The class `Random_points_on_square_2` is an input iterator creating points unifo distributed on the boundary of a square. The default `Creator` is `Creator_uniform_2::Kernel::RT,Point_2>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` @@ -683,9 +675,9 @@ namespace CGAL { The class `Points_on_segment_2` is a generator for points on a segment whose endpoints are specified upon construction. The points are equally spaced. -\cgalModels `PointGenerator` +\cgalModels{PointGenerator} -\sa `CGAL::points_on_segment_2` +\sa `CGAL::points_on_segment_2 \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_square_2` \sa `CGAL::Random_points_in_triangle_2` diff --git a/Generator/doc/Generator/CGAL/point_generators_3.h b/Generator/doc/Generator/CGAL/point_generators_3.h index 6c7fd5985152..1e2853fa5cfa 100644 --- a/Generator/doc/Generator/CGAL/point_generators_3.h +++ b/Generator/doc/Generator/CGAL/point_generators_3.h @@ -41,8 +41,7 @@ The class `Random_points_in_cube_3` is an input iterator creating points uniform distributed in a half-open cube. The default `Creator` is `Creator_uniform_3::Kernel::RT,Point_3>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_square_2` \sa `CGAL::Random_points_in_sphere_3` @@ -106,8 +105,7 @@ The class `Random_points_in_sphere_3` is an input iterator creating points unifo distributed strictly inside a sphere. The default `Creator` is `Creator_uniform_3::Kernel::RT,Point_3>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_cube_3` @@ -171,8 +169,7 @@ The class `Random_points_in_triangle_3` is an input iterator creating points uni distributed inside a 3D triangle. The default `Creator` is `Creator_uniform_3::Kernel::RT,Point_3>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_cube_3` @@ -245,8 +242,7 @@ The class `Random_points_on_segment_3` is an input iterator creating points unif distributed on a segment. The default `Creator` is `Creator_uniform_3::Kernel::RT,Point_3>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_cube_3` \sa `CGAL::Random_points_in_triangle_3` @@ -311,8 +307,7 @@ The class `Random_points_in_tetrahedron_3` is an input iterator creating points distributed inside a tetrahedron. The default `Creator` is `Creator_uniform_3::Kernel::RT,Point_3>`. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_on_segment_3` \sa `CGAL::Random_points_in_cube_3` @@ -387,8 +382,7 @@ The class `Random_points_in_triangles_3` is an input iterator creating points un The triangle range must be valid and unchanged while the iterator is used. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_cube_3` \sa `CGAL::Random_points_in_triangle_3` @@ -454,8 +448,7 @@ The class `Random_points_in_triangle_mesh_3` is an input iterator creating point distributed inside the faces of a triangle mesh model of `FaceListGraph`. The triangle mesh must be valid and unchanged while the iterator is used. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_cube_3` @@ -534,8 +527,7 @@ The tetrahedral mesh must be valid and unchanged while the iterator is used. \tparam C3T3 must be a model of `Mesh_complex_3_in_triangulation_3` -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_cube_3` @@ -608,8 +600,7 @@ The tetrahedral mesh must be valid and unchanged while the iterator is used. \tparam C3T3 must be a model of `Mesh_complex_3_in_triangulation_3` -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_cube_3` @@ -682,8 +673,7 @@ The generated points are computed using floating point arithmetic, whatever the Kernel is, thus they are on the circle/sphere only up to rounding errors. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_on_circle_2` \sa `CGAL::Random_points_in_cube_3` diff --git a/Generator/doc/Generator/CGAL/point_generators_d.h b/Generator/doc/Generator/CGAL/point_generators_d.h index a06065a8ac12..7f22705dee71 100644 --- a/Generator/doc/Generator/CGAL/point_generators_d.h +++ b/Generator/doc/Generator/CGAL/point_generators_d.h @@ -40,8 +40,7 @@ Creator creator); The class `Random_points_in_ball_d` is an input iterator creating points uniformly distributed in an open ball in any dimension. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_sphere_3` @@ -106,8 +105,7 @@ namespace CGAL { The class `Random_points_in_cube_d` is an input iterator creating points uniformly distributed in an half-open cube. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_in_square_2` \sa `CGAL::Random_points_in_cube_3` @@ -178,8 +176,7 @@ The generated points are computed using floating point arithmetic, whatever the Kernel is, thus they are on the sphere only up to rounding errors. -\cgalModels `InputIterator` -\cgalModels `PointGenerator` +\cgalModels{InputIterator,PointGenerator} \sa `CGAL::Random_points_on_circle_2` \sa `CGAL::Random_points_on_sphere_3` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h index 5d620b9aba36..c30b0c5f3885 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h @@ -10,7 +10,7 @@ uses the \cgal default allocator as default setting. `HalfedgeDS_default` is a list-based representation with bidirectional iterators that supports removal. -\cgalModels `HalfedgeDS` +\cgalModelsBare{`HalfedgeDS`} \sa `CGAL::HalfedgeDS_list` \sa `CGAL::HalfedgeDS_vector` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_base.h index b7e0923adefc..64569d0b25c9 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_base.h @@ -35,7 +35,7 @@ without a reference to an incident halfedge and it stores a plane equation of type `Plane`. It can be used as a face for a model of the `PolyhedronItems_3` concept. -\cgalModels `HalfedgeDSFace` +\cgalModels{HalfedgeDSFace} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_min_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_min_base.h index c9ee44f575df..204225bbef27 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_min_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_face_min_base.h @@ -9,7 +9,7 @@ equivalent to `CGAL::HalfedgeDS_face_base< Refs, CGAL::Tag_false>`. It is empty besides the required type definitions. It can be used for deriving own faces. -\cgalModels `HalfedgeDSFace` +\cgalModels{HalfedgeDSFace} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_base.h index 0fb795756029..57a386b3b42e 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_base.h @@ -57,7 +57,7 @@ supported. In all cases, a reference to the next halfedge and to the opposite halfedge is supported. -\cgalModels `HalfedgeDSHalfedge` +\cgalModels{HalfedgeDSHalfedge} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_min_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_min_base.h index 7358f0858d02..2be20cb48f35 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_min_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_halfedge_min_base.h @@ -10,7 +10,7 @@ CGAL::Tag_false, CGAL::Tag_false, CGAL::Tag_false>`. The class contains support for the next and the opposite pointer and the required type definitions. It can be used for deriving own halfedges. -\cgalModels `HalfedgeDSHalfedge` +\cgalModels{HalfedgeDSHalfedge} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_items_2.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_items_2.h index 39b806a24122..3e050fb78087 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_items_2.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_items_2.h @@ -9,7 +9,7 @@ declare all incidences supported by a `HalfedgeDS`. The vertex also contains a point of type `Traits::Point_2`, where `Traits` is the template argument of the corresponding `HalfedgeDS`. -\cgalModels `HalfedgeDSItems` +\cgalModels{HalfedgeDSItems} \sa `CGAL::HalfedgeDS_min_items` \sa `CGAL::Polyhedron_items_3` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h index 66407bbf6dd3..cee3b3d30288 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h @@ -7,7 +7,7 @@ The class `HalfedgeDS_list` is a model for the `HalfedgeDS` concept. `HalfedgeDS_list` is a list-based representation with bidirectional iterators that supports removal. -\cgalModels `HalfedgeDS` +\cgalModelsBare{`HalfedgeDS`} \sa `CGAL::HalfedgeDS_default` \sa `CGAL::HalfedgeDS_vector` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_min_items.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_min_items.h index 55504012cce3..8439f152f2a0 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_min_items.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_min_items.h @@ -9,7 +9,7 @@ declare the minimal required incidences for a `HalfedgeDS`, which are the `next()` and the `opposite()` member function for halfedges. -\cgalModels `HalfedgeDSItems` +\cgalModels{HalfedgeDSItems} \sa `CGAL::HalfedgeDS_items_2` \sa `CGAL::Polyhedron_items_3` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h index 51942b6adf52..d2f29447128f 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h @@ -7,7 +7,7 @@ The class `HalfedgeDS_vector` is a model for the `HalfedgeDS` concept. `HalfedgeDS_vector` is a vector-based representation with random access iterators that does not support removal. -\cgalModels `HalfedgeDS` +\cgalModelsBare{`HalfedgeDS`} \sa `CGAL::HalfedgeDS_default` \sa `CGAL::HalfedgeDS_list` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_base.h index b4ac2235f636..e1b294bdc000 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_base.h @@ -33,7 +33,7 @@ Let us look at some instantiations type `Point`. It can be used as a vertex for a model of the `PolyhedronItems_3` concept. -\cgalModels `HalfedgeDSVertex` +\cgalModels{HalfedgeDSVertex} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_min_base.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_min_base.h index 52232dff3ee2..aa9813027374 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_min_base.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vertex_min_base.h @@ -9,7 +9,7 @@ equivalent to `HalfedgeDS_vertex_base< Refs, CGAL::Tag_false>`. It is empty besides the required type definitions. It can be used for deriving own vertices. -\cgalModels `HalfedgeDSVertex` +\cgalModels{HalfedgeDSVertex} \sa `HalfedgeDS` \sa `HalfedgeDSItems` diff --git a/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h index cff7968bd7e8..65d78512514d 100644 --- a/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h +++ b/Heat_method_3/include/CGAL/Heat_method_3/internal/Intrinsic_Delaunay_triangulation_3.h @@ -146,7 +146,7 @@ struct Intrinsic_Delaunay_triangulation_3_vertex_iterator_functor * \tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` and `HalfedgeListGraph` * \tparam Traits a model of `HeatMethodTraits_3` * - * \cgalModels `FaceListGraph` + * \cgalModels{FaceListGraph} */ template diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h index 8eab67ea0836..199f295efc24 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h @@ -20,7 +20,7 @@ algebraic coordinates. \sa `Hyperbolic_Delaunay_triangulation_CK_traits_2` -\cgalModels `HyperbolicDelaunayTriangulationTraits_2` +\cgalModels{HyperbolicDelaunayTriangulationTraits_2} */ template< class K > diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_triangulation_face_base_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_triangulation_face_base_2.h index c5dabf727b93..d7c85fc23725 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_triangulation_face_base_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_triangulation_face_base_2.h @@ -14,7 +14,7 @@ offered by \cgal. \tparam Fb must be a model of `TriangulationFaceBase_2`. %Defaults to `Triangulation_face_base_2`. -\cgalModels `HyperbolicTriangulationFaceBase_2` +\cgalModels{HyperbolicTriangulationFaceBase_2} */ diff --git a/Inscribed_areas/doc/Inscribed_areas/CGAL/Extremal_polygon_traits_2.h b/Inscribed_areas/doc/Inscribed_areas/CGAL/Extremal_polygon_traits_2.h index 14fbc1a339a8..c30c1d54a325 100644 --- a/Inscribed_areas/doc/Inscribed_areas/CGAL/Extremal_polygon_traits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/CGAL/Extremal_polygon_traits_2.h @@ -13,7 +13,7 @@ be inscribed into a given convex polygon \f$ P\f$ using the function \tparam K must be a model of `Kernel`. -\cgalModels `ExtremalPolygonTraits_2` +\cgalModels{ExtremalPolygonTraits_2} \sa `CGAL::maximum_area_inscribed_k_gon_2()` \sa `CGAL::maximum_perimeter_inscribed_k_gon_2()` @@ -117,7 +117,7 @@ k\f$-gon \f$ P_k\f$ that can be inscribed into a given convex polygon \tparam K must be a model of `Kernel`. -\cgalModels `ExtremalPolygonTraits_2` +\cgalModels{ExtremalPolygonTraits_2} \sa `CGAL::maximum_area_inscribed_k_gon_2()` \sa `CGAL::maximum_perimeter_inscribed_k_gon_2()` diff --git a/Interpolation/doc/Interpolation/CGAL/Interpolation_gradient_fitting_traits_2.h b/Interpolation/doc/Interpolation/CGAL/Interpolation_gradient_fitting_traits_2.h index 73b2ca492690..fe4dd468cb76 100644 --- a/Interpolation/doc/Interpolation/CGAL/Interpolation_gradient_fitting_traits_2.h +++ b/Interpolation/doc/Interpolation/CGAL/Interpolation_gradient_fitting_traits_2.h @@ -11,8 +11,7 @@ functions and of Sibson's gradient fitting function when applied on a function defined over a two-dimensional domain. The traits class is templated by a kernel class `K`. -\cgalModels `GradientFittingTraits` -\cgalModels `InterpolationTraits` +\cgalModels{GradientFittingTraits,InterpolationTraits} \sa `InterpolationTraits` \sa `GradientFittingTraits` diff --git a/Interpolation/doc/Interpolation/CGAL/Interpolation_traits_2.h b/Interpolation/doc/Interpolation/CGAL/Interpolation_traits_2.h index 4dfb092457de..79fb75c24afd 100644 --- a/Interpolation/doc/Interpolation/CGAL/Interpolation_traits_2.h +++ b/Interpolation/doc/Interpolation/CGAL/Interpolation_traits_2.h @@ -10,7 +10,7 @@ geometric traits class of interpolation methods applied on a bivariate function over a two-dimensional domain. The traits class is templated by a kernel class `K`. -\cgalModels `InterpolationTraits` +\cgalModels{InterpolationTraits} \sa `InterpolationTraits` \sa `GradientFittingTraits` diff --git a/Interpolation/doc/Interpolation/CGAL/Voronoi_intersection_2_traits_3.h b/Interpolation/doc/Interpolation/CGAL/Voronoi_intersection_2_traits_3.h index 2f3475cff060..68b432af00e0 100644 --- a/Interpolation/doc/Interpolation/CGAL/Voronoi_intersection_2_traits_3.h +++ b/Interpolation/doc/Interpolation/CGAL/Voronoi_intersection_2_traits_3.h @@ -20,7 +20,7 @@ points without explicitly constructing the projected points and the weights. This reduces the arithmetic demands. The traits class is templated by a kernel class `K` and inherits from it. -\cgalModels `RegularTriangulationTraits_2` +\cgalModels{RegularTriangulationTraits_2} \sa `CGAL::Regular_triangulation_2` \sa `PkgInterpolationRegularNeighborCoordinates2` diff --git a/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list_interval.h b/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list_interval.h index 0507c73d6788..b6d2bc94a8ad 100644 --- a/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list_interval.h +++ b/Interval_skip_list/doc/Interval_skip_list/CGAL/Interval_skip_list_interval.h @@ -11,7 +11,7 @@ can be open or closed at each endpoint. The output operator is defined for `std::ostream`. -\cgalModels `Interval` +\cgalModels{Interval} */ template< typename Value > diff --git a/Interval_skip_list/doc/Interval_skip_list/CGAL/Level_interval.h b/Interval_skip_list/doc/Interval_skip_list/CGAL/Level_interval.h index 8ee910ca5dc9..4e80b70e6194 100644 --- a/Interval_skip_list/doc/Interval_skip_list/CGAL/Level_interval.h +++ b/Interval_skip_list/doc/Interval_skip_list/CGAL/Level_interval.h @@ -13,7 +13,7 @@ whose `Kernel_traits::Kernel` must have a nested type `FT`. These requirements are fulfilled, if one uses a \cgal triangulation and a \cgal `Kernel`. -\cgalModels `Interval` +\cgalModels{Interval} */ template< typename FaceHandle > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_2.h b/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_2.h index 4bd99fa3771b..1c0cb7a99315 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_2.h @@ -34,7 +34,7 @@ translation vector \f$ (v_0,\,v_1,\,1)\f$ appears in the last column of the matrix. The entries \f$ m_{20}\f$ and \f$ m_{21}\f$ are always zero and therefore do not appear in the constructors. -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} \sa `Identity_transformation` \sa `Rotation` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_3.h b/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_3.h index cfb2c924cb8a..1312f02689f1 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Aff_transformation_3.h @@ -29,7 +29,7 @@ In three-dimensional space we have a \f$ 4\times 4\f$ matrix \f$ m_{32}\f$ are always zero and therefore do not appear in the constructors. -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} \sa `CGAL::Aff_transformation_2` \sa `CGAL::Identity_transformation` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Bbox_2.h b/Kernel_23/doc/Kernel_23/CGAL/Bbox_2.h index ec861b9cb72b..1905d3367034 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Bbox_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Bbox_2.h @@ -7,7 +7,7 @@ namespace CGAL { An object `b` of the class `Bbox_2` is a bounding box in the two-dimensional Euclidean plane \f$ \E^2\f$. This class is not templated. -\cgalModels `Hashable` +\cgalModels{Hashable} \sa `CGAL::Bbox_3` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Bbox_3.h b/Kernel_23/doc/Kernel_23/CGAL/Bbox_3.h index a61d5e339af9..f44a44e48129 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Bbox_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Bbox_3.h @@ -7,7 +7,7 @@ namespace CGAL { An object `b` of the class `Bbox_3` is a bounding box in the three-dimensional Euclidean space \f$ \E^3\f$. -\cgalModels `Hashable` +\cgalModels{Hashable} \sa `CGAL::Bbox_2` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Cartesian.h b/Kernel_23/doc/Kernel_23/CGAL/Cartesian.h index 453a15d867d2..46920d12e07c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Cartesian.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Cartesian.h @@ -14,7 +14,7 @@ type provided as a model for `FieldNumberType` is only an approximation of a field (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Implementation} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h index 1e9eacdeb0e4..0903e5152555 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Circle_2.h @@ -11,8 +11,7 @@ positive side is to the left of the boundary. The boundary also splits \f$ \E^2\f$ into a bounded and an unbounded side. Note that the circle can be degenerated, i.e.\ the squared radius may be zero. -\cgalModels `Kernel::Circle_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Circle_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h b/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h index 1fcdcab6e68f..4624be59f351 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Circle_3.h @@ -7,7 +7,7 @@ An object `c` of type `Circle_3` is a circle in the three-dimensional Euclidean space \f$ \E^3\f$. Note that the circle can be degenerate, i.e.\ the squared radius may be zero. -\cgalModels `Kernel::Circle_3` +\cgalModels{Kernel::Circle_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h b/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h index 00a2e8d74a57..241f39e64094 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Direction_2.h @@ -14,7 +14,7 @@ orthogonal to an oriented plane, or the direction of an oriented line. Further, they can be used to indicate angles. The slope of a direction is `dy()`/`dx()`. -\cgalModels `Kernel::Direction_2` +\cgalModels{Kernel::Direction_2} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h b/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h index 81b096ac359a..34c8c55766d0 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Direction_3.h @@ -13,7 +13,7 @@ or the direction normal to parallel planes that have the same orientation. For example, you can ask for the direction orthogonal to an oriented plane, or the direction of an oriented line. -\cgalModels `Kernel::Direction_3` +\cgalModels{Kernel::Direction_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel.h index a29334c9fc08..5a6bae83b3ea 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel.h @@ -14,7 +14,7 @@ coordinates. constructions. -\cgalModels `Kernel` +\cgalModels{Kernel} \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_kth_root` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_kth_root.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_kth_root.h index 275fd9ae602c..3b889df0f040 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_kth_root.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_kth_root.h @@ -17,7 +17,7 @@ constructions. Note that it requires CORE or LEDA installed. -\cgalModels `Kernel` +\cgalModels{Kernel} \sa `CGAL::Exact_predicates_exact_constructions_kernel` \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_root_of.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_root_of.h index 512a90c0de66..9e9f5fafcdc3 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_root_of.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_root_of.h @@ -17,7 +17,7 @@ constructions. Note that it requires CORE or LEDA installed. -\cgalModels `Kernel` +\cgalModels{Kernel} \sa `CGAL::Exact_predicates_exact_constructions_kernel` \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h index 329cf7b73af8..7827a88903b9 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_exact_constructions_kernel_with_sqrt.h @@ -17,7 +17,7 @@ constructions. Note that it requires CORE or LEDA installed. -\cgalModels `Kernel` +\cgalModels{Kernel} \sa `CGAL::Exact_predicates_exact_constructions_kernel` \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_kth_root` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h index 1063561e3d65..d53f16093f08 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Exact_predicates_inexact_constructions_kernel.h @@ -14,7 +14,7 @@ coordinates. constructions. -\cgalModels `Kernel` +\cgalModels{Kernel} \sa `CGAL::Exact_predicates_exact_constructions_kernel` \sa `CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Filtered_kernel.h b/Kernel_23/doc/Kernel_23/CGAL/Filtered_kernel.h index d2842b55a2ec..5935300f991e 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Filtered_kernel.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Filtered_kernel.h @@ -14,7 +14,7 @@ More details about the filtering technique can be found in \cgalCite{cgal:bbp-i In contrast to `Filtered_kernel`, the global functions are those of `CK`. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Example} @@ -71,7 +71,7 @@ activates or not an additional layer of semi-static filters. It defaults to defined. This option is mostly for debugging and testing, there should be no production use for deactivating static filters. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Example} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Homogeneous.h b/Kernel_23/doc/Kernel_23/CGAL/Homogeneous.h index 64f071e40a02..b46345798dfb 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Homogeneous.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Homogeneous.h @@ -14,7 +14,7 @@ type provided as a model for `RingNumberType` is only an approximation of a ring (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Implementation} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h b/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h index a32da1d2490d..c98675c6ecf8 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Iso_cuboid_3.h @@ -16,8 +16,7 @@ difference however is that bounding boxes have always double coordinates, whereas the coordinate type of an iso-oriented cuboid is chosen by the user. -\cgalModels `Kernel::IsoCuboid_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::IsoCuboid_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h index d7228803e0e2..106c019b0e2c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Iso_rectangle_2.h @@ -17,8 +17,7 @@ difference however is that bounding boxes have always double coordinates, whereas the coordinate type of an iso-oriented rectangle is chosen by the user. -\cgalModels `Kernel::IsoRectangle_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::IsoRectangle_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Line_2.h b/Kernel_23/doc/Kernel_23/CGAL/Line_2.h index 079c65a6eb6c..6d10a6efc622 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Line_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Line_2.h @@ -34,7 +34,7 @@ To define a line `l` we write: Line_2< Cartesian > l(p,q); \endcode -\cgalModels `Kernel::Line_2` +\cgalModels{Kernel::Line_2} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Line_3.h b/Kernel_23/doc/Kernel_23/CGAL/Line_3.h index e7b19f591073..1760d5f6c2a2 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Line_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Line_3.h @@ -6,7 +6,7 @@ namespace CGAL { An object `l` of the data type `Line_3` is a directed straight line in the three-dimensional Euclidean space \f$ \E^3\f$. -\cgalModels `Kernel::Line_3` +\cgalModels{Kernel::Line_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h b/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h index 9ef778c7c174..4496ea077dd8 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Plane_3.h @@ -14,7 +14,7 @@ A point `p` with %Cartesian coordinates \f$ (px, py, pz)\f$ is on the positive side of `h`, iff \f$ a\, px +b\, py +c\, pz + d > 0\f$. It is on the negative side, iff \f$ a\, px +b\, py\, +c\, pz + d < 0\f$. -\cgalModels `Kernel::Plane_3` +\cgalModels{Kernel::Plane_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Point_2.h b/Kernel_23/doc/Kernel_23/CGAL/Point_2.h index 00ea07ef2fbc..7548bef24722 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Point_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Point_2.h @@ -30,8 +30,7 @@ p = q; std::cout << p.x() << " " << p.y() << std::endl; \endcode -\cgalModels `Kernel::Point_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Point_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Point_3.h b/Kernel_23/doc/Kernel_23/CGAL/Point_3.h index 0babd70a4c84..7bd6d26fddc7 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Point_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Point_3.h @@ -16,8 +16,7 @@ to `NT`, and `Kernel::FT` is equal to `Quotient`. The following operations can be applied on points: -\cgalModels `Kernel::Point_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Point_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_3.h b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_3.h index 9c468b37b225..8642cd194d1f 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_3.h @@ -15,12 +15,7 @@ constructions or if `K` is a `CGAL::Filtered_kernel` (such as for `CGAL::Exact_predicates_inexact_constructions_kernel`), this class automatically provides exact predicates. -\cgalModels `TriangulationTraits_2` -\cgalModels `DelaunayTriangulationTraits_2` -\cgalModels `ConstrainedTriangulationTraits_2` -\cgalModels `PolygonTraits_2` -\cgalModels `ConformingDelaunayTriangulationTraits_2` -\cgalModels `Barycentric_coordinates::BarycentricTraits_2` +\cgalModels{TriangulationTraits_2,DelaunayTriangulationTraits_2,ConstrainedTriangulationTraits_2,PolygonTraits_2,ConformingDelaunayTriangulationTraits_2,Barycentric_coordinates::BarycentricTraits_2} \sa `CGAL::Projection_traits_xy_3` \sa `CGAL::Projection_traits_xz_3` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h index ab57d5cfb67a..d9911834c80c 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h @@ -21,18 +21,12 @@ constructions or if `K` is a `CGAL::Filtered_kernel` (such as for `CGAL::Exact_predicates_inexact_constructions_kernel`), this class automatically provides exact predicates. -\cgalModels The class is a model of several 2D triangulation traits class concepts, +\cgalModelsBare{The class is a model of several 2D triangulation traits class concepts\, except that it does not provide the type and constructors - required to build the dual Voronoi diagram. -\cgalModels `PolygonTraits_2` -\cgalModels `ConvexHullTraits_2` -\cgalModels `TriangulationTraits_2` -\cgalModels `DelaunayTriangulationTraits_2` -\cgalModels `ConstrainedTriangulationTraits_2` -\cgalModels `ConvexHullTraits_2` -\cgalModels `DelaunayMeshTraits_2` -\cgalModels `AnalyticWeightTraits_2` -\cgalModels `Barycentric_coordinates::BarycentricTraits_2` + required to build the dual Voronoi diagram.\n + `PolygonTraits_2`\n`ConvexHullTraits_2`\n`TriangulationTraits_2`\n`DelaunayTriangulationTraits_2`\n + `ConstrainedTriangulationTraits_2`\n`ConvexHullTraits_2`\n`DelaunayMeshTraits_2`\n`AnalyticWeightTraits_2`\n + `Barycentric_coordinates::BarycentricTraits_2`} \sa `CGAL::Projection_traits_3` */ diff --git a/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h b/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h index c153b0f9ee38..0e81f49852c0 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Ray_2.h @@ -7,7 +7,7 @@ An object `r` of the data type `Ray_2` is a directed straight ray in the two-dimensional Euclidean plane \f$ \E^2\f$. It starts in a point called the source of `r` and goes to infinity. -\cgalModels `Kernel::Ray_2` +\cgalModels{Kernel::Ray_2} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h b/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h index 86e6efce248a..49f66ae47cc7 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Ray_3.h @@ -7,7 +7,7 @@ An object `r` of the data type `Ray_3` is a directed straight ray in the three-dimensional Euclidean space \f$ \E^3\f$. It starts in a point called the source of `r` and it goes to infinity. -\cgalModels `Kernel::Ray_3` +\cgalModels{Kernel::Ray_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h b/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h index 71ae42573350..0e7bc381ab15 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Segment_2.h @@ -14,8 +14,7 @@ to compute the square of the length, because otherwise we had to perform a square root operation which is not defined for all number types, which is expensive, and may not be exact. -\cgalModels `Kernel::Segment_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Segment_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h b/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h index 36dcda524944..ffa862e7361f 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Segment_3.h @@ -14,8 +14,7 @@ to compute the square of the length, because otherwise we had to perform a square root operation which is not defined for all number types, which is expensive, and may not be exact. -\cgalModels `Kernel::Segment_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Segment_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Simple_cartesian.h b/Kernel_23/doc/Kernel_23/CGAL/Simple_cartesian.h index b84880de9919..11ee6050d50b 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Simple_cartesian.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Simple_cartesian.h @@ -14,7 +14,7 @@ type provided as a model for `FieldNumberType` is only an approximation of a field (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Implementation} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Simple_homogeneous.h b/Kernel_23/doc/Kernel_23/CGAL/Simple_homogeneous.h index 302e7c91b5c8..1dc5fa6395e1 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Simple_homogeneous.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Simple_homogeneous.h @@ -14,7 +14,7 @@ type provided as a model for `RingNumberType` is only an approximation of a ring (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `Kernel` +\cgalModels{Kernel} \cgalHeading{Implementation} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h b/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h index f8541de6dd30..2436276513e1 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Sphere_3.h @@ -11,8 +11,7 @@ positive side is to the left of the boundary. The boundary also splits \f$ \E^3\f$ into a bounded and an unbounded side. Note that the sphere can be degenerated, i.e.\ the squared radius may be zero. -\cgalModels `Kernel::Sphere_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Sphere_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h b/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h index 649a874e2423..37af105fefe9 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Tetrahedron_3.h @@ -17,7 +17,7 @@ a negative side. The boundary of a tetrahedron splits the space in two open regions, a bounded one and an unbounded one. -\cgalModels `Kernel::Tetrahedron_3` +\cgalModels{Kernel::Tetrahedron_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h b/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h index e19f43bc5226..9004381fb117 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Triangle_2.h @@ -13,7 +13,7 @@ boundary the negative side. The boundary of a triangle splits the plane in two open regions, a bounded one and an unbounded one. -\cgalModels `Kernel::Triangle_2` +\cgalModels{Kernel::Triangle_2} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h b/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h index d0dadad48b80..cc53d8ad29a4 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Triangle_3.h @@ -8,7 +8,7 @@ the three-dimensional Euclidean space \f$ \E^3\f$. As the triangle is not a full-dimensional object there is only a test whether a point lies on the triangle or not. -\cgalModels `Kernel::Triangle_3` +\cgalModels{Kernel::Triangle_3} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h index eaeab03a882a..e17775ba6f18 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h @@ -12,8 +12,7 @@ from \f$ p_1\f$ to \f$ p_2\f$. will explicitly state where you can pass this constant as an argument instead of a vector initialized with zeros. -\cgalModels `Kernel::Vector_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Vector_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h index d126bd977403..1e114bd44e3d 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_3.h @@ -12,8 +12,7 @@ from \f$ p_1\f$ to \f$ p_2\f$. will explicitly state where you can pass this constant as an argument instead of a vector initialized with zeros. -\cgalModels `Kernel::Vector_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::Vector_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} \sa `cross_product_grp` \sa `determinant_grp` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h index 01a147e6d645..fa67214d5a86 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_2.h @@ -13,8 +13,7 @@ to `NT`, and `Kernel::FT` is equal to `Quotient`. \sa `Point_2` -\cgalModels `Kernel::WeightedPoint_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::WeightedPoint_2,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h index 3dcb39e1786b..7765f44daa96 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Weighted_point_3.h @@ -13,8 +13,7 @@ to `NT`, and `Kernel::FT` is equal to `Quotient`. \sa `Point_3` -\cgalModels `Kernel::WeightedPoint_3` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels{Kernel::WeightedPoint_3,Hashable if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable`} */ template< typename Kernel > diff --git a/Kernel_d/doc/Kernel_d/CGAL/Cartesian_d.h b/Kernel_d/doc/Kernel_d/CGAL/Cartesian_d.h index c79c47380c4b..68b1d084db69 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Cartesian_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Cartesian_d.h @@ -14,7 +14,7 @@ type provided as a model for `FieldNumberType` is only an approximation of a field (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `KernelWithLifting_d` +\cgalModels{KernelWithLifting_d} \sa `CGAL::Homogeneous_d` diff --git a/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h b/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h index 4fcacb5b5841..8d8d24a048d1 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h @@ -43,11 +43,7 @@ concepts for the rest. -\cgalModels `Kernel_d` -\cgalModels `DelaunayTriangulationTraits` -\cgalModels `RegularTriangulationTraits` -\cgalModels `SearchTraits` -\cgalModels `RangeSearchTraits` +\cgalModels{Kernel_d,DelaunayTriangulationTraits,RegularTriangulationTraits,SearchTraits,RangeSearchTraits} \sa `CGAL::Cartesian_d` \sa `CGAL::Homogeneous_d` @@ -58,8 +54,7 @@ template< typename DimensionTag > struct Epeck_d { /*! represents a point in the Euclidean space -\cgalModels `DefaultConstructible` -\cgalModels `Assignable` +\cgalModels{DefaultConstructible,Assignable} */ class Point_d { public: @@ -87,8 +82,7 @@ Cartesian_const_iterator_d cartesian_end()const; /*! represents a weighted point in the Euclidean space -\cgalModels `DefaultConstructible` -\cgalModels `Assignable` +\cgalModels{DefaultConstructible,Assignable} */ class Weighted_point_d { public: @@ -100,7 +94,7 @@ Point_d point() const; double weight() const; }; -/*! \cgalModels `Kernel_d::Center_of_sphere_d` +/*! \cgalModels{Kernel_d::Center_of_sphere_d} */ class Construct_circumcenter_d { public: @@ -129,7 +123,7 @@ class Compute_squared_radius_smallest_orthogonal_sphere_d { template FT operator()(ForwardIterator first, ForwardIterator last); }; -/*! \cgalModels `Kernel_d::Side_of_bounded_sphere_d` +/*! \cgalModels{Kernel_d::Side_of_bounded_sphere_d} */ class Side_of_bounded_sphere_d { public: diff --git a/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h b/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h index 4d682670ebfb..b5e67064e9bc 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Epick_d.h @@ -32,11 +32,7 @@ concepts for the rest. -\cgalModels `Kernel_d` -\cgalModels `DelaunayTriangulationTraits` -\cgalModels `RegularTriangulationTraits` -\cgalModels `SearchTraits` -\cgalModels `RangeSearchTraits` +\cgalModels{Kernel_d,DelaunayTriangulationTraits,RegularTriangulationTraits,SearchTraits,RangeSearchTraits} \sa `CGAL::Cartesian_d` \sa `CGAL::Homogeneous_d` @@ -47,8 +43,7 @@ template< typename DimensionTag > struct Epick_d { /*! represents a point in the Euclidean space -\cgalModels `DefaultConstructible` -\cgalModels `Assignable` +\cgalModels{DefaultConstructible,Assignable} */ class Point_d { public: @@ -76,8 +71,7 @@ Cartesian_const_iterator_d cartesian_end()const; /*! represents a weighted point in the Euclidean space -\cgalModels `DefaultConstructible` -\cgalModels `Assignable` +\cgalModels{DefaultConstructible,Assignable} */ class Weighted_point_d { public: @@ -89,7 +83,7 @@ Point_d point() const; double weight() const; }; -/*! \cgalModels `Kernel_d::Center_of_sphere_d` +/*! \cgalModels{Kernel_d::Center_of_sphere_d} */ class Construct_circumcenter_d { public: @@ -118,7 +112,7 @@ class Compute_squared_radius_smallest_orthogonal_sphere_d { template FT operator()(ForwardIterator first, ForwardIterator last); }; -/*! \cgalModels `Kernel_d::Side_of_bounded_sphere_d` +/*! \cgalModels{Kernel_d::Side_of_bounded_sphere_d} */ class Side_of_bounded_sphere_d { public: diff --git a/Kernel_d/doc/Kernel_d/CGAL/Homogeneous_d.h b/Kernel_d/doc/Kernel_d/CGAL/Homogeneous_d.h index 423caffdf002..0b693eb1b028 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Homogeneous_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Homogeneous_d.h @@ -14,7 +14,7 @@ type provided as a model for `RingNumberType` is only an approximation of a ring (such as the built-in type `double`), then the geometry provided by the kernel is only an approximation of Euclidean geometry. -\cgalModels `KernelWithLifting_d` +\cgalModels{KernelWithLifting_d} \sa `CGAL::Cartesian_d` diff --git a/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraCd.h b/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraCd.h index 876daf9cc6c2..41bcb4863e2a 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraCd.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraCd.h @@ -8,7 +8,7 @@ The class `Linear_algebraCd` serves as the default traits class for the LA parameter of `CGAL::Cartesian_d`. It implements linear algebra for field number types `FT`. -\cgalModels `LinearAlgebraTraits_d` +\cgalModels{LinearAlgebraTraits_d} \tparam FT must be a field number type. diff --git a/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraHd.h b/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraHd.h index 37f58d46070f..d170a0bf8ff8 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraHd.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Linear_algebraHd.h @@ -8,7 +8,7 @@ The class `Linear_algebraHd` serves as the default traits class for the LA parameter of `CGAL::Homogeneous_d`. It implements linear algebra for Euclidean ring number types `RT`. -\cgalModels `LinearAlgebraTraits_d` +\cgalModels{LinearAlgebraTraits_d} To make a ring number type `RT` work with this class it has to provide a division `operator/` with remainder. diff --git a/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h b/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h index c951a0735efc..21b8551152d6 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h @@ -8,7 +8,7 @@ in `d` dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalModels `BidirectionalIterator` +\cgalModels{BidirectionalIterator} \sa `Kernel_d::ConstructCartesianConstIterator_d` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point.h index e16404861ca2..f653077d6b84 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Cell_attribute_with_point` represents an attribute containing a point and containing an information when `Info_` is different from `void`. This class can typically be used to associate a point to each 0-cell of a combinatorial or a generalized map. -\cgalModels `CellAttributeWithPoint` +\cgalModels{CellAttributeWithPoint} \tparam LCC a model of the `LinearCellComplex` concept. \tparam Info_ the type of the information contained in the attribute, `void` for no information. Equal to `void` by default. diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point_and_id.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point_and_id.h index 62dbacdd9821..bc8d24854c8e 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point_and_id.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Cell_attribute_with_point_and_id.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Cell_attribute_with_point_and_id` represents an attribute containing a point, containing an information when `Info_` is different from `void`, and having an id. This class can typically be used to associate a point with id to each 0-cell of a combinatorial or a generalized map. -\cgalModels `CellAttributeWithPoint` +\cgalModels{CellAttributeWithPoint} \tparam LCC a model of the `LinearCellComplex` concept. \tparam Info_ the type of the information contained in the attribute, `void` for no information. Equal to `void` by default. diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_combinatorial_map.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_combinatorial_map.h index e274cdc570b1..0c0e05764637 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_combinatorial_map.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_combinatorial_map.h @@ -7,8 +7,7 @@ namespace CGAL { The class `Linear_cell_complex_for_combinatorial_map` represents a linear cell complex in dimension `d`, in an ambient space of dimension `d2`, using a combinatorial map as underlying combinatorial data-structure. Like for `Combinatorial_map`, two versions exist: one where Darts and non void attributes are stored in memory using `Compact_container`, using `Alloc` as allocator, and use handles as descriptors; a second one where Darts and non void attributes are stored in an internal std::vector like data-structure, and use indices as descriptors. The choice between the two versions is done through the item class. -\cgalModels `LinearCellComplex` -\cgalModels `CombinatorialMap` +\cgalModels{LinearCellComplex,CombinatorialMap} \tparam d the dimension of the combinatorial map. \tparam d2 the dimension of the ambient space. Equal to `d` by default. diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_generalized_map.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_generalized_map.h index 2dd97d9298a2..bf105c68f2e9 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_generalized_map.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_for_generalized_map.h @@ -7,8 +7,7 @@ namespace CGAL { The class `Linear_cell_complex_for_generalized_map` represents a linear cell complex in dimension `d`, in an ambient space of dimension `d2`, using a generalized map as underlying combinatorial data-structure. Like for `GeneralizedMap`, two versions exist: one where Darts and non void attributes are stored in memory using `Compact_container`, using `Alloc` as allocator, and use handles as descriptors; a second one where Darts and non void attributes are stored in an internal std::vector like data-structure, and use indices as descriptors. The choice between the two versions is done through the item class. -\cgalModels `LinearCellComplex` -\cgalModels `GeneralizedMap` +\cgalModels{LinearCellComplex,GeneralizedMap} \tparam d the dimension of the generalized map. \tparam d2 the dimension of the ambient space. Equal to `d` by default. diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_min_items.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_min_items.h index a9b3bc0ade47..1e489d463ecc 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_min_items.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_min_items.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Linear_cell_complex_min_items` defines `void` as the information associated with darts, and the attributes used. In this class, 0-attributes are enabled and associated with `Cell_attribute_with_point`. -\cgalModels `LinearCellComplexItems` +\cgalModels{LinearCellComplexItems} \cgalHeading{Example} diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_traits.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_traits.h index e79db672469c..a1d413849814 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_traits.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/Linear_cell_complex_traits.h @@ -6,7 +6,7 @@ namespace CGAL { This geometric traits concept is used in the `Linear_cell_complex_for_combinatorial_map` and `Linear_cell_complex_for_generalized_map` classes. It can take as parameter any model of the concept `Kernel` (for example any \cgal kernel), and defines inner types and functors corresponding to the given dimension. -\cgalModels `LinearCellComplexTraits` +\cgalModels{LinearCellComplexTraits} \tparam d the dimension of the kernel, \tparam K a model of the concept `Kernel` if `d==2` or `d==3`; a model of the concept `Kernel_d` otherwise. Equal by default to `CGAL::Exact_predicates_inexact_constructions_kernel` if `d` is 2 or 3, and is `CGAL::Cartesian_d` otherwise. diff --git a/Matrix_search/doc/Matrix_search/CGAL/Dynamic_matrix.h b/Matrix_search/doc/Matrix_search/CGAL/Dynamic_matrix.h index 341f51327f9e..d1c9609cd29a 100644 --- a/Matrix_search/doc/Matrix_search/CGAL/Dynamic_matrix.h +++ b/Matrix_search/doc/Matrix_search/CGAL/Dynamic_matrix.h @@ -10,8 +10,7 @@ matrix search. \tparam M is a model of `BasicMatrix`. -\cgalModels `MonotoneMatrixSearchTraits` -\cgalModels `BasicMatrix` +\cgalModels{MonotoneMatrixSearchTraits,BasicMatrix} \sa `CGAL::monotone_matrix_search()` \sa `MonotoneMatrixSearchTraits` diff --git a/Matrix_search/doc/Matrix_search/CGAL/Sorted_matrix_search_traits_adaptor.h b/Matrix_search/doc/Matrix_search/CGAL/Sorted_matrix_search_traits_adaptor.h index 0a29ba6117cb..baaacc6af3b8 100644 --- a/Matrix_search/doc/Matrix_search/CGAL/Sorted_matrix_search_traits_adaptor.h +++ b/Matrix_search/doc/Matrix_search/CGAL/Sorted_matrix_search_traits_adaptor.h @@ -8,7 +8,7 @@ The class `Sorted_matrix_search_traits_adaptor` can be used as an adaptor to create sorted matrix search traits classes for arbitrary feasibility test and matrix classes `F` resp.\ `M`. -\cgalModels `SortedMatrixSearchTraits` +\cgalModels{SortedMatrixSearchTraits} \tparam M must be a model for `BasicMatrix` \tparam F must define a copy constructor and a monotone `bool operator()( const Value&)`. diff --git a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_criteria_2.h b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_criteria_2.h index 4d465b053f61..fb81215708f2 100644 --- a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_criteria_2.h +++ b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_criteria_2.h @@ -20,7 +20,7 @@ so \f$ B=\sqrt{2}\f$ corresponds to \f$ \alpha_{min} \ge 20.7\f$ degrees. \tparam CDT must be a 2D constrained Delaunay triangulation. -\cgalModels `MeshingCriteria_2` +\cgalModels{MeshingCriteria_2} */ diff --git a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_face_base_2.h b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_face_base_2.h index ac28360e1882..efebf4bef555 100644 --- a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_face_base_2.h +++ b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_face_base_2.h @@ -22,7 +22,7 @@ be the same as the one used for the Delaunay mesh. derives. It must be a model of the `ConstrainedTriangulationFaceBase_2` concept. -\cgalModels `DelaunayMeshFaceBase_2` +\cgalModels{DelaunayMeshFaceBase_2} */ template< typename Traits, typename Fb > diff --git a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_size_criteria_2.h b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_size_criteria_2.h index 6303b537ef8a..17be1408a9cd 100644 --- a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_size_criteria_2.h +++ b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_size_criteria_2.h @@ -23,7 +23,7 @@ triangles must be shorter than a bound \f$ S\f$. \tparam CDT must be a 2D constrained Delaunay triangulation. -\cgalModels `MeshingCriteria_2` +\cgalModels{MeshingCriteria_2} */ diff --git a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_vertex_base_2.h b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_vertex_base_2.h index bbaf9ea44181..be7a7e293942 100644 --- a/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_vertex_base_2.h +++ b/Mesh_2/doc/Mesh_2/CGAL/Delaunay_mesh_vertex_base_2.h @@ -17,7 +17,7 @@ be the same as the one used for the Delaunay mesh. \tparam Vb is the base class from which `Delaunay_mesh_vertex_base_2` derives. It must be a model of the `TriangulationVertexBase_2` concept. -\cgalModels `DelaunayMeshVertexBase_2` +\cgalModels{DelaunayMeshVertexBase_2} */ template< typename Traits, typename Vb > diff --git a/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h index 02428df510e9..eec0beb5a549 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Gray_image_mesh_domain_3.h @@ -41,7 +41,7 @@ with a model of the concept `BisectionGeometricTraits_3`. input file -\cgalModels `MeshDomain_3` +\cgalModels{MeshDomain_3} \sa `BisectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. diff --git a/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h index e2595b9d6fb9..853e8cbec4cd 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Implicit_mesh_domain_3.h @@ -41,7 +41,7 @@ when the query segment is smaller than the error bound. The `error_bound` passed as argument to the domain constructor is a relative error bound expressed as a ratio to the bounding sphere radius. -\cgalModels `MeshDomain_3` +\cgalModels{MeshDomain_3} \sa `BisectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. diff --git a/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h index 9109b74f1824..eba04731f1a4 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Labeled_image_mesh_domain_3.h @@ -34,7 +34,7 @@ intersection tests and intersection computations through a bisection method. This parameter must be instantiated with a model of the concept `BisectionGeometricTraits_3`. -\cgalModels `MeshDomain_3` +\cgalModels{MeshDomain_3} An executable that uses `Labeled_image_mesh_domain_3` must be linked with the CGAL_ImageIO library. diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h index bdba19131c8f..3819c65502b5 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Mesh_cell_criteria_3.h @@ -12,7 +12,7 @@ and a sizing field which may be a uniform or variable field. `Triangulation` of the instance used as model of `MeshComplex_3InTriangulation_3`. -\cgalModels `MeshCellCriteria_3` +\cgalModels{MeshCellCriteria_3} \sa `MeshCriteria_3` \sa `CGAL::Mesh_criteria_3` diff --git a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h index bfbd79dfe399..9e3720629dce 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Mesh_facet_criteria_3.h @@ -14,7 +14,7 @@ for the approximation error criterion. `Triangulation` of the instance used as model of `MeshComplex_3InTriangulation_3`. -\cgalModels `MeshFacetCriteria_3` +\cgalModels{MeshFacetCriteria_3} \sa `CGAL::Mesh_facet_topology` \sa `MeshCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h index a084e25bfcf8..de4489b7cd78 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_3.h @@ -24,7 +24,7 @@ the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. -\cgalModels `MeshDomain_3` +\cgalModels{MeshDomain_3} \sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. diff --git a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h index 8ee1140044cd..8951889d690c 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -20,7 +20,7 @@ and functors required to implement the intersection tests and intersection compu for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. -\cgalModels `MeshDomainWithFeatures_3` +\cgalModels{MeshDomainWithFeatures_3} \sa `CGAL::Mesh_domain_with_polyline_features_3` \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h b/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h index e72ee14e2865..dcdc0175f1d5 100644 --- a/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h +++ b/Mesh_3/doc/Mesh_3/CGAL/Triangle_accessor_3.h @@ -14,7 +14,7 @@ specialization of this class to handle one's own polyhedron data structure. \tparam K is the geometric traits class. -\cgalModels `TriangleAccessor_3` +\cgalModels{TriangleAccessor_3} \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h index d30acbcb141c..5dad6a137daf 100644 --- a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h @@ -724,7 +724,7 @@ belong. That parameter is only used by the rebind mechanism (see `::TriangulationDSCellBase_3::Rebind_TDS`). Users should always use the default parameter value `void`. -\cgalModels `MeshCellBase_3` +\cgalModels{MeshCellBase_3} \sa `CGAL::Mesh_complex_3_in_triangulation_3` \sa `CGAL::Mesh_cell_base_3` diff --git a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h index 50d211ccc1dc..bde7c96a2c38 100644 --- a/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Labeled_mesh_domain_3.h @@ -338,7 +338,7 @@ if there are several components to mesh. The function type can be any model of the concept `Callable` compatible with the signature `Subdomain_index(const Point_3&)`: it can be a function, a function object, a lambda expression... that takes a `%Point_3` as argument, and returns a type convertible to `Subdomain_index`. -\cgalModels `MeshDomain_3` +\cgalModels{MeshDomain_3} \sa `Implicit_multi_domain_to_labeling_function_wrapper` \sa `CGAL::make_mesh_3()`. diff --git a/Mesh_3/include/CGAL/Mesh_cell_base_3.h b/Mesh_3/include/CGAL/Mesh_cell_base_3.h index b52243fbbc2d..947c9a5d4f52 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_base_3.h @@ -117,7 +117,7 @@ of the concept `MeshDomain_3`. of the concept `RegularTriangulationCellBaseWithWeightedCircumcenter_3` and defaults to `Regular_triangulation_cell_base_with_weighted_circumcenter_3`. -\cgalModels `MeshCellBase_3` +\cgalModels{MeshCellBase_3} \sa `CGAL::Mesh_complex_3_in_triangulation_3` \sa `CGAL::Compact_mesh_cell_base_3` diff --git a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h index 68cb73899a8c..da317cfc29b5 100644 --- a/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h +++ b/Mesh_3/include/CGAL/Mesh_constant_domain_field_3.h @@ -44,7 +44,7 @@ namespace CGAL { * @tparam Index_ is the type of index of the vertices of the triangulation. * It must match the type `%Index` of the model of `MeshDomain_3` used in the meshing process. * -* @cgalModels `MeshDomainField_3` +* @cgalModels{MeshDomainField_3} */ template class Mesh_constant_domain_field_3 diff --git a/Mesh_3/include/CGAL/Mesh_criteria_3.h b/Mesh_3/include/CGAL/Mesh_criteria_3.h index a6220203a643..96511da5520c 100644 --- a/Mesh_3/include/CGAL/Mesh_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_criteria_3.h @@ -146,7 +146,7 @@ where `C3T3` is the model of `MeshComplex_3InTriangulation_3` used in the mesh generation process, and `C3T3::Triangulation` its nested triangulation type. -\cgalModels `MeshCriteria_3` and `MeshCriteriaWithFeatures_3` +\cgalModels{MeshCriteria_3,MeshCriteriaWithFeatures_3} \cgalHeading{Example} diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 00aa58d54cdd..4e7ebb4e515d 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -526,7 +526,7 @@ whose endpoints are the added corners. of the domain which should be extended. It has to be a model of the `MeshDomain_3` concept. -\cgalModels `MeshDomainWithFeatures_3` +\cgalModels{MeshDomainWithFeatures_3} \sa `MeshDomain_3` \sa `MeshPolyline_3` diff --git a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h index 8846555dc6b7..f85f3a82ec87 100644 --- a/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_edge_criteria_3.h @@ -91,7 +91,7 @@ namespace internal { The function object class `Mesh_edge_criteria_3` is a model of `MeshEdgeCriteria_3`. It provides a bound for the size criterion. -\cgalModels `MeshEdgeCriteria_3` +\cgalModels{MeshEdgeCriteria_3} \sa `MeshCriteria_3` \sa `CGAL::Mesh_criteria_3` diff --git a/Mesh_3/include/CGAL/Mesh_vertex_base_3.h b/Mesh_3/include/CGAL/Mesh_vertex_base_3.h index 1dbfac05a505..2cf97e4bdc1e 100644 --- a/Mesh_3/include/CGAL/Mesh_vertex_base_3.h +++ b/Mesh_3/include/CGAL/Mesh_vertex_base_3.h @@ -309,7 +309,7 @@ of the concept `MeshDomain_3`. of the concept `RegularTriangulationVertexBase_3` and defaults to `Regular_triangulation_vertex_base_3`. -\cgalModels `MeshVertexBase_3` +\cgalModels{MeshVertexBase_3} \sa `CGAL::Mesh_complex_3_in_triangulation_3` */ diff --git a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h index ce6de8775be8..e56b1cac8fb4 100644 --- a/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_complex_mesh_domain_3.h @@ -91,7 +91,7 @@ the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. -\cgalModels `MeshDomainWithFeatures_3` +\cgalModels{MeshDomainWithFeatures_3} \sa `IntersectionGeometricTraits_3` \sa `CGAL::make_mesh_3()`. diff --git a/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h b/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h index b3a0379c989e..98876732ded8 100644 --- a/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h +++ b/Mesh_3/include/CGAL/Sizing_field_with_aabb_tree.h @@ -59,7 +59,7 @@ namespace CGAL { * and derive from `CGAL::Polyhedral_mesh_domain_with_features_3` -* @cgalModels `MeshDomainField_3` +* @cgalModels{MeshDomainField_3} */ template `. -\cgalModels `PolygonConvexDecomposition_2` +\cgalModels{PolygonConvexDecomposition_2} \sa `CGAL::greene_approx_convex_partition_2()` @@ -47,7 +47,7 @@ optimal decomposition. \tparam Container must be a container that can be used for the polygon. It is by default `std::vector`. -\cgalModels `PolygonConvexDecomposition_2` +\cgalModels{PolygonConvexDecomposition_2} \sa `CGAL::approx_convex_partition_2()` @@ -77,7 +77,7 @@ the worst case, where \f$ n\f$ is the size of the input polygon. \tparam Container must be a container that can be used for the polygon. It is by default `std::vector`. -\cgalModels `PolygonConvexDecomposition_2` +\cgalModels{PolygonConvexDecomposition_2} \sa `CGAL::optimal_convex_partition_2()` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_nop_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_nop_decomposition_2.h index b2843d722dcd..7bace4bd09da 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_nop_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_nop_decomposition_2.h @@ -8,7 +8,7 @@ decomposition of a polygon, which merely passes the input polygon to the list of output convex polygons. It should be used when it is known that the input polygon is convex to start with. -\cgalModels `PolygonConvexDecomposition_2` +\cgalModels{PolygonConvexDecomposition_2} */ template diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_triangulation_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_triangulation_decomposition_2.h index 4dd0cf19ca07..a49e176adcf9 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_triangulation_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_triangulation_decomposition_2.h @@ -8,7 +8,7 @@ decomposition of a polygon or a polygon with holes into triangles using the Delaunay constrained triangulation functionality of the \ref Chapter_2D_Triangulations "2D Triangulation" package. -\cgalModels `PolygonWithHolesConvexDecomposition_2` +\cgalModels{PolygonWithHolesConvexDecomposition_2} */ template diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h index 132f04b2963f..a04aada17493 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Polygon_vertical_decomposition_2.h @@ -12,7 +12,7 @@ The algorithm operates in \f$ O(n \log n)\f$ time and takes \f$ O(n)\f$ space at the worst case, where \f$ n\f$ is the size of the input polygon. -\cgalModels `PolygonWithHolesConvexDecomposition_2` +\cgalModels{PolygonWithHolesConvexDecomposition_2} */ template diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h index 8688bbd2de93..09cc436f10c8 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/CGAL/Small_side_angle_bisector_decomposition_2.h @@ -15,7 +15,7 @@ the angle bisector of the reflex vertex. The algorithm operates in \f$ O(n^2)\f$ time and takes \f$ O(n)\f$ space at the worst case, where \f$ n\f$ is the size of the input polygon. -\cgalModels `PolygonConvexDecomposition_2` +\cgalModels{PolygonConvexDecomposition_2} */ template diff --git a/Miscellany/doc/Miscellany/CGAL/Handle_hash_function.h b/Miscellany/doc/Miscellany/CGAL/Handle_hash_function.h index 89f0849e8005..a02143d52318 100644 --- a/Miscellany/doc/Miscellany/CGAL/Handle_hash_function.h +++ b/Miscellany/doc/Miscellany/CGAL/Handle_hash_function.h @@ -10,7 +10,7 @@ functionality, such as handles, iterators, and circulators. Specifically, for a `key` value the expression `&*key` must return a unique address. -\cgalModels `UniqueHashFunction` +\cgalModels{UniqueHashFunction} \sa `CGAL::Unique_hash_map` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Modular_traits.h b/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Modular_traits.h index afc8672cc4b0..5814ee5e9676 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Modular_traits.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Modular_traits.h @@ -7,7 +7,7 @@ namespace CGAL { An instance of `Modular_traits` is a model of `ModularTraits`, where T is the associated type. -\cgalModels `ModularTraits` +\cgalModels{ModularTraits} */ template< typename T > diff --git a/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Residue.h b/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Residue.h index 706830fcc4fa..02011c98a2c5 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Residue.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/CGAL/Residue.h @@ -43,7 +43,7 @@ penalty. Hence, it may be advisable to configure \cgal with `CGAL_HAS_NO_THREADS`. See Section \ref Preliminaries_thread_safety "Thread Safety" in the preliminaries. -\cgalModels `Field` +\cgalModels{Field} */ diff --git a/Nef_2/doc/Nef_2/CGAL/Extended_cartesian.h b/Nef_2/doc/Nef_2/CGAL/Extended_cartesian.h index 4bb5cb0eaca5..4632460207d0 100644 --- a/Nef_2/doc/Nef_2/CGAL/Extended_cartesian.h +++ b/Nef_2/doc/Nef_2/CGAL/Extended_cartesian.h @@ -8,7 +8,7 @@ The class `Extended_cartesian` serves as a traits class for the class `Nef_polyhedron_2`. It uses a polynomial component representation based on a field number type `FT`. -\cgalModels `ExtendedKernelTraits_2` +\cgalModels{ExtendedKernelTraits_2} \tparam FT must be a model of `FieldNumberType`. diff --git a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h index ae3aec7f350b..bd26fea58ace 100644 --- a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h +++ b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h @@ -8,7 +8,7 @@ The class `Extended_homogeneous` serves as a traits class for the class `Nef_polyhedron_2`. It uses a polynomial component representation based on a Euclidean ring number type `RT`. -\cgalModels `ExtendedKernelTraits_2` +\cgalModels{ExtendedKernelTraits_2} \tparam RT must be a model of `RingNumberType`. diff --git a/Nef_2/doc/Nef_2/CGAL/Filtered_extended_homogeneous.h b/Nef_2/doc/Nef_2/CGAL/Filtered_extended_homogeneous.h index 63e3cda8e225..064f786c8b43 100644 --- a/Nef_2/doc/Nef_2/CGAL/Filtered_extended_homogeneous.h +++ b/Nef_2/doc/Nef_2/CGAL/Filtered_extended_homogeneous.h @@ -8,7 +8,7 @@ The class `Filtered_extended_homogeneous` serves as a traits class for the class `Nef_polyhedron_2`. It uses a polynomial component representation based on a ring number type `RT`. -\cgalModels `ExtendedKernelTraits_2` +\cgalModels{ExtendedKernelTraits_2} \tparam RT must be a model of `RingNumberType`. diff --git a/Number_types/doc/Number_types/CGAL/CORE_BigFloat.h b/Number_types/doc/Number_types/CGAL/CORE_BigFloat.h index 754985917d94..f6a7d5f1576f 100644 --- a/Number_types/doc/Number_types/CGAL/CORE_BigFloat.h +++ b/Number_types/doc/Number_types/CGAL/CORE_BigFloat.h @@ -14,9 +14,7 @@ This number type is provided by the \core library \cgalCite{klpy-clp-99}. \cgal defines the necessary functions so that this class complies to the requirements on number types. -\cgalModels `FieldWithKthRoot` -\cgalModels `RealEmbeddable` -\cgalModels `FromDoubleConstructible` +\cgalModels{FieldWithKthRoot,RealEmbeddable,FromDoubleConstructible} */ diff --git a/Number_types/doc/Number_types/CGAL/CORE_BigInt.h b/Number_types/doc/Number_types/CGAL/CORE_BigInt.h index 6e3f81effc15..2fcd05b6b7f3 100644 --- a/Number_types/doc/Number_types/CGAL/CORE_BigInt.h +++ b/Number_types/doc/Number_types/CGAL/CORE_BigInt.h @@ -12,8 +12,7 @@ This number type is provided by the \core library \cgalCite{klpy-clp-99}. \cgal defines the necessary functions so that this class complies to the requirements on number types. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} */ diff --git a/Number_types/doc/Number_types/CGAL/CORE_BigRat.h b/Number_types/doc/Number_types/CGAL/CORE_BigRat.h index 672adee91df9..12c57a6c30e5 100644 --- a/Number_types/doc/Number_types/CGAL/CORE_BigRat.h +++ b/Number_types/doc/Number_types/CGAL/CORE_BigRat.h @@ -10,10 +10,7 @@ This number type is provided by the \core library \cgalCite{klpy-clp-99}. \cgal defines the necessary functions so that this class complies to the requirements on number types. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` -\cgalModels `FromDoubleConstructible` +\cgalModels{Field,RealEmbeddable,Fraction,FromDoubleConstructible} */ diff --git a/Number_types/doc/Number_types/CGAL/CORE_Expr.h b/Number_types/doc/Number_types/CGAL/CORE_Expr.h index ac6805b89148..bbe851d5fc3a 100644 --- a/Number_types/doc/Number_types/CGAL/CORE_Expr.h +++ b/Number_types/doc/Number_types/CGAL/CORE_Expr.h @@ -13,9 +13,7 @@ This number type is provided by the \cgal defines the necessary functions so that this class complies to the requirements on number types. -\cgalModels `FieldWithRootOf` -\cgalModels `RealEmbeddable` -\cgalModels `FromDoubleConstructible` +\cgalModels{FieldWithRootOf,RealEmbeddable,FromDoubleConstructible} */ class Expr { diff --git a/Number_types/doc/Number_types/CGAL/Gmpfi.h b/Number_types/doc/Number_types/CGAL/Gmpfi.h index 3b54efc175fd..b48623b22129 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpfi.h +++ b/Number_types/doc/Number_types/CGAL/Gmpfi.h @@ -18,8 +18,7 @@ This type is `ImplicitInteroperable` with `Gmpfr`, `Gmpz`, `Gmpq`, long, unsigned long, int, double and long double. -\cgalModels `FieldWithKthRoot` -\cgalModels `RealEmbeddable` +\cgalModels{FieldWithKthRoot,RealEmbeddable} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/Gmpfr.h b/Number_types/doc/Number_types/CGAL/Gmpfr.h index c664a209f0f1..78ee816943f2 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpfr.h +++ b/Number_types/doc/Number_types/CGAL/Gmpfr.h @@ -23,8 +23,7 @@ used is `std::float_round_style`. This type is `ImplicitInteroperable` with `Gmpz`, long, unsigned long, int, double and long double. -\cgalModels `FieldWithKthRoot` -\cgalModels `RealEmbeddable` +\cgalModels{FieldWithKthRoot,RealEmbeddable} \cgalHeading{Comparisons} diff --git a/Number_types/doc/Number_types/CGAL/Gmpq.h b/Number_types/doc/Number_types/CGAL/Gmpq.h index c399e69e83d4..f885758460f7 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpq.h +++ b/Number_types/doc/Number_types/CGAL/Gmpq.h @@ -7,9 +7,7 @@ namespace CGAL { An object of the class `Gmpq` is an arbitrary precision rational number based on the \gmp library. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` +\cgalModels{Field,RealEmbeddable,Fraction} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/Gmpz.h b/Number_types/doc/Number_types/CGAL/Gmpz.h index 2eb6873a8373..b110329d7d3b 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpz.h +++ b/Number_types/doc/Number_types/CGAL/Gmpz.h @@ -7,8 +7,7 @@ namespace CGAL { An object of the class `Gmpz` is an arbitrary precision integer based on the \gmp Library. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/Gmpzf.h b/Number_types/doc/Number_types/CGAL/Gmpzf.h index fd0e02c87100..876bd37069fd 100644 --- a/Number_types/doc/Number_types/CGAL/Gmpzf.h +++ b/Number_types/doc/Number_types/CGAL/Gmpzf.h @@ -11,8 +11,7 @@ is of type `long`. This type can be considered exact, even if the exponent is not a multiple-precision number. This number type offers functionality very similar to `MP_Float` but is generally faster. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/Interval_nt.h b/Number_types/doc/Number_types/CGAL/Interval_nt.h index 97c5dd7a45c0..89dad6cced35 100644 --- a/Number_types/doc/Number_types/CGAL/Interval_nt.h +++ b/Number_types/doc/Number_types/CGAL/Interval_nt.h @@ -46,8 +46,7 @@ take care about setting the rounding mode towards plus infinity before doing any computations with the interval class. He can do so using the `Protect_FPU_rounding` class for example. -\cgalModels `FieldWithSqrt` -\cgalModels `RealEmbeddable` +\cgalModels{FieldWithSqrt,RealEmbeddable} \cgalHeading{Example} diff --git a/Number_types/doc/Number_types/CGAL/Lazy_exact_nt.h b/Number_types/doc/Number_types/CGAL/Lazy_exact_nt.h index 03b0097a9035..8d225da3b088 100644 --- a/Number_types/doc/Number_types/CGAL/Lazy_exact_nt.h +++ b/Number_types/doc/Number_types/CGAL/Lazy_exact_nt.h @@ -26,9 +26,8 @@ least model of concept `IntegralDomainWithoutDivision`. Note that some filtering mechanism is available at the predicate level using `Filtered_predicate` and `Filtered_kernel`. -\cgalModels `IntegralDomainWithoutDivision` same as `NT` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction`, if `NT` is a `Fraction` +\cgalModels{IntegralDomainWithoutDivision same as `NT`,RealEmbeddable, + Fraction, if `NT` is a `Fraction`} \cgalHeading{Example} diff --git a/Number_types/doc/Number_types/CGAL/MP_Float.h b/Number_types/doc/Number_types/CGAL/MP_Float.h index c5fd2d199398..6f3b097d71b6 100644 --- a/Number_types/doc/Number_types/CGAL/MP_Float.h +++ b/Number_types/doc/Number_types/CGAL/MP_Float.h @@ -18,8 +18,7 @@ limited by the available memory, the exponent is currently represented by a (integral valued) `double`, which can overflow in some circumstances. We plan to also have a multiprecision exponent to fix this issue. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/Mpzf.h b/Number_types/doc/Number_types/CGAL/Mpzf.h index 6844b33bdac5..0de6ce167cd4 100644 --- a/Number_types/doc/Number_types/CGAL/Mpzf.h +++ b/Number_types/doc/Number_types/CGAL/Mpzf.h @@ -14,8 +14,7 @@ normalized finite floating point number represents exactly that number. This number type offers functionality very similar to `MP_Float` and `Gmpzf` but is faster. -\cgalModels `IntegralDomainWithoutDivision` -\cgalModels `RealEmbeddable` +\cgalModels{IntegralDomainWithoutDivision,RealEmbeddable} \cgalHeading{Implementation} diff --git a/Number_types/doc/Number_types/CGAL/NT_converter.h b/Number_types/doc/Number_types/CGAL/NT_converter.h index 874d6b7f78ff..d0d649f6df33 100644 --- a/Number_types/doc/Number_types/CGAL/NT_converter.h +++ b/Number_types/doc/Number_types/CGAL/NT_converter.h @@ -5,7 +5,7 @@ namespace CGAL { A number type converter usable as default, for `Cartesian_converter` and `Homogeneous_converter`. -\cgalModels `AdaptableFunctor` +\cgalModels{AdaptableFunctor} */ template < class NT1, class NT2 > diff --git a/Number_types/doc/Number_types/CGAL/Number_type_checker.h b/Number_types/doc/Number_types/CGAL/Number_type_checker.h index 06002e878de8..b28eb4db2922 100644 --- a/Number_types/doc/Number_types/CGAL/Number_type_checker.h +++ b/Number_types/doc/Number_types/CGAL/Number_type_checker.h @@ -19,8 +19,7 @@ as first argument, and `NT2` as second. The `Comparator` parameter has a default value which is a functor calling `operator==` between the two arguments. -\cgalModels `IntegralDomainWithoutDivision` (same as `NT1`) -\cgalModels `RealEmbeddable` +\cgalModels{IntegralDomainWithoutDivision (same as `NT1`),RealEmbeddable} \cgalHeading{Operations} diff --git a/Number_types/doc/Number_types/CGAL/Quotient.h b/Number_types/doc/Number_types/CGAL/Quotient.h index f24d5b3b7d59..f32d724806f9 100644 --- a/Number_types/doc/Number_types/CGAL/Quotient.h +++ b/Number_types/doc/Number_types/CGAL/Quotient.h @@ -15,9 +15,7 @@ A `Quotient` `q` is represented as a pair of \tparam NT must be at least model of concept `IntegralDomainWithoutDivision` and a model of concept `RealEmbeddable`. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` +\cgalModels{Field,RealEmbeddable,Fraction} \cgalHeading{Operations} diff --git a/Number_types/doc/Number_types/CGAL/Sqrt_extension.h b/Number_types/doc/Number_types/CGAL/Sqrt_extension.h index a52f55780dc3..494da54aa4b9 100644 --- a/Number_types/doc/Number_types/CGAL/Sqrt_extension.h +++ b/Number_types/doc/Number_types/CGAL/Sqrt_extension.h @@ -87,14 +87,14 @@ The fourth template argument, `FilterPredicates`, triggers an internal filter th In case `NT` is not `RealEmbeddable`, `DifferentExtensionComparable` as well as `FilterPredicates` have no effect. -\cgalModels `Assignable` -\cgalModels `CopyConstructible` -\cgalModels `DefaultConstructible` -\cgalModels `EqualityComparable` -\cgalModels `ImplicitInteroperable` with `int` -\cgalModels `ImplicitInteroperable` with `NT` -\cgalModels `Fraction` if NT is a `Fraction` -\cgalModels `RootOf_2` +\cgalModelsBare{`Assignable`\n + `CopyConstructible`\n + `DefaultConstructible`\n + `EqualityComparable`\n + `ImplicitInteroperable` with `int`\n + `ImplicitInteroperable` with `NT`\n + `Fraction` if NT is a `Fraction`\n + `RootOf_2`} \sa `IntegralDomainWithoutDivision` \sa `IntegralDomain` diff --git a/Number_types/doc/Number_types/CGAL/double.h b/Number_types/doc/Number_types/CGAL/double.h index c38a596c0ccd..5c48d4332c84 100644 --- a/Number_types/doc/Number_types/CGAL/double.h +++ b/Number_types/doc/Number_types/CGAL/double.h @@ -7,8 +7,7 @@ type `double` is a model of the concepts `RealEmbeddable` and `Field`. Due to rounding errors and overflow `double` is considered as not exact. -\cgalModels `FieldWithSqrt` -\cgalModels `RealEmbeddable` +\cgalModels{FieldWithSqrt,RealEmbeddable} */ diff --git a/Number_types/doc/Number_types/CGAL/float.h b/Number_types/doc/Number_types/CGAL/float.h index 26028a3a46e4..84f782c4d82c 100644 --- a/Number_types/doc/Number_types/CGAL/float.h +++ b/Number_types/doc/Number_types/CGAL/float.h @@ -9,8 +9,7 @@ This header provides all necessary functions so the fundamental type `FieldWithSqrt`. Due to rounding errors and overflow `float` is considered as not exact. -\cgalModels `FieldWithSqrt` -\cgalModels `RealEmbeddable` +\cgalModels{FieldWithSqrt,RealEmbeddable} */ diff --git a/Number_types/doc/Number_types/CGAL/gmpxx.h b/Number_types/doc/Number_types/CGAL/gmpxx.h index 4d93317f45dd..b6c19f423289 100644 --- a/Number_types/doc/Number_types/CGAL/gmpxx.h +++ b/Number_types/doc/Number_types/CGAL/gmpxx.h @@ -9,9 +9,7 @@ provided by \gmp. CGAL provides the necessary functions to make it compliant to the number type concept. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` +\cgalModels{Field,RealEmbeddable,Fraction} See the \gmp documentation for additional details. @@ -31,8 +29,7 @@ provided by \gmp. CGAL provides the necessary functions to make it compliant to the number type concept. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} See the \gmp documentation for additional details. diff --git a/Number_types/doc/Number_types/CGAL/leda_bigfloat.h b/Number_types/doc/Number_types/CGAL/leda_bigfloat.h index 41c8e6b54252..8fbca4b8517b 100644 --- a/Number_types/doc/Number_types/CGAL/leda_bigfloat.h +++ b/Number_types/doc/Number_types/CGAL/leda_bigfloat.h @@ -12,9 +12,7 @@ Rounding mode and precision (i.e.\ mantissa length) of For more details on the number types of \leda we refer to the \leda manual \cgalCite{cgal:as-lum}. -\cgalModels `FieldWithKthRoot` -\cgalModels `RealEmbeddable` -\cgalModels `FromDoubleConstructible` +\cgalModels{FieldWithKthRoot,RealEmbeddable,FromDoubleConstructible} */ diff --git a/Number_types/doc/Number_types/CGAL/leda_integer.h b/Number_types/doc/Number_types/CGAL/leda_integer.h index f0f5de4602c6..ad7009c6fd23 100644 --- a/Number_types/doc/Number_types/CGAL/leda_integer.h +++ b/Number_types/doc/Number_types/CGAL/leda_integer.h @@ -8,8 +8,7 @@ The class `leda_integer` is a wrapper class that provides the functions needed to use the number type `leda::integer`, representing exact multiprecision integers provided by \leda. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} For more details on the number types of \leda we refer to the \leda manual \cgalCite{cgal:as-lum}. diff --git a/Number_types/doc/Number_types/CGAL/leda_rational.h b/Number_types/doc/Number_types/CGAL/leda_rational.h index 7c2add08b97d..8cfc60ea942b 100644 --- a/Number_types/doc/Number_types/CGAL/leda_rational.h +++ b/Number_types/doc/Number_types/CGAL/leda_rational.h @@ -7,10 +7,7 @@ The class `leda_rational` is a wrapper class that provides the functions needed to use the number type `rational`, representing exact multiprecision rational numbers provided by \leda. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` -\cgalModels `FromDoubleConstructible` +\cgalModels{Field,RealEmbeddable,Fraction,FromDoubleConstructible} For more details on the number types of \leda we refer to the \leda manual \cgalCite{cgal:as-lum}. */ diff --git a/Number_types/doc/Number_types/CGAL/leda_real.h b/Number_types/doc/Number_types/CGAL/leda_real.h index f13dfa7aa724..131ba0839e68 100644 --- a/Number_types/doc/Number_types/CGAL/leda_real.h +++ b/Number_types/doc/Number_types/CGAL/leda_real.h @@ -12,9 +12,7 @@ numbers that contains integers, and which is closed by the operations Operations and comparisons between objects of this type are guaranteed to be exact. -\cgalModels `FieldWithRootOf` -\cgalModels `RealEmbeddable` -\cgalModels `FromDoubleConstructible` +\cgalModels{FieldWithRootOf,RealEmbeddable,FromDoubleConstructible} For more details on the number types of \leda we refer to the \leda manual \cgalCite{cgal:as-lum}. diff --git a/Number_types/doc/Number_types/CGAL/long_long.h b/Number_types/doc/Number_types/CGAL/long_long.h index 750c18fdfa9d..be91260dc599 100644 --- a/Number_types/doc/Number_types/CGAL/long_long.h +++ b/Number_types/doc/Number_types/CGAL/long_long.h @@ -5,5 +5,4 @@ /// type `long long int` is an `RealEmbeddable` `EuclideanRing`. Due /// to overflow `long long int` is considered as not exact. /// -/// \cgalModels `EuclideanRing` -/// \cgalModels `RealEmbeddable` +/// \cgalModels{EuclideanRing,cgalModels RealEmbeddable} diff --git a/Number_types/doc/Number_types/CGAL/utils_classes.h b/Number_types/doc/Number_types/CGAL/utils_classes.h index 0e6ef4fc72c6..ac0a83c61914 100644 --- a/Number_types/doc/Number_types/CGAL/utils_classes.h +++ b/Number_types/doc/Number_types/CGAL/utils_classes.h @@ -11,7 +11,7 @@ For example, an expression like `NT(0)/NT(0)` can result in an invalid number. Routines may have as a precondition that all values are valid. -\cgalModels `AdaptableFunctor` +\cgalModels{AdaptableFunctor} */ template< typename T > @@ -43,7 +43,7 @@ The default value for `Less` is `std::less`. Note that `T` must be a model of `LessThanComparable` in case `std::less` is used. -\cgalModels `AdaptableFunctor` +\cgalModels{AdaptableFunctor} */ template< typename T, typename Less > @@ -90,7 +90,7 @@ The default value for `Less` is `std::less`. Note that `T` must be a model of `LessThanComparable` in case `std::less` is used. -\cgalModels `AdaptableFunctor` +\cgalModels{AdaptableFunctor} */ template< typename T, typename Less > diff --git a/Number_types/include/CGAL/Exact_algebraic.h b/Number_types/include/CGAL/Exact_algebraic.h index 4abdf5967846..8a911b0b102a 100644 --- a/Number_types/include/CGAL/Exact_algebraic.h +++ b/Number_types/include/CGAL/Exact_algebraic.h @@ -37,10 +37,7 @@ It is a typedef of another number type. Its exact definition depends on the availability the third-party libraries \core, and \leda. \cgal must be configured with at least one of those libraries. -\cgalModels `FieldWithSqrt` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` -\cgalModels `FromDoubleConstructible` +\cgalModels{FieldWithSqrt,RealEmbeddable,Fraction,FromDoubleConstructible} */ #if DOXYGEN_RUNNING diff --git a/Number_types/include/CGAL/Exact_integer.h b/Number_types/include/CGAL/Exact_integer.h index 3ba3fb9816a6..614045bbbae5 100644 --- a/Number_types/include/CGAL/Exact_integer.h +++ b/Number_types/include/CGAL/Exact_integer.h @@ -30,8 +30,7 @@ It is a typedef of another number type. Its exact definition depends on the availability the third-party libraries \gmp, \core, and \leda. \cgal must be configured with at least one of those libraries. -\cgalModels `EuclideanRing` -\cgalModels `RealEmbeddable` +\cgalModels{EuclideanRing,RealEmbeddable} */ #if DOXYGEN_RUNNING diff --git a/Number_types/include/CGAL/Exact_rational.h b/Number_types/include/CGAL/Exact_rational.h index f07c61d42a95..903b64b6518f 100644 --- a/Number_types/include/CGAL/Exact_rational.h +++ b/Number_types/include/CGAL/Exact_rational.h @@ -30,10 +30,7 @@ It is a typedef of another number type. Its exact definition depends on the availability the third-party libraries \gmp, \core, and \leda. \cgal must be configured with at least one of those libraries. -\cgalModels `Field` -\cgalModels `RealEmbeddable` -\cgalModels `Fraction` -\cgalModels `FromDoubleConstructible` +\cgalModels{Field,RealEmbeddable,Fraction,FromDoubleConstructible} */ #if DOXYGEN_RUNNING diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h index 01cd1df588cc..4ce23d3d00e5 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h @@ -36,7 +36,7 @@ namespace CGAL { /// /// \tparam K must be a model of `Kernel` /// -/// \cgalModels `OrientedBoundingBoxTraits_3` +/// \cgalModels{OrientedBoundingBoxTraits_3} /// template class Oriented_bounding_box_traits_3 diff --git a/Orthtree/include/CGAL/Orthtree/Node.h b/Orthtree/include/CGAL/Orthtree/Node.h index a16d2fff1928..777066a295d8 100644 --- a/Orthtree/include/CGAL/Orthtree/Node.h +++ b/Orthtree/include/CGAL/Orthtree/Node.h @@ -77,7 +77,7 @@ struct Node_access A `Node` is a lightweight object and thus generally passed by copy. It is also a model of `ConstRange` with value type `Traits::Point_d`. - \cgalModels `ConstRange` + \cgalModels{ConstRange} */ template class Orthtree::Node diff --git a/Orthtree/include/CGAL/Orthtree/Traversals.h b/Orthtree/include/CGAL/Orthtree/Traversals.h index 885af4f9b4d9..1ab9b77cceae 100644 --- a/Orthtree/include/CGAL/Orthtree/Traversals.h +++ b/Orthtree/include/CGAL/Orthtree/Traversals.h @@ -123,7 +123,7 @@ Node first_child_at_depth(Node n, std::size_t depth) { A preorder traversal starts from the root towards the leaves. - \cgalModels `OrthtreeTraversal` + \cgalModels{OrthtreeTraversal} */ struct Preorder_traversal { @@ -156,7 +156,7 @@ struct Preorder_traversal { A postorder traversal starts from the leaves towards the root. - \cgalModels `OrthtreeTraversal` + \cgalModels{OrthtreeTraversal} */ struct Postorder_traversal { @@ -184,7 +184,7 @@ struct Postorder_traversal { All non-leave nodes are ignored. - \cgalModels `OrthtreeTraversal` + \cgalModels{OrthtreeTraversal} */ struct Leaves_traversal { @@ -213,7 +213,7 @@ struct Leaves_traversal { All trees at another depth are ignored. If the selected depth is higher than the maximum depth of the orthtree, no node will be traversed. - \cgalModels `OrthtreeTraversal` + \cgalModels{OrthtreeTraversal} */ struct Level_traversal { diff --git a/Orthtree/include/CGAL/Orthtree_traits_2.h b/Orthtree/include/CGAL/Orthtree_traits_2.h index 0ef87d2ce6e7..b849ae450f5f 100644 --- a/Orthtree/include/CGAL/Orthtree_traits_2.h +++ b/Orthtree/include/CGAL/Orthtree_traits_2.h @@ -28,7 +28,7 @@ namespace CGAL \tparam GeomTraits model of `Kernel`. - \cgalModels `OrthtreeTraits` + \cgalModels{OrthtreeTraits} \sa `CGAL::Quadtree` \sa `CGAL::Orthtree_traits_3` \sa `CGAL::Orthtree_traits_d` diff --git a/Orthtree/include/CGAL/Orthtree_traits_3.h b/Orthtree/include/CGAL/Orthtree_traits_3.h index 7cfb0723b27b..c50028fb8f27 100644 --- a/Orthtree/include/CGAL/Orthtree_traits_3.h +++ b/Orthtree/include/CGAL/Orthtree_traits_3.h @@ -28,7 +28,7 @@ namespace CGAL \tparam GeomTraits model of `Kernel`. - \cgalModels `OrthtreeTraits` + \cgalModels{OrthtreeTraits} \sa `CGAL::Octree` \sa `CGAL::Orthtree_traits_2` \sa `CGAL::Orthtree_traits_d` diff --git a/Orthtree/include/CGAL/Orthtree_traits_d.h b/Orthtree/include/CGAL/Orthtree_traits_d.h index 5415487afeda..4f48caba07ff 100644 --- a/Orthtree/include/CGAL/Orthtree_traits_d.h +++ b/Orthtree/include/CGAL/Orthtree_traits_d.h @@ -28,7 +28,7 @@ namespace CGAL \tparam GeomTraits model of `Kernel`. \tparam DimensionTag specialization of `CGAL::Dimension_tag`. - \cgalModels `OrthtreeTraits` + \cgalModels{OrthtreeTraits} \sa `CGAL::Orthtree` \sa `CGAL::Orthtree_traits_2` \sa `CGAL::Orthtree_traits_3` diff --git a/Partition_2/doc/Partition_2/CGAL/Partition_is_valid_traits_2.h b/Partition_2/doc/Partition_2/CGAL/Partition_is_valid_traits_2.h index 9bf0e53abf01..d08e20e0a0a3 100644 --- a/Partition_2/doc/Partition_2/CGAL/Partition_is_valid_traits_2.h +++ b/Partition_2/doc/Partition_2/CGAL/Partition_is_valid_traits_2.h @@ -7,7 +7,7 @@ Class that derives a traits class for `partition_is_valid_2()` from a given traits class by defining the validity testing function object in terms of a supplied template parameter. -\cgalModels `PartitionIsValidTraits_2` +\cgalModels{PartitionIsValidTraits_2} \sa `CGAL::Is_convex_2` \sa `CGAL::Is_vacuously_valid` diff --git a/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h b/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h index 5fe96c198738..577eccd5d4f2 100644 --- a/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h +++ b/Partition_2/doc/Partition_2/CGAL/Partition_traits_2.h @@ -10,11 +10,7 @@ Traits class that can be used with all the \tparam R a representation class \tparam PointPropertyMap a property map that maps to points of type `R::Point_2` -\cgalModels `ConvexPartitionIsValidTraits_2` -\cgalModels `IsYMonotoneTraits_2` -\cgalModels `OptimalConvexPartitionTraits_2` -\cgalModels `PartitionTraits_2` -\cgalModels `YMonotonePartitionIsValidTraits_2` +\cgalModels{ConvexPartitionIsValidTraits_2,IsYMonotoneTraits_2,OptimalConvexPartitionTraits_2,PartitionTraits_2,YMonotonePartitionIsValidTraits_2} \sa `CGAL::approx_convex_partition_2()` \sa `CGAL::convex_partition_is_valid_2()` diff --git a/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h b/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h index 4cd55a933760..7ac8543cb2ee 100644 --- a/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h +++ b/Partition_2/doc/Partition_2/CGAL/polygon_function_objects.h @@ -6,7 +6,7 @@ namespace CGAL { Function object class for testing if a sequence of points represents a convex polygon or not. -\cgalModels `PolygonIsValid` +\cgalModels{PolygonIsValid} \sa `CGAL::convex_partition_is_valid_2()` \sa `CGAL::Partition_is_valid_traits_2` @@ -55,7 +55,7 @@ namespace CGAL { Function object class that indicates all sequences of points are valid. -\cgalModels `PolygonIsValid` +\cgalModels{PolygonIsValid} \sa `CGAL::partition_is_valid_2()` \sa `CGAL::Partition_is_valid_traits_2` @@ -103,7 +103,7 @@ namespace CGAL { Function object class that tests whether a sequence of points represents a \f$ y\f$-monotone polygon or not. -\cgalModels `PolygonIsValid` +\cgalModels{PolygonIsValid} \sa `CGAL::convex_partition_is_valid_2()` \sa `CGAL::Partition_is_valid_traits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_traits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_traits_2.h index 0f72f4c2b15f..30a16b19ab8a 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_traits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_Delaunay_triangulation_traits_2.h @@ -21,7 +21,7 @@ predicates. This holds implicitly for `CGAL::Exact_predicates_inexact_constructions_kernel`, as it is an instantiation of `CGAL::Filtered_kernel`. -\cgalModels `::Periodic_2DelaunayTriangulationTraits_2` +\cgalModels{::Periodic_2DelaunayTriangulationTraits_2} */ template< typename Traits, typename Periodic_2Offset_2 > class Periodic_2_Delaunay_triangulation_traits_2 diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h index af9757a095f8..2b5c9f6c097a 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_2.h @@ -210,7 +210,7 @@ class Periodic_2_triangulation_2 : public Triangulation_cw_ccw_2 The vertices and faces of the triangulations are accessed through `handles`, `iterators` and `circulators`. The handles are %CGAL - \ref models "models" of + models of the concept `Handle` which basically offers the two dereference operators and `->`. The iterators and circulators are all bidirectional and non-mutable. The circulators and iterators are diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_face_base_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_face_base_2.h index 2f2cc601cf16..5674d7086f5d 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_face_base_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_face_base_2.h @@ -29,7 +29,7 @@ the offset corresponding to vertex \f$ i\f$. The implementation of `has_zero_offsets()` results in checking whether all offsets are zero. -\cgalModels `::Periodic_2TriangulationFaceBase_2` +\cgalModels{::Periodic_2TriangulationFaceBase_2} \sa `CGAL::Triangulation_face_base_2` \sa `CGAL::Triangulation_face_base_with_info_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_traits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_traits_2.h index e14eab6d490a..b0bbb524f123 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_traits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_traits_2.h @@ -20,7 +20,7 @@ will be used if the flag `Traits::Has_static_filters` exists and is `true`. By default, this holds for `CGAL::Exact_predicates_inexact_constructions_kernel` and `CGAL::Exact_predicates_exact_constructions_kernel`. -\cgalModels `Periodic_2TriangulationTraits_2` +\cgalModels{Periodic_2TriangulationTraits_2} */ template< typename Traits, typename Periodic_2Offset_2 > diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_vertex_base_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_vertex_base_2.h index 6ead6620b64c..961222f05611 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_vertex_base_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/CGAL/Periodic_2_triangulation_vertex_base_2.h @@ -19,7 +19,7 @@ class to which the additional information for the periodic vertex is added and should be a model of `TriangulationDSVertexBase_2` -\cgalModels `Periodic_2TriangulationVertexBase_2` +\cgalModels{Periodic_2TriangulationVertexBase_2} \sa `CGAL::Periodic_2_triangulation_face_base_2` \sa `CGAL::Triangulation_vertex_base_2` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_traits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_traits_3.h index d5c6de09876c..c13dbfc5ee9c 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_traits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_Delaunay_triangulation_traits_3.h @@ -16,7 +16,7 @@ will be used if the flag `Traits::Has_static_filters` exists and is `true`. By default, this holds for `CGAL::Exact_predicates_inexact_constructions_kernel` and `CGAL::Exact_predicates_exact_constructions_kernel`. -\cgalModels `Periodic_3DelaunayTriangulationTraits_3` +\cgalModels{Periodic_3DelaunayTriangulationTraits_3} */ template< typename Traits, typename Offset > class Periodic_3_Delaunay_triangulation_traits_3 diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_offset_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_offset_3.h index 87f1a0c55529..da581a53cefa 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_offset_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_offset_3.h @@ -7,7 +7,7 @@ namespace CGAL { The class `Periodic_3_offset_3` is a model of the concept `Periodic_3Offset_3`. -\cgalModels `Periodic_3Offset_3` +\cgalModels{Periodic_3Offset_3} */ diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_traits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_traits_3.h index acfe43f7c325..0802beeee19f 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_traits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_regular_triangulation_traits_3.h @@ -15,7 +15,7 @@ and is `true`), this class automatically provides filtered predicates. By default, this holds for `CGAL::Exact_predicates_inexact_constructions_kernel` and `CGAL::Exact_predicates_exact_constructions_kernel`. -\cgalModels `Periodic_3RegularTriangulationTraits_3` +\cgalModels{Periodic_3RegularTriangulationTraits_3} */ template< typename Traits, typename Offset > class Periodic_3_regular_triangulation_traits_3 : diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_cell_base_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_cell_base_3.h index efb25f6c201a..58e3e90e2e3f 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_cell_base_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_cell_base_3.h @@ -9,7 +9,7 @@ the concept `Periodic_3TriangulationDSCellBase_3` to be used by `Triangulation_data_structure_3` to represent cells of a periodic triangulation. -\cgalModels `Periodic_3TriangulationDSCellBase_3` +\cgalModels{Periodic_3TriangulationDSCellBase_3} \sa `CGAL::Periodic_3_triangulation_ds_vertex_base_3` \sa `CGAL::Triangulation_cell_base_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h index a712381ffdaa..92c3fc05704e 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_ds_vertex_base_3.h @@ -9,7 +9,7 @@ of the concept `Periodic_3TriangulationDSVertexBase_3` to be used by `Triangulation_data_structure_3` to represent vertices of a periodic triangulation. -\cgalModels `Periodic_3TriangulationDSVertexBase_3` +\cgalModels{Periodic_3TriangulationDSVertexBase_3} \sa `CGAL::Periodic_3_triangulation_ds_cell_base_3` \sa `CGAL::Triangulation_vertex_base_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_traits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_traits_3.h index 815940b59114..5c62f8198577 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_traits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/CGAL/Periodic_3_triangulation_traits_3.h @@ -16,7 +16,7 @@ will be used if the flag `Traits::Has_static_filters` exists and is `true`. By default, this holds for `CGAL::Exact_predicates_inexact_constructions_kernel` and `CGAL::Exact_predicates_exact_constructions_kernel`. -\cgalModels `Periodic_3TriangulationTraits_3` +\cgalModels{Periodic_3TriangulationTraits_3} */ template< typename Traits, typename Offset > class Periodic_3_triangulation_traits_3 : public Traits { diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h index 4f15616d8fe0..489d75ef26f5 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h @@ -10,7 +10,7 @@ namespace CGAL The class `Periodic_4_hyperbolic_Delaunay_triangulation_traits_2` is the default traits class for the class `Periodic_4_hyperbolic_Delaunay_triangulation_2`. -\cgalModels `Periodic_4HyperbolicDelaunayTriangulationTraits_2` +\cgalModels{Periodic_4HyperbolicDelaunayTriangulationTraits_2} \sa `Periodic_4_hyperbolic_Delaunay_triangulation_2` */ diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_face_base_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_face_base_2.h index c21e673c91c4..3ddf15a4a75c 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_face_base_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_face_base_2.h @@ -21,7 +21,7 @@ concept `Periodic_4HyperbolicTriangulationFaceBase_2`. It accepts two template p data structure of a periodic hyperbolic triangulation, or used as a base class to derive other base vertex classes tuned for specific applications. -\cgalModels `Periodic_4HyperbolicTriangulationFaceBase_2` +\cgalModels{Periodic_4HyperbolicTriangulationFaceBase_2} \sa `Periodic_4_hyperbolic_triangulation_vertex_base_2` */ diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_vertex_base_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_vertex_base_2.h index 9d2804d744fe..44ddebfe5751 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_vertex_base_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/CGAL/Periodic_4_hyperbolic_triangulation_vertex_base_2.h @@ -21,7 +21,7 @@ concept `Periodic_4HyperbolicTriangulationVertexBase_2`. It accepts two template data structure of a periodic hyperbolic triangulation, or used as a base class to derive other base vertex classes tuned for specific applications. -\cgalModels `Periodic_4HyperbolicTriangulationVertexBase_2` +\cgalModels{Periodic_4HyperbolicTriangulationVertexBase_2} \sa `Periodic_4_hyperbolic_triangulation_face_base_2` */ diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index 70cd87aee043..62ef14a946fb 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -114,7 +114,7 @@ namespace internal { \tparam Point Point type \tparam Vector Normal vector type - \cgalModels `Range` + \cgalModels{Range} */ template diff --git a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h index 9c2c5885fece..68c71a271519 100644 --- a/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h +++ b/Poisson_surface_reconstruction_3/include/CGAL/Poisson_reconstruction_function.h @@ -145,7 +145,7 @@ Delaunay triangulation instead of an adaptive octree. \tparam Gt Geometric traits class. -\cgalModels `ImplicitFunction` +\cgalModels{ImplicitFunction} */ template diff --git a/Polygon/include/CGAL/General_polygon_with_holes_2.h b/Polygon/include/CGAL/General_polygon_with_holes_2.h index ae37e05eba9b..42173fc2ad6f 100644 --- a/Polygon/include/CGAL/General_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/General_polygon_with_holes_2.h @@ -34,7 +34,7 @@ namespace CGAL { * * \tparam Polygon_ must have input and output operators. * - * \cgalModels `GeneralPolygonWithHoles_2` + * \cgalModels{GeneralPolygonWithHoles_2} */ template class General_polygon_with_holes_2 { diff --git a/Polygon/include/CGAL/Polygon_with_holes_2.h b/Polygon/include/CGAL/Polygon_with_holes_2.h index 3e4eb83c0a91..e41104c943a9 100644 --- a/Polygon/include/CGAL/Polygon_with_holes_2.h +++ b/Polygon/include/CGAL/Polygon_with_holes_2.h @@ -33,7 +33,7 @@ types (`Kernel` and `Container`) that are used to instantiate the type `Polygon_2`. The latter is used to represents the outer boundary and the boundary of the holes (if any exist). -\cgalModels `GeneralPolygonWithHoles_2` +\cgalModels{GeneralPolygonWithHoles_2} */ template ` \sa `CGAL::Polyhedron_min_items_3` diff --git a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_min_items_3.h b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_min_items_3.h index d568e954d92b..37febfd3ac06 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_min_items_3.h +++ b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_min_items_3.h @@ -11,7 +11,7 @@ must provide the respective type for the point. Vertices and facets both do not contain a halfedge handle to an incident halfedge. -\cgalModels `PolyhedronItems_3` +\cgalModels{PolyhedronItems_3} \sa `CGAL::Polyhedron_3` \sa `CGAL::Polyhedron_items_3` diff --git a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_3.h b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_3.h index e1d675697689..f7e7442bdd53 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_3.h +++ b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_3.h @@ -10,7 +10,7 @@ in the polyhedral surface data structure `Polyhedron_3` in terms of the \cgal `Kernel`. It keeps a local copy of the kernel which makes it suitable for kernels with local state. -\cgalModels `PolyhedronTraits_3` +\cgalModels{PolyhedronTraits_3} \sa `CGAL::Polyhedron_traits_with_normals_3` diff --git a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_with_normals_3.h b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_with_normals_3.h index a049527067f9..98954d5ca2df 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_with_normals_3.h +++ b/Polyhedron/doc/Polyhedron/CGAL/Polyhedron_traits_with_normals_3.h @@ -12,7 +12,7 @@ normal vector from `Kernel` for the plane equation in facets. It keeps a local copy of the kernel which makes it suitable for kernels with local state. -\cgalModels `PolyhedronTraits_3` +\cgalModels{PolyhedronTraits_3} \sa `CGAL::Polyhedron_traits_3` diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h index fd1e9ccc0de8..8cfe6fa2a55c 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a cost function which calculates the cost as the square of the distance between the original and simplified polylines, /// possibly scaled based on a factor. /// -/// \cgalModels `PolylineSimplificationCostFunction`. +/// \cgalModels{PolylineSimplificationCostFunction.} template class Hybrid_squared_distance_cost { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h index 8a6977364610..d2b04efbcbea 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Scaled_squared_distance_cost.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a cost function which calculates the cost as a scaled variant of the square of the distance between the original and simplified polylines. /// -/// \cgalModels `PolylineSimplificationCostFunction` +/// \cgalModels{ PolylineSimplificationCostFunction} class Scaled_squared_distance_cost { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h index 4110a7718213..128327f64c7b 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h @@ -34,7 +34,7 @@ namespace Polyline_simplification_2 /// This class is a cost function which calculates the cost as the square of the distance between the original and simplified polylines. /// -/// \cgalModels `PolylineSimplificationCostFunction`. +/// \cgalModels{PolylineSimplificationCostFunction.} class Squared_distance_cost { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h index e1ab3d7fc012..ed886701afdb 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h @@ -28,7 +28,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the cost for /// simplifying a vertex is greater than a certain threshold. /// -/// \cgalModels `PolylineSimplificationStopPredicate`. +/// \cgalModels{PolylineSimplificationStopPredicate.} class Stop_above_cost_threshold { public : diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h index 2c98b695a209..9de0bb1888db 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the percentage /// of remaining vertices is smaller than a certain threshold. /// -/// \cgalModels `PolylineSimplificationStopPredicate`. +/// \cgalModels{PolylineSimplificationStopPredicate.} class Stop_below_count_ratio_threshold { public : diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h index 63e9ce6cc031..072b68166ae3 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the number of /// vertices is smaller than a certain threshold. /// -/// \cgalModels `PolylineSimplificationStopPredicate`. +/// \cgalModels{PolylineSimplificationStopPredicate.} class Stop_below_count_threshold { public : diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Vertex_base_2.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Vertex_base_2.h index d5f2856e239d..5b1d5c254630 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Vertex_base_2.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Vertex_base_2.h @@ -25,7 +25,7 @@ namespace Polyline_simplification_2 { /// A vertex base class with data members needed by the simplification algorithm. /// \tparam Vb must be a model of the concept `TriangulationVertexBase_2` -/// \cgalModels `PolylineSimplificationVertexBase_2`. +/// \cgalModels{PolylineSimplificationVertexBase_2} template > class Vertex_base_2 : public Vb diff --git a/Polynomial/doc/Polynomial/CGAL/Exponent_vector.h b/Polynomial/doc/Polynomial/CGAL/Exponent_vector.h index 77868373ab90..ff9105c68fbb 100644 --- a/Polynomial/doc/Polynomial/CGAL/Exponent_vector.h +++ b/Polynomial/doc/Polynomial/CGAL/Exponent_vector.h @@ -21,12 +21,7 @@ the lexicographic order starts the comparison at the last entry. This reflects the fact that the last entry corresponds to the outermost variable of a multivariate polynomial. -\cgalModels `RandomAccessContainer` -\cgalModels `DefaultConstructible` -\cgalModels `Assignable` -\cgalModels `CopyConstructible` -\cgalModels `EqualityComparable` -\cgalModels `LessThanComparable` +\cgalModels{RandomAccessContainer,DefaultConstructible,Assignable,CopyConstructible,EqualityComparable,LessThanComparable} \sa `Polynomial_d` \sa `PolynomialTraits_d` diff --git a/Polynomial/doc/Polynomial/CGAL/Polynomial.h b/Polynomial/doc/Polynomial/CGAL/Polynomial.h index 15c657b628de..77d9235aa0e1 100644 --- a/Polynomial/doc/Polynomial/CGAL/Polynomial.h +++ b/Polynomial/doc/Polynomial/CGAL/Polynomial.h @@ -53,16 +53,16 @@ the coefficient sequence does not contain leading zero coefficients (where leading means at the high-degree end), with the exception that the zero polynomial is represented by a single zero coefficient. -\cgalModels `Polynomial_d` -\cgalModels `Assignable` -\cgalModels `CopyConstructible` -\cgalModels `DefaultConstructible` -\cgalModels `EqualityComparable` -\cgalModels `ImplicitInteroperable` with int -\cgalModels `ImplicitInteroperable` with Coeff -\cgalModels `Fraction` if Coeff is model of `Fraction` -\cgalModels `LessThanComparable` if Coeff is model of `LessThanComparable` -\cgalModels `Modularizable` if `Coeff` is model of `Modularizable` +\cgalModelsBare{`Polynomial_d`\n + `Assignable`\n + `CopyConstructible`\n + `DefaultConstructible`\n + `EqualityComparable`\n + `ImplicitInteroperable` with int\n + `ImplicitInteroperable` with Coeff\n + `Fraction` if Coeff is model of `Fraction`\n + `LessThanComparable` if Coeff is model of `LessThanComparable`\n + `Modularizable` if `Coeff` is model of `Modularizable`} */ template< typename Coeff > class Polynomial { diff --git a/Polynomial/doc/Polynomial/CGAL/Polynomial_traits_d.h b/Polynomial/doc/Polynomial/CGAL/Polynomial_traits_d.h index 08bd67675a09..1ca6805a8163 100644 --- a/Polynomial/doc/Polynomial/CGAL/Polynomial_traits_d.h +++ b/Polynomial/doc/Polynomial/CGAL/Polynomial_traits_d.h @@ -6,7 +6,7 @@ namespace CGAL { A model of concept `PolynomialTraits_d` -\cgalModels `PolynomialTraits_d` +\cgalModels{PolynomialTraits_d} */ template< typename Polynomial_d > diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h index cd0d661178b7..b5e189e51ce1 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_2.h @@ -12,7 +12,7 @@ optimisation algorithms using the two-dimensional \cgal kernel. \tparam ET NT must be models for `RingNumberType`. Their default is `K::RT`. -\cgalModels `PolytopeDistanceDTraits` +\cgalModels{PolytopeDistanceDTraits} \sa `CGAL::Polytope_distance_d` \sa `CGAL::Polytope_distance_d_traits_3` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h index ab873c594a57..207b4a8bd7ba 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_3.h @@ -13,7 +13,7 @@ optimisation algorithms using the three-dimensional \cgal kernel. \tparam ET NT must be models for `RingNumberType`. Their default is `K::RT`. -\cgalModels `PolytopeDistanceDTraits` +\cgalModels{PolytopeDistanceDTraits} \sa `CGAL::Polytope_distance_d` \sa `CGAL::Polytope_distance_d_traits_2` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h index 536d2e43b33c..37ad80ae56b1 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Polytope_distance_d_traits_d.h @@ -13,7 +13,7 @@ optimisation algorithms using the \f$ d\f$-dimensional \cgal kernel. \tparam ET NT must be models for `RingNumberType`. Their default is `K::RT`. -\cgalModels `PolytopeDistanceDTraits` +\cgalModels{PolytopeDistanceDTraits} \sa `CGAL::Polytope_distance_d` \sa `CGAL::Polytope_distance_d_traits_2` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_default_traits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_default_traits_3.h index 508bad703bb5..7fa7e77385c6 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_default_traits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/CGAL/Width_default_traits_3.h @@ -9,7 +9,7 @@ using the three-dimensional \cgal kernel. \tparam K must be a model for `Kernel`. -\cgalModels `WidthTraits_3` +\cgalModels{WidthTraits_3} \sa `CGAL::Width_3` \sa `WidthTraits_3` diff --git a/Property_map/include/CGAL/property_map.h b/Property_map/include/CGAL/property_map.h index 12fd06503fee..735c1f5da494 100644 --- a/Property_map/include/CGAL/property_map.h +++ b/Property_map/include/CGAL/property_map.h @@ -102,7 +102,7 @@ make_OR_property_map(const PM1& pm1, const PM2& pm2) /// Property map that accesses a value from an iterator /// -/// \cgalModels `ReadablePropertyMap` +/// \cgalModels{ReadablePropertyMap} /// /// \tparam InputIterator an input iterator /// \endcond @@ -287,7 +287,7 @@ make_compose_property_map(const KeyMap& km, const ValueMap& vm) /// Property map that converts a `T*` pointer (or in general an iterator /// over `T` elements) to the `T` object. /// -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} template struct Dereference_property_map : public boost::put_get_helper::reference, Dereference_property_map > @@ -319,7 +319,7 @@ make_dereference_property_map(Iter) /// A `LvaluePropertyMap` property map mapping a key to itself (by reference). /// It is mutable if `T` is not `const` and non-mutable otherwise. /// -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} template struct Identity_property_map { @@ -385,7 +385,7 @@ Identity_property_map /// \ingroup PkgPropertyMapRef /// Property map that accesses the first item of a `std::pair`. /// \tparam Pair Instance of `std::pair`. -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} /// /// \sa `CGAL::Second_of_pair_property_map` template @@ -425,7 +425,7 @@ First_of_pair_property_map /// /// \tparam Pair Instance of `std::pair`. /// -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} /// /// \sa `CGAL::First_of_pair_property_map` template @@ -466,7 +466,7 @@ Second_of_pair_property_map /// \tparam N %Index of the item to access. /// \tparam Tuple Instance of `boost::tuple` or `std::tuple`. /// -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} template struct Nth_of_tuple_property_map { @@ -611,7 +611,7 @@ make_property_map(const std::vector& v) /// Note that this value is chosen when the map is constructed and cannot /// be changed afterwards. Specifically, the free function `put()` does nothing. /// -/// \cgalModels `ReadWritePropertyMap` +/// \cgalModels{ReadWritePropertyMap} template struct Constant_property_map { @@ -640,7 +640,7 @@ struct Constant_property_map /// return `true` if the key is inside the set and `false` otherwise. The `put` /// function will insert an element in the set if `true` is passed and erase it /// otherwise. -/// \cgalModels `ReadWritePropertyMap` +/// \cgalModels{ReadWritePropertyMap} template struct Boolean_property_map { @@ -688,7 +688,7 @@ make_boolean_property_map(Set& set_) /// a geometric object of the same type as `GeomObject` but possibly from /// another kernel. /// Conversions between the two geometric objects are done using `Cartesian_converter`. -/// \cgalModels `ReadWritePropertyMap` +/// \cgalModels{ReadWritePropertyMap} template struct Cartesian_converter_property_map { @@ -726,7 +726,7 @@ make_cartesian_converter_property_map(Vpm vpm) /// \ingroup PkgPropertyMapRef /// A property map with `std::size_t` as key-type that can be used /// to access the i'th element in a container with random access. -/// \cgalModels `LvaluePropertyMap`, constness being than of `Container`. +/// \cgalModels{LvaluePropertyMap constness being than of `Container`.} template class Random_access_property_map { diff --git a/QP_solver/doc/QP_solver/CGAL/QP_models.h b/QP_solver/doc/QP_solver/CGAL/QP_models.h index 892d00279476..bfb7416a6025 100644 --- a/QP_solver/doc/QP_solver/CGAL/QP_models.h +++ b/QP_solver/doc/QP_solver/CGAL/QP_models.h @@ -42,8 +42,7 @@ namespace CGAL { some container; an instance of the class `Const_oneset_iterator`, constructed from the value in question, does the job more efficiently. - \cgalModels `QuadraticProgram` - \cgalModels `LinearProgram` + \cgalModels{QuadraticProgram,LinearProgram} \cgalHeading{Example} @@ -296,10 +295,7 @@ make_quadratic_program_from_iterators ( some container; an instance of the class `Const_oneset_iterator`, constructed from the value in question, does the job more efficiently. - \cgalModels `QuadraticProgram` - \cgalModels `LinearProgram` - \cgalModels `NonnegativeQuadraticProgram` - \cgalModels `NonnegativeLinearProgram` + \cgalModels{QuadraticProgram,LinearProgram,NonnegativeQuadraticProgram,NonnegativeLinearProgram} \cgalHeading{Example} @@ -378,8 +374,7 @@ class Nonnegative_linear_program_from_iterators { some container; an instance of the class `Const_oneset_iterator`, constructed from the value in question, does the job more efficiently. - \cgalModels `QuadraticProgram` - \cgalModels `NonnegativeQuadraticProgram` + \cgalModels{QuadraticProgram,NonnegativeQuadraticProgram} \cgalHeading{Example} @@ -467,7 +462,7 @@ class Nonnegative_quadratic_program_from_iterators { some container; an instance of the class `Const_oneset_iterator`, constructed from the value in question, does the job more efficiently. - \cgalModels `QuadraticProgram` + \cgalModels{QuadraticProgram} \cgalHeading{Example} @@ -560,10 +555,7 @@ class Quadratic_program_from_iterators { into type `NT`. The constructed program can be further manipulated by using the set-methods below. - \cgalModels `QuadraticProgram` - \cgalModels `LinearProgram` - \cgalModels `NonnegativeQuadraticProgram` - \cgalModels `NonnegativeLinearProgram` + \cgalModels{QuadraticProgram,LinearProgram,NonnegativeQuadraticProgram,NonnegativeLinearProgram} \cgalHeading{Example} @@ -771,10 +763,7 @@ namespace CGAL { If you want to read a quadratic program in `MPSFormat` from a stream, please use the model `Quadratic_program_from_mps`. - \cgalModels `QuadraticProgram` - \cgalModels `LinearProgram` - \cgalModels `NonnegativeQuadraticProgram` - \cgalModels `NonnegativeLinearProgram` + \cgalModels{QuadraticProgram,LinearProgram,NonnegativeQuadraticProgram,NonnegativeLinearProgram} \cgalHeading{Example} 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 643de3ff7da8..0a5c70bfa601 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 @@ -170,7 +170,7 @@ namespace CGAL { if the domain used for mesh generation does not include 0 and 1-dimensionnal features (i.e is only a model of the concept `MeshDomain_3`). - \cgalModels `MeshComplexWithFeatures_3InTriangulation_3` + \cgalModels{MeshComplexWithFeatures_3InTriangulation_3} \sa \link make_mesh_3() `CGAL::make_mesh_3()`\endlink \sa \link refine_mesh_3() `CGAL::refine_mesh_3()`\endlink diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h index ee49f5722364..0001e33ed678 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h @@ -363,7 +363,7 @@ assigned to a non surface facet. It must match the `Surface_patch_index` of the model of the `MeshDomain_3` concept when used for mesh generation. -\cgalModels `SimplicialMeshCellBase_3` +\cgalModels{SimplicialMeshCellBase_3} \sa `CGAL::Mesh_complex_3_in_triangulation_3` \sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index 3f1a9c92d428..35127d01405d 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -36,7 +36,7 @@ namespace CGAL { //Class Simplicial_mesh_vertex_3 //Adds information to Vb about the localization of the vertex in regards //to the 3D input complex. -//\cgalModels `SimplicialMeshVertexBase_3` +//\cgalModels{SimplicialMeshVertexBase_3} template`. -\cgalModels `SimplicialMeshVertexBase_3` +\cgalModels{SimplicialMeshVertexBase_3} \sa `CGAL::Mesh_complex_3_in_triangulation_3` \sa \link Mesh_vertex_base_3 `CGAL::Mesh_vertex_base_3`\endlink diff --git a/STL_Extension/doc/STL_Extension/CGAL/Complexity_tags.h b/STL_Extension/doc/STL_Extension/CGAL/Complexity_tags.h index 2c54537b8a4f..3f39efc663bd 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Complexity_tags.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Complexity_tags.h @@ -13,8 +13,7 @@ For example, passing `Location_policy` as parameter to -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Location_policy` \sa `Fast` @@ -45,8 +44,7 @@ more memory usage. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Location_policy` \sa `Compact` diff --git a/STL_Extension/doc/STL_Extension/CGAL/Default.h b/STL_Extension/doc/STL_Extension/CGAL/Default.h index 4f58c260c365..4fcb285014e0 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Default.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Default.h @@ -26,8 +26,7 @@ same when instantiating it using `Default` instead of the type of the default argument, even though their interfaces will otherwise be the same. This may have consequences in some cases. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} In order to help the template class writer, `Default` provides a convenient way to extract the desired type for a template parameter which may be defaulted diff --git a/STL_Extension/doc/STL_Extension/CGAL/Location_policy.h b/STL_Extension/doc/STL_Extension/CGAL/Location_policy.h index 799cb42dc3b6..ae8e77ff775b 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Location_policy.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Location_policy.h @@ -51,8 +51,7 @@ For example, passing `Location_policy` as parameter to `Tag` can only be either `Fast` or `Compact` currently. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Compact` \sa `Fast` diff --git a/STL_Extension/doc/STL_Extension/CGAL/Spatial_lock_grid_3.h b/STL_Extension/doc/STL_Extension/CGAL/Spatial_lock_grid_3.h index 2d9b53b10483..02e5305d4e64 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/Spatial_lock_grid_3.h +++ b/STL_Extension/doc/STL_Extension/CGAL/Spatial_lock_grid_3.h @@ -26,7 +26,7 @@ block (spin) if the thread owning the lock has a lower \"ID\" (each thread is given an arbitrary ID) or return immediately otherwise. It uses atomics to perform lock operations. -\cgalModels `SurjectiveLockDataStructure` +\cgalModels{SurjectiveLockDataStructure} */ template diff --git a/STL_Extension/doc/STL_Extension/CGAL/function_objects.h b/STL_Extension/doc/STL_Extension/CGAL/function_objects.h index 36f7ba21155d..29749667ac93 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/function_objects.h +++ b/STL_Extension/doc/STL_Extension/CGAL/function_objects.h @@ -13,7 +13,7 @@ its argument. -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1021,7 +1021,7 @@ The class `Dereference` dereferences a pointer -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Value > @@ -1091,7 +1091,7 @@ The class `Get_address` gets the address of an lvalue -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1161,7 +1161,7 @@ on `Value`. -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Value > @@ -1230,7 +1230,7 @@ The class `Project_facet` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Node > @@ -1299,7 +1299,7 @@ The class `Project_next` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1368,7 +1368,7 @@ The class `Project_next_opposite` calls the member functions -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Node > @@ -1438,7 +1438,7 @@ The class `Project_normal` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1509,7 +1509,7 @@ The class `Project_opposite_prev` calls the member functions -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1580,7 +1580,7 @@ The class `Project_plane` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ @@ -1651,7 +1651,7 @@ The class `Project_point` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Node > @@ -1721,7 +1721,7 @@ The class `Project_prev` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Node > @@ -1791,7 +1791,7 @@ The class `Project_vertex` calls the member function -\cgalModels `ProjectionObject` +\cgalModels{ProjectionObject} */ template< typename Node > diff --git a/STL_Extension/doc/STL_Extension/CGAL/iterator.h b/STL_Extension/doc/STL_Extension/CGAL/iterator.h index fdc82bb1ffda..2de6a6031cc5 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/iterator.h +++ b/STL_Extension/doc/STL_Extension/CGAL/iterator.h @@ -12,7 +12,7 @@ specific object of type `T`. -\cgalModels `RandomAccessIterator` +\cgalModels{RandomAccessIterator} \sa `CGAL::Emptyset_iterator` \sa `CGAL::Oneset_iterator` @@ -54,7 +54,7 @@ from input iterators. -\cgalModels `InputIterator` +\cgalModels{InputIterator} \cgalHeading{Requirements} @@ -116,7 +116,7 @@ must be a subset of the parameters of `V`. Should the \tparam V must be a `std::tuple<...>` of the types of values to be accepted and dispatched. \tparam O must be a `std::tuple<...>` of the types of corresponding output iterators. -\cgalModels `OutputIterator` +\cgalModels{OutputIterator} \cgalExample{STL_Extension/Dispatch_output_iterator.cpp} @@ -206,7 +206,7 @@ can be a list of arbitrary types. \tparam V must be a `std::tuple<...>` of the types of values to be accepted and dispatched. \tparam O must be a `std::tuple<...>` of the types of corresponding output iterators. -\cgalModels `OutputIterator` +\cgalModels{OutputIterator} \sa `CGAL::Dispatch_or_drop_output_iterator` */ @@ -285,7 +285,7 @@ think of it as being connected to /dev/null. -\cgalModels `OutputIterator` +\cgalModels{OutputIterator} \sa `CGAL::Oneset_iterator` \sa `CGAL::Const_oneset_iterator` @@ -395,7 +395,7 @@ to `std::insert_iterator`, but differs in that it calls the `insert()` function of the container without the iterator additional argument. -\cgalModels `OutputIterator` +\cgalModels{OutputIterator} \tparam Container provides a member function `insert(const Container::const_reference&)`. @@ -536,7 +536,7 @@ object. -\cgalModels `InputIterator` +\cgalModels{InputIterator} \sa `CGAL::Creator_1` @@ -595,7 +595,7 @@ The class `Join_input_iterator_2` joins two iterators. The result is again an it iterator category type as the original iterator) that reads an object from the stream and applies a function object to that object. -\cgalModels `InputIterator` +\cgalModels{InputIterator} */ @@ -646,7 +646,7 @@ The class `Join_input_iterator_3` joins three iterators. The result is again an iterator category type as the original iterator) that reads an object from the stream and applies a function object to that object. -\cgalModels `InputIterator` +\cgalModels{InputIterator} */ @@ -740,7 +740,7 @@ pointer to the referred object. -\cgalModels `BidirectionalIterator` +\cgalModels{BidirectionalIterator} \sa `CGAL::Emptyset_iterator` \sa `CGAL::Const_oneset_iterator` diff --git a/STL_Extension/doc/STL_Extension/CGAL/tags.h b/STL_Extension/doc/STL_Extension/CGAL/tags.h index 7a085e194be7..91b0ca5532d7 100644 --- a/STL_Extension/doc/STL_Extension/CGAL/tags.h +++ b/STL_Extension/doc/STL_Extension/CGAL/tags.h @@ -58,7 +58,7 @@ typedef CGAL::Boolean_tag Tag_true; \ingroup PkgSTLExtensionUtilities Class indicating the absence of a functor. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `AlgebraicStructureTraits` \sa `RealEmbeddableTraits` @@ -93,7 +93,7 @@ struct Parallel_if_available_tag {}; General tag indicating that non of any other possible tags is valid. -\cgalModels `DefaultConstructible` +\cgalModels{DefaultConstructible} \sa `AlgebraicStructureTraits` diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h index 35e133c39012..37e4644e5296 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h @@ -33,7 +33,7 @@ namespace Scale_space_reconstruction_3 * with the possibility of using an upper bound on the length of the * produced facets. * - * \cgalModels CGAL::Scale_space_reconstruction_3::Mesher + * \cgalModels{CGAL::Scale_space_reconstruction_3::Mesher} * * \tparam Geom_traits geometric traits class. It must be a * model of `DelaunayTriangulationTraits_3`. It must have a diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Alpha_shape_mesher.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Alpha_shape_mesher.h index 2a55578de06d..d0f393c08217 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Alpha_shape_mesher.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Alpha_shape_mesher.h @@ -47,7 +47,7 @@ namespace Scale_space_reconstruction_3 * component of the surface where connected facets are locally oriented * towards the same side of the surface. * - * \cgalModels CGAL::Scale_space_reconstruction_3::Mesher + * \cgalModels{CGAL::Scale_space_reconstruction_3::Mesher} * * \tparam Geom_traits is the geometric traits class. It must be a * model of `DelaunayTriangulationTraits_3`. It must have a diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Jet_smoother.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Jet_smoother.h index cf34380ca1b9..40c28918831d 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Jet_smoother.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Jet_smoother.h @@ -32,7 +32,7 @@ namespace Scale_space_reconstruction_3 * %Smoother for scale space reconstruction based on * `CGAL::jet_smooth_point_set()`. * - * \cgalModels CGAL::Scale_space_reconstruction_3::Smoother + * \cgalModels{CGAL::Scale_space_reconstruction_3::Smoother} * * \tparam Geom_traits geometric traits class. It must be a * model of `DelaunayTriangulationTraits_3`. It must have a diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h index af9cda15c2d2..648b8480886c 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h @@ -41,7 +41,7 @@ namespace Scale_space_reconstruction_3 * %Smoother for scale space reconstruction based on a principal * component analysis weighted by the local density of points. * - * \cgalModels CGAL::Scale_space_reconstruction_3::Smoother + * \cgalModels{CGAL::Scale_space_reconstruction_3::Smoother} * * \tparam Geom_traits geometric traits class. It must be a * model of `DelaunayTriangulationTraits_3`. It must have a diff --git a/SearchStructures/doc/SearchStructures/CGAL/Range_segment_tree_traits.h b/SearchStructures/doc/SearchStructures/CGAL/Range_segment_tree_traits.h index 81615c89fcdf..bee9d44eb495 100644 --- a/SearchStructures/doc/SearchStructures/CGAL/Range_segment_tree_traits.h +++ b/SearchStructures/doc/SearchStructures/CGAL/Range_segment_tree_traits.h @@ -8,7 +8,7 @@ The class `Range_segment_tree_set_traits_2` is a range and segment tree traits c 2-dimensional point class from the \cgal kernel. The class is parameterized with a representation class `R`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R > @@ -42,7 +42,7 @@ The class `Range_segment_tree_set_traits_3` is a range and segment tree traits c point class from the \cgal kernel. The class is parameterized with a representation class `R`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R > @@ -78,7 +78,7 @@ type `T` is associated to each key. The class is parameterized with a representation class `R` and the type of the associated data `T`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R, typename T > @@ -114,7 +114,7 @@ type `T` is associated to each key. The class is parameterized with a representation class `R` and the type of the associated data `T`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R, typename T > @@ -150,7 +150,7 @@ type `T` is associated to each interval. The class is parameterized with a representation class `R` and the type of the associated data `T`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R, typename T > @@ -186,7 +186,7 @@ type `T` is associated to each interval. The class is parameterized with a representation class `R` and the type of the associated data `T`. -\cgalModels `RangeSegmentTreeTraits_k` +\cgalModels{RangeSegmentTreeTraits_k} */ template< typename R, typename T > diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_2.h index 6fb02a67ddfc..49440d6654b3 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_2.h @@ -35,7 +35,7 @@ A segment Delaunay graph can be seen as a container of faces and vertices. Therefore the `Segment_Delaunay_graph_2` class provides several iterators and circulators that allow to traverse it (completely or partially). -\cgalModels `DelaunayGraph_2` +\cgalModels{DelaunayGraph_2} \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_face_base_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_face_base_2.h index 69fc93cf421a..9b60ce9d21dd 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_face_base_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_face_base_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgSegmentDelaunayGraph2Ref -\cgalModels `SegmentDelaunayGraphFaceBase_2` +\cgalModels{SegmentDelaunayGraphFaceBase_2} The class `Segment_Delaunay_graph_face_base_2` provides a model for the `SegmentDelaunayGraphFaceBase_2` concept which is the face diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_filtered_traits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_filtered_traits_2.h index 00be59b9a757..58690b0e0254 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_filtered_traits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_filtered_traits_2.h @@ -53,10 +53,7 @@ The default values for the template parameters are as follows:
  • If the \gmp package is installed with \cgal, the template parameter `EK` has the default value: `EK = Simple_cartesian`, otherwise its default value is `EK = Simple_cartesian >`. -\cgalModels `SegmentDelaunayGraphTraits_2` -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` -\cgalModels `Assignable` +\cgalModels{SegmentDelaunayGraphTraits_2,DefaultConstructible,CopyConstructible,Assignable} \sa `SegmentDelaunayGraphTraits_2` \sa `CGAL::Field_tag` @@ -211,10 +208,7 @@ default value is `EK = CGAL::Simple_cartesian`. -\cgalModels `SegmentDelaunayGraphTraits_2` -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` -\cgalModels `Assignable` +\cgalModels{SegmentDelaunayGraphTraits_2,DefaultConstructible,CopyConstructible,Assignable} \sa `Kernel` \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_2.h index c1ef0bcc9fcb..a933bb886e56 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_2.h @@ -68,9 +68,7 @@ The `Segment_Delaunay_graph_hierarchy_2` class derives publicly from the the same with its base class. In the sequel only additional types and methods defined are documented. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` -\cgalModels `Assignable` +\cgalModels{DefaultConstructible,CopyConstructible,Assignable} \sa `CGAL::Segment_Delaunay_graph_2` \sa `CGAL::Triangulation_data_structure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_vertex_base_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_vertex_base_2.h index 5ac99ae6de25..ed0cdbecfdff 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_vertex_base_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_hierarchy_vertex_base_2.h @@ -11,7 +11,7 @@ vertex base required by the \tparam Vbb must be a model of the `SegmentDelaunayGraphVertexBase_2` concept. -\cgalModels `SegmentDelaunayGraphHierarchyVertexBase_2` +\cgalModels{SegmentDelaunayGraphHierarchyVertexBase_2} \sa `SegmentDelaunayGraphVertexBase_2` \sa `SegmentDelaunayGraphHierarchyVertexBase_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_site_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_site_2.h index f55c92b636fb..e088f5126137 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_site_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_site_2.h @@ -8,7 +8,7 @@ The class `Segment_Delaunay_graph_site_2` is a model for the concept `SegmentDelaunayGraphSite_2`. \tparam K must be a model of the `Kernel` concept. -\cgalModels `SegmentDelaunayGraphSite_2` +\cgalModels{SegmentDelaunayGraphSite_2} \sa `Kernel` \sa `SegmentDelaunayGraphSite_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_2.h index 596717be5cc0..89417cb3cccf 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_2.h @@ -9,7 +9,7 @@ The class `Segment_Delaunay_graph_storage_site_2` is a model for the concept \tparam Gt must be a model of the `SegmentDelaunayGraphStorageTraits_2` concept. -\cgalModels `SegmentDelaunayGraphStorageSite_2` +\cgalModels{SegmentDelaunayGraphStorageSite_2} \sa `CGAL::Segment_Delaunay_graph_site_2` */ diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_with_info_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_with_info_2.h index fc8180ff3d80..695207b9e0d6 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_with_info_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_site_with_info_2.h @@ -10,7 +10,7 @@ The class `Segment_Delaunay_graph_storage_site_with_info_2` is a model for the c \tparam STraits must be a model of the `SegmentDelaunayGraphStorageTraits_2` concept. \tparam Base must be a model of `SegmentDelaunayGraphStorageSite_2` -\cgalModels `SegmentDelaunayGraphStorageSite_2` +\cgalModels{SegmentDelaunayGraphStorageSite_2} \sa `CGAL::Segment_Delaunay_graph_site_2` */ diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_2.h index 8fb333abcc0f..7666eaa9584a 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_2.h @@ -15,7 +15,7 @@ See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more informati \tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. -\cgalModels `SegmentDelaunayGraphStorageTraits_2` +\cgalModels{SegmentDelaunayGraphStorageTraits_2} \sa `CGAL::Segment_Delaunay_graph_hierarchy_2` \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_with_info_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_with_info_2.h index 49dd92c5160e..854464d684ef 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_with_info_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_storage_traits_with_info_2.h @@ -9,7 +9,7 @@ The class `Segment_Delaunay_graph_storage_traits_with_info_2` provides a model f \tparam Gt must be a model of the concept `SegmentDelaunayGraphTraits_2`. -\cgalModels `SegmentDelaunayGraphStorageTraits_2` +\cgalModels{SegmentDelaunayGraphStorageTraits_2} \sa `CGAL::Segment_Delaunay_graph_storage_site_with_info_2` */ diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_traits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_traits_2.h index 1dead711c355..a8daa3fd2603 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_traits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_traits_2.h @@ -22,7 +22,7 @@ The way the predicates are evaluated is discussed in \cgalCite{b-ecvdl-96} and \cgalCite{cgal:k-reisv-04} (the geometric filtering part). -\cgalModels `SegmentDelaunayGraphTraits_2` +\cgalModels{SegmentDelaunayGraphTraits_2} \sa `Kernel` \sa `SegmentDelaunayGraphTraits_2` @@ -95,7 +95,7 @@ The way the predicates are evaluated is discussed in \cgalCite{b-ecvdl-96} and \cgalCite{cgal:k-reisv-04} (the geometric filtering part). -\cgalModels `SegmentDelaunayGraphTraits_2` +\cgalModels{SegmentDelaunayGraphTraits_2} \sa `Kernel` \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_vertex_base_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_vertex_base_2.h index b925fa57dd9b..9881285b4136 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_vertex_base_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/CGAL/Segment_Delaunay_graph_vertex_base_2.h @@ -4,7 +4,7 @@ namespace CGAL { /*! \ingroup PkgSegmentDelaunayGraph2Ref -\cgalModels `SegmentDelaunayGraphVertexBase_2` +\cgalModels{SegmentDelaunayGraphVertexBase_2} The class `Segment_Delaunay_graph_vertex_base_2` provides a model for the `SegmentDelaunayGraphVertexBase_2` concept which is the vertex diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_2.h index 39ff240f8ace..10e32d641890 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_2.h @@ -19,7 +19,7 @@ which must be a model of `SegmentDelaunayGraphDataStructure_2`. `DS` defaults to `CGAL::Triangulation_data_structure_2< CGAL::Segment_Delaunay_graph_vertex_base_2, CGAL::Triangulation_face_base_2 >`. -\cgalModels `DelaunayGraph_2` +\cgalModels{DelaunayGraph_2} \sa `SegmentDelaunayGraphLinfTraits_2` \sa `SegmentDelaunayGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h index a72aa365f48e..7ebee962afee 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h @@ -16,7 +16,7 @@ value for CK is CGAL::Simple_cartesian (see also the examples in the user manual). -\cgalModels `SegmentDelaunayGraphLinfTraits_2` +\cgalModels{SegmentDelaunayGraphLinfTraits_2} \sa `CGAL::Segment_Delaunay_graph_filtered_traits_2` \sa `CGAL::Segment_Delaunay_graph_Linf_2` @@ -49,7 +49,7 @@ value for CK is CGAL::Simple_cartesian (see also the examples in the user manual). -\cgalModels `SegmentDelaunayGraphLinfTraits_2` +\cgalModels{SegmentDelaunayGraphLinfTraits_2} \sa `CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_2` diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_traits_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_traits_2.h index e5c0d0c526a9..e459b1f3be7f 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_traits_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/CGAL/Segment_Delaunay_graph_Linf_traits_2.h @@ -18,7 +18,7 @@ reasonable and valid values of the template parameters and should be preferred over `Segment_Delaunay_graph_Linf_traits_2`. -\cgalModels `SegmentDelaunayGraphLinfTraits_2` +\cgalModels{SegmentDelaunayGraphLinfTraits_2} \sa `CGAL::Segment_Delaunay_graph_traits_2` \sa `CGAL::Segment_Delaunay_graph_Linf_2` @@ -53,7 +53,7 @@ reasonable and valid values of the template parameters and should be preferred over `Segment_Delaunay_graph_Linf_traits_without_intersections_2`. -\cgalModels `SegmentDelaunayGraphLinfTraits_2` +\cgalModels{SegmentDelaunayGraphLinfTraits_2} \sa `CGAL::Segment_Delaunay_graph_traits_without_intersections_2` \sa `CGAL::Segment_Delaunay_graph_2` diff --git a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC_traits.h b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC_traits.h index da8c37139901..37df7a5bcc04 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC_traits.h +++ b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC_traits.h @@ -23,7 +23,7 @@ namespace CGAL { \ingroup PkgShapeDetectionRANSAC \brief %Default traits class for the `CGAL::Shape_detection::Efficient_RANSAC`. - \cgalModels `EfficientRANSACTraits` + \cgalModels{EfficientRANSACTraits} \tparam Gt must be a model of the concept `Kernel` with `Gt::FT` being `float` or `double`. diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/K_neighbor_query.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/K_neighbor_query.h index 87feb7a2bd73..9366ebaa6a60 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/K_neighbor_query.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/K_neighbor_query.h @@ -49,7 +49,7 @@ namespace Point_set { a model of `ReadablePropertyMap` whose key type is the value type of the input range and value type is `Kernel::Point_2` or `Kernel::Point_3` - \cgalModels `NeighborQuery` + \cgalModels{NeighborQuery} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_circle_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_circle_fit_region.h index f3199cdcb7e6..15c5d39e13c7 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_circle_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_circle_fit_region.h @@ -48,7 +48,7 @@ namespace Point_set { \tparam NormalMap a model of `ReadablePropertyMap` whose key type is `Item` and value type is `Kernel::Vector_2` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_cylinder_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_cylinder_fit_region.h index 110cf55972dd..12543ef500f8 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_cylinder_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_cylinder_fit_region.h @@ -48,7 +48,7 @@ namespace Point_set { \tparam NormalMap a model of `ReadablePropertyMap` whose key type is `Item` and value type is `Kernel::Vector_3` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_line_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_line_fit_region.h index 8111ac2f599c..d61ecad6b1d6 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_line_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_line_fit_region.h @@ -50,7 +50,7 @@ namespace Point_set { a model of `ReadablePropertyMap` whose key type is the value type of the input range and value type is `Kernel::Vector_2` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_region.h index 601f5f5748d5..912114e693ae 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_plane_fit_region.h @@ -51,7 +51,7 @@ namespace Point_set { range and value type is `Kernel::Vector_3` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_sphere_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_sphere_fit_region.h index 4661f2ea132a..55b935c357ed 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_sphere_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Least_squares_sphere_fit_region.h @@ -50,7 +50,7 @@ namespace Point_set { a model of `ReadablePropertyMap` whose key type is the value type of the input range and value type is `Kernel::Vector_3` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Sphere_neighbor_query.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Sphere_neighbor_query.h index e36658c45b55..3230b3b097a0 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Sphere_neighbor_query.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Point_set/Sphere_neighbor_query.h @@ -48,7 +48,7 @@ namespace Point_set { \tparam PointMap a model of `ReadablePropertyMap` whose key type is `Item_` and value type is `GeomTraits::Point_2` or `GeomTraits::Point_3` - \cgalModels `NeighborQuery` + \cgalModels{NeighborQuery} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h index 74fa797fee41..61e157c8745a 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Least_squares_plane_fit_region.h @@ -45,7 +45,7 @@ namespace Polygon_mesh { a model of `ReadablePropertyMap` whose key type is the vertex type of a polygon mesh and value type is `Kernel::Point_3` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/One_ring_neighbor_query.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/One_ring_neighbor_query.h index 635d23d5fecd..71df088e9a07 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/One_ring_neighbor_query.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/One_ring_neighbor_query.h @@ -38,7 +38,7 @@ namespace Polygon_mesh { a model of `ConstRange` whose iterator type is `RandomAccessIterator` and value type is the face type of a polygon mesh - \cgalModels `NeighborQuery` + \cgalModels{NeighborQuery} */ template class One_ring_neighbor_query diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Polyline_graph.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Polyline_graph.h index 3c4fb0e823c7..6354362e7737 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Polyline_graph.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Polygon_mesh/Polyline_graph.h @@ -38,7 +38,7 @@ namespace Polygon_mesh { a model of `ReadablePropertyMap` whose key type is the vertex type of a polygon mesh and value type is `Point_3` from a \cgal %Kernel - \cgalModels `NeighborQuery` + \cgalModels{NeighborQuery} */ template< typename PolygonMesh, diff --git a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Segment_set/Least_squares_line_fit_region.h b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Segment_set/Least_squares_line_fit_region.h index 1ba03dfcb59e..702cbaa0fb95 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Region_growing/Segment_set/Least_squares_line_fit_region.h +++ b/Shape_detection/include/CGAL/Shape_detection/Region_growing/Segment_set/Least_squares_line_fit_region.h @@ -47,7 +47,7 @@ namespace Segment_set { a model of `ReadablePropertyMap` whose key type is `Item` and value type is `Kernel::Segment_2` or `Kernel::Segment_3` - \cgalModels `RegionType` + \cgalModels{RegionType} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Contours/Longest_direction_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Contours/Longest_direction_2.h index 199417f31b18..55a6d51ac50d 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Contours/Longest_direction_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Contours/Longest_direction_2.h @@ -42,7 +42,7 @@ namespace Contours { range and value type is `GeomTraits::Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `ContourDirections` + \cgalModels{ContourDirections} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Contours/Multiple_directions_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Contours/Multiple_directions_2.h index 6d0ac4dca6f2..0a5dda273406 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Contours/Multiple_directions_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Contours/Multiple_directions_2.h @@ -48,7 +48,7 @@ namespace Contours { range and value type is `GeomTraits::Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `ContourDirections` + \cgalModels{ContourDirections} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Contours/User_defined_directions_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Contours/User_defined_directions_2.h index 442efbe56a7f..c1fe8a8d90a3 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Contours/User_defined_directions_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Contours/User_defined_directions_2.h @@ -42,7 +42,7 @@ namespace Contours { range and value type is `GeomTraits::Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `ContourDirections` + \cgalModels{ContourDirections} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Angle_regularization_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Angle_regularization_2.h index 4413dd3c1333..f45f4a24f1c6 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Angle_regularization_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Angle_regularization_2.h @@ -46,7 +46,7 @@ namespace Segments { range and value type is `GeomTraits::Segment_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `RegularizationType` + \cgalModels{RegularizationType} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Delaunay_neighbor_query_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Delaunay_neighbor_query_2.h index ef31b4089656..501997d16f17 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Delaunay_neighbor_query_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Delaunay_neighbor_query_2.h @@ -52,7 +52,7 @@ namespace Segments { and value type is `GeomTraits::Segment_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `NeighborQuery` + \cgalModels{NeighborQuery} */ template< typename GeomTraits, diff --git a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Offset_regularization_2.h b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Offset_regularization_2.h index 0ea5e7e15234..597a101bcbe8 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/Segments/Offset_regularization_2.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/Segments/Offset_regularization_2.h @@ -51,7 +51,7 @@ namespace Segments { and value type is `GeomTraits::Segment_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `RegularizationType` + \cgalModels{RegularizationType} */ template< typename GeomTraits, diff --git a/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_3.h b/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_3.h index 6268dc5925b6..cb1fe0066a11 100644 --- a/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_3.h @@ -12,7 +12,7 @@ The template argument must be a model of the concept to construct a regular triangulation of the weighted points and for point location in the mixed complex. -\cgalModels `SkinSurface_3` +\cgalModels{SkinSurface_3} */ template< typename SkinSurfaceTraits_3 > diff --git a/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_traits_3.h b/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_traits_3.h index 9ce736e258ec..ca183bc617f6 100644 --- a/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_traits_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/CGAL/Skin_surface_traits_3.h @@ -10,7 +10,7 @@ the `SkinSurfaceTraits_3`. \tparam K must be a model of the `Kernel` concept. -\cgalModels `SkinSurfaceTraits_3` +\cgalModels{SkinSurfaceTraits_3} */ template< typename K > diff --git a/Skin_surface_3/doc/Skin_surface_3/CGAL/Union_of_balls_3.h b/Skin_surface_3/doc/Skin_surface_3/CGAL/Union_of_balls_3.h index 697490f6a9dc..6c6ec8239c70 100644 --- a/Skin_surface_3/doc/Skin_surface_3/CGAL/Union_of_balls_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/CGAL/Union_of_balls_3.h @@ -14,7 +14,7 @@ The template argument must be a model of the concept predicates to construct a regular triangulation of the weighted points. -\cgalModels `SkinSurface_3` +\cgalModels{SkinSurface_3} */ template< typename SkinSurfaceTraits_3 > diff --git a/Snap_rounding_2/doc/Snap_rounding_2/CGAL/Snap_rounding_traits_2.h b/Snap_rounding_2/doc/Snap_rounding_2/CGAL/Snap_rounding_traits_2.h index 584dbdea0582..2a54841c21a8 100644 --- a/Snap_rounding_2/doc/Snap_rounding_2/CGAL/Snap_rounding_traits_2.h +++ b/Snap_rounding_2/doc/Snap_rounding_2/CGAL/Snap_rounding_traits_2.h @@ -27,7 +27,7 @@ coordinate, the resulting ISR, may be imprecise, and the distance between some vertex and a non-incident edge can be slightly less than the guaranteed half-the width-of-a-pixel. -\cgalModels `SnapRoundingTraits_2` +\cgalModels{SnapRoundingTraits_2} */ template< typename Kernel > diff --git a/Solver_interface/include/CGAL/Default_diagonalize_traits.h b/Solver_interface/include/CGAL/Default_diagonalize_traits.h index 930dd681ce28..fcf8fd941c86 100644 --- a/Solver_interface/include/CGAL/Default_diagonalize_traits.h +++ b/Solver_interface/include/CGAL/Default_diagonalize_traits.h @@ -30,7 +30,7 @@ namespace CGAL { /// \tparam FT Number type /// \tparam dim Dimension of the matrices and vectors /// -/// \cgalModels `DiagonalizeTraits` +/// \cgalModels{DiagonalizeTraits} template class Default_diagonalize_traits { diff --git a/Solver_interface/include/CGAL/Diagonalize_traits.h b/Solver_interface/include/CGAL/Diagonalize_traits.h index c4754bed5e9e..ee8e25b949b4 100644 --- a/Solver_interface/include/CGAL/Diagonalize_traits.h +++ b/Solver_interface/include/CGAL/Diagonalize_traits.h @@ -42,7 +42,7 @@ namespace CGAL { /// \tparam FT Number type /// \tparam dim Dimension of the matrices and vectors /// -/// \cgalModels `DiagonalizeTraits` +/// \cgalModels{DiagonalizeTraits} template class Diagonalize_traits { diff --git a/Solver_interface/include/CGAL/Eigen_diagonalize_traits.h b/Solver_interface/include/CGAL/Eigen_diagonalize_traits.h index 2138c377e426..7572299b6222 100644 --- a/Solver_interface/include/CGAL/Eigen_diagonalize_traits.h +++ b/Solver_interface/include/CGAL/Eigen_diagonalize_traits.h @@ -51,7 +51,7 @@ struct Restricted_FT { typedef float type; }; /// \tparam FT Number type /// \tparam dim Dimension of the matrices and vectors /// -/// \cgalModels `DiagonalizeTraits` +/// \cgalModels{DiagonalizeTraits} /// /// \sa https://eigen.tuxfamily.org/index.php?title=Main_Page template diff --git a/Solver_interface/include/CGAL/Eigen_matrix.h b/Solver_interface/include/CGAL/Eigen_matrix.h index 4f28c3f7c6fe..5fbbac62b7df 100644 --- a/Solver_interface/include/CGAL/Eigen_matrix.h +++ b/Solver_interface/include/CGAL/Eigen_matrix.h @@ -25,7 +25,7 @@ namespace CGAL { The class `Eigen_matrix` is a wrapper around `Eigen` matrix type `Eigen::Matrix`. -\cgalModels `SvdTraits::Matrix` +\cgalModels{SvdTraits::Matrix} \tparam T Number type. \tparam D1 Number of rows, or Dynamic diff --git a/Solver_interface/include/CGAL/Eigen_solver_traits.h b/Solver_interface/include/CGAL/Eigen_solver_traits.h index 428c33bad734..87e20f3eeb11 100644 --- a/Solver_interface/include/CGAL/Eigen_solver_traits.h +++ b/Solver_interface/include/CGAL/Eigen_solver_traits.h @@ -68,7 +68,7 @@ struct Get_eigen_matrix< ::Eigen::SparseLU, FT> The class `Eigen_solver_traits` provides an interface to the sparse solvers of \ref thirdpartyEigen "Eigen". \ref thirdpartyEigen "Eigen" version 3.1 (or later) must be available on the system. -\cgalModels `SparseLinearAlgebraWithFactorTraits_d` and `NormalEquationSparseLinearAlgebraTraits_d` +\cgalModels{SparseLinearAlgebraWithFactorTraits_d,NormalEquationSparseLinearAlgebraTraits_d} \tparam EigenSolverT A sparse solver of \ref thirdpartyEigen "Eigen". The default solver is the iterative bi-conjugate gradient stabilized solver `Eigen::BiCGSTAB` for `double`. diff --git a/Solver_interface/include/CGAL/Eigen_sparse_matrix.h b/Solver_interface/include/CGAL/Eigen_sparse_matrix.h index 20e8962bb152..c0f9d40bfa09 100644 --- a/Solver_interface/include/CGAL/Eigen_sparse_matrix.h +++ b/Solver_interface/include/CGAL/Eigen_sparse_matrix.h @@ -24,7 +24,7 @@ The class `Eigen_sparse_matrix` is a wrapper around `Eigen` matrix type `Eigen::SparseMatrix` that represents general matrices, be they symmetric or not. -\cgalModels `SparseLinearAlgebraTraits_d::Matrix` +\cgalModels{SparseLinearAlgebraTraits_d::Matrix} \tparam T Number type. @@ -305,7 +305,7 @@ The class `Eigen_sparse_symmetric_matrix` is a wrapper around `Eigen` matrix typ Since the matrix is symmetric, only the lower triangle part is stored. -\cgalModels `SparseLinearAlgebraTraits_d::Matrix` +\cgalModels{SparseLinearAlgebraTraits_d::Matrix} \tparam T Number type. diff --git a/Solver_interface/include/CGAL/Eigen_svd.h b/Solver_interface/include/CGAL/Eigen_svd.h index 276812001b81..252382860bfb 100644 --- a/Solver_interface/include/CGAL/Eigen_svd.h +++ b/Solver_interface/include/CGAL/Eigen_svd.h @@ -31,7 +31,7 @@ The class `Eigen_svd` provides an algorithm to solve in the least square sense a linear system with a singular value decomposition using \ref thirdpartyEigen. -\cgalModels `SvdTraits` +\cgalModels{SvdTraits} */ class Eigen_svd diff --git a/Solver_interface/include/CGAL/Eigen_vector.h b/Solver_interface/include/CGAL/Eigen_vector.h index b50ac037eff4..313046c6010b 100644 --- a/Solver_interface/include/CGAL/Eigen_vector.h +++ b/Solver_interface/include/CGAL/Eigen_vector.h @@ -23,8 +23,7 @@ The class `Eigen_vector` is a wrapper around `Eigen` vector type, which is a simple array of numbers. -\cgalModels `SvdTraits::Vector` -\cgalModels `SparseLinearAlgebraTraits_d::Vector`. +\cgalModels{SvdTraits::Vector,SparseLinearAlgebraTraits_d::Vector} \tparam T Number type. diff --git a/Solver_interface/include/CGAL/GLPK_mixed_integer_program_traits.h b/Solver_interface/include/CGAL/GLPK_mixed_integer_program_traits.h index 1218679b04ac..05f46dc378f0 100644 --- a/Solver_interface/include/CGAL/GLPK_mixed_integer_program_traits.h +++ b/Solver_interface/include/CGAL/GLPK_mixed_integer_program_traits.h @@ -56,7 +56,7 @@ int bound_type(FT lb, FT ub) /// `CGAL::SCIP_mixed_integer_program_traits`, or derive a new /// model from `CGAL::Mixed_integer_program_traits`. /// -/// \cgalModels `MixedIntegerProgramTraits` +/// \cgalModels{MixedIntegerProgramTraits} /// /// \sa `SCIP_mixed_integer_program_traits` template diff --git a/Solver_interface/include/CGAL/Mixed_integer_program_traits.h b/Solver_interface/include/CGAL/Mixed_integer_program_traits.h index 472e6dbc6094..4748f3150a19 100644 --- a/Solver_interface/include/CGAL/Mixed_integer_program_traits.h +++ b/Solver_interface/include/CGAL/Mixed_integer_program_traits.h @@ -100,7 +100,7 @@ namespace CGAL { /// /// The variable of a mixed integer program. /// - /// \cgalModels `MixedIntegerProgramVariable` + /// \cgalModels{MixedIntegerProgramVariable} template class Variable : public Solver_entry, public Bound { @@ -199,7 +199,7 @@ namespace CGAL { /// /// The linear constraint of a mixed integer program. /// - /// \cgalModels `MixedIntegerProgramLinearConstraint` + /// \cgalModels{MixedIntegerProgramLinearConstraint} template class Linear_constraint : public Linear_expression, public Bound { @@ -231,7 +231,7 @@ namespace CGAL { /// /// The linear objective of a mixed integer program. /// - /// \cgalModels `MixedIntegerProgramLinearObjective` + /// \cgalModels{MixedIntegerProgramLinearObjective} /// template class Linear_objective : public Linear_expression @@ -281,7 +281,7 @@ namespace CGAL { /// \tparam FT Number type /// \endcond /// - /// \cgalModels `MixedIntegerProgramTraits` + /// \cgalModels{MixedIntegerProgramTraits} template class Mixed_integer_program_traits { diff --git a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h index 261c4c514b03..46308431ea79 100644 --- a/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h +++ b/Solver_interface/include/CGAL/OSQP_quadratic_program_traits.h @@ -48,7 +48,7 @@ namespace CGAL { type is used. After the optimization is complete, the `OSQPFloat` type is converted back to `FT`. See more about `OSQPFloat` here. - \cgalModels `QuadraticProgramTraits` + \cgalModels{QuadraticProgramTraits} */ template class OSQP_quadratic_program_traits diff --git a/Solver_interface/include/CGAL/SCIP_mixed_integer_program_traits.h b/Solver_interface/include/CGAL/SCIP_mixed_integer_program_traits.h index 734a32b192ec..588da9bb9fb6 100644 --- a/Solver_interface/include/CGAL/SCIP_mixed_integer_program_traits.h +++ b/Solver_interface/include/CGAL/SCIP_mixed_integer_program_traits.h @@ -36,7 +36,7 @@ namespace CGAL { /// constrained or unconstrained mixed integer programs using /// \ref thirdpartySCIP (which must be available on the system). /// -/// \cgalModels `MixedIntegerProgramTraits` +/// \cgalModels{MixedIntegerProgramTraits} /// /// \sa `GLPK_mixed_integer_program_traits` template diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance.h b/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance.h index 720ddf074102..31544634d5cb 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance.h @@ -10,7 +10,7 @@ To optimize distance computations squared distances are used. \tparam Traits must be a model of the concept `SearchTraits`, for example `Search_traits_2 >`. -\cgalModels `OrthogonalDistance` +\cgalModels{OrthogonalDistance} \sa `OrthogonalDistance` \sa `CGAL::Weighted_Minkowski_distance` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance_sphere_point.h b/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance_sphere_point.h index 80ff3473229f..d0eb8daacf4d 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance_sphere_point.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Euclidean_distance_sphere_point.h @@ -13,7 +13,7 @@ Euclidean distance between a \f$ d\f$-dimensional sphere and a \tparam Traits must be a model of the concept `SearchTraits`, for example `Simple_cartesian_d`. -\cgalModels `GeneralDistance` +\cgalModels{GeneralDistance} \sa `GeneralDistance` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_iso_box.h b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_iso_box.h index 298c72cf6679..9ddb9d11ca35 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_iso_box.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_iso_box.h @@ -16,7 +16,7 @@ as follows: \tparam Traits must be a model of the concept `SearchTraits`, for example `CGAL::Search_traits_2 >`. -\cgalModels `FuzzyQueryItem` +\cgalModels{FuzzyQueryItem} */ template< typename Traits > class Fuzzy_iso_box { diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h index dac7c110cb01..2b1c73688268 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h @@ -20,7 +20,7 @@ inner approximation. \tparam Traits must be a model of the concept `SearchTraits`, for example `CGAL::Cartesian_d`. -\cgalModels `FuzzyQueryItem` +\cgalModels{FuzzyQueryItem} */ template< typename Traits > class Fuzzy_sphere { diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Manhattan_distance_iso_box_point.h b/Spatial_searching/doc/Spatial_searching/CGAL/Manhattan_distance_iso_box_point.h index 3f97520fd01d..dd346747b6b1 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Manhattan_distance_iso_box_point.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Manhattan_distance_iso_box_point.h @@ -13,7 +13,7 @@ and a `d`-dimensional iso-box defined as a `k-d` tree rectangle. \tparam Traits must be a model for the concept `SearchTraits`, for example `Search_traits_3 >`. -\cgalModels `GeneralDistance` +\cgalModels{GeneralDistance} \sa `GeneralDistance` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Plane_separator.h b/Spatial_searching/doc/Spatial_searching/CGAL/Plane_separator.h index a2b010c77a1a..e206f669fc0a 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Plane_separator.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Plane_separator.h @@ -9,7 +9,7 @@ hyperplane that is used to separate two half spaces. This hyperplane is defined by a cutting dimension `d` and a cutting value `v` as `xd=v`, where `v` denotes the `d`th coordinate value. -\cgalModels `SpatialSeparator` +\cgalModels{SpatialSeparator} */ template< typename FT > diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits.h index 3493d48d4de9..c6039d687165 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Search_traits` can be used as a template parameter of the kd tree and the search classes. It is a mere wrapper for the geometric types needed by these classes. -\cgalModels `SearchTraits` +\cgalModels{SearchTraits} \sa `Search_traits_2` \sa `Search_traits_3` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_2.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_2.h index 9e63afc17a3c..7efffca47bfb 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_2.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_2.h @@ -9,8 +9,7 @@ and the search classes. \tparam SearchGeomTraits must be a model of the concept `SearchGeomTraits_2`, for example `Simple_cartesian` or `Simple_cartesian`. -\cgalModels `SearchTraits` -\cgalModels `RangeSearchTraits` +\cgalModels{SearchTraits,RangeSearchTraits} \sa `Search_traits_3` \sa `Search_traits` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_3.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_3.h index 75dcda8229e9..5862d6fe6d4a 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_3.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_3.h @@ -9,8 +9,7 @@ and the search classes. \tparam GeomTraits must be a model of the concept `SearchGeomTraits_3`, for example `Simple_cartesian` or `Simple_cartesian`. -\cgalModels `SearchTraits` -\cgalModels `RangeSearchTraits` +\cgalModels{SearchTraits,RangeSearchTraits} \sa `Search_traits_2` \sa `Search_traits` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h index 78ed637466b5..646ecf4b4a84 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h @@ -16,8 +16,8 @@ with `Key` as key type and `Base_distance::Point_d` as value type. \tparam Base_distance is a model of either `GeneralDistance` or `OrthogonalDistance`. -\cgalModels `GeneralDistance` if Base_distance is a model of `GeneralDistance` -\cgalModels `OrthogonalDistance` if Base_distance is a model of `OrthogonalDistance` +\cgalModels{GeneralDistance if Base_distance is a model of `GeneralDistance`, + OrthogonalDistance if Base_distance is a model of `OrthogonalDistance`} \sa `Search_traits_adapter` @@ -87,8 +87,8 @@ with `Key` as `key_type` and `Base_distance::Point_d` as `value_type`. \tparam BaseTraits is a model of either `SearchTraits` or `RangeSearchTraits`. -\cgalModels `SearchTraits` if `BaseTraits` is a model of `SearchTraits`. -\cgalModels `RangeSearchTraits` if `BaseTraits` is a model of `RangeSearchTraits`. +\cgalModels{SearchTraits if `BaseTraits` is a model of `SearchTraits`., + RangeSearchTraits if `BaseTraits` is a model of `RangeSearchTraits`.} \sa `Distance_adapter` \sa `Search_traits_2` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_d.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_d.h index a25f1e967960..0dba1c583ee4 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_d.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_d.h @@ -11,8 +11,7 @@ and the search classes. \tparam Dim must be a `Dimension_tag` (default value is `Dynamic_dimension_tag`). -\cgalModels `SearchTraits` -\cgalModels `RangeSearchTraits` +\cgalModels{SearchTraits,RangeSearchTraits} \sa `Search_traits_2` \sa `Search_traits_3` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Splitters.h b/Spatial_searching/doc/Spatial_searching/CGAL/Splitters.h index dc0a8248824d..11f6ffda3226 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Splitters.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Splitters.h @@ -20,7 +20,7 @@ the concept `SearchTraits`, for example `CGAL::Search_traits_2`. \tparam SpatialSeparator must be a model of the concept `SpatialSeparator`. It has as default value the type `Plane_separator`. -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -78,7 +78,7 @@ the type `CGAL::Search_traits_3< Cartesian >`. Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator`. -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -125,7 +125,7 @@ the type `CGAL::Search_traits_3< Cartesian >`. Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator`. -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -171,7 +171,7 @@ the type `CGAL::Search_traits_3< Cartesian >`. Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator` -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -216,7 +216,7 @@ the type `CGAL::Search_traits_3< Cartesian >`. Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator` -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -279,7 +279,7 @@ for example `CGAL::Cartesian_d`. Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator` -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` @@ -351,7 +351,7 @@ Expects for the first template argument a model of the concept Expects for the second template argument a model of the concept `SpatialSeparator`. It has as default value the type, `CGAL::Plane_separator`. -\cgalModels `Splitter` +\cgalModels{Splitter} \sa `Splitter` \sa `SpatialSeparator` diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Weighted_Minkowski_distance.h b/Spatial_searching/doc/Spatial_searching/CGAL/Weighted_Minkowski_distance.h index 80dd86776993..01041c944014 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Weighted_Minkowski_distance.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Weighted_Minkowski_distance.h @@ -16,7 +16,7 @@ done exact but with floating point arithmetic. \tparam Traits must be a model of the concept `SearchTraits`, for example `Search_traits_2`. -\cgalModels `OrthogonalDistance` +\cgalModels{OrthogonalDistance} \sa `OrthogonalDistance` \sa `CGAL::Euclidean_distance` diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Hilbert_policy_tags.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Hilbert_policy_tags.h index fcad7194a58e..e6d34441b739 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Hilbert_policy_tags.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Hilbert_policy_tags.h @@ -9,8 +9,7 @@ in order to specify the strategy for spatial sorting. `Hilbert_policy` can be passed to as parameter to `hilbert_sort()` to choose the sorting policy. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Middle` \sa `Hilbert_policy` @@ -27,8 +26,7 @@ in order to specify the strategy for spatial sorting. `Hilbert_policy` can be passed to as parameter to `hilbert_sort()` to choose the sorting policy. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Median` \sa `Hilbert_policy` @@ -47,8 +45,7 @@ can be passed as parameter to `hilbert_sort()` to choose the sorting policy. \tparam Tag must be either `Median` or `Middle`. -\cgalModels `DefaultConstructible` -\cgalModels `CopyConstructible` +\cgalModels{DefaultConstructible,CopyConstructible} \sa `Median` \sa `Middle` diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h index 92b8a1ff2c73..eb67bdc3b80e 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_2.h @@ -13,7 +13,7 @@ while the actual point type is `Base_traits::Point_2`. \tparam PointPropertyMap must be a model of `ReadablePropertyMap` with value type `Base_traits::Point_2`. -\cgalModels `SpatialSortingTraits_2` +\cgalModels{SpatialSortingTraits_2} */ template< typename Base_traits, typename PointPropertyMap > class Spatial_sort_traits_adapter_2 : public Base_traits { diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_3.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_3.h index 242620de70d8..f10db637accc 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_3.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_3.h @@ -13,7 +13,7 @@ while the actual point type is `Base_traits::Point_3`. \tparam PointPropertyMap must be a model of `ReadablePropertyMap` with value type `Base_traits::Point_3`. -\cgalModels `SpatialSortingTraits_3` +\cgalModels{SpatialSortingTraits_3} */ template< typename Base_traits, typename PointPropertyMap > diff --git a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_d.h b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_d.h index ca5479c2c388..6dde64ad80b1 100644 --- a/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_d.h +++ b/Spatial_sorting/doc/Spatial_sorting/CGAL/Spatial_sort_traits_adapter_d.h @@ -13,7 +13,7 @@ while the actual point type is `Base_traits::Point_d`. \tparam PointPropertyMap must be a model of `ReadablePropertyMap` with value type `Base_traits::Point_d`. -\cgalModels `SpatialSortingTraits_d` +\cgalModels{SpatialSortingTraits_d} */ template< typename Base_traits, typename PointPropertyMap > diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_traits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_traits_2.h index 148efbf52f59..09a9caddeb13 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_traits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_traits_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Classes -\cgalModels `PolygonOffsetBuilderTraits_2` +\cgalModels{PolygonOffsetBuilderTraits_2} The class `Polygon_offset_builder_traits_2` provides a model for the concept `PolygonOffsetBuilderTraits_2`, which is the traits class diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_2.h index 2c386eae9369..727da054561f 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Classes -\cgalModels `StraightSkeleton_2` +\cgalModels{StraightSkeleton_2} \brief The class `Straight_skeleton_2` provides a model for the `StraightSkeleton_2` concept which is the class type used to represent a straight skeleton. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h index 9b69d3cc9f7b..65eab3b3333a 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h @@ -12,7 +12,7 @@ type required by the `Straight_skeleton_builder_2` algorithm class. This class is the default visitor parameter of the straight skeleton builder. All its methods are empty. -\cgalModels `StraightSkeletonBuilder_2_Visitor` +\cgalModels{StraightSkeletonBuilder_2_Visitor} \sa `Straight_skeleton_builder_2` */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_traits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_traits_2.h index 0b79000692e7..656ecf75b306 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_traits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_traits_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Classes -\cgalModels `StraightSkeletonBuilderTraits_2` +\cgalModels{StraightSkeletonBuilderTraits_2} The class `Straight_skeleton_builder_traits_2` provides a model for the concept `StraightSkeletonBuilderTraits_2`, which is the traits class diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h index d3ff08ad9f40..4a5cdfc9a235 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h @@ -87,7 +87,7 @@ boost::shared_ptr operator()( const Source_skeleton& s) const; /*! \ingroup PkgStraightSkeleton2Auxiliary -\cgalModels `StraightSkeletonItemsConverter_2` +\cgalModels{StraightSkeletonItemsConverter_2} `Straight_skeleton_items_converter_2` is a model of the `StraightSkeletonItemsConverter_2` concept diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_face_base_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_face_base_2.h index 51e8e003fbb6..bc13c7b0fa71 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_face_base_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_face_base_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Auxiliary -\cgalModels `StraightSkeletonFace_2` +\cgalModels{StraightSkeletonFace_2} The class `Straight_skeleton_face_base_2` provides a model for the concept `StraightSkeletonFace_2`, which is the face type required by the `StraightSkeleton_2` concept. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_halfedge_base_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_halfedge_base_2.h index ee4f67fe6480..ce86de1a3ab9 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_halfedge_base_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_halfedge_base_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Auxiliary -\cgalModels `StraightSkeletonHalfedge_2` +\cgalModels{StraightSkeletonHalfedge_2} The class `Straight_skeleton_halfedge_base_2` provides a model for the concept `StraightSkeletonHalfedge_2`, which is the halfedge type required by the `StraightSkeleton_2` concept. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h index fb30f495c46c..5f104bf83780 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgStraightSkeleton2Auxiliary -\cgalModels `StraightSkeletonVertex_2` +\cgalModels{StraightSkeletonVertex_2} The class `Straight_skeleton_vertex_base_2` provides a model for the `StraightSkeletonVertex_2` concept which is the vertex type required by the `StraightSkeleton_2` concept. diff --git a/Stream_lines_2/doc/Stream_lines_2/CGAL/Euler_integrator_2.h b/Stream_lines_2/doc/Stream_lines_2/CGAL/Euler_integrator_2.h index 8562be8184e4..2769141eb0bb 100644 --- a/Stream_lines_2/doc/Stream_lines_2/CGAL/Euler_integrator_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/CGAL/Euler_integrator_2.h @@ -7,7 +7,7 @@ This class implements the first order Euler integrator. \tparam VectorField_2 has to be instantiated by a model of the concept `VectorField_2`. -\cgalModels `Integrator_2` +\cgalModels{Integrator_2} \sa `Runge_kutta_integrator_2` diff --git a/Stream_lines_2/doc/Stream_lines_2/CGAL/Regular_grid_2.h b/Stream_lines_2/doc/Stream_lines_2/CGAL/Regular_grid_2.h index b690baa7951e..398f6d620687 100644 --- a/Stream_lines_2/doc/Stream_lines_2/CGAL/Regular_grid_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/CGAL/Regular_grid_2.h @@ -11,7 +11,7 @@ vector value is interpolated from the vertices of `c`). \tparam StreamLinesTraits_2 has to instantiated by a model of the concept `StreamLinesTraits_2`. -\cgalModels `VectorField_2` +\cgalModels{VectorField_2} \sa `Triangular_field_2` diff --git a/Stream_lines_2/doc/Stream_lines_2/CGAL/Runge_kutta_integrator_2.h b/Stream_lines_2/doc/Stream_lines_2/CGAL/Runge_kutta_integrator_2.h index f0624e01384a..4ea9c7fc4f7c 100644 --- a/Stream_lines_2/doc/Stream_lines_2/CGAL/Runge_kutta_integrator_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/CGAL/Runge_kutta_integrator_2.h @@ -7,7 +7,7 @@ This class implements the second order Runge-Kutta integrator. \tparam VectorField_2 has to be instantiated by a model of the concept `VectorField_2`. -\cgalModels `Integrator_2` +\cgalModels{Integrator_2} \sa `Euler_integrator_2` diff --git a/Stream_lines_2/doc/Stream_lines_2/CGAL/Triangular_field_2.h b/Stream_lines_2/doc/Stream_lines_2/CGAL/Triangular_field_2.h index fda0a8cc7e97..1758f1c6ef61 100644 --- a/Stream_lines_2/doc/Stream_lines_2/CGAL/Triangular_field_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/CGAL/Triangular_field_2.h @@ -12,7 +12,7 @@ vertices of the face `f`. \tparam StreamLinesTraits_2 has to be instantiated by a model of the concept `StreamLinesTraits_2`. -\cgalModels `VectorField_2` +\cgalModels{VectorField_2} \sa `Regular_grid_2` diff --git a/Stream_support/include/CGAL/IO/Istream_iterator.h b/Stream_support/include/CGAL/IO/Istream_iterator.h index 04a2d93cad91..1ae51232129c 100644 --- a/Stream_support/include/CGAL/IO/Istream_iterator.h +++ b/Stream_support/include/CGAL/IO/Istream_iterator.h @@ -28,7 +28,7 @@ The class `Istream_iterator` is an input iterator adaptor for the input stream class `Stream` and value type `T`. It is particularly useful for classes that are similar but not compatible to `std::istream`. -\cgalModels `InputIterator` +\cgalModels{InputIterator} */ template class Istream_iterator diff --git a/Stream_support/include/CGAL/IO/Ostream_iterator.h b/Stream_support/include/CGAL/IO/Ostream_iterator.h index 8d3911471cf9..4bdeaa6689bc 100644 --- a/Stream_support/include/CGAL/IO/Ostream_iterator.h +++ b/Stream_support/include/CGAL/IO/Ostream_iterator.h @@ -46,7 +46,7 @@ class Ostream_proxy The class `Ostream_iterator` is an output iterator adaptor for the output stream class `Stream` and value type `T`. -\cgalModels `OutputIterator` +\cgalModels{OutputIterator} \cgalHeading{Implementation} 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 af0d0d3e22a8..af9edb119681 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 @@ -142,7 +142,7 @@ such as `Polyhedron_3` and `Surface_mesh`. \image html CCBorderMask.svg -\cgalModels `PQQMask_3` +\cgalModels{PQQMask_3} \sa `CGAL::Subdivision_method_3` */ @@ -266,7 +266,7 @@ such as `Polyhedron_3` and `Surface_mesh`. \image html LoopBorderMask.png \image latex LoopBorderMask.png -\cgalModels `PTQMask_3` +\cgalModels{PTQMask_3} \sa `CGAL::Subdivision_method_3` @@ -429,7 +429,7 @@ such as `Polyhedron_3` and `Surface_mesh`. \image html DSCornerMask.png \image latex DSCornerMask.png -\cgalModels `DQQMask_3` +\cgalModels{DQQMask_3} \sa `CGAL::Subdivision_method_3` @@ -523,7 +523,7 @@ such as `Polyhedron_3` and `Surface_mesh`. \tparam PolygonMesh must be a model of the concept `MutableFaceGraph`. Additionally all faces must be triangles. \tparam VertexPointMap must be a model of `WritablePropertyMap` with value type `Point_3` -\cgalModels `Sqrt3Mask_3` +\cgalModels{Sqrt3Mask_3} \sa `CGAL::Subdivision_method_3` diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Properties.h b/Surface_mesh/include/CGAL/Surface_mesh/Properties.h index 31eea166ee58..1e5c73c84c3e 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Properties.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Properties.h @@ -528,7 +528,7 @@ class Property_container /// @tparam Key The key type of the property map. It must be a model of `Index`. /// @tparam Value The value type of the property. /// -/// \cgalModels `LvaluePropertyMap` +/// \cgalModels{LvaluePropertyMap} /// template class Property_map_base diff --git a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h index c109f002a3a6..559aec265f09 100644 --- a/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h +++ b/Surface_mesh/include/CGAL/Surface_mesh/Surface_mesh.h @@ -325,7 +325,7 @@ namespace CGAL { /// @tparam P The type of the \em point property of a vertex. There is no requirement on `P`, /// besides being default constructible and assignable. /// In typical use cases it will be a 2D or 3D point type. - /// \cgalModels `MutableFaceGraph` and `FaceListGraph` + /// \cgalModels{MutableFaceGraph,FaceListGraph} /// /// \sa \ref PkgBGLConcepts "Graph Concepts" @@ -375,9 +375,7 @@ class Surface_mesh #ifdef DOXYGEN_RUNNING /// This class represents a vertex. - /// \cgalModels `Index` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Index,LessThanComparable,Hashable} /// \sa `Halfedge_index`, `Edge_index`, `Face_index` class Vertex_index { @@ -398,9 +396,7 @@ class Surface_mesh #ifdef DOXYGEN_RUNNING /// This class represents a halfedge. - /// \cgalModels `Index` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Index,LessThanComparable,Hashable} /// \sa `Vertex_index`, `Edge_index`, `Face_index` class Halfedge_index { @@ -422,9 +418,7 @@ class Surface_mesh #ifdef DOXYGEN_RUNNING /// This class represents a face - /// \cgalModels `Index` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Index,LessThanComparable,Hashable} /// \sa `Vertex_index`, `Halfedge_index`, `Edge_index` class Face_index { @@ -444,9 +438,7 @@ class Surface_mesh #ifdef DOXYGEN_RUNNING /// This class represents an edge. - /// \cgalModels `Index` - /// \cgalModels `LessThanComparable` - /// \cgalModels `Hashable` + /// \cgalModels{Index,LessThanComparable,Hashable} /// \sa `Vertex_index`, `Halfedge_index`, `Face_index` class Edge_index { diff --git a/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L21_metric_plane_proxy.h b/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L21_metric_plane_proxy.h index 7178bc68f33a..e7ea59e67b25 100644 --- a/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L21_metric_plane_proxy.h +++ b/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L21_metric_plane_proxy.h @@ -31,7 +31,7 @@ namespace Surface_mesh_approximation { /// \ingroup PkgTSMARef /// @brief Approximation L21 metric of vector proxy. /// -/// \cgalModels `ErrorMetricProxy` +/// \cgalModels{ErrorMetricProxy} /// /// @tparam TriangleMesh a triangle `FaceGraph` /// @tparam VertexPointMap a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` diff --git a/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L2_metric_plane_proxy.h b/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L2_metric_plane_proxy.h index 1f3e012ce860..67121dcdcdfc 100644 --- a/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L2_metric_plane_proxy.h +++ b/Surface_mesh_approximation/include/CGAL/Surface_mesh_approximation/L2_metric_plane_proxy.h @@ -32,7 +32,7 @@ namespace Surface_mesh_approximation { /// \ingroup PkgTSMARef /// @brief Approximation L2 metric of plane proxy. /// -/// \cgalModels `ErrorMetricProxy` +/// \cgalModels{ErrorMetricProxy} /// /// @tparam TriangleMesh a triangle `FaceGraph` /// @tparam VertexPointMap a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` diff --git a/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_closest_rotation_traits_3.h b/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_closest_rotation_traits_3.h index 98c938b5fbcd..60c52e52e7f9 100644 --- a/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_closest_rotation_traits_3.h +++ b/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_closest_rotation_traits_3.h @@ -21,7 +21,7 @@ namespace CGAL { /// A class to compute the closest rotation in Frobenius norm to a 3x3 Matrix using the \link thirdpartyEigen `Eigen` library \endlink. /// The internal computation relies on `Eigen::JacobiSVD<>` solver. /// -/// \cgalModels `DeformationClosestRotationTraits_3` +/// \cgalModels{DeformationClosestRotationTraits_3} class Deformation_Eigen_closest_rotation_traits_3{ public: diff --git a/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_polar_closest_rotation_traits_3.h b/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_polar_closest_rotation_traits_3.h index 7ffc0cc17d01..a73d8225bdb9 100644 --- a/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_polar_closest_rotation_traits_3.h +++ b/Surface_mesh_deformation/include/CGAL/Deformation_Eigen_polar_closest_rotation_traits_3.h @@ -23,7 +23,7 @@ namespace CGAL { /// The internal computation relies on a hybrid system using the solvers `Eigen::SelfAdjointEigenSolver<>` /// and `Eigen::JacobiSVD<>` (polar decomposition). /// - /// \cgalModels `DeformationClosestRotationTraits_3` + /// \cgalModels{DeformationClosestRotationTraits_3} class Deformation_Eigen_polar_closest_rotation_traits_3 : public Deformation_Eigen_closest_rotation_traits_3{ public: diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h index 485da4c6975c..7ff51e70ce0a 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h @@ -134,7 +134,7 @@ namespace Surface_mesh_parameterization { /// /// A one-to-one mapping is *not* guaranteed. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h index 15ac8ec8aef9..12e4e63feb48 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Barycentric_mapping_parameterizer_3.h @@ -49,7 +49,7 @@ namespace Surface_mesh_parameterization { /// the matrix `A` for `j` neighbor vertex of `i`, based on Tutte Barycentric /// Mapping method. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Circular_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Circular_border_parameterizer_3.h index 321f32b99d53..b2b05c4de7be 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Circular_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Circular_border_parameterizer_3.h @@ -50,7 +50,7 @@ namespace Surface_mesh_parameterization { /// `TriangleMesh` class and does not know the parameterization algorithm /// requirements or the kind of sparse linear system used. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// @@ -182,7 +182,7 @@ class Circular_border_parameterizer_3 /// algorithm. This class implements only `compute_edge_length()` to compute a /// segment's length. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \sa `CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3` /// \sa `CGAL::Surface_mesh_parameterization::Circular_border_arc_length_parameterizer_3` @@ -231,7 +231,7 @@ class Circular_border_uniform_parameterizer_3 /// The class `Circular_border_parameterizer_3` implements most of the border /// parameterization algorithm. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h index a6c7b410a571..52047459ffa7 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_authalic_parameterizer_3.h @@ -50,7 +50,7 @@ namespace Surface_mesh_parameterization { /// - implements `compute_w_ij()` to compute `w_ij`, the `(i,j)`-coefficient of the matrix `A` /// for `j` neighbor vertex of `i`, based on Discrete Authalic Parameterization algorithm. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h index 7787476e654f..7bb751740326 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Discrete_conformal_map_parameterizer_3.h @@ -50,7 +50,7 @@ namespace Surface_mesh_parameterization { /// - implements `compute_w_ij()` to compute `w_ij`, the `(i,j)`-coefficient of matrix `A`, /// for `j` neighbor vertex of `i`, based on Discrete Conformal Map method. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph` /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h index d32929793c35..cf938045da49 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h @@ -64,7 +64,7 @@ namespace Surface_mesh_parameterization { // from the linear systems in order to have a symmetric positive definite // matrix for Tutte Barycentric Mapping and Discrete Conformal Map algorithms. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h index 08b74876715f..33252883f1d5 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/LSCM_parameterizer_3.h @@ -57,7 +57,7 @@ namespace Surface_mesh_parameterization { /// of the surface onto a convex polygon (only two pinned vertices are needed /// to ensure a unique solution), but a one-to-one mapping is *not* guaranteed. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h index f54e0b4f0eee..d4efce8934d3 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/MVC_post_processor_3.h @@ -61,7 +61,7 @@ namespace Surface_mesh_parameterization { /// the convexification of the initial (2D) parameterization and the resolution /// of a linear system with coefficients based on Mean Value Coordinates. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h index bacdd2ea12cf..ce0be73bd3e5 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Mean_value_coordinates_parameterizer_3.h @@ -49,7 +49,7 @@ namespace Surface_mesh_parameterization { /// for `j` neighbor vertex of `i` based on Floater Mean Value Coordinates parameterization. /// - It implements an optimized version of `is_one_to_one_mapping()`. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h index b806eb1ead69..cb97d65430ab 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Square_border_parameterizer_3.h @@ -61,7 +61,7 @@ namespace Surface_mesh_parameterization { /// `TriangleMesh` class and does not know the parameterization algorithm /// requirements or the kind of sparse linear system used. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// @@ -398,7 +398,7 @@ class Square_border_parameterizer_3 /// if an input border vertex has valence `1` and if it is mapped to the same edge of the square /// as its two adjacent (border) vertices, for example. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \sa `CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3` /// \sa `CGAL::Surface_mesh_parameterization::Square_border_arc_length_parameterizer_3` @@ -470,7 +470,7 @@ class Square_border_uniform_parameterizer_3 /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \sa `CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3` /// \sa `CGAL::Surface_mesh_parameterization::Square_border_uniform_parameterizer_3` diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h index 88ecb8dc706b..17cfb22d3a78 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Two_vertices_parameterizer_3.h @@ -47,7 +47,7 @@ namespace Surface_mesh_parameterization { /// `TriangleMesh` class and does not know the parameterization algorithm /// requirements or the kind of sparse linear system used. /// -/// \cgalModels `Parameterizer_3` +/// \cgalModels{Parameterizer_3} /// /// \tparam TriangleMesh_ must be a model of `FaceGraph`. /// diff --git a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h index 5e2955124f59..1ade946fdc87 100644 --- a/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h +++ b/Surface_mesh_shortest_path/include/CGAL/Surface_mesh_shortest_path/Surface_mesh_shortest_path_traits.h @@ -34,7 +34,7 @@ as required by the `Surface_mesh_shortest_path` class. \tparam TriangleMesh A model of `FaceListGraph` -\cgalModels `SurfaceMeshShortestPathTraits` +\cgalModels{SurfaceMeshShortestPathTraits} */ template < class K, @@ -176,7 +176,7 @@ model which uses an exact Kernel during the unfolding operations to achieve bett \tparam TriangleMesh triangle mesh type -\cgalModels `SurfaceMeshShortestPathTraits` +\cgalModels{SurfaceMeshShortestPathTraits} */ template < class K, diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h index b55bfcadf783..47e7d08ff16d 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h @@ -16,7 +16,7 @@ and hide a non-virtual method in the context of the static polymorphism used in \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `EdgeCollapseSimplificationVisitor` +\cgalModels{EdgeCollapseSimplificationVisitor} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 5fa7e3c33959..4ecf7aa830da 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -20,7 +20,7 @@ the position is returned. The distance check is performed using an AABB tree and this class thus depends on the package \ref PkgAABBTree. -\cgalModels `GetPlacement` +\cgalModels{GetPlacement} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h index 53cfb706bd68..80569183912d 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_filter.h @@ -13,7 +13,7 @@ if any triangle in the profile changes the normal by more than 90 degree, in thi \tparam Filter must be a model of the concept `PlacementFilter`. It defaults to a class that does not filter any placement. -\cgalModels `PlacementFilter` +\cgalModels{PlacementFilter} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h index 8f08e9a071c5..d4ed0a6bc5a2 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_normal_change_placement.h @@ -15,7 +15,7 @@ triangle in the profile changes the normal by more than 90 degree. \tparam Get_placement_ must be a model of the concept `GetPlacement`. -\cgalModels `GetPlacement` +\cgalModels{GetPlacement} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h index f9b904bfb3f2..0927a25ee68e 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Constrained_placement.h @@ -13,7 +13,7 @@ is the point of the common vertex. Otherwise the placement is the one computed b \tparam Edge_is_constrained_map_ must be a model of `ReadablePropertyMap` with `Edge_profile::edge_descriptor` as key type and `bool` as value type indicating if an edge is constrained. -\cgalModels `GetPlacement` +\cgalModels{GetPlacement} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h index f4a5378489b6..74f19bfb77c9 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h @@ -12,7 +12,7 @@ which returns `true` when the relation between the initial and current number of \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} \sa `CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate` \sa `CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate` diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_stop_predicate.h index bef9e2fdba90..b9715e4d5f3e 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_stop_predicate.h @@ -11,7 +11,7 @@ which returns `true` when the number of current edges drops below a certain thre \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} \sa `CGAL::Surface_mesh_simplification::Edge_count_stop_predicate` \sa `CGAL::Surface_mesh_simplification::Face_count_stop_predicate` diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_ratio_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_ratio_stop_predicate.h index fed8537304f6..366808732b46 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_ratio_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_ratio_stop_predicate.h @@ -5,7 +5,7 @@ namespace Surface_mesh_simplification { /*! \ingroup PkgSurfaceMeshSimplificationRef -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} The class `Edge_count_ratio_stop_predicate` is a model for the `StopPredicate` concept which returns `true` when the relation between the initial and current number of edges drops below a certain ratio. diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_stop_predicate.h index 6e3920dd4215..88bb38167320 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_count_stop_predicate.h @@ -4,7 +4,7 @@ namespace Surface_mesh_simplification { /*! \ingroup PkgSurfaceMeshSimplificationRef -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} The class `Edge_count_stop_predicate` is a model for the `StopPredicate` concept, which returns `true` when the number of current edges drops below a certain threshold. diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h index 52c7c54dee8f..5b12c537c3b8 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_cost.h @@ -9,7 +9,7 @@ which computes the collapse cost as the squared length of the edge. \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `GetCost` +\cgalModels{GetCost} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_stop_predicate.h index fbbdffe9064b..fa85ec3a9e69 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Edge_length_stop_predicate.h @@ -11,7 +11,7 @@ This predicate is meant to be used with `Edge_length_cost`. \tparam FT is the number type of the point coordinates, and must be equal to `Edge_profile::FT`. -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_ratio_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_ratio_stop_predicate.h index f5154aeb0d83..bfea79b87dae 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_ratio_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_ratio_stop_predicate.h @@ -5,7 +5,7 @@ namespace Surface_mesh_simplification { /*! \ingroup PkgSurfaceMeshSimplificationRef -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} The class `Face_count_ratio_stop_predicate` is a model for the `StopPredicate` concept which returns `true` when the relation between the initial and current number of faces drops below a certain ratio. diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_stop_predicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_stop_predicate.h index 8c35a5c35e7a..3431bb016ac0 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_stop_predicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Face_count_stop_predicate.h @@ -4,7 +4,7 @@ namespace Surface_mesh_simplification { /*! \ingroup PkgSurfaceMeshSimplificationRef -\cgalModels `StopPredicate` +\cgalModels{StopPredicate} The class `Face_count_stop_predicate` is a model for the `StopPredicate` concept, which returns `true` when the number of current faces drops below a certain threshold. diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h index 36e68f95263b..8d19df2efb3f 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_cost.h @@ -9,7 +9,7 @@ It computes the collapse cost following the Lindstrom-Turk strategy \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `GetCost` +\cgalModels{GetCost} \sa `CGAL::Surface_mesh_simplification::LindstromTurk_placement` diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h index 20ae3890439a..dc606160221c 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/LindstromTurk_placement.h @@ -11,7 +11,7 @@ a halfedge collapse, following the Lindstrom-Turk strategy \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `GetPlacement` +\cgalModels{GetPlacement} \sa `CGAL::Surface_mesh_simplification::LindstromTurk_cost` diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h index 2cd81de679e6..f1bb4339cfb5 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Midpoint_placement.h @@ -10,7 +10,7 @@ which computes the placement as the midpoint position along the edge. \tparam TriangleMesh is the type of surface mesh being simplified, and must be a model of the `MutableFaceGraph` and `HalfedgeListGraph` concepts. -\cgalModels `GetPlacement` +\cgalModels{GetPlacement} */ template diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h index dadccaa8e4d8..b972c0aed3e4 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h @@ -13,7 +13,7 @@ if any triangle in the profile is not inside the polyhedral envelope, in this or \tparam Filter must be a model of the concept `PlacementFilter`. It defaults to a class that does not filter any placement. -\cgalModels `PlacementFilter` +\cgalModels{PlacementFilter} \sa `Polyhedral_envelope` diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h index 06fe49ab9634..9e98bf7ad8ed 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Polygonal_schema_min_items.h @@ -6,7 +6,7 @@ namespace Surface_mesh_topology { The class `Polygonal_schema_min_items` defines a struct with a `std::string` as the information associated with darts, and no attribute is enabled. -\cgalModels `PolygonalSchemaItems` +\cgalModels{PolygonalSchemaItems} \cgalHeading{Example} diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Gray_level_image_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Gray_level_image_3.h index c581de850103..e54821318995 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Gray_level_image_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Gray_level_image_3.h @@ -27,7 +27,7 @@ The library CGAL_ImageIO and therefore `Gray_level_image_3` support several types of 3D images: INRIMAGE (extension .inr[.gz]), GIS (extension .dim, of .ima[.gz]), and ANALYZE (extension .hdr, or .img[.gz]). -\cgalModels `ImplicitFunction` +\cgalModels{ImplicitFunction} \sa `ImplicitFunction` \sa `Implicit_surface_3` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Implicit_surface_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Implicit_surface_3.h index 9755576db70a..58bdcf1b2241 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Implicit_surface_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Implicit_surface_3.h @@ -27,7 +27,7 @@ mesh traits The number type `Function::FT` has to match the type `Traits::FT`. -\cgalModels `Surface_3` +\cgalModels{Surface_3} \sa `make_surface_mesh` \sa `Surface_mesh_traits_generator_3` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_cell_base_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_cell_base_3.h index 92b02d9034a6..2dea730abfe8 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_cell_base_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_cell_base_3.h @@ -16,7 +16,7 @@ class. \tparam Cb must be a model of the concept `DelaunayTriangulationCellBase_3` and defaults to `Delaunay_triangulation_cell_base_3`. -\cgalModels `SurfaceMeshCellBase_3` +\cgalModels{SurfaceMeshCellBase_3} \sa `SurfaceMeshComplex_2InTriangulation_3` \sa `Surface_mesh_complex_2_in_triangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_complex_2_in_triangulation_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_complex_2_in_triangulation_3.h index 77146cc110d3..4067968a486c 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_complex_2_in_triangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_complex_2_in_triangulation_3.h @@ -22,7 +22,7 @@ of the concept `SurfaceMeshVertexBase_3` and `SurfaceMeshCellBase_3` respectively.) -\cgalModels `SurfaceMeshComplex_2InTriangulation_3` +\cgalModels{SurfaceMeshComplex_2InTriangulation_3} \sa `make_surface_mesh` \sa `SurfaceMeshTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_criteria_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_criteria_3.h index 693a1fa8dee0..debdac03ce02 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_criteria_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_criteria_3.h @@ -27,7 +27,7 @@ is the distance between the facet circumcenter and the center of its surface Delaunay ball. -\cgalModels `SurfaceMeshFacetsCriteria_3` +\cgalModels{SurfaceMeshFacetsCriteria_3} \sa `make_surface_mesh` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_triangulation_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_triangulation_3.h index b248d1aa8651..655dae38d038 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_triangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_default_triangulation_3.h @@ -10,7 +10,7 @@ are models of the concepts `SurfaceMeshVertexBase_3` and `SurfaceMeshCellBase_3` respectively. -\cgalModels `SurfaceMeshTriangulation_3` +\cgalModels{SurfaceMeshTriangulation_3} \sa `Surface_mesh_complex_2_in_triangulation_3` \sa `make_surface_mesh` diff --git a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_vertex_base_3.h b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_vertex_base_3.h index 3a4f9172cc61..f06dc5f2ca1d 100644 --- a/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_vertex_base_3.h +++ b/Surface_mesher/doc/Surface_mesher/CGAL/Surface_mesh_vertex_base_3.h @@ -17,7 +17,7 @@ class. and defaults to `Triangulation_vertex_base_3 `. -\cgalModels `SurfaceMeshVertexBase_3` +\cgalModels{SurfaceMeshVertexBase_3} \sa `SurfaceMeshComplex_2InTriangulation_3` \sa `Surface_mesh_complex_2_in_triangulation_3` diff --git a/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h b/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h index 4b2569c16070..5c076eed68f5 100644 --- a/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h +++ b/TDS_2/doc/TDS_2/CGAL/Triangulation_data_structure_2.h @@ -18,7 +18,7 @@ additional template parameters. \tparam FaceBase must be a model of `TriangulationDSFaceBase_2`. The default is `Triangulation_ds_face_base_2`. -\cgalModels `TriangulationDataStructure_2` +\cgalModels{TriangulationDataStructure_2} \cgalHeading{Modifiers} diff --git a/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_face_base_2.h b/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_face_base_2.h index 85fbc81a1857..1380f3fefef9 100644 --- a/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_face_base_2.h +++ b/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_face_base_2.h @@ -8,7 +8,7 @@ The class `Triangulation_ds_face_base_2` is a model for the concept `TriangulationDSFaceBase_2` to be used by `Triangulation_data_structure_2`. -\cgalModels `TriangulationDSFaceBase_2` +\cgalModels{TriangulationDSFaceBase_2} \tparam TDS should not be specified (see Section \ref TDS_2TheRebindMechanism and examples) diff --git a/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_vertex_base_2.h b/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_vertex_base_2.h index 96ce87d5e3be..573f1f95180f 100644 --- a/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_vertex_base_2.h +++ b/TDS_2/doc/TDS_2/CGAL/Triangulation_ds_vertex_base_2.h @@ -20,7 +20,7 @@ and `Triangulation_ds_vertex_base_2` cannot be plugged in. \tparam TDS should not be specified (see Section \ref TDS_2TheRebindMechanism and examples) -\cgalModels `TriangulationDSVertexBase_2` +\cgalModels{TriangulationDSVertexBase_2} \sa `CGAL::Triangulation_vertex_base_2` \sa `CGAL::Triangulation_ds_face_base_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h index a5daedcbc28e..051a1359d2e8 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h @@ -106,13 +106,13 @@ typedef unspecified_type Face_data; /*! Handle to a vertex. -\cgalModels `Handle` +\cgalModels{Handle} */ typedef unspecified_type Vertex_handle; /*! Handle to a face. -\cgalModels `Handle` +\cgalModels{Handle} */ typedef unspecified_type Face_handle; diff --git a/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h b/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h index b3c8ab7da78d..ad6b244555a2 100644 --- a/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h +++ b/TDS_3/doc/TDS_3/CGAL/Triangulation_data_structure_3.h @@ -27,7 +27,7 @@ container to store vertices and cells. It can be `Sequential_tag` (use of a `create_vertex()`, `create_cell()`, `delete_vertex()`, and `delete_cell()`. `Sequential_tag` is the default value. -\cgalModels `TriangulationDataStructure_3` +\cgalModels{TriangulationDataStructure_3} The base class `Triangulation_utils_3` defines basic computations on indices of vertices and neighbors of cells. diff --git a/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_cell_base_3.h b/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_cell_base_3.h index c03c936a2cfc..763beb19f13c 100644 --- a/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_cell_base_3.h +++ b/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_cell_base_3.h @@ -8,7 +8,7 @@ The class `Triangulation_ds_cell_base_3<>` is a model for the concept `TriangulationDSCellBase_3` to be used by `Triangulation_data_structure_3`. -\cgalModels `TriangulationDSCellBase_3` +\cgalModels{TriangulationDSCellBase_3} \tparam TDS should not be specified (see Section \ref tds3cyclic and examples) diff --git a/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_vertex_base_3.h b/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_vertex_base_3.h index 26ad462db9d6..0c324aae7a2a 100644 --- a/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_vertex_base_3.h +++ b/TDS_3/doc/TDS_3/CGAL/Triangulation_ds_vertex_base_3.h @@ -18,7 +18,7 @@ This base class can be used directly or can serve as a base to derive other base classes with some additional attributes (a color for example) tuned for a specific application. -\cgalModels `TriangulationDSVertexBase_3` +\cgalModels{TriangulationDSVertexBase_3} \tparam TDS should not be specified (see Section \ref tds3cyclic and examples) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index d82378827267..15f6751141d2 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -80,8 +80,7 @@ assigned to a non surface facet. It must match the `Surface_patch_index` of the model of the `MeshDomain_3` concept when used for mesh generation. -\cgalModels `RemeshingCellBase_3` -\cgalModels `SimplicialMeshCellBase_3` +\cgalModels{RemeshingCellBase_3,SimplicialMeshCellBase_3} */ template`. -\cgalModels `RemeshingVertexBase_3` -\cgalModels `SimplicialMeshVertexBase_3` +\cgalModels{RemeshingVertexBase_3,SimplicialMeshVertexBase_3} */ template`. -\cgalModels `TriangulationDataStructure`. In addition, the class +\cgalModels{TriangulationDataStructure. In addition, the class `Triangulation_data_structure` provides the following types and -methods. +methods.} \sa `Triangulation_ds_vertex` \sa `Triangulation_ds_full_cell` diff --git a/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_full_cell.h b/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_full_cell.h index 66c902d0d2db..148985c11b77 100644 --- a/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_full_cell.h +++ b/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_full_cell.h @@ -41,7 +41,7 @@ indices are stored. See the user manual for how to choose the second option. -\cgalModels `TriangulationDSFullCell` +\cgalModels{TriangulationDSFullCell} \cgalHeading{Rebind mechanism} diff --git a/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_vertex.h b/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_vertex.h index 9b77ad04b5d1..34cddeb330fc 100644 --- a/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_vertex.h +++ b/Triangulation/doc/Triangulation/CGAL/Triangulation_ds_vertex.h @@ -21,7 +21,7 @@ example). \tparam TriangulationDataStructure_ must be a model of the `TriangulationDataStructure` concept. -\cgalModels `TriangulationDSVertex` +\cgalModels{TriangulationDSVertex} \cgalHeading{Rebind mechanism} diff --git a/Triangulation/doc/Triangulation/CGAL/Triangulation_face.h b/Triangulation/doc/Triangulation/CGAL/Triangulation_face.h index bee7d71ed538..9b4d35b4ce0f 100644 --- a/Triangulation/doc/Triangulation/CGAL/Triangulation_face.h +++ b/Triangulation/doc/Triangulation/CGAL/Triangulation_face.h @@ -12,7 +12,7 @@ Actually, `Triangulation_face` needs only that this concept defines the types `Vertex_handle`, and `Maximal_dimension`. -\cgalModels `TriangulationDSFace` +\cgalModels{TriangulationDSFace} \sa `TriangulationDSFace` \sa `TriangulationDataStructure` diff --git a/Triangulation/doc/Triangulation/CGAL/Triangulation_full_cell.h b/Triangulation/doc/Triangulation/CGAL/Triangulation_full_cell.h index ba9f68848b1d..89e21f5663af 100644 --- a/Triangulation/doc/Triangulation/CGAL/Triangulation_full_cell.h +++ b/Triangulation/doc/Triangulation/CGAL/Triangulation_full_cell.h @@ -27,9 +27,9 @@ The class template `Triangulation_full_cell` accepts that no third parameter be It also accepts the tag `CGAL::Default` as third parameter. In both cases, `TriangulationDSFullCell_` defaults to `CGAL::Triangulation_ds_full_cell<>`. -\cgalModels `TriangulationFullCell` Additionally, the class +\cgalModels{TriangulationFullCell Additionally, the class `Triangulation_full_cell` provides the following types, -constructors and methods: +constructors and methods:} \sa `Triangulation_vertex` \sa `Triangulation_data_structure` diff --git a/Triangulation/doc/Triangulation/CGAL/Triangulation_vertex.h b/Triangulation/doc/Triangulation/CGAL/Triangulation_vertex.h index f3169d6a6d47..631496fa4941 100644 --- a/Triangulation/doc/Triangulation/CGAL/Triangulation_vertex.h +++ b/Triangulation/doc/Triangulation/CGAL/Triangulation_vertex.h @@ -27,9 +27,9 @@ class template `Triangulation_vertex` accepts that no third parameter be specifi also accepts the tag `CGAL::Default` as third parameter. In both cases, `TriangulationDSVertex_` defaults to `CGAL::Triangulation_ds_vertex<>`. -\cgalModels `TriangulationVertex` Additionally, the class +\cgalModels{TriangulationVertex Additionally, the class `Triangulation_vertex` provides the following types, constructors -and methods: +and methods:} \sa `Triangulation_full_cell` \sa `Triangulation_data_structure` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_face_base_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_face_base_2.h index f83a733c6f8c..e9bf99dc1d4c 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_face_base_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Constrained_triangulation_face_base_2.h @@ -8,7 +8,7 @@ The class `Constrained_triangulation_face_base_2` is the default model for the c `ConstrainedTriangulationFaceBase_2` to be used as base face class of constrained triangulations. -\cgalModels `ConstrainedTriangulationFaceBase_2` +\cgalModels{ConstrainedTriangulationFaceBase_2} \tparam Traits must be a geometric traits. diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_face_base_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_face_base_2.h index 0bc93fda7b0e..64ef2eda1c75 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_face_base_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_face_base_2.h @@ -16,7 +16,7 @@ of `TriangulationFaceBase_2`. By default, this parameter is instantiated by `Triangulation_face_base_2`. -\cgalModels `RegularTriangulationFaceBase_2` +\cgalModels{RegularTriangulationFaceBase_2} \sa `RegularTriangulationFaceBase_2` \sa `RegularTriangulationTraits_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_vertex_base_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_vertex_base_2.h index 01c0e9522a2c..e9e12d70ecdd 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_vertex_base_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Regular_triangulation_vertex_base_2.h @@ -15,7 +15,7 @@ of `RegularTriangulationTraits_2`. of the concept `TriangulationVertexBase_2` and is by default instantiated by `Triangulation_vertex_base_2`. -\cgalModels `RegularTriangulationVertexBase_2` +\cgalModels{RegularTriangulationVertexBase_2} \sa `CGAL::Triangulation_vertex_base_2` \sa `CGAL::Regular_triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_2.h index 8f1646c781c8..3a943d3aea36 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_2.h @@ -20,7 +20,7 @@ and will serve as a base class for `Triangulation_face_base_2` . \cgal provides a default instantiation for this parameter which is `Triangulation_ds_face_base_2<>`. -\cgalModels `TriangulationFaceBase_2` +\cgalModels{TriangulationFaceBase_2} \sa `CGAL::Triangulation_ds_face_base_2` \sa `CGAL::Triangulation_vertex_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h index b90233f288e8..bd0990942287 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h @@ -19,9 +19,9 @@ and is actually not used in `Triangulation_face_base_with_info_2` . \tparam Fb is a face base class from which `Triangulation_face_base_with_info_2` derives. -\cgalModels Because `Triangulation_face_base_with_info_2` derives from the class instantiating its third -parameter, it will be a model of the same face base concept as its parameter: -`TriangulationFaceBase_2`, `ConstrainedTriangulationFaceBase_2`, or `RegularTriangulationFaceBase_2` +\cgalModelsBare{Because `Triangulation_face_base_with_info_2` derives from the class instantiating its third +parameter\, it will be a model of the same face base concept as its parameter: +`TriangulationFaceBase_2`\, `ConstrainedTriangulationFaceBase_2`\, or `RegularTriangulationFaceBase_2`} \sa `CGAL::Triangulation_face_base_2` \sa `CGAL::Constrained_triangulation_face_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_hierarchy_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_hierarchy_2.h index 0d875329b445..4ce0d77cf0eb 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_hierarchy_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_hierarchy_2.h @@ -89,7 +89,7 @@ This design allows to use either the default vertex base class or a user customized vertex base with additional functionalities. -\cgalModels `TriangulationHierarchyVertexBase_2` +\cgalModels{TriangulationHierarchyVertexBase_2} \sa `TriangulationVertexBase_2` \sa `TriangulationHierarchyVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_2.h index fb5d21bd9641..97b1cbf3386e 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_2.h @@ -22,7 +22,7 @@ the triangulation. By default this parameter is instantiated by `Triangulation_ds_vertex_base_2<>`. -\cgalModels `TriangulationVertexBase_2` +\cgalModels{TriangulationVertexBase_2} \sa `CGAL::Triangulation_ds_vertex_base_2` \sa `CGAL::Triangulation_face_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h index 9d67764d749f..6be4bf7ee8e9 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h @@ -22,10 +22,10 @@ the triangulation. this parameter is instantiated by `Triangulation_vertex_base_2`. -\cgalModels `TriangulationVertexBaseWithInfo_2` -\cgalModels The parameter `Vb` is a model of some vertex base concept. +\cgalModelsBare{`TriangulationVertexBaseWithInfo_2`, + The parameter `Vb` is a model of some vertex base concept. `Triangulation_vertex_base_with_info_2` derives from `Vb` and will be a model of the -same vertex base concept: `TriangulationVertexBase_2`, or `RegularTriangulationVertexBase_2`. +same vertex base concept: `TriangulationVertexBase_2`\, or `RegularTriangulationVertexBase_2`.} \sa `CGAL::Triangulation_face_base_with_info_2` \sa `CGAL::Triangulation_vertex_base_2` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_3.h index dbfb816794c5..1536b61dea4e 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_3.h @@ -14,7 +14,7 @@ of Delaunay triangulations. By default, this parameter is instantiated by `Triangulation_cell_base_3`. -\cgalModels `DelaunayTriangulationCellBase_3` +\cgalModels{DelaunayTriangulationCellBase_3} \sa `DelaunayTriangulationCellBase_3` \sa `CGAL::Delaunay_triangulation_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h index 171084a21703..6eba490b6314 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Delaunay_triangulation_cell_base_with_circumcenter_3.h @@ -20,7 +20,7 @@ circumcenter. be a model of `DelaunayTriangulationCellBase_3`. It has the default value `Delaunay_triangulation_cell_base_3`. -\cgalModels `DelaunayTriangulationCellBase_3` +\cgalModels{DelaunayTriangulationCellBase_3} \sa `CGAL::Delaunay_triangulation_cell_base_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_3.h index 3d110a67cb2a..637595f1e253 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_3.h @@ -15,7 +15,7 @@ derives. It must be a model of `TriangulationCellBase_3`. By default, this parameter is instantiated by `Triangulation_cell_base_3`. -\cgalModels `RegularTriangulationCellBase_3` +\cgalModels{RegularTriangulationCellBase_3} \sa `RegularTriangulationCellBase_3` \sa `CGAL::Regular_triangulation_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h index 39d05eb11c69..cbf43c1610cc 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h @@ -20,7 +20,7 @@ circumcenter. be a model of `RegularTriangulationCellBase_3`. It has the default value `Regular_triangulation_cell_base_3`. -\cgalModels `RegularTriangulationCellBaseWithWeightedCircumcenter_3` +\cgalModels{RegularTriangulationCellBaseWithWeightedCircumcenter_3} \sa `CGAL::Triangulation_cell_base_3` \sa `CGAL::Triangulation_cell_base_with_info_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_euclidean_traits_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_euclidean_traits_3.h index 284b2f417a1b..725116fb1367 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_euclidean_traits_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_euclidean_traits_3.h @@ -13,7 +13,7 @@ compatibility, but ignores the template parameter `Weight`. \tparam Weight This template parameter is ignored, as `Kernel::Weighted_point_3` uses the type `Kernel::FT`. -\cgalModels `RegularTriangulationTraits_3` +\cgalModels{RegularTriangulationTraits_3} */ template< typename K, typename Weight > diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_vertex_base_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_vertex_base_3.h index a8bf33513169..fd4f6b601526 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_vertex_base_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Regular_triangulation_vertex_base_3.h @@ -24,7 +24,7 @@ the same as the point type defined by the geometric traits class. It must be a model of the `TriangulationDSVertexBase_3` concept. It has the default value `Triangulation_ds_vertex_base_3`. -\cgalModels `RegularTriangulationVertexBase_3` +\cgalModels{RegularTriangulationVertexBase_3} \sa `CGAL::Triangulation_cell_base_3` \sa `CGAL::Triangulation_ds_vertex_base_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_3.h index 555a1d62f845..8ce8ea1ca5d3 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_3.h @@ -20,7 +20,7 @@ It is actually not used by this class. It must be a model of the `TriangulationDSCellBase_3` concept. It has the default value `Triangulation_ds_cell_base_3`. -\cgalModels `TriangulationCellBase_3` +\cgalModels{TriangulationCellBase_3} \sa `CGAL::Triangulation_ds_cell_base_3` \sa `CGAL::Triangulation_cell_base_with_info_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_with_info_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_with_info_3.h index fd1d585cf8d1..533e1e4326f4 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_with_info_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_cell_base_with_info_3.h @@ -22,8 +22,7 @@ It must be a model of the `TriangulationCellBase_3` concept. It has the default value `Triangulation_cell_base_3`. -\cgalModels `TriangulationCellBase_3` -\cgalModels `TriangulationCellBaseWithInfo_3` +\cgalModels{TriangulationCellBase_3,TriangulationCellBaseWithInfo_3} \sa `CGAL::Triangulation_cell_base_3` \sa `CGAL::Triangulation_vertex_base_with_info_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_3.h index df4aa7dff5d9..457783e526e9 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_3.h @@ -24,7 +24,7 @@ the same as the point type defined by the geometric traits class. It must be a model of the `TriangulationDSVertexBase_3` concept. It has the default value `Triangulation_ds_vertex_base_3`. -\cgalModels `TriangulationVertexBase_3` +\cgalModels{TriangulationVertexBase_3} \sa `CGAL::Triangulation_cell_base_3` \sa `CGAL::Triangulation_ds_vertex_base_3` diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_with_info_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_with_info_3.h index f7fe50c0a851..f552bc5b12a8 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_with_info_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/Triangulation_vertex_base_with_info_3.h @@ -19,8 +19,7 @@ to a vertex. It has to be `DefaultConstructible` and `Assignable`. It must be a model of the `TriangulationVertexBase_3` concept. It has the default value `Triangulation_vertex_base_3`. -\cgalModels `TriangulationVertexBase_3` -\cgalModels `TriangulationVertexBaseWithInfo_3` +\cgalModels{TriangulationVertexBase_3,TriangulationVertexBaseWithInfo_3} \sa `CGAL::Triangulation_cell_base_with_info_3` \sa `CGAL::Triangulation_vertex_base_3` diff --git a/Triangulation_3/include/CGAL/Triangulation_segment_traverser_3.h b/Triangulation_3/include/CGAL/Triangulation_segment_traverser_3.h index 904421786ba2..13179bf214a5 100644 --- a/Triangulation_3/include/CGAL/Triangulation_segment_traverser_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_segment_traverser_3.h @@ -81,7 +81,7 @@ struct Incrementer { * * \tparam Tr_ is the triangulation type to traverse. * - * \cgalModels{ForwardIterator} + * \cgalModels{ForwardIterator} * * \sa `Triangulation_3` * \sa `Forward_circulator_base` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Delaunay_triangulation_on_sphere_traits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Delaunay_triangulation_on_sphere_traits_2.h index 2cbc69936b0a..5446ff6b33c2 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Delaunay_triangulation_on_sphere_traits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Delaunay_triangulation_on_sphere_traits_2.h @@ -27,7 +27,7 @@ and thus not inserted, or guaranteed to not be hidden upon insertion. \tparam LK a linear kernel type; it must be a model of `Kernel`. \tparam SK a spherical kernel type; it must be a model of `SphericalKernel` refining `LK`. -\cgalModels `DelaunayTriangulationOnSphereTraits_2` +\cgalModels{DelaunayTriangulationOnSphereTraits_2} \sa `CGAL::Projection_on_sphere_traits_3` */ diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Projection_on_sphere_traits_3.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Projection_on_sphere_traits_3.h index 5ae00ff27d46..411e06076165 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Projection_on_sphere_traits_3.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Projection_on_sphere_traits_3.h @@ -12,7 +12,7 @@ and the center of the sphere. \tparam LK a linear kernel type; must be a model of `Kernel`. \tparam SK a spherical kernel type; must be a model of `SphericalKernel`. -\cgalModels `DelaunayTriangulationOnSphereTraits_2` +\cgalModels{DelaunayTriangulationOnSphereTraits_2} \sa `CGAL::Delaunay_triangulation_on_sphere_traits_2` */ diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_face_base_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_face_base_2.h index f81b29f230eb..c48abfe09765 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_face_base_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_face_base_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgTriangulationOnSphere2VertexFaceClasses -\cgalModels `TriangulationOnSphereFaceBase_2` +\cgalModels{TriangulationOnSphereFaceBase_2} The class `Triangulation_on_sphere_face_base_2` is a model for the concept `TriangulationOnSphereFaceBase_2`. It is the default face base class diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_vertex_base_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_vertex_base_2.h index 17937c6dd228..1a41322ecc2b 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_vertex_base_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/CGAL/Triangulation_on_sphere_vertex_base_2.h @@ -3,7 +3,7 @@ namespace CGAL { /*! \ingroup PkgTriangulationOnSphere2VertexFaceClasses -\cgalModels `TriangulationOnSphereVertexBase_2` +\cgalModels{TriangulationOnSphereVertexBase_2} The class `Triangulation_on_sphere_vertex_base_2` is the default model for the concept `TriangulationOnSphereVertexBase_2` and diff --git a/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h index 3ad8ae611443..359d9109b6ea 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Rotational_sweep_visibility_2.h @@ -17,7 +17,7 @@ specified by one of the following: `#Tag_true` or `#Tag_false`, where `#Tag_fals -\cgalModels `Visibility_2` +\cgalModels{Visibility_2} \sa `CGAL::Simple_polygon_visibility_2` \sa `CGAL::Triangular_expansion_visibility_2` diff --git a/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h index f073ea8cc24b..37fd6c0e0a65 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Simple_polygon_visibility_2.h @@ -23,7 +23,7 @@ It must be an instance of `CGAL::Arrangement_2`, where its `CGAL::Arrangement_2: specified by one of the following: `#Tag_true` or `#Tag_false`, where `#Tag_false` is the default value. -\cgalModels `Visibility_2` +\cgalModels{Visibility_2} \sa `CGAL::Rotational_sweep_visibility_2` \sa `CGAL::Triangular_expansion_visibility_2` diff --git a/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h b/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h index 178a812957dc..0b1d37bbb683 100644 --- a/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h +++ b/Visibility_2/doc/Visibility_2/CGAL/Triangular_expansion_visibility_2.h @@ -17,7 +17,7 @@ It must be an instance of `CGAL::Arrangement_2`, where its `CGAL::Arrangement_2: \tparam RegularizationCategory indicates whether the output should be regularized. It can be specified by one of the following: `#Tag_true` or `#Tag_false`, where `#Tag_false` is the default value. -\cgalModels `Visibility_2` +\cgalModels{Visibility_2} \sa `CGAL::Simple_polygon_visibility_2` \sa `CGAL::Rotational_sweep_visibility_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_policies_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_policies_2.h index 8a1415c98130..187b7975472d 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_policies_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_policies_2.h @@ -12,7 +12,7 @@ caches the results of the edge and face rejectors and results in a Voronoi diagram that has no degenerate features, i.e., no Voronoi edges of zero length and no Voronoi faces of zero area. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` @@ -51,7 +51,7 @@ results in a Voronoi diagram that has no degenerate features, i.e., it has no Voronoi edges of zero length and no Voronoi faces of zero area. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_traits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_traits_2.h index 1775a2f3d5a1..2305ef96b453 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_traits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Apollonius_graph_adaptation_traits_2.h @@ -9,7 +9,7 @@ concept. The template parameter of the `Apollonius_graph_adaptation_traits_2` cl model of the `DelaunayGraph_2` concept, and in particular it has the semantics of a (triangulated) 2D Apollonius graph. -\cgalModels `AdaptationTraits_2` +\cgalModels{AdaptationTraits_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_policies_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_policies_2.h index 15be0f7a0cd8..ede61736fb03 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_policies_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_policies_2.h @@ -12,7 +12,7 @@ caches the results of the edge and face rejectors and results in a Voronoi diagram that has no degenerate features, i.e., no Voronoi edges of zero length. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` @@ -49,7 +49,7 @@ the semantics of a (triangulated) 2D Delaunay triangulation. This policy results in a Voronoi diagram that has no degenerate features, i.e., it has no Voronoi edges of zero length. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_traits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_traits_2.h index b5f085f1614e..2473f8e8f52f 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_traits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Delaunay_triangulation_adaptation_traits_2.h @@ -9,7 +9,7 @@ concept. The template parameter of the `Delaunay_triangulation_adaptation_traits model of the `DelaunayGraph_2` concept, and in particular it has the semantics of a 2D Delaunay triangulation. -\cgalModels `AdaptationTraits_2` +\cgalModels{AdaptationTraits_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Identity_policy_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Identity_policy_2.h index d373e060c742..ee166aad8c5f 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Identity_policy_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Identity_policy_2.h @@ -18,7 +18,7 @@ Delaunay graph, that is adapted, allows for site insertions through an `AT::Site_2`. The site inserter functor provided by this policy uses the aforementioned `insert` method. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_policies_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_policies_2.h index 768fee14c62b..d4398de71f78 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_policies_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_policies_2.h @@ -12,7 +12,7 @@ caches the results of the edge and face rejectors and results in a Voronoi diagram that has no degenerate features, i.e., no Voronoi edges of zero length. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` @@ -49,7 +49,7 @@ the semantics of a (triangulated) 2D regular triangulation. This policy results in a power diagram that has no degenerate features, i.e., it has no Voronoi edges of zero length. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_traits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_traits_2.h index 0eb0e4ed6e77..345e8e710d01 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_traits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Regular_triangulation_adaptation_traits_2.h @@ -9,7 +9,7 @@ concept. The template parameter of the `Regular_triangulation_adaptation_traits_ model of the `DelaunayGraph_2` concept, and in particular it has the semantics of a 2D regular triangulation. -\cgalModels `AdaptationTraits_2` +\cgalModels{AdaptationTraits_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_policies_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_policies_2.h index 4c88ca2862da..0baa77ee873e 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_policies_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_policies_2.h @@ -12,7 +12,7 @@ caches the results of the edge and face rejectors and results in a Voronoi diagram that has no degenerate features, i.e., no Voronoi edges of zero length and no Voronoi faces of zero area. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` @@ -51,7 +51,7 @@ results in a Voronoi diagram that has no degenerate features, i.e., it has no Voronoi edges of zero length and no Voronoi faces of zero area. -\cgalModels `AdaptationPolicy_2` +\cgalModels{AdaptationPolicy_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_traits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_traits_2.h index e665e0210fd5..680dd8b1ea00 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_traits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Segment_Delaunay_graph_adaptation_traits_2.h @@ -9,7 +9,7 @@ concept. The template parameter of the `Segment_Delaunay_graph_adaptation_traits model of the `DelaunayGraph_2` concept, and in particular it has the semantics of the 2D (triangulated) segment Delaunay graph. -\cgalModels `AdaptationTraits_2` +\cgalModels{AdaptationTraits_2} \sa `AdaptationTraits_2` \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h index e0dd1cdc4616..98b44b7a2289 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/Voronoi_diagram_2.h @@ -39,11 +39,7 @@ class Voronoi_diagram_2 { `Voronoi_diagram_2` class for Voronoi faces. Below we present its interface. - \cgalModels `DefaultConstructible` - \cgalModels `CopyConstructible` - \cgalModels `Assignable` - \cgalModels `EqualityComparable` - \cgalModels `LessThanComparable` + \cgalModels{DefaultConstructible,CopyConstructible,Assignable,EqualityComparable,LessThanComparable} \sa `CGAL::Voronoi_diagram_2` \sa \link CGAL::Voronoi_diagram_2::Vertex `CGAL::Voronoi_diagram_2::Vertex` \endlink @@ -167,11 +163,7 @@ class Voronoi_diagram_2 { `Voronoi_diagram_2` class for Voronoi halfedges. Below we present its interface. - \cgalModels `DefaultConstructible` - \cgalModels `CopyConstructible` - \cgalModels `Assignable` - \cgalModels `EqualityComparable` - \cgalModels `LessThanComparable` + \cgalModels{DefaultConstructible,CopyConstructible,Assignable,EqualityComparable,LessThanComparable} \sa `CGAL::Voronoi_diagram_2` \sa \link CGAL::Voronoi_diagram_2::Vertex `CGAL::Voronoi_diagram_2::Vertex` \endlink @@ -407,11 +399,7 @@ class Voronoi_diagram_2 { The class `Vertex` is the Voronoi vertex class provided by the class `Voronoi_diagram_2` class. Below we present its interface. - \cgalModels `DefaultConstructible` - \cgalModels `CopyConstructible` - \cgalModels `Assignable`, - \cgalModels `EqualityComparable` - \cgalModels `LessThanComparable` + \cgalModels{DefaultConstructible,CopyConstructible,Assignable,,EqualityComparable,LessThanComparable} \sa `CGAL::Voronoi_diagram_2` \sa \link CGAL::Voronoi_diagram_2::Halfedge `CGAL::Voronoi_diagram_2::Halfedge` \endlink diff --git a/Weights/include/CGAL/Weights/discrete_harmonic_weights.h b/Weights/include/CGAL/Weights/discrete_harmonic_weights.h index 6faa6f189c41..9a4243fdd5d1 100644 --- a/Weights/include/CGAL/Weights/discrete_harmonic_weights.h +++ b/Weights/include/CGAL/Weights/discrete_harmonic_weights.h @@ -142,7 +142,7 @@ typename Kernel::FT discrete_harmonic_weight(const CGAL::Point_3& p0, \tparam PointMap a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and value type is `Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `BarycentricWeights_2` + \cgalModels{BarycentricWeights_2} */ template& p0, \tparam PointMap a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and value type is `Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `BarycentricWeights_2` + \cgalModels{BarycentricWeights_2} */ template& p0, \tparam PointMap a model of `ReadablePropertyMap` whose key type is `VertexRange::value_type` and value type is `Point_2`. The default is `CGAL::Identity_property_map`. - \cgalModels `BarycentricWeights_2` + \cgalModels{BarycentricWeights_2} */ template Date: Sun, 9 Jul 2023 13:04:05 +0200 Subject: [PATCH 0477/1398] Consistency of terms Based on a remark in https://github.com/CGAL/cgal/pull/7576#issuecomment-1621587888 aslo changed here some names for consistency --- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 6 +++--- Documentation/doc/resources/1.9.6/BaseDoxyfile.in | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index ae2cc84f6c17..6cb51b732278 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -159,9 +159,9 @@ ALIASES = "cgal=%CGAL" \ "cgalPkgSince{1}=Introduced in: \cgal \1
    " \ "cgalPkgDependsOn{1}=Depends on: \1
    " \ "cgalPkgLicense{1}=License: \1
    " \ - "cgalPkgDemo{2}=Windows Demo: \1
    Common Demo Dlls: dlls
    " \ - "cgalPkgDemo{4}=Windows Demos: \1, \3
    Common Demo Dlls: dlls
    " \ - "cgalPkgDemo{6}=Windows Demos: \1, \3, \5
    Common Demo Dlls: dlls
    " \ + "cgalPkgDemo{2}=Windows demo: \1
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{4}=Windows demos: \1, \3
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{6}=Windows demos: \1, \3, \5
    Common demo dlls: dlls
    " \ "cgalPkgDescriptionEnd=" \ "cgalModifBegin=\htmlonly
    \endhtmlonly \xrefitem Modification \"Modifications\" \"MODIFICATIONS\" " \ "cgalModifEnd=\htmlonly
    \endhtmlonly \latexonly END MODIFICATIONS \endlatexonly" \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 1cfd0a6ffd9f..1ea10418fe11 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -168,9 +168,9 @@ ALIASES = "cgal=%CGAL" \ "cgalPkgSince{1}=Introduced in: \cgal \1
    " \ "cgalPkgDependsOn{1}=Depends on: \1
    " \ "cgalPkgLicense{1}=License: \1
    " \ - "cgalPkgDemo{2}=Windows Demo: \1
    Common Demo Dlls: dlls
    " \ - "cgalPkgDemo{4}=Windows Demos: \1, \3
    Common Demo Dlls: dlls
    " \ - "cgalPkgDemo{6}=Windows Demos: \1, \3, \5
    Common Demo Dlls: dlls
    " \ + "cgalPkgDemo{2}=Windows demo: \1
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{4}=Windows demos: \1, \3
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{6}=Windows demos: \1, \3, \5
    Common demo dlls: dlls
    " \ "cgalPkgDescriptionEnd=" \ "cgalModifBegin=\htmlonly
    \endhtmlonly \xrefitem Modification \"Modifications\" \"MODIFICATIONS\"" \ "cgalModifEnd=\htmlonly
    \endhtmlonly \latexonly END MODIFICATIONS \endlatexonly" \ From faafc6453f7a1773b9fb94563a2ae86d94fd311a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 11 Jul 2023 18:15:34 +0200 Subject: [PATCH 0478/1398] add a missing check --- Scripts/developer_scripts/run_testsuite_with_ctest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Scripts/developer_scripts/run_testsuite_with_ctest b/Scripts/developer_scripts/run_testsuite_with_ctest index 723b3938d2ce..43674242e987 100644 --- a/Scripts/developer_scripts/run_testsuite_with_ctest +++ b/Scripts/developer_scripts/run_testsuite_with_ctest @@ -414,6 +414,13 @@ run_test_on_host() fi for PLATFORM in ${PLATFORMS}; do + + if [ "${CGAL_RELEASE_ID}" \> "CGAL-6.0" ]; then + if [ "${PLATFORM}" = "MSVC2015-Release-64bits" ]; then + continue + fi + fi + run_test_on_platform "${PLATFORM}" collect_demos_binaries "${PLATFORM}" publish_results "${PLATFORM}" From ff2f100d2380fa9ddfb5b32cbaabaa6de10a1451 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 12 Jul 2023 10:37:14 +0200 Subject: [PATCH 0479/1398] ImageInterface.ui moved by PR #7313 --- .reuse/dep5 | 2 +- Installation/.reuse/dep5 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.reuse/dep5 b/.reuse/dep5 index 62552ffe07cc..06784d71d6b2 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -7,6 +7,6 @@ Files: .* *.cmake *.md .github/* Maintenance/* */TODO */doc/* */deb/* */applicat Copyright: 1995-2023 The CGAL Project License: CC0-1.0 -Files: CMakeLists.txt GraphicsView/include/CGAL/Qt/resources/ImageInterface.ui GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm Installation/AUTHORS Installation/CMakeLists.txt Installation/README Installation/auxiliary/cgal_create_cmake_script.1 Installation/auxiliary/gmp/README Installation/include/CGAL/license/gpl_package_list.txt MacOSX/auxiliary/cgal_app.icns copyright +Files: CMakeLists.txt GraphicsView/include/CGAL/Qt/ImageInterface.ui GraphicsView/include/CGAL/Qt/resources/qglviewer-icon.xpm Installation/AUTHORS Installation/CMakeLists.txt Installation/README Installation/auxiliary/cgal_create_cmake_script.1 Installation/auxiliary/gmp/README Installation/include/CGAL/license/gpl_package_list.txt MacOSX/auxiliary/cgal_app.icns copyright Copyright: 1995-2023 The CGAL Project License: CC0-1.0 diff --git a/Installation/.reuse/dep5 b/Installation/.reuse/dep5 index 68f659f36af5..ef2e017a3975 100644 --- a/Installation/.reuse/dep5 +++ b/Installation/.reuse/dep5 @@ -7,6 +7,6 @@ Files: *.cmake *.md doc/* doc_html/* scripts/* developer_scripts/* package_info/ Copyright: 1995-2023 The CGAL Project License: CC0-1.0 -Files: include/CGAL/Qt/resources/ImageInterface.ui include/CGAL/Qt/resources/qglviewer-icon.xpm AUTHORS CMakeLists.txt README auxiliary/cgal_create_cmake_script.1 auxiliary/gmp/README include/CGAL/license/gpl_package_list.txt auxiliary/cgal_app.icns copyright VERSION +Files: include/CGAL/Qt/ImageInterface.ui include/CGAL/Qt/resources/qglviewer-icon.xpm AUTHORS CMakeLists.txt README auxiliary/cgal_create_cmake_script.1 auxiliary/gmp/README include/CGAL/license/gpl_package_list.txt auxiliary/cgal_app.icns copyright VERSION Copyright: 1995-2023 The CGAL Project License: CC0-1.0 From b9d098c7a9db68e783f898adbfd6a83e19227ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 12 Jul 2023 11:02:03 +0200 Subject: [PATCH 0480/1398] add extra missing renaming --- Triangulation/doc/Triangulation/Triangulation.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index b64ad247c361..ef305af708ae 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -368,14 +368,14 @@ there are (at least) two possibilities: The first is to iterate over the full cells of the triangulation and check if they are infinite or not: -\cgalExample{triangulation1.cpp} +\cgalExample{triangulation1.h} A second possibility is to ask the triangulation to gather all the full cells incident to the infinite vertex: they form precisely the set of infinite full cells: -\cgalExample{triangulation2.cpp} +\cgalExample{triangulation2.h} One important difference between the two examples above is that the first uses little memory but traverses all the full cells, while the second From cc41b541160e3cc1e40da4f397e19caf1b1c3fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 12 Jul 2023 13:31:13 +0200 Subject: [PATCH 0481/1398] remove extra comment begin --- .../Arrangement_on_surface_2/CGAL/Arr_point_location_result.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h index ed8cc09f5d06..2a48e35b399b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h @@ -1,5 +1,3 @@ -/*! - namespace CGAL { /*! From 6fbbb70b20906cfc7d7e6f0ec5a2272d92071cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 14:39:03 +0200 Subject: [PATCH 0482/1398] Generalize FFG doc: the selection's value_type needs not be faces_size_type --- .../CGAL/boost/graph/Face_filtered_graph.h | 82 +++++++++---------- BGL/test/BGL/test_Face_filtered_graph.cpp | 2 +- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index e6f4136481d9..a412755576e9 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -162,15 +162,14 @@ struct Face_filtered_graph /*! * \brief Constructor where the set of selected faces is specified as a range of patch ids. * - * \tparam FacePatchIndexMap a model of `ReadablePropertyMap` with - `face_descriptor` as key type and - `graph_traits::%faces_size_type` as value type. - * \tparam FacePatchIndexRange a model of `ConstRange` with `boost::property_traits::%value_type` as value type. + * \tparam FacePatchIDMap a model of `ReadablePropertyMap` with `face_descriptor` as key type + * and whose value type is a model of `Hashable`. + * \tparam FacePatchIDRange a model of `ConstRange` with `boost::property_traits::%value_type` as value type. * \tparam NamedParameters a sequence of named parameters * * \param graph the underlying graph - * \param face_patch_index_map the property map that assigns a patch index to each face - * \param selected_face_patch_indices a range of the face patch indices to select + * \param face_patch_id_map the property map that assigns a patch index to each face + * \param selected_face_patch_ids a range of the face patch indices to select * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -208,14 +207,14 @@ struct Face_filtered_graph * \cgalParamNEnd * \cgalNamedParamsEnd */ - template + template Face_filtered_graph(const Graph& graph, - const FacePatchIndexRange& selected_face_patch_indices, - FacePatchIndexMap face_patch_index_map, + const FacePatchIDRange& selected_face_patch_ids, + FacePatchIDMap face_patch_id_map, const CGAL_NP_CLASS& np #ifndef DOXYGEN_RUNNING , std::enable_if_t< - boost::has_range_const_iterator::value + boost::has_range_const_iterator::value >* = 0 #endif ) @@ -224,15 +223,15 @@ struct Face_filtered_graph vimap(CGAL::get_initialized_vertex_index_map(graph, np)), himap(CGAL::get_initialized_halfedge_index_map(graph, np)) { - set_selected_faces(selected_face_patch_indices, face_patch_index_map); + set_selected_faces(selected_face_patch_ids, face_patch_id_map); } - template + template Face_filtered_graph(const Graph& graph, - const FacePatchIndexRange& selected_face_patch_indices, - FacePatchIndexMap face_patch_index_map + const FacePatchIDRange& selected_face_patch_ids, + FacePatchIDMap face_patch_id_map , std::enable_if_t< - boost::has_range_const_iterator::value + boost::has_range_const_iterator::value >* = 0 ) : _graph(const_cast(graph)), @@ -240,19 +239,18 @@ struct Face_filtered_graph vimap(CGAL::get_initialized_vertex_index_map(graph)), himap(CGAL::get_initialized_halfedge_index_map(graph)) { - set_selected_faces(selected_face_patch_indices, face_patch_index_map); + set_selected_faces(selected_face_patch_ids, face_patch_id_map); } /*! * \brief Constructor where the set of selected faces is specified as a patch id. * - * \tparam FacePatchIndexMap a model of `ReadablePropertyMap` with - `face_descriptor` as key type and - `graph_traits::%faces_size_type` as value type. + * \tparam FacePatchIDMap a model of `ReadablePropertyMap` with `face_descriptor` as key type + * and whose value type is a model of `Hashable`. * \tparam NamedParameters a sequence of named parameters * * \param graph the underlying graph. - * \param face_patch_index_map the property map that assigns a patch index to each face - * \param selected_face_patch_index the index of the face patch selected + * \param face_patch_id_map the property map that assigns a patch index to each face + * \param selected_face_patch_id the index of the face patch selected * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -290,29 +288,29 @@ struct Face_filtered_graph * \cgalParamNEnd * \cgalNamedParamsEnd */ - template + template Face_filtered_graph(const Graph& graph, - typename boost::property_traits::value_type selected_face_patch_index, - FacePatchIndexMap face_patch_index_map, + typename boost::property_traits::value_type selected_face_patch_id, + FacePatchIDMap face_patch_id_map, const CGAL_NP_CLASS& np) : _graph(const_cast(graph)), fimap(CGAL::get_initialized_face_index_map(graph, np)), vimap(CGAL::get_initialized_vertex_index_map(graph, np)), himap(CGAL::get_initialized_halfedge_index_map(graph, np)) { - set_selected_faces(selected_face_patch_index, face_patch_index_map); + set_selected_faces(selected_face_patch_id, face_patch_id_map); } - template + template Face_filtered_graph(const Graph& graph, - typename boost::property_traits::value_type pid, - FacePatchIndexMap face_patch_index_map) + typename boost::property_traits::value_type pid, + FacePatchIDMap face_patch_id_map) : _graph(const_cast(graph)), fimap(CGAL::get_initialized_face_index_map(graph)), vimap(CGAL::get_initialized_vertex_index_map(graph)), himap(CGAL::get_initialized_halfedge_index_map(graph)) { - set_selected_faces(pid, face_patch_index_map); + set_selected_faces(pid, face_patch_id_map); } /*! @@ -438,9 +436,9 @@ struct Face_filtered_graph } /// changes the set of selected faces using a patch id. - template - void set_selected_faces(typename boost::property_traits::value_type face_patch_id, - FacePatchIndexMap face_patch_index_map) + template + void set_selected_faces(typename boost::property_traits::value_type face_patch_id, + FacePatchIDMap face_patch_id_map) { selected_faces.resize(num_faces(_graph)); selected_vertices.resize(num_vertices(_graph)); @@ -452,7 +450,7 @@ struct Face_filtered_graph for(face_descriptor fd : faces(_graph) ) { - if(get(face_patch_index_map, fd) == face_patch_id) + if(get(face_patch_id_map, fd) == face_patch_id) { selected_faces.set(get(fimap, fd)); for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, _graph), _graph)) @@ -467,12 +465,12 @@ struct Face_filtered_graph reset_indices(); } /// changes the set of selected faces using a range of patch ids - template - void set_selected_faces(const FacePatchIndexRange& selected_face_patch_indices, - FacePatchIndexMap face_patch_index_map + template + void set_selected_faces(const FacePatchIDRange& selected_face_patch_ids, + FacePatchIDMap face_patch_id_map #ifndef DOXYGEN_RUNNING , std::enable_if_t< - boost::has_range_const_iterator::value + boost::has_range_const_iterator::value >* = 0 #endif ) @@ -485,13 +483,13 @@ struct Face_filtered_graph selected_vertices.reset(); selected_halfedges.reset(); - typedef typename boost::property_traits::value_type Patch_index; - std::unordered_set pids(std::begin(selected_face_patch_indices), - std::end(selected_face_patch_indices)); + typedef typename boost::property_traits::value_type Patch_ID; + std::unordered_set pids(std::begin(selected_face_patch_ids), + std::end(selected_face_patch_ids)); - for(face_descriptor fd : faces(_graph) ) + for(face_descriptor fd : faces(_graph)) { - if(pids.count(get(face_patch_index_map, fd)) != 0) + if(pids.count(get(face_patch_id_map, fd)) != 0) { selected_faces.set(get(fimap, fd)); for(halfedge_descriptor hd : halfedges_around_face(halfedge(fd, _graph), _graph)) diff --git a/BGL/test/BGL/test_Face_filtered_graph.cpp b/BGL/test/BGL/test_Face_filtered_graph.cpp index 5dd6521bb02f..3cd95dc56684 100644 --- a/BGL/test/BGL/test_Face_filtered_graph.cpp +++ b/BGL/test/BGL/test_Face_filtered_graph.cpp @@ -20,7 +20,7 @@ typedef std::unordered_set id_map; namespace PMP = CGAL::Polygon_mesh_processing; template -void test_halfedge_around_vertex_iterator(const Graph& g) +void test_halfedge_around_vertex_iterator(const Graph& g) { typedef typename boost::graph_traits::face_descriptor g_face_descriptor; typedef CGAL::Face_filtered_graph Adapter; From 7d86ca5b95d1f96900ea7642062da92acfcb9dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 14:40:31 +0200 Subject: [PATCH 0483/1398] Test FFG constructors more thoroughly --- BGL/test/BGL/test_Face_filtered_graph.cpp | 68 ++++++++++++++++++----- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/BGL/test/BGL/test_Face_filtered_graph.cpp b/BGL/test/BGL/test_Face_filtered_graph.cpp index 3cd95dc56684..551685e89b8a 100644 --- a/BGL/test/BGL/test_Face_filtered_graph.cpp +++ b/BGL/test/BGL/test_Face_filtered_graph.cpp @@ -319,17 +319,42 @@ void test_index_property_maps(const Graph& g) } template -void test_read(const Graph& g) +void test_constructors(const Graph& g) { typedef typename boost::graph_traits::face_descriptor g_face_descriptor; typedef CGAL::Face_filtered_graph Adapter; CGAL_GRAPH_TRAITS_MEMBERS(Adapter); + Adapter fg0(g); + Adapter fg1(g, CGAL::parameters::all_default()); + std::map map; PMP::connected_components(g, boost::make_assoc_property_map(map)); Adapter fg(g, 0, boost::make_assoc_property_map(map)); assert(fg.is_selection_valid()); assert(CGAL::is_valid_polygon_mesh(fg)); + + // patch ID type that is not a fundamental type + std::map colors; + for(auto f : faces(fg)) + colors[f] = CGAL::IO::blue(); + auto color_map = boost::make_assoc_property_map(colors); + Adapter color_fg(g, CGAL::IO::blue(), color_map); + assert(color_fg.is_selection_valid()); + assert(CGAL::is_valid_polygon_mesh(color_fg)); + assert(num_faces(g) == num_faces(color_fg)); + + Adapter color_fg2(g, CGAL::IO::red(), color_map, CGAL::parameters::all_default()); + assert(color_fg2.is_selection_valid()); + assert(CGAL::is_valid_polygon_mesh(color_fg2)); + assert(num_faces(color_fg2) == 0); + + // range of non-fundamental ID types + std::vector selected_colors { CGAL::IO::blue(), CGAL::IO::red() }; + Adapter color_fg3(g, selected_colors, color_map); + assert(color_fg3.is_selection_valid()); + assert(CGAL::is_valid_polygon_mesh(color_fg3)); + assert(num_faces(g) == num_faces(color_fg3)); } template @@ -338,7 +363,7 @@ test_graph_range(const std::vector& graphs) { for(Graph p : graphs) { - test_read(p); + test_constructors(p); test_vertex_iterators(p); test_out_edges(p); test_in_edges(p); @@ -500,20 +525,8 @@ void test_invalid_selections() assert(!many_umbrellas_fg.is_selection_valid()); } -int main() +void test_SM_tetrahedron() { - test_graph_range(poly_data()); - -#ifdef CGAL_USE_SURFACE_MESH - test_graph_range(sm_data()); -#endif - -#ifdef CGAL_USE_OPENMESH - test_graph_range(omesh_data()); -#endif - - test_invalid_selections(); - // Make a tetrahedron and test the adapter for a patch that only contains 2 faces typedef CGAL::Face_filtered_graph SM_Adapter; typedef SM::Property_map::face_descriptor , std::size_t> SM_FCCMap; @@ -531,7 +544,10 @@ int main() pids.insert(2); SM_Adapter sm_adapter(*sm, pids, fccmap); test_mesh(sm_adapter); +} +void test_Polyhedron_tetrahedron() +{ typedef boost::graph_traits PolyTraits; typedef boost::property_map::const_type VPMap; typedef PolyTraits::face_descriptor poly_face_descriptor; @@ -550,6 +566,9 @@ int main() std::map fc_map; FCMap poly_fccmap(fc_map); + std::unordered_set pids; + pids.insert(0); + pids.insert(2); VPMap vpmap = get(boost::vertex_point, *poly); PMP::connected_components(*poly, poly_fccmap, CGAL::parameters::edge_is_constrained_map(Constraint(*poly, vpmap)) @@ -560,3 +579,22 @@ int main() .halfedge_index_map(poly_himap)); test_mesh(poly_adapter); } + +int main(int, char**) +{ + test_graph_range(poly_data()); +#ifdef CGAL_USE_SURFACE_MESH + test_graph_range(sm_data()); +#endif +#ifdef CGAL_USE_OPENMESH + test_graph_range(omesh_data()); +#endif + + test_invalid_selections(); + + test_SM_tetrahedron(); + test_Polyhedron_tetrahedron(); + + std::cout << "Done" << std::endl; + return EXIT_SUCCESS; +} From 09a6a3e1c7a816959b58bd6980195f7378406c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 14:40:47 +0200 Subject: [PATCH 0484/1398] Add a hash for CGAL::IO::Color --- Stream_support/include/CGAL/IO/Color.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Stream_support/include/CGAL/IO/Color.h b/Stream_support/include/CGAL/IO/Color.h index 6cb2939fe493..daee2d37b403 100644 --- a/Stream_support/include/CGAL/IO/Color.h +++ b/Stream_support/include/CGAL/IO/Color.h @@ -19,12 +19,13 @@ #include #include + +#include + #include #include #include - - namespace CGAL { namespace IO { @@ -287,7 +288,6 @@ class Color } /// @} - }; @@ -375,6 +375,22 @@ using IO::white; using IO::yellow; #endif -} //namespace CGAL +} // namespace CGAL + +namespace std { + +template <> +struct hash +{ + std::size_t operator()(const CGAL::IO::Color& c) const + { + std::size_t result = boost::hash_value(c[0]); + for(std::size_t i=1; i<4; ++i) + boost::hash_combine(result, c[i]); + return result; + } +}; + +} // namespace std #endif // CGAL_COLOR_H From 5cc57d4c5885748de0dfbc8c054aaceaa54c6c2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 14:45:29 +0200 Subject: [PATCH 0485/1398] Minor doc fix --- BGL/include/CGAL/boost/graph/Face_filtered_graph.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index a412755576e9..28afe86c27a6 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -168,8 +168,8 @@ struct Face_filtered_graph * \tparam NamedParameters a sequence of named parameters * * \param graph the underlying graph - * \param face_patch_id_map the property map that assigns a patch index to each face - * \param selected_face_patch_ids a range of the face patch indices to select + * \param face_patch_id_map the property map that assigns a patch ID to each face + * \param selected_face_patch_ids a range of the face patch identifiers to select * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin @@ -249,8 +249,8 @@ struct Face_filtered_graph * \tparam NamedParameters a sequence of named parameters * * \param graph the underlying graph. - * \param face_patch_id_map the property map that assigns a patch index to each face - * \param selected_face_patch_id the index of the face patch selected + * \param face_patch_id_map the property map that assigns a patch ID to each face + * \param selected_face_patch_id the identifier of the face patch selected * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin From 39983615cd2e977b1faea7f1ea9a25ae2300eae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 15:57:35 +0200 Subject: [PATCH 0486/1398] Remove unused variable --- .../demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp index 4de8e8fe41f4..7ba691b6cf14 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp @@ -137,7 +137,6 @@ class Scene_heat_item auto vpm = CGAL::get(CGAL::vertex_point, *sm); auto vnormals = sm->property_map("v:normal").first; - auto fnormals = sm->property_map("f:normal").first; auto [vcolors, vcolors_found] = sm->property_map("v:color"); CGAL_assertion(vcolors_found); From 852056a8acf440887b4621a0fe868ef04f0222a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 12 Jul 2023 16:16:42 +0200 Subject: [PATCH 0487/1398] Rephrase documentation of one-sided Haussdorff distance function --- .../include/CGAL/Polygon_mesh_processing/distance.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 85c78461d73d..f109adcfa0c8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -2455,9 +2455,8 @@ bounded_error_squared_Hausdorff_distance_naive_impl(const TriangleMesh1& tm1, /** * \ingroup PMP_distance_grp * - * returns an estimate on the Hausdorff distance between `tm1` and `tm2` that - * is at most `error_bound` away from the actual Hausdorff distance between - * the two given meshes. + * returns an estimate on the Hausdorff distance from `tm1` to `tm2` that + * is at most `error_bound` away from the actual Hausdorff distance from `tm1` to `tm2`. * * @tparam Concurrency_tag enables sequential versus parallel algorithm. * Possible values are `Sequential_tag` and `Parallel_tag`. From 58ef28b8e1a78e2aee3fc988830e36978315baf1 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 13 Jul 2023 11:48:37 +0200 Subject: [PATCH 0488/1398] Update after #7441 Since PR https://github.com/CGAL/cgal/pull/7441 the tested versions of Doxygen are changed from: - 1.8.4, - 1.8.13, - master, to: - 1.8.13, - 1.9.6 - master See https://github.com/CGAL/cgal/pull/7441/files#diff-20378a17af64de2d537c278603e389b4c15fe31670621544caa850fa233ea1deR83-R84 This commit preserve the choice of Doxygen 1.8.13 as the default one for published versions of the CGAL documentation. --- Maintenance/public_release/scripts/prepare_release | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maintenance/public_release/scripts/prepare_release b/Maintenance/public_release/scripts/prepare_release index 889c7e99da3e..69c14d861339 100755 --- a/Maintenance/public_release/scripts/prepare_release +++ b/Maintenance/public_release/scripts/prepare_release @@ -42,12 +42,12 @@ printf "Copy documentation to doc_html/ and doc_html_online/...\n" [ -d "/srv/CGAL/www/${PUBLIC_RELEASE_NAME#CGAL-}/Manual" ] || mkdir -p "/srv/CGAL/www/${PUBLIC_RELEASE_NAME#CGAL-}/Manual" cp "$PUBLIC_RELEASE_DIR"/*(.) "${RELEASE_CANDIDATES_DIR}/$PUBLIC_RELEASE_NAME" -files=("$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output2/*) +files=("$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output1/*) if ((${#files[@]} == 0)); then printf "ERROR: documentation files are missing\n" error_code=1 else - rsync -a --exclude xml "$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output2/* "$DEST_DIR/doc_html/" + rsync -a --exclude xml "$MANUAL_TESTS_DIR/$INTERNAL_RELEASE"/output1/* "$DEST_DIR/doc_html/" pushd "$DEST_DIR/doc_html/Manual/search" for i in g n c s i; do sed -i "s/..\/BGL$i/..\/BGL\/$i/g" *; done popd From b9819d55fcf998d4bbcb2643c64b49becd409914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 13 Jul 2023 17:49:34 +0200 Subject: [PATCH 0489/1398] Keep up with the ever-changing moods of the Named Parameters committee :> --- BGL/test/BGL/test_Face_filtered_graph.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BGL/test/BGL/test_Face_filtered_graph.cpp b/BGL/test/BGL/test_Face_filtered_graph.cpp index 551685e89b8a..ee4f2166439b 100644 --- a/BGL/test/BGL/test_Face_filtered_graph.cpp +++ b/BGL/test/BGL/test_Face_filtered_graph.cpp @@ -326,7 +326,7 @@ void test_constructors(const Graph& g) CGAL_GRAPH_TRAITS_MEMBERS(Adapter); Adapter fg0(g); - Adapter fg1(g, CGAL::parameters::all_default()); + Adapter fg1(g, CGAL::parameters::default_values()); std::map map; PMP::connected_components(g, boost::make_assoc_property_map(map)); @@ -344,7 +344,7 @@ void test_constructors(const Graph& g) assert(CGAL::is_valid_polygon_mesh(color_fg)); assert(num_faces(g) == num_faces(color_fg)); - Adapter color_fg2(g, CGAL::IO::red(), color_map, CGAL::parameters::all_default()); + Adapter color_fg2(g, CGAL::IO::red(), color_map, CGAL::parameters::default_values()); assert(color_fg2.is_selection_valid()); assert(CGAL::is_valid_polygon_mesh(color_fg2)); assert(num_faces(color_fg2) == 0); From 4e5578d46900fa4dacab38298c640b58c47cfbfc Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 15 Jul 2023 13:12:15 +0200 Subject: [PATCH 0490/1398] issue #7395 Improvement of layout of model relations - based on review --- .../doc/AABB_tree/Concepts/AABBGeomTraits.h | 2 + .../doc/AABB_tree/Concepts/AABBPrimitive.h | 11 ++-- .../Concepts/AABBPrimitiveWithSharedData.h | 7 +- .../Concepts/AABBRayIntersectionGeomTraits.h | 2 + .../Concepts/AABBRayIntersectionTraits.h | 3 +- AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h | 3 +- ...ancingFrontSurfaceReconstructionTraits_3.h | 2 + .../Concepts/AlgebraicStructureTraits.h | 3 +- .../Concepts/FieldNumberType.h | 21 +++--- .../Concepts/FractionTraits.h | 3 +- .../Concepts/FromIntConstructible.h | 7 +- .../Concepts/RealEmbeddableTraits.h | 3 +- .../Concepts/RingNumberType.h | 26 ++++---- .../Concepts/AlgebraicKernel_d_1.h | 5 +- .../Concepts/AlphaShapeFace_2.h | 3 +- .../Concepts/AlphaShapeTraits_2.h | 5 +- .../Concepts/AlphaShapeVertex_2.h | 2 + .../Concepts/WeightedAlphaShapeTraits_2.h | 5 +- .../Concepts/AlphaShapeCell_3.h | 2 + .../Concepts/AlphaShapeTraits_3.h | 2 + .../Concepts/AlphaShapeVertex_3.h | 2 + .../Concepts/FixedAlphaShapeCell_3.h | 2 + .../Concepts/FixedAlphaShapeTraits_3.h | 2 + .../Concepts/FixedAlphaShapeVertex_3.h | 2 + .../FixedWeightedAlphaShapeTraits_3.h | 2 + .../Concepts/WeightedAlphaShapeTraits_3.h | 2 + .../Alpha_wrap_3/Concepts/AlphaWrapOracle.h | 9 +-- .../Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h | 2 + .../Concepts/ApolloniusGraphDataStructure_2.h | 3 +- .../ApolloniusGraphHierarchyVertexBase_2.h | 3 +- .../Concepts/ApolloniusGraphTraits_2.h | 5 +- .../Concepts/ApolloniusGraphVertexBase_2.h | 3 +- .../Concepts/ArrTraits--Approximate_2.h | 3 +- .../Concepts/ArrTraits--AreMergeable_2.h | 3 +- .../ArrTraits--CompareXNearBoundary_2.h | 3 +- ...rrTraits--CompareXOnBoundaryOfCurveEnd_2.h | 7 +- .../ArrTraits--CompareXOnBoundary_2.h | 7 +- .../Concepts/ArrTraits--CompareX_2.h | 3 +- .../Concepts/ArrTraits--CompareXy_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtXLeft_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtXRight_2.h | 3 +- .../Concepts/ArrTraits--CompareYAtX_2.h | 3 +- .../ArrTraits--CompareYNearBoundary_2.h | 3 +- .../ArrTraits--CompareYOnBoundary_2.h | 9 +-- .../Concepts/ArrTraits--ConstructCurve_2.h | 3 +- .../ArrTraits--ConstructMaxVertex_2.h | 3 +- .../ArrTraits--ConstructMinVertex_2.h | 3 +- .../ArrTraits--ConstructXMonotoneCurve_2.h | 3 +- .../Concepts/ArrTraits--Curve_2.h | 3 +- .../Concepts/ArrTraits--Equal_2.h | 3 +- .../Concepts/ArrTraits--Intersect_2.h | 3 +- .../ArrTraits--IsOnXIdentification_2.h | 3 +- .../ArrTraits--IsOnYIdentification_2.h | 3 +- .../Concepts/ArrTraits--IsVertical_2.h | 3 +- .../Concepts/ArrTraits--MakeXMonotone_2.h | 3 +- .../Concepts/ArrTraits--Merge_2.h | 3 +- .../Concepts/ArrTraits--ParameterSpaceInX_2.h | 7 +- .../Concepts/ArrTraits--ParameterSpaceInY_2.h | 7 +- .../Concepts/ArrTraits--Point_2.h | 3 +- .../Concepts/ArrTraits--Split_2.h | 3 +- .../Concepts/ArrTraits--XMonotoneCurve_2.h | 3 +- .../Concepts/ArrangementApproximateTraits_2.h | 17 ++--- .../Concepts/ArrangementBasicTopologyTraits.h | 3 +- .../Concepts/ArrangementBasicTraits_2.h | 31 ++++----- .../ArrangementConstructCurveTraits_2.h | 15 +++-- ...rangementConstructXMonotoneCurveTraits_2.h | 15 +++-- .../Concepts/ArrangementDcel.h | 9 +-- .../Concepts/ArrangementDcelWithRebind.h | 7 +- .../ArrangementHorizontalSideTraits_2.h | 9 +-- .../Concepts/ArrangementInputFormatter.h | 7 +- .../Concepts/ArrangementLandmarkTraits_2.h | 17 ++--- .../ArrangementOpenBoundaryTraits_2.h | 11 ++-- .../Concepts/ArrangementOutputFormatter.h | 7 +- .../Concepts/ArrangementPointLocation_2.h | 9 +-- .../ArrangementSphericalBoundaryTraits_2.h | 3 +- .../Concepts/ArrangementTopologyTraits.h | 7 +- .../Concepts/ArrangementTraits_2.h | 29 +++++---- .../Concepts/ArrangementVerticalRayShoot_2.h | 9 +-- .../ArrangementVerticalSideTraits_2.h | 9 +-- .../ArrangementWithHistoryInputFormatter.h | 3 +- .../ArrangementWithHistoryOutputFormatter.h | 3 +- .../Concepts/ArrangementXMonotoneTraits_2.h | 29 +++++---- .../Concepts/OverlayTraits.h | 5 +- BGL/doc/BGL/Concepts/EdgeListGraph.h | 2 + BGL/doc/BGL/Concepts/FaceGraph.h | 2 + BGL/doc/BGL/Concepts/FaceListGraph.h | 2 + BGL/doc/BGL/Concepts/HalfedgeGraph.h | 2 + BGL/doc/BGL/Concepts/HalfedgeListGraph.h | 2 + BGL/doc/BGL/Concepts/MutableFaceGraph.h | 2 + BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h | 2 + BGL/doc/BGL/Concepts/VertexListGraph.h | 2 + .../Concepts/BarycentricCoordinates_2.h | 7 +- .../Concepts/BarycentricTraits_2.h | 10 +-- .../Concepts/DiscretizedDomain_2.h | 3 +- .../ArrDirectionalTraits--AreMergeable_2.h | 3 +- ...rDirectionalTraits--CompareEndpointsXy_2.h | 3 +- ...rrDirectionalTraits--ConstructOpposite_2.h | 3 +- .../ArrDirectionalTraits--Intersect_2.h | 3 +- .../Concepts/ArrDirectionalTraits--Merge_2.h | 3 +- .../Concepts/ArrDirectionalTraits--Split_2.h | 3 +- .../ArrangementDirectionalXMonotoneTraits_2.h | 15 +++-- .../Concepts/GeneralPolygonSetDcel.h | 3 +- .../Concepts/GeneralPolygonSetDcelFace.h | 3 +- .../Concepts/GeneralPolygonSetDcelHalfedge.h | 3 +- .../Concepts/GeneralPolygonSetTraits_2.h | 7 +- .../Concepts/GeneralPolygon_2.h | 3 +- .../GpsTraitsGeneralPolygonWithHoles_2.h | 3 +- .../Concepts/GpsTraitsGeneralPolygon_2.h | 5 +- .../ApproximateMinEllipsoid_d_Traits_d.h | 7 +- .../Concepts/MinCircle2Traits.h | 3 +- .../Concepts/MinEllipse2Traits.h | 3 +- .../Concepts/MinQuadrilateralTraits_2.h | 3 +- .../Concepts/MinSphereAnnulusDTraits.h | 7 +- .../Concepts/MinSphereOfSpheresTraits.h | 13 ++-- .../Concepts/RectangularPCenterTraits_2.h | 3 +- .../Concepts/BoxIntersectionBox_d.h | 5 +- .../Concepts/BoxIntersectionTraits_d.h | 3 +- ...rnelForCircles--PolynomialForCircles_2_2.h | 3 +- ...lgebraicKernelForCircles--Polynomial_1_2.h | 3 +- ...raicKernelForCircles--RootForCircles_2_2.h | 3 +- .../Concepts/AlgebraicKernelForCircles.h | 3 +- .../CircularKernel--CircularArcPoint_2.h | 3 +- .../Concepts/CircularKernel--CircularArc_2.h | 3 +- .../Concepts/CircularKernel--LineArc_2.h | 3 +- .../Concepts/CircularKernel.h | 5 +- ...rnelForSpheres--PolynomialForSpheres_2_3.h | 3 +- ...lgebraicKernelForSpheres--Polynomial_1_3.h | 3 +- ...cKernelForSpheres--PolynomialsForLines_3.h | 3 +- ...raicKernelForSpheres--RootForSpheres_2_3.h | 3 +- .../Concepts/AlgebraicKernelForSpheres.h | 3 +- .../SphericalKernel--CircularArcPoint_3.h | 3 +- .../Concepts/SphericalKernel--CircularArc_3.h | 3 +- .../Concepts/SphericalKernel--LineArc_3.h | 3 +- .../Concepts/SphericalKernel.h | 5 +- .../doc/Circulator/Concepts/ConstHandle.h | 3 +- .../doc/Circulator/Concepts/ConstRange.h | 5 +- Circulator/doc/Circulator/Concepts/Handle.h | 9 +-- Circulator/doc/Circulator/Concepts/Range.h | 2 + .../doc/Classification/Concepts/Classifier.h | 7 +- .../Classification/Concepts/NeighborQuery.h | 9 +-- .../Concepts/CellAttribute.h | 2 + .../Concepts/CombinatorialMap.h | 2 + .../Combinatorial_map/Concepts/GenericMap.h | 6 +- .../Concepts/GenericMapItems.h | 2 + .../Concepts/ConvexHullTraits_2.h | 13 ++-- .../Concepts/ConvexHullTraits_3.h | 5 +- .../Concepts/IsStronglyConvexTraits_3.h | 4 +- .../Concepts/ConvexHullTraits_d.h | 7 +- .../Concepts/DelaunayLiftedTraits_d.h | 5 +- .../Convex_hull_d/Concepts/DelaunayTraits_d.h | 5 +- .../doc/resources/1.8.13/BaseDoxyfile.in | 10 ++- .../doc/resources/1.9.6/BaseDoxyfile.in | 10 ++- .../Envelope_3/Concepts/EnvelopeTraits_3.h | 9 +-- .../Generalized_map/Concepts/GeneralizedMap.h | 2 + .../Generator/Concepts/CombinationElement.h | 8 ++- .../doc/Generator/Concepts/PointGenerator.h | 29 +++++---- .../Concepts/RandomConvexHullTraits_2.h | 2 + .../Concepts/RandomConvexSetTraits_2.h | 3 +- .../Concepts/RandomPolygonTraits_2.h | 2 + .../doc/HalfedgeDS/Concepts/HalfedgeDS.h | 7 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSFace.h | 5 +- .../HalfedgeDS/Concepts/HalfedgeDSHalfedge.h | 5 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSItems.h | 7 +- .../HalfedgeDS/Concepts/HalfedgeDSVertex.h | 5 +- .../Concepts/HeatMethodTraits_3.h | 2 + .../HyperbolicDelaunayTriangulationTraits_2.h | 5 +- .../HyperbolicTriangulationFaceBase_2.h | 3 +- .../Concepts/ExtremalPolygonTraits_2.h | 5 +- .../LargestEmptyIsoRectangleTraits_2.h | 5 +- .../Concepts/GradientFittingTraits.h | 3 +- .../Concepts/InterpolationTraits.h | 5 +- .../Interval_skip_list/Concepts/Interval.h | 5 +- .../doc/Jet_fitting_3/Concepts/DataKernel.h | 5 +- .../doc/Jet_fitting_3/Concepts/LocalKernel.h | 5 +- .../doc/Kernel_23/Concepts/GeomObjects.h | 65 ++++++++++++------- Kernel_23/doc/Kernel_23/Concepts/Kernel.h | 17 ++--- .../Kernel_d/Concepts/KernelWithLifting_d.h | 5 +- Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h | 9 +-- .../Kernel_d/Concepts/LinearAlgebraTraits_d.h | 5 +- .../Concepts/CellAttributeWithPoint.h | 2 + .../Concepts/LinearCellComplex.h | 6 +- .../Concepts/LinearCellComplexItems.h | 3 +- .../Concepts/LinearCellComplexTraits.h | 2 + .../doc/Matrix_search/Concepts/BasicMatrix.h | 3 +- .../Concepts/MonotoneMatrixSearchTraits.h | 3 +- .../Concepts/SortedMatrixSearchTraits.h | 3 +- .../ConformingDelaunayTriangulationTraits_2.h | 4 +- .../Mesh_2/Concepts/DelaunayMeshFaceBase_2.h | 3 +- .../Mesh_2/Concepts/DelaunayMeshTraits_2.h | 4 +- .../Concepts/DelaunayMeshVertexBase_2.h | 3 +- .../doc/Mesh_2/Concepts/MeshingCriteria_2.h | 5 +- .../Concepts/BisectionGeometricTraits_3.h | 2 + .../Concepts/IntersectionGeometricTraits_3.h | 2 + Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h | 5 +- .../doc/Mesh_3/Concepts/MeshCellCriteria_3.h | 3 +- .../Concepts/MeshCriteriaWithFeatures_3.h | 3 +- Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h | 3 +- .../doc/Mesh_3/Concepts/MeshDomainField_3.h | 3 +- .../Concepts/MeshDomainWithFeatures_3.h | 5 +- Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h | 5 +- .../doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h | 3 +- .../doc/Mesh_3/Concepts/MeshFacetCriteria_3.h | 3 +- Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h | 2 + .../Concepts/MeshTriangulationTraits_3.h | 2 + Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h | 3 +- .../doc/Mesh_3/Concepts/TriangleAccessor_3.h | 3 +- .../Concepts/PolygonConvexDecomposition_2.h | 11 ++-- .../PolygonWithHolesConvexDecomposition_2.h | 5 +- .../Miscellany/Concepts/UniqueHashFunction.h | 3 +- .../Concepts/ModularTraits.h | 3 +- .../Concepts/Modularizable.h | 20 +++--- .../Nef_2/Concepts/ExtendedKernelTraits_2.h | 7 +- .../doc/Number_types/Concepts/RootOf_2.h | 4 +- .../Concepts/OrientedBoundingBoxTraits.h | 3 +- ...imalTransportationReconstructionTraits_2.h | 6 +- .../doc/Orthtree/Concepts/OrthtreeTraits.h | 7 +- .../doc/Orthtree/Concepts/OrthtreeTraversal.h | 9 +-- .../Concepts/ConvexPartitionIsValidTraits_2.h | 3 +- .../Concepts/IsYMonotoneTraits_2.h | 5 +- .../Concepts/OptimalConvexPartitionTraits_2.h | 3 +- .../Concepts/PartitionIsValidTraits_2.h | 3 +- .../Partition_2/Concepts/PartitionTraits_2.h | 3 +- .../doc/Partition_2/Concepts/PolygonIsValid.h | 5 +- .../YMonotonePartitionIsValidTraits_2.h | 3 +- .../Periodic_2DelaunayTriangulationTraits_2.h | 3 +- .../Concepts/Periodic_2Offset_2.h | 3 +- .../Periodic_2TriangulationFaceBase_2.h | 3 +- .../Periodic_2TriangulationTraits_2.h | 3 +- .../Periodic_2TriangulationVertexBase_2.h | 3 +- .../Periodic_3MeshDomainWithFeatures_3.h | 3 +- .../Concepts/Periodic_3MeshDomain_3.h | 3 +- .../Periodic_3DelaunayTriangulationTraits_3.h | 3 +- .../Concepts/Periodic_3Offset_3.h | 3 +- ...riodic_3RegularTriangulationDSCellBase_3.h | 5 +- ...odic_3RegularTriangulationDSVertexBase_3.h | 3 +- .../Periodic_3RegularTriangulationTraits_3.h | 3 +- .../Periodic_3TriangulationDSCellBase_3.h | 3 +- .../Periodic_3TriangulationDSVertexBase_3.h | 3 +- .../Periodic_3TriangulationTraits_3.h | 3 +- ...4HyperbolicDelaunayTriangulationTraits_2.h | 3 +- ...iodic_4HyperbolicTriangulationFaceBase_2.h | 3 +- ...dic_4HyperbolicTriangulationVertexBase_2.h | 3 +- .../Concepts/GeneralPolygonWithHoles_2.h | 5 +- .../doc/Polygon/Concepts/PolygonTraits_2.h | 8 ++- .../Concepts/PMPCorefinementVisitor.h | 3 +- .../Concepts/PMPDistanceTraits.h | 2 + .../Concepts/PMPHolefillingVisitor.h | 3 +- .../PMPPolygonSoupOrientationVisitor.h | 3 +- .../Concepts/PMPTriangulateFaceVisitor.h | 3 +- .../Polyhedron/Concepts/PolyhedronItems_3.h | 7 +- .../Polyhedron/Concepts/PolyhedronTraits_3.h | 6 +- .../PolylineSimplificationCostFunction.h | 7 +- .../PolylineSimplificationStopPredicate.h | 7 +- .../PolylineSimplificationVertexBase_2.h | 3 +- .../Polynomial/Concepts/PolynomialTraits_d.h | 3 +- .../doc/Polynomial/Concepts/Polynomial_d.h | 3 +- .../Concepts/AllFurthestNeighborsTraits_2.h | 9 +-- .../Concepts/PolytopeDistanceDTraits.h | 7 +- .../Concepts/WidthTraits_3.h | 3 +- .../doc/QP_solver/Concepts/LinearProgram.h | 7 +- .../Concepts/NonnegativeLinearProgram.h | 14 ++-- .../Concepts/NonnegativeQuadraticProgram.h | 7 +- .../doc/QP_solver/Concepts/QuadraticProgram.h | 7 +- ...shComplexWithFeatures_3InTriangulation_3.h | 3 +- .../Concepts/MeshComplex_3InTriangulation_3.h | 3 +- .../Concepts/SimplicialMeshCellBase_3.h | 9 +-- .../Concepts/SimplicialMeshVertexBase_3.h | 7 +- .../doc/STL_Extension/Concepts/Descriptor.h | 5 +- .../doc/STL_Extension/Concepts/Hashable.h | 6 +- .../doc/STL_Extension/Concepts/Index.h | 5 +- .../STL_Extension/Concepts/ProjectionObject.h | 27 ++++---- .../Concepts/SurjectiveLockDataStructure.h | 3 +- .../Concepts/ScaleSpaceMesher.h | 5 +- .../Concepts/ScaleSpaceSmoother.h | 5 +- .../Concepts/RangeSegmentTreeTraits_k.h | 13 ++-- .../SegmentDelaunayGraphDataStructure_2.h | 3 +- .../Concepts/SegmentDelaunayGraphFaceBase_2.h | 3 +- ...egmentDelaunayGraphHierarchyVertexBase_2.h | 3 +- .../Concepts/SegmentDelaunayGraphSite_2.h | 3 +- .../SegmentDelaunayGraphStorageSite_2.h | 3 +- .../SegmentDelaunayGraphStorageTraits_2.h | 3 +- .../Concepts/SegmentDelaunayGraphTraits_2.h | 9 +-- .../SegmentDelaunayGraphVertexBase_2.h | 3 +- .../SegmentDelaunayGraphLinfTraits_2.h | 9 +-- .../Concepts/CastingTraits_2.h | 2 + .../Concepts/EfficientRANSACTraits.h | 3 +- .../Shape_detection/Concepts/NeighborQuery.h | 9 +-- .../doc/Shape_detection/Concepts/RegionType.h | 15 +++-- .../Concepts/ContourDirections.h | 7 +- .../Concepts/NeighborQuery.h | 3 +- .../Concepts/RegularizationType.h | 5 +- .../Concepts/SkinSurfaceTraits_3.h | 3 +- .../Skin_surface_3/Concepts/SkinSurface_3.h | 5 +- .../Concepts/SnapRoundingTraits_2.h | 21 +++++- .../Concepts/DiagonalizeTraits.h | 3 +- .../Concepts/MixedIntegerProgramTraits.h | 16 +++-- ...ormalEquationSparseLinearAlgebraTraits_d.h | 3 +- .../Concepts/QuadraticProgramTraits.h | 3 +- .../Concepts/SparseLinearAlgebraTraits_d.h | 11 ++-- .../SparseLinearAlgebraWithFactorTraits_d.h | 3 +- .../doc/Solver_interface/Concepts/SvdTraits.h | 9 ++- .../Concepts/FuzzyQueryItem.h | 5 +- .../Concepts/GeneralDistance.h | 5 +- .../Concepts/OrthogonalDistance.h | 5 +- .../Concepts/RangeSearchTraits.h | 13 ++-- .../Concepts/SearchGeomTraits_2.h | 2 + .../Concepts/SearchGeomTraits_3.h | 2 + .../Spatial_searching/Concepts/SearchTraits.h | 17 ++--- .../Concepts/SpatialSeparator.h | 3 +- .../Spatial_searching/Concepts/SpatialTree.h | 3 +- .../doc/Spatial_searching/Concepts/Splitter.h | 15 +++-- .../Concepts/SpatialSortingTraits_2.h | 4 +- .../Concepts/SpatialSortingTraits_3.h | 4 +- .../Concepts/SpatialSortingTraits_d.h | 4 +- .../Concepts/PolygonOffsetBuilderTraits_2.h | 3 +- .../StraightSkeletonBuilderTraits_2.h | 3 +- .../StraightSkeletonBuilder_2_Visitor.h | 3 +- .../Concepts/StraightSkeletonFace_2.h | 3 +- .../Concepts/StraightSkeletonHalfedge_2.h | 3 +- .../StraightSkeletonItemsConverter_2.h | 3 +- .../Concepts/StraightSkeletonVertex_2.h | 3 +- .../Concepts/StraightSkeleton_2.h | 3 +- .../Stream_lines_2/Concepts/Integrator_2.h | 5 +- .../Concepts/StreamLinesTraits_2.h | 2 + .../Stream_lines_2/Concepts/VectorField_2.h | 5 +- .../Subdivision_method_3/Concepts/DQQMask_3.h | 3 +- .../Subdivision_method_3/Concepts/PQQMask_3.h | 3 +- .../Subdivision_method_3/Concepts/PTQMask_3.h | 3 +- .../Concepts/Sqrt3Mask_3.h | 3 +- .../Concepts/ErrorMetricProxy.h | 5 +- .../DeformationClosestRotationTraits_3.h | 5 +- .../Concepts/Parameterizer_3.h | 21 +++--- .../Concepts/SegmentationGeomTraits.h | 2 + .../Concepts/SurfaceMeshShortestPathTraits.h | 3 +- .../Concepts/GetCost.h | 7 +- .../Concepts/GetPlacement.h | 11 ++-- .../Concepts/PlacementFilter.h | 5 +- .../Concepts/StopPredicate.h | 11 ++-- .../MeanCurvatureSkeletonizationTraits.h | 2 + .../Concepts/PolygonalSchema.h | 6 +- .../Concepts/PolygonalSchemaItems.h | 2 + .../Concepts/WeightFunctor.h | 6 +- .../Concepts/ImplicitFunction.h | 4 +- .../Concepts/ImplicitSurfaceTraits_3.h | 2 + .../Concepts/SurfaceMeshCellBase_3.h | 5 +- .../SurfaceMeshComplex_2InTriangulation_3.h | 3 +- .../Concepts/SurfaceMeshFacetsCriteria_3.h | 3 +- .../Concepts/SurfaceMeshTraits_3.h | 3 +- .../Concepts/SurfaceMeshTriangulation_3.h | 2 + .../Concepts/SurfaceMeshVertexBase_3.h | 5 +- .../doc/Surface_mesher/Concepts/Surface_3.h | 3 +- .../Concepts/TriangulationDSFaceBase_2.h | 3 +- .../Concepts/TriangulationDSVertexBase_2.h | 3 +- .../Concepts/TriangulationDataStructure_2.h | 9 ++- .../Concepts/TriangulationDSCellBase_3.h | 3 +- .../Concepts/TriangulationDSVertexBase_3.h | 3 +- .../Concepts/TriangulationDataStructure_3.h | 3 +- .../Concepts/RemeshingCellBase_3.h | 3 +- .../Concepts/RemeshingTriangulationTraits_3.h | 2 + .../Concepts/RemeshingVertexBase_3.h | 3 +- .../Concepts/DelaunayTriangulationTraits.h | 5 +- .../Concepts/RegularTriangulationTraits.h | 5 +- .../Concepts/TriangulationDSFace.h | 3 +- .../Concepts/TriangulationDSFullCell.h | 5 +- .../Concepts/TriangulationDSVertex.h | 5 +- .../Concepts/TriangulationDataStructure.h | 13 ++-- .../Concepts/TriangulationFullCell.h | 3 +- .../Concepts/TriangulationTraits.h | 5 +- .../Concepts/TriangulationVertex.h | 3 +- ...ConstrainedDelaunayTriangulationTraits_2.h | 8 ++- .../ConstrainedTriangulationFaceBase_2.h | 3 +- .../ConstrainedTriangulationTraits_2.h | 10 +-- .../Concepts/DelaunayTriangulationTraits_2.h | 14 ++-- .../Concepts/RegularTriangulationFaceBase_2.h | 3 +- .../Concepts/RegularTriangulationTraits_2.h | 2 + .../RegularTriangulationVertexBase_2.h | 3 +- .../Concepts/TriangulationFaceBase_2.h | 3 +- .../TriangulationHierarchyVertexBase_2.h | 3 +- .../Concepts/TriangulationTraits_2.h | 10 +-- .../TriangulationVertexBaseWithInfo_2.h | 3 +- .../Concepts/TriangulationVertexBase_2.h | 3 +- .../DelaunayTriangulationCellBase_3.h | 5 +- .../Concepts/DelaunayTriangulationTraits_3.h | 15 +++-- ...lationCellBaseWithWeightedCircumcenter_3.h | 3 +- .../Concepts/RegularTriangulationCellBase_3.h | 3 +- .../Concepts/RegularTriangulationTraits_3.h | 2 + .../RegularTriangulationVertexBase_3.h | 3 +- .../TriangulationCellBaseWithInfo_3.h | 3 +- .../Concepts/TriangulationCellBase_3.h | 5 +- .../Concepts/TriangulationTraits_3.h | 2 + .../TriangulationVertexBaseWithInfo_3.h | 3 +- .../Concepts/TriangulationVertexBase_3.h | 5 +- .../DelaunayTriangulationOnSphereTraits_2.h | 5 +- .../TriangulationOnSphereFaceBase_2.h | 3 +- .../Concepts/TriangulationOnSphereTraits_2.h | 5 +- .../TriangulationOnSphereVertexBase_2.h | 3 +- .../doc/Visibility_2/Concepts/Visibility_2.h | 7 +- .../Concepts/AdaptationPolicy_2.h | 19 +++--- .../Concepts/AdaptationTraits_2.h | 9 +-- .../Concepts/DelaunayGraph_2.h | 14 ++-- .../Weights/Concepts/AnalyticWeightTraits_2.h | 8 ++- .../Weights/Concepts/AnalyticWeightTraits_3.h | 2 + .../Weights/Concepts/BarycentricWeights_2.h | 7 +- 403 files changed, 1354 insertions(+), 831 deletions(-) mode change 100644 => 100755 Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h mode change 100644 => 100755 Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h index 75823eb238ae..c01a0008bee3 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h @@ -11,7 +11,9 @@ and the primitives stored in the AABB tree. \cgalRefines{SearchGeomTraits_3} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::AABB_traits` \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h index 4a987a58cbb2..cee0dc902966 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h @@ -12,11 +12,12 @@ The concept `AABBPrimitive` describes the requirements for the primitives stored The `Primitive` type can be, e.g., a wrapper around a `Handle`. Assume for instance that the input objects are the triangle faces of a mesh stored as a `CGAL::Polyhedron_3`. The `Datum` would be a `Triangle_3` and the `Id` would be a polyhedron `Face_handle`. Method `datum()` can return either a `Triangle_3` constructed on the fly from the face handle or a `Triangle_3` stored internally. This provides a way for the user to trade memory for efficiency. -\cgalHasModelsBegin CGAL::AABB_primitive -\cgalHasModels CGAL::AABB_segment_primitive -\cgalHasModels CGAL::AABB_triangle_primitive -\cgalHasModels CGAL::AABB_halfedge_graph_segment_primitive -\cgalHasModels CGAL::AABB_face_graph_triangle_primitive +\cgalHasModelsBegin +\cgalModels{CGAL::AABB_primitive} +\cgalModels{CGAL::AABB_segment_primitive} +\cgalModels{CGAL::AABB_triangle_primitive} +\cgalModels{CGAL::AABB_halfedge_graph_segment_primitive} +\cgalModels{CGAL::AABB_face_graph_triangle_primitive} \cgalHasModelsEnd */ diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h index 8ec9a103acdc..27f6805cbca1 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h @@ -21,9 +21,10 @@ The `Datum` would be a `Triangle_3` and the `Id` a `std::size_t`. The shared dat `std::vector`. The method `datum(const Shared_data&)` then returns a triangle from the vector. -\cgalHasModelsBegin CGAL::AABB_primitive -\cgalHasModels CGAL::AABB_halfedge_graph_segment_primitive -\cgalHasModels CGAL::AABB_face_graph_triangle_primitive +\cgalHasModelsBegin +\cgalModels{CGAL::AABB_primitive} +\cgalModels{CGAL::AABB_halfedge_graph_segment_primitive} +\cgalModels{CGAL::AABB_face_graph_triangle_primitive} \cgalHasModelsEnd */ diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h index f47f1e9464bc..c34d88be491e 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionGeomTraits.h @@ -9,7 +9,9 @@ define the Intersection_distance functor. \cgalRefines{AABBGeomTraits} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::AABB_traits` \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h index 87d139973b5c..1df2c9802b25 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h @@ -7,7 +7,8 @@ The concept `AABBRayIntersectionTraits` is a refinement of the concept `AABBTraits` it also requires function objects to calculate the distance of an intersection along a ray. -\cgalHasModelsBegin CGAL::AABB_traits +\cgalHasModelsBegin +\cgalModels{CGAL::AABB_traits} \cgalHasModelsEnd \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h index f5e5846322e3..5dfba2998c86 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h @@ -5,7 +5,8 @@ The concept `AABBTraits` provides the geometric primitive types and methods for the class `CGAL::AABB_tree`. -\cgalHasModelsBegin CGAL::AABB_traits +\cgalHasModelsBegin +\cgalModels{CGAL::AABB_traits} \cgalHasModelsEnd \cgalRefines{SearchGeomTraits_3} diff --git a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h index a56096bcb197..e31759b1f3de 100644 --- a/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h +++ b/Advancing_front_surface_reconstruction/doc/Advancing_front_surface_reconstruction/Concepts/AdvancingFrontSurfaceReconstructionTraits_3.h @@ -11,7 +11,9 @@ together with a few geometric predicates and constructions on these objects. \cgalRefines{DelaunayTriangulationTraits_3} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the concept `Kernel`} +\cgalHasModelsEnd */ class AdvancingFrontSurfaceReconstructionTraits_3 { diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h index 0fbc4ea6f174..d21861c1c288 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h @@ -28,7 +28,8 @@ algebraic operations within that structure. \sa `CGAL::Field_with_kth_root_tag` \sa `CGAL::Field_with_root_of_tag` -\cgalHasModelsBegin CGAL::Algebraic_structure_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Algebraic_structure_traits} \cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h index a53ac500cbf9..5cd89e524e60 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h @@ -9,16 +9,17 @@ for Cartesian kernels. \cgalRefines{Field,RealEmbeddable} -\cgalHasModelsBegin float -\cgalHasModels double -\cgalHasModels CGAL::Gmpq -\cgalHasModels CGAL::Interval_nt -\cgalHasModels CGAL::Interval_nt_advanced -\cgalHasModels CGAL::Lazy_exact_nt -\cgalHasModels CGAL::Quotient -\cgalHasModels leda_rational -\cgalHasModels leda_bigfloat -\cgalHasModels leda_real +\cgalHasModelsBegin +\cgalModels{float} +\cgalModels{double} +\cgalModels{CGAL::Gmpq} +\cgalModels{CGAL::Interval_nt} +\cgalModels{CGAL::Interval_nt_advanced} +\cgalModels{CGAL::Lazy_exact_nt} +\cgalModels{CGAL::Quotient} +\cgalModels{leda_rational} +\cgalModels{leda_bigfloat} +\cgalModels{leda_real} \cgalHasModelsEnd \sa `RingNumberType` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h index 35d4b408a679..f1248606d90c 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h @@ -8,7 +8,8 @@ A model of `FractionTraits` is associated with a type `Type`. In case the associated type is a `Fraction`, a model of `FractionTraits` provides the relevant functionality for decomposing and re-composing as well as the numerator and denominator type. -\cgalHasModelsBegin CGAL::Fraction_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Fraction_traits} \cgalHasModelsEnd \sa `FractionTraits_::Decompose` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h index f8f2f3f8749d..f31912ba5d85 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h @@ -6,9 +6,10 @@ A model of the concept `FromIntConstructible` is required to be constructible from int. -\cgalHasModelsBegin int -\cgalHasModels long -\cgalHasModels double +\cgalHasModelsBegin +\cgalModels{int} +\cgalModels{long} +\cgalModels{double} \cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h index 1cd155d7ccff..312eff6326f8 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h @@ -7,7 +7,8 @@ A model of `RealEmbeddableTraits` is associated to a number type `Type` and reflects the properties of this type with respect to the concept `RealEmbeddable`. -\cgalHasModelsBegin CGAL::Real_embeddable_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Real_embeddable_traits} \cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h index 462030682589..f3ee8c4ba58d 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h @@ -10,18 +10,20 @@ for Homogeneous kernels. \cgalRefines{IntegralDomainWithoutDivision,RealEmbeddable} -\cgalHasModelsBareBegin{\cpp built-in number types} CGAL::Gmpq -\cgalHasModels CGAL::Gmpz -\cgalHasModels CGAL::Interval_nt -\cgalHasModels CGAL::Interval_nt_advanced -\cgalHasModels CGAL::Lazy_exact_nt -\cgalHasModels CGAL::MP_Float -\cgalHasModels CGAL::Gmpzf -\cgalHasModels CGAL::Quotient -\cgalHasModels leda_integer -\cgalHasModels leda_rational -\cgalHasModels leda_bigfloat -\cgalHasModels leda_real +\cgalHasModelsBegin +\cgalHasModelsBare{\cpp built-in number types} +\cgalHasModels{CGAL::Gmpq} +\cgalHasModels{CGAL::Gmpz} +\cgalHasModels{CGAL::Interval_nt} +\cgalHasModels{CGAL::Interval_nt_advanced} +\cgalHasModels{CGAL::Lazy_exact_nt} +\cgalHasModels{CGAL::MP_Float} +\cgalHasModels{CGAL::Gmpzf} +\cgalHasModels{CGAL::Quotient} +\cgalHasModels{leda_integer} +\cgalHasModels{leda_rational} +\cgalHasModels{leda_bigfloat} +\cgalHasModels{leda_real} \cgalHasModelsEnd \sa `FieldNumberType` diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h index f9b702d436be..4bc59c9e3886 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h @@ -8,8 +8,9 @@ algebraic functionalities on univariate polynomials of general degree \f$ d\f$. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModelsBegin CGAL::Algebraic_kernel_rs_gmpz_d_1 -\cgalHasModels CGAL::Algebraic_kernel_rs_gmpq_d_1 +\cgalHasModelsBegin +\cgalModels{CGAL::Algebraic_kernel_rs_gmpz_d_1} +\cgalModels{CGAL::Algebraic_kernel_rs_gmpq_d_1} \cgalHasModelsEnd \sa `AlgebraicKernel_d_2` diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h index 562a6aaaa195..498eaed26d73 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h @@ -9,7 +9,8 @@ The concept `AlphaShapeFace_2` describes the requirements for the base face of a RegularTriangulationFaceBase_2 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_2TriangulationFaceBase_2 if the underlying triangulation of the alpha shape is a periodic triangulation} -\cgalHasModelsBegin CGAL::Alpha_shape_face_base_2 (templated with the appropriate triangulation face base class) +\cgalHasModelsBegin +\cgalModels{CGAL::Alpha_shape_face_base_2 (templated with the appropriate triangulation face base class)} \cgalHasModelsEnd */ diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h index 28ad270b7441..669fdf61f195 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeTraits_2.h @@ -9,7 +9,10 @@ class of the underlying Delaunay triangulation of a basic alpha shape. \cgalRefines{DelaunayTriangulationTraits_2 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_2DelaunayTriangulationTraits_2 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} -\cgalHasModelsBare{All models of `Kernel`,Projection traits such as `CGAL::Projection_traits_xy_3`} +\cgalHasModelsBegin +\cgalHasModelsBare{All models of `Kernel`} +\cgalHasModelsBare{Projection traits such as `CGAL::Projection_traits_xy_3`} +\cgalHasModelsEnd \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h index 5116683d78b3..649ed3970d0e 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeVertex_2.h @@ -9,7 +9,9 @@ The concept `AlphaShapeVertex_2` describes the requirements for the base vertex RegularTriangulationVertexBase_2 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_2TriangulationVertexBase_2 if the underlying triangulation of the alpha shape is a periodic triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Alpha_shape_vertex_base_2` (templated with the appropriate triangulation vertex base class)} +\cgalHasModelsEnd */ class AlphaShapeVertex_2 { public: diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h index 05be16ee5596..b88db2cd67be 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/WeightedAlphaShapeTraits_2.h @@ -9,7 +9,10 @@ of the underlying regular triangulation of a weighted alpha shape. \cgalRefines{RegularTriangulationTraits_2 if the underlying triangulation of the alpha shape is a regular triangulation.} -\cgalHasModelsBare{All models of `Kernel`,Projection traits such as `CGAL::Projection_traits_xy_3`} +\cgalHasModelsBegin +\cgalHasModelsBare{All models of `Kernel`,} +\cgalHasModelsBare{Projection traits such as `CGAL::Projection_traits_xy_3`} +\cgalHasModelsEnd \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h index de5c0aacd622..fa4ba33da2d8 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeCell_3.h @@ -9,7 +9,9 @@ The concept `AlphaShapeCell_3` describes the requirements for the base cell of a RegularTriangulationCellBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSCellBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class)} +\cgalHasModelsEnd \sa `CGAL::Alpha_status` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h index 4a5fe7a8bfd0..cff0a2f3c522 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeTraits_3.h @@ -10,7 +10,9 @@ of the underlying Delaunay triangulation of a basic alpha shape. \cgalRefines{DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_3DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{All models of `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h index 65f490141802..3c81217e2ab8 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/AlphaShapeVertex_3.h @@ -9,7 +9,9 @@ The concept `AlphaShapeVertex_3` describes the requirements for the base vertex RegularTriangulationVertexBase_3 if the underlying triangulation of the alpha shape is a regular triangulation. Periodic_3TriangulationDSVertexBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class)} +\cgalHasModelsEnd \sa `CGAL::Alpha_status` diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h index 7707ed14ce16..8d4a59f29ee1 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeCell_3.h @@ -9,7 +9,9 @@ The concept `FixedAlphaShapeCell_3` describes the requirements for the base cell RegularTriangulationCellBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSCellBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Fixed_alpha_shape_cell_base_3` (templated with the appropriate triangulation cell base class)} +\cgalHasModelsEnd */ class FixedAlphaShapeCell_3 { public: diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h index 4c63e9618fa0..4c0d409f5245 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeTraits_3.h @@ -10,7 +10,9 @@ of the underlying Delaunay triangulation of a basic alpha shape with a fixed val \cgalRefines{DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a Delaunay triangulation, Periodic_3DelaunayTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic Delaunay triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{All models of `Kernel`} +\cgalHasModelsEnd \sa CGAL::Exact_predicates_inexact_constructions_kernel (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h index 7b152f16e2e5..dd4db3fecea7 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedAlphaShapeVertex_3.h @@ -9,7 +9,9 @@ The concept `FixedAlphaShapeVertex_3` describes the requirements for the base ve RegularTriangulationVertexBase_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3TriangulationDSVertexBase_3 if the underlying triangulation of the alpha shape is a periodic triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{`CGAL::Fixed_alpha_shape_vertex_base_3` (templated with the appropriate triangulation vertex base class)} +\cgalHasModelsEnd */ class FixedAlphaShapeVertex_3 { diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h index 8b7694d5643c..73d46de6261a 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/FixedWeightedAlphaShapeTraits_3.h @@ -9,7 +9,9 @@ for the geometric traits class of the underlying regular triangulation of a weig \cgalRefines{RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic regular triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{All models of `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h index 10c8009e6c26..f91afc7cdb2c 100644 --- a/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h +++ b/Alpha_shapes_3/doc/Alpha_shapes_3/Concepts/WeightedAlphaShapeTraits_3.h @@ -10,7 +10,9 @@ of the underlying regular triangulation of a weighted alpha shape. \cgalRefines{RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a regular triangulation, Periodic_3RegularTriangulationTraits_3 if the underlying triangulation of the alpha shape is a periodic regular triangulation} +\cgalHasModelsBegin \cgalHasModelsBare{All models of `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended kernel) */ diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h index 145349567d2f..bf8076c97946 100644 --- a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h +++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h @@ -9,10 +9,11 @@ The concept `AlphaWrapOracle` defines the requirements for an Alpha Wrap Ora that answers a number of queries over the input of the algorithm. The oracle is the template parameter of the class `CGAL::Alpha_wraps_3_::Alpha_wrap_3`. -\cgalHasModelsBegin CGAL::Alpha_wraps_3_::Point_set_oracle -\cgalHasModels CGAL::Alpha_wraps_3_::Segment_soup_oracle -\cgalHasModels CGAL::Alpha_wraps_3_::Triangle_mesh_oracle -\cgalHasModels CGAL::Alpha_wraps_3_::Triangle_soup_oracle +\cgalHasModelsBegin +\cgalModels{CGAL::Alpha_wraps_3_::Point_set_oracle} +\cgalModels{CGAL::Alpha_wraps_3_::Segment_soup_oracle} +\cgalModels{CGAL::Alpha_wraps_3_::Triangle_mesh_oracle} +\cgalModels{CGAL::Alpha_wraps_3_::Triangle_soup_oracle} \cgalHasModelsEnd */ diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h index 916aa5aa3daf..c4d7308d5117 100644 --- a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h +++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapTraits_3.h @@ -11,7 +11,9 @@ you require Kernel. Stitch_borders doesn't even have clear geometric traits requ The concept `AlphaWrapTraits_3` defines the requirements for the geometric traits class of an alpha wrap oracle. +\cgalHasModelsBegin \cgalHasModelsBare{Any 3D %kernel is a model of this traits concept} +\cgalHasModelsEnd */ class AlphaWrapTraits_3 diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h index e494faa898c8..78e8ce69c6ad 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h @@ -27,7 +27,8 @@ We only describe the additional requirements with respect to the \cgalRefines{TriangulationDataStructure_2} -\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h index 4cfc7a99223a..354d27f68bfe 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h @@ -19,7 +19,8 @@ next and previous level graphs. `ApolloniusGraphHierarchyVertexBase_2` does not introduce any types in addition to those of `ApolloniusGraphVertexBase_2`. -\cgalHasModelsBegin CGAL::Apollonius_graph_hierarchy_vertex_base_2 > +\cgalHasModelsBegin +\cgalModels{CGAL::Apollonius_graph_hierarchy_vertex_base_2 >} \cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h index 1517dd4fe17f..d62bc56484e5 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h @@ -12,8 +12,9 @@ it provides a type `Site_2`, which must be a model of the concept constructions for sites and several function object types for the predicates. -\cgalHasModelsBegin CGAL::Apollonius_graph_traits_2 -\cgalHasModels CGAL::Apollonius_graph_filtered_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Apollonius_graph_traits_2} +\cgalModels{CGAL::Apollonius_graph_filtered_traits_2} \cgalHasModelsEnd \sa `CGAL::Apollonius_graph_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h index cac31092bafe..45e4bd357458 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h @@ -12,7 +12,8 @@ sites. The container stores the hidden sites related to the vertex. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Apollonius_graph_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Apollonius_graph_vertex_base_2} \cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h index 671d83a69674..8b105f4dab97 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementApproximateTraits_2::Approximate_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementApproximateTraits_2::Approximate_2} * \cgalHasModelsEnd */ class Approximate_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h index 56ec39093c7e..a5c401dc85fe 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Are_mergeable_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementXMonotoneTraits_2::Are_mergeable_2} * \cgalHasModelsEnd */ class AreMergeable_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h index 9031f72a9bdb..0d85b1f0ae7d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModelsBegin ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_ + * \cgalHasModelsBegin + * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_} * \cgalHasModelsEnd */ class CompareXNearBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h index 45fd98fa2d6b..8fccd1309061 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableFunctor} * - * \cgalHasModelsBegin ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2 - * \cgalHasModels ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2 - * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2} + * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2} + * \cgalModels{ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2} * \cgalHasModelsEnd */ class CompareXOnBoundaryOfCurveEnd_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h index b02a736b31d3..77eea00561d8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableFunctor} * - * \cgalHasModelsBegin ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2 - * \cgalHasModels ArrangementClosedTopTraits_2::Compare_x_on_boundary_2 - * \cgalHasModels ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2} + * \cgalModels{ArrangementClosedTopTraits_2::Compare_x_on_boundary_2} + * \cgalModels{ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2} * \cgalHasModelsEnd */ class CompareXOnBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h index fe5d8a4d5059..9e9e4fe45cde 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h @@ -4,7 +4,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_x_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Compare_x_2} * \cgalHasModelsEnd */ class CompareX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h index f571e844bdbd..7e423c1d5cdc 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_xy_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Compare_xy_2} * \cgalHasModelsEnd */ class CompareXy_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h index eeb409061462..871add8868c7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_left_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_left_2} * \cgalHasModelsEnd */ class CompareYAtXLeft_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h index 1308a75c5bda..4959f78d530f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_right_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_right_2} * \cgalHasModelsEnd */ class CompareYAtXRight_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h index e1e0d6714418..55ae2fc00faf 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Compare_y_at_x_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_2} * \cgalHasModelsEnd */ class CompareYAtX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h index df0c66fae012..e2ab7e9cae92 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableTernaryFunction} * - * \cgalHasModelsBegin ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2} * \cgalHasModelsEnd */ class CompareYNearBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h index 8f5c89d89fef..38a9090fd535 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h @@ -5,10 +5,11 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2 - * \cgalHasModels ArrangementClosedRightTraits_2::Compare_y_on_boundary_2 - * \cgalHasModels ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2 - * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2} + * \cgalModels{ArrangementClosedRightTraits_2::Compare_y_on_boundary_2} + * \cgalModels{ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2} + * \cgalModels{ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2} * \cgalHasModelsEnd */ class CompareYOnBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h index d6a0c5b1208a..75306891423f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementConstructCurveTraits_2::Construct_curve_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementConstructCurveTraits_2::Construct_curve_2} * \cgalHasModelsEnd */ class ConstructCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h index e94c601aa7a6..85b5f9a7fe29 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Construct_max_vertex_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Construct_max_vertex_2} * \cgalHasModelsEnd */ class ConstructMaxVertex_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h index 00a000f41ced..a434876ac15f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Construct_min_vertex_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Construct_min_vertex_2} * \cgalHasModelsEnd */ class ConstructMinVertex_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h index d25d94e43713..73a5a007b91a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2} * \cgalHasModelsEnd */ class ConstructXMonotoneCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h index 3994e674cfb7..6ecf52458326 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h @@ -6,7 +6,8 @@ namespace ArrTraits { * represents a general planar curve. * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - * \cgalHasModelsBegin ArrangementTraits_2::Curve_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementTraits_2::Curve_2} * \cgalHasModelsEnd */ class Curve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h index 71c6da87afcc..ca9e3d1a098a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Equal_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Equal_2} * \cgalHasModelsEnd */ class Equal_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h index 7a6d7e307390..df17bc89d084 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Intersect_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementXMonotoneTraits_2::Intersect_2} * \cgalHasModelsEnd */ class Intersect_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h index f2850203499e..6ead4d30e3fb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModelsBegin ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2} * \cgalHasModelsEnd */ class IsOnXIdentification_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h index e07b550923f1..9da39191b062 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModelsBegin ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2} * \cgalHasModelsEnd */ class IsOnYIdentification_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h index e9bbf29d0c8a..1df66d52a0b3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{AdaptableUnaryFunction} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Is_vertical_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Is_vertical_2} * \cgalHasModelsEnd */ class IsVertical_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h index 46d0e1b5baea..2731e990a2fa 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementTraits_2::Make_x_monotone_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementTraits_2::Make_x_monotone_2} * \cgalHasModelsEnd */ class MakeXMonotone_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h index 17e8573bea21..b2ec195a1484 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h @@ -5,7 +5,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Merge_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementXMonotoneTraits_2::Merge_2} * \cgalHasModelsEnd */ class Merge_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h index 4e6a66ede1b1..1973f4a5371f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 - * \cgalHasModels ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2 - * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementVerticalSideTraits_2::Parameter_space_in_x_2} + * \cgalModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2} + * \cgalModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2} * \cgalHasModelsEnd */ class ParameterSpaceInX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h index e443f0498da4..19dae4f4cde1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h @@ -5,9 +5,10 @@ namespace ArrTraits { * * \cgalRefines{AdaptableBinaryFunction} * - * \cgalHasModelsBegin ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 - * \cgalHasModels ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2 - * \cgalHasModels ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2} + * \cgalModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2} + * \cgalModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2} * \cgalHasModelsEnd */ class ParameterSpaceInY_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h index 182f0a059bad..cc53c3b9467d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h @@ -7,7 +7,8 @@ namespace ArrTraits { * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::Point_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::Point_2} * \cgalHasModelsEnd */ class Point_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h index ff6bcb382cbf..71519a41aea9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h @@ -4,7 +4,8 @@ namespace ArrTraits { * * \cgalRefines{Functor} * - * \cgalHasModelsBegin ArrangementXMonotoneTraits_2::Split_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementXMonotoneTraits_2::Split_2} * \cgalHasModelsEnd */ class Split_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h index f74e74bf150d..cf004f92dd04 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h @@ -6,7 +6,8 @@ namespace ArrTraits { * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModelsBegin ArrangementBasicTraits_2::X_monotone_curve_2 + * \cgalHasModelsBegin + * \cgalModels{ArrangementBasicTraits_2::X_monotone_curve_2} * \cgalHasModelsEnd */ class XMonotoneCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h index b4720036574e..a6940b050c1a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h @@ -8,14 +8,15 @@ point. \cgalRefines{ArrangementBasicTraits_2} -\cgalHasModelsBegin CGAL::Arr_conic_traits_2 -\cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 -\cgalHasModels CGAL::Arr_linear_traits_2 -\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 -\cgalHasModels CGAL::Arr_segment_traits_2 -\cgalHasModels CGAL::Arr_polycurve_traits_2 -\cgalHasModels CGAL::Arr_polyline_traits_2 -\cgalHasModels CGAL::Arr_rational_function_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_conic_traits_2} +\cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} +\cgalModels{CGAL::Arr_linear_traits_2} +\cgalModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalModels{CGAL::Arr_segment_traits_2} +\cgalModels{CGAL::Arr_polycurve_traits_2} +\cgalModels{CGAL::Arr_polyline_traits_2} +\cgalModels{CGAL::Arr_rational_function_traits_2} \cgalHasModelsEnd \sa `ArrangementConstructXMonotoneCurveTraits_2`, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h index 3e8c60735722..6edbb7820d6d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h @@ -9,7 +9,8 @@ * represent the arrangement cells (i.e., vertices, edges, and facets) and the * incident relations between them. * - * \cgalHasModelsBegin CGAL::Arr_spherical_topology_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_spherical_topology_traits_2} * \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h index e521ef28b065..530aac71c9c5 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h @@ -27,21 +27,22 @@ * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * - * \cgalHasModelsBegin CGAL::Arr_segment_traits_2 - * \cgalHasModels CGAL::Arr_non_caching_segment_basic_traits_2 - * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 - * \cgalHasModels CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_polyline_traits_2 - * \cgalHasModels CGAL::Arr_circle_segment_traits_2 - * \cgalHasModels CGAL::Arr_line_arc_traits_2 - * \cgalHasModels CGAL::Arr_circular_arc_traits_2 - * \cgalHasModels CGAL::Arr_circular_line_arc_traits_2 - * \cgalHasModels CGAL::Arr_conic_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 - * \cgalHasModels CGAL::Arr_Bezier_curve_traits_2 - * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 - * \cgalHasModels CGAL::Arr_curve_data_traits_2 - * \cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_segment_traits_2} + * \cgalModels{CGAL::Arr_non_caching_segment_basic_traits_2} + * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_polyline_traits_2} + * \cgalModels{CGAL::Arr_circle_segment_traits_2} + * \cgalModels{CGAL::Arr_line_arc_traits_2} + * \cgalModels{CGAL::Arr_circular_arc_traits_2} + * \cgalModels{CGAL::Arr_circular_line_arc_traits_2} + * \cgalModels{CGAL::Arr_conic_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalModels{CGAL::Arr_Bezier_curve_traits_2} + * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalModels{CGAL::Arr_curve_data_traits_2} + * \cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} * \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h index 176810a0793e..c0f8193d057a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h @@ -7,13 +7,14 @@ * * \cgalRefines{ArrangementTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 - * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 - * \cgalHasModels CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 - * \cgalHasModels CGAL::Arr_segment_traits_2 - * \cgalHasModels CGAL::Arr_polyline_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_conic_traits_2} + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalModels{CGAL::Arr_segment_traits_2} + * \cgalModels{CGAL::Arr_polyline_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementConstructXMonotoneCurveTraits_2`, and diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h index 99ca431cd467..7bfebe4906f7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h @@ -7,13 +7,14 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 - * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 - * \cgalHasModels CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 - * \cgalHasModels CGAL::Arr_segment_traits_2 - * \cgalHasModels CGAL::Arr_polyline_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_conic_traits_2} + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalModels{CGAL::Arr_segment_traits_2} + * \cgalModels{CGAL::Arr_polyline_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementApproximateTraits_2`, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h index 81984c4699eb..b750989c9ffe 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h @@ -14,10 +14,11 @@ * `ArrangementDcelHalfedge`, `ArrangementDcelFace`, `ArrangementDcelOuterCcb`, * `ArrangementDcelInnerCcb`, and `ArrangementDcelIsolatedVertex` respectively.) * - * \cgalHasModelsBegin CGAL::Arr_dcel_base - * \cgalHasModels CGAL::Arr_default_dcel - * \cgalHasModels CGAL::Arr_face_extended_dcel - * \cgalHasModels CGAL::Arr_extended_dcel + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_dcel_base} + * \cgalModels{CGAL::Arr_default_dcel} + * \cgalModels{CGAL::Arr_face_extended_dcel} + * \cgalModels{CGAL::Arr_extended_dcel} * \cgalHasModelsEnd * * \sa `ArrangementDcelVertex` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h index d4f263cf01f1..c3d607c6e98e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h @@ -10,9 +10,10 @@ Instantiate a dcel class with many different possible types without ad-hoc limit \cgalRefines{ArrangementDcel} -\cgalHasModelsBegin CGAL::Arr_default_dcel -\cgalHasModels CGAL::Arr_face_extended_dcel -\cgalHasModels CGAL::Arr_extended_dcel +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_default_dcel} +\cgalModels{CGAL::Arr_face_extended_dcel} +\cgalModels{CGAL::Arr_extended_dcel} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h index 60e28710d01a..8dfbfb227075 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h @@ -11,10 +11,11 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 - * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 - * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h index 53469ded7bd2..07c14685f6e9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h @@ -5,9 +5,10 @@ * functions that enable reading an arrangement from an input stream using a * specific format. * - * \cgalHasModelsBegin CGAL::Arr_text_formatter - * \cgalHasModels CGAL::Arr_face_extended_text_formatter - * \cgalHasModels CGAL::Arr_extended_dcel_text_formatter + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_text_formatter} + * \cgalModels{CGAL::Arr_face_extended_text_formatter} + * \cgalModels{CGAL::Arr_extended_dcel_text_formatter} * \cgalHasModelsEnd * */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h index b014807650ae..79624fa82380 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h @@ -11,14 +11,15 @@ * * \cgalRefines{ArrangementApproximateTraits_2,ArrangementConstructXMonotoneCurveTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_conic_traits_2 - * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 - * \cgalHasModels CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_non_caching_segment_traits_2 - * \cgalHasModels CGAL::Arr_segment_traits_2 - * \cgalHasModels CGAL::Arr_polycurve_traits_2 - * \cgalHasModels CGAL::Arr_polyline_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_conic_traits_2} + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalModels{CGAL::Arr_segment_traits_2} + * \cgalModels{CGAL::Arr_polycurve_traits_2} + * \cgalModels{CGAL::Arr_polyline_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementXMonotoneTraits_2` and diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h index 16f3ffa51951..3bf6b089be6f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h @@ -39,11 +39,12 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 - * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 - * \cgalHasModels CGAL::Arr_curve_data_traits_2 - * \cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalModels{CGAL::Arr_curve_data_traits_2} + * \cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h index bee9cba77204..eb6c67a142b5 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h @@ -6,9 +6,10 @@ A model for the `ArrangementOutputFormatter` concept supports a set of functions that enable writing an arrangement to an output stream using a specific format. -\cgalHasModelsBegin CGAL::Arr_text_formatter -\cgalHasModels CGAL::Arr_face_extended_text_formatter -\cgalHasModels CGAL::Arr_extended_dcel_text_formatter +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_text_formatter} +\cgalModels{CGAL::Arr_face_extended_text_formatter} +\cgalModels{CGAL::Arr_extended_dcel_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h index 31e4bf302320..782af5d25cd5 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h @@ -20,10 +20,11 @@ the old style without any overhead, the macro `CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any \cgal header is included. -\cgalHasModelsBegin CGAL::Arr_naive_point_location -\cgalHasModels CGAL::Arr_walk_along_line_point_location -\cgalHasModels CGAL::Arr_trapezoid_ric_point_location -\cgalHasModels CGAL::Arr_landmarks_point_location +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_naive_point_location} +\cgalModels{CGAL::Arr_walk_along_line_point_location} +\cgalModels{CGAL::Arr_trapezoid_ric_point_location} +\cgalModels{CGAL::Arr_landmarks_point_location} \cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h index fe9137b5696a..2c2d0ad0208d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h @@ -11,7 +11,8 @@ * \cgalRefines{ArrangementBasicTraits_2,ArrangementIdentifiedVerticalTraits_2, * ArrangementContractedBottomTraits_2,ArrangementContractedTopTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementOpenBoundaryTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h index 80660fcda14d..defff744a976 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h @@ -20,9 +20,10 @@ * * At this point we do not expose all the requirements of this concept. * - * \cgalHasModelsBegin CGAL::Arr_bounded_planar_topology_traits_2 - * \cgalHasModels CGAL::Arr_unb_planar_topology_traits_2 - * \cgalHasModels CGAL::Arr_spherical_topology_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_bounded_planar_topology_traits_2} + * \cgalModels{CGAL::Arr_unb_planar_topology_traits_2} + * \cgalModels{CGAL::Arr_spherical_topology_traits_2} * \cgalHasModelsEnd * * \sa `Arrangement_on_surface_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h index e9bca5d3dc96..897ede7f25a3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h @@ -30,20 +30,21 @@ that accept such curves, such as `intsert()`. \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModelsBegin CGAL::Arr_segment_traits_2 -\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 -\cgalHasModels CGAL::Arr_linear_traits_2 -\cgalHasModels CGAL::Arr_polyline_traits_2 -\cgalHasModels CGAL::Arr_circle_segment_traits_2 -\cgalHasModels CGAL::Arr_line_arc_traits_2 -\cgalHasModels CGAL::Arr_circular_arc_traits_2 -\cgalHasModels CGAL::Arr_circular_line_arc_traits_2 -\cgalHasModels CGAL::Arr_conic_traits_2 -\cgalHasModels CGAL::Arr_rational_function_traits_2 -\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 -\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 -\cgalHasModels CGAL::Arr_curve_data_traits_2 -\cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_segment_traits_2} +\cgalModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalModels{CGAL::Arr_linear_traits_2} +\cgalModels{CGAL::Arr_polyline_traits_2} +\cgalModels{CGAL::Arr_circle_segment_traits_2} +\cgalModels{CGAL::Arr_line_arc_traits_2} +\cgalModels{CGAL::Arr_circular_arc_traits_2} +\cgalModels{CGAL::Arr_circular_line_arc_traits_2} +\cgalModels{CGAL::Arr_conic_traits_2} +\cgalModels{CGAL::Arr_rational_function_traits_2} +\cgalModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalModels{CGAL::Arr_algebraic_segment_traits_2} +\cgalModels{CGAL::Arr_curve_data_traits_2} +\cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} \cgalHasModelsEnd \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h index eb1b893f460e..0b7c89be1586 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h @@ -28,10 +28,11 @@ is recommended. To enable the old style without any overhead, the macro `CGAL_ARR_POINT_LOCATION_VERSION` can be defined to 1 before any \cgal header is included. -\cgalHasModelsBegin CGAL::Arr_naive_point_location -\cgalHasModels CGAL::Arr_walk_along_line_point_location -\cgalHasModels CGAL::Arr_trapezoid_ric_point_location -\cgalHasModels CGAL::Arr_landmarks_point_location +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_naive_point_location} +\cgalModels{CGAL::Arr_walk_along_line_point_location} +\cgalModels{CGAL::Arr_trapezoid_ric_point_location} +\cgalModels{CGAL::Arr_landmarks_point_location} \cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h index e12fda8a889f..2b9d1c9f6c16 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h @@ -11,10 +11,11 @@ * * \cgalRefines{ArrangementBasicTraits_2} * - * \cgalHasModelsBegin CGAL::Arr_linear_traits_2 - * \cgalHasModels CGAL::Arr_rational_function_traits_2 - * \cgalHasModels CGAL::Arr_algebraic_segment_traits_2 - * \cgalHasModels CGAL::Arr_geodesic_arc_on_sphere_traits_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::Arr_linear_traits_2} + * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h index 4b31986adfb5..601725e3c065 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h @@ -9,7 +9,8 @@ specific format. \cgalRefines{ArrangementInputFormatter} -\cgalHasModelsBegin CGAL::Arr_with_history_text_formatter +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_with_history_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h index 8ff0dc5eda48..287a3a9f7ebd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h @@ -9,7 +9,8 @@ specific format. \cgalRefines{ArrangementOutputFormatter} -\cgalHasModelsBegin CGAL::Arr_with_history_text_formatter +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_with_history_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h index 99e34f2ae6d1..32e49f947dcd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h @@ -18,20 +18,21 @@ curve splitting. \cgalRefines{ArrangementBasicTraits_2} -\cgalHasModelsBegin CGAL::Arr_segment_traits_2 -\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 -\cgalHasModels CGAL::Arr_linear_traits_2 -\cgalHasModels CGAL::Arr_polyline_traits_2 -\cgalHasModels CGAL::Arr_circle_segment_traits_2 -\cgalHasModels CGAL::Arr_line_arc_traits_2 -\cgalHasModels CGAL::Arr_circular_arc_traits_2 -\cgalHasModels CGAL::Arr_circular_line_arc_traits_2 -\cgalHasModels CGAL::Arr_conic_traits_2 -\cgalHasModels CGAL::Arr_rational_function_traits_2 -\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 -\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 -\cgalHasModels CGAL::Arr_curve_data_traits_2 -\cgalHasModels CGAL::Arr_consolidated_curve_data_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_segment_traits_2} +\cgalModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalModels{CGAL::Arr_linear_traits_2} +\cgalModels{CGAL::Arr_polyline_traits_2} +\cgalModels{CGAL::Arr_circle_segment_traits_2} +\cgalModels{CGAL::Arr_line_arc_traits_2} +\cgalModels{CGAL::Arr_circular_arc_traits_2} +\cgalModels{CGAL::Arr_circular_line_arc_traits_2} +\cgalModels{CGAL::Arr_conic_traits_2} +\cgalModels{CGAL::Arr_rational_function_traits_2} +\cgalModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalModels{CGAL::Arr_algebraic_segment_traits_2} +\cgalModels{CGAL::Arr_curve_data_traits_2} +\cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} \cgalHasModelsEnd \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h index 2a90dfee44dc..678d26425c4d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h @@ -11,8 +11,9 @@ Models for the concept are used by the global `overlay()` function to maintain the auxiliary data stored with the \dcel records of the resulting overlaid arrangement, based on the contents of the input records. -\cgalHasModelsBegin CGAL::Arr_default_overlay_traits -\cgalHasModels CGAL::Arr_face_overlay_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_default_overlay_traits} +\cgalModels{CGAL::Arr_face_overlay_traits} \cgalHasModelsEnd \sa `overlay` diff --git a/BGL/doc/BGL/Concepts/EdgeListGraph.h b/BGL/doc/BGL/Concepts/EdgeListGraph.h index 93b23b76748a..f1a0412db76c 100644 --- a/BGL/doc/BGL/Concepts/EdgeListGraph.h +++ b/BGL/doc/BGL/Concepts/EdgeListGraph.h @@ -11,7 +11,9 @@ and adds the requirement for traversal of all edges in a graph. \cgalRefines{Graph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/FaceGraph.h b/BGL/doc/BGL/Concepts/FaceGraph.h index a8b8bbe18935..0320f5b7b76f 100644 --- a/BGL/doc/BGL/Concepts/FaceGraph.h +++ b/BGL/doc/BGL/Concepts/FaceGraph.h @@ -20,7 +20,9 @@ A face descriptor must be `DefaultConstructible`, `Assignable`, `EqualityCompara \cgalRefines{HalfedgeGraph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/FaceListGraph.h b/BGL/doc/BGL/Concepts/FaceListGraph.h index 046015b67d2f..40339f34e8f4 100644 --- a/BGL/doc/BGL/Concepts/FaceListGraph.h +++ b/BGL/doc/BGL/Concepts/FaceListGraph.h @@ -16,7 +16,9 @@ face iterator must be the same as the face descriptor of the graph. \cgalRefines{FaceGraph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/HalfedgeGraph.h b/BGL/doc/BGL/Concepts/HalfedgeGraph.h index 7be2d2220d71..15600e021759 100644 --- a/BGL/doc/BGL/Concepts/HalfedgeGraph.h +++ b/BGL/doc/BGL/Concepts/HalfedgeGraph.h @@ -38,7 +38,9 @@ An edge descriptor must be `DefaultConstructible`, `Assignable`, `EqualityCompar A model of `HalfedgeGraph` must have the interior property `vertex_point` attached to its vertices. +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/HalfedgeListGraph.h b/BGL/doc/BGL/Concepts/HalfedgeListGraph.h index c5f8eeff6898..a709aadaa8be 100644 --- a/BGL/doc/BGL/Concepts/HalfedgeListGraph.h +++ b/BGL/doc/BGL/Concepts/HalfedgeListGraph.h @@ -16,7 +16,9 @@ halfedge iterator must be the same as the halfedge descriptor of the graph. \cgalRefines{HalfedgeGraph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/MutableFaceGraph.h b/BGL/doc/BGL/Concepts/MutableFaceGraph.h index 1f0f86c6a863..f47bf7de8163 100644 --- a/BGL/doc/BGL/Concepts/MutableFaceGraph.h +++ b/BGL/doc/BGL/Concepts/MutableFaceGraph.h @@ -7,7 +7,9 @@ the requirement for operations to add faces and to modify face-halfedge relation \cgalRefines{FaceGraph,MutableHalfedgeGraph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h b/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h index 86bd650fc867..c5d8c66ec568 100644 --- a/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h +++ b/BGL/doc/BGL/Concepts/MutableHalfedgeGraph.h @@ -8,7 +8,9 @@ update the incidence information between vertices and halfedges. \cgalRefines{HalfedgeGraph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/BGL/doc/BGL/Concepts/VertexListGraph.h b/BGL/doc/BGL/Concepts/VertexListGraph.h index 009fe00dac1b..f6e65cf72000 100644 --- a/BGL/doc/BGL/Concepts/VertexListGraph.h +++ b/BGL/doc/BGL/Concepts/VertexListGraph.h @@ -11,7 +11,9 @@ and adds the requirement for traversal of all vertices in a graph. \cgalRefines{Graph} +\cgalHasModelsBegin \cgalHasModelsBare{See \link PkgBGLTraits Boost Graph Traits Specializations \endlink} +\cgalHasModelsEnd \sa \link PkgBGLConcepts Graph Concepts \endlink */ diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h index 9fd9c19943b5..35818aa505d6 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h @@ -8,9 +8,10 @@ namespace Barycentric_coordinates { A concept that describes the set of methods that should be defined for all coordinate models used to parameterize the class `Generalized_barycentric_coordinates_2`. -\cgalHasModelsBegin Wachspress_2 -\cgalHasModels Mean_value_2 -\cgalHasModels Discrete_harmonic_2 +\cgalHasModelsBegin +\cgalModels{Wachspress_2} +\cgalModels{Mean_value_2} +\cgalModels{Discrete_harmonic_2} \cgalHasModelsEnd \deprecated This part of the package is deprecated since the version 5.4 of \cgal. diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h index bf07127b14db..6fb0823a7446 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h @@ -9,10 +9,12 @@ A concept that describes the set of requirements of the template parameter `GeomTraits` used to parameterize all classes and functions with 2D barycentric coordinates from the namespace `CGAL::Barycentric_coordinates`. -\cgalHasModelsBareBegin{All models of `Kernel`} CGAL::Projection_traits_3 -\cgalHasModels CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of `Kernel`} +\cgalHasModels{CGAL::Projection_traits_3} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd */ class BarycentricTraits_2 { diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h index 9ace050c0d8b..b1613da6b02c 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h @@ -13,7 +13,8 @@ elements, which share common edges and vertices. These finite elements are then used to approximate certain types of generalized barycentric coordinate functions. The domain is bounded by the polygon. -\cgalHasModelsBegin Delaunay_domain_2 +\cgalHasModelsBegin +\cgalModels{Delaunay_domain_2} \cgalHasModelsEnd */ class DiscretizedDomain_2 { diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h index 409316c5a4e6..bc3fa2117d32 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h index f4fcfa096e92..a2e684be6263 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h @@ -6,7 +6,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h index 719878346a5c..bac19b870721 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h @@ -6,7 +6,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h index 1e98facf71d9..f82f215155a4 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Intersect_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Intersect_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h index 2064a3ba0797..a2b89befdec1 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Merge_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Merge_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h index 91f8903728c8..7bca25154fd4 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h @@ -5,7 +5,8 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} -\cgalHasModelsBegin ArrangementDirectionalXMonotoneTraits_2::Split_2 +\cgalHasModelsBegin +\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Split_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h index 6b66a66997bb..15aaffd07888 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h @@ -16,13 +16,14 @@ as its source and the other as its target. \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModelsBegin CGAL::Arr_segment_traits_2 -\cgalHasModels CGAL::Arr_non_caching_segment_traits_2 -\cgalHasModels CGAL::Arr_circle_segment_traits_2 -\cgalHasModels CGAL::Arr_conic_traits_2 -\cgalHasModels CGAL::Arr_rational_function_traits_2 -\cgalHasModels CGAL::Arr_Bezier_curve_traits_2 -\cgalHasModels CGAL::Arr_algebraic_segment_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Arr_segment_traits_2} +\cgalModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalModels{CGAL::Arr_circle_segment_traits_2} +\cgalModels{CGAL::Arr_conic_traits_2} +\cgalModels{CGAL::Arr_rational_function_traits_2} +\cgalModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalModels{CGAL::Arr_algebraic_segment_traits_2} \cgalHasModelsEnd \sa `ArrangementXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h index 9264a822bff7..3151c6eb0746 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h @@ -16,7 +16,8 @@ respectively \cgalRefines{ArrangementDcel} -\cgalHasModelsBegin CGAL::Gps_default_dcel +\cgalHasModelsBegin +\cgalModels{CGAL::Gps_default_dcel} \cgalHasModelsEnd \sa `GeneralPolygonSetDcelFace` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h index 029f24e7b3f0..123f3b883cfb 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h @@ -9,7 +9,8 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelFace} -\cgalHasModelsBegin CGAL::Gps_face_base +\cgalHasModelsBegin +\cgalModels{CGAL::Gps_face_base} \cgalHasModelsEnd \sa `ArrangementDcel` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h index 900f52372298..3f254f685a28 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h @@ -8,7 +8,8 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelHalfedge} -\cgalHasModelsBegin CGAL::Gps_face_halfedge +\cgalHasModelsBegin +\cgalModels{CGAL::Gps_face_halfedge} \cgalHasModelsEnd \sa `ArrangementDcel` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h index 5271a7807440..bd1afb8ed78e 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h @@ -13,9 +13,10 @@ types. \cgalRefines{ArrangementDirectionalXMonotoneTraits_2} -\cgalHasModelsBegin CGAL::Gps_segment_traits_2 -\cgalHasModels CGAL::Gps_circle_segment_traits_2 -\cgalHasModels CGAL::Gps_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Gps_segment_traits_2} +\cgalModels{CGAL::Gps_circle_segment_traits_2} +\cgalModels{CGAL::Gps_traits_2} \cgalHasModelsEnd \sa `ArrangementDirectionalXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h index d9103ae6839a..b9e255935261 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h @@ -16,7 +16,8 @@ accordingly. Only counterclockwise oriented polygons are valid operands of Boolean set-operations. General polygon that represent holes must be clockwise oriented. -\cgalHasModelsBegin CGAL::General_polygon_2 +\cgalHasModelsBegin +\cgalModels{CGAL::General_polygon_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h index c9d62f6cef64..2515be1d0e7f 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h @@ -9,7 +9,8 @@ A model of this concept represents a general polygon with holes. \cgalGeneralizes `GeneralPolygonWithHoles_2` -\cgalHasModelsBegin GeneralPolygonSetTraits_2::Polygon_with_holes2 +\cgalHasModelsBegin +\cgalModels{GeneralPolygonSetTraits_2::Polygon_with_holes2} \cgalHasModelsEnd \sa `GeneralPolygonWithHoles_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h index a9999735b0e7..dc6486a1a31c 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h @@ -9,8 +9,9 @@ A model of this concept represents a simple general polygon. \cgalGeneralizes `GeneralPolygon_2` -\cgalHasModelsBegin GeneralPolygonSetTraits_2::Polygon_2 -\cgalHasModels CGAL::Polygon_2 +\cgalHasModelsBegin +\cgalModels{GeneralPolygonSetTraits_2::Polygon_2} +\cgalModels{CGAL::Polygon_2} \cgalHasModelsEnd \sa `GeneralPolygon_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h index 05721090917e..0ce3d2249b9f 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h @@ -8,9 +8,10 @@ This concept defines the requirements for traits classes of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Approximate_min_ellipsoid_d_traits_2 -\cgalHasModels CGAL::Approximate_min_ellipsoid_d_traits_3 -\cgalHasModels CGAL::Approximate_min_ellipsoid_d_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_2} +\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_3} +\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h index 71cb832881ed..3e25f230aebf 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h @@ -6,7 +6,8 @@ This concept defines the requirements for traits classes of `CGAL::Min_circle_2`. -\cgalHasModelsBegin CGAL::Min_circle_2_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Min_circle_2_traits_2} \cgalHasModelsEnd \sa `CGAL::Min_circle_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h index d6cfac02a1fb..853c32438132 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h @@ -6,7 +6,8 @@ This concept defines the requirements for traits classes of `CGAL::Min_ellipse_2`. -\cgalHasModelsBegin CGAL::Min_ellipse_2_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Min_ellipse_2_traits_2} \cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h index 17da54b77741..592d52d69d9c 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h @@ -8,7 +8,8 @@ needed to compute minimum enclosing quadrilaterals of a planar point set using the functions `min_rectangle_2()`, `min_parallelogram_2()` and `min_strip_2()`. -\cgalHasModelsBegin CGAL::Min_quadrilateral_default_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Min_quadrilateral_default_traits_2} \cgalHasModelsEnd \sa `CGAL::min_rectangle_2()` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h index ddd404f13c6b..0d812dd559b0 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h @@ -6,9 +6,10 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional min sphere and min annulus algorithms. -\cgalHasModelsBegin CGAL::Min_sphere_annulus_d_traits_2 -\cgalHasModels CGAL::Min_sphere_annulus_d_traits_3 -\cgalHasModels CGAL::Min_sphere_annulus_d_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Min_sphere_annulus_d_traits_2} +\cgalModels{CGAL::Min_sphere_annulus_d_traits_3} +\cgalModels{CGAL::Min_sphere_annulus_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Min_sphere_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h index 345beddeb9cf..2e19511b8103 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h @@ -6,12 +6,13 @@ A model of concept `MinSphereOfSpheresTraits` must provide the following constants, types, predicates and operations. -\cgalHasModelsBegin CGAL::Min_sphere_of_spheres_d_traits_2 -\cgalHasModels CGAL::Min_sphere_of_spheres_d_traits_3 -\cgalHasModels CGAL::Min_sphere_of_spheres_d_traits_d -\cgalHasModels CGAL::Min_sphere_of_points_d_traits_2 -\cgalHasModels CGAL::Min_sphere_of_points_d_traits_3 -\cgalHasModels CGAL::Min_sphere_of_points_d_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_2} +\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_3} +\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_d} +\cgalModels{CGAL::Min_sphere_of_points_d_traits_2} +\cgalModels{CGAL::Min_sphere_of_points_d_traits_3} +\cgalModels{CGAL::Min_sphere_of_points_d_traits_d} \cgalHasModelsEnd */ diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h index 2c9c9ba44d50..b72e77f91d34 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h @@ -7,7 +7,8 @@ The concept `RectangularPCenterTraits_2` defines types and operations needed to compute rectilinear \f$ p\f$-centers of a planar point set using the function `CGAL::rectangular_p_center_2()`. -\cgalHasModelsBegin CGAL::Rectangular_p_center_default_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Rectangular_p_center_default_traits_2} \cgalHasModelsEnd \sa `CGAL::rectangular_p_center_2()` diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h index 594f4c94ebb9..d41ffd3d8425 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h @@ -10,8 +10,9 @@ the dimension, the `id`-number, and the boundaries of the box. \cgalRefines{Assignable} -\cgalHasModelsBegin CGAL::Box_intersection_d::Box_d -\cgalHasModels CGAL::Box_intersection_d::Box_with_handle_d +\cgalHasModelsBegin +\cgalModels{CGAL::Box_intersection_d::Box_d} +\cgalModels{CGAL::Box_intersection_d::Box_with_handle_d} \cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h index cf6dfcb546dc..98cb8e4a34f9 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h @@ -9,7 +9,8 @@ the boxes manipulated in these algorithms. \cgalRefines{Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Box_intersection_d::Box_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Box_intersection_d::Box_traits_d} \cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h index f5a18c372206..05175484ac24 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h @@ -11,7 +11,8 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Polynomial_for_circles_2_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomial_for_circles_2_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h index b01eedc5a49c..ee376204999c 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h @@ -9,7 +9,8 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Polynomial_1_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomial_1_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h index d17715759643..13cdb5119351 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h @@ -7,7 +7,8 @@ Concept to represent the roots of a system of two equations of degree 2 in two variables `x` and `y` that are models of concept `AlgebraicKernelForCircles::PolynomialForCircles_2_2` -\cgalHasModelsBegin CGAL::Root_for_circles_2_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Root_for_circles_2_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h index e0d50ab1b572..9b259e047c3c 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h @@ -7,7 +7,8 @@ The `AlgebraicKernelForCircles` concept is meant to provide the curved kernel with all the algebraic functionalities required for the manipulation of circular arcs. -\cgalHasModelsBegin CGAL::Algebraic_kernel_for_circles_2_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Algebraic_kernel_for_circles_2_2} \cgalHasModelsEnd \sa `CircularKernel` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h index 603867502f9f..82cf9487e871 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h @@ -7,7 +7,8 @@ Concept for points on circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Circular_arc_point_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Circular_arc_point_2} \cgalHasModelsEnd */ class CircularKernel::CircularArcPoint_2 { diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h index bd5586d0035c..d5833dfa55d1 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h @@ -7,7 +7,8 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Circular_arc_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Circular_arc_2} \cgalHasModelsEnd */ diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h index 7f82890c16ae..e92230b10a02 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h @@ -9,7 +9,8 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Line_arc_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Line_arc_2} \cgalHasModelsEnd */ diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h index a151ed891918..d5c912468c6f 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h @@ -5,8 +5,9 @@ \cgalRefines{Kernel} -\cgalHasModelsBegin CGAL::Circular_kernel_2 -\cgalHasModels CGAL::Exact_circular_kernel_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Circular_kernel_2} +\cgalModels{CGAL::Exact_circular_kernel_2} \cgalHasModelsEnd \sa `Kernel` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h index 0dbd299b9cd7..70aa9278d6b7 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h @@ -11,7 +11,8 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin GAL::Polynomial_for_spheres_2_ +\cgalHasModelsBegin +\cgalModels{GAL::Polynomial_for_spheres_2_} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h index 8cf947c04bae..6423e3805a0b 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h @@ -9,7 +9,8 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Polynomial_1_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomial_1_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h index 70866c01e37d..99d40b5860a0 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h @@ -8,7 +8,8 @@ capable of storing equations of lines. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Polynomials_for_lines_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomials_for_lines_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h index 2754b94e0913..cb25b3d6244f 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h @@ -7,7 +7,8 @@ Concept to represent the roots of a system of three equations of degree 2 in three variables `x`, `y` and `z` that are models of concept `AlgebraicKernelForSpheres::PolynomialForSpheres_2_3`. -\cgalHasModelsBegin CGAL::Root_for_spheres_2_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Root_for_spheres_2_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h index e83eca8300dd..585101b73df1 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h @@ -7,7 +7,8 @@ The `AlgebraicKernelForSpheres` concept is meant to provide the curved kernel with all the algebraic functionalities required for the manipulation of spheres, circles, and circular arcs in 3D. -\cgalHasModelsBegin CGAL::Algebraic_kernel_for_spheres_2_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Algebraic_kernel_for_spheres_2_3} \cgalHasModelsEnd \sa `SphericalKernel` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h index 81128f2844ee..8c932d227124 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h @@ -7,7 +7,8 @@ Concept for points on spheres, circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Circular_arc_point_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Circular_arc_point_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h index 5a8498f28243..644a50773840 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h @@ -7,7 +7,8 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Circular_arc_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Circular_arc_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h index 07946ba0f146..ca26700179f0 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h @@ -9,7 +9,8 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Line_arc_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Line_arc_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h index 3bafc8659d0b..22b389149611 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h @@ -5,8 +5,9 @@ \cgalRefines{Kernel} -\cgalHasModelsBegin CGAL::Spherical_kernel_3 -\cgalHasModels CGAL::Exact_spherical_kernel_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Spherical_kernel_3} +\cgalModels{CGAL::Exact_spherical_kernel_3} \cgalHasModelsEnd \sa `Kernel` diff --git a/Circulator/doc/Circulator/Concepts/ConstHandle.h b/Circulator/doc/Circulator/Concepts/ConstHandle.h index 9ff3bea6b33d..b15f9c6fd0c0 100644 --- a/Circulator/doc/Circulator/Concepts/ConstHandle.h +++ b/Circulator/doc/Circulator/Concepts/ConstHandle.h @@ -7,7 +7,8 @@ A constant handle. Refer to the `Handle` concept for more details. \cgalRefines{Descriptor} -\cgalHasModelsBegin const T* (const pointers) +\cgalHasModelsBegin +\cgalModels{const T* (const pointers)} \cgalHasModelsEnd \sa `Handle` diff --git a/Circulator/doc/Circulator/Concepts/ConstRange.h b/Circulator/doc/Circulator/Concepts/ConstRange.h index 643dc47c83be..a0a6751737c2 100644 --- a/Circulator/doc/Circulator/Concepts/ConstRange.h +++ b/Circulator/doc/Circulator/Concepts/ConstRange.h @@ -7,7 +7,10 @@ A constant iterator range. Refer to the `Range` concept for more details. \cgalRefinesBare{Boost's %Range concept} -\cgalHasModelsBare{STL containers,`boost::iterator_range`} +\cgalHasModelsBegin +\cgalHasModelsBare{STL containers} +\cgalHasModelsBare{`boost::iterator_range`} +\cgalHasModelsEnd \sa `Range` diff --git a/Circulator/doc/Circulator/Concepts/Handle.h b/Circulator/doc/Circulator/Concepts/Handle.h index a5fade1d46fa..0e531736bcf0 100644 --- a/Circulator/doc/Circulator/Concepts/Handle.h +++ b/Circulator/doc/Circulator/Concepts/Handle.h @@ -23,10 +23,11 @@ operator is concerned (this serves the same purpose as NULL for pointers). (Note that this is not a generally supported feature of iterators of standard containers.) -\cgalHasModelsBegin T* (pointer) -\cgalHasModels const T* (const pointers) -\cgalHasModels Iterator -\cgalHasModels Circulator +\cgalHasModelsBegin +\cgalModels{T* (pointer)} +\cgalModels{const T* (const pointers)} +\cgalModels{Iterator} +\cgalModels{Circulator} \cgalHasModelsEnd */ class Handle { diff --git a/Circulator/doc/Circulator/Concepts/Range.h b/Circulator/doc/Circulator/Concepts/Range.h index ef6cfd56d58b..afd4b4271825 100644 --- a/Circulator/doc/Circulator/Concepts/Range.h +++ b/Circulator/doc/Circulator/Concepts/Range.h @@ -31,7 +31,9 @@ difference with iterators which are typically passed by value. \cgalRefinesBare{ConstRange,Boost's %Range concept} +\cgalHasModelsBegin \cgalHasModelsBare{STL containers} +\cgalHasModelsEnd */ diff --git a/Classification/doc/Classification/Concepts/Classifier.h b/Classification/doc/Classification/Concepts/Classifier.h index 9a3505997949..fefec08fcebe 100644 --- a/Classification/doc/Classification/Concepts/Classifier.h +++ b/Classification/doc/Classification/Concepts/Classifier.h @@ -12,9 +12,10 @@ Concept describing a classifier used by classification functions (see `CGAL::Classification::classify()`, `CGAL::Classification::classify_with_local_smoothing()` and `CGAL::Classification::classify_with_graphcut()`). -\cgalHasModelsBegin CGAL::Classification::Sum_of_weighted_features_classifier -\cgalHasModels CGAL::Classification::ETHZ::Random_forest_classifier -\cgalHasModels CGAL::Classification::OpenCV::Random_forest_classifier +\cgalHasModelsBegin +\cgalModels{CGAL::Classification::Sum_of_weighted_features_classifier} +\cgalModels{CGAL::Classification::ETHZ::Random_forest_classifier} +\cgalModels{CGAL::Classification::OpenCV::Random_forest_classifier} \cgalHasModelsEnd */ diff --git a/Classification/doc/Classification/Concepts/NeighborQuery.h b/Classification/doc/Classification/Concepts/NeighborQuery.h index 99aeb76cb2f6..4db42f7b4b8a 100644 --- a/Classification/doc/Classification/Concepts/NeighborQuery.h +++ b/Classification/doc/Classification/Concepts/NeighborQuery.h @@ -10,10 +10,11 @@ namespace Classification Concept describing a neighbor query used for classification. -\cgalHasModelsBegin CGAL::Classification::Point_set_neighborhood::K_neighbor_query -\cgalHasModels CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query -\cgalHasModels CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query -\cgalHasModels CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query +\cgalHasModelsBegin +\cgalModels{CGAL::Classification::Point_set_neighborhood::K_neighbor_query} +\cgalModels{CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query} +\cgalModels{CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query} +\cgalModels{CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query} \cgalHasModelsEnd */ diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h index ad331c7bc22b..ec2f990abf1b 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/CellAttribute.h @@ -5,7 +5,9 @@ The concept `CellAttribute` represents a non void attribute associated with a cell of a generic map. It can keep a descriptor to one dart of its associated cell, and can contain any information. +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Cell_attribute `CGAL::Cell_attribute`\endlink} +\cgalHasModelsEnd \sa `GenericMap` \sa `GenericMapItems` diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h index ecf28bda596e..251d424bc029 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/CombinatorialMap.h @@ -6,7 +6,9 @@ The concept `CombinatorialMap` defines a d-dimensional combinatorial map. \cgalRefines{GenericMap} +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink} +\cgalHasModelsEnd For a combinatorial map, the function \link GenericMap::next `next`\endlink is equal to \f$ \beta_1\f$, \link GenericMap::previous `previous`\endlink is equal to \f$ \beta_0\f$ and the function \link GenericMap::opposite `opposite`\endlink is equal to \f$ \beta_i\f$. */ diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h index 87113f9aa211..9e09eb5dea8d 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMap.h @@ -8,8 +8,10 @@ The concept `GenericMap` defines a d-dimensional generic map. This concep A generic map has a set of darts D, and functions \f$ f_0\f$,\f$ \ldots\f$,\f$ f_{d}\f$ that link these darts between them. -\cgalHasModelsBare{\link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink\n - \link CGAL::Generalized_map `CGAL::Generalized_map`\endlink} +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Combinatorial_map `CGAL::Combinatorial_map`\endlink} +\cgalHasModelsBare{\link CGAL::Generalized_map `CGAL::Generalized_map`\endlink} +\cgalHasModelsEnd \sa `CombinatorialMap` \sa `GeneralizedMap` diff --git a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h index 6fd24033a72b..4117f134ecc6 100644 --- a/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h +++ b/Combinatorial_map/doc/Combinatorial_map/Concepts/GenericMapItems.h @@ -4,7 +4,9 @@ The concept `GenericMapItems` allows to customize a dD generic map by choosing the information associated with darts, by enabling and disabling some attributes, and by choosing to use indices or handles. For that, it defines an inner class template named \link GenericMapItems::Dart_wrapper `Dart_wrapper`\endlink, with one template parameter, `Map`, a model of the `GenericMap` concept. This inner class can define the two types `%Dart_info` and `%Attributes`. +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Generic_map_min_items `CGAL::Generic_map_min_items`\endlink} +\cgalHasModelsEnd \sa `GenericMap` diff --git a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h index 251e12f7fb91..f5e1d3a6f365 100644 --- a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h @@ -9,12 +9,13 @@ primitives (objects and predicates) that the convex hull algorithms use. functions. The specific subset of these primitives required by each function is specified with each function. -\cgalHasModelsBegin CGAL::Convex_hull_constructive_traits_2 -\cgalHasModels CGAL::Convex_hull_traits_2 -\cgalHasModels CGAL::Convex_hull_traits_adapter_2 -\cgalHasModels CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Convex_hull_constructive_traits_2} +\cgalModels{CGAL::Convex_hull_traits_2} +\cgalModels{CGAL::Convex_hull_traits_adapter_2} +\cgalModels{CGAL::Projection_traits_xy_3} +\cgalModels{CGAL::Projection_traits_yz_3} +\cgalModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h index 711efc4d8aa4..b9fd8dac2302 100644 --- a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h @@ -4,8 +4,9 @@ Requirements of the traits class of the function `CGAL::convex_hull_3()`. -\cgalHasModelsBegin CGAL::Convex_hull_traits_3 -\cgalHasModels CGAL::Extreme_points_traits_adapter_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Convex_hull_traits_3} +\cgalModels{CGAL::Extreme_points_traits_adapter_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h b/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h index 6f3bad1286ed..5b03c77793f4 100644 --- a/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/Concepts/IsStronglyConvexTraits_3.h @@ -6,7 +6,9 @@ Requirements of the traits class used by the function `CGAL::is_strongly_convex_3()`, which is used for postcondition checking by `CGAL::convex_hull_3()`. -\cgalHasModelsBareBegin{All models of `Kernel`} CGAL::Convex_hull_traits_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of `Kernel`} +\cgalHasModels{CGAL::Convex_hull_traits_3} \cgalHasModelsEnd \sa `ConvexHullTraits_3` diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h index 78e06df722d3..fce2c1aa3200 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h @@ -7,9 +7,10 @@ Requirements of the traits class to be used with the class `CGAL::Convex_hull_d`. -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d -\cgalHasModels CGAL::Convex_hull_d_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} +\cgalModels{CGAL::Convex_hull_d_traits_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h index 23352fbe2e6e..0937e25239c1 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h @@ -7,8 +7,9 @@ Requirements of the second traits class to be used with the class `CGAL::Delaunay_d`. -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h index b8e91a96aa9a..2f91bbf7d823 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h @@ -7,8 +7,9 @@ Requirements of the first traits class to be used with the class `CGAL::Delaunay_d`. -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 0521a19e26d5..d25c24605aec 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -146,12 +146,10 @@ ALIASES = "cgal=%CGAL" \ "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModelsHeader=Has models" \ - "cgalHasModelsBegin=
    @cgalHasModelsHeader
    `" \ - "cgalHasModels=`
    `" \ - "cgalHasModelsEnd=`
    " \ - "cgalHasModelsBare{1}=
    @cgalHasModelsHeader
    \1
    " \ - "cgalHasModelsBare{2}=
    @cgalHasModelsHeader
    \1
    \2
    " \ - "cgalHasModelsBareBegin{1}=
    @cgalHasModelsHeader
    \1
    `" \ + "cgalHasModelsBegin=
    @cgalHasModelsHeader
    " \ + "cgalHasModels{1}=
    `\1`
    " \ + "cgalHasModelsBare{1}=
    \1
    " \ + "cgalHasModelsEnd=
    " \ "cgalDebugBegin=\htmlonly
    Debugging Support
    \endhtmlonly \n" \ "cgalDebugEnd=\htmlonly
    \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 11e0fa1ae9a6..6b2dbc6ae722 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -155,12 +155,10 @@ ALIASES = "cgal=%CGAL" \ "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModelsHeader=Has models" \ - "cgalHasModelsBegin=
    @cgalHasModelsHeader
    `" \ - "cgalHasModels=`
    `" \ - "cgalHasModelsEnd=`
    " \ - "cgalHasModelsBare{1}=
    @cgalHasModelsHeader
    \1
    " \ - "cgalHasModelsBare{2}=
    @cgalHasModelsHeader
    \1
    \2
    " \ - "cgalHasModelsBareBegin{1}=
    @cgalHasModelsHeader
    \1
    `" \ + "cgalHasModelsBegin=
    @cgalHasModelsHeader
    " \ + "cgalHasModels{1}=
    `\1`
    " \ + "cgalHasModelsBare{1}=
    \1
    " \ + "cgalHasModelsEnd=
    " \ "cgalDebugBegin=\htmlonly[block]
    Debugging Support
    \endhtmlonly ^^" \ "cgalDebugEnd=\htmlonly[block]
    \endhtmlonly" \ "cgalDebugFunction=This is a function for debugging purpose." \ diff --git a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h index 66b3c1f34772..02ae3ebf7cf3 100644 --- a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h +++ b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h @@ -16,10 +16,11 @@ Note however, that these operations usually involve the projection of \cgalRefines{ArrangementXMonotoneTraits_2} -\cgalHasModelsBegin CGAL::Env_triangle_traits_3 -\cgalHasModels CGAL::Env_sphere_traits_3 -\cgalHasModels CGAL::Env_plane_traits_3 -\cgalHasModels CGAL::Env_surface_data_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Env_triangle_traits_3} +\cgalModels{CGAL::Env_sphere_traits_3} +\cgalModels{CGAL::Env_plane_traits_3} +\cgalModels{CGAL::Env_surface_data_traits_3} \cgalHasModelsEnd */ diff --git a/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h index f43d4b8944dd..16fa1e40eabd 100644 --- a/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h +++ b/Generalized_map/doc/Generalized_map/Concepts/GeneralizedMap.h @@ -6,7 +6,9 @@ The concept `GeneralizedMap` defines a d-dimensional generalized map. \cgalRefines{GenericMap} +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Generalized_map `CGAL::Generalized_map`\endlink} +\cgalHasModelsEnd For a generalized map, the function \link GenericMap::next `next`\endlink is equal to \f$ \alpha_1\circ\alpha_0\f$, \link GenericMap::previous `previous`\endlink is equal to \f$ \alpha_0\circ\alpha_1\f$ and the function \link GenericMap::opposite `opposite`\endlink is equal to \f$ \alpha_i\circ\alpha_0\f$. */ diff --git a/Generator/doc/Generator/Concepts/CombinationElement.h b/Generator/doc/Generator/Concepts/CombinationElement.h index 8e4747e08392..53872f44809d 100644 --- a/Generator/doc/Generator/Concepts/CombinationElement.h +++ b/Generator/doc/Generator/Concepts/CombinationElement.h @@ -4,9 +4,11 @@ A CombinationElement can be used as template parameter for the class `Combination_enumerator`. -\cgalHasModelsBare{Any integer type (`char`, `short`, `int`, `long`, etc.)\n - Pointers\n - Random access iterators} +\cgalHasModelsBegin +\cgalHasModelsBare{Any integer type (`char`, `short`, `int`, `long`, etc.)} +\cgalHasModelsBare{Pointers} +\cgalHasModelsBare{Random access iterators} +\cgalHasModelsEnd \sa `CGAL::Combination_enumerator` diff --git a/Generator/doc/Generator/Concepts/PointGenerator.h b/Generator/doc/Generator/Concepts/PointGenerator.h index 2f96e53167d9..5a70e5f0ebdc 100644 --- a/Generator/doc/Generator/Concepts/PointGenerator.h +++ b/Generator/doc/Generator/Concepts/PointGenerator.h @@ -5,20 +5,21 @@ The concept `PointGenerator` defines the requirements for a point generator, which can be used in places where input iterators are called for. -\cgalHasModelsBegin CGAL::Random_points_in_ball_d -\cgalHasModels CGAL::Random_points_in_disc_2 -\cgalHasModels CGAL::Random_points_in_square_2 -\cgalHasModels CGAL::Random_points_in_triangle_2 -\cgalHasModels CGAL::Random_points_on_circle_2 -\cgalHasModels CGAL::Random_points_on_segment_2 -\cgalHasModels CGAL::Random_points_on_square_2 -\cgalHasModels CGAL::Random_points_in_cube_3 -\cgalHasModels CGAL::Random_points_in_cube_d -\cgalHasModels CGAL::Random_points_in_sphere_3 -\cgalHasModels CGAL::Random_points_in_triangle_3 -\cgalHasModels CGAL::Random_points_in_tetrahedron_3 -\cgalHasModels CGAL::Random_points_on_sphere_3 -\cgalHasModels CGAL::Random_points_on_sphere_d +\cgalHasModelsBegin +\cgalModels{CGAL::Random_points_in_ball_d} +\cgalModels{CGAL::Random_points_in_disc_2} +\cgalModels{CGAL::Random_points_in_square_2} +\cgalModels{CGAL::Random_points_in_triangle_2} +\cgalModels{CGAL::Random_points_on_circle_2} +\cgalModels{CGAL::Random_points_on_segment_2} +\cgalModels{CGAL::Random_points_on_square_2} +\cgalModels{CGAL::Random_points_in_cube_3} +\cgalModels{CGAL::Random_points_in_cube_d} +\cgalModels{CGAL::Random_points_in_sphere_3} +\cgalModels{CGAL::Random_points_in_triangle_3} +\cgalModels{CGAL::Random_points_in_tetrahedron_3} +\cgalModels{CGAL::Random_points_on_sphere_3} +\cgalModels{CGAL::Random_points_on_sphere_d} \cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h b/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h index 424119d49b9b..61949762078f 100644 --- a/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomConvexHullTraits_2.h @@ -5,7 +5,9 @@ The concept `RandomConvexHullTraits_2` describes the requirements for the traits class used by the function `random_convex_hull_in_disc_2()`. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the concept `Kernel`} +\cgalHasModelsEnd \cgalHeading{Operations} diff --git a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h index 630b93345d17..669f54809b32 100644 --- a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h @@ -5,7 +5,8 @@ The concept `RandomConvexSetTraits_2` describes the requirements of the traits class for the function `random_convex_set_2()`. -\cgalHasModelsBegin CGAL::Random_convex_set_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Random_convex_set_traits_2} \cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h b/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h index be8badeb6410..c996e2053609 100644 --- a/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomPolygonTraits_2.h @@ -5,7 +5,9 @@ The concept `RandomPolygonTraits_2` describes the requirements for the traits class used by the function `random_polygon_2()`. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the concept `Kernel`} +\cgalHasModelsEnd \cgalHeading{Operations} diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h index 227ae11cc406..6b99d22b415c 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h @@ -67,9 +67,10 @@ allocators internally. A default argument is mandatory for from the `` header file can be used as default allocator. -\cgalHasModelsBegin CGAL::HalfedgeDS_default -\cgalHasModels CGAL::HalfedgeDS_list -\cgalHasModels CGAL::HalfedgeDS_vector +\cgalHasModelsBegin +\cgalModels{CGAL::HalfedgeDS_default} +\cgalModels{CGAL::HalfedgeDS_list} +\cgalModels{CGAL::HalfedgeDS_vector} \cgalHasModelsEnd \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h index cacaac7459aa..fb3c3e05d2ac 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h @@ -23,8 +23,9 @@ can be bypassed by the user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} -\cgalHasModelsBegin CGAL::HalfedgeDS_face_base -\cgalHasModels CGAL::HalfedgeDS_face_min_base +\cgalHasModelsBegin +\cgalModels{CGAL::HalfedgeDS_face_base} +\cgalModels{CGAL::HalfedgeDS_face_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h index 5dae57935e8d..f726b2c43833 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h @@ -33,8 +33,9 @@ more protection is provided for the `set_opposite()` member function. The base class `Base_base` provides access to it. (The protection could be bypassed also by an user, but not by accident.) -\cgalHasModelsBegin ::CGAL::HalfedgeDS_halfedge_base -\cgalHasModels ::CGAL::HalfedgeDS_halfedge_min_base +\cgalHasModelsBegin +\cgalModels{::CGAL::HalfedgeDS_halfedge_base} +\cgalModels{::CGAL::HalfedgeDS_halfedge_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h index 51a99908bc04..3b52eeb48a51 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h @@ -16,9 +16,10 @@ and `Face` respectively. The requirements on these types are described on the manual pages of the concepts `HalfedgeDSVertex`, `HalfedgeDSHalfedge`, and `HalfedgeDSFace` respectively. -\cgalHasModelsBegin CGAL::HalfedgeDS_min_items -\cgalHasModels CGAL::HalfedgeDS_items_2 -\cgalHasModels CGAL::Polyhedron_items_3 +\cgalHasModelsBegin +\cgalModels{CGAL::HalfedgeDS_min_items} +\cgalModels{CGAL::HalfedgeDS_items_2} +\cgalModels{CGAL::Polyhedron_items_3} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h index 38f5afab43c4..ce5766136308 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h @@ -23,8 +23,9 @@ could be bypassed by an user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} -\cgalHasModelsBegin CGAL::HalfedgeDS_vertex_base -\cgalHasModels CGAL::HalfedgeDS_vertex_min_base +\cgalHasModelsBegin +\cgalModels{CGAL::HalfedgeDS_vertex_base} +\cgalModels{CGAL::HalfedgeDS_vertex_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h index cf4b6f8d9d70..9670eee46e68 100644 --- a/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h +++ b/Heat_method_3/doc/Heat_method_3/Concepts/HeatMethodTraits_3.h @@ -7,7 +7,9 @@ The concept `HeatMethodTraits_3` describes the types, predicates, and constructions required by the traits class parameter of `CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3`. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd */ diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h index 3299b6f89e3b..39a254eec7e1 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h @@ -16,8 +16,9 @@ constructions on these objects. This concept refines `DelaunayTriangulationTraits_2` because the class `CGAL::Hyperbolic_Delaunay_triangulation_2` internally relies on the class `CGAL::Delaunay_triangulation_2`. -\cgalHasModelsBegin CGAL::Hyperbolic_Delaunay_triangulation_traits_2 -\cgalHasModels CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Hyperbolic_Delaunay_triangulation_traits_2} +\cgalModels{CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2} \cgalHasModelsEnd */ diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h index 9f57d33da117..51a984a3c985 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h @@ -41,7 +41,8 @@ This concept provides an interface for the functionality needed in faces to comp Delaunay triangulations in the hyperbolic plane. The function `tds_data()` is used internally by the triangulation class during the insertion of points in the triangulation. -\cgalHasModelsBegin CGAL::Hyperbolic_triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Hyperbolic_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h index f6de632e04c0..407337905ef1 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h @@ -15,8 +15,9 @@ inscribed into a given convex polygon. precondition checking only. Therefore, they need not to be specified, in case that precondition checking is disabled. -\cgalHasModelsBegin CGAL::Extremal_polygon_area_traits_2 -\cgalHasModels CGAL::Extremal_polygon_perimeter_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Extremal_polygon_area_traits_2} +\cgalModels{CGAL::Extremal_polygon_perimeter_traits_2} \cgalHasModelsEnd \sa `CGAL::maximum_area_inscribed_k_gon_2()` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h index d3e1374d7715..796290481046 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h @@ -10,8 +10,9 @@ This concept provides the types of the geometric primitives used in this class and some function object types for the required predicates on those primitives. -\cgalHasModelsBegin CGAL::Cartesian -\cgalHasModels CGAL::Homogeneous +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian} +\cgalModels{CGAL::Homogeneous} \cgalHasModelsEnd \sa `CGAL::Largest_empty_iso_rectangle_2` diff --git a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h index 4cb824c031b1..0cdbc888f217 100644 --- a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h @@ -7,7 +7,8 @@ traits class that defines the primitives used by the algorithm. The concept `GradientFittingTraits` defines this common set of requirements. -\cgalHasModelsBegin CGAL::Interpolation_gradient_fitting_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Interpolation_gradient_fitting_traits_2} \cgalHasModelsEnd \sa `InterpolationTraits` diff --git a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h index a07eb526d3c7..18b806952cb5 100644 --- a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h @@ -7,8 +7,9 @@ Most interpolation functions are parameterized by a traits class that defines the primitives used in the interpolation algorithms. The concept `InterpolationTraits` defines this common set of requirements. -\cgalHasModelsBegin CGAL::Interpolation_traits_2 -\cgalHasModels CGAL::Interpolation_gradient_fitting_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Interpolation_traits_2} +\cgalModels{CGAL::Interpolation_gradient_fitting_traits_2} \cgalHasModelsEnd \sa `GradientFittingTraits` diff --git a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h index 1bc267a684eb..fe7cbbd266ed 100644 --- a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h +++ b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h @@ -9,8 +9,9 @@ The concept does not specify, whether the interval is open or closed. It is up to the implementer of a model for this concept to define that. -\cgalHasModelsBegin CGAL::Interval_skip_list_interval -\cgalHasModels CGAL::Level_interval +\cgalHasModelsBegin +\cgalModels{CGAL::Interval_skip_list_interval} +\cgalModels{CGAL::Level_interval} \cgalHasModelsEnd \sa `Interval_skip_list` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h index 9276d91c6b32..93d2ee819e5a 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h @@ -13,8 +13,9 @@ the class Only constructors (from 3 scalars and copy constructors) and access methods to coordinates `x()`, `y()`, `z()` are needed. -\cgalHasModelsBegin CGAL::Cartesian -\cgalHasModels CGAL::Simple_cartesian +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian} +\cgalModels{CGAL::Simple_cartesian} \cgalHasModelsEnd \sa `LocalKernel` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h index 75629fb37f15..d4981cf4f846 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h @@ -29,8 +29,9 @@ Only constructors (from 3 scalars and copy constructors) and access methods to coordinates `x()`, `y()`, `z()` are needed for the point and vector types. -\cgalHasModelsBegin CGAL::Cartesian -\cgalHasModels CGAL::Simple_cartesian +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian} +\cgalModels{CGAL::Simple_cartesian} \cgalHasModelsEnd \sa `DataKernel` diff --git a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h index a732c7891a3c..9433ac9dd058 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h +++ b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h @@ -8,7 +8,8 @@ namespace Kernel { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Circle_2 + \cgalHasModelsBegin + \cgalModels{CGAL::Circle_2} \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` @@ -39,7 +40,8 @@ class Circle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Circle_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Circle_3} \cgalHasModelsEnd \sa `Kernel::ComputeApproximateArea_3` @@ -69,7 +71,7 @@ class Circle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Direction_2 + \cgalModels{CGAL::Direction_2} \cgalHasModelsEnd \sa `Kernel::CompareAngleWithXAxis_2` @@ -94,7 +96,7 @@ class Direction_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Direction_3 + \cgalModels{CGAL::Direction_3} \cgalHasModelsEnd \sa `Kernel::ConstructDirection_3` @@ -115,7 +117,8 @@ A type representing isocuboids in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Iso_cuboid_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Iso_cuboid_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -141,7 +144,7 @@ class IsoCuboid_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Iso_rectangle_2 + \cgalModels{CGAL::Iso_rectangle_2} \cgalHasModelsEnd \sa `Kernel::ConstructIsoRectangle_2` @@ -174,7 +177,7 @@ class IsoRectangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Line_2 + \cgalModels{CGAL::Line_2} \cgalHasModelsEnd \sa `Kernel::CompareXAtY_2` @@ -211,7 +214,7 @@ class Line_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Line_3 + \cgalModels{CGAL::Line_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -243,7 +246,7 @@ class Line_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Object + \cgalModels{CGAL::Object} \cgalHasModelsEnd \sa `Kernel::Assign_2` @@ -265,7 +268,7 @@ class Object_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Object + \cgalModels{CGAL::Object} \cgalHasModelsEnd \sa `Kernel::Assign_3` @@ -285,7 +288,7 @@ class Object_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Plane_3 + \cgalModels{CGAL::Plane_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -323,7 +326,7 @@ class Plane_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Point_2 + \cgalModels{CGAL::Point_2} \cgalHasModelsEnd \sa `Kernel::Angle_2` @@ -383,7 +386,7 @@ class Point_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModels CGAL::Point_3 + \cgalModels{CGAL::Point_3} \cgalHasModelsEnd \sa `Kernel::Angle_3` @@ -445,7 +448,8 @@ A type representing rays in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Ray_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Ray_2} \cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` @@ -478,7 +482,8 @@ class Ray_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Ray_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Ray_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -507,7 +512,8 @@ class Ray_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Segment_2 + \cgalHasModelsBegin + \cgalModels{CGAL::Segment_2} \cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` @@ -542,7 +548,8 @@ class Segment_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Segment_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Segment_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -573,7 +580,8 @@ class Segment_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Sphere_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Sphere_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -604,7 +612,8 @@ class Sphere_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Tetrahedron_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Tetrahedron_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -636,7 +645,8 @@ class Tetrahedron_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Triangle_2 + \cgalHasModelsBegin + \cgalModels{CGAL::Triangle_2} \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` @@ -670,7 +680,8 @@ class Triangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Triangle_3 + \cgalHasModelsBegin + \cgalModels{CGAL::Triangle_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredArea_3` @@ -696,7 +707,8 @@ class Triangle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalHasModelsBegin CGAL::Vector_2 + \cgalHasModelsBegin + \cgalModels{CGAL::Vector_2} \cgalHasModelsEnd \sa `Kernel::ComputeDeterminant_2` @@ -730,7 +742,8 @@ A type representing vectors in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Vector_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Vector_3} \cgalHasModelsEnd \sa `Kernel::CompareDihedralAngle_3` @@ -767,7 +780,8 @@ A type representing weighted points in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Weighted_point_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Weighted_point_2} \cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_2` @@ -795,7 +809,8 @@ A type representing weighted points in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Weighted_point_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Weighted_point_3} \cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_3` diff --git a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h index ad4a0782765f..2da2b9d8fb9f 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h +++ b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h @@ -20,14 +20,15 @@ `Construct_`. If the result type is a number type, the name is prefixed by `Compute_`. When the result type is not determined, no prefix is used. - \cgalHasModelsBegin galHasModel `CGAL::Cartesian - \cgalHasModels CGAL::Homogeneous - \cgalHasModels CGAL::Simple_cartesian - \cgalHasModels CGAL::Simple_homogeneous - \cgalHasModels CGAL::Filtered_kernel - \cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel - \cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt - \cgalHasModels CGAL::Exact_predicates_inexact_constructions_kernel + \cgalHasModelsBegin + \cgalModels{CGAL::Cartesian} + \cgalModels{CGAL::Homogeneous} + \cgalModels{CGAL::Simple_cartesian} + \cgalModels{CGAL::Simple_homogeneous} + \cgalModels{CGAL::Filtered_kernel} + \cgalModels{CGAL::Exact_predicates_exact_constructions_kernel} + \cgalModels{CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt} + \cgalModels{CGAL::Exact_predicates_inexact_constructions_kernel} \cgalHasModelsEnd \sa `Kernel_d` diff --git a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h index 63e05367bafc..4a8e19db8cd4 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h @@ -8,8 +8,9 @@ general kernel concept. It adds 2 functors, the meaning of which would be unclear in kernels of fixed dimension. \cgalRefines{Kernel_d} -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ class KernelWithLifting_d { diff --git a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h index a56284feab8a..c4ac4f607c80 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h @@ -18,10 +18,11 @@ predicates. The former replace constructors of the kernel classes and constructive procedures in the kernel. There are also function objects replacing operators, especially for equality testing. -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d -\cgalHasModels CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} \cgalHasModelsEnd */ class Kernel_d { diff --git a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h index f8a25811d421..8dff375eaea0 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h @@ -13,8 +13,9 @@ correct. For example, if the linear system solver declares a linear system \f$ A x = b\f$ unsolvable it also returns a vector \f$ c\f$ such that \f$ c^T A = 0\f$ and \f$ c^T b \neq 0\f$. -\cgalHasModelsBegin CGAL::Linear_algebraHd -\cgalHasModels CGAL::Linear_algebraCd +\cgalHasModelsBegin +\cgalModels{CGAL::Linear_algebraHd} +\cgalModels{CGAL::Linear_algebraCd} \cgalHasModelsEnd */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h index 6f97471a99c4..08820e4d061b 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/CellAttributeWithPoint.h @@ -7,7 +7,9 @@ The concept `CellAttributeWithPoint` is a refinement of the `CellAttribute` conc \cgalRefines{CellAttribute} +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Cell_attribute_with_point `CGAL::Cell_attribute_with_point`\endlink} +\cgalHasModelsEnd \sa `LinearCellComplexItems` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h index 740405fc5b3c..c7652262cf88 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplex.h @@ -7,8 +7,10 @@ The concept `LinearCellComplex` represents a linear cell complex in dimension `d \cgalRefines{GenericMap} -\cgalHasModelsBare{\link CGAL::Linear_cell_complex_for_combinatorial_map `CGAL::Linear_cell_complex_for_combinatorial_map`\endlink\n - \link CGAL::Linear_cell_complex_for_generalized_map `CGAL::Linear_cell_complex_for_generalized_map`\endlink} +\cgalHasModelsBegin +\cgalHasModelsBare{\link CGAL::Linear_cell_complex_for_combinatorial_map `CGAL::Linear_cell_complex_for_combinatorial_map`\endlink} +\cgalHasModelsBare{\link CGAL::Linear_cell_complex_for_generalized_map `CGAL::Linear_cell_complex_for_generalized_map`\endlink} +\cgalHasModelsEnd \sa `LinearCellComplexItems` \sa `LinearCellComplexTraits` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h index 25df3bed1833..abc3d27eaf24 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h @@ -9,7 +9,8 @@ The concept `LinearCellComplexItems` refines the concept of `GenericMapItems` by The first type in `Attributes` tuple must be a model of the `CellAttributeWithPoint` concept. -\cgalHasModelsBegin CGAL::Linear_cell_complex_min_items +\cgalHasModelsBegin +\cgalModels{CGAL::Linear_cell_complex_min_items} \cgalHasModelsEnd \sa `LinearCellComplex` diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h index cb7de2d83823..e701f011493f 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexTraits.h @@ -5,7 +5,9 @@ Required types and functors for the `LinearCellComplexTraits` concept. This geometric traits concept is used in the \link CGAL::Linear_cell_complex_for_combinatorial_map `Linear_cell_complex_for_combinatorial_map`\endlink and \link CGAL::Linear_cell_complex_for_generalized_map `Linear_cell_complex_for_generalized_map`\endlink classes. +\cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Linear_cell_complex_traits `CGAL::Linear_cell_complex_traits`\endlink} +\cgalHasModelsEnd \sa `CGAL::Linear_cell_complex_for_combinatorial_map` \sa `CGAL::Linear_cell_complex_for_generalized_map` diff --git a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h index 37512a501ece..9a7b265540b9 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h +++ b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h @@ -8,7 +8,8 @@ A class `BasicMatrix` has to provide the following types and operations in order to be a model for `BasicMatrix`. -\cgalHasModelsBegin CGAL::Dynamic_matrix +\cgalHasModelsBegin +\cgalModels{CGAL::Dynamic_matrix} \cgalHasModelsEnd \sa `MonotoneMatrixSearchTraits` diff --git a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h index 3f44b807ffd0..b20b74de1d09 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h @@ -21,7 +21,8 @@ add most of the functionality described above to arbitrary matrix classes. -\cgalHasModelsBegin CGAL::Dynamic_matrix +\cgalHasModelsBegin +\cgalModels{CGAL::Dynamic_matrix} \cgalHasModelsEnd \sa `CGAL::monotone_matrix_search()` diff --git a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h index e96a49bfdbeb..99c3cfcba772 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h @@ -8,7 +8,8 @@ needed to compute the smallest entry in a set of sorted matrices that fulfills a certain feasibility criterion using the function `CGAL::sorted_matrix_search`. -\cgalHasModelsBegin CGAL::Sorted_matrix_search_traits_adaptor +\cgalHasModelsBegin +\cgalModels{CGAL::Sorted_matrix_search_traits_adaptor} \cgalHasModelsEnd \sa `CGAL::sorted_matrix_search()` diff --git a/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h b/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h index 745c85b0d9f6..0980ae1d1512 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/ConformingDelaunayTriangulationTraits_2.h @@ -17,7 +17,9 @@ points on constrained edges. \cgalRefines{DelaunayTriangulationTraits_2} -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Projection_traits_xy_3} \cgalHasModelsEnd diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h index abe11ca79a86..7bc632d6fa8e 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h @@ -13,7 +13,8 @@ meshing domain or not. \cgalRefines{ConstrainedTriangulationFaceBase_2} -\cgalHasModelsBegin CGAL::Delaunay_mesh_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_mesh_face_base_2} \cgalHasModelsEnd diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h index 25d8388d962a..e5e793bafffb 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshTraits_2.h @@ -12,7 +12,9 @@ object `Construct_circumcenter_2`. \cgalRefines{ConformingDelaunayTriangulationTraits_2} -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Projection_traits_xy_3} \cgalHasModelsEnd */ diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h index 341888021197..ac7a4a691612 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h @@ -13,7 +13,8 @@ the mesh density everywhere while modifying the mesh. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Delaunay_mesh_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_mesh_vertex_base_2} \cgalHasModelsEnd diff --git a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h index 929119fb29af..06f5f865e331 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h @@ -37,8 +37,9 @@ comparable as the meshing algorithm will order bad triangles by quality, to split those with smallest quality first. The predicate `Is_bad` computes the quality of the triangle as a by-product. -\cgalHasModelsBegin CGAL::Delaunay_mesh_criteria_2 -\cgalHasModels CGAL::Delaunay_mesh_size_criteria_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_mesh_criteria_2} +\cgalModels{CGAL::Delaunay_mesh_size_criteria_2} \cgalHasModelsEnd diff --git a/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h index 0ca302d56fb5..bab4df1ba944 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/BisectionGeometricTraits_3.h @@ -16,7 +16,9 @@ function from \f$ \mathbb{R}^3\f$ to \f$ \mathbb{R}\f$), the do-intersect predic is computed by evaluations of the function values at both end points of the segment. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `ImplicitSurfaceTraits_3` \sa `IntersectionGeometricTraits_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h index d5637c9b8e15..8773bf905f8c 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/IntersectionGeometricTraits_3.h @@ -9,7 +9,9 @@ forming its boundary. The concept `IntersectionGeometricTraits_3` mainly provides the detection and construction of intersections between segments and triangles. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `BisectionGeometricTraits_3` \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h index 7ad4c56ad1cd..44f0e8181230 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h @@ -43,8 +43,9 @@ each cell (see below). \cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible} -\cgalHasModelsBegin CGAL::Compact_mesh_cell_base_3 -\cgalHasModels CGAL::Mesh_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Compact_mesh_cell_base_3} +\cgalModels{CGAL::Mesh_cell_base_3} \cgalHasModelsEnd \sa `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h index 4691571e9f1b..bc8a60b51d32 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h @@ -9,7 +9,8 @@ that concern either mesh tetrahedra or surface facets. The concept `MeshCellCriteria_3` describes the types that handle the refinement criteria for mesh tetrahedra. -\cgalHasModelsBegin CGAL::Mesh_cell_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_cell_criteria_3} \cgalHasModelsEnd \sa `MeshEdgeCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h index e1570416dd7f..dcb2123ec62d 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h @@ -14,7 +14,8 @@ that describes the requirements, in terms of sizing, for the discretization of t \cgalRefines{MeshCriteria_3} -\cgalHasModelsBegin CGAL::Mesh_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_criteria_3} \cgalHasModelsEnd \sa `MeshEdgeCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h index 189afcbffcb9..83fad908d256 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h @@ -12,7 +12,8 @@ while the refinement criteria for surface facets are described by the concept `MeshFacetCriteria_3`. The concept `MeshCriteria_3` encapsulates these concepts. -\cgalHasModelsBegin CGAL::Mesh_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_criteria_3} \cgalHasModelsEnd \sa `MeshFacetCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h index fbb2f2cc8eed..d3f7d1e61ea2 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h @@ -5,7 +5,8 @@ The concept `MeshDomainField_3` describes a scalar field which could be queried at any point of the space. -\cgalHasModelsBegin CGAL::Mesh_constant_domain_field_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_constant_domain_field_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h index 80df66b599ad..3a3a79f11053 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h @@ -17,8 +17,9 @@ between two ordered points on the same curve. \cgalRefines{MeshDomain_3} -\cgalHasModelsBegin CGAL::Mesh_domain_with_polyline_features_3 -\cgalHasModels CGAL::Polyhedral_mesh_domain_with_features_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_domain_with_polyline_features_3} +\cgalModels{CGAL::Polyhedral_mesh_domain_with_features_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h index 56c6ed59ad1c..03ca9f2fef7e 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h @@ -29,8 +29,9 @@ A segment, ray or line is said to intersect properly the domain boundary if it includes points which are strictly inside and strictly outside the domain (resp. the subdomain). -\cgalHasModelsBegin CGAL::Polyhedral_mesh_domain_3 -\cgalHasModels CGAL::Labeled_mesh_domain_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Polyhedral_mesh_domain_3} +\cgalModels{CGAL::Labeled_mesh_domain_3} \cgalHasModelsEnd \sa `MeshVertexBase_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h index 41b3bab44515..930a627cc761 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h @@ -7,7 +7,8 @@ the 1-dimensional features of the domain. It provides an upper bound for the distance between two protecting ball centers that are consecutive on a 1-feature. -\cgalHasModelsBegin CGAL::Mesh_edge_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_edge_criteria_3} \cgalHasModelsEnd \sa `MeshCellCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h index f8bad1f29ccf..a0c32629c5ad 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h @@ -9,7 +9,8 @@ that concern either mesh tetrahedra or surface facets. The concept `MeshFacetCriteria_3` describes the types that handle the refinement criteria for surface facets. -\cgalHasModelsBegin CGAL::Mesh_facet_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_facet_criteria_3} \cgalHasModelsEnd \sa `MeshCellCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h index ce8469eb8aa8..043960c0e91e 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshPolyline_3.h @@ -6,7 +6,9 @@ The concept `MeshPolyline_3` implements a container of points designed to repres Types and functions provided in this concept are such as standard template library containers are natural models of this concept. +\cgalHasModelsBegin \cgalHasModelsBare{`std::vector` for any Kernel of \cgal is a natural model of this concept.} +\cgalHasModelsEnd \sa `CGAL::Mesh_domain_with_polyline_features_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h index 3e1a8cf734d0..be84906d8f30 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshTriangulationTraits_3.h @@ -9,7 +9,9 @@ a mesh generation process. \cgalRefines{RegularTriangulationTraits_3} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd In addition to the requirements described for the traits class RegularTriangulationTraits_3, the geometric traits class of a diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h index f4f2ff9d9b84..20a62546c2ce 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h @@ -22,7 +22,8 @@ each cell (see below). \cgalRefines{SimplicialMeshVertexBase_3,RegularTriangulationVertexBase_3,SurfaceMeshVertexBase_3} -\cgalHasModelsBegin CGAL::Mesh_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_vertex_base_3} \cgalHasModelsEnd \sa `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h index 1d3a376d3de1..7be6df1aece7 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h @@ -5,7 +5,8 @@ The concept `TriangleAccessor_3` represents an accessor to a triangulated polyhedral surface, intersection free and without boundaries. -\cgalHasModelsBegin CGAL::Triangle_accessor_3,K> +\cgalHasModelsBegin +\cgalModels{CGAL::Triangle_accessor_3,K>} \cgalHasModelsEnd \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h index 0f81aaa6a90e..848c46adfda9 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h @@ -6,11 +6,12 @@ A model of the `PolygonConvexDecomposition_2` concept is capable of decomposing an input polygon \f$ P\f$ into a set of convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \f$ \cup_{i=1}^{k}{P_k} = P\f$. -\cgalHasModelsBegin CGAL::Small_side_angle_bisector_decomposition_2 -\cgalHasModels CGAL::Optimal_convex_decomposition_2 -\cgalHasModels CGAL::Hertel_Mehlhorn_convex_decomposition_2 -\cgalHasModels CGAL::Greene_convex_decomposition_2 -\cgalHasModels CGAL::Polygon_nop_decomposition_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Small_side_angle_bisector_decomposition_2} +\cgalModels{CGAL::Optimal_convex_decomposition_2} +\cgalModels{CGAL::Hertel_Mehlhorn_convex_decomposition_2} +\cgalModels{CGAL::Greene_convex_decomposition_2} +\cgalModels{CGAL::Polygon_nop_decomposition_2} \cgalHasModelsEnd */ diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h index 64b8d0995076..6cf7eb45c35e 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h @@ -9,8 +9,9 @@ convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \cgalRefines{PolygonConvexDecomposition_2} -\cgalHasModelsBegin CGAL::Polygon_vertical_decomposition_2 -\cgalHasModels CGAL::Polygon_triangulation_decomposition_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Polygon_vertical_decomposition_2} +\cgalModels{CGAL::Polygon_triangulation_decomposition_2} \cgalHasModelsEnd */ diff --git a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h index 1bf64f2a9c94..b3f2543843ff 100644 --- a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h +++ b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h @@ -9,7 +9,8 @@ function object. It maps objects of its domain type `Key` to the integral image type `std::size_t`. The image values have to be unique for all keys in the domain type `Key`. -\cgalHasModelsBegin CGAL::Handle_hash_function +\cgalHasModelsBegin +\cgalModels{CGAL::Handle_hash_function} \cgalHasModelsEnd \sa `CGAL::Unique_hash_map` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h index 0e0467a9f390..a78fde1730a1 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h @@ -8,7 +8,8 @@ In case this associated type is a model of `Modularizable`, this is indicated by Boolean tag `ModularTraits::Is_modularizable`. The mapping into the `Residue_type` is provided by the functor `ModularTraits::Modular_image`. -\cgalHasModelsBegin CGAL::Modular_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Modular_traits} \cgalHasModelsEnd \sa `CGAL::Residue` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h index 8db45a2f4287..1d7f832f5d88 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h @@ -18,19 +18,21 @@ of denominator, are not `Modularizable`. This is due to the fact that the denominator may be zero modulo the prime, which can not be represented. -\cgalHasModelsBegin int -\cgalHasModels long -\cgalHasModels CORE::BigInt -\cgalHasModels CGAL::Gmpz -\cgalHasModels leda_integer -\cgalHasModels mpz_class +\cgalHasModelsBegin +\cgalModels{int} +\cgalModels{long} +\cgalModels{CORE::BigInt} +\cgalModels{CGAL::Gmpz} +\cgalModels{leda_integer} +\cgalModels{mpz_class} \cgalHasModelsEnd The following types are `Modularizable` iff their template arguments are. -\cgalHasModelsBegin CGAL::Lazy_exact_nt -\cgalHasModels CGAL::Sqrt_extension -\cgalHasModels CGAL::Polynomial +\cgalHasModelsBegin +\cgalModels{CGAL::Lazy_exact_nt} +\cgalModels{CGAL::Sqrt_extension} +\cgalModels{CGAL::Polynomial} \cgalHasModelsEnd \sa `CGAL::Residue` diff --git a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h index 7161d6725e76..c46d39daa542 100644 --- a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h +++ b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h @@ -38,9 +38,10 @@ functionality for changing between standard affine and extended geometry. At the same time it provides extensible geometric primitives on the extended geometric objects. -\cgalHasModelsBegin CGAL::Extended_cartesian -\cgalHasModels CGAL::Extended_homogeneous -\cgalHasModels CGAL::Filtered_extended_homogeneous +\cgalHasModelsBegin +\cgalModels{CGAL::Extended_cartesian} +\cgalModels{CGAL::Extended_homogeneous} +\cgalModels{CGAL::Filtered_extended_homogeneous} \cgalHasModelsEnd */ diff --git a/Number_types/doc/Number_types/Concepts/RootOf_2.h b/Number_types/doc/Number_types/Concepts/RootOf_2.h index c29f30b3ab2b..9ae9883f80fe 100644 --- a/Number_types/doc/Number_types/Concepts/RootOf_2.h +++ b/Number_types/doc/Number_types/Concepts/RootOf_2.h @@ -30,7 +30,9 @@ special construction for extensions of degree 2: \cgalRefines{DefaultConstructible,CopyConstructible,FromIntConstructible, ImplicitInteroperable with `RT`,ImplicitInteroperable with `FT`} -\cgalHasModelsBareBegin{`double` (not exact)} CGAL::Sqrt_extension +\cgalHasModelsBegin +\cgalHasModelsBare{`double` (not exact)} +\cgalHasModels{CGAL::Sqrt_extension} \cgalHasModelsEnd \sa `CGAL::make_root_of_2` diff --git a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h index fad3d71782a0..40fdf24e2d8f 100644 --- a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h +++ b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h @@ -8,7 +8,8 @@ a 3x3 matrix type. \cgalRefines{Kernel} -\cgalHasModelsBegin CGAL::Oriented_bounding_box_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Oriented_bounding_box_traits_3} \cgalHasModelsEnd */ diff --git a/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h b/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h index 39b2c65b4e15..69f33226b2c4 100644 --- a/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h +++ b/Optimal_transportation_reconstruction_2/doc/Optimal_transportation_reconstruction_2/Concepts/OptimalTransportationReconstructionTraits_2.h @@ -8,8 +8,10 @@ for the traits class of `CGAL::Optimal_transportation_reconstruction_2`. \cgalRefines{DelaunayTriangulationTraits_2} -\cgalHasModelsBare{All models of the \cgal concept `Kernel`, - `CGAL::Exact_predicates_inexact_constructions_kernel` (recommended)} +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsBare{`CGAL::Exact_predicates_inexact_constructions_kernel` (recommended)} +\cgalHasModelsEnd \sa `CGAL::Optimal_transportation_reconstruction_2` diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h index 8b6e0e06631e..83408944f2b5 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h @@ -5,9 +5,10 @@ The concept `OrthtreeTraits` defines the requirements for the template parameter of the `CGAL::Orthtree` class. - \cgalHasModelsBegin galHasModel `CGAL::Orthtree_traits_2 - \cgalHasModels CGAL::Orthtree_traits_3 - \cgalHasModels CGAL::Orthtree_traits_d + \cgalHasModelsBegin + \cgalModels{CGAL::Orthtree_traits_2} + \cgalModels{CGAL::Orthtree_traits_3} + \cgalModels{CGAL::Orthtree_traits_d} \cgalHasModelsEnd */ class OrthtreeTraits diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h index c03e9deb2070..851482d8751a 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h @@ -9,10 +9,11 @@ A traversal is used to iterate on a tree with a user-selected order (e.g. preorder, postorder). - \cgalHasModelsBegin galHasModel `CGAL::Orthtrees::Preorder_traversal - \cgalHasModels CGAL::Orthtrees::Postorder_traversal - \cgalHasModels CGAL::Orthtrees::Leaves_traversal - \cgalHasModels CGAL::Orthtrees::Level_traversal + \cgalHasModelsBegin + \cgalModels{CGAL::Orthtrees::Preorder_traversal} + \cgalModels{CGAL::Orthtrees::Postorder_traversal} + \cgalModels{CGAL::Orthtrees::Leaves_traversal} + \cgalModels{CGAL::Orthtrees::Level_traversal} \cgalHasModelsEnd */ class OrthtreeTraversal { diff --git a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h index ff7c9417c08b..6b9be975123b 100644 --- a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h @@ -6,7 +6,8 @@ Requirements of a traits class used by `convex_partition_is_valid_2` for testing the validity of a convex partition of a polygon. -\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h index 0c0d7e3fc974..112995c86f11 100644 --- a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h @@ -6,8 +6,9 @@ Requirements of a traits class to be used with the function `is_y_monotone_2()` that tests whether a sequence of 2D points defines a \f$ y\f$-monotone polygon or not. -\cgalHasModelsBegin CGAL::Partition_traits_2 -\cgalHasModels CGAL::Kernel_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_traits_2} +\cgalModels{CGAL::Kernel_traits_2} \cgalHasModelsEnd \sa `CGAL::Is_y_monotone_2` diff --git a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h index 85676075bb4e..1ef70344a2d6 100644 --- a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h @@ -8,7 +8,8 @@ an optimal convex partition of a polygon. \cgalRefines{PartitionTraits_2} -\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::convex_partition_is_valid_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h index b91ad8109352..7edbe6dcde6d 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h @@ -14,7 +14,8 @@ function `CGAL::is_convex_2()` and the concept `YMonotonePartitionTraits_2` for the additional requirements for testing for convexity and \f$ y\f$-monotonicity, respectively. -\cgalHasModelsBegin CGAL::Partition_is_valid_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_is_valid_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h index 2ad93228b1bf..910d565cf10a 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h @@ -8,7 +8,8 @@ common to all traits classes. The concept `PartitionTraits_2` defines this common set of requirements. -\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h index ab72c01a9f09..662bdb369a91 100644 --- a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h +++ b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h @@ -6,8 +6,9 @@ Function object that determines if a sequence of points represents a valid partition polygon or not, where "valid" can assume any of several meanings (e.g., convex or \f$ y\f$-monotone). -\cgalHasModelsBegin CGAL::Is_convex_2 -\cgalHasModels CGAL::Is_y_monotone_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Is_convex_2} +\cgalModels{CGAL::Is_y_monotone_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h index 6212b11620a4..7869a2122e90 100644 --- a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h @@ -6,7 +6,8 @@ Requirements of a traits class that is used by `y_monotone_partition_is_valid_2` for testing the validity of a \f$ y\f$-monotone partition of a polygon. -\cgalHasModelsBegin CGAL::Partition_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::partition_is_valid_2()` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h index bda0b95ab293..0ae4f0fedcf7 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h @@ -27,7 +27,8 @@ dual functions are called. The additional predicate type `::Periodic_2DelaunayTriangulationTraits_2::Compare_distance_2` is required if calls to `nearest_vertex(..)` are issued. -\cgalHasModelsBegin CGAL::Periodic_2_Delaunay_triangulation_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_2_Delaunay_triangulation_traits_2} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h index 56d28d5a2171..172f176c7cfc 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h @@ -7,7 +7,8 @@ The concept `Periodic_2Offset_2` describes a two-/dimensional integer vector with some specialized access functions and operations. -\cgalHasModelsBegin CGAL::Periodic_2_offset_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_2_offset_2} \cgalHasModelsEnd \sa `Periodic_2TriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h index 96769827f334..da6b89b93a27 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h @@ -13,7 +13,8 @@ vertex \f$ i\f$. \cgalRefines{TriangulationFaceBase_2} -\cgalHasModelsBegin CGAL::Periodic_2_triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_2_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h index 58dad3ed62d0..1d93a35edbef 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h @@ -24,7 +24,8 @@ In addition to the requirements described for the traits class Periodic triangulation must fulfill the following requirements: -\cgalHasModelsBegin CGAL::Periodic_2_triangulation_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_2_triangulation_traits_2} \cgalHasModelsEnd \sa `TriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h index 33d799fec248..eeae18dcd70e 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h @@ -16,7 +16,8 @@ The storage of the offset is only needed when a triangulation is copied. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Periodic_2_triangulation_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_2_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h index 2794a7f365ae..73f7d1339a52 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h @@ -22,7 +22,8 @@ Wrapping any model of `Periodic_3MeshDomain_3` with the class `CGAL::Mesh_domain_with_polyline_features_3` gives a model of `Periodic_3MeshDomainWithFeatures_3`. -\cgalHasModelsBegin CGAL::Mesh_domain_with_polyline_features_3 > +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_domain_with_polyline_features_3 >} \cgalHasModelsEnd \sa `CGAL::Periodic_3_function_wrapper` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h index 63170e01edb0..b92341527b91 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h @@ -20,7 +20,8 @@ The class `CGAL::Labeled_mesh_domain_3` paired with a periodic labeling fun is a model of this concept. It is possible to create artificially periodic functions through the class `CGAL::Periodic_3_function_wrapper`. -\cgalHasModelsBegin CGAL::Labeled_mesh_domain_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Labeled_mesh_domain_3} \cgalHasModelsEnd \sa `CGAL::Labeled_mesh_domain_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h index 1d72f2281804..571b9a0fa981 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h @@ -15,7 +15,8 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,DelaunayTriangulationTraits_3} -\cgalHasModelsBegin CGAL::Periodic_3_Delaunay_triangulation_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_Delaunay_triangulation_traits_3} \cgalHasModelsEnd In addition to the requirements described by the concepts diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h index b5a467b4cd82..2cb71cf9bcc4 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h @@ -6,7 +6,8 @@ The concept `Periodic_3Offset_3` describes a three-dimensional integer vector with some specialized access functions and operations. -\cgalHasModelsBegin CGAL::Periodic_3_offset_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_offset_3} \cgalHasModelsEnd \sa `Periodic_3TriangulationTraits_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h index 29c9fae1dc68..05b10c71e021 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h @@ -5,8 +5,9 @@ \cgalRefines{RegularTriangulationCellBase_3,Periodic_3TriangulationDSCellBase_3} -\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_3 > -\cgalHasModels CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 > +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_cell_base_3 >} +\cgalModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 >} \cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h index 8f5ce76dab56..be6214920cb8 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h @@ -5,7 +5,8 @@ \cgalRefines{RegularTriangulationVertexBase_3,Periodic_3TriangulationDSVertexBase_3} -\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_3 > +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_vertex_base_3 >} \cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h index c128b08f82e9..cdc5a72ead57 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h @@ -15,7 +15,8 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,RegularTriangulationTraits_3} -\cgalHasModelsBegin CGAL::Periodic_3_regular_triangulation_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_regular_triangulation_traits_3} \cgalHasModelsEnd In addition to the requirements described for the traits class diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h index 9f575b848695..d6e735e497fd 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h @@ -18,7 +18,8 @@ does not contain any information. \cgalRefines{TriangulationDSCellBase_3} -\cgalHasModelsBegin CGAL::Periodic_3_triangulation_ds_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_triangulation_ds_cell_base_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h index 14b032fc1bc0..2665d89bdefa 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h @@ -12,7 +12,8 @@ a vertex provides access to one of its incident cells through a handle. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModelsBegin CGAL::Periodic_3_triangulation_ds_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_triangulation_ds_vertex_base_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h index ace2ebb8199b..67b8f33a78a5 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h @@ -14,7 +14,8 @@ functor the version without offsets. \cgalRefines{TriangulationTraits_3} -\cgalHasModelsBegin CGAL::Periodic_3_triangulation_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_3_triangulation_traits_3} \cgalHasModelsEnd \sa `Periodic_3DelaunayTriangulationTraits_3` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h index 7532e1b0797d..77501fa9399d 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h @@ -12,7 +12,8 @@ to `Periodic_4HyperbolicTriangulationTraits_2` that needs to be fulfilled by any class used to instantiate the first template parameter of the class `CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_2`. -\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2} \cgalHasModelsEnd */ diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h index 9766710af1ed..92d62dfeeb2e 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h @@ -20,7 +20,8 @@ corresponding vertex produces the canonical representative of the face in the hy Hyperbolic translations are represented by a nested type which is provided by the concept `Periodic_4HyperbolicDelaunayTriangulationTraits_2`. -\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_4_hyperbolic_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h index eb8bfe0b89dd..40b3cb0d34bc 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h @@ -14,7 +14,8 @@ translation during the insertion process. A boolean flag indicates whether the face stores a translation or not. The value of the flag is automatically set when storing or removing a translation. -\cgalHasModelsBegin CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h index f17b26f951ae..6f58a4de0e89 100644 --- a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h +++ b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h @@ -8,8 +8,9 @@ * represents the outer boundary and the general polygons that represent * the holes. * - * \cgalHasModelsBegin CGAL::General_polygon_with_holes_2 - * \cgalHasModels CGAL::Polygon_with_holes_2 + * \cgalHasModelsBegin + * \cgalModels{CGAL::General_polygon_with_holes_2} + * \cgalModels{CGAL::Polygon_with_holes_2} * \cgalHasModelsEnd */ diff --git a/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h b/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h index 068194985bce..639ed921bb7a 100644 --- a/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h +++ b/Polygon/doc/Polygon/Concepts/PolygonTraits_2.h @@ -14,9 +14,11 @@ and refer to the description of the kernel concept for details. \cgalRefines{DefaultConstructible,CopyConstructable} -\cgalHasModelsBareBegin{The kernels supplied by \cgal are models of `PolygonTraits_2`} CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{The kernels supplied by \cgal are models of `PolygonTraits_2`} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd \sa `CGAL::Polygon_2` diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h index facce5d714b0..683f7f581368 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h @@ -6,7 +6,8 @@ /// the creation of new faces and new edges. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Corefinement::Default_visitor +/// \cgalHasModelsBegin +/// \cgalModels{CGAL::Polygon_mesh_processing::Corefinement::Default_visitor} /// \cgalHasModelsEnd class PMPCorefinementVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h index ec9839512208..c0b9c41ebe77 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h @@ -7,7 +7,9 @@ /// `sample_triangle_mesh()`, `approximate_Hausdorff_distance()` and `max_distance_to_triangle_mesh()` /// /// \cgalRefines{AABBGeomTraits,SpatialSortingTraits_3} +/// \cgalHasModelsBegin /// \cgalHasModelsBare{Any 3D Kernel is a model of this concept} +/// \cgalHasModelsEnd class PMPDistanceTraits{ public: diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h index 11af2abad0fd..e524ca75ffe9 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h @@ -9,7 +9,8 @@ /// If that fails, it uses an algorithm with cubic running time (*cubic phase*). /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor +/// \cgalHasModelsBegin +/// \cgalModels{CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor} /// \cgalHasModelsEnd class PMPHolefillingVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h index d0597a5c90e5..0016e1cb8655 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h @@ -7,7 +7,8 @@ /// during the orientation process. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Default_orientation_visitor +/// \cgalHasModelsBegin +/// \cgalModels{CGAL::Polygon_mesh_processing::Default_orientation_visitor} /// \cgalHasModelsEnd class PMPPolygonSoupOrientationVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h index a8c885e7b13d..3bc52ba8786e 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h @@ -6,7 +6,8 @@ /// the creation of new faces. /// /// \cgalRefines{CopyConstructible} -/// \cgalHasModelsBegin CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor +/// \cgalHasModelsBegin +/// \cgalModels{CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor} /// \cgalHasModelsEnd diff --git a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h index 31e6b981de25..d75b5d0b491e 100644 --- a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h +++ b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h @@ -13,9 +13,10 @@ polyhedral surface renames faces to facets. \cgalRefines{HalfedgeDSItems} -\cgalHasModelsBegin CGAL::Polyhedron_items_3 -\cgalHasModels CGAL::Polyhedron_min_items_3 -\cgalHasModels CGAL::Polyhedron_items_with_id_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Polyhedron_items_3} +\cgalModels{CGAL::Polyhedron_min_items_3} +\cgalModels{CGAL::Polyhedron_items_with_id_3} \cgalHasModelsEnd \sa `CGAL::Polyhedron_3` diff --git a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h index 5dc824c7d553..39c4476cf7b4 100644 --- a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h +++ b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronTraits_3.h @@ -10,8 +10,10 @@ and can be used directly as template argument. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModelsBareBegin{All models of the `Kernel` concept, e.g. `CGAL::Simple_cartesian`} CGAL::Polyhedron_traits_3 -\cgalHasModels CGAL::Polyhedron_traits_with_normals_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the `Kernel` concept, e.g. `CGAL::Simple_cartesian`} +\cgalHasModels{CGAL::Polyhedron_traits_3} +\cgalHasModels{CGAL::Polyhedron_traits_with_normals_3} \cgalHasModelsEnd \sa `CGAL::Polyhedron_3` diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h index 525753e4c75a..bf8fb4b60ab6 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h @@ -12,9 +12,10 @@ preserve the overall polyline set shape as much as possible \cgalRefines{CopyConstructible,Assignable} -\cgalHasModelsBegin CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost -\cgalHasModels CGAL::Polyline_simplification_2::Scaled_squared_distance_cost -\cgalHasModels CGAL::Polyline_simplification_2::Squared_distance_cost +\cgalHasModelsBegin +\cgalModels{CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost} +\cgalModels{CGAL::Polyline_simplification_2::Scaled_squared_distance_cost} +\cgalModels{CGAL::Polyline_simplification_2::Squared_distance_cost} \cgalHasModelsEnd */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h index bb5b1d98948d..5d95499fd69c 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h @@ -5,9 +5,10 @@ Models of this concept are passed to the polyline simplification algorithm to indicate when to stop the process. -\cgalHasModelsBegin CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold -\cgalHasModels CGAL::Polyline_simplification_2::Stop_below_count_threshold -\cgalHasModels CGAL::Polyline_simplification_2::Stop_above_cost_threshold +\cgalHasModelsBegin +\cgalModels{CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold} +\cgalModels{CGAL::Polyline_simplification_2::Stop_below_count_threshold} +\cgalModels{CGAL::Polyline_simplification_2::Stop_above_cost_threshold} \cgalHasModelsEnd */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h index 20aff75a93bd..e4d8d079a59d 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h @@ -8,7 +8,8 @@ whether a vertex can be removed, and the cost of the removal. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Polyline_simplification_2::Vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Polyline_simplification_2::Vertex_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h index 7ce0406f0644..c1c13ad96405 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h @@ -31,7 +31,8 @@ is possible to select a certain variable. \sa `Polynomial_d` -\cgalHasModelsBegin CGAL::Polynomial_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomial_traits_d} \cgalHasModelsEnd */ diff --git a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h index 6a5a0c84a05f..2b41053230e8 100644 --- a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h +++ b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h @@ -32,7 +32,8 @@ coefficient is a `Field` the polynomial is model of `EuclideanRing`. \sa `AlgebraicStructureTraits` \sa `PolynomialTraits_d` -\cgalHasModelsBegin CGAL::Polynomial +\cgalHasModelsBegin +\cgalModels{CGAL::Polynomial} \cgalHasModelsEnd */ diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h index 64c1383c051f..a0b89952bc07 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h @@ -7,10 +7,11 @@ The concept `AllFurthestNeighborsTraits_2` defines types and operations needed to compute all furthest neighbors for the vertices of a convex polygon using the function `all_furthest_neighbors_2()`. -\cgalHasModelsBegin CGAL::Cartesian -\cgalHasModels CGAL::Homogeneous -\cgalHasModels CGAL::Simple_cartesian -\cgalHasModels CGAL::Simple_homogeneous +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian} +\cgalModels{CGAL::Homogeneous} +\cgalModels{CGAL::Simple_cartesian} +\cgalModels{CGAL::Simple_homogeneous} \cgalHasModelsEnd \sa `CGAL::all_furthest_neighbors_2()` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h index 34286f63b4bc..1198e0d98698 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h @@ -6,9 +6,10 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional optimisation algorithms. -\cgalHasModelsBegin CGAL::Polytope_distance_d_traits_2 -\cgalHasModels CGAL::Polytope_distance_d_traits_3 -\cgalHasModels CGAL::Polytope_distance_d_traits_d +\cgalHasModelsBegin +\cgalModels{CGAL::Polytope_distance_d_traits_2} +\cgalModels{CGAL::Polytope_distance_d_traits_3} +\cgalModels{CGAL::Polytope_distance_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Polytope_distance_d` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h index 5794f4716580..7295ea2e2969 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h @@ -12,7 +12,8 @@ Whatever the coordinates of the points are, it is required for the width-algorithm to have access to the homogeneous representation of points. -\cgalHasModelsBegin CGAL::Width_default_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Width_default_traits_3} \cgalHasModelsEnd \sa `CGAL::Width_3` diff --git a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h index 1882b05c73ee..206dbdb1a578 100644 --- a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h @@ -35,9 +35,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModelsBegin CGAL::Quadratic_program -\cgalHasModels CGAL::Quadratic_program_from_mps -\cgalHasModels CGAL::Linear_program_from_iterators +\cgalHasModelsBegin +\cgalModels{CGAL::Quadratic_program} +\cgalModels{CGAL::Quadratic_program_from_mps} +\cgalModels{CGAL::Linear_program_from_iterators} \cgalHasModelsEnd diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h index 0e4c2928cec3..e9bbee8dadde 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h @@ -29,18 +29,20 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModelsBegin CGAL::Quadratic_program -\cgalHasModels CGAL::Quadratic_program_from_mps -\cgalHasModels CGAL::Nonnegative_linear_program_from_iterators +\cgalHasModelsBegin +\cgalModels{CGAL::Quadratic_program} +\cgalModels{CGAL::Quadratic_program_from_mps} +\cgalModels{CGAL::Nonnegative_linear_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator types, respectively, for `A_iterator`) must be convertible to some common `IntegralDomain` `ET`. -\cgalHasModelsBegin CGAL::Quadratic_program -\cgalHasModels CGAL::Quadratic_program_from_mps -\cgalHasModels CGAL::Nonnegative_linear_program_from_iterators +\cgalHasModelsBegin +\cgalModels{CGAL::Quadratic_program} +\cgalModels{CGAL::Quadratic_program_from_mps} +\cgalModels{CGAL::Nonnegative_linear_program_from_iterators} \cgalHasModelsEnd \sa `QuadraticProgram` diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h index f531f27550c4..508ac094f4ab 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h @@ -33,9 +33,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModelsBegin CGAL::Quadratic_program -\cgalHasModels CGAL::Quadratic_program_from_mps -\cgalHasModels CGAL::Nonnegative_quadratic_program_from_iterators +\cgalHasModelsBegin +\cgalModels{CGAL::Quadratic_program} +\cgalModels{CGAL::Quadratic_program_from_mps} +\cgalModels{CGAL::Nonnegative_quadratic_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator diff --git a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h index e25310153888..3b3ebe86f274 100644 --- a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h @@ -34,9 +34,10 @@ The description is given by appropriate random-access iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. -\cgalHasModelsBegin CGAL::Quadratic_program -\cgalHasModels CGAL::Quadratic_program_from_mps -\cgalHasModels CGAL::Quadratic_program_from_iterators +\cgalHasModelsBegin +\cgalModels{CGAL::Quadratic_program} +\cgalModels{CGAL::Quadratic_program_from_mps} +\cgalModels{CGAL::Quadratic_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h index 1359f35074e4..e29abc65d3b3 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h @@ -48,7 +48,8 @@ of the input complex. \cgalRefines{MeshComplex_3InTriangulation_3} -\cgalHasModelsBegin CGAL::Mesh_complex_3_in_triangulation_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_complex_3_in_triangulation_3} \cgalHasModelsEnd \sa `MeshComplex_3InTriangulation_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h index fa640570e27e..2bd6bf5d8e85 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h @@ -42,7 +42,8 @@ the current approximation of each subdomain and each boundary surface patch. The data structure encodes the final mesh at the end of the meshing process. -\cgalHasModelsBegin CGAL::Mesh_complex_3_in_triangulation_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_complex_3_in_triangulation_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h index 50ac974f9797..37c1aa8a1dfa 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h @@ -18,10 +18,11 @@ of the triangulation that are surface facets. \cgalRefines{TriangulationCellBase_3,CopyConstructible} -\cgalHasModelsBegin CGAL::Compact_mesh_cell_base_3 -\cgalHasModels CGAL::Mesh_cell_base_3 -\cgalHasModels CGAL::Simplicial_mesh_cell_base_3 -\cgalHasModels CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Compact_mesh_cell_base_3} +\cgalModels{CGAL::Mesh_cell_base_3} +\cgalModels{CGAL::Simplicial_mesh_cell_base_3} +\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} \cgalHasModelsEnd */ diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h index 938ce50e7e27..accc2c9b77a8 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h @@ -16,9 +16,10 @@ and to an index characteristic of this face. \cgalRefines{TriangulationVertexBase_3} -\cgalHasModelsBegin CGAL::Mesh_vertex_base_3 -\cgalHasModels CGAL::Simplicial_mesh_vertex_base_3 -\cgalHasModels CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Mesh_vertex_base_3} +\cgalModels{CGAL::Simplicial_mesh_vertex_base_3} +\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3} \cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h index 4c700b18520a..900c6874eb39 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h @@ -6,8 +6,9 @@ The concept `Descriptor` allows to describe a unique object in an abstract model \cgalRefines{DefaultConstructible,CopyConstructible,Assignable,EqualityComparable} -\cgalHasModelsBegin Index -\cgalHasModels Handle +\cgalHasModelsBegin +\cgalModels{Index} +\cgalModels{Handle} \cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/Hashable.h b/STL_Extension/doc/STL_Extension/Concepts/Hashable.h index ab5c0429a90e..7dffe7cd9176 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Hashable.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Hashable.h @@ -6,8 +6,10 @@ A type `Key` is a model of the concept `Hashable` if the specializations `boost::hash` and `std::hash` exist. -\cgalHasModelsBare{All handles and indices of \cgal data structures, - All handles of OpenMesh\, by including the specializations of the `graph_traits` header files provided by \cgal. They can be disables by defining the macro `CGAL_DISABLE_HASH_OPENMESH`.} +\cgalHasModelsBegin +\cgalHasModelsBare{All handles and indices of \cgal data structures} +\cgalHasModelsBare{All handles of OpenMesh\, by including the specializations of the `graph_traits` header files provided by \cgal. They can be disables by defining the macro `CGAL_DISABLE_HASH_OPENMESH`.} +\cgalHasModelsEnd \sa `CGAL::Unique_hash_map` \sa `std::unordered_set` diff --git a/STL_Extension/doc/STL_Extension/Concepts/Index.h b/STL_Extension/doc/STL_Extension/Concepts/Index.h index c94791cd287b..4a3c749305d4 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Index.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Index.h @@ -6,8 +6,9 @@ The concept `Index` is a refinement of `Descriptor` which must be convertible fr \cgalRefines{Descriptor} -\cgalHasModelsBegin int -\cgalHasModels size_t +\cgalHasModelsBegin +\cgalModels{int} +\cgalModels{size_t} \cgalHasModelsEnd \cgalHeading{Notation} diff --git a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h index 00f421a6c679..55cd05e95da2 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h +++ b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h @@ -12,19 +12,20 @@ The concept `ProjectionObject` is modeled after the STL concept `UnaryFunction`, but takes also care of (const) references. -\cgalHasModelsBegin CGAL::Identity -\cgalHasModels CGAL::Dereference -\cgalHasModels CGAL::Get_address -\cgalHasModels CGAL::Cast_function_object -\cgalHasModels CGAL::Project_vertex -\cgalHasModels CGAL::Project_facet -\cgalHasModels CGAL::Project_point -\cgalHasModels CGAL::Project_normal -\cgalHasModels CGAL::Project_plane -\cgalHasModels CGAL::Project_next -\cgalHasModels CGAL::Project_prev -\cgalHasModels CGAL::Project_next_opposite -\cgalHasModels CGAL::Project_opposite_prev +\cgalHasModelsBegin +\cgalModels{CGAL::Identity} +\cgalModels{CGAL::Dereference} +\cgalModels{CGAL::Get_address} +\cgalModels{CGAL::Cast_function_object} +\cgalModels{CGAL::Project_vertex} +\cgalModels{CGAL::Project_facet} +\cgalModels{CGAL::Project_point} +\cgalModels{CGAL::Project_normal} +\cgalModels{CGAL::Project_plane} +\cgalModels{CGAL::Project_next} +\cgalModels{CGAL::Project_prev} +\cgalModels{CGAL::Project_next_opposite} +\cgalModels{CGAL::Project_opposite_prev} \cgalHasModelsEnd diff --git a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h index 02e8a3211506..89f447da3b52 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h +++ b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h @@ -21,7 +21,8 @@ We call `S` the surjective function such that `S(object)` is the \"thing\" that is locked when one tries to lock `object`. In the previous example, `S(point)` is the voxel containing `point`. -\cgalHasModelsBegin CGAL::Spatial_lock_grid_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Spatial_lock_grid_3} \cgalHasModelsEnd */ diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h index 35367ad681fd..64979029e178 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h @@ -11,8 +11,9 @@ namespace Scale_space_reconstruction_3 { * A mesher is a functor that can be applied to a range of * points and that returns a set of facets. * - * \cgalHasModelsBegin CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher - * \cgalHasModels CGAL::Scale_space_reconstruction_3::Advancing_front_mesher + * \cgalHasModelsBegin + * \cgalModels{CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher} + * \cgalModels{CGAL::Scale_space_reconstruction_3::Advancing_front_mesher} * \cgalHasModelsEnd * */ diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h index 326cc4ff2df8..8eaa935ce3c9 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h @@ -15,8 +15,9 @@ namespace Scale_space_reconstruction_3 { * \note the functor can be applied several times by the scale space * reconstruction algorithm. * - * \cgalHasModelsBegin CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother - * \cgalHasModels CGAL::Scale_space_reconstruction_3::Jet_smoother + * \cgalHasModelsBegin + * \cgalModels{CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother} + * \cgalModels{CGAL::Scale_space_reconstruction_3::Jet_smoother} * \cgalHasModelsEnd */ class Smoother diff --git a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h index f61385ec5896..75e97ae287bf 100644 --- a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h +++ b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h @@ -9,12 +9,13 @@ the keys and intervals, and provide comparison functions that are needed for window queries. -\cgalHasModelsBegin CGAL::Range_segment_tree_set_traits_2 -\cgalHasModels CGAL::Range_segment_tree_set_traits_3 -\cgalHasModels CGAL::Range_tree_map_traits_2 -\cgalHasModels CGAL::Range_tree_map_traits_3 -\cgalHasModels CGAL::Segment_tree_map_traits_2 -\cgalHasModels CGAL::Segment_tree_map_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Range_segment_tree_set_traits_2} +\cgalModels{CGAL::Range_segment_tree_set_traits_3} +\cgalModels{CGAL::Range_tree_map_traits_2} +\cgalModels{CGAL::Range_tree_map_traits_3} +\cgalModels{CGAL::Segment_tree_map_traits_2} +\cgalModels{CGAL::Segment_tree_map_traits_3} \cgalHasModelsEnd \cgalHeading{Example} diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h index f5be21ae15ea..15c80be49e4b 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h @@ -33,7 +33,8 @@ We only describe the additional requirements with respect to the \cgalRefines{ApolloniusGraphDataStructure_2} -\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h index ee8181103a40..4ae9eec2503c 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h @@ -9,7 +9,8 @@ requirements for the face base class of the \cgalRefines{TriangulationFaceBase_2} -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_face_base_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h index d53cbd55ccf5..d7a281a8d811 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h @@ -26,7 +26,8 @@ The `SegmentDelaunayGraphHierarchyVertexBase_2` concept does not introduce any constructors in addition to those of the `SegmentDelaunayGraphVertexBase_2` concept. -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 > +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 >} \cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h index 99d6bf2ca9ee..65002722e6d7 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h @@ -8,7 +8,8 @@ requirements for the sites of a segment Delaunay graph. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_site_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_site_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h index d79098a554c1..fbe6887f2eb0 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h @@ -11,7 +11,8 @@ by storing handles to points instead of points. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_storage_site_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_storage_site_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h index e4866423c159..e733426405d3 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h @@ -15,7 +15,8 @@ See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more informati \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_storage_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_storage_traits_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h index 78e56ed2f6cf..7297c1db8316 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h @@ -14,10 +14,11 @@ the concept `SegmentDelaunayGraphSite_2`. It also provides constructions for sites and several function object types for the predicates. -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_traits_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_traits_without_intersections_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_filtered_traits_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_traits_2} +\cgalModels{CGAL::Segment_Delaunay_graph_traits_without_intersections_2} +\cgalModels{CGAL::Segment_Delaunay_graph_filtered_traits_2} +\cgalModels{CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h index 48097737f247..32b0b36ab17d 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h @@ -11,7 +11,8 @@ requirements for the vertex base class of the site of the segment Delaunay graph and provides access to one of its incident faces through a `Face_handle`. -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_vertex_base_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h index 4a8ec7f78fc8..a384691661af 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h @@ -36,10 +36,11 @@ with respect to the \cgalRefines{SegmentDelaunayGraphTraits_2} -\cgalHasModelsBegin CGAL::Segment_Delaunay_graph_Linf_traits_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Segment_Delaunay_graph_Linf_traits_2} +\cgalModels{CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2} +\cgalModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2} +\cgalModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` diff --git a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h index cb1e7eed119a..1322002cd6d3 100644 --- a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h +++ b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h @@ -7,7 +7,9 @@ \cgalRefines{DefaultConstructible,PolygonTraits_2} + \cgalHasModelsBegin \cgalHasModelsBare{Any CGAL kernel, e.g., CGAL::Exact_predicates_exact_constructions_kernel.} + \cgalHasModelsEnd */ diff --git a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h index e581f066cb63..9005865d80e9 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h +++ b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h @@ -12,7 +12,8 @@ input data has to be provided in form of a random access iterator. Point and normal property maps have to be provided to extract the points and the normals from the input. -\cgalHasModelsBegin CGAL::Shape_detection::Efficient_RANSAC_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Shape_detection::Efficient_RANSAC_traits} \cgalHasModelsEnd */ class EfficientRANSACTraits{ diff --git a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h index 88df769ec099..76926590b35f 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h +++ b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h @@ -5,10 +5,11 @@ A concept that describes the set of methods used by the `CGAL::Shape_detection::Region_growing` to access neighbors of an item. -\cgalHasModelsBegin CGAL::Shape_detection::Point_set::K_neighbor_query -\cgalHasModels CGAL::Shape_detection::Point_set::Sphere_neighbor_query -\cgalHasModels CGAL::Shape_detection::Polygon_mesh::Polyline_graph -\cgalHasModels CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query +\cgalHasModelsBegin +\cgalModels{CGAL::Shape_detection::Point_set::K_neighbor_query} +\cgalModels{CGAL::Shape_detection::Point_set::Sphere_neighbor_query} +\cgalModels{CGAL::Shape_detection::Polygon_mesh::Polyline_graph} +\cgalModels{CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query} \cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h index af3212c67593..09b97911b5db 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h +++ b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h @@ -7,13 +7,14 @@ to maintain a region. A region is represented by a set items, which are included in this region. -\cgalHasModelsBegin CGAL::Shape_detection::Point_set::Least_squares_line_fit_region -\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region -\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region -\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region -\cgalHasModels CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region -\cgalHasModels CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region -\cgalHasModels CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region +\cgalHasModelsBegin +\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_line_fit_region} +\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region} +\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region} +\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region} +\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region} +\cgalModels{CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region} +\cgalModels{CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region} \cgalHasModelsEnd */ class RegionType { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h index 9ed67563fdcc..cf96c3abe8e1 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h @@ -10,9 +10,10 @@ a model of this concept, the user sets such directions and provides a way to ori contour edges towards these directions. All contour regularization functions in this package are parameterized by this concept. -\cgalHasModelsBegin Contours::Longest_direction_2 -\cgalHasModels Contours::Multiple_directions_2 -\cgalHasModels Contours::User_defined_directions_2 +\cgalHasModelsBegin +\cgalModels{Contours::Longest_direction_2} +\cgalModels{Contours::Multiple_directions_2} +\cgalModels{Contours::User_defined_directions_2} \cgalHasModelsEnd */ class ContourDirections { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h index 20dbf1801e12..f2cd1486593c 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h @@ -9,7 +9,8 @@ A concept that describes the set of methods used by the class `QP_regularization` to access neighbors of a geometric object being regularized. -\cgalHasModelsBegin Segments::Delaunay_neighbor_query_2 +\cgalHasModelsBegin +\cgalModels{Segments::Delaunay_neighbor_query_2} \cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h index ab3bbb08b7b6..ed3a10b5e285 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h @@ -9,8 +9,9 @@ A concept that describes the set of methods used by the class `QP_regularization` to access various data required for setting up the the global regularization problem. -\cgalHasModelsBegin Segments::Angle_regularization_2 -\cgalHasModels Segments::Offset_regularization_2 +\cgalHasModelsBegin +\cgalModels{Segments::Angle_regularization_2} +\cgalModels{Segments::Offset_regularization_2} \cgalHasModelsEnd */ class RegularizationType { diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h index 180cbeeb64d2..363d63a67750 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h @@ -10,7 +10,8 @@ polyhedral mesh approximating a skin surface \cgalRefines{RegularTriangulationTraits_3} -\cgalHasModelsBegin CGAL::Skin_surface_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Skin_surface_traits_3} \cgalHasModelsEnd \sa `CGAL::Skin_surface_3` diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h index 237a5d3049d6..22146acf83a4 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h @@ -9,8 +9,9 @@ The concept requires a constructor from an iterator range of weighted points and a shrink factor. By default the input balls are grown in such that the skin surface wraps around the input balls. -\cgalHasModelsBegin CGAL::Skin_surface_3 -\cgalHasModels CGAL::Union_of_balls_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Skin_surface_3} +\cgalModels{CGAL::Union_of_balls_3} \cgalHasModelsEnd */ diff --git a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h index 163d17faa16a..49dd95d05338 100644 --- a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h +++ b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h @@ -11,7 +11,8 @@ some function object types for the required predicates on those primitives. \cgalRefines{ArrangementTraits_2} -\cgalHasModelsBegin CGAL::Snap_rounding_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Snap_rounding_traits_2} \cgalHasModelsEnd */ @@ -172,7 +173,9 @@ namespace SRTraits_2{ \cgalConcept Represents an iso rectangle \cgalRefines{DefaultConstructible,CopyConstructible,Assignable} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Iso_rectangle_2 `Snap_rounding_traits_2::Iso_rectangle_2` \endlink} + \cgalHasModelsEnd */ class IsoRectangle_2 {}; @@ -181,7 +184,9 @@ class IsoRectangle_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_vertex_2 `Snap_rounding_traits_2::Construct_vertex_2` \endlink} + \cgalHasModelsEnd */ class ConstructVertex_2 { @@ -198,7 +203,9 @@ class ConstructVertex_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_segment_2 `Snap_rounding_traits_2::Construct_segment_2` \endlink} + \cgalHasModelsEnd */ class ConstructSegment_2 { @@ -215,7 +222,9 @@ class ConstructSegment_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableQuaternaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Construct_iso_rectangle_2 `Snap_rounding_traits_2::Construct_iso_rectangle_2` \endlink} + \cgalHasModelsEnd */ class ConstructIsoRectangle_2 { @@ -236,7 +245,9 @@ class ConstructIsoRectangle_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Compare_x_2 `Snap_rounding_traits_2::Compare_x_2` \endlink} + \cgalHasModelsEnd */ class CompareX_2 { @@ -252,7 +263,9 @@ class CompareX_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Compare_y_2 `Snap_rounding_traits_2::Compare_y_2` \endlink} + \cgalHasModelsEnd */ class CompareY_2 { @@ -269,7 +282,9 @@ class CompareY_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableQuaternaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Snap_2 `Snap_rounding_traits_2::Snap_2` \endlink} + \cgalHasModelsEnd */ class Snap_2 { @@ -288,7 +303,9 @@ class Snap_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableBinaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Integer_grid_point_2 `Snap_rounding_traits_2::Integer_grid_point_2` \endlink} + \cgalHasModelsEnd */ class IntegerGridPoint_2 @@ -309,7 +326,9 @@ class IntegerGridPoint_2 \ingroup PkgSnapRounding2Concepts \cgalConcept \cgalRefines{AdaptableTernaryFunction} + \cgalHasModelsBegin \cgalHasModelsBare{\link SnapRoundingTraits_2::Minkowski_sum_with_pixel_2 `Snap_rounding_traits_2::Minkowski_sum_with_pixel_2` \endlink} + \cgalHasModelsEnd */ class MinkowskiSumWithPixel_2 { diff --git a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h index 41594f6cbfeb..7791fbf59a9a 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h @@ -19,7 +19,8 @@ For example, a matrix of dimension 3 is defined as \tparam FT Number type \tparam dim Dimension of the matrices and vectors -\cgalHasModelsBegin CGAL::Eigen_diagonalize_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_diagonalize_traits} \cgalHasModelsEnd */ template diff --git a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h index 015153dd3240..f73b3d143963 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h @@ -7,7 +7,8 @@ class MixedIntegerProgramTraits `MixedIntegerProgramVariable` is a concept of a variable in a Mixed Integer Programming (MIP) problem. -\cgalHasModelsBegin CGAL::Variable +\cgalHasModelsBegin +\cgalModels{CGAL::Variable} \cgalHasModelsEnd */ template @@ -113,7 +114,8 @@ class MixedIntegerProgramVariable `MixedIntegerProgramLinearConstraint` is a concept of a linear constraint in a Mixed Integer Programming (MIP) problem. -\cgalHasModelsBegin CGAL::Linear_constraint +\cgalHasModelsBegin +\cgalModels{CGAL::Linear_constraint} \cgalHasModelsEnd */ template @@ -211,7 +213,8 @@ class MixedIntegerProgramLinearConstraint `MixedIntegerProgramLinearObjective` is a concept of the linear objective function in a Mixed Integer Programming (MIP) problem. -\cgalHasModelsBegin CGAL::Linear_objective +\cgalHasModelsBegin +\cgalModels{CGAL::Linear_objective} \cgalHasModelsEnd */ template @@ -280,9 +283,10 @@ Mixed Integer Programming (MIP) problems. A model of this concept stores the int variables, linear objective, and linear constraints (if any) and provides a method to solve the problem. -\cgalHasModelsBegin CGAL::Mixed_integer_program_traits -\cgalHasModels CGAL::GLPK_mixed_integer_program_traits -\cgalHasModels CGAL::SCIP_mixed_integer_program_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Mixed_integer_program_traits} +\cgalModels{CGAL::GLPK_mixed_integer_program_traits} +\cgalModels{CGAL::SCIP_mixed_integer_program_traits} \cgalHasModelsEnd */ template diff --git a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h index 07781ed7265a..49fb8ee1937e 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h @@ -7,7 +7,8 @@ Concept describing the set of requirements for solving the normal equation \f$ A \sa `SparseLinearAlgebraTraits_d` -\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class NormalEquationSparseLinearAlgebraTraits_d diff --git a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h index f929f231c7b5..7ed6bf55f2b3 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h @@ -24,7 +24,8 @@ where \f$ l_i \in \mathbb{R} \cup \{-\infty\} \f$ for all \f$ i \f$, where \f$ u_i \in \mathbb{R} \cup \{+\infty\} \f$ for all \f$ i \f$. -\cgalHasModelsBegin CGAL::OSQP_quadratic_program_traits +\cgalHasModelsBegin +\cgalModels{CGAL::OSQP_quadratic_program_traits} \cgalHasModelsEnd */ class QuadraticProgramTraits { diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h index 7c04f914bd48..9d236d47d3df 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h @@ -4,7 +4,8 @@ The concept `SparseLinearAlgebraTraits_d` is used to solve sparse linear systems A\f$ \times \f$ X = B. -\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class SparseLinearAlgebraTraits_d @@ -63,7 +64,8 @@ by a sparse matrix. \cgalRefines{DefaultConstructible} -\cgalHasModelsBegin CGAL::Eigen_vector +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_vector} \cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` @@ -131,8 +133,9 @@ NT& operator[](Index row); \cgalRefines{Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Eigen_sparse_matrix -\cgalHasModels CGAL::Eigen_sparse_symmetric_matrix +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_sparse_matrix} +\cgalModels{CGAL::Eigen_sparse_symmetric_matrix} \cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h index 34df486f1e63..c8792ccab3a6 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h @@ -8,7 +8,8 @@ method to solve the system for different right-hand vectors. \cgalRefines{SparseLinearAlgebraTraits_d} -\cgalHasModelsBegin CGAL::Eigen_solver_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class SparseLinearAlgebraWithFactorTraits_d { diff --git a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h old mode 100644 new mode 100755 index 2c843090296b..cd0ec9832ee6 --- a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h @@ -5,7 +5,8 @@ The concept `SvdTraits` describes the linear algebra types and algorithms needed to solve in the least square sense a linear system with a singular value decomposition -\cgalHasModelsBegin galHasModel `CGAL::Eigen_svd +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_svd} \cgalHasModelsEnd */ class SvdTraits @@ -52,7 +53,8 @@ class SvdTraits \cgalConcept Concept of vector type used by the concept `SvdTraits`. -\cgalHasModelsBegin CGAL::Eigen_vector +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_vector} \cgalHasModelsEnd */ class SvdTraits::Vector @@ -90,7 +92,8 @@ Concept of matrix type used by the concept `SvdTraits`. \cgalRefines{DefaultConstructible,Assignable} -\cgalHasModelsBegin CGAL::Eigen_matrix +\cgalHasModelsBegin +\cgalModels{CGAL::Eigen_matrix} \cgalHasModelsEnd */ class SvdTraits::Matrix diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h old mode 100644 new mode 100755 index 4e0837b36be0..7289e042338b --- a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h @@ -4,8 +4,9 @@ The concept `FuzzyQueryItem` describes the requirements for fuzzy `d`-dimensional spatial objects. -\cgalHasModelsBegin CGAL::Fuzzy_sphere -\cgalHasModel `CGAL::Fuzzy_iso_box` +\cgalHasModelsBegin +\cgalHasModels{CGAL::Fuzzy_sphere} +\cgalHasModels{CGAL::Fuzzy_iso_box} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h index 7a8506131f61..6bf09d1211ae 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h @@ -8,8 +8,9 @@ To optimize distance computations transformed distances are used, e.g., for a Euclidean distance the transformed distance is the squared Euclidean distance. -\cgalHasModelsBegin CGAL::Manhattan_distance_iso_box_point -\cgalHasModels CGAL::Euclidean_distance_sphere_point +\cgalHasModelsBegin +\cgalModels{CGAL::Manhattan_distance_iso_box_point} +\cgalModels{CGAL::Euclidean_distance_sphere_point} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h index b2f826e4074a..a12b6e2a2447 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h @@ -8,8 +8,9 @@ E.g., for an Euclidean distance the transformed distance is the squared Euclidea \cgalRefines{GeneralDistance} -\cgalHasModelsBegin CGAL::Euclidean_distance -\cgalHasModels CGAL::Weighted_Minkowski_distance +\cgalHasModelsBegin +\cgalModels{CGAL::Euclidean_distance} +\cgalModels{CGAL::Weighted_Minkowski_distance} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h index feb9af6f79ed..22a34f8c6de4 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h @@ -8,12 +8,13 @@ range search queries in a model of `SpatialTree`. \cgalRefines{SearchTraits} -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d -\cgalHasModels CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d -\cgalHasModels CGAL::Search_traits_2 -\cgalHasModels CGAL::Search_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} +\cgalModels{CGAL::Search_traits_2} +\cgalModels{CGAL::Search_traits_3} \cgalHasModelsEnd \sa `SearchTraits` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h index 96857238a64a..f55a7971ea50 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_2.h @@ -5,7 +5,9 @@ The concept `SearchGeomTraits_2` defines the requirements for the template parameter of the search traits classes. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd */ class SearchGeomTraits_2 { diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h index 85191a1b0962..5b5e5916dc92 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchGeomTraits_3.h @@ -5,7 +5,9 @@ The concept `SearchGeomTraits_3` defines the requirements for the template parameter of the search traits classes. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h index 6bfe70109e01..358c828ff6f8 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h @@ -5,14 +5,15 @@ The concept `SearchTraits` defines the requirements for the template parameter of the search classes. -\cgalHasModelsBegin CGAL::Cartesian_d -\cgalHasModels CGAL::Homogeneous_d -\cgalHasModels CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d -\cgalHasModels CGAL::Search_traits_2 -\cgalHasModels CGAL::Search_traits_3 -\cgalHasModels CGAL::Search_traits_d -\cgalHasModels CGAL::Search_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Cartesian_d} +\cgalModels{CGAL::Homogeneous_d} +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} +\cgalModels{CGAL::Search_traits_2} +\cgalModels{CGAL::Search_traits_3} +\cgalModels{CGAL::Search_traits_d} +\cgalModels{CGAL::Search_traits} \cgalHasModelsEnd \sa `RangeSearchTraits` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h index ecdc521ce9fe..357dbbfff468 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h @@ -11,7 +11,8 @@ space is said to be on the negative side of the separator and the other part of space is said to be on the positive side of the separator. -\cgalHasModelsBegin CGAL::Plane_separator +\cgalHasModelsBegin +\cgalModels{CGAL::Plane_separator} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h index 58d396cec22c..aa483a297805 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h @@ -5,7 +5,8 @@ The concept `SpatialTree` defines the requirements for a tree supporting both neighbor searching and approximate range searching. -\cgalHasModelsBegin CGAL::Kd_tree +\cgalHasModelsBegin +\cgalModels{CGAL::Kd_tree} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h index 88a18887640d..6621186a2f7e 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h @@ -7,13 +7,14 @@ The concept `Splitter` defines the requirements for a function object class implementing a splitting rule. \cgalAdvancedEnd -\cgalHasModelsBegin CGAL::Fair -\cgalHasModels CGAL::Median_of_rectangle -\cgalHasModels CGAL::Median_of_max_spread -\cgalHasModels CGAL::Midpoint_of_rectangle -\cgalHasModels CGAL::Midpoint_of_max_spread -\cgalHasModels CGAL::Sliding_fair -\cgalHasModels CGAL::Sliding_midpoint +\cgalHasModelsBegin +\cgalModels{CGAL::Fair} +\cgalModels{CGAL::Median_of_rectangle} +\cgalModels{CGAL::Median_of_max_spread} +\cgalModels{CGAL::Midpoint_of_rectangle} +\cgalModels{CGAL::Midpoint_of_max_spread} +\cgalModels{CGAL::Sliding_fair} +\cgalModels{CGAL::Sliding_midpoint} \cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h index 8a48e705bd00..f577778a10d4 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_2.h @@ -9,7 +9,9 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_2` defines the complete set of primitives required in these functions and functors. -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Spatial_sort_traits_adapter_2 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Spatial_sort_traits_adapter_2} \cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h index 2cef4c17269a..f0274680a2dd 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_3.h @@ -9,7 +9,9 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_3` defines the complete set of primitives required in these functions and functors. -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Spatial_sort_traits_adapter_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Spatial_sort_traits_adapter_3} \cgalHasModelsEnd */ diff --git a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h index a0c4dfd031d4..8e4ca68c7990 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h +++ b/Spatial_sorting/doc/Spatial_sorting/Concepts/SpatialSortingTraits_d.h @@ -9,7 +9,9 @@ primitives (objects and predicates) that the sorting algorithms use. `SpatialSortingTraits_d` defines the complete set of primitives required in these functions and functors. -\cgalHasModelsBareBegin{Any \cgal `d`-dimensional kernel.} CGAL::Spatial_sort_traits_adapter_d +\cgalHasModelsBegin +\cgalHasModelsBare{Any \cgal `d`-dimensional kernel.} +\cgalHasModels{CGAL::Spatial_sort_traits_adapter_d} \cgalHasModelsEnd */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h index 15aa1efc7dab..f5f7270e043a 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h @@ -7,7 +7,8 @@ The concept `PolygonOffsetBuilderTraits_2` describes the requirements for the geometric traits class required by the algorithm class `CGAL::Polygon_offset_builder_2`. -\cgalHasModelsBegin CGAL::Polygon_offset_builder_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Polygon_offset_builder_traits_2} \cgalHasModelsEnd \sa `CGAL::Polygon_offset_builder_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h index a19486171c43..5df86d3e2a6b 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h @@ -7,7 +7,8 @@ The concept `StraightSkeletonBuilderTraits_2` describes the requirements for the geometric traits class required by the algorithm class `CGAL::Straight_skeleton_builder_2`. -\cgalHasModelsBegin CGAL::Straight_skeleton_builder_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_builder_traits_2} \cgalHasModelsEnd */ class StraightSkeletonBuilderTraits_2 { diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h index 316fbc4b0e04..7937ab435359 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h @@ -5,7 +5,8 @@ The concept `StraightSkeletonBuilder_2_Visitor` describes the requirements of the visitor class required by the algorithm class `CGAL::Straight_skeleton_builder_2` in its third template parameter. -\cgalHasModelsBegin CGAL::Dummy_straight_skeleton_builder_2_visitor +\cgalHasModelsBegin +\cgalModels{CGAL::Dummy_straight_skeleton_builder_2_visitor} \cgalHasModelsEnd \sa `CGAL::Straight_skeleton_builder_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h index 16bf5a396b50..af125ad42f5e 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h @@ -8,7 +8,8 @@ The concept `StraightSkeletonFace_2` describes the requirements for the face typ `StraightSkeleton_2` concept. It is a refinement of the `HalfedgeDSFace` concept with support for storage of the incident halfedge. -\cgalHasModelsBegin CGAL::Straight_skeleton_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_face_base_2} \cgalHasModelsEnd \sa `StraightSkeletonVertex_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h index 22caa9419c04..67f6dafc5c44 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h @@ -12,7 +12,8 @@ The only geometric embedding used by the Straight Skeleton Data Structure are th in the contour and skeleton vertices. However, for any halfedge, there is a 2D segment implicitly given by its `source` and `target` vertices. -\cgalHasModelsBegin CGAL::Straight_skeleton_halfedge_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_halfedge_base_2} \cgalHasModelsEnd \sa `StraightSkeleton_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h index a95688dc6e78..0bf7cab0c87f 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h @@ -6,7 +6,8 @@ The concept `StraightSkeletonItemsConverter_2` describes the requirements for it as the third template argument to the class `Straight_skeleton_converter_2`. It converts the `HDS` items from one type of straight skeleton to another. -\cgalHasModelsBegin CGAL::Straight_skeleton_items_converter_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_items_converter_2} \cgalHasModelsEnd \sa `CGAL::Straight_skeleton_converter_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h index a53a002940ef..29f50118cb4c 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h @@ -9,7 +9,8 @@ The concept `StraightSkeletonVertex_2` describes the requirements for the vertex with support for storage of the incident halfedge. The `StraightSkeletonVertex_2` concept requires the geometric embedding to be a 2D point. -\cgalHasModelsBegin CGAL::Straight_skeleton_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_vertex_base_2} \cgalHasModelsEnd \sa `StraightSkeletonHalfedge_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h index 52dcfe61484e..9df0937e9ff4 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h @@ -9,7 +9,8 @@ used to represent a straight skeleton. It refines the concept `HalfedgeDS` and adds additional requirements on the nested types `Vertex`, `Halfedge`, and `Face` of the halfedge data structure. -\cgalHasModelsBegin CGAL::Straight_skeleton_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Straight_skeleton_2} \cgalHasModelsEnd \attention This concept explicitly protects all the modifying diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h index 6f001fda04ee..9e23002f51d9 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h @@ -9,8 +9,9 @@ the second template parameter of the class provides the operation that integrates a new point from a given point with a predefined step, and according to a specified vector. -\cgalHasModelsBegin CGAL::Euler_integrator_2 -\cgalHasModels CGAL::Runge_kutta_integrator_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Euler_integrator_2} +\cgalModels{CGAL::Runge_kutta_integrator_2} \cgalHasModelsEnd */ diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h index e1394b709454..a2e24fd2fbad 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/StreamLinesTraits_2.h @@ -9,7 +9,9 @@ the template parameter of the class This concept provides the types handled by the `CGAL::Stream_lines_2` class. +\cgalHasModelsBegin \cgalHasModelsBare{The kernels of \cgal are models for this traits class.} +\cgalHasModelsEnd */ class StreamLinesTraits_2 { diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h index b42a88dba950..b79ed1e740fa 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h @@ -9,8 +9,9 @@ the first template parameter of the class provides the types of the geometric primitives used in the placement of streamlines and some functions for answering different queries. -\cgalHasModelsBegin CGAL::Regular_grid_2 -\cgalHasModels CGAL::Triangular_field_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_grid_2} +\cgalModels{CGAL::Triangular_field_2} \cgalHasModelsEnd */ diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h index 2a0e662a0e82..ea351a5d2ba1 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h @@ -11,7 +11,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModelsBegin CGAL::DooSabin_mask_3 +\cgalHasModelsBegin +\cgalModels{CGAL::DooSabin_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h index 22c59d45ad22..15a337e68c97 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h @@ -11,7 +11,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModelsBegin CGAL::CatmullClark_mask_3 +\cgalHasModelsBegin +\cgalModels{CGAL::CatmullClark_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h index 2faff045bd6d..190f970bd007 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h @@ -10,7 +10,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModelsBegin CGAL::Loop_mask_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Loop_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h index ed311db671a3..72823a073e1b 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h @@ -9,7 +9,8 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} -\cgalHasModelsBegin CGAL::Sqrt3_mask_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Sqrt3_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h index 68364e07863a..f6e59cdaf67f 100644 --- a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h +++ b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h @@ -6,8 +6,9 @@ The concept `ErrorMetricProxy` defines the notion of proxy, computes the fitting error from a face to a proxy, and fits a proxy from a range of faces. -\cgalHasModelsBegin CGAL::Surface_mesh_approximation::L21_metric_plane_proxy -\cgalHasModels CGAL::Surface_mesh_approximation::L2_metric_plane_proxy +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_approximation::L21_metric_plane_proxy} +\cgalModels{CGAL::Surface_mesh_approximation::L2_metric_plane_proxy} \cgalHasModelsEnd */ diff --git a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h index 65137707986d..4332ebda74b1 100644 --- a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h +++ b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h @@ -9,8 +9,9 @@ to implement models of this concept. \cgalRefines{DefaultConstructible} -\cgalHasModelsBegin CGAL::Deformation_Eigen_closest_rotation_traits_3 -\cgalHasModels CGAL::Deformation_Eigen_polar_closest_rotation_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Deformation_Eigen_closest_rotation_traits_3} +\cgalModels{CGAL::Deformation_Eigen_polar_closest_rotation_traits_3} \cgalHasModelsEnd */ diff --git a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h index 67002d031aec..35a8d8a2e1a4 100644 --- a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h +++ b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h @@ -12,16 +12,17 @@ the border of a given mesh. Construction and destruction are undefined. -\cgalHasModelsBegin CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3 -\cgalHasModels CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3} +\cgalModels{CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3} \cgalHasModelsEnd \sa `CGAL::Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3` diff --git a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h index 2e0a58fa0a28..81e7848328b1 100644 --- a/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h +++ b/Surface_mesh_segmentation/doc/Surface_mesh_segmentation/Concepts/SegmentationGeomTraits.h @@ -5,7 +5,9 @@ The concept `SegmentationGeomTraits` describes the set of requirements of the geometric traits needed by the segmentation functions. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \cgalRefines{AABBGeomTraits} diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h index 51d4ae712eb6..9724634b10ff 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h @@ -8,7 +8,8 @@ predicates, and constructions required by the traits class parameter of `CGAL::Surface_mesh_shortest_path`. \cgalRefines{CopyConstructible,Assignable} -\cgalHasModelsBegin CGAL::Surface_mesh_shortest_path_traits +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_shortest_path_traits} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h index f31143efcc62..2bd7a6bd2017 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h @@ -12,9 +12,10 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Edge_length_cost -\cgalHasModels CGAL::Surface_mesh_simplification::LindstromTurk_cost -\cgalHasModels CGAL::Surface_mesh_simplification::GarlandHeckbert_policies +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_simplification::Edge_length_cost} +\cgalModels{CGAL::Surface_mesh_simplification::LindstromTurk_cost} +\cgalModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h index bb66ff08d050..cf87c5e2400d 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h @@ -14,11 +14,12 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Midpoint_placement -\cgalHasModels CGAL::Surface_mesh_simplification::LindstromTurk_placement -\cgalHasModels CGAL::Surface_mesh_simplification::GarlandHeckbert_policies -\cgalHasModels CGAL::Surface_mesh_simplification::Bounded_normal_change_placement -\cgalHasModels CGAL::Surface_mesh_simplification::Constrained_placement +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_simplification::Midpoint_placement} +\cgalModels{CGAL::Surface_mesh_simplification::LindstromTurk_placement} +\cgalModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} +\cgalModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_placement} +\cgalModels{CGAL::Surface_mesh_simplification::Constrained_placement} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h index b66544074009..6f53b84171e8 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h @@ -14,8 +14,9 @@ be absent). The value `boost::none` indicates that the edge should not be collap \cgalRefines{DefaultConstructible,CopyConstructible} -\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Bounded_normal_change_filter -\cgalHasModels CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_filter} +\cgalModels{CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h index df8fc845f5b4..9a51402119c5 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h @@ -4,11 +4,12 @@ The concept `StopPredicate` describes the requirements for the predicate which indicates if the simplification process must finish. -\cgalHasModelsBegin CGAL::Surface_mesh_simplification::Edge_count_stop_predicate -\cgalHasModels CGAL::Surface_mesh_simplification::Face_count_stop_predicate -\cgalHasModels CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate -\cgalHasModels CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate -\cgalHasModels CGAL::Surface_mesh_simplification::Edge_length_stop_predicate +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_simplification::Edge_count_stop_predicate} +\cgalModels{CGAL::Surface_mesh_simplification::Face_count_stop_predicate} +\cgalModels{CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate} +\cgalModels{CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate} +\cgalModels{CGAL::Surface_mesh_simplification::Edge_length_stop_predicate} \cgalHasModelsEnd */ diff --git a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h index b7466a2ecd45..8e929d561dd5 100644 --- a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h +++ b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h @@ -5,7 +5,9 @@ * * Traits class concept defining the requirements of the class `CGAL::Mean_curvature_flow_skeletonization`. * + * \cgalHasModelsBegin * \cgalHasModelsBare{Any \cgal `Kernel` with `double` as `%Kernel::%FT`} + * \cgalHasModelsEnd * * */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h index 6f6355c93901..ea183d1c13f1 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchema.h @@ -9,8 +9,10 @@ \cgalRefines{GenericMap} - \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`\endlink\n - \link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map`\endlink} + \cgalHasModelsBegin + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`\endlink} + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map`\endlink} + \cgalHasModelsEnd */ class PolygonalSchema diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h index 0bf077baf427..ee039139ce10 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/PolygonalSchemaItems.h @@ -6,7 +6,9 @@ \cgalRefines{GenericMapItems} + \cgalHasModelsBegin \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Polygonal_schema_min_items `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`\endlink} + \cgalHasModelsEnd */ class PolygonalSchemaItems diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h index 4650a313f02a..6f9cbefceb67 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Concepts/WeightFunctor.h @@ -5,8 +5,10 @@ The concept `WeightFunctor` defines a functor to calculate the weight of an edge. - \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Unit_weight_functor `CGAL::Surface_mesh_topology::Unit_weight_functor`\endlink, - \link CGAL::Surface_mesh_topology::Euclidean_length_weight_functor `CGAL::Surface_mesh_topology::Euclidean_length_weight_functor`\endlink} + \cgalHasModelsBegin + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Unit_weight_functor `CGAL::Surface_mesh_topology::Unit_weight_functor`\endlink} + \cgalHasModelsBare{\link CGAL::Surface_mesh_topology::Euclidean_length_weight_functor `CGAL::Surface_mesh_topology::Euclidean_length_weight_functor`\endlink} + \cgalHasModelsEnd */ class WeightFunctor { public: diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h index 319bf352f0c6..299065f4890c 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitFunction.h @@ -7,7 +7,9 @@ The concept `ImplicitFunction` describes a function object whose `operator()` computes the values of a function \f$ f : \mathbb{R}^3 \longrightarrow \mathbb{R}\f$. -\cgalHasModelsBareBegin{any pointer to a function of type `FT (*)(Point)`} CGAL::Gray_level_image_3 +\cgalHasModelsBegin +\cgalHasModelsBare{any pointer to a function of type `FT (*)(Point)`} +\cgalHasModels{CGAL::Gray_level_image_3} \cgalHasModelsEnd \sa `CGAL::Implicit_surface_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h index 28814f2648ea..d06d695c40e6 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/ImplicitSurfaceTraits_3.h @@ -15,7 +15,9 @@ the concept `ImplicitSurfaceTraits_3` provides the types, predicates and constru that are passed to the generated model of `SurfaceMeshTraits_3`. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Implicit_surface_3` \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h index 1b16bc506f14..3dcc8a0dedf5 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h @@ -37,8 +37,9 @@ of the restriction to the surface of a three dimensional triangulation. In the following we call surface center of a facet, the center of its biggest Delaunay surface ball. -\cgalHasModelsBegin CGAL::Surface_mesh_cell_base_3 -\cgalHasModels CGAL::Surface_mesh_default_triangulation_3::Cell +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_cell_base_3} +\cgalModels{CGAL::Surface_mesh_default_triangulation_3::Cell} \cgalHasModelsEnd \sa `SurfaceMeshTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h index ec9eba193720..35b923bbb8b5 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h @@ -30,7 +30,8 @@ A model of this concept is a type to be plugged as first template parameter in the function template `CGAL::make_surface_mesh()`. -\cgalHasModelsBegin CGAL::Surface_mesh_complex_2_in_triangulation_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_complex_2_in_triangulation_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h index 7380607aca07..0f3431af56cb 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h @@ -33,7 +33,8 @@ is just a lexicographical comparison. The meshing algorithm handles facets with lowest quality first. The qualities are computed by a function `is_bad(const Facet& f, const Quality& q)`. -\cgalHasModelsBegin CGAL::Surface_mesh_default_criteria_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_default_criteria_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h index dd728781a7f7..672f74669488 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h @@ -11,7 +11,8 @@ and to compute some intersection points if any exists. The concept `SurfaceMeshTraits_3` also includes a funcctor able to provide a small set of initial points on the surface. -\cgalHasModelsBegin CGAL::Surface_mesh_traits_generator_3::type +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_traits_generator_3::type} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h index 7af1aba64cae..a8411edcbbd5 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTriangulation_3.h @@ -17,7 +17,9 @@ the requirements for the triangulation type plugged in the class `CGAL::Surface_mesh_complex_2_in_triangulation_3`. +\cgalHasModelsBegin \cgalHasModelsBare{Any 3D Delaunay triangulation class of \cgal} +\cgalHasModelsEnd \sa `CGAL::Triangulation_3` \sa `CGAL::Delaunay_triangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h index 086b7759ac90..32663ac10ddf 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h @@ -31,8 +31,9 @@ integers, which, when they are valid, store respectively the number of complex facets incident to the vertex and the number of connected components of the adjacency graph of those facets. -\cgalHasModelsBegin CGAL::Surface_mesh_vertex_base_3 -\cgalHasModels CGAL::Surface_mesh_default_triangulation_3::Vertex +\cgalHasModelsBegin +\cgalModels{CGAL::Surface_mesh_vertex_base_3} +\cgalModels{CGAL::Surface_mesh_default_triangulation_3::Vertex} \cgalHasModelsEnd \sa `SurfaceMeshComplex_2InTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h index 0e5cca74dfef..4b4d11da894f 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h @@ -8,7 +8,8 @@ The surface types are required to be copy constructible and assignable. -\cgalHasModelsBegin CGAL::Implicit_surface_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Implicit_surface_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h index e10d068c1b1a..e1dc359a13f0 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h @@ -48,7 +48,8 @@ that the `CGAL::Triangulation_data_structure_2` actually uses as a base class for the class `CGAL::Triangulation_data_structure_2::Face`. -\cgalHasModelsBegin CGAL::Triangulation_ds_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_face_base_2} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h index e47b7cfbf3f8..994a0f82b9b0 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h @@ -44,7 +44,8 @@ that the `CGAL::Triangulation_data_structure_2` actually uses as a base class for the class of `CGAL::Triangulation_data_structure_2::Vertex`. -\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h index 051a1359d2e8..a07310740957 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h @@ -64,7 +64,8 @@ the rank of this item in the output order. When dimension \f$ <\f$ 2, the same information is output for faces of maximal dimension instead of faces. -\cgalHasModelsBegin CGAL::Triangulation_data_structure_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2::Face` @@ -727,7 +728,8 @@ In order to obtain new vertices or destruct unused vertices, the user must call the `create_vertex()` and `delete_vertex()` methods of the triangulation data structure. -\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` @@ -849,7 +851,8 @@ The methods `create_face()` and have to be used to define new faces and to delete no longer used faces. -\cgalHasModelsBegin CGAL::Triangulation_ds_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_face_base_2} \cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h index 59f5b45bbe2a..8f8ec146dbf9 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h @@ -33,7 +33,8 @@ cell classes. The rebound base classes so obtained are the classes which are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. -\cgalHasModelsBegin CGAL::Triangulation_ds_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_cell_base_3} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h index 9ef2cd34bbc6..0a9d10b04bff 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h @@ -28,7 +28,8 @@ cell classes. The rebound base classes so obtained are the classes which are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. -\cgalHasModelsBegin CGAL::Triangulation_ds_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_vertex_base_3} \cgalHasModelsEnd \sa `TriangulationDSCellBase_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h index a2c6d41e9334..c3a7ba38023d 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h @@ -65,7 +65,8 @@ neighbors of each cell, where the index corresponds to the preceding list of cells. When dimension < 3, the same information is stored for faces of maximal dimension instead of cells. -\cgalHasModelsBegin CGAL::Triangulation_data_structure_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_data_structure_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3::Vertex` diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h index aa3f4d68dc1c..342e203e2598 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h @@ -6,7 +6,8 @@ Cell base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. -\cgalHasModelsBegin CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} \cgalHasModelsEnd */ diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h index ad71f044d997..85e92da96c32 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingTriangulationTraits_3.h @@ -10,7 +10,9 @@ of the class `Remeshing_triangulation_3`. It defines the geometric objects (points, segments, triangles, and tetrahedra) forming the triangulation together with a few geometric predicates and constructions on these objects. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Triangulation_3` */ diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h index 2b1b5bc8fc3f..2ce117b8ff32 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h @@ -6,7 +6,8 @@ Vertex base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. -\cgalHasModelsBegin Tetrahedral_remeshing::Remeshing_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{Tetrahedral_remeshing::Remeshing_vertex_base_3} \cgalHasModelsEnd */ diff --git a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h index 14395b71b936..1dd4fa17d49f 100644 --- a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h @@ -9,8 +9,9 @@ a Delaunay triangulation. It corresponds to the first template parameter of the \cgalRefines{TriangulationTraits} -\cgalHasModelsBegin CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d +\cgalHasModelsBegin +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `TriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h index 35b31839b7ab..1afb3084639a 100644 --- a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h @@ -9,8 +9,9 @@ a regular triangulation. It corresponds to the first template parameter of the c \cgalRefines{TriangulationTraits} -\cgalHasModelsBegin CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d +\cgalHasModelsBegin +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `TriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h index d92afbd427e6..b72f4ee1fd0a 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h @@ -15,7 +15,8 @@ The dimension of a face is implicitly set when `TriangulationDSFace::set_index` is called two times to set the first two vertices (`i = 0` and `i = 1`), then the dimension is 1. -\cgalHasModelsBegin CGAL::Triangulation_face +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_face} \cgalHasModelsEnd \sa `TriangulationDSFullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h index 3e32c2423a22..231e29f5a08f 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h @@ -36,8 +36,9 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::FullCell} -\cgalHasModelsBegin CGAL::Triangulation_ds_full_cell -\cgalHasModels CGAL::Triangulation_full_cell +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_full_cell} +\cgalModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `TriangulationDSVertex` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h index c23aaabe1ea7..51fb7cad627c 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h @@ -36,8 +36,9 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::Vertex} -\cgalHasModelsBegin CGAL::Triangulation_ds_vertex -\cgalHasModels CGAL::Triangulation_vertex +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_vertex} +\cgalModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \sa `TriangulationDSFullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h index c17ded6feb1e..a8da6d398490 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h @@ -69,7 +69,8 @@ The classes `Vertex` and `Full_cell` have to provide the relevant I/O operators (possibly empty). -\cgalHasModelsBegin CGAL::Triangulation_data_structure +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_data_structure} \cgalHasModelsEnd \sa `TriangulationDataStructure::Vertex` @@ -661,8 +662,9 @@ It sets requirements of combinatorial nature only, as geometry is not concerned here. In particular, we only require that the vertex holds a handle to a full cell incident to it in the triangulation. -\cgalHasModelsBegin CGAL::Triangulation_ds_vertex -\cgalHasModels CGAL::Triangulation_vertex +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_vertex} +\cgalModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` @@ -769,8 +771,9 @@ full cell as well as handles to the adjacent full cells. Two full cells are said to be adjacent when they share a facet. Adjacent full cells are called hereafter neighbors. -\cgalHasModelsBegin CGAL::Triangulation_ds_full_cell -\cgalHasModels CGAL::Triangulation_full_cell +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_ds_full_cell} +\cgalModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h index eba0214810a1..95cac2eab13c 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h @@ -10,7 +10,8 @@ represent a full cell. \cgalRefines{TriangulationDSFullCell We only list below the additional specific requirements of `TriangulationFullCell`} -\cgalHasModelsBegin CGAL::Triangulation_full_cell +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `CGAL::Triangulation_full_cell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h index 3d004b52c286..198e3a736502 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h @@ -14,8 +14,9 @@ traits must refine `SpatialSortingTraits_d`. The insertion is then optimized using spatial sorting. This is not required if the points are inserted one by one. -\cgalHasModelsBegin CGAL::Epick_d -\cgalHasModels CGAL::Epeck_d +\cgalHasModelsBegin +\cgalModels{CGAL::Epick_d} +\cgalModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h index 956acd269f14..457339f28b0e 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h @@ -12,7 +12,8 @@ We only list below the additional specific requirements of ::TriangulationVertex Compared to ::TriangulationDSVertex, the main difference is the addition of an association of the vertex with a geometric point. -\cgalHasModelsBegin CGAL::Triangulation_vertex +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \cgalHeading{Input/Output} diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h index bf4b52d43c46..cf9b15d466ef 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedDelaunayTriangulationTraits_2.h @@ -17,9 +17,11 @@ The concept `ConstrainedDelaunayTriangulationTraits_2` refines both the concept \cgalRefines{DelaunayTriangulationTraits_2,ConstrainedTriangulationTraits_2} -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h index a5a98882faa6..73951fc22c16 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h @@ -19,7 +19,8 @@ constraints. Defines the same types as the `TriangulationFaceBase_2` concept -\cgalHasModelsBegin CGAL::Constrained_triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Constrained_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h index 0af956128561..892053e3bac0 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationTraits_2.h @@ -19,10 +19,12 @@ to compute the squared distance between a point and a line \cgalRefines{TriangulationTraits_2} -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_3 -\cgalHasModels CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Projection_traits_3} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd \sa `TriangulationTraits_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h index d223c281d3c0..f76e24c327a2 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/DelaunayTriangulationTraits_2.h @@ -22,12 +22,14 @@ required if the method `nearest_vertex()` is used. \cgalRefines{TriangulationTraits_2} -\cgalHasModelsBare{All models of the \cgal concept `Kernel`\n - `CGAL::Projection_traits_3` (not for dual Voronoi functions)\n - `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)\n - `CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)\n - `CGAL::Projection_traits_yz_3` (not for dual Voronoi functions)\n - `CGAL::Projection_traits_xz_3` (not for dual Voronoi functions)} +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsBare{`CGAL::Projection_traits_3` (not for dual Voronoi functions)} +\cgalHasModelsBare{`CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)} +\cgalHasModelsBare{`CGAL::Projection_traits_xy_3` (not for dual Voronoi functions)} +\cgalHasModelsBare{`CGAL::Projection_traits_yz_3` (not for dual Voronoi functions)} +\cgalHasModelsBare{`CGAL::Projection_traits_xz_3` (not for dual Voronoi functions)} +\cgalHasModelsEnd \sa `TriangulationTraits_2` */ diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h index 26c24a4e86ba..4ec205577472 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h @@ -34,7 +34,8 @@ in the face a list to store hidden vertices. \cgalRefines{TriangulationFaceBase_2} -\cgalHasModelsBegin CGAL::Regular_triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h index e935587ab864..71dc4f724682 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationTraits_2.h @@ -18,7 +18,9 @@ of Delaunay triangulations. \cgalRefines{TriangulationTraits_2} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Regular_triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h index af73baa96815..feee66c0b110 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h @@ -35,7 +35,8 @@ vertex of the triangulation or a hidden vertex. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h index 17ee831ec0be..9a364975955b 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h @@ -16,7 +16,8 @@ and only provided for symmetry with the vertex case. \cgalRefines{TriangulationDSFaceBase_2} -\cgalHasModelsBegin CGAL::Triangulation_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h index 497c1fadde72..83e3992d81ce 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h @@ -14,7 +14,8 @@ next and previous level triangulations. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Triangulation_hierarchy_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_hierarchy_vertex_base_2} \cgalHasModelsEnd \sa `CGAL::Triangulation_hierarchy_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h index f158bbeea8d6..0d810e92288c 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationTraits_2.h @@ -12,10 +12,12 @@ provides the types of the geometric primitives used in the triangulation and some function object types for the required predicates on those primitives. -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} CGAL::Projection_traits_3 -\cgalHasModels CGAL::Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{CGAL::Projection_traits_3} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd \sa `CGAL::Triangulation_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h index c5e59974834d..8cca35af421a 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_2} -\cgalHasModelsBegin CGAL::Triangulation_vertex_base_with_info_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_vertex_base_with_info_2} \cgalHasModelsEnd */ diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h index 816e93b382ac..9790b02cecc3 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h @@ -15,7 +15,8 @@ the vertex base of a triangulation stores a point. \cgalRefines{TriangulationDSVertexBase_2} -\cgalHasModelsBegin CGAL::Triangulation_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h index 4df0ce0f7527..b71b96cc4392 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h @@ -11,8 +11,9 @@ in the cell an operator that computes its circumcenter. \cgalRefines{TriangulationCellBase_3} -\cgalHasModelsBegin CGAL::Delaunay_triangulation_cell_base_3 -\cgalHasModels CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_triangulation_cell_base_3} +\cgalModels{CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h index b727b6013c9d..3493e4ef1faf 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h @@ -10,13 +10,14 @@ predicates and constructions on these objects. \cgalRefines{TriangulationTraits_3} -\cgalHasModelsBegin CGAL::Exact_predicates_inexact_constructions_kernel (recommended) -\cgalHasModels CGAL::Exact_predicates_exact_constructions_kernel (recommended for Voronoi) -\cgalHasModels CGAL::Filtered_kernel -\cgalHasModels CGAL::Cartesian -\cgalHasModels CGAL::Simple_cartesian -\cgalHasModels CGAL::Homogeneous -\cgalHasModels CGAL::Simple_homogeneous +\cgalHasModelsBegin +\cgalModels{CGAL::Exact_predicates_inexact_constructions_kernel (recommended)} +\cgalModels{CGAL::Exact_predicates_exact_constructions_kernel (recommended for Voronoi)} +\cgalModels{CGAL::Filtered_kernel} +\cgalModels{CGAL::Cartesian} +\cgalModels{CGAL::Simple_cartesian} +\cgalModels{CGAL::Homogeneous} +\cgalModels{CGAL::Simple_homogeneous} \cgalHasModelsEnd In addition to the requirements described for the traits class of diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h index 9c7764481069..cd00268b2b91 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h @@ -19,7 +19,8 @@ circumcenter by calling `invalidate_weighted_circumcenter_cache()`. \cgalRefines{RegularTriangulationCellBase_3} -\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3} \cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h index b7362aca63ff..b95816da2963 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h @@ -35,7 +35,8 @@ and an operator to compute its weighted circumcenter. \cgalRefines{TriangulationCellBase_3} -\cgalHasModelsBegin CGAL::Regular_triangulation_cell_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_cell_base_3} \cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h index 41cd3c59fbc1..cea91c4d670d 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationTraits_3.h @@ -15,7 +15,9 @@ or the weighted point \f$ {p}^{(w)}=(p,w_p)\f$. \cgalRefines{TriangulationTraits_3} +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Regular_triangulation_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h index aa5da85428da..09d9ce0a0fc0 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h @@ -9,7 +9,8 @@ by adding a geometric point member. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModelsBegin CGAL::Regular_triangulation_vertex_base_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Regular_triangulation_vertex_base_3} \cgalHasModelsEnd \sa `RegularTriangulationCellBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h index 4efba49955ac..84add9f98c93 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationCellBase_3} -\cgalHasModelsBegin CGAL::Triangulation_cell_base_with_info_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_cell_base_with_info_3} \cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h index 419ba6c4417a..8b26efc32c47 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h @@ -10,8 +10,9 @@ structure apply. \cgalRefines{TriangulationDSCellBase_3} -\cgalHasModelsBegin CGAL::Triangulation_cell_base_3 -\cgalHasModels CGAL::Triangulation_cell_base_with_info_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_cell_base_3} +\cgalModels{CGAL::Triangulation_cell_base_with_info_3} \cgalHasModelsEnd \sa `TriangulationVertexBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h index 96a428da0503..99f5fda17531 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationTraits_3.h @@ -11,7 +11,9 @@ triangles and tetrahedra) forming the triangulation together with a few geometric predicates and constructions on these objects: lexicographical comparison, orientation in case of coplanar points and orientation in space. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd \sa `CGAL::Triangulation_3` */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h index 2801c4580136..37e2fd97140c 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h @@ -8,7 +8,8 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_3} -\cgalHasModelsBegin CGAL::Triangulation_vertex_base_with_info_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_vertex_base_with_info_3} \cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h index 75d23eb5581a..5110b87d71f1 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h @@ -9,8 +9,9 @@ for the triangulation data structure. \cgalRefines{TriangulationDSVertexBase_3} -\cgalHasModelsBegin CGAL::Triangulation_vertex_base_3 -\cgalHasModels CGAL::Triangulation_vertex_base_with_info_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_vertex_base_3} +\cgalModels{CGAL::Triangulation_vertex_base_with_info_3} \cgalHasModelsEnd \sa `TriangulationCellBase_3` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h index d73727aaabc0..df1da8edad50 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h @@ -11,8 +11,9 @@ parameter of the class `CGAL::Delaunay_triangulation_on_sphere_2`. To the requirements listed within the concept `TriangulationOnSphereTraits_2`, this concept adds types and functors requirements related to build the dual on the sphere. -\cgalHasModelsBegin CGAL::Delaunay_triangulation_on_sphere_traits_2 -\cgalHasModels CGAL::Projection_on_sphere_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} +\cgalModels{CGAL::Projection_on_sphere_traits_3} \cgalHasModelsEnd */ class DelaunayTriangulationOnSphereTraits_2 diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h index 0d1fe175810c..5e49109a4da4 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h @@ -19,7 +19,8 @@ then the triangulation is not an orientable triangulated surface without boundar In this case, fictitious faces are added to the triangulation, called ghost faces, such that the triangulation is a topological sphere. -\cgalHasModelsBegin CGAL::Triangulation_on_sphere_face_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_on_sphere_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h index 4ccf99b9a261..ea94dfc395c4 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h @@ -13,8 +13,9 @@ triangulation and the function object types for the required predicates on those In particular, the traits class is expected to contain information about the sphere (center and radius) on which the points of the triangulation lie, as well as to provide means to change this information. -\cgalHasModelsBegin CGAL::Delaunay_triangulation_on_sphere_traits_2 -\cgalHasModels CGAL::Projection_on_sphere_traits_3 +\cgalHasModelsBegin +\cgalModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} +\cgalModels{CGAL::Projection_on_sphere_traits_3} \cgalHasModelsEnd \sa `DelaunayTriangulationOnSphereTraits_2` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h index 7701fde798b9..23f0fbce9e0c 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h @@ -9,7 +9,8 @@ of a triangulation data structure to be plugged in a triangulation on the sphere It refines the concept `TriangulationDSVertexBase_2`, adding geometric information: the vertex base of a triangulation stores a point. -\cgalHasModelsBegin CGAL::Triangulation_on_sphere_vertex_base_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Triangulation_on_sphere_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h index 3d656b13a16f..a39c04b2179b 100644 --- a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h +++ b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h @@ -6,9 +6,10 @@ A model of the `Visibility_2` concept can be attached to an `Arrangement_2` instance to answer visibility queries within the faces of this arrangement. -\cgalHasModelsBegin CGAL::Simple_polygon_visibility_2 -\cgalHasModels CGAL::Rotational_sweep_visibility_2 -\cgalHasModels CGAL::Triangular_expansion_visibility_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Simple_polygon_visibility_2} +\cgalModels{CGAL::Rotational_sweep_visibility_2} +\cgalModels{CGAL::Triangular_expansion_visibility_2} \cgalHasModelsEnd */ diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h index 916a678290fa..bec40a64a9f5 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h @@ -13,15 +13,16 @@ graph they take as an argument, the last ones does. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Identity_policy_2 -\cgalHasModels CGAL::Apollonius_graph_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Delaunay_triangulation_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Regular_triangulation_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Identity_policy_2} +\cgalModels{CGAL::Apollonius_graph_degeneracy_removal_policy_2} +\cgalModels{CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2} +\cgalModels{CGAL::Delaunay_triangulation_degeneracy_removal_policy_2} +\cgalModels{CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2} +\cgalModels{CGAL::Regular_triangulation_degeneracy_removal_policy_2} +\cgalModels{CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2} +\cgalModels{CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2} +\cgalModels{CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2} \cgalHasModelsEnd \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h index 941a0b9dfbe9..452c25d3e022 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h @@ -11,10 +11,11 @@ tag is provided for determining whether this functor is defined or not. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} -\cgalHasModelsBegin CGAL::Apollonius_graph_adaptation_traits_2 -\cgalHasModels CGAL::Delaunay_triangulation_adaptation_traits_2 -\cgalHasModels CGAL::Regular_triangulation_adaptation_traits_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_adaptation_traits_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Apollonius_graph_adaptation_traits_2} +\cgalModels{CGAL::Delaunay_triangulation_adaptation_traits_2} +\cgalModels{CGAL::Regular_triangulation_adaptation_traits_2} +\cgalModels{CGAL::Segment_Delaunay_graph_adaptation_traits_2} \cgalHasModelsEnd \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h index 01749c2be48b..2c302fd96a9a 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/DelaunayGraph_2.h @@ -18,12 +18,14 @@ iterators and circulators that allow to traverse it (completely or partially). All iterators and circulators must be convertible to the corresponding handles. -\cgalHasModelsBareBegin{ `CGAL::Triangulation_hierarchy_2` provided that `Tr` is a model of `DelaunayGraph_2`} CGAL::Delaunay_triangulation_2 -\cgalHasModels CGAL::Regular_triangulation_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_2 -\cgalHasModels CGAL::Segment_Delaunay_graph_hierarchy_2 -\cgalHasModels CGAL::Apollonius_graph_2 -\cgalHasModels CGAL::Apollonius_graph_hierarchy_2 +\cgalHasModelsBegin +\cgalHasModelsBare{ `CGAL::Triangulation_hierarchy_2` provided that `Tr` is a model of `DelaunayGraph_2`} +\cgalHasModels{CGAL::Delaunay_triangulation_2} +\cgalHasModels{CGAL::Regular_triangulation_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_hierarchy_2} +\cgalHasModels{CGAL::Apollonius_graph_2} +\cgalHasModels{CGAL::Apollonius_graph_hierarchy_2} \cgalHasModelsEnd \sa `AdaptationTraits_2` diff --git a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h index a6f6793d19c3..1bbfda65f44e 100644 --- a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h +++ b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_2.h @@ -5,9 +5,11 @@ A concept that describes the set of requirements of classes used in the computation of analytic weights in 2D. -\cgalHasModelsBareBegin{All models of the \cgal concept `Kernel`} sCGAL:Projection_traits_xy_3 -\cgalHasModels CGAL::Projection_traits_yz_3 -\cgalHasModels CGAL::Projection_traits_xz_3 +\cgalHasModelsBegin +\cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModels{sCGAL:Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd */ class AnalyticWeightTraits_2 { diff --git a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h index 5aab656b6128..488c87558c0e 100644 --- a/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h +++ b/Weights/doc/Weights/Concepts/AnalyticWeightTraits_3.h @@ -5,7 +5,9 @@ A concept that describes the set of requirements of classes used in the computation of analytic weights in 3D. +\cgalHasModelsBegin \cgalHasModelsBare{All models of the \cgal concept `Kernel`} +\cgalHasModelsEnd */ class AnalyticWeightTraits_3 { diff --git a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h index 95d700e8e512..76104f359294 100644 --- a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h +++ b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h @@ -5,9 +5,10 @@ A concept that describes the set of methods required in all classes used in the computation of 2D generalized barycentric weights. -\cgalHasModelsBegin CGAL::Weights::Wachspress_weights_2 -\cgalHasModels CGAL::Weights::Mean_value_weights_2 -\cgalHasModels CGAL::Weights::Discrete_harmonic_weights_2 +\cgalHasModelsBegin +\cgalModels{CGAL::Weights::Wachspress_weights_2} +\cgalModels{CGAL::Weights::Mean_value_weights_2} +\cgalModels{CGAL::Weights::Discrete_harmonic_weights_2} \cgalHasModelsEnd */ class BarycentricWeights_2 { From 894b2e2f9286e4cd04be41db40aeb9007c427eb2 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sat, 15 Jul 2023 13:20:03 +0200 Subject: [PATCH 0491/1398] issue #7395 Improvement of layout of model relations Correcting permissions --- Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h | 0 Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h mode change 100755 => 100644 Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h diff --git a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h old mode 100755 new mode 100644 diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h old mode 100755 new mode 100644 From e5ec58b9207368f5b29e1f7c7e75736b48331f2e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 17 Jul 2023 16:43:12 +0100 Subject: [PATCH 0492/1398] Enable to fix the coordinates of boundary vertices --- .../internal/parameters_interface.h | 1 + .../CGAL/Variational_shape_approximation.h | 43 +- .../Surface_mesh_approximation/CMakeLists.txt | 3 + .../Surface_mesh_approximation/data/patch.ply | 7242 +++++++++++++++++ .../vsa_border_test.cpp | 131 + 5 files changed, 7410 insertions(+), 10 deletions(-) create mode 100644 Surface_mesh_approximation/test/Surface_mesh_approximation/data/patch.ply create mode 100644 Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp 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 d88c06a5f5ea..7a4a174f19ab 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -227,6 +227,7 @@ CGAL_add_named_parameter(subdivision_ratio_t, subdivision_ratio, subdivision_rat CGAL_add_named_parameter(relative_to_chord_t, relative_to_chord, relative_to_chord) CGAL_add_named_parameter(with_dihedral_angle_t, with_dihedral_angle, with_dihedral_angle) CGAL_add_named_parameter(optimize_anchor_location_t, optimize_anchor_location, optimize_anchor_location) +CGAL_add_named_parameter(optimize_boundary_anchor_location_t, optimize_boundary_anchor_location, optimize_boundary_anchor_location) CGAL_add_named_parameter(pca_plane_t, pca_plane, pca_plane) // tetrahedral remeshing parameters diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index e7c4a2a8a318..d24ecb93ffa5 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -123,6 +123,7 @@ class Variational_shape_approximation { typedef typename Geom_traits::FT FT; typedef typename Geom_traits::Point_3 Point_3; typedef typename Geom_traits::Vector_3 Vector_3; + typedef typename Geom_traits::Segment_3 Segment_3; typedef typename Geom_traits::Plane_3 Plane_3; typedef typename Geom_traits::Construct_vector_3 Construct_vector_3; typedef typename Geom_traits::Construct_point_3 Construct_point_3; @@ -820,6 +821,12 @@ class Variational_shape_approximation { * \cgalParamDefault{`true`} * \cgalParamNEnd * + * \cgalParamNBegin{optimize_boundary_anchor_location} + * \cgalParamDescription{If `true`, optimize the anchor locations of boundary vertices} + * \cgalParamType{`Boolean`} + * \cgalParamDefault{`true`} + * \cgalParamNEnd + * * \cgalParamNBegin{pca_plane} * \cgalParamDescription{If `true`, use PCA plane fitting, otherwise use the default area averaged plane parameters} * \cgalParamType{`Boolean`} @@ -837,6 +844,7 @@ class Variational_shape_approximation { const bool relative_to_chord = choose_parameter(get_parameter(np, internal_np::relative_to_chord), false); const bool with_dihedral_angle = choose_parameter(get_parameter(np, internal_np::with_dihedral_angle), false); const bool optimize_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_anchor_location), true); + const bool optimize_boundary_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_boundary_anchor_location), true); const bool pca_plane = choose_parameter(get_parameter(np, internal_np::pca_plane), false); // compute averaged edge length, used in chord subdivision @@ -862,7 +870,7 @@ class Variational_shape_approximation { pseudo_cdt(); if (optimize_anchor_location) - this->optimize_anchor_location(); + this->optimize_anchor_location(optimize_boundary_anchor_location); // check manifold-oriented return Polygon_mesh_processing::is_polygon_soup_a_polygon_mesh(m_tris); @@ -1353,7 +1361,7 @@ class Variational_shape_approximation { const Proxy px = m_metric->fit_proxy(fvec, *m_ptm); const FT err = m_metric->compute_error(f, *m_ptm, px); - // original proxy map should always be falid + // original proxy map should always be valid const std::size_t prev_px_idx = get(m_fproxy_map, f); CGAL_assertion(prev_px_idx != CGAL_VSA_INVALID_TAG); // update the proxy error and proxy map @@ -1520,7 +1528,7 @@ class Variational_shape_approximation { /*! * @brief finds and approximates the chord connecting the anchors. - * @param subdivision_ratio boundary chord approximation recursive split creterion + * @param subdivision_ratio boundary chord approximation recursive split criterion * @param relative_to_chord set `true` if the subdivision_ratio is relative to the chord length (relative sense), * otherwise it's relative to the average edge length (absolute sense). * @param with_dihedral_angle if set to `true`, add dihedral angle weight to the distance. @@ -1845,8 +1853,8 @@ class Variational_shape_approximation { * @param chord_begin begin iterator of the chord * @param chord_end end iterator of the chord * @param subdivision_ratio the chord recursive split error threshold - * @param relative_to_chord set `true` if the subdivision_ratio is relative to the chord length (relative sense), - * otherwise it's relative to the average edge length (absolute sense). + * @param relative_to_chord set `true` if the `subdivision_ratio` is relative to the chord length (relative sense), + * otherwise it is relative to the average edge length (absolute sense). * @param with_dihedral_angle if set to `true` add dihedral angle weight to the distance. * @return the number of anchors of the chord apart from the first one */ @@ -1865,8 +1873,14 @@ class Variational_shape_approximation { bool is_boundary = is_border_edge(he_first, *m_ptm); + if(is_boundary && boundary_subdivision_ratio == 0){ + for (Boundary_chord_iterator citr = chord_begin; *citr != he_last; ++citr) { + attach_anchor(*citr); + } + } + // do not subdivide trivial non-circular chord - if ((anchor_first != anchor_last) && (chord_size < 4)) + if ((anchor_first != anchor_last) && (chord_size < 2)) return 1; bool if_subdivide = false; @@ -1895,11 +1909,13 @@ class Variational_shape_approximation { const FT chord_len = CGAL::approximate_sqrt(chord_vec.squared_length()); bool degenerate_chord = false; if (chord_len > FT(0.0)) { + Segment_3 seg(pt_begin, pt_end); chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); - vec = cross_product_functor(chord_vec, vec); - const FT dist = CGAL::approximate_sqrt(vec.squared_length()); + //Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); + //vec = cross_product_functor(chord_vec, vec); + //const FT dist = CGAL::approximate_sqrt(vec.squared_length()); + const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance(m_vpoint_map[target(*citr, *m_ptm)], seg)); if (dist > dist_max) { chord_max = citr; dist_max = dist; @@ -2007,9 +2023,15 @@ class Variational_shape_approximation { * @brief optimizes the anchor location by averaging the projection points of * the anchor vertex to the incident proxy plane. */ - void optimize_anchor_location() { + void optimize_anchor_location(bool optimize_boundary_anchor_location) { for(Anchor& a : m_anchors) { const vertex_descriptor v = a.vtx; + + if(! optimize_boundary_anchor_location && is_border(v,*m_ptm)){ + a.pos = m_vpoint_map[v]; + continue; + } + // incident proxy set std::set px_set; for(halfedge_descriptor h : halfedges_around_target(v, *m_ptm)) { @@ -2018,6 +2040,7 @@ class Variational_shape_approximation { } // projection + // todo: replace averaging by qem/svd ? Mael? FT sum_area(0.0); Vector_3 vec = CGAL::NULL_VECTOR; const Point_3 vtx_pt = m_vpoint_map[v]; diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt index 0c2696006689..565c4480010a 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/CMakeLists.txt @@ -15,6 +15,9 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() +create_single_source_cgal_program("vsa_border_test.cpp") +target_link_libraries(vsa_border_test PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("vsa_class_interface_test.cpp") target_link_libraries(vsa_class_interface_test PUBLIC CGAL::Eigen3_support) diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/data/patch.ply b/Surface_mesh_approximation/test/Surface_mesh_approximation/data/patch.ply new file mode 100644 index 000000000000..364b5f9aabbb --- /dev/null +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/data/patch.ply @@ -0,0 +1,7242 @@ +ply +format ascii 1.0 +comment Generated by the CGAL library +element vertex 2447 +property double x +property double y +property double z +property double nx +property double ny +property double nz +element face 4782 +property list uchar int vertex_indices +end_header +-0.75826000000000005 0.54113988888888898 0.36264583333333333 -0.75622976135463471 0.54684065776048973 0.35927961681897197 +-0.78766433333333341 0.51201688888888897 0.34165722222222228 -0.79001324215789526 0.50665328567126411 0.34522677377874855 +-0.77195166666666681 0.50529522222222223 0.38479933333333333 -0.77420418144639147 0.49978933334325654 0.38835358593326552 +-0.99941161111111121 3.4232277777777774e-20 0.021995049999999999 -0.99958446617462626 -2.0523682663206295e-15 0.028825249042943129 +-0.99882022222222233 0.040796122222222224 4.3368086899420177e-19 -0.99914193989515954 0.040847444046735917 0.0068461856084904736 +-0.99941161111111121 -3.4232277777777774e-20 -0.021995049999999999 -0.99958446617462626 2.0523682663206295e-15 -0.028825249042943129 +-0.80174361111111114 0.51750016666666665 0.29783744444444449 -0.79978164904250193 0.5231015439045873 0.29447256004506339 +-0.7732636111111113 0.54721044444444444 0.31926572222222216 -0.77115959471535744 0.55276167927063702 0.31585978757725908 +-0.81533755555555576 0.4819113888888889 0.3198327777777778 -0.81758917689195121 0.47647000112002424 0.32330214329915274 +-0.82846038888888895 0.48680316666666668 0.27564744444444444 -0.83086036960663368 0.48141377280591013 0.27912689868571872 +-0.81533755555555576 0.4819113888888889 -0.31983277777777774 -0.81758917689195076 0.47647000112002419 -0.3233021432991538 +-0.82846038888888895 0.48680316666666668 -0.27564744444444444 -0.8308603696066339 0.4814137728059108 -0.27912689868571705 +-0.80174361111111114 0.51750016666666665 -0.29783744444444449 -0.79978164904250193 0.52310154390458719 -0.29447256004506345 +-0.78766433333333341 0.51201688888888897 -0.34165722222222222 -0.7900132421578957 0.50665328567126289 -0.34522677377874939 +-0.99916700000000003 -0.040814099999999999 -6.1618700000000003e-19 -0.99916825377459861 -0.040777452703906501 1.2600130267877126e-15 +-0.93117244444444447 0.19398261111111118 -0.3076140555555556 -0.92938877700071298 0.19325624268883035 -0.3144654604991064 +-0.93226716666666665 0.15455455555555558 -0.32609811111111114 -0.93246959373151495 0.14840348705326067 -0.32935825752000836 +-0.94538383333333342 0.15677755555555556 -0.2846197777777778 -0.94569372795329421 0.15056734547377298 -0.28808479200884973 +-0.5612852777777777 0.77439555555555573 0.29087622222222226 -0.55808340102141651 0.77882581579776655 0.28630973813566335 +-0.57617288888888907 0.77771266666666694 0.25007472222222227 -0.57289159414568047 0.78195748497442719 0.24563736085882676 +-0.59849038888888884 0.75140127777777788 0.27666483333333336 -0.60078098363085097 0.7524378919901541 0.26999894148859221 +-0.75526788888888907 0.65450761111111122 -0.022994172222222223 -0.75133876107007358 0.65938852075399312 -0.026397818310375531 +-0.7795405555555559 0.62581566666666677 4.7704895589362195e-18 -0.7759503976758112 0.63078461022977483 0.003428679632378061 +-0.75526788888888907 0.65450761111111122 0.022994172222222223 -0.75133876107007358 0.65938852075399301 0.026397818310375489 +-0.74804966666666672 0.65319355555555558 0.1144236777777778 -0.7435687042883129 0.65820381141759288 0.11778507816507716 +-0.76921911111111108 0.62333266666666676 0.1381342888888889 -0.76481502020556891 0.62851062850378847 0.14153577189434507 +-0.74111677777777796 0.65159588888888886 0.15967583333333338 -0.7463954459564115 0.64681512694105325 0.15660150004313131 +-0.284632 0.945716 0.156864 -0.30545461554927217 0.93936774136294965 0.15583877670951099 +-0.32609811111111114 0.93226716666666665 0.15455455555555558 -0.32935825752000947 0.93246959373151428 0.14840348705326251 +-0.30765300000000001 0.93148799999999998 0.19411200000000001 -0.32162863465033936 0.92711583618108895 0.19238307533460075 +-0.71130488888888888 0.6788725000000001 0.18030416666666668 -0.70824252605277271 0.68351288304227864 0.1766427553159764 +-0.67984705555555558 0.70512544444444458 0.19986166666666666 -0.68162419148185194 0.70592110047367851 0.19251976909590959 +-0.68933433333333338 0.70698838888888893 0.15598661111111109 -0.69503727204225418 0.70247712477229041 0.15313092321186222 +-0.58315799999999995 0.74718649999999998 0.31775344444444448 -0.58012540746335661 0.751811250547471 0.31342360339598258 +-0.61224105555555552 0.75451727777777799 0.23497366666666666 -0.61433218032304737 0.75533943219617827 0.228162911949085 +-0.58949688888888896 0.77990294444444463 0.20883044444444449 -0.591506012150673 0.78052499673159581 0.20224086398834004 +-0.94538383333333342 0.15677755555555556 0.2846197777777778 -0.94569372795329287 0.15056734547377257 0.28808479200885445 +-0.93226716666666665 0.15455455555555558 0.32609811111111114 -0.93246959373151428 0.14840348705326251 0.32935825752000947 +-0.93117244444444447 0.19398261111111118 0.30761405555555554 -0.92938877700071298 0.19325624268883038 0.31446546049910601 +-0.60117361111111123 0.78098961111111131 0.16742283333333338 -0.59535801362678342 0.78518859080253556 0.17037521088438706 +-0.61107305555555569 0.78110516666666663 0.12596880555555556 -0.60556810884364143 0.78527442750862131 0.12896254903088239 +-0.63459266666666669 0.75765061111111098 0.15045633333333333 -0.62911940905975205 0.76199464803136552 0.15353476972941263 +-0.75140127777777788 0.27666483333333336 0.59849038888888884 -0.7524378919901541 0.26999894148859221 0.60078098363085097 +-0.74718649999999998 0.31775344444444448 0.58315799999999995 -0.751811250547471 0.31342360339598258 0.58012540746335661 +-0.77439555555555573 0.29087622222222226 0.5612852777777777 -0.77882581579776655 0.28630973813566341 0.55808340102141663 +-0.92968266666666677 0.35567749999999998 -0.092067066666666683 -0.93196779945019714 0.34965588491567462 -0.095795526679452389 +-0.94505249999999996 0.31850488888888884 -0.068722372222222231 -0.94487952639231221 0.31840610421006571 -0.07629045422861673 +-0.93279822222222231 0.3564471111111111 -0.046091599999999996 -0.9352783456551762 0.35038106966600985 -0.049875065596141063 +-0.77771266666666694 0.25007472222222227 0.57617288888888885 -0.78195748497442552 0.24563736085882876 0.5728915941456818 +-0.73072755555555569 0.68219300000000016 5.6378512969246231e-18 -0.72681013668366656 0.6868299749905763 -0.0034074430757136684 +-0.5612852777777777 0.7743955555555555 -0.29087622222222226 -0.55808340102141885 0.77882581579776478 -0.28630973813566368 +-0.58315800000000007 0.74718650000000009 -0.31775344444444453 -0.58012540746335517 0.75181125054747355 -0.31342360339597947 +-0.59849038888888895 0.75140127777777788 -0.27666483333333336 -0.60078098363085142 0.75243789199015432 -0.26999894148859066 +-0.57617288888888896 0.77771266666666694 -0.25007472222222227 -0.57289159414568036 0.78195748497442719 -0.24563736085882737 +-0.94356911111111119 0.19638261111111116 -0.26540377777777785 -0.94420750341940884 0.19027795367498715 -0.26882427500459549 +-0.94356911111111119 0.19638261111111113 0.26540377777777779 -0.94420750341940818 0.19027795367498926 0.2688242750045966 +-0.50936000000000003 0.71579222222222227 0.47696161111111113 -0.51277920220439133 0.71781220424093606 0.47095979576753355 +-0.46877138888888903 0.73594822222222223 0.48778372222222227 -0.47224458307062456 0.73804828671333833 0.48194375215366986 +-0.48942533333333338 0.74676500000000012 0.44956438888888894 -0.49266984128746649 0.74863058746933697 0.44365377378209919 +-0.37778600000000001 0.67791999999999997 0.63063599999999997 -0.40136180945431438 0.66376634383374467 0.63112830605602033 +-0.40173900000000001 0.69467100000000004 0.59668900000000002 -0.40171258809428867 0.69470270790359101 0.59667004633885057 +-0.41935794444444441 0.66016838888888907 0.62258750000000007 -0.4155867519106578 0.65774418987695715 0.62821989169354919 +-0.97496966666666673 0.2015737777777778 0.09000205 -0.97466028087315248 0.20147411345876459 0.097188057364433172 +-0.98414455555555547 0.16200311111111113 0.067180683333333324 -0.98399619015928708 0.16196416334314798 0.074290696218046348 +-0.98016833333333342 0.16149394444444445 0.11177085555555555 -0.97972447345757396 0.16136488341997382 0.11874902318393063 +-0.98016833333333331 0.16149394444444445 -0.11177085555555555 -0.97972447345757363 0.16136488341997368 -0.11874902318393306 +-0.98414455555555558 0.16200311111111113 -0.067180683333333338 -0.98399619015928652 0.16196416334315189 -0.074290696218046404 +-0.97496966666666673 0.2015737777777778 -0.09000205 -0.97466028087315248 0.20147411345876462 -0.097188057364433103 +-0.71579222222222227 0.47696161111111113 0.50936000000000003 -0.71781220424093606 0.47095979576753355 0.51277920220439133 +-0.73594822222222223 0.48778372222222227 0.46877138888888903 -0.73804828671333833 0.48194375215366986 0.47224458307062456 +-0.74676500000000012 0.44956438888888894 0.48942533333333338 -0.74863058746933697 0.44365377378209908 0.49266984128746644 +-0.67768672222222215 0.63041288888888891 0.37765505555555556 -0.67523547363985215 0.63580255343595515 0.37391465360785747 +-0.69442822222222234 0.59648461111111117 0.40159044444444447 -0.69213285028072336 0.60215091308302471 0.39795275528077639 +-0.66016838888888907 0.62258750000000007 0.41935794444444441 -0.65774418987695715 0.62821989169354919 0.4155867519106578 +-0.54506144444444449 0.76974894444444453 0.33124288888888898 -0.54190948364204006 0.77435972940169828 0.32665137535260158 +-0.56648211111111113 0.74160044444444451 0.35839366666666667 -0.56349687759284506 0.74644575354313181 0.35396328335088706 +-0.86174150000000005 0.49800805555555555 0.093204683333333357 -0.85921887787391815 0.50370123562967883 0.089599024158859564 +-0.85643122222222223 0.49636094444444451 0.13946366111111111 -0.85409111315639963 0.50205646360201817 0.13589583430958266 +-0.83918061111111109 0.53060388888888887 0.11635206111111114 -0.83660195728872988 0.5360652123901426 0.11283285481533098 +-0.54858188888888881 0.73454266666666679 0.39851677777777783 -0.54563674223181935 0.73959227525466842 0.3940606703418521 +-0.52952149999999998 0.72595138888888888 0.43806994444444453 -0.52661743606786326 0.73121205036954717 0.43359314273137761 +-0.50905750000000005 0.75598850000000006 0.41067372222222226 -0.5059964478844069 0.76101382125491979 0.4059871409137828 +-0.90825894444444466 0.34975538888888891 0.22812300000000002 -0.90998987808509801 0.34392612395842415 0.23158852096251026 +-0.89795138888888903 0.38766055555555556 0.20664461111111113 -0.90000506801376501 0.38184952843487757 0.21019470779160887 +-0.91736605555555562 0.35238222222222232 0.18320683333333337 -0.91928685361828566 0.34644372502988785 0.1867844376601222 +-0.47696161111111113 0.50936000000000003 0.71579222222222227 -0.4709597957675335 0.51277920220439122 0.71781220424093595 +-0.48796200000000001 0.46893600000000002 0.73620099999999999 -0.48795816122222951 0.46889694247011066 0.73622855842381074 +-0.44971800000000001 0.48959900000000001 0.74702500000000005 -0.46156499534407014 0.50616100802206843 0.72853194098207674 +-0.86615722222222247 0 0.49935283333333336 -0.86528710791410368 0.0058161984086357926 0.50124284804246111 +-0.87306355555555581 0.033121194444444439 0.485991888888889 -0.87575003239765592 0.028044417257714328 0.48194957352007262 +-0.88327516666666672 6.8184444444444446e-20 0.46833050000000009 -0.88229182417334762 -0.0059344385625642428 0.4706654007209512 +-0.63041288888888891 0.37765505555555556 0.67768672222222215 -0.63580255343595515 0.37391465360785747 0.67523547363985215 +-0.59648461111111117 0.40159044444444447 0.69442822222222234 -0.60215091308302471 0.39795275528077645 0.69213285028072336 +-0.62258750000000007 0.41935794444444441 0.66016838888888907 -0.62821989169354919 0.4155867519106578 0.65774418987695715 +-0.76974894444444453 0.33124288888888898 0.54506144444444449 -0.77435972940169828 0.32665137535260158 0.54190948364204006 +-0.74160044444444451 0.35839366666666667 0.56648211111111113 -0.74644575354313181 0.35396328335088706 0.56349687759284506 +-0.91736605555555562 0.35238222222222232 -0.18320683333333337 -0.91928685361828599 0.34644372502988552 -0.1867844376601244 +-0.89795138888888903 0.38766055555555556 -0.20664461111111113 -0.90000506801376357 0.3818495284348809 -0.21019470779160895 +-0.90825894444444466 0.34975538888888896 -0.22812300000000002 -0.90998987808509779 0.34392612395842459 -0.2315885209625107 +-0.73454266666666679 0.39851677777777783 0.54858188888888881 -0.73959227525466853 0.3940606703418521 0.54563674223181946 +-0.72595138888888888 0.43806994444444453 0.52952149999999998 -0.73121205036954706 0.43359314273137756 0.52661743606786326 +-0.75598850000000006 0.41067372222222226 0.50905750000000005 -0.76101382125491979 0.40598714091378285 0.5059964478844069 +-0.83918061111111109 0.53060388888888899 -0.11635206111111113 -0.83660195728873032 0.53606521239014215 -0.11283285481532941 +-0.85643122222222223 0.49636094444444451 -0.13946366111111108 -0.85409111315639796 0.5020564636020215 -0.13589583430958052 +-0.86174150000000005 0.49800805555555561 -0.093204683333333344 -0.85921887787391704 0.50370123562968006 -0.089599024158862728 +-0.66016838888888896 0.62258750000000007 -0.41935794444444441 -0.65774418987695826 0.6282198916935483 -0.41558675191065736 +-0.69442822222222234 0.59648461111111117 -0.40159044444444447 -0.69213285028072413 0.60215091308302537 -0.39795275528077395 +-0.67768672222222215 0.6304128888888888 -0.37765505555555556 -0.6752354736398527 0.6358025534359546 -0.37391465360785703 +-0.39497500000000002 0.64293699999999998 0.65622199999999997 -0.40546874587029513 0.64313488021939214 0.64959419791709827 +-0.438226 0.52970399999999995 0.72620399999999996 -0.44885899031823706 0.52953232505707337 0.71980630973209914 +-0.68793472222222229 0.36971155555555557 0.62399500000000008 -0.68945393975167257 0.36307230281365693 0.62676292798033717 +-0.71182900000000005 0.38485688888888897 0.58693700000000004 -0.71337613272082079 0.37843274998841775 0.58981619764168025 +-0.71834377777777791 0.34402016666666668 0.6041117222222222 -0.71971741204167938 0.33745518253232804 0.60673787304411819 +-0.78059327777777765 0.084315716666666679 0.61885927777777783 -0.78075466757073098 0.077163358696741069 0.620054808175177 +-0.75790999999999997 0.064948400000000003 0.64911799999999997 -0.773267268887874 0.070998529113733264 0.63009280247466304 +-0.758131 0.107887 0.64311600000000002 -0.76613576512856874 0.11369176635172877 0.63254262437774611 +-0.76982988888888892 0.58579227777777787 -0.25202805555555563 -0.76737501432410749 0.59109138934630023 -0.24848854466903775 +-0.78042783333333343 0.5893477222222222 -0.20715500000000001 -0.7778237708586162 0.59457880230514903 -0.20363258417222282 +-0.75165261111111115 0.61818911111111108 -0.22841961111111114 -0.74897430910137763 0.62329215032836771 -0.22482077227238875 +-0.48243316666666669 0.86490927777777793 0.13642550000000001 -0.48886245747926188 0.86183697576672835 0.1350945034729267 +-0.50608016666666666 0.84599500000000005 0.16607305555555557 -0.51265896621158669 0.84269657284665989 0.16444838240421003 +-0.46843350000000006 0.8657556666666667 0.17444783333333336 -0.46461967977246371 0.8692030998374678 0.16915828209422798 +-0.72114805555555561 0.64606572222222236 -0.24872233333333338 -0.71841774753894727 0.65102987947107616 -0.24502252153004503 +-0.68898294444444441 0.67292155555555566 -0.26795866666666662 -0.69113884282724725 0.6740463509068223 -0.26074626893708508 +-0.70832122222222216 0.64198 -0.29233105555555561 -0.70571237059887948 0.64705626737509536 -0.28859701459703097 +-0.64288133333333342 0.75794099999999998 0.10781466666666668 -0.64419850158019154 0.75821722222775967 0.10057303057508137 +-0.61885927777777783 0.78059327777777765 0.084315716666666679 -0.620054808175177 0.78075466757073086 0.077163358696741069 +-0.61992855555555559 0.72347883333333352 -0.30264644444444444 -0.62233405661673513 0.72465725446077855 -0.29592597981982743 +-0.60411172222222231 0.71834377777777791 -0.34402016666666668 -0.60673787304411997 0.71971741204167827 -0.33745518253232731 +-0.84349833333333335 0.53190250000000006 -0.0699548888888889 -0.84005222422363224 0.53749486054694662 -0.073563139292357874 +-0.62399500000000008 0.68793472222222229 -0.36971155555555552 -0.62676292798033872 0.68945393975167202 -0.36307230281365543 +-0.64271094444444454 0.65599627777777791 -0.3948356111111111 -0.6456309694623823 0.65766065101669202 -0.38812771013593611 +-0.65963700000000003 0.6629248333333333 -0.35315727777777778 -0.66230302078762193 0.66440626695153993 -0.3462932588011351 +-0.84349833333333335 0.53190250000000006 0.0699548888888889 -0.84005222422363046 0.53749486054694962 0.073563139292355778 +-0.48243316666666669 0.86490927777777793 -0.13642550000000001 -0.48886245747925988 0.86183697576672935 -0.13509450347292715 +-0.44500061111111117 0.88374388888888911 -0.1427423888888889 -0.44112116187999789 0.88691040801339915 -0.13712056264159139 +-0.46843350000000006 0.86575566666666681 -0.17444783333333336 -0.46461967977246255 0.86920309983746857 -0.16915828209422626 +-0.36061883333333339 0.93238900000000013 4.6784453566086847e-19 -0.36405373418237241 0.93135569614837044 -0.0064378474550659346 +-0.3801107777777778 0.92384822222222251 -0.037749188888888889 -0.38369927692104505 0.92239862108724591 -0.044222717087653116 +-0.39811761111111116 0.9170195000000001 6.8184444444444446e-20 -0.40146208978194359 0.91585374040706513 -0.0063337706228314035 +-0.38011077777777785 0.92384822222222251 0.037749188888888889 -0.3836992769210455 0.92239862108724568 0.044222717087653053 +-0.44500061111111117 0.88374388888888911 0.1427423888888889 -0.44112116187999745 0.88691040801339915 0.13712056264159253 +-0.64271094444444454 0.6559962777777778 0.3948356111111111 -0.64563096946238119 0.65766065101669124 0.38812771013593905 +-0.9170195000000001 6.8184444444444446e-20 0.39811761111111116 -0.91585374040706513 -0.0063337706228314035 0.40146208978194359 +-0.92384822222222251 0.037749188888888889 0.3801107777777778 -0.9223986210872458 0.044222717087652651 0.38369927692104522 +-0.93238900000000013 4.6784453566086847e-19 0.36061883333333339 -0.93135569614837044 -0.0064378474550659346 0.36405373418237241 +-0.8657556666666667 0.17444783333333336 0.46843350000000006 -0.8692030998374678 0.16915828209422798 0.46461967977246371 +-0.88374388888888911 0.1427423888888889 0.44500061111111117 -0.88691040801339915 0.13712056264159253 0.44112116187999745 +-0.86490927777777793 0.13642550000000001 0.48243316666666669 -0.86183697576672835 0.1350945034729267 0.48886245747926188 +-0.6559962777777778 0.3948356111111111 0.64271094444444454 -0.65766065101669136 0.38812771013593905 0.64563096946238119 +-0.84599500000000005 0.16607305555555557 0.50608016666666666 -0.84269657284665989 0.16444838240421003 0.51265896621158669 +-0.78110516666666663 0.12596880555555556 0.61107305555555569 -0.78527442750862131 0.12896254903088239 0.60556810884364143 +-0.4064782222222223 0.90131850000000013 -0.1476015 -0.40247103169275317 0.90439818266630434 -0.14170743042641382 +-0.38394200000000006 0.91612616666666669 -0.11263961111111111 -0.37990979769417682 0.91886656680883383 -0.10654941584502785 +-0.3668042222222222 0.91753444444444443 -0.15149372222222224 -0.37332295099127566 0.91536790224266062 -0.15076994994705148 +-0.64882261111111128 0.75777511111111118 0.064889444444444444 -0.64977268161939916 0.75795713656690133 0.057414644024313226 +-0.34437449999999997 0.93139666666666665 -0.11520171666666668 -0.34755386944931183 0.93129562037784253 -0.10906317112508719 +-0.326102 0.93259400000000003 -0.15467700000000001 -0.33904627376153867 0.93013909011883433 -0.14102800176320596 +-0.64288133333333342 0.75794099999999998 -0.10781466666666668 -0.64419850158019087 0.75821722222775967 -0.10057303057508492 +-0.64882261111111128 0.75777511111111118 -0.064889444444444444 -0.64977268161940149 0.75795713656689923 -0.057414644024313087 +-0.61885927777777783 0.78059327777777765 -0.084315716666666679 -0.62005480817517589 0.78075466757073186 -0.077163358696740084 +-0.61107305555555558 0.78110516666666663 -0.12596880555555559 -0.60556810884364132 0.78527442750862131 -0.12896254903088247 +-0.50608016666666666 0.84599500000000016 -0.16607305555555554 -0.51265896621159002 0.84269657284665833 -0.16444838240420778 +-0.96997316666666666 0.20078738888888892 -0.13468594444444443 -0.97109442398983969 0.19442173929857137 -0.1384767380608021 +-0.92673877777777802 0.31397677777777783 -0.20464033333333337 -0.92563509877677597 0.31343256958455351 -0.21203699732860798 +-0.92417300000000002 -0.037807500000000001 0.38009900000000002 -0.92435072542991981 -0.037682359749136002 0.3796785168546119 +-0.92673877777777802 0.31397677777777777 0.20464033333333337 -0.92563509877677597 0.3134325695845534 0.21203699732860795 +-0.96997316666666678 0.20078738888888892 0.13468594444444443 -0.97109442398983981 0.19442173929856951 0.13847673806080318 +-0.38442366666666661 0.81182961111111129 0.43869994444444455 -0.38774561949271991 0.81374584068554534 0.43297926201052844 +-0.40474005555555553 0.82153555555555569 0.40071994444444453 -0.40790672687203389 0.82320169950934685 0.39490639915993631 +-0.42688794444444444 0.79472077777777772 0.43068905555555559 -0.4301031812234084 0.79652791157639247 0.4249170973039974 +-0.99527699999999997 -0.040669700000000003 0.088143899999999997 -0.99528282312395366 -0.040659635914069105 0.088084595712009217 +-0.99446699999999999 -0.0813691 0.066442200000000007 -0.9962881829039385 -0.055094892576294616 0.066139318245466691 +-0.99054699999999996 -0.0811172 0.11062 -0.99240482996690904 -0.05487374096346978 0.11009780202631003 +-0.99492755555555568 0.04065623888888889 0.088165211111111114 -0.99464326804763692 0.040620881509268507 0.095051108951587859 +-0.99006766666666679 0.040503216666666675 0.13204949444444447 -0.98948701311988685 0.040438854590617142 0.13885297946563416 +-0.99020283333333337 0.081089350000000004 0.11059171666666666 -0.98977266867453773 0.080998057719492325 0.11742818652501494 +-0.85248605555555579 0.41357311111111106 0.31864050000000005 -0.85436606501290713 0.40787184350474653 0.32202358023970945 +-0.86546133333333342 0.41817277777777767 0.27461266666666667 -0.86749023845332152 0.41249033814465857 0.27805108725826738 +-0.87581005555555569 0.38057250000000004 0.29568288888888894 -0.87753026609894647 0.37486538870813074 0.29902603971730363 +-0.81182961111111129 0.43869994444444449 0.38442366666666661 -0.81374584068554534 0.43297926201052894 0.38774561949271963 +-0.82153555555555569 0.40071994444444453 0.40474005555555553 -0.82320169950934685 0.39490639915993631 0.40790672687203389 +-0.79472077777777772 0.43068905555555559 0.42688794444444444 -0.79652791157639247 0.4249170973039974 0.43010318122340846 +-0.75734050000000008 0.58135438888888902 0.29625844444444449 -0.75499804760571387 0.5867730154058064 0.29270356421324539 +-0.74305750000000004 0.57594661111111112 0.33978666666666668 -0.74080593120528204 0.58149597524355834 0.33625734648720751 +-0.72637127777777788 0.60962966666666674 0.3162962222222222 -0.7239594587653938 0.61490789988900629 0.3126835088683283 +-0.79799688888888887 0.55622755555555559 0.23047522222222222 -0.79562365876447649 0.56166610731031885 0.22696734900223225 +-0.78042783333333343 0.5893477222222222 0.20715500000000001 -0.77782377085861565 0.59457880230515014 0.20363258417222183 +-0.80746050000000003 0.55951377777777778 0.18509111111111115 -0.80496185827090283 0.564848097364122 0.18161231685429893 +-0.81182961111111129 0.43869994444444449 -0.38442366666666661 -0.81374584068554534 0.43297926201052889 -0.38774561949271963 +-0.78411972222222215 0.46844483333333348 -0.40622622222222227 -0.78616289348646995 0.46275805394282821 -0.40963750855607428 +-0.79472077777777772 0.43068905555555559 -0.42688794444444444 -0.79652791157639247 0.42491709730399746 -0.43010318122340835 +-0.85248605555555579 0.41357311111111106 -0.31864050000000005 -0.85436606501290757 0.40787184350474476 -0.32202358023971051 +-0.86203900000000011 0.37568711111111114 -0.33920450000000008 -0.86363598405927289 0.36991552503825786 -0.34248414762385898 +-0.87581005555555569 0.38057250000000004 -0.29568288888888894 -0.87753026609894536 0.37486538870813008 -0.29902603971730735 +-0.79799688888888887 0.55622755555555559 -0.23047522222222222 -0.79562365876447716 0.56166610731031941 -0.22696734900222931 +-0.82439899999999999 0.52567461111111113 -0.20817311111111111 -0.82213680993551586 0.53122525675781385 -0.20467240246708424 +-0.80746050000000014 0.55951377777777789 -0.18509111111111115 -0.80496185827090005 0.56484809736412722 -0.18161231685429535 +-0.75734050000000008 0.58135438888888902 -0.29625844444444444 -0.75499804760571654 0.58677301540580296 -0.29270356421324539 +-0.73992438888888878 0.61438050000000011 -0.27269055555555555 -0.7373851635856109 0.61957725465031477 -0.26904859420521215 +-0.72637127777777788 0.60962966666666674 -0.31629622222222226 -0.72395945876539358 0.61490789988900663 -0.31268350886832808 +-0.99492755555555568 0.04065623888888889 -0.088165211111111114 -0.99464326804763692 0.040620881509270568 -0.095051108951586624 +-0.99411955555555553 0.081341644444444444 -0.066439672222222232 -0.9939826873272527 0.081323487946983117 -0.073381929668208432 +-0.99020283333333337 0.081089350000000004 -0.11059171666666667 -0.98977266867453773 0.080998057719492339 -0.11742818652501491 +-0.91074705555555568 0.26913238888888896 -0.31214399999999998 -0.90890151067891412 0.26821257009591476 -0.3193118556022182 +-0.92338244444444451 0.27248327777777775 -0.26913955555555558 -0.92184936072310708 0.27174562074120029 -0.27631155195246321 +-0.904893611111111 0.30796461111111118 -0.29264711111111108 -0.9031732541248243 0.30710578259799209 -0.29994017958328018 +-0.89979483333333332 0.22554461111111115 -0.37261611111111104 -0.89751437565627668 0.22449112923450024 -0.37956775203557902 +-0.880473888888889 0.25920594444444445 -0.39612783333333335 -0.87799809680948748 0.25797190334318099 -0.40319950283254852 +-0.88349500000000003 0.22000400000000001 -0.41356399999999999 -0.88533382153477225 0.23437433605922856 -0.4015628158127092 +-0.89642250000000001 0.26474783333333335 -0.35449605555555552 -0.89426493531171236 0.26368231627218103 -0.36161009603891953 +-0.89129144444444464 0.30374238888888888 -0.33565233333333344 -0.8892663730069581 0.30269216918684994 -0.34290343910787618 +-0.87603155555555556 0.29838466666666674 -0.37797294444444451 -0.87886765169052439 0.3000127490976619 -0.37092317424346305 +-0.5057854444444444 0.79106966666666656 0.34309711111111119 -0.50254310485627729 0.79565803923597878 0.33819921992897944 +-0.52762177777777775 0.76363150000000002 0.37121527777777791 -0.52452973876924802 0.76844646073764278 0.36654957390025034 +-0.48765905555555555 0.78436955555555554 0.38245261111111117 -0.48444028196230066 0.78914488875012312 0.3775817233021781 +-0.50003249999999999 0.82104761111111113 0.27421316666666667 -0.49656662413084585 0.82520664647669439 0.26917573889558338 +-0.46030505555555562 0.84081005555555555 0.28371927777777783 -0.45672953304210201 0.84491246075498017 0.27842605357277111 +-0.47681055555555563 0.84404622222222236 0.2441187222222222 -0.47005080436070795 0.8475535991229256 0.24638412678909866 +-0.72557644444444458 0.68165338888888904 -0.090725516666666672 -0.72105509486109332 0.6864659302599132 -0.094042951714903678 +-0.70192883333333345 0.70862072222222239 -0.067195216666666668 -0.69751095274066943 0.71309750342112921 -0.070501215743817208 +-0.69672588888888898 0.70813105555555556 -0.11171258333333335 -0.69195648437214297 0.71271269042737062 -0.11505148690531221 +-0.77491783333333331 0.62473655555555563 -0.092368477777777791 -0.77075970402626304 0.62988728399471605 -0.095767886637991601 +-0.76921911111111108 0.62333266666666665 -0.1381342888888889 -0.76481502020556702 0.62851062850379158 -0.14153577189434138 +-0.79562366666666662 0.59403655555555568 -0.11584435555555558 -0.79155085388212953 0.59934077256701879 -0.11932260497173411 +-0.98331377777777784 0.040291861111111112 0.17546994444444444 -0.98244224734962893 0.040209691007927671 0.18218235746541839 +-0.97666327777777773 0.080235722222222222 0.19751805555555557 -0.97674161450646324 0.073679922287240324 0.20136307393127884 +-0.98436877777777798 0.080723238888888896 0.1543238333333333 -0.983642780484002 0.080574270691352937 0.16110452291682575 +-0.37261611111111104 0.89979483333333332 -0.22554461111111115 -0.37956775203557896 0.89751437565627668 -0.22449112923450021 +-0.39622099999999999 0.88076600000000005 -0.25934699999999999 -0.40223368750987282 0.88179261970450562 -0.24627187510325857 +-0.41344566666666671 0.8832078333333333 -0.21991544444444447 -0.41723471972029164 0.88019420978770013 -0.22621525526837433 +-0.95679477777777788 0.15844944444444448 0.24241494444444445 -0.957253922897494 0.15217835599473808 0.24598104614806704 +-0.95421688888888889 0.19824288888888891 0.22246183333333336 -0.95499795117042818 0.19203700464703574 0.22605464407191181 +-0.37261611111111104 0.89979483333333343 0.22554461111111115 -0.37956775203558119 0.8975143756562759 0.22449112923449988 +-0.38997550000000003 0.9014186666666667 0.18635077777777784 -0.39662205137890139 0.89905867934786887 0.18543041673160823 +-0.41344566666666666 0.8832078333333333 0.21991544444444447 -0.41723471972029319 0.88019420978770058 0.22621525526836977 +-0.96303733333333352 0.19968938888888893 0.17887027777777781 -0.96398392948964662 0.19340360573393062 0.18256513625228218 +-0.97425194444444441 0.16074688888888888 0.15589966666666666 -0.97502829927251367 0.15431448972348011 0.15970865311288363 +-0.31221199999999999 0.91105000000000003 0.26928099999999999 -0.32644642938062607 0.90667395833593711 0.26716111622031236 +-0.33565233333333339 0.89129144444444464 0.30374238888888888 -0.34290343910787563 0.88926637300695821 0.30269216918685032 +-0.29273399999999999 0.90520199999999995 0.30808400000000002 -0.31787609208756495 0.89960107400996148 0.29945399933756389 +-0.95535638888888885 0.27982527777777777 0.091030027777777786 -0.95716518902486225 0.27355642833602034 0.094877191331949579 +-0.96771327777777782 0.24127177777777781 0.067924161111111117 -0.96755210126393731 0.24120310120227606 0.075259519731021504 +-0.96367061111111119 0.24053788888888891 0.11303783333333334 -0.96513735744308149 0.23420596052008855 0.11686509027356488 +-0.64682927777777766 0.73032194444444454 0.21814144444444444 -0.64874952367319583 0.73115312556584411 0.2110430347324887 +-0.624302388888889 0.7565968333333335 0.19279794444444445 -0.62615345904453856 0.75720239315206705 0.18594725470235343 +-0.65756433333333342 0.73233366666666677 0.17507683333333332 -0.66362446493949456 0.72791769497020165 0.17244824986945503 +-0.65524111111111105 0.698701388888889 0.28600988888888895 -0.65750678879361879 0.6998853090603091 0.27900784371027831 +-0.68898294444444441 0.67292155555555566 0.26795866666666662 -0.69113884282724714 0.6740463509068223 0.2607462689370853 +-0.67509966666666676 0.66852522222222233 0.31085699999999999 -0.67752075050682159 0.6698155557091281 0.30383013998407898 +-0.94321855555555578 0.27717322222222224 -0.18115188888888892 -0.94228341902634183 0.27673948951092475 -0.188460110297273 +-0.9496837222222223 0.23785461111111114 -0.20207944444444448 -0.9486123289692856 0.23743102670925037 -0.20919167498554797 +-0.95764555555555553 0.23940283333333337 -0.15780855555555556 -0.95893043882721785 0.23316254644213033 -0.16151668776711828 +-0.96783372222222241 0.11967674444444446 0.21977572222222225 -0.96809524945160674 0.11324714670983058 0.2235322610973938 +-0.96644272222222227 0.15975088888888891 0.19946677777777783 -0.96704939341641916 0.15340151281042119 0.20318328317164736 +-0.97648983333333361 0.12052398888888888 0.17680266666666669 -0.97692227895306438 0.11401913169306778 0.18061699392114211 +-0.96303733333333341 0.19968938888888893 -0.17887027777777781 -0.96398392948964651 0.19340360573393262 -0.18256513625228082 +-0.95586661111111115 0.07874741111111111 0.28189122222222224 -0.95564244532252396 0.072305702707574748 0.28551602766561218 +-0.96433138888888892 0.039663483333333339 0.2604433333333333 -0.96389875161482486 0.033073058984768144 0.26420705782543358 +-0.95224977777777786 0.039161361111111119 0.30173377777777782 -0.95413490889433772 0.032630324035701881 0.29759340984389904 +-0.9764898333333335 0.12052398888888889 -0.17680266666666669 -0.97692227895306427 0.1140191316930719 -0.1806169939211397 +-0.98330661111111117 0.12116736666666666 -0.13317721111111111 -0.98272289727136297 0.12101573129925847 -0.14003892300601276 +-0.97425194444444441 0.16074688888888891 -0.15589966666666666 -0.97502829927251478 0.15431448972347411 -0.15970865311288251 +-0.73032194444444454 0.21814144444444444 0.64682927777777766 -0.73115312556584411 0.21104303473248867 0.64874952367319594 +-0.7565968333333335 0.19279794444444445 0.624302388888889 -0.75720239315206705 0.18594725470235343 0.62615345904453856 +-0.73233366666666688 0.17507683333333332 0.65756433333333342 -0.72791769497020065 0.17244824986945431 0.66362446493949578 +-0.698701388888889 0.28600988888888895 0.65524111111111105 -0.6998853090603091 0.27900784371027831 0.65750678879361879 +-0.67292155555555566 0.26795866666666662 0.68898294444444441 -0.6740463509068223 0.2607462689370853 0.69113884282724714 +-0.66852522222222233 0.31085699999999999 0.67509966666666676 -0.6698155557091281 0.30383013998407898 0.67752075050682159 +-0.79106966666666656 0.34309711111111119 0.5057854444444444 -0.79565803923597878 0.33819921992897944 0.50254310485627729 +-0.76363150000000002 0.37121527777777791 0.52762177777777775 -0.76844646073764267 0.36654957390025034 0.52452973876924791 +-0.78436955555555554 0.38245261111111117 0.48765905555555555 -0.78914488875012312 0.37758172330217804 0.4844402819623006 +-0.82104761111111113 0.27421316666666667 0.50003249999999999 -0.82520664647669439 0.26917573889558338 0.49656662413084585 +-0.84081005555555555 0.28371927777777783 0.46030505555555562 -0.84491246075498005 0.27842605357277106 0.45672953304210206 +-0.84404622222222236 0.2441187222222222 0.47681055555555563 -0.8475535991229256 0.2463841267890986 0.4700508043607079 +-0.77491783333333342 0.62473655555555563 0.092368477777777805 -0.77075970402626226 0.62988728399471738 0.095767886637989297 +-0.80010511111111116 0.59522733333333333 0.069672705555555561 -0.79627330233989702 0.60049897379372186 0.073142398466292349 +-0.79562366666666673 0.59403655555555568 0.11584435555555558 -0.79155085388212976 0.59934077256701879 0.11932260497173314 +-0.72557644444444447 0.68165338888888904 0.090725516666666672 -0.72105509486109276 0.68646593025991431 0.094042951714899278 +-0.71951088888888892 0.6806121666666668 0.1356845388888889 -0.71470545688293907 0.68547533361676682 0.13899524058301874 +-0.69672588888888898 0.70813105555555556 0.11171258333333335 -0.69195648437214397 0.71271269042736951 0.11505148690531325 +-0.78656727777777768 0.55215255555555565 0.2752216111111111 -0.78432765572944318 0.55767059215724202 0.27172346071133968 +-0.50003249999999999 0.82104761111111102 -0.27421316666666667 -0.49656662413084851 0.82520664647669129 -0.26917573889558782 +-0.51557805555555547 0.82379161111111121 -0.23432688888888892 -0.51207498812294594 0.82770762440957035 -0.22951970510862521 +-0.47681055555555563 0.84404622222222236 -0.2441187222222222 -0.47005080436070662 0.84755359912292727 -0.24638412678909538 +-0.65524111111111105 0.69870138888888889 -0.28600988888888895 -0.65750678879361957 0.69988530906030799 -0.27900784371027976 +-0.64035427777777787 0.69395927777777788 -0.32815500000000003 -0.64287001300191338 0.69530483951625921 -0.32135545199698878 +-0.67509966666666676 0.66852522222222233 -0.31085699999999999 -0.67752075050682214 0.66981555570912832 -0.30383013998407749 +-0.64682927777777777 0.73032194444444454 -0.21814144444444444 -0.64874952367319727 0.73115312556584311 -0.21104303473248823 +-0.67984705555555558 0.70512544444444458 -0.19986166666666666 -0.68162419148185194 0.70592110047367851 -0.19251976909590984 +-0.65756433333333331 0.73233366666666677 -0.17507683333333332 -0.66362446493949456 0.72791769497020165 -0.17244824986945492 +-0.99819400000000003 -0.0407719 0.044118600000000001 -0.99819601042639627 -0.040749912700656421 0.044092736178590025 +-0.99747061111111113 4.3368086899420177e-19 0.066027105555555562 -0.99733709501384338 0 0.072929547573996431 +-0.95620099999999997 -0.078785400000000005 0.28190999999999999 -0.95817725084869765 -0.053265830875932035 0.28117451381149139 +-0.94326100000000002 -0.077663399999999994 0.32284400000000002 -0.94534774934638066 -0.052625365478896312 0.32178906711376221 +-0.95256300000000005 -0.0391817 0.30181000000000002 -0.95266087931704746 -0.039145135259636005 0.30150440694022168 +-0.96783372222222241 0.11967674444444446 -0.21977572222222225 -0.9680952494516063 0.11324714670983051 -0.22353226109739607 +-0.97666327777777784 0.080235722222222236 -0.19751805555555557 -0.97674161450646313 0.073679922287236382 -0.20136307393128111 +-0.89979483333333343 0.22554461111111115 0.37261611111111104 -0.8975143756562759 0.22449112923449988 0.37956775203558119 +-0.9014186666666667 0.18635077777777784 0.38997550000000003 -0.89905867934786887 0.18543041673160823 0.39662205137890139 +-0.8832078333333333 0.21991544444444447 0.41344566666666666 -0.88019420978770058 0.2262152552683698 0.41723471972029325 +-0.91074705555555568 0.26913238888888891 0.31214400000000003 -0.90890151067891423 0.26821257009591437 0.31931185560221842 +-0.89129144444444464 0.30374238888888888 0.33565233333333339 -0.88926637300695821 0.30269216918685032 0.34290343910787563 +-0.90489361111111111 0.30796461111111118 0.29264711111111108 -0.90317325412482385 0.30710578259799148 0.29994017958328173 +-0.93984338888888896 0.23587238888888892 -0.2457178888888889 -0.93848222466552245 0.23528226001218033 -0.2527713830923361 +-0.93423205555555544 0.27510183333333332 -0.22547750000000003 -0.93299691132387008 0.27452654359661416 -0.23270569464672533 +-0.56711966666666669 0.66111644444444462 0.49050405555555554 -0.56452772540213347 0.6668985735573979 0.48636893387571661 +-0.58730288888888893 0.67152450000000008 0.45102994444444444 -0.59056908713658951 0.67344595022976195 0.44463322574655667 +-0.60485722222222216 0.63779350000000001 0.4760900555555555 -0.60826718780552425 0.6398682649724019 0.46965905902086796 +-0.50647611111111113 0.67072122222222219 0.54121055555555564 -0.51023515849226175 0.67307634610093736 0.53537679755270284 +-0.52353366666666667 0.6358801111111112 0.56644616666666658 -0.52745385244712384 0.63835601474096837 0.56061932894140942 +-0.4838222777777777 0.65672061111111113 0.57786500000000007 -0.48025504911159195 0.65454711840138768 0.58388625398724892 +-0.95027572222222223 0.27875183333333337 0.13627303888888889 -0.95190385015274304 0.2725334103925558 0.1400164286224547 +-0.94094172222222217 0.31756222222222219 0.11435316111111113 -0.94045905207604241 0.31729857015080781 0.12189499066198242 +-0.96973972222222227 0.24163083333333338 0.022653605555555557 -0.96989002921873224 0.24169057243838762 0.029983302294629699 +-0.95944188888888882 0.28064922222222222 -8.6736173798840355e-19 -0.95974596445858973 0.28077100056951243 0.0074383428696254261 +-0.96973972222222227 0.24163083333333335 -0.022653605555555557 -0.96989002921873124 0.24169057243839118 -0.029983302294631926 +-0.96644272222222238 0.15975088888888891 -0.19946677777777783 -0.96704939341641927 0.15340151281041914 -0.2031832831716486 +-0.99006766666666668 0.040503216666666675 -0.13204949444444447 -0.98948701311988696 0.04043885459061921 -0.1388529794656328 +-0.66111644444444462 0.49050405555555554 0.56711966666666669 -0.6668985735573979 0.48636893387571667 0.56452772540213347 +-0.67152450000000008 0.45102994444444444 0.58730288888888893 -0.67344595022976195 0.44463322574655667 0.59056908713658951 +-0.63779350000000001 0.4760900555555555 0.60485722222222216 -0.6398682649724019 0.46965905902086791 0.60826718780552425 +-0.67072122222222219 0.54121055555555564 0.50647611111111113 -0.67307634610093725 0.53537679755270273 0.51023515849226175 +-0.6358801111111112 0.56644616666666658 0.52353366666666667 -0.63835601474096826 0.56061932894140942 0.52745385244712384 +-0.65672061111111113 0.57786500000000007 0.4838222777777777 -0.65454711840138768 0.58388625398724892 0.48025504911159195 +-0.64035427777777787 0.69395927777777788 0.32815499999999997 -0.64287001300191315 0.6953048395162591 0.32135545199698912 +-0.73992438888888878 0.61438050000000011 0.27269055555555555 -0.7373851635856099 0.6195772546503151 0.26904859420521371 +-0.80235455555555568 0.59582316666666668 -0.023256572222222223 -0.79877755276154783 0.60103244931884436 -0.026728562813277134 +-0.8247917777777779 0.56482677777777779 3.4694469519536142e-18 -0.82151047318435655 0.57018244527269668 -0.0035385804022389994 +-0.80235455555555568 0.59582316666666668 0.023256572222222223 -0.79877755276154783 0.60103244931884436 0.026728562813277141 +-0.88468250000000004 0.46485238888888897 0.023322827777777777 -0.88182388447972637 0.47080328419964923 0.027035242701159701 +-0.86605422222222228 0.49924655555555564 0 -0.86311060816384377 0.50500169952881668 0.0036553451337094441 +-0.88468250000000004 0.46485238888888897 -0.023322827777777777 -0.88182388447972548 0.47080328419965073 -0.027035242701160731 +-0.82368444444444444 0.56451983333333344 0.046607672222222223 -0.82016277944795324 0.56992861274242324 0.050143709333325626 +-0.89835083333333332 0.42852916666666674 0.092856011111111122 -0.89623954506098191 0.4345120044881825 0.089185177157113285 +-0.91652922222222222 0.3929955 0.069433894444444436 -0.91913774448605823 0.38708765318025906 0.073136553217121647 +-0.91235211111111114 0.39187466666666665 0.11550940000000001 -0.91477173011535795 0.38599423501553781 0.11916850387801492 +-0.81494088888888883 0.56195327777777782 0.13924307777777778 -0.81227206434124521 0.56726128730849124 0.13575244164259204 +-0.82038388888888891 0.56357805555555562 0.093063277777777786 -0.81661364964159788 0.56904227675642394 0.096607631597587007 +-0.92338244444444451 0.27248327777777781 0.26913955555555563 -0.92184936072310664 0.27174562074120051 0.27631155195246443 +-0.86203900000000011 0.37568711111111114 0.33920450000000002 -0.86363598405927311 0.36991552503825798 0.34248414762385859 +-0.49050405555555554 0.56711966666666669 0.66111644444444451 -0.48636893387571756 0.56452772540213403 0.66689857355739679 +-0.45102994444444444 0.58730288888888893 0.67152450000000008 -0.44463322574655667 0.59056908713658951 0.67344595022976195 +-0.4760900555555555 0.60485722222222216 0.63779350000000001 -0.46965905902086791 0.60826718780552425 0.6398682649724019 +-0.54121055555555564 0.50647611111111113 0.67072122222222219 -0.53537679755270284 0.51023515849226175 0.67307634610093725 +-0.56644616666666658 0.52353366666666667 0.6358801111111112 -0.56061932894140942 0.52745385244712384 0.63835601474096826 +-0.57786500000000007 0.4838222777777777 0.65672061111111113 -0.58388625398724892 0.48025504911159195 0.65454711840138768 +-0.69395927777777788 0.32815499999999997 0.64035427777777787 -0.6953048395162591 0.32135545199698912 0.64287001300191315 +-0.94094172222222217 0.31756222222222225 -0.11435316111111113 -0.94045905207604263 0.31729857015080559 -0.12189499066198595 +-0.95027572222222234 0.27875183333333331 -0.13627303888888889 -0.95190385015274481 0.27253341039255036 -0.14001642862245339 +-0.95535638888888885 0.27982527777777777 -0.091030027777777786 -0.95716518902486247 0.27355642833602062 -0.0948771913319474 +-0.91235211111111125 0.39187466666666665 -0.11550940000000001 -0.91477173011535851 0.38599423501553598 -0.1191685038780165 +-0.91652922222222233 0.3929955 -0.069433894444444436 -0.91913774448605945 0.38708765318025523 -0.073136553217128294 +-0.89835083333333332 0.42852916666666674 -0.092856011111111122 -0.89623954506098191 0.43451200448818261 -0.089185177157113285 +-0.80010511111111116 0.59522733333333344 -0.069672705555555561 -0.79627330233989702 0.60049897379372186 -0.073142398466292322 +-0.4358711111111111 0.62442638888888902 0.64761527777777772 -0.42928358067523403 0.62760205669194258 0.64948538536189837 +-0.82153555555555557 0.40071994444444453 -0.40474005555555553 -0.82320169950934585 0.39490639915993836 -0.40790672687203405 +-0.99041400000000002 -0.040517699999999997 0.132054 -0.99042909148993497 -0.04051431091004682 0.13194243192357052 +-0.56133844444444447 0.42479211111111115 0.70975300000000008 -0.56719427102722186 0.42132562890847369 0.70765484053935324 +-0.53398199999999996 0.40546199999999999 0.74193200000000004 -0.53397837221050581 0.40543538767229781 0.74194962391959751 +-0.52507777777777787 0.44720294444444453 0.72360344444444447 -0.51941111443434562 0.45085647129555212 0.72590669957852993 +-0.46609872222222221 0.69092183333333346 0.5519736111111111 -0.46989818633218622 0.69334219789485718 0.54632617647340553 +-0.49740499999999999 0.42735899999999999 0.75495199999999996 -0.51763609454963999 0.43389420237286375 0.73742029722988534 +-0.5153523333333333 0.58407477777777783 0.62654744444444443 -0.50911507635325803 0.58771939724963429 0.62879865547434399 +-0.82239377777777778 0.077432127777777776 0.56315938888888883 -0.82613650039064546 0.080398337452212434 0.55770475168965261 +-0.82425750000000009 0.11595597777777779 0.55371011111111113 -0.82053882523414667 0.11428260274874391 0.56004957190621907 +-0.84287483333333346 0.090090038888888904 0.5300206111111111 -0.83941259596801754 0.088609226336890029 0.53622280699184321 +-0.47306938888888894 0.87807233333333345 0.068336577777777782 -0.46908926454127209 0.88090318231058062 0.062967017455332425 +-0.43775477777777783 0.89592177777777793 0.071664577777777794 -0.43362364391765301 0.8986751481339238 0.065981160660045099 +-0.45258822222222228 0.89073005555555573 0.035197772222222222 -0.45581496567353391 0.88910748916776128 0.041479992452199257 +-0.53002061111111121 0.84287483333333346 0.09009003888888889 -0.53622280699184433 0.83941259596801687 0.088609226336889613 +-0.53958305555555564 0.83994238888888895 0.053591199999999999 -0.53429480758391557 0.84339957803099685 0.056623408286707637 +-0.56315938888888883 0.82239377777777778 0.077432127777777776 -0.55770475168965272 0.82613650039064557 0.080398337452212448 +-0.70192883333333345 0.70862072222222239 0.067195216666666668 -0.69751095274066921 0.7130975034211291 0.070501215743818985 +-0.8931122777777778 0.42701350000000005 -0.13894826111111114 -0.89564957242998078 0.42129340791696046 -0.14256124245988541 +-0.90257966666666678 0.42970011111111112 8.6736173798840355e-19 -0.90005851818586091 0.43575291050450649 0.0037503103770103233 +-0.82439899999999999 0.52567461111111113 0.20817311111111114 -0.82213680993551475 0.53122525675781596 0.20467240246708407 +-0.5300206111111111 0.84287483333333346 -0.09009003888888889 -0.53622280699184521 0.8394125959680161 -0.088609226336890765 +-0.55371011111111124 0.82425750000000009 -0.11595597777777779 -0.56004957190622195 0.82053882523414523 -0.11428260274874001 +-0.56315938888888895 0.82239377777777778 -0.077432127777777776 -0.55770475168965028 0.82613650039064712 -0.080398337452213448 +-0.47306938888888894 0.87807233333333345 -0.068336577777777782 -0.46908926454127453 0.88090318231057907 -0.062967017455336172 +-0.48599188888888895 0.87306355555555581 -0.033121194444444439 -0.48194957352007178 0.87575003239765647 -0.028044417257712936 +-0.45258822222222228 0.89073005555555573 -0.035197772222222215 -0.45581496567353269 0.88910748916776217 -0.041479992452193047 +-0.43775477777777777 0.89592177777777793 -0.071664577777777794 -0.43362364391764874 0.89867514813392568 -0.06598116066004614 +-0.485991888888889 0.87306355555555581 0.033121194444444439 -0.48194957352007262 0.87575003239765581 0.028044417257714328 +-0.51557805555555547 0.82379161111111132 0.23432688888888892 -0.51207498812294627 0.82770762440957002 0.2295197051086256 +-0.39612783333333335 0.880473888888889 0.25920594444444445 -0.40319950283254841 0.87799809680948804 0.25797190334317915 +-0.69092183333333346 0.5519736111111111 0.46609872222222221 -0.69334219789485718 0.54632617647340553 0.46989818633218622 +-0.58407477777777783 0.62654744444444443 0.5153523333333333 -0.5877193972496344 0.62879865547434399 0.50911507635325792 +-0.40622622222222227 0.78411972222222215 0.46844483333333348 -0.40963750855607428 0.78616289348646995 0.46275805394282826 +-0.46547666666666665 0.81105588888888891 0.35333055555555559 -0.46212227964670521 0.81558482025617562 0.34823038296770442 +-0.711168388888889 0.60370305555555559 -0.35928411111111108 -0.70881159047278552 0.60918489551154165 -0.35564011625804004 +-0.69377355555555564 0.63683855555555546 -0.33529638888888891 -0.6912585790657676 0.64204640936345925 -0.33156897486264497 +-0.89073005555555573 -0.035197772222222215 0.45258822222222228 -0.88910748916776217 -0.041479992452193047 0.45581496567353269 +-0.89619499999999996 -0.071726300000000007 0.43782399999999999 -0.89067417773946056 -0.052628282973310257 0.45158584227078807 +-0.87835700000000005 -0.0685534 0.47306399999999998 -0.88774953587747929 -0.053226208668133886 0.45723925056816422 +-0.89073005555555573 0.035197772222222222 0.45258822222222228 -0.88910748916776128 0.041479992452199257 0.45581496567353391 +-0.87807233333333345 0.068336577777777782 0.47306938888888894 -0.88090318231058062 0.062967017455332425 0.46908926454127209 +-0.82379161111111132 0.23432688888888892 0.51557805555555547 -0.82770762440957002 0.2295197051086256 0.51207498812294627 +-0.880473888888889 0.25920594444444445 0.39612783333333335 -0.87799809680948804 0.25797190334317915 0.40319950283254841 +-0.5519736111111111 0.46609872222222221 0.69092183333333346 -0.54632617647340553 0.46989818633218622 0.69334219789485718 +-0.62654744444444443 0.5153523333333333 0.58407477777777783 -0.62879865547434399 0.50911507635325803 0.58771939724963429 +-0.78411972222222215 0.46844483333333348 0.40622622222222227 -0.78616289348646995 0.46275805394282826 0.40963750855607428 +-0.81105588888888891 0.35333055555555559 0.46547666666666665 -0.81558482025617562 0.34823038296770442 0.46212227964670521 +-0.89592177777777793 0.071664577777777794 0.43775477777777783 -0.8986751481339238 0.065981160660045099 0.43362364391765301 +-0.83994238888888895 0.053591199999999999 0.53958305555555564 -0.84339957803099685 0.056623408286707637 0.53429480758391557 +-0.70512544444444458 0.19986166666666666 0.67984705555555558 -0.70592110047367851 0.19251976909590959 0.68162419148185194 +-0.83973833333333325 0.49078361111111107 -0.23081177777777778 -0.83775605369134032 0.49646004234455926 -0.22735923306246128 +-0.86369744444444452 0.45838005555555555 -0.20788044444444445 -0.86616824898877942 0.45283443719162664 -0.21140845994674545 +-0.84908077777777791 0.49396133333333336 -0.1853765 -0.84692766994819901 0.49963695682834108 -0.18186927516056414 +-0.55371011111111113 0.82425750000000009 0.11595597777777779 -0.56004957190621907 0.82053882523414667 0.11428260274874391 +-0.87200361111111102 0.46106205555555557 -0.16226505555555554 -0.86995444403255973 0.46689328756781862 -0.15871333696987769 +-0.59835688888888905 0.80064005555555551 0.020480877777777781 -0.5991896414003286 0.80049706100696916 0.013275125526715529 +-0.57270422222222228 0.81947233333333336 -8.6736173798840355e-19 -0.5735872855835541 0.81911495734337958 -0.0069507174625364045 +-0.59835688888888883 0.80064005555555551 -0.020480877777777781 -0.59918964140033348 0.80049706100696572 -0.013275125526717843 +-0.8825426666666667 0.46425161111111113 -0.069884822222222226 -0.88011186107951001 0.47012486878554144 -0.066224766791123171 +-0.87829933333333354 0.46300900000000006 -0.11622905 -0.87607134551440624 0.46884628063085088 -0.1126151086985905 +-0.624302388888889 0.7565968333333335 -0.19279794444444445 -0.62615345904453978 0.75720239315206739 -0.1859472547023478 +-0.71951088888888892 0.68061216666666668 -0.1356845388888889 -0.7147054568829414 0.68547533361676471 -0.13899524058301724 +-0.83280549999999987 0.52852688888888888 0.16247072222222222 -0.83037664881265683 0.53405020478723775 0.15894967717290617 +-0.74305750000000004 0.57594661111111112 -0.33978666666666668 -0.74080593120528382 0.58149597524355545 -0.33625734648720862 +-0.62537444444444457 0.77996644444444463 0 -0.62603508949674114 0.7797587322640509 -0.0075090729632497711 +-0.53958305555555564 0.83994238888888895 -0.053591199999999992 -0.53429480758391767 0.8433995780309953 -0.056623408286708275 +-0.38997550000000003 0.9014186666666667 -0.18635077777777784 -0.39662205137890161 0.89905867934786865 -0.18543041673160862 +-0.46030505555555556 0.84081005555555555 -0.28371927777777778 -0.45672953304209885 0.84491246075498116 -0.27842605357277289 +-0.90171000000000001 0.186445 -0.39007399999999998 -0.9038809409702484 0.20048051156713187 -0.37789788175182909 +-0.97898699999999994 0.20218977777777783 -4.3368086899420177e-19 -0.97929648237017142 0.20230232976455795 0.0072226718906903053 +-0.86546133333333342 0.41817277777777773 -0.27461266666666667 -0.86749023845332174 0.41249033814465791 -0.27805108725826749 +-0.87339500000000003 -0.033321999999999997 0.48587200000000003 -0.87367088892648037 -0.033743519155176947 0.48534580739657968 +-0.94294766666666674 0.077626622222222233 0.32278083333333335 -0.94262834940122764 0.07135509696899317 0.32612918459049767 +-0.96466700000000005 -0.039690499999999997 0.26046599999999998 -0.96472569046805723 -0.039644748009948889 0.26025494444132652 +-0.89311227777777791 0.42701350000000005 0.13894826111111114 -0.89564957242998122 0.42129340791695913 0.14256124245988619 +-0.94505249999999996 0.31850488888888884 0.068722372222222217 -0.9448795263923121 0.31840610421006571 0.076290454228617133 +-0.99411955555555553 0.081341644444444444 0.066439672222222232 -0.99398268732725292 0.081323487946983145 0.073381929668205947 +-0.45955061111111112 0.8816102222222223 -0.10493664999999999 -0.45553358346714973 0.88463172112154209 -0.099578473171240856 +-0.99642699999999995 -0.0815086 0.022148600000000001 -0.9982313602512044 -0.055201045773037569 0.022067984878397 +-0.81401994444444459 0.52202088888888898 0.2533192222222222 -0.81193152544177405 0.52755677138547286 0.24990208274268105 +-0.83973833333333325 0.49078361111111107 0.23081177777777778 -0.83775605369134021 0.49646004234455948 0.22735923306246097 +-0.85343011111111111 0.45493894444444438 0.25296472222222222 -0.85573175535963186 0.44940153143522182 0.25643990799561706 +-0.84128666666666674 0.45063644444444445 0.29743761111111111 -0.84342171315466552 0.44511058846660512 0.30085939874659323 +-0.54250855555555544 0.82523066666666689 -0.15520044444444447 -0.5490152625132082 0.82162400177332173 -0.1533500610940399 +-0.56619688888888908 0.8034865555555557 -0.18225488888888894 -0.56010282149941726 0.80750215514867851 -0.18500026696908106 +-0.57758122222222219 0.80355477777777773 -0.14180361111111112 -0.57172393337095639 0.80758849978511515 -0.14468088687062031 +-0.36350300000000002 0.80080300000000004 0.47600300000000001 -0.37709824426838934 0.80251597899346994 0.46234729114579093 +-0.38492900000000002 0.77221600000000001 0.50548199999999999 -0.39921854218209168 0.76702783163088317 0.50228762784049441 +-0.66640616666666674 0.73343161111111121 -0.13171617222222221 -0.6678451032873397 0.73382922312113597 -0.12440895992070952 +-0.63459266666666669 0.75765061111111109 -0.15045633333333333 -0.62911940905974673 0.76199464803136974 -0.15353476972941341 +-0.80052966666666681 0.47582533333333332 0.36338350000000003 -0.80265774097767739 0.47030346706533316 0.36681766548918965 +-0.45328572222222224 0.86514772222222236 -0.21312050000000002 -0.46005659684907169 0.86225232066584634 -0.21182271644470294 +-0.42970200000000003 0.88428033333333345 -0.18106466666666671 -0.42581966140360406 0.88764058984003402 -0.17541892494983652 +-0.7732636111111113 0.54721044444444444 -0.31926572222222227 -0.77115959471535711 0.55276167927063913 -0.31585978757725619 +-0.75826000000000005 0.54113988888888886 -0.36264583333333333 -0.75622976135463549 0.54684065776048796 -0.35927961681897308 +-0.77195166666666681 0.50529522222222234 -0.38479933333333333 -0.77420418144639258 0.49978933334325532 -0.38835358593326469 +-0.80052966666666681 0.47582533333333338 -0.36338349999999997 -0.8026577409776775 0.4703034670653331 -0.36681766548918937 +-0.84128666666666674 0.45063644444444445 -0.29743761111111111 -0.84342171315466585 0.44511058846660456 -0.30085939874659323 +-0.85343011111111111 0.45493894444444438 -0.25296472222222222 -0.85573175535963197 0.44940153143522266 -0.25643990799561533 +-0.81401994444444459 0.52202088888888898 -0.2533192222222222 -0.81193152544177405 0.52755677138547252 -0.24990208274268152 +-0.99784694444444455 0.040756905555555556 0.044118144444444451 -0.99786818088871454 0.040763292286846671 0.050965160372401994 +-0.9960796666666667 0.081478161111111114 0.022153288888888897 -0.99624697878379498 0.081522902500506297 0.029085625866631565 +-0.99607966666666681 0.081478161111111114 -0.022153288888888893 -0.99624697878379476 0.081522902500508282 -0.029085625866632773 +-0.99784694444444455 0.040756905555555563 -0.044118144444444445 -0.99786818088871432 0.040763292286850716 -0.050965160372404512 +-0.95679477777777766 0.15844944444444448 -0.24241494444444445 -0.957253922897494 0.15217835599473786 -0.24598104614806679 +-0.954216888888889 0.19824288888888889 -0.22246183333333336 -0.95499795117042829 0.19203700464703405 -0.22605464407191309 +-0.92819838888888895 0.23331588888888891 -0.28868505555555557 -0.92653611314773354 0.23259507848721434 -0.29568625347928651 +-0.6199285555555557 0.7234788333333334 0.30264644444444444 -0.62233405661673558 0.72465725446077867 0.29592597981982599 +-0.6041117222222222 0.71834377777777791 0.34402016666666668 -0.60673787304411819 0.71971741204167938 0.33745518253232804 +-0.72937694444444445 0.68212288888888883 0.045444011111111113 -0.7251653919144494 0.68684049960043503 0.048839353785526264 +-0.70469933333333346 0.70870400000000022 0.022429688888888889 -0.70056916549628245 0.71311852774715345 0.02578390466113795 +-0.70469933333333346 0.70870400000000011 -0.022429688888888886 -0.70056916549628256 0.71311852774715345 -0.025783904661137932 +-0.72937694444444456 0.68212288888888895 -0.045444011111111113 -0.72516539191444929 0.68684049960043514 -0.048839353785527999 +-0.30377100000000001 0.94550800000000002 0.117211 -0.32105083824403247 0.93915655663412101 0.12211192158812767 +-0.32284400000000002 0.94326100000000002 0.077663399999999994 -0.33612594684296987 0.93866728579618708 0.076961512686122849 +-0.34437450000000003 0.93139666666666665 0.11520171666666668 -0.34755386944931477 0.93129562037784208 0.1090631711250817 +-0.97798022222222236 0.20204100000000003 0.045058005555555565 -0.97798063649741107 0.2020444956319952 0.052267546536367566 +-0.3668042222222222 0.91753444444444443 0.15149372222222224 -0.37332295099127616 0.91536790224266051 0.15076994994705142 +-0.34918150000000003 0.91709716666666674 0.19066583333333337 -0.35599575378580972 0.91500169554972122 0.18983919623620527 +-0.53871111111111103 0.79996133333333364 0.26305961111111109 -0.53532151268631545 0.80417342765022815 0.25833307244044129 +-0.55320488888888897 0.8023326666666668 0.22269266666666671 -0.54979059721433254 0.80630565401481535 0.2181776604477379 +-0.92819838888888895 0.23331588888888891 0.28868505555555551 -0.92653611314773454 0.23259507848721248 0.29568625347928484 +-0.93984338888888908 0.23587238888888895 0.2457178888888889 -0.93848222466552222 0.23528226001218258 0.25277138309233488 +-0.79996133333333364 0.26305961111111109 0.53871111111111103 -0.80417342765022815 0.25833307244044129 0.53532151268631545 +-0.8023326666666668 0.22269266666666671 0.55320488888888897 -0.80630565401481535 0.2181776604477379 0.54979059721433254 +-0.77990294444444475 0.20883044444444446 0.58949688888888896 -0.78052499673159592 0.20224086398833821 0.59150601215067355 +-0.75451727777777788 0.23497366666666666 0.61224105555555552 -0.75533943219617805 0.22816291194908692 0.61433218032304682 +-0.7234788333333334 0.30264644444444444 0.6199285555555557 -0.72465725446077867 0.29592597981982599 0.62233405661673558 +-0.77837733333333348 0.62555188888888902 -0.046270227777777784 -0.77450865557375925 0.63060662611129537 -0.049715445747341026 +-0.77837733333333337 0.62555188888888902 0.046270227777777784 -0.77450865557375959 0.63060662611129514 0.049715445747339361 +-0.61224105555555552 0.75451727777777788 -0.23497366666666666 -0.61433218032304682 0.75533943219617805 -0.22816291194908686 +-0.58949688888888896 0.77990294444444463 -0.20883044444444446 -0.59150601215067311 0.7805249967315957 -0.20224086398834018 +-0.55320488888888897 0.8023326666666668 -0.22269266666666671 -0.54979059721433254 0.80630565401481535 -0.2181776604477379 +-0.53871111111111114 0.79996133333333352 -0.26305961111111109 -0.53532151268631711 0.80417342765022692 -0.25833307244044157 +-0.54506144444444438 0.76974894444444464 -0.33124288888888892 -0.54190948364203873 0.77435972940169739 -0.3266513753526053 +-0.52779399999999999 0.76387899999999997 -0.37137900000000001 -0.5396206568579901 0.76298284461056509 -0.35590269108581013 +-0.56648211111111113 0.74160044444444451 -0.35839366666666667 -0.56349687759284484 0.7464457535431317 -0.35396328335088789 +-0.34923799999999999 0.917408 -0.190778 -0.36295919339829508 0.9124818649282449 -0.18877889210590018 +-0.32284400000000002 0.94326100000000002 -0.077663399999999994 -0.33612594684296643 0.93866728579618819 -0.076961512686125153 +-0.30377100000000001 0.94550800000000002 -0.117211 -0.32417934117557873 0.93881742394656642 -0.11631680553256618 +-0.91709716666666674 0.19066583333333337 -0.34918149999999998 -0.91500169554972055 0.18983919623620713 -0.35599575378581039 +-0.91784500000000002 0.15160399999999999 -0.36684600000000001 -0.92290412972690916 0.15945187513042228 -0.35046122018050518 +-0.94518311111111109 0.11713587777777779 0.30373750000000005 -0.94517851330077696 0.11083824185051343 0.30716845889189226 +-0.93139666666666665 0.11520171666666668 0.34437450000000003 -0.93129562037784208 0.1090631711250817 0.34755386944931477 +-0.91753444444444443 0.15149372222222224 0.3668042222222222 -0.91536790224266051 0.15076994994705142 0.37332295099127616 +-0.91709716666666674 0.19066583333333337 0.34918150000000003 -0.91500169554972122 0.18983919623620527 0.35599575378580972 +-0.56851399999999996 0.70381577777777782 0.42513244444444448 -0.56570987441492659 0.70912983566843601 0.42084107945197674 +-0.54890888888888878 0.69428805555555562 0.46471572222222218 -0.54614778938415753 0.69982807056515794 0.46039468263637262 +-0.410862 0.60649699999999995 0.680701 -0.42136567169173189 0.60657147442589543 0.67418248058857977 +-0.88585416666666672 0.4248007222222222 -0.18467527777777779 -0.88820631455867338 0.41910872685926326 -0.18824828777045036 +-0.87661705555555558 0.42187050000000004 -0.22993105555555557 -0.87879755235776458 0.41620240027572308 -0.23343184010483425 +-0.95764555555555553 0.23940283333333337 0.15780855555555556 -0.95893043882721862 0.2331625464421283 0.16151668776711708 +-0.89724905555555567 0.3464673333333334 -0.27242100000000002 -0.89882246463749604 0.34067182429932968 -0.27579137983545454 +-0.88781094444444453 0.38452083333333342 -0.25147144444444447 -0.88969484040035252 0.37874946869363357 -0.25493515043885479 +-0.96367061111111119 0.24053788888888891 -0.11303783333333334 -0.96513735744308149 0.23420596052008852 -0.11686509027356483 +-0.89947383333333342 0.10931593333333332 0.42238088888888892 -0.90236353428698479 0.10344279183327305 0.41837739041066713 +-0.91612616666666669 0.11263961111111111 0.38394200000000006 -0.91886656680883305 0.10654941584502681 0.37990979769417871 +-0.91287011111111127 0.074242938888888887 0.40070494444444449 -0.91103886545158841 0.080736581472007338 0.40433870708713571 +-0.92859111111111126 0.076199844444444456 0.36234955555555559 -0.92689685591902893 0.082802957133127394 0.36606814772310975 +-0.70381577777777782 0.42513244444444448 0.56851399999999996 -0.70912983566843601 0.42084107945197674 0.56570987441492659 +-0.69428805555555562 0.46471572222222218 0.54890888888888878 -0.69982807056515794 0.46039468263637262 0.54614778938415753 +-0.94655277777777791 8.6736173798840355e-19 0.3215696111111111 -0.9456570726767769 -0.0065172944522050528 0.32510033185066461 +-0.93871544444444444 0.03855203888888889 0.3416245555555556 -0.93740915282173265 0.045125010304282447 0.34529380772188761 +-0.62442638888888902 0.64761527777777772 0.4358711111111111 -0.62760205669194258 0.64948538536189837 0.42928358067523403 +-0.60628444444444429 0.68047233333333346 0.4107060555555555 -0.60930378779273198 0.68218770964937192 0.40418909310466744 +-0.62399500000000008 0.68793472222222229 0.36971155555555557 -0.62676292798033717 0.68945393975167257 0.36307230281365693 +-0.65963700000000003 0.66292483333333341 0.35315727777777778 -0.66230302078762238 0.66440626695154015 0.34629325880113365 +-0.44720294444444453 0.72360344444444447 0.52507777777777787 -0.45085647129555212 0.72590669957852993 0.51941111443434562 +-0.40531733333333336 0.74167483333333351 0.53379438888888886 -0.4019788435156959 0.73972208925562644 0.53965196194684129 +-0.42721033333333341 0.75469172222222214 0.49722505555555557 -0.43072346248779858 0.75686579003687127 0.49156024527455899 +-0.84568794444444451 0.5325131111111111 0.023343438888888894 -0.84245686591734525 0.53808947533701124 0.026947088901479895 +-0.86496422222222225 0.49895488888888889 0.046672377777777788 -0.86180051139229774 0.5047430257743023 0.050342392634600892 +-0.93482588888888907 0.31605533333333335 0.15971061111111112 -0.9340282709467429 0.3156486955681746 0.16720373817097367 +-0.94321855555555567 0.27717322222222224 0.18115188888888892 -0.9422834190263415 0.27673948951092692 0.18846011029727186 +-0.93423205555555544 0.27510183333333332 0.22547750000000003 -0.93299691132386953 0.27452654359661405 0.23270569464672752 +-0.91673538888888906 0.31132633333333337 0.24896333333333337 -0.91532388527674813 0.31061812165517827 0.25631731806744401 +-0.42529400000000001 0.56871099999999997 0.70405399999999996 -0.43584136078128521 0.56866322048988804 0.69761339572458492 +-0.46471572222222218 0.54890888888888878 0.69428805555555562 -0.46039468263637262 0.54614778938415753 0.69982807056515794 +-0.64761527777777772 0.4358711111111111 0.62442638888888902 -0.64948538536189837 0.42928358067523403 0.62760205669194258 +-0.68047233333333346 0.4107060555555555 0.60628444444444429 -0.68218770964937192 0.40418909310466744 0.60930378779273198 +-0.66292483333333341 0.35315727777777778 0.65963700000000003 -0.66440626695154015 0.34629325880113365 0.66230302078762238 +-0.91673538888888906 0.31132633333333343 -0.24896333333333337 -0.91532388527674802 0.31061812165517827 -0.25631731806744434 +-0.93482588888888907 0.31605533333333341 -0.15971061111111112 -0.93402827094674179 0.31564869556817543 -0.16720373817097822 +-0.86496422222222225 0.49895488888888889 -0.046672377777777781 -0.86180051139229819 0.50474302577430152 -0.050342392634600462 +-0.84568794444444451 0.5325131111111111 -0.023343438888888891 -0.84245686591734625 0.53808947533700968 -0.026947088901478889 +-0.82368444444444444 0.56451983333333344 -0.046607672222222229 -0.82016277944795324 0.56992861274242324 -0.050143709333323697 +-0.82038388888888891 0.56357805555555562 -0.093063277777777773 -0.81661364964159877 0.56904227675642238 -0.096607631597588006 +-0.60628444444444451 0.68047233333333335 -0.4107060555555555 -0.60930378779273187 0.68218770964937325 -0.40418909310466544 +-0.58750899999999995 0.67174800000000001 -0.451208 -0.59712328610831344 0.67644013040989115 -0.43112936707937061 +-0.62464600000000003 0.64783599999999997 -0.43603399999999998 -0.63056376625946575 0.65114486100355962 -0.42237389439847339 +-0.42479211111111115 0.70975300000000008 0.56133844444444447 -0.42132562890847369 0.70765484053935324 0.56719427102722186 +-0.44313827777777781 0.67625838888888889 0.58787722222222216 -0.43953860770040559 0.67402691765197176 0.59371165275861892 +-0.96771327777777782 0.24127177777777781 -0.067924161111111117 -0.96755210126393754 0.24120310120227617 -0.075259519731019187 +-0.5149719444444445 0.488196388888889 0.70410561111111114 -0.50913871292513224 0.49181063499169769 0.70632858522786901 +-0.75765061111111109 0.15045633333333333 0.63459266666666669 -0.76199464803136652 0.1535347697294133 0.62911940905975061 +-0.78098961111111131 0.16742283333333338 0.60117361111111101 -0.785188590802534 0.17037521088438604 0.59535801362678575 +-0.78904427777777775 0.59209005555555561 0.16171811111111109 -0.78629297372174234 0.59725247015776106 0.15821771824379238 +-0.80355477777777784 0.14180361111111112 0.57758122222222219 -0.80758849978511771 0.14468088687062342 0.57172393337095218 +-0.80277855555555566 0.10144869444444445 0.5871036111111112 -0.80666135127872451 0.10456041474826064 0.58169114143233591 +-0.42970200000000003 0.88428033333333345 0.18106466666666671 -0.4258196614036035 0.88764058984003447 0.17541892494983571 +-0.40647822222222235 0.90131850000000013 0.14760150000000002 -0.40247103169275233 0.90439818266630467 0.14170743042641337 +-0.42238088888888892 0.89947383333333342 0.10931593333333332 -0.41837739041066713 0.90236353428698479 0.10344279183327305 +-0.45955061111111112 0.8816102222222223 0.10493664999999999 -0.45553358346714756 0.88463172112154309 0.09957847317124123 +-0.68933433333333349 0.70698838888888893 -0.15598661111111112 -0.69503727204225441 0.70247712477229041 -0.15313092321186206 +-0.62369722222222224 0.78016216666666671 0.042238155555555559 -0.62470401263738684 0.78007890288869608 0.034954282466044873 +-0.65182450000000014 0.75766966666666669 0.021676222222222225 -0.65246590588010478 0.75768815115089549 0.014032365074783662 +-0.67737388888888894 0.73389566666666672 0.044128638888888891 -0.67815638521793087 0.73401541893978217 0.036404422077621408 +-0.67314488888888901 0.73382466666666668 0.088077566666666662 -0.67424393756459622 0.73410544350889673 0.08052521634863645 +-0.34162455555555554 0.93871544444444444 -0.038552038888888897 -0.34529380772188994 0.93740915282173187 -0.045125010304281565 +-0.32164100000000001 0.94686199999999998 6.1494599999999998e-19 -0.33473155310488784 0.94231352922262013 3.6267044291985801e-16 +-0.30181000000000002 0.95256300000000005 -0.0391817 -0.3218068857110214 0.94600646206740269 -0.038885756205703864 +-0.83280549999999987 0.52852688888888899 -0.1624707222222222 -0.83037664881265649 0.53405020478723886 -0.15894967717290423 +-0.87829933333333354 0.46300900000000006 0.11622905000000001 -0.87607134551440624 0.46884628063085082 0.11261510869859052 +-0.87200361111111102 0.46106205555555557 0.16226505555555554 -0.86995444403255928 0.46689328756782017 0.15871333696987613 +-0.84908077777777791 0.49396133333333336 0.1853765 -0.84692766994820057 0.49963695682833859 0.18186927516056392 +-0.4920802222222222 0.84572811111111124 -0.20489072222222227 -0.49882332570160443 0.84252034648128082 -0.20330950666669181 +-0.52977233333333329 0.82511827777777791 -0.19469544444444445 -0.53644658705687587 0.82159577007534734 -0.19288714272684607 +-0.51876055555555556 0.84501666666666675 -0.12755305555555557 -0.52512962998216928 0.84161907351186538 -0.12615944996637979 +-0.41731183333333338 0.90771522222222234 0.036593988888888894 -0.42057737025126773 0.90623645146983989 0.04301359854604659 +-0.40070494444444449 0.91287011111111127 0.074242938888888887 -0.40433870708713571 0.91103886545158841 0.080736581472007338 +-0.36234955555555559 0.92859111111111126 0.076199844444444456 -0.36606814772310975 0.92689685591902893 0.082802957133127394 +-0.34162455555555554 0.93871544444444444 0.038552038888888897 -0.34529380772188739 0.93740915282173276 0.045125010304282079 +-0.36234955555555565 0.92859111111111126 -0.076199844444444428 -0.36606814772311413 0.92689685591902726 -0.082802957133126492 +-0.40070494444444454 0.91287011111111127 -0.074242938888888901 -0.40433870708713487 0.91103886545158896 -0.080736581472005825 +-0.41731183333333344 0.90771522222222234 -0.036593988888888894 -0.42057737025126812 0.90623645146983978 -0.043013598546047055 +-0.51876055555555556 0.84501666666666675 0.12755305555555557 -0.52512962998216917 0.84161907351186538 0.12615944996637982 +-0.54250855555555555 0.82523066666666689 0.15520044444444447 -0.54901526251321164 0.82162400177331962 0.15335006109403856 +-0.5297723333333334 0.8251182777777778 0.19469544444444445 -0.53644658705687598 0.82159577007534701 0.19288714272684732 +-0.4920802222222222 0.84572811111111124 0.20489072222222227 -0.49882332570160387 0.84252034648128127 0.2033095066666914 +-0.71116838888888889 0.60370305555555559 0.35928411111111114 -0.70881159047278919 0.60918489551153832 0.35564011625803871 +-0.72715611111111123 0.56931522222222219 0.38265566666666667 -0.72499878648104932 0.57499148324182692 0.3791590085971448 +-0.70975300000000008 0.56133844444444447 0.42479211111111115 -0.70765484053935324 0.56719427102722186 0.42132562890847369 +-0.67625838888888889 0.58787722222222216 0.44313827777777781 -0.67402691765197176 0.59371165275861892 0.43953860770040559 +-0.488196388888889 0.70410561111111114 0.5149719444444445 -0.49181063499169769 0.70632858522786901 0.50913871292513224 +-0.44828472222222226 0.76617377777777773 0.45969711111111117 -0.45162717142033804 0.76813183917485439 0.45387925231356441 +-0.93903499999999995 -0.038584800000000002 0.34165000000000001 -0.93916432755198997 -0.038521172133807798 0.34130116488411827 +-0.92890300000000003 -0.076266500000000001 0.36238399999999998 -0.93114137455847357 -0.051749775504558296 0.36096772891850654 +-0.91318200000000005 -0.074313500000000005 0.40071899999999999 -0.91559703367523992 -0.050328370179532594 0.39893499104512464 +-0.90800400000000003 -0.036630599999999999 0.41735699999999998 -0.90827198726026925 -0.036570306899743228 0.41677885000505965 +-0.84501666666666675 0.12755305555555557 0.51876055555555545 -0.84161907351186604 0.12615944996638023 0.52512962998216806 +-0.82523066666666689 0.15520044444444447 0.54250855555555555 -0.82162400177331962 0.15335006109403856 0.54901526251321164 +-0.82511827777777791 0.19469544444444442 0.52977233333333329 -0.82159577007534679 0.19288714272684712 0.53644658705687642 +-0.84572811111111124 0.20489072222222227 0.4920802222222222 -0.84252034648128127 0.2033095066666914 0.49882332570160387 +-0.60370305555555559 0.35928411111111114 0.71116838888888889 -0.6091848955115382 0.35564011625803865 0.70881159047278919 +-0.57613099999999995 0.33991500000000002 0.74332399999999998 -0.58437886466715772 0.3538406033072346 0.73027266824214099 +-0.56931522222222219 0.38265566666666667 0.72715611111111123 -0.57499148324182692 0.37915900859714474 0.72499878648104932 +-0.58787722222222216 0.44313827777777781 0.67625838888888889 -0.59371165275861892 0.43953860770040559 0.67402691765197176 +-0.70410561111111114 0.5149719444444445 0.488196388888889 -0.7063285852278689 0.50913871292513235 0.49181063499169764 +-0.72360344444444447 0.52507777777777787 0.44720294444444453 -0.72590669957852993 0.51941111443434562 0.45085647129555212 +-0.75469172222222214 0.49722505555555557 0.42721033333333341 -0.75686579003687127 0.49156024527455899 0.43072346248779858 +-0.76617377777777773 0.45969711111111117 0.44828472222222226 -0.76813183917485439 0.45387925231356441 0.45162717142033804 +-0.88428033333333345 0.18106466666666671 0.42970200000000003 -0.88764058984003447 0.17541892494983571 0.4258196614036035 +-0.90131850000000013 0.14760150000000002 0.40647822222222235 -0.90439818266630467 0.14170743042641337 0.40247103169275233 +-0.8816102222222223 0.10493664999999999 0.45955061111111112 -0.8846317211215432 0.099578473171241258 0.45553358346714756 +-0.76617377777777773 0.45969711111111117 -0.44828472222222226 -0.76813183917485228 0.45387925231356635 -0.45162717142033981 +-0.75469172222222214 0.49722505555555557 -0.42721033333333341 -0.75686579003687093 0.49156024527456066 -0.43072346248779714 +-0.72360344444444447 0.52507777777777775 -0.44720294444444453 -0.72590669957852894 0.51941111443434651 -0.45085647129555251 +-0.69116500000000003 0.55216799999999999 -0.46626299999999998 -0.70308750497874417 0.55099997577739757 -0.44951861700720658 +-0.70435000000000003 0.515158 -0.48836800000000002 -0.7120720291689725 0.52656277906578286 -0.46441906181562093 +-0.57758122222222219 0.80355477777777784 0.14180361111111112 -0.57172393337095206 0.80758849978511771 0.14468088687062342 +-0.5871036111111112 0.80277855555555566 0.10144869444444445 -0.58169114143233602 0.80666135127872463 0.10456041474826065 +-0.58710361111111109 0.80277855555555566 -0.10144869444444445 -0.58169114143233625 0.80666135127872363 -0.104560414748266 +-0.60117361111111123 0.78098961111111131 -0.16742283333333338 -0.59535801362678342 0.78518859080253534 -0.17037521088438701 +-0.67649599999999999 0.58808099999999996 -0.443299 -0.68237595213215929 0.59152889609279979 -0.42948413828564469 +-0.70975300000000008 0.56133844444444447 -0.42479211111111115 -0.70765484053935468 0.56719427102721987 -0.42132562890847386 +-0.72715611111111123 0.56931522222222231 -0.38265566666666667 -0.72499878648104976 0.57499148324182858 -0.37915900859714147 +-0.6731448888888889 0.73382466666666668 -0.088077566666666676 -0.67424393756459777 0.73410544350889573 -0.080525216348634021 +-0.67737388888888894 0.73389566666666672 -0.044128638888888891 -0.67815638521793198 0.73401541893978095 -0.036404422077624073 +-0.65182450000000014 0.7576696666666668 -0.021676222222222225 -0.65246590588010245 0.75768815115089749 -0.014032365074781672 +-0.62369722222222235 0.78016216666666671 -0.042238155555555559 -0.6247040126373884 0.78007890288869486 -0.034954282466040557 +-0.42238088888888892 0.89947383333333342 -0.10931593333333332 -0.4183773904106684 0.90236353428698401 -0.10344279183327446 +-0.98822399999999999 0.12163718333333334 -0.089000511111111125 -0.98793174163105957 0.12156932709869499 -0.095977979696344612 +-0.99118644444444448 0.12192531666666667 -0.04455446111111111 -0.99119702566678813 0.12194147397569161 -0.051562905600327391 +-0.98613916666666668 0.16225061111111114 -0.022410494444444446 -0.9862979151151543 0.16230832589795582 -0.029536925765944418 +-0.97798022222222225 0.20204100000000003 -0.045058005555555565 -0.97798063649741085 0.20204449563199528 -0.052267546536372299 +-0.90614733333333342 0.39010305555555563 -0.16128705555555556 -0.90837866366013453 0.38426438939936985 -0.16489112300714548 +-0.90771522222222234 0.036593988888888894 0.41731183333333338 -0.90623645146983989 0.04301359854604659 0.42057737025126773 +-0.88781094444444464 0.38452083333333342 0.25147144444444441 -0.88969484040035385 0.37874946869362897 0.25493515043885739 +-0.87661705555555558 0.42187049999999998 0.2299310555555556 -0.87879755235776325 0.41620240027572614 0.23343184010483348 +-0.88585416666666672 0.4248007222222222 0.18467527777777779 -0.8882063145586736 0.41910872685926281 0.18824828777045061 +-0.90614733333333342 0.39010305555555563 0.16128705555555559 -0.90837866366013442 0.38426438939936991 0.16489112300714623 +-0.98613916666666668 0.16225061111111114 0.022410494444444446 -0.98629791511515463 0.16230832589795385 0.02953692576594321 +-0.99118644444444448 0.12192531666666667 0.044554461111111124 -0.99119702566678813 0.12194147397569156 0.051562905600327384 +-0.98822399999999999 0.12163718333333334 0.089000511111111125 -0.98793174163105957 0.12156932709869497 0.095977979696344612 +-0.31613200000000002 0.88471900000000003 0.34254000000000001 -0.3294211315812311 0.88512215672951233 0.32869512581454269 +-0.35899861111111109 0.86988683333333339 0.33724750000000009 -0.36215323660106347 0.87121174907206966 0.33141382212901033 +-0.38206200000000001 0.84660888888888897 0.36959116666666669 -0.3852110923041957 0.84810814993773809 0.36376500707873988 +-0.36214800000000003 0.83810200000000001 0.40796199999999999 -0.37649389839740721 0.83315715797455803 0.40509442675168977 +-0.64198000000000011 0.29233105555555561 0.70832122222222216 -0.64705626737509614 0.28859701459703146 0.70571237059887859 +-0.64625299999999997 0.248833 0.721414 -0.65455064680951669 0.26288318719723591 0.70884122386488391 +-0.98471200000000003 -0.080752400000000002 0.154339 -0.98659498098831921 -0.054652534041547601 0.15376424815767611 +-0.97700299999999995 -0.080266400000000002 0.19753899999999999 -0.97891707379046766 -0.054331382555824669 0.19689962801153485 +-0.983657 -0.0403062 0.175484 -0.9836808891515797 -0.040307589169763014 0.17534881400590965 +-0.98778033333333348 3.4218388888888886e-20 0.1536423888888889 -0.98705222481230426 8.1539385375779995e-17 0.16039920664729113 +-0.99358272222222233 0 0.11001133333333335 -0.99315324794551874 -9.5418526886554624e-18 0.11681877458382654 +-0.28874899999999998 0.92851300000000003 0.23342599999999999 -0.31360689215868431 0.91930464452193628 0.23775972693239647 +-0.33097694444444448 0.91482127777777766 0.22998205555555556 -0.3379838335060848 0.91284890386869511 0.22907161979226712 +-0.88442177777777797 0.34238933333333338 0.31604200000000005 -0.88585844674484926 0.33657981943799542 0.3193255979057889 +-0.86988683333333339 0.33724750000000009 0.35899861111111109 -0.87121174907206966 0.33141382212901033 0.36215323660106347 +-0.35449605555555552 0.89642250000000001 0.26474783333333329 -0.36161009603891914 0.89426493531171247 0.26368231627218108 +-0.84660888888888897 0.36959116666666669 0.38206200000000001 -0.84810814993773809 0.36376500707873988 0.3852110923041957 +-0.83782038888888899 0.40779044444444446 0.36203938888888892 -0.83957573606046731 0.40206922864807892 0.36531208410462301 +-0.70832122222222216 0.64198000000000011 0.29233105555555561 -0.70571237059887848 0.64705626737509603 0.28859701459703141 +-0.72114805555555561 0.64606572222222214 0.24872233333333338 -0.71841774753895082 0.65102987947107138 0.24502252153004747 +-0.75165261111111104 0.61818911111111119 0.22841961111111117 -0.74897430910137541 0.6232921503283716 0.22482077227238603 +-0.76982988888888892 0.58579227777777787 0.25202805555555563 -0.7673750143241086 0.59109138934629735 0.24848854466904122 +-0.80396599999999996 0.39244699999999999 -0.44679200000000002 -0.80393341593672984 0.39250190306445421 -0.44680344541093547 +-0.81132199999999999 0.353493 -0.465617 -0.81955619222806575 0.36445707030167734 -0.44215233990984587 +-0.82959505555555568 0.36214950000000001 -0.42419233333333339 -0.83100516247629708 0.35626101820597383 -0.42721014365834731 +-0.84660888888888908 0.36959116666666669 -0.38206200000000001 -0.84810814993773953 0.36376500707873649 -0.3852110923041957 +-0.83782038888888899 0.40779044444444446 -0.36203938888888892 -0.83957573606046787 0.40206922864807976 -0.3653120841046209 +-0.78904427777777775 0.59209005555555561 -0.16171811111111112 -0.78629297372174378 0.59725247015775862 -0.15821771824379466 +-0.76144050000000019 0.62116427777777772 -0.18352861111111116 -0.75861571935303307 0.62618704465993646 -0.17997770820447423 +-0.98436877777777787 0.08072323888888891 -0.15432383333333335 -0.98364278048400244 0.080574270691353006 -0.16110452291682351 +-0.98331377777777784 0.040291861111111112 -0.17546994444444447 -0.98244224734962848 0.040209691007927609 -0.18218235746542072 +-0.98778033333333348 0 -0.15364238888888887 -0.98705222481230426 -8.0671945105824872e-17 -0.16039920664729104 +-0.99041400000000002 -0.040517699999999997 -0.132054 -0.99152557490792936 -0.020252671590080776 -0.12832327768945359 +-0.99358272222222233 0 -0.11001133333333335 -0.99315324794551874 9.5418526886554624e-18 -0.11681877458382654 +-0.99642699999999995 -0.0815086 -0.022148600000000001 -0.9982313602512044 -0.055201045773037596 -0.022067984878397 +-0.99819400000000003 -0.0407719 -0.044118600000000001 -0.99819300715063164 -0.040789101676862317 -0.044124479146768286 +-0.88442177777777786 0.34238933333333343 -0.31604200000000005 -0.88585844674484893 0.33657981943799731 -0.31932559790578779 +-0.86988683333333339 0.33724750000000003 -0.35899861111111109 -0.87121174907206944 0.3314138221290106 -0.36215323660106363 +-0.44665483333333333 0.80369816666666671 0.39227866666666672 -0.44970367922441068 0.80527512270279777 0.38639174117470765 +-0.42419233333333334 0.82959505555555557 0.36214950000000001 -0.42721014365834631 0.83100516247629663 0.35626101820597622 +-0.44273205555555556 0.83600788888888899 0.32312066666666667 -0.44638955238374878 0.83223041013000265 0.32882960933815558 +-0.48330188888888903 0.81681627777777799 0.3139468333333334 -0.47988631979275509 0.82116637706339168 0.30886065022328313 +-0.71130488888888888 0.6788725000000001 -0.18030416666666671 -0.70824252605277271 0.68351288304227853 -0.17664275531597648 +-0.74111677777777785 0.65159588888888897 -0.15967583333333338 -0.74639544595641349 0.64681512694105092 -0.15660150004313161 +-0.74804966666666672 0.65319355555555558 -0.1144236777777778 -0.74356870428831068 0.6582038114175951 -0.11778507816507858 +-0.43694288888888888 0.86297505555555565 0.25239211111111109 -0.44071750665220449 0.85965498700960707 0.25838224133979565 +-0.41956622222222228 0.85917744444444455 0.29173877777777779 -0.42243889058002065 0.86015098722300531 0.28580703788537215 +-0.37797294444444451 0.87603155555555556 0.29838466666666669 -0.37092317424346333 0.87886765169052439 0.30001274909766174 +-0.70109299999999997 0.67633188888888884 0.22443494444444448 -0.69976957442665277 0.67563076924838528 0.23204656074067639 +-0.66844344444444448 0.70239261111111118 0.24322949999999999 -0.6704755154537877 0.70337765391720541 0.23605605085848952 +-0.9747165555555557 0.040023405555555551 0.21829649999999998 -0.97564673422962944 0.046633488357808936 0.21433330994187721 +-0.96714038888888898 0.079606161111111115 0.24007305555555558 -0.96706196112010012 0.073091910347299713 0.24382111474671009 +-0.67651799999999995 0.22455 0.70135599999999998 -0.68558156780852908 0.23046660937039454 0.69055271764472348 +-0.70239261111111118 0.24322949999999999 0.66844344444444448 -0.70337765391720541 0.23605605085848952 0.6704755154537877 +-0.80369816666666671 0.39227866666666672 0.44665483333333333 -0.80527512270279777 0.38639174117470765 0.44970367922441068 +-0.82959505555555557 0.36214950000000001 0.42419233333333334 -0.83100516247629663 0.35626101820597622 0.42721014365834631 +-0.83600788888888899 0.32312066666666667 0.44273205555555556 -0.83223041013000265 0.32882960933815564 0.44638955238374883 +-0.81681627777777799 0.3139468333333334 0.48330188888888903 -0.82116637706339168 0.30886065022328313 0.47988631979275509 +-0.86325200000000002 0.25254199999999999 -0.43705699999999997 -0.87163704405386422 0.26276284123388716 -0.41376871885116795 +-0.85945800000000006 0.29188900000000001 -0.419682 -0.85941443531440198 0.29199352621521846 -0.41969823566656811 +-0.76144050000000019 0.62116427777777772 0.18352861111111116 -0.75861571935303673 0.62618704465993091 0.17997770820447828 +-0.43694288888888888 0.86297505555555565 -0.25239211111111109 -0.44071750665220349 0.85965498700960763 -0.25838224133979565 +-0.419682 0.85945800000000006 -0.29188900000000001 -0.43177312969396969 0.85828531658181317 -0.27734144986700265 +-0.442859 0.83627799999999997 -0.32328800000000002 -0.45494640996596902 0.83536956825498132 -0.30851490805561188 +-0.465617 0.81132199999999999 -0.353493 -0.47464490896675166 0.81439497295494379 -0.33387578291583303 +-0.48330188888888898 0.81681627777777777 -0.31394683333333334 -0.47988631979275559 0.82116637706338969 -0.30886065022328768 +-0.70109299999999997 0.67633188888888895 -0.22443494444444448 -0.69976957442665344 0.67563076924838428 -0.23204656074067737 +-0.66844344444444448 0.70239261111111118 -0.24322949999999999 -0.67047551545378914 0.70337765391720486 -0.23605605085848697 +-0.95937994444444441 0 0.28095566666666666 -0.96085676206659554 0.0065582045306799433 0.27696799949494438 +-0.97061122222222218 0 0.23926188888888891 -0.96932056651415255 0 0.24579999864255986 +-0.97505799999999998 -0.040042599999999998 0.218308 -0.97509522330038212 -0.040025946394139041 0.21814497269483782 +-0.967476 -0.079646999999999996 0.24009800000000001 -0.96942691840980122 -0.053878969775750629 0.23939195157394144 +-0.9747165555555557 0.040023405555555558 -0.2182965 -0.97564673422962911 0.04663348835781083 -0.21433330994187852 +-0.96714038888888898 0.079606161111111115 -0.24007305555555558 -0.9670619611200999 0.073091910347297881 -0.24382111474671148 +-0.86297505555555565 0.25239211111111109 0.43694288888888888 -0.85965498700960719 0.25838224133979559 0.44071750665220455 +-0.85917744444444455 0.29173877777777779 0.41956622222222228 -0.86015098722300531 0.28580703788537215 0.42243889058002065 +-0.87603155555555556 0.29838466666666669 0.37797294444444451 -0.87886765169052439 0.30001274909766174 0.37092317424346333 +-0.89642250000000001 0.26474783333333329 0.35449605555555552 -0.89426493531171247 0.26368231627218108 0.36161009603891914 +-0.98010588888888872 4.3368086899420177e-19 0.1967632777777778 -0.97908421922976396 0 0.20345538001056468 +-0.62107088888888895 0.60274027777777772 0.50026811111111114 -0.61877736315263288 0.60874303996824886 0.49653447628547387 +-0.59966827777777776 0.59066877777777782 0.53925861111111106 -0.59741459813788345 0.59687346323979396 0.53557246644304424 +-0.5621827777777777 0.61383599999999994 0.55357633333333334 -0.56605121403024439 0.61625528820697695 0.54755405473051 +-0.54583999999999988 0.64923588888888883 0.52900327777777778 -0.54954262438316082 0.65153458369801109 0.52297761924534369 +-0.92968266666666677 0.35567750000000004 0.092067066666666683 -0.93196779945019781 0.3496558849156724 0.095795526679453735 +-0.93279822222222231 0.35644711111111105 0.046091599999999996 -0.9352783456551782 0.35038106966600463 0.049875065596139731 +-0.94711666666666661 0.3189622222222222 0.022924433333333334 -0.94725645751782217 0.31902218302947039 0.030496728117906807 +-0.95841855555555544 0.28044677777777777 0.045571827777777782 -0.95841050964196206 0.28042718858919063 0.053008366394346244 +-0.96466700000000005 0.039690499999999997 -0.26046599999999998 -0.96892922577271623 0.045846580963139705 -0.2430519418920056 +-0.60274027777777772 0.50026811111111114 0.62107088888888895 -0.60874303996824886 0.49653447628547387 0.61877736315263288 +-0.59066877777777782 0.53925861111111106 0.59966827777777776 -0.59687346323979396 0.53557246644304424 0.59741459813788333 +-0.61383599999999994 0.55357633333333334 0.5621827777777777 -0.61625528820697695 0.54755405473051 0.56605121403024439 +-0.64923588888888883 0.52900327777777778 0.54583999999999988 -0.65153458369801109 0.52297761924534369 0.54954262438316082 +-0.33930199999999999 0.86232799999999998 0.37585200000000002 -0.35256896037494789 0.86296550392388838 0.36191942089022794 +-0.90151755555555568 0.42941455555555563 -0.046495144444444449 -0.89920982393635296 0.43542010849590124 -0.042790438812549764 +-0.91862983333333359 0.39353955555555559 -0.023167105555555557 -0.91643561588954847 0.39971262560386789 -0.019379857120373559 +-0.91862983333333359 0.39353955555555559 0.02316710555555556 -0.91643561588954847 0.39971262560386783 0.019379857120373566 +-0.90151755555555568 0.42941455555555563 0.046495144444444449 -0.89920982393635229 0.43542010849590285 0.042790438812548647 +-0.50026811111111114 0.62107088888888895 0.60274027777777772 -0.49653447628547387 0.61877736315263288 0.60874303996824886 +-0.53925861111111106 0.59966827777777776 0.59066877777777782 -0.53557246644304413 0.59741459813788333 0.59687346323979396 +-0.55357633333333334 0.5621827777777777 0.61383599999999994 -0.54755405473051 0.56605121403024439 0.61625528820697695 +-0.52900327777777778 0.54583999999999999 0.64923588888888895 -0.52297761924534136 0.54954262438316215 0.65153458369801176 +-0.61456200000000005 0.27280700000000002 0.74019599999999997 -0.63363861960554047 0.2788075266793878 0.72164289147147254 +-0.95841855555555544 0.28044677777777777 -0.045571827777777775 -0.95841050964196184 0.28042718858919063 -0.053008366394348617 +-0.94711666666666661 0.31896222222222215 -0.022924433333333334 -0.94725645751782228 0.31902218302947044 -0.030496728117904132 +-0.73620099999999999 0.48796200000000001 -0.46893600000000002 -0.74232876685044913 0.49170561551355418 -0.45516325596287777 +-0.577145388888889 0.57714538888888889 0.577145388888889 -0.57734500093273466 0.57731947200996159 0.5773863326544193 +-0.5034616666666667 0.52819516666666666 0.68325033333333329 -0.49742892855923659 0.53176094050308254 0.68541575936630394 +-0.94550800000000002 0.117211 -0.30377100000000001 -0.94554466769646617 0.11706332799948686 -0.30371278970182325 +-0.93171599999999999 0.115289 -0.34440199999999999 -0.93014279430922731 0.14108392131289296 -0.33901284539320919 +-0.85930705555555564 0.062750183333333334 0.50711255555555568 -0.85626429280438865 0.062198335626752338 0.51277951198684013 +-0.85504466666666668 0.029093672222222228 0.5173335 -0.85201161052788332 0.028918895615988958 0.52272355313495678 +-0.83706338888888898 0.017980883333333333 0.54642727777777778 -0.83636135974086612 0.012055903437396466 0.54804592063504842 +-0.81947899999999996 -1.22661e-18 0.57311000000000001 -0.8253666319708961 0.018516726600117047 0.56429341097077834 +-0.82052500000000006 0.038781744444444446 0.56986272222222223 -0.82376026015320847 0.042106213689287089 0.56537253254917719 +-0.46833050000000004 0.88327516666666683 0 -0.47066540072095209 0.88229182417334717 -0.0059344385625658648 +-0.49935283333333336 0.86615722222222247 1.4870710116376754e-19 -0.501242848042461 0.86528710791410357 -0.0058161984086358212 +-0.51733350000000011 0.85504466666666679 0.029093672222222228 -0.52272355313496044 0.8520116105278811 0.028918895615987737 +-0.50711255555555568 0.85930705555555564 0.062750183333333334 -0.51277951198684013 0.85626429280438865 0.062198335626752338 +-0.56986272222222223 0.82052500000000006 -0.038781744444444446 -0.56537253254917963 0.82376026015320714 -0.042106213689281344 +-0.54642727777777778 0.83706338888888898 -0.017980883333333336 -0.54804592063505209 0.83636135974086356 -0.012055903437399117 +-0.5173335 0.85504466666666668 -0.029093672222222228 -0.52272355313495689 0.85201161052788332 -0.028918895615988951 +-0.50711255555555557 0.85930705555555564 -0.062750183333333334 -0.51277951198683769 0.85626429280439009 -0.062198335626753108 +-0.67906 0.180397 0.71157099999999995 -0.69693841025922532 0.18631004100784529 0.69250662157484011 +-0.70717300000000005 0.156079 0.68959800000000004 -0.71537942770753027 0.17007047089356156 0.67772288536162684 +-0.9496837222222223 0.23785461111111114 0.20207944444444448 -0.94861232896928716 0.23743102670924657 0.20919167498554567 +-0.54642727777777778 0.83706338888888898 0.017980883333333333 -0.54804592063504842 0.83636135974086612 0.012055903437396466 +-0.56986272222222223 0.82052500000000006 0.038781744444444446 -0.56537253254917719 0.82376026015320847 0.042106213689287089 +-0.95737461111111111 0.11857641111111111 0.26212472222222222 -0.95748924261049206 0.112208717044104 0.26575092493630686 +-0.8034865555555557 0.18225488888888891 0.56619688888888897 -0.80750215514867785 0.18500026696908062 0.56010282149941859 +-0.72739255555555571 0.26071327777777775 0.63424300000000011 -0.72841863240722293 0.25377752315238072 0.63639866805692946 +-0.796244888888889 0.30326661111111114 0.52283733333333338 -0.80064340072457874 0.29842502974182072 0.51953117952609418 +-0.99747061111111113 -4.3368086899420177e-19 -0.066027105555555562 -0.99733709501384338 0 -0.072929547573996431 +-0.82737416666666685 0.44531800000000005 0.3412486111111111 -0.82939663789348583 0.43966966189157797 0.34466187120586389 +-0.78656727777777768 0.55215255555555565 -0.27522161111111115 -0.78432765572944274 0.55767059215724279 -0.2717234607113394 +-0.82737416666666685 0.44531800000000005 -0.3412486111111111 -0.82939663789348594 0.43966966189157802 -0.3446618712058635 +-0.95737461111111111 0.11857641111111111 -0.26212472222222222 -0.95748924261049195 0.11220871704410373 -0.26575092493630714 +-0.63424300000000011 0.72739255555555571 0.26071327777777775 -0.63639866805692946 0.72841863240722293 0.25377752315238078 +-0.7528193333333334 0.65410794444444442 0.068852516666666669 -0.74860458609881297 0.65907084566498109 0.072227377539764298 +-0.73211922222222225 0.64923744444444442 0.20448750000000002 -0.72922160028600269 0.65414251623789987 0.20083183544017655 +-0.66640616666666663 0.7334316111111111 0.13171617222222221 -0.66784510328733937 0.73382922312113563 0.12440895992071306 +-0.52283733333333338 0.796244888888889 0.30326661111111114 -0.51953117952609429 0.80064340072457885 0.29842502974182078 +-0.56619688888888886 0.80348655555555559 0.18225488888888888 -0.56010282149942148 0.80750215514867607 0.18500026696907951 +-0.91482127777777766 0.22998205555555556 0.33097694444444448 -0.91284890386869511 0.22907161979226712 0.3379838335060848 +-0.93384100000000014 0.35669555555555549 2.1684043449710089e-19 -0.93415927591642067 0.35685633736846878 4.122220386358486e-05 +-0.7528193333333334 0.65410794444444453 -0.068852516666666669 -0.74860458609881209 0.65907084566498175 -0.072227377539766546 +-0.63424300000000011 0.72739255555555571 -0.26071327777777775 -0.63639866805692902 0.72841863240722293 -0.25377752315238217 +-0.52283733333333349 0.796244888888889 -0.3032666111111112 -0.51953117952609296 0.80064340072457829 -0.29842502974182439 +-0.91482127777777777 0.22998205555555556 -0.33097694444444448 -0.91284890386869444 0.22907161979226678 -0.33798383350608691 +-0.46847355555555559 0.77608166666666667 0.42135327777777787 -0.47160061355993166 0.77780808754094399 0.41546051586859017 +-0.46027055555555552 0.64127100000000004 0.6133656666666667 -0.45650201705245275 0.63890559189202323 0.61919750732391166 +-0.98330661111111117 0.12116736666666666 0.13317721111111114 -0.9827228972713633 0.12101573129925849 0.14003892300601037 +-0.77608166666666667 0.42135327777777787 0.46847355555555559 -0.77780808754094399 0.41546051586859017 0.47160061355993166 +-0.64127100000000004 0.6133656666666667 0.46027055555555552 -0.63890559189202323 0.61919750732391166 0.45650201705245275 +-0.58693700000000004 0.71182900000000005 0.38485688888888897 -0.58981619764168025 0.71337613272082079 0.37843274998841775 +-0.92452216666666687 0.35434750000000009 0.13780929444444445 -0.92662540228961998 0.34835515406796136 0.14147102341429091 +-0.90050594444444454 4.3368086899420177e-19 0.43422022222222229 -0.89935744418860264 0.00608774762538173 0.43717173617629285 +-0.6133656666666667 0.46027055555555552 0.64127100000000004 -0.61919750732391166 0.45650201705245269 0.63890559189202312 +-0.73211922222222225 0.64923744444444453 -0.20448749999999999 -0.72922160028600247 0.65414251623789943 -0.20083183544017855 +-0.45328572222222219 0.86514772222222236 0.21312049999999999 -0.46005659684907113 0.86225232066584678 0.21182271644470307 +-0.59434344444444454 0.80154466666666668 0.061161461111111114 -0.59555205960658975 0.80147246699299546 0.054402471915442736 +-0.58693699999999993 0.71182900000000005 -0.38485688888888897 -0.58981619764167759 0.71337613272082068 -0.37843274998842213 +-0.81494088888888883 0.5619532777777777 -0.13924307777777778 -0.81227206434124688 0.56726128730848824 -0.13575244164259401 +-0.8825426666666667 0.46425161111111113 0.069884822222222226 -0.88011186107951078 0.47012486878553988 0.066224766791124254 +-0.43422022222222229 0.90050594444444454 4.3368086899420177e-19 -0.43717173617629279 0.89935744418860253 0.0060877476253817292 +-0.49538216666666668 0.86270588888888911 0.098961244444444443 -0.49157165050389362 0.86573472660895023 0.094131267728656903 +-0.69377355555555564 0.63683855555555557 0.33529638888888891 -0.69125857906576693 0.64204640936346036 0.33156897486264408 +-0.52819516666666666 0.68325033333333329 0.5034616666666667 -0.53176094050308254 0.68541575936630394 0.49742892855923659 +-0.86270588888888911 0.098961244444444443 0.49538216666666668 -0.86573472660895023 0.094131267728656903 0.49157165050389362 +-0.63683855555555557 0.33529638888888891 0.69377355555555564 -0.64204640936346036 0.33156897486264408 0.69125857906576693 +-0.68325033333333329 0.5034616666666667 0.52819516666666666 -0.68541575936630394 0.49742892855923659 0.53176094050308254 +-0.86514772222222236 0.21312049999999999 0.45328572222222219 -0.86225232066584678 0.21182271644470307 0.46005659684907113 +-0.80154466666666668 0.061161461111111114 0.59434344444444454 -0.80147246699299546 0.054402471915442736 0.59555205960658975 +-0.78033200000000003 0.042275100000000003 0.62393500000000002 -0.78407127489047468 0.059746338909362595 0.61778848393163921 +-0.74702500000000005 0.44971800000000001 -0.48959900000000001 -0.75508871558387747 0.46124764935000617 -0.46593093647769734 +-0.59434344444444454 0.80154466666666668 -0.061161461111111121 -0.59555205960658975 0.80147246699299557 -0.054402471915442729 +-0.64150099999999999 0.61357099999999998 -0.46044200000000002 -0.65673447269235907 0.61424222388299454 -0.43750008317343481 +-0.49538216666666668 0.86270588888888911 -0.098961244444444443 -0.49157165050389273 0.8657347266089509 -0.09413126772865571 +-0.92452216666666687 0.35434750000000004 -0.13780929444444445 -0.92662540228961932 0.34835515406796236 -0.14147102341429241 +-0.89724905555555579 0.34646733333333335 0.27242099999999997 -0.89882246463749638 0.34067182429932835 0.27579137983545515 +-0.60983299999999996 0.316411 0.72662700000000002 -0.61932455774524731 0.32238657214267979 0.71589384008786283 +-0.77634800000000004 0.42150300000000002 -0.46863500000000002 -0.77588152683094125 0.43625185329312871 -0.45573257160400304 +-0.85372577777777792 0.33086838888888892 0.40125088888888893 -0.85496615637444284 0.32494888289771667 0.40427848688476831 +-0.85372577777777781 0.33086838888888898 -0.40125088888888893 -0.85496615637444262 0.32494888289771789 -0.40427848688476786 +-0.86369744444444452 0.4583800555555555 0.20788044444444445 -0.86616824898877876 0.45283443719162808 0.2114084599467447 +-0.30181000000000002 0.95256300000000005 0.0391817 -0.32180688571102561 0.94600646206740135 0.038885756205701984 +-0.73364399999999996 0.131776 0.66663399999999995 -0.74151199518419464 0.14566234621322263 0.65493697551261676 +-0.50593500000000002 0.79132199999999997 -0.343277 -0.51143821345764495 0.79346878547286259 -0.32990641141916699 +-0.95620099999999997 0.078785400000000005 -0.28190999999999999 -0.96053907952743656 0.085293134523931863 -0.26474470325894617 +-0.99527699999999997 -0.040669700000000003 -0.088143899999999997 -0.99621899529180924 -0.02031637445214958 -0.084468682651608992 +-0.34134199999999998 0.82764800000000005 0.44551600000000002 -0.36647338809820029 0.82188399531177481 0.43612378296325494 +-0.97094899999999995 0 -0.239285 -0.97492814521969429 0.020036039453891236 -0.22161603908898064 +-0.331038 0.915126 -0.230126 -0.35532110021242136 0.90819294791581795 -0.22120688302991567 +-0.35457899999999998 0.89672200000000002 -0.26488299999999998 -0.36371084954020677 0.89862402582053635 -0.2453350324450892 +-0.80071099999999995 0.020565699999999999 0.59869700000000003 -0.80746719704491621 0.039892119918317308 0.58856209907268831 +-0.74167483333333351 0.53379438888888886 0.40531733333333336 -0.73972208925562632 0.53965196194684129 0.40197884351569579 +-0.74167483333333351 0.53379438888888897 -0.40531733333333336 -0.7397220892556251 0.53965196194684439 -0.40197884351569385 +-0.99217522222222232 0.12202262222222222 -1.3010426069826053e-18 -0.99248982549914533 0.12212601651507285 0.0070130143901431068 +-0.67883666666666675 0.73387122222222234 1.951563910473908e-18 -0.67924929250052091 0.73386636530991478 0.0077818059829597485 +-0.38394200000000006 0.91612616666666669 0.11263961111111111 -0.37990979769417871 0.91886656680883305 0.10654941584502681 +-0.54876899999999995 0.73479000000000005 -0.39866800000000002 -0.56076995279975261 0.73401997436425093 -0.38308189368758688 +-0.56871099999999997 0.70405399999999996 -0.42529400000000001 -0.58091329232488209 0.70342033053508191 -0.4095602341416732 +-0.36277999999999999 0.75852699999999995 0.54131899999999999 -0.38795830027020761 0.75270719006440567 0.53190247534374024 +-0.382795 0.72741100000000003 0.56950999999999996 -0.39701899662445073 0.7299388794828412 0.55638579110060737 +-0.52563517762968126 0.85049595564708425 -8.6736173798840355e-19 -0.53286827537195869 0.84619820438365057 6.5053341907911413e-18 +-0.54131899999999999 0.36277999999999999 0.75852699999999995 -0.56127687658847891 0.3691653923107075 0.74073286745436295 +-0.40125088888888893 0.85372577777777792 0.33086838888888892 -0.40427848688476836 0.85496615637444284 0.32494888289771673 +-0.83627799999999997 0.32328800000000002 -0.442859 -0.83690830869121813 0.33795646325074835 -0.43054606233323084 +-0.98045000000000004 -6.1593100000000002e-19 -0.196769 -0.98045994040191098 -5.4896080364669229e-05 -0.19671884061650372 +-0.983657 -0.0403062 -0.175484 -0.98733141454440743 -0.020272978151031067 -0.15737116702441764 +-0.85049595564708425 -2.1684043449710089e-19 0.52563517762968126 -0.84619820438365057 6.5053341907911413e-18 0.53286827537195869 +-0.83699800000000002 -0.018297399999999998 0.54689900000000002 -0.84109901036312684 -0.0006223010203983729 0.54088082560542738 +-0.85529599999999995 -0.029605800000000002 0.517293 -0.85793680498015401 -0.011019552948905177 0.5136370392731151 +-0.77289299999999994 0.51966566666666669 0.36316266666666669 -0.77525724683632291 0.5142765787888488 0.36673669265155534 +-0.99956166666666668 0.013604699999999999 0 -0.99988372058015584 0.013629673108110113 -0.0068393954229029521 +-0.78783499999999995 0.52574633333333332 0.31970700000000002 -0.78586803119594739 0.53135648596864626 0.31634114870382823 +-0.80185966666666664 0.50398500000000002 0.31988800000000001 -0.80422451138794693 0.49861910324694281 0.32342220882313033 +-0.81546433333333335 0.49557666666666661 0.297875 -0.81785066340747914 0.49020047591881771 0.30136984881190576 +-0.81546433333333335 0.49557666666666672 -0.297875 -0.81785066340747914 0.4902004759188176 -0.30136984881190587 +-0.80185966666666664 0.50398500000000002 -0.31988800000000001 -0.80422451138794648 0.49861910324694259 -0.32342220882313183 +-0.99956166666666668 -0.013604699999999999 0 -0.99996783263413735 -0.0068216811251523412 -0.0042188106869880991 +-0.93659933333333323 0.16855100000000001 -0.30612900000000004 -0.93692474218610955 0.16240931835947478 -0.30950806255977042 +-0.57885033333333336 0.7680486666666666 0.27272099999999999 -0.57567345520774471 0.77242629943301855 0.26824929620297133 +-0.76366033333333327 0.64510233333333333 2.3129646346357427e-18 -0.75994660362472921 0.64997687859126629 0.0033491694482402413 +-0.75307866666666667 0.64288299999999998 0.13748199999999999 -0.74853514111358355 0.64796557746314509 0.14083945803971382 +-0.30612900000000004 0.93659933333333323 0.16855100000000001 -0.32042629145449342 0.93229701962588485 0.16777740891256079 +-0.69375566666666666 0.69718433333333341 0.1788173333333333 -0.69272430128514717 0.69666909427137036 0.18650795022227099 +-0.5811776666666667 0.7578826666666667 0.29526266666666667 -0.58354064449288279 0.75900226565195095 0.28878344301575909 +-0.59284466666666669 0.77091966666666656 0.231459 -0.59490829083334629 0.77172429004474563 0.224779326568704 +-0.93659933333333323 0.16855100000000001 0.30612900000000004 -0.93692474218610955 0.16240931835947478 0.30950806255977042 +-0.61583966666666667 0.77343700000000004 0.14808233333333334 -0.61020748195835961 0.77769021399991445 0.15114483124078501 +-0.7578826666666667 0.29526266666666667 0.5811776666666667 -0.75900226565195095 0.28878344301575909 0.58354064449288279 +-0.93617499999999998 0.34366800000000003 -0.068979233333333334 -0.93602631680507398 0.34349602657608669 -0.076584684988368859 +-0.7680486666666666 0.27272099999999999 0.57885033333333336 -0.77242629943302044 0.26824929620296939 0.57567345520774327 +-0.74740133333333336 0.66387866666666662 2.3129646346357427e-18 -0.74354807872366546 0.66867393047994539 0.0033807281533855069 +-0.58117766666666659 0.7578826666666667 -0.29526266666666667 -0.5835406444928789 0.7590022656519525 -0.28878344301576314 +-0.57885033333333336 0.7680486666666666 -0.27272099999999999 -0.5756734552077426 0.77242629943301921 -0.26824929620297372 +-0.94036500000000001 0.18248266666666665 -0.28591433333333333 -0.93876161227415711 0.18183151327891484 -0.29268402091526075 +-0.94036500000000001 0.18248266666666668 0.28591433333333333 -0.938761612274157 0.181831513278917 0.29268402091526002 +-0.48935600000000007 0.73308833333333334 0.47160733333333332 -0.4927127487950147 0.73512444694758228 0.4656459971640175 +-0.39967966666666666 0.67766533333333323 0.61670666666666663 -0.4057082751091835 0.66658297433696267 0.62535424667305106 +-0.9801036666666666 0.17508766666666667 0.089676533333333322 -0.97980797925647178 0.17494393426128732 0.096803634490300355 +-0.9801036666666666 0.17508766666666667 -0.089676533333333322 -0.97980797925647156 0.17494393426128724 -0.096803634490302715 +-0.73308833333333334 0.47160733333333332 0.48935600000000007 -0.73512444694758217 0.46564599716401744 0.49271274879501464 +-0.67766533333333323 0.61670666666666663 0.39967966666666666 -0.67529430507839372 0.62228451488397507 0.39590350347566416 +-0.56508966666666671 0.75308399999999998 0.33594766666666659 -0.5620912979229169 0.75773911645994707 0.33148876932081661 +-0.85275266666666683 0.50849633333333333 0.11638163333333335 -0.85023870611270813 0.51416078857641512 0.11283982505421924 +-0.52923299999999995 0.73907899999999993 0.41591 -0.52632608030381212 0.74415674792463482 0.41135336598872835 +-0.90817599999999998 0.36339733333333335 0.20605833333333332 -0.91006734464879224 0.35752579751229385 0.2096490694400874 +-0.47160733333333332 0.48935600000000007 0.73308833333333334 -0.4682734800155286 0.50279225411793382 0.72658096390777638 +-0.87451599999999996 0.011107333333333332 0.484402 -0.87327349468882909 0.017454459367511759 0.48691759602847318 +-0.61670666666666663 0.39967966666666666 0.67766533333333323 -0.62228451488397507 0.39590350347566416 0.67529430507839372 +-0.75308399999999998 0.33594766666666659 0.56508966666666671 -0.75773911645994707 0.33148876932081667 0.5620912979229169 +-0.90817600000000009 0.36339733333333335 -0.20605833333333332 -0.91006734464879269 0.35752579751229241 -0.20964906944008832 +-0.73907899999999993 0.41591 0.52923299999999995 -0.74415674792463482 0.41135336598872835 0.52632608030381212 +-0.8527526666666666 0.50849633333333333 -0.11638163333333333 -0.85023870611270924 0.5141607885764129 -0.11283982505422124 +-0.67766533333333323 0.61670666666666663 -0.39967966666666666 -0.67529430507839383 0.62228451488397507 -0.39590350347566428 +-0.39742499999999997 0.66042066666666666 0.63655099999999998 -0.4057082751091835 0.66658297433696267 0.62535424667305106 +-0.45502866666666669 0.50961199999999995 0.72975599999999996 -0.4682734800155286 0.50279225411793382 0.72658096390777638 +-0.70626633333333333 0.36633966666666667 0.60522599999999993 -0.70779537966296246 0.35975178512851885 0.60795094672564387 +-0.76558033333333331 0.085767633333333329 0.63713500000000001 -0.77323281423122159 0.077653387717214403 0.62934963761974561 +-0.76758566666666661 0.59794999999999998 -0.22930300000000001 -0.76500174879047678 0.60316909560327436 -0.2257418137090256 +-0.48575733333333332 0.85913700000000004 0.15916633333333333 -0.49236164203072019 0.85597689550574485 0.15774526242382089 +-0.70640999999999998 0.65384799999999998 -0.26978799999999997 -0.70479467267294238 0.65296399002289907 -0.27731299483654781 +-0.62453233333333336 0.77336900000000008 0.10615883333333336 -0.61921792024752453 0.77757536492117973 0.10929647346563649 +-0.60260966666666671 0.72989533333333334 -0.32161633333333334 -0.60506997784073069 0.73117473379442233 -0.31507749931798262 +-0.84843866666666656 0.52034900000000006 -0.093204899999999993 -0.84495153855592087 0.52601430444535291 -0.096777316613210582 +-0.64234066666666667 0.66917433333333332 -0.37270666666666669 -0.64507244158114818 0.67076762158679837 -0.36599500398683832 +-0.84843866666666667 0.52034900000000006 0.093204899999999993 -0.84495153855591643 0.52601430444536001 0.096777316613210984 +-0.465366 0.87173933333333331 -0.15137733333333334 -0.46147336445081139 0.87506756832444721 -0.14594205963048348 +-0.37959833333333332 0.92474699999999999 -0.012602500000000001 -0.38307647295871616 0.9235192143889186 -0.019096505439074183 +-0.37959833333333332 0.92474699999999999 0.012602500000000001 -0.38307647295871666 0.92351921438891849 0.019096505439074183 +-0.465366 0.87173933333333331 0.15137733333333334 -0.46147336445081139 0.87506756832444721 0.14594205963048348 +-0.66042066666666666 0.63655099999999998 0.39742499999999997 -0.66331585323080933 0.63827653991955358 0.39065987436772392 +-0.50961199999999995 0.72975599999999996 0.45502866666666669 -0.50673295418397113 0.73504735835047963 0.45047429907372849 +-0.92474699999999999 0.012602500000000001 0.37959833333333332 -0.92351921438891826 0.019096505439074589 0.38307647295871694 +-0.87173933333333331 0.15137733333333334 0.465366 -0.87506756832444721 0.14594205963048346 0.46147336445081144 +-0.63655099999999998 0.39742499999999997 0.66042066666666666 -0.63827653991955358 0.39065987436772392 0.66331585323080933 +-0.72975599999999996 0.45502866666666669 0.50961199999999995 -0.73504735835047952 0.45047429907372849 0.50673295418397124 +-0.85913700000000004 0.15916633333333333 0.48575733333333332 -0.85597689550574485 0.15774526242382092 0.49236164203072025 +-0.77336900000000008 0.10615883333333336 0.62453233333333336 -0.78103480899705635 0.10543516307432657 0.61552258571267882 +-0.38578466666666666 0.91196566666666667 -0.13735133333333335 -0.38170698678408682 0.91489615052823081 -0.1313956239333629 +-0.63713500000000001 0.76558033333333331 0.085767633333333329 -0.63830921052516987 0.76577763557673062 0.078396202773134777 +-0.34578333333333333 0.92738500000000013 -0.14052333333333333 -0.35526703821093636 0.92513910167343838 -0.13380199593314146 +-0.63713500000000012 0.76558033333333331 -0.085767633333333329 -0.63830921052516876 0.76577763557673173 -0.078396202773132015 +-0.66042066666666666 0.63655099999999998 -0.39742499999999997 -0.66331585323081155 0.63827653991955335 -0.39065987436772048 +-0.62453233333333336 0.77336900000000008 -0.10615883333333333 -0.61921792024752453 0.7775753649211794 -0.10929647346563828 +-0.48575733333333332 0.85913700000000004 -0.15916633333333333 -0.49236164203071847 0.85597689550574585 -0.15774526242382142 +-0.97537799999999997 0.18801833333333332 -0.11218733333333335 -0.9764931715377293 0.18163303536640046 -0.11606259691982868 +-0.91777433333333336 0.33882699999999999 -0.20539200000000002 -0.91668255996789427 0.33821761363490599 -0.2128425006379534 +-0.92474699999999999 -0.012602500000000001 0.37959833333333332 -0.92527214855994633 0 0.37930390335357811 +-0.91777433333333336 0.33882699999999999 0.20539200000000002 -0.91668255996789394 0.33821761363490749 0.21284250063795271 +-0.97537799999999997 0.18801833333333332 0.11218733333333332 -0.97649317153772908 0.18163303536640471 0.11606259691982385 +-0.40547466666666665 0.80963433333333334 0.42354566666666665 -0.408691595668839 0.81144548502237668 0.41776477169150822 +-0.94234466666666672 0.30424066666666666 0.13681299999999999 -0.94173031487740799 0.30386966027528961 0.14424716151480435 +-0.99207933333333331 0.054101533333333333 0.11027263333333333 -0.99164764746382228 0.054013020860459802 0.11712188888928619 +-0.86487900000000006 0.40426999999999996 0.29640233333333338 -0.86674451897969007 0.3985820613477869 0.29981040540717491 +-0.80963433333333334 0.42354566666666665 0.40547466666666665 -0.81144548502237668 0.41776477169150827 0.408691595668839 +-0.74252466666666672 0.58916000000000002 0.31757133333333337 -0.74020590226045235 0.59456587600237154 0.31398509734113539 +-0.7955836666666668 0.56853366666666671 0.20766399999999999 -0.79307922087067428 0.5738800737666252 0.20417397081111258 +-0.79716033333333325 0.44612266666666667 -0.4059733333333333 -0.79909671055864817 0.44039401856273125 -0.40926465225880038 +-0.86373599999999995 0.39010866666666666 -0.3179366666666667 -0.86545918830920177 0.38438648650835755 -0.32129024628976516 +-0.81024333333333332 0.54730766666666664 -0.20800033333333334 -0.80785581446410626 0.55275547300632644 -0.20452474201936535 +-0.74148199999999997 0.60197033333333339 -0.29520200000000002 -0.73906234222990586 0.60726071395459069 -0.29158408664569857 +-0.9934303333333333 0.067718666666666663 -0.088402033333333338 -0.99314918002006447 0.067643366773000799 -0.095284212528030668 +-0.91331600000000002 0.2833236666666667 -0.29138366666666671 -0.91162683613135609 0.28243667588778676 -0.29860682470196653 +-0.88811699999999993 0.235012 -0.39416099999999998 -0.890681142321188 0.24272715970079453 -0.38440945443239094 +-0.88821033333333332 0.289103 -0.35613033333333338 -0.88604481153509118 0.28797485361117353 -0.36331126550021547 +-0.5071836666666667 0.77994399999999997 0.36575233333333329 -0.50403015322344324 0.78467004695978271 0.36089683019622731 +-0.47919333333333336 0.83556433333333324 0.26749133333333336 -0.47564586046431578 0.83961015499386216 0.26232766353235332 +-0.7083356666666667 0.69966133333333325 -0.089924799999999985 -0.7038151510559455 0.70424258900951187 -0.09320197942788723 +-0.78020833333333339 0.6142103333333333 -0.1155074 -0.77599904496904304 0.61942346543754434 -0.11891195344655786 +-0.98179066666666659 0.067108333333333339 0.17578733333333332 -0.98236697934278294 0.073740260498035559 0.17180655365444594 +-0.39416099999999998 0.88811699999999993 -0.235012 -0.39029244070833502 0.89169613543267312 -0.22923745937426254 +-0.95185399999999998 0.18443866666666667 0.24347300000000002 -0.95246277304167826 0.17830859445972633 0.24702370556599079 +-0.39211200000000002 0.89509833333333333 0.21071133333333333 -0.39886049622107295 0.89271516295955666 0.20969011034469823 +-0.96942466666666649 0.18714233333333333 0.156526 -0.97035780623413448 0.18083800786474119 0.16032262096157779 +-0.31356300000000004 0.90261333333333338 0.29375033333333334 -0.32141623142252845 0.89646988933045202 0.30501367789328204 +-0.96258599999999994 0.25397200000000003 0.09068166666666666 -0.96227939571058341 0.25377396032399235 0.098067026325627263 +-0.64312566666666671 0.73996333333333342 0.195437 -0.64494437574753827 0.74062748064621042 0.18846136766792621 +-0.96987800000000002 0.21437700000000001 0.112605 -0.96942041966637416 0.214167697613143 0.11981755811631437 +-0.67335333333333336 0.68025100000000005 0.28840266666666664 -0.67561848758426213 0.68146714538505249 0.28132221560890297 +-0.95051299999999994 0.25157233333333334 -0.1803963333333333 -0.9495936030701162 0.25112435222994195 -0.18763941143961896 +-0.97059266666666666 0.13337166666666667 0.19870833333333335 -0.97101274551131977 0.12695397055556645 0.20252638695919456 +-0.96388766666666659 0.21337133333333336 -0.15716566666666668 -0.96498961593619315 0.20708100103663879 -0.16097360077038111 +-0.95781033333333332 0.052552533333333339 0.28139533333333333 -0.95740639511441361 0.046056106024188338 0.28504706574864452 +-0.97835466666666659 0.13419600000000001 -0.15533166666666667 -0.97838757513424479 0.14084256474460208 -0.15139724164955903 +-0.73996333333333342 0.195437 0.64312566666666671 -0.74062748064621031 0.18846136766792798 0.64494437574753793 +-0.97513733333333319 0.174405 -0.134158 -0.97481076842484271 0.18106185771060812 -0.13023275104731188 +-0.68025100000000005 0.28840266666666664 0.67335333333333336 -0.68146714538505249 0.28132221560890297 0.67561848758426213 +-0.77994399999999997 0.36575233333333329 0.5071836666666667 -0.78467004695978271 0.36089683019622731 0.50403015322344324 +-0.83556433333333324 0.26749133333333336 0.47919333333333336 -0.83961015499386216 0.26232766353235332 0.47564586046431578 +-0.79050733333333334 0.60483999999999993 0.092675333333333332 -0.78646561875409737 0.61011351204287267 0.096090233324964344 +-0.71420500000000009 0.69031900000000002 0.11276623333333331 -0.70950505689328325 0.69507800521822616 0.11605662800852996 +-0.78747599999999995 0.53911566666666666 0.29756199999999999 -0.78538004564948849 0.54467029029810388 0.29413000316558424 +-0.49762466666666666 0.82988799999999996 -0.25101366666666663 -0.49412565227007843 0.83384124532456627 -0.2460662865250868 +-0.65713566666666667 0.68726900000000002 -0.30847566666666665 -0.65950617715867399 0.68858179013179976 -0.30150741382002177 +-0.6616523333333334 0.72279800000000005 -0.197798 -0.66344152060850281 0.72354710316866455 -0.19059102347411691 +-0.99859100000000012 -0.013590633333333333 0.044029100000000009 -0.9988128753081037 -0.0068038108128106942 0.048234306019492121 +-0.92589466666666664 0.3410583333333333 0.16028966666666666 -0.92729951609022887 0.34172478535605449 0.15277361857397345 +-0.97400100000000001 0.10685479999999999 -0.19805566666666666 -0.97425477158224116 0.10036775147702315 -0.20187608702538642 +-0.89509833333333333 0.21071133333333333 0.39211200000000002 -0.89271516295955666 0.20969011034469823 0.39886049622107295 +-0.90261333333333338 0.29375033333333334 0.31356300000000004 -0.90075490292340932 0.29279158384639536 0.32080164165440095 +-0.94157666666666662 0.24970966666666664 -0.22448566666666667 -0.94036205292087072 0.24911249832849999 -0.23165097151313302 +-0.58663266666666669 0.65703199999999995 0.47272399999999998 -0.58998962692897738 0.65911767202191729 0.46634336549865762 +-0.93505400000000005 0.28885866666666665 -0.203819 -0.93397663141277909 0.28826917001433544 -0.2111599810430089 +-0.50478966666666658 0.65467133333333327 0.56203933333333334 -0.50864425512068367 0.65717775549865221 0.55623593861820786 +-0.94919133333333328 0.29215933333333338 0.11390889999999999 -0.95098005149307741 0.28595536523492054 0.11775597970203884 +-0.96664833333333344 0.25472800000000001 0 -0.9669663063002002 0.25479681426981771 -0.0073990484590429539 +-0.97059266666666666 0.13337166666666667 -0.19870833333333335 -0.97101274551132022 0.12695397055556867 -0.20252638695919101 +-0.99207933333333331 0.054101533333333333 -0.11027263333333333 -0.99164764746382206 0.054013020860459747 -0.11712188888928872 +-0.65703199999999995 0.47272399999999998 0.58663266666666669 -0.65911767202191718 0.46634336549865757 0.58998962692897738 +-0.65467133333333327 0.56203933333333334 0.50478966666666658 -0.65717775549865221 0.55623593861820786 0.50864425512068367 +-0.65713566666666667 0.68726900000000002 0.30847566666666665 -0.65950617715867343 0.68858179013179954 0.30150741382002344 +-0.74148199999999997 0.60197033333333339 0.29520200000000002 -0.73906234222990685 0.60726071395458969 0.2915840866456984 +-0.81012700000000004 0.58566899999999988 1.1564823173178713e-18 -0.80672946273972779 0.59091102649086835 -0.0034253057058179774 +-0.87879200000000013 0.47646799999999995 0 -0.87594527869572436 0.48239666909390189 0.0036499832572823737 +-0.80900833333333333 0.5853666666666667 0.046535400000000005 -0.80536664437786765 0.59066725196862824 0.049967645285347626 +-0.90939900000000007 0.404609 0.092631633333333338 -0.90740336917538711 0.41073675447775659 0.088963161647027986 +-0.825125 0.55223 0.11626180000000001 -0.82132486405654326 0.55774163148492695 0.11979040108052387 +-0.91331600000000002 0.2833236666666667 0.29138366666666665 -0.91162683613135653 0.28243667588778471 0.29860682470196687 +-0.80566133333333345 0.58445933333333333 0.092900399999999994 -0.80177649552426944 0.58980757151104324 0.09634043706080414 +-0.86373599999999995 0.39010866666666666 0.3179366666666667 -0.86545918830920299 0.38438648650835555 0.32129024628976438 +-0.47272399999999998 0.58663266666666669 0.65703199999999995 -0.46634336549865762 0.58998962692897738 0.65911767202191718 +-0.56203933333333334 0.50478966666666658 0.65467133333333327 -0.55623593861820786 0.50864425512068367 0.65717775549865221 +-0.68726900000000002 0.30847566666666665 0.65713566666666667 -0.68858179013179954 0.30150741382002344 0.65950617715867343 +-0.94919133333333328 0.29215933333333333 -0.11390890000000002 -0.95098005149307707 0.28595536523492232 -0.11775597970203766 +-0.90939899999999996 0.404609 -0.092631633333333338 -0.907403369175387 0.41073675447775648 -0.088963161647030178 +-0.79050733333333334 0.60484000000000004 -0.092675333333333332 -0.78646561875409549 0.61011351204287456 -0.096090233324967592 +-0.7955836666666668 0.56853366666666671 -0.20766399999999999 -0.79307922087067173 0.57388007376662842 -0.20417397081111341 +-0.41684100000000002 0.64266266666666672 0.64228433333333335 -0.42399511837129866 0.63996385947581835 0.64083882385676638 +-0.80963433333333334 0.42354566666666665 -0.40547466666666665 -0.81144548502237734 0.41776477169150611 -0.40869159566884011 +-0.99207933333333331 -0.054101533333333333 0.11027263333333333 -0.99240482996690904 -0.05487374096346978 0.11009780202631003 +-0.54026033333333323 0.42592233333333329 0.72526299999999999 -0.5452962766935473 0.42914770675804437 0.72005848124195149 +-0.48563733333333331 0.67302499999999998 0.55721300000000007 -0.48216266629032711 0.67100777744573958 0.56326523578428966 +-0.50354433333333326 0.44788500000000003 0.73833599999999999 -0.51615957150728675 0.44054448209603864 0.73450653913777197 +-0.49416866666666664 0.58555666666666661 0.64203733333333324 -0.49014431522370427 0.58311474774123595 0.64787015768636913 +-0.83002100000000001 0.094685866666666674 0.5491476666666667 -0.82633832091363435 0.093151227236951961 0.55541680587994924 +-0.45446199999999998 0.88853966666666662 0.058519000000000009 -0.45770120718577129 0.88673026138413047 0.064954202991948873 +-0.54445066666666675 0.83522233333333329 0.07397256666666667 -0.55071371438576 0.83154149343230865 0.072478614003066502 +-0.7083356666666667 0.69966133333333325 0.089924799999999985 -0.70381515105594539 0.70424258900951187 0.093201979427887216 +-0.6616523333333334 0.72279800000000005 0.197798 -0.66344152060850248 0.72354710316866433 0.19059102347411849 +-0.90159 0.41595233333333331 -0.11581156666666666 -0.9041258793861191 0.41022123517546549 -0.11947774870406765 +-0.89096966666666655 0.45328200000000002 0 -0.88829956329805226 0.45925001961072781 0.0036476474659192515 +-0.81024333333333332 0.54730766666666664 0.20800033333333334 -0.80785581446410548 0.55275547300632821 0.20452474201936305 +-0.78020833333333339 0.61421033333333341 0.1155074 -0.77599904496904393 0.61942346543754312 0.11891195344655889 +-0.5491476666666667 0.83002100000000001 -0.094685866666666674 -0.55541680587994735 0.8263383209136359 -0.093151227236949824 +-0.47047800000000001 0.88093966666666679 -0.045717566666666674 -0.47367208159418261 0.87915537869836757 -0.052159172002283656 +-0.45446199999999998 0.88853966666666684 -0.058519000000000009 -0.45770120718577312 0.88673026138412925 -0.064954202991952745 +-0.47047800000000001 0.88093966666666679 0.045717566666666674 -0.47367208159417801 0.87915537869837013 0.05215917200228512 +-0.49762466666666666 0.82988799999999996 0.25101366666666663 -0.49412565227007543 0.83384124532456649 0.24606628652509174 +-0.39416099999999998 0.88811699999999993 0.235012 -0.40111014452966087 0.88567646916365717 0.2338543220152067 +-0.67302499999999998 0.55721300000000007 0.48563733333333331 -0.67100777744573958 0.56326523578428966 0.48216266629032711 +-0.58555666666666661 0.64203733333333324 0.49416866666666664 -0.58311474774123651 0.64787015768636802 0.49014431522370522 +-0.4059733333333333 0.79716033333333325 0.44612266666666667 -0.40926465225880088 0.79909671055864806 0.44039401856273114 +-0.486458 0.79575833333333323 0.35979033333333338 -0.48320205370506963 0.80038418386237031 0.35482521544863521 +-0.69445199999999996 0.62386399999999997 -0.35754099999999994 -0.69203077337497509 0.62922690351361499 -0.35378936190437066 +-0.88853966666666684 -0.058519000000000009 0.45446199999999998 -0.89280395272116786 -0.047483374616635085 0.44793574443269779 +-0.66024299999999991 0.64999866666666672 -0.37535166666666669 -0.65786067131660375 0.64872408443505769 -0.38259168758451034 +-0.88093966666666679 0.045717566666666674 0.47047800000000001 -0.87915537869837013 0.05215917200228512 0.47367208159417801 +-0.82988799999999996 0.25101366666666663 0.49762466666666666 -0.83384124532456649 0.24606628652509174 0.49412565227007543 +-0.88811699999999993 0.235012 0.39416099999999998 -0.88567646916365717 0.2338543220152067 0.40111014452966087 +-0.55721300000000007 0.48563733333333331 0.67302499999999998 -0.56326523578428966 0.48216266629032711 0.67100777744573958 +-0.64203733333333324 0.49416866666666664 0.58555666666666661 -0.64787015768636802 0.49014431522370522 0.58311474774123639 +-0.79716033333333325 0.44612266666666667 0.4059733333333333 -0.79909671055864828 0.44039401856273125 0.40926465225880038 +-0.79575833333333323 0.35979033333333338 0.486458 -0.80038418386237031 0.35482521544863521 0.48320205370506963 +-0.88853966666666662 0.058519000000000009 0.45446199999999998 -0.88673026138413047 0.064954202991948873 0.45770120718577129 +-0.83522233333333329 0.07397256666666667 0.54445066666666675 -0.83154149343230854 0.072478614003066488 0.55071371438576 +-0.72279800000000005 0.197798 0.6616523333333334 -0.72354710316866433 0.19059102347412032 0.66344152060850214 +-0.85113933333333336 0.48120366666666664 -0.20809633333333333 -0.84913149454651216 0.48691927864691631 -0.20465903608483363 +-0.5491476666666667 0.83002100000000001 0.094685866666666674 -0.55541680587994913 0.82633832091363435 0.093151227236951961 +-0.8594763333333334 0.48395833333333332 -0.16242533333333334 -0.85729015236698847 0.4896869529383035 -0.1589348381462842 +-0.59016800000000003 0.80696699999999988 0 -0.5909612291105667 0.80666632059680043 -0.007367014520702893 +-0.886714 0.45208100000000001 -0.093025999999999998 -0.88445594026952357 0.45797227380334932 -0.089437610373616749 +-0.64312566666666671 0.73996333333333342 -0.195437 -0.6449443757475386 0.74062748064621053 -0.1884613676679246 +-0.86579899999999999 0.48595499999999997 -0.11634196666666667 -0.86342620828191075 0.49170321319073101 -0.11279686604614993 +-0.71420500000000009 0.69031900000000002 -0.11276623333333331 -0.70950505689328547 0.69507800521822405 -0.11605662800853019 +-0.81869099999999995 0.55018 0.16232933333333333 -0.81615883216746976 0.5555569967244075 0.15887474332186538 +-0.74252466666666672 0.58916000000000002 -0.31757133333333332 -0.7402059022604538 0.59456587600237121 -0.31398509734113256 +-0.84310399999999996 0.51867133333333337 0.13947866666666667 -0.84064736639470805 0.52423280975073394 0.13598517034769717 +-0.67335333333333336 0.68025100000000005 -0.28840266666666664 -0.67561848758426168 0.68146714538505226 -0.28132221560890458 +-0.60766633333333331 0.79385399999999995 0 -0.60841673740322078 0.79358332414804944 -0.0073879145739746722 +-0.54445066666666664 0.83522233333333329 -0.07397256666666667 -0.55071371438575767 0.8315414934323101 -0.072478614003067404 +-0.39211200000000002 0.89509833333333333 -0.21071133333333333 -0.3988604962210725 0.89271516295955677 -0.20969011034469831 +-0.47919333333333336 0.83556433333333346 -0.26749133333333336 -0.47564586046431373 0.83961015499386371 -0.26232766353235182 +-0.89509833333333333 0.21071133333333333 -0.39211200000000002 -0.8945836430607591 0.22441838558653693 -0.38646667874329416 +-0.97316533333333333 0.22856499999999999 0 -0.97348482854419649 0.2286362961356681 0.0072617273178821875 +-0.94745033333333328 0.30541266666666672 -0.091388200000000017 -0.94714630499905217 0.30518549098693637 -0.098872104345486891 +-0.86487900000000006 0.40426999999999996 -0.29640233333333338 -0.86674451897969018 0.39858206134778706 -0.29981040540717457 +-0.90261333333333338 0.29375033333333334 -0.31356299999999998 -0.90075490292340965 0.29279158384639542 -0.32080164165440017 +-0.88093966666666679 -0.045717566666666674 0.47047800000000001 -0.88556582162034936 -0.035138373824508899 0.46318297708664202 +-0.95067500000000005 0.065210166666666666 0.30218800000000001 -0.95032134560726178 0.058869783707050996 0.30565288915612826 +-0.95781033333333332 -0.052552533333333339 0.28139533333333333 -0.95817725084869765 -0.053265830875932035 0.28117451381149139 +-0.90159 0.41595233333333331 0.11581156666666666 -0.90412587938612021 0.41022123517546238 0.11947774870406962 +-0.94745033333333328 0.30541266666666667 0.091388199999999989 -0.94714630499905228 0.30518549098693631 0.098872104345486558 +-0.99343033333333342 0.067718666666666663 0.088402033333333338 -0.99314918002006425 0.067643366773000743 0.095284212528033194 +-0.97400099999999989 0.10685479999999999 0.19805566666666666 -0.97425477158224116 0.10036775147702312 0.20187608702538648 +-0.46239333333333338 0.87702533333333343 -0.12820000000000001 -0.4584930575925823 0.88016659891075499 -0.12284491972108266 +-0.95071200000000011 0.2652113333333333 0.15845133333333333 -0.94995293871590381 0.26481784541564923 0.16571337596715502 +-0.82634566666666665 0.512992 0.23085599999999998 -0.82422732983832869 0.51857550385034679 0.22743956461868695 +-0.85368566666666668 0.44141599999999998 0.27509233333333333 -0.85582148664388757 0.43586295898178562 0.2785553158464012 +-0.56228400000000001 0.81096399999999991 -0.15991200000000003 -0.55631566138132926 0.81488320691282745 -0.1627213691969196 +-0.38492966666666667 0.78580233333333338 0.48337000000000002 -0.39192762437768786 0.7902768238673411 0.47101515783232467 +-0.65308166666666667 0.74134766666666663 -0.152499 -0.64779101941242789 0.74574375744789889 -0.15566966112925465 +-0.78580233333333338 0.48337000000000002 0.38492966666666667 -0.78795806538569857 0.47780772978512109 0.38835790265065528 +-0.62975100000000006 0.76574933333333328 -0.12819266666666668 -0.62439601093608088 0.76998727876036943 -0.13133625574954749 +-0.75846266666666662 0.55494633333333321 0.34069333333333335 -0.75635608685024946 0.56052363866255128 0.33725171665251996 +-0.43225599999999997 0.87782600000000011 -0.20480499999999999 -0.42840399148712766 0.88133427653309726 -0.19929855264346252 +-0.75846266666666662 0.55494633333333343 -0.34069333333333329 -0.75635608685024736 0.56052363866255428 -0.3372517166525198 +-0.44779533333333332 0.87820433333333325 -0.16621833333333333 -0.44389085236663067 0.88154577838886183 -0.16074187939053641 +-0.78580233333333338 0.48337000000000002 -0.38492966666666667 -0.78795806538569824 0.47780772978512143 -0.38835790265065567 +-0.85368566666666668 0.44141599999999998 -0.27509233333333333 -0.85582148664388724 0.4358629589817859 -0.27855531584640186 +-0.82634566666666665 0.512992 -0.23085599999999998 -0.82422732983832858 0.51857550385034701 -0.22743956461868695 +-0.99636266666666662 0.067883199999999991 0.044236466666666668 -0.9963838699098394 0.067863492853656962 0.051124652773333792 +-0.99636266666666662 0.067883200000000005 -0.044236466666666668 -0.9963838699098394 0.067863492853656962 -0.05112465277333382 +-0.95948299999999997 0.17222033333333334 -0.22148599999999999 -0.96008295290377954 0.16594163099917869 -0.22517570616052571 +-0.93079100000000004 0.24733633333333335 -0.26791033333333331 -0.92927996516300548 0.24659535849110642 -0.27500813718376799 +-0.62168500000000004 0.71214633333333344 0.32508266666666669 -0.62416619523254113 0.71348946815858938 0.31835411031696542 +-0.54656866666666659 0.75857066666666662 0.35377466666666663 -0.54351793677866556 0.76333618881165943 0.34915056243740034 +-0.71228033333333329 0.69998833333333332 0.045047166666666666 -0.70806005434928998 0.70449501035845985 0.048350179057723187 +-0.71228033333333329 0.69998833333333332 -0.045047166666666666 -0.70806005434928787 0.70449501035846218 -0.048350179057721307 +-0.96912566666666666 0.22787766666666665 0.090339766666666668 -0.96827388382743496 0.23444795137290469 0.086486091337179799 +-0.32367233333333334 0.94016166666666656 0.10338779999999999 -0.3311736036703527 0.93644996227835042 0.11569577512108319 +-0.97937533333333338 0.18860866666666665 0.067428199999999994 -0.97923504472179479 0.18851326331064888 0.074575309216083394 +-0.36871933333333334 0.91232100000000005 0.17627566666666664 -0.37532063667939408 0.91014157955069441 0.1754329639934904 +-0.5360043333333333 0.80893300000000001 0.240173 -0.53261569555775756 0.81292932223895054 0.23551313740351429 +-0.60889233333333337 0.76388599999999995 0.21233233333333335 -0.6108394290685476 0.76458305805533811 0.205640315186391 +-0.93079100000000004 0.24733633333333335 0.26791033333333336 -0.92927996516300448 0.24659535849110747 0.27500813718377004 +-0.95948299999999997 0.17222033333333334 0.22148599999999999 -0.96008295290377987 0.16594163099918297 0.22517570616052096 +-0.80893300000000001 0.240173 0.5360043333333333 -0.81292932223895054 0.23551313740351432 0.53261569555775756 +-0.76388599999999995 0.21233233333333335 0.60889233333333337 -0.76458305805533711 0.20564031518639039 0.61083942906854904 +-0.71214633333333344 0.32508266666666669 0.62168500000000004 -0.71348946815858938 0.31835411031696542 0.62416619523254113 +-0.75857066666666662 0.35377466666666663 0.54656866666666659 -0.76333618881165943 0.34915056243740034 0.54351793677866567 +-0.79390499999999997 0.60570833333333329 -0.046424566666666667 -0.79011515187319126 0.61092791490957399 -0.049851073856478557 +-0.79390499999999997 0.60570833333333329 0.046424566666666667 -0.79011515187319092 0.61092791490957432 0.04985107385648023 +-0.60889233333333337 0.76388599999999995 -0.21233233333333335 -0.6108394290685476 0.76458305805533811 -0.205640315186391 +-0.5360043333333333 0.80893300000000001 -0.240173 -0.53261569555775667 0.81292932223895165 -0.2355131374035126 +-0.54656866666666659 0.75857066666666662 -0.35377466666666663 -0.55359415410163071 0.75489485576016901 -0.35166357401831322 +-0.62168500000000004 0.71214633333333344 -0.32508266666666669 -0.62416619523254091 0.7134894681585896 -0.31835411031696542 +-0.36871933333333334 0.91232100000000005 -0.17627566666666664 -0.37816637595496666 0.9101077339310748 -0.16939334324562666 +-0.32367233333333334 0.94016166666666656 -0.10338779999999999 -0.33117360367035303 0.9364499622783502 -0.11569577512108313 +-0.91232100000000005 0.17627566666666664 -0.36871933333333334 -0.91226504142130083 0.18997715828638431 -0.36287900673643603 +-0.94016166666666656 0.10338779999999999 0.32367233333333334 -0.94001455110956655 0.097221136438832331 0.32698729995493991 +-0.91232100000000005 0.17627566666666664 0.36871933333333334 -0.91014157955069441 0.1754329639934904 0.37532063667939408 +-0.52859633333333333 0.75163733333333338 0.39362766666666671 -0.52558986975230082 0.75661146373700161 0.38896578481340915 +-0.56844033333333321 0.69010933333333335 0.44713033333333335 -0.56573110516150704 0.69560424707062685 0.44281265576996143 +-0.43270133333333333 0.60621733333333339 0.66676166666666659 -0.43959342241024213 0.60343563223279073 0.66529922645788675 +-0.8741593333333334 0.448237 -0.18500266666666665 -0.87226383732852786 0.4540904957276336 -0.18154233605069528 +-0.96824666666666659 0.1734623333333333 0.17811533333333332 -0.96901160014443299 0.16710050047550851 0.18191740303324516 +-0.88711800000000007 0.41159166666666663 -0.20715033333333333 -0.8892894466046567 0.40591117468182031 -0.21071402047801255 +-0.9575326666666667 0.25299433333333332 0.13573933333333332 -0.95898012037253266 0.24673191513420487 0.13957252876010487 +-0.88726233333333349 0.37065766666666672 -0.27328033333333329 -0.88896961193760038 0.36493619269398281 -0.2766850272666237 +-0.9575326666666667 0.25299433333333332 -0.13573933333333332 -0.95898012037253266 0.24673191513420484 -0.13957252876010484 +-0.89832000000000001 0.37411466666666665 -0.22882 -0.90018936382514625 0.36834417313747281 -0.23233957771277344 +-0.96824666666666681 0.1734623333333333 -0.17811533333333332 -0.96901160014443299 0.16710050047550642 -0.18191740303324644 +-0.90979499999999991 0.098831166666666651 0.40237200000000001 -0.90779782046843382 0.10529195624222863 0.40597625682229971 +-0.75163733333333338 0.39362766666666671 0.52859633333333333 -0.75661146373700161 0.38896578481340915 0.52558986975230071 +-0.92208600000000007 0.062795833333333342 0.38106733333333337 -0.92045209254229532 0.069331913553990904 0.3846570304796883 +-0.69010933333333335 0.44713033333333335 0.56844033333333321 -0.69560424707062685 0.44281265576996143 0.56573110516150704 +-0.94615333333333329 0.025922166666666666 0.32170033333333331 -0.94504816080489829 0.032492402180593086 0.32531249216686087 +-0.60621733333333339 0.66676166666666659 0.43270133333333333 -0.60933963695998472 0.66864974072821837 0.42616045224018656 +-0.93196800000000002 0.0254641 0.36080433333333334 -0.93072619151734903 0.031991211980968173 0.36431486214482056 +-0.64155600000000002 0.68182433333333325 0.35048066666666666 -0.64417761721265054 0.68331502799398403 0.34367974918492489 +-0.42672700000000002 0.74024633333333334 0.51888433333333328 -0.43031481624311191 0.74257141516746727 0.51324151458922507 +-0.81501833333333329 0.57461866666666672 0.069812933333333341 -0.81127669562692939 0.58004985260737885 0.073295918186543962 +-0.40621499999999999 0.77051866666666669 0.49050400000000005 -0.41370749673404611 0.76793922060792985 0.4889943359571095 +-0.8592116666666666 0.51040266666666667 0.023347500000000004 -0.85606910857888263 0.51615839539286479 0.026947953585021549 +-0.94310333333333329 0.29077133333333333 0.15908700000000001 -0.94232903316217553 0.29032128949182034 0.16652189684076446 +-0.38479733333333338 0.79909666666666668 0.46117466666666668 -0.39236710167654804 0.79667676969368395 0.45973272904197526 +-0.92509966666666665 0.28642166666666663 0.24792833333333333 -0.92371401298963163 0.28569149297949875 0.25521127139242045 +-0.44713033333333335 0.56844033333333321 0.69010933333333335 -0.4517678401305939 0.57156411753670577 0.68499655339879262 +-0.66676166666666659 0.43270133333333333 0.60621733333333339 -0.66864974072821837 0.42616045224018656 0.60933963695998472 +-0.68182433333333325 0.35048066666666666 0.64155600000000002 -0.68331502799398403 0.34367974918492483 0.64417761721265043 +-0.92509966666666665 0.28642166666666663 -0.24792833333333333 -0.92371401298963063 0.28569149297950008 -0.25521127139242233 +-0.94310333333333352 0.29077133333333333 -0.15908700000000001 -0.9423290331621752 0.29032128949181979 -0.1665218968407669 +-0.8592116666666666 0.51040266666666667 -0.023347500000000004 -0.85606910857888263 0.51615839539286479 -0.026947953585021542 +-0.81501833333333329 0.57461866666666672 -0.069812933333333341 -0.81127669562693017 0.58004985260737785 -0.073295918186543282 +-0.64155600000000002 0.68182433333333325 -0.35048066666666666 -0.64417761721264988 0.68331502799398358 -0.34367974918492672 +-0.60621733333333327 0.66676166666666659 -0.43270133333333333 -0.60010626624401753 0.67813792847666066 -0.42426574122364386 +-0.95071200000000011 0.2652113333333333 -0.15845133333333333 -0.94995293871590447 0.26481784541564529 -0.16571337596715754 +-0.44483566666666663 0.69255433333333338 0.56726066666666652 -0.44132178373940228 0.69047027427160068 0.57313688028635257 +-0.96912566666666666 0.22787766666666665 -0.090339766666666654 -0.96827388382743562 0.23444795137290286 -0.086486091337178675 +-0.530864 0.46733033333333335 0.70645666666666662 -0.52516150273427764 0.47097737860154382 0.70879172179949557 +-0.81060299999999996 0.57337433333333332 0.11609513333333334 -0.81516384919802187 0.56816097492600415 0.11269873793347107 +-0.76528366666666681 0.17033933333333337 0.62024233333333345 -0.76955908667167139 0.17342408363417988 0.61457538132983147 +-0.78491366666666673 0.60333300000000001 0.13862866666666665 -0.78977294646896079 0.5982768684989791 0.13536425541771033 +-0.81039466666666671 0.11985033333333334 0.57299266666666671 -0.81426104685283174 0.12297498202123427 0.56732363019268606 +-0.67640700000000009 0.6563119999999999 -0.33322933333333332 -0.67432926819011041 0.65519559013053941 -0.34058593149994354 +-0.40879966666666667 0.89596266666666668 0.17178266666666667 -0.4047855585152268 0.89921363051880443 0.16602258372494677 +-0.69105033333333343 0.66134433333333331 -0.29050300000000001 -0.68928038046168461 0.66038496798852575 -0.29796686252902188 +-0.43996133333333337 0.89261233333333323 0.095399433333333339 -0.43580085237525801 0.89554756027352977 0.089845335756103872 +-0.67133866666666664 0.72445833333333332 -0.15433566666666665 -0.66617006348422581 0.728967499909568 -0.15755580152129087 +-0.63388266666666671 0.77276233333333322 0.0213279 -0.63476764166231714 0.7725789567217396 0.013849069615263583 +-0.63904300000000003 0.74907166666666669 -0.17287133333333335 -0.64073927206007164 0.7496386400507864 -0.16581644846859134 +-0.68441399999999997 0.72562366666666678 0.066507233333333332 -0.68541061871691356 0.72577596020978963 0.058834847936028105 +-0.32170033333333337 0.94615333333333329 -0.025922166666666666 -0.3348955198491228 0.94191163998673666 -0.025445102524491871 +-0.83572600000000008 0.51622199999999996 -0.18541133333333334 -0.83343328548439544 0.52181054957140371 -0.18194149884695324 +-0.88145000000000007 0.45051700000000006 -0.13919633333333334 -0.87937670074054175 0.45639309314145032 -0.13565383417898386 +-0.88145000000000007 0.450517 0.13919633333333334 -0.87937670074054197 0.45639309314144993 0.13565383417898408 +-0.83572600000000008 0.51622200000000007 0.18541133333333334 -0.83343328548439399 0.52181054957140682 0.18194149884695118 +-0.51263133333333333 0.83179066666666657 -0.21144266666666667 -0.51937906437705672 0.82838944494361133 -0.20980065536796771 +-0.53848333333333331 0.83172233333333334 -0.13303166666666669 -0.54492004699198227 0.82810678224403889 -0.13153440457796517 +-0.41863333333333336 0.90579366666666672 0.060890133333333339 -0.42194873846513697 0.90410814445318599 0.067436824073323215 +-0.34229266666666663 0.93706633333333345 0.064171566666666666 -0.35165294100359623 0.93435161769751562 0.057682437444657918 +-0.34229266666666663 0.93706633333333345 -0.064171566666666666 -0.35165294100359606 0.93435161769751574 -0.057682437444657626 +-0.41863333333333336 0.90579366666666672 -0.060890133333333339 -0.42194873846513786 0.90410814445318555 -0.06743682407332359 +-0.53848333333333331 0.83172233333333334 0.13303166666666666 -0.54492004699198604 0.82810678224403678 0.13153440457796253 +-0.51263133333333333 0.83179066666666668 0.21144266666666667 -0.51937906437705927 0.82838944494361066 0.20980065536796388 +-0.72738566666666671 0.5831803333333333 0.3607103333333333 -0.72515901134339633 0.58873065737464669 0.35712829814323638 +-0.69255433333333338 0.56726066666666652 0.44483566666666663 -0.69047027427160068 0.57313688028635257 0.44132178373940228 +-0.46733033333333335 0.70645666666666662 0.530864 -0.47097737860154382 0.70879172179949557 0.52516150273427764 +-0.42738333333333339 0.76859166666666656 0.47530133333333335 -0.43077019257902827 0.77066937243953504 0.4695804079910918 +-0.957121 0.22573400000000002 0.17963466666666669 -0.95821518598554145 0.21958206357096252 0.18332314285057411 +-0.91984566666666667 0.38031999999999999 0.092365500000000003 -0.92226052033247408 0.37443368855343678 0.096098623883706893 +-0.83172233333333334 0.13303166666666666 0.53848333333333331 -0.82810678224403689 0.13153440457796253 0.54492004699198604 +-0.83179066666666668 0.21144266666666667 0.51263133333333333 -0.828389444943611 0.20980065536796402 0.51937906437705861 +-0.5831803333333333 0.3607103333333333 0.72738566666666671 -0.58830324750178309 0.36394911437863414 0.72210825443410054 +-0.56726066666666652 0.44483566666666663 0.69255433333333338 -0.57313688028635257 0.44132178373940228 0.69047027427160068 +-0.70645666666666662 0.530864 0.46733033333333335 -0.70879172179949557 0.52516150273427764 0.47097737860154382 +-0.76859166666666656 0.47530133333333335 0.42738333333333339 -0.77066937243953504 0.4695804079910918 0.43077019257902827 +-0.89596266666666668 0.17178266666666667 0.40879966666666667 -0.89921363051880443 0.16602258372494677 0.4047855585152268 +-0.89261233333333323 0.095399433333333339 0.43996133333333337 -0.89554756027352977 0.089845335756103872 0.43580085237525801 +-0.76859166666666656 0.47530133333333335 -0.42738333333333339 -0.77066937243953615 0.46958040799109052 -0.43077019257902743 +-0.70645666666666662 0.530864 -0.46733033333333335 -0.71299010291467446 0.53421515880298542 -0.45415776691676535 +-0.62024233333333345 0.76528366666666681 0.17033933333333337 -0.61457538132983391 0.76955908667166983 0.1734240836341788 +-0.57299266666666671 0.81039466666666671 0.11985033333333334 -0.56732363019268606 0.81426104685283163 0.12297498202123427 +-0.57299266666666659 0.81039466666666671 -0.11985033333333332 -0.56732363019269194 0.81426104685282774 -0.12297498202123396 +-0.62024233333333334 0.76528366666666658 -0.17033933333333331 -0.61457538132983835 0.76955908667166673 -0.17342408363417691 +-0.69255433333333338 0.56726066666666652 -0.44483566666666663 -0.70358514576365794 0.55884114687399777 -0.4389356618244718 +-0.72738566666666671 0.5831803333333333 -0.3607103333333333 -0.72515901134339766 0.58873065737464292 -0.35712829814324015 +-0.68441399999999997 0.72562366666666678 -0.066507233333333332 -0.68541061871691122 0.72577596020979185 -0.05883484793602782 +-0.63388266666666659 0.77276233333333322 -0.0213279 -0.63476764166231425 0.77257895672174193 -0.013849069615265221 +-0.43996133333333337 0.89261233333333323 -0.095399433333333339 -0.43580085237525779 0.89554756027353 -0.089845335756103428 +-0.40879966666666667 0.89596266666666668 -0.17178266666666667 -0.40478555851522569 0.89921363051880498 -0.16602258372494683 +-0.99152333333333331 0.1083407 -0.066672933333333337 -0.99138998769079067 0.10827560874102048 -0.073636165423080657 +-0.98138033333333341 0.18889533333333333 -0.022494500000000001 -0.98154734302435331 0.18890534802977815 -0.02965776268670366 +-0.89535266666666669 0.41411966666666666 -0.16169066666666668 -0.89770291975186667 0.4084110330386006 -0.16531756095864961 +-0.87693233333333342 0.40834266666666669 -0.2520843333333333 -0.87894504702395804 0.40265962781541953 -0.25557939752570047 +-0.90579366666666672 0.060890133333333339 0.41863333333333336 -0.90410814445318599 0.067436824073323215 0.42194873846513697 +-0.93706633333333345 0.064171566666666666 0.34229266666666663 -0.93557127087762915 0.070833179066782742 0.34596106406893684 +-0.87693233333333342 0.40834266666666669 0.25208433333333335 -0.87894504702395693 0.40265962781542119 0.25557939752570163 +-0.89535266666666669 0.41411966666666666 0.16169066666666668 -0.89770291975186667 0.40841103303860016 0.16531756095865036 +-0.98138033333333341 0.18889533333333333 0.022494500000000001 -0.98154734302435265 0.18890534802978196 0.029657762686698959 +-0.99152333333333331 0.1083407 0.066672933333333337 -0.99138998769079067 0.10827560874102046 0.073636165423080657 +-0.33699166666666663 0.88216099999999997 0.32794299999999998 -0.34739504234236873 0.88112360434592474 0.32083933427868566 +-0.38305933333333336 0.83560033333333339 0.39287366666666662 -0.39050299487623924 0.83320247888691223 0.39151122610902539 +-0.448243 0.75252933333333327 0.48174699999999998 -0.45166981585712235 0.75464015189833467 0.47593341822827639 +-0.65384799999999998 0.26978799999999997 0.70640999999999998 -0.65882563641033198 0.27298298335787707 0.70102002225724913 +-0.93204233333333331 0.34265900000000005 0.11477476666666668 -0.93314089294629388 0.34314701905525424 0.1072296471358853 +-0.99082366666666655 0.0135059 0.13190333333333334 -0.99024265399362199 0.013486538246426618 0.13869967374797831 +-0.98819733333333326 0.13523933333333332 0.066924399999999995 -0.98805584750948217 0.13516985978345639 0.073991561738076916 +-0.99792933333333345 0.054364866666666671 0.022089066666666667 -0.99809991255386388 0.054369697504552846 0.028991387569981084 +-0.31066633333333332 0.91822966666666661 0.24427766666666664 -0.31708091584157094 0.91986749040706861 0.23087549220580375 +-0.88216099999999997 0.32794299999999998 0.33699166666666663 -0.88471295825504714 0.32939739480348468 0.32981864379122122 +-0.33417800000000003 0.89978666666666662 0.27934999999999999 -0.33808910550904386 0.89668911896521064 0.28573480828469072 +-0.83560033333333339 0.39287366666666662 0.38305933333333336 -0.83724221359370155 0.38707866519608619 0.38625844033073886 +-0.75252933333333327 0.48174699999999998 0.448243 -0.75464015189833467 0.47593341822827639 0.45166981585712235 +-0.78698500000000005 0.49789366666666668 0.36340366666666668 -0.78925240999627411 0.49239401663173693 0.36691792774452714 +-0.70640999999999998 0.65384799999999998 0.26978799999999997 -0.70479467267294227 0.65296399002290029 0.27731299483654515 +-0.76758566666666661 0.59795000000000009 0.22930300000000003 -0.76500174879047633 0.60316909560327592 0.22574181370902247 +-0.84640700000000002 0.50645033333333334 0.16249633333333333 -0.84406979811615768 0.5121238262359693 0.15898227105428958 +-0.82769799999999993 0.50003500000000001 0.25335033333333334 -0.82570502810573576 0.50570450234366338 0.24994832039894552 +-0.81505266666666676 0.36941800000000002 -0.44557533333333338 -0.82130042010977755 0.37231878741567836 -0.43225494845614176 +-0.8491063333333333 0.3845263333333333 -0.36120633333333335 -0.85072491442126907 0.37874348378578099 -0.36444546021693586 +-0.88776866666666665 0.39816433333333334 -0.22942100000000001 -0.88979840505496688 0.39240147024361355 -0.23298043804639001 +-0.84134999999999993 0.46429433333333331 -0.27543933333333337 -0.84362348998201264 0.45879542369625348 -0.27893756711125228 +-0.7735186666666668 0.61237266666666668 -0.16120433333333331 -0.77853690347198579 0.60738391140291692 -0.15800339901769681 +-0.75407966666666659 0.60629733333333335 -0.25115599999999999 -0.75151765294156647 0.61150609282538182 -0.2475510366664517 +-0.71116800000000013 0.59003299999999992 -0.38131833333333337 -0.70890793280855779 0.59565965362480766 -0.37767594554680267 +-0.77333333333333332 0.53363466666666659 -0.34131466666666666 -0.77133226789601028 0.53930071204673635 -0.33793679066991283 +-0.98179066666666659 0.067108333333333339 -0.17578733333333332 -0.98236697934278339 0.073740260498037474 -0.17180655365444233 +-0.99082366666666655 -0.0135059 -0.13190333333333334 -0.99178517435877034 -0.0067661867722486049 -0.12773561225714034 +-0.99792933333333345 -0.054364866666666671 -0.022089066666666667 -0.9982313602512044 -0.055201045773037596 -0.022067984878397 +-0.87240766666666669 0.3519316666666667 -0.33817800000000003 -0.87385423840641729 0.34611912009617785 -0.34143861047483776 +-0.88460299999999992 0.27425666666666665 -0.37628966666666663 -0.88227808718678835 0.27306946667847437 -0.38342984135035107 +-0.92261566666666672 0.16568633333333335 -0.34739533333333333 -0.92529999561685483 0.17297997398064335 -0.33748755045646417 +-0.42532333333333333 0.8185486666666667 0.38521833333333327 -0.42839710847502843 0.82010513309657784 0.37934613233678682 +-0.46225066666666664 0.83147599999999999 0.30709066666666668 -0.4587511241532331 0.83572586903813284 0.30184379720080817 +-0.50945999999999991 0.83918366666666666 0.18871566666666664 -0.51617476502425097 0.83580172950210074 0.18708041296046063 +-0.55621733333333334 0.7935566666666668 0.24544933333333332 -0.55288852066134253 0.79769549250502214 0.24082397089592744 +-0.69375566666666666 0.69718433333333341 -0.17881733333333336 -0.69272430128514695 0.69666909427137036 -0.18650795022227129 +-0.75307866666666679 0.64288299999999998 -0.13748199999999999 -0.74853514111358521 0.64796557746314287 -0.14083945803971601 +-0.82948300000000008 0.55351399999999995 -0.069904266666666673 -0.82591243697637506 0.55900058124443752 -0.073396162134857681 +-0.78704799999999997 0.61590633333333333 -0.02318863333333333 -0.78338299412773948 0.62097108768282216 -0.026570524523818553 +-0.42712433333333338 0.89007000000000003 -0.15726633333333331 -0.42314614003084272 0.89330010217195965 -0.15153307109857209 +-0.34739533333333333 0.92261566666666672 -0.16568633333333335 -0.3534082431497419 0.92298813249420142 -0.15230075820126199 +-0.43906033333333339 0.8545950000000001 0.27610266666666666 -0.4428134935284937 0.85112219891836305 0.28197023328263054 +-0.35613033333333338 0.88821033333333332 0.289103 -0.36331126550021559 0.88604481153509118 0.28797485361117314 +-0.36137766666666665 0.93070366666666671 0.050886266666666659 -0.36502863962319798 0.92921846382396145 0.057507727684847861 +-0.32475833333333332 0.93660599999999994 0.12905900000000001 -0.32867094192977053 0.93463255466382789 0.13578438678126564 +-0.706986 0.68900766666666657 0.15741033333333332 -0.71253214023460698 0.6844258919168752 0.15446406574501442 +-0.68642633333333336 0.68407633333333318 0.24532733333333331 -0.68844469340977232 0.68510252344690936 0.23807233455948076 +-0.64234066666666667 0.66917433333333332 0.37270666666666669 -0.64507244158114729 0.67076762158679903 0.36599500398683876 +-0.60260966666666671 0.72989533333333334 0.32161633333333334 -0.60506997784072791 0.73117473379442421 0.31507749931798351 +-0.98626099999999994 0.053858766666666669 0.15395899999999998 -0.98553329470949724 0.053751240861339394 0.16073247688289261 +-0.96906700000000001 0.053126699999999999 0.23962399999999998 -0.96880100156939641 0.046540654298456517 0.24343086668622338 +-0.93070366666666671 0.050886266666666659 0.36137766666666665 -0.92921846382396134 0.057507727684847416 0.3650286396231982 +-0.93660599999999994 0.12905900000000001 0.32475833333333332 -0.93661097008373928 0.1228748323020797 0.32811837239863972 +-0.68407633333333318 0.24532733333333331 0.68642633333333336 -0.68890344475793097 0.24846438758447367 0.6809386843930435 +-0.66917433333333332 0.37270666666666669 0.64234066666666667 -0.67076762158679903 0.36599500398683876 0.64507244158114729 +-0.72989533333333334 0.32161633333333334 0.60260966666666671 -0.73117473379442421 0.31507749931798351 0.60506997784072791 +-0.8185486666666667 0.38521833333333327 0.42532333333333333 -0.82010513309657784 0.37934613233678677 0.42839710847502843 +-0.83147599999999999 0.30709066666666668 0.46225066666666664 -0.83572586903813284 0.30184379720080817 0.4587511241532331 +-0.83918366666666666 0.18871566666666664 0.50945999999999991 -0.83580172950210108 0.1870804129604608 0.51617476502425041 +-0.7935566666666668 0.24544933333333332 0.55621733333333334 -0.79769549250502214 0.24082397089592744 0.55288852066134253 +-0.86782533333333334 0.26792600000000005 -0.41765333333333327 -0.87489911065577086 0.25764841568228636 -0.41008394271191495 +-0.77725566666666668 0.60104266666666673 0.18421899999999999 -0.77452027865281281 0.6061889964652234 0.18070207115596243 +-0.73650733333333329 0.66197633333333339 0.13666566666666666 -0.73182174996875138 0.66695967107811682 0.14000615496486118 +-0.66672633333333342 0.74198800000000009 0.065746466666666656 -0.66770622348079367 0.74215319872214924 0.058112208282758662 +-0.72190399999999999 0.69115666666666664 0.022636933333333335 -0.71778099415599816 0.69578410488358966 0.025979295982935562 +-0.41765333333333327 0.86782533333333334 -0.26792600000000005 -0.42334462759604402 0.86943171170077949 -0.25469162721734612 +-0.46397566666666673 0.82155833333333328 -0.33029600000000003 -0.46971916764604105 0.82386469499442905 -0.31719216239946213 +-0.56508966666666671 0.75308399999999998 -0.3359476666666667 -0.56209129792291423 0.75773911645994829 -0.33148876932081817 +-0.72339666666666658 0.6343293333333333 -0.27136433333333337 -0.72077251091362049 0.63941435217610454 -0.26764953529286678 +-0.68338033333333337 0.69481033333333331 -0.22262666666666664 -0.68528096861268695 0.69572320105804475 -0.21531191691777071 +-0.61583966666666667 0.77343700000000004 -0.14808233333333334 -0.61020748195836316 0.77769021399991123 -0.15114483124078729 +-0.59284466666666669 0.77091966666666656 -0.231459 -0.59490829083334729 0.77172429004474452 -0.22477932656870506 +-0.96511000000000002 0.013230166666666666 0.26024266666666662 -0.96639424395002105 0.019804902525625792 0.25630047033943903 +-0.92297966666666653 0.38112833333333329 0.046245866666666663 -0.92558692684680421 0.37521515029816055 0.050024312459218692 +-0.97317900000000002 0.066652000000000003 -0.21864833333333333 -0.97308297863106963 0.060095725620956525 -0.22248150588436777 +-0.96942466666666671 0.18714233333333333 -0.15652599999999997 -0.97035780623413459 0.18083800786474347 -0.1603226209615741 +-0.95185399999999998 0.18443866666666667 -0.24347300000000002 -0.95246277304167848 0.17830859445972211 -0.24702370556599276 +-0.8545950000000001 0.27610266666666666 0.43906033333333339 -0.85112219891836305 0.28197023328263054 0.4428134935284937 +-0.88821033333333332 0.289103 0.35613033333333338 -0.88604481153509118 0.28797485361117314 0.36331126550021559 +-0.92622133333333334 0.30024966666666669 0.22642999999999999 -0.92499859936706652 0.29958638636084534 0.23372117635382444 +-0.93752266666666673 0.22195833333333334 0.26666133333333336 -0.93604786651851102 0.22128896037937598 0.27357921631651538 +-0.9754856666666667 0.013347533333333333 0.21812066666666666 -0.97432715951755866 0.013302101343303454 0.2247434989633699 +-0.61909166666666671 0.58682400000000001 0.52120766666666662 -0.61690317697310926 0.59298236445217278 0.51749626635290347 +-0.97022466666666674 -0.026577699999999999 0.23935300000000001 -0.9686335278347431 -0.026915953275993328 0.2470316178420576 +-0.54404466666666662 0.63320566666666667 0.54987266666666679 -0.5478502093490385 0.63565620846605242 0.54387621087410787 +-0.4233276666666666 0.69372299999999998 0.58210099999999987 -0.43057847532739385 0.69102569647357381 0.58059078824758248 +-0.92402866666666661 0.38139066666666666 0 -0.92180623590250022 0.38763288722182038 -0.003742752374870731 +-0.46822133333333332 0.72146866666666665 0.50946199999999997 -0.47178022136037795 0.72371471387138386 0.50364713407227257 +-0.92666433333333342 0.3685053333333333 0.069218666666666664 -0.92911799838312503 0.36249943800450635 0.073033571232359887 +-0.95533000000000001 0.2934586666666667 0.022837133333333332 -0.95549324395593516 0.29344660324575023 0.030360365579072277 +-0.98309933333333321 0.17549666666666663 -0.044893366666666663 -0.98310986548934121 0.17545399672639003 -0.05206618298152426 +-0.98309933333333321 0.17549666666666663 0.044893366666666663 -0.98310986548934154 0.17545399672638801 0.052066182981523088 +-0.9690669999999999 0.053126699999999992 -0.23962399999999998 -0.97155742118613653 0.059919872423214671 -0.22909776565241713 +-0.98626099999999994 0.053858766666666669 -0.15395899999999998 -0.98553329470949724 0.053751240861341337 -0.16073247688289144 +-0.99792933333333345 0.054364866666666657 -0.022089066666666667 -0.9980999125538641 0.054369697504548758 -0.028991387569981035 +-0.98819733333333326 0.13523933333333332 -0.066924399999999995 -0.98805584750948228 0.13516985978345439 -0.073991561738078152 +-0.58682400000000001 0.52120766666666662 0.61909166666666671 -0.59298236445217278 0.51749626635290347 0.61690317697310926 +-0.63320566666666667 0.54987266666666679 0.54404466666666662 -0.63565620846605242 0.54387621087410787 0.5478502093490385 +-0.69372299999999998 0.58210099999999987 0.4233276666666666 -0.69153626177537608 0.58789561778403399 0.41970982981110611 +-0.72146866666666665 0.50946199999999997 0.46822133333333332 -0.72371471387138386 0.50364713407227257 0.47178022136037795 +-0.68338033333333337 0.69481033333333331 0.22262666666666667 -0.68528096861268906 0.69572320105804253 0.21531191691777093 +-0.72339666666666658 0.63432933333333341 0.27136433333333332 -0.72077251091361894 0.63941435217610787 0.26764953529286273 +-0.77333333333333332 0.53363466666666659 0.34131466666666666 -0.77133226789600973 0.53930071204673902 0.33793679066991 +-0.71116800000000013 0.59003300000000003 0.38131833333333337 -0.70890793280855735 0.59565965362480866 0.37767594554680212 +-0.37628966666666663 0.88460299999999992 0.27425666666666665 -0.38342984135034897 0.88227808718678913 0.27306946667847509 +-0.33817800000000003 0.87240766666666669 0.3519316666666667 -0.34473359131040449 0.87539952177230762 0.33887228907517075 +-0.91254999999999997 0.40545666666666663 -0.046381466666666669 -0.91035533692556203 0.41162135449004122 -0.042673423332679219 +-0.91254999999999997 0.40545666666666663 0.046381466666666669 -0.91035533692556214 0.41162135449004122 0.042673423332679233 +-0.89696566666666666 0.40099866666666667 0.18426133333333336 -0.89916619954909283 0.39521794737259502 0.18789071201907198 +-0.86921966666666661 0.473638 0.13936799999999999 -0.8669867281394934 0.47946617526273372 0.13581678839120653 +-0.88460299999999992 0.27425666666666665 0.37628966666666663 -0.88227808718678913 0.27306946667847509 0.38342984135034897 +-0.87240766666666669 0.3519316666666667 0.33817800000000003 -0.87385423840641674 0.34611912009617762 0.34143861047483937 +-0.84134999999999993 0.46429433333333331 0.27543933333333331 -0.84362348998201164 0.45879542369625476 0.27893756711125273 +-0.88776866666666676 0.39816433333333334 0.22942099999999999 -0.88979840505496699 0.39240147024361327 0.23298043804638979 +-0.52120766666666662 0.61909166666666671 0.58682400000000001 -0.51749626635290347 0.61690317697310926 0.59298236445217278 +-0.54987266666666679 0.54404466666666662 0.63320566666666667 -0.54387621087411042 0.54785020934903716 0.63565620846605164 +-0.58210099999999987 0.4233276666666666 0.69372299999999998 -0.58789561778403399 0.41970982981110611 0.69153626177537608 +-0.50946199999999997 0.46822133333333332 0.72146866666666665 -0.51444356399800606 0.47146469876576047 0.71628825013310127 +-0.69481033333333331 0.22262666666666667 0.68338033333333337 -0.69958676724384505 0.22576650097074502 0.67794383405761049 +-0.63432933333333341 0.27136433333333332 0.72339666666666658 -0.64329553737755441 0.27792264981404191 0.71339319614814445 +-0.59003300000000003 0.38131833333333337 0.71116800000000013 -0.59565965362480855 0.37767594554680212 0.70890793280855735 +-0.95533000000000001 0.2934586666666667 -0.022837133333333332 -0.95549324395593505 0.29344660324575045 -0.030360365579072079 +-0.9266643333333332 0.3685053333333333 -0.069218666666666664 -0.92911799838312392 0.36249943800450973 -0.073033571232358319 +-0.86921966666666661 0.473638 -0.13936800000000002 -0.86698672813949351 0.479466175262734 -0.13581678839120431 +-0.89696566666666666 0.40099866666666673 -0.18426133333333336 -0.89916619954909283 0.39521794737259475 -0.18789071201907209 +-0.7365073333333334 0.66197633333333339 -0.13666566666666666 -0.7318217499687496 0.66695967107811915 -0.14000615496485952 +-0.77725566666666668 0.60104266666666673 -0.18421899999999999 -0.77452027865281448 0.60618899646522062 -0.18070207115596457 +-0.82769799999999993 0.50003500000000001 -0.25335033333333329 -0.82570502810573598 0.50570450234366304 -0.24994832039894563 +-0.84640700000000002 0.50645033333333334 -0.16249633333333333 -0.84406979811615801 0.51212382623596819 -0.15898227105429136 +-0.46225066666666664 0.83147599999999999 -0.30709066666666668 -0.46936902125113544 0.82849236639082535 -0.30543922590571398 +-0.72146866666666665 0.50946199999999997 -0.46822133333333332 -0.71722232079543291 0.52228627623649215 -0.4613124626625989 +-0.69372299999999998 0.58210099999999987 -0.4233276666666666 -0.69968377873390342 0.57754182821501188 -0.4205806063511579 +-0.81854866666666659 0.38521833333333327 -0.42532333333333333 -0.82170604611030551 0.38720105801141941 -0.41818000246377873 +-0.78698499999999993 0.49789366666666668 -0.36340366666666668 -0.78925240999627422 0.49239401663173787 -0.36691792774452564 +-0.75252933333333338 0.48174699999999998 -0.448243 -0.75580479793942767 0.48384356982241633 -0.44119667649840871 +-0.9690669999999999 -0.053126699999999992 0.23962399999999998 -0.96942691840980122 -0.053878969775750629 0.23939195157394144 +-0.98626099999999994 -0.053858766666666669 0.15395899999999998 -0.98659498098831921 -0.054652534041547601 0.15376424815767611 +-0.99792933333333345 -0.054364866666666657 0.022089066666666667 -0.9982313602512044 -0.055201045773037569 0.022067984878397 +-0.559728 0.5970939999999999 0.57400033333333333 -0.55994620037192888 0.59735900477779025 0.57412757476011167 +-0.56423166666666669 0.63009233333333325 0.53283766666666665 -0.56704658136215702 0.62444740471079663 0.53714394096502771 +-0.53625699999999998 0.58218099999999995 0.61056333333333335 -0.5365278179115468 0.58231563453184998 0.61077524703187092 +-0.51848166666666662 0.60181733333333343 0.60686300000000004 -0.52511565719112763 0.59853198481846182 0.6049900905981872 +-0.524752 0.52701999999999993 0.66796766666666674 -0.51874676577863232 0.53067049118758136 0.67029144614633118 +-0.442803 0.54917199999999999 0.7082613333333333 -0.45630557666652244 0.54261329906249511 0.70523473282556615 +-0.51180999999999999 0.56587633333333331 0.64585599999999999 -0.50559691531690243 0.56946362135064565 0.64813805873458907 +-0.41395699999999996 0.62469333333333332 0.66158633333333328 -0.42253729274034357 0.63102572869157736 0.65059108968147195 +-0.93660599999999994 0.12905900000000001 -0.32475833333333332 -0.93265246963949344 0.14159484160179467 -0.33182867824694795 +-0.99082366666666666 0.0135059 -0.13190333333333334 -0.99024265399362199 0.01348653824642662 -0.13869967374797831 +-0.86274066666666671 0.041936266666666666 0.50345533333333337 -0.86568807684060856 0.037305954185398463 0.49919176615637961 +-0.82571500000000009 0.019053333333333332 0.56336366666666671 -0.82872041913392602 0.028888500372300327 0.55891673928835739 +-0.484402 0.87451599999999996 -0.011107333333333332 -0.48691759602847123 0.8732734946888302 -0.017454459367512616 +-0.52142733333333335 0.85163333333333335 0.048800966666666667 -0.52744699324391919 0.84822554935274741 0.048094560432330069 +-0.59213633333333338 0.79599699999999995 0.12320566666666666 -0.58650905296908507 0.80003949953512854 0.12626927563302187 +-0.52259766666666663 0.83897433333333327 0.14976733333333334 -0.52914679883788596 0.83549373783461456 0.14816841538857795 +-0.90789966666666666 0.41769333333333331 -0.023229066666666669 -0.9053476049192074 0.42381623217034836 -0.026935397082356281 +-0.85168633333333332 0.52129700000000001 0.046674766666666666 -0.84841767537666091 0.52693800205961572 0.05023733764724303 +-0.85168633333333332 0.52129700000000001 -0.046674766666666666 -0.84841767537666168 0.52693800205961483 -0.050237337647241621 +-0.7540796666666667 0.60629733333333335 0.25115600000000005 -0.75151765294156436 0.61150609282538471 0.24755103666645098 +-0.77351866666666658 0.61237266666666668 0.16120433333333331 -0.77853690347198412 0.60738391140291847 0.15800339901769919 +-0.78704799999999997 0.61590633333333333 0.023188633333333333 -0.78338299412773749 0.62097108768282461 0.026570524523820194 +-0.82948300000000008 0.55351399999999995 0.069904266666666673 -0.82591243697637595 0.55900058124443597 0.073396162134858695 +-0.56336366666666671 0.82571499999999987 -0.019053333333333332 -0.56474952199137984 0.82517112931182202 -0.012271298250802436 +-0.50345533333333337 0.86274066666666671 -0.041936266666666666 -0.49919176615637934 0.86568807684060878 -0.037305954185397922 +-0.39939166666666664 0.91511966666666666 -0.049583866666666671 -0.40288215829790114 0.91352935046269079 -0.056125683679036524 +-0.44236933333333334 0.88855800000000007 -0.11912266666666665 -0.43833872652535383 0.89161673536432962 -0.11348461590183041 +-0.32475833333333332 0.93660599999999994 -0.12905900000000001 -0.33870737283028768 0.93207372228690832 -0.12851416969592108 +-0.36137766666666665 0.93070366666666671 -0.050886266666666673 -0.36502863962319804 0.92921846382396145 -0.057507727684847132 +-0.52142733333333335 0.85163333333333335 -0.048800966666666667 -0.52744699324391708 0.84822554935274896 -0.048094560432325448 +-0.484402 0.87451599999999996 0.011107333333333332 -0.48691759602847329 0.8732734946888292 0.017454459367511763 +-0.44236933333333334 0.88855800000000007 0.11912266666666667 -0.43833872652535377 0.89161673536432973 0.11348461590183041 +-0.39939166666666664 0.91511966666666666 0.049583866666666664 -0.40288215829790164 0.91352935046269046 0.056125683679036448 +-0.46397566666666662 0.82155833333333339 0.33029599999999998 -0.4605655564218808 0.82594164087883659 0.32511501672512499 +-0.41765333333333338 0.86782533333333334 0.26792600000000005 -0.41075562274117583 0.8709359943737891 0.26972265772576098 +-0.34739533333333333 0.92261566666666661 0.16568633333333335 -0.35408080159719629 0.92056554615304842 0.16488135484713429 +-0.42712433333333327 0.89007000000000003 0.15726633333333331 -0.42314614003084344 0.8933001021719591 0.15153307109857345 +-0.63009233333333325 0.53283766666666665 0.56423166666666669 -0.62444740471079663 0.53714394096502771 0.56704658136215702 +-0.60181733333333343 0.60686300000000004 0.51848166666666662 -0.59853198481846182 0.6049900905981872 0.52511565719112763 +-0.54917199999999999 0.7082613333333333 0.442803 -0.54640906653262145 0.71359351338641641 0.43843064407472682 +-0.62469333333333332 0.66158633333333328 0.41395699999999996 -0.62767902678650844 0.66336490189426844 0.40738930553850972 +-0.36120633333333335 0.8491063333333333 0.38452633333333336 -0.36777664094370871 0.85243758053438257 0.37160531975316291 +-0.44557533333333338 0.81505266666666676 0.36941800000000002 -0.44913041287985422 0.81096811994909945 0.3749834405045035 +-0.88855800000000007 0.11912266666666667 0.44236933333333334 -0.89161673536432962 0.11348461590183043 0.43833872652535383 +-0.91511966666666666 0.049583866666666664 0.39939166666666664 -0.91352935046269046 0.056125683679036448 0.40288215829790164 +-0.82155833333333339 0.33029599999999998 0.46397566666666662 -0.82594164087883648 0.32511501672512494 0.46056555642188074 +-0.86782533333333334 0.26792600000000005 0.41765333333333338 -0.8709359943737891 0.26972265772576098 0.41075562274117583 +-0.92261566666666661 0.16568633333333335 0.34739533333333333 -0.92056554615304842 0.16488135484713429 0.35408080159719629 +-0.89007000000000003 0.15726633333333331 0.42712433333333327 -0.8933001021719591 0.15153307109857345 0.42314614003084344 +-0.53283766666666665 0.56423166666666669 0.63009233333333325 -0.53714394096502771 0.56704658136215702 0.62444740471079663 +-0.60686300000000004 0.51848166666666662 0.60181733333333343 -0.6049900905981872 0.52511565719112763 0.59853198481846182 +-0.7082613333333333 0.442803 0.54917199999999999 -0.71359351338641641 0.43843064407472682 0.54640906653262145 +-0.66158633333333328 0.41395699999999996 0.62469333333333332 -0.66336490189426844 0.40738930553850972 0.62767902678650844 +-0.8491063333333333 0.38452633333333336 0.36120633333333335 -0.8507249144212693 0.37874348378577949 0.36444546021693713 +-0.81505266666666676 0.36941800000000002 0.44557533333333338 -0.81096811994909945 0.37498344050450355 0.44913041287985428 +-0.87451599999999996 -0.011107333333333332 0.484402 -0.87546534326900227 0 0.48328090458333656 +-0.85163333333333335 0.048800966666666667 0.52142733333333335 -0.84822554935274896 0.048094560432326988 0.52744699324391675 +-0.79599699999999995 0.12320566666666666 0.59213633333333338 -0.80003949953512854 0.12626927563302187 0.58650905296908507 +-0.83897433333333327 0.14976733333333334 0.52259766666666663 -0.83549373783461522 0.14816841538857692 0.52914679883788518 +-0.69718433333333341 0.1788173333333333 0.69375566666666666 -0.70570543814547382 0.18530327643778483 0.68384393710358127 +-0.77091966666666656 0.231459 0.59284466666666669 -0.7717242900447443 0.22477932656870703 0.59490829083334673 +-0.77343700000000004 0.14808233333333334 0.61583966666666667 -0.77769021399991622 0.15114483124078609 0.61020748195835717 +-0.9754856666666667 -0.013347533333333333 0.21812066666666666 -0.97679511352946191 -0.0066794954721203581 0.21407169482489635 +-0.94157666666666662 0.24970966666666664 0.22448566666666667 -0.94036205292087083 0.24911249832849996 0.23165097151313285 +-0.50345533333333337 0.86274066666666671 0.041936266666666666 -0.499191766156376 0.86568807684061067 0.037305954185399184 +-0.97857266666666654 -0.053538400000000007 0.19711033333333336 -0.97891707379046766 -0.054331382555824669 0.19689962801153485 +-0.94620066666666658 0.21025733333333332 0.24458033333333337 -0.94697438464037487 0.20412201729289686 0.2481405184391732 +-0.56336366666666671 0.82571500000000009 0.019053333333333332 -0.56474952199138351 0.82517112931181968 0.012271298250800073 +-0.96100333333333332 0.13229433333333332 0.241457 -0.96127411794910778 0.12594081216775527 0.24513462014103787 +-0.64172033333333334 0.7653523333333333 -0.042977366666666662 -0.6426250462957882 0.7653603228425917 -0.035448922291373072 +-0.94891033333333341 0.17061899999999999 0.26418166666666665 -0.94936299928170276 0.16442848172763883 0.26771845284102713 +-0.64172033333333334 0.76535233333333341 0.042977366666666676 -0.64262504629578698 0.76536032284259281 0.03544892229137158 +-0.81053333333333333 0.20004 0.54990566666666663 -0.80686525433351086 0.19816170544713413 0.55650732236296963 +-0.68642633333333336 0.68407633333333318 -0.24532733333333334 -0.68844469340977232 0.68510252344690903 -0.23807233455948226 +-0.78686166666666668 0.22737200000000002 0.57315533333333335 -0.79088056821078456 0.22302929594463317 0.5698823211655436 +-0.706986 0.68900766666666657 -0.15741033333333332 -0.7125321402346092 0.68442589191687297 -0.15446406574501459 +-0.73761066666666675 0.23808166666666666 0.63133833333333333 -0.73851835051376802 0.23115459264988453 0.63337050787930538 +-0.72190399999999999 0.69115666666666664 -0.022636933333333331 -0.71778099415599472 0.69578410488359299 -0.025979295982934563 +-0.7614169999999999 0.25407399999999997 0.59584766666666666 -0.76233057365141144 0.24744053744883177 0.59801778978835018 +-0.6667263333333332 0.74198800000000009 -0.06574646666666667 -0.66770622348079334 0.74215319872214913 -0.058112208282762021 +-0.78593499999999994 0.32604033333333332 0.52472299999999994 -0.79047081147777842 0.32123464889336234 0.52150186629773509 +-0.62469333333333343 0.66158633333333328 -0.41395699999999996 -0.62488537760230467 0.6685102547388766 -0.40325215953270166 +-0.55225633333333335 0.83257966666666661 0.037025366666666663 -0.54729575317202273 0.83595829826741441 0.040510271755655997 +-0.55225633333333335 0.83257966666666672 -0.037025366666666663 -0.54729575317202073 0.83595829826741552 -0.040510271755656801 +-0.52259766666666663 0.83897433333333327 -0.14976733333333334 -0.52914679883788662 0.835493737834614 -0.14816841538857897 +-0.59213633333333326 0.79599699999999995 -0.12320566666666666 -0.58650905296908373 0.80003949953512954 -0.12626927563302098 +-0.43906033333333333 0.8545950000000001 -0.27610266666666666 -0.44613821149444965 0.8517840206616758 -0.27463553737628993 +-0.55621733333333323 0.7935566666666668 -0.24544933333333332 -0.55288852066134297 0.79769549250502136 -0.24082397089592902 +-0.50946000000000002 0.83918366666666666 -0.18871566666666664 -0.51617476502425286 0.83580172950209886 -0.18708041296046374 +-0.83257966666666661 0.037025366666666663 0.55225633333333335 -0.8359582982674143 0.04051027175565599 0.54729575317202273 +-0.95053166666666655 0.30608266666666667 0.045750099999999995 -0.95267325633349931 0.2999141427284871 0.049650515187289822 +-0.95053166666666655 0.30608266666666667 -0.045750100000000009 -0.95267325633349931 0.29991414272848715 -0.049650515187289843 +-0.93525400000000003 0.30251400000000001 -0.18189 -0.93433465145714811 0.30200242947475098 -0.18924400037464209 +-0.96410033333333323 0.2269926666666667 -0.13521533333333333 -0.96537328610346762 0.22074824340540278 -0.13901306237624433 +-0.83560033333333339 0.39287366666666673 -0.38305933333333336 -0.83724221359369977 0.38707866519609063 -0.38625844033073792 +-0.88216099999999997 0.32794300000000004 -0.33699166666666663 -0.8847129582550477 0.32939739480348551 -0.32981864379121911 +-0.93752266666666662 0.22195833333333334 -0.26666133333333336 -0.93604786651851213 0.22128896037937723 -0.27357921631651044 +-0.92622133333333334 0.30024966666666669 -0.22643000000000002 -0.92499859936706652 0.29958638636084506 -0.23372117635382425 +-0.91511966666666666 -0.049583866666666671 0.39939166666666664 -0.91559703367523992 -0.050328370179532594 0.39893499104512464 +-0.97317900000000002 0.066651999999999989 0.21864833333333333 -0.9730829786310693 0.060095725620958447 0.22248150588436871 +-0.96511000000000002 -0.013230166666666666 0.26024266666666662 -0.9665950348576382 -0.0066277061296098868 0.25622277826145901 +-0.93070366666666671 -0.050886266666666673 0.36137766666666665 -0.93114137455847357 -0.051749775504558296 0.36096772891850654 +-0.90789966666666666 0.41769333333333331 0.023229066666666669 -0.90534760491920652 0.42381623217035008 0.026935397082357385 +-0.93617499999999998 0.34366800000000003 0.068979233333333334 -0.9360263168050752 0.34349602657608297 0.076584684988370705 +-0.96410033333333323 0.2269926666666667 0.13521533333333333 -0.96537328610346729 0.2207482434054048 0.1390130623762432 +-0.93525400000000003 0.30251400000000001 0.18189 -0.93433465145714889 0.30200242947474887 0.18924400037464159 +-0.99082366666666666 -0.0135059 0.13190333333333334 -0.99178517435877078 -0.0067661867722445448 0.12773561225713778 +-0.99859100000000012 0.013590633333333333 -0.044029100000000009 -0.99861153173989281 0.013589455871418216 -0.050895337362313081 +-0.99904000000000004 -0.027195333333333332 -0.022029699999999999 -0.9991629923347658 -0.027631906953648543 -0.030162766231593224 +-0.81503000000000003 0.50893833333333338 0.27570366666666662 -0.81305737281356072 0.51455838411771748 0.27233688301013181 +-0.82827800000000007 0.4594753333333334 0.31960099999999997 -0.8304139645378581 0.45393507348914425 0.32304116851714432 +-0.80145 0.49010133333333333 0.34173666666666663 -0.8037056196105522 0.48464651299618527 0.34521737274803649 +-0.80106633333333332 0.53071599999999997 -0.27557166666666666 -0.79897191617966434 0.53626565764556022 -0.27214522150162823 +-0.78783499999999995 0.52574633333333332 -0.31970700000000002 -0.78586803119594784 0.53135648596864515 -0.31634114870382884 +-0.81468733333333343 0.46787466666666666 -0.34159099999999998 -0.81682318175526458 0.46233366051553559 -0.34503257252252501 +-0.82864533333333334 0.47329366666666667 -0.29773366666666662 -0.83090030398783732 0.4678449865199103 -0.30120716030848999 +-0.99904000000000004 0.027195333333333332 0.022029699999999999 -0.99921308916777873 0.02719535532663734 0.0288723931194266 +-0.94964533333333334 0.13090333333333334 -0.28351199999999999 -0.95200289488640144 0.13790605895656843 -0.27326252401487244 +-0.94891033333333341 0.17061899999999999 -0.2641816666666667 -0.94936299928170409 0.16442848172763477 -0.26771845284102513 +-0.61521733333333328 0.74463999999999997 0.25760333333333335 -0.61737720596625711 0.74562370031847525 0.2507801488887873 +-0.60073866666666664 0.74090699999999998 0.29917166666666667 -0.60310957117011399 0.74208291099934232 0.29252657719554881 +-0.76245399999999997 0.64488299999999998 0.046073400000000007 -0.75844767523465428 0.64985474643003283 0.049456369392688278 +-0.73876500000000001 0.67308933333333343 0.022829233333333337 -0.73476307479340197 0.67781810829049682 0.026188470624263417 +-0.53430833333333327 0.83759833333333333 0.11136133333333335 -0.54073640577352522 0.83398268268268572 0.1098955160892395 +-0.30483500000000002 0.94127266666666676 0.14291733333333334 -0.3125814579923708 0.93714717110982948 0.1550742138468155 +-0.74517200000000006 0.6408423333333334 0.18265566666666666 -0.74224043434855891 0.64576760458469762 0.17906238713645095 +-0.32930966666666667 0.92134066666666659 0.20500533333333334 -0.33328886111515593 0.91877258032363729 0.21160217556066777 +-0.67133866666666675 0.72445833333333332 0.15433566666666665 -0.66617006348422658 0.72896749990956811 0.15755580152128734 +-0.54323266666666659 0.78036933333333325 0.30863433333333329 -0.54003468947667688 0.78483938517234197 0.3039566969884519 +-0.70211766666666664 0.6987686666666667 0.13452966666666666 -0.70143880438084616 0.69836613739573827 0.14236692680438723 +-0.55890933333333326 0.78424633333333338 0.26818333333333338 -0.55566098937893771 0.78851015439986138 0.2636144937038305 +-0.5698266666666667 0.79545466666666664 0.20475399999999999 -0.5718381831134367 0.79603524377618096 0.19831536249045315 +-0.92134066666666659 0.20500533333333334 0.32930966666666667 -0.91939394482786763 0.20415305190362681 0.33620872328404433 +-0.60520099999999999 0.77270733333333341 0.18981166666666668 -0.60701838370830541 0.77331676655313386 0.18305698677723931 +-0.93463066666666661 0.20800333333333332 0.28728666666666669 -0.93299278306842348 0.20727921075590988 0.29421046128689032 +-0.64819233333333337 0.74987199999999998 0.13007733333333335 -0.64294891754529637 0.75422846516416497 0.13325206101010117 +-0.78036933333333325 0.30863433333333329 0.54323266666666659 -0.78483938517234197 0.3039566969884519 0.54003468947667677 +-0.63904300000000003 0.74907166666666669 0.17287133333333335 -0.6407392720600753 0.74963864005078429 0.16581644846858651 +-0.78424633333333338 0.26818333333333338 0.55890933333333326 -0.78851015439986005 0.26361449370382972 0.55566098937893993 +-0.93825066666666668 0.34415833333333334 -0.023011 -0.9407270663819467 0.33809798042240319 -0.0268764248126237 +-0.74463999999999997 0.25760333333333335 0.61521733333333328 -0.74562370031847547 0.25078014888878547 0.61737720596625767 +-0.92297966666666664 0.38112833333333329 -0.046245866666666663 -0.92558692684680688 0.37521515029815367 -0.050024312459220746 +-0.74090699999999998 0.29917166666666667 0.60073866666666664 -0.74208291099934232 0.29252657719554881 0.60310957117011399 +-0.74612066666666665 0.66373700000000002 -0.045797666666666674 -0.74198240659208958 0.66861355370751485 -0.049173408529602648 +-0.77135733333333334 0.63545900000000011 -0.02310496666666666 -0.76753243870691357 0.64046221897630851 -0.026497199787162678 +-0.61778100000000002 0.73429599999999995 -0.28015933333333337 -0.62004007182029175 0.73539666254061686 -0.27338993774681891 +-0.59584766666666666 0.7614169999999999 -0.25407399999999997 -0.59801778978835129 0.76233057365141077 -0.24744053744883129 +-0.54111533333333328 0.79043766666666659 -0.285908 -0.53782883589854569 0.79478643964980389 -0.28116660296842483 +-0.56335400000000002 0.76401200000000002 -0.3134513333333333 -0.56025037874058548 0.76856706053370527 -0.3089080552261631 +-0.9250423333333333 0.21922133333333335 -0.30914666666666668 -0.92324824765135227 0.21840485990216033 -0.31608857995793671 +-0.92716333333333323 0.17985566666666666 -0.32766433333333334 -0.92525904843422724 0.17910077093038035 -0.33439289337952693 +-0.95351733333333344 0.14467333333333335 0.26307333333333333 -0.95380451865368532 0.13841331687968292 0.26664338339095522 +-0.94127266666666676 0.14291733333333334 0.30483500000000002 -0.94143256773237549 0.13675142777156432 0.30822681164244103 +-0.46888933333333332 0.76326933333333324 0.44369833333333336 -0.47210024090889563 0.76515024679936405 0.43779728454689493 +-0.50950966666666664 0.74315733333333345 0.43292666666666668 -0.51283621984455163 0.73835079283231242 0.43799214415266191 +-0.441085 0.65946733333333329 0.60814899999999994 -0.43731684113983749 0.65714368989187133 0.61393497317775447 +-0.98424200000000006 0.13481499999999999 0.11134860000000001 -0.98380455546183188 0.13465699226458813 0.1183050763357274 +-0.97513733333333341 0.174405 0.134158 -0.97481076842484138 0.1810618577106119 0.13023275104731649 +-0.97389733333333328 0.21503999999999998 -0.067673766666666677 -0.97374709075627186 0.2149376029675775 -0.074956187698206111 +-0.96987800000000002 0.21437700000000001 -0.112605 -0.96942041966637382 0.21416769761314297 -0.11981755811631678 +-0.76326933333333324 0.44369833333333336 0.46888933333333332 -0.76515024679936416 0.43779728454689493 0.47210024090889557 +-0.74315733333333345 0.43292666666666668 0.50950966666666664 -0.73835079283231253 0.43799214415266186 0.51283621984455152 +-0.65946733333333329 0.60814899999999994 0.441085 -0.65714368989187133 0.61393497317775447 0.43731684113983749 +-0.64266266666666672 0.64228433333333335 0.41684100000000002 -0.64016870646839363 0.64782790771205845 0.41292012453742261 +-0.58604533333333331 0.72415899999999989 0.36257199999999995 -0.58874408788405008 0.7256335018984903 0.35614101126395381 +-0.82926700000000009 0.54054366666666664 0.13940533333333335 -0.82668447040560356 0.54600115691594608 0.13592469619850284 +-0.54774466666666666 0.7468366666666667 0.37619833333333336 -0.54478613472164339 0.75171303266381928 0.37166595746505388 +-0.83464799999999995 0.54221033333333335 0.093158400000000016 -0.83892675353125234 0.53681230026146576 0.0896351298180975 +-0.48915333333333333 0.75987199999999999 0.42735233333333333 -0.48610025123081052 0.76492383199278635 0.42260865703723388 +-0.91633200000000004 0.36574833333333334 0.16081700000000002 -0.91841129259366272 0.359810916179994 0.16448952013472135 +-0.50828066666666671 0.76825099999999991 0.38827200000000001 -0.50520740867948521 0.77309568655942207 0.38352122971039732 +-0.92663333333333331 0.32759366666666667 0.18257666666666669 -0.92838638141934415 0.32159180386994679 0.18621879195926977 +-0.89181766666666673 0.0117591 0.45166433333333328 -0.89054752003018423 0.01789422989084084 0.45453812942887695 +-0.60814899999999994 0.441085 0.65946733333333329 -0.61393497317775447 0.43731684113983749 0.65714368989187133 +-0.88267033333333333 -0.022866433333333335 0.46890266666666669 -0.88784400135689723 -0.017561216450396246 0.45980934411053048 +-0.64228433333333335 0.41684100000000002 0.64266266666666672 -0.64782790771205845 0.41292012453742261 0.64016870646839352 +-0.72415899999999989 0.36257199999999995 0.58604533333333331 -0.7256335018984903 0.35614101126395381 0.58874408788405008 +-0.89808433333333326 0.36037766666666665 -0.2507543333333333 -0.89979701339302987 0.35458216684466864 -0.25423772663537425 +-0.7468366666666667 0.37619833333333336 0.54774466666666666 -0.75171303266381928 0.37166595746505388 0.54478613472164339 +-0.91756233333333326 0.32513833333333336 -0.22731633333333331 -0.91941515130072438 0.32608678172641165 -0.21987084923194705 +-0.75987199999999999 0.42735233333333333 0.48915333333333333 -0.76492383199278646 0.42260865703723388 0.48610025123081058 +-0.87450700000000003 0.47524699999999998 -0.093143066666666663 -0.87208010639908595 0.48110197469553623 -0.089538695361360499 +-0.76825099999999991 0.38827200000000001 0.50828066666666671 -0.77309568655942207 0.38352122971039737 0.50520740867948533 +-0.85703933333333338 0.50979199999999991 -0.069971700000000012 -0.85433531332205415 0.51546247378909904 -0.066404898359457662 +-0.48189433333333337 0.52900333333333338 0.698017 -0.48662321822659543 0.53213040109363308 0.69284563916843744 +-0.49342066666666667 0.48894566666666667 0.7188633333333333 -0.49159291960562052 0.49606095366247921 0.71572336251172752 +-0.52627699999999988 0.83234166666666665 -0.17215800000000001 -0.53285688470931336 0.82885946709064051 -0.17045681045973168 +-0.76574933333333339 0.12819266666666668 0.62975100000000006 -0.76965126444640275 0.13845016904563748 0.62327239777427013 +-0.74868333333333348 0.62970633333333337 -0.20557800000000001 -0.74587853360328304 0.63471859439677691 -0.20198395737482688 +-0.47139533333333333 0.85913866666666661 0.19760733333333333 -0.47812770940072241 0.85609518430535281 0.19620124595017835 +-0.73784766666666657 0.62639233333333333 -0.25005566666666668 -0.7352000916415915 0.63148093086238055 -0.24639938962460284 +-0.44779533333333332 0.87820433333333325 0.16621833333333333 -0.44389085236663006 0.88154577838886228 0.16074187939053561 +-0.69264300000000001 0.64932366666666663 -0.31294899999999998 -0.69072853248152899 0.64827777600392777 -0.3203592039497456 +-0.60036900000000004 0.79510999999999987 0.082435966666666666 -0.59527376626746664 0.79895366475196572 0.085569765531694444 +-0.72513433333333344 0.62218933333333337 -0.29389033333333336 -0.72262666059799807 0.62736747502042201 -0.29020813337927986 +-0.63074133333333338 0.77298066666666665 0.063896999999999995 -0.63181107752023669 0.77305026458344028 0.056639657045134385 +-0.58604533333333342 0.72415899999999989 -0.36257199999999995 -0.58874408788404908 0.72563350189849096 -0.35614101126395376 +-0.82512499999999989 0.55223 -0.11626180000000001 -0.82132486405654359 0.55774163148492639 -0.11979040108052352 +-0.62304033333333331 0.70030133333333333 -0.3474376666666667 -0.62562797974048445 0.70174682321566095 -0.34079469930233341 +-0.84310399999999996 0.51867133333333337 -0.13947866666666667 -0.84064736639471094 0.52423280975072994 -0.13598517034769472 +-0.67726866666666663 0.6436099999999999 -0.35549866666666663 -0.67992113861011727 0.64513514255461479 -0.34857982315699021 +-0.87006133333333324 0.48723133333333335 0.069949533333333327 -0.87384599637596228 0.4816605514985991 0.066304507748473213 +-0.65859666666666661 0.67535066666666665 -0.33085633333333336 -0.66108855667488864 0.67675086734308265 -0.32399102423353954 +-0.86579899999999999 0.48595499999999997 0.11634196666666667 -0.86342620828191208 0.49170321319072813 0.11279686604615173 +-0.45058500000000001 0.87200033333333327 -0.18965866666666664 -0.44674844745016046 0.87548910974200123 -0.18421358099778984 +-0.48899699999999996 0.85274033333333332 -0.18195600000000001 -0.49563977507792206 0.84956016905265141 -0.18052349575591853 +-0.41651533333333335 0.90873766666666667 -0.012210199999999999 -0.41964790472394231 0.90749867578179033 -0.018487550273144752 +-0.39849599999999996 0.91651633333333338 0.024812700000000004 -0.40185500805245689 0.91517158930468778 0.031201196013799441 +-0.34131833333333333 0.93953100000000001 0.012861600000000001 -0.35091742712315827 0.93620857053337636 0.019247644040630722 +-0.36080433333333328 0.93196800000000002 -0.0254641 -0.36431486214481984 0.93072619151734937 -0.031991211980967806 +-0.47919499999999998 0.86999933333333335 0.11362733333333334 -0.4752986044653133 0.8731031569668547 0.10854544618655242 +-0.50254100000000002 0.852213 0.14353533333333332 -0.50896696988675261 0.84897311065938175 0.14211713809963503 +-0.67726866666666663 0.6436099999999999 0.35549866666666663 -0.67992113861011749 0.64513514255461435 0.3485798231569906 +-0.69467100000000004 0.61040833333333333 0.37964866666666669 -0.69233584091762568 0.61589682358755138 0.37595503198607233 +-0.52900333333333338 0.698017 0.48189433333333337 -0.53213040109363308 0.69284563916843744 0.48662321822659543 +-0.48894566666666667 0.7188633333333333 0.49342066666666667 -0.49240149666548411 0.72100417654973248 0.48753845333412765 +-0.93953100000000001 0.012861600000000001 0.34131833333333333 -0.93844557099972203 0.019390301721954061 0.344882482115484 +-0.93196800000000002 -0.0254641 0.36080433333333328 -0.92954913454932664 -0.02588889188244841 0.36778821587388683 +-0.86999933333333335 0.11362733333333334 0.47919499999999998 -0.87310315696685459 0.10854544618655243 0.4752986044653133 +-0.852213 0.14353533333333332 0.50254100000000002 -0.84897311065938108 0.14211713809963467 0.50896696988675361 +-0.6436099999999999 0.35549866666666663 0.67726866666666663 -0.64513514255461435 0.3485798231569906 0.67992113861011749 +-0.61040833333333333 0.37964866666666669 0.69467100000000004 -0.61589682358755138 0.37595503198607233 0.69233584091762568 +-0.698017 0.48189433333333337 0.52900333333333338 -0.69284563916843733 0.48662321822659543 0.53213040109363308 +-0.7188633333333333 0.49342066666666667 0.48894566666666667 -0.72100417654973248 0.48753845333412765 0.49240149666548411 +-0.85913866666666661 0.19760733333333333 0.47139533333333333 -0.85609518430535281 0.19620124595017835 0.47812770940072241 +-0.87820433333333325 0.16621833333333333 0.44779533333333332 -0.88154577838886228 0.16074187939053561 0.44389085236663017 +-0.79510999999999987 0.082435966666666666 0.60036900000000004 -0.79895366475196572 0.085569765531694458 0.59527376626746664 +-0.77298066666666665 0.063896999999999995 0.63074133333333338 -0.77323281423122159 0.077653387717214403 0.62934963761974561 +-0.74988699999999986 0.46585133333333334 -0.46898966666666669 -0.75642902312566274 0.46912920648369566 -0.45577727082110359 +-0.66105400000000003 0.74192333333333327 0.10926669999999999 -0.66233944891874696 0.74224522874824861 0.10187479966346263 +-0.62975100000000006 0.76574933333333339 0.12819266666666668 -0.62439601093608177 0.76998727876036854 0.13133625574954899 +-0.6125790000000001 0.78756366666666666 -0.062679333333333337 -0.6137547143550246 0.78753263737851731 -0.055655149542688249 +-0.60592866666666667 0.78831566666666664 -0.10404483333333332 -0.60062596472725593 0.79232113178228503 -0.107124575269599 +-0.64218399999999998 0.62806733333333331 -0.43866333333333335 -0.65399110933731253 0.62014958554441335 -0.43325526016061694 +-0.67719066666666672 0.60252166666666662 -0.4215173333333333 -0.68023889131423854 0.60441069962000604 -0.4146839241258703 +-0.64819233333333337 0.74987199999999998 -0.13007733333333335 -0.64294891754529637 0.75422846516416486 -0.13325206101010131 +-0.65521533333333337 0.75001200000000001 -0.086990833333333337 -0.65638577782881635 0.75021718069676468 -0.079573189275395501 +-0.4989513333333333 0.8577893333333334 -0.12117366666666667 -0.5052029824723937 0.85462177736693645 -0.11996484548056813 +-0.97958233333333344 0.14785633333333334 -0.13365466666666667 -0.98035278201893195 0.14140532735560526 -0.13752438395860767 +-0.98452266666666655 0.14843300000000001 -0.089341133333333336 -0.98423575270793717 0.14831702844712863 -0.096343355578130993 +-0.92589466666666675 0.34105833333333341 -0.16028966666666669 -0.92729951609022954 0.34172478535605538 -0.15277361857396751 +-0.90747233333333333 0.37685399999999997 -0.18377033333333337 -0.90952132795887308 0.3710265809997233 -0.18737724029236821 +-0.90873766666666667 -0.012210199999999999 0.41651533333333335 -0.90934223419047444 0 0.4160489167363331 +-0.91651633333333338 0.024812700000000004 0.39849599999999996 -0.915171589304688 0.031201196013799483 0.40185500805245644 +-0.90772833333333336 0.33597166666666672 0.24991700000000003 -0.90631973075464956 0.33521978385738732 0.25731739574973539 +-0.89832000000000001 0.37411466666666665 0.22882000000000002 -0.90018936382514747 0.36834417313747186 0.23233957771277039 +-0.44748599999999999 0.79176933333333332 0.41493233333333329 -0.45061332446283259 0.79349252796515179 0.40904430063261704 +-0.42727399999999999 0.78193899999999994 0.45311533333333331 -0.430581048544244 0.78390150597746155 0.44732358484748719 +-0.6169296666666666 0.33708266666666664 0.71068766666666672 -0.62192838064627531 0.34030277240478712 0.70526527806231698 +-0.62218933333333337 0.29389033333333336 0.72513433333333344 -0.63303145558615448 0.28565938067324992 0.71949280362756229 +-0.9863019999999999 0.094360200000000005 0.13272599999999998 -0.98571899316339417 0.094201848958944151 0.13958537949821576 +-0.99119466666666656 0.094722766666666666 0.088691666666666669 -0.99090868604521254 0.094624458621767243 0.095635703326153149 +-0.88726233333333326 0.37065766666666672 0.27328033333333335 -0.88896961193759916 0.36493619269398758 0.27668502726662181 +-0.874386 0.36636833333333335 0.3170716666666667 -0.87595825287420626 0.36061491813226637 0.3203966604726507 +-0.79176933333333332 0.41493233333333329 0.44748599999999999 -0.79349252796515179 0.40904430063261704 0.45061332446283259 +-0.78193899999999994 0.45311533333333331 0.42727399999999999 -0.78390150597746155 0.44732358484748719 0.430581048544244 +-0.71068766666666672 0.6169296666666666 0.33708266666666664 -0.70828943337678341 0.62222522892875454 0.33340942255934247 +-0.72513433333333344 0.62218933333333337 0.29389033333333336 -0.72262666059799929 0.6273674750204199 0.29020813337928147 +-0.80410033333333342 0.57136966666666666 0.16208199999999998 -0.80143539604984149 0.57666967522085277 0.15859820818379325 +-0.82184699999999999 0.53807933333333324 0.18531766666666669 -0.81942233900340899 0.54358437755329736 0.1818324911069982 +-0.77925900000000003 0.43740800000000002 -0.44803333333333334 -0.78253142168665979 0.43953278842596183 -0.44097108972307208 +-0.80692333333333333 0.40806266666666663 -0.426228 -0.8100798920731852 0.41006499600079527 -0.41906713962510156 +-0.8861296666666667 0.35661433333333337 -0.29480833333333334 -0.88770117086706313 0.35082964097389813 -0.2981697406769685 +-0.87666166666666667 0.39457300000000001 -0.27400933333333333 -0.87853054159162047 0.3888378086398766 -0.27746936058396188 +-0.81869099999999995 0.55018 -0.16232933333333333 -0.81615883216746876 0.55555699672441039 -0.15887474332186036 +-0.79259666666666673 0.58049499999999998 -0.18473399999999998 -0.78996515049353166 0.58574870889565644 -0.18125537518320203 +-0.70974033333333342 0.62968733333333338 -0.31475999999999998 -0.70722940200759754 0.63488697783600945 -0.31103874085109451 +-0.72712433333333337 0.59662133333333334 -0.33858233333333332 -0.72479541496417166 0.60206985994653273 -0.33493803933097333 +-0.98758800000000002 0.10800340000000001 -0.11095060000000001 -0.98715914492012036 0.10787007612224336 -0.11781710095719652 +-0.98855766666666656 0.067462433333333335 -0.13233766666666666 -0.98797921534951982 0.067333270144889143 -0.13915207784629885 +-0.86683433333333326 0.32232633333333333 0.37950966666666663 -0.86803909017894487 0.31643882890730773 0.38258934313579762 +-0.90660333333333332 0.32204199999999999 -0.2714273333333333 -0.90873512286034941 0.323188913161296 -0.26410112246941708 +-0.85979766666666668 0.36100666666666664 0.36019033333333333 -0.86126810731236048 0.35519573860579451 0.3633912968177257 +-0.89383633333333334 0.31817000000000001 -0.31486966666666666 -0.89624801139507837 0.31951953619145407 -0.30764714863356918 +-0.86683433333333326 0.32232633333333333 -0.37950966666666663 -0.86803909017894409 0.3164388289073089 -0.38258934313579851 +-0.48856099999999997 0.77240733333333333 0.40497999999999995 -0.49197364065418669 0.76790205989716254 0.41022964703585213 +-0.87218166666666663 0.28325866666666671 -0.39799066666666666 -0.87607180848325805 0.2775774859553693 -0.39427011764977882 +-0.46674366666666667 0.79997300000000005 0.37618033333333334 -0.47024319525858183 0.79575607140413507 0.38163282371470164 +-0.45581200000000005 0.85766166666666666 0.23665966666666663 -0.46266802420794434 0.85473908320643366 0.23528578158261582 +-0.87583766666666663 0.24396433333333331 -0.41561399999999998 -0.87489911065577086 0.25764841568228636 -0.41008394271191495 +-0.49497200000000002 0.83811233333333324 0.22790133333333332 -0.49139120814526044 0.84194317261708751 0.22285954016154341 +-0.67900399999999994 0.72532733333333332 -0.11055603333333335 -0.68027853678687678 0.72566683621403716 -0.10309585445698435 +-0.70211766666666675 0.6987686666666667 -0.13452966666666666 -0.70143880438084738 0.69836613739573716 -0.14236692680438653 +-0.80015433333333341 0.58287766666666663 -0.13899133333333333 -0.79603261649985269 0.58825410186115246 -0.14244011061469714 +-0.80566133333333345 0.58445933333333333 -0.092900400000000008 -0.801776495524269 0.58980757151104346 -0.096340437060805764 +-0.98172833333333331 0.10751146666666667 0.15480099999999999 -0.98194615561011633 0.11412882569379844 0.15085210846477298 +-0.78508733333333325 0.56488433333333332 0.25268700000000005 -0.78272032264096847 0.57031709890135784 0.24917323938488453 +-0.43467933333333336 0.87072233333333326 -0.22858766666666666 -0.43088521647762923 0.8743817691807968 -0.22314670498415706 +-0.98855766666666656 0.067462433333333335 0.13233766666666666 -0.98797921534951993 0.06733327014489128 0.13915207784629779 +-0.75597633333333336 0.59401533333333334 0.27377633333333334 -0.7535386475279815 0.59930919532716653 0.27019991687268247 +-0.41114166666666668 0.88992266666666664 -0.195881 -0.41786869262231569 0.88738043930629418 -0.19478632308939195 +-0.948241 0.22408166666666665 0.223473 -0.94705214190253939 0.22354254211107116 0.23047987414161 +-0.86189800000000005 0.47129566666666661 0.18523800000000001 -0.85984579511114412 0.47710763815943419 0.18175123174166055 +-0.43225599999999997 0.87782599999999988 0.20480499999999999 -0.42840399148712965 0.88133427653309548 0.19929855264346644 +-0.96156533333333327 0.18596799999999999 0.20030700000000001 -0.96232941502860847 0.17973451672552807 0.20400392267830808 +-0.83803666666666665 0.50363800000000003 0.20819866666666664 -0.83588006029070838 0.50930193747238395 0.20473412342664751 +-0.41561399999999998 0.87583766666666663 0.24396433333333334 -0.41941007178318773 0.87267008058923645 0.25008423007298353 +-0.32210133333333335 0.94495299999999993 0.051809966666666672 -0.33563562018755949 0.94056367924667894 0.051852634872905853 +-0.51888433333333328 0.42672700000000002 0.74024633333333334 -0.51615957150728675 0.44054448209603864 0.73450653913777197 +-0.65308166666666667 0.74134766666666663 0.15249900000000002 -0.64779101941242556 0.74574375744790089 0.15566966112925437 +-0.67582666666666669 0.71501700000000001 0.177069 -0.68169635280687602 0.71056893393307707 0.17430396638921783 +-0.69264300000000001 0.64932366666666663 0.31294899999999998 -0.69072853248152954 0.64827777600392789 0.32035920394974421 +-0.65859666666666661 0.67535066666666665 0.33085633333333336 -0.66108855667488819 0.67675086734308298 0.32399102423353965 +-0.97835466666666671 0.13419600000000001 0.15533166666666667 -0.97838757513424468 0.1408425647446043 0.15139724164955778 +-0.97951366666666662 0.093863266666666667 0.17624100000000001 -0.97990967194526468 0.10047745418984398 0.17228266316623886 +-0.95304633333333333 0.013060566666666667 0.30147600000000002 -0.95211762277351153 0.019636084690587727 0.30510073186103814 +-0.94495299999999993 0.051809966666666672 0.32210133333333335 -0.94442659522160821 0.045436616153804496 0.32556707473362934 +-0.74134766666666663 0.15249900000000002 0.65308166666666667 -0.745743757447901 0.15566966112925251 0.64779101941242589 +-0.71501700000000001 0.177069 0.67582666666666669 -0.71963846434385925 0.18023885039700835 0.67054786364910368 +-0.64932366666666663 0.31294899999999998 0.69264300000000001 -0.64827777600392789 0.32035920394974421 0.69072853248152943 +-0.67535066666666665 0.33085633333333336 0.65859666666666661 -0.67675086734308298 0.32399102423353965 0.66108855667488819 +-0.77240733333333333 0.40497999999999995 0.48856099999999997 -0.76790205989716254 0.41022964703585213 0.49197364065418669 +-0.79997300000000005 0.37618033333333334 0.46674366666666667 -0.79575607140413507 0.38163282371470164 0.47024319525858183 +-0.85766166666666666 0.23665966666666663 0.45581200000000005 -0.85473908320643366 0.23528578158261582 0.46266802420794434 +-0.83811233333333324 0.22790133333333332 0.49497200000000002 -0.84194317261708751 0.22285954016154338 0.49139120814526044 +-0.68439933333333336 0.71638666666666673 0.13320333333333331 -0.68580719655212852 0.71683146040090073 0.12578213918049705 +-0.69085300000000005 0.71705166666666675 0.089040933333333336 -0.68617271066798247 0.72155909310713462 0.092301063314365661 +-0.47419900000000004 0.85190366666666673 -0.22082566666666667 -0.48098951346609453 0.84883685748693116 -0.21937428588456115 +-0.45815366666666674 0.84954666666666678 -0.26021299999999997 -0.45135840117965048 0.85292378671556901 -0.26229107445607874 +-0.94615333333333329 -0.025922166666666666 0.32170033333333337 -0.94397703845306957 -0.026307601627811733 0.32896088060735168 +-0.95898133333333335 -0.026290733333333333 0.28108433333333332 -0.95709449513028511 -0.026632624785899603 0.28854952900380587 +-0.98172833333333331 0.10751146666666667 -0.15480099999999999 -0.981946155610116 0.11412882569380053 -0.15085210846477418 +-0.97273166666666666 0.14706466666666665 -0.17742433333333332 -0.97332507116728262 0.14069236473595439 -0.18122903835260357 +-0.87782599999999988 0.20480499999999999 0.43225599999999997 -0.88133427653309548 0.19929855264346644 0.42840399148712965 +-0.87583766666666663 0.24396433333333334 0.41561399999999998 -0.87267008058923645 0.25008423007298353 0.41941007178318773 +-0.89582666666666666 0.33240466666666668 0.29379266666666665 -0.89809633511602072 0.33366106968666331 0.28651921999531493 +-0.91531566666666675 0.29738066666666668 0.27032499999999998 -0.91378580324676062 0.29657279985040441 0.2775609485744791 +-0.62374033333333345 0.63313766666666671 0.45758233333333331 -0.62130991858177487 0.63889319899966468 0.45364023779189083 +-0.60354833333333335 0.62257333333333331 0.49742099999999995 -0.60117770770604406 0.62853566622266566 0.49348584583890137 +-0.48163 0.63991533333333328 0.59819433333333327 -0.47788134256101816 0.6376657568736942 0.60416206844089237 +-0.46451999999999999 0.67487200000000003 0.57277033333333327 -0.46093836374565439 0.67274682997459456 0.57874651410320621 +-0.93375666666666668 0.32944800000000002 0.13732900000000001 -0.93569239277978311 0.32338590283165725 0.14107198142720662 +-0.93888933333333335 0.33070500000000003 0.091738066666666673 -0.94101246637268166 0.32459334718907901 0.095575609293337277 +-0.9656313333333334 0.25454166666666667 -0.045389633333333339 -0.96563827865214946 0.25447243147524917 -0.052787275178668158 +-0.97591266666666676 0.2153643333333333 -0.022573899999999997 -0.97607441993813893 0.21537615737539612 -0.029863649754073556 +-0.96100333333333332 0.13229433333333332 -0.24145700000000003 -0.96127411794910678 0.12594081216775918 -0.24513462014104029 +-0.97088433333333324 0.093213466666666675 -0.21914 -0.97096749167518448 0.08671304054432924 -0.222941648665201 +-0.99567566666666674 0.013556566666666667 -0.088052033333333335 -0.99539188988286775 0.013538437507782957 -0.094929954520481544 +-0.99597933333333322 0.054270233333333334 -0.066234899999999999 -0.99584388442193805 0.054237984373482914 -0.073165558226036542 +-0.63313766666666671 0.45758233333333331 0.62374033333333345 -0.63889319899966468 0.45364023779189083 0.62130991858177487 +-0.62257333333333331 0.49742099999999995 0.60354833333333335 -0.62853566622266566 0.49348584583890132 0.60117770770604417 +-0.63991533333333328 0.59819433333333327 0.48163 -0.6376657568736942 0.60416206844089237 0.47788134256101816 +-0.67487200000000003 0.57277033333333327 0.46451999999999999 -0.67274682997459456 0.57874651410320621 0.46093836374565439 +-0.63670666666666664 0.71672566666666659 0.28326633333333334 -0.63896671989407416 0.71787542780718239 0.27636280686529158 +-0.67113733333333325 0.69153466666666663 0.26586133333333334 -0.6732775017358622 0.69264770558930877 0.25872101112623663 +-0.7715306666666667 0.57326266666666681 0.27462199999999998 -0.76918116629283839 0.57868388027417383 0.27108172223743615 +-0.75816133333333335 0.56834533333333337 0.31856266666666666 -0.7559183990567766 0.57388445654331877 0.31503016443734316 +-0.87771233333333321 0.47617466666666663 -0.046646866666666668 -0.87508176244014069 0.48205910673977859 -0.043022397119455921 +-0.89658166666666672 0.44146866666666668 -0.023282399999999998 -0.89406335609088294 0.44751152718113657 -0.019599702434321454 +-0.92250933333333329 0.36743666666666669 0.11516276666666668 -0.92477192156992416 0.36146431664713069 0.11891358571119123 +-0.90418833333333337 0.40314233333333332 0.13862700000000003 -0.9065768482451545 0.39732242461037337 0.14231412132187085 +-0.91822966666666661 0.24427766666666664 0.31066633333333332 -0.91640693651043736 0.24339426256520144 0.3177381935900957 +-0.89978666666666662 0.27934999999999999 0.33417800000000003 -0.89777797192039677 0.27832123447044738 0.34136784203750858 +-0.83950633333333335 0.42241299999999998 0.34073899999999996 -0.84139072144433436 0.41671320306238946 0.34411009903934264 +-0.85336699999999999 0.42763400000000001 0.29698633333333335 -0.85538338322748853 0.42197135721665069 0.30043209114046554 +-0.45758233333333331 0.62374033333333345 0.63313766666666671 -0.45364023779189083 0.62130991858177487 0.63889319899966468 +-0.49742099999999995 0.60354833333333335 0.62257333333333331 -0.49348584583890132 0.60117770770604417 0.62853566622266566 +-0.59819433333333327 0.48163 0.63991533333333328 -0.60416206844089237 0.47788134256101816 0.6376657568736942 +-0.57277033333333327 0.46451999999999999 0.67487200000000003 -0.57874651410320621 0.46093836374565439 0.67274682997459456 +-0.71672566666666659 0.28326633333333334 0.63670666666666664 -0.71787542780718239 0.27636280686529158 0.63896671989407416 +-0.69153466666666663 0.26586133333333334 0.67113733333333325 -0.69264770558930877 0.25872101112623663 0.6732775017358622 +-0.96258599999999994 0.25397200000000003 -0.09068166666666666 -0.96227939571058341 0.25377396032399235 -0.098067026325627235 +-0.95327899999999988 0.29303333333333331 -0.068455500000000002 -0.95312415703736431 0.29288506573994283 -0.075978151716945649 +-0.89445666666666668 0.44087900000000002 -0.069773099999999991 -0.89214714856246369 0.44687846223520744 -0.066129458656195669 +-0.8902363333333333 0.439668 -0.11605323333333334 -0.88812183032546255 0.44564102421677082 -0.11244417296764594 +-0.76900066666666655 0.63496300000000006 -0.069209533333333337 -0.76490472969328582 0.64003908894182793 -0.072599718452320161 +-0.764351 0.63392533333333334 -0.11503839999999999 -0.75999418759787019 0.63905202783527082 -0.11841174155075003 +-0.78508733333333336 0.56488433333333343 -0.25268699999999999 -0.78272032264096647 0.57031709890135995 -0.24917323938488595 +-0.81243133333333339 0.53480433333333333 -0.23075133333333331 -0.81017001123674981 0.54034534738107565 -0.22726957221825625 +-0.54633266666666669 0.8181653333333333 0.17754333333333336 -0.55294580946744776 0.81448691874194057 0.17567581219578418 +-0.52472299999999994 0.78593499999999994 -0.32604033333333332 -0.53177567977925 0.7824376384018038 -0.32404624424227568 +-0.53302133333333324 0.81731666666666669 0.21738166666666667 -0.52957076434678341 0.82117934975840678 0.21264825670464324 +-0.48500100000000002 0.8065730000000001 -0.33695900000000001 -0.49134209471296303 0.80858606522459509 -0.3236842923091644 +-0.82594966666666669 0.4307913333333333 -0.362674 -0.82785431066039616 0.42508009428749394 -0.36601113884899122 +-0.79909666666666668 0.46117466666666668 -0.38479733333333338 -0.8011452716929367 0.45549482658489687 -0.38818902173869535 +-0.99567566666666674 -0.013556566666666667 0.088052033333333335 -0.99645037790286128 -0.0067825110210987917 0.083908533067223873 +-0.99597933333333322 -0.054270233333333334 0.066234899999999999 -0.9962881829039385 -0.055094892576294616 0.066139318245466691 +-0.8632616666666667 0.30715500000000001 -0.39970366666666662 -0.86624744389763897 0.30889953120125169 -0.39267855246302108 +-0.50779833333333335 0.68626366666666672 0.52007300000000001 -0.51139416315246811 0.68853826500749427 0.51418971937802915 +-0.52546799999999994 0.65217366666666665 0.54575033333333334 -0.52920366945247455 0.65458239889410585 0.53987531828754109 +-0.50784666666666667 0.54724133333333336 0.66476333333333326 -0.51235096103056466 0.55021305309491264 0.65936491333330116 +-0.46893000000000001 0.56797500000000001 0.67587200000000003 -0.46472565032621649 0.56535557010136861 0.68147131215057888 +-0.96046299999999996 0.092355800000000002 -0.26138033333333333 -0.96288732747543226 0.099270327172423373 -0.2509848535874219 +-0.99709700000000012 -0.0271472 -0.066086900000000004 -0.99815958682132622 -0.013995937504594413 -0.059004686000748076 +-0.99320699999999995 -0.027062466666666663 -0.11007063333333333 -0.99458728947142871 -0.013929184287532797 -0.1029665064327249 +-0.85042666666666678 0.10573533333333333 0.51483299999999999 -0.84714907157637986 0.10444750790748693 0.52098864538413248 +-0.84756133333333328 0.069051033333333345 0.52571099999999993 -0.84415555467171699 0.068173181494397148 0.53174600782875447 +-0.43467066666666665 0.8999693333333334 0.023969299999999999 -0.43778575898804434 0.89857223759622595 0.030192102420558857 +-0.46890266666666669 0.88267033333333345 0.022866433333333335 -0.47156638030224995 0.88134786990201952 0.029173295799524861 +-0.57604433333333327 0.81494699999999998 0.059267866666666669 -0.57105803285634871 0.81853487189697505 0.062397007931789775 +-0.56820133333333334 0.81665133333333328 0.098415533333333319 -0.56255375688704268 0.8204999119066646 0.10155375509270882 +-0.73621533333333333 0.67279266666666671 0.068386966666666674 -0.7319069708828525 0.67762015021244859 0.071715535270580819 +-0.73132766666666671 0.67199433333333347 0.11367523333333333 -0.72672368166859569 0.6768932282846396 0.11699678629962637 +-0.65008199999999994 0.72023166666666671 0.24082699999999999 -0.6520932499745713 0.72120350456889648 0.23375178787582127 +-0.6280163333333334 0.74735400000000007 0.21542566666666665 -0.62994672096641147 0.74812731929989174 0.2085009421101596 +-0.91466100000000006 0.37891566666666665 -0.13824433333333333 -0.91689163039086197 0.37305445430029122 -0.14191586326376221 +-0.91984566666666667 0.38031999999999999 -0.092365500000000003 -0.92226052033247541 0.3744336885534349 -0.096098623883701606 +-0.88990066666666667 0.45298833333333333 0.046587499999999997 -0.89337034382634739 0.44727048685379228 0.042878203800596357 +-0.87221566666666661 0.48784099999999997 0.023341766666666666 -0.86923108705951135 0.49367090573163469 0.026950957746388671 +-0.79981999999999998 0.54362500000000002 0.25311366666666663 -0.79757193557747619 0.54914166848935986 0.24964461842371102 +-0.78303900000000004 0.5772896666666667 0.22998833333333335 -0.78055969213023035 0.58261180697286685 0.22647306550089111 +-0.75888966666666668 0.644177 0.091938833333333345 -0.7546117333897282 0.64921606847318503 0.095287083420421345 +-0.78476100000000004 0.61534100000000003 0.069477033333333327 -0.78081027126240721 0.62050512688950044 0.072860879729598649 +-0.58178533333333327 0.8090480000000001 -0.080161999999999997 -0.57657935871746036 0.81279318645478205 -0.083207446503567165 +-0.55776333333333328 0.82775166666666655 -0.056808099999999993 -0.55271151938785956 0.83119822272984056 -0.060162204636450917 +-0.45166433333333339 0.89181766666666673 -0.0117591 -0.45453812942887795 0.89054752003018356 -0.0178942298908456 +-0.43589300000000003 0.89842200000000005 -0.047878066666666663 -0.43918072250599538 0.89674879877906211 -0.054423201554310061 +-0.47605000000000003 0.87439566666666657 -0.090921466666666673 -0.4721374721391981 0.87734060758261045 -0.085788493917213979 +-0.48871233333333336 0.87042766666666671 -0.054918800000000011 -0.48452607356091065 0.87333859322127783 -0.050141655636071245 +-0.49190599999999995 0.8669473333333334 0.076870800000000003 -0.48798175061253013 0.86987752165419474 0.072020194319970227 +-0.45684033333333329 0.88547600000000004 0.081770899999999994 -0.45266532689738559 0.88841440347642964 0.076249259147239679 +-0.52068599999999998 0.80599766666666672 0.28034733333333334 -0.51732881626734262 0.81023565728700075 0.27547971889075962 +-0.48135633333333333 0.82648499999999991 0.29078700000000002 -0.47787127089349962 0.83068865576298123 0.28564909529232324 +-0.35277166666666665 0.90397933333333336 0.24023133333333332 -0.35979822748454249 0.90184935426715085 0.23919234458256466 +-0.37067 0.90640266666666669 0.20096933333333333 -0.37747602561803351 0.90416256080953616 0.20000478422766657 +-0.68626366666666672 0.52007300000000001 0.50779833333333335 -0.68853826500749427 0.51418971937802904 0.51139416315246822 +-0.65217366666666665 0.54575033333333334 0.52546799999999994 -0.65458239889410585 0.53987531828754109 0.52920366945247455 +-0.54724133333333336 0.66476333333333326 0.50784666666666667 -0.55021305309491297 0.6593649133332985 0.51235096103056765 +-0.56797500000000001 0.67587200000000003 0.46893000000000001 -0.56535557010136861 0.68147131215057888 0.46472565032621654 +-0.36312566666666662 0.81351666666666667 0.45347166666666666 -0.37000798690410153 0.81773970594077883 0.44090346217178061 +-0.38384699999999999 0.82400366666666669 0.41591733333333331 -0.39132827451862362 0.82160558708182385 0.41451953010468423 +-0.50412633333333334 0.80162933333333342 0.32027699999999998 -0.50082642609276529 0.80606359017420337 0.31533217330716817 +-0.52632333333333337 0.77506433333333336 0.34868433333333337 -0.5232122967623275 0.77971086918769328 0.34394745672451499 +-0.8669473333333334 0.076870800000000003 0.49190599999999995 -0.86987752165419474 0.072020194319970227 0.48798175061253013 +-0.88547600000000004 0.081770899999999994 0.45684033333333329 -0.88841440347642964 0.076249259147239679 0.45266532689738559 +-0.80599766666666672 0.28034733333333334 0.52068599999999998 -0.81023565728700075 0.27547971889075962 0.51732881626734262 +-0.82648499999999991 0.29078700000000002 0.48135633333333333 -0.83068865576298123 0.28564909529232324 0.47787127089349962 +-0.90397933333333336 0.24023133333333332 0.35277166666666665 -0.90184935426715085 0.23919234458256466 0.35979822748454249 +-0.90640266666666669 0.20096933333333333 0.37067 -0.90416256080953616 0.20000478422766657 0.37747602561803351 +-0.52007300000000001 0.50779833333333335 0.68626366666666672 -0.51418971937802904 0.51139416315246822 0.68853826500749427 +-0.97022466666666674 0.026577699999999999 -0.23935300000000001 -0.97401232856293862 0.026285001833126275 -0.22496462496587019 +-0.54575033333333334 0.52546799999999994 0.65217366666666665 -0.53987531828754354 0.52920366945247321 0.65458239889410497 +-0.96445399999999992 0.106003 -0.24067133333333335 -0.96454988640168204 0.099589396198537586 -0.24438794734461219 +-0.66476333333333326 0.50784666666666667 0.54724133333333336 -0.6593649133332985 0.51235096103056776 0.55021305309491297 +-0.96278133333333338 0.066040966666666659 -0.26082466666666665 -0.96690146277194322 0.066004433072404931 -0.246464959181355 +-0.67587200000000003 0.46893000000000001 0.56797500000000001 -0.68147131215057877 0.46472565032621649 0.56535557010136861 +-0.957121 0.22573400000000002 -0.17963466666666669 -0.95821518598554112 0.21958206357096466 -0.18332314285057291 +-0.81351666666666667 0.45347166666666666 0.36312566666666662 -0.81555497642591224 0.44781837438072558 0.36650891393516466 +-0.96156533333333327 0.18596799999999999 -0.20030700000000001 -0.96232941502860792 0.17973451672552798 -0.2040039226783105 +-0.82400366666666669 0.41591733333333331 0.38384699999999999 -0.82578576083367272 0.4101701368210342 0.38708957111315512 +-0.95351733333333322 0.14467333333333332 -0.26307333333333333 -0.95380451865368532 0.13841331687968719 -0.26664338339095306 +-0.80162933333333342 0.32027699999999998 0.50412633333333334 -0.80606359017420326 0.31533217330716812 0.50082642609276529 +-0.96402533333333329 0.14602166666666669 -0.22057833333333332 -0.96445393035568028 0.13971873759203532 -0.22429286789188932 +-0.77506433333333336 0.34868433333333337 0.52632333333333337 -0.77971086918769328 0.34394745672451499 0.5232122967623275 +-0.8999693333333334 0.023969299999999999 0.43467066666666665 -0.89857223759622595 0.030192102420558857 0.43778575898804434 +-0.88267033333333345 0.022866433333333335 0.46890266666666669 -0.88134786990201952 0.029173295799524861 0.47156638030224995 +-0.81494699999999998 0.059267866666666669 0.57604433333333327 -0.81853487189697505 0.062397007931789775 0.57105803285634871 +-0.81665133333333328 0.098415533333333319 0.56820133333333334 -0.8204999119066646 0.10155375509270882 0.56255375688704268 +-0.72023166666666671 0.24082699999999999 0.65008199999999994 -0.72120350456889648 0.23375178787582127 0.6520932499745713 +-0.74735400000000007 0.21542566666666665 0.6280163333333334 -0.74812731929989174 0.2085009421101596 0.62994672096641147 +-0.51483299999999999 0.85042666666666678 0.10573533333333333 -0.5209886453841317 0.84714907157638042 0.10444750790748585 +-0.52571099999999993 0.84756133333333328 0.069051033333333345 -0.53174600782875492 0.84415555467171688 0.068173181494395704 +-0.58780333333333334 0.8076793333333333 -0.040241233333333327 -0.58895650236746122 0.80747253922186379 -0.033441541855636171 +-0.61607900000000004 0.7870609999999999 -0.020946933333333334 -0.61698063728776309 0.78686277614210864 -0.013485723336907495 +-0.63133833333333333 0.73761066666666675 -0.23808166666666666 -0.63337050787930427 0.73851835051376891 -0.23115459264988511 +-0.66528666666666669 0.71280966666666667 -0.22053199999999998 -0.66719302095845834 0.71368475232804796 -0.21332497996901115 +-0.74243766666666666 0.66315266666666661 -0.091391999999999987 -0.7380201623109951 0.66809911774214903 -0.094709075038321697 +-0.71923599999999999 0.69097666666666679 -0.067828766666666665 -0.71484071533694593 0.69565931898028532 -0.07113974706483786 +-0.77267300000000005 0.56040299999999998 -0.297039 -0.7704440950769551 0.56591681206609912 -0.29352011546399231 +-0.75597633333333336 0.59401533333333345 -0.27377633333333334 -0.75353864752797994 0.59930919532716931 -0.27019991687268052 +-0.65288666666666673 0.70969066666666658 -0.2634556666666667 -0.65501968417060397 0.71076863277450397 -0.25643159714221031 +-0.63873966666666671 0.70558766666666661 -0.30574499999999999 -0.64109301993334888 0.70685708038104433 -0.29891940001934414 +-0.60575433333333339 0.794234 0.041378733333333334 -0.60677526245756896 0.79413092226005166 0.034349078298377002 +-0.58062966666666671 0.81361933333333314 0.019809433333333331 -0.58189096904843229 0.81316353437949684 0.012960188861322341 +-0.51093266666666659 0.85518833333333344 -0.084138333333333329 -0.51693773592267367 0.85198203848343912 -0.083078175718678079 +-0.53430833333333327 0.83759833333333333 -0.11136133333333333 -0.54073640577352322 0.83398268268268716 -0.10989551608923878 +-0.35099133333333327 0.91087466666666661 -0.21552966666666665 -0.35884953293333854 0.90540314548384249 -0.22687476030067502 +-0.3744993333333333 0.89252600000000004 -0.24997166666666668 -0.38084706248225925 0.893707995900477 -0.23715297396867541 +-0.50220666666666669 0.81162366666666674 -0.29731033333333334 -0.49883260789314426 0.81591989161692013 -0.29230251412938263 +-0.51826699999999992 0.8151826666666665 -0.25734633333333334 -0.51483738173931926 0.81927210874247725 -0.25245926839879929 +-0.794234 0.041378733333333334 0.60575433333333339 -0.79454065758969872 0.055064809309266098 0.60470902937914139 +-0.81361933333333314 0.019809433333333331 0.58062966666666671 -0.81388635643554741 0.032944592837174359 0.5800893488169403 +-0.91087466666666661 0.21552966666666665 -0.35099133333333327 -0.90877103811651916 0.21458513885150093 -0.3578944236289609 +-0.89252600000000004 0.24997166666666668 -0.3744993333333333 -0.89022513035931738 0.24884721390097977 -0.3815419785691429 +-0.97215366666666669 0.22839699999999999 0.045218333333333333 -0.9721645112054107 0.22834695483901848 0.052476960358735447 +-0.96287333333333336 0.26767199999999997 0.022745200000000004 -0.9630414023662548 0.26766477827048935 0.030113515268850533 +-0.93204233333333342 0.34265900000000005 -0.11477476666666668 -0.93314089294629399 0.34314701905525469 -0.10722964713588243 +-0.94234466666666672 0.30424066666666666 -0.13681300000000002 -0.94173031487740755 0.30386966027529327 -0.14424716151479927 +-0.84066399999999997 0.43669399999999997 -0.31920066666666663 -0.84267139385309486 0.43105936514427184 -0.32263407399575722 +-0.85106633333333326 0.39919166666666667 -0.34005899999999994 -0.8528049708060641 0.39346996082837327 -0.34337307945467493 +-0.90763266666666664 0.25476333333333329 -0.33260966666666664 -0.9056496374377796 0.25378156646779038 -0.339696409651284 +-0.92108633333333334 0.25843766666666668 -0.29005533333333333 -0.91942952058264082 0.25759897198975035 -0.29713991033013243 +-0.89181766666666673 -0.0117591 0.45166433333333339 -0.89054752003018323 -0.01789422989084398 0.45453812942887872 +-0.89842200000000005 -0.047878066666666663 0.43589300000000003 -0.89280395272116786 -0.047483374616635085 0.44793574443269779 +-0.95314033333333337 0.10487713333333333 0.28260466666666667 -0.95309693783712679 0.098541461164222813 0.28617443547094124 +-0.96278133333333338 0.066040966666666659 0.26082466666666665 -0.96253563407545095 0.059527485851090023 0.26454041574628634 +-0.886714 0.45208100000000001 0.093025999999999998 -0.88445594026952357 0.45797227380334937 0.089437610373616722 +-0.90578799999999993 0.4171226666666667 0.069620399999999999 -0.90364636568419621 0.42316551543616399 0.065986304119790631 +-0.96083533333333337 0.26727899999999999 0.068186966666666668 -0.95963829897183539 0.27377530970840092 0.064353826152851415 +-0.95677066666666677 0.26647300000000002 0.1134709 -0.95838768851164724 0.26025483249547893 0.11730498997081132 +-0.99709700000000012 0.0271472 0.066086900000000004 -0.99696424547661711 0.027116700704621275 0.072986147892153908 +-0.99320699999999995 0.027062466666666663 0.11007063333333333 -0.99277645957187444 0.027023373377348354 0.11689584514106012 +-0.96445399999999992 0.106003 0.24067133333333332 -0.96454988640168204 0.099589396198537947 0.24438794734461197 +-0.96402533333333329 0.14602166666666669 0.22057833333333332 -0.96445393035568139 0.13971873759203135 0.22429286789188704 +-0.88396799999999998 0.4377786666666667 -0.16201833333333335 -0.88647153569422021 0.43211376507175508 -0.16566807308423348 +-0.94495300000000004 -0.051809966666666672 0.32210133333333335 -0.94534774934638066 -0.052625365478896312 0.32178906711376221 +-0.91633200000000004 0.36574833333333334 -0.16081700000000002 -0.91841129259366205 0.35981091617999666 -0.16448952013471924 +-0.99709700000000012 -0.0271472 0.066086900000000004 -0.99686240587570329 -0.027533312668726877 0.074210918638638296 +-0.90418833333333337 0.40314233333333327 -0.138627 -0.90657684824515439 0.39732242461037326 -0.14231412132187304 +-0.99903999999999993 -0.027195333333333332 0.022029699999999999 -0.9991629923347658 -0.027631906953650604 0.030162766231589453 +-0.85258733333333325 0.46819666666666665 -0.23063066666666668 -0.8507180361980079 0.47398585102273699 -0.22719206834230982 +-0.85113933333333336 0.48120366666666664 0.20809633333333333 -0.84913149454651216 0.48691927864691648 0.20465903608483363 +-0.83803666666666665 0.50363800000000003 -0.20819866666666667 -0.83588006029070772 0.50930193747238528 -0.20473412342664679 +-0.84083699999999995 0.47767399999999999 0.25322733333333336 -0.83898811193120493 0.48339456538053766 0.2498572436385891 +-0.82926700000000009 0.54054366666666664 -0.13940533333333335 -0.82668447040560145 0.54600115691594953 -0.13592469619850162 +-0.84066399999999997 0.43669399999999997 0.31920066666666669 -0.84267139385309497 0.43105936514427146 0.32263407399575739 +-0.82184699999999999 0.53807933333333335 -0.18531766666666669 -0.81942233900340922 0.54358437755329658 -0.18183249110699973 +-0.82864533333333323 0.47329366666666672 0.29773366666666662 -0.83090030398783732 0.46784498651991108 0.30120716030848904 +-0.4059166666666667 0.75636666666666663 0.51228966666666664 -0.41333439577222858 0.75381219132502608 0.51080510714103955 +-0.75636666666666663 0.51228966666666664 0.4059166666666667 -0.75865329835647777 0.50674725822349365 0.4094537692778133 +-0.77267300000000005 0.56040299999999998 0.297039 -0.77044409507695688 0.56591681206609601 0.2935201154639932 +-0.74262333333333341 0.5482703333333333 -0.38367900000000005 -0.74061277632469213 0.55398308333902235 -0.38025709581652961 +-0.77289299999999994 0.51966566666666669 -0.36316266666666669 -0.77525724683632413 0.51427657878884769 -0.3667366926515549 +-0.81351666666666667 0.45347166666666666 -0.36312566666666662 -0.81555497642591224 0.44781837438072558 -0.36650891393516466 +-0.80145 0.49010133333333333 -0.34173666666666663 -0.80370561961055131 0.48464651299618633 -0.34521737274803704 +-0.86488299999999996 0.4452226666666666 -0.23033366666666666 -0.86718072358672149 0.43967029351048392 -0.23385385531142125 +-0.84083699999999995 0.47767399999999999 -0.2532273333333333 -0.83898811193120471 0.48339456538053771 -0.24985724363858919 +-0.79981999999999998 0.54362500000000002 -0.25311366666666668 -0.79757193557747719 0.54914166848935786 -0.24964461842371205 +-0.81503000000000003 0.50893833333333338 -0.27570366666666662 -0.81305737281356072 0.51455838411771748 -0.27233688301013143 +-0.9934940000000001 0.10851619999999999 0.022237466666666667 -0.99366413966331857 0.10853012501892693 0.029202559999646965 +-0.99734033333333338 0.067943766666666669 0 -0.99766335663096273 0.067974332085518785 0.0068787363205835943 +-0.99709700000000012 0.0271472 -0.066086900000000004 -0.99696424547661722 0.027116700704621279 -0.072986147892153894 +-0.99903999999999993 0.027195333333333332 -0.022029699999999999 -0.99921308916777885 0.027195355326637367 -0.028872393119419037 +-0.95597666666666681 0.21201066666666668 -0.20118666666666665 -0.95690704317590225 0.20579936405970423 -0.20487931196920114 +-0.94620066666666658 0.21025733333333332 -0.24458033333333332 -0.94697438464037365 0.20412201729289914 -0.24814051843917612 +-0.91822966666666661 0.24427766666666664 -0.31066633333333332 -0.91640693651043803 0.24339426256520186 -0.31773819359009342 +-0.93463066666666672 0.20800333333333335 -0.28728666666666669 -0.93299278306842304 0.20727921075590922 -0.29421046128689254 +-0.60522599999999993 0.70626633333333333 0.36633966666666667 -0.60795094672564387 0.70779537966296246 0.35975178512851885 +-0.58478433333333335 0.7359429999999999 0.34020366666666663 -0.58183870110532376 0.74073627898260386 0.33581764530035613 +-0.52472299999999994 0.78593499999999994 0.32604033333333332 -0.52150186629773509 0.79047081147777842 0.32123464889336234 +-0.56335399999999991 0.76401200000000002 0.3134513333333333 -0.56025037874058581 0.76856706053370394 0.30890805522616588 +-0.68725733333333328 0.72564533333333336 0.022199266666666665 -0.68790368117368894 0.72565832946336029 0.014440024519819183 +-0.71367933333333333 0.70001333333333327 2.3129646346357427e-18 -0.70976920859764492 0.70442647167853822 0.003319115122790968 +-0.73621533333333333 0.67279266666666659 -0.068386966666666674 -0.7319069708828545 0.67762015021244637 -0.07171553527058093 +-0.73876500000000001 0.67308933333333332 -0.022829233333333327 -0.73476307479340419 0.6778181082904946 -0.026188470624260104 +-0.75755833333333333 0.52692766666666668 -0.38439033333333333 -0.75563435731375361 0.53275084065322775 -0.38104233338345717 +-0.36358533333333326 0.92568533333333336 0.10143216666666666 -0.36726950130505531 0.923820067450836 0.1080259060886271 +-0.77051866666666669 0.490504 -0.40621499999999999 -0.77270320478273291 0.48485766119619861 -0.40968622834780039 +-0.34578333333333333 0.92738500000000013 0.14052333333333333 -0.34890169435207236 0.92745409669571854 0.13452325524080155 +-0.76326933333333324 0.44369833333333331 -0.46888933333333332 -0.759812345142579 0.45689772793499878 -0.46252531430914168 +-0.35099133333333327 0.91087466666666661 0.21552966666666665 -0.35789442362895907 0.90877103811651971 0.21458513885150166 +-0.78193899999999994 0.45311533333333331 -0.42727399999999999 -0.78390150597746155 0.44732358484748719 -0.430581048544244 +-0.32766433333333334 0.92716333333333323 0.17985566666666666 -0.33748755045646722 0.92529999561685417 0.17297997398064061 +-0.54990566666666663 0.81053333333333333 0.20004 -0.55650732236297251 0.80686525433350909 0.19816170544713305 +-0.57315533333333335 0.78686166666666668 0.22737200000000002 -0.56988232116554505 0.79088056821078367 0.22302929594463261 +-0.63133833333333333 0.73761066666666675 0.23808166666666666 -0.63337050787930682 0.73851835051376702 0.23115459264988383 +-0.59584766666666666 0.7614169999999999 0.25407399999999997 -0.59801778978835185 0.76233057365140977 0.24744053744883268 +-0.7359429999999999 0.34020366666666663 0.58478433333333335 -0.74073627898260386 0.33581764530035613 0.58183870110532376 +-0.76401200000000002 0.3134513333333333 0.56335399999999991 -0.76856706053370394 0.30890805522616588 0.56025037874058581 +-0.81723666666666661 0.57523666666666662 -0.023299466666666661 -0.81373864287838304 0.58061392593956729 -0.026774803295075186 +-0.79504166666666665 0.60599700000000001 2.3129646346357427e-18 -0.79150624842317008 0.61115147527147917 -0.0034253438620977824 +-0.76900066666666655 0.63496299999999994 0.069209533333333337 -0.76490472969328482 0.64003908894182915 0.072599718452319176 +-0.77135733333333334 0.635459 0.023104966666666671 -0.76753243870691568 0.64046221897630617 0.026497199787162903 +-0.58582466666666677 0.78833399999999998 -0.18632033333333334 -0.57988023189536386 0.79241984688079392 -0.18923451832685864 +-0.57315533333333335 0.78686166666666668 -0.22737200000000002 -0.56988232116554483 0.79088056821078345 -0.22302929594463394 +-0.52068599999999998 0.80599766666666672 -0.28034733333333334 -0.51732881626734317 0.81023565728700142 -0.27547971889075634 +-0.55890933333333337 0.78424633333333327 -0.26818333333333338 -0.55566098937893804 0.78851015439986161 -0.26361449370382906 +-0.56752666666666662 0.72956600000000005 -0.38073966666666664 -0.57445758132119618 0.7257323266893434 -0.37856449550991078 +-0.58478433333333335 0.7359429999999999 -0.34020366666666674 -0.58183870110532543 0.74073627898260141 -0.33581764530035857 +-0.63670666666666664 0.71672566666666671 -0.28326633333333334 -0.63896671989407539 0.71787542780718161 -0.2763628068652913 +-0.60073866666666664 0.74090699999999998 -0.29917166666666667 -0.60310957117011221 0.74208291099934309 -0.29252657719555042 +-0.92738500000000013 0.14052333333333333 -0.34578333333333333 -0.93265246963949344 0.14159484160179467 -0.33182867824694795 +-0.95314033333333337 0.10487713333333333 -0.28260466666666667 -0.9575696903435692 0.10517623583484231 -0.26832489178407298 +-0.94127266666666676 0.14291733333333334 -0.30483500000000002 -0.93928466319806303 0.14964084471225736 -0.30879109293291357 +-0.92568533333333336 0.10143216666666666 0.36358533333333326 -0.923820067450836 0.1080259060886271 0.36726950130505531 +-0.92738500000000013 0.14052333333333333 0.34578333333333333 -0.92745409669571854 0.13452325524080155 0.34890169435207236 +-0.91087466666666661 0.21552966666666665 0.35099133333333327 -0.90877103811651971 0.21458513885150166 0.35789442362895907 +-0.92716333333333323 0.17985566666666666 0.32766433333333334 -0.92525904843422668 0.17910077093038013 0.33439289337952871 +-0.56752666666666673 0.72956600000000005 0.38073966666666664 -0.56463019666820546 0.7345672394300764 0.37630268636630887 +-0.54906133333333329 0.72168266666666658 0.42072933333333334 -0.54621533469650274 0.72689965048017446 0.4162519744988456 +-0.54826399999999997 0.67978466666666681 0.48641133333333331 -0.55170269878735689 0.68190885068557827 0.48023374673946079 +-0.52944599999999997 0.71225633333333338 0.46008566666666662 -0.53274155487270891 0.71422300523490279 0.45395146712510209 +-0.95597666666666659 0.21201066666666665 0.20118666666666665 -0.95690704317590158 0.20579936405970636 0.20487931196920214 +-0.96388766666666659 0.21337133333333336 0.15716566666666665 -0.96498961593619303 0.20708100103663682 0.16097360077038458 +-0.72956600000000005 0.38073966666666664 0.56752666666666673 -0.7345672394300764 0.37630268636630887 0.56463019666820546 +-0.72168266666666658 0.42072933333333334 0.54906133333333329 -0.72689965048017446 0.41625197449884566 0.54621533469650274 +-0.67978466666666681 0.48641133333333331 0.54826399999999997 -0.68190885068557827 0.48023374673946079 0.55170269878735689 +-0.71225633333333338 0.46008566666666662 0.52944599999999997 -0.71422300523490267 0.45395146712510204 0.5327415548727088 +-0.58744933333333327 0.69894066666666665 0.40705300000000005 -0.59041897341165617 0.70066437394497161 0.40059314886780978 +-0.62454900000000002 0.67502866666666661 0.39189600000000002 -0.6274157295105669 0.67671755114831234 0.38523091559550915 +-0.67640700000000009 0.6563119999999999 0.33322933333333332 -0.67432926819010985 0.65519559013054052 0.3405859314999426 +-0.66024300000000002 0.64999866666666672 0.37535166666666669 -0.65786067131660153 0.64872408443505791 0.3825916875845139 +-0.81723666666666672 0.57523666666666662 0.023299466666666668 -0.81373864287838205 0.58061392593956873 0.026774803295076158 +-0.83792066666666665 0.54315766666666665 0.046653833333333332 -0.83448744125968655 0.5487362569508325 0.05019193847074753 +-0.87771233333333332 0.47617466666666663 0.046646866666666668 -0.87508176244013969 0.48205910673978014 0.043022397119454811 +-0.85703933333333326 0.50979200000000002 0.069971699999999998 -0.85433531332205448 0.5154624737890986 0.066404898359456094 +-0.95051300000000005 0.25157233333333334 0.18039633333333335 -0.94959360307011542 0.25112435222994373 0.18763941143962024 +-0.93505400000000005 0.28885866666666665 0.203819 -0.93397663141277909 0.28826917001433577 0.21115998104300893 +-0.90660333333333332 0.32204199999999999 0.2714273333333333 -0.90873512286035008 0.32318891316129489 0.26410112246941597 +-0.91756233333333326 0.32513833333333331 0.22731633333333334 -0.91941515130072438 0.32608678172641187 0.21987084923194722 +-0.48641133333333331 0.54826399999999997 0.67978466666666681 -0.48023374673946173 0.55170269878735756 0.68190885068557705 +-0.46008566666666662 0.52944599999999997 0.71225633333333338 -0.46497084928401095 0.53268824672673931 0.70713884146983341 +-0.69894066666666665 0.40705300000000005 0.58744933333333327 -0.70066437394497161 0.40059314886780972 0.59041897341165606 +-0.67502866666666661 0.39189600000000002 0.62454900000000002 -0.67671755114831245 0.3852309155955092 0.6274157295105669 +-0.6563119999999999 0.33322933333333332 0.67640700000000009 -0.65519559013054052 0.3405859314999426 0.67432926819010985 +-0.64999866666666672 0.37535166666666669 0.66024300000000002 -0.64872408443505791 0.3825916875845139 0.65786067131660153 +-0.93375666666666657 0.32944800000000002 -0.13732900000000001 -0.93569239277978344 0.32338590283165708 -0.1410719814272042 +-0.92663333333333331 0.32759366666666662 -0.18257666666666669 -0.92838638141934404 0.3215918038699474 -0.18621879195926974 +-0.83902233333333331 0.54346033333333332 1.1564823173178713e-18 -0.83581239393805806 0.54900373123283785 0.0035419248939295113 +-0.83792066666666676 0.54315766666666665 -0.046653833333333339 -0.83448744125968544 0.54873625695083406 -0.050191938470748536 +-0.81060299999999996 0.57337433333333332 -0.11609513333333332 -0.81516384919802287 0.56816097492600259 -0.11269873793347154 +-0.83464800000000006 0.54221033333333335 -0.093158400000000016 -0.83892675353125457 0.53681230026146276 -0.089635129818094392 +-0.58744933333333327 0.69894066666666665 -0.40705300000000005 -0.59423116751119709 0.69500052876707574 -0.4048006726424313 +-0.60522600000000004 0.70626633333333333 -0.36633966666666667 -0.60795094672564576 0.70779537966296169 -0.35975178512851724 +-0.62454900000000002 0.67502866666666661 -0.39189600000000002 -0.62741572951056634 0.67671755114831378 -0.38523091559550776 +-0.64266266666666672 0.64228433333333335 -0.41684100000000002 -0.64904701109747098 0.63801410392828295 -0.41433800281174993 +-0.38367900000000005 0.74262333333333341 0.5482703333333333 -0.39116371642590253 0.74786225232639714 0.5363702065711371 +-0.40315966666666664 0.71069466666666659 0.57591066666666657 -0.4108886401027837 0.71616865610076674 0.56415687663389058 +-0.46257966666666661 0.65831733333333331 0.59323799999999993 -0.4589162595376976 0.6561049344014962 0.59910114487116173 +-0.42151733333333335 0.67719066666666661 0.60252166666666662 -0.42456563876750142 0.67153860466225002 0.60727252599324932 +-0.78833399999999998 0.18632033333333334 0.58582466666666677 -0.79241984688079592 0.18923451832685775 0.57988023189536142 +-0.78873800000000005 0.14520933333333333 0.59682866666666667 -0.79283859219124986 0.14819581080877822 0.59113870486623177 +-0.80904799999999988 0.080161999999999997 0.58178533333333327 -0.81279318645478138 0.083207446503565236 0.57657935871746147 +-0.78831566666666664 0.10404483333333332 0.60592866666666667 -0.79232113178228425 0.10712457526959689 0.60062596472725738 +-0.38578466666666666 0.91196566666666667 0.13735133333333335 -0.38170698678408727 0.91489615052823059 0.13139562393336282 +-0.42467100000000002 0.89513766666666672 0.13334799999999999 -0.42068224010972921 0.8981888517078197 0.12760579737632846 +-0.47605000000000003 0.87439566666666668 0.090921466666666673 -0.47213747213919743 0.87734060758261101 0.085788493917212008 +-0.46239333333333338 0.87702533333333343 0.12820000000000001 -0.45849305759258224 0.88016659891075488 0.12284491972108272 +-0.66111533333333339 0.7498826666666667 1.1564823173178713e-18 -0.66161565731528682 0.74980409650499436 -0.0076510691795381152 +-0.65962500000000002 0.74992800000000004 0.043603633333333336 -0.66045762513433848 0.74999913909909399 0.036014118794267365 +-0.67900399999999994 0.72532733333333332 0.11055603333333335 -0.68027853678687666 0.72566683621403705 0.10309585445698602 +-0.65521533333333337 0.7500119999999999 0.086990833333333337 -0.65638577782881369 0.75021718069676646 0.079573189275400455 +-0.8741593333333334 0.448237 0.18500266666666665 -0.87226383732852775 0.45409049572763344 0.18154233605069586 +-0.85947633333333329 0.48395833333333332 0.16242533333333331 -0.85729015236698924 0.48968695293830161 0.15893483814628531 +-0.54990566666666663 0.81053333333333333 -0.20004 -0.55650732236296829 0.80686525433351164 -0.19816170544713457 +-0.51483299999999999 0.85042666666666678 -0.10573533333333333 -0.52098864538413292 0.84714907157637964 -0.10444750790748547 +-0.50254100000000002 0.852213 -0.14353533333333332 -0.50896696988675449 0.84897311065938064 -0.14211713809963461 +-0.60594999999999999 0.69364366666666666 -0.38857199999999997 -0.60878046227242755 0.69527367312307187 -0.38207442758881577 +-0.40237200000000001 0.90979499999999991 0.098831166666666651 -0.40597625682229971 0.90779782046843382 0.10529195624222863 +-0.58757233333333325 0.68550100000000003 -0.4291213333333333 -0.60010626624401753 0.67813792847666066 -0.42426574122364386 +-0.38106733333333337 0.92208600000000007 0.062795833333333342 -0.3846570304796883 0.92045209254229532 0.069331913553990904 +-0.32170033333333331 0.94615333333333329 0.025922166666666666 -0.33489551984912225 0.94191163998673699 0.025445102524492232 +-0.36080433333333334 0.93196800000000002 0.0254641 -0.36431486214481984 0.93072619151734937 0.031991211980967785 +-0.52997433333333333 0.84764833333333334 0.015967733333333334 -0.53582528751528857 0.84418786852804661 0.015430615322529994 +-0.36358533333333337 0.92568533333333336 -0.10143216666666667 -0.36726950130505548 0.92382006745083589 -0.10802590608862792 +-0.55563600000000002 0.83115833333333333 0 -0.56493884084547652 0.82513278089297204 -4.8139625934572138e-15 +-0.38106733333333337 0.92208600000000007 -0.062795833333333329 -0.38465703047968858 0.92045209254229521 -0.069331913553990418 +-0.57604433333333327 0.81494699999999998 -0.059267866666666662 -0.57105803285634704 0.81853487189697649 -0.062397007931786277 +-0.43467066666666665 0.8999693333333334 -0.023969299999999999 -0.43778575898804439 0.89857223759622595 -0.030192102420559901 +-0.58062966666666671 0.81361933333333336 -0.019809433333333331 -0.58189096904843107 0.81316353437949784 -0.012960188861321678 +-0.39849600000000002 0.91651633333333338 -0.024812700000000004 -0.40185500805245644 0.915171589304688 -0.031201196013799438 +-0.54633266666666669 0.8181653333333333 -0.17754333333333336 -0.55294580946744287 0.81448691874194379 -0.17567581219578471 +-0.56228400000000001 0.81096399999999991 0.15991200000000003 -0.55631566138133393 0.81488320691282423 0.1627213691969199 +-0.55811400000000011 0.81788833333333333 -0.137791 -0.55215961732090557 0.82177650837133309 -0.14072358469372334 +-0.52627699999999999 0.83234166666666665 0.17215800000000001 -0.53285688470931325 0.82885946709064051 0.17045681045973243 +-0.60036900000000004 0.79510999999999987 -0.082435966666666666 -0.59527376626746875 0.79895366475196428 -0.085569765531693417 +-0.47419900000000004 0.85190366666666673 0.22082566666666667 -0.48098951346609398 0.84883685748693138 0.21937428588456132 +-0.56820133333333334 0.81665133333333328 -0.098415533333333347 -0.56255375688704445 0.82049991190666305 -0.10155375509271103 +-0.48899699999999996 0.85274033333333332 0.18195600000000001 -0.49563977507792489 0.84956016905264986 0.18052349575591767 +-0.74262333333333341 0.5482703333333333 0.38367900000000005 -0.74061277632469169 0.55398308333902357 0.38025709581652889 +-0.71069466666666659 0.57591066666666657 0.40315966666666664 -0.708546009052897 0.58161318657068906 0.39961062831498956 +-0.45581200000000005 0.85766166666666666 -0.23665966666666663 -0.46266802420794495 0.85473908320643333 -0.23528578158261554 +-0.65831733333333331 0.59323799999999993 0.46257966666666661 -0.6561049344014962 0.59910114487116173 0.4589162595376976 +-0.41561399999999998 0.87583766666666663 -0.24396433333333331 -0.42522044230301215 0.87361769644806653 -0.23660028719425635 +-0.67719066666666661 0.60252166666666662 0.42151733333333335 -0.67491424805509503 0.60820598850026464 0.41782320821687419 +-0.5698266666666667 0.79545466666666664 -0.20475399999999999 -0.57183818311343537 0.79603524377618062 -0.19831536249045836 +-0.42592233333333329 0.72526299999999999 0.54026033333333323 -0.42958194071176437 0.72767861204289574 0.53473656485192689 +-0.53302133333333324 0.81731666666666669 -0.21738166666666667 -0.52957076434678196 0.82117934975840745 -0.21264825670464432 +-0.44788500000000003 0.73833599999999999 0.50354433333333326 -0.45138676422756718 0.74054950290021937 0.49783172140232762 +-0.47139533333333333 0.85913866666666661 -0.19760733333333333 -0.47812770940072347 0.85609518430535181 -0.19620124595017999 +-0.44803333333333334 0.77925900000000003 0.43740800000000002 -0.45122962594317989 0.78110031861947005 0.43159485275399229 +-0.49497199999999997 0.83811233333333324 -0.22790133333333332 -0.49139120814526255 0.84194317261708629 -0.22285954016154333 +-0.46898966666666669 0.74988700000000008 0.46585133333333334 -0.47230309114310021 0.75188318294279199 0.46000159706732352 +-0.93953100000000001 -0.012861600000000001 0.34131833333333333 -0.94005100311840917 0 0.34103388619911745 +-0.8999693333333334 -0.023969299999999999 0.43467066666666665 -0.89641650563157604 -0.017885401699656269 0.4428516239524436 +-0.91651633333333338 -0.024812700000000004 0.39849600000000002 -0.91389284750939048 -0.025174534648851492 0.40517416758277142 +-0.81096399999999991 0.15991200000000003 0.56228400000000001 -0.81488320691282601 0.16272136919691735 0.55631566138133204 +-0.83234166666666665 0.17215800000000001 0.52627699999999999 -0.82885946709064051 0.17045681045973182 0.53285688470931347 +-0.85190366666666673 0.22082566666666667 0.47419900000000004 -0.84883685748693138 0.21937428588456132 0.48098951346609398 +-0.85274033333333332 0.18195600000000001 0.48899699999999996 -0.84956016905264986 0.18052349575591767 0.49563977507792489 +-0.5482703333333333 0.38367900000000005 0.74262333333333341 -0.56022334572548227 0.37591850110522268 0.7381294489660668 +-0.57591066666666657 0.40315966666666664 0.71069466666666659 -0.58161318657068917 0.39961062831498956 0.708546009052897 +-0.59323799999999993 0.46257966666666661 0.65831733333333331 -0.59910114487116184 0.45891625953769766 0.65610493440149631 +-0.60252166666666662 0.42151733333333335 0.67719066666666661 -0.60820598850026475 0.41782320821687419 0.67491424805509515 +-0.72526299999999999 0.54026033333333323 0.42592233333333329 -0.72767861204289574 0.53473656485192689 0.42958194071176437 +-0.73833599999999999 0.50354433333333326 0.44788500000000003 -0.74054950290021926 0.49783172140232762 0.45138676422756718 +-0.77925900000000003 0.43740800000000002 0.44803333333333334 -0.78110031861947005 0.43159485275399234 0.45122962594317989 +-0.74988700000000008 0.46585133333333334 0.46898966666666669 -0.75188318294279199 0.46000159706732352 0.47230309114310021 +-0.91196566666666667 0.13735133333333335 0.38578466666666666 -0.91489615052823059 0.13139562393336282 0.38170698678408727 +-0.89513766666666672 0.13334799999999999 0.42467100000000002 -0.8981888517078197 0.12760579737632846 0.42068224010972921 +-0.87439566666666668 0.090921466666666673 0.47605000000000003 -0.87734060758261101 0.085788493917212008 0.47213747213919743 +-0.87702533333333343 0.12820000000000001 0.46239333333333338 -0.88016659891075488 0.12284491972108273 0.4584930575925823 +-0.75636666666666663 0.51228966666666664 -0.4059166666666667 -0.75865329835647843 0.5067472582234922 -0.40945376927781429 +-0.73833599999999999 0.50354433333333326 -0.44788500000000003 -0.74158633826808484 0.50561065077724099 -0.4409167412502597 +-0.58582466666666677 0.78833399999999998 0.18632033333333334 -0.57988023189535964 0.7924198468807967 0.18923451832686014 +-0.59682866666666667 0.78873800000000005 0.14520933333333333 -0.5911387048662301 0.79283859219125141 0.14819581080877617 +-0.58178533333333327 0.80904799999999988 0.080161999999999997 -0.57657935871746147 0.81279318645478138 0.083207446503565236 +-0.60592866666666667 0.78831566666666664 0.10404483333333332 -0.60062596472725738 0.79232113178228425 0.1071245752695969 +-0.59682866666666667 0.78873800000000005 -0.14520933333333333 -0.59113870486622888 0.79283859219125252 -0.14819581080877534 +-0.72526299999999999 0.54026033333333334 -0.42592233333333329 -0.72767861204289241 0.53473656485192844 -0.42958194071176797 +-0.71069466666666659 0.57591066666666668 -0.40315966666666664 -0.70854600905289511 0.58161318657069216 -0.39961062831498856 +-0.71068766666666672 0.6169296666666666 -0.33708266666666664 -0.70828943337678218 0.62222522892875576 -0.33340942255934275 +-0.69467099999999993 0.61040833333333333 -0.37964866666666669 -0.69233584091762446 0.61589682358755293 -0.37595503198607222 +-0.68725733333333328 0.72564533333333336 -0.022199266666666665 -0.68790368117369138 0.72565832946335795 -0.0144400245198193 +-0.65962500000000002 0.74992800000000004 -0.043603633333333336 -0.66045762513433692 0.7499991390990951 -0.036014118794271847 +-0.60575433333333339 0.794234 -0.041378733333333334 -0.60677526245756808 0.79413092226005266 -0.03434907829837075 +-0.63074133333333338 0.77298066666666665 -0.063896999999999995 -0.6318110775202368 0.77305026458344039 -0.056639657045134018 +-0.40237200000000001 0.90979500000000002 -0.098831166666666678 -0.4059762568223006 0.90779782046843327 -0.10529195624223014 +-0.42467100000000002 0.89513766666666672 -0.13334799999999999 -0.42068224010972916 0.89818885170781948 -0.12760579737632941 +-0.99349399999999999 0.10851619999999999 -0.022237466666666667 -0.99366413966331857 0.10853012501892692 -0.029202559999646969 +-0.98750233333333337 0.148782 -0.044724966666666664 -0.98751754500301114 0.14875603742522206 -0.051775859633345515 +-0.97215366666666669 0.22839699999999996 -0.045218333333333333 -0.97216451120541103 0.22834695483901651 -0.052476960358736502 +-0.97937533333333315 0.18860866666666665 -0.067428200000000008 -0.97923504472179446 0.18851326331065299 -0.074575309216078592 +-0.86488299999999996 0.44522266666666671 0.23033366666666666 -0.86718072358672216 0.43967029351048176 0.23385385531142255 +-0.88711800000000007 0.41159166666666663 0.20715033333333333 -0.88928944660465614 0.4059111746818222 0.21071402047801124 +-0.91466100000000006 0.37891566666666671 0.13824433333333333 -0.91689163039086208 0.37305445430029116 0.14191586326376218 +-0.90747233333333333 0.37685399999999997 0.18377033333333334 -0.90952132795887353 0.37102658099972141 0.18737724029236921 +-0.98849733333333323 0.14889633333333332 -1.1564823173178713e-18 -0.98881853925647345 0.14895675499016464 -0.0070556052535643982 +-0.98750233333333337 0.148782 0.044724966666666664 -0.98751754500301092 0.14875603742522195 0.051775859633347958 +-0.98758800000000002 0.10800340000000001 0.11095060000000001 -0.98715914492012036 0.10787007612224334 0.1178171009571965 +-0.98452266666666655 0.14843300000000001 0.089341133333333336 -0.98423575270793739 0.14831702844712868 0.096343355578128551 +-0.37950966666666663 0.86683433333333326 0.32232633333333333 -0.38258934313579762 0.86803909017894487 0.31643882890730773 +-0.36019033333333333 0.85979766666666668 0.36100666666666664 -0.3675745341215505 0.85758746356507642 0.35976756969096546 +-0.362674 0.82594966666666669 0.4307913333333333 -0.37670864323402198 0.82110212139525307 0.42881453374739692 +-0.97972166666666671 -0.026782933333333332 0.19685366666666668 -0.97844680898053793 -0.027139122204929943 0.20470786511941458 +-0.9873993333333333 -0.026941300000000001 0.15372666666666668 -0.98646689731815052 -0.027323269255811418 0.16166786771859171 +-0.99567566666666674 0.013556566666666667 0.088052033333333335 -0.99539188988286775 0.013538437507782957 0.094929954520481544 +-0.99320699999999995 -0.027062466666666663 0.11007063333333333 -0.99262536964779458 -0.027448998744322078 0.11807382436219034 +-0.99017999999999995 0.13544999999999999 0.022326099999999998 -0.99034549974472819 0.13546610395069736 0.029406220698746464 +-0.99414233333333335 0.094949566666666665 0.044384866666666668 -0.99415826351618952 0.09492444190745418 0.051368252949006939 +-0.9985909999999999 0.013590633333333333 0.044029100000000009 -0.99861153173989292 0.01358945587142231 0.050895337362310569 +-0.99597933333333322 0.054270233333333334 0.066234899999999999 -0.99584388442193827 0.054237984373482949 0.073165558226034058 +-0.82594966666666669 0.4307913333333333 0.362674 -0.82785431066039616 0.42508009428749394 0.36601113884899122 +-0.85106633333333337 0.39919166666666667 0.34005899999999994 -0.85280497080606454 0.39346996082837155 0.34337307945467582 +-0.74024633333333334 0.51888433333333328 0.42672700000000002 -0.74257141516746727 0.51324151458922507 0.43031481624311191 +-0.77051866666666669 0.49050400000000005 0.40621499999999999 -0.77270320478273313 0.48485766119619816 0.40968622834780072 +-0.81468733333333343 0.46787466666666666 0.34159100000000003 -0.8168231817552648 0.46233366051553543 0.34503257252252489 +-0.79909666666666668 0.46117466666666668 0.38479733333333338 -0.80114527169293681 0.45549482658489687 0.38818902173869541 +-0.9840779999999999 -0.0134354 0.17529833333333333 -0.98521551962444398 -0.0067284410507964494 0.17118734758200649 +-0.71838866666666679 0.65739499999999995 0.22599133333333332 -0.71553780893610663 0.66226771662737915 0.22227711419773558 +-0.9873993333333333 0.026941300000000001 0.15372666666666665 -0.98667240814492363 0.026890596352768442 0.16048194550568526 +-0.73784766666666657 0.62639233333333333 0.25005566666666668 -0.73520009164158984 0.63148093086238388 0.24639938962459892 +-0.97958233333333344 0.14785633333333334 0.13365466666666667 -0.98035278201893183 0.14140532735560749 0.13752438395860647 +-0.80106633333333332 0.53071599999999997 0.27557166666666671 -0.7989719161796639 0.536265657645561 0.27214522150162812 +-0.97273166666666666 0.14706466666666665 0.17742433333333332 -0.97332507116728162 0.14069236473595817 0.18122903835260593 +-0.81243133333333339 0.53480433333333333 0.23075133333333331 -0.8101700112367497 0.54034534738107576 0.22726957221825661 +-0.84005133333333337 0.33887933333333331 -0.42284533333333335 -0.84320163302342188 0.34078478283065056 -0.4157844848689054 +-0.83285633333333342 0.37765766666666667 -0.4037823333333333 -0.8343824500435969 0.37181688618420933 -0.40688835103443721 +-0.83950633333333335 0.42241299999999998 -0.34073899999999996 -0.84139072144433491 0.41671320306238774 -0.3441100990393437 +-0.82400366666666669 0.41591733333333331 -0.38384699999999999 -0.82578576083367294 0.41017013682103337 -0.38708957111315551 +-0.87569633333333341 0.43517099999999997 -0.207564 -0.87802007925767067 0.42952993482460028 -0.21115107271792039 +-0.86546833333333328 0.43182166666666671 -0.25258333333333333 -0.86762894089824827 0.42618611131614031 -0.25609650414835899 +-0.82827800000000007 0.4594753333333334 -0.31960100000000002 -0.8304139645378581 0.45393507348914391 -0.32304116851714487 +-0.85336699999999999 0.42763400000000001 -0.29698633333333335 -0.8553833832274883 0.42197135721665091 -0.30043209114046621 +-0.74517200000000006 0.6408423333333334 -0.18265566666666666 -0.74224043434856068 0.64576760458469673 -0.17906238713644693 +-0.76478933333333332 0.60974166666666674 -0.20646366666666668 -0.76208480428307168 0.61485905697699661 -0.20291646343801342 +-0.77153066666666659 0.5732626666666667 -0.27462199999999998 -0.7691811662928385 0.57868388027417195 -0.27108172223744026 +-0.78303900000000004 0.5772896666666667 -0.22998833333333332 -0.7805596921302298 0.58261180697286785 -0.22647306550089036 +-0.72644833333333336 0.55500833333333321 -0.40440066666666663 -0.72439943030853671 0.56081299478492408 -0.40091676224502282 +-0.74308733333333332 0.56231999999999993 -0.36183000000000004 -0.74095857789011721 0.56796520450867349 -0.35832375349462364 +-0.78747599999999995 0.53911566666666666 -0.29756200000000005 -0.78538004564948882 0.54467029029810377 -0.29413000316558346 +-0.75816133333333335 0.56834533333333326 -0.31856266666666672 -0.75591839905677671 0.57388445654331854 -0.31503016443734327 +-0.97972166666666671 0.026782933333333332 -0.19685366666666668 -0.97903891595984682 0.033539917629471783 -0.2008926951423978 +-0.9873993333333333 0.026941300000000001 -0.15372666666666668 -0.98667240814492363 0.026890596352768366 -0.1604819455056852 +-0.99567566666666674 -0.013556566666666667 -0.088052033333333335 -0.99645037790286128 -0.0067825110210987917 -0.083908533067223873 +-0.99320699999999995 0.027062466666666663 -0.11007063333333333 -0.99277645957187444 0.027023373377348336 -0.11689584514106015 +-0.9985909999999999 -0.013590633333333333 -0.044029100000000009 -0.99881287530810392 -0.0068038108128188786 -0.048234306019487111 +-0.85702366666666663 0.34606799999999999 -0.38087633333333332 -0.85837763506900822 0.3402100303585775 -0.38398563886785186 +-0.8793616666666666 0.31327633333333332 -0.35763733333333336 -0.88205972540034017 0.31481725442731096 -0.35051495993969534 +-0.90397933333333336 0.24023133333333332 -0.35277166666666665 -0.90184935426715007 0.23919234458256397 -0.35979822748454465 +-0.89978666666666662 0.27934999999999999 -0.33417800000000003 -0.89777797192039699 0.2783212344704471 -0.34136784203750853 +-0.92134066666666659 0.20500533333333334 -0.32930966666666667 -0.91939394482786752 0.20415305190362462 -0.33620872328404577 +-0.90640266666666669 0.20096933333333333 -0.37067 -0.9090221925572588 0.20849605940253854 -0.36084352100599926 +-0.40261533333333333 0.84358833333333338 0.3543716666666667 -0.40567559458008401 0.84497406496934002 0.34849123588877379 +-0.44426433333333337 0.82582333333333324 0.34636500000000003 -0.44788120365419287 0.82188455470053834 0.35200597460550193 +-0.50220666666666669 0.81162366666666663 0.29731033333333334 -0.49883260789314809 0.81591989161691847 0.29230251412938058 +-0.48500100000000002 0.80657299999999987 0.33695900000000001 -0.48167303761240987 0.81106618862543955 0.33190770178746504 +-0.54111533333333328 0.79043766666666659 0.285908 -0.53782883589854502 0.79478643964980356 0.28116660296842705 +-0.51826699999999992 0.8151826666666665 0.25734633333333329 -0.51483738173932114 0.81927210874247614 0.25245926839879901 +-0.71510766666666681 0.66833066666666652 -0.20317933333333335 -0.71214652401015688 0.67309545366944323 -0.19947390453334365 +-0.72425300000000004 0.67053999999999991 -0.15863733333333332 -0.7296647789377706 0.66585752370229223 -0.15563761918876087 +-0.75888966666666668 0.644177 -0.091938833333333345 -0.75461173338973031 0.64921606847318236 -0.095287083420423052 +-0.73132766666666671 0.67199433333333325 -0.11367523333333333 -0.72672368166859569 0.67689322828463949 -0.11699678629962644 +-0.83168433333333336 0.55413233333333334 -0.023326566666666663 -0.82834740396313333 0.55957288650226811 -0.026809756415478874 +-0.80900833333333333 0.5853666666666667 -0.046535399999999998 -0.80536664437786842 0.59066725196862724 -0.049967645285346952 +-0.76245399999999997 0.64488299999999998 -0.046073400000000007 -0.75844767523465539 0.64985474643003172 -0.049456369392685988 +-0.78476100000000004 0.61534100000000003 -0.069477033333333341 -0.78081027126240599 0.62050512688950177 -0.072860879729599884 +-0.35277166666666665 0.90397933333333336 -0.24023133333333332 -0.35884953293333854 0.90540314548384249 -0.22687476030067502 +-0.40431166666666668 0.90593933333333332 -0.12329633333333334 -0.40021859160024631 0.90887682535716718 -0.11733710097915648 +-0.38781933333333335 0.90705666666666662 -0.16191933333333333 -0.39436940024219586 0.90473780623552025 -0.1610039692701673 +-0.37067 0.90640266666666669 -0.20096933333333333 -0.37452548842842248 0.90371268663343907 -0.20744647149378848 +-0.42130033333333339 0.84991400000000006 0.31540433333333334 -0.42422166270159223 0.85104278700009928 0.3094546099023251 +-0.39799066666666666 0.87218166666666674 0.28325866666666671 -0.39102043340789627 0.87515194316742995 0.28497736230755671 +-0.33260966666666664 0.90763266666666664 0.25476333333333329 -0.34273989784634673 0.90618364900595938 0.24771063097598361 +-0.3744993333333333 0.89252600000000004 0.24997166666666668 -0.38154197856914401 0.8902251303593165 0.2488472139009815 +-0.30914666666666668 0.9250423333333333 0.21922133333333335 -0.31708091584157094 0.91986749040706861 0.23087549220580375 +-0.38235766666666665 0.91950733333333334 0.08777366666666668 -0.38603366980132137 0.91764343429393269 0.094385026762517532 +-0.34321000000000002 0.93462666666666661 0.089739633333333332 -0.34697098790484687 0.9329023422143834 0.096459076520834311 +-0.72845533333333334 0.66008133333333341 0.18158266666666667 -0.72544745530847643 0.66487474133902336 0.17795383647402202 +-0.69767499999999993 0.68696599999999997 0.20164099999999999 -0.69650390892021663 0.68635276333029871 0.20928972532764595 +-0.65288666666666673 0.70969066666666658 0.26345566666666664 -0.65501968417060419 0.71076863277450397 0.25643159714220903 +-0.66528666666666669 0.71280966666666679 0.22053199999999998 -0.66719302095845745 0.71368475232804907 0.21332497996900987 +-0.60594999999999999 0.69364366666666666 0.38857199999999997 -0.60878046227242899 0.69527367312307142 0.38207442758881438 +-0.62304033333333342 0.70030133333333333 0.3474376666666667 -0.62562797974048401 0.70174682321566206 0.34079469930233214 +-0.61778100000000002 0.73429599999999995 0.28015933333333337 -0.62004007182029142 0.73539666254061653 0.27338993774682063 +-0.63873966666666671 0.70558766666666661 0.30574499999999999 -0.64109301993334877 0.70685708038104444 0.29891940001934414 +-0.9840779999999999 0.0134354 0.17529833333333333 -0.98320307150509523 0.013404506121270485 0.1820220849199112 +-0.97857266666666665 0.053538400000000007 0.1971103333333333 -0.979324934656573 0.060177193173974249 0.19313564606669897 +-0.96046299999999996 0.092355799999999988 0.26138033333333338 -0.9603910423236186 0.08592826281060327 0.26507617673964096 +-0.97088433333333324 0.093213466666666675 0.21914 -0.97096749167518503 0.086713040544329462 0.22294164866519872 +-0.91950733333333334 0.08777366666666668 0.38235766666666665 -0.91764343429393269 0.094385026762517532 0.38603366980132137 +-0.93462666666666661 0.089739633333333332 0.34321000000000002 -0.93431304332940213 0.083562648426005665 0.34652044795737857 +-0.94964533333333334 0.13090333333333334 0.28351199999999999 -0.94977514119533712 0.12461157419779904 0.28705249823564311 +-0.9483233333333333 0.091219933333333336 0.30284166666666668 -0.94812943316726528 0.084897429891930984 0.30633805568303907 +-0.68696599999999997 0.20164099999999999 0.69767499999999993 -0.69662025032073494 0.19323465497063358 0.69092734419869128 +-0.70969066666666658 0.26345566666666664 0.65288666666666673 -0.71076863277450408 0.25643159714220909 0.6550196841706043 +-0.71280966666666679 0.22053199999999998 0.66528666666666669 -0.71368475232804918 0.21332497996900987 0.66719302095845745 +-0.69364366666666666 0.38857199999999997 0.60594999999999999 -0.69527367312307142 0.38207442758881438 0.60878046227242899 +-0.70030133333333333 0.3474376666666667 0.62304033333333342 -0.70174682321566206 0.34079469930233214 0.62562797974048401 +-0.73429599999999995 0.28015933333333337 0.61778100000000002 -0.73539666254061653 0.27338993774682063 0.62004007182029142 +-0.70558766666666661 0.30574499999999999 0.63873966666666671 -0.70685708038104444 0.29891940001934414 0.64109301993334866 +-0.84358833333333338 0.3543716666666667 0.40261533333333333 -0.84497406496934002 0.34849123588877379 0.40567559458008401 +-0.82582333333333324 0.34636500000000003 0.44426433333333337 -0.82188455470053834 0.35200597460550193 0.44788120365419287 +-0.81162366666666663 0.29731033333333334 0.50220666666666669 -0.81591989161691847 0.29230251412938058 0.49883260789314809 +-0.80657299999999987 0.33695900000000001 0.48500100000000002 -0.81106618862543955 0.33190770178746498 0.48167303761240993 +-0.8181653333333333 0.17754333333333336 0.54633266666666669 -0.81448691874194223 0.17567581219578526 0.55294580946744487 +-0.81731666666666669 0.21738166666666667 0.53302133333333324 -0.82117934975840645 0.21264825670464366 0.52957076434678363 +-0.79043766666666659 0.285908 0.54111533333333328 -0.79478643964980356 0.2811666029684271 0.53782883589854502 +-0.8151826666666665 0.25734633333333329 0.51826699999999992 -0.81927210874247614 0.25245926839879901 0.51483738173932114 +-0.74868333333333326 0.62970633333333337 0.20557800000000001 -0.74587853360328382 0.63471859439677514 0.20198395737482966 +-0.75754100000000013 0.63220766666666661 0.16052666666666668 -0.76269529192907415 0.62731830658435561 0.15737736143855202 +-0.74243766666666655 0.66315266666666661 0.091391999999999987 -0.7380201623109971 0.66809911774214681 0.094709075038321919 +-0.76435100000000011 0.63392533333333334 0.11503839999999999 -0.75999418759786697 0.63905202783527448 0.11841174155075082 +-0.66962899999999992 0.74196399999999996 0.021954166666666667 -0.67028755876104185 0.74196595278651578 0.014181448295595584 +-0.69494100000000003 0.71724500000000013 0.044609500000000003 -0.69058513447234893 0.72166551516255684 0.047864979588098266 +-0.74612066666666665 0.66373699999999991 0.045797666666666674 -0.74198240659209025 0.66861355370751385 0.049173408529605271 +-0.71923599999999999 0.69097666666666668 0.067828766666666665 -0.71484071533694804 0.69565931898028299 0.071139747064838055 +-0.44099433333333332 0.84560366666666675 -0.29968466666666665 -0.44669675023868344 0.847564540632879 -0.28652462858884598 +-0.50412633333333334 0.80162933333333319 -0.32027700000000003 -0.50335093264587394 0.8069158784614664 -0.30907054808132195 +-0.48135633333333333 0.82648499999999991 -0.29078700000000002 -0.47787127089350295 0.83068865576297879 -0.28564909529232502 +-0.56820666666666664 0.71697033333333327 -0.40298833333333334 -0.58093846961652296 0.70982246495114332 -0.39832469515496399 +-0.54774466666666666 0.7468366666666667 -0.37619833333333336 -0.56066025968805722 0.73992724229620144 -0.37170922683524893 +-0.54323266666666659 0.78036933333333336 -0.30863433333333329 -0.54003468947667976 0.78483938517234042 -0.30395669698845057 +-0.52632333333333337 0.77506433333333324 -0.34868433333333332 -0.53939307913484291 0.76838593694752411 -0.34443890326545362 +-0.73524766666666663 0.6380096666666667 -0.22731699999999999 -0.73247878998148919 0.64299905357400278 -0.22366725135832943 +-0.70400200000000002 0.66529633333333327 -0.24715366666666663 -0.70252952126911361 0.66450329097410654 -0.25473054004177048 +-0.65008200000000005 0.72023166666666671 -0.24082699999999999 -0.65209324997457174 0.72120350456889659 -0.23375178787581957 +-0.67113733333333325 0.69153466666666663 -0.26586133333333334 -0.67327750173586243 0.69264770558930855 -0.25872101112623663 +-0.58185500000000001 0.79621133333333338 -0.16397500000000001 -0.5759024890943909 0.80029787243831818 -0.16691206794473051 +-0.60520099999999999 0.77270733333333341 -0.18981166666666668 -0.60701838370830674 0.7733167665531343 -0.18305698677723373 +-0.61521733333333328 0.74463999999999997 -0.25760333333333335 -0.61737720596625756 0.74562370031847547 -0.25078014888878547 +-0.6280163333333334 0.74735400000000007 -0.21542566666666665 -0.62994672096641058 0.74812731929989273 -0.20850094211015854 +-0.9840779999999999 -0.0134354 -0.17529833333333333 -0.98691241345678504 -0.013902770097773812 -0.16065678058679073 +-0.84991400000000006 0.31540433333333334 0.42130033333333339 -0.85104278700009928 0.3094546099023251 0.42422166270159223 +-0.87218166666666674 0.28325866666666671 0.39799066666666666 -0.87515194316742995 0.28497736230755671 0.39102043340789627 +-0.90763266666666664 0.25476333333333329 0.33260966666666664 -0.90564963743778037 0.2537815664677886 0.33969640965128323 +-0.89252600000000004 0.24997166666666668 0.3744993333333333 -0.8902251303593165 0.2488472139009815 0.38154197856914401 +-0.94270433333333337 0.26347700000000002 0.20296099999999997 -0.94165092030341868 0.26294319089648543 0.21012953779252261 +-0.93280466666666662 0.26126333333333335 0.24684200000000001 -0.93145059669590613 0.26058069002973927 0.25396356017835581 +-0.9250423333333333 0.21922133333333335 0.30914666666666668 -0.92324824765135183 0.21840485990215974 0.31608857995793876 +-0.92108633333333334 0.25843766666666668 0.29005533333333333 -0.91942952058264094 0.25759897198975035 0.2971399103301321 +-0.5970939999999999 0.57400033333333333 0.559728 -0.59735900477779025 0.57412757476011167 0.55994620037192899 +-0.58218099999999995 0.61056333333333335 0.53625699999999998 -0.58231563453184998 0.61077524703187103 0.5365278179115468 +-0.52701999999999993 0.66796766666666674 0.524752 -0.53067049118758236 0.67029144614632918 0.51874676577863399 +-0.56587633333333331 0.64585599999999999 0.51180999999999999 -0.56946362135064477 0.64813805873458874 0.50559691531690387 +-0.40440066666666663 0.72644833333333336 0.55500833333333333 -0.41178317764580941 0.72388693021211736 0.55355426732705892 +-0.44618933333333333 0.70834066666666684 0.54632233333333335 -0.44274739014690234 0.70634826733897726 0.55231048672402683 +-0.50875899999999996 0.70129166666666676 0.49865066666666663 -0.51227314734642249 0.70346879484043656 0.49265391218738364 +-0.48709399999999997 0.68882333333333323 0.53624499999999997 -0.49079818955949378 0.69119748274502613 0.53043677942999268 +-0.38439033333333333 0.75755833333333333 0.52692766666666657 -0.3984138134810481 0.7523341244104359 0.52465207373560541 +-0.92875233333333329 0.36902433333333334 0.023093466666666663 -0.92909577934043552 0.36911258269415131 0.023171838697909626 +-0.94198866666666659 0.33142500000000003 0.04592396666666667 -0.94233057969160439 0.33150388176605172 0.046024503822688481 +-0.9656313333333334 0.25454166666666667 0.045389633333333339 -0.96563827865214957 0.25447243147524934 0.052787275178665882 +-0.95327899999999988 0.29303333333333331 0.068455500000000016 -0.95312415703736364 0.29288506573994472 0.075978151716947218 +-0.99018000000000006 0.13544999999999999 -0.022326100000000001 -0.99034549974472841 0.13546610395069533 -0.029406220698747692 +-0.98410066666666662 0.17562699999999998 0 -0.98442075068827462 0.17568207852183432 -0.0071828198210750361 +-0.97389733333333339 0.21503999999999998 0.067673766666666663 -0.97374709075627075 0.21493760296758127 0.07495618769821083 +-0.97591266666666654 0.21536433333333335 0.022573899999999997 -0.97607441993813926 0.21537615737539617 0.029863649754066537 +-0.9754856666666667 0.013347533333333333 -0.21812066666666666 -0.97401232856293862 0.026285001833126275 -0.22496462496587019 +-0.97857266666666654 0.053538400000000007 -0.19711033333333336 -0.97932493465657278 0.060177193173970425 -0.19313564606670133 +-0.9863019999999999 0.094360200000000005 -0.13272600000000001 -0.98571899316339384 0.094201848958944151 -0.13958537949821809 +-0.97951366666666662 0.093863266666666667 -0.17624100000000001 -0.97990967194526546 0.10047745418984431 -0.17228266316623408 +-0.9951253333333332 0.095028733333333337 -1.1564823173178713e-18 -0.9954450963919369 0.095080919327119623 -0.0069770229437209307 +-0.99414233333333335 0.094949566666666665 -0.044384866666666668 -0.99415826351618952 0.094924441907454235 -0.051368252949006959 +-0.98424200000000006 0.13481499999999999 -0.11134860000000001 -0.98380455546183165 0.13465699226459019 -0.11830507633572626 +-0.99119466666666656 0.094722766666666666 -0.088691666666666669 -0.99090868604521276 0.094624458621765259 -0.095635703326151886 +-0.57400033333333333 0.559728 0.5970939999999999 -0.57412757476011167 0.55994620037192899 0.59735900477779025 +-0.61056333333333335 0.53625699999999998 0.58218099999999995 -0.61077524703187092 0.53652781791154669 0.58231563453184998 +-0.66796766666666674 0.524752 0.52701999999999993 -0.67029144614632918 0.51874676577863399 0.53067049118758236 +-0.64585599999999999 0.51180999999999999 0.56587633333333331 -0.64813805873458874 0.50559691531690387 0.56946362135064477 +-0.72644833333333336 0.55500833333333333 0.40440066666666663 -0.72439943030853515 0.56081299478492752 0.40091676224502076 +-0.70834066666666684 0.54632233333333335 0.44618933333333333 -0.70634826733897726 0.55231048672402683 0.44274739014690234 +-0.70129166666666676 0.49865066666666663 0.50875899999999996 -0.70346879484043656 0.49265391218738364 0.51227314734642249 +-0.68882333333333323 0.53624499999999997 0.48709399999999997 -0.69119748274502602 0.53043677942999257 0.49079818955949372 +-0.71510766666666659 0.66833066666666652 0.20317933333333335 -0.7121465240101571 0.67309545366944168 0.19947390453334798 +-0.70400200000000002 0.66529633333333327 0.24715366666666669 -0.70252952126911561 0.66450329097410477 0.25473054004176948 +-0.70974033333333342 0.62968733333333338 0.31475999999999998 -0.70722940200759854 0.63488697783600867 0.31103874085109395 +-0.69105033333333343 0.66134433333333342 0.29050300000000001 -0.68928038046168305 0.66038496798852653 0.29796686252902399 +-0.75755833333333333 0.52692766666666657 0.38439033333333333 -0.75563435731375406 0.5327508406532252 0.38104233338345961 +-0.74308733333333332 0.56232000000000004 0.36183000000000004 -0.74095857789011776 0.56796520450867294 0.35832375349462325 +-0.69445200000000007 0.62386399999999986 0.35754100000000005 -0.69203077337497576 0.62922690351361477 0.35378936190436955 +-0.72712433333333326 0.59662133333333323 0.33858233333333332 -0.72479541496417221 0.60206985994653062 0.33493803933097638 +-0.39970366666666668 0.8632616666666667 0.30715500000000001 -0.40269359976225672 0.86434752812370608 0.3012328257958527 +-0.35763733333333336 0.8793616666666666 0.31327633333333332 -0.35051495993969434 0.88205972540034061 0.31481725442731084 +-0.31486966666666666 0.89383633333333334 0.31817000000000001 -0.32141623142252845 0.89646988933045202 0.30501367789328204 +-0.92875233333333329 0.36902433333333334 -0.023093466666666663 -0.92909577934043563 0.36911258269415131 -0.023171838697907406 +-0.91360566666666665 0.40573133333333339 0 -0.91395529702109868 0.40581487056505949 -7.6650762202989397e-05 +-0.89445666666666668 0.44087900000000002 0.069773100000000005 -0.8921471485624638 0.44687846223520744 0.066129458656195655 +-0.89658166666666661 0.44146866666666668 0.023282399999999998 -0.89406335609088383 0.44751152718113485 0.019599702434322533 +-0.87569633333333341 0.43517099999999997 0.207564 -0.87802007925767123 0.42952993482459917 0.21115107271792008 +-0.88396799999999998 0.4377786666666667 0.16201833333333335 -0.88647153569421999 0.43211376507175492 0.16566807308423559 +-0.87450700000000003 0.47524699999999998 0.093143066666666663 -0.87208010639908573 0.48110197469553667 0.089538695361360249 +-0.8902363333333333 0.439668 0.11605323333333334 -0.88812183032546255 0.44564102421677071 0.11244417296764649 +-0.8632616666666667 0.30715500000000001 0.39970366666666668 -0.86434752812370608 0.3012328257958527 0.40269359976225672 +-0.8793616666666666 0.31327633333333332 0.35763733333333336 -0.88205972540034072 0.3148172544273109 0.35051495993969439 +-0.8861296666666667 0.35661433333333337 0.29480833333333334 -0.88770117086706257 0.35082964097389946 0.298169740676969 +-0.89383633333333334 0.31817000000000001 0.31486966666666666 -0.89624801139507848 0.31951953619145285 0.30764714863357029 +-0.85258733333333325 0.46819666666666665 0.23063066666666665 -0.85071803619800823 0.47398585102273655 0.22719206834230932 +-0.86546833333333328 0.4318216666666666 0.25258333333333333 -0.86762894089824816 0.42618611131614109 0.25609650414835827 +-0.89808433333333326 0.36037766666666671 0.25075433333333336 -0.89979701339302798 0.35458216684467231 0.25423772663537536 +-0.87666166666666667 0.39457300000000001 0.27400933333333338 -0.87853054159162092 0.38883780863987261 0.27746936058396582 +-0.55500833333333333 0.40440066666666663 0.72644833333333336 -0.560105432184139 0.40765908089184932 0.72117680121051542 +-0.54632233333333335 0.44618933333333333 0.70834066666666684 -0.55231048672402683 0.44274739014690234 0.70634826733897726 +-0.49865066666666663 0.50875899999999996 0.70129166666666676 -0.49265391218738364 0.51227314734642249 0.70346879484043656 +-0.53624499999999997 0.48709399999999997 0.68882333333333323 -0.53043677942999268 0.49079818955949367 0.69119748274502613 +-0.66529633333333327 0.24715366666666669 0.70400200000000002 -0.67400167013189838 0.2536091376418031 0.69383294384454874 +-0.62968733333333338 0.31475999999999998 0.70974033333333342 -0.63469905587766706 0.31800651135779723 0.70429323949761236 +-0.66134433333333342 0.29050300000000001 0.69105033333333343 -0.66038496798852653 0.29796686252902399 0.68928038046168305 +-0.56232000000000004 0.36183000000000004 0.74308733333333332 -0.57161008136831104 0.36848181702340249 0.7331323655392965 +-0.62386399999999986 0.35754100000000005 0.69445200000000007 -0.62922690351361477 0.35378936190436955 0.69203077337497576 +-0.59662133333333323 0.33858233333333332 0.72712433333333326 -0.60573461278917862 0.3451074417932965 0.71692847097045209 +-0.94302533333333327 0.33165866666666671 0 -0.94332079023156645 0.33188233866370914 -2.0645674448368696e-16 +-0.9419886666666667 0.33142500000000003 -0.04592396666666667 -0.9423305796916045 0.33150388176605133 -0.046024503822688273 +-0.92250933333333329 0.36743666666666669 -0.11516276666666668 -0.92477192156992361 0.36146431664713258 -0.11891358571119012 +-0.93888933333333335 0.33070500000000003 -0.091738066666666673 -0.94101246637268221 0.32459334718907801 -0.095575609293335778 +-0.86189800000000005 0.47129566666666661 -0.18523799999999999 -0.85984579511114489 0.4771076381594323 -0.18175123174166177 +-0.72845533333333334 0.6600813333333333 -0.18158266666666667 -0.7254474553084781 0.66487474133902225 -0.17795383647401947 +-0.75754099999999991 0.63220766666666661 -0.16052666666666668 -0.76269529192907126 0.62731830658435828 -0.15737736143855552 +-0.80410033333333331 0.57136966666666666 -0.16208199999999998 -0.80143539604984326 0.57666967522084989 -0.15859820818379541 +-0.78491366666666673 0.60333300000000001 -0.13862866666666665 -0.7897729464689609 0.59827686849897932 -0.1353642554177088 +-0.74024633333333334 0.51888433333333339 -0.42672700000000002 -0.74257141516746672 0.51324151458922485 -0.43031481624311307 +-0.70834066666666662 0.54632233333333324 -0.44618933333333333 -0.71156848987857446 0.5483828868857894 -0.43925675132288244 +-0.65946733333333329 0.60814899999999994 -0.441085 -0.65399110933731253 0.62014958554441335 -0.43325526016061694 +-0.84991400000000006 0.31540433333333334 -0.42130033333333339 -0.84801861201595774 0.3289341025018061 -0.41553193606010613 +-0.82582333333333324 0.34636500000000003 -0.44426433333333337 -0.82355866817668288 0.35984158015639028 -0.43848050955726697 +-0.79176933333333332 0.41493233333333329 -0.44748600000000005 -0.78860909795809553 0.42820671089368856 -0.44128755178831852 +-0.57987066666666665 0.59409199999999995 0.55685966666666664 -0.57765607108327444 0.60032566082443639 0.55310267084542164 +-0.54185133333333335 0.6166786666666666 0.5704326666666667 -0.53827283249171476 0.61459058224575014 0.57666348420562952 +-0.4790543333333333 0.62262166666666674 0.61817566666666668 -0.48585593822267048 0.61959051746381588 0.61648325035047735 +-0.50272266666666665 0.6381163333333334 0.58255299999999999 -0.49909043067144071 0.6359748331968218 0.58859557724508138 +-0.4291213333333333 0.58757233333333325 0.68550100000000003 -0.44287025493391391 0.58129621282282395 0.68261310436631106 +-0.43866333333333335 0.64218399999999998 0.6280673333333332 -0.44564628559022512 0.63939888485503282 0.62655283431309761 +-0.45450433333333334 0.60574300000000003 0.65252999999999994 -0.44805947938148183 0.60897952160709901 0.65451252486074274 +-0.9840779999999999 0.0134354 -0.17529833333333333 -0.98502511365736167 0.020132858611957922 -0.17123140327758998 +-0.9873993333333333 -0.026941300000000001 -0.15372666666666665 -0.98908856318175531 -0.013855941447276254 -0.14666910741413983 +-0.85751700000000008 0.0098685999999999999 0.51400666666666661 -0.85625815419931606 0.016157371151246901 0.51629537352629973 +-0.84412233333333331 0.033939766666666669 0.53466000000000002 -0.84211831054466535 0.044479445379375336 0.53745542139245528 +-0.8076793333333333 0.040241233333333327 0.58780333333333334 -0.81112166378311712 0.05030456718831848 0.58271013125026749 +-0.82775166666666655 0.0568081 0.55776333333333328 -0.8311982227298389 0.060162204636448988 0.55271151938786212 +-0.78756366666666666 0.062679333333333337 0.6125790000000001 -0.79125242395262319 0.07298140215876496 0.60711886523813341 +-0.51400666666666661 0.85751700000000008 -0.0098685999999999999 -0.51629537352629973 0.85625815419931606 -0.016157371151246894 +-0.50072033333333332 0.86509833333333341 0.020975933333333335 -0.49296150071514128 0.86961675129264893 0.027489355829028849 +-0.51093266666666659 0.85518833333333344 0.084138333333333329 -0.51693773592267456 0.85198203848343856 0.083078175718679162 +-0.48871233333333336 0.87042766666666671 0.054918800000000011 -0.48452607356091093 0.8733385932212776 0.050141655636071814 +-0.58185500000000001 0.79621133333333338 0.16397500000000001 -0.57590248909438635 0.80029787243832073 0.16691206794473423 +-0.55811399999999989 0.81788833333333333 0.137791 -0.55215961732090924 0.82177650837133109 0.14072358469372062 +-0.4989513333333333 0.85778933333333329 0.12117366666666667 -0.5052029824723917 0.85462177736693767 0.11996484548056872 +-0.72425300000000004 0.67053999999999991 0.15863733333333332 -0.72966477893777271 0.66585752370229023 0.15563761918875957 +-0.88990066666666667 0.45298833333333333 -0.046587500000000004 -0.89337034382634639 0.447270486853794 -0.042878203800597439 +-0.90578799999999993 0.4171226666666667 -0.069620399999999999 -0.90364636568419621 0.42316551543616404 -0.065986304119790604 +-0.83168433333333336 0.55413233333333334 0.02332656666666667 -0.82834740396313544 0.55957288650226511 0.026809756415478912 +-0.8527840000000001 0.5215913333333333 0 -0.84973445502635048 0.52719896939347977 -0.0035500157075229735 +-0.87006133333333324 0.48723133333333335 -0.069949533333333327 -0.87384599637596316 0.48166055149859732 -0.066304507748472158 +-0.87221566666666661 0.48784099999999997 -0.023341766666666666 -0.86923108705951235 0.49367090573163303 -0.026950957746389739 +-0.73524766666666663 0.63800966666666659 0.22731699999999999 -0.73247878998149196 0.64299905357399878 0.22366725135833215 +-0.76478933333333332 0.60974166666666674 0.20646366666666668 -0.76208480428306991 0.6148590569769995 0.20291646343801162 +-0.8001543333333333 0.58287766666666674 0.13899133333333333 -0.7960326164998518 0.58825410186115357 0.1424401106146978 +-0.79259666666666673 0.58049500000000009 0.18473399999999998 -0.78996515049352989 0.58574870889565889 0.18125537518320203 +-0.53984299999999996 0.84154899999999999 0 -0.54126728154096593 0.8408245345172658 0.00662058056941108 +-0.53466000000000002 0.84412233333333331 -0.033939766666666669 -0.5374554213924535 0.84211831054466646 -0.044479445379376113 +-0.49190600000000001 0.8669473333333334 -0.076870800000000003 -0.48798175061253019 0.86987752165419463 -0.072020194319971698 +-0.52571100000000004 0.84756133333333328 -0.069051033333333345 -0.53174600782875692 0.84415555467171544 -0.068173181494396301 +-0.38235766666666665 0.91950733333333334 -0.08777366666666668 -0.38603366980132092 0.91764343429393302 -0.094385026762516006 +-0.42032333333333333 0.90304766666666669 -0.085159600000000002 -0.41617644228351275 0.90581916016022268 -0.079302067910407864 +-0.47919499999999998 0.86999933333333335 -0.11362733333333332 -0.47529860446531208 0.87310315696685536 -0.10854544618655068 +-0.45684033333333329 0.88547600000000004 -0.081770899999999994 -0.45266532689738775 0.88841440347642819 -0.076249259147242968 +-0.36507266666666666 0.92199933333333328 -0.12654466666666667 -0.36813562611791661 0.92192917094125182 -0.12051043336718012 +-0.34321000000000002 0.93462666666666683 -0.089739633333333346 -0.3469709879048487 0.93290234221438229 -0.096459076520838058 +-0.34131833333333333 0.93953100000000001 -0.012861600000000001 -0.35091742712315899 0.93620857053337614 -0.019247644040631104 +-0.32210133333333335 0.94495300000000004 -0.051809966666666672 -0.33563562018756299 0.9405636792466775 -0.051852634872907685 +-0.52997433333333333 0.84764833333333334 -0.015967733333333334 -0.53582528751528857 0.84418786852804661 -0.015430615322529999 +-0.50072033333333332 0.86509833333333341 -0.020975933333333335 -0.49296150071514033 0.86961675129264948 -0.027489355829029644 +-0.45166433333333328 0.89181766666666673 0.0117591 -0.45453812942887611 0.89054752003018456 0.017894229890842432 +-0.46890266666666669 0.88267033333333333 -0.022866433333333335 -0.47156638030224901 0.88134786990202008 -0.029173295799523435 +-0.40431166666666662 0.90593933333333332 0.12329633333333334 -0.40021859160024531 0.90887682535716774 0.11733710097915501 +-0.42032333333333333 0.90304766666666669 0.085159600000000002 -0.41617644228351086 0.90581916016022335 0.079302067910409682 +-0.41651533333333335 0.90873766666666667 0.012210199999999999 -0.41964790472394209 0.90749867578179044 0.018487550273145244 +-0.43589300000000003 0.89842200000000005 0.047878066666666663 -0.43918072250599738 0.89674879877906088 0.054423201554313565 +-0.42284533333333335 0.84005133333333337 0.33887933333333331 -0.42581416515119525 0.84132826838267238 0.3329399969616218 +-0.44099433333333332 0.84560366666666675 0.29968466666666665 -0.44469314238938989 0.84198036091321582 0.30547844596354201 +-0.43467933333333336 0.87072233333333326 0.22858766666666663 -0.43088521647762756 0.87438176918079857 0.22314670498415323 +-0.45815366666666663 0.84954666666666678 0.26021300000000003 -0.4513584011796512 0.8529237867155689 0.26229107445607774 +-0.36507266666666666 0.92199933333333328 0.12654466666666667 -0.3681356261179175 0.9219291709412516 0.12051043336717922 +-0.38781933333333329 0.90705666666666662 0.16191933333333333 -0.39436940024219491 0.90473780623552069 0.1610039692701675 +-0.45058500000000001 0.87200033333333327 0.18965866666666664 -0.44674844745016062 0.87548910974200045 0.18421358099779367 +-0.41114166666666668 0.88992266666666664 0.195881 -0.41786869262231946 0.88738043930629251 0.19478632308939156 +-0.59409199999999995 0.55685966666666664 0.57987066666666665 -0.60032566082443639 0.55310267084542153 0.57765607108327455 +-0.6166786666666666 0.5704326666666667 0.54185133333333335 -0.61459058224575014 0.57666348420562952 0.53827283249171476 +-0.62262166666666674 0.61817566666666668 0.4790543333333333 -0.61959051746381599 0.61648325035047724 0.48585593822267054 +-0.6381163333333334 0.58255299999999999 0.50272266666666665 -0.6359748331968218 0.58859557724508138 0.49909043067144071 +-0.56820666666666664 0.71697033333333327 0.40298833333333334 -0.56540437180381287 0.72207728506901026 0.39865058727224167 +-0.58757233333333325 0.68550100000000003 0.4291213333333333 -0.58490583753810721 0.69088009372313097 0.42493512129613731 +-0.64218399999999998 0.6280673333333332 0.43866333333333335 -0.63939888485503282 0.62655283431309761 0.44564628559022512 +-0.60574300000000003 0.65252999999999994 0.45450433333333334 -0.60897952160709889 0.65451252486074285 0.44805947938148183 +-0.38087633333333332 0.85702366666666663 0.34606799999999999 -0.38398563886785148 0.85837763506900788 0.340210030358579 +-0.4037823333333333 0.83285633333333331 0.37765766666666667 -0.40688835103443466 0.83438245004359879 0.37181688618420783 +-0.46774966666666667 0.78831499999999999 0.39885033333333331 -0.46455272967201505 0.79312039629702813 0.39389186121564468 +-0.42622800000000005 0.80692333333333333 0.40806266666666663 -0.42935517525091482 0.8086226951209774 0.40222315997533387 +-0.84764833333333334 -0.015967733333333334 0.52997433333333333 -0.8464364298536603 -0.0057590455486603749 0.53245864028200174 +-0.86509833333333341 -0.020975933333333335 0.50072033333333332 -0.86901663114224359 -0.01137033516809954 0.49465221143380211 +-0.90593933333333332 0.12329633333333334 0.40431166666666662 -0.90887682535716774 0.11733710097915501 0.40021859160024531 +-0.90304766666666669 0.085159600000000002 0.42032333333333333 -0.90581916016022335 0.079302067910409682 0.41617644228351086 +-0.90873766666666667 0.012210199999999999 0.41651533333333335 -0.90749867578179044 0.018487550273145244 0.41964790472394209 +-0.89842200000000005 0.047878066666666663 0.43589300000000003 -0.89674879877906088 0.054423201554313565 0.43918072250599738 +-0.84005133333333337 0.33887933333333331 0.42284533333333335 -0.84132826838267238 0.33293999696162185 0.4258141651511953 +-0.84560366666666675 0.29968466666666665 0.44099433333333332 -0.84198036091321582 0.30547844596354201 0.44469314238938989 +-0.87072233333333326 0.22858766666666663 0.43467933333333336 -0.87438176918079857 0.22314670498415323 0.43088521647762756 +-0.84954666666666678 0.26021300000000003 0.45815366666666663 -0.8529237867155689 0.2622910744560778 0.45135840117965115 +-0.92199933333333328 0.12654466666666667 0.36507266666666666 -0.9219291709412516 0.12051043336717922 0.3681356261179175 +-0.90705666666666662 0.16191933333333333 0.38781933333333329 -0.90473780623552069 0.1610039692701675 0.39436940024219491 +-0.87200033333333327 0.18965866666666664 0.45058500000000001 -0.87548910974200045 0.18421358099779367 0.44674844745016062 +-0.88992266666666664 0.195881 0.41114166666666668 -0.88738043930629251 0.19478632308939156 0.41786869262231946 +-0.55685966666666664 0.57987066666666665 0.59409199999999995 -0.55310267084542153 0.57765607108327455 0.60032566082443639 +-0.5704326666666667 0.54185133333333335 0.6166786666666666 -0.57666348420562941 0.53827283249171476 0.61459058224575003 +-0.61817566666666668 0.4790543333333333 0.62262166666666674 -0.61648325035047735 0.48585593822267048 0.61959051746381588 +-0.58255299999999999 0.50272266666666665 0.6381163333333334 -0.58859557724508138 0.49909043067144071 0.6359748331968218 +-0.71697033333333327 0.40298833333333334 0.56820666666666664 -0.72207728506901026 0.39865058727224173 0.56540437180381276 +-0.68550100000000003 0.4291213333333333 0.58757233333333325 -0.69088009372313097 0.42493512129613731 0.58490583753810721 +-0.6280673333333332 0.43866333333333335 0.64218399999999998 -0.62655283431309761 0.44564628559022518 0.63939888485503282 +-0.65252999999999994 0.45450433333333334 0.60574300000000003 -0.65451252486074285 0.44805947938148183 0.60897952160709889 +-0.85702366666666663 0.34606799999999999 0.38087633333333332 -0.85837763506900788 0.340210030358579 0.38398563886785148 +-0.83285633333333331 0.37765766666666667 0.4037823333333333 -0.83438245004359879 0.37181688618420783 0.40688835103443466 +-0.78831499999999999 0.39885033333333331 0.46774966666666667 -0.79312039629702813 0.39389186121564468 0.46455272967201505 +-0.80692333333333333 0.40806266666666663 0.42622800000000005 -0.8086226951209774 0.40222315997533387 0.42935517525091482 +-0.85751700000000008 -0.0098685999999999999 0.51400666666666661 -0.85874886791504967 0 0.51239670359460787 +-0.86509833333333341 0.020975933333333335 0.50072033333333332 -0.86961675129264893 0.027489355829028846 0.49296150071514122 +-0.85518833333333344 0.084138333333333329 0.51093266666666659 -0.8519820384834379 0.083078175718678801 0.51693773592267567 +-0.87042766666666671 0.054918800000000011 0.48871233333333336 -0.8733385932212776 0.050141655636071814 0.48452607356091093 +-0.79621133333333338 0.16397500000000001 0.58185500000000001 -0.80029787243831885 0.16691206794473312 0.57590248909438913 +-0.81788833333333333 0.137791 0.55811399999999989 -0.82177650837133098 0.14072358469372062 0.55215961732090935 +-0.85778933333333329 0.12117366666666667 0.4989513333333333 -0.85462177736693701 0.11996484548056841 0.50520298247239281 +-0.83759833333333333 0.11136133333333335 0.53430833333333327 -0.83398268268268638 0.10989551608923845 0.54073640577352444 +-0.72445833333333332 0.15433566666666665 0.67133866666666675 -0.73253178521168572 0.16072018555629511 0.66148787260941588 +-0.79545466666666664 0.20475399999999999 0.5698266666666667 -0.79603524377618162 0.19831536249045545 0.57183818311343493 +-0.77270733333333341 0.18981166666666668 0.60520099999999999 -0.77331676655313408 0.18305698677723631 0.60701838370830619 +-0.74987199999999998 0.13007733333333335 0.64819233333333337 -0.75759326223656376 0.13635543653030713 0.63832565665371033 +-0.74907166666666669 0.17287133333333335 0.63904300000000003 -0.7496386400507854 0.16581644846858723 0.64073927206007386 +-0.51400666666666661 0.85751700000000008 0.0098685999999999999 -0.51629537352629751 0.85625815419931739 0.01615737115124348 +-0.53466000000000002 0.84412233333333331 0.033939766666666669 -0.53745542139245528 0.84211831054466535 0.044479445379375329 +-0.58780333333333334 0.8076793333333333 0.040241233333333327 -0.58895650236746133 0.80747253922186379 0.033441541855634895 +-0.55776333333333328 0.82775166666666655 0.0568081 -0.55271151938786212 0.83119822272983901 0.060162204636448981 +-0.66962900000000003 0.74196399999999996 -0.021954166666666667 -0.67028755876104318 0.74196595278651467 -0.014181448295592964 +-0.64327366666666663 0.7652566666666667 0 -0.64387049393386275 0.76509611382071685 -0.0076631362900813427 +-0.6125790000000001 0.78756366666666666 0.062679333333333337 -0.61375471435502471 0.7875326373785172 0.055655149542686619 +-0.61607900000000004 0.78706100000000001 0.020946933333333334 -0.6169806372877642 0.78686277614210776 0.013485723336902991 +-0.71838866666666668 0.65739499999999995 -0.22599133333333332 -0.71553780893610874 0.66226771662737516 -0.22227711419774049 +-0.69767499999999993 0.68696599999999997 -0.20164099999999999 -0.69650390892021441 0.68635276333030104 -0.20928972532764573 +-0.68439933333333336 0.71638666666666673 -0.13320333333333334 -0.68580719655213007 0.71683146040089973 -0.12578213918049458 +-0.67582666666666669 0.71501700000000001 -0.177069 -0.68169635280687368 0.71056893393307941 -0.17430396638921761 +-0.69637199999999988 0.7172453333333334 1.1564823173178713e-18 -0.69234621949170561 0.72155779384027363 -0.0033260342602416627 +-0.69494100000000003 0.71724500000000002 -0.044609499999999996 -0.69058513447235004 0.72166551516255584 -0.047864979588097448 +-0.66105400000000003 0.74192333333333327 -0.10926670000000001 -0.66233944891874685 0.74224522874824861 -0.10187479966346287 +-0.69085300000000005 0.71705166666666675 -0.089040933333333336 -0.68617271066798124 0.72155909310713584 -0.092301063314366424 +-0.84764833333333334 0.015967733333333334 0.52997433333333333 -0.84418786852804661 0.015430615322529994 0.53582528751528857 +-0.83115833333333333 0 0.55563600000000002 -0.83118293250477737 0.012010130877733973 0.55586930970243209 +-0.93825066666666668 0.34415833333333334 0.023011 -0.94072706638194714 0.33809798042240197 0.026876424812624835 +-0.95156166666666664 0.30630133333333331 0 -0.95188345307616529 0.30636892878051097 0.0074813927632506189 +-0.96083533333333326 0.26727899999999999 -0.068186966666666668 -0.95963829897183583 0.27377530970839897 -0.064353826152852608 +-0.96287333333333336 0.26767199999999997 -0.022745200000000004 -0.9630414023662548 0.26766477827048918 -0.030113515268850449 +-0.94270433333333337 0.26347699999999996 -0.20296100000000003 -0.94165092030341868 0.26294319089648543 -0.21012953779252252 +-0.95677066666666677 0.26647300000000002 -0.1134709 -0.95838768851164768 0.26025483249547726 -0.11730498997081033 +-0.84358833333333338 0.3543716666666667 -0.40261533333333333 -0.84497406496934158 0.34849123588877046 -0.40567559458008356 +-0.85979766666666668 0.36100666666666664 -0.36019033333333333 -0.86126810731236148 0.35519573860579262 -0.36339129681772486 +-0.89582666666666666 0.33240466666666668 -0.29379266666666665 -0.89809633511602149 0.33366106968666159 -0.28651921999531477 +-0.874386 0.36636833333333335 -0.3170716666666667 -0.8759582528742067 0.36061491813226465 -0.32039666047265142 +-0.948241 0.22408166666666665 -0.223473 -0.94705214190253806 0.22354254211107258 -0.23047987414161372 +-0.93280466666666673 0.26126333333333335 -0.24684200000000001 -0.93145059669590613 0.26058069002973705 -0.25396356017835792 +-0.90772833333333336 0.33597166666666672 -0.24991700000000003 -0.906319730754649 0.33521978385738815 -0.25731739574973655 +-0.91531566666666675 0.29738066666666668 -0.27032499999999998 -0.9137858032467604 0.29657279985040358 -0.27756094857448055 +-0.84154899999999999 0 0.53984299999999996 -0.84390703655177146 0.0091679865187050871 0.53641109392107089 +-0.97972166666666671 0.026782933333333332 0.19685366666666668 -0.978702710039696 0.026709634801937603 0.20353771338428125 +-0.97022466666666674 0.026577699999999999 0.23935300000000001 -0.97133408884613925 0.033163093219784313 0.23539391898164305 +-0.95304633333333333 -0.013060566666666667 0.30147600000000002 -0.95472755866232628 -0.0065581929231745221 0.29740927832913455 +-0.95898133333333335 0.026290733333333333 0.28108433333333332 -0.96065419082266401 0.019735355545147864 0.277045197389089 +3 2251 0 853 +3 860 3 854 +3 974 6 855 +3 857 8 856 +3 856 6 857 +3 859 10 858 +3 858 12 859 +3 854 5 860 +3 877 15 861 +3 867 18 862 +3 874 21 863 +3 1287 24 864 +3 27 865 29 +3 1270 30 866 +3 862 20 867 +3 1106 34 868 +3 878 36 869 +3 1204 39 870 +3 873 42 871 +3 1347 45 872 +3 871 44 873 +3 863 23 874 +3 876 50 875 +3 875 52 876 +3 861 17 877 +3 869 38 878 +3 914 56 879 +3 897 59 880 +3 932 62 881 +3 928 65 882 +3 918 68 883 +3 913 71 884 +3 1098 74 885 +3 908 76 886 +3 1124 79 887 +3 931 82 888 +3 898 85 889 +3 1418 88 890 +3 917 91 891 +3 1112 94 892 +3 929 96 893 +3 1136 99 894 +3 906 102 895 +3 925 105 896 +3 880 61 897 +3 889 87 898 +3 2171 110 899 +3 920 113 900 +3 1247 116 901 +3 912 119 902 +3 1293 122 903 +3 922 125 904 +3 1118 127 905 +3 895 104 906 +3 1157 130 907 +3 886 78 908 +3 927 134 909 +3 911 137 910 +3 910 139 911 +3 902 121 912 +3 884 73 913 +3 879 58 914 +3 930 143 915 +3 919 146 916 +3 891 93 917 +3 883 70 918 +3 916 148 919 +3 900 115 920 +3 2142 152 921 +3 904 126 922 +3 2339 156 923 +3 926 158 924 +3 896 107 925 +3 924 160 926 +3 909 136 927 +3 882 67 928 +3 893 98 929 +3 915 145 930 +3 888 84 931 +3 881 64 932 +3 1034 168 933 +3 1694 313 934 +3 1075 174 935 +3 1002 177 936 +3 1044 180 937 +3 994 183 938 +3 1024 186 939 +3 1011 189 940 +3 1068 192 941 +3 1009 195 942 +3 1058 198 943 +3 990 201 944 +3 1069 204 945 +3 1065 207 946 +3 1254 210 947 +3 1035 213 948 +3 1030 216 949 +3 1056 219 950 +3 1008 222 951 +3 1274 225 952 +3 1063 228 953 +3 1108 231 954 +3 1031 233 955 +3 1128 236 956 +3 238 957 240 +3 1852 241 958 +3 1021 244 959 +3 1101 62 960 +3 993 247 961 +3 1159 250 962 +3 1076 253 963 +3 1799 256 964 +3 1071 257 965 +3 1685 260 966 +3 1048 263 967 +3 1601 65 968 +3 1005 266 969 +3 1045 269 970 +3 1040 272 971 +3 1025 275 972 +3 1020 278 973 +3 855 7 974 +3 1064 282 975 +3 1060 285 976 +3 1054 288 977 +3 1862 291 978 +3 1534 84 979 +3 989 296 980 +3 1041 298 981 +3 1000 301 982 +3 2439 304 983 +3 1033 306 984 +3 2432 250 985 +3 1014 309 986 +3 1074 241 987 +3 1066 314 988 +3 980 260 989 +3 944 203 990 +3 1043 319 991 +3 1032 322 992 +3 961 249 993 +3 938 185 994 +3 1913 327 995 +3 1023 330 996 +3 1945 333 997 +3 1073 334 998 +3 1530 78 999 +3 982 303 1000 +3 1163 277 1001 +3 936 179 1002 +3 1016 341 1003 +3 1042 344 1004 +3 969 268 1005 +3 1067 348 1006 +3 1022 351 1007 +3 951 224 1008 +3 942 197 1009 +3 2304 355 1010 +3 940 191 1011 +3 173 1012 171 +3 2275 358 1013 +3 986 311 1014 +3 1661 362 1015 +3 1003 343 1016 +3 1047 364 1017 +3 1029 367 1018 +3 1050 370 1019 +3 973 280 1020 +3 959 246 1021 +3 1007 353 1022 +3 996 332 1023 +3 939 188 1024 +3 972 277 1025 +3 1062 377 1026 +3 1028 380 1027 +3 1027 382 1028 +3 1018 369 1029 +3 949 218 1030 +3 955 235 1031 +3 992 324 1032 +3 984 308 1033 +3 933 170 1034 +3 948 215 1035 +3 2055 391 1036 +3 1070 393 1037 +3 1563 132 1038 +3 1046 396 1039 +3 971 274 1040 +3 981 300 1041 +3 1004 346 1042 +3 991 321 1043 +3 937 182 1044 +3 970 271 1045 +3 1039 397 1046 +3 1017 366 1047 +3 967 265 1048 +3 1865 407 1049 +3 1019 372 1050 +3 2288 411 1051 +3 1061 412 1052 +3 1727 353 1053 +3 977 290 1054 +3 1544 104 1055 +3 950 221 1056 +3 1622 188 1057 +3 943 200 1058 +3 1528 78 1059 +3 976 287 1060 +3 1052 414 1061 +3 1026 379 1062 +3 953 230 1063 +3 975 284 1064 +3 946 209 1065 +3 988 316 1066 +3 1006 350 1067 +3 941 194 1068 +3 945 206 1069 +3 1037 395 1070 +3 965 259 1071 +3 295 1072 293 +3 998 336 1073 +3 987 313 1074 +3 935 176 1075 +3 963 255 1076 +3 2337 434 1077 +3 1949 530 1078 +3 1241 436 1079 +3 1337 438 1080 +3 2006 440 1081 +3 443 1082 444 +3 1173 290 1083 +3 1237 447 1084 +3 1598 158 1085 +3 1327 0 1086 +3 1653 230 1087 +3 1249 450 1088 +3 1567 136 1089 +3 1358 452 1090 +3 1245 454 1091 +3 1352 407 1092 +3 1231 457 1093 +3 1319 459 1094 +3 1301 461 1095 +3 1459 304 1096 +3 1273 464 1097 +3 885 75 1098 +3 1289 466 1099 +3 1440 468 1100 +3 960 243 1101 +3 1269 470 1102 +3 2229 473 1103 +3 1398 474 1104 +3 1259 476 1105 +3 868 35 1106 +3 1305 478 1107 +3 954 232 1108 +3 1284 480 1109 +3 1423 482 1110 +3 1280 484 1111 +3 892 95 1112 +3 1263 485 1113 +3 1384 329 1114 +3 1296 487 1115 +3 1450 489 1116 +3 1292 491 1117 +3 905 128 1118 +3 1265 494 1119 +3 1390 156 1120 +3 1255 497 1121 +3 1277 499 1122 +3 1410 501 1123 +3 887 81 1124 +3 1402 503 1125 +3 1370 355 1126 +3 1857 411 1127 +3 956 237 1128 +3 2103 507 1129 +3 1467 508 1130 +3 1626 194 1131 +3 1456 511 1132 +3 1540 98 1133 +3 1300 256 1134 +3 2374 512 1135 +3 894 101 1136 +3 2163 515 1137 +3 1414 516 1138 +3 1669 259 1139 +3 1403 520 1140 +3 1579 145 1141 +3 1272 522 1142 +3 2021 524 1143 +3 1385 338 1144 +3 1871 444 1145 +3 1380 527 1146 +3 1468 529 1147 +3 1782 168 1148 +3 1304 531 1149 +3 1368 533 1150 +3 1415 535 1151 +3 1279 110 1152 +3 1460 538 1153 +3 1455 250 1154 +3 1381 540 1155 +3 1262 542 1156 +3 907 132 1157 +3 1444 544 1158 +3 962 252 1159 +3 1310 547 1160 +3 1522 67 1161 +3 1342 550 1162 +3 1001 338 1163 +3 1424 551 1164 +3 2329 553 1165 +3 1420 554 1166 +3 1565 132 1167 +3 1399 556 1168 +3 1555 124 1169 +3 1394 558 1170 +3 2421 560 1171 +3 1434 561 1172 +3 1083 446 1173 +3 1288 563 1174 +3 2342 565 1175 +3 1353 568 1176 +3 1348 411 1177 +3 1334 569 1178 +3 1240 571 1179 +3 1451 572 1180 +3 1447 440 1181 +3 1395 575 1182 +3 1268 577 1183 +3 1391 565 1184 +3 1388 580 1185 +3 1378 582 1186 +3 1258 584 1187 +3 1328 586 1188 +3 1323 588 1189 +3 1312 590 1190 +3 1226 526 1191 +3 1936 236 1192 +3 1712 336 1193 +3 1421 596 1194 +3 1283 598 1195 +3 1345 600 1196 +3 1341 358 1197 +3 1324 604 1198 +3 1236 606 1199 +3 1411 608 1200 +3 1406 512 1201 +3 1359 611 1202 +3 1355 613 1203 +3 870 41 1204 +3 1377 616 1205 +3 1448 618 1206 +3 1295 619 1207 +3 1356 620 1208 +3 1248 622 1209 +3 1442 623 1210 +3 1432 625 1211 +3 1389 434 1212 +3 1264 152 1213 +3 1320 628 1214 +3 1315 630 1215 +3 1349 632 1216 +3 1244 507 1217 +3 1407 633 1218 +3 1276 515 1219 +3 1338 634 1220 +3 1333 636 1221 +3 1316 473 1222 +3 1230 639 1223 +3 1330 641 1224 +3 1404 643 1225 +3 1191 591 1226 +3 1344 645 1227 +3 1695 313 1228 +3 1469 650 1229 +3 1223 640 1230 +3 1093 458 1231 +3 652 1232 238 +3 1336 654 1233 +3 2146 656 1234 +3 1416 657 1235 +3 1199 607 1236 +3 1084 2 1237 +3 1326 659 1238 +3 1382 661 1239 +3 1179 419 1240 +3 1079 437 1241 +3 1357 663 1242 +3 1457 666 1243 +3 1217 510 1244 +3 1091 455 1245 +3 1351 668 1246 +3 901 118 1247 +3 1209 391 1248 +3 1088 451 1249 +3 1318 670 1250 +3 1372 672 1251 +3 675 1252 676 +3 1458 677 1253 +3 947 212 1254 +3 1121 498 1255 +3 1405 679 1256 +3 1396 681 1257 +3 1187 585 1258 +3 1105 477 1259 +3 1438 560 1260 +3 1350 684 1261 +3 1156 543 1262 +3 1113 327 1263 +3 1213 449 1264 +3 1119 154 1265 +3 1397 686 1266 +3 1329 688 1267 +3 1183 578 1268 +3 1102 472 1269 +3 866 32 1270 +3 1325 689 1271 +3 1142 523 1272 +3 1097 465 1273 +3 952 227 1274 +3 1462 691 1275 +3 1219 519 1276 +3 1122 500 1277 +3 1343 693 1278 +3 1152 537 1279 +3 1111 112 1280 +3 1417 695 1281 +3 1408 697 1282 +3 1195 599 1283 +3 1109 481 1284 +3 699 1285 700 +3 1383 553 1286 +3 864 26 1287 +3 1174 564 1288 +3 1099 467 1289 +3 1449 702 1290 +3 1354 704 1291 +3 1117 493 1292 +3 903 124 1293 +3 1436 707 1294 +3 1207 446 1295 +3 1115 488 1296 +3 1463 709 1297 +3 2223 725 1298 +3 1317 713 1299 +3 1134 262 1300 +3 1095 462 1301 +3 1409 715 1302 +3 1335 717 1303 +3 1149 532 1304 +3 1107 479 1305 +3 2444 691 1306 +3 1401 720 1307 +3 1425 711 1308 +3 1364 722 1309 +3 1160 548 1310 +3 2259 735 1311 +3 1190 524 1312 +3 1466 724 1313 +3 1453 726 1314 +3 1215 631 1315 +3 1222 638 1316 +3 1299 714 1317 +3 1250 671 1318 +3 1094 460 1319 +3 1214 629 1320 +3 1413 729 1321 +3 1400 731 1322 +3 1189 589 1323 +3 1198 605 1324 +3 1271 690 1325 +3 1238 660 1326 +3 1086 7 1327 +3 1188 587 1328 +3 1267 656 1329 +3 1224 642 1330 +3 1379 734 1331 +3 1465 736 1332 +3 1221 637 1333 +3 1178 570 1334 +3 1303 718 1335 +3 1233 655 1336 +3 1080 439 1337 +3 1220 635 1338 +3 1366 738 1339 +3 1412 740 1340 +3 1197 603 1341 +3 1162 360 1342 +3 1278 694 1343 +3 1227 646 1344 +3 1196 602 1345 +3 1454 743 1346 +3 872 47 1347 +3 1177 416 1348 +3 1216 506 1349 +3 1261 685 1350 +3 1246 669 1351 +3 1092 456 1352 +3 1176 409 1353 +3 1291 706 1354 +3 1203 615 1355 +3 1208 621 1356 +3 1242 665 1357 +3 1090 453 1358 +3 1202 612 1359 +3 712 1360 711 +3 649 1361 647 +3 291 1362 435 +3 2300 722 1363 +3 1309 723 1364 +3 2385 740 1365 +3 1339 739 1366 +3 1794 344 1367 +3 1150 534 1368 +3 1743 341 1369 +3 1126 505 1370 +3 748 1371 749 +3 1251 674 1372 +3 1419 750 1373 +3 1452 752 1374 +3 1393 755 1375 +3 1427 757 1376 +3 1205 617 1377 +3 1186 583 1378 +3 1331 735 1379 +3 1146 528 1380 +3 1155 541 1381 +3 1239 662 1382 +3 1286 701 1383 +3 1114 486 1384 +3 1144 333 1385 +3 1446 759 1386 +3 1392 761 1387 +3 1185 581 1388 +3 1212 627 1389 +3 1120 496 1390 +3 1184 579 1391 +3 1387 762 1392 +3 1375 756 1393 +3 1170 559 1394 +3 1182 576 1395 +3 1257 682 1396 +3 1266 687 1397 +3 1104 475 1398 +3 1168 557 1399 +3 1322 732 1400 +3 1307 721 1401 +3 1125 504 1402 +3 1140 521 1403 +3 1225 644 1404 +3 1256 680 1405 +3 1201 610 1406 +3 1218 514 1407 +3 1282 698 1408 +3 1302 716 1409 +3 1123 502 1410 +3 1200 609 1411 +3 1340 741 1412 +3 1321 730 1413 +3 1138 517 1414 +3 1151 536 1415 +3 1235 658 1416 +3 1281 696 1417 +3 890 90 1418 +3 1373 751 1419 +3 1166 555 1420 +3 1194 597 1421 +3 763 1422 764 +3 1110 483 1423 +3 1164 552 1424 +3 1308 710 1425 +3 2211 531 1426 +3 1376 758 1427 +3 2077 649 1428 +3 1654 232 1429 +3 1445 766 1430 +3 1856 253 1431 +3 1211 626 1432 +3 1514 36 1433 +3 1172 562 1434 +3 2179 598 1435 +3 1294 708 1436 +3 2406 482 1437 +3 1260 683 1438 +3 1812 263 1439 +3 1100 469 1440 +3 1503 42 1441 +3 1210 624 1442 +3 1806 269 1443 +3 1158 546 1444 +3 1430 767 1445 +3 1386 760 1446 +3 1181 574 1447 +3 1206 442 1448 +3 1290 703 1449 +3 1116 490 1450 +3 1180 573 1451 +3 1374 754 1452 +3 1314 727 1453 +3 1346 744 1454 +3 1154 539 1455 +3 1132 252 1456 +3 1243 667 1457 +3 1253 678 1458 +3 1096 463 1459 +3 1153 305 1460 +3 595 1461 594 +3 1275 692 1462 +3 1297 710 1463 +3 593 1464 592 +3 1332 737 1465 +3 1313 725 1466 +3 1130 243 1467 +3 1147 530 1468 +3 1229 651 1469 +3 1885 460 1470 +3 2119 676 1471 +3 2096 436 1472 +3 1870 439 1473 +3 2089 447 1474 +3 1881 456 1475 +3 2113 450 1476 +3 1877 453 1477 +3 2105 454 1478 +3 2083 457 1479 +3 1926 748 1480 +3 1803 461 1481 +3 1909 34 1482 +3 2157 464 1483 +3 1915 486 1484 +3 2188 466 1485 +3 1813 370 1486 +3 470 1487 27 +3 2183 701 1488 +3 1905 475 1489 +3 1663 246 1490 +3 1893 74 1491 +3 1678 280 1492 +3 2130 476 1493 +3 1907 477 1494 +3 1930 502 1495 +3 2047 39 1496 +3 2212 478 1497 +3 1593 125 1498 +3 1911 94 1499 +3 1662 246 1500 +3 2180 480 1501 +3 2285 744 1502 +3 1441 483 1503 +3 2258 735 1504 +3 2172 484 1505 +3 1897 469 1506 +3 2138 485 1507 +3 1923 127 1508 +3 2203 487 1509 +3 1919 490 1510 +3 2195 491 1511 +3 1889 463 1512 +3 2124 497 1513 +3 1433 231 1514 +3 2165 499 1515 +3 2025 591 1516 +3 1531 81 1517 +3 1972 548 1518 +3 2073 640 1519 +3 2095 237 1520 +3 2065 631 1521 +3 1161 511 1522 +3 2040 607 1523 +3 1543 101 1524 +3 2017 589 1525 +3 2365 520 1526 +3 1891 465 1527 +3 1059 419 1528 +3 1931 79 1529 +3 999 338 1530 +3 1517 58 1531 +3 2069 637 1532 +3 1638 215 1533 +3 979 529 1534 +3 1808 396 1535 +3 2036 603 1536 +3 1845 393 1537 +3 2391 535 1538 +3 1910 112 1539 +3 1133 510 1540 +3 1937 99 1541 +3 2440 538 1542 +3 1524 70 1543 +3 1055 416 1544 +3 1674 271 1545 +3 2325 540 1546 +3 1954 534 1547 +3 2276 550 1548 +3 2004 440 1549 +3 2408 551 1550 +3 2108 669 1551 +3 2011 585 1552 +3 2197 122 1553 +3 2357 556 1554 +3 1169 287 1555 +3 2050 617 1556 +3 1629 200 1557 +3 2416 561 1558 +3 1921 493 1559 +3 1964 543 1560 +3 1966 130 1561 +3 1867 568 1562 +3 1038 107 1563 +3 1948 528 1564 +3 1167 287 1565 +3 2264 569 1566 +3 1089 449 1567 +3 2022 572 1568 +3 2003 581 1569 +3 2349 575 1570 +3 1995 578 1571 +3 2341 565 1572 +3 1980 559 1573 +3 2319 582 1574 +3 1944 523 1575 +3 2253 586 1576 +3 1934 504 1577 +3 2220 590 1578 +3 1141 519 1579 +3 2026 592 1580 +3 2044 610 1581 +3 2403 596 1582 +3 1958 537 1583 +3 2282 600 1584 +3 1940 517 1585 +3 2245 604 1586 +3 2032 599 1587 +3 2383 608 1588 +3 1976 555 1589 +3 2312 813 1590 +3 1902 611 1591 +3 1984 564 1592 +3 1498 41 1593 +3 2059 626 1594 +3 2008 618 1595 +3 1968 546 1596 +3 2295 620 1597 +3 1085 446 1598 +3 2424 623 1599 +3 1989 574 1600 +3 968 262 1601 +3 2237 628 1602 +3 1960 539 1603 +3 1859 632 1604 +3 2028 595 1605 +3 2375 633 1606 +3 1952 532 1607 +3 2272 634 1608 +3 2370 679 1609 +3 2023 591 1610 +3 2283 600 1611 +3 2279 645 1612 +3 1651 227 1613 +3 2072 640 1614 +3 2273 634 1615 +3 2268 654 1616 +3 2396 695 1617 +3 2039 607 1618 +3 2254 586 1619 +3 2249 659 1620 +3 2330 553 1621 +3 1057 419 1622 +3 1904 611 1623 +3 2298 663 1624 +3 2437 677 1625 +3 1131 510 1626 +3 1869 568 1627 +3 2291 668 1628 +3 1557 124 1629 +3 2054 391 1630 +3 2238 628 1631 +3 2233 670 1632 +3 2267 717 1633 +3 2441 538 1634 +3 2393 657 1635 +3 2436 677 1636 +3 2121 678 1637 +3 1533 81 1638 +3 1740 700 1639 +3 2369 679 1640 +3 2354 686 1641 +3 209 1642 699 +3 2009 585 1643 +3 2425 623 1644 +3 2420 560 1645 +3 2292 668 1646 +3 1963 543 1647 +3 1667 255 1648 +3 1763 186 1649 +3 2016 702 1650 +3 1613 176 1651 +3 1708 183 1652 +3 1087 449 1653 +3 1429 479 1654 +3 1986 570 1655 +3 2358 556 1656 +3 1935 236 1657 +3 1864 437 1658 +3 2353 686 1659 +3 1994 578 1660 +3 1015 360 1661 +3 1500 41 1662 +3 1490 32 1663 +3 2250 659 1664 +3 1943 523 1665 +3 2097 237 1666 +3 1648 227 1667 +3 2446 709 1668 +3 1139 519 1669 +3 2409 551 1670 +3 2405 764 1671 +3 2280 645 1672 +3 1957 537 1673 +3 1545 101 1674 +3 2395 695 1675 +3 2380 715 1676 +3 2031 599 1677 +3 1492 32 1678 +3 1983 564 1679 +3 2024 572 1680 +3 2014 702 1681 +3 1858 592 1682 +3 2445 709 1683 +3 2234 670 1684 +3 966 262 1685 +3 2384 608 1686 +3 2379 715 1687 +3 2269 654 1688 +3 1951 532 1689 +3 2366 520 1690 +3 2361 720 1691 +3 2302 738 1692 +3 1971 548 1693 +3 934 529 1694 +3 1228 724 1695 +3 2431 743 1696 +3 2064 631 1697 +3 1805 461 1698 +3 1795 714 1699 +3 2118 674 1700 +3 1884 460 1701 +3 2392 535 1702 +3 2387 729 1703 +3 2362 720 1704 +3 2015 589 1705 +3 2158 464 1706 +3 2153 690 1707 +3 1652 662 1708 +3 1873 7 1709 +3 2326 540 1710 +3 2321 734 1711 +3 1193 724 1712 +3 2068 637 1713 +3 2213 478 1714 +3 2208 718 1715 +3 2086 658 1716 +3 1868 439 1717 +3 2305 355 1718 +3 2301 738 1719 +3 2388 729 1720 +3 2035 603 1721 +3 2173 484 1722 +3 2168 694 1723 +3 2433 511 1724 +3 2430 743 1725 +3 2322 734 1726 +3 1053 416 1727 +3 2139 485 1728 +3 2134 685 1729 +3 2110 116 1730 +3 1880 456 1731 +3 2007 583 1732 +3 2196 491 1733 +3 1906 477 1734 +3 2191 706 1735 +3 2102 667 1736 +3 1876 453 1737 +3 2080 651 1738 +3 1860 291 1739 +3 1639 212 1740 +3 2221 590 1741 +3 2216 723 1742 +3 1369 741 1743 +3 1953 534 1744 +3 1797 714 1745 +3 676 1746 829 +3 2117 674 1747 +3 2404 596 1748 +3 2399 750 1749 +3 2350 575 1750 +3 2345 755 1751 +3 2413 767 1752 +3 2049 617 1753 +3 2189 466 1754 +3 2184 24 1755 +3 2154 690 1756 +3 1908 34 1757 +3 1861 632 1758 +3 2286 45 1759 +3 2261 737 1760 +3 1947 528 1761 +3 2098 436 1762 +3 1649 662 1763 +3 2185 24 1764 +3 1914 486 1765 +3 2010 618 1766 +3 2000 759 1767 +3 2346 755 1768 +3 2001 581 1769 +3 2338 434 1770 +3 2333 762 1771 +3 2316 758 1772 +3 1979 559 1773 +3 2131 476 1774 +3 2128 682 1775 +3 2147 656 1776 +3 1903 475 1777 +3 2246 604 1778 +3 2241 732 1779 +3 2217 723 1780 +3 1933 504 1781 +3 1148 443 1782 +3 2076 644 1783 +3 2129 682 1784 +3 1892 74 1785 +3 2400 750 1786 +3 2043 610 1787 +3 2181 480 1788 +3 2176 698 1789 +3 2209 718 1790 +3 1929 502 1791 +3 2277 550 1792 +3 2231 713 1793 +3 1367 741 1794 +3 1699 296 1795 +3 2242 732 1796 +3 1745 828 1797 +3 1939 517 1798 +3 964 252 1799 +3 2090 447 1800 +3 1886 462 1801 +3 2085 658 1802 +3 1481 17 1803 +3 2177 698 1804 +3 1698 296 1805 +3 1443 94 1806 +3 2376 633 1807 +3 1535 90 1808 +3 2311 754 1809 +3 1975 555 1810 +3 2169 694 1811 +3 1439 483 1812 +3 1486 582 1813 +3 2315 758 1814 +3 2002 759 1815 +3 2058 626 1816 +3 2204 487 1817 +3 2199 708 1818 +3 2135 685 1819 +3 1896 469 1820 +3 2114 450 1821 +3 2109 116 1822 +3 2200 708 1823 +3 1922 127 1824 +3 2417 561 1825 +3 2412 767 1826 +3 2334 762 1827 +3 1988 574 1828 +3 2143 494 1829 +3 2140 833 1830 +3 2192 706 1831 +3 1918 490 1832 +3 813 1833 834 +3 2310 754 1834 +3 2125 497 1835 +3 2122 210 1836 +3 2230 473 1837 +3 2225 727 1838 +3 2287 45 1839 +3 1959 539 1840 +3 2106 454 1841 +3 2101 667 1842 +3 2123 210 1843 +3 1888 463 1844 +3 1537 90 1845 +3 2027 595 1846 +3 2166 499 1847 +3 2161 692 1848 +3 2265 569 1849 +3 2260 737 1850 +3 2226 727 1851 +3 958 243 1852 +3 2084 457 1853 +3 2079 651 1854 +3 2162 692 1855 +3 1431 231 1856 +3 1127 506 1857 +3 1682 295 1858 +3 1604 96 1859 +3 1739 171 1860 +3 1758 351 1861 +3 978 3 1862 +3 1879 455 1863 +3 1658 571 1864 +3 1049 409 1865 +3 2270 438 1866 +3 1562 102 1867 +3 1717 177 1868 +3 1627 197 1869 +3 1473 8 1870 +3 1145 526 1871 +3 2088 606 1872 +3 1709 183 1873 +3 2112 622 1874 +3 1898 452 1875 +3 1737 189 1876 +3 1477 10 1877 +3 2104 507 1878 +3 1863 407 1879 +3 1731 195 1880 +3 1475 12 1881 +3 2082 639 1882 +3 2235 459 1883 +3 1701 201 1884 +3 1470 5 1885 +3 1801 256 1886 +3 2438 304 1887 +3 1844 204 1888 +3 1512 15 1889 +3 2156 522 1890 +3 1527 75 1891 +3 1785 213 1892 +3 1491 18 1893 +3 2187 563 1894 +3 2422 468 1895 +3 1820 219 1896 +3 1506 21 1897 +3 1875 451 1898 +3 2150 577 1899 +3 2045 612 1900 +3 2355 474 1901 +3 1591 814 1902 +3 1777 233 1903 +3 1623 191 1904 +3 1489 29 1905 +3 1734 584 1906 +3 1494 35 1907 +3 1757 244 1908 +3 1482 20 1909 +3 1539 95 1910 +3 1499 44 1911 +3 2137 542 1912 +3 995 329 1913 +3 1765 275 1914 +3 1484 23 1915 +3 2202 619 1916 +3 2018 489 1917 +3 1832 282 1918 +3 1510 50 1919 +3 2194 840 1920 +3 1559 128 1921 +3 1824 285 1922 +3 1508 52 1923 +3 749 1924 498 +3 828 1925 748 +3 1480 17 1926 +3 2164 515 1927 +3 2381 501 1928 +3 1791 298 1929 +3 1495 38 1930 +3 1529 75 1931 +3 2363 503 1932 +3 1781 306 1933 +3 1577 56 1934 +3 1657 232 1935 +3 1192 508 1936 +3 1541 95 1937 +3 2389 516 1938 +3 1798 319 1939 +3 1585 68 1940 +3 2364 503 1941 +3 2155 522 1942 +3 1665 249 1943 +3 1575 71 1944 +3 997 329 1945 +3 2323 527 1946 +3 1761 330 1947 +3 1564 76 1948 +3 1078 508 1949 +3 2210 531 1950 +3 1689 303 1951 +3 1607 82 1952 +3 1744 341 1953 +3 1547 85 1954 +3 2390 516 1955 +3 2170 110 1956 +3 1673 268 1957 +3 1583 91 1958 +3 1840 348 1959 +3 1603 96 1960 +3 2324 527 1961 +3 2136 542 1962 +3 1647 224 1963 +3 1560 102 1964 +3 1992 544 1965 +3 1561 128 1966 +3 1990 544 1967 +3 1596 105 1968 +3 842 1969 843 +3 2218 547 1970 +3 1693 311 1971 +3 1518 61 1972 +3 2407 482 1973 +3 2401 554 1974 +3 1810 364 1975 +3 1589 113 1976 +3 2356 474 1977 +3 2347 558 1978 +3 1773 367 1979 +3 1573 119 1980 +3 2415 625 1981 +3 2186 563 1982 +3 1679 280 1983 +3 1592 125 1984 +3 2263 636 1985 +3 1655 571 1986 +3 2020 489 1987 +3 1828 377 1988 +3 1600 134 1989 +3 1967 130 1990 +3 2348 558 1991 +3 1965 841 1992 +3 2149 577 1993 +3 1660 825 1994 +3 1571 137 1995 +3 2411 757 1996 +3 2340 156 1997 +3 2331 760 1998 +3 2335 580 1999 +3 1767 379 2000 +3 1769 382 2001 +3 1815 414 2002 +3 1569 139 2003 +3 1549 573 2004 +3 2318 616 2005 +3 1081 442 2006 +3 1732 584 2007 +3 1595 160 2008 +3 1643 218 2009 +3 1766 379 2010 +3 1552 121 2011 +3 2252 0 2012 +3 2243 588 2013 +3 1681 284 2014 +3 1705 324 2015 +3 1650 230 2016 +3 1525 73 2017 +3 1917 488 2018 +3 2219 547 2019 +3 1987 573 2020 +3 1143 526 2021 +3 1568 136 2022 +3 1610 170 2023 +3 1680 284 2024 +3 1516 58 2025 +3 1580 145 2026 +3 1846 393 2027 +3 1605 143 2028 +3 2402 554 2029 +3 2178 598 2030 +3 1677 274 2031 +3 1587 146 2032 +3 2281 845 2033 +3 2274 358 2034 +3 1721 346 2035 +3 1536 93 2036 +3 2244 588 2037 +3 2087 606 2038 +3 1618 182 2039 +3 1523 70 2040 +3 2382 501 2041 +3 2373 512 2042 +3 1787 397 2043 +3 1581 148 2044 +3 1900 452 2045 +3 2293 613 2046 +3 1496 35 2047 +3 2317 616 2048 +3 1753 372 2049 +3 1556 126 2050 +3 2201 619 2051 +3 2294 613 2052 +3 2111 622 2053 +3 1630 200 2054 +3 1036 107 2055 +3 2423 468 2056 +3 2414 625 2057 +3 1816 414 2058 +3 1594 160 2059 +3 2336 580 2060 +3 2141 152 2061 +3 2236 459 2062 +3 2227 630 2063 +3 1697 316 2064 +3 1521 67 2065 +3 2271 438 2066 +3 2262 636 2067 +3 1713 336 2068 +3 1532 84 2069 +3 2228 630 2070 +3 2081 639 2071 +3 1614 176 2072 +3 1519 64 2073 +3 2256 688 2074 +3 2367 643 2075 +3 1783 168 2076 +3 1428 711 2077 +3 2091 650 2078 +3 1854 174 2079 +3 1738 171 2080 +3 2071 638 2081 +3 1882 458 2082 +3 1479 3 2083 +3 1853 174 2084 +3 1802 180 2085 +3 1716 177 2086 +3 2038 605 2087 +3 1872 2 2088 +3 1474 8 2089 +3 1800 180 2090 +3 2078 649 2091 +3 2248 689 2092 +3 2159 225 2093 +3 2327 661 2094 +3 1520 64 2095 +3 1472 6 2096 +3 1666 255 2097 +3 1762 186 2098 +3 2297 847 2099 +3 2434 666 2100 +3 1842 192 2101 +3 1736 189 2102 +3 1129 506 2103 +3 1878 455 2104 +3 1478 10 2105 +3 1841 192 2106 +3 2290 684 2107 +3 1551 118 2108 +3 1822 198 2109 +3 1730 195 2110 +3 2053 621 2111 +3 1874 451 2112 +3 1476 12 2113 +3 1821 198 2114 +3 2232 713 2115 +3 2306 672 2116 +3 1747 829 2117 +3 1700 201 2118 +3 1471 5 2119 +3 2435 666 2120 +3 1637 212 2121 +3 1836 207 2122 +3 1843 204 2123 +3 1513 15 2124 +3 1835 207 2125 +3 2368 643 2126 +3 2351 681 2127 +3 1775 216 2128 +3 1784 213 2129 +3 1493 18 2130 +3 1774 216 2131 +3 2419 707 2132 +3 2289 684 2133 +3 1729 222 2134 +3 1819 219 2135 +3 1962 541 2136 +3 1912 327 2137 +3 1507 21 2138 +3 1728 222 2139 +3 1830 228 2140 +3 2061 627 2141 +3 921 154 2142 +3 1829 228 2143 +3 2352 681 2144 +3 2255 688 2145 +3 1234 238 2146 +3 1776 233 2147 +3 29 2148 652 +3 1993 576 2149 +3 1899 472 2150 +3 2320 26 2151 +3 2247 689 2152 +3 1707 247 2153 +3 1756 244 2154 +3 1942 521 2155 +3 1890 465 2156 +3 1483 20 2157 +3 1706 247 2158 +3 2093 650 2159 +3 2443 691 2160 +3 1848 257 2161 +3 1855 253 2162 +3 1137 514 2163 +3 1927 500 2164 +3 1515 36 2165 +3 1847 257 2166 +3 693 2167 763 +3 1723 266 2168 +3 1811 263 2169 +3 1956 536 2170 +3 899 112 2171 +3 1505 42 2172 +3 1722 266 2173 +3 2394 657 2174 +3 2377 697 2175 +3 1789 272 2176 +3 1804 269 2177 +3 2030 597 2178 +3 1435 481 2179 +3 1501 44 2180 +3 1788 272 2181 +3 2328 661 2182 +3 1488 26 2183 +3 1755 278 2184 +3 1764 275 2185 +3 1982 562 2186 +3 1894 467 2187 +3 1485 23 2188 +3 1754 278 2189 +3 704 2190 703 +3 1735 827 2191 +3 1831 282 2192 +3 841 2193 840 +3 1920 493 2194 +3 1511 50 2195 +3 1733 827 2196 +3 1553 118 2197 +3 2418 707 2198 +3 1818 288 2199 +3 1823 285 2200 +3 2051 442 2201 +3 1916 488 2202 +3 1509 52 2203 +3 1817 288 2204 +3 2307 672 2205 +3 2378 697 2206 +3 2266 717 2207 +3 1715 301 2208 +3 1790 298 2209 +3 1950 530 2210 +3 1426 479 2211 +3 1497 38 2212 +3 1714 301 2213 +3 2360 731 2214 +3 2299 722 2215 +3 1742 309 2216 +3 1780 306 2217 +3 1970 843 2218 +3 2019 524 2219 +3 1578 56 2220 +3 1741 309 2221 +3 444 2222 842 +3 1298 736 2223 +3 2428 726 2224 +3 1838 314 2225 +3 1851 241 2226 +3 2063 629 2227 +3 2070 638 2228 +3 1103 62 2229 +3 1837 314 2230 +3 1793 831 2231 +3 2115 671 2232 +3 1632 203 2233 +3 1684 260 2234 +3 1883 458 2235 +3 2062 629 2236 +3 1602 65 2237 +3 1631 203 2238 +3 2386 740 2239 +3 2359 731 2240 +3 1779 322 2241 +3 1796 319 2242 +3 2013 587 2243 +3 2037 605 2244 +3 1586 68 2245 +3 1778 322 2246 +3 2152 30 2247 +3 2092 660 2248 +3 1620 185 2249 +3 1664 249 2250 +3 853 2 2251 +3 2012 587 2252 +3 1576 71 2253 +3 1619 185 2254 +3 2145 687 2255 +3 2074 642 2256 +3 240 2257 641 +3 1504 47 2258 +3 1311 736 2259 +3 1850 334 2260 +3 1760 330 2261 +3 2067 635 2262 +3 1985 570 2263 +3 1566 76 2264 +3 1849 334 2265 +3 2207 716 2266 +3 1633 655 2267 +3 1616 179 2268 +3 1688 303 2269 +3 1866 437 2270 +3 2066 635 2271 +3 1608 82 2272 +3 1615 179 2273 +3 2034 602 2274 +3 1013 360 2275 +3 1548 85 2276 +3 1792 344 2277 +3 646 2278 693 +3 1612 820 2279 +3 1672 268 2280 +3 2033 602 2281 +3 1584 91 2282 +3 1611 820 2283 +3 2429 726 2284 +3 1502 47 2285 +3 1759 351 2286 +3 1839 348 2287 +3 1051 409 2288 +3 2133 683 2289 +3 2107 669 2290 +3 1628 197 2291 +3 1646 224 2292 +3 2046 612 2293 +3 2052 621 2294 +3 1597 105 2295 +3 700 2296 847 +3 2099 665 2297 +3 1624 191 2298 +3 2215 721 2299 +3 1363 739 2300 +3 1719 343 2301 +3 1692 311 2302 +3 505 2303 533 +3 1010 61 2304 +3 1718 343 2305 +3 2116 671 2306 +3 2205 849 2307 +3 2398 88 2308 +3 2426 752 2309 +3 1834 834 2310 +3 1809 364 2311 +3 1590 113 2312 +3 2344 761 2313 +3 2410 757 2314 +3 1814 370 2315 +3 1772 367 2316 +3 2048 39 2317 +3 2005 583 2318 +3 1574 119 2319 +3 2151 30 2320 +3 1711 332 2321 +3 1726 353 2322 +3 1946 333 2323 +3 1961 541 2324 +3 1546 104 2325 +3 1710 332 2326 +3 2094 660 2327 +3 2182 701 2328 +3 1165 277 2329 +3 1621 188 2330 +3 1998 766 2331 +3 2343 761 2332 +3 1771 380 2333 +3 1827 377 2334 +3 1999 579 2335 +3 2060 627 2336 +3 1077 134 2337 +3 1770 380 2338 +3 923 154 2339 +3 1997 579 2340 +3 1572 137 2341 +3 1175 567 2342 +3 2332 760 2343 +3 2313 756 2344 +3 1751 369 2345 +3 1768 382 2346 +3 1978 557 2347 +3 1991 576 2348 +3 1570 139 2349 +3 1750 369 2350 +3 2127 680 2351 +3 2144 687 2352 +3 1659 235 2353 +3 1641 218 2354 +3 1901 472 2355 +3 1977 557 2356 +3 1554 121 2357 +3 1656 235 2358 +3 2240 730 2359 +3 2214 721 2360 +3 1691 308 2361 +3 1704 324 2362 +3 1932 79 2363 +3 1941 521 2364 +3 1526 73 2365 +3 1690 308 2366 +3 2075 642 2367 +3 2126 680 2368 +3 1640 215 2369 +3 1609 170 2370 +3 851 2371 852 +3 2397 88 2372 +3 2042 609 2373 +3 1135 514 2374 +3 1606 143 2375 +3 1807 396 2376 +3 2175 696 2377 +3 2206 716 2378 +3 1687 300 2379 +3 1676 274 2380 +3 1928 500 2381 +3 2041 609 2382 +3 1588 146 2383 +3 1686 300 2384 +3 1365 739 2385 +3 2239 730 2386 +3 1703 321 2387 +3 1720 346 2388 +3 1938 99 2389 +3 1955 536 2390 +3 1538 93 2391 +3 1702 321 2392 +3 1635 655 2393 +3 2174 696 2394 +3 1675 271 2395 +3 1617 182 2396 +3 2372 852 2397 +3 2308 751 2398 +3 1749 366 2399 +3 1786 397 2400 +3 1974 552 2401 +3 2029 597 2402 +3 1582 148 2403 +3 1748 366 2404 +3 1671 265 2405 +3 1437 481 2406 +3 1973 552 2407 +3 1550 115 2408 +3 1670 265 2409 +3 2314 756 2410 +3 1996 766 2411 +3 1826 412 2412 +3 1752 372 2413 +3 2057 624 2414 +3 1981 562 2415 +3 1558 126 2416 +3 1825 412 2417 +3 2198 122 2418 +3 2132 683 2419 +3 1645 221 2420 +3 1171 290 2421 +3 1895 467 2422 +3 2056 624 2423 +3 1599 158 2424 +3 1644 221 2425 +3 2309 751 2426 +3 2442 851 2427 +3 2224 725 2428 +3 2284 744 2429 +3 1725 350 2430 +3 1696 316 2431 +3 985 305 2432 +3 1724 350 2433 +3 2100 665 2434 +3 2120 678 2435 +3 1636 206 2436 +3 1625 194 2437 +3 1887 462 2438 +3 983 305 2439 +3 1542 98 2440 +3 1634 206 2441 +3 2427 752 2442 +3 2160 225 2443 +3 1306 710 2444 +3 1683 295 2445 +3 1668 259 2446 +3 1327 1 853 +3 1237 2 853 +3 1479 4 854 +3 1885 5 854 +3 856 1 855 +3 1327 7 855 +3 1474 1 856 +3 855 6 856 +3 1472 9 857 +3 1870 8 857 +3 1478 11 858 +3 1881 12 858 +3 1476 13 859 +3 1877 10 859 +3 1471 14 860 +3 1862 3 860 +3 1513 16 861 +3 1926 17 861 +3 1493 19 862 +3 1909 20 862 +3 1507 22 863 +3 1915 23 863 +3 2185 25 864 +3 2183 26 864 +3 1487 28 865 +3 1905 29 865 +3 2152 31 866 +3 1663 32 866 +3 1483 33 867 +3 1893 18 867 +3 1909 19 868 +3 1907 35 868 +3 1515 37 869 +3 1930 38 869 +3 2048 40 870 +3 1593 41 870 +3 1505 43 871 +3 1911 44 871 +3 2287 46 872 +3 2285 47 872 +3 1501 48 873 +3 1441 42 873 +3 1485 49 874 +3 1897 21 874 +3 1511 51 875 +3 1923 52 875 +3 1509 53 876 +3 1919 50 876 +3 1481 54 877 +3 1889 15 877 +3 1497 55 878 +3 1433 36 878 +3 1578 57 879 +3 2025 58 879 +3 60 880 59 +3 1972 61 880 +3 1103 63 881 +3 2073 64 881 +3 1602 66 882 +3 2065 67 882 +3 1586 69 883 +3 2040 70 883 +3 1576 72 884 +3 2017 73 884 +3 1893 33 885 +3 1891 75 885 +3 1566 77 886 +3 1059 78 886 +3 1932 80 887 +3 1517 81 887 +3 1608 83 888 +3 2069 84 888 +3 1548 86 889 +3 87 889 86 +3 2398 89 890 +3 1808 90 890 +3 1584 92 891 +3 2036 93 891 +3 1911 43 892 +3 1910 95 892 +3 1604 97 893 +3 1133 98 893 +3 1938 100 894 +3 1524 101 894 +3 1562 103 895 +3 1055 104 895 +3 1597 106 896 +3 2055 107 896 +3 1010 108 897 +3 59 897 108 +3 109 898 87 +3 1954 85 898 +3 2170 111 899 +3 1539 112 899 +3 1590 114 900 +3 115 900 114 +3 2110 117 901 +3 2108 118 901 +3 1574 120 902 +3 2011 121 902 +3 2198 123 903 +3 1169 124 903 +3 1593 40 904 +3 2050 126 904 +3 1923 51 905 +3 1921 128 905 +3 1546 129 906 +3 1964 102 906 +3 1967 131 907 +3 1038 132 907 +3 1530 133 908 +3 1948 76 908 +3 1077 135 909 +3 1089 136 909 +3 1572 138 910 +3 2003 139 910 +3 1570 140 911 +3 1995 137 911 +3 1554 141 912 +3 1980 119 912 +3 1526 142 913 +3 1944 71 913 +3 1517 80 914 +3 1934 56 914 +3 1606 144 915 +3 1141 145 915 +3 1588 147 916 +3 2044 148 916 +3 1538 149 917 +3 1958 91 917 +3 1524 100 918 +3 1940 68 918 +3 1582 150 919 +3 2032 146 919 +3 1550 151 920 +3 1976 113 920 +3 2141 153 921 +3 2339 154 921 +3 1558 155 922 +3 1984 125 922 +3 1390 157 923 +3 1265 154 923 +3 1599 159 924 +3 2059 160 924 +3 1038 131 925 +3 1968 105 925 +3 1595 161 926 +3 1085 158 926 +3 1568 162 927 +3 1989 134 927 +3 1522 163 928 +3 968 65 928 +3 1542 164 929 +3 1960 96 929 +3 1580 165 930 +3 2028 143 930 +3 1534 166 931 +3 1952 82 931 +3 1520 167 932 +3 960 62 932 +3 1783 169 933 +3 2370 170 933 +3 987 312 934 +3 1147 529 934 +3 1854 175 935 +3 1651 176 935 +3 1717 178 936 +3 2273 179 936 +3 1802 181 937 +3 2396 182 937 +3 1709 184 938 +3 2254 185 938 +3 1763 187 939 +3 2330 188 939 +3 1737 190 940 +3 1904 191 940 +3 1842 193 941 +3 2437 194 941 +3 1731 196 942 +3 1869 197 942 +3 1822 199 943 +3 1557 200 943 +3 1701 202 944 +3 2238 203 944 +3 1844 205 945 +3 2441 206 945 +3 1836 208 946 +3 1642 209 946 +3 2123 211 947 +3 2121 212 947 +3 1785 214 948 +3 1533 215 948 +3 1775 217 949 +3 2354 218 949 +3 1820 220 950 +3 2425 221 950 +3 1729 223 951 +3 2292 224 951 +3 2160 226 952 +3 1667 227 952 +3 1830 229 953 +3 2016 230 953 +3 1433 55 954 +3 1429 232 954 +3 1777 234 955 +3 2358 235 955 +3 1936 167 956 +3 1520 237 956 +3 1234 239 957 +3 2257 240 957 +3 1851 242 958 +3 1101 243 958 +3 1757 245 959 +3 1500 246 959 +3 932 167 960 +3 1467 243 960 +3 1707 248 961 +3 2250 249 961 +3 2432 251 962 +3 1799 252 962 +3 1856 254 963 +3 2097 255 963 +3 1300 163 964 +3 1456 252 964 +3 1848 258 965 +3 2446 259 965 +3 1684 261 966 +3 1601 262 966 +3 1812 264 967 +3 2409 265 967 +3 928 163 968 +3 1300 262 968 +3 1723 267 969 +3 2280 268 969 +3 1806 270 970 +3 1545 271 970 +3 1789 273 971 +3 2380 274 971 +3 1765 276 972 +3 1001 277 972 +3 1755 279 973 +3 1492 280 973 +3 1873 281 974 +3 2096 6 974 +3 1832 283 975 +3 2024 284 975 +3 1824 286 976 +3 1565 287 976 +3 1818 289 977 +3 2421 290 977 +3 1860 292 978 +3 2083 3 978 +3 1532 795 979 +3 1694 529 979 +3 1699 297 980 +3 2234 260 980 +3 1791 299 981 +3 2384 300 981 +3 1715 302 982 +3 2269 303 982 +3 2438 251 983 +3 2432 305 983 +3 1781 307 984 +3 2366 308 984 +3 1455 164 985 +3 1460 305 985 +3 1742 310 986 +3 2302 311 986 +3 1852 312 987 +3 934 313 987 +3 1838 315 988 +3 2431 316 988 +3 1685 317 989 +3 1805 296 989 +3 1632 318 990 +3 2118 201 990 +3 1798 320 991 +3 2392 321 991 +3 1779 323 992 +3 2362 324 992 +3 1665 325 993 +3 2158 247 993 +3 1620 326 994 +3 1652 183 994 +3 1912 328 995 +3 1945 329 995 +3 1761 331 996 +3 2326 332 996 +3 1144 276 997 +3 1114 329 997 +3 1850 335 998 +3 1193 336 998 +3 1528 337 999 +3 1163 338 999 +3 1689 339 1000 +3 2213 301 1000 +3 972 276 1001 +3 1144 338 1001 +3 1616 340 1002 +3 2086 177 1002 +3 1744 342 1003 +3 2305 343 1003 +3 1794 345 1004 +3 2388 346 1004 +3 1673 347 1005 +3 2173 266 1005 +3 1840 349 1006 +3 2433 350 1006 +3 1759 352 1007 +3 2322 353 1007 +3 1647 354 1008 +3 2139 222 1008 +3 1628 117 1009 +3 2110 195 1009 +3 1370 108 1010 +3 897 61 1010 +3 1624 356 1011 +3 2102 189 1011 +3 357 1012 173 +3 2080 171 1012 +3 2274 359 1013 +3 1661 360 1013 +3 1693 361 1014 +3 2221 309 1014 +3 86 1015 362 +3 1342 360 1015 +3 1719 363 1016 +3 1369 341 1016 +3 1810 365 1017 +3 2404 366 1017 +3 1773 368 1018 +3 2350 369 1018 +3 1814 371 1019 +3 2413 372 1019 +3 1679 373 1020 +3 2189 278 1020 +3 1663 31 1021 +3 2154 244 1021 +3 1727 374 1022 +3 1861 351 1022 +3 1711 375 1023 +3 2261 330 1023 +3 1622 376 1024 +3 2098 186 1024 +3 1165 25 1025 +3 2185 275 1025 +3 1828 378 1026 +3 2010 379 1026 +3 1771 381 1027 +3 2346 382 1027 +3 1769 383 1028 +3 2338 380 1028 +3 1751 384 1029 +3 2316 367 1029 +3 1643 385 1030 +3 2131 216 1030 +3 1659 386 1031 +3 2147 233 1031 +3 1705 387 1032 +3 2246 322 1032 +3 1691 388 1033 +3 2217 306 1033 +3 1610 389 1034 +3 1148 168 1034 +3 1640 390 1035 +3 2129 213 1035 +3 2054 392 1036 +3 1563 107 1036 +3 1846 394 1037 +3 395 1037 394 +3 907 131 1038 +3 925 107 1038 +3 1808 89 1039 +3 2400 397 1039 +3 1677 398 1040 +3 2181 272 1040 +3 1687 399 1041 +3 2209 298 1041 +3 1721 400 1042 +3 2277 344 1042 +3 1703 401 1043 +3 2242 319 1043 +3 1618 402 1044 +3 2090 180 1044 +3 1675 403 1045 +3 2177 269 1045 +3 1787 404 1046 +3 2376 396 1046 +3 1749 405 1047 +3 2311 364 1047 +3 1671 406 1048 +3 2169 263 1048 +3 1863 408 1049 +3 2288 409 1049 +3 1753 410 1050 +3 1486 370 1050 +3 1348 103 1051 +3 1353 409 1051 +3 1826 413 1052 +3 2002 414 1052 +3 1726 415 1053 +3 1544 416 1053 +3 1173 417 1054 +3 2204 288 1054 +3 895 103 1055 +3 1348 416 1055 +3 1645 418 1056 +3 2135 219 1056 +3 1621 337 1057 +3 1528 419 1057 +3 1630 420 1058 +3 2114 198 1058 +3 886 77 1059 +3 1240 419 1059 +3 1169 123 1060 +3 2200 285 1060 +3 1816 421 1061 +3 2417 412 1061 +3 1767 422 1062 +3 2334 377 1062 +3 1653 423 1063 +3 2143 228 1063 +3 1681 424 1064 +3 2192 282 1064 +3 425 1065 209 +3 2125 207 1065 +3 1697 426 1066 +3 2230 314 1066 +3 1725 46 1067 +3 2287 348 1067 +3 1626 427 1068 +3 2106 192 1068 +3 1636 211 1069 +3 2123 204 1069 +3 428 1070 395 +3 1537 393 1070 +3 1669 429 1071 +3 2166 257 1071 +3 1683 430 1072 +3 293 1072 430 +3 1713 431 1073 +3 2265 334 1073 +3 1695 432 1074 +3 2226 241 1074 +3 1614 433 1075 +3 2084 174 1075 +3 1667 226 1076 +3 2162 253 1076 +3 1389 135 1077 +3 909 134 1077 +3 1147 312 1078 +3 1130 508 1078 +3 2098 376 1079 +3 1658 437 1079 +3 2271 178 1080 +3 1717 439 1080 +3 2004 441 1081 +3 2201 442 1081 +3 1148 389 1082 +3 1145 444 1082 +3 1171 445 1083 +3 1598 446 1083 +3 2090 402 1084 +3 2088 2 1084 +3 926 161 1085 +3 1295 446 1085 +3 2252 184 1086 +3 1709 7 1086 +3 1650 448 1087 +3 1567 449 1087 +3 2114 420 1088 +3 2112 451 1088 +3 909 135 1089 +3 1264 449 1089 +3 1900 190 1090 +3 1737 453 1090 +3 2106 427 1091 +3 2104 455 1091 +3 1865 196 1092 +3 1731 456 1092 +3 2084 433 1093 +3 2082 458 1093 +3 2236 202 1094 +3 1701 460 1094 +3 1805 317 1095 +3 1801 462 1095 +3 2439 205 1096 +3 1844 463 1096 +3 2158 325 1097 +3 2156 465 1097 +3 1529 214 1098 +3 1785 74 1098 +3 2189 373 1099 +3 2187 467 1099 +3 2423 220 1100 +3 1820 469 1100 +3 958 242 1101 +3 2229 62 1101 +3 471 1102 470 +3 2150 472 1102 +3 1316 63 1103 +3 881 62 1103 +3 2356 234 1104 +3 1777 475 1104 +3 2131 385 1105 +3 1734 477 1105 +3 1496 245 1106 +3 1757 34 1106 +3 2213 339 1107 +3 2211 479 1107 +3 1657 254 1108 +3 1856 231 1108 +3 2181 398 1109 +3 2179 481 1109 +3 2407 264 1110 +3 1812 483 1110 +3 2173 347 1111 +3 2171 112 1111 +3 1541 270 1112 +3 1806 94 1112 +3 2139 354 1113 +3 2137 327 1113 +3 997 276 1114 +3 1765 486 1114 +3 2204 417 1115 +3 2202 488 1115 +3 2020 283 1116 +3 1832 490 1116 +3 2196 492 1117 +3 2194 493 1117 +3 1561 286 1118 +3 1824 127 1118 +3 2143 423 1119 +3 2142 154 1119 +3 2340 495 1120 +3 496 1120 495 +3 2125 425 1121 +3 498 1121 425 +3 2166 429 1122 +3 2164 500 1122 +3 2382 299 1123 +3 1791 502 1123 +3 1533 214 1124 +3 1529 79 1124 +3 2364 307 1125 +3 1781 504 1125 +3 2305 342 1126 +3 2303 505 1126 +3 2288 408 1127 +3 2103 506 1127 +3 2097 254 1128 +3 1657 236 1128 +3 1244 97 1129 +3 1349 506 1129 +3 1078 312 1130 +3 1852 243 1130 +3 1625 509 1131 +3 1540 510 1131 +3 2433 349 1132 +3 1159 252 1132 +3 893 97 1133 +3 1244 510 1133 +3 1801 317 1134 +3 1685 262 1134 +3 2373 513 1135 +3 2163 514 1135 +3 1545 270 1136 +3 1541 99 1136 +3 1276 144 1137 +3 1407 514 1137 +3 2390 320 1138 +3 1798 517 1138 +3 1668 518 1139 +3 1579 519 1139 +3 2366 307 1140 +3 2364 521 1140 +3 915 144 1141 +3 1276 519 1141 +3 2156 325 1142 +3 1665 523 1142 +3 2019 525 1143 +3 1871 526 1143 +3 1001 276 1144 +3 997 333 1144 +3 1082 389 1145 +3 1191 526 1145 +3 2324 331 1146 +3 1761 528 1146 +3 934 312 1147 +3 1078 530 1147 +3 1034 389 1148 +3 1082 443 1148 +3 2211 339 1149 +3 1689 532 1149 +3 2303 342 1150 +3 1744 534 1150 +3 2392 320 1151 +3 2390 536 1151 +3 2171 347 1152 +3 1673 537 1152 +3 2441 205 1153 +3 2439 305 1153 +3 1159 349 1154 +3 1840 539 1154 +3 2326 331 1155 +3 2324 541 1155 +3 2137 354 1156 +3 1647 543 1156 +3 1565 286 1157 +3 1561 130 1157 +3 1992 545 1158 +3 546 1158 545 +3 1132 349 1159 +3 1154 250 1159 +3 2219 361 1160 +3 1693 548 1160 +3 1521 549 1161 +3 1724 511 1161 +3 2277 400 1162 +3 2275 360 1162 +3 999 337 1163 +3 2329 277 1163 +3 2409 264 1164 +3 2407 552 1164 +3 1383 25 1165 +3 1025 277 1165 +3 2402 365 1166 +3 1810 555 1166 +3 1563 392 1167 +3 1555 287 1167 +3 2358 234 1168 +3 2356 557 1168 +3 903 123 1169 +3 1060 287 1169 +3 2348 368 1170 +3 1773 559 1170 +3 2420 445 1171 +3 1083 290 1171 +3 2417 421 1172 +3 2415 562 1172 +3 1207 417 1173 +3 1054 290 1173 +3 2187 373 1174 +3 1679 564 1174 +3 2341 566 1175 +3 567 1175 566 +3 1869 196 1176 +3 1865 409 1176 +3 1857 374 1177 +3 1727 416 1177 +3 2265 431 1178 +3 2263 570 1178 +3 1658 376 1179 +3 1622 419 1179 +3 2024 283 1180 +3 2020 573 1180 +3 2006 378 1181 +3 1828 574 1181 +3 2350 368 1182 +3 2348 576 1182 +3 2150 471 1183 +3 1660 578 1183 +3 2342 495 1184 +3 2340 579 1184 +3 2336 383 1185 +3 1769 581 1185 +3 1486 410 1186 +3 2318 583 1186 +3 1734 385 1187 +3 1643 585 1187 +3 2254 184 1188 +3 2252 587 1188 +3 2244 387 1189 +3 1705 589 1189 +3 2221 361 1190 +3 2219 524 1190 +3 1145 389 1191 +3 1610 591 1191 +3 1935 765 1192 +3 1949 508 1192 +3 998 335 1193 +3 1313 724 1193 +3 2404 365 1194 +3 2402 597 1194 +3 2179 398 1195 +3 1677 599 1195 +3 2283 601 1196 +3 2281 602 1196 +3 2275 400 1197 +3 1721 603 1197 +3 2246 387 1198 +3 2244 605 1198 +3 2088 402 1199 +3 1618 607 1199 +3 2384 299 1200 +3 2382 609 1200 +3 2374 404 1201 +3 1787 610 1201 +3 1904 190 1202 +3 1900 612 1202 +3 2294 614 1203 +3 615 1203 614 +3 1500 245 1204 +3 1496 39 1204 +3 2318 410 1205 +3 1753 617 1205 +3 2010 378 1206 +3 2006 442 1206 +3 2202 417 1207 +3 1173 446 1207 +3 614 1208 620 +3 2294 621 1208 +3 2112 420 1209 +3 1630 391 1209 +3 2425 220 1210 +3 2423 624 1210 +3 2415 421 1211 +3 1816 626 1211 +3 2338 383 1212 +3 2336 627 1212 +3 2142 423 1213 +3 1653 449 1213 +3 2238 202 1214 +3 2236 629 1214 +3 2228 426 1215 +3 1697 631 1215 +3 1861 374 1216 +3 1857 506 1216 +3 2104 427 1217 +3 1626 510 1217 +3 2376 404 1218 +3 2374 514 1218 +3 2164 429 1219 +3 1669 519 1219 +3 2273 178 1220 +3 2271 635 1220 +3 2263 431 1221 +3 1713 637 1221 +3 2230 426 1222 +3 2228 638 1222 +3 2082 433 1223 +3 1614 640 1223 +3 2257 239 1224 +3 2256 642 1224 +3 2368 169 1225 +3 1783 644 1225 +3 2025 57 1226 +3 2021 526 1226 +3 2280 267 1227 +3 2278 646 1227 +3 1694 795 1228 +3 1712 724 1228 +3 2093 175 1229 +3 1854 651 1229 +3 2073 63 1230 +3 2071 639 1230 +3 1883 4 1231 +3 1479 457 1231 +3 2148 653 1232 +3 2146 238 1232 +3 2269 302 1233 +3 2267 655 1233 +3 1267 239 1234 +3 957 238 1234 +3 2394 181 1235 +3 1802 658 1235 +3 2040 69 1236 +3 2038 606 1236 +3 853 1 1237 +3 1474 447 1237 +3 2250 248 1238 +3 2248 660 1238 +3 2328 187 1239 +3 1763 662 1239 +3 1059 77 1240 +3 1986 571 1240 +3 1866 9 1241 +3 1472 436 1241 +3 664 1242 663 +3 2297 665 1242 +3 2435 193 1243 +3 1842 667 1243 +3 1133 97 1244 +3 1129 507 1244 +3 1879 11 1245 +3 1478 454 1245 +3 2292 223 1246 +3 2290 669 1246 +3 1553 199 1247 +3 1822 116 1247 +3 2055 106 1248 +3 2053 622 1248 +3 1875 13 1249 +3 1476 450 1249 +3 2234 297 1250 +3 2232 671 1250 +3 2307 673 1251 +3 1747 674 1251 +3 14 1252 675 +3 1471 676 1252 +3 2437 193 1253 +3 2435 678 1253 +3 1639 208 1254 +3 1836 210 1254 +3 1924 16 1255 +3 1513 497 1255 +3 2370 169 1256 +3 2368 680 1256 +3 2352 217 1257 +3 1775 682 1257 +3 2011 120 1258 +3 2007 584 1258 +3 1907 19 1259 +3 1493 476 1259 +3 2421 289 1260 +3 2419 683 1260 +3 2290 223 1261 +3 1729 685 1261 +3 1964 129 1262 +3 1962 542 1262 +3 1913 22 1263 +3 1507 485 1263 +3 1089 135 1264 +3 2061 152 1264 +3 923 157 1265 +3 494 1265 157 +3 2354 217 1266 +3 2352 687 1266 +3 2256 239 1267 +3 1234 656 1267 +3 1995 140 1268 +3 1993 577 1268 +3 1901 28 1269 +3 1487 470 1269 +3 1492 279 1270 +3 2320 30 1270 +3 2248 248 1271 +3 1707 690 1271 +3 1944 142 1272 +3 1942 522 1272 +3 1891 33 1273 +3 1483 464 1273 +3 1651 175 1274 +3 2093 225 1274 +3 2444 258 1275 +3 1848 692 1275 +3 1141 144 1276 +3 1137 515 1276 +3 1928 37 1277 +3 1515 499 1277 +3 2278 267 1278 +3 1723 694 1278 +3 1958 149 1279 +3 1956 110 1279 +3 1910 43 1280 +3 1505 484 1280 +3 2396 181 1281 +3 2394 696 1281 +3 2378 273 1282 +3 1789 698 1282 +3 2032 150 1283 +3 2030 598 1283 +3 1437 48 1284 +3 1501 480 1284 +3 1642 208 1285 +3 1639 700 1285 +3 2330 187 1286 +3 2328 701 1286 +3 2320 279 1287 +3 1755 24 1287 +3 1984 155 1288 +3 1982 563 1288 +3 1895 49 1289 +3 1485 466 1289 +3 2016 229 1290 +3 703 1290 229 +3 705 1291 704 +3 1735 706 1291 +3 1921 51 1292 +3 1511 491 1292 +3 1557 199 1293 +3 1553 122 1293 +3 2419 289 1294 +3 1818 708 1294 +3 1085 161 1295 +3 2051 619 1295 +3 1917 53 1296 +3 1509 487 1296 +3 2446 258 1297 +3 2444 710 1297 +3 1313 335 1298 +3 1332 736 1298 +3 2232 297 1299 +3 1699 714 1299 +3 968 163 1300 +3 964 256 1300 +3 1887 54 1301 +3 1481 461 1301 +3 2380 273 1302 +3 2378 716 1302 +3 2267 302 1303 +3 1715 718 1303 +3 1952 166 1304 +3 1950 531 1304 +3 1429 55 1305 +3 1497 478 1305 +3 2443 719 1306 +3 1425 710 1306 +3 2362 323 1307 +3 2360 721 1307 +3 1360 430 1308 +3 1463 710 1308 +3 2300 310 1309 +3 1742 723 1309 +3 1972 60 1310 +3 1970 547 1310 +3 2258 784 1311 +3 2223 736 1311 +3 2021 57 1312 +3 1578 590 1312 +3 1193 335 1313 +3 1298 725 1313 +3 2429 315 1314 +3 1838 727 1314 +3 2065 66 1315 +3 2063 630 1315 +3 2071 63 1316 +3 1103 473 1316 +3 1797 728 1317 +3 1793 713 1317 +3 2116 318 1318 +3 1632 670 1318 +3 1885 4 1319 +3 1883 459 1319 +3 2063 66 1320 +3 1602 628 1320 +3 2388 345 1321 +3 2386 730 1321 +3 2360 323 1322 +3 1779 732 1322 +3 2017 72 1323 +3 2013 588 1323 +3 2038 69 1324 +3 1586 604 1324 +3 2154 31 1325 +3 2152 689 1325 +3 2094 326 1326 +3 1620 659 1326 +3 855 1 1327 +3 853 0 1327 +3 2013 72 1328 +3 1576 586 1328 +3 2147 386 1329 +3 2145 688 1329 +3 2075 733 1330 +3 641 1330 733 +3 2322 352 1331 +3 1504 735 1331 +3 1298 335 1332 +3 1850 737 1332 +3 2069 83 1333 +3 2067 636 1333 +3 1986 77 1334 +3 1566 569 1334 +3 2209 399 1335 +3 2207 717 1335 +3 1635 340 1336 +3 1616 654 1336 +3 1870 9 1337 +3 1866 438 1337 +3 2067 83 1338 +3 1608 634 1338 +3 2302 310 1339 +3 2300 739 1339 +3 2386 345 1340 +3 1794 741 1340 +3 2036 92 1341 +3 2034 358 1341 +3 1015 86 1342 +3 1548 550 1342 +3 2169 406 1343 +3 2167 693 1343 +3 742 1344 646 +3 1612 645 1344 +3 2034 92 1345 +3 1584 600 1345 +3 2431 315 1346 +3 2429 744 1346 +3 1504 352 1347 +3 1759 45 1347 +3 1055 103 1348 +3 1051 411 1348 +3 1129 97 1349 +3 1604 632 1349 +3 2135 418 1350 +3 2133 684 1350 +3 2108 117 1351 +3 1628 668 1351 +3 1881 11 1352 +3 1879 407 1352 +3 1051 103 1353 +3 1562 568 1353 +3 2192 424 1354 +3 2190 704 1354 +3 745 1355 615 +3 2046 613 1355 +3 2053 106 1356 +3 1597 620 1356 +3 2100 356 1357 +3 1624 663 1357 +3 1877 13 1358 +3 1875 452 1358 +3 2046 745 1359 +3 1591 611 1359 +3 430 1360 712 +3 1308 711 1360 +3 2078 357 1361 +3 647 1361 357 +3 1862 14 1362 +3 435 1362 14 +3 2299 746 1363 +3 2385 739 1363 +3 2217 388 1364 +3 2215 722 1364 +3 1412 363 1365 +3 1366 739 1365 +3 1365 363 1366 +3 1719 738 1366 +3 1792 747 1367 +3 1743 741 1367 +3 1954 109 1368 +3 533 1368 109 +3 1016 363 1369 +3 1412 741 1369 +3 108 1370 505 +3 1010 355 1370 +3 1926 16 1371 +3 1924 749 1371 +3 2118 318 1372 +3 2116 672 1372 +3 2400 89 1373 +3 2398 751 1373 +3 2427 753 1374 +3 1834 754 1374 +3 2346 381 1375 +3 2344 756 1375 +3 2411 371 1376 +3 1814 758 1376 +3 2050 40 1377 +3 2048 616 1377 +3 2007 120 1378 +3 1574 582 1378 +3 2259 375 1379 +3 1711 734 1379 +3 1948 133 1380 +3 1946 527 1380 +3 1962 129 1381 +3 1546 540 1381 +3 1652 326 1382 +3 2094 661 1382 +3 2183 25 1383 +3 1165 553 1383 +3 1915 22 1384 +3 1913 329 1384 +3 1946 133 1385 +3 1530 338 1385 +3 2002 413 1386 +3 1998 760 1386 +3 2344 381 1387 +3 1771 762 1387 +3 2003 138 1388 +3 1999 580 1388 +3 2061 135 1389 +3 1077 434 1389 +3 157 1390 496 +3 923 156 1390 +3 1999 138 1391 +3 1572 565 1391 +3 2334 422 1392 +3 2332 761 1392 +3 2314 384 1393 +3 1751 755 1393 +3 1980 141 1394 +3 1978 558 1394 +3 1993 140 1395 +3 1570 575 1395 +3 2129 390 1396 +3 2127 681 1396 +3 2145 386 1397 +3 1659 686 1397 +3 1905 28 1398 +3 1901 474 1398 +3 1978 141 1399 +3 1554 556 1399 +3 2242 401 1400 +3 2240 731 1400 +3 2215 388 1401 +3 1691 720 1401 +3 1934 80 1402 +3 1932 503 1402 +3 1942 142 1403 +3 1526 520 1403 +3 733 1404 644 +3 2075 643 1404 +3 2127 390 1405 +3 1640 679 1405 +3 2044 147 1406 +3 2042 512 1406 +3 1137 144 1407 +3 1606 633 1407 +3 2177 403 1408 +3 2175 697 1408 +3 2207 399 1409 +3 1687 715 1409 +3 1930 37 1410 +3 1928 501 1410 +3 2042 147 1411 +3 1588 608 1411 +3 1369 363 1412 +3 1365 740 1412 +3 2240 401 1413 +3 1703 729 1413 +3 1940 100 1414 +3 1938 516 1414 +3 1956 149 1415 +3 1538 535 1415 +3 2086 340 1416 +3 1635 657 1416 +3 2175 403 1417 +3 1675 695 1417 +3 1537 428 1418 +3 2372 88 1418 +3 2309 405 1419 +3 1749 750 1419 +3 1976 151 1420 +3 1974 554 1420 +3 2030 150 1421 +3 1582 596 1421 +3 2167 406 1422 +3 1671 764 1422 +3 1441 48 1423 +3 1437 482 1423 +3 1974 151 1424 +3 1550 551 1424 +3 1306 719 1425 +3 2077 711 1425 +3 2210 765 1426 +3 1654 479 1426 +3 2316 384 1427 +3 2314 757 1427 +3 648 1428 649 +3 711 1428 648 +3 954 55 1429 +3 1305 479 1429 +3 1998 413 1430 +3 1826 767 1430 +3 1855 768 1431 +3 1514 231 1431 +3 2059 159 1432 +3 2057 625 1432 +3 878 55 1433 +3 954 231 1433 +3 1982 155 1434 +3 1558 561 1434 +3 2178 769 1435 +3 2406 481 1435 +3 2200 123 1436 +3 2198 707 1436 +3 1423 48 1437 +3 1284 481 1437 +3 2133 418 1438 +3 1645 560 1438 +3 1811 770 1439 +3 1503 483 1439 +3 1897 49 1440 +3 1895 468 1440 +3 873 48 1441 +3 1423 483 1441 +3 2057 159 1442 +3 1599 623 1442 +3 1804 771 1443 +3 1499 94 1443 +3 1968 131 1444 +3 1967 544 1444 +3 2413 371 1445 +3 2411 766 1445 +3 2332 422 1446 +3 1767 759 1446 +3 1989 162 1447 +3 1549 440 1447 +3 2051 161 1448 +3 1595 618 1448 +3 2190 424 1449 +3 1681 702 1449 +3 1919 53 1450 +3 1917 489 1450 +3 1549 162 1451 +3 1568 572 1451 +3 2311 405 1452 +3 2309 752 1452 +3 2226 432 1453 +3 2224 726 1453 +3 2285 46 1454 +3 1725 743 1454 +3 1960 164 1455 +3 985 250 1455 +3 964 163 1456 +3 1522 511 1456 +3 2102 356 1457 +3 2100 666 1457 +3 2121 211 1458 +3 1636 677 1458 +3 1889 54 1459 +3 1887 304 1459 +3 985 164 1460 +3 1542 538 1460 +3 2028 165 1461 +3 594 1461 165 +3 2162 226 1462 +3 2160 691 1462 +3 1308 430 1463 +3 1683 709 1463 +3 165 1464 593 +3 1580 592 1464 +3 2261 375 1465 +3 2259 736 1465 +3 2224 432 1466 +3 1695 724 1466 +3 960 167 1467 +3 1936 508 1467 +3 1950 166 1468 +3 1534 529 1468 +3 2080 357 1469 +3 2078 650 1469 +3 1884 772 1470 +3 2119 5 1470 +3 1252 14 1471 +3 860 5 1471 +3 1241 9 1472 +3 857 6 1472 +3 1868 773 1473 +3 2089 8 1473 +3 1237 1 1474 +3 856 8 1474 +3 1880 774 1475 +3 2113 12 1475 +3 1249 13 1476 +3 859 12 1476 +3 1876 775 1477 +3 2105 10 1477 +3 1245 11 1478 +3 858 10 1478 +3 1231 4 1479 +3 854 3 1479 +3 1925 776 1480 +3 1803 17 1480 +3 1301 54 1481 +3 877 17 1481 +3 1908 777 1482 +3 2157 20 1482 +3 1273 33 1483 +3 867 20 1483 +3 1914 778 1484 +3 2188 23 1484 +3 1289 49 1485 +3 874 23 1485 +3 1050 410 1486 +3 1186 582 1486 +3 1269 28 1487 +3 865 27 1487 +3 2182 779 1488 +3 2151 26 1488 +3 1903 653 1489 +3 2148 29 1489 +3 1662 780 1490 +3 1678 32 1490 +3 1892 781 1491 +3 2130 18 1491 +3 973 279 1492 +3 1270 32 1492 +3 1259 19 1493 +3 862 18 1493 +3 1906 782 1494 +3 2047 35 1494 +3 1929 783 1495 +3 2212 38 1495 +3 1204 245 1496 +3 1106 35 1496 +3 1305 55 1497 +3 878 38 1497 +3 1592 780 1498 +3 1662 41 1498 +3 1443 771 1499 +3 2180 44 1499 +3 959 245 1500 +3 1204 41 1500 +3 1284 48 1501 +3 873 44 1501 +3 2284 784 1502 +3 2258 47 1502 +3 1439 770 1503 +3 2172 42 1503 +3 1331 352 1504 +3 1347 47 1504 +3 1280 43 1505 +3 871 42 1505 +3 1896 785 1506 +3 2138 21 1506 +3 1263 22 1507 +3 863 21 1507 +3 1922 786 1508 +3 2203 52 1508 +3 1296 53 1509 +3 876 52 1509 +3 1918 787 1510 +3 2195 50 1510 +3 1292 51 1511 +3 875 50 1511 +3 1888 788 1512 +3 2124 15 1512 +3 1255 16 1513 +3 861 15 1513 +3 1431 768 1514 +3 2165 36 1514 +3 1277 37 1515 +3 869 36 1515 +3 2023 789 1516 +3 1531 58 1516 +3 887 80 1517 +3 914 58 1517 +3 1971 790 1518 +3 2304 61 1518 +3 2072 791 1519 +3 2095 64 1519 +3 956 167 1520 +3 932 64 1520 +3 2064 549 1521 +3 1161 67 1521 +3 1456 163 1522 +3 928 67 1522 +3 2039 792 1523 +3 1543 70 1523 +3 894 100 1524 +3 918 70 1524 +3 2015 793 1525 +3 2365 73 1525 +3 1403 142 1526 +3 913 73 1526 +3 1890 794 1527 +3 1931 75 1527 +3 1057 337 1528 +3 999 78 1528 +3 1124 214 1529 +3 1098 75 1529 +3 1385 133 1530 +3 908 78 1530 +3 1516 789 1531 +3 1638 81 1531 +3 2068 795 1532 +3 979 84 1532 +3 948 214 1533 +3 1124 81 1533 +3 1468 166 1534 +3 931 84 1534 +3 1807 796 1535 +3 1845 90 1535 +3 2035 797 1536 +3 2391 93 1536 +3 1070 428 1537 +3 1418 90 1537 +3 1415 149 1538 +3 917 93 1538 +3 899 111 1539 +3 1937 95 1539 +3 1131 509 1540 +3 2440 98 1540 +3 1136 270 1541 +3 1112 95 1541 +3 1460 164 1542 +3 929 98 1542 +3 1523 792 1543 +3 1674 101 1543 +3 1053 415 1544 +3 2325 104 1544 +3 970 270 1545 +3 1136 101 1545 +3 1381 129 1546 +3 906 104 1546 +3 1953 747 1547 +3 2276 85 1547 +3 1342 86 1548 +3 889 85 1548 +3 1447 162 1549 +3 1451 573 1549 +3 1424 151 1550 +3 920 115 1550 +3 2107 798 1551 +3 2197 118 1551 +3 2009 799 1552 +3 2357 121 1552 +3 1293 199 1553 +3 1247 118 1553 +3 1399 141 1554 +3 912 121 1554 +3 1167 392 1555 +3 1629 124 1555 +3 2049 800 1556 +3 2416 126 1556 +3 943 199 1557 +3 1293 124 1557 +3 1434 155 1558 +3 922 126 1558 +3 1920 801 1559 +3 1966 128 1559 +3 1963 802 1560 +3 1867 102 1560 +3 1157 286 1561 +3 1118 128 1561 +3 1353 103 1562 +3 895 102 1562 +3 1036 392 1563 +3 1167 132 1563 +3 1947 803 1564 +3 2264 76 1564 +3 976 286 1565 +3 1157 132 1565 +3 1334 77 1566 +3 886 76 1566 +3 1087 448 1567 +3 2022 136 1567 +3 1451 162 1568 +3 927 136 1568 +3 2001 804 1569 +3 2349 139 1569 +3 1395 140 1570 +3 911 139 1570 +3 1994 566 1571 +3 2341 137 1571 +3 1391 138 1572 +3 910 137 1572 +3 1979 805 1573 +3 2319 119 1573 +3 1378 120 1574 +3 902 119 1574 +3 1943 806 1575 +3 2253 71 1575 +3 1328 72 1576 +3 884 71 1576 +3 1933 807 1577 +3 2220 56 1577 +3 1312 57 1578 +3 879 56 1578 +3 1139 518 1579 +3 2026 145 1579 +3 1464 165 1580 +3 930 145 1580 +3 2043 808 1581 +3 2403 148 1581 +3 1421 150 1582 +3 919 148 1582 +3 1957 809 1583 +3 2282 91 1583 +3 1345 92 1584 +3 891 91 1584 +3 1939 810 1585 +3 2245 68 1585 +3 1324 69 1586 +3 883 68 1586 +3 2031 811 1587 +3 2383 146 1587 +3 1411 147 1588 +3 916 146 1588 +3 1975 812 1589 +3 2312 113 1589 +3 114 1590 813 +3 900 113 1590 +3 1359 745 1591 +3 814 1591 745 +3 1983 780 1592 +3 1498 125 1592 +3 870 40 1593 +3 904 125 1593 +3 2058 815 1594 +3 2008 160 1594 +3 1448 161 1595 +3 926 160 1595 +3 816 1596 546 +3 2295 105 1596 +3 1356 106 1597 +3 896 105 1597 +3 1083 445 1598 +3 2424 158 1598 +3 1442 159 1599 +3 924 158 1599 +3 1988 817 1600 +3 2337 134 1600 +3 966 261 1601 +3 2237 65 1601 +3 1320 66 1602 +3 882 65 1602 +3 1959 818 1603 +3 1859 96 1603 +3 1349 97 1604 +3 893 96 1604 +3 2027 796 1605 +3 2375 143 1605 +3 1407 144 1606 +3 915 143 1606 +3 1951 819 1607 +3 2272 82 1607 +3 1338 83 1608 +3 888 82 1608 +3 2369 789 1609 +3 2023 170 1609 +3 1191 389 1610 +3 1034 170 1610 +3 2282 809 1611 +3 2279 820 1611 +3 1344 742 1612 +3 820 1612 742 +3 1648 791 1613 +3 2072 176 1613 +3 1223 433 1614 +3 1075 176 1614 +3 2272 819 1615 +3 2268 179 1615 +3 1336 340 1616 +3 1002 179 1616 +3 2395 792 1617 +3 2039 182 1617 +3 1199 402 1618 +3 1044 182 1618 +3 2253 806 1619 +3 2249 185 1619 +3 1326 326 1620 +3 994 185 1620 +3 2329 337 1621 +3 1057 188 1621 +3 1179 376 1622 +3 1024 188 1622 +3 1902 821 1623 +3 2298 191 1623 +3 1357 356 1624 +3 1011 191 1624 +3 2436 509 1625 +3 1131 194 1625 +3 1217 427 1626 +3 1068 194 1626 +3 1867 802 1627 +3 2291 197 1627 +3 1351 117 1628 +3 1009 197 1628 +3 1555 392 1629 +3 2054 200 1629 +3 1209 420 1630 +3 1058 200 1630 +3 2237 261 1631 +3 2233 203 1631 +3 1318 318 1632 +3 990 203 1632 +3 2266 822 1633 +3 2393 655 1633 +3 2440 509 1634 +3 2436 206 1634 +3 1416 340 1635 +3 1336 655 1635 +3 1458 211 1636 +3 1069 206 1636 +3 2120 823 1637 +3 1740 212 1637 +3 1531 789 1638 +3 2369 215 1638 +3 1285 208 1639 +3 1254 212 1639 +3 1405 390 1640 +3 1035 215 1640 +3 2353 799 1641 +3 2009 218 1641 +3 946 208 1642 +3 1285 699 1642 +3 1187 385 1643 +3 1030 218 1643 +3 2424 445 1644 +3 2420 221 1644 +3 1438 418 1645 +3 1056 221 1645 +3 2291 802 1646 +3 1963 224 1646 +3 1156 354 1647 +3 1008 224 1647 +3 1666 791 1648 +3 1613 227 1648 +3 1762 281 1649 +3 1708 662 1649 +3 2014 448 1650 +3 1087 230 1650 +3 935 175 1651 +3 1274 227 1651 +3 994 326 1652 +3 1382 662 1652 +3 1213 423 1653 +3 1063 230 1653 +3 1426 765 1654 +3 1935 232 1654 +3 1985 824 1655 +3 1864 571 1655 +3 2357 799 1656 +3 2353 235 1656 +3 1128 254 1657 +3 1108 232 1657 +3 1079 376 1658 +3 1179 571 1658 +3 1397 386 1659 +3 1031 235 1659 +3 1183 471 1660 +3 825 1660 471 +3 1013 359 1661 +3 362 1661 359 +3 1498 780 1662 +3 1490 246 1662 +3 866 31 1663 +3 1021 246 1663 +3 2249 806 1664 +3 1943 249 1664 +3 1142 325 1665 +3 993 249 1665 +3 2095 791 1666 +3 1648 255 1666 +3 952 226 1667 +3 1076 255 1667 +3 2445 518 1668 +3 1139 259 1668 +3 1219 429 1669 +3 1071 259 1669 +3 2408 826 1670 +3 2405 265 1670 +3 1422 406 1671 +3 1048 265 1671 +3 2279 809 1672 +3 1957 268 1672 +3 1152 347 1673 +3 1005 268 1673 +3 1543 792 1674 +3 2395 271 1674 +3 1417 403 1675 +3 1045 271 1675 +3 2379 811 1676 +3 2031 274 1676 +3 1195 398 1677 +3 1040 274 1677 +3 1490 780 1678 +3 1983 280 1678 +3 1174 373 1679 +3 1020 280 1679 +3 2022 448 1680 +3 2014 284 1680 +3 1449 424 1681 +3 1064 284 1681 +3 2026 518 1682 +3 2445 295 1682 +3 1463 430 1683 +3 1072 295 1683 +3 2233 261 1684 +3 966 260 1684 +3 1134 317 1685 +3 989 260 1685 +3 2383 811 1686 +3 2379 300 1686 +3 1409 399 1687 +3 1041 300 1687 +3 2268 819 1688 +3 1951 303 1688 +3 1149 339 1689 +3 1000 303 1689 +3 2365 793 1690 +3 2361 308 1690 +3 1401 388 1691 +3 1033 308 1691 +3 2301 790 1692 +3 1971 311 1692 +3 1160 361 1693 +3 1014 311 1693 +3 979 795 1694 +3 1228 313 1694 +3 1466 432 1695 +3 1074 313 1695 +3 2430 549 1696 +3 2064 316 1696 +3 1215 426 1697 +3 1066 316 1697 +3 1803 776 1698 +3 1795 296 1698 +3 1299 297 1699 +3 980 296 1699 +3 2117 772 1700 +3 1884 201 1700 +3 1094 202 1701 +3 944 201 1701 +3 2391 797 1702 +3 2387 321 1702 +3 1413 401 1703 +3 1043 321 1703 +3 2361 793 1704 +3 2015 324 1704 +3 1189 387 1705 +3 1032 324 1705 +3 2157 777 1706 +3 2153 247 1706 +3 1271 248 1707 +3 961 247 1707 +3 1649 281 1708 +3 1873 183 1708 +3 1086 184 1709 +3 938 183 1709 +3 2325 415 1710 +3 2321 332 1710 +3 1379 375 1711 +3 1023 332 1711 +3 1228 795 1712 +3 2068 336 1712 +3 1221 431 1713 +3 1073 336 1713 +3 2212 783 1714 +3 2208 301 1714 +3 1303 302 1715 +3 982 301 1715 +3 2085 773 1716 +3 1868 177 1716 +3 1080 178 1717 +3 936 177 1717 +3 2304 790 1718 +3 2301 343 1718 +3 1366 363 1719 +3 1016 343 1719 +3 2387 797 1720 +3 2035 346 1720 +3 1197 400 1721 +3 1042 346 1721 +3 2172 770 1722 +3 2168 266 1722 +3 1278 267 1723 +3 969 266 1723 +3 1161 549 1724 +3 2430 350 1724 +3 1454 46 1725 +3 1067 350 1725 +3 2321 415 1726 +3 1053 353 1726 +3 1177 374 1727 +3 1022 353 1727 +3 2138 785 1728 +3 2134 222 1728 +3 1261 223 1729 +3 951 222 1729 +3 2109 774 1730 +3 1880 195 1730 +3 1092 196 1731 +3 942 195 1731 +3 2005 782 1732 +3 1906 584 1732 +3 2195 787 1733 +3 2191 827 1733 +3 1105 385 1734 +3 1187 584 1734 +3 1291 705 1735 +3 827 1735 705 +3 2101 775 1736 +3 1876 189 1736 +3 1090 190 1737 +3 940 189 1737 +3 2079 292 1738 +3 1860 171 1738 +3 172 1739 291 +3 171 1739 172 +3 1637 823 1740 +3 2296 700 1740 +3 2220 807 1741 +3 2216 309 1741 +3 1309 310 1742 +3 986 309 1742 +3 1367 747 1743 +3 1953 341 1743 +3 1150 342 1744 +3 1003 341 1744 +3 1795 776 1745 +3 1925 828 1745 +3 2119 772 1746 +3 2117 829 1746 +3 1251 673 1747 +3 829 1747 673 +3 2403 808 1748 +3 2399 366 1748 +3 1419 405 1749 +3 1047 366 1749 +3 2349 804 1750 +3 2345 369 1750 +3 1393 384 1751 +3 1029 369 1751 +3 2412 800 1752 +3 2049 372 1752 +3 1205 410 1753 +3 1050 372 1753 +3 2188 778 1754 +3 2184 278 1754 +3 1287 279 1755 +3 973 278 1755 +3 2153 777 1756 +3 1908 244 1756 +3 1106 245 1757 +3 959 244 1757 +3 1859 818 1758 +3 2286 351 1758 +3 1347 352 1759 +3 1007 351 1759 +3 2260 803 1760 +3 1947 330 1760 +3 1146 331 1761 +3 996 330 1761 +3 2096 281 1762 +3 1649 186 1762 +3 1239 187 1763 +3 939 186 1763 +3 2184 778 1764 +3 1914 275 1764 +3 1114 276 1765 +3 972 275 1765 +3 2008 815 1766 +3 2000 379 1766 +3 1446 422 1767 +3 1062 379 1767 +3 2345 804 1768 +3 2001 382 1768 +3 1185 383 1769 +3 1028 382 1769 +3 2337 817 1770 +3 2333 380 1770 +3 1387 381 1771 +3 1027 380 1771 +3 2315 805 1772 +3 1979 367 1772 +3 1170 368 1773 +3 1018 367 1773 +3 2130 781 1774 +3 2128 216 1774 +3 1257 217 1775 +3 949 216 1775 +3 2146 653 1776 +3 1903 233 1776 +3 1104 234 1777 +3 955 233 1777 +3 2245 810 1778 +3 2241 322 1778 +3 1322 323 1779 +3 992 322 1779 +3 2216 807 1780 +3 1933 306 1780 +3 1125 307 1781 +3 984 306 1781 +3 830 1782 443 +3 2076 168 1782 +3 1225 169 1783 +3 933 168 1783 +3 2128 781 1784 +3 1892 213 1784 +3 1098 214 1785 +3 948 213 1785 +3 2399 808 1786 +3 2043 397 1786 +3 1201 404 1787 +3 1046 397 1787 +3 2180 771 1788 +3 2176 272 1788 +3 1282 273 1789 +3 971 272 1789 +3 2208 783 1790 +3 1929 298 1790 +3 1123 299 1791 +3 981 298 1791 +3 2276 747 1792 +3 1367 344 1792 +3 1317 728 1793 +3 831 1793 728 +3 1340 345 1794 +3 1004 344 1794 +3 1698 776 1795 +3 1745 714 1795 +3 2241 810 1796 +3 1939 319 1796 +3 728 1797 828 +3 1317 714 1797 +3 1138 320 1798 +3 991 319 1798 +3 962 251 1799 +3 1886 256 1799 +3 2089 773 1800 +3 2085 180 1800 +3 1095 317 1801 +3 1134 256 1801 +3 1235 181 1802 +3 937 180 1802 +3 1480 776 1803 +3 1698 461 1803 +3 2176 771 1804 +3 1443 269 1804 +3 989 317 1805 +3 1095 461 1805 +3 1112 270 1806 +3 970 269 1806 +3 2375 796 1807 +3 1535 396 1807 +3 890 89 1808 +3 1039 396 1808 +3 2310 812 1809 +3 1975 364 1809 +3 1166 365 1810 +3 1017 364 1810 +3 2168 770 1811 +3 1439 263 1811 +3 1110 264 1812 +3 967 263 1812 +3 2319 805 1813 +3 2315 370 1813 +3 1376 371 1814 +3 1019 370 1814 +3 2000 815 1815 +3 2058 414 1815 +3 1211 421 1816 +3 1061 414 1816 +3 2203 786 1817 +3 2199 288 1817 +3 1294 289 1818 +3 977 288 1818 +3 2134 785 1819 +3 1896 219 1819 +3 1100 220 1820 +3 950 219 1820 +3 2113 774 1821 +3 2109 198 1821 +3 1247 199 1822 +3 943 198 1822 +3 2199 786 1823 +3 1922 285 1823 +3 1118 286 1824 +3 976 285 1824 +3 2416 800 1825 +3 2412 412 1825 +3 1430 413 1826 +3 1052 412 1826 +3 2333 817 1827 +3 1988 377 1827 +3 1181 378 1828 +3 1026 377 1828 +3 832 1829 494 +3 2140 228 1829 +3 229 1830 833 +3 953 228 1830 +3 2191 787 1831 +3 1918 282 1831 +3 1116 283 1832 +3 975 282 1832 +3 2312 812 1833 +3 2310 834 1833 +3 1374 753 1834 +3 834 1834 753 +3 2124 788 1835 +3 2122 207 1835 +3 1254 208 1836 +3 946 207 1836 +3 2229 242 1837 +3 2225 314 1837 +3 1314 315 1838 +3 988 314 1838 +3 2286 818 1839 +3 1959 348 1839 +3 1154 349 1840 +3 1006 348 1840 +3 2105 775 1841 +3 2101 192 1841 +3 1243 193 1842 +3 941 192 1842 +3 2122 788 1843 +3 1888 204 1843 +3 1096 205 1844 +3 945 204 1844 +3 1535 796 1845 +3 2027 393 1845 +3 394 1846 595 +3 1037 393 1846 +3 2165 768 1847 +3 2161 257 1847 +3 1275 258 1848 +3 965 257 1848 +3 2264 803 1849 +3 2260 334 1849 +3 1332 335 1850 +3 998 334 1850 +3 2225 242 1851 +3 958 241 1851 +3 1130 312 1852 +3 987 241 1852 +3 2083 292 1853 +3 2079 174 1853 +3 1229 175 1854 +3 935 174 1854 +3 2161 768 1855 +3 1431 253 1855 +3 1108 254 1856 +3 963 253 1856 +3 1216 374 1857 +3 1177 411 1857 +3 294 1858 295 +3 592 1858 294 +3 1603 818 1859 +3 1758 632 1859 +3 1738 292 1860 +3 978 291 1860 +3 1022 374 1861 +3 1216 632 1861 +3 860 14 1862 +3 1362 291 1862 +3 1878 408 1863 +3 1049 407 1863 +3 1655 824 1864 +3 2270 437 1864 +3 1176 196 1865 +3 1092 407 1865 +3 1337 9 1866 +3 1241 437 1866 +3 1560 802 1867 +3 1627 568 1867 +3 1716 773 1868 +3 1473 439 1868 +3 942 196 1869 +3 1176 568 1869 +3 857 9 1870 +3 1337 439 1870 +3 1143 525 1871 +3 2222 444 1871 +3 2087 835 1872 +3 2251 2 1872 +3 1708 281 1873 +3 974 7 1873 +3 2111 836 1874 +3 1898 451 1874 +3 1358 13 1875 +3 1249 451 1875 +3 1736 775 1876 +3 1477 453 1876 +3 859 13 1877 +3 1358 453 1877 +3 2103 408 1878 +3 1863 455 1878 +3 1352 11 1879 +3 1245 455 1879 +3 1730 774 1880 +3 1475 456 1880 +3 858 11 1881 +3 1352 456 1881 +3 2081 837 1882 +3 2235 458 1882 +3 1319 4 1883 +3 1231 458 1883 +3 1700 772 1884 +3 1470 460 1884 +3 854 4 1885 +3 1319 460 1885 +3 1799 251 1886 +3 2438 462 1886 +3 1459 54 1887 +3 1301 462 1887 +3 1843 788 1888 +3 1512 463 1888 +3 877 54 1889 +3 1459 463 1889 +3 2155 794 1890 +3 1527 465 1890 +3 885 33 1891 +3 1273 465 1891 +3 1784 781 1892 +3 1491 74 1892 +3 867 33 1893 +3 885 74 1893 +3 2186 838 1894 +3 2422 467 1894 +3 1440 49 1895 +3 1289 467 1895 +3 1819 785 1896 +3 1506 469 1896 +3 874 49 1897 +3 1440 469 1897 +3 1874 836 1898 +3 2045 452 1898 +3 2149 839 1899 +3 2355 472 1899 +3 1202 190 1900 +3 1090 452 1900 +3 1398 28 1901 +3 1269 472 1901 +3 821 1902 814 +3 1623 611 1902 +3 1776 653 1903 +3 1489 475 1903 +3 940 190 1904 +3 1202 611 1904 +3 865 28 1905 +3 1398 475 1905 +3 1732 782 1906 +3 1494 477 1906 +3 868 19 1907 +3 1259 477 1907 +3 1756 777 1908 +3 1482 34 1908 +3 862 19 1909 +3 868 34 1909 +3 892 43 1910 +3 1280 112 1910 +3 871 43 1911 +3 892 94 1911 +3 2136 328 1912 +3 995 327 1912 +3 1384 22 1913 +3 1263 327 1913 +3 1764 778 1914 +3 1484 486 1914 +3 863 22 1915 +3 1384 486 1915 +3 2201 441 1916 +3 2018 488 1916 +3 1450 53 1917 +3 1296 488 1917 +3 1831 787 1918 +3 1510 490 1918 +3 876 53 1919 +3 1450 490 1919 +3 2193 801 1920 +3 1559 493 1920 +3 905 51 1921 +3 1292 493 1921 +3 1823 786 1922 +3 1508 127 1922 +3 875 51 1923 +3 905 127 1923 +3 1371 16 1924 +3 1255 498 1924 +3 1745 776 1925 +3 1480 748 1925 +3 861 16 1926 +3 1371 748 1926 +3 2163 513 1927 +3 2381 500 1927 +3 1410 37 1928 +3 1277 500 1928 +3 1790 783 1929 +3 1495 502 1929 +3 869 37 1930 +3 1410 502 1930 +3 1527 794 1931 +3 2363 79 1931 +3 1402 80 1932 +3 887 79 1932 +3 1780 807 1933 +3 1577 504 1933 +3 914 80 1934 +3 1402 504 1934 +3 1654 765 1935 +3 1192 236 1935 +3 1467 167 1936 +3 956 236 1936 +3 1539 111 1937 +3 2389 99 1937 +3 1414 100 1938 +3 894 99 1938 +3 1796 810 1939 +3 1585 517 1939 +3 918 100 1940 +3 1414 517 1940 +3 2363 794 1941 +3 2155 521 1941 +3 1272 142 1942 +3 1403 521 1942 +3 1664 806 1943 +3 1575 523 1943 +3 913 142 1944 +3 1272 523 1944 +3 995 328 1945 +3 2323 333 1945 +3 1380 133 1946 +3 1385 333 1946 +3 1760 803 1947 +3 1564 528 1947 +3 908 133 1948 +3 1380 528 1948 +3 1192 765 1949 +3 2210 530 1949 +3 1304 166 1950 +3 1468 530 1950 +3 1688 819 1951 +3 1607 532 1951 +3 931 166 1952 +3 1304 532 1952 +3 1743 747 1953 +3 1547 534 1953 +3 898 109 1954 +3 1368 534 1954 +3 2389 111 1955 +3 2170 536 1955 +3 1279 149 1956 +3 1415 536 1956 +3 1672 809 1957 +3 1583 537 1957 +3 917 149 1958 +3 1279 537 1958 +3 1839 818 1959 +3 1603 539 1959 +3 929 164 1960 +3 1455 539 1960 +3 2323 328 1961 +3 2136 541 1961 +3 1262 129 1962 +3 1381 541 1962 +3 1646 802 1963 +3 1560 543 1963 +3 906 129 1964 +3 1262 543 1964 +3 1990 801 1965 +3 2193 841 1965 +3 1559 801 1966 +3 1990 130 1966 +3 1444 131 1967 +3 907 130 1967 +3 925 131 1968 +3 1444 546 1968 +3 2222 525 1969 +3 2218 843 1969 +3 1310 60 1970 +3 843 1970 60 +3 1692 790 1971 +3 1518 548 1971 +3 880 60 1972 +3 1310 548 1972 +3 2406 769 1973 +3 2401 552 1973 +3 1420 151 1974 +3 1424 552 1974 +3 1809 812 1975 +3 1589 555 1975 +3 920 151 1976 +3 1420 555 1976 +3 2355 839 1977 +3 2347 557 1977 +3 1394 141 1978 +3 1399 557 1978 +3 1772 805 1979 +3 1573 559 1979 +3 912 141 1980 +3 1394 559 1980 +3 2414 838 1981 +3 2186 562 1981 +3 1288 155 1982 +3 1434 562 1982 +3 1678 780 1983 +3 1592 564 1983 +3 922 155 1984 +3 1288 564 1984 +3 2262 824 1985 +3 1655 570 1985 +3 1240 77 1986 +3 1334 570 1986 +3 2018 441 1987 +3 2004 573 1987 +3 1827 817 1988 +3 1600 574 1988 +3 927 162 1989 +3 1447 574 1989 +3 1966 801 1990 +3 1965 544 1990 +3 2347 839 1991 +3 2149 576 1991 +3 545 1992 841 +3 1158 544 1992 +3 1268 140 1993 +3 1395 576 1993 +3 566 1994 825 +3 1571 578 1994 +3 911 140 1995 +3 1268 578 1995 +3 2410 844 1996 +3 2331 766 1996 +3 2339 153 1997 +3 2335 579 1997 +3 1386 413 1998 +3 1430 766 1998 +3 1388 138 1999 +3 1391 579 1999 +3 1766 815 2000 +3 1815 759 2000 +3 1768 804 2001 +3 1569 581 2001 +3 1052 413 2002 +3 1386 759 2002 +3 910 138 2003 +3 1388 581 2003 +3 1987 441 2004 +3 1081 440 2004 +3 2317 782 2005 +3 1732 583 2005 +3 1206 378 2006 +3 1181 440 2006 +3 1258 120 2007 +3 1378 583 2007 +3 1594 815 2008 +3 1766 618 2008 +3 1641 799 2009 +3 1552 585 2009 +3 1026 378 2010 +3 1206 618 2010 +3 902 120 2011 +3 1258 585 2011 +3 2251 835 2012 +3 2243 587 2012 +3 1323 72 2013 +3 1328 587 2013 +3 1680 448 2014 +3 1650 702 2014 +3 1704 793 2015 +3 1525 589 2015 +3 953 229 2016 +3 1290 702 2016 +3 884 72 2017 +3 1323 589 2017 +3 1916 441 2018 +3 1987 489 2018 +3 2218 525 2019 +3 1143 524 2019 +3 1180 283 2020 +3 1116 489 2020 +3 1226 57 2021 +3 1312 524 2021 +3 1567 448 2022 +3 1680 572 2022 +3 1609 789 2023 +3 1516 591 2023 +3 975 283 2024 +3 1180 572 2024 +3 879 57 2025 +3 1226 591 2025 +3 1579 518 2026 +3 1682 592 2026 +3 1845 796 2027 +3 1605 595 2027 +3 930 165 2028 +3 1461 595 2028 +3 2401 769 2029 +3 2178 597 2029 +3 1283 150 2030 +3 1421 597 2030 +3 1676 811 2031 +3 1587 599 2031 +3 919 150 2032 +3 1283 599 2032 +3 359 2033 845 +3 2274 602 2033 +3 1341 92 2034 +3 1345 602 2034 +3 1720 797 2035 +3 1536 603 2035 +3 891 92 2036 +3 1341 603 2036 +3 2243 835 2037 +3 2087 605 2037 +3 1236 69 2038 +3 1324 605 2038 +3 1617 792 2039 +3 1523 607 2039 +3 883 69 2040 +3 1236 607 2040 +3 2381 513 2041 +3 2373 609 2041 +3 1406 147 2042 +3 1411 609 2042 +3 1786 808 2043 +3 1581 610 2043 +3 916 147 2044 +3 1406 610 2044 +3 1898 836 2045 +3 2293 612 2045 +3 1355 745 2046 +3 1359 612 2046 +3 1494 782 2047 +3 2317 39 2047 +3 1377 40 2048 +3 870 39 2048 +3 1752 800 2049 +3 1556 617 2049 +3 904 40 2050 +3 1377 617 2050 +3 1295 161 2051 +3 1448 442 2051 +3 2293 836 2052 +3 2111 621 2052 +3 1248 106 2053 +3 1356 621 2053 +3 1629 392 2054 +3 1036 391 2054 +3 896 106 2055 +3 1248 391 2055 +3 2422 838 2056 +3 2414 624 2056 +3 1432 159 2057 +3 1442 624 2057 +3 1815 815 2058 +3 1594 626 2058 +3 924 159 2059 +3 1432 626 2059 +3 2335 153 2060 +3 2141 627 2060 +3 1264 135 2061 +3 1389 627 2061 +3 2235 837 2062 +3 2227 629 2062 +3 1315 66 2063 +3 1320 629 2063 +3 1696 549 2064 +3 1521 631 2064 +3 882 66 2065 +3 1315 631 2065 +3 2270 824 2066 +3 2262 635 2066 +3 1333 83 2067 +3 1338 635 2067 +3 1712 795 2068 +3 1532 637 2068 +3 888 83 2069 +3 1333 637 2069 +3 2227 837 2070 +3 2081 638 2070 +3 1230 63 2071 +3 1316 638 2071 +3 1613 791 2072 +3 1519 640 2072 +3 881 63 2073 +3 1230 640 2073 +3 2255 846 2074 +3 2367 642 2074 +3 1404 733 2075 +3 1330 642 2075 +3 1782 830 2076 +3 644 2076 830 +3 1425 719 2077 +3 2091 649 2077 +3 1469 357 2078 +3 1361 649 2078 +3 1853 292 2079 +3 1738 651 2079 +3 1012 357 2080 +3 1469 651 2080 +3 2070 837 2081 +3 1882 639 2081 +3 1093 433 2082 +3 1223 639 2082 +3 978 292 2083 +3 1853 457 2083 +3 1075 433 2084 +3 1093 457 2084 +3 1800 773 2085 +3 1716 658 2085 +3 1002 340 2086 +3 1416 658 2086 +3 2037 835 2087 +3 1872 606 2087 +3 1084 402 2088 +3 1199 606 2088 +3 1473 773 2089 +3 1800 447 2089 +3 1044 402 2090 +3 1084 447 2090 +3 2077 719 2091 +3 2159 650 2091 +3 2247 779 2092 +3 2327 660 2092 +3 1274 175 2093 +3 1229 650 2093 +3 1382 326 2094 +3 1326 660 2094 +3 1519 791 2095 +3 1666 237 2095 +3 974 281 2096 +3 1762 436 2096 +3 963 254 2097 +3 1128 237 2097 +3 1024 376 2098 +3 1079 436 2098 +3 2296 823 2099 +3 2434 665 2099 +3 1457 356 2100 +3 1357 665 2100 +3 1841 775 2101 +3 1736 667 2101 +3 1011 356 2102 +3 1457 667 2102 +3 1127 408 2103 +3 1878 507 2103 +3 1091 427 2104 +3 1217 507 2104 +3 1477 775 2105 +3 1841 454 2105 +3 1068 427 2106 +3 1091 454 2106 +3 2289 798 2107 +3 1551 669 2107 +3 901 117 2108 +3 1351 669 2108 +3 1821 774 2109 +3 1730 116 2109 +3 1009 117 2110 +3 901 116 2110 +3 2052 836 2111 +3 1874 622 2111 +3 1088 420 2112 +3 1209 622 2112 +3 1475 774 2113 +3 1821 450 2113 +3 1058 420 2114 +3 1088 450 2114 +3 2231 848 2115 +3 2306 671 2115 +3 1372 318 2116 +3 1318 671 2116 +3 1746 772 2117 +3 1700 674 2117 +3 990 318 2118 +3 1372 674 2118 +3 1470 772 2119 +3 1746 676 2119 +3 2434 823 2120 +3 1637 678 2120 +3 947 211 2121 +3 1458 678 2121 +3 1835 788 2122 +3 1843 210 2122 +3 1069 211 2123 +3 947 210 2123 +3 1512 788 2124 +3 1835 497 2124 +3 1065 425 2125 +3 1121 497 2125 +3 2367 846 2126 +3 2351 680 2126 +3 1396 390 2127 +3 1405 680 2127 +3 1774 781 2128 +3 1784 682 2128 +3 1035 390 2129 +3 1396 682 2129 +3 1491 781 2130 +3 1774 476 2130 +3 1030 385 2131 +3 1105 476 2131 +3 2418 798 2132 +3 2289 683 2132 +3 1350 418 2133 +3 1438 683 2133 +3 1728 785 2134 +3 1819 685 2134 +3 1056 418 2135 +3 1350 685 2135 +3 1961 328 2136 +3 1912 542 2136 +3 1113 354 2137 +3 1156 542 2137 +3 1506 785 2138 +3 1728 485 2138 +3 1008 354 2139 +3 1113 485 2139 +3 1829 832 2140 +3 833 2140 832 +3 2060 153 2141 +3 921 152 2141 +3 1119 423 2142 +3 1213 152 2142 +3 1063 423 2143 +3 1119 494 2143 +3 2351 846 2144 +3 2255 687 2144 +3 1329 386 2145 +3 1397 687 2145 +3 1232 653 2146 +3 1776 656 2146 +3 1031 386 2147 +3 1329 656 2147 +3 1489 653 2148 +3 1232 652 2148 +3 1991 839 2149 +3 1899 577 2149 +3 1102 471 2150 +3 1183 577 2150 +3 1488 779 2151 +3 2247 30 2151 +3 1325 31 2152 +3 866 30 2152 +3 1706 777 2153 +3 1756 690 2153 +3 1021 31 2154 +3 1325 690 2154 +3 1941 794 2155 +3 1890 522 2155 +3 1097 325 2156 +3 1142 522 2156 +3 1482 777 2157 +3 1706 464 2157 +3 993 325 2158 +3 1097 464 2158 +3 2091 719 2159 +3 2443 225 2159 +3 1462 226 2160 +3 952 225 2160 +3 1847 768 2161 +3 1855 692 2161 +3 1076 226 2162 +3 1462 692 2162 +3 1135 513 2163 +3 1927 515 2163 +3 1122 429 2164 +3 1219 515 2164 +3 1514 768 2165 +3 1847 499 2165 +3 1071 429 2166 +3 1122 499 2166 +3 1343 406 2167 +3 1422 763 2167 +3 1722 770 2168 +3 1811 694 2168 +3 1048 406 2169 +3 1343 694 2169 +3 1955 111 2170 +3 899 110 2170 +3 1111 347 2171 +3 1152 110 2171 +3 1503 770 2172 +3 1722 484 2172 +3 1005 347 2173 +3 1111 484 2173 +3 2393 822 2174 +3 2377 696 2174 +3 1408 403 2175 +3 1417 696 2175 +3 1788 771 2176 +3 1804 698 2176 +3 1045 403 2177 +3 1408 698 2177 +3 2029 769 2178 +3 1435 598 2178 +3 1109 398 2179 +3 1195 598 2179 +3 1499 771 2180 +3 1788 480 2180 +3 1040 398 2181 +3 1109 480 2181 +3 2327 779 2182 +3 1488 701 2182 +3 864 25 2183 +3 1383 701 2183 +3 1754 778 2184 +3 1764 24 2184 +3 1025 25 2185 +3 864 24 2185 +3 1981 838 2186 +3 1894 563 2186 +3 1099 373 2187 +3 1174 563 2187 +3 1484 778 2188 +3 1754 466 2188 +3 1020 373 2189 +3 1099 466 2189 +3 1354 424 2190 +3 1449 703 2190 +3 1733 787 2191 +3 1831 706 2191 +3 1064 424 2192 +3 1354 706 2192 +3 1965 801 2193 +3 1920 840 2193 +3 1117 492 2194 +3 840 2194 492 +3 1510 787 2195 +3 1733 491 2195 +3 492 2196 827 +3 1117 491 2196 +3 1551 798 2197 +3 2418 122 2197 +3 1436 123 2198 +3 903 122 2198 +3 1817 786 2199 +3 1823 708 2199 +3 1060 123 2200 +3 1436 708 2200 +3 1081 441 2201 +3 1916 619 2201 +3 1115 417 2202 +3 1207 619 2202 +3 1508 786 2203 +3 1817 487 2203 +3 1054 417 2204 +3 1115 487 2204 +3 2306 848 2205 +3 849 2205 848 +3 2377 822 2206 +3 2266 716 2206 +3 1335 399 2207 +3 1409 716 2207 +3 1714 783 2208 +3 1790 718 2208 +3 1041 399 2209 +3 1335 718 2209 +3 1949 765 2210 +3 1426 531 2210 +3 1107 339 2211 +3 1149 531 2211 +3 1495 783 2212 +3 1714 478 2212 +3 1000 339 2213 +3 1107 478 2213 +3 2359 746 2214 +3 2299 721 2214 +3 1364 388 2215 +3 1401 721 2215 +3 1741 807 2216 +3 1780 723 2216 +3 1033 388 2217 +3 1364 723 2217 +3 1969 525 2218 +3 2019 547 2218 +3 1190 361 2219 +3 1160 547 2219 +3 1577 807 2220 +3 1741 590 2220 +3 1014 361 2221 +3 1190 590 2221 +3 1871 525 2222 +3 1969 842 2222 +3 1311 784 2223 +3 2428 725 2223 +3 1453 432 2224 +3 1466 725 2224 +3 1837 242 2225 +3 1851 727 2225 +3 1074 432 2226 +3 1453 727 2226 +3 2062 837 2227 +3 2070 630 2227 +3 1222 426 2228 +3 1215 630 2228 +3 1101 242 2229 +3 1837 473 2229 +3 1066 426 2230 +3 1222 473 2230 +3 848 2231 831 +3 2115 713 2231 +3 1250 297 2232 +3 1299 713 2232 +3 1631 261 2233 +3 1684 670 2233 +3 980 297 2234 +3 1250 670 2234 +3 1882 837 2235 +3 2062 459 2235 +3 1214 202 2236 +3 1094 459 2236 +3 1601 261 2237 +3 1631 628 2237 +3 944 202 2238 +3 1214 628 2238 +3 2385 746 2239 +3 2359 730 2239 +3 1400 401 2240 +3 1413 730 2240 +3 1778 810 2241 +3 1796 732 2241 +3 1043 401 2242 +3 1400 732 2242 +3 2012 835 2243 +3 2037 588 2243 +3 1198 387 2244 +3 1189 588 2244 +3 1585 810 2245 +3 1778 604 2245 +3 1032 387 2246 +3 1198 604 2246 +3 2151 779 2247 +3 2092 689 2247 +3 1238 248 2248 +3 1271 689 2248 +3 1619 806 2249 +3 1664 659 2249 +3 961 248 2250 +3 1238 659 2250 +3 1872 835 2251 +3 2012 0 2251 +3 1188 184 2252 +3 1086 0 2252 +3 1575 806 2253 +3 1619 586 2253 +3 938 184 2254 +3 1188 586 2254 +3 2144 846 2255 +3 2074 688 2255 +3 1224 239 2256 +3 1267 688 2256 +3 957 239 2257 +3 1224 641 2257 +3 1502 784 2258 +3 1311 735 2258 +3 1465 375 2259 +3 1379 735 2259 +3 1849 803 2260 +3 1760 737 2260 +3 1023 375 2261 +3 1465 737 2261 +3 2066 824 2262 +3 1985 636 2262 +3 1178 431 2263 +3 1221 636 2263 +3 1564 803 2264 +3 1849 569 2264 +3 1073 431 2265 +3 1178 569 2265 +3 2206 822 2266 +3 1633 717 2266 +3 1233 302 2267 +3 1303 717 2267 +3 1615 819 2268 +3 1688 654 2268 +3 982 302 2269 +3 1233 654 2269 +3 1864 824 2270 +3 2066 438 2270 +3 1220 178 2271 +3 1080 438 2271 +3 1607 819 2272 +3 1615 634 2272 +3 936 178 2273 +3 1220 634 2273 +3 2033 359 2274 +3 1013 358 2274 +3 1162 400 2275 +3 1197 358 2275 +3 1547 747 2276 +3 1792 550 2276 +3 1042 400 2277 +3 1162 550 2277 +3 1227 267 2278 +3 1278 693 2278 +3 1611 809 2279 +3 1672 645 2279 +3 969 267 2280 +3 1227 645 2280 +3 1196 601 2281 +3 845 2281 601 +3 1583 809 2282 +3 1611 600 2282 +3 601 2283 820 +3 1196 600 2283 +3 2428 784 2284 +3 1502 744 2284 +3 872 46 2285 +3 1454 744 2285 +3 1758 818 2286 +3 1839 45 2286 +3 1067 46 2287 +3 872 45 2287 +3 1049 408 2288 +3 1127 411 2288 +3 2132 798 2289 +3 2107 684 2289 +3 1246 223 2290 +3 1261 684 2290 +3 1627 802 2291 +3 1646 668 2291 +3 951 223 2292 +3 1246 668 2292 +3 2045 836 2293 +3 2052 613 2293 +3 1208 614 2294 +3 1203 613 2294 +3 1596 816 2295 +3 620 2295 816 +3 1740 823 2296 +3 2099 847 2296 +3 1242 664 2297 +3 847 2297 664 +3 1623 821 2298 +3 663 2298 821 +3 2214 746 2299 +3 1363 722 2299 +3 1339 310 2300 +3 1309 722 2300 +3 1718 790 2301 +3 1692 738 2301 +3 986 310 2302 +3 1339 738 2302 +3 1126 342 2303 +3 1150 533 2303 +3 1518 790 2304 +3 1718 355 2304 +3 1003 342 2305 +3 1126 355 2305 +3 2115 848 2306 +3 2205 672 2306 +3 673 2307 849 +3 1251 672 2307 +3 2397 850 2308 +3 2426 751 2308 +3 1452 405 2309 +3 1419 751 2309 +3 1833 812 2310 +3 1809 754 2310 +3 1047 405 2311 +3 1452 754 2311 +3 1589 812 2312 +3 1833 813 2312 +3 2343 844 2313 +3 2410 756 2313 +3 1427 384 2314 +3 1393 756 2314 +3 1813 805 2315 +3 1772 758 2315 +3 1029 384 2316 +3 1427 758 2316 +3 2047 782 2317 +3 2005 616 2317 +3 1186 410 2318 +3 1205 616 2318 +3 1573 805 2319 +3 1813 582 2319 +3 1270 279 2320 +3 1287 26 2320 +3 1710 415 2321 +3 1726 734 2321 +3 1007 352 2322 +3 1331 734 2322 +3 1945 328 2323 +3 1961 527 2323 +3 1155 331 2324 +3 1146 527 2324 +3 1544 415 2325 +3 1710 540 2325 +3 996 331 2326 +3 1155 540 2326 +3 2092 779 2327 +3 2182 661 2327 +3 1286 187 2328 +3 1239 661 2328 +3 1163 337 2329 +3 1621 553 2329 +3 939 187 2330 +3 1286 553 2330 +3 1996 844 2331 +3 2343 760 2331 +3 1392 422 2332 +3 1446 760 2332 +3 1770 817 2333 +3 1827 762 2333 +3 1062 422 2334 +3 1392 762 2334 +3 1997 153 2335 +3 2060 580 2335 +3 1212 383 2336 +3 1185 580 2336 +3 1600 817 2337 +3 1770 434 2337 +3 1028 383 2338 +3 1212 434 2338 +3 921 153 2339 +3 1997 156 2339 +3 1184 495 2340 +3 1120 156 2340 +3 1571 566 2341 +3 1175 565 2341 +3 495 2342 567 +3 1184 565 2342 +3 2331 844 2343 +3 2313 761 2343 +3 1375 381 2344 +3 1387 761 2344 +3 1750 804 2345 +3 1768 755 2345 +3 1027 381 2346 +3 1375 755 2346 +3 1977 839 2347 +3 1991 558 2347 +3 1182 368 2348 +3 1170 558 2348 +3 1569 804 2349 +3 1750 575 2349 +3 1018 368 2350 +3 1182 575 2350 +3 2126 846 2351 +3 2144 681 2351 +3 1266 217 2352 +3 1257 681 2352 +3 1656 799 2353 +3 1641 686 2353 +3 949 217 2354 +3 1266 686 2354 +3 1899 839 2355 +3 1977 474 2355 +3 1168 234 2356 +3 1104 474 2356 +3 1552 799 2357 +3 1656 556 2357 +3 955 234 2358 +3 1168 556 2358 +3 2239 746 2359 +3 2214 731 2359 +3 1307 323 2360 +3 1322 731 2360 +3 1690 793 2361 +3 1704 720 2361 +3 992 323 2362 +3 1307 720 2362 +3 1931 794 2363 +3 1941 503 2363 +3 1140 307 2364 +3 1125 503 2364 +3 1525 793 2365 +3 1690 520 2365 +3 984 307 2366 +3 1140 520 2366 +3 2074 846 2367 +3 2126 643 2367 +3 1256 169 2368 +3 1225 643 2368 +3 1638 789 2369 +3 1609 679 2369 +3 933 169 2370 +3 1256 679 2370 +3 2442 850 2371 +3 2397 852 2371 +3 1418 428 2372 +3 852 2372 428 +3 2041 513 2373 +3 1135 512 2373 +3 1218 404 2374 +3 1201 512 2374 +3 1605 796 2375 +3 1807 633 2375 +3 1046 404 2376 +3 1218 633 2376 +3 2174 822 2377 +3 2206 697 2377 +3 1302 273 2378 +3 1282 697 2378 +3 1686 811 2379 +3 1676 715 2379 +3 971 273 2380 +3 1302 715 2380 +3 1927 513 2381 +3 2041 501 2381 +3 1200 299 2382 +3 1123 501 2382 +3 1587 811 2383 +3 1686 608 2383 +3 981 299 2384 +3 1200 608 2384 +3 1363 746 2385 +3 2239 740 2385 +3 1321 345 2386 +3 1340 740 2386 +3 1702 797 2387 +3 1720 729 2387 +3 1004 345 2388 +3 1321 729 2388 +3 1937 111 2389 +3 1955 516 2389 +3 1151 320 2390 +3 1138 516 2390 +3 1536 797 2391 +3 1702 535 2391 +3 991 320 2392 +3 1151 535 2392 +3 1633 822 2393 +3 2174 657 2393 +3 1281 181 2394 +3 1235 657 2394 +3 1674 792 2395 +3 1617 695 2395 +3 937 181 2396 +3 1281 695 2396 +3 2371 850 2397 +3 2308 88 2397 +3 1373 89 2398 +3 890 88 2398 +3 1748 808 2399 +3 1786 750 2399 +3 1039 89 2400 +3 1373 750 2400 +3 1973 769 2401 +3 2029 554 2401 +3 1194 365 2402 +3 1166 554 2402 +3 1581 808 2403 +3 1748 596 2403 +3 1017 365 2404 +3 1194 596 2404 +3 1670 826 2405 +3 764 2405 826 +3 1435 769 2406 +3 1973 482 2406 +3 1164 264 2407 +3 1110 482 2407 +3 826 2408 115 +3 1670 551 2408 +3 967 264 2409 +3 1164 551 2409 +3 2313 844 2410 +3 1996 757 2410 +3 1445 371 2411 +3 1376 757 2411 +3 1825 800 2412 +3 1752 767 2412 +3 1019 371 2413 +3 1445 767 2413 +3 2056 838 2414 +3 1981 625 2414 +3 1172 421 2415 +3 1211 625 2415 +3 1556 800 2416 +3 1825 561 2416 +3 1061 421 2417 +3 1172 561 2417 +3 2197 798 2418 +3 2132 707 2418 +3 1260 289 2419 +3 1294 707 2419 +3 1644 445 2420 +3 1171 560 2420 +3 977 289 2421 +3 1260 560 2421 +3 1894 838 2422 +3 2056 468 2422 +3 1210 220 2423 +3 1100 468 2423 +3 1598 445 2424 +3 1644 623 2424 +3 950 220 2425 +3 1210 623 2425 +3 2308 850 2426 +3 2442 752 2426 +3 753 2427 851 +3 1374 752 2427 +3 2223 784 2428 +3 2284 726 2428 +3 1346 315 2429 +3 1314 726 2429 +3 1724 549 2430 +3 1696 743 2430 +3 988 315 2431 +3 1346 743 2431 +3 983 251 2432 +3 962 250 2432 +3 1006 349 2433 +3 1132 511 2433 +3 2099 823 2434 +3 2120 666 2434 +3 1253 193 2435 +3 1243 666 2435 +3 1634 509 2436 +3 1625 677 2436 +3 941 193 2437 +3 1253 677 2437 +3 1886 251 2438 +3 983 304 2438 +3 1153 205 2439 +3 1096 304 2439 +3 1540 509 2440 +3 1634 538 2440 +3 945 205 2441 +3 1153 538 2441 +3 2426 850 2442 +3 2371 851 2442 +3 2159 719 2443 +3 1306 691 2443 +3 1297 258 2444 +3 1275 691 2444 +3 1682 518 2445 +3 1668 709 2445 +3 965 258 2446 +3 1297 709 2446 diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp new file mode 100644 index 000000000000..554c50d2af65 --- /dev/null +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include + +#include +#include + +#include + +#include + +namespace PMP = CGAL::Polygon_mesh_processing; +using K = CGAL::Exact_predicates_inexact_constructions_kernel; +using SurfaceMesh = CGAL::Surface_mesh; + + +typedef boost::property_map::type VertexPointMap; +typedef typename CGAL::Kernel_traits< + typename boost::property_traits::value_type>::Kernel GeomTraits; +typedef CGAL::Surface_mesh_approximation:: + L21_metric_plane_proxy + L21_Metric; +typedef CGAL::Variational_shape_approximation + L21_MeshApproximation; + +struct PolygonSoup +{ + using PointType = K::Point_3; + std::vector points; + std::vector> faces; +}; + +auto meshArea = [](const SurfaceMesh& mesh) { + double area = 0; + for (const auto& f : mesh.faces()) + { + std::vector pts; + for (const auto& v : mesh.vertices_around_face(mesh.halfedge(f))) + { + pts.push_back(mesh.point(v)); + } + K::Triangle_3 tri(pts[0], pts[1], pts[2]); + area += std::sqrt(tri.squared_area()); + } + return area; +}; + +auto soupArea = [](const PolygonSoup& soup) { + double area = 0; + for (const auto& f : soup.faces) + { + std::vector pts = {soup.points[f[0]], soup.points[f[1]], soup.points[f[2]]}; + K::Triangle_3 tri(pts[0], pts[1], pts[2]); + area += std::sqrt(tri.squared_area()); + } + return area; +}; +auto soupToMesh = [](const PolygonSoup& soup) { + SurfaceMesh mesh; + std::vector vertices; + for (const auto& p : soup.points) + { + vertices.push_back(mesh.add_vertex(p)); + } + for (const auto& f : soup.faces) + { + mesh.add_face(vertices[f[0]], vertices[f[1]], vertices[f[2]]); + } + return mesh; +}; + +int main(int, char*[]) +{ + std::array subdivisionRatios = { 0.10 , 2.0 , 2.0 , 10.0 , 10.0 , 10.00 }; + std::array boundarySubdivisionRatios = { 0.01 , 2.0 , 0.1 , 10.0 , 1.0 , 0.01 }; + + for (int i = 0; i < subdivisionRatios.size(); ++i) + { + const auto subdivisionRatio = subdivisionRatios[i]; + const auto boundarySubdivisionRatio = boundarySubdivisionRatios[i]; + std::string filename = "./VSA-" + std::to_string(subdivisionRatio) + "-" + std::to_string(boundarySubdivisionRatio); + SurfaceMesh mesh; + + std::ifstream in("data/patch.ply"); + CGAL::IO::read_PLY(in, mesh); + std::cout << vertices(mesh).size() << std::endl; + const int maxProxies = 10; + const int defaultIterations = 20; + + VertexPointMap vpmap = get(boost::vertex_point, mesh); + L21_Metric metric(mesh, vpmap); + L21_MeshApproximation approx(mesh, vpmap, metric); + + const auto seedingParams = // + CGAL::parameters::seeding_method( + CGAL::Surface_mesh_approximation::Seeding_method::INCREMENTAL) + .max_number_of_proxies(maxProxies) + .min_error_drop(0.001) + .number_of_relaxations(5); + approx.initialize_seeds(seedingParams); + + approx.run(defaultIterations); + + const auto meshParams = CGAL::parameters::subdivision_ratio(subdivisionRatio) + .boundary_subdivision_ratio(boundarySubdivisionRatio) + .with_dihedral_angle(false) + .optimize_boundary_anchor_location(false) + .optimize_anchor_location(true) + .pca_plane(false); + const bool isOutputManifold = approx.extract_mesh(meshParams); + if (!isOutputManifold) + { + throw std::runtime_error("not manifold"); + } + + PolygonSoup soup; + const auto outputParams = CGAL::parameters::anchors(std::back_inserter(soup.points)) + .triangles(std::back_inserter(soup.faces)); + approx.output(outputParams); + + std::cerr << " Mesh area = " << meshArea(mesh) << " Soup area = " << soupArea(soup) + << std::endl; + { + std::ofstream f(filename + "soup.ply"); + CGAL::IO::write_PLY(f, soupToMesh(soup)); + } + } + + return 0; +} From 98fa0c089fd6f2e09622845fb7cea0ca8daa8593 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 18 Jul 2023 09:36:05 +0100 Subject: [PATCH 0493/1398] Fix for crash on Quit --- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index e1ead77a2276..e89577b1d1ae 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -186,6 +186,7 @@ CGAL::QGLViewer::~QGLViewer() { helpWidget()->close(); delete helpWidget_; } + disconnect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &CGAL::QGLViewer::contextIsDestroyed); } From 178d063536b0128e09d593ae3c4b0f6c581de642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 18 Jul 2023 11:46:42 +0200 Subject: [PATCH 0494/1398] Improve the doc of Face_filtered_graph: patch IDs can be more than size_t --- BGL/include/CGAL/boost/graph/Face_filtered_graph.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index 28afe86c27a6..ffb41b041dd8 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -49,9 +49,11 @@ namespace CGAL { * the adapted graph must define a manifold mesh. In order to check that this condition is verified, you can * use the function `is_selection_valid()`. * - * There are two different ways to initialize this class. You can directly provide the set of faces selected, or - * if you have a face patch map, select the patches of faces. The latter option is convenient if you want to access - * some connected components of a graph after having called `CGAL::Polygon_mesh_processing::connected_components()`. + * There are two different ways to initialize this class: you can directly provide a set of selected faces, + * or provide a set of patch identifiers as well as a map between faces and patch identifiers. + * The latter option is convenient if you want to access some connected components of a graph + * after having called `CGAL::Polygon_mesh_processing::connected_components()`, or if you want + * to select only faces of a given color, for example. * * The documented interface of this class is limited on purpose and free functions of the concept * this class is a model of must be used to manipulate it. From ad41766454cf5c72ea9e3cbfb9063b4d4384b827 Mon Sep 17 00:00:00 2001 From: albert-github Date: Tue, 18 Jul 2023 13:23:37 +0200 Subject: [PATCH 0495/1398] issue #7395 Improvement of layout of model relations Corrected `cgalModels` to `cgalHasModes` inside `cgalHasNodelsBegin` / `cgalHasModelsEnd` --- .../doc/AABB_tree/Concepts/AABBPrimitive.h | 10 ++-- .../Concepts/AABBPrimitiveWithSharedData.h | 6 +- .../Concepts/AABBRayIntersectionTraits.h | 2 +- AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h | 2 +- .../Concepts/AlgebraicStructureTraits.h | 2 +- .../Concepts/FieldNumberType.h | 20 +++---- .../Concepts/FractionTraits.h | 2 +- .../Concepts/FromIntConstructible.h | 6 +- .../Concepts/RealEmbeddableTraits.h | 2 +- .../Concepts/AlgebraicKernel_d_1.h | 4 +- .../Concepts/AlphaShapeFace_2.h | 2 +- .../Alpha_wrap_3/Concepts/AlphaWrapOracle.h | 8 +-- .../Concepts/ApolloniusGraphDataStructure_2.h | 2 +- .../ApolloniusGraphHierarchyVertexBase_2.h | 2 +- .../Concepts/ApolloniusGraphTraits_2.h | 4 +- .../Concepts/ApolloniusGraphVertexBase_2.h | 2 +- .../Concepts/ArrTraits--Approximate_2.h | 2 +- .../Concepts/ArrTraits--AreMergeable_2.h | 2 +- .../ArrTraits--CompareXNearBoundary_2.h | 2 +- ...rrTraits--CompareXOnBoundaryOfCurveEnd_2.h | 6 +- .../ArrTraits--CompareXOnBoundary_2.h | 6 +- .../Concepts/ArrTraits--CompareX_2.h | 2 +- .../Concepts/ArrTraits--CompareXy_2.h | 2 +- .../Concepts/ArrTraits--CompareYAtXLeft_2.h | 2 +- .../Concepts/ArrTraits--CompareYAtXRight_2.h | 2 +- .../Concepts/ArrTraits--CompareYAtX_2.h | 2 +- .../ArrTraits--CompareYNearBoundary_2.h | 2 +- .../ArrTraits--CompareYOnBoundary_2.h | 8 +-- .../Concepts/ArrTraits--ConstructCurve_2.h | 2 +- .../ArrTraits--ConstructMaxVertex_2.h | 2 +- .../ArrTraits--ConstructMinVertex_2.h | 2 +- .../ArrTraits--ConstructXMonotoneCurve_2.h | 2 +- .../Concepts/ArrTraits--Curve_2.h | 2 +- .../Concepts/ArrTraits--Equal_2.h | 2 +- .../Concepts/ArrTraits--Intersect_2.h | 2 +- .../ArrTraits--IsOnXIdentification_2.h | 2 +- .../ArrTraits--IsOnYIdentification_2.h | 2 +- .../Concepts/ArrTraits--IsVertical_2.h | 2 +- .../Concepts/ArrTraits--MakeXMonotone_2.h | 2 +- .../Concepts/ArrTraits--Merge_2.h | 2 +- .../Concepts/ArrTraits--ParameterSpaceInX_2.h | 6 +- .../Concepts/ArrTraits--ParameterSpaceInY_2.h | 6 +- .../Concepts/ArrTraits--Point_2.h | 2 +- .../Concepts/ArrTraits--Split_2.h | 2 +- .../Concepts/ArrTraits--XMonotoneCurve_2.h | 2 +- .../Concepts/ArrangementApproximateTraits_2.h | 16 ++--- .../Concepts/ArrangementBasicTopologyTraits.h | 2 +- .../Concepts/ArrangementBasicTraits_2.h | 30 +++++----- .../ArrangementConstructCurveTraits_2.h | 14 ++--- ...rangementConstructXMonotoneCurveTraits_2.h | 14 ++--- .../Concepts/ArrangementDcel.h | 8 +-- .../Concepts/ArrangementDcelWithRebind.h | 6 +- .../ArrangementHorizontalSideTraits_2.h | 8 +-- .../Concepts/ArrangementInputFormatter.h | 6 +- .../Concepts/ArrangementLandmarkTraits_2.h | 16 ++--- .../ArrangementOpenBoundaryTraits_2.h | 10 ++-- .../Concepts/ArrangementOutputFormatter.h | 6 +- .../Concepts/ArrangementPointLocation_2.h | 8 +-- .../ArrangementSphericalBoundaryTraits_2.h | 2 +- .../Concepts/ArrangementTopologyTraits.h | 6 +- .../Concepts/ArrangementTraits_2.h | 28 ++++----- .../Concepts/ArrangementVerticalRayShoot_2.h | 8 +-- .../ArrangementVerticalSideTraits_2.h | 8 +-- .../ArrangementWithHistoryInputFormatter.h | 2 +- .../ArrangementWithHistoryOutputFormatter.h | 2 +- .../Concepts/ArrangementXMonotoneTraits_2.h | 28 ++++----- .../Concepts/OverlayTraits.h | 4 +- .../Concepts/BarycentricCoordinates_2.h | 6 +- .../Concepts/DiscretizedDomain_2.h | 2 +- .../ArrDirectionalTraits--AreMergeable_2.h | 2 +- ...rDirectionalTraits--CompareEndpointsXy_2.h | 2 +- ...rrDirectionalTraits--ConstructOpposite_2.h | 2 +- .../ArrDirectionalTraits--Intersect_2.h | 2 +- .../Concepts/ArrDirectionalTraits--Merge_2.h | 2 +- .../Concepts/ArrDirectionalTraits--Split_2.h | 2 +- .../ArrangementDirectionalXMonotoneTraits_2.h | 14 ++--- .../Concepts/GeneralPolygonSetDcel.h | 2 +- .../Concepts/GeneralPolygonSetDcelFace.h | 2 +- .../Concepts/GeneralPolygonSetDcelHalfedge.h | 2 +- .../Concepts/GeneralPolygonSetTraits_2.h | 6 +- .../Concepts/GeneralPolygon_2.h | 2 +- .../GpsTraitsGeneralPolygonWithHoles_2.h | 2 +- .../Concepts/GpsTraitsGeneralPolygon_2.h | 4 +- .../ApproximateMinEllipsoid_d_Traits_d.h | 6 +- .../Concepts/MinCircle2Traits.h | 2 +- .../Concepts/MinEllipse2Traits.h | 2 +- .../Concepts/MinQuadrilateralTraits_2.h | 2 +- .../Concepts/MinSphereAnnulusDTraits.h | 6 +- .../Concepts/MinSphereOfSpheresTraits.h | 12 ++-- .../Concepts/RectangularPCenterTraits_2.h | 2 +- .../Concepts/BoxIntersectionBox_d.h | 4 +- .../Concepts/BoxIntersectionTraits_d.h | 2 +- ...rnelForCircles--PolynomialForCircles_2_2.h | 2 +- ...lgebraicKernelForCircles--Polynomial_1_2.h | 2 +- ...raicKernelForCircles--RootForCircles_2_2.h | 2 +- .../Concepts/AlgebraicKernelForCircles.h | 2 +- .../CircularKernel--CircularArcPoint_2.h | 2 +- .../Concepts/CircularKernel--CircularArc_2.h | 2 +- .../Concepts/CircularKernel--LineArc_2.h | 2 +- .../Concepts/CircularKernel.h | 4 +- ...rnelForSpheres--PolynomialForSpheres_2_3.h | 2 +- ...lgebraicKernelForSpheres--Polynomial_1_3.h | 2 +- ...cKernelForSpheres--PolynomialsForLines_3.h | 2 +- ...raicKernelForSpheres--RootForSpheres_2_3.h | 2 +- .../Concepts/AlgebraicKernelForSpheres.h | 2 +- .../SphericalKernel--CircularArcPoint_3.h | 2 +- .../Concepts/SphericalKernel--CircularArc_3.h | 2 +- .../Concepts/SphericalKernel--LineArc_3.h | 2 +- .../Concepts/SphericalKernel.h | 4 +- .../doc/Circulator/Concepts/ConstHandle.h | 2 +- Circulator/doc/Circulator/Concepts/Handle.h | 8 +-- .../doc/Classification/Concepts/Classifier.h | 6 +- .../Classification/Concepts/NeighborQuery.h | 8 +-- .../Concepts/ConvexHullTraits_2.h | 12 ++-- .../Concepts/ConvexHullTraits_3.h | 4 +- .../Concepts/ConvexHullTraits_d.h | 6 +- .../Concepts/DelaunayLiftedTraits_d.h | 4 +- .../Convex_hull_d/Concepts/DelaunayTraits_d.h | 4 +- .../Envelope_3/Concepts/EnvelopeTraits_3.h | 8 +-- .../doc/Generator/Concepts/PointGenerator.h | 28 ++++----- .../Concepts/RandomConvexSetTraits_2.h | 2 +- .../doc/HalfedgeDS/Concepts/HalfedgeDS.h | 6 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSFace.h | 4 +- .../HalfedgeDS/Concepts/HalfedgeDSHalfedge.h | 4 +- .../doc/HalfedgeDS/Concepts/HalfedgeDSItems.h | 6 +- .../HalfedgeDS/Concepts/HalfedgeDSVertex.h | 4 +- .../HyperbolicDelaunayTriangulationTraits_2.h | 4 +- .../HyperbolicTriangulationFaceBase_2.h | 2 +- .../Concepts/ExtremalPolygonTraits_2.h | 4 +- .../LargestEmptyIsoRectangleTraits_2.h | 4 +- .../Concepts/GradientFittingTraits.h | 2 +- .../Concepts/InterpolationTraits.h | 4 +- .../Interval_skip_list/Concepts/Interval.h | 4 +- .../doc/Jet_fitting_3/Concepts/DataKernel.h | 4 +- .../doc/Jet_fitting_3/Concepts/LocalKernel.h | 4 +- .../doc/Kernel_23/Concepts/GeomObjects.h | 60 +++++++++++-------- Kernel_23/doc/Kernel_23/Concepts/Kernel.h | 16 ++--- .../Kernel_d/Concepts/KernelWithLifting_d.h | 4 +- Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h | 8 +-- .../Kernel_d/Concepts/LinearAlgebraTraits_d.h | 4 +- .../Concepts/LinearCellComplexItems.h | 2 +- .../doc/Matrix_search/Concepts/BasicMatrix.h | 2 +- .../Concepts/MonotoneMatrixSearchTraits.h | 2 +- .../Concepts/SortedMatrixSearchTraits.h | 2 +- .../Mesh_2/Concepts/DelaunayMeshFaceBase_2.h | 2 +- .../Concepts/DelaunayMeshVertexBase_2.h | 2 +- .../doc/Mesh_2/Concepts/MeshingCriteria_2.h | 4 +- Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h | 4 +- .../doc/Mesh_3/Concepts/MeshCellCriteria_3.h | 2 +- .../Concepts/MeshCriteriaWithFeatures_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h | 2 +- .../doc/Mesh_3/Concepts/MeshDomainField_3.h | 2 +- .../Concepts/MeshDomainWithFeatures_3.h | 4 +- Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h | 4 +- .../doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h | 2 +- .../doc/Mesh_3/Concepts/MeshFacetCriteria_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h | 2 +- .../doc/Mesh_3/Concepts/TriangleAccessor_3.h | 2 +- .../Concepts/PolygonConvexDecomposition_2.h | 10 ++-- .../PolygonWithHolesConvexDecomposition_2.h | 4 +- .../Miscellany/Concepts/UniqueHashFunction.h | 2 +- .../Concepts/ModularTraits.h | 2 +- .../Concepts/Modularizable.h | 18 +++--- .../Nef_2/Concepts/ExtendedKernelTraits_2.h | 6 +- .../Concepts/OrientedBoundingBoxTraits.h | 2 +- .../doc/Orthtree/Concepts/OrthtreeTraits.h | 6 +- .../doc/Orthtree/Concepts/OrthtreeTraversal.h | 8 +-- .../Concepts/ConvexPartitionIsValidTraits_2.h | 2 +- .../Concepts/IsYMonotoneTraits_2.h | 4 +- .../Concepts/OptimalConvexPartitionTraits_2.h | 2 +- .../Concepts/PartitionIsValidTraits_2.h | 2 +- .../Partition_2/Concepts/PartitionTraits_2.h | 2 +- .../doc/Partition_2/Concepts/PolygonIsValid.h | 4 +- .../YMonotonePartitionIsValidTraits_2.h | 2 +- .../Periodic_2DelaunayTriangulationTraits_2.h | 2 +- .../Concepts/Periodic_2Offset_2.h | 2 +- .../Periodic_2TriangulationFaceBase_2.h | 2 +- .../Periodic_2TriangulationTraits_2.h | 2 +- .../Periodic_2TriangulationVertexBase_2.h | 2 +- .../Periodic_3MeshDomainWithFeatures_3.h | 2 +- .../Concepts/Periodic_3MeshDomain_3.h | 2 +- .../Periodic_3DelaunayTriangulationTraits_3.h | 2 +- .../Concepts/Periodic_3Offset_3.h | 2 +- ...riodic_3RegularTriangulationDSCellBase_3.h | 4 +- ...odic_3RegularTriangulationDSVertexBase_3.h | 2 +- .../Periodic_3RegularTriangulationTraits_3.h | 2 +- .../Periodic_3TriangulationDSCellBase_3.h | 2 +- .../Periodic_3TriangulationDSVertexBase_3.h | 2 +- .../Periodic_3TriangulationTraits_3.h | 2 +- ...4HyperbolicDelaunayTriangulationTraits_2.h | 2 +- ...iodic_4HyperbolicTriangulationFaceBase_2.h | 2 +- ...dic_4HyperbolicTriangulationVertexBase_2.h | 2 +- .../Concepts/GeneralPolygonWithHoles_2.h | 4 +- .../Concepts/PMPCorefinementVisitor.h | 2 +- .../Concepts/PMPHolefillingVisitor.h | 2 +- .../PMPPolygonSoupOrientationVisitor.h | 2 +- .../Concepts/PMPTriangulateFaceVisitor.h | 2 +- .../Polyhedron/Concepts/PolyhedronItems_3.h | 6 +- .../PolylineSimplificationCostFunction.h | 6 +- .../PolylineSimplificationStopPredicate.h | 6 +- .../PolylineSimplificationVertexBase_2.h | 2 +- .../Polynomial/Concepts/PolynomialTraits_d.h | 2 +- .../doc/Polynomial/Concepts/Polynomial_d.h | 2 +- .../Concepts/AllFurthestNeighborsTraits_2.h | 8 +-- .../Concepts/PolytopeDistanceDTraits.h | 6 +- .../Concepts/WidthTraits_3.h | 2 +- .../doc/QP_solver/Concepts/LinearProgram.h | 6 +- .../Concepts/NonnegativeLinearProgram.h | 12 ++-- .../Concepts/NonnegativeQuadraticProgram.h | 6 +- .../doc/QP_solver/Concepts/QuadraticProgram.h | 6 +- ...shComplexWithFeatures_3InTriangulation_3.h | 2 +- .../Concepts/MeshComplex_3InTriangulation_3.h | 2 +- .../Concepts/SimplicialMeshCellBase_3.h | 8 +-- .../Concepts/SimplicialMeshVertexBase_3.h | 6 +- .../doc/STL_Extension/Concepts/Descriptor.h | 4 +- .../doc/STL_Extension/Concepts/Index.h | 4 +- .../STL_Extension/Concepts/ProjectionObject.h | 26 ++++---- .../Concepts/SurjectiveLockDataStructure.h | 2 +- .../Concepts/ScaleSpaceMesher.h | 4 +- .../Concepts/ScaleSpaceSmoother.h | 4 +- .../Concepts/RangeSegmentTreeTraits_k.h | 12 ++-- .../SegmentDelaunayGraphDataStructure_2.h | 2 +- .../Concepts/SegmentDelaunayGraphFaceBase_2.h | 2 +- ...egmentDelaunayGraphHierarchyVertexBase_2.h | 2 +- .../Concepts/SegmentDelaunayGraphSite_2.h | 2 +- .../SegmentDelaunayGraphStorageSite_2.h | 2 +- .../SegmentDelaunayGraphStorageTraits_2.h | 2 +- .../Concepts/SegmentDelaunayGraphTraits_2.h | 8 +-- .../SegmentDelaunayGraphVertexBase_2.h | 2 +- .../SegmentDelaunayGraphLinfTraits_2.h | 8 +-- .../Concepts/EfficientRANSACTraits.h | 2 +- .../Shape_detection/Concepts/NeighborQuery.h | 8 +-- .../doc/Shape_detection/Concepts/RegionType.h | 14 ++--- .../Concepts/ContourDirections.h | 6 +- .../Concepts/NeighborQuery.h | 2 +- .../Concepts/RegularizationType.h | 4 +- .../Concepts/SkinSurfaceTraits_3.h | 2 +- .../Skin_surface_3/Concepts/SkinSurface_3.h | 4 +- .../Concepts/SnapRoundingTraits_2.h | 2 +- .../Concepts/DiagonalizeTraits.h | 2 +- .../Concepts/MixedIntegerProgramTraits.h | 12 ++-- ...ormalEquationSparseLinearAlgebraTraits_d.h | 2 +- .../Concepts/QuadraticProgramTraits.h | 2 +- .../Concepts/SparseLinearAlgebraTraits_d.h | 8 +-- .../SparseLinearAlgebraWithFactorTraits_d.h | 2 +- .../doc/Solver_interface/Concepts/SvdTraits.h | 6 +- .../Concepts/GeneralDistance.h | 4 +- .../Concepts/OrthogonalDistance.h | 4 +- .../Concepts/RangeSearchTraits.h | 12 ++-- .../Spatial_searching/Concepts/SearchTraits.h | 16 ++--- .../Concepts/SpatialSeparator.h | 2 +- .../Spatial_searching/Concepts/SpatialTree.h | 2 +- .../doc/Spatial_searching/Concepts/Splitter.h | 14 ++--- .../Concepts/PolygonOffsetBuilderTraits_2.h | 2 +- .../StraightSkeletonBuilderTraits_2.h | 2 +- .../StraightSkeletonBuilder_2_Visitor.h | 2 +- .../Concepts/StraightSkeletonFace_2.h | 2 +- .../Concepts/StraightSkeletonHalfedge_2.h | 2 +- .../StraightSkeletonItemsConverter_2.h | 2 +- .../Concepts/StraightSkeletonVertex_2.h | 2 +- .../Concepts/StraightSkeleton_2.h | 2 +- .../Stream_lines_2/Concepts/Integrator_2.h | 4 +- .../Stream_lines_2/Concepts/VectorField_2.h | 4 +- .../Subdivision_method_3/Concepts/DQQMask_3.h | 2 +- .../Subdivision_method_3/Concepts/PQQMask_3.h | 2 +- .../Subdivision_method_3/Concepts/PTQMask_3.h | 2 +- .../Concepts/Sqrt3Mask_3.h | 2 +- .../Concepts/ErrorMetricProxy.h | 4 +- .../DeformationClosestRotationTraits_3.h | 4 +- .../Concepts/Parameterizer_3.h | 20 +++---- .../Concepts/SurfaceMeshShortestPathTraits.h | 2 +- .../Concepts/GetCost.h | 6 +- .../Concepts/GetPlacement.h | 10 ++-- .../Concepts/PlacementFilter.h | 4 +- .../Concepts/StopPredicate.h | 10 ++-- .../Concepts/SurfaceMeshCellBase_3.h | 4 +- .../SurfaceMeshComplex_2InTriangulation_3.h | 2 +- .../Concepts/SurfaceMeshFacetsCriteria_3.h | 2 +- .../Concepts/SurfaceMeshTraits_3.h | 2 +- .../Concepts/SurfaceMeshVertexBase_3.h | 4 +- .../doc/Surface_mesher/Concepts/Surface_3.h | 2 +- .../Concepts/TriangulationDSFaceBase_2.h | 2 +- .../Concepts/TriangulationDSVertexBase_2.h | 2 +- .../Concepts/TriangulationDataStructure_2.h | 6 +- .../Concepts/TriangulationDSCellBase_3.h | 2 +- .../Concepts/TriangulationDSVertexBase_3.h | 2 +- .../Concepts/TriangulationDataStructure_3.h | 2 +- .../Concepts/RemeshingCellBase_3.h | 2 +- .../Concepts/RemeshingVertexBase_3.h | 2 +- .../Concepts/DelaunayTriangulationTraits.h | 4 +- .../Concepts/RegularTriangulationTraits.h | 4 +- .../Concepts/TriangulationDSFace.h | 2 +- .../Concepts/TriangulationDSFullCell.h | 4 +- .../Concepts/TriangulationDSVertex.h | 4 +- .../Concepts/TriangulationDataStructure.h | 10 ++-- .../Concepts/TriangulationFullCell.h | 2 +- .../Concepts/TriangulationTraits.h | 4 +- .../Concepts/TriangulationVertex.h | 2 +- .../ConstrainedTriangulationFaceBase_2.h | 2 +- .../Concepts/RegularTriangulationFaceBase_2.h | 2 +- .../RegularTriangulationVertexBase_2.h | 2 +- .../Concepts/TriangulationFaceBase_2.h | 2 +- .../TriangulationHierarchyVertexBase_2.h | 2 +- .../TriangulationVertexBaseWithInfo_2.h | 2 +- .../Concepts/TriangulationVertexBase_2.h | 2 +- .../DelaunayTriangulationCellBase_3.h | 4 +- .../Concepts/DelaunayTriangulationTraits_3.h | 14 ++--- ...lationCellBaseWithWeightedCircumcenter_3.h | 2 +- .../Concepts/RegularTriangulationCellBase_3.h | 2 +- .../RegularTriangulationVertexBase_3.h | 2 +- .../TriangulationCellBaseWithInfo_3.h | 2 +- .../Concepts/TriangulationCellBase_3.h | 4 +- .../TriangulationVertexBaseWithInfo_3.h | 2 +- .../Concepts/TriangulationVertexBase_3.h | 4 +- .../DelaunayTriangulationOnSphereTraits_2.h | 4 +- .../TriangulationOnSphereFaceBase_2.h | 2 +- .../Concepts/TriangulationOnSphereTraits_2.h | 4 +- .../TriangulationOnSphereVertexBase_2.h | 2 +- .../doc/Visibility_2/Concepts/Visibility_2.h | 6 +- .../Concepts/AdaptationPolicy_2.h | 18 +++--- .../Concepts/AdaptationTraits_2.h | 8 +-- .../Weights/Concepts/BarycentricWeights_2.h | 6 +- 322 files changed, 754 insertions(+), 744 deletions(-) diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h index cee0dc902966..3abb0cf153bd 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitive.h @@ -13,11 +13,11 @@ The concept `AABBPrimitive` describes the requirements for the primitives stored The `Primitive` type can be, e.g., a wrapper around a `Handle`. Assume for instance that the input objects are the triangle faces of a mesh stored as a `CGAL::Polyhedron_3`. The `Datum` would be a `Triangle_3` and the `Id` would be a polyhedron `Face_handle`. Method `datum()` can return either a `Triangle_3` constructed on the fly from the face handle or a `Triangle_3` stored internally. This provides a way for the user to trade memory for efficiency. \cgalHasModelsBegin -\cgalModels{CGAL::AABB_primitive} -\cgalModels{CGAL::AABB_segment_primitive} -\cgalModels{CGAL::AABB_triangle_primitive} -\cgalModels{CGAL::AABB_halfedge_graph_segment_primitive} -\cgalModels{CGAL::AABB_face_graph_triangle_primitive} +\cgalHasModels{CGAL::AABB_primitive} +\cgalHasModels{CGAL::AABB_segment_primitive} +\cgalHasModels{CGAL::AABB_triangle_primitive} +\cgalHasModels{CGAL::AABB_halfedge_graph_segment_primitive} +\cgalHasModels{CGAL::AABB_face_graph_triangle_primitive} \cgalHasModelsEnd */ diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h index 27f6805cbca1..416cc785468d 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBPrimitiveWithSharedData.h @@ -22,9 +22,9 @@ The `Datum` would be a `Triangle_3` and the `Id` a `std::size_t`. The shared dat The method `datum(const Shared_data&)` then returns a triangle from the vector. \cgalHasModelsBegin -\cgalModels{CGAL::AABB_primitive} -\cgalModels{CGAL::AABB_halfedge_graph_segment_primitive} -\cgalModels{CGAL::AABB_face_graph_triangle_primitive} +\cgalHasModels{CGAL::AABB_primitive} +\cgalHasModels{CGAL::AABB_halfedge_graph_segment_primitive} +\cgalHasModels{CGAL::AABB_face_graph_triangle_primitive} \cgalHasModelsEnd */ diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h index 1df2c9802b25..a372fc665242 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h @@ -8,7 +8,7 @@ The concept `AABBRayIntersectionTraits` is a refinement of the concept distance of an intersection along a ray. \cgalHasModelsBegin -\cgalModels{CGAL::AABB_traits} +\cgalHasModels{CGAL::AABB_traits} \cgalHasModelsEnd \sa `CGAL::AABB_tree` diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h index 5dfba2998c86..3b02a0044399 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h @@ -6,7 +6,7 @@ The concept `AABBTraits` provides the geometric primitive types and methods for the class `CGAL::AABB_tree`. \cgalHasModelsBegin -\cgalModels{CGAL::AABB_traits} +\cgalHasModels{CGAL::AABB_traits} \cgalHasModelsEnd \cgalRefines{SearchGeomTraits_3} diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h index d21861c1c288..13c87daede54 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/AlgebraicStructureTraits.h @@ -29,7 +29,7 @@ algebraic operations within that structure. \sa `CGAL::Field_with_root_of_tag` \cgalHasModelsBegin -\cgalModels{CGAL::Algebraic_structure_traits} +\cgalHasModels{CGAL::Algebraic_structure_traits} \cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h index 5cd89e524e60..eeb128e81b6f 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h @@ -10,16 +10,16 @@ for Cartesian kernels. \cgalRefines{Field,RealEmbeddable} \cgalHasModelsBegin -\cgalModels{float} -\cgalModels{double} -\cgalModels{CGAL::Gmpq} -\cgalModels{CGAL::Interval_nt} -\cgalModels{CGAL::Interval_nt_advanced} -\cgalModels{CGAL::Lazy_exact_nt} -\cgalModels{CGAL::Quotient} -\cgalModels{leda_rational} -\cgalModels{leda_bigfloat} -\cgalModels{leda_real} +\cgalHasModels{float} +\cgalHasModels{double} +\cgalHasModels{CGAL::Gmpq} +\cgalHasModels{CGAL::Interval_nt} +\cgalHasModels{CGAL::Interval_nt_advanced} +\cgalHasModels{CGAL::Lazy_exact_nt} +\cgalHasModels{CGAL::Quotient} +\cgalHasModels{leda_rational} +\cgalHasModels{leda_bigfloat} +\cgalHasModels{leda_real} \cgalHasModelsEnd \sa `RingNumberType` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h index f1248606d90c..d4f0b88f9164 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FractionTraits.h @@ -9,7 +9,7 @@ In case the associated type is a `Fraction`, a model of `FractionTraits` provide as the numerator and denominator type. \cgalHasModelsBegin -\cgalModels{CGAL::Fraction_traits} +\cgalHasModels{CGAL::Fraction_traits} \cgalHasModelsEnd \sa `FractionTraits_::Decompose` diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h index f31912ba5d85..779b96188a71 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FromIntConstructible.h @@ -7,9 +7,9 @@ A model of the concept `FromIntConstructible` is required to be constructible from int. \cgalHasModelsBegin -\cgalModels{int} -\cgalModels{long} -\cgalModels{double} +\cgalHasModels{int} +\cgalHasModels{long} +\cgalHasModels{double} \cgalHasModelsEnd */ diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h index 312eff6326f8..4a40e131286e 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RealEmbeddableTraits.h @@ -8,7 +8,7 @@ A model of `RealEmbeddableTraits` is associated to a number type to the concept `RealEmbeddable`. \cgalHasModelsBegin -\cgalModels{CGAL::Real_embeddable_traits} +\cgalHasModels{CGAL::Real_embeddable_traits} \cgalHasModelsEnd */ diff --git a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h index 4bc59c9e3886..b895e7665b9f 100644 --- a/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h +++ b/Algebraic_kernel_d/doc/Algebraic_kernel_d/Concepts/AlgebraicKernel_d_1.h @@ -9,8 +9,8 @@ algebraic functionalities on univariate polynomials of general degree \f$ d\f$. \cgalRefines{CopyConstructible,Assignable} \cgalHasModelsBegin -\cgalModels{CGAL::Algebraic_kernel_rs_gmpz_d_1} -\cgalModels{CGAL::Algebraic_kernel_rs_gmpq_d_1} +\cgalHasModels{CGAL::Algebraic_kernel_rs_gmpz_d_1} +\cgalHasModels{CGAL::Algebraic_kernel_rs_gmpq_d_1} \cgalHasModelsEnd \sa `AlgebraicKernel_d_2` diff --git a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h index 498eaed26d73..a3bcacd1fc23 100644 --- a/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h +++ b/Alpha_shapes_2/doc/Alpha_shapes_2/Concepts/AlphaShapeFace_2.h @@ -10,7 +10,7 @@ The concept `AlphaShapeFace_2` describes the requirements for the base face of a Periodic_2TriangulationFaceBase_2 if the underlying triangulation of the alpha shape is a periodic triangulation} \cgalHasModelsBegin -\cgalModels{CGAL::Alpha_shape_face_base_2 (templated with the appropriate triangulation face base class)} +\cgalHasModels{CGAL::Alpha_shape_face_base_2 (templated with the appropriate triangulation face base class)} \cgalHasModelsEnd */ diff --git a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h index bf8076c97946..49244706c9b1 100644 --- a/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h +++ b/Alpha_wrap_3/doc/Alpha_wrap_3/Concepts/AlphaWrapOracle.h @@ -10,10 +10,10 @@ that answers a number of queries over the input of the algorithm. The oracle is the template parameter of the class `CGAL::Alpha_wraps_3_::Alpha_wrap_3`. \cgalHasModelsBegin -\cgalModels{CGAL::Alpha_wraps_3_::Point_set_oracle} -\cgalModels{CGAL::Alpha_wraps_3_::Segment_soup_oracle} -\cgalModels{CGAL::Alpha_wraps_3_::Triangle_mesh_oracle} -\cgalModels{CGAL::Alpha_wraps_3_::Triangle_soup_oracle} +\cgalHasModels{CGAL::Alpha_wraps_3_::Point_set_oracle} +\cgalHasModels{CGAL::Alpha_wraps_3_::Segment_soup_oracle} +\cgalHasModels{CGAL::Alpha_wraps_3_::Triangle_mesh_oracle} +\cgalHasModels{CGAL::Alpha_wraps_3_::Triangle_soup_oracle} \cgalHasModelsEnd */ diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h index 78e8ce69c6ad..914bf0feedf1 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphDataStructure_2.h @@ -28,7 +28,7 @@ We only describe the additional requirements with respect to the \cgalRefines{TriangulationDataStructure_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_data_structure_2} +\cgalHasModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h index 354d27f68bfe..76d3320b2ddf 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphHierarchyVertexBase_2.h @@ -20,7 +20,7 @@ next and previous level graphs. types in addition to those of `ApolloniusGraphVertexBase_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Apollonius_graph_hierarchy_vertex_base_2 >} +\cgalHasModels{CGAL::Apollonius_graph_hierarchy_vertex_base_2 >} \cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h index d62bc56484e5..f14497d3ec6a 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphTraits_2.h @@ -13,8 +13,8 @@ constructions for sites and several function object types for the predicates. \cgalHasModelsBegin -\cgalModels{CGAL::Apollonius_graph_traits_2} -\cgalModels{CGAL::Apollonius_graph_filtered_traits_2} +\cgalHasModels{CGAL::Apollonius_graph_traits_2} +\cgalHasModels{CGAL::Apollonius_graph_filtered_traits_2} \cgalHasModelsEnd \sa `CGAL::Apollonius_graph_2` diff --git a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h index 45e4bd357458..f6246b211121 100644 --- a/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h +++ b/Apollonius_graph_2/doc/Apollonius_graph_2/Concepts/ApolloniusGraphVertexBase_2.h @@ -13,7 +13,7 @@ sites. The container stores the hidden sites related to the vertex. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Apollonius_graph_vertex_base_2} +\cgalHasModels{CGAL::Apollonius_graph_vertex_base_2} \cgalHasModelsEnd \sa `ApolloniusGraphDataStructure_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h index 8b105f4dab97..3a43a08c1a2a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Approximate_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementApproximateTraits_2::Approximate_2} + * \cgalHasModels{ArrangementApproximateTraits_2::Approximate_2} * \cgalHasModelsEnd */ class Approximate_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h index a5c401dc85fe..8c9f51309ab7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--AreMergeable_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementXMonotoneTraits_2::Are_mergeable_2} + * \cgalHasModels{ArrangementXMonotoneTraits_2::Are_mergeable_2} * \cgalHasModelsEnd */ class AreMergeable_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h index 0d85b1f0ae7d..ad6f44f179a1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXNearBoundary_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableTernaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_} + * \cgalHasModels{ArrangementOpenBoundaryTraits_2::Compare_x_near_boundary_} * \cgalHasModelsEnd */ class CompareXNearBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h index 8fccd1309061..28208660fece 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h @@ -6,9 +6,9 @@ namespace ArrTraits { * \cgalRefines{AdaptableFunctor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2} - * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2} - * \cgalModels{ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2} * \cgalHasModelsEnd */ class CompareXOnBoundaryOfCurveEnd_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h index 77eea00561d8..af30ebbfb93e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h @@ -6,9 +6,9 @@ namespace ArrTraits { * \cgalRefines{AdaptableFunctor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2} - * \cgalModels{ArrangementClosedTopTraits_2::Compare_x_on_boundary_2} - * \cgalModels{ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementClosedTopTraits_2::Compare_x_on_boundary_2} + * \cgalHasModels{ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2} * \cgalHasModelsEnd */ class CompareXOnBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h index 9e9e4fe45cde..466869d5a015 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareX_2.h @@ -5,7 +5,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Compare_x_2} + * \cgalHasModels{ArrangementBasicTraits_2::Compare_x_2} * \cgalHasModelsEnd */ class CompareX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h index 7e423c1d5cdc..db282c6d238d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXy_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Compare_xy_2} + * \cgalHasModels{ArrangementBasicTraits_2::Compare_xy_2} * \cgalHasModelsEnd */ class CompareXy_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h index 871add8868c7..f49c04d0ec1c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXLeft_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableTernaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_left_2} + * \cgalHasModels{ArrangementBasicTraits_2::Compare_y_at_x_left_2} * \cgalHasModelsEnd */ class CompareYAtXLeft_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h index 4959f78d530f..62fe93cdc3a8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtXRight_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableTernaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_right_2} + * \cgalHasModels{ArrangementBasicTraits_2::Compare_y_at_x_right_2} * \cgalHasModelsEnd */ class CompareYAtXRight_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h index 55ae2fc00faf..bc8d1d815730 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYAtX_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Compare_y_at_x_2} + * \cgalHasModels{ArrangementBasicTraits_2::Compare_y_at_x_2} * \cgalHasModelsEnd */ class CompareYAtX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h index e2ab7e9cae92..cb11491e3164 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYNearBoundary_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableTernaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2} + * \cgalHasModels{ArrangementOpenBoundaryTraits_2::Compare_y_near_boundary_2} * \cgalHasModelsEnd */ class CompareYNearBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h index 38a9090fd535..206458c178b8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h @@ -6,10 +6,10 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2} - * \cgalModels{ArrangementClosedRightTraits_2::Compare_y_on_boundary_2} - * \cgalModels{ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2} - * \cgalModels{ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2} + * \cgalHasModels{ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2} + * \cgalHasModels{ArrangementClosedRightTraits_2::Compare_y_on_boundary_2} + * \cgalHasModels{ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2} + * \cgalHasModels{ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2} * \cgalHasModelsEnd */ class CompareYOnBoundary_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h index 75306891423f..12a1109a33b3 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructCurve_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementConstructCurveTraits_2::Construct_curve_2} + * \cgalHasModels{ArrangementConstructCurveTraits_2::Construct_curve_2} * \cgalHasModelsEnd */ class ConstructCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h index 85b5f9a7fe29..85d379693bfd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMaxVertex_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableUnaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Construct_max_vertex_2} + * \cgalHasModels{ArrangementBasicTraits_2::Construct_max_vertex_2} * \cgalHasModelsEnd */ class ConstructMaxVertex_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h index a434876ac15f..f9f8f3b99acf 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructMinVertex_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableUnaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Construct_min_vertex_2} + * \cgalHasModels{ArrangementBasicTraits_2::Construct_min_vertex_2} * \cgalHasModelsEnd */ class ConstructMinVertex_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h index 73a5a007b91a..39c1e7b42e59 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ConstructXMonotoneCurve_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2} + * \cgalHasModels{ArrangementConstructXMonotoneCurveTraits_2::Construct_x_monotone_curve_2} * \cgalHasModelsEnd */ class ConstructXMonotoneCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h index 6ecf52458326..5268f4895192 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Curve_2.h @@ -7,7 +7,7 @@ namespace ArrTraits { * * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * \cgalHasModelsBegin - * \cgalModels{ArrangementTraits_2::Curve_2} + * \cgalHasModels{ArrangementTraits_2::Curve_2} * \cgalHasModelsEnd */ class Curve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h index ca9e3d1a098a..ed6d47ed5928 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Equal_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Equal_2} + * \cgalHasModels{ArrangementBasicTraits_2::Equal_2} * \cgalHasModelsEnd */ class Equal_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h index df17bc89d084..feda290b2eb7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementXMonotoneTraits_2::Intersect_2} + * \cgalHasModels{ArrangementXMonotoneTraits_2::Intersect_2} * \cgalHasModelsEnd */ class Intersect_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h index 6ead4d30e3fb..351ae4153523 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnXIdentification_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableUnaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2} + * \cgalHasModels{ArrangementIdentifiedHorizontalTraits_2::Is_on_x_identification_2} * \cgalHasModelsEnd */ class IsOnXIdentification_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h index 9da39191b062..5ca8c772233b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsOnYIdentification_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableUnaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2} + * \cgalHasModels{ArrangementIdentifiedVerticalTraits_2::Is_on_y_identification_2} * \cgalHasModelsEnd */ class IsOnYIdentification_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h index 1df66d52a0b3..e6894c911cf9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--IsVertical_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{AdaptableUnaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Is_vertical_2} + * \cgalHasModels{ArrangementBasicTraits_2::Is_vertical_2} * \cgalHasModelsEnd */ class IsVertical_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h index 2731e990a2fa..f88d42001407 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementTraits_2::Make_x_monotone_2} + * \cgalHasModels{ArrangementTraits_2::Make_x_monotone_2} * \cgalHasModelsEnd */ class MakeXMonotone_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h index b2ec195a1484..0ff9c3ff3924 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Merge_2.h @@ -6,7 +6,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementXMonotoneTraits_2::Merge_2} + * \cgalHasModels{ArrangementXMonotoneTraits_2::Merge_2} * \cgalHasModelsEnd */ class Merge_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h index 1973f4a5371f..3f0c55da1951 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInX_2.h @@ -6,9 +6,9 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementVerticalSideTraits_2::Parameter_space_in_x_2} - * \cgalModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2} - * \cgalModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2} + * \cgalHasModels{ArrangementVerticalSideTraits_2::Parameter_space_in_x_2} + * \cgalHasModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_x_2} + * \cgalHasModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_x_2} * \cgalHasModelsEnd */ class ParameterSpaceInX_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h index 19dae4f4cde1..c598003b214c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--ParameterSpaceInY_2.h @@ -6,9 +6,9 @@ namespace ArrTraits { * \cgalRefines{AdaptableBinaryFunction} * * \cgalHasModelsBegin - * \cgalModels{ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2} - * \cgalModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2} - * \cgalModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2} + * \cgalHasModels{ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2} + * \cgalHasModels{ArrangementOpenBoundaryTraits_2::Parameter_space_in_y_2} + * \cgalHasModels{ArrangementSphericalBoundaryTraits_2::Parameter_space_in_y_2} * \cgalHasModelsEnd */ class ParameterSpaceInY_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h index cc53c3b9467d..337ccf35ae5c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Point_2.h @@ -8,7 +8,7 @@ namespace ArrTraits { * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::Point_2} + * \cgalHasModels{ArrangementBasicTraits_2::Point_2} * \cgalHasModelsEnd */ class Point_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h index 71519a41aea9..68a833aa5496 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Split_2.h @@ -5,7 +5,7 @@ namespace ArrTraits { * \cgalRefines{Functor} * * \cgalHasModelsBegin - * \cgalModels{ArrangementXMonotoneTraits_2::Split_2} + * \cgalHasModels{ArrangementXMonotoneTraits_2::Split_2} * \cgalHasModelsEnd */ class Split_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h index cf004f92dd04..3b61bb2dca42 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--XMonotoneCurve_2.h @@ -7,7 +7,7 @@ namespace ArrTraits { * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * * \cgalHasModelsBegin - * \cgalModels{ArrangementBasicTraits_2::X_monotone_curve_2} + * \cgalHasModels{ArrangementBasicTraits_2::X_monotone_curve_2} * \cgalHasModelsEnd */ class XMonotoneCurve_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h index a6940b050c1a..7dfd9a01f6b1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementApproximateTraits_2.h @@ -9,14 +9,14 @@ point. \cgalRefines{ArrangementBasicTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_conic_traits_2} -\cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} -\cgalModels{CGAL::Arr_linear_traits_2} -\cgalModels{CGAL::Arr_non_caching_segment_traits_2} -\cgalModels{CGAL::Arr_segment_traits_2} -\cgalModels{CGAL::Arr_polycurve_traits_2} -\cgalModels{CGAL::Arr_polyline_traits_2} -\cgalModels{CGAL::Arr_rational_function_traits_2} +\cgalHasModels{CGAL::Arr_conic_traits_2} +\cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} +\cgalHasModels{CGAL::Arr_linear_traits_2} +\cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalHasModels{CGAL::Arr_segment_traits_2} +\cgalHasModels{CGAL::Arr_polycurve_traits_2} +\cgalHasModels{CGAL::Arr_polyline_traits_2} +\cgalHasModels{CGAL::Arr_rational_function_traits_2} \cgalHasModelsEnd \sa `ArrangementConstructXMonotoneCurveTraits_2`, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h index 6edbb7820d6d..e30fada356a9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTopologyTraits.h @@ -10,7 +10,7 @@ * incident relations between them. * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_spherical_topology_traits_2} + * \cgalHasModels{CGAL::Arr_spherical_topology_traits_2} * \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h index 530aac71c9c5..3771c0af1e06 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementBasicTraits_2.h @@ -28,21 +28,21 @@ * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_segment_traits_2} - * \cgalModels{CGAL::Arr_non_caching_segment_basic_traits_2} - * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_polyline_traits_2} - * \cgalModels{CGAL::Arr_circle_segment_traits_2} - * \cgalModels{CGAL::Arr_line_arc_traits_2} - * \cgalModels{CGAL::Arr_circular_arc_traits_2} - * \cgalModels{CGAL::Arr_circular_line_arc_traits_2} - * \cgalModels{CGAL::Arr_conic_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} - * \cgalModels{CGAL::Arr_Bezier_curve_traits_2} - * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} - * \cgalModels{CGAL::Arr_curve_data_traits_2} - * \cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} + * \cgalHasModels{CGAL::Arr_segment_traits_2} + * \cgalHasModels{CGAL::Arr_non_caching_segment_basic_traits_2} + * \cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_polyline_traits_2} + * \cgalHasModels{CGAL::Arr_circle_segment_traits_2} + * \cgalHasModels{CGAL::Arr_line_arc_traits_2} + * \cgalHasModels{CGAL::Arr_circular_arc_traits_2} + * \cgalHasModels{CGAL::Arr_circular_line_arc_traits_2} + * \cgalHasModels{CGAL::Arr_conic_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_Bezier_curve_traits_2} + * \cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalHasModels{CGAL::Arr_curve_data_traits_2} + * \cgalHasModels{CGAL::Arr_consolidated_curve_data_traits_2} * \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h index c0f8193d057a..570967c29328 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructCurveTraits_2.h @@ -8,13 +8,13 @@ * \cgalRefines{ArrangementTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_conic_traits_2} - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} - * \cgalModels{CGAL::Arr_segment_traits_2} - * \cgalModels{CGAL::Arr_polyline_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_conic_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalHasModels{CGAL::Arr_segment_traits_2} + * \cgalHasModels{CGAL::Arr_polyline_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementConstructXMonotoneCurveTraits_2`, and diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h index 7bfebe4906f7..6d0a822280e6 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementConstructXMonotoneCurveTraits_2.h @@ -8,13 +8,13 @@ * \cgalRefines{ArrangementBasicTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_conic_traits_2} - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} - * \cgalModels{CGAL::Arr_segment_traits_2} - * \cgalModels{CGAL::Arr_polyline_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_conic_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalHasModels{CGAL::Arr_segment_traits_2} + * \cgalHasModels{CGAL::Arr_polyline_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementApproximateTraits_2`, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h index b750989c9ffe..b0cb67e12e9d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcel.h @@ -15,10 +15,10 @@ * `ArrangementDcelInnerCcb`, and `ArrangementDcelIsolatedVertex` respectively.) * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_dcel_base} - * \cgalModels{CGAL::Arr_default_dcel} - * \cgalModels{CGAL::Arr_face_extended_dcel} - * \cgalModels{CGAL::Arr_extended_dcel} + * \cgalHasModels{CGAL::Arr_dcel_base} + * \cgalHasModels{CGAL::Arr_default_dcel} + * \cgalHasModels{CGAL::Arr_face_extended_dcel} + * \cgalHasModels{CGAL::Arr_extended_dcel} * \cgalHasModelsEnd * * \sa `ArrangementDcelVertex` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h index c3d607c6e98e..f263a1aae0d6 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementDcelWithRebind.h @@ -11,9 +11,9 @@ Instantiate a dcel class with many different possible types without ad-hoc limit \cgalRefines{ArrangementDcel} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_default_dcel} -\cgalModels{CGAL::Arr_face_extended_dcel} -\cgalModels{CGAL::Arr_extended_dcel} +\cgalHasModels{CGAL::Arr_default_dcel} +\cgalHasModels{CGAL::Arr_face_extended_dcel} +\cgalHasModels{CGAL::Arr_extended_dcel} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h index 8dfbfb227075..e28c300acea1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h @@ -12,10 +12,10 @@ * \cgalRefines{ArrangementBasicTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} - * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h index 07c14685f6e9..286b02727add 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementInputFormatter.h @@ -6,9 +6,9 @@ * specific format. * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_text_formatter} - * \cgalModels{CGAL::Arr_face_extended_text_formatter} - * \cgalModels{CGAL::Arr_extended_dcel_text_formatter} + * \cgalHasModels{CGAL::Arr_text_formatter} + * \cgalHasModels{CGAL::Arr_face_extended_text_formatter} + * \cgalHasModels{CGAL::Arr_extended_dcel_text_formatter} * \cgalHasModelsEnd * */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h index 79624fa82380..75c1a6bd2410 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementLandmarkTraits_2.h @@ -12,14 +12,14 @@ * \cgalRefines{ArrangementApproximateTraits_2,ArrangementConstructXMonotoneCurveTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_conic_traits_2} - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_non_caching_segment_traits_2} - * \cgalModels{CGAL::Arr_segment_traits_2} - * \cgalModels{CGAL::Arr_polycurve_traits_2} - * \cgalModels{CGAL::Arr_polyline_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_conic_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} + * \cgalHasModels{CGAL::Arr_segment_traits_2} + * \cgalHasModels{CGAL::Arr_polycurve_traits_2} + * \cgalHasModels{CGAL::Arr_polyline_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementXMonotoneTraits_2` and diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h index 3bf6b089be6f..7cce69c075dd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h @@ -40,11 +40,11 @@ * \cgalRefines{ArrangementBasicTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} - * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} - * \cgalModels{CGAL::Arr_curve_data_traits_2} - * \cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalHasModels{CGAL::Arr_curve_data_traits_2} + * \cgalHasModels{CGAL::Arr_consolidated_curve_data_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h index eb6c67a142b5..bb1846ad8f58 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOutputFormatter.h @@ -7,9 +7,9 @@ A model for the `ArrangementOutputFormatter` concept supports a set of functions writing an arrangement to an output stream using a specific format. \cgalHasModelsBegin -\cgalModels{CGAL::Arr_text_formatter} -\cgalModels{CGAL::Arr_face_extended_text_formatter} -\cgalModels{CGAL::Arr_extended_dcel_text_formatter} +\cgalHasModels{CGAL::Arr_text_formatter} +\cgalHasModels{CGAL::Arr_face_extended_text_formatter} +\cgalHasModels{CGAL::Arr_extended_dcel_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h index 782af5d25cd5..4217e268e82c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementPointLocation_2.h @@ -21,10 +21,10 @@ the old style without any overhead, the macro \cgal header is included. \cgalHasModelsBegin -\cgalModels{CGAL::Arr_naive_point_location} -\cgalModels{CGAL::Arr_walk_along_line_point_location} -\cgalModels{CGAL::Arr_trapezoid_ric_point_location} -\cgalModels{CGAL::Arr_landmarks_point_location} +\cgalHasModels{CGAL::Arr_naive_point_location} +\cgalHasModels{CGAL::Arr_walk_along_line_point_location} +\cgalHasModels{CGAL::Arr_trapezoid_ric_point_location} +\cgalHasModels{CGAL::Arr_landmarks_point_location} \cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h index 2c2d0ad0208d..25fde7ef42db 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h @@ -12,7 +12,7 @@ * ArrangementContractedBottomTraits_2,ArrangementContractedTopTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementOpenBoundaryTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h index defff744a976..bf0c5121709c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTopologyTraits.h @@ -21,9 +21,9 @@ * At this point we do not expose all the requirements of this concept. * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_bounded_planar_topology_traits_2} - * \cgalModels{CGAL::Arr_unb_planar_topology_traits_2} - * \cgalModels{CGAL::Arr_spherical_topology_traits_2} + * \cgalHasModels{CGAL::Arr_bounded_planar_topology_traits_2} + * \cgalHasModels{CGAL::Arr_unb_planar_topology_traits_2} + * \cgalHasModels{CGAL::Arr_spherical_topology_traits_2} * \cgalHasModelsEnd * * \sa `Arrangement_on_surface_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h index 897ede7f25a3..e7f2288b560a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementTraits_2.h @@ -31,20 +31,20 @@ that accept such curves, such as `intsert()`. \cgalRefines{ArrangementXMonotoneTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_segment_traits_2} -\cgalModels{CGAL::Arr_non_caching_segment_traits_2} -\cgalModels{CGAL::Arr_linear_traits_2} -\cgalModels{CGAL::Arr_polyline_traits_2} -\cgalModels{CGAL::Arr_circle_segment_traits_2} -\cgalModels{CGAL::Arr_line_arc_traits_2} -\cgalModels{CGAL::Arr_circular_arc_traits_2} -\cgalModels{CGAL::Arr_circular_line_arc_traits_2} -\cgalModels{CGAL::Arr_conic_traits_2} -\cgalModels{CGAL::Arr_rational_function_traits_2} -\cgalModels{CGAL::Arr_Bezier_curve_traits_2} -\cgalModels{CGAL::Arr_algebraic_segment_traits_2} -\cgalModels{CGAL::Arr_curve_data_traits_2} -\cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} +\cgalHasModels{CGAL::Arr_segment_traits_2} +\cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalHasModels{CGAL::Arr_linear_traits_2} +\cgalHasModels{CGAL::Arr_polyline_traits_2} +\cgalHasModels{CGAL::Arr_circle_segment_traits_2} +\cgalHasModels{CGAL::Arr_line_arc_traits_2} +\cgalHasModels{CGAL::Arr_circular_arc_traits_2} +\cgalHasModels{CGAL::Arr_circular_line_arc_traits_2} +\cgalHasModels{CGAL::Arr_conic_traits_2} +\cgalHasModels{CGAL::Arr_rational_function_traits_2} +\cgalHasModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} +\cgalHasModels{CGAL::Arr_curve_data_traits_2} +\cgalHasModels{CGAL::Arr_consolidated_curve_data_traits_2} \cgalHasModelsEnd \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h index 0b7c89be1586..f82ff1097375 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalRayShoot_2.h @@ -29,10 +29,10 @@ is recommended. To enable the old style without any overhead, the macro \cgal header is included. \cgalHasModelsBegin -\cgalModels{CGAL::Arr_naive_point_location} -\cgalModels{CGAL::Arr_walk_along_line_point_location} -\cgalModels{CGAL::Arr_trapezoid_ric_point_location} -\cgalModels{CGAL::Arr_landmarks_point_location} +\cgalHasModels{CGAL::Arr_naive_point_location} +\cgalHasModels{CGAL::Arr_walk_along_line_point_location} +\cgalHasModels{CGAL::Arr_trapezoid_ric_point_location} +\cgalHasModels{CGAL::Arr_landmarks_point_location} \cgalHasModelsEnd \sa `CGAL::Arr_naive_point_location` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h index 2b9d1c9f6c16..88802d7ad610 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementVerticalSideTraits_2.h @@ -12,10 +12,10 @@ * \cgalRefines{ArrangementBasicTraits_2} * * \cgalHasModelsBegin - * \cgalModels{CGAL::Arr_linear_traits_2} - * \cgalModels{CGAL::Arr_rational_function_traits_2} - * \cgalModels{CGAL::Arr_algebraic_segment_traits_2} - * \cgalModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} + * \cgalHasModels{CGAL::Arr_linear_traits_2} + * \cgalHasModels{CGAL::Arr_rational_function_traits_2} + * \cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} + * \cgalHasModels{CGAL::Arr_geodesic_arc_on_sphere_traits_2} * \cgalHasModelsEnd * * \sa `ArrangementVerticalSideTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h index 601725e3c065..0e6ec4d3af8e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryInputFormatter.h @@ -10,7 +10,7 @@ specific format. \cgalRefines{ArrangementInputFormatter} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_with_history_text_formatter} +\cgalHasModels{CGAL::Arr_with_history_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h index 287a3a9f7ebd..2aa87cc1d95d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementWithHistoryOutputFormatter.h @@ -10,7 +10,7 @@ specific format. \cgalRefines{ArrangementOutputFormatter} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_with_history_text_formatter} +\cgalHasModels{CGAL::Arr_with_history_text_formatter} \cgalHasModelsEnd */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h index 32e49f947dcd..88cc075b5b13 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementXMonotoneTraits_2.h @@ -19,20 +19,20 @@ curve splitting. \cgalRefines{ArrangementBasicTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_segment_traits_2} -\cgalModels{CGAL::Arr_non_caching_segment_traits_2} -\cgalModels{CGAL::Arr_linear_traits_2} -\cgalModels{CGAL::Arr_polyline_traits_2} -\cgalModels{CGAL::Arr_circle_segment_traits_2} -\cgalModels{CGAL::Arr_line_arc_traits_2} -\cgalModels{CGAL::Arr_circular_arc_traits_2} -\cgalModels{CGAL::Arr_circular_line_arc_traits_2} -\cgalModels{CGAL::Arr_conic_traits_2} -\cgalModels{CGAL::Arr_rational_function_traits_2} -\cgalModels{CGAL::Arr_Bezier_curve_traits_2} -\cgalModels{CGAL::Arr_algebraic_segment_traits_2} -\cgalModels{CGAL::Arr_curve_data_traits_2} -\cgalModels{CGAL::Arr_consolidated_curve_data_traits_2} +\cgalHasModels{CGAL::Arr_segment_traits_2} +\cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalHasModels{CGAL::Arr_linear_traits_2} +\cgalHasModels{CGAL::Arr_polyline_traits_2} +\cgalHasModels{CGAL::Arr_circle_segment_traits_2} +\cgalHasModels{CGAL::Arr_line_arc_traits_2} +\cgalHasModels{CGAL::Arr_circular_arc_traits_2} +\cgalHasModels{CGAL::Arr_circular_line_arc_traits_2} +\cgalHasModels{CGAL::Arr_conic_traits_2} +\cgalHasModels{CGAL::Arr_rational_function_traits_2} +\cgalHasModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} +\cgalHasModels{CGAL::Arr_curve_data_traits_2} +\cgalHasModels{CGAL::Arr_consolidated_curve_data_traits_2} \cgalHasModelsEnd \sa `ArrangementBasicTraits_2` diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h index 678d26425c4d..137ccd40de45 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/OverlayTraits.h @@ -12,8 +12,8 @@ maintain the auxiliary data stored with the \dcel records of the resulting overlaid arrangement, based on the contents of the input records. \cgalHasModelsBegin -\cgalModels{CGAL::Arr_default_overlay_traits} -\cgalModels{CGAL::Arr_face_overlay_traits} +\cgalHasModels{CGAL::Arr_default_overlay_traits} +\cgalHasModels{CGAL::Arr_face_overlay_traits} \cgalHasModelsEnd \sa `overlay` diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h index 35818aa505d6..933edcacacb5 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h @@ -9,9 +9,9 @@ A concept that describes the set of methods that should be defined for all coord models used to parameterize the class `Generalized_barycentric_coordinates_2`. \cgalHasModelsBegin -\cgalModels{Wachspress_2} -\cgalModels{Mean_value_2} -\cgalModels{Discrete_harmonic_2} +\cgalHasModels{Wachspress_2} +\cgalHasModels{Mean_value_2} +\cgalHasModels{Discrete_harmonic_2} \cgalHasModelsEnd \deprecated This part of the package is deprecated since the version 5.4 of \cgal. diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h index b1613da6b02c..394a074d2707 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/DiscretizedDomain_2.h @@ -14,7 +14,7 @@ used to approximate certain types of generalized barycentric coordinate function The domain is bounded by the polygon. \cgalHasModelsBegin -\cgalModels{Delaunay_domain_2} +\cgalHasModels{Delaunay_domain_2} \cgalHasModelsEnd */ class DiscretizedDomain_2 { diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h index bc3fa2117d32..65fd4f347a8c 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--AreMergeable_2.h @@ -6,7 +6,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Are_mergeable_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h index a2e684be6263..e7714c045614 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--CompareEndpointsXy_2.h @@ -7,7 +7,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Compare_endpoints_xy_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h index bac19b870721..92ee2585b2db 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--ConstructOpposite_2.h @@ -7,7 +7,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Construct_opposite_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h index f82f215155a4..0a62ec61aad5 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Intersect_2.h @@ -6,7 +6,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Intersect_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Intersect_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h index a2b89befdec1..18f8f26e936f 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Merge_2.h @@ -6,7 +6,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableBinaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Merge_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Merge_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h index 7bca25154fd4..5d6529d48620 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrDirectionalTraits--Split_2.h @@ -6,7 +6,7 @@ namespace ArrDirectionalTraits { \cgalRefines{AdaptableUnaryFunction} \cgalHasModelsBegin -\cgalModels{ArrangementDirectionalXMonotoneTraits_2::Split_2} +\cgalHasModels{ArrangementDirectionalXMonotoneTraits_2::Split_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h index 15aaffd07888..3278e4820008 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/ArrangementDirectionalXMonotoneTraits_2.h @@ -17,13 +17,13 @@ as its source and the other as its target. \cgalRefines{ArrangementXMonotoneTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Arr_segment_traits_2} -\cgalModels{CGAL::Arr_non_caching_segment_traits_2} -\cgalModels{CGAL::Arr_circle_segment_traits_2} -\cgalModels{CGAL::Arr_conic_traits_2} -\cgalModels{CGAL::Arr_rational_function_traits_2} -\cgalModels{CGAL::Arr_Bezier_curve_traits_2} -\cgalModels{CGAL::Arr_algebraic_segment_traits_2} +\cgalHasModels{CGAL::Arr_segment_traits_2} +\cgalHasModels{CGAL::Arr_non_caching_segment_traits_2} +\cgalHasModels{CGAL::Arr_circle_segment_traits_2} +\cgalHasModels{CGAL::Arr_conic_traits_2} +\cgalHasModels{CGAL::Arr_rational_function_traits_2} +\cgalHasModels{CGAL::Arr_Bezier_curve_traits_2} +\cgalHasModels{CGAL::Arr_algebraic_segment_traits_2} \cgalHasModelsEnd \sa `ArrangementXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h index 3151c6eb0746..6d28d6afbf4c 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcel.h @@ -17,7 +17,7 @@ respectively \cgalRefines{ArrangementDcel} \cgalHasModelsBegin -\cgalModels{CGAL::Gps_default_dcel} +\cgalHasModels{CGAL::Gps_default_dcel} \cgalHasModelsEnd \sa `GeneralPolygonSetDcelFace` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h index 123f3b883cfb..01a99bce20e4 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelFace.h @@ -10,7 +10,7 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelFace} \cgalHasModelsBegin -\cgalModels{CGAL::Gps_face_base} +\cgalHasModels{CGAL::Gps_face_base} \cgalHasModelsEnd \sa `ArrangementDcel` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h index 3f254f685a28..a21a5fd8b7f1 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetDcelHalfedge.h @@ -9,7 +9,7 @@ to represent the underlying internal `Arrangement_2` data structure. \cgalRefines{ArrangementDcelHalfedge} \cgalHasModelsBegin -\cgalModels{CGAL::Gps_face_halfedge} +\cgalHasModels{CGAL::Gps_face_halfedge} \cgalHasModelsEnd \sa `ArrangementDcel` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h index bd1afb8ed78e..2c8966d82394 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygonSetTraits_2.h @@ -14,9 +14,9 @@ types. \cgalRefines{ArrangementDirectionalXMonotoneTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Gps_segment_traits_2} -\cgalModels{CGAL::Gps_circle_segment_traits_2} -\cgalModels{CGAL::Gps_traits_2} +\cgalHasModels{CGAL::Gps_segment_traits_2} +\cgalHasModels{CGAL::Gps_circle_segment_traits_2} +\cgalHasModels{CGAL::Gps_traits_2} \cgalHasModelsEnd \sa `ArrangementDirectionalXMonotoneTraits_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h index b9e255935261..e8a9a5b76e50 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GeneralPolygon_2.h @@ -17,7 +17,7 @@ of Boolean set-operations. General polygon that represent holes must be clockwise oriented. \cgalHasModelsBegin -\cgalModels{CGAL::General_polygon_2} +\cgalHasModels{CGAL::General_polygon_2} \cgalHasModelsEnd */ diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h index 2515be1d0e7f..ae3edc165891 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygonWithHoles_2.h @@ -10,7 +10,7 @@ A model of this concept represents a general polygon with holes. \cgalGeneralizes `GeneralPolygonWithHoles_2` \cgalHasModelsBegin -\cgalModels{GeneralPolygonSetTraits_2::Polygon_with_holes2} +\cgalHasModels{GeneralPolygonSetTraits_2::Polygon_with_holes2} \cgalHasModelsEnd \sa `GeneralPolygonWithHoles_2` diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h index dc6486a1a31c..18872ffd1a08 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/Concepts/GpsTraitsGeneralPolygon_2.h @@ -10,8 +10,8 @@ A model of this concept represents a simple general polygon. \cgalGeneralizes `GeneralPolygon_2` \cgalHasModelsBegin -\cgalModels{GeneralPolygonSetTraits_2::Polygon_2} -\cgalModels{CGAL::Polygon_2} +\cgalHasModels{GeneralPolygonSetTraits_2::Polygon_2} +\cgalHasModels{CGAL::Polygon_2} \cgalHasModelsEnd \sa `GeneralPolygon_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h index 0ce3d2249b9f..62853106bae1 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/ApproximateMinEllipsoid_d_Traits_d.h @@ -9,9 +9,9 @@ This concept defines the requirements for traits classes of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_2} -\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_3} -\cgalModels{CGAL::Approximate_min_ellipsoid_d_traits_d} +\cgalHasModels{CGAL::Approximate_min_ellipsoid_d_traits_2} +\cgalHasModels{CGAL::Approximate_min_ellipsoid_d_traits_3} +\cgalHasModels{CGAL::Approximate_min_ellipsoid_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h index 3e25f230aebf..0e78063f3e09 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinCircle2Traits.h @@ -7,7 +7,7 @@ This concept defines the requirements for traits classes of `CGAL::Min_circle_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Min_circle_2_traits_2} +\cgalHasModels{CGAL::Min_circle_2_traits_2} \cgalHasModelsEnd \sa `CGAL::Min_circle_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h index 853c32438132..d498ece7baf8 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinEllipse2Traits.h @@ -7,7 +7,7 @@ This concept defines the requirements for traits classes of `CGAL::Min_ellipse_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Min_ellipse_2_traits_2} +\cgalHasModels{CGAL::Min_ellipse_2_traits_2} \cgalHasModelsEnd \sa `CGAL::Min_ellipse_2` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h index 592d52d69d9c..65ffccff5294 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinQuadrilateralTraits_2.h @@ -9,7 +9,7 @@ set using the functions `min_rectangle_2()`, `min_parallelogram_2()` and `min_strip_2()`. \cgalHasModelsBegin -\cgalModels{CGAL::Min_quadrilateral_default_traits_2} +\cgalHasModels{CGAL::Min_quadrilateral_default_traits_2} \cgalHasModelsEnd \sa `CGAL::min_rectangle_2()` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h index 0d812dd559b0..6815393e7bdb 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereAnnulusDTraits.h @@ -7,9 +7,9 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional min sphere and min annulus algorithms. \cgalHasModelsBegin -\cgalModels{CGAL::Min_sphere_annulus_d_traits_2} -\cgalModels{CGAL::Min_sphere_annulus_d_traits_3} -\cgalModels{CGAL::Min_sphere_annulus_d_traits_d} +\cgalHasModels{CGAL::Min_sphere_annulus_d_traits_2} +\cgalHasModels{CGAL::Min_sphere_annulus_d_traits_3} +\cgalHasModels{CGAL::Min_sphere_annulus_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Min_sphere_d` diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h index 2e19511b8103..9e08fa9312a3 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/MinSphereOfSpheresTraits.h @@ -7,12 +7,12 @@ A model of concept `MinSphereOfSpheresTraits` must provide the following constants, types, predicates and operations. \cgalHasModelsBegin -\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_2} -\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_3} -\cgalModels{CGAL::Min_sphere_of_spheres_d_traits_d} -\cgalModels{CGAL::Min_sphere_of_points_d_traits_2} -\cgalModels{CGAL::Min_sphere_of_points_d_traits_3} -\cgalModels{CGAL::Min_sphere_of_points_d_traits_d} +\cgalHasModels{CGAL::Min_sphere_of_spheres_d_traits_2} +\cgalHasModels{CGAL::Min_sphere_of_spheres_d_traits_3} +\cgalHasModels{CGAL::Min_sphere_of_spheres_d_traits_d} +\cgalHasModels{CGAL::Min_sphere_of_points_d_traits_2} +\cgalHasModels{CGAL::Min_sphere_of_points_d_traits_3} +\cgalHasModels{CGAL::Min_sphere_of_points_d_traits_d} \cgalHasModelsEnd */ diff --git a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h index b72e77f91d34..4b18a7a762a2 100644 --- a/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/Concepts/RectangularPCenterTraits_2.h @@ -8,7 +8,7 @@ needed to compute rectilinear \f$ p\f$-centers of a planar point set using the function `CGAL::rectangular_p_center_2()`. \cgalHasModelsBegin -\cgalModels{CGAL::Rectangular_p_center_default_traits_2} +\cgalHasModels{CGAL::Rectangular_p_center_default_traits_2} \cgalHasModelsEnd \sa `CGAL::rectangular_p_center_2()` diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h index d41ffd3d8425..edd402137ed6 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionBox_d.h @@ -11,8 +11,8 @@ the dimension, the `id`-number, and the boundaries of the box. \cgalRefines{Assignable} \cgalHasModelsBegin -\cgalModels{CGAL::Box_intersection_d::Box_d} -\cgalModels{CGAL::Box_intersection_d::Box_with_handle_d} +\cgalHasModels{CGAL::Box_intersection_d::Box_d} +\cgalHasModels{CGAL::Box_intersection_d::Box_with_handle_d} \cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink diff --git a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h index 98cb8e4a34f9..c3541e6cfd23 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/Concepts/BoxIntersectionTraits_d.h @@ -10,7 +10,7 @@ the boxes manipulated in these algorithms. \cgalRefines{Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Box_intersection_d::Box_traits_d} +\cgalHasModels{CGAL::Box_intersection_d::Box_traits_d} \cgalHasModelsEnd \sa \link PkgBoxIntersectionD_box_intersection_d `CGAL::box_intersection_d()` \endlink diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h index 05175484ac24..6018fabb347e 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--PolynomialForCircles_2_2.h @@ -12,7 +12,7 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Polynomial_for_circles_2_2} +\cgalHasModels{CGAL::Polynomial_for_circles_2_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h index ee376204999c..d045a84662e8 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--Polynomial_1_2.h @@ -10,7 +10,7 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Polynomial_1_2} +\cgalHasModels{CGAL::Polynomial_1_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h index 13cdb5119351..b11014950b43 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles--RootForCircles_2_2.h @@ -8,7 +8,7 @@ in two variables `x` and `y` that are models of concept `AlgebraicKernelForCircles::PolynomialForCircles_2_2` \cgalHasModelsBegin -\cgalModels{CGAL::Root_for_circles_2_2} +\cgalHasModels{CGAL::Root_for_circles_2_2} \cgalHasModelsEnd \sa `AlgebraicKernelForCircles` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h index 9b259e047c3c..6241ca39f35e 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/AlgebraicKernelForCircles.h @@ -8,7 +8,7 @@ curved kernel with all the algebraic functionalities required for the manipulation of circular arcs. \cgalHasModelsBegin -\cgalModels{CGAL::Algebraic_kernel_for_circles_2_2} +\cgalHasModels{CGAL::Algebraic_kernel_for_circles_2_2} \cgalHasModelsEnd \sa `CircularKernel` diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h index 82cf9487e871..d9019e31e3ac 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArcPoint_2.h @@ -8,7 +8,7 @@ Concept for points on circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Circular_arc_point_2} +\cgalHasModels{CGAL::Circular_arc_point_2} \cgalHasModelsEnd */ class CircularKernel::CircularArcPoint_2 { diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h index d5833dfa55d1..dff040e6a328 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--CircularArc_2.h @@ -8,7 +8,7 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Circular_arc_2} +\cgalHasModels{CGAL::Circular_arc_2} \cgalHasModelsEnd */ diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h index e92230b10a02..ca08be2ae848 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel--LineArc_2.h @@ -10,7 +10,7 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Line_arc_2} +\cgalHasModels{CGAL::Line_arc_2} \cgalHasModelsEnd */ diff --git a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h index d5c912468c6f..1c78b2d50ea7 100644 --- a/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h +++ b/Circular_kernel_2/doc/Circular_kernel_2/Concepts/CircularKernel.h @@ -6,8 +6,8 @@ \cgalRefines{Kernel} \cgalHasModelsBegin -\cgalModels{CGAL::Circular_kernel_2} -\cgalModels{CGAL::Exact_circular_kernel_2} +\cgalHasModels{CGAL::Circular_kernel_2} +\cgalHasModels{CGAL::Exact_circular_kernel_2} \cgalHasModelsEnd \sa `Kernel` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h index 70aa9278d6b7..99b16c59c630 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialForSpheres_2_3.h @@ -12,7 +12,7 @@ are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{GAL::Polynomial_for_spheres_2_} +\cgalHasModels{GAL::Polynomial_for_spheres_2_} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h index 6423e3805a0b..0df9eeb89b10 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--Polynomial_1_3.h @@ -10,7 +10,7 @@ coefficients are of a type that is a model of the concept \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Polynomial_1_3} +\cgalHasModels{CGAL::Polynomial_1_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h index 99d40b5860a0..6dd59fc1a88f 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--PolynomialsForLines_3.h @@ -9,7 +9,7 @@ capable of storing equations of lines. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Polynomials_for_lines_3} +\cgalHasModels{CGAL::Polynomials_for_lines_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h index cb25b3d6244f..5da83e31c6f4 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres--RootForSpheres_2_3.h @@ -8,7 +8,7 @@ in three variables `x`, `y` and `z` that are models of concept `AlgebraicKernelForSpheres::PolynomialForSpheres_2_3`. \cgalHasModelsBegin -\cgalModels{CGAL::Root_for_spheres_2_3} +\cgalHasModels{CGAL::Root_for_spheres_2_3} \cgalHasModelsEnd \sa `AlgebraicKernelForSpheres` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h index 585101b73df1..c258b5020a9d 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/AlgebraicKernelForSpheres.h @@ -8,7 +8,7 @@ curved kernel with all the algebraic functionalities required for the manipulation of spheres, circles, and circular arcs in 3D. \cgalHasModelsBegin -\cgalModels{CGAL::Algebraic_kernel_for_spheres_2_3} +\cgalHasModels{CGAL::Algebraic_kernel_for_spheres_2_3} \cgalHasModelsEnd \sa `SphericalKernel` diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h index 8c932d227124..60f3f613b6d3 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArcPoint_3.h @@ -8,7 +8,7 @@ Concept for points on spheres, circles, circular arcs or line arcs. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Circular_arc_point_3} +\cgalHasModels{CGAL::Circular_arc_point_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h index 644a50773840..ad062120fdc0 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--CircularArc_3.h @@ -8,7 +8,7 @@ Concept for arcs of circles. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Circular_arc_3} +\cgalHasModels{CGAL::Circular_arc_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h index ca26700179f0..0c750dff3ac9 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel--LineArc_3.h @@ -10,7 +10,7 @@ Concept for line segments supported by a line that is a model of \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Line_arc_3} +\cgalHasModels{CGAL::Line_arc_3} \cgalHasModelsEnd */ diff --git a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h index 22b389149611..23be29fe5b64 100644 --- a/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h +++ b/Circular_kernel_3/doc/Circular_kernel_3/Concepts/SphericalKernel.h @@ -6,8 +6,8 @@ \cgalRefines{Kernel} \cgalHasModelsBegin -\cgalModels{CGAL::Spherical_kernel_3} -\cgalModels{CGAL::Exact_spherical_kernel_3} +\cgalHasModels{CGAL::Spherical_kernel_3} +\cgalHasModels{CGAL::Exact_spherical_kernel_3} \cgalHasModelsEnd \sa `Kernel` diff --git a/Circulator/doc/Circulator/Concepts/ConstHandle.h b/Circulator/doc/Circulator/Concepts/ConstHandle.h index b15f9c6fd0c0..281902ecce4a 100644 --- a/Circulator/doc/Circulator/Concepts/ConstHandle.h +++ b/Circulator/doc/Circulator/Concepts/ConstHandle.h @@ -8,7 +8,7 @@ A constant handle. Refer to the `Handle` concept for more details. \cgalRefines{Descriptor} \cgalHasModelsBegin -\cgalModels{const T* (const pointers)} +\cgalHasModels{const T* (const pointers)} \cgalHasModelsEnd \sa `Handle` diff --git a/Circulator/doc/Circulator/Concepts/Handle.h b/Circulator/doc/Circulator/Concepts/Handle.h index 0e531736bcf0..fd08f96c22b6 100644 --- a/Circulator/doc/Circulator/Concepts/Handle.h +++ b/Circulator/doc/Circulator/Concepts/Handle.h @@ -24,10 +24,10 @@ operator is concerned (this serves the same purpose as NULL for pointers). standard containers.) \cgalHasModelsBegin -\cgalModels{T* (pointer)} -\cgalModels{const T* (const pointers)} -\cgalModels{Iterator} -\cgalModels{Circulator} +\cgalHasModels{T* (pointer)} +\cgalHasModels{const T* (const pointers)} +\cgalHasModels{Iterator} +\cgalHasModels{Circulator} \cgalHasModelsEnd */ class Handle { diff --git a/Classification/doc/Classification/Concepts/Classifier.h b/Classification/doc/Classification/Concepts/Classifier.h index fefec08fcebe..03ba639d2566 100644 --- a/Classification/doc/Classification/Concepts/Classifier.h +++ b/Classification/doc/Classification/Concepts/Classifier.h @@ -13,9 +13,9 @@ Concept describing a classifier used by classification functions (see `CGAL::Classification::classify_with_graphcut()`). \cgalHasModelsBegin -\cgalModels{CGAL::Classification::Sum_of_weighted_features_classifier} -\cgalModels{CGAL::Classification::ETHZ::Random_forest_classifier} -\cgalModels{CGAL::Classification::OpenCV::Random_forest_classifier} +\cgalHasModels{CGAL::Classification::Sum_of_weighted_features_classifier} +\cgalHasModels{CGAL::Classification::ETHZ::Random_forest_classifier} +\cgalHasModels{CGAL::Classification::OpenCV::Random_forest_classifier} \cgalHasModelsEnd */ diff --git a/Classification/doc/Classification/Concepts/NeighborQuery.h b/Classification/doc/Classification/Concepts/NeighborQuery.h index 4db42f7b4b8a..8de58a6c5236 100644 --- a/Classification/doc/Classification/Concepts/NeighborQuery.h +++ b/Classification/doc/Classification/Concepts/NeighborQuery.h @@ -11,10 +11,10 @@ namespace Classification Concept describing a neighbor query used for classification. \cgalHasModelsBegin -\cgalModels{CGAL::Classification::Point_set_neighborhood::K_neighbor_query} -\cgalModels{CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query} -\cgalModels{CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query} -\cgalModels{CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query} +\cgalHasModels{CGAL::Classification::Point_set_neighborhood::K_neighbor_query} +\cgalHasModels{CGAL::Classification::Point_set_neighborhood::Sphere_neighbor_query} +\cgalHasModels{CGAL::Classification::Mesh_neighborhood::One_ring_neighbor_query} +\cgalHasModels{CGAL::Classification::Mesh_neighborhood::N_ring_neighbor_query} \cgalHasModelsEnd */ diff --git a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h index f5e1d3a6f365..639a45e5f4c4 100644 --- a/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h +++ b/Convex_hull_2/doc/Convex_hull_2/Concepts/ConvexHullTraits_2.h @@ -10,12 +10,12 @@ functions. The specific subset of these primitives required by each function is specified with each function. \cgalHasModelsBegin -\cgalModels{CGAL::Convex_hull_constructive_traits_2} -\cgalModels{CGAL::Convex_hull_traits_2} -\cgalModels{CGAL::Convex_hull_traits_adapter_2} -\cgalModels{CGAL::Projection_traits_xy_3} -\cgalModels{CGAL::Projection_traits_yz_3} -\cgalModels{CGAL::Projection_traits_xz_3} +\cgalHasModels{CGAL::Convex_hull_constructive_traits_2} +\cgalHasModels{CGAL::Convex_hull_traits_2} +\cgalHasModels{CGAL::Convex_hull_traits_adapter_2} +\cgalHasModels{CGAL::Projection_traits_xy_3} +\cgalHasModels{CGAL::Projection_traits_yz_3} +\cgalHasModels{CGAL::Projection_traits_xz_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h index b9fd8dac2302..ba20411843b0 100644 --- a/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/Concepts/ConvexHullTraits_3.h @@ -5,8 +5,8 @@ Requirements of the traits class of the function `CGAL::convex_hull_3()`. \cgalHasModelsBegin -\cgalModels{CGAL::Convex_hull_traits_3} -\cgalModels{CGAL::Extreme_points_traits_adapter_3} +\cgalHasModels{CGAL::Convex_hull_traits_3} +\cgalHasModels{CGAL::Extreme_points_traits_adapter_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h index fce2c1aa3200..19c5793f9c0f 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/ConvexHullTraits_d.h @@ -8,9 +8,9 @@ Requirements of the traits class to be used with the class `CGAL::Convex_hull_d`. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} -\cgalModels{CGAL::Convex_hull_d_traits_3} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Convex_hull_d_traits_3} \cgalHasModelsEnd */ diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h index 0937e25239c1..a584e7433ed5 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayLiftedTraits_d.h @@ -8,8 +8,8 @@ Requirements of the second traits class to be used with the class `CGAL::Delaunay_d`. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ diff --git a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h index 2f91bbf7d823..c04db63b19c8 100644 --- a/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h +++ b/Convex_hull_d/doc/Convex_hull_d/Concepts/DelaunayTraits_d.h @@ -8,8 +8,8 @@ Requirements of the first traits class to be used with the class `CGAL::Delaunay_d`. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ diff --git a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h index 02ae3ebf7cf3..3665e2ae25a0 100644 --- a/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h +++ b/Envelope_3/doc/Envelope_3/Concepts/EnvelopeTraits_3.h @@ -17,10 +17,10 @@ Note however, that these operations usually involve the projection of \cgalRefines{ArrangementXMonotoneTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Env_triangle_traits_3} -\cgalModels{CGAL::Env_sphere_traits_3} -\cgalModels{CGAL::Env_plane_traits_3} -\cgalModels{CGAL::Env_surface_data_traits_3} +\cgalHasModels{CGAL::Env_triangle_traits_3} +\cgalHasModels{CGAL::Env_sphere_traits_3} +\cgalHasModels{CGAL::Env_plane_traits_3} +\cgalHasModels{CGAL::Env_surface_data_traits_3} \cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/PointGenerator.h b/Generator/doc/Generator/Concepts/PointGenerator.h index 5a70e5f0ebdc..39019e4b99a7 100644 --- a/Generator/doc/Generator/Concepts/PointGenerator.h +++ b/Generator/doc/Generator/Concepts/PointGenerator.h @@ -6,20 +6,20 @@ The concept `PointGenerator` defines the requirements for a point generator, which can be used in places where input iterators are called for. \cgalHasModelsBegin -\cgalModels{CGAL::Random_points_in_ball_d} -\cgalModels{CGAL::Random_points_in_disc_2} -\cgalModels{CGAL::Random_points_in_square_2} -\cgalModels{CGAL::Random_points_in_triangle_2} -\cgalModels{CGAL::Random_points_on_circle_2} -\cgalModels{CGAL::Random_points_on_segment_2} -\cgalModels{CGAL::Random_points_on_square_2} -\cgalModels{CGAL::Random_points_in_cube_3} -\cgalModels{CGAL::Random_points_in_cube_d} -\cgalModels{CGAL::Random_points_in_sphere_3} -\cgalModels{CGAL::Random_points_in_triangle_3} -\cgalModels{CGAL::Random_points_in_tetrahedron_3} -\cgalModels{CGAL::Random_points_on_sphere_3} -\cgalModels{CGAL::Random_points_on_sphere_d} +\cgalHasModels{CGAL::Random_points_in_ball_d} +\cgalHasModels{CGAL::Random_points_in_disc_2} +\cgalHasModels{CGAL::Random_points_in_square_2} +\cgalHasModels{CGAL::Random_points_in_triangle_2} +\cgalHasModels{CGAL::Random_points_on_circle_2} +\cgalHasModels{CGAL::Random_points_on_segment_2} +\cgalHasModels{CGAL::Random_points_on_square_2} +\cgalHasModels{CGAL::Random_points_in_cube_3} +\cgalHasModels{CGAL::Random_points_in_cube_d} +\cgalHasModels{CGAL::Random_points_in_sphere_3} +\cgalHasModels{CGAL::Random_points_in_triangle_3} +\cgalHasModels{CGAL::Random_points_in_tetrahedron_3} +\cgalHasModels{CGAL::Random_points_on_sphere_3} +\cgalHasModels{CGAL::Random_points_on_sphere_d} \cgalHasModelsEnd */ diff --git a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h index 669f54809b32..05cb1eda3a82 100644 --- a/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h +++ b/Generator/doc/Generator/Concepts/RandomConvexSetTraits_2.h @@ -6,7 +6,7 @@ The concept `RandomConvexSetTraits_2` describes the requirements of the traits class for the function `random_convex_set_2()`. \cgalHasModelsBegin -\cgalModels{CGAL::Random_convex_set_traits_2} +\cgalHasModels{CGAL::Random_convex_set_traits_2} \cgalHasModelsEnd */ diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h index 6b99d22b415c..ed5f246b5f04 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDS.h @@ -68,9 +68,9 @@ from the `` header file can be used as default allocator. \cgalHasModelsBegin -\cgalModels{CGAL::HalfedgeDS_default} -\cgalModels{CGAL::HalfedgeDS_list} -\cgalModels{CGAL::HalfedgeDS_vector} +\cgalHasModels{CGAL::HalfedgeDS_default} +\cgalHasModels{CGAL::HalfedgeDS_list} +\cgalHasModels{CGAL::HalfedgeDS_vector} \cgalHasModelsEnd \sa `HalfedgeDSItems` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h index fb3c3e05d2ac..e8ef9f27a86a 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSFace.h @@ -24,8 +24,8 @@ can be bypassed by the user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::HalfedgeDS_face_base} -\cgalModels{CGAL::HalfedgeDS_face_min_base} +\cgalHasModels{CGAL::HalfedgeDS_face_base} +\cgalHasModels{CGAL::HalfedgeDS_face_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h index f726b2c43833..d464d21ca1c4 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSHalfedge.h @@ -34,8 +34,8 @@ function. The base class `Base_base` provides access to it. (The protection could be bypassed also by an user, but not by accident.) \cgalHasModelsBegin -\cgalModels{::CGAL::HalfedgeDS_halfedge_base} -\cgalModels{::CGAL::HalfedgeDS_halfedge_min_base} +\cgalHasModels{::CGAL::HalfedgeDS_halfedge_base} +\cgalHasModels{::CGAL::HalfedgeDS_halfedge_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h index 3b52eeb48a51..b4399e4121cd 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSItems.h @@ -17,9 +17,9 @@ types are described on the manual pages of the concepts `HalfedgeDSVertex`, `HalfedgeDSHalfedge`, and `HalfedgeDSFace` respectively. \cgalHasModelsBegin -\cgalModels{CGAL::HalfedgeDS_min_items} -\cgalModels{CGAL::HalfedgeDS_items_2} -\cgalModels{CGAL::Polyhedron_items_3} +\cgalHasModels{CGAL::HalfedgeDS_min_items} +\cgalHasModels{CGAL::HalfedgeDS_items_2} +\cgalHasModels{CGAL::Polyhedron_items_3} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h index ce5766136308..19efa29448b2 100644 --- a/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h +++ b/HalfedgeDS/doc/HalfedgeDS/Concepts/HalfedgeDSVertex.h @@ -24,8 +24,8 @@ could be bypassed by an user, but not by accident.) \cgalRefines{CopyConstructible,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::HalfedgeDS_vertex_base} -\cgalModels{CGAL::HalfedgeDS_vertex_min_base} +\cgalHasModels{CGAL::HalfedgeDS_vertex_base} +\cgalHasModels{CGAL::HalfedgeDS_vertex_min_base} \cgalHasModelsEnd \sa `HalfedgeDS` diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h index 39a254eec7e1..1aaec1a1a002 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicDelaunayTriangulationTraits_2.h @@ -17,8 +17,8 @@ This concept refines `DelaunayTriangulationTraits_2` because the class `CGAL::Hy internally relies on the class `CGAL::Delaunay_triangulation_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Hyperbolic_Delaunay_triangulation_traits_2} -\cgalModels{CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2} +\cgalHasModels{CGAL::Hyperbolic_Delaunay_triangulation_traits_2} +\cgalHasModels{CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2} \cgalHasModelsEnd */ diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h index 51a984a3c985..f4f5ab1c62e2 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Concepts/HyperbolicTriangulationFaceBase_2.h @@ -42,7 +42,7 @@ Delaunay triangulations in the hyperbolic plane. The function `tds_data()` is us internally by the triangulation class during the insertion of points in the triangulation. \cgalHasModelsBegin -\cgalModels{CGAL::Hyperbolic_triangulation_face_base_2} +\cgalHasModels{CGAL::Hyperbolic_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h index 407337905ef1..d31bfb5c8619 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/ExtremalPolygonTraits_2.h @@ -16,8 +16,8 @@ precondition checking only. Therefore, they need not to be specified, in case that precondition checking is disabled. \cgalHasModelsBegin -\cgalModels{CGAL::Extremal_polygon_area_traits_2} -\cgalModels{CGAL::Extremal_polygon_perimeter_traits_2} +\cgalHasModels{CGAL::Extremal_polygon_area_traits_2} +\cgalHasModels{CGAL::Extremal_polygon_perimeter_traits_2} \cgalHasModelsEnd \sa `CGAL::maximum_area_inscribed_k_gon_2()` diff --git a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h index 796290481046..5a269cc649f9 100644 --- a/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h +++ b/Inscribed_areas/doc/Inscribed_areas/Concepts/LargestEmptyIsoRectangleTraits_2.h @@ -11,8 +11,8 @@ this class and some function object types for the required predicates on those primitives. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian} -\cgalModels{CGAL::Homogeneous} +\cgalHasModels{CGAL::Cartesian} +\cgalHasModels{CGAL::Homogeneous} \cgalHasModelsEnd \sa `CGAL::Largest_empty_iso_rectangle_2` diff --git a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h index 0cdbc888f217..222fc82d203f 100644 --- a/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/GradientFittingTraits.h @@ -8,7 +8,7 @@ traits class that defines the primitives used by the algorithm. The concept `GradientFittingTraits` defines this common set of requirements. \cgalHasModelsBegin -\cgalModels{CGAL::Interpolation_gradient_fitting_traits_2} +\cgalHasModels{CGAL::Interpolation_gradient_fitting_traits_2} \cgalHasModelsEnd \sa `InterpolationTraits` diff --git a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h index 18b806952cb5..d3b8bd79beca 100644 --- a/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h +++ b/Interpolation/doc/Interpolation/Concepts/InterpolationTraits.h @@ -8,8 +8,8 @@ defines the primitives used in the interpolation algorithms. The concept `InterpolationTraits` defines this common set of requirements. \cgalHasModelsBegin -\cgalModels{CGAL::Interpolation_traits_2} -\cgalModels{CGAL::Interpolation_gradient_fitting_traits_2} +\cgalHasModels{CGAL::Interpolation_traits_2} +\cgalHasModels{CGAL::Interpolation_gradient_fitting_traits_2} \cgalHasModelsEnd \sa `GradientFittingTraits` diff --git a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h index fe7cbbd266ed..7ca67466f3c9 100644 --- a/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h +++ b/Interval_skip_list/doc/Interval_skip_list/Concepts/Interval.h @@ -10,8 +10,8 @@ closed. It is up to the implementer of a model for this concept to define that. \cgalHasModelsBegin -\cgalModels{CGAL::Interval_skip_list_interval} -\cgalModels{CGAL::Level_interval} +\cgalHasModels{CGAL::Interval_skip_list_interval} +\cgalHasModels{CGAL::Level_interval} \cgalHasModelsEnd \sa `Interval_skip_list` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h index 93d2ee819e5a..bea789a167bc 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/DataKernel.h @@ -14,8 +14,8 @@ Only constructors (from 3 scalars and copy constructors) and access methods to coordinates `x()`, `y()`, `z()` are needed. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian} -\cgalModels{CGAL::Simple_cartesian} +\cgalHasModels{CGAL::Cartesian} +\cgalHasModels{CGAL::Simple_cartesian} \cgalHasModelsEnd \sa `LocalKernel` diff --git a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h index d4981cf4f846..17dbcfae03f8 100644 --- a/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h +++ b/Jet_fitting_3/doc/Jet_fitting_3/Concepts/LocalKernel.h @@ -30,8 +30,8 @@ methods to coordinates `x()`, `y()`, `z()` are needed for the point and vector types. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian} -\cgalModels{CGAL::Simple_cartesian} +\cgalHasModels{CGAL::Cartesian} +\cgalHasModels{CGAL::Simple_cartesian} \cgalHasModelsEnd \sa `DataKernel` diff --git a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h index 9433ac9dd058..57ad06016b8e 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h +++ b/Kernel_23/doc/Kernel_23/Concepts/GeomObjects.h @@ -9,7 +9,7 @@ namespace Kernel { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Circle_2} + \cgalHasModels{CGAL::Circle_2} \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` @@ -41,7 +41,7 @@ class Circle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Circle_3} + \cgalHasModels{CGAL::Circle_3} \cgalHasModelsEnd \sa `Kernel::ComputeApproximateArea_3` @@ -71,7 +71,8 @@ class Circle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Direction_2} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Direction_2} \cgalHasModelsEnd \sa `Kernel::CompareAngleWithXAxis_2` @@ -96,7 +97,8 @@ class Direction_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Direction_3} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Direction_3} \cgalHasModelsEnd \sa `Kernel::ConstructDirection_3` @@ -118,7 +120,7 @@ A type representing isocuboids in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Iso_cuboid_3} +\cgalHasModels{CGAL::Iso_cuboid_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -144,7 +146,8 @@ class IsoCuboid_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Iso_rectangle_2} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Iso_rectangle_2} \cgalHasModelsEnd \sa `Kernel::ConstructIsoRectangle_2` @@ -177,7 +180,8 @@ class IsoRectangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Line_2} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Line_2} \cgalHasModelsEnd \sa `Kernel::CompareXAtY_2` @@ -214,7 +218,8 @@ class Line_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Line_3} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Line_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -246,7 +251,8 @@ class Line_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Object} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Object} \cgalHasModelsEnd \sa `Kernel::Assign_2` @@ -268,7 +274,8 @@ class Object_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Object} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Object} \cgalHasModelsEnd \sa `Kernel::Assign_3` @@ -288,7 +295,8 @@ class Object_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Plane_3} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Plane_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -326,7 +334,8 @@ class Plane_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Point_2} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Point_2} \cgalHasModelsEnd \sa `Kernel::Angle_2` @@ -386,7 +395,8 @@ class Point_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} - \cgalModels{CGAL::Point_3} + \cgalHasModelsBegin + \cgalHasModels{CGAL::Point_3} \cgalHasModelsEnd \sa `Kernel::Angle_3` @@ -449,7 +459,7 @@ A type representing rays in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Ray_2} +\cgalHasModels{CGAL::Ray_2} \cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` @@ -483,7 +493,7 @@ class Ray_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Ray_3} + \cgalHasModels{CGAL::Ray_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -513,7 +523,7 @@ class Ray_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Segment_2} + \cgalHasModels{CGAL::Segment_2} \cgalHasModelsEnd \sa `Kernel::CollinearHasOn_2` @@ -549,7 +559,7 @@ class Segment_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Segment_3} + \cgalHasModels{CGAL::Segment_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredDistance_3` @@ -581,7 +591,7 @@ class Segment_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Sphere_3} + \cgalHasModels{CGAL::Sphere_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -613,7 +623,7 @@ class Sphere_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Tetrahedron_3} + \cgalHasModels{CGAL::Tetrahedron_3} \cgalHasModelsEnd \sa `Kernel::BoundedSide_3` @@ -646,7 +656,7 @@ class Tetrahedron_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Triangle_2} + \cgalHasModels{CGAL::Triangle_2} \cgalHasModelsEnd \sa `Kernel::BoundedSide_2` @@ -681,7 +691,7 @@ class Triangle_2 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Triangle_3} + \cgalHasModels{CGAL::Triangle_3} \cgalHasModelsEnd \sa `Kernel::ComputeSquaredArea_3` @@ -708,7 +718,7 @@ class Triangle_3 { \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin - \cgalModels{CGAL::Vector_2} + \cgalHasModels{CGAL::Vector_2} \cgalHasModelsEnd \sa `Kernel::ComputeDeterminant_2` @@ -743,7 +753,7 @@ A type representing vectors in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Vector_3} +\cgalHasModels{CGAL::Vector_3} \cgalHasModelsEnd \sa `Kernel::CompareDihedralAngle_3` @@ -781,7 +791,7 @@ A type representing weighted points in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Weighted_point_2} +\cgalHasModels{CGAL::Weighted_point_2} \cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_2` @@ -810,7 +820,7 @@ A type representing weighted points in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Weighted_point_3} +\cgalHasModels{CGAL::Weighted_point_3} \cgalHasModelsEnd \sa `Kernel::ConstructWeightedPoint_3` diff --git a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h index 2da2b9d8fb9f..e312763fd33f 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/Kernel.h +++ b/Kernel_23/doc/Kernel_23/Concepts/Kernel.h @@ -21,14 +21,14 @@ When the result type is not determined, no prefix is used. \cgalHasModelsBegin - \cgalModels{CGAL::Cartesian} - \cgalModels{CGAL::Homogeneous} - \cgalModels{CGAL::Simple_cartesian} - \cgalModels{CGAL::Simple_homogeneous} - \cgalModels{CGAL::Filtered_kernel} - \cgalModels{CGAL::Exact_predicates_exact_constructions_kernel} - \cgalModels{CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt} - \cgalModels{CGAL::Exact_predicates_inexact_constructions_kernel} + \cgalHasModels{CGAL::Cartesian} + \cgalHasModels{CGAL::Homogeneous} + \cgalHasModels{CGAL::Simple_cartesian} + \cgalHasModels{CGAL::Simple_homogeneous} + \cgalHasModels{CGAL::Filtered_kernel} + \cgalHasModels{CGAL::Exact_predicates_exact_constructions_kernel} + \cgalHasModels{CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt} + \cgalHasModels{CGAL::Exact_predicates_inexact_constructions_kernel} \cgalHasModelsEnd \sa `Kernel_d` diff --git a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h index 4a8e19db8cd4..fd43b0acbcae 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/KernelWithLifting_d.h @@ -9,8 +9,8 @@ unclear in kernels of fixed dimension. \cgalRefines{Kernel_d} \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} \cgalHasModelsEnd */ class KernelWithLifting_d { diff --git a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h index c4ac4f607c80..6b484f16e141 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/Kernel_d.h @@ -19,10 +19,10 @@ constructive procedures in the kernel. There are also function objects replacing operators, especially for equality testing. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} \cgalHasModelsEnd */ class Kernel_d { diff --git a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h index 8dff375eaea0..e0e523e5363e 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/LinearAlgebraTraits_d.h @@ -14,8 +14,8 @@ system \f$ A x = b\f$ unsolvable it also returns a vector \f$ c\f$ such that \f$ c^T A = 0\f$ and \f$ c^T b \neq 0\f$. \cgalHasModelsBegin -\cgalModels{CGAL::Linear_algebraHd} -\cgalModels{CGAL::Linear_algebraCd} +\cgalHasModels{CGAL::Linear_algebraHd} +\cgalHasModels{CGAL::Linear_algebraCd} \cgalHasModelsEnd */ diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h index abc3d27eaf24..4f40ff9f074c 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/Concepts/LinearCellComplexItems.h @@ -10,7 +10,7 @@ The concept `LinearCellComplexItems` refines the concept of `GenericMapItems` by The first type in `Attributes` tuple must be a model of the `CellAttributeWithPoint` concept. \cgalHasModelsBegin -\cgalModels{CGAL::Linear_cell_complex_min_items} +\cgalHasModels{CGAL::Linear_cell_complex_min_items} \cgalHasModelsEnd \sa `LinearCellComplex` diff --git a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h index 9a7b265540b9..db4833f4218d 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h +++ b/Matrix_search/doc/Matrix_search/Concepts/BasicMatrix.h @@ -9,7 +9,7 @@ types and operations in order to be a model for `BasicMatrix`. \cgalHasModelsBegin -\cgalModels{CGAL::Dynamic_matrix} +\cgalHasModels{CGAL::Dynamic_matrix} \cgalHasModelsEnd \sa `MonotoneMatrixSearchTraits` diff --git a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h index b20b74de1d09..4c40f6e51387 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/MonotoneMatrixSearchTraits.h @@ -22,7 +22,7 @@ matrix classes. \cgalHasModelsBegin -\cgalModels{CGAL::Dynamic_matrix} +\cgalHasModels{CGAL::Dynamic_matrix} \cgalHasModelsEnd \sa `CGAL::monotone_matrix_search()` diff --git a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h index 99c3cfcba772..94bea1beccaf 100644 --- a/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h +++ b/Matrix_search/doc/Matrix_search/Concepts/SortedMatrixSearchTraits.h @@ -9,7 +9,7 @@ that fulfills a certain feasibility criterion using the function `CGAL::sorted_matrix_search`. \cgalHasModelsBegin -\cgalModels{CGAL::Sorted_matrix_search_traits_adaptor} +\cgalHasModels{CGAL::Sorted_matrix_search_traits_adaptor} \cgalHasModelsEnd \sa `CGAL::sorted_matrix_search()` diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h index 7bc632d6fa8e..e4289950e0c1 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshFaceBase_2.h @@ -14,7 +14,7 @@ meshing domain or not. \cgalRefines{ConstrainedTriangulationFaceBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_mesh_face_base_2} +\cgalHasModels{CGAL::Delaunay_mesh_face_base_2} \cgalHasModelsEnd diff --git a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h index ac7a4a691612..26f52e7993c9 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/DelaunayMeshVertexBase_2.h @@ -14,7 +14,7 @@ the mesh density everywhere while modifying the mesh. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_mesh_vertex_base_2} +\cgalHasModels{CGAL::Delaunay_mesh_vertex_base_2} \cgalHasModelsEnd diff --git a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h index 06f5f865e331..c4dc873cc514 100644 --- a/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h +++ b/Mesh_2/doc/Mesh_2/Concepts/MeshingCriteria_2.h @@ -38,8 +38,8 @@ to split those with smallest quality first. The predicate `Is_bad` computes the quality of the triangle as a by-product. \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_mesh_criteria_2} -\cgalModels{CGAL::Delaunay_mesh_size_criteria_2} +\cgalHasModels{CGAL::Delaunay_mesh_criteria_2} +\cgalHasModels{CGAL::Delaunay_mesh_size_criteria_2} \cgalHasModelsEnd diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h index 44f0e8181230..fe6dee8ad14c 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellBase_3.h @@ -44,8 +44,8 @@ each cell (see below). \cgalRefines{SimplicialMeshCellBase_3,RegularTriangulationCellBaseWithWeightedCircumcenter_3,CopyConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Compact_mesh_cell_base_3} -\cgalModels{CGAL::Mesh_cell_base_3} +\cgalHasModels{CGAL::Compact_mesh_cell_base_3} +\cgalHasModels{CGAL::Mesh_cell_base_3} \cgalHasModelsEnd \sa `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h index bc8a60b51d32..b278477fb78d 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCellCriteria_3.h @@ -10,7 +10,7 @@ The concept `MeshCellCriteria_3` describes the types that handle the refinement criteria for mesh tetrahedra. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_cell_criteria_3} +\cgalHasModels{CGAL::Mesh_cell_criteria_3} \cgalHasModelsEnd \sa `MeshEdgeCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h index dcb2123ec62d..895fa9e8c0f1 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteriaWithFeatures_3.h @@ -15,7 +15,7 @@ that describes the requirements, in terms of sizing, for the discretization of t \cgalRefines{MeshCriteria_3} \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_criteria_3} +\cgalHasModels{CGAL::Mesh_criteria_3} \cgalHasModelsEnd \sa `MeshEdgeCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h index 83fad908d256..43587310ddd9 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshCriteria_3.h @@ -13,7 +13,7 @@ are described by the concept `MeshFacetCriteria_3`. The concept `MeshCriteria_3` encapsulates these concepts. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_criteria_3} +\cgalHasModels{CGAL::Mesh_criteria_3} \cgalHasModelsEnd \sa `MeshFacetCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h index d3f7d1e61ea2..c264f53332c9 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainField_3.h @@ -6,7 +6,7 @@ The concept `MeshDomainField_3` describes a scalar field which could be queried at any point of the space. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_constant_domain_field_3} +\cgalHasModels{CGAL::Mesh_constant_domain_field_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h index 3a3a79f11053..2dc7f6acd987 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomainWithFeatures_3.h @@ -18,8 +18,8 @@ between two ordered points on the same curve. \cgalRefines{MeshDomain_3} \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_domain_with_polyline_features_3} -\cgalModels{CGAL::Polyhedral_mesh_domain_with_features_3} +\cgalHasModels{CGAL::Mesh_domain_with_polyline_features_3} +\cgalHasModels{CGAL::Polyhedral_mesh_domain_with_features_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h index 03ca9f2fef7e..401e5f8efc18 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h @@ -30,8 +30,8 @@ if it includes points which are strictly inside and strictly outside the domain (resp. the subdomain). \cgalHasModelsBegin -\cgalModels{CGAL::Polyhedral_mesh_domain_3} -\cgalModels{CGAL::Labeled_mesh_domain_3} +\cgalHasModels{CGAL::Polyhedral_mesh_domain_3} +\cgalHasModels{CGAL::Labeled_mesh_domain_3} \cgalHasModelsEnd \sa `MeshVertexBase_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h index 930a627cc761..367fda230081 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshEdgeCriteria_3.h @@ -8,7 +8,7 @@ It provides an upper bound for the distance between two protecting ball centers that are consecutive on a 1-feature. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_edge_criteria_3} +\cgalHasModels{CGAL::Mesh_edge_criteria_3} \cgalHasModelsEnd \sa `MeshCellCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h index a0c32629c5ad..e85904562764 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshFacetCriteria_3.h @@ -10,7 +10,7 @@ The concept `MeshFacetCriteria_3` describes the types that handle the refinement criteria for surface facets. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_facet_criteria_3} +\cgalHasModels{CGAL::Mesh_facet_criteria_3} \cgalHasModelsEnd \sa `MeshCellCriteria_3` diff --git a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h index 20a62546c2ce..be66168fa4ce 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/MeshVertexBase_3.h @@ -23,7 +23,7 @@ each cell (see below). \cgalRefines{SimplicialMeshVertexBase_3,RegularTriangulationVertexBase_3,SurfaceMeshVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_vertex_base_3} +\cgalHasModels{CGAL::Mesh_vertex_base_3} \cgalHasModelsEnd \sa `CGAL::make_mesh_3()` diff --git a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h index 7be6df1aece7..b009b35f6d4b 100644 --- a/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h +++ b/Mesh_3/doc/Mesh_3/Concepts/TriangleAccessor_3.h @@ -6,7 +6,7 @@ The concept `TriangleAccessor_3` represents an accessor to a triangulated polyhe surface, intersection free and without boundaries. \cgalHasModelsBegin -\cgalModels{CGAL::Triangle_accessor_3,K>} +\cgalHasModels{CGAL::Triangle_accessor_3,K>} \cgalHasModelsEnd \sa `CGAL::Polyhedral_mesh_domain_3` diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h index 848c46adfda9..547dde07838e 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonConvexDecomposition_2.h @@ -7,11 +7,11 @@ decomposing an input polygon \f$ P\f$ into a set of convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \f$ \cup_{i=1}^{k}{P_k} = P\f$. \cgalHasModelsBegin -\cgalModels{CGAL::Small_side_angle_bisector_decomposition_2} -\cgalModels{CGAL::Optimal_convex_decomposition_2} -\cgalModels{CGAL::Hertel_Mehlhorn_convex_decomposition_2} -\cgalModels{CGAL::Greene_convex_decomposition_2} -\cgalModels{CGAL::Polygon_nop_decomposition_2} +\cgalHasModels{CGAL::Small_side_angle_bisector_decomposition_2} +\cgalHasModels{CGAL::Optimal_convex_decomposition_2} +\cgalHasModels{CGAL::Hertel_Mehlhorn_convex_decomposition_2} +\cgalHasModels{CGAL::Greene_convex_decomposition_2} +\cgalHasModels{CGAL::Polygon_nop_decomposition_2} \cgalHasModelsEnd */ diff --git a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h index 6cf7eb45c35e..5a1fac77173a 100644 --- a/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h +++ b/Minkowski_sum_2/doc/Minkowski_sum_2/Concepts/PolygonWithHolesConvexDecomposition_2.h @@ -10,8 +10,8 @@ convex sub-polygons \f$ P_1, \ldots, P_k\f$, such that \cgalRefines{PolygonConvexDecomposition_2} \cgalHasModelsBegin -\cgalModels{CGAL::Polygon_vertical_decomposition_2} -\cgalModels{CGAL::Polygon_triangulation_decomposition_2} +\cgalHasModels{CGAL::Polygon_vertical_decomposition_2} +\cgalHasModels{CGAL::Polygon_triangulation_decomposition_2} \cgalHasModelsEnd */ diff --git a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h index b3f2543843ff..8509b42a07f8 100644 --- a/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h +++ b/Miscellany/doc/Miscellany/Concepts/UniqueHashFunction.h @@ -10,7 +10,7 @@ the integral image type `std::size_t`. The image values have to be unique for all keys in the domain type `Key`. \cgalHasModelsBegin -\cgalModels{CGAL::Handle_hash_function} +\cgalHasModels{CGAL::Handle_hash_function} \cgalHasModelsEnd \sa `CGAL::Unique_hash_map` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h index a78fde1730a1..53e9c0badd0e 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/ModularTraits.h @@ -9,7 +9,7 @@ Boolean tag `ModularTraits::Is_modularizable`. The mapping into the `Residue_typ provided by the functor `ModularTraits::Modular_image`. \cgalHasModelsBegin -\cgalModels{CGAL::Modular_traits} +\cgalHasModels{CGAL::Modular_traits} \cgalHasModelsEnd \sa `CGAL::Residue` diff --git a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h index 1d7f832f5d88..6bc74bc00848 100644 --- a/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h +++ b/Modular_arithmetic/doc/Modular_arithmetic/Concepts/Modularizable.h @@ -19,20 +19,20 @@ This is due to the fact that the denominator may be zero modulo the prime, which can not be represented. \cgalHasModelsBegin -\cgalModels{int} -\cgalModels{long} -\cgalModels{CORE::BigInt} -\cgalModels{CGAL::Gmpz} -\cgalModels{leda_integer} -\cgalModels{mpz_class} +\cgalHasModels{int} +\cgalHasModels{long} +\cgalHasModels{CORE::BigInt} +\cgalHasModels{CGAL::Gmpz} +\cgalHasModels{leda_integer} +\cgalHasModels{mpz_class} \cgalHasModelsEnd The following types are `Modularizable` iff their template arguments are. \cgalHasModelsBegin -\cgalModels{CGAL::Lazy_exact_nt} -\cgalModels{CGAL::Sqrt_extension} -\cgalModels{CGAL::Polynomial} +\cgalHasModels{CGAL::Lazy_exact_nt} +\cgalHasModels{CGAL::Sqrt_extension} +\cgalHasModels{CGAL::Polynomial} \cgalHasModelsEnd \sa `CGAL::Residue` diff --git a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h index c46d39daa542..b6e6da248206 100644 --- a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h +++ b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h @@ -39,9 +39,9 @@ geometry. At the same time it provides extensible geometric primitives on the extended geometric objects. \cgalHasModelsBegin -\cgalModels{CGAL::Extended_cartesian} -\cgalModels{CGAL::Extended_homogeneous} -\cgalModels{CGAL::Filtered_extended_homogeneous} +\cgalHasModels{CGAL::Extended_cartesian} +\cgalHasModels{CGAL::Extended_homogeneous} +\cgalHasModels{CGAL::Filtered_extended_homogeneous} \cgalHasModelsEnd */ diff --git a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h index 40fdf24e2d8f..80f3c1e28dc4 100644 --- a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h +++ b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h @@ -9,7 +9,7 @@ a 3x3 matrix type. \cgalRefines{Kernel} \cgalHasModelsBegin -\cgalModels{CGAL::Oriented_bounding_box_traits_3} +\cgalHasModels{CGAL::Oriented_bounding_box_traits_3} \cgalHasModelsEnd */ diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h index 83408944f2b5..fdb0781ba260 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraits.h @@ -6,9 +6,9 @@ template parameter of the `CGAL::Orthtree` class. \cgalHasModelsBegin - \cgalModels{CGAL::Orthtree_traits_2} - \cgalModels{CGAL::Orthtree_traits_3} - \cgalModels{CGAL::Orthtree_traits_d} + \cgalHasModels{CGAL::Orthtree_traits_2} + \cgalHasModels{CGAL::Orthtree_traits_3} + \cgalHasModels{CGAL::Orthtree_traits_d} \cgalHasModelsEnd */ class OrthtreeTraits diff --git a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h index 851482d8751a..5aeda690079e 100644 --- a/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h +++ b/Orthtree/doc/Orthtree/Concepts/OrthtreeTraversal.h @@ -10,10 +10,10 @@ (e.g. preorder, postorder). \cgalHasModelsBegin - \cgalModels{CGAL::Orthtrees::Preorder_traversal} - \cgalModels{CGAL::Orthtrees::Postorder_traversal} - \cgalModels{CGAL::Orthtrees::Leaves_traversal} - \cgalModels{CGAL::Orthtrees::Level_traversal} + \cgalHasModels{CGAL::Orthtrees::Preorder_traversal} + \cgalHasModels{CGAL::Orthtrees::Postorder_traversal} + \cgalHasModels{CGAL::Orthtrees::Leaves_traversal} + \cgalHasModels{CGAL::Orthtrees::Level_traversal} \cgalHasModelsEnd */ class OrthtreeTraversal { diff --git a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h index 6b9be975123b..ad0d171d07ac 100644 --- a/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/ConvexPartitionIsValidTraits_2.h @@ -7,7 +7,7 @@ by `convex_partition_is_valid_2` for testing the validity of a convex partition of a polygon. \cgalHasModelsBegin -\cgalModels{CGAL::Partition_traits_2} +\cgalHasModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h index 112995c86f11..12b863da2ad7 100644 --- a/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/IsYMonotoneTraits_2.h @@ -7,8 +7,8 @@ used with the function `is_y_monotone_2()` that tests whether a sequence of 2D points defines a \f$ y\f$-monotone polygon or not. \cgalHasModelsBegin -\cgalModels{CGAL::Partition_traits_2} -\cgalModels{CGAL::Kernel_traits_2} +\cgalHasModels{CGAL::Partition_traits_2} +\cgalHasModels{CGAL::Kernel_traits_2} \cgalHasModelsEnd \sa `CGAL::Is_y_monotone_2` diff --git a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h index 1ef70344a2d6..c1f7de776c60 100644 --- a/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/OptimalConvexPartitionTraits_2.h @@ -9,7 +9,7 @@ an optimal convex partition of a polygon. \cgalRefines{PartitionTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Partition_traits_2} +\cgalHasModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::convex_partition_is_valid_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h index 7edbe6dcde6d..537588e4ecf8 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionIsValidTraits_2.h @@ -15,7 +15,7 @@ and the concept `YMonotonePartitionTraits_2` for the additional requirements for testing for convexity and \f$ y\f$-monotonicity, respectively. \cgalHasModelsBegin -\cgalModels{CGAL::Partition_is_valid_traits_2} +\cgalHasModels{CGAL::Partition_is_valid_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h index 910d565cf10a..955d8da45471 100644 --- a/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/PartitionTraits_2.h @@ -9,7 +9,7 @@ to all traits classes. The concept `PartitionTraits_2` defines this common set o requirements. \cgalHasModelsBegin -\cgalModels{CGAL::Partition_traits_2} +\cgalHasModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h index 662bdb369a91..be190734ab0c 100644 --- a/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h +++ b/Partition_2/doc/Partition_2/Concepts/PolygonIsValid.h @@ -7,8 +7,8 @@ valid partition polygon or not, where "valid" can assume any of several meanings (e.g., convex or \f$ y\f$-monotone). \cgalHasModelsBegin -\cgalModels{CGAL::Is_convex_2} -\cgalModels{CGAL::Is_y_monotone_2} +\cgalHasModels{CGAL::Is_convex_2} +\cgalHasModels{CGAL::Is_y_monotone_2} \cgalHasModelsEnd \sa `CGAL::approx_convex_partition_2()` diff --git a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h index 7869a2122e90..aaf6d9eea5a2 100644 --- a/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h +++ b/Partition_2/doc/Partition_2/Concepts/YMonotonePartitionIsValidTraits_2.h @@ -7,7 +7,7 @@ by `y_monotone_partition_is_valid_2` for testing the validity of a \f$ y\f$-monotone partition of a polygon. \cgalHasModelsBegin -\cgalModels{CGAL::Partition_traits_2} +\cgalHasModels{CGAL::Partition_traits_2} \cgalHasModelsEnd \sa `CGAL::partition_is_valid_2()` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h index 0ae4f0fedcf7..f9a8d6be4d92 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2DelaunayTriangulationTraits_2.h @@ -28,7 +28,7 @@ dual functions are called. The additional predicate type `nearest_vertex(..)` are issued. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_2_Delaunay_triangulation_traits_2} +\cgalHasModels{CGAL::Periodic_2_Delaunay_triangulation_traits_2} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h index 172f176c7cfc..3ff8cfc2b53a 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2Offset_2.h @@ -8,7 +8,7 @@ The concept `Periodic_2Offset_2` describes a two-/dimensional integer vector with some specialized access functions and operations. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_2_offset_2} +\cgalHasModels{CGAL::Periodic_2_offset_2} \cgalHasModelsEnd \sa `Periodic_2TriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h index da6b89b93a27..41eb5dded8e6 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationFaceBase_2.h @@ -14,7 +14,7 @@ vertex \f$ i\f$. \cgalRefines{TriangulationFaceBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_2_triangulation_face_base_2} +\cgalHasModels{CGAL::Periodic_2_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h index 1d93a35edbef..658d1a104da1 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationTraits_2.h @@ -25,7 +25,7 @@ Periodic triangulation must fulfill the following requirements: \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_2_triangulation_traits_2} +\cgalHasModels{CGAL::Periodic_2_triangulation_traits_2} \cgalHasModelsEnd \sa `TriangulationTraits_2` diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h index eeae18dcd70e..f9d6f4cc5a62 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/Concepts/Periodic_2TriangulationVertexBase_2.h @@ -17,7 +17,7 @@ The storage of the offset is only needed when a triangulation is copied. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_2_triangulation_vertex_base_2} +\cgalHasModels{CGAL::Periodic_2_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h index 73f7d1339a52..27c90fd712bc 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomainWithFeatures_3.h @@ -23,7 +23,7 @@ Wrapping any model of `Periodic_3MeshDomain_3` with the class of `Periodic_3MeshDomainWithFeatures_3`. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_domain_with_polyline_features_3 >} +\cgalHasModels{CGAL::Mesh_domain_with_polyline_features_3 >} \cgalHasModelsEnd \sa `CGAL::Periodic_3_function_wrapper` diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h index b92341527b91..2d4ef680a92f 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Concepts/Periodic_3MeshDomain_3.h @@ -21,7 +21,7 @@ is a model of this concept. It is possible to create artificially periodic funct through the class `CGAL::Periodic_3_function_wrapper`. \cgalHasModelsBegin -\cgalModels{CGAL::Labeled_mesh_domain_3} +\cgalHasModels{CGAL::Labeled_mesh_domain_3} \cgalHasModelsEnd \sa `CGAL::Labeled_mesh_domain_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h index 571b9a0fa981..10eab7ef1c8c 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3DelaunayTriangulationTraits_3.h @@ -16,7 +16,7 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,DelaunayTriangulationTraits_3} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_Delaunay_triangulation_traits_3} +\cgalHasModels{CGAL::Periodic_3_Delaunay_triangulation_traits_3} \cgalHasModelsEnd In addition to the requirements described by the concepts diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h index 2cb71cf9bcc4..6de19e6a0d23 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3Offset_3.h @@ -7,7 +7,7 @@ The concept `Periodic_3Offset_3` describes a three-dimensional integer vector with some specialized access functions and operations. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_offset_3} +\cgalHasModels{CGAL::Periodic_3_offset_3} \cgalHasModelsEnd \sa `Periodic_3TriangulationTraits_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h index 05b10c71e021..1f2c12dbba3d 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSCellBase_3.h @@ -6,8 +6,8 @@ \cgalRefines{RegularTriangulationCellBase_3,Periodic_3TriangulationDSCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_cell_base_3 >} -\cgalModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 >} +\cgalHasModels{CGAL::Regular_triangulation_cell_base_3 >} +\cgalHasModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3 >} \cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h index be6214920cb8..a0ecbaa24e4f 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationDSVertexBase_3.h @@ -6,7 +6,7 @@ \cgalRefines{RegularTriangulationVertexBase_3,Periodic_3TriangulationDSVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_vertex_base_3 >} +\cgalHasModels{CGAL::Regular_triangulation_vertex_base_3 >} \cgalHasModelsEnd The template parameter `Periodic_3RegularTriangulationTraits_3` is expected to be the same as the diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h index cdc5a72ead57..b190e091be4a 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3RegularTriangulationTraits_3.h @@ -16,7 +16,7 @@ functor the version without offsets. \cgalRefines{Periodic_3TriangulationTraits_3,RegularTriangulationTraits_3} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_regular_triangulation_traits_3} +\cgalHasModels{CGAL::Periodic_3_regular_triangulation_traits_3} \cgalHasModelsEnd In addition to the requirements described for the traits class diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h index d6e735e497fd..5ce61b440a8a 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSCellBase_3.h @@ -19,7 +19,7 @@ does not contain any information. \cgalRefines{TriangulationDSCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_triangulation_ds_cell_base_3} +\cgalHasModels{CGAL::Periodic_3_triangulation_ds_cell_base_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h index 2665d89bdefa..fe9e98720263 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationDSVertexBase_3.h @@ -13,7 +13,7 @@ a vertex provides access to one of its incident cells through a handle. \cgalRefines{TriangulationDSVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_triangulation_ds_vertex_base_3} +\cgalHasModels{CGAL::Periodic_3_triangulation_ds_vertex_base_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3` diff --git a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h index 67b8f33a78a5..b25e098a01c0 100644 --- a/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h +++ b/Periodic_3_triangulation_3/doc/Periodic_3_triangulation_3/Concepts/Periodic_3TriangulationTraits_3.h @@ -15,7 +15,7 @@ functor the version without offsets. \cgalRefines{TriangulationTraits_3} \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_3_triangulation_traits_3} +\cgalHasModels{CGAL::Periodic_3_triangulation_traits_3} \cgalHasModelsEnd \sa `Periodic_3DelaunayTriangulationTraits_3` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h index 77501fa9399d..17efb2f35057 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicDelaunayTriangulationTraits_2.h @@ -13,7 +13,7 @@ by any class used to instantiate the first template parameter of the class `CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2} +\cgalHasModels{CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2} \cgalHasModelsEnd */ diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h index 92d62dfeeb2e..2ebf4a74bbd4 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationFaceBase_2.h @@ -21,7 +21,7 @@ Hyperbolic translations are represented by a nested type which is provided by th `Periodic_4HyperbolicDelaunayTriangulationTraits_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_4_hyperbolic_triangulation_face_base_2} +\cgalHasModels{CGAL::Periodic_4_hyperbolic_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h index 40b3cb0d34bc..5b3c5f915eb5 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Concepts/Periodic_4HyperbolicTriangulationVertexBase_2.h @@ -15,7 +15,7 @@ A boolean flag indicates whether the face stores a translation or not. The value set when storing or removing a translation. \cgalHasModelsBegin -\cgalModels{CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2} +\cgalHasModels{CGAL::Periodic_4_hyperbolic_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h index 6f58a4de0e89..c27e8b4a7067 100644 --- a/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h +++ b/Polygon/doc/Polygon/Concepts/GeneralPolygonWithHoles_2.h @@ -9,8 +9,8 @@ * the holes. * * \cgalHasModelsBegin - * \cgalModels{CGAL::General_polygon_with_holes_2} - * \cgalModels{CGAL::Polygon_with_holes_2} + * \cgalHasModels{CGAL::General_polygon_with_holes_2} + * \cgalHasModels{CGAL::Polygon_with_holes_2} * \cgalHasModelsEnd */ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h index 683f7f581368..03d52b5a8814 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPCorefinementVisitor.h @@ -7,7 +7,7 @@ /// /// \cgalRefines{CopyConstructible} /// \cgalHasModelsBegin -/// \cgalModels{CGAL::Polygon_mesh_processing::Corefinement::Default_visitor} +/// \cgalHasModels{CGAL::Polygon_mesh_processing::Corefinement::Default_visitor} /// \cgalHasModelsEnd class PMPCorefinementVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h index e524ca75ffe9..67b8b0294037 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPHolefillingVisitor.h @@ -10,7 +10,7 @@ /// /// \cgalRefines{CopyConstructible} /// \cgalHasModelsBegin -/// \cgalModels{CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor} +/// \cgalHasModels{CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor} /// \cgalHasModelsEnd class PMPHolefillingVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h index 0016e1cb8655..0308f62f5166 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPPolygonSoupOrientationVisitor.h @@ -8,7 +8,7 @@ /// /// \cgalRefines{CopyConstructible} /// \cgalHasModelsBegin -/// \cgalModels{CGAL::Polygon_mesh_processing::Default_orientation_visitor} +/// \cgalHasModels{CGAL::Polygon_mesh_processing::Default_orientation_visitor} /// \cgalHasModelsEnd class PMPPolygonSoupOrientationVisitor{ diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h index 3bc52ba8786e..d091f15fa64b 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPTriangulateFaceVisitor.h @@ -7,7 +7,7 @@ /// /// \cgalRefines{CopyConstructible} /// \cgalHasModelsBegin -/// \cgalModels{CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor} +/// \cgalHasModels{CGAL::Polygon_mesh_processing::Triangulate_faces::Default_visitor} /// \cgalHasModelsEnd diff --git a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h index d75b5d0b491e..f6b86ba2c1c4 100644 --- a/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h +++ b/Polyhedron/doc/Polyhedron/Concepts/PolyhedronItems_3.h @@ -14,9 +14,9 @@ polyhedral surface renames faces to facets. \cgalRefines{HalfedgeDSItems} \cgalHasModelsBegin -\cgalModels{CGAL::Polyhedron_items_3} -\cgalModels{CGAL::Polyhedron_min_items_3} -\cgalModels{CGAL::Polyhedron_items_with_id_3} +\cgalHasModels{CGAL::Polyhedron_items_3} +\cgalHasModels{CGAL::Polyhedron_min_items_3} +\cgalHasModels{CGAL::Polyhedron_items_with_id_3} \cgalHasModelsEnd \sa `CGAL::Polyhedron_3` diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h index bf8fb4b60ab6..94f5ed07797a 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationCostFunction.h @@ -13,9 +13,9 @@ preserve the overall polyline set shape as much as possible \cgalRefines{CopyConstructible,Assignable} \cgalHasModelsBegin -\cgalModels{CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost} -\cgalModels{CGAL::Polyline_simplification_2::Scaled_squared_distance_cost} -\cgalModels{CGAL::Polyline_simplification_2::Squared_distance_cost} +\cgalHasModels{CGAL::Polyline_simplification_2::Hybrid_squared_distance_cost} +\cgalHasModels{CGAL::Polyline_simplification_2::Scaled_squared_distance_cost} +\cgalHasModels{CGAL::Polyline_simplification_2::Squared_distance_cost} \cgalHasModelsEnd */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h index 5d95499fd69c..0c2ae58a59f5 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationStopPredicate.h @@ -6,9 +6,9 @@ Models of this concept are passed to the polyline simplification algorithm to in when to stop the process. \cgalHasModelsBegin -\cgalModels{CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold} -\cgalModels{CGAL::Polyline_simplification_2::Stop_below_count_threshold} -\cgalModels{CGAL::Polyline_simplification_2::Stop_above_cost_threshold} +\cgalHasModels{CGAL::Polyline_simplification_2::Stop_below_count_ratio_threshold} +\cgalHasModels{CGAL::Polyline_simplification_2::Stop_below_count_threshold} +\cgalHasModels{CGAL::Polyline_simplification_2::Stop_above_cost_threshold} \cgalHasModelsEnd */ diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h index e4d8d079a59d..19838b07ac72 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Concepts/PolylineSimplificationVertexBase_2.h @@ -9,7 +9,7 @@ whether a vertex can be removed, and the cost of the removal. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Polyline_simplification_2::Vertex_base_2} +\cgalHasModels{CGAL::Polyline_simplification_2::Vertex_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h index c1c13ad96405..d7d961ac56d9 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d.h @@ -32,7 +32,7 @@ is possible to select a certain variable. \sa `Polynomial_d` \cgalHasModelsBegin -\cgalModels{CGAL::Polynomial_traits_d} +\cgalHasModels{CGAL::Polynomial_traits_d} \cgalHasModelsEnd */ diff --git a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h index 2b41053230e8..e58552f582f2 100644 --- a/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h +++ b/Polynomial/doc/Polynomial/Concepts/Polynomial_d.h @@ -33,7 +33,7 @@ coefficient is a `Field` the polynomial is model of `EuclideanRing`. \sa `PolynomialTraits_d` \cgalHasModelsBegin -\cgalModels{CGAL::Polynomial} +\cgalHasModels{CGAL::Polynomial} \cgalHasModelsEnd */ diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h index a0b89952bc07..874782161e7a 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/AllFurthestNeighborsTraits_2.h @@ -8,10 +8,10 @@ needed to compute all furthest neighbors for the vertices of a convex polygon using the function `all_furthest_neighbors_2()`. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian} -\cgalModels{CGAL::Homogeneous} -\cgalModels{CGAL::Simple_cartesian} -\cgalModels{CGAL::Simple_homogeneous} +\cgalHasModels{CGAL::Cartesian} +\cgalHasModels{CGAL::Homogeneous} +\cgalHasModels{CGAL::Simple_cartesian} +\cgalHasModels{CGAL::Simple_homogeneous} \cgalHasModelsEnd \sa `CGAL::all_furthest_neighbors_2()` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h index 1198e0d98698..32004e174ba1 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/PolytopeDistanceDTraits.h @@ -7,9 +7,9 @@ This concept defines the requirements for traits classes of \f$ d\f$-dimensional optimisation algorithms. \cgalHasModelsBegin -\cgalModels{CGAL::Polytope_distance_d_traits_2} -\cgalModels{CGAL::Polytope_distance_d_traits_3} -\cgalModels{CGAL::Polytope_distance_d_traits_d} +\cgalHasModels{CGAL::Polytope_distance_d_traits_2} +\cgalHasModels{CGAL::Polytope_distance_d_traits_3} +\cgalHasModels{CGAL::Polytope_distance_d_traits_d} \cgalHasModelsEnd \sa `CGAL::Polytope_distance_d` diff --git a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h index 7295ea2e2969..5686aec87e15 100644 --- a/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h +++ b/Polytope_distance_d/doc/Polytope_distance_d/Concepts/WidthTraits_3.h @@ -13,7 +13,7 @@ width-algorithm to have access to the homogeneous representation of points. \cgalHasModelsBegin -\cgalModels{CGAL::Width_default_traits_3} +\cgalHasModels{CGAL::Width_default_traits_3} \cgalHasModelsEnd \sa `CGAL::Width_3` diff --git a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h index 206dbdb1a578..ce598886ee90 100644 --- a/QP_solver/doc/QP_solver/Concepts/LinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/LinearProgram.h @@ -36,9 +36,9 @@ iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. \cgalHasModelsBegin -\cgalModels{CGAL::Quadratic_program} -\cgalModels{CGAL::Quadratic_program_from_mps} -\cgalModels{CGAL::Linear_program_from_iterators} +\cgalHasModels{CGAL::Quadratic_program} +\cgalHasModels{CGAL::Quadratic_program_from_mps} +\cgalHasModels{CGAL::Linear_program_from_iterators} \cgalHasModelsEnd diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h index e9bbee8dadde..b9304ca07371 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeLinearProgram.h @@ -30,9 +30,9 @@ iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. \cgalHasModelsBegin -\cgalModels{CGAL::Quadratic_program} -\cgalModels{CGAL::Quadratic_program_from_mps} -\cgalModels{CGAL::Nonnegative_linear_program_from_iterators} +\cgalHasModels{CGAL::Quadratic_program} +\cgalHasModels{CGAL::Quadratic_program_from_mps} +\cgalHasModels{CGAL::Nonnegative_linear_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator @@ -40,9 +40,9 @@ types, respectively, for `A_iterator`) must be convertible to some common `IntegralDomain` `ET`. \cgalHasModelsBegin -\cgalModels{CGAL::Quadratic_program} -\cgalModels{CGAL::Quadratic_program_from_mps} -\cgalModels{CGAL::Nonnegative_linear_program_from_iterators} +\cgalHasModels{CGAL::Quadratic_program} +\cgalHasModels{CGAL::Quadratic_program_from_mps} +\cgalHasModels{CGAL::Nonnegative_linear_program_from_iterators} \cgalHasModelsEnd \sa `QuadraticProgram` diff --git a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h index 508ac094f4ab..07709e9da11f 100644 --- a/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/NonnegativeQuadraticProgram.h @@ -34,9 +34,9 @@ iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. \cgalHasModelsBegin -\cgalModels{CGAL::Quadratic_program} -\cgalModels{CGAL::Quadratic_program_from_mps} -\cgalModels{CGAL::Nonnegative_quadratic_program_from_iterators} +\cgalHasModels{CGAL::Quadratic_program} +\cgalHasModels{CGAL::Quadratic_program_from_mps} +\cgalHasModels{CGAL::Nonnegative_quadratic_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator diff --git a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h index 3b3ebe86f274..f5948e20519d 100644 --- a/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h +++ b/QP_solver/doc/QP_solver/Concepts/QuadraticProgram.h @@ -35,9 +35,9 @@ iterators over the program data, see below. The program therefore comes in dense representation which includes zero entries. \cgalHasModelsBegin -\cgalModels{CGAL::Quadratic_program} -\cgalModels{CGAL::Quadratic_program_from_mps} -\cgalModels{CGAL::Quadratic_program_from_iterators} +\cgalHasModels{CGAL::Quadratic_program} +\cgalHasModels{CGAL::Quadratic_program_from_mps} +\cgalHasModels{CGAL::Quadratic_program_from_iterators} \cgalHasModelsEnd The value types of all iterator types (nested iterator diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h index e29abc65d3b3..f436119cf12c 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplexWithFeatures_3InTriangulation_3.h @@ -49,7 +49,7 @@ of the input complex. \cgalRefines{MeshComplex_3InTriangulation_3} \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_complex_3_in_triangulation_3} +\cgalHasModels{CGAL::Mesh_complex_3_in_triangulation_3} \cgalHasModelsEnd \sa `MeshComplex_3InTriangulation_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h index 2bd6bf5d8e85..35a40e898e3d 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/MeshComplex_3InTriangulation_3.h @@ -43,7 +43,7 @@ and each boundary surface patch. The data structure encodes the final mesh at the end of the meshing process. \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_complex_3_in_triangulation_3} +\cgalHasModels{CGAL::Mesh_complex_3_in_triangulation_3} \cgalHasModelsEnd \sa `MeshDomain_3` diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h index 37c1aa8a1dfa..12332226a754 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h @@ -19,10 +19,10 @@ of the triangulation that are surface facets. \cgalRefines{TriangulationCellBase_3,CopyConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Compact_mesh_cell_base_3} -\cgalModels{CGAL::Mesh_cell_base_3} -\cgalModels{CGAL::Simplicial_mesh_cell_base_3} -\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} +\cgalHasModels{CGAL::Compact_mesh_cell_base_3} +\cgalHasModels{CGAL::Mesh_cell_base_3} +\cgalHasModels{CGAL::Simplicial_mesh_cell_base_3} +\cgalHasModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} \cgalHasModelsEnd */ diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h index accc2c9b77a8..24878f48bd4a 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h @@ -17,9 +17,9 @@ and to an index characteristic of this face. \cgalRefines{TriangulationVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Mesh_vertex_base_3} -\cgalModels{CGAL::Simplicial_mesh_vertex_base_3} -\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3} +\cgalHasModels{CGAL::Mesh_vertex_base_3} +\cgalHasModels{CGAL::Simplicial_mesh_vertex_base_3} +\cgalHasModels{CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3} \cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h index 900c6874eb39..7b6306927089 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Descriptor.h @@ -7,8 +7,8 @@ The concept `Descriptor` allows to describe a unique object in an abstract model \cgalRefines{DefaultConstructible,CopyConstructible,Assignable,EqualityComparable} \cgalHasModelsBegin -\cgalModels{Index} -\cgalModels{Handle} +\cgalHasModels{Index} +\cgalHasModels{Handle} \cgalHasModelsEnd */ diff --git a/STL_Extension/doc/STL_Extension/Concepts/Index.h b/STL_Extension/doc/STL_Extension/Concepts/Index.h index 4a3c749305d4..7b89ed870e37 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/Index.h +++ b/STL_Extension/doc/STL_Extension/Concepts/Index.h @@ -7,8 +7,8 @@ The concept `Index` is a refinement of `Descriptor` which must be convertible fr \cgalRefines{Descriptor} \cgalHasModelsBegin -\cgalModels{int} -\cgalModels{size_t} +\cgalHasModels{int} +\cgalHasModels{size_t} \cgalHasModelsEnd \cgalHeading{Notation} diff --git a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h index 55cd05e95da2..871f9dc3b1b8 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h +++ b/STL_Extension/doc/STL_Extension/Concepts/ProjectionObject.h @@ -13,19 +13,19 @@ concept `UnaryFunction`, but takes also care of (const) references. \cgalHasModelsBegin -\cgalModels{CGAL::Identity} -\cgalModels{CGAL::Dereference} -\cgalModels{CGAL::Get_address} -\cgalModels{CGAL::Cast_function_object} -\cgalModels{CGAL::Project_vertex} -\cgalModels{CGAL::Project_facet} -\cgalModels{CGAL::Project_point} -\cgalModels{CGAL::Project_normal} -\cgalModels{CGAL::Project_plane} -\cgalModels{CGAL::Project_next} -\cgalModels{CGAL::Project_prev} -\cgalModels{CGAL::Project_next_opposite} -\cgalModels{CGAL::Project_opposite_prev} +\cgalHasModels{CGAL::Identity} +\cgalHasModels{CGAL::Dereference} +\cgalHasModels{CGAL::Get_address} +\cgalHasModels{CGAL::Cast_function_object} +\cgalHasModels{CGAL::Project_vertex} +\cgalHasModels{CGAL::Project_facet} +\cgalHasModels{CGAL::Project_point} +\cgalHasModels{CGAL::Project_normal} +\cgalHasModels{CGAL::Project_plane} +\cgalHasModels{CGAL::Project_next} +\cgalHasModels{CGAL::Project_prev} +\cgalHasModels{CGAL::Project_next_opposite} +\cgalHasModels{CGAL::Project_opposite_prev} \cgalHasModelsEnd diff --git a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h index 89f447da3b52..c9780c602266 100644 --- a/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h +++ b/STL_Extension/doc/STL_Extension/Concepts/SurjectiveLockDataStructure.h @@ -22,7 +22,7 @@ is the \"thing\" that is locked when one tries to lock `object`. In the previous example, `S(point)` is the voxel containing `point`. \cgalHasModelsBegin -\cgalModels{CGAL::Spatial_lock_grid_3} +\cgalHasModels{CGAL::Spatial_lock_grid_3} \cgalHasModelsEnd */ diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h index 64979029e178..0f3004320b7b 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceMesher.h @@ -12,8 +12,8 @@ namespace Scale_space_reconstruction_3 { * points and that returns a set of facets. * * \cgalHasModelsBegin - * \cgalModels{CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher} - * \cgalModels{CGAL::Scale_space_reconstruction_3::Advancing_front_mesher} + * \cgalHasModels{CGAL::Scale_space_reconstruction_3::Alpha_shape_mesher} + * \cgalHasModels{CGAL::Scale_space_reconstruction_3::Advancing_front_mesher} * \cgalHasModelsEnd * */ diff --git a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h index 8eaa935ce3c9..20cac9eabdfc 100644 --- a/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h +++ b/Scale_space_reconstruction_3/doc/Scale_space_reconstruction_3/Concepts/ScaleSpaceSmoother.h @@ -16,8 +16,8 @@ namespace Scale_space_reconstruction_3 { * reconstruction algorithm. * * \cgalHasModelsBegin - * \cgalModels{CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother} - * \cgalModels{CGAL::Scale_space_reconstruction_3::Jet_smoother} + * \cgalHasModels{CGAL::Scale_space_reconstruction_3::Weighted_PCA_smoother} + * \cgalHasModels{CGAL::Scale_space_reconstruction_3::Jet_smoother} * \cgalHasModelsEnd */ class Smoother diff --git a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h index 75e97ae287bf..ede7918eb835 100644 --- a/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h +++ b/SearchStructures/doc/SearchStructures/Concepts/RangeSegmentTreeTraits_k.h @@ -10,12 +10,12 @@ are needed for window queries. \cgalHasModelsBegin -\cgalModels{CGAL::Range_segment_tree_set_traits_2} -\cgalModels{CGAL::Range_segment_tree_set_traits_3} -\cgalModels{CGAL::Range_tree_map_traits_2} -\cgalModels{CGAL::Range_tree_map_traits_3} -\cgalModels{CGAL::Segment_tree_map_traits_2} -\cgalModels{CGAL::Segment_tree_map_traits_3} +\cgalHasModels{CGAL::Range_segment_tree_set_traits_2} +\cgalHasModels{CGAL::Range_segment_tree_set_traits_3} +\cgalHasModels{CGAL::Range_tree_map_traits_2} +\cgalHasModels{CGAL::Range_tree_map_traits_3} +\cgalHasModels{CGAL::Segment_tree_map_traits_2} +\cgalHasModels{CGAL::Segment_tree_map_traits_3} \cgalHasModelsEnd \cgalHeading{Example} diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h index 15c80be49e4b..88e901da2041 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphDataStructure_2.h @@ -34,7 +34,7 @@ We only describe the additional requirements with respect to the \cgalRefines{ApolloniusGraphDataStructure_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_data_structure_2} +\cgalHasModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h index 4ae9eec2503c..98c4ddcd1bef 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphFaceBase_2.h @@ -10,7 +10,7 @@ requirements for the face base class of the \cgalRefines{TriangulationFaceBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_face_base_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_face_base_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h index d7a281a8d811..b33a87abea86 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphHierarchyVertexBase_2.h @@ -27,7 +27,7 @@ introduce any constructors in addition to those of the `SegmentDelaunayGraphVertexBase_2` concept. \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 >} +\cgalHasModels{CGAL::Segment_Delaunay_graph_hierarchy_vertex_base_2 >} \cgalHasModelsEnd \sa `SegmentDelaunayGraphDataStructure_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h index 65002722e6d7..879c81bdcc0b 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphSite_2.h @@ -9,7 +9,7 @@ requirements for the sites of a segment Delaunay graph. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_site_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_site_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h index fbe6887f2eb0..e6605fbcdacf 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageSite_2.h @@ -12,7 +12,7 @@ by storing handles to points instead of points. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_storage_site_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_storage_site_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h index e733426405d3..27ed7f806d6e 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphStorageTraits_2.h @@ -16,7 +16,7 @@ See section \ref Segment_Delaunay_graph_2StronglyIntersecting for more informati \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_storage_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_storage_traits_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h index 7297c1db8316..933124e25d19 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphTraits_2.h @@ -15,10 +15,10 @@ constructions for sites and several function object types for the predicates. \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_traits_2} -\cgalModels{CGAL::Segment_Delaunay_graph_traits_without_intersections_2} -\cgalModels{CGAL::Segment_Delaunay_graph_filtered_traits_2} -\cgalModels{CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_traits_without_intersections_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_filtered_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` diff --git a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h index 32b0b36ab17d..2651f8171fff 100644 --- a/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h +++ b/Segment_Delaunay_graph_2/doc/Segment_Delaunay_graph_2/Concepts/SegmentDelaunayGraphVertexBase_2.h @@ -12,7 +12,7 @@ site of the segment Delaunay graph and provides access to one of its incident faces through a `Face_handle`. \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_vertex_base_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_vertex_base_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphTraits_2` diff --git a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h index a384691661af..62c9a4f8f5b4 100644 --- a/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h +++ b/Segment_Delaunay_graph_Linf_2/doc/Segment_Delaunay_graph_Linf_2/Concepts/SegmentDelaunayGraphLinfTraits_2.h @@ -37,10 +37,10 @@ with respect to the \cgalRefines{SegmentDelaunayGraphTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Segment_Delaunay_graph_Linf_traits_2} -\cgalModels{CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2} -\cgalModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2} -\cgalModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_Linf_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_Linf_traits_without_intersections_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_Linf_filtered_traits_without_intersections_2} \cgalHasModelsEnd \sa `SegmentDelaunayGraphSite_2` diff --git a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h index 9005865d80e9..a8d30d3a47f4 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h +++ b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h @@ -13,7 +13,7 @@ Point and normal property maps have to be provided to extract the points and the normals from the input. \cgalHasModelsBegin -\cgalModels{CGAL::Shape_detection::Efficient_RANSAC_traits} +\cgalHasModels{CGAL::Shape_detection::Efficient_RANSAC_traits} \cgalHasModelsEnd */ class EfficientRANSACTraits{ diff --git a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h index 76926590b35f..f0522b061ef7 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h +++ b/Shape_detection/doc/Shape_detection/Concepts/NeighborQuery.h @@ -6,10 +6,10 @@ A concept that describes the set of methods used by the `CGAL::Shape_detection:: to access neighbors of an item. \cgalHasModelsBegin -\cgalModels{CGAL::Shape_detection::Point_set::K_neighbor_query} -\cgalModels{CGAL::Shape_detection::Point_set::Sphere_neighbor_query} -\cgalModels{CGAL::Shape_detection::Polygon_mesh::Polyline_graph} -\cgalModels{CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query} +\cgalHasModels{CGAL::Shape_detection::Point_set::K_neighbor_query} +\cgalHasModels{CGAL::Shape_detection::Point_set::Sphere_neighbor_query} +\cgalHasModels{CGAL::Shape_detection::Polygon_mesh::Polyline_graph} +\cgalHasModels{CGAL::Shape_detection::Polygon_mesh::One_ring_neighbor_query} \cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h index 09b97911b5db..e1f2551fa5b8 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/RegionType.h +++ b/Shape_detection/doc/Shape_detection/Concepts/RegionType.h @@ -8,13 +8,13 @@ to maintain a region. A region is represented by a set items, which are included in this region. \cgalHasModelsBegin -\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_line_fit_region} -\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region} -\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region} -\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region} -\cgalModels{CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region} -\cgalModels{CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region} -\cgalModels{CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region} +\cgalHasModels{CGAL::Shape_detection::Point_set::Least_squares_line_fit_region} +\cgalHasModels{CGAL::Shape_detection::Point_set::Least_squares_circle_fit_region} +\cgalHasModels{CGAL::Shape_detection::Point_set::Least_squares_plane_fit_region} +\cgalHasModels{CGAL::Shape_detection::Point_set::Least_squares_sphere_fit_region} +\cgalHasModels{CGAL::Shape_detection::Point_set::Least_squares_cylinder_fit_region} +\cgalHasModels{CGAL::Shape_detection::Segment_set::Least_squares_line_fit_region} +\cgalHasModels{CGAL::Shape_detection::Polygon_mesh::Least_squares_plane_fit_region} \cgalHasModelsEnd */ class RegionType { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h index cf96c3abe8e1..9803efdf5c20 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/ContourDirections.h @@ -11,9 +11,9 @@ contour edges towards these directions. All contour regularization functions in this package are parameterized by this concept. \cgalHasModelsBegin -\cgalModels{Contours::Longest_direction_2} -\cgalModels{Contours::Multiple_directions_2} -\cgalModels{Contours::User_defined_directions_2} +\cgalHasModels{Contours::Longest_direction_2} +\cgalHasModels{Contours::Multiple_directions_2} +\cgalHasModels{Contours::User_defined_directions_2} \cgalHasModelsEnd */ class ContourDirections { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h index f2cd1486593c..ebfa48ea7551 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/NeighborQuery.h @@ -10,7 +10,7 @@ A concept that describes the set of methods used by the class a geometric object being regularized. \cgalHasModelsBegin -\cgalModels{Segments::Delaunay_neighbor_query_2} +\cgalHasModels{Segments::Delaunay_neighbor_query_2} \cgalHasModelsEnd */ class NeighborQuery { diff --git a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h index ed3a10b5e285..bb3956c75a32 100644 --- a/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h +++ b/Shape_regularization/doc/Shape_regularization/Concepts/RegularizationType.h @@ -10,8 +10,8 @@ A concept that describes the set of methods used by the class required for setting up the the global regularization problem. \cgalHasModelsBegin -\cgalModels{Segments::Angle_regularization_2} -\cgalModels{Segments::Offset_regularization_2} +\cgalHasModels{Segments::Angle_regularization_2} +\cgalHasModels{Segments::Offset_regularization_2} \cgalHasModelsEnd */ class RegularizationType { diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h index 363d63a67750..e0d7e4196bb6 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurfaceTraits_3.h @@ -11,7 +11,7 @@ polyhedral mesh approximating a skin surface \cgalRefines{RegularTriangulationTraits_3} \cgalHasModelsBegin -\cgalModels{CGAL::Skin_surface_traits_3} +\cgalHasModels{CGAL::Skin_surface_traits_3} \cgalHasModelsEnd \sa `CGAL::Skin_surface_3` diff --git a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h index 22146acf83a4..58fef5d3800a 100644 --- a/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h +++ b/Skin_surface_3/doc/Skin_surface_3/Concepts/SkinSurface_3.h @@ -10,8 +10,8 @@ weighted points and a shrink factor. By default the input balls are grown in such that the skin surface wraps around the input balls. \cgalHasModelsBegin -\cgalModels{CGAL::Skin_surface_3} -\cgalModels{CGAL::Union_of_balls_3} +\cgalHasModels{CGAL::Skin_surface_3} +\cgalHasModels{CGAL::Union_of_balls_3} \cgalHasModelsEnd */ diff --git a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h index 49dd95d05338..5cc0f58e5969 100644 --- a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h +++ b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h @@ -12,7 +12,7 @@ some function object types for the required predicates on those primitives. \cgalRefines{ArrangementTraits_2} \cgalHasModelsBegin -\cgalModels{CGAL::Snap_rounding_traits_2} +\cgalHasModels{CGAL::Snap_rounding_traits_2} \cgalHasModelsEnd */ diff --git a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h index 7791fbf59a9a..8c22838c7ccc 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/DiagonalizeTraits.h @@ -20,7 +20,7 @@ For example, a matrix of dimension 3 is defined as \tparam dim Dimension of the matrices and vectors \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_diagonalize_traits} +\cgalHasModels{CGAL::Eigen_diagonalize_traits} \cgalHasModelsEnd */ template diff --git a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h index f73b3d143963..b20bbdcb36f9 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/MixedIntegerProgramTraits.h @@ -8,7 +8,7 @@ class MixedIntegerProgramTraits a Mixed Integer Programming (MIP) problem. \cgalHasModelsBegin -\cgalModels{CGAL::Variable} +\cgalHasModels{CGAL::Variable} \cgalHasModelsEnd */ template @@ -115,7 +115,7 @@ class MixedIntegerProgramVariable constraint in a Mixed Integer Programming (MIP) problem. \cgalHasModelsBegin -\cgalModels{CGAL::Linear_constraint} +\cgalHasModels{CGAL::Linear_constraint} \cgalHasModelsEnd */ template @@ -214,7 +214,7 @@ class MixedIntegerProgramLinearConstraint objective function in a Mixed Integer Programming (MIP) problem. \cgalHasModelsBegin -\cgalModels{CGAL::Linear_objective} +\cgalHasModels{CGAL::Linear_objective} \cgalHasModelsEnd */ template @@ -284,9 +284,9 @@ variables, linear objective, and linear constraints (if any) and provides a meth to solve the problem. \cgalHasModelsBegin -\cgalModels{CGAL::Mixed_integer_program_traits} -\cgalModels{CGAL::GLPK_mixed_integer_program_traits} -\cgalModels{CGAL::SCIP_mixed_integer_program_traits} +\cgalHasModels{CGAL::Mixed_integer_program_traits} +\cgalHasModels{CGAL::GLPK_mixed_integer_program_traits} +\cgalHasModels{CGAL::SCIP_mixed_integer_program_traits} \cgalHasModelsEnd */ template diff --git a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h index 49fb8ee1937e..11e2d309d261 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/NormalEquationSparseLinearAlgebraTraits_d.h @@ -8,7 +8,7 @@ Concept describing the set of requirements for solving the normal equation \f$ A \sa `SparseLinearAlgebraTraits_d` \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_solver_traits} +\cgalHasModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class NormalEquationSparseLinearAlgebraTraits_d diff --git a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h index 7ed6bf55f2b3..f03f5ed21cec 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/QuadraticProgramTraits.h @@ -25,7 +25,7 @@ where \f$ u_i \in \mathbb{R} \cup \{+\infty\} \f$ for all \f$ i \f$. \cgalHasModelsBegin -\cgalModels{CGAL::OSQP_quadratic_program_traits} +\cgalHasModels{CGAL::OSQP_quadratic_program_traits} \cgalHasModelsEnd */ class QuadraticProgramTraits { diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h index 9d236d47d3df..b44b686dbb88 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraTraits_d.h @@ -5,7 +5,7 @@ The concept `SparseLinearAlgebraTraits_d` is used to solve sparse linear systems A\f$ \times \f$ X = B. \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_solver_traits} +\cgalHasModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class SparseLinearAlgebraTraits_d @@ -65,7 +65,7 @@ by a sparse matrix. \cgalRefines{DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_vector} +\cgalHasModels{CGAL::Eigen_vector} \cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` @@ -134,8 +134,8 @@ NT& operator[](Index row); \cgalRefines{Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_sparse_matrix} -\cgalModels{CGAL::Eigen_sparse_symmetric_matrix} +\cgalHasModels{CGAL::Eigen_sparse_matrix} +\cgalHasModels{CGAL::Eigen_sparse_symmetric_matrix} \cgalHasModelsEnd \sa `SparseLinearAlgebraTraits_d` diff --git a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h index c8792ccab3a6..7c5f65cc824b 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SparseLinearAlgebraWithFactorTraits_d.h @@ -9,7 +9,7 @@ method to solve the system for different right-hand vectors. \cgalRefines{SparseLinearAlgebraTraits_d} \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_solver_traits} +\cgalHasModels{CGAL::Eigen_solver_traits} \cgalHasModelsEnd */ class SparseLinearAlgebraWithFactorTraits_d { diff --git a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h index cd0ec9832ee6..dfad56236b81 100644 --- a/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h +++ b/Solver_interface/doc/Solver_interface/Concepts/SvdTraits.h @@ -6,7 +6,7 @@ to solve in the least square sense a linear system with a singular value decomposition \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_svd} +\cgalHasModels{CGAL::Eigen_svd} \cgalHasModelsEnd */ class SvdTraits @@ -54,7 +54,7 @@ class SvdTraits Concept of vector type used by the concept `SvdTraits`. \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_vector} +\cgalHasModels{CGAL::Eigen_vector} \cgalHasModelsEnd */ class SvdTraits::Vector @@ -93,7 +93,7 @@ Concept of matrix type used by the concept `SvdTraits`. \cgalRefines{DefaultConstructible,Assignable} \cgalHasModelsBegin -\cgalModels{CGAL::Eigen_matrix} +\cgalHasModels{CGAL::Eigen_matrix} \cgalHasModelsEnd */ class SvdTraits::Matrix diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h index 6bf09d1211ae..99569575b999 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h @@ -9,8 +9,8 @@ e.g., for a Euclidean distance the transformed distance is the squared Euclidean distance. \cgalHasModelsBegin -\cgalModels{CGAL::Manhattan_distance_iso_box_point} -\cgalModels{CGAL::Euclidean_distance_sphere_point} +\cgalHasModels{CGAL::Manhattan_distance_iso_box_point} +\cgalHasModels{CGAL::Euclidean_distance_sphere_point} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h index a12b6e2a2447..658d58f77d29 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h @@ -9,8 +9,8 @@ E.g., for an Euclidean distance the transformed distance is the squared Euclidea \cgalRefines{GeneralDistance} \cgalHasModelsBegin -\cgalModels{CGAL::Euclidean_distance} -\cgalModels{CGAL::Weighted_Minkowski_distance} +\cgalHasModels{CGAL::Euclidean_distance} +\cgalHasModels{CGAL::Weighted_Minkowski_distance} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h index 22a34f8c6de4..d78a094006ea 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/RangeSearchTraits.h @@ -9,12 +9,12 @@ range search queries in a model of `SpatialTree`. \cgalRefines{SearchTraits} \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} -\cgalModels{CGAL::Search_traits_2} -\cgalModels{CGAL::Search_traits_3} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Search_traits_2} +\cgalHasModels{CGAL::Search_traits_3} \cgalHasModelsEnd \sa `SearchTraits` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h index 358c828ff6f8..ec5dcdae42dc 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SearchTraits.h @@ -6,14 +6,14 @@ The concept `SearchTraits` defines the requirements for the template parameter of the search classes. \cgalHasModelsBegin -\cgalModels{CGAL::Cartesian_d} -\cgalModels{CGAL::Homogeneous_d} -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} -\cgalModels{CGAL::Search_traits_2} -\cgalModels{CGAL::Search_traits_3} -\cgalModels{CGAL::Search_traits_d} -\cgalModels{CGAL::Search_traits} +\cgalHasModels{CGAL::Cartesian_d} +\cgalHasModels{CGAL::Homogeneous_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Search_traits_2} +\cgalHasModels{CGAL::Search_traits_3} +\cgalHasModels{CGAL::Search_traits_d} +\cgalHasModels{CGAL::Search_traits} \cgalHasModelsEnd \sa `RangeSearchTraits` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h index 357dbbfff468..32855bdf0449 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialSeparator.h @@ -12,7 +12,7 @@ other part of space is said to be on the positive side of the separator. \cgalHasModelsBegin -\cgalModels{CGAL::Plane_separator} +\cgalHasModels{CGAL::Plane_separator} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h index aa483a297805..0f505a4864a7 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/SpatialTree.h @@ -6,7 +6,7 @@ The concept `SpatialTree` defines the requirements for a tree supporting both neighbor searching and approximate range searching. \cgalHasModelsBegin -\cgalModels{CGAL::Kd_tree} +\cgalHasModels{CGAL::Kd_tree} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h index 6621186a2f7e..d4fc0cf64d62 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/Splitter.h @@ -8,13 +8,13 @@ The concept `Splitter` defines the requirements for a function object class impl \cgalAdvancedEnd \cgalHasModelsBegin -\cgalModels{CGAL::Fair} -\cgalModels{CGAL::Median_of_rectangle} -\cgalModels{CGAL::Median_of_max_spread} -\cgalModels{CGAL::Midpoint_of_rectangle} -\cgalModels{CGAL::Midpoint_of_max_spread} -\cgalModels{CGAL::Sliding_fair} -\cgalModels{CGAL::Sliding_midpoint} +\cgalHasModels{CGAL::Fair} +\cgalHasModels{CGAL::Median_of_rectangle} +\cgalHasModels{CGAL::Median_of_max_spread} +\cgalHasModels{CGAL::Midpoint_of_rectangle} +\cgalHasModels{CGAL::Midpoint_of_max_spread} +\cgalHasModels{CGAL::Sliding_fair} +\cgalHasModels{CGAL::Sliding_midpoint} \cgalHasModelsEnd */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h index f5f7270e043a..9d48912fb45d 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h @@ -8,7 +8,7 @@ The concept `PolygonOffsetBuilderTraits_2` describes the requirements for the ge required by the algorithm class `CGAL::Polygon_offset_builder_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Polygon_offset_builder_traits_2} +\cgalHasModels{CGAL::Polygon_offset_builder_traits_2} \cgalHasModelsEnd \sa `CGAL::Polygon_offset_builder_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h index 5df86d3e2a6b..0be531bf0bf0 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h @@ -8,7 +8,7 @@ The concept `StraightSkeletonBuilderTraits_2` describes the requirements for the geometric traits class required by the algorithm class `CGAL::Straight_skeleton_builder_2`. \cgalHasModelsBegin -\cgalModels{CGAL::Straight_skeleton_builder_traits_2} +\cgalHasModels{CGAL::Straight_skeleton_builder_traits_2} \cgalHasModelsEnd */ class StraightSkeletonBuilderTraits_2 { diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h index 7937ab435359..f18d851ce8b2 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilder_2_Visitor.h @@ -6,7 +6,7 @@ The concept `StraightSkeletonBuilder_2_Visitor` describes the requirements of th required by the algorithm class `CGAL::Straight_skeleton_builder_2` in its third template parameter. \cgalHasModelsBegin -\cgalModels{CGAL::Dummy_straight_skeleton_builder_2_visitor} +\cgalHasModels{CGAL::Dummy_straight_skeleton_builder_2_visitor} \cgalHasModelsEnd \sa `CGAL::Straight_skeleton_builder_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h index af125ad42f5e..2c476b2e20c5 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonFace_2.h @@ -9,7 +9,7 @@ The concept `StraightSkeletonFace_2` describes the requirements for the face typ with support for storage of the incident halfedge. \cgalHasModelsBegin -\cgalModels{CGAL::Straight_skeleton_face_base_2} +\cgalHasModels{CGAL::Straight_skeleton_face_base_2} \cgalHasModelsEnd \sa `StraightSkeletonVertex_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h index 67f6dafc5c44..d047dc14b53d 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonHalfedge_2.h @@ -13,7 +13,7 @@ in the contour and skeleton vertices. However, for any halfedge, there is a 2D s given by its `source` and `target` vertices. \cgalHasModelsBegin -\cgalModels{CGAL::Straight_skeleton_halfedge_base_2} +\cgalHasModels{CGAL::Straight_skeleton_halfedge_base_2} \cgalHasModelsEnd \sa `StraightSkeleton_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h index 0bf7cab0c87f..beb00c9b5201 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonItemsConverter_2.h @@ -7,7 +7,7 @@ as the third template argument to the class `Straight_skeleton_converter_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h index 29f50118cb4c..fac06961dec7 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h @@ -10,7 +10,7 @@ with support for storage of the incident halfedge. The `StraightSkeletonVertex_2 requires the geometric embedding to be a 2D point. \cgalHasModelsBegin -\cgalModels{CGAL::Straight_skeleton_vertex_base_2} +\cgalHasModels{CGAL::Straight_skeleton_vertex_base_2} \cgalHasModelsEnd \sa `StraightSkeletonHalfedge_2` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h index 9df0937e9ff4..3bcdaa2597df 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeleton_2.h @@ -10,7 +10,7 @@ used to represent a straight skeleton. It refines the concept `Vertex`, `Halfedge`, and `Face` of the halfedge data structure. \cgalHasModelsBegin -\cgalModels{CGAL::Straight_skeleton_2} +\cgalHasModels{CGAL::Straight_skeleton_2} \cgalHasModelsEnd \attention This concept explicitly protects all the modifying diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h index 9e23002f51d9..a04c6c6e5235 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/Integrator_2.h @@ -10,8 +10,8 @@ provides the operation that integrates a new point from a given point with a predefined step, and according to a specified vector. \cgalHasModelsBegin -\cgalModels{CGAL::Euler_integrator_2} -\cgalModels{CGAL::Runge_kutta_integrator_2} +\cgalHasModels{CGAL::Euler_integrator_2} +\cgalHasModels{CGAL::Runge_kutta_integrator_2} \cgalHasModelsEnd */ diff --git a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h index b79ed1e740fa..0cdfedfcb1c7 100644 --- a/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h +++ b/Stream_lines_2/doc/Stream_lines_2/Concepts/VectorField_2.h @@ -10,8 +10,8 @@ provides the types of the geometric primitives used in the placement of streamlines and some functions for answering different queries. \cgalHasModelsBegin -\cgalModels{CGAL::Regular_grid_2} -\cgalModels{CGAL::Triangular_field_2} +\cgalHasModels{CGAL::Regular_grid_2} +\cgalHasModels{CGAL::Triangular_field_2} \cgalHasModelsEnd */ diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h index ea351a5d2ba1..21326e8a37cc 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/DQQMask_3.h @@ -12,7 +12,7 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} \cgalHasModelsBegin -\cgalModels{CGAL::DooSabin_mask_3} +\cgalHasModels{CGAL::DooSabin_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h index 15a337e68c97..3397ef818feb 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PQQMask_3.h @@ -12,7 +12,7 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} \cgalHasModelsBegin -\cgalModels{CGAL::CatmullClark_mask_3} +\cgalHasModels{CGAL::CatmullClark_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h index 190f970bd007..2e799fb59520 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/PTQMask_3.h @@ -11,7 +11,7 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} \cgalHasModelsBegin -\cgalModels{CGAL::Loop_mask_3} +\cgalHasModels{CGAL::Loop_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h index 72823a073e1b..2cd7648f6373 100644 --- a/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h +++ b/Subdivision_method_3/doc/Subdivision_method_3/Concepts/Sqrt3Mask_3.h @@ -10,7 +10,7 @@ policy concept of geometric computations is used in \cgalRefines{SubdivisionMask_3} \cgalHasModelsBegin -\cgalModels{CGAL::Sqrt3_mask_3} +\cgalHasModels{CGAL::Sqrt3_mask_3} \cgalHasModelsEnd \sa `CGAL::Subdivision_method_3` diff --git a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h index f6e59cdaf67f..11f66968daec 100644 --- a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h +++ b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Concepts/ErrorMetricProxy.h @@ -7,8 +7,8 @@ computes the fitting error from a face to a proxy, and fits a proxy from a range of faces. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_approximation::L21_metric_plane_proxy} -\cgalModels{CGAL::Surface_mesh_approximation::L2_metric_plane_proxy} +\cgalHasModels{CGAL::Surface_mesh_approximation::L21_metric_plane_proxy} +\cgalHasModels{CGAL::Surface_mesh_approximation::L2_metric_plane_proxy} \cgalHasModelsEnd */ diff --git a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h index 4332ebda74b1..5a8a704883d4 100644 --- a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h +++ b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/DeformationClosestRotationTraits_3.h @@ -10,8 +10,8 @@ to implement models of this concept. \cgalRefines{DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Deformation_Eigen_closest_rotation_traits_3} -\cgalModels{CGAL::Deformation_Eigen_polar_closest_rotation_traits_3} +\cgalHasModels{CGAL::Deformation_Eigen_closest_rotation_traits_3} +\cgalHasModels{CGAL::Deformation_Eigen_polar_closest_rotation_traits_3} \cgalHasModelsEnd */ diff --git a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h index 35a8d8a2e1a4..cf9b2957984b 100644 --- a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h +++ b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Concepts/Parameterizer_3.h @@ -13,16 +13,16 @@ the border of a given mesh. Construction and destruction are undefined. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3} -\cgalModels{CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Fixed_border_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::ARAP_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Discrete_authalic_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::LSCM_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Circular_border_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Square_border_parameterizer_3} +\cgalHasModels{CGAL::Surface_mesh_parameterization::Two_vertices_parameterizer_3} \cgalHasModelsEnd \sa `CGAL::Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3` diff --git a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h index 9724634b10ff..dd08086b4a5f 100644 --- a/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h +++ b/Surface_mesh_shortest_path/doc/Surface_mesh_shortest_path/Concepts/SurfaceMeshShortestPathTraits.h @@ -9,7 +9,7 @@ predicates, and constructions required by the traits class parameter of \cgalRefines{CopyConstructible,Assignable} \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_shortest_path_traits} +\cgalHasModels{CGAL::Surface_mesh_shortest_path_traits} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h index 2bd7a6bd2017..907b5db3dd05 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetCost.h @@ -13,9 +13,9 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_simplification::Edge_length_cost} -\cgalModels{CGAL::Surface_mesh_simplification::LindstromTurk_cost} -\cgalModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} +\cgalHasModels{CGAL::Surface_mesh_simplification::Edge_length_cost} +\cgalHasModels{CGAL::Surface_mesh_simplification::LindstromTurk_cost} +\cgalHasModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h index cf87c5e2400d..5fdf445d9bef 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/GetPlacement.h @@ -15,11 +15,11 @@ or can be intentionally returned to prevent the edge from being collapsed. \cgalRefines{DefaultConstructible,CopyConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_simplification::Midpoint_placement} -\cgalModels{CGAL::Surface_mesh_simplification::LindstromTurk_placement} -\cgalModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} -\cgalModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_placement} -\cgalModels{CGAL::Surface_mesh_simplification::Constrained_placement} +\cgalHasModels{CGAL::Surface_mesh_simplification::Midpoint_placement} +\cgalHasModels{CGAL::Surface_mesh_simplification::LindstromTurk_placement} +\cgalHasModels{CGAL::Surface_mesh_simplification::GarlandHeckbert_policies} +\cgalHasModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_placement} +\cgalHasModels{CGAL::Surface_mesh_simplification::Constrained_placement} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h index 6f53b84171e8..193320241021 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/PlacementFilter.h @@ -15,8 +15,8 @@ be absent). The value `boost::none` indicates that the edge should not be collap \cgalRefines{DefaultConstructible,CopyConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_filter} -\cgalModels{CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter} +\cgalHasModels{CGAL::Surface_mesh_simplification::Bounded_normal_change_filter} +\cgalHasModels{CGAL::Surface_mesh_simplification::Polyhedral_envelope_filter} \cgalHasModelsEnd */ diff --git a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h index 9a51402119c5..e09a0c1f03bb 100644 --- a/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h +++ b/Surface_mesh_simplification/doc/Surface_mesh_simplification/Concepts/StopPredicate.h @@ -5,11 +5,11 @@ The concept `StopPredicate` describes the requirements for the predicate which indicates if the simplification process must finish. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_simplification::Edge_count_stop_predicate} -\cgalModels{CGAL::Surface_mesh_simplification::Face_count_stop_predicate} -\cgalModels{CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate} -\cgalModels{CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate} -\cgalModels{CGAL::Surface_mesh_simplification::Edge_length_stop_predicate} +\cgalHasModels{CGAL::Surface_mesh_simplification::Edge_count_stop_predicate} +\cgalHasModels{CGAL::Surface_mesh_simplification::Face_count_stop_predicate} +\cgalHasModels{CGAL::Surface_mesh_simplification::Edge_count_ratio_stop_predicate} +\cgalHasModels{CGAL::Surface_mesh_simplification::Face_count_ratio_stop_predicate} +\cgalHasModels{CGAL::Surface_mesh_simplification::Edge_length_stop_predicate} \cgalHasModelsEnd */ diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h index 3dcc8a0dedf5..fbf8c2662c75 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshCellBase_3.h @@ -38,8 +38,8 @@ triangulation. In the following we call surface center of a facet, the center of its biggest Delaunay surface ball. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_cell_base_3} -\cgalModels{CGAL::Surface_mesh_default_triangulation_3::Cell} +\cgalHasModels{CGAL::Surface_mesh_cell_base_3} +\cgalHasModels{CGAL::Surface_mesh_default_triangulation_3::Cell} \cgalHasModelsEnd \sa `SurfaceMeshTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h index 35b923bbb8b5..185c14e9e9d8 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshComplex_2InTriangulation_3.h @@ -31,7 +31,7 @@ parameter in the function template `CGAL::make_surface_mesh()`. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_complex_2_in_triangulation_3} +\cgalHasModels{CGAL::Surface_mesh_complex_2_in_triangulation_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h index 0f3431af56cb..ecc980a35cf2 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshFacetsCriteria_3.h @@ -34,7 +34,7 @@ with lowest quality first. The qualities are computed by a function `is_bad(const Facet& f, const Quality& q)`. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_default_criteria_3} +\cgalHasModels{CGAL::Surface_mesh_default_criteria_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h index 672f74669488..412f6503b704 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshTraits_3.h @@ -12,7 +12,7 @@ points if any exists. The concept `SurfaceMeshTraits_3` also includes a funcctor a small set of initial points on the surface. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_traits_generator_3::type} +\cgalHasModels{CGAL::Surface_mesh_traits_generator_3::type} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h index 32663ac10ddf..1889afd3c84c 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/SurfaceMeshVertexBase_3.h @@ -32,8 +32,8 @@ complex facets incident to the vertex and the number of connected components of the adjacency graph of those facets. \cgalHasModelsBegin -\cgalModels{CGAL::Surface_mesh_vertex_base_3} -\cgalModels{CGAL::Surface_mesh_default_triangulation_3::Vertex} +\cgalHasModels{CGAL::Surface_mesh_vertex_base_3} +\cgalHasModels{CGAL::Surface_mesh_default_triangulation_3::Vertex} \cgalHasModelsEnd \sa `SurfaceMeshComplex_2InTriangulation_3` diff --git a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h index 4b4d11da894f..04f2064c682a 100644 --- a/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h +++ b/Surface_mesher/doc/Surface_mesher/Concepts/Surface_3.h @@ -9,7 +9,7 @@ are required to be copy constructible and assignable. \cgalHasModelsBegin -\cgalModels{CGAL::Implicit_surface_3} +\cgalHasModels{CGAL::Implicit_surface_3} \cgalHasModelsEnd \sa `CGAL::make_surface_mesh()` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h index e1dc359a13f0..be2cbf0b6cea 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h @@ -49,7 +49,7 @@ actually uses as a base class for the class `CGAL::Triangulation_data_structure_2::Face`. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_face_base_2} +\cgalHasModels{CGAL::Triangulation_ds_face_base_2} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h index 994a0f82b9b0..6c5cbe4c7e62 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDSVertexBase_2.h @@ -45,7 +45,7 @@ actually uses as a base class for the class of `CGAL::Triangulation_data_structure_2::Vertex`. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_vertex_base_2} +\cgalHasModels{CGAL::Triangulation_ds_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` diff --git a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h index a07310740957..5b458bc32504 100644 --- a/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h +++ b/TDS_2/doc/TDS_2/Concepts/TriangulationDataStructure_2.h @@ -65,7 +65,7 @@ When dimension \f$ <\f$ 2, the same information is output for faces of maximal dimension instead of faces. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_data_structure_2} +\cgalHasModels{CGAL::Triangulation_data_structure_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2::Face` @@ -729,7 +729,7 @@ call the `create_vertex()` and `delete_vertex()` methods of the triangulation data structure. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_vertex_base_2} +\cgalHasModels{CGAL::Triangulation_ds_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_2` @@ -852,7 +852,7 @@ have to be used to define new faces and to delete no longer used faces. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_face_base_2} +\cgalHasModels{CGAL::Triangulation_ds_face_base_2} \cgalHasModelsEnd \sa `TriangulationDSFaceBase_2` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h index 8f8ec146dbf9..4b5865363813 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSCellBase_3.h @@ -34,7 +34,7 @@ which are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_cell_base_3} +\cgalHasModels{CGAL::Triangulation_ds_cell_base_3} \cgalHasModelsEnd \sa `TriangulationDSVertexBase_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h index 0a9d10b04bff..3e3e58e37ea0 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDSVertexBase_3.h @@ -29,7 +29,7 @@ are used as base classes for the final vertex and cell classes. More information can be found in Section \ref TDS3secdesign. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_vertex_base_3} +\cgalHasModels{CGAL::Triangulation_ds_vertex_base_3} \cgalHasModelsEnd \sa `TriangulationDSCellBase_3` diff --git a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h index c3a7ba38023d..bdd21ca6d4ba 100644 --- a/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h +++ b/TDS_3/doc/TDS_3/Concepts/TriangulationDataStructure_3.h @@ -66,7 +66,7 @@ list of cells. When dimension < 3, the same information is stored for faces of maximal dimension instead of cells. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_data_structure_3} +\cgalHasModels{CGAL::Triangulation_data_structure_3} \cgalHasModelsEnd \sa `TriangulationDataStructure_3::Vertex` diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h index 342e203e2598..ca104a809883 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingCellBase_3.h @@ -7,7 +7,7 @@ Cell base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. \cgalHasModelsBegin -\cgalModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} +\cgalHasModels{CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3} \cgalHasModelsEnd */ diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h index 2ce117b8ff32..484782a65470 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Concepts/RemeshingVertexBase_3.h @@ -7,7 +7,7 @@ Vertex base concept to be used in the triangulation type given to the function `CGAL::tetrahedral_isotropic_remeshing()`. \cgalHasModelsBegin -\cgalModels{Tetrahedral_remeshing::Remeshing_vertex_base_3} +\cgalHasModels{Tetrahedral_remeshing::Remeshing_vertex_base_3} \cgalHasModelsEnd */ diff --git a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h index 1dd4fa17d49f..5432de4a1f2c 100644 --- a/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/DelaunayTriangulationTraits.h @@ -10,8 +10,8 @@ a Delaunay triangulation. It corresponds to the first template parameter of the \cgalRefines{TriangulationTraits} \cgalHasModelsBegin -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `TriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h index 1afb3084639a..8180b4f3007a 100644 --- a/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/RegularTriangulationTraits.h @@ -10,8 +10,8 @@ a regular triangulation. It corresponds to the first template parameter of the c \cgalRefines{TriangulationTraits} \cgalHasModelsBegin -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `TriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h index b72f4ee1fd0a..3a582c7ba0fa 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFace.h @@ -16,7 +16,7 @@ The dimension of a face is implicitly set when first two vertices (`i = 0` and `i = 1`), then the dimension is 1. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_face} +\cgalHasModels{CGAL::Triangulation_face} \cgalHasModelsEnd \sa `TriangulationDSFullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h index 231e29f5a08f..df9d474ea4b5 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSFullCell.h @@ -37,8 +37,8 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::FullCell} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_full_cell} -\cgalModels{CGAL::Triangulation_full_cell} +\cgalHasModels{CGAL::Triangulation_ds_full_cell} +\cgalHasModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `TriangulationDSVertex` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h index 51fb7cad627c..f9be6db63661 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDSVertex.h @@ -37,8 +37,8 @@ of `CGAL::Triangulation_data_structure::Vertex`. \cgalRefines{TriangulationDataStructure::Vertex} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_vertex} -\cgalModels{CGAL::Triangulation_vertex} +\cgalHasModels{CGAL::Triangulation_ds_vertex} +\cgalHasModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \sa `TriangulationDSFullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h index a8da6d398490..6ab5522df502 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationDataStructure.h @@ -70,7 +70,7 @@ The classes `Vertex` and (possibly empty). \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_data_structure} +\cgalHasModels{CGAL::Triangulation_data_structure} \cgalHasModelsEnd \sa `TriangulationDataStructure::Vertex` @@ -663,8 +663,8 @@ only, as geometry is not concerned here. In particular, we only require that the vertex holds a handle to a full cell incident to it in the triangulation. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_vertex} -\cgalModels{CGAL::Triangulation_vertex} +\cgalHasModels{CGAL::Triangulation_ds_vertex} +\cgalHasModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` @@ -772,8 +772,8 @@ are said to be adjacent when they share a facet. Adjacent full cells are called hereafter neighbors. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_ds_full_cell} -\cgalModels{CGAL::Triangulation_full_cell} +\cgalHasModels{CGAL::Triangulation_ds_full_cell} +\cgalHasModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `TriangulationDataStructure::FullCell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h index 95cac2eab13c..ff141326debb 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationFullCell.h @@ -11,7 +11,7 @@ represent a full cell. additional specific requirements of `TriangulationFullCell`} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_full_cell} +\cgalHasModels{CGAL::Triangulation_full_cell} \cgalHasModelsEnd \sa `CGAL::Triangulation_full_cell` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h index 198e3a736502..660b270a1013 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationTraits.h @@ -15,8 +15,8 @@ then optimized using spatial sorting. This is not required if the points are inserted one by one. \cgalHasModelsBegin -\cgalModels{CGAL::Epick_d} -\cgalModels{CGAL::Epeck_d} +\cgalHasModels{CGAL::Epick_d} +\cgalHasModels{CGAL::Epeck_d} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits` diff --git a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h index 457339f28b0e..9648500277a1 100644 --- a/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h +++ b/Triangulation/doc/Triangulation/Concepts/TriangulationVertex.h @@ -13,7 +13,7 @@ Compared to ::TriangulationDSVertex, the main difference is the addition of an association of the vertex with a geometric point. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_vertex} +\cgalHasModels{CGAL::Triangulation_vertex} \cgalHasModelsEnd \cgalHeading{Input/Output} diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h index 73951fc22c16..50e30987b42e 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/ConstrainedTriangulationFaceBase_2.h @@ -20,7 +20,7 @@ constraints. Defines the same types as the `TriangulationFaceBase_2` concept \cgalHasModelsBegin -\cgalModels{CGAL::Constrained_triangulation_face_base_2} +\cgalHasModels{CGAL::Constrained_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h index 4ec205577472..7602ca70584e 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationFaceBase_2.h @@ -35,7 +35,7 @@ in the face a list to store hidden vertices. \cgalRefines{TriangulationFaceBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_face_base_2} +\cgalHasModels{CGAL::Regular_triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationFaceBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h index feee66c0b110..5cbfa1b9442e 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/RegularTriangulationVertexBase_2.h @@ -36,7 +36,7 @@ vertex of the triangulation or a hidden vertex. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_vertex_base_2} +\cgalHasModels{CGAL::Regular_triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h index 9a364975955b..e83d910e4a41 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationFaceBase_2.h @@ -17,7 +17,7 @@ and only provided for symmetry with the vertex case. \cgalRefines{TriangulationDSFaceBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_face_base_2} +\cgalHasModels{CGAL::Triangulation_face_base_2} \cgalHasModelsEnd \sa `TriangulationVertexBase_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h index 83e3992d81ce..416da371080e 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationHierarchyVertexBase_2.h @@ -15,7 +15,7 @@ next and previous level triangulations. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_hierarchy_vertex_base_2} +\cgalHasModels{CGAL::Triangulation_hierarchy_vertex_base_2} \cgalHasModelsEnd \sa `CGAL::Triangulation_hierarchy_2` diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h index 8cca35af421a..63ffeab1a29a 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBaseWithInfo_2.h @@ -9,7 +9,7 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_vertex_base_with_info_2} +\cgalHasModels{CGAL::Triangulation_vertex_base_with_info_2} \cgalHasModelsEnd */ diff --git a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h index 9790b02cecc3..94e5c7da0a0c 100644 --- a/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h +++ b/Triangulation_2/doc/Triangulation_2/Concepts/TriangulationVertexBase_2.h @@ -16,7 +16,7 @@ the vertex base of a triangulation stores a point. \cgalRefines{TriangulationDSVertexBase_2} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_vertex_base_2} +\cgalHasModels{CGAL::Triangulation_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h index b71b96cc4392..fdb8b9ee8703 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationCellBase_3.h @@ -12,8 +12,8 @@ in the cell an operator that computes its circumcenter. \cgalRefines{TriangulationCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_triangulation_cell_base_3} -\cgalModels{CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3} +\cgalHasModels{CGAL::Delaunay_triangulation_cell_base_3} +\cgalHasModels{CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3} \cgalHasModelsEnd \sa `DelaunayTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h index 3493e4ef1faf..3a7514fab6ae 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/DelaunayTriangulationTraits_3.h @@ -11,13 +11,13 @@ predicates and constructions on these objects. \cgalRefines{TriangulationTraits_3} \cgalHasModelsBegin -\cgalModels{CGAL::Exact_predicates_inexact_constructions_kernel (recommended)} -\cgalModels{CGAL::Exact_predicates_exact_constructions_kernel (recommended for Voronoi)} -\cgalModels{CGAL::Filtered_kernel} -\cgalModels{CGAL::Cartesian} -\cgalModels{CGAL::Simple_cartesian} -\cgalModels{CGAL::Homogeneous} -\cgalModels{CGAL::Simple_homogeneous} +\cgalHasModels{CGAL::Exact_predicates_inexact_constructions_kernel (recommended)} +\cgalHasModels{CGAL::Exact_predicates_exact_constructions_kernel (recommended for Voronoi)} +\cgalHasModels{CGAL::Filtered_kernel} +\cgalHasModels{CGAL::Cartesian} +\cgalHasModels{CGAL::Simple_cartesian} +\cgalHasModels{CGAL::Homogeneous} +\cgalHasModels{CGAL::Simple_homogeneous} \cgalHasModelsEnd In addition to the requirements described for the traits class of diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h index cd00268b2b91..6851d616de3e 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBaseWithWeightedCircumcenter_3.h @@ -20,7 +20,7 @@ circumcenter by calling `invalidate_weighted_circumcenter_cache()`. \cgalRefines{RegularTriangulationCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3} +\cgalHasModels{CGAL::Regular_triangulation_cell_base_with_weighted_circumcenter_3} \cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h index b95816da2963..ffafd4be04ee 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationCellBase_3.h @@ -36,7 +36,7 @@ and an operator to compute its weighted circumcenter. \cgalRefines{TriangulationCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_cell_base_3} +\cgalHasModels{CGAL::Regular_triangulation_cell_base_3} \cgalHasModelsEnd \sa `RegularTriangulationTraits_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h index 09d9ce0a0fc0..3e5f0e3ba47b 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/RegularTriangulationVertexBase_3.h @@ -10,7 +10,7 @@ by adding a geometric point member. \cgalRefines{TriangulationDSVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Regular_triangulation_vertex_base_3} +\cgalHasModels{CGAL::Regular_triangulation_vertex_base_3} \cgalHasModelsEnd \sa `RegularTriangulationCellBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h index 84add9f98c93..e7d5d046a083 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBaseWithInfo_3.h @@ -9,7 +9,7 @@ and provides an additional information storage. \cgalRefines{TriangulationCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_cell_base_with_info_3} +\cgalHasModels{CGAL::Triangulation_cell_base_with_info_3} \cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h index 8b26efc32c47..f405c54afbaa 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationCellBase_3.h @@ -11,8 +11,8 @@ structure apply. \cgalRefines{TriangulationDSCellBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_cell_base_3} -\cgalModels{CGAL::Triangulation_cell_base_with_info_3} +\cgalHasModels{CGAL::Triangulation_cell_base_3} +\cgalHasModels{CGAL::Triangulation_cell_base_with_info_3} \cgalHasModelsEnd \sa `TriangulationVertexBase_3` diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h index 37e2fd97140c..06b02f5c227d 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBaseWithInfo_3.h @@ -9,7 +9,7 @@ and provides an additional information storage. \cgalRefines{TriangulationVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_vertex_base_with_info_3} +\cgalHasModels{CGAL::Triangulation_vertex_base_with_info_3} \cgalHasModelsEnd */ diff --git a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h index 5110b87d71f1..45955a3a8f0e 100644 --- a/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h +++ b/Triangulation_3/doc/Triangulation_3/Concepts/TriangulationVertexBase_3.h @@ -10,8 +10,8 @@ for the triangulation data structure. \cgalRefines{TriangulationDSVertexBase_3} \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_vertex_base_3} -\cgalModels{CGAL::Triangulation_vertex_base_with_info_3} +\cgalHasModels{CGAL::Triangulation_vertex_base_3} +\cgalHasModels{CGAL::Triangulation_vertex_base_with_info_3} \cgalHasModelsEnd \sa `TriangulationCellBase_3` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h index df1da8edad50..6c4dcec4016a 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/DelaunayTriangulationOnSphereTraits_2.h @@ -12,8 +12,8 @@ To the requirements listed within the concept `TriangulationOnSphereTraits_2`, this concept adds types and functors requirements related to build the dual on the sphere. \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} -\cgalModels{CGAL::Projection_on_sphere_traits_3} +\cgalHasModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} +\cgalHasModels{CGAL::Projection_on_sphere_traits_3} \cgalHasModelsEnd */ class DelaunayTriangulationOnSphereTraits_2 diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h index 5e49109a4da4..b87fe2a5deb4 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereFaceBase_2.h @@ -20,7 +20,7 @@ In this case, fictitious faces are added to the triangulation, called ghost f such that the triangulation is a topological sphere. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_on_sphere_face_base_2} +\cgalHasModels{CGAL::Triangulation_on_sphere_face_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h index ea94dfc395c4..4ccc0171175d 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereTraits_2.h @@ -14,8 +14,8 @@ In particular, the traits class is expected to contain information about the sph on which the points of the triangulation lie, as well as to provide means to change this information. \cgalHasModelsBegin -\cgalModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} -\cgalModels{CGAL::Projection_on_sphere_traits_3} +\cgalHasModels{CGAL::Delaunay_triangulation_on_sphere_traits_2} +\cgalHasModels{CGAL::Projection_on_sphere_traits_3} \cgalHasModelsEnd \sa `DelaunayTriangulationOnSphereTraits_2` diff --git a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h index 23f0fbce9e0c..721c593a9402 100644 --- a/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h +++ b/Triangulation_on_sphere_2/doc/Triangulation_on_sphere_2/Concepts/TriangulationOnSphereVertexBase_2.h @@ -10,7 +10,7 @@ It refines the concept `TriangulationDSVertexBase_2`, adding geometric informati the vertex base of a triangulation stores a point. \cgalHasModelsBegin -\cgalModels{CGAL::Triangulation_on_sphere_vertex_base_2} +\cgalHasModels{CGAL::Triangulation_on_sphere_vertex_base_2} \cgalHasModelsEnd \sa `TriangulationDataStructure_2` diff --git a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h index a39c04b2179b..0ec12be02973 100644 --- a/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h +++ b/Visibility_2/doc/Visibility_2/Concepts/Visibility_2.h @@ -7,9 +7,9 @@ A model of the `Visibility_2` concept can be attached to an `Arrangement_2` inst answer visibility queries within the faces of this arrangement. \cgalHasModelsBegin -\cgalModels{CGAL::Simple_polygon_visibility_2} -\cgalModels{CGAL::Rotational_sweep_visibility_2} -\cgalModels{CGAL::Triangular_expansion_visibility_2} +\cgalHasModels{CGAL::Simple_polygon_visibility_2} +\cgalHasModels{CGAL::Rotational_sweep_visibility_2} +\cgalHasModels{CGAL::Triangular_expansion_visibility_2} \cgalHasModelsEnd */ diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h index bec40a64a9f5..22bf669821e0 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationPolicy_2.h @@ -14,15 +14,15 @@ graph they take as an argument, the last ones does. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Identity_policy_2} -\cgalModels{CGAL::Apollonius_graph_degeneracy_removal_policy_2} -\cgalModels{CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2} -\cgalModels{CGAL::Delaunay_triangulation_degeneracy_removal_policy_2} -\cgalModels{CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2} -\cgalModels{CGAL::Regular_triangulation_degeneracy_removal_policy_2} -\cgalModels{CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2} -\cgalModels{CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2} -\cgalModels{CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Identity_policy_2} +\cgalHasModels{CGAL::Apollonius_graph_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Apollonius_graph_caching_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Delaunay_triangulation_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Delaunay_triangulation_caching_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Regular_triangulation_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Regular_triangulation_caching_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_caching_degeneracy_removal_policy_2} \cgalHasModelsEnd \sa `DelaunayGraph_2` diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h index 452c25d3e022..56bc3b66ed64 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Concepts/AdaptationTraits_2.h @@ -12,10 +12,10 @@ tag is provided for determining whether this functor is defined or not. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} \cgalHasModelsBegin -\cgalModels{CGAL::Apollonius_graph_adaptation_traits_2} -\cgalModels{CGAL::Delaunay_triangulation_adaptation_traits_2} -\cgalModels{CGAL::Regular_triangulation_adaptation_traits_2} -\cgalModels{CGAL::Segment_Delaunay_graph_adaptation_traits_2} +\cgalHasModels{CGAL::Apollonius_graph_adaptation_traits_2} +\cgalHasModels{CGAL::Delaunay_triangulation_adaptation_traits_2} +\cgalHasModels{CGAL::Regular_triangulation_adaptation_traits_2} +\cgalHasModels{CGAL::Segment_Delaunay_graph_adaptation_traits_2} \cgalHasModelsEnd \sa `DelaunayGraph_2` diff --git a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h index 76104f359294..0a59f4ae4e16 100644 --- a/Weights/doc/Weights/Concepts/BarycentricWeights_2.h +++ b/Weights/doc/Weights/Concepts/BarycentricWeights_2.h @@ -6,9 +6,9 @@ A concept that describes the set of methods required in all classes used in the computation of 2D generalized barycentric weights. \cgalHasModelsBegin -\cgalModels{CGAL::Weights::Wachspress_weights_2} -\cgalModels{CGAL::Weights::Mean_value_weights_2} -\cgalModels{CGAL::Weights::Discrete_harmonic_weights_2} +\cgalHasModels{CGAL::Weights::Wachspress_weights_2} +\cgalHasModels{CGAL::Weights::Mean_value_weights_2} +\cgalHasModels{CGAL::Weights::Discrete_harmonic_weights_2} \cgalHasModelsEnd */ class BarycentricWeights_2 { From 7ec586ca736d070fb904252a043b4b85bc761cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 10:47:17 +0200 Subject: [PATCH 0496/1398] Temporary workaround the selection item emitting way too many signals --- .../Plugins/Display/Heat_method_plugin.cpp | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp index 7ba691b6cf14..fc6d564379b2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Heat_method_plugin.cpp @@ -605,18 +605,25 @@ private Q_SLOTS: sm_item->setRenderingMode(GouraudPlusEdges); sm_item->redraw(); - scene->addItem(heat_item); - scene->setSelectedItem(scene->item_id(sm_item)); + auto heat_item_id = scene->addItem(heat_item); + scene->setSelectedItem(heat_item_id); // any change of sm_item destroys everything - connect(sm_item, &Scene_surface_mesh_item::itemChanged, - this, [this, sm_item, heat_item]() - { - sm_item->resetColors(); - removePluginProperties(sm_item); - scene->erase(scene->item_id(heat_item)); - onItemIndicesSelected(scene->selectionIndices()); - }); + + // @todo do not emit itemChanged when the colors are reset + // @todo with qt6, single connection can be performed with `static_cast(Qt::SingleShotConnection)` + // see https://www.kdab.com/single-shot-connections/ + auto connection = std::make_shared(); + *connection = connect(sm_item, &Scene_surface_mesh_item::itemChanged, + this, [this, sm_item, heat_item, connection]() + { + QObject::disconnect(*connection); + + sm_item->resetColors(); + removePluginProperties(sm_item); + scene->erase(scene->item_id(heat_item)); + onItemIndicesSelected(scene->selectionIndices()); + }); connect(sm_item, &Scene_surface_mesh_item::aboutToBeDestroyed, this, [this, heat_item]() @@ -765,7 +772,8 @@ private Q_SLOTS: Scene_polyhedron_selection_item* source_vertices = new Scene_polyhedron_selection_item(sm_item, mw); source_vertices->setName(tr("%1 (source vertices)").arg(sm_item->name())); - scene->addItem(source_vertices); + auto source_vertices_id = scene->addItem(source_vertices); + scene->setSelectedItem(source_vertices_id); link_mesh_and_selection(sm_item, source_vertices); From e11bbab4f64f5601d94e3f18bffa9dd9fbc9b291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:32:52 +0200 Subject: [PATCH 0497/1398] De-compactify Simplicial_mesh_cell_base_3 Give it a cell base instead of re-implementing everything. --- SMDS_3/examples/SMDS_3/c3t3_example.cpp | 2 +- .../CGAL/Simplicial_mesh_cell_base_3.h | 234 ++++-------------- SMDS_3/test/SMDS_3/test_simplicial_cb_vb.cpp | 2 +- 3 files changed, 52 insertions(+), 186 deletions(-) diff --git a/SMDS_3/examples/SMDS_3/c3t3_example.cpp b/SMDS_3/examples/SMDS_3/c3t3_example.cpp index 14501c395c1b..5ebb5cc3e358 100644 --- a/SMDS_3/examples/SMDS_3/c3t3_example.cpp +++ b/SMDS_3/examples/SMDS_3/c3t3_example.cpp @@ -21,7 +21,7 @@ using Surface_patch_index = unsigned char; using Curve_index = char; using Corner_index = short; -using Cb = CGAL::Simplicial_mesh_cell_base_3; +using Cb = CGAL::Simplicial_mesh_cell_base_3; using Vb = CGAL::Simplicial_mesh_vertex_base_3; diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h index ee49f5722364..b1a16d1b8f09 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h @@ -32,187 +32,48 @@ namespace CGAL { -// Class Simplicial_mesh_cell_3 -// Cell base class used for tetrahedral remeshing -// Adds information to Cb about the cell of the input complex containing it -template< class Subdomain_index_, - class Surface_patch_index_, - class TDS> +template class Simplicial_mesh_cell_3 + : public Cb { public: - using Triangulation_data_structure = TDS; - using Vertex_handle = typename TDS::Vertex_handle; - using Cell_handle = typename TDS::Cell_handle; - using Vertex = typename TDS::Vertex; - using Cell = typename TDS::Cell; - using TDS_data = typename TDS::Cell_data; + using Vertex_handle = typename Cb::Vertex_handle; + using Cell_handle = typename Cb::Cell_handle; + + using Geom_traits = Gt; // Index Type - using Subdomain_index = Subdomain_index_; - using Surface_patch_index = Surface_patch_index_; + using Subdomain_index = SubdomainIndex; + using Surface_patch_index = SurfacePatchIndex; public: - // Constructors Simplicial_mesh_cell_3() : time_stamp_(std::size_t(-1)) {} Simplicial_mesh_cell_3(const Simplicial_mesh_cell_3& rhs) - : N(rhs.N) - , V(rhs.V) - , time_stamp_(rhs.time_stamp_) - , subdomain_index_(rhs.subdomain_index_) + : Cb(static_cast(rhs)), + time_stamp_(rhs.time_stamp_), + subdomain_index_(rhs.subdomain_index_) { - for(int i=0; i <4; i++){ + for(int i=0; i <4; ++i) surface_index_table_[i] = rhs.surface_index_table_[i]; - } - } - - Simplicial_mesh_cell_3(Vertex_handle v0, - Vertex_handle v1, - Vertex_handle v2, - Vertex_handle v3) - : V(CGAL::make_array(v0, v1, v2, v3)) - { - } - - Simplicial_mesh_cell_3(Vertex_handle v0, - Vertex_handle v1, - Vertex_handle v2, - Vertex_handle v3, - Cell_handle n0, - Cell_handle n1, - Cell_handle n2, - Cell_handle n3) - : N(CGAL::make_array(n0, n1, n2, n3)) - , V(CGAL::make_array(v0, v1, v2, v3)) - { - } - - // ACCESS FUNCTIONS - Vertex_handle vertex(int i) const - { - CGAL_precondition( i >= 0 && i <= 3 ); - return V[i]; - } - - bool has_vertex(Vertex_handle v) const - { - return (V[0] == v) || (V[1] == v) || (V[2]== v) || (V[3]== v); - } - - bool has_vertex(Vertex_handle v, int & i) const - { - if (v == V[0]) { i = 0; return true; } - if (v == V[1]) { i = 1; return true; } - if (v == V[2]) { i = 2; return true; } - if (v == V[3]) { i = 3; return true; } - return false; - } - - int index(Vertex_handle v) const - { - if (v == V[0]) { return 0; } - if (v == V[1]) { return 1; } - if (v == V[2]) { return 2; } - CGAL_assertion( v == V[3] ); - return 3; - } - - Cell_handle neighbor(int i) const - { - CGAL_precondition( i >= 0 && i <= 3); - return N[i]; - } - - bool has_neighbor(Cell_handle n) const - { - return (N[0] == n) || (N[1] == n) || (N[2] == n) || (N[3] == n); - } - - bool has_neighbor(Cell_handle n, int & i) const - { - if(n == N[0]){ i = 0; return true; } - if(n == N[1]){ i = 1; return true; } - if(n == N[2]){ i = 2; return true; } - if(n == N[3]){ i = 3; return true; } - return false; } - int index(Cell_handle n) const - { - if (n == N[0]) return 0; - if (n == N[1]) return 1; - if (n == N[2]) return 2; - CGAL_assertion( n == N[3] ); - return 3; - } - - // SETTING - void set_neighbor(int i, Cell_handle n) - { - CGAL_precondition( i >= 0 && i <= 3); - CGAL_precondition( this != n.operator->() ); - N[i] = n; - } + Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3) + : Cb(v0, v1, v2, v3) + { } - void set_neighbors() - { - N[0] = N[1] = N[2] = N[3] = Cell_handle(); - } - - void set_neighbors(Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) - { - CGAL_precondition( this != n0.operator->() ); - CGAL_precondition( this != n1.operator->() ); - CGAL_precondition( this != n2.operator->() ); - CGAL_precondition( this != n3.operator->() ); - N[0] = n0; - N[1] = n1; - N[2] = n2; - N[3] = n3; - } - - // CHECKING - - // the following trivial is_valid allows - // the user of derived cell base classes - // to add their own purpose checking - bool is_valid(bool = false, int = 0) const - { return true; } - - // For use by Compact_container. - void * for_compact_container() const { return N[0].for_compact_container(); } - void for_compact_container(void *p) { N[0].for_compact_container(p); } - - // TDS internal data access functions. - TDS_data& tds_data() { return _tds_data; } - const TDS_data& tds_data() const { return _tds_data; } - - // We must override the functions that modify the vertices. - // And if the point inside a vertex is modified, we fail, - // but there's not much we can do for this now. - void set_vertex(int i, Vertex_handle v) - { - CGAL_precondition( i >= 0 && i <= 3); - V[i] = v; - } - - void set_vertices() - { - V[0] = V[1] = V[2] = V[3] = Vertex_handle(); - } - - void set_vertices(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) - { - V[0] = v0; - V[1] = v1; - V[2] = v2; - V[3] = v3; - } + Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3, + Cell_handle n0, Cell_handle n1, + Cell_handle n2, Cell_handle n3) + : Cb(v0, v1, v2, v3, n0, n1, n2, n3) + { } // Returns the index of the cell of the input complex that contains the cell Subdomain_index subdomain_index() const { return subdomain_index_; } @@ -284,25 +145,22 @@ class Simplicial_mesh_cell_3 /// Stores surface_index for each facet of the cell std::array surface_index_table_ = {}; - std::array N; - std::array V; - std::size_t time_stamp_; // The index of the cell of the input complex that contains me Subdomain_index subdomain_index_ = {}; - TDS_data _tds_data; - public: - friend std::istream& operator>>(std::istream &is, Simplicial_mesh_cell_3 &c) + friend std::istream& operator>>(std::istream& is, + Simplicial_mesh_cell_3& c) { Subdomain_index index; if(IO::is_ascii(is)) is >> index; else read(is, index); + if(is) { c.set_subdomain_index(index); for(int i = 0; i < 4; ++i) @@ -321,7 +179,8 @@ class Simplicial_mesh_cell_3 } friend - std::ostream& operator<<(std::ostream &os, const Simplicial_mesh_cell_3&c) + std::ostream& operator<<(std::ostream& os, + const Simplicial_mesh_cell_3& c) { if(IO::is_ascii(os)) os << c.subdomain_index(); @@ -348,20 +207,24 @@ It is designed to serve as cell base class for.3D simplicial mesh data structure It stores and gives access to data about the complex the cell belongs to, such as the subdomain it belongs to or surface it takes part to. -\tparam Subdomain_index Type of indices for subdomains of the discretized geometric domain. +\tparam Gt is the geometric traits class. +It must be a model of the concept `TriangulationTraits_3` + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `EqualityComparable`. The default constructed value must match the label of the exterior of the domain (which contains at least the unbounded component). - It must match the `Subdomain_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. -\tparam Surface_patch_index Type of indices for surface patches (boundaries and interfaces) +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) of the discretized geometric domain. Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `EqualityComparable`. The default constructed value must be the index value assigned to a non surface facet. - It must match the `Surface_patch_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\tparam Cb is the cell base class from which `Simplicial_mesh_cell_base_3` derives. +It must be a model of the concept `TriangulationCellBase_3`. \cgalModels `SimplicialMeshCellBase_3` @@ -370,21 +233,24 @@ assigned to a non surface facet. \sa `MeshDomain_3` \sa `MeshDomainWithFeatures_3` */ -template +template > class Simplicial_mesh_cell_base_3 { public: template struct Rebind_TDS { - typedef Simplicial_mesh_cell_3 Other; + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_cell_3; }; }; -} // end namespace CGAL - +} // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_CELL_BASE_3_H diff --git a/SMDS_3/test/SMDS_3/test_simplicial_cb_vb.cpp b/SMDS_3/test/SMDS_3/test_simplicial_cb_vb.cpp index 4f3531c5fcb4..e438200b9aaf 100644 --- a/SMDS_3/test/SMDS_3/test_simplicial_cb_vb.cpp +++ b/SMDS_3/test/SMDS_3/test_simplicial_cb_vb.cpp @@ -19,7 +19,7 @@ using Surface_patch_index = std::pair; using Curve_index = char; using Corner_index = short; -using Cb = CGAL::Simplicial_mesh_cell_base_3; +using Cb = CGAL::Simplicial_mesh_cell_base_3; using Vb = CGAL::Simplicial_mesh_vertex_base_3; From 4e824edf32556207c27fbb6f67f7ce11c3d64ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:35:56 +0200 Subject: [PATCH 0498/1398] Improve doc of Simplicial_vertex_base_3 --- .../CGAL/Simplicial_mesh_vertex_base_3.h | 98 +++++++++---------- 1 file changed, 46 insertions(+), 52 deletions(-) diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index 3f1a9c92d428..3fbea1748537 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -29,22 +29,20 @@ #include #include + #include namespace CGAL { -//Class Simplicial_mesh_vertex_3 -//Adds information to Vb about the localization of the vertex in regards -//to the 3D input complex. -//\cgalModels `SimplicialMeshVertexBase_3` -template +// Adds information to Vb about the localization of the vertex in regards to the 3D input complex. +template class Simplicial_mesh_vertex_3 -: public Vb + : public Vb { private : using Cmvb3_base = Vb; @@ -53,10 +51,16 @@ private : using Vertex_handle = typename Vb::Vertex_handle; // Types + using Subdomain_index = SubdomainIndex; + using Surface_patch_index = SurfacePatchIndex; + using Curve_index = CurveIndex; + using Corner_index = CornerIndex; + using Index = boost::variant; - using FT = typename GT::FT; - // Constructor + using FT = typename Gt::FT; + +public: Simplicial_mesh_vertex_3() : Vb() , number_of_incident_facets_(0) @@ -215,39 +219,34 @@ index of the subcomplex it belongs to. \tparam Gt is the geometric traits class. It must be a model of the concept `TriangulationTraits_3` -\tparam Subdomain_index Type of indices for subdomains of the discretized geometric domain. +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `EqualityComparable`. The default constructed value must match the label of the exterior of the domain (which contains at least the unbounded component). - It must match the `Subdomain_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. -\tparam Surface_patch_index Type of indices for surface patches (boundaries and interfaces) +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) of the discretized geometric domain. Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `EqualityComparable`. The default constructed value must be the index value assigned to a non surface facet. - It must match the `Surface_patch_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. -\tparam Curve_index Type of indices for curves (i.e. \f$ 1\f$-dimensional features) +\tparam CurveIndex Type of indices for curves (i.e. \f$ 1\f$-dimensional features) of the discretized geometric domain. Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `LessThanComparable`. The default constructed value must be the value for an edge which does not approximate a 1-dimensional feature of the geometric domain. - It must match the `Curve_index` types of the model - of the `MeshDomainWithFeatures_3` concept when used for mesh generation. +It must match `MeshDomainWithFeatures_3::Curve_index` when used for mesh generation. -\tparam Corner_index Type of indices for corners (i.e.\f$ 0\f$--dimensional features) +\tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) of the discretized geometric domain. It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `LessThanComparable`. - It must match the `Corner_index` of the model - of the `MeshDomainWithFeatures_3` concept when used for mesh generation. +It must match `MeshDomainWithFeatures_3::Corner_index` when used for mesh generation. -\tparam Vb is the vertex base class. It has to be a model -of the concept `TriangulationVertexBase_3` and defaults to -`Triangulation_vertex_base_3`. +\tparam Vb is the vertex base class from which `Simplicial_mesh_vertex_base_3` derives. +It must be a model of the concept `TriangulationVertexBase_3`. \cgalModels `SimplicialMeshVertexBase_3` @@ -256,33 +255,28 @@ of the concept `TriangulationVertexBase_3` and defaults to \sa `MeshDomain_3` \sa `MeshDomainWithFeatures_3` */ -template > -struct Simplicial_mesh_vertex_base_3 +template > +class Simplicial_mesh_vertex_base_3 { - using Triangulation_data_structure = internal::Dummy_tds_3; - using Vertex_handle = typename Triangulation_data_structure::Vertex_handle; - using Cell_handle = typename Triangulation_data_structure::Cell_handle; - - template < class TDS3 > - struct Rebind_TDS { - using Vb3 = typename Vb::template Rebind_TDS::Other; - using Other = Simplicial_mesh_vertex_3 ; +public: + template + struct Rebind_TDS + { + using Vb2 = typename Vb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_vertex_3; }; }; - -} // end namespace CGAL - - +} // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_VERTEX_BASE_3_H From 50fa1ee4def7a418f578c041095f9446aa2bbe2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:36:39 +0200 Subject: [PATCH 0499/1398] Various fixes for Remeshing_cell_base_3: - Restore its correct API (as in CGAL 5.5): two templates, a traits, and a cell base. - It is not a model of SimplicialMeshCellBase_3, but of RemeshingCellBase_3 - It should not hardcode an inheritance to Simplicial_cell_base_3, but take it as a template paramter's default value. - Use FT instead of hardcoding 'double' --- .../Remeshing_cell_base_3.h | 74 +++++++++---------- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index d82378827267..30de338cdf7b 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -17,34 +17,35 @@ #include -namespace CGAL -{ -namespace Tetrahedral_remeshing -{ +#include + +namespace CGAL { +namespace Tetrahedral_remeshing { -template +template class Remeshing_cell_3 - : public CGAL::Simplicial_mesh_cell_3 + : public Cb { -private: - using Base = CGAL::Simplicial_mesh_cell_3; +public: + using FT = typename Gt::FT; + + using Vertex_handle = typename Cb::Vertex_handle; + using Cell_handle = typename Cb::Cell_handle; + + using Geom_traits = Gt; public: - using Base::Base; + using Cb::Cb; // constructors - void set_sliver_value(double value) +public: + void set_sliver_value(const FT value) { sliver_cache_validity_ = true; sliver_value_ = value; } - double sliver_value() const + FT sliver_value() const { CGAL_assertion(is_cache_valid()); return sliver_value_; @@ -54,51 +55,42 @@ class Remeshing_cell_3 void reset_cache_validity() const { sliver_cache_validity_ = false; } private: - double sliver_value_ = 0.; + FT sliver_value_ = 0.; mutable bool sliver_cache_validity_ = false; }; /*! \ingroup PkgTetrahedralRemeshingClasses -The class `Remeshing_cell_base_3` is a model of the concept `SimplicialMeshCellBase_3`. +The class `Remeshing_cell_base_3` is a model of the concept `RemeshingCellBase_3`. It is designed to serve as cell base class for the 3D triangulation used in the tetrahedral remeshing process. -\tparam Subdomain_index Type of indices for subdomains of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must match the label -of the exterior of the domain (which contains at least the unbounded component). - It must match the `Subdomain_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. - -\tparam Surface_patch_index Type of indices for surface patches (boundaries and interfaces) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must be the index value -assigned to a non surface facet. - It must match the `Surface_patch_index` of the model - of the `MeshDomain_3` concept when used for mesh generation. +\tparam Gt is the geometric traits class. +It has to be a model of the concept `RemeshingTriangulationTraits_3`. + +\tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. +It must be a model of the `SimplicialMeshCellBase_3` concept. \cgalModels `RemeshingCellBase_3` -\cgalModels `SimplicialMeshCellBase_3` */ -template +template > class Remeshing_cell_base_3 { public: template struct Rebind_TDS { - typedef Remeshing_cell_3 Other; + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Remeshing_cell_3; }; }; -}//end namespace Tetrahedral_remeshing -}//end namespace CGAL +} // namespace Tetrahedral_remeshing +} // namespace CGAL #endif //CGAL_TET_ADAPTIVE_REMESHING_CELL_BASE_3_H From c0d0c0d01f691b9e77ba22a1b08b89e6cddcbd6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:39:17 +0200 Subject: [PATCH 0500/1398] Fix API of Remeshing_vertex_base_3: It needs only to document a traits and a vertex base, not expose index types as these are relevant to the Simplicial_vertex_base_3 class, which is not the systematic base. It is a model of RemeshingVertexBase_3, not MeshVertexBase_3 The base needs to be a model of SimplicialVertexBase_3, not TriangulationCellBase_3 Use the proper Rebind mechanism like the other vertex/cell classes --- .../Remeshing_triangulation_3.h | 2 +- .../Remeshing_vertex_base_3.h | 57 +++++++++++-------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h index 7b2bb34f9cf3..3abdc9f034d6 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h @@ -52,7 +52,7 @@ and `Parallel_if_available_tag`. template, - typename Cb = Remeshing_cell_base_3<> + typename Cb = Remeshing_cell_base_3 > class Remeshing_triangulation_3 : public CGAL::Triangulation_3 > diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h index b828ffb08d1d..faab3950f9a0 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h @@ -17,44 +17,51 @@ #include -namespace CGAL -{ -namespace Tetrahedral_remeshing +namespace CGAL { +namespace Tetrahedral_remeshing { + +template +class Remeshing_vertex_3 + : public Vb { +public: + using Vb::Vb; // constructors +}; /*! \ingroup PkgTetrahedralRemeshingClasses -The class `Remeshing_vertex_base_3` is a model of the concept `MeshVertexBase_3`. +The class `Remeshing_vertex_base_3` is a model of the concept `RemeshingVertexBase_3`. It is designed to serve as vertex base class for the 3D triangulation used in the tetrahedral remeshing process. \tparam Gt is the geometric traits class. -It has to be a model of the concept `RemeshingTriangulationTraits_3`. +It must be a model of the concept `RemeshingTriangulationTraits_3`. \tparam Vb is a vertex base class from which `Remeshing_vertex_base_3` derives. -It must be a model of the `TriangulationVertexBase_3` concept. -It has the default value `Triangulation_vertex_base_3`. +It must be a model of the concept `SimplicialMeshVertexBase_3`. \cgalModels `RemeshingVertexBase_3` -\cgalModels `SimplicialMeshVertexBase_3` */ -template > -using Remeshing_vertex_base_3 - = CGAL::Simplicial_mesh_vertex_base_3; - -}//end namespace Tetrahedral_remeshing - -}//end namespace CGAL +template > +class Remeshing_vertex_base_3 +{ +public: + template + struct Rebind_TDS + { + using Vb2 = typename Vb::template Rebind_TDS::Other; + using Other = Remeshing_vertex_3; + }; +}; + +} // namespace Tetrahedral_remeshing +} // namespace CGAL #endif //CGAL_TET_ADAPTIVE_REMESHING_VERTEX_BASE_3_H From ce9fa95e2b60349875704976aad5456646d633d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:42:45 +0200 Subject: [PATCH 0501/1398] Fixes for the doc of tetrahedral remeshing --- .../include/CGAL/tetrahedral_remeshing.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tetrahedral_remeshing/include/CGAL/tetrahedral_remeshing.h b/Tetrahedral_remeshing/include/CGAL/tetrahedral_remeshing.h index edd23bc2967b..f1be0dcf844a 100644 --- a/Tetrahedral_remeshing/include/CGAL/tetrahedral_remeshing.h +++ b/Tetrahedral_remeshing/include/CGAL/tetrahedral_remeshing.h @@ -61,7 +61,7 @@ namespace CGAL * subdomains throughout the remeshing process. * * Subdomains are defined by indices that -* are stored in the cells of the input triangulation, following the `MeshCellBase_3` +* are stored in the cells of the input triangulation, following the `SimplicialMeshCellBase_3` * concept (refined by `RemeshingCellBase_3`). * The surfacic interfaces between subdomains are formed by facets whose two incident cells * have different subdomain indices. @@ -302,14 +302,14 @@ void tetrahedral_isotropic_remeshing( * @tparam Tr is the underlying triangulation for `Mesh_complex_3_in_triangulation_3`. * It can be instantiated with any 3D regular triangulation of CGAL provided * that its vertex and cell base classes are models of the concepts -* `MeshVertexBase_3` (refined by `RemeshingCellBase_3`) -* and `MeshCellBase_3` (refined by `RemeshingVertexBase_3`), respectively. +* `SimplicialMeshCellBase_3` (refined by `RemeshingCellBase_3`) +* and `SimplicialMeshVertexBase_3` (refined by `RemeshingVertexBase_3`), respectively. * @tparam CornerIndex is the type of the indices for feature corners. * If `c3t3` has been generated using `CGAL::make_mesh_3()`, it must match -* the `Corner_index` type of the model of the `MeshDomainWithFeatures_3` concept used for mesh generation. +* `MeshDomainWithFeatures_3::Corner_index`. * @tparam CurveIndex is the type of the indices for feature curves. * If `c3t3` has been generated using `CGAL::make_mesh_3()`, it must match -* the `Curve_index` type of the model of the `MeshDomainWithFeatures_3` concept used for mesh generation. +* `MeshDomainWithFeatures_3::Curve_index`. * * @param c3t3 the complex containing the triangulation to be remeshed. */ From 796baca1c59a5d87b413855aec9d30c9214c23e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 19 Jul 2023 22:43:14 +0200 Subject: [PATCH 0502/1398] Misc minor cleaning --- .../Concepts/SimplicialMeshCellBase_3.h | 14 +++---- .../Concepts/SimplicialMeshVertexBase_3.h | 2 +- .../CGAL/Mesh_complex_3_in_triangulation_3.h | 2 +- .../CGAL/Simplicial_mesh_cell_base_3.h | 39 ++++++++++--------- .../CGAL/Simplicial_mesh_vertex_base_3.h | 10 ++--- .../Remeshing_triangulation_3.h | 4 +- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h index ff424c1281da..6748b8d4ebc6 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshCellBase_3.h @@ -4,14 +4,12 @@ The concept `SimplicialMeshCellBase_3` describes the requirements for the `TriangulationDataStructure_3::Cell` type of the triangulation -used in the 3D simplicial mesh data structure. The type `SimplicialMeshCellBase_3` -refines the concept `TriangulationCellBase_3` -and must be copy constructible. -The concept `SimplicialMeshCellBase_3` -includes a way to store and retrieve -if a given cell of the triangulation is inside a subdomain or not, -and which subdomain it belongs to -in case of a multi-domain. +used in a 3D simplicial mesh data structure. + +The type `SimplicialMeshCellBase_3` refines the concept `TriangulationCellBase_3` +and must be copy constructible. The concept `SimplicialMeshCellBase_3` includes a way to store and +retrieve if a given cell of the triangulation is inside a subdomain or not, and which subdomain it +belongs to in case of a multi-domain. Moreover, this concept adds four markers per cell to mark the facets of the triangulation that are surface facets. diff --git a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h index ad034bbb9823..aaba99a51605 100644 --- a/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h +++ b/SMDS_3/doc/SMDS_3/Concepts/SimplicialMeshVertexBase_3.h @@ -4,7 +4,7 @@ The concept `SimplicialMeshVertexBase_3` describes the requirements for the `Vertex` type of the triangulation -used in the 3D simplicial mesh data structure. The type `SimplicialMeshVertexBase_3` +used in a 3D simplicial mesh data structure. The type `SimplicialMeshVertexBase_3` refines the concept `TriangulationVertexBase_3`. It provides additional members to store and retrieve information about the location of the vertex with respect 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 643de3ff7da8..3ce0ab4e55fd 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 @@ -151,7 +151,7 @@ namespace CGAL { vertex and cell base class are models of the concepts `SimplicialMeshVertexBase_3` and `SimplicialMeshCellBase_3`, respectively. - \tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) + \tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) of the discretized geometric domain. It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and `LessThanComparable`. diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h index b1a16d1b8f09..ad535d2e402a 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h @@ -164,16 +164,16 @@ class Simplicial_mesh_cell_3 if(is) { c.set_subdomain_index(index); for(int i = 0; i < 4; ++i) - { - Surface_patch_index i2; - if(IO::is_ascii(is)) - is >> IO::iformat(i2); - else - { - read(is, i2); - } - c.set_surface_patch_index(i, i2); - } + { + Surface_patch_index i2; + if(IO::is_ascii(is)) + is >> IO::iformat(i2); + else + { + read(is, i2); + } + c.set_surface_patch_index(i, i2); + } } return is; } @@ -186,24 +186,25 @@ class Simplicial_mesh_cell_3 os << c.subdomain_index(); else write(os, c.subdomain_index()); + for(int i = 0; i < 4; ++i) - { - if(IO::is_ascii(os)) - os << ' ' << IO::oformat(c.surface_patch_index(i)); - else - write(os, c.surface_patch_index(i)); - } + { + if(IO::is_ascii(os)) + os << ' ' << IO::oformat(c.surface_patch_index(i)); + else + write(os, c.surface_patch_index(i)); + } + return os; } - -}; // end class Simplicial_mesh_cell_3 +}; /*! \ingroup PkgSMDS3Classes The class `Simplicial_mesh_cell_base_3` is a model of the concept `SimplicialMeshCellBase_3`. -It is designed to serve as cell base class for.3D simplicial mesh data structures. +It is designed to serve as cell base class for 3D simplicial mesh data structures. It stores and gives access to data about the complex the cell belongs to, such as the subdomain it belongs to or surface it takes part to. diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index 3fbea1748537..a25cf6f43295 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -159,8 +159,8 @@ private : std::size_t time_stamp_; public: - - friend std::istream& operator>>(std::istream &is, Simplicial_mesh_vertex_3& v) + friend std::istream& operator>>(std::istream& is, + Simplicial_mesh_vertex_3& v) { is >> static_cast(v); int dimension; @@ -185,7 +185,8 @@ private : return is; } - friend std::ostream& operator<<(std::ostream &os, const Simplicial_mesh_vertex_3& v) + friend std::ostream& operator<<(std::ostream& os, + const Simplicial_mesh_vertex_3& v) { os << static_cast(v); if(IO::is_ascii(os)) { @@ -204,8 +205,7 @@ private : v.index()); return os; } -}; // end class Simplicial_mesh_vertex_3 - +}; /*! \ingroup PkgSMDS3Classes diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h index 3abdc9f034d6..f009ad0471cd 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_triangulation_3.h @@ -45,9 +45,9 @@ triangulation data structure. Possible values are `Sequential_tag` (the default), `Parallel_tag`, and `Parallel_if_available_tag`. -\tparam Vb is a model of `RemeshingVertexBase_3`. It has the default value ` Remeshing_vertex_base_3`. -\tparam Cb is a model of `RemeshingCellBase_3`. It has the default value ` Remeshing_cell_base_3`. +\tparam Vb must be a model of `RemeshingVertexBase_3`. +\tparam Cb must be model of `RemeshingCellBase_3`. */ template Date: Fri, 21 Jul 2023 09:55:01 +0200 Subject: [PATCH 0503/1398] Fix not being able to Rebind multiple time SMDS_3 / Tet Remesh Vb/Cb If you have the following construct: class V : public Vb; class V_base { struct Rebind --> V; } then you cannot rebind twice. More vicious, if Vb can rebind twice multiple times (e.g. it's a T3 Vb), then it'll silently drop V in the stack, and rebind only up to the rebound Vb! Rebinding multiple times happens for example in Triangulation_hierarchy_3 (Delaunay_triangulation_3 with Fast_locate). --- .../CGAL/Simplicial_mesh_cell_base_3.h | 123 +++++++-------- .../CGAL/Simplicial_mesh_vertex_base_3.h | 142 +++++++++--------- .../Remeshing_cell_base_3.h | 61 ++++---- .../Remeshing_vertex_base_3.h | 15 +- 4 files changed, 158 insertions(+), 183 deletions(-) diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h index ad535d2e402a..3c882ad9b522 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h @@ -32,11 +32,46 @@ namespace CGAL { +/*! +\ingroup PkgSMDS3Classes + +The class `Simplicial_mesh_cell_base_3` +is a model of the concept `SimplicialMeshCellBase_3`. +It is designed to serve as cell base class for 3D simplicial mesh data structures. +It stores and gives access to data about the complex the cell belongs to, such as the +subdomain it belongs to or surface it takes part to. + +\tparam Gt is the geometric traits class. +It must be a model of the concept `TriangulationTraits_3` + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must match the label +of the exterior of the domain (which contains at least the unbounded component). +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. + +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must be the index value +assigned to a non surface facet. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\tparam Cb is the cell base class from which `Simplicial_mesh_cell_base_3` derives. +It must be a model of the concept `TriangulationCellBase_3`. + +\cgalModels `SimplicialMeshCellBase_3` + +\sa `CGAL::Mesh_complex_3_in_triangulation_3` +\sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink +\sa `MeshDomain_3` +\sa `MeshDomainWithFeatures_3` +*/ template -class Simplicial_mesh_cell_3 + typename Cb = Triangulation_cell_base_3 > +class Simplicial_mesh_cell_base_3 : public Cb { public: @@ -50,11 +85,22 @@ class Simplicial_mesh_cell_3 using Surface_patch_index = SurfacePatchIndex; public: - Simplicial_mesh_cell_3() + template + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_cell_base_3; + }; + +public: + Simplicial_mesh_cell_base_3() : time_stamp_(std::size_t(-1)) {} - Simplicial_mesh_cell_3(const Simplicial_mesh_cell_3& rhs) + Simplicial_mesh_cell_base_3(const Simplicial_mesh_cell_base_3& rhs) : Cb(static_cast(rhs)), time_stamp_(rhs.time_stamp_), subdomain_index_(rhs.subdomain_index_) @@ -63,15 +109,15 @@ class Simplicial_mesh_cell_3 surface_index_table_[i] = rhs.surface_index_table_[i]; } - Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) + Simplicial_mesh_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3) : Cb(v0, v1, v2, v3) { } - Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) + Simplicial_mesh_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3, + Cell_handle n0, Cell_handle n1, + Cell_handle n2, Cell_handle n3) : Cb(v0, v1, v2, v3, n0, n1, n2, n3) { } @@ -153,7 +199,7 @@ class Simplicial_mesh_cell_3 public: friend std::istream& operator>>(std::istream& is, - Simplicial_mesh_cell_3& c) + Simplicial_mesh_cell_base_3& c) { Subdomain_index index; if(IO::is_ascii(is)) @@ -180,7 +226,7 @@ class Simplicial_mesh_cell_3 friend std::ostream& operator<<(std::ostream& os, - const Simplicial_mesh_cell_3& c) + const Simplicial_mesh_cell_base_3& c) { if(IO::is_ascii(os)) os << c.subdomain_index(); @@ -199,59 +245,6 @@ class Simplicial_mesh_cell_3 } }; -/*! -\ingroup PkgSMDS3Classes - -The class `Simplicial_mesh_cell_base_3` -is a model of the concept `SimplicialMeshCellBase_3`. -It is designed to serve as cell base class for 3D simplicial mesh data structures. -It stores and gives access to data about the complex the cell belongs to, such as the -subdomain it belongs to or surface it takes part to. - -\tparam Gt is the geometric traits class. -It must be a model of the concept `TriangulationTraits_3` - -\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must match the label -of the exterior of the domain (which contains at least the unbounded component). -It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. - -\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must be the index value -assigned to a non surface facet. -It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. - -\tparam Cb is the cell base class from which `Simplicial_mesh_cell_base_3` derives. -It must be a model of the concept `TriangulationCellBase_3`. - -\cgalModels `SimplicialMeshCellBase_3` - -\sa `CGAL::Mesh_complex_3_in_triangulation_3` -\sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink -\sa `MeshDomain_3` -\sa `MeshDomainWithFeatures_3` -*/ -template > -class Simplicial_mesh_cell_base_3 -{ -public: - template - struct Rebind_TDS - { - using Cb2 = typename Cb::template Rebind_TDS::Other; - using Other = Simplicial_mesh_cell_3; - }; -}; - } // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_CELL_BASE_3_H diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index a25cf6f43295..1b47ea8de4f4 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -35,13 +35,62 @@ namespace CGAL { // Adds information to Vb about the localization of the vertex in regards to the 3D input complex. + +/*! +\ingroup PkgSMDS3Classes + +The class `Simplicial_mesh_vertex_base_3` is a model of the concept +`SimplicialMeshVertexBase_3`. +It is designed to serve as vertex base class for 3D simplicial mesh data structures. +It stores and gives access to data about the complex the vertex belongs to, such as the +index of the subcomplex it belongs to. + +\tparam Gt is the geometric traits class. +It must be a model of the concept `TriangulationTraits_3` + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must match the label +of the exterior of the domain (which contains at least the unbounded component). +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. + +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must be the index value +assigned to a non surface facet. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\tparam CurveIndex Type of indices for curves (i.e. \f$ 1\f$-dimensional features) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and +`LessThanComparable`. The default constructed value must be the value for an edge which +does not approximate a 1-dimensional feature of the geometric domain. +It must match `MeshDomainWithFeatures_3::Curve_index` when used for mesh generation. + +\tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) +of the discretized geometric domain. +It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and +`LessThanComparable`. +It must match `MeshDomainWithFeatures_3::Corner_index` when used for mesh generation. + +\tparam Vb is the vertex base class from which `Simplicial_mesh_vertex_base_3` derives. +It must be a model of the concept `TriangulationVertexBase_3`. + +\cgalModels `SimplicialMeshVertexBase_3` + +\sa `CGAL::Mesh_complex_3_in_triangulation_3` +\sa \link Mesh_vertex_base_3 `CGAL::Mesh_vertex_base_3`\endlink +\sa `MeshDomain_3` +\sa `MeshDomainWithFeatures_3` +*/ template -class Simplicial_mesh_vertex_3 + typename Vb = CGAL::Triangulation_vertex_base_3 > +class Simplicial_mesh_vertex_base_3 : public Vb { private : @@ -61,7 +110,20 @@ private : using FT = typename Gt::FT; public: - Simplicial_mesh_vertex_3() + template + struct Rebind_TDS + { + using Vb2 = typename Vb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_vertex_base_3; + }; + +public: + Simplicial_mesh_vertex_base_3() : Vb() , number_of_incident_facets_(0) , number_of_components_(0) @@ -160,7 +222,7 @@ private : public: friend std::istream& operator>>(std::istream& is, - Simplicial_mesh_vertex_3& v) + Simplicial_mesh_vertex_base_3& v) { is >> static_cast(v); int dimension; @@ -186,7 +248,7 @@ private : } friend std::ostream& operator<<(std::ostream& os, - const Simplicial_mesh_vertex_3& v) + const Simplicial_mesh_vertex_base_3& v) { os << static_cast(v); if(IO::is_ascii(os)) { @@ -207,76 +269,6 @@ private : } }; -/*! -\ingroup PkgSMDS3Classes - -The class `Simplicial_mesh_vertex_base_3` is a model of the concept -`SimplicialMeshVertexBase_3`. -It is designed to serve as vertex base class for 3D simplicial mesh data structures. -It stores and gives access to data about the complex the vertex belongs to, such as the -index of the subcomplex it belongs to. - -\tparam Gt is the geometric traits class. -It must be a model of the concept `TriangulationTraits_3` - -\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must match the label -of the exterior of the domain (which contains at least the unbounded component). -It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. - -\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must be the index value -assigned to a non surface facet. -It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. - -\tparam CurveIndex Type of indices for curves (i.e. \f$ 1\f$-dimensional features) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and -`LessThanComparable`. The default constructed value must be the value for an edge which -does not approximate a 1-dimensional feature of the geometric domain. -It must match `MeshDomainWithFeatures_3::Curve_index` when used for mesh generation. - -\tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) -of the discretized geometric domain. -It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and -`LessThanComparable`. -It must match `MeshDomainWithFeatures_3::Corner_index` when used for mesh generation. - -\tparam Vb is the vertex base class from which `Simplicial_mesh_vertex_base_3` derives. -It must be a model of the concept `TriangulationVertexBase_3`. - -\cgalModels `SimplicialMeshVertexBase_3` - -\sa `CGAL::Mesh_complex_3_in_triangulation_3` -\sa \link Mesh_vertex_base_3 `CGAL::Mesh_vertex_base_3`\endlink -\sa `MeshDomain_3` -\sa `MeshDomainWithFeatures_3` -*/ -template > -class Simplicial_mesh_vertex_base_3 -{ -public: - template - struct Rebind_TDS - { - using Vb2 = typename Vb::template Rebind_TDS::Other; - using Other = Simplicial_mesh_vertex_3; - }; -}; - } // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_VERTEX_BASE_3_H diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index 30de338cdf7b..162cfa27f211 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -22,9 +22,27 @@ namespace CGAL { namespace Tetrahedral_remeshing { +/*! +\ingroup PkgTetrahedralRemeshingClasses + +The class `Remeshing_cell_base_3` is a model of the concept `RemeshingCellBase_3`. +It is designed to serve as cell base class for the 3D triangulation +used in the tetrahedral remeshing process. + +\tparam Gt is the geometric traits class. +It has to be a model of the concept `RemeshingTriangulationTraits_3`. + +\tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. +It must be a model of the `SimplicialMeshCellBase_3` concept. + +\cgalModels `RemeshingCellBase_3` + +*/ template -class Remeshing_cell_3 + typename Cb = CGAL::Simplicial_mesh_cell_base_3 > +class Remeshing_cell_base_3 : public Cb { public: @@ -35,6 +53,14 @@ class Remeshing_cell_3 using Geom_traits = Gt; +public: + template + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Remeshing_cell_base_3; + }; + public: using Cb::Cb; // constructors @@ -59,37 +85,6 @@ class Remeshing_cell_3 mutable bool sliver_cache_validity_ = false; }; -/*! -\ingroup PkgTetrahedralRemeshingClasses - -The class `Remeshing_cell_base_3` is a model of the concept `RemeshingCellBase_3`. -It is designed to serve as cell base class for the 3D triangulation -used in the tetrahedral remeshing process. - -\tparam Gt is the geometric traits class. -It has to be a model of the concept `RemeshingTriangulationTraits_3`. - -\tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. -It must be a model of the `SimplicialMeshCellBase_3` concept. - -\cgalModels `RemeshingCellBase_3` - -*/ -template > -class Remeshing_cell_base_3 -{ -public: - template - struct Rebind_TDS - { - using Cb2 = typename Cb::template Rebind_TDS::Other; - using Other = Remeshing_cell_3; - }; -}; - } // namespace Tetrahedral_remeshing } // namespace CGAL diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h index faab3950f9a0..34e5fb0855c0 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h @@ -20,15 +20,6 @@ namespace CGAL { namespace Tetrahedral_remeshing { -template -class Remeshing_vertex_3 - : public Vb -{ -public: - using Vb::Vb; // constructors -}; - /*! \ingroup PkgTetrahedralRemeshingClasses @@ -51,14 +42,18 @@ template > class Remeshing_vertex_base_3 + : public Vb { public: template struct Rebind_TDS { using Vb2 = typename Vb::template Rebind_TDS::Other; - using Other = Remeshing_vertex_3; + using Other = Remeshing_vertex_base_3; }; + +public: + using Vb::Vb; // constructors }; } // namespace Tetrahedral_remeshing From 069756ba3c350880c8d8e10bb57952999c528c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 21 Jul 2023 09:55:01 +0200 Subject: [PATCH 0504/1398] Fix not being able to Rebind multiple time SMDS_3 / Tet Remesh Vb/Cb If you have the following construct: class V : public Vb; class V_base { struct Rebind --> V; } then you cannot rebind twice. More vicious, if Vb can rebind twice multiple times (e.g. it's a T3 Vb), then it'll silently drop V in the stack, and rebind only up to the rebound Vb! Rebinding multiple times happens for example in Triangulation_hierarchy_3 (Delaunay_triangulation_3 with Fast_locate). --- .../CGAL/Simplicial_mesh_cell_base_3.h | 123 +++++++-------- .../CGAL/Simplicial_mesh_vertex_base_3.h | 142 +++++++++--------- .../Remeshing_cell_base_3.h | 61 ++++---- .../Remeshing_vertex_base_3.h | 15 +- 4 files changed, 158 insertions(+), 183 deletions(-) diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h index ad535d2e402a..3c882ad9b522 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_cell_base_3.h @@ -32,11 +32,46 @@ namespace CGAL { +/*! +\ingroup PkgSMDS3Classes + +The class `Simplicial_mesh_cell_base_3` +is a model of the concept `SimplicialMeshCellBase_3`. +It is designed to serve as cell base class for 3D simplicial mesh data structures. +It stores and gives access to data about the complex the cell belongs to, such as the +subdomain it belongs to or surface it takes part to. + +\tparam Gt is the geometric traits class. +It must be a model of the concept `TriangulationTraits_3` + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must match the label +of the exterior of the domain (which contains at least the unbounded component). +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. + +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must be the index value +assigned to a non surface facet. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\tparam Cb is the cell base class from which `Simplicial_mesh_cell_base_3` derives. +It must be a model of the concept `TriangulationCellBase_3`. + +\cgalModels `SimplicialMeshCellBase_3` + +\sa `CGAL::Mesh_complex_3_in_triangulation_3` +\sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink +\sa `MeshDomain_3` +\sa `MeshDomainWithFeatures_3` +*/ template -class Simplicial_mesh_cell_3 + typename Cb = Triangulation_cell_base_3 > +class Simplicial_mesh_cell_base_3 : public Cb { public: @@ -50,11 +85,22 @@ class Simplicial_mesh_cell_3 using Surface_patch_index = SurfacePatchIndex; public: - Simplicial_mesh_cell_3() + template + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_cell_base_3; + }; + +public: + Simplicial_mesh_cell_base_3() : time_stamp_(std::size_t(-1)) {} - Simplicial_mesh_cell_3(const Simplicial_mesh_cell_3& rhs) + Simplicial_mesh_cell_base_3(const Simplicial_mesh_cell_base_3& rhs) : Cb(static_cast(rhs)), time_stamp_(rhs.time_stamp_), subdomain_index_(rhs.subdomain_index_) @@ -63,15 +109,15 @@ class Simplicial_mesh_cell_3 surface_index_table_[i] = rhs.surface_index_table_[i]; } - Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3) + Simplicial_mesh_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3) : Cb(v0, v1, v2, v3) { } - Simplicial_mesh_cell_3(Vertex_handle v0, Vertex_handle v1, - Vertex_handle v2, Vertex_handle v3, - Cell_handle n0, Cell_handle n1, - Cell_handle n2, Cell_handle n3) + Simplicial_mesh_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3, + Cell_handle n0, Cell_handle n1, + Cell_handle n2, Cell_handle n3) : Cb(v0, v1, v2, v3, n0, n1, n2, n3) { } @@ -153,7 +199,7 @@ class Simplicial_mesh_cell_3 public: friend std::istream& operator>>(std::istream& is, - Simplicial_mesh_cell_3& c) + Simplicial_mesh_cell_base_3& c) { Subdomain_index index; if(IO::is_ascii(is)) @@ -180,7 +226,7 @@ class Simplicial_mesh_cell_3 friend std::ostream& operator<<(std::ostream& os, - const Simplicial_mesh_cell_3& c) + const Simplicial_mesh_cell_base_3& c) { if(IO::is_ascii(os)) os << c.subdomain_index(); @@ -199,59 +245,6 @@ class Simplicial_mesh_cell_3 } }; -/*! -\ingroup PkgSMDS3Classes - -The class `Simplicial_mesh_cell_base_3` -is a model of the concept `SimplicialMeshCellBase_3`. -It is designed to serve as cell base class for 3D simplicial mesh data structures. -It stores and gives access to data about the complex the cell belongs to, such as the -subdomain it belongs to or surface it takes part to. - -\tparam Gt is the geometric traits class. -It must be a model of the concept `TriangulationTraits_3` - -\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must match the label -of the exterior of the domain (which contains at least the unbounded component). -It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. - -\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must be the index value -assigned to a non surface facet. -It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. - -\tparam Cb is the cell base class from which `Simplicial_mesh_cell_base_3` derives. -It must be a model of the concept `TriangulationCellBase_3`. - -\cgalModels `SimplicialMeshCellBase_3` - -\sa `CGAL::Mesh_complex_3_in_triangulation_3` -\sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink -\sa `MeshDomain_3` -\sa `MeshDomainWithFeatures_3` -*/ -template > -class Simplicial_mesh_cell_base_3 -{ -public: - template - struct Rebind_TDS - { - using Cb2 = typename Cb::template Rebind_TDS::Other; - using Other = Simplicial_mesh_cell_3; - }; -}; - } // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_CELL_BASE_3_H diff --git a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h index a25cf6f43295..1b47ea8de4f4 100644 --- a/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h +++ b/SMDS_3/include/CGAL/Simplicial_mesh_vertex_base_3.h @@ -35,13 +35,62 @@ namespace CGAL { // Adds information to Vb about the localization of the vertex in regards to the 3D input complex. + +/*! +\ingroup PkgSMDS3Classes + +The class `Simplicial_mesh_vertex_base_3` is a model of the concept +`SimplicialMeshVertexBase_3`. +It is designed to serve as vertex base class for 3D simplicial mesh data structures. +It stores and gives access to data about the complex the vertex belongs to, such as the +index of the subcomplex it belongs to. + +\tparam Gt is the geometric traits class. +It must be a model of the concept `TriangulationTraits_3` + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must match the label +of the exterior of the domain (which contains at least the unbounded component). +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. + +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must be the index value +assigned to a non surface facet. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\tparam CurveIndex Type of indices for curves (i.e. \f$ 1\f$-dimensional features) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and +`LessThanComparable`. The default constructed value must be the value for an edge which +does not approximate a 1-dimensional feature of the geometric domain. +It must match `MeshDomainWithFeatures_3::Curve_index` when used for mesh generation. + +\tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) +of the discretized geometric domain. +It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and +`LessThanComparable`. +It must match `MeshDomainWithFeatures_3::Corner_index` when used for mesh generation. + +\tparam Vb is the vertex base class from which `Simplicial_mesh_vertex_base_3` derives. +It must be a model of the concept `TriangulationVertexBase_3`. + +\cgalModels `SimplicialMeshVertexBase_3` + +\sa `CGAL::Mesh_complex_3_in_triangulation_3` +\sa \link Mesh_vertex_base_3 `CGAL::Mesh_vertex_base_3`\endlink +\sa `MeshDomain_3` +\sa `MeshDomainWithFeatures_3` +*/ template -class Simplicial_mesh_vertex_3 + typename Vb = CGAL::Triangulation_vertex_base_3 > +class Simplicial_mesh_vertex_base_3 : public Vb { private : @@ -61,7 +110,20 @@ private : using FT = typename Gt::FT; public: - Simplicial_mesh_vertex_3() + template + struct Rebind_TDS + { + using Vb2 = typename Vb::template Rebind_TDS::Other; + using Other = Simplicial_mesh_vertex_base_3; + }; + +public: + Simplicial_mesh_vertex_base_3() : Vb() , number_of_incident_facets_(0) , number_of_components_(0) @@ -160,7 +222,7 @@ private : public: friend std::istream& operator>>(std::istream& is, - Simplicial_mesh_vertex_3& v) + Simplicial_mesh_vertex_base_3& v) { is >> static_cast(v); int dimension; @@ -186,7 +248,7 @@ private : } friend std::ostream& operator<<(std::ostream& os, - const Simplicial_mesh_vertex_3& v) + const Simplicial_mesh_vertex_base_3& v) { os << static_cast(v); if(IO::is_ascii(os)) { @@ -207,76 +269,6 @@ private : } }; -/*! -\ingroup PkgSMDS3Classes - -The class `Simplicial_mesh_vertex_base_3` is a model of the concept -`SimplicialMeshVertexBase_3`. -It is designed to serve as vertex base class for 3D simplicial mesh data structures. -It stores and gives access to data about the complex the vertex belongs to, such as the -index of the subcomplex it belongs to. - -\tparam Gt is the geometric traits class. -It must be a model of the concept `TriangulationTraits_3` - -\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must match the label -of the exterior of the domain (which contains at least the unbounded component). -It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. - -\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` -and `EqualityComparable`. The default constructed value must be the index value -assigned to a non surface facet. -It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. - -\tparam CurveIndex Type of indices for curves (i.e. \f$ 1\f$-dimensional features) -of the discretized geometric domain. -Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and -`LessThanComparable`. The default constructed value must be the value for an edge which -does not approximate a 1-dimensional feature of the geometric domain. -It must match `MeshDomainWithFeatures_3::Curve_index` when used for mesh generation. - -\tparam CornerIndex Type of indices for corners (i.e.\f$ 0\f$--dimensional features) -of the discretized geometric domain. -It must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` and -`LessThanComparable`. -It must match `MeshDomainWithFeatures_3::Corner_index` when used for mesh generation. - -\tparam Vb is the vertex base class from which `Simplicial_mesh_vertex_base_3` derives. -It must be a model of the concept `TriangulationVertexBase_3`. - -\cgalModels `SimplicialMeshVertexBase_3` - -\sa `CGAL::Mesh_complex_3_in_triangulation_3` -\sa \link Mesh_vertex_base_3 `CGAL::Mesh_vertex_base_3`\endlink -\sa `MeshDomain_3` -\sa `MeshDomainWithFeatures_3` -*/ -template > -class Simplicial_mesh_vertex_base_3 -{ -public: - template - struct Rebind_TDS - { - using Vb2 = typename Vb::template Rebind_TDS::Other; - using Other = Simplicial_mesh_vertex_3; - }; -}; - } // namespace CGAL #endif // CGAL_SIMPLICIAL_MESH_VERTEX_BASE_3_H diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index 30de338cdf7b..162cfa27f211 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -22,9 +22,27 @@ namespace CGAL { namespace Tetrahedral_remeshing { +/*! +\ingroup PkgTetrahedralRemeshingClasses + +The class `Remeshing_cell_base_3` is a model of the concept `RemeshingCellBase_3`. +It is designed to serve as cell base class for the 3D triangulation +used in the tetrahedral remeshing process. + +\tparam Gt is the geometric traits class. +It has to be a model of the concept `RemeshingTriangulationTraits_3`. + +\tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. +It must be a model of the `SimplicialMeshCellBase_3` concept. + +\cgalModels `RemeshingCellBase_3` + +*/ template -class Remeshing_cell_3 + typename Cb = CGAL::Simplicial_mesh_cell_base_3 > +class Remeshing_cell_base_3 : public Cb { public: @@ -35,6 +53,14 @@ class Remeshing_cell_3 using Geom_traits = Gt; +public: + template + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Remeshing_cell_base_3; + }; + public: using Cb::Cb; // constructors @@ -59,37 +85,6 @@ class Remeshing_cell_3 mutable bool sliver_cache_validity_ = false; }; -/*! -\ingroup PkgTetrahedralRemeshingClasses - -The class `Remeshing_cell_base_3` is a model of the concept `RemeshingCellBase_3`. -It is designed to serve as cell base class for the 3D triangulation -used in the tetrahedral remeshing process. - -\tparam Gt is the geometric traits class. -It has to be a model of the concept `RemeshingTriangulationTraits_3`. - -\tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. -It must be a model of the `SimplicialMeshCellBase_3` concept. - -\cgalModels `RemeshingCellBase_3` - -*/ -template > -class Remeshing_cell_base_3 -{ -public: - template - struct Rebind_TDS - { - using Cb2 = typename Cb::template Rebind_TDS::Other; - using Other = Remeshing_cell_3; - }; -}; - } // namespace Tetrahedral_remeshing } // namespace CGAL diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h index faab3950f9a0..34e5fb0855c0 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_vertex_base_3.h @@ -20,15 +20,6 @@ namespace CGAL { namespace Tetrahedral_remeshing { -template -class Remeshing_vertex_3 - : public Vb -{ -public: - using Vb::Vb; // constructors -}; - /*! \ingroup PkgTetrahedralRemeshingClasses @@ -51,14 +42,18 @@ template > class Remeshing_vertex_base_3 + : public Vb { public: template struct Rebind_TDS { using Vb2 = typename Vb::template Rebind_TDS::Other; - using Other = Remeshing_vertex_3; + using Other = Remeshing_vertex_base_3; }; + +public: + using Vb::Vb; // constructors }; } // namespace Tetrahedral_remeshing From e4dff1ffaf6a481b687239b28648c5fc672008d9 Mon Sep 17 00:00:00 2001 From: albert-github Date: Fri, 21 Jul 2023 11:41:27 +0200 Subject: [PATCH 0505/1398] issue #7395 Improvement of layout of model relations Corrections after review. --- Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h | 2 +- Generator/doc/Generator/CGAL/point_generators_2.h | 2 +- Number_types/doc/Number_types/CGAL/long_long.h | 2 +- Point_set_3/include/CGAL/Point_set_3.h | 2 +- .../Polyline_simplification_2/Hybrid_squared_distance_cost.h | 2 +- .../CGAL/Polyline_simplification_2/Squared_distance_cost.h | 2 +- .../Polyline_simplification_2/Stop_above_cost_threshold.h | 2 +- .../Stop_below_count_ratio_threshold.h | 2 +- .../Polyline_simplification_2/Stop_below_count_threshold.h | 2 +- .../doc/Set_movable_separability_2/Concepts/CastingTraits_2.h | 2 +- .../doc/Spatial_searching/CGAL/Search_traits_adapter.h | 4 ++-- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h b/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h index 8d030fa2fec4..0afba5bd71c2 100644 --- a/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h +++ b/Generalized_map/doc/Generalized_map/CGAL/Generalized_map.h @@ -8,7 +8,7 @@ The class `Generalized_map` represents a dD generalized map. Two versions exist: one where darts and non void attributes are stored in memory using `Compact_container`, using `Alloc` as allocator, and use handles as descriptors; a second one where darts and non void attributes are stored in an internal `std::vector` like data-structure, and use indices as descriptors. The choice between the two versions is done through the item class. -\cgalModels{GeneralizedMap}} +\cgalModels{GeneralizedMap} \tparam d the dimension of the map. diff --git a/Generator/doc/Generator/CGAL/point_generators_2.h b/Generator/doc/Generator/CGAL/point_generators_2.h index aec175967500..10319fca7379 100644 --- a/Generator/doc/Generator/CGAL/point_generators_2.h +++ b/Generator/doc/Generator/CGAL/point_generators_2.h @@ -677,7 +677,7 @@ endpoints are specified upon construction. The points are equally spaced. \cgalModels{PointGenerator} -\sa `CGAL::points_on_segment_2 +\sa `CGAL::points_on_segment_2` \sa `CGAL::Random_points_in_disc_2` \sa `CGAL::Random_points_in_square_2` \sa `CGAL::Random_points_in_triangle_2` diff --git a/Number_types/doc/Number_types/CGAL/long_long.h b/Number_types/doc/Number_types/CGAL/long_long.h index be91260dc599..83e6e23a058a 100644 --- a/Number_types/doc/Number_types/CGAL/long_long.h +++ b/Number_types/doc/Number_types/CGAL/long_long.h @@ -5,4 +5,4 @@ /// type `long long int` is an `RealEmbeddable` `EuclideanRing`. Due /// to overflow `long long int` is considered as not exact. /// -/// \cgalModels{EuclideanRing,cgalModels RealEmbeddable} +/// \cgalModels{EuclideanRing,RealEmbeddable} diff --git a/Point_set_3/include/CGAL/Point_set_3.h b/Point_set_3/include/CGAL/Point_set_3.h index 62ef14a946fb..35a7afcad807 100644 --- a/Point_set_3/include/CGAL/Point_set_3.h +++ b/Point_set_3/include/CGAL/Point_set_3.h @@ -161,7 +161,7 @@ class Point_set_3 #ifdef DOXYGEN_RUNNING typedef unspecified_type iterator; ///< Iterator type of the point set with value type `Index` is model of `RandomAccessIterator` - typedef unspecified_type const_iterator; ///< Constant iterator type of the point set with value type `Index` is model of `RandomA.ccessIterator + typedef unspecified_type const_iterator; ///< Constant iterator type of the point set with value type `Index` is model of `RandomA.ccessIterator` #else typedef typename Index_map::iterator iterator; ///< Iterator type of the point set typedef typename Index_map::const_iterator const_iterator; ///< Constant iterator type of the point set diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h index 8cfe6fa2a55c..f10167c95703 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a cost function which calculates the cost as the square of the distance between the original and simplified polylines, /// possibly scaled based on a factor. /// -/// \cgalModels{PolylineSimplificationCostFunction.} +/// \cgalModels{PolylineSimplificationCostFunction} template class Hybrid_squared_distance_cost { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h index 128327f64c7b..ceeca67d79d9 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Squared_distance_cost.h @@ -34,7 +34,7 @@ namespace Polyline_simplification_2 /// This class is a cost function which calculates the cost as the square of the distance between the original and simplified polylines. /// -/// \cgalModels{PolylineSimplificationCostFunction.} +/// \cgalModels{PolylineSimplificationCostFunction} class Squared_distance_cost { diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h index ed886701afdb..fd4648fa01d3 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_above_cost_threshold.h @@ -28,7 +28,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the cost for /// simplifying a vertex is greater than a certain threshold. /// -/// \cgalModels{PolylineSimplificationStopPredicate.} +/// \cgalModels{PolylineSimplificationStopPredicate} class Stop_above_cost_threshold { public : diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h index 9de0bb1888db..1a18d7ceddd5 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_ratio_threshold.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the percentage /// of remaining vertices is smaller than a certain threshold. /// -/// \cgalModels{PolylineSimplificationStopPredicate.} +/// \cgalModels{PolylineSimplificationStopPredicate} class Stop_below_count_ratio_threshold { public : diff --git a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h index 072b68166ae3..d8987f323e36 100644 --- a/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h +++ b/Polyline_simplification_2/include/CGAL/Polyline_simplification_2/Stop_below_count_threshold.h @@ -27,7 +27,7 @@ namespace Polyline_simplification_2 /// This class is a stop predicate returning `true` when the number of /// vertices is smaller than a certain threshold. /// -/// \cgalModels{PolylineSimplificationStopPredicate.} +/// \cgalModels{PolylineSimplificationStopPredicate} class Stop_below_count_threshold { public : diff --git a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h index 1322002cd6d3..6e3b2e1325b5 100644 --- a/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h +++ b/Set_movable_separability_2/doc/Set_movable_separability_2/Concepts/CastingTraits_2.h @@ -8,7 +8,7 @@ \cgalRefines{DefaultConstructible,PolygonTraits_2} \cgalHasModelsBegin - \cgalHasModelsBare{Any CGAL kernel, e.g., CGAL::Exact_predicates_exact_constructions_kernel.} + \cgalHasModelsBare{Any \cgal kernel, e.g., CGAL::Exact_predicates_exact_constructions_kernel.} \cgalHasModelsEnd */ diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h index 646ecf4b4a84..267933d15fcb 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Search_traits_adapter.h @@ -16,8 +16,8 @@ with `Key` as key type and `Base_distance::Point_d` as value type. \tparam Base_distance is a model of either `GeneralDistance` or `OrthogonalDistance`. -\cgalModels{GeneralDistance if Base_distance is a model of `GeneralDistance`, - OrthogonalDistance if Base_distance is a model of `OrthogonalDistance`} +\cgalModels{GeneralDistance if `Base_distance` is a model of `GeneralDistance`, + OrthogonalDistance if `Base_distance` is a model of `OrthogonalDistance`} \sa `Search_traits_adapter` From fdb6b799a9f41d5cfea056801196504351b4da5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 21 Jul 2023 13:32:25 +0200 Subject: [PATCH 0506/1398] add doc + do the autorefine inplace for the soup --- .../PackageDescription.txt | 2 + .../soup_autorefinement.cpp | 11 +- .../Polygon_mesh_processing/autorefinement.h | 168 ++++++++++++------ 3 files changed, 116 insertions(+), 65 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index b17c41399d0b..95d8794cca1e 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -109,6 +109,8 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::surface_intersection()` - `CGAL::Polygon_mesh_processing::clip()` - `CGAL::Polygon_mesh_processing::split()` +- `CGAL::Polygon_mesh_processing::autorefine_triangle_soup()` +- `CGAL::Polygon_mesh_processing::autorefine()` \cgalCRPSection{Meshing Functions} - \link PMP_meshing_grp `CGAL::Polygon_mesh_processing::isotropic_remeshing()` \endlink diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp index 9e4999287f7b..a44d47c8b6d1 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/soup_autorefinement.cpp @@ -32,14 +32,11 @@ int main(int argc, char** argv) CGAL::Real_timer t; t.start(); - std::vector output_points; - std::vector> output_triangles; - PMP::autorefine_soup_output(input_points, input_triangles, - output_points, output_triangles, - CGAL::parameters::concurrency_tag(CGAL::Parallel_if_available_tag())); + PMP::autorefine_triangle_soup(input_points, input_triangles, + CGAL::parameters::concurrency_tag(CGAL::Parallel_if_available_tag())); t.stop(); - std::cout << "#points = " << output_points.size() << " and #triangles = " << output_triangles.size() << " in " << t.time() << " sec." << std::endl; - CGAL::IO::write_polygon_soup("autorefined.off", output_points, output_triangles, CGAL::parameters::stream_precision(17)); + std::cout << "#points = " << input_points.size() << " and #triangles = " << input_triangles.size() << " in " << t.time() << " sec." << std::endl; + CGAL::IO::write_polygon_soup("autorefined.off", input_points, input_triangles, CGAL::parameters::stream_precision(17)); return 0; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 122c595b13e8..bfa65df1c73e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -31,10 +31,15 @@ #endif // output -#include +#include #include #include + +#ifdef CGAL_PMP_AUTOREFINE_USE_DEFAULT_VERBOSE +#define CGAL_PMP_AUTOREFINE_VERBOSE(X) std::cout << X << "\n"; +#endif + #ifndef CGAL_PMP_AUTOREFINE_VERBOSE #define CGAL_PMP_AUTOREFINE_VERBOSE(MSG) #endif @@ -1100,13 +1105,54 @@ void generate_subtriangles(std::size_t ti, } } // end of autorefine_impl +#endif -template -void autorefine_soup_output(const PointRange& input_points, - const TriIdsRange& id_triples, - std::vector& soup_points, - std::vector >& soup_triangles, - const NamedParameters& np = parameters::default_values()) +/** +* \ingroup PMP_corefinement_grp +* +* refines a soup of triangles so that no pair of triangles intersects in their interior. +* Note that points in `input_points` can only be added (intersection points) a the end of the container, with the initial order preserved. +* Note that if `input_points` contains two or more identical points and only the first copy (following the order in the `input_points`) +* will be used in `id_triples`. +* `id_triples` will be updated to contain both the input triangles and the new subdivides triangles. Degenerate triangles will be removed. +* Also triangles in `id_triples` will be triangles without intersection first, followed by triangles coming from a subdivision induced +* by an intersection. The named parameter `visitor()` can be used to track +* +* @tparam PointRange a model of the concept `RandomAccessContainer` +* whose value type is the point type +* @tparam TriIdsRange a model of the concepts `RandomAccessContainer`, `BackInsertionSequence` and `Swappable`, whose +* value type is a model of the concept `RandomAccessContainer` whose value type is convertible to `std::size_t` and that +* is constructible from an `std::initializer_list` of size 3. +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param input_points points of the soup of polygons +* @param id_triples each element in the range describes a triangle using the indexed position of the points in `input_points` +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{point_map} +* \cgalParamDescription{a property map associating points to the elements of the range `input_points`} +* \cgalParamType{a model of `ReadWritePropertyMap` whose value type is a point type} +* \cgalParamDefault{`CGAL::Identity_property_map`} +* \cgalParamNEnd +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the point type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the point type.} +* \cgalParamNEnd +* \cgalParamNBegin{visitor} +* \cgalParamDescription{a visitor used to track the creation of new faces} +* \cgalParamType{a class model of `PMPFooBar`} +* \cgalParamDefault{`Autorefinement::Default_visitor`} +* \cgalParamNEnd +* \cgalNamedParamsEnd +* +*/ +template +void autorefine_triangle_soup(PointRange& input_points, + TriIdsRange& id_triples, + const NamedParameters& np = parameters::default_values()) { using parameters::choose_parameter; using parameters::get_parameter; @@ -1121,14 +1167,13 @@ void autorefine_soup_output(const PointRange& input_points, Sequential_tag > ::type Concurrency_tag; - constexpr bool parallel_execution = std::is_same::value; + constexpr bool parallel_execution = std::is_same_v; #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (parallel_execution, - "Parallel_tag is enabled but TBB is unavailable."); + static_assert (!parallel_execution, + "Parallel_tag is enabled but TBB is unavailable."); #endif - typedef std::size_t Input_TID; typedef std::pair Pair_of_triangle_ids; @@ -1334,7 +1379,6 @@ void autorefine_soup_output(const PointRange& input_points, boost::timer::progress_display pd(triangles.size()); #endif - auto refine_triangles = [&](std::size_t ti) { if (all_segments[ti].empty() && all_points[ti].empty()) @@ -1371,7 +1415,6 @@ void autorefine_soup_output(const PointRange& input_points, #endif }; - #ifdef USE_DEBUG_PARALLEL_TIMERS t.start(); #endif @@ -1415,25 +1458,22 @@ void autorefine_soup_output(const PointRange& input_points, std::vector exact_soup_points; #endif - /// Lambda get_point_id() - auto get_point_id = [&](const typename EK::Point_3& pt) + // TODO: parallel_for? + // for input points, we on purpose keep duplicated points and isolated points + for (std::size_t pid = 0; pidsecond; - }; + point_id_map.insert( + std::make_pair(to_exact(get(pm,input_points[pid])), pid)); +#if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) + exact_soup_points.push_back(insert_res.first->first); +#endif + } - // TODO: parallel_for? - std::vector input_point_ids; - input_point_ids.reserve(input_points.size()); - for (const auto& p : input_points) - input_point_ids.push_back(get_point_id(to_exact(get(pm,p)))); + TriIdsRange soup_triangles; + soup_triangles.reserve(id_triples.size()); // TODO: remove #deg tri? // raw copy of input triangles with no intersection for (Input_TID f=0; fsecond; + }; + #ifdef USE_DEBUG_PARALLEL_TIMERS t.start(); #endif @@ -1465,7 +1518,6 @@ void autorefine_soup_output(const PointRange& input_points, #ifdef CGAL_LINKED_WITH_TBB if(parallel_execution && new_triangles.size() > 100) { - #ifdef SET_POINT_IDS_USING_MUTEX //option 1 (using a mutex) CGAL_MUTEX point_container_mutex; @@ -1477,8 +1529,8 @@ void autorefine_soup_output(const PointRange& input_points, if (insert_res.second) { CGAL_SCOPED_LOCK(point_container_mutex); - insert_res.first->second=soup_points.size(); - soup_points.push_back(to_input(pt)); + insert_res.first->second=input_points.size(); + input_points.push_back(to_input(pt)); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) exact_soup_points.push_back(pt); #endif @@ -1502,9 +1554,9 @@ void autorefine_soup_output(const PointRange& input_points, for (size_t ti = r.begin(); ti != r.end(); ++ti) { soup_triangles[offset + ti] = - CGAL::make_array(triangle_buffer[ti][0]->second, - triangle_buffer[ti][1]->second, - triangle_buffer[ti][2]->second); + { triangle_buffer[ti][0]->second, + triangle_buffer[ti][1]->second, + triangle_buffer[ti][2]->second }; } } ); @@ -1536,17 +1588,17 @@ void autorefine_soup_output(const PointRange& input_points, ); // the map is now filled we can safely set the point ids - std::size_t pid_offset=soup_points.size(); - soup_points.resize(pid_offset+iterators.size()); + std::size_t pid_offset=input_points.size(); + input_points.resize(pid_offset+iterators.size()); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.resize(soup_points.size()); + exact_soup_points.resize(input_points.size()); #endif tbb::parallel_for(tbb::blocked_range(0, iterators.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - soup_points[pid_offset+ti] = to_input(iterators[ti]->first); + input_points[pid_offset+ti] = to_input(iterators[ti]->first); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) exact_soup_points[pid_offset+ti] = iterators[ti]->first; #endif @@ -1560,9 +1612,9 @@ void autorefine_soup_output(const PointRange& input_points, for (size_t ti = r.begin(); ti != r.end(); ++ti) { soup_triangles[offset + ti] = - CGAL::make_array(triangle_buffer[ti][0]->second, - triangle_buffer[ti][1]->second, - triangle_buffer[ti][2]->second); + { triangle_buffer[ti][0]->second, + triangle_buffer[ti][1]->second, + triangle_buffer[ti][2]->second }; } } ); @@ -1576,7 +1628,7 @@ void autorefine_soup_output(const PointRange& input_points, #endif soup_triangles.reserve(offset + new_triangles.size()); for (const std::array& t : new_triangles) - soup_triangles.emplace_back(CGAL::make_array(get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2]))); + soup_triangles.push_back({ get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2])}); } @@ -1597,9 +1649,11 @@ void autorefine_soup_output(const PointRange& input_points, throw std::runtime_error("ERROR: invalid output, there is most probably a bug"); #endif #endif + using std::swap; + swap(id_triples, soup_triangles); + CGAL_PMP_AUTOREFINE_VERBOSE("done"); } -#endif /** * \ingroup PMP_corefinement_grp @@ -1639,22 +1693,20 @@ autorefine( TriangleMesh& tm, using parameters::get_parameter; typedef typename GetGeomTraits::type GT; - GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); + // GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); - std::vector in_soup_points; - std::vector > in_soup_triangles; - std::vector out_soup_points; - std::vector > out_soup_triangles; + std::vector soup_points; + std::vector > soup_triangles; - polygon_mesh_to_polygon_soup(tm, in_soup_points, in_soup_triangles); + polygon_mesh_to_polygon_soup(tm, soup_points, soup_triangles, np); - autorefine_soup_output(in_soup_points, in_soup_triangles, - out_soup_points, out_soup_triangles); + autorefine_triangle_soup(soup_points, soup_triangles); clear(tm); - repair_polygon_soup(out_soup_points, out_soup_triangles); - orient_polygon_soup(out_soup_points, out_soup_triangles); - polygon_soup_to_polygon_mesh(out_soup_points, out_soup_triangles, tm); + repair_polygon_soup(soup_points, soup_triangles); + + duplicate_non_manifold_edges_in_polygon_soup(soup_points, soup_triangles); + polygon_soup_to_polygon_mesh(soup_points, soup_triangles, tm); } From d6fdc85be9bb5c95b4fdf59379a67033a98b2d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 21 Jul 2023 13:38:10 +0200 Subject: [PATCH 0507/1398] rename variables --- .../Polygon_mesh_processing/autorefinement.h | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index bfa65df1c73e..0054a9dcdb2d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1111,11 +1111,11 @@ void generate_subtriangles(std::size_t ti, * \ingroup PMP_corefinement_grp * * refines a soup of triangles so that no pair of triangles intersects in their interior. -* Note that points in `input_points` can only be added (intersection points) a the end of the container, with the initial order preserved. -* Note that if `input_points` contains two or more identical points and only the first copy (following the order in the `input_points`) -* will be used in `id_triples`. -* `id_triples` will be updated to contain both the input triangles and the new subdivides triangles. Degenerate triangles will be removed. -* Also triangles in `id_triples` will be triangles without intersection first, followed by triangles coming from a subdivision induced +* Note that points in `soup_points` can only be added (intersection points) a the end of the container, with the initial order preserved. +* Note that if `soup_points` contains two or more identical points and only the first copy (following the order in the `soup_points`) +* will be used in `soup_triangles`. +* `soup_triangles` will be updated to contain both the input triangles and the new subdivides triangles. Degenerate triangles will be removed. +* Also triangles in `soup_triangles` will be triangles without intersection first, followed by triangles coming from a subdivision induced * by an intersection. The named parameter `visitor()` can be used to track * * @tparam PointRange a model of the concept `RandomAccessContainer` @@ -1125,13 +1125,13 @@ void generate_subtriangles(std::size_t ti, * is constructible from an `std::initializer_list` of size 3. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * -* @param input_points points of the soup of polygons -* @param id_triples each element in the range describes a triangle using the indexed position of the points in `input_points` +* @param soup_points points of the soup of polygons +* @param soup_triangles each element in the range describes a triangle using the indexed position of the points in `soup_points` * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamNBegin{point_map} -* \cgalParamDescription{a property map associating points to the elements of the range `input_points`} +* \cgalParamDescription{a property map associating points to the elements of the range `soup_points`} * \cgalParamType{a model of `ReadWritePropertyMap` whose value type is a point type} * \cgalParamDefault{`CGAL::Identity_property_map`} * \cgalParamNEnd @@ -1150,8 +1150,8 @@ void generate_subtriangles(std::size_t ti, * */ template -void autorefine_triangle_soup(PointRange& input_points, - TriIdsRange& id_triples, +void autorefine_triangle_soup(PointRange& soup_points, + TriIdsRange& soup_triangles, const NamedParameters& np = parameters::default_values()) { using parameters::choose_parameter; @@ -1181,12 +1181,12 @@ void autorefine_triangle_soup(PointRange& input_points, // collect intersecting pairs of triangles CGAL_PMP_AUTOREFINE_VERBOSE("collect intersecting pairs"); - triangle_soup_self_intersections(input_points, id_triples, std::back_inserter(si_pairs), np); + triangle_soup_self_intersections(soup_points, soup_triangles, std::back_inserter(si_pairs), np); if (si_pairs.empty()) return; // mark degenerate faces so that we can ignore them - std::vector is_degen(id_triples.size(), false); + std::vector is_degen(soup_triangles.size(), false); for (const Pair_of_triangle_ids& p : si_pairs) if (p.first==p.second) // bbox inter reports (f,f) for degenerate faces @@ -1194,7 +1194,7 @@ void autorefine_triangle_soup(PointRange& input_points, // assign an id per triangle involved in an intersection // + the faces involved in the intersection - std::vector tri_inter_ids(id_triples.size(), -1); + std::vector tri_inter_ids(soup_triangles.size(), -1); std::vector intersected_faces; int tiid=-1; for (const Pair_of_triangle_ids& p : si_pairs) @@ -1219,9 +1219,9 @@ void autorefine_triangle_soup(PointRange& input_points, for(Input_TID f : intersected_faces) { triangles[tri_inter_ids[f]]= CGAL::make_array( - to_exact( get(pm, input_points[id_triples[f][0]]) ), - to_exact( get(pm, input_points[id_triples[f][1]]) ), - to_exact( get(pm, input_points[id_triples[f][2]]) ) ); + to_exact( get(pm, soup_points[soup_triangles[f][0]]) ), + to_exact( get(pm, soup_points[soup_triangles[f][1]]) ), + to_exact( get(pm, soup_points[soup_triangles[f][2]]) ) ); } std::vector< std::vector > > all_segments(triangles.size()); @@ -1460,31 +1460,31 @@ void autorefine_triangle_soup(PointRange& input_points, // TODO: parallel_for? // for input points, we on purpose keep duplicated points and isolated points - for (std::size_t pid = 0; pidfirst); #endif } - TriIdsRange soup_triangles; - soup_triangles.reserve(id_triples.size()); // TODO: remove #deg tri? + TriIdsRange soup_triangles_out; + soup_triangles_out.reserve(soup_triangles.size()); // TODO: remove #deg tri? // raw copy of input triangles with no intersection - for (Input_TID f=0; fsecond=input_points.size(); - input_points.push_back(to_input(pt)); + insert_res.first->second=soup_points.size(); + soup_points.push_back(to_input(pt)); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) exact_soup_points.push_back(pt); #endif @@ -1538,7 +1538,7 @@ void autorefine_triangle_soup(PointRange& input_points, return insert_res.first; }; - soup_triangles.resize(offset + new_triangles.size()); + soup_triangles_out.resize(offset + new_triangles.size()); //use map iterator triple for triangles to create them concurrently and safely std::vector::iterator, 3>> triangle_buffer(new_triangles.size()); tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), @@ -1553,7 +1553,7 @@ void autorefine_triangle_soup(PointRange& input_points, [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - soup_triangles[offset + ti] = + soup_triangles_out[offset + ti] = { triangle_buffer[ti][0]->second, triangle_buffer[ti][1]->second, triangle_buffer[ti][2]->second }; @@ -1573,12 +1573,12 @@ void autorefine_triangle_soup(PointRange& input_points, }; //use map iterator triple for triangles to create them concurrently and safely - soup_triangles.resize(offset + new_triangles.size()); + soup_triangles_out.resize(offset + new_triangles.size()); std::vector::iterator, 3>> triangle_buffer(new_triangles.size()); tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - if (offset + ti > soup_triangles.size()) { + if (offset + ti > soup_triangles_out.size()) { std::cout << "ti = " << ti << std::endl; } const std::array& t = new_triangles[ti]; @@ -1588,17 +1588,17 @@ void autorefine_triangle_soup(PointRange& input_points, ); // the map is now filled we can safely set the point ids - std::size_t pid_offset=input_points.size(); - input_points.resize(pid_offset+iterators.size()); + std::size_t pid_offset=soup_points.size(); + soup_points.resize(pid_offset+iterators.size()); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) - exact_soup_points.resize(input_points.size()); + exact_soup_points.resize(soup_points.size()); #endif tbb::parallel_for(tbb::blocked_range(0, iterators.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - input_points[pid_offset+ti] = to_input(iterators[ti]->first); + soup_points[pid_offset+ti] = to_input(iterators[ti]->first); #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) exact_soup_points[pid_offset+ti] = iterators[ti]->first; #endif @@ -1611,7 +1611,7 @@ void autorefine_triangle_soup(PointRange& input_points, [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - soup_triangles[offset + ti] = + soup_triangles_out[offset + ti] = { triangle_buffer[ti][0]->second, triangle_buffer[ti][1]->second, triangle_buffer[ti][2]->second }; @@ -1626,9 +1626,9 @@ void autorefine_triangle_soup(PointRange& input_points, #ifdef USE_DEBUG_PARALLEL_TIMERS mode = "sequential"; #endif - soup_triangles.reserve(offset + new_triangles.size()); + soup_triangles_out.reserve(offset + new_triangles.size()); for (const std::array& t : new_triangles) - soup_triangles.push_back({ get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2])}); + soup_triangles_out.push_back({ get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2])}); } @@ -1641,16 +1641,16 @@ void autorefine_triangle_soup(PointRange& input_points, #ifndef CGAL_NDEBUG CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - CGAL_assertion( !does_triangle_soup_self_intersect(exact_soup_points, soup_triangles) ); + CGAL_assertion( !does_triangle_soup_self_intersect(exact_soup_points, soup_triangles_out) ); #else #ifdef CGAL_DEBUG_PMP_AUTOREFINE CGAL_PMP_AUTOREFINE_VERBOSE("check soup"); - if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles)) + if (does_triangle_soup_self_intersect(exact_soup_points, soup_triangles_out)) throw std::runtime_error("ERROR: invalid output, there is most probably a bug"); #endif #endif using std::swap; - swap(id_triples, soup_triangles); + swap(soup_triangles, soup_triangles_out); CGAL_PMP_AUTOREFINE_VERBOSE("done"); } From 5e8d59c4dd9deb5f1c35f0675e96c4bf91578bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 21 Jul 2023 16:22:41 +0200 Subject: [PATCH 0508/1398] Make the triangulation a template parameter of the Alpha Wrap builder Advanced users only for now: you need to know what you're doing as the geom traits need to define the Ball_3 (usually that means wrapping your Gt with AABB_AW_geom_traits) and you need to have Vb/Cb contain the AW Vb/Cb in the stack. --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 271 ++++++++++-------- 1 file changed, 148 insertions(+), 123 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index f12ad06804b1..677242e9da19 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -34,11 +34,20 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + #include #include #include #include +#include #include #include #include @@ -50,16 +59,9 @@ #include // only if non-manifoldness is not treated #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include #include #include #include @@ -74,6 +76,34 @@ namespace CGAL { namespace Alpha_wraps_3 { namespace internal { +struct Cell_info +{ + bool is_outside = false; +}; + +enum Vertex_info +{ + DEFAULT = 0, + BBOX_VERTEX, + SEED_VERTEX +}; + +template +using Alpha_wrap_triangulation_vertex_base_3 = + CGAL::Triangulation_vertex_base_with_info_3< + Vertex_info, + GeomTraits, + CGAL::Triangulation_vertex_base_3 >; + +template +using Alpha_wrap_triangulation_cell_base_3 = + CGAL::Triangulation_cell_base_with_info_3< + Cell_info, + GeomTraits, + CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3< + GeomTraits, + CGAL::Delaunay_triangulation_cell_base_3 > >; + template class Cell_base_with_timestamp : public Cb @@ -125,11 +155,34 @@ struct Wrapping_default_visitor void on_alpha_wrapping_end(const AlphaWrapper&) { }; }; -template +template class Alpha_wrap_3 { + using Oracle = Oracle_; + + // Triangulation using Base_GT = typename Oracle::Geom_traits; - using Geom_traits = Robust_circumcenter_filtered_traits_3; + using Default_Gt = Robust_circumcenter_filtered_traits_3; + + using Default_Vb = Alpha_wrap_triangulation_vertex_base_3; + using Default_Cb = Alpha_wrap_triangulation_cell_base_3; + using Default_Cbt = Cell_base_with_timestamp; // determinism + using Default_Tds = CGAL::Triangulation_data_structure_3; + using Default_Triangulation = CGAL::Delaunay_triangulation_3; + + using Triangulation = typename Default::Get::type; + + using Cell_handle = typename Triangulation::Cell_handle; + using Facet = typename Triangulation::Facet; + using Vertex_handle = typename Triangulation::Vertex_handle; + using Locate_type = typename Triangulation::Locate_type; + + using Gate = internal::Gate; + using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>; + + // Use the geom traits from the triangulation, and trust the (advanced) user that provided it + using Geom_traits = typename Triangulation::Geom_traits; using FT = typename Geom_traits::FT; using Point_3 = typename Geom_traits::Point_3; @@ -143,34 +196,6 @@ class Alpha_wrap_3 using SC_Iso_cuboid_3 = SC::Iso_cuboid_3; using SC2GT = Cartesian_converter; - struct Cell_info - { - bool is_outside = false; - }; - - enum Vertex_info - { - DEFAULT = 0, - BBOX_VERTEX, - SEED_VERTEX - }; - - using Vb = Triangulation_vertex_base_3; - using Vbi = Triangulation_vertex_base_with_info_3; - using Cbb = Delaunay_triangulation_cell_base_3; - using Cb = Delaunay_triangulation_cell_base_with_circumcenter_3; - using Cbi = Triangulation_cell_base_with_info_3; - using Cbt = Cell_base_with_timestamp; - using Tds = Triangulation_data_structure_3; - using Dt = Delaunay_triangulation_3; - - using Cell_handle = typename Dt::Cell_handle; - using Facet = typename Dt::Facet; - using Vertex_handle = typename Dt::Vertex_handle; - using Locate_type = typename Dt::Locate_type; - - using Gate = internal::Gate
    ; - using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>; protected: const Oracle m_oracle; @@ -179,7 +204,7 @@ class Alpha_wrap_3 FT m_alpha, m_sq_alpha; FT m_offset, m_sq_offset; - Dt m_dt; + Triangulation m_tr; Alpha_PQ m_queue; public: @@ -187,7 +212,7 @@ class Alpha_wrap_3 Alpha_wrap_3(const Oracle& oracle) : m_oracle(oracle), - m_dt(Geom_traits(oracle.geom_traits())), + m_tr(Geom_traits(oracle.geom_traits())), // used to set up the initial MPQ, use some arbitrary not-too-small value m_queue(4096) { @@ -197,9 +222,9 @@ class Alpha_wrap_3 } public: - const Geom_traits& geom_traits() const { return m_dt.geom_traits(); } - Dt& triangulation() { return m_dt; } - const Dt& triangulation() const { return m_dt; } + const Geom_traits& geom_traits() const { return m_tr.geom_traits(); } + Triangulation& triangulation() { return m_tr; } + const Triangulation& triangulation() const { return m_tr; } const Alpha_PQ& queue() const { return m_queue; } double default_alpha() const @@ -216,13 +241,13 @@ class Alpha_wrap_3 const Point_3& circumcenter(const Cell_handle c) const { // We only cross an infinite facet once, so this isn't going to be recomputed many times - if(m_dt.is_infinite(c)) + if(m_tr.is_infinite(c)) { - const int inf_index = c->index(m_dt.infinite_vertex()); + const int inf_index = c->index(m_tr.infinite_vertex()); c->set_circumcenter( - geom_traits().construct_circumcenter_3_object()(m_dt.point(c, (inf_index+1)&3), - m_dt.point(c, (inf_index+2)&3), - m_dt.point(c, (inf_index+3)&3))); + geom_traits().construct_circumcenter_3_object()(m_tr.point(c, (inf_index+1)&3), + m_tr.point(c, (inf_index+2)&3), + m_tr.point(c, (inf_index+3)&3))); } return c->circumcenter(geom_traits()); @@ -418,7 +443,7 @@ class Alpha_wrap_3 for(int i=0; i<8; ++i) { const Point_3 bp = SC2GT()(m_bbox.vertex(i)); - Vertex_handle bv = m_dt.insert(bp); + Vertex_handle bv = m_tr.insert(bp); #ifdef CGAL_AW3_DEBUG_INITIALIZATION std::cout << "\t" << bp << std::endl; #endif @@ -433,7 +458,7 @@ class Alpha_wrap_3 // that the refinement point is separated from the existing point set. bool cavity_cell_outside_tag(const Cell_handle ch) { - CGAL_precondition(!m_dt.is_infinite(ch)); + CGAL_precondition(!m_tr.is_infinite(ch)); const Tetrahedron_with_outside_info tet(ch, geom_traits()); if(m_oracle.do_intersect(tet)) @@ -536,7 +561,7 @@ class Alpha_wrap_3 // This problem only appears when the seed and icosahedron vertices are close to the offset surface, // which usually happens for large alpha values. - Vertex_handle seed_v = m_dt.insert(seed_p); + Vertex_handle seed_v = m_tr.insert(seed_p); seed_v->info() = SEED_VERTEX; seed_vs.push_back(seed_v); @@ -573,7 +598,7 @@ class Alpha_wrap_3 if(bbox.has_on_unbounded_side(seed_neighbor_p)) continue; - Vertex_handle ico_v = m_dt.insert(seed_neighbor_p, seed_v /*hint*/); + Vertex_handle ico_v = m_tr.insert(seed_neighbor_p, seed_v /*hint*/); ico_v->info() = SEED_VERTEX; } } @@ -587,26 +612,26 @@ class Alpha_wrap_3 } #ifdef CGAL_AW3_DEBUG_INITIALIZATION - std::cout << m_dt.number_of_vertices() - 8 /*bbox*/ << " vertice(s) due to seeds" << std::endl; + std::cout << m_tr.number_of_vertices() - 8 /*bbox*/ << " vertice(s) due to seeds" << std::endl; #endif for(Vertex_handle seed_v : seed_vs) { std::vector inc_cells; inc_cells.reserve(64); - m_dt.incident_cells(seed_v, std::back_inserter(inc_cells)); + m_tr.incident_cells(seed_v, std::back_inserter(inc_cells)); for(Cell_handle ch : inc_cells) ch->info().is_outside = cavity_cell_outside_tag(ch); } // Might as well go through the full triangulation since only seeds should have been inserted - for(Cell_handle ch : m_dt.all_cell_handles()) + for(Cell_handle ch : m_tr.all_cell_handles()) { if(!ch->info().is_outside) continue; // When the algorithm starts from a manually dug hole, infinite cells are tagged "inside" - CGAL_assertion(!m_dt.is_infinite(ch)); + CGAL_assertion(!m_tr.is_infinite(ch)); for(int i=0; i<4; ++i) push_facet(std::make_pair(ch, i)); @@ -627,12 +652,12 @@ class Alpha_wrap_3 // init queue with all convex hull facets bool initialize_from_infinity() { - for(Cell_handle ch : m_dt.all_cell_handles()) + for(Cell_handle ch : m_tr.all_cell_handles()) { - if(m_dt.is_infinite(ch)) + if(m_tr.is_infinite(ch)) { ch->info().is_outside = true; - const int inf_index = ch->index(m_dt.infinite_vertex()); + const int inf_index = ch->index(m_tr.infinite_vertex()); push_facet(std::make_pair(ch, inf_index)); } else @@ -659,10 +684,10 @@ class Alpha_wrap_3 clear(output_mesh); - CGAL_assertion_code(for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit)) + CGAL_assertion_code(for(auto cit=m_tr.finite_cells_begin(), cend=m_tr.finite_cells_end(); cit!=cend; ++cit)) CGAL_assertion(cit->tds_data().is_clear()); - for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit) + for(auto cit=m_tr.finite_cells_begin(), cend=m_tr.finite_cells_end(); cit!=cend; ++cit) { Cell_handle seed = cit; if(seed->info().is_outside || seed->tds_data().processed()) @@ -678,7 +703,7 @@ class Alpha_wrap_3 while(!to_visit.empty()) { const Cell_handle cell = to_visit.front(); - CGAL_assertion(!cell->info().is_outside && !m_dt.is_infinite(cell)); + CGAL_assertion(!cell->info().is_outside && !m_tr.is_infinite(cell)); to_visit.pop(); @@ -698,9 +723,9 @@ class Alpha_wrap_3 // CGAL_assertion(cell->vertex((fid + 2)&3)->info() == DEFAULT); // CGAL_assertion(cell->vertex((fid + 3)&3)->info() == DEFAULT); - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 0))); - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 1))); - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 2))); + points.push_back(m_tr.point(cell, Triangulation::vertex_triple_index(fid, 0))); + points.push_back(m_tr.point(cell, Triangulation::vertex_triple_index(fid, 1))); + points.push_back(m_tr.point(cell, Triangulation::vertex_triple_index(fid, 2))); faces.push_back({idx, idx + 1, idx + 2}); idx += 3; } @@ -722,7 +747,7 @@ class Alpha_wrap_3 CGAL_assertion(is_closed(output_mesh)); } - for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit) + for(auto cit=m_tr.finite_cells_begin(), cend=m_tr.finite_cells_end(); cit!=cend; ++cit) cit->tds_data().clear(); CGAL_postcondition(!is_empty(output_mesh)); @@ -742,7 +767,7 @@ class Alpha_wrap_3 std::cout << "> Extract wrap... ()" << std::endl; #endif - CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles())) + CGAL_assertion_code(for(Vertex_handle v : m_tr.finite_vertex_handles())) CGAL_assertion(!is_non_manifold(v)); clear(output_mesh); @@ -754,11 +779,11 @@ class Alpha_wrap_3 std::unordered_map vertex_to_id; std::size_t nv = 0; - for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit) + for(auto fit=m_tr.finite_facets_begin(), fend=m_tr.finite_facets_end(); fit!=fend; ++fit) { Facet f = *fit; if(!f.first->info().is_outside) - f = m_dt.mirror_facet(f); + f = m_tr.mirror_facet(f); const Cell_handle c = f.first; const int s = f.second; @@ -769,11 +794,11 @@ class Alpha_wrap_3 std::array ids; for(int pos=0; pos<3; ++pos) { - Vertex_handle vh = c->vertex(Dt::vertex_triple_index(s, pos)); + Vertex_handle vh = c->vertex(Triangulation::vertex_triple_index(s, pos)); auto insertion_res = vertex_to_id.emplace(vh, nv); if(insertion_res.second) // successful insertion, never-seen-before vertex { - points.push_back(m_dt.point(vh)); + points.push_back(m_tr.point(vh)); ++nv; } @@ -817,14 +842,14 @@ class Alpha_wrap_3 private: bool is_traversable(const Facet& f) const { - return less_squared_radius_of_min_empty_sphere(m_sq_alpha, f, m_dt); + return less_squared_radius_of_min_empty_sphere(m_sq_alpha, f, m_tr); } bool compute_steiner_point(const Cell_handle ch, const Cell_handle neighbor, Point_3& steiner_point) const { - CGAL_precondition(!m_dt.is_infinite(neighbor)); + CGAL_precondition(!m_tr.is_infinite(neighbor)); typename Geom_traits::Construct_ball_3 ball = geom_traits().construct_ball_3_object(); typename Geom_traits::Construct_vector_3 vector = geom_traits().construct_vector_3_object(); @@ -920,7 +945,7 @@ class Alpha_wrap_3 // e.g. from DT3 Facet_queue_status facet_status(const Facet& f) const { - CGAL_precondition(!m_dt.is_infinite(f)); + CGAL_precondition(!m_tr.is_infinite(f)); #ifdef CGAL_AW3_DEBUG_FACET_STATUS std::cout << "facet status: " @@ -933,7 +958,7 @@ class Alpha_wrap_3 const Cell_handle ch = f.first; const int id = f.second; const Cell_handle nh = ch->neighbor(id); - if(m_dt.is_infinite(nh)) + if(m_tr.is_infinite(nh)) return TRAVERSABLE; if(nh->info().is_outside) @@ -947,7 +972,7 @@ class Alpha_wrap_3 // push if facet is connected to artificial vertices for(int i=0; i<3; ++i) { - const Vertex_handle vh = ch->vertex(Dt::vertex_triple_index(id, i)); + const Vertex_handle vh = ch->vertex(Triangulation::vertex_triple_index(id, i)); if(vh->info() == BBOX_VERTEX || vh->info() == SEED_VERTEX) { #ifdef CGAL_AW3_DEBUG_FACET_STATUS @@ -986,9 +1011,9 @@ class Alpha_wrap_3 const Cell_handle ch = f.first; const int id = f.second; - const Point_3& p0 = m_dt.point(ch, (id+1)&3); - const Point_3& p1 = m_dt.point(ch, (id+2)&3); - const Point_3& p2 = m_dt.point(ch, (id+3)&3); + const Point_3& p0 = m_tr.point(ch, (id+1)&3); + const Point_3& p1 = m_tr.point(ch, (id+2)&3); + const Point_3& p2 = m_tr.point(ch, (id+3)&3); // @todo should prob be the real value we compare to alpha instead of squared_radius const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2); @@ -1022,7 +1047,7 @@ class Alpha_wrap_3 m_offset = FT(offset); m_sq_offset = square(m_offset); - m_dt.clear(); + m_tr.clear(); m_queue.clear(); insert_bbox_corners(); @@ -1052,7 +1077,7 @@ class Alpha_wrap_3 // const& to something that will be popped, but safe as `ch` && `id` are extracted before the pop const Gate& gate = m_queue.top(); const Facet& f = gate.facet(); - CGAL_precondition(!m_dt.is_infinite(f)); + CGAL_precondition(!m_tr.is_infinite(f)); const Cell_handle ch = f.first; const int id = f.second; @@ -1060,11 +1085,11 @@ class Alpha_wrap_3 #ifdef CGAL_AW3_DEBUG_QUEUE static int fid = 0; - std::cout << m_dt.number_of_vertices() << " DT vertices" << std::endl; + std::cout << m_tr.number_of_vertices() << " DT vertices" << std::endl; std::cout << m_queue.size() << " facets in the queue" << std::endl; std::cout << "Face " << fid++ << "\n" - << "c = " << &*ch << " (" << m_dt.is_infinite(ch) << "), n = " << &*neighbor << " (" << m_dt.is_infinite(neighbor) << ")" << "\n" - << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl; + << "c = " << &*ch << " (" << m_tr.is_infinite(ch) << "), n = " << &*neighbor << " (" << m_tr.is_infinite(neighbor) << ")" << "\n" + << m_tr.point(ch, (id+1)&3) << "\n" << m_tr.point(ch, (id+2)&3) << "\n" << m_tr.point(ch, (id+3)&3) << std::endl; std::cout << "Priority: " << gate.priority() << std::endl; #endif @@ -1080,11 +1105,11 @@ class Alpha_wrap_3 std::string face_name = "results/steps/face_" + std::to_string(static_cast(i++)) + ".xyz"; std::ofstream face_out(face_name); face_out.precision(17); - face_out << "3\n" << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl; + face_out << "3\n" << m_tr.point(ch, (id+1)&3) << "\n" << m_tr.point(ch, (id+2)&3) << "\n" << m_tr.point(ch, (id+3)&3) << std::endl; face_out.close(); #endif - if(m_dt.is_infinite(neighbor)) + if(m_tr.is_infinite(neighbor)) { neighbor->info().is_outside = true; continue; @@ -1100,14 +1125,14 @@ class Alpha_wrap_3 // locate cells that are going to be destroyed and remove their facet from the queue int li, lj = 0; Locate_type lt; - const Cell_handle conflict_cell = m_dt.locate(steiner_point, lt, li, lj, neighbor); - CGAL_assertion(lt != Dt::VERTEX); + const Cell_handle conflict_cell = m_tr.locate(steiner_point, lt, li, lj, neighbor); + CGAL_assertion(lt != Triangulation::VERTEX); std::vector boundary_facets; std::vector conflict_zone; boundary_facets.reserve(32); conflict_zone.reserve(32); - m_dt.find_conflicts(steiner_point, conflict_cell, + m_tr.find_conflicts(steiner_point, conflict_cell, std::back_inserter(boundary_facets), std::back_inserter(conflict_zone)); @@ -1125,7 +1150,7 @@ class Alpha_wrap_3 for(const Facet& f : boundary_facets) { - const Facet mf = m_dt.mirror_facet(f); // boundary facets have incident cells in the CZ + const Facet mf = m_tr.mirror_facet(f); // boundary facets have incident cells in the CZ if(m_queue.contains_with_bounds_check(Gate(mf))) m_queue.erase(Gate(mf)); } @@ -1133,18 +1158,18 @@ class Alpha_wrap_3 visitor.before_Steiner_point_insertion(*this, steiner_point); // Actual insertion of the Steiner point - Vertex_handle vh = m_dt.insert(steiner_point, lt, conflict_cell, li, lj); + Vertex_handle vh = m_tr.insert(steiner_point, lt, conflict_cell, li, lj); vh->info() = DEFAULT; visitor.after_Steiner_point_insertion(*this, vh); std::vector new_cells; new_cells.reserve(32); - m_dt.incident_cells(vh, std::back_inserter(new_cells)); + m_tr.incident_cells(vh, std::back_inserter(new_cells)); for(const Cell_handle& ch : new_cells) { // std::cout << "new cell has time stamp " << ch->time_stamp() << std::endl; - ch->info().is_outside = m_dt.is_infinite(ch); + ch->info().is_outside = m_tr.is_infinite(ch); } // Push all new boundary facets to the queue. @@ -1156,7 +1181,7 @@ class Alpha_wrap_3 { for(int i=0; i<4; ++i) { - if(m_dt.is_infinite(ch, i)) + if(m_tr.is_infinite(ch, i)) continue; const Cell_handle nh = ch->neighbor(i); @@ -1167,7 +1192,7 @@ class Alpha_wrap_3 if(ch->info().is_outside) push_facet(boundary_f); else - push_facet(m_dt.mirror_facet(boundary_f)); + push_facet(m_tr.mirror_facet(boundary_f)); } } } @@ -1188,10 +1213,10 @@ class Alpha_wrap_3 visitor.on_flood_fill_end(*this); // Check that no useful facet has been ignored - CGAL_postcondition_code(for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit) {) + CGAL_postcondition_code(for(auto fit=m_tr.finite_facets_begin(), fend=m_tr.finite_facets_end(); fit!=fend; ++fit) {) CGAL_postcondition_code( if(fit->first->info().is_outside == fit->first->neighbor(fit->second)->info().is_outside) continue;) CGAL_postcondition_code( Facet f = *fit;) - CGAL_postcondition_code( if(!fit->first->info().is_outside) f = m_dt.mirror_facet(f);) + CGAL_postcondition_code( if(!fit->first->info().is_outside) f = m_tr.mirror_facet(f);) CGAL_postcondition( facet_status(f) == IRRELEVANT); CGAL_postcondition_code(}) } @@ -1199,13 +1224,13 @@ class Alpha_wrap_3 private: bool is_non_manifold(Vertex_handle v) const { - CGAL_precondition(!m_dt.is_infinite(v)); + CGAL_precondition(!m_tr.is_infinite(v)); bool is_non_manifold = false; std::vector inc_cells; inc_cells.reserve(64); - m_dt.incident_cells(v, std::back_inserter(inc_cells)); + m_tr.incident_cells(v, std::back_inserter(inc_cells)); // Flood one inside and outside CC. // Process both an inside and an outside CC to also detect edge pinching. @@ -1278,7 +1303,7 @@ class Alpha_wrap_3 bool is_non_manifold(Cell_handle c) const { - CGAL_precondition(!m_dt.is_infinite(c)); + CGAL_precondition(!m_tr.is_infinite(c)); for(int i=0; i<4; ++i) { @@ -1294,7 +1319,7 @@ class Alpha_wrap_3 { // Not the best complexity, but it's not important: this function is purely for information // Better complexity --> see PMP::non_manifold_vertices + throw - for(const Vertex_handle v : m_dt.finite_vertex_handles()) + for(const Vertex_handle v : m_tr.finite_vertex_handles()) if(is_non_manifold(v)) return true; @@ -1307,14 +1332,14 @@ class Alpha_wrap_3 bool remove_bbox_vertices() { bool do_remove = true; - auto vit = m_dt.finite_vertices_begin(); + auto vit = m_tr.finite_vertices_begin(); for(std::size_t i=0; i<8; ++i) { Vertex_handle v = vit++; std::vector inc_cells; inc_cells.reserve(64); - m_dt.finite_incident_cells(v, std::back_inserter(inc_cells)); + m_tr.finite_incident_cells(v, std::back_inserter(inc_cells)); for(Cell_handle c : inc_cells) { @@ -1333,11 +1358,11 @@ class Alpha_wrap_3 if(!do_remove) return false; - vit = m_dt.finite_vertices_begin(); + vit = m_tr.finite_vertices_begin(); for(std::size_t i=0; i<8; ++i) { Vertex_handle v = vit++; - m_dt.remove(v); + m_tr.remove(v); } return true; @@ -1355,7 +1380,7 @@ class Alpha_wrap_3 // remove_bbox_vertices(); std::stack non_manifold_vertices; // @todo sort somehow? - for(Vertex_handle v : m_dt.finite_vertex_handles()) + for(Vertex_handle v : m_tr.finite_vertex_handles()) { if(is_non_manifold(v)) non_manifold_vertices.push(v); @@ -1395,17 +1420,17 @@ class Alpha_wrap_3 // auto sq_circumradius = [&](Cell_handle c) -> FT // { // const Point_3& cc = circumcenter(c); -// return geom_traits().compute_squared_distance_3_object()(m_dt.point(c, 0), cc); +// return geom_traits().compute_squared_distance_3_object()(m_tr.point(c, 0), cc); // }; auto sq_longest_edge = [&](Cell_handle c) -> FT { - return (std::max)({ squared_distance(m_dt.point(c, 0), m_dt.point(c, 1)), - squared_distance(m_dt.point(c, 0), m_dt.point(c, 2)), - squared_distance(m_dt.point(c, 0), m_dt.point(c, 3)), - squared_distance(m_dt.point(c, 1), m_dt.point(c, 2)), - squared_distance(m_dt.point(c, 3), m_dt.point(c, 3)), - squared_distance(m_dt.point(c, 2), m_dt.point(c, 3)) }); + return (std::max)({ squared_distance(m_tr.point(c, 0), m_tr.point(c, 1)), + squared_distance(m_tr.point(c, 0), m_tr.point(c, 2)), + squared_distance(m_tr.point(c, 0), m_tr.point(c, 3)), + squared_distance(m_tr.point(c, 1), m_tr.point(c, 2)), + squared_distance(m_tr.point(c, 3), m_tr.point(c, 3)), + squared_distance(m_tr.point(c, 2), m_tr.point(c, 3)) }); }; #ifdef CGAL_AW3_DEBUG_MANIFOLDNESS @@ -1450,7 +1475,7 @@ class Alpha_wrap_3 std::vector inc_cells; inc_cells.reserve(64); - m_dt.finite_incident_cells(v, std::back_inserter(inc_cells)); + m_tr.finite_incident_cells(v, std::back_inserter(inc_cells)); #define CGAL_AW3_USE_BRUTE_FORCE_MUTABLE_PRIORITY_QUEUE #ifndef CGAL_AW3_USE_BRUTE_FORCE_MUTABLE_PRIORITY_QUEUE @@ -1464,7 +1489,7 @@ class Alpha_wrap_3 std::sort(cit, cend, comparer); #endif Cell_handle ic = *cit; - CGAL_assertion(!m_dt.is_infinite(ic)); + CGAL_assertion(!m_tr.is_infinite(ic)); // This is where new material is added ic->info().is_outside = false; @@ -1484,14 +1509,14 @@ class Alpha_wrap_3 std::vector adj_vertices; adj_vertices.reserve(64); - m_dt.finite_adjacent_vertices(v, std::back_inserter(adj_vertices)); + m_tr.finite_adjacent_vertices(v, std::back_inserter(adj_vertices)); for(Vertex_handle nv : adj_vertices) if(is_non_manifold(nv)) non_manifold_vertices.push(nv); } - CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles())) + CGAL_assertion_code(for(Vertex_handle v : m_tr.finite_vertex_handles())) CGAL_assertion(!is_non_manifold(v)); } @@ -1508,12 +1533,12 @@ class Alpha_wrap_3 const Facet& current_f = current_gate.facet(); const Cell_handle ch = current_f.first; const int id = current_f.second; - const Point_3& p0 = m_dt.point(ch, (id+1)&3); - const Point_3& p1 = m_dt.point(ch, (id+2)&3); - const Point_3& p2 = m_dt.point(ch, (id+3)&3); + const Point_3& p0 = m_tr.point(ch, (id+1)&3); + const Point_3& p1 = m_tr.point(ch, (id+2)&3); + const Point_3& p2 = m_tr.point(ch, (id+3)&3); const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2); - std::cout << "At Facet with VID " << get(Gate_ID_PM
    (), current_gate) << std::endl; + std::cout << "At Facet with VID " << get(Gate_ID_PM(), current_gate) << std::endl; if(current_gate.priority() != sqr) std::cerr << "Error: facet in queue has wrong priority" << std::endl; @@ -1546,7 +1571,7 @@ class Alpha_wrap_3 std::size_t nv = 0; std::size_t nf = 0; - for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit) + for(auto fit=m_tr.finite_facets_begin(), fend=m_tr.finite_facets_end(); fit!=fend; ++fit) { Cell_handle c = fit->first; int s = fit->second; @@ -1562,7 +1587,7 @@ class Alpha_wrap_3 auto insertion_res = vertex_to_id.emplace(v, nv); if(insertion_res.second) { - vertices_ss << m_dt.point(v) << "\n"; + vertices_ss << m_tr.point(v) << "\n"; ++nv; } From 924f2df4925ac6f1da1f523654a50ac79a86b9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 21 Jul 2023 16:24:45 +0200 Subject: [PATCH 0509/1398] Add an example: remeshing the (internal) 3D triangulation of an alpha wrap --- .../examples/Alpha_wrap_3/CMakeLists.txt | 1 + .../examples/Alpha_wrap_3/volumetric_wrap.cpp | 174 ++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt index 2014b9baa7ca..0be54f87eed0 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt @@ -12,3 +12,4 @@ create_single_source_cgal_program("triangle_soup_wrap.cpp") create_single_source_cgal_program("point_set_wrap.cpp") create_single_source_cgal_program("wrap_from_cavity.cpp") create_single_source_cgal_program("mixed_inputs_wrap.cpp") +create_single_source_cgal_program("volumetric_wrap.cpp") diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp new file mode 100644 index 000000000000..7fb4d4704207 --- /dev/null +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -0,0 +1,174 @@ +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; +namespace AW3i = CGAL::Alpha_wraps_3::internal; + +using K = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_3 = K::Point_3; + +using Points = std::vector; +using Face = std::array; +using Faces = std::vector; + +using Mesh = CGAL::Surface_mesh; + +// If we provide a triangulation, AW3 uses its Gt, so we have to make the Gt stack explicit +using Gtb = AW3i::Alpha_wrap_AABB_geom_traits; // provides Ball_3 +using Gt = CGAL::Robust_circumcenter_filtered_traits_3; // better inexact constructions (not mandatory) + +// Since we are going to use tetrahedral remeshing on the underlying triangulation, +// we need special vertex and cell base types that meets the requirements of the +// tetrahedral remeshing concepts +using Vbbb = AW3i::Alpha_wrap_triangulation_vertex_base_3; +using Vbb = CGAL::Simplicial_mesh_vertex_base_3; +using Vb = CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3; + +using Cbbb = AW3i::Alpha_wrap_triangulation_cell_base_3; +using Cbb = CGAL::Simplicial_mesh_cell_base_3; +using Cb = CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3; + +using Tds = CGAL::Triangulation_data_structure_3; + +using Delaunay_triangulation = CGAL::Delaunay_triangulation_3; + +// because the Fast_location does all kinds of rebinding shenanigans + T3_hierarchy is in the stack... +using Triangulation = CGAL::Triangulation_3; + +using Facet = Triangulation::Facet; + +int main(int argc, char** argv) +{ + // Read the input + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/armadillo.off"); + std::cout << "Reading " << filename << "..." << std::endl; + + Points points; + Faces faces; + if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty()) + { + std::cerr << "Invalid input." << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Input: " << points.size() << " vertices, " << faces.size() << " faces" << std::endl; + + // Compute the alpha and offset values + const double relative_alpha = (argc > 2) ? std::stod(argv[2]) : 20.; + const double relative_offset = (argc > 3) ? std::stod(argv[3]) : 600.; + + CGAL::Bbox_3 bbox; + for(const Point_3& p : points) + bbox += p.bbox(); + + const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); + + const double alpha = diag_length / relative_alpha; + const double offset = diag_length / relative_offset; + std::cout << "alpha: " << alpha << ", offset: " << offset << std::endl; + + // Construct the wrap + CGAL::Real_timer t; + t.start(); + + using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_soup_oracle; + + Oracle oracle(K{}); + oracle.add_triangle_soup(points, faces, CGAL::parameters::default_values()); + + CGAL::Alpha_wraps_3::internal::Alpha_wrap_3 aw3(oracle); + Mesh wrap; + aw3(alpha, offset, wrap); + + t.stop(); + std::cout << "Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl; + std::cout << "Took " << t.time() << " s." << std::endl; + + // Get the interior tetrahedrization + auto dt = aw3.triangulation(); + + // Save the result + std::string input_name = std::string(filename); + input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); + input_name = input_name.substr(0, input_name.find_last_of(".")); + std::string output_name = input_name + + "_" + std::to_string(static_cast(relative_alpha)) + + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + std::cout << "Writing to " << output_name << std::endl; + CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); + + // Remesh the interior of the wrap + const Delaunay_triangulation& aw3_dt = aw3.triangulation(); + const Triangulation& aw3_tr = static_cast(aw3_dt); + Triangulation tr = aw3_tr; // intentional copy + + std::cout << "BEFORE: " << tr.number_of_vertices() << " vertices, " << tr.number_of_cells() << " cells" << std::endl; + + // Set up the domain information and grab the boundary faces + std::set boundary_facets; + + for(auto v : tr.finite_vertex_handles()) + v->set_dimension(3); + + for(auto c : tr.finite_cell_handles()) + { + if(c->info().is_outside) + c->set_subdomain_index(0); + else + c->set_subdomain_index(1); + + // if the neighboring cell has a different outside info, put the vertices + // of the common face on the surface boundary + for(int i=0; i<4; ++i) + { + if(c->neighbor(i)->info().is_outside != c->info().is_outside) + { + c->set_surface_patch_index(i, 1); + boundary_facets.emplace(c, i); + for(int j=1; j<4; ++j) + c->vertex((i+j)%4)->set_dimension(2); + } + } + } + + // CGAL::draw(tr); + std::ofstream out_before("before_remeshing.mesh"); + CGAL::IO::write_MEDIT(out_before, tr); + + auto fcm = CGAL::make_boolean_property_map(boundary_facets); + CGAL::tetrahedral_isotropic_remeshing(tr, alpha, + CGAL::parameters::facet_is_constrained_map(fcm)); + + std::cout << "AFTER: " << tr.number_of_vertices() << " vertices, " << tr.number_of_cells() << " cells" << std::endl; + + // CGAL::draw(tr); + std::ofstream out_after("after_remeshing.mesh"); + CGAL::IO::write_MEDIT(out_after, tr); + + return EXIT_SUCCESS; +} From e0bb872d8a8160bf962236a1528ae288b39d6085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 21 Jul 2023 16:26:12 +0200 Subject: [PATCH 0510/1398] Minor doc typo --- .../doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt index 6336998d527c..5ae7a8273737 100644 --- a/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt +++ b/Tetrahedral_remeshing/doc/Tetrahedral_remeshing/Tetrahedral_remeshing.txt @@ -15,7 +15,7 @@ namespace CGAL { \section secTetRemeshing Multi-Material Isotropic Tetrahedral Remeshing This package implements an algorithm for quality tetrahedral remeshing, -introduced by N.Faraj et al in \cgalCite{faraj2016mvr}. +introduced by Faraj et al in \cgalCite{faraj2016mvr}. This practical iterative remeshing algorithm is designed to remesh multi-material tetrahedral meshes, by iteratively performing a sequence of elementary operations such as edge splits, edge collapses, edge flips, From e1d7105c1cf58cabbd38d71cc3a5be8aa871ddf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 21 Jul 2023 16:47:03 +0200 Subject: [PATCH 0511/1398] add visitor + add calls to the visitor --- .../Concepts/PMPAutorefinementVisitor.h | 25 +++++++ .../Polygon_mesh_processing/autorefinement.h | 75 +++++++++++++++---- 2 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPAutorefinementVisitor.h diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPAutorefinementVisitor.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPAutorefinementVisitor.h new file mode 100644 index 000000000000..e3ef90e9be03 --- /dev/null +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPAutorefinementVisitor.h @@ -0,0 +1,25 @@ +/// \ingroup PkgPolygonMeshProcessingConcepts +/// \cgalConcept +/// +/// The concept `PMPAutorefinementVisitor` defines the requirements for the visitor +/// used in `CGAL::Polygon_mesh_processing::autorefine_triangle_soup()` to track +/// the creation of new triangles. +/// +/// \cgalRefines{CopyConstructible} +/// \cgalHasModel `CGAL::Polygon_mesh_processing::Autorefinement::Default_visitor`. + +class PMPAutorefinementVisitor{ +public: + +/// @name Functions called only if at least one intersection has been found +/// @{ + /// called when the final number of output triangles is known, `nbt` being the total number of triangles in the output. + void number_of_output_triangles(std::size_t nbt); + /// called for triangle with no intersection, `tgt_id` is the position in the triangle container after calling + /// `autorefine_triangle_soup()`, while `src_id` was its position before calling the function. + void verbatim_triangle_copy(std::size_t tgt_id, std::size_t src_id); + /// called for each subtriangle created from a triangle with intersection, `tgt_id` is the position in the triangle container after calling + /// `autorefine_triangle_soup()` of the subtriangle, while `src_id` was the position of the original support triangle before calling the function. + void new_subtriangle(std::size_t tgt_id, std::size_t src_id); +/// @} +}; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 0054a9dcdb2d..166c950a9830 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -77,6 +77,24 @@ namespace CGAL { namespace Polygon_mesh_processing { +namespace Autorefinement { + +/** \ingroup PMP_corefinement_grp + * %Default visitor model of `PMPAutorefinementVisitor`. + * All of its functions have an empty body. This class can be used as a + * base class if only some of the functions of the concept require to be + * overridden. + */ +struct Default_visitor +{ + inline void number_of_output_triangles(std::size_t /*nbt*/) {} + inline void verbatim_triangle_copy(std::size_t /*tgt_id*/, std::size_t /*src_id*/) {} + inline void new_subtriangle(std::size_t /*tgt_id*/, std::size_t /*src_id*/) {} +}; + +} // end of Autorefinement visitor + + #ifndef DOXYGEN_RUNNING namespace autorefine_impl { @@ -1079,13 +1097,13 @@ void generate_subtriangles(std::size_t ti, for (typename CDT::Face_handle fh : cdt.finite_face_handles()) { if (orientation_flipped) - new_triangles.push_back( CGAL::make_array(fh->vertex(0)->point(), - fh->vertex(cdt.cw(0))->point(), - fh->vertex(cdt.ccw(0))->point()) ); + new_triangles.push_back( { CGAL::make_array(fh->vertex(0)->point(), + fh->vertex(cdt.cw(0))->point(), + fh->vertex(cdt.ccw(0))->point()), ti } ); else - new_triangles.push_back( CGAL::make_array(fh->vertex(0)->point(), - fh->vertex(cdt.ccw(0))->point(), - fh->vertex(cdt.cw(0))->point()) ); + new_triangles.push_back( { CGAL::make_array(fh->vertex(0)->point(), + fh->vertex(cdt.ccw(0))->point(), + fh->vertex(cdt.cw(0))->point()), ti } ); #ifdef CGAL_DEBUG_PMP_AUTOREFINE_DUMP_TRIANGULATIONS ++nbt; buffer << fh->vertex(0)->point() << "\n"; @@ -1143,8 +1161,9 @@ void generate_subtriangles(std::size_t ti, * \cgalParamNEnd * \cgalParamNBegin{visitor} * \cgalParamDescription{a visitor used to track the creation of new faces} -* \cgalParamType{a class model of `PMPFooBar`} -* \cgalParamDefault{`Autorefinement::Default_visitor`} +* \cgalParamType{a class model of `PMPAutorefinementVisitor`} +* \cgalParamDefault{`Autorefinement::Default_visitor`} +* \cgalParamExtra{The visitor will be copied.} * \cgalParamNEnd * \cgalNamedParamsEnd * @@ -1167,6 +1186,15 @@ void autorefine_triangle_soup(PointRange& soup_points, Sequential_tag > ::type Concurrency_tag; + // visitor + typedef typename internal_np::Lookup_named_param_def < + internal_np::visitor_t, + NamedParameters, + Autorefinement::Default_visitor//default + > ::type Visitor; + Visitor visitor(choose_parameter(get_parameter(np, internal_np::visitor))); + + constexpr bool parallel_execution = std::is_same_v; #ifndef CGAL_LINKED_WITH_TBB @@ -1369,10 +1397,10 @@ void autorefine_triangle_soup(PointRange& soup_points, // now refine triangles #ifdef CGAL_LINKED_WITH_TBB std::conditional_t>, - std::vector>> new_triangles; + tbb::concurrent_vector, std::size_t>>, + std::vector, std::size_t>>> new_triangles; #else - std::vector> new_triangles; + std::vector, std::size_t>> new_triangles; #endif #ifdef USE_PROGRESS_DISPLAY @@ -1382,7 +1410,7 @@ void autorefine_triangle_soup(PointRange& soup_points, auto refine_triangles = [&](std::size_t ti) { if (all_segments[ti].empty() && all_points[ti].empty()) - new_triangles.push_back(triangles[ti]); + new_triangles.push_back({triangles[ti], ti}); else { #ifdef USE_FIXED_PROJECTION_TRAITS @@ -1475,7 +1503,10 @@ void autorefine_triangle_soup(PointRange& soup_points, TriIdsRange soup_triangles_out; soup_triangles_out.reserve(soup_triangles.size()); // TODO: remove #deg tri? + visitor.number_of_output_triangles(soup_triangles.size()+new_triangles.size()); + // raw copy of input triangles with no intersection + std::vector tri_inter_ids_inverse(triangles.size()); for (Input_TID f=0; f(0, new_triangles.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { - const std::array& t = new_triangles[ti]; + const std::array& t = new_triangles[ti].first; + visitor.new_subtriangle(offset+ti, tri_inter_ids_inverse[new_triangles[ti].second]); triangle_buffer[ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); } } @@ -1581,7 +1618,8 @@ void autorefine_triangle_soup(PointRange& soup_points, if (offset + ti > soup_triangles_out.size()) { std::cout << "ti = " << ti << std::endl; } - const std::array& t = new_triangles[ti]; + const std::array& t = new_triangles[ti].first; + visitor.new_subtriangle(offset+ti, tri_inter_ids_inverse[new_triangles[ti].second]); triangle_buffer[ti] = CGAL::make_array(concurrent_get_point_id(t[0]), concurrent_get_point_id(t[1]), concurrent_get_point_id(t[2])); } } @@ -1627,8 +1665,13 @@ void autorefine_triangle_soup(PointRange& soup_points, mode = "sequential"; #endif soup_triangles_out.reserve(offset + new_triangles.size()); - for (const std::array& t : new_triangles) - soup_triangles_out.push_back({ get_point_id(t[0]), get_point_id(t[1]), get_point_id(t[2])}); + for (const std::pair, std::size_t>& t_and_id : new_triangles) + { + visitor.new_subtriangle(soup_triangles_out.size(), tri_inter_ids_inverse[t_and_id.second]); + soup_triangles_out.push_back({ get_point_id(t_and_id.first[0]), + get_point_id(t_and_id.first[1]), + get_point_id(t_and_id.first[2]) }); + } } From 9822f371dded06a2538281c5f97b0d343a5c0939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 21 Jul 2023 16:54:21 +0200 Subject: [PATCH 0512/1398] doc precision --- .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 166c950a9830..6bbb5571e7a1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1702,6 +1702,9 @@ void autorefine_triangle_soup(PointRange& soup_points, * \ingroup PMP_corefinement_grp * refines a triangle mesh so that no triangles intersects in their interior. * + * Note that this function is only provided as a shortcut for calling `autorefine_triangle_soup()` + * with a mesh. For any advance usage the aforementioned function should be called directly. + * * @tparam TriangleMesh a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * @@ -1745,7 +1748,7 @@ autorefine( TriangleMesh& tm, autorefine_triangle_soup(soup_points, soup_triangles); - clear(tm); + clear(tm); //TODO: keep properties repair_polygon_soup(soup_points, soup_triangles); duplicate_non_manifold_edges_in_polygon_soup(soup_points, soup_triangles); From d1779ca36d18ecc1be5d1fb50e9f66a66d47ea61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 21 Jul 2023 17:03:34 +0200 Subject: [PATCH 0513/1398] doc concurrency_tag --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 6bbb5571e7a1..0fb843c31c00 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1148,6 +1148,11 @@ void generate_subtriangles(std::size_t ti, * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin +* \cgalParamNBegin{concurrency_tag} +* \cgalParamDescription{a tag indicating if the task should be done using one or several threads.} +* \cgalParamType{Either `CGAL::Sequential_tag`, or `CGAL::Parallel_tag`, or `CGAL::Parallel_if_available_tag`} +* \cgalParamDefault{`CGAL::Sequential_tag`} +* \cgalParamNEnd * \cgalParamNBegin{point_map} * \cgalParamDescription{a property map associating points to the elements of the range `soup_points`} * \cgalParamType{a model of `ReadWritePropertyMap` whose value type is a point type} @@ -1712,6 +1717,11 @@ void autorefine_triangle_soup(PointRange& soup_points, * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin + * \cgalParamNBegin{concurrency_tag} + * \cgalParamDescription{a tag indicating if the task should be done using one or several threads.} + * \cgalParamType{Either `CGAL::Sequential_tag`, or `CGAL::Parallel_tag`, or `CGAL::Parallel_if_available_tag`} + * \cgalParamDefault{`CGAL::Sequential_tag`} + * \cgalParamNEnd * \cgalParamNBegin{geom_traits} * \cgalParamDescription{an instance of a geometric traits class} * \cgalParamType{a class model of `PMPSelfIntersectionTraits`} @@ -1746,7 +1756,7 @@ autorefine( TriangleMesh& tm, polygon_mesh_to_polygon_soup(tm, soup_points, soup_triangles, np); - autorefine_triangle_soup(soup_points, soup_triangles); + autorefine_triangle_soup(soup_points, soup_triangles, np); clear(tm); //TODO: keep properties repair_polygon_soup(soup_points, soup_triangles); From 32054661c7242b63592fe32abad3a806b3c690e2 Mon Sep 17 00:00:00 2001 From: albert-github Date: Fri, 21 Jul 2023 19:21:09 +0200 Subject: [PATCH 0514/1398] issue #7395 Improvement of layout of model relations Replacing the `cgalModelsBare` construct with a `begin` / `end` construct so no less understandable constructs with `\,` and `\n` are necessary. --- .../AABB_halfedge_graph_segment_primitive.h | 6 +++-- AABB_tree/include/CGAL/AABB_primitive.h | 6 +++-- BGL/doc/BGL/CGAL/boost/graph/properties.h | 10 +++++++++ .../doc/resources/1.8.13/BaseDoxyfile.in | 5 +++-- .../doc/resources/1.9.6/BaseDoxyfile.in | 5 +++-- .../doc/HalfedgeDS/CGAL/HalfedgeDS_default.h | 2 ++ .../doc/HalfedgeDS/CGAL/HalfedgeDS_list.h | 2 ++ .../doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h | 2 ++ .../Kernel_23/CGAL/Projection_traits_xy_3.h | 19 +++++++++++----- .../doc/Number_types/CGAL/Sqrt_extension.h | 18 ++++++++------- Polynomial/doc/Polynomial/CGAL/Polynomial.h | 22 ++++++++++--------- .../Triangulation_face_base_with_info_2.h | 6 +++-- .../Triangulation_vertex_base_with_info_2.h | 8 ++++--- 13 files changed, 74 insertions(+), 37 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index e7010f4ce530..135682273199 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -41,8 +41,10 @@ namespace CGAL { * of `VertexPointPMap` (using the `Kernel_traits` mechanism). * The segment type of the primitive (`Datum`) is `CGAL::Kernel_traits< boost::property_traits< VertexPointPMap >::%value_type >::%Kernel::Segment_3`. * - * \cgalModelsBare{`AABBPrimitive` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`, - * `AABBPrimitiveWithSharedData` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`} + * \cgalModelsBareBegin + * \cgalModelsBare{`AABBPrimitive` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_false`} + * \cgalModelsBare{`AABBPrimitiveWithSharedData` if `OneHalfedgeGraphPerTree` is `CGAL::Tag_true`} + * \cgalModelsBareEnd * * \tparam HalfedgeGraph is a model of the halfedge graph concept. * as key type and a \cgal Kernel `Point_3` as value type. diff --git a/AABB_tree/include/CGAL/AABB_primitive.h b/AABB_tree/include/CGAL/AABB_primitive.h index b31cf5a74de0..4c58b83f4dba 100644 --- a/AABB_tree/include/CGAL/AABB_primitive.h +++ b/AABB_tree/include/CGAL/AABB_primitive.h @@ -53,8 +53,10 @@ struct AABB_primitive_base * The two property maps which are template parameters of the class enable to get the datum and the reference point of * the primitive from the identifier. The last template parameter controls whether the primitive class holds a copy of the datum. * - * \cgalModelsBare{`AABBPrimitive` if `ExternalPropertyMaps` is `CGAL::Tag_false`, - * `AABBPrimitiveWithSharedData` if `ExternalPropertyMaps` is `CGAL::Tag_true`} + * \cgalModelsBareBegin + * \cgalModelsBare{`AABBPrimitive` if `ExternalPropertyMaps` is `CGAL::Tag_false`} + * \cgalModelsBare{`AABBPrimitiveWithSharedData` if `ExternalPropertyMaps` is `CGAL::Tag_true`} + * \cgalModelsBareEnd * * \tparam ObjectPropertyMap is a model of `ReadablePropertyMap` with `Id` as * `key_type`. It must be a model of `CopyConstructible`, `DefaultConstructible`, and `CopyAssignable`. diff --git a/BGL/doc/BGL/CGAL/boost/graph/properties.h b/BGL/doc/BGL/CGAL/boost/graph/properties.h index 57b9f10c1cbe..b8b2ab38e21c 100644 --- a/BGL/doc/BGL/CGAL/boost/graph/properties.h +++ b/BGL/doc/BGL/CGAL/boost/graph/properties.h @@ -6,31 +6,41 @@ namespace CGAL { /// The constant `vertex_index` is a property tag which identifies the index property of a vertex of a \bgl /// Graph. +/// \cgalModelsBareBegin /// \cgalModelsBare{PropertyTag} +/// \cgalModelsBareEnd enum vertex_index_t { vertex_index }; /// The constant `halfedge_index` is a property tag which identifies the index property of a halfedge of a `HalfedgeGraph`. /// /// This is a property tag introduced by \cgal. +/// \cgalModelsBareBegin /// \cgalModelsBare{PropertyTag} +/// \cgalModelsBareEnd enum halfedge_index_t { halfedge_index }; /// The constant `edge_index` is a property tag which identifies the index property of an edge of a \bgl /// Graph. +/// \cgalModelsBareBegin /// \cgalModelsBare{PropertyTag} +/// \cgalModelsBareEnd enum edge_index_t { edge_index }; /// The constant `face_index` is a property tag which identifies the index property of a face of a `FaceGraph`. /// /// This is a property tag introduced by \cgal. +/// \cgalModelsBareBegin /// \cgalModelsBare{PropertyTag} +/// \cgalModelsBareEnd enum face_index_t { face_index }; /// The constant `vertex_point` is a property tag which refers to the geometric embedding property of /// a vertex of a `HalfedgeGraph`. /// /// This is a property tag introduced by \cgal. +/// \cgalModelsBareBegin /// \cgalModelsBare{PropertyTag} +/// \cgalModelsBareEnd enum vertex_point_t { vertex_point }; /// @} diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index deddf49dfa24..59b274cc823d 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -142,8 +142,9 @@ ALIASES = "cgal=%CGAL" \ "cgalModels{4}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    " \ "cgalModels{5}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ "cgalModels{6}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    @c \6
    " \ - "cgalModelsBare{1}=
    @cgalModelsHeader
    \1
    " \ - "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ + "cgalModelsBareBegin=
    @cgalModelsHeader
    " \ + "cgalModelsBareEnd=
    " \ + "cgalModelsBare{1}=
    \1
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModelsHeader=Has models" \ "cgalHasModelsBegin=
    @cgalHasModelsHeader
    " \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index b75f7ef3d328..15a620ba6736 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -151,8 +151,9 @@ ALIASES = "cgal=%CGAL" \ "cgalModels{4}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    " \ "cgalModels{5}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ "cgalModels{6}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    @c \6
    " \ - "cgalModelsBare{1}=
    @cgalModelsHeader
    \1
    " \ - "cgalModelsBare{2}=
    @cgalModelsHeader
    \1
    \2
    " \ + "cgalModelsBareBegin=
    @cgalModelsHeader
    " \ + "cgalModelsBareEnd=
    " \ + "cgalModelsBare{1}=
    \1
    " \ "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ "cgalHasModelsHeader=Has models" \ "cgalHasModelsBegin=
    @cgalHasModelsHeader
    " \ diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h index ca8f1e6eee66..154d01373aa7 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_default.h @@ -10,7 +10,9 @@ uses the \cgal default allocator as default setting. `HalfedgeDS_default` is a list-based representation with bidirectional iterators that supports removal. +\cgalModelsBareBegin \cgalModelsBare{`HalfedgeDS`} +\cgalModelsBareEnd \sa `CGAL::HalfedgeDS_list` \sa `CGAL::HalfedgeDS_vector` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h index 0df742df464f..e30952e1e1b4 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_list.h @@ -7,7 +7,9 @@ The class `HalfedgeDS_list` is a model for the `HalfedgeDS` concept. `HalfedgeDS_list` is a list-based representation with bidirectional iterators that supports removal. +\cgalModelsBareBegin \cgalModelsBare{`HalfedgeDS`} +\cgalModelsBareEnd \sa `CGAL::HalfedgeDS_default` \sa `CGAL::HalfedgeDS_vector` diff --git a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h index d2f29447128f..33fa7dc5237b 100644 --- a/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h +++ b/HalfedgeDS/doc/HalfedgeDS/CGAL/HalfedgeDS_vector.h @@ -7,7 +7,9 @@ The class `HalfedgeDS_vector` is a model for the `HalfedgeDS` concept. `HalfedgeDS_vector` is a vector-based representation with random access iterators that does not support removal. +\cgalModelsBareBegin \cgalModelsBare{`HalfedgeDS`} +\cgalModelsBareEnd \sa `CGAL::HalfedgeDS_default` \sa `CGAL::HalfedgeDS_list` diff --git a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h index d9911834c80c..f5fc8910f1e0 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Projection_traits_xy_3.h @@ -21,12 +21,19 @@ constructions or if `K` is a `CGAL::Filtered_kernel` (such as for `CGAL::Exact_predicates_inexact_constructions_kernel`), this class automatically provides exact predicates. -\cgalModelsBare{The class is a model of several 2D triangulation traits class concepts\, - except that it does not provide the type and constructors - required to build the dual Voronoi diagram.\n - `PolygonTraits_2`\n`ConvexHullTraits_2`\n`TriangulationTraits_2`\n`DelaunayTriangulationTraits_2`\n - `ConstrainedTriangulationTraits_2`\n`ConvexHullTraits_2`\n`DelaunayMeshTraits_2`\n`AnalyticWeightTraits_2`\n - `Barycentric_coordinates::BarycentricTraits_2`} +\cgalModelsBareBegin +\cgalModelsBare{The class is a model of several 2D triangulation traits class concepts, + except that it does not provide the type and constructors required to build the dual Voronoi diagram.} +\cgalModelsBare{`PolygonTraits_2`} +\cgalModelsBare{`ConvexHullTraits_2`} +\cgalModelsBare{`TriangulationTraits_2`} +\cgalModelsBare{`DelaunayTriangulationTraits_2`} +\cgalModelsBare{`ConstrainedTriangulationTraits_2`} +\cgalModelsBare{`ConvexHullTraits_2`} +\cgalModelsBare{`DelaunayMeshTraits_2`} +\cgalModelsBare{`AnalyticWeightTraits_2`} +\cgalModelsBare{`Barycentric_coordinates::BarycentricTraits_2`} +\cgalModelsBareEnd \sa `CGAL::Projection_traits_3` */ diff --git a/Number_types/doc/Number_types/CGAL/Sqrt_extension.h b/Number_types/doc/Number_types/CGAL/Sqrt_extension.h index 494da54aa4b9..8281df433394 100644 --- a/Number_types/doc/Number_types/CGAL/Sqrt_extension.h +++ b/Number_types/doc/Number_types/CGAL/Sqrt_extension.h @@ -87,14 +87,16 @@ The fourth template argument, `FilterPredicates`, triggers an internal filter th In case `NT` is not `RealEmbeddable`, `DifferentExtensionComparable` as well as `FilterPredicates` have no effect. -\cgalModelsBare{`Assignable`\n - `CopyConstructible`\n - `DefaultConstructible`\n - `EqualityComparable`\n - `ImplicitInteroperable` with `int`\n - `ImplicitInteroperable` with `NT`\n - `Fraction` if NT is a `Fraction`\n - `RootOf_2`} +\cgalModelsBareBegin +\cgalModelsBare{`Assignable`} +\cgalModelsBare{`CopyConstructible`} +\cgalModelsBare{`DefaultConstructible`} +\cgalModelsBare{`EqualityComparable`} +\cgalModelsBare{`ImplicitInteroperable` with `int`} +\cgalModelsBare{`ImplicitInteroperable` with `NT`} +\cgalModelsBare{`Fraction` if NT is a `Fraction`} +\cgalModelsBare{`RootOf_2`} +\cgalModelsBareEnd \sa `IntegralDomainWithoutDivision` \sa `IntegralDomain` diff --git a/Polynomial/doc/Polynomial/CGAL/Polynomial.h b/Polynomial/doc/Polynomial/CGAL/Polynomial.h index 77d9235aa0e1..6e8be4268621 100644 --- a/Polynomial/doc/Polynomial/CGAL/Polynomial.h +++ b/Polynomial/doc/Polynomial/CGAL/Polynomial.h @@ -53,16 +53,18 @@ the coefficient sequence does not contain leading zero coefficients (where leading means at the high-degree end), with the exception that the zero polynomial is represented by a single zero coefficient. -\cgalModelsBare{`Polynomial_d`\n - `Assignable`\n - `CopyConstructible`\n - `DefaultConstructible`\n - `EqualityComparable`\n - `ImplicitInteroperable` with int\n - `ImplicitInteroperable` with Coeff\n - `Fraction` if Coeff is model of `Fraction`\n - `LessThanComparable` if Coeff is model of `LessThanComparable`\n - `Modularizable` if `Coeff` is model of `Modularizable`} +\cgalModelsBareBegin +\cgalModelsBare{`Polynomial_d`} +\cgalModelsBare{`Assignable`} +\cgalModelsBare{`CopyConstructible`} +\cgalModelsBare{`DefaultConstructible`} +\cgalModelsBare{`EqualityComparable`} +\cgalModelsBare{`ImplicitInteroperable` with `int`} +\cgalModelsBare{`ImplicitInteroperable` with `Coeff`} +\cgalModelsBare{`Fraction` if `Coeff` is model of `Fraction`} +\cgalModelsBare{`LessThanComparable` if `Coeff` is model of `LessThanComparable`} +\cgalModelsBare{`Modularizable` if `Coeff` is model of `Modularizable`} +\cgalModelsBareEnd */ template< typename Coeff > class Polynomial { diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h index bd0990942287..225ac8f3abfe 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_face_base_with_info_2.h @@ -19,9 +19,11 @@ and is actually not used in `Triangulation_face_base_with_info_2` . \tparam Fb is a face base class from which `Triangulation_face_base_with_info_2` derives. +\cgalModelsBareBegin \cgalModelsBare{Because `Triangulation_face_base_with_info_2` derives from the class instantiating its third -parameter\, it will be a model of the same face base concept as its parameter: -`TriangulationFaceBase_2`\, `ConstrainedTriangulationFaceBase_2`\, or `RegularTriangulationFaceBase_2`} +parameter, it will be a model of the same face base concept as its parameter: +`TriangulationFaceBase_2`, `ConstrainedTriangulationFaceBase_2`, or `RegularTriangulationFaceBase_2`} +\cgalModelsBareEnd \sa `CGAL::Triangulation_face_base_2` \sa `CGAL::Constrained_triangulation_face_base_2` diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h index 6be4bf7ee8e9..ad6b6ea3a815 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/Triangulation_vertex_base_with_info_2.h @@ -22,10 +22,12 @@ the triangulation. this parameter is instantiated by `Triangulation_vertex_base_2`. -\cgalModelsBare{`TriangulationVertexBaseWithInfo_2`, - The parameter `Vb` is a model of some vertex base concept. +\cgalModelsBareBegin +\cgalModelsBare{`TriangulationVertexBaseWithInfo_2`} +\cgalModelsBare{The parameter `Vb` is a model of some vertex base concept. `Triangulation_vertex_base_with_info_2` derives from `Vb` and will be a model of the -same vertex base concept: `TriangulationVertexBase_2`\, or `RegularTriangulationVertexBase_2`.} +same vertex base concept: `TriangulationVertexBase_2`, or `RegularTriangulationVertexBase_2`.} +\cgalModelsBareEnd \sa `CGAL::Triangulation_face_base_with_info_2` \sa `CGAL::Triangulation_vertex_base_2` From a89b115b31d9ddb66d14df8e9bdde03d5854188a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 05:57:03 +0000 Subject: [PATCH 0515/1398] Bump fsfe/reuse-action from 1 to 2 Bumps [fsfe/reuse-action](https://github.com/fsfe/reuse-action) from 1 to 2. - [Release notes](https://github.com/fsfe/reuse-action/releases) - [Commits](https://github.com/fsfe/reuse-action/compare/v1...v2) --- updated-dependencies: - dependency-name: fsfe/reuse-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/reuse.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 2113372a8772..8b0bba4260ee 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -12,15 +12,15 @@ jobs: steps: - uses: actions/checkout@v3 - name: REUSE version - uses: fsfe/reuse-action@v1 + uses: fsfe/reuse-action@v2 with: args: --version - name: REUSE lint - uses: fsfe/reuse-action@v1 + uses: fsfe/reuse-action@v2 with: args: --include-submodules lint - name: REUSE SPDX SBOM - uses: fsfe/reuse-action@v1 + uses: fsfe/reuse-action@v2 with: args: spdx - name: install dependencies @@ -30,6 +30,6 @@ jobs: mkdir -p ./release cmake -DDESTINATION=./release -DCGAL_VERSION=9.9 -P ./Scripts/developer_scripts/cgal_create_release_with_cmake.cmake - name: REUSE lint release tarball - uses: fsfe/reuse-action@v1 + uses: fsfe/reuse-action@v2 with: args: --root ./release/CGAL-9.9 --include-submodules lint From a935682a8219925122e4ca3a32be7704ea40dcc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 24 Jul 2023 10:53:27 +0200 Subject: [PATCH 0516/1398] (Re-)introduce Compact_simplicial_mesh_cell_base_3 Formerly known as Simplicial_mesh_cell_base_3, this cell base is more efficient in memory, but cannot inherit a base. --- .../Compact_simplicial_mesh_cell_base_3.h | 391 ++++++++++++++++++ .../Remeshing_cell_base_3.h | 4 +- 2 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 SMDS_3/include/CGAL/Compact_simplicial_mesh_cell_base_3.h diff --git a/SMDS_3/include/CGAL/Compact_simplicial_mesh_cell_base_3.h b/SMDS_3/include/CGAL/Compact_simplicial_mesh_cell_base_3.h new file mode 100644 index 000000000000..d9c31c72597e --- /dev/null +++ b/SMDS_3/include/CGAL/Compact_simplicial_mesh_cell_base_3.h @@ -0,0 +1,391 @@ +// Copyright (c) 2006-2007 INRIA Sophia-Antipolis (France). +// Copyright (c) 2008,2011 GeometryFactory Sarl (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, Stephane Tayeb, Andreas Fabri, Jane Tournois + +#ifndef CGAL_COMPACT_SIMPLICIAL_MESH_CELL_BASE_3_H +#define CGAL_COMPACT_SIMPLICIAL_MESH_CELL_BASE_3_H + +#include + +#include +#include +#include +#include +#include +#include + +#include + +namespace CGAL { + +// Adds information to Cb about the cell of the input complex containing it +template +class Compact_simplicial_mesh_cell_3 +{ +public: + using Triangulation_data_structure = TDS; + + using Vertex_handle = typename TDS::Vertex_handle; + using Cell_handle = typename TDS::Cell_handle; + using Vertex = typename TDS::Vertex; + using Cell = typename TDS::Cell; + using TDS_data = typename TDS::Cell_data; + + // Index Type + using Subdomain_index = Subdomain_index_; + using Surface_patch_index = Surface_patch_index_; + +public: + // Constructors + Compact_simplicial_mesh_cell_3() + : time_stamp_(std::size_t(-1)) + {} + + Compact_simplicial_mesh_cell_3(const Compact_simplicial_mesh_cell_3& rhs) + : N(rhs.N) + , V(rhs.V) + , time_stamp_(rhs.time_stamp_) + , subdomain_index_(rhs.subdomain_index_) + { + for(int i=0; i <4; i++){ + surface_index_table_[i] = rhs.surface_index_table_[i]; + } + } + + Compact_simplicial_mesh_cell_3(Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Vertex_handle v3) + : V(CGAL::make_array(v0, v1, v2, v3)) + { + } + + Compact_simplicial_mesh_cell_3(Vertex_handle v0, + Vertex_handle v1, + Vertex_handle v2, + Vertex_handle v3, + Cell_handle n0, + Cell_handle n1, + Cell_handle n2, + Cell_handle n3) + : N(CGAL::make_array(n0, n1, n2, n3)) + , V(CGAL::make_array(v0, v1, v2, v3)) + { + } + + // ACCESS FUNCTIONS + Vertex_handle vertex(int i) const + { + CGAL_precondition( i >= 0 && i <= 3 ); + return V[i]; + } + + bool has_vertex(Vertex_handle v) const + { + return (V[0] == v) || (V[1] == v) || (V[2]== v) || (V[3]== v); + } + + bool has_vertex(Vertex_handle v, int & i) const + { + if (v == V[0]) { i = 0; return true; } + if (v == V[1]) { i = 1; return true; } + if (v == V[2]) { i = 2; return true; } + if (v == V[3]) { i = 3; return true; } + return false; + } + + int index(Vertex_handle v) const + { + if (v == V[0]) { return 0; } + if (v == V[1]) { return 1; } + if (v == V[2]) { return 2; } + CGAL_assertion( v == V[3] ); + return 3; + } + + Cell_handle neighbor(int i) const + { + CGAL_precondition( i >= 0 && i <= 3); + return N[i]; + } + + bool has_neighbor(Cell_handle n) const + { + return (N[0] == n) || (N[1] == n) || (N[2] == n) || (N[3] == n); + } + + bool has_neighbor(Cell_handle n, int & i) const + { + if(n == N[0]){ i = 0; return true; } + if(n == N[1]){ i = 1; return true; } + if(n == N[2]){ i = 2; return true; } + if(n == N[3]){ i = 3; return true; } + return false; + } + + int index(Cell_handle n) const + { + if (n == N[0]) return 0; + if (n == N[1]) return 1; + if (n == N[2]) return 2; + CGAL_assertion( n == N[3] ); + return 3; + } + + // SETTING + void set_neighbor(int i, Cell_handle n) + { + CGAL_precondition( i >= 0 && i <= 3); + CGAL_precondition( this != n.operator->() ); + N[i] = n; + } + + void set_neighbors() + { + N[0] = N[1] = N[2] = N[3] = Cell_handle(); + } + + void set_neighbors(Cell_handle n0, Cell_handle n1, + Cell_handle n2, Cell_handle n3) + { + CGAL_precondition( this != n0.operator->() ); + CGAL_precondition( this != n1.operator->() ); + CGAL_precondition( this != n2.operator->() ); + CGAL_precondition( this != n3.operator->() ); + N[0] = n0; + N[1] = n1; + N[2] = n2; + N[3] = n3; + } + + // CHECKING + + // the following trivial is_valid allows + // the user of derived cell base classes + // to add their own purpose checking + bool is_valid(bool = false, int = 0) const + { return true; } + + // For use by Compact_container. + void * for_compact_container() const { return N[0].for_compact_container(); } + void for_compact_container(void *p) { N[0].for_compact_container(p); } + + // TDS internal data access functions. + TDS_data& tds_data() { return _tds_data; } + const TDS_data& tds_data() const { return _tds_data; } + + // We must override the functions that modify the vertices. + // And if the point inside a vertex is modified, we fail, + // but there's not much we can do for this now. + void set_vertex(int i, Vertex_handle v) + { + CGAL_precondition( i >= 0 && i <= 3); + V[i] = v; + } + + void set_vertices() + { + V[0] = V[1] = V[2] = V[3] = Vertex_handle(); + } + + void set_vertices(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3) + { + V[0] = v0; + V[1] = v1; + V[2] = v2; + V[3] = v3; + } + + // Returns the index of the cell of the input complex that contains the cell + Subdomain_index subdomain_index() const { return subdomain_index_; } + + // Sets the index of the cell of the input complex that contains the cell + void set_subdomain_index(const Subdomain_index& index) + { subdomain_index_ = index; } + + /// Set surface index of \c facet to \c index + void set_surface_patch_index(const int facet, const Surface_patch_index& index) + { + CGAL_precondition(facet>=0 && facet<4); + surface_index_table_[facet] = index; + } + + /// Returns surface index of facet \c facet + Surface_patch_index surface_patch_index(const int facet) const + { + CGAL_precondition(facet>=0 && facet<4); + return surface_index_table_[facet]; + } + + /// Returns true if facet lies on a surface patch + bool is_facet_on_surface(const int facet) const + { + CGAL_precondition(facet>=0 && facet<4); + return ( !( Surface_patch_index() == surface_index_table_[facet] )); + } + + // ----------------------------------- + // Backward Compatibility + // ----------------------------------- +#ifndef CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX + typedef Surface_patch_index Surface_index; + + void set_surface_index(const int facet, const Surface_index& index) + { set_surface_patch_index(facet,index); } + + /// Returns surface index of facet \c facet + Surface_index surface_index(const int facet) const + { return surface_patch_index(facet); } +#endif // CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX + // ----------------------------------- + // End backward Compatibility + // ----------------------------------- + + static + std::string io_signature() + { + return + Get_io_signature()() + + "+(" + Get_io_signature()() + ")[4]"; + } + + /// For the determinism of Compact_container iterators + ///@{ + typedef Tag_true Has_timestamp; + + std::size_t time_stamp() const { + return time_stamp_; + } + void set_time_stamp(const std::size_t& ts) { + time_stamp_ = ts; + } + ///@} + +private: + /// Stores surface_index for each facet of the cell + std::array surface_index_table_ = {}; + + std::array N; + std::array V; + + std::size_t time_stamp_; + + // The index of the cell of the input complex that contains me + Subdomain_index subdomain_index_ = {}; + + TDS_data _tds_data; + +public: + friend std::istream& operator>>(std::istream &is, Compact_simplicial_mesh_cell_3 &c) + { + Subdomain_index index; + if(IO::is_ascii(is)) + is >> index; + else + read(is, index); + + if(is) + { + c.set_subdomain_index(index); + for(int i = 0; i < 4; ++i) + { + Surface_patch_index i2; + if(IO::is_ascii(is)) + is >> IO::iformat(i2); + else + read(is, i2); + + c.set_surface_patch_index(i, i2); + } + } + + return is; + } + + friend + std::ostream& operator<<(std::ostream &os, const Compact_simplicial_mesh_cell_3&c) + { + if(IO::is_ascii(os)) + os << c.subdomain_index(); + else + write(os, c.subdomain_index()); + + for(int i = 0; i < 4; ++i) + { + if(IO::is_ascii(os)) + os << ' ' << IO::oformat(c.surface_patch_index(i)); + else + write(os, c.surface_patch_index(i)); + } + + return os; + } +}; + +/*! +\ingroup PkgSMDS3Classes + +The class `Compact_simplicial_mesh_cell_base_3` +is a model of the concept `SimplicialMeshCellBase_3`. +It is designed to serve as cell base class for.3D simplicial mesh data structures. +It stores and gives access to data about the complex the cell belongs to, such as the +subdomain it belongs to or surface it takes part to. +It is more compact in memory than `CGAL::Simplicial_mesh_cell_base_3`. + +\tparam SubdomainIndex Type of indices for subdomains of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must match the label +of the exterior of the domain (which contains at least the unbounded component). +It must match `MeshDomain_3::Subdomain_index` when used for mesh generation. + +\tparam SurfacePatchIndex Type of indices for surface patches (boundaries and interfaces) +of the discretized geometric domain. +Must be a model of `CopyConstructible`, `Assignable`, `DefaultConstructible` +and `EqualityComparable`. The default constructed value must be the index value +assigned to a non surface facet. +It must match `MeshDomain_3::Surface_patch_index` when used for mesh generation. + +\cgalModels `SimplicialMeshCellBase_3` + +\sa `CGAL::Mesh_complex_3_in_triangulation_3` +\sa \link Mesh_cell_base_3 `CGAL::Mesh_cell_base_3`\endlink +\sa `MeshDomain_3` +\sa `MeshDomainWithFeatures_3` +*/ +template +class Compact_simplicial_mesh_cell_base_3 +{ +public: +#ifdef DOXYGEN_RUNNING + typedef unspecified_type Triangulation_data_structure; +#else + typedef internal::Dummy_tds_3 Triangulation_data_structure; +#endif + typedef Triangulation_data_structure::Vertex_handle Vertex_handle; + typedef Triangulation_data_structure::Cell_handle Cell_handle; + +public: + template + struct Rebind_TDS + { + typedef Compact_simplicial_mesh_cell_3 Other; + }; +}; + +} // namespace CGAL + +#endif // CGAL_COMPACT_SIMPLICIAL_MESH_CELL_BASE_3_H diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index 162cfa27f211..94bcd7ab5f12 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -15,7 +15,7 @@ #include -#include +#include #include @@ -39,7 +39,7 @@ It must be a model of the `SimplicialMeshCellBase_3` concept. */ template > class Remeshing_cell_base_3 From a76926c8f69c541e65f401d11a72cffaaedd3933 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 24 Jul 2023 16:36:35 +0200 Subject: [PATCH 0517/1398] replace "bad" / "wrong" / "authorized" to "compatible" / "incompatible" version after review --- Installation/include/CGAL/version_checker.h | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Installation/include/CGAL/version_checker.h b/Installation/include/CGAL/version_checker.h index 9061ee89c54d..785f8be17125 100644 --- a/Installation/include/CGAL/version_checker.h +++ b/Installation/include/CGAL/version_checker.h @@ -19,31 +19,31 @@ // you want to use. //// Set the 3 following macros to the version of CGAL you want to use -//#define CGAL_AUTHORIZED_VERSION_MAJOR 6 -//#define CGAL_AUTHORIZED_VERSION_MINOR 0 -//#define CGAL_AUTHORIZED_VERSION_PATCH 0 +//#define CGAL_COMPATIBLE_VERSION_MAJOR 6 +//#define CGAL_COMPATIBLE_VERSION_MINOR 0 +//#define CGAL_COMPATIBLE_VERSION_PATCH 0 // Set the following macros to 1 to get a warning/an error -// when using a bad version of CGAL +// when using a possibly incompatible version of CGAL #define CGAL_VERSION_CHECKER_ERROR 0 #define CGAL_VERSION_CHECKER_WARNING 0 -#define CGAL_AUTHORIZED_VERSION_STR CGAL_STR(CGAL_AUTHORIZED_VERSION_MAJOR) "." \ - CGAL_STR(CGAL_AUTHORIZED_VERSION_MINOR) "." \ - CGAL_STR(CGAL_AUTHORIZED_VERSION_PATCH) +#define CGAL_COMPATIBLE_VERSION_STR CGAL_STR(CGAL_COMPATIBLE_VERSION_MAJOR) "." \ + CGAL_STR(CGAL_COMPATIBLE_VERSION_MINOR) "." \ + CGAL_STR(CGAL_COMPATIBLE_VERSION_PATCH) // Check that the version of CGAL used is the one expected -#if CGAL_AUTHORIZED_VERSION_MAJOR != CGAL_VERSION_MAJOR \ - || CGAL_AUTHORIZED_VERSION_MINOR != CGAL_VERSION_MINOR \ - || CGAL_AUTHORIZED_VERSION_PATCH != CGAL_VERSION_PATCH +#if CGAL_COMPATIBLE_VERSION_MAJOR != CGAL_VERSION_MAJOR \ + || CGAL_COMPATIBLE_VERSION_MINOR != CGAL_VERSION_MINOR \ + || CGAL_COMPATIBLE_VERSION_PATCH != CGAL_VERSION_PATCH #if CGAL_VERSION_CHECKER_WARNING || CGAL_VERSION_CHECKER_ERROR - #pragma message("These headers are meant to be used with CGAL " CGAL_AUTHORIZED_VERSION_STR " only."\ + #pragma message("These headers are meant to be used with CGAL " CGAL_COMPATIBLE_VERSION_STR " only."\ " You are using CGAL version: " CGAL_STR(CGAL_VERSION) ".") #ifdef CGAL_VERSION_CHECKER_ERROR - #error "Wrong version of CGAL" + #error "Incompatible version of CGAL" #endif #endif From 45a72e8dd22b1971b12d41e178bcff062dca679b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 26 Jul 2023 16:42:07 +0200 Subject: [PATCH 0518/1398] Use FT weights from the start --- .../Straight_skeleton_2/include/CGAL/input_helpers.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h index 35077e38c2e3..ad41ff7a91f7 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/include/CGAL/input_helpers.h @@ -204,7 +204,7 @@ void generate_random_weights(const PolygonWithHoles& p, using Container = typename std::remove_reference::type; using Iterator = typename Container::const_iterator; - std::map weight; + std::map weight; // start somewhere not collinear Iterator start_it; @@ -238,7 +238,7 @@ void generate_random_weights(const PolygonWithHoles& p, else { CGAL_assertion(weight.count(it) == 0); - weight[it] = rnd.get_double(min_weight, max_weight); + weight[it] = FT(rnd.get_double(min_weight, max_weight)); } it = next(it, c); @@ -247,7 +247,7 @@ void generate_random_weights(const PolygonWithHoles& p, std::vector weights; for(auto it=c.begin(); it Date: Wed, 26 Jul 2023 15:44:33 +0100 Subject: [PATCH 0519/1398] Fix the fix. The floats were already in the range [0,256] --- .../examples/Arrangement_on_surface_2/draw_arr.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp index b62ba6aadc17..8c3c9b4daf85 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp @@ -18,7 +18,7 @@ using Arrangement_2 = CGAL::Arrangement_2; * \param value Value component range: [0, 1] * \return tuple, where each component is in the range [0, 255] */ -std::tuple +std::tuple hsv_to_rgb(float hue, float sat, float value) { float red, green, blue; float fc = value * sat; // Chroma @@ -69,7 +69,10 @@ hsv_to_rgb(float hue, float sat, float value) { red *= 255; green *= 255; blue *= 255; - return std::make_tuple(red, green, blue); + unsigned char redc = (unsigned char)red; + unsigned char greenc = (unsigned char)green; + unsigned char bluec = (unsigned char)blue; + return std::make_tuple(redc, greenc, bluec); } int main() { @@ -104,7 +107,7 @@ int main() { float r, g, b; typedef unsigned char uchar; std::tie(r, g, b) = hsv_to_rgb(h, s, v); - return CGAL::IO::Color(uchar(r*255), uchar(g*255), uchar(b*255)); + return CGAL::IO::Color(r,g,b); }, "hsv colors", true); return EXIT_SUCCESS; From 08e3a4f8d268bba8db8ef6cc110659a77bbf2337 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 26 Jul 2023 17:49:43 +0200 Subject: [PATCH 0520/1398] improve the testsuites comparison page - now the URL can carry parameters (base/new releases to compare) - the testsuite results have a link to the comparison page --- .../test_handling/create_testresult_page | 3 +- Maintenance/test_handling/testresult.css | 6 +- .../testsuite_comparison/diff_testsuites.html | 86 ++++++++++++++----- .../testsuite_comparison/diff_testsuites.js | 2 +- .../testsuite_comparison/print_diff.js | 5 ++ .../testsuite_comparison/testresult.css | 67 +++++++++++++++ .../testsuite_comparison/worker.js | 5 +- 7 files changed, 145 insertions(+), 29 deletions(-) create mode 100644 Maintenance/test_handling/testsuite_comparison/testresult.css diff --git a/Maintenance/test_handling/create_testresult_page b/Maintenance/test_handling/create_testresult_page index 1744b4e575d5..3747a4a83133 100755 --- a/Maintenance/test_handling/create_testresult_page +++ b/Maintenance/test_handling/create_testresult_page @@ -617,7 +617,8 @@ sub print_little_header(){

    Test Results of ${release_name} -jump to results

    +jump to results +compare results...

    The results of the tests are presented in a table ('y' = success, 'w' = warning, 't' = third party warning, 'o' = timeout, 'n' = failure, 'r' = a requirement is not found), diff --git a/Maintenance/test_handling/testresult.css b/Maintenance/test_handling/testresult.css index b48d35ee1710..02e8ad65d0fb 100644 --- a/Maintenance/test_handling/testresult.css +++ b/Maintenance/test_handling/testresult.css @@ -66,14 +66,14 @@ TD.requirements A:visited {color: rgb(100%,100%,65%)} SELECT { font-family: monospace; } -#permalink,#jump_to_results { +#permalink,#jump_to_results,#compare { font-size: 0.5em; font-weight: normal; } -#permalink::before,#jump_to_results::before{ +#permalink::before,#jump_to_results::before,#compare::before{ content: "(" } -#permalink::after,#jump_to_results::after{ +#permalink::after,#jump_to_results::after,#compare::after{ content: ")" } diff --git a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html index 4ec2720540f1..ab4842098e03 100644 --- a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html +++ b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.html @@ -1,6 +1,9 @@ + + + Diff of Testsuites @@ -11,30 +14,30 @@ -

    +

    -
    +

    Note that the diff should be done from left to right, as red or yellow squares in the left testsuite that become green in the right testsuite will be ignored.

    I = Master
    Ic = integration

    -

    -
    -
    -
    +

    +
    +
    +
    -

    +
    diff --git a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js index 567dad053515..07427241f39c 100644 --- a/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js +++ b/Maintenance/test_handling/testsuite_comparison/diff_testsuites.js @@ -11,7 +11,7 @@ //v1.7 function diff_testsuites(baseTest, newTest){ - var URL_suff='https://cgal.geometryfactory.com/~mgimeno/testsuite_comparison/list_of_suffixes.txt'; + var URL_suff='https://cgal.geometryfactory.com/~cgaltest/testsuite_comparison/list_of_suffixes.txt'; var URL_testsuite='https://cgal.geometryfactory.com/CGAL/Members/testsuite/'; //get the list of suffixes var xhr = new XMLHttpRequest(); diff --git a/Maintenance/test_handling/testsuite_comparison/print_diff.js b/Maintenance/test_handling/testsuite_comparison/print_diff.js index 9340d2c10139..d7da1086b8f7 100644 --- a/Maintenance/test_handling/testsuite_comparison/print_diff.js +++ b/Maintenance/test_handling/testsuite_comparison/print_diff.js @@ -31,6 +31,11 @@ function print_diff(base, newtext){ && change != "equal"){ res[0]=base.charAt(base.length-1); res[1]=newtext.charAt(newtext.length-1); + if (res[0]=="w" && res[1]=="t") + { + res[0]=""; + res[1]=""; + } } //else if(change == "insert") { // res=newtext.charAt(newtext.length-1); diff --git a/Maintenance/test_handling/testsuite_comparison/testresult.css b/Maintenance/test_handling/testsuite_comparison/testresult.css new file mode 100644 index 000000000000..b7800bf1d59e --- /dev/null +++ b/Maintenance/test_handling/testsuite_comparison/testresult.css @@ -0,0 +1,67 @@ +body {color: black; background-color: #C0C0D0; font-family: sans-serif;} + +P { +width: 80ex +} + +A { + text-decoration: none; +} + +TABLE.result { font-weight: bold; background-color: white; padding: 1em; table-layout: fixed;} + +TABLE.summary TD { white-space: nowrap } +TABLE.result,TABLE.summary { border-collapse: collapse; } +TABLE.result TD,TABLE.summary TD { border-width: 1px; border-style: solid; } +TABLE.result TD { padding: 0;} +TABLE.result TD > a { font-weight: normal; font-family: monospace; display: block; padding: 0.2ex 0.5ex 0.2ex 0.5ex;} + +TD.highlight {background-color: rgb(80%,80%,80%)} +TD.os64bits {font-style:italic} +.cmaketag {font-weight: bold; color: rgb(100%,20%,20%);} + + +TD.ok {background-color: rgb(50%,100%,50%)} +TD.warning {background-color: rgb(100%,100%,50%)} +TD.error {background-color: rgb(100%,50%,50%)} +TD.na {background-color: white;} +TD.requirements { background-color: rgb(65%,65%,100%) } + +TH.ok {background-color: rgb(50%,100%,50%)} +TH.warning {background-color: rgb(100%,100%,50%)} +TH.error {background-color: rgb(100%,50%,50%)} +TH.requirements { background-color: rgb(65%,65%,100%) } + +TD.ok A {font-size:large; text-decoration: none} +TD.ok A:link {color: rgb(0%,0%,100%)} +TD.ok A:visited {color: rgb(0%,80%,100%)} + +TD.warning A {font-size:large; text-decoration: none} +TD.warning A:link {color: rgb(0%,0%,100%)} +TD.warning A:visited {color: rgb(80%,80%,100%)} + +TD.error A {font-size: large; text-decoration: none} +TD.error A:link {color: rgb(0%,0%,100%)} +TD.error A:visited {color: rgb(80%,0%,100%)} + +TD.requirements A {font-size: large; text-decoration: none} +TD.requirements A:link {color: rgb(0%,0%,100%)} +TD.requirements A:visited {color: rgb(100%,100%,65%)} + +SELECT { font-family: monospace; } + +#permalink,#jump_to_results { + font-size: 0.5em; + font-weight: normal; +} +#permalink::before,#jump_to_results::before{ + content: "(" +} +#permalink::after,#jump_to_results::after{ + content: ")" +} + +TABLE.result TD > a.package_name { + color: black; + font-weight: bold; +} diff --git a/Maintenance/test_handling/testsuite_comparison/worker.js b/Maintenance/test_handling/testsuite_comparison/worker.js index 8938ea93c382..28930fb20f08 100644 --- a/Maintenance/test_handling/testsuite_comparison/worker.js +++ b/Maintenance/test_handling/testsuite_comparison/worker.js @@ -34,7 +34,7 @@ onmessage=function(e){ } for(i=1; i"+i+": "+ myArray[i][0]+""]); + postMessage(["namesTable",""+i+""+ myArray[i][0]+""]); } postMessage(["namesTable", ""]); @@ -45,7 +45,8 @@ onmessage=function(e){ } postMessage(["testTable", ""]); for (var j=2; j"+ myArray[0][j]+": "]); + var p = myArray[0][j]; + postMessage(["testTable", "" + p + ""]); for(i=1; i Date: Thu, 27 Jul 2023 09:38:24 +0200 Subject: [PATCH 0521/1398] back to normal tests schedule --- .../bin/create_internal_release_of_the_day.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py index cd976dd2d01e..282ae35aaa0d 100644 --- a/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py +++ b/Maintenance/infrastructure/cgal.geometryfactory.com/bin/create_internal_release_of_the_day.py @@ -16,8 +16,8 @@ "Tuesday": integration, "Wednesday": integration, "Thursday": integration, - "Friday": beta_release("5.6", 2), - "Saturday": release("5.5"), + "Friday": release("5.5"), + "Saturday": release("5.6"), "Sunday": master, } From fb3680f8f5ad6542c102525b8318a73f6b815e26 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:48:55 +0200 Subject: [PATCH 0522/1398] Update Mesh_3/doc/Mesh_3/Mesh_3.txt Co-authored-by: Jane Tournois --- Mesh_3/doc/Mesh_3/Mesh_3.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index 43660034018c..fd1fe191063b 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -296,7 +296,7 @@ also inserts a small set of auxiliary vertices that belong to the triangulation but are isolated from the complex at the end of the meshing process. These so-called \em isolated vertices belong to the triangulation but not to any cell -of the `C3T3`. They can be removed using the function `CGAL::Polygon_mesh_processing::remove_isolated_vertices()`. +of the `C3T3`. They can be removed using the function `remove_isolated_vertices()` of `CGAL::Mesh_complex_3_in_triangulation_3`. \section Mesh_3_section_interface Interface From 81bbc3e0db20285013ce5ed7b28c76e48c653f4f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:50:23 +0200 Subject: [PATCH 0523/1398] Update Mesh_3/doc/Mesh_3/Mesh_3.txt Co-authored-by: Jane Tournois --- Mesh_3/doc/Mesh_3/Mesh_3.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index fd1fe191063b..abe639826562 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -494,7 +494,7 @@ protecting ball centers that are consecutive on a 1-feature. This parameter has The four additional parameters are optimization parameters. They control which optimization processes are performed -and enables the user to tune the parameters of the activated optimization processes. +and enable the user to tune the parameters of the activated optimization processes. These parameters have internal types which are not described but the library provides global functions to generate appropriate values of these types: From 7f20c6b773cd6dff5d660dfdacf6082937f4dd74 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:51:13 +0200 Subject: [PATCH 0524/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 38c2b9570f19..a1a757ee5606 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -164,7 +164,7 @@ class Polyhedral_mesh_domain_with_features_3 Constructor from a polyhedral surface. No feature detection is done at this level. Note that a copy of `bounding_polyhedron` will be done. The polyhedron `bounding_polyhedron` has to be closed and free of intersections. - Its interior of `bounding_polyhedron` will be meshed. + The interior of `bounding_polyhedron` will be meshed. */ Polyhedral_mesh_domain_with_features_3(const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING From 54fbebf2b69c4bc16230ad1201628a36f2e744fa Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:51:38 +0200 Subject: [PATCH 0525/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index a1a757ee5606..fdc5fd0a1582 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -245,7 +245,7 @@ class Polyhedral_mesh_domain_with_features_3 * queries. * * @tparam InputPolyhedraPtrIterator must be a model of - * `ForwardIterator` and value type `Polyhedron*` + * `ForwardIterator` with value type `Polyhedron*` * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra From 7bc4b30501ebae90dc50491e3e73961165b564cf Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:52:13 +0200 Subject: [PATCH 0526/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index fdc5fd0a1582..33145d18b2e3 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -274,7 +274,7 @@ class Polyhedral_mesh_domain_with_features_3 * polyhedral surface. * * @tparam InputPolyhedraPtrIterator must be a model of - * `ForwardIterator` and value type `Polyhedron*` + * `ForwardIterator` with value type `Polyhedron*` * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra From 1963697d8473227b70a6bc6c8e51313458fb9621 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:56:32 +0200 Subject: [PATCH 0527/1398] Update Mesh_3/include/CGAL/Mesh_cell_criteria_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index b13a99555211..f493eddf6186 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -93,7 +93,7 @@ class Mesh_cell_criteria_3 * bound will be refined. * * See Section \ref introsecparam for further details. - * Note that if one parameter is set to 0, then its corresponding criteria is ignored. + * Note that if one parameter is set to 0, then its corresponding criterion is ignored. */ Mesh_cell_criteria_3(const FT& radius_edge_bound, const FT& radius_bound, From 21b9f6dfb5b1e87ad9a728156f034e0105a63913 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:57:09 +0200 Subject: [PATCH 0528/1398] Update Mesh_3/include/CGAL/Mesh_cell_criteria_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_cell_criteria_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h index f493eddf6186..b8bfd6cfdcf2 100644 --- a/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_cell_criteria_3.h @@ -32,7 +32,7 @@ namespace CGAL { The class `Mesh_cell_criteria_3` is a model of `MeshCellCriteria_3`. It provides, for the mesh tetrahedra, -a uniform shape criteria +a uniform shape criterion and a sizing field which may be a uniform or variable field. \tparam Tr must be identical to the nested type From 5b0857034536b8d1d5358c5cf6c580b22c0d665d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:57:41 +0200 Subject: [PATCH 0529/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h index 8ffc5d6f93a7..8407722a0f5a 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_3.h @@ -111,7 +111,7 @@ struct IGT_generator The class `Polyhedral_mesh_domain_3` implements a domain defined by a simplicial polyhedral surface. -The input polyhedral surface must be free of intersection. +The input polyhedral surface must be free of intersections. It must include (at least) one closed connected component that defines the boundary of the domain to be meshed. Inside this bounding component, From acdb2d40c5ba1f3f15cc5553ee40d001dbc43878 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:58:24 +0200 Subject: [PATCH 0530/1398] Update Mesh_3/include/CGAL/Mesh_facet_criteria_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index 30adfbd26f40..50c36e047c49 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -93,7 +93,7 @@ class Mesh_facet_criteria_3 /*! returns an object to serve as criteria for facets. - \param angle_bound is the lower bound for the angle in degrees of the + \param angle_bound is the lower bound for the angles in degrees of the surface mesh facets. \param radius_bound is a uniform upper bound for the radius of the surface Delaunay balls. From ba0172a544f578bdc92f62a6cda180d3157731a7 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 27 Jul 2023 11:59:30 +0200 Subject: [PATCH 0531/1398] Update Mesh_3/doc/Mesh_3/PackageDescription.txt Co-authored-by: Jane Tournois --- Mesh_3/doc/Mesh_3/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/doc/Mesh_3/PackageDescription.txt b/Mesh_3/doc/Mesh_3/PackageDescription.txt index c4221f3cfbf2..e063c6eeee70 100644 --- a/Mesh_3/doc/Mesh_3/PackageDescription.txt +++ b/Mesh_3/doc/Mesh_3/PackageDescription.txt @@ -84,7 +84,7 @@ related to the template parameters of some models of the main concepts: \cgalCRPSection{Classes} -- `CGAL::Mesh_triangulation_3` +- `CGAL::Mesh_triangulation_3` - `CGAL::Mesh_vertex_base_3` - `CGAL::Compact_mesh_cell_base_3` - `CGAL::Mesh_cell_base_3` From 41ae66aedfd52d8c377c1bc62158fa08618a400a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:42:59 +0200 Subject: [PATCH 0532/1398] Update Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index c57f4e4d3b38..3bb106e12426 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -147,7 +147,7 @@ class Implicit_vector_to_labeling_function_wrapper \ingroup PkgMesh3Domains The class `Implicit_multi_domain_to_labeling_function_wrapper` is a helping class to get a function with integer values -labeling the components of a multi-domain. The multidomain is described through a set of functions {fi(p), i=1, ...n}. +labeling the components of a multidomain. The multidomain is described through a set of functions {fi(p), i=1, ...n}. Each component corresponds to a sign vector [s1, s2, ..., sn] where si is the sign of the function fi(p) at a point p of the component. This wrapper class can be passed to `Labeled_mesh_domain_3` as first template parameter. From da5b2ae86286e8e03ccfdebe625229a333637515 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:46:33 +0200 Subject: [PATCH 0533/1398] Update Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 7e5a82c03bf1..7ef8b49f578e 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -84,7 +84,7 @@ class Polyline return points_.back(); } - /// returns `true` if the polyline is not degenerated + /// returns `true` if the polyline is not degenerate bool is_valid() const { return points_.size() > 1; From c42aa489498ec6402f8f96d8ad7257c7c9f86cc3 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:47:16 +0200 Subject: [PATCH 0534/1398] Update Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 7ef8b49f578e..7bc7df1a5734 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -227,7 +227,7 @@ class Polyline return result; } - /// returns signed geodesic distance between `p` and `q`. + /// returns the signed geodesic distance between `p` and `q`. FT signed_geodesic_distance(const Point_3& p, const Point_3& q) const { // Locate p & q on polyline From c70d8670b3f5553ae831bab9a4048ae46800c82f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:47:50 +0200 Subject: [PATCH 0535/1398] Update Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 7bc7df1a5734..17a44a65d98d 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -694,7 +694,7 @@ class Mesh_domain_with_polyline_features_3 /// @} /// \name Implementation of the concept MeshDomainWithFeatures_3 - /// The following methods implement the requirement of the concept + /// The following methods implement the requirements of the concept /// `MeshDomainWithFeatures_3`. /// @{ From 626f0578f74df810a8a5cdd97fce5ef2cb58550a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:48:33 +0200 Subject: [PATCH 0536/1398] Update Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h index 17a44a65d98d..5e7945f11511 100644 --- a/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h +++ b/Mesh_3/include/CGAL/Mesh_domain_with_polyline_features_3.h @@ -699,7 +699,7 @@ class Mesh_domain_with_polyline_features_3 /// @{ /// implements `MeshDomainWithFeatures_3::get_corners()`. - /// OutputIterator is std::pair + /// OutputIterator is `std::pair` template OutputIterator get_corners(OutputIterator out) const; From 913e8848c6250a6bbbb6cde8e0f3a333c7770e38 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:50:18 +0200 Subject: [PATCH 0537/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 33145d18b2e3..824d7ed1a229 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -63,7 +63,7 @@ namespace CGAL { The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose boundary is a simplicial polyhedral surface. -This surface must be free of intersection. It can either be closed, +This surface must be free of intersections. It can either be closed, included inside another polyhedral surface which is closed and free of intersection, or open. In the latter case, the meshing process will only take care of the quality of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. From 2ef1bb4e48ad992b685b278350f7d06b93e9fd3d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:50:57 +0200 Subject: [PATCH 0538/1398] Update Mesh_3/include/CGAL/Mesh_polyhedron_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_polyhedron_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h index 8e053945d604..6ae077e5bf8f 100644 --- a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h +++ b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h @@ -213,7 +213,7 @@ class Mesh_polyhedron_items : public CGAL::Polyhedron_items_3 { \ingroup PkgMesh3Domains The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses -as `PolyhedronItems_3` a customized type which adds data to the Vertex, Face and +as `PolyhedronItems_3` a customized type which adds data to the `Vertex`, `Face` and Halfedge classes. Those data are required to use the detection of sharp features. \tparam IGT stands for the geometric traits associated From 50f47a3f572b71c63d3d4183dfb9f0dfba19f946 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:51:23 +0200 Subject: [PATCH 0539/1398] Update Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h index 824d7ed1a229..593c06242588 100644 --- a/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h +++ b/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h @@ -64,7 +64,7 @@ The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose boundary is a simplicial polyhedral surface. This surface must be free of intersections. It can either be closed, -included inside another polyhedral surface which is closed and free of intersection, +included inside another polyhedral surface which is closed and free of intersections, or open. In the latter case, the meshing process will only take care of the quality of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. From de85effe56542df09887972e0532ebc1dc731e4b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:54:26 +0200 Subject: [PATCH 0540/1398] Update Mesh_3/include/CGAL/Mesh_polyhedron_3.h Co-authored-by: Jane Tournois --- Mesh_3/include/CGAL/Mesh_polyhedron_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h index 6ae077e5bf8f..454c0c94aff5 100644 --- a/Mesh_3/include/CGAL/Mesh_polyhedron_3.h +++ b/Mesh_3/include/CGAL/Mesh_polyhedron_3.h @@ -214,7 +214,7 @@ class Mesh_polyhedron_items : public CGAL::Polyhedron_items_3 { The class `Mesh_polyhedron_3` provides a customized `Polyhedron_3` type. This type uses as `PolyhedronItems_3` a customized type which adds data to the `Vertex`, `Face` and -Halfedge classes. Those data are required to use the detection of sharp features. +`Halfedge` classes. Those data are required to use the detection of sharp features. \tparam IGT stands for the geometric traits associated to the meshing process. It must be a model of the two concepts From b843f0b2a82e6ae646910bf154e1c26506381947 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 28 Jul 2023 11:35:42 +0100 Subject: [PATCH 0541/1398] CamelCase --- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 6 +++--- Mesh_3/include/CGAL/refine_mesh_3.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index 50c36e047c49..916e1073ac88 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -125,9 +125,9 @@ class Mesh_facet_criteria_3 as above, except that the radius and distance bound parameters are functionals instead of constants. */ - template < typename Sizing_field, typename DistanceField > + template < typename SizingField, typename DistanceField > Mesh_facet_criteria_3(const FT& angle_bound, - const Sizing_field & radius_bound, + const SizingField & radius_bound, const DistanceField& distance_bound, const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, const FT& min_radius_bound = 0.) @@ -139,7 +139,7 @@ class Mesh_facet_criteria_3 init_aspect(angle_bound); init_radius(radius_bound, - Mesh_3::Is_mesh_domain_field_3()); + Mesh_3::Is_mesh_domain_field_3()); init_distance(distance_bound, Mesh_3::Is_mesh_domain_field_3()); diff --git a/Mesh_3/include/CGAL/refine_mesh_3.h b/Mesh_3/include/CGAL/refine_mesh_3.h index 78778059d351..284d54791f51 100644 --- a/Mesh_3/include/CGAL/refine_mesh_3.h +++ b/Mesh_3/include/CGAL/refine_mesh_3.h @@ -174,7 +174,7 @@ class Insert_vertex_in_c3t3 * Individual optimization parameters are not described here as they are * internal types (see instead the documentation page of each optimizer). * For each optimization algorithm, there exist two global functions - * that enable to enable or disable the optimizer. + * that enable/disable the optimizer. * * \cgalNamedParamsBegin * \cgalParamSectionBegin{Topological options (manifoldness)} From 1cce66c3434d07f1ddfa320d46fe1b724b1fa1a0 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sun, 30 Jul 2023 12:59:17 +0200 Subject: [PATCH 0542/1398] Spelling corrections Spelling corrections `a e...` -> `an e...` --- .../doc/Algebraic_foundations/Concepts/EuclideanRing.h | 2 +- .../CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h | 2 +- .../include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h | 2 +- .../include/CGAL/Arr_batched_point_location.h | 2 +- .../include/CGAL/Arr_circular_line_arc_traits_2.h | 2 +- Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h | 2 +- .../Arr_batched_point_location_traits_2.h | 2 +- .../include/CGAL/Arr_vertical_decomposition_2.h | 2 +- .../Arrangement_2/Arrangement_on_surface_2_global.h | 2 +- .../include/CGAL/IO/Arr_text_formatter.h | 2 +- .../Surface_sweep_2/Arr_basic_insertion_traits_2.h | 2 +- .../Arr_no_intersection_insertion_ss_visitor.h | 2 +- .../CGAL/Surface_sweep_2/Arr_overlay_traits_2.h | 2 +- BGL/test/BGL/test_Gwdwg.cpp | 2 +- .../Boolean_set_operations_2/Gps_traits_decorator.h | 2 +- Circulator/doc/Circulator/CGAL/circulator.h | 4 ++-- .../doc/Cone_spanners_2/Cone_spanners_2.txt | 2 +- Documentation/doc/biblio/geom.bib | 4 ++-- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 2 +- .../CGAL/Hyperbolic_Delaunay_triangulation_2.h | 2 +- .../Hyperbolic_triangulation_2.txt | 10 +++++----- .../cmake/modules/CGAL_SetupCGALDependencies.cmake | 2 +- Installation/cmake/modules/FindTBB.cmake | 2 +- Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h | 2 +- Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h | 2 +- .../include/CGAL/Sqrt_extension/Fraction_traits.h | 2 +- .../test_p4ht2_locate.cpp | 2 +- .../CGAL/Polynomial/Algebraic_structure_traits.h | 2 +- Polynomial/include/CGAL/Polynomial/prs_resultant.h | 2 +- Polynomial/include/CGAL/Polynomial_traits_d.h | 2 +- .../doc/Spatial_searching/Concepts/GeneralDistance.h | 2 +- .../CGAL/Straight_skeleton_vertex_base_2.h | 2 +- .../CGAL/constructions/Straight_skeleton_cons_ftC2.h | 4 ++-- Surface_mesh/include/CGAL/Surface_mesh/Properties.h | 2 +- .../internal/auxiliary/graph.h | 2 +- .../Surface_mesh_topology/Surface_mesh_topology.txt | 2 +- 36 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h index 694218851983..7ae8d52ecc59 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h @@ -21,7 +21,7 @@ Moreover, `CGAL::Algebraic_structure_traits< EuclideanRing >` is a model of \cgalHeading{Remarks} -The most prominent example of a Euclidean ring are the integers. +The most prominent example of an Euclidean ring are the integers. Whenever both \f$ x\f$ and \f$ y\f$ are positive, then it is conventional to choose the smallest positive remainder \f$ r\f$. diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index 05b97af9bcd1..dad6b92fb904 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -613,7 +613,7 @@ class Curve_pair_analysis_2 : /* * \brief returns the indices of the ith event value * - * Returns a Event_indices (fg,ffy,ggy) such that + * Returns an Event_indices (fg,ffy,ggy) such that * the ith event root is the fgth root of the * resultant of \c f and \c g, the ffyth root of the * discriminant of \c f, and the ggyth root of the diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h index 81a74c56c38c..9d262c4d1722 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h @@ -254,7 +254,7 @@ class Xy_coordinate_2 : /*! * \brief y-coordinate of this point * - * Note: In general, this method results in a extremely large polynomial + * Note: In general, this method results in an extremely large polynomial * for the y-coordinate. It is recommended to use it carefully, * and using get_approximation_y() instead whenever approximations suffice. */ diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h index af58c2612406..fc7b94459141 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h @@ -105,7 +105,7 @@ locate(const Arrangement_on_surface_2& arr, } } - // Obtain a extended traits-class object. + // Obtain an extended traits-class object. const Gt2* geom_traits = arr.geometry_traits(); /* We would like to avoid copy construction of the geometry traits class. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h index 4d5c07d46eac..79c50ad680fa 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_circular_line_arc_traits_2.h @@ -459,7 +459,7 @@ namespace CGAL { } - // a empty class used to have different types between Curve_2 and X_monotone_curve_2 + // an empty class used to have different types between Curve_2 and X_monotone_curve_2 // in Arr_circular_line_arc_traits_2. namespace internal_Argt_traits{ struct Not_X_Monotone{}; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 19a95a662f66..e318449631f4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -231,7 +231,7 @@ overlay(const Arrangement_on_surface_2& arr1 xcvs_vec[i] = Ovl_x_monotone_curve_2(eit2->curve(), invalid_he1, he2); } - // Obtain a extended traits-class object and define the sweep-line visitor. + // Obtain an extended traits-class object and define the sweep-line visitor. const typename Arr_res::Traits_adaptor_2* traits_adaptor = arr.traits_adaptor(); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h index ce95e1da07a6..4b80bb84dd5e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h @@ -411,7 +411,7 @@ class Arr_batched_point_location_traits_2 { } }; - /*! Obtain a Equal_2 function object. */ + /*! Obtain an Equal_2 function object. */ Equal_2 equal_2_object() const { return (Equal_2(m_base_traits->equal_2_object())); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h index 3739d35a83af..75c8f25e0c96 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h @@ -109,7 +109,7 @@ decompose(const Arrangement_on_surface_2& arr, } } - // Obtain a extended traits-class object. + // Obtain an extended traits-class object. const Gt2* geom_traits = arr.geometry_traits(); /* We would like to avoid copy construction of the geometry traits class. diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index d54f4c2cb0e1..35498a4dbfdc 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -737,7 +737,7 @@ insert_non_intersecting_curve if (vh1 != nullptr) { if (vh2 != nullptr) { - // Both endpoints are associated with a existing vertices. + // Both endpoints are associated with an existing vertices. // In this case insert_at_vertices() already returns a halfedge // directed from left to right. new_he = arr.insert_at_vertices(c, 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 34cb310fd072..332f1518179f 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 @@ -524,7 +524,7 @@ class Arr_face_extended_text_formatter : /*! \class * A class defining a textual (\ascii) input/output format for arrangements * that store auxiliary dat with all their DCEL records, as they are templated - * by a extended DCEL class. + * by an extended DCEL class. */ template class Arr_extended_dcel_text_formatter : diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h index 953652180e5e..1b6ee63cd922 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h @@ -440,7 +440,7 @@ class Arr_basic_insertion_traits_2 { { return (m_base_eq(p1.base(), p2.base())); } }; - /*! Obtain a Equal_2 function object */ + /*! Obtain an Equal_2 function object */ Equal_2 equal_2_object() const { return (Equal_2(m_base_traits->equal_2_object())); } diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_no_intersection_insertion_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_no_intersection_insertion_ss_visitor.h index e6d4d543144e..e82e28b3164f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_no_intersection_insertion_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_no_intersection_insertion_ss_visitor.h @@ -23,7 +23,7 @@ * This class can be further split into two, where one derives from the other, * such that the derived class handles the case of inserting non-intersecting * curves into a non-empty arrangement, and the base class handles the case of - * inserting non-intersecting curves into a empty arrangement. + * inserting non-intersecting curves into an empty arrangement. */ #include diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h index b38fc25d3444..17231f6eb5ce 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h @@ -705,7 +705,7 @@ class Arr_overlay_traits_2 { { return m_base_equal(xcv1.base(), xcv2.base()); } }; - /*! Obtain a Equal_2 functor object. */ + /*! Obtain an Equal_2 functor object. */ Equal_2 equal_2_object() const { return Equal_2(m_base_traits->equal_2_object()); } diff --git a/BGL/test/BGL/test_Gwdwg.cpp b/BGL/test/BGL/test_Gwdwg.cpp index e250c5a63a2c..08a742f0be12 100644 --- a/BGL/test/BGL/test_Gwdwg.cpp +++ b/BGL/test/BGL/test_Gwdwg.cpp @@ -22,7 +22,7 @@ int main() Mesh mesh2(sm2); try { if( target( *(halfedges(mesh).first), mesh2) == *(vertices(mesh).first)){ - CGAL_error_msg("The previous lie should have throw a exception"); + CGAL_error_msg("The previous line should have throw an exception"); } } catch(...){ std::cerr << "we caught it" << std::endl; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h index d9d6f19c1c90..41d7508d12ec 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h @@ -387,7 +387,7 @@ class Gps_traits_decorator } }; - /*! Get a Equal_2 functor object. */ + /*! Get an Equal_2 functor object. */ Equal_2 equal_2_object() const { return Equal_2(m_base_traits->equal_2_object()); diff --git a/Circulator/doc/Circulator/CGAL/circulator.h b/Circulator/doc/Circulator/CGAL/circulator.h index 7bfeae568050..2973413afd06 100644 --- a/Circulator/doc/Circulator/CGAL/circulator.h +++ b/Circulator/doc/Circulator/CGAL/circulator.h @@ -246,7 +246,7 @@ Circulator_from_iterator(); /*! a circulator `c` initialized to refer to the element `*cur` in a range `[begin, end)`. -The circulator `c` refers to a empty sequence +The circulator `c` refers to an empty sequence if `begin==end`. */ @@ -255,7 +255,7 @@ const I& end, const I& cur = begin); /*! a copy of circulator `d` referring to the element `*cur`. -The circulator `c` refers to a empty sequence +The circulator `c` refers to an empty sequence if `d` does so. */ diff --git a/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt b/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt index d21ef3f1aca8..088fd1c5168d 100644 --- a/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt +++ b/Cone_spanners_2/doc/Cone_spanners_2/Cone_spanners_2.txt @@ -304,7 +304,7 @@ and `Construct_yao_graph_2` construct full Theta and Yao graphs. They also provi to compute Half Theta and Yao graphs. As mentioned in Section \ref sec_CBS_mydefinitions, only the edges for the odd or even cones are added to the graph in an Half Theta and Yao graph. To do so, the constructor of the functors provides a parameter of type -`Cones_selected` which is a enumeration that contains the following possible values: +`Cones_selected` which is an enumeration that contains the following possible values: `ALL_CONES`, `EVEN_CONES` and `ODD_CONES`. Users should include the `CGAL/Cone_spanners_enum_2.h` header file to use these enum values. The following are the examples on the functor constructions for Half Theta and Yao Graphs. diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 969a1a79b5ba..6b7c6366af7c 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -33579,7 +33579,7 @@ @inproceedings{c-apesp-95 queries is that of reporting an obstacle-avoiding path $P$ (or its length) between two arbitrary query points $p$ and $q$ in the plane, such that the length of $P$ is within a small factor of the -length of a Euclidean {\em shortest} obstacle-avoiding path between +length of an Euclidean {\em shortest} obstacle-avoiding path between $p$ and $q$. The goal is to answer each short path query quickly by constructing data structures that capture path information in the obstacle-scattered plane. For the related all-pairs Euclidean @@ -120365,7 +120365,7 @@ @inproceedings{rs-aggsb-98 , keywords = "Polynomial time approximation schemes, optimal algorithms, derandomization, Traveling salesman tour, Steiner minimum tree, Minimum spanning tree, Minimum matchings, 2-matchings, Edge cover, Rectilinear Steiner minimum tree, quadtrees, spanners, banyans." , update = "00.11 smid, 00.07 smid, 98.03 mitchell" , abstract = " -We give deterministic and randomized algorithms to find a Euclidean +We give deterministic and randomized algorithms to find an Euclidean traveling salesman tour (TST) of length within $(1+1/s)$ times optimal. They run in $O(N \log N)$ time and $O(N)$ space for constant dimension and $s$. These time and space bounds are optimal in an diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index 0950301c127e..cd505d535409 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -194,7 +194,7 @@ This method is automatically called once, before the first call to paintGL(). Overload init() instead of this method to modify viewer specific OpenGL state. -If a 4.3 context could not be set, a ES 2.0 context will be used instead. +If a 4.3 context could not be set, an ES 2.0 context will be used instead. \see `isOpenGL_4_3()` */ CGAL_INLINE_FUNCTION diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_2.h b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_2.h index 19e4c6683510..4d2b45ca3439 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_2.h +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/CGAL/Hyperbolic_Delaunay_triangulation_2.h @@ -208,7 +208,7 @@ class Hyperbolic_Delaunay_triangulation_2: private Delaunay_triangulation_2hyperbolic
    :
      -
    • A Euclidean Delaunay face is hyperbolic if its +
    • An Euclidean Delaunay face is hyperbolic if its circumscribing circle is contained in \f$\mathbb H^2\f$. -
    • A Euclidean Delaunay edge is hyperbolic if one of the +
    • An Euclidean Delaunay edge is hyperbolic if one of the empty disks (i.e., not containing any point of \f$\mathcal P\f$) passing through its endpoints is contained in \f$\mathbb H^2\f$. @@ -138,13 +138,13 @@ The example below shows how user-defined info can be added to the hyperbolic fac We have measured the insertion execution time of our implementation with both traits classes `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2` and `CGAL::Hyperbolic_Delaunay_triangulation_traits_2` with their default template -parameters against the insertion time in a Euclidean \cgal triangulation. +parameters against the insertion time in an Euclidean \cgal triangulation. We generate 1 million random points, uniformly distributed in the unit disk with respect to the Euclidean metric. We insert the same set of points in three triangulations:
      • a hyperbolic Delaunay triangulation with `CGAL::Hyperbolic_Delaunay_triangulation_traits_2` (%CORE traits) as traits class;
      • a hyperbolic Delaunay triangulation with `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2` (CK traits) as traits class; -
      • a Euclidean Delaunay triangulation with `CGAL::Exact_predicates_inexact_constructions_kernel` (EPICK) as traits class. +
      • an Euclidean Delaunay triangulation with `CGAL::Exact_predicates_inexact_constructions_kernel` (EPICK) as traits class.
      We create two instances of each type of triangulation. In one instance we insert the points one by one, which causes non-hyperbolic faces to be filtered out at each insertion. In the other instance we insert the points via iterator diff --git a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake index 355bde0dd6dd..1d51bbbdac5f 100644 --- a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake @@ -15,7 +15,7 @@ # .. variable:: CGAL_DISABLE_GMP # # If set, the `GMP` library will not be used. If -# :variable:`WITH_LEDA` is not used either, a efficient exact +# :variable:`WITH_LEDA` is not used either, an efficient exact # number types are used by CGAL kernels for exact computation. # # .. variable:: WITH_LEDA diff --git a/Installation/cmake/modules/FindTBB.cmake b/Installation/cmake/modules/FindTBB.cmake index 4e808b39eeed..23ec7180e34a 100644 --- a/Installation/cmake/modules/FindTBB.cmake +++ b/Installation/cmake/modules/FindTBB.cmake @@ -84,7 +84,7 @@ function(tbb_extract_real_library library real_library) set(_elf_magic "7f454c46") file(READ ${library} _hex_data OFFSET 0 LIMIT 4 HEX) if(_hex_data STREQUAL _elf_magic) - #we have opened a elf binary so this is what + #we have opened an elf binary so this is what #we should link to set(${real_library} "${library}" PARENT_SCOPE) return() diff --git a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h index ae3aec7f350b..d18631c63cf3 100644 --- a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h +++ b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Extended_homogeneous` serves as a traits class for the class `Nef_polyhedron_2`. It uses a polynomial component -representation based on a Euclidean ring number type `RT`. +representation based on an Euclidean ring number type `RT`. \cgalModels `ExtendedKernelTraits_2` diff --git a/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h b/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h index 7c09b4eaf0cd..994c6a41b806 100644 --- a/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h +++ b/Nef_S2/include/CGAL/Nef_S2/SM_io_parser.h @@ -34,7 +34,7 @@ namespace CGAL { /*{\Manpage {SM_io_parser}{Decorator_}{IO of embedded maps}{IO}}*/ /*{\Mdefinition An instance |\Mvar| of the data type |\Mname| is a -decorator to provide input and output of a embedded map. |\Mtype| is +decorator to provide input and output of an embedded map. |\Mtype| is generic with respect to the |Decorator_| parameter. |Decorator_| has to be a decorator model of our |SM_decorator| concept.}*/ diff --git a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h index 80e67f1ea86b..ceb0515c0d1e 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h @@ -41,7 +41,7 @@ namespace Intern{ * * Extensions provide suitable specializations of \c CGAL::Fraction_traits. * They are decomposable iff their coefficient type is. - * The denominator \e d of a Extension \e ext is a low common multiple + * The denominator \e d of an Extension \e ext is a low common multiple * (see \c CGAL::Fraction_traits::Common_factor for details) of the * denominators of its coefficients. The numerator is the Extenion * \e d*ext with a fraction-free coefficient type. diff --git a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp index 87c787ddb2b5..62cfc0c35808 100644 --- a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp +++ b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp @@ -57,7 +57,7 @@ int main(int, char**) std::cout << " dummy point " << j << ": OK " << std::endl; } - std::cout << "---- locating the midpoint of a Euclidean segment ----" << std::endl; + std::cout << "---- locating the midpoint of an Euclidean segment ----" << std::endl; Point p1 = tr.get_dummy_point(0), p2 = tr.get_dummy_point(1); Point query = midpoint(p1, p2); fh = tr.hyperbolic_locate(query, lt, li); diff --git a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h index f989b8ff2019..0ebb99ce5ddc 100644 --- a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h +++ b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h @@ -241,7 +241,7 @@ class Polynomial_algebraic_structure_traits_base< POLY, Unique_factorization_dom }; }; -// Clone this for a EuclideanRing +// Clone this for an EuclideanRing template< class POLY > class Polynomial_algebraic_structure_traits_base< POLY, Euclidean_ring_tag > : public Polynomial_algebraic_structure_traits_base< POLY, diff --git a/Polynomial/include/CGAL/Polynomial/prs_resultant.h b/Polynomial/include/CGAL/Polynomial/prs_resultant.h index 87a150b14990..f4de96b3ec36 100644 --- a/Polynomial/include/CGAL/Polynomial/prs_resultant.h +++ b/Polynomial/include/CGAL/Polynomial/prs_resultant.h @@ -225,7 +225,7 @@ NT prs_resultant_decompose(Polynomial A, Polynomial B){ * subresultant version. This depends on the coefficient type: * If \c NT is a \c UFDomain , the subresultant PRS is formed. * If \c NT is a \c Field that is not decomposable (see - * \c CGAL::Fraction_traits ), then a Euclidean PRS is formed. + * \c CGAL::Fraction_traits ), then an Euclidean PRS is formed. * If \c NT is a \c Field that is decomposable, then the * \c Numerator must be a \c UFDomain, and the subresultant * PRS is formed for the decomposed polynomials. diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index f7a4d3993e32..366da066d2fb 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -462,7 +462,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, // We use our own Strict Weak Ordering predicate in order to avoid - // problems when calling sort for a Exponents_coeff_pair where the + // problems when calling sort for an Exponents_coeff_pair where the // coeff type has no comparison operators available. private: struct Compare_exponents_coeff_pair diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h index fd72ee75e07a..1b19d9598ca8 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h @@ -5,7 +5,7 @@ Requirements of a distance class defining a distance between a query item denoting a spatial object and a point. To optimize distance computations transformed distances are used, -e.g., for a Euclidean distance the transformed distance is the squared +e.g., for an Euclidean distance the transformed distance is the squared Euclidean distance. \cgalHasModel `CGAL::Manhattan_distance_iso_box_point` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h index fb30f495c46c..389c4cb90534 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h @@ -11,7 +11,7 @@ which is the vertex type required by the `StraightSkeleton_2` concept. \tparam Refs must be a model of `StraightSkeleton_2` \tparam Point a Point type \tparam FT must be a model of the `FieldWithSqrt`, which is the numeric type used to represent - the time of a vertex (a Euclidean distance). + the time of a vertex (an Euclidean distance). This class can be used as a base class allowing users of the straight skeleton data structure to decorate a vertex with additional data. The concrete vertex class must be given in the `HalfedgeDSItems` diff --git a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h index b968c287195f..ab4492aea32e 100644 --- a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h @@ -328,7 +328,7 @@ construct_trisegment ( Segment_2_with_ID const& e0, // If the lines do not intersect, for example, for collinear edges, or parallel edges but with the same orientation, // returns 0 (the actual distance is undefined in this case, but 0 is a useful return) // -// NOTE: The result is a explicit rational number returned as a tuple (num,den); the caller must check that den!=0 manually +// NOTE: The result is an explicit rational number returned as a tuple (num,den); the caller must check that den!=0 manually // (a predicate for instance should return indeterminate in this case) // // PRECONDITION: None of e0, e1 and e2 are collinear (but two of them can be parallel) @@ -596,7 +596,7 @@ compute_artifical_isec_timeC2 ( Trisegment_2_ptr< Trisegment_2 *nodeptr_block; void (*error_function)(const char - *); /* this function is called if a error occurs, + *); /* this function is called if an error occurs, with a corresponding error message (or exit(1) is called if it's nullptr) */ diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt index 4ce425fb91f2..d11557c2f2c3 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt @@ -31,7 +31,7 @@ The algorithm to find a shortest non-contractible curve through a specified vert \subsection SMTopology_homotopy Homotopy Test -Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said contractible. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this section are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in a Euclidean space. +Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said contractible. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this section are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in an Euclidean space. The algorithm implemented in this package builds a data structure to efficiently answer queries of the following forms: - Given a combinatorial surface \f$\cal{M}\f$ and a closed combinatorial curve specified as a sequence of edges of \f$\cal{M}\f$, decide if the curve is contractible on \f$\cal{M}\f$, From 40c7765ffb232ee6b421317401c1b2d226fc5bc9 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sun, 30 Jul 2023 17:54:10 +0200 Subject: [PATCH 0543/1398] Spelling corrections Corrections based on review --- .../doc/Algebraic_foundations/Concepts/EuclideanRing.h | 4 ++-- .../CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h | 2 +- .../Arr_batched_point_location_traits_2.h | 2 +- .../Arrangement_2/Arrangement_on_surface_2_global.h | 2 +- .../Surface_sweep_2/Arr_basic_insertion_traits_2.h | 2 +- .../CGAL/Surface_sweep_2/Arr_overlay_traits_2.h | 2 +- .../Boolean_set_operations_2/Gps_traits_decorator.h | 2 +- Documentation/doc/biblio/geom.bib | 4 ++-- .../Hyperbolic_triangulation_2.txt | 10 +++++----- .../include/CGAL/Hyperbolic_Delaunay_triangulation_2.h | 4 ++-- Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h | 2 +- .../include/CGAL/Sqrt_extension/Fraction_traits.h | 4 ++-- .../test_p4ht2_locate.cpp | 2 +- .../CGAL/Polynomial/Algebraic_structure_traits.h | 2 +- Polynomial/include/CGAL/Polynomial/prs_resultant.h | 2 +- Polynomial/include/CGAL/Polynomial_traits_d.h | 2 +- .../doc/Spatial_searching/Concepts/GeneralDistance.h | 2 +- .../Spatial_searching/Concepts/OrthogonalDistance.h | 2 +- .../doc/Spatial_searching/Spatial_searching.txt | 2 +- .../CGAL/Straight_skeleton_vertex_base_2.h | 2 +- .../Concepts/PolygonOffsetBuilderTraits_2.h | 2 +- .../Concepts/StraightSkeletonBuilderTraits_2.h | 4 ++-- .../Concepts/StraightSkeletonVertex_2.h | 2 +- .../Surface_mesh_parameterization.txt | 2 +- .../CGAL/Curves_on_surface_topology.h | 2 +- .../Surface_mesh_topology/Surface_mesh_topology.txt | 2 +- 26 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h index 7ae8d52ecc59..a1ea3df6e968 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/EuclideanRing.h @@ -3,7 +3,7 @@ \ingroup PkgAlgebraicFoundationsAlgebraicStructuresConcepts \cgalConcept -A model of `EuclideanRing` represents an euclidean ring (or Euclidean domain). +A model of `EuclideanRing` represents a Euclidean ring (or Euclidean domain). It is an `UniqueFactorizationDomain` that affords a suitable notion of minimality of remainders such that given \f$ x\f$ and \f$ y \neq 0\f$ we obtain an (almost) unique solution to \f$ x = qy + r \f$ by demanding that a solution \f$ (q,r)\f$ is chosen to minimize \f$ r\f$. @@ -21,7 +21,7 @@ Moreover, `CGAL::Algebraic_structure_traits< EuclideanRing >` is a model of \cgalHeading{Remarks} -The most prominent example of an Euclidean ring are the integers. +The most prominent example of a Euclidean ring are the integers. Whenever both \f$ x\f$ and \f$ y\f$ are positive, then it is conventional to choose the smallest positive remainder \f$ r\f$. diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index dad6b92fb904..1f289de4787f 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -613,7 +613,7 @@ class Curve_pair_analysis_2 : /* * \brief returns the indices of the ith event value * - * Returns an Event_indices (fg,ffy,ggy) such that + * Returns an `Event_indices` (fg,ffy,ggy) such that * the ith event root is the fgth root of the * resultant of \c f and \c g, the ffyth root of the * discriminant of \c f, and the ggyth root of the diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h index 4b80bb84dd5e..b83ca0189e23 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_batched_point_location_traits_2.h @@ -411,7 +411,7 @@ class Arr_batched_point_location_traits_2 { } }; - /*! Obtain an Equal_2 function object. */ + /*! Obtain an `Equal_2` function object. */ Equal_2 equal_2_object() const { return (Equal_2(m_base_traits->equal_2_object())); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index 35498a4dbfdc..80a291231687 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -737,7 +737,7 @@ insert_non_intersecting_curve if (vh1 != nullptr) { if (vh2 != nullptr) { - // Both endpoints are associated with an existing vertices. + // Both endpoints are associated with existing vertices. // In this case insert_at_vertices() already returns a halfedge // directed from left to right. new_he = arr.insert_at_vertices(c, diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h index 1b6ee63cd922..1418044d5f40 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_basic_insertion_traits_2.h @@ -440,7 +440,7 @@ class Arr_basic_insertion_traits_2 { { return (m_base_eq(p1.base(), p2.base())); } }; - /*! Obtain an Equal_2 function object */ + /*! Obtain an `Equal_2` function object */ Equal_2 equal_2_object() const { return (Equal_2(m_base_traits->equal_2_object())); } diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h index 17231f6eb5ce..bde6981c768d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h @@ -705,7 +705,7 @@ class Arr_overlay_traits_2 { { return m_base_equal(xcv1.base(), xcv2.base()); } }; - /*! Obtain an Equal_2 functor object. */ + /*! Obtain an `Equal_2` functor object. */ Equal_2 equal_2_object() const { return Equal_2(m_base_traits->equal_2_object()); } diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h index 41d7508d12ec..cf1574c6aced 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h @@ -387,7 +387,7 @@ class Gps_traits_decorator } }; - /*! Get an Equal_2 functor object. */ + /*! Get an `Equal_2` functor object. */ Equal_2 equal_2_object() const { return Equal_2(m_base_traits->equal_2_object()); diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 6b7c6366af7c..969a1a79b5ba 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -33579,7 +33579,7 @@ @inproceedings{c-apesp-95 queries is that of reporting an obstacle-avoiding path $P$ (or its length) between two arbitrary query points $p$ and $q$ in the plane, such that the length of $P$ is within a small factor of the -length of an Euclidean {\em shortest} obstacle-avoiding path between +length of a Euclidean {\em shortest} obstacle-avoiding path between $p$ and $q$. The goal is to answer each short path query quickly by constructing data structures that capture path information in the obstacle-scattered plane. For the related all-pairs Euclidean @@ -120365,7 +120365,7 @@ @inproceedings{rs-aggsb-98 , keywords = "Polynomial time approximation schemes, optimal algorithms, derandomization, Traveling salesman tour, Steiner minimum tree, Minimum spanning tree, Minimum matchings, 2-matchings, Edge cover, Rectilinear Steiner minimum tree, quadtrees, spanners, banyans." , update = "00.11 smid, 00.07 smid, 98.03 mitchell" , abstract = " -We give deterministic and randomized algorithms to find an Euclidean +We give deterministic and randomized algorithms to find a Euclidean traveling salesman tour (TST) of length within $(1+1/s)$ times optimal. They run in $O(N \log N)$ time and $O(N)$ space for constant dimension and $s$. These time and space bounds are optimal in an diff --git a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Hyperbolic_triangulation_2.txt b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Hyperbolic_triangulation_2.txt index ed546716b1fc..d5b32a209795 100644 --- a/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Hyperbolic_triangulation_2.txt +++ b/Hyperbolic_triangulation_2/doc/Hyperbolic_triangulation_2/Hyperbolic_triangulation_2.txt @@ -27,7 +27,7 @@ H_\infty\f$ of points at infinity. In this model, a hyperbolic line is either an arc of circle perpendicular to the unit circle or, if it passes through the origin, -a diameter of the unit disk. A hyperbolic circle is an Euclidean +a diameter of the unit disk. A hyperbolic circle is a Euclidean circle contained in the unit disk; however, its hyperbolic center and radius are not the same as its Euclidean center and radius. @@ -53,9 +53,9 @@ precisely, the hyperbolic Delaunay triangulation of \f$\mathcal P\f$ only contains the simplices of the Euclidean Delaunay triangulation that are hyperbolic:
        -
      • An Euclidean Delaunay face is hyperbolic if its +
      • A Euclidean Delaunay face is hyperbolic if its circumscribing circle is contained in \f$\mathbb H^2\f$. -
      • An Euclidean Delaunay edge is hyperbolic if one of the +
      • A Euclidean Delaunay edge is hyperbolic if one of the empty disks (i.e., not containing any point of \f$\mathcal P\f$) passing through its endpoints is contained in \f$\mathbb H^2\f$. @@ -138,13 +138,13 @@ The example below shows how user-defined info can be added to the hyperbolic fac We have measured the insertion execution time of our implementation with both traits classes `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2` and `CGAL::Hyperbolic_Delaunay_triangulation_traits_2` with their default template -parameters against the insertion time in an Euclidean \cgal triangulation. +parameters against the insertion time in a Euclidean \cgal triangulation. We generate 1 million random points, uniformly distributed in the unit disk with respect to the Euclidean metric. We insert the same set of points in three triangulations:
        • a hyperbolic Delaunay triangulation with `CGAL::Hyperbolic_Delaunay_triangulation_traits_2` (%CORE traits) as traits class;
        • a hyperbolic Delaunay triangulation with `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2` (CK traits) as traits class; -
        • an Euclidean Delaunay triangulation with `CGAL::Exact_predicates_inexact_constructions_kernel` (EPICK) as traits class. +
        • a Euclidean Delaunay triangulation with `CGAL::Exact_predicates_inexact_constructions_kernel` (EPICK) as traits class.
        We create two instances of each type of triangulation. In one instance we insert the points one by one, which causes non-hyperbolic faces to be filtered out at each insertion. In the other instance we insert the points via iterator diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h index 538991692ba3..d95bfe27fba8 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_2.h @@ -880,7 +880,7 @@ class Hyperbolic_Delaunay_triangulation_2 Face_handle locate(const Point& query, Locate_type& lt, int &li, Face_handle hint = Face_handle()) const { - // Perform an Euclidean location first and get close to the hyperbolic face containing the query point + // Perform a Euclidean location first and get close to the hyperbolic face containing the query point typename Base::Locate_type blt; Face_handle fh = Base::locate(query, blt, li, hint); @@ -901,7 +901,7 @@ class Hyperbolic_Delaunay_triangulation_2 CGAL_assertion(!is_infinite(fh)); - // This case corresponds to when the point is located on an Euclidean edge. + // This case corresponds to when the point is located on a Euclidean edge. if(lt == EDGE) { // Here because the call to `side_of_hyperbolic_triangle` might change `li` diff --git a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h index d18631c63cf3..ae3aec7f350b 100644 --- a/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h +++ b/Nef_2/doc/Nef_2/CGAL/Extended_homogeneous.h @@ -6,7 +6,7 @@ namespace CGAL { The class `Extended_homogeneous` serves as a traits class for the class `Nef_polyhedron_2`. It uses a polynomial component -representation based on an Euclidean ring number type `RT`. +representation based on a Euclidean ring number type `RT`. \cgalModels `ExtendedKernelTraits_2` diff --git a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h index ceb0515c0d1e..a4daeef3828f 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Fraction_traits.h @@ -41,9 +41,9 @@ namespace Intern{ * * Extensions provide suitable specializations of \c CGAL::Fraction_traits. * They are decomposable iff their coefficient type is. - * The denominator \e d of an Extension \e ext is a low common multiple + * The denominator \e d of an extension \e ext is a low common multiple * (see \c CGAL::Fraction_traits::Common_factor for details) of the - * denominators of its coefficients. The numerator is the Extenion + * denominators of its coefficients. The numerator is the extenion * \e d*ext with a fraction-free coefficient type. * * This works for nested Sqrt_extensions, too. diff --git a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp index 62cfc0c35808..87c787ddb2b5 100644 --- a/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp +++ b/Periodic_4_hyperbolic_triangulation_2/test/Periodic_4_hyperbolic_triangulation_2/test_p4ht2_locate.cpp @@ -57,7 +57,7 @@ int main(int, char**) std::cout << " dummy point " << j << ": OK " << std::endl; } - std::cout << "---- locating the midpoint of an Euclidean segment ----" << std::endl; + std::cout << "---- locating the midpoint of a Euclidean segment ----" << std::endl; Point p1 = tr.get_dummy_point(0), p2 = tr.get_dummy_point(1); Point query = midpoint(p1, p2); fh = tr.hyperbolic_locate(query, lt, li); diff --git a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h index 0ebb99ce5ddc..f989b8ff2019 100644 --- a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h +++ b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h @@ -241,7 +241,7 @@ class Polynomial_algebraic_structure_traits_base< POLY, Unique_factorization_dom }; }; -// Clone this for an EuclideanRing +// Clone this for a EuclideanRing template< class POLY > class Polynomial_algebraic_structure_traits_base< POLY, Euclidean_ring_tag > : public Polynomial_algebraic_structure_traits_base< POLY, diff --git a/Polynomial/include/CGAL/Polynomial/prs_resultant.h b/Polynomial/include/CGAL/Polynomial/prs_resultant.h index f4de96b3ec36..87a150b14990 100644 --- a/Polynomial/include/CGAL/Polynomial/prs_resultant.h +++ b/Polynomial/include/CGAL/Polynomial/prs_resultant.h @@ -225,7 +225,7 @@ NT prs_resultant_decompose(Polynomial A, Polynomial B){ * subresultant version. This depends on the coefficient type: * If \c NT is a \c UFDomain , the subresultant PRS is formed. * If \c NT is a \c Field that is not decomposable (see - * \c CGAL::Fraction_traits ), then an Euclidean PRS is formed. + * \c CGAL::Fraction_traits ), then a Euclidean PRS is formed. * If \c NT is a \c Field that is decomposable, then the * \c Numerator must be a \c UFDomain, and the subresultant * PRS is formed for the decomposed polynomials. diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index 366da066d2fb..6eb4f0d6e3f2 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -462,7 +462,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, // We use our own Strict Weak Ordering predicate in order to avoid - // problems when calling sort for an Exponents_coeff_pair where the + // problems when calling sort for an `Exponents_coeff_pair` where the // coeff type has no comparison operators available. private: struct Compare_exponents_coeff_pair diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h index 1b19d9598ca8..fd72ee75e07a 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/GeneralDistance.h @@ -5,7 +5,7 @@ Requirements of a distance class defining a distance between a query item denoting a spatial object and a point. To optimize distance computations transformed distances are used, -e.g., for an Euclidean distance the transformed distance is the squared +e.g., for a Euclidean distance the transformed distance is the squared Euclidean distance. \cgalHasModel `CGAL::Manhattan_distance_iso_box_point` diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h index d2a398589d80..d5b2af664e8c 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/OrthogonalDistance.h @@ -4,7 +4,7 @@ Requirements of an orthogonal distance class supporting incremental distance updates. To optimize distance computations transformed distances are used. -E.g., for an Euclidean distance the transformed distance is the squared Euclidean distance. +E.g., for a Euclidean distance the transformed distance is the squared Euclidean distance. \cgalRefines{GeneralDistance} diff --git a/Spatial_searching/doc/Spatial_searching/Spatial_searching.txt b/Spatial_searching/doc/Spatial_searching/Spatial_searching.txt index afa3a3eb0ca8..b6f061060699 100644 --- a/Spatial_searching/doc/Spatial_searching/Spatial_searching.txt +++ b/Spatial_searching/doc/Spatial_searching/Spatial_searching.txt @@ -282,7 +282,7 @@ scenarios for different splitter types. \subsection Spatial_searchingExampleforKNeighborSearching Example for K Neighbor Searching -The first example illustrates k neighbor searching with an Euclidean +The first example illustrates k neighbor searching with a Euclidean distance and 2-dimensional points. The generated random data points are inserted in a search tree. We then initialize the k neighbor search object with the origin as query. Finally, we diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h index 389c4cb90534..fb30f495c46c 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_vertex_base_2.h @@ -11,7 +11,7 @@ which is the vertex type required by the `StraightSkeleton_2` concept. \tparam Refs must be a model of `StraightSkeleton_2` \tparam Point a Point type \tparam FT must be a model of the `FieldWithSqrt`, which is the numeric type used to represent - the time of a vertex (an Euclidean distance). + the time of a vertex (a Euclidean distance). This class can be used as a base class allowing users of the straight skeleton data structure to decorate a vertex with additional data. The concrete vertex class must be given in the `HalfedgeDSItems` diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h index d0c364262cbb..0c9bd5a352eb 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/PolygonOffsetBuilderTraits_2.h @@ -41,7 +41,7 @@ Must provide `boost::optional operator()(const FT& t, const Segment_2& e0, const Segment_2& e1, const Trisegment_2_ptr& et) const`, which constructs the point of intersection of the lines obtained by offsetting -the oriented lines given by `e0` and `e0` an Euclidean distance `t`. +the oriented lines given by `e0` and `e0` a Euclidean distance `t`. If `e0` and `e1` are collinear, if `et` is not specified (`nullptr`), then the midpoint should be returned, otherwise, the event point of `et` should be returned. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h index f971c1c880c2..2b27a072c431 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonBuilderTraits_2.h @@ -67,8 +67,8 @@ Must provide `bool operator()( const Trisegment_2_ptr& tri_segment, boost::optional max_time ) const`, which determines if, given the three oriented lines defined by the three input edges, -there exists an Euclidean distance `t >= 0` and `t <= max_time` for which the corresponding three -offset lines at `t` (parallel lines at an Euclidean distance of `t`) intersect in a single point. +there exists a Euclidean distance `t >= 0` and `t <= max_time` for which the corresponding three +offset lines at `t` (parallel lines at a Euclidean distance of `t`) intersect in a single point. \pre Each edge in the triple must properly define an oriented line, that is, its points cannot be coincident. */ diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h index 7a26285dccfc..1b66e17ee694 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Concepts/StraightSkeletonVertex_2.h @@ -26,7 +26,7 @@ The type of the 2D point being the geometric embedding of the vertex typedef unspecified_type Point_2; /*! -A model of the `FieldWithSqrt` concept representing the time of a vertex (an Euclidean distance) +A model of the `FieldWithSqrt` concept representing the time of a vertex (a Euclidean distance) */ typedef unspecified_type FT; diff --git a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Surface_mesh_parameterization.txt b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Surface_mesh_parameterization.txt index 3a876b5977a8..c4be5d3c0fb1 100644 --- a/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Surface_mesh_parameterization.txt +++ b/Surface_mesh_parameterization/doc/Surface_mesh_parameterization/Surface_mesh_parameterization.txt @@ -441,7 +441,7 @@ Orbifold-Tutte Planar Embedding was introduced by Aigerman and Lipman \cgalCite{ and is a generalization of Tutte’s embedding to other topologies, and in particular spheres, which we consider here. The orbifold-Tutte embedding bijectively maps the original surface, that is required to be a topological ball, to a canonical, -topologically equivalent, two-dimensional flat surface called an Euclidean orbifold. +topologically equivalent, two-dimensional flat surface called a Euclidean orbifold. There are 17 Euclidean orbifolds, of which only the 4 sphere orbifolds are currently implemented in CGAL. diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h index d8fafdc03048..21a7c20ee0e6 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/Curves_on_surface_topology.h @@ -91,7 +91,7 @@ namespace Surface_mesh_topology { /// Number type of the weights. using Weight_t=double; - /// creates an Euclidean_length_weight_functor given a mesh. + /// creates a Euclidean_length_weight_functor given a mesh. Euclidean_length_weight_functor(const Mesh& m); }; diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt index d11557c2f2c3..4ce425fb91f2 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt @@ -31,7 +31,7 @@ The algorithm to find a shortest non-contractible curve through a specified vert \subsection SMTopology_homotopy Homotopy Test -Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said contractible. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this section are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in an Euclidean space. +Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said contractible. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this section are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in a Euclidean space. The algorithm implemented in this package builds a data structure to efficiently answer queries of the following forms: - Given a combinatorial surface \f$\cal{M}\f$ and a closed combinatorial curve specified as a sequence of edges of \f$\cal{M}\f$, decide if the curve is contractible on \f$\cal{M}\f$, From 7487010c0998739b3e5210b601f11d397aeb615a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 1 Aug 2023 09:43:59 +0100 Subject: [PATCH 0544/1398] Remove blabla as the emums are documented in Mesh_2/doc --- Mesher_level/include/CGAL/Mesh_optimization_return_code.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Mesher_level/include/CGAL/Mesh_optimization_return_code.h b/Mesher_level/include/CGAL/Mesh_optimization_return_code.h index 3643395667c2..4717055c5303 100644 --- a/Mesher_level/include/CGAL/Mesh_optimization_return_code.h +++ b/Mesher_level/include/CGAL/Mesh_optimization_return_code.h @@ -18,10 +18,7 @@ #define CGAL_MESH_OPTIMIZATION_RETURN_CODE_H namespace CGAL { - /*! - * \brief bla bla - @todo document correctly - */ + enum Mesh_optimization_return_code { MESH_OPTIMIZATION_UNKNOWN_ERROR=-1, From 92a434018ac1087aab8c02c1835a2a87a68e29e2 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 23 May 2023 00:09:18 +0200 Subject: [PATCH 0545/1398] Add sizing field calculation from curvature WIP: isotropic remeshing default overload is now broken --- .../Polygon_mesh_processing/CMakeLists.txt | 11 +- ...sotropic_remeshing_with_sizing_example.cpp | 15 +- .../Adaptive_sizing_field.h | 141 +++++++++++++----- .../Isotropic_remeshing/Sizing_field.h | 2 +- .../Uniform_sizing_field.h | 5 +- .../Isotropic_remeshing/remesh_impl.h | 9 +- .../CGAL/Polygon_mesh_processing/remesh.h | 10 +- 7 files changed, 140 insertions(+), 53 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 28d0550a31c4..3644cc490978 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -25,9 +25,8 @@ create_single_source_cgal_program("orient_polygon_soup_example.cpp") create_single_source_cgal_program("triangulate_polyline_example.cpp") create_single_source_cgal_program("mesh_slicer_example.cpp") #create_single_source_cgal_program( "remove_degeneracies_example.cpp") -create_single_source_cgal_program("isotropic_remeshing_example.cpp") -create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") -create_single_source_cgal_program("isotropic_remeshing_with_sizing_example.cpp") +#create_single_source_cgal_program("isotropic_remeshing_example.cpp") +#create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") create_single_source_cgal_program("tangential_relaxation_example.cpp") create_single_source_cgal_program("surface_mesh_intersection.cpp") create_single_source_cgal_program("corefinement_SM.cpp") @@ -70,6 +69,12 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(hole_filling_example_LCC PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_smoothing_example.cpp") target_link_libraries(mesh_smoothing_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("isotropic_remeshing_example.cpp") + target_link_libraries(isotropic_remeshing_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") + target_link_libraries(isotropic_remeshing_of_patch_example PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("isotropic_remeshing_with_sizing_example.cpp") + target_link_libraries(isotropic_remeshing_with_sizing_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_example.cpp") target_link_libraries(delaunay_remeshing_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("remesh_almost_planar_patches.cpp") diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index 1e1335ccfa6d..fd27430e056d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -11,7 +11,9 @@ 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/pig.off"); +// const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/pig.off"); +// const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/hand.off"); + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/nefertiti.off"); std::ifstream input(filename); Mesh mesh; @@ -20,16 +22,17 @@ int main(int argc, char* argv[]) return 1; } - //todo ip - update - const std::pair edge_min_max{0.1, 0.12}; - unsigned int nb_iter = 3; - std::cout << "Start remeshing of " << filename << " (" << num_faces(mesh) << " faces)..." << std::endl; + const double tol = 0.002; + const std::pair edge_min_max{0.001, 0.5}; + PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, mesh); + unsigned int nb_iter = 3; + PMP::isotropic_remeshing( faces(mesh), - edge_min_max, + sizing_field, mesh, PMP::parameters::number_of_iterations(nb_iter) ); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 1293577ad4f8..5724d26ba0df 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -17,6 +17,8 @@ #include +#include + #include namespace CGAL @@ -30,26 +32,37 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef CGAL::Sizing_field Base; public: + typedef typename Base::K K; typedef typename Base::FT FT; typedef typename Base::Point_3 Point_3; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; - typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; + + typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; typedef typename boost::property_map::type VertexSizingMap; - Adaptive_sizing_field(const std::pair& edge_len_min_max + //todo ip: set a property map that can calculate curvature in one go. I think I'm generating constant maps (without put) + // try 1 + typedef Principal_curvatures_and_directions Principal_curvatures; +// typedef Constant_property_map Vertex_curvature_map; + + // try 2 + typedef Constant_property_map> Default_principal_map; + typedef typename internal_np::Lookup_named_param_def::type + Vertex_curvature_map; + + Adaptive_sizing_field(const double tol + , const std::pair& edge_len_min_max , PolygonMesh& pmesh) - : m_sq_short( CGAL::square(edge_len_min_max.first)) - , m_sq_long( CGAL::square(edge_len_min_max.second)) + : tol(tol) + , m_sq_short(CGAL::square(edge_len_min_max.first)) + , m_sq_long( CGAL::square(edge_len_min_max.second)) , m_pmesh(pmesh) { - //todo ip: initialize sizing map with default values - //todo ip: might end up using directly the property map of the curvature calculation (if mutable)? - vertex_sizing_map_ = get(Vertex_property_tag(), m_pmesh); - for(vertex_descriptor v : vertices(m_pmesh)){ - put(vertex_sizing_map_, v, m_sq_long); - } + m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); } private: @@ -69,21 +82,62 @@ class Adaptive_sizing_field : public CGAL::Sizing_field public: void calc_sizing_map() { - //todo ip - // calculate curvature - - // loop over curvature property field and calculate the target mesh size for a vertex - // don't forget to store squared length - +#ifdef CGAL_PMP_REMESHING_VERBOSE + int oversize = 0; + int undersize = 0; + int insize = 0; + std::cout << "Calculating sizing field..." << std::endl; +#endif + + //todo ip: how to make this work? +// Vertex_curvature_map vertex_curvature_map; +// interpolated_corrected_principal_curvatures_and_directions(m_pmesh +// , vertex_curvature_map); + + // calculate square vertex sizing field (L(x_i))^2 from curvature field + for(vertex_descriptor v : vertices(m_pmesh)) + { +// auto vertex_curv = get(vertex_curvature_map, v); //todo ip: how to make this work? + //todo ip: temp solution + const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); + const FT max_absolute_curv = std::max(std::abs(vertex_curv.max_curvature), std::abs(vertex_curv.min_curvature)); + const FT vertex_size_sq = 6 * tol / max_absolute_curv - 3 * CGAL::square(tol); + if (vertex_size_sq > m_sq_long) + { + put(m_vertex_sizing_map, v, m_sq_long); +#ifdef CGAL_PMP_REMESHING_VERBOSE + ++oversize; +#endif + } + else if (vertex_size_sq < m_sq_short) + { + put(m_vertex_sizing_map, v, m_sq_short); +#ifdef CGAL_PMP_REMESHING_VERBOSE + ++undersize; +#endif + } + else + { + put(m_vertex_sizing_map, v, vertex_size_sq); +#ifdef CGAL_PMP_REMESHING_VERBOSE + ++insize; +#endif + } + } +#ifdef CGAL_PMP_REMESHING_VERBOSE + std::cout << " done (" << insize << " from curvature, " + << oversize << " set to max, " + << undersize << " set to min)" << std::endl; +#endif } boost::optional is_too_long(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), - get(vertex_sizing_map_, target(h, m_pmesh))); - CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); - CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); + FT sqtarg_len = std::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); if(sqlen > sqtarg_len) return sqlen; else @@ -94,11 +148,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field const vertex_descriptor& vb) const { const FT sqlen = sqlength(va, vb); - FT sqtarg_len = std::min(get(vertex_sizing_map_, va), - get(vertex_sizing_map_, vb)); - CGAL_assertion(get(vertex_sizing_map_, va)); - CGAL_assertion(get(vertex_sizing_map_, vb)); - if (sqlen > sqtarg_len) + FT sqtarg_len = std::min(get(m_vertex_sizing_map, va), + get(m_vertex_sizing_map, vb)); + CGAL_assertion(get(m_vertex_sizing_map, va)); + CGAL_assertion(get(m_vertex_sizing_map, vb)); + if (sqlen > 16./9. * sqtarg_len) return sqlen; else return boost::none; @@ -107,11 +161,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_short(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = std::min(get(vertex_sizing_map_, source(h, m_pmesh)), - get(vertex_sizing_map_, target(h, m_pmesh))); - CGAL_assertion(get(vertex_sizing_map_, source(h, m_pmesh))); - CGAL_assertion(get(vertex_sizing_map_, target(h, m_pmesh))); - if (sqlen < sqtarg_len) + FT sqtarg_len = std::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); + if (sqlen < 16./25. * sqtarg_len) return sqlen; else return boost::none; @@ -125,18 +179,31 @@ class Adaptive_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } - void update_sizing_map(const vertex_descriptor& vnew) + void update_sizing_map(const vertex_descriptor& v) { - //todo ip: calculate curvature for the vertex - //dummy - put(vertex_sizing_map_, vnew, m_sq_short); + // calculating it as the average of two vertices on other ends + // of halfedges as updating is done during an edge split + int i = 0; + FT vertex_size_sq = 0; + CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh) == 2); + for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, m_pmesh)) + { + vertex_size_sq += get(m_vertex_sizing_map, source(ha, m_pmesh)); + ++i; + } + vertex_size_sq /= i; + + put(m_vertex_sizing_map, v, vertex_size_sq); } + //todo ip: is_protected_constraint_too_long() from PR + private: - FT m_sq_short; - FT m_sq_long; + const FT tol; + const FT m_sq_short; + const FT m_sq_long; PolygonMesh& m_pmesh; - VertexSizingMap vertex_sizing_map_; + VertexSizingMap m_vertex_sizing_map; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index fc6b14a984f5..7f1a8a2abbea 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -30,9 +30,9 @@ class Sizing_field typedef PolygonMesh PM; typedef typename boost::property_map::const_type VPMap; typedef typename boost::property_traits::value_type Point; - typedef typename CGAL::Kernel_traits::Kernel K; public: + typedef typename CGAL::Kernel_traits::Kernel K; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef Point Point_3; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index fbb522b7c787..ce523b30a8a9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -56,6 +56,10 @@ class Uniform_sizing_field : public CGAL::Sizing_field } public: + //todo ip: rewrite to remove this? + void calc_sizing_map() const {} + void update_sizing_map(const vertex_descriptor& vnew) const {} + boost::optional is_too_long(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); @@ -92,7 +96,6 @@ class Uniform_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } - void update_sizing_map(const vertex_descriptor& vnew) const {} //todo ip- rewrite to remove this? private: FT m_sq_short; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 19651ded9ae5..20647a91cb77 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -55,6 +55,9 @@ #include #include +//todo ip: temp +#define CGAL_PMP_REMESHING_VERBOSE + #ifdef CGAL_PMP_REMESHING_DEBUG #include #define CGAL_DUMP_REMESHING_STEPS @@ -536,8 +539,6 @@ namespace internal { //move refinement point vertex_descriptor vnew = target(hnew, mesh_); put(vpmap_, vnew, refinement_point); - //todo ip-add - sizing.update_sizing_map(vnew); #ifdef CGAL_PMP_REMESHING_VERY_VERBOSE std::cout << " Refinement point : " << refinement_point << std::endl; #endif @@ -547,6 +548,9 @@ namespace internal { halfedge_added(hnew, status(he)); halfedge_added(hnew_opp, status(opposite(he, mesh_))); + //todo ip-add: already updating sizing here because of is_too_long checks below + sizing.update_sizing_map(vnew); + //check sub-edges //if it was more than twice the "long" threshold, insert them boost::optional sqlen_new = sizing.is_too_long(hnew); @@ -2014,7 +2018,6 @@ namespace internal { VertexIsConstrainedMap vcmap_; FaceIndexMap fimap_; CGAL_assertion_code(bool input_mesh_is_valid_;) - //todo ip: maybe make sizing field member (reference) here? easier to handle updates };//end class Incremental_remesher }//end namespace internal diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 858f34958109..33f382ac4639 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -212,18 +212,22 @@ void isotropic_remeshing(const FaceRange& faces , const NamedParameters& np = parameters::default_values()) { typedef Uniform_sizing_field Default_sizing; + Default_sizing sizing(target_edge_length, pmesh); isotropic_remeshing( faces, - Default_sizing(target_edge_length, pmesh), + sizing, pmesh, np); } +//todo ip: should I have the overload here? +/* template void isotropic_remeshing(const FaceRange& faces - , const std::pair& edge_len_min_max //todo add defaults? + , const double& tol + , const std::pair& edge_len_min_max , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { @@ -235,6 +239,7 @@ void isotropic_remeshing(const FaceRange& faces pmesh, np); } + */ template Date: Wed, 24 May 2023 20:10:00 +0200 Subject: [PATCH 0546/1398] Refactor sizing map update --- .../internal/Isotropic_remeshing/Adaptive_sizing_field.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 5724d26ba0df..64ac1ddf5613 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -183,15 +183,13 @@ class Adaptive_sizing_field : public CGAL::Sizing_field { // calculating it as the average of two vertices on other ends // of halfedges as updating is done during an edge split - int i = 0; FT vertex_size_sq = 0; CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh) == 2); for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, m_pmesh)) { vertex_size_sq += get(m_vertex_sizing_map, source(ha, m_pmesh)); - ++i; } - vertex_size_sq /= i; + vertex_size_sq /= CGAL::halfedges_around_target(v, m_pmesh).size(); put(m_vertex_sizing_map, v, vertex_size_sq); } From 52df5ae86eeddea3ae0a08fa79bce3afb668c64c Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 26 May 2023 11:03:27 +0200 Subject: [PATCH 0547/1398] Fix default remeshing overload --- .../include/CGAL/Polygon_mesh_processing/remesh.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 33f382ac4639..2c31cf4c65f6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -207,7 +207,7 @@ template void isotropic_remeshing(const FaceRange& faces - , const double& target_edge_length + , const double target_edge_length , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { @@ -355,13 +355,15 @@ void isotropic_remeshing(const FaceRange& faces t.reset(); t.start(); #endif +// sizing.calc_sizing_map(); for (unsigned int i = 0; i < nb_iterations; ++i) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " * Iteration " << (i + 1) << " *" << std::endl; #endif - sizing.calc_sizing_map(); + if (i < 2) + sizing.calc_sizing_map(); if(do_split) remesher.split_long_edges(sizing); if(do_collapse) From 947ab8f1255d7bedea2adb6be919f23f95f3fd7b Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 26 May 2023 18:20:11 +0200 Subject: [PATCH 0548/1398] Make a (temp) property map for curvature calculation --- .../isotropic_remeshing_with_sizing_example.cpp | 7 ++++--- .../Isotropic_remeshing/Adaptive_sizing_field.h | 14 +++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index fd27430e056d..cfbf7bfd9c77 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -11,9 +11,10 @@ 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/pig.off"); +// const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/lion-head.off"); // const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/hand.off"); const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/nefertiti.off"); +// const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cube.off"); std::ifstream input(filename); Mesh mesh; @@ -25,10 +26,10 @@ int main(int argc, char* argv[]) std::cout << "Start remeshing of " << filename << " (" << num_faces(mesh) << " faces)..." << std::endl; - const double tol = 0.002; + const double tol = 0.001; const std::pair edge_min_max{0.001, 0.5}; PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, mesh); - unsigned int nb_iter = 3; + unsigned int nb_iter = 5; PMP::isotropic_remeshing( faces(mesh), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 64ac1ddf5613..1cbaf0bce8df 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -91,15 +91,19 @@ class Adaptive_sizing_field : public CGAL::Sizing_field //todo ip: how to make this work? // Vertex_curvature_map vertex_curvature_map; -// interpolated_corrected_principal_curvatures_and_directions(m_pmesh -// , vertex_curvature_map); + + //todo ip: temp workaround + auto vertex_curvature_map = + m_pmesh.template add_property_map>("v:curvature_map").first; + interpolated_corrected_principal_curvatures_and_directions(m_pmesh + , vertex_curvature_map); // calculate square vertex sizing field (L(x_i))^2 from curvature field for(vertex_descriptor v : vertices(m_pmesh)) { -// auto vertex_curv = get(vertex_curvature_map, v); //todo ip: how to make this work? - //todo ip: temp solution - const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); + auto vertex_curv = get(vertex_curvature_map, v); //todo ip: how to make this work? + //todo ip: alt solution - calculate curvature per vertex +// const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); const FT max_absolute_curv = std::max(std::abs(vertex_curv.max_curvature), std::abs(vertex_curv.min_curvature)); const FT vertex_size_sq = 6 * tol / max_absolute_curv - 3 * CGAL::square(tol); if (vertex_size_sq > m_sq_long) From c89bedb97faac6a194086ced0d3cdb063403b913 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 31 May 2023 22:26:23 +0200 Subject: [PATCH 0549/1398] Replace std with cgal where applicable, fix assertion --- .../Adaptive_sizing_field.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 1cbaf0bce8df..9027fa0e40f3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -101,10 +101,10 @@ class Adaptive_sizing_field : public CGAL::Sizing_field // calculate square vertex sizing field (L(x_i))^2 from curvature field for(vertex_descriptor v : vertices(m_pmesh)) { - auto vertex_curv = get(vertex_curvature_map, v); //todo ip: how to make this work? + auto vertex_curv = get(vertex_curvature_map, v); //todo ip: alt solution - calculate curvature per vertex // const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); - const FT max_absolute_curv = std::max(std::abs(vertex_curv.max_curvature), std::abs(vertex_curv.min_curvature)); + const FT max_absolute_curv = CGAL::max(CGAL::abs(vertex_curv.max_curvature), CGAL::abs(vertex_curv.min_curvature)); const FT vertex_size_sq = 6 * tol / max_absolute_curv - 3 * CGAL::square(tol); if (vertex_size_sq > m_sq_long) { @@ -138,8 +138,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_long(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = std::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh))); + FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); if(sqlen > sqtarg_len) @@ -152,8 +152,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field const vertex_descriptor& vb) const { const FT sqlen = sqlength(va, vb); - FT sqtarg_len = std::min(get(m_vertex_sizing_map, va), - get(m_vertex_sizing_map, vb)); + FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, va), + get(m_vertex_sizing_map, vb)); CGAL_assertion(get(m_vertex_sizing_map, va)); CGAL_assertion(get(m_vertex_sizing_map, vb)); if (sqlen > 16./9. * sqtarg_len) @@ -165,8 +165,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_short(const halfedge_descriptor& h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = std::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh))); + FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); if (sqlen < 16./25. * sqtarg_len) @@ -188,7 +188,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field // calculating it as the average of two vertices on other ends // of halfedges as updating is done during an edge split FT vertex_size_sq = 0; - CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh) == 2); + CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh).size() == 2); for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, m_pmesh)) { vertex_size_sq += get(m_vertex_sizing_map, source(ha, m_pmesh)); From fa9769b908026cd63c4801ba34fb73b8d2f055c7 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 8 Jun 2023 23:08:40 +0200 Subject: [PATCH 0550/1398] Prep sizing for tangential relaxation (WIP) --- .../Isotropic_remeshing/remesh_impl.h | 18 +- .../CGAL/Polygon_mesh_processing/remesh.h | 8 +- .../tangential_relaxation.h | 210 ++++++++++++++++++ 3 files changed, 231 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 20647a91cb77..6b2fa17bb0b9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -1012,8 +1012,10 @@ namespace internal { // "applies an iterative smoothing filter to the mesh. // The vertex movement has to be constrained to the vertex tangent plane [...] // smoothing algorithm with uniform Laplacian weights" + template void tangential_relaxation_impl(const bool relax_constraints/*1d smoothing*/ - , const unsigned int nb_iterations) + , const unsigned int nb_iterations + , const SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << "Tangential relaxation (" << nb_iterations << " iter.)..."; @@ -1044,6 +1046,8 @@ namespace internal { auto constrained_vertices_pmap = boost::make_function_property_map(vertex_constraint); + //todo IP temp: I have to rewrite to include original implementation + /* tangential_relaxation( vertices(mesh_), mesh_, @@ -1054,6 +1058,18 @@ namespace internal { .vertex_is_constrained_map(constrained_vertices_pmap) .relax_constraints(relax_constraints) ); + */ + tangential_relaxation( + vertices(mesh_), + mesh_, + sizing, + CGAL::parameters::number_of_iterations(nb_iterations) + .vertex_point_map(vpmap_) + .geom_traits(gt_) + .edge_is_constrained_map(constrained_edges_pmap) + .vertex_is_constrained_map(constrained_vertices_pmap) + .relax_constraints(relax_constraints) + ); CGAL_assertion(!input_mesh_is_valid_ || is_valid_polygon_mesh(mesh_)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 2c31cf4c65f6..4f5162482c29 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -355,22 +355,22 @@ void isotropic_remeshing(const FaceRange& faces t.reset(); t.start(); #endif -// sizing.calc_sizing_map(); + sizing.calc_sizing_map(); for (unsigned int i = 0; i < nb_iterations; ++i) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " * Iteration " << (i + 1) << " *" << std::endl; #endif - if (i < 2) - sizing.calc_sizing_map(); +// if (i < 2) +// sizing.calc_sizing_map(); if(do_split) remesher.split_long_edges(sizing); if(do_collapse) remesher.collapse_short_edges(sizing, collapse_constraints); if(do_flip) remesher.flip_edges_for_valence_and_shape(); - remesher.tangential_relaxation_impl(smoothing_1d, nb_laplacian); + remesher.tangential_relaxation_impl(smoothing_1d, nb_laplacian, sizing); if ( choose_parameter(get_parameter(np, internal_np::do_project), true) ) remesher.project_to_surface(get_parameter(np, internal_np::projection_functor)); #ifdef CGAL_PMP_REMESHING_VERBOSE diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index d14e513d347a..19ebdda8650e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -317,6 +317,208 @@ void tangential_relaxation(const VertexRange& vertices, #endif } +template +void tangential_relaxation(const VertexRange& vertices, + TriangleMesh& tm, + const SizingFunction& sizing, + const NamedParameters& np = parameters::default_values()) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + + using parameters::get_parameter; + using parameters::choose_parameter; + + typedef typename GetGeomTraits::type GT; + GT gt = choose_parameter(get_parameter(np, internal_np::geom_traits), GT()); + + typedef typename GetVertexPointMap::type VPMap; + VPMap vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_property_map(vertex_point, tm)); + + typedef Static_boolean_property_map Default_ECM; + typedef typename internal_np::Lookup_named_param_def < + internal_np::edge_is_constrained_t, + NamedParameters, + Static_boolean_property_map // default (no constraint) + > ::type ECM; + ECM ecm = choose_parameter(get_parameter(np, internal_np::edge_is_constrained), + Default_ECM()); + + typedef typename internal_np::Lookup_named_param_def < + internal_np::vertex_is_constrained_t, + NamedParameters, + Static_boolean_property_map // default (no constraint) + > ::type VCM; + VCM vcm = choose_parameter(get_parameter(np, internal_np::vertex_is_constrained), + Static_boolean_property_map()); + + const bool relax_constraints = choose_parameter(get_parameter(np, internal_np::relax_constraints), false); + const unsigned int nb_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 1); + + typedef typename GT::Vector_3 Vector_3; + typedef typename GT::Point_3 Point_3; + + auto check_normals = [&](vertex_descriptor v) + { + bool first_run = true; + Vector_3 prev = NULL_VECTOR, first = NULL_VECTOR; + halfedge_descriptor first_h = boost::graph_traits::null_halfedge(); + for (halfedge_descriptor hd : CGAL::halfedges_around_target(v, tm)) + { + if (is_border(hd, tm)) continue; + + Vector_3 n = compute_face_normal(face(hd, tm), tm, np); + if (n == CGAL::NULL_VECTOR) //for degenerate faces + continue; + + if (first_run) + { + first_run = false; + first = n; + first_h = hd; + } + else + { + if (!get(ecm, edge(hd, tm))) + if (to_double(n * prev) <= 0) + return false; + } + prev = n; + } + + if (first_run) + return true; //vertex incident only to degenerate faces + + if (!get(ecm, edge(first_h, tm))) + if (to_double(first * prev) <= 0) + return false; + + return true; + }; + + typedef typename internal_np::Lookup_named_param_def < + internal_np::allow_move_functor_t, + NamedParameters, + internal::Allow_all_moves// default + > ::type Shall_move; + Shall_move shall_move = choose_parameter(get_parameter(np, internal_np::allow_move_functor), + internal::Allow_all_moves()); + + for (unsigned int nit = 0; nit < nb_iterations; ++nit) + { +#ifdef CGAL_PMP_TANGENTIAL_RELAXATION_VERBOSE + std::cout << "\r\t(Tangential relaxation iteration " << (nit + 1) << " / "; + std::cout << nb_iterations << ") "; + std::cout.flush(); +#endif + + typedef std::tuple VNP; + std::vector< VNP > barycenters; + auto gt_barycenter = gt.construct_barycenter_3_object(); + + // at each vertex, compute vertex normal + std::unordered_map vnormals; + compute_vertex_normals(tm, boost::make_assoc_property_map(vnormals), np); + + // at each vertex, compute barycenter of neighbors + for(vertex_descriptor v : vertices) + { + if (get(vcm, v) || CGAL::internal::is_isolated(v, tm)) + continue; + + // collect hedges to detect if we have to handle boundary cases + std::vector interior_hedges, border_halfedges; + for(halfedge_descriptor h : halfedges_around_target(v, tm)) + { + if (is_border_edge(h, tm) || get(ecm, edge(h, tm))) + border_halfedges.push_back(h); + else + interior_hedges.push_back(h); + } + + if (border_halfedges.empty()) + { + const Vector_3& vn = vnormals.at(v); + Vector_3 move = CGAL::NULL_VECTOR; + unsigned int star_size = 0; + for(halfedge_descriptor h :interior_hedges) + { + move = move + Vector_3(get(vpm, v), get(vpm, source(h, tm))); + ++star_size; + } + CGAL_assertion(star_size > 0); //isolated vertices have already been discarded + move = (1. / static_cast(star_size)) * move; + + barycenters.emplace_back(v, vn, get(vpm, v) + move); + } + else + { + if (!relax_constraints) continue; + Vector_3 vn(NULL_VECTOR); + + if (border_halfedges.size() == 2)// corners are constrained + { + vertex_descriptor ph0 = source(border_halfedges[0], tm); + vertex_descriptor ph1 = source(border_halfedges[1], tm); + double dot = to_double(Vector_3(get(vpm, v), get(vpm, ph0)) + * Vector_3(get(vpm, v), get(vpm, ph1))); + // \todo shouldn't it be an input parameter? + //check squared cosine is < 0.25 (~120 degrees) + if (0.25 < dot*dot / ( squared_distance(get(vpm,ph0), get(vpm, v)) * + squared_distance(get(vpm,ph1), get(vpm, v))) ) + barycenters.emplace_back(v, vn, + gt_barycenter(get(vpm, ph0), 0.25, get(vpm, ph1), 0.25, get(vpm, v), 0.5)); + } + } + } + + // compute moves + typedef std::pair VP_pair; + std::vector< std::pair > new_locations; + new_locations.reserve(barycenters.size()); + for(const VNP& vnp : barycenters) + { + vertex_descriptor v = std::get<0>(vnp); + const Point_3& pv = get(vpm, v); + const Vector_3& nv = std::get<1>(vnp); + const Point_3& qv = std::get<2>(vnp); //barycenter at v + + new_locations.emplace_back(v, qv + (nv * Vector_3(qv, pv)) * nv); + } + + // perform moves + for(const VP_pair& vp : new_locations) + { + const Point_3 initial_pos = get(vpm, vp.first); // make a copy on purpose + const Vector_3 move(initial_pos, vp.second); + + put(vpm, vp.first, vp.second); + + //check that no inversion happened + double frac = 1.; + while (frac > 0.03 //5 attempts maximum + && ( !check_normals(vp.first) + || !shall_move(vp.first, initial_pos, get(vpm, vp.first)))) //if a face has been inverted + { + frac = 0.5 * frac; + put(vpm, vp.first, initial_pos + frac * move);//shorten the move by 2 + } + if (frac <= 0.02) + put(vpm, vp.first, initial_pos);//cancel move + } + }//end for loop (nit == nb_iterations) + +#ifdef CGAL_PMP_TANGENTIAL_RELAXATION_VERBOSE + std::cout << "\rTangential relaxation : " + << nb_iterations << " iterations done." << std::endl; +#endif +} + /*! * \ingroup PMP_meshing_grp * applies `tangential_relaxation()` to all the vertices of `tm`. @@ -328,6 +530,14 @@ void tangential_relaxation(TriangleMesh& tm, const CGAL_NP_CLASS& np = parameter tangential_relaxation(vertices(tm), tm, np); } +template +void tangential_relaxation(TriangleMesh& tm, const SizingFunction& sizing, const CGAL_NP_CLASS& np = parameters::default_values()) +{ + tangential_relaxation(vertices(tm), tm, sizing, np); +} + } } // CGAL::Polygon_mesh_processing #endif //CGAL_POLYGON_MESH_PROCESSING_TANGENTIAL_RELAXATION_H From 5629f7a04b642c2ca2ddfcc80aa1540088ab5232 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 13 Jun 2023 00:14:23 +0200 Subject: [PATCH 0551/1398] Add first code for tangential relaxation with sizing (WIP) --- .../Adaptive_sizing_field.h | 5 ++ .../Isotropic_remeshing/remesh_impl.h | 10 ++-- .../CGAL/Polygon_mesh_processing/remesh.h | 1 + .../tangential_relaxation.h | 46 +++++++++++++++---- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 9027fa0e40f3..d49ca57c8dce 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -80,6 +80,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } public: + FT get_sizing(const vertex_descriptor& v) const { + CGAL_assertion(get(m_vertex_sizing_map, v)); + return get(m_vertex_sizing_map, v); + } + void calc_sizing_map() { #ifdef CGAL_PMP_REMESHING_VERBOSE diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 6b2fa17bb0b9..581b9870778c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -1046,8 +1046,9 @@ namespace internal { auto constrained_vertices_pmap = boost::make_function_property_map(vertex_constraint); - //todo IP temp: I have to rewrite to include original implementation - /* + //todo IP temp: I have to rewrite to include original implementation, hardcoded for now + const bool use_sizing = true; + if (!use_sizing) tangential_relaxation( vertices(mesh_), mesh_, @@ -1058,8 +1059,9 @@ namespace internal { .vertex_is_constrained_map(constrained_vertices_pmap) .relax_constraints(relax_constraints) ); - */ - tangential_relaxation( + + else + tangential_relaxation_with_sizing( vertices(mesh_), mesh_, sizing, diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 4f5162482c29..975ff7bbf9b0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -371,6 +371,7 @@ void isotropic_remeshing(const FaceRange& faces if(do_flip) remesher.flip_edges_for_valence_and_shape(); remesher.tangential_relaxation_impl(smoothing_1d, nb_laplacian, sizing); +// remesher.tangential_relaxation_impl(smoothing_1d, nb_laplacian); if ( choose_parameter(get_parameter(np, internal_np::do_project), true) ) remesher.project_to_surface(get_parameter(np, internal_np::projection_functor)); #ifdef CGAL_PMP_REMESHING_VERBOSE diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index 19ebdda8650e..d4f5dd8157a5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -321,7 +321,7 @@ template -void tangential_relaxation(const VertexRange& vertices, +void tangential_relaxation_with_sizing(const VertexRange& vertices, TriangleMesh& tm, const SizingFunction& sizing, const NamedParameters& np = parameters::default_values()) @@ -363,6 +363,12 @@ void tangential_relaxation(const VertexRange& vertices, typedef typename GT::Vector_3 Vector_3; typedef typename GT::Point_3 Point_3; + //todo ip: alt calc + typename GT::Construct_vector_3 vector = gt.construct_vector_3_object(); + typename GT::Compute_scalar_product_3 scalar_product = gt.compute_scalar_product_3_object(); + typename GT::Compute_squared_length_3 squared_length = gt.compute_squared_length_3_object(); + typename GT::Construct_cross_product_vector_3 cross_product = gt.construct_cross_product_vector_3_object(); + auto check_normals = [&](vertex_descriptor v) { bool first_run = true; @@ -420,12 +426,15 @@ void tangential_relaxation(const VertexRange& vertices, typedef std::tuple VNP; std::vector< VNP > barycenters; auto gt_barycenter = gt.construct_barycenter_3_object(); + auto gt_centroid = gt.construct_centroid_3_object(); + auto gt_area = gt.compute_area_3_object(); // at each vertex, compute vertex normal std::unordered_map vnormals; compute_vertex_normals(tm, boost::make_assoc_property_map(vnormals), np); - // at each vertex, compute barycenter of neighbors + // at each vertex, compute centroids of neighbouring faces weighted by + // area and sizing field for(vertex_descriptor v : vertices) { if (get(vcm, v) || CGAL::internal::is_isolated(v, tm)) @@ -441,18 +450,37 @@ void tangential_relaxation(const VertexRange& vertices, interior_hedges.push_back(h); } + //todo ip: handle border edges with sizing field if (border_halfedges.empty()) { const Vector_3& vn = vnormals.at(v); Vector_3 move = CGAL::NULL_VECTOR; - unsigned int star_size = 0; + double weight = 0; +// unsigned int star_size = 0; for(halfedge_descriptor h :interior_hedges) { - move = move + Vector_3(get(vpm, v), get(vpm, source(h, tm))); - ++star_size; + // calculate weight + // need v0, v1 and v2 + const vertex_descriptor v1 = target(next(h, tm), tm); + const vertex_descriptor v2 = source(h, tm); + + //todo ip- alt calc + const Vector_3 vec0 = vector(get(vpm, v), get(vpm, v1)); + const Vector_3 vec1 = vector(get(vpm, v), get(vpm, v2)); + const double sqarea = squared_length(cross_product(vec0, vec1)); + const double face_weight = CGAL::approximate_sqrt(sqarea) + / pow(1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2)), 2); + + //todo ip- paper implementation + // const double tri_area = gt_area(get(vpm, v), get(vpm, v1), get(vpm, v2)); + // const double face_weight = tri_area + // / (1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2))); + weight += face_weight; + + const Point_3 centroid = gt_centroid(get(vpm, v), get(vpm, v1), get(vpm, v2)); + move = move + Vector_3(get(vpm, v), centroid) * face_weight; } - CGAL_assertion(star_size > 0); //isolated vertices have already been discarded - move = (1. / static_cast(star_size)) * move; + move = move / weight; //todo ip: what if weight ends up being close to 0? barycenters.emplace_back(v, vn, get(vpm, v) + move); } @@ -533,9 +561,9 @@ void tangential_relaxation(TriangleMesh& tm, const CGAL_NP_CLASS& np = parameter template -void tangential_relaxation(TriangleMesh& tm, const SizingFunction& sizing, const CGAL_NP_CLASS& np = parameters::default_values()) +void tangential_relaxation_with_sizing(TriangleMesh& tm, const SizingFunction& sizing, const CGAL_NP_CLASS& np = parameters::default_values()) { - tangential_relaxation(vertices(tm), tm, sizing, np); + tangential_relaxation_with_sizing(vertices(tm), tm, sizing, np); } } } // CGAL::Polygon_mesh_processing From cb779038f68d5622e564d8ba6dad5bb4a71e1b1d Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 13 Jun 2023 10:40:33 +0200 Subject: [PATCH 0552/1398] refs are not needed here Co-authored-by: Sebastien Loriot --- .../Adaptive_sizing_field.h | 18 +++++++++--------- .../Isotropic_remeshing/Sizing_field.h | 10 +++++----- .../Isotropic_remeshing/Uniform_sizing_field.h | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index d49ca57c8dce..7c86e1420499 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -66,8 +66,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } private: - FT sqlength(const vertex_descriptor& va, - const vertex_descriptor& vb) const + FT sqlength(const vertex_descriptor va, + const vertex_descriptor vb) const { typename boost::property_map::const_type vpmap = get(CGAL::vertex_point, m_pmesh); @@ -80,7 +80,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } public: - FT get_sizing(const vertex_descriptor& v) const { + FT get_sizing(const vertex_descriptor v) const { CGAL_assertion(get(m_vertex_sizing_map, v)); return get(m_vertex_sizing_map, v); } @@ -140,7 +140,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field #endif } - boost::optional is_too_long(const halfedge_descriptor& h) const + boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), @@ -153,8 +153,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_long(const vertex_descriptor& va, - const vertex_descriptor& vb) const + boost::optional is_too_long(const vertex_descriptor va, + const vertex_descriptor vb) const { const FT sqlen = sqlength(va, vb); FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, va), @@ -167,7 +167,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_short(const halfedge_descriptor& h) const + boost::optional is_too_short(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), @@ -180,7 +180,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor& h) const + virtual Point_3 split_placement(const halfedge_descriptor h) const { typename boost::property_map::const_type vpmap = get(CGAL::vertex_point, m_pmesh); @@ -188,7 +188,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } - void update_sizing_map(const vertex_descriptor& v) + void update_sizing_map(const vertex_descriptor v) { // calculating it as the average of two vertices on other ends // of halfedges as updating is done during an edge split diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index 7f1a8a2abbea..359a9fc6b562 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -39,11 +39,11 @@ class Sizing_field typedef typename K::FT FT; public: - virtual boost::optional is_too_long(const halfedge_descriptor& h) const = 0; - virtual boost::optional is_too_long(const vertex_descriptor& va, - const vertex_descriptor& vb) const = 0; - virtual boost::optional is_too_short(const halfedge_descriptor& h) const = 0; - virtual Point_3 split_placement(const halfedge_descriptor& h) const = 0; + virtual boost::optional is_too_long(const halfedge_descriptor h) const = 0; + virtual boost::optional is_too_long(const vertex_descriptor va, + const vertex_descriptor vb) const = 0; + virtual boost::optional is_too_short(const halfedge_descriptor h) const = 0; + virtual Point_3 split_placement(const halfedge_descriptor h) const = 0; }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index ce523b30a8a9..cc229583b384 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -42,8 +42,8 @@ class Uniform_sizing_field : public CGAL::Sizing_field {} private: - FT sqlength(const vertex_descriptor& va, - const vertex_descriptor& vb) const + FT sqlength(const vertex_descriptor va, + const vertex_descriptor vb) const { typename boost::property_map::const_type vpmap = get(CGAL::vertex_point, m_pmesh); @@ -60,7 +60,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field void calc_sizing_map() const {} void update_sizing_map(const vertex_descriptor& vnew) const {} - boost::optional is_too_long(const halfedge_descriptor& h) const + boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); if(sqlen > m_sq_long) @@ -69,8 +69,8 @@ class Uniform_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_long(const vertex_descriptor& va, - const vertex_descriptor& vb) const + boost::optional is_too_long(const vertex_descriptor va, + const vertex_descriptor vb) const { const FT sqlen = sqlength(va, vb); if (sqlen > m_sq_long) @@ -79,7 +79,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_short(const halfedge_descriptor& h) const + boost::optional is_too_short(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); if (sqlen < m_sq_long) @@ -88,7 +88,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor& h) const + virtual Point_3 split_placement(const halfedge_descriptor h) const { typename boost::property_map::const_type vpmap = get(CGAL::vertex_point, m_pmesh); From ace36a2bb69388bfcab202e08dd0bd99f79aac8d Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 20 Jun 2023 18:08:20 +0200 Subject: [PATCH 0553/1398] Make tangential relaxation work with both uniform and adaptive sizing field --- .../Uniform_sizing_field.h | 1 + .../Isotropic_remeshing/remesh_impl.h | 53 ++++++++++--------- .../CGAL/Polygon_mesh_processing/remesh.h | 25 +-------- .../tangential_relaxation.h | 24 +++++---- 4 files changed, 43 insertions(+), 60 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index cc229583b384..8fd4bf2334c1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -59,6 +59,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field //todo ip: rewrite to remove this? void calc_sizing_map() const {} void update_sizing_map(const vertex_descriptor& vnew) const {} + double get_sizing(vertex_descriptor v) const {return 1.;} boost::optional is_too_long(const halfedge_descriptor h) const { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 581b9870778c..76e285176346 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -75,7 +75,11 @@ #endif namespace CGAL { + namespace Polygon_mesh_processing { + +template class Uniform_sizing_field; + namespace internal { enum Halfedge_status { @@ -1012,7 +1016,7 @@ namespace internal { // "applies an iterative smoothing filter to the mesh. // The vertex movement has to be constrained to the vertex tangent plane [...] // smoothing algorithm with uniform Laplacian weights" - template + template void tangential_relaxation_impl(const bool relax_constraints/*1d smoothing*/ , const unsigned int nb_iterations , const SizingFunction& sizing) @@ -1046,32 +1050,29 @@ namespace internal { auto constrained_vertices_pmap = boost::make_function_property_map(vertex_constraint); - //todo IP temp: I have to rewrite to include original implementation, hardcoded for now - const bool use_sizing = true; - if (!use_sizing) - tangential_relaxation( - vertices(mesh_), - mesh_, - CGAL::parameters::number_of_iterations(nb_iterations) - .vertex_point_map(vpmap_) - .geom_traits(gt_) - .edge_is_constrained_map(constrained_edges_pmap) - .vertex_is_constrained_map(constrained_vertices_pmap) - .relax_constraints(relax_constraints) - ); - + if (std::is_same>::value) + tangential_relaxation( + vertices(mesh_), + mesh_, + CGAL::parameters::number_of_iterations(nb_iterations) + .vertex_point_map(vpmap_) + .geom_traits(gt_) + .edge_is_constrained_map(constrained_edges_pmap) + .vertex_is_constrained_map(constrained_vertices_pmap) + .relax_constraints(relax_constraints) + ); else - tangential_relaxation_with_sizing( - vertices(mesh_), - mesh_, - sizing, - CGAL::parameters::number_of_iterations(nb_iterations) - .vertex_point_map(vpmap_) - .geom_traits(gt_) - .edge_is_constrained_map(constrained_edges_pmap) - .vertex_is_constrained_map(constrained_vertices_pmap) - .relax_constraints(relax_constraints) - ); + tangential_relaxation_with_sizing( + vertices(mesh_), + mesh_, + sizing, + CGAL::parameters::number_of_iterations(nb_iterations) + .vertex_point_map(vpmap_) + .geom_traits(gt_) + .edge_is_constrained_map(constrained_edges_pmap) + .vertex_is_constrained_map(constrained_vertices_pmap) + .relax_constraints(relax_constraints) + ); CGAL_assertion(!input_mesh_is_valid_ || is_valid_polygon_mesh(mesh_)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 975ff7bbf9b0..787fe54b9930 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -220,27 +220,6 @@ void isotropic_remeshing(const FaceRange& faces np); } -//todo ip: should I have the overload here? -/* -template -void isotropic_remeshing(const FaceRange& faces - , const double& tol - , const std::pair& edge_len_min_max - , PolygonMesh& pmesh - , const NamedParameters& np = parameters::default_values()) -{ - typedef Adaptive_sizing_field Adaptive_sizing; - Adaptive_sizing sizing(edge_len_min_max, pmesh); - isotropic_remeshing( - faces, - sizing, - pmesh, - np); -} - */ - template +template void tangential_relaxation_with_sizing(const VertexRange& vertices, - TriangleMesh& tm, - const SizingFunction& sizing, - const NamedParameters& np = parameters::default_values()) + TriangleMesh& tm, + const SizingFunction& sizing, + const NamedParameters& np = parameters::default_values()) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -558,10 +558,12 @@ void tangential_relaxation(TriangleMesh& tm, const CGAL_NP_CLASS& np = parameter tangential_relaxation(vertices(tm), tm, np); } -template -void tangential_relaxation_with_sizing(TriangleMesh& tm, const SizingFunction& sizing, const CGAL_NP_CLASS& np = parameters::default_values()) +template +void tangential_relaxation_with_sizing(TriangleMesh& tm, + const SizingFunction& sizing, + const CGAL_NP_CLASS& np = parameters::default_values()) { tangential_relaxation_with_sizing(vertices(tm), tm, sizing, np); } From 73fd72feb9933c6c556b691e747eb32918096df0 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 21 Jun 2023 16:45:42 +0200 Subject: [PATCH 0554/1398] Add constexpr to differentiate uniform and adaptive fields --- .../Adaptive_sizing_field.h | 2 +- .../Uniform_sizing_field.h | 5 --- .../Isotropic_remeshing/remesh_impl.h | 33 +++++++++++++------ .../CGAL/Polygon_mesh_processing/remesh.h | 1 + 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 7c86e1420499..bbc33ee21630 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -147,7 +147,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field get(m_vertex_sizing_map, target(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); - if(sqlen > sqtarg_len) + if(sqlen > 16./9. * sqtarg_len) return sqlen; else return boost::none; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h index 8fd4bf2334c1..a36c30aa712c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h @@ -56,11 +56,6 @@ class Uniform_sizing_field : public CGAL::Sizing_field } public: - //todo ip: rewrite to remove this? - void calc_sizing_map() const {} - void update_sizing_map(const vertex_descriptor& vnew) const {} - double get_sizing(vertex_descriptor v) const {return 1.;} - boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 76e285176346..aec9ca3b5d93 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -553,7 +553,8 @@ namespace internal { halfedge_added(hnew_opp, status(opposite(he, mesh_))); //todo ip-add: already updating sizing here because of is_too_long checks below - sizing.update_sizing_map(vnew); + if constexpr (!std::is_same>::value) + sizing.update_sizing_map(vnew); //check sub-edges //if it was more than twice the "long" threshold, insert them @@ -1050,18 +1051,29 @@ namespace internal { auto constrained_vertices_pmap = boost::make_function_property_map(vertex_constraint); - if (std::is_same>::value) + if constexpr (std::is_same>::value) + { +#ifdef CGAL_PMP_REMESHING_VERBOSE + std::cout << " using tangential relaxation with weights equal to 1"; + std::cout << std::endl; +#endif tangential_relaxation( - vertices(mesh_), - mesh_, - CGAL::parameters::number_of_iterations(nb_iterations) - .vertex_point_map(vpmap_) - .geom_traits(gt_) - .edge_is_constrained_map(constrained_edges_pmap) - .vertex_is_constrained_map(constrained_vertices_pmap) - .relax_constraints(relax_constraints) + vertices(mesh_), + mesh_, + CGAL::parameters::number_of_iterations(nb_iterations) + .vertex_point_map(vpmap_) + .geom_traits(gt_) + .edge_is_constrained_map(constrained_edges_pmap) + .vertex_is_constrained_map(constrained_vertices_pmap) + .relax_constraints(relax_constraints) ); + } else + { +#ifdef CGAL_PMP_REMESHING_VERBOSE + std::cout << " using tangential relaxation weighted with the sizing field"; + std::cout << std::endl; +#endif tangential_relaxation_with_sizing( vertices(mesh_), mesh_, @@ -1073,6 +1085,7 @@ namespace internal { .vertex_is_constrained_map(constrained_vertices_pmap) .relax_constraints(relax_constraints) ); + } CGAL_assertion(!input_mesh_is_valid_ || is_valid_polygon_mesh(mesh_)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 787fe54b9930..e751a294445c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -334,6 +334,7 @@ void isotropic_remeshing(const FaceRange& faces t.reset(); t.start(); #endif + if constexpr (!std::is_same>::value) sizing.calc_sizing_map(); for (unsigned int i = 0; i < nb_iterations; ++i) From 0fbcb4175c40bf6561df5213e08753464daf732a Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 29 Jun 2023 19:52:25 +0200 Subject: [PATCH 0555/1398] Add UI support for adaptive remeshing in Polyhedron demo (WIP) --- .../Polyhedron/Plugins/PMP/CMakeLists.txt | 19 +- .../Plugins/PMP/Isotropic_remeshing_dialog.ui | 225 +++++++++++++----- .../PMP/Isotropic_remeshing_plugin.cpp | 56 ++++- 3 files changed, 227 insertions(+), 73 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index 6d5b6cf16d47..354e6641bd62 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -135,14 +135,19 @@ qt5_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui) polyhedron_demo_plugin(repair_polyhedron_plugin Repair_polyhedron_plugin ${repairUI_FILES} KEYWORDS PMP) target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item) -qt5_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) -polyhedron_demo_plugin(isotropic_remeshing_plugin Isotropic_remeshing_plugin - ${isotropicRemeshingUI_FILES} KEYWORDS PMP) -target_link_libraries(isotropic_remeshing_plugin PUBLIC scene_surface_mesh_item - scene_selection_item) +if(TARGET CGAL::Eigen3_support) + qt5_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) + polyhedron_demo_plugin(isotropic_remeshing_plugin Isotropic_remeshing_plugin + ${isotropicRemeshingUI_FILES} KEYWORDS PMP) + target_link_libraries(isotropic_remeshing_plugin PUBLIC scene_surface_mesh_item + scene_selection_item CGAL::Eigen3_support) + + if(TARGET CGAL::TBB_support) + target_link_libraries(isotropic_remeshing_plugin PUBLIC CGAL::TBB_support) + endif() -if(TARGET CGAL::TBB_support) - target_link_libraries(isotropic_remeshing_plugin PUBLIC CGAL::TBB_support) +else() + message(STATUS "NOTICE: Eigen 3.1 (or greater) was not found. Isotropic remeshing plugin will not be available.") endif() polyhedron_demo_plugin(distance_plugin Distance_plugin KEYWORDS PMP) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui index a35ec28d9669..540a52c1bff9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui @@ -9,8 +9,8 @@ 0 0 - 376 - 369 + 381 + 545 @@ -59,18 +59,117 @@ Isotropic remeshing - - - + + + + + -1 + + + QLayout::SetDefaultConstraint + + + 11 + + + 14 + + + + + Edge sizing + + + + + + + + 0 + 0 + + + + + 168 + 16777215 + + + + + Uniform + + + + + Adaptive + + + + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::Maximum + + + + 20 + 24 + + + + + + - Preserve duplicated edges + Error tolerance - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + 0.00 - + + + + Minimum edge length + + + + + + + + + + + 0 @@ -83,24 +182,27 @@ - - + + + + true + - - + + - Target edge length + Number of Smoothing iterations Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + Protect borders/selected edges @@ -110,17 +212,34 @@ - - + + - Number of Smoothing iterations + + + + + + + + Allow 1D smoothing along borders Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + Preserve duplicated edges + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + @@ -133,17 +252,7 @@ - - - - Allow 1D smoothing along borders - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + Number of Main iterations @@ -156,40 +265,17 @@ - - - - - - - - - + + - + Target edge length - - true + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - Qt::Vertical - - - QSizePolicy::Maximum - - - - 20 - 40 - - - - - + Qt::ImhNone @@ -205,6 +291,27 @@ + + + + Maximum edge length + + + + + + + 0.00 + + + + + + + 0.00 + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index f1b138c16728..2022de8f9b81 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -825,6 +825,9 @@ public Q_SLOTS: bool edges_only_; double target_length_; + double error_tol_; + double min_length_; + double max_length_; unsigned int nb_iter_; bool protect_; bool smooth_features_; @@ -986,6 +989,32 @@ public Q_SLOTS: } } + void on_edgeSizing_type_combo_box_changed(int index) + { + if (index == 0) + { + ui.edgeLength_label->show(); + ui.edgeLength_dspinbox->show(); + ui.errorTol_label->hide(); + ui.errorTol_edit->hide(); + ui.minEdgeLength_label->hide(); + ui.minEdgeLength_edit->hide(); + ui.maxEdgeLength_label->hide(); + ui.maxEdgeLength_edit->hide(); + } + else if (index == 1) + { + ui.edgeLength_label->hide(); + ui.edgeLength_dspinbox->hide(); + ui.errorTol_label->show(); + ui.errorTol_edit->show(); + ui.minEdgeLength_label->show(); + ui.minEdgeLength_edit->show(); + ui.maxEdgeLength_label->show(); + ui.maxEdgeLength_edit->show(); + } + } + public: void initialize_remeshing_dialog(QDialog* dialog, @@ -1004,6 +1033,8 @@ public Q_SLOTS: connect(ui.protect_checkbox, SIGNAL(clicked(bool)), this, SLOT(update_after_protect_checkbox_click())); connect(ui.splitEdgesOnly_checkbox, SIGNAL(clicked(bool)), this, SLOT(update_after_splitEdgesOnly_click())); + connect(ui.edgeSizing_type_combo_box, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_edgeSizing_type_combo_box_changed(int))); //Set default parameters Scene_interface::Bbox bbox = poly_item != nullptr ? poly_item->bbox() @@ -1025,17 +1056,29 @@ public Q_SLOTS: ui.edgeLength_dspinbox->setValue(0.05 * diago_length); - - std::ostringstream oss; - oss << "Diagonal length of the Bbox of the selection to remesh is "; - oss << diago_length << "." << std::endl; - oss << "Default is 5% of it" << std::endl; - ui.edgeLength_dspinbox->setToolTip(QString::fromStdString(oss.str())); + //todo ip - check and adjust these + ui.errorTol_edit->setValue(0.001 * diago_length); + ui.minEdgeLength_edit->setValue(0.001 * diago_length); + ui.maxEdgeLength_edit->setValue(0.5 * diago_length); + + std::string diag_general_info = "Diagonal length of the Bbox of the selection to remesh is " + + std::to_string(diago_length) + ".\n"; + std::string specific_info; + specific_info = "Default is 5% of it\n"; + ui.edgeLength_dspinbox->setToolTip(QString::fromStdString(diag_general_info + specific_info)); + specific_info = "Default is 0.1% of it\n"; + ui.errorTol_edit->setToolTip(QString::fromStdString(diag_general_info + specific_info)); + specific_info = "Default is 0.1% of it\n"; + ui.minEdgeLength_edit->setToolTip(QString::fromStdString(diag_general_info + specific_info)); + specific_info = "Default is 50% of it\n"; + ui.maxEdgeLength_edit->setToolTip(QString::fromStdString(diag_general_info + specific_info)); ui.nbIterations_spinbox->setSingleStep(1); ui.nbIterations_spinbox->setRange(1/*min*/, 1000/*max*/); ui.nbIterations_spinbox->setValue(1); + ui.edgeSizing_type_combo_box->setCurrentIndex(0); + on_edgeSizing_type_combo_box_changed(0); //todo ip otherwise it shows all remeshing variables ui.protect_checkbox->setChecked(false); ui.smooth1D_checkbox->setChecked(true); @@ -1047,7 +1090,6 @@ public Q_SLOTS: } } - private: QAction* actionIsotropicRemeshing_; Ui::Isotropic_remeshing_dialog ui; From 91216f7875062236e473e8154e7a0924bf88b86f Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 30 Jun 2023 21:15:37 +0200 Subject: [PATCH 0556/1398] Add adaptive remeshing to Polyhedorn demo, PMP plugin --- .../tangential_relaxation.h | 16 +- .../PMP/Isotropic_remeshing_plugin.cpp | 285 ++++++++++++++---- 2 files changed, 226 insertions(+), 75 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index deb21383c714..d2e955841f11 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -465,16 +465,16 @@ void tangential_relaxation_with_sizing(const VertexRange& vertices, const vertex_descriptor v2 = source(h, tm); //todo ip- alt calc - const Vector_3 vec0 = vector(get(vpm, v), get(vpm, v1)); - const Vector_3 vec1 = vector(get(vpm, v), get(vpm, v2)); - const double sqarea = squared_length(cross_product(vec0, vec1)); - const double face_weight = CGAL::approximate_sqrt(sqarea) - / pow(1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2)), 2); +// const Vector_3 vec0 = vector(get(vpm, v), get(vpm, v1)); +// const Vector_3 vec1 = vector(get(vpm, v), get(vpm, v2)); +// const double sqarea = squared_length(cross_product(vec0, vec1)); +// const double face_weight = CGAL::approximate_sqrt(sqarea) +// / pow(1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2)), 2); //todo ip- paper implementation - // const double tri_area = gt_area(get(vpm, v), get(vpm, v1), get(vpm, v2)); - // const double face_weight = tri_area - // / (1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2))); + const double tri_area = gt_area(get(vpm, v), get(vpm, v1), get(vpm, v2)); + const double face_weight = tri_area + / (1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2))); weight += face_weight; const Point_3 centroid = gt_centroid(get(vpm, v), get(vpm, v1), get(vpm, v2)); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 2022de8f9b81..813434a4c6ca 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -358,9 +358,13 @@ public Q_SLOTS: return; } + int edge_sizing_type = ui.edgeSizing_type_combo_box->currentIndex(); bool edges_only = ui.splitEdgesOnly_checkbox->isChecked(); bool preserve_duplicates = ui.preserveDuplicates_checkbox->isChecked(); double target_length = ui.edgeLength_dspinbox->value(); + double error_tol = ui.errorTol_edit->value(); + double min_length = ui.minEdgeLength_edit->value(); + double max_length = ui.maxEdgeLength_edit->value(); unsigned int nb_iter = ui.nbIterations_spinbox->value(); unsigned int nb_smooth = ui.nbSmoothing_spinbox->value(); bool protect = ui.protect_checkbox->isChecked(); @@ -457,28 +461,60 @@ public Q_SLOTS: } } - if (fpmap_valid) - CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) - , target_length - , *selection_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter) - .protect_constraints(protect) - .edge_is_constrained_map(selection_item->constrained_edges_pmap()) - .relax_constraints(smooth_features) - .number_of_relaxation_steps(nb_smooth) - .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) - .face_patch_map(fpmap)); - else - CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) - , target_length - , *selection_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter) - .protect_constraints(protect) - .edge_is_constrained_map(selection_item->constrained_edges_pmap()) - .relax_constraints(smooth_features) - .number_of_relaxation_steps(nb_smooth) - .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) - ); + if (edge_sizing_type == 0) + { + if (fpmap_valid) + CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) + , target_length + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + .face_patch_map(fpmap)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) + , target_length + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + ); + } + else if (edge_sizing_type == 1) + { + std::pair edge_min_max{min_length, max_length}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + , edge_min_max + , *selection_item->polyhedron()); + if (fpmap_valid) + CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) + , adaptive_sizing_field + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + .face_patch_map(fpmap)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) + , adaptive_sizing_field + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + ); + } } else //selected_facets not empty { @@ -507,27 +543,60 @@ public Q_SLOTS: } } - if (fpmap_valid) - CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets - , target_length - , *selection_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter) - .protect_constraints(protect) - .edge_is_constrained_map(selection_item->constrained_edges_pmap()) - .relax_constraints(smooth_features) - .number_of_relaxation_steps(nb_smooth) - .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) - .face_patch_map(fpmap)); - else - CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets - , target_length - , *selection_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter) - .protect_constraints(protect) - .edge_is_constrained_map(selection_item->constrained_edges_pmap()) - .relax_constraints(smooth_features) - .number_of_relaxation_steps(nb_smooth) - .vertex_is_constrained_map(selection_item->constrained_vertices_pmap())); + if (edge_sizing_type == 0) + { + if (fpmap_valid) + CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets + , target_length + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + .face_patch_map(fpmap)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets + , target_length + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + ); + } + else if (edge_sizing_type == 1) + { + std::pair edge_min_max{min_length, max_length}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + , edge_min_max + , *selection_item->polyhedron()); + if (fpmap_valid) + CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets + , adaptive_sizing_field + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + .face_patch_map(fpmap)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets + , adaptive_sizing_field + , *selection_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .edge_is_constrained_map(selection_item->constrained_edges_pmap()) + .relax_constraints(smooth_features) + .number_of_relaxation_steps(nb_smooth) + .vertex_is_constrained_map(selection_item->constrained_vertices_pmap()) + ); + } } } @@ -634,10 +703,40 @@ public Q_SLOTS: } } - if (fpmap_valid) + if (edge_sizing_type == 0) + { + if (fpmap_valid) + CGAL::Polygon_mesh_processing::isotropic_remeshing( + faces(*poly_item->polyhedron()) + , target_length + , *poly_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .number_of_relaxation_steps(nb_smooth) + .edge_is_constrained_map(ecm) + .relax_constraints(smooth_features) + .face_patch_map(fpmap)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing( + faces(*poly_item->polyhedron()) + , target_length + , *poly_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .number_of_relaxation_steps(nb_smooth) + .edge_is_constrained_map(ecm) + .relax_constraints(smooth_features)); + } + else if (edge_sizing_type == 1) + { + std::pair edge_min_max{min_length, max_length}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + , edge_min_max + , *poly_item->polyhedron()); + if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing( faces(*poly_item->polyhedron()) - , target_length + , adaptive_sizing_field , *poly_item->polyhedron() , CGAL::parameters::number_of_iterations(nb_iter) .protect_constraints(protect) @@ -645,16 +744,17 @@ public Q_SLOTS: .edge_is_constrained_map(ecm) .relax_constraints(smooth_features) .face_patch_map(fpmap)); - else - CGAL::Polygon_mesh_processing::isotropic_remeshing( - faces(*poly_item->polyhedron()) - , target_length - , *poly_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter) - .protect_constraints(protect) - .number_of_relaxation_steps(nb_smooth) - .edge_is_constrained_map(ecm) - .relax_constraints(smooth_features)); + else + CGAL::Polygon_mesh_processing::isotropic_remeshing( + faces(*poly_item->polyhedron()) + , adaptive_sizing_field + , *poly_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter) + .protect_constraints(protect) + .number_of_relaxation_steps(nb_smooth) + .edge_is_constrained_map(ecm) + .relax_constraints(smooth_features)); + } //recollect sharp edges for(edge_descriptor e : edges(pmesh)) @@ -687,7 +787,11 @@ public Q_SLOTS: { // Remeshing parameters bool edges_only = false, preserve_duplicates = false; + int edge_sizing_type = 0; double target_length = 0.; + double error_tol = 0.; + double min_length = 0.; + double max_length = 0.; unsigned int nb_iter = 1; bool protect = false; bool smooth_features = true; @@ -723,7 +827,11 @@ public Q_SLOTS: edges_only = ui.splitEdgesOnly_checkbox->isChecked(); preserve_duplicates = ui.preserveDuplicates_checkbox->isChecked(); + edge_sizing_type = ui.edgeSizing_type_combo_box->currentIndex(); target_length = ui.edgeLength_dspinbox->value(); + error_tol = ui.errorTol_edit->value(); + min_length = ui.minEdgeLength_edit->value(); + max_length = ui.maxEdgeLength_edit->value(); nb_iter = ui.nbIterations_spinbox->value(); protect = ui.protect_checkbox->isChecked(); smooth_features = ui.smooth1D_checkbox->isChecked(); @@ -785,8 +893,8 @@ public Q_SLOTS: #else - Remesh_polyhedron_item remesher(edges_only, - target_length, nb_iter, protect, smooth_features); + Remesh_polyhedron_item remesher(edges_only, edge_sizing_type, + target_length, error_tol, min_length, max_length, nb_iter, protect, smooth_features); for(Scene_facegraph_item* poly_item : selection) { QElapsedTimer time; @@ -823,6 +931,7 @@ public Q_SLOTS: typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef boost::graph_traits::face_descriptor face_descriptor; + int edge_sizing_type_; bool edges_only_; double target_length_; double error_tol_; @@ -859,15 +968,34 @@ public Q_SLOTS: std::cout << "Isotropic remeshing of " << poly_item->name().toStdString() << " started..." << std::endl; Scene_polyhedron_selection_item::Is_constrained_map ecm(&edges_to_protect); - CGAL::Polygon_mesh_processing::isotropic_remeshing( - faces(*poly_item->polyhedron()) - , target_length_ - , *poly_item->polyhedron() - , CGAL::parameters::number_of_iterations(nb_iter_) - .protect_constraints(protect_) - .edge_is_constrained_map(ecm) - .face_patch_map(get(CGAL::face_patch_id_t(), *poly_item->polyhedron())) - .relax_constraints(smooth_features_)); + if (edge_sizing_type_ == 0) + { + CGAL::Polygon_mesh_processing::isotropic_remeshing( + faces(*poly_item->polyhedron()) + , target_length_ + , *poly_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter_) + .protect_constraints(protect_) + .edge_is_constrained_map(ecm) + .face_patch_map(get(CGAL::face_patch_id_t(), *poly_item->polyhedron())) + .relax_constraints(smooth_features_)); + } + else + { + std::pair edge_min_max{min_length_, max_length_}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ + , edge_min_max + , *poly_item->polyhedron()); + CGAL::Polygon_mesh_processing::isotropic_remeshing( + faces(*poly_item->polyhedron()) + , target_length_ + , *poly_item->polyhedron() + , CGAL::parameters::number_of_iterations(nb_iter_) + .protect_constraints(protect_) + .edge_is_constrained_map(ecm) + .face_patch_map(get(CGAL::face_patch_id_t(), *poly_item->polyhedron())) + .relax_constraints(smooth_features_)); + } std::cout << "Isotropic remeshing of " << poly_item->name().toStdString() << " done." << std::endl; } @@ -876,12 +1004,20 @@ public Q_SLOTS: public: Remesh_polyhedron_item( const bool edges_only, + const int edge_sizing_type, const double target_length, + const double error_tol, + const double min_length, + const double max_length, const unsigned int nb_iter, const bool protect, const bool smooth_features) : edges_only_(edges_only) + , edge_sizing_type_(edge_sizing_type) , target_length_(target_length) + , error_tol_(error_tol) + , min_length_(min_length) + , max_length_(max_length) , nb_iter_(nb_iter) , protect_(protect) , smooth_features_(smooth_features) @@ -889,7 +1025,11 @@ public Q_SLOTS: Remesh_polyhedron_item(const Remesh_polyhedron_item& remesh) : edges_only_(remesh.edges_only_) + , edge_sizing_type_(remesh.edge_sizing_type_) , target_length_(remesh.target_length_) + , error_tol_(remesh.error_tol_) + , min_length_(remesh.min_length_) + , max_length_(remesh.max_length_) , nb_iter_(remesh.nb_iter_) , protect_(remesh.protect_) , smooth_features_(remesh.smooth_features_) @@ -916,11 +1056,17 @@ public Q_SLOTS: const std::vector& selection, std::map& edges_to_protect, const bool edges_only, + const int edge_sizing_type, const double target_length, + const double error_tol, + const double min_length, + const double max_length, const unsigned int nb_iter, const bool protect, const bool smooth_features) - : RemeshFunctor(edges_only, target_length, nb_iter, protect, smooth_features) + : RemeshFunctor(edges_only, edge_sizing_type, target_length + , error_tol, min_length, max_length + , nb_iter, protect, smooth_features) , selection_(selection), edges_to_protect_(edges_to_protect) {} @@ -973,6 +1119,9 @@ public Q_SLOTS: ui.smooth1D_label->setEnabled(false); ui.smooth1D_checkbox->setEnabled(false); ui.smooth1D_checkbox->setChecked(false); + + ui.edgeSizing_type_combo_box->setCurrentIndex(0); + ui.edgeSizing_type_combo_box->setEnabled(false); } else { @@ -986,6 +1135,8 @@ public Q_SLOTS: ui.smooth1D_label->setEnabled(true); ui.smooth1D_checkbox->setEnabled(true); + + ui.edgeSizing_type_combo_box->setEnabled(true); } } From c8a96328bd48746247b5c48911e1c5090dd60b0f Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 30 Jun 2023 21:26:10 +0200 Subject: [PATCH 0557/1398] Use C++17 CTAD in example --- .../isotropic_remeshing_with_sizing_example.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index cfbf7bfd9c77..bbb86c89692c 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -27,8 +27,8 @@ int main(int argc, char* argv[]) << " (" << num_faces(mesh) << " faces)..." << std::endl; const double tol = 0.001; - const std::pair edge_min_max{0.001, 0.5}; - PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, mesh); + const std::pair edge_min_max{0.001, 0.5}; + PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, mesh); unsigned int nb_iter = 5; PMP::isotropic_remeshing( From 06db84f717720aafffdadea1c4e5286ebfe15505 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 3 Jul 2023 17:35:02 +0200 Subject: [PATCH 0558/1398] Fix sizing field calculation --- .../Adaptive_sizing_field.h | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index bbc33ee21630..4a343d5a22ff 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -58,8 +58,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field , const std::pair& edge_len_min_max , PolygonMesh& pmesh) : tol(tol) - , m_sq_short(CGAL::square(edge_len_min_max.first)) - , m_sq_long( CGAL::square(edge_len_min_max.second)) + , m_short(edge_len_min_max.first) + , m_long(edge_len_min_max.second) , m_pmesh(pmesh) { m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); @@ -111,23 +111,23 @@ class Adaptive_sizing_field : public CGAL::Sizing_field // const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); const FT max_absolute_curv = CGAL::max(CGAL::abs(vertex_curv.max_curvature), CGAL::abs(vertex_curv.min_curvature)); const FT vertex_size_sq = 6 * tol / max_absolute_curv - 3 * CGAL::square(tol); - if (vertex_size_sq > m_sq_long) + if (vertex_size_sq > CGAL::square(m_long)) { - put(m_vertex_sizing_map, v, m_sq_long); + put(m_vertex_sizing_map, v, m_long); #ifdef CGAL_PMP_REMESHING_VERBOSE ++oversize; #endif } - else if (vertex_size_sq < m_sq_short) + else if (vertex_size_sq < CGAL::square(m_short)) { - put(m_vertex_sizing_map, v, m_sq_short); + put(m_vertex_sizing_map, v, m_short); #ifdef CGAL_PMP_REMESHING_VERBOSE ++undersize; #endif } else { - put(m_vertex_sizing_map, v, vertex_size_sq); + put(m_vertex_sizing_map, v, CGAL::approximate_sqrt(vertex_size_sq)); #ifdef CGAL_PMP_REMESHING_VERBOSE ++insize; #endif @@ -143,11 +143,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh))); + FT sqtarg_len = CGAL::square(4./3. * CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh)))); CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); - if(sqlen > 16./9. * sqtarg_len) + if(sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -157,11 +157,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field const vertex_descriptor vb) const { const FT sqlen = sqlength(va, vb); - FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, va), - get(m_vertex_sizing_map, vb)); + FT sqtarg_len = CGAL::square(4./3. * CGAL::min(get(m_vertex_sizing_map, va), + get(m_vertex_sizing_map, vb))); CGAL_assertion(get(m_vertex_sizing_map, va)); CGAL_assertion(get(m_vertex_sizing_map, vb)); - if (sqlen > 16./9. * sqtarg_len) + if (sqlen > sqtarg_len) return sqlen; else return boost::none; @@ -170,11 +170,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field boost::optional is_too_short(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); - FT sqtarg_len = CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh))); + FT sqtarg_len = CGAL::square(4./5. * CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), + get(m_vertex_sizing_map, target(h, m_pmesh)))); CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); - if (sqlen < 16./25. * sqtarg_len) + if (sqlen < sqtarg_len) return sqlen; else return boost::none; @@ -192,23 +192,23 @@ class Adaptive_sizing_field : public CGAL::Sizing_field { // calculating it as the average of two vertices on other ends // of halfedges as updating is done during an edge split - FT vertex_size_sq = 0; + FT vertex_size = 0; CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh).size() == 2); for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, m_pmesh)) { - vertex_size_sq += get(m_vertex_sizing_map, source(ha, m_pmesh)); + vertex_size += get(m_vertex_sizing_map, source(ha, m_pmesh)); } - vertex_size_sq /= CGAL::halfedges_around_target(v, m_pmesh).size(); + vertex_size /= CGAL::halfedges_around_target(v, m_pmesh).size(); - put(m_vertex_sizing_map, v, vertex_size_sq); + put(m_vertex_sizing_map, v, vertex_size); } //todo ip: is_protected_constraint_too_long() from PR private: const FT tol; - const FT m_sq_short; - const FT m_sq_long; + const FT m_short; + const FT m_long; PolygonMesh& m_pmesh; VertexSizingMap m_vertex_sizing_map; }; From 677bb04ee8c99035f4bc2f6dc40db9182fdd8e1a Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 5 Jul 2023 11:34:14 +0200 Subject: [PATCH 0559/1398] (WIP) figuring out FaceRange curvature calculation --- .../Adaptive_sizing_field.h | 70 ++++++++++--------- .../CGAL/Polygon_mesh_processing/remesh.h | 3 +- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 4a343d5a22ff..3cec50bdd17a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -37,33 +37,28 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename Base::Point_3 Point_3; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; + //todo ip: send this over to Sizing_field to be consistent + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; typedef typename boost::property_map::type VertexSizingMap; + Vertex_property_tag>::type Vertex_sizing_map; - //todo ip: set a property map that can calculate curvature in one go. I think I'm generating constant maps (without put) - // try 1 typedef Principal_curvatures_and_directions Principal_curvatures; -// typedef Constant_property_map Vertex_curvature_map; - - // try 2 - typedef Constant_property_map> Default_principal_map; - typedef typename internal_np::Lookup_named_param_def::type - Vertex_curvature_map; + typedef typename CGAL::dynamic_vertex_property_t Vertex_curvature_tag; + typedef typename boost::property_map, + Vertex_curvature_tag>::type Vertex_curvature_map; Adaptive_sizing_field(const double tol , const std::pair& edge_len_min_max , PolygonMesh& pmesh) - : tol(tol) - , m_short(edge_len_min_max.first) - , m_long(edge_len_min_max.second) - , m_pmesh(pmesh) - { - m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); - } + : tol(tol) + , m_short(edge_len_min_max.first) + , m_long(edge_len_min_max.second) + , m_pmesh(pmesh) + { + m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); + } private: FT sqlength(const vertex_descriptor va, @@ -85,7 +80,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return get(m_vertex_sizing_map, v); } - void calc_sizing_map() + template + void calc_sizing_map(const FaceRange& faces) { #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; @@ -94,22 +90,32 @@ class Adaptive_sizing_field : public CGAL::Sizing_field std::cout << "Calculating sizing field..." << std::endl; #endif - //todo ip: how to make this work? -// Vertex_curvature_map vertex_curvature_map; + ////// IP: How to sort this out? + ///// FaceRange->expand->Face_filtered_graph->use ffg onwards +// CGAL::make_boolean_property_map(faces); // IP: this does not compile + std::vector selection; + auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); + for (face_descriptor f : faces) + put(is_selected, f, false); + + CGAL::expand_face_selection(selection, m_pmesh, 1, is_selected, std::back_inserter(selection)); + // IP: expand_face_selection is not happy with ffg either + + CGAL::Face_filtered_graph ffg(m_pmesh, selection); + /////// + + Vertex_curvature_map vertex_curvature_map; + vertex_curvature_map = get(Vertex_curvature_tag(), ffg); - //todo ip: temp workaround - auto vertex_curvature_map = - m_pmesh.template add_property_map>("v:curvature_map").first; - interpolated_corrected_principal_curvatures_and_directions(m_pmesh - , vertex_curvature_map); + interpolated_corrected_principal_curvatures_and_directions(ffg + , vertex_curvature_map); - // calculate square vertex sizing field (L(x_i))^2 from curvature field - for(vertex_descriptor v : vertices(m_pmesh)) + // calculate vertex sizing field L(x_i) from curvature field + for(vertex_descriptor v : vertices(ffg)) { auto vertex_curv = get(vertex_curvature_map, v); - //todo ip: alt solution - calculate curvature per vertex -// const Principal_curvatures vertex_curv = interpolated_corrected_principal_curvatures_and_directions_one_vertex(m_pmesh, v); - const FT max_absolute_curv = CGAL::max(CGAL::abs(vertex_curv.max_curvature), CGAL::abs(vertex_curv.min_curvature)); + const FT max_absolute_curv = CGAL::max(CGAL::abs(vertex_curv.max_curvature) + , CGAL::abs(vertex_curv.min_curvature)); const FT vertex_size_sq = 6 * tol / max_absolute_curv - 3 * CGAL::square(tol); if (vertex_size_sq > CGAL::square(m_long)) { @@ -210,7 +216,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field const FT m_short; const FT m_long; PolygonMesh& m_pmesh; - VertexSizingMap m_vertex_sizing_map; + Vertex_sizing_map m_vertex_sizing_map; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index e751a294445c..0ea55b8bb59b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -334,8 +334,9 @@ void isotropic_remeshing(const FaceRange& faces t.reset(); t.start(); #endif + //todo ip: move calc_sizing_map to the sizing function constructor if constexpr (!std::is_same>::value) - sizing.calc_sizing_map(); + sizing.calc_sizing_map(faces); for (unsigned int i = 0; i < nb_iterations; ++i) { From 63e31805175af4407b7776ed0dcfcbfa66b7b484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 5 Jul 2023 13:10:28 +0200 Subject: [PATCH 0560/1398] use vector option for selection --- .../Isotropic_remeshing/Adaptive_sizing_field.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 3cec50bdd17a..91524857764d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -81,7 +81,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } template - void calc_sizing_map(const FaceRange& faces) + void calc_sizing_map(const FaceRange& faces_) { #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; @@ -90,16 +90,12 @@ class Adaptive_sizing_field : public CGAL::Sizing_field std::cout << "Calculating sizing field..." << std::endl; #endif - ////// IP: How to sort this out? ///// FaceRange->expand->Face_filtered_graph->use ffg onwards -// CGAL::make_boolean_property_map(faces); // IP: this does not compile - std::vector selection; + std::vector selection(faces_.begin(), faces_.end()); auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); - for (face_descriptor f : faces) + for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); - CGAL::expand_face_selection(selection, m_pmesh, 1, is_selected, std::back_inserter(selection)); - // IP: expand_face_selection is not happy with ffg either CGAL::Face_filtered_graph ffg(m_pmesh, selection); /////// From 4a5283b22e5ec0b0dcfd4f085d1087ee104cd527 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 5 Jul 2023 20:29:59 +0200 Subject: [PATCH 0561/1398] Change selection option to set --- .../Adaptive_sizing_field.h | 23 +++++++------------ .../Isotropic_remeshing/Sizing_field.h | 1 + 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 91524857764d..450bb4c1ea4d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -35,10 +35,9 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename Base::K K; typedef typename Base::FT FT; typedef typename Base::Point_3 Point_3; + typedef typename Base::face_descriptor face_descriptor; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; - //todo ip: send this over to Sizing_field to be consistent - typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; typedef typename boost::property_map } template - void calc_sizing_map(const FaceRange& faces_) + void calc_sizing_map(const FaceRange& face_range) { #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; @@ -90,22 +89,16 @@ class Adaptive_sizing_field : public CGAL::Sizing_field std::cout << "Calculating sizing field..." << std::endl; #endif - ///// FaceRange->expand->Face_filtered_graph->use ffg onwards - std::vector selection(faces_.begin(), faces_.end()); - auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); - for (face_descriptor f : faces(m_pmesh)) - put(is_selected, f, false); - CGAL::expand_face_selection(selection, m_pmesh, 1, is_selected, std::back_inserter(selection)); - + // expand face selection for curvature calculation + std::set selection(face_range.begin(), face_range.end()); + CGAL::expand_face_selection(selection, m_pmesh, 1 + , make_boolean_property_map(selection), Emptyset_iterator()); CGAL::Face_filtered_graph ffg(m_pmesh, selection); - /////// - - Vertex_curvature_map vertex_curvature_map; - vertex_curvature_map = get(Vertex_curvature_tag(), ffg); + // calculate curvature + Vertex_curvature_map vertex_curvature_map = get(Vertex_curvature_tag(), ffg); interpolated_corrected_principal_curvatures_and_directions(ffg , vertex_curvature_map); - // calculate vertex sizing field L(x_i) from curvature field for(vertex_descriptor v : vertices(ffg)) { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index 359a9fc6b562..3640e14c092d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -33,6 +33,7 @@ class Sizing_field public: typedef typename CGAL::Kernel_traits::Kernel K; + typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef Point Point_3; From a61ebb545e5076d0b291ebc9d5f6a50d64bf0516 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 6 Jul 2023 22:35:33 +0200 Subject: [PATCH 0562/1398] Change face subset back to working example with vector --- .../internal/Isotropic_remeshing/Adaptive_sizing_field.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 450bb4c1ea4d..0471f4fd3c0b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -90,16 +90,19 @@ class Adaptive_sizing_field : public CGAL::Sizing_field #endif // expand face selection for curvature calculation - std::set selection(face_range.begin(), face_range.end()); + std::vector selection(face_range.begin(), face_range.end()); + auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); + for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); + for (face_descriptor f : face_range) put(is_selected, f, true); CGAL::expand_face_selection(selection, m_pmesh, 1 - , make_boolean_property_map(selection), Emptyset_iterator()); + , is_selected, std::back_inserter(selection)); CGAL::Face_filtered_graph ffg(m_pmesh, selection); // calculate curvature Vertex_curvature_map vertex_curvature_map = get(Vertex_curvature_tag(), ffg); interpolated_corrected_principal_curvatures_and_directions(ffg , vertex_curvature_map); - // calculate vertex sizing field L(x_i) from curvature field + // calculate vertex sizing field L(x_i) from the curvature field for(vertex_descriptor v : vertices(ffg)) { auto vertex_curv = get(vertex_curvature_map, v); From 99661dfd73bd7c25d1f21cef339532830c1e8cd0 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 7 Jul 2023 18:33:03 +0200 Subject: [PATCH 0563/1398] Choose betwen curvature calc for selection and whole mesh --- .../Adaptive_sizing_field.h | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 0471f4fd3c0b..0e34893d7ef4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -81,6 +81,29 @@ class Adaptive_sizing_field : public CGAL::Sizing_field template void calc_sizing_map(const FaceRange& face_range) + { + if (face_range.size() == faces(m_pmesh).size()) + { + // calculate curvature from the whole mesh + calc_sizing_map(m_pmesh); + } + else + { + // expand face selection and calculate curvature from it + std::vector selection(face_range.begin(), face_range.end()); + auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); + for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); + for (face_descriptor f : face_range) put(is_selected, f, true); + CGAL::expand_face_selection(selection, m_pmesh, 1 + , is_selected, std::back_inserter(selection)); + CGAL::Face_filtered_graph ffg(m_pmesh, selection); + + calc_sizing_map(ffg); + } + } + + template + void calc_sizing_map(FaceGraph& face_graph) { #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; @@ -89,21 +112,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field std::cout << "Calculating sizing field..." << std::endl; #endif - // expand face selection for curvature calculation - std::vector selection(face_range.begin(), face_range.end()); - auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); - for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); - for (face_descriptor f : face_range) put(is_selected, f, true); - CGAL::expand_face_selection(selection, m_pmesh, 1 - , is_selected, std::back_inserter(selection)); - CGAL::Face_filtered_graph ffg(m_pmesh, selection); - - // calculate curvature - Vertex_curvature_map vertex_curvature_map = get(Vertex_curvature_tag(), ffg); - interpolated_corrected_principal_curvatures_and_directions(ffg + Vertex_curvature_map vertex_curvature_map = get(Vertex_curvature_tag(), face_graph); + interpolated_corrected_principal_curvatures_and_directions(face_graph , vertex_curvature_map); // calculate vertex sizing field L(x_i) from the curvature field - for(vertex_descriptor v : vertices(ffg)) + for(vertex_descriptor v : vertices(face_graph)) { auto vertex_curv = get(vertex_curvature_map, v); const FT max_absolute_curv = CGAL::max(CGAL::abs(vertex_curv.max_curvature) @@ -133,8 +146,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " done (" << insize << " from curvature, " - << oversize << " set to max, " - << undersize << " set to min)" << std::endl; + << oversize << " set to max, " + << undersize << " set to min)" << std::endl; #endif } From 573cc53e0a32147dbdd48486b9c4c9b53f6934df Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 10 Jul 2023 21:28:06 +0200 Subject: [PATCH 0564/1398] Move curvature map typedef to function --- .../Adaptive_sizing_field.h | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 0e34893d7ef4..071bc761414a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -43,21 +43,16 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename boost::property_map::type Vertex_sizing_map; - typedef Principal_curvatures_and_directions Principal_curvatures; - typedef typename CGAL::dynamic_vertex_property_t Vertex_curvature_tag; - typedef typename boost::property_map, - Vertex_curvature_tag>::type Vertex_curvature_map; - - Adaptive_sizing_field(const double tol - , const std::pair& edge_len_min_max - , PolygonMesh& pmesh) - : tol(tol) - , m_short(edge_len_min_max.first) - , m_long(edge_len_min_max.second) - , m_pmesh(pmesh) - { - m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); - } + Adaptive_sizing_field(const double tol + , const std::pair& edge_len_min_max + , PolygonMesh& pmesh) + : tol(tol) + , m_short(edge_len_min_max.first) + , m_long(edge_len_min_max.second) + , m_pmesh(pmesh) + { + m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); + } private: FT sqlength(const vertex_descriptor va, @@ -105,6 +100,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field template void calc_sizing_map(FaceGraph& face_graph) { + typedef Principal_curvatures_and_directions Principal_curvatures; + typedef typename CGAL::dynamic_vertex_property_t Vertex_curvature_tag; + typedef typename boost::property_map::type Vertex_curvature_map; + #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; int undersize = 0; @@ -145,7 +145,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } } #ifdef CGAL_PMP_REMESHING_VERBOSE - std::cout << " done (" << insize << " from curvature, " + std::cout << " done (" << insize << " from curvature, " << oversize << " set to max, " << undersize << " set to min)" << std::endl; #endif From 1c597a07cf5ad07742f1246f4a20bb05e5a8199b Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 11 Jul 2023 09:33:37 +0200 Subject: [PATCH 0565/1398] Move sizing map calculation to constructor --- ...sotropic_remeshing_with_sizing_example.cpp | 2 +- .../Adaptive_sizing_field.h | 69 ++++++++++++------- .../Isotropic_remeshing/remesh_impl.h | 2 +- .../CGAL/Polygon_mesh_processing/remesh.h | 6 -- .../PMP/Isotropic_remeshing_plugin.cpp | 4 ++ 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index bbb86c89692c..e0564d27178d 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) const double tol = 0.001; const std::pair edge_min_max{0.001, 0.5}; - PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, mesh); + PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, faces(mesh), mesh); unsigned int nb_iter = 5; PMP::isotropic_remeshing( diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index 071bc761414a..dc14ae91d119 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -43,8 +43,10 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename boost::property_map::type Vertex_sizing_map; + template Adaptive_sizing_field(const double tol , const std::pair& edge_len_min_max + , const FaceRange& face_range , PolygonMesh& pmesh) : tol(tol) , m_short(edge_len_min_max.first) @@ -52,31 +54,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field , m_pmesh(pmesh) { m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); - } - -private: - FT sqlength(const vertex_descriptor va, - const vertex_descriptor vb) const - { - typename boost::property_map::const_type - vpmap = get(CGAL::vertex_point, m_pmesh); - return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); - } - - FT sqlength(const halfedge_descriptor& h) const - { - return sqlength(target(h, m_pmesh), source(h, m_pmesh)); - } - -public: - FT get_sizing(const vertex_descriptor v) const { - CGAL_assertion(get(m_vertex_sizing_map, v)); - return get(m_vertex_sizing_map, v); - } - template - void calc_sizing_map(const FaceRange& face_range) - { if (face_range.size() == faces(m_pmesh).size()) { // calculate curvature from the whole mesh @@ -97,6 +75,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field } } +private: template void calc_sizing_map(FaceGraph& face_graph) { @@ -151,6 +130,48 @@ class Adaptive_sizing_field : public CGAL::Sizing_field #endif } + FT sqlength(const vertex_descriptor va, + const vertex_descriptor vb) const + { + typename boost::property_map::const_type + vpmap = get(CGAL::vertex_point, m_pmesh); + return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); + } + + FT sqlength(const halfedge_descriptor& h) const + { + return sqlength(target(h, m_pmesh), source(h, m_pmesh)); + } + +public: + FT get_sizing(const vertex_descriptor v) const { + CGAL_assertion(get(m_vertex_sizing_map, v)); + return get(m_vertex_sizing_map, v); + } + + template + void calc_sizing_map(const FaceRange& face_range) + { + if (face_range.size() == faces(m_pmesh).size()) + { + // calculate curvature from the whole mesh + calc_sizing_map(m_pmesh); + } + else + { + // expand face selection and calculate curvature from it + std::vector selection(face_range.begin(), face_range.end()); + auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); + for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); + for (face_descriptor f : face_range) put(is_selected, f, true); + CGAL::expand_face_selection(selection, m_pmesh, 1 + , is_selected, std::back_inserter(selection)); + CGAL::Face_filtered_graph ffg(m_pmesh, selection); + + calc_sizing_map(ffg); + } + } + boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index aec9ca3b5d93..0e772b47cb58 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -553,7 +553,7 @@ namespace internal { halfedge_added(hnew_opp, status(opposite(he, mesh_))); //todo ip-add: already updating sizing here because of is_too_long checks below - if constexpr (!std::is_same>::value) + if constexpr (!std::is_same_v>) sizing.update_sizing_map(vnew); //check sub-edges diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 0ea55b8bb59b..ec443f179e58 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -334,18 +334,12 @@ void isotropic_remeshing(const FaceRange& faces t.reset(); t.start(); #endif - //todo ip: move calc_sizing_map to the sizing function constructor - if constexpr (!std::is_same>::value) - sizing.calc_sizing_map(faces); - for (unsigned int i = 0; i < nb_iterations; ++i) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " * Iteration " << (i + 1) << " *" << std::endl; #endif -// if (i < 2) -// sizing.calc_sizing_map(); if(do_split) remesher.split_long_edges(sizing); if(do_collapse) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 813434a4c6ca..679d2518666d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -491,6 +491,7 @@ public Q_SLOTS: std::pair edge_min_max{min_length, max_length}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max + , faces(*selection_item->polyhedron()) , *selection_item->polyhedron()); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) @@ -573,6 +574,7 @@ public Q_SLOTS: std::pair edge_min_max{min_length, max_length}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max + , faces(*selection_item->polyhedron()) , *selection_item->polyhedron()); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets @@ -732,6 +734,7 @@ public Q_SLOTS: std::pair edge_min_max{min_length, max_length}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max + , faces(*poly_item->polyhedron()) , *poly_item->polyhedron()); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing( @@ -985,6 +988,7 @@ public Q_SLOTS: std::pair edge_min_max{min_length_, max_length_}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ , edge_min_max + , faces(*poly_item->polyhedron()) , *poly_item->polyhedron()); CGAL::Polygon_mesh_processing::isotropic_remeshing( faces(*poly_item->polyhedron()) From cc0c46c7ef331af28422e37de79785473ceb8052 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 11 Jul 2023 10:08:21 +0200 Subject: [PATCH 0566/1398] Fix polyhedron demo with TBB --- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 679d2518666d..86d7844949a3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -890,7 +890,11 @@ public Q_SLOTS: tbb::parallel_for( tbb::blocked_range(0, selection.size()), Remesh_polyhedron_item_for_parallel_for( - selection, edges_to_protect, edges_only, target_length, nb_iter, protect, smooth_features)); + selection, edges_to_protect, edges_only + , edge_sizing_type, target_length, error_tol + , min_length , max_length, nb_iter + , protect, smooth_features) + ); total_time = time.elapsed(); From 4b1b04eb8d3542b3846e6d0bf091b34e3fff6173 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 1 Aug 2023 11:09:28 +0200 Subject: [PATCH 0567/1398] fix compilation --- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 86d7844949a3..406c032f6feb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -489,7 +489,7 @@ public Q_SLOTS: else if (edge_sizing_type == 1) { std::pair edge_min_max{min_length, max_length}; - PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*selection_item->polyhedron()) , *selection_item->polyhedron()); @@ -572,7 +572,7 @@ public Q_SLOTS: else if (edge_sizing_type == 1) { std::pair edge_min_max{min_length, max_length}; - PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*selection_item->polyhedron()) , *selection_item->polyhedron()); @@ -732,7 +732,7 @@ public Q_SLOTS: else if (edge_sizing_type == 1) { std::pair edge_min_max{min_length, max_length}; - PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*poly_item->polyhedron()) , *poly_item->polyhedron()); @@ -990,7 +990,7 @@ public Q_SLOTS: else { std::pair edge_min_max{min_length_, max_length_}; - PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ , edge_min_max , faces(*poly_item->polyhedron()) , *poly_item->polyhedron()); From 2e04088d1f2ddbd26a9d5189a1c187259242ccbb Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 1 Aug 2023 18:22:12 +0200 Subject: [PATCH 0568/1398] cgal_create_release_with_cmake.cmake: only call Git one --- .../cgal_create_release_with_cmake.cmake | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake index de8dcfa35d41..2443c61aad54 100644 --- a/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake +++ b/Scripts/developer_scripts/cgal_create_release_with_cmake.cmake @@ -41,13 +41,8 @@ function(process_package pkg) if ("${fext}" STREQUAL ".h" OR "${fext}" STREQUAL ".hpp") file(READ "${pkg_dir}/${f}" file_content) string(REPLACE "$URL$" "$URL: ${GITHUB_PREFIX}/${pkg}/${f} $" file_content "${file_content}") - if(EXISTS ${GIT_REPO}/.git) - execute_process( - COMMAND git --git-dir=${GIT_REPO}/.git --work-tree=${GIT_REPO} log -n1 "--format=format:%h %aI %an" -- "${pkg}/${f}" - RESULT_VARIABLE RESULT_VAR - OUTPUT_VARIABLE OUT_VAR - ) - string(REPLACE "$Id$" "$Id: ${fname} ${OUT_VAR}" file_content "${file_content}") + if(GIT_HASH) + string(REPLACE "$Id$" "$Id: ${f} ${GIT_HASH} $" file_content "${file_content}") else() string(REPLACE "$Id$" "This file is from the release ${CGAL_VERSION} of CGAL" file_content "${file_content}") endif() @@ -74,6 +69,15 @@ if (NOT GIT_REPO) set(GIT_REPO ${CMAKE_BINARY_DIR}) endif() +if(EXISTS ${GIT_REPO}/.git) + execute_process( + COMMAND git --git-dir=${GIT_REPO}/.git --work-tree=${GIT_REPO} log -n1 "--format=format:%h" + RESULT_VARIABLE RESULT_VAR + OUTPUT_VARIABLE GIT_HASH + ) + string(REPLACE "$Id$" "$Id: ${fname} ${OUT_VAR}$" file_content "${file_content}") +endif() + if (NOT EXISTS ${GIT_REPO}/Installation/include/CGAL/version.h) message(FATAL_ERROR "Cannot find Installation/include/CGAL/version.h. Make sure you are at the root of a CGAL branch") endif() From 1f61a84e495f62b71570ad5962411adf4680eb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 2 Aug 2023 10:30:05 +0200 Subject: [PATCH 0569/1398] add demo plugin that support refinement of one or several items (soup or mesh) --- .../Polyhedron/Plugins/PMP/CMakeLists.txt | 6 +- .../Plugins/PMP/Repair_polyhedron_plugin.cpp | 105 +++++++++++++++++- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index 152d84952ae7..658458acaadf 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -119,7 +119,11 @@ target_link_libraries( qt5_wrap_ui( repairUI_FILES RemoveNeedlesDialog.ui SelfSnapDialog.ui) polyhedron_demo_plugin(repair_polyhedron_plugin Repair_polyhedron_plugin ${repairUI_FILES} KEYWORDS PMP) -target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item) +target_link_libraries(repair_polyhedron_plugin PUBLIC scene_points_with_normal_item scene_surface_mesh_item scene_polygon_soup_item) +if(TARGET CGAL::TBB_support) + target_link_libraries(repair_polyhedron_plugin PUBLIC CGAL::TBB_support) +endif() + qt5_wrap_ui(isotropicRemeshingUI_FILES Isotropic_remeshing_dialog.ui) polyhedron_demo_plugin(isotropic_remeshing_plugin Isotropic_remeshing_plugin diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp index 5ecc8921433e..dd4acb434272 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Repair_polyhedron_plugin.cpp @@ -1,6 +1,7 @@ #include #include "Scene_surface_mesh_item.h" +#include "Scene_polygon_soup_item.h" #include "Scene_points_with_normal_item.h" #include #include @@ -19,6 +20,8 @@ #include #include #include +#include +#include #include "ui_RemoveNeedlesDialog.h" #include "ui_SelfSnapDialog.h" @@ -52,8 +55,9 @@ class Polyhedron_demo_repair_polyhedron_plugin : actionDuplicateNMVertices = new QAction(tr("Duplicate Non-Manifold Vertices"), mw); actionExtractNMVertices = new QAction(tr("Extract Non-Manifold Vertices"), mw); actionMergeDuplicatedVerticesOnBoundaryCycles = new QAction(tr("Merge Duplicated Vertices on Boundary Cycles"), mw); - actionAutorefine = new QAction(tr("Autorefine Mesh"), mw); - actionAutorefineAndRMSelfIntersections = new QAction(tr("Autorefine and Remove Self-Intersections"), mw); + actionAutorefine = new QAction(tr("Autorefine Mesh (Deprecated)"), mw); + actionNewAutorefine = new QAction(tr("Autorefine"), mw); + actionAutorefineAndRMSelfIntersections = new QAction(tr("Autorefine and Remove Self-Intersections (Deprecated)"), mw); actionRemoveNeedlesAndCaps = new QAction(tr("Remove Needles And Caps")); actionSnapBorders = new QAction(tr("Snap Boundaries")); @@ -65,6 +69,7 @@ class Polyhedron_demo_repair_polyhedron_plugin : actionExtractNMVertices->setObjectName("actionExtractNMVertices"); actionMergeDuplicatedVerticesOnBoundaryCycles->setObjectName("actionMergeDuplicatedVerticesOnBoundaryCycles"); actionAutorefine->setObjectName("actionAutorefine"); + actionNewAutorefine->setObjectName("actionNewAutorefine"); actionAutorefineAndRMSelfIntersections->setObjectName("actionAutorefineAndRMSelfIntersections"); actionRemoveNeedlesAndCaps->setObjectName("actionRemoveNeedlesAndCaps"); actionSnapBorders->setObjectName("actionSnapBorders"); @@ -77,6 +82,7 @@ class Polyhedron_demo_repair_polyhedron_plugin : actionExtractNMVertices->setProperty("subMenuName", "Polygon Mesh Processing/Repair"); actionMergeDuplicatedVerticesOnBoundaryCycles->setProperty("subMenuName", "Polygon Mesh Processing/Repair"); actionAutorefine->setProperty("subMenuName", "Polygon Mesh Processing/Repair/Experimental"); + actionNewAutorefine->setProperty("subMenuName", "Polygon Mesh Processing/Repair"); actionAutorefineAndRMSelfIntersections->setProperty("subMenuName", "Polygon Mesh Processing/Repair/Experimental"); actionSnapBorders->setProperty("subMenuName", "Polygon Mesh Processing/Repair/Experimental"); @@ -93,16 +99,29 @@ class Polyhedron_demo_repair_polyhedron_plugin : << actionExtractNMVertices << actionMergeDuplicatedVerticesOnBoundaryCycles << actionAutorefine + << actionNewAutorefine << actionAutorefineAndRMSelfIntersections << actionRemoveNeedlesAndCaps << actionSnapBorders; } - bool applicable(QAction*) const + bool applicable(QAction* action) const { - int item_id = scene->mainSelectionIndex(); - return qobject_cast(scene->item(item_id)); + if (action!=actionNewAutorefine) + { + int item_id = scene->mainSelectionIndex(); + return qobject_cast(scene->item(item_id)); + } + for (Scene_interface::Item_id index : scene->selectionIndices()) + { + if (qobject_cast(scene->item(index))) + return true; + if (qobject_cast(scene->item(index))) + return true; + } + return false; } + template void on_actionRemoveIsolatedVertices_triggered(Scene_interface::Item_id index); template @@ -120,6 +139,8 @@ class Polyhedron_demo_repair_polyhedron_plugin : template void on_actionAutorefine_triggered(Scene_interface::Item_id index); template + void on_actionNewAutorefine_triggered(const std::vector& indices); + template void on_actionAutorefineAndRMSelfIntersections_triggered(Scene_interface::Item_id index); public Q_SLOTS: @@ -131,6 +152,7 @@ public Q_SLOTS: void on_actionExtractNMVertices_triggered(); void on_actionMergeDuplicatedVerticesOnBoundaryCycles_triggered(); void on_actionAutorefine_triggered(); + void on_actionNewAutorefine_triggered(); void on_actionAutorefineAndRMSelfIntersections_triggered(); void on_actionRemoveNeedlesAndCaps_triggered(); void on_actionSnapBorders_triggered(); @@ -144,6 +166,7 @@ public Q_SLOTS: QAction* actionExtractNMVertices; QAction* actionMergeDuplicatedVerticesOnBoundaryCycles; QAction* actionAutorefine; + QAction* actionNewAutorefine; QAction* actionAutorefineAndRMSelfIntersections; QAction* actionRemoveNeedlesAndCaps; QAction* actionSnapBorders; @@ -421,6 +444,78 @@ void Polyhedron_demo_repair_polyhedron_plugin::on_actionAutorefine_triggered() QApplication::restoreOverrideCursor(); } +template +void Polyhedron_demo_repair_polyhedron_plugin::on_actionNewAutorefine_triggered(const std::vector& indices) +{ + namespace PMP = CGAL::Polygon_mesh_processing; + Polygon_soup::Points points; + Polygon_soup::Polygons polygons; + + if (indices.size()==1) + { + if (Scene_surface_mesh_item* smi_ptr = qobject_cast(scene->item(indices[0]))) + PMP::polygon_mesh_to_polygon_soup(*smi_ptr->polyhedron(), points, polygons); + else if (Scene_polygon_soup_item* spi_ptr = qobject_cast(scene->item(indices[0]))) + { + points = spi_ptr->points(); + polygons = spi_ptr->polygons(); + } + } + else + { + for (Scene_interface::Item_id id : indices) + { + Polygon_soup::Points l_points; + Polygon_soup::Polygons l_polygons; + + if (Scene_surface_mesh_item* smi_ptr = qobject_cast(scene->item(id))) + PMP::polygon_mesh_to_polygon_soup(*smi_ptr->polyhedron(), l_points, l_polygons); + else if (Scene_polygon_soup_item* spi_ptr = qobject_cast(scene->item(id))) + { + l_points = spi_ptr->points(); + l_polygons = spi_ptr->polygons(); + } + std::size_t offset=points.size(); + points.insert(points.end(), l_points.begin(), l_points.end()); + std::size_t psize=polygons.size(); + polygons.insert(polygons.end(), l_polygons.begin(), l_polygons.end()); + for (std::size_t i=psize; iload(points, polygons); + QString name = scene->item(indices[0])->name(); + for (std::size_t k=1; kitem(indices[k])->name(); + new_item->setName(name+" autorefined"); + + scene->addItem(new_item); + new_item->invalidateOpenGLBuffers(); + Q_EMIT new_item->itemChanged(); +} + +void Polyhedron_demo_repair_polyhedron_plugin::on_actionNewAutorefine_triggered() +{ + std::vector indices; + for (Scene_interface::Item_id index : scene->selectionIndices()) + { + if (qobject_cast(scene->item(index))) + indices.push_back(index); + else if (qobject_cast(scene->item(index))) + indices.push_back(index); + } + QApplication::setOverrideCursor(Qt::WaitCursor); + on_actionNewAutorefine_triggered(indices); + QApplication::restoreOverrideCursor(); +} + template void Polyhedron_demo_repair_polyhedron_plugin::on_actionAutorefineAndRMSelfIntersections_triggered(Scene_interface::Item_id index) { From 9c63d3e57bbad4b1d0261892a826d6f92f97462e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 2 Aug 2023 17:31:13 +0200 Subject: [PATCH 0570/1398] fix warning --- .../test/Surface_mesh_approximation/vsa_border_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp index 554c50d2af65..6bafd27359f4 100644 --- a/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp +++ b/Surface_mesh_approximation/test/Surface_mesh_approximation/vsa_border_test.cpp @@ -75,7 +75,7 @@ int main(int, char*[]) std::array subdivisionRatios = { 0.10 , 2.0 , 2.0 , 10.0 , 10.0 , 10.00 }; std::array boundarySubdivisionRatios = { 0.01 , 2.0 , 0.1 , 10.0 , 1.0 , 0.01 }; - for (int i = 0; i < subdivisionRatios.size(); ++i) + for (std::size_t i = 0; i < subdivisionRatios.size(); ++i) { const auto subdivisionRatio = subdivisionRatios[i]; const auto boundarySubdivisionRatio = boundarySubdivisionRatios[i]; From 9696eca78a1c443664760d52cd94a086a7bf24f4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 2 Aug 2023 17:52:31 +0200 Subject: [PATCH 0571/1398] Update Installation/CHANGES.md Co-authored-by: Mael --- Installation/CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 0d0bc97777eb..b812b99fe815 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -17,7 +17,7 @@ Release date: October 2023 - **Breaking change**: Removed the concept `TriangleAccessor`, the template parameter `TriangleAccessor`, as well as the class `Triangle_accessor`. They were no longer used for several releases. -- Removed the class templates `Gray_image_mesh_domain_3` and `Labeled_image_mesh_domain_3` +- Removed the class templates `Gray_image_mesh_domain_3`, `Implicit_mesh_domain_3`, and `Labeled_image_mesh_domain_3` which are deprecated since CGAL-4.13. From dab63942159c96692e7b83459e4e53ba59b17592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 3 Aug 2023 12:05:40 +0200 Subject: [PATCH 0572/1398] Introduce AW3 Vb/Cb to avoid using T3_Vb/Cb_with_info_3 --- .../examples/Alpha_wrap_3/volumetric_wrap.cpp | 4 +- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 133 ++++++------------ .../internal/Alpha_wrap_AABB_geom_traits.h | 14 +- .../Alpha_wrap_triangulation_cell_base_3.h | 97 +++++++++++++ .../Alpha_wrap_triangulation_vertex_base_3.h | 71 ++++++++++ .../Alpha_wrap_3/Alpha_wrap_3_plugin.cpp | 4 +- 6 files changed, 225 insertions(+), 98 deletions(-) create mode 100644 Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h create mode 100644 Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp index 7fb4d4704207..dd63ad66711f 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -137,7 +137,7 @@ int main(int argc, char** argv) for(auto c : tr.finite_cell_handles()) { - if(c->info().is_outside) + if(c->is_outside()) c->set_subdomain_index(0); else c->set_subdomain_index(1); @@ -146,7 +146,7 @@ int main(int argc, char** argv) // of the common face on the surface boundary for(int i=0; i<4; ++i) { - if(c->neighbor(i)->info().is_outside != c->info().is_outside) + if(c->neighbor(i)->is_outside() != c->is_outside()) { c->set_surface_patch_index(i, 1); boundary_facets.emplace(c, i); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 677242e9da19..ba752a77590b 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2022 Google LLC (USA). +// Copyright (c) 2019-2023 Google LLC (USA). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -29,6 +29,8 @@ #include +#include +#include #include #include #include @@ -37,9 +39,7 @@ #include #include #include -#include #include -#include #include #include @@ -76,58 +76,11 @@ namespace CGAL { namespace Alpha_wraps_3 { namespace internal { -struct Cell_info -{ - bool is_outside = false; -}; - -enum Vertex_info -{ - DEFAULT = 0, - BBOX_VERTEX, - SEED_VERTEX -}; - -template -using Alpha_wrap_triangulation_vertex_base_3 = - CGAL::Triangulation_vertex_base_with_info_3< - Vertex_info, - GeomTraits, - CGAL::Triangulation_vertex_base_3 >; - -template -using Alpha_wrap_triangulation_cell_base_3 = - CGAL::Triangulation_cell_base_with_info_3< - Cell_info, - GeomTraits, - CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3< - GeomTraits, - CGAL::Delaunay_triangulation_cell_base_3 > >; - -template -class Cell_base_with_timestamp - : public Cb -{ - std::size_t time_stamp_; - -public: - template - Cell_base_with_timestamp(const Args&... args) : Cb(args...), time_stamp_(-1) { } +namespace { - Cell_base_with_timestamp(const Cell_base_with_timestamp& other) : Cb(other), time_stamp_(other.time_stamp_) { } +namespace AW3i = ::CGAL::Alpha_wraps_3::internal; - typedef CGAL::Tag_true Has_timestamp; - - std::size_t time_stamp() const { return time_stamp_; } - void set_time_stamp(const std::size_t& ts) { time_stamp_ = ts; } - - template - struct Rebind_TDS - { - typedef typename Cb::template Rebind_TDS::Other Cb2; - typedef Cell_base_with_timestamp Other; - }; -}; +} // unnamed namespace struct Wrapping_default_visitor { @@ -163,7 +116,7 @@ class Alpha_wrap_3 // Triangulation using Base_GT = typename Oracle::Geom_traits; - using Default_Gt = Robust_circumcenter_filtered_traits_3; + using Default_Gt = CGAL::Robust_circumcenter_filtered_traits_3; using Default_Vb = Alpha_wrap_triangulation_vertex_base_3; using Default_Cb = Alpha_wrap_triangulation_cell_base_3; @@ -447,7 +400,7 @@ class Alpha_wrap_3 #ifdef CGAL_AW3_DEBUG_INITIALIZATION std::cout << "\t" << bp << std::endl; #endif - bv->info() = BBOX_VERTEX; + bv->type() = AW3i::Vertex_type:: BBOX_VERTEX; } } @@ -562,7 +515,7 @@ class Alpha_wrap_3 // which usually happens for large alpha values. Vertex_handle seed_v = m_tr.insert(seed_p); - seed_v->info() = SEED_VERTEX; + seed_v->type() = AW3i::Vertex_type:: SEED_VERTEX; seed_vs.push_back(seed_v); // Icosahedron vertices (see also BGL::make_icosahedron()) @@ -599,7 +552,7 @@ class Alpha_wrap_3 continue; Vertex_handle ico_v = m_tr.insert(seed_neighbor_p, seed_v /*hint*/); - ico_v->info() = SEED_VERTEX; + ico_v->type() = AW3i::Vertex_type:: SEED_VERTEX; } } @@ -621,13 +574,13 @@ class Alpha_wrap_3 inc_cells.reserve(64); m_tr.incident_cells(seed_v, std::back_inserter(inc_cells)); for(Cell_handle ch : inc_cells) - ch->info().is_outside = cavity_cell_outside_tag(ch); + ch->is_outside() = cavity_cell_outside_tag(ch); } // Might as well go through the full triangulation since only seeds should have been inserted for(Cell_handle ch : m_tr.all_cell_handles()) { - if(!ch->info().is_outside) + if(!ch->is_outside()) continue; // When the algorithm starts from a manually dug hole, infinite cells are tagged "inside" @@ -656,13 +609,13 @@ class Alpha_wrap_3 { if(m_tr.is_infinite(ch)) { - ch->info().is_outside = true; + ch->is_outside() = true; const int inf_index = ch->index(m_tr.infinite_vertex()); push_facet(std::make_pair(ch, inf_index)); } else { - ch->info().is_outside = false; + ch->is_outside() = false; } } @@ -690,7 +643,7 @@ class Alpha_wrap_3 for(auto cit=m_tr.finite_cells_begin(), cend=m_tr.finite_cells_end(); cit!=cend; ++cit) { Cell_handle seed = cit; - if(seed->info().is_outside || seed->tds_data().processed()) + if(seed->is_outside() || seed->tds_data().processed()) continue; std::queue to_visit; @@ -703,7 +656,7 @@ class Alpha_wrap_3 while(!to_visit.empty()) { const Cell_handle cell = to_visit.front(); - CGAL_assertion(!cell->info().is_outside && !m_tr.is_infinite(cell)); + CGAL_assertion(!cell->is_outside() && !m_tr.is_infinite(cell)); to_visit.pop(); @@ -715,13 +668,13 @@ class Alpha_wrap_3 for(int fid=0; fid<4; ++fid) { const Cell_handle neighbor = cell->neighbor(fid); - if(neighbor->info().is_outside) + if(neighbor->is_outside()) { // There shouldn't be any artificial vertex on the inside/outside boundary // (past initialization) -// CGAL_assertion(cell->vertex((fid + 1)&3)->info() == DEFAULT); -// CGAL_assertion(cell->vertex((fid + 2)&3)->info() == DEFAULT); -// CGAL_assertion(cell->vertex((fid + 3)&3)->info() == DEFAULT); +// CGAL_assertion(cell->vertex((fid + 1)&3)->type() == AW3i::Vertex_type:: DEFAULT); +// CGAL_assertion(cell->vertex((fid + 2)&3)->type() == AW3i::Vertex_type:: DEFAULT); +// CGAL_assertion(cell->vertex((fid + 3)&3)->type() == AW3i::Vertex_type:: DEFAULT); points.push_back(m_tr.point(cell, Triangulation::vertex_triple_index(fid, 0))); points.push_back(m_tr.point(cell, Triangulation::vertex_triple_index(fid, 1))); @@ -782,13 +735,13 @@ class Alpha_wrap_3 for(auto fit=m_tr.finite_facets_begin(), fend=m_tr.finite_facets_end(); fit!=fend; ++fit) { Facet f = *fit; - if(!f.first->info().is_outside) + if(!f.first->is_outside()) f = m_tr.mirror_facet(f); const Cell_handle c = f.first; const int s = f.second; const Cell_handle nh = c->neighbor(s); - if(c->info().is_outside == nh->info().is_outside) + if(c->is_outside() == nh->is_outside()) continue; std::array ids; @@ -961,7 +914,7 @@ class Alpha_wrap_3 if(m_tr.is_infinite(nh)) return TRAVERSABLE; - if(nh->info().is_outside) + if(nh->is_outside()) { #ifdef CGAL_AW3_DEBUG_FACET_STATUS std::cout << "Neighbor already outside" << std::endl; @@ -973,7 +926,8 @@ class Alpha_wrap_3 for(int i=0; i<3; ++i) { const Vertex_handle vh = ch->vertex(Triangulation::vertex_triple_index(id, i)); - if(vh->info() == BBOX_VERTEX || vh->info() == SEED_VERTEX) + if(vh->type() == AW3i::Vertex_type:: BBOX_VERTEX || + vh->type() == AW3i::Vertex_type:: SEED_VERTEX) { #ifdef CGAL_AW3_DEBUG_FACET_STATUS std::cout << "artificial facet due to artificial vertex #" << i << std::endl; @@ -999,7 +953,7 @@ class Alpha_wrap_3 bool push_facet(const Facet& f) { - CGAL_precondition(f.first->info().is_outside); + CGAL_precondition(f.first->is_outside()); // skip if f is already in queue if(m_queue.contains_with_bounds_check(Gate(f))) @@ -1111,7 +1065,7 @@ class Alpha_wrap_3 if(m_tr.is_infinite(neighbor)) { - neighbor->info().is_outside = true; + neighbor->is_outside() = true; continue; } @@ -1159,7 +1113,7 @@ class Alpha_wrap_3 // Actual insertion of the Steiner point Vertex_handle vh = m_tr.insert(steiner_point, lt, conflict_cell, li, lj); - vh->info() = DEFAULT; + vh->type() = AW3i::Vertex_type:: DEFAULT; visitor.after_Steiner_point_insertion(*this, vh); @@ -1169,7 +1123,7 @@ class Alpha_wrap_3 for(const Cell_handle& ch : new_cells) { // std::cout << "new cell has time stamp " << ch->time_stamp() << std::endl; - ch->info().is_outside = m_tr.is_infinite(ch); + ch->is_outside() = m_tr.is_infinite(ch); } // Push all new boundary facets to the queue. @@ -1185,11 +1139,11 @@ class Alpha_wrap_3 continue; const Cell_handle nh = ch->neighbor(i); - if(nh->info().is_outside == ch->info().is_outside) // not on the boundary + if(nh->is_outside() == ch->is_outside()) // not on the boundary continue; const Facet boundary_f = std::make_pair(ch, i); - if(ch->info().is_outside) + if(ch->is_outside()) push_facet(boundary_f); else push_facet(m_tr.mirror_facet(boundary_f)); @@ -1199,7 +1153,7 @@ class Alpha_wrap_3 else { // tag neighbor as OUTSIDE - neighbor->info().is_outside = true; + neighbor->is_outside() = true; // for each finite facet of neighbor, push it to the queue for(int i=0; i<4; ++i) @@ -1214,9 +1168,9 @@ class Alpha_wrap_3 // Check that no useful facet has been ignored CGAL_postcondition_code(for(auto fit=m_tr.finite_facets_begin(), fend=m_tr.finite_facets_end(); fit!=fend; ++fit) {) - CGAL_postcondition_code( if(fit->first->info().is_outside == fit->first->neighbor(fit->second)->info().is_outside) continue;) + CGAL_postcondition_code( if(fit->first->is_outside() == fit->first->neighbor(fit->second)->is_outside()) continue;) CGAL_postcondition_code( Facet f = *fit;) - CGAL_postcondition_code( if(!fit->first->info().is_outside) f = m_tr.mirror_facet(f);) + CGAL_postcondition_code( if(!fit->first->is_outside()) f = m_tr.mirror_facet(f);) CGAL_postcondition( facet_status(f) == IRRELEVANT); CGAL_postcondition_code(}) } @@ -1243,7 +1197,7 @@ class Alpha_wrap_3 for(Cell_handle ic : inc_cells) { ic->tds_data().clear(); - if(ic->info().is_outside) + if(ic->is_outside()) outside_start = ic; else if(inside_start == Cell_handle()) inside_start = ic; @@ -1278,7 +1232,7 @@ class Alpha_wrap_3 CGAL_assertion(neigh_c->has_vertex(v)); if(neigh_c->tds_data().processed() || - neigh_c->info().is_outside != curr_c->info().is_outside) // do not cross the boundary + neigh_c->is_outside() != curr_c->is_outside()) // do not cross the boundary continue; cells_to_visit.push(neigh_c); @@ -1343,7 +1297,7 @@ class Alpha_wrap_3 for(Cell_handle c : inc_cells) { - if(!c->info().is_outside) + if(!c->is_outside()) { do_remove = false; break; @@ -1390,15 +1344,20 @@ class Alpha_wrap_3 auto has_artificial_vertex = [](Cell_handle c) -> bool { for(int i=0; i<4; ++i) - if(c->vertex(i)->info() == BBOX_VERTEX || c->vertex(i)->info() == SEED_VERTEX) + { + if(c->vertex(i)->type() == AW3i::Vertex_type:: BBOX_VERTEX || + c->vertex(i)->type() == AW3i::Vertex_type:: SEED_VERTEX) + { return true; + } + } return false; }; auto is_on_boundary = [](Cell_handle c, int i) -> bool { - return (c->info().is_outside != c->neighbor(i)->info().is_outside); + return (c->is_outside() != c->neighbor(i)->is_outside()); }; auto count_boundary_facets = [&](Cell_handle c, Vertex_handle v) -> int @@ -1492,7 +1451,7 @@ class Alpha_wrap_3 CGAL_assertion(!m_tr.is_infinite(ic)); // This is where new material is added - ic->info().is_outside = false; + ic->is_outside() = false; #ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP static int i = 0; @@ -1577,7 +1536,7 @@ class Alpha_wrap_3 int s = fit->second; Cell_handle nc = c->neighbor(s); - if(only_boundary_faces && (c->info().is_outside == nc->info().is_outside)) + if(only_boundary_faces && (c->is_outside() == nc->is_outside())) continue; std::array ids; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_geom_traits.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_geom_traits.h index 22c64e9b5e26..80a403c258e4 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_geom_traits.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_AABB_geom_traits.h @@ -36,24 +36,24 @@ struct Tetrahedron_with_outside_info using Triangle_3 = typename Kernel::Triangle_3; template - Tetrahedron_with_outside_info(const CellHandle ch, const K& k) + Tetrahedron_with_outside_info(const CellHandle c, const K& k) { typename K::Construct_bbox_3 bbox = k.construct_bbox_3_object(); typename K::Construct_tetrahedron_3 tetrahedron = k.construct_tetrahedron_3_object(); typename K::Construct_triangle_3 triangle = k.construct_triangle_3_object(); - m_tet = tetrahedron(ch->vertex(0)->point(), ch->vertex(1)->point(), - ch->vertex(2)->point(), ch->vertex(3)->point()); + m_tet = tetrahedron(c->vertex(0)->point(), c->vertex(1)->point(), + c->vertex(2)->point(), c->vertex(3)->point()); m_bbox = bbox(m_tet); for(int i=0; i<4; ++i) { - if(ch->neighbor(i)->info().is_outside) + if(c->neighbor(i)->is_outside()) m_b.set(i, true); - m_triangles[i] = triangle(ch->vertex((i+1)& 3)->point(), - ch->vertex((i+2)& 3)->point(), - ch->vertex((i+3)& 3)->point()); + m_triangles[i] = triangle(c->vertex((i+1)& 3)->point(), + c->vertex((i+2)& 3)->point(), + c->vertex((i+3)& 3)->point()); m_tbox[i] = bbox(m_triangles[i]); } } diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h new file mode 100644 index 000000000000..ebe337b614c4 --- /dev/null +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h @@ -0,0 +1,97 @@ +// Copyright (c) 2019-2023 Google LLC (USA). +// 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) : Mael Rouxel-Labbé + +#ifndef CGAL_ALPHA_WRAP_TRIANGULATION_CELL_BASE_3_H +#define CGAL_ALPHA_WRAP_TRIANGULATION_CELL_BASE_3_H + +#include + +#include + +namespace CGAL { +namespace Alpha_wraps_3 { +namespace internal { + +template < typename GT, + typename Cb = CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3 > +class Alpha_wrap_triangulation_cell_base_3 + : public Cb +{ +private: + bool outside; + +public: + typedef typename Cb::Vertex_handle Vertex_handle; + typedef typename Cb::Cell_handle Cell_handle; + + template < typename TDS2 > + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Alpha_wrap_triangulation_cell_base_3; + }; + + Alpha_wrap_triangulation_cell_base_3() + : Cb() + {} + + Alpha_wrap_triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3) + : Cb(v0, v1, v2, v3) + {} + + Alpha_wrap_triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, + Vertex_handle v2, Vertex_handle v3, + Cell_handle n0, Cell_handle n1, + Cell_handle n2, Cell_handle n3) + : Cb(v0, v1, v2, v3, n0, n1, n2, n3) + {} + + bool is_outside() const { return outside; } + bool& is_outside() { return outside; } +}; + +template +class Cell_base_with_timestamp + : public Cb +{ + std::size_t time_stamp_; + +public: + using Has_timestamp = CGAL::Tag_true; + + template + struct Rebind_TDS + { + using Cb2 = typename Cb::template Rebind_TDS::Other; + using Other = Cell_base_with_timestamp; + }; + +public: + template + Cell_base_with_timestamp(const Args&... args) + : Cb(args...), time_stamp_(-1) + { } + + Cell_base_with_timestamp(const Cell_base_with_timestamp& other) + : Cb(other), time_stamp_(other.time_stamp_) + { } + +public: + std::size_t time_stamp() const { return time_stamp_; } + void set_time_stamp(const std::size_t& ts) { time_stamp_ = ts; } +}; + +} // namespace internal +} // namespace Alpha_wraps_3 +} // namespace CGAL + +#endif // CGAL_ALPHA_WRAP_TRIANGULATION_CELL_BASE_3_H diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h new file mode 100644 index 000000000000..75f26741755c --- /dev/null +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h @@ -0,0 +1,71 @@ +// Copyright (c) 2019-2023 Google LLC (USA). +// 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) : Mael Rouxel-Labbé + +#ifndef CGAL_ALPHA_WRAP_TRIANGULATION_VERTEX_BASE_3_H +#define CGAL_ALPHA_WRAP_TRIANGULATION_VERTEX_BASE_3_H + +#include + +#include + +namespace CGAL { +namespace Alpha_wraps_3 { +namespace internal { + +enum class Vertex_type +{ + DEFAULT = 0, + BBOX_VERTEX, + SEED_VERTEX +}; + +template > +class Alpha_wrap_triangulation_vertex_base_3 + : public Vb +{ +private: + Vertex_type vertex_type; + +public: + using Cell_handle = typename Vb::Cell_handle; + using Point = typename Vb::Point; + + template + struct Rebind_TDS + { + using Vb2 = typename Vb::template Rebind_TDS::Other; + using Other = Alpha_wrap_triangulation_vertex_base_3; + }; + +public: + Alpha_wrap_triangulation_vertex_base_3() + : Vb() {} + + Alpha_wrap_triangulation_vertex_base_3(const Point& p) + : Vb(p) {} + + Alpha_wrap_triangulation_vertex_base_3(const Point& p, Cell_handle c) + : Vb(p, c) {} + + Alpha_wrap_triangulation_vertex_base_3(Cell_handle c) + : Vb(c) {} + +public: + const Vertex_type& type() const { return vertex_type; } + Vertex_type& type() { return vertex_type; } +}; + +} // namespace internal +} // namespace Alpha_wraps_3 +} // namespace CGAL + +#endif // CGAL_ALPHA_WRAP_TRIANGULATION_VERTEX_BASE_3_H diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp index a105d1ba12e4..a1b29fd5689d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp @@ -153,13 +153,13 @@ struct Iterative_AW3_visualization_visitor for(auto fit=wrapper.triangulation().finite_facets_begin(), fend=wrapper.triangulation().finite_facets_end(); fit!=fend; ++fit) { Facet f = *fit; - if(!f.first->info().is_outside) + if(!f.first->is_outside()) f = wrapper.triangulation().mirror_facet(f); const Cell_handle c = f.first; const int s = f.second; const Cell_handle nh = c->neighbor(s); - if(c->info().is_outside == nh->info().is_outside) + if(c->is_outside() == nh->is_outside()) continue; std::array ids; From 5179c4acb12724fa452591946300fd1b8d25bc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 3 Aug 2023 12:06:23 +0200 Subject: [PATCH 0573/1398] Clean examples --- .../examples/Alpha_wrap_3/mixed_inputs_wrap.cpp | 2 +- .../examples/Alpha_wrap_3/volumetric_wrap.cpp | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp index be64a8febbde..ffcedc7f1cbb 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp @@ -16,9 +16,9 @@ using K = CGAL::Exact_predicates_inexact_constructions_kernel; using Point_3 = K::Point_3; using Segment_3 = K::Segment_3; -using Face = std::array; using Segments = std::vector; using Points = std::vector; +using Face = std::array; using Faces = std::vector; using Mesh = CGAL::Surface_mesh; diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp index dd63ad66711f..66e9653f1b41 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -129,9 +129,7 @@ int main(int argc, char** argv) std::cout << "BEFORE: " << tr.number_of_vertices() << " vertices, " << tr.number_of_cells() << " cells" << std::endl; - // Set up the domain information and grab the boundary faces - std::set boundary_facets; - + // Set up the c3t3 information for(auto v : tr.finite_vertex_handles()) v->set_dimension(3); @@ -149,24 +147,25 @@ int main(int argc, char** argv) if(c->neighbor(i)->is_outside() != c->is_outside()) { c->set_surface_patch_index(i, 1); - boundary_facets.emplace(c, i); for(int j=1; j<4; ++j) c->vertex((i+j)%4)->set_dimension(2); } } } - // CGAL::draw(tr); std::ofstream out_before("before_remeshing.mesh"); CGAL::IO::write_MEDIT(out_before, tr); - auto fcm = CGAL::make_boolean_property_map(boundary_facets); - CGAL::tetrahedral_isotropic_remeshing(tr, alpha, - CGAL::parameters::facet_is_constrained_map(fcm)); + // edge length of equilateral triangle with circumradius alpha + // const double l = 2 * alpha * 0.8660254037844386; // sqrt(3)/2 + + // edge length of regular tetrahedron with circumradius alpha + const double l = 1.6329931618554521 * alpha; // sqrt(8/3) + + CGAL::tetrahedral_isotropic_remeshing(tr, l, CGAL::parameters::remesh_boundaries(false)); std::cout << "AFTER: " << tr.number_of_vertices() << " vertices, " << tr.number_of_cells() << " cells" << std::endl; - // CGAL::draw(tr); std::ofstream out_after("after_remeshing.mesh"); CGAL::IO::write_MEDIT(out_after, tr); From 6949cdb40aca7874b2f16fed0256802a58f83891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 3 Aug 2023 12:15:36 +0200 Subject: [PATCH 0574/1398] Fix missing default initialization of the AW3 markers in the new Vb/Cb --- .../internal/Alpha_wrap_triangulation_cell_base_3.h | 2 +- .../internal/Alpha_wrap_triangulation_vertex_base_3.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h index ebe337b614c4..db1df61c8f65 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_cell_base_3.h @@ -26,7 +26,7 @@ class Alpha_wrap_triangulation_cell_base_3 : public Cb { private: - bool outside; + bool outside = false; public: typedef typename Cb::Vertex_handle Vertex_handle; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h index 75f26741755c..3743edffbc7f 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_triangulation_vertex_base_3.h @@ -33,7 +33,7 @@ class Alpha_wrap_triangulation_vertex_base_3 : public Vb { private: - Vertex_type vertex_type; + Vertex_type vertex_type = Vertex_type::DEFAULT; public: using Cell_handle = typename Vb::Cell_handle; From 8076e20b71bc83407ec94d6e399d6e41f163c8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 1 Aug 2023 13:07:55 +0200 Subject: [PATCH 0575/1398] Add debug code --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 14 ++++++++------ .../test_AW3_cavity_initializations.cpp | 1 + .../test/Alpha_wrap_3/test_AW3_manifoldness.cpp | 1 + .../test/Alpha_wrap_3/test_AW3_multiple_calls.cpp | 1 + .../test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index e88e00fafe0c..1e9674276fa8 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1362,7 +1362,12 @@ class Alpha_wrap_3 for(Vertex_handle v : m_dt.finite_vertex_handles()) { if(is_non_manifold(v)) + { +#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS_PP + std::cout << v->point() << " is non-manifold" << std::endl; +#endif non_manifold_vertices.push(v); + } } // Some lambdas for the comparer @@ -1412,23 +1417,19 @@ class Alpha_wrap_3 squared_distance(m_dt.point(c, 2), m_dt.point(c, 3)) }); }; -#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS +#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS_PP std::cout << non_manifold_vertices.size() << " initial NMV" << std::endl; #endif while(!non_manifold_vertices.empty()) { -#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS +#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS_PP std::cout << non_manifold_vertices.size() << " NMV in queue" << std::endl; #endif Vertex_handle v = non_manifold_vertices.top(); non_manifold_vertices.pop(); -#ifdef CGAL_AW3_DEBUG_MANIFOLDNESS - std::cout << "·"; -#endif - if(!is_non_manifold(v)) continue; @@ -1503,6 +1504,7 @@ class Alpha_wrap_3 void check_queue_sanity() { std::cout << "Check queue sanity..." << std::endl; + std::vector queue_gates; Gate previous_top_gate = m_queue.top(); while(!m_queue.empty()) diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp index d7567bab205b..c6591e000df1 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp @@ -1,5 +1,6 @@ #define CGAL_AW3_TIMER #define CGAL_AW3_DEBUG +#define CGAL_AW3_DEBUG_MANIFOLDNESS // #define CGAL_AW3_DEBUG_INITIALIZATION #include diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp index 928cade64959..8ac2e422d878 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp @@ -1,5 +1,6 @@ #define CGAL_AW3_TIMER #define CGAL_AW3_DEBUG +#define CGAL_AW3_DEBUG_MANIFOLDNESS //#define CGAL_AW3_DEBUG_STEINER_COMPUTATION //#define CGAL_AW3_DEBUG_INITIALIZATION //#define CGAL_AW3_DEBUG_QUEUE diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp index e2abc6f1f12f..eda64a8376a4 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp @@ -1,5 +1,6 @@ #define CGAL_AW3_TIMER #define CGAL_AW3_DEBUG +#define CGAL_AW3_DEBUG_MANIFOLDNESS #include diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp index 5091934b62f0..302494d8c304 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp @@ -1,6 +1,6 @@ #define CGAL_AW3_TIMER //#define CGAL_AW3_DEBUG -//#define CGAL_AW3_DEBUG_MANIFOLDNESS +#define CGAL_AW3_DEBUG_MANIFOLDNESS //#define CGAL_AW3_DEBUG_STEINER_COMPUTATION //#define CGAL_AW3_DEBUG_INITIALIZATION //#define CGAL_AW3_DEBUG_QUEUE From c7b9317a96117f874aa88b6ca9cd6b376f4d10cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Tue, 1 Aug 2023 13:16:18 +0200 Subject: [PATCH 0576/1398] Simplify choice of cells to un-carve while enforcing manifoldness This combinatorial choice seemed like a good idea, but it can have nasty cascading effects, adding very large tetrahedra. See this issue: https://github.com/CGAL/cgal/issues/7625 In the end, the only thing we care about is small volumes being added. I keep the artificial vertex for now, but I am not fully convinced these should be actually kept too. --- .../include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 1e9674276fa8..1b0a6968c092 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1445,11 +1445,6 @@ class Alpha_wrap_3 if(has_artificial_vertex(r)) return true; - const int l_bf_count = count_boundary_facets(l, v); - const int r_bf_count = count_boundary_facets(r, v); - if(l_bf_count != r_bf_count) - return l_bf_count > r_bf_count; - return sq_longest_edge(l) < sq_longest_edge(r); }; From b4e207ab00237bffbd221bc7f4bd4b0bb2e69c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 2 Aug 2023 10:00:34 +0200 Subject: [PATCH 0577/1398] Add some comments on AW3 manifoldness heuristics criteria --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 1b0a6968c092..a21925cdc6d8 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1380,25 +1380,27 @@ class Alpha_wrap_3 return false; }; - auto is_on_boundary = [](Cell_handle c, int i) -> bool - { - return (c->info().is_outside != c->neighbor(i)->info().is_outside); - }; - - auto count_boundary_facets = [&](Cell_handle c, Vertex_handle v) -> int - { - const int v_index_in_c = c->index(v); - int boundary_facets = 0; - for(int i=0; i<3; ++i) // also take into account the opposite facet? - { - if(i == v_index_in_c) - continue; - - boundary_facets += is_on_boundary(c, i); - } - - return boundary_facets; - }; + // This seemed like a good idea, but in the end it can have strong cascading issues, + // whereas some cells with much lower volume would have solved the non-manifoldness. +// auto is_on_boundary = [](Cell_handle c, int i) -> bool +// { +// return (c->info().is_outside != c->neighbor(i)->info().is_outside); +// }; +// +// auto count_boundary_facets = [&](Cell_handle c, Vertex_handle v) -> int +// { +// const int v_index_in_c = c->index(v); +// int boundary_facets = 0; +// for(int i=0; i<3; ++i) // also take into account the opposite facet? +// { +// if(i == v_index_in_c) +// continue; +// +// boundary_facets += is_on_boundary(c, i); +// } +// +// return boundary_facets; +// }; // longest edge works better // auto sq_circumradius = [&](Cell_handle c) -> FT @@ -1407,6 +1409,9 @@ class Alpha_wrap_3 // return geom_traits().compute_squared_distance_3_object()(m_dt.point(c, 0), cc); // }; + // the reasonning behind using longest edge rather than volume is that we want to avoid + // spikes (which would have a small volume), and can often happen since we do not spend + // any care on the quality of tetrahedra. auto sq_longest_edge = [&](Cell_handle c) -> FT { return (std::max)({ squared_distance(m_dt.point(c, 0), m_dt.point(c, 1)), From 330ff2e65776a9be1f7ca757a813e5055e0a1994 Mon Sep 17 00:00:00 2001 From: Mael Date: Wed, 2 Aug 2023 10:23:12 +0200 Subject: [PATCH 0578/1398] Fix spelling Thanks @albert-github! --- Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index a21925cdc6d8..6d544be058d6 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1409,7 +1409,7 @@ class Alpha_wrap_3 // return geom_traits().compute_squared_distance_3_object()(m_dt.point(c, 0), cc); // }; - // the reasonning behind using longest edge rather than volume is that we want to avoid + // the reasoning behind using longest edge rather than volume is that we want to avoid // spikes (which would have a small volume), and can often happen since we do not spend // any care on the quality of tetrahedra. auto sq_longest_edge = [&](Cell_handle c) -> FT From 5db2fd0195051aa2190eac6a5d1fff9780d5d4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 10:39:37 +0200 Subject: [PATCH 0579/1398] fix CK3 demo --- .../demo/Circular_kernel_3/Viewer.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp index 1502fb44db22..b71924811383 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp +++ b/Circular_kernel_3/demo/Circular_kernel_3/Viewer.cpp @@ -893,20 +893,19 @@ void Viewer::naive_compute_intersection_points(const std::vector& for (std::vector::const_iterator it_f=circles.begin();it_f!=--circles.end();++it_f){ std::vector::const_iterator it_s=it_f; ++it_s; + typedef std::pair Point_and_multiplicity; for (;it_s!=circles.end();++it_s){ - std::vector intersections; + std::vector intersections; //ensure_circles are different CGAL_precondition(*it_s!=*it_f); - CGAL::intersection(*it_f,*it_s,std::back_inserter(intersections)); + CGAL::intersection(*it_f,*it_s,CGAL::dispatch_or_drop_output(std::back_inserter(intersections))); if (!intersections.empty()){ - for (std::vector ::const_iterator it_pt=intersections.begin();it_pt!=intersections.end();++it_pt){ - const std::pair* pt= - CGAL::object_cast< std::pair > (&(*it_pt)); - assert(pt!=nullptr); - *out++=EPIC::Point_3( CGAL::to_double(pt->first.x()), - CGAL::to_double(pt->first.y()), - CGAL::to_double(pt->first.z()) - ); + for (const Point_and_multiplicity& pt : intersections) + { + *out++=EPIC::Point_3( CGAL::to_double(pt.first.x()), + CGAL::to_double(pt.first.y()), + CGAL::to_double(pt.first.z()) + ); } } } From 7f639164c170370b7e5810422458a7f0f9e6765e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 11:22:05 +0200 Subject: [PATCH 0580/1398] update CK2 demo --- .../demo/Circular_kernel_2/ArcsGraphicsItem.h | 52 +++++------ .../Circular_kernel_2/Circular_kernel_2.cpp | 92 +++++++++---------- 2 files changed, 71 insertions(+), 73 deletions(-) diff --git a/GraphicsView/demo/Circular_kernel_2/ArcsGraphicsItem.h b/GraphicsView/demo/Circular_kernel_2/ArcsGraphicsItem.h index b4de860626c0..148293b705c0 100644 --- a/GraphicsView/demo/Circular_kernel_2/ArcsGraphicsItem.h +++ b/GraphicsView/demo/Circular_kernel_2/ArcsGraphicsItem.h @@ -16,14 +16,18 @@ namespace Qt { template class ArcsGraphicsItem : public GraphicsItem { - std::vector& arcs, &intersections; typedef typename CK::Circle_2 Circle_2; typedef typename CK::Circular_arc_2 Circular_arc_2; typedef typename CK::Circular_arc_point_2 Circular_arc_point_2; typedef typename CK::Line_arc_2 Line_arc_2; + typedef std::variant, Circular_arc_2, Line_arc_2 > Inter_variant; + typedef std::variant Arc_variant; + + std::vector& arcs; + std::vector& intersections; public: - ArcsGraphicsItem(std::vector& arcs_, std::vector& intersections_); + ArcsGraphicsItem(std::vector& arcs_, std::vector& intersections_); void modelChanged(); @@ -68,7 +72,7 @@ class ArcsGraphicsItem : public GraphicsItem template -ArcsGraphicsItem::ArcsGraphicsItem(std::vector& arcs_, std::vector& intersections_) +ArcsGraphicsItem::ArcsGraphicsItem(std::vector& arcs_, std::vector& intersections_) : arcs(arcs_), intersections(intersections_), painterostream(nullptr) { setIntersectionsPen(QPen(::Qt::red, 3.)); @@ -97,33 +101,29 @@ ArcsGraphicsItem::paint(QPainter *painter, painter->setPen(this->inputPen()); painterostream = PainterOstream(painter); - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + for(typename std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ Circular_arc_2 ca; Line_arc_2 la; - if(assign(ca, *it)){ - painterostream << ca; - } else if(assign(la, *it)){ - painterostream << la; + if(auto ca = std::get_if(&(*it))){ + painterostream << *ca; + } else if(auto la = std::get_if(&(*it))){ + painterostream << *la; } } painter->setPen(this->intersectionsPen()); painterostream = PainterOstream(painter); - for(std::vector::iterator it = intersections.begin(); it != intersections.end(); ++it){ - std::pair cap_ui; - Circular_arc_2 ca; - Line_arc_2 la; - - if(assign(cap_ui, *it)){ + for(typename std::vector::iterator it = intersections.begin(); it != intersections.end(); ++it){ + if(auto cap_ui = std::get_if>(&*it)){ QTransform matrix = painter->worldTransform(); painter->resetTransform(); - painter->drawPoint(matrix.map(convert(cap_ui.first))); + painter->drawPoint(matrix.map(convert(cap_ui->first))); painter->setWorldTransform(matrix); - }if(assign(ca, *it)){ - painterostream << ca; - } else if(assign(la, *it)){ - painterostream << la; + }if(auto ca = std::get_if(&(*it))){ + painterostream << *ca; + } else if(auto la = std::get_if(&(*it))){ + painterostream << *la; } } } @@ -135,22 +135,22 @@ ArcsGraphicsItem::updateBoundingBox() bounding_rect = QRectF(0,0,100, 100); Bbox_2 bb; bool initialized = false; - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + for(typename std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ Circular_arc_2 ca; Line_arc_2 la; - if(assign(ca, *it)){ + if(auto ca = std::get_if(&(*it))){ if(initialized){ - bb = bb + ca.supporting_circle().bbox(); + bb = bb + ca->supporting_circle().bbox(); } else { initialized = true; - bb = ca.supporting_circle().bbox(); + bb = ca->supporting_circle().bbox(); } - } else if(assign(la, *it)){ + } else if(auto la = std::get_if(&(*it))){ if(initialized){ - bb = bb + la.bbox(); + bb = bb + la->bbox(); } else { initialized = true; - bb = la.bbox(); + bb = la->bbox(); } } } diff --git a/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp b/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp index 4fa766fb87c9..e593af52c147 100644 --- a/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp +++ b/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include // Qt headers @@ -38,12 +37,15 @@ typedef CircularKernel::Segment_2 Segment_2; typedef CircularKernel::Line_arc_2 Line_arc_2; typedef CircularKernel::Circular_arc_2 Circular_arc_2; typedef CircularKernel::Circular_arc_point_2 Circular_arc_point_2; - +typedef std::variant Arc_variant; +typedef std::variant, + Circular_arc_2, Line_arc_2 > Inter_variant; typedef CGAL::Qt::ArcsGraphicsItem ArcsGraphicsItem; -typedef std::vector ArcContainer; +typedef std::vector ArcContainer; +typedef std::vector ArcIntersection; class MainWindow : public CGAL::Qt::DemosMainWindow, @@ -53,7 +55,7 @@ class MainWindow : private: ArcContainer arcs; - ArcContainer intersections; + ArcIntersection intersections; QGraphicsScene scene; ArcsGraphicsItem * agi; @@ -68,7 +70,7 @@ public Q_SLOTS: virtual void open(QString); - void processInput(CGAL::Object o); + void processInput(Arc_variant o); void on_actionInsertCircularArc_toggled(bool checked); @@ -107,8 +109,8 @@ MainWindow::MainWindow() // the signal/slot mechanism cai = new CGAL::Qt::GraphicsViewCircularArcInput(this, &scene); - QObject::connect(cai, SIGNAL(generate(CGAL::Object)), - this, SLOT(processInput(CGAL::Object))); + QObject::connect(cai, SIGNAL(generate(Arc_variant)), + this, SLOT(processInput(Arc_variant))); // Manual handling of actions // @@ -146,33 +148,33 @@ MainWindow::MainWindow() void -MainWindow::processInput(CGAL::Object o) +MainWindow::processInput(Arc_variant o) { - Circular_arc_2 ca; - Line_arc_2 la; + const Circular_arc_2* ca = nullptr; + const Line_arc_2* la = nullptr; bool is_circular = false; - if(assign(ca, o)){ + if( (ca = std::get_if(&o)) ){ is_circular = true; - } else if(! assign(la, o)){ + } else if(! (la = std::get_if(&o))){ std::cerr << "unknown object" << std::endl; return; } - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ Circular_arc_2 vca; Line_arc_2 vla; - if(assign(vca, *it)){ + if(auto vca = std::get_if(&(*it))){ if(is_circular){ - CGAL::intersection(ca, vca, std::back_inserter(intersections)); + CGAL::intersection(*ca, *vca, std::back_inserter(intersections)); } else { - CGAL::intersection(la, vca, std::back_inserter(intersections)); + CGAL::intersection(*la, *vca, std::back_inserter(intersections)); } - } else if(assign(vla, *it)){ + } else if(auto vla = std::get_if(&(*it))){ if(is_circular){ - CGAL::intersection(ca, vla, std::back_inserter(intersections)); + CGAL::intersection(*ca, *vla, std::back_inserter(intersections)); } else { - CGAL::intersection(la, vla, std::back_inserter(intersections)); + CGAL::intersection(*la, *vla, std::back_inserter(intersections)); } } } @@ -241,32 +243,30 @@ MainWindow::open(QString fileName) { Line_arc_2 la(Segment_2(multi_points[0], multi_points[1])); - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ - Circular_arc_2 vca; - Line_arc_2 vla; - if(assign(vca, *it)){ - CGAL::intersection(la, vca, std::back_inserter(intersections)); - } else if(assign(vla, *it)){ - CGAL::intersection(la, vla, std::back_inserter(intersections)); + for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + if(auto vca = std::get_if(&(*it))){ + CGAL::intersection(la, *vca, std::back_inserter(intersections)); + } else if(auto vla = std::get_if(&(*it))){ + CGAL::intersection(la, *vla, std::back_inserter(intersections)); } } - arcs.push_back(make_object(la)); + arcs.push_back(la); } else if(multi_points.size() == 3) { Circular_arc_2 ca(multi_points[0], multi_points[1], multi_points[2]); - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ Circular_arc_2 vca; Line_arc_2 vla; - if(assign(vca, *it)){ - CGAL::intersection(ca, vca, std::back_inserter(intersections)); - } else if(assign(vla, *it)){ - CGAL::intersection(ca, vla, std::back_inserter(intersections)); + if(auto vca = std::get_if(&(*it))){ + CGAL::intersection(ca, *vca, std::back_inserter(intersections)); + } else if(auto vla = std::get_if(&(*it))){ + CGAL::intersection(ca, *vla, std::back_inserter(intersections)); } } - arcs.push_back(make_object(ca)); + arcs.push_back(ca); } else if(multi_points.size()>0) { @@ -285,16 +285,14 @@ MainWindow::open(QString fileName) Point_2 q(x,y); Line_arc_2 la(Segment_2(p,q)); - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ - Circular_arc_2 vca; - Line_arc_2 vla; - if(assign(vca, *it)){ - CGAL::intersection(la, vca, std::back_inserter(intersections)); - } else if(assign(vla, *it)){ - CGAL::intersection(la, vla, std::back_inserter(intersections)); + for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + if(auto vca = std::get_if(&(*it))){ + CGAL::intersection(la, *vca, std::back_inserter(intersections)); + } else if(auto vla = std::get_if(&(*it))){ + CGAL::intersection(la, *vla, std::back_inserter(intersections)); } } - arcs.push_back(make_object(la)); + arcs.push_back(la); } else if(c == 'c'){ ifs >> x >> y; Point_2 p(x,y); @@ -303,16 +301,16 @@ MainWindow::open(QString fileName) ifs >> x >> y; Point_2 r(x,y); Circular_arc_2 ca(p,q,r); - for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ + for(std::vector::iterator it = arcs.begin(); it != arcs.end(); ++it){ Circular_arc_2 vca; Line_arc_2 vla; - if(assign(vca, *it)){ - CGAL::intersection(ca, vca, std::back_inserter(intersections)); - } else if(assign(vla, *it)){ - CGAL::intersection(ca, vla, std::back_inserter(intersections)); + if(auto vca = std::get_if(&(*it))){ + CGAL::intersection(ca, *vca, std::back_inserter(intersections)); + } else if(auto vla = std::get_if(&(*it))){ + CGAL::intersection(ca, *vla, std::back_inserter(intersections)); } } - arcs.push_back(make_object(ca)); + arcs.push_back(ca); } } } From 57fe29fe4f3308f9b2fcbfdfb303481581de4705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 4 Aug 2023 11:26:46 +0200 Subject: [PATCH 0581/1398] Add some comments about failed speedup experiments --- .../include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index ba752a77590b..04b30cf76783 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1082,10 +1082,12 @@ class Alpha_wrap_3 const Cell_handle conflict_cell = m_tr.locate(steiner_point, lt, li, lj, neighbor); CGAL_assertion(lt != Triangulation::VERTEX); + // Using small vectors like in Triangulation_3 does not bring any runtime improvement std::vector boundary_facets; std::vector conflict_zone; boundary_facets.reserve(32); conflict_zone.reserve(32); + m_tr.find_conflicts(steiner_point, conflict_cell, std::back_inserter(boundary_facets), std::back_inserter(conflict_zone)); @@ -1112,6 +1114,8 @@ class Alpha_wrap_3 visitor.before_Steiner_point_insertion(*this, steiner_point); // Actual insertion of the Steiner point + // We could use TDS functions to avoid recomputing the conflict zone, but in practice + // it does not bring any runtime improvements Vertex_handle vh = m_tr.insert(steiner_point, lt, conflict_cell, li, lj); vh->type() = AW3i::Vertex_type:: DEFAULT; From 361f6e2f63c57410fcabbcb05f8bf3baddbd66d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 4 Aug 2023 13:30:26 +0200 Subject: [PATCH 0582/1398] Clean code to use Face_location / Barycentric_coordinates everywhere --- .../CGAL/Polygon_mesh_processing/locate.h | 144 ++++++------------ 1 file changed, 50 insertions(+), 94 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 26d0266e03ad..a8359779125b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -52,6 +52,36 @@ namespace CGAL { namespace Polygon_mesh_processing { + +/// \ingroup PMP_locate_grp +/// +/// A variant used in the function `get_descriptor_from_location()`. +template +using descriptor_variant = boost::variant::vertex_descriptor, + typename boost::graph_traits::halfedge_descriptor, + typename boost::graph_traits::face_descriptor>; + +/// \ingroup PMP_locate_grp +/// +/// A triplet of coordinates describing the barycentric coordinates of a point +/// with respect to the vertices of a triangular face. +/// +/// \sa `Face_location` +template +using Barycentric_coordinates = std::array; + +/// \ingroup PMP_locate_grp +/// +/// If `tm` is the input triangulated surface mesh and given the pair (`f`, `bc`) +/// such that `bc` is the triplet of barycentric coordinates `(w0, w1, w2)`, the correspondence +/// between the coordinates in `bc` and the vertices of the face `f` is the following: +/// - `w0` corresponds to `source(halfedge(f, tm), tm)` +/// - `w1` corresponds to `target(halfedge(f, tm), tm)` +/// - `w2` corresponds to `target(next(halfedge(f, tm), tm), tm)` +template +using Face_location = std::pair::face_descriptor, + Barycentric_coordinates >; + namespace internal { // The Ray must have the same ambient dimension as the property map's value type (aka, the point type) @@ -85,51 +115,20 @@ struct Location_traits typedef typename boost::graph_traits::face_descriptor face_descriptor; - typedef std::array Barycentric_coordinates; - typedef std::pair Face_location; + typedef CGAL::Polygon_mesh_processing::Barycentric_coordinates Barycentric_coordinates; + typedef CGAL::Polygon_mesh_processing::Face_location Face_location; }; } // end namespace internal -/// \ingroup PMP_locate_grp -/// -/// A variant used in the function `get_descriptor_from_location()`. -template -using descriptor_variant = boost::variant::vertex_descriptor, - typename boost::graph_traits::halfedge_descriptor, - typename boost::graph_traits::face_descriptor>; - -/// \ingroup PMP_locate_grp -/// -/// A triplet of coordinates describing the barycentric coordinates of a point -/// with respect to the vertices of a triangular face. -/// -/// \sa `Face_location` -template -using Barycentric_coordinates = std::array; - -/// \ingroup PMP_locate_grp -/// -/// If `tm` is the input triangulated surface mesh and given the pair (`f`, `bc`) -/// such that `bc` is the triplet of barycentric coordinates `(w0, w1, w2)`, the correspondence -/// between the coordinates in `bc` and the vertices of the face `f` is the following: -/// - `w0` corresponds to `source(halfedge(f, tm), tm)` -/// - `w1` corresponds to `target(halfedge(f, tm), tm)` -/// - `w2` corresponds to `target(next(halfedge(f, tm), tm), tm)` -template -using Face_location = std::pair::face_descriptor, - Barycentric_coordinates >; - // forward declarations template -bool is_in_face(const std::pair::face_descriptor, - std::array >& loc, +bool is_in_face(const Face_location& loc, const TriangleMesh& tm); template descriptor_variant -get_descriptor_from_location(const std::pair::face_descriptor, - std::array >& loc, +get_descriptor_from_location(const Face_location& loc, const TriangleMesh& tm); // end of forward declarations @@ -138,8 +137,7 @@ namespace internal { template OutputIterator -incident_faces(const std::pair::face_descriptor, - std::array >& location, +incident_faces(const Face_location& loc, const TriangleMesh& tm, OutputIterator out) { @@ -147,7 +145,7 @@ incident_faces(const std::pair::face_ typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; - const descriptor_variant dv = get_descriptor_from_location(location, tm); + const descriptor_variant dv = get_descriptor_from_location(loc, tm); if(const vertex_descriptor* vd_ptr = boost::get(&dv)) { @@ -173,7 +171,7 @@ incident_faces(const std::pair::face_ // Snapping coordinates for robustness template bool -snap_coordinates_to_border(std::array& coords, +snap_coordinates_to_border(Barycentric_coordinates& coords, const FT tolerance = std::numeric_limits::epsilon()) { #ifdef CGAL_PMP_LOCATE_DEBUG @@ -224,8 +222,7 @@ snap_coordinates_to_border(std::array& coords, template bool -snap_location_to_border(std::pair::face_descriptor, - std::array >& loc, +snap_location_to_border(Face_location& loc, const TriangleMesh /*tm*/, const FT tolerance = std::numeric_limits::epsilon()) { @@ -235,7 +232,7 @@ snap_location_to_border(std::pair::fa template struct Barycentric_coordinate_calculator // 2D version { - std::array + Barycentric_coordinates operator()(const P& ip, const P& iq, const P& ir, const P& iquery, const K& k) const { typedef typename K::FT FT; @@ -273,7 +270,7 @@ struct Barycentric_coordinate_calculator // 2D version template struct Barycentric_coordinate_calculator { - std::array + Barycentric_coordinates operator()(const P& ip, const P& iq, const P& ir, const P& iquery, const K& k) const { typedef typename K::FT FT; @@ -364,7 +361,7 @@ struct Barycentric_point_constructor // 3D version /// \pre `query` lies on the plane defined by `p`, `q`, and `r`. /// template -std::array +Barycentric_coordinates barycentric_coordinates(const Point& p, const Point& q, const Point& r, const Point& query, const GeomTraits& gt) { @@ -373,7 +370,7 @@ barycentric_coordinates(const Point& p, const Point& q, const Point& r, const Po } template -std::array::type::FT, 3> +Barycentric_coordinates::type::FT> barycentric_coordinates(const Point& p, const Point& q, const Point& r, const Point& query) { typedef typename CGAL::Kernel_traits::type Kernel; @@ -411,7 +408,7 @@ random_location_on_halfedge(typename boost::graph_traits::halfedge const int h_id = halfedge_index_in_face(hd, tm); const FT t(rnd.uniform_real(0., 1.)); - std::array coordinates; + Barycentric_coordinates coordinates; coordinates[h_id] = t; coordinates[(h_id+1)%3] = FT(1)-t; coordinates[(h_id+2)%3] = FT(0); @@ -510,8 +507,7 @@ descriptor_variant #ifdef DOXYGEN_RUNNING // just for convenience because template alias do not allow template deduction get_descriptor_from_location(const Face_location& loc, #else -get_descriptor_from_location(const std::pair::face_descriptor, - std::array >& loc, +get_descriptor_from_location(const Face_location& loc, #endif const TriangleMesh& tm) { @@ -589,12 +585,10 @@ get_descriptor_from_location(const std::pair #ifdef DOXYGEN_RUNNING Point -construct_point(const Face_location& loc, #else typename internal::Location_traits::Point -construct_point(const std::pair::face_descriptor, - std::array >& loc, #endif +construct_point(const Face_location& loc, const TriangleMesh& tm, const NamedParameters& np = parameters::default_values()) { @@ -648,12 +642,7 @@ construct_point(const std::pair::face /// template bool -#ifdef DOXYGEN_RUNNING is_on_vertex(const Face_location& loc, -#else -is_on_vertex(const std::pair::face_descriptor, - std::array >& loc, -#endif const typename boost::graph_traits::vertex_descriptor vd, const TriangleMesh& tm) { @@ -692,12 +681,7 @@ is_on_vertex(const std::pair::face_de /// template bool -#ifdef DOXYGEN_RUNNING is_on_halfedge(const Face_location& loc, -#else -is_on_halfedge(const std::pair::face_descriptor, - std::array >& loc, -#endif const typename boost::graph_traits::halfedge_descriptor hd, const TriangleMesh& tm) { @@ -738,11 +722,7 @@ is_on_halfedge(const std::pair::face_ /// template bool -#ifdef DOXYGEN_RUNNING is_in_face(const Barycentric_coordinates& bar, -#else -is_in_face(const std::array& bar, -#endif const TriangleMesh& tm) { CGAL_USE(tm); @@ -780,12 +760,7 @@ is_in_face(const std::array& bar, /// template bool -#ifdef DOXYGEN_RUNNING is_in_face(const Face_location& loc, -#else -is_in_face(const std::pair::face_descriptor, - std::array >& loc, -#endif const TriangleMesh& tm) { return is_in_face(loc.second, tm); @@ -812,12 +787,7 @@ is_in_face(const std::pair::face_desc /// template bool -#ifdef DOXYGEN_RUNNING is_on_face_border(const Face_location& loc, -#else -is_on_face_border(const std::pair::face_descriptor, - std::array >& loc, -#endif const TriangleMesh& tm) { if(!is_in_face(loc, tm)) @@ -853,12 +823,7 @@ is_on_face_border(const std::pair::fa /// template bool -#ifdef DOXYGEN_RUNNING is_on_mesh_border(const Face_location& loc, -#else -is_on_mesh_border(const std::pair::face_descriptor, - std::array >& loc, -#endif const TriangleMesh& tm) { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -1136,7 +1101,7 @@ locate_in_face(const typename internal::Location_traits coords = barycentric_coordinates(p0, p1, p2, query, gt); + Barycentric_coordinates coords = barycentric_coordinates(p0, p1, p2, query, gt); if(snap_tolerance != FT(0) && !is_in_face(coords, tm)) { @@ -1174,12 +1139,7 @@ locate_in_face(const typename internal::Location_traits Face_location -#ifdef DOXYGEN_RUNNING locate_in_adjacent_face(const Face_location& loc, -#else -locate_in_adjacent_face(const std::pair::face_descriptor, - std::array >& loc, -#endif const typename boost::graph_traits::face_descriptor fd, const TriangleMesh& tm) { @@ -1247,11 +1207,9 @@ locate_in_adjacent_face(const std::pair bool -locate_in_common_face(std::pair::face_descriptor, - std::array >& known_location, +locate_in_common_face(Face_location& known_location, const typename internal::Location_traits::Point& query, - std::pair::face_descriptor, - std::array >& query_location, + Face_location& query_location, const TriangleMesh& tm, const NamedParameters& np, const FT tolerance = std::numeric_limits::epsilon()) @@ -1323,10 +1281,8 @@ locate_in_common_face(std::pair::face // - both locations must be known but can change template bool -locate_in_common_face(std::pair::face_descriptor, - std::array >& first_location, - std::pair::face_descriptor, - std::array >& second_location, +locate_in_common_face(Face_location& first_location, + Face_location& second_location, const TriangleMesh& tm) { typedef typename boost::graph_traits::face_descriptor face_descriptor; From 0ecba6b9b9c32735dcf98cf0981efd17b30de89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 14:24:58 +0200 Subject: [PATCH 0583/1398] const& should not be in the get --- .../include/internal/Qt/HyperbolicPainterOstream.h | 2 +- .../include/internal/Qt/HyperbolicPainterOstreamCK.h | 2 +- .../include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h index 81522776a5b3..e561bd30b692 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstream.h @@ -85,7 +85,7 @@ class PainterOstream< Hyperbolic_Delaunay_triangulation_traits_2 > return *this; } - const Circular_arc_2& arc = std::get(s); + const Circular_arc_2& arc = std::get(s); if(arc.squared_radius() > 100) { Euclidean_segment_2 seg(arc.source(), arc.target()); diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h index 61d6630eeb3a..f634789193cc 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include/internal/Qt/HyperbolicPainterOstreamCK.h @@ -49,7 +49,7 @@ namespace Qt { return *this; } - const Circular_arc& arc = std::get(s); + const Circular_arc& arc = std::get(s); if(arc.squared_radius() > 10) { diff --git a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h index e54c4cb75a8d..0c0829309b72 100644 --- a/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Hyperbolic_triangulation_2/include/CGAL/Hyperbolic_Delaunay_triangulation_traits_2.h @@ -468,7 +468,7 @@ class Hyperbolic_Delaunay_triangulation_traits_2 typedef Hyperbolic_point_2 Hyperbolic_Voronoi_point_2; typedef typename Kernel::Circle_2 Circle_2; typedef typename Kernel::Line_2 Euclidean_line_2; - typedef std::variant Euclidean_circle_or_line_2; + typedef std::variant Euclidean_circle_or_line_2; typedef internal::HDT_2_Circular_arc_2 Circular_arc_2; typedef typename Kernel::Segment_2 Euclidean_segment_2; // only used internally here typedef std::variant Hyperbolic_segment_2; From 33d70dd95fe700d87d13b24085c9f179e26df355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 4 Aug 2023 14:32:48 +0200 Subject: [PATCH 0584/1398] Minor improvements to orient_PS's doc --- .../orient_polygon_soup.h | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h index 2ffc899b5490..de2bcab9c1c9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup.h @@ -39,10 +39,10 @@ namespace CGAL { namespace Polygon_mesh_processing { /** \ingroup PMP_orientation_grp + * * Default visitor model of `PMPPolygonSoupOrientationVisitor`. * All of its functions have an empty body. This class can be used as a - * base class if only some of the functions of the concept require to be - * overridden. + * base class if only some of the functions of the concept will be overridden. */ struct Default_orientation_visitor{ void non_manifold_edge(std::size_t, std::size_t, std::size_t){} @@ -483,12 +483,22 @@ struct Polygon_soup_orienter * * \brief tries to consistently orient a soup of polygons in 3D space. * - * When it is not possible to produce a combinatorial manifold surface, + * The algorithm re-orients polygons such that the orientation + * of adjacent polygons is consistent. Note that the adjacency is + * defined in a combinatorial sense, i.e. two polygons are sharing + * an edge if and only if the endpoints of this edge are represented + * by the same point indices in both faces (possibly in a different order); + * it is not sufficient for the points to be geometrically identical. + * One may use `CGAL::Polygon_mesh_processing::merge_duplicate_points_in_polygon_soup()` + * to convert geometrical point equality into combinatorial point equality. + * + * When it is not possible to produce a combinatorial manifold surface + * (for example, if the polygon soup makes up a Möbius strip), * some points are duplicated. * Because a polygon soup does not have any connectivity (each point * has as many occurrences as the number of polygons it belongs to), * duplicating one point (or a pair of points) - * amounts to duplicate the polygon to which it belongs. + * amounts to duplicating the polygon to which it belongs. * * These points are either an endpoint of an edge incident to more * than two polygons, an endpoint of an edge between @@ -521,7 +531,7 @@ struct Polygon_soup_orienter * \cgalNamedParamsEnd * * @return `true` if the orientation operation succeeded. - * @return `false` if some points were duplicated, thus producing a self-intersecting polyhedron. + * @return `false` if some points were duplicated, thus producing a combinatorially manifold but self-intersecting polyhedron. * * @sa `orient_triangle_soup_with_reference_triangle_mesh()` */ From 69202afc5452e95aed811e31e63fc95c6d2c0966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 14:40:13 +0200 Subject: [PATCH 0585/1398] fix L1_VD demo --- .../include/CGAL/L1_voronoi_traits_2.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/include/CGAL/L1_voronoi_traits_2.h b/GraphicsView/demo/L1_Voronoi_diagram_2/include/CGAL/L1_voronoi_traits_2.h index 49be2350b4d8..e7d9b163a4c7 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/include/CGAL/L1_voronoi_traits_2.h +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/include/CGAL/L1_voronoi_traits_2.h @@ -270,7 +270,7 @@ class L1_voronoi_traits_2 : public Arr_linear_traits_2 // The sites have the same x/y coordinate. if (s_x == CGAL::ZERO || s_y == CGAL::ZERO) { - *o++ = CGAL::make_object(Intersection_curve(CGAL::bisector(s1, s2), 1)); + *o++ = Intersection_curve(CGAL::bisector(s1, s2), 1); return o; } @@ -300,7 +300,7 @@ class L1_voronoi_traits_2 : public Arr_linear_traits_2 } // We construct the diagonal line either way. - *o++ = CGAL::make_object(Intersection_curve(Segment_2(p1, p2), 1)); + *o++ = Intersection_curve(Segment_2(p1, p2), 1); // Now construct vertical rays. Two or four rays. If it is only two rays, // then the multiplicity of all the curves is 1. @@ -309,14 +309,14 @@ class L1_voronoi_traits_2 : public Arr_linear_traits_2 if (s_d != CGAL::POSITIVE) { // horizontal rectangle or square = vertical rays. - *o++ = CGAL::make_object(Intersection_curve(Ray_2(*top, Direction_2(0, 1)), mult)); - *o++ = CGAL::make_object(Intersection_curve(Ray_2(*bottom, Direction_2(0, -1)), mult)); + *o++ = Intersection_curve(Ray_2(*top, Direction_2(0, 1)), mult); + *o++ = Intersection_curve(Ray_2(*bottom, Direction_2(0, -1)), mult); } if (s_d != CGAL::NEGATIVE) { // vertical rectangle or square = horizontal rays. - *o++ = CGAL::make_object(Intersection_curve(Ray_2(*right, Direction_2(1, 0)), mult)); - *o++ = CGAL::make_object(Intersection_curve(Ray_2(*left, Direction_2(-1, 0)), mult)); + *o++ = Intersection_curve(Ray_2(*right, Direction_2(1, 0)), mult); + *o++ = Intersection_curve(Ray_2(*left, Direction_2(-1, 0)), mult); } return o; From 5d87958a7c7f0950c5728d498c42110c66039784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 14:40:24 +0200 Subject: [PATCH 0586/1398] fix format only changing the top string, not the data --- .../SMDS_3/data/c3t3_io-hetero.binary.cgal | Bin 1618 -> 1616 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.binary.cgal b/SMDS_3/test/SMDS_3/data/c3t3_io-hetero.binary.cgal index f4c958d923934984575fbf1a79ec79e6f498f161..ab735a65e00a81188a79d3f901e4c5c6b7a2f5a2 100644 GIT binary patch delta 14 Vcmcb_bAe}q3v+Qv%0^F4HUKIP1m*w$ delta 16 Xcmcb>bBSky3u{t-esRf0cTP3{HdF<| From f06d9fb606de8688ba2eff4721358b614b277f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 15:04:26 +0200 Subject: [PATCH 0587/1398] fix shortcut mistake --- Triangulation/include/CGAL/Triangulation.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Triangulation/include/CGAL/Triangulation.h b/Triangulation/include/CGAL/Triangulation.h index 9a3e4aecb47b..1c1bff783702 100644 --- a/Triangulation/include/CGAL/Triangulation.h +++ b/Triangulation/include/CGAL/Triangulation.h @@ -101,8 +101,8 @@ class Triangulation template CGAL::Orientation operator()(Iter a, Iter b) const { - return ifo(fop->value(),a,b); if (*fop) + return ifo(fop->value(),a,b); *fop = cfo(a,b); CGAL_assertion(ifo(fop->value(),a,b) == CGAL::POSITIVE); return CGAL::POSITIVE; From 89fd91e35440048343c4df33c2e283ecb2f6e50a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 16:56:55 +0200 Subject: [PATCH 0588/1398] fix argt demo changes in Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h should be undo --- .../ArrangementGraphicsItem.cpp | 11 ++--- .../Utils/IntersectCurves.cpp | 18 +++++++- .../Arrangement_on_surface_2/Utils/Utils.cpp | 45 +++++++++---------- .../include/CGAL/Arr_polycurve_traits_2.h | 6 +-- 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementGraphicsItem.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementGraphicsItem.cpp index 86ad76fe086e..d8573dfa0cb6 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementGraphicsItem.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementGraphicsItem.cpp @@ -961,15 +961,16 @@ findOtherInterestingPoints const CGAL::Bbox_2& allowable_range) { using Traits = demo_types::DemoTypes::Alg_seg_traits; CGAL::Bbox_2 bb = {}; - std::vector intersections; + typedef std::pair Pt_m; + std::vector intersections; for (auto it = arr->edges_begin(); it != arr->edges_end(); ++it) { for (auto& arc : getXyCurves(arr->traits())) + { if (arc.is_vertical() != it->curve().is_vertical()) - it->curve().intersections(arc, std::back_inserter(intersections)); + it->curve().intersections(arc, CGAL::dispatch_or_drop_output(std::back_inserter(intersections))); + } } - for (auto it = intersections.begin(); it != intersections.end(); it++) { - std::pair point_multiplicity; - CGAL::assign(point_multiplicity, *it); + for (auto point_multiplicity :intersections) { auto& point = point_multiplicity.first; if (point.location() == CGAL::ARR_INTERIOR) { auto xy = point.to_double(); diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp index f2d154c4eacb..ef0d027ab853 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp @@ -11,6 +11,8 @@ #include "IntersectCurves.h" #include "ArrangementTypes.h" +#include + template Intersect_curves::Intersect_curves(const Traits* traits) : @@ -18,12 +20,26 @@ Intersect_curves::Intersect_curves(const Traits* traits) : { } +struct Object_putter +{ + std::vector& v; + Object_putter(std::vector& v) + : v(v) + {} + + template + void operator()(const T& t) + { + v.push_back(make_object(t)); + } +}; + template void Intersect_curves::operator()( const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, std::vector& output) { - this->intersect(cv1, cv2, std::back_inserter(output)); + this->intersect(cv1, cv2, boost::make_function_output_iterator(Object_putter(output))); } ARRANGEMENT_DEMO_SPECIALIZE_TRAITS(Intersect_curves) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp index 438b8214908e..df21f6699ab9 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp @@ -625,14 +625,14 @@ operator()(const X_monotone_curve_2& curve, const CoordinateType& x, Point_2 p2c1(x, CoordinateType(clipRect.ymax() + 1)); const X_monotone_curve_2 verticalLine = ctr_xcv(p1c1, p2c1); - CGAL::Object o; - CGAL::Oneset_iterator oi(o); + std::vector pairs; - this->intersectCurves(curve, verticalLine, oi); + this->intersectCurves(curve, verticalLine, + CGAL::dispatch_or_drop_output(std::back_inserter(pairs))); IntersectionResult pair; - if (CGAL::assign(pair, o)) { - Point_2 pt = pair.first; + if (!pairs.empty()) { + Point_2 pt = pairs[0].first; res = pt.y(); } return res; @@ -654,14 +654,13 @@ operator()(const X_monotone_curve_2& curve, const CoordinateType& x, Point_2 p2c1(x, CoordinateType(10000000)); // upper bounding box const X_monotone_curve_2 verticalLine = ctr_xcv(p1c1, p2c1); - CGAL::Object o; - CGAL::Oneset_iterator oi(o); + std::vector pairs; - this->intersectCurves(curve, verticalLine, oi); + this->intersectCurves(curve, verticalLine, + CGAL::dispatch_or_drop_output(std::back_inserter(pairs))); - IntersectionResult pair; - if (CGAL::assign(pair, o)) { - Point_2 pt = pair.first; + if (!pairs.empty()) { + Point_2 pt = pairs[0].first; res = pt.y(); } return res; @@ -681,15 +680,15 @@ operator()(const X_monotone_curve_2& curve, const Coordinate_type& x) Point_2 p2c1(x, Coordinate_type(clip_rect.ymax() + 1)); const X_monotone_curve_2 vertical_line = ctr_xcv(p1c1, p2c1); - CGAL::Object o; - CGAL::Oneset_iterator oi(o); - this->intersect_curves(curve, vertical_line, oi); + std::vector pairs; + + this->intersect_curves(curve, vertical_line, + CGAL::dispatch_or_drop_output(std::back_inserter(pairs))); Coordinate_type res(0); - IntersectionResult pair; - if (CGAL::assign(pair, o)) { - Point_2 pt = pair.first; + if (!pairs.empty()) { + Point_2 pt = pairs[0].first; res = pt.y(); } return res; @@ -708,15 +707,15 @@ auto Arr_compute_y_at_x_2>:: operator()(const X_monotone_curve_2& curve, const CoordinateType& x) -> CoordinateType { - CGAL::Object o; - CGAL::Oneset_iterator oi(o); Intersect_2 intersect = traits->intersect_2_object(); X_monotone_curve_2 c2 = this->makeVerticalLine(x); - intersect(curve, c2, oi); - std::pair res; - if (CGAL::assign(res, o)) { + typedef std::pair PtM; + + std::vector res; + intersect(curve, c2, CGAL::dispatch_or_drop_output(std::back_inserter(res))); + if (!res.empty()) { // TODO: handle failure case - const Point_2& p = res.first; + const Point_2& p = res[0].first; CoordinateType coord = p.y(); return coord; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index 488ed21dea79..50433fe8724e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -826,7 +826,7 @@ class Arr_polycurve_traits_2 : std::get_if(&xection); if (subcv_p != nullptr) { ocv.push_back(*subcv_p); - oi = output_ocv (ocv, invert_ocv, oi); + output_ocv (ocv, invert_ocv, oi); continue; } @@ -883,7 +883,7 @@ class Arr_polycurve_traits_2 : // An overlap occurred at the previous iteration: // Output the overlapping polycurve. CGAL_assertion(ocv.size() > 0); - oi = output_ocv (ocv, invert_ocv, oi); + output_ocv (ocv, invert_ocv, oi); } else { // The left point of the current subcurve of one @@ -929,7 +929,7 @@ class Arr_polycurve_traits_2 : // Output the remaining overlapping polycurve, if necessary. if (ocv.size() > 0) { - oi = output_ocv (ocv, invert_ocv, oi); + output_ocv (ocv, invert_ocv, oi); } else if (right_coincides) { typedef std::pair return_point; From 3cef94d401ffe247010bf1a814cacacb1ab80186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 4 Aug 2023 22:12:58 +0200 Subject: [PATCH 0589/1398] make the output iterator movable restore changes in Arr_polycurve_traits_2 --- .../Arrangement_on_surface_2/Utils/IntersectCurves.cpp | 8 ++++---- .../include/CGAL/Arr_polycurve_traits_2.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp index ef0d027ab853..5e98113dabc5 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/IntersectCurves.cpp @@ -22,15 +22,15 @@ Intersect_curves::Intersect_curves(const Traits* traits) : struct Object_putter { - std::vector& v; - Object_putter(std::vector& v) - : v(v) + std::reference_wrapper> v; + Object_putter(std::vector& v_) + : v(std::ref(v_)) {} template void operator()(const T& t) { - v.push_back(make_object(t)); + v.get().push_back(make_object(t)); } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h index 50433fe8724e..488ed21dea79 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_polycurve_traits_2.h @@ -826,7 +826,7 @@ class Arr_polycurve_traits_2 : std::get_if(&xection); if (subcv_p != nullptr) { ocv.push_back(*subcv_p); - output_ocv (ocv, invert_ocv, oi); + oi = output_ocv (ocv, invert_ocv, oi); continue; } @@ -883,7 +883,7 @@ class Arr_polycurve_traits_2 : // An overlap occurred at the previous iteration: // Output the overlapping polycurve. CGAL_assertion(ocv.size() > 0); - output_ocv (ocv, invert_ocv, oi); + oi = output_ocv (ocv, invert_ocv, oi); } else { // The left point of the current subcurve of one @@ -929,7 +929,7 @@ class Arr_polycurve_traits_2 : // Output the remaining overlapping polycurve, if necessary. if (ocv.size() > 0) { - output_ocv (ocv, invert_ocv, oi); + oi = output_ocv (ocv, invert_ocv, oi); } else if (right_coincides) { typedef std::pair return_point; From 61874d15e1ce69dbae099ff584c8639a35a0c18a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 08:36:44 +0200 Subject: [PATCH 0590/1398] do not use deprecated code --- .../Arrangement_on_surface_2/Traits_test.h | 44 +++++++++---------- Mesh_3/test/Mesh_3/test_meshing_utilities.h | 4 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h index fe340b4a88cd..3331200a6076 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_test.h @@ -733,7 +733,7 @@ min_vertex_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; Point_2& exp_answer = this->m_points[id2]; - std::cout << "Test: min_vertex( " << CGAL::oformat(this->m_xcurves[id1]) << " ) ? " + std::cout << "Test: min_vertex( " << CGAL::IO::oformat(this->m_xcurves[id1]) << " ) ? " << exp_answer << " "; Point_2 real_answer = @@ -751,7 +751,7 @@ max_vertex_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; Point_2& exp_answer = this->m_points[id2]; - std::cout << "Test: max_vertex( " << CGAL::oformat(this->m_xcurves[id1]) << " ) ? " + std::cout << "Test: max_vertex( " << CGAL::IO::oformat(this->m_xcurves[id1]) << " ) ? " << exp_answer << " "; Point_2 real_answer = @@ -767,7 +767,7 @@ is_vertical_wrapper(std::istringstream& str_stream) unsigned int id; str_stream >> id; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: is_vertical( " << CGAL::oformat(this->m_xcurves[id]) << " ) ? " + std::cout << "Test: is_vertical( " << CGAL::IO::oformat(this->m_xcurves[id]) << " ) ? " << exp_answer << " "; bool real_answer = @@ -789,7 +789,7 @@ compare_y_at_x_wrapper(std::istringstream& str_stream) str_stream >> id1 >> id2; unsigned int exp_answer = this->get_expected_enum(str_stream); std::cout << "Test: compare_y_at_x( " << this->m_points[id1] << "," - << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; + << CGAL::IO::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; unsigned int real_answer = this->m_geom_traits.compare_y_at_x_2_object()(this->m_points[id1], @@ -853,8 +853,8 @@ compare_y_at_x_right_wrapper(std::istringstream& str_stream) unsigned int id1, id2, id3; str_stream >> id1 >> id2 >> id3; unsigned int exp_answer = this->get_expected_enum(str_stream); - std::cout << "Test: compare_y_at_x_right( " << CGAL::oformat(this->m_xcurves[id1]) << "," - << CGAL::oformat(this->m_xcurves[id2]) << ", " << this->m_points[id3] << " ) ? " + std::cout << "Test: compare_y_at_x_right( " << CGAL::IO::oformat(this->m_xcurves[id1]) << "," + << CGAL::IO::oformat(this->m_xcurves[id2]) << ", " << this->m_points[id3] << " ) ? " << exp_answer << " "; unsigned int real_answer = @@ -891,8 +891,8 @@ equal_curves_wrapper(std::istringstream& str_stream) unsigned int id1, id2; str_stream >> id1 >> id2; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: equal( " << CGAL::oformat(this->m_xcurves[id1]) << ", " - << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; + std::cout << "Test: equal( " << CGAL::IO::oformat(this->m_xcurves[id1]) << ", " + << CGAL::IO::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; bool real_answer = this->m_geom_traits.equal_2_object()(this->m_xcurves[id1], this->m_xcurves[id2]); @@ -918,7 +918,7 @@ make_x_monotone_wrapper(std::istringstream& str_stream) unsigned int id; str_stream >> id; - std::cout << "Test: make_x_monotone( " << CGAL::oformat(this->m_curves[id]) << " ) ? "; + std::cout << "Test: make_x_monotone( " << CGAL::IO::oformat(this->m_curves[id]) << " ) ? "; std::vector objs; this->m_geom_traits.make_x_monotone_2_object()(this->m_curves[id], std::back_inserter(objs)); @@ -979,8 +979,8 @@ intersect_wrapper(std::istringstream& str_stream) this->m_xcurves[id2], std::back_inserter(xections)); - std::cout << "Test: intersect( " << CGAL::oformat(this->m_xcurves[id1]) << "," - << CGAL::oformat(this->m_xcurves[id2]) << " ) ? "; + std::cout << "Test: intersect( " << CGAL::IO::oformat(this->m_xcurves[id1]) << "," + << CGAL::IO::oformat(this->m_xcurves[id2]) << " ) ? "; size_t num; str_stream >> num; if (! this->compare(num, xections.size(), "size")) return false; @@ -1031,7 +1031,7 @@ bool Traits_test::split_wrapper(std::istringstream& str_stream) unsigned int id1, id2, id3, id4; str_stream >> id1 >> id2 >> id3 >> id4; X_monotone_curve_2 cv1, cv2; - std::cout << "Test: split( " << CGAL::oformat(this->m_xcurves[id1]) << "," + std::cout << "Test: split( " << CGAL::IO::oformat(this->m_xcurves[id1]) << "," << this->m_points[id2] << " ) ? "; this->m_geom_traits.split_2_object()(this->m_xcurves[id1], @@ -1069,8 +1069,8 @@ are_mergeable_wrapper_imp(std::istringstream& str_stream, CGAL::Tag_true) unsigned int id1, id2; str_stream >> id1 >> id2; bool exp_answer = this->get_expected_boolean(str_stream); - std::cout << "Test: are_mergeable( " << CGAL::oformat(this->m_xcurves[id1]) << ", " - << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; + std::cout << "Test: are_mergeable( " << CGAL::IO::oformat(this->m_xcurves[id1]) << ", " + << CGAL::IO::oformat(this->m_xcurves[id2]) << " ) ? " << exp_answer << " "; bool real_answer = this->m_geom_traits.are_mergeable_2_object()(this->m_xcurves[id1], @@ -1107,8 +1107,8 @@ Traits_test::merge_wrapper_imp(std::istringstream& str_stream, unsigned int id1, id2, id; str_stream >> id1 >> id2 >> id; X_monotone_curve_2 cv; - std::cout << "Test: merge( " << CGAL::oformat(this->m_xcurves[id1]) << ", " - << CGAL::oformat(this->m_xcurves[id2]) << " ) ? " << CGAL::oformat(this->m_xcurves[id]) << " "; + std::cout << "Test: merge( " << CGAL::IO::oformat(this->m_xcurves[id1]) << ", " + << CGAL::IO::oformat(this->m_xcurves[id2]) << " ) ? " << CGAL::IO::oformat(this->m_xcurves[id]) << " "; this->m_geom_traits.merge_2_object()(this->m_xcurves[id1], this->m_xcurves[id2], cv); @@ -1181,7 +1181,7 @@ parameter_space_in_x_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = CGAL::ARR_MIN_END; if (curves_op) { cv_end = static_cast(next_input.second); - std::cout << "Test: parameter_space_x( " << CGAL::oformat(this->m_xcurves[id]) << " , " + std::cout << "Test: parameter_space_x( " << CGAL::IO::oformat(this->m_xcurves[id]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1248,8 +1248,8 @@ compare_y_near_boundary_wrapper_imp(std::istringstream& str_stream, assert(next_input.first == Base::CURVE_END); CGAL::Arr_curve_end cv_end = static_cast(next_input.second); - std::cout << "Test: compare_y_near_boundary( " << CGAL::oformat(this->m_xcurves[id1]) - << " , " << CGAL::oformat(this->m_xcurves[id2]) << " , " + std::cout << "Test: compare_y_near_boundary( " << CGAL::IO::oformat(this->m_xcurves[id1]) + << " , " << CGAL::IO::oformat(this->m_xcurves[id2]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1309,7 +1309,7 @@ parameter_space_in_y_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = CGAL::ARR_MIN_END; if (curves_op) { cv_end = static_cast(next_input.second); - std::cout << "Test: parameter_space_y( " << CGAL::oformat(this->m_xcurves[id]) << " , " + std::cout << "Test: parameter_space_y( " << CGAL::IO::oformat(this->m_xcurves[id]) << " , " << (cv_end == CGAL::ARR_MIN_END ? "MIN_END" : "MAX_END") << " ) ? "; next_input = this->get_next_input(str_stream); @@ -1381,8 +1381,8 @@ compare_x_near_boundary_wrapper_imp(std::istringstream& str_stream, CGAL::Arr_curve_end cv_end = static_cast(next_input.second); - std::cout << CGAL::oformat(this->m_xcurves[id1]) << ", " - << CGAL::oformat(this->m_xcurves[id2]) << " , " + std::cout << CGAL::IO::oformat(this->m_xcurves[id1]) << ", " + << CGAL::IO::oformat(this->m_xcurves[id2]) << " , " << this->curve_end_str(cv_end) << " ) ? "; next_input = this->get_next_input(str_stream); diff --git a/Mesh_3/test/Mesh_3/test_meshing_utilities.h b/Mesh_3/test/Mesh_3/test_meshing_utilities.h index a0ceda5d3b9b..2e7571eb41d3 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_utilities.h +++ b/Mesh_3/test/Mesh_3/test_meshing_utilities.h @@ -333,13 +333,13 @@ struct Tester else { std::cerr << "\nc1 circumcenter: " << tr.dual(c1); std::cerr << "\nc1 is in domain: " - << CGAL::oformat(domain.is_in_domain_object()(tr.dual(c1))); + << CGAL::IO::oformat(domain.is_in_domain_object()(tr.dual(c1))); } if(tr.is_infinite(c2)) std::cerr << "\nc2 is infinite"; else { std::cerr << "\nc2 circumcenter: "<< tr.dual(c2); std::cerr << "\nc2 is in domain: " - << CGAL::oformat(domain.is_in_domain_object()(tr.dual(c2))); + << CGAL::IO::oformat(domain.is_in_domain_object()(tr.dual(c2))); } std::cerr << std::endl; assert(false); From 6b24eed462b9632496d3889f2aa38460f6d72b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 08:46:34 +0200 Subject: [PATCH 0591/1398] try resolving ambiguity --- .../include/CGAL/Arr_point_location/Td_active_edge.h | 4 ++-- .../CGAL/Arr_point_location/Td_active_trapezoid.h | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h index c1a177e5ab62..f08890e46239 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h @@ -147,7 +147,7 @@ class Td_active_edge : public Handle /*! Initialize the trapezoid's neighbors. */ inline void init_neighbors(std::optional> next) { - set_next((next) ? *next : Td_map_item(0)); + set_next((next) ? next->get() : Td_map_item(0)); } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ @@ -202,7 +202,7 @@ class Td_active_edge : public Handle std::optional> next = std::nullopt) { - PTR = new Data(he, (next) ? *next : Td_map_item(0), node); + PTR = new Data(he, (next) ? next->get() : Td_map_item(0), node); //m_dag_node = node; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h index f226db992d9c..6b9486e4e605 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h @@ -166,10 +166,10 @@ class Td_active_trapezoid : public Handle inline void init_neighbors(std::optional> lb, std::optional> lt, std::optional> rb, std::optional> rt) { - set_lb((lb) ? *lb : Td_map_item(0)); - set_lt((lt) ? *lt : Td_map_item(0)); - set_rb((rb) ? *rb : Td_map_item(0)); - set_rt((rt) ? *rt : Td_map_item(0)); + set_lb((lb) ? lb->get() : Td_map_item(0)); + set_lt((lt) ? lt->get() : Td_map_item(0)); + set_rb((rb) ? rb->get() : Td_map_item(0)); + set_rt((rt) ? rt->get() : Td_map_item(0)); } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ @@ -273,8 +273,8 @@ class Td_active_trapezoid : public Handle std::optional> rt = std::nullopt, Dag_node* node = 0) { - PTR = new Data (l, r, b, t, (lb) ? *lb : Td_map_item(0), (lt) ? *lt : Td_map_item(0), - (rb) ? *rb : Td_map_item(0), (rt) ? *rt : Td_map_item(0), node); + PTR = new Data (l, r, b, t, (lb) ? lb->get() : Td_map_item(0), (lt) ? lt->get() : Td_map_item(0), + (rb) ? rb->get() : Td_map_item(0), (rt) ? rt->get() : Td_map_item(0), node); //m_dag_node = node; } From 10c1796c2a0c88ca400fa596dc9254e3e8a9f42b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 08:49:42 +0200 Subject: [PATCH 0592/1398] fix unused variable warnings --- .../test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp | 4 ++-- .../test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp | 4 ++-- .../test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp index b34ca8c29098..5a0da9d01650 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp @@ -50,8 +50,8 @@ int main() for (Scalar y = step; y < limit; y += step) { const Point point(x, y); - const Output_type tri_result = triangle_coordinates(point, tri_coordinates); - const Output_type dh_result = discrete_harmonic_coordinates(point, old_coordinates); + /* const Output_type tri_result = */triangle_coordinates(point, tri_coordinates); + /* const Output_type dh_result = */discrete_harmonic_coordinates(point, old_coordinates); CGAL::Barycentric_coordinates::discrete_harmonic_coordinates_2( vertices, point, std::back_inserter(new_coordinates)); diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp index c4bac5497a4e..50cbb51b97bb 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp @@ -53,8 +53,8 @@ int main() for (Scalar y = step; y < limit; y += step) { const Point point(x, y); - const Output_type tri_result = triangle_coordinates(point, tri_coordinates); - const Output_type mv_result = mean_value_coordinates(point, old_coordinates); + /* const Output_type tri_result = */triangle_coordinates(point, tri_coordinates); + /* const Output_type mv_result = */mean_value_coordinates(point, old_coordinates); CGAL::Barycentric_coordinates::mean_value_coordinates_2( vertices, point, std::back_inserter(new_coordinates)); diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp index ae349dffb76c..eb4c47ec2b57 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp @@ -51,8 +51,8 @@ int main() for (Scalar y = step; y < limit; y += step) { const Point point(x, y); - const Output_type tri_result = triangle_coordinates(point, tri_coordinates); - const Output_type wp_result = wachspress_coordinates(point, old_coordinates); + /* const Output_type tri_result = */triangle_coordinates(point, tri_coordinates); + /* const Output_type wp_result = */wachspress_coordinates(point, old_coordinates); CGAL::Barycentric_coordinates::wachspress_coordinates_2( vertices, point, std::back_inserter(new_coordinates)); From b7cebad9d31c94c7a9e58c2fdc5f0a402724f8c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 08:56:50 +0200 Subject: [PATCH 0593/1398] do not use deprecated API --- CGAL_ipelets/demo/CGAL_ipelets/hyperbolic.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/CGAL_ipelets/demo/CGAL_ipelets/hyperbolic.cpp b/CGAL_ipelets/demo/CGAL_ipelets/hyperbolic.cpp index e0725a743e9f..795375437fac 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/hyperbolic.cpp +++ b/CGAL_ipelets/demo/CGAL_ipelets/hyperbolic.cpp @@ -209,16 +209,14 @@ void hyperbolicIpelet::protected_run(int fn) } // clip circ by poincare - std::vector< CGAL::Object > result; Kernel::Circular_arc_point_2 L,R; - std::pair the_pair; + typedef std::pair The_pair; + std::vector result; - CGAL::intersection(circ, poincare, std::back_inserter(result)); + CGAL::intersection(circ, poincare, CGAL::dispatch_or_drop_output(std::back_inserter(result))); assert (result.size()==2); - assign(the_pair, result[0]); - L = the_pair.first; - assign(the_pair, result[1]); - R = the_pair.first; + L = result[0].first; + R = result[1].first; Point_2 LL(CGAL::to_double(L.x()),CGAL::to_double(L.y())); Point_2 RR(CGAL::to_double(R.x()),CGAL::to_double(R.y())); assert( LL.x() <= RR.x()); From 99066b43638c1b92cd13d56149878abfa7f65cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 08:59:26 +0200 Subject: [PATCH 0594/1398] hide unused type --- Kernel_23/examples/Kernel_23/MyKernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel_23/examples/Kernel_23/MyKernel.cpp b/Kernel_23/examples/Kernel_23/MyKernel.cpp index 13eec454b3dc..834a22629b87 100644 --- a/Kernel_23/examples/Kernel_23/MyKernel.cpp +++ b/Kernel_23/examples/Kernel_23/MyKernel.cpp @@ -56,7 +56,7 @@ int main() K::Intersect_2 intersection; - const auto intersect = intersection(s1, s2); + /* const auto intersect = */intersection(s1, s2); K::Construct_cartesian_const_iterator_2 construct_it; K::Cartesian_const_iterator_2 cit = construct_it(a); From 71347f28a8bba6002dfb02c7b063f1a90df372b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 9 Aug 2023 09:00:38 +0200 Subject: [PATCH 0595/1398] remove unused variable --- .../test_corefinement_and_constraints.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp index 7642f81f4939..6508c4533375 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_corefinement_and_constraints.cpp @@ -165,7 +165,6 @@ void test_bool_op_no_copy( assert( count_constrained_edges(tm2, ecm2)==307 ); typedef std::optional OTM; - Triangle_mesh *ptr = nullptr; const std::array output = reverse ? CGAL::make_array(OTM(&tm2), OTM(&tm1), std::optional(), std::optional()) : CGAL::make_array(OTM(&tm1), OTM(&tm2), std::optional(), std::optional()); From 6b62d1d9b40d765462fa79bbee6baee04b243f00 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 9 Aug 2023 10:48:54 +0300 Subject: [PATCH 0596/1398] Introduced is_intersection_valid() to check the validity of a new intersection point. Perhaps, a similar fix is required for validity of overlapping intersections --- .../Arrangement_2/Arrangement_zone_2_impl.h | 106 +++++++++--------- .../include/CGAL/Arrangement_zone_2.h | 21 +++- 2 files changed, 72 insertions(+), 55 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index feb429273eec..dfb8851479fd 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -137,7 +137,7 @@ void Arrangement_zone_2::compute_zone() if (m_found_overlap) { // In this case m_cv overlaps the curve associated with m_intersect_he. // Compute the overlapping subcurve. - bool dummy; + Arr_parameter_space dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); m_overlap_cv = boost::get(*obj); @@ -153,7 +153,7 @@ void Arrangement_zone_2::compute_zone() // overlaps the curve associated with this edge. m_intersect_he = m_arr.non_const_handle(*hh); - bool dummy; + Arr_parameter_space dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); m_overlap_cv = boost::get(*obj); @@ -211,7 +211,7 @@ void Arrangement_zone_2::compute_zone() if (m_found_overlap) { // In this case m_cv overlaps the curve associated with m_intersect_he. // Compute the overlapping subcurve to the right of curr_v. - bool dummy; + Arr_parameter_space dummy; auto obj = _compute_next_intersection(m_intersect_he, false, dummy); m_overlap_cv = boost::get(*obj); @@ -505,6 +505,37 @@ _direct_intersecting_edge_to_left(const X_monotone_curve_2& cv_ins, } } +//----------------------------------------------------------------------------- +template +bool Arrangement_zone_2:: +is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& /* intersection_location */, + Arr_all_sides_oblivious_tag) const +{ return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); } + +template +bool Arrangement_zone_2:: +is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& intersection_location, + Arr_not_all_sides_oblivious_tag) const { + auto equal = m_geom_traits->equal_2_object(); + if (m_left_on_boundary) { + // The left-end lies on the left boundary. If the intersection point is not + // equal to the left-end, the intersection is valid, because it must lie to + // its right. + if (m_has_left_pt) return ! equal(ip, m_left_pt); + else return true; + } + if (m_has_right_pt && m_right_on_boundary && equal(ip, m_right_pt)) { + intersection_location = ARR_RIGHT_BOUNDARY; + return true; + } + + // We have a simple intersection point; + // make sure it lies to the right of m_left_pt. + return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); +} + //----------------------------------------------------------------------------- // Get the next intersection of cv with the given halfedge. // @@ -513,7 +544,7 @@ typename Arrangement_zone_2::Optional_intersection Arrangement_zone_2:: _compute_next_intersection(Halfedge_handle he, bool skip_first_point, - bool& intersection_on_right_boundary) + Arr_parameter_space& intersection_location) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_compute_next_intersection(" << he->curve() << ", " @@ -534,7 +565,7 @@ _compute_next_intersection(Halfedge_handle he, const X_monotone_curve_2* icv; bool valid_intersection; - intersection_on_right_boundary = false; + intersection_location = ARR_INTERIOR; if (iter != m_inter_map.end()) { // The intersections with the curve have already been computed. // Retrieve the intersections list from the map. @@ -548,25 +579,9 @@ _compute_next_intersection(Halfedge_handle he, // Compare that current object with m_left_pt (if exists). ip = boost::get(&(inter_list.front())); if (ip != nullptr) { - // We have an intersection point - if (m_left_on_boundary) { - // The left-end lies on the left boundary. If the intersection point - // is not equal to the left-end, the intersection is valid, because - // it must lie to its right. - if (m_has_left_pt) valid_intersection = ! equal(ip->first, m_left_pt); - else valid_intersection = true; - } - else if (m_has_right_pt && m_right_on_boundary && - equal(ip->first, m_right_pt)) - { - valid_intersection = true; - intersection_on_right_boundary = true; - } - else { - // We have a simple intersection point - make sure it lies to the - // right of m_left_pt. - valid_intersection = (compare_xy(ip->first, m_left_pt) == LARGER); - } + // We have an intersection point - + valid_intersection = + is_intersection_valid(ip->first, intersection_location); } else { // We have an overlapping subcurve. @@ -609,27 +624,11 @@ _compute_next_intersection(Halfedge_handle he, while (! inter_list.empty()) { // Compare that current object with m_left_pt (if exists). ip = boost::get(&(inter_list.front())); - if (ip != nullptr) { // We have an intersection point - // Check whether we need to skip the first intersection - if (is_first && skip_first_point) valid_intersection = false; - else if (m_left_on_boundary) { - // The left-end lies on the left boundary. If the intersection point - // is not equal to the left-end, the intersection is valid, because - // it must lie to its right. - if (m_has_left_pt) valid_intersection = ! equal(ip->first, m_left_pt); - else valid_intersection = true; - } - else if (m_right_on_boundary && m_has_right_pt && - equal(ip->first, m_right_pt)) - { - valid_intersection = true; - intersection_on_right_boundary = true; - } - else { - valid_intersection = (compare_xy(ip->first, m_left_pt) == LARGER); - } + valid_intersection = (is_first && skip_first_point) ? false : + is_intersection_valid(ip->first, intersection_location); } else if (m_left_on_boundary) { // The left end is on the boundary, so all overlapping curves are valid, @@ -768,7 +767,7 @@ _is_to_right_impl(const Point_2& p, Halfedge_handle he, template void Arrangement_zone_2:: _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, - bool& leftmost_on_right_boundary) + Arr_parameter_space& leftmost_location) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_leftmost_intersection(" << he_curr->curve() << ", " @@ -793,7 +792,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, // entirely to the right of m_intersect_p, its intersection with m_cv (if any) // cannot lie to the left of this point. We therefore do not need to compute // this intersection. - if (m_found_intersect && ! leftmost_on_right_boundary && + if (m_found_intersect && (leftmost_location != ARR_RIGHT_BOUNDARY) && _is_to_left(m_intersect_p, he_curr)) return; @@ -821,13 +820,14 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, // do not intersect. if (! left_equals_curr_endpoint && ((! m_left_on_boundary && _is_to_right(m_left_pt, he_curr)) || - ! is_in_x_range(m_cv, he_curr->curve()))) + ! is_in_x_range(m_cv, he_curr->curve()))) { return; + } // Compute the next intersection of m_cv and the current halfedge. - bool intersection_on_right_boundary; + Arr_parameter_space intersection_location; auto iobj = _compute_next_intersection(he_curr, left_equals_curr_endpoint, - intersection_on_right_boundary); + intersection_location); if (iobj) { // We have found an intersection (either a simple point or an @@ -839,8 +839,8 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, // Found a simple intersection point. Check if it is the leftmost // intersection point so far. if (! m_found_intersect || - (! intersection_on_right_boundary && - (leftmost_on_right_boundary || + ((intersection_location != ARR_RIGHT_BOUNDARY) && + ((leftmost_location == ARR_RIGHT_BOUNDARY) || compare_xy(ip, m_intersect_p) == SMALLER))) { // Store the leftmost intersection point and the halfedge handle. @@ -848,7 +848,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, m_ip_multiplicity = int_p->second; m_intersect_he = he_curr; m_found_overlap = false; - leftmost_on_right_boundary = intersection_on_right_boundary; + leftmost_location = intersection_location; } } else { @@ -895,7 +895,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) auto compare_xy = m_geom_traits->compare_xy_2_object(); auto is_in_x_range = m_geom_traits->is_in_x_range_2_object(); - bool leftmost_on_right_boundary = false; + Arr_parameter_space leftmost_location = ARR_INTERIOR; // Traverse the face outer-boundaries; iterate through all outer CCBs. for (auto occb_it = face->outer_ccbs_begin(); @@ -903,7 +903,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) { Ccb_halfedge_circulator he_first = *occb_it; Ccb_halfedge_circulator he_curr = he_first; - do _leftmost_intersection(he_curr, on_boundary, leftmost_on_right_boundary); + do _leftmost_intersection(he_curr, on_boundary, leftmost_location); while (++he_curr != he_first); } @@ -913,7 +913,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) { Ccb_halfedge_circulator he_first = *iccb_it; Ccb_halfedge_circulator he_curr = he_first; - do _leftmost_intersection(he_curr, on_boundary, leftmost_on_right_boundary); + do _leftmost_intersection(he_curr, on_boundary, leftmost_location); while (++he_curr != he_first); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 81f1c8bad04f..71b5e4a74092 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -336,7 +336,7 @@ class Arrangement_zone_2 { Optional_intersection _compute_next_intersection(Halfedge_handle he, bool skip_first_point, - bool& intersect_on_right_boundary); + Arr_parameter_space& intersection_location); /*! Remove the next intersection of m_cv with the given halfedge from the map. * \param he A handle to the halfedge. @@ -394,12 +394,29 @@ class Arrangement_zone_2 { bool _is_to_right_impl(const Point_2& p, Halfedge_handle he, Arr_not_all_sides_oblivious_tag) const; + /*! Check whether an intersection point is valid. A valid intersection point + * must be to the left of the left end of the curve involved. + */ + bool is_intersection_valid(const Point_2& ip, + Arr_parameter_space& intersection_location) const { + return is_intersection_valid_impl(ip, intersection_location, + Are_all_sides_oblivious_category()); + } + + bool is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& intersection_location, + Arr_all_sides_oblivious_tag) const; + + bool is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& intersection_location, + Arr_not_all_sides_oblivious_tag) const; + /*! Compute the (lexicographically) leftmost intersection of the query * curve with a given halfedge on the boundary of a face in the arrangement. */ void _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, - bool& leftmost_on_right_boundary); + Arr_parameter_space& leftmost_location); /*! Compute the (lexicographically) leftmost intersection of the query * curve with the boundary of a given face in the arrangement. From a9625eb17cfd5da8f96686ac6cb122645f4caa0f Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 9 Aug 2023 14:03:14 +0300 Subject: [PATCH 0597/1398] Enhanced drawing---added support for arrangement on spheres indiced by geodesic arcs --- .../include/CGAL/draw_arrangement_2.h | 240 ++++++++++++++---- 1 file changed, 193 insertions(+), 47 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h index c7637f04b919..76e2eaf32832 100644 --- a/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/include/CGAL/draw_arrangement_2.h @@ -29,7 +29,9 @@ #include #include +#include #include +#include namespace CGAL { @@ -46,32 +48,32 @@ struct Default_color_generator { }; // Viewer class for`< Polygon_2 -template -class Arr_2_basic_viewer_qt : public Basic_viewer_qt { - using Arr = Arrangement_2_; +class Aos_2_basic_viewer_qt : public Basic_viewer_qt { + using Aos = ArrangementOnSurface_2; using Color_generator = ColorGenerator; using Base = Basic_viewer_qt; - using Gt = typename Arr::Geometry_traits_2; - using Point = typename Arr::Point_2; - using X_monotone_curve = typename Arr::X_monotone_curve_2; - using Vertex_const_handle = typename Arr::Vertex_const_handle; - using Halfedge_const_handle = typename Arr::Halfedge_const_handle; - using Face_const_handle = typename Arr::Face_const_handle; + using Gt = typename Aos::Geometry_traits_2; + using Point = typename Aos::Point_2; + using X_monotone_curve = typename Aos::X_monotone_curve_2; + using Vertex_const_handle = typename Aos::Vertex_const_handle; + using Halfedge_const_handle = typename Aos::Halfedge_const_handle; + using Face_const_handle = typename Aos::Face_const_handle; using Ccb_halfedge_const_circulator = - typename Arr::Ccb_halfedge_const_circulator; + typename Aos::Ccb_halfedge_const_circulator; public: /// Construct the viewer. /// @param arr the arrangement to view /// @param title the title of the window - Arr_2_basic_viewer_qt(QWidget* parent, const Arr& arr, + Aos_2_basic_viewer_qt(QWidget* parent, const Aos& aos, Color_generator color_generator, const char* title = "2D Arrangement Basic Viewer", bool draw_vertices = false) : // First draw: vertices; edges, faces; multi-color; no inverse normal Base(parent, title, draw_vertices, true, true, false, false), - m_arr(arr), + m_aos(aos), m_color_generator(color_generator) { // mimic the computation of Camera::pixelGLRatio() @@ -154,32 +156,47 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { */ CGAL::Bbox_2 bounding_box() { CGAL::Bbox_2 bbox; - const auto* traits = this->m_arr.geometry_traits(); + const auto* traits = this->m_aos.geometry_traits(); // At this point we assume that the arrangement is not open, and thus the // bounding box is defined by the vertices. - for (auto it = m_arr.vertices_begin(); it != m_arr.vertices_end(); ++it) + for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) bounding_box_impl1(bbox, it->point(), *traits, 0); return bbox; } + /*! Add all faces. + */ + template + void add_faces(const Traits&) { + for (auto it = m_aos.unbounded_faces_begin(); + it != m_aos.unbounded_faces_end(); ++it) + add_face(it); + } + + /*! Add all faces. + */ + template + void + add_faces(Arr_geodesic_arc_on_sphere_traits_2 const&) + { add_face(m_aos.faces_begin()); } + /*! Add all elements to be drawn. */ void add_elements() { + // std::cout << "add_elements()\n"; // std::cout << "ratio: " << this->pixel_ratio() << std::endl; clear(); m_visited.clear(); - if (m_arr.is_empty()) return; - for (auto it = m_arr.unbounded_faces_begin(); - it != m_arr.unbounded_faces_end(); ++it) - add_face(it); + if (m_aos.is_empty()) return; + add_faces(*(this->m_aos.geometry_traits())); - // Add edges that do not separe faces. - for (auto it = m_arr.edges_begin(); it != m_arr.edges_end(); ++it) + // Add edges that do not separate faces. + for (auto it = m_aos.edges_begin(); it != m_aos.edges_end(); ++it) if (it->face() == it->twin()->face()) draw_curve(it->curve()); // Add all points - for (auto it = m_arr.vertices_begin(); it != m_arr.vertices_end(); ++it) + for (auto it = m_aos.vertices_begin(); it != m_aos.vertices_end(); ++it) draw_point(it->point()); m_visited.clear(); @@ -190,11 +207,20 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { double pixel_ratio() const { return m_pixel_ratio; } protected: + template + Halfedge_const_handle + find_smallest(Ccb_halfedge_const_circulator circ, + Arr_geodesic_arc_on_sphere_traits_2 const&) + { return circ; } + /*! Find the halfedge incident to the lexicographically smallest vertex * along the CCB, such that there is no other halfedge underneath. */ - Halfedge_const_handle find_smallest(Ccb_halfedge_const_circulator circ) { - const auto* traits = this->m_arr.geometry_traits(); + template + Halfedge_const_handle find_smallest(Ccb_halfedge_const_circulator circ, + const Traits&) { + // std::cout << "find_smallest()\n"; + const auto* traits = this->m_aos.geometry_traits(); auto cmp_xy = traits->compare_xy_2_object(); auto cmp_y = traits->compare_y_at_x_right_2_object(); @@ -241,6 +267,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { template void draw_approximate_region(Halfedge_const_handle curr, const Approximate& approx) { + // std::cout << "draw_approximate_region()\n"; std::vector polyline; double error(this->pixel_ratio()); bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; @@ -258,7 +285,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { */ template void draw_exact_curve(const XMonotoneCurve& curve) { - const auto* traits = this->m_arr.geometry_traits(); + const auto* traits = this->m_aos.geometry_traits(); auto ctr_min = traits->construct_min_vertex_2_object(); auto ctr_max = traits->construct_max_vertex_2_object(); this->add_segment(ctr_min(curve), ctr_max(curve)); @@ -267,7 +294,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { /*! Draw an exact region. */ void draw_exact_region(Halfedge_const_handle curr) { - this->add_point_in_face(curr->source()->point()); + // this->add_point_in_face(curr->source()->point()); draw_exact_curve(curr->curve()); } @@ -300,9 +327,46 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { { draw_approximate_region(curr, traits.approximate_2_object()); } #endif + template + void draw_region_impl1 + (Halfedge_const_handle curr, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) { + // std::cout << "draw_region_impl1()\n"; + auto approx = traits.approximate_2_object(); + using Kernel = Kernel_; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Ap = typename Traits::Approximate_point_2; + using Approx_point_3 = typename Ak::Point_3; + + std::vector polyline; + double error(0.01); + bool l2r = curr->direction() == ARR_LEFT_TO_RIGHT; + approx(curr->curve(), error, std::back_inserter(polyline), l2r); + if (polyline.empty()) return; + auto it = polyline.begin(); + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 prev(x/l, y/l, z/l); + for (++it; it != polyline.end(); ++it) { + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 next(x/l, y/l, z/l); + this->add_segment(prev, next); + prev = next; + // this->add_point_in_face(*prev); + } + } + /*! Draw a region. */ void draw_region(Ccb_halfedge_const_circulator circ) { + // std::cout << "draw_region()\n"; /* Check whether the traits has a member function called * approximate_2_object() and if so check whether the return type, namely * `Approximate_2` has an appropriate operator. @@ -321,8 +385,8 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { auto color = m_color_generator(circ->face()); this->face_begin(color); - const auto* traits = this->m_arr.geometry_traits(); - auto ext = find_smallest(circ); + const auto* traits = this->m_aos.geometry_traits(); + auto ext = find_smallest(circ, *traits); auto curr = ext; do { @@ -382,6 +446,37 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { { draw_approximate_curve(xcv, traits.approximate_2_object()); } #endif + template + void draw_curve_impl1 + (const X_monotone_curve& xcv, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) { + auto approx = traits.approximate_2_object(); + using Kernel = Kernel_; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Ap = typename Traits::Approximate_point_2; + using Approx_point_3 = typename Ak::Point_3; + std::vector apoints; + double error(0.01); + approx(xcv, error, std::back_inserter(apoints)); + auto it = apoints.begin(); + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 prev(x/l, y/l, z/l); + for (++it; it != apoints.end(); ++it) { + auto x = it->dx(); + auto y = it->dy(); + auto z = it->dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 next(x/l, y/l, z/l); + this->add_segment(prev, next); + prev = next; + } + } + /*! Draw a curve. */ template @@ -404,14 +499,14 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { #if 0 if constexpr (std::experimental::is_detected_v) { - const auto* traits = this->m_arr.geometry_traits(); + const auto* traits = this->m_aos.geometry_traits(); auto approx = traits->approximate_2_object(); draw_approximate_curve(curve, approx); return; } draw_exact_curve(curve); #else - const auto* traits = this->m_arr.geometry_traits(); + const auto* traits = this->m_aos.geometry_traits(); draw_curve_impl1(curve, *traits, 0); #endif } @@ -442,16 +537,35 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { { add_point(traits.approximate_2_object()(p)); } #endif + template + void draw_point_impl1 + (const Point& p, + Arr_geodesic_arc_on_sphere_traits_2 const& traits, + int) { + auto approx = traits.approximate_2_object(); + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using Ak = typename Traits::Approximate_kernel; + using Approx_point_3 = typename Ak::Point_3; + auto ap = approx(p); + auto x = ap.dx(); + auto y = ap.dy(); + auto z = ap.dz(); + auto l = std::sqrt(x*x + y*y + z*z); + Approx_point_3 p3(x/l, y/l, z/l); + add_point(p3); + } + /*! Draw a point. */ void draw_point(const Point& p) { - const auto* traits = m_arr.geometry_traits(); + const auto* traits = m_aos.geometry_traits(); draw_point_impl1(p, *traits, 0); } /*! Add a Connected Component of the Boundary. */ void add_ccb(Ccb_halfedge_const_circulator circ) { + // std::cout << "add_ccb()\n"; auto curr = circ; do { auto new_face = curr->twin()->face(); @@ -464,8 +578,9 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { /*! Add a face. */ void add_face(Face_const_handle face) { - using Inner_ccb_const_iterator = typename Arr::Inner_ccb_const_iterator; - using Outer_ccb_const_iterator = typename Arr::Outer_ccb_const_iterator; + // std::cout << "add_face()\n"; + using Inner_ccb_const_iterator = typename Aos::Inner_ccb_const_iterator; + using Outer_ccb_const_iterator = typename Aos::Outer_ccb_const_iterator; for (Inner_ccb_const_iterator it = face->inner_ccbs_begin(); it != face->inner_ccbs_end(); ++it) @@ -505,7 +620,7 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { double m_pixel_ratio = 1; //! The arrangement to draw. - const Arr& m_arr; + const Aos& m_aos; //! The color generator. Color_generator m_color_generator; @@ -514,32 +629,63 @@ class Arr_2_basic_viewer_qt : public Basic_viewer_qt { }; //! Basic viewer of a 2D arrangement. -template -class Arr_2_viewer_qt : public Arr_2_basic_viewer_qt { public: - using Arr = Arrangement_2_; + using Aos = ArrangementOnSurface_2; using Color_generator = ColorGenerator; - using Base = Arr_2_basic_viewer_qt; - using Point = typename Arr::Point_2; - using X_monotone_curve = typename Arr::X_monotone_curve_2; - using Halfedge_const_handle = typename Arr::Halfedge_const_handle; - using Face_const_handle = typename Arr::Face_const_handle; + using Base = Aos_2_basic_viewer_qt; + using Point = typename Aos::Point_2; + using X_monotone_curve = typename Aos::X_monotone_curve_2; + using Halfedge_const_handle = typename Aos::Halfedge_const_handle; + using Face_const_handle = typename Aos::Face_const_handle; using Ccb_halfedge_const_circulator = - typename Arr::Ccb_halfedge_const_circulator; + typename Aos::Ccb_halfedge_const_circulator; /// Construct the viewer. /// @param arr the arrangement to view /// @param title the title of the window - Arr_2_viewer_qt(QWidget* parent, const Arr& arr, + Aos_2_viewer_qt(QWidget* parent, const Aos& aos, Color_generator color_generator, - const char* title = "2D Arrangement Basic Viewer", + const char* title = "2D Arrangement on Surface Basic Viewer", bool draw_vertices = false) : - Base(parent, arr, color_generator, title, draw_vertices) + Base(parent, aos, color_generator, title, draw_vertices) {} }; +/*! Draw an arrangement on surface. + */ +template +void draw(const Arrangement_on_surface_2& aos, + const char* title = "2D Arrangement on Surface Basic Viewer", + bool draw_vertices = false) { +#if defined(CGAL_TEST_SUITE) + bool cgal_test_suite=true; +#else + bool cgal_test_suite = qEnvironmentVariableIsSet("CGAL_TEST_SUITE"); +#endif + + if (cgal_test_suite) return; + using Gt = GeometryTraits_2; + using Tt = TopologyTraits; + using Aos = CGAL::Arrangement_on_surface_2; + using Viewer = Aos_2_viewer_qt; + + CGAL::Qt::init_ogl_context(4,3); + + int argc = 1; + const char* argv[2] = {"t2_viewer", nullptr}; + QApplication app(argc, const_cast(argv)); + Default_color_generator color_generator; + Viewer mainwindow(app.activeWindow(), aos, color_generator, title, + draw_vertices); + mainwindow.add_elements(); + mainwindow.show(); + app.exec(); +} + /*! Draw an arrangement. */ template @@ -555,7 +701,7 @@ void draw(const Arrangement_2& arr, if (cgal_test_suite) return; using Gt = GeometryTraits_2; using Arr = CGAL::Arrangement_2; - using Viewer = Arr_2_viewer_qt; + using Viewer = Aos_2_viewer_qt; CGAL::Qt::init_ogl_context(4,3); @@ -589,7 +735,7 @@ void draw(const Arrangement_2& arr, using Color_generator = ColorGenerator; using Gt = GeometryTraits_2; using Arr = CGAL::Arrangement_2; - using Viewer = Arr_2_viewer_qt; + using Viewer = Aos_2_viewer_qt; CGAL::Qt::init_ogl_context(4,3); From 46c42465706e397c031b5e15d1d70584afc6a913 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 9 Aug 2023 17:37:01 +0300 Subject: [PATCH 0598/1398] Cleaned up --- .../Arr_geodesic_arc_on_sphere_traits_2.h | 719 +++++++++--------- 1 file changed, 360 insertions(+), 359 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index 7a0a2eaa3af9..e3a934889bce 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -39,9 +39,86 @@ namespace CGAL { +/*! Represent an extended 3D direction that is used in turn to represent a + * spherical-arc endpoint. The extended data consists of two flags that + * indicate whether the point is on the x and on a y boundaries, + * respectively. + */ +template +class Arr_extended_direction_3 : public Kernel::Direction_3 { +public: + using FT = typename Kernel::FT; + using Direction_3 = typename Kernel::Direction_3; + + /*! Enumeration of discontinuity type */ + enum Location_type { + NO_BOUNDARY_LOC = 0, + MIN_BOUNDARY_LOC, + MID_BOUNDARY_LOC, + MAX_BOUNDARY_LOC + }; + +private: + using Direction_2 = typename Kernel::Direction_2; + + //! The point discontinuity type + Location_type m_location; + + inline Sign x_sign(Direction_3 d) const { return CGAL::sign(d.dx()); } + + inline Sign y_sign(Direction_3 d) const { return CGAL::sign(d.dy()); } + + inline Sign z_sign(Direction_3 d) const { return CGAL::sign(d.dz()); } + +public: + /*! Default constructor */ + Arr_extended_direction_3() : + Direction_3(0, 0, 1), + m_location(MAX_BOUNDARY_LOC) + {} + + /*! Constructor */ + Arr_extended_direction_3(const Direction_3& dir, Location_type location) : + Direction_3(dir), + m_location(location) + {} + + /*! Copy constructor */ + Arr_extended_direction_3(const Arr_extended_direction_3& other) : + Direction_3(static_cast(other)) + { m_location = other.discontinuity_type(); } + + /*! Assignment operator */ + Arr_extended_direction_3& operator=(const Arr_extended_direction_3& other) { + *(static_cast(this)) = static_cast(other); + m_location = other.discontinuity_type(); + return (*this); + } + + /*! Set the location of the point. + */ + void set_location(Location_type location) { m_location = location; } + + /*! Obtain the location of the point. + */ + Location_type location() const { return m_location; } + + /*! Obtain the discontinuity type of the point. + * \todo deprecate this one; use the above instead. + */ + Location_type discontinuity_type() const { return m_location; } + + bool is_no_boundary() const { return (m_location == NO_BOUNDARY_LOC); } + + bool is_min_boundary() const { return (m_location == MIN_BOUNDARY_LOC); } + + bool is_mid_boundary() const { return (m_location == MID_BOUNDARY_LOC); } + + bool is_max_boundary() const { return (m_location == MAX_BOUNDARY_LOC); } +}; + template class Arr_x_monotone_geodesic_arc_on_sphere_3; template class Arr_geodesic_arc_on_sphere_3; -template class Arr_extended_direction_3; /*! A traits class-template for constructing and maintaining arcs of great * circles embedded on spheres. It is parameterized from a (linear) geometry @@ -54,44 +131,43 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { friend class Arr_extended_direction_3; public: - typedef Kernel_ Kernel; + using Kernel = Kernel_; // Category tags: - typedef Tag_true Has_left_category; - typedef Tag_true Has_merge_category; - typedef Tag_false Has_do_intersect_category; + using Has_left_category = Tag_true; + using Has_merge_category = Tag_true; + using Has_do_intersect_category = Tag_false; - typedef Arr_identified_side_tag Left_side_category; - typedef Arr_contracted_side_tag Bottom_side_category; - typedef Arr_contracted_side_tag Top_side_category; - typedef Arr_identified_side_tag Right_side_category; + using Left_side_category = Arr_identified_side_tag; + using Bottom_side_category = Arr_contracted_side_tag; + using Top_side_category = Arr_contracted_side_tag; + using Right_side_category = Arr_identified_side_tag; - typedef std::integral_constant Zero_atan_y; + using Zero_atan_y = std::integral_constant; // Traits objects - typedef Arr_extended_direction_3 Point_2; - typedef Arr_x_monotone_geodesic_arc_on_sphere_3 X_monotone_curve_2; - typedef Arr_geodesic_arc_on_sphere_3 Curve_2; - typedef unsigned int Multiplicity; + using Point_2 = Arr_extended_direction_3; + using X_monotone_curve_2 = Arr_x_monotone_geodesic_arc_on_sphere_3; + using Curve_2 = Arr_geodesic_arc_on_sphere_3; + using Multiplicity = std::size_t; /*! Default constructor */ Arr_geodesic_arc_on_sphere_traits_2() {} protected: - typedef typename Kernel::FT FT; + using FT = typename Kernel::FT; - typedef typename Kernel::Direction_3 Direction_3; - typedef typename Kernel::Vector_3 Vector_3; - typedef typename Kernel::Direction_2 Direction_2; - typedef typename Kernel::Vector_2 Vector_2; + using Direction_3 = typename Kernel::Direction_3; + using Vector_3 = typename Kernel::Vector_3; + using Direction_2 = typename Kernel::Direction_2; + using Vector_2 = typename Kernel::Vector_2; /*! Obtain the intersection of the identification arc and the xy plane. * By default, it is the vector directed along the negative x axis * (x = -infinity). * \return the intersection of the identification arc and the xy plane. */ - inline static const Direction_2& identification_xy() - { + inline static const Direction_2& identification_xy() { static const Direction_2 d(atan_x, atan_y); return d; } @@ -101,8 +177,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * (y = infinity). * \return the normal of the plane that contains the identification arc. */ - inline static const Direction_3& identification_normal() - { + inline static const Direction_3& identification_normal() { static const Direction_3 d(atan_y, -atan_x, 0); return d; } @@ -110,8 +185,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Obtain the 2D direction directed along the negative x axis * \return the direction directed at x = -infinity */ - inline static const Direction_2& neg_x_2() - { + inline static const Direction_2& neg_x_2() { CGAL_STATIC_THREAD_LOCAL_VARIABLE_2(Direction_2, d, -1, 0); return d; } @@ -119,8 +193,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Obtain the 2D direction directed along the negative y axis * \return the direction directed at y = -infinity */ - inline static const Direction_2& neg_y_2() - { + inline static const Direction_2& neg_y_2() { CGAL_STATIC_THREAD_LOCAL_VARIABLE_2(Direction_2, d, 0, -1); return d; } @@ -186,8 +259,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param dir the direction. */ inline Oriented_side oriented_side(const Direction_3& normal, - const Direction_3 dir) const - { + const Direction_3 dir) const { FT dot = normal.vector() * dir.vector(); return CGAL::sign(dot); } @@ -197,9 +269,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param d2 the second direction. * \return the relative orientation of d1 and d2. */ - inline Orientation orientation(const Direction_2& d1, const Direction_2& d2) - const - { + inline Orientation orientation(const Direction_2& d1, + const Direction_2& d2) const { const Kernel& kernel(*this); return kernel.orientation_2_object()(d1.vector(), d2.vector()); } @@ -209,8 +280,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param d2 the second direction. */ inline Direction_3 construct_normal_3(const Direction_3& d1, - const Direction_3& d2) const - { + const Direction_3& d2) const { const Kernel& kernel(*this); Vector_3 v = kernel.construct_cross_product_vector_3_object()(d1.vector(), d2.vector()); @@ -224,8 +294,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \return true if dir is contained in plane; false otherwise. * \pre the plane contains the origin. */ - inline bool has_on(const Direction_3& normal, const Direction_3& dir) const - { + inline bool has_on(const Direction_3& normal, const Direction_3& dir) const { FT dot = normal.vector() * dir.vector(); return CGAL::sign(dot) == ZERO; } @@ -239,8 +308,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * LARGER - v(d1) > v(d2). */ inline Comparison_result compare_y(const Direction_3& d1, - const Direction_3& d2) const - { + const Direction_3& d2) const { Vector_3 v1 = d1.vector(); Vector_3 v2 = d2.vector(); @@ -274,8 +342,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * LARGER - u(d1) > u(d2). */ inline Comparison_result compare_x(const Direction_2& d1, - const Direction_2& d2) const - { + const Direction_2& d2) const { const Kernel& kernel = *this; if (kernel.equal_2_object()(d1, d2)) return EQUAL; const Direction_2& d = identification_xy(); @@ -293,8 +360,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre d2 does not coincide with any pole. */ inline Comparison_result compare_x(const Direction_3& d1, - const Direction_3& d2) const - { + const Direction_3& d2) const { // Compare the projections onto the xy plane: Direction_2 d1_2 = project_xy(d1); Direction_2 d2_2 = project_xy(d2); @@ -313,8 +379,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre d2 does not lie on the discontinuity arc. */ inline Comparison_result compare_xy(const Direction_3& d1, - const Direction_3& d2) const - { + const Direction_3& d2) const { Comparison_result res = compare_x(d1, d2); if (res == EQUAL) return compare_y(d1, d2); return res; @@ -327,9 +392,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * false otherwise. * \pre point does not coincide with one of the poles */ - bool is_in_x_range(const X_monotone_curve_2& xcv, const Point_2& point) const - { - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + bool is_in_x_range(const X_monotone_curve_2& xcv, + const Point_2& point) const { + using Traits = Arr_geodesic_arc_on_sphere_traits_2; CGAL_precondition(!point.is_min_boundary()); CGAL_precondition(!point.is_max_boundary()); @@ -358,8 +423,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ void intersection_with_identification(const X_monotone_curve_2& xcv, Direction_3& dp, - std::true_type) const - { + std::true_type) const { const Direction_3& normal = xcv.normal(); dp = (CGAL::sign(normal.dz()) == POSITIVE) ? Direction_3(-(normal.dz()), 0, normal.dx()) : @@ -371,8 +435,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ void intersection_with_identification(const X_monotone_curve_2& xcv, Direction_3& dp, - std::false_type) const - { + std::false_type) const { const Direction_3& normal = xcv.normal(); FT z((atan_x * normal.dx() + atan_y * normal.dy()) / -(normal.dz())); @@ -383,8 +446,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] cv the curve */ bool overlap_with_identification(const X_monotone_curve_2& xcv, - std::true_type) const - { + std::true_type) const { const Direction_3& normal = xcv.normal(); return ((x_sign(normal) == ZERO) && (((y_sign(normal) == NEGATIVE) && !xcv.is_directed_right()) || @@ -395,8 +457,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] cv the curve */ bool overlap_with_identification(const X_monotone_curve_2& xcv, - std::false_type) const - { + std::false_type) const { const Direction_3& normal = xcv.normal(); const Direction_3& iden_normal = identification_normal(); const Direction_2 iden_normal_xy = project_xy(iden_normal); @@ -417,9 +478,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that constructs a point on the sphere. */ class Construct_point_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -436,8 +497,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param[in] y the y coordinate * \param[in] z the z coordinate */ - Point_2 operator()(const FT& x, const FT& y, const FT& z) - { + Point_2 operator()(const FT& x, const FT& y, const FT& z) { Point_2 p; Direction_3& d(p); d = Direction_3(x, y, z); @@ -449,8 +509,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * direction. * \param other the other direction */ - Point_2 operator()(const Direction_3& other) - { + Point_2 operator()(const Direction_3& other) { Point_2 p; Direction_3& d(p); d = Direction_3(other); @@ -461,8 +520,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Initialize a point on the sphere, * \param[in] p the point to initialize. */ - void init(Point_2& p, std::true_type) const - { + void init(Point_2& p, std::true_type) const { const Direction_3& dir = p; if (y_sign(dir) != ZERO) { p.set_location(Point_2::NO_BOUNDARY_LOC); @@ -480,8 +538,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Initialize a point on the sphere, * \param[in] p the point to initialize. */ - void init(Point_2& p, std::false_type) const - { + void init(Point_2& p, std::false_type) const { const Direction_3& dir = p; if ((x_sign(dir) == ZERO) && (y_sign(dir) == ZERO)) { typename Point_2::Location_type location = (z_sign(dir) == NEGATIVE) ? @@ -508,9 +565,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that constructs an x-monotone geodesic arc on the sphere. */ class Construct_x_monotone_curve_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -536,9 +593,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre the source and target must not coincide. * \pre the source and target cannot be antipodal. */ - X_monotone_curve_2 operator()(const Point_2& source, const Point_2& target) - const - { + X_monotone_curve_2 operator()(const Point_2& source, + const Point_2& target) const { X_monotone_curve_2 xcv; xcv.set_source(source); @@ -561,8 +617,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param plane the containing plane. * \pre the plane is not vertical */ - X_monotone_curve_2 operator()(const Direction_3& normal) const - { + X_monotone_curve_2 operator()(const Direction_3& normal) const { X_monotone_curve_2 xcv; xcv.set_normal(normal); @@ -608,12 +663,11 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param target the target point. * \pre the source and target cannot be equal. */ - void init(X_monotone_curve_2& xcv) const - { + void init(X_monotone_curve_2& xcv) const { const Point_2& source = xcv.source(); const Point_2& target = xcv.target(); - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; const Kernel& kernel(m_traits); CGAL_precondition(!kernel.equal_3_object()(Direction_3(source), @@ -701,9 +755,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that constructs a geodesic arc on the sphere. */ class Construct_curve_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -728,8 +782,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre the source and target cannot be equal. * \pre the source and target cannot be the opoosite of each other. */ - Curve_2 operator()(const Point_2& source, const Point_2& target) - { + Curve_2 operator()(const Point_2& source, const Point_2& target) { Curve_2 cv; cv.set_source(source); cv.set_target(target); @@ -794,8 +847,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { Orientation orient = m_traits.orientation(s, t); const Kernel& kernel = m_traits; - typename Kernel::Counterclockwise_in_between_2 cc_in_between = - kernel.counterclockwise_in_between_2_object(); + auto cc_in_between = kernel.counterclockwise_in_between_2_object(); const Direction_2& d = Traits::identification_xy(); if (orient == LEFT_TURN) { @@ -819,8 +871,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre Both endpoints lie on the given plane. */ Curve_2 operator()(const Point_2& source, const Point_2& target, - const Direction_3& normal) - { + const Direction_3& normal) { Curve_2 cv; cv.set_source(source); @@ -829,7 +880,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { cv.set_is_degenerate(false); cv.set_is_empty(false); - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; CGAL_precondition(m_traits.has_on(normal, source)); CGAL_precondition(m_traits.has_on(normal, target)); @@ -912,8 +963,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { Direction_2 s = project(source); Direction_2 t = project(target); const Direction_2& ny = Traits::neg_y_2(); - typename Kernel::Counterclockwise_in_between_2 ccib = - kernel.counterclockwise_in_between_2_object(); + auto ccib = kernel.counterclockwise_in_between_2_object(); cv.set_is_x_monotone((plane_is_positive && !ccib(ny, s, t)) || (!plane_is_positive && !ccib(ny, t, s))); @@ -929,8 +979,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { const Direction_2& d = Traits::identification_xy(); Direction_2 s = Traits::project_xy(source); Direction_2 t = Traits::project_xy(target); - typename Kernel::Counterclockwise_in_between_2 ccib = - kernel.counterclockwise_in_between_2_object(); + auto ccib = kernel.counterclockwise_in_between_2_object(); bool plane_is_positive = (z_sign(normal) == POSITIVE); cv.set_is_x_monotone((plane_is_positive && !ccib(d, s, t)) || (!plane_is_positive && !ccib(d, t, s))); @@ -961,9 +1010,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that compares the x-coordinates of two directional points */ class Compare_x_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -983,8 +1032,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre p1 does not lie on the boundary. * \pre p2 does not lie on the boundary. */ - Comparison_result operator()(const Point_2& p1, const Point_2& p2) const - { + Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { CGAL_precondition(p1.is_no_boundary()); CGAL_precondition(p2.is_no_boundary()); @@ -996,8 +1044,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Obtain the positive (north) pole * \return the positive (north) pole */ - inline static const Point_2& pos_pole() - { + inline static const Point_2& pos_pole() { static const Point_2 p(Direction_3(0, 0, 1), Point_2::MAX_BOUNDARY_LOC); return p; } @@ -1005,8 +1052,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Obtain the negative (south) pole * \return the negative (south) pole */ - inline static const Point_2& neg_pole() - { + inline static const Point_2& neg_pole() { static const Point_2 p(Direction_3(0, 0, -1), Point_2::MIN_BOUNDARY_LOC); return p; } @@ -1020,9 +1066,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_xy_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1044,8 +1090,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre p1 does not lie on the boundary. * \pre p2 does not lie on the boundary. */ - Comparison_result operator()(const Point_2& p1, const Point_2& p2) const - { + Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { CGAL_precondition(p1.is_no_boundary()); CGAL_precondition(p2.is_no_boundary()); @@ -1094,8 +1139,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \return true if the curve is a vertical spherical_arc; false otherwise. * \pre the arc is not degenerate (consists of a single point) */ - bool operator()(const X_monotone_curve_2& xc) const - { + bool operator()(const X_monotone_curve_2& xc) const { CGAL_precondition(!xc.is_degenerate()); return xc.is_vertical(); } @@ -1109,9 +1153,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_y_at_x_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1132,8 +1176,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre p is in the x-range of xc. */ Comparison_result operator()(const Point_2& p, - const X_monotone_curve_2& xc) const - { + const X_monotone_curve_2& xc) const { CGAL_precondition(!p.is_min_boundary() && !p.is_max_boundary()); CGAL_precondition(m_traits.is_in_x_range(xc, p)); @@ -1169,9 +1212,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_y_at_x_left_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1195,8 +1238,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ Comparison_result operator()(const X_monotone_curve_2& xc1, const X_monotone_curve_2& xc2, - const Point_2& p) const - { + const Point_2& p) const { CGAL_precondition(! xc1.is_degenerate()); CGAL_precondition(! xc2.is_degenerate()); CGAL_precondition(p == xc1.right()); @@ -1227,8 +1269,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { auto opposite_3 = kernel.construct_opposite_direction_3_object(); Direction_3 opposite_p = opposite_3(p); if (kernel.equal_3_object()(opposite_p, Direction_3(l1)) || - kernel.equal_3_object()(opposite_p, Direction_3(l2))) - { + kernel.equal_3_object()(opposite_p, Direction_3(l2))) { Sign xsign = Traits::x_sign(p); Sign ysign = Traits::y_sign(p); Project project = (xsign == ZERO) ? @@ -1286,9 +1327,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_y_at_x_right_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1312,8 +1353,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ Comparison_result operator()(const X_monotone_curve_2& xc1, const X_monotone_curve_2& xc2, - const Point_2& p) const - { + const Point_2& p) const { CGAL_precondition(! xc1.is_degenerate()); CGAL_precondition(! xc2.is_degenerate()); @@ -1335,8 +1375,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { auto opposite_3 = kernel.construct_opposite_direction_3_object(); Direction_3 opposite_p = opposite_3(p); if (kernel.equal_3_object()(opposite_p, Direction_3(r1)) || - kernel.equal_3_object()(opposite_p, Direction_3(r2))) - { + kernel.equal_3_object()(opposite_p, Direction_3(r2))) { Sign xsign = Traits::x_sign(p); Sign ysign = Traits::y_sign(p); Project project = (xsign == ZERO) ? @@ -1402,9 +1441,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Equal_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1422,8 +1461,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \return true if the two curves are the same; false otherwise. */ bool operator()(const X_monotone_curve_2& xc1, - const X_monotone_curve_2& xc2) const - { + const X_monotone_curve_2& xc2) const { const Kernel& kernel = m_traits; typename Kernel::Equal_3 equal_3 = kernel.equal_3_object(); if (xc1.is_full() || xc2.is_full()) { @@ -1447,8 +1485,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param p2 the second point. * \return true if the two point are the same; false otherwise. */ - bool operator()(const Point_2& p1, const Point_2& p2) const - { + bool operator()(const Point_2& p1, const Point_2& p2) const { const Kernel& kernel = m_traits; return kernel.equal_3_object()(Direction_3(p1), Direction_3(p2)); } @@ -1466,9 +1503,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Parameter_space_in_x_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1498,8 +1535,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre xcv does not coincide with the identification */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, - Arr_curve_end ce) const - { + Arr_curve_end ce) const { CGAL_precondition(!m_traits.is_on_y_identification_2_object()(xcv)); // vertical, but not on identification! if (xcv.is_vertical()) return ARR_INTERIOR; @@ -1516,8 +1552,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param p the point. * \return the parameter space at p. */ - Arr_parameter_space operator()(const Point_2& p) const - { + Arr_parameter_space operator()(const Point_2& p) const { CGAL_precondition(p.is_no_boundary()); CGAL_USE(p); return ARR_INTERIOR; @@ -1551,8 +1586,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * maximal end. */ Arr_parameter_space operator()(const X_monotone_curve_2& xcv, - Arr_curve_end ce) const - { + Arr_curve_end ce) const { return (ce == ARR_MIN_END) ? ((xcv.left().is_min_boundary()) ? ARR_BOTTOM_BOUNDARY: ARR_INTERIOR) : ((xcv.right().is_max_boundary()) ? ARR_TOP_BOUNDARY : ARR_INTERIOR); @@ -1565,8 +1599,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \param p the point. * \return the parameter space at p. */ - Arr_parameter_space operator()(const Point_2& p) const - { + Arr_parameter_space operator()(const Point_2& p) const { return (p.is_min_boundary()) ? ARR_BOTTOM_BOUNDARY : (p.is_max_boundary()) ? ARR_TOP_BOUNDARY : ARR_INTERIOR; @@ -1583,9 +1616,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_x_on_boundary_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1613,8 +1646,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ Comparison_result operator()(const Point_2& point, const X_monotone_curve_2& xcv, - Arr_curve_end CGAL_precondition_code(ce)) const - { + Arr_curve_end CGAL_precondition_code(ce)) + const { CGAL_precondition(point.is_no_boundary()); CGAL_precondition_code (const Point_2& p2 = (ce == ARR_MIN_END) ? xcv.left() : xcv.right();); @@ -1659,8 +1692,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { Comparison_result operator()(const X_monotone_curve_2& xcv1, Arr_curve_end CGAL_precondition_code(ce1), const X_monotone_curve_2& xcv2, - Arr_curve_end CGAL_precondition_code(ce2)) const - { + Arr_curve_end CGAL_precondition_code(ce2)) + const { CGAL_precondition_code (const Point_2& p1 = (ce1 == ARR_MIN_END) ? xcv1.left() : xcv1.right();); CGAL_precondition(!p1.is_no_boundary()); @@ -1695,9 +1728,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ Comparison_result operator()(const Point_2& /* p1 */, const Point_2& /* p2 */) const - { - CGAL_error(); return EQUAL; - } + { CGAL_error(); return EQUAL; } }; /*! Obtain a Compare_x_on_boundary_2 function object. @@ -1710,9 +1741,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_x_near_boundary_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1746,8 +1777,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { CGAL_precondition_code(xcv1), const X_monotone_curve_2& CGAL_precondition_code(xcv2), - Arr_curve_end CGAL_precondition_code(ce)) const - { + Arr_curve_end CGAL_precondition_code(ce)) + const { CGAL_precondition_code (const Point_2& p1 = (ce == ARR_MIN_END) ? xcv1.left() : xcv1.right();); CGAL_precondition(!p1.is_no_boundary()); @@ -1774,9 +1805,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_y_near_boundary_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1800,8 +1831,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ Comparison_result operator()(const X_monotone_curve_2& xcv1, const X_monotone_curve_2& xcv2, - Arr_curve_end ce) const - { + Arr_curve_end ce) const { CGAL_precondition(! xcv1.is_degenerate()); CGAL_precondition(! xcv2.is_degenerate()); @@ -1918,9 +1948,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Is_on_y_identification_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -1944,8 +1974,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \return a Boolean indicating whether xcv coincides with the vertical * identification arc. */ - bool operator()(const X_monotone_curve_2& xcv) const - { + bool operator()(const X_monotone_curve_2& xcv) const { /* If the curve is not vertical and non of its endpoints lie on the * boundary, the arc itself cannot lie on the identification arc. */ @@ -1977,9 +2006,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Compare_y_on_boundary_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2000,8 +2029,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre p1 lies on the vertical identification arc including the poles! * \pre p2 lies on the vertical identification arc including the poles! */ - Comparison_result operator()(const Point_2& p1, const Point_2& p2) const - { + Comparison_result operator()(const Point_2& p1, const Point_2& p2) const { // first deal with the 'degenerate' case of poles! if (p1.is_min_boundary()) { if (p2.is_min_boundary()) return EQUAL; @@ -2039,9 +2067,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ class Make_x_monotone_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2063,8 +2091,8 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ template OutputIterator operator()(const Curve_2& c, OutputIterator oi) const { - typedef boost::variant - Make_x_monotone_result; + using Make_x_monotone_result = + boost::variant; // std::cout << "full: " << c.is_full() << std::endl; // std::cout << "vert: " << c.is_vertical() << std::endl; // std::cout << "xmon: " << c.is_x_monotone() << std::endl; @@ -2199,9 +2227,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that splits an x-monotone arc at a directional point. */ class Split_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2223,8 +2251,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre xc is not degenerate */ void operator()(const X_monotone_curve_2& xc, const Point_2& p, - X_monotone_curve_2& xc1, X_monotone_curve_2& xc2) const - { + X_monotone_curve_2& xc1, X_monotone_curve_2& xc2) const { CGAL_precondition(!xc.is_degenerate()); const Point_2& source = xc.source(); const Point_2& target = xc.target(); @@ -2268,9 +2295,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! The clockwise-in-between function object */ class Clockwise_in_between_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2282,8 +2309,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { public: bool operator()(const Direction_2& d, - const Direction_2& d1, const Direction_2& d2) const - { + const Direction_2& d1, const Direction_2& d2) const { const Kernel& kernel = m_traits; return kernel.counterclockwise_in_between_2_object()(d, d2, d1); } @@ -2318,11 +2344,10 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { bool vertical, const In_between& in_between, Project project, - OutputIterator oi) const - { - typedef std::pair Intersection_point; - typedef boost::variant - Intersection_result; + OutputIterator oi) const { + using Intersection_point = std::pair; + using Intersection_result = + boost::variant; const Kernel& kernel = m_traits; typename Kernel::Equal_2 equal = kernel.equal_2_object(); @@ -2473,8 +2498,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * \pre point lies in the underlying plane of xc. */ bool is_in_between(const Point_2& point, - const X_monotone_curve_2& xc) const - { + const X_monotone_curve_2& xc) const { const Kernel& kernel = m_traits; CGAL_precondition(m_traits.has_on(xc.normal(), point)); @@ -2523,9 +2547,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { } protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2548,20 +2572,16 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { template OutputIterator operator()(const X_monotone_curve_2& xc1, const X_monotone_curve_2& xc2, - OutputIterator oi) const - { + OutputIterator oi) const { // std::cout << "xc1: " << xc1 << std::endl // << "xc2: " << xc2 << std::endl; CGAL_precondition(!xc1.is_degenerate()); CGAL_precondition(!xc2.is_degenerate()); - typedef typename Kernel::Counterclockwise_in_between_2 - Counterclockwise_in_between_2; - typedef typename Kernel::Equal_3 Equal_3; - - typedef std::pair Intersection_point; - typedef boost::variant - Intersection_result; + using Equal_3 = typename Kernel::Equal_3; + using Intersection_point = std::pair; + using Intersection_result = + boost::variant; const Kernel& kernel = m_traits; @@ -2574,7 +2594,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { if (equal_3(normal1, normal2) || equal_3(opposite_normal1, normal2)) { // The underlying planes are the same - Counterclockwise_in_between_2 ccib = kernel.counterclockwise_in_between_2_object(); + auto ccib = kernel.counterclockwise_in_between_2_object(); auto cib = m_traits.clockwise_in_between_2_object(); if (xc1.is_vertical()) { @@ -2662,9 +2682,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that tests whether two x-monotone arcs can be merged. */ class Are_mergeable_2 { - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2684,8 +2704,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * 2. share a common endpoint that is not on the identification arc */ bool operator()(const X_monotone_curve_2& xc1, - const X_monotone_curve_2& xc2) const - { + const X_monotone_curve_2& xc2) const { if (xc1.is_empty() || xc2.is_empty()) return true; if ((xc1.is_full() || xc1.is_meridian()) && (xc2.is_full() || xc2.is_meridian())) return false; @@ -2734,9 +2753,9 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! A functor that merges two x-monotone arcs into one */ class Merge_2 { protected: - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; - /*! The traits (in case it has state) */ + //! The traits (in case it has state) const Traits& m_traits; /*! Constructor @@ -2755,8 +2774,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { */ void operator()(const X_monotone_curve_2& xc1, const X_monotone_curve_2& xc2, - X_monotone_curve_2& xc) const - { + X_monotone_curve_2& xc) const { CGAL_precondition (m_traits.are_mergeable_2_object()(xc1, xc2) == true); if (xc1.is_degenerate() || xc1.is_empty()) { @@ -2835,9 +2853,11 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /// \name Functor definitions for the landmarks point-location strategy. //@{ - typedef double Approximate_number_type; - typedef CGAL::Cartesian Approximate_kernel; - typedef Approximate_kernel::Point_2 Approximate_point_2; + using Approximate_number_type = double; + using Approximate_kernel = CGAL::Cartesian; + using Approximate_point_2 = Arr_extended_direction_3; + using Approximate_kernel_vector_3 = Approximate_kernel::Vector_3; + using Approximate_kernel_direction_3 = Approximate_kernel::Direction_3; class Approximate_2 { public: @@ -2849,21 +2869,103 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { * approximation of p's y-coordinate (if i == 1). */ Approximate_number_type operator()(const Point_2& p, int i) const { - CGAL_precondition((i == 0) || (i == 1)); - return (i == 0) ? CGAL::to_double(p.x()) : CGAL::to_double(p.y()); + CGAL_precondition((i == 0) || (i == 1) || (i == 2)); + return (i == 0) ? CGAL::to_double(p.dx()) : + ((i == 1) ? CGAL::to_double(p.dy()) : CGAL::to_double(p.dz())); } /*! Obtain an approximation of a point. */ - Approximate_point_2 operator()(const Point_2& p) const - { return Approximate_point_2(operator()(p, 0), operator()(p, 1)); } + Approximate_point_2 operator()(const Point_2& p) const { + Approximate_kernel::Direction_3 dir(operator()(p, 0), operator()(p, 1), + operator()(p, 2)); + auto loc = static_cast(p.location()); + return Approximate_point_2(dir, loc); + } /*! Obtain an approximation of an \f$x\f$-monotone curve. */ template - OutputIterator operator()(const X_monotone_curve_2& /* xcv */, double /* error */, - OutputIterator /* oi */, bool /* l2r */ = true) const { - CGAL_error_msg("Not implemented yet!"); + OutputIterator operator()(const X_monotone_curve_2& xcv, + Approximate_number_type error, + OutputIterator oi, bool l2r = true) const { + auto s = xcv.source(); + auto t = xcv.target(); + auto n = xcv.normal(); + + // get the approximate points; + auto as = (*this)(s); + auto at = (*this)(t); + + // convert the approximate points to vectors with approximate-kernel + auto vs = approximate_vector_3(as); + auto vt = approximate_vector_3(at); + auto vn = approximate_vector_3(n); + + // normalize the vectors + auto normalize = [](auto& x) { x /= std::sqrt(x.squared_length()); }; + normalize(vs); + normalize(vt); + normalize(vn); + + // Define the spanning vectors of the coordinate system where we are + // going to make the approximation: + auto axis_x = vs; // x-axis will coincide with the vector from the + // origin to the normalized SOURCE-vector + auto axis_z = vn; // this will make sure that the orientation of the + // approximated curve is consistent with the curve + auto axis_y = CGAL::cross_product(axis_z, axis_x); + normalize(axis_y); + + // In this coordinate system the source has local coords (0,0), hence its + // initial angle with the X-axis is 0 degrees (radians) + // Compute the local coordinates and the angle it makes with the X-axis + Approximate_number_type theta; + if (xcv.is_full()) theta = 2.0 * CGAL_PI; + else { + auto ltx = CGAL::scalar_product(axis_x, vt); + auto lty = CGAL::scalar_product(axis_y, vt); + theta = std::atan2(lty, ltx); + if (theta < 0) + theta += 2.0 * CGAL_PI; + } + + // compute the number of divisions given the requested error + const Approximate_number_type R = 1.0; // radius is always 1 + Approximate_number_type dtheta = 2.0 * std::acos(1 - error / R); + int num_segs = std::ceil(theta / dtheta); + dtheta = theta / num_segs; + + // generate the points approximating the curve + const auto loc = Approximate_point_2::NO_BOUNDARY_LOC; + *oi++ = approximate_point_2(vs, loc); // source vector + for (int i = 1; i < num_segs; ++i) { + const Approximate_number_type angle = i * dtheta; + auto p = std::cos(angle) * axis_x + std::sin(angle) * axis_y; + *oi++ = approximate_point_2(p, loc); + } + *oi++ = approximate_point_2(vt, loc); // target vector + + return oi; + } + + private: + Approximate_kernel_vector_3 + approximate_vector_3(const Approximate_point_2& p) const + { return Approximate_kernel_vector_3(p.dx(), p.dy(), p.dz()); }; + + Approximate_kernel_vector_3 + approximate_vector_3(const Direction_3& d) const { + return Approximate_kernel_vector_3(CGAL::to_double(d.dx()), + CGAL::to_double(d.dy()), + CGAL::to_double(d.dz())); + }; + + Approximate_point_2 + approximate_point_2(const Approximate_kernel_vector_3& v, + const Approximate_point_2::Location_type loc) const { + Approximate_kernel_direction_3 d(v.x(), v.y(), v.z()); + return Approximate_point_2(d, loc); } }; @@ -2877,9 +2979,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { class Compare_endpoints_xy_2 { public: - - /*! - * Compare the endpoints of an $x$-monotone curve lexicographically. + /*! Compare the endpoints of an $x$-monotone curve lexicographically. * (assuming the curve has a designated source and target points). * \param xc the curve. * \return SMALLER if the curve is directed right; @@ -2911,8 +3011,7 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { #if 0 /*! Inserter for the spherical_arc class used by the traits-class */ template - friend OutputStream& operator<<(OutputStream& os, const Point_2& p) - { + friend OutputStream& operator<<(OutputStream& os, const Point_2& p) { CGAL::To_double todouble; os << static_cast(todouble(p.dx())) << ", " << static_cast(todouble(p.dy())) << ", " @@ -2923,101 +3022,20 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { /*! Inserter for the spherical_arc class used by the traits-class */ template friend OutputStream& operator<<(OutputStream& os, - const X_monotone_curve_2& xc) - { + const X_monotone_curve_2& xc) { os << "(" << xc.left() << "), (" << xc.right() << ")"; return os; } /*! Extractor for the spherical_arc class used by the traits-class */ template - friend InputStream& operator>>(InputStream& is, X_monotone_curve_2& arc) - { + friend InputStream& operator>>(InputStream& is, X_monotone_curve_2& arc) { CGAL_error_msg("Not implemented yet!"); return is; } #endif }; -/*! Represent an extended 3D direction that is used in turn to represent a - * spherical-arc endpoint. The extended data consists of two flags that - * indicate whether the point is on the x and on a y boundaries, - * respectively. - */ -template -class Arr_extended_direction_3 : public Kernel::Direction_3 { -public: - typedef typename Kernel::FT FT; - typedef typename Kernel::Direction_3 Direction_3; - - /*! Enumeration of discontinuity type */ - enum Location_type { - NO_BOUNDARY_LOC = 0, - MIN_BOUNDARY_LOC, - MID_BOUNDARY_LOC, - MAX_BOUNDARY_LOC - }; - -private: - typedef typename Kernel::Direction_2 Direction_2; - - /*! The point discontinuity type */ - Location_type m_location; - - inline Sign x_sign(Direction_3 d) const { return CGAL::sign(d.dx()); } - - inline Sign y_sign(Direction_3 d) const { return CGAL::sign(d.dy()); } - - inline Sign z_sign(Direction_3 d) const { return CGAL::sign(d.dz()); } - -public: - /*! Default constructor */ - Arr_extended_direction_3() : - Direction_3(0, 0, 1), - m_location(MAX_BOUNDARY_LOC) - {} - - /*! Constructor */ - Arr_extended_direction_3(const Direction_3& dir, Location_type location) : - Direction_3(dir), - m_location(location) - {} - - /*! Copy constructor */ - Arr_extended_direction_3(const Arr_extended_direction_3& other) : - Direction_3(static_cast(other)) - { m_location = other.discontinuity_type(); } - - /*! Assignment operator */ - Arr_extended_direction_3& operator=(const Arr_extended_direction_3& other) - { - *(static_cast(this)) = static_cast(other); - m_location = other.discontinuity_type(); - return (*this); - } - - /*! Set the location of the point. - */ - void set_location(Location_type location) { m_location = location; } - - /*! Obtain the location of the point. - */ - Location_type location() const { return m_location; } - - /*! Obtain the discontinuity type of the point. - * \todo deprecate this one; use the above instead. - */ - Location_type discontinuity_type() const { return m_location; } - - bool is_no_boundary() const { return (m_location == NO_BOUNDARY_LOC); } - - bool is_min_boundary() const { return (m_location == MIN_BOUNDARY_LOC); } - - bool is_mid_boundary() const { return (m_location == MID_BOUNDARY_LOC); } - - bool is_max_boundary() const { return (m_location == MAX_BOUNDARY_LOC); } -}; - /*! A Representation of an x-monotone great circular arc embedded on a sphere, * as used by the Arr_geodesic_arc_on_sphere_traits_2 traits-class * An x-monotone great circular arc cannot cross the closed hemi-circle arc of @@ -3029,38 +3047,38 @@ class Arr_extended_direction_3 : public Kernel::Direction_3 { template class Arr_x_monotone_geodesic_arc_on_sphere_3 { public: - typedef Kernel_ Kernel; - typedef typename Kernel::Direction_3 Direction_3; - typedef typename Kernel::Plane_3 Plane_3; - typedef typename Kernel::Vector_3 Vector_3; - typedef typename Kernel::Direction_2 Direction_2; + using Kernel = Kernel_; + using Direction_3 = typename Kernel::Direction_3; + using Plane_3 = typename Kernel::Plane_3; + using Vector_3 = typename Kernel::Vector_3; + using Direction_2 = typename Kernel::Direction_2; protected: // For some reason compilation under Windows fails without the qualifier - typedef CGAL::Arr_extended_direction_3 Arr_extended_direction_3; + using Arr_extended_direction_3 = CGAL::Arr_extended_direction_3; - /*! The source point of the arc. */ + //! The source point of the arc. Arr_extended_direction_3 m_source; - /*! The target point of the arc. */ + //! The target point of the arc. Arr_extended_direction_3 m_target; - /*! The direction of the plane that contains the arc. */ + //! The direction of the plane that contains the arc. Direction_3 m_normal; - /*! The arc is vertical. */ + //! The arc is vertical. bool m_is_vertical; - /*! Target (lexicographically) larger than source. */ + //! Target (lexicographically) larger than source. bool m_is_directed_right; - /*! The arc is a full circle. */ + //! The arc is a full circle. bool m_is_full; - /* The arc is degenerate - it consists of a single point. */ + //! The arc is degenerate - it consists of a single point. bool m_is_degenerate; - /*! The arc is empty. */ + //! The arc is empty. bool m_is_empty; inline Sign x_sign(Direction_3 d) const { return CGAL::sign(d.dx()); } @@ -3109,8 +3127,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { * \param other the other arc */ Arr_x_monotone_geodesic_arc_on_sphere_3 - (const Arr_x_monotone_geodesic_arc_on_sphere_3& other) - { + (const Arr_x_monotone_geodesic_arc_on_sphere_3& other) { m_source = other.m_source; m_target = other.m_target; m_normal = other.m_normal; @@ -3123,8 +3140,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { /*! Assignment operator */ Arr_x_monotone_geodesic_arc_on_sphere_3& operator= - (const Arr_x_monotone_geodesic_arc_on_sphere_3& other) - { + (const Arr_x_monotone_geodesic_arc_on_sphere_3& other) { m_source = other.m_source; m_target = other.m_target; m_normal = other.m_normal; @@ -3150,9 +3166,8 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { * \param target the target point. * \pre the source and target cannot be equal. */ - void init() - { - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + void init() { + using Traits = Arr_geodesic_arc_on_sphere_traits_2; Kernel kernel; CGAL_precondition(!kernel.equal_3_object()(Direction_3(m_source), @@ -3241,8 +3256,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { m_is_directed_right(z_sign(normal) == POSITIVE), m_is_full(true), m_is_degenerate(false), - m_is_empty(false) - { + m_is_empty(false) { CGAL_precondition(z_sign(normal) != ZERO); #if (CGAL_IDENTIFICATION_XY == CGAL_X_MINUS_1_Y_0) @@ -3250,8 +3264,8 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { Direction_3(-(normal.dz()), 0, normal.dx()) : Direction_3(normal.dz(), 0, -(normal.dx())); #else - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; - typedef typename Kernel::FT FT; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; + using FT = typename Kernel::FT; const Direction_2& xy = Traits::identification_xy(); FT x = xy.dx(); @@ -3277,8 +3291,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { m_is_directed_right(z_sign(normal) == POSITIVE), m_is_full(true), m_is_degenerate(false), - m_is_empty(false) - { + m_is_empty(false) { CGAL_precondition(has_on(point)); CGAL_precondition(z_sign(normal) != ZERO); #if !defined(CGAL_FULL_X_MONOTONE_GEODESIC_ARC_ON_SPHERE_IS_SUPPORTED) @@ -3303,8 +3316,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { m_normal(normal), m_is_full(false), m_is_degenerate(false), - m_is_empty(false) - { + m_is_empty(false) { CGAL_precondition(has_on(source)); CGAL_precondition(has_on(target)); @@ -3414,8 +3426,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { #if 0 /*! Create a bounding box for the spherical_arc */ - Bbox_2 bbox() const - { + Bbox_2 bbox() const { Kernel kernel; Segment_2 seg = kernel.construct_spherical_arc_2_object()(this->m_source, this->m_target); @@ -3424,8 +3435,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { #endif /*! Flip the spherical_arc (swap it source and target) */ - Arr_x_monotone_geodesic_arc_on_sphere_3 opposite() const - { + Arr_x_monotone_geodesic_arc_on_sphere_3 opposite() const { Arr_x_monotone_geodesic_arc_on_sphere_3 opp; opp.m_source = this->m_target; opp.m_target = this->m_source; @@ -3444,8 +3454,7 @@ class Arr_x_monotone_geodesic_arc_on_sphere_3 { * \return true if dir is contained in plane; false otherwise. * \pre the plane contains the origin. */ - inline bool has_on(const Direction_3& dir) const - { + inline bool has_on(const Direction_3& dir) const { typename Kernel::FT dot = normal().vector() * dir.vector(); return CGAL::sign(dot) == ZERO; } @@ -3463,25 +3472,25 @@ template class Arr_geodesic_arc_on_sphere_3 : public Arr_x_monotone_geodesic_arc_on_sphere_3 { public: - typedef Kernel_ Kernel; + using Kernel = Kernel_; protected: - typedef Arr_x_monotone_geodesic_arc_on_sphere_3 Base; + using Base = Arr_x_monotone_geodesic_arc_on_sphere_3; public: - typedef typename Base::Plane_3 Plane_3; - typedef typename Base::Direction_3 Direction_3; - typedef typename Base::Direction_2 Direction_2; + using Plane_3 = typename Base::Plane_3; + using Direction_3 = typename Base::Direction_3; + using Direction_2 = typename Base::Direction_2; protected: // For some reason compilation under Windows fails without the qualifier - typedef CGAL::Arr_extended_direction_3 Arr_extended_direction_3; + using Arr_extended_direction_3 = CGAL::Arr_extended_direction_3; using Base::x_sign; using Base::y_sign; using Base::z_sign; - /*! Indicates whether the arc is x-monotone */ + //! Indicates whether the arc is x-monotone bool m_is_x_monotone; public: @@ -3537,8 +3546,7 @@ class Arr_geodesic_arc_on_sphere_3 : */ Arr_geodesic_arc_on_sphere_3(const Arr_extended_direction_3& source, const Arr_extended_direction_3& target, - const Direction_3& normal) - { + const Direction_3& normal) { Kernel kernel; this->set_source(source); @@ -3547,7 +3555,7 @@ class Arr_geodesic_arc_on_sphere_3 : this->set_is_degenerate(false); this->set_is_empty(false); - typedef Arr_geodesic_arc_on_sphere_traits_2 Traits; + using Traits = Arr_geodesic_arc_on_sphere_traits_2; CGAL_precondition(this->has_on(source)); CGAL_precondition(this->has_on(target)); @@ -3627,8 +3635,7 @@ class Arr_geodesic_arc_on_sphere_3 : Direction_2 s = project(source); Direction_2 t = project(target); const Direction_2& ny = Traits::neg_y_2(); - typename Kernel::Counterclockwise_in_between_2 ccib = - kernel.counterclockwise_in_between_2_object(); + auto ccib = kernel.counterclockwise_in_between_2_object(); set_is_x_monotone((plane_is_positive && !ccib(ny, s, t)) || (!plane_is_positive && !ccib(ny, t, s))); @@ -3644,8 +3651,7 @@ class Arr_geodesic_arc_on_sphere_3 : const Direction_2& d = Traits::identification_xy(); Direction_2 s = Traits::project_xy(source); Direction_2 t = Traits::project_xy(target); - typename Kernel::Counterclockwise_in_between_2 ccib = - kernel.counterclockwise_in_between_2_object(); + auto ccib = kernel.counterclockwise_in_between_2_object(); bool plane_is_positive = (z_sign(normal) == POSITIVE); set_is_x_monotone((plane_is_positive && !ccib(d, s, t)) || (!plane_is_positive && !ccib(d, t, s))); @@ -3654,8 +3660,7 @@ class Arr_geodesic_arc_on_sphere_3 : /*! Construct a full spherical_arc from a normal to a plane. * \param normal the normal to the plane containing the arc. */ - Arr_geodesic_arc_on_sphere_3(const Direction_3& normal) - { + Arr_geodesic_arc_on_sphere_3(const Direction_3& normal) { this->normal(normal); this->set_is_vertical(CGAL::sign(normal.dz()) == ZERO); this->set_is_directed_right(true); @@ -3679,8 +3684,7 @@ class Arr_geodesic_arc_on_sphere_3 : /*! Inserter for the spherical_arc class used by the traits-class */ template OutputStream& operator<<(OutputStream& os, - const Arr_extended_direction_3& ed) -{ + const Arr_extended_direction_3& ed) { #if defined(CGAL_ARR_GEODESIC_ARC_ON_SPHERE_DETAILS) os << "(" << ed.dx() << ", " << ed.dy() << ", " << ed.dz(); @@ -3703,8 +3707,7 @@ OutputStream& operator<<(OutputStream& os, template OutputStream& operator<<(OutputStream& os, - const Arr_x_monotone_geodesic_arc_on_sphere_3& arc) -{ + const Arr_x_monotone_geodesic_arc_on_sphere_3& arc) { #if defined(CGAL_ARR_GEODESIC_ARC_ON_SPHERE_DETAILS) os << "(" << "(" << arc.source() << "), (" << arc.target() << ")" @@ -3724,10 +3727,9 @@ operator<<(OutputStream& os, /*! Extractor for the spherical-arc point class used by the traits-class */ template InputStream& -operator>>(InputStream& is, Arr_extended_direction_3& point) -{ - typedef Kernel_ Kernel; - typedef Arr_extended_direction_3 Point; +operator>>(InputStream& is, Arr_extended_direction_3& point) { + using Kernel = Kernel_; + using Point = Arr_extended_direction_3; // CGAL_error_msg("Importing a geodesic point is not supported!"); typename Kernel::Direction_3 d; is >> d; @@ -3741,10 +3743,9 @@ operator>>(InputStream& is, Arr_extended_direction_3& point) template InputStream& operator>>(InputStream& is, - Arr_x_monotone_geodesic_arc_on_sphere_3& arc) -{ - typedef Kernel_ Kernel; - typedef Arr_extended_direction_3 Point; + Arr_x_monotone_geodesic_arc_on_sphere_3& arc) { + using Kernel = Kernel_; + using Point = Arr_extended_direction_3; // CGAL_error_msg("Importing a geodesic arc is not supported!\n"); From afa58a942661b42e7c2c432b286dbccb589ca33a Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 9 Aug 2023 17:46:35 +0300 Subject: [PATCH 0599/1398] Cleaned up --- .../Arrangement_2/Arrangement_zone_2_impl.h | 64 +++++++------------ 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index dfb8851479fd..054724aa6e4f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -28,8 +28,7 @@ namespace CGAL { // template void Arrangement_zone_2:: -init_with_hint(const X_monotone_curve_2& cv, Pl_result_type obj) -{ +init_with_hint(const X_monotone_curve_2& cv, Pl_result_type obj) { #if defined(ARR_ZONE_VERBOSE) std::cout << "init_with_hint()" << std::endl; #endif @@ -80,8 +79,7 @@ init_with_hint(const X_monotone_curve_2& cv, Pl_result_type obj) // notifications for the visitor. // template -void Arrangement_zone_2::compute_zone() -{ +void Arrangement_zone_2::compute_zone() { #if defined(ARR_ZONE_VERBOSE) std::cout << "compute_zone()" << std::endl; #endif @@ -253,8 +251,7 @@ template bool Arrangement_zone_2:: do_overlap_impl(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, - const Point_2& p, Arr_not_all_sides_oblivious_tag) const -{ + const Point_2& p, Arr_not_all_sides_oblivious_tag) const { typename Traits_adaptor_2::Compare_y_at_x_right_2 cmp_right = m_geom_traits->compare_y_at_x_right_2_object(); @@ -307,8 +304,7 @@ do_overlap_impl(const X_monotone_curve_2& cv1, // template bool Arrangement_zone_2:: -_find_prev_around_vertex(Vertex_handle v, Halfedge_handle& he) -{ +_find_prev_around_vertex(Vertex_handle v, Halfedge_handle& he) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_find_prev_around_vertex(" << v->point() << ")" << std::endl; #endif @@ -393,8 +389,7 @@ typename Arrangement_zone_2::Halfedge_handle Arrangement_zone_2:: _direct_intersecting_edge_to_right(const X_monotone_curve_2& cv_ins, const Point_2& cv_left_pt, - Halfedge_handle query_he) -{ + Halfedge_handle query_he) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_direct_intersecting_edge_to_right() " << cv_left_pt << std::endl; @@ -446,8 +441,7 @@ template typename Arrangement_zone_2::Halfedge_handle Arrangement_zone_2:: _direct_intersecting_edge_to_left(const X_monotone_curve_2& cv_ins, - Halfedge_handle query_he) -{ + Halfedge_handle query_he) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_direct_intersecting_edge_to_left()" << std::endl; #endif @@ -544,8 +538,7 @@ typename Arrangement_zone_2::Optional_intersection Arrangement_zone_2:: _compute_next_intersection(Halfedge_handle he, bool skip_first_point, - Arr_parameter_space& intersection_location) -{ + Arr_parameter_space& intersection_location) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_compute_next_intersection(" << he->curve() << ", " << skip_first_point << ")" << std::endl; @@ -591,7 +584,8 @@ _compute_next_intersection(Halfedge_handle he, if (is_closed(*icv, ARR_MIN_END)) { // The curve has a valid left point - make sure it lies to the // right of m_left_pt. - valid_intersection = (compare_xy(ctr_min(*icv), m_left_pt) != SMALLER); + valid_intersection = + (compare_xy(ctr_min(*icv), m_left_pt) != SMALLER); } // In this case the overlap is not valid. else valid_intersection = false; @@ -670,8 +664,7 @@ _compute_next_intersection(Halfedge_handle he, // template void Arrangement_zone_2:: -_remove_next_intersection(Halfedge_handle he) -{ +_remove_next_intersection(Halfedge_handle he) { // Get a pointer to the curve associated with the halfedge. const X_monotone_curve_2* p_curve = &(he->curve()); @@ -691,8 +684,7 @@ _remove_next_intersection(Halfedge_handle he) template bool Arrangement_zone_2:: _is_to_left_impl(const Point_2& p, Halfedge_handle he, - Arr_not_all_sides_oblivious_tag) const -{ + Arr_not_all_sides_oblivious_tag) const { #if defined(ARR_ZONE_VERBOSE) std::cout << "_is_to_left_impl(" << p << "," << he->curve() << ")" << std::endl; @@ -723,13 +715,13 @@ _is_to_left_impl(const Point_2& p, Halfedge_handle he, } //----------------------------------------------------------------------------- -// Determine whether a given point lies completely to the right of a given curve. +// Determine whether a given point lies completely to the right of a given +// curve. // template bool Arrangement_zone_2:: _is_to_right_impl(const Point_2& p, Halfedge_handle he, - Arr_not_all_sides_oblivious_tag) const -{ + Arr_not_all_sides_oblivious_tag) const { #if defined(ARR_ZONE_VERBOSE) std::cout << "_is_to_right_impl(" << p << "," << he->curve() << ")" << std::endl; @@ -767,8 +759,7 @@ _is_to_right_impl(const Point_2& p, Halfedge_handle he, template void Arrangement_zone_2:: _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, - Arr_parameter_space& leftmost_location) -{ + Arr_parameter_space& leftmost_location) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_leftmost_intersection(" << he_curr->curve() << ", " << on_boundary << ")" << std::endl; @@ -880,8 +871,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, // template void Arrangement_zone_2:: -_leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) -{ +_leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_leftmost_intersection_with_face_boundary(" << on_boundary << ")" << std::endl; @@ -899,8 +889,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) // Traverse the face outer-boundaries; iterate through all outer CCBs. for (auto occb_it = face->outer_ccbs_begin(); - occb_it != face->outer_ccbs_end(); ++occb_it) - { + occb_it != face->outer_ccbs_end(); ++occb_it) { Ccb_halfedge_circulator he_first = *occb_it; Ccb_halfedge_circulator he_curr = he_first; do _leftmost_intersection(he_curr, on_boundary, leftmost_location); @@ -909,8 +898,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) // Traverse the face inner-boundaries; iterate through all inner CCBs (holes). for (auto iccb_it = face->inner_ccbs_begin(); - iccb_it != face->inner_ccbs_end(); ++iccb_it) - { + iccb_it != face->inner_ccbs_end(); ++iccb_it) { Ccb_halfedge_circulator he_first = *iccb_it; Ccb_halfedge_circulator he_curr = he_first; do _leftmost_intersection(he_curr, on_boundary, leftmost_location); @@ -921,17 +909,15 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) // Traverse the isolated vertices inside the face (if there exist any), and // check whether an isolated vertex lies on the curve. - typedef typename Arrangement_2::Isolated_vertex_iterator - Isolated_vertex_iterator; - for (Isolated_vertex_iterator iv_it = face->isolated_vertices_begin(); - iv_it != face->isolated_vertices_end(); ++iv_it) - { + for (auto iv_it = face->isolated_vertices_begin(); + iv_it != face->isolated_vertices_end(); ++iv_it) { // If the isolated vertex is not in the x-range of our curve, disregard it. if (! is_in_x_range(m_cv, iv_it->point())) continue; // If we already have an intersection point, compare it to the current // isolated vertex, in order to filter unnecessary computations. - if (m_found_intersect && compare_xy(iv_it->point(), m_intersect_p) == LARGER) + if (m_found_intersect && + (compare_xy(iv_it->point(), m_intersect_p) == LARGER)) continue; // In case the isolated vertex lies on the curve, update the intersection @@ -960,8 +946,7 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) // template bool Arrangement_zone_2:: -_zone_in_face(Face_handle face, bool on_boundary) -{ +_zone_in_face(Face_handle face, bool on_boundary) { #if defined(ARR_ZONE_VERBOSE) std::cout << "_zone_in_face(" << on_boundary << ")" << std::endl; #endif @@ -1190,8 +1175,7 @@ _zone_in_face(Face_handle face, bool on_boundary) // curve currently associated with m_intersect_he. // template -bool Arrangement_zone_2::_zone_in_overlap() -{ +bool Arrangement_zone_2::_zone_in_overlap() { #if defined(ARR_ZONE_VERBOSE) std::cout << "_zone_in_overlap()" << std::endl; #endif From ada39fdfaedc8847ea689b54dbc382c145692abb Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 9 Aug 2023 19:10:16 +0300 Subject: [PATCH 0600/1398] Cleaned up and dispatched is_intersection_valid_impl() properly --- .../Arrangement_2/Arrangement_zone_2_impl.h | 50 +++++++-- .../include/CGAL/Arrangement_zone_2.h | 104 +++++++++--------- 2 files changed, 96 insertions(+), 58 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index 054724aa6e4f..6903b44429a0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -504,14 +504,46 @@ template bool Arrangement_zone_2:: is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& /* intersection_location */, - Arr_all_sides_oblivious_tag) const + Arr_boundary_cond_tag) const { return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); } template bool Arrangement_zone_2:: is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_not_all_sides_oblivious_tag) const { + Arr_has_identified_side_tag) const { + auto equal = m_geom_traits->equal_2_object(); + auto is_on_y_ident = m_geom_traits->is_on_y_identification_2_object(); + // Case 1: the curve lies on the y-identification + if (is_on_y_ident(m_cv)) { + if (equal(ip, m_left_pt)) return false; + // We set the location to be on the left as a convention + intersection_location = ARR_LEFT_BOUNDARY; + return true; + } + + // Case 2: The left-end lies on the left boundary + // (It cannot lie on the right boundary) + // If the intersection point is not equal to the left-end, it must lie to + // its right; thus valid. + if (m_left_on_boundary) return ! equal(ip, m_left_pt); + + // Case 3: The right-end lies on the right boundary + if (m_right_on_boundary && equal(ip, m_right_pt)) { + intersection_location = ARR_RIGHT_BOUNDARY; + return true; + } + + // We have a simple intersection point; + // make sure it lies to the right of m_left_pt. + return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); +} + +template +bool Arrangement_zone_2:: +is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& intersection_location, + Arr_has_open_side_tag) const { auto equal = m_geom_traits->equal_2_object(); if (m_left_on_boundary) { // The left-end lies on the left boundary. If the intersection point is not @@ -699,12 +731,12 @@ _is_to_left_impl(const Point_2& p, Halfedge_handle he, if (ps_x_min == ARR_LEFT_BOUNDARY) return false; auto ps_in_y = m_geom_traits->parameter_space_in_y_2_object(); - auto ps_y = ps_in_y(he->curve(), ARR_MIN_END); - if (ps_y != ARR_INTERIOR) { + auto ps_y_min = ps_in_y(he->curve(), ARR_MIN_END); + if (ps_y_min != ARR_INTERIOR) { // Check if p is to the left of the minimal curve-end: auto cmp_x = m_geom_traits->compare_x_point_curve_end_2_object(); const auto res = cmp_x(p, he->curve(), ARR_MIN_END); - return ((res == SMALLER) || (res == EQUAL && ps_y == ARR_TOP_BOUNDARY)); + return ((res == SMALLER) || (res == EQUAL && ps_y_min == ARR_TOP_BOUNDARY)); } // In case the minimal curve-end does not have boundary conditions, simply @@ -738,12 +770,12 @@ _is_to_right_impl(const Point_2& p, Halfedge_handle he, if (ps_x_max == ARR_LEFT_BOUNDARY) return true; auto ps_in_y = m_geom_traits->parameter_space_in_y_2_object(); - auto ps_y = ps_in_y(he->curve(), ARR_MAX_END); - if (ps_y != ARR_INTERIOR) { + auto ps_y_max = ps_in_y(he->curve(), ARR_MAX_END); + if (ps_y_max != ARR_INTERIOR) { // Check if p is to the right of the maximal curve-end: auto cmp_x = m_geom_traits->compare_x_point_curve_end_2_object(); auto res = cmp_x(p, he->curve(), ARR_MAX_END); - return ((res == LARGER) || (res == EQUAL && ps_y == ARR_BOTTOM_BOUNDARY)); + return ((res == LARGER) || (res == EQUAL && ps_y_max == ARR_BOTTOM_BOUNDARY)); } // In case the maximal curve-end does not have boundary conditions, simply @@ -783,7 +815,7 @@ _leftmost_intersection(Ccb_halfedge_circulator he_curr, bool on_boundary, // entirely to the right of m_intersect_p, its intersection with m_cv (if any) // cannot lie to the left of this point. We therefore do not need to compute // this intersection. - if (m_found_intersect && (leftmost_location != ARR_RIGHT_BOUNDARY) && + if (m_found_intersect && (leftmost_location == ARR_INTERIOR) && _is_to_left(m_intersect_p, he_curr)) return; diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 71b5e4a74092..5d22e410109f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -55,65 +55,70 @@ namespace CGAL { template class Arrangement_zone_2 { public: - typedef Arrangement_ Arrangement_2; - typedef typename Arrangement_2::Geometry_traits_2 Geometry_traits_2; - typedef typename Arrangement_2::Topology_traits Topology_traits; + using Arrangement_2 = Arrangement_; + using Geometry_traits_2 = typename Arrangement_2::Geometry_traits_2; + using Topology_traits = typename Arrangement_2::Topology_traits; protected: - typedef Arr_traits_adaptor_2 Traits_adaptor_2; + using Traits_adaptor_2 = Arr_traits_adaptor_2; - typedef typename Traits_adaptor_2::Left_side_category Left_side_category; - typedef typename Traits_adaptor_2::Bottom_side_category Bottom_side_category; - typedef typename Traits_adaptor_2::Top_side_category Top_side_category; - typedef typename Traits_adaptor_2::Right_side_category Right_side_category; + using Left_side_category = typename Traits_adaptor_2::Left_side_category; + using Bottom_side_category = typename Traits_adaptor_2::Bottom_side_category; + using Top_side_category = typename Traits_adaptor_2::Top_side_category; + using Right_side_category = typename Traits_adaptor_2::Right_side_category; static_assert(Arr_sane_identified_tagging::value); + // Categories for dispatching + using Are_all_sides_oblivious_category = + typename Arr_all_sides_oblivious_category::result; + + using Left_or_right_sides_category = + typename Arr_two_sides_category::result; public: - typedef ZoneVisitor_ Visitor; + using Visitor = ZoneVisitor_; - typedef typename Arrangement_2::Vertex_handle Vertex_handle; - typedef typename Arrangement_2::Halfedge_handle Halfedge_handle; - typedef typename Arrangement_2::Face_handle Face_handle; + using Vertex_handle = typename Arrangement_2::Vertex_handle; + using Halfedge_handle = typename Arrangement_2::Halfedge_handle; + using Face_handle = typename Arrangement_2::Face_handle; - typedef std::pair Visitor_result; + using Visitor_result = std::pair; - typedef typename Geometry_traits_2::Point_2 Point_2; - typedef typename Geometry_traits_2::X_monotone_curve_2 X_monotone_curve_2; - typedef typename Geometry_traits_2::Multiplicity Multiplicity; + using Point_2 = typename Geometry_traits_2::Point_2; + using X_monotone_curve_2 = typename Geometry_traits_2::X_monotone_curve_2; + using Multiplicity = typename Geometry_traits_2::Multiplicity; protected: - typedef typename Arr_all_sides_oblivious_category::result - Are_all_sides_oblivious_category; - - typedef typename Arrangement_2::Vertex_const_handle Vertex_const_handle; - typedef typename Arrangement_2::Halfedge_const_handle Halfedge_const_handle; - typedef typename Arrangement_2::Face_const_handle Face_const_handle; + // General types + using Vertex_const_handle = typename Arrangement_2::Vertex_const_handle; + using Halfedge_const_handle = typename Arrangement_2::Halfedge_const_handle; + using Face_const_handle = typename Arrangement_2::Face_const_handle; - typedef typename Arrangement_2::Ccb_halfedge_circulator - Ccb_halfedge_circulator; + using Ccb_halfedge_circulator = + typename Arrangement_2::Ccb_halfedge_circulator; // Types used for caching intersection points: - typedef std::pair Intersection_point; - typedef boost::variant - Intersection_result; - typedef boost::optional Optional_intersection; - typedef std::list Intersect_list; - typedef std::map - Intersect_map; - typedef typename Intersect_map::iterator Intersect_map_iterator; + using Intersection_point = std::pair; + using Intersection_result = + boost::variant; + using Optional_intersection = boost::optional; + using Intersect_list = std::list; + using Intersect_map = + std::map; + using Intersect_map_iterator = typename Intersect_map::iterator; - typedef std::set Curves_set; - typedef typename Curves_set::iterator Curves_set_iterator; + using Curves_set = std::set; + using Curves_set_iterator = typename Curves_set::iterator; - typedef Arr_point_location_result Pl_result; - typedef typename Pl_result::Type Pl_result_type; + using Pl_result = Arr_point_location_result; + using Pl_result_type = typename Pl_result::Type; // Data members: Arrangement_2& m_arr; // The associated arrangement. @@ -193,8 +198,7 @@ class Arrangement_zone_2 { * \param pl A point-location object associated with the arrangement. */ template - void init(const X_monotone_curve_2& cv, const PointLocation& pl) - { + void init(const X_monotone_curve_2& cv, const PointLocation& pl) { // Set the curve and check whether its left end has boundary conditions. m_cv = cv; @@ -267,8 +271,7 @@ class Arrangement_zone_2 { */ bool do_overlap_impl(const X_monotone_curve_2& cv1, const X_monotone_curve_2& cv2, - const Point_2& p, Arr_all_sides_oblivious_tag) const - { + const Point_2& p, Arr_all_sides_oblivious_tag) const { return m_geom_traits->compare_y_at_x_right_2_object()(cv1, cv2, p) == EQUAL; } @@ -381,8 +384,7 @@ class Arrangement_zone_2 { { return (_is_to_right_impl(p, he, Are_all_sides_oblivious_category())); } bool _is_to_right_impl(const Point_2& p, Halfedge_handle he, - Arr_all_sides_oblivious_tag) const - { + Arr_all_sides_oblivious_tag) const { return (((he->direction() == ARR_LEFT_TO_RIGHT) && m_geom_traits->compare_xy_2_object()(p, he->target()->point()) == LARGER) || @@ -400,16 +402,20 @@ class Arrangement_zone_2 { bool is_intersection_valid(const Point_2& ip, Arr_parameter_space& intersection_location) const { return is_intersection_valid_impl(ip, intersection_location, - Are_all_sides_oblivious_category()); + Left_or_right_sides_category()); } bool is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_all_sides_oblivious_tag) const; + Arr_boundary_cond_tag) const; + + bool is_intersection_valid_impl(const Point_2& ip, + Arr_parameter_space& intersection_location, + Arr_has_identified_side_tag) const; bool is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_not_all_sides_oblivious_tag) const; + Arr_has_open_side_tag) const; /*! Compute the (lexicographically) leftmost intersection of the query * curve with a given halfedge on the boundary of a face in the arrangement. From 2549f47191a4104e45b20052973a72aa95fb4f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 10 Aug 2023 17:27:29 +0200 Subject: [PATCH 0601/1398] fix other warnings --- .../test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp | 2 +- .../test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp index 9b39a907f43b..90ec34747390 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp @@ -44,7 +44,7 @@ int main() int count = 0; for (int i = 0; i < 6; ++i) { - const Output_type result = segment_coordinates(query_points[i], std::back_inserter(old_coordinates)); + segment_coordinates(query_points[i], std::back_inserter(old_coordinates)); CGAL::Barycentric_coordinates::segment_coordinates_2( first_vertex, second_vertex, query_points[i], std::back_inserter(new_coordinates)); diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp index bd83f52a5bd9..58506a5cec07 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp @@ -43,7 +43,7 @@ int main() int count = 0; for (int i = 0; i < 5; ++i) { - const Output_type result = triangle_coordinates(query_points[i], std::back_inserter(old_coordinates)); + triangle_coordinates(query_points[i], std::back_inserter(old_coordinates)); CGAL::Barycentric_coordinates::triangle_coordinates_2( first_vertex, second_vertex, third_vertex, query_points[i], std::back_inserter(new_coordinates)); From 0762a3040051bc0eb4fa611e20e1cfd57302321f Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 10 Aug 2023 21:38:52 +0300 Subject: [PATCH 0602/1398] Fixed is_intersection_valid_impl() and added test case --- .../Arrangement_2/Arrangement_zone_2_impl.h | 11 ++++++++--- .../include/CGAL/Arrangement_zone_2.h | 4 ++-- .../geodesic_arcs_on_sphere/test40.txt | 17 +++++++++++++++++ ...est_construction.geodesic_arcs_on_sphere.cmd | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test40.txt diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index 6903b44429a0..222f869444a8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -499,14 +499,15 @@ _direct_intersecting_edge_to_left(const X_monotone_curve_2& cv_ins, } } -//----------------------------------------------------------------------------- +//! Implementation for no boundary conditions. template bool Arrangement_zone_2:: is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& /* intersection_location */, - Arr_boundary_cond_tag) const + Arr_all_sides_oblivious_tag) const { return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); } +//! Implementation for left and right identified boundaries. template bool Arrangement_zone_2:: is_intersection_valid_impl(const Point_2& ip, @@ -539,11 +540,15 @@ is_intersection_valid_impl(const Point_2& ip, return (m_geom_traits->compare_xy_2_object()(ip, m_left_pt) == LARGER); } +/*! Implementation for all the rest. + * It would be better to split into the various cases, which is the cartesian + * product of (contructed, closed, open) X (contructed, closed, open) + */ template bool Arrangement_zone_2:: is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_has_open_side_tag) const { + Arr_boundary_cond_tag) const { auto equal = m_geom_traits->equal_2_object(); if (m_left_on_boundary) { // The left-end lies on the left boundary. If the intersection point is not diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 5d22e410109f..2a5db1727c3e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -407,7 +407,7 @@ class Arrangement_zone_2 { bool is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_boundary_cond_tag) const; + Arr_all_sides_oblivious_tag) const; bool is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, @@ -415,7 +415,7 @@ class Arrangement_zone_2 { bool is_intersection_valid_impl(const Point_2& ip, Arr_parameter_space& intersection_location, - Arr_has_open_side_tag) const; + Arr_boundary_cond_tag) const; /*! Compute the (lexicographically) leftmost intersection of the query * curve with a given halfedge on the boundary of a face in the arrangement. diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test40.txt b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test40.txt new file mode 100644 index 000000000000..adccf6ecad93 --- /dev/null +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test40.txt @@ -0,0 +1,17 @@ +5 +0 -1 0 0 0 -1 0 +0 0 -1 0 0 0 -1 +0 0 0 -1 0 1 0 +0 0 1 0 -1 0 0 +0 0 0 -1 -1 0 0 +0 +4 5 3 +0 0 -1 +-1 0 0 +0 -1 0 +0 1 0 +0 0 0 -1 -1 0 0 1 +0 -1 0 0 0 -1 0 1 +0 0 -1 0 0 0 -1 1 +0 0 0 -1 0 1 0 1 +0 0 1 0 -1 0 0 1 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd index 547aa5188647..d995644a0954 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd @@ -37,3 +37,4 @@ data/test_construction/geodesic_arcs_on_sphere/test36.txt data/test_construction/geodesic_arcs_on_sphere/test37.txt data/test_construction/geodesic_arcs_on_sphere/test38.txt data/test_construction/geodesic_arcs_on_sphere/test39.txt +data/test_construction/geodesic_arcs_on_sphere/test40.txt From 0ce82c0bd5a389b92f9ef1d9f6fea0544fa97442 Mon Sep 17 00:00:00 2001 From: albert-github Date: Sun, 13 Aug 2023 18:22:07 +0200 Subject: [PATCH 0603/1398] Better showing of `#include` Getting a better (and consistent) output for the include file to be used with some functions. Normally `#include` are sown as in a typewrite font, but the `#include` in these cases were shown in a code block way. --- .../PackageDescription.txt | 4 +- .../PackageDescription.txt | 4 +- .../PackageDescription.txt | 8 +-- Nef_3/doc/Nef_3/PackageDescription.txt | 4 +- .../PackageDescription.txt | 4 +- .../doc/Point_set_3/PackageDescription.txt | 4 +- Polygon/doc/Polygon/PackageDescription.txt | 8 +-- .../doc/Polyhedron/PackageDescription.txt | 4 +- .../doc/Surface_mesh/PackageDescription.txt | 4 +- .../PackageDescription.txt | 4 +- .../Triangulation_2/PackageDescription.txt | 4 +- .../Triangulation_3/PackageDescription.txt | 4 +- .../Voronoi_diagram_2/PackageDescription.txt | 4 +- Weights/doc/Weights/PackageDescription.txt | 72 +++++-------------- 14 files changed, 33 insertions(+), 99 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt index 04ce3c47c289..a23221fc04fe 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt @@ -47,9 +47,7 @@ namespace ArrTraits {} /// \ingroup PkgArrangementOnSurface2Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgArrangementOnSurface2Draw Drawing /// \ingroup PkgArrangementOnSurface2Ref diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt index 7c3b7b13e71a..3050f0a5654e 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt @@ -7,9 +7,7 @@ namespace ArrDirectionalTraits {} /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPolygonSet2 Draw a 2D Polygon Set /// \ingroup PkgBooleanSetOperations2Ref diff --git a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt index d8cc1ad2fbd5..03264451c0c0 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt @@ -12,17 +12,13 @@ /// \ingroup PkgLinearCellComplexRef /*! High-level operations. - \code - #include - \endcode + `#include ` */ /// \defgroup PkgLinearCellComplexOperations Operations for Linear Cell Complex /// \ingroup PkgLinearCellComplexRef /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawLinearCellComplex Draw a Linear Cell Complex /// \ingroup PkgLinearCellComplexRef diff --git a/Nef_3/doc/Nef_3/PackageDescription.txt b/Nef_3/doc/Nef_3/PackageDescription.txt index 7edd3f45d4b5..db62abd9bf7e 100644 --- a/Nef_3/doc/Nef_3/PackageDescription.txt +++ b/Nef_3/doc/Nef_3/PackageDescription.txt @@ -4,9 +4,7 @@ /// \ingroup PkgNef3Ref /*! Draw. - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawNef3 Draw a Nef Polyhedron /// \ingroup PkgNef3Ref diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt index dcffaea8da8e..767fc2b01e05 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt @@ -16,9 +16,7 @@ /// \ingroup PkgPeriodic2Triangulation2Ref /*! Draw. - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPeriodic2Triangulation2 Draw a 2D Periodic Triangulation /// \ingroup PkgPeriodic2Triangulation2Ref diff --git a/Point_set_3/doc/Point_set_3/PackageDescription.txt b/Point_set_3/doc/Point_set_3/PackageDescription.txt index 271b13b4634a..c6d433e20bfe 100644 --- a/Point_set_3/doc/Point_set_3/PackageDescription.txt +++ b/Point_set_3/doc/Point_set_3/PackageDescription.txt @@ -1,9 +1,7 @@ /// \defgroup PkgPointSet3Ref 3D Point Set Reference /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPointSet3D Draw a 3D Point Set /// \ingroup PkgPointSet3Ref diff --git a/Polygon/doc/Polygon/PackageDescription.txt b/Polygon/doc/Polygon/PackageDescription.txt index 1d48e74493c8..fd7cd1f7e0cf 100644 --- a/Polygon/doc/Polygon/PackageDescription.txt +++ b/Polygon/doc/Polygon/PackageDescription.txt @@ -7,17 +7,13 @@ /// \ingroup PkgPolygon2Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPolygon2 Draw a 2D Polygon /// \ingroup PkgPolygon2Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPolygonWithHoles2 Draw a 2D Polygon with Holes /// \ingroup PkgPolygon2Ref diff --git a/Polyhedron/doc/Polyhedron/PackageDescription.txt b/Polyhedron/doc/Polyhedron/PackageDescription.txt index 827683c79181..12ee7940d944 100644 --- a/Polyhedron/doc/Polyhedron/PackageDescription.txt +++ b/Polyhedron/doc/Polyhedron/PackageDescription.txt @@ -6,9 +6,7 @@ /// \ingroup PkgPolyhedronRef /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawPolyhedron Draw a Polyhedron 3 /// \ingroup PkgPolyhedronRef diff --git a/Surface_mesh/doc/Surface_mesh/PackageDescription.txt b/Surface_mesh/doc/Surface_mesh/PackageDescription.txt index 974c86b9f544..4278f42d86cc 100644 --- a/Surface_mesh/doc/Surface_mesh/PackageDescription.txt +++ b/Surface_mesh/doc/Surface_mesh/PackageDescription.txt @@ -1,9 +1,7 @@ /// \defgroup PkgSurface_mesh Surface Mesh Reference /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawSurfaceMesh Draw a Surface Mesh /// \ingroup PkgSurface_mesh diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt index 408283838941..7087216cd1a9 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt @@ -7,9 +7,7 @@ /// \ingroup PkgSurfaceMeshTopologyRef /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawFaceGraphWithPaths Draw a Mesh with Paths /// \ingroup PkgSurfaceMeshTopologyRef diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index 65b8c9137e4b..f9e1d3a2c047 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -14,9 +14,7 @@ /// \ingroup PkgTriangulation2Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawTriangulation2 Draw a Triangulation 2 /// \ingroup PkgTriangulation2Ref diff --git a/Triangulation_3/doc/Triangulation_3/PackageDescription.txt b/Triangulation_3/doc/Triangulation_3/PackageDescription.txt index 6e12268a1798..b1bbaf9f3aca 100644 --- a/Triangulation_3/doc/Triangulation_3/PackageDescription.txt +++ b/Triangulation_3/doc/Triangulation_3/PackageDescription.txt @@ -13,9 +13,7 @@ /// \ingroup PkgTriangulation3Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawTriangulation3 Draw a Triangulation 3 /// \ingroup PkgTriangulation3Ref diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt index d888fa4473ae..dc6ca27d40ae 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt @@ -13,9 +13,7 @@ /// \ingroup PkgVoronoiDiagram2Ref /*! - \code - #include - \endcode + `#include ` */ /// \defgroup PkgDrawVoronoiDiagram2 Draw a 2D Voronoi Diagram /// \ingroup PkgVoronoiDiagram2Ref diff --git a/Weights/doc/Weights/PackageDescription.txt b/Weights/doc/Weights/PackageDescription.txt index b59f3e06d683..eb5f9bf451c6 100644 --- a/Weights/doc/Weights/PackageDescription.txt +++ b/Weights/doc/Weights/PackageDescription.txt @@ -19,9 +19,7 @@ Models and functions that can be used to compute weights which have a simple ana \defgroup PkgWeightsRefUniformWeights Uniform Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is always equal to 1. @@ -35,9 +33,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefShepardWeights Shepard Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \frac{1}{d^a}\f$ @@ -65,9 +61,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefInverseDistanceWeights Inverse Distance Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \frac{1}{d}\f$ @@ -96,9 +90,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefThreePointFamilyWeights Three Point Family Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \frac{d_2^a A_0 - d^a B + d_0^a A_2}{A_0 A_2}\f$ @@ -137,9 +129,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefWachspressWeights Wachspress Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \frac{C}{A_0 A_2}\f$ @@ -170,9 +160,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefAuthalicWeights Authalic Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = 2 \frac{\cot\beta + \cot\gamma}{d^2}\f$ @@ -202,9 +190,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefMeanValueWeights Mean Value Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \pm 2 \sqrt{\frac{2 (d_0 d_2 - D)}{(d d_0 + D_0)(d d_2 + D_2)}}\f$ @@ -241,9 +227,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefTangentWeights Tangent Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = 2 \frac{t_1 + t_2}{d}\f$, where @@ -278,9 +262,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefDiscreteHarmonicWeights Discrete Harmonic Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = \frac{d_2^2 A_0 - d^2 B + d_0^2 A_2}{A_0 A_2}\f$ @@ -311,9 +293,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefCotangentWeights Cotangent Weight \ingroup PkgWeightsRefAnalytic -\verbatim -#include -\endverbatim +`#include ` This weight is computed as \f$w = 2 (\cot\beta + \cot\gamma)\f$ @@ -348,9 +328,7 @@ to polygons. These weights are then normalized in order to obtain barycentric co \defgroup PkgWeightsRefBarycentricWachspressWeights Wachspress Weights \ingroup PkgWeightsRefBarycentric -\verbatim -#include -\endverbatim +`#include ` Wachspress weights which can be computed for a query point with respect to the vertices of a strictly convex polygon. @@ -361,9 +339,7 @@ vertices of a strictly convex polygon. \defgroup PkgWeightsRefBarycentricMeanValueWeights Mean Value Weights \ingroup PkgWeightsRefBarycentric -\verbatim -#include -\endverbatim +`#include ` Mean value weights which can be computed for a query point with respect to the vertices of a simple polygon. @@ -374,9 +350,7 @@ vertices of a simple polygon. \defgroup PkgWeightsRefBarycentricDiscreteHarmonicWeights Discrete Harmonic Weights \ingroup PkgWeightsRefBarycentric -\verbatim -#include -\endverbatim +`#include ` Discrete Harmonic weights which can be computed for a query point with respect to the vertices of a strictly convex polygon. @@ -394,9 +368,7 @@ used to balance other weights. \defgroup PkgWeightsRefUniformRegionWeights Uniform Region Weight \ingroup PkgWeightsRefRegions -\verbatim -#include -\endverbatim +`#include ` This weight is always equal to 1. @@ -410,9 +382,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefTriangularRegionWeights Triangular Region Weight \ingroup PkgWeightsRefRegions -\verbatim -#include -\endverbatim +`#include ` This weight is the area of the shaded region in the figure below. The region is the triangle `[p, q, r]`. @@ -431,9 +401,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefBarycentricRegionWeights Barycentric Region Weight \ingroup PkgWeightsRefRegions -\verbatim -#include -\endverbatim +`#include ` This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the barycenter of @@ -453,9 +421,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefVoronoiRegionWeights Voronoi Region Weight \ingroup PkgWeightsRefRegions -\verbatim -#include -\endverbatim +`#include ` This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the circumcenter of @@ -477,9 +443,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefMixedVoronoiRegionWeights Mixed Voronoi Region Weight \ingroup PkgWeightsRefRegions -\verbatim -#include -\endverbatim +`#include ` This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the circumcenter of From 5db243629a35d535b6bec49990680fd813957a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 14 Aug 2023 14:02:39 +0200 Subject: [PATCH 0604/1398] try working around an error with MSVC2017 `error C2338: Sorry: std::any doesn't support over-aligned types at this time.` --- STL_Extension/include/CGAL/Object.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/STL_Extension/include/CGAL/Object.h b/STL_Extension/include/CGAL/Object.h index 8a3ed24dad50..765b5e70e3f3 100644 --- a/STL_Extension/include/CGAL/Object.h +++ b/STL_Extension/include/CGAL/Object.h @@ -29,20 +29,20 @@ #include #include -#include +#include #include namespace CGAL { class Object { - std::shared_ptr obj; + std::shared_ptr obj; // returns an any pointer from a variant struct Any_from_variant { template - std::any* operator()(const T& t) const { - return new std::any(t); + boost::any* operator()(const T& t) const { + return new boost::any(t); } }; @@ -59,7 +59,7 @@ class Object Object() : obj() { } template - Object(T && t, private_tag) : obj(new std::any(std::forward(t))) { } + Object(T && t, private_tag) : obj(new boost::any(std::forward(t))) { } // implicit constructor from optionals containing variants template @@ -74,7 +74,7 @@ class Object template bool assign(T &t) const { - const T* res = std::any_cast(obj.get()); + const T* res = boost::any_cast(obj.get()); if (!res) return false; t = *res; return true; @@ -103,7 +103,7 @@ class Object template bool is() const { - return obj && std::any_cast(obj.get()); + return obj && boost::any_cast(obj.get()); } const std::type_info & type() const @@ -157,14 +157,14 @@ template inline const T * object_cast(const Object * o) { - return std::any_cast((o->obj).get()); + return boost::any_cast((o->obj).get()); } template inline T object_cast(const Object & o) { - const T * result = std::any_cast((o.obj).get()); + const T * result = boost::any_cast((o.obj).get()); if (!result) throw Bad_object_cast(); return *result; From d8a6478b57dc0c9965b322375b17fb4a6a8af744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 16 Aug 2023 09:02:28 +0200 Subject: [PATCH 0605/1398] remove another use of deprecated API --- .../include/CGAL/CGAL_Ipelet_base_v7.h | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h index 276e5d5c651a..5373b0a3445f 100644 --- a/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h +++ b/CGAL_ipelets/include/CGAL/CGAL_Ipelet_base_v7.h @@ -822,41 +822,34 @@ namespace CGAL{ CGAL::Cartesian_converter conv; Exact_circle_2 exact_circle=conv(approx_circle); + typedef std::pair Cp2_mult; SK::Intersect_2 inter=SK().intersect_2_object(); - std::vector< std::pair > points; + std::vector< Cp2_mult > points; points.reserve(8); - std::vector ints; + std::vector< Cp2_mult > ints; ints.reserve(2); - std::pair tmp_pt; int indices[8]={-1,-1,-1,-1,-1,-1,-1,-1}; for (unsigned i=0;i!=4;++i){ ints.clear(); SK::Segment_2 S(conv(bbox[i]),conv(bbox[(i+1)%4])); - inter(exact_circle,SK::Line_arc_2(S),std::back_inserter(ints)); + inter(exact_circle,SK::Line_arc_2(S),dispatch_or_drop_output(std::back_inserter(ints))); unsigned index=0; - bool ok=true; switch (ints.size()){ case 1: - ok=CGAL::assign(tmp_pt,ints[0]); - CGAL_assertion(ok); CGAL_USE(ok); - points.push_back(tmp_pt); + points.push_back(ints[0]); index=points.size()-1; indices[i]=index; indices[(i+1)%4+4]=index; break; case 2: int right_ind=i<2?0:1; - ok=CGAL::assign(tmp_pt,ints[right_ind]); - CGAL_assertion(ok); CGAL_USE(ok); - points.push_back(tmp_pt); + points.push_back(ints[right_ind]); index=points.size()-1; indices[i]=index; - ok=CGAL::assign(tmp_pt,ints[(right_ind+1)%2]); - CGAL_assertion(ok); CGAL_USE(ok); - points.push_back(tmp_pt); + points.push_back(ints[(right_ind+1)%2]); index=points.size()-1; indices[(i+1)%4+4]=index; break; From f1f6126f1c725ee33d3eb96e68a3c59ee1ec2ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 16 Aug 2023 09:11:30 +0200 Subject: [PATCH 0606/1398] add missing IO namespace --- .../include/CGAL/Curved_kernel_via_analysis_2/Point_2.h | 8 ++++---- .../test/Arrangement_on_surface_2/Traits_base_test.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index 2d194eb5254c..789f24b841e4 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -700,13 +700,13 @@ class Point_2 : default: // ASCII os << "Point_2("; - os << oformat(this->ptr()->_m_xy); + os << ::CGAL::IO::oformat(this->ptr()->_m_xy); os << ","; - os << oformat(this->ptr()->_m_x); + os << ::CGAL::IO::oformat(this->ptr()->_m_x); os << ","; - os << oformat(this->ptr()->_m_curve); + os << ::CGAL::IO::oformat(this->ptr()->_m_curve); os << ","; - os << oformat(this->ptr()->_m_arcno); + os << ::CGAL::IO::oformat(this->ptr()->_m_arcno); os << ","; os << this->ptr()->_m_location; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h index 696c03ebb69e..f03b66bb81da 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Traits_base_test.h @@ -136,8 +136,8 @@ class Traits_base_test : public IO_test { typename Traits::Equal_2 equal = this->m_geom_traits.equal_2_object(); if (equal(exp_answer, real_answer)) return true; - std::string exp_answer_str = boost::lexical_cast( oformat(exp_answer) ); - std::string real_answer_str = boost::lexical_cast( oformat(real_answer) ); + std::string exp_answer_str = boost::lexical_cast( CGAL::IO::oformat(exp_answer) ); + std::string real_answer_str = boost::lexical_cast( CGAL::IO::oformat(real_answer) ); this->print_answer(exp_answer_str, real_answer_str, "x-monotone curve"); return false; } From d6c04e3b8a4222e552b0bfeeb8c5d953dfd49183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 16 Aug 2023 09:17:58 +0200 Subject: [PATCH 0607/1398] do not use ref wrapper --- .../CGAL/Arr_point_location/Trapezoidal_decomposition_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index e461b86a4432..1a3549c0008c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -272,7 +272,7 @@ class Trapezoidal_decomposition_2 Base_map_item_iterator() : traits(0), m_cur_item(Td_map_item(0)){ } Base_map_item_iterator(const Traits* traits_, - std::optional> curr = std::nullopt) + std::optional curr = std::nullopt) :traits(traits_), m_cur_item((curr) ? *curr : Td_map_item(0) ) { } Base_map_item_iterator(const Base_map_item_iterator &it) From b2be6dbbef3b5b62ecbfc82164f740cbc4ca568f Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Fri, 18 Aug 2023 09:25:39 +0200 Subject: [PATCH 0608/1398] fix istream for optional Co-authored-by: Laurent Rineau --- Stream_support/include/CGAL/IO/io.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Stream_support/include/CGAL/IO/io.h b/Stream_support/include/CGAL/IO/io.h index e57d4327bac6..d9c2ea7f761a 100644 --- a/Stream_support/include/CGAL/IO/io.h +++ b/Stream_support/include/CGAL/IO/io.h @@ -281,7 +281,11 @@ class Input_rep> Input_rep( std::optional& tt) : t(tt) {} //! perform the input, calls \c operator\>\> by default. - std::istream& operator()( std::istream& is) const { return (is >> t.value()); } + std::istream& operator()( std::istream& is) const { + T v; + if(is >> v) t = v; + return is; + } }; #if CGAL_FORCE_IFORMAT_DOUBLE || \ From 9eda4485d2283b6cb67ebaabbcf981ab2046c9cd Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 18 Aug 2023 11:06:30 +0200 Subject: [PATCH 0609/1398] changed the output from unoriented polygon soup to oriented polygon mesh --- .../include/CGAL/Polygonal_surface_reconstruction.h | 11 ++++++++++- .../internal/point_set_with_planes.h | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction.h b/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction.h index e78c2d390a65..9ca8016600b6 100644 --- a/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction.h +++ b/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction.h @@ -18,6 +18,10 @@ #include #include #include +#include +#include +#include +#include #include @@ -455,7 +459,12 @@ namespace CGAL { // Converts from internal data structure to the required `PolygonMesh`. output_mesh.clear(); // make sure it is empty. - CGAL::copy_face_graph(target_mesh, output_mesh); + std::vector points; + std::vector > polygons; + CGAL::Polygon_mesh_processing::polygon_mesh_to_polygon_soup(target_mesh, points, polygons); + CGAL::Polygon_mesh_processing::merge_duplicate_points_in_polygon_soup(points, polygons); + CGAL::Polygon_mesh_processing::orient_polygon_soup(points, polygons); + CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, polygons, output_mesh); } else { error_message_ = "solving the binary program failed"; diff --git a/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction/internal/point_set_with_planes.h b/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction/internal/point_set_with_planes.h index 09d628e7f4e0..02e68d733ce6 100644 --- a/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction/internal/point_set_with_planes.h +++ b/Polygonal_surface_reconstruction/include/CGAL/Polygonal_surface_reconstruction/internal/point_set_with_planes.h @@ -67,6 +67,18 @@ namespace CGAL { delete supporting_plane_; supporting_plane_ = new Plane; CGAL::linear_least_squares_fitting_3(pts.begin(), pts.end(), *supporting_plane_, CGAL::Dimension_tag<0>()); + + // Check orientation + int vote_for_opposite = 0; + for (std::size_t i = 0; i < size(); i++) + if (supporting_plane_->orthogonal_vector() * point_set_->normal_map()[at(i)] < 0) + vote_for_opposite++; + else + vote_for_opposite--; + + if (vote_for_opposite > 0) + *supporting_plane_ = supporting_plane_->opposite(); + return supporting_plane_; } From 7b00717eabbe10265204ad6261a364064dc0055b Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Fri, 18 Aug 2023 12:49:32 +0300 Subject: [PATCH 0610/1398] Fixed comment --- .../include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index e3a934889bce..ddf3688c48de 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -95,11 +95,11 @@ class Arr_extended_direction_3 : public Kernel::Direction_3 { return (*this); } - /*! Set the location of the point. + /*! Set the location type of the point. */ void set_location(Location_type location) { m_location = location; } - /*! Obtain the location of the point. + /*! Obtain the location type of the point. */ Location_type location() const { return m_location; } From d3b5cd997cfa98cb4de7d7415c2bd8ce6c66d989 Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Fri, 18 Aug 2023 12:05:26 +0200 Subject: [PATCH 0611/1398] added Polygon_mesh_processing to dependencies --- .../doc/Polygonal_surface_reconstruction/dependencies | 1 + .../package_info/Polygonal_surface_reconstruction/dependencies | 1 + 2 files changed, 2 insertions(+) diff --git a/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies b/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies index 43aca366b54b..ffd752d9c821 100644 --- a/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies +++ b/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies @@ -5,5 +5,6 @@ Circulator Alpha_shapes_2 Surface_mesh Point_set_processing_3 +Polygon_mesh_processing Solver_interface Shape_detection diff --git a/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies b/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies index cf61d44e4ba4..650e4a65343e 100644 --- a/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies +++ b/Polygonal_surface_reconstruction/package_info/Polygonal_surface_reconstruction/dependencies @@ -22,6 +22,7 @@ Point_set_3 Point_set_processing_3 Polygon Polygonal_surface_reconstruction +Polygon_mesh_processing Principal_component_analysis Principal_component_analysis_LGPL Profiling_tools From de459faa76881bd151204fb1cedb16324f4f94ed Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Fri, 18 Aug 2023 13:35:00 +0300 Subject: [PATCH 0612/1398] Fixed the Approximate_2::operator() that returns a sequence of points that approximate a curve; in particular, respected the l2r parameter. --- .../Arr_geodesic_arc_on_sphere_traits_2.h | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index ddf3688c48de..3dde86da5a9a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -2889,18 +2889,31 @@ class Arr_geodesic_arc_on_sphere_traits_2 : public Kernel_ { OutputIterator operator()(const X_monotone_curve_2& xcv, Approximate_number_type error, OutputIterator oi, bool l2r = true) const { - auto s = xcv.source(); - auto t = xcv.target(); - auto n = xcv.normal(); - - // get the approximate points; - auto as = (*this)(s); - auto at = (*this)(t); + const auto& s = xcv.source(); + const auto& t = xcv.target(); + const auto& n = xcv.normal(); + const auto dx = CGAL::to_double(n.dx()); + const auto dy = CGAL::to_double(n.dy()); + const auto dz = CGAL::to_double(n.dz()); + + Approximate_point_2 as, at; + Approximate_kernel_vector_3 vn; + if (xcv.is_directed_right() == l2r) { + // Get the approximate points + as = (*this)(s); + at = (*this)(t); + vn = Approximate_kernel_vector_3(dx, dy, dz); + } + else { + // Get the approximate points + as = (*this)(t); + at = (*this)(s); + vn = Approximate_kernel_vector_3(-dx, -dy, -dz); + } // convert the approximate points to vectors with approximate-kernel auto vs = approximate_vector_3(as); auto vt = approximate_vector_3(at); - auto vn = approximate_vector_3(n); // normalize the vectors auto normalize = [](auto& x) { x /= std::sqrt(x.squared_length()); }; From 51fc8aa18d314194a8cf0c6b3ee5aff18aed2c09 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Fri, 18 Aug 2023 13:38:34 +0300 Subject: [PATCH 0613/1398] Removed unused variable --- .../include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index 222f869444a8..7a824ab974ae 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -581,7 +581,6 @@ _compute_next_intersection(Halfedge_handle he, << skip_first_point << ")" << std::endl; #endif - auto equal = m_geom_traits->equal_2_object(); auto compare_xy = m_geom_traits->compare_xy_2_object(); auto ctr_min = m_geom_traits->construct_min_vertex_2_object(); auto is_closed = m_geom_traits->is_closed_2_object(); From 3b84bd05f86e4003804b3b5b59858f8ba02ceadc Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Fri, 18 Aug 2023 13:45:53 +0300 Subject: [PATCH 0614/1398] Reported the fix in PR #7644 --- Installation/CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index bedbfc898326..a0e667f03280 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -11,6 +11,9 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. +### [2D Arrangements](https://doc.cgal.org/6.0/Manual/packages.html#PkgArrangementOnSurface2) +- Fixed a bug in the zone construction code applied to arrangements of geodesic arcs on a sphere, + when inserting an arc that lies on the identification curve. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- From 33e88b2e8fea8fd747a4095d7ab6665aaeb3456a Mon Sep 17 00:00:00 2001 From: Sven Oesau Date: Mon, 21 Aug 2023 11:33:50 +0200 Subject: [PATCH 0615/1398] removing PMP dependency following review [skip ci] --- .../doc/Polygonal_surface_reconstruction/dependencies | 1 - 1 file changed, 1 deletion(-) diff --git a/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies b/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies index ffd752d9c821..43aca366b54b 100644 --- a/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies +++ b/Polygonal_surface_reconstruction/doc/Polygonal_surface_reconstruction/dependencies @@ -5,6 +5,5 @@ Circulator Alpha_shapes_2 Surface_mesh Point_set_processing_3 -Polygon_mesh_processing Solver_interface Shape_detection From a0255568dd31824fef300eecee5a1e00339613e0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 21 Aug 2023 11:09:45 +0100 Subject: [PATCH 0616/1398] Update changes.md --- Installation/CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 388f336227b9..0466359b82b1 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -10,6 +10,7 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. +- The demos as well as the `draw()` functions using the `Basic_viewer` are based on Qt6 [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) From 58e0bf13a685e5f0d88685a69a5e34350755b8bc Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Wed, 2 Aug 2023 10:41:21 +0200 Subject: [PATCH 0617/1398] reintroduce mean curvature and gaussian curvature in "display properties" broken for now --- .../Plugins/Display/Display_property.ui | 26 +++ .../Display/Display_property_plugin.cpp | 159 +++++++++++++++++- 2 files changed, 183 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui index 656ec4827c55..d1e5e795e711 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui @@ -180,6 +180,32 @@ + + + + 0 + + + 100 + + + true + + + Qt::Horizontal + + + QSlider::TicksAbove + + + + + + + Expanding Radius: 0 + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 994dcd2e8d9b..5b212d5a4703 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -85,6 +87,9 @@ class Display_property_plugin double gI = 1.; double bI = 0.; + double expand_radius = 0; + double maxEdgeLength = -1; + Color_ramp color_ramp; std::vector color_map; QPixmap legend; @@ -98,6 +103,11 @@ class Display_property_plugin MIN_VALUE, MAX_VALUE }; + enum CurvatureType + { + MEAN_CURVATURE, + GAUSSIAN_CURVATURE, + }; public: bool applicable(QAction*) const Q_DECL_OVERRIDE @@ -196,6 +206,8 @@ class Display_property_plugin this, &Display_property_plugin::on_zoomToMinButton_pressed); connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, this, &Display_property_plugin::on_zoomToMaxButton_pressed); + connect(dock_widget->expandingRadiusSlider, SIGNAL(valueChanged(int)), + this, SLOT(setExpandingRadius(int))); } private Q_SLOTS: @@ -252,6 +264,20 @@ private Q_SLOTS: dock_widget->maxBox->setRange(-1000, 1000); dock_widget->maxBox->setValue(0); } + else if (property_name == "Interpolated Corrected Mean Curvature") + { + dock_widget->minBox->setRange(-99999999, 99999999); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-99999999, 99999999); + dock_widget->maxBox->setValue(0); + } + else if (property_name == "Interpolated Corrected Gaussian Curvature") + { + dock_widget->minBox->setRange(-99999999, 99999999); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-99999999, 99999999); + dock_widget->maxBox->setValue(0); + } else { dock_widget->minBox->setRange(-99999999, 99999999); @@ -432,11 +458,15 @@ private Q_SLOTS: dock_widget->propertyBox->addItems({"Smallest Angle Per Face", "Largest Angle Per Face", "Scaled Jacobian", - "Face Area"}); + "Face Area", + "Interpolated Corrected Mean Curvature", + "Interpolated Corrected Gaussian Curvature"}); property_simplex_types = { Property_simplex_type::FACE, Property_simplex_type::FACE, Property_simplex_type::FACE, - Property_simplex_type::FACE }; + Property_simplex_type::FACE, + Property_simplex_type::VERTEX, + Property_simplex_type::VERTEX }; detectSMScalarProperties(*(sm_item->face_graph())); } else if(ps_item) @@ -527,6 +557,16 @@ private Q_SLOTS: { displayArea(sm_item); } + else if(property_name == "Interpolated Corrected Mean Curvature") + { + displayInterpolatedCurvatureMeasure(sm_item, MEAN_CURVATURE); + sm_item->setRenderingMode(Gouraud); + } + else if(property_name == "Interpolated Corrected Gaussian Curvature") + { + displayInterpolatedCurvatureMeasure(sm_item, GAUSSIAN_CURVATURE); + sm_item->setRenderingMode(Gouraud); + } else { const int property_index = dock_widget->propertyBox->currentIndex(); @@ -629,6 +669,8 @@ private Q_SLOTS: removeDisplayPluginProperty(item, "f:display_plugin_largest_angle"); removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian"); removeDisplayPluginProperty(item, "f:display_plugin_area"); + removeDisplayPluginProperty(item, "v:interpolated_corrected_mean_curvature"); + removeDisplayPluginProperty(item, "v:interpolated_corrected_Gaussian_curvature"); } void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item, @@ -809,6 +851,119 @@ private Q_SLOTS: displaySMProperty("f:display_plugin_area", *sm); } + void setExpandingRadius(int val_int) + { + double sliderMin = dock_widget->expandingRadiusSlider->minimum(); + double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; + double val = val_int - sliderMin; + sliderMin = 0; + + SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); + + auto vpm = get(CGAL::vertex_point, smesh); + + if (maxEdgeLength < 0) + { + auto edge_range = CGAL::edges(smesh); + + if (edge_range.begin() == edge_range.end()) + { + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + return; + } + + auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return res == CGAL::SMALLER; + }); + + // if edge_reference is not derefrenceble + if (edge_reference == edge_range.end()) + { + expand_radius = 0; + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + return; + } + + maxEdgeLength = sqrt( + (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) + .squared_length() + ); + + } + + double outMax = 5 * maxEdgeLength, base = 1.2; + + expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + + } + + void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, CurvatureType mu_index) + { + namespace PMP = CGAL::Polygon_mesh_processing; + + if (mu_index != MEAN_CURVATURE && mu_index != GAUSSIAN_CURVATURE) return; + + std::string tied_string = (mu_index == MEAN_CURVATURE)? + "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_Gaussian_curvature"; + SMesh& smesh = *item->face_graph(); + + const auto vnm = smesh.property_map("v:normal_before_perturbation").first; + const bool vnm_exists = smesh.property_map("v:normal_before_perturbation").second; + + //compute once and store the value per vertex + bool non_init; + SMesh::Property_map mu_i_map; + std::tie(mu_i_map, non_init) = + smesh.add_property_map(tied_string, 0); + if (non_init) + { + if (vnm_exists) { + if (mu_index == MEAN_CURVATURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + else + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); + } + else { + if (mu_index == MEAN_CURVATURE) + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + else + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + } + double res_min = ARBITRARY_DBL_MAX, + res_max = -ARBITRARY_DBL_MAX; + SMesh::Vertex_index min_index, max_index; + for (SMesh::Vertex_index v : vertices(smesh)) + { + if (mu_i_map[v] > res_max) + { + res_max = mu_i_map[v]; + max_index = v; + } + if (mu_i_map[v] < res_min) + { + res_min = mu_i_map[v]; + min_index = v; + } + } +// if (mu_index == MEAN_CURVATURE){ +// mean_curvature_max[item] = std::make_pair(res_max, max_index); +// mean_curvature_min[item] = std::make_pair(res_min, min_index); +// } +// else { +// gaussian_curvature_max[item] = std::make_pair(res_max, max_index); +// gaussian_curvature_min[item] = std::make_pair(res_min, min_index); +// } + } +// treat_sm_property(tied_string, item->face_graph()); + } + private: template bool call_on_PS_property(const std::string& name, From 41bddc72d6f3feebad57682345b80fcbe289eca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 2 Aug 2023 12:29:29 +0200 Subject: [PATCH 0618/1398] Display plugin fixes --- .../Display/Display_property_plugin.cpp | 141 +++++++++--------- 1 file changed, 69 insertions(+), 72 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 5b212d5a4703..037d5bb4982b 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -47,6 +47,8 @@ #define ARBITRARY_DBL_MIN 1.0E-17 #define ARBITRARY_DBL_MAX 1.0E+17 +namespace PMP = CGAL::Polygon_mesh_processing; + using namespace CGAL::Three; Viewer_interface* (&getActiveViewer)() = Three::activeViewer; @@ -206,6 +208,7 @@ class Display_property_plugin this, &Display_property_plugin::on_zoomToMinButton_pressed); connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, this, &Display_property_plugin::on_zoomToMaxButton_pressed); + connect(dock_widget->expandingRadiusSlider, SIGNAL(valueChanged(int)), this, SLOT(setExpandingRadius(int))); } @@ -669,8 +672,8 @@ private Q_SLOTS: removeDisplayPluginProperty(item, "f:display_plugin_largest_angle"); removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian"); removeDisplayPluginProperty(item, "f:display_plugin_area"); - removeDisplayPluginProperty(item, "v:interpolated_corrected_mean_curvature"); - removeDisplayPluginProperty(item, "v:interpolated_corrected_Gaussian_curvature"); + removeDisplayPluginProperty(item, "v:display_plugin_interpolated_corrected_mean_curvature"); + removeDisplayPluginProperty(item, "v:display_plugin_interpolated_corrected_Gaussian_curvature"); } void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item, @@ -759,7 +762,7 @@ private Q_SLOTS: halfedge_descriptor local_border_h = opposite(halfedge(local_f, local_smesh), local_smesh); CGAL_assertion(is_border(local_border_h, local_smesh)); - CGAL::Polygon_mesh_processing::triangulate_faces(local_smesh); + PMP::triangulate_faces(local_smesh); double extremum_angle_in_face = ARBITRARY_DBL_MAX; halfedge_descriptor local_border_end_h = local_border_h; @@ -812,7 +815,7 @@ private Q_SLOTS: const SMesh& mesh) const { if(CGAL::is_triangle(halfedge(f, mesh), mesh)) - return CGAL::Polygon_mesh_processing::face_area(f, mesh); + return PMP::face_area(f, mesh); auto vpm = get(boost::vertex_point, mesh); @@ -828,8 +831,8 @@ private Q_SLOTS: } CGAL::Euler::add_face(local_vertices, local_smesh); - CGAL::Polygon_mesh_processing::triangulate_faces(local_smesh); - return CGAL::Polygon_mesh_processing::area(local_smesh); + PMP::triangulate_faces(local_smesh); + return PMP::area(local_smesh); } void displayArea(Scene_surface_mesh_item* sm_item) @@ -851,117 +854,105 @@ private Q_SLOTS: displaySMProperty("f:display_plugin_area", *sm); } - void setExpandingRadius(int val_int) + void setExpandingRadius(const int val_int) { double sliderMin = dock_widget->expandingRadiusSlider->minimum(); double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; - double val = val_int - sliderMin; + double val = val_int - sliderMin; sliderMin = 0; - SMesh& smesh = *(qobject_cast(scene->item(scene->mainSelectionIndex())))->face_graph(); + Scene_item* item = scene->item(scene->mainSelectionIndex()); + Scene_surface_mesh_item* sm_item = qobject_cast(item); + if(sm_item == nullptr) + return; + + SMesh& smesh = *(sm_item->face_graph()); auto vpm = get(CGAL::vertex_point, smesh); - if (maxEdgeLength < 0) + // @todo use the upcoming PMP::longest_edge + if(maxEdgeLength < 0) { auto edge_range = CGAL::edges(smesh); - if (edge_range.begin() == edge_range.end()) + if(num_edges(smesh) == 0) { expand_radius = 0; dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); return; } - auto edge_reference = std::max_element(edge_range.begin(), edge_range.end(), [&, vpm, smesh](auto l, auto r) { - auto res = EPICK().compare_squared_distance_3_object()( - get(vpm, source((l), smesh)), - get(vpm, target((l), smesh)), - get(vpm, source((r), smesh)), - get(vpm, target((r), smesh))); - return res == CGAL::SMALLER; - }); - - // if edge_reference is not derefrenceble - if (edge_reference == edge_range.end()) - { - expand_radius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); - return; - } + auto eit = std::max_element(edge_range.begin(), edge_range.end(), + [&, vpm, smesh](auto l, auto r) + { + auto res = EPICK().compare_squared_distance_3_object()( + get(vpm, source((l), smesh)), + get(vpm, target((l), smesh)), + get(vpm, source((r), smesh)), + get(vpm, target((r), smesh))); + return (res == CGAL::SMALLER); + }); - maxEdgeLength = sqrt( - (get(vpm, source((*edge_reference), smesh)) - get(vpm, target((*edge_reference), smesh))) - .squared_length() - ); + CGAL_assertion(eit != edge_range.end()); + maxEdgeLength = PMP::edge_length(*eit, smesh); } double outMax = 5 * maxEdgeLength, base = 1.2; expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); - } - void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, CurvatureType mu_index) + void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, + CurvatureType mu_index) { - namespace PMP = CGAL::Polygon_mesh_processing; + if(mu_index != MEAN_CURVATURE && mu_index != GAUSSIAN_CURVATURE) + return; - if (mu_index != MEAN_CURVATURE && mu_index != GAUSSIAN_CURVATURE) return; + std::string tied_string = (mu_index == MEAN_CURVATURE) ? "v:display_plugin_interpolated_corrected_mean_curvature" + : "v:display_plugin_interpolated_corrected_Gaussian_curvature"; - std::string tied_string = (mu_index == MEAN_CURVATURE)? - "v:interpolated_corrected_mean_curvature": "v:interpolated_corrected_Gaussian_curvature"; SMesh& smesh = *item->face_graph(); const auto vnm = smesh.property_map("v:normal_before_perturbation").first; const bool vnm_exists = smesh.property_map("v:normal_before_perturbation").second; - //compute once and store the value per vertex + // compute once and store the value per vertex bool non_init; SMesh::Property_map mu_i_map; - std::tie(mu_i_map, non_init) = - smesh.add_property_map(tied_string, 0); - if (non_init) + std::tie(mu_i_map, non_init) = smesh.add_property_map(tied_string, 0); + if(non_init) { - if (vnm_exists) { - if (mu_index == MEAN_CURVATURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); - else - PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius).vertex_normal_map(vnm)); - } - else { - if (mu_index == MEAN_CURVATURE) - PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + if(vnm_exists) + { + if(mu_index == MEAN_CURVATURE) + { + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, + CGAL::parameters::ball_radius(expand_radius) + .vertex_normal_map(vnm)); + } else - PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); + { + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, + CGAL::parameters::ball_radius(expand_radius) + .vertex_normal_map(vnm)); + } } - double res_min = ARBITRARY_DBL_MAX, - res_max = -ARBITRARY_DBL_MAX; - SMesh::Vertex_index min_index, max_index; - for (SMesh::Vertex_index v : vertices(smesh)) + else { - if (mu_i_map[v] > res_max) + if(mu_index == MEAN_CURVATURE) { - res_max = mu_i_map[v]; - max_index = v; + PMP::interpolated_corrected_mean_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); } - if (mu_i_map[v] < res_min) + else { - res_min = mu_i_map[v]; - min_index = v; + PMP::interpolated_corrected_Gaussian_curvature(smesh, mu_i_map, CGAL::parameters::ball_radius(expand_radius)); } } -// if (mu_index == MEAN_CURVATURE){ -// mean_curvature_max[item] = std::make_pair(res_max, max_index); -// mean_curvature_min[item] = std::make_pair(res_min, min_index); -// } -// else { -// gaussian_curvature_max[item] = std::make_pair(res_max, max_index); -// gaussian_curvature_min[item] = std::make_pair(res_min, min_index); -// } } -// treat_sm_property(tied_string, item->face_graph()); + + displaySMProperty(tied_string, smesh); } private: @@ -1119,6 +1110,10 @@ private Q_SLOTS: zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum); else if(property_name == "Face Area") zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum); + else if(property_name == "Interpolated Corrected Mean Curvature") + zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_interpolated_corrected_mean_curvature", extremum); + else if(property_name == "Interpolated Corrected Gaussian Curvature") + zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_interpolated_corrected_Gaussian_curvature", extremum); else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX) zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum); else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE) @@ -1401,7 +1396,7 @@ scaled_jacobian(const face_descriptor f, for(std::size_t i=0; i Date: Wed, 2 Aug 2023 13:26:02 +0200 Subject: [PATCH 0619/1398] Fix UI + fix connections --- .../Plugins/Display/Display_property.ui | 316 ++++++++++-------- .../Display/Display_property_plugin.cpp | 27 +- 2 files changed, 189 insertions(+), 154 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui index d1e5e795e711..0a824308300d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property.ui @@ -3,7 +3,7 @@ DisplayPropertyWidget - false + true @@ -39,9 +39,18 @@ + + true + Property + + false + + + false + 6 @@ -82,13 +91,114 @@ + + + + true + + + 0 + + + 100 + + + true + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksAbove + + + + + + + true + + + Expanding Radius: 0 + + + + + + + + + + false + + + Extreme Values + + + + + + Min Value + + + + + + + Max Value + + + + + + + 2.00 + + + true + + + + + + + Zoom to max value + + + + + + + Zoom to min value + + + + + + + 0.00 + + + true + + + true + + + - - - + + + Qt::Vertical @@ -100,7 +210,33 @@ - + + + + true + + + + + 0 + 0 + 236 + 335 + + + + + + + RAMP DISPLAYING + + + + + + + + Color Visualization @@ -118,10 +254,17 @@ 0 - - + + - Random colors + + + + + + + + Max color @@ -135,20 +278,6 @@ - - - - First color - - - - - - - Max color - - - @@ -159,58 +288,42 @@ - + - - + + - + Min color - - + + - Min color + First color + + + + + + + Random colors - - - - 0 - - - 100 - - - true - - - Qt::Horizontal - - - QSlider::TicksAbove - - - - - - - Expanding Radius: 0 - - - - - + + + + + Qt::Vertical @@ -222,97 +335,8 @@ - - - - true - - - - - 0 - 0 - 236 - 397 - - - - - - - RAMP DISPLAYING - - - - - - - - - - - false - - - Extreme Values - - - - - - Min Value - - - - - - - Max Value - - - - - - - 2.00 - - - true - - - - - - - Zoom to max value - - - - - - - Zoom to min value - - - - - - - 0.00 - - - true - - - true - - - - - - diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 037d5bb4982b..33a48a19e0ef 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -89,8 +89,8 @@ class Display_property_plugin double gI = 1.; double bI = 0.; - double expand_radius = 0; - double maxEdgeLength = -1; + double expand_radius = 0.; + double maxEdgeLength = -1.; Color_ramp color_ramp; std::vector color_map; @@ -209,8 +209,8 @@ class Display_property_plugin connect(dock_widget->zoomToMaxButton, &QPushButton::pressed, this, &Display_property_plugin::on_zoomToMaxButton_pressed); - connect(dock_widget->expandingRadiusSlider, SIGNAL(valueChanged(int)), - this, SLOT(setExpandingRadius(int))); + connect(dock_widget->expandingRadiusSlider, &QSlider::valueChanged, + this, &Display_property_plugin::setExpandingRadius); } private Q_SLOTS: @@ -512,6 +512,15 @@ private Q_SLOTS: { dock_widget->setEnabled(true); disableExtremeValues(); // only available after coloring + + // Curvature property-specific slider + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); + const bool is_curvature_property = (property_name == "Interpolated Corrected Mean Curvature" || + property_name == "Interpolated Corrected Gaussian Curvature"); + dock_widget->expandingRadiusLabel->setVisible(is_curvature_property); + dock_widget->expandingRadiusSlider->setVisible(is_curvature_property); + dock_widget->expandingRadiusLabel->setEnabled(is_curvature_property); + dock_widget->expandingRadiusSlider->setEnabled(is_curvature_property); } else // no or broken property { @@ -854,11 +863,12 @@ private Q_SLOTS: displaySMProperty("f:display_plugin_area", *sm); } - void setExpandingRadius(const int val_int) +private Q_SLOTS: + void setExpandingRadius() { double sliderMin = dock_widget->expandingRadiusSlider->minimum(); double sliderMax = dock_widget->expandingRadiusSlider->maximum() - sliderMin; - double val = val_int - sliderMin; + double val = dock_widget->expandingRadiusSlider->value() - sliderMin; sliderMin = 0; Scene_item* item = scene->item(scene->mainSelectionIndex()); @@ -878,7 +888,7 @@ private Q_SLOTS: if(num_edges(smesh) == 0) { expand_radius = 0; - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius: %1").arg(expand_radius)); return; } @@ -901,9 +911,10 @@ private Q_SLOTS: double outMax = 5 * maxEdgeLength, base = 1.2; expand_radius = (pow(base, val) - 1) * outMax / (pow(base, sliderMax) - 1); - dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius : %1").arg(expand_radius)); + dock_widget->expandingRadiusLabel->setText(tr("Expanding Radius: %1").arg(expand_radius)); } +private: void displayInterpolatedCurvatureMeasure(Scene_surface_mesh_item* item, CurvatureType mu_index) { From 15ad1f78eb521f66620f7f99792f4581ccf16db1 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 4 Aug 2023 11:20:52 +0200 Subject: [PATCH 0620/1398] Change example input to be analogous to uniform sizing --- .../isotropic_remeshing_with_sizing_example.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index e0564d27178d..cb4cdef20ac8 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include @@ -15,10 +16,9 @@ int main(int argc, char* argv[]) // const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/hand.off"); const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/nefertiti.off"); // const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cube.off"); - std::ifstream input(filename); Mesh mesh; - if (!input || !(input >> mesh) || !CGAL::is_triangle_mesh(mesh)) { + if (!PMP::IO::read_polygon_mesh(filename, mesh) || !CGAL::is_triangle_mesh(mesh)) { std::cerr << "Not a valid input file." << std::endl; return 1; } From 1f2c0f2471e02ca8a20894927a4c480141adedc7 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 4 Aug 2023 13:15:32 +0200 Subject: [PATCH 0621/1398] Remove extra --- .../Adaptive_sizing_field.h | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index dc14ae91d119..dea4dc457282 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -149,29 +149,6 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return get(m_vertex_sizing_map, v); } - template - void calc_sizing_map(const FaceRange& face_range) - { - if (face_range.size() == faces(m_pmesh).size()) - { - // calculate curvature from the whole mesh - calc_sizing_map(m_pmesh); - } - else - { - // expand face selection and calculate curvature from it - std::vector selection(face_range.begin(), face_range.end()); - auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); - for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); - for (face_descriptor f : face_range) put(is_selected, f, true); - CGAL::expand_face_selection(selection, m_pmesh, 1 - , is_selected, std::back_inserter(selection)); - CGAL::Face_filtered_graph ffg(m_pmesh, selection); - - calc_sizing_map(ffg); - } - } - boost::optional is_too_long(const halfedge_descriptor h) const { const FT sqlen = sqlength(h); From 00b4b93d1cf613f91dfe9c4c8f815b08b86d1d1f Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sun, 6 Aug 2023 12:16:31 +0200 Subject: [PATCH 0622/1398] Remove the adaptive sizing field dependency in remesh.h --- .../examples/Polygon_mesh_processing/CMakeLists.txt | 8 ++------ .../isotropic_remeshing_with_sizing_example.cpp | 1 + .../internal/Isotropic_remeshing/Adaptive_sizing_field.h | 1 + .../include/CGAL/Polygon_mesh_processing/remesh.h | 1 - .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 3 +++ 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index 3644cc490978..590305c0c8ad 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -25,8 +25,8 @@ create_single_source_cgal_program("orient_polygon_soup_example.cpp") create_single_source_cgal_program("triangulate_polyline_example.cpp") create_single_source_cgal_program("mesh_slicer_example.cpp") #create_single_source_cgal_program( "remove_degeneracies_example.cpp") -#create_single_source_cgal_program("isotropic_remeshing_example.cpp") -#create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") +create_single_source_cgal_program("isotropic_remeshing_example.cpp") +create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") create_single_source_cgal_program("tangential_relaxation_example.cpp") create_single_source_cgal_program("surface_mesh_intersection.cpp") create_single_source_cgal_program("corefinement_SM.cpp") @@ -69,10 +69,6 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(hole_filling_example_LCC PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("mesh_smoothing_example.cpp") target_link_libraries(mesh_smoothing_example PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("isotropic_remeshing_example.cpp") - target_link_libraries(isotropic_remeshing_example PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("isotropic_remeshing_of_patch_example.cpp") - target_link_libraries(isotropic_remeshing_of_patch_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("isotropic_remeshing_with_sizing_example.cpp") target_link_libraries(isotropic_remeshing_with_sizing_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_example.cpp") diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index cb4cdef20ac8..5d2ad63792ec 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h index dea4dc457282..2b56d6691392 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h @@ -79,6 +79,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field template void calc_sizing_map(FaceGraph& face_graph) { + //todo ip: please check if this is good enough to store curvature typedef Principal_curvatures_and_directions Principal_curvatures; typedef typename CGAL::dynamic_vertex_property_t Vertex_curvature_tag; typedef typename boost::property_map #include -#include #include #include diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 52076c1cc4c6..e495afc7e6e9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -405,6 +406,7 @@ public Q_SLOTS: else //not edges_only { if(protect && + edge_sizing_type == 0 && //todo ip: current solution for adaptive remeshing !CGAL::Polygon_mesh_processing::internal::constraints_are_short_enough( *selection_item->polyhedron(), selection_item->constrained_edges_pmap(), @@ -672,6 +674,7 @@ public Q_SLOTS: } if(protect && + edge_sizing_type == 0 && //todo ip: current solution for adaptive remeshing !CGAL::Polygon_mesh_processing::internal::constraints_are_short_enough( pmesh, ecm, From 64257b9c665fb538ca7bc66aef47de5413335d6e Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 7 Aug 2023 09:11:49 +0200 Subject: [PATCH 0623/1398] Add remeshing quality test --- .../Polygon_mesh_processing/CMakeLists.txt | 6 +- .../remeshing_quality_test.cpp | 106 ++++++++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 8ba77a7ff15e..6ec0f6e00139 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -80,10 +80,12 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(test_shape_smoothing PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("delaunay_remeshing_test.cpp") target_link_libraries(delaunay_remeshing_test PUBLIC CGAL::Eigen3_support) - create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") - target_link_libraries(test_interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("test_decimation_of_planar_patches.cpp") target_link_libraries(test_decimation_of_planar_patches PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("test_interpolated_corrected_curvatures.cpp") + target_link_libraries(test_interpolated_corrected_curvatures PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("remeshing_quality_test.cpp" ) + target_link_libraries(remeshing_quality_test PUBLIC CGAL::Eigen3_support) else() message(STATUS "NOTICE: Tests that use the Eigen library will not be compiled.") endif() diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp new file mode 100644 index 000000000000..6f04ffb07fb9 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef K::Point_3 Point_3; +typedef CGAL::Surface_mesh 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/hand.off"); + + Mesh mesh; + if (!PMP::IO::read_polygon_mesh(filename, mesh) || !CGAL::is_triangle_mesh(mesh)) + { + std::cerr << "Not a valid input file." << std::endl; + return 1; + } + + std::cout << "Start remeshing of " << filename + << " (" << num_faces(mesh) << " faces)..." << std::endl; + + const double tol = 0.001; + const std::pair edge_min_max{0.001, 0.5}; + PMP::Adaptive_sizing_field sizing_field(tol, edge_min_max, faces(mesh), mesh); + const unsigned int nb_iter = 5; + + PMP::isotropic_remeshing( + faces(mesh), + sizing_field, + mesh, + PMP::parameters::number_of_iterations(nb_iter).number_of_relaxation_steps(3) + ); + + std::cout << "Remeshing done, checking triangle quality...\n" << std::endl; + double qmin = std::numeric_limits::max(); // minimum triangle quality + double qavg = 0.; // average quality + double min_angle = std::numeric_limits::max(); // minimum angle + double avg_min_angle = 0.; // average minimum angle + for (auto face : mesh.faces()) + { + if (PMP::is_degenerate_triangle_face(face, mesh)) + { + std::cout << "Found degenerate triangle!" << std::endl; + continue; //todo ip should something be done about this? + } + + // Calculate Q(t) triangle quality indicator + std::vector pts; pts.reserve(3); + for (auto vx : mesh.vertices_around_face(mesh.halfedge(face))) + pts.push_back(mesh.point(vx)); + + double half_perim = 0.; // half-perimeter + double lmax = 0.; // longest edge + for (int i = 0; i < 3; ++i) + { + const double length = CGAL::sqrt(CGAL::squared_distance(pts[i], pts[(i + 1) % 2])); + + half_perim += length; + if (length > lmax) lmax = length; + } + half_perim /= 2.; + const double area = CGAL::sqrt(CGAL::squared_area(pts[0], pts[1], pts[2])); + + const double face_quality = 6. / CGAL::sqrt(3.) * area / half_perim / lmax; + + qavg += face_quality; + if (face_quality < qmin) qmin = face_quality; + + // Calculate minimum angle + const auto v0 = pts[1] - pts[0]; + const auto v1 = pts[2] - pts[0]; + const auto v2 = pts[2] - pts[1]; + + const double dotp0 = CGAL::scalar_product(v0,v1); + const double angle0 = acos(dotp0 / (sqrt(v0.squared_length()) * sqrt(v1.squared_length()))); + const double dotp1 = CGAL::scalar_product(-v0, v2); + const double angle1 = acos(dotp1 / (sqrt(v0.squared_length()) * sqrt(v2.squared_length()))); + const double angle2 = CGAL_PI - (angle0 + angle1); + + double curr_min_angle = angle1; + if (angle1 < curr_min_angle) curr_min_angle = angle1; + if (angle2 < curr_min_angle) curr_min_angle = angle2; + + avg_min_angle += curr_min_angle; + if (curr_min_angle < min_angle) min_angle = curr_min_angle; + } + qavg /= mesh.number_of_faces(); + avg_min_angle /= mesh.number_of_faces(); + + std::cout << "Mesh size: " << mesh.number_of_faces() << std::endl; + std::cout << "Average quality: " << qavg << std::endl; + std::cout << "Minimum quality: " << qmin << std::endl; + std::cout << "Average minimum angle: " << avg_min_angle * 180. / CGAL_PI + << " deg" << std::endl; + std::cout << "Minimum angle: " << min_angle * 180. / CGAL_PI + << " deg" << std::endl; + + return 0; +} \ No newline at end of file From 36f8d39f92040b70d5f1d7d2f60d9c44ec4b81d4 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 7 Aug 2023 20:59:06 +0200 Subject: [PATCH 0624/1398] Remove extra code in tangential smoothing --- .../tangential_relaxation.h | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index d2e955841f11..c0103f943299 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -363,12 +363,6 @@ void tangential_relaxation_with_sizing(const VertexRange& vertices, typedef typename GT::Vector_3 Vector_3; typedef typename GT::Point_3 Point_3; - //todo ip: alt calc - typename GT::Construct_vector_3 vector = gt.construct_vector_3_object(); - typename GT::Compute_scalar_product_3 scalar_product = gt.compute_scalar_product_3_object(); - typename GT::Compute_squared_length_3 squared_length = gt.compute_squared_length_3_object(); - typename GT::Construct_cross_product_vector_3 cross_product = gt.construct_cross_product_vector_3_object(); - auto check_normals = [&](vertex_descriptor v) { bool first_run = true; @@ -450,28 +444,18 @@ void tangential_relaxation_with_sizing(const VertexRange& vertices, interior_hedges.push_back(h); } - //todo ip: handle border edges with sizing field if (border_halfedges.empty()) { const Vector_3& vn = vnormals.at(v); Vector_3 move = CGAL::NULL_VECTOR; double weight = 0; -// unsigned int star_size = 0; for(halfedge_descriptor h :interior_hedges) { // calculate weight - // need v0, v1 and v2 + // need v, v1 and v2 const vertex_descriptor v1 = target(next(h, tm), tm); const vertex_descriptor v2 = source(h, tm); - //todo ip- alt calc -// const Vector_3 vec0 = vector(get(vpm, v), get(vpm, v1)); -// const Vector_3 vec1 = vector(get(vpm, v), get(vpm, v2)); -// const double sqarea = squared_length(cross_product(vec0, vec1)); -// const double face_weight = CGAL::approximate_sqrt(sqarea) -// / pow(1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2)), 2); - - //todo ip- paper implementation const double tri_area = gt_area(get(vpm, v), get(vpm, v1), get(vpm, v2)); const double face_weight = tri_area / (1. / 3. * (sizing.get_sizing(v) + sizing.get_sizing(v1) + sizing.get_sizing(v2))); @@ -484,7 +468,7 @@ void tangential_relaxation_with_sizing(const VertexRange& vertices, barycenters.emplace_back(v, vn, get(vpm, v) + move); } - else + else //todo ip: do border edges need to be handled with the sizing field? { if (!relax_constraints) continue; Vector_3 vn(NULL_VECTOR); From 4a8974d256ccd06cc275990099cba8aba9d899ad Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 8 Aug 2023 10:17:52 +0200 Subject: [PATCH 0625/1398] Move sizing classes to 'public' headers --- .../isotropic_remeshing_with_sizing_example.cpp | 2 +- .../Isotropic_remeshing => }/Adaptive_sizing_field.h | 0 .../Isotropic_remeshing => }/Uniform_sizing_field.h | 0 .../include/CGAL/Polygon_mesh_processing/remesh.h | 2 +- .../test/Polygon_mesh_processing/remeshing_quality_test.cpp | 5 ++++- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/{internal/Isotropic_remeshing => }/Adaptive_sizing_field.h (100%) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/{internal/Isotropic_remeshing => }/Uniform_sizing_field.h (100%) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp index 5d2ad63792ec..dacc3e02e1b2 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/isotropic_remeshing_with_sizing_example.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h similarity index 100% rename from Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Adaptive_sizing_field.h rename to Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h similarity index 100% rename from Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Uniform_sizing_field.h rename to Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index dc11e0d52a4a..ac815afa51ab 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp index 6f04ffb07fb9..01f97b210cb8 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include @@ -38,6 +38,9 @@ int main(int argc, char* argv[]) PMP::parameters::number_of_iterations(nb_iter).number_of_relaxation_steps(3) ); + /* + * More information on quality metrics can be found here: https://ieeexplore.ieee.org/document/9167456 + */ std::cout << "Remeshing done, checking triangle quality...\n" << std::endl; double qmin = std::numeric_limits::max(); // minimum triangle quality double qavg = 0.; // average quality diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index e495afc7e6e9..a63e88a69031 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include From 050c7f951235904b5a8251860f26000b18b68406 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 10 Aug 2023 21:33:27 +0200 Subject: [PATCH 0626/1398] Add split_long_edges functionality using adaptive sizing field as an input --- .../Isotropic_remeshing/remesh_impl.h | 36 ++++--- .../CGAL/Polygon_mesh_processing/remesh.h | 26 ++++- .../PMP/Isotropic_remeshing_plugin.cpp | 101 +++++++++++++++--- 3 files changed, 130 insertions(+), 33 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 80ab1f342a0c..bb65af3e2d10 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -383,19 +383,17 @@ namespace internal { } } - // split edges of edge_range that have their length > high // Note: only used to split a range of edges provided as input - template + template void split_long_edges(const EdgeRange& edge_range, - const double& high) + SizingFunction& sizing) { #ifdef CGAL_PMP_REMESHING_VERBOSE - std::cout << "Split long edges (" << high << ")..."; - std::cout.flush(); +// std::cout << "Split long edges (" << high << ")..."; +// std::cout.flush(); #endif - double sq_high = high*high; //collect long edges typedef std::pair H_and_sql; @@ -406,9 +404,9 @@ namespace internal { ); for(edge_descriptor e : edge_range) { - double sqlen = sqlength(e); - if (sqlen > sq_high) - long_edges.emplace(halfedge(e, mesh_), sqlen); + boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_)); + if(sqlen != boost::none) + long_edges.emplace(halfedge(e, mesh_), sqlen.get()); } //split long edges @@ -439,15 +437,19 @@ namespace internal { #ifdef CGAL_PMP_REMESHING_VERY_VERBOSE std::cout << " refinement point : " << refinement_point << std::endl; #endif + //update sizing field with the new point + if constexpr (!std::is_same_v>) + sizing.update_sizing_map(vnew); //check sub-edges - double sqlen_new = 0.25 * sqlen; - if (sqlen_new > sq_high) - { - //if it was more than twice the "long" threshold, insert them - long_edges.emplace(hnew, sqlen_new); - long_edges.emplace(next(hnew, mesh_), sqlen_new); - } + //if it was more than twice the "long" threshold, insert them + boost::optional sqlen_new = sizing.is_too_long(hnew); + if(sqlen_new != boost::none) + long_edges.emplace(hnew, sqlen_new.get()); + + sqlen_new = sizing.is_too_long(next(hnew, mesh_)); + if (sqlen_new != boost::none) + long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); //insert new edges to keep triangular faces, and update long_edges if (!is_border(hnew, mesh_)) @@ -552,7 +554,7 @@ namespace internal { halfedge_added(hnew, status(he)); halfedge_added(hnew_opp, status(opposite(he, mesh_))); - //todo ip-add: already updating sizing here because of is_too_long checks below + //update sizing field with the new point if constexpr (!std::is_same_v>) sizing.update_sizing_map(vnew); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index ac815afa51ab..7d88ad209f69 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -424,9 +424,10 @@ void isotropic_remeshing(const FaceRange& faces */ template void split_long_edges(const EdgeRange& edges - , const double& max_length + , SizingFunction& sizing , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { @@ -473,7 +474,28 @@ void split_long_edges(const EdgeRange& edges fimap, false/*need aabb_tree*/); - remesher.split_long_edges(edges, max_length); + // check if sizing field needs updating + if constexpr (!std::is_same_v>) + { + //todo ip: check if sizing field needs to be checked and updated here + } + + remesher.split_long_edges(edges, sizing); +} + +//todo ip: documentation +// overload when using max_length +template +void split_long_edges(const EdgeRange& edges + , const double max_length + , PolygonMesh& pmesh + , const NamedParameters& np = parameters::default_values()) +{ + // construct the uniform field, 3/4 as m_sq_long is stored with 4/3 of length + Uniform_sizing_field sizing(3. / 4. * max_length, pmesh); + split_long_edges(edges, sizing, pmesh, np); } } //end namespace Polygon_mesh_processing diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index a63e88a69031..00e34c5e63eb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -294,9 +294,13 @@ class Polyhedron_demo_isotropic_remeshing_plugin : PMP::triangulate_face(f_and_p.first, *f_and_p.second); } - void do_split_edges(Scene_polyhedron_selection_item* selection_item, + void do_split_edges(const int edge_sizing_type, + Scene_polyhedron_selection_item* selection_item, SMesh& pmesh, - double target_length) + const double target_length, + const double error_tol, + const double min_length, + const double max_length) { std::vector p_edges; for(edge_descriptor e : edges(pmesh)) @@ -314,12 +318,32 @@ class Polyhedron_demo_isotropic_remeshing_plugin : } } if (!p_edges.empty()) - CGAL::Polygon_mesh_processing::split_long_edges( - p_edges - , target_length - , *selection_item->polyhedron() - , CGAL::parameters::geom_traits(EPICK()) + { + if (edge_sizing_type == 0) + { + CGAL::Polygon_mesh_processing::split_long_edges( + p_edges + , target_length + , *selection_item->polyhedron() + , CGAL::parameters::geom_traits(EPICK()) + .edge_is_constrained_map(selection_item->constrained_edges_pmap())); + } + else if (edge_sizing_type == 1) + { + std::pair edge_min_max{min_length, max_length}; + CGAL::Polygon_mesh_processing::Adaptive_sizing_field adaptive_sizing( + error_tol + , edge_min_max + , faces(*selection_item->polyhedron()) + , *selection_item->polyhedron()); + CGAL::Polygon_mesh_processing::split_long_edges( + p_edges + , adaptive_sizing + , *selection_item->polyhedron() + , CGAL::parameters::geom_traits(EPICK()) .edge_is_constrained_map(selection_item->constrained_edges_pmap())); + } + } else std::cout << "No selected or boundary edges to be split" << std::endl; } @@ -401,7 +425,7 @@ public Q_SLOTS: { if (edges_only) { - do_split_edges(selection_item, pmesh, target_length); + do_split_edges(edge_sizing_type, selection_item, pmesh, target_length, error_tol, min_length, max_length); } else //not edges_only { @@ -438,7 +462,7 @@ public Q_SLOTS: } else { - do_split_edges(selection_item, pmesh, target_length); + do_split_edges(edge_sizing_type, selection_item, pmesh, target_length, error_tol, min_length, max_length); } } @@ -637,6 +661,9 @@ public Q_SLOTS: if (!edges_to_split.empty()) { if (fpmap_valid) + { + if (edge_sizing_type == 0) + { CGAL::Polygon_mesh_processing::split_long_edges( edges_to_split , target_length @@ -644,13 +671,49 @@ public Q_SLOTS: , CGAL::parameters::geom_traits(EPICK()) . edge_is_constrained_map(eif) . face_patch_map(fpmap)); + } + else if (edge_sizing_type == 1) + { + std::pair edge_min_max{min_length, max_length}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + , edge_min_max + , faces(pmesh) + , pmesh); + CGAL::Polygon_mesh_processing::split_long_edges( + edges_to_split + , target_length + , pmesh + , CGAL::parameters::geom_traits(EPICK()) + . edge_is_constrained_map(eif) + . face_patch_map(fpmap)); + } + } else + { + if (edge_sizing_type == 0) + { CGAL::Polygon_mesh_processing::split_long_edges( edges_to_split , target_length , pmesh , CGAL::parameters::geom_traits(EPICK()) . edge_is_constrained_map(eif)); + } + else if (edge_sizing_type = 1) + { + std::pair edge_min_max{min_length, max_length}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol + , edge_min_max + , faces(pmesh) + , pmesh); + CGAL::Polygon_mesh_processing::split_long_edges( + edges_to_split + , adaptive_sizing_field + , pmesh + , CGAL::parameters::geom_traits(EPICK()) + . edge_is_constrained_map(eif)); + } + } } else std::cout << "No border to be split" << std::endl; @@ -968,10 +1031,25 @@ public Q_SLOTS: for(halfedge_descriptor h : border) border_edges.push_back(edge(h, *poly_item->polyhedron())); + if (edge_sizing_type_ == 0) + { CGAL::Polygon_mesh_processing::split_long_edges( border_edges , target_length_ , *poly_item->polyhedron()); + } + else if (edge_sizing_type_ == 1) + { + std::pair edge_min_max{min_length_, max_length_}; + PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ + , edge_min_max + , faces(*poly_item->polyhedron()) + , *poly_item->polyhedron()); + CGAL::Polygon_mesh_processing::split_long_edges( + border_edges + , target_length_ + , *poly_item->polyhedron()); + } } else { @@ -1130,9 +1208,6 @@ public Q_SLOTS: ui.smooth1D_label->setEnabled(false); ui.smooth1D_checkbox->setEnabled(false); ui.smooth1D_checkbox->setChecked(false); - - ui.edgeSizing_type_combo_box->setCurrentIndex(0); - ui.edgeSizing_type_combo_box->setEnabled(false); } else { @@ -1146,8 +1221,6 @@ public Q_SLOTS: ui.smooth1D_label->setEnabled(true); ui.smooth1D_checkbox->setEnabled(true); - - ui.edgeSizing_type_combo_box->setEnabled(true); } } From 600f72fd0ecb521eeafba5f897e0b94548ebe72d Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 11 Aug 2023 15:09:23 +0200 Subject: [PATCH 0627/1398] Reintroduce constraints_are_short_enough for adaptive remeshing --- .../Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 00e34c5e63eb..940d576735e4 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -430,7 +430,6 @@ public Q_SLOTS: else //not edges_only { if(protect && - edge_sizing_type == 0 && //todo ip: current solution for adaptive remeshing !CGAL::Polygon_mesh_processing::internal::constraints_are_short_enough( *selection_item->polyhedron(), selection_item->constrained_edges_pmap(), @@ -737,7 +736,6 @@ public Q_SLOTS: } if(protect && - edge_sizing_type == 0 && //todo ip: current solution for adaptive remeshing !CGAL::Polygon_mesh_processing::internal::constraints_are_short_enough( pmesh, ecm, @@ -1313,7 +1311,7 @@ public Q_SLOTS: ui.nbIterations_spinbox->setValue(1); ui.edgeSizing_type_combo_box->setCurrentIndex(0); - on_edgeSizing_type_combo_box_changed(0); //todo ip otherwise it shows all remeshing variables + on_edgeSizing_type_combo_box_changed(0); ui.protect_checkbox->setChecked(false); ui.smooth1D_checkbox->setChecked(true); From f589b054ed89d59e3554a416728d8ead6ab3f837 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 11 Aug 2023 15:46:21 +0200 Subject: [PATCH 0628/1398] Documentation update in remesh.h --- .../CGAL/Polygon_mesh_processing/remesh.h | 59 ++++++++----------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 7d88ad209f69..e22b48013068 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -31,16 +31,6 @@ namespace CGAL { namespace Polygon_mesh_processing { -/*! \todo document me or merge the doc with the original overload*/ -template -void isotropic_remeshing(const FaceRange& faces - , SizingFunction& sizing - , PolygonMesh& pmesh - , const NamedParameters& np); - /*! * \ingroup PMP_meshing_grp * @@ -54,12 +44,14 @@ void isotropic_remeshing(const FaceRange& faces * and `boost::graph_traits::%halfedge_descriptor` must be * models of `Hashable`. * @tparam FaceRange range of `boost::graph_traits::%face_descriptor`, - model of `Range`. Its iterator type is `ForwardIterator`. +* model of `Range`. Its iterator type is `ForwardIterator`. +* @tparam SizingFunction model of `Sizing_field` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh a polygon mesh with triangulated surface patches to be remeshed * @param faces the range of triangular faces defining one or several surface patches to be remeshed -* @param target_edge_length the edge length that is targeted in the remeshed patch. +* @param sizing uniform or adaptive sizing field that determines a target length for individual edges. +* If a number is passed, it uses uniform sizing with the number as a target edge length. * If `0` is passed then only the edge-flip, tangential relaxation, and projection steps will be done. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * @@ -202,23 +194,6 @@ void isotropic_remeshing(const FaceRange& faces * get a point which is exactly on the surface. * */ -template -void isotropic_remeshing(const FaceRange& faces - , const double target_edge_length - , PolygonMesh& pmesh - , const NamedParameters& np = parameters::default_values()) -{ - typedef Uniform_sizing_field Default_sizing; - Default_sizing sizing(target_edge_length, pmesh); - isotropic_remeshing( - faces, - sizing, - pmesh, - np); -} - template +void isotropic_remeshing(const FaceRange& faces + , const double target_edge_length + , PolygonMesh& pmesh + , const NamedParameters& np = parameters::default_values()) +{ + typedef Uniform_sizing_field Default_sizing; + Default_sizing sizing(target_edge_length, pmesh); + isotropic_remeshing( + faces, + sizing, + pmesh, + np); +} + /*! * \ingroup PMP_meshing_grp * @brief splits the edges listed in `edges` into sub-edges @@ -374,12 +367,13 @@ void isotropic_remeshing(const FaceRange& faces * has an internal property map for `CGAL::vertex_point_t`. * @tparam EdgeRange range of `boost::graph_traits::%edge_descriptor`, * model of `Range`. Its iterator type is `InputIterator`. +* @tparam SizingFunction model of `Sizing_field` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh a polygon mesh * @param edges the range of edges to be split if they are longer than given threshold -* @param max_length the edge length above which an edge from `edges` is split -* into to sub-edges +* @param sizing the sizing function that is used to split edges from 'edges' list. If a number is passed, +* all edges longer than the number are split into sub-edges. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * \cgalNamedParamsBegin @@ -483,8 +477,7 @@ void split_long_edges(const EdgeRange& edges remesher.split_long_edges(edges, sizing); } -//todo ip: documentation -// overload when using max_length +// Convenience overload when using max_length for sizing template From 66721bbcd9ea9a4edd6423d2974b403a358a93c7 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sat, 12 Aug 2023 17:36:16 +0200 Subject: [PATCH 0629/1398] Add precondition 'remeshing mesh == sizing field mesh' --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 2 ++ .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 1 + .../internal/Isotropic_remeshing/Sizing_field.h | 1 + .../include/CGAL/Polygon_mesh_processing/remesh.h | 4 ++++ 4 files changed, 8 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 2b56d6691392..543d6645844a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -213,6 +213,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field put(m_vertex_sizing_map, v, vertex_size); } + const PolygonMesh& get_mesh() const { return m_pmesh; } + //todo ip: is_protected_constraint_too_long() from PR private: diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index a36c30aa712c..1cc96e883444 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -92,6 +92,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field get(vpmap, source(h, m_pmesh))); } + const PolygonMesh& get_mesh() const { return m_pmesh; } private: FT m_sq_short; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index 3640e14c092d..b60148c3e73d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -45,6 +45,7 @@ class Sizing_field const vertex_descriptor vb) const = 0; virtual boost::optional is_too_short(const halfedge_descriptor h) const = 0; virtual Point_3 split_placement(const halfedge_descriptor h) const = 0; + virtual const PolygonMesh& get_mesh() const = 0; }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index e22b48013068..91a9ed2d6074 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -206,6 +206,10 @@ void isotropic_remeshing(const FaceRange& faces if (std::begin(faces)==std::end(faces)) return; + //todo ip: precondition or something else? + CGAL_precondition_msg(&(sizing.get_mesh()) == &pmesh, "Input mesh is not the same " + "as the one used for the sizing field!"); + typedef PolygonMesh PM; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; From ee640c91dd6817ca8afc05086e4d4f282693f450 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sun, 13 Aug 2023 10:41:16 +0200 Subject: [PATCH 0630/1398] Handle the special case when target_edge_length is 0 --- .../CGAL/Polygon_mesh_processing/remesh.h | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 91a9ed2d6074..d146fb57597e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -339,22 +339,20 @@ void isotropic_remeshing(const FaceRange& faces #endif } -// Convenience overload when using target_edge_length for sizing +// Overload when using target_edge_length for sizing template + , typename FaceRange + , typename NamedParameters = parameters::Default_named_parameters> void isotropic_remeshing(const FaceRange& faces - , const double target_edge_length - , PolygonMesh& pmesh - , const NamedParameters& np = parameters::default_values()) + , const double target_edge_length + , PolygonMesh& pmesh + , const NamedParameters& np = parameters::default_values()) { - typedef Uniform_sizing_field Default_sizing; - Default_sizing sizing(target_edge_length, pmesh); - isotropic_remeshing( - faces, - sizing, - pmesh, - np); + Uniform_sizing_field sizing(target_edge_length, pmesh); + if (target_edge_length > 0) + isotropic_remeshing(faces, sizing, pmesh, np); + else + isotropic_remeshing(faces, sizing, pmesh, np.do_split(false).do_collapse(false)); } /*! From 6ee23c6fdddabbb95bdf1109b4f571f34f70966f Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 15 Aug 2023 20:07:58 +0200 Subject: [PATCH 0631/1398] Replace pmesh with vertex property maps in sizing field classes --- .../Adaptive_sizing_field.h | 78 +++++++++---------- .../Uniform_sizing_field.h | 45 +++++------ .../Isotropic_remeshing/Sizing_field.h | 16 ++-- .../Isotropic_remeshing/remesh_impl.h | 36 ++++----- .../CGAL/Polygon_mesh_processing/remesh.h | 8 +- .../PMP/Isotropic_remeshing_plugin.cpp | 2 +- 6 files changed, 89 insertions(+), 96 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 543d6645844a..1e8151c14b32 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -38,10 +38,11 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename Base::face_descriptor face_descriptor; typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; + typedef typename Base::DefaultVPMap DefaultVPMap; typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; typedef typename boost::property_map::type Vertex_sizing_map; + Vertex_property_tag>::type VertexSizingMap; template Adaptive_sizing_field(const double tol @@ -51,25 +52,24 @@ class Adaptive_sizing_field : public CGAL::Sizing_field : tol(tol) , m_short(edge_len_min_max.first) , m_long(edge_len_min_max.second) - , m_pmesh(pmesh) + , m_vpmap(get(CGAL::vertex_point, pmesh)) + , m_vertex_sizing_map(get(Vertex_property_tag(), pmesh)) { - m_vertex_sizing_map = get(Vertex_property_tag(), m_pmesh); - - if (face_range.size() == faces(m_pmesh).size()) + if (face_range.size() == faces(pmesh).size()) { // calculate curvature from the whole mesh - calc_sizing_map(m_pmesh); + calc_sizing_map(pmesh); } else { // expand face selection and calculate curvature from it std::vector selection(face_range.begin(), face_range.end()); - auto is_selected = get(CGAL::dynamic_face_property_t(), m_pmesh); - for (face_descriptor f : faces(m_pmesh)) put(is_selected, f, false); + auto is_selected = get(CGAL::dynamic_face_property_t(), pmesh); + for (face_descriptor f : faces(pmesh)) put(is_selected, f, false); for (face_descriptor f : face_range) put(is_selected, f, true); - CGAL::expand_face_selection(selection, m_pmesh, 1 + CGAL::expand_face_selection(selection, pmesh, 1 , is_selected, std::back_inserter(selection)); - CGAL::Face_filtered_graph ffg(m_pmesh, selection); + CGAL::Face_filtered_graph ffg(pmesh, selection); calc_sizing_map(ffg); } @@ -134,14 +134,12 @@ class Adaptive_sizing_field : public CGAL::Sizing_field FT sqlength(const vertex_descriptor va, const vertex_descriptor vb) const { - typename boost::property_map::const_type - vpmap = get(CGAL::vertex_point, m_pmesh); - return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); + return FT(CGAL::squared_distance(get(m_vpmap, va), get(m_vpmap, vb))); } - FT sqlength(const halfedge_descriptor& h) const + FT sqlength(const halfedge_descriptor& h, const PolygonMesh& pmesh) const { - return sqlength(target(h, m_pmesh), source(h, m_pmesh)); + return sqlength(target(h, pmesh), source(h, pmesh)); } public: @@ -150,13 +148,13 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return get(m_vertex_sizing_map, v); } - boost::optional is_too_long(const halfedge_descriptor h) const + boost::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - const FT sqlen = sqlength(h); - FT sqtarg_len = CGAL::square(4./3. * CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh)))); - CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); - CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); + const FT sqlen = sqlength(h, pmesh); + FT sqtarg_len = CGAL::square(4./3. * CGAL::min(get(m_vertex_sizing_map, source(h, pmesh)), + get(m_vertex_sizing_map, target(h, pmesh)))); + CGAL_assertion(get(m_vertex_sizing_map, source(h, pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, target(h, pmesh))); if(sqlen > sqtarg_len) return sqlen; else @@ -177,52 +175,46 @@ class Adaptive_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_short(const halfedge_descriptor h) const + boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - const FT sqlen = sqlength(h); - FT sqtarg_len = CGAL::square(4./5. * CGAL::min(get(m_vertex_sizing_map, source(h, m_pmesh)), - get(m_vertex_sizing_map, target(h, m_pmesh)))); - CGAL_assertion(get(m_vertex_sizing_map, source(h, m_pmesh))); - CGAL_assertion(get(m_vertex_sizing_map, target(h, m_pmesh))); + const FT sqlen = sqlength(h, pmesh); + FT sqtarg_len = CGAL::square(4./5. * CGAL::min(get(m_vertex_sizing_map, source(h, pmesh)), + get(m_vertex_sizing_map, target(h, pmesh)))); + CGAL_assertion(get(m_vertex_sizing_map, source(h, pmesh))); + CGAL_assertion(get(m_vertex_sizing_map, target(h, pmesh))); if (sqlen < sqtarg_len) return sqlen; else return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor h) const + virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - typename boost::property_map::const_type - vpmap = get(CGAL::vertex_point, m_pmesh); - return CGAL::midpoint(get(vpmap, target(h, m_pmesh)), - get(vpmap, source(h, m_pmesh))); + return CGAL::midpoint(get(m_vpmap, target(h, pmesh)), + get(m_vpmap, source(h, pmesh))); } - void update_sizing_map(const vertex_descriptor v) + void update_sizing_map(const vertex_descriptor v, const PolygonMesh& pmesh) { // calculating it as the average of two vertices on other ends // of halfedges as updating is done during an edge split FT vertex_size = 0; - CGAL_assertion(CGAL::halfedges_around_target(v, m_pmesh).size() == 2); - for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, m_pmesh)) + CGAL_assertion(CGAL::halfedges_around_target(v, pmesh).size() == 2); + for (halfedge_descriptor ha: CGAL::halfedges_around_target(v, pmesh)) { - vertex_size += get(m_vertex_sizing_map, source(ha, m_pmesh)); + vertex_size += get(m_vertex_sizing_map, source(ha, pmesh)); } - vertex_size /= CGAL::halfedges_around_target(v, m_pmesh).size(); + vertex_size /= CGAL::halfedges_around_target(v, pmesh).size(); put(m_vertex_sizing_map, v, vertex_size); } - const PolygonMesh& get_mesh() const { return m_pmesh; } - - //todo ip: is_protected_constraint_too_long() from PR - private: const FT tol; const FT m_short; const FT m_long; - PolygonMesh& m_pmesh; - Vertex_sizing_map m_vertex_sizing_map; + const DefaultVPMap m_vpmap; + VertexSizingMap m_vertex_sizing_map; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 1cc96e883444..2e047548adaa 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -23,11 +23,12 @@ namespace CGAL { namespace Polygon_mesh_processing { -template -class Uniform_sizing_field : public CGAL::Sizing_field +template ::const_type> +class Uniform_sizing_field : public CGAL::Sizing_field { private: - typedef CGAL::Sizing_field Base; + typedef CGAL::Sizing_field Base; public: typedef typename Base::FT FT; @@ -35,30 +36,34 @@ class Uniform_sizing_field : public CGAL::Sizing_field typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; - Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + Uniform_sizing_field(const FT size, const VPMap& vpmap) : m_sq_short( CGAL::square(4./5. * size)) , m_sq_long( CGAL::square(4./3. * size)) - , m_pmesh(pmesh) + , m_vpmap(vpmap) + {} + + Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + : m_sq_short( CGAL::square(4./5. * size)) + , m_sq_long( CGAL::square(4./3. * size)) + , m_vpmap(get(CGAL::vertex_point, pmesh)) {} private: FT sqlength(const vertex_descriptor va, const vertex_descriptor vb) const { - typename boost::property_map::const_type - vpmap = get(CGAL::vertex_point, m_pmesh); - return FT(CGAL::squared_distance(get(vpmap, va), get(vpmap, vb))); + return FT(CGAL::squared_distance(get(m_vpmap, va), get(m_vpmap, vb))); } - FT sqlength(const halfedge_descriptor& h) const + FT sqlength(const halfedge_descriptor& h, const PolygonMesh& pmesh) const { - return sqlength(target(h, m_pmesh), source(h, m_pmesh)); + return sqlength(target(h, pmesh), source(h, pmesh)); } public: - boost::optional is_too_long(const halfedge_descriptor h) const + boost::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - const FT sqlen = sqlength(h); + const FT sqlen = sqlength(h, pmesh); if(sqlen > m_sq_long) return sqlen; else @@ -75,29 +80,25 @@ class Uniform_sizing_field : public CGAL::Sizing_field return boost::none; } - boost::optional is_too_short(const halfedge_descriptor h) const + boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - const FT sqlen = sqlength(h); + const FT sqlen = sqlength(h, pmesh); if (sqlen < m_sq_long) return sqlen; else return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor h) const + virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - typename boost::property_map::const_type - vpmap = get(CGAL::vertex_point, m_pmesh); - return CGAL::midpoint(get(vpmap, target(h, m_pmesh)), - get(vpmap, source(h, m_pmesh))); + return CGAL::midpoint(get(m_vpmap, target(h, pmesh)), + get(m_vpmap, source(h, pmesh))); } - const PolygonMesh& get_mesh() const { return m_pmesh; } - private: FT m_sq_short; FT m_sq_long; - const PolygonMesh& m_pmesh; + const VPMap m_vpmap; }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index b60148c3e73d..d4109708352b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -23,14 +23,17 @@ namespace CGAL /*! * Sizing field virtual class */ -template +template ::const_type> class Sizing_field { private: typedef PolygonMesh PM; - typedef typename boost::property_map::const_type VPMap; typedef typename boost::property_traits::value_type Point; +protected: + typedef typename boost::property_map::const_type DefaultVPMap; + public: typedef typename CGAL::Kernel_traits::Kernel K; typedef typename boost::graph_traits::face_descriptor face_descriptor; @@ -40,12 +43,13 @@ class Sizing_field typedef typename K::FT FT; public: - virtual boost::optional is_too_long(const halfedge_descriptor h) const = 0; + virtual boost::optional is_too_long(const halfedge_descriptor h, + const PolygonMesh& pmesh) const = 0; virtual boost::optional is_too_long(const vertex_descriptor va, const vertex_descriptor vb) const = 0; - virtual boost::optional is_too_short(const halfedge_descriptor h) const = 0; - virtual Point_3 split_placement(const halfedge_descriptor h) const = 0; - virtual const PolygonMesh& get_mesh() const = 0; + virtual boost::optional is_too_short(const halfedge_descriptor h, + const PolygonMesh& pmesh) const = 0; + virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const = 0; }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index bb65af3e2d10..27ea3cd29271 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -78,7 +78,7 @@ namespace CGAL { namespace Polygon_mesh_processing { -template class Uniform_sizing_field; +template class Uniform_sizing_field; namespace internal { @@ -404,7 +404,7 @@ namespace internal { ); for(edge_descriptor e : edge_range) { - boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_)); + boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); if(sqlen != boost::none) long_edges.emplace(halfedge(e, mesh_), sqlen.get()); } @@ -438,16 +438,16 @@ namespace internal { std::cout << " refinement point : " << refinement_point << std::endl; #endif //update sizing field with the new point - if constexpr (!std::is_same_v>) - sizing.update_sizing_map(vnew); + if constexpr (!std::is_same_v>) + sizing.update_sizing_map(vnew, mesh_); //check sub-edges //if it was more than twice the "long" threshold, insert them - boost::optional sqlen_new = sizing.is_too_long(hnew); + boost::optional sqlen_new = sizing.is_too_long(hnew, mesh_); if(sqlen_new != boost::none) long_edges.emplace(hnew, sqlen_new.get()); - sqlen_new = sizing.is_too_long(next(hnew, mesh_)); + sqlen_new = sizing.is_too_long(next(hnew, mesh_), mesh_); if (sqlen_new != boost::none) long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); @@ -504,7 +504,7 @@ namespace internal { { if (!is_split_allowed(e)) continue; - boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_)); + boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); if(sqlen != boost::none) long_edges.emplace(halfedge(e, mesh_), sqlen.get()); } @@ -535,7 +535,7 @@ namespace internal { Patch_id patch_id_opp = get_patch_id(face(opposite(he, mesh_), mesh_)); //split edge - Point refinement_point = sizing.split_placement(he); + Point refinement_point = sizing.split_placement(he, mesh_); halfedge_descriptor hnew = CGAL::Euler::split_edge(he, mesh_); CGAL_assertion(he == next(hnew, mesh_)); put(ecmap_, edge(hnew, mesh_), get(ecmap_, edge(he, mesh_)) ); @@ -555,16 +555,16 @@ namespace internal { halfedge_added(hnew_opp, status(opposite(he, mesh_))); //update sizing field with the new point - if constexpr (!std::is_same_v>) - sizing.update_sizing_map(vnew); + if constexpr (!std::is_same_v>) + sizing.update_sizing_map(vnew, mesh_); //check sub-edges //if it was more than twice the "long" threshold, insert them - boost::optional sqlen_new = sizing.is_too_long(hnew); + boost::optional sqlen_new = sizing.is_too_long(hnew, mesh_); if(sqlen_new != boost::none) long_edges.emplace(hnew, sqlen_new.get()); - sqlen_new = sizing.is_too_long(next(hnew, mesh_)); + sqlen_new = sizing.is_too_long(next(hnew, mesh_), mesh_); if (sqlen_new != boost::none) long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); @@ -585,7 +585,7 @@ namespace internal { if (snew == PATCH) { - boost::optional sql = sizing.is_too_long(hnew2); + boost::optional sql = sizing.is_too_long(hnew2, mesh_); if(sql != boost::none) long_edges.emplace(hnew2, sql.get()); } @@ -608,7 +608,7 @@ namespace internal { if (snew == PATCH) { - boost::optional sql = sizing.is_too_long(hnew2); + boost::optional sql = sizing.is_too_long(hnew2, mesh_); if (sql != boost::none) long_edges.emplace(hnew2, sql.get()); } @@ -653,7 +653,7 @@ namespace internal { Boost_bimap short_edges; for(edge_descriptor e : edges(mesh_)) { - boost::optional sqlen = sizing.is_too_short(halfedge(e, mesh_)); + boost::optional sqlen = sizing.is_too_short(halfedge(e, mesh_), mesh_); if(sqlen != boost::none && is_collapse_allowed(e, collapse_constraints)) short_edges.insert(short_edge(halfedge(e, mesh_), sqlen.get())); @@ -818,7 +818,7 @@ namespace internal { //insert new/remaining short edges for (halfedge_descriptor ht : halfedges_around_target(vkept, mesh_)) { - boost::optional sqlen = sizing.is_too_short(ht); + boost::optional sqlen = sizing.is_too_short(ht, mesh_); if (sqlen != boost::none && is_collapse_allowed(edge(ht, mesh_), collapse_constraints)) short_edges.insert(short_edge(ht, sqlen.get())); @@ -1053,7 +1053,7 @@ namespace internal { auto constrained_vertices_pmap = boost::make_function_property_map(vertex_constraint); - if constexpr (std::is_same>::value) + if constexpr (std::is_same>::value) { #ifdef CGAL_PMP_REMESHING_VERBOSE std::cout << " using tangential relaxation with weights equal to 1"; @@ -1768,7 +1768,7 @@ namespace internal { //insert new edges in 'short_edges' if (is_collapse_allowed(edge(hf, mesh_), collapse_constraints)) { - boost::optional sqlen = sizing.is_too_short(hf); + boost::optional sqlen = sizing.is_too_short(hf, mesh_); if (sqlen != boost::none) short_edges.insert(typename Bimap::value_type(hf, sqlen.get())); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index d146fb57597e..70771b6c81bf 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -206,10 +206,6 @@ void isotropic_remeshing(const FaceRange& faces if (std::begin(faces)==std::end(faces)) return; - //todo ip: precondition or something else? - CGAL_precondition_msg(&(sizing.get_mesh()) == &pmesh, "Input mesh is not the same " - "as the one used for the sizing field!"); - typedef PolygonMesh PM; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; @@ -348,7 +344,7 @@ void isotropic_remeshing(const FaceRange& faces , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { - Uniform_sizing_field sizing(target_edge_length, pmesh); + Uniform_sizing_field sizing(target_edge_length, pmesh); if (target_edge_length > 0) isotropic_remeshing(faces, sizing, pmesh, np); else @@ -471,7 +467,7 @@ void split_long_edges(const EdgeRange& edges false/*need aabb_tree*/); // check if sizing field needs updating - if constexpr (!std::is_same_v>) + if constexpr (!std::is_same_v>) { //todo ip: check if sizing field needs to be checked and updated here } diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 940d576735e4..1185567f05ab 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -698,7 +698,7 @@ public Q_SLOTS: , CGAL::parameters::geom_traits(EPICK()) . edge_is_constrained_map(eif)); } - else if (edge_sizing_type = 1) + else if (edge_sizing_type == 1) { std::pair edge_min_max{min_length, max_length}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol From ff4bbaa1554bd33233a08dcd6a35ffa4b0583e64 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 15 Aug 2023 20:10:39 +0200 Subject: [PATCH 0632/1398] Target length fix --- .../include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 2e047548adaa..0a259d3ef31a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -83,7 +83,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const { const FT sqlen = sqlength(h, pmesh); - if (sqlen < m_sq_long) + if (sqlen < m_sq_short) return sqlen; else return boost::none; From e3727e4a88c318bdd97b20e6fd55f8ebd750587d Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Tue, 15 Aug 2023 20:14:11 +0200 Subject: [PATCH 0633/1398] Remove todos --- .../test/Polygon_mesh_processing/remeshing_quality_test.cpp | 2 +- .../demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp index 01f97b210cb8..69b2afaaca01 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/remeshing_quality_test.cpp @@ -51,7 +51,7 @@ int main(int argc, char* argv[]) if (PMP::is_degenerate_triangle_face(face, mesh)) { std::cout << "Found degenerate triangle!" << std::endl; - continue; //todo ip should something be done about this? + continue; } // Calculate Q(t) triangle quality indicator diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 1185567f05ab..3f1816d7ce31 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -1289,7 +1289,6 @@ public Q_SLOTS: ui.edgeLength_dspinbox->setValue(0.05 * diago_length); - //todo ip - check and adjust these ui.errorTol_edit->setValue(0.001 * diago_length); ui.minEdgeLength_edit->setValue(0.001 * diago_length); ui.maxEdgeLength_edit->setValue(0.5 * diago_length); From 98a3f14c7382cf23e26f0cc8fb8e5ab46b2dc6cf Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 16 Aug 2023 18:55:15 +0200 Subject: [PATCH 0634/1398] Add PMPSizingField concept to docs --- .../Concepts/PMPSizingField.h | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h new file mode 100644 index 000000000000..5304beb32205 --- /dev/null +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h @@ -0,0 +1,59 @@ +/// \ingroup PkgPolygonMeshProcessingConcepts +/// \cgalConcept +/// +/// The concept `PMPSizingField` defines the requirements for the sizing field +/// used in `CGAL::Polygon_mesh_processing::isotropic_remeshing()` to define +/// the target length for every individual edge during the remeshing process. + +class PMPSizingField{ +public: + +/// @name Types +/// @{ + +/// Vertex descriptor type +typedef unspecified_type vertex_descriptor; + +/// Halfedge descriptor type +typedef unspecified_type halfedge_descriptor; + +/// 3D point type +typedef unspecified_type Point_3; + +/// Polygon mesh type +typedef unspecified_type PolygonMesh; + +/// Numerical type +typedef unspecified_type FT; + +/// @} + +/// @name Functions +/// @{ + +/// called to check whether the halfedge 'h' is longer than the target edge size +/// and as such should be split. If the halfedge is longer, it returns the squared +/// length of the edge. +boost::optional is_too_long(const halfedge_descriptor h, + const PolygonMesh& pmesh) const; + +/// called to check whether the halfedge with end vertices 'va' and 'vb' is longer +/// than the target edge size and as such should be split. If the halfedge is longer, +/// it returns the squared length of the edge. +boost::optional is_too_long(const vertex_descriptor va, + const vertex_descriptor vb) const; + +/// called to check whether the halfedge 'h' should be collapsed in case it is +/// shorter than the target edge size +boost::optional is_too_short(const halfedge_descriptor h, + const PolygonMesh& pmesh) const; + +/// called to define the location of the halfedge 'h' split in case 'is_too_long' +/// returns a value +Point_3 split_placement(const halfedge_descriptor h, + const PolygonMesh& pmesh) const; + +/// @} +}; + + From 9e91abb5398fe9a94ac08ced0fdc4c80f7213142 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 16 Aug 2023 20:18:22 +0200 Subject: [PATCH 0635/1398] First attempt at sizing field docs --- .../Adaptive_sizing_field.h | 33 ++++++++++++++ .../Uniform_sizing_field.h | 45 +++++++++++++++++-- .../tangential_relaxation.h | 1 + 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 1e8151c14b32..1c6915b4c96d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -25,6 +25,22 @@ namespace CGAL { namespace Polygon_mesh_processing { +/*! +* \ingroup PMP_meshing_grp +* provides a set of instructions for isotropic remeshing to achieve variable +* mesh edge lengths as a function of local discrete curvatures. +* +* Edges longer than the local target edge length are split in half, while +* edges shorter than the local target edge length are collapsed. +* +* \cgalModels PMPSizingField +* +* \sa `isotropic_remeshing` +* \sa `Uniform_sizing_field` +* +* @tparam PolygonMesh model of `MutableFaceGraph` that +* has an internal property map for `CGAL::vertex_point_t`. +*/ template class Adaptive_sizing_field : public CGAL::Sizing_field { @@ -44,6 +60,22 @@ class Adaptive_sizing_field : public CGAL::Sizing_field typedef typename boost::property_map::type VertexSizingMap; + /// \name Creation + /// @{ + /*! + * Returns an object to serve as criteria for adaptive curvature-based edge lengths. + * + * @tparam FaceRange range of `boost::graph_traits::%face_descriptor`, + * model of `Range`. Its iterator type is `ForwardIterator`. + * + * @param tol the error tolerance, the maximum deviation of an edge from the original + * mesh. Lower tolerance values will result in shorter mesh edges. + * @param edge_len_min_max is the stopping criterion for minimum and maximum allowed + * edge length. + * @param face_range the range of triangular faces defining one or several surface patches + * to be remeshed. + * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. + */ template Adaptive_sizing_field(const double tol , const std::pair& edge_len_min_max @@ -74,6 +106,7 @@ class Adaptive_sizing_field : public CGAL::Sizing_field calc_sizing_map(ffg); } } + ///@} private: template diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 0a259d3ef31a..956ebeb21706 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -23,6 +23,25 @@ namespace CGAL { namespace Polygon_mesh_processing { +/*! +* \ingroup PMP_meshing_grp +* provides a set of instructions for isotropic remeshing to achieve uniform +* mesh edge lengths. +* +* Edges longer than the 4/3 of the target edge length will be split in half, while +* edges shorter than the 4/5 of the target edge length will be collapsed. +* +* \cgalModels PMPSizingField +* +* \sa `isotropic_remeshing` +* \sa `Adaptive_sizing_field` +* +* @tparam PolygonMesh model of `MutableFaceGraph` that +* has an internal property map for `CGAL::vertex_point_t`. +* @tparam VPMap a property map associating points to the vertices of `pmesh`. +* It is a a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type. Default is `boost::get(CGAL::vertex_point, pmesh)`. +*/ template ::const_type> class Uniform_sizing_field : public CGAL::Sizing_field @@ -36,18 +55,36 @@ class Uniform_sizing_field : public CGAL::Sizing_field typedef typename Base::halfedge_descriptor halfedge_descriptor; typedef typename Base::vertex_descriptor vertex_descriptor; - Uniform_sizing_field(const FT size, const VPMap& vpmap) + /// \name Creation + /// @{ + /*! + * Returns an object to serve as criterion for uniform edge lengths. + * + * @param size is the target edge length for the isotropic remeshing. If set to 0, + * the criterion for edge length is ignored and edges are neither split nor collapsed. + * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. + */ + Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) : m_sq_short( CGAL::square(4./5. * size)) , m_sq_long( CGAL::square(4./3. * size)) - , m_vpmap(vpmap) + , m_vpmap(get(CGAL::vertex_point, pmesh)) {} - Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + /*! + * Returns an object to serve as criterion for uniform edge lengths. + * \param size is the target edge length for the isotropic remeshing. If set to 0, + * the criterion for edge length is ignored and edges are neither split nor collapsed. + * \param vpmap is the input vertex point map that associates points to the vertices of + * an input mesh. + */ + Uniform_sizing_field(const FT size, const VPMap& vpmap) : m_sq_short( CGAL::square(4./5. * size)) , m_sq_long( CGAL::square(4./3. * size)) - , m_vpmap(get(CGAL::vertex_point, pmesh)) + , m_vpmap(vpmap) {} + /// @} + private: FT sqlength(const vertex_descriptor va, const vertex_descriptor vb) const diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index c0103f943299..54b614304e19 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -317,6 +317,7 @@ void tangential_relaxation(const VertexRange& vertices, #endif } +//todo ip: doc here? template Date: Thu, 17 Aug 2023 00:29:19 +0200 Subject: [PATCH 0636/1398] Fix templating error in isotropic remeshing overload --- .../include/CGAL/Polygon_mesh_processing/remesh.h | 9 ++++++++- .../Plugins/PMP/Isotropic_remeshing_plugin.cpp | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 70771b6c81bf..bee2a645b2c4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -344,7 +344,14 @@ void isotropic_remeshing(const FaceRange& faces , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { - Uniform_sizing_field sizing(target_edge_length, pmesh); + using parameters::choose_parameter; + using parameters::get_parameter; + + typedef typename GetVertexPointMap::type VPMap; + VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_property_map(vertex_point, pmesh)); + + Uniform_sizing_field sizing(target_edge_length, vpmap); if (target_edge_length > 0) isotropic_remeshing(faces, sizing, pmesh, np); else diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index 3f1816d7ce31..a819c2c22943 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -435,7 +435,7 @@ public Q_SLOTS: selection_item->constrained_edges_pmap(), get(CGAL::vertex_point, *selection_item->polyhedron()), CGAL::Constant_property_map(1), - CGAL::Polygon_mesh_processing::Uniform_sizing_field( 4. / 3. * target_length, pmesh))) + CGAL::Polygon_mesh_processing::Uniform_sizing_field( 4. / 3. * target_length, pmesh))) { QApplication::restoreOverrideCursor(); //If facets are selected, splitting edges will add facets that won't be selected, and it will mess up the rest. @@ -741,7 +741,7 @@ public Q_SLOTS: ecm, get(CGAL::vertex_point, pmesh), CGAL::Constant_property_map(1), - CGAL::Polygon_mesh_processing::Uniform_sizing_field(4. / 3. * target_length, pmesh))) + CGAL::Polygon_mesh_processing::Uniform_sizing_field(4. / 3. * target_length, pmesh))) { QApplication::restoreOverrideCursor(); QMessageBox::warning(mw, tr("Error"), From f5d23db40a57b816024edb19ee483aaf7f40ae37 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 17 Aug 2023 08:03:37 +0200 Subject: [PATCH 0637/1398] Add template argument to constructor --- .../include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 956ebeb21706..ce80e3edd0a6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -64,7 +64,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field * the criterion for edge length is ignored and edges are neither split nor collapsed. * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. */ - Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) : m_sq_short( CGAL::square(4./5. * size)) , m_sq_long( CGAL::square(4./3. * size)) , m_vpmap(get(CGAL::vertex_point, pmesh)) From 1f9142bfc2e116623c364c1ff884e4533dfaf284 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 17 Aug 2023 18:19:03 +0200 Subject: [PATCH 0638/1398] Try to fix failing test --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 5 +++-- .../internal/Isotropic_remeshing/Sizing_field.h | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 1c6915b4c96d..2914a1c36053 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -41,8 +41,9 @@ namespace Polygon_mesh_processing * @tparam PolygonMesh model of `MutableFaceGraph` that * has an internal property map for `CGAL::vertex_point_t`. */ -template -class Adaptive_sizing_field : public CGAL::Sizing_field +template ::const_type> +class Adaptive_sizing_field : public CGAL::Sizing_field { private: typedef CGAL::Sizing_field Base; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index d4109708352b..331e2ab922d0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -16,6 +16,8 @@ #include #include +#include + #include namespace CGAL From 46b50511a70fdd06405344128ba9fc63cfb9fad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 18 Aug 2023 10:16:45 +0200 Subject: [PATCH 0639/1398] add missing include directive detected by the CI --- .../Adaptive_sizing_field.h | 16 ++++++++++------ .../internal/Isotropic_remeshing/Sizing_field.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 2914a1c36053..06b662afbe04 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -16,11 +16,15 @@ #include #include - #include +#include +#include + #include + + namespace CGAL { namespace Polygon_mesh_processing @@ -100,9 +104,9 @@ class Adaptive_sizing_field : public CGAL::Sizing_field auto is_selected = get(CGAL::dynamic_face_property_t(), pmesh); for (face_descriptor f : faces(pmesh)) put(is_selected, f, false); for (face_descriptor f : face_range) put(is_selected, f, true); - CGAL::expand_face_selection(selection, pmesh, 1 - , is_selected, std::back_inserter(selection)); - CGAL::Face_filtered_graph ffg(pmesh, selection); + expand_face_selection(selection, pmesh, 1, + is_selected, std::back_inserter(selection)); + Face_filtered_graph ffg(pmesh, selection); calc_sizing_map(ffg); } @@ -224,8 +228,8 @@ class Adaptive_sizing_field : public CGAL::Sizing_field virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - return CGAL::midpoint(get(m_vpmap, target(h, pmesh)), - get(m_vpmap, source(h, pmesh))); + return midpoint(get(m_vpmap, target(h, pmesh)), + get(m_vpmap, source(h, pmesh))); } void update_sizing_map(const vertex_descriptor v, const PolygonMesh& pmesh) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h index 331e2ab922d0..8267df50f556 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h @@ -16,7 +16,7 @@ #include #include -#include +#include #include From e845b07bab5a8d3d11dd1a574385bc2658276869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 18 Aug 2023 10:51:56 +0200 Subject: [PATCH 0640/1398] using Koening lookup --- .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index ce80e3edd0a6..fb88321d6a2c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -89,7 +89,7 @@ class Uniform_sizing_field : public CGAL::Sizing_field FT sqlength(const vertex_descriptor va, const vertex_descriptor vb) const { - return FT(CGAL::squared_distance(get(m_vpmap, va), get(m_vpmap, vb))); + return FT(squared_distance(get(m_vpmap, va), get(m_vpmap, vb))); } FT sqlength(const halfedge_descriptor& h, const PolygonMesh& pmesh) const @@ -128,8 +128,8 @@ class Uniform_sizing_field : public CGAL::Sizing_field virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { - return CGAL::midpoint(get(m_vpmap, target(h, pmesh)), - get(m_vpmap, source(h, pmesh))); + return midpoint(get(m_vpmap, target(h, pmesh)), + get(m_vpmap, source(h, pmesh))); } private: From b69a2671fe9b0d040fc6123993d5622a2a6d357f Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 18 Aug 2023 17:45:59 +0200 Subject: [PATCH 0641/1398] Rename Sizing_field to Sizing_field_base --- .../Polygon_mesh_processing/Adaptive_sizing_field.h | 11 ++++------- .../Polygon_mesh_processing/Uniform_sizing_field.h | 6 +++--- .../{Sizing_field.h => Sizing_field_base.h} | 2 +- .../include/CGAL/Polygon_mesh_processing/remesh.h | 4 ++-- 4 files changed, 10 insertions(+), 13 deletions(-) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/{Sizing_field.h => Sizing_field_base.h} (98%) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 06b662afbe04..60b5e3a8855f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -15,7 +15,7 @@ #include -#include +#include #include #include @@ -23,8 +23,6 @@ #include - - namespace CGAL { namespace Polygon_mesh_processing @@ -45,12 +43,11 @@ namespace Polygon_mesh_processing * @tparam PolygonMesh model of `MutableFaceGraph` that * has an internal property map for `CGAL::vertex_point_t`. */ -template ::const_type> -class Adaptive_sizing_field : public CGAL::Sizing_field +template +class Adaptive_sizing_field : public CGAL::Sizing_field_base { private: - typedef CGAL::Sizing_field Base; + typedef CGAL::Sizing_field_base Base; public: typedef typename Base::K K; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index fb88321d6a2c..d22e0079d7fd 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -15,7 +15,7 @@ #include -#include +#include #include @@ -44,10 +44,10 @@ namespace Polygon_mesh_processing */ template ::const_type> -class Uniform_sizing_field : public CGAL::Sizing_field +class Uniform_sizing_field : public CGAL::Sizing_field_base { private: - typedef CGAL::Sizing_field Base; + typedef CGAL::Sizing_field_base Base; public: typedef typename Base::FT FT; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h similarity index 98% rename from Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h rename to Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 8267df50f556..81afe3af21fa 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -27,7 +27,7 @@ namespace CGAL */ template ::const_type> -class Sizing_field +class Sizing_field_base { private: typedef PolygonMesh PM; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index bee2a645b2c4..842d980eae80 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -45,7 +45,7 @@ namespace Polygon_mesh_processing { * models of `Hashable`. * @tparam FaceRange range of `boost::graph_traits::%face_descriptor`, * model of `Range`. Its iterator type is `ForwardIterator`. -* @tparam SizingFunction model of `Sizing_field` +* @tparam SizingFunction model of `PMPSizingField` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh a polygon mesh with triangulated surface patches to be remeshed @@ -372,7 +372,7 @@ void isotropic_remeshing(const FaceRange& faces * has an internal property map for `CGAL::vertex_point_t`. * @tparam EdgeRange range of `boost::graph_traits::%edge_descriptor`, * model of `Range`. Its iterator type is `InputIterator`. -* @tparam SizingFunction model of `Sizing_field` +* @tparam SizingFunction model of `Sizing_field_base` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh a polygon mesh From 35153d509d2efc054be9a3ec67069d1a105b12de Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 18 Aug 2023 19:07:07 +0200 Subject: [PATCH 0642/1398] Update documentation --- .../Concepts/PMPSizingField.h | 13 ++- .../CGAL/Polygon_mesh_processing/remesh.h | 2 +- .../tangential_relaxation.h | 85 ++++++++++++++++++- 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h index 5304beb32205..da58562c5577 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h @@ -31,28 +31,27 @@ typedef unspecified_type FT; /// @name Functions /// @{ -/// called to check whether the halfedge 'h' is longer than the target edge size +/// called to check whether the halfedge `h` is longer than the target edge size /// and as such should be split. If the halfedge is longer, it returns the squared /// length of the edge. boost::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const; -/// called to check whether the halfedge with end vertices 'va' and 'vb' is longer +/// called to check whether the halfedge with end vertices `va` and `vb` is longer /// than the target edge size and as such should be split. If the halfedge is longer, /// it returns the squared length of the edge. boost::optional is_too_long(const vertex_descriptor va, const vertex_descriptor vb) const; -/// called to check whether the halfedge 'h' should be collapsed in case it is -/// shorter than the target edge size +/// called to check whether the halfedge `h` should be collapsed in case it is +/// shorter than the target edge size. boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const; -/// called to define the location of the halfedge 'h' split in case 'is_too_long' -/// returns a value +/// called to define the location of the halfedge `h` split in case `is_too_long` +/// returns a value. Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const; - /// @} }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index 842d980eae80..db036a4be6ac 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -372,7 +372,7 @@ void isotropic_remeshing(const FaceRange& faces * has an internal property map for `CGAL::vertex_point_t`. * @tparam EdgeRange range of `boost::graph_traits::%edge_descriptor`, * model of `Range`. Its iterator type is `InputIterator`. -* @tparam SizingFunction model of `Sizing_field_base` +* @tparam SizingFunction model of `PMPSizingField` * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param pmesh a polygon mesh diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h index 54b614304e19..db4c3f9955d9 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/tangential_relaxation.h @@ -317,7 +317,90 @@ void tangential_relaxation(const VertexRange& vertices, #endif } -//todo ip: doc here? +/*! +* \ingroup PMP_meshing_grp +* applies an iterative area-based tangential smoothing to the given range of vertices based on the +* underlying sizing field. +* Each vertex `v` is relocated to its weighted centroid, where weights depend on the area of the +* adjacent triangle and its averaged vertex sizing values. +* The relocation vector is projected back to the tangent plane to the surface at `v`, iteratively. +* The connectivity remains unchanged. +* +* @tparam TriangleMesh model of `FaceGraph` and `VertexListGraph`. +* The descriptor types `boost::graph_traits::%face_descriptor` +* and `boost::graph_traits::%halfedge_descriptor` must be +* models of `Hashable`. +* @tparam VertexRange range of `boost::graph_traits::%vertex_descriptor`, +* model of `Range`. Its iterator type is `ForwardIterator`. +* @tparam SizingFunction model of `PMPSizingField` +* @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" +* +* @param vertices the range of vertices which will be relocated by relaxation +* @param tm the triangle mesh to which `vertices` belong +* @param sizing a map containing sizing field for individual vertices. +* Used to derive smoothing weights. +* @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below +* +* \cgalNamedParamsBegin +* \cgalParamNBegin{vertex_point_map} +* \cgalParamDescription{a property map associating points to the vertices of `tm`} +* \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type} +* \cgalParamDefault{`boost::get(CGAL::vertex_point, tm)`} +* \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` +* must be available in `TriangleMesh`.} +* \cgalParamNEnd +* +* \cgalParamNBegin{geom_traits} +* \cgalParamDescription{an instance of a geometric traits class} +* \cgalParamType{a class model of `Kernel`} +* \cgalParamDefault{a \cgal Kernel deduced from the `Point_3` type, using `CGAL::Kernel_traits`} +* \cgalParamExtra{The geometric traits class must be compatible with the vertex `Point_3` type.} +* \cgalParamExtra{Exact constructions kernels are not supported by this function.} +* \cgalParamNEnd +* +* \cgalParamNBegin{number_of_iterations} +* \cgalParamDescription{the number of smoothing iterations} +* \cgalParamType{unsigned int} +* \cgalParamDefault{`1`} +* \cgalParamNEnd +* +* \cgalParamNBegin{edge_is_constrained_map} +* \cgalParamDescription{a property map containing the constrained-or-not status of each edge of `tm`. +* The endpoints of a constrained edge cannot be moved by relaxation.} +* \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%edge_descriptor` +* as key type and `bool` as value type. It must be default constructible.} +* \cgalParamDefault{a default property map where no edges are constrained} +* \cgalParamExtra{Boundary edges are always considered as constrained edges.} +* \cgalParamNEnd +* +* \cgalParamNBegin{vertex_is_constrained_map} +* \cgalParamDescription{a property map containing the constrained-or-not status of each vertex of `tm`. +* A constrained vertex cannot be modified during relaxation.} +* \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 vertices are constrained} +* \cgalParamNEnd +* +* \cgalParamNBegin{relax_constraints} +* \cgalParamDescription{If `true`, the end vertices of the edges set as constrained +* in `edge_is_constrained_map` and boundary edges move along the +* constrained polylines they belong to.} +* \cgalParamType{Boolean} +* \cgalParamDefault{`false`} +* \cgalParamNEnd +* +* \cgalParamNBegin{allow_move_functor} +* \cgalParamDescription{A function object used to determinate if a vertex move should be allowed or not} +* \cgalParamType{Unary functor that provides `bool operator()(vertex_descriptor v, Point_3 src, Point_3 tgt)` returning `true` +* if the vertex `v` can be moved from `src` to `tgt`; `Point_3` being the value type of the vertex point map } +* \cgalParamDefault{If not provided, all moves are allowed.} +* \cgalParamNEnd +* +* \cgalNamedParamsEnd +* +* \todo check if it should really be a triangle mesh or if a polygon mesh is fine +*/ template Date: Fri, 18 Aug 2023 20:17:38 +0200 Subject: [PATCH 0643/1398] Add precondition that sizing field and remeshing vpmap must be the same --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 4 +++- .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 4 +++- .../internal/Isotropic_remeshing/Sizing_field_base.h | 2 ++ .../include/CGAL/Polygon_mesh_processing/remesh.h | 3 +++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 60b5e3a8855f..36f714dab6ef 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -223,12 +223,14 @@ class Adaptive_sizing_field : public CGAL::Sizing_field_base return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const + Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { return midpoint(get(m_vpmap, target(h, pmesh)), get(m_vpmap, source(h, pmesh))); } + const DefaultVPMap& get_vpmap() const { return m_vpmap; } + void update_sizing_map(const vertex_descriptor v, const PolygonMesh& pmesh) { // calculating it as the average of two vertices on other ends diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index d22e0079d7fd..46ca4c5acedc 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -126,12 +126,14 @@ class Uniform_sizing_field : public CGAL::Sizing_field_base return boost::none; } - virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const + Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const { return midpoint(get(m_vpmap, target(h, pmesh)), get(m_vpmap, source(h, pmesh))); } + const VPMap& get_vpmap() const { return m_vpmap; } + private: FT m_sq_short; FT m_sq_long; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 81afe3af21fa..13661883b2aa 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -53,6 +53,8 @@ class Sizing_field_base const PolygonMesh& pmesh) const = 0; virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const = 0; + virtual const VPMap& get_vpmap() const = 0; + }; }//end namespace CGAL diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index db036a4be6ac..a36c3248db12 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -277,6 +277,9 @@ void isotropic_remeshing(const FaceRange& faces } #endif + CGAL_precondition_msg((sizing.get_vpmap()) == vpmap, "Input mesh/vertex point map is not the same as the " + "one used for sizing field. Remeshing aborted."); + #ifdef CGAL_PMP_REMESHING_VERBOSE t.stop(); std::cout << "\rRemeshing parameters done ("<< t.time() <<" sec)" << std::endl; From a96054a05151983dcd7a00b7afe681cf75768b01 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Fri, 18 Aug 2023 21:43:36 +0200 Subject: [PATCH 0644/1398] Place Sizing_field_base under PMP namespace as Uniform and Adaptive classes --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 4 ++-- .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 4 ++-- .../internal/Isotropic_remeshing/Sizing_field_base.h | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 36f714dab6ef..b2444f258c9b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -44,10 +44,10 @@ namespace Polygon_mesh_processing * has an internal property map for `CGAL::vertex_point_t`. */ template -class Adaptive_sizing_field : public CGAL::Sizing_field_base +class Adaptive_sizing_field : public Sizing_field_base { private: - typedef CGAL::Sizing_field_base Base; + typedef Sizing_field_base Base; public: typedef typename Base::K K; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 46ca4c5acedc..1b3c3b3f60b1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -44,10 +44,10 @@ namespace Polygon_mesh_processing */ template ::const_type> -class Uniform_sizing_field : public CGAL::Sizing_field_base +class Uniform_sizing_field : public Sizing_field_base { private: - typedef CGAL::Sizing_field_base Base; + typedef Sizing_field_base Base; public: typedef typename Base::FT FT; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 13661883b2aa..2ab66f8532a1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -22,6 +22,8 @@ namespace CGAL { +namespace Polygon_mesh_processing +{ /*! * Sizing field virtual class */ @@ -57,6 +59,7 @@ class Sizing_field_base }; +}//end namespace Polygon_mesh_processing }//end namespace CGAL #endif //CGAL_PMP_REMESHING_SIZING_FIELD_H From 8cd75d86f7ea01a8efc94c35d3f07994e8fa3380 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sun, 20 Aug 2023 21:24:38 +0200 Subject: [PATCH 0645/1398] Fix vpmap return error --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 2 +- .../include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 2 +- .../internal/Isotropic_remeshing/Sizing_field_base.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index b2444f258c9b..236ac2fb6a14 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -229,7 +229,7 @@ class Adaptive_sizing_field : public Sizing_field_base get(m_vpmap, source(h, pmesh))); } - const DefaultVPMap& get_vpmap() const { return m_vpmap; } + DefaultVPMap get_vpmap() const { return m_vpmap; } void update_sizing_map(const vertex_descriptor v, const PolygonMesh& pmesh) { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 1b3c3b3f60b1..0b45fecb7689 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -132,7 +132,7 @@ class Uniform_sizing_field : public Sizing_field_base get(m_vpmap, source(h, pmesh))); } - const VPMap& get_vpmap() const { return m_vpmap; } + VPMap get_vpmap() const { return m_vpmap; } private: FT m_sq_short; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 2ab66f8532a1..89337716c94f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -55,7 +55,7 @@ class Sizing_field_base const PolygonMesh& pmesh) const = 0; virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const = 0; - virtual const VPMap& get_vpmap() const = 0; + virtual VPMap get_vpmap() const = 0; }; From a00509ea477e52494a7bb97985aa8c3bda4fa70e Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 21 Aug 2023 20:05:06 +0200 Subject: [PATCH 0646/1398] Remove precondition for vpmap --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 2 -- .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 2 -- .../internal/Isotropic_remeshing/Sizing_field_base.h | 2 -- .../include/CGAL/Polygon_mesh_processing/remesh.h | 3 --- 4 files changed, 9 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 236ac2fb6a14..a5783d811019 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -229,8 +229,6 @@ class Adaptive_sizing_field : public Sizing_field_base get(m_vpmap, source(h, pmesh))); } - DefaultVPMap get_vpmap() const { return m_vpmap; } - void update_sizing_map(const vertex_descriptor v, const PolygonMesh& pmesh) { // calculating it as the average of two vertices on other ends diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 0b45fecb7689..aebf1d43f4ed 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -132,8 +132,6 @@ class Uniform_sizing_field : public Sizing_field_base get(m_vpmap, source(h, pmesh))); } - VPMap get_vpmap() const { return m_vpmap; } - private: FT m_sq_short; FT m_sq_long; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 89337716c94f..9b8c545c1d32 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -55,8 +55,6 @@ class Sizing_field_base const PolygonMesh& pmesh) const = 0; virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const = 0; - virtual VPMap get_vpmap() const = 0; - }; }//end namespace Polygon_mesh_processing diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index a36c3248db12..db036a4be6ac 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -277,9 +277,6 @@ void isotropic_remeshing(const FaceRange& faces } #endif - CGAL_precondition_msg((sizing.get_vpmap()) == vpmap, "Input mesh/vertex point map is not the same as the " - "one used for sizing field. Remeshing aborted."); - #ifdef CGAL_PMP_REMESHING_VERBOSE t.stop(); std::cout << "\rRemeshing parameters done ("<< t.time() <<" sec)" << std::endl; From 9dff62200795f9e5074aa37b1688e1a3191861f4 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 21 Aug 2023 21:10:44 +0200 Subject: [PATCH 0647/1398] Changes for documentation --- .../Adaptive_sizing_field.h | 18 ++++++------- .../Uniform_sizing_field.h | 27 ++++++++++--------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index a5783d811019..5b3b8c398932 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -48,6 +48,9 @@ class Adaptive_sizing_field : public Sizing_field_base { private: typedef Sizing_field_base Base; + typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; + typedef typename boost::property_map::type VertexSizingMap; public: typedef typename Base::K K; @@ -58,25 +61,22 @@ class Adaptive_sizing_field : public Sizing_field_base typedef typename Base::vertex_descriptor vertex_descriptor; typedef typename Base::DefaultVPMap DefaultVPMap; - typedef typename CGAL::dynamic_vertex_property_t Vertex_property_tag; - typedef typename boost::property_map::type VertexSizingMap; - /// \name Creation /// @{ /*! - * Returns an object to serve as criteria for adaptive curvature-based edge lengths. + * returns an object to serve as criteria for adaptive curvature-based edge lengths. * * @tparam FaceRange range of `boost::graph_traits::%face_descriptor`, * model of `Range`. Its iterator type is `ForwardIterator`. * - * @param tol the error tolerance, the maximum deviation of an edge from the original - * mesh. Lower tolerance values will result in shorter mesh edges. + * @param tol the error tolerance, used together with curvature to derive target edge length. + * Lower tolerance values will result in shorter mesh edges. * @param edge_len_min_max is the stopping criterion for minimum and maximum allowed * edge length. * @param face_range the range of triangular faces defining one or several surface patches - * to be remeshed. - * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. + * to be remeshed. It should be the same as the range of faces used for `isotropic_remeshing()`. + * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. It should be the + * same mesh as the one used in `isotropic_remeshing()`. */ template Adaptive_sizing_field(const double tol diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index aebf1d43f4ed..05f3736f961b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -57,21 +57,9 @@ class Uniform_sizing_field : public Sizing_field_base /// \name Creation /// @{ - /*! - * Returns an object to serve as criterion for uniform edge lengths. - * - * @param size is the target edge length for the isotropic remeshing. If set to 0, - * the criterion for edge length is ignored and edges are neither split nor collapsed. - * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. - */ - Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) - : m_sq_short( CGAL::square(4./5. * size)) - , m_sq_long( CGAL::square(4./3. * size)) - , m_vpmap(get(CGAL::vertex_point, pmesh)) - {} /*! - * Returns an object to serve as criterion for uniform edge lengths. + * returns an object to serve as criterion for uniform edge lengths. * \param size is the target edge length for the isotropic remeshing. If set to 0, * the criterion for edge length is ignored and edges are neither split nor collapsed. * \param vpmap is the input vertex point map that associates points to the vertices of @@ -83,6 +71,19 @@ class Uniform_sizing_field : public Sizing_field_base , m_vpmap(vpmap) {} + /*! + * returns an object to serve as criterion for uniform edge lengths. It calls the first + * constructor using default values for the vertex point map of the input polygon mesh. + * + * @param size is the target edge length for the isotropic remeshing. If set to 0, + * the criterion for edge length is ignored and edges are neither split nor collapsed. + * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. The default + * vertex point map of pmesh is used to construct the class. + */ + Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + : Uniform_sizing_field(size, get(CGAL::vertex_point, pmesh)) + {} + /// @} private: From 039b02710ebba36e8c7049b55c9e4a5aca90e9ee Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 21 Aug 2023 22:01:49 +0200 Subject: [PATCH 0648/1398] boost::optional to std::optional C++ 17 update --- .../Concepts/PMPSizingField.h | 6 +- .../Adaptive_sizing_field.h | 12 ++-- .../Uniform_sizing_field.h | 12 ++-- .../Isotropic_remeshing/Sizing_field_base.h | 12 ++-- .../Isotropic_remeshing/remesh_impl.h | 70 +++++++++---------- 5 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h index da58562c5577..8f89b3a88967 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h @@ -34,18 +34,18 @@ typedef unspecified_type FT; /// called to check whether the halfedge `h` is longer than the target edge size /// and as such should be split. If the halfedge is longer, it returns the squared /// length of the edge. -boost::optional is_too_long(const halfedge_descriptor h, +std::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const; /// called to check whether the halfedge with end vertices `va` and `vb` is longer /// than the target edge size and as such should be split. If the halfedge is longer, /// it returns the squared length of the edge. -boost::optional is_too_long(const vertex_descriptor va, +std::optional is_too_long(const vertex_descriptor va, const vertex_descriptor vb) const; /// called to check whether the halfedge `h` should be collapsed in case it is /// shorter than the target edge size. -boost::optional is_too_short(const halfedge_descriptor h, +std::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const; /// called to define the location of the halfedge `h` split in case `is_too_long` diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 5b3b8c398932..fcc96deb9baf 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -183,7 +183,7 @@ class Adaptive_sizing_field : public Sizing_field_base return get(m_vertex_sizing_map, v); } - boost::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const + std::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const { const FT sqlen = sqlength(h, pmesh); FT sqtarg_len = CGAL::square(4./3. * CGAL::min(get(m_vertex_sizing_map, source(h, pmesh)), @@ -193,10 +193,10 @@ class Adaptive_sizing_field : public Sizing_field_base if(sqlen > sqtarg_len) return sqlen; else - return boost::none; + return std::nullopt; } - boost::optional is_too_long(const vertex_descriptor va, + std::optional is_too_long(const vertex_descriptor va, const vertex_descriptor vb) const { const FT sqlen = sqlength(va, vb); @@ -207,10 +207,10 @@ class Adaptive_sizing_field : public Sizing_field_base if (sqlen > sqtarg_len) return sqlen; else - return boost::none; + return std::nullopt; } - boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const + std::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const { const FT sqlen = sqlength(h, pmesh); FT sqtarg_len = CGAL::square(4./5. * CGAL::min(get(m_vertex_sizing_map, source(h, pmesh)), @@ -220,7 +220,7 @@ class Adaptive_sizing_field : public Sizing_field_base if (sqlen < sqtarg_len) return sqlen; else - return boost::none; + return std::nullopt; } Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 05f3736f961b..7e8c24f3dd22 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -99,32 +99,32 @@ class Uniform_sizing_field : public Sizing_field_base } public: - boost::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const + std::optional is_too_long(const halfedge_descriptor h, const PolygonMesh& pmesh) const { const FT sqlen = sqlength(h, pmesh); if(sqlen > m_sq_long) return sqlen; else - return boost::none; + return std::nullopt; } - boost::optional is_too_long(const vertex_descriptor va, + std::optional is_too_long(const vertex_descriptor va, const vertex_descriptor vb) const { const FT sqlen = sqlength(va, vb); if (sqlen > m_sq_long) return sqlen; else - return boost::none; + return std::nullopt; } - boost::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const + std::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const { const FT sqlen = sqlength(h, pmesh); if (sqlen < m_sq_short) return sqlen; else - return boost::none; + return std::nullopt; } Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 9b8c545c1d32..d433a4c16d61 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -47,12 +47,12 @@ class Sizing_field_base typedef typename K::FT FT; public: - virtual boost::optional is_too_long(const halfedge_descriptor h, - const PolygonMesh& pmesh) const = 0; - virtual boost::optional is_too_long(const vertex_descriptor va, - const vertex_descriptor vb) const = 0; - virtual boost::optional is_too_short(const halfedge_descriptor h, - const PolygonMesh& pmesh) const = 0; + virtual std::optional is_too_long(const halfedge_descriptor h, + const PolygonMesh& pmesh) const = 0; + virtual std::optional is_too_long(const vertex_descriptor va, + const vertex_descriptor vb) const = 0; + virtual std::optional is_too_short(const halfedge_descriptor h, + const PolygonMesh& pmesh) const = 0; virtual Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const = 0; }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h index 27ea3cd29271..895083fbbcd3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/remesh_impl.h @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -54,6 +53,7 @@ #include #include #include +#include //todo ip: temp #define CGAL_PMP_REMESHING_VERBOSE @@ -404,9 +404,9 @@ namespace internal { ); for(edge_descriptor e : edge_range) { - boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); - if(sqlen != boost::none) - long_edges.emplace(halfedge(e, mesh_), sqlen.get()); + std::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); + if(sqlen != std::nullopt) + long_edges.emplace(halfedge(e, mesh_), sqlen.value()); } //split long edges @@ -443,13 +443,13 @@ namespace internal { //check sub-edges //if it was more than twice the "long" threshold, insert them - boost::optional sqlen_new = sizing.is_too_long(hnew, mesh_); - if(sqlen_new != boost::none) - long_edges.emplace(hnew, sqlen_new.get()); + std::optional sqlen_new = sizing.is_too_long(hnew, mesh_); + if(sqlen_new != std::nullopt) + long_edges.emplace(hnew, sqlen_new.value()); sqlen_new = sizing.is_too_long(next(hnew, mesh_), mesh_); - if (sqlen_new != boost::none) - long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); + if (sqlen_new != std::nullopt) + long_edges.emplace(next(hnew, mesh_), sqlen_new.value()); //insert new edges to keep triangular faces, and update long_edges if (!is_border(hnew, mesh_)) @@ -504,9 +504,9 @@ namespace internal { { if (!is_split_allowed(e)) continue; - boost::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); - if(sqlen != boost::none) - long_edges.emplace(halfedge(e, mesh_), sqlen.get()); + std::optional sqlen = sizing.is_too_long(halfedge(e, mesh_), mesh_); + if(sqlen != std::nullopt) + long_edges.emplace(halfedge(e, mesh_), sqlen.value()); } //split long edges @@ -560,13 +560,13 @@ namespace internal { //check sub-edges //if it was more than twice the "long" threshold, insert them - boost::optional sqlen_new = sizing.is_too_long(hnew, mesh_); - if(sqlen_new != boost::none) - long_edges.emplace(hnew, sqlen_new.get()); + std::optional sqlen_new = sizing.is_too_long(hnew, mesh_); + if(sqlen_new != std::nullopt) + long_edges.emplace(hnew, sqlen_new.value()); sqlen_new = sizing.is_too_long(next(hnew, mesh_), mesh_); - if (sqlen_new != boost::none) - long_edges.emplace(next(hnew, mesh_), sqlen_new.get()); + if (sqlen_new != std::nullopt) + long_edges.emplace(next(hnew, mesh_), sqlen_new.value()); //insert new edges to keep triangular faces, and update long_edges if (!is_on_border(hnew)) @@ -585,9 +585,9 @@ namespace internal { if (snew == PATCH) { - boost::optional sql = sizing.is_too_long(hnew2, mesh_); - if(sql != boost::none) - long_edges.emplace(hnew2, sql.get()); + std::optional sql = sizing.is_too_long(hnew2, mesh_); + if(sql != std::nullopt) + long_edges.emplace(hnew2, sql.value()); } } @@ -608,9 +608,9 @@ namespace internal { if (snew == PATCH) { - boost::optional sql = sizing.is_too_long(hnew2, mesh_); - if (sql != boost::none) - long_edges.emplace(hnew2, sql.get()); + std::optional sql = sizing.is_too_long(hnew2, mesh_); + if (sql != std::nullopt) + long_edges.emplace(hnew2, sql.value()); } } } @@ -653,10 +653,10 @@ namespace internal { Boost_bimap short_edges; for(edge_descriptor e : edges(mesh_)) { - boost::optional sqlen = sizing.is_too_short(halfedge(e, mesh_), mesh_); - if(sqlen != boost::none + std::optional sqlen = sizing.is_too_short(halfedge(e, mesh_), mesh_); + if(sqlen != std::nullopt && is_collapse_allowed(e, collapse_constraints)) - short_edges.insert(short_edge(halfedge(e, mesh_), sqlen.get())); + short_edges.insert(short_edge(halfedge(e, mesh_), sqlen.value())); } #ifdef CGAL_PMP_REMESHING_VERBOSE_PROGRESS std::cout << "done." << std::endl; @@ -752,8 +752,8 @@ namespace internal { for(halfedge_descriptor ha : halfedges_around_target(va, mesh_)) { vertex_descriptor va_i = source(ha, mesh_); - boost::optional sqha = sizing.is_too_long(vb, va_i); - if (sqha != boost::none) + std::optional sqha = sizing.is_too_long(vb, va_i); + if (sqha != std::nullopt) { collapse_ok = false; break; @@ -818,10 +818,10 @@ namespace internal { //insert new/remaining short edges for (halfedge_descriptor ht : halfedges_around_target(vkept, mesh_)) { - boost::optional sqlen = sizing.is_too_short(ht, mesh_); - if (sqlen != boost::none + std::optional sqlen = sizing.is_too_short(ht, mesh_); + if (sqlen != std::nullopt && is_collapse_allowed(edge(ht, mesh_), collapse_constraints)) - short_edges.insert(short_edge(ht, sqlen.get())); + short_edges.insert(short_edge(ht, sqlen.value())); } } }//end if(collapse_ok) @@ -1768,9 +1768,9 @@ namespace internal { //insert new edges in 'short_edges' if (is_collapse_allowed(edge(hf, mesh_), collapse_constraints)) { - boost::optional sqlen = sizing.is_too_short(hf, mesh_); - if (sqlen != boost::none) - short_edges.insert(typename Bimap::value_type(hf, sqlen.get())); + std::optional sqlen = sizing.is_too_short(hf, mesh_); + if (sqlen != std::nullopt) + short_edges.insert(typename Bimap::value_type(hf, sqlen.value())); } if(!is_border(hf, mesh_) && @@ -1986,7 +1986,7 @@ namespace internal { bool check_normals(const HalfedgeRange& hedges) const { std::size_t nb_patches = patch_id_to_index_map.size(); - //std::vector > normal_per_patch(nb_patches,boost::none); + //std::vector > normal_per_patch(nb_patches,std::nullopt); std::vector initialized(nb_patches,false); std::vector normal_per_patch(nb_patches); From 4ca59942bf63bbde8df5850f5eb34e287ba793f0 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Mon, 21 Aug 2023 22:09:38 +0200 Subject: [PATCH 0649/1398] Document Sizing_field_base --- .../Isotropic_remeshing/Sizing_field_base.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index d433a4c16d61..55cdfceff24e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -25,7 +25,21 @@ namespace CGAL namespace Polygon_mesh_processing { /*! -* Sizing field virtual class +* \ingroup PMP_meshing_grp +* pure virtual class serving as a base for sizing field classes utilized in isotropic +* remeshing. +* +* \cgalModels PMPSizingField +* +* \sa `isotropic_remeshing` +* \sa `Uniform_sizing_field` +* \sa `Adaptive_sizing_field` +* +* @tparam PolygonMesh model of `MutableFaceGraph` that +* has an internal property map for `CGAL::vertex_point_t`. +* @tparam VPMap a property map associating points to the vertices of `pmesh`. +* It is a a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` +* as key type and `%Point_3` as value type. Default is `boost::get(CGAL::vertex_point, pmesh)`. */ template ::const_type> From b48ef206d962eb15beb8392faaa3f3e3ef78b883 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 22 Aug 2023 09:11:09 +0100 Subject: [PATCH 0650/1398] Arrangement: small doc fixes --- .../doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index 5254543120c7..cea994341a9d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -4780,7 +4780,7 @@ or line segments. The \link Arr_conic_traits_2::Curve_2 `Curve_2`\endlink and the derived \link Arr_conic_traits_2::X_monotone_curve_2 `X_monotone_curve_2`\endlink classes also support basic access functions such as `source()`, -`target()`, and `orientation()`. +`target()`, and `%orientation()`. \cgalFigureBegin{aos_fig-conics,conics.png} @@ -5067,7 +5067,7 @@ substitute the template parameters `RatKernel`, `AlgKernel`, and the same requirements of the corresponding types used to instantiate the `Arr_conic_traits_2` class template. Here, the use of the `CORE_algebraic_number_traits` class is also recommended with -Cartesian kernels instantiated with the `Rational` and `Algebraic` +%Cartesian kernels instantiated with the `Rational` and `Algebraic` number types defined by this class. The examples given in this manual use the type definitions listed below. These types are defined in the header file `arr_Bezier.h`. From 6f4804fd1e1aa8068467e5f1a629434b5faf5b6e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 22 Aug 2023 10:02:18 +0100 Subject: [PATCH 0651/1398] More fixes --- .../doc/Algebraic_foundations/Algebraic_foundations.txt | 5 ++--- Number_types/doc/Number_types/NumberTypeSupport.txt | 4 ++-- Stream_support/doc/Stream_support/IOstream.txt | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt b/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt index 890716d2c09b..80a69b1719a8 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt +++ b/Algebraic_foundations/doc/Algebraic_foundations/Algebraic_foundations.txt @@ -169,8 +169,8 @@ Every \cgal `Kernel` comes with two real number types (number types embeddable into the real numbers). One of them is a `FieldNumberType`, and the other a `RingNumberType`. The coordinates of the basic kernel objects (points, vectors, etc.) come -from one of these types (the `FieldNumberType` in case of Cartesian -kernels, and the `RingNumberType` for Homogeneous kernels). +from one of these types (the `FieldNumberType` in case of %Cartesian +kernels, and the `RingNumberType` for %Homogeneous kernels). The concept `FieldNumberType` combines the requirements of the concepts `Field` and `RealEmbeddable`, while @@ -277,4 +277,3 @@ subsequent chapters. */ } /* namespace CGAL */ - diff --git a/Number_types/doc/Number_types/NumberTypeSupport.txt b/Number_types/doc/Number_types/NumberTypeSupport.txt index 705e1fe6d272..d22aee9d648a 100644 --- a/Number_types/doc/Number_types/NumberTypeSupport.txt +++ b/Number_types/doc/Number_types/NumberTypeSupport.txt @@ -120,7 +120,7 @@ To use these classes, \gmp and \mpfr must be installed. \anchor ledant \leda provides number types that can be used for exact computation -with both Cartesian and homogeneous representations. If you are using +with both %Cartesian and homogeneous representations. If you are using homogeneous representation with the built-in integer types `short`, `int`, and `long` as ring type, exactness of computations can be guaranteed only if your input data come from a @@ -130,7 +130,7 @@ integers of arbitrary length. (Of course the length is somehow bounded by the resources of your computer.) It can be used as ring type in homogeneous kernels and leads to exact computation as long as all intermediate results are rational. For the -same kind of problems, Cartesian representation with number type +same kind of problems, %Cartesian representation with number type `leda_rational` leads to exact computation as well. The number type `leda_bigfloat` in \leda is a variable precision floating-point type. Rounding mode and precision (i.e.\ mantissa length) of diff --git a/Stream_support/doc/Stream_support/IOstream.txt b/Stream_support/doc/Stream_support/IOstream.txt index cfdf25073ec2..be0f7ee02a9a 100644 --- a/Stream_support/doc/Stream_support/IOstream.txt +++ b/Stream_support/doc/Stream_support/IOstream.txt @@ -69,7 +69,7 @@ as a sequence of four byte. The format depends on the machine. The mode `PRETTY` serves mainly for debugging as the type of the geometric object is written, as well as the data defining the object. For example -for a point at the origin with Cartesian double coordinates, the output +for a point at the origin with %Cartesian double coordinates, the output would be `PointC2(0.0, 0.0)`. At the moment \cgal does not provide input operations for pretty printed data. By default a stream is in \ascii mode. @@ -519,4 +519,3 @@ which might look as follows: */ } /* namespace CGAL */ - From 55ea7ba7ecd2a88b4ac322ce34a50277b90c9a6e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 22 Aug 2023 10:21:46 +0100 Subject: [PATCH 0652/1398] More fixes --- .../Concepts/FieldNumberType.h | 3 +- .../CGAL/Arr_circle_segment_traits_2.h | 2 +- .../CGAL/Arr_conic_traits_2.h | 2 +- .../Concepts/BarycentricTraits_2.h | 4 +- .../CGAL/Approximate_min_ellipsoid_d.h | 8 +-- .../CGAL/Min_ellipse_2_traits_2.h | 2 +- .../CGAL/Min_sphere_of_spheres_d.h | 2 +- .../doc/Kernel_23/CGAL/Filtered_predicate.h | 2 +- .../Kernel_23/CGAL/Kernel/global_functions.h | 28 ++++---- Kernel_23/doc/Kernel_23/CGAL/Vector_2.h | 12 ++-- .../Concepts/FunctionObjectConcepts.h | 68 +++++++++---------- Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h | 4 +- .../Kernel--CartesianConstIterator_d.h | 3 +- .../Nef_2/Concepts/ExtendedKernelTraits_2.h | 3 +- .../Concepts/PMPDistanceTraits.h | 2 +- .../Concepts/PolynomialTraits_d--IsZeroAt.h | 5 +- .../Concepts/PolynomialTraits_d--SignAt.h | 5 +- .../Concepts/EfficientRANSACTraits.h | 8 +-- .../doc/Spatial_searching/CGAL/Fuzzy_sphere.h | 2 +- .../Concepts/FuzzyQueryItem.h | 2 +- .../Concepts/RawPoint_3.h | 2 +- .../MeanCurvatureSkeletonizationTraits.h | 3 +- 22 files changed, 83 insertions(+), 89 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h index 8609a9a9cbe7..ed902b7c3f1c 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/FieldNumberType.h @@ -5,7 +5,7 @@ The concept `FieldNumberType` combines the requirements of the concepts `Field` and `RealEmbeddable`. A model of `FieldNumberType` can be used as a template parameter -for Cartesian kernels. +for %Cartesian kernels. \cgalRefines{Field,RealEmbeddable} @@ -32,4 +32,3 @@ class FieldNumberType { /// @} }; /* end FieldNumberType */ - diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h index 43b7d56bcf8c..f7a5ec818200 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_circle_segment_traits_2.h @@ -168,7 +168,7 @@ class Arr_circle_segment_traits_2 { /*! The `Point_2` number-type nested within the traits class represents - * a Cartesian point whose coordinates are algebraic numbers of type + * a %Cartesian point whose coordinates are algebraic numbers of type * `CoordNT`. */ class Point_2 { diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h index fe6e70de9c59..4d7d479fed92 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h @@ -274,7 +274,7 @@ class Arr_conic_traits_2 { */ Point_2(const Algebraic& hx, const Algebraic& hy, const Algebraic& hz); - /*! constructs from Cartesian coordinates. + /*! constructs from %Cartesian coordinates. */ Point_2(const Algebraic& x, const Algebraic& y);: diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h index 1fe3c8fc2bd5..ba6951b76144 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricTraits_2.h @@ -159,7 +159,7 @@ typedef unspecified_type Less_xy_2; `Comparison_result operator(const Point_2& p, const Point_2& q)` - that compares the Cartesian x-coordinates of the points `p` and `q`. + that compares the %Cartesian x-coordinates of the points `p` and `q`. */ typedef unspecified_type Compare_x_2; @@ -168,7 +168,7 @@ typedef unspecified_type Compare_x_2; `Comparison_result operator(const Point_2& p, const Point_2& q)` - that compares the Cartesian y-coordinates of the points `p` and `q`. + that compares the %Cartesian y-coordinates of the points `p` and `q`. */ typedef unspecified_type Compare_y_2; diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h index 856d1a169296..7b48c2fc1147 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Approximate_min_ellipsoid_d.h @@ -8,7 +8,7 @@ An object of class `Approximate_min_ellipsoid_d` is an approximation to the ellipsoid of smallest volume enclosing a finite multiset of points in \f$ d\f$-dimensional Euclidean space \f$ \E^d\f$, \f$ d\ge 2\f$. -An ellipsoid in \f$ \E^d\f$ is a Cartesian pointset of the form \f$ \{ +An ellipsoid in \f$ \E^d\f$ is a %Cartesian pointset of the form \f$ \{ x\in\E^d \mid x^T E x + x^T e + \eta\leq 0 \}\f$, where \f$ E\f$ is some positive definite matrix from the set \f$ \mathbb{R}^{d\times d}\f$, \f$ e\f$ is some real \f$ d\f$-vector, and \f$ \eta\in\mathbb{R}\f$. A pointset \f$ P\subseteq \E^d\f$ is @@ -94,7 +94,7 @@ is actually achieved; the performance of the algorithm in this respect highly depends on the input pointset. Values of at least \f$ 0.01\f$ for \f$ \epsilon\f$ are usually handled without problems. -Internally, the algorithm represents the input points' Cartesian +Internally, the algorithm represents the input points' %Cartesian coordinates as `double`'s. For this conversion to work, the input point coordinates must be convertible to `double`. Also, in order to compute the achieved epsilon \f$ \epsilon'\f$ mentioned above, the algorithm @@ -171,7 +171,7 @@ typedef unspecified_type Cartesian_const_iterator; /*! A model of STL concept `RandomAccessIterator` with value type `double` that is used -to iterate over the Cartesian center coordinates of the computed +to iterate over the %Cartesian center coordinates of the computed ellipsoid, see `center_cartesian_begin()`. */ typedef unspecified_type Center_coordinate_iterator; @@ -313,7 +313,7 @@ int dimension() const; /*! -returns an iterator pointing to the first of the \f$ d\f$ Cartesian +returns an iterator pointing to the first of the \f$ d\f$ %Cartesian coordinates of the computed ellipsoid's center. The returned point is a floating-point approximation to the diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h index 25b54759c1a2..49c9b0c7485b 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_ellipse_2_traits_2.h @@ -46,7 +46,7 @@ bool is_circle(); /*! gives a double approximation of the -ellipse's conic equation. If `K` is a Cartesian kernel, the ellipse +ellipse's conic equation. If `K` is a %Cartesian kernel, the ellipse is the set of all points \f$ (x,y)\f$ satisfying \f$ rx^2+sy^2+txy+ux+vy+w=0\f$. In the Homogeneous case, the ellipse is the set of points \f$ (hx,hy,hw)\f$ satisfying \f$ r(hx)^2+s(hy)^2+t(hx)(hy)+u(hx)(hw)+v(hy)(hw)+w(hw)^2=0\f$. diff --git a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h index fbcd5f02e2dc..3590abf82a7d 100644 --- a/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h +++ b/Bounding_volumes/doc/Bounding_volumes/CGAL/Min_sphere_of_spheres_d.h @@ -90,7 +90,7 @@ be used in such a case. (For exact number types Currently, we require `Traits::FT` to be either an exact number type or `double` or `float`; other inexact number types are not supported at this time. Also, the current implementation only -handles spheres with Cartesian coordinates; homogeneous representation +handles spheres with %Cartesian coordinates; homogeneous representation is not supported yet. \cgalHeading{Example} diff --git a/Kernel_23/doc/Kernel_23/CGAL/Filtered_predicate.h b/Kernel_23/doc/Kernel_23/CGAL/Filtered_predicate.h index bad95b0defaa..b809ff933f28 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Filtered_predicate.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Filtered_predicate.h @@ -21,7 +21,7 @@ we use the function objects `C2E` and `C2F`, which must be of the form \cgalHeading{Example} The following example defines an efficient and exact version of the -orientation predicate over three points using the Cartesian representation +orientation predicate over three points using the %Cartesian representation with double coordinates and without reference counting (`Simple_cartesian::Point_2`). Of course, the orientation predicate can already be found in the kernel, but diff --git a/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h b/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h index 6be2530b49b6..1b7099243c9e 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Kernel/global_functions.h @@ -753,7 +753,7 @@ const CGAL::Point_3& r); /// @{ /*! -Compares the Cartesian coordinates of points `p` and +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xy\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. This is the same function as `compare_xy` and exists for compatibility with `Point_d`. @@ -763,7 +763,7 @@ Comparison_result compare_lexicographically(const CGAL::Point_2& p, const CGAL::Point_2& q); /*! -Compares the Cartesian coordinates of points `p` and +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xyz\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared, and if both \f$ x\f$- and \f$ y\f$- coordinate are equal, @@ -1144,7 +1144,7 @@ global function are available. /// @{ /*! -Compares the Cartesian coordinates of points `p` and +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xy\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. @@ -1154,7 +1154,7 @@ Comparison_result compare_xy(const CGAL::Point_2& p, const CGAL::Point_2& q); /*! -Compares the Cartesian coordinates of points `p` and `q` +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xy\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. @@ -1177,7 +1177,7 @@ compare_xy(const CGAL::Point_3& p, const CGAL::Point_3& q); /// @{ /*! -Compares the \f$ x\f$ and \f$ y\f$ Cartesian coordinates of points `p` and +Compares the \f$ x\f$ and \f$ y\f$ %Cartesian coordinates of points `p` and `q` lexicographically. */ template @@ -1186,7 +1186,7 @@ Comparison_result const CGAL::Circular_arc_point_2 &q); /*! -Compares the \f$ x\f$ and \f$ y\f$ Cartesian coordinates of points `p` and +Compares the \f$ x\f$ and \f$ y\f$ %Cartesian coordinates of points `p` and `q` lexicographically. */ template @@ -1209,7 +1209,7 @@ compare_xy(const CGAL::Circular_arc_point_2 &p, /*! -Compares the \f$ x\f$ and \f$ y\f$ Cartesian coordinates of points `p` and +Compares the \f$ x\f$ and \f$ y\f$ %Cartesian coordinates of points `p` and `q` lexicographically. */ template @@ -1218,7 +1218,7 @@ Comparison_result const CGAL::Circular_arc_point_3 &q); /*! -Compares the \f$ x\f$ and \f$ y\f$ Cartesian coordinates of points `p` and +Compares the \f$ x\f$ and \f$ y\f$ %Cartesian coordinates of points `p` and `q` lexicographically. */ template @@ -1442,13 +1442,13 @@ global function are available. */ /// @{ /*! - compares Cartesian \f$ y\f$-coordinates of `p` and `q`. + compares %Cartesian \f$ y\f$-coordinates of `p` and `q`. */ template Comparison_result compare_y(const CGAL::Point_2 &p, const CGAL::Point_2 &q); /*! - compares Cartesian \f$ y\f$-coordinates of `p` and `q`. + compares %Cartesian \f$ y\f$-coordinates of `p` and `q`. */ template Comparison_result compare_y(const CGAL::Point_3 &p, @@ -1564,7 +1564,7 @@ global function are available. /// @{ /*! -Compares the Cartesian coordinates of points `p` and +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xyz\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared, and if both \f$ x\f$- and \f$ y\f$- coordinate are equal, @@ -1587,7 +1587,7 @@ compare_xyz(const CGAL::Point_3& p, const CGAL::Point_3& q); */ /// @{ -/*! Compares the Cartesian coordinates of points `p` and `q` lexicographically. +/*! Compares the %Cartesian coordinates of points `p` and `q` lexicographically. */ template Comparison_result @@ -1595,7 +1595,7 @@ compare_xyz(const CGAL::Circular_arc_point_3 &p, const CGAL::Circular_arc_point_3 &q); /*! -Compares the Cartesian coordinates of points `p` and `q` lexicographically. +Compares the %Cartesian coordinates of points `p` and `q` lexicographically. */ template Comparison_result @@ -1682,7 +1682,7 @@ compare_z(const CGAL::Circular_arc_point_3 &p, const CGAL::Poin /// @{ /*! -Compares the Cartesian coordinates of points `p` and +Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ yx\f$ order: first \f$ y\f$-coordinates are compared, if they are equal, \f$ x\f$-coordinates are compared. diff --git a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h index eaeab03a882a..df1aa0c913b8 100644 --- a/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h +++ b/Kernel_23/doc/Kernel_23/CGAL/Vector_2.h @@ -13,7 +13,7 @@ will explicitly state where you can pass this constant as an argument instead of a vector initialized with zeros. \cgalModels `Kernel::Vector_2` -\cgalModels `Hashable` if `Kernel` is a cartesian kernel and if `Kernel::FT` is `Hashable` +\cgalModels `Hashable` if `Kernel` is a %Cartesian kernel and if `Kernel::FT` is `Hashable` */ template< typename Kernel > @@ -25,7 +25,7 @@ class Vector_2 { /*! An iterator for enumerating the -Cartesian coordinates of a vector. +%Cartesian coordinates of a vector. */ typedef unspecified_type Cartesian_const_iterator; @@ -119,7 +119,7 @@ Kernel::FT y() const; /// \name Convenience Operators /// The following operations are for convenience and for compatibility -/// with higher dimensional vectors. Again they come in a Cartesian +/// with higher dimensional vectors. Again they come in a %Cartesian /// and homogeneous flavor. /// @{ @@ -131,7 +131,7 @@ returns the i'th homogeneous coordinate of `v`. Kernel::RT homogeneous(int i) const; /*! -returns the i'th Cartesian coordinate of `v`. +returns the i'th %Cartesian coordinate of `v`. \pre `0 <= i <= 1`. */ Kernel::FT cartesian(int i) const; @@ -143,13 +143,13 @@ returns `cartesian(i)`. Kernel::FT operator[](int i) const; /*! -returns an iterator to the Cartesian coordinates +returns an iterator to the %Cartesian coordinates of `v`, starting with the 0th coordinate. */ Cartesian_const_iterator cartesian_begin() const; /*! -returns an off the end iterator to the Cartesian +returns an off the end iterator to the %Cartesian coordinates of `v`. */ Cartesian_const_iterator cartesian_end() const; diff --git a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h index bdd0dff34731..7e4e66615233 100644 --- a/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h +++ b/Kernel_23/doc/Kernel_23/Concepts/FunctionObjectConcepts.h @@ -478,7 +478,7 @@ class BoundedSide_3 { \ingroup PkgKernel23ConceptsFunctionObjects \cgalConcept - A type representing an iterator to the Cartesian coordinates of a point + A type representing an iterator to the %Cartesian coordinates of a point in two dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} @@ -495,7 +495,7 @@ class CartesianConstIterator_2 { \ingroup PkgKernel23ConceptsFunctionObjects \cgalConcept - A type representing an iterator to the Cartesian coordinates of a point + A type representing an iterator to the %Cartesian coordinates of a point in three dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} @@ -1365,7 +1365,7 @@ class CompareXYZ_3 { /// @{ /*! - Compares the Cartesian coordinates of points `p` and + Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xyz\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. If they are equal, \f$ z\f$-coordinates are compared. @@ -1395,7 +1395,7 @@ class CompareXY_2 { /// @{ /*! - Compares the Cartesian coordinates of points `p` and + Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xy\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. @@ -1425,7 +1425,7 @@ class CompareXY_3 { /*! - Compares the Cartesian coordinates of points `p` and + Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ xy\f$ order: first \f$ x\f$-coordinates are compared, if they are equal, \f$ y\f$-coordinates are compared. @@ -1458,7 +1458,7 @@ class CompareX_2 { /// @{ /*! - compares the Cartesian \f$ x\f$-coordinates of points `p` and `q` + compares the %Cartesian \f$ x\f$-coordinates of points `p` and `q` */ Comparison_result operator()(const Kernel::Point_2&p, const Kernel::Point_2&q); @@ -1514,7 +1514,7 @@ class CompareX_3 { /// @{ /*! - Compares the Cartesian \f$ x\f$-coordinates of points `p` and + Compares the %Cartesian \f$ x\f$-coordinates of points `p` and `q` */ Comparison_result operator()(const Kernel::Point_3&p, @@ -1633,7 +1633,7 @@ class CompareYX_2 { /// @{ /*! - Compares the Cartesian coordinates of points `p` and + Compares the %Cartesian coordinates of points `p` and `q` lexicographically in \f$ yx\f$ order: first \f$ y\f$-coordinates are compared, if they are equal, \f$ x\f$-coordinates are compared. @@ -1666,7 +1666,7 @@ class CompareY_2 { /// @{ /*! - Compares the Cartesian \f$ y\f$-coordinates of points `p` and + Compares the %Cartesian \f$ y\f$-coordinates of points `p` and `q` */ Comparison_result operator()(const Kernel::Point_2&p, @@ -1725,7 +1725,7 @@ class CompareY_3 { /// @{ /*! - Compares the Cartesian \f$ y\f$-coordinates of points `p` and + Compares the %Cartesian \f$ y\f$-coordinates of points `p` and `q` */ Comparison_result operator()(const Kernel::Point_3&p, @@ -1752,7 +1752,7 @@ class CompareZ_3 { /// @{ /*! - Compares the Cartesian \f$ z\f$-coordinates of points `p` and + Compares the %Cartesian \f$ z\f$-coordinates of points `p` and `q` */ Comparison_result operator()(const Kernel::Point_3&p, @@ -3983,25 +3983,25 @@ class ConstructCartesianConstIterator_2 { /*! - returns an iterator on the 0'th Cartesian coordinate of `p`. + returns an iterator on the 0'th %Cartesian coordinate of `p`. */ Kernel::Cartesian_const_iterator_2 operator()(const Kernel::Point_2 &p); /*! - returns the past the end iterator of the Cartesian coordinates of `p`. + returns the past the end iterator of the %Cartesian coordinates of `p`. */ Kernel::Cartesian_const_iterator_2 operator()(const Kernel::Point_2 &p, int); /*! - returns an iterator on the 0'th Cartesian coordinate of `v`. + returns an iterator on the 0'th %Cartesian coordinate of `v`. */ Kernel::Cartesian_const_iterator_2 operator()(const Kernel::Vector_2 &v); /*! - returns the past the end iterator of the Cartesian coordinates of `v`. + returns the past the end iterator of the %Cartesian coordinates of `v`. */ Kernel::Cartesian_const_iterator_2 operator()(const Kernel::Vector_2 &v, int); @@ -4028,25 +4028,25 @@ class ConstructCartesianConstIterator_3 { /// @{ /*! - returns an iterator on the 0'th Cartesian coordinate of `p`. + returns an iterator on the 0'th %Cartesian coordinate of `p`. */ Kernel::Cartesian_const_iterator_3 operator()(const Kernel::Point_3 &p); /*! - returns the past the end iterator of the Cartesian coordinates of `p`. + returns the past the end iterator of the %Cartesian coordinates of `p`. */ Kernel::Cartesian_const_iterator_3 operator()(const Kernel::Point_3 &p, int); /*! - returns an iterator on the 0'th Cartesian coordinate of `v`. + returns an iterator on the 0'th %Cartesian coordinate of `v`. */ Kernel::Cartesian_const_iterator_3 operator()(const Kernel::Vector_3 &v); /*! - returns the past the end iterator of the Cartesian coordinates of `v`. + returns the past the end iterator of the %Cartesian coordinates of `v`. */ Kernel::Cartesian_const_iterator_3 operator()(const Kernel::Vector_3 &v, int); @@ -5992,7 +5992,7 @@ class ConstructPoint_2 { /// @{ /*! - introduces a variable with Cartesian coordinates + introduces a variable with %Cartesian coordinates \f$ (0,0)\f$. */ Kernel::Point_2 operator()(const CGAL::Origin &CGAL::ORIGIN); @@ -6033,7 +6033,7 @@ class ConstructPoint_3 { /// @{ /*! - introduces a point with Cartesian coordinates\f$ (0,0,0)\f$. + introduces a point with %Cartesian coordinates\f$ (0,0,0)\f$. */ Kernel::Point_3 operator()(const CGAL::Origin &CGAL::ORIGIN); @@ -7287,19 +7287,19 @@ class ConstructWeightedPoint_2 /// @{ /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates \f$ (0,0)\f$ and weight \f$ 0 \f$. */ Kernel::Weighted_point_2 operator()(const CGAL::Origin &CGAL::ORIGIN); /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates those of \f$ p \f$ and weight \f$ 0 \f$. */ Kernel::Weighted_point_2 operator()(const Kernel::Point_2& p); /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates those of \f$ p \f$ and weight \f$ w \f$. */ Kernel::Weighted_point_2 operator()(const Kernel::Point_2& p, const Kernel::FT& w); @@ -7325,19 +7325,19 @@ class ConstructWeightedPoint_3 /// @{ /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates \f$ (0,0,0)\f$ and weight \f$ 0 \f$. */ Kernel::Weighted_point_3 operator()(const CGAL::Origin &CGAL::ORIGIN); /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates those of \f$ p \f$ and weight \f$ 0 \f$. */ Kernel::Weighted_point_3 operator()(const Kernel::Point_3& p); /*! - introduces a weighted point with Cartesian coordinates + introduces a weighted point with %Cartesian coordinates those of \f$ p \f$ and weight \f$ w \f$. */ Kernel::Weighted_point_3 operator()(const Kernel::Point_3& p, const Kernel::FT& w); @@ -7590,8 +7590,8 @@ class EqualXY_3 { /*! - returns true iff `p` and `q` have the same Cartesian \f$ x\f$-coordinate - and the same Cartesian \f$ y\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ x\f$-coordinate + and the same %Cartesian \f$ y\f$-coordinate. */ bool operator()(const Kernel::Point_3&p, const Kernel::Point_3&q); @@ -7617,7 +7617,7 @@ class EqualX_2 { /// @{ /*! - returns true iff `p` and `q` have the same Cartesian \f$ x\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ x\f$-coordinate. */ bool operator()(const Kernel::Point_2&p, const Kernel::Point_2&q); @@ -7643,7 +7643,7 @@ class EqualX_3 { /// @{ /*! - returns true iff `p` and `q` have the same Cartesian \f$ x\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ x\f$-coordinate. */ bool operator()(const Kernel::Point_3&p, const Kernel::Point_3&q); @@ -7669,7 +7669,7 @@ class EqualY_2 { /// @{ /*! - returns true iff `p` and `q` have the same Cartesian \f$ y\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ y\f$-coordinate. */ bool operator()(const Kernel::Point_2&p, const Kernel::Point_2&q); @@ -7695,7 +7695,7 @@ class EqualY_3 { /// @{ /*! - returns true iff `p` and `q` have the same Cartesian \f$ y\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ y\f$-coordinate. */ bool operator()(const Kernel::Point_3&p, const Kernel::Point_3&q); @@ -7721,7 +7721,7 @@ class EqualZ_3 { /// @{ /*! - returns true iff `p` and `q` have the same Cartesian \f$ z\f$-coordinate. + returns true iff `p` and `q` have the same %Cartesian \f$ z\f$-coordinate. */ bool operator()(const Kernel::Point_3&p, const Kernel::Point_3&q); diff --git a/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h b/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h index 4fcacb5b5841..ce91a8107dd0 100644 --- a/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h +++ b/Kernel_d/doc/Kernel_d/CGAL/Epeck_d.h @@ -79,9 +79,9 @@ Point_d(ForwardIterator first, ForwardIterator end); \pre `i` is non-negative and less than the dimension. */ double operator[](int i)const; -/*! returns an iterator pointing to the zeroth Cartesian coordinate. */ +/*! returns an iterator pointing to the zeroth %Cartesian coordinate. */ Cartesian_const_iterator_d cartesian_begin()const; -/*! returns an iterator pointing beyond the last Cartesian coordinate. */ +/*! returns an iterator pointing beyond the last %Cartesian coordinate. */ Cartesian_const_iterator_d cartesian_end()const; }; diff --git a/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h b/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h index c951a0735efc..b42e7d362031 100644 --- a/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h +++ b/Kernel_d/doc/Kernel_d/Concepts/Kernel--CartesianConstIterator_d.h @@ -3,7 +3,7 @@ \ingroup PkgKernelDKernelConcept \cgalConcept -A type representing an iterator to the Cartesian coordinates of a point +A type representing an iterator to the %Cartesian coordinates of a point in `d` dimensions. \cgalRefines{CopyConstructible,Assignable,DefaultConstructible} @@ -18,4 +18,3 @@ class Kernel_d::CartesianConstIterator_d { public: }; /* end Kernel_d::CartesianConstIterator_d */ - diff --git a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h index 8d5e82f7fed8..7fa1febc458d 100644 --- a/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h +++ b/Nef_2/doc/Nef_2/Concepts/ExtendedKernelTraits_2.h @@ -8,7 +8,7 @@ geometry\cgalFootnote{It is called extended geometry for simplicity, though it is not a real geometry in the classical sense}. Let `K` be an instance of the data type `ExtendedKernelTraits_2`. The central notion of extended geometry are extended points. An extended point -represents either a standard affine point of the Cartesian plane or a +represents either a standard affine point of the %Cartesian plane or a non-standard point representing the equivalence class of rays where two rays are equivalent if one is contained in the other. @@ -353,4 +353,3 @@ const char* output_identifier() ; /// @} }; /* end ExtendedKernelTraits_2 */ - diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h index 61575e3ff892..df2bd3fe0e2a 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPDistanceTraits.h @@ -19,7 +19,7 @@ class PMPDistanceTraits{ /*! 3D point type * It must be default constructible, and can be constructed from 3 objects of type `FT`. * `bool operator<(Point_3, Point_3)` to lexicographically compare two points must be available. - * Access to Cartesian coordinates must be possible using `Point_3::x()`, `Point_3::y(), Point_3::z()` and + * Access to %Cartesian coordinates must be possible using `Point_3::x()`, `Point_3::y(), Point_3::z()` and * `FT operator[](int i)` with `0 <= i < 3`. * * There must be a specialization of `CGAL::Kernel_traits` such that diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--IsZeroAt.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--IsZeroAt.h index 3f778a6fc9eb..1369e95f5182 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--IsZeroAt.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--IsZeroAt.h @@ -4,7 +4,7 @@ \cgalConcept This `AdaptableFunctor` returns whether a -`PolynomialTraits_d::Polynomial_d` \f$ p\f$ is zero at a given Cartesian point, +`PolynomialTraits_d::Polynomial_d` \f$ p\f$ is zero at a given %Cartesian point, which is represented as an iterator range. \cgalRefines{AdaptableFunctor,CopyConstructible,DefaultConstructible} @@ -32,7 +32,7 @@ typedef bool result_type; /*! -Computes whether \f$ p\f$ is zero at the Cartesian point given by the iterator range, +Computes whether \f$ p\f$ is zero at the %Cartesian point given by the iterator range, where `begin` is referring to the innermost variable. \pre (end-begin == `PolynomialTraits_d::d`) @@ -47,4 +47,3 @@ InputIterator end ); /// @} }; /* end PolynomialTraits_d::IsZeroAt */ - diff --git a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SignAt.h b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SignAt.h index 89dc6556dadc..d1645dd00e29 100644 --- a/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SignAt.h +++ b/Polynomial/doc/Polynomial/Concepts/PolynomialTraits_d--SignAt.h @@ -4,7 +4,7 @@ \cgalConcept This `AdaptableFunctor` returns the sign of a -`PolynomialTraits_d::Polynomial_d` \f$ p\f$ at given Cartesian point represented +`PolynomialTraits_d::Polynomial_d` \f$ p\f$ at given %Cartesian point represented as an iterator range. This functor is well defined if `PolynomialTraits_d::Innermost_coefficient_type` is @@ -35,7 +35,7 @@ typedef CGAL::Sign result_type; /*! -Returns the sign of \f$ p\f$ at the given Cartesian point, where `begin` is referring +Returns the sign of \f$ p\f$ at the given %Cartesian point, where `begin` is referring to the innermost variable. \pre (`end-begin` == `PolynomialTraits_d::d`) \pre `std::iterator_traits< InputIterator >::%value_type` is `ExplicitInteroperable` with `PolynomialTraits_d::Innermost_coefficient_type`. @@ -49,4 +49,3 @@ InputIterator end ); /// @} }; /* end PolynomialTraits_d::SignAt */ - diff --git a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h index 5441f324e943..a4f915567b47 100644 --- a/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h +++ b/Shape_detection/doc/Shape_detection/Concepts/EfficientRANSACTraits.h @@ -39,7 +39,7 @@ class EfficientRANSACTraits{ /// The 2D vector type, only required if you want to detect tori typedef unspecified_type Vector_2; - /// The number type of the Cartesian coordinates of types Point_3 + /// The number type of the %Cartesian coordinates of types Point_3 typedef unspecified_type FT; /// A model of the concept `Range` with random access iterators, providing input points and normals @@ -63,9 +63,9 @@ class EfficientRANSACTraits{ /*! * Function object type that provides * `Point_3 operator()(Origin p)` - * returning the point with 0, 0, 0 as Cartesian coordinates + * returning the point with 0, 0, 0 as %Cartesian coordinates * and `Point_3 operator()(FT x, FT y, FT z)` - * returning the point with `x`, `y` and `z` as Cartesian coordinates. + * returning the point with `x`, `y` and `z` as %Cartesian coordinates. */ typedef unspecified_type Construct_point_3; @@ -106,7 +106,7 @@ class EfficientRANSACTraits{ /*! * Function object type that provides * `Point_2 operator()(FT x, FT y)` - * returning the 2D point with `x` and `y` as Cartesian coordinates. + * returning the 2D point with `x` and `y` as %Cartesian coordinates. * Only required if you want to detect tori. */ typedef unspecified_type Construct_point_2; diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h index dac7c110cb01..b9ee673a03ec 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Fuzzy_sphere.h @@ -76,7 +76,7 @@ less than \f$ r\f$. bool contains(const Point_d& p) const; /*! -Test whether the fuzzy sphere contains the point whose Cartesian coordinates +Test whether the fuzzy sphere contains the point whose %Cartesian coordinates are contained in the range [`begin`, `end`). */ template diff --git a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h index a8aa2640a2c3..12ebb30eb80b 100644 --- a/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h +++ b/Spatial_searching/doc/Spatial_searching/Concepts/FuzzyQueryItem.h @@ -43,7 +43,7 @@ bool contains(Point_d p) const; /*! \note Optional: must be defined when used with a `Kd_tree` where `EnablePointsCache` is set to `Tag_true`. -tests whether the query item contains the point whose Cartesian coordinates +tests whether the query item contains the point whose %Cartesian coordinates are contained in the range [`begin`, `end`). */ template diff --git a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/RawPoint_3.h b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/RawPoint_3.h index 41b10daa4a71..32925160334d 100644 --- a/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/RawPoint_3.h +++ b/Surface_mesh_deformation/doc/Surface_mesh_deformation/Concepts/RawPoint_3.h @@ -9,7 +9,7 @@ class RawPoint_3 public: /// \name Creation /// @{ - /// constructor from Cartesian coordinates + /// constructor from %Cartesian coordinates RawPoint_3(double x, double y, double z); /// @} diff --git a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h index 824b21454e51..c5713628db93 100644 --- a/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h +++ b/Surface_mesh_skeletonization/doc/Surface_mesh_skeletonization/Concepts/MeanCurvatureSkeletonizationTraits.h @@ -28,7 +28,7 @@ typedef unspecified_type FT; /*! * Function object type that provides * `Point_3 operator()(FT x, FT y, FT z) const` - * returning the point with `x`, `y` and `z` as Cartesian coordinates. + * returning the point with `x`, `y` and `z` as %Cartesian coordinates. */ typedef unspecified_type Construct_point_3; @@ -186,4 +186,3 @@ compute_z_3_object(); /// @} }; /* end DelaunayTriangulationTraits_2 */ - From c11711e728689171c40bc18fd7f8abb7e3e84add Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 22 Aug 2023 10:29:04 +0100 Subject: [PATCH 0653/1398] More fixes --- .../doc/Algebraic_foundations/Concepts/RingNumberType.h | 3 +-- Nef_3/doc/Nef_3/Nef_3.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h index a2b6c5036f02..fc53fb1f4ebf 100644 --- a/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h +++ b/Algebraic_foundations/doc/Algebraic_foundations/Concepts/RingNumberType.h @@ -6,7 +6,7 @@ The concept `RingNumberType` combines the requirements of the concepts `IntegralDomainWithoutDivision` and `RealEmbeddable`. A model of `RingNumberType` can be used as a template parameter -for Homogeneous kernels. +for homogeneous kernels. \cgalRefines{IntegralDomainWithoutDivision,RealEmbeddable} @@ -32,4 +32,3 @@ class RingNumberType { public: }; /* end RingNumberType */ - diff --git a/Nef_3/doc/Nef_3/Nef_3.txt b/Nef_3/doc/Nef_3/Nef_3.txt index 60e98f188640..bd7de74fd27c 100644 --- a/Nef_3/doc/Nef_3/Nef_3.txt +++ b/Nef_3/doc/Nef_3/Nef_3.txt @@ -448,7 +448,7 @@ We recommend the use of the \cgal kernels `Homogeneous`, The homogeneous kernel provides reliable fast performance. In combination with `leda_integer` it is the fastest kernel for `Nef_polyhedron_3`. The `Exact_predicates_exact_constructions_kernel` uses filtering. In non-degenerate -scenarios it's faster than the Homogeneous kernel. The most +scenarios it's faster than the homogeneous kernel. The most important advantage of the filtered kernel is that it is a %Cartesian kernel, which allows the proper handling of OFF files using floating-point coordinates. From 7f1d36c5142fa27f58d20cc81e77b2d2474c9c9d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 22 Aug 2023 10:34:51 +0100 Subject: [PATCH 0654/1398] More fixes --- .../doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index cea994341a9d..b4bff8ed2db1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -117,8 +117,8 @@ special type of objects. They must, however, supply the relevant traits class, which mainly involves algebraic computations. A traits class also encapsulates the number types used to represent coordinates of geometric objects and to carry out algebraic operations on them. It -encapsulates the type of coordinate system used (e.g., Cartesian and -Homogeneous), and the geometric or algebraic computation methods +encapsulates the type of coordinate system used (e.g., %Cartesian and +homogeneous), and the geometric or algebraic computation methods themselves. The precise minimal sets of requirements the actual traits classes must conform to are organized as a hierarchy of concepts; see Section \ref aos_sec-geom_traits. From 4187e40c2551780dbe3823b5db36fc38ba5d97db Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Wed, 23 Aug 2023 15:56:58 +0200 Subject: [PATCH 0655/1398] (WIP) documentation update --- .../Polygon_mesh_processing.txt | 36 +++++++++++++----- .../fig/bimba-dmax0.040000-0.000000.jpg | Bin 0 -> 140843 bytes .../fig/bimba-dmin0.040000-0.000000.jpg | Bin 0 -> 167482 bytes .../fig/bimba-gaussian0.040000-0.000000.jpg | Bin 0 -> 48609 bytes .../fig/bimba-mean0.020000-0.000000.jpg | Bin 0 -> 53722 bytes .../fig/bimba-mean0.020000-0.002000.jpg | Bin 0 -> 78071 bytes .../fig/bimba-mean0.030000-0.000000.jpg | Bin 0 -> 51750 bytes .../fig/bimba-mean0.030000-0.002000.jpg | Bin 0 -> 75293 bytes .../fig/bimba-mean0.040000-0.000000.jpg | Bin 0 -> 50398 bytes .../fig/bimba-mean0.040000-0.002000.jpg | Bin 0 -> 73835 bytes .../fig/bimba-mean0.050000-0.000000.jpg | Bin 0 -> 49763 bytes .../fig/bimba-mean0.050000-0.002000.jpg | Bin 0 -> 72992 bytes 12 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-dmax0.040000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-dmin0.040000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-gaussian0.040000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.020000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.020000-0.002000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.002000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.040000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.040000-0.002000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.000000.jpg create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.002000.jpg diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 6b6f979ba59f..9baee74449b5 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -969,20 +969,38 @@ Similarly, we can use the following functions to compute curvatures on a specifi **To be updated** -\cgalFigureRef{icc_diff_radius} shows how the mean curvature changes depending on -the named parameter `ball_radius`, which can be set to a value > 0 to get a smoother -distribution of values and "diffuses" the extreme values of curvatures across the mesh. +First, \cgalFigureRef{icc_measures} first illustrates various curvature measure on a triangular mesh. -\cgalFigureAnchor{icc_diff_radius} +\cgalFigureAnchor{icc_measures}
        - + + + +
        -\cgalFigureCaptionBegin{icc_diff_radius} -The mean curvature on a mesh with different values for the ball radius -parameter: (a) R = 0, (b) R = 0.025, (c) R = 0.05, (d) R = 0.16. Note that the max -edge length is 0.031 and the size of the bounding box of the mesh is 1 x .7 x .8. +\cgalFigureCaptionBegin{icc_measures} +Mean curvature, Gaussian curvature, minimal principal curvature direction and minimal principal curvature direction on a mesh (ball radius set to 0.04). \cgalFigureCaptionEnd +\cgalFigureAnchor{icc_various_ball_radii} +
        + + + +
        + + + + +
        +\cgalFigureCaptionBegin{icc_various_ball_radii} +When changing the integration ball radius, we obtain a scale space of curvature measure that can be used to tackle possible noise in the input as illustrated in the second row (mean curvature only with fixed colormap ranges and ball radii in {0.02,0.03,0.04,0.05}). +\cgalFigureCaptionEnd + + + + + \ref BGLPropertyMaps are used to record the computed curvatures as shown in examples. In the following examples, for each property map, we associate a curvature value to each vertex. diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-dmax0.040000-0.000000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-dmax0.040000-0.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a878efff69fcd973fc96180c5bde195b7736486 GIT binary patch literal 140843 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�IPIg4fx`?Gqtl&gFA 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

        {sYyCzV&4_(M(Umr#!n5s`wnph{G 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

        p4%RkLT}k0`nQ{ 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

        u* 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 M_y42q{BPy|10gqObpQYW literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-gaussian0.040000-0.000000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-gaussian0.040000-0.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cde52f1122656974259b90793a511aa67c278c4b GIT binary patch literal 48609 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 z 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 )$4h=I2S_u$GLJ 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

        ~tCZ)>5QIRj&xFBV%F}wu^^%iBEo&@yF zc$So1#qM{6{$TBUCQOVh#Pi61lg{dco%4V}4Ot73AAEvuv{dw}MOi6&CLILJ_Qj3K zTX@m^^5%bM>i^x3Use=d|MY&I=)R8_^b@#dDL=m^l9{kA`t9!=7Pf?kNi1ys*URPQ zk!juI-^KAj#qf6y`!j(70Mrse*dj4mU^i+qOeNa0^YW*A0CjUe^a zX?S$WDk?v3Hg{sNmq~U-_+VM>?XX!_mmkye(5uDEC}^7iLUfXCCBkzM+&%7Q_>A_6 zM3}LQ8dt*s&kB=Cy7e&ZJo5b#>`AhmK<=JNGqE;gr}X=M{`292aUpG$wg`0d<~K?7e#E;NU(=EAL0;Gs7WC z#mJ7#Xxq7b^GPmts54)Bnm?aAWsTT+*eSgu1U$pC1{v~~2Y+P3*rHwiK@}c*3cY$&c=cQ-Yd60QP5Dd({$?=Cp?&uVrRlUU8$E z!;WQ4u6}Jpn_(-tO)_rVF z#^$fc1cf3hC0ly8r5N~#=z+CyQp)VMaWA~0Fn-mi?nd)G>rU~nX)z840;kwyBY0@R zb#eF1p*PS~Jnq!B{6SCfJ0CwQcgCHV4gkyu(VVpqyL%N7Ly6(2_y0tvApd`t@c;c^ zH+p@l|5Oq9_;Ze(rCrZd{5)=r2N~9jSCqpaYD~vwos5^qM6I>$zq#gYy1=@ds`fMm zr$pPHY(#sG`Z3vr$2TT_&4*6qoF_&pMO=?F>FWZvafuC)b zQtylFtDd-^F}SoK%}p8K3ZTfG@$mZvXR+}wDJ8N_tr}vyIoCGgy9Y@nuQ2Ya2#+5LI4mA21A(~7P+<5p2W&op*WQtv}KuHbgBCOKfOWcsvP4Ua{-N4)p~oT zkV1oiT`v;&d316eh_Q4qD>T>4x&q_889hQa5%tt4SoRg6l$fpJT~^FAqY{i>Q-&2i z#_nVQMB!0w^8F9tR2Mk~8trH{E-4phO;-tj3|sW?`(WB)U^kjCz)%i8^S2qEM{V(I~CzDbvGW|2|y z+u7EYg>ohUdgsOF>66jX4;=4H{%ln+v>dj$mo#Mlre<_SJjDXzmv@za^4N3%wysi$ zzi+DL>Y4rihjA22<)T4A_hADem$1`$E9*e%jA~n3tV_QzT6z{HT{fg^($ElV_5N?Y zZ25fffvbsfI}A@Ry+nhr)5z=b(r?bD*TeEJPZK&z#A*X7om0Oy0-?%mSnp?0xr7sj zmka_HCMMe2yuCFub$)k1OzwRw(V%Lv>VYDfVy=1D)3vCx$lJzuTiUkB(WN*lkTzC1 zMSp6=7O3|@&;2~z>&SXi`8Un}6mQ`2xvXdDm|=naGbQSyFvZ4jb%*%0DqEc2F8>&( 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 z≧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 bQ)2ohE#`kJOaC??{JTB<=Tav27xBLU4;%j; literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.000000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e19a87475ab6c387e9632b005d94492617a22a3e GIT binary patch literal 51750 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 literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.002000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.030000-0.002000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a54258caef14f705cf10977646e8bb94034d32ca GIT binary patch literal 75293 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 literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.040000-0.000000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.040000-0.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e0d19d1fcd3aa04701ac55f670dc470804645c1 GIT binary patch literal 50398 zcmbrlcT|&0-!6>XZ2=JkK{{-uClu)&9+6@a5+o2xfFNB!dhdHHMfxW6E+io&p-Atr zl_tFgkSZNQZ&IWjp7&eptoM)StaHwHCRtgN%)Ng1tjt`$x#pVdzMj1PLG=i%1=6Cr zb?X+@tD6_q^)%H>s{42E-n)C}{=IwmsHyMM&@w%weei&mjqx!(6Bj!VHy1l6=O27x zf`2>{;pOBMk`oqrE+H)~%_FFwA}^^dCM7NT?;y9Rsi|on(6T;!$SV1i^Qq+jb-DhB zisAn6a=#VazV(diH-=lc8E##-Q*lyJ{dW7Nx3{SNXSsdrx8LvFy?6hnRp$}aZ#Um= z-@SeJ_nUI(w|i8#e!I=^JL6M{J1_L^K7MBD{+DE8K9f4U{LAn?W?m~PkA=OL`tK|F z&;?(g@Jq{B%Z_MxdVNS*+`oy&_V4@Ll>d1rs((lO{mxAjFT;N|+`dKiU!D2)CAS!U zyUi%^^zjS5-=9gsEw87jXm6T-W4O&grAGDZ^uGo9Z`E5MM3`+#v#S$-V89V@4rW*- zc}5Jg@$6R|9#pfwV2|dGTke9~jBfRj7YAC@2?hs;h z2QV?7&3KR%ns4QD$2O-Iq^UKvQPzjSdnFU0)45I|hO9eAcFacL?Cne%!|&Z@=_9XO zUUkaN^|al3H16>FJ$d-UVb5P`bO>yK=JbIKjf2XNiSLHvqtF2SHPv$34$MSLR6o0# zvU7z!F-cj%0R1(;rx^(zJ%ztci^t+t_*yl<1VpnSY*tcjh9fqWw5m5+*<>uqNi^`R z2=h4fufB)@BuK%sM=Sy%A+~S3-yNmBz*(h|zH|d&yTyF1>gJAMf38<{7YZr85}xnV zlJ2tKRo#(Z6F|r2Zoi$c6BOzaafJHM?QXiYl>BM8OB4+JQW|G+aZNQ;(J=}eZBm|_ zSDX7Hnftqzd$vJ7zfg0guSVE^`=|e3sv6jQ7GWhm{xNS?`&4dSqhF!T@4E}Z#a1(L z5A+K2)lhvyQbUXJHI>WmeA=(EOrXeIX0gb$i%{H@%|fbsX= z87E6(Qr;pydejm${ULC>5<8tI*v?j5@p+1q-h1L8pkg+S5rN?+wqSbz5X6o^#6c@z zVA0H050=V|SM^p9hhaAfeN*!Z9TQ2#%QG5SqI|DL4UaYhwYI2)Hv~) zieTuG2Kmlr`!TsGUaeoP=w$FzvGvmHM6%?C}6;39^zwB(r)z{vy@d z$pb3}bnc;j=84BYM8w)aWK(9eqhq&N@Nqkrt&pDcOS|*z%w9*yXG=nqt-;1mNu6=1r2!1$Me@$hQRQS=T zzd;TaOrH7Q4rg}{oVCsBCy?q}Ah;rBSs ziJ-ZS~fTqE#8YC9<%7)f#nW2QU+?I=tcP1#z|M4zE1id zOyl+A$TX5kn<@-VwM(i8!LIRKA2x=0bD$f=MbbTkK+rH6~8<=@vQds?c#E7_%@r@Kl8E!5w8Wc805L9N%c# z!Z2T6Uvcl%#E?9l(&LY9FxJeRWkOZy$=RWjghOs%<+(w-7*YICY2$v*D-XVIBc7M^ z*foFgMlO@2vn#GytsKbNcP@UjwbOmnWn=377RK@uQhF77jB~t)2(^{c^L;G4N=t3k6bD++U((A)lk?^#R!qy}l_s z;RD#|=Jp=aYN=bxO;^ zQX6&8>NkG{OmV79>LI*ZMoj~6vTGoRHNOx+voN#4DdVunUD@SU5#c1+U#pru5ynrpEPd%;7h&MZc(Z%&qC{KaVxOMpkYRlcFcd#<^?uf* z|GUF-M26GLY|BRAyyjLZ|7(Ki(J=?7vUM?bzVO4b+Tm@IxVkvp)Gp-1Vm?npbFV@v zGF4;#;8DKb!CBf4&PAiX1`H3Hl40BkZa**RNuHQ{$yh6kT(POvC5Zyn9~N{tYWB$f zD}klsaAFZ*D`?B1Db5#dN$SM%LYu7%4tcuLJY(|&r86&DUnc4~3C}6Z{?jwtwC`-i zY|tBWo7OQ!vAkKJgg?;Y+b+C}oe2YG!qB)G#=a>=A83X*9LUozq*1rk^|F{UM5B?N zXU{HETlGiZ$kRVqsPR+2%blE>G4?p^%AQbe#Vg+GYEDfq;SY7oE7fM+zC%lkd-+hk zM(s&XW304UX6Vd#;(W%^{)J$TIl-qxJ(vFe?2O-*nh8Y%=1=j9$y-R(qZchBzQR4T0$TLUO_$@*@>54#e{VA*nTfC4Uy!Rrsprjq2J7mn@*6SZ z1K+kba?uHhR~((*dw_`w2O-)4F)g`0gJ^R#535lS9z&)#_~|WTSHf8>-c1o;ro418 z_p+5R17{1>gGGCk3miTA*N=s@?fSB{V=VXTki@Da7g5{zGV8>sMeog7VPCfmmh)_y zof^ej??^nHRM~r9v%B{@txD$UJ(e#9i%0f`Iq#}=<(Qd$N2ZR;x7@kPyB7J1-W2J5 z8G&4YPN&QR0!{K1w~jf~tL^)X%KEP&@n1XYdVGAQuI!xPjlihar=%soqGR)#^wE(i z|GK$P1XBn#*$G#6mW@nKBERh$fhtL*#2*rm_P3pxw)N>{8%W}xuBq0%oVsKbY-0}U zm-q?Nl!4gF7t=(F)xqYVHwFJO+~SmQCi~1k^>Y#`b_L#{U$T%E5v(9N5{ucZX=WSf z!o*JzC(tpwjP7f}bO!Q~p3w*gnAZx6-?wI$1Gjxpb%>q+5Ip|966&Y*_dRa4L`C92 zmQM*xIS+Alk>C*7KHLFE2=&9n@w|)1@62Hw@o}$eXZw-vW`mYrPs4RobTnUoEYtLJm@?>SDr)Gb#fS$p12?W;WJ2vKz z3Zg3HSgRf_r%57pViVWzm-!Fh^|^@JnMn6_A_-Eib;0^|`@9OnykbgKR(ebx|3$7KG@l%$Ltr#;Bw5dE6H-kU5z?wsAx~ z#o&^3bTpjVE3-e4c2>?Vtt)3_UxiE-kT2xgGmk`fjjXcJVGGM02^Jl42$mZYd9YX!$ug*}4gPoIG#XZ~RV$ zR`mYse5gMD&f88UJ{2t$x~651jlRW6-5R$h&EHE`?xm3(TZ;DlkQKk!Q?>b7QrFJ~ z89PS*dE;p0puqoDtYX;@#pX9c+$E8CJpv_MBnGP18Y|Xg>vG%d$L$*`hgCz?OeQdj!LwkA?iy2pmY42zipts#X8Rj0qy<@s!LVRf0}TI5W^u+- z`yQtgh3{92o};RQl}%D?zFJ3umsvr1>u&C|$(`^pzwP1>cwXTdn~ZH}=Jo zF8ho(f&bL0V%8TO)rT_&d5DVDjS4XsVHLn=%qhX?=rPSB9M;e3n|v!}tB$dPQ@OQg|^J915xINf=8=F+T2zo>gV4v!4bR5G}x0?x0rmhV1>nmZs8N6GzwGrd; zTuB;Uv)Q)x#ot&Ai5%DE7bE)!;Ll=Vpo`dWgq(Oguzz>=VM!RAh9)uxd%X# zl*A))R7~QP>AB_!!waB}AV7;rVAX6(?_-gr z#c3Nno)2ViKtvWtWnkGG&9n6q%s(h_2RU!z7z5@`tQR+Eb~N-Q9+{#H1%iaNkcF+% z{(j@x{_|t&Km3w#{IG(ntY9Dc<1_CO8Gv!Daz$N3RXxZhs+v6BdG!;R1QZ@kEfu@e z8!T=$U9)CPO2}M?fU)MWr&qwRFNiQer>@E|#K|-?1MGJpW1AUUwmx8}!byJ9*pM3d zuI+K#=Skcp64bjd%G1|`V@JC>WePP7RnBtmiscR}L~U&?`CAh0Eg}NcGP*inmqdh; z@j?)1!!_cfnNOu84}j<)4eVmzEHg)%4p;| z^JUW8^l_(qO6ZTy_b~@9D4v4Efu$zPB}xO6%{cqb@F{Js2cX*2bLbw+5lKiFjBB=! zMat#CoI*S|ta`3}$iwh^86nablIgVWGp%oEhdj0AKhF{IOxg6i$9QGi#;edcjuV98 ziQj(}W{fGb*zNa5xD$rTM5@Y#wJs{f!>^p?zn$b~Qc?Z!zeo0Mo=5Es(kb$?cvXk3 zc=;Kq%QY2)V$>-r@yKH5YH@)D?kF)EE*mbWw^6a`5-!7x@2ggHe57ak44{iXu?r|U z{5Hti%=|4CFvrXltaCu<4(d=Ss+vAh*u*7bOq80tlPW5JY=xyc-)3$B8z1WLkW*Je zm{*O`5woDyCNceY94%j171YGA`cL|%nZ4i0(xA1(RI5%;1OgZ={9`@W4G76amSfDxE#ZxkWZK`teHm-k<5xpo z9zOQ!jwzmah#+DB2bDi0}1D{F*EI2t+2NfQpI-eH_CD`EqUTN8#^WkB2?5 zSHf+x`OXVxP;o80IM$M#&Q1waz6czUgWdCsp~=y=V+TzC8zL$>8|hG4*6yw_M$kO9 zsy?)T9Iky$MJ+h4d!TK>Ga)wZ*~&ZQ#zwFNh&ke}J|1>CRUYgcMWUT30sQXea}|#L z<`T?qJKRE>Jl{MT*w`%8gLM2apkg~E<0E5OUnS!imS9kWQ+xHR#ggH{!lnB6W%HIJ zt{o3qt=ze$dRdl2UuHy<0hnERnu;YF8*6XC_X7xl}o z58$2m@ePBwxmCmU+`Vx*!1Xlo`I!-*kZoYySv!_uh~uci(-l$3`7esgQ5zZDjE+7r zCa4qXSmuqFY>=~l zu&2+U%W>V7DPHJlN~Nrj-!>mfDk83_uBqZ4Z5Xa!*^YI+0E^pw^o(Bh%mJj0(^l+a zPHZmqyd|p1>(PqnpzZaih_tz|=0tDlvy0C3nuA8*$1+ZpdvLQFa}(z$TZ`8F7H>=5 zwr+H3uC0R06BytK$NKI$=xl}r^Nq0A^ZyBZY3+u1t;Zxo@bl=#cZbZp3EKj40#A|~ zKdOjhtykyuMV+|iqR5>~PYqG*ZfLhi-D4F27A{koagbf)LLiqa!}oWB58X+~$yjwV z7}Cb0d7h&KyPFf(&4(YKk`%H1>P{n1;yW0-pg*FRvVGifSc%#1brqN5GUIa?7{xK2 zDN&dBD%H$o&$dG#d0)h}EEnJ{jNp^1siR>I{2pXzZ7=XLvoO;)uRzIdX*4KJ3iA)q zrmJcW{lOwhVKtZaz#V|{wb1fT>8EhPJ`P6~UQ@NFUWDo4=X8G=u3kpHjo}pIkJyn= zSZsPs_E)v{8;rxzoci9|cjeI+)y`?g=DmbS^+?848d@i}7Um`PG#r|tly5X_?cu9P zUWth%_a2sp1Rm$Tr4b84y0Rq}c89nnF|2Boc9sHwPcfH=FJ{va*K(v6@zWr3dxi zFktOhd=VAhK5TnLz1+(Xgu(Ckz1K2Klh3909 zL~`bB)#sktP#7#RSj_(&{W%t4ykJE!ajfQ0FZ46niDzNxEH)JIS`fb@EML9WH@Cwk!KjLTlHmdoZ|MB6@ne(lfY;&$! z5z>cfoTbJ&bmd%Xb|{$eO$Q~Grc(DJ<8Qe2Z#f9PBJ7TH7?V-DdbV)qaP%vF`OX1Y z$4mX5Di+1@VWo;v82&4{!7P5&{56Sb;BfU_aB@nAq9M7PPtWM}UWt*uDEE)|lCM*; zkWroWI3?M$5pn%VS-wZNW|HaILP%NN095M)Z(j1`G`J+ws zKO|8YhU)1+E(6x70M}Rj;(WtzM>{=q=Q_03j0ym2f{hI9#x4FTot-JJO&h<=XeWD` z$<(I)Z{wwpVtib?ft8IG)a;`%*;#s~qB5d1&#_I9AVc(`+_#LP5pl4mnYrv@du<(? z;tDdg1xiQH$3Bl)gTsYJ@mv^Yn|G~n7Z$dI)~{DD&=%nradaSH&EEv8XD!Tb%<#xS z&dTuNZ(VP2>I34Et}gZ{guR##N?ZJ~Q4^_fc$gNvYG4@F%o_VpZ0!zAd8+U7SaIhO zi32QrV6W1Ib_=P|PP#nSalYHie$heOR#h&Y^&J{w|Eg_TzZ*s)e4e(;JNC-> zjSUgoq!i^`>jObD|8CVeT)E3Qyi2i6O*M-jTg2aEsZ`!&>gb9r#AZ{PpWbP_rh1tM z%dWd5E;4=QRAmexd+xP;r(7gF{k}6WzBEbLhus`>w{=fF*oFFgXZxo%?W5M|@qtM7E8D35#Nw?91AUz`Kng z@Ay>df*y})x9Z+_8ZV0@N0hjq?uq1ryTm{Ha`&VQ=1hPGHyx@)#UZpjG0=J()@SU% zxR3jpXitf7r_mfF)YGi~==hkVwDRHjE!GL-6@pilOooGD->gc+1)OtScCD_2eic+? z!&{t{`w||fKCGMT^f%f?Rs6hlTu$d3>y@x-lkEw7*ibzgol>v8YE|1aJR;PP1eKn0 zn3X=(X;UD7=%)^Z*fE`k%Za4uCZUiw~2YLlfR1R&3)%y+@{z(P=Um%=Lm$6-Yn}!Z# zgWSAP25>F*#(Um=385YPkCV$_*r}KUq)YU|NZ(jUturF^M0eW*T)^G3ZRlmH1#If%LthPp}+JEwl2CW)y zdPa7nB6C*muX)UR=*-nmj_*HD;g>!N$`i0j32>N0@P_I~G+zBYekvC%tHMINwW6bi ztm_@YH$={*ZQYOMQm`hT_<60lMjMW(7VnHK{EcTK!hWvs%zW316OmyC$MW76#W1#a zevFfcC%uk-^_Ex}%i&>nGv&on6W7fkNWdbKS9}>E71}-9_?e20#oH~#7ZjvBq#aT) zV@-N8?Xv3$2rL84Kb}tfZ9_i?gnTfcKa5vrs2;at&P`E7`^LwRWYynS^c^1vY&=0& zrkKnR-GaYgmf))a(Rc?uD=luAEEH`l?W<;TbG5_Mmd zCGvBXuQm5 zcO?N0KyEAoPP}sRqSoWxMP*BTE~bG#j#5T3m6Fz$jzow9FSKLPIyW-gTWcxD3jWqv zxOhL9-KtpUX{LjxOXrff4@fJ|5Hag%TjU(xT{K&31NUa)_385lfU%{QiCG4e^iqR~ zMg`+KVoD`cShm)#QcQ3O6#;aQH~8ZxG~n_5&a8de(RG=a+*Kgxnxg&oF|6b$ti$3l^e3) z`_!E#G(hrS&+yXC`1-^*j zThfbvRz^b*6*wH3a4?z>7D%T7ARvq;ARF5dEB{jM}Rn*>nGQb5B&8pN4IPJ z&Ev54(atyPiw;Voq&xEGGVWd4kNz|C?)BGQaqaCWz~i~)FmMQ8=mQ5OaZxW-w4W-! zc$GV`Ct!tma^Rz-oW~Vp0X5*)f50p(hybpiWl+ZTMig7W4Kp0=0onA_pPSV8I&q%G z=U7Y#$gJHX^)*P@a!S{Qd5jJV7H3XwiQW3Mpv({lYVq~4;4f-OS%@$nV9$JQD(l2X z{@kQQ{~_K<80xAJ+WgR!M_uByQjO1@h#(>6JY0MK)*oND+}h}k(%u<$B~MyRJN3RR zN4*+kH8nIVUQfmeD}ZJz91foiVrYAEc3c0&ItAYT&PFu!7*TvynUyu+5`Oq<_rr6BBk^Gs`p-(WvzoOHW{;1Lkoyt@J3-%l#o^C zD(c+q6~VxFulcs1?DRtoKtfKhU8`iIu(!avW{;r{P8@Pe#$7sT9|o8ywa-;WpBmtf z7;J|b352%=d7l}?p6Xpl#D)}_Ops&`p_M^y<)MtIZ(c&9ADS#Vjz4o2!Abf*@WTGs zw~=&Z;xQt@CZh-*b%X}PU>v(pRLS6%1tA(Cp`kkrhsP%0oQrnu^(@$t8JOgo5cX~&a{A6vq+=^m3_EW z8oyoHrep^`FK5G$@7j`sdJCBilkIleo8%VK`i9|d(T!;J9NTWQ6l>+8evj7t1ZFm2 zt&N;}hPpY;v}C>&(LTdv%gXf*gN8u4<;3B7lU)xn1rOsW2O24qGt;jp0xmn;+nADc zu|HSDI7~{+SV#)hZj(h9kKpF|^%Od@s-(}{J_SWNL}9@ZaL40H712>cG}J#T_x1yX zMWfzf{GVNbRDn6Ri+LOqzikhSYtUHuj{Y`$BQiiQ^yc zC-A1d%8DD&m>leSr1IB(!omql!o%%{iU`}(cz#8=tIgcJL5uzO{x0AV)vee638mam zO4*G=1f#;r7P3GsPToi5J6RQtlLuy6Wr6L2DlNHr5VjqsAhTjm0y{v=Y`Flv`h5zI z&SnhH%UBkS`engfP;leqqV@~A80be<7j^i0;RRiz1g$0IoCt<4)0Dny-b_W8cyEzl zZ&{-9;IG6|)=9N!F*W#PUy-z4JR+mSB#i-;a^JUPP8q#=&KjCS4uroyu|)l4nrJc> zD;Lsr$DO#V&B{M6Jbx(ulbB?ZJld-C$ZPFma#cb&jY74A%(Ie=dKL6+Y}?+9kAMkf zEQPhDWPX{Uj{K6|3Fd@)6)Q)dA3iSJ6B_NZRs9a05Rn&c?*Gg%zcTZE;~AT+pq$T* zxMRM&Gq)8Oi`tNqsX++dIH|P0b%TXVt#ag5Uoho+WmO(ND^pB-Pu?8rhgabXd-Dq= z+Fa$Kt%vM?e1`1sU)fA@77T~s_BvWMdxtlD2<*(BsE&Ib z0Z`+#c9kuC>pjzQfC`rq9QdJ;ub|b_Thy``@-i76m z=mdz&UV#FUyIImPMaQ2dGFcHP*u1)9P5uVd$M<5iQVj`)y1sPp4^@k^4=B=Yk{!Wg zuo$$ut+~1acEsFduzmjy!q=@KL2k?;W^v#AsN%&n6*O3fP~AsN4(i48Jfj$=$WhF7 zyHil=n+ClcqTjt!9S4rF;}cKJNh#%61c~(Ii)K^sog24i!s@^J*lQU+o%gfobAO@| zlaWZ{0IEw+cC6vaKF;j>ZpmvL$ZodAjI*F`756@7#(ZD5_p1+KQW?oxP#_DYLiuZ@ zM71JgGm%A6xr&(YT5}OT)4uOWyn6Z8j@MMK-&CiKeuZeEY-Swd)SOF#M}A7^G8ieR z+P1zZbnGGXWO&~$LtOqeL^w*1`v-lSi739~Fb*F+dF2@%>5?=v7{hXcH`y;4a8 zEvJFxGs3g1ZO*QLqYE{F8h`jdW4~Odp#jlA3D{G-H1!GL`OQ?v?qn*>h}j zFI!m&)vdz+gi2QVap50zTF)9lDgJNyHoRb;>8l5xB{0q-l)Mn98qw3%fCltm>4ZB?l8s&y$^e1 zq&1&btE$t^yXWIhgt|KBv6ECS>(l6rgWb6u(xP-MB`UPz~SvbGWi+FDK zmoP{YHYg=%MexQdmKT*rc-Q}evu&bYDrdh_Wugcm7 z==LrqQQt#~x$c&nNKOwG?QeuITnbZrkH1lRwLpf}&dxsq+(bxn=7|W&z#=#!>2nA0 zJdXaC&iJ;Pr8tYgw7Vt%JY1`%7hAZ^T66I?yP>FO%vq{&rYrHMFzrK=Aj9ZG>9*To z#s2!>M`m!Dd_h}LFqxp|=P>G#W>lb6&H4q&poe+|g=oRH|A-IzoF0A9Z-@<6WJ#cl zoFfRX7dvjeYZo~ zP(^p@1ef(jgQ^AmM8H$TknQ`a98YRv^DyYFX~tWjZARWS_uRjS=oc zUXH^4lKFn&iEFiyd4FR^jbQ7OBiTrM#S(?#q!g9<_J>RqaMq~HUr~5k4XK;>PnkBg z3bP>jI#44pwdNG`uZUtUg(`A-X0_y(4wZgypzr6Z#Y$0ZEG*Rl1qVn;F@qDsva@O$ zxV*ILY=_=srZ zVG%706d##X)^ShgR0YrsmB3_pOO9^RQPE-A_p)m$@LuRORX*mL%1SXJ{XYTLdU4WZ zNgf8I*S!FZIs!?vyem=i1FzBUXdefX^f`}(vYexzMr)oW>2(2F1eRh`(^ne;o0l*I zer@E6STqo}1}@Iz%akZ0rO#!rsjOYuw@MV1<(d|x4S;&kI)RlrvB1NP1G$x}m%>&; zqd7W!=-s!Y<9eadz`RUFV=>Xc7TGP!pJ$(a+2FsXf{b-;`k0)bZf0d?IoEr(EC{}> z2^>(EY+xODs?QS9p-r<^{A0murGM_+Y*}y1*~nZ3CYJVnywsq~cZE1gu_c@z`f+na zFQ$jTq}DkAfty@Vs~qcpLieDrx25oamHX3DIoW-Phk}u%}P@E0w*{QCrBd^>Vqu{wY`eO5#o}` zgfIH$45{AM^h_(Hvr3tI>InAN3GG>{T821#XPTZSO4H}PuB=t0Fn@mZjH!kWs;sEK z|AqPPP=8MSY_m?yto=}Iv4#X=JbM4>UJ3Qq@%mRh?>!Dr{+=Y-Xy%+@QZ0zUslY z71VaD#|#h!X!A#rAA>N*PbYG!DsI0-M~~@{y2xj2+1a(uf4%NDOqzaqmw%PGTasAZ zftV|9R%fx|sAv>{JIL7S<$4SPQ=|a~^N97ft?q5LPwEEQKF+jp{v})8ehwb!r$d?J zy{m?L0Lr;GJRX~;6hM=5DECHZgeH#~tk?W%-YG5bpRci@ggfJ}ct;bhd}ho@n$85K zVzUyhS(AZmUeOauoN?MTlxrvb7~V@oXiA&96!xmC(d!mC6D$ zx^t-8j44gEQiu*KOC`W)txlgvnFe%F=I7MlB0=w(YOMR04z`*k?xQ*3SYmc?MgAOh zB4tQOEZZsXMu<1IW_axwD3;RS5w#Y)cUig$PS&3fo!oIrNYc78J=nF~jJjEc3(-uP93VHeU_ zV|VvRs!-n`#~H829GgF2aH^DX+-z|(#nn;BN<#Nqiz$+F@Z`9|Kl!7>y3Is^=?C^n|_n4~c|cp~F4r(}GOnj4FE`<5%c+Eug4z zpm+>9l#s;S1#qVoRp_O*xTn;*VQ7dxtXWW@L6@=K%@Yooo2n2>KvnS%tDQrq^9DL zqVpCqmlz@-NY73L~GM{4T3uK!gOgIA>xa@!Zh!Bx#Hd8Wl!*dSl%9CMa|N?1%-~fNkhSGp^-z z1kQALB}yhGHO>@0NHM5FR*K$`2f&SjfUJuYzs{;!dU9q)X1Tu&0}dP0nOQ1q zvq6T<-nmt;RLkw=k0PvBO$=gI4Z2k2X$F1oPlH`t7p`-qMw%_X9k#Q-~TI`WXGxD zFp(B5)@zrOK6RYrLIZ(z+={@{=#Mi~&K1l$jKT~}4PsmSy?jO;)+JxL4}3JKBOfX+J8!6x?-_}wTF{yr(x2X>`D%&!E*K^SE-&TGxyz%QV=8ewpgnqD^zUou~dxH}pHJAU( z3V}#*lrlao5e7sPeLt)WXPSDF6pcHu=!Zy2(c8+7>d_R*i5r33q}Ys%cY{8bb!SPsNF zBed#rfbbuQJvZdm$Lv`oI%Q4R&b2@LO0t6NofmPA?>cC67F?8!-eHwK0fNVb|@PaMIu zNifTxUt8SRN*_D)#z1#d0%_w_t9AeCIDeX4hq&(~OHor{!1KMS_zDpA0Jpa}DUxE+ zWOxi@nSmvnwd;va3~!t?l{G;?g~o!*ZIu2w@3T~pz!cBiX!T*&s-{J2asB1}Uz#w| zvgo3)cuRA%GJ;2L>+UyepiIi(3}=>aK;`X@mph#nl1W{N(BEQ1K23lZ@zEIF#iFud zM-NAX68)v@yp$tm`{5Lh&3&dL91EonUIw=am<#9b@D-B#z0^drQbYJFu!E!Z^&^xt zUbLX!&1<|{d-5&oI5)0ztGTT%&ETC7IbB_K;AR}?Zyb}MLr!Q-K~b@ua2Px zQ!6QOJ-X*j36pWfD|CLkV|+4pJFuiw)_B9CFpVVDahm9_3Gooh6)P^72oI!*R}`Kq zHVYar;=jiu{R|saWofzqXJ%gD=U;ALB%SE}m!BjD;PIjVhOp!o%sSM|3HlB!Bf52v zMY-ospelbhWT(lRApZXB^6jrpW_t&5_vjMxR`DBAwmKD_a&II)6|~{{GR`oW05NaK zF&@)D2>zWM?SXdEx~D36mP#->hxZ=};8^IHye z@s{)~>?u>Jaa-r9{E9gs{SX#Pto)Qjr#i?%PcH4Jtc;yaOk=2&Ui6RNFW#c;!!uZS zI>}+b0InwO2l%*{Y+H0KN_XtXqR`ma@f7yNs^J=-IXICNZh|WJ{d~c%ssAu(cl09O zR@kc|T6tAVeUF24r^`gYsTHX6;xzIBq8+0Cz*f91Zy%WT6MAcTRY0X4Eduq^@wY@T~Uk0h=ApdxT@ zVPuXgwi#4nEn+j?#x#0hFIK#7tZ;%rWL`jyg@2xtl6lG{yk~SF84|2G*nULiMSRd{ zPRMqLP?>}Qw;;2ABj%2qzLNt5k~mHtuGId-8MTUjCx>?uZ@+epAt9OQ@LXw&{Ji>+k7Ll~WFe|c1?H;UiL z(KC$%q)De_0Y-E)8bNR&$lf6UC+4ZWEo$m(Y=R zO=ll5<0uuh23s;O7h05BS|=-YMbu7nbS#Mv!NjT_^yQONMa_`B%Y9@Gyj+}+vjkcc`kb^_~f&W}^2HJ_cjtU>nSz zk1Q{&)_;HC>X{(yq0WtdTS!9TmKRtG0*@ugrxW>wSpSSom-ignOp6tR1~tL7d3{AM z<_=OC#Ai|md?eF+^{SdAjbvC$Yj|Q7aH0FWrQ0E0axr6g3r->&jZS8sqS)ZE!M#wV zLIX!E91!F<6S1&h!4ZuKYa1Q>SRw<ors=_%> z7WW-0I+vsRapXsT`>WfOtYfUGaEOA6t+>zk5vu$DDG5YrNyWsXlaZBBbLpV2m<3C9 zX5o>fWFd0$v*||nmb}EH!Lt{ZEJwYho-)5b{T*Oc?--bFuVq&Kq7 znjg$ELdS+asgDohi58D!rWQZES$UsfJQ^GdN0&z@rz00V3dh{pOZ6d#@)G~JBaN~v zdw_coxglF+#}JzR%GK@j#}5PQN7|MgME2uexn#r#vHU)N3R6Yf3#5QX&?)St!rMa4 zY&B`@B#v)vmk6WiV~G)bRM%L)UQ;uwcbN9;!XG09#QL$GX{)}o z4njl)ScPFOC$Lrf>Bq4<0(vAUo}2D(wOp92bLaiHJj-WbesTQ#G(nh&vFGU_KiSqY zp9eaS#01L^yU3({7|09B6vnS_tl6r>L9pB#K7}W3@n(s8syTK*+$RVC6irtermyv5B^0N_#c$LWk6f|_vXuyp0-qJ zp-7QaJi&@PoI-&nkWc~y2-f0GaffqSqv=v4Jg_nRfLIQF-n*M8i>H*}*>+GTg1nf{-e>`16*WHRXuvU$ z$si3-sNbOYS0b~4jytKKVE$#aEKdb|S|BwsYG8^pn&e;b_D{!j5nA$#>gx4g-Ul?3 zM#q2Za*BWOp1sAu4{&5-j>_LDAXNuFAPcC|XI{7;$_{5_uH=|ZebJcWVf-;{ z<#vF8N*}6OtB5%Nu8-jtXsZ8bI2@RHl9i+JwR5Mo-jPsx}d*$}?KqmP+c+)J}$u)PR1zw`>vqX%%6ZVE1MlL>VM zx;LYqoF9bbPA>bg^8K+m!zjuABBF`EcMp5l=98&#&1uC{vN$s|9jpGhU3ZPKV0`yL zSRChDVw9idQY$)vRvKQgUBH3S(p9Tb+Rr1xX1JHL=bqU?@4 zOHO5z79S@cc&{fIF1|x zkDCiizO=c~YBt6IyHfNo@)jNcp+!#Zk)lmq%(o2@h~8@Bn^}#;0NJ}{h7M&Sdqet% zFUx+3bH?1!80b4;vhRx}<_GU&t}P#F@X@vJ%ki^SR>BUsv*fZw<)%YC?;#(5-u7 zgPhI?3?EB2G|mtYH9P$^g$KOyi~yhQA%Ft4?(u?DbZH#grJXfhc->9D7~Jp1 z{+SzE$S*#fs>%W!R>z&w$##mm`*Z)H;E7`r5f`)`aQXB!$_rEA%upE+sn7V8jlXdO z;vqhcT1ok;Q_gUgcP#xg%5b)3=jwAwZ+c1+1Ha5}E$pCtR9VymD~Ox zo1FVs2A%aF$`O{>uyWL?yT4-2EB(DAvXNlaOf^s^O|KArYE?R@7SLH0eObCbioGSP z10K1oKV*z*?QIC%C}%k6BNi78c%6yR;nXx6O;@C?>T_UQjCAP8aIsL{D_NVbW8?K9 ziAuWav?!TZPN?|2kbC**frvtVj2Hd+_2tdSAd#+-zi5d6A(v=q4(o0J<`Mhnuyhz2 zPKS~jo5^&gWGK=t$!i+@q>(7fXg2H=J)pXxinE&~yT%LhW5Rg>9WuSsqCKV#zJVev z#mv5rDh0XqO;hLW(GmOgzT{c_EO~vtV_nv)<+)p`gJFy$_^Cfs>gZ6x`tH!(&sntf z2qW_(#e7??m=7hsbx=IO$2YVrs|@1;Ve_!eCP?lX`V)8gAhP9+)fP)_MT6#kBE0Vd z9SpgPEnkx9$D(w6VwyViws}xR@2{!K@7Eso<2et$clZ_)l%*`oTl20A{j5U5wmd>| zENrg)o>KC}6bv3ym1_ci+>Xqo!I+IcAwwC>^$xkiHcd%cNs$-C4t=WLFyAdO%*S(W z`6~L8ny@TFPCu8~uVZ5Jp=en8zHQ+Z`6mrmf}p@9P85cg*?p!%#&%fpIe?U@ZGl&` zUZPK$K++6-3E^?<`fPIv6we}<%P@xRaXZ)@wl{a9P7y`wQ;aI@-;*VS=5^9Q`c_2l zk~ft+Z=n{vI;{9#?kn)XoZj@a;En=E`wsHQbzetKtqChq!%o}Z=~3u;O* zJ26vZ|8eWG$BU~m1@`rKFr>+}8@l{h&4jiPar&z+0KmgnEHo))>uUV>%;r~Hiyg4F zT83+y=0pX^j?QtG!CeI-kZbVH&fV!Bs;!}c(#x6^W`X&kqwOwyQCT%MK>5R7P16(T zX@wdqn&52Gu4`%)t+{m+@Z|^L7Z@t|xfiodD9I<~>pdR%FH|WO!}$^Io9?k5C}_8P zAgd4dRt<=4y|M5aiNnftKHTb?6OJiTvmeY-PlPXPPiJoQK$T>KxLe+4#2SHL#C`qd zdtVY@+}v)~c$HVqByu@l&)>yp>yi6UdolcN_O8aNJ2KO283C*Izd;x^xH!I!yzB^kojlSNl-} z?E;h5EqUvHU?|H7}T#GDUzA^BBH%QIp|Pb`9bQ$Y%BbDlA?)eytJ+`TgTo@EM$liY2NWXNL!*#QC5Gn6s43rzUmLM zaOmWCW<}7{jgKjYg?Yik_<-(b#eCj5CpYc8@jD`HA^MmHZF_rY{!XMT8T-xGUkoaY zRDw&5Mt^imbkOuXr^nr|9O&7xff14xPMk-wT562%`ug`wHw1Tq`f{zRCE`5o$0ms> zxbRX*BTuu^xnc;8^V-OFVO}=y?+)!h%9oNH^Q6>)qSdfB4*B$iq?xi(+Ct)R118N> z;MvYW@XA-4;)lZWA0?`@*R_5mS4<2T8Ur;ssnR^gZ#HV&-C9u%ISEFPf>-K0-NViG z|Iobp^MrH7TJoFTFD9G);$HyU)X51qUiu z=gcBOJ;k~TR|JMT?8{F&NZD$udJI5oxN(}x&ZNz$lS#I|``0WrhE?lgUZOLluhz%g zwp>ST+WYqobi;7u*a}Blx`+Er=2+OIt{zTmww&@j7cx7G!kP=}SzMXStK@p|=Id7< zYngF96*TpM8;pvE>hDt3g6qQO_bfK#3vu6`O6MBRX^RL=iqCRkzRL)6#ko02-)pni zr4wP@_PQgqd`-u&(-JzHdI<*x<#rHnP|r3N^pfKOSGH@hL65$r)p`H+sI|_UTn>#cA z;lBNu7jaTt5fba>QFLB*OLlRALs47RfDtHB@D*<|_~@=rdkg=}))Zy!?#1!(IqRgl zu5*uk(`+q=>XTwT6kBy!890y-sRd^<__}nOTyd<(E^pbh-0NwDdCv0E&<>#91V`00 zjQC~y$MNEBTkWLG+Nu{)i+#kJFPg66aZ<4?l_;qaux4`iiVt3(PZ4CE zxBRiNigUn7%@rNzjDK%GSc-Rk<>HwSrJE8U4XLn^EExw_k~{My`NNZz!Q7)j@UL1^ zl|mK-r=94>lNpG1X{)zsN`G05t#J=NyrC14B;+=rGT^nka%1As-mm=Br*NNH>ahL{ zyvAStdc2%qq?rqgbgqn@O`HpR!!7ui^gB*y$6cDDiu;K)*gva)M>N2d;pYSznDNIX z-Zw>zu-DP|C;k5M(-broqgHEqaW-4HTs4W_NbZlUNS}9xk&;ZcBeW==Q-glJ=|mqN zURqNxJ~@*PdgM9hBAeVu)FEAlc+*a=rUklP4BFi%mlBfeFzT&S_cyQZNVB@Ed{4!( zb)l|8H4u2p0L<}ndYW})eAhKi#~$20z-Mn7gRF88>T1liNH_3qSXtE@F=&f`?CR>@ zP@T*n-6qcr@8gs%N()eVi8`iFMmQTI;f&HYX{W9W<<=a(EhzW9Rd2VueSs9>(VAWy z1`Q`B@wcv|w{i}5#IM>I?(JRCC)wkGdb1iMF4rmII~@r^G&JzP{&S?!QNb;pAQ`+( zj@Vz1P=hgbJ`C;e3B-(#&JN_G5CL(m3RsxHl;HfdAm8NK0IP{X1l>L5Lk*21yCr?p zg5?meSG>8;bfk7X{l`(yf+n`EE{<^O&Gf0rIVxVU-A(h6T3rDJv7uy!NpD|tlgZf^ zP-qFWi`Pq7!tc1fq(ZZfX}@H0AAhhf=%d;$-TZlq7hVGK3Mwc7-q~1DV~Rp*Z3R!3 zks8Osc7j>w$Ii(5+~?x(rx*C0W+snAS-SL0m$ltVP+I{4D6T&YLZH`lSLg1J`#m{u=H4Y_aSjQS~q8e|org{?=Oav99E&-cobl2K@b6F{=Ke*Lj^qEIOT4v+`Z6 zb?s*rkNC4z&SNz-QNO}994oI=J5KVWy6&p%<#I6ipVVVG$jzEZbdnFjcugY3V*{Vi;2i({(p0jNV-?twnsq$WgtzT$9_ocZk(!%E!n*u(=` z@qp1{*5OPOs~m|_C5ZV0g+G* zmi5AyddO?{KF}y^2TwR;M+iUmvdU*7fVL8)hn&1x>jH(8C?Em(9hclt9QYG5f5El& zBI_YXEBRJ7J~O*SA%PUjM8fdM%$lvaxK?*P7i(;2TLhBcw$AqX*gA5J{@AGZ1blDk zQ6D(A%==nYry?4g!()NWYD(+7^t?$gUhfp@;IoM?gn#%K^`;yaXG)9rlyrNF6|n!B zBCELE3G#YkgJ-da4=f~&Ckf6K0vb5q!!D$Y2kSc-p$qd3%EQM`^Se!Ak<3lF7Q-Pe@BPrUtv1$#m@Y4GRST3Zn@(ju=hrtVGoC%<69zjsP3XqXQN0a)GcSHEk#Bib z=}l7oMbg^NxY)4t%iwji^)AqHuglGAEr>Q|n=&n~k2*TFTs;!&GxD#}NpF($S{=-} zvmnzf-@(7PbzfY+=-AZ`-I%c+2FHMOmsBal@m;3R5;IsX*C~w<# zU}XcwX_;OZxh6(7k@Hu%(#+>B9=)vzK~t-7sl5|`H)4Ov>I4*`M`epX2R z)0y=J{lM3itw_u&;c3@5kq4>|V7)v08Kyqw#hZKcj0S`iBBn%={yn{KJT!LJ(418uxYAzM#ycX-lT5>!}V za7PuO88CV3D&|;J6jIj-p)ZDfKaSUVCnkx~+^`)^cqru)7vp4|<{3B={Tw+l2CtrN z>{G9P+U$GPug{Zq&Kd4DYGBY5)+}@N9V)UblGf$=woY;!xtLvPE>?z9?u>IXatw7u zX-zx5RY@{_7(;4I)3HdLsjDUEJOm=d647VDsv__DKZ;8bNe>>V8%Lvf@o`0YA6Kx} zb1BbW(SUB-dtc1Tj0Pv|glzp?jap zpM$&_la|L*uXx46g^|`^`&qLgH$1&nWp(%0PZ_BGN^=2!hn#2Q_999u{WI7I~81B;Pt`4|ju+V?45O@WGA z%cK-_AY`rsTuNzGVqVXYs-%44y~ zcvtA5`Vfqg_p!lVBdfO!JI`0yQs+~iI}px`yrGS3c~R2Ty#HZr@Wk}7Po-EXc1{g^4TFtTrU=Zvx?YA_oj9&C>Uyj7Fv8$)<4S->2D0%p;TPNCdnOUztlwP$ zx4$w1jQpYqVyI>K!V}@r8nu~31B>VV)4$%O;V;Dxmvv`NJ_$SZ{)<;zT!_UzShL^L zl4&dQPhB*_Dl=?38ugB9*5 z*BY`AI}C9-IabOGZ1}7jC=$Q)(m^WTcMU4ws0h25o>*AT5tya|{)|N!YVXF!-kKfs z9@sk<$FM@IOK>{=plmZe9yrt)1iFd~|BX@3JJ;-*OUdk0T;^4_Lb>**MRD|V17wMA z!0c@P06Y}1B%qSjfR|35HclAR{x_k!q;fpi*3Vnv#9E3c?@HxIUzZ2UD?DX~Z0MOd zx^i#S8&!|GTNP7EPSr!ReCy-c9Uh0J7u73i6?`BUR7a3X>+k?MchA+b9MX405=LY@ zK%A_%K*ZhC1O{dVFbRB!0Y^jW(r?Ce{)M^uKZrq&WgPL*h2bKKlhLwWXmS}q#it%3 zW=O(3skUAp#_0sITqcPQ25_enVc_g!%`n2LKz zL{M)nOq+T-h0~hdtE3o;JfU`ZU?LSjs&wY**8XrVt`lvTB`a*sx!10bsh-a#H6fys zDvfdy61{AtaVfc@>O!6`;zNSj*GKNF0k%bK+{o%i5dZrSZ{kL=^B_d7%KX86ZXv_! zxw3j>G_KasW(4T0=ym**HZkCP-gcfv?{ERSg4bzkgWxyl08p|)kk@oH)Ub2_S^1j3 zeu2NTt;jCe&6@!7DGWhAzy9+M{`;0rUoK-1mH`}Fataz4ThZSeUbKDlh(na5_~{@9 zz}n*417>qwZI{1&SI$0ZxUJ$gpz`Tb&2c+f#FnzvG&It=grcF*``^X#|MdQL*!C*j zXy*^#7=v)oNXGhD#ZQ{q1I3Ynr5S)*Hl6Y9H1+)I;(={uA%pE5+vXrbmo{T?R`1@K zk7w*iC^wG3uyLgG`(i*z`Gd%4^yk6@s2HVI{_VuU;n~T#aP_MV%Zz9^HpJ3DF>YH# z_YYw=lzQH-ZTHdMzK^n+bP4Oi0Q16Lp#zj^n<+xp$9QJ%`v^F8ZYD3;gZGbshR!mx zyyF!mIjy#zmgRE9azmfAlS;mBJEDM&IvBGI3=F6fnD%eyhn@wVIpY54rn4o*`)0J| z-g(3n-vy3Zr>1?u0{8VWVVJnkHN0PTHuEa;uDcV%>b!z8vH&z`lkG^+~(<(dl zt38x|0~PuXtIo^t7s!W+I}Q#yio1IAqBYfO^GxFMTi=FwEKh!V9#L4B%gEzwh5@mb zLru`$(*el(Or%BG#1yFrc2)wumbR5D;}b;F`e-^H$_<)qJCws>Iqn;0UVEy4?ga2z z#(Lnv!a9)kQb)4Hg*LEWqSL`FZwdOqgZaLa&yS>*-00rk`V3=AIB#~_i%;IB%gw5& zJGur@<5<~=4ZvFr%5(=_w*Dc#A)jIN84bLEEF&wO_lp!V z6nK6oF>`kLC6Vv5@hj6~A^L4U`6|wme7@vSN6mw}`iWvS-xBMCC{m@kV_@OeasYSZ zM6u-ywv40$S+TO^on}|}v^AlO6KPr7Nn*BA{?v%M=pzQ|2L5!NGmb^ytTs4&Do`FfaBv${Y?D;Pr4`z$D8tc&dvETUx!LcQ; z8hnzc%^L9s>wdIe*mo6=Zb$0_^x|iV^UdoIHOB5|s)qfjE90o^Tv&j!mNy2muXik( zk3$2KwaR~u8kAc-ARU=s-ELdDc_#l^74oDc{U=TJ%2I<+>_SS1FlPmmp$I*1dSXN6 zX3)4wkA)Yh6nXR9(sK03Nb26X4NwxA2QU`;nvcTKDaR%hnKM z9y1i4xb7hS{xDl_GTn^36VmHGVy9Agfl41dn$e=nzu6{=nTO_ z-4sb~ov$4+t*cO+a-<^KdPvP|ovr@DSJ~*~eWUCBF+GqMK zoKQ4)9moT`=s}oAx_FcSI(5{`k z=W*>V6rK@gKC?_|)ck7)b!VrDXPv57U{9OI46PN5I=lnf=AfwXT=Q7Km?2wO6t0~X zOUwfC+#!Gtz-yp>OW3~1-t}uWXz4+#Ff1^!!PfHLzYe783bCD~GkE#+!-4xe_XWj9 z3iHW_!E2yCsk&6NN1riFi=y;bcdrDD{j(fC?50NI0_nYjDTSto^r;l>>F-U zx~kIdGsy6q=A@o=2`5+7%NS~AMhkMYZ)aY_g8x0IvpE84_scN7gG)q;sQ{## z;-z(_(^r>M7DBj`UdTv#4yFyZ4@vrr*m;yyB#;9WGM@4-mhBcdOU!Cmm3dT*Mg+{Z z?d)7s-roT+Rmh~2{&~E5@t^~&hn{ujExX81i7Lux-;r+`=pMi-sJ_(+k1k60!;V#( zo)g67Gm1!DJDwjTj9p$vyIPhj5X_R}7=kuTDDTb?MWhn-k&S`)ws%XAV(4hj2pdAe zmgh$(dNpC391D^AfMH;21qxVw>0(+L6IhnZ{~N5OsxKEeHT~KGYXEE@AE+{_IZQI-6FwGfdo`v>0v*nK!e}322ZXrJ zlhs|-WblxlL#380)*rnQ_d4C8zU(jB&Wt(-b?=OqR{x|aIJeeP)Pf5<`qcJ{O8NnM z{vh;1dpHWtl<%Xz*GWB%(5cZ<Nd!uiNx0f{JwtFV&eAi2(KKiG+-p4O_s`w{I z4@U~yfs;Aznrjd|LHgW8x-ge&Z&*z=Bwz$FE5z zwehMf_FgQjgwxFcNOIs6Yt&gb-#iEeebD?t^H5DFDjP2lS36qUMRGasw8HwT$TJB_ELU z26-a?giA+hi>G)*Xd9_HTqTTrKQXvpnB|WLPJ1>2Zd!C}S!ttU<)m~F{8M8ZprMP7 zmIdGY+%KFes$bxb8xG~9VSBDYcMScbXhlJ4?sdI-rqX_hHFeOAiD~lJ#c?5sdt5(? zeynI|+AT&OtW%6d9IN*XLu%O+Vh*9g1BM5ursr`%4&rELkYJCnhMa`Uu5`I-)#s3r zgnwEouw~S=tYg_rOUHT%vYh5c)hNLIP_#s1kICM`aY{F;-YhV7XMFUC5rC&yz3#IkD0c2)g-od{AE{q$CV=P z7c+Odcfujc1ip(b{j0%+FMDV0wzFF4&!6{WARIT?2$E)I zu|nUnltM^^er#4?;+1%``ML!Pku;~(0o0=eeu!z(87j|a#NxF_>(|EHMo6yA0 zaldy{1BRgT^E{5O=WO&G#L%ud%a{fPk30XDB1;WeJBGNBeAl~Ch}YLpXy5KxjF^hiX1eJL4C^5_D3 zLn!YSpT+`pavzA4#-Tv`9W`6YxJ-3)Bo0_PDzvfgF>Yd24)gp*%=7{G9NDt*Q?F&- z;DaQpDSw`!`XvxxB#S=J_Frn z-GJo%Fwx6|pvHFo0e56(VC5wfNUd4%G1^+9Y?*nz_I&Misr06pf@)K`IoWXp%1ekR zpW=!srCYO=JIb!C-?SL%g7+oDT-ct4;YCL}gOa6nLP#5IO@k)6#ycyLu$>Z-hu2Ii zcZA=pkzF)+^(faXe8=JzXnvRjU^V&k?yP&%IqR0*EMi+IKeu;mDO&rkygAQ&c3bf~ z`&Jj6v0gEGtLedLF*I=>BI1z~-O(kC09BtlwSgBMBe@I6F)$wWS4a+>aQD36Pdv*}eC z!)bHRkC5aO?XU%BdyPlTAWvkneUP#IpSP_3uOgC$hC^vl`I^Z1ljaa}UU7HbZn2o^ z08Lfs?JG%b=y zHO}g(PDbLWdZzba?L@$@y!}|6kRjiP%Db(3N zE>jp6Fx8(v8)v}iys*(#O7)Bn?Q`6>*C1!j@#ttbz^fotLvDZ&xIh6Fgmu!U2uU@x z%FB^;u+r%tr3@n7YneLABH82EUD977<);YgdtK%p4cdkxst@>y`5;vV*M@O#m)1HG zCLh9Q+2~Q&iL~8UlR2V5g72zO&7^X!y@()rNS65w#B$y$B4xKuLorkr8=TtlLsHS7iBpJAz`_qIEW7Bxw%0Jt7hBbyaomjN`_J zqwnRWt>jM{ohah>pESVE`3~@0rFq>&;5|Bh1T55Y93H@uN_)4UO5V$wopG;kHOA5K z5b0~Gz^RisI4)Iv&aimzf;!Vidfi*JM8@C6%a+0U`1%pGlQ@jk6yk4*I(_ff-30~e zgdNXj$DdjLL#=x)m`)2n45e(6OR+bbm+Y!^g5;cpW9=WSzqCc{D{=8t`HFCfck^$s zEte_XUs^aIG{0&6{eKsZzqOu(8OK?8;tyJ``B!DFN!#8fbP>;Dk`D_qjvLH#TayTV z49Kj_SS|#yiV?b zKWdjdYwTlHhby;6z$5A+S~p=;LJAl(>(_0Vt))DyR=82&iOXk+l56s+?bu2K9e%q*Y4r=b`vHM19<&5v=u?xSi*S9!-X%1^u0bQ-jwqM>Y=cl zO2{C?e$t4puQtwVsDE(Fi0|Hdn?ExWBa5cexajkNdzm%Sgke}rjor3DHnWNt%CO*Q zHjCc2^}G5*SIzj{Kb!Z3xW(FD?4>mv)j&|mKzjs0L_7=EJ;htbi{h^Zl&cj-dGRSn zLDH~&cBy#6gW`5L;m`TZ7*qucb9zvgFq}W`Cb?V;^9YRDG+f)48~^k%z~LIIHM=1W z=Y{Gm&uvrQVFjxTufkJTNvIV7N8kUxa>R-o+tR+AhzEPp(Kp>i4gKm{pj z7oUC!i@P21{@a%`J6J4_O9Ci3EaqsK=8v@hyV#?-joglv*K5@u*XM6>lsvEM=gZx0 zFj6D`a8D0e(2Jq6F-Uv8Ac4$=i|wVes%-UC>7ds=^RQvmm_eUqmUpV;*k=Sm6zu!`UKBIaoZdcckQnbr1oY$-dIkvKMix( zzkKZg@_M_kTwrt|bC$9f|9gdEX?b*_cia1dr5k&R6r$(}5u?mne?jw~72E$sIR3&k zBi8xOabdQl_%{7KU(eN0vV5@&$OtF28f14~YyWcSZr48TfI4>9VqSjtm=L#iva!@s zx90w>KFJL_^wz7T+GOfOy{vreEJ!)Bc1JABh{rL~Vohn=)U|uS1>R$!r^HkKC5?GXkcAjEtaD zLLEDU3B9<|?ELi+l>JJ4!+piuy1fdM<8AL}ERbB~35CyP^pfvNGAt0KbJ8}yCFujy zL9@mly(4W<(G35ZW_m9f7r>8l+WJ;w;{2}vt!PJ`Ryz_3sjeAP>1z=!{YG5^aUUkOKiu0$pWS-8fO**gf zjH_t98UFv(p!#2;m%3Ee{6cEg>H6-dww!ZrHneu0T?!X?pv@eHjVPsJD^09-FA@i$ zg-rv)FT`R(9=DPgCN3txeHTcy<3Zx`c!{_T;rj;ai8q~Y`!RFC4(yFEa#368O@?>1 zbBMUaVXeK?%Mkzpd_~|KvG6jPkjt7H;7t_fs{*6KNafGAVv;&#vHVktt^|FA0#Q=d z=7=~a{LvBaSDI365Lu9XarC&P6*gOQ&h6s9<}a$=HkNP zOluvZuk8XLYUxvg3*=Nj_8o>If~XMFCM|MIb;Uz==9WjxV)`s&VvZwe=+LNayTO9@ zgLh{G%q^;hRD^Y)xChfw4e>Q=In9pai#tLF%rNN&n3;`aR7`ahc*Ox8X19vr;Xl^u zo-?}04h&)!a4gF1S92h6t}NRkOFi7`dXx54%;=AUG`VnBvCO+zTSf-?MT(zjoJaBj zbwq#>0)Ihq(RjGKSU35T2AUZ-$t1bxej>U^kv3A_8F>Zu=uLEY-b#`?War?y_9{e~ zsB_#u!RpvhkCEi;`iG+mU5^%q9+LeBkEce087{NqGOJX?C~=1e3d!4w1+Bt*bLnNF zRNW}sn`3cD7`0L0u(=F(ZMEHn`4|uoby(xpe)vLcbkes-3+rCM-7JU1%dsPIQ%+)f zgY##UXAMa!qk#bLuTd9v@i17o!YX__3}6uz0?Z!C)-ZtDLqFJRTmlkA(N#aECl9S6wafZoY7duVw$OrYY0Y zR!Qh%#L)^B5u&SUdzP|!C_1h@jbXE0@%w$J`bFuK^n1}PyebzDS4N37RA&XFX8=sB zGT?v)rgnkF#^yQO%Yw8dDpx;gl6ucPGMc~xE!^Hb&pYzvsLsKApPI_XbImrSv99EF zfi7Xryqi@melVhmZd7(E_5He!-&TroL&i5lK`+fl;U{HgO|yB|ljI-OaE=FaZEXNe zkVoZD8YfDrH?Q)(aO0>nQ@PxV8M4yiCD~qcP`L9#4+{c}BD^4MzGKC)P?Uq-n)a?~ zNYiW54>BOcAe@AppUahAJX!upBmM@>0EYl8bPfrlm^-af=Hf}3Oc@`rjCV0M>11UI z*L))*hfM!6RrPPb@0R?AaskLWm}z~7i|4}jU8L7NjdcuMy8GY`SbQU|K!Jy-p}!#> zAn>;RpqP!m3Cb3z<|L`1`Bb}|kWcIl<s>sSB=={=l7!u}JxvfmD!LQoQ=RVwl8|Uts8P`@r}Z1YmD9K#-3$iDr$eTf5i! z)Wy^_m)>Cvdyg>Cu)#nfis(wFXTryGnq1^2{$_R0TF z_4;3>oJ4w+!Cy3ihj`O?U$eu{d);&K9q^Clw+%Q%gv~O1+t2fNx+1rgE%GCW;udt? zmhVHudxPE9uWGK{{C?7~$?jg1-(^0QAZCpWCHw31&?X@H812=;14^;?!$3kh$ksSrDsFGwTxtS*>$X_Ws^z{b#$Ee zUI*t%1IVRysYrFV#S&H(duBMIw*WM$BX_9N~+yrX@mh`RMsqL|qs}u~eMn-p`SFJSIQz&T{-P10iPF)QO~el zmu4-zHh3LQC0eTo0^M>=L*Ne?4KaVL!92Kb>$@U2K3p~)j zp7yWObC6sWg=mtZ+V>th5c^!yj6Req!Ix`Hs^xyI5bIMrUuSfTXJ-rhq)mt^$RZ}! zSXa1^oXHcTmR%qXPFJk3xFb(Aup%EaZ>0DoQa?aLTU??526h_rNNtO{mxpf8-3KatVBsjUvz_6D{o`!kB>zFGr zUXL-{5O|&h-ck3*TM(k%3ebbT1{VTiR3ZO!Ilx#8Q!7KGmM` zAw`OC=`7=!5zd7;;ClUI#A;#GfnYw~}n0y}!J+7T_ z7MK9k^g~61wXnT4id6CbHyJ_3-ph z;ph{WZF5;u8XDNBLn;hVMk;gkBln(;DZ{n_>is=1651Xl9DbeJNikf8fz1VBY*4oDTAls*aGvU9}&9S89G zfQ!7>-jV3bJ_Hh|afupK=c_WbmlhNP4TnT5#`i>3A@Txxa2TE)>$)`yUo(*hKKy`= zpmk-U2fGo*DX~SdNPk5x09Oe)zdd+ zZ9-HVlwPFGJw8vvF4@w$cmb`WHgX9jTedeEe}5*B#qH(y;0(2zy6 zZFFiMj*OY;cPxh;_zUF`SkLEhRs_Ykguxs&S;5gcL=`$B&LrDeT!`NctU$;pE~m6z zb=RkEE&zN`$50IID9{nX{+~ ze@HJHE$l;1-8TV4cg}T}Yi-$^U-TYiR2y(f)pD7ML_$m4!itG&&cbd2<3mCcnijw@ zlo5Z2qA3!-o%3odWbXp%c^1!#c0}lXi$BcyNmIKv>@l#pcuZP#_PBgLA(v@STx5lb zW7>{Tasl9$ZH}Q7-K{zY`fnt_NG_CqzGKm4=I=2J7|rpc`dklw()g#_ zxv}Mcj?Gz$BF?%~r|~}fu+EF-J~dm`Vwlz4U@`xFI~0Qonwm(IgT0$^?!iUV zs-KA&eMUaIhyKbQy2U2-i=D$X694|E)cgOw1HeiFJ3HrUF7041VAG7{i0ck@#t%Wr zXrOSg(PGAOF>#sTUjc&^?Mi#~DzuQQ0R>cF`I95d6Z|;?{!7WIj@pWlIrqDEva^Ke zTBchL-vP~%=D>G1KP#@X zVXrhDLS4k3!ZaQ|imKAdPLb|(5#F~!cmm;X;fU@YWeQ&g+(63Nwdj#0Ik^;}EdV-C z#i-+^gGD4fDOB}M|B#%QW$$K*;I_!a0KZ@%AyTyrUQ2!tG}N=Dln;X^YWL*xfMtA6 zoqp2bQ*_6ujrn~xjV30M3<2Tcp6hjyH&r=;tURa73FhB;s*{dY_pY689GM#i?dQq& zMiXVUvSIhkA-=#XVNveV(xZIYz+6=cI zI_=Jpbb>XYFPnCOakR;Z&~M)gOqF}^Jy72oE#u!Z;^2RC>q;TQkL3!HhjrFxaW1-S zn#VT{<-Y&m`GNEv94kYlPV#J}?GaI}RpQviC^e1-yB}VsZmHk?M`qFHh8$OWMvO%& z_Y(Yf{3nQ%*ZRqyEOJy04i99Eou?WZ2oK&Aylr>K9U$NQDYi*NbBh|w@a4(^>~H*i zQdEkz$}%C^$q~ShU$?0TYi$$@ha-^Zpy!5!f+M@Q#41>aL93D4T4D2Y%}HQf_H#B3 zhJ|Ri^tmVV)5U|CLaQ-k`<3eaAhsiK`(&?}wM9{|_2PxJRsvENDs~^_dvCo#1QNVstYbGPeTMM>$Kzu&4Q7 z+o)a2S_<~ua?;-P=dsq<{be(dL{3Y$JoL`q&=p}N!P!RuOUkAgVw1O$Aq+~bz( zvn+@{kDs`Z=4zBwUk;D2IGc4|(8JIrr_KHz#IvM$zHjZ8SZygQkCl7try4MS`EzFA zX#Y&|PntBjXaTlNGqfm^oyB|m&XY;pNZ~jeE3nTcjLpgrkp#>Y9`61-0P~f|}FATrI zdQJTi@g&K3Jz585QUSN`G}nY}+Lb{!i+EWw`Z#jaB}<~PP_4rs`gREIP)Q^`CflWA zwuA@h_4|ulj{HD|@GIdF6tY?KOky=Kd+;z6Sw>&uv|L6)edBI%z$MVOS_JO)?C1?0 z>ZN1?7uHA^enMfd$WV#uySHD!?S?O@o+P*ep3)>20s32}vw;Z#Tys|rHHd*b(y1B5 za+CdT{_bF&U%60k_XYy90rZa2nw^d{ym<0sjCfMp_#z$4+m1BvL>3zL&oneQzf=;R zFeQF2u@`fDio7M5%Y-($!1Nlr=maVM)Syv36XhF}g!jzq`tcU{RlF}$y+{4Ki$mFs zrYNc#3`H0(kY>RxS9iU{Jq8^r6k5_x0drXlfSFT#W|QDb%U0zYksYI*2FBDL)u03Y zd@lbJx9*1E z@2|yX^1Bj{Qla)ov&k0US7W8{zymg10c2$DJZ~BYEeeePW!Jzb3suf6H{Y4fRtY_` z6!|c~0?67OM(x3qGIV^9&44yzBTT9!fFFannT*ssxyzfS3hd@5hS%9dkh|=O8S4TB zEvJ3;3@E>#o)q*KdAf9*u3aW4ExE~^Ry`==#mk|nxLfbS(U-!8015Cd@9t^hFL%-@NbhPk?$?zDbL7%$&!ahi?vFIl(faMfmGMd*6Bp8o;cw;36DS!}pWWQ>(sp&Q0u zP2R1qe`UUcSpJ@VWP{vtFLFV0%P6@=e`g4^8DD$v{mZtmDviCUU)uW`ZjV&F7iO^< zymak2%h3{l!?l6)ubN}AJh@aRwPUjSv>Z!|IL=S)Iyf+pd*a<8IQ~j{S+rIy|JEpX zcBn&D!ky*NN6km>6AW(;0}EE@j3PF)jk3uTCd)yw0vEHdr~2v2&2|bl%3J?_S;(M9 zFSb3BCnL4nC>xv{s`0oqDOX^7q$o?UKiJw^N@f$e(Nhr7m2vwPhk=-F+}cF;%_KQK zM$!u!8X@XgaPij7DRphQIe%IAd*e^Y2Or8_BtEDVha2`+Xk#yOUdCA4Xlcpq3oMz} zBcveB^6;uHc{N<)m-o9{LH3TT8(_N%E8@JNr? z!cjAEF)3ak|5nMDlkc)g^jWu5szcRJ>U{*$xl}XL(!E#i#fV9${p?=VbQu%Ddi)UY z`Y6CPSVK1)=dWO#M|irM;uhzLg}uiMGr|Hk_2Km)=07k{v2!}v~n~J_0%@g zr~ketf0DnJW0!B}+__)h@JgU29DOhx#=&qp(*jrh>S_A4hs3URXh?0=coZbv0dMuX zx2J!oa{>!y=c(GB&%agn9XofOj#@9QtA2UTt-rjsS2)GB_YVyR=e1*Xrt{+2cbm&M zF5KC^USmuQDEU6ZeUd}h*6y#^x@})xIaa71AlxM(GG(4LmUEAJs9exw8tpQjsAA9>ddI{3xL%ZF#x9Q~jtbE5!N88?+!@T=iE zOb4=Pc_b3_P;a%w9s){(i_zl63yNeaf)Zz<+&XVJPzl6-4<7OyPRH56`7eK;Y&Sj{ z>fBnCzd1eU(`P6ZYHOZ|2X#)REvLZJ2%)m}@Ukn|#*YxEsTt($cK^&jmOP_PpY}o( z#4Vls%}vx0?J}`M_F>qs zw2i^ajXrWO4NdX?XDQKA?XPYjYFvX8k#*)Gv5M2ah&uuVw?Q{a%Rt<*fHo4bC)fSc znxIvvAuKmtHj{0^-Zte99FygDt9g{w@CH39 z-PsgTIfK8J@TtVIH#{=T*Gj6Qjf|!^tzS`?n+pOu{k1?8t;y_~PtM$Vl%JPCc9FQp zIG*7A1_RCq%X`nCMMuzEF{NATOcpuH@-hV!F)zx+>HTudvW9L! zIW{9r)ehz(jAV#vOct8rxH$hHB`6i!wyj0J{LoH1%V&wf<5k@iB(cJ{@d|_QGkd7X z2g?pcwgE3C@_XS~@%v>{N=bN!VaG5Qn&_u9D}SeP#dhrpeD2S>g$AuYt2RiC|MpDh zo(|b3;Pd~StQR`Ap4DB?J2A03?B2?}PBCm@y#YP}#>*X;oG~6zGrI0ysg)n(r;~C+ zAGu6}zP83rULQrFM(zM^Vo9*<3;U74G+wZ_b|c5Y;7X`vD8Bz07Mi>tmIQ}L`36cF zXB7-qbY>HC9tgpo>f__{gU4QNZpV?~86p}=EP=V?#W{k5yos6P`_U5j8{GqXd3aj> zZJ4r5Uy&RTm8OWE94tikq-RM7C@s~h8GQ>;7Zz|cQD%7tijo&$2hMT2C22fW$%+(v z!?SKJnRh%HwPt|pAG2nO`z}iQK!T>eD3!Ieg)F<8u|I#q@sNyS_HIZ)wnU*=q3zVi zou(2|3+f`?Mv6;3e(42i?!gg`9#9OXbqKR_$0$K+cDqUA#hDiAS03Bt+R|n54ef4X zfDe#^YRq|R{)qIhctX-GZwf$KH^mayHTSI3VOITk5ksUTqIc`tW=n?%h^2;_FQz0f zQ*Gf~08^z7U`?7QQeqxK$Y z|DV(7Li-jptQX%C@@*tc-S4`Cqp)8SD|6wrEB}&xt2VkEHPFXx$Rz75SS8P!5b3K_ zO|XCK?iHJ$TV^z~@8S%R?m(cm4a+6l38i%p8auGZDJ|J6ri%r~47Kn0z~4-%Dqg~H za40jcQ!BlO$X&Q&zQI@ydYViC?L8D5{?k~ZLhV8No+S>)JU_HIZOmKMq9Al?`g`4Y zZNbY+$WKGy5myGV7^ld#H>S7!=bnpH8*4}eS@VI~_j<9|4gbL6H0LynJU7UPIwf5o9$^1IwX*HY|yiSq-f z&jmV6h9(x9?5I=YiUAaVCl_|9d`Pa$4rC=&(N+lLv3fl^l@7Vue2XxyDaYx62L$cf zdGrU@Yp}oPwOqI4!h2Em(SC=*P!ltQc%s8y*d_wvGBIu|G)QldoMJ~z_tRww2>t45 zRc#G_T_Uk=V1f(vSlc=|=Ke@+#FBdbpSae`woar;Mv%~{VWCjD_amC)G7f?g8{GK= z0qiYl?ASafe-B+jKvM$pQ{u<#p2ng`&biq)o+e^jaF({I#zCt+FT$fW)Y+Vo+_8})MdO^ep_Qi-7JO#M! zK7;!-G@6$&0QBNhMXM*hC+yFwSvaXLW|L)k*$GR-;Te-QZ=Yu*p|p)=<)m(En_o2X zy_M(ooXl=eyIA;2R5^{=Cy;7}m4nM8D+J}J7*tj`fq7*+5~ufQlTIIr60 zK*hwSKD$Q2)yxM^rAHZ`oDS?+H0FGtqPb8t{hmeUTKR6qvNX=kUg5zNVwtwBjxIP|y>Tae5AtHsGb0<=jknz;eV_Ap2xDjHX zh(e4o-xZpfVe@bX3xgr>{NXe)v3`_tS_NF{+x3LD@c4J5Umtl>wmv?a7fj;NEYd+3 zG6)#U9P(M0unUoO%9~KSWEcy9kHWaxqgrNi@44XScKt0ACRz zzM0v#1L!R#CFPl@%_CecPiB_w%JM+NHGzzoE%pUA6t$(w_eKbH9}WhKT5YU>f&5K% z;R}4lvmU**4T=Uq%+`4{85fweeOf82mNhVHl)U$G^+jH2Nrhq8ii?X@) zHNctXrv-gx4C%`cqk|=eFHdVje7PXn+OO+=S7yYrP_klBvL9pmPFxW6>EHUm`65~( z5OIB}+V1Lef!-8{^d@LfbYTqsZHHm!OANsZ_1x(4_*hJx#Gyb6#`)9-5C5%vx_6HGdK^m<9k%-Se7P%OFMNJT1^vst~iC8b6~hyFka3N|aN2 z$8ee*q+{K}zThp`rSh$8ECD5SAoxm_na@o(TIieHCUzrW?WLy}R<%ub@rB_s zRPo!YxWnmBQlC*Z`GWFBmQJ$E{L=)BA0~OjC1_h$Ph>=mIcFJ&(@Z3<PD zb~M=1O>t-Q_~M#+JmR(a2p#_Sv|a5dQqEl8aB-J$E`e_Es;+6V4rU~#DLAxv8s4Gt zQtY#T&{<8}szFi));WAdQLueD)oi{?UsOf$u zVP{0Z*;}A^Y*3sZQ=%_^v=h)J>KVQe3qc7@vPaZiD`w|+d`d5dt>mNoNJC>I`V91% z>JKX-@u2);-EFQEQDYF_FM#J3)hkI|LpTu7JRlVlC?jsv%D|6cxlGMZnZ5(SpE3zV z-~TXP{4>fE-rJX(!G!_SU9?$Go@W1i?Zf!n!ro?14r6DvGDnM&We|T}KE0+{k`}&_ z?dyO)NYn9()7k^$oVPQk>oM!|z>@aiTv~L)OQ0~nlO!PD`|K*&*U?x#lRnG{;++x6b1tl+2`PLtYTkSTKExkNsoxy z>9_ds0*BrzL8o#A1MK(+aTJ9>7BAfPlE47iL~8_oJWm1TJki9~yUA!heI>9c$!@p) z!s0bG0l>+3;j(EWP>50^l8a1+$O@I_heXI*x2@b>e{H_wCT?`X_@MEo17>`Y3EPON zaji(5vmayqks7m{)Ra`97Q*+5|_jFxArThRl`mneYNXYc*qi{2P~Cct`18- zzV}2)<2E(A`42$ZBSuG2IYCyCt6p_pGplU7brY01@>U1DvVTEDVmJ3;;GJI+X217m zu!Un}3)rYQiY5J!#{9xd7R>%D29Ikv&hN$K&CWW!btdMGs1pZ{7ei;3Ebl{866Ci;h4_RP3fj4zEr@ty-qZbGFn9gJa&|NKNGM z8*$;JnXmoMMH4c;n;=6H%Nlz;$1(Fe(Un!&$Hc5jN}EJ+77)W#26QzC1atG9$OwWpkbbbEM0>Y(k&xG?MtMSK&xdxUjr*Nt~jC4*#chmri#vqEb z#HzW(Kt_FQgJqbDX-Y>Q2=lzG7e%{y`5|87?n~o8~Q9E*3#RAap&O zUT5w8ITt$WZK;>qAL_haTc&jX=d+dc4O@QQ4Q*!5%WhpOKuzjL@|&4-q&NS zL2oXn>S$i@5U+auUXzJfIPL*(J3$Hqqp7gqgft&XaTWS%{h)hNcVD#V+$xs0aSt&e zm*`xZevh6`zE+{Z(M>cNb}|tU2meS1+&X~Y31l_~9*XWiNYZ-MlT3aK$x8;veq3__ zx{XMUP`xKuppx^;HP&Wn*iexwc(v5)jFgPw)Ox;?Vihu56#m zX$T_?Q^SAneUDP_y^Fl%`fV)Su59;=aajHkn_+qa2;IalSq`*P?)-6SX0)OX(MXc_ zwlGK3GrGnH2wKMGkswPUuq`o}3PmmVt59Y(CUDmc}0i8qEF+_B3a|k1) z_pjVWO7r(?ql3G-KKOcbe#ooDr|M4mJX{ekboacwm?Nd!a{wZDy(Q9Zeat=#34QZp zsC<|-C_Xm?>>)7}%V{z~X4 zX?@Mgb=Az0`cG@fvvR`^LBNSN5QZ|SoM{ratmEvFsqhNj9-Wm;;bjZED8 zJC&;1O$seD5Z=o;_Ur-W^w`-1(giJJYs**>L%;C(LJo?GfmeRie+}lPp+iE(_CpGG zBm;G1wdyIX{d`FG8&C^(h48JhXn}vPZgFbKu`!=xBly$>v`|lQ*Jd=2kYtCZfY6_e zcEt^_<~(%f$y4UZ!?XwdS{*#}19C^t0ncX*U$DoL;M_}j$6gnYEmsj($EocY>N&OJ z>vyq7HDXlYjB7r_5T``?7lsMKU?Al_-+aqPglnr+1y6@xouXn7kwylD6U2Gw&MRx@vI1mEwPNh*tXN(+caPW^9W$!e}HX1Xf-JlSa%x5qp12Rwz_&n9nM zMA4T(KxTdwPabS`R+QTVp95?NVs0`p-KK7`XrcZatgzvnol{o#fC#=~3n7q4kz%B% z%89xf7w6>yRH>AF#_|I6dbpbrPtYw%=BDeh*wuD3OUB}pRy)rym(ALX`A)rTe{oBg z`tm#tmz~G$E|5^pxHgs5aYM^wtAA)pR4T?5WMubnC`s<2rc8j z{%-Pw`KKfshS4=pvc=RW#rQ-pH#>dt&$g2I<^Y|e()C5hT?4vlYRnF=5MHy9u)9Vl zmIe^`tUIjI{h;N2zN`&s=HOcIXw~GHK-mko!POFK7erv?l{S+qu0ry_ReM?Gq~hRv zJj*@;S;I^Gd?3@B?HJlNVl5vb(f*0$9I~Oi`7;7D%n-lynq-F>uz`V=L8i%B^Q+JB zi%(w(XB{*9ww0ybZ|;4_Lo}{z_#h=jtt8aTJ!QLjdGqyaR;APYJysw(s3!uEl7IJ` z8ayhVpwv?OybwdL!~2Ztcj)(kUN_g+x%b#+i-O@2gt8s^g)nE$1GSDVt@wD;9JdjY z;B`GKwu}Qi*!`5ey6NYOORG*;ih)8Y@!b0A{6lqQ(XV^nF1Zj{xsiRKoLX5mwxoD} z%tT!V%IXp5I^5e;y=iJ>Ur>F_t`i3u;n!>c@G~?=u$k)A-S*V?xUZ8n+0&>&HUJp- zaO0U+#q7EZ2An-*ebv*-8Fr?iEaIr4Tr6a!hlqUzA3!eUJ z>~B^ZBrQrA(eV2d6m1mr%>4QcCh&S+DO!KGVSjHyC9C5sq54#*W;4rJw{Fyu<2c7& z$!q6p`9~UhY8B^yU6;CczPY7xm2SahImwv9>) zl~>KEvCZNh1EYAMJ#cA$U(!6%aw%`0Jv$<=8>j9!i)=F_lU!*n#6kNEA4Q`Z)Fv)^ znPwgddtB_;71BzivB>JSqn)(3+Xc4aqiz?{#z6`bX@qsziSjIa4?RXzta}GFYDuDhS zXpJs;H4Mnou#F7CpTg3XzQ_ZYiaXY(M;ZHC>o!PmmrR zoyEtHi$F5Jg1C6L!?EEt73pgadUi!4EU0PPG^c>abWhxtv``FTtP)7{pVy@mQY7}k zyw^9LPo<0)e9Mq#etu3D$jK!;^fNUV(|BK6^ShqCnUg>q%bySFgn@_BkeLVOO!%@7 zct<1gf@(w?cd<8Ro{v$MABZ$WRp*LQ!38r9DGM>w#K5z;l4}EjvQ$gah=PRDLkYlP zOYf@;%o3F&-&9$fd~CYbm*e(_hU>q2Z#|U_F8>MP{BBCoI%Cy8yFS&w@EiQIW?z>o z81_$H)!uQKz{D4mIG9ko4_BMu_Ew%R?98~N#5+6lRvE;i^>f*WQ&60EnoFL8xfp%4 z7*FPaR1IoM78yOm{%*9R3^WSicU0rQMNI54b9-4i-AlAQQtSKrs-%PKlLqqhOOgo) zTH(0)8g;?uZsHSKuRQ6N*A}T_vVgP$VZrVzqzX$o9QyacleWU1O3n*NArZlli+bOv zNqo>VVMU~Xm!^Ah2{9Mk%~x8G%OS9Tzf5y6A%|DQ&kv3;(bL`T=q=4j-n}rIY1_yO zOtoo$C6V0*qWMSmFHl3QEq7#)jCZdaIc{}ZK!kH6;9ns z1jbX9x>uZaoqEVf^t9Uz<^aE7qL-xX3Ma@)n{n;{E~=#|7H8v3vF6W59m)#Yzsft# zci~U7%8|~Y_9Z@dz$N*JrDb0q?A)FoG@iv)e>PT}VU#YjSxYolW`9NNKoS+tpDd>C z%J#yLK&M6^0Bn|%%x;PYu>9d)war*`&d_3Mea5~?ONJKl5G(4Q9%SW_qH2aYi<)?f zs_*g7Q4_^F#l{iElTMoM$o!nBAI|+pIqf>yIZR)ztxkc2JZczV{tu1Q&mAsu(%L^X z?iqysj5$%{2oQIY8m|cx~~H#KWvNXZP=`9s_3dCzCYw& zCqAuTF%XMU83_m$HTN?S;W@PHf+Pb!V~PXGx2pi0GJO^+um|g!Sk%q*3V);VE~vtX z>g>|O-nwE)%5mP26t3R|Hq3~8Qdkthz?0|3c#X#K?F+Q#Wr$wqzk&cN^i8ec`^9Z1 zHlN$y)kL2?H#VoL2(*6WQjG%*Tu`0KIj~Rn8y~LUYcu86> zri?9)H1KyXjp4-D#j_?pe9+dGT8Aij|LRHfP5jflIuL5hS}{Q0bh#$nEjX)BluF+rhI_|}_#0`3w!a#I#o86U%!rT@MflqLh%o+Ax*wSbQqM#M6@bj@gRIfb#j(Cxpts zCDWQgY*ZcAgvs!Q8fqvRTO%U3b@!$oGNbXBA?TfP&2hw=9uTa8m9UgI!YGTt71C*0>32a_+Z<#f+U(kd4II#OaCyN41}%r2|2#DJzNMYTx2;s^0>N9;D;6e;D%vZ)hH(9F%n0+Ng?CNs@^ zS`i=#ecuN0UF^cy+qb-X@Thml3otIjjI0PoaXNYL^ARR*-=`X7A|nr=(zgA+%Lp@$8Ge4HHiNBB-0eqR?Dih~(a`DHlMq#BL!X;mXqJrKht1Fb|*`tqjxr^Y_4AgVBEm)?U=+a*rjDVI9TBu6DJ2UjVaGZNB$mMuCs@n?CPBN%1LUO)A_T$T6XFkZewUn5{i6H$C=9mz5iT@pi1 zjWYV6NUcZ~Bf53X5J}l?y-Nk(T`PQ4=>nw?-F@=dl=8;umGRW@3BJm{;ZFIWkM%R! z@jxSMy@Oz8gHagGGVwN~z=+~lDCX+$@%EY5pjE+Zn$5j`Pd^&fpl?d|Y!(hm%jkO` z2`&H77!Boe+t&KiK|YUmjm0fRy6W{=B;-`p4Sd+ujn5XzdNc#=*k8wZKU?Tg(0*5WRkcjiCgmBg~de?h$4;lMWtNS`sZtmD&OX<_C5O z723EX3k0-4ZHMHtNlU6>kD~FIby8{eT3V7Fyr_Oag_Vq!vCPj`UTq^j)0 z+UttNJ&;A%|Hgg9IkS6!ER;A{%@9VJ)!|Us^CQEx16lHWSODjeNs3`8+`)J|-Ncno zpltV>)RFj}=FD_Sc&6oR`|XJg2`=Uz+D}J{u;mb4-TMQBX%z|LjqGuPg1PY974ceG z%6p4ewrnX*BUA#!@be|%X5U59CD+F0f%-e*zJvjPNFP39wEKJ8Z(sr2hL)DLF`y{Y zMy$;sczpSeilbqN`tIlfpIBK62pU&V-#pYn}8LA1Q<$(hm0tJDmo4o@Knurk~U@xW;g>aO+SWf9a+gi7f66?FIXQMQ2h zAKbkHGDl22z4qeDKQvp%`?5oF6%$mQ@xkfsD$^T_!H-*W1841VIabXWtM#h|n*4U9 ziQKUPGXGsPq(vA;KnM=TZw#mUpi|6|RkH;u%IFsd& zdojObB{m>FV^Dkg)kmGJP_`z!xWBWm{&GRLI~^15)m#} z6y<)90NkTNxyImF@4yz2jzbFZJ1baewzw;OI+9Rf#tY;z2!Np;iWf;~YBn1fY?)0) zYl1Azxnd{#WSs&N^DGU)*l0fSf?bV)O_&3HIp6$zt-46MoBjCVvMvJo0Vimu8)R7Y zu`Z}$Sc{oz;$XjG&|=Q3G*KMe03iHwOq{`dA1(_1@c>8Y?O`Y>(cSb`u)6wnC+2MY z>J4D6Z^~h~3cPZE`b6;ZCi|re*jklR`v=Zg?Gw+#m0!E+MHNWZpteS;Av!5eM}S`M z-9!sv_vwjzYsI!g*zdzBc*oA5?>{sVk!H4gL8l2GR5h2`eVOzxZ+>RVzb`zrxGSXT zs%&W`k6%zW91j@b@TtwtgWzZZGKfR zr1X1a%@(gCDMTE0qD8&ih*bBq*Pd38!*e~ac5%GfoEJQ}>P#qfmd@NjigCR&q|`}j z>TM3q%G3$}s3?-D^Okr>+|^IJ4uOx|p!T!Hst0)iHwudu49PuxZ5`C^Fh!N8I*3H+Ynm+e4;Yd>W-*1GPc&cfA*%1$5wj%D9X7p8s?mnqPpxW?Vi2b z5d1hKOg8_RH#+9ajvHrK?N5Y|*b2b^lrqx0Lk?8j^_n;gwBEFnfyM3YPfK$A&I)Y33k|i<6{mTEwn|S0|!!E*TT_IKTR>!$i81I zaf~b9_^ZRFYPJA-byj?+&yZSjI(lT4^{x*%XCa}#F5t%3ducrpdOGRo$~rljuJnVd zM-`!fA$(Q^(0AF4Vqk)${sB&pX_VFq$eLm$6rGX)^^}fjDcqv*CooIlA}Og4ubl)Y z1_X%3OpjN^m|%_4p__JCC*@|{Taj~?ML}`;#x7%%&-VsRDvIWR#3D|Tu&~RmYlFIF zVZ5+@iq!$9OdDKYY%*<)7gQya+!(|c$jvmlslk$hn0Oa=dp)Bv^zUg)1Zr=iZ_Ynd z8D(PhP$7U4kYa9bHF0(@b?@oV+4f8o02h^A6h_76T|^@oDBI`RE2VQyB24W<>RDVK zx}x|lIZbcv)O9x{y|4*xYI_Gmz8aP*)^WIy-YBo^mKspfGMe#!mB%ji9&XS=S{d`B zad-M|2xf^J_)e@Q7(qPZw2(LjyqYE+v^mC~AxR88ApI#*oSGahbnx>F>iI6SdH4`6{v! z9@c5wJ^cbFNx(Fl?{snWnj*D8pI-%`_I_pq>t}CX6u0;u*)6kAX&T4M2ku|x@QZ&zOB{^EHY0H2qrtr8kb#-Guo}b~jX@ znR&xs{`U&i&$gTuf7si)yWl@&RdNz|S8?at!feKe;}yoAP1pk8!VWl)v3;*LPs%vG!F zTh%~&lYPuNRz--VC$w~Z2s7siL(SjvUV77|M$-P7-h0Nru^uljxHYY0=J^L$T~q7b zBr&pi?m)Tbq$xA%v^pjkj3n(XuZILzW(#28Khs+^^2LI#u+CMSC&&a3@IhD z-AL^Z5m345k_=mY!@Z=en0|=iBC3c}csd^wV-H-ERnh$=)^FIU+qet>yOunFBvKBX z|30VoqH1B5xBPN*IvOsymKkydX3VOF6WVy`w9_q1y`7$A5@ilx5S>CquZY+|5T?XZ z=9DeDRjz?Eqh$fy?nNwEff-~*Dsz~%i}Wan1w=JyRgz3NGWtm$LVAbrFB-HoL5lK~ zFSdW5_j>9Cg0uJ|3(gN<_bR8W+&dan>rG@{DR4iIoxkHzZT_|vkvuASbavyT$M#o` zes;47RHrfY2d@1en$)9)*>GMx`kOJaHl_IhySTx}6XH$ilYn!k$9z=vZk5i>+8ucmRwt(&;b5DDK40eML>}_Fmoo=6ru+vtIc#0klXKcWm~filWd0}U9kyB_ zUOeOcfKH+()IqiN_tBl?ZG{?Owy}`HnPFH`#@yO?*w{k396{JcytLMGr2u!TG9N$n zC!33F1DkoZ5=XXe((c!@81*TJEE zhE?x2!??Sq&f*pPTU(>jV~$1oRzo1~x#PK#3)SM3jK)WB0Ko3E>*!9w3GUXl^;7>x zH-7(+2hTrJ_uA0E!B|3t{xpX11-9J&>~BSQ2T%f|R3Z}^RF2>HoSGI| zGh~vJ@L@sW9_Qz}*;j=ShI4_tEBb@q%e`N{7m%;=bw-cmz#cCAd3=4|`5zk2aGdeE z2-NBrixZj88LNA|Z?&!JR#Z?8Ul7*_yFGcUWa#}4eKoun&}86FLA2;B+9*qZyCdS4 ztItY%L`~`G4Xt{$sOGn-x(RcTtJZBw9zm{~d75gGb2LHa{WXt#xdZ*8Rg;IiOxHxq zOc>k#enb9o;8^Vw$az?AgJ!Tw(?%n2)mlkaqH1F^zXZLz=8?Qew`<$&q;kMORYI0c z59eQPdPzXHwa*u)Ci`6xf_U|o)&UGTKwp2oW! zQ9YAqS0M;W!3R1;@jG$dSJJ;{++Hprxo7eCde_2oZbZ8=;a7=)uVs1Cnt#}<4PD`d z9eOHDAwIi2)aA$^)*5gNq%QJ2x$=3IV7xw2o+@v69QoVwUOP|A!27qU3)srzESgJ2 zwpq1jRORdc9N+)TcmHjQDV-LxxpK8DEUtZZwv=7}uM3Sd#9UQ@YBn8ts^os6kg3Z* zAXm`J%X@yeyrI*s*^ydz^|+9u7e;M$Np0OvJG^w8Lww_&n(rU4r__%`CaK?F@`Q^? zDrlRB?mGQL^NmJ-VaXw*5ApO7x#_m-|X@M@u; zdoCg2_m4t!Nhh);F+YsxK1?&Qv)j3QbY5q0&iym@T<$SIMRnP9V>@l6{ZRVdupb6k xL-NCL=ZMg7jOFY|pi8Kknb3Rh+Tedx+2iEzX1+onr$1qO_iLqtG8Kte)9 zM#VuxML|I&!2X1RLqbSKN1_HytA@8wUpm87;3M&o=>Pc8+iV znFI<62?-Si^)njU=Wi6m6yN@@+j}*|Z0^)~M1`_}U0}TrU2M-Gi3kL)9A@~>$iv@>G!6u?;@afAp2Y+~+AMts0 zluA9*?1tMH2)Lq-RLTLsOAe!ar}|zzYOz2X&V+)Gxd{HF<)i%{JpcgI$6Rn9A}Xx^ zE%;c-|6a_0MnGXfQ?S8cizveWM+=U_`w9T{KVmExEWmfb^Alze^nb%{CL!|<0IaHz zy4K8(jTX+2v96wcz#i@dN@B8fs>on=TDKS*Ke`c4aXj4k#}kLKa$I^~YS>p4a}-I{ zrWuB`OP)E9Ypa9ebCR#d<2RfB6aY6gWwMrkUk@zXhCaw#Hkz|Z^}`rF2@+g9_d|S; z$bHONrVGD|Hqset<+>xsB}A&v9vBkczSey97%UOu*oMjplda}$JvpkEDgHSSd#Yi* zof(JWqAQTLZm>>ixP z)dFkh;Dk9yAi;_k+bGCz+)8*4E=9KQMKknSM{=1CwI&^YqSj@Ygr#I!gG%6seEO3p zsXkyn*Wl$ZqGPPi`PvP4XYp9`C++9u&Zgyt{Ad=+=57oLpKO@$NHpp3Fd zP01!to9s_z>mgg-Nnb!+SBv6Kc3a;$UD^v&VZnvZku+0G~y>;-yR z=0@>Ie)q3d(M9#6N1Loj7M(Uw-eq9rrj7TPu033vU#t~x8ivQ}1qH*ii-rT}4lI0M zTFkePhNgwWFoVed|3~l;53BCrW;uF-fm404q$weA=^gOgRdNp&T)`hHfS))3C#L6) z+BA63S?LUn$H%(L?i0beM>#QY&>S65_rxy7YbN`&n7ruF?U13pjMf6+{AzW7Z1Ap{ z|G*3jstY$_wC|j;i7wcN5(33{C3+>>@hu7((fqvpE=gQsRW^8}TlTv}Frf*}$_O2e zkW?nGdURL0XaeRdj9>lG5dBr7Qth#eZwjEPCQ;X8<;n3>abCQ?F+Qsku31?Cdqn#} ze0g?=Y~P$roPZ$iMvcpqkK(KSu=usJW|DhCHp&+Q?Z>dW%8e4Cbs-@>$b%jddaF8K zy~NtGL0a~i?D{*vF&bi5GvV|ONcNE|_KozlGMU!y-TI@eTGxULyw}j+*-V$0=xFb_ z@*2&#dIuD}1NPnlmV&`4SgsVmjDpgUkiOv)!M6v4vdNb89(&dr4?FHqBATP?{!I=_ zB0>fz#r+O_eba9$x&-Bmha&fOYho)a+ZNjJ!_&6;cw7`?ymq!W^W^6{5TE&>b*KC^ zc|~;{)+vD-Yz4`h*kZied8&#ktQ<`cH15A0%By*W^`NcVv%zD7;J*mG>Dr>X zH+&4^Mj;U(yRU`VwR9sW~_O zib#>e6~^cO$3s?6BM6OsIc#jCb->5HYEboNsZ_6wWbBkY(&_+6!g9oO5&U_<-%v51 zNlh&9#Dw!-4bguyQ2(tTsTQ>CFo|m66z!*y(E;`?u*7#n-=9A(8TB98pjwiQuV6`DDSygXMAUqhFP^tZK03-HfaGD1Lcf>Q%-nvxCs zdHqsOy#e6xK*taL9k9MYLv?{J0XfrAQXG*=^qS;8Op#s##=VFJ=JbnJywm&rA zUe#JbM+c9_5D)LF>D;=uRr)>8YfRlYUfp5S5DO<- zoBq!?(3cit-Auv{4vl(rA~SoPw3oqyHAqiT27k52;bpG zT9&;?AY-#fbBP4zxub=Q8RZ+HnpyTYL?#a=@)uhDxma;8 zoS5kQ2w}xP~C`;C6N*H!vvjoAfTUQyw%R>}H{DJxZ9W=cMCiue(8lTFR z;6&F~U~<}eE;b>>mFZzl`(;y3%kay&*9Wg}<$ZJI-us1dJ)RDd?kALi2o!CTZBk7O zUwYhxadj&sqAb3S>-KC?b2@x^llk%kJ^utG*DP#X?xBwYQ_bAgI?q5qfKpDi#EhKE zR1y4=6jqB%uBvy7aPWl7;vRV&T$<(^iCKOhCi&#=w2}An4){@BtU9dXx%NHvB}MRx zVaZfTMDAPdYjL?ZlPwv8z|To3FuE@GCzUqIlsIM=wP&@9r%~6yM&s3_sT--`mqz~= zS@Dj=oV{zku8;#N%adaoc=DIJXvTFGa6@J{+~i39yiTi$iQP6^Ow6Yp4-3#C^dP@? zwryMP+}QFU(r-SfOWdy)>S0my#)CZ*QI0)0cisexOMNDZ}wn%pk3rpvu9gFol;9jSSk!-nAAJ6;9+=P+OHI_g_P(Fvc zY?4-E+1pX^N(GW!xwUtt&THS~Py`9?NqD_T~xXm;6eYQTjJoDsv}WMr-l;tx9VQ z?1BN-J84N8Q%O_2tQFy<;BqA7(SgX`bJ&h1`&kL&tnKLM%8}PX{}xQKM+|P_JUgAM z<_X$#DhoZZsqBpE9&nyy@ZwaMzQKVgfUe>zUGVJIgX33M!ctaQ!UaaufCHOQVGQ`Go+ za&c6;M>8H5cevpW*e-gq?Sy`;67)*t@IQSA%-S&i)|dA&_>=DC;eRpAKWArKZQFdz z=dAniNUQj9^V7cQ{Uv(K4n~P~()$OF1IOEov{JY@d;IusSKR;HpI_|L6VMCccP5r; zmL|e6fpD2?I`K{#75c`Awor_iRYYG-&b#mgZU;|A2Xfvrb1Qn)#H~ZRmgr3lfcT9l zKn_(o3R6Phd)H2=FL`rw)cU8pm z7b=p!)}}j1jl#5|*0tMWO(jM({dV$?tdagff#|jcA~9W6##9E)H!hFr>jsAW>BH$F zZ_yeOyN=3ek1S}svMEa_>bIhMTE6sXFE_(@NKJHqm7$75LE~lQliGrF9RgCKH-(W0 z+sCHYF)GIQpB61kaa+i7K-B|hd89b|SLwPKXn*^Ov6JZE=?K&M(-#XQbJL|@*;BbO zPrZq~mABH-REKbhF%E9B$Ml$cN{T0PRTaoCpM1ioNsdsuv+VU8=f{mHDB&gzNkIxo zpQLPz^OE1*`-E=iUO`v>r6Nf7Q#JZ-*x|3c`xF7^EPO_Nvi{|F03=C`?Bx49ptYt> zYOBYfO`cH8o%mot;S=eu8*e2bVLUM#Z{4do1E&A@9S|tWhOomlDr6>JMpow@ANAKv z6chSxBK4KysV4sbjE`h73rQ(&NWE|{aMAG2k`7iv+myNgpdQ*WM4{f&dyza&&oc53mNR`TPF*Ch!ih|LSv zUCD!wJ-dk<0iW`F^WraO8|Y?rd2CaF&TD05$<<1aSx(*dq|(}7hm?j6AxBSiGIwGq z*;_;ttj`!KSw3{=WUxR1FeCmb_B>BuVY^{F(Nwse!V3LVFDvIJ7cqPN-Qq<{WYAQxC` zJhf@+-6*~bNQNfi#7fpv@JoxKwm%Q3%mntFQ+cH@OtxPy2u_%YqmewzJlRW}O}Kdl zk7^MdReTRs{=8_WTXNiCBfu?K5RwUPxnI1sRH>&+Yo~L{W2>hSr+FJvp5|ZIir9*| z*)~>Eoz6s=G%n!(?}=uRjTNq;e?-e|OPzmg{_>?RO_LE4y+6}&G{F>Ng!|d5otvi( zrj@URK_B((3w(#p@giEXXKrg#5_q@7d$L%4rZ(2{>$)uQPxSB!e1Kc(?k(kP`pr#~ zqMCBEyRK_H7~{)d>QI#~j4I>wz0S;y$T{{;<$VmgkXhc``|kB>3$Vb4XIK;4dH1Nl z=cSy{@i#d*I>1u|o#{c|&O`}rjEBdGtbSRS^mh;i;QtQH*n~(_08XmhzQIe{S+#+m zfRRKgxu^IiZ)HwvbNlfNLM~z%S-b%HwmkL*m;_393rD+K5vM{|vy2R8U61OQhe+5c zyCCd}j7uU%xZXoN-KHMo{uY^ixqq!u(>W+jq?REPdM5zyPj$1MMTN_4M-zy}ZB|ey z0`eQ9m|KuiyBDc3f(Q4UWs3n+HlDwWagg1%cAn<+JR9fQ;OFyiZ1YJP+q$mr%Y;NwZVMJZxn}xUtj`SbIgmJQ7l!ro0phZUT_C}`j3B`s0zeM@yFUkTwp8z zO)l1;A_4OacvB7Xn0ItFar|Ix+On{&*VdMb{sn5gT4&26wpIe^hQ{ zl}0HRWJSOi@Yh2%Qt;k}XLxhmje!F+u-rhrc3wU;Up9Mey0-@LE%t12xY0G`S^hPYK4OphgSLa4Qy@?efv)}$@+owJ>k}+wx*EYou3Eij z2z+``Qh)a?ZffooIQJ_;i-+8HdT`-!iD{%#AJuibe;soEEq>rPKmr_z_TyG*W{4}- z#ErGyfl zod+~6b8XKH{3n_Jd}o0f=Ba-g8*IAR7m+6ToSBn5)U0^9@B0+CZMAWeF;z zzEjH2c&N*V5eHwf-uK|&*@(hWA4L+p0b6IaM2q~)HC%m`zId0yr?YF)IO%j1$ zlWlBehNJy5`+iljhT7s~iL?JyHxeG}hOIS?WNs*yGiD6;-|yC0RoV6|?xTorVJYDy zu^a1ti{$>C(3sLdiswDwO6{3firJA_L*VhUs2@9E|7cxTA+B;rpIa8aA7j*4z5W!N z)cX_+=fsdZxlYQI*3p&!==G0_)-*~pW}z=&tt%Ckfl3Mjl+lN>~cS{|h8jGZ@5RUpcn@EJ^NJ=9hFQOAiac_N;pX z{(`%u*6GRry!*upF8!ZC(igDgr#`WbzUFDx#78&|6NbP#G$H zM5dK3<$^QcY;6_3sjN!l-u%A($(f=CzpOdNUF6U|{K5qN5>O{T!@w-i7BW;rVc}>b3_Qh7f}0w z*jl$##imp?6jD`U_i9U)KY@!qrPQl)Ff0YV&%(gZt1~HX@q6xZ-x)&4F7fyd@O4o{ zeg~M8T3z!=5iVmq#oy~bld0}kyoOW~Yr)h%$$;slAp&fS7&Wll&5hP+ zWsz@)`>U>rN4Gh`ll(iNqkJ=PJO20%3w%|~cx0r9*sgovjZ>`2?OOnmH>#(ys|4Ylp5m6mKaKMQ(x<{k+ zWV|R$71Sb6Tuta#=0w!J?0Ax5`^Q9O76e2N3-u`8b5j4Cj(n(f&vj3T)%r8pvLZMu zsHotaijq1a909F?FBa5J>rPQ7Sk>$V6GgUDhm8sIQq`Lkd#{-rO zqos?%@+#CXJOtZRZaH&rBez1Qbk$&>+z2=Q8Z?H_5DXNgdq^PL%x<1eUuDUNEzkqK z+g{6OkZn4m+|PxI)q841VwBEobYlMNrHbR7w zgTlqp?wK-z6Ox1G**={;!+*seoBg-wPtg^P+C+$9ouT4MvTTRoS_( zP|)V8B+0%S`87Q;q$w>1nr7Te+1jf9d+5YjsMNau@DiIF%{U{s=J5mxsk554)CuT!)j$6vj=vk>F64JDH42I$6liw*W&1abD9pvl-JkPMnN{q<09BDFn~ZDfR)4q%=Axy8#09ylY~`gs-&qq zE~`fYzhpmNT~<+1k#&0V(lrtU(O{`NM zi|G4xu=Zn-3~BDjW=N^2LKjVra)p!~P1_Sv_jUbG{`VwKby^cihDWZk5@ua2n-Ium#nA>mQ}+)ED|6it>UyM)Q0wIQhc;tCB6~5qEq^z#J~uP zr6NRpPPQkaB1;EiX4lVqr6hYX>v9@&ZA>;05jAcXrbU=Q_m?n5swae;l=Ssa3pcy2hPyQM%o{3chc~g z?!254)41nISz1~RxX!PyYiq7ABzr6SE}DNsI-3BwK!@9V#ZT89ytVJYOvYN?k*B;G zK_R&Vl=(g-d@hL_;w=PjK8xvB$0(M>vR~UH^8^dIw@buab6@>hOuP$R`Ex3Z72hP% znJNE;XGzLR@_gRtJ3gZU){t2ii+75{V6tI-3_9QyPZ4ek%}O@Y6`+&URY7K%QBExF zuy)C?^h}_N*mvA+Hn_+oEbPGqi!~K+t+K>;wLBaDc^~xCGsjGqM3Bcboyj#o+VjEU zpZ9#!;tT;3maiF$1#D)v^W$l@3%@>w!($I2ww+5t!0)A?L>giVnr6)JD7-HcZ+#Pb zYk2iQCBt%5lY9K9=%m^tRU1lL1Bzsq$}OJQ^*4r;@!?&QG3bJi7ayOD~y+F1I)nry8JiwNEqzm=$u6)S+xs^~R zCwTVzoJ?#M-!%{zSz>b)EhBf$`@}7Bt83-RwI+XPY3JcFZ*L76kV46?Dk){-8&V^A zVj|v6A8kswXy=dqYEtBjh7zg?q;sC3m;oI5mXC4#)=`t&&xHQ zyDqe(pSMfTf}1|KZn+EM#6zaQ^V16C4*?4eO0ffnm5Ro;Hg_UMqir!MPy@mpS&fpW z5ZN@{M}-lIcy6k7r33gz&|o)8!iZk2!^(K{y&8#b#S4gWp~&OZr*(eBTU5G1k{k~; z7S(1d-w7+x6?`BONlo{aflc#DsrwNFo69b3iIGE#4zVmow5R)3y~JppsCw40v9`l9Jj#Tb(ydR&9fk6S7J&i{2+35G*a|JT~W^*f;V zq%T&C!Uv>~-+_~LYRf~DemVi?>S&gQq_A~^fLU!t{2eLl2t!`4494*a0HXHHB=s}6 zVX_L{>FT678JjkJ;5dzMIvumpwzAjYDHI2?^;XqCJw%S$FeVx@G-17j)gAEH zHz0-Q=RYLq$0Z-P>lgthyzb0uFU!3a$KNS~#{B92 zE&086<>MCfia^rQayJB%H78;bJ^!0lJqjWdJJXqMZ*=A3CYnK;tII&70-}C}j0o45 zh~zkYQJBvMwkMX}Y8^|T(kj0NY{;ud`k#>`; z?vGQQJY_jNlcpgvdQ$!NBqpA%gOj!yra%<_pMVnFlbeDG*!kr`zIfMgSG1gt;U*XG zd-zdu`(DF`nf6YWo6)BB28F+BBzpy~t=ufkkVPmkO*wjb7afczL8lsL>f}en>Qmtm zEe=dGiQn4{D6em(|LQbsySr_NT?(w`LzYN!E3|L5;{=zN8<(feNSy#dw+n68lalo1 zMU|OjbRd3ofTQX+$=Z8`e8x)uw8Ac^^1eUQF>cMQ3(FmIL9s88uJkfLP*1K-Hk7r} zuMjP1@%5e#pm^girO|sNY6mnz|Ni2=JevJj(B9sh&FDOaS1?c`;DRSQY0$Y*g%fs7 z;*TZn#`f1s-so$(cwORj*StcSW zex7C17UG}EQmc5T1pdpW(!UPO*P#QE2m_5KOthEdU2@Y7%QI`q*ecygTyyzd$~75$6Wt zTy#<2Y0i-C_iyR+R(t_+SX26BTw zoMXbohU4M{4@BaSNOtVf)9qmlkB`U>t;pPT@?qqXvzwPGVl3lRVswV-E3ShqkU_B=@SwAsGk-4|%Bilk`!1$F6tNfVtulCSls=rk+6i6-{PhUkdI;g! zR@P5Xj?1WL35z`s*M4|`^cQrX zodv6Pa^Rk%e9UG+Pf5$>Yv1CDhA?fFY;~v+)R{yvYJEV2!uY_(S9gAJfOB<&=OmYD$&j+(>4aMM?PHcJlogib1KD2Da-1e>eqc6s{||wcrhDU_aS)N0{Ofo9IIYNDb;Ek;$nk?vF4n8@LXAj^7C}6I z5Qz|PQw51^F1K-zGji%BL7w2{3VZeL{13de%!OLhiKZmSMlQ1!KWd|hqct0m$l2${ ztQ`^?Lbta5%B0z5$u3>4y$USB$p%6NU_)JIZPPTr&1u_72s^1sWzqpF%dU@X_BIRH zZ2WDwD5R)q;suHSbrVUiItBhWn%DWHFM~4~=afLZU1(|~a#_~0A)3RHw@{>MqA?qVm_Q7zM$N&fHGpBzC31nm=k>)M){B>Z8Q z->+iljob32H*~J|;CpoXpDmvvN@QJI+NR26qw(?8Ec>TTFv0#C_AqJmC5tnIoM|Pm zZLf({5(E5Wx%gD8;>!jxrpsqtdK8o)3q$1qJw6zjqVbimba0XW!E7}4>W|$N%ec>2RWF?c zB=ND;XVkRzg^9FCWd2)D#D<7&h)UO}#rON~5JeX_SaQ$|sCn%`l}|Jgbk0SzR+-*b zz+c}YH8ju3R&(C!&ELQ-P}5Y6fT2xaI2il%i^Ij?!=r80@$7?}8i8@zX%fRW9_3{P zG)(-QOyDnc5R{v@b?~fK2T(1cWJfS($FxRM**pd9Io2z#*$ZN`8O$f3pYgu~j`5z0 zR|6&o?-JyQnTVx9YNBdDLL{1QOPQXs)G7X)K7)Tunkyto!3n%ukgHY3#p%%r;c-6t z#EOixLh4hA%pc|fXkm3Kqw7vy^GO-|s;9P{2o26zg^&t+NJHD^_ZRO4VphKVUxQEC zB7epi5iQ0Uso;|~JYqPj1OBOg5gpJVRlsG1E3_^D(jRQKkJSj;gO8y$RoNlPGS@bE zjIhk`ii*;O09-VAIvKPv|0QD4;Ezx~SGgp- zt+Ho(dEClc>JL{hgShMPOgl#vAJ5te?q;am$@mNWb}+{~K}^cx+@XvRXkcqYrxlT+ zB6J`T9ZIcZOR>5vXDM1!6k(NoPcmzqId>(xW1BfRQo28pH$4(E;$X(8wu`L>j=Cl+ zB0S(&Bf{+xB$kKk4j~!Y>KM?KwJ2mlW5J*9Gpyg>*v*uJ(XsYmQ9i9^CQxAwCq?qq zr4o%4-kjA>e{8r!QV8PgQYABSC^6XB5K&dS0!u-9Aa3yO!e0J$(r4M7LN`Ga&W`^B zvqo8yAum5$%{`4MQ=nU4p#Q)|PO8)jh4dXj+5&s6FWm3@4j@o}2Tc1e)j*H>ESGRa z>-?3pi@ZH%#S@YK(R&nFPx%bFE>zu+DUjc}K0WqtCbW z%S@EvPTDo(6>RKR!4XGDJSjv#X|QVJJUkL_Ed;mt^P{(lF6?g|prDE+Cnd$BtX$7L zYpp>IPBqhS7Bl4*pbw)2T_ZZ08?AY;P$YEe8L@k{ncKJYR3rLrUh$D>X5FF@RnWkO zOt{q5z24v&^j0glb&)REhy&V#4#vkEQOh(To3E|Fd@D|ZH&R!mRnVv}?2N*!xtFzE=;3hEqoT6>X-{wvSlkp(R2^6yUV7+0d@h`B%r>-bj*$L&q?EOJ zqSPEV(odocsi4?iFk_9SJGdxDay>+3yzwL3&KcFhfX88O5c5?+2_>r{VkX~JE7Hfn zBvSqr#lt!~B)487p(qE>Q8y3us;nSsKxJ~8YM}Aon}_owTnTEb z1b!uxi&)?8mpdU(4Dlq6`qAgnd(h^%t*Rw6r`b?>;SBjwsEE_82CiyTNZws#R$<0N zwUDIP%w##)CHl=XP4(9d%mIr*GpUg;FTGr=3%%RQZ&uXO(4GLUQI4N=kmyB=Iz?|> zPQ`Y_l8g`PMVE;STek>4{5BFTf%$_~}RCh8H)7nJlZQ#cIW!hf%`;xm3Yb9cyGII1inNEBnj$ zw4C}e#Vl>%Cv_dmiKmvSdyToGsv#=$FMAdTzdKPI()OKOE^YQ|9S99@o#?+1$b~pO zz5b0<%+9gBlf{1raP<(Z@ZDni;Iyo*8XXI@XpilY_V51PJ%bZq{$Q%*yKg&ffBz2B z*VlH;`|sH#fk*T0cDPU9{Q5SdDI=XG;- z9L6wLkz(D*$y^U~3mNxz%Mi)&wMT}!Oy(ck>S81-=A?s{duoMdvY<)N$V_S4aJ6n5 zYEbpG!7VUS1)i`>u)}6@P+wgBq#j;Rd7?jB5MeXl ziJ)IsM8y5Gae3-q09RxR&&^TWRIgx6RY87ob-B(w@IDKXyLMB#|G3gLC#Imurf*8o zJ4Khe#o@6~gP(Q{1*>x*$dFDmmBZ!N0D5Xx=!DwUL8PU$0-glin3f2@iR zvEPa;B??&r(uGEox)XMQPf5LM#?zY}>ks8(v39`_QgOq!!QO4n=*ma`y_09<5(gG&r6nSOp0LgIQ&i{UMF+{XYO7)+u3>?z zN<4R`CtMYn5}2|P4o3&Ja)~kdfXtLQaR)?#M_*95;Pg6N6w+`SC zX4@951|H+e>6p=M)`Vfgr6~F`S7ZF` z{q4EBHq@eb;Tvt<3lBjY8XD;SBsr?6M%-wr51E6nsuO*m1(aGJQE0)=zqmQ-ISa}s z6Yxw8DGltw&f?!j%~PFWKL}9kdPvYc#_iZit0s2&W%Ej19=b>Qgsb1+kEKX0ThxB6 z@7Wbs;N5f6>^mM8rw=gX0^@2C@O7~AhhVYnZSiRm8oeLTlF*r>mow_r*ySZoYY@QM zvFa`3jIH|^vqmH4)9w7JJOM2PRllqYbNy7PbQb?^A>hopz|-ubTG+{9$D_2pB#m0` zJXRE(%Eu7TNHkOQ3{A_OqQg3AI`IhakXlR53ypY?*~=>GnUi{GT42|~;#*H%1&#L6z=g?bJcKuM^kp2|a*LhMd^ z*ua0%DAl{}Q^C7t^uUs)Y>Bn za-hb6wV<+tN?qQ+ac0CiH;yE`)Jba)KVd3b7ExfvIM%EBdabpVfLb^Z8a6nuAD#SE zQv8B-%C*v4@SLbwUTk`2jQ?fs#G$K=806ty{>&3_@|xVlk;pn=Zb?BI z*)A-t<3k~}eoT48{mg(3!XrSjK0=DS;==&`{S#)MJO0dBAkpY>h^=JgTsP>+O+eDE z;a5jbPgRyU!cZ;0=64vRsjbUoo#N4e5FGfs{pT2bHq|=g;DI~R;fsM`oA^EhhljjD z-4o5ykko0V1#P}Vs=F0RG52gQo|f74jB999oEv;!x>pjd24FfD8JPnUil&>c{@aR{6o{V1)5ySc7>y_?Qd8$R zKx>^6L1b#eA}Of}Y&C@SMTqvA@xE5Ts*7{AdL8u_2?s(uLYSty%DR>2P_A90Vh%2UXhLcsy^oTvPK!r*&qX5t)O@aV;)l-m za-6M=VPmd;<0U+I$U&NFg2xlH89n(Lg+yK$sod(2eKkm$b6JO&hZ1XoO3sMd*_>x1@u0!wFP;x-X3?f$Jg~a{(?h)RJHQE1Q7=HmbrV>A zGW8C~oRch&RVa=~*}?sE_$YO_4viu9XlNa6;OW%5#Pw8`oD4zKSmF>Y(u_O%+*S5A zdc)+>_+>XI?yU5%+(0Ibh@I;kEn?i0gs4(&1eORhr8J1gCQrDE zQ^91-Q*_%cJXl*fI8<_VI`cB#EAxlqW$Ki?>ETq+&mZI`VSf1Mo-rzM&NKN#cCKqx35@wWH#vfZC)lHJe>HtA zasp3YJGmUOjxHbd$4gR}yZz}#yL(MZj+NB3ipX*MUCM9r`rV~#@Vma!I{nEfI%sYTh3*1Q9O+{MU$Bvd;5aPe86gnK@_}cQfm}C z>$#RcuM~4Obg|mE7-4U;)I>ZPp&3+Eyx%X)H2O3nhFB%CXa-hqYXE!>Ew* z_dT#^Me>tW1eXXtW;fgdlXHTGb0RJ}9GI5t9grio#!+cp&;;C#5%+3BPifmY5jv(6 zuCppkoe7U0?4|_3j70>C*4MAi#LFMXa$TYT7iXlIm46NH{|m4#koVKEh8qRN!ymga zM8(IDg=k5Nx-iK^#M7gDr%MsUQm-;={^b0qex$2w$WcL3Qj=uPSTvEXgqiA{=Z3vQ#_7tFMc^_VO7 zfaQJ0ijb``!1YN^##Vdf`$vEyT=@?8HY?Tj$jpyP<%_C6p~6lTz;(NY9m5>I$d}Z^ zPI}ViQ@$laXdSK^wmu}T7@jt9-e!5^RHjOT`g=J~TA1kT*w+YJf%x3%U%}RC2culJ z;RF`T%pYEtT8hqEmdt)Hr9gODmMduD%`}5ycc3DFC9mI?6#zdZUtu$*LBzv{(Inx@b97Uti3TZY{ExtvTWD zDVlDJ4514j3O2xA7_r^uuX>r>60*{o2syIU6qFOQ#dTZ;2w z)HkI75<{n51I;oC_8itg2i!}+l{(OthJ65-0XvQkKY@_Ym~-qR3eRQF40Plo!kFjA zAYG6`yply(?2no4;g1(GBt3O%NSWODnpH9#{A=emD3ej*@fZXKx1LrNUAR2hcb8_Ot&aoi0=)AR$|?m5IsC@j&?JIjWq| ziyuujR>3PG#65C9HJ3(bUHyDlME{Ns{sm9Meb8jMrHpt|9$k=_+;+O!Kc7s^-f79q z+gp%qG0oF4Seyzc{Il%1rJ-ZUGb*AHmMF|pOH{=g=Z{&8Usuzyw~G8IrPx=OSc~M3 zn^Q(8)x|(HNLb$;Mrbt;yFj{j>`oIo)$!b~(YoudG`0|6h`K4`wY!hTaRd4DIlnd2 z5x&GM(scrHb5w%^-Gr@uDPFOiQ#q2@LD%c?Fjfu>9@XP~mA>vkzHl<4;r5tJWTagl zFYDqM4N5dDHz}CV`+Ge{4`Zhw-WWMX{7RFLz2PJDPhqX2Gyzi=0M zl9Dn6{zkvydvc$DY9}c(+v=C46CvbX#ecHq+XOzfe$!Ow*iCf2%%TfDpe z4{gP-y>S3>0oUzyJ&PEoQE&!UDa9W~E>M$VGGDI*g!fjd@}^Z1m66Nn^K@A)fH6v@ zJbDXB8}TXug(3*O5^%|fg;(eXp< zT9t_7sChZt&V}Ul=3C_H)7y8zoBBK8`mLh6XFnKZ6kpSlrUx65AFXSfm$MW*Uao-Wl#72PXwXg5^uk+|K~u2f`+7ed>-CryE%q<6J@OYg`z zIJg(I@CzRappyXrEox|>pfK}px1W#v(Co`HMM3wPr%exNYfB&&+f>d)!P?4lFSay2 zE2eUn@K?1u>YR^fQesBynb$m@osEnLC*(ySt8X=Enlfi9@znC+ZuDy#|H9SI0dbDm z;X>ZAFo@ZS_0cGH*n@$IUFJtqGM@q1`v0bNEKHA02JJ2bUP94X3N(+n+i1 z2IlY%aA`UxstcVqWiWE<^~TZElIxfJJbd+)Gmc;HTH#k5eHvMYNd1_WVYya$$bL!G zo#fA+-h(^M!H7cN{Bz;72=(5R+Q%3;^B$Fv#*40aaf9cMU1ik3H(;f85}SqDBM;N< z+~>-gZAzv&8UjU}3<3T4X^W;9AO9A$=HQq&a*HDq#dI!pNz_TfLH;R|GGZ+8t>~&_ z=)HNgAZ<62fU+Xu5lXY2>@^V2x>9{!`M-iSG8*hG4-OSx~P;KuteI}o_> zzX*G)sJ6cFT{pN(p|}?-?!lozad&rjf>WTyp+InVm*DPJT!Oo6aHm*pv(GtK|8ahM z-z970A}eFeHD_LVKA|vKgeXny&KgvUrDADHJr9blM}6Z8*QnoZy7IAUm<gnm_aNs=U2|CfEGTV11^7G7#4?U-#<$x5j(11qpqy z*6iF6f?d|G)mJli`IZYmoDS87%xy9#AFIUe5gGVxWgeYKXU#6h@L~Yk(*}>9qGi&3 zH@18-l$m2_ZxSGhnX1xO0a`hmKZcDl9MJ0>*b5}=8$JPrs1q?h^!8kVB1p)W!J7+} zqWHvMTbu0>o*lQvI5^8SThe)LttEH(e}I4re_xm%@Il|TFttm6yJ|MXzy&M%ydb*R zQI>ITf@QLkiT0Lja8Cby66ZF5N3D3un&TwKp0_@!#IGXE>f|4ALMCH^it16P*-Wl~ zcUMl5humIc4NAtw52of)KA*>6M;g|66wux1LqXWkKn+Cu`iW=Klf!cFh~1cX56b*F z)pYMLf_K~qd-&XdRwbsP9WUiZTkJqxO%g5%!*sg27O0R>yAf;UTAHk2q>ez#@~(tQ zsUN0{u7;&H;ZmF%yQ^@JhQ^dE-tbxG=hfmXSi5Jazxzq|qPB+m(sxTS%V6^K!b))R zCn@FCJvZIV+|nk&a!{c`?DDVMGr1xhdyl-mT?BPlT|fcbRIV_bx!-iJ8vp5f`1x2V~DOL~4y*+snFz^2b^jj1)W z5>HRzkg1x)!Qf9F+6N&*)u!i)VYl65s?nH^k1$^<)1KwVh5w4D;c&@oyqPXb3Pz;+ za;Fo2V`Ry~Tl9Eq&9TRXWfB*@m9Avtd4sZDKEd%z81j%lk9VOqpjegn4pH8x z_b6?7rQ9LnE3UZ)+{kkq;?89+`OqsZ+gZRDr3$%_vpsk z-sKKNfZDDZs%pI2^YFN^2@`;LHwDB-?8Q%AuUhOs7Dfyw2D^wTOjnHFObCRf^1+qF zL#taN0=-(1g}Nn>tCxr7}B2b>_7NwN>o=^IeSAHy8|MQSOe?& zO9;IrXscx(P1#FIYlm#SG_zTU^7loykEd$%ZkV=y%M%YQXtbQ>ySiQ5iRL7`FC3x$ zNva#^$@RJz-&m><@4TNg^SoHP_MgcOac)kz1(4v&=9NkmfXE5{0R{uD-$WF%3bC>j zjG?ngPcGyQ*kPsFZjl5!AJgOF=*Nbys!wk$7nnw70N&6wBWo(PZ+MQQ!S?^>jz6Kv zbY$K$p`J6--b|dk3;kJO9WEi2Co^8OD`Tx8Muc8Xz!F~~PDhBz_UZBpt()-6-L7qH zGyWvC=>2vx;?B~gbRm%hi+;>w3k`bExGZkDZ-aG{Z_h4|gDB-9?_%;HGg-AoMSq%S zzDZt+DIADVZV)_XV-FG=*x*e%lMwmFi^2Kk$gZEAHNqCwb0edcMpq(>Bx|zx{)T`2 zBplQdRe2{Sn?Cj=IO-#?nKDfwd3F}G_1Ssp>QLPCkt|5d!b-H}Vz;+Z_<>xvwyeMM z@P)M{_6Zv}_vtb6#}APo zvmj_Wk~$$!i-9`fO3YeLqbnxFeA*Fd)2Slh${RczsBLYOAWbIk|9FVU=5Ol01rSl! z=bN!v_YUu?cnLxHi#MwXIkV8qti0Y%M|8{;$6=Y&iB~RWrCnMIB6(WMN}2a^`@gP?T(q%>h~CV$fv=cK~bT+XLW`m1vCy6-O;`wLSH5N?rQO?AZ)VRSl^u#i^niHNAf zJ(jmR*rdX9o=oIqbVW^hh<8@^LX5lz@k>}ljnIjf1BHV=&Rs%L+kPH;nRm*3%Rv;1 z`bl?NbK=oZ*12yn%9*4Lk-|7ap-0wjgM9<~ltPhxEalD3(`xK;8@+|$ZZ!|_IEoI% z=vng6sp{>z__ny#;k(DChHkW#adB;2TE1G;rjY9HQW4RXPp()qN$XsZoN$F?>{1e| zM1&6Ho_*|cc{=m5dB$+FaKrYgJpTZvCZn#6lhKzrwxVAZ)*6TuX4?ZG%)46)cYPslS_cdX;p2W+WaZL|N0VslpXyK zkg|svB-*Im-ZftIiht5!;{H}D9oeRdR{!)Fe+;p^#vi-#OEslk#(JmDHa{lRLl{b1 z_y_$~HSuojln&&v=_0>bb8XX8mJeU?uDjEKD1RvCjViB%(bGdSS|9&^fyYPNEKN)s^Sjl8;G7o zJ@V0Nz}18P;Akgp`rsBb=ty#9BA;X$8c3|e?D=@@nG;Ywr*)uhX4M3#$#ie+)TF&Y;3MD)`)7&d=Q)d zQs=|51f^bm7eWk^+6%ar1|ty-g*EW~aAxl>=iJu15=0g^Fq50D5)+$$yCCL& ziZbvkDtF%Y+C@IH^}p0=G(a`j_qP5nuDa$r5NZzf_B#rAOYLpq6a_4qFJfZNU}6aa z*gPp+gq*x3KoPugjV*nWnyiDMa!w-i+vYnytiM&B`@BbO<{ac3jWw&8uEA+%3aJ%P zVj$fvMnRYdMQ!m(RaS_BrR_MHh`}hH>>Q66mpX?h?lNeykU65Kj+EfdhE3ZjnmFb) z)`2Ay6x?TR=6%fmYNpTno1M{@681+EB>(kvC&WCl&5v?9?(wu06_t<%EjzDE;!o_sagV;k9qptW5GJLVzAN zoLs`3`Qg&@0w9&yqn`3XnK};hO3mCgDnS1_n+N=t<2va1^_!a^sXG;EoT>y3*Qj-_ppPxrntr zy4AM;a*ZL)bljBYIor!fD7QgSn9K`27|<|McZ+m8IwRRwui4b=j-lZL?OHu+xwEW^x-6=0M|TL&I z)$w~-C_7ms(QH8{>3O9O^9>_c;QkPC?Jt_R&buhdN%TT1vLfb}O<5W()n;KMH ze}JMn4-eijFdMmtd3Bu3bM5&pk^URBE5sbZ;&kx#(sX3@0C-$`zhlJMN0BiDi#T#}pEc<61mc`KsZ{ury( zg#8rlMzPw(vnqYH&A9Mng58Jr)Ip6M#RbJ)q!@|GH`(%?nx7A{q>c%Nsw;*8J8Kde z{v?2|g;uc0FEWz*^L|j$BwhUjXe!d1UnADXJm##iw?J`_?1u_(3Tc|I%8V6C)~n<@ z&}v@(i>&?~;@y_H`VYl{C;D3X?z$&nAMQuM9i{ zImW_QyiIw3csbfzwupsj7H8+`xluFUOR0_U0z}~z+cHC@Qm5|P&Z+{9Eu);`@kU3W zaN|1Kbt$}?xvGfGNuq!8Qw`sA^A4};MTi6Qsl5d^@i>Ch$cjkKA03dFkrTIk%>}=~ zJEgH=P~u(<>1H<45i?iTnqn6d83H!c5^1!i?x$RqkxX~!bJFI?3zhjjsBxL0hr*{B zV4ULI_xB)j_3Jshyj7YMUA)Jp58al%hCjh~6@(pKL?;o0yZeWQvsU|_?;*mZ(Jx1| z0bndD!-|Gudn82|X6ej2C8oI7iG@{>*mRNE(=8hzrLiV^bXEwz=3EooZAj|bmawY2e72ZLOXDOv`9f^t?x8J@T$d1 zXiY~ldXxjSnQG;PNe=tWEVQw1i*g1dG?KO`+kR_k z4avQ^0}3$84Vf=4#0{nkA`!rus0>3j&05Qyx=}_8eNLP$=+0&?%lQ05I;I_?mJH54 zG4)UJ^U8F`f!(jwfY4N`I4ARrC z^Uv?_4xoKmkM}P1EP&sY4nFpJe?Uq+Qtvbie>gj;i54y4_BDnZ)15zfeZ;`8O|6-x zGQ!y+vGxSJk3Nuc+om;ReyNiY*YDjBU6deQe8wwSrKaT-|N)!G8d&(nnLY^zBJ3XT{JGOnyu|Qs8eNaXwg2+=#w} zCSts!uwVwQN7Pcy{f>&_S@cjZJnq}i`5*W#5Y%zqV3&NJRe}hSBgJ1{@`9GgiJFK< zm#0d(@Ajm(zI&!+l}xl?aG&=+LTl)Jlorlwl<@TQP6O(g9gn*+3@!ix6)g0cn6m6o zFHVueH_86!q?io-l3U#zD-UWJ^rMuZG^{?mezSmajhK)Wk*~_Xx)wIP(uIH7#KCo8 z32#+=8udCzR5ln2Z8sGk;6l$K!{bz-i)?8!8f_e+L>}VMWz(Spq%lehqqbkIt{K@X z>uQXuQ`$DvPEN7v5=v>0(-3&we8d>|*4s`SGr=y6 zx#3;S6Ke-;{6>MnN>ZVgyfXy6pd^`@@0VV$2Cpyd(X+saouA)6AMz}ZDqp8K(}U-g z;+FC()3rN@%S2)1GBnb$nqtufdFOfa%gIytZ+BoD=#3_Bsjpq<|>n6){mUB`4~Cr zr1++|UiI?BdoF14qvm~yv}LnI4%-y^t7GucjH`h&Xub8aRjG)@g2X3BbK5buV{6p> z_gp^J3&h#-lR+`YVXhorF~QCrM`nu8IG3( z;**?u33l0eOjY#94`Kj%;At5-R4K z0%dZD+pcB5y>wua#_h9}op-jMp751MT_*%p)3ULvNDB|B15~k#lu!={59vSCBKtV* ze*s~q+pJN5#$>ZZyjCHCg-de)t~bH1f#IL zT4C)F(kbrEL>EVV{HnMrR<5qj1@|k&G8Tj5AIr9E_F{QeALO>kVoX>iE26$%h>U&~ z>E+q;P~~Q=j#GLoh1i27vliF|DcGjs*g>;NF3B|@JEuSw%_SaA?Tppspt)^o5R<`# zk0Pse=y2gl3vr!%q|VSf18;kCn?%tsoW_%z;{FeAsJ=Tu?o zVoSfE-i?b?+g^V`We=Z0U*mrOl^sPEyjK?*RPBWSg6nku^l^?{5pM9$CeMY%QAoG$ zToDzT;H~8ZqCE5d|>A151G(QTE}WnI;XOc#ypc< zT40!|bUv1Ok!ZO6nBkt^+91@xA>;2a6*J%Pw6taOdhM-Cij?k=Q7Da+s0xY^oj=7| za_X+r-U4JX@?CiA4EEdl6>fh0dNxt5(`bhYBK|;5wg$hGXc)Wn^Y4thMIt(c5lBMG zgTm`$3=`mB(~r*%a*q5X-uU3zJFC7jupKKH zDTx$6MNo&?tu}ZJ>N-N0)ONHZ-FYAHGxw$P=0Xf|RZ`)^@w-llDr=&$sG>wXh6Eur zqTsavlDK_d9k}wIp<&pB&Gz(fqWD0ESSwRoAFE^iUn>da5aUC0c*rBVUt(OZQC(BSx z%8HcgLbPPl_Wn?0X-WugSi;M?B5ThG8`i01KaA4N55);=CWEBt`pbH1;899Qpce&} zKGSlCB*94w!guWlsagEXv1=Tt(8BmEw?BEu*6BvUgjot4f1_vg!T zX=+lH0ln3ZRC9Y&3A|b4U^gaVYqC`%$ae&DcPB`o729fho)VEd`}7w#V*{H?FK4N~ zPz71t(+4fljIh6g2(r}9kE%?(L@d>-Q!Yfb@n2+i3Oc`LMQO?ytQaM`J6lbDvYYcV zR?;vq96&$P{@gI|c2WhrrVzJRcR-}z=0eZD)hB4AX|mS6k$gJCe^i{sY^9dmYG{oq z?xYrEe}qK!o*_j>RF-Mt?*mWrLUI!pl(h^?oao#3KS`v`ej@C&j%VN0gHU_>5?@8b zzy!Du=Uv9cPW>8dt-zE#YT?@btO|cagnJ6srq2bq(pT@$#zv)SESo(PJeP=f{U<#L zn{(f3At@O*$?kLdjB-JB4YnuY(=^~NOPsJCuJIpSp$d&nOp|#lq9a!x-{~FH`L`M3 za(Ze!Hc2sBiR6Z+CxC4UOJ0YqGxiNAUL_7X-Wf6YgSa+G}wUk&@& zoRPqLZOvotA}>ZHw(LgXMB2^RBsRU`ZyP(#JAAv)F|fpkMTTLwyt7Yx)cGroDsq0$ zlS^G)a@Bs{MTe_f+~ZBu;SQtG`7hs-xOeFQ0rAlrQZ39n+>;}I?Hzhl`Cy9dM1a>V zM!t9WT<7>&*Xr*T8NFjW)!}kxkC>ND)$@mFiVS}WjD@r!Wau^1+t~Fxz-ggfhm@Fj zq9dOrw*y7uuyqeqkiebghiMxcQS%2?PHka{ufLa@6a|mHd3|JJLs%A@h5YHL_OBpV zAwc>tSeR9u=bLq#vihf4)TC?JO?QDuk#B@!Bo!L1)B@BLvBP*x;PfW-9CqO+l+i_6 z7KUc}(J7^t?lJZn*>6MrxbbdQU4hP{(jh`|)9VlV&(ExupK0=&%SqVx$>-W~+ZhAC z4(9bSuN&AO&D(Mh?mPb-Zz8k20zQ&2VA@#%$e5i>4$R$k=nWupnJgHTv#{I&j1NYX zU;O+71h25Ekp2O>-bz~(OkzAP!Mw|SAy7htMKew9$u*N&1pJ6}Eb+pb>$fDZKe+=Ut3AUL0LdAM`LwpsMg6Qs_67?D4m|g8vn@VF-UB5U=!@Fn^#liWz@C~e3s1hrgrd; zZI7k;m88(5ojZZ+!~9G=V=FFm2ZLB9N*c{S8S&y|0k8<+$1~&fss&CU5k#ugmVv5t z3;1PWiwdN?c1y!tU=fK>h2>K>VwAc|&j&6b>Rae}hA-yw^A91^4CN-V<1w7GV$;}e z(Uq{~-}HiBsSyGZFrU|~zvGaOUmx$9pSB**8x0!2E-QgWm;Wdjv9k-V8G5x(1h(1S z$eg{UBGJb<&lKEtnbu$EQJk*CjRA6Uce5%-k}3MN{_%dpifBp{D{R?aLluggb_*KW zCFPe&tWn2F7D%tTtVN?+fe}UT#YW99CT-;gna(pd16h0UAX&)s^Mfigh)S5Q34}T| z9bx~CzGA5ePUW3n7(v1`aZO>%~(#y7k zVC%CD?7E(z%+{K+-qy)J|M|9Y{!QO=iF?KniR-35z5B1D^UuZy%y;#fo3lo9C=(5ac$JQ+CGC1UX$AoJp^H_0zwTp9I=AErF^;PrTz5>)nTzI%Cs&9SH zH7neihrR}s7<>gp0Cu_=m>et3qI3;;{totV_Quy`olcNv$#+BTFv#4RDxnQef$?*J zU0P|1Hp-Lezt;m4`$=*;T1yS)j|GqnWrDfLoOFsb7EoG_YQ+=)Mr-1{#?=PC5#w?j z<{q6ILY{L9v?+OopL2DI{YS?wmJd~AO{LYTv2>~EOI9y^Q_E%CUe=>f%ZvDHU_>yHT|VmJ6P{w1rde*=RkHSIW^0u&v**-++>+{dyqD`_dVVg=r++fbVom%^X*;k_v_)1jJ~`%`^WymddYXNu z5lu*KsGfX!&v7V6_2pL7_FfDb=0!u+gs}UpmZq!*Reh2f(!{8?1R5)ij1jyR8Kky> zpwA}HJG?dEkYkTIJDFAc50e?#R=4^Q_WE1cEl;gyMe_U%$C(n93^e!w)ZM>B?!GSQ zh}G8SkpW0If`sx}pZfMpn^cFn zJYp6j{ZsM(0npm0#hgd~biJ(kUhrU4jx;C)2qm^<`5d8y%Hn;2bMKQgd)5Y`g)Nvb zf}1&cJ~H}HOvY=t1nO8B22j4$t;haPb!*B+jn29?$n)x~$?6msCEI`9Yks@R7!jUT z`bV16Fzjgcd4x=Rqkk0Z4SGY+{RHetkYX+3Mx$FljNh_c-cxz}MwS<{6Q<&8{F3GU zr~AiY3(B@(%4)M4toyfb`%}O_z+*P$NaAxKqMtc-$JUTTz#;@R!K`3ABfL4b%Dyjo zUpriRdXlfMaWg=?l6hw;HgY==>re!{UEqECfO6)SdUmv1S2`1=cJS=vm7)oKM;K zR>fjx^>UA-8{LrWOmbGn@bp4y)wag<>iA{*f6XWRITzeN97henD-KR4#%#2e1o5fEGPr} zlGI^P#v})e^7mb(*Lu!S&>c};bYp|@hhZ()+?$Y3>Vo%^eW~WBzO&>mp?l*;Q=Yqe zzdSgHL1}ziHV>)qo2h(OG-UVu6*?r`&FM}ANoqojwox!w!rXa$`OGz$0mKrBf3vG+ zpvK|mW~IKgmRoHkZoBUPj%gthp}^PRSSfdH!m$W05RvgqKqc^1RE-dDtTwuWg^<8} zN|zvy%FSO_2Iu7zd(15|pkYho5hl1pH7+~fMu`(~&+~n&kQqy37{0(){Le5U*-tA1 zLdzh!fE1F%eb&@9%Lv;%W#@kY?Mhk1+RP*|#)g8O9<#5C%88A@BTLfdJG*)fjTXFV zK{^%&_GAVq+6L?R|JEl_Pt>jP1nG}zBPhs!TRzvWG-VYIv{0 zbF<0!EFMGMgdDoZceIAW+VNCMAab1+_MNnw9)4uy7B04?LHdg_^Bvtk=9BDBso4|O ze;mD6KA==+A?cD*#cYIMk;7=bBS#r$kI0;!>!9L0HWO`b!M_QJ*p{!>C~qj|YJS?} zJ0akmd(^tH#pS#IjB``{)D0DI^upSJ*mNo-Mu0af$|!O;zTp=b#Lm%9O2?%g4NFqq z=lFe`kPtUjR7e#n2b(93@bs?vK?FXza3A7PO`vL1c4 zRea%a5BvCkWn+r$wCah!L=Z9;IiK0HKW^;14vCwpR2|RGb=ul;2WJ~2t*q%zI(~2l zvgsp`5|6>$9A)7G#nOz#^wTYuZoD4Tv+hmiWnktd0!AnySa1GSfoE$#o1-9zWz7<) z_D608ya#ZF+@<>_q2_)ilKpw&fpV%L*7L&glbxgIOHK4xDCgQ_9_g_F@$gSN$D*13 zkC4J>{T(z%6J#|XQKue+Vu~1(ldNCZH}9&SWi?5%qj2GOf+K4gz_Tw5 zrO|RhAVjS7-BvPkNnkHwz0CC(D?!Sx5CFTi{k6I!5ATQQRhjs6+gA*rN4IVHUrp@- zPOd2u=}WWJ7+g-#*^Z!=@`y<7fEG1Xm0c=ZET>Cct%;y{j0Xhw7Sc^9QY$qWRk)6W zcSOp(`0Hsm4<7H#MXA@GFxA92Yd%mXEa8Xenl@z;@b}WZ0P%O^T`;Pmsn!C)irS;q zB<>Z+mE)vo;vqh<+IfZ&1G_P^Ka+-HYf=^|YcV{_NtaCJH8a_FUA>DqU?Q3s;$Q2C9qQgl&e!Q+X=9jW6cesd(5|bk zsYFY-wFzJSozBV9_!+VI&@=h0a&avGV$3-%w` zi7xIChp(BC(=krHJcbO7X+{RMDEZza`fW=)t6ezE47S_KTFVgn-ent@&skt^&hRIL zQf6W~4@q8HXTo=&w~tS3yhm%DS3MxplMF)r*boYyKg4q>Q(k$8+mi5h-~(W6PZZGw zp$Q}9@bCr@2mhBV(N<=Xh5Cxhv>{y{OcENS?0Zw!e5Q_1Ho z=8nO2?WEpu1q2w?ILUoQP`&>eGil*Pl0#!Z>u}9SBR_Vmtrc?pedkm2Cqi~1UIz^= zbrJ?TH$o-t3DV8~=MO-|bd_J)w*plEJHBdizPIAZNbCasxVsq-c2|{XlNz9Byuy+r zv4FQr4dGLVD0~?M5e3o4x50dC+Ck1%3$Fy;Wi8A(m`ejscn5yRsr7vQ@FUM}u{z>X zcD`6Rl`(RzeM6d?j>aG5SFauNE+#?u?34Hju_6PE!Y*(oo_I3b6?FO?D$0UeryieN zryRrz-`{029i-b5h6G%cn@k51R|P};9So~fy$;epRM{<`tKhBKgNN5IQ5AY~K7U#a ztI%Wj{TkJ?iW z$)>D8o(hir2LQ4ENofdRR^l#J>_nkF_y>?$`tZqZ(OAnt{UAw2ih=DCNNT6K{d&bp z8SWR^k6i;~nlM-a&S`xSf6}j!`YA~1FVn`fFF;_#ol$~AS)5gWhIciaIBwk<+Y;+G zF^WMkVcKj9!{Fyae$oM&*pZ|h)3O(QwDO@J5iymlvzyYE#)*)eH$cg!*JQFp;pw`9 z>1536G4G&y7fXH*zcjb%k+=??pHu2r8KYghmM7PVDUiZci2snxuhLU)T!tQ zdVvtsK{C|FgmoPNJCOUw&W$0<#5rzY>tWXkBqX&yChz{`PW!#a94>5}J#CTCjyQO= zqKepswWx|q80uzZC!q^D`l_?)qORSm=wsN&r?E#zfM)%!^^qwx}i_-D4cq=IvpHBLY$gwk)wtSDpjDm?Uff!DEI2Ox~Fn{W$VMkp_hM z(3i`8o{&kmJIy}`Y&#J|%GUYJ8T&zqW?Qu6dg<4y;kY_otW%;y7b$8xJM4=ytTzP!->-)lhdwGD zY<}CW4=n?iPw_IQTK!il;(uJH=Mv(IGEaS9?nh$tawS&4Fq^k*)J4Trnk8`LNub7; z#Cas-B+J>xRJorJo5;7aKA?H&O=wnU?Wz1*a9VdGbo5GWm@RT2dysr|Lxf$>%9S#V zgEH{T=-k>4mEF%pPgXM|DADf%JA&0x+}gp?kgap$Tymgsd1ah037yK+C`L%F^QLr; zXehdEE`3a(`gQ$o-fcn1M zAvrVOH66sp)BdVrIyZA{ zk|)Ud%C>BgoU_b*1w=3X0#uz;A45xYq!{73C;#PmJJv@27rv&*iPf z#Sdu%6PWPY{2*l>`PD_bNO`cbtyh5WNCbv!ZCs9 znJ8w#2J*L}(lwoPO&7~|b$km4HX}DKNJjzb-?jK;A%9ewIw_%vWKF6mGaPD>Z()ak9zklC{{SVO8&dzq_ z6QO%VG)oyE`9MqJnE8y=0lUKJU;2Dj=`Rdx11ZbP(_oBkPA=RHh@Pu(Udv8ekL50l6Pqi9dcaY~MN8Mw z;5T-=3o%gk-!9qfm^9ZDo*C`+F+sd*3#EG&DlbVB44yyn)9rv@F5JJQxj-A zi|SszkyoIgo$+@D9Og#JbA&MFwazif;dPrTrdsmJgZmu_th>>}O*mAQz3U$v-R)=n zQggAKezve*QrJYCET14(m8=MZ@!TD=wp%s5ob6%-o0QkE;HI4K<%FnJakWzxmel3f zH78)gmMK?)?}oK_u9NzPdDBHUbunVPKj(Ajmk+yjR`C!HX01>Ne^F0(Ndx0N6)oB} zF1Fk}u8MtJ(|@5Sjpyd0q8l`Em{`4<0~M++`HM!YhnzAQJ>o>uW(4xRGSil1?iz3l z<-Tw5=m3z%B<;*FWR`|`ioJHm-VSV^LgP2`r z&hH8C(};R--&ajB_&~aCwpqR2{>#A!C8>jT$eCsCan0d>s%dpIbccBi~o ze_Y8yD}(V`=Js1MEdf?BKnwZ$6fli&)cEs#@22@h)Eg+*c8Ke*Ud{@JpB^(;iV-_3 zuWGJs{hJNs+xN&xv{~aD-uOa#$zt3`6FsUVxz%&~XIJaqG<7{}f5VOkeJ?AL@s?Wl zmU034j?i~zB6(=9YgRhFEcLB++k8v4o#>JWJ8KQoheQa$t076%`MkNw-mWoF>1c9S zcWtXxqtul?7Bn~caVDR1I_8VLD>^4$jPq~1KjEyA8KXM-hEwb7^OT8zKiyt9lIAp( zb+rlDgfU>L`vU7?jQFk{rloG=A6PLEN(L>cqiEr#+rDqKza}Z1k~=R)Ynbz^MCc9V+b`WZ4CYdmyv*t-G%yxxBd0a`403=R?tQ znn24&_+WbZA&-hXuZ#$-`MA#Ye!B;{I@gToT4J}sZ_ z0)^*#jzK!-TDXj<}&;f})53BGqDNKA_3cn!o z-GlO$5Fa$jKS)F>T?|iox2h zE7FXSwQ53aTI-jz1b^|H3DK2JoJ>;q6ZHCdoR=x_Ugs`b2Fw6@fNh-0>xH3#a23EO{kPEcr&Du(24ks$71s>*x(big*p; zbtyHCu~=H&QnUy`qb;<&f}8E#!2d;pJ6<5#Sv4)u6thr>2ggHpV(O}SceSTpVrR$%Zsyo)2Mgk z5{j;BnVFcG*h2ZKR$h`+xolZ%>DwzC(HyXRL`f1l|CL_bN*jlqV~a9J`xbu#J07d5 z&gZuXyN9dAeX%TLI}*NRaGgr;+BX|SJXidryyPz{p-S~;`GDa2xgwx??g!N#F=4L$ z@kC@yusmArX{a;lG8n;t6>tb&B$stbKC2^jTR9T~UbThrF! zme@xJ)mQeP^17q+qFJ}8S7fG!G-1qi)7M9?i>1-o;4Sld17d6(cJVk3^Msr-pS9`V zHKgsY0G*ClFO#R=43B1ui#cB_^F!fS%Mg8chPOZ23B7RCm!5pIzgb89SZRqFf{e^n zobX2zL+Ssj_x+C#i1~dV6hnxfeuST}?c-6*^5;jW>9F@_D6Ag1{Wus~9Z}esF*uwf z^mTF*mmHNE*OU5IPcO3JS=5i?{ohLtl!d3S*?~kXxBmbX$50QJnHdc_iX5ePKY(@z zi=~u1!;Ve`K2t$$0qS;^rHKbUSb`A zSE^S;nfy!566qJ0bq&?va+4kc>;3hEv#jWv9|Q9WGcfQ`pK^Nf(4X80$ld%p(^K1z z>oq^Wg0w7MX%Uw=nXCC)D$C2tT4%7>2TF0)AS#GSZ`b?0{D$1nrk-)|oB!kYva_yq z@Z%AkE%o-<$|C@rnlsd+6XZ7eRY5d+XB*_?EG#689AA5ipw82`n2_hgTnoJuuiR{} zO-^I87YYzVPI}1~9v#4!BYKlI{-hbTEI>IgvMhMAS(2V^lOw*sk{Umrh;z^fecklnOqJ?T!o~ze&aG z*7QYX+f~`LcrO!#hvXZm=Dc#IECULu8ntGENGKnbyaZK3OH;m0u-yCuAT}!E9&b~% ztEe4pKkN^pT8?a;hvYqV#0}w4cRYbTs`Rp_lG|oHRW6dU&R)UCGBbikKwWMkhG5*?z0$ zVeP~3$1JU=M?$=GcscGcKSqU0_O8${=REf`hpAK??S%!2_PJ$;g>8b_HL&91^UaXo z#P4EQ51rVM1ybSLNKF(A6P3JR$CG^9a2qn#Fdr#0==g~F+-Ib5(0SvN(j#fX^SK43 z61^!^y%Re{jsF{a%gS3^IKL4Z!_uGOIa_`jm^TCo@}Oq5Jx=Zv_j+(}wXNj*Ma-08 zB*wGtGgY}5H_b@&^l3Afh_Y7ro^PM}k*!g0d8xhauhECW#oWIVqE`Yc1Y4!W-xuP) z|Jh%Feftcxp)>Y99mm@L%Q$Ys>gW0+Yn*~Lcm_nzs-4Q=Xml((P-C~4Twr30H)71U zS4!V-VLH5R6w>Hm7;%ef+<=e8g`IA3Irt57|5L@|3FH~aPj?OL6b>029xVzcJUbZn zOq{8W?#UD`I3Eu5|4s84ASJCHH#IYqlVR4r7W5Q#FZ69*ccSu?zIKSZxZK6wCb5Cj zgKp!eY1z#yvD>ClRs;Z1O=fkYw9eeIrbF}Ne?+nWE291XUdIq8TR^E`O!yUE&;;r~ zHg}gH1JPiCei!FYkBKCYIHS;yWjM*N|Ekm=-)q~%cn_sT*iVdubv#^7WCM7moM5Xl zwLPVAY|NNII`%K8G-tm1zSkICGoBkC;&!b_Pnr%yXC>W9n)Ik}U#lw39kOgc{dE$4 z-_^}H?kZU0k72|<-^jw0i}YN7p_5r3y%*e+QyM(Xg~e0S;N#Wjc>!t#t`$wHM-SAL z2IAQ0({`=Q|I(MlRIxK4HCSnz7`8va`i;6ZzWn-4I>M6O#|=*vZrFv(@SR2T_1shJ zPa^d7ECVHt{H7GX{jHVevz-s!J<7VBJA9%Nw2G)XVx?A-mzWoRxUy>k_U_6{BVIL( zjaoqoYh{S`+YNt`lKnYX4YPM>?O>1Ae{`f8$bASZJ=JD}XDDYnQ8Ec%YlOtDhlieX zuHL9r2?867SGw{f&547G+lH#zs%o;o%ZUP@)nX1OH>Bkb$3r_BZ}qp9hGF73;tg`= zwHiY7@Vh3C6kqPOUr16iC=RKH!L=S=;TVa zF6-cqe_U-vnJwcj^l<{eTr!xAmCu&T$PUM)tV+PcI8vf)SR#c={ zT6S`xEV)5|4A&-cbA1V#U9EGC`WpjZRz;`c4Ml);i7KAK0%o>GU8IsGhOF5=%v>{d zJ~t}by?u;i7Pe_Gh`8x!hE z^GOGCzv!C~ivc{|V6O9Rhn7Zs3lJ4~GD6s2gBrc5^0!C&|KjW{quP4cZ4ae*kwSsu zP^`GS6)0YyNRS}KEx1#p6p9lh#ogUKSaEj=?hxGF`oB5n(;fTVz3&}&jC{z-8p)@u z_g!l~bN;4d9=&Y%baF-wgkAp-H}A0BkeEUC8);%b&|~8Hml+{`|nl;LoJKGJ|XcOP}l}qSw+szZPp`} zJPJEl>#e3|?JU1@NMGbG{j>Agfm2;vdlhH6>2Fhlw7U--QRt_!P!h3_=cJ-u@zk7d za_^&cb-K2U2pZ+dZ^$@qcX=VcfOQvYqq+_b>O*M9TmFQ-#^yUCB7%~gbdiA}({x8e!flm+I| z2?OAt!|0P)fRn`J|GYT;yR(>Vy35#UGpB?l6qe{(#y8vzFk#+rgX`DQVgRvY3(yh< zn|HOicEZQHT}th@QH^i?aLwFnLe-W(8Tm?gt(mwStOs8WED5UNFIpLm16AE&Zh37- zt_C+S8Scz|4bG7&Dy-!7druaIc|lF>9-}8=Dp7AF=<*0-j5i&`fJlH+yTG*PmCV=| z#ZeZHe5{p&$YK5y!s(sYh(6B*ETDC^{i2o7=`OQMzgDud&1CF%j`ZtYZ|m6X`=u9( z$un-ZR@+RmPeRP1_(kCbr}S}^>QF=PgYmwEch_38i<$j$u$TbguJQ2v?3>A6Ro@vft3;~87La*_Ipdd>nhSPG&A4(b`*+IeN;-2KI+6NROR^ z=zi|{cAyl6qw|7oEJ)Q#;l=1g?ep;oNEe+a$q58h6hKL>N$u(1o#6Y5i^6@Qtf?uI zb4$kO;7wcMPZy?0CpE0P7ocA=)q>>$94)toa!emJaSxQreTDIT?y_uf*d(g5r*Jem zLylX^S}^kKh4yB$x}ta2piK=i7kQd1u#=F+h)XD!n>H?TC4b{)3KK2NL8=bq;HXBG zw|vQ*$4z58sNs$c6>RemBa)fcsE(}Pd7_V^7g|^M$8sp)6hBHBUqN=^yV9+YM?x_! zi$5mf-KxJ>LC#noLA1)Vl$KE_|G<*SYS}e&$;hlF^P_rdy=>Be_?b^5Hz&m*{C?*FH<{&iuiXLH**+jY%g+ zA+^E)pO!Z??owyq%elz#ibl0j0W1f|C_9LDRsxm)aT6)KZ9=S-b-`UTZu?9hnZne| z=d#P*yRifSD#T}JYwYJ`5_Hske^#s-Di2%C)92eVy3*5vsVodL4{WoxP)6B@cjsBC z*`hCm9zL>iL}i~FTDY_oyV@5oa?4-De8@H10n~qm&PfG*>7Exwop#$ZITVr6WRH&e zuYJpr1|;*TnhYt-G$NChoPuv<-KCt?0}fpPoYc*3Q_d~w7qgUDaLqtF4VU@bh87)Q zPQhj`M{griI?%{lCnBbCk)o^LHI|YXWo9Hgg z!CKpVoRlP4EhnRzqHbeX3R)!mzv`DZf_CcbT~Y6UMOCa84LLWgCtpou`^LB~()g?> zdi;1R;j1w%#m02;9)3e7Tk?@DHrR|sNb+lH^A(XAj@KWgT5e4Gl=6aKMtb94(GkFi zEeQWY`DP=|Yh?RIjh>H}?Q@WrUavajd;O;jSYDR$KG%Nrqjqm6_MPiVS%fBeR$ZWw z)S1$WZ%ENKaL;15tiattc(JaHbj6zD{zd6*%&E{RmD9Uq{K9K{_D1a0>gfG0L$s^P z9on##TSb1MoysiOz&in80RELkIo^|cbjSs*Ka`FDbtUAC9O?#QU>KUP$s9W_3ac0h-OVUN{K$mHIy5f)}rhMp-P{`JTb!TXyY@ zt7f0j2%Ejrp@2fu;`<|mD;)J-*q(+|KW5pq^Tal1ou!}akDG03KKz5^9=0!ap2le) z4z3DnMPut6mqT$(H2wXfdf}&tDOa<*iQ{PvFoxyaY=v+VyTA}tMZZ=+5G|`nqp6h3 zH5AZ6%4A;92#tQEk~_2??6QnRO#{Xa+K|4px9XlmLV*+!$7`DK<2w9m`q*SBsWoGu z+8MV~)1DtsW^M9XZ-PT2YqtDIcQ_AyHFX^SOluZX|Y6^R|}2Y5R_a8}36HJ68da2h`N>rKh;TzlFDL&859EJ56$HOwKV4UkUkK`XVwPSR z;1nmGudiR*jTAq5-KDW|W_@p1BUw6JKzh1eX~;QRX()RB%SnKv60XB(m8lqx+Mvb5 zH0YBz=jst&ZLkh;5jREP-o~XJysy4U|G=9wZK9-O-p@bKBbV|C0H}Plu3kT`+j-p# zQ54s*o^AdqBF8>kO3Io+>+H<9q5Q+Sc{_utb4RS!5*Yt!uP{aZGndg18o-w($74_%T z9)-qsb{A9};!5*XWp}oSBof`VqiWf>BA@er(Y=Gxz)41+7Gy*#zWmykO-%==f~dPhgo%F%Xe&EZA*0*4-7s)iiDq4?sl6eOUzJTNryE$g&q zUPWQrF1W>k=;!9P8pNS zbUQy{(4UANcyf59PmeC9^8)I$(1M5ECm!@x_AH0fHZQieSB!P|uIp>RX=yUiHUWI? zW!Hk%OT(l5tC@6fHx#M4T3ro9V$_l|St7#HXmDL+D#n1SU)7NEF?__j4{puKnrTq* zaIBHg<8o)PIZ>uFwJCefuKz{?IOT-kEAFbB{><{9>UJ_e`nn*`MCdKtweZ6;*~UFm zvZ}9j8=zFVdS)TK^i`nut1H{aZMU>1Ch8=N@E`DAV>GHFzXGFx_U0_b=Y;F)NH!Heciuj+ttZWDvuUKy`0-Oo-A zvfXb8#Q%uCeXNqw<8+b#CRe}cT_lDP<~%7Rxr29_4+LwirtviO`v3Ivd}hja=d8so z@v#H3P}8XiMDqCo{XtvNJX%U*{YeU!WUy%Z{Z}vCzf4ZLt8LlD6C1?XqqoCf^*&~3 zKbV!eV@Us7&e*?9LI39=9@B}jE2zXs-hC=DXqNi0M&Eb@+2TmNxRBQbO*{G;kHEg7 zQPSs;laOtPi@(Ld0qS|OynUViyIz45bhM_bi^L9c(_^~`&O^D976y}uoDHYuWP5(d zp)}LGHxIb8clSLRBMe0d6&w@1P#j|5id};8o!+^Q1i656d)C*i6H-=`Ey&=u+tVP_C>jRP781#Bs6ayMN;q-S0<)(^j%ll?n;5Pkic+wGJu)Tz3%^TAWs|g%A(Chg%{_ zas_vZD}ff{def48(c(Jdo^fI$!%v?mSbO9{IgG{T3vEX2+Ro}zb^1@(Oi>Os({@EN zNx5c*#B$2XE|`q#_ug(Mn_mjvr?4kqiQu*9y#C#oS+I^R1C;nvTeJiW9QG>dnmZl! z4gKpMncv|&JV7=bw#N9tn)kzsmHNSe@>03;2Wo-r4GNc?8E<&?POE(8KvnVYPhA5V zCJ z7>w4zpSvt(=RBv}mg1ncr1PO@9qXuQCb+{l}E z!JG0vpiJq_2hQGVrvrQpgSvqfI0gM}pl{<2Rs8bcLx$^Tyfc)e>i+=`_Z9!~mgV zmlKt_uAfdIWDeoR8Rf^$a#(+NE62l6zkpn7^hLLGi`LpnG>L_!aQyFBQH$WA1_bv& zcR)q#SfgNDo)2ZHL~J0sG^DNipoziB$*EbBECFQdR>6?y-h|@355=>2mmgUljYYX3 zle{$#4*ODD(|~gfM}~l7Ue)Qx&jM6_x11hz1oKk`_m=BX(7kS61pKuS1?u)#-jJ2A z>1S9qu0)SIcG4emvwWAk+j*T4Fn?S}$qJvF7GA|v)DhHu`5|k?JnxUE81sq3ZiwoP z_2V00hvSR*d+X#Rrutc$0It@cAF*yXI&6f^({jr?Pd4eg~W3b%U^b4B$e*=wNe zdyVWJw!EZuR7KEob!O!7>`I#^SqD;%US_OLl>vnJkqUr(P6d{h{p^xr0}K==5v^S9 zNDfqoi~8%ug4SYW0xvqcSFpBsv7H?KtLw>!nh2Wt#zLuk*io7PuqT4}pQzRB6+G81 zr^JTa79qEdewxm5(SCn$?gb?FC)_rEtRFb>(n! z|8xJ6v_O)4i;m)tdYq3xKAOPWJi+S~coLfT>89oSDF1rfVe;QWMU`g?!Sdcc2OCtSaQ>JrTe+^i@r1@|;Q&6I;#rde=$^ zOCrHb3KTQZ`Q~aQ9*(j+GC)NdBtn2xs%#!-Um zQ2Kb%-V=0~&_dlCNj@d4{Ehs$Qhl z`JRn#BU%%cG82`cq5=f4XSL_NJGJQz4Y44NXK+V_L(yLKW0j(E$W$MOor>`H3_l&c z5%7Kkj?DQzDXNflcwpBrb_Hjz)%>zk=jk=bpaq+&1+l zDyRQ24&M1@Ivtzd6FPqKrM`9_1!$nA?C4Z+oF!lFT;!20gs=BPA_)Yc9h+J1Y7%BewC3gSEt}Ssa&z|4f^kul*WE+ydiq9& zo{Wzs zYFuLoEl8F*JRu55{t=93gna7(hIs?4KsZ_HLdkpgxK5#Hl&3jA4xz<&Y|&gO?%o3FDL(P2^MfRWK~Q( zlB8Zgc#fm@0~P+>ced$e0uo~9f~%1;JUsS>;0kvj+Hh(_h%EMM+E>0NevRrwixVsN znDE|5!|z$=+pj~ZZYwe`%+%!8y<9Q=SW6-24a4__ycTiVb!Pu`S>v^v&e&KE5UPnQ z$NYm7aUkA&<15kjf9d!8->w}Hx zLi8S9lx?qJcqXlH(~_7V{;fxKaz3y6AKlTwTZ(Wv)N|t4WBbo=u9>%*3c*!KdkUp* zkq^=5_feWH6VJkUC^a|QgAP}hdIKu#jPIW;gEzP1CQE?_CErZ3f5d~arUMN^229h~ z?Z9;bPKOQe%TuFdV>QFEDU43YR;v!HM|LX8%nl7R2jpk!jVZJKo+$%PgI+a%#3-c-Xec*u)df1Wh)!)DrM~ zF_2`vd8!zC-w@8uNE<3}|BKWNZM7AH{iboPbfI9xiYrjWPA4~pFr|kxp`%9EcwWG<_B-V6~q+o=5Vcbv!Tn3%h?qNmi5NDG%huy>m6 zhpEV~i9hmsW~3i_x;?Rp@)zvRtCWLGvD#fL<3?;T=!NX$Hr3Y6!+;(h<+8K*P57RJ3S4A!33uu$x%sFxw#g(#@0 zos6fgZ^D9G*Y(f*!yd=ak5#Mrw&oJdnQEfT$7Mb}4XzDvrGjbdU*Ag&C{9kb?Ht^k zQxuw=m~y1Bxf*(YK5*>C2(2C)fkd~&-BxGz)1bi(n_FbLcj`!2Z z$4|B?5}sJ?v(#37lMyQ-_=9h!b|*}~S1ux*38TEU%(H|0zmXGRf>Cc>Kl-MPG+C zMKf%-#*0keugCFj^*gdpA~c`sGy71q&WH&%L#>1)%E~Gm>M44x2;)XM+E{YH4@ndR z;ncf&3IEsstDpY=sP8gxi;29^4g@NNtj3U0v5R3Grb*+4n%N%!bOHSE z>J$|Az`k%X-4om80j@kE8vM*NH=@-~oPux#4eNFG`J}3YPvv^M(`x?`k;9&^r(>b# zUH>3KZ8Z88X1Eh;8YWU_%XM9tM?@=;M|U)xYngo}+ZuZGow3CgE7@rfV+-jyh1p^| z_i7Ao7H3iP5bgWLSt2;Mq-9Y)T4^}EFry`@PQLD?=jMr13ddnA>F>@qWkR>Ys+E(g zHoJrTufW=uMf)G40;~!`7U;Q?edkL`DcEUv7Q!T)Ce@y4KR|5qvN|$bRyO!s{3y4& z6+N$4Dmi5NG@}m?9T;Eg^&w*pB#EEK1etXV`*&7yy;xAf%~M+NIpTcaHnihTVvU+4 zUxr@0EZ3VEI+!ps;z|F5^p4&gkM72R(|NV`vDET+oyA|eTGN*lqI-8XcU5z}07}Qw zDCb5-3+w9bIj&pyd_=(#s=4KL#n@Pj8Mf84{c0Uh32@mcej^sRZ4qk_O1vJx>LR?f zo|=;J>9)kYcH)k1nr-_cZG&-@0D1CTv zW9qUvfaLVqx1aY(WjwdEM?kelS@E5;jbulldS8|6Z;rWvdCoTaH;RWEqu= zXF;=}NK?+zVpIGrv5=?J!~aC0Y-NN>u?{Ee4$uyc3y!gNRsHqWNk<|T-iBRaH%|<& zIb!v(x^+&I!!5evREsw80-612(F#%W45Jv6ti8Na7syD-qWOdNv!!3;Fqg=|uW`=# zYxc>#dWyWIXjBS~$e!`%wL#I-{X2i8%lec~OIFNhvA% z=sWTSRhGr=G5X?)=;AP~iVRWs#qf#I)$Cuy5Q*7lzr?JtAUsZr+@&Up7>N~@KOhPV zM(-UGQ$brM;$sQUz(iLT%?qAmd_R7|E{^3rHY#!jAQ#&8s)Lp<98AcjP{jVgQa#)K zu>EwY)0hutFrm~hewhUBKQ<79g1ghShjbcFyjl$?goE5?({k$S_;x+Hi*E6)io-*j z7xA#u|K$F0Jd#w~>}A*}i#Cg0h4{-m9*l9-_a)>1qWS-M1rG@E7mOpC)jo>UIe($X z?fvAZWm0RmsF(NL@<3jQqiJ-+-<9nwnxOI-97rPeN_BoE3&3vcYD7)Y3D0TW_H@J$ z{b_~A{qo307Gc7$P95feurdJ<)DiPSZ@SHvp3D%e!sd3Uc_Tzn9&dfl>YyX_X}doW zJx#df=F9s_-8z$NS#y_}37ce0w8iCumv_0bV%82t1(}9p8F|U75)Q*D^-~#wvC#~S zaDDCPcv=hP3HSVHhef`gYi^G@6>4msK8NxM=|fAA&4SaFOC1p#>Q-PI<6x#t3_WI z;G@!AaEwT-Thjuq0(Y$J?-#XIuo3rlds#e3zJbGawz)+iJ6~W~!z#mru^l#;Ad1sZ zoQ8y4{r9A*csx@-O1}#ZfVgVchbyymCe{|WJ#;?7TYrNisyCVwltXmWuz&EbNXqV$ zBNbOc8ts)c?(M~pCaL*O5DVf!GS!%@QWw94F-VFu5~wyrr?te`{8aBE!1%1uaw^G= z4w>#h^09eB%jyX`np>ap9xl1MBlAIQ+0()R0^vDA{t9Afojk)~^};emx$$B}wUG~Y zXnh%{DA%{S??Aj4wHF4EdKI?A(*~r=@pTspafg<g4KI@8liynI1vFm?b%+zAFHAS7js4t{>HIuWr_t{y{3}`a*>NE^rSRor9sC zoed9lcsKvnqR;e%qPuu-WW|8UE&6!D0H{E|$h;)W+@^;62bb2YB0Bv+Z&@&PKQ7b? z6^+jl=@3d!Jc~o@(U5*h3&4bkjUvUB*jHlZW)ZrXA>3+?qAM}$^YDs6bS~lG@&3np zu%>fWc^&h;?T2(D!9cm~Fzxct{@XYGCynDai{I431-3*2QJNLcTPNc5GeAk-sJy|i zX|Yui>f66aYXAPwz%>Xli$_NPn&_t-9c2L}@gEj|Xs$Wa848e{A05`+g8euT512q4 z=-%6#=x0N;>a1%|B2W85c$}+ZgDwF`23|2=>CEN)w|ocS`O zzlq#)m=V^nI`7z-&$1bjD*fn9rmOZ{^iV85rvw+}8=!yGBS}p-xWi!9p%T0$w;n@8 z`T>`WoQU6!wvE4NoL zn+J){d@`DuU13^yRW-dIgg->L^3o+TzZL#W0z!H5@3eHVfm{>={7a z-Zr=AawtB!ea)6wjE&^W+!CJ((n0{st*RSh<++F6G=J$GY!2UP74;fS>%Y?xTl?`j zIknI`ZAozzAt?k759uWvIJ~pzTT`P6uPC*BZZr=$+3RI>W|NB7V*GlM^2j@pIzVf+ zHOdhpxUv`myV91PCe#wqM9={a13B;~6|2ASP;|-(IycNK8kAda#(B8?9PmtgbOO5l z?o*TS&Pr&MDB}Ra?u-u$%!!rgIgYUfIv!;Z%?*jU$`)JqJbIp?v zwxCXS_GHk3L%lo|3f4Cl zb2oq}3${WZ*|wdr!WBTNGZhWA9*O>ItXcR|!$HN&?+=&dPGRyP{e12dsI1?>y-~Bo z-ias)^Bn*!|4EZNav3&A>*WCU&=b>EQiFr>K>ZJ{T0#>A^VUnmu1H>Agso2hCH77C zj-6NVs{_(Mer>m`La;-;h@}`vG15H2O#H=R6+zAN0X&qyiUI>(2OhDi=b)ONDVQdh z2_-Z}-Xe?+ADb)Ol>aDtn&&!@J3B`(eaD{4eNH(L2aKJdI36Rf8g-_!A(2YAmXc(U z2|8GzwyNp*v_V{8R%vm)C_VPR$_g{lI^0aEHIGE_68Ls-$jmOTmDhj+YYnPrRUiB7 z!@rpE|4)aqmplS+p8#_2?4xwDX~k+xE3v_&45WpRBrR5!9zmOqoD!w|+@`A+luW|# zB#5zLT-t@$?#<(F%KF@S-Nczv69?-E}!>H;(;He@oNiQcTx`5{s$iYwJvxq!N z1~R|U0uCP73idEO!`>J_6=v5LY zeh{gz^g3Wp!SmL*wVZXxr?(3dRShPQ)fgZa`3H$B6@l^ZAFdp!XW|I{Y#9uro08=t zd~^P~%mAZ#k*8+`BivB?WN@R%Ey2(CoimB}ywhTkOQ|jxAWmrNR>vP#?{JcoO61&; zE2T`hN_6cCt}H1p&mu@BRdb^{HtSwr9|QJdERhkX+%_v+wSE3E`;O&PVyav-aa56J zmtrM6q1R$aE!N@6QMS;|qM<8Ds*0b+;Kac09coCCM(*A3?AZ(?th&(R1ICKq^z5fG zgyUUyZ8IkLA%g9^!H*9KLMOjW*zJF&ahM9X#@tP@2X9=NHn3+Fx3WbOqkI1Ca=-s8 zy7~{&7tfWwe~@6Ac)zqvry2{U2F;uWP_}M1M5;hPeI!xI^L_Gu4Ns#5?iS8BOeBAi zXVcYwcU*y769D70akYOn*`4R+<)#|@mp-W8TWq!T=0$jW*4xp~{kW4@hkM7}V7%K- zbRbrT=auZ=NXl=ApO-c^hjc0J12;^_gK5~HI*Lf%=!Vku_#OZ~m2%PJI_Kib9igK> zIj21tf4Rf%<+c*w7Ho>&Tq?Di$^_NDoZT8dBr=~FRK!g+D(XiN-Cdl1{$P5NE^vZt zEH3cKgfkDsm@|ddz5d!L5YhlPlN+%f(#V+^mA+kguh<~w64k7{gn2YT|!+X}X9HvJ_PYoXFN{4Qh_k&}|=<+LRf40Ru< zwA1|$5YSinzh2=dWR`O!%9|c7WTM=$=rc7ymgCHCaDE}%O-K+&OHOg1WFBAQ8-j3U zhO}nZIOfI?j%F_VLQt*dX+92&GU(Dt6NM9!=lD#IQjCY zt;vKE%xevPkFnh8ZCvUny{|rSrHK-eu^aeYAfwN&Om7wxEj?p4`_c4w!`gva-bnrR z*Mb@DBl86AFY)F46@KF;pk?!D#`XSdY>m70Obgm@kzVFoZ><)KH&O7*!pn_e7-7{YS8s0(@9z=7v6;{xY?&#u9pkMlV;+pt zl(erts!>(GB=%E>B<_`1|9wAIRCNvHpTIT z^|ZkY#vMC&fBtAsrT;hY0dKZSk4SW<;gn23MMj0<%^UE~3UWQ3{z^aJKRrZ!*k;7m zIswvYzygcCc2NFqXCz9O(qQd)Q#8`6ljF#bV&|AADu?WWGBQUE@e?xu`FmLoYZlTQW2wb|X$i<0f#hz1%e$x1t& zCdn5OXvn#MyZDHF2yS+;*rAPCj7VTJMX27eFdke-TMdnjO(bCeNv=dO-8gK>2a#2s zs7ToBOK1!93-5oJN#I}GKfU@A_t&Jez$#@SNDAClgNyESqZ7OM9=PezOixa}4`*Ku z)y|qyaXbot3ULDN1>(tSxr~Hp-Ew-PY{a@8P1$^s88@l^+RH2p5Uy@rEj7MTRZjT>^{u>^|RfEZ{M+w;{0}~ zuT?S(fgXhaJ8eXbAiYcOxNzJX2mS22r7zkn1)7n~TyE+BE2*yk2k8w6{-dA+BwQmV zMp)dj>D{5)RPNJ3#S8vh-@8I4u4I~=WC`sU60lCsUqyIAE%D(b(bzv13tZ(8DT(|$ z3lp)xlToL`I?%WH=5H1S@1XmelBoi}e=vl9-Ga9dB*Y(ps8N6eZ>GQ^!4;NrL8q7u z+6z=yo}TgmR|9(FW19LytQ60nF%iK6a=32XHh!dALjw088e-#Lp}US zv#1DEoQp1#xbbk+k zs8d0MM&TVBoy(onG!>lIfeyDg!IcDZvIATFdL!Y)z<7SCF*a9&nPybJy_L5n4rPVa zSFb@+&YdA7XymT73+2%tTLr@wR(jXQkX;1sRPGDk=x#+=E{>9hzRfK);1knB47Q-Q zDl!Q#`D9dVdpo)B;gQgM?_WK-oISRBbts{i@pW4eNeTzYx!QakFlT=>h3WLh$JX4&4URR*1fT zqh15mAk4CrmB~@>lhZ>ar=~J+AH%G2|L=$vu?l4uE-2BF;#+^w(8`N1?1#lgao=_( zX((gM0HPr%Nk;~(UY&9PM@hCue6^}X88aNV;>1F1aMm}mo&V7C;tN`1Y#)g!*3pb; zDdExVelQ%0Vmj_9;723jdnhU>^36*_W|~Mf7LTjv`Irg=2M}ZPZe_u$#-3v^<&P`5 z)y+griX5-fvSNWaxBTTEHu>%{@@VNnyMN}sCn;U^uPMw5F!2t&`Z<9v2sFugwTcI$d&dApg7FdrjtDrOZLaC>eDZf)iwK z;ai?5Z@tlfj+7Ix%6R7f$h7=YNc`TAQ0~+-?T`70kI({He;TqeQOBu$mwT-4O3C-X zGl$y_?jMF>!IOQ6TcV}e9i;qUY$6Ky!6btVO9tDWRqvMpEK&7L%sDWF{(1iPWL6kZa6e2*Z)Y(b($g$UdY6GNC4X^5LIFd_>36sL*x zA2Ock8B-Odc*I)ABt}^;Fx*;jWweg9_%0$nOjZp`$$E;aQZsu5Ed6!Zf#2_K`OsPa zL1O(Q%QV%A6UBCITQd7@;DvTyY0NEr7A&O%{YLMX{s~>^=jiHJrM;Od#yk(Nt}Q;+ zU$IBQU+~U|uSm3;%lVlSph0O)rG85e@5mWtD*N=DZucG13QcLB=Usy}>(>LzgmGKO zxAXV3XFU&gs7Ksm+^Z?5riD+d3*x1x4SSSbwdde`2dkO1GqT>{wY;nix(jxvakT{Q zWA3?&6cQgG6=8Ma?^aLD5NbvHMNP`e2JEUOCuQ#xp91#|(?A9+JgiuN~qTJ_t4s@p`{=tc-fM9;p|WSlQhQukJZ-`YSCp>4A+`;cJnUQLckH znEUB>(7w~LMV`(Z)^ex(!*Sh;(STC(l;G$?zlN`1jKUte=)s_MmQx2NJ$OkL>%u3hG4c7MIva5S}d zYI~l&()`0V1r04;1*sQM8u0k)sWCC8dGhH40*WXud!B_U)&lm+i`S0H&hXKvoUgws zEL*T24iLX2+IiKFP0R6bCr?&H2u2it4j_(}1?gFg{e7+Uil$gB}l=1-&T(muD$IZ;3-qBM(Wo(P`<3w|Una+idoMWPfg8!Nme zkkq_@qiAH5TeN0N^^&T{P7yfYhx&Qy_G@*lr{Jq2y647f>WwUUyj2=kEYGdMHTyqz zSNd6x=`4O;iNSVY-=V~x`+HX^Zdj&VyPPYqMXCBt zySV06k3_6IO-$}Ho^V<7y(?fw+zjjzG$x^XGOok@$0H|)?o$9o?Ez0@^c*7)N+vLM z7z+3Ht<@WM-cn@M3e_B4%)3`PE_`sjXrleqy(bK_CJ`s}A29`&7Wxs!Y-z6WJSBcp zOAOk9l;m5e&}1TeWiBsYCcqC$3wyYu=TgO^+nXu*smgrs&7d_m^ei^ErsW0ExrAOj zBqUF)N%HCcbEeHn7!kg48<;blmZUc-fS@d$?6=ombe`h#sewMQ#m}vCw}+>FjZJJ{WMo(S{#8{$Zj0pNcG_s*}8*Ro)FlHA{QAIBX0tJt+QKMQ?-YA@7x+Y6bPr~JyOZf#t`gkdWEL!Dv8A9BY*#@}#IeK2xT>Gqv;&Z^k&PQjE4jho zoN{7hWp4Oas67IE%yvqlF|DIS@!5g+a@D2OsXuWA*9rmzM^`5Ayq2C>`yuhumRChq z{L4J&57(DGKmqEfSiL3D(}aYakWO8FSp|A>F!4niaIu_-w-xFDijx#G8SrNzxXUDi zcuV0omM(u&nSVcLO{^?SwM`B_-Q2C+%(g<$g4h?c5;ZGmi14l^&9G>ficK%Hnp8k5 zNU7t32Li_h>3>5FzI$$~gL6`mTjC5@TO%t0Yc%rjaN@tQlD7u#d$GT^CDwNf#^*QW z*iW!rV~gFAKgWB4wcu3t0YEN}o_8 zaJn7<4?EtVlJ`0+x16h)15l29IwZ;H%ZtSC&0yF6k|G-QI=zBQdCHE%1AAO-&o$kX z5s}qBWl+HpLmLeTo2-AVwN+BVRXrEOlB#51wC)ndk2?9V%rX>3tRq8rK)opr|8_|H zt={b|R-=mQ2L1hVPp;c6#fc9PCDj4%U4g<$9Xg@wK(DFs z00?i-8ACi8VHlBMl%X-x#)l+Vs@&tU>MZ)2t(P7#51k53gz1M2Tt8Gon(riyQV=Hf ze+^#gO29mw7R-?>?Y0IAz_81K+e8%gkQ(rXNA}MN=^~?41Y=b_K@}-HG`R)ZnHY;T zoSX3Xbjk%A(N(~XQHl}{3iWa^F!yW_@q|0uObuW1D=GL0>$3_Urn{!f7zj8SLZc}G zMBL$~u6XQtA4-G!W>28>U=F}#=26V&0^!M~Ik#vVRqSNa@dJgvL5i8mxiN8#MVBvf zOZ(6pO5w7lPBU7KwWF9+i`+3R!hwYOgVH@im6=)m9@5!o$=aY4T0u6?Ar{3UCp+y5 zRJFDNE3f4(>e8Cj%G6vXJzgX`UllR!^561&c5xva>r-qORzwR+7#@+|$Azv^4~UD> zr>A4v1C9Jg8L@SQoH%-IUvx5DNxXWk#ey1kWENs z;@)71NN(~WL(M-(HaeOp0mBXgb7VNPKFWqbT6uxH z^Qvu^)x+MX`uQB&x#8}!4$!p>D~?r{LqXYaM4)K6csa zAw5CGA?l1eSN&2%#*@6vhxo?uSbq)`sU-AmpZ-D<#FE82fHcK*G(Wf*k@jXLPlQYw z$RiQ|HZk)+xMj7`D*O!2>^?dTF?e`q#1guo9jRhjXH$oC;z=+g*n>0tO&}zuEC%QZ zN$t3xxA@n{4@a(vj;aM^w!sX-v5^p$dROK|ggxeG%omID=tOZJ?&_`Wmtg<$Lws2Y zWWUX1r`j8~qTm`iHdwGB4x5(SNfhqwnI})$OmJdRh&?;6avnWOF2GigR!ltY zDX+ytAAZEjY?zmJSjg|}$=9Z1c2-?$(?}!wwDv?zczPdB=%SJh2DuqMflS{^D}n&>FNpW$uC@U;U3@Ns4lYf8rtI5Cvv1ZE9%vDk8>aPR?c-WJ4^Z*n!7D3bKT6||A@AIWW*$8?2d&ey6NLSt?j;V7IAqCqPPmDjRe?Pw7(ZHXq0`;^I$$8}(uZ}ab42ohpaK_q=kpbds44OJmbARdUQAH za*HOmz>t3X-x4)KrT*{Ncz^QVS4*qT^X-?%ig)ckZ{juhu#f$aQI!v@n&Ny=Y#G?k z+d^Z$zO!h>Hh0*Tt}J%6`e?J5Co_d-(FF>wtYHdOt@=HSTHC(|+=#>nK;&RNqr}#t zE(#{DVZBo#cdvS5}3u zdJ{MuhvljiQPFY-g&I{Lp1Iw_s){H@g>x_L=S0@8ZDzvOhQ*YKpBgs1?`tPIixPkQ zoo!H7Pb2%2QimqCM}q>B0?TK0n**eBbC^(C^d^bT972YPK8Kd&uqEgBz0ib?S#Zjt zhtUhT-8}hFMwc<_erK}*DX@Abddx_)arRp6)^7_@wWDuR=H zCGKc;_+jz!I-Vqp;nK#;H^`f|LK|6X0WIhSE_W;j!QZXVN{x`;~l@C(Phb;fzY6@zM`TJGq zgOG~%V14E!SF#-QRz<1hzR44qRu^r7B*hz)8m#NlG_RNL)yIhQ?1Kz_KF8?dE5F4n zizk&=r0(pQ_5?JiHMM0UrDz`fAhMtBoeG`L+ctcws$XWMe1S?v_T7?G)it}VXb3*n zp3B>MI4v6Uv=hfgzlL=HATS;Kwt+7RA_sGs17DX;+Y?cg1|z?se6y57XL*WAt+lFr z6uz6%QACPCeUu-6zNc*^?ZRfn_k~MkiSjOLtT5Qx|+rx9&1f$;j)i^_L3~SK9LGcN0 zfMCAaH4Abbq@&978n&6*;&>Kh{BaE@rz!zPMQV7h5H?ACpQxGZvXO9J>_KktyPjP2 zlwf}DYucP-t3@~wfi2PeK04@G#**5u(y?hxn<=e0HW;YR~t0%D4R&O9T-s)qZm#FLA;wPE$@Tb;#ueqg)(uq!LP2 z`IO(?bQ?1uW<*_~2i0tzze17W!LG9lK+!ePva5N*M31h&t5=<0w$*TuHI{yi-4hh=(!78PuCvJ4Zb=f%%9ypA~nkBb$; zG13Msh4O8UWJAK{H8K0nr*u4L*1tn9rL1NkJ!+m}!O$0sU3iUbz4Ls!lAOo0J#VH5 zu54(PQZ^ak2hUozRf-EYVE>%1!$(Qr;*H)r zNi8K=8A#95oKfiL)O1)ebXbVM6V*v!JY$0BU(h6)*H;(ontTL4W?3Mqe|H9WZ@PLMLeWFsi?iPhswQ z!27zUvG0nhzcBglMV*jGe-IG|!3Z1fJ2@+R^{G$dpMeL%8-QNjwYIS{v?|Ut-cjnn z!kn&pO_weI#td88dsJw`cOu3@??d0>D$K?MqDV{BxCzmyw!Zjst_+Ydi7 z=m=%;3uYcb&o03~Pc_Q5dD1(K;cK@rAQj#0@=<8AZN4KqpWnO)H*KkIpuB@SBs&x; zG5PiUdR%F+<+&) zJpD=#i!x(ge{e(BM#T+b70(DkRxc@5scoxKA z3Z1T;&Cr~# zNR#?AuY=I$6-pn#+2$~=+wZ3 z6R1u~?5`1{yNQ?4+W$?e!J$(ewVw16HczxpnV(Dn(At7|Iv|!?WSbGfbnvZ0yQ5|= z!|ZEi7%uNsr!%~zsrg{9-ZLr4crxppY$AWIBddE5TQ8E`MyBwgs0%M(?E9;h#LDf9 z+!$iNRX3NvrdQ2Q{@E#u&wRS7yenn>MzIo0OBjFGh~Lehnv5+etEI9Ren07@@1#Np zmWAz%2L~5>_==NAi1YgRL8ex_Wactzp)Q3G@PrF?{N&IlaapAKawS(95rBSo?Z#U3 zwy52E7T_&M^%T}7!;{?e1_UgLL3X#0C+pR^>&0>}Pa?YUuO417Ub6Xi1ilB;sR2pf zvSpz0Gz2*K3`R8H4uvylGR3*a6}=T3;H1#Azoc4_)udvQ@Wtbyaik0k5a~^%k9fmx zZWElKS_;>6XG{H#i8;M|tgo8jiHz@5XPgo+GCz%ZeJrR)%YvuZcME>VfGj; zQpE#N7ei=2$g0i(0O8pq?q!hQsd*N`_4Gh?_j&iQE=3*PC_~)O zB!&*N`5`cKyeWa@UGsq)S@Mxh+v`%+t0!oNH!oc-I60YdPJ#Pgf$7`#&+Z>rF>n95 zwbuXt^-mW+#uLZHA*Oq6CmOH^>#W*M-fje4s^DtkDd3ONQVm)e-o4`B9j1ma3waaq z*(UVs8**VQtIz$5MIw?iNcC9$(=ym9-*>I$&%vF{IjSPgt36*Z>Qh;R$lh)C6h+~=VA}Y#_bn)^@HnV>MGq$4s$wrpP zS|oLnL`tXjq@~Zs-O%1yc%`q9vL06eq9Ltj`B}|5QQ2$62}^xK8LH7f)!?<{A=Xnv z6T`Nk0v|$Ss5Ya^l>Wi91yMGft!3{D>cB-YbJ_cIM21Jys=8Ha%X}(%hATn)w__Oq z!tJ-FZ|gD6WT)l01@;ZoH+C4$FY^6l59bQF*iFw1Sx!vwIXY0{GBD?$tk64y{Ox^} zNRP&7jIC3KRd^T#-{+9E>{mCt^$eH5-w`JL2!?xx^jld9XtFCR*bQaqku1@&;2jU=v`S(O_%j{ucs>=}cRNiUqH zMQLe2MH#Wc$1=IWJoerucf`Zv#Uw@9zxC1PXw!pLk^=rGH#Qu?fuwatf z)yR#d3&ow#PNnta<|SjP3C;RJSVJp=H8^Uh%S<@0U50zfP+HD8{9mjrE*XicQIj|~ zS1E*5x$m-P#t4q{R7jk!uM9_4!6bh&T>}lpjdU$G+4Kuuh3~34&!}FU5&s(X{mhOZ zzDMe7QECpVnp=8?C7JtPyLNQEf*CgWtDB60t(w2T~S}j3aX>H*FSE#Z!$;= z>O7*Fwi{HgPWoubBZ4RqF2=7SLn@c3Fbp8U=H!O#1m0~C&p=Z+;x$OZqPZ4KKY>*j zFejUkaq$i#hzzj0B0+qT+qI)3Y*z;wBuZt06S2BH9q#K2T<^)dOq$Cip8V8WJ1K@= zH?QJGUxHd3zeq<7&2kkOS8({=J5EkRV=y~+G-Xax-ijZ<{2XfZBE9{c;#RxPXR%a*3u1WwlN~L$H ziZz%}+zYv)aK+beq+0OLwk8R)!ZAZy!V%{ znjhlM%*_8s1W^2+nZcjxe)w`&`^O`wed6*S6;RAa(6ay|QV%)&cr0KC=2(;-^~%lO8gG zj3f}*6=#R*1j9aA4_20x0)Eq+g;i-fN(FWdfk#tkb~az)+ca`|y!MhEECBTH{b4$X z3#)kMhq|>%UxO$%-B;E+h(8StwO}J%tarkJYrmAQdWIt@OQy z5z_|)*l{scb1If1Y$o8#q*%^A{i80=irar>Em5ESZhmr?|I7F^gdz9bfl}p5+aGCu z%a5Z!D$&cGhAuP2VXc}^q$ORMoF484#&sO$H!gC?=>mS&Z@pBupvcd=IPCgv9v(Bn z!F>cBU@Pr9GHx~zQR4T$Qsr3Jc)hcQJgp9*#7_EQ*r)kCNN&-*-g$Jxs+Tl1-Eia> z`Vz3?8_1Ra#*~N+%Ges0QSYqGwTDfhLPrVFLsHL)-AJWw{y=0NBSEO+^yT_EIAFdSI38EYAehAOkZo^5k`{Y0{8llzgBEqD*M+p^~ z?OLyUJ1>5Xr8`>~ZS$*6{rZ5b4xRyDMml4Jk_;z_YeR;z|0+3a4?UmV{0)zppr69_ zrxBij8Q+hmm#j^DlC>Sh!d+Z5Rd_F55m*>SlNSPkoMMqBmyRT%lX+|>XKANQR0LxN ztU@o0k&oqqMuN0{RhoW*$Np@d^; zswBcpnyPsPXY23C;Bm7;W+`aqUpTjXuR+WPFj!~8(`@z zrt6=UU+JBkewhO1}Cx`Hb(7(nOkp9yszT?vm~A z-oP{vp3SK-N3sc&P5LAl{-F8)v8c!yNkKizhDwXPjYQIFH_zce1|QHZR^k^5G79p&t-10kO&KyqM|S6kDDo-R*u$Z0!eO%8rl z=1{&!2q3nIUq33IX-O3L+RMAs;j3`N3HCH;+f4wwfSTva;`n74?h3E-Yx~kpx*=|ahnsY(1P4N1+2mL>;>x=G$R&bGextHoRpF`+H$EQ z!rZ(2_GAt|0WxuCf%7CBe#F97T9#OsfI4zptwX+T$W}~fZ0yC<13amfJa;;wO=f)d zFd?I`es)+AGvhGSP^|NIGq_DtzdPzSB#PGQZMy&qzY+*j&y2L98r>)tkhzx4_A<;P z+VNOIZ?^LFDWA7KU!3S~pk=k3$d;6ZP_H&iPjSgBvj?(Ytq@y~zSGB*>if;L`Hc-H zI(dB}O`{vYq`~Ty{H!c04!$fFmc=X;_nQM!2$Za|;A3Z8!&xv#j002fdMMsIjcfuX zE39`}^@?>;rvmv5lROsMH!r|~4v<4V4>$snMT%diQ3K#1_^zE_3LI+@xjX?8eSDy| z%8Qi@;Hh~FQZxghYNP7HK%a2@yI}%PM{s8F<Dp-_Re-UST9DjIn-pMCc zu3D&Q1XbR0EV`pS%)7!VLd;Yr$rV6n&fkvth@}Ru0;eF{^t8jD^DOmzhU?p_BQ;qjLr^HS+<0c}4phC?9gn@Ai*Od2oMt8Y}1pYShd^IX@P$-K2oAk9BIU^*4`iXn^oHxogu)V4eGuZfiX^?S0XK#g&=Lxz=Bts%hR^l0$3; z;m=H(*6TNu^J}Gcrxn4}x}pO{itMLStj3iwEpDNsuucxYg~|ZISHo>X>h3o!)qVb2 zfUa)O)htiqSro+L`L|IEeBqgUx=5JJ&($v%wrG>kwN}Z1zEJ$8-)%0hTyCCYF_ue7 z#{GQlbd%~*vx%9fN=oeS^4`ov6x1luZV&&jG4Vg2O!8)*o*`52CPh)_nt#@K9iZh@ zY8s)WKaOf~O6L=z< z&{jIS>^`v~3WbTzh_BsQI&Vu>>iD#3drRQe_Gsl+hrXL}50SYxua~Z34K({*QJJb; z!oc6N@GlnSo5)^$bEj74ZZ~<>z_tXfiMDOptL*xB_etLWVkI)agGg1eX0|6b95#Qq zA+BX!KM{_!zSK~uK6AY|YL;7rv_;w~X(c)@%(D11aJiqm1jtPSfjfkFCT~Cze?3{9 zJ1J@)n1(yzg|{E~LQw>{W~#FZ%{5`~7$;S?r6m1+GP^8hT~@p#7i5otm5jHz5`dH{ z%?HP1JhkHI=&vMqN4<@|IU4Cxg!(6cEpu$i?5GaYXLwc$Bo~j;yIY)cO0%5cOE_<~ zgj;ZADCZx7GRiwL{_?%yQ%XLZ5d;}CtU1(&>C?m4!xTN+hX$pp_Rfiif?J^EwZdJP zMyMz2#ds#GS5f}6%{scm?#GcR2@S+`?X{SfM<#-$CuQ)lE`O!r+hrzkqO{gULMOKNIISnDqDcU*2WoY z=If3{o}y2vNeaS=QD_0_2L8?M6M-Jojd*VsAl)ksDNJ%@vXVZb7xC;ItU6kd33GD@ zPy8*Iq)GM(EZg|DQg?KCW{q`r9nZ_*8Ktf2ct558N0+qT1U%zSpY%a%z#Bff13UB& zZL#$_8bkqIM~L;_6NVppA_{nKe`+pu1~ID)?>5IP;<}fqBCyf|c!$IjLLu(C`Icpd z6ia6Q2H8zA8t4SE4*OuFBZk4@2Zc`>nx!rEXOT!ztLkm2YU%B*sni__F4>pW!<^Gw z`51SO{*z|`M$caLHcWE;0x$p2%bpG2oU2us{;{Ac@&b+`CB?#{0)`37rU?RqEbLnL z>^-`S3{ieBjc)JE13yg)9WX2&Hd)O1g(j!c@LQN+&C7JyXty6H>-zxv5gsTnTBQVrCAg04JAxI?IgR>PY4df1L<#=nJi<^o3B}vq#%EtIXVb< z;b=w2Yy63vLHSAH+bi{K1hgZ>3Di((9wEEq>UpzR*v;RhPYcvO3!MZ@yB8pKZ$7sL zD{C-?t@3}nMLU~*`?$I_vtgaB_=yw6Ut*)!&QtNIJ3ptG#3c0W; z`dE47|DNq%tk}=ZKN(ZxKmO7Oor+cZw-KkwVRA(ssc7GPsB3EH)CV2??|13<%nI& zp!x>q#xIBTSXuSBnZ-!;14I9G~Nkq+^cuwP;CS8%5yhJ(pEyw(t?3q3Na4Ip% zLx&;D_1v9&IYYvp!s$B8*Jxv$B5iQCg4NIP$kMg!#LlqiD1u|k z@sNUSxl{YQSvy<=B-#?~6QLoQTbb3q@p75x19{#6u;E6+M4HDD1O+ZirXj^G_pZ}X z!v}R7hus2w%1$S!B<(i2K5%29n6+3zttA2u6kU>OF8XlkyB<68BJ`F4%9B_XnhR@h zZ!$_!WWz~7PG!|rOw)OUropt@unG6Q1TyAtX^Y;rOg$Cw^I(W^F}MYoxV;_!{;T=) zO^V0yXW*H89e~>_?q@S?*Fit7zl3`M8|mi0Z#$Jideo*QHnEW8>tl+ZFg zRq+#PGUV;}s<&WBme83CUrn?1x7%jgZ`&dD4^7(j9^T4%m#we=M-cZ{$5Irry53bfU zw_53m{oJQ!31svQY|@6gN%otsl78&g485{Z3HlNMRQnf;h)J^&QAV18H^QfO#J^-Y z(&c|zmztSS7M^+9(LAmeIV)44%_L8mcX^m*Zu?ier1r8~gxa*_stHgBPuYjTz3hCk zpLdt@DFCUnFh6sA8v!fSoF(<(mOy)1G=g9eM#`b3TKzF@6?fs&r7<+S%>^56F1#WHYk) ztz=#9y1oI_KkD_+%}=j)^%yK#R0H^b(j_;KluhfrcbhH{n*lM-dw1+US$k_?5P|1q zbFH}}M_Wp()l@oK^OG#caD?YihWJYJ$H8@L-8*&*V=(D)ctWt`eZ|VVC9#nneUa>> zr|UC@TYAeHa^erMM=ut{17+(+&njgAP49)P&yh}AJ%XD_rdHOSOio}#+;UQwQbtLE zgp~Pbt29hvK^t{2azckFB=+EC3!GuU=i*xqFCx+rsr%%M)T-M?lQ4yS#I0I0`|lX1 z;>n--8Gwe`TKL?gOOLRCMBtU`ML%7e?`@ZI5j41XZRuzEo(0^wn;U^uTgbp*7Pq{6%pAD*PSJeXiq^)9*T_hfk}lr=>uJY zm`)aC34??eB3Tmpp(E1qo+9oVC&Nr^BW3$1aK#{5VK9Kjv(f}8n1N`)*`;Mx`PSh> zx@JgZG_XiplmsjLT&9Qm@ncYKg73}?)81&E)ZLEB0rqW;;U~K|**OO8(b>pCJUnot z`O{oeh<`d-!m08-?ViXBUiFdV{P}J=O)n4zp=GB<|zmFj8*z1>p387@02FGcGd3ePNGDUu02C8-feq8t@pnf-B=h2z>7|#xP`yz= zoS#_o(bG{zq9$_p(1?kPypC*(^&w%CrJ0?vzwdwREUk!C=6JNmUmjIj7-e&2OK$>r zS>WG#_7a4y@};A*yrxNq$Gle|TATjBVV@dy8f9ysAa#w6ANSwTI^q*H-LKRq!(Uy? zZ!LcL=sO-#rTT5A#QE^^uFGvU3NcOqM}88wZ1zv6YWk83NHh1C635Ucn1*LkJz>Lz zgTS;nj>OHJlNt+~u}c{FM!IU1$a|F9=4yOG-0CvC*J}CVR}uZP2l}PhPHt8y2gsZ~!&_LjY3oUXWVd4nVw+Fc=Tk^98{ncr%gn7Lr(NnMHnQExYH zt1w9XsE4z=uR-y5$r70j8F3BYDMu6RFzEZ`cT3U~I;@lU^cl}~Hc&0Kw8FUSEB5ju z5$VtK0$j@UJCQZ{?)roB9tin`0@(7=!s4*tNx?N%5m*?%zdOdKVXO2Kzj=1QS{y_+ z3j!2unAad-xqumDl8gnxeai2K+nc{Zyz_6nTeSINL~S335vqU+xBZXmH<_hoigd2i z@1N~h(=bJ-NprcRS5`ODV0IE{AJbb*X))l)sT+Fx zpXB%AC>`q-UaRaX#nmr1u4^4j2~bZoM0(wSae`%8`tEy=`BgjjbLMz8#@47;qOby) zP@cjG3PS6h7uEj}lSpfUQZsr6$r`DPz-;#GmZWK@a+HUjruq5{dql$}iQ=@^8&s04 z;B#^ht^>`1a>dh}iPO+GuY>I$HRAiN{(yd$J~tje6G3|gM&BM~%_#IcnA3zB_>?7wS%O9-%}w%L_WIy)fTq1|N6+4@+g>1!>Pqb>){XM&@BJm)4?h zepbtc8}6Oi-SNofES<{_fkWq7#LA9(=;XQVO1thU`gwo)T6;ynyDCw_@3b^GYwVL9ueA0W2 zrrhS(uLAYY3T$8!zEECg^R({f9z+dJ{lm3&4a|a`$D{CbM36fH;tnjew%~4{pVyz6 zg4&vV_D+a*qu5R?JvxYEjW@Ar` zQ$duaz{ZQls@l5{#ZcvqX58@XL)yem?XmcMmhlw_L{YyaUdm1(;Q{dvgs$^4Dw~f& z9M|7sQH|qmXDXhB>)Ir6QN%sU-FKy7r#jHS*Kii^4UR zZN{W>&0jIi!a%{dB7qsIsjy97@GY47EBVtBYqIR(hM4wuD z`cb7hoWsi#-^`+g4EUI(u^b02g^wRcAEwgS&ax$qrKEvGb#G1Q0h%l)g2<37diKp`An9Zp@c7c>r==Rd9{Txjz5~QUv5!pLW{nK} zwxvwtSF(hp8a%x2A?a|FJht2~F())+*5s_JaEUItPLf)}>W^O@hlAxBAoc-&NrLJ(HS66SMqT~n|pvBkO&HJZ692oMXBGaBSH3GU6t$QP{9Mpvf zqizf@{L=oxs3comV{bJ%>qx9j{(JB2J)ZNEdU~uTGv2o@n#^*TDZ8hEU;A)x$pRd(Zt%GXH2$9`kTfHQ=Escwq6j#_^~!{ zQEdqt6jB<`)0}q&V0W}d%~$Ott39*`UKB!oEm}YF>~oZ02jC#5@sB>iB39nlLvrXO zb13yi3aVbkoi{nwWyoMdLFqb$p3h(KLs~LJ8KX%VIqkV`(x+dze{NU#? zi6d?v%kkUPOQZ%GFNR7&JG>R@Ln;Cmd($d^|)wr23fquqi(#30e4wnk{NlY&e zI+!C;lH{Br@WaPgxU+>_p?A=C^Yu#WEJ-x~H9p(1x7UX=q>ZfVMaM6Cfv$@rJ zwFy?6Yoa99caOp8Z5Nh`Wpe71pEwz)8Q_ZrhZeJG8xQm3AEMd@>Mpgz?)}a~2$g6t zVRwrEy+|e=6ajfjI$wfgoL`r8o|-k;I&Hert`2b#j9c7*{+JBpf8KD&YNKib=@#n2 zBgs~8j~3IS6?n`Kr*^#<8>acnWQm?=w4d78J)Py`?A5*EucI7Lw{louQxj*))fZ}e zQo~*uTSpC$(6qGZl0klA4UADJ`$X~G!lP#`p-Ix)%+x+KvdOQLuhzNmc5(efsUB}ccN3?wxT>bzd1bKjpvc5Qs1V2c8pdOG3+KKodb)!e@5N)Wz= zqwG`GR3l}gIx~G#oq%2k_s}sN<#(1EF|-@AgTf%Mhp!`QQ0*#Zb3GSOcTpd7ppSy@ ziZ-p$3Z zY()+eGLwp2Wo1Q#Lp6nMt-~e}bi>75Aa~3+}9HiHc7R z&kyrUkwIN(rlCCtJo&QA^dTL2634pKRY4Q?MujmEa)iECkY@f?I|%4&CF4`koNkA z!_d2huv}2)+F~?^Qtw#)+|5K%YOWQ35R#ix%>5`pcLFoza8uXiFQ%oCDx&_(Uur+c zR>Zmimtg9rqFK49^ziaN(;LY#YO-TH4hh}1KJ4c6n{7Me`{ebC2XruRJn)0@Fs|5V z!G81tlU7PRt?YztK`qC{z8ojcup~V3dF_a4r`=p5oOKgQZr`DG6}Cz*zNG&u8T4^a zinGa;h_i}4440X|f|Fr4$yI(9KA6__{Q5SUE)S6s9VBu@TSOd6j!JKFNjq`a{$|nK zZDraMldCYWZ%)YatmO+MVpWEQcMR(qobKejofcCUAe+&GO;$DvY1uT4J}l{PH?^_S zWioFF@=x9veS^$qDQCgM@F)XVVSW$1(;^bi_*}2)r_V;tT==6bWc;T#@Mr1u&+co= zMpYaS9=I5d+2W!w*pEgUiDF{zz>=RD6m67(wCp^l!opf%E7wzjUW7QPxEBEOxn_cw_p)5Z=i7ixm@cU6|$VFmACLO8CGiN zY4zE!SOh#t2(TLh@CVN^d*Kv}CZ~#JVzyvV998CMUwFgJz(TCn*|ipt-9fl4MBb&O z5pFtynCm3FwzIf3tuP6dQWCZKHoPk7k7XWC`x|=M63gl{^ItBt2P>t6nq3lI`-tw9 zxBA*?`(kdn<)dI_%CB;kkn8&m-nrKt+H_u8gc2<23vMe$T3&>tFZKY}B*r8j7lfT- zzHj)xI9-X4>@PS%(#rmELw%K`+-{suqZxE)4Zj!DGq9b{$r4vn> za<02!$L?_0DAt8bNx0(D=n=<(Rq0Ekg}N5r3es0mFDhE|l%x^)HpF8rb&Yd^WC&>P z9KDtU>(wXr+UzR2HMDmZVn^ixUFoCv39`>q1C#Cq1ZB4&xf?2{g5`!d8Jyc<BdyrCRfh9@wJ{?P+XZW&lQwc6RsRh#x>#P@{tWm zX^?E3VD) zCJPi+0HGhL2lOo|Lq_lmI{Q#P_$&7IK+Y+@43Vc3z7fn~l@TH~!L^#C>yx9u`Qhl< z^N%@|CpuSx&<4GVj2^-hnkROo{H>m=8y|8{X^$|(11QnQRQJIMPw&!r{G2Ih+RKKi zcpV!a8Jwo09*r?)GZND&0`XH{imOEy)wd2^e7u?#q|PbA;&TH>KP=Z7jk!ieo*~BK z*JLglINSWVNm{fP8e=QhMQFF8w?Y}rEmenhoacz*b*dqF(1x@>0&2?XpL+sjGaELX zVtmQPjs;XP)2q*as()C2sdpcLM4waKwja#WnFw##{FC2@$Uaytq9#k>gG=x=>=~If z8*liiP32tcT0imkrlD843vlZpZ9nK36TEeEcrDk%5jK`IFC^(E5b+#~SsfjLe__=BLfVk-t50bv#&t68B+-Ib>t9+&fo|>1$-|gQuvG z(-_UrkA46$5=C?u3!E5HGhX`Y8`QWP^`v+1a+oLQ(VC9zgX9#P14K`9bY z7unHil;3`o-Q@gz$3kmn@l)gqjhJIdK2A$Qf#knfVPKc{s?xjLoADzYWIIq zV~8S=|JPS$VgB9b%G;NV&#s0^-R^7tiq?T&qR>=)L4i=0Rqk?l)PBC3K> zyrm$Q-NCDakAXO6gq2@zsY`~l$jm@u8WQCwZNdmBE8y!SP6T-zfvY^+d@+%QByt8x zKg;?#SDwn&7%i7-OtF_~D8uJIe3Go8!Vwv0#{(cPLAh0dc^8uMQ0c8)AHXWXg=0x}u&%;16!w9U~|oEx9sj2YUy90XtG&sds82Zw0+q~z3lmcDrx{YcS8hyo5w`%%s>Fxu7BWT z*b=9ySvzrOIW;qSrsXKR8AQ~|rxNnjZ;1G4@z$s58)Jr5L4&5Kb|N%xMa^%J8Eoi3 zK)X)IB*T6nqH}q%&`s2Iup`ORgrLTR){uNT8q2zyGJIid=cw9(KN9y@l^3NAtiF9u z(1Lf}TbGk~skx+p+LNprKd872!UsY1$cjg6h&>tQkQ<3*R6pV{;l zL88Fcmh-HTt)Bbe0@%tJBURjdQFfB8I5xpGmFvtMmb|vALm$Td-ecu{zSeY?#f98QX8zR4f*>}5HPv=b=RlT9fCX&Koi%K1?#BG!Sc zLodJ9hmY#v!tZ$twHtGHPr;%l15l^(f4D6JE+=sS3(li6OYI58biDPc(+?!KuN0m7_e=Ue*K*6`f{eVWZHyN7aVzYkiUZ;KWKot#{(!k409hgr=@Cy> zucdPadOJ(?#{dCSZGnxi8k@WOI>(o)3-{eCb{8fWVRM?sOI|y+FhS0#grIVscim^( zl5N|(42z%f;j?cAt03l$V^fQZmss7~oaL2X3^?%1LEbMX)LE2r9b_G*TX}{~^}(Tv z_~)Noh!VD>-N&P5vY7ch|77bvtuR(o=L>7IG#5~2x!od8`{i=U_EVtge#7g%$6ECY z#)E2<{J+PEHH%bb16DM@;z3U=Gib^wG&jhDrP|3az`nsrDBs(&GB$(hYMxT+%U#zG zgX)M58JfvY+qO%M`A4X)XJZTzzuNZNW}im~D~EEXF;5_Q%jakvdSO2->|Jqb z!sS8_WvLM%3(cI2!kPH<*}0tM)k91>7G+faI|$TF-7#a`WL}Er&+oz7!y0 zVQL(#cCg2w+Ms2#CY|nx%*)Hw*y*_!xS7zMwAxfr_@R~9DyDXb`oSk(++oiDWM*#4 zs{?t9HyC_5G*Y?sV|4Hh3;r_?^_GBt=(CZ8X@5XoQ zTlr%FiGBZBLNH>j;<+jIxT&d06~$Dfn0R=LWJ`+u(q91O(iDV78vA~b;SVBI=PjF= zISl-Rpq^_@CTGknr1i1$(D*wqG$3%bv-MC@z3olo`D}LT?Pz*ITdn6?k-HwAhH)|W zZ`RT*$%W4sKLeih%w!`q*}MEm_o&ZZVJbz1_SrEdK&_6af*$;K?ptfdHzt)^2K!xj zARK1HI`h3xGir&aLg&HW{-1+Dp1FRj+t~F;CmaR_2|{0ER@D&|T}4Af%NO+cjSt*l z@KGt>c~rBacr}m;qi^dS4M7O^$tvt>(n!~oB8?0Lm%*nZEcHct1Vg*n-1Fg9dy$7 zoxAwbR#|MW%kxAXDZLNG)Q``8VGDvm0B+0-pT{4u*x*I2xs zvApw_(r9+a&U(s+JVk`)Gbg^Ue-9ei<_FYYg?F96g0hW+iA@c7N+AHS} z7?jIFOI1yAi%v=ZNDM@4+p*K*V7O^rqqf$$m6^hUa|iE(NgsyUmmnY@RvqsqJ@V81 z1bb3ML&29$fWUd#ht%iNWl`9oy+saTgj2$KIO+W$`{|e2WN6N-_Z)dis`(OA@{Hse z3q$rWe#VDg<${+S15OhC)N1=4MstPEeqTvb#bPN=f}gAslsPX>Ed_R2`ydaustJJc zntoYdhg9=+2d%fBm0I)5t`$_*#a(1Iuif*Qn&J=B(|?u4^nnY@@RQ&SDSx1p@BuHKC#8i5ZvpoBYz!@66 zjXC}$I#S`QG3dr0hx|T&I(xLxWO_jJvZfaH!%H_(OF-Ck@D(*@#*e=uZ#Zex$;NE- z$z8YJKl@b1=JJ*c=BqdXY5HdIpc$(xxBB{|y^f3eT3Wfkeqp9jLKB(@V#g#BvL3o# z5c*i-wY?6}$_LStKXG1o?F@zMZPo~yOa4*wV5=rjdpG-i|Ibg$@sdbQ>=C2Bev|Px zc^oobpO&J~0On!%1c4bl0(lMpMR;_;t`>ee&Qe6r5O|G>iHs2aAS`-|mt zzeEl-R2)na1^ z*%LH~h&CHa7}CTwX~r+;+vU-9T7bXk3N)tc>M}}0uuPEzU*(zL-@<730(E%t0M5QL zaU5HA+BRM}@<~0wOxj18RCbj`-s2B(GagL#1%DIwDMFQ*_!Z`nPX$x#^;TJ!b1r%& z#A38{hnBggAU7d(G{)F~LXzw+5C_NcN*x+s8S2_J+IM|wXFWWlaN*wZPc;^(n>O*e zWo(mCa+!6$7varG2;5m(ty?0)G&NfulRt$@KfOCrf z;G$1Krq%}5TT&C$-v}x7I01j_w}7e=4K#EHVMqr zLgGBjYBrfg+Ga)AtJ6FuT!CGc4|g4%M+J3AA9ksaGZ-?O{mw+jg^%w$H&DctoB{8P zkZl@aqEjm3?n;VQVGPkCIBTU&d^mgH*j9Ie7Tdt}#YE6Vh;%t7q$;n)4P0 z%qDjPlQLJNgJi}Y(1$U7fz`^<(5KQRCPri2+weCuEsS|3-);3bCa*YSZqoL@d{}>} zOVThb_43u!<+qW54(Ja3ulQmIf3@tcwksOp5A3L*7j2$wmw>zh)}OX-ek$=xNSJPk z@&_aJ;%t`!qnl1`C5!mWBvQUfSW!AO_fWiOwZ(+Rg7T{()iw(CzXADa3rLfmVq*wW zk`yOJNglJUBnbkv2wgT_i-uHyl(XK%Fs?qW?|qz;ga|tb@h{dDFE{5E7qWw!QLq=3 zzeKb|lEb;V6;j5%@qCH^*~;|-=>*?_ef9Pc^lJiZ3sw7k?3TeR;-5oo6oyOjMh_Sp zXKl{BCSTz=Dqz@V%(!wOpPqAG9{X|G`Vy_D>%>=LjwQ)*PI!_uJz9BDOGsdL_YW-c z(lmwrySSd(FLQw}V?1e~xqO6^T3)lU(RzRPPF?#wuWLOVB|(Q{q!*=Hk0w<-c#er1 zcJaSc@=hllTKVLX@Y?Y9gA*U#KP{4Bdyjb80~^*>ughpbzkD?R#kzgxtS|bSuTWW| zqlC%EpkMYrxF^qRtCSF&7R!qDzn8*`34;Ns6-8NneuhG5{P3aQ;A750PVVh^dVD^^ z{HtdT7jvcs?@J%*!!lia9?b;*v4uPxq>!1}M{9Tb%Iy$v=<*jm@KxD!30WV*`l>c_ z>`c=uf3KT|Qe^PH0liOvtO9vj2A|VeSl5H8D?YRYw@$2B ztBduUICr+aPOL?GY#B1Y*@#?28c|Jebah5Gmc$=7NAKxZnJ?qw8{?Kgvf zbn-<~?#ePY-04-9GS!2&CSuu?i^>Jl8LK1BObe(ax1bKMRGREmlaxK#Btt2dJ{NAQ z*X%$BKs9TiYeuHdg87tXa4a}eRP^O22W^v62yUgWgw=p>^|MJu1zu$(8YdSP6AwQ+ zTJSSR6o9+W+AgW4{wh)fL@Wrk6#R^z;#~R34oAYz@2|nz@Rm;j1005oaxcC3>W6AA zzK${eEwqRE^^A_6bJco3g(f!~y22Zf;Pudo(QkC7QvyJn^{qjg4n$eC4-Mc&R~Mb% zNpQoY`9g)`=e!LQ+sh{sTqP!#ThLgyHYYEWXl{NkQ>bQjEkVU1WSk zsFb8~rGfS=A-Z0(|5w|2N3-Gndpzo^YEwmxQdN|w6??U)QbcORj;OtA#onr_HX%l0 zs}U;*MXajYtBRsxZ$*t#E#>B(d(Q9N-yip$bN{&iJ?HuRbDqz5KJWJ{_x6J0sg<4? zT&V`B2_p$2WzBz$8Eg)^`*B4WU61^5Po6@tR8|3$FJ1IiI+4z)mg=dJbeTjgHA9uH zAA^62kxKIl`7?nJ6zPAqlOwZ3PISQhPpa-_Vh#)`8lkiqmS5!TJficlP#J&im$dft zdJ*?H=yD~l0Ph6V&A-kT0OTL`x`G%{lMO5TZOIB`1>|v-YIaTtvN|^En^%Co>6RN1Gm^gEE|t+LwcQIPLhdrtGc zB_azJED&%z;9HONpw-x?nD*b|T$c*Osal3rzhs=OJC{fjXFIQahqr_n8qA z-w=8C$H(;V0Bd1Z%k@7|Bz4F4WiAnJW zX6pbrYC5yVL(D^2@1jRiruS2zDEW&D@26B0$%R^-QhI|w)JMSZii7XbZjguG#^tUp?V6c>5N#f;V%U1P`p$Og;^^&=Y}#A6+ciBlyH!>5Iizhu0B9FEbCr) zj|ZufM4{ql&Ncs*u&vC0Kh#cQ@V0o!l?Z-!SQ`RK>fU}N5V##jy>-IWK zlj6&T-zYo%Y%30B$o<`_YdH-x04cBpN{A$c3?J9177K79VgyAi5$1PFW3r5m>f{}1 zJ?vROn5GxXgU^6>I5Crm=l7OfP5UJ4R*j=J81F{UPjI>g(mZgX&I(Z6N82i zDcovEPt$A_m2ZNUPh0xJ?gO65kjH{0HY#TE?bJeB^ZYsIjrj%*6)t8{iLT}}s)tNi zeWWUvd*BRBY1SYPVSY$!eH|Z+(56Jd5b;FIy@3{k($|wlk}CgvCqaJWT;zqp9|lK7 z9~I$mx%s5m^)S{2*Fcy(E~+EQ9|KJ3X~t|NH>>;U6P&nPu|hUX{r6v<9U7SoZm7=o zT|84PE?9wrGwXf#DW#uGfsr<+uU05x0M{n5Hl82(5+qvbg{8&pydqXHFwWu9+F>Ab zpRgkJ?K`|@Z};n>FuC0)OC5!~)3xch+3lg=ibJw;RCg=;rRtyDkPH&}DgM-dM%R`p zb_#0dR1{h-^Blo6CdObPW(K+B(g$4u3}H&0e`Vf;?zb1Qj7Nia{V2dT5Ae+)23ni& zFQKjK&8`Pi1!ous6RYn$r43^UQGSDR*4VhpOp2KFSk1dt<& z!o>L!q&&4Jq-$~rgE_9yG9oNoD{+dsqqf2$rKhY9OKrD6)sj_iAX}O zcC^J6fIM^%w}9!d*vLgT$gI&2F+i*hlVS%mTXTI4NN;QyB3TM2BmL_Ev2pe?&eWwU z)BmXsg(5V$0^_@mR#M^|Cx;vo>YBprnHf{-jkpq6t>=4SEK;5{k=ew-wk?JGe|N#p zzXdsDmj>3-%><@PYWN~$WZC4l?NHo27Re@(8A!>^PMr%8kDCyU%Gl+xxDGU`dT+h&AtgW&bY z3)+!hVTm)L5a{*?Iwt^tlv-%YVek4f=0acdQWyMdX7*nPqe%n9De?LM^npfVZ>O|3 ze-v#$V-vCg}tM8<&9?u=@Wx)YIBtb<*5NX>rh>A6Tuk2Gjlnu#E9 zQAlb|TiVY3Hfw@T^bChe)wggmo^^nvN(tOUPrg^7IC>{O8+^4*9NNos>*rR94sXBd z-nZ(scJ}QG=n-p*#R|}%E>OFGKxI?zuqVTp|EpqLvT={Wxz$qi<{eC_wH=O6;&Z%H zxf|+saH}vz;bt&0vfy~F5y*x*k^1|^qEc@aiJ-08vzAc06ba%kM#CGGS$%!P7+&g9 z0_U2q51c|O$CZfuYl+AJwAhHlxUK4GQYB#zKlfw6`PGePSt?h9TgbP$w*G}iXtQr2 zY)3%tEdsjJfR^Db%RDF^`0X>Lba0hM9Cqa4k+HFda1KEDZU!dGUe<->Nww?kW<3s3 za|kl>6Yup;O5BBN-;->uM3$)0%?&ofa=+VNj(u^fK<7uNFSEC*{?&qog0YKLso^ZFbAm*e@pGk!$tQ*X>xYu0nu9I+bj6UKpFG~u`~`s1IixRnAh<-s zo<%tngxx7}OI7p?@a2jdv;12s+XuI5JgifE{ZYOBOfYZBwpoFtBsrJ|8pAfGi7raF z++MZbkxMGxsUAmPizc}Gf0MHB! zA&ZJ?pD4&6&194siDfRs^HMCqgm4xBn+{Z7_8*LIzK?`70~W; zM?orx8`D5yG6)J)*6J5qkfHV9nGec$JaCCK9dZ^5-Dv+i%MC7yD$f6PZL^GJTRhqN zU{}U?L}>y#JddBP=8pPhRhVF>>&oY9+8ckp!4yD%B>&kA^H`<)=hXG0qj3i13u#|r zaCG2eN2SVof2I5Tti>ww2JHSA)5p306;e;-f~M9U`}>48CDQGatB3N$12xN^y_vHK z3YxGY(-?tAzX)Ubvx9_yfs#}d>oi}I`kE|{{m%2cFclAyxqomz4h@OpkWXMCN$T&; z*N~Z9=Y1yf`ZOE%;gQBqmtB>#n-Se6_PA)_s4DGmKS9`AN~%b7k3kn z{pf|+_P3Cub6(&c>x&Ps^5prGM#+XfXLhLl@@L|-1Beta^}X5~$vS~ym6F!GvIoNb zZVAn-XEE0lM0|VJCz8|haM9PZNvfictwk4@jNb^F%zsRGq0BZAzf{`d?0LZ-%;K5S zv&oG6z=vmgrk}j;D85IYg z2SzEVe4?TgR8pcl`T{kRZ{B9oFH5Hqr_SU#AN9EiLs^Bb+dUWHi36)(s^i?QWpFAu zDmZ#8$gY*tIZ9(F>`)8?Tnxc2QZSglNaCGrcD>O_(l?Vd%B>`M9*h3UEw2$3UNPVw zAXFU+wLF5+*ROxJ;@qggpFAzR0z_>XWEu}2eTNxZ*Wd$vDgy$PU-@6nsURaEyN>BRoUHBYiJTtq zEAWi*$0zQ}0~VFfj{n}WB*)lD!QmMXHWSB(IPDVW8dsM7hzR3sYY8!InsbI}9|gC= z1<8L}2Azc`!}~6EPbNcVOD4Y%nbQx!9d)xJkz8KBqTfRxk)wYPVNEt!Z7xE|{pqPw?SSdT;iMv- z2L>qs?)aF(u5--k>vvQ1#M%M`hxZL#-<>&rADjNI42R?zgugKuJrsBt=k-FqG!>J-!w|cOMiafW9eCy_#4|k+{p>IzAa`4W14S)jx07wBmVQMV@2MYHCom+^f zwiz=0-K|!l3`J;0JEL=ns7WFrHnln4>Yi;=u@;R$@l1eb5VFQ~t_!p;w(-dR`*VCC z3cF}H74off_7D0ooFDY#@;`YFfYjD2M#h zqocV2@9(Q)5KSJX4uyczHXaq78ZNbjU9^y{$`9UjcVg+X_5C>wH^WfFgK)B-NoC+uP3o2r)>!F^{WZ8%v3h8 z+3kh{F!Vu^Kqj|R4Em>(oSRXE{QU25iRHEG66BjCl|gkbzK~I0+@>$pVU;j&J@*UK zM~U#7A;s!vZ}#zZv|5j8pQqTbgo~YMO$Mv=&8PJ6afC^#dLHpiL0PCO-Gf}-mTXYr zW3qH%mu!2M;DHt;?Uc--dR>(o{k_jImJ?ykinDC;n@Lm~+ z@A5mpLNhQ}-%R`snr(>p%v7{JSFl!>h2o^q{*b(wk5zCue>{kwz+tJvM0cMyHU}+x ztQ2aZ7p556{OkDH_L?~EMc!`xiuXF_sl=U7*m=k_?px~WGX1_>7`@b3z~)v z2;>oLp`BFS*Z*sD^8axd`&8?q1de&1K=trl^?3KM6D#|Ue&e`eHdh{N>6<^V03MIZ zpnEC!fXum&i(JHtQd>uFuel<}w)x{pra~1=sDb1;=j?QdG8Qk>Tg`p4aC&vxKv%WC+z8M|M^0S4>Rrww|esAKDo$E=a zH4~%+t^b8q6@DspcXA%;`N^Ba8+ubXz`E0x)@v~&k$ktxI0U{Ie|!bt+gw}=`=VT2 zpY-5cP(&D^MscPstl(0VPp>x*65NqN7D`29xVj#H>(Rw}7|O5?}h#5ZO2I%i<3{Ur3?AMpRC Q*8ewS;s5!b=W6yp0IAjW_5c6? literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.000000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.000000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ff6410b764337e731bcdf61d6f17da288a4798e GIT binary patch literal 49763 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 K7kcTRx&H%N)ZRt_ literal 0 HcmV?d00001 diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.002000.jpg b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/bimba-mean0.050000-0.002000.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e1274ae6d6d231dbedcc627fc2caf541da33e9d GIT binary patch literal 72992 zcmb@tWl&vF(I?<4Eaq+iNy#C-RV2)#~J|XzszWmXaGUL%QI@om;ZzvN6U@~$V^4o zkR-C^u%Qv7mohWJp%a4#>)UZjWi;N+UZK3cg+jr0!l@qq8Z0ky(*myIfnFp; zr_Elhyi`}AIttMA4!Qm%d(1F?sFrrqA)0zZv%{C@B0U?MFTk?wv?#RKfQsDhVeHn` zDs0LGISc0D+)1riOM-xUf~z+I0>QOif$@l9*M;+J!@mhU1_}iU3D*$pHI=%3IF61k zmy7%H?TNT?$=qGgJ&I{8L2zSP>!(25I+mXggCgOoFO&=CMOFZ*3+>wSfoto=IoP3%^Ey6vXI2cT}N9vIb*B%IiUaWOff zYttb)6TGM^_PQwhMLh{RuZDwo)h&rdX5U-S?##hV-;oVeAH6x!*tF!x2Pc9=YP5tT z*FJ|cDaXT}Zbg({KN-JfD;{LQ`mNAq4^%kdob4NhbAK$UXu`&o@Fmwh{WA>rIHKRa z=*NL@!Vv%Oq3aS14Yqs!bHahmOQY`+ouotj0bo3Ndy01ty|L_T@Omo#QRZ5*&Y6_f z^rOaf(z_nzcm>m4XtHwYT3%&J3dy}QDp^pw;a{VQr~v*`s-dN2EdY9fHb%!%7!^oH z1{Fi^*hN&RgHo~BFb$T-y4f*&vH%YgZ?WKC#9N0g8v4J|JiT5Hubu1vY9H(Wun0Nc zSrq5Kjc(k^mtX9Jd*S_}Hyxm*C8FoFL6)@1`d~f3ah<&QO_W>nh6YFz29w6$SMsXBOXJAWW;Wd7w|FUnjd zgY7ZP_V5~-`rSgZ@6}Nvk(Nh0LrkS4>JQTJGc4pmy|Kv*DI-CcID55Ap>H$Z)?qO% z1yh;?w{3PfD!dXlsfEg-0%QkImsY>hz;wZ^@Fbit>i--3=sz+W;bJbH;(%aqAf0>( z>}y${&Qu0#u{&7ny)rvJ#ceIWEE-Q}KWe~3Mi0mZ5J=!d1K&(s>}|zjQyu#V{9s_> z+d)-hxf)*xW<1e`lqlFidqhz;MFg;Ha1RPri{bkL&I#f>mar%lAZ1mzj$cR|U zpgenshibQ-}3VJp;2NFYQ4+4Ja@8o^!3pAGA^)>`SdaLD5{ zbh^vLOD@Wmw2Z$Vl$Zz(ilKkSdLsYJEUm56*uxjRV_q>~*KM;p&Egpr6K~bE~EP3ywnGwd$SLwuXW{e+}<7YFnD0^BSz0m?OO3mJ3>J9tiA=F`Y8hMH* zsHW4^QkuA`CB{rJ5m0|^8`8BzRLr(AfN$7jEdSTIfe<*z+txwVL-rMXt>3U}U;~xO z^eVJ1IDk>jdq;azb&(sj)04G~jq}9)qQF=uKL$CG%gGy?R3GaAGJIh?*W_k8lb3s` zoxBhnznrPj;U^KC>5qK5HztXSEO1W73wW~!LDTR64&;a_quIfv)? z`sL+F8Hmg{W1F3}%iPhmzg{`)@4Qs48D+_W0dkdFh%{khxmg^e>s)LG860Xd7&)0H z7Z3IXd~&B*KCv-+BeP_5QzG|F)gh_(BS#`>9U!kHXBGg`>8!VA~n5+xHKEng!t^(balFpC3?! zc}W5WMZ_(3S$Amg3mw`YgznWsakkXSgDu2vsq)D58{MxYrwpyycHRsD(L0uP*m}AS z6cn2Ih#{*#RR@N4-^En5F;WHYzaBkfGI~behWh+ai%`RhkQm1By&#^xqpltAay|{# z_S+jn10H9c=flUbS5!JuN!fcbUJ;)7OmGq0w|b zt!I|%iDeGhv@2MDcjw7UmHkhVt0x-FP7B)O z+D9&P{V92k9xbD}$>*W*0r>i;n(-Zbe6lcs=0{E^yq1c|yftZoNA~owpj#dXZPbLf zKJ!@2`*@Fbp64AyK%h_mhH`afNo-$O!FMm%FP)R!kKCPI4Ih9F=SD|=b0;6I$Kw2y z2K(7PT3CLC}1>|Jr7m_2dOnIY71@7f%ADao$|c8h#YQ`M;PZt!;gow zoEB8kr>~p@`FbX_mTYXOz4*uFY0?pEM}9Z}{rweRjjTN4s&sKIQNa|Od#zMwkQzpi z7BQ)d5AdgpB;K~$gZf&U*#_AW+ux@{|+9y3)Z9>93 z>|OOEZBWKCN_-O|3SRT@QQDSsyLsF*&ru1`9D&9ke=_dCe^rIy`)HOZYEy7dW!wE0 z^Ku+dDOu`J*C7{*J(ey@+xEUAp~mluL5r-tMiSRqa>|5g?AGTR{wJS*zr6nOc~y;B zOZvx=UIA3A#&YmeSg>+0?qPd!Z9PLfa+xs<0|Y7I|W_SIeW^%t6mGz=s`&0!ixI_b3y8J2$1eup?dMpl+V9^r=%>l>hdE;ke#aS%DEpE#g_ zY`5Tg+~Ksf#<#^d;8}IYzz*^j$r8yD>x0=2U2H)OAqD(jpu9Y<&ak#4ZUgpPWs>+1 zu6Jw}mg$sJ?3~~T>3YI8Mho6i4)C-Nb^tLC!-V~wfm6{ZK4Igc9cb>J(Dg?*u>fcV zPti;QJ-uF2h_NWtBu5M}YaOsDtUYa8P3Xuhj2+)e>&*e+Cq*8tqq?h3s193hUZ2!wGI+3*C#5$oa13$& zTS&fZOcs!v`knCI)7+R%Jt7+dM2*`DjVqc2VN^1Mpq*y6DlNUfwm?oKr-W_ff@lT9WQJ5dC)|9p|2ls|pZ zAT%AdFhWCKo)eRJ;bqxIek)_R!fwwR(VP^8PM)3Ipv|4!%aFvSz4{=6lMYkOV7GxD zaE|*Fe$ibez$!hiE{8r?A|B4fcJ+76>-hs4Ql-(1Lm8|gAJv}*=W}lVD%nt_ z$fk_@oM+O?2MHSP_iN> z7!SP9dVK=go@tc@0x?b94)0u*IcPrsSQchP!8+B`;>+>7Xb<{Ch3jaY{qR5=$GeT-%dfwZw6nBNlgrMXGEg?(6d)n1D&T( z2u9ADH6;G~e8lh#51t&rPX4EV_?mKFeLxnE#q1lpUy)y)>V^s)0c$r1ABBQ6st?ml zGvg5UhxpaZH-~#=mo3@`F7T>Lw@u?UmV1mt$Twj2HNG=+|1p*jHWY~ljeX=4ZlM5r z4X}i3V#5%@na3k&&URCpPQ`#dAT*b(D}|(QLvib0VjAn!wP5{17@V<}Zw=|jh?}1y zOjbpt9mymlLTsBHhBJ!t#^*m=ooTC@V%O;;hUlLd;G1GivyR$)@tSWgMSI|Gk$tzH zmYnxjURDyB%!prF>t1EtE+hKNKGJibh_niuRvJMGr=wHat|Eyh45^g0$?N%tGfZ^H zekFj@u;363-q4j>G~IC0TD_qwxjCNe^1KwxQJq0`Mg;PrX$0 zIk{SH>Xc7os{C5I-5W-Z1Tr~7ThUugosQT0F0t^U!OPzLA*}bCT)=K!#r2={5gFt2 znBTBT6JYPrQ>8rLz3r00uzgCo$9v>ZHan z4PV=@2^qpNandR?+e{g?@>?{v4*V%JB5A)&i9549R44_$h(iY`c?$|tm*Z}7ut-b% z5}AAlV`_>)|9}mzj|-x!#A~~_<_AliX1mt7UkC`fCXSzL#B*>vA_-G=a%&sl zKV6`Q%WFKpM0RX! zno&gc0%Ac}c%i4o#Zg918y-ycbp$*fDrt3LB91yK`UkS?`}^Ml)2Q<3re+iCiibuL zAl+6!00YF9w3e%iPt-=KQxvn(w~pLNGZF>Q;SK-Dn6hN&0H@{9o0k)>`L<|o<+#g} z$2|jC>EcTh5h@K-O&QC)m!|(d0LYdT^c|CY9bdRg5_@gx>a2-JT^gqi4f;Kmt_nma@JPrj6PdS-1?Ph3V zC<~rl7Zz?m0C>6FJZXP#wNiZxVK;}XwoA^JF?A&)al_0%o>;9N+!$P$#&^1q2#wOJA zbs}b47xU(@L#c2)ZF3Xa>wd$T+$ieG;9t4B*Xw776=MqBPwO;0y4CZ%+Pm?xoK@pN zD5Ejz8iZfPJ0Jm4guB!n1Zf1X)V z(g)htu*e1>9Pn9%`%?}zhM>l;mXDPA%%=h&Hdw&r@#M1N`t$v zBNcG7{j-%|k*o{Y72BY$t#VO^?vjx_n94CXZSBj=Uij%r@VV)M>o4?2nuSAQL z{Hhf*ZO5^ckT1!`wlGs&c{mY^3dM03h?YpCKl|<>J%MrFHg(hjQnhsN^{nJq)zg5) z(>(zIbg#8|tI-^VR!T~jC{*H+b!6B5d3($QCE-i2Lo|o+TD32 zH5JebNP(98wK(j683jH{-j0Y^@mIzuF-v!UTM7{Z&QmOBea249b~EV*0G!|(I!_7D z+$o}^JYcf*=-n}|!&opTKDI~aojc=!%+b1^`T;mO6MWa{xui}jT@!~PCPI`jAuyE` z;MU39nxD00X-<8|-Me@D-1jCZ^Z}sWdQ62i%rMpN3h^3MODbLE;6rn7MVqOBXjfXu z5H&w5b%~c~^#gJjI9wIDNNDBytCgkI^B3i@%PK-{+nXHvU*!hCQ|~#tpTi#4)kzkm zV%jlPZ1i+TzRf*F;R9hW3mK8=ZQFsS>tvG9)c{;XW>}eVx z>JFrCTY3_O+MsL06fh6wiRt_`iUpm+8#>iG;gJ`Xp?F2^kr%q>@=LID7ue47aN7Ds zb5)Uu1ds%w3^LSE6N-r;Rof703oUjcEEf*r^M*J#(1jaw(7;kg@NKm7UZm2KISM;) z9R{0>$+xC<^Y%+qw8&>@U*G}tpqpu9|DAap?Z>o7=n(`JFrv$i9%lNWY6vg4wY1K} z_P0%vsvvs9%Sc>p+6$&sP7~3(UuH~{_ZLT9#9!mi`zPHl#$h;(?s8yT>K_725NJFW zRL56#4clDOLDy$KCTdznArg>$yQ~3~x{e}na_*Za_k|)of zi~gQwBAIh!kGew!%{{PJ$EYqqmXiiw_>0YF94-FhoJ(sAkQ;8MGGeJ+AKd77t1;bO z7fe$2%tHziw-jFgDs&b{wMr;}_vlf`U*xgxLCo(feJ`^wTa}G8WISlHOqcHY691je zK(nMQt~!e*LNAM3n`nNf0_T)o7`1}*|8L=1DRGwzeA{a`T>xDHlx1qG`!~9E^I7%? z!3r6gYi)kyHON$rl0j_y08nIsGlY$8ab{$4{y?xxgz<6LkMFKqYe7PXom$+NEBRCzeOW%PGLz9~v+7YzTsW-^SsfXZvtjoJyO9_FWN=HJGoWuP zGazYjb9$y~CHIVN(`i3*ma$1LRV-LJFJCCnNzstKaU}7AUKuFz@J!-KRU$29jf+BC zY^&eg098iJ)$)d-MrM$c>E9L8}-|@~` zb<>__`rKW1GIkYBLrjMMD$!_gi+K|;Mni*((bS-IIM|x*S7D#M+K!Yzl_b@!KX3wU zZ+rdqWW!Xl-dI^|_Rt9;2I_3pj(h-M+PRU>%{|^H7zk*BzCzP!5a_ZJXUYTc=%B+% znrJ!jilcIM)$zgwcClLj$(PF5^Q2a3{#F{z5{VF}5IrYr}J(MownCUMLF8)}@mFUogI6}n{m59wNf_WSCRs~?C zgXO-DYa$juh~j};u9cDdGBtLwsfpwR@Few2i1h(z+>iR@e#J<6+&Kr*YVkBLwBL-MPVm$d~52FV1bR_I|XwETJGzv`z0G zB<20jYQ}fb>@MQ4fbs0$oFqAUDvv+;qSR*RLXdwrB*DI(NfsY9DP$mGc&Q(D$3ie- zYsIT#HCTO4T2@UcrhE4Tpj2M~ToaccL7m`Pay%4tJN6B$avC@sFmv0I{yXAF=iVdY zpP@As+1HY|a}*s=U!CM(r1{$|#@@(yIq;h8LLlIo)O=(HwIa;&l+<*lQ-CwNX&|c3 zYLXQ0=l>aqaW0w+dxpW~1e$y^i3HWL2j}BDBYG0!C&^qB?sXSSOHJ`h6SO!*gMYKO z9Lu9p*DVq=CnWHZYrLJdqrWS~6soz9vSfFNzb)ybhb_)bv#B-RsE;0fF?AfDq4$Q_ z?6VmY?4QocdtNGL9ki?6N|H^I8xK`8WlKEDeCQsC)NH~DX~JXMk5AxzuDsViWTSC{ z%kR+H@+YlTEb*yNrmJ3v{p@vRD_~nuOo!Mvk$IX(?e)^B?{kegCoFR%iGx!Ew;gE( zu+h25PgUf-HQA{uI)p~c+TFp8*2)e!)3fc+OEIx6L{yQZH@Cp;RWVt_g6h&TW}Xps z!e@Gd0Y`O7EQS8RgY$D^G@3nvqUJP+Eo#hkBU!BY)~fax1TOgImV|PtsdP@4lfOv# zLP-@!*OqRTAFX(NmP#6&dapcYrCc_O4i`z~ude|W48y#eQ4c~^FBjzRV8cq9D6$U##^#?2Cy#?dJS z^}|JPDbpAs!90%As!G$c{%B!a8P=GyL<<~X4<+drAvMo2(DNNRpQ>oTH7*0(fRId+FrD~ox~hRnw9QG$lJCB$T8JVYRI zj_m(h`>GGFpl4RH1Z~Q{^(!s7^l!eJgNO53hFk>{88M1W6Bm5a{U`OO&P6|YkyTC3 zEvmWiybc>$m9UF17kllMut2_mpv4N?Xj`?k0L5zThNhjzx-@AdX(hW4?2};iBB=Qc z55?e;Cr4K4LTEy1a?ty_T&w>Lwyp)BnbW^KaGfu|gEaMnKY+JoB11~0+TUc3R4m>$ z=Br6?mOH7`|B*KkL;L=uqXKpn-7F%J8Xk&Qv%b2>1=;Wx6Hfj8IyCq`CX~jp@(Vg! z=a3B!)=hQFmKi&FpF7pmVH#g=lFmoDf`ri}0H4XPLVI!YoF8U zswGmUyP5|sC)wYgCSVVZ4n+ZyN3 z3M(>2Td&FrZx)7z?P{_PhMr0E{65g+92}o;JGt}@ME?++S}KE;(VJ>EU)7q#uj~p= zJm3~#6FyBEy`5>HPw6Brw8vrmzOt0n>CHynsb^|cr54`w;K_>Z?zWef<1Qe&E}a0L zb}HG$r9GM41$k{3b76SB;)nYn=O~RH+19Rie5TZhR^Q&j54?v?y&??cOuSLqI1U>f z=g!YmFIBXucuw*hptBOZ`7C*o4?Q>O9KenI0TA894;}eAIXsm)(0QTvC8{_7fweJx zlbQ0ct;cYnwEV5xWomIL1KCb94)MgKLj7|FP? zFZbA$*p5M|RzTceHouUv9@TudB1;5Wx=1dZrTXe#ZVJPa7EBHTdAXb+H~m+CHX*HU z;R^g{g{7#Iaxr#JY_Q!*P!nV9Sm00y$-ODDcxaHKJaqB^Su?A{x@h#i5Og9ah0D+y znH*#$4l_KW0!|xa<1K10J*$0HV_&KCHhQrA6;^-E{R9_VmA}oUCX6(Q7di1sCuLC5 zHDfstQJa|ztyQ!ah$tDCJyJnNXMjU4)6E>Iyw?fry+>`d8Kkx`iVVFaw8TP;Tm*n7 z9<@!0>@D7)W(c3huYK1@PW>f4?DV9Ii9VwKKGK^bNA47~r;=CyV1L}asmI~$FyP8x z$WGkM-)Y$@%?Sws!m^n0VHx-p*tw~!tf99c89W0`?liE75J=KeX%cZnjFS23E@Qzt zo6tHk+M~1}jCv-?pYDq8?e5QdKDTHwOI|_o zzhZXYmE}V#uUfl4!Ge?w*V+DCf*6;8i*QJ@gTvygu%@Jiy5UR0>oOT+Zz?A|$j&0( zr!1A&vLFYj+15KpeMzQNl3vb5vvTc*7V=B`CECn&GG}R4&OFrmn46zhLLKtw)U7}* zs#Xpfw$%rJv`0Ft4A-Q#Sv9717Wc0N{9^Ay-t0He!|hifv{n&a+dG1c)? zD(k}8`dXglm20AGdgmkXZN*FoJrimO$$tWtIXyQnDa;mnkHYdkR@T+xN>P&WJogSL zhOeWKt(r}=)Uvfa`X=xGi zMqCR9OPtmlD3M=M9E~CewPtk}l+SHcT{N63?}_!bpNcO`2eBBVva*fJqShDNfOPs$}`w=wd^hBz)>YXM$b zZrZ5ev;(E74zL)#9lDjF7Y+9BwsH+J-jc;F*BJB+3#|9>b*nsOi$4HkCp~;U%rDfO zaK-qU3Yo<9iIswgu;q&EEFHTo338FCf;U+TM<0MTp#==4pd;zS^*A@3eGZCC4t#KB zRC^(BeT(GqhT6h#Z}q^*MrP)LZbRtuIIcC8-0nF9>|Cz|cI5wtW^|tvcg~l0 zkLWvZ*H>!d0-|$lboy~X(wZFQ@4h3 zdIk2UyST80G#3hIkpvslsVTSUZn2jQsUt_-`AyC~B)3-$bP&7cT?o!!biShU6etcq z=L-FLrI}I5(3C{x)G@0s&_*bd_AG~o-;Fqdq9LH$#jME?pF2vxUo>0T<=(K=F?x#1 z9~m88_h^M!G&R1rFDqgab`J6$ye3E?IO5wFOkPy`(eA2TX*hG*K0;>k58`LE|- z^ydxFdwDnt6iq{vM=F;i7pci4@ zU6|3r@mWJF^rq9&%&F-$9MD1%RGc!MSS$4}XnEWoe?-3Ad2Zg~%U9Lj!2a^ljlD%k zgvcVSF)Fgyk+WQ-B=N!i$810o8N1w;46e&5!QqW(*W9%%5pv_V z21mg=hhLuFDS54}p+!vSTwZ^H(Lvr|k0bWTQ>kf;^g7``%r-t|hcr)$IOulN zMq{V)h<(Dpns+iX(rZp$hc*f@Ey}9-m9H$L8Dw_<2o*B5ss?7oFv+~9aHkGrwkFt2 z7|;?NRF-tjryOAOxJ`%!Oby253dYy_DNUj zW22-3B?7z2-IhP4!6*^Y@IM?czj3@r(+e-qoAGmFLlnxSj@d}fG20i*JtPjMwdf1| z93nnIL{1@Z1t%%6RF#%731*}0XswJ)oE8|yEw>Q?Y1LVXQyRfUH20y%p2bc!5Z*jF zoyph6%%DGxR{Q6e)OVVg5|$S>nHx`0KN!bb<&~UWRk58YRF4k%F~50FYS zL{14*OMu_S2)xzR{~P1qBaR_Z}H&E&dY*tKpYWVgLJTMYsc z6$s)xkbXy6y}#Sw+J%K8DGkAm3%N8oX}c;+C^<~h)md%jJD`=xizpr+7=3>rRXSz} zRk4T#+Z|S-!1izZD)u+k9nm{=RoOjAwxjn}X|3mexXH z{b*ns%`-OFR&2|Xvf$wvVhbn4lme;hdf1|;ERwn~R#Z%_&}2-;`WV)ZkDF8Y0)+HZsJ@) z!?u`51Wc9;HYS9gUi5kft_>(rR8U&|c&Cj|oaJZ$_S~b~y--&~{TOu8#Lt{#k?diL zZN9HCI zvOr$*yob*?uq_m+p)nJ1((8kt63sJa`L#}n6GGC|`%$F4fQkU@>{Hku>me@&coJPXY zoY`(`^~0=UZrXMJHQ#9Bgfd07rJ^B~Y+MO^0JcP9?q2-sHG7_#;fXE(E(rZo-g2>v zFMHl_U`+5vi+hQ0#JFnTNllB~3!M&meLwK^b#=-A&zifS_Ap%PViOM+IHG*dQcD0L zI0?`;!-(u?WYgMVAQtyFBG0eN!HFo8k#9;?kIZsr&`KndC7&y>mY;abDIk4jftb*$ zHVf;X1zXqYg;^E~KH?vmB2R9kIY!R2w@FdOOo~>8VIH*dUk*B}osgrlt)z2Y)~Dra zH#1b*Gh3NBF5dtLrl;IGktqm09_I|#VJj-?!{E}CaFfIq98B@^*f(6oo7h+$7gqq& z*-g8SgptoU7p{3KB1?D6&UGC377Wam1=c%GlMK)D9O=X#wb3Gq%?)Q4p;5A4eAN^f z9Gi=B;de)S+iWBX_DIu;AHu%>+=V?2Dlmj@%fEGX zW4C%?MxEdzMl&}he~sHKlNU8lqnm1Atb;I9PBR~5=edEWHuou2F&d>ckf6UHASic5 z=X58QQxrlB+g<@vk02%G?n(XagRWDP`x^S}%oCa~r?*Z}9TPlhn;sQewIq^pvz=`N zhh^is|HUeLgP>Hm1WXSMw89VKTWq`;BX$G1E6^t+mj%h;e|EebwIhALiJdhf+444( z&Wg?t`{Dnph%APzZgnJ>F$=rZSz|NK>J-gT~Pc{Vo@>AY`CJXUCK2#^JoTB2FTRrW^)j6Z`VJb;L*8g zs>L>(-GRJU9=lhy=2sz*AD85kV2*_sRG|kmjuNGX@<0SMj=vS$M_mPTa^9*pyXV{q z+@eqd=x@ym%SNIrzcZGx4Y0 z=fTExyN$L9sO0o0Bu=o#JdA-bc-ABHo7WvCla91oFN_9sny%l(|4P9#=P8_+b-C2t zLs6936x5V{8_8bvV<>xJ=Qfk zjS^}(uQn*a7k?~2sgGiJphMD|)1KYx4U6aDWV(>8H9AaCLCITm`Jm+{2VVa{BdkTG z;K`=(*B#{A2p5~2tQ6pj$m3rd+HYM1N!Ym}NhQCAg|MXbGE28VXBu{l<1PP`HQ-%( zPG%#=Pig9OGeU8N(idMa=YG&DF%<+&92>!fu;R6IA>F% zeS_ErXHDh%`C+soO7MplGv74G2d(hCME$}(0A}=B1kuQ$&8|hGUWBk?diYTj23d6iR;sv{DS$w5TD{ts_CPnV*Y{|1+lYB7PvJRyobQJ<|$&Ig4u#UFeRgl2M zT8P4*7)rWgksOd}CdLd~KWl76!~?~YSMVf!AZI!8wGy;qvGy^go!Y04l{B;`Lc)Ti z0LWvy-s|{?n?EhVmD=OWsvWeh5rnXUY-VO=UKts?|86 zhxb;bx|7n){6HfAjhYR~0I{h2tHcU7f<%-Cf=c^C&d+46r#|5!On2iL$LF{3geoxh z;Y9@ZTBX&C=k#!IA>3VhOX#IiTbH8*I21EJaNQyFras6eM^EcA@o#z?Ws5?@cCdUu zW_0qP@Cl_tpaT2%MxD5c!=d9MD=8zaA-y3iQ~??LrE466cl2-1WH-!$<3jf{ga+|t zPnWMiXrWd;_3o5@?Gqxremn1PenPyGuiVY_xtu-Op!m@OBTuT&9DNlZH1X5uY6Nnq zp|vr(jf3Fxoh!k8}7gTy zUpHtO5MzdUD@&5!;smQwAg$vE8TYGfC*4Q%#VllGVg`2qIDG(2WV(mQ=+#UmuD{cL z09@e2e!)Yp`$<>S2)?^0gYdL}>4?c(BShZ$6rqUx{By^c_G5GjyM;G4*a2AE*y1QW z)VF(1GZ}6<^rrBjk#BRJzt|boZsfLJBFj9=uz@LG>g|4s5@DnrfzQfuiTtT6C&aH5 zUR}UPGwl*3-LqSirIk}QzUYMQzeGoh#nk#0AbC-lG?S{1fuXM3BCrkG>dks9wbt@qK%YlSAJ zo^bOrOSrI$HTFV@edWOA@T*r_EA5<7YC|u16gQ$s#}dGy<*c)T%`L6N+IJ)9&l#S> zvcl$sY^yJ`ximAV~bOvg8`S};wy>TRrwjnO*SebLFcpwhgo+*oSJFS^7F#NGd7M0UwtZvOdIiV}m@}(=6 z?5uNg(h9t~%hRYo)v{7U8KEpAy^709Fz*ndC1yH5+g)G6f&}6TzII>zolhso#EZjt1eC&mXKz> zE$4V*b~7W;eCoZf`2=`#_M;{IJ|zl;unif6Hmvh)`%cKo4oq(FS=sSa_bU?U)Z@4GmFc2KNzU(vv+KH>`{#|I!=^o%Xmw6G~@ zFHUr@pBMqKPJZdD~Zl0O7TVB zu9yV2GW`u}FJrl}34~$=Msrj*Q-_pe-@x4Qkdqiwv2uzX(f(QfHL}n)XXjAmN_kH0 zYhT4zzJTR}_TFrSiXx{Ud}ptdi{d=m>8K`QI#;B{$iG}d;?Rj-{DFew{x2VZ7eU}u zp&vVDXaj3X5%Fmr&ZJWZ`5DBXA80k;g(Uq+KI?O|vgNt(HGk_?;tjZDTr1d%*siDW zI_enlIz#me*Yjrhl@IuA`#mcK+|uaJ`5vh0MApyvHqJ1pD{=KHif1Jc;`rMGNO8#_ zt9GLeGUs3Ry9_y1~Rj9cTJUN7hgJ;9h-=Q5TpUC;##6k-21UG5h1ju z(*jBju96e-V{WV9{>JPisfB_aRf|M+*6L;Mp2>MLAI&CLZG>>N*Iwdw)0H5&Rz6JP zgNw|g+UB7BZx!q&%#ds$6XtCrPW8qI<}xyTf`gI0E=?mKX@pV<^A7d5)Y$^$2)^VA z{%V^wf_X;`Cs}zuTDY`k84uhIheHpDTUB-$#j#UsGQ$o-N0ZohTHW}cI=Au>d+vk5 zW5(XBNT0(4)4!AXf3l9sA53$157PTAsfdLE*g+2LqG?_>A|oD=dI?=;U7&DiWq9w# zaPtD9Mr{u!r zFD{}ryzN70+b9dOHFEjV5{wp=SvhrWLUu1{;JFh+i`pLx!JeB|Hl@TQaBk*138rp` zn&>VgHU@DA73^!RO3%9o_^)kW*4Nc6O+i=ht5GAFeEXb0&8Mh-)p#@^^m_IiAFKmz z&+#s`s8$vr;!7Q~>$@kTr_M6ZC6kaT%U8(bMH~{2*o`oT(OkhM}ia0u<*lo1YstbZXP1bfY6{ZFeSa~eu4T!qe@H?qF!#UNdqiJ_h0j8{c*dMb=I>}WpD=YH!Z)Rk0jNXHW zu}vK66u$Vcj1LZ*lw9XBf-v8;q~T_#R(j@*mR{2r7co>FjqVg@=Z49Guwa-A0}$>@ znf}9t6E^mt0)2=HNgc0UYoZ*8Zy`eIm6_eurmJIL!L^{Yr$&ihmS0|4X#>E2P;jhm z<%1&-_`5oxOc)~}58yWWu{A0AyyB~F&{!fo?yRtL_3&JiMpv_i8GpQuE-^)vi>XbmD<1oRQEw2U8*~(WZ zo_|sA$3gB(K-?r&zzz7 zQ;xZa3(VT^uA=X-JH_03GO#@{vUudkBc@U zVkm{LF;gSR(bnX!7d1ublD%U%J7lh$dy9PIjvIRA8puje3UBQwUV|YiJ z;Dn6vFMAPR_E(^@7HI9^T-HF3`}uS`(+$w!0@g|D+8P?FCJ{N2Gtd!lZo3)f+07}5 zJ9yA?HN`cqp=x!l8(NpQ^Ub>j;&A}3x70%9YHuMs-nIGbt|I6qBeZbyoTZ40&ihyPI+Md&~c<<`Oo4V4D-(d6^XPrUa@7|7F zp-e(*)dlq0Y)S{=%o|%~scSI*;wRi(GsX-j2n7N(u`!iu)6=4I9SG!lnDaH0jPD&* z&n;ebUW!d~t^6ZtHx3WvtjFY_StH}>st!l8-_kQ5auFu2OTv;!@I{v)$!@jxv-L+3 zUQ%B0b9VCC>4dHi@IMRc-E>P~jaq*+KXW}wc8pkt>z4LQrc9;cx>Gnc$;s+twZv-` zM-;oL%2b#kP2~PS=#nA83h+n0%{6S>FpjB99SV0Rg+n31NpK4eg*#Qa7aH8%-91Qv1cD{aH~QusJ-+wv?lJ1()V?`4 z=j^lBn)8_}ON?d8KTctrL^P)O6n46g`uASr_G9{^mmfc^_8~%%apmcjVY)OV# zZZY1hK;~eBDDh9m&T(b5BAE+i_G}Pq{Zbk^y_W%n{AnwiuHp`gV0wKt>n9#+J{!(| zfD62pcaavq$(l41lZP^kSfZ9lsBv2iU;Gy%b^-&{69HPUPHNl!pcJL$tWt(@$j|Vu zOV)n-07MVyHX>^3UP(#}#63F9@$f{f=nQ_~|Gna_N@+Y-G8Wc5mXm3E#CI{^f&N=pr`*z~Nyk$)TJi!Mp&--(jG6cdVxl$!liyHb>~~V@ zs6eyBv+8=!*~ipoSF-02)9}fbt@zoGZ~T8>aP;ll~j!v>O5yG6u(U$TQ}fcr(6+W~=hhGQ!K&9p8)z@*GHU=2?} z2=ph;r9Kn>ndgM}9C%>3+3oVjXFUTup4`3MMAs6{p#_zxAy>&>_+aWt_U!5nIYxnt zv@>+}tkSiLqH-v!5d))#@tmuSL8_e zDSc7>4KG>jI1Swt*$-!W2k4B|@Hd*z%pPy*Vc?SrqtCw3y;kS`&zx_rRt}l_qSGp) z6vY@U{C*+Xj+u@m#G+k)xFI)tDl%_4ieYcSiSD!W)1RDjnUJ&K7(d%~aP!)CM2Al5 z&dragGTTz)o{JIlc&-ae4mwDkxLhc-`&f1fbmq~LfDFi&l6lo* zW4pN<3-jn7BL-Qm)aiNYq*EWHyC?<8$L4TVfz?kWu8LQ@0y&d)c_@fwnx4gCwG>J9!ZHB@(I zihXV>yEFCTAjoO!obtV?Rc%hnr9*jZe=`q*&j_bszVto1>R+5-+&Z)%1=Kx=Y#Z4Z zryF%WP=k6yZa9mMyNV5#O+=r;j#|%qFQJT!#7dGY-3bnIC<$2oNa)Pf2)HUi?qO}p;4SeHfXDRTZ zz0jSMS;UR&=$p?L;zsB%dheP%_{arjiW_8KVU0*&l)e8rwP2^Jr>PmZ>Oec)uAT(j zIj=Kws6FEeE4AQQoJsVKyxAs=>JO-{t^hhoz?OaDOapvAGqPpn2NftS(;(?+-F3;Q z4SE|>(@wff&tg_ zJ~SrgQ8`5m*2Up~KL%qe%gh%_?ET(w6)3U|Ij)}*jsZIn;o19hNEX@!y?CCaX4@Vu7^&6SFe?w0pgkl5>wW5e-A)> zruVXjue-u@)#vKFzvqUSwr-O& z*~8%~_r-1jcR(SwdV54`KVm&c@%}5$qewWOUaN#EA!;RKcW(S`0mD>#+k>$Edqu}CeReC3a{G8Sg2sSF$Hu9s zgEm?q3%kX3Zb=RQ?yT{kq=nt-+;Fvy=zKlx0X^E2c8|{FEL69{4R9(!ntGd<>Bii) z$N@qGg!3~GhmAue&tAn-yqXDQ3@#Gi}SUP$Sru_^?`Py31o z!bW`_6_+PTmqzSC{ZxF0+cCmyVa7E36_glp$ zifw&8(WTLeh+k@^5Iw=>8jxipy>ud^Plr>JPm<}jc zf#eGr40&{PvLwsFekG$xN03X>8KG09izTk&WWw%38E)H}bC@{&^O}87Qhtn~IB{Ug zt@WL|?p=fFoO*~3#-<4;)>I(Z*we)R|CHIKhA9nR1>K=bE&X#nDoXZ;T$``Otr8DA zC3H!{_fniHid^I6o3G~IJKa$Fu5&T*3&%;?Z!VuoGgUi03H{x&#(TY&-ov1ts11&x zq7uRy>k90B&t&~={bW_J`{4{4UA2gs^hT7LST2`7w7%spThvCJ!hEnJRgmn04IfQE z%Sc&;!#D2JCHtKp15&C{s@VC62%$)NF*8Nw=w30ogQSfSBgAuWv|&1V5xkbb%S8$s z8sMegT5wKxrWaG$$5y_%{U`etrD%Cp<~dcv@;8~^7bCF@^amHTt+%DXPOD}8-Pv#b z;Jv<+*qVhQIiVY({M-68g{cm?!{M2NSYsOKS#3cK!EFV;M}7i_svxgaAKAftDTU66 zM1X?@?G!R4j>#X!^<~!_Az%@Mgr&GB+gmYW5x26P3pEBE7@c? z^B*FgNebr56;yaX^&$g%O+{L44EkgIv0E}VY-1@2Tv4aruU&|lbVU)nvV9;6vkz;n21rEe&qyq=|9!=PaYGi zVOYPJFYJ7^T*YCC?iGD%m=Q2DWVIUIuyLJsKdoIIVRowpGM;L(^|1K1ivHGwz8_pEycByiu0v(*ov&FA zHel8b24EIooCr+Nx9$_pS0ZZw0H}tx-@LOw8|ZK!3iNdVVF4l=Wz(f^LI`H(EID9e zRYCxHA7e)A1TDGsL}K( ziL#Z)K6@&QNN1e4LpF5gXN^4dkvb&ysO9TeOS}I>pk5JIy8bzfO%S@hjUj}YNu9Yt zqEVSzhH!^rF8MosPYQ3u3f?WWrb0Go!WY}E`%&0L{PvEh@i$jlnh<4cJc8adrJvFV zrBwu_(t|lxq}fABw=V8YMqeawJFx_+VAC$Ri#uR=Bys_CYi0SwVWrP8oirf7J$Rw^ zVvS^8o7qYZ0kLOTfEyGP(0ft;1{Kb@j?WVCH@Z!P*Naf@w%7EV*r<&{U%PuH*#A*h z1cYhU8ct(j1q&fsP5sDyAx1Bno>gFprdS^P`W>QmX}w&@L#u9GUs*kIJ`mpEpqG;# zuygLzC|;ev=K(o+4!(8Doqbdph8vp5t8K1YG@J9|{1*JxR@s^UNAE1QuC;4s37!Aj zM@H+_?HJNLZUvgMqzCw(;Ud34zCgY{fCFIizi+88`z)rVtE_hT6wb#-q2~U$o*n0w z`ujtAg;kNgxO9dFw4YG~tPniUJulx&s z{U2*(eE$GRv%yw$F`?xpy+&rb!}@=Rh3|5};qhL2W83N$cyC6$gJ321?z#-~=K7Qp zdDda69!g6wo#8#{hv+D$?Xj~>=T45IjmM7xcrVIvkpxPJ#5U(~T6{wTGw=G(cKODu z>yK97s4(d8hf6jhG!>jrZ3Tv6#EPGiQ}LV0vllx=vLZZQi?E+qUa3vdx!fv*AXE&3 ztrJLB4|j;B{0S)>!XibPUaI($U7z6*8l-DOyA3y}#vkiTAv-)mytl+3Qm@7_MwlYS zl_qTzqt(6OMs=(N>RUHb;zA;9>q7SymmZ4afDEQG zPm0c-{t31Bh!qu+&uo|WfOeLFm(FH9t;J&{D^rpIc9O)D+j=sjOz}*YNf?)0;q&G)Fa|r2M8T1w$s*bQj{LJEXBw6g}$T*PsHs8l zrR^KtnU2KF*-wP9yC|z*&Qh!3$M+h>hrvL#9{ZW;Na-YL>}>P{oe!_LCLD({x1o+Z zTlnaSnyw4yZPf<-DvbK=!EKdUSjmM-2G|MTk?P+{p06s{WUg$Ut26l-Qg8rJzUc@I zv=f7^sXRd>jBGeZ?*4DQ3}&;&{{aNF3bRT`VsmX+prIPeeNOe28Sf+g)QK61M}G*e zFNnb;R;&93Se= zagXIKvH|STN_V7+6*b$h2gt+?1_K7iaWzsS4eJlSNH0OMwdK(jVWqQzl4a%oj zFC4YffPt^GON@m;$c0VeN3VW30M5#krSwk@esjJIxLmofka|Q-aH+3X%__cVbc#FZpW}nqBy7moJ zS+t9?K$n8L2S)bAZJ#f0#+>zLU1Bv<(e|OUGTU82p_atLf{f-Vig;k#)&!eKahyog zYQt;=Bo4J`FMPL+x_bR2XjMskp;%{}m#Kx-*jMfEx}@B{Ua))np)!jxPBCX8QhGJ{ zDGoII?F)YuaFffNjhu3Ai&v(RxYyy2gj&`NSL08ayQT5G3M)T5tG_FonK5EcZxp=n z&^h6S&7v;;MGhR!N!DJKH&ksEZ^`a5+{nU6cvK$PLj9`!lnvFn)rOA0<@{b|lDE>D z<9OG7)9)!&*rx9Aqbz|TQ%#W~o%ilx?Kt@#K&0|)oUoo8mhhk+Ns<6m{33&h<48Or z6zJ%Si&R#Q*2+rw{1pi?39LV5<$ef(3g@ZZ+*9Y|F_hm|4(&{FagtL%b+4X;cjDa- zV5^G2^`%KKPCL#6g+G-t#WEGieW}$HRv9vv1Z(5o3K8=0!hI;Ia4vCYc1niA!?@>R zuS?@{DtX$JO_nH$OK6xVA8X>ebNCk^hz~dOVj^HNe&(H}>-xo#{IX)|L6fbV)l?qO zVxk4Qqqxb0FkzO;#lqpqwEeQS zlF~_3)0qLe94+*=LWJ5^j>SU8^#V6cmba&D%EczHNJ$mycX8j2!MS|Eiu*($ZKZ8q zbcX@$RWazHsC$ z?Wb4%Q#1Ceaw7tEZd)Hx7O;!_-G{N_h5^7>uZ-2JQ3>>m>WtXhE`}|a8dO8Or^C4J z2vVa85P{CLl>XtcFG*IwHx^H~8%lXdN5yFW1jMF{cE}7 zb;B!5V(GVjc*vqa@h*lP4|QISs%Vuy)(wZa_v}CsYR>U^pjUrVQk5Inh}J0OS!JBq zR!|_HAG;ryiPcE$#3r`Zr%{5~wv(CKh|oS`c6W9IE#^$}#rL4QT^F6f9Ip^;@0pku z(Y%W9Rvoj;KS2`rB`oyOyB?H#e|8`+v4yka{VW#1QK{A`^yVwu@PD%gn|?;9Ml6Zd z`DIb%9L7_BY~K218s?+!&{#+9YP@7nbyP$6$npE6I-nE6qyP&Rw?EHD z=O1>%>f51Nn2B1onL=}-qAkA1@*gB!UvNXQfWu-MP zpcC_|iC0!WO5$77cu~q>tgsIr{sE-TS#`4HU8DwYGx8SJ9XfmwOriSoBM)`46QmiT zZEho8M8_cb)x@q(*FM3**q!8$sh8`GF0@ptYc7L^-bQ!Pq87AqPMuN~xqM%2{|?su z<7yCR;M(Qf40m0L0G6BwJX1B&>{LCz^=Sb zAq+&Ag`GhD1u9m3Lq(ce(FZQyN>acOr+SgxE4FWA2zw6BPU#}&5S!yp5zjBNcb?17 z)c(}ReHor~`cFNEKNCo}@7JC0gRd8iN6`|961-C-6oZu>zC*~;*VfIF4UN%3Wyj3;{*tMJ-OI`kf&P`rxA?pj*^tp(pH zT?InZTI8ugHpxoU2I;KJ5zYk{S}%g!gtdwP>gL`1s+76fW1|}tK~jG&8fAfUc>ghS zyu68k`HVRc6&HNMnRVE=Lf^B6n24i^(3l1HFtouavb?jW%iixie?zD6M`uwRFba>Z z$eJ$CArLEUlpUVW)*AHnlF1Stv_nh;%?J{}qDL(Uh02Y}Y+uAw!%MGFW{j)S(m6Q& z28+)}q$6LQ5yvHDYID+K7KP>GAjhRljxsJA!{bf+v~9G1&^z~cT${J;czIN>zj>qa zFq$5OmJ(kxcUj+%quM<-2pyJNQC2LIBB=IY`4Gyc zk^5qD;em#eib=!AV)M&*D`*(lj|0;{0lhh~mfzPq>Otr*a=Z-aXM9K5dcl}l_F>B> zP1OCiY0A|exNO3NB__PODGORkT9YUpD1&I0=`!~6$SV9C8l%oWtDbhFEqt*1V-l%u zq!@*wcB?I@yPv${ac+mS*i+H#$9Hz_-Rv`-tYStjmQAg#F;m+d=k)ijq)|<)#h(Bm zsVp%u5odTV^MMs*-<<>~$|2?daMl>Otsx_O*U$vASh3|i+xZ9ZYoz5=FZ{#jaLOF$ z;}Ma(+gWqkwRXNp!yb^wd(aLmCiv_ac=yYU*BbAffBv;Jtyz@$sk%b|lE8ynlk zcq*mc9rw$K)BC-MVRBVX`q-bY3*QS~D^VDh3X=}X0@f2DMJvs^2CKqu21oEE<8g;M zOQ0ZOecz4Htx-x75e^^<_}7KxZ_J3mMYIg|60RhHTtpevHrKKGEZg&s(k~BFFsYSi zA`<%nPEu-r?o7`1l-MWnTT?Ae@(=M4CJpSaoS^reZdmxgI75pX%gBMdR5L9(2zI+u zr5sNF>l40Ai>nuphxL)|@?%wJgn%Cf*%&G)W+T6q9fvK6S*drZQKZcE{ct*ZZm#JT zj^CGvo}kOqP9o3#KND@Q#`G7l_yJA$UsUykY(68f)hLW9znru+JY6JZyfM&wC)kL_ z|B&^Z0$$$Jptn*KLIBtuY8`0p)Xw6binO1J=b8Tj>>H3-j`xbuy-{+u`0785+W7kA z8t=gv*Hcf|!Zigl16CR48wqc8M#3!0d;n6TyHX%d12X=FWG%6u8ymZGb*9m2`SaZ? z*lITSf1@LRw&{v1EDEog@3}TQoEdJ*#c(QAxn{BFQA#5Ol~c0}6MGS%AVQrXlCOu} zbhVotu8XH=azfsCP=yJ`!3#kbw6L+aP>3?xl4MM1al15!NQrc-E)HfiLjNp=ZT`!B zIb+zg%nF7*h6z?=fwtz86v*AMUY93Wq?>Yc82+XlqK(#_stwQe0x&aY>B%eexAXR8 z&Va(xJG$g4SGzgs`G)#SG*RC~^-OtL3cKnq3jW%^rYnEFH4SI`;U`QrJFVP|(N^-I zkvgfcw%xI40?k2v;QGTH?yFao3FD4}nq0mcladwDMO7P$AKNRSlT7FoYnSznSU99W z^f#?J9Sa|NiNxf7YkHnry+n~vCTZv&3B&^38l+p-+JPCWq@T!N8sq8rEXq*RAK@W4CIEhYEao!7=)U;q3=7X|G@<$Hk7`g9 z@q%{#PfAu4K3~vMgp`AOZl058-VZZio8O2p3N;a89KW>?9DjU@_^r{E>EqWRZ5T+9 z-8R-oCF^|oTi`hvlzgjs;BeV~OtQjmAO&XD&HWKr0z^cJu{&3=zHWaPDx|v$YW)4p zVm@W3Tbh>nGQY)E70O4hQ(nKa<+*$&JPz&yHE zr#S!lJDr^WW_->2Mt{7}wT*u!hAsF=6en~ddqPIXGFfYG!*y4r)I|Sbc==AO4INTs-e!1! zwY%KTy((uo36jt6?jw)UHy+qX=-Z-$D1jjhf7;(~!oYFH|obNombSCm0? z`VP*7dK{DA6xs7!Fnj0Rt=q(K)tma4 ziVzElJxbweoMo~a;3DTUJVseHvfk;v{NUoszAs%dy^bwu?JHbTIm^iAABD=!u-3!y z7M^-E*$`5!u(7mSr#VUI5q#(U-@px4%pDnRf2!}@){5;u<)Hji=JfXP1d z3f&L0w_4!!O;L!kC;=k$a2WT2wIrRICDOQUBpiwblhgguj?-GPCa(4;Si)1r@^o8g zUZ9xM=HGmA$=XfFgVE?dNg=a;^;^!cF#$+g2O1&`o%X1!p=Rx z5itG37;K}-G`PPG3vb--f9o8FdbCfPd<(7n4e|WB44836*LIn4df7_H+m<`IHbD2*>>u| zo(XZQ#J2cOy~JhT{XypN@W)nASnh-r(ZD2^7WIXW`V;ed@O=yI?d6fpUhO!rjC_Fg z=Y!m)!&V9n4wd3D>gY4=mmQsDW+g?^*Kfl9Cs+Ny{jh{+ zL*}+Y7Wt%gIYlymO@fp;8Q);k%`;usA1sY-!|oy}wmFbQ&7!;PqGzxPMj7amRI3%9 zXH3GgY4OvNHpUL)wld3H)@E#UMgz`l1V<$+CLR+^e%F|Mc#;ekuZ=Li*cFicbeioR zos@YqdB-b=h4|JnGT?A>oF}2&_sYuDZp4Smg{pk;lh{&xW?AbSDedv8`xW0uamOJlPD&p*sY<$LkM@a1E#V2;P z*8e1%2ko=TUjLcv$4+)Of&S9H^l4|^u-Nb_`mIyfjM&#%=+hLOKsB9Y;=*d=RB7pL z99^XRn)USIMwNf{ucG|%tS<|qWI*G@Z;{f&*gx#3u=1rEpM_{HI2H4t-E7aHv!wUksmJ`!I#cxRtDVcI-?Ft+5Tuirb7uEO;6?{>)Yh9nqt)X+PeqPXN-y$sy7Q8l5xBJ<=UsmQW}7TY9$HOm>yEJReeJ!c+H)MI zgh&u-4KV7uy~0`DZZ@KNFW5y=%d_=OpH(~fSo-ZPV}Mp7$Ggo_tABtP@9hRVvBA$l z2Lk%j-Amjyq)kb6mT2g0q}(KpKc`PK(%`R8vMC;g!FKjK4%%!eI9vIYsiiZS`OW?K z1?Z4N=8R!SaVgJ3@<^!NtycR_wV~_06>?{hV*cFd@?VKvpYAcZlW=+{-lTOVg7h?Q zt;gP6xKVvCoMNAqI0rjJzN1DNsBEhw;$9pSMI=ppB5|lQb`m?abEDw4H--Vd1xggT zlc?Izh29fYeXQ#r&YTBW#pvd{!2Ne6Rtg6=6ZxijuKY`Hd|1V3&CWQ{!-V*QJC*(Ag`q^0ORs{ zM-%32Ec>Q&=j%yBwq%b1!Aztjc~mIM%p|ROjl=9Z3IF@+S`Swv%w18-xV6E#Ln0iG zS6dAz!z=o8-7vbUlrsm!_X+iS7Z6YV*Ce!Kp^q{J#sacUTW^E4Wr*ISKKsnLc>rlKpCagj2+b5Ooj;K)53*>wa+K zS&#kA4wP>eUcaLR0Ck(+{R5Oa{B@bG;f&I;^$9DJspy!GQBpVp>4aWJt$AWe<6y^IcS%er+^3bc`Dm8V zaNc_g6y+uWKUVTIo27-DnbSW2Za_)`cJE5m;`=!R4Ze?=ZT*uZ`)WreY0H+6q!>$pzM)+9?0{FuhUcFf34gae zU|w%7YZ}WMPCKL9{sV9-`~%z?|5fa0dlC}$ag>988r8(+9KXIAT%?-wu|-vVPs!K} zb*mbl>5~1e+s)hjq~w+`E?UjoNt(BCKTjJOp0qgV%zsI|7`kWvT0FG59rw<3(8Irm zeRKCM4F?EX8ye(BcJ%$c*T#bcyk#-bOu<%rLRs!!W`zAvU!t;s^q>d#Co_7?pU=d zd&NHW*sX8ws3?weG+JtB$F>FMlU*ps`gHc_HQKVU`16t^O^Yw6l*Epsr(csb-NskqR8fSXRz>v=x$CyiCrw`A(IV@Ad?x=I>yGO#KT z{iub>hn#umMyG4)H26eaFW@V2y1_5>_*W+AuIaso**NGnDnbn?8`j06n?8=?-e@W< zEvT?qQx`P>To!yEjjJl|22kY_JmpjMhu3JSI(5PJCR)q!TAu-Ka=v84X=I zXU-8++jqDhk@wzXc7oWiV{k?>B$d65z6&Vf^nk`#;#%q$e_}8fFjhvITp%%Vew6)X zKP>8;%K6e%PlA;(_6y5x=>g{kA0oVx2@D0%E#W0a{zGCJ7vt2P8xCv0v?jz`qO3pF zisRRJUXDvpTi8&etMgF;ldK^b2fnejMUJ|_>*8;%wbJW1BSrGSvck?-|M)RV4-to% z8Q#>ARZ%;iEvE-u8C8Qfz1(SpG0 z-Pbz`J;0O_AU4BgHgwTQI~%~vj_BcQ}hO^cNM zFQR#sSmbT4VI1V|Zwg=TP;1l)Zg}pqS!RweBpD&B9>NOEuxE@RAaxcOf4;xH|6${) zhO|TiiTlI)0n3cTE@W=F>={;YXE?_$zcaP@4^R>L9H8ZPR}}Z8EX`hHYV7;74eEi< zDM|U1mL{XAw!LAzdGq;3f3IKLQvf%-pvWtycjA+93DquCPVHkK)k_Uo@fK`NAYbYJ z3Bv&5GSBTgUtXi)MkPcTGJn%f=d)1naEd!NW=ZCs5g=m~Z=X}?j+0H4@hWlog4iAT zc$^D3tU4yMH$jwjU?r}GQfTr!Zl&tognMb!bawBBousLQad{ktG3d(M+S&fWnIyR+ z-o9NSn@UiE1e-gPs~qs|ZR`if7c08YM8;3_w?v9v z@Rm3oP~IU#RWvP65Qc4-PhBJ#1vZf$8qpDTGcYMCicMg6gv~AXF4-or3qKiEF1!<| zv{`o~mM^m2mD@4C4`K^%$=$?4wV^(EnB_pD`RUE?xFmEWmFr-kP0(dH3uT6RlL52qrv}@A(@ow24qb2jl1S)3nr4-cO703uFOck{1& zda1g2N-lBi=d)fCs=%5NV_2o%l8&fF0X5@t{S{BQEOkOn(<9oj&OD@Z z+#m?iPesqJbff&KXP#kHr(&9v@y9l^4(qqz_ixH$-5%_#LE)Z*?Q1M%DHtbj{re3c z*61GE{>HdXm94EV))iDCRUvmHnIoV6|A<(Ak3H_r!%0czGx9)un1u(%u0`md@9UMn zcv*h^e4%aR{{aYU;U+}9Uaj2|h^`jXpya2`shEF&@lu>9zeG<$aegyt-zzMi-80Xi z;I&+)b<((g)(M?K{YaGS+)thY*V+ni;jd6itp;462lJmrSC1=TDxk(t|ld!cPxSO>ui? zR*1oZ=iJ<=pBG7zr#K#bw%lnYD`_RJ5>}MZXzyX%t-w$iXEprctcEH+`mR8M=X6?qFIO5&*+q?a@SIk$k~QHj>T4rt_4-E-@zEYI zZr`xqm30sy(Sl`bOd>+2yz!@bx+UVGp7tX@o`~P#x}%OpdE!dWH0$v0;%YzPIGd)f zJhKUPeccl=iH7H-b7()VLwH90VU&xHxM49HI?1y(q23$3SFu(8@e=2aC`p0zjGGv_ zpV!o(D&LrWy3*N()6#el&Y0ybCVFgFpFe|}BASwu)xL~ZE`#l=VBYpW_=V(Jq)CeH z3>o*A1UemyPfusaJZ!V-C{Qxi4ikA$W(?E?REcs*_^YiD2V(I>(FmyBmQ7H!1JD;y zO)9dM-Ic|gtHfeED;-%%CDfs)#F!okAt&3(2eSnf(im^!ZP_AhI%S440 zQ{j#T=2QonJ$@+HRij~$1eOO9^!bv)a)E~i3L>g%Dh!|bPdcU zh*J`xbF1oAwkf6+PPLL21X^(3K8b+R^T#NFN5 zd`&ju1B|~wai4C#Om2{Cn*0ZFwYs2$J&a(nGpl z`5bNL?0Wm*ZBWB5**^e>nghvo?FY+pk

        1idj5|XDIA1GcCtEY2|GT+V@Ifa`a~% zwNeawR_A3qooNpSav8XOMy&>rujC`hOQePk*^KKwk+n4Hubv(2!Dhs(M*J>Yx^2g- zSP4OPlsUsJ5h!)2ta_3TFNq_RyEprVr=g0iY@`6=v$nef3*c*38{qYRg@Bt+;u0ke z>EidEQ{+)>b$pMY7RJ&jF!| z_GAC#&^HveCYGp>mL}Y^`leOsa^4IH+dkGut}m%%Yryr8Xb-&US9m+0i=<%#hR1yD z3%|pv5f~~@k?Z%I+s_F;40vE1u7k90@Tjwf8{Z;!3CcL}(Y(H$BfYNVxyv^ft4+&I zV{4YEG51hig`fgQum!YwRWq&`Y3yWgA7B(!tZXQrwq;O*NuUt(fg5H$DHVsF+>a!C zU})JVt<;p~BCKWLRUgzrfoI4z`MB^0L1uS4&+3*5sJbNNv48CsiQbZ?B;Tc5ZG_O^ zT&de!%?1%!7^?IWtJss_l^xy(0c}@dMp7@I2mT+wmFE3K$$AfUPP!$&!#8;aMYr{d$a3<|# z?R|&K@9OjuzMn_F@9g7<+K85dD{xF?^BTNR3g0_c$JUrOiJ zdSSWuMX8x1b}^O$+u!15UbcU7>Fs9jPmvBLn&Q_2iM(R1{l@|z;$1ST#wyP`vBs#v z!-qE{gr|U+wv7`uj&m^|LghfuxpZ2jqvCPoVy}MvY|rBvs{G zs?gSOCB+Z55;Gl+x0FN+e5|LA3^1@sPmNQw{f-vC@h#jl{fD}c?wJ!2JO#TZ%Llvw%LTT)H7+Oyor{<4eS5!4>@+Zu=&8ryiU`D01 zskjV>6nrL?$z}^yjal`No8<^K*vLq_Jaki&SEO__*^=;*q1Pl|-WoRH1PR(%Q@+}X z>fkq+`*z~@RoG1&Ut=6U+sLxo21j;v34_tqYjV^PRMmHi^xgd0cZI)q!a}rNEt;v> zuPv)=09ErJ;Nu9}@qTH8DQ{;V_=gQq*oVxVr>ch(n6__wr686pQqRFq-KYvLVanvA z$X05R9<4Oyd@RKD?uq%w+KK2rS8d5Li^I=V3>KIbb|~5l zcKq#G8|%OFbN^Z9|L3(h3Bx5B+B>mjEY|GD#@4b1*B6Ga>8v`w9j$*4kGCE({L~7M z#P#Hn%Td~uE?8#z%YcO?&CvGm{SNKN#tvF^?~|4pkB%T}yRm2A)96GN{Qk*FlCzm1 zn3Bl%*de4D@YvZVg8~LP%YckR*xT&%^&@fov0L~;-K>RHkHXwmnzV%Q2|UTbuu~aZ zSbr8A$=lNG1| zBB9Ui0W~eIkMps5E40(@EGt}PcWB@alx<90*JxV@xQEBA&_;C=8&&8}7-B{K(y_On z2>>YQ?A8r=_42jnAw5=(!dH%@qFi4d(WHsQctKp!{m3?l{hXCzU$;jtsmSRgH2a94 zUHiQS=khsiuh}Gj9MRv$m9`yL#sS)Hy2ARRiUvt0=l<-U+t?d;@>jq+BNUq6;-8-8-dw>^Dnf6_2Pqq~lo6bW%vwtQbhh zBXpEOsC+iKR|JmozYHHrVRrRI_1a$;Hb>&i=r7{abh2sMasN`)E5A9~q(vC=`}_lR z3fK0MUA26^Qx&bYszVtDLJ&P3H{S74-f0qj>Yx(c!3n;YuqpoJ6Jr63?;j`1E9yO{ zy|UsJUth7=8_RfPyEMF?%^V~%Jwm1$Op-AL$;BzYWTO_KR3scHX1#eiby*L!n}u_? z)V}z&#;2iei?^;wUJZ6qx0qM*M3&P{mB+|FH160mg{n5LaUCseAkLEfCl;%7c*5bl z5NtcIroxl4kDR)UG|=p{7H;}Bwy8_#La|i>L`5)sxc=>k(0y+}W+L@zV;|-ut4~h0 zuzx-Ro*kyepfW1Zm2Ivi)SdcNttIDiy6L*H8mWr z47ARxpZFw>XER)dX=Yc)R!cREMSj13k?@kblD=}PA~}d@ONtkJmvbXkSfB6ZCj7k( zZU4A+^<>;9Ln6izx}+=I^4Iun-+azr8L^a&=C`kkSRByGV6S2l}GjwT2qmhT8MA9GP&nccuLw(T@b0SyP^PRA0iyM ztQeXRpPK~7;;Kz#-S)4{WUfJ0AD4i zBJJTkE17?ild(xDxoNIw?9?BW?m-faP0L@2JkKXMW(ApXt+N6ver?jq;!;LvYjgvm zG1e$Oo6a~P&8#oTTgd;{$u$2leBEx(c3DD3JYt;_H7g!n3@eFyEeZpia6t9fOJ+ZJ zeHB+Zk$XA0=}xOyq|XK66m6T>x|bM#*y?#ct_47XGNDr> z#A?q#Rv6V}lp>@0RNDC3qN*kvE*ql5Ym|;NHkx0IlpcWNbr+Xr%4Y>=@A&EXn`&HA zqh|&w|KPVLSN-}MLo{f7vCWu^5?u#fjv+1!Oz5yHpE1%_RE*ZXbr0__YP-!b+Sf~m z!T6UZ)U_05d*9)~4746)H7SQfB}e*{5m{A(?7HgKFd6y=6^yw~t4Ai=Ta(%rp)R?Z ziLt%T>ySp}w0ww*k}Q!z~M7%}18Cs4K;d7iNXdtp&DTH9BGU50FOM(VPp< z%}=;j1Kwxp`!8HQO6fcs|AC5+NZA}44)4awV>`t&pDo6q8kNOmb(j^d%Na>zFJ8ia zfu-PHS;%l&gAlY$GqTh{#`iHb-ZK`N!We5-H=ve^?nNHEq~reQ2Jb3Bw}wwGfN zfYUYN%2iSmi1i+u_2N?PtmxZ(6$|TjXs=)+;gI{65s>);QQy|fTboY3N%!kD)VKd< zMBFVyqG>4{xR@k|bMAI1VCtyVI05DR_Fdjx!hcD!$bZ(N8mhI(-}*9frRjwGu+MJH zPH`+)Z%%taWsKW9{z5D@V2N$rM_f(O4%&u>E~%#@5(kzmww20feWG0%K5?JdMPghF zcU}xUP+z%O+e0*dMM=DOnMWkQfOe${4i46^taeItm^k3HB6M@I~}jQiq%*z=QiAV7BvBEI7OkqBz1} zxxO_9svuOe_`4-%%+PP!8ptT zylX)<+-fiwnw{h>Ojw%0@Y|pcW+pQrQB_blK`r#8(s!M^E$JUX8r$y%e^Om4&)Dxu zY>-P(ldO<>>SDjM&g{}6-nyP$TnDLfPIUi`Ax%3{rWF652?VD_Kp<<+IhL{9HjYk~ z?5i&vsi~S@I-yH}qt3Uw;nm#Bb+Og&_F{sR!(zs?TT=V$MCxASJSLjSq1-8)uI0)? zPI+i;%U#1a{bha=i1kpCk>3aj-g9_aBzPzv(%0gQ83QlAJU)MG{PJ;`dYl2i$Z1a@ zknfJ%W2e)%(lq4~aR!&L`vdwKl;NjydP3<_ZpG_V>TN%BJsv>1t{3$WfW^Hy<3}@E zfje6-ue3MVeSmVT4!`~HDF**}^7>z{(>R>MCQj~N&&Ts&!MQ(Ytp1?Ntl4*Ypu5sg z8`SO04;{+E0~M)o+{KI8QV{2o@|rW5I$G+%>obhsNEt z(Ez~-E{(fe<23H>?hqijyKBDfZ=a@SXKHu0s$cHyuDbnl&bj}eHj?t#qj_Cfk?s?c zZNz+-BDY!>lrYc4$gIyisdys!iN}sZ~6j96r6iDjbcGFa^nd+SUDc}W{ zZ<(wJxR$1FX0Th=Hzf=Q@Rp%@g=oyUx%M-z(iJhi8)D;O;H;k!{arWdygpW!5mhF7 zz0SddP-&yr}aHWY?JpDC41VX!SryhoBWt0nM3Sy@t1(d*Oj>Yrg| zmzpBmW0Gtlb{<_6^dxz9JGBd=bA&jMxS%cQH8a_l>1>1U2YTgp zJ=?0nIc~d$bTCM8NoK-gt6AWMw$;0aRNgaZ<;N!~GnIEz(~H;WF$B)<2R$`cWWTQn z$mXQ^5tt+0c@B%>FU-*uED>AbNa^=8|Fjvy zEZWwRw8FkOk&5o7UD?}0ssS7hsyCHiQ|drDE(#Yn3gzjSu~iJ~5@tB1Ps;-rMq9WI zy+{SU9A}gUD=SlB4zyh#*HsIThNA~5MnBVQ#6DUEw0tkI-|eEvE-K^=rIGw5^4BCU z{u$R?dc7mF5Knl*II&xMNdA+@OI_rfL;Z9}@qcNa|G(edf(t}NBJI%^$I8)?SW#r+ z>69k;lNB))1Cisqfoit(Zy;NlaG=ajQAt8O`eEbKKB4&&i@w11E#BSN`F`rCqkhuf ze0^%S#Si!&)#S*DmP~l@i@1~>rX}PZ1iGs<1?0<3ayZ63owU|1B7=&Lu6%N{DUo_K z*$y?}%C)`AikVwk^4y5XlR9mVO+%Kb3n8>1YRYIb$m^2a{6BEmWX3jH!uh{ssoIqo z-cJWkd$QDyra0AEL_H40fB$;TF#09)IJf5tUGJ1o<^ag)T3oD4`e|LyPqLYq7*Vu_ z7%mUVS*@SSG&CdQT%*V>O5-ECkZd-d3^zlWIon)IxBie+Kz~+JsZ{0PyRZR;b?rV6 zuPdNrx7+u;-j^?cC&gnj7UeyaiKKy8B0boAQHD#M*rEMOaW2VLo@o)XlYj8TL6W0M z^dem@x21xnc!@w*UP7A9FiaLUA^D^*>YI5jO$$r6oW=>AQ@4qPRnR{?f0L@}XD*cE_BBN=Akg-oct5gB{B;MWBD4s2>;JfC(5uXGgVSnxoXca` zA?5Kk;GLFbkUkY7@Xrl#b8hmacc*}dKgr2Uel>h~Z~|f)qZf`z>b(Ub)j`G2!Uy7? zCAS7)ja!_aDqI=@k#zpc4nQ}u5JNmqUmXOUJy2{9W8E8aN_l!V{h*GiZTsK|!3!0s zZMHFlEx@*6=HN|yLVJ?e4e-5-S%A}eKJsmmWDBL&uEXh`zZ3KH6BLoT*8lfjY7zB4 z2{vsXPDtNdNLOp0BR$2}b2LH!j@il3;>r~glJvQf6xF7Zo=H;8N3$$&^6I|8p_fhZ z>>xU)Hhp=Fgv@Y(tuTQ<93Y9eJwF4j6y!?NBH4QMT%5k`jucB1eMX%-CxQBT(#!ew zZ;_M^IEmqDKlNii?x`OyfIeVMs&?{T>GvBlOic$`#*5+DRH-#i;NJa`-jC2 zQo(+Y$d-+cB@5WW%<|97#m$gg9lZa9u34V~QZD*74%M8_o(D2%(~4ITxRzDnGZh>Zi8OI!XH>!kxA| znzE#2yE_ysyiaVGP*(3pl#d8pHe^=W)8trSXxK?%ksDRH4OWBB?HRK-RHn-tqSdAb zD7hjp_~B+?BWoJoQWReSShH)B+c9Yxu-Cm-hZGNeG3h8|CsQD=8WD?#Xlkhl9{lZ~ zUv{gTlxfKPt>_^}nunzyZ-Ri2iM@VaiWXz}RQfQU7_#x3${xgP#Qfyl0V zj9zugc_75N__PTmHbPc#`! zZd45+Rkoy+naqysGHgLUe`rRRbVe0t{9Opt)p;y`;0=b`lpHSJwGLE)Ic#;HL-8^r z6cKd8?p8E5;~TR)JlSIt+jH)&Sy^{pO}VNXwEeH)F zu?R9xA)R{9KQjBTGHkkFX%W+6xXF-0VakO97=rttd2HW;&shA zxnIdG5CW{?Yg!Np$-XVf)wx!e#EKEcVxiaC={#IY_YBHB;}9`EgqBmy%QHC*nkAi? zzS|q@@j8`Q{D(ETbMNIn!EF!W7r$Q^TDHv=&_+0sp|dmqPnnDwmpH>bN%bm zfSy@t^0>8YEM=wDwvs>V?4uOf8soeCz7<=w-sN-NI4uW9=^4#yP_thn^osbh{ryd2q-WuDBIY${C08Jt^keeUOY;5Xz@7vy>nY9 zyGll6xB8Iq1HPzo#tb@GPx;eI`fL84{*#6}C+4m?RfVkxY8=^FRdrfRzSEsHKFbtG z3kKf(;*P~}lLOSK%7>a;z9Z**JyKLsz^N0ZvZ69eIb|5%YyEdy&%}OV)^A^pLfS{8 z0^*l-xgL-XD?mZIE-8o{;m$1#gSL{X6MA;GpK+uXPl+e+vSOF&mf}+c*^x7-E5ob= zhK!OX^%!zV2RlY+9XiA%}F;=IjeTzPq} zNrOYguwGYX6$}F(@Mldzb1dYwfEEeobYen&`n}JJ*P-BsiXB&cW&l$ZgUAj2b`&mZ zO79WMm}rMO*~nbu;E!->!E{9FUyGDC;T#T}`EB9=+3xvDK%g_t_v)LG{h!2Mb|XYmA6wi_cD0Hdj2(EB6y) zfuAL;)j9_AiDpwIaJKn4z^689lC}?g0^t8~oW}V9;Kncv3pn~i0o9?b!E6yQOuyx| zr*O3gi#1M&Ko)Bw58G_4sN>i^zG#!TRsl!D(J;Ln#qww5Ca^p6cLLL!#l*$Zf@#SS zLo4SQ)KzU&x$m91+5@G&+^C0MzB>^c?A@(c+_hNZVS4If({ba{!IUDqyAw=!?2y6c zp^N0IszKASJF~r>8CjA%V9wPGjc(b)XR4sxvKOn5vgyO|c8P+biCv9gtjF^4GXj@5SwLlZp{JfuscZZAcLDYDl#d^p{Q(vXlL%M+-@EpW@D zcy|E=d>N2WIl_nN>UQ*dnV8)S|&e4Yy(iH!_M{lEnND!G zIr&a3@uSccY2ZI_I~wmWRhsU!pjahV?P+^du+jgSmO8$ct!2NP36egf z7uRTxq~8J=!B+yLQVt2+@kNgcA65grGiu0$G;Vp#9v2+6cR;yeC-#{>Pplxx)7$T% z>0q)gC`p0%Z=^i$fh7&$=a zlL5;sZB0AZq-lU%)apNQ3v#s=X1*iGDd}IC%uA-PjhL&X(d*#+?#np z?@p4c)&?bdqW7u@D9YA3bTHiytS)$tKN_v)ff^R20jiSGyBRc0ZvahFGs#>8Q3KuI zbg6HvzuS2YNB^|mKGYhh{Wjgmg=LxK{Ds_{!6H}jg(n*4=L9mkpRkVGAL{W#%L%=# z&!yOT=KLxb_mD;N?%l2be%?u$5+zKu^_I&Z^-NmI`LVTr_4z~uYAYWTWVV4TV^hmp zKs({+JNO%B$pX(}1Gbd{V7*g^h*qRJjNUgH^<)^tSPQW2Y;YVet{dLe;bPoFfoq^d zTul80r*@&s+(=MOfqgUu3%gk>oGMY9)C(_qI^Fme!kkH2Mx8B4ZodXZJH~-qmCX*T znLs6^iv{=k#Kx~=AMmZMIeh=Y3!$8R=s%y^>ZlOuNHmL|x+4G9K_b8}g-NaVTplsu zz)>sl=p0j6(NGYPeJhctvlX(A5TT2c@|TRjP~V|0tJR@nXG4#*0FE3Y&GWHB?pgU! zNRsL*Q>u$~YX~lghy4Hrwl*DCd;`2fOKSeAcqV(C^ZwJIxd zpP`E5i~dhY`v1t>BQ!@dmODKit!^&K{6=tZeL6whj=vm6H;eAa_Qby(*!L~&1?>E_ zRQTNyI9G#3BHhm)TY9a1Zd*cXJ``A8==w1Y$Vw7@`>0G^2H)ez@43;t#KR#o57OE9 zC;T|Hk_k^p30ktVNX=MKVo=?2k^#(B6`Co-wQ;AcD6CXc$HAd~;Vjwmm{8$j9PZSY zrojovrAGn^97-L9=N4O9fld8I$e5h+SAuxqs0LP{`MaqE*pex=T{yw@hFH(k;& zijKalEf{8IpDoPhOZVpag&9dg+9x3k3GbNOK@8Xr`uY%a5;j(gHheN-9FrF)MT)j# zPEYm|oOheerhv&!cb!zTf(qU7A|xhA%KC2Hci>(O)NzHcWTAt_fNHVx%&hhdX01kb z2TmO}-;q95(wcDLoNr#e_9!NVg8(gVt4E{@@%*#80ea;#BXz2?hu0OfV+;i!5iGf) zFcIbdxc!m{uBJT8d;LN6TJ;jr>P+W1M$WbOR$k_Mt=jel4h5@jiDT5`FVpjJq;aBa zP<+zg!ryl?bB!xG{TcMKDXi9%)cz>5J!;f%37miY^$W%p+{U>yYE?N;sQjG)C=ZZl zJ(apIIsl`0TzQp<{^+=t&=$9E4?=DXy>PP%jMH)e)J4*4v^N-ofPNBv&Mi!Di=GIGmi3 zHsaQlO^SFX17`$VZW33h8C#eh`IAnyR1pyot@(zYo?iA9%(f7@joV0<>8NJpXiO=0$cKYXm?x^rdYf>}x1i4%%hDDtLV}CrE^3(7csScO#pmykgTO1q+-*;Y zQ-1zkM?Q}s{l);Ra=4^G#XoR;ahC$*8g?;lQ;GzpuI;I&XX%8$Vx+}OZHtS1!&tkZ`|`*o0c<7x-aXDU|@CX8EU8OuLCr&!j`1W7dwGmo1j zzCZ^WjK>9&@raeCxXOs?VZQT8>3wxlfSolcQtxUc^nrri`s)SHJ4ev`6?NLv>*G#-y6%-_HrS81aMP16?rL{gWJj8{WZPQv-`n!loz(J8w-tk*x(Wj9NLcO!WE;*l>bFX`?)Me*EVS_V$!tm zM6-FBN#Td!e0*D?KlyjfXbpQIKB0=$*P8NWOKP8{ zyh}2ej9Mz@pUUa!(ILxE6=#kqfyOiJ@GJdH8$Jv33RCLcZ8F!Zx7a*P%%m)tMR8I$ zAYIza8vXNGXCGoQUDcDL5I`NzJ{1)Xlq!r8ZBq3(&ha@djD$ET zOp0L+XUgC<%v9kx&Ma-aD%$!9`StCz-J6b1n23i|{!LcCRpK&41=D>K2EixZuxCjG z2)$1qVRG91Dc`bd)M*LFU$MMaZ0VpQyXhvQsJWO~aY5#TP?cXS8>)Jf=&M?&!#1bv z{iiJ!JXV!SBtYTn@Yj08d<3;AEE@ll5{^#PHgg~tWrAa3b@6&%8Gb<lNUc-AMxYMcSs@^*;qh7vitkPmH!5K5T zLi32-pmLOwV)uM>i#==!jplK zhbr~|s$>5zcLueOeYpcxG=-)1%U5~ZbKNmz^%RfU^!^hPI?MtUhD1%No6_mU$;8Rx z+b0i-LHYx}(yQ&Cw($ZXsACXgGJ?pIrj#7=^rtmUPq6l`wQWzQDw8zwSXs>Liuw?T zfjzVZZ};OX4Wov9_Jw6+*nXn^Q~fS(S9 za5pJOiAU(yJi!I2b~|%s4xkJM%=*l#NDs-HJtGmQAcx4c)=ZvH{JI?ayH_MnXsR%% ztE=~vPa5Gec?3VP>-TNVKE~jdmDy==O?*n0~r?<$Oh+*9=_TuS^-#OZ%0Ap}`1{tPJYb+YF{^?4k-#E9h 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 GOZpE8(TG(5 literal 0 HcmV?d00001 From 48bd7cc0c73da80550675643b92117025b675e12 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 10:26:13 +0200 Subject: [PATCH 0656/1398] fix deprecation warnings from Qt6 --- GraphicsView/include/CGAL/Qt/qglviewer.h | 24 +++---- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 62 ++++++++----------- Polyhedron/demo/Polyhedron/MainWindow.cpp | 8 +-- Polyhedron/demo/Polyhedron/Viewer.cpp | 4 +- 4 files changed, 40 insertions(+), 58 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index 2cf5b7faf342..a89a66a4b744 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -32,7 +32,7 @@ #include #include #include - +#include class QTabWidget; class QImage; @@ -839,33 +839,27 @@ compatible with raster mode): use \c glRasterPos3fv() instead. */ /*! @name Keyboard customization */ //@{ public: - unsigned int shortcut(qglviewer::KeyboardAction action) const; + QKeyCombination shortcut(qglviewer::KeyboardAction action) const; ::Qt::Key pathKey(unsigned int index) const; ::Qt::KeyboardModifiers addKeyFrameKeyboardModifiers() const; ::Qt::KeyboardModifiers playPathKeyboardModifiers() const; public Q_SLOTS: - void setShortcut(qglviewer::KeyboardAction action, unsigned int key); + void setShortcut(qglviewer::KeyboardAction action, QKeyCombination key); void setShortcut(qglviewer::KeyboardAction action, ::Qt::Modifier modifier, ::Qt::Key key) { - setShortcut(action, - static_cast(modifier)+ - static_cast(key)); + setShortcut(action, QKeyCombination{modifier, key}); } - void setKeyDescription(unsigned int key, QString description); + void setKeyDescription(QKeyCombination key, QString description); void setKeyDescription(::Qt::KeyboardModifier modifier, ::Qt::Key key, QString description) { - setKeyDescription(static_cast(modifier) + - static_cast(key), - description); + setKeyDescription(QKeyCombination{modifier, key}, description); } void setKeyDescription(::Qt::Modifier modifier, ::Qt::Key key, QString description) { - setKeyDescription(static_cast(modifier) + - static_cast(key), - description); + setKeyDescription(QKeyCombination{modifier, key}, description); } void clearShortcuts(); @@ -1075,8 +1069,8 @@ private Q_SLOTS: void setDefaultShortcuts(); QString cameraPathKeysString() const; QMap keyboardActionDescription_; - QMap keyboardBinding_; - QMap keyDescription_; + QMap keyboardBinding_; + QHash keyDescription_; // K e y F r a m e s s h o r t c u t s QMap< ::Qt::Key, unsigned int> pathIndex_; diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index e89577b1d1ae..0611fcf92bac 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -1204,7 +1204,7 @@ CGAL_INLINE_FUNCTION void Viewer::mouseMoveEvent(QMouseEvent *e) { if (myMouseBehavior) - // Use e->x() and e->y() as you want... + // Use e->position().x() and e->position().y() as you want... else CGAL::QGLViewer::mouseMoveEvent(e); } @@ -1221,7 +1221,7 @@ else CGAL_INLINE_FUNCTION void CGAL::QGLViewer::mouseMoveEvent(QMouseEvent *e) { if (mouseGrabber()) { - mouseGrabber()->checkIfGrabsMouse(e->x(), e->y(), camera()); + mouseGrabber()->checkIfGrabsMouse(e->position().x(), e->position().y(), camera()); if (mouseGrabber()->grabsMouse()) if (mouseGrabberIsAManipulatedCameraFrame_) (dynamic_cast(mouseGrabber())) @@ -1249,7 +1249,7 @@ void CGAL::QGLViewer::mouseMoveEvent(QMouseEvent *e) { manipulatedFrame()->mouseMoveEvent(e, camera()); else if (hasMouseTracking()) { Q_FOREACH (qglviewer::MouseGrabber *mg, qglviewer::MouseGrabber::MouseGrabberPool()) { - mg->checkIfGrabsMouse(e->x(), e->y(), camera()); + mg->checkIfGrabsMouse(e->position().x(), e->position().y(), camera()); if (mg->grabsMouse()) { setMouseGrabber(mg); // Check that MouseGrabber is not disabled @@ -1278,7 +1278,7 @@ void CGAL::QGLViewer::mouseReleaseEvent(QMouseEvent *e) { ->qglviewer::ManipulatedFrame::mouseReleaseEvent(e, camera()); else mouseGrabber()->mouseReleaseEvent(e, camera()); - mouseGrabber()->checkIfGrabsMouse(e->x(), e->y(), camera()); + mouseGrabber()->checkIfGrabsMouse(e->position().x(), e->position().y(), camera()); if (!(mouseGrabber()->grabsMouse())) setMouseGrabber(nullptr); // update(); @@ -1510,18 +1510,14 @@ QString CGAL::QGLViewer::clickActionString(CGAL::qglviewer::ClickAction ca) { return QString(); } -static QString keyString(unsigned int key) { -#if QT_VERSION >= 0x040100 - return QKeySequence(int(key)).toString(QKeySequence::NativeText); -#else - return QString(QKeySequence(key)); -#endif +static QString keyString(QKeyCombination key) { + return QKeySequence(key).toString(QKeySequence::NativeText); } CGAL_INLINE_FUNCTION QString CGAL::QGLViewer::formatClickActionPrivate(ClickBindingPrivate cbp) { bool buttonsBefore = cbp.buttonsBefore != ::Qt::NoButton; - QString keyModifierString = keyString(cbp.modifiers + cbp.key); + QString keyModifierString = keyString(QKeyCombination(cbp.modifiers, cbp.key)); if (!keyModifierString.isEmpty()) { #ifdef Q_OS_MAC // modifiers never has a '+' sign. Add one space to clearly separate @@ -1767,7 +1763,7 @@ QString CGAL::QGLViewer::mouseString() const { /*! Defines a custom keyboard shortcut description, that will be displayed in the help() window \c Keyboard tab. -The \p key definition is given as an \c int using Qt enumerated values. Set an +The \p key definition is given as an \c QKeyCombination using Qt enumerated values. Set an empty \p description to remove a shortcut description: \code setKeyDescription(::Qt::Key_W, "Toggles wireframe display"); setKeyDescription(::Qt::CTRL+::Qt::Key_L, "Loads a new scene"); @@ -1779,7 +1775,7 @@ See the keyboardAndMouse example for illustration and the keyboard page for details. */ CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::setKeyDescription(unsigned int key, QString description) { +void CGAL::QGLViewer::setKeyDescription(QKeyCombination key, QString description) { if (description.isEmpty()) keyDescription_.remove(key); else @@ -1871,17 +1867,15 @@ QString CGAL::QGLViewer::keyboardString() const { "Description", "Description column header in help window mouse tab")); - QMap keyDescription; + QHash keyDescription; // 1 - User defined key descriptions - for (QMap::ConstIterator kd = keyDescription_.begin(), - kdend = keyDescription_.end(); + for (auto kd = keyDescription_.begin(), kdend = keyDescription_.end(); kd != kdend; ++kd) keyDescription[kd.key()] = kd.value(); // Add to text in sorted order - for (QMap::ConstIterator kb = keyDescription.begin(), - endb = keyDescription.end(); + for (auto kb = keyDescription.begin(), endb = keyDescription.end(); kb != endb; ++kb) text += tableLine(keyString(kb.key()), kb.value()); @@ -1894,18 +1888,15 @@ QString CGAL::QGLViewer::keyboardString() const { } // 3 - KeyboardAction bindings description - for (QMap::ConstIterator - it = keyboardBinding_.begin(), - end = keyboardBinding_.end(); + for (auto it = keyboardBinding_.begin(), end = keyboardBinding_.end(); it != end; ++it) - if ((it.value() != 0) && + if ((it.value() != QKeyCombination{}) && ((!cameraIsInRotateMode()) || ((it.key() != qglviewer::INCREASE_FLYSPEED) && (it.key() != qglviewer::DECREASE_FLYSPEED)))) keyDescription[it.value()] = keyboardActionDescription_[it.key()]; // Add to text in sorted order - for (QMap::ConstIterator kb2 = keyDescription.begin(), - endb2 = keyDescription.end(); + for (auto kb2 = keyDescription.begin(), endb2 = keyDescription.end(); kb2 != endb2; ++kb2) text += tableLine(keyString(kb2.key()), kb2.value()); @@ -1919,15 +1910,15 @@ QString CGAL::QGLViewer::keyboardString() const { .arg(cpks) + "\n"; text += tableLine( - keyString(playPathKeyboardModifiers()) + "" + + keyString(QKeyCombination(playPathKeyboardModifiers())) + "" + CGAL::QGLViewer::tr("Fx", "Generic function key (F1..F12)") + "", CGAL::QGLViewer::tr("Plays path (or resets saved position)")); text += tableLine( - keyString(addKeyFrameKeyboardModifiers()) + "" + + keyString(QKeyCombination(addKeyFrameKeyboardModifiers())) + "" + CGAL::QGLViewer::tr("Fx", "Generic function key (F1..F12)") + "", CGAL::QGLViewer::tr("Adds a key frame to path (or defines a position)")); text += tableLine( - keyString(addKeyFrameKeyboardModifiers()) + "" + + keyString(QKeyCombination(addKeyFrameKeyboardModifiers())) + "" + CGAL::QGLViewer::tr("Fx", "Generic function key (F1..F12)") + "+" + CGAL::QGLViewer::tr("Fx", "Generic function key (F1..F12)") + "", CGAL::QGLViewer::tr("Deletes path (or saved position)")); @@ -2071,11 +2062,8 @@ void CGAL::QGLViewer::keyPressEvent(QKeyEvent *e) { _first_tick = true; } const ::Qt::KeyboardModifiers modifiers = e->modifiers(); - QMap::ConstIterator it = keyboardBinding_ - .begin(), - end = - keyboardBinding_.end(); - const unsigned int target = key | modifiers; + auto it = keyboardBinding_.begin(), end = keyboardBinding_.end(); + const QKeyCombination target{modifiers, key}; while ((it != end) && (it.value() != target)) ++it; @@ -2238,17 +2226,17 @@ Here are some examples: setShortcut(EXIT_VIEWER, ::Qt::Key_Q); // Alt+M toggles camera mode -setShortcut(CAMERA_MODE, ::Qt::ALT + ::Qt::Key_M); +setShortcut(CAMERA_MODE, ::Qt::ALT | ::Qt::Key_M); // The DISPLAY_FPS action is disabled setShortcut(DISPLAY_FPS, 0); \endcode Only one shortcut can be assigned to a given CGAL::QGLViewer::KeyboardAction (new -bindings replace previous ones). If several KeyboardAction are binded to the +bindings replace previous ones). If several KeyboardAction are bound to the same shortcut, only one of them is active. */ CGAL_INLINE_FUNCTION -void CGAL::QGLViewer::setShortcut(qglviewer::KeyboardAction action, unsigned int key) { +void CGAL::QGLViewer::setShortcut(qglviewer::KeyboardAction action, QKeyCombination key) { keyboardBinding_[action] = key; } @@ -2270,11 +2258,11 @@ See the keyboard page for details and default values and the keyboardAndMouse example for a practical illustration. */ CGAL_INLINE_FUNCTION -unsigned int CGAL::QGLViewer::shortcut(qglviewer::KeyboardAction action) const { +QKeyCombination CGAL::QGLViewer::shortcut(qglviewer::KeyboardAction action) const { if (keyboardBinding_.contains(action)) return keyboardBinding_[action]; else - return 0; + return {}; } diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index c5b6a3c7abbe..bc57849f7a75 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -820,12 +820,12 @@ void MainWindow::addAction(QAction* action) action->setVisible(true); action->setEnabled(true); - Q_FOREACH(QWidget* widget, action->associatedWidgets()) + for(auto object: action->associatedObjects()) { // qDebug() << QString("%1 (%2)\n") // .arg(widget->objectName()) // .arg(widget->metaObject()->className()); - QMenu* menu = qobject_cast(widget); + QMenu* menu = qobject_cast(object); if(menu) { addAction(menu->menuAction()); @@ -1030,7 +1030,7 @@ void MainWindow::reloadItem() { // Can use foreach: int mate_id = 0; - Q_FOREACH(const QVariant &v, iterable) + for(const QVariant &v: iterable) { Scene_item* mate = v.value(); Scene_item* new_item = new_items[mate_id]; @@ -2770,7 +2770,7 @@ void MainWindow::exportStatistics() } QString str; - Q_FOREACH(Scene_item* sit, items) + for(Scene_item* sit: items) { CGAL::Three::Scene_item::Header_data data = sit->header(); if(data.titles.size()>0) diff --git a/Polyhedron/demo/Polyhedron/Viewer.cpp b/Polyhedron/demo/Polyhedron/Viewer.cpp index 83182e00bf2e..53a6f3c86261 100644 --- a/Polyhedron/demo/Polyhedron/Viewer.cpp +++ b/Polyhedron/demo/Polyhedron/Viewer.cpp @@ -304,7 +304,7 @@ void Viewer::doBindings() connect( d->textRenderer, SIGNAL(sendMessage(QString,int)), this, SLOT(printMessage(QString,int)) ); connect(&d->messageTimer, SIGNAL(timeout()), SLOT(hideMessage())); - setShortcut(CGAL::qglviewer::EXIT_VIEWER, 0); + setShortcut(CGAL::qglviewer::EXIT_VIEWER, QKeyCombination{}); setKeyDescription(Qt::Key_T, tr("Turn the camera by 180 degrees")); setKeyDescription(Qt::Key_M, @@ -624,7 +624,7 @@ void Viewer::mousePressEvent(QMouseEvent* event) event->modifiers().testFlag(Qt::ShiftModifier)) { select(event->pos()); - requestContextMenu(event->globalPos()); + requestContextMenu(event->globalPosition().toPoint()); event->accept(); } else if(!event->modifiers() From 608d0c81c4ee7223f2997203602dbffc18aef956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 24 Aug 2023 14:56:48 +0200 Subject: [PATCH 0657/1398] use a macro --- .../PackageDescription.txt | 2 +- .../PackageDescription.txt | 2 +- .../doc/resources/1.8.13/BaseDoxyfile.in | 3 +- .../doc/resources/1.9.6/BaseDoxyfile.in | 3 +- .../PackageDescription.txt | 4 +-- Nef_3/doc/Nef_3/PackageDescription.txt | 2 +- .../PackageDescription.txt | 2 +- .../doc/Point_set_3/PackageDescription.txt | 2 +- Polygon/doc/Polygon/PackageDescription.txt | 4 +-- .../doc/Polyhedron/PackageDescription.txt | 2 +- .../doc/Surface_mesh/PackageDescription.txt | 2 +- .../PackageDescription.txt | 2 +- .../Triangulation_2/PackageDescription.txt | 2 +- .../Triangulation_3/PackageDescription.txt | 2 +- .../Voronoi_diagram_2/PackageDescription.txt | 2 +- Weights/doc/Weights/PackageDescription.txt | 36 +++++++++---------- 16 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt index a23221fc04fe..d74df4237fc9 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt @@ -47,7 +47,7 @@ namespace ArrTraits {} /// \ingroup PkgArrangementOnSurface2Ref /*! - `#include ` +\cgalInclude{CGAL/draw_arrangement_2.h} */ /// \defgroup PkgArrangementOnSurface2Draw Drawing /// \ingroup PkgArrangementOnSurface2Ref diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt index 3050f0a5654e..f67e57f7e1a9 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/PackageDescription.txt @@ -7,7 +7,7 @@ namespace ArrDirectionalTraits {} /*! - `#include ` +\cgalInclude{CGAL/draw_polygon_set_2.h} */ /// \defgroup PkgDrawPolygonSet2 Draw a 2D Polygon Set /// \ingroup PkgBooleanSetOperations2Ref diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 15a863470a20..13e729df74f8 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -190,7 +190,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamSectionEnd=\cgalParamNEnd" \ "cgalParamPrecondition{1}=

      • Precondition: \1
      • " \ "cgalBigO{1}=\f$O(\1)\f$" \ - "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" + "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" \ + "cgalInclude{1}=\#`include<\1>`" # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index 67b8fd643f34..5deea5dec058 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -199,7 +199,8 @@ ALIASES = "cgal=%CGAL" \ "cgalParamSectionEnd=\cgalParamNEnd" \ "cgalParamPrecondition{1}=
      • Precondition: \1
      • " \ "cgalBigO{1}=\f$O(\1)\f$" \ - "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" + "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" \ + "cgalInclude{1}=`#include<\1>`" # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given diff --git a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt index 03264451c0c0..ad0479d5128c 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/PackageDescription.txt @@ -12,13 +12,13 @@ /// \ingroup PkgLinearCellComplexRef /*! High-level operations. - `#include ` +\cgalInclude{CGAL/Linear_cell_complex_operations.h} */ /// \defgroup PkgLinearCellComplexOperations Operations for Linear Cell Complex /// \ingroup PkgLinearCellComplexRef /*! - `#include ` +\cgalInclude{CGAL/draw_linear_cell_complex.h} */ /// \defgroup PkgDrawLinearCellComplex Draw a Linear Cell Complex /// \ingroup PkgLinearCellComplexRef diff --git a/Nef_3/doc/Nef_3/PackageDescription.txt b/Nef_3/doc/Nef_3/PackageDescription.txt index db62abd9bf7e..be928e299ee7 100644 --- a/Nef_3/doc/Nef_3/PackageDescription.txt +++ b/Nef_3/doc/Nef_3/PackageDescription.txt @@ -4,7 +4,7 @@ /// \ingroup PkgNef3Ref /*! Draw. - `#include ` +\cgalInclude{CGAL/draw_nef_3.h} */ /// \defgroup PkgDrawNef3 Draw a Nef Polyhedron /// \ingroup PkgNef3Ref diff --git a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt index 767fc2b01e05..00c17ceec127 100644 --- a/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt +++ b/Periodic_2_triangulation_2/doc/Periodic_2_triangulation_2/PackageDescription.txt @@ -16,7 +16,7 @@ /// \ingroup PkgPeriodic2Triangulation2Ref /*! Draw. - `#include ` +\cgalInclude{CGAL/draw_periodic_2_triangulation_2.h} */ /// \defgroup PkgDrawPeriodic2Triangulation2 Draw a 2D Periodic Triangulation /// \ingroup PkgPeriodic2Triangulation2Ref diff --git a/Point_set_3/doc/Point_set_3/PackageDescription.txt b/Point_set_3/doc/Point_set_3/PackageDescription.txt index c6d433e20bfe..afa3d9882f26 100644 --- a/Point_set_3/doc/Point_set_3/PackageDescription.txt +++ b/Point_set_3/doc/Point_set_3/PackageDescription.txt @@ -1,7 +1,7 @@ /// \defgroup PkgPointSet3Ref 3D Point Set Reference /*! - `#include ` +\cgalInclude{CGAL/draw_point_set_3.h} */ /// \defgroup PkgDrawPointSet3D Draw a 3D Point Set /// \ingroup PkgPointSet3Ref diff --git a/Polygon/doc/Polygon/PackageDescription.txt b/Polygon/doc/Polygon/PackageDescription.txt index fd7cd1f7e0cf..49c33a812281 100644 --- a/Polygon/doc/Polygon/PackageDescription.txt +++ b/Polygon/doc/Polygon/PackageDescription.txt @@ -7,13 +7,13 @@ /// \ingroup PkgPolygon2Ref /*! - `#include ` +\cgalInclude{CGAL/draw_polygon_2.h} */ /// \defgroup PkgDrawPolygon2 Draw a 2D Polygon /// \ingroup PkgPolygon2Ref /*! - `#include ` +\cgalInclude{CGAL/draw_polygon_with_holes_2.h} */ /// \defgroup PkgDrawPolygonWithHoles2 Draw a 2D Polygon with Holes /// \ingroup PkgPolygon2Ref diff --git a/Polyhedron/doc/Polyhedron/PackageDescription.txt b/Polyhedron/doc/Polyhedron/PackageDescription.txt index 12ee7940d944..780ed7344468 100644 --- a/Polyhedron/doc/Polyhedron/PackageDescription.txt +++ b/Polyhedron/doc/Polyhedron/PackageDescription.txt @@ -6,7 +6,7 @@ /// \ingroup PkgPolyhedronRef /*! - `#include ` +\cgalInclude{CGAL/draw_polyhedron.h} */ /// \defgroup PkgDrawPolyhedron Draw a Polyhedron 3 /// \ingroup PkgPolyhedronRef diff --git a/Surface_mesh/doc/Surface_mesh/PackageDescription.txt b/Surface_mesh/doc/Surface_mesh/PackageDescription.txt index 4278f42d86cc..84829acb9b40 100644 --- a/Surface_mesh/doc/Surface_mesh/PackageDescription.txt +++ b/Surface_mesh/doc/Surface_mesh/PackageDescription.txt @@ -1,7 +1,7 @@ /// \defgroup PkgSurface_mesh Surface Mesh Reference /*! - `#include ` +\cgalInclude{CGAL/draw_surface_mesh.h} */ /// \defgroup PkgDrawSurfaceMesh Draw a Surface Mesh /// \ingroup PkgSurface_mesh diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt index 7087216cd1a9..b39b30e8f933 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/PackageDescription.txt @@ -7,7 +7,7 @@ /// \ingroup PkgSurfaceMeshTopologyRef /*! - `#include ` +\cgalInclude{CGAL/draw_face_graph_with_paths.h} */ /// \defgroup PkgDrawFaceGraphWithPaths Draw a Mesh with Paths /// \ingroup PkgSurfaceMeshTopologyRef diff --git a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt index f9e1d3a2c047..2f10c201757a 100644 --- a/Triangulation_2/doc/Triangulation_2/PackageDescription.txt +++ b/Triangulation_2/doc/Triangulation_2/PackageDescription.txt @@ -14,7 +14,7 @@ /// \ingroup PkgTriangulation2Ref /*! - `#include ` +\cgalInclude{CGAL/draw_triangulation_2.h} */ /// \defgroup PkgDrawTriangulation2 Draw a Triangulation 2 /// \ingroup PkgTriangulation2Ref diff --git a/Triangulation_3/doc/Triangulation_3/PackageDescription.txt b/Triangulation_3/doc/Triangulation_3/PackageDescription.txt index b1bbaf9f3aca..df07b9900161 100644 --- a/Triangulation_3/doc/Triangulation_3/PackageDescription.txt +++ b/Triangulation_3/doc/Triangulation_3/PackageDescription.txt @@ -13,7 +13,7 @@ /// \ingroup PkgTriangulation3Ref /*! - `#include ` +\cgalInclude{CGAL/draw_triangulation_3.h} */ /// \defgroup PkgDrawTriangulation3 Draw a Triangulation 3 /// \ingroup PkgTriangulation3Ref diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt index dc6ca27d40ae..b109a0213d91 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/PackageDescription.txt @@ -13,7 +13,7 @@ /// \ingroup PkgVoronoiDiagram2Ref /*! - `#include ` +\cgalInclude{CGAL/draw_voronoi_diagram_2.h} */ /// \defgroup PkgDrawVoronoiDiagram2 Draw a 2D Voronoi Diagram /// \ingroup PkgVoronoiDiagram2Ref diff --git a/Weights/doc/Weights/PackageDescription.txt b/Weights/doc/Weights/PackageDescription.txt index eb5f9bf451c6..038724d39ad5 100644 --- a/Weights/doc/Weights/PackageDescription.txt +++ b/Weights/doc/Weights/PackageDescription.txt @@ -19,7 +19,7 @@ Models and functions that can be used to compute weights which have a simple ana \defgroup PkgWeightsRefUniformWeights Uniform Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/uniform_weights.h} This weight is always equal to 1. @@ -33,7 +33,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefShepardWeights Shepard Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/shepard_weights.h} This weight is computed as \f$w = \frac{1}{d^a}\f$ @@ -61,7 +61,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefInverseDistanceWeights Inverse Distance Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/inverse_distance_weights.h} This weight is computed as \f$w = \frac{1}{d}\f$ @@ -90,7 +90,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefThreePointFamilyWeights Three Point Family Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/three_point_family_weights.h} This weight is computed as \f$w = \frac{d_2^a A_0 - d^a B + d_0^a A_2}{A_0 A_2}\f$ @@ -129,7 +129,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefWachspressWeights Wachspress Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/wachspress_weights.h} This weight is computed as \f$w = \frac{C}{A_0 A_2}\f$ @@ -160,7 +160,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefAuthalicWeights Authalic Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/authalic_weights.h} This weight is computed as \f$w = 2 \frac{\cot\beta + \cot\gamma}{d^2}\f$ @@ -190,7 +190,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefMeanValueWeights Mean Value Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/mean_value_weights.h} This weight is computed as \f$w = \pm 2 \sqrt{\frac{2 (d_0 d_2 - D)}{(d d_0 + D_0)(d d_2 + D_2)}}\f$ @@ -227,7 +227,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefTangentWeights Tangent Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/tangent_weights.h} This weight is computed as \f$w = 2 \frac{t_1 + t_2}{d}\f$, where @@ -262,7 +262,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefDiscreteHarmonicWeights Discrete Harmonic Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/discrete_harmonic_weights.h} This weight is computed as \f$w = \frac{d_2^2 A_0 - d^2 B + d_0^2 A_2}{A_0 A_2}\f$ @@ -293,7 +293,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefCotangentWeights Cotangent Weight \ingroup PkgWeightsRefAnalytic -`#include ` +\cgalInclude{CGAL/Weights/cotangent_weights.h} This weight is computed as \f$w = 2 (\cot\beta + \cot\gamma)\f$ @@ -328,7 +328,7 @@ to polygons. These weights are then normalized in order to obtain barycentric co \defgroup PkgWeightsRefBarycentricWachspressWeights Wachspress Weights \ingroup PkgWeightsRefBarycentric -`#include ` +\cgalInclude{CGAL/Weights/wachspress_weights.h} Wachspress weights which can be computed for a query point with respect to the vertices of a strictly convex polygon. @@ -339,7 +339,7 @@ vertices of a strictly convex polygon. \defgroup PkgWeightsRefBarycentricMeanValueWeights Mean Value Weights \ingroup PkgWeightsRefBarycentric -`#include ` +\cgalInclude{CGAL/Weights/mean_value_weights.h} Mean value weights which can be computed for a query point with respect to the vertices of a simple polygon. @@ -350,7 +350,7 @@ vertices of a simple polygon. \defgroup PkgWeightsRefBarycentricDiscreteHarmonicWeights Discrete Harmonic Weights \ingroup PkgWeightsRefBarycentric -`#include ` +\cgalInclude{CGAL/Weights/discrete_harmonic_weights.h} Discrete Harmonic weights which can be computed for a query point with respect to the vertices of a strictly convex polygon. @@ -368,7 +368,7 @@ used to balance other weights. \defgroup PkgWeightsRefUniformRegionWeights Uniform Region Weight \ingroup PkgWeightsRefRegions -`#include ` +\cgalInclude{CGAL/Weights/uniform_region_weights.h} This weight is always equal to 1. @@ -382,7 +382,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefTriangularRegionWeights Triangular Region Weight \ingroup PkgWeightsRefRegions -`#include ` +\cgalInclude{CGAL/Weights/triangular_region_weights.h} This weight is the area of the shaded region in the figure below. The region is the triangle `[p, q, r]`. @@ -401,7 +401,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefBarycentricRegionWeights Barycentric Region Weight \ingroup PkgWeightsRefRegions -`#include ` +\cgalInclude{CGAL/Weights/barycentric_region_weights.h} This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the barycenter of @@ -421,7 +421,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefVoronoiRegionWeights Voronoi Region Weight \ingroup PkgWeightsRefRegions -`#include ` +\cgalInclude{CGAL/Weights/voronoi_region_weights.h} This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the circumcenter of @@ -443,7 +443,7 @@ a model of `AnalyticWeightTraits_3` for 3D points \defgroup PkgWeightsRefMixedVoronoiRegionWeights Mixed Voronoi Region Weight \ingroup PkgWeightsRefRegions -`#include ` +\cgalInclude{CGAL/Weights/mixed_voronoi_region_weights.h} This weight is the area of the shaded region in the figure below. The region is formed by the two midpoints of the edges incident to `q` and the circumcenter of From 79a563bfbc682818e6964717dfe3977e08dc2d29 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 15:17:17 +0200 Subject: [PATCH 0658/1398] fix more deprecation warnings --- .../Plugins/AABB_tree/Cut_plugin.cpp | 2 +- .../AABB_tree/Do_trees_intersect_plugin.cpp | 2 +- .../Plugins/IO/Polylines_io_plugin.cpp | 4 ++-- .../Scene_aff_transformed_surface_mesh_item.h | 4 ++-- .../Plugins/PCA/Scene_edit_box_item.cpp | 2 +- .../Scene_facegraph_item_k_ring_selection.h | 2 +- .../demo/Polyhedron/Primitive_container.cpp | 8 +++---- .../Scene_item_rendering_helper.cpp | 18 +++++++------- .../Scene_polyhedron_selection_item.cpp | 24 +++++++++---------- .../demo/Polyhedron/Scene_polylines_item.cpp | 4 ++-- .../demo/Polyhedron/include/id_printing.h | 12 ++++------ 11 files changed, 40 insertions(+), 42 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp index 5c14416d9291..f72ebe5a7bd1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Cut_plugin.cpp @@ -123,7 +123,7 @@ class FillGridSize { Simple_kernel::Vector_3 offset(v_offset.x, v_offset.y, v_offset.z); Point query = transfo( Point(x,y,z))-offset; FT min = DBL_MAX; - Q_FOREACH(SM_Tree *tree, sm_trees) + for(SM_Tree *tree: sm_trees) { FT dist = CGAL::sqrt( tree->squared_distance(query) ); if(dist < min) diff --git a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp index 08a8ef803e43..5f9eeed58388 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/AABB_tree/Do_trees_intersect_plugin.cpp @@ -131,7 +131,7 @@ private Q_SLOTS: this, &DoTreesIntersectplugin::update_trees); col_det = new CGAL::Rigid_triangle_mesh_collision_detection(); col_det->reserve(items.size()); - Q_FOREACH(Scene_movable_sm_item* item, items) + for(Scene_movable_sm_item* item: items) { col_det->add_mesh(*item->getFaceGraph()); } diff --git a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp index 0e4b1167f5a9..2f61bd32aa82 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/IO/Polylines_io_plugin.cpp @@ -266,7 +266,7 @@ void Polyhedron_demo_polylines_io_plugin::split() scene->addItem(group); group->setColor(item->color()); int i=0; - Q_FOREACH(Scene_polylines_item::Polyline polyline, item->polylines) + for(Scene_polylines_item::Polyline polyline: item->polylines) { Scene_polylines_item::Polylines_container container; container.push_back(polyline); @@ -372,7 +372,7 @@ void Polyhedron_demo_polylines_io_plugin::join() Scene_polylines_item* new_polyline= new Scene_polylines_item(); Scene_polylines_item::Polylines_container container; - Q_FOREACH(Scene_polylines_item* item, items) + for(Scene_polylines_item* item: items) { for(Scene_polylines_item::Polylines_container::iterator it = item->polylines.begin(); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_surface_mesh_item.h b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_surface_mesh_item.h index 64d2cfe40a58..38ad5b0b124a 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_surface_mesh_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_aff_transformed_surface_mesh_item.h @@ -59,8 +59,8 @@ struct Scene_aff_transformed_surface_mesh_item_priv positions_lines.resize(0); for(auto e : edges(*sm_ptr)) { - const Point& a = get(vpm, target(halfedge(e, *sm_ptr), *sm_ptr)); - const Point& b = get(vpm, target(opposite(halfedge(e, *sm_ptr), *sm_ptr), *sm_ptr)); + const Point a = get(vpm, target(halfedge(e, *sm_ptr), *sm_ptr)); + const Point b = get(vpm, target(opposite(halfedge(e, *sm_ptr), *sm_ptr), *sm_ptr)); positions_lines.push_back(a.x() - center_.x); positions_lines.push_back(a.y() - center_.y); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index 6dea656ae705..0d1130e70dd5 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -938,7 +938,7 @@ void Scene_edit_box_item_priv::remodel_box(const QVector3D &dir) { CGAL::qglviewer::AxisPlaneConstraint::Type prev_cons = constraint.translationConstraintType(); constraint.setTranslationConstraintType(CGAL::qglviewer::AxisPlaneConstraint::FREE); - Q_FOREACH(Scene_edit_box_item::vertex* selected_vertex, selected_vertices ) + for(Scene_edit_box_item::vertex* selected_vertex: selected_vertices ) { int id = selected_vertex->id; CGAL_assume(id<8); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h index 8370faf5e352..46d4c02ac9d6 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Scene_facegraph_item_k_ring_selection.h @@ -623,7 +623,7 @@ public Q_SLOTS: CGAL::QGLViewer* viewer = getViewerUnderCursor(); is_ready_to_highlight = !cut_highlighting; - hl_pos = viewer->mapFromGlobal(mouse_event->globalPos()); + hl_pos = viewer->mapFromGlobal(mouse_event->globalPosition()).toPoint(); QTimer::singleShot(0, this, SLOT(highlight())); }//end MouseMove return false; diff --git a/Polyhedron/demo/Polyhedron/Primitive_container.cpp b/Polyhedron/demo/Polyhedron/Primitive_container.cpp index 6d7250f5763b..245d0059b9ca 100644 --- a/Polyhedron/demo/Polyhedron/Primitive_container.cpp +++ b/Polyhedron/demo/Polyhedron/Primitive_container.cpp @@ -43,10 +43,10 @@ Primitive_container::Primitive_container(int program, bool indexed) Primitive_container::~Primitive_container() { - Q_FOREACH(Vbo* vbo, d->VBOs) + for(Vbo* vbo: d->VBOs) if(vbo) delete vbo; - Q_FOREACH(CGAL::Three::Viewer_interface*viewer, d->VAOs.keys()) + for(CGAL::Three::Viewer_interface*viewer: d->VAOs.keys()) { removeViewer(viewer); } @@ -72,7 +72,7 @@ void Primitive_container::initializeBuffers(CGAL::Three::Viewer_interface* viewe return; viewer->makeCurrent(); d->VAOs[viewer]->bind(); - Q_FOREACH(CGAL::Three::Vbo* vbo, d->VAOs[viewer]->vbos) + for(CGAL::Three::Vbo* vbo: d->VAOs[viewer]->vbos) { vbo->bind(); if(vbo->dataSize !=0) @@ -136,7 +136,7 @@ void Primitive_container::removeViewer(CGAL::Three::Viewer_interface* viewer) void Primitive_container::reset_vbos(Scene_item_rendering_helper::Gl_data_names name) { - Q_FOREACH(CGAL::Three::Vbo* vbo, d->VBOs) + for(CGAL::Three::Vbo* vbo: d->VBOs) { if(!vbo) continue; diff --git a/Polyhedron/demo/Polyhedron/Scene_item_rendering_helper.cpp b/Polyhedron/demo/Polyhedron/Scene_item_rendering_helper.cpp index 27bb13524126..0af18b2450ce 100644 --- a/Polyhedron/demo/Polyhedron/Scene_item_rendering_helper.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_item_rendering_helper.cpp @@ -101,17 +101,17 @@ void Scene_item_rendering_helper::initGL(CGAL::Three::Viewer_interface* viewer) priv->alphaSlider->setValue(255); } - Q_FOREACH(Triangle_container* tc, priv->triangle_containers) + for(Triangle_container* tc: priv->triangle_containers) { if(!tc->isGLInit(viewer)) tc->initGL(viewer); } - Q_FOREACH(Edge_container* ec, priv->edge_containers) + for(Edge_container* ec: priv->edge_containers) { if(!ec->isGLInit(viewer)) ec->initGL(viewer); } - Q_FOREACH(Point_container* pc, priv->point_containers) + for(Point_container* pc: priv->point_containers) { if(!pc->isGLInit(viewer)) pc->initGL(viewer); @@ -255,15 +255,15 @@ void Scene_item_rendering_helper::setBuffersInit(Viewer_interface* viewer, bool void Scene_item_rendering_helper::removeViewer(Viewer_interface *viewer) { - Q_FOREACH(Triangle_container* tc, priv->triangle_containers) + for(Triangle_container* tc: priv->triangle_containers) { tc->removeViewer(viewer); } - Q_FOREACH(Edge_container* ec, priv->edge_containers) + for(Edge_container* ec: priv->edge_containers) { ec->removeViewer(viewer); } - Q_FOREACH(Point_container* pc, priv->point_containers) + for(Point_container* pc: priv->point_containers) { pc->removeViewer(viewer); } @@ -272,17 +272,17 @@ void Scene_item_rendering_helper::removeViewer(Viewer_interface *viewer) void Scene_item_rendering_helper::newViewer(Viewer_interface *viewer) { viewer->makeCurrent(); - Q_FOREACH(Triangle_container* tc, priv->triangle_containers) + for(Triangle_container* tc: priv->triangle_containers) { if(!tc->isGLInit(viewer)) tc->initGL(viewer); } - Q_FOREACH(Edge_container* ec, priv->edge_containers) + for(Edge_container* ec: priv->edge_containers) { if(!ec->isGLInit(viewer)) ec->initGL(viewer); } - Q_FOREACH(Point_container* pc, priv->point_containers) + for(Point_container* pc: priv->point_containers) { if(!pc->isGLInit(viewer)) pc->initGL(viewer); diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp index a6669cb35c18..b986582fa00c 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_selection_item.cpp @@ -345,7 +345,7 @@ void Scene_polyhedron_selection_item_priv::compute_any_elements(std::vectorpolylines = polylines; QVariant metadata_variant = property("polylines metadata"); - if(metadata_variant.type() == QVariant::StringList) + if(metadata_variant.typeId() == QMetaType::QStringList) { item->setProperty("polylines metadata", metadata_variant); } @@ -686,7 +686,7 @@ Scene_polylines_item::merge(Scene_polylines_item* other_item) { other_item->polylines.end(), std::back_inserter(polylines)); QVariant other_metadata_variant = other_item->property("polylines metadata"); - if(other_metadata_variant.type() == QVariant::StringList) + if(other_metadata_variant.typeId() == QMetaType::QStringList) { QStringList metadata = property("polylines metadata").toStringList(); metadata.append(other_metadata_variant.toStringList()); diff --git a/Polyhedron/demo/Polyhedron/include/id_printing.h b/Polyhedron/demo/Polyhedron/include/id_printing.h index 91be6e8f2246..2bf10a371c09 100644 --- a/Polyhedron/demo/Polyhedron/include/id_printing.h +++ b/Polyhedron/demo/Polyhedron/include/id_printing.h @@ -437,7 +437,6 @@ bool printVertexIds(const Mesh& mesh, TextListItem* vitems) { using Ppmap = typename boost::property_map::const_type; - using Point = typename boost::property_traits::value_type; using IDmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); @@ -452,7 +451,7 @@ bool printVertexIds(const Mesh& mesh, // fills textItems for(typename boost::graph_traits::vertex_descriptor vh : vertices(mesh)) { - const Point& p = get(ppmap, vh); + const auto p = get(ppmap, vh); vitems->append(new TextItem(float(p.x() + offset.x), float(p.y() + offset.y), float(p.z() + offset.z), @@ -479,7 +478,6 @@ bool printEdgeIds(const Mesh& mesh, TextListItem* eitems) { using Ppmap = typename boost::property_map::const_type; - using Point = typename boost::property_traits::value_type; using IDmap = typename boost::property_map::type; Ppmap ppmap = get(boost::vertex_point, mesh); @@ -493,8 +491,8 @@ bool printEdgeIds(const Mesh& mesh, for(typename boost::graph_traits::edge_descriptor e : edges(mesh)) { - const Point& p1 = get(ppmap, source(e, mesh)); - const Point& p2 = get(ppmap, target(e, mesh)); + const auto p1 = get(ppmap, source(e, mesh)); + const auto p2 = get(ppmap, target(e, mesh)); eitems->append(new TextItem(float((p1.x() + p2.x()) / 2 + offset.x), float((p1.y() + p2.y()) / 2 + offset.y), float((p1.z() + p2.z()) / 2 + offset.z), @@ -631,8 +629,8 @@ int zoomToId(const Mesh& mesh, if(get(eidmap, halfedge(e, mesh))/2 == id) { typename boost::graph_traits::halfedge_descriptor hf = halfedge(e, mesh); - const Point& p1 = get(ppmap, source(e, mesh)); - const Point& p2 = get(ppmap, target(e, mesh)); + const auto p1 = get(ppmap, source(e, mesh)); + const auto p2 = get(ppmap, target(e, mesh)); p = Point((float)(p1.x() + p2.x()) / 2 + offset.x, (float)(p1.y() + p2.y()) / 2 + offset.y, (float)(p1.z() + p2.z()) / 2 + offset.z ); From da0b65d7c9acf0b3842501e47a5c6c988dbbbb45 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 15:29:23 +0200 Subject: [PATCH 0659/1398] fix QSJ/C++ exceptions handling The javascript testsuite passes. --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 88 +++++-------------- Polyhedron/demo/Polyhedron/MainWindow.h | 3 + .../demo/Polyhedron/Polyhedron_demo.cpp | 4 +- Polyhedron/demo/Polyhedron/javascript/lib.js | 8 +- .../bad/catch_and_retrow_cpp_exception.js | 4 +- .../tests/good/catch_missing_file.js | 2 +- .../caught_cpp_exception_in_an_include.js | 4 +- .../javascript/tests/good/cpp_exception.js | 4 +- .../good/cpp_exception_from_a_function.js | 6 +- .../tests/good/cpp_exception_in_an_include.js | 4 +- Three/include/CGAL/Three/exceptions.h | 59 +++++-------- 11 files changed, 59 insertions(+), 127 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 02a6a8cf0791..5829ffb5e22c 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -85,30 +85,16 @@ void myScene_itemFromScriptValue(const QJSValue &object, out = qobject_cast(object.toQObject()); } - - -#if 0 -QJSValue myPrintFunction(QScriptContext *context, QJSEngine *engine) +void MainWindow::print(QString message) { - MainWindow* mw = qobject_cast(engine->parent()); - QString result; - for (int i = 0; i < context->argumentCount(); ++i) { - if (i > 0) - result.append(" "); - result.append(context->argument(i).toString()); - } - - if(mw) mw->message(QString("QtScript: ") + result, ""); - QTextStream (stdout) << (QString("QtScript: ") + result) << "\n"; - - return engine->undefinedValue(); + this->message(QString("Script message: ") + message, ""); + QTextStream (stdout) << (QString("Script message: ") + message) << "\n"; } -#endif inline QKeySequence combine(Qt::Modifier m, Qt::Key k) { - return QKeySequence(static_cast(m)+static_cast(k)); + return QKeySequence(QKeyCombination(m, k)); } MainWindow::~MainWindow() @@ -287,8 +273,8 @@ MainWindow::MainWindow(const QStringList &keywords, bool verbose, QWidget* paren // Reset the "Operation menu" clearMenu(ui->menuOperations); - std::cerr << "Enable scripts.\n"; script_engine = new QJSEngine(this); + script_engine->installExtensions(QJSEngine::ConsoleExtension); #if 0 qScriptRegisterMetaType(script_engine, @@ -473,42 +459,25 @@ void MainWindow::filterOperations(bool) void MainWindow::evaluate_script(QString script, const QString& filename, const bool quiet) { -#if 0 - QScriptContext* context = script_engine->currentContext(); - QJSValue object = context->activationObject(); + QJSValue object = script_engine->globalObject(); QJSValue former_current_filename = object.property("current_filename");; object.setProperty("current_filename", filename); -#endif - - QJSValue value = script_engine->evaluate(script, filename); - if (value.isError()) + QStringList error_bt; + QJSValue value = script_engine->evaluate(script, filename, 1, &error_bt); + if (!error_bt.isEmpty()) { if(! quiet){ - qDebug() << "Uncaught exception at line" - << value.property("lineNumber").toInt() - << ":" << value.toString(); - } -#if 0 - - if(script_engine->hasUncaughtException()) { - QJSValue js_exception = script_engine->uncaughtException(); - QJSValue js_bt =js_exception.property("backtrace"); - QStringList bt = script_engine->uncaughtExceptionBacktrace(); - if(js_bt.isValid()) { - QStringList other_bt; - qJSValueToSequence(js_bt, other_bt); - if(!other_bt.isEmpty()) bt = other_bt; - } - if(!quiet) { - QTextStream err(stderr); - err << "Qt Script exception:\n" - << js_exception.toString() + QString err_str; + QTextStream err(&err_str); + err << tr("Qt Script exception at %1:%2").arg(value.property("fileName").toString()) + .arg(value.property("lineNumber").toInt()) + << ":" << value.toString() << "\nBacktrace:\n"; - Q_FOREACH(QString line, bt) { + for(auto line: error_bt) { err << " " << line << "\n"; } + qWarning().noquote() << err_str; } - throw CGAL::Three::Script_exception - (script_engine->uncaughtException().toString(), bt); + throw CGAL::Three::Script_exception(value.toString(), error_bt); } else if(!quiet && !value.isNull() && !value.isUndefined()) { QTextStream(stderr) << "Qt Script evaluated to \"" @@ -516,7 +485,6 @@ void MainWindow::evaluate_script(QString script, } object.setProperty("current_filename", former_current_filename); -#endif } void MainWindow::evaluate_script_quiet(QString script, @@ -1193,7 +1161,6 @@ void MainWindow::open(QString filename) bool MainWindow::open(QString filename, QString loader_name) { QFileInfo fileinfo(filename); std::optional item_opt; -#if 0 // AF try { item_opt = wrap_a_call_to_cpp ([this, fileinfo, loader_name]() @@ -1210,11 +1177,7 @@ bool MainWindow::open(QString filename, QString loader_name) { std::cerr << e.what() << std::endl; return false; } -#else - bool ok; - loadItem(fileinfo, findLoader(loader_name), ok); - return ok; -#endif + return true; } @@ -1818,20 +1781,14 @@ void MainWindow::closeEvent(QCloseEvent *event) } -bool MainWindow::loadScript(QString filename) -{ -#if 0 +bool MainWindow::loadScript(QString filename){ QFileInfo fileinfo(filename); std::optional opt = wrap_a_call_to_cpp ([this, fileinfo] { return loadScript(fileinfo); - }, this, __FILE__, __LINE__, CGAL::Three::PARENT_CONTEXT); + }, this, __FILE__, __LINE__); if(!opt) return false; else return *opt; -#else - QFileInfo fileinfo(filename); - return loadScript(fileinfo); -#endif } bool MainWindow::loadScript(QFileInfo info) @@ -1858,15 +1815,10 @@ bool MainWindow::loadScript(QFileInfo info) void MainWindow::throw_exception() { -#if 0 // AF wrap_a_call_to_cpp([]() { throw std::runtime_error("Exception thrown in " "MainWindow::throw_exception()"); }, this, __FILE__, __LINE__); -#else - throw std::runtime_error("Exception thrown in " - "MainWindow::throw_exception()"); -#endif } void MainWindow::on_actionLoadScript_triggered() diff --git a/Polyhedron/demo/Polyhedron/MainWindow.h b/Polyhedron/demo/Polyhedron/MainWindow.h index b58fa02912fc..542cc40ea75d 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.h +++ b/Polyhedron/demo/Polyhedron/MainWindow.h @@ -256,6 +256,9 @@ public Q_SLOTS: void message(QString, QString, QString = QString("normal")); + //! Function `print` used by Javascript scripts. + void print(QString message); + //!Returns true if the target plugin is present. If not, returns false. bool hasPlugin(const QString&) const; diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp index 6348c203eab8..7b6e5225dfe3 100644 --- a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp +++ b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp @@ -129,10 +129,10 @@ Polyhedron_demo::Polyhedron_demo(int& argc, char **argv, } #endif - // mainWindow.loadScript(":/cgal/Polyhedron_3/javascript/lib.js"); + mainWindow.loadScript(":/cgal/Polyhedron_3/javascript/lib.js"); QFileInfo autostart_js("autostart.js"); if(!parser.isSet(no_autostart) && autostart_js.exists()) { - // mainWindow.loadScript(autostart_js); + mainWindow.loadScript(autostart_js); } Q_FOREACH(QString filename, parser.positionalArguments()) { mainWindow.open(filename); diff --git a/Polyhedron/demo/Polyhedron/javascript/lib.js b/Polyhedron/demo/Polyhedron/javascript/lib.js index bf3638484150..38b3fbba299f 100644 --- a/Polyhedron/demo/Polyhedron/javascript/lib.js +++ b/Polyhedron/demo/Polyhedron/javascript/lib.js @@ -12,11 +12,15 @@ print_backtrace = function(bt, prefix) { print_exception_and_bt = function(e) { print("Caught exception in " + current_filename + ": " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + if(typeof e.backtrace !== 'undefined') { +console.log("ICI") + print("Backtrace:") + print_backtrace(e.backtrace) + } } quit = main_window.quit +print = main_window.print noop = function () {} diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/bad/catch_and_retrow_cpp_exception.js b/Polyhedron/demo/Polyhedron/javascript/tests/bad/catch_and_retrow_cpp_exception.js index 6ae030b02204..7c745c672155 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/bad/catch_and_retrow_cpp_exception.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/bad/catch_and_retrow_cpp_exception.js @@ -9,9 +9,7 @@ f = function() { try { f() } catch(e) { - print("Caught exception in catch_and_retrow_cpp_exception.js:\n " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + print_exception_and_bt(e) print("Rethrow the exception...") throw e } diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/good/catch_missing_file.js b/Polyhedron/demo/Polyhedron/javascript/tests/good/catch_missing_file.js index 7d947404ea08..a24acf986753 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/good/catch_missing_file.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/good/catch_missing_file.js @@ -8,5 +8,5 @@ try { throw "Wrong exception!" good = true } -if(!good) throw "The exception was not caugth!" +if(!good) throw "The exception was not caught!" print("OK in catch_missing_file") diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/good/caught_cpp_exception_in_an_include.js b/Polyhedron/demo/Polyhedron/javascript/tests/good/caught_cpp_exception_in_an_include.js index 628a9d9ff31f..1cdc6b35d997 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/good/caught_cpp_exception_in_an_include.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/good/caught_cpp_exception_in_an_include.js @@ -2,9 +2,7 @@ var good = false try { include("../bad/catch_and_retrow_cpp_exception.js") } catch(e) { - print("Caught exception in caught_cpp_exception_in_an_include.js:\n " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + print_exception_and_bt(e) if(!e.toString().match(/Exception thrown in MainWindow::throw_exception/)) throw "Wrong exception!" good = true diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception.js b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception.js index df91fa781464..43204ff0e465 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception.js @@ -2,9 +2,7 @@ var good = false try { main_window.throw_exception() } catch(e) { - print("Exception caught in cpp_exception.js: " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + print_exception_and_bt(e) if(!e.toString().match(/Exception thrown in MainWindow::throw_exception/)) throw "Wrong exception!" good = true diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_from_a_function.js b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_from_a_function.js index 4b889937ef3c..cde7f159e84a 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_from_a_function.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_from_a_function.js @@ -6,13 +6,11 @@ function throw_cpp_exception() { try { throw_cpp_exception() } catch(e) { - print("Exception caught in cpp_exception_from_a_function.js: " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + print_exception_and_bt(e) if(!e.toString().match(/Exception thrown in MainWindow::throw_exception/)) throw "Wrong exception!" good = true } -if(!good) throw "The exception was not caugth!" +if(!good) throw "The exception was not caught!" print("OK at the end of cpp_exception.js") diff --git a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_in_an_include.js b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_in_an_include.js index 3e61637989fd..507583abf0c0 100644 --- a/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_in_an_include.js +++ b/Polyhedron/demo/Polyhedron/javascript/tests/good/cpp_exception_in_an_include.js @@ -2,9 +2,7 @@ var good = false try { include("../bad/uncaught_cpp_exception.js") } catch(e) { - print("Exception caught in cpp_exception_in_an_include.js: " + e) - print("Backtrace:") - print_backtrace(e.backtrace) + print_exception_and_bt(e) if(!e.toString().match(/Exception thrown in MainWindow::throw_exception/)) throw "Wrong exception!" good = true diff --git a/Three/include/CGAL/Three/exceptions.h b/Three/include/CGAL/Three/exceptions.h index 6953e16885db..927489b4f203 100644 --- a/Three/include/CGAL/Three/exceptions.h +++ b/Three/include/CGAL/Three/exceptions.h @@ -58,9 +58,6 @@ struct Optional_or_bool { static type invoke(Callable f) { f(); return true; } }; -enum Context { CURRENT_CONTEXT, PARENT_CONTEXT }; - -#if 1 // AF @todo scripting has changed /// This function template wraps a `Callable` that can be called without /// any argument (such as a lambda expression without arguments), and in /// case the function call is in a Qt Script context, wraps the call in a @@ -70,40 +67,34 @@ enum Context { CURRENT_CONTEXT, PARENT_CONTEXT }; template typename Optional_or_bool::type>::type wrap_a_call_to_cpp(Callable f, - // QScriptable* qs = 0, + QObject* object = 0, const char* file = 0, - int line = -1, - Context c = CURRENT_CONTEXT) { - typedef typename cpp11::result_of::type Callable_RT; + int line = -1) { + typedef decltype(f()) Callable_RT; typedef Optional_or_bool O_r_b; - typedef typename O_r_b::type Return_type; - + QJSEngine* script_engine = qjsEngine(object); const bool no_try_catch = qApp->property("no-try-catch").toBool(); - if(no_try_catch /* || qs == 0 || !qs->context() */ ) return O_r_b::invoke(f); + if(no_try_catch || script_engine == 0) return O_r_b::invoke(f); else try { return O_r_b::invoke(f); } catch(const std::exception& e) { -#if 0 const Script_exception* se = dynamic_cast(&e); - QScriptContext* context = qs->context(); - QStringList qt_bt = context->backtrace(); - if(se) qt_bt = se->backtrace(); - std::cerr << "Backtrace:\n"; - Q_FOREACH(QString s, qt_bt) - { - std::cerr << " " << qPrintable(s) << std::endl; + QStringList qt_bt; + if(se) { + qt_bt = se->backtrace(); + if(qt_bt.size() != 0) std::cerr << "Backtrace:\n"; } - context = context->parentContext(); - if(c == PARENT_CONTEXT) { - std::cerr << "> parent"; - context = context->parentContext(); - } else { - std::cerr << "> current"; + QJSValue js_bt = script_engine->newArray(qt_bt.size()); + if(qt_bt.size() != 0) { + quint32 i = 0; + for(auto s: qt_bt) + { + std::cerr << " " << qPrintable(s) << std::endl; + js_bt.setProperty(i++, s); + } } - std::cerr << " context: " - << qPrintable(context->toString()) << std::endl; QString error; if(se) { error = se->what(); @@ -112,22 +103,14 @@ wrap_a_call_to_cpp(Callable f, QString context; if(file != 0) context += QObject::tr(" at file %1").arg(file); if(line != -1) context += QString(":%1").arg(line); - if(!context.isNull()) { - error += context; - qt_bt.push_front(QObject::tr("") + context); - } error += QString(": %1").arg(e.what()); } - QScriptValue v = context->throwError(error); - v.setProperty("backtrace", - qScriptValueFromSequence(context->engine(), qt_bt)); - std::cerr << "result after throwError: " - << qPrintable(v.toString()) << std::endl; -#endif - return Return_type(); + QJSValue error_value = script_engine->newErrorObject(QJSValue::GenericError, error); + error_value.setProperty("backtrace", js_bt); + script_engine->throwError(error_value); + return {}; } } -#endif } // end namespace Three } // end namespace CGAL From a12a0fafa9a7d9f716874c0d910b74ab2aa2dd0c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 15:29:47 +0200 Subject: [PATCH 0660/1398] TBB is a SYSTEM library --- Installation/cmake/modules/CGAL_TBB_support.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Installation/cmake/modules/CGAL_TBB_support.cmake b/Installation/cmake/modules/CGAL_TBB_support.cmake index 372f3208578a..8a99682f0fe7 100644 --- a/Installation/cmake/modules/CGAL_TBB_support.cmake +++ b/Installation/cmake/modules/CGAL_TBB_support.cmake @@ -7,4 +7,7 @@ if(TBB_FOUND AND NOT TARGET CGAL::TBB_support) INTERFACE_COMPILE_DEFINITIONS "CGAL_LINKED_WITH_TBB;NOMINMAX" INTERFACE_INCLUDE_DIRECTORIES "${TBB_INCLUDE_DIRS}" INTERFACE_LINK_LIBRARIES "TBB::tbb;TBB::tbbmalloc;Threads::Threads") + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.25) + set_target_properties(CGAL::TBB_support PROPERTIES SYSTEM TRUE) + endif() endif() From 9f68b1a0bed10e502a281adb71dfd480f2972880 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 15:29:47 +0200 Subject: [PATCH 0661/1398] TBB is a SYSTEM library, and CGAL::CGAL is not --- Installation/lib/cmake/CGAL/CGALConfig.cmake | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index 6bc023bdf65d..abd23a6e7fe0 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -124,7 +124,9 @@ include(${CGAL_MODULES_DIR}/CGAL_target_use_TBB.cmake) if( CGAL_DEV_MODE OR RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE ) # Do not use -isystem for CGAL include paths - set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE) + if(CMAKE_VERSION VERSION_LESS 3.25) + set(CMAKE_NO_SYSTEM_FROM_IMPORTED TRUE) + endif() endif() foreach(comp ${CGAL_FIND_COMPONENTS}) @@ -179,6 +181,12 @@ foreach(cgal_lib ${CGAL_LIBRARIES}) set(WITH_${cgal_lib} TRUE) if(${cgal_lib}_FOUND AND NOT TARGET ${cgal_lib}) add_library(${cgal_lib} INTERFACE IMPORTED GLOBAL) + if( CGAL_DEV_MODE OR RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE ) + # Do not use -isystem for CGAL include paths + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.25) + set_target_properties(${cgal_lib} PROPERTIES SYSTEM FALSE) + endif() + endif() if(NOT TARGET CGAL::${cgal_lib}) add_library(CGAL::${cgal_lib} ALIAS ${cgal_lib}) endif() From d8583c93d59b054c8dcc5278a183b88c1c102305 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 16:47:12 +0200 Subject: [PATCH 0662/1398] replace deprecated QMatrix4x4*QVector3D by map --- .../Plugins/PCA/Affine_transform_plugin.cpp | 18 +++++++++--------- .../Polyhedron/Plugins/PMP/Extrude_plugin.cpp | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp index 1061b04536ba..d9fbc5a094b4 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Affine_transform_plugin.cpp @@ -616,9 +616,9 @@ endPointSet(const QMatrix4x4& transform_matrix) for(Point_set::Index idx : *new_ps) { - QVector3D vec = transform_matrix * QVector3D(new_ps->point(idx).x() - c.x, - new_ps->point(idx).y() - c.y, - new_ps->point(idx).z() - c.z); + QVector3D vec = transform_matrix.map(QVector3D(new_ps->point(idx).x() - c.x, + new_ps->point(idx).y() - c.y, + new_ps->point(idx).z() - c.z)); new_ps->point(idx) = Kernel::Point_3(vec.x(), vec.y(), vec.z()); } @@ -643,9 +643,9 @@ endPolygonSoup(const QMatrix4x4& transform_matrix) for(Point_3& p : new_points) { - QVector3D vec = transform_matrix * QVector3D(p.x() - c.x, - p.y() - c.y, - p.z() - c.z); + QVector3D vec = transform_matrix.map(QVector3D(p.x() - c.x, + p.y() - c.y, + p.z() - c.z)); p = Kernel::Point_3(vec.x(), vec.y(), vec.z()); } @@ -670,9 +670,9 @@ endPolygonMesh(const QMatrix4x4& transform_matrix) const CGAL::qglviewer::Vec& c = aff_transformed_item->center(); auto transformation = [&c, &transform_matrix](const Kernel::Point_3& p) -> Kernel::Point_3 { - QVector3D vec = transform_matrix * QVector3D(p.x() - c.x, - p.y() - c.y, - p.z() - c.z); + QVector3D vec = transform_matrix.map(QVector3D(p.x() - c.x, + p.y() - c.y, + p.z() - c.z)); return { vec.x(), vec.y(), vec.z() }; }; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp index caea10065a9c..da2089147d30 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Extrude_plugin.cpp @@ -447,7 +447,7 @@ private Q_SLOTS: transform_matrix.data()[i] = (float)matrix[i]; rotate_matrix = transform_matrix; rotate_matrix.setColumn(3, QVector4D(0,0,0,1)); - QVector3D dir = rotate_matrix * QVector3D(0,1,0); + QVector3D dir = rotate_matrix.map(QVector3D(0,1,0)); dir.normalize(); dir = length * dir; From dc7f6af55d1c6840d2ae72384a3f5c9dc7a21336 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 16:47:40 +0200 Subject: [PATCH 0663/1398] check that we have an exact match (whole string) --- Polyhedron/demo/Polyhedron/Scene_plane_item.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp b/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp index ba455ac0cc22..f2175e4271b0 100644 --- a/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_plane_item.cpp @@ -329,13 +329,13 @@ void Scene_plane_item::setPlaneOrientation() if(!ok) return; - match = rx.match(eq); // AF: exact? - // does_match = rx.exactMatch(eq); - if(! match.hasMatch()) + match = rx.match(eq); + does_match = match.hasMatch() && match.capturedLength(0) == eq.size(); + if(!does_match) { QMessageBox::warning(CGAL::Three::Three::mainWindow(),"Error","The input must be of the form a*x+b*y+c*z+d=0"); } - }while(! match.hasMatch()); + }while(!does_match); double a(match.captured(1).toDouble()), b(match.captured(2).toDouble()), c(match.captured(3).toDouble()), d(match.captured(4).toDouble()); Kernel_epic::Point_3 sure_point(0,0,0); From f9c213735bb6e157a60442590cb263a7fbad397b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 17:53:32 +0200 Subject: [PATCH 0664/1398] last deprecation warning in a full build of demo/Polyhedron --- .../Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp index 724ed194fc51..3e94a0adea31 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/Edit_polyhedron_plugin.cpp @@ -116,7 +116,7 @@ void Polyhedron_demo_edit_polyhedron_plugin::init(QMainWindow* mainWindow, CGAL: actionDeformation->setObjectName("actionDeformation"); actionDeformation->setShortcutContext(Qt::ApplicationShortcut); autoConnectActions(); - e_shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_E), mw); + e_shortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_E), mw); connect(e_shortcut, &QShortcut::activated, this, &Polyhedron_demo_edit_polyhedron_plugin::dispatchAction); connect(e_shortcut, &QShortcut::activatedAmbiguously, this, &Polyhedron_demo_edit_polyhedron_plugin::dispatchAction); From abb9080102af1f6d2cbbb642820bafda2aa98a7c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 18:19:53 +0200 Subject: [PATCH 0665/1398] cleanup demo/AABB_tree --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 28 ++----------------- AABB_tree/demo/AABB_tree/MainWindow.cpp | 24 +--------------- AABB_tree/demo/AABB_tree/MainWindow.h | 37 ------------------------- AABB_tree/demo/AABB_tree/Scene.h | 2 -- AABB_tree/demo/AABB_tree/Viewer.cpp | 3 -- AABB_tree/demo/AABB_tree/init.js | 2 -- 6 files changed, 3 insertions(+), 93 deletions(-) delete mode 100644 AABB_tree/demo/AABB_tree/init.js diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index f455cae3f06a..b66e3f468771 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -8,52 +8,28 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - -# Include this package's headers first -include_directories(BEFORE ./ ./include) # Find CGAL and CGAL Qt6 find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Widgets OpenGL Qml) +find_package(Qt6 QUIET COMPONENTS Gui) if(CGAL_Qt6_FOUND AND Qt6_FOUND) qt6_wrap_ui(UI_FILES MainWindow.ui) - include(AddFileDependencies) - qt6_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") - add_file_dependencies(MainWindow_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h") - qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") - add_file_dependencies(Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h") - qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") - add_file_dependencies(Scene_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Scene.h") qt6_add_resources(CGAL_Qt6_RESOURCE_FILES AABB_demo.qrc) - add_file_dependencies( - AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" - "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp" - "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") - add_executable( AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} - #${CGAL_Qt6_MOC_FILES} ) # Link with Qt libraries - target_link_libraries(AABB_demo PRIVATE Qt6::OpenGLWidgets Qt6::Widgets Qt6::OpenGL Qt6::Qml + target_link_libraries(AABB_demo PRIVATE Qt6::Gui CGAL::CGAL CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo) diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index cd1444b9968c..63e4a0fe5965 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -13,10 +13,8 @@ #include "ui_MainWindow.h" - - MainWindow::MainWindow(QWidget* parent) - : CGAL::Qt::DemosMainWindow(parent), myEngine(new QJSEngine(this)) + : CGAL::Qt::DemosMainWindow(parent) { ui = new Ui::MainWindow; ui->setupUi(this); @@ -40,25 +38,12 @@ MainWindow::MainWindow(QWidget* parent) connect(this, SIGNAL(openRecentFile(QString)), this, SLOT(open(QString))); - QJSValue mainWindow = myEngine->newQObject(this); - myEngine->globalObject().setProperty("main_window", mainWindow); readSettings(); - std::ifstream script("init.js"); - if(script.good()){ - std::string line; - while(getline(script, line)){ - myEngine->evaluate(line.c_str()); - } - } } MainWindow::~MainWindow() { m_pViewer->makeCurrent(); - // AF I thought this helps to avoid the exception when the program - // terminates, but it does not - myEngine->globalObject().setProperty("main_window", QJSValue()); - myEngine->collectGarbage(); delete ui; } @@ -80,13 +65,6 @@ void MainWindow::dropEvent(QDropEvent *event) event->acceptProposedAction(); } - -void MainWindow::hello() const -{ - std::cout << "Hhello world" << std::endl; -} - - void MainWindow::updateViewerBBox() { m_pScene->update_bbox(); diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index 87f6de0c76c9..d220dec44003 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -1,8 +1,6 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include -#include #include class QDragEnterEvent; @@ -13,38 +11,6 @@ namespace Ui { class MainWindow; } -#if 0 - -struct Foo : public QObject -{ - - Q_OBJECT -public: - QJSEngine* myEngine; - - Foo() - : myEngine(new QJSEngine(this)) - { - QJSValue baz = myEngine->newQObject(this); - myEngine->.globalObject().setProperty("baz", baz); - } - - void bar() - { - std::cout << "bar()" << std::endl; - myEngine->evaluate("baz.hello()"); - } - -public slots: - void hello() const // if not a slot it must be - { - std::cout << "called hello()" << std::endl; - } - -}; -#endif - - class MainWindow : public CGAL::Qt::DemosMainWindow { @@ -54,8 +20,6 @@ class MainWindow : ~MainWindow(); public slots: - - void hello() const; void updateViewerBBox(); void open(QString filename); void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers); @@ -113,7 +77,6 @@ class MainWindow : void on_actionView_cutting_plane_triggered(); private: - QJSEngine* myEngine; Scene* m_pScene; Viewer* m_pViewer; Ui::MainWindow* ui; diff --git a/AABB_tree/demo/AABB_tree/Scene.h b/AABB_tree/demo/AABB_tree/Scene.h index cc109a433fdf..74309b25ef35 100644 --- a/AABB_tree/demo/AABB_tree/Scene.h +++ b/AABB_tree/demo/AABB_tree/Scene.h @@ -1,7 +1,6 @@ #ifndef SCENE_H #define SCENE_H -#include #include #include @@ -77,7 +76,6 @@ class Scene : public QObject }; public: - QOpenGLContext* context; void draw(CGAL::QGLViewer*); void update_bbox(); Bbox bbox() { return m_bbox; } diff --git a/AABB_tree/demo/AABB_tree/Viewer.cpp b/AABB_tree/demo/AABB_tree/Viewer.cpp index 6f5eac006797..9e5cf22bdb74 100644 --- a/AABB_tree/demo/AABB_tree/Viewer.cpp +++ b/AABB_tree/demo/AABB_tree/Viewer.cpp @@ -1,9 +1,6 @@ #include "Viewer.h" #include "Scene.h" #include -#include -#include - Viewer::Viewer(QWidget* parent) : CGAL::QGLViewer(parent), m_pScene(nullptr), diff --git a/AABB_tree/demo/AABB_tree/init.js b/AABB_tree/demo/AABB_tree/init.js deleted file mode 100644 index e7f08e266c68..000000000000 --- a/AABB_tree/demo/AABB_tree/init.js +++ /dev/null @@ -1,2 +0,0 @@ -main_window.hello(); -main_window.hello(); From 3869a4a6c3a9b38431a8aabba1a49575fdb36c80 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 24 Aug 2023 18:41:03 +0200 Subject: [PATCH 0666/1398] cleanup Alpha_sphare_3 demo --- AABB_tree/demo/AABB_tree/CMakeLists.txt | 8 ++------ .../demo/Alpha_shapes_3/CMakeLists.txt | 19 ++++--------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index b66e3f468771..7411a48f67e0 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -13,23 +13,19 @@ set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Gui) +find_package(Qt6 QUIET COMPONENTS Gui OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) qt6_wrap_ui(UI_FILES MainWindow.ui) - qt6_generate_moc("MainWindow.h" "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") - qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") - qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp") - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES AABB_demo.qrc) add_executable( AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} ) # Link with Qt libraries - target_link_libraries(AABB_demo PRIVATE Qt6::Gui + target_link_libraries(AABB_demo PRIVATE Qt6::Gui Qt6::OpenGL CGAL::CGAL CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS AABB_demo) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index 6f08193da63f..65b4e7febfea 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -9,38 +9,27 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGL OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) - # include(${QT_USE_FILE}) - include_directories(BEFORE ./) - # ui file, created with Qt Designer qt6_wrap_ui(uis MainWindow.ui) # qrc files (resources files, that contain icons, at least) qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Alpha_shape_3.qrc) - add_executable( - Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp ${uis} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + add_executable(Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp ${uis}) + add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shape_3) target_link_libraries(Alpha_shape_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 - Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets) + Qt6::Widgets Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Alpha_shape_3) From df06d29dd1efa1eb1c1aea1c6344541f20b7e608 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 25 Aug 2023 11:33:28 +0200 Subject: [PATCH 0667/1398] fix/cleanup AABB_tree and Alpha_shape_3 demos --- AABB_tree/demo/AABB_tree/AABB_demo.cpp | 9 - AABB_tree/demo/AABB_tree/CMakeLists.txt | 15 +- AABB_tree/demo/AABB_tree/MainWindow.cpp | 4 + AABB_tree/demo/AABB_tree/MainWindow.h | 4 +- AABB_tree/demo/AABB_tree/Scene.h | 4 +- AABB_tree/demo/AABB_tree/benchmarks.cpp | 1 + .../demo/Alpha_shapes_3/CMakeLists.txt | 15 +- .../demo/Alpha_shapes_3/data/README | 14 + .../demo/Alpha_shapes_3/data/bunny1000.pts | 1001 + .../demo/Alpha_shapes_3/data/bunny5000.pts | 35948 ++++++++++++++++ .../demo/Alpha_shapes_3/data/bunny_ran.pts | 35948 ++++++++++++++++ .../demo/Alpha_shapes_3/data/cube_ran.pts | 582 + Alpha_shapes_3/demo/Alpha_shapes_3/data/fin | 8 + Alpha_shapes_3/demo/Alpha_shapes_3/data/fout | 17 + .../demo/Alpha_shapes_3/data/head_ran.pts | 857 + .../demo/Alpha_shapes_3/data/skull.pts | 27088 ++++++++++++ .../demo/Alpha_shapes_3/data/thom1249.pts | 1249 + .../demo/Alpha_shapes_3/data/thom384.pts | 384 + .../demo/Alpha_shapes_3/data/torus_ran.pts | 500 + 19 files changed, 103619 insertions(+), 29 deletions(-) create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/README create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny1000.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny5000.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny_ran.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/cube_ran.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/fin create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/fout create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/head_ran.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/skull.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/thom1249.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/thom384.pts create mode 100644 Alpha_shapes_3/demo/Alpha_shapes_3/data/torus_ran.pts diff --git a/AABB_tree/demo/AABB_tree/AABB_demo.cpp b/AABB_tree/demo/AABB_tree/AABB_demo.cpp index 018e0f69c14d..9727327004f0 100644 --- a/AABB_tree/demo/AABB_tree/AABB_demo.cpp +++ b/AABB_tree/demo/AABB_tree/AABB_demo.cpp @@ -49,12 +49,3 @@ int main(int argc, char **argv) return app.exec(); } - -# include "Scene.cpp" -# include "Scene_moc.cpp" -# include "benchmarks.cpp" -# include "Viewer.cpp" -# include "Viewer_moc.cpp" -# include "MainWindow.cpp" -# include "MainWindow_moc.cpp" - diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index 7411a48f67e0..46b13f3b1c66 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -6,9 +6,6 @@ project(AABB_tree_Demo) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) - # Find CGAL and CGAL Qt6 find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) @@ -17,12 +14,16 @@ find_package(Qt6 QUIET COMPONENTS Gui OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - qt6_wrap_ui(UI_FILES MainWindow.ui) + add_definitions(-DQT_NO_KEYWORDS) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES AABB_demo.qrc) + # Instruct CMake to run moc/ui/rcc automatically when needed. + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - add_executable( - AABB_demo AABB_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} + qt_add_executable( + AABB_demo AABB_demo.cpp Scene.cpp benchmarks.cpp Viewer.cpp MainWindow.cpp + MainWindow.ui AABB_demo.qrc ) # Link with Qt libraries target_link_libraries(AABB_demo PRIVATE Qt6::Gui Qt6::OpenGL diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index 63e4a0fe5965..1c68338bcf44 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "ui_MainWindow.h" @@ -19,6 +20,9 @@ MainWindow::MainWindow(QWidget* parent) ui = new Ui::MainWindow; ui->setupUi(this); + this->addAboutDemo(":/cgal/AABB_demo/about.html"); + this->addAboutCGAL(); + // saves some pointers from ui, for latter use. m_pViewer = ui->viewer; diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index d220dec44003..3138efd4202a 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -19,12 +19,12 @@ class MainWindow : MainWindow(QWidget* parent = nullptr); ~MainWindow(); - public slots: + public Q_SLOTS: void updateViewerBBox(); void open(QString filename); void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers); - protected slots: + protected Q_SLOTS: // settings void quit(); diff --git a/AABB_tree/demo/AABB_tree/Scene.h b/AABB_tree/demo/AABB_tree/Scene.h index 74309b25ef35..ae898f43daa4 100644 --- a/AABB_tree/demo/AABB_tree/Scene.h +++ b/AABB_tree/demo/AABB_tree/Scene.h @@ -171,7 +171,7 @@ class Scene : public QObject void attrib_buffers(CGAL::QGLViewer*); void compile_shaders(); void compute_texture(int, int, Color_ramp, Color_ramp); -private slots: +private Q_SLOTS: void updateCutPlane(); public: @@ -253,7 +253,7 @@ private slots: -public slots: +public Q_SLOTS: // cutting plane void cutting_plane(bool override = false); void changed(); diff --git a/AABB_tree/demo/AABB_tree/benchmarks.cpp b/AABB_tree/demo/AABB_tree/benchmarks.cpp index c337e43efe76..1b68d80bcde0 100644 --- a/AABB_tree/demo/AABB_tree/benchmarks.cpp +++ b/AABB_tree/demo/AABB_tree/benchmarks.cpp @@ -1,4 +1,5 @@ #include "Scene.h" +#include "Refiner.h" #include #include diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt index 65b4e7febfea..7c3b54b8424b 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/CMakeLists.txt @@ -7,9 +7,6 @@ project(Alpha_shapes_3_Demo) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) @@ -18,13 +15,13 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) - # ui file, created with Qt Designer - qt6_wrap_ui(uis MainWindow.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Alpha_shape_3.qrc) + # Instruct CMake to run moc/ui/rcc automatically when needed. + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - add_executable(Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp ${uis}) + qt_add_executable(Alpha_shape_3 Alpha_shape_3.cpp MainWindow.cpp Viewer.cpp + MainWindow.ui Alpha_shape_3.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shape_3) diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/README b/Alpha_shapes_3/demo/Alpha_shapes_3/data/README new file mode 100644 index 000000000000..74384edcd03d --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/README @@ -0,0 +1,14 @@ +The purpose of this repository is to make some range data +and detailed reconstructions available to the public. Currently, this repository only contains models that were scanned and reconstructed +at the Stanford Computer Graphics Laboratory . In the future, we hope to include data sets and reconstructions from other sources. + +The models in this repository were all scanned with a Cyberware 3030MS optical triangulation scanner. +Please acknowledge .... + +http://www-graphics.stanford.edu/data/3Dscanrep/ +e-mail: 3Dscanrep@graphics.stanford.edu +file://www-graphics.stanford.edu/pub/zippack/data/ + +http://www.hs.washington.edu/locke/vislab/ +http://biocomp.arc.nasa.gov/3dreconstruction/data/ +medical data \ No newline at end of file diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny1000.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny1000.pts new file mode 100644 index 000000000000..ff22c3612dd9 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny1000.pts @@ -0,0 +1,1001 @@ +1000 +-0.0164722 0.0382453 0.0209318 +-0.0641407 0.171114 -0.0471776 +0.023086 0.119339 0.0317977 +0.00506037 0.0347021 0.0393176 +-0.066143 0.143958 0.0413147 +-0.0445017 0.163753 0.00542301 +-0.0689729 0.181022 -0.0546459 +-0.0931085 0.131006 0.0192314 +0.000506827 0.0489752 0.0512269 +-0.0615935 0.160001 -0.0315914 +-0.0245032 0.0960169 0.0442753 +-0.0258992 0.0891655 0.049535 +-0.000499367 0.0456802 0.0470389 +-0.0171808 0.0654583 0.0528522 +0.00116916 0.131228 0.00582139 +-0.0356565 0.122935 -0.00798984 +-0.0701892 0.156285 0.021569 +-0.0173569 0.038443 0.0259817 +-0.0716413 0.0763478 -0.0132577 +0.0528545 0.0568172 0.0288563 +-0.0325067 0.0732308 0.0407775 +-0.0760686 0.150008 -0.00987485 +-0.030561 0.0774145 0.0410957 +-0.0833901 0.0762729 0.00451303 +-0.000492618 0.0925258 0.0556594 +-0.0358778 0.159506 0.00240863 +0.0115111 0.114076 0.0384616 +-0.0877889 0.0887187 0.00347532 +-0.0261028 0.115949 -0.0147279 +-0.0682913 0.165205 -0.0539869 +-0.0225512 0.0933694 -0.0331106 +-0.0538783 0.0999149 -0.0214389 +0.0435587 0.0959151 0.0211557 +-0.0167991 0.0388632 -0.0107644 +-0.0569142 0.0548839 0.00364185 +0.00749229 0.091015 0.0542708 +-0.065316 0.0625169 -0.002419 +-0.00749647 0.119689 0.0375376 +-0.0772165 0.0934484 -0.0125951 +-0.029008 0.0478606 -0.0250513 +0.00934189 0.0553527 -0.0303034 +-0.0578677 0.104042 -0.0186102 +0.0405495 0.0999198 -0.00379356 +-0.0894314 0.137929 0.0371779 +0.00710731 0.126603 -0.00643182 +0.058913 0.070492 0.0108657 +-0.0922485 0.120133 0.0292903 +0.0395325 0.105566 0.0221621 +-0.0376065 0.0365426 0.0444186 +-0.0550158 0.128128 -0.00563226 +-0.0561672 0.0336533 0.0186553 +0.0123436 0.0351165 0.0296251 +-0.0899184 0.131005 0.0413145 +0.0065365 0.100373 0.0469448 +-0.0502879 0.133796 0.0278403 +-0.0716838 0.0351362 0.00880221 +0.0579126 0.0523842 0.0101848 +-0.0639212 0.154791 0.00385831 +-0.0654795 0.0384216 -0.00684663 +-0.0615513 0.0624603 0.0259481 +-0.0368013 0.0842007 -0.0223672 +0.0522757 0.0574291 -0.0035048 +-0.0764972 0.123179 0.0527664 +0.0302998 0.0694384 -0.019812 +-0.0334269 0.0486094 0.0413091 +-0.00450651 0.0689184 0.0565193 +0.0425976 0.0887597 -0.00680771 +-0.0707351 0.156208 0.0228366 +0.0548799 0.0492406 0.0202107 +-0.00962948 0.168316 -0.023669 +-0.0313363 0.11605 -0.0148117 +-0.0225249 0.125571 0.0012278 +0.0122871 0.124953 0.0313975 +-0.0343047 0.125361 0.0205265 +-0.038499 0.0747376 0.0420783 +0.0292349 0.0759579 -0.0220376 +-0.0255784 0.0477093 -0.0263526 +-0.0750958 0.151313 -0.0258791 +0.0057743 0.0347896 0.0375885 +-0.0926124 0.120126 0.0272917 +-0.0366664 0.175138 -0.00407486 +-0.00549337 0.088417 0.0570387 +-0.0711473 0.17507 -0.0540267 +-0.0776118 0.0739521 0.0284675 +0.0376746 0.104662 0.0282621 +-0.0634881 0.121359 0.0469409 +0.0233296 0.0564006 -0.0254415 +-0.0399361 0.123254 0.0259269 +-0.000577398 0.0341134 -0.0181551 +-0.000496894 0.0520342 0.0541515 +-0.0701023 0.177167 -0.0478719 +-0.0641167 0.143926 0.0389732 +-0.0679369 0.165269 -0.0197719 +-0.0681029 0.138305 0.0455026 +-0.00280426 0.0384802 0.0198949 +-0.0628273 0.0924874 -0.0189476 +0.0084946 0.0869435 0.0558386 +0.00910286 0.0348066 0.0183719 +-0.0195983 0.126231 0.0213862 +-0.0584949 0.143878 0.0330085 +-0.0218343 0.0553077 0.0451067 +-0.0645685 0.147457 -0.0230581 +0.0426227 0.0691122 -0.00279622 +-0.035813 0.0842739 -0.0225525 +-0.0819685 0.0791215 0.0284136 +0.0328852 0.113087 -0.00384394 +-0.0677123 0.168615 -0.0283035 +-0.0556635 0.140996 0.0299986 +-0.0764958 0.131682 0.0526442 +0.0421796 0.0832522 0.0293553 +-0.0848653 0.0855483 0.0264341 +-0.0329445 0.121338 0.0269922 +-0.0320197 0.058187 -0.0133973 +-0.0322785 0.0421631 -0.0296986 +0.0401757 0.067497 -0.00878165 +-0.0904989 0.148452 0.0245146 +-0.00947974 0.0561444 0.0530127 +-0.0310333 0.0383692 -0.000250742 +-0.0780713 0.150403 0.0367551 +-0.0872126 0.146051 0.00824907 +-0.0735722 0.148626 -0.0268487 +-0.00548676 0.116904 0.0394711 +-0.0599006 0.132533 0.037981 +-0.093479 0.129659 0.0212406 +-0.0639063 0.120904 -0.00875525 +-0.028606 0.0356961 0.0524615 +-0.0652024 0.153998 -0.041972 +-0.0262134 0.0765572 0.0473962 +-0.0774721 0.155387 0.0234212 +-0.0628707 0.0345025 0.0358026 +0.0434964 0.0555926 0.0322399 +-0.0618022 0.142496 0.0370478 +-0.0638273 0.0910291 -0.0188305 +-0.0636286 0.0672101 0.0337087 +-0.0842132 0.092522 0.0298256 +0.0185123 0.115397 0.0365584 +-0.0666269 0.131204 0.0458398 +-0.0653475 0.165775 -0.0260007 +-0.0182573 0.181629 -0.0177335 +-0.0142757 0.185348 -0.0257883 +0.0485082 0.0624718 0.0300814 +-0.0254927 0.0974122 0.0441083 +-0.0446561 0.0349999 0.0427486 +-0.0616719 0.0410515 0.0160296 +-0.0179307 0.0931593 -0.0348763 +-0.00828798 0.130102 0.00662088 +-0.0525878 0.149334 0.020403 +-0.0102534 0.128943 0.0232512 +0.0445378 0.0959706 0.0101622 +-0.0465291 0.0335268 -0.00814027 +0.00437534 0.131145 0.0198749 +-0.0394369 0.03436 0.0321562 +-0.0107155 0.127812 0.0260097 +-0.0273383 0.17123 -0.0098418 +-0.0037118 0.0655569 -0.0347446 +-0.0630689 0.150547 -0.0265942 +-0.0776846 0.16386 -0.0329461 +-0.0728796 0.151218 -0.0388899 +0.038172 0.0967289 0.0325586 +-0.058907 0.0983413 -0.0195805 +-0.00549542 0.0965711 0.0536823 +0.00650609 0.0503877 0.0517539 +-0.0847722 0.113367 0.0459387 +0.0309512 0.0822193 0.0430727 +-0.0159859 0.0984773 0.0464357 +0.0361586 0.0781359 0.0382445 +0.0417308 0.0422749 0.000248643 +-0.0631435 0.175042 -0.061564 +-0.0251041 0.0945178 -0.0276305 +0.018776 0.122594 -0.0061273 +0.0173125 0.0726566 0.0514253 +-0.0377229 0.0724783 -0.0174913 +0.0173872 0.0432828 -0.0228623 +0.0416262 0.0912615 0.0286616 +-0.050567 0.0474222 -0.00850865 +-0.0150865 0.162585 -0.00969001 +0.0143357 0.0566765 -0.0290221 +-0.0309078 0.065095 -0.0224325 +0.045522 0.0805737 0.00219452 +-0.0725374 0.138625 0.0483183 +-0.0476365 0.150675 0.00992423 +-0.0799103 0.125126 -0.00560703 +-0.051025 0.159915 -0.00453945 +0.00139766 0.0419298 -0.0244976 +-0.0664219 0.0352675 0.015055 +-0.00832508 0.130422 0.0138058 +-0.00366678 0.0481589 -0.0301707 +-0.0738566 0.161044 -0.0339379 +0.0319703 0.0475137 0.0318758 +0.0188215 0.126955 0.00377584 +-0.0309617 0.044825 -0.0281993 +0.0456484 0.0875951 0.00518134 +-0.0521074 0.0583062 0.0285239 +-0.0171825 0.0382402 0.011747 +-0.0692976 0.0615474 0.00912978 +-0.0232044 0.175652 -0.0207635 +-0.0406662 0.0592305 -0.0118049 +0.0572429 0.0508905 0.0121849 +-0.0488285 0.0416917 0.0446681 +0.0455301 0.0677752 0.0254231 +-0.0846369 0.110251 0.00429821 +-0.0754652 0.163196 -0.0162299 +-0.0247271 0.0564997 0.0408849 +-0.0639975 0.0601011 0.00610183 +-0.0741599 0.155538 0.00126713 +-0.0728899 0.122329 -0.00823917 +0.010861 0.0360066 0.0447493 +0.0150176 0.0355797 0.04239 +-0.0437155 0.0710509 -0.0175901 +0.0271589 0.093209 -0.0206672 +-0.00592646 0.12418 0.0336126 +-0.0810295 0.0895599 -0.00769505 +-0.0920663 0.121362 0.00826874 +-0.0862277 0.0832671 0.00749085 +-0.085371 0.127983 -0.0026626 +-0.081815 0.108922 0.02836 +-0.0491537 0.135503 0.0034228 +0.00885847 0.0887054 -0.0320419 +-0.0673146 0.0446682 0.00602001 +0.0152697 0.128852 0.0195703 +0.0231834 0.0422122 0.040252 +-0.0286261 0.0463451 -0.0269667 +0.0449154 0.0763231 0.00019353 +-0.0387296 0.0739178 -0.0177449 +0.0212191 0.0819428 -0.0266321 +-0.00126307 0.039726 0.0470556 +-0.0261021 0.0379463 0.0228342 +-0.0448562 0.101383 -0.0214692 +-0.0014827 0.0390261 -0.00225591 +-0.0648948 0.103911 -0.0165942 +-0.0624902 0.155293 -0.0145941 +0.000436968 0.130385 0.0227651 +-0.0219738 0.059501 0.0451263 +-0.0502789 0.129408 -0.00267456 +-0.0216757 0.065257 0.0474751 +-0.0621482 0.16155 -0.0395978 +0.0427418 0.0916392 0.0261768 +0.00967962 0.127274 0.0289934 +-0.0728707 0.168003 -0.0450202 +-0.0305611 0.179398 -0.00755573 +0.0341402 0.0902832 0.0407178 +-0.0491119 0.0361611 0.0459929 +0.0392087 0.0739776 0.0338431 +-0.0897017 0.151503 0.0171224 +0.0407967 0.105643 0.0101649 +-0.023633 0.0478399 -0.0272396 +-0.0504958 0.0862332 0.0455716 +-0.0451092 0.153606 0.00834539 +-0.0616087 0.146812 0.0373554 +0.0280342 0.0346822 0.009507 +0.0565861 0.0685555 0.00335277 +-0.027568 0.0674298 0.0392602 +-0.0926576 0.117463 0.0373027 +-0.0334278 0.124984 0.0208436 +-0.0602518 0.034678 0.0430709 +-0.0574989 0.107052 0.0398301 +-0.091226 0.128161 0.00727002 +0.0400022 0.0913669 0.0315547 +-0.0656743 0.138242 0.0419702 +-0.0852141 0.0805923 0.0204766 +-0.0444957 0.111173 0.0370595 +-0.044489 0.0803636 0.042222 +-0.00648998 0.122405 0.0354776 +0.00602348 0.111527 -0.0200414 +-0.0860119 0.132159 0.00027761 +0.0521231 0.0734583 0.0172399 +-0.0155403 0.0446621 0.0510487 +-0.0397503 0.0768521 -0.0186787 +-0.0682155 0.0787029 0.0404793 +-0.0813927 0.0758934 0.0225084 +-0.010188 0.0386565 4.14997e-05 +-0.00149609 0.0912323 -0.0347548 +-0.0294974 0.111128 0.0367729 +-0.0503924 0.0501648 0.0186468 +-0.0104698 0.070299 0.0557764 +0.0327323 0.0809002 0.0421262 +-0.0328911 0.122131 -0.00712262 +-0.0861948 0.1005 0.0258994 +-0.0319282 0.178722 -0.00808101 +-0.050675 0.140101 0.0024044 +-0.0346788 0.0636729 -0.0139354 +-0.00820144 0.0344928 -0.0181278 +-0.0830162 0.0939316 0.0314035 +0.0438286 0.0611702 -0.00330591 +-0.0162799 0.127645 0.0211086 +-0.0615233 0.0354132 0.043881 +-0.0755937 0.0809959 -0.0116148 +-0.0632393 0.166259 -0.0385929 +-0.0156738 0.0511142 -0.0317767 +0.000751147 0.0339678 -0.0215355 +-0.0534027 0.0336932 0.022744 +0.0102837 0.0348658 -0.0091814 +-0.0285082 0.0874866 -0.0336017 +-0.0849712 0.111906 0.0292041 +-0.0732162 0.169408 -0.0460252 +-0.00746424 0.110009 0.0430329 +-0.0587154 0.0723411 -0.016523 +-0.00333145 0.0968513 -0.0305901 +0.0385608 0.0713011 0.0346329 +-0.0463734 0.133247 0.0130756 +-0.0474986 0.104275 0.0408376 +-0.0714849 0.147284 -0.0260827 +-0.0404433 0.0461446 -0.0193164 +0.000709469 0.125628 -0.00726116 +0.028516 0.117882 -0.00302906 +-0.00249354 0.0746702 0.0587588 +0.0463101 0.0806468 0.00818141 +-0.0245515 0.114015 0.0358596 +-0.0396488 0.0563195 -0.0111963 +-0.0236961 0.0607746 0.0425604 +-0.0336359 0.0548461 -0.0105101 +-0.0585033 0.0337545 0.0163089 +0.0212208 0.126407 0.0160623 +-0.0729862 0.15207 0.0354642 +-0.085378 0.128494 0.0496125 +0.00429457 0.122356 -0.0118056 +0.0203517 0.0672611 0.0487139 +-0.0452845 0.0395903 -0.0182935 +-0.0211124 0.182965 -0.0210132 +-0.0295465 0.0819132 0.0441437 +-0.0777488 0.07493 0.029356 +0.00824435 0.0966482 -0.0263491 +-0.0588066 0.0854157 -0.0208208 +-0.0718999 0.113582 -0.00821597 +-0.0893735 0.0901981 0.0104595 +0.032603 0.0835706 0.0419526 +-0.0230608 0.0594124 0.0433799 +0.0284544 0.121423 0.0116324 +-0.0832785 0.12444 0.0504652 +-0.0396241 0.0520021 -0.0108773 +0.00721225 0.0837864 -0.0330068 +-0.046713 0.131987 0.00556897 +-0.0663702 0.157999 -0.00906779 +-0.067736 0.0779793 -0.0166569 +-0.0508692 0.102779 -0.0209206 +-0.0828958 0.151378 0.00422572 +-0.0346622 0.118788 -0.0116368 +-0.0726425 0.0716156 -0.00744076 +-0.059725 0.0469427 0.0326718 +-0.0468444 0.033579 -0.0045851 +-0.0384976 0.100064 0.0415702 +-0.050989 0.121022 -0.0119137 +-0.0624226 0.152205 -0.0125757 +-0.085741 0.151793 0.0266482 +-0.0826468 0.144713 0.0407672 +-0.0685649 0.0705046 -0.00966184 +-0.0734033 0.167233 -0.0217479 +-0.0455099 0.155064 0.0077969 +0.022652 0.0862116 0.0486888 +0.043364 0.0547822 -0.00644446 +-0.054457 0.14621 0.0274041 +-0.0639777 0.155958 0.0237716 +-0.0882347 0.0861347 0.011472 +0.00545294 0.1216 -0.0129959 +-0.0334673 0.174268 -0.00177832 +-0.00402179 0.129762 0.0240423 +-0.0185051 0.0711438 0.0540217 +-0.0872329 0.150111 0.00920897 +-0.090033 0.147105 0.0269347 +-0.0141936 0.0419832 0.0511586 +-0.0335873 0.154463 -0.00838872 +0.0441357 0.083266 -0.000805736 +-0.0528842 0.102762 -0.0205636 +-0.0125091 0.0815143 0.0575917 +0.0197435 0.125962 0.0226458 +-0.067993 0.0619274 0.01978 +-0.0216083 0.039391 -0.0287125 +-0.0767116 0.165247 -0.022942 +-0.0861936 0.111308 0.0401352 +-0.0238165 0.0854111 -0.0376407 +-0.0442161 0.123225 0.0243959 +-0.0175443 0.0460366 0.0510389 +-0.0272334 0.0902723 -0.0326005 +-0.0459359 0.168402 -0.00594095 +0.0355423 0.0512597 0.0315836 +0.0451079 0.0636949 -0.00183531 +-0.0368834 0.125578 -0.00482073 +0.0196258 0.0457587 -0.0217227 +-0.00773224 0.109619 -0.0221011 +-0.0514957 0.0876341 0.0455102 +-0.00269376 0.0613003 -0.0344696 +-0.0512049 0.147808 0.0143958 +0.0266901 0.106496 -0.0148024 +0.0383861 0.0476151 -0.00591592 +-0.0136895 0.0952904 -0.0330103 +0.0368491 0.0767795 0.0374896 +-0.029592 0.0522946 -0.0203629 +0.0482309 0.0500295 -0.00369862 +0.0381363 0.0794306 0.0358549 +-0.0677271 0.155796 -0.00229118 +0.026043 0.0392404 0.0305576 +0.0208388 0.126564 0.0173475 +0.0159735 0.0448127 0.0438765 +-0.0681757 0.118633 0.0523539 +-0.065068 0.136793 0.0410949 +-0.0454458 0.168254 0.00168996 +-0.0715222 0.142818 0.0455702 +-0.0604912 0.112522 0.03629 +-0.00074702 0.0712329 -0.0350931 +-0.0894331 0.150114 0.0121902 +-0.0185746 0.0381525 0.0151621 +0.0291213 0.0348096 0.00960912 +0.0404448 0.0985503 0.0271661 +0.0134712 0.0936014 0.0511282 +-0.021496 0.103017 0.0435858 +0.00918856 0.0342345 -0.00132638 +-0.0508332 0.0956285 -0.0221275 +-0.0613646 0.0394268 0.0439671 +0.0264379 0.0968548 0.0436578 +-0.0646669 0.0405364 0.0387423 +0.0125029 0.0475354 0.045933 +0.0412949 0.104257 0.00416372 +-0.00222052 0.117102 -0.0161156 +-0.00995662 0.169734 -0.0198047 +0.0200755 0.0399795 -0.0157069 +-0.0839165 0.110514 0.0395089 +-0.0546435 0.116042 -0.0146857 +0.0268767 0.0854059 -0.022529 +-0.0543926 0.0337363 0.0224962 +-0.049781 0.0841032 -0.0216622 +0.0431463 0.100109 0.00616795 +0.0393814 0.0780345 0.0341058 +-0.0162612 0.17862 -0.0260128 +-0.0335093 0.0676035 0.0406399 +-0.0176483 0.0352702 -0.0188352 +-0.031463 0.0519033 0.0373773 +-0.0803572 0.0803552 0.0319871 +-0.0320868 0.159267 -0.0129293 +0.0132853 0.0589897 0.0507165 +-0.0103631 0.180289 -0.0277342 +-0.0144925 0.0559441 0.0511232 +-0.0246444 0.0381166 0.0247786 +0.0170669 0.0871276 -0.028336 +0.00372554 0.105196 -0.0213905 +-0.0777857 0.156925 -0.0179137 +0.0578227 0.0710073 0.0178627 +-0.0582482 0.0336534 0.0128901 +-0.0520861 0.0545712 0.0266312 +0.0269849 0.113053 -0.00983991 +0.0429421 0.0467386 0.030224 +0.00548112 0.11414 0.0405028 +0.0607975 0.0637336 0.0101416 +-0.0895137 0.135181 0.0391853 +-0.0822803 0.139383 0.0462108 +0.00350363 0.0883757 0.0563643 +-0.0599112 0.109712 -0.0163845 +-0.0699244 0.107994 -0.0118147 +-0.073438 0.145781 -0.0138542 +-0.0702694 0.156361 0.0186365 +0.0365208 0.0713424 0.036933 +-0.0764811 0.141399 0.0471717 +-0.0338378 0.0943788 -0.02372 +-0.0185768 0.055451 0.0489119 +-0.0294962 0.107041 0.0398129 +0.0351663 0.0783387 -0.0157415 +-0.0823976 0.095314 0.0321564 +0.0458052 0.08902 0.00916777 +0.00466954 0.0341296 0.0180802 +0.012258 0.0751733 -0.0308354 +-0.0176564 0.0480544 -0.0295902 +-0.0487658 0.0811872 -0.020682 +-0.0375125 0.045091 0.0407522 +0.00960807 0.0375632 0.0322947 +0.0522688 0.0462249 0.00921199 +-0.0452834 0.0395877 -0.019291 +-0.0396931 0.126183 0.0200311 +-0.0903381 0.144712 0.0141544 +-0.0430213 0.0450576 -0.0153284 +-0.0539191 0.129665 -0.00510771 +-0.0384876 0.108386 0.0375357 +-0.0496388 0.0605583 -0.0113235 +-0.034501 0.115223 0.0328885 +-0.0540284 0.131061 -0.00500164 +-0.0147028 0.0389017 0.0333119 +-0.0207376 0.0641563 -0.0358205 +0.00590682 0.131658 0.0132863 +-0.0819436 0.154696 0.0145801 +0.0526661 0.0660937 -0.000184776 +-0.0526201 0.14007 0.0244025 +-0.0752504 0.177839 -0.0529463 +-0.0574955 0.0946379 0.0447737 +0.0456129 0.0904097 0.00518194 +-0.0282629 0.122524 0.022734 +-0.0680338 0.142566 0.0438693 +-0.0643033 0.0426016 0.0312522 +-0.0314971 0.102929 0.041974 +-0.00589664 0.0980966 0.0519993 +-0.0542782 0.132533 0.0338047 +-0.0911122 0.11473 0.0343167 +-0.0493972 0.140141 0.00739907 +-0.0577664 0.0485104 0.00767417 +-0.0629684 0.139576 0.0370615 +-0.0122087 0.128137 0.0240139 +0.00116984 0.129366 -0.00128907 +-0.039496 0.0634667 0.0415276 +-0.0427066 0.0696149 -0.0170299 +-0.0721201 0.149786 -0.0402916 +-0.0637423 0.168365 -0.0426884 +-0.0228169 0.0383283 0.0285633 +-0.0894925 0.143336 0.0131803 +-0.0408822 0.128708 0.0107294 +-0.043783 0.147719 0.00491206 +0.00912223 0.0833108 0.0554277 +-0.0543042 0.0335497 0.00301212 +-0.0544171 0.0333785 -0.00775516 +0.0295237 0.0727272 0.042682 +-0.0504982 0.112495 0.0358796 +-0.0240218 0.119915 -0.0108978 +-0.0535232 0.0556038 0.0117195 +-0.0480175 0.133707 0.00490199 +0.00583381 0.129313 0.0261699 +-0.0405566 0.149165 -0.00293165 +-0.0286765 0.0690744 -0.0314836 +0.0453693 0.0693828 0.00245115 +0.0581659 0.056561 0.00517446 +0.0192888 0.0651078 -0.0282476 +-0.0228892 0.0739252 0.0512281 +-0.0217183 0.113234 -0.017904 +0.0365187 0.0526805 0.0315096 +0.0490482 0.0539975 0.0303486 +0.0175085 0.114012 0.0373101 +-0.0328107 0.126843 0.0122027 +-0.0687814 0.0336983 0.00353162 +0.0220892 0.0906332 -0.0239505 +-0.0460528 0.122513 0.026245 +0.0381409 0.109688 0.00657231 +0.0368421 0.0742334 -0.0127504 +-0.0657975 0.0340784 0.0127357 +-0.0706216 0.146831 -0.0255714 +-0.0468292 0.091298 -0.0217206 +-0.0914681 0.144718 0.0171554 +-0.0624908 0.0343254 0.0238098 +0.0543739 0.0477987 0.0161989 +-0.0195403 0.1757 -0.0161256 +0.0224671 0.0343921 0.00678503 +-0.0654707 0.155271 0.00728456 +-0.0897135 0.12265 0.00431103 +-0.0501651 0.0361307 0.0461721 +-0.0901888 0.139114 0.0151891 +-0.0726107 0.156829 -0.0349095 +-0.0334964 0.0718545 0.0411869 +0.0106165 0.0644536 0.0539383 +0.0274263 0.0491525 0.0376576 +-0.0157908 0.169796 -0.0160148 +-0.0608326 0.17151 -0.0610901 +0.0136156 0.126814 -0.00267762 +0.0293325 0.0535401 0.0386956 +-0.0652579 0.153012 -0.0402459 +0.0264019 0.036087 0.0225582 +0.0101281 0.105858 -0.0202342 +-0.0674046 0.0833115 0.0429955 +-0.0312435 0.0538841 -0.0143722 +0.0424267 0.0441756 -0.00158684 +-0.0305089 0.0760274 0.0408429 +-0.0849899 0.127963 -0.0030064 +-0.0223249 0.0386602 -0.0135496 +0.0216012 0.112963 -0.0137495 +-0.0224297 0.0552774 0.0442986 +-0.093152 0.121537 0.0362834 +-0.0384463 0.166779 0.00239389 +0.0317419 0.0667553 -0.0187125 +-0.0127135 0.100022 -0.0239701 +0.0204112 0.0371925 -0.00568428 +0.0383001 0.0969495 -0.00880451 +-0.0500528 0.150184 -0.0037815 +-0.0578783 0.106898 -0.0179862 +0.0485378 0.0682762 0.00156381 +-0.0708965 0.0341323 0.00629169 +-0.0871174 0.110466 0.0103621 +-0.0235739 0.0944939 0.0470656 +-0.0164815 0.0515035 0.0485835 +0.0325428 0.0380502 1.57112e-05 +0.0385774 0.0888011 0.0348199 +-0.0628692 0.0445185 0.0382675 +-0.0572856 0.125533 0.0399888 +-0.0780066 0.0940671 0.0362827 +-0.0361012 0.160724 -0.0132118 +0.0200495 0.124902 -0.000599563 +0.0101263 0.107276 -0.0197522 +0.0224877 0.0961643 0.0466342 +-0.077715 0.0852782 -0.0115916 +-0.0164955 0.105778 0.0423459 +-0.0725318 0.101313 0.038599 +-0.0663565 0.0783826 0.0411592 +-0.0644378 0.17995 -0.0588828 +-0.0645973 0.171184 -0.0458828 +0.0111199 0.129735 0.0223368 +-0.018333 0.172741 -0.0161594 +-0.0864925 0.10492 0.00639597 +-0.0144943 0.0500942 0.0487331 +-0.0855601 0.095177 0.0282718 +1.67787e-05 0.0386604 0.0239291 +0.0109499 0.0344084 0.00259617 +-0.0270041 0.168274 -0.00938266 +-0.0378811 0.107099 -0.0200653 +0.060304 0.0664655 0.0101406 +-0.0478845 0.108472 -0.0188663 +0.0181085 0.0591163 0.0489014 +-0.0260899 0.0522789 0.0395517 +0.0049437 0.0984176 -0.0242128 +-0.0623314 0.0357831 0.0433788 +0.0110403 0.0725847 0.0546235 +-0.0864956 0.084691 0.0204775 +-0.00849993 0.0787667 0.0579153 +-0.0260008 0.0382709 0.000860974 +-0.06937 0.145758 -0.0234859 +-0.0314168 0.117929 -0.0127586 +-0.0261669 0.0378674 0.0174813 +-0.0832309 0.120353 0.049216 +-0.0617814 0.16156 -0.0355923 +-0.0779669 0.165862 -0.0278956 +-0.0698398 0.0922797 -0.0162924 +0.0483255 0.0503286 -0.00380134 +0.0451716 0.0889782 0.0181643 +0.0329815 0.112282 -0.00498623 +0.0279206 0.0916217 -0.0209795 +0.0155 0.11402 0.0377783 +-0.0105379 0.0431327 0.0497176 +0.0606167 0.0609422 0.00915424 +-0.0181983 0.18599 -0.0174024 +0.0189716 0.115037 -0.0139804 +-0.0590849 0.0644137 0.0318252 +-0.0819254 0.12582 0.0519232 +-0.0588398 0.0954803 -0.0203334 +-0.0674426 0.148384 -0.0326115 +0.0387628 0.10462 0.0262683 +0.00841723 0.129272 0.0256623 +-0.0196119 0.0364667 -0.0278852 +-0.0376923 0.162356 -0.000243841 +1.88808e-05 0.115368 -0.0182789 +0.0393962 0.0505525 -0.00668347 +-0.0116788 0.0555838 -0.0339192 +0.0363865 0.0713868 -0.0138007 +-0.0821651 0.110069 0.034903 +0.022728 0.117081 -0.0101857 +-0.0515389 0.0417461 -0.0105815 +0.0219588 0.123501 -0.00109075 +0.00735928 0.0960033 -0.0276522 +-0.00349428 0.119696 0.0379021 +-0.0470844 0.151656 -0.00519447 +-0.0242296 0.0941248 -0.0298734 +0.0152433 0.0658912 0.0518711 +-0.021804 0.0376594 -0.0181241 +-0.0133966 0.121962 -0.00916065 +0.0365536 0.108655 0.0265769 +-0.0668098 0.0880715 -0.0180091 +-0.0665181 0.171112 -0.0407548 +0.0493343 0.0532247 -0.0043679 +0.0423933 0.0901635 -0.00682346 +-0.0624126 0.150651 -0.0115734 +0.0373944 0.0505276 -0.00658166 +-0.0411461 0.162173 -0.0113613 +-0.065916 0.0662086 0.0305519 +-0.0289729 0.083488 0.0456837 +-0.000642523 0.0347913 0.0398677 +-0.0738147 0.065744 0.00631032 +0.00351431 0.0938625 0.0544725 +-0.0467733 0.12389 0.0269319 +0.0246632 0.123785 0.00595837 +-0.0715256 0.0958228 0.0413941 +0.00252922 0.0362636 0.0463395 +0.00948792 0.0963424 0.0500581 +0.0292035 0.0400739 0.0286474 +-0.0309481 0.0706991 -0.0284733 +-0.054091 0.152763 0.0215579 +0.0118527 0.105542 -0.0197545 +-0.0404793 0.0832528 0.0431634 +-0.0448438 0.0985036 -0.0215544 +-0.032014 0.0567822 -0.0123897 +0.00040853 0.0356817 0.00488121 +0.0447245 0.0861403 0.0231669 +-0.0426307 0.0338188 -0.00946517 +-0.0710495 0.141325 -0.00813095 +-0.0255896 0.182763 -0.0105092 +-0.0838169 0.107636 0.0253505 +-0.0796245 0.0859561 0.0353266 +0.0240034 0.0449703 0.0396985 +0.00450108 0.0716864 0.0560951 +-0.0676894 0.0750921 -0.0153176 +-0.0466572 0.0369109 -0.0172699 +-0.016529 0.0558872 0.0508401 +-0.087831 0.103641 0.0093887 +0.0272256 0.10745 0.0377741 +-0.0670064 0.0337953 0.0073865 +-0.0866888 0.0833263 0.0124872 +0.0152687 0.0779357 -0.0299953 +-0.0851819 0.152725 0.0105454 +0.000352424 0.0511166 -0.0306262 +0.0518495 0.0464359 0.0201911 +0.0554005 0.0553511 0.0254886 +-0.0886141 0.0928486 0.00844707 +0.0129712 0.130228 0.0115965 +-0.085549 0.104961 0.0233427 +0.0515991 0.0496316 0.0251833 +0.0131946 0.0878791 -0.0305989 +-0.0693376 0.131255 0.0489674 +-0.0660205 0.167997 -0.0305503 +-0.0666146 0.174697 -0.0480375 +-0.0293346 0.0347045 0.0427947 +-0.0553259 0.126836 -0.00601308 +-0.058583 0.0460291 0.0113967 +-0.0416277 0.0337441 -0.014735 +-0.0446642 0.0621749 -0.0132201 +0.0295862 0.120365 0.0134787 +-0.0697163 0.064282 0.022673 +-0.0805487 0.0789662 0.0306236 +-0.0787564 0.154933 0.00983696 +-0.0662707 0.14708 -0.0258685 +-0.0248167 0.0949702 -0.0267501 +-0.0407693 0.0826515 -0.0208197 +0.000514101 0.0346343 0.00952105 +-0.0533361 0.138123 0.0280776 +-0.0689277 0.115103 -0.00892086 +-0.0865224 0.0913375 0.0024428 +0.0232602 0.0790529 -0.0256674 +0.0296786 0.0679688 -0.0198342 +-0.0331127 0.123309 0.0239558 +0.0276403 0.118218 0.0284429 +0.00238303 0.0449286 -0.0261957 +-0.0928278 0.124236 0.0382657 +-0.0868685 0.11045 0.00936714 +-0.0254875 0.0959781 0.0438332 +0.0132252 0.0808221 -0.0308314 +0.035265 0.0591791 0.0368077 +-0.00944135 0.168135 -0.0197365 +0.0011864 0.12951 0.0259323 +-0.0139593 0.0967237 -0.0305143 +-0.00848922 0.0385737 0.0258802 +0.0562981 0.0619429 0.0011209 +0.0322546 0.0987343 -0.0145759 +-0.0268707 0.103016 -0.0234914 +-0.00655639 0.0384205 0.0209905 +-0.0296666 0.0774462 0.0418826 +-0.0626586 0.0676213 -0.0103966 +0.0374569 0.0904362 -0.0137042 +-0.0712181 0.161 -0.0439365 +0.0243668 0.0889213 0.0476805 +-0.0336134 0.0408899 -0.0298935 +-0.0404969 0.0916505 0.0425962 +0.0443454 0.0903358 0.0221636 +-0.0435232 0.163746 0.00524284 +-0.0649943 0.0623954 0.0235277 +-0.0613093 0.0593276 0.0181457 +-0.0717978 0.155398 -0.0409076 +-0.00868753 0.0584178 -0.0339256 +-0.0904383 0.119966 0.00529664 +-0.0601615 0.0333995 -0.00165181 +-0.0612252 0.0407891 0.0437895 +-0.0537348 0.0738508 -0.0172852 +-0.0709057 0.10512 -0.0125462 +-0.00333997 0.039253 0.0353398 +-0.0469903 0.145002 0.00194161 +-0.0250386 0.0659034 -0.0335362 +-0.023273 0.0382876 0.00502865 +0.0111228 0.0960826 -0.0257288 +0.0198113 0.0954368 -0.0230239 +0.038476 0.104075 -0.00282883 +-0.0843581 0.0883713 0.0286614 +-0.0930341 0.118841 0.0362969 +-0.0646767 0.146003 -0.0179612 +0.0284626 0.102127 0.0395666 +-0.0435018 0.113907 0.034675 +-0.0604863 0.0790224 0.042794 +-0.089042 0.112536 0.0205154 +-0.0524675 0.0344946 0.0345461 +-0.0848716 0.119101 -0.00207765 +-0.0120923 0.11442 -0.0172013 +-0.079929 0.151371 0.00121035 +-0.0920085 0.116136 0.0393096 +0.0361533 0.112569 0.0130564 +-0.0196629 0.125034 -0.00230889 +0.000499429 0.115573 0.0406664 +-0.0560183 0.147198 -0.00168648 +-0.0873616 0.110481 0.0113565 +-0.0416844 0.0636674 -0.0137203 +-0.0651889 0.153592 -0.00278678 +0.0471599 0.07398 0.0153485 +0.0404106 0.0873775 0.0321991 +-0.019434 0.184905 -0.0153275 +-0.0438294 0.0913555 -0.0224139 +-0.0527613 0.0797578 -0.020501 +-0.0314155 0.0651435 -0.021432 +0.00948509 0.0950229 0.0512669 +0.0346346 0.107297 -0.007625 +-0.0870053 0.0954387 0.00242783 +-0.0617312 0.142927 -0.00565867 +-0.0538929 0.14622 0.0244012 +0.0339044 0.115273 0.00366751 +0.049575 0.0693171 0.00251779 +-0.0861009 0.106274 0.00635995 +-0.00751182 0.075985 0.0578234 +-0.0761849 0.0933719 -0.0135017 +0.0266626 0.0672707 0.0437593 +-0.0314925 0.0932138 0.0444288 +0.0112937 0.0680868 -0.0307505 +-0.086045 0.141863 0.00720055 +0.000490707 0.111422 0.0424934 +-0.0516022 0.0502173 -0.00741774 +-0.0709386 0.131124 -0.00852217 +-0.0291841 0.125368 0.0164845 +-0.0012258 0.095852 -0.0315171 +-0.000697567 0.0641196 -0.0342689 +-0.0797379 0.0738711 0.0228323 +-0.0705682 0.0382102 0.00943236 +-0.0558807 0.102663 -0.0193944 +0.0262875 0.0835737 0.0468767 +-0.0206175 0.0364922 -0.0281092 +0.0306136 0.0779431 -0.0207534 +0.037492 0.0983062 -0.0097724 +-0.0861064 0.0806138 0.0174966 +-0.0488748 0.105594 -0.0196597 +-0.0499497 0.0724883 0.0409516 +-0.060435 0.131107 0.0389542 +-0.0197383 0.108898 -0.0213322 +-0.0328414 0.0943934 -0.0238538 +0.0071329 0.104451 -0.0211019 +-0.0904392 0.125398 0.00528343 +0.0579573 0.0676391 0.00414749 +-0.0890486 0.0915916 0.0214249 +0.0544885 0.0716156 0.00618127 +0.037936 0.0901639 0.0356574 +-0.0631289 0.155254 0.0269868 +0.0280038 0.120349 0.024295 +0.00325461 0.0697315 -0.0336623 +0.0198002 0.0768324 0.0515324 +0.0135718 0.0504901 0.0475195 +-0.0220331 0.041681 0.0538782 +-0.0322365 0.126297 0.00653811 +-0.020497 0.0855906 0.0563403 +0.0100844 0.123139 0.0340691 +-0.0917617 0.141982 0.0191718 +-0.00665267 0.0526646 -0.0325345 +0.0325469 0.0922927 -0.0176842 +-0.00490321 0.0383839 0.0141185 +0.0393963 0.049102 -0.00636122 +-0.0468295 0.0927337 -0.0216687 +0.0393484 0.0561243 -0.00568756 +0.0381042 0.0392738 0.00134927 +-0.02061 0.0653432 0.0492306 +-0.0644858 0.152894 -0.00250698 +0.0316363 0.118365 0.0113851 +-0.0625842 0.162383 -0.0563311 +-0.0126137 0.180121 -0.0236267 +-0.0562637 0.142432 0.0309288 +0.0389203 0.10838 0.0161659 +0.0468209 0.0708789 0.021127 +0.0153317 0.060873 -0.028643 +-0.067208 0.0447917 0.00368814 +-0.0638714 0.15469 -0.0385902 +-0.0624126 0.161536 -0.0416011 +-0.011049 0.124435 -0.00785173 +0.0143712 0.0493733 -0.0267066 +-0.0374862 0.0931566 0.0438456 +-0.0278525 0.0807805 0.0474761 +0.0573848 0.0670309 0.00292365 +-0.0304938 0.0960556 0.0449536 +0.0182602 0.127523 0.0192457 +0.0182204 0.080645 -0.0282763 +-0.00275795 0.0740872 -0.0359501 +-0.072697 0.155649 0.00759319 +-0.0857527 0.0792184 0.0135098 +-0.0604443 0.0456013 0.0296807 +-0.0528198 0.0927332 -0.0219739 +-0.0457202 0.0709417 -0.0164642 +-0.054497 0.0889964 0.0448823 +-0.0541353 0.147754 0.0254132 +0.05074 0.0503045 -0.00171178 +-0.0926993 0.124215 0.0352716 +0.00850767 0.0786 0.0556334 +-0.0141847 0.0405865 0.0511605 +-0.0500491 0.0345412 0.0367666 +-0.0744234 0.156022 0.0128056 +-0.0148381 0.0386367 -0.0157684 +-0.0896535 0.0916031 0.0184402 +-0.0279306 0.125506 0.00666413 +-0.0249827 0.0918474 0.0485489 +-0.0247746 0.0385687 -0.0102357 +-0.0718755 0.10648 -0.0114758 +0.0303733 0.115414 -0.00438737 +0.0390771 0.099844 -0.00681802 +-0.0601235 0.0447437 0.0425684 +0.0559507 0.0508031 0.00520531 +-0.087948 0.102288 0.00840013 +-0.0802939 0.0732789 0.00250413 +-0.00347452 0.114725 -0.0175669 +-0.0780015 0.155773 0.018849 +-0.0868392 0.0873072 0.00147849 +0.0114304 0.0346172 0.0371012 +-0.0154945 0.0925097 0.0555061 +0.0207547 0.10431 -0.0184628 +-0.0805113 0.153427 0.0283513 +-0.0133702 0.0343611 -0.0190243 +0.045363 0.0932019 0.00717004 +-0.0517619 0.079747 -0.0203928 +-0.011137 0.171308 -0.0197957 +-0.0797359 0.0706327 0.0105539 +-0.0435047 0.116629 0.0323741 +0.0461192 0.0786876 0.0190773 +0.0257679 0.0349257 0.0180133 +-0.0377436 0.127354 0.000111554 +0.0455391 0.0875946 0.0141649 +-0.0115776 0.0962625 -0.032007 +-0.0304054 0.0580102 -0.0194062 +-0.0519213 0.118323 0.0336042 +-0.0615165 0.15114 0.0355512 +-0.0268549 0.175688 -0.00910606 +0.0291872 0.0462618 0.034893 +-0.0828817 0.143196 0.00216401 +-0.0229243 0.0972075 0.044901 +-0.0420606 0.0344689 0.0332688 +0.00840712 0.0404044 -0.0234014 +-0.0584986 0.100161 0.0428821 +0.0267286 0.0521731 -0.0207566 +-0.0343564 0.043282 -0.028737 +0.035312 0.0840703 -0.0177861 +0.0167493 0.0874098 0.0506847 +-0.0706375 0.156126 0.0126907 +0.0395317 0.0596774 0.0306966 +0.0160357 0.0807986 0.0531419 +-0.0719071 0.105086 -0.0120336 +0.057752 0.0523416 0.0181873 +-0.0705862 0.166615 -0.0490027 +-0.069998 0.157611 -0.0031485 +-0.0629727 0.118457 0.044154 +-0.0098895 0.107351 -0.0224128 +-0.0668287 0.169972 -0.0351376 +-0.0538607 0.152062 0.0231076 +0.0286155 0.0795328 0.044942 +0.00747725 0.131195 0.0181386 +0.0525355 0.0678367 0.0261828 +-0.069983 0.033931 0.00665746 +-0.00449526 0.10588 0.044033 +-0.0647467 0.143415 -0.011401 +-0.0242451 0.0337053 -0.0224295 +0.0405945 0.102819 0.0221712 +-0.0253936 0.106122 -0.0223873 +-0.031866 0.126076 0.00521848 +-0.0903832 0.132413 0.0312232 +0.0270423 0.0648893 -0.0216756 +-0.0416036 0.125525 0.0208631 +-0.0642885 0.148287 -0.0250747 +0.043249 0.0705728 -0.00179391 +0.00750831 0.0772509 0.056126 +-0.0360471 0.125746 -0.0036679 +-0.0534999 0.0820142 0.0450601 +-0.0268076 0.0782799 -0.0366273 +-0.0630392 0.0336157 0.00836468 +0.00450283 0.0924607 0.0546761 +-0.0794816 0.0846149 0.0352279 +-0.0354976 0.116636 0.0319301 +0.0590094 0.0552651 0.0101755 +0.0177618 0.100614 -0.0224544 +0.0141872 0.0347155 0.0357788 +-0.0626395 0.0644043 -0.00619313 +-0.0472223 0.168222 -0.000777409 +-0.0688709 0.156258 0.0147705 +-0.00209707 0.130745 0.0203917 +0.0438165 0.0959355 0.0191615 +0.0272253 0.120021 -0.000250724 +-0.0623918 0.152158 -0.026581 +-0.0619803 0.153737 -0.02558 +-0.0110119 0.122536 -0.00980812 +-0.00845767 0.100229 0.0476033 +-0.053626 0.1255 0.0365054 +0.029243 0.0872327 -0.0208644 +-0.0561028 0.133503 -0.00512832 +-0.0536146 0.150855 0.0243962 +-0.0729449 0.0805494 0.0386997 +-0.0113093 0.0384672 0.00547553 +0.013929 0.0392001 0.0444158 +-0.0743245 0.179234 -0.0539852 +-0.0670834 0.168031 -0.0569976 +0.0269196 0.0418157 0.0333163 +-0.0261604 0.114813 -0.0155316 +0.054979 0.06227 -0.000302264 +0.0447631 0.0931576 0.00318223 +-0.028552 0.159576 0.000695282 +-0.0196334 0.0906851 0.0545345 +-0.0681661 0.173216 -0.0428508 +-0.0670035 0.166617 -0.0570134 +-0.00170857 0.0641356 -0.0344906 +-0.0302923 0.115032 -0.0157497 +-0.017789 0.0998203 0.0439009 +0.0575984 0.0711737 0.0088801 +-0.0559485 0.119826 0.0383628 +-0.0508832 0.106998 -0.0191626 +-0.0856518 0.096702 -0.000561949 +0.0433856 0.0475038 -0.0047769 +-0.0141839 0.177168 -0.0206609 +-0.0318261 0.0623615 -0.0184459 +-0.0694684 0.158126 -0.0509379 +-0.059088 0.0445923 -0.00517311 +-0.0680469 0.0887699 0.043444 +0.0413366 0.0588699 -0.00449648 +-0.0108613 0.16611 -0.0209706 +-0.0810695 0.111472 -0.000645954 +0.0236683 0.0535376 0.0428398 +-0.0525009 0.104252 0.0406803 +0.0178265 0.128119 0.0148069 +-0.0833287 0.0817012 -0.000498118 \ No newline at end of file diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny5000.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny5000.pts new file mode 100644 index 000000000000..b9c0cbdc12bd --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny5000.pts @@ -0,0 +1,35948 @@ +1500 +-0.0164722 0.0382453 0.0209318 +-0.0641407 0.171114 -0.0471776 +0.023086 0.119339 0.0317977 +0.00506037 0.0347021 0.0393176 +-0.066143 0.143958 0.0413147 +-0.0445017 0.163753 0.00542301 +-0.0689729 0.181022 -0.0546459 +-0.0931085 0.131006 0.0192314 +0.000506827 0.0489752 0.0512269 +-0.0615935 0.160001 -0.0315914 +-0.0245032 0.0960169 0.0442753 +-0.0258992 0.0891655 0.049535 +-0.000499367 0.0456802 0.0470389 +-0.0171808 0.0654583 0.0528522 +0.00116916 0.131228 0.00582139 +-0.0356565 0.122935 -0.00798984 +-0.0701892 0.156285 0.021569 +-0.0173569 0.038443 0.0259817 +-0.0716413 0.0763478 -0.0132577 +0.0528545 0.0568172 0.0288563 +-0.0325067 0.0732308 0.0407775 +-0.0760686 0.150008 -0.00987485 +-0.030561 0.0774145 0.0410957 +-0.0833901 0.0762729 0.00451303 +-0.000492618 0.0925258 0.0556594 +-0.0358778 0.159506 0.00240863 +0.0115111 0.114076 0.0384616 +-0.0877889 0.0887187 0.00347532 +-0.0261028 0.115949 -0.0147279 +-0.0682913 0.165205 -0.0539869 +-0.0225512 0.0933694 -0.0331106 +-0.0538783 0.0999149 -0.0214389 +0.0435587 0.0959151 0.0211557 +-0.0167991 0.0388632 -0.0107644 +-0.0569142 0.0548839 0.00364185 +0.00749229 0.091015 0.0542708 +-0.065316 0.0625169 -0.002419 +-0.00749647 0.119689 0.0375376 +-0.0772165 0.0934484 -0.0125951 +-0.029008 0.0478606 -0.0250513 +0.00934189 0.0553527 -0.0303034 +-0.0578677 0.104042 -0.0186102 +0.0405495 0.0999198 -0.00379356 +-0.0894314 0.137929 0.0371779 +0.00710731 0.126603 -0.00643182 +0.058913 0.070492 0.0108657 +-0.0922485 0.120133 0.0292903 +0.0395325 0.105566 0.0221621 +-0.0376065 0.0365426 0.0444186 +-0.0550158 0.128128 -0.00563226 +-0.0561672 0.0336533 0.0186553 +0.0123436 0.0351165 0.0296251 +-0.0899184 0.131005 0.0413145 +0.0065365 0.100373 0.0469448 +-0.0502879 0.133796 0.0278403 +-0.0716838 0.0351362 0.00880221 +0.0579126 0.0523842 0.0101848 +-0.0639212 0.154791 0.00385831 +-0.0654795 0.0384216 -0.00684663 +-0.0615513 0.0624603 0.0259481 +-0.0368013 0.0842007 -0.0223672 +0.0522757 0.0574291 -0.0035048 +-0.0764972 0.123179 0.0527664 +0.0302998 0.0694384 -0.019812 +-0.0334269 0.0486094 0.0413091 +-0.00450651 0.0689184 0.0565193 +0.0425976 0.0887597 -0.00680771 +-0.0707351 0.156208 0.0228366 +0.0548799 0.0492406 0.0202107 +-0.00962948 0.168316 -0.023669 +-0.0313363 0.11605 -0.0148117 +-0.0225249 0.125571 0.0012278 +0.0122871 0.124953 0.0313975 +-0.0343047 0.125361 0.0205265 +-0.038499 0.0747376 0.0420783 +0.0292349 0.0759579 -0.0220376 +-0.0255784 0.0477093 -0.0263526 +-0.0750958 0.151313 -0.0258791 +0.0057743 0.0347896 0.0375885 +-0.0926124 0.120126 0.0272917 +-0.0366664 0.175138 -0.00407486 +-0.00549337 0.088417 0.0570387 +-0.0711473 0.17507 -0.0540267 +-0.0776118 0.0739521 0.0284675 +0.0376746 0.104662 0.0282621 +-0.0634881 0.121359 0.0469409 +0.0233296 0.0564006 -0.0254415 +-0.0399361 0.123254 0.0259269 +-0.000577398 0.0341134 -0.0181551 +-0.000496894 0.0520342 0.0541515 +-0.0701023 0.177167 -0.0478719 +-0.0641167 0.143926 0.0389732 +-0.0679369 0.165269 -0.0197719 +-0.0681029 0.138305 0.0455026 +-0.00280426 0.0384802 0.0198949 +-0.0628273 0.0924874 -0.0189476 +0.0084946 0.0869435 0.0558386 +0.00910286 0.0348066 0.0183719 +-0.0195983 0.126231 0.0213862 +-0.0584949 0.143878 0.0330085 +-0.0218343 0.0553077 0.0451067 +-0.0645685 0.147457 -0.0230581 +0.0426227 0.0691122 -0.00279622 +-0.035813 0.0842739 -0.0225525 +-0.0819685 0.0791215 0.0284136 +0.0328852 0.113087 -0.00384394 +-0.0677123 0.168615 -0.0283035 +-0.0556635 0.140996 0.0299986 +-0.0764958 0.131682 0.0526442 +0.0421796 0.0832522 0.0293553 +-0.0848653 0.0855483 0.0264341 +-0.0329445 0.121338 0.0269922 +-0.0320197 0.058187 -0.0133973 +-0.0322785 0.0421631 -0.0296986 +0.0401757 0.067497 -0.00878165 +-0.0904989 0.148452 0.0245146 +-0.00947974 0.0561444 0.0530127 +-0.0310333 0.0383692 -0.000250742 +-0.0780713 0.150403 0.0367551 +-0.0872126 0.146051 0.00824907 +-0.0735722 0.148626 -0.0268487 +-0.00548676 0.116904 0.0394711 +-0.0599006 0.132533 0.037981 +-0.093479 0.129659 0.0212406 +-0.0639063 0.120904 -0.00875525 +-0.028606 0.0356961 0.0524615 +-0.0652024 0.153998 -0.041972 +-0.0262134 0.0765572 0.0473962 +-0.0774721 0.155387 0.0234212 +-0.0628707 0.0345025 0.0358026 +0.0434964 0.0555926 0.0322399 +-0.0618022 0.142496 0.0370478 +-0.0638273 0.0910291 -0.0188305 +-0.0636286 0.0672101 0.0337087 +-0.0842132 0.092522 0.0298256 +0.0185123 0.115397 0.0365584 +-0.0666269 0.131204 0.0458398 +-0.0653475 0.165775 -0.0260007 +-0.0182573 0.181629 -0.0177335 +-0.0142757 0.185348 -0.0257883 +0.0485082 0.0624718 0.0300814 +-0.0254927 0.0974122 0.0441083 +-0.0446561 0.0349999 0.0427486 +-0.0616719 0.0410515 0.0160296 +-0.0179307 0.0931593 -0.0348763 +-0.00828798 0.130102 0.00662088 +-0.0525878 0.149334 0.020403 +-0.0102534 0.128943 0.0232512 +0.0445378 0.0959706 0.0101622 +-0.0465291 0.0335268 -0.00814027 +0.00437534 0.131145 0.0198749 +-0.0394369 0.03436 0.0321562 +-0.0107155 0.127812 0.0260097 +-0.0273383 0.17123 -0.0098418 +-0.0037118 0.0655569 -0.0347446 +-0.0630689 0.150547 -0.0265942 +-0.0776846 0.16386 -0.0329461 +-0.0728796 0.151218 -0.0388899 +0.038172 0.0967289 0.0325586 +-0.058907 0.0983413 -0.0195805 +-0.00549542 0.0965711 0.0536823 +0.00650609 0.0503877 0.0517539 +-0.0847722 0.113367 0.0459387 +0.0309512 0.0822193 0.0430727 +-0.0159859 0.0984773 0.0464357 +0.0361586 0.0781359 0.0382445 +0.0417308 0.0422749 0.000248643 +-0.0631435 0.175042 -0.061564 +-0.0251041 0.0945178 -0.0276305 +0.018776 0.122594 -0.0061273 +0.0173125 0.0726566 0.0514253 +-0.0377229 0.0724783 -0.0174913 +0.0173872 0.0432828 -0.0228623 +0.0416262 0.0912615 0.0286616 +-0.050567 0.0474222 -0.00850865 +-0.0150865 0.162585 -0.00969001 +0.0143357 0.0566765 -0.0290221 +-0.0309078 0.065095 -0.0224325 +0.045522 0.0805737 0.00219452 +-0.0725374 0.138625 0.0483183 +-0.0476365 0.150675 0.00992423 +-0.0799103 0.125126 -0.00560703 +-0.051025 0.159915 -0.00453945 +0.00139766 0.0419298 -0.0244976 +-0.0664219 0.0352675 0.015055 +-0.00832508 0.130422 0.0138058 +-0.00366678 0.0481589 -0.0301707 +-0.0738566 0.161044 -0.0339379 +0.0319703 0.0475137 0.0318758 +0.0188215 0.126955 0.00377584 +-0.0309617 0.044825 -0.0281993 +0.0456484 0.0875951 0.00518134 +-0.0521074 0.0583062 0.0285239 +-0.0171825 0.0382402 0.011747 +-0.0692976 0.0615474 0.00912978 +-0.0232044 0.175652 -0.0207635 +-0.0406662 0.0592305 -0.0118049 +0.0572429 0.0508905 0.0121849 +-0.0488285 0.0416917 0.0446681 +0.0455301 0.0677752 0.0254231 +-0.0846369 0.110251 0.00429821 +-0.0754652 0.163196 -0.0162299 +-0.0247271 0.0564997 0.0408849 +-0.0639975 0.0601011 0.00610183 +-0.0741599 0.155538 0.00126713 +-0.0728899 0.122329 -0.00823917 +0.010861 0.0360066 0.0447493 +0.0150176 0.0355797 0.04239 +-0.0437155 0.0710509 -0.0175901 +0.0271589 0.093209 -0.0206672 +-0.00592646 0.12418 0.0336126 +-0.0810295 0.0895599 -0.00769505 +-0.0920663 0.121362 0.00826874 +-0.0862277 0.0832671 0.00749085 +-0.085371 0.127983 -0.0026626 +-0.081815 0.108922 0.02836 +-0.0491537 0.135503 0.0034228 +0.00885847 0.0887054 -0.0320419 +-0.0673146 0.0446682 0.00602001 +0.0152697 0.128852 0.0195703 +0.0231834 0.0422122 0.040252 +-0.0286261 0.0463451 -0.0269667 +0.0449154 0.0763231 0.00019353 +-0.0387296 0.0739178 -0.0177449 +0.0212191 0.0819428 -0.0266321 +-0.00126307 0.039726 0.0470556 +-0.0261021 0.0379463 0.0228342 +-0.0448562 0.101383 -0.0214692 +-0.0014827 0.0390261 -0.00225591 +-0.0648948 0.103911 -0.0165942 +-0.0624902 0.155293 -0.0145941 +0.000436968 0.130385 0.0227651 +-0.0219738 0.059501 0.0451263 +-0.0502789 0.129408 -0.00267456 +-0.0216757 0.065257 0.0474751 +-0.0621482 0.16155 -0.0395978 +0.0427418 0.0916392 0.0261768 +0.00967962 0.127274 0.0289934 +-0.0728707 0.168003 -0.0450202 +-0.0305611 0.179398 -0.00755573 +0.0341402 0.0902832 0.0407178 +-0.0491119 0.0361611 0.0459929 +0.0392087 0.0739776 0.0338431 +-0.0897017 0.151503 0.0171224 +0.0407967 0.105643 0.0101649 +-0.023633 0.0478399 -0.0272396 +-0.0504958 0.0862332 0.0455716 +-0.0451092 0.153606 0.00834539 +-0.0616087 0.146812 0.0373554 +0.0280342 0.0346822 0.009507 +0.0565861 0.0685555 0.00335277 +-0.027568 0.0674298 0.0392602 +-0.0926576 0.117463 0.0373027 +-0.0334278 0.124984 0.0208436 +-0.0602518 0.034678 0.0430709 +-0.0574989 0.107052 0.0398301 +-0.091226 0.128161 0.00727002 +0.0400022 0.0913669 0.0315547 +-0.0656743 0.138242 0.0419702 +-0.0852141 0.0805923 0.0204766 +-0.0444957 0.111173 0.0370595 +-0.044489 0.0803636 0.042222 +-0.00648998 0.122405 0.0354776 +0.00602348 0.111527 -0.0200414 +-0.0860119 0.132159 0.00027761 +0.0521231 0.0734583 0.0172399 +-0.0155403 0.0446621 0.0510487 +-0.0397503 0.0768521 -0.0186787 +-0.0682155 0.0787029 0.0404793 +-0.0813927 0.0758934 0.0225084 +-0.010188 0.0386565 4.14997e-05 +-0.00149609 0.0912323 -0.0347548 +-0.0294974 0.111128 0.0367729 +-0.0503924 0.0501648 0.0186468 +-0.0104698 0.070299 0.0557764 +0.0327323 0.0809002 0.0421262 +-0.0328911 0.122131 -0.00712262 +-0.0861948 0.1005 0.0258994 +-0.0319282 0.178722 -0.00808101 +-0.050675 0.140101 0.0024044 +-0.0346788 0.0636729 -0.0139354 +-0.00820144 0.0344928 -0.0181278 +-0.0830162 0.0939316 0.0314035 +0.0438286 0.0611702 -0.00330591 +-0.0162799 0.127645 0.0211086 +-0.0615233 0.0354132 0.043881 +-0.0755937 0.0809959 -0.0116148 +-0.0632393 0.166259 -0.0385929 +-0.0156738 0.0511142 -0.0317767 +0.000751147 0.0339678 -0.0215355 +-0.0534027 0.0336932 0.022744 +0.0102837 0.0348658 -0.0091814 +-0.0285082 0.0874866 -0.0336017 +-0.0849712 0.111906 0.0292041 +-0.0732162 0.169408 -0.0460252 +-0.00746424 0.110009 0.0430329 +-0.0587154 0.0723411 -0.016523 +-0.00333145 0.0968513 -0.0305901 +0.0385608 0.0713011 0.0346329 +-0.0463734 0.133247 0.0130756 +-0.0474986 0.104275 0.0408376 +-0.0714849 0.147284 -0.0260827 +-0.0404433 0.0461446 -0.0193164 +0.000709469 0.125628 -0.00726116 +0.028516 0.117882 -0.00302906 +-0.00249354 0.0746702 0.0587588 +0.0463101 0.0806468 0.00818141 +-0.0245515 0.114015 0.0358596 +-0.0396488 0.0563195 -0.0111963 +-0.0236961 0.0607746 0.0425604 +-0.0336359 0.0548461 -0.0105101 +-0.0585033 0.0337545 0.0163089 +0.0212208 0.126407 0.0160623 +-0.0729862 0.15207 0.0354642 +-0.085378 0.128494 0.0496125 +0.00429457 0.122356 -0.0118056 +0.0203517 0.0672611 0.0487139 +-0.0452845 0.0395903 -0.0182935 +-0.0211124 0.182965 -0.0210132 +-0.0295465 0.0819132 0.0441437 +-0.0777488 0.07493 0.029356 +0.00824435 0.0966482 -0.0263491 +-0.0588066 0.0854157 -0.0208208 +-0.0718999 0.113582 -0.00821597 +-0.0893735 0.0901981 0.0104595 +0.032603 0.0835706 0.0419526 +-0.0230608 0.0594124 0.0433799 +0.0284544 0.121423 0.0116324 +-0.0832785 0.12444 0.0504652 +-0.0396241 0.0520021 -0.0108773 +0.00721225 0.0837864 -0.0330068 +-0.046713 0.131987 0.00556897 +-0.0663702 0.157999 -0.00906779 +-0.067736 0.0779793 -0.0166569 +-0.0508692 0.102779 -0.0209206 +-0.0828958 0.151378 0.00422572 +-0.0346622 0.118788 -0.0116368 +-0.0726425 0.0716156 -0.00744076 +-0.059725 0.0469427 0.0326718 +-0.0468444 0.033579 -0.0045851 +-0.0384976 0.100064 0.0415702 +-0.050989 0.121022 -0.0119137 +-0.0624226 0.152205 -0.0125757 +-0.085741 0.151793 0.0266482 +-0.0826468 0.144713 0.0407672 +-0.0685649 0.0705046 -0.00966184 +-0.0734033 0.167233 -0.0217479 +-0.0455099 0.155064 0.0077969 +0.022652 0.0862116 0.0486888 +0.043364 0.0547822 -0.00644446 +-0.054457 0.14621 0.0274041 +-0.0639777 0.155958 0.0237716 +-0.0882347 0.0861347 0.011472 +0.00545294 0.1216 -0.0129959 +-0.0334673 0.174268 -0.00177832 +-0.00402179 0.129762 0.0240423 +-0.0185051 0.0711438 0.0540217 +-0.0872329 0.150111 0.00920897 +-0.090033 0.147105 0.0269347 +-0.0141936 0.0419832 0.0511586 +-0.0335873 0.154463 -0.00838872 +0.0441357 0.083266 -0.000805736 +-0.0528842 0.102762 -0.0205636 +-0.0125091 0.0815143 0.0575917 +0.0197435 0.125962 0.0226458 +-0.067993 0.0619274 0.01978 +-0.0216083 0.039391 -0.0287125 +-0.0767116 0.165247 -0.022942 +-0.0861936 0.111308 0.0401352 +-0.0238165 0.0854111 -0.0376407 +-0.0442161 0.123225 0.0243959 +-0.0175443 0.0460366 0.0510389 +-0.0272334 0.0902723 -0.0326005 +-0.0459359 0.168402 -0.00594095 +0.0355423 0.0512597 0.0315836 +0.0451079 0.0636949 -0.00183531 +-0.0368834 0.125578 -0.00482073 +0.0196258 0.0457587 -0.0217227 +-0.00773224 0.109619 -0.0221011 +-0.0514957 0.0876341 0.0455102 +-0.00269376 0.0613003 -0.0344696 +-0.0512049 0.147808 0.0143958 +0.0266901 0.106496 -0.0148024 +0.0383861 0.0476151 -0.00591592 +-0.0136895 0.0952904 -0.0330103 +0.0368491 0.0767795 0.0374896 +-0.029592 0.0522946 -0.0203629 +0.0482309 0.0500295 -0.00369862 +0.0381363 0.0794306 0.0358549 +-0.0677271 0.155796 -0.00229118 +0.026043 0.0392404 0.0305576 +0.0208388 0.126564 0.0173475 +0.0159735 0.0448127 0.0438765 +-0.0681757 0.118633 0.0523539 +-0.065068 0.136793 0.0410949 +-0.0454458 0.168254 0.00168996 +-0.0715222 0.142818 0.0455702 +-0.0604912 0.112522 0.03629 +-0.00074702 0.0712329 -0.0350931 +-0.0894331 0.150114 0.0121902 +-0.0185746 0.0381525 0.0151621 +0.0291213 0.0348096 0.00960912 +0.0404448 0.0985503 0.0271661 +0.0134712 0.0936014 0.0511282 +-0.021496 0.103017 0.0435858 +0.00918856 0.0342345 -0.00132638 +-0.0508332 0.0956285 -0.0221275 +-0.0613646 0.0394268 0.0439671 +0.0264379 0.0968548 0.0436578 +-0.0646669 0.0405364 0.0387423 +0.0125029 0.0475354 0.045933 +0.0412949 0.104257 0.00416372 +-0.00222052 0.117102 -0.0161156 +-0.00995662 0.169734 -0.0198047 +0.0200755 0.0399795 -0.0157069 +-0.0839165 0.110514 0.0395089 +-0.0546435 0.116042 -0.0146857 +0.0268767 0.0854059 -0.022529 +-0.0543926 0.0337363 0.0224962 +-0.049781 0.0841032 -0.0216622 +0.0431463 0.100109 0.00616795 +0.0393814 0.0780345 0.0341058 +-0.0162612 0.17862 -0.0260128 +-0.0335093 0.0676035 0.0406399 +-0.0176483 0.0352702 -0.0188352 +-0.031463 0.0519033 0.0373773 +-0.0803572 0.0803552 0.0319871 +-0.0320868 0.159267 -0.0129293 +0.0132853 0.0589897 0.0507165 +-0.0103631 0.180289 -0.0277342 +-0.0144925 0.0559441 0.0511232 +-0.0246444 0.0381166 0.0247786 +0.0170669 0.0871276 -0.028336 +0.00372554 0.105196 -0.0213905 +-0.0777857 0.156925 -0.0179137 +0.0578227 0.0710073 0.0178627 +-0.0582482 0.0336534 0.0128901 +-0.0520861 0.0545712 0.0266312 +0.0269849 0.113053 -0.00983991 +0.0429421 0.0467386 0.030224 +0.00548112 0.11414 0.0405028 +0.0607975 0.0637336 0.0101416 +-0.0895137 0.135181 0.0391853 +-0.0822803 0.139383 0.0462108 +0.00350363 0.0883757 0.0563643 +-0.0599112 0.109712 -0.0163845 +-0.0699244 0.107994 -0.0118147 +-0.073438 0.145781 -0.0138542 +-0.0702694 0.156361 0.0186365 +0.0365208 0.0713424 0.036933 +-0.0764811 0.141399 0.0471717 +-0.0338378 0.0943788 -0.02372 +-0.0185768 0.055451 0.0489119 +-0.0294962 0.107041 0.0398129 +0.0351663 0.0783387 -0.0157415 +-0.0823976 0.095314 0.0321564 +0.0458052 0.08902 0.00916777 +0.00466954 0.0341296 0.0180802 +0.012258 0.0751733 -0.0308354 +-0.0176564 0.0480544 -0.0295902 +-0.0487658 0.0811872 -0.020682 +-0.0375125 0.045091 0.0407522 +0.00960807 0.0375632 0.0322947 +0.0522688 0.0462249 0.00921199 +-0.0452834 0.0395877 -0.019291 +-0.0396931 0.126183 0.0200311 +-0.0903381 0.144712 0.0141544 +-0.0430213 0.0450576 -0.0153284 +-0.0539191 0.129665 -0.00510771 +-0.0384876 0.108386 0.0375357 +-0.0496388 0.0605583 -0.0113235 +-0.034501 0.115223 0.0328885 +-0.0540284 0.131061 -0.00500164 +-0.0147028 0.0389017 0.0333119 +-0.0207376 0.0641563 -0.0358205 +0.00590682 0.131658 0.0132863 +-0.0819436 0.154696 0.0145801 +0.0526661 0.0660937 -0.000184776 +-0.0526201 0.14007 0.0244025 +-0.0752504 0.177839 -0.0529463 +-0.0574955 0.0946379 0.0447737 +0.0456129 0.0904097 0.00518194 +-0.0282629 0.122524 0.022734 +-0.0680338 0.142566 0.0438693 +-0.0643033 0.0426016 0.0312522 +-0.0314971 0.102929 0.041974 +-0.00589664 0.0980966 0.0519993 +-0.0542782 0.132533 0.0338047 +-0.0911122 0.11473 0.0343167 +-0.0493972 0.140141 0.00739907 +-0.0577664 0.0485104 0.00767417 +-0.0629684 0.139576 0.0370615 +-0.0122087 0.128137 0.0240139 +0.00116984 0.129366 -0.00128907 +-0.039496 0.0634667 0.0415276 +-0.0427066 0.0696149 -0.0170299 +-0.0721201 0.149786 -0.0402916 +-0.0637423 0.168365 -0.0426884 +-0.0228169 0.0383283 0.0285633 +-0.0894925 0.143336 0.0131803 +-0.0408822 0.128708 0.0107294 +-0.043783 0.147719 0.00491206 +0.00912223 0.0833108 0.0554277 +-0.0543042 0.0335497 0.00301212 +-0.0544171 0.0333785 -0.00775516 +0.0295237 0.0727272 0.042682 +-0.0504982 0.112495 0.0358796 +-0.0240218 0.119915 -0.0108978 +-0.0535232 0.0556038 0.0117195 +-0.0480175 0.133707 0.00490199 +0.00583381 0.129313 0.0261699 +-0.0405566 0.149165 -0.00293165 +-0.0286765 0.0690744 -0.0314836 +0.0453693 0.0693828 0.00245115 +0.0581659 0.056561 0.00517446 +0.0192888 0.0651078 -0.0282476 +-0.0228892 0.0739252 0.0512281 +-0.0217183 0.113234 -0.017904 +0.0365187 0.0526805 0.0315096 +0.0490482 0.0539975 0.0303486 +0.0175085 0.114012 0.0373101 +-0.0328107 0.126843 0.0122027 +-0.0687814 0.0336983 0.00353162 +0.0220892 0.0906332 -0.0239505 +-0.0460528 0.122513 0.026245 +0.0381409 0.109688 0.00657231 +0.0368421 0.0742334 -0.0127504 +-0.0657975 0.0340784 0.0127357 +-0.0706216 0.146831 -0.0255714 +-0.0468292 0.091298 -0.0217206 +-0.0914681 0.144718 0.0171554 +-0.0624908 0.0343254 0.0238098 +0.0543739 0.0477987 0.0161989 +-0.0195403 0.1757 -0.0161256 +0.0224671 0.0343921 0.00678503 +-0.0654707 0.155271 0.00728456 +-0.0897135 0.12265 0.00431103 +-0.0501651 0.0361307 0.0461721 +-0.0901888 0.139114 0.0151891 +-0.0726107 0.156829 -0.0349095 +-0.0334964 0.0718545 0.0411869 +0.0106165 0.0644536 0.0539383 +0.0274263 0.0491525 0.0376576 +-0.0157908 0.169796 -0.0160148 +-0.0608326 0.17151 -0.0610901 +0.0136156 0.126814 -0.00267762 +0.0293325 0.0535401 0.0386956 +-0.0652579 0.153012 -0.0402459 +0.0264019 0.036087 0.0225582 +0.0101281 0.105858 -0.0202342 +-0.0674046 0.0833115 0.0429955 +-0.0312435 0.0538841 -0.0143722 +0.0424267 0.0441756 -0.00158684 +-0.0305089 0.0760274 0.0408429 +-0.0849899 0.127963 -0.0030064 +-0.0223249 0.0386602 -0.0135496 +0.0216012 0.112963 -0.0137495 +-0.0224297 0.0552774 0.0442986 +-0.093152 0.121537 0.0362834 +-0.0384463 0.166779 0.00239389 +0.0317419 0.0667553 -0.0187125 +-0.0127135 0.100022 -0.0239701 +0.0204112 0.0371925 -0.00568428 +0.0383001 0.0969495 -0.00880451 +-0.0500528 0.150184 -0.0037815 +-0.0578783 0.106898 -0.0179862 +0.0485378 0.0682762 0.00156381 +-0.0708965 0.0341323 0.00629169 +-0.0871174 0.110466 0.0103621 +-0.0235739 0.0944939 0.0470656 +-0.0164815 0.0515035 0.0485835 +0.0325428 0.0380502 1.57112e-05 +0.0385774 0.0888011 0.0348199 +-0.0628692 0.0445185 0.0382675 +-0.0572856 0.125533 0.0399888 +-0.0780066 0.0940671 0.0362827 +-0.0361012 0.160724 -0.0132118 +0.0200495 0.124902 -0.000599563 +0.0101263 0.107276 -0.0197522 +0.0224877 0.0961643 0.0466342 +-0.077715 0.0852782 -0.0115916 +-0.0164955 0.105778 0.0423459 +-0.0725318 0.101313 0.038599 +-0.0663565 0.0783826 0.0411592 +-0.0644378 0.17995 -0.0588828 +-0.0645973 0.171184 -0.0458828 +0.0111199 0.129735 0.0223368 +-0.018333 0.172741 -0.0161594 +-0.0864925 0.10492 0.00639597 +-0.0144943 0.0500942 0.0487331 +-0.0855601 0.095177 0.0282718 +1.67787e-05 0.0386604 0.0239291 +0.0109499 0.0344084 0.00259617 +-0.0270041 0.168274 -0.00938266 +-0.0378811 0.107099 -0.0200653 +0.060304 0.0664655 0.0101406 +-0.0478845 0.108472 -0.0188663 +0.0181085 0.0591163 0.0489014 +-0.0260899 0.0522789 0.0395517 +0.0049437 0.0984176 -0.0242128 +-0.0623314 0.0357831 0.0433788 +0.0110403 0.0725847 0.0546235 +-0.0864956 0.084691 0.0204775 +-0.00849993 0.0787667 0.0579153 +-0.0260008 0.0382709 0.000860974 +-0.06937 0.145758 -0.0234859 +-0.0314168 0.117929 -0.0127586 +-0.0261669 0.0378674 0.0174813 +-0.0832309 0.120353 0.049216 +-0.0617814 0.16156 -0.0355923 +-0.0779669 0.165862 -0.0278956 +-0.0698398 0.0922797 -0.0162924 +0.0483255 0.0503286 -0.00380134 +0.0451716 0.0889782 0.0181643 +0.0329815 0.112282 -0.00498623 +0.0279206 0.0916217 -0.0209795 +0.0155 0.11402 0.0377783 +-0.0105379 0.0431327 0.0497176 +0.0606167 0.0609422 0.00915424 +-0.0181983 0.18599 -0.0174024 +0.0189716 0.115037 -0.0139804 +-0.0590849 0.0644137 0.0318252 +-0.0819254 0.12582 0.0519232 +-0.0588398 0.0954803 -0.0203334 +-0.0674426 0.148384 -0.0326115 +0.0387628 0.10462 0.0262683 +0.00841723 0.129272 0.0256623 +-0.0196119 0.0364667 -0.0278852 +-0.0376923 0.162356 -0.000243841 +1.88808e-05 0.115368 -0.0182789 +0.0393962 0.0505525 -0.00668347 +-0.0116788 0.0555838 -0.0339192 +0.0363865 0.0713868 -0.0138007 +-0.0821651 0.110069 0.034903 +0.022728 0.117081 -0.0101857 +-0.0515389 0.0417461 -0.0105815 +0.0219588 0.123501 -0.00109075 +0.00735928 0.0960033 -0.0276522 +-0.00349428 0.119696 0.0379021 +-0.0470844 0.151656 -0.00519447 +-0.0242296 0.0941248 -0.0298734 +0.0152433 0.0658912 0.0518711 +-0.021804 0.0376594 -0.0181241 +-0.0133966 0.121962 -0.00916065 +0.0365536 0.108655 0.0265769 +-0.0668098 0.0880715 -0.0180091 +-0.0665181 0.171112 -0.0407548 +0.0493343 0.0532247 -0.0043679 +0.0423933 0.0901635 -0.00682346 +-0.0624126 0.150651 -0.0115734 +0.0373944 0.0505276 -0.00658166 +-0.0411461 0.162173 -0.0113613 +-0.065916 0.0662086 0.0305519 +-0.0289729 0.083488 0.0456837 +-0.000642523 0.0347913 0.0398677 +-0.0738147 0.065744 0.00631032 +0.00351431 0.0938625 0.0544725 +-0.0467733 0.12389 0.0269319 +0.0246632 0.123785 0.00595837 +-0.0715256 0.0958228 0.0413941 +0.00252922 0.0362636 0.0463395 +0.00948792 0.0963424 0.0500581 +0.0292035 0.0400739 0.0286474 +-0.0309481 0.0706991 -0.0284733 +-0.054091 0.152763 0.0215579 +0.0118527 0.105542 -0.0197545 +-0.0404793 0.0832528 0.0431634 +-0.0448438 0.0985036 -0.0215544 +-0.032014 0.0567822 -0.0123897 +0.00040853 0.0356817 0.00488121 +0.0447245 0.0861403 0.0231669 +-0.0426307 0.0338188 -0.00946517 +-0.0710495 0.141325 -0.00813095 +-0.0255896 0.182763 -0.0105092 +-0.0838169 0.107636 0.0253505 +-0.0796245 0.0859561 0.0353266 +0.0240034 0.0449703 0.0396985 +0.00450108 0.0716864 0.0560951 +-0.0676894 0.0750921 -0.0153176 +-0.0466572 0.0369109 -0.0172699 +-0.016529 0.0558872 0.0508401 +-0.087831 0.103641 0.0093887 +0.0272256 0.10745 0.0377741 +-0.0670064 0.0337953 0.0073865 +-0.0866888 0.0833263 0.0124872 +0.0152687 0.0779357 -0.0299953 +-0.0851819 0.152725 0.0105454 +0.000352424 0.0511166 -0.0306262 +0.0518495 0.0464359 0.0201911 +0.0554005 0.0553511 0.0254886 +-0.0886141 0.0928486 0.00844707 +0.0129712 0.130228 0.0115965 +-0.085549 0.104961 0.0233427 +0.0515991 0.0496316 0.0251833 +0.0131946 0.0878791 -0.0305989 +-0.0693376 0.131255 0.0489674 +-0.0660205 0.167997 -0.0305503 +-0.0666146 0.174697 -0.0480375 +-0.0293346 0.0347045 0.0427947 +-0.0553259 0.126836 -0.00601308 +-0.058583 0.0460291 0.0113967 +-0.0416277 0.0337441 -0.014735 +-0.0446642 0.0621749 -0.0132201 +0.0295862 0.120365 0.0134787 +-0.0697163 0.064282 0.022673 +-0.0805487 0.0789662 0.0306236 +-0.0787564 0.154933 0.00983696 +-0.0662707 0.14708 -0.0258685 +-0.0248167 0.0949702 -0.0267501 +-0.0407693 0.0826515 -0.0208197 +0.000514101 0.0346343 0.00952105 +-0.0533361 0.138123 0.0280776 +-0.0689277 0.115103 -0.00892086 +-0.0865224 0.0913375 0.0024428 +0.0232602 0.0790529 -0.0256674 +0.0296786 0.0679688 -0.0198342 +-0.0331127 0.123309 0.0239558 +0.0276403 0.118218 0.0284429 +0.00238303 0.0449286 -0.0261957 +-0.0928278 0.124236 0.0382657 +-0.0868685 0.11045 0.00936714 +-0.0254875 0.0959781 0.0438332 +0.0132252 0.0808221 -0.0308314 +0.035265 0.0591791 0.0368077 +-0.00944135 0.168135 -0.0197365 +0.0011864 0.12951 0.0259323 +-0.0139593 0.0967237 -0.0305143 +-0.00848922 0.0385737 0.0258802 +0.0562981 0.0619429 0.0011209 +0.0322546 0.0987343 -0.0145759 +-0.0268707 0.103016 -0.0234914 +-0.00655639 0.0384205 0.0209905 +-0.0296666 0.0774462 0.0418826 +-0.0626586 0.0676213 -0.0103966 +0.0374569 0.0904362 -0.0137042 +-0.0712181 0.161 -0.0439365 +0.0243668 0.0889213 0.0476805 +-0.0336134 0.0408899 -0.0298935 +-0.0404969 0.0916505 0.0425962 +0.0443454 0.0903358 0.0221636 +-0.0435232 0.163746 0.00524284 +-0.0649943 0.0623954 0.0235277 +-0.0613093 0.0593276 0.0181457 +-0.0717978 0.155398 -0.0409076 +-0.00868753 0.0584178 -0.0339256 +-0.0904383 0.119966 0.00529664 +-0.0601615 0.0333995 -0.00165181 +-0.0612252 0.0407891 0.0437895 +-0.0537348 0.0738508 -0.0172852 +-0.0709057 0.10512 -0.0125462 +-0.00333997 0.039253 0.0353398 +-0.0469903 0.145002 0.00194161 +-0.0250386 0.0659034 -0.0335362 +-0.023273 0.0382876 0.00502865 +0.0111228 0.0960826 -0.0257288 +0.0198113 0.0954368 -0.0230239 +0.038476 0.104075 -0.00282883 +-0.0843581 0.0883713 0.0286614 +-0.0930341 0.118841 0.0362969 +-0.0646767 0.146003 -0.0179612 +0.0284626 0.102127 0.0395666 +-0.0435018 0.113907 0.034675 +-0.0604863 0.0790224 0.042794 +-0.089042 0.112536 0.0205154 +-0.0524675 0.0344946 0.0345461 +-0.0848716 0.119101 -0.00207765 +-0.0120923 0.11442 -0.0172013 +-0.079929 0.151371 0.00121035 +-0.0920085 0.116136 0.0393096 +0.0361533 0.112569 0.0130564 +-0.0196629 0.125034 -0.00230889 +0.000499429 0.115573 0.0406664 +-0.0560183 0.147198 -0.00168648 +-0.0873616 0.110481 0.0113565 +-0.0416844 0.0636674 -0.0137203 +-0.0651889 0.153592 -0.00278678 +0.0471599 0.07398 0.0153485 +0.0404106 0.0873775 0.0321991 +-0.019434 0.184905 -0.0153275 +-0.0438294 0.0913555 -0.0224139 +-0.0527613 0.0797578 -0.020501 +-0.0314155 0.0651435 -0.021432 +0.00948509 0.0950229 0.0512669 +0.0346346 0.107297 -0.007625 +-0.0870053 0.0954387 0.00242783 +-0.0617312 0.142927 -0.00565867 +-0.0538929 0.14622 0.0244012 +0.0339044 0.115273 0.00366751 +0.049575 0.0693171 0.00251779 +-0.0861009 0.106274 0.00635995 +-0.00751182 0.075985 0.0578234 +-0.0761849 0.0933719 -0.0135017 +0.0266626 0.0672707 0.0437593 +-0.0314925 0.0932138 0.0444288 +0.0112937 0.0680868 -0.0307505 +-0.086045 0.141863 0.00720055 +0.000490707 0.111422 0.0424934 +-0.0516022 0.0502173 -0.00741774 +-0.0709386 0.131124 -0.00852217 +-0.0291841 0.125368 0.0164845 +-0.0012258 0.095852 -0.0315171 +-0.000697567 0.0641196 -0.0342689 +-0.0797379 0.0738711 0.0228323 +-0.0705682 0.0382102 0.00943236 +-0.0558807 0.102663 -0.0193944 +0.0262875 0.0835737 0.0468767 +-0.0206175 0.0364922 -0.0281092 +0.0306136 0.0779431 -0.0207534 +0.037492 0.0983062 -0.0097724 +-0.0861064 0.0806138 0.0174966 +-0.0488748 0.105594 -0.0196597 +-0.0499497 0.0724883 0.0409516 +-0.060435 0.131107 0.0389542 +-0.0197383 0.108898 -0.0213322 +-0.0328414 0.0943934 -0.0238538 +0.0071329 0.104451 -0.0211019 +-0.0904392 0.125398 0.00528343 +0.0579573 0.0676391 0.00414749 +-0.0890486 0.0915916 0.0214249 +0.0544885 0.0716156 0.00618127 +0.037936 0.0901639 0.0356574 +-0.0631289 0.155254 0.0269868 +0.0280038 0.120349 0.024295 +0.00325461 0.0697315 -0.0336623 +0.0198002 0.0768324 0.0515324 +0.0135718 0.0504901 0.0475195 +-0.0220331 0.041681 0.0538782 +-0.0322365 0.126297 0.00653811 +-0.020497 0.0855906 0.0563403 +0.0100844 0.123139 0.0340691 +-0.0917617 0.141982 0.0191718 +-0.00665267 0.0526646 -0.0325345 +0.0325469 0.0922927 -0.0176842 +-0.00490321 0.0383839 0.0141185 +0.0393963 0.049102 -0.00636122 +-0.0468295 0.0927337 -0.0216687 +0.0393484 0.0561243 -0.00568756 +0.0381042 0.0392738 0.00134927 +-0.02061 0.0653432 0.0492306 +-0.0644858 0.152894 -0.00250698 +0.0316363 0.118365 0.0113851 +-0.0625842 0.162383 -0.0563311 +-0.0126137 0.180121 -0.0236267 +-0.0562637 0.142432 0.0309288 +0.0389203 0.10838 0.0161659 +0.0468209 0.0708789 0.021127 +0.0153317 0.060873 -0.028643 +-0.067208 0.0447917 0.00368814 +-0.0638714 0.15469 -0.0385902 +-0.0624126 0.161536 -0.0416011 +-0.011049 0.124435 -0.00785173 +0.0143712 0.0493733 -0.0267066 +-0.0374862 0.0931566 0.0438456 +-0.0278525 0.0807805 0.0474761 +0.0573848 0.0670309 0.00292365 +-0.0304938 0.0960556 0.0449536 +0.0182602 0.127523 0.0192457 +0.0182204 0.080645 -0.0282763 +-0.00275795 0.0740872 -0.0359501 +-0.072697 0.155649 0.00759319 +-0.0857527 0.0792184 0.0135098 +-0.0604443 0.0456013 0.0296807 +-0.0528198 0.0927332 -0.0219739 +-0.0457202 0.0709417 -0.0164642 +-0.054497 0.0889964 0.0448823 +-0.0541353 0.147754 0.0254132 +0.05074 0.0503045 -0.00171178 +-0.0926993 0.124215 0.0352716 +0.00850767 0.0786 0.0556334 +-0.0141847 0.0405865 0.0511605 +-0.0500491 0.0345412 0.0367666 +-0.0744234 0.156022 0.0128056 +-0.0148381 0.0386367 -0.0157684 +-0.0896535 0.0916031 0.0184402 +-0.0279306 0.125506 0.00666413 +-0.0249827 0.0918474 0.0485489 +-0.0247746 0.0385687 -0.0102357 +-0.0718755 0.10648 -0.0114758 +0.0303733 0.115414 -0.00438737 +0.0390771 0.099844 -0.00681802 +-0.0601235 0.0447437 0.0425684 +0.0559507 0.0508031 0.00520531 +-0.087948 0.102288 0.00840013 +-0.0802939 0.0732789 0.00250413 +-0.00347452 0.114725 -0.0175669 +-0.0780015 0.155773 0.018849 +-0.0868392 0.0873072 0.00147849 +0.0114304 0.0346172 0.0371012 +-0.0154945 0.0925097 0.0555061 +0.0207547 0.10431 -0.0184628 +-0.0805113 0.153427 0.0283513 +-0.0133702 0.0343611 -0.0190243 +0.045363 0.0932019 0.00717004 +-0.0517619 0.079747 -0.0203928 +-0.011137 0.171308 -0.0197957 +-0.0797359 0.0706327 0.0105539 +-0.0435047 0.116629 0.0323741 +0.0461192 0.0786876 0.0190773 +0.0257679 0.0349257 0.0180133 +-0.0377436 0.127354 0.000111554 +0.0455391 0.0875946 0.0141649 +-0.0115776 0.0962625 -0.032007 +-0.0304054 0.0580102 -0.0194062 +-0.0519213 0.118323 0.0336042 +-0.0615165 0.15114 0.0355512 +-0.0268549 0.175688 -0.00910606 +0.0291872 0.0462618 0.034893 +-0.0828817 0.143196 0.00216401 +-0.0229243 0.0972075 0.044901 +-0.0420606 0.0344689 0.0332688 +0.00840712 0.0404044 -0.0234014 +-0.0584986 0.100161 0.0428821 +0.0267286 0.0521731 -0.0207566 +-0.0343564 0.043282 -0.028737 +0.035312 0.0840703 -0.0177861 +0.0167493 0.0874098 0.0506847 +-0.0706375 0.156126 0.0126907 +0.0395317 0.0596774 0.0306966 +0.0160357 0.0807986 0.0531419 +-0.0719071 0.105086 -0.0120336 +0.057752 0.0523416 0.0181873 +-0.0705862 0.166615 -0.0490027 +-0.069998 0.157611 -0.0031485 +-0.0629727 0.118457 0.044154 +-0.0098895 0.107351 -0.0224128 +-0.0668287 0.169972 -0.0351376 +-0.0538607 0.152062 0.0231076 +0.0286155 0.0795328 0.044942 +0.00747725 0.131195 0.0181386 +0.0525355 0.0678367 0.0261828 +-0.069983 0.033931 0.00665746 +-0.00449526 0.10588 0.044033 +-0.0647467 0.143415 -0.011401 +-0.0242451 0.0337053 -0.0224295 +0.0405945 0.102819 0.0221712 +-0.0253936 0.106122 -0.0223873 +-0.031866 0.126076 0.00521848 +-0.0903832 0.132413 0.0312232 +0.0270423 0.0648893 -0.0216756 +-0.0416036 0.125525 0.0208631 +-0.0642885 0.148287 -0.0250747 +0.043249 0.0705728 -0.00179391 +0.00750831 0.0772509 0.056126 +-0.0360471 0.125746 -0.0036679 +-0.0534999 0.0820142 0.0450601 +-0.0268076 0.0782799 -0.0366273 +-0.0630392 0.0336157 0.00836468 +0.00450283 0.0924607 0.0546761 +-0.0794816 0.0846149 0.0352279 +-0.0354976 0.116636 0.0319301 +0.0590094 0.0552651 0.0101755 +0.0177618 0.100614 -0.0224544 +0.0141872 0.0347155 0.0357788 +-0.0626395 0.0644043 -0.00619313 +-0.0472223 0.168222 -0.000777409 +-0.0688709 0.156258 0.0147705 +-0.00209707 0.130745 0.0203917 +0.0438165 0.0959355 0.0191615 +0.0272253 0.120021 -0.000250724 +-0.0623918 0.152158 -0.026581 +-0.0619803 0.153737 -0.02558 +-0.0110119 0.122536 -0.00980812 +-0.00845767 0.100229 0.0476033 +-0.053626 0.1255 0.0365054 +0.029243 0.0872327 -0.0208644 +-0.0561028 0.133503 -0.00512832 +-0.0536146 0.150855 0.0243962 +-0.0729449 0.0805494 0.0386997 +-0.0113093 0.0384672 0.00547553 +0.013929 0.0392001 0.0444158 +-0.0743245 0.179234 -0.0539852 +-0.0670834 0.168031 -0.0569976 +0.0269196 0.0418157 0.0333163 +-0.0261604 0.114813 -0.0155316 +0.054979 0.06227 -0.000302264 +0.0447631 0.0931576 0.00318223 +-0.028552 0.159576 0.000695282 +-0.0196334 0.0906851 0.0545345 +-0.0681661 0.173216 -0.0428508 +-0.0670035 0.166617 -0.0570134 +-0.00170857 0.0641356 -0.0344906 +-0.0302923 0.115032 -0.0157497 +-0.017789 0.0998203 0.0439009 +0.0575984 0.0711737 0.0088801 +-0.0559485 0.119826 0.0383628 +-0.0508832 0.106998 -0.0191626 +-0.0856518 0.096702 -0.000561949 +0.0433856 0.0475038 -0.0047769 +-0.0141839 0.177168 -0.0206609 +-0.0318261 0.0623615 -0.0184459 +-0.0694684 0.158126 -0.0509379 +-0.059088 0.0445923 -0.00517311 +-0.0680469 0.0887699 0.043444 +0.0413366 0.0588699 -0.00449648 +-0.0108613 0.16611 -0.0209706 +-0.0810695 0.111472 -0.000645954 +0.0236683 0.0535376 0.0428398 +-0.0525009 0.104252 0.0406803 +0.0178265 0.128119 0.0148069 +-0.0833287 0.0817012 -0.000498118 +-0.0582078 0.148218 0.0334722 +0.0469627 0.0735494 0.00823046 +0.0348898 0.0889372 0.0400127 +0.0544139 0.0478718 0.0102055 +-0.0519767 0.0343446 0.0277664 +-0.0526872 0.144684 0.0193835 +-0.0654577 0.0403952 0.0367257 +-0.0632766 0.146612 -0.0147592 +-0.0756638 0.0968147 0.0380937 +-0.0121766 0.169774 -0.0245851 +-0.0313173 0.115081 -0.0157968 +0.00550009 0.105744 0.0419393 +0.0170456 0.0808203 0.0528345 +0.00997537 0.129323 0.0247881 +-0.000565033 0.0348667 0.0451983 +-0.0170398 0.124093 -0.00535053 +0.0359746 0.112738 0.007259 +-0.0264982 0.112519 0.0362632 +-0.0108141 0.0841239 -0.038537 +-0.0464922 0.097353 0.0431423 +0.0456344 0.0820067 0.0201819 +-0.00765915 0.0388225 0.0294318 +0.00952232 0.057476 0.0527668 +-0.0114724 0.180094 -0.0295969 +-0.0324762 0.0778813 -0.0295332 +-0.0515001 0.0465582 0.0417907 +-0.0716564 0.0639047 0.0190638 +-0.00648988 0.10728 0.0440126 +0.0517118 0.048146 0.0235716 +-0.00973422 0.0712867 -0.0371391 +-0.0311873 0.0499402 0.0418672 +-0.0652548 0.0380623 0.0267185 +-0.0353491 0.0346157 0.0221204 +-0.00455763 0.115688 -0.0165869 +-0.0158711 0.0941172 -0.0338261 +-0.0307264 0.0510087 -0.0163552 +-0.0674749 0.0861001 0.0436947 +-0.00549495 0.0456998 0.0471564 +-0.0127624 0.0742651 -0.0384156 +-0.0667813 0.0354951 0.0323861 +-0.0650934 0.040468 0.0377689 +0.00949782 0.11825 0.0371477 +0.042476 0.0986857 0.0211679 +0.0134353 0.0833572 0.0528968 +-0.006265 0.0381462 0.0486516 +0.019505 0.108463 0.0397034 +-0.0531501 0.13113 0.0336749 +-0.0169066 0.174228 -0.0176024 +-0.0877346 0.144562 0.0345528 +-0.0620052 0.131132 -0.00795604 +0.00350354 0.0967589 -0.0284524 +-0.0379926 0.15214 0.00278328 +-0.0250008 0.0678945 0.0436439 +0.013488 0.120719 -0.0120957 +-0.0546814 0.0342953 0.0289953 +-0.0493523 0.128134 -0.0033313 +-0.00536457 0.0387134 0.026395 +-0.0301008 0.162274 -0.0148279 +-0.0520761 0.153139 -0.00390728 +-0.0312974 0.120401 0.0276066 +-0.072708 0.173064 -0.0373345 +-0.0634981 0.0847405 0.0443851 +-0.00748204 0.123738 0.0339317 +0.0398166 0.0726016 0.0329349 +-0.0204571 0.159751 -0.0120682 +-0.0398664 0.104215 -0.0203975 +0.006345 0.0351555 0.0445736 +-0.0295025 0.0974144 0.0445077 +-0.00148646 0.0489421 0.0507365 +-0.0158009 0.0813621 -0.039398 +-0.0661715 0.0383371 0.0290301 +-0.0520592 0.0517918 0.0296489 +0.0132683 0.0765435 -0.0305058 +0.0357248 0.113154 0.00859849 +0.0452751 0.0847797 0.0211588 +0.0408906 0.0942563 -0.00676992 +-0.0621992 0.16466 -0.0525894 +-0.0704991 0.101365 0.0396906 +-0.0514936 0.0959907 0.0439844 +-0.0738976 0.0662178 0.00410027 +-0.0308753 0.104365 -0.0222089 +-0.0454852 0.0411575 0.0440424 +0.0264018 0.0591975 -0.0228202 +-0.0372554 0.154082 -0.00855912 +-0.0104302 0.175693 -0.0238578 +-0.0581296 0.0583212 0.0178996 +-0.0237002 0.0610797 -0.032726 +-0.0366248 0.127943 0.00786237 +-0.00749367 0.0605601 0.0556586 +-0.0317091 0.0749949 -0.0294856 +-0.0617882 0.138121 0.0352393 +-0.0764283 0.117143 0.0518912 +-0.0476607 0.120291 -0.0131944 +-0.0617261 0.158412 -0.0335949 +-0.0794782 0.106106 0.0317497 +-0.00127622 0.127442 0.029403 +-0.0850735 0.0819457 0.0214598 +-0.088151 0.137836 0.0407884 +-0.0622605 0.152178 -0.0225796 +-0.0896207 0.132365 0.0409732 +-0.0392773 0.153597 0.0044688 +-0.0477636 0.0797421 -0.0198355 +0.0475024 0.06248 0.0300852 +0.0137309 0.0344041 -0.00431645 +-0.0864106 0.136323 0.00223079 +-0.0622483 0.0470201 0.00467011 +-0.0218601 0.0893132 0.0539604 +-0.0404866 0.0390699 -0.027317 +-0.0563767 0.0650155 0.0336358 +-0.022785 0.0727991 -0.0382731 +0.00745846 0.0952014 -0.0287983 +-0.0728877 0.143976 -0.0119757 +-0.0485361 0.130681 1.6802e-05 +-0.08227 0.0830732 0.0310042 +-0.0458007 0.0884477 -0.0220772 +-0.0674901 0.102816 0.040307 +-0.0295082 0.0987895 0.0437091 +0.0266247 0.0591987 0.0436528 +-0.0166425 0.0970062 0.0498004 +-0.0754488 0.151352 -0.0128993 +-0.0561187 0.04231 0.0196965 +-0.0125561 0.107483 -0.0218463 +-0.0258638 0.0987461 -0.0241399 +-0.0150968 0.0965608 -0.0303463 +0.0403869 0.0505617 -0.00671315 +-0.0618596 0.135275 0.0369058 +-0.00853806 0.120181 -0.0133625 +0.0152242 0.123558 0.0310525 +-0.0669104 0.112326 -0.011534 +-0.00121369 0.0389243 -0.000247464 +0.0599261 0.0581121 0.0171753 +-0.0104999 0.0842933 0.0575891 +0.0236959 0.120687 0.0298434 +0.0407626 0.105627 0.00616707 +-0.0204813 0.10165 0.0438784 +-0.0497999 0.0884036 -0.0217208 +0.0455191 0.0847794 0.00419259 +-0.0113995 0.128605 0.00179072 +-0.0808762 0.0733317 0.00350919 +-0.0634956 0.0804499 0.0432131 +-0.0737877 0.170302 -0.0290826 +-0.00649113 0.0718493 0.0579775 +-0.0445186 0.0533636 0.0386768 +0.0320623 0.104555 -0.0127247 +-0.0491177 0.138604 0.00740359 +0.0459251 0.0848195 0.0121712 +0.0423718 0.0547731 -0.00653415 +-0.0505603 0.0417939 -0.0107632 +-0.0551112 0.0477166 -0.00539308 +-0.0492183 0.150688 0.0111503 +-0.0868019 0.0886457 0.00149241 +-0.0414982 0.166749 0.00369508 +-0.00533161 0.123249 -0.0106624 +0.00612795 0.107304 -0.0203065 +0.023391 0.0605296 0.0460187 +-0.0778945 0.102117 0.0345146 +-0.0177322 0.108689 -0.0211068 +-0.0341359 0.168185 -0.0152479 +-0.0364811 0.0931828 0.0441998 +-0.0645148 0.15586 0.0250316 +-0.0133496 0.124356 0.0309811 +-0.053528 0.131291 -0.0047694 +0.0236875 0.0373106 0.0299772 +0.00806894 0.0972917 -0.0250353 +0.0518069 0.0518147 -0.00170668 +-0.0580149 0.0675718 0.0363481 +-0.0916942 0.124053 0.00727726 +0.0143227 0.0344255 0.0215932 +-0.0828034 0.0762521 0.011522 +-0.0523769 0.119775 0.034728 +-0.0380638 0.174118 -0.00995608 +-0.0515288 0.0559219 0.0167726 +-0.0665225 0.10009 0.04154 +0.0449219 0.0497223 0.0313654 +-0.00374083 0.069852 -0.0355987 +-0.0448162 0.12956 0.0195798 +0.00318984 0.0852564 -0.0341139 +-0.0901249 0.125637 0.04453 +0.0248625 0.12099 -0.00239034 +-0.0357073 0.03405 0.0117511 +-0.0461509 0.05879 0.0381434 +0.0389649 0.108275 0.00542368 +-0.0857362 0.141867 0.00617644 +-0.0755097 0.135846 0.0506323 +0.0384382 0.0954258 0.0328906 +0.00385238 0.131766 0.0125385 +-0.0277181 0.0382234 0.00237012 +0.0554262 0.0714159 0.00640835 +-0.0707971 0.168292 -0.02371 +-0.0131917 0.169758 -0.0239616 +-0.0344904 0.0661905 0.0406967 +-0.00154364 0.130277 0.00186507 +-0.0647696 0.148087 -0.0261392 +-0.0577571 0.0334518 0.000595927 +-0.0334995 0.0618586 0.0392638 +-0.0657123 0.171986 -0.0448274 +-0.0254896 0.049863 0.0466034 +-0.0207287 0.058287 -0.0332963 +-0.040488 0.088839 0.0428058 +0.00826686 0.0681716 -0.0316571 +-0.0382076 0.0431174 -0.0263315 +-0.0192007 0.0392753 0.0392298 +0.0446778 0.0701888 0.00161208 +-0.0681688 0.0340999 0.0104427 +-0.0891956 0.099693 0.0183885 +0.00250408 0.0856622 0.0573274 +0.00673484 0.0364109 -0.0131882 +-0.0273112 0.0917698 0.0451953 +0.0360152 0.072737 0.038003 +-0.0174841 0.0910963 0.0554741 +-0.0882831 0.114383 0.0443189 +-0.0562701 0.0534697 0.00668599 +0.0184737 0.104403 0.0439338 +0.0591195 0.067343 0.0203999 +-0.0464971 0.107057 0.0400682 +0.0224712 0.125479 0.00796738 +-0.00281596 0.0896133 -0.0355773 +-0.0892259 0.113441 0.0323782 +-0.0532781 0.0476794 0.0246524 +0.00120832 0.0811183 -0.0353756 +-0.0820812 0.0748515 0.0115294 +-0.0344414 0.153644 0.000910386 +-0.0915313 0.147463 0.0171482 +-0.0778811 0.12224 -0.00662917 +0.00275904 0.130985 0.0207146 +0.0333375 0.115599 0.0220283 +-0.0925663 0.116874 0.0234322 +-0.0461657 0.168264 0.000998904 +-0.0608088 0.148246 0.0367611 +-0.0740333 0.13404 0.0510058 +0.046183 0.0806404 0.0141758 +-0.0177485 0.0700027 -0.0382786 +-0.05252 0.0490121 0.0379722 +-0.0142459 0.168321 -0.0155387 +-0.0894247 0.0996886 0.0153976 +-0.0654783 0.0861634 0.0444498 +0.0323217 0.116577 0.0230638 +-0.0676059 0.141897 -0.00935244 +-0.0514978 0.10289 0.0412322 +-0.00575874 0.0741425 -0.036638 +-0.0913439 0.11607 0.03131 +-0.0313824 0.0877015 -0.0265568 +0.0373688 0.102607 -0.00785264 +-0.0106393 0.169838 -0.0190633 +-0.0716387 0.0675256 0.0265031 +-0.0396636 0.0340515 0.0270767 +-0.0779219 0.0717107 0.00150831 +0.0451585 0.0670735 0.000845212 +-0.045692 0.126639 0.0237789 +-0.0914166 0.131046 0.0292353 +-0.0845601 0.0832447 0.0254813 +-0.00465613 0.0540645 -0.0324247 +-0.0573264 0.15429 0.0261567 +-0.0776607 0.0817583 -0.0102119 +-0.0614708 0.165833 -0.0590275 +-0.0866007 0.129822 0.0479412 +-0.0751026 0.155922 -0.00200459 +0.0292911 0.0364248 0.021021 +0.0168648 0.0958851 -0.0235234 +0.0566532 0.0608369 0.0255651 +-0.0447794 0.128887 0.00190497 +-0.024583 0.0635737 0.0419612 +-0.0534745 0.0360014 0.0464895 +-0.0488506 0.0999451 -0.0218934 +0.00224668 0.0740592 -0.0351433 +-0.0223056 0.126998 0.0101726 +-0.0907871 0.14608 0.0151486 +-0.0506704 0.0680761 0.0375114 +-0.0689054 0.113678 -0.00975253 +-0.032497 0.0917926 0.0443017 +0.0282492 0.102359 -0.0164093 +0.0375206 0.0540908 0.0314327 +-0.00566586 0.0555015 -0.0328252 +-0.0896969 0.139298 0.033185 +-0.0707473 0.127025 0.0521985 +-0.0455052 0.162274 0.00622301 +-0.0188243 0.0868874 -0.0382929 +0.00890069 0.0988547 -0.0226736 +0.0103725 0.130878 0.016344 +-0.0568151 0.142191 -0.00256359 +-0.0576833 0.0660478 -0.00944709 +-0.0394154 0.128541 0.00978788 +-0.0112757 0.0392934 0.0501019 +-0.0875442 0.11045 0.0133403 +0.0108543 0.128955 0.0251156 +-0.0306705 0.0692801 -0.0274547 +0.0193368 0.0460939 -0.0219388 +0.0280428 0.0928381 -0.0202889 +0.0101954 0.0879315 -0.0314901 +-0.0425303 0.153621 0.00682011 +0.046342 0.0671736 0.000660587 +0.0133755 0.0508647 -0.0275026 +-0.0815821 0.0803018 0.0303913 +-0.059075 0.137911 -0.00597298 +0.0419587 0.0958192 0.0261617 +0.0444321 0.0482656 0.0306384 +-0.0444939 0.0519693 0.038747 +0.0141421 0.107244 -0.018655 +-0.0258198 0.0880859 -0.0357275 +0.0511643 0.0525875 0.0281258 +-0.0838035 0.0884157 -0.00457068 +-0.0075843 0.111951 -0.0206051 +0.020155 0.0344845 0.00437508 +-0.0141697 0.038751 -0.00641336 +0.0160515 0.039741 -0.0214719 +-0.0627129 0.161593 -0.024579 +-0.0329051 0.0359381 0.0496011 +-0.0738068 0.0892836 -0.0151913 +0.0299737 0.0934986 -0.0189639 +-0.0618436 0.129703 0.0404325 +0.0117043 0.110341 -0.0188996 +0.013386 0.0576661 0.0508541 +-0.0636966 0.117092 0.044917 +-0.0634835 0.0890243 0.0452141 +-0.0874124 0.136542 0.0428952 +-0.0391888 0.168166 -0.0121398 +0.0376532 0.101954 -0.00791483 +-0.0708338 0.143978 -0.0149516 +-0.0135013 0.0687469 0.0541774 +-0.0671166 0.134015 0.0451603 +-0.0645196 0.148285 0.0383203 +-0.0216796 0.18469 -0.0188168 +-0.00148992 0.070365 0.0570874 +-0.0291401 0.0875323 -0.0325902 +0.0251009 0.122815 0.00327552 +-0.0111221 0.0980696 -0.0279124 +-0.0635024 0.0918143 0.0447779 +-0.0887995 0.0901451 0.00746775 +0.0164935 0.0962515 0.0477962 +0.046272 0.0806446 0.00718674 +0.038459 0.094268 -0.00974763 +0.0100793 0.0873522 0.0550703 +0.0183745 0.0874107 0.0495162 +-0.0547819 0.0840722 -0.0215429 +0.0249849 0.0576546 -0.0237943 +0.0262469 0.11849 0.0293617 +0.0187045 0.0462587 0.0425837 +-0.0433933 0.123406 -0.0104784 +-0.0615139 0.0385816 -0.00827445 +-0.0234882 0.104381 0.0428298 +0.0334188 0.115464 0.00204907 +-0.0251305 0.0810774 0.0532367 +-0.0661661 0.0431586 -0.00127362 +-0.0689806 0.138464 -0.0078252 +0.0324954 0.0484967 0.0321634 +-0.0650217 0.154743 0.00396393 +-0.0615004 0.0818818 0.0435978 +0.0289072 0.10744 0.0367037 +-0.0720417 0.156813 -0.0379146 +-0.0232564 0.171248 -0.0127378 +0.0211195 0.109025 -0.0155233 +-0.0668614 0.150018 -0.036632 +0.0204284 0.122662 -0.00423372 +-0.0628194 0.162004 -0.0576316 +-0.0641553 0.168532 -0.0413683 +0.0278158 0.0649933 -0.0208789 +-0.0788364 0.0742331 0.0262211 +0.0527925 0.0505032 0.000257908 +-0.0738772 0.107826 -0.00969763 +-0.0819791 0.08171 0.030761 +-0.0904343 0.136488 0.021207 +-0.0584473 0.145323 0.0330944 +0.00225674 0.0697235 -0.0336823 +-0.0228155 0.081267 -0.0385568 +0.0290261 0.106116 0.036871 +0.0121361 0.105839 -0.0196306 +-0.0365486 0.12125 -0.0102225 +-0.070219 0.146984 -0.026659 +0.00749947 0.122404 0.035106 +-0.0234912 0.107132 0.0414501 +0.0116034 0.0355849 -0.021581 +-0.0896067 0.0902304 0.0134498 +0.0274272 0.0781922 -0.0230908 +-0.0228318 0.114095 -0.016802 +-0.0510675 0.0598803 0.0316706 +0.0525281 0.0730706 0.0188626 +-0.0503624 0.128323 -0.00347306 +-0.0758088 0.0906346 -0.0139136 +0.0428831 0.0902351 0.0261862 +-0.00171604 0.131316 0.0104838 +-0.0845537 0.143232 0.00516668 +0.0183451 0.0551894 -0.0280076 +-0.0914715 0.128331 0.0382421 +-0.0654644 0.148292 0.0388168 +0.025254 0.122206 0.00192061 +0.0102154 0.0850922 -0.0315035 +-0.0913446 0.12833 0.0392393 +-0.0282035 0.125211 0.0168448 +0.0435793 0.0677809 0.0261624 +-0.014506 0.114132 0.0394731 +0.0146525 0.0927004 0.0511905 +-0.0777124 0.0900603 0.0375253 +0.0426104 0.0723991 0.0281081 +-0.0165087 0.10859 0.0417725 +-0.0293809 0.118905 0.0298455 +-0.0747355 0.161794 -0.0126957 +-0.0194977 0.103001 0.0433214 +-0.0774975 0.111156 0.045792 +-0.0235187 0.0551838 0.0425567 +0.00826699 0.0696219 -0.0321852 +-0.0671246 0.042281 0.0101216 +0.0443577 0.0547836 -0.00632411 +-0.0771697 0.152833 -0.00289126 +-0.0455143 0.0335109 0.00302189 +-0.0154906 0.0744572 0.0558178 +0.0390604 0.0575755 -0.00514174 +-0.0300453 0.0861604 -0.0315778 +0.0243112 0.0999667 -0.0198415 +0.0337476 0.0534432 0.0345417 +-0.0207506 0.0685447 -0.0377382 +-0.0883977 0.0983242 0.022387 +-0.043533 0.162269 0.00566221 +-0.0580451 0.047259 0.00941407 +-0.0435244 0.129538 0.0127129 +-0.0129572 0.163516 -0.016687 +-0.018238 0.0985224 -0.0244062 +-0.0468429 0.132502 0.00641278 +-0.012834 0.128656 0.00349339 +-0.00949586 0.0938956 0.0554931 +0.0405174 0.0829825 -0.0107762 +-0.0306755 0.0409906 0.0514223 +-0.0887381 0.139163 0.03848 +-0.0639163 0.105371 -0.0163736 +0.0319159 0.0876168 0.0427503 +-0.0165553 0.128252 0.0064647 +-0.0695817 0.168848 -0.0261289 +-0.0702082 0.141157 0.0460159 +0.0179624 0.0489942 0.0433049 +0.0363477 0.102053 0.0316389 +-0.029898 0.0385093 -0.0112051 +-0.0687619 0.169445 -0.0540038 +-0.0726588 0.143932 -0.0130219 +0.0162319 0.0849386 -0.0291053 +-0.0620358 0.136971 -0.00707833 +0.0166416 0.0740317 0.0522091 +0.0213347 0.0607071 -0.0262571 +-0.0576194 0.143675 -0.00218012 +-0.0913297 0.148826 0.016141 +-0.0751782 0.152724 -0.0149145 +-0.062838 0.153641 -0.0115615 +-0.0579073 0.152669 0.031812 +-0.0401847 0.173392 -0.00391542 +0.0166876 0.0475243 0.0432195 +-0.0393167 0.0432044 -0.0243027 +0.00658649 0.0945677 -0.0301242 +-0.00883076 0.130134 0.0179537 +-0.0248377 0.0867614 -0.0367865 +0.0135609 0.0343729 -0.0176058 +-0.0367327 0.0739624 -0.0182558 +-0.0891756 0.088886 0.0174542 +-0.0869535 0.131154 0.0468504 +0.00298644 0.131511 0.0079308 +-0.0116778 0.0541503 -0.0336719 +-0.00992638 0.128404 -5.81123e-05 +-0.0544374 0.131586 -0.00508481 +-0.0384968 0.104212 0.0394832 +-0.074384 0.0726496 -0.00763941 +-0.0530656 0.150158 -0.00286677 +-0.0166345 0.0465837 -0.0289175 +0.0567453 0.0707667 0.0204115 +0.0381172 0.0659142 -0.0117557 +0.00256341 0.131601 0.00920655 +0.0391019 0.106936 0.00217583 +-0.0480338 0.0685335 0.039429 +-0.0794876 0.0745597 -0.0035364 +-0.0248661 0.101609 -0.0237851 +-0.0647841 0.0448471 0.00913709 +-0.0446647 0.117939 -0.0147658 +-0.0152743 0.180101 -0.0270399 +-0.0859599 0.106341 0.0203569 +0.0111873 0.0893276 -0.0308633 +-0.0922566 0.126816 0.00926569 +-0.0618365 0.166237 -0.0545929 +0.0181719 0.0795251 0.0527143 +-0.0684871 0.120374 0.0527878 +-0.0476953 0.0723623 -0.0159721 +-0.0472614 0.125357 0.0280089 +-0.0494961 0.113894 0.0347794 +-0.0374992 0.0847101 0.0439351 +-0.0404923 0.0620428 0.0412639 +0.0609826 0.0637492 0.0111528 +-0.0849504 0.136625 0.0461206 +0.0337121 0.104741 0.0331059 +-0.00864132 0.0907031 -0.0362798 +0.00988706 0.0373676 0.0450724 +-0.024511 0.0782394 0.0527049 +-0.0716377 0.0368114 0.00909586 +-0.0832904 0.111663 0.0440643 +-0.0156647 0.109623 -0.0201068 +-0.0766606 0.163806 -0.0339802 +0.0165486 0.0631544 0.0502063 +-0.0753023 0.155004 0.00375308 +0.039051 0.0380783 0.00858362 +0.0420573 0.0943632 -0.00379153 +-0.0924935 0.124207 0.0332695 +-0.0745678 0.155931 0.022959 +-0.0348878 0.0336855 0.0122448 +-0.0755817 0.14859 -0.0148673 +-0.0712419 0.0628661 0.0147709 +-0.0722512 0.170824 -0.0490235 +-0.044945 0.146638 -0.00064718 +-0.0327132 0.0383899 -0.00426549 +-0.0656128 0.0626699 -0.00283823 +-0.0615924 0.156857 -0.0275883 +-0.0306139 0.051126 0.0398517 +-0.0552831 0.0478834 0.0286656 +-0.0825962 0.0869865 -0.00556699 +-0.0743429 0.0777095 0.0359578 +-0.00912413 0.125328 0.0309758 +-0.0877256 0.112462 0.0226926 +-0.0624682 0.148372 0.0373168 +-0.0772099 0.0954309 0.0368548 +-0.0657805 0.04031 0.0356744 +0.0390337 0.102562 -0.00454148 +-0.0218167 0.0770677 -0.0388569 +-0.013694 0.165443 -0.0129401 +-0.0242656 0.0588495 -0.0313753 +-0.0201769 0.16108 -0.00474531 +-0.0746468 0.151291 -0.0288803 +-0.0870878 0.147265 0.0324302 +-0.0667973 0.0823343 -0.0181512 +-0.0894818 0.137913 0.0311948 +0.0410937 0.100015 0.0241739 +0.0260496 0.0420955 0.0353242 +-0.0497977 0.134944 0.0250398 +-0.0824554 0.0748386 0.00652396 +-0.0420037 0.0449364 -0.0183222 +-0.00587956 0.107379 -0.0226761 +-0.0298783 0.0719759 -0.0315267 +-0.0649016 0.118019 -0.00923352 +-0.0461849 0.131841 0.0072241 +-0.0384968 0.066293 0.0418062 +-0.0375363 0.128085 0.0104763 +-0.0684218 0.173931 -0.0443685 +-0.0921191 0.131045 0.0262423 +-0.0269088 0.0720784 0.0425891 +-0.0318614 0.109962 -0.0183828 +-0.0576346 0.139576 0.0324737 +-0.0582272 0.151065 0.033498 +-0.0824187 0.0788859 0.0267668 +-0.0386191 0.0474546 -0.0163861 +0.0266281 0.0902434 0.0456585 +-0.00674435 0.0340208 -0.0192827 +0.0167681 0.0348096 -0.0116543 +0.00555478 0.102979 0.0445124 +0.0101351 0.0346886 0.0403762 +-0.0715049 0.147007 0.0421623 +0.0583177 0.0551766 0.00716644 +-0.0774854 0.142838 0.0458543 +-0.0630637 0.0343143 0.0307056 +-0.00979508 0.122843 -0.0101629 +-0.0497184 0.0723081 -0.0156401 +0.0463136 0.0660623 -0.000202599 +-0.0455839 0.0490621 -0.0101677 +-0.0746807 0.110131 0.0436879 +-0.0107636 0.0728162 -0.0377336 +-0.0155087 0.105817 0.0426846 +-0.0419504 0.0338103 -0.0111665 +0.0243299 0.0661738 -0.0239819 +0.0195943 0.041435 -0.0196763 +0.0590873 0.0566489 0.0191831 +-0.0828908 0.120639 -0.00384458 +0.0299951 0.111426 0.0329993 +-0.0685146 0.033856 -0.00470573 +-0.0492135 0.140151 0.00839688 +-0.0489146 0.121146 0.0309679 +-0.00870224 0.0627847 -0.0356447 +-0.086772 0.140601 0.0407491 +-0.0293203 0.0381642 0.0309659 +-0.0330003 0.0497903 -0.0153502 +-0.0425517 0.127843 -0.00110505 +0.0328934 0.0381571 -2.41096e-05 +-0.0525195 0.0426931 0.0456595 +0.021748 0.0349954 0.0225893 +0.00827474 0.123868 -0.00945393 +-0.029563 0.0377844 -0.01791 +-0.0370175 0.163827 -0.00102436 +-0.0664999 0.101466 0.0412188 +0.0064937 0.048929 0.05087 +0.0287604 0.121079 0.0103057 +0.0252285 0.11379 -0.0106368 +-0.0599544 0.0581084 0.014112 +-0.062196 0.154993 0.0273195 +-0.0901963 0.136492 0.0222062 +0.0243441 0.0535282 0.0420575 +-0.0779175 0.0954136 0.0361479 +0.0233436 0.112218 -0.0129499 +-0.0707139 0.0721775 0.0349299 +-0.0640765 0.0658063 0.0313225 +-0.012499 0.112778 0.04085 +0.00184795 0.0345666 0.017115 +-0.0706528 0.0621972 0.0100461 +-0.0885678 0.139164 0.0111992 +-0.0188224 0.0347384 0.0467634 +-0.0867734 0.103584 0.00638913 +0.0585617 0.0692487 0.0195963 +-0.0597919 0.0868174 -0.0202685 +0.00547344 0.0964656 -0.0281399 +0.0206378 0.123881 0.0271063 +-0.0699457 0.0641869 0.00125597 +-0.0625615 0.156051 0.017016 +-0.0417544 0.0339701 -0.0279962 +-0.0649712 0.129694 -0.00875388 +-0.0862104 0.107661 0.0103578 +-0.0932554 0.121405 0.0112928 +-0.0354965 0.0533413 0.0383699 +-0.0288938 0.0821008 0.0456772 +-0.0504899 0.115263 0.0337703 +0.0589314 0.0635744 0.022157 +-0.0186162 0.0391183 0.0377018 +-0.00206852 0.0346139 0.0433223 +-0.0274904 0.108416 0.0392888 +0.0114791 0.0353993 0.0291949 +0.0231094 0.1217 -0.00313916 +-0.0577454 0.0767844 -0.0191155 +-0.00909377 0.175718 -0.0267745 +0.0517415 0.0673755 0.000499527 +-0.0128851 0.164546 -0.0183954 +-0.0673534 0.170861 -0.0570311 +-0.0929853 0.13101 0.0212315 +0.0234643 0.0889079 0.0481435 +-0.088271 0.126713 0.00126975 +-0.0657845 0.0809163 -0.0181411 +-0.0623578 0.139562 0.0361839 +0.0537838 0.0608937 0.0284739 +-0.0417084 0.0681156 -0.0160245 +0.0391698 0.101249 -0.00580082 +0.0314319 0.059214 0.0400505 +-0.0609535 0.135292 0.0364528 +-0.000337321 0.0338454 -0.0216338 +-0.0194278 0.169807 -0.0142312 +-0.0348191 0.0886631 -0.024431 +0.0343015 0.0925788 -0.0159761 +-0.0484766 0.166987 4.90724e-06 +-0.0665297 0.149283 -0.0337543 +-0.0801184 0.0845811 0.0344552 +-0.0728936 0.109289 -0.00959602 +-0.0631344 0.177233 -0.0567528 +-0.0405211 0.16525 0.00379284 +-0.0231365 0.166757 -0.0180638 +0.00733914 0.0539337 -0.0304234 +-0.0448725 0.105637 -0.0203982 +-0.0120489 0.177175 -0.0228491 +-0.0935183 0.117402 0.0193034 +-0.0218743 0.178667 -0.0141782 +0.0371376 0.0728556 -0.0127896 +0.00251304 0.0828672 0.0572444 +-0.0659599 0.128235 -0.00885739 +0.0572369 0.0523165 0.0201815 +0.00234985 0.1177 -0.0168004 +0.0136405 0.0534411 0.0494225 +0.0440001 0.081852 -0.00180195 +-0.0352323 0.0337248 0.00491425 +-0.0852903 0.152844 0.0238067 +-0.0841107 0.0938743 -0.00455389 +-0.0327087 0.156604 0.00170747 +-0.0136478 0.0384232 0.0249573 +0.0203982 0.126887 0.0157559 +-0.0256832 0.0878506 0.050771 +-0.0859766 0.117044 0.000228439 +-0.0275277 0.0660102 0.0388181 +0.0386899 0.0941002 0.0332667 +-0.0072203 0.0994662 -0.0253456 +-0.0387089 0.068094 -0.0155018 +-0.0447414 0.149173 0.00704529 +-0.037003 0.126393 0.0195465 +-0.0691196 0.118603 0.052746 +0.0126876 0.0376693 0.0445214 +0.00235997 0.0496442 -0.0301148 +-0.0852421 0.0804972 0.00551565 +-0.0315104 0.105689 0.0403731 +0.045017 0.0410596 0.00889517 +-0.0645229 0.0335011 -0.00443342 +-0.0237309 0.092173 -0.0338912 +-0.0696939 0.158144 -0.0499358 +-0.00649106 0.116924 0.0392844 +0.0203532 0.0579488 -0.0270415 +0.0454669 0.0761165 0.0216249 +-0.0776599 0.103464 0.0342449 +-0.0732 0.113624 0.050147 +-0.0760799 0.147225 -0.00886324 +0.0300894 0.118197 0.0250757 +0.0134949 0.103141 0.0462202 +-0.0890108 0.142042 0.0341592 +-0.0804084 0.0719394 0.00662383 +-0.0695221 0.143851 -0.0150076 +-0.0608967 0.108264 -0.0166058 +0.024601 0.0954054 -0.0210454 +-0.022965 0.108799 -0.0212234 +-0.0611808 0.060116 0.0210055 +0.0302694 0.104198 -0.014346 +-0.0556068 0.119255 -0.0119973 +0.0521834 0.0709362 0.0231159 +-0.0314011 0.159502 0.00180977 +-0.0393243 0.172677 -0.00992732 +-0.0273795 0.0859709 -0.0356537 +-0.0158141 0.084157 -0.0391976 +-0.0748503 0.150353 0.0378605 +-0.0898842 0.145774 0.0282412 +-0.0830081 0.135296 -0.00152379 +0.00239673 0.0404932 -0.0244502 +0.0427154 0.0482477 0.0316879 +-0.0266384 0.166791 -0.00886205 +0.0140069 0.0433574 0.0445182 +-0.0554949 0.102938 0.0419937 +-0.0535677 0.121244 0.0365515 +-0.091536 0.147482 0.0221363 +-0.0926871 0.118696 0.0103064 +-0.0944412 0.121464 0.0182801 +-0.0562674 0.0521079 0.00770249 +0.0268173 0.0563551 0.0421393 +0.0126767 0.102031 -0.0220157 +-0.0753389 0.14722 -0.0108566 +-0.0856054 0.119006 0.0487694 +-0.0533885 0.122494 -0.00938247 +0.0431078 0.0438619 0.0262578 +-0.0605291 0.0337655 0.01588 +-0.0126252 0.045057 -0.0279244 +-0.045035 0.131096 0.00921538 +-0.0885624 0.127032 0.0457658 +0.040497 0.0569389 0.0314027 +0.0364907 0.111851 0.00455337 +-0.0834729 0.144593 0.00316535 +0.0433385 0.080395 -0.00378638 +-0.0318429 0.0944059 -0.023975 +-0.0484939 0.0747239 0.0424157 +-0.0110217 0.175722 -0.0231509 +0.000137104 0.104495 -0.0221519 +-0.0521218 0.0553341 0.025863 +0.0390662 0.103279 0.0267541 +-0.0365034 0.105591 0.0389607 +0.0135363 0.0347941 0.0319644 +-0.0857201 0.113489 0.0456231 +-0.0225205 0.114038 0.037332 +-0.0424861 0.107068 0.0398635 +-0.0498903 0.161248 0.00701432 +-0.0261589 0.0660162 -0.0325063 +-0.061193 0.167783 -0.0585846 +-0.0153476 0.186173 -0.0245951 +-0.0220085 0.0386415 -0.0116054 +-0.0746541 0.0660086 0.0112783 +-0.0857094 0.107615 0.00636703 +-0.000110081 0.106984 -0.0213197 +-0.0293764 0.039648 0.0531021 +0.028771 0.0495105 -0.0157345 +-0.0168713 0.184583 -0.0192109 +-0.0517714 0.14934 0.0163945 +-0.059475 0.0776368 0.0428908 +-0.0109445 0.0385116 0.00732721 +-0.0636281 0.177112 -0.0556446 +-0.074576 0.0901236 0.0400162 +0.0161292 0.0604031 0.0495734 +0.022982 0.114019 0.0351746 +0.0259399 0.098006 -0.0197455 +-0.0097165 0.0698878 -0.0366754 +-0.069561 0.132665 0.0486469 +-0.0530949 0.0350628 -0.012244 +-0.0680607 0.153823 -0.0498908 +-0.0135439 0.125168 0.0294386 +-0.00340282 0.12679 -0.00651364 +-0.0391911 0.149452 0.000405422 +-0.0764653 0.177807 -0.0519745 +-0.0287178 0.121983 -0.00700749 +-0.0619687 0.155933 0.0215789 +-0.0411389 0.0448599 -0.0213399 +-0.0553956 0.0560936 -0.00341211 +-0.0930152 0.116045 0.0163142 +-0.0538732 0.0634525 0.0320061 +-0.0265911 0.123944 0.0203778 +0.0521155 0.073659 0.0142686 +-0.0733241 0.158247 -0.0319134 +-0.0109096 0.167211 -0.0224966 +-0.0387656 0.0459335 -0.0222844 +-0.0438685 0.104239 -0.0209341 +-0.0404958 0.0464911 0.0408136 +-0.0546568 0.133929 0.033262 +-0.0875345 0.0914089 0.00446769 +0.0213976 0.0505253 -0.0237217 +0.00734362 0.0524803 -0.0298755 +0.0300864 0.0686462 0.0416997 +0.0343005 0.110021 0.028645 +0.0541591 0.0648613 0.0272743 +-0.0267629 0.124714 0.018819 +-0.084006 0.130916 -0.00261237 +-0.032464 0.126152 0.0167563 +0.0411083 0.0816433 -0.00876203 +0.0569799 0.0538694 0.0224893 +-0.0104937 0.0502816 0.0505289 +-0.0809192 0.0899278 0.0336764 +-0.0706578 0.10688 0.0373417 +-0.0634399 0.160562 -0.0195565 +-0.0491873 0.165537 -0.00392571 +-0.0506864 0.137014 0.00141591 +0.0414602 0.0985756 -0.00280597 +-0.0725308 0.161023 -0.0389355 +-0.0593508 0.0339548 0.0212701 +-0.0724089 0.155986 0.0106072 +0.0454654 0.0819915 0.0211715 +-0.0231673 0.169718 -0.0195033 +0.014393 0.129494 0.0163965 +-0.0185111 0.0499058 0.0467842 +-0.0180519 0.128104 0.0102643 +-0.0161793 0.169751 -0.0220442 +0.0178585 0.0957539 -0.0234025 +0.0277062 0.122023 0.0113437 +-0.0356288 0.0533886 -0.010251 +-0.00862621 0.0394649 0.0376552 +-0.0708134 0.0624523 0.0134268 +-0.0338786 0.104305 -0.0212068 +-0.0471517 0.160622 -0.00754132 +-0.0925898 0.124211 0.034269 +-0.0584616 0.0717087 0.039721 +-0.0146591 0.0511639 -0.0318396 +-0.0607891 0.0597911 0.00342454 +0.0222547 0.0819067 -0.0260667 +0.0230644 0.109683 -0.0142211 +-0.0844174 0.110829 0.0409213 +-0.0687289 0.0779401 -0.0161359 +-0.0752643 0.0941545 0.0391883 +-0.0876028 0.105024 0.0163629 +-0.077844 0.114867 -0.00473455 +-0.0325542 0.0341026 -0.0206973 +-0.0589604 0.0340153 0.0230639 +-0.00211759 0.125578 0.0320366 +0.0126989 0.0342761 -0.010037 +0.013184 0.0740073 0.0542309 +-0.0477691 0.130137 0.000614804 +-0.0718381 0.155405 -0.0399144 +-0.0622568 0.148888 -0.00391238 +-0.0159434 0.0385311 0.027994 +0.0373005 0.103362 0.0294506 +-0.02276 0.093942 -0.0316991 +-0.0520122 0.14159 0.0203687 +-0.082015 0.110886 0.0432009 +-0.0745865 0.0720219 0.0307608 +-0.00953059 0.096141 -0.0318625 +-0.0495789 0.046041 -0.00928879 +-0.00423381 0.0382248 0.0479393 +-0.0382126 0.169665 -0.0124129 +0.0318584 0.0981802 0.0392129 +-0.0314643 0.126198 0.0141678 +-0.0622546 0.152185 -0.0195775 +-0.0424907 0.0831788 0.0422885 +-0.0205087 0.18589 -0.0190712 +-0.00369262 0.0366899 0.0482034 +-0.0197122 0.0583602 -0.0339067 +-0.0106092 0.0434444 -0.026227 +0.0245832 0.0562081 -0.0237654 +-0.0891532 0.121635 0.0465292 +-0.0629277 0.161435 -0.0535909 +0.047295 0.0711844 0.0046334 +-0.0417522 0.0782987 -0.0193601 +-0.000496629 0.0828922 0.0574621 +-0.0320822 0.0335961 -0.0276233 +-0.0571072 0.154583 -0.000558004 +0.0584978 0.0634546 0.0229811 +-0.0581231 0.149655 0.0336366 +-0.0619701 0.160031 -0.0245798 +-0.0800787 0.0980611 0.0339873 +-0.0219645 0.0403079 0.0539432 +-0.0699065 0.110817 -0.0106385 +-0.0725366 0.154032 -0.0369032 +-0.0224974 0.0498852 0.046496 +0.00485548 0.0339942 -0.0207847 +-0.0614772 0.0338873 0.0155724 +0.00946392 0.0472926 0.0483305 +-0.019502 0.109944 0.0407387 +-0.0539465 0.0486826 0.012352 +-0.0355502 0.175589 -0.0109785 +-0.0784832 0.155333 0.0128492 +0.0266099 0.122879 0.0123678 +-0.0472066 0.134653 0.0142236 +-0.0078767 0.103255 -0.023393 +-0.0504989 0.101536 0.0421291 +-0.0266231 0.0450263 -0.028096 +-0.0916243 0.131038 0.0282288 +0.0125747 0.0445985 0.0442752 +-0.0196537 0.0480066 -0.0290701 +0.0172432 0.108764 -0.0171862 +-0.0295071 0.0635474 -0.0264265 +-0.0620034 0.040777 0.0431481 +-0.00243593 0.113721 -0.0185019 +-0.0630177 0.135513 -0.00745136 +0.0433285 0.0874073 -0.00479371 +-0.0154888 0.0688106 0.054717 +-0.0882956 0.116235 0.0458325 +-0.0494969 0.0946343 0.044743 +-0.0619637 0.147832 -0.00431835 +-0.092816 0.124239 0.0392636 +-0.0629366 0.147438 -0.0146052 +-0.0782928 0.163856 -0.0319501 +-0.064798 0.174285 -0.0502768 +-0.0112267 0.038611 -0.000125945 +-0.0820175 0.148708 0.00217249 +0.0401192 0.0979552 0.0282751 +-0.0877344 0.132461 0.0447656 +-0.050513 0.143196 0.0143929 +0.0136958 0.0672461 0.0531523 +-0.0608764 0.033777 0.0140174 +0.00552563 0.0813962 0.0561869 +-0.0768476 0.148423 0.040238 +-0.0306152 0.0552238 -0.0173804 +-0.0567885 0.123073 -0.00794084 +-0.0255089 0.119394 0.0308336 +0.0223261 0.116663 0.0342169 +-0.0475261 0.0335634 -0.00837623 +-0.0582936 0.157998 0.00361947 +0.0051303 0.105879 -0.0208781 +-0.00896496 0.0383664 0.01874 +-0.0444005 0.0336982 -0.00787213 +-0.00659427 0.0391448 -0.0257394 +-0.0414965 0.0424145 0.0425934 +-0.0846517 0.135301 0.0472783 +-0.0634992 0.0973124 0.0426152 +-0.0488679 0.135513 0.00441971 +0.037597 0.0883595 -0.0147642 +-0.00186878 0.0388962 0.0287527 +-0.028023 0.0380941 0.0277005 +-0.0474992 0.0718408 0.0410603 +-0.0899231 0.113261 0.00935255 +0.044663 0.094574 0.0141596 +-0.0613242 0.174126 -0.0596453 +0.0131192 0.0913894 0.0524895 +0.0569982 0.0642691 0.00177262 +0.029911 0.120086 0.0121698 +-0.0341992 0.124637 -0.00378015 +-0.0714932 0.121802 0.0535223 +-0.060211 0.120578 -0.00928669 +0.0514409 0.0718132 0.00596213 +-0.0055446 0.0384588 0.0102869 +0.0401137 0.0933035 -0.00871241 +-0.077868 0.12372 -0.00684832 +-0.0438994 0.148485 -0.00356582 +-0.0478093 0.0898718 -0.0219802 +-0.050356 0.0501549 0.0156949 +-0.044116 0.168361 -0.0078879 +0.0274031 0.12156 0.0212208 +-0.0198084 0.119865 -0.0108751 +-0.00808629 0.0392239 0.0361848 +-0.074679 0.177203 -0.0452121 +-0.0717079 0.162415 -0.0429474 +-0.0817249 0.153192 0.027965 +-0.0830361 0.0952877 0.0313817 +-0.0410879 0.12806 0.000341883 +-0.0268762 0.104433 -0.0231038 +-0.028867 0.0620809 -0.0264195 +0.0400441 0.0834026 0.0333734 +0.00148401 0.0427923 0.0460657 +-0.021597 0.124211 0.0236359 +-0.0493581 0.0389276 0.0456407 +-0.0251636 0.119759 -0.0107128 +-0.0305455 0.0776911 -0.0335901 +0.0434944 0.0719976 -0.00179535 +-0.0730641 0.148297 -0.027137 +-0.0403032 0.0335749 -0.0236075 +-0.0838696 0.117633 -0.00194246 +-0.0183958 0.0360837 -0.0274195 +0.0306925 0.119003 0.0181751 +-0.0287719 0.0876257 0.045371 +-0.0150862 0.116786 -0.0157023 +-0.0226105 0.0393974 -0.0288175 +-0.00549593 0.114185 0.0409403 +0.0172148 0.0820814 -0.0286624 +0.0204946 0.0878829 0.0490965 +0.0144377 0.119508 -0.0127985 +0.0084105 0.0389663 -0.0233493 +0.042717 0.0705281 -0.00378792 +-0.0721585 0.0349122 0.00711943 +-0.0700117 0.176166 -0.0463861 +-0.0559881 0.0594067 0.0225062 +-0.0934924 0.121416 0.0122906 +0.0386755 0.101225 -0.00680717 +-0.00386806 0.105937 -0.0224388 +-0.0104995 0.091174 0.0564817 +-0.0012394 0.131315 0.00922853 +-0.0497873 0.0855205 -0.0216876 +-0.0168713 0.104463 -0.0227606 +0.0101956 0.0865002 -0.0314726 +-0.0534959 0.108443 0.038977 +-0.0548951 0.0610993 0.0270145 +-0.0755046 0.137255 0.0498073 +-0.0485754 0.0489523 -0.00913959 +-0.0331264 0.163719 -0.0148995 +-0.00945074 0.100225 0.0471086 +-0.0342862 0.0340473 0.0246456 +-0.0294128 0.0335741 -0.023325 +-0.026685 0.0349864 0.0500364 +-0.061923 0.12237 -0.00883821 +0.0501668 0.0567787 0.0302284 +-0.011856 0.127622 0.0255897 +-0.0429498 0.0338754 -0.00590515 +-0.000398209 0.131157 0.00667235 +-0.0163397 0.112374 -0.0190184 +-0.0651151 0.138224 0.0409979 +0.0355326 0.0544702 -0.00765701 +0.0264528 0.0348348 0.00531809 +-0.0438555 0.101385 -0.0214526 +-0.0234974 0.0498976 0.0468652 +-0.0436816 0.0651561 -0.0146099 +-0.00750789 0.0386054 0.00429878 +-0.0494719 0.0643044 0.0356628 +-0.0857911 0.0847131 0.0234468 +0.0202388 0.0735294 -0.0276011 +-0.0826135 0.153724 0.024657 +0.0377117 0.0799594 -0.0137509 +-0.0629014 0.0384346 0.017326 +-0.0564952 0.112508 0.0359017 +-0.00450514 0.0647631 0.0563697 +0.0228849 0.0849076 0.049031 +-0.0136101 0.17129 -0.0181213 +-0.0659308 0.168025 -0.05906 +0.00616007 0.130231 0.0233995 +0.0200475 0.0355684 0.0326031 +0.0207235 0.0355731 0.0309275 +-0.0914203 0.133738 0.0192152 +-0.0894168 0.0942943 0.0184246 +-0.0486795 0.137079 0.00840446 +-0.0268516 0.0981872 -0.024073 +-0.0296061 0.0499557 0.0431146 +-0.0645444 0.136771 0.0400377 +0.00960463 0.0369501 0.029234 +-0.0077992 0.0826766 -0.0378216 +-0.0705096 0.145613 0.0431794 +0.038042 0.109981 0.0137429 +-0.0323904 0.0346717 0.0421656 +0.0166765 0.12456 0.0286792 +0.0496183 0.0673428 0.0005193 +-0.0256005 0.175695 -0.0107936 +-0.0178219 0.0896296 -0.0373512 +-0.010186 0.0339025 -0.0217341 +-0.047823 0.0912927 -0.0217091 +0.0214379 0.121585 -0.00505488 +-0.063535 0.0741856 0.0400495 +-0.0175015 0.119559 0.0348485 +0.0378045 0.0701003 -0.0128173 +-0.06064 0.140962 -0.00527103 +-0.0745647 0.162191 -0.0132518 +0.0175747 0.0931801 -0.024649 +-0.0413443 0.159411 0.00325579 +-0.0692325 0.161954 -0.0115912 +-0.0598828 0.104039 -0.0184233 +-0.0275135 0.111195 0.0372083 +0.017284 0.0435398 0.0440147 +-0.043478 0.0633766 0.0405033 +0.0234516 0.0389975 0.0363054 +-0.0705331 0.144185 0.0442754 +-0.00248752 0.0897873 0.0564419 +-0.0728742 0.149812 -0.0379734 +0.0462595 0.0834414 0.00917612 +0.00549045 0.0459551 0.048539 +0.038562 0.0568882 0.0311978 +-0.0404973 0.10005 0.041322 +-0.0633155 0.125546 0.0454063 +-0.0425091 0.0520201 0.0393163 +0.00748602 0.041302 0.0454759 +-0.0652746 0.0378654 0.0394026 +-0.0208078 0.081314 -0.039065 +0.00735987 0.131518 0.0123881 +-0.0507686 0.0812185 -0.0210302 +0.0289317 0.0369927 0.000264038 +-0.0895362 0.119938 0.00329723 +0.0339261 0.0564017 0.0366181 +0.0387571 0.0780554 0.0349576 +-0.00249465 0.111426 0.042426 +0.0312166 0.0814571 -0.0197537 +0.00710696 0.112707 -0.0194319 +0.0182552 0.0736117 -0.028651 +-0.0747384 0.149908 -0.0288721 +-0.0142729 0.16729 -0.0212151 +-0.0796554 0.0776931 0.0301108 +-0.0308995 0.0385461 -0.0114399 +-0.0135011 0.162185 -0.0138332 +-0.062358 0.172308 -0.0618736 +-0.0779551 0.131028 -0.00606492 +0.0053093 0.0610791 -0.0314051 +-0.0622044 0.163118 -0.0415929 +-0.0875561 0.0900472 0.00346813 +-0.0693763 0.0627096 0.00438827 +0.0577316 0.0594186 0.0235899 +-0.076964 0.0686471 0.0102516 +-0.068516 0.156454 -0.00263594 +-0.0116226 0.0389602 0.0338935 +-0.053617 0.0500325 0.0119809 +0.0600963 0.059514 0.00816569 +-0.0667396 0.168684 -0.03081 +0.0461456 0.0820314 0.0061875 +-0.0433217 0.0391871 0.0438385 +0.0426589 0.0598822 -0.00401987 +-0.0496436 0.132456 0.0281905 +0.0526393 0.0635217 0.0285801 +0.0276786 0.107363 -0.0137282 +0.0429561 0.100122 0.0141624 +0.0420203 0.102869 0.0111608 +0.0352633 0.113355 0.0198926 +-0.0527821 0.0840792 -0.0215781 +-0.0731314 0.179106 -0.0550054 +-0.0772542 0.116219 0.0507045 +-0.0448961 0.131042 0.0121815 +-0.0659423 0.149401 -0.0328697 +-0.00381497 0.0882175 -0.036071 +-0.00434542 0.130565 0.019581 +0.0267602 0.0365817 2.43485e-05 +0.0169695 0.107204 -0.0175448 +-0.062502 0.0625858 0.0256444 +-0.00350098 0.0815126 0.05747 +0.000251433 0.0712294 -0.0349609 +-0.0113059 0.174226 -0.0217772 +-0.0348319 0.0943645 -0.0236767 +-0.0786972 0.0940445 0.0355566 +0.0177903 0.112808 -0.0155711 +-0.0318198 0.0887354 -0.0251772 +-0.0198038 0.0827175 -0.0390158 +-0.0190696 0.126125 0.000571573 +-0.0793168 0.102079 0.0331119 +0.021502 0.109802 0.0384228 +-0.0927296 0.124224 0.0362665 +-0.0209485 0.0682779 0.0508919 +0.041224 0.101389 -0.000814438 +-0.0468126 0.0898791 -0.022022 +-0.0348994 0.124334 -0.00549397 +-0.0341879 0.127198 0.0131711 +-0.049291 0.131272 -0.000642386 +-0.0359021 0.0337218 0.00658675 +-0.0837824 0.091132 -0.00556609 +-0.0335134 0.101547 0.0420338 +0.0210931 0.0429808 -0.0187308 +0.0424902 0.0555855 0.0321183 +-0.0557185 0.0570014 0.011057 +-0.0194912 0.112675 0.0392933 +-0.025189 0.156576 -0.00769163 +0.0400265 0.10701 0.00816505 +-0.0540901 0.153118 -0.00271435 +-0.00486253 0.101638 -0.0232055 +-0.0436472 0.0338067 0.00674466 +-0.0211436 0.168262 -0.0193322 +-0.0763578 0.141673 -0.00573846 +0.0465682 0.041911 0.0139236 +-0.0534989 0.109802 0.0378386 +-0.0811057 0.0748245 0.0195385 +0.0366496 0.0848209 0.0372394 +0.0520606 0.0608742 0.0294954 +-0.0810176 0.109646 0.0372868 +0.0260062 0.121547 0.0249766 +-0.0134941 0.0773082 0.0569169 +-0.0759274 0.108411 0.0376421 +0.0131577 0.0548631 0.0504935 +-0.0556243 0.0335264 0.0117574 +-0.0445311 0.119183 -0.0140568 +-0.0651138 0.155569 0.0262833 +0.0254608 0.100767 0.0422505 +-0.0354939 0.101471 0.0414493 +-0.0526525 0.152155 0.0150192 +-0.0578899 0.111162 -0.0167182 +-0.050471 0.0571806 0.032579 +-0.0881725 0.103664 0.0113862 +-0.0124346 0.0985527 -0.0264295 +0.0459022 0.0876188 0.00817319 +-0.0598831 0.0337324 0.0142605 +0.0420206 0.092566 0.0274869 +-0.0622887 0.152203 -0.0145776 +-0.0483961 0.150684 0.0105827 +0.00023463 0.0985537 -0.0263753 +-0.0719091 0.107919 -0.010771 +0.0379248 0.0575872 0.0318029 +-0.0684803 0.169194 -0.0285889 +-0.0388617 0.099995 -0.0218283 +-0.0776097 0.0796169 0.0342011 +0.00633113 0.0553726 -0.0306713 +0.0163088 0.048977 0.0444188 +-0.0838449 0.0817176 0.00149669 +-0.0216263 0.0341828 -0.0204844 +-0.0187634 0.0728738 -0.0388715 +-0.0626025 0.0388129 0.0247151 +-0.0373475 0.0347779 0.0107604 +-0.00558664 0.0376733 -0.0253626 +0.0599615 0.0678313 0.0171716 +-0.0295401 0.0904607 -0.0275932 +0.0284451 0.114053 0.0325229 +0.0418253 0.0830818 -0.00779351 +0.00746772 0.0343056 0.0166757 +-0.0865698 0.0833108 0.0104907 +-0.0729271 0.151083 0.037025 +-0.0781924 0.155673 0.0158655 +-0.0788514 0.116332 -0.0048797 +0.00512317 0.107303 -0.0203142 +-0.0103272 0.0383585 0.0166568 +-0.0348025 0.040194 -0.0297923 +-0.000491404 0.0814979 0.0573536 +-0.0290382 0.16386 -0.00530596 +-0.0694805 0.121794 0.053195 +-0.0704544 0.150585 -0.0434585 +-0.0639717 0.0459278 0.00771742 +-0.03056 0.124009 -0.00164624 +0.0144021 0.0780973 0.054252 +-0.0808546 0.140749 0.0461596 +0.0103353 0.0581557 -0.0299403 +-0.00949578 0.084298 0.0576062 +-0.0249013 0.0382346 0.0282196 +-0.0316389 0.0409999 0.051064 +0.0387381 0.0381712 0.0065938 +-0.0580729 0.0345066 0.0402882 +-0.0663198 0.150167 -0.0356652 +-0.064292 0.168172 -0.0605879 +-0.0314424 0.0679449 -0.0244554 +0.0603913 0.0595429 0.0161691 +0.0102649 0.129908 0.00205228 +-0.0440813 0.0336392 -0.0114358 +0.0309277 0.0497348 -0.00874 +-0.0267697 0.0750695 0.0452054 +-0.0791015 0.170034 -0.0382691 +-0.0864283 0.0954013 0.00141653 +0.00852849 0.0646614 0.0551736 +0.0473561 0.0503594 -0.00438005 +0.039601 0.107391 0.00564087 +-0.0861267 0.0833147 0.0194823 +-0.0786738 0.10815 0.0335843 +0.043481 0.0832455 0.0271768 +0.0281352 0.0915776 0.0443357 +-0.0298099 0.0677811 -0.0284707 +-0.0229012 0.115018 -0.0157633 +-0.0270064 0.0808968 0.0494715 +0.0404227 0.0885874 -0.0107894 +-0.087216 0.0937177 0.0257149 +-0.0690509 0.0654544 -0.0025414 +-0.0695527 0.04187 0.00402445 +0.00429234 0.0668529 -0.0329804 +-0.046755 0.0336866 -0.0157033 +0.0576125 0.0580597 0.0234109 +-0.000994561 0.129288 -0.0011666 +0.0454245 0.0904044 0.0131633 +-0.0438081 0.0899046 -0.0222231 +0.0199328 0.127154 0.0141603 +0.0114882 0.0963254 0.0495798 +0.0218142 0.117368 -0.0105004 +-0.0438465 0.0359346 0.00839642 +-0.0714426 0.0632696 0.00712846 +-0.0759079 0.150006 -0.00888842 +-0.06794 0.126772 -0.00890268 +-0.0343726 0.127227 0.0072164 +0.0578211 0.0537494 0.00717652 +-0.0483087 0.135537 0.00740851 +-0.0568342 0.0666429 0.0356476 +0.0481112 0.0431114 0.00725444 +-0.0425043 0.117982 0.0312159 +0.0144699 0.0976455 0.0479677 +0.0563061 0.0508424 0.00620646 +-0.0300578 0.163895 -0.00500569 +0.0102245 0.0823018 -0.0318649 +0.0598453 0.0608733 0.0191849 +-0.0620027 0.172528 -0.0545971 +-0.0197571 0.0971344 0.046022 +-0.0611783 0.167226 -0.0592729 +-0.00613038 0.0999315 0.0488982 +0.0488619 0.047436 -0.000620948 +-0.0208111 0.118967 -0.0119295 +0.00352005 0.0786345 0.0561775 +-0.071061 0.15959 -0.0439233 +-0.0765957 0.161076 -0.0289322 +0.0259255 0.123359 0.0149571 +-0.0746094 0.14858 -0.0188631 +0.0569296 0.058069 0.024171 +-0.0338241 0.152569 -0.00489392 +-0.0455023 0.0615609 0.0388319 +-0.0654625 0.143948 0.0405383 +-0.0560519 0.0345032 0.0407254 +-0.0709341 0.162789 -0.0122264 +-0.078067 0.144487 -0.00381208 +-0.094099 0.121442 0.0152795 +-0.00327736 0.0410332 0.0476549 +-0.0500433 0.165539 -0.00195268 +-0.0774288 0.0712256 0.0238415 +-0.00725841 0.0408714 0.048906 +-0.0833667 0.142023 0.0429747 +-0.0692361 0.153199 0.0337122 +-0.0360543 0.0398378 -0.0294769 +-0.0403231 0.0344611 0.0371557 +-0.0207576 0.069984 -0.0381379 +0.0122374 0.0737871 -0.031159 +-0.0241603 0.0665253 0.044272 +0.0399369 0.0860773 0.0331939 +-0.0809073 0.123633 -0.00507492 +-0.00964827 0.166616 -0.0197629 +-0.00664529 0.1307 0.0129838 +-0.0209361 0.0381808 0.0128466 +-0.0538563 0.0970443 -0.0219059 +-0.0662078 0.0723697 0.0374848 +-0.0398566 0.099981 -0.0216989 +-0.0494761 0.0600183 0.034326 +-0.0157667 0.0742966 -0.0389627 +-0.0875711 0.0977385 0.0245274 +-0.0529166 0.0566407 0.0191372 +0.000745542 0.0955759 -0.0312149 +-0.0688619 0.10089 -0.0150284 +-0.0130273 0.178658 -0.0225027 +-0.00548585 0.118301 0.0387556 +-0.063934 0.169417 -0.04458 +0.00224686 0.131192 0.0191047 +-0.0526917 0.0662141 -0.0112413 +0.0316126 0.104759 0.0353509 +0.0222548 0.0776918 -0.0264111 +-0.0685061 0.105552 0.0384458 +-0.0576201 0.135609 -0.00546838 +-0.00760577 0.128788 -0.000526473 +-0.0262755 0.0383516 -0.00662702 +0.0096904 0.0344726 -0.0051827 +0.0183649 0.0355244 -0.0106716 +-0.0892922 0.0996701 0.0134013 +-0.0748707 0.116421 -0.00675171 +-0.054019 0.0333099 0.015848 +-0.0927402 0.125562 0.0292626 +-0.00859312 0.0384098 0.0205847 +-0.0574617 0.0399955 0.0466824 +-0.0890962 0.0996533 0.0114017 +-0.0393675 0.120945 -0.0119262 +-0.0498057 0.144755 0.010389 +-0.0800056 0.108388 0.0313605 +-0.0694061 0.153071 -0.0482738 +-0.0529002 0.0701503 0.0387731 +-0.00979568 0.178776 -0.0277733 +-0.0749384 0.177982 -0.0467773 +-0.080224 0.0913049 0.0343483 +0.0274404 0.0399547 -0.00370609 +0.0064659 0.11274 0.0407332 +-0.0218179 0.0350986 -0.0195001 +-0.0723907 0.151114 -0.0412874 +0.00590733 0.0340449 -0.020637 +0.0460177 0.0800284 0.0189631 +-0.0576496 0.0629466 -0.00612077 +-0.0519433 0.0503866 0.0326949 +0.0377573 0.0757194 -0.0117756 +0.0434133 0.0930689 -0.00182579 +-0.0445007 0.165214 0.00483168 +-0.0196553 0.063928 0.0497256 +-0.0766812 0.154876 -0.00631355 +-0.0344859 0.0335245 -0.0299041 +0.0132509 0.0349689 -0.0195966 +-0.0264467 0.0459901 0.0505652 +-0.00131456 0.122836 -0.0102349 +0.0122169 0.129551 0.00276868 +-0.0137494 0.0383366 0.00873382 +-0.0445005 0.116602 0.0322264 +-0.0346258 0.0408721 -0.0296689 +-0.0706305 0.0401508 0.00122659 +-0.0765009 0.0716493 0.0271716 +-0.0708234 0.155869 0.0257344 +-0.0311277 0.0566897 -0.0153882 +-0.0896944 0.133694 0.0395953 +0.000231967 0.0783204 -0.0356621 +0.0338144 0.115724 0.00791606 +-0.0300912 0.15662 0.000215848 +0.0464982 0.0677769 0.0257597 +-0.0214151 0.0595466 0.0459898 +-0.0572298 0.0696188 0.0382761 +0.0366123 0.064635 0.0370437 +-0.0264937 0.0973851 0.0437224 +0.0404949 0.0513767 0.0324659 +-0.0350844 0.107815 -0.0201106 +-0.0205025 0.0486482 0.0489372 +-0.0610181 0.13697 -0.00676267 +-0.0906044 0.135075 0.015212 +-0.0194066 0.174211 -0.0159442 +-0.0394983 0.0719214 0.0419294 +-0.0883414 0.120307 0.04718 +-0.00748928 0.0978336 0.0520944 +-0.0846404 0.107661 0.0233457 +-0.0214945 0.10716 0.0418366 +0.0181073 0.0398088 -0.0196993 +0.0190777 0.0384168 -0.0157069 +-0.0636502 0.159498 -0.051954 +0.0283128 0.0754542 0.0444772 +-0.054074 0.15164 -0.0027148 +-0.083614 0.154208 0.0184012 +-0.056485 0.0343785 0.0390076 +0.0337482 0.102096 0.0349353 +-0.0782584 0.1764 -0.0490322 +0.0136057 0.0460076 0.0440344 +-0.00550326 0.0801395 0.0576107 +0.0334132 0.0849144 0.041374 +-0.0113988 0.126257 0.0287047 +-0.0655972 0.169628 -0.0389928 +-0.0832568 0.154212 0.0141255 +-0.0820934 0.0898659 0.0320222 +-0.067283 0.17966 -0.0595334 +-0.062529 0.150617 -0.0195776 +-0.0299377 0.0847457 -0.0326018 +0.0607552 0.0664989 0.0131533 +-0.0228597 0.101618 -0.023963 +-0.0618668 0.165619 -0.0600772 +-0.081854 0.0937329 -0.00756112 +-0.0679516 0.170855 -0.0560296 +-0.0295118 0.108456 0.0388793 +0.0482509 0.0539799 0.0309574 +0.00823122 0.079605 -0.0335706 +-0.0526044 0.041455 0.0460966 +-0.0496802 0.165544 -0.00294037 +-0.0910152 0.129688 0.0372352 +-0.0404973 0.0972715 0.0419896 +0.00850648 0.0772375 0.0559821 +-0.0717922 0.153989 -0.0428988 +-0.0507334 0.147965 -0.00270623 +0.0127323 0.0860509 0.0536553 +0.0565626 0.0508082 0.0192018 +-0.047499 0.10845 0.0392246 +-0.00917487 0.0875708 -0.0370938 +-0.0783316 0.0788746 0.032897 +-0.0896787 0.135012 0.00721892 +0.00550113 0.0883518 0.0561015 +-0.0423419 0.0335706 -0.0240051 +0.0405574 0.104219 0.0191648 +0.00286437 0.130486 0.00148286 +-0.0643911 0.133918 0.0402655 +-0.0620868 0.139878 -0.00655442 +-0.0557051 0.12209 -0.00891575 +0.0589396 0.0566475 0.0201757 +0.0386112 0.0603508 -0.0077511 +-0.0806595 0.0855046 -0.00754297 +-0.0718229 0.0965348 -0.0152102 +0.0459498 0.0806271 0.0191734 +-0.0515557 0.141366 0.000880581 +-0.0859779 0.0910726 0.0273961 +-0.0194809 0.0757644 0.0547346 +-0.0526104 0.0335154 0.00699108 +-0.080479 0.155159 0.0180021 +-0.0500595 0.117739 -0.014504 +-0.0638596 0.0939187 -0.018635 +-0.0469776 0.034208 0.0289371 +0.0315208 0.0994913 0.038731 +0.0444927 0.0610909 0.0304355 +0.0212529 0.1262 0.0189269 +-0.0254692 0.0509386 0.0434079 +0.0476579 0.0715472 0.019969 +0.022698 0.118017 -0.00920048 +-0.0384222 0.125448 0.0219859 +-0.038314 0.170034 -0.0122167 +-0.0530543 0.14469 0.0223994 +-0.00492317 0.0389099 -0.00470281 +0.0373499 0.0533605 -0.00643641 +-0.0696712 0.171569 -0.0347594 +0.0436954 0.0959268 0.0201595 +0.0285253 0.065965 0.0429423 +-0.0466394 0.0345455 0.0392313 +0.0412883 0.0886287 0.0299331 +-0.0251747 0.0383636 -0.0175696 +-0.0674763 0.168038 -0.0560148 +-0.0634115 0.166723 -0.0396505 +-0.0443984 0.0671335 0.0404051 +-0.0524987 0.100127 0.0423619 +-0.0837023 0.110333 0.0361338 +-0.0757541 0.0819089 0.037226 +-0.0475033 0.0973719 0.0436212 +-0.0418104 0.0899475 -0.0227382 +-0.0308563 0.174216 -0.00433975 +-0.00771604 0.130016 0.0212618 +-0.0691125 0.156051 0.011784 +-0.049655 0.0664173 -0.0130805 +0.0212145 0.0401172 -0.0107008 +-0.0418108 0.128972 0.0103834 +-0.0623408 0.164683 -0.0455908 +-0.0776167 0.145877 -0.00384676 +0.0294578 0.079544 0.0444105 +-0.052057 0.15088 0.0153954 +0.0551015 0.0521065 0.00221795 +-0.0568769 0.116868 -0.0135067 +-0.0856284 0.151402 0.00824006 +-0.0512523 0.116429 -0.0151143 +-0.0568623 0.0941345 -0.0215512 +-0.0153943 0.099814 0.0443638 +0.0368805 0.101462 -0.00941022 +-0.0293998 0.0355494 -0.0195486 +-0.040872 0.105663 -0.0204372 +-0.0279821 0.0821961 0.0475971 +-0.0106963 0.176084 -0.0292514 +-0.00933224 0.038323 0.0168951 +-0.0792032 0.10313 -0.00756064 +-0.0540718 0.118333 0.0357708 +0.00450074 0.0938217 0.0540732 +-0.0746595 0.15617 0.0170913 +-0.0708414 0.0994113 -0.0147342 +-0.0516111 0.0530832 -0.00753985 +-0.0486234 0.0532712 -0.0094518 +-0.031704 0.172718 -0.00384226 +-0.00272576 0.130091 0.00149765 +-0.092388 0.120024 0.00928585 +-0.037643 0.153612 0.00331291 +0.0356049 0.0577583 0.0355158 +-0.0668801 0.103821 -0.0153002 +0.0379456 0.10977 0.0171703 +0.0191769 0.0959952 -0.0230407 +0.0391807 0.0658814 0.0336832 +-0.0690863 0.0666121 0.0278101 +-0.089106 0.114375 0.0298659 +-0.0216155 0.0436703 -0.028439 +-0.0266188 0.0490904 -0.0254391 +0.000108091 0.0340814 -0.0198793 +-0.0171613 0.159788 -0.00903074 +0.041574 0.0397142 0.0168995 +0.019656 0.0347604 0.000281692 +0.00764804 0.128583 -0.00254334 +-0.0553782 0.151032 0.0287496 +-0.0528315 0.0558373 -0.00742005 +0.0115037 0.109883 0.0397133 +0.03545 0.105907 -0.00815474 +-0.0629114 0.115341 -0.0117985 +-0.0234208 0.172725 -0.0129655 +-0.0890673 0.101028 0.0173829 +0.0236359 0.056409 0.0445932 +-0.0187325 0.0374026 0.0529482 +-0.0394792 0.105608 0.0388858 +0.0151319 0.0603601 0.0498992 +-0.080949 0.137599 -0.00280806 +-0.0546196 0.0345652 0.0426785 +-0.0465281 0.033544 -0.0026564 +0.0395657 0.0998694 -0.00580754 +0.0101223 0.108705 -0.0195083 +-0.0104988 0.09255 0.056119 +0.0330296 0.116688 0.0147767 +-0.0910722 0.141959 0.0151878 +-0.00849613 0.0703395 0.0565554 +-0.0574961 0.0904385 0.0452768 +-0.0530142 0.0490552 0.0256583 +-0.0294931 0.0717523 0.039896 +-0.0311676 0.0348856 0.0474529 +-0.00876366 0.0347363 0.0436201 +-0.0666703 0.0612745 0.0188657 +0.0173575 0.0940342 0.0480767 +0.0284806 0.111435 0.0343318 +-0.0468308 0.0941893 -0.021914 +-0.0265985 0.0562164 -0.027412 +-0.0871843 0.135176 0.0441499 +-0.063207 0.06374 0.0280276 +-0.0345021 0.0647803 0.0405279 +0.0597837 0.0567045 0.0121686 +-0.0474843 0.0818872 0.0439119 +-0.0589237 0.11399 -0.014753 +-0.0490056 0.122549 0.0307687 +0.0548584 0.0611516 -0.00113589 +-0.0458004 0.0353434 -0.021332 +0.00134052 0.0539375 -0.0306386 +-0.0278278 0.177181 -0.00696301 +-0.0427537 0.0783105 -0.0194623 +0.00651372 0.089712 0.0551929 +-0.0494951 0.0819134 0.044146 +0.0305588 0.055351 -0.0157687 +0.0297469 0.0929269 0.0431563 +0.0125099 0.0519837 0.0495237 +0.0459653 0.0806289 0.018177 +-0.053548 0.149321 0.0244145 +-0.0317948 0.0651814 -0.020436 +-0.019834 0.0868717 -0.0379507 +-0.0119886 0.038466 0.00715809 +-0.0770198 0.170132 -0.03325 +-0.0269539 0.17866 -0.00745161 +-0.0756616 0.0695139 0.0239361 +-0.0474944 0.116586 0.0319739 +-0.0671319 0.0355924 0.0145398 +-0.0783661 0.108548 -0.00557568 +-0.0284012 0.0860445 -0.0346283 +0.0257301 0.0379057 0.0280361 +0.00740689 0.0389878 -0.0235836 +-0.0629696 0.131105 0.0405653 +-0.0380606 0.157756 -0.011216 +-0.0361107 0.0459963 0.0412564 +-0.053455 0.0625326 0.0304805 +-0.0731839 0.178324 -0.0475338 +0.0137018 0.0888713 -0.0301465 +-0.0894038 0.140678 0.0331776 +-0.0114925 0.06602 0.0547394 +-0.0853984 0.0872002 -0.00151975 +-0.00957697 0.128995 0.00181181 +0.0571986 0.0536922 0.00517882 +0.0181761 0.0974249 -0.0228373 +0.0414526 0.0425673 -0.000513932 +-0.0423634 0.121318 -0.0123099 +-0.0854479 0.0898939 -0.00155092 +-0.0136017 0.0392183 -0.0267222 +-0.0353577 0.174409 -0.00212011 +-0.0930586 0.122743 0.0102788 +0.0208421 0.0882147 -0.0254487 +0.000267595 0.0697483 -0.0342392 +0.0443612 0.0458824 -0.00271937 +-0.0794062 0.147442 0.0402641 +0.0285362 0.120755 0.0202147 +-0.0354498 0.0346389 0.0415402 +0.0189212 0.0875932 -0.0268145 +-0.0326685 0.0478014 -0.0229356 +0.0213046 0.0374522 0.0382518 +0.0119628 0.111848 -0.018535 +-0.0754368 0.114522 0.050709 +-0.0575342 0.0415089 -0.00843308 +-0.0289002 0.0348381 0.0445217 +-0.0558188 0.0336396 0.0205147 +-0.0294901 0.0946648 0.0450535 +0.0140142 0.0519753 0.0481823 +-0.0499383 0.162625 -0.0047964 +-0.0285131 0.111188 0.0369648 +-0.0777024 0.176292 -0.0501047 +-0.0458377 0.0970756 -0.021885 +-0.0647866 0.167644 -0.0344082 +-0.08472 0.111015 0.033569 +-0.0624074 0.1491 -0.0095736 +0.0455563 0.078849 0.0217954 +0.0386173 0.0673644 -0.0117551 +-0.0516941 0.147804 0.0164166 +-0.0638593 0.0953482 -0.0183667 +-0.0887889 0.117194 0.003272 +-0.0667452 0.0342007 0.0124321 +-0.0921816 0.132336 0.0152245 +-0.0790475 0.168047 -0.0349702 +-0.0445079 0.0424992 0.043443 +-0.0914924 0.12135 0.00727423 +0.00205109 0.0347195 0.0440743 +-0.0757523 0.0687815 0.0210323 +0.0254197 0.0394349 0.0320923 +0.0445209 0.095967 0.011159 +0.00418461 0.0908826 -0.0329329 +-0.0447434 0.0753343 -0.0181391 +0.0465277 0.0497043 0.0301725 +-0.0231678 0.124994 -0.000333927 +-0.0261386 0.0359205 -0.0192491 +0.000314733 0.0597904 -0.0332055 +-0.0664067 0.0336797 0.00582425 +-0.0179785 0.068344 0.053543 +0.0128834 0.035495 0.00385056 +-0.064012 0.0432207 0.0306772 +0.0356112 0.0942094 0.0375896 +0.0433586 0.0589158 -0.00469925 +-0.0741431 0.153026 0.0335308 +-0.0366764 0.0421455 0.0447176 +-0.0616357 0.158429 -0.0245888 +-0.0777899 0.164478 -0.0251991 +-0.0774203 0.177255 -0.0472003 +-0.0723466 0.0663158 0.0221054 +-0.00945876 0.0366145 -0.0165831 +-0.00782909 0.0896438 -0.0364286 +-0.0483458 0.0338972 -0.0143683 +-0.0548931 0.111218 -0.0174922 +0.0263272 0.0545944 -0.0208638 +-0.078467 0.147461 0.0407301 +0.0472196 0.0430325 0.00527833 +0.0313294 0.118714 0.0127065 +-0.00880796 0.0868775 -0.037347 +-0.054028 0.0344996 0.0411656 +-0.00639115 0.121199 -0.012466 +0.0300864 0.0564003 0.0398351 +-0.0790124 0.0782686 0.0315155 +-0.0134683 0.0964232 0.0523159 +-0.0763221 0.159003 -0.0110053 +-0.0600876 0.0367271 0.0456071 +0.0364957 0.049851 0.0316154 +0.00849848 0.0402756 0.0453316 +0.0205837 0.0754832 0.0508919 +-0.071014 0.148895 -0.037822 +0.0170761 0.115474 -0.0144429 +-0.063767 0.0615586 0.0227478 +0.0437965 0.0987467 0.00816432 +-0.0513326 0.0542594 0.0137993 +-0.0414552 0.0341096 -0.00949275 +0.0395669 0.101281 -0.00480928 +-0.0918243 0.128307 0.0322434 +-0.0474749 0.0945717 0.0440635 +-0.0704486 0.16924 -0.0264473 +0.027192 0.101376 -0.017349 +-0.0895884 0.114751 0.0258504 +-0.0713206 0.156784 -0.042915 +0.0384501 0.0914717 0.0346309 +0.0214747 0.0996539 -0.0214946 +-0.0106582 0.0527176 -0.0332954 +0.00773558 0.128847 0.0268569 +0.0202904 0.0912514 -0.02462 +0.00332905 0.0553943 -0.0309954 +-0.0921247 0.116117 0.0353113 +-0.0146765 0.0526113 -0.0325234 +-0.0657759 0.0410192 0.0130518 +0.0587274 0.0538199 0.013179 +0.0291394 0.102042 -0.0160578 +-0.0701142 0.0625797 0.0062174 +0.0457389 0.0876049 0.0111625 +0.00224905 0.118538 -0.0156887 +0.0520156 0.0596733 -0.00368903 +-0.0891532 0.136419 0.0102028 +-0.0400348 0.0344619 0.0337052 +-0.0461887 0.0335082 0.00469546 +-0.0923435 0.115998 0.0113188 +-0.00713141 0.127357 0.0287426 +0.0252624 0.0747714 -0.0251152 +-0.0453044 0.0587827 0.038737 +0.03635 0.0368836 0.00917982 +-0.0527446 0.0753599 -0.0182797 +-0.0728584 0.132623 0.0509226 +-0.00672844 0.0698676 -0.0361675 +0.0413912 0.0459759 -0.00421898 +-0.0201655 0.0348026 0.0446658 +-0.0641545 0.0391804 0.0263583 +-0.00246627 0.111608 -0.0202454 +-0.0134033 0.110892 -0.0194483 +0.043074 0.0401669 0.0073914 +0.0192967 0.0693907 -0.0288221 +-0.0619039 0.16157 -0.0305885 +0.00333358 0.0341967 0.0104872 +0.0421258 0.100042 0.000179811 +-0.0386776 0.11516 -0.0158482 +-0.00807178 0.0386982 0.0276584 +-0.0756134 0.163772 -0.0350068 +-0.0672387 0.155112 0.00519073 +0.0276118 0.053509 0.0397341 +-0.0779406 0.158305 -0.0189233 +-0.00470743 0.0627772 -0.0352137 +0.0325643 0.0981766 0.0384761 +0.0296733 0.0481683 -0.00874324 +0.0113105 0.059545 -0.0296135 +-0.0653574 0.0733073 0.0386226 +-0.0120884 0.101067 0.0439606 +-0.0268179 0.0735627 0.0438663 +-0.0513902 0.0530791 0.0216216 +-0.0678614 0.042287 0.00944731 +-0.0899071 0.133806 0.0352156 +-0.0122404 0.0385117 0.0269697 +-0.0719375 0.16298 -0.0125698 +0.0473212 0.0533258 -0.00537345 +-0.030503 0.0588732 0.0373493 +-0.0905557 0.120241 0.0451196 +0.0219406 0.0388423 0.0393076 +-0.0672891 0.178209 -0.0595336 +0.0302182 0.0535528 0.0382346 +-0.0815406 0.110006 0.0333062 +-0.0477684 0.0811966 -0.0205178 +-0.048671 0.138621 0.0113976 +-0.0562999 0.0506286 -0.00237306 +-0.0854189 0.0791501 0.00750351 +0.000105856 0.117482 -0.0165473 +-0.0624071 0.149633 -0.00268499 +-0.0682914 0.172271 -0.0560251 +-0.0642448 0.0333797 -0.00245942 +0.0203456 0.053671 -0.0267089 +-0.0711203 0.163576 -0.0137477 +-0.0126641 0.0511309 -0.0317686 +-0.066211 0.180426 -0.0565833 +0.0266688 0.0892152 -0.0224539 +0.01736 0.128384 0.0132094 +-0.0541813 0.154195 0.0142529 +-0.0799749 0.0710714 0.0163832 +-0.0379044 0.0336424 -0.0213286 +-0.0747588 0.0669346 0.0175421 +-0.0221189 0.12668 0.005878 +-0.0623544 0.152149 -0.0255836 +0.0137867 0.0377633 0.0443361 +0.0469104 0.0589185 -0.00506663 +-0.0188119 0.0964492 -0.0282644 +-0.000384494 0.130522 0.00237337 +-0.0647338 0.0418755 0.0296857 +-0.0418518 0.0999485 -0.0214177 +-0.0135206 0.0432479 0.0507363 +0.0314548 0.113206 0.0298812 +0.0211096 0.0343656 0.00467028 +0.0493524 0.0516707 -0.00371978 +0.0324504 0.0916248 0.0417895 +-0.0405477 0.118695 -0.0135582 +-0.0421609 0.128746 0.00435225 +0.00852878 0.034888 0.0362651 +-0.0599768 0.12527 -0.00809043 +-0.0624255 0.16468 -0.0465913 +0.0305387 0.114047 0.0302625 +-0.0209297 0.158088 -0.00822134 +-0.00449554 0.0633716 0.0561592 +0.00751849 0.0440876 0.0454461 +-0.0617319 0.160008 -0.0275856 +-0.00111302 0.130629 0.0207594 +-0.000792652 0.0894877 -0.0349748 +-0.0534886 0.0862338 0.0454573 +0.0102426 0.0752832 -0.032327 +-0.0866178 0.151117 0.0269024 +0.00586712 0.0991316 -0.0229749 +-0.018487 0.0772258 0.0557066 +-0.0220963 0.0623062 0.0451655 +-0.0263156 0.124827 0.00142734 +0.00449781 0.0519669 0.0532713 +-0.0318681 0.105727 -0.021166 +-0.034171 0.0822565 -0.0245355 +-0.0160192 0.104518 -0.0227486 +-0.0336086 0.0394857 -0.0301589 +0.0179261 0.0900567 0.048881 +0.028994 0.0915879 0.0438177 +0.0419459 0.0625408 -0.0027477 +-0.0623435 0.161536 -0.0425937 +0.0521127 0.0595383 0.0295528 +0.00603967 0.0344425 -0.0152712 +-0.0200036 0.0384998 -0.0166705 +0.0335055 0.0549395 0.0359782 +0.0413899 0.0475369 -0.00516876 +0.0571049 0.0594437 0.0244408 +-0.0642323 0.124186 0.0475964 +-0.0104933 0.0952299 0.0545267 +0.0183283 0.0593891 -0.0275077 +0.0556724 0.0698728 0.00398853 +0.02895 0.086199 0.0437135 +-0.00575467 0.1008 0.0460186 +-0.0117555 0.0969094 -0.0306933 +-0.0570352 0.129621 -0.00626418 +-0.06396 0.034704 0.0249317 +-0.0269668 0.0674701 -0.0325423 +0.00372222 0.0941665 -0.0317421 +-0.0708312 0.0951391 -0.0158707 +0.0351494 0.0633173 0.038442 +0.0303372 0.119206 0.0194646 +-0.0174811 0.118153 0.0357243 +-0.0928105 0.116053 0.0203106 +-0.012498 0.078722 0.0572931 +0.0102589 0.100444 -0.0223447 +0.0311369 0.0982118 0.0399163 +-0.0870966 0.0995146 0.0044219 +0.0372771 0.100696 0.0312566 +-0.0464652 0.16842 -0.00496016 +-0.0340766 0.172586 -0.0145127 +-0.0632966 0.144361 -0.00960502 +-0.00396533 0.128634 -0.00247998 +-0.0810179 0.0964125 -0.00756981 +-0.0296304 0.159454 -0.0131553 +0.0323433 0.0592178 0.0396143 +0.0171685 0.0490344 0.0439112 +-0.0798847 0.0706373 0.0145533 +0.00550249 0.0758881 0.0564988 +-0.0285046 0.0588067 0.036767 +-0.054422 0.152991 0.0228754 +-0.0663081 0.150341 0.0377708 +-0.0409099 0.173193 -0.0056112 +-0.00259587 0.0391262 -0.0253465 +0.0394316 0.0807401 0.0342345 +0.048793 0.049707 0.0281736 +-0.0225905 0.0365035 -0.0286129 +-0.0185117 0.0387718 -0.0147573 +-0.0889514 0.121274 0.00229944 +0.0255827 0.034587 0.0128177 +-0.0258582 0.100162 -0.023852 +-0.0317095 0.0382098 0.0512104 +-0.0608875 0.104029 -0.0182853 +-0.0577034 0.0591273 0.0216745 +-0.0316861 0.0553325 -0.0133983 +-0.0579004 0.0336435 0.0147513 +-0.050636 0.0604891 -0.0105672 +-0.0484979 0.101507 0.0419588 +-0.0735846 0.159652 -0.032921 +-0.0596849 0.136693 0.0347693 +-0.0527883 0.0490273 0.0246529 +-0.00587038 0.038496 0.0083708 +0.0443161 0.095966 0.0141619 +-0.0355281 0.0832646 0.0432735 +-0.0552893 0.160933 0.00328411 +-0.0694051 0.177621 -0.0490523 +0.0553162 0.0608807 0.0271604 +-0.0115038 0.082913 0.0576973 +0.00149573 0.118307 0.0388892 +-0.0643923 0.178295 -0.0607754 +-0.0696234 0.0702067 -0.00731499 +-0.0684446 0.156174 0.0134711 +-0.0631402 0.158352 -0.0425984 +-0.028277 0.0807444 0.0465032 +-0.0851037 0.143224 0.00618561 +-0.0701909 0.171451 -0.0335218 +-0.0542038 0.149302 0.0263885 +-0.0230864 0.0416339 0.0540702 +-0.0848397 0.124371 0.0492354 +-0.0509437 0.0349503 0.0448676 +0.0147035 0.0490065 0.0456198 +-0.059742 0.156334 0.00641085 +-0.07522 0.0688188 0.0015368 +-0.0196569 0.0390707 0.0375255 +0.0459174 0.0834201 0.0141703 +-0.0785236 0.0894249 -0.0105705 +-0.0200463 0.0893341 0.0549931 +-0.0173075 0.11558 -0.0164072 +0.000516136 0.0760027 0.0580883 +0.042165 0.0859172 -0.00778247 +0.0203197 0.0664896 -0.0280597 +-0.0604906 0.0959808 0.043977 +-0.00180047 0.0840422 -0.0369301 +0.0106204 0.119324 -0.014581 +0.000242427 0.128645 -0.00250259 +-0.0544918 0.0876045 0.0451014 +-0.081252 0.0993542 0.0322994 +0.0225815 0.0632207 0.0466294 +-0.0528036 0.129718 0.0341858 +0.0388075 0.10554 0.0251669 +-0.071237 0.156366 0.0212013 +-0.0419921 0.0349859 0.0415962 +0.0319555 0.0413937 0.028007 +-0.0465003 0.112564 0.0357108 +0.00310161 0.111606 -0.0202814 +0.0306552 0.102095 0.0374778 +0.0158981 0.0576764 0.0492073 +-0.036508 0.127508 0.00348399 +0.0403284 0.0574912 -0.00511853 +-0.06805 0.157495 -0.00534926 +-0.0870566 0.0847034 0.0124776 +-0.0785035 0.127443 0.053282 +0.0093755 0.0479282 -0.0271091 +-0.00151782 0.111398 -0.0200294 +-0.0386619 0.0336282 0.00792475 +-0.0321818 0.0666221 -0.0204419 +-0.0516478 0.0334795 -0.00363494 +-0.0505323 0.0346392 0.0434961 +-0.0871097 0.129792 0.0470428 +-0.00115829 0.0378141 0.0044798 +0.00250327 0.0351261 0.00210209 +0.0232927 0.0720269 -0.0262872 +0.0386441 0.0772022 -0.0107761 +0.00730214 0.0624461 -0.0313742 +-0.0601285 0.0334799 -0.007174 +-0.0311809 0.165241 -0.0158459 +-0.0456556 0.126096 -0.00729728 +0.01482 0.0920349 -0.0274402 +-0.0578658 0.154169 0.0274197 +-0.0766831 0.148629 -0.00786722 +-0.0548976 0.0574275 -0.00541424 +-0.0213746 0.0936314 -0.0333712 +-0.0795038 0.127439 0.0531413 +-0.0719602 0.0381531 0.00797803 +0.0465231 0.0539629 0.0319545 +-0.0327551 0.126411 0.00489661 +-0.0907403 0.135093 0.0162106 +-0.0798437 0.119249 -0.00499812 +-0.0195891 0.186548 -0.0163318 +-0.0336818 0.0474202 0.0430149 +0.0387003 0.0847793 0.034951 +0.005123 0.108732 -0.0201833 +-0.0355723 0.127236 0.00383072 +-0.0593755 0.0706339 0.0387044 +-0.0701237 0.0337481 0.00141754 +-0.0596389 0.0645563 -0.0073211 +-0.0247044 0.0349045 0.050534 +-0.0698349 0.155896 0.010068 +-0.00664542 0.0496313 -0.030799 +-0.0560508 0.049202 -0.00336342 +-0.0846449 0.0777798 0.00851725 +0.0428444 0.0958802 0.0241636 +0.0226208 0.0505695 0.0412719 +-0.0421939 0.165153 -0.0106292 +-0.0530779 0.153128 -0.00337034 +-0.0183995 0.128105 0.0144964 +0.0110096 0.125946 -0.00574203 +0.0135498 0.109816 -0.0183273 +0.0246987 0.1167 0.0323736 +-0.0323986 0.169744 -0.00487272 +0.0414995 0.0513848 0.032599 +-0.0820948 0.0748388 0.0105311 +-0.0771842 0.102138 0.0352151 +-0.0627985 0.161541 -0.0235962 +0.0203907 0.0490438 0.0415331 +-0.0284862 0.120462 -0.00941436 +0.00850898 0.0990197 0.0481875 +0.0181919 0.0781799 0.0527467 +-0.0323958 0.0383608 -0.00233468 +-0.0198811 0.121697 -0.00881459 +-0.0289402 0.154865 -0.00285823 +-0.055522 0.0600566 -0.00554029 +-0.0446949 0.0680713 -0.0159309 +-0.0505296 0.0657745 0.0361047 +0.0251595 0.0995713 -0.0194056 +0.0456643 0.0876028 0.0121678 +-0.0533672 0.143136 0.0253913 +-0.05283 0.138085 0.0270749 +-0.0324865 0.0974182 0.0443398 +0.00543862 0.118556 -0.0157347 +-0.0704807 0.1602 -0.00768602 +0.00476485 0.0378127 -0.0129945 +0.0453303 0.0875809 0.0171699 +0.00844159 0.109753 0.0403226 +0.0199305 0.0645206 0.0480779 +-0.0865012 0.0967606 0.00143514 +0.0239407 0.0433254 -0.00969837 +-0.0464991 0.0818806 0.0436011 +-0.0365053 0.0832925 0.043701 +-0.0511539 0.144707 0.0143676 +-0.0354688 0.0973337 0.0432864 +0.0315086 0.0361416 0.0180806 +-0.0620392 0.152203 -0.0175795 +-0.00174908 0.0726707 -0.0356483 +0.0482658 0.0482112 0.0273759 +0.0205204 0.0686316 0.0489712 +0.0055446 0.129937 0.0246284 +-0.0509363 0.126898 0.0333376 +0.0503401 0.0525815 0.0286903 +-0.0663805 0.0356243 0.0152158 +-0.0631059 0.039729 0.0160762 +-0.0794629 0.0702542 0.0118898 +-0.0440204 0.0437247 -0.0153148 +-0.0258047 0.0811626 -0.0373791 +-0.0654527 0.156561 -0.05302 +-0.0801896 0.0926573 0.034266 +-0.0226625 0.0493576 -0.0281762 +-0.076512 0.15561 -0.00689633 +-0.0316228 0.0384779 -0.00967109 +0.0073096 0.0609801 -0.0307365 +-0.036779 0.0827886 -0.0223365 +-0.0454595 0.0846983 0.0440929 +-0.0310517 0.0636961 -0.0214339 +0.044971 0.0748214 0.0226935 +-0.0245671 0.182966 -0.016053 +-0.0343794 0.125292 -0.00246071 +0.0260218 0.0493062 -0.0196675 +0.00451349 0.0786214 0.0559314 +-0.0272596 0.0409813 0.0537728 +-0.0865558 0.105007 0.0203641 +-0.0427952 0.0347556 0.00787321 +-0.0294944 0.0889496 0.044252 +-0.0691615 0.0832998 0.0419252 +-0.077704 0.175863 -0.0450747 +-0.0595653 0.0407951 0.0449735 +-0.0118194 0.129824 0.0125318 +-0.0304269 0.169744 -0.0072967 +0.00750596 0.0674413 0.055134 +-0.0895098 0.0942825 0.014433 +0.0566953 0.0550372 0.00319006 +0.0358581 0.0995241 -0.0113664 +-0.0541815 0.15229 0.0244282 +-0.0924737 0.125588 0.0362608 +-0.0750911 0.110634 0.0449752 +-0.0272685 0.0368017 0.0538626 +-0.0614955 0.104283 0.0410789 +-0.0721148 0.067315 0.0248191 +0.034236 0.094243 0.0391072 +-0.0724407 0.178857 -0.0487083 +-0.06691 0.033448 -0.00125687 +-0.0660379 0.0349778 0.0329828 +-0.0701097 0.156012 0.00122102 +-0.0157478 0.0352634 0.050467 +-0.0465076 0.160794 0.0071118 +-0.0156218 0.0365183 -0.0177136 +-0.00687536 0.0389886 0.0330493 +0.0201949 0.0959886 -0.0227072 +0.00536718 0.125777 0.0317922 +-0.0689036 0.105186 -0.0135662 +-0.0576505 0.0508003 0.0036576 +-0.0372877 0.0353832 0.0246264 +-0.0766222 0.0824671 -0.0115781 +-0.0570813 0.0344654 0.0405363 +0.0284042 0.0431456 -0.00552671 +-0.078005 0.151454 -0.00188508 +0.00274784 0.0953419 -0.0309592 +-0.0764328 0.147234 -0.00786196 +-0.0187399 0.0656914 -0.0372373 +-0.0626784 0.0670893 0.0340154 +-0.066213 0.0377522 0.0375383 +0.00946024 0.0346841 0.0420404 +-0.00763703 0.046711 -0.0299661 +0.0217664 0.106013 0.0404033 +0.0159395 0.0900955 0.0512828 +-0.0714939 0.126019 0.0527835 +-0.035368 0.122868 0.0260927 +0.0397669 0.0885289 -0.0117744 +-0.0235296 0.159196 -0.00227474 +-0.0299919 0.0383903 -0.00556396 +0.00840449 0.0360838 -0.0229864 +-0.0688351 0.0951745 -0.0162656 +0.0188202 0.124811 0.0265908 +-0.0542034 0.0477679 0.0266683 +-0.00718512 0.0384992 0.0226001 +0.0191993 0.0352366 0.0345338 +-0.0486962 0.13553 0.00541025 +0.0065027 0.0533154 0.0528127 +-0.064997 0.0410349 0.013689 +0.0235192 0.107033 0.0392433 +-0.0526101 0.0632972 -0.0100113 +0.0288769 0.120252 0.0217702 +-0.00882418 0.0896578 -0.0365764 +-0.0563459 0.0335397 0.00260276 +0.0287652 0.114389 -0.00726895 +0.0564669 0.0577845 0.00118215 +-0.0623836 0.163016 -0.0556039 +-0.0235351 0.118111 0.0331575 +0.0443232 0.0889197 0.0231574 +0.0349753 0.114037 0.00545779 +0.0269837 0.108749 0.0374141 +-0.000496913 0.056284 0.0547664 +-0.0889882 0.115854 0.0042936 +-0.0688144 0.0851338 -0.0175228 +-0.0304795 0.0746468 0.0405648 +-0.0616784 0.0692367 -0.0132074 +-0.0554108 0.0334149 -0.00799207 +-0.0610813 0.0342293 0.0311986 +-0.0655517 0.155937 0.0246661 +-0.0767597 0.163153 -0.0191399 +-0.0140741 0.0388251 0.0317136 +-0.02858 0.0731702 0.040795 +-0.0480086 0.134685 0.0198054 +-0.00949027 0.107257 0.0434611 +-0.0224071 0.0510134 0.0440995 +0.0026516 0.0341771 0.00670019 +-0.00282121 0.086807 -0.0363939 +0.00461042 0.092806 -0.0323339 +0.0444404 0.0425371 0.0222477 +-0.0251232 0.0838362 0.0531591 +-0.0711154 0.155676 0.00670049 +-0.0144639 0.0977101 -0.0275565 +-0.0176152 0.0407641 -0.0279656 +-0.0273216 0.038344 -0.00129213 +-0.0781679 0.14865 -0.00288263 +-0.071113 0.171733 -0.033865 +-0.0362701 0.0365605 0.0458807 +-0.0245074 0.0384654 -0.0082311 +-0.0768529 0.106269 -0.00826114 +0.0173624 0.088714 0.0498122 +-0.0872512 0.106353 0.0133638 +-0.0647985 0.124215 0.0485 +0.0274255 0.0686124 0.0431235 +-0.0275944 0.0717748 -0.0345689 +-0.00449702 0.0590031 0.0543234 +-0.00869265 0.0598566 -0.0344628 +-0.0624896 0.106999 0.0393995 +0.00296819 0.0986498 -0.0244883 +-0.0716108 0.0701594 -0.00639514 +-0.0454969 0.0733342 0.042072 +0.0217583 0.0505253 0.0417779 +0.0599479 0.0692188 0.0141571 +0.0159709 0.0859869 -0.0291978 +0.0474137 0.0671743 0.000684928 +0.045537 0.0890033 0.0131643 +0.025235 0.0690602 -0.0242719 +-0.0140104 0.117853 -0.0148385 +-0.0417786 0.156522 0.00614116 +0.0529468 0.0608894 0.0290245 +-0.0623778 0.167137 -0.0608155 +-0.043781 0.0422821 -0.0183128 +0.0194047 0.0727279 0.0509389 +-0.025431 0.180214 -0.00870569 +0.00163035 0.0962275 -0.0299038 +-0.0609057 0.119508 -0.00974426 +-0.0265539 0.180361 -0.00771033 +-0.00586693 0.104511 -0.0229142 +-0.0446124 0.0534121 -0.0108089 +-0.0607974 0.125499 0.0419374 +-0.0676844 0.160922 -0.0559942 +-0.0718937 0.0376106 0.00231258 +-0.0769618 0.103489 0.0349575 +-0.0136243 0.0450811 -0.0280269 +-0.0656393 0.145367 0.0403005 +-0.067848 0.0994807 -0.015636 +-0.0674005 0.156127 0.0138467 +-0.0814089 0.141772 -0.000809353 +0.0343092 0.113032 0.0252402 +-0.0378129 0.0900392 -0.0237743 +0.0410972 0.0779427 0.031296 +-0.0594968 0.104294 0.0413247 +-0.045045 0.0657131 0.0396946 +0.0424943 0.0569701 0.0318321 +0.0380924 0.0618152 0.0338774 +-0.0181385 0.038277 0.0223668 +-0.0680503 0.114246 0.0489904 +-0.089636 0.0902445 0.0164491 +-0.0259323 0.124597 0.000115117 +-0.0341212 0.124555 0.022076 +-0.0117695 0.075665 -0.0382916 +-0.0666005 0.156329 0.0184798 +0.0143467 0.0580862 -0.0289605 +0.00620145 0.0832401 0.0564613 +-0.07299 0.158232 -0.0339184 +0.0179038 0.0866718 -0.0278625 +-0.0447879 0.085543 -0.0216723 +0.0240528 0.0347605 0.00303304 +0.0471472 0.0437632 0.0216364 +-0.0254743 0.105723 0.0415881 +-0.0914335 0.120003 0.00730918 +-0.0381624 0.035793 0.0434599 +-0.0470742 0.127422 -0.00463291 +0.000501079 0.0620074 0.0565701 +-0.0488714 0.104198 -0.020417 +-0.00949444 0.063336 0.0558203 +-0.0227837 0.0742285 -0.0385317 +-0.00949145 0.115547 0.0400498 +-0.0665386 0.0804536 0.042224 +0.00148883 0.121012 0.0365952 +-0.024281 0.069418 0.0457102 +0.019893 0.114777 -0.0136897 +-0.0904011 0.115144 0.0307537 +-0.00370938 0.0627709 -0.0350699 +-0.00367406 0.0555102 -0.0326331 +-0.0125077 0.0773203 0.0572074 +-0.0574951 0.093265 0.0451928 +-0.0942113 0.120123 0.0212925 +-0.0213358 0.165379 -0.00997448 +-0.0615068 0.0789665 0.042503 +0.00239149 0.0343213 0.0156312 +-0.0639126 0.11101 -0.0139478 +0.0381439 0.103967 -0.00387277 +-0.0816033 0.101897 -0.00556882 +-0.0582639 0.12123 0.0402958 +-0.0729322 0.156105 0.0220745 +-0.0514974 0.086244 0.0456131 +-0.0876158 0.137864 0.0416648 +0.0120082 0.0967361 -0.024421 +0.0147782 0.0929392 -0.0263979 +-0.0510555 0.150177 -0.00351578 +-0.0165661 0.163924 -0.0100865 +-0.00519498 0.0390091 -0.00671136 +-0.021716 0.0641363 -0.0354017 +-0.0523357 0.136679 0.027812 +0.0335961 0.0633113 0.0397473 +-0.0384865 0.0492045 0.0394845 +-0.0339969 0.152567 -0.000573454 +0.0175453 0.0645325 0.0499023 +-0.0895247 0.139293 0.0351741 +-0.0870044 0.115772 0.00228167 +-0.0852267 0.0792333 0.0184927 +-0.0927665 0.116031 0.013321 +-0.0240588 0.111793 -0.0183639 +0.0191819 0.123133 0.0296014 +0.0163312 0.0767998 0.0535416 +-0.0834123 0.0856961 -0.00454328 +-0.0614974 0.0904473 0.0454009 +-0.0648003 0.0370671 0.0164284 +-0.0102366 0.125327 0.0306172 +-0.0512935 0.0556822 0.0305914 +-0.0674962 0.0930678 0.0426016 +-0.0707247 0.156767 -0.045914 +-0.0611468 0.0584317 0.0117762 +0.0152753 0.0680849 -0.0302874 +-0.0638387 0.163409 -0.0592654 +0.030267 0.0496887 -0.0107252 +-0.0227695 0.0684387 -0.0367377 +0.0216497 0.065881 0.0470485 +-0.0849335 0.125015 -0.00321773 +-0.0364959 0.0562316 0.0392716 +-0.0132153 0.0406258 0.0508237 +0.00695506 0.0982177 -0.0239936 +0.00047843 0.12713 -0.00487855 +0.0354045 0.046148 -0.00604177 +-0.0913848 0.129679 0.0322355 +-0.0924762 0.124198 0.0322659 +-0.0057025 0.12744 -0.00517306 +0.032332 0.110047 0.0311032 +-0.0374975 0.0662835 0.0416878 +-0.0306651 0.155159 -0.000638202 +0.0161 0.12839 0.0198796 +-0.0392376 0.124806 0.0231803 +0.00131504 0.0597888 -0.0330641 +-0.0445007 0.0931064 0.043109 +-0.0174373 0.0336888 -0.022956 +-0.0536509 0.0343311 0.0291848 +0.0348249 0.110986 -0.0028353 +0.0280633 0.100998 -0.0169482 +0.0423903 0.0490515 -0.00589339 +0.0306614 0.119205 0.0153072 +-0.0604957 0.0876028 0.045161 +-0.0137303 0.0699989 -0.0380502 +-0.00750341 0.130405 0.00835201 +-0.0494799 0.116621 0.0323892 +-0.058737 0.075302 -0.0183386 +-0.0518764 0.0550741 0.0228473 +-0.0293899 0.118762 -0.0116358 +-0.0743199 0.158257 -0.0279194 +-0.0265758 0.0533991 -0.0263925 +-0.047508 0.0903548 0.0442194 +-0.0104972 0.0815462 0.0580111 +-0.0356136 0.0408304 -0.0293778 +-0.0622824 0.159968 -0.0396048 +-0.0727292 0.0730957 -0.00887693 +0.0252321 0.0889244 0.0471615 +0.0362811 0.0443655 0.0298564 +-0.0583717 0.138143 0.0331568 +0.0516174 0.0711387 0.00464104 +0.00649466 0.0427198 0.0454361 +-0.0187116 0.0598792 -0.0350421 +-0.0603468 0.0339987 0.0210215 +0.0310626 0.107429 0.0345663 +-0.0153967 0.0384283 -0.000805549 +0.0390675 0.0617702 -0.00778266 +-0.0718188 0.0907915 -0.0158595 +-0.0066784 0.0569449 -0.0331859 +0.00738229 0.0448872 -0.0251556 +0.0193881 0.0506007 -0.0247336 +-0.0171345 0.165288 -0.0183426 +0.0172728 0.0694422 -0.0295359 +0.0518225 0.072596 0.0200635 +-0.085483 0.140457 0.00319222 +-0.049383 0.140141 0.0133936 +-0.076884 0.155644 0.0221655 +-0.0584972 0.111135 0.0367864 +-0.0264895 0.102963 0.0427118 +-0.016526 0.0387631 -0.00875803 +-0.060493 0.107007 0.0395303 +-0.0133132 0.0385196 -0.000466347 +0.027107 0.0406036 0.0313674 +-0.0852773 0.137655 0.00128094 +-0.0776954 0.16804 -0.0399638 +-0.0465214 0.0505047 0.038174 +-0.0251912 0.178602 -0.0188241 +-0.0524991 0.101502 0.0417298 +-0.0142894 0.184628 -0.0268303 +0.00710791 0.110158 -0.019992 +-0.0766628 0.155608 -0.00789132 +-0.0814761 0.0734707 0.0145404 +-0.0644951 0.0789605 0.0422031 +0.0403539 0.105584 0.00317596 +-0.0633486 0.0371336 0.0178291 +-0.0808831 0.117721 -0.00384392 +-0.0265027 0.10847 0.0397156 +0.0236097 0.121674 0.028372 +-0.0623736 0.164689 -0.0415928 +-0.0495545 0.0404082 -0.0113965 +-0.0562131 0.054804 -0.00139993 +-0.0418518 0.098529 -0.0215916 +0.0133351 0.058103 -0.0291864 +-0.0594448 0.063179 0.0293052 +0.0113019 0.0652847 -0.0308368 +-0.0783582 0.0994351 0.0350546 +-0.0715439 0.0376425 0.00026118 +-0.0154996 0.112736 0.0400881 +0.0417289 0.0704356 -0.00679567 +-0.0406463 0.127804 0.0152535 +-0.0627661 0.170921 -0.0616075 +-0.0923057 0.12017 0.0426167 +-0.00727442 0.0422617 0.0488857 +0.0350851 0.0848737 -0.0178837 +-0.01578 0.128598 0.00819831 +-0.03217 0.0735917 -0.0275208 +-0.0673634 0.110954 0.0392365 +-0.0271001 0.0779439 0.0468281 +-0.0765081 0.156243 -0.00790412 +0.0277565 0.117474 -0.00457839 +-0.0113381 0.0986434 -0.0265191 +-0.0330823 0.0695155 -0.0204574 +-0.0652177 0.144322 -0.0140816 +-0.0094303 0.0379372 -0.0159242 +-0.0245144 0.0945317 -0.028309 +-0.05375 0.0560385 0.0116204 +-0.0679678 0.0383221 0.0123903 +0.00399334 0.0399971 0.0458959 +-0.0841715 0.0870272 0.0285556 +-0.0274573 0.0734015 0.0426855 +-0.0626773 0.153684 -0.0325991 +-0.0741408 0.105214 0.0369385 +-0.0134986 0.081495 0.0573009 +0.0463327 0.0421886 0.017365 +-0.0644937 0.108375 0.0384047 +-0.0653695 0.151233 0.0366147 +-0.018937 0.178659 -0.0169738 +-0.0820692 0.0748107 0.00351555 +-0.0841353 0.146019 0.0379782 +-0.0148578 0.163977 -0.0174595 +-0.0817263 0.0747702 0.00249857 +0.000235601 0.0740952 -0.0356038 +0.000940682 0.0357179 -0.0155776 +-0.0719363 0.129668 -0.0086833 +0.0301411 0.102934 -0.0150039 +-0.0651961 0.0334974 -0.00275965 +-0.0185844 0.16399 -0.00948536 +-0.0592125 0.042121 0.0445708 +7.57538e-05 0.0369473 0.00366537 +0.0152945 0.0666369 -0.0299356 +0.0410157 0.0739041 0.031202 +-0.0577153 0.0344512 0.0421091 +-0.0920793 0.129683 0.0282033 +-0.0497426 0.0753235 -0.0177986 +-0.0484934 0.047761 0.0395051 +-0.0809803 0.104706 0.0304576 +-0.0746935 0.111142 -0.00760178 +0.0204806 0.109788 0.0388648 +-0.0734977 0.128836 0.0522844 +-0.0426178 0.0520018 -0.0109441 +0.0112198 0.0932651 -0.0287439 +-0.0119274 0.182669 -0.0262872 +0.0145534 0.0347576 0.0376203 +-0.0810222 0.100509 -0.00657927 +-0.0033633 0.038102 0.0128662 +-0.0937861 0.128264 0.0182441 +0.0084061 0.0949783 -0.0285638 +-0.0695902 0.113495 0.0492959 +0.000169576 0.131258 0.0183392 +-0.0931626 0.117374 0.0143043 +-0.0195343 0.112367 -0.0190097 +-0.0524215 0.162453 0.00456363 +0.0184901 0.0879016 0.0492476 +-0.0685433 0.170852 -0.0550244 +-0.087182 0.130813 0.00128919 +0.00130454 0.0641388 -0.0343264 +-0.000757317 0.075519 -0.0359212 +0.0308776 0.0902792 0.0430757 +-0.00578939 0.0386518 0.00278679 +-0.076212 0.155059 0.00635026 +-0.0248315 0.0881388 -0.0362597 +-0.0222598 0.160103 -0.0129456 +-0.00877699 0.0770434 -0.0377883 +-0.06674 0.0383979 0.0141071 +-0.00350265 0.0689326 0.0566398 +-0.0295614 0.0861399 -0.0326125 +-0.0286647 0.125711 0.0122564 +-0.0699648 0.0791315 0.0398469 +0.0142764 0.128727 0.0220636 +-0.0638003 0.110914 0.037425 +-0.0719625 0.135504 -0.00769556 +-0.0527869 0.124083 0.0359567 +-0.0467161 0.0738381 -0.0169211 +-0.0117423 0.070003 -0.0378791 +-0.0517809 0.138537 0.023394 +-0.00482205 0.130969 0.0150835 +0.034711 0.0383001 0.0222555 +-0.00127486 0.120883 -0.0121504 +0.0112227 0.0850587 -0.0310098 +-0.0506063 0.0369029 -0.0119734 +0.0433147 0.0831895 0.0275132 +0.0112941 0.127457 0.0281604 +0.0151622 0.122267 0.032438 +0.0400834 0.082061 0.0334038 +-0.0745622 0.152707 -0.0248951 +-0.0528479 0.141625 0.0244146 +0.0245482 0.035172 0.0211866 +-0.0325075 0.11115 0.0364446 +0.0417109 0.0957641 -0.00380547 +-0.00538241 0.130597 0.0192035 +-0.0649174 0.0364897 0.025021 +-0.0770334 0.158982 -0.013085 +-0.0760388 0.148613 -0.0118618 +0.0283559 0.116347 0.030146 +-0.088594 0.121257 0.00130017 +-0.0268076 0.122539 -0.00562189 +-0.0346629 0.0607102 -0.0125376 +0.0413795 0.0505691 -0.00672382 +-0.0906746 0.1365 0.0201946 +0.00951942 0.100425 0.0477045 +-0.0642867 0.172466 -0.0611328 +-0.0242433 0.172722 -0.0123976 +0.00950564 0.0990636 0.0482467 +0.0101664 0.120462 0.0359466 +-0.0187755 0.107692 -0.0220397 +0.0335012 0.0795469 0.0414506 +-0.0834882 0.14321 0.00316117 +-0.0530161 0.141613 0.0254095 +-0.0395373 0.172163 -0.000837254 +0.0387477 0.0589461 -0.0057234 +-0.0647673 0.0795072 -0.0181104 +-0.00140393 0.0361018 0.00962515 +-0.00524162 0.0395598 0.0483202 +0.0236373 0.103743 -0.0178545 +-0.000477761 0.0760312 0.0584165 +-0.0210492 0.0348694 0.0496408 +-0.00244654 0.131114 0.00878185 +-0.033711 0.0384262 -0.00450177 +-0.0745333 0.152696 -0.0258905 +0.055409 0.0509629 0.0218922 +-0.0134774 0.127753 0.000758007 +-0.0120362 0.0388366 0.0321214 +-0.0278604 0.0487672 0.0470543 +0.0327952 0.0713854 0.0403707 +-0.0728362 0.0979301 -0.0143404 +-0.0367225 0.125751 0.02112 +0.0198232 0.0385183 -0.0126921 +-0.0377749 0.150712 0.00133662 +-0.0665966 0.180807 -0.0581921 +-0.0215095 0.114043 0.0376946 +-0.0620515 0.035927 0.0204607 +-0.0584945 0.150006 -0.0011129 +-0.0335992 0.1188 -0.0116562 +0.0196457 0.116633 0.0356159 +0.0248522 0.0685926 0.0446792 +-0.0164926 0.0544756 0.0504072 +-0.051136 0.140067 0.0203692 +-0.089139 0.139182 0.0122002 +0.0163249 0.0580554 -0.0285 +-0.0621816 0.0342254 0.0257179 +-0.0188821 0.0387745 -0.0111028 +-0.053388 0.034491 0.0395762 +-0.000472072 0.130948 0.0195451 +-0.0634988 0.173693 -0.0615446 +-0.054487 0.0452173 0.0438312 +-0.0202902 0.0906146 -0.0362948 +-0.0725702 0.17984 -0.0501722 +-0.0707759 0.162402 -0.0459559 +-0.0463694 0.113628 -0.0162147 +-0.0523573 0.0345285 0.0397607 +-0.0136632 0.0511316 -0.0317578 +-0.00948303 0.0703233 0.0561585 +-0.0852113 0.0869359 0.026743 +-0.0745333 0.0805197 0.0374668 +0.00349251 0.118288 0.0385113 +0.0493697 0.0693787 0.0250272 +0.029581 0.0736246 -0.0217333 +-0.0400646 0.156235 -0.00986121 +-0.0818113 0.136716 0.048659 +-0.0809364 0.129495 -0.00494346 +-0.0875459 0.110452 0.0143395 +0.0253164 0.112728 0.0350367 +-0.0852858 0.0845126 -0.000515374 +0.00212883 0.120316 -0.0135831 +-0.0192664 0.0381478 0.0114056 +0.0493315 0.0589269 -0.00474568 +-0.0183092 0.162495 -0.00732366 +-0.00730789 0.12834 -0.00208974 +-0.0286194 0.180015 -0.014033 +0.0255963 0.0648009 -0.0228004 +-0.00925832 0.177251 -0.027731 +-0.0485485 0.0432385 -0.0107358 +-0.0600861 0.14609 -0.00280453 +-0.026172 0.174158 -0.0190728 +-0.059111 0.0686528 0.0369372 +-0.0434854 0.0944868 0.0426487 +-0.0216341 0.038095 0.0200103 +-0.0670537 0.071446 0.0363402 +-0.0348255 0.0915164 -0.024068 +-0.0202598 0.174222 -0.0154191 +0.0344662 0.114921 0.00815778 +-0.0686919 0.0750175 -0.0147112 +0.026272 0.0789381 -0.0240124 +0.0202522 0.0805604 -0.0270674 +-0.0432329 0.156565 0.00586077 +-0.00650833 0.0787624 0.0577507 +-0.0335034 0.0774945 0.0414157 +-0.0606769 0.0676671 -0.0113119 +-0.0656284 0.162324 -0.0174746 +0.00729944 0.0639619 -0.0320669 +-0.00448657 0.0898027 0.0567005 +-0.0584972 0.0918588 0.045399 +0.00218731 0.0852799 -0.0344916 +-0.0417916 0.0869783 -0.0214259 +0.0463392 0.0489694 -0.00446687 +-0.0389761 0.128486 0.00847309 +0.00727028 0.11232 0.040519 +-0.0234564 0.0680424 0.0463484 +-0.0797185 0.0803984 0.0327643 +0.0232549 0.0645506 0.0458531 +0.0198821 0.0449543 0.0425235 +-0.0394974 0.0902763 0.0431118 +-0.0662858 0.172388 -0.0591199 +0.0259452 0.0364961 0.0239139 +-0.0714148 0.0386609 0.00057855 +-0.0638254 0.0924713 -0.0188016 +-0.0584874 0.112515 0.0360801 +-0.0623619 0.166253 -0.047591 +0.0452758 0.0875665 0.00218329 +-0.0244115 0.0379996 0.0159179 +0.0452209 0.0659646 -0.000116442 +-0.0707693 0.176767 -0.0466577 +-0.0650223 0.156803 -0.0519494 +0.0354173 0.0414682 -0.003097 +-0.0416808 0.0622091 -0.0130274 +0.0326595 0.114633 -0.00147403 +-0.0495274 0.14168 0.00739502 +0.0388579 0.0970015 -0.00784 +-0.00249575 0.0389742 0.0303561 +0.0070795 0.101453 -0.021277 +0.0291938 0.0754716 0.043989 +0.00502464 0.126695 -0.00649713 +-0.016158 0.0884114 -0.0380198 +0.0115883 0.102988 -0.0210311 +0.0576451 0.0661396 0.0235216 +0.0317192 0.118031 0.0171382 +-0.0116954 0.175688 -0.0223293 +0.00121183 0.0853285 -0.0350521 +-0.0158308 0.0883117 -0.038067 +-0.0686258 0.0846974 0.0427491 +0.00833511 0.0595736 -0.0302453 +0.0450509 0.0423962 0.0206492 +-0.027467 0.0793682 0.0471485 +-0.0679777 0.0716192 0.0360049 +-0.0718018 0.158195 -0.0399213 +-0.0114987 0.0856547 0.0572923 +0.0131441 0.0346685 0.0356066 +-0.0620328 0.156862 -0.0185851 +-0.0607717 0.113836 0.03657 +-0.0764751 0.146968 0.0421376 +-0.0207673 0.117009 -0.0138783 +0.0416942 0.0655359 -0.00371801 +-0.0306051 0.0524133 -0.0153638 +0.0107636 0.130209 0.0207729 +-0.0902734 0.133771 0.0282153 +-0.0235934 0.0383252 0.00311252 +-0.012672 0.0526484 -0.0327744 +-0.0309385 0.0622798 -0.0204312 +-0.0337803 0.122942 0.0251825 +-0.0598823 0.146825 0.0363335 +-0.0447526 0.0336781 0.00121434 +-0.0540428 0.0334293 -0.000440359 +0.0119421 0.123166 0.0332435 +0.0105328 0.103079 0.0462759 +-0.00696577 0.0389018 -0.00510709 +-0.033478 0.0632761 0.0395519 +-0.0386238 0.0519962 -0.0107523 +-0.0778526 0.159695 -0.0239243 +-0.0154805 0.109966 0.0416657 +-0.0688005 0.087996 -0.0171065 +-0.0428494 0.0999447 -0.0214282 +0.02441 0.101163 -0.0191142 +-0.0630974 0.160042 -0.0195595 +-0.0591899 0.154851 0.0254882 +-0.0694874 0.100005 0.0406788 +-0.063101 0.150495 -0.0266018 +-0.000774843 0.0783346 -0.0358957 +-0.0335129 0.112536 0.0351002 +0.00348618 0.11278 0.041408 +0.0454091 0.0918015 0.00517469 +-0.030521 0.0636541 -0.0224277 +-0.0564983 0.108415 0.0389345 +-0.0454982 0.045182 0.0420491 +0.0366564 0.089932 -0.0151793 +-0.00318743 0.0350129 0.0463208 +0.0397193 0.0787183 -0.00974279 +-0.0456155 0.165496 -0.00783315 +-0.0401614 0.110268 -0.0187071 +-0.0607836 0.171276 -0.0609166 +-0.0849643 0.0885105 -0.00254627 +0.000663768 0.131541 0.0142252 +-0.0773558 0.163115 -0.0213545 +-0.00442024 0.118937 -0.0140576 +0.029367 0.1045 -0.0146741 +-0.0767078 0.176155 -0.0445645 +-0.087862 0.117151 0.00226309 +-0.0674561 0.1652 -0.0559896 +0.0417828 0.101446 0.0181564 +-0.0504972 0.0465484 0.0414292 +0.0334855 0.0808915 0.0414362 +-0.0640951 0.0700461 0.0364211 +-0.0500004 0.121197 0.0329094 +-0.0640156 0.0344353 0.0303981 +0.0161688 0.0407187 0.0441528 +-0.0175288 0.165418 -0.0114925 +-0.0156111 0.0407209 -0.0274801 +-0.0136265 0.129395 0.0133241 +-0.060628 0.0588072 0.00794551 +0.0064803 0.0977098 0.0499318 +0.0439772 0.079046 -0.00278888 +0.0418428 0.0986036 -0.00180869 +-0.0225444 0.178667 -0.0133919 +-0.0606264 0.0336734 0.0105944 +-0.0434 0.0336807 -0.00215159 +-0.0886031 0.143176 0.0340326 +-0.0849284 0.107666 0.0223625 +0.0592303 0.0580467 0.0201933 +-0.0540206 0.147182 -0.0016614 +-0.00601913 0.126314 0.0306279 +-0.0686207 0.149674 -0.0393499 +-0.0919325 0.130933 0.0102425 +-0.0568299 0.143897 0.0319274 +-0.0354984 0.115235 0.0327878 +-0.0174958 0.0701523 0.0542792 +0.0270421 0.0862601 0.0462384 +-0.0488595 0.101383 -0.02158 +-0.0733679 0.152652 -0.0338969 +-0.0750934 0.159541 -0.00936327 +-0.0374543 0.155389 -0.00975319 +-0.0381729 0.166677 -0.0130206 +-0.087877 0.0990467 0.0233782 +-0.00160432 0.0405525 -0.0251988 +-0.0903048 0.139241 0.0221876 +-0.00139541 0.0385701 0.0219096 +-0.0221672 0.0839099 0.0558332 +-0.000827607 0.0389424 0.0289209 +-0.0177093 0.0385258 -0.00321073 +-0.0221552 0.169733 -0.0198584 +-0.0574718 0.156359 0.0101234 +0.0162407 0.0793143 -0.0294472 +0.0309621 0.0953572 -0.0169293 +-0.0167051 0.126576 2.44266e-05 +-0.0210968 0.161053 -0.00432438 +-0.0244887 0.100244 0.0443393 +-0.0637376 0.15365 0.0326508 +0.0154945 0.115387 0.0371086 +-0.0110238 0.098585 0.0502027 +-0.0466991 0.122484 0.0270727 +0.015569 0.110589 -0.0172093 +-0.0540772 0.146211 0.0253916 +0.0117081 0.0589891 0.0519593 +-0.0289244 0.033884 -0.0216457 +-0.08784 0.105023 0.0143674 +0.0262802 0.123151 0.0136687 +0.0122982 0.128768 0.0241985 +0.0428587 0.0803554 -0.00479839 +-0.0249679 0.0851951 0.0529639 +0.0259953 0.123127 0.0078705 +-0.000612836 0.0356605 0.0156316 +0.0462948 0.0820457 0.00817944 +-0.0179779 0.15947 -0.0103936 +-0.0237993 0.184341 -0.0145966 +-0.0300075 0.0337589 -0.0217484 +0.0233024 0.124378 0.00401489 +-0.0457643 0.0811616 -0.0200148 +-0.0786005 0.174957 -0.0470491 +0.00992987 0.0806149 0.0548353 +-0.036507 0.0464425 0.0402005 +-0.0229776 0.0681076 0.0472951 +0.0359077 0.111056 0.0244077 +-0.0691331 0.0612207 0.0112337 +-0.0653605 0.174136 -0.0490346 +-0.0246777 0.0366811 0.0541279 +0.00549638 0.115538 0.0397987 +-0.0512593 0.128575 -0.00377835 +-0.0227541 0.0889021 -0.0365754 +-0.052801 0.144689 0.0203903 +-0.0373724 0.0344314 0.0325332 +0.0302609 0.0461225 0.032895 +-0.0668934 0.119448 -0.00885989 +-0.0781478 0.107183 -0.00659237 +-0.0262448 0.109573 -0.0200299 +-0.0930011 0.116069 0.0193086 +0.0199447 0.104671 0.0430468 +-0.0902973 0.114585 0.00733567 +-0.0597131 0.0708022 -0.0154129 +0.011503 0.0909852 0.0534706 +-0.0601621 0.0433793 -0.00606772 +-0.0690356 0.068492 0.0314599 +-0.0662201 0.0390045 0.0360529 +0.0111444 0.104428 -0.02004 +-0.0620602 0.155611 0.00849054 +0.038029 0.105425 -0.00179734 +0.00952421 0.0346423 -0.0128865 +-0.0475328 0.0338333 0.0273813 +0.0275059 0.121239 0.00414409 +-0.0713739 0.162409 -0.0439557 +-0.0388285 0.0339925 0.000319116 +0.0209713 0.0966458 -0.0223043 +-0.0117867 0.0798822 -0.0383021 +-0.00231276 0.123919 -0.0094032 +-0.0623035 0.158393 -0.0375989 +-0.0498834 0.108435 -0.0190271 +-0.0450959 0.122461 0.0255697 +-0.086583 0.1077 0.0153543 +-0.0640141 0.128346 0.0443555 +-0.0910616 0.140621 0.0211716 +0.0222184 0.122028 -0.00352468 +-0.0197563 0.0685528 -0.0378978 +-0.0747315 0.0809443 -0.0125955 +0.0381487 0.056188 -0.00571384 +0.0310862 0.0808926 0.0432566 +-0.0418955 0.0336683 0.02694 +0.0454971 0.0861837 0.00419421 +-0.0515955 0.0575054 -0.00888629 +-0.0923422 0.120143 0.0302906 +-0.0388134 0.0900157 -0.0235053 +-0.0678286 0.139237 -0.00787376 +-0.0500776 0.136736 0.0219567 +-0.0524826 0.132311 -0.00383544 +-0.0725073 0.154019 -0.0378993 +-0.0164965 0.114086 0.0389356 +-0.0266334 0.0505574 -0.0257305 +0.0285947 0.0646316 0.0430307 +-0.050498 0.10288 0.0412159 +-0.0147348 0.0348101 0.0475803 +-0.0147627 0.0728806 -0.0387608 +-0.0425799 0.160887 0.00499665 +-0.0516371 0.0334814 0.00180973 +-0.0574972 0.0973516 0.04313 +-0.0294813 0.179959 -0.00726258 +-0.0696084 0.159782 -0.00738408 +-0.00175707 0.0783385 -0.0360812 +-0.0778906 0.0797955 -0.00863863 +0.0383322 0.0928141 0.0344469 +-0.0459579 0.0368224 -0.0202942 +0.0126438 0.130236 0.0157508 +0.0370668 0.109719 0.0231776 +-0.0650007 0.0600171 0.0167571 +-0.0294928 0.0931993 0.044345 +-0.0849548 0.0952071 0.0290738 +-0.0314917 0.0660582 0.0391556 +0.0283827 0.10475 0.0376855 +0.0125555 0.034405 -0.0178251 +0.0407099 0.0684593 0.0306869 +-0.0321086 0.163743 -0.0150961 +0.00529533 0.064011 -0.0326857 +0.0428516 0.0972538 0.000192155 +0.0475361 0.0451237 0.0241502 +-0.0188094 0.0382725 0.0240343 +-0.0242622 0.0650295 0.043001 +-0.0247852 0.0783802 -0.0377363 +0.0104929 0.0923225 0.0529394 +-0.0684671 0.140894 -0.00832284 +-0.013606 0.0435021 -0.0266802 +-0.0324058 0.05963 -0.0134049 +-0.0709313 0.156768 -0.044906 +-0.0794975 0.113845 0.0467655 +0.0215945 0.126233 0.0147739 +-0.0653369 0.0416124 0.0352199 +0.0546053 0.0733755 0.0137165 +-0.0893171 0.0996957 0.0173941 +-0.0835863 0.0817078 0.00050138 +0.029436 0.039931 -0.00313898 +-0.0614917 0.0661812 0.0332998 +-0.0923901 0.114734 0.0183133 +0.030053 0.0567138 -0.0167759 +-0.00342912 0.0915905 -0.0351346 +-0.0758824 0.100651 -0.0113429 +-0.0457293 0.0348843 0.042622 +0.00615023 0.0385922 -0.00780619 +-0.0547458 0.0768339 -0.0193157 +-0.0356142 0.0493225 -0.0125317 +0.024593 0.0345639 0.00705834 +-0.0892328 0.114145 0.0245988 +0.0348936 0.0586201 -0.0127038 +-0.0828513 0.138047 0.046826 +0.0569539 0.0508846 0.00918952 +-0.0797103 0.0711205 0.00752586 +-0.092065 0.118755 0.0273051 +-0.0103683 0.0388061 0.0306894 +-0.0431813 0.165147 -0.00997877 +-0.0813565 0.109598 0.0300528 +0.0477122 0.0511499 0.0301456 +-0.0678831 0.155252 0.000581516 +0.0349362 0.113582 0.0211925 +0.0280387 0.0549866 0.0403705 +-0.0615433 0.125505 0.042614 +0.0450739 0.0427888 0.00232236 +-0.0544975 0.121335 -0.0101688 +0.0117318 0.0833298 0.0539432 +-0.0144997 0.103011 0.0432504 +-0.0752992 0.149965 -0.0228671 +0.0196742 0.0686359 0.0495084 +-0.0394722 0.107013 0.0383007 +-0.0321381 0.0435397 -0.0289857 +0.0231687 0.0915577 0.0477207 +-0.0480905 0.156132 -0.00685995 +0.00882114 0.0589209 0.053036 +0.000540453 0.0731645 0.0574875 +-0.0842824 0.0818436 0.0235004 +-0.072066 0.0353469 0.00817017 +-0.0548518 0.122696 0.0382478 +-0.0283817 0.123518 -0.00261643 +-0.0178271 0.0855379 -0.0388455 +-0.00772146 0.0656018 -0.0354736 +0.0230836 0.12416 0.0238853 +-0.0125037 0.0730609 0.0559849 +0.0551355 0.0581678 0.0268835 +-0.0288448 0.124881 0.0180835 +-0.0566945 0.126945 0.0390945 +-0.0491155 0.0337431 -0.0125383 +-0.0100076 0.130157 0.0146359 +-0.0114787 0.0934019 -0.0350786 +-0.012503 0.0856552 0.057236 +-0.00822614 0.0384527 0.0224267 +-0.0288615 0.0353967 0.01735 +-0.035527 0.115134 -0.015836 +-0.085501 0.0791776 0.00851156 +0.0457594 0.0890174 0.0101642 +-0.0775133 0.126 0.0528602 +-0.0598229 0.0911123 -0.0198104 +0.0349018 0.0698502 -0.0158378 +-0.00371064 0.0641813 -0.0350983 +-0.0232497 0.0336668 -0.0221987 +-0.0337721 0.121485 -0.00843946 +0.0123855 0.0603174 0.0511841 +-0.0454994 0.0804154 0.0426755 +0.00893209 0.124393 0.0330753 +-0.00403191 0.0987119 0.0511654 +-0.0481285 0.0573264 0.0358964 +-0.0166099 0.0407431 -0.0277394 +-0.0440479 0.169839 -0.00695693 +0.0412738 0.0872408 -0.00977382 +-0.0604546 0.071762 0.0392488 +0.0529297 0.0581906 0.02898 +-0.0521631 0.138551 0.0244099 +-0.0366167 0.15106 0.000396988 +0.0417493 0.0611977 -0.0033567 +-0.070996 0.0683351 -0.00354604 +-0.0356709 0.0621736 -0.0130441 +-0.0170991 0.0383232 0.0225362 +-0.0487856 0.0573034 0.0351442 +0.022412 0.0372285 0.0333476 +-0.0249633 0.0931679 0.047071 +0.018008 0.0349409 0.0291289 +-0.0796085 0.154132 0.0271276 +-0.0406237 0.0336557 -0.0200198 +0.0169165 0.123099 -0.00667688 +0.0210051 0.0618768 0.0478546 +-0.0427644 0.0812202 -0.0203472 +-0.0672645 0.175508 -0.0482636 +-0.0639988 0.121381 0.0479339 +-0.0622266 0.158391 -0.0366041 +-0.0261802 0.161053 -0.0142499 +0.0186318 0.0821747 0.0516425 +-0.00531922 0.0961442 -0.0318294 +0.00250665 0.0341604 -0.0175888 +0.0167477 0.0563074 0.0486799 +-0.0106808 0.0555967 -0.0338825 +0.00925016 0.0724976 -0.0328208 +0.0123553 0.0552818 -0.0294499 +0.0212602 0.0735043 -0.0271352 +-0.0845249 0.129883 0.0501389 +-0.0764965 0.154899 -0.0050946 +-0.0621627 0.163132 -0.0395927 +-0.0144955 0.0701698 0.0547379 +-0.0084766 0.0489124 0.0500846 +-0.000135712 0.0381648 -0.0142912 +-0.0503963 0.1183 0.0322871 +-0.0761087 0.083292 0.0375324 +-0.0736943 0.094184 0.0404336 +-0.0691138 0.0763852 0.0387083 +-0.0290376 0.038297 0.000217512 +-0.0348553 0.0342935 0.020715 +-0.0220444 0.0384934 -0.0170721 +-0.0114987 0.0471911 0.0478612 +0.0375264 0.0714822 -0.0127977 +-0.0282394 0.087664 0.0462444 +-0.0757136 0.107486 0.0366393 +-0.0610115 0.134041 -0.00711168 +-0.0797372 0.0717415 0.00518109 +-0.0658978 0.147832 -0.0279808 +-0.00653882 0.110902 -0.0214831 +0.0296673 0.0591775 0.0410177 +-0.0217889 0.0696447 0.0502694 +0.0234089 0.0418644 -0.00766906 +-0.0364935 0.0888766 0.0431732 +0.0306541 0.0520995 0.0370911 +-0.060098 0.0687043 0.0366734 +0.0187338 0.0862153 -0.0273821 +-0.0839692 0.148747 0.00414299 +-0.0354821 0.0561791 0.038801 +-0.0481382 0.0376145 0.0455768 +-0.0676248 0.117206 0.0513943 +-0.0281854 0.174153 -0.0178233 +0.0359289 0.0386712 0.0221633 +-0.0256851 0.0824232 0.052338 +-0.0145953 0.0363242 -0.0264317 +-0.0303622 0.055196 -0.0183802 +-0.00165167 0.0525486 -0.0310164 +-0.0132125 0.168083 -0.022507 +-0.00949762 0.078776 0.0580091 +-0.0361357 0.127268 0.00216052 +0.048778 0.0525636 0.0299433 +-0.0256526 0.0520956 -0.0269974 +-0.0603733 0.0335628 0.0071663 +-0.0426157 0.035917 -0.0271302 +-0.0144999 0.162187 -0.0103051 +-0.0384864 0.0548303 0.0394681 +-0.0831442 0.107611 0.0263767 +-0.00111933 0.100971 -0.0229536 +-0.0548742 0.10693 -0.0184788 +-0.0218282 0.127027 0.00889322 +-0.0174982 0.111166 -0.0197324 +-0.0652616 0.0722487 0.0377992 +-0.0576238 0.145329 0.032529 +-0.0184507 0.117417 -0.0143314 +-0.081937 0.128034 -0.00496911 +0.0195332 0.12729 0.0154357 +-0.0293484 0.0705264 -0.0315108 +-0.00525979 0.0409541 0.0483014 +0.0555717 0.0706847 0.00515518 +-0.048428 0.0531039 0.036022 +-0.00279611 0.0826469 -0.0371795 +-0.0287124 0.0382592 0.00213562 +-0.0574984 0.0959784 0.0439666 +-0.091525 0.133725 0.0172151 +-0.016864 0.128415 0.0107007 +-0.0636978 0.164648 -0.0286005 +-0.0829735 0.127181 0.0515051 +-0.0488321 0.0956358 -0.0221459 +0.0400863 0.0899903 -0.0108207 +-0.0619683 0.12268 0.0437909 +0.0605435 0.0650981 0.0101416 +-0.0665542 0.169448 -0.0580509 +-0.0891009 0.0902275 0.0204481 +-0.0825815 0.112383 0.0454387 +0.0104883 0.0936688 0.0521003 +0.0142529 0.0765304 -0.0302113 +0.0165164 0.126586 0.0257514 +-0.0283423 0.118847 0.030216 +0.0142697 0.034212 -0.000289798 +-0.0478723 0.105599 -0.0198923 +-0.0739256 0.098177 0.0391323 +-0.049674 0.141672 0.0123895 +-0.0475977 0.15214 0.0100027 +-0.0424553 0.128377 0.00131486 +0.0224361 0.0645464 0.046427 +-0.0885609 0.087538 0.0184581 +0.0147132 0.0897404 -0.0290836 +-0.054132 0.143048 0.0274248 +0.00550441 0.0575487 0.0534334 +-0.0772682 0.155563 -0.0118971 +-0.0677628 0.079419 -0.0170759 +-0.0464924 0.159333 0.00779524 +0.0261579 0.0768253 0.0466356 +-0.0552963 0.0473377 0.0123212 +-0.0298441 0.0972531 -0.0235715 +-0.00563259 0.0974901 -0.0292726 +-0.0261993 0.095287 -0.0250572 +-0.0716941 0.0684125 -0.00254325 +0.00127365 0.0682996 -0.0335875 +0.0575871 0.0523587 0.0191771 +-0.00134429 0.0361889 0.0150058 +-0.0715096 0.1041 0.0379435 +-0.0921823 0.117455 0.0412015 +-0.0384872 0.0337149 -0.0296051 +-0.0287365 0.0475545 0.0479663 +-0.0257999 0.0422849 0.0537317 +-0.0230963 0.124618 -0.00175855 +-0.0924128 0.11471 0.0173177 +-0.00492025 0.0362041 0.048453 +-0.0186551 0.184576 -0.0164922 +-0.0802253 0.0772741 0.0285988 +0.0463015 0.0806481 0.0121762 +-0.0304105 0.0861968 -0.0305753 +-0.0346214 0.0348242 0.0450553 +-0.0652339 0.0355811 0.0395373 +-0.0788426 0.0825957 -0.0096075 +-0.0127163 0.038878 -0.00996632 +-0.0624916 0.166267 -0.0445898 +-0.0746075 0.156859 -0.0239292 +-0.0773753 0.161145 -0.0179242 +-0.0883931 0.1336 0.00326444 +-0.0661323 0.162373 -0.0581655 +-0.0510928 0.12386 -0.00885828 +-0.0384971 0.0705176 0.0419076 +-0.0723264 0.176481 -0.0540086 +-0.0271072 0.11707 -0.0138992 +-0.0591735 0.11954 -0.0102201 +0.0222809 0.11936 0.0323905 +-0.0302503 0.17123 -0.00702025 +-0.0809167 0.107332 -0.00361395 +-0.0627188 0.046051 0.00845692 +-0.00639449 0.0347093 0.0459249 +-0.0877048 0.0873692 0.00346654 +-0.0410427 0.15478 -0.00878846 +-0.069373 0.0655009 0.0252048 +-0.0270649 0.0689032 -0.0335294 +0.00976243 0.126251 0.030462 +-0.002483 0.114172 0.0414823 +-0.0532846 0.152692 0.0160461 +-0.0190668 0.12797 0.0127969 +-0.0645056 0.0818668 0.0436415 +-0.0144784 0.0645279 0.0535035 +-0.0598098 0.08825 -0.0201729 +-0.0614957 0.105649 0.0403113 +-0.0278003 0.174225 -0.00868668 +-0.0525152 0.0439969 0.0448982 +-0.00749319 0.0503553 0.0512463 +-0.0786706 0.0853441 -0.0105854 +-0.0447185 0.0709976 -0.0171011 +-0.0635722 0.0753573 0.0407707 +-0.0124985 0.0603974 0.0541523 +0.0344134 0.0655586 -0.0158419 +0.0196499 0.124334 0.0268969 +-0.0627763 0.0614875 0.0230054 +0.0416143 0.102832 0.00217563 +-0.0552881 0.147721 0.0283494 +-0.0143864 0.174216 -0.0192271 +0.0144149 0.0343798 -0.00603429 +-0.0101902 0.177186 -0.0254506 +0.0284808 0.120403 0.0230436 +-0.0149461 0.0384961 0.0282276 +-0.0778803 0.0710945 0.0220932 +-0.042083 0.168351 -0.00985967 +-0.056782 0.043535 0.0167171 +0.0143083 0.122234 -0.00973054 +-0.0266054 0.0916781 -0.031606 +-0.00249278 0.121064 0.0370013 +-0.0199096 0.0382242 0.00758286 +-0.0135056 0.0842656 0.0572305 +-0.0720125 0.148777 -0.0357596 +0.0251623 0.118606 -0.00580398 +-0.0618325 0.0334319 -0.000212632 +-0.0855476 0.136296 0.00125685 +-0.032605 0.0408975 -0.030074 +0.0426847 0.0986805 0.020158 +-0.00736899 0.0366982 -0.0162506 +0.00250252 0.0590979 0.0551087 +-0.0674921 0.106947 0.0382762 +-0.0289938 0.16114 -0.00164375 +-0.0509402 0.0584984 0.0315938 +-0.0350845 0.124972 -0.00417237 +-0.0686385 0.0435335 0.00569826 +0.0441509 0.0959467 0.0161545 +0.0131317 0.10725 -0.0189993 +0.0358259 0.0928903 0.0378885 +-0.0154981 0.060248 0.0524646 +0.0276762 0.118315 -0.00350857 +-0.0683312 0.0833327 0.042485 +0.033847 0.106899 -0.00922375 +0.048317 0.0466984 0.0256626 +-0.0570131 0.128126 -0.00643112 +-0.0788672 0.111379 -0.00271807 +0.0115311 0.122019 -0.0114981 +0.0275945 0.106191 -0.0144774 +-0.0591334 0.0584459 0.00677121 +-0.0780191 0.149419 0.0383262 +-0.0559631 0.0464314 -0.00541258 +-0.0192836 0.0894928 -0.0371367 +-0.033131 0.166707 -0.0157536 +-0.0495065 0.107045 0.0392662 +-0.073496 0.147014 0.0424214 +-0.0404833 0.111172 0.036485 +0.0284708 0.0565571 -0.0188308 +0.0511996 0.0711486 0.0227866 +-0.0681397 0.0738079 0.0376094 +-0.0905331 0.135117 0.0212107 +-0.0733037 0.155556 0.00591793 +0.0500217 0.0446984 0.00624267 +-0.00949805 0.0815484 0.0580308 +0.0211117 0.124199 0.0260136 +-0.0611133 0.149657 0.036321 +-0.0635959 0.153475 0.00125628 +0.0344187 0.0994578 0.0359067 +-0.0734442 0.163812 -0.0389777 +-0.0852938 0.0858468 -0.00152115 +-0.0559297 0.13815 0.0313829 +-0.0870302 0.13217 0.00132034 +0.0204036 0.0474506 -0.0212729 +-0.076548 0.0954614 0.0376104 +-0.0855527 0.153551 0.0192298 +-0.0729125 0.0928513 0.0411123 +-0.0404958 0.0478428 0.0400733 +-0.0121854 0.0980546 -0.0279084 +-0.0464966 0.108432 0.0393098 +-0.0177034 0.0569685 -0.0340386 +-0.0908687 0.135097 0.0172074 +-0.0862565 0.0846802 0.0214754 +-0.0297808 0.0348722 0.0494682 +-0.0764922 0.155931 0.0149956 +-0.0618119 0.115344 0.0386033 +-0.0487475 0.0767781 -0.0183253 +-0.0907804 0.150219 0.0191245 +-0.0524535 0.0335708 0.023045 +-0.0384946 0.0577019 0.0400515 +-0.074873 0.151297 -0.0278802 +0.00653661 0.120619 -0.0139577 +-0.0483957 0.0389613 0.0452757 +-0.0779524 0.165292 -0.0269536 +-0.0536531 0.0334694 0.00682116 +-0.0561549 0.118392 0.0380484 +-0.0201622 0.0337128 -0.0216346 +-0.0794073 0.0772395 -0.00557672 +-0.0135947 0.071631 0.0548042 +-0.0382622 0.0335792 -0.0232089 +-0.0183288 0.115615 -0.0164437 +-0.0507515 0.0768088 -0.0186854 +-0.0176367 0.181628 -0.0186063 +0.001434 0.0980064 0.0516014 +0.00449684 0.131467 0.00706378 +-0.0839655 0.111209 0.0317911 +-0.0769529 0.128149 -0.00749249 +0.0471199 0.0728094 0.00697834 +0.0460243 0.0737836 0.00392327 +-0.00149572 0.0505531 0.0529099 +-0.0431936 0.0363833 0.0440447 +-0.054345 0.151005 0.0266856 +0.00514071 0.12498 -0.00862525 +-0.0729614 0.112778 0.0490933 +0.0152498 0.0348445 0.0304622 +-0.0111539 0.0386404 0.0270766 +-0.0431779 0.113636 -0.0162215 +-0.0754447 0.164601 -0.0189193 +-0.0685657 0.0346013 0.0116976 +0.036686 0.110763 0.0218417 +-0.058015 0.128168 -0.00680186 +-0.0805084 0.121673 0.0499202 +-0.0750852 0.174913 -0.0410877 +-0.0394764 0.081876 0.0433844 +-0.01065 0.0383969 0.0147482 +-0.0236788 0.0551648 -0.029679 +-0.0207747 0.0728486 -0.0387932 +0.00733312 0.0553775 -0.0306811 +-0.0497252 0.137033 0.00342407 +-0.0650198 0.154365 0.0307072 +0.00051428 0.0383337 0.0225142 +-0.0625323 0.1568 -0.0366082 +-0.00383551 0.130671 0.00539431 +0.0310854 0.118732 0.00690653 +-0.0699388 0.131128 -0.00863643 +-0.023911 0.123885 -0.00309916 +-0.0495628 0.0402984 0.0453668 +-0.0639487 0.168098 -0.0606895 +-0.0706835 0.155594 0.0053992 +-0.0686442 0.156175 0.0235781 +-0.0572185 0.0575347 0.00867749 +-0.0788442 0.154658 0.0259054 +-0.0721793 0.15961 -0.0389315 +-0.0545051 0.119806 0.0369329 +-0.0254081 0.182912 -0.0140439 +-0.0729406 0.0676849 0.0243239 +-0.0353285 0.0851433 -0.0237512 +-0.0478735 0.104217 -0.0205651 +-0.0558395 0.0589131 -0.0044052 +0.0448613 0.0903726 0.0191701 +0.0576189 0.0719687 0.0133447 +-0.0511061 0.129858 -0.00316533 +-0.00880359 0.113633 -0.0183799 +-0.0618121 0.09105 -0.0190303 +0.0313027 0.114101 -0.00492854 +-0.042497 0.0874008 0.0424798 +-0.0508473 0.0970748 -0.0222124 +-0.0654906 0.102864 0.0410679 +-0.00458022 0.0347745 -0.0240516 +0.0553581 0.0524903 0.0236336 +0.00626754 0.071137 -0.0337471 +-0.0135115 0.118298 0.0374588 +-0.0604029 0.0342918 0.0295439 +0.0406411 0.0462159 0.0309092 +-0.0278584 0.0385169 -0.0108032 +0.0266728 0.0713177 0.0438181 +0.0101968 0.116422 0.0377394 +0.0446411 0.0959729 0.00816419 +-0.0597937 0.0334415 0.000190139 +-0.0210999 0.0811322 0.0562803 +-0.0474593 0.0559824 0.0367034 +0.0340242 0.115407 0.0165889 +0.0416569 0.0832977 0.0303966 +0.0340782 0.100772 0.035418 +-0.0604756 0.0747304 0.0414998 +0.0147905 0.128825 0.0208219 +-0.00109958 0.115152 -0.0180337 +-0.0237291 0.0650733 0.0438813 +-0.0261862 0.17712 -0.0185723 +-0.0381348 0.0338853 -0.0178771 +-0.0323789 0.115075 -0.0157884 +0.0168479 0.0856792 -0.0288312 +0.0383914 0.0390949 0.00219016 +0.0192558 0.0721931 -0.0285132 +-0.0837506 0.0776431 0.00349824 +0.00549734 0.0937843 0.053579 +0.0381875 0.10978 0.0131678 +-0.0707773 0.0822058 -0.016572 +-0.0623556 0.0337533 -0.00969501 +-0.0657944 0.0348418 0.0348835 +0.029813 0.0605585 0.0412449 +-0.067274 0.142559 0.0431983 +-0.00437946 0.039206 0.0351678 +-0.091267 0.130919 0.00823808 +0.056791 0.0717301 0.0086079 +-0.088725 0.0942104 0.00844208 +-0.0527517 0.076824 -0.0190661 +-0.075716 0.071204 0.0277224 +-0.0296574 0.175524 -0.0164728 +0.0201633 0.0535759 0.04656 +0.00320624 0.036422 0.0229702 +0.0192058 0.0834241 -0.02764 +-0.0918136 0.129556 0.00925121 +0.0276788 0.117119 0.0298812 +-0.0251464 0.0824617 0.0532115 +-0.0728771 0.154609 0.0294193 +0.00904539 0.03456 0.0402645 +-0.0534903 0.102908 0.0413848 +0.00940878 0.0389595 -0.0232113 +-0.0859627 0.109007 0.009354 +-0.0484951 0.0903851 0.0445307 +0.00263147 0.0345612 0.0425417 +-0.0770465 0.161776 -0.0174081 +0.0134975 0.104436 0.0449316 +-0.0388918 0.123217 0.0263098 +-0.0364947 0.112507 0.0349484 +-0.0629025 0.103986 -0.017642 +-0.0678178 0.0923118 -0.0167386 +-0.0689104 0.122371 -0.00889897 +-0.0255023 0.125351 0.00317915 +-0.000607228 0.0419595 -0.0248688 +0.0460131 0.0820178 0.0051921 +-0.0223034 0.0381733 0.0107634 +-0.0861005 0.10314 0.0243088 +-0.0674874 0.0958602 0.0421807 +-0.0538319 0.138205 -0.00152003 +-0.0199623 0.0624791 0.0486773 +-0.0187732 0.0946942 0.0521396 +0.0415957 0.0859827 0.0303559 +-0.0405006 0.0562797 0.0399754 +-0.0396087 0.0392284 -0.0278507 +-0.0203015 0.124709 0.0241059 +-0.0667178 0.127063 0.0492263 +-0.0727925 0.0893223 -0.0156729 +0.0370031 0.104683 0.029035 +0.0279524 0.103456 0.0388242 +-0.0186121 0.038597 0.0291868 +-0.0776508 0.152845 -0.000892884 +-0.0334818 0.0987718 0.0435747 +0.0329891 0.092935 0.0408139 +0.0391956 0.0712805 0.0337887 +-0.0631802 0.0590341 0.0144269 +-0.0537547 0.143134 0.0264016 +-0.0301924 0.153974 -0.00357072 +-0.0448379 0.0970765 -0.0217835 +0.00941817 0.0340541 0.000745803 +-0.0432126 0.168352 -0.00885275 +0.0554664 0.0549257 0.00120797 +-0.0225677 0.0932815 0.0503229 +-0.0524989 0.157892 0.00946562 +0.0390425 0.0953983 0.0320312 +0.04296 0.0817702 -0.00479044 +0.00635062 0.0510121 -0.0292209 +-0.0543105 0.149562 0.0267072 +0.0221931 0.100779 0.0445472 +0.0329366 0.0724958 -0.0177814 +0.0248886 0.114037 0.0344109 +-0.0550232 0.14424 -0.00134547 +0.0163915 0.04625 -0.0239163 +0.0177475 0.036867 -0.0166881 +-0.0617992 0.0867358 -0.0192812 +-0.0893599 0.133717 0.0406984 +-0.039718 0.0695625 -0.0162922 +-0.0089161 0.0389771 0.0326408 +-0.0245194 0.0879123 0.052427 +-0.0855508 0.0883229 0.0270467 +-0.0419398 0.0356984 0.00899705 +-0.0715816 0.0791203 0.0388191 +-0.0444898 0.0690526 0.0411578 +-0.070025 0.173518 -0.0406121 +-0.0628508 0.0981808 -0.0176907 +-0.0750322 0.144421 -0.00688246 +-0.0499825 0.0544896 0.033589 +-0.065333 0.177827 -0.0606985 +-0.0316114 0.123192 0.0229888 +-0.0760927 0.0805105 0.0361956 +-0.0370838 0.0486029 -0.013278 +-0.0785283 0.124553 0.0522615 +-0.0708435 0.0731956 0.0357937 +-0.0403104 0.0336344 -0.0180813 +-0.0609885 0.0628534 0.0274979 +-0.0323315 0.0624018 -0.0174393 +-0.0368547 0.100015 -0.0221726 +-0.0783796 0.172116 -0.0450441 +-0.0633655 0.139636 -0.00706655 +0.00173262 0.13137 0.0174841 +-0.0105091 0.0646847 0.0553841 +0.0266795 0.122765 0.0152477 +-0.0360635 0.034528 0.0238485 +-0.0541027 0.122637 0.0375656 +-0.0544908 0.0344999 0.0341095 +0.0176998 0.103348 0.0450658 +-0.0685644 0.145677 -0.0229009 +-0.0356468 0.0577276 -0.0110125 +-0.0696054 0.110911 0.0424293 +-0.0584669 0.0577494 0.0129387 +-0.0398029 0.0870085 -0.0218621 +-0.00967624 0.104885 -0.0231041 +0.00669982 0.0383228 -0.00932299 +-0.0609169 0.109692 -0.0160089 +-0.0646221 0.122809 0.0487379 +0.0174813 0.0865744 0.0503122 +-0.0067878 0.0386876 0.00254936 +-0.0628956 0.119461 -0.00917238 +-0.0404347 0.128451 0.0123721 +0.0304082 0.04464 -0.00596234 +0.00950687 0.0785812 0.0553914 +-0.0185636 0.161122 -0.00592394 +-0.0407009 0.066639 -0.0151117 +-0.0638844 0.0392942 0.0408356 +0.00208256 0.0392848 0.0328214 +-0.0891635 0.0901786 0.00945748 +-0.0714603 0.0390724 0.00325296 +0.0396909 0.105526 0.00119339 +-0.092918 0.118828 0.0342968 +-0.0809093 0.0912865 0.0336272 +0.0106278 0.12033 -0.0136749 +-0.079254 0.149169 0.0379325 +-0.0700516 0.177913 -0.0570165 +-0.0584973 0.0875674 0.0446281 +0.0363875 0.037641 0.0177175 +-0.0266625 0.178341 -0.0176816 +-0.0257516 0.0380733 0.00834253 +-0.0514727 0.147804 0.0154008 +-0.0475605 0.047528 -0.00960427 +0.0464078 0.0756596 0.0165703 +-0.0659757 0.132606 -0.00839654 +-0.0795255 0.0953936 0.0349279 +-0.0512091 0.118302 0.0328718 +-0.00441308 0.12096 -0.0123131 +-0.0322918 0.0358193 0.0288559 +-0.0907178 0.142015 0.0241681 +-0.0555193 0.152453 0.0283051 +-0.044345 0.152142 0.00768226 +0.0241695 0.0809229 0.0490966 +-0.0528659 0.0999263 -0.0216782 +-0.0669331 0.125307 -0.0088761 +-0.0303567 0.119073 0.029499 +0.025846 0.107916 -0.0143268 +-0.0617056 0.1325 0.0388812 +-0.0185965 0.0364224 -0.0275796 +-0.0207908 0.0384714 -0.00378381 +-0.0617181 0.0598008 0.019418 +-0.0474373 0.120726 0.0283448 +0.0366967 0.103968 -0.00783268 +0.0303183 0.0797251 -0.0205953 +-0.0317074 0.0436869 0.0496355 +-0.0623412 0.156794 -0.0356173 +-0.0765015 0.121776 0.0527715 +-0.0184879 0.122208 0.0309285 +0.0230909 0.103393 0.0423419 +0.0609018 0.0651278 0.0131549 +0.00916248 0.0355108 0.0268151 +0.0313289 0.0554154 -0.0147753 +-0.0025035 0.108652 0.0433127 +0.0546992 0.0478618 0.0141962 +-0.0620154 0.0689049 0.0360997 +-0.0388626 0.102809 -0.0208006 +-0.0555708 0.142434 0.0301615 +-0.0688026 0.146519 -0.0258522 +0.0194777 0.0878818 0.0491927 +-0.0228793 0.110931 -0.0194728 +-0.0324125 0.0849398 -0.0275574 +-0.0438855 0.03574 0.0440005 +-0.0917791 0.117463 0.0421754 +-0.0690116 0.129833 0.0494501 +-0.0743362 0.15411 -0.0219057 +-0.0638117 0.0867138 -0.0190744 +-0.045027 0.168395 -0.00690925 +0.0270479 0.080882 0.0462053 +-0.0114995 0.164138 -0.0150087 +-0.0325011 0.058955 0.0382451 +-0.0606931 0.0692955 -0.0138548 +-0.0566913 0.0572662 0.0137312 +-0.00649633 0.0488329 0.050181 +0.0223101 0.120965 0.030775 +-0.0805231 0.0993639 0.0329828 +-0.0644795 0.0959078 0.0429389 +-0.075154 0.17882 -0.048244 +0.00607351 0.0358936 0.0456569 +-0.035492 0.0648204 0.0410644 +-0.0576415 0.155076 0.0216791 +-0.0762945 0.152787 -0.0118902 +-0.00761327 0.0434711 -0.0261832 +-0.0814624 0.13163 0.0517276 +-0.0743185 0.067053 0.0192856 +-0.0842709 0.104792 0.000381661 +-0.0374161 0.12162 -0.0106267 +0.0282004 0.082909 -0.0218038 +-0.0538885 0.131144 0.0343613 +0.0268226 0.046511 -0.0137061 +-0.0500801 0.151654 -0.00422617 +-0.0843259 0.153929 0.0166903 +-0.0840259 0.124392 0.0498267 +-0.0906893 0.11752 0.0439252 +-0.0636773 0.162484 -0.0225185 +0.0362915 0.0534119 -0.00658438 +-0.0733102 0.0700068 0.0292571 +0.0432125 0.0858656 0.0273897 +0.0392299 0.108358 0.0101653 +-0.0357967 0.0383351 -0.00483874 +-0.0645865 0.0628123 -0.00359236 +-0.0838768 0.108986 0.0253683 +-0.0538875 0.139905 -0.00121756 +0.0463511 0.0764838 0.0150474 +0.0180384 0.119266 -0.0105437 +-0.0812898 0.0735018 0.0165324 +-0.0437426 0.076832 -0.018848 +-0.0489995 0.126854 0.0308899 +0.00913686 0.107291 -0.0199257 +0.0413467 0.0718054 -0.00779903 +-0.0407607 0.126285 -0.00553285 +-0.0564807 0.113914 0.0357075 +-0.0477527 0.149202 0.00972608 +-0.0737025 0.144377 -0.00986626 +-0.0237128 0.058121 -0.0313582 +-0.0884618 0.142054 0.0361609 +-0.00450592 0.0661541 0.056364 +-0.0448888 0.108464 -0.0189265 +-0.0531399 0.13506 -0.0028018 +0.0308728 0.114122 0.0296728 +-0.0120858 0.0382274 0.0182274 +0.045976 0.0820209 0.01617 +-0.0474955 0.0344671 0.0303636 +0.0116443 0.129846 0.0210966 +0.0429126 0.0775596 -0.00475805 +-0.0639176 0.122377 -0.00881224 +-0.0219078 0.0581082 0.0451165 +-0.0185957 0.118181 -0.0131167 +-0.0381658 0.165183 -0.0131497 +-0.0445045 0.0438483 0.042919 +-0.0464974 0.074738 0.042075 +-0.0819901 0.133862 -0.00285904 +-0.0633534 0.0445301 0.031682 +-0.0314905 0.0960436 0.0448087 +-0.0575997 0.0574661 0.0133658 +-0.0303698 0.154176 -0.00601441 +0.0133009 0.0666579 -0.0304883 +0.0108109 0.0819726 0.0543646 +-0.068057 0.178404 -0.0514469 +-0.0806807 0.0760273 -0.00253172 +0.0394926 0.0541437 0.0318453 +-0.00450121 0.0675415 0.056336 +-0.019491 0.0387907 0.0342254 +0.0147818 0.0631153 0.0511723 +-0.0291704 0.172664 -0.0174314 +0.0262968 0.070421 -0.0238548 +-0.0421212 0.159153 -0.0103433 +-0.0367588 0.172073 -0.0125043 +-0.0196292 0.117165 -0.0140584 +-0.042525 0.149193 0.00498605 +-0.0175612 0.186044 -0.0184493 +0.0221884 0.0973608 -0.0216774 +-0.0197019 0.0568866 -0.0331333 +-0.045504 0.0832988 0.0437099 +-0.0212803 0.0387041 -0.0133833 +-0.0770943 0.154164 -0.0118975 +-0.0484907 0.0833394 0.0445457 +-0.0238036 0.0798229 -0.0381557 +-0.0372926 0.0394674 -0.0291193 +-0.00273038 0.0683735 -0.0347173 +-0.0659296 0.14253 0.0416232 +0.0452769 0.0467388 0.0283148 +-0.0898014 0.11587 0.00528404 +0.0263587 0.0577877 0.0432503 +-0.0486968 0.067904 -0.0141574 +-0.0893812 0.113196 0.0217139 +-0.0841444 0.110242 0.00330414 +-0.0631329 0.17411 -0.0535854 +0.0348962 0.0387881 -4.46661e-05 +0.0431163 0.0888383 0.0261767 +-0.0444887 0.166716 0.00379579 +-0.0235591 0.0953745 -0.0271663 +0.0455985 0.0918132 0.00816712 +-0.0917403 0.12555 0.0418871 +-0.0890224 0.136404 0.0092064 +-0.0364114 0.175555 -0.00996795 +-0.0345906 0.0727451 -0.0199624 +0.0429111 0.040977 0.0196984 +0.00148534 0.0385845 0.0464325 +-0.0585016 0.0973698 0.0431908 +-0.0484982 0.0819185 0.0441136 +0.00821862 0.116409 0.0384227 +0.0456517 0.0413562 0.00923967 +-0.0769167 0.0873975 0.0382106 +-0.061867 0.101123 -0.0184855 +0.0202898 0.124676 0.0257091 +-0.0101432 0.130124 0.0117041 +-0.0138894 0.183111 -0.0237643 +-0.0707552 0.0792696 -0.0152786 +0.0465284 0.0761532 0.0136843 +-0.0888827 0.140531 0.0122011 +-0.0659605 0.110851 0.0377691 +-0.0638988 0.109582 -0.0144399 +0.0445103 0.0541956 0.0324876 +-0.0545376 0.0335773 0.0172858 +0.0156666 0.0726831 0.0525311 +-0.0224929 0.0448955 0.0530527 +0.00250097 0.0897336 0.0558646 +-0.0427601 0.128938 0.0129983 +-0.0749067 0.100837 0.0372176 +0.0100662 0.0792875 0.0550109 +0.031592 0.0738009 -0.0197207 +-0.0295595 0.111353 -0.0178807 +-0.0265381 0.155425 -0.00506198 +0.0110253 0.0793101 0.0546505 +0.0455932 0.0834007 0.019176 +-0.00963497 0.0389293 -0.00939263 +-0.0740278 0.157006 -0.00316778 +0.026879 0.121193 0.00250168 +-0.0840153 0.1376 0.000355984 +0.00144074 0.0344391 0.0153316 +-0.062494 0.0746373 0.0407954 +-0.0714338 0.100882 0.0394174 +-0.0511894 0.0558131 0.0154354 +0.0142545 0.0887312 0.0523539 +-0.0217647 0.0699552 -0.0378816 +0.042865 0.0958458 -0.000810373 +-0.0225278 0.18149 -0.0200273 +-0.0516224 0.0545433 -0.00792825 +-0.0894416 0.0943032 0.0194238 +-0.0450754 0.033637 -0.0171737 +-0.0189216 0.122512 -0.00768052 +-0.0278603 0.101566 -0.0234492 +0.0273313 0.094554 -0.020088 +-0.0568394 0.145329 0.0319256 +0.0299199 0.11779 -0.000781916 +0.0345811 0.0368089 0.0162808 +0.0130795 0.0927597 -0.0282037 +0.0239979 0.0768543 0.0488301 +-0.0560741 0.15232 0.0295584 +-0.0713082 0.165213 -0.0459899 +0.0214853 0.0948038 0.0473574 +-0.0124976 0.0472007 0.0479814 +0.0101747 0.096292 -0.0259611 +-0.0424942 0.0916602 0.0426604 +-0.000674255 0.10997 -0.0204918 +-0.0731036 0.0721584 0.0326952 +-0.0863191 0.0806349 0.0164939 +-0.0174959 0.0984963 0.0451272 +-0.0516134 0.0334804 0.007228 +0.0210892 0.0521114 0.044364 +-0.0767842 0.155599 0.0119802 +-0.0737106 0.0699801 -0.00251138 +0.0277999 0.0727164 0.0436883 +0.0605691 0.0637105 0.0171755 +-0.0720961 0.156364 0.000513559 +-0.0818934 0.154016 0.0102104 +-0.0184806 0.169783 -0.0146335 +-0.073631 0.173473 -0.03767 +-0.0385075 0.0888951 0.0435504 +-0.056184 0.0374619 -0.0105738 +-0.0164629 0.0616668 0.0525376 +-0.0214965 0.0525299 0.044709 +-0.0324599 0.0722556 -0.0254696 +-0.0781568 0.167257 -0.0305864 +-0.0633087 0.117017 0.0436447 +-0.084428 0.138004 0.0455627 +0.0287818 0.0480764 -0.0117305 +-0.0706135 0.175903 -0.0451833 +-0.0430742 0.0335089 -0.0222312 +0.0203664 0.0506236 -0.0244327 +-0.0807714 0.153393 0.00628177 +-0.0784635 0.138605 0.0489019 +-0.0754126 0.068174 0.019879 +-0.0105025 0.0773598 0.0576687 +-0.0399608 0.0418525 -0.0253044 +-0.0880973 0.137764 0.00820327 +-0.0862825 0.106347 0.0193454 +-0.0114851 0.123708 0.0326887 +-0.00700917 0.0348727 0.042072 +-0.0760973 0.0851761 -0.013541 +0.0421377 0.0912242 0.0276147 +0.0298218 0.119509 0.00500708 +-0.0550443 0.148674 -0.00204704 +-0.0107558 0.0386486 -0.0149703 +0.00849857 0.118254 0.0373924 +0.0373294 0.0848074 0.0364738 +0.0506886 0.0511228 0.0274131 +-0.0538924 0.106961 -0.0186698 +-0.0735555 0.105459 0.0371635 +-0.0532563 0.0343869 0.0309731 +-0.015483 0.0938222 0.0546278 +0.0454513 0.052559 0.0321398 +0.032601 0.100801 0.0367685 +-0.0688527 0.142579 0.0444582 +-0.0908832 0.150197 0.0161314 +-0.0811312 0.129963 0.0524484 +0.00846909 0.111301 0.0401143 +-0.0622744 0.0344133 0.0342699 +-0.0343155 0.0340522 0.0192395 +-0.0869096 0.111745 0.0223587 +0.0507656 0.0446256 0.0152142 +-0.0767707 0.151403 -0.00690852 +-0.00150011 0.103045 0.0440564 +-0.051019 0.147224 -0.00224048 +-0.025918 0.122982 0.0235755 +-0.0527617 0.0461943 0.0216742 +-0.0178184 0.0841429 -0.0390768 +-0.0345091 0.0461323 0.043875 +-0.0623881 0.149093 -0.0125752 +-0.0809179 0.0761444 0.0241516 +-0.00945917 0.175708 -0.0257473 +-0.0334992 0.0704401 0.0410454 +-0.0886682 0.141939 0.0121971 +-0.0120612 0.0383071 0.0127308 +-0.0853843 0.0980412 -0.000554198 +-0.0325205 0.0646875 0.0393461 +0.0503466 0.0615208 -0.00363326 +0.00449283 0.103624 -0.0217086 +-0.0698084 0.085099 -0.0171261 +0.0438316 0.0832073 0.0263179 +-0.0486418 0.0576652 -0.0108452 +0.0123248 0.0609207 -0.0293142 +0.0429772 0.0902337 -0.00478341 +-0.0619824 0.166238 -0.0535924 +0.0140441 0.0406072 0.0445814 +0.00249558 0.116934 0.0396534 +0.018473 0.0989902 0.0468145 +-0.0169827 0.0385945 -0.00497776 +0.0309161 0.0955754 0.0413413 +-0.0735982 0.110276 0.0438156 +-0.0903629 0.11521 0.0252935 +-0.0566835 0.124286 -0.00724626 +-0.0620082 0.134045 -0.00734981 +0.00521493 0.0852237 -0.0334342 +-0.0903999 0.124268 0.0448512 +0.0114719 0.1182 0.0365719 +0.0344326 0.0414166 -0.00330414 +-0.0403754 0.124077 -0.00919956 +0.0484547 0.0702338 0.00359645 +-0.0285016 0.113902 0.0349068 +-0.0526285 0.0596472 0.0276152 +-0.0325191 0.174119 -0.0148634 +-0.0204902 0.108532 0.041306 +0.010276 0.076623 0.0552854 +0.0133781 0.0537725 -0.0285433 +0.0402901 0.0698645 0.0318359 +0.0401742 0.0671588 0.0316675 +-0.0866887 0.120341 0.0484058 +0.0245253 0.0875975 0.0479106 +-0.050498 0.0890212 0.0452499 +-0.0598028 0.0853759 -0.0202992 +0.0354525 0.106753 -0.0069512 +0.0111874 0.0630268 0.0529412 +-0.0416003 0.12872 0.00602836 +0.0443487 0.0533892 -0.00643258 +-0.0229394 0.0985982 0.0448104 +-0.0678177 0.0894605 -0.0172539 +-0.0826703 0.0762102 0.00250991 +-0.0152189 0.172708 -0.0246075 +-0.0748382 0.0978559 -0.0133191 +0.0284295 0.0955564 0.0430179 +-0.04802 0.136068 0.0153684 +-0.0475691 0.0489734 -0.00936479 +-0.0813576 0.0734641 0.0155425 +-0.07594 0.14997 -0.0178724 +-0.0649871 0.152354 -0.0372683 +-0.0229947 0.122243 0.0275866 +-0.0108296 0.0855471 -0.0384547 +-0.0447583 0.0336472 -0.00973579 +-0.041838 0.0942787 -0.0228038 +-0.038857 0.101401 -0.0214118 +0.00839351 0.0342854 -0.0184828 +0.0436422 0.0748109 -0.00280304 +0.00409443 0.101828 -0.021842 +-0.0194474 0.054231 0.0477027 +0.0410346 0.0752467 0.03121 +0.0588047 0.0677091 0.00614939 +0.021598 0.10091 -0.0208238 +-0.0696323 0.156261 0.0232204 +-0.086966 0.0846591 0.00747852 +-0.0660124 0.176151 -0.0507054 +0.0425261 0.101486 0.00616657 +0.0305131 0.0418181 0.0291512 +-0.0554982 0.113948 0.0354054 +-0.0763852 0.108818 0.0389983 +-0.0785959 0.152697 0.00118419 +0.0184567 0.127794 0.00934393 +0.0105917 0.043143 0.0448676 +-0.0719858 0.0346482 0.00381826 +-0.0341243 0.0335931 -0.0280196 +-0.0564439 0.115317 0.036137 +-0.0928438 0.126838 0.0112559 +-0.0661071 0.164936 -0.0219713 +-0.0665376 0.142546 0.0425061 +-0.0167827 0.0388081 0.0329676 +-0.0614351 0.156032 0.020314 +0.0388231 0.106965 0.0221712 +0.0247856 0.0449735 0.0390757 +-0.0324984 0.0788891 0.0412743 +-0.068331 0.155325 0.0280685 +0.0267262 0.114038 0.0335472 +-0.0888783 0.111909 0.0103621 +-0.0772308 0.0920788 -0.012603 +0.0457689 0.0431024 0.0219801 +0.0474981 0.0737139 0.0139878 +-0.061487 0.0746791 0.0411579 +-0.0861526 0.148758 0.00721004 +0.0341879 0.0913684 -0.0166968 +-0.0200728 0.100101 -0.0240875 +-0.0286491 0.125506 0.0152069 +-0.0268606 0.0378639 0.0137313 +-0.0352216 0.0346633 0.0327857 +-0.0444613 0.12936 0.0182577 +0.0373383 0.0740435 0.0363986 +0.00751373 0.0869673 0.0561316 +-0.0888328 0.0942898 0.0224093 +0.00897858 0.127106 -0.00499333 +0.0363106 0.0994119 0.033375 +-0.0448194 0.0913346 -0.0221278 +0.000368669 0.0466323 -0.0286891 +-0.0606782 0.0639978 0.0300882 +-0.0735086 0.078138 -0.0125733 +-0.0358361 0.11045 -0.0189078 +0.0300578 0.0632721 0.0416198 +0.0173543 0.0349384 0.0362289 +-0.0104845 0.10863 0.0429333 +-0.0265155 0.115287 0.0336658 +0.0257868 0.0967214 -0.0203669 +0.0255714 0.119263 0.0291067 +-0.0404457 0.119913 -0.0128413 +-0.0596429 0.0622343 0.0265494 +-0.0522074 0.122732 -0.00965468 +0.00419216 0.0340885 -0.0190827 +-0.0614977 0.108395 0.0385563 +-0.0154933 0.0392591 0.0382209 +0.0568425 0.0592039 0.0011688 +0.033494 0.0619462 0.0395497 +0.0378948 0.0699732 0.0354084 +-0.0643687 0.155314 0.00767719 +-0.017163 0.124753 -0.00408239 +-0.0892062 0.128127 0.00426293 +-0.058497 0.101559 0.0426268 +-0.00170163 0.130406 0.0219933 +0.0258358 0.123453 0.0120756 +0.0200283 0.102079 0.0449293 +-0.0034976 0.0965806 0.0535793 +-0.0805988 0.090913 -0.0086158 +0.0307316 0.091606 0.0428217 +0.0293141 0.095566 0.0425395 +0.011103 0.0779768 0.0547588 +-0.0912353 0.14886 0.0211316 +0.0484812 0.0443317 0.021366 +-0.00581925 0.0868408 -0.0369183 +-0.0454559 0.0902978 0.0432333 +-0.0346794 0.119765 -0.0106544 +-0.00349323 0.113677 -0.0184484 +-0.0434907 0.101526 0.0420227 +-0.0385061 0.0986889 0.0419871 +-0.0599081 0.112539 -0.0152225 +-0.0242322 0.124794 -0.000701199 +0.0400813 0.104202 0.0221684 +-0.0828121 0.0830332 0.030132 +0.0159137 0.128436 0.00413586 +-0.0645186 0.0597262 0.00993302 +-0.0324512 0.0353306 -0.0309147 +-0.0484861 0.137101 0.00939484 +-0.0304745 0.0860755 0.0433189 +0.0188415 0.121733 -0.00718615 +-0.0643746 0.145275 -0.0151376 +0.0208541 0.11855 -0.00976629 +0.037465 0.0434297 0.0291248 +0.0517879 0.0461689 0.0072143 +-0.0837871 0.0829476 0.0282971 +-0.0917215 0.129668 0.0302355 +-0.0261628 0.0674202 -0.0335157 +-0.0631555 0.156855 -0.014582 +0.043463 0.077603 -0.00378219 +-0.0602407 0.058232 0.0121428 +-0.0458636 0.102811 -0.0213024 +-0.038884 0.108506 -0.019659 +-0.0705258 0.142815 0.0451961 +-0.0781039 0.070111 0.0193756 +-0.0758474 0.109198 0.0406016 +-0.0318501 0.0986369 -0.02282 +-0.038215 0.0471675 -0.018189 +-0.0134374 0.0516868 0.0502089 +0.0151412 0.0754034 0.0535569 +-0.043493 0.105703 0.0408668 +-0.0822959 0.0773319 0.0228488 +0.0452717 0.0903987 0.0151606 +0.0159567 0.120613 0.0338084 +-0.0623049 0.142641 -0.00633906 +0.000467241 0.105823 0.0432483 +-0.0177409 0.0671746 -0.0379913 +-0.0891252 0.0889064 0.0184472 +-0.0678748 0.125664 0.0510849 +-0.0337468 0.127104 0.0118588 +-0.0518684 0.102767 -0.0207881 +0.00221584 0.0364728 0.00081639 +-0.0296253 0.0759773 0.0411397 +0.00226876 0.0682822 -0.0333186 +-0.0542457 0.0574384 0.01981 +-0.0659991 0.136994 -0.00799651 +-0.00357593 0.127459 -0.0052112 +0.0103564 0.0538895 -0.0297771 +0.0272815 0.0718243 -0.0235929 +-0.0123281 0.0344052 -0.018857 +0.0416155 0.0404142 0.0199255 +-0.0106878 0.0598858 -0.0348312 +-0.0305006 0.116618 0.0322439 +0.0427332 0.084569 0.0284544 +-0.0712328 0.151001 -0.0437008 +0.0423623 0.0944394 0.0261744 +-0.000687654 0.0583509 -0.0327859 +-0.0779789 0.136876 -0.0051311 +-0.0657518 0.0780369 -0.0174491 +-0.0789069 0.155396 0.0141592 +-0.0701046 0.156748 -0.048906 +0.0281353 0.0593598 -0.0207767 +-0.066567 0.147777 -0.0287654 +-0.0167976 0.0383562 0.00264497 +-0.0708835 0.160996 -0.0449446 +0.0230988 0.111339 0.037076 +-0.0237033 0.091176 -0.0348871 +-0.0477118 0.073839 -0.0167643 +-0.0540526 0.0334248 -0.00589512 +-0.0535445 0.0389126 -0.0111352 +0.00251277 0.0675114 0.055914 +-0.0324736 0.0532348 0.0372028 +-0.0416459 0.056333 -0.0114534 +-0.0460476 0.0363198 0.0451262 +-0.0215027 0.163915 -0.00845889 +-0.0530817 0.139518 0.0266624 +-0.00971954 0.0656257 -0.0358484 +-0.0175293 0.038199 0.0153321 +-0.0388176 0.128112 0.00411022 +-0.0579212 0.120852 -0.00959233 +-0.0215953 0.03793 -0.0285032 +0.00849245 0.0473031 0.0488481 +-0.045123 0.157633 -0.00869072 +-0.0845016 0.0911794 -0.00456302 +-0.0130394 0.0384127 0.00153612 +-0.0054932 0.111405 0.0422861 +-0.00614297 0.0385457 0.0227705 +-0.0588822 0.108299 -0.017343 +-0.0647452 0.0766241 -0.0174472 +0.0333079 0.0768384 0.0411622 +-0.0345058 0.0704863 0.0415356 +-0.00385823 0.0988046 -0.0266644 +-0.0940576 0.125561 0.0242759 +-0.0406606 0.156554 0.00601794 +0.0458479 0.0724092 0.00333418 +-0.0536298 0.0345249 0.0429297 +0.0422446 0.0760949 -0.00580476 +0.0305908 0.106106 0.0356297 +-0.0744956 0.13026 0.0524093 +-0.060795 0.0853339 -0.0197774 +-0.0659276 0.123847 -0.00897257 +-0.0587952 0.0334058 0.000425547 +-0.0355002 0.111108 0.0360398 +0.0106562 0.0589179 0.0524466 +0.0220342 0.108737 -0.0152173 +0.0414017 0.104253 0.00516521 +-0.0487319 0.132909 0.0254731 +-0.073147 0.0648981 0.0178865 +-0.0655672 0.149686 0.0379738 +-0.0866855 0.14466 0.00818677 +-0.0690156 0.163795 -0.0519803 +0.0474899 0.0664975 0.0274045 +-0.0693729 0.175081 -0.056043 +-0.0811978 0.140383 -0.00182247 +-0.0609117 0.111106 -0.0154828 +-0.027448 0.125478 0.0053817 +-0.0601827 0.0460596 0.0101722 +-0.0116048 0.0377441 -0.0259987 +-0.0623577 0.147557 -0.00658086 +-0.0635933 0.167459 -0.0411888 +-0.0420303 0.153306 -0.00761985 +0.0045298 0.102977 0.0440255 +-0.0571296 0.124118 0.0402058 +-0.010491 0.0487865 0.0492904 +-0.00149595 0.0911539 0.0561263 +-0.0644925 0.0903995 0.0447493 +-0.0621097 0.156825 -0.0345957 +-0.0626845 0.0455625 -0.000282658 +-0.054778 0.0344845 0.0375447 +-0.0704967 0.156763 -0.0469167 +-0.0501084 0.0429877 0.0445637 +-0.074873 0.120838 -0.00772479 +0.0354301 0.112103 0.00127449 +-0.0218649 0.103029 -0.0235712 +-0.09096 0.148814 0.0141536 +-0.0645626 0.0459512 0.00669838 +0.0314584 0.111437 -0.00809824 +-0.022876 0.0362943 -0.0189473 +-0.0428901 0.0435976 -0.0193145 +-0.0746823 0.0663852 0.00625465 +-0.0476209 0.0547841 -0.0103184 +-0.0197585 0.171251 -0.0147167 +-0.0705035 0.0901829 0.0418541 +0.0494272 0.0628335 -0.00296645 +0.0266028 0.105322 -0.0155495 +0.0202061 0.126966 0.0100746 +0.013717 0.127103 0.0275992 +0.00956448 0.122301 -0.0117968 +-0.0846111 0.084433 -0.00253466 +-0.0889485 0.13651 0.0272017 +-0.000398103 0.0385343 0.0221462 +0.0428913 0.0402636 0.016655 +-0.0531156 0.156084 -0.00339606 +-0.0586999 0.141645 -0.00399496 +0.0175889 0.0549386 0.0481228 +0.0242735 0.0576737 -0.0247443 +-0.0435028 0.0548283 0.0392794 +-0.0509876 0.0343016 0.0280109 +-0.0371778 0.128019 0.00618657 +-0.067159 0.152634 -0.0476967 +-0.0524481 0.115128 -0.0157418 +-0.00787248 0.0390234 0.0328097 +-0.0368889 0.109941 -0.0191779 +0.0473251 0.0497353 0.0295737 +-0.0155015 0.10721 0.0425067 +-0.0607907 0.0609394 -0.0015406 +0.0214998 0.0358071 0.0181694 +-0.0152794 0.114388 -0.017154 +-0.0618553 0.153745 -0.0235803 +-0.00541506 0.100313 0.0476265 +0.0438051 0.0987511 0.0101628 +-0.0274965 0.0973724 0.0435854 +0.0448746 0.0601039 -0.00424277 +0.031559 0.0460718 0.0312637 +-0.0615188 0.0448284 0.0115308 +-0.0397761 0.115072 -0.015742 +-0.0918654 0.131039 0.0272344 +-0.0646035 0.156332 -0.00986181 +0.0383993 0.0413521 -0.00190432 +-0.026722 0.0386646 -0.0162927 +-0.0736148 0.0995067 0.0387799 +0.006499 0.119638 0.036869 +0.0405971 0.101404 0.0241737 +-0.0944613 0.121476 0.0212834 +-0.0105851 0.0337493 -0.0235512 +-0.0799934 0.136838 -0.00393652 +0.0529009 0.0462649 0.0122044 +-0.0539028 0.11125 -0.0176614 +0.00874316 0.130156 0.0228898 +0.0260633 0.114349 -0.00924148 +0.0113837 0.0449118 -0.0251572 +-0.0461015 0.150679 0.0086365 +0.00236523 0.128663 -0.00254763 +-0.0158845 0.0910066 -0.0366604 +0.0456174 0.0890068 0.0121612 +-0.0634393 0.144588 -0.0113838 +0.0175304 0.120577 0.0333463 +-0.0256229 0.0463679 -0.0270847 +-0.0606463 0.0343588 0.0329219 +-0.0622926 0.149098 -0.0115749 +-0.0266239 0.0463597 -0.0270834 +0.0142234 0.0864184 -0.0301272 +-0.0242795 0.0383175 -0.000652306 +-0.0599506 0.0340585 0.0228145 +-0.031899 0.0595768 -0.0154053 +0.0335035 0.0686838 0.0396083 +-0.00350655 0.105885 0.0441283 +-0.00849376 0.0576353 0.0542501 +-0.0596861 0.0693591 -0.0143393 +-0.0246408 0.0382637 -0.00251941 +0.0142384 0.0723592 -0.0308856 +0.0360996 0.112682 0.0101589 +0.00650478 0.0989998 0.0481043 +-0.0406764 0.0344836 0.0353061 +0.0208126 0.114503 -0.0133998 +-0.0664042 0.0385079 0.0306689 +-0.00851871 0.0471234 0.047663 +-0.0607941 0.143953 0.0367655 +-0.0469959 0.06153 0.0374819 +-0.0566078 0.0521283 0.00668717 +-0.0117953 0.0827249 -0.0387188 +-0.0651684 0.0346977 0.0334093 +0.0334291 0.0781951 0.0413414 +-0.00319773 0.0384234 0.00715593 +-0.0255204 0.115294 0.0339151 +-0.070852 0.100833 -0.0142398 +-0.0647775 0.0824087 -0.0188685 +0.0351918 0.0673501 0.0385292 +-0.0201767 0.0929008 -0.0346271 +-0.0292631 0.0351386 0.0510616 +-0.0487306 0.0345868 0.0335095 +-0.0909618 0.13376 0.0242167 +-0.0399614 0.0343338 -0.0130933 +0.0409886 0.0643095 0.0292691 +-0.0656099 0.0655077 0.0295065 +0.0113576 0.0509388 -0.0282254 +-0.0831709 0.101988 -0.00359129 +-0.0345055 0.113874 0.0339275 +0.0308648 0.0460986 0.0320207 +-0.023595 0.180085 -0.0196757 +0.056025 0.0493916 0.0151904 +-0.0805557 0.0977534 -0.00758611 +0.0084218 0.0346373 0.0418695 +-0.0774116 0.159696 -0.0249188 +0.0602932 0.0636878 0.00814035 +-0.0302474 0.125253 0.00290344 +-0.0741812 0.074527 0.0339368 +-0.0636646 0.15831 -0.045603 +-0.0332687 0.15271 -0.00392746 +0.0267163 0.0450608 -0.00869474 +0.0351226 0.0921155 -0.0154837 +-0.0278275 0.158128 -8.54892e-06 +-0.0771542 0.152814 -0.00588992 +0.00726262 0.0682112 -0.0321527 +-0.0590296 0.0424919 -0.00727859 +-0.0604873 0.0987275 0.0428004 +-0.0916073 0.128323 0.0352449 +0.0474407 0.0661575 -0.000283122 +0.03984 0.106962 0.00517391 +-0.0609078 0.155801 0.00889681 +-0.00849418 0.114178 0.0409373 +0.00894357 0.0819404 0.0551438 +-0.0767684 0.0756527 -0.0076025 +-0.0670227 0.0607355 0.00842954 +-0.0186908 0.0510113 -0.0307584 +-0.0706351 0.0733936 -0.01149 +-0.026674 0.0382695 0.00254021 +0.0585127 0.0649229 0.00410871 +0.0241246 0.0605253 0.0453245 +0.0172623 0.073643 -0.0290458 +-0.0564969 0.111123 0.0367634 +0.0543584 0.0674371 0.0258007 +-0.0511173 0.128308 0.0330935 +-0.075231 0.151315 -0.0248804 +-0.0492462 0.132382 0.000177088 +-0.0694944 0.11756 0.0525327 +-0.0721635 0.113702 0.0503204 +-0.0647819 0.0809531 -0.0185144 +0.00336694 0.130688 0.00234495 +0.0243671 0.0699418 0.0457082 +-0.000607851 0.0448652 -0.0263872 +-0.0506782 0.141637 0.0173818 +-0.0618089 0.0881716 -0.0191682 +-0.0886021 0.087516 0.0174642 +0.011433 0.034701 0.0261941 +-0.0405676 0.171048 0.000226569 +0.0111139 0.110132 -0.0191278 +0.0136046 0.121889 0.0339065 +-0.0107442 0.0742291 -0.0379783 +0.0438711 0.0959127 0.00218342 +-0.0299153 0.155169 -0.001314 +-0.0469317 0.0369443 -0.0162782 +-0.0887949 0.142048 0.03516 +-0.0459209 0.0346888 0.0375199 +-0.0022788 0.119988 -0.0131916 +0.00522675 0.0768423 -0.034472 +-0.0277078 0.0725313 -0.0348614 +-0.0679296 0.125304 -0.00887173 +-0.0528849 0.101359 -0.0212107 +0.0356786 0.076967 -0.014745 +-0.0567974 0.0854612 -0.0213212 +0.00206285 0.121236 -0.012553 +-0.0659186 0.159142 -0.0118027 +-0.0857862 0.0939971 -0.00056361 +-0.0318889 0.124978 0.0199371 +0.0110379 0.0712445 0.0546046 +-0.043282 0.147753 0.00390043 +0.0142589 0.0737441 -0.0304465 +-0.037534 0.168232 0.00175297 +0.0421124 0.0467315 0.0307997 +-0.0195242 0.0336044 -0.023287 +-0.0581683 0.0606896 -0.00283185 +-0.0892904 0.149814 0.024685 +-0.0328117 0.0335416 -0.0258378 +-0.0534094 0.150878 0.0234093 +0.0224588 0.120521 -0.00588511 +0.0297724 0.0549903 0.0393628 +-0.0689711 0.136995 -0.00816407 +0.0327608 0.11383 -0.00261931 +-0.0138771 0.164812 -0.0186885 +0.00401259 0.0341521 0.00329327 +-0.0776837 0.154812 0.0263001 +-0.0617213 0.0781294 -0.0185002 +0.0405341 0.105626 0.00416435 +-0.033143 0.157873 -0.0118064 +-0.0244152 0.0723023 0.0471532 +0.000983167 0.0373381 0.00163376 +-0.0227666 0.126779 0.0143916 +-0.0151278 0.128803 0.00988702 +0.000514565 0.0717586 0.0570729 +0.0202169 0.0591906 0.0484605 +-0.0591321 0.0334434 -0.0069378 +-0.0338188 0.0345795 0.040191 +-0.000499113 0.11695 0.0400287 +-0.0463678 0.13079 0.00400616 +0.0171482 0.0349466 -0.009792 +-0.064905 0.0607648 0.0196679 +-0.0624362 0.150651 -0.0105777 +-0.0354607 0.154847 -0.00919588 +-0.0211471 0.0377711 0.0538261 +-0.0691709 0.147293 -0.0286567 +-0.0360974 0.127648 0.0124754 +-0.0776508 0.151441 -0.00388634 +0.0365033 0.0512847 0.031619 +0.0193623 0.0370952 -0.00967348 +0.0153438 0.0522442 -0.0271619 +-0.0174947 0.0815257 0.0576296 +-0.0629203 0.122369 -0.00879811 +0.0168951 0.128644 0.0116162 +0.0397845 0.0699028 0.0328672 +0.00847616 0.0963576 0.0505263 +-0.0532837 0.0454354 0.0434394 +-0.0154326 0.0388218 -0.0141873 +0.058968 0.0691324 0.00813536 +-0.0155327 0.116851 0.0372458 +-0.0261049 0.0632214 -0.0314499 +-0.0580383 0.122682 0.0406302 +-0.0153478 0.0972963 0.0501876 +-0.0480268 0.116533 -0.0152488 +-0.0440293 0.0378087 0.0445145 +0.0122229 0.0822322 -0.030844 +-0.00477881 0.0390844 -0.0104359 +-0.0106511 0.0496684 -0.0311061 +-0.0197213 0.123533 0.0272668 +-0.000499702 0.119705 0.0381547 +-0.0497662 0.165331 0.00186024 +0.0034577 0.0989815 0.0493164 +-0.0623164 0.153672 -0.0306063 +-0.0676947 0.134039 0.046063 +-0.0536041 0.0588172 -0.00776341 +-0.0774688 0.144183 0.0446652 +-0.054123 0.064196 0.0330627 +-0.0515128 0.0452783 0.043411 +-0.0216106 0.0422609 -0.0287762 +-0.0721201 0.0655088 0.0210948 +-0.0214414 0.0682091 0.0499624 +0.0246691 0.103387 0.0411037 +-0.0584632 0.0480819 0.000648377 +-0.0193941 0.113623 -0.0183331 +-0.0642327 0.0431706 0.0367918 +-0.0673041 0.044774 0.00468689 +0.00124491 0.0726488 -0.0351082 +0.0293752 0.0646271 0.0424024 +0.0334188 0.0399387 -0.00226403 +-0.0648162 0.092445 -0.0185198 +-0.0588392 0.0371017 0.0463605 +-0.0464973 0.113852 0.0344899 +-0.0253214 0.158135 -0.00165461 +0.0565751 0.0564133 0.00219071 +-0.0628971 0.106793 -0.0162163 +-0.0672273 0.135447 0.0449702 +-0.0874127 0.118983 0.0477049 +0.0264339 0.0415833 -0.00518191 +-0.0649816 0.114139 0.0429675 +-0.087689 0.0861087 0.0184696 +-0.0759388 0.151364 -0.016882 +-0.00938485 0.0992897 -0.0251913 +-0.0906583 0.12815 0.00627512 +0.0420818 0.101483 0.016165 +-0.0366993 0.124957 -0.00615077 +0.0344101 0.0633165 0.0391255 +0.0312208 0.0578184 0.0397344 +-0.0245116 0.0679611 0.0445844 +-0.0494967 0.0932039 0.0445022 +-0.0762012 0.149986 -0.0138757 +-0.0469178 0.060141 0.0374462 +-0.0939221 0.128285 0.0202478 +-0.0488103 0.0898531 -0.0217755 +-0.013542 0.129298 0.0162538 +0.0557083 0.0616421 0.000366134 +0.0340796 0.0848941 0.0405554 +0.0303873 0.0525299 -0.0147333 +0.0173214 0.127268 0.00181685 +-0.0623602 0.164675 -0.0475927 +-0.0633366 0.0613129 -0.000511486 +-0.0663574 0.0370366 0.0151548 +-0.0567588 0.053509 0.00466959 +-0.082746 0.0802849 -0.00049163 +-0.00173892 0.0697883 -0.0347021 +-0.0444708 0.0888726 0.0431834 +-0.0676524 0.0720092 -0.0120172 +0.0578262 0.0552267 0.0219335 +-0.0418656 0.104235 -0.0206965 +0.0300166 0.0708304 -0.0207823 +-0.0533336 0.128311 0.0351755 +-0.0275965 0.0836272 0.048557 +-0.0894883 0.139285 0.0301857 +0.0461177 0.0511569 0.0313544 +0.0505588 0.0711508 0.00463977 +-0.0653079 0.154958 0.0291369 +-0.0185448 0.0460852 0.0515079 +-0.0843685 0.105877 0.0253348 +-0.0875722 0.151019 0.0254764 +-0.0711952 0.0805577 0.0397762 +0.0367726 0.100261 -0.0101361 +0.0280869 0.0432543 0.0332457 +0.000487446 0.041412 0.0465786 +-0.0266388 0.038336 -0.00299264 +-0.00342216 0.0391144 -0.00832149 +-0.0611289 0.0344725 0.039662 +-0.0517362 0.0738243 -0.0167692 +-0.0804236 0.104574 -0.00559216 +-0.0319013 0.0525534 -0.0124561 +-0.0616634 0.0612417 -0.00198952 +-0.0659473 0.151954 -0.0393992 +0.0336372 0.112962 -0.00230707 +-0.0699642 0.138462 -0.00776795 +0.00139789 0.0405023 -0.0245871 +-0.059508 0.0890036 0.0450344 +-0.0550222 0.141298 -0.00203484 +-0.0720681 0.0805547 0.0392361 +0.0126182 0.0846922 0.0534757 +0.0593665 0.0622129 0.00511321 +-0.0924363 0.118744 0.0263157 +-0.0166806 0.0510876 -0.0315182 +0.0119118 0.0342207 -0.00263798 +-0.0646486 0.156189 0.0162701 +-0.022872 0.104437 -0.0231879 +-0.0799264 0.129511 -0.00520384 +0.0394641 0.063132 0.032359 +-0.0114897 0.0951792 0.0542781 +-0.0474976 0.111158 0.0371638 +-0.0683525 0.155277 0.00186884 +-0.000867993 0.104495 -0.0223762 +-0.0462686 0.12794 -0.00315273 +-0.0306198 0.11135 -0.017885 +-0.0420238 0.0464078 -0.0143471 +-0.0115071 0.0801438 0.0578104 +-0.00552471 0.130134 0.0220582 +0.0553699 0.0651884 0.000788532 +0.000971023 0.0370418 -0.0149189 +-0.0695999 0.162389 -0.0499627 +-0.0593254 0.0447426 0.0431798 +-0.0163529 0.16023 -0.0109161 +-0.0074892 0.108662 0.0435531 +-1.59767e-05 0.130672 0.0211571 +-0.0414957 0.0762285 0.0430404 +-0.00181283 0.0854279 -0.036655 +-0.0573252 0.157131 0.000943525 +-0.0582662 0.0597287 0.0219286 +-0.0158083 0.0827626 -0.0393641 +-0.0636754 0.156752 -0.0416076 +-0.0399677 0.0461402 -0.0203282 +-0.025156 0.16972 -0.0189618 +-0.0527747 0.0826622 -0.0215537 +0.0251411 0.10209 0.0417928 +-0.043632 0.0462886 -0.0112814 +-0.0620154 0.164635 -0.0555847 +0.0104502 0.0343141 -0.0181143 +-0.0391566 0.162183 -0.0124024 +-0.0483573 0.129635 0.0282843 +0.00538744 0.0448871 -0.0255741 +-0.0054947 0.0533903 0.0535249 +-0.00732851 0.0942973 -0.033961 +-0.0241934 0.0388427 0.0350005 +-0.0181599 0.0393223 0.0394029 +0.0346554 0.10439 -0.0105413 +-0.0459466 0.0345121 -0.0200076 +-0.0409396 0.168342 -0.0108401 +0.0103005 0.0624571 -0.0307796 +-0.0681652 0.158429 -0.00684039 +-0.00243741 0.0385239 0.0217416 +0.060795 0.0623425 0.0151668 +-0.0927217 0.128206 0.0112525 +-0.0740576 0.168348 -0.0248615 +-0.0345432 0.114978 -0.015669 +-0.0591204 0.0334451 -0.00148219 +-0.0599836 0.043576 0.0142711 +-0.0568374 0.0898133 -0.021762 +-0.0727774 0.16869 -0.0244081 +-0.00877695 0.169647 -0.023748 +-0.0733702 0.171289 -0.0318245 +-0.0533609 0.033209 0.01963 +-0.012858 0.0386932 -0.00424091 +0.0446984 0.0804984 -0.000780025 +-0.0604981 0.105663 0.0403307 +-0.0437727 0.082626 -0.0206932 +-0.0251898 0.0388783 0.0347661 +-0.00550353 0.0561986 0.0539335 +-0.0649478 0.164181 -0.0229827 +-0.0145881 0.165422 -0.0124907 +-0.0415058 0.0577139 0.0401965 +0.0385298 0.0631329 -0.0097765 +-0.0643222 0.166215 -0.0313693 +-0.0769851 0.0690914 0.0187275 +-0.013127 0.120519 -0.0116431 +-0.0624813 0.156041 0.0199412 +-0.0475747 0.0390527 -0.0120963 +0.0154157 0.0433241 -0.0236953 +-0.00124361 0.130098 0.0236021 +-0.00149237 0.118319 0.0391398 +-0.0454304 0.130382 0.00608349 +0.0094151 0.117047 -0.0161127 +-0.0370213 0.0344129 0.0343812 +-0.0266349 0.121939 -0.00696588 +-0.0514954 0.0833657 0.0447762 +-0.0661547 0.1622 -0.0162285 +0.0354074 0.0446129 -0.00524037 +-0.0839561 0.144602 0.00415973 +-0.0114934 0.104435 0.0434539 +-0.0811445 0.153633 0.00754624 +0.0416181 0.0637615 0.0286411 +0.0336503 0.0646637 0.0398008 +0.00904657 0.129598 0.024451 +-0.075728 0.151337 -0.0208826 +-0.047856 0.132056 0.00259359 +-0.0635915 0.15525 -0.0109401 +-0.025528 0.0383109 0.0298198 +-0.0664625 0.145705 -0.0206681 +-0.0675712 0.139722 0.0445155 +-0.0630199 0.134039 -0.00765574 +-0.0859393 0.101835 0.0256124 +-0.0530219 0.147196 -0.00187885 +-0.00620458 0.038993 0.0313778 +0.0378425 0.10835 0.0231802 +-0.0877357 0.0860979 0.0084778 +0.0064767 0.115498 0.0396093 +-0.027105 0.162286 -0.015104 +-0.0801261 0.144525 -0.00183492 +-0.0858754 0.148602 0.0326009 +-0.060661 0.155018 0.0264156 +-0.0104794 0.0575747 0.0533869 +-0.0433 0.0336903 -0.024306 +-0.0668671 0.0980924 -0.0163226 +-0.0682097 0.171724 -0.0385204 +0.049328 0.0615911 -0.00371844 +-0.059497 0.0861573 0.0445009 +-0.0875265 0.087486 0.0224433 +-0.0660555 0.0600044 0.0111686 +-0.0578054 0.142438 0.0322424 +0.00123277 0.0783068 -0.0354173 +-0.0916354 0.132395 0.0252256 +-0.0117599 0.104933 -0.0231377 +-0.0346346 0.0548282 -0.01038 +-0.0222409 0.0383275 -0.000251248 +0.00824961 0.0725345 -0.0333305 +0.0313861 0.0740897 0.0418701 +0.0164934 0.100411 0.0468922 +-0.0719809 0.156292 0.0165776 +-0.0221908 0.175658 -0.0213821 +-0.00588737 0.108814 -0.0225516 +0.0336337 0.112484 -0.0031866 +-0.0393568 0.123991 -0.00912015 +-0.00841793 0.0387705 -0.00155909 +-0.0431088 0.0347881 0.0415217 +-0.0281377 0.171231 -0.00924208 +0.0317135 0.0955631 0.0407455 +0.0166807 0.124611 -0.00431903 +-0.0923991 0.132355 0.0192227 +0.0141807 0.0900592 0.0522594 +-0.0553478 0.054711 -0.00338754 +-0.0742948 0.147166 -0.0148659 +-0.0210322 0.0623911 0.0469253 +-0.0808524 0.0720445 0.00954101 +0.0185494 0.0379494 0.0423026 +-0.0841291 0.0817203 0.00248105 +0.0309459 0.0700081 0.0411857 +-0.0394974 0.0705046 0.0418138 +-0.0762918 0.169333 -0.0300921 +-0.0537237 0.0477139 0.0256667 +0.0448999 0.0861351 0.000186186 +-0.0313094 0.0384531 -0.00773361 +-0.0305219 0.0474445 0.0454913 +-0.0809514 0.0882189 -0.0076035 +0.0546575 0.0706779 0.0225865 +-0.0414965 0.0986758 0.0418571 +-0.0484435 0.0628471 0.0360579 +0.0594927 0.066407 0.020186 +-0.0627925 0.0838575 -0.0191674 +-0.0214511 0.184864 -0.013038 +-0.0935392 0.129637 0.0202382 +-0.0799546 0.100457 -0.00758867 +-0.0552688 0.126926 0.0376418 +0.0378584 0.0645918 0.0353403 +-0.0361046 0.0383233 -0.0122787 +-0.049226 0.14015 0.0123965 +-0.0164997 0.0938314 0.054193 +-0.0746007 0.0914774 0.0400082 +-0.0791205 0.0709783 0.00599758 +0.0253641 0.0347082 0.00521179 +-0.0594957 0.0918578 0.0453847 +0.0136708 0.0820393 0.0532361 +-0.0193315 0.182966 -0.0230088 +-0.000544127 0.127196 -0.00494172 +-0.030476 0.0664272 -0.0264734 +-0.0734051 0.0674458 0.022683 +-0.0136727 0.0337044 -0.0241151 +0.0214461 0.036336 0.0158614 +0.0583506 0.0662943 0.00413175 +-0.0639059 0.118033 -0.00945272 +-0.0454908 0.0987379 0.0426533 +-0.0318359 0.0344957 0.0406866 +-0.0657843 0.167288 -0.0290298 +0.0181885 0.053509 0.04724 +-0.0610973 0.169393 -0.058599 +-0.0167464 0.108538 -0.0209441 +-0.0826184 0.0802381 0.0286257 +-0.0731223 0.134062 0.0505767 +-0.0135829 0.03702 0.0510108 +0.0354665 0.0768048 0.0390018 +0.0499493 0.051169 0.0281186 +-0.00858939 0.0389741 -0.00922854 +-0.0482262 0.166987 -0.00394405 +0.000506781 0.0605965 0.0560209 +-0.0571262 0.0333733 -0.00101401 +-0.0527176 0.0611373 0.029069 +-0.0225206 0.0919822 0.0517607 +-0.0727584 0.158224 -0.0349231 +0.0221671 0.123584 -0.0006811 +-0.0697019 0.142554 0.0449861 +-0.0890361 0.146068 0.0101777 +0.0300144 0.0389449 0.0261617 +0.0457459 0.0834058 0.0171675 +-0.0828165 0.0790258 0.0245191 +-0.0216847 0.180158 -0.0138785 +-0.0260473 0.11708 -0.0139183 +-0.0263102 0.123352 0.021955 +-0.026277 0.0795343 0.0501986 +-0.04015 0.0473434 -0.014266 +-0.0911404 0.129685 0.035237 +-0.0376719 0.114063 -0.0167039 +-0.0138183 0.0855391 -0.0388001 +-0.0574963 0.111121 0.0367615 +-0.0459611 0.149058 -0.0040494 +-0.06359 0.153594 -0.035633 +0.0294595 0.116659 -0.00368699 +-0.0465112 0.0491437 0.0387964 +-0.0476612 0.135572 0.0133995 +-0.0122712 0.0385653 -0.000297189 +0.0438612 0.0930832 -0.000804157 +-0.00849948 0.0911907 0.056727 +-0.0554517 0.0444829 -0.0071986 +0.0112279 0.0808839 -0.0317275 +-0.0364414 0.0346808 0.041293 +-0.0768829 0.108524 0.037335 +-0.0212115 0.177139 -0.0220322 +-0.0498078 0.0898419 -0.0216876 +0.00832653 0.130915 0.00561741 +-0.0834391 0.153089 0.025871 +-0.0797915 0.0746069 -0.00248195 +0.0162926 0.0348913 0.030635 +-0.0720312 0.141354 -0.00781974 +-0.0640613 0.0606361 0.00380817 +-0.0616877 0.169385 -0.0545934 +-0.0180884 0.184586 -0.0174536 +-0.083714 0.0804887 0.0254979 +-0.0378459 0.0971527 -0.0224307 +-0.048763 0.120209 -0.0131018 +0.0257432 0.120365 -0.00224906 +0.0155215 0.0490175 0.0450471 +-0.0516538 0.162634 -0.00285466 +-0.00249513 0.0774404 0.0585569 +-0.0676995 0.0606833 0.0155957 +-0.0530523 0.0333885 -0.00566149 +0.00632209 0.0596079 -0.030662 +-0.075813 0.0681115 0.0180714 +0.0416741 0.0642804 0.0284921 +-0.04591 0.132311 0.0103278 +-0.0266282 0.0932643 0.045173 +-0.0409763 0.128303 0.0136557 +-0.0295455 0.0745738 0.040676 +-0.0236123 0.0408478 -0.0290846 +-0.062999 0.13114 -0.0082084 +-0.0282657 0.0357556 -0.0195136 +0.0383138 0.109087 0.0181423 +-0.0225227 0.0903335 -0.0360154 +-0.00581332 0.0840953 -0.0378871 +-0.0560848 0.155673 0.012015 +-0.0384894 0.0436513 0.0409963 +0.0250684 0.0912521 -0.0226015 +0.0327251 0.116757 0.0189485 +-0.00849679 0.081545 0.0579523 +0.00549376 0.116905 0.0389072 +-0.0684642 0.035536 0.0130279 +-0.0274333 0.0808284 0.0484505 +-0.0892338 0.0888828 0.0134587 +0.040773 0.0858024 -0.0107788 +-0.018787 0.0654231 0.0516453 +-0.057411 0.0334884 -0.00846165 +-0.0515646 0.0516091 -0.00736491 +-0.0341101 0.171131 -0.0149349 +0.0224908 0.0672402 0.0465227 +0.00748827 0.048894 0.0505047 +-0.0891497 0.139122 0.0375101 +-0.0324992 0.033739 0.00907408 +-0.00547868 0.112944 -0.019663 +-0.00364368 0.038223 0.0108877 +-0.00888297 0.175714 -0.027834 +-0.0616908 0.156845 -0.0305919 +-0.0454927 0.0747515 0.0421648 +-0.0628753 0.0333858 -0.000385113 +0.0200484 0.122759 0.029923 +-0.0624127 0.150637 -0.0175763 +-0.0772056 0.0717509 -0.00044869 +-0.070203 0.179305 -0.0507979 +-0.021805 0.0812974 -0.0389167 +0.00417139 0.0894659 -0.0333631 +-0.00354618 0.035584 0.0475305 +-0.0881296 0.100997 0.0213597 +-0.0344927 0.0803488 0.0420944 +-0.0142597 0.180104 -0.0279187 +-0.0772012 0.161073 -0.0279344 +0.0267764 0.0373043 0.025139 +-0.0764984 0.127442 0.0532158 +0.0305998 0.0741029 0.0424942 +-0.0429656 0.115061 -0.0157138 +-0.0569157 0.131148 0.0370227 +-0.087746 0.09368 0.0248353 +-0.0282695 0.0620042 -0.0284458 +-0.026741 0.0877745 0.0490115 +-0.0141005 0.0382966 0.0123251 +-0.040335 0.124745 0.0227896 +-0.0176742 0.109826 -0.020315 +0.0100598 0.0371564 0.0309489 +0.0330284 0.116174 0.0204895 +0.0194916 0.111179 0.0380087 +-0.0468321 0.144886 0.00412892 +0.00432629 0.0568097 -0.0310178 +0.0172994 0.0665713 -0.0290602 +-0.0776345 0.165887 -0.0268309 +-0.0754949 0.117024 0.0522099 +0.0129986 0.124708 -0.00640366 +-0.0551543 0.0561755 0.00960447 +0.0258384 0.0659192 0.0443144 +-0.0892157 0.0956404 0.0184193 +-0.062275 0.152174 -0.0245791 +-0.0712276 0.159591 -0.0429327 +-0.0468614 0.102797 -0.0212675 +-0.0888687 0.0942285 0.0104297 +0.00705483 0.113673 0.0402142 +-0.0846088 0.10754 0.00337493 +-0.0567766 0.0840541 -0.0213935 +0.0291103 0.0713139 0.0420683 +-0.0416245 0.172695 -0.00500345 +0.0467254 0.0741323 0.0166809 +0.0182946 0.123502 0.0292701 +-0.032545 0.0821172 -0.0295502 +0.0405942 0.0847142 0.0324234 +-0.063874 0.0967575 -0.0177619 +-0.0200635 0.0385408 -0.00554998 +-0.0617567 0.139364 -0.00656769 +-0.0151158 0.0388065 -0.0122456 +0.0258671 0.111418 0.0358303 +-0.0323169 0.126646 0.013854 +0.0128496 0.0432822 0.0446281 +0.0410596 0.104249 0.0151631 +0.0413114 0.0661977 -0.00477755 +-0.0524783 0.0442541 0.0446515 +-0.00534534 0.0423344 0.0481709 +-0.0154906 0.0587868 0.0517337 +-0.0768702 0.122267 -0.00710647 +0.018318 0.0607989 -0.0274966 +-0.0414689 0.101488 0.0411988 +-0.03948 0.109789 0.0371385 +-0.071689 0.171513 -0.0326505 +-0.0562412 0.0479891 0.0306662 +0.0198041 0.103539 -0.0196351 +-0.06089 0.146655 -0.00344226 +-0.0625194 0.150622 -0.0185752 +0.0162788 0.0421207 0.0443108 +-0.0926435 0.13098 0.0162303 +-0.0102744 0.0864318 -0.0379838 +0.0437196 0.0846401 -0.00379782 +-0.0575438 0.119835 0.0395668 +-0.0312754 0.118165 0.0306394 +-0.0384168 0.120732 -0.0116964 +-0.0133826 0.1039 0.0435877 +0.0232434 0.0804535 -0.0255191 +-0.0102585 0.0379591 0.0497745 +-0.0427371 0.0753968 -0.0185868 +0.0223381 0.0606785 -0.0258752 +-0.0124978 0.122374 0.0339942 +0.00450508 0.0688823 0.055725 +0.0471561 0.0614873 -0.00363177 +-0.0496676 0.0649029 -0.0122308 +-0.0360083 0.0485228 -0.0153235 +0.0255211 0.116701 0.0317994 +0.000516492 0.101662 0.0444028 +0.00434751 0.121547 -0.0129175 +-0.0374873 0.0959326 0.0432114 +0.0252705 0.0346338 0.0163557 +-0.0124579 0.0545987 0.0514221 +-0.0889602 0.131049 0.0432066 +-0.0372423 0.152141 0.00211029 +-0.0892956 0.0942653 0.013432 +-0.0518302 0.0344778 0.0329457 +-0.0187757 0.0756949 -0.0390019 +-0.0719603 0.0681626 0.0276375 +-0.0847959 0.147297 0.0357863 +-0.0683786 0.160357 -0.00982452 +-0.0326605 0.0863757 -0.0255732 +0.0456643 0.0848033 0.01617 +0.0560044 0.0608622 0.0263962 +0.0242808 0.034582 0.00510919 +-0.0255484 0.0414464 0.0539815 +0.0584482 0.0538047 0.0101717 +-0.0507323 0.0738128 -0.0166527 +-0.0145896 0.101524 -0.0235873 +0.00379349 0.0393361 0.0313217 +-0.060041 0.155524 0.0222725 +0.0330115 0.107346 -0.00970764 +-0.0356538 0.120932 -0.00987931 +0.0252334 0.114772 -0.00969056 +-0.0560291 0.051292 0.00869383 +0.039494 0.0484532 0.0321483 +0.0260206 0.095556 0.0448127 +-0.0144952 0.092498 0.0556089 +-0.0745303 0.0887706 0.0400356 +-0.0427423 0.0768225 -0.0188988 +-0.0254944 0.0348465 0.0469921 +0.0115755 0.104003 -0.020168 +0.0177398 0.128218 0.01192 +-0.0537709 0.0460941 0.0150722 +-0.0260174 0.0351047 -0.0290083 +0.0146321 0.0460649 0.043757 +-0.0725348 0.149777 -0.0387435 +-0.067793 0.0851703 -0.0179862 +-0.0345051 0.0491976 0.0390013 +-0.0575351 0.0727864 0.0407731 +-0.0902562 0.135043 0.0112131 +-0.0341019 0.0350895 0.0466468 +0.0354707 0.0862229 0.039086 +-0.0635111 0.15292 -0.0340962 +0.000752728 0.131478 0.01712 +0.0415962 0.101461 0.0191676 +0.0199544 0.117871 -0.0110405 +0.0125 0.0341066 0.00131673 +-0.0104877 0.105844 0.0434252 +0.000625364 0.130997 0.01994 +-0.00947876 0.108641 0.0432746 +0.0427329 0.0747306 -0.00479562 +0.0175177 0.121695 0.0318921 +-0.0724967 0.123205 0.0535111 +-0.0217998 0.0826894 -0.0387559 +-0.0474379 0.0384277 -0.0132876 +-0.0453217 0.127718 -0.00291517 +0.00149278 0.115548 0.0405079 +-0.00268673 0.0598311 -0.0338297 +-0.0282466 0.0410133 0.0533665 +-0.084979 0.0912122 -0.0035611 +-0.00188052 0.0377314 0.00623396 +-0.0719012 0.152408 -0.0434229 +0.0297667 0.100164 -0.016062 +-0.0446553 0.0615526 0.0394256 +-0.0935168 0.125484 0.0132627 +0.00892319 0.0349264 0.0435129 +-0.0906919 0.142015 0.0231619 +-0.0362968 0.126232 -0.00232089 +-0.0581074 0.0494572 0.00366497 +0.0584743 0.0538121 0.0171841 +0.0453685 0.090397 0.014157 +0.0451698 0.0903876 0.0161628 +-0.0648504 0.099576 -0.0170426 +-0.0336174 0.0385515 -0.0101375 +-0.0818746 0.144748 0.0414084 +-0.0921915 0.114676 0.0133297 +-0.0735116 0.140055 0.0477493 +-0.0625074 0.0334277 0.00145514 +0.0301634 0.0659717 0.0417895 +-0.0313891 0.0338671 0.0146006 +-0.0524964 0.0876231 0.0453765 +-0.0763164 0.155546 0.0238171 +0.0473804 0.0650284 -0.00116263 +-0.0203751 0.165368 -0.0103486 +-0.074953 0.131092 -0.00759533 +-0.0200723 0.0361973 0.0530852 +-0.0623326 0.164687 -0.0445921 +-0.0432796 0.127517 -0.00276726 +-0.0794589 0.155317 0.0154304 +0.0484584 0.0430177 0.0142199 +0.0516914 0.0635003 0.0289607 +0.0124992 0.111251 0.0392691 +-0.00916969 0.168123 -0.0207225 +-0.0624966 0.0987153 0.0424769 +0.0403564 0.0602895 0.0300713 +0.000529964 0.0745913 0.0578265 +-0.00430704 0.037991 -0.0149598 +-0.0458025 0.0336244 -0.00441422 +0.0244543 0.124393 0.0172632 +-0.0566778 0.0485827 0.00942267 +0.0118497 0.0354401 0.0310392 +-0.0460906 0.156154 -0.00788178 +0.0200436 0.125383 0.0241901 +-0.0110606 0.128229 0.000136123 +-0.0680155 0.149781 -0.0384715 +-0.0340535 0.158097 0.00328753 +-0.063246 0.0709836 0.037551 +0.00837353 0.0479453 -0.0272176 +-0.0704921 0.0944433 0.0420805 +0.0271048 0.0835778 0.0462962 +-0.0814225 0.0858535 0.0328878 +-0.0311244 0.126183 0.00987945 +0.00420219 0.0866314 -0.0335404 +-0.0160918 0.0359549 0.0514785 +-0.0387772 0.152061 -0.00669739 +-0.0394877 0.095879 0.0424449 +-0.0556734 0.0645255 -0.00818248 +-0.0721186 0.0637108 0.0173676 +-0.00866441 0.055565 -0.0335626 +0.034399 0.0476191 -0.006288 +0.0184894 0.03497 -0.0076507 +-0.0208903 0.0376209 0.05361 +-0.0721389 0.12842 0.0519775 +-0.0135421 0.093873 0.0547462 +-0.0114977 0.038716 -0.00213082 +-0.0444942 0.0761733 0.0424299 +-0.0162113 0.0387427 -0.00681752 +-0.0632795 0.162306 -0.0238202 +-0.0678999 0.11945 -0.00879052 +-0.0624555 0.163099 -0.0465902 +-0.0197676 0.0376635 -0.0177276 +-0.00982564 0.0339746 -0.0198462 +-0.0334993 0.115969 -0.0147052 +0.0241258 0.0914782 -0.0228484 +0.0393714 0.104176 0.025187 +-0.0877422 0.114422 0.00426669 +0.0169437 0.0346991 -0.00395051 +-0.0659364 0.0364202 0.0386491 +0.0236414 0.0741206 0.0482553 +0.0360643 0.108191 -0.003826 +-0.0498837 0.0340852 -0.0133065 +0.0109544 0.0459934 0.0454216 +0.0232194 0.06778 -0.026032 +0.0407755 0.0675587 -0.00776366 +0.0164452 0.127885 0.0214354 +0.0306214 0.073711 -0.0207585 +0.0310665 0.0768618 0.0431993 +-0.0326395 0.0549161 -0.0112709 +-0.0264479 0.0721314 0.0435447 +0.0185916 0.116689 0.0359263 +0.0210399 0.118016 0.0341276 +-0.0910253 0.115214 0.0323598 +0.000420695 0.0340758 -0.0179207 +0.011475 0.115421 0.0379758 +0.0558934 0.0728505 0.0127047 +-0.0168011 0.0813465 -0.0393174 +-0.0884013 0.103686 0.0143755 +0.00687166 0.100046 -0.0219438 +0.00938176 0.0463536 -0.0257255 +-0.0376115 0.11722 -0.0140038 +-0.0454999 0.102932 0.0417867 +-0.0638509 0.0597328 0.00826283 +-0.0626761 0.0691812 -0.0125769 +-0.0654105 0.124234 0.0493774 +-0.0585036 0.0790577 0.0434985 +0.025387 0.103408 0.0403826 +0.0322433 0.0896617 -0.0189276 +-0.0875821 0.0909427 0.0247332 +-0.0855607 0.103501 0.00239284 +-0.0436971 0.0419128 0.0432773 +-0.0946145 0.122826 0.0212791 +0.0282404 0.0858422 -0.0216043 +0.00524711 0.0726037 -0.0343433 +0.00348793 0.114165 0.0408953 +-0.0345349 0.108408 0.0380462 +-0.053757 0.152473 0.0202331 +-0.0684765 0.061182 0.0096252 +-0.0653795 0.17033 -0.0418012 +0.0335191 0.0398635 0.0260657 +0.00150101 0.0647986 0.0566673 +-0.0386685 0.0621637 -0.0127302 +0.0514753 0.0731205 0.0184716 +-0.0475108 0.159316 0.00812402 +-0.0418554 0.101378 -0.0213767 +0.059111 0.0580409 0.00617531 +-0.0235023 0.105779 0.0421282 +-0.0564932 0.0861648 0.0446121 +0.0463019 0.07925 0.0141776 +-0.037115 0.160706 -0.0129903 +-0.0454732 0.0917007 0.0431865 +-0.08762 0.143285 0.0101199 +0.0294825 0.0348729 0.0114843 +0.0351631 0.0941496 -0.0136388 +0.0169892 0.122251 -0.00777586 +-0.0286955 0.175698 -0.00647862 +-0.0586479 0.0629437 -0.00583333 +-0.0799097 0.0706493 0.0132254 +0.0440384 0.0959414 0.0171588 +0.00466861 0.0365644 -0.00250089 +-0.0368263 0.0929138 -0.0236695 +-0.0126068 0.0392015 -0.0264338 +0.014095 0.041997 0.0446638 +0.00757449 0.035092 0.025056 +-0.0564565 0.03337 -0.00815977 +-0.0774971 0.128861 0.0533302 +0.0348978 0.0613787 -0.0138096 +-0.0348784 0.10713 -0.0202183 +0.0074278 0.117326 -0.0164147 +-0.0416698 0.0345261 0.0350582 +-0.0711528 0.180791 -0.0525602 +-0.0633069 0.0343768 0.0340823 +-0.0795725 0.091329 0.0351135 +-0.00149388 0.0787876 0.0581499 +-0.0838841 0.12062 -0.00343109 +-0.0017512 0.0769296 -0.0360915 +0.00921045 0.0851252 -0.032 +0.0528986 0.056075 -0.00272531 +-0.088793 0.0888086 0.00747102 +0.0367516 0.061565 -0.0117718 +-0.00560731 0.0389273 -0.00299633 +-0.0145783 0.0348246 -0.0259715 +-0.0668255 0.162993 -0.016474 +0.0537671 0.0492093 0.00323447 +0.0164968 0.0990289 0.0471605 +0.0350254 0.0533499 0.0328505 +-0.0502577 0.127427 -0.00458948 +-0.0354996 0.0605317 0.0401535 +-0.0445094 0.0832466 0.0430632 +-0.061134 0.11687 0.0396165 +0.0288023 0.0594063 -0.0198054 +-0.0345743 0.120058 0.0294165 +-0.00577775 0.0812461 -0.0375203 +-0.0271582 0.125819 0.00840694 +-0.00487894 0.130442 0.0208375 +-0.0485449 0.165375 0.00344343 +0.00426734 0.0682596 -0.032922 +-0.0887148 0.12811 0.00328264 +-0.0688911 0.0610594 0.0132079 +-0.0845844 0.121705 0.0490448 +0.0086501 0.130656 0.00430717 +-0.0694892 0.109539 0.0380952 +-0.0883053 0.149858 0.0265188 +-0.0556122 0.136727 0.0318764 +0.00753471 0.0632773 0.055432 +-0.0675754 0.0334584 0.000400215 +0.0390555 0.064539 0.0335561 +0.00752021 0.073081 0.0562837 +-0.0898786 0.113438 0.0340422 +-0.0729585 0.134037 -0.00770509 +-0.0713317 0.151217 -0.0439201 +0.00350232 0.123774 0.0338316 +-0.0682244 0.142863 -0.0118107 +-0.0110454 0.113378 -0.0180964 +0.0539053 0.0478505 0.00821457 +-0.0614468 0.141404 -0.00570472 +-0.0113089 0.0383954 0.0218511 +-0.0281079 0.177558 -0.016771 +0.012409 0.0418787 -0.0238148 +-0.00282516 0.102957 -0.0229221 +0.0254031 0.123772 0.0104796 +-0.0305987 0.0803029 0.0419758 +-0.0750181 0.0761727 0.0341343 +-0.0144519 0.166922 -0.0140569 +0.00338055 0.0465728 -0.0280809 +-0.0162255 0.177147 -0.0257279 +0.0131167 0.108671 -0.0187213 +0.0272829 0.121723 0.00548626 +-0.0883907 0.115479 0.0451949 +-0.0879259 0.102339 0.0203636 +-0.0548201 0.128324 0.0365339 +-0.0820753 0.129944 0.0519532 +0.00724365 0.07823 -0.0340312 +-0.0819891 0.0923793 -0.00757573 +-0.0303556 0.168269 -0.0071929 +-0.00250456 0.0562401 0.0542942 +-0.0616678 0.143939 0.037247 +-0.0776245 0.151441 -0.00287924 +0.0374138 0.110303 0.0192381 +0.0348067 0.0902706 0.0399059 +-0.0127063 0.0671038 -0.0370425 +0.0160068 0.0347306 -0.00980024 +-0.0372246 0.0368821 -0.0130308 +0.0340234 0.0585319 -0.0137143 +0.0541559 0.0477549 0.017206 +-0.0405048 0.15944 0.00272423 +-0.0015963 0.0981039 -0.0279083 +-0.092935 0.117416 0.0233037 +-0.0832007 0.119017 0.0492012 +0.00140058 0.0348342 -0.0234319 +-0.0868724 0.106357 0.0173489 +-0.0166991 0.0570076 -0.034416 +-0.0907644 0.142021 0.0271708 +-0.0822477 0.106043 -0.00262262 +-0.0929753 0.11876 0.0253083 +-0.0263289 0.0434924 0.0526862 +-0.0374936 0.0733328 0.0420467 +-0.0355255 0.0818589 0.0431427 +-0.0650055 0.136996 -0.00788185 +-0.0705444 0.0712752 0.0339991 +-0.0549513 0.0339195 0.0239841 +-0.00779971 0.114512 -0.0173201 +0.0213851 0.0754916 0.050294 +0.0297243 0.0538559 -0.0167895 +-0.00746204 0.125196 -0.00874293 +-0.0385113 0.0973107 0.0424108 +0.0437641 0.0599949 -0.00412714 +0.00932784 0.0581716 -0.0301717 +-0.07404 0.148543 -0.0208687 +-0.067363 0.177688 -0.0512074 +-0.00213372 0.123188 0.0349488 +-0.0180211 0.168338 -0.0139614 +-0.0254657 0.0678395 0.0426887 +-0.0266217 0.0436536 -0.0288174 +-0.0498332 0.0956322 -0.0221283 +-0.0772795 0.155549 -0.0169029 +0.0369068 0.0799159 -0.0147176 +-0.0788489 0.119288 -0.00581129 +-0.0101059 0.171125 -0.0207965 +-0.0324932 0.0774699 0.0412179 +-0.0434937 0.0705308 0.0420517 +-0.0158265 0.0869335 -0.0385904 +-0.00548754 0.123746 0.0343085 +0.0610091 0.0623122 0.0111052 +-0.00962571 0.0451144 -0.0282927 +-0.0687445 0.160961 -0.0529537 +-0.00991099 0.115578 -0.0164445 +0.0199768 0.126969 0.0170274 +-0.0827793 0.0771313 0.0211566 +-0.0119077 0.0894805 -0.0370977 +0.0238643 0.100811 0.0434608 +-0.0130347 0.166801 -0.0212915 +-0.0934989 0.122762 0.0122811 +-0.0667245 0.0765676 -0.016644 +-0.0391998 0.0351247 -0.0118182 +-0.0445637 0.128075 -0.00132731 +-0.0258871 0.0377455 0.0194558 +-0.093776 0.124126 0.0142628 +-0.0698753 0.117966 -0.00835455 +-0.0515005 0.100157 0.0426446 +-0.0404873 0.112547 0.0355988 +-0.0674682 0.0382926 -0.00574154 +-0.0624974 0.0876076 0.0451456 +-0.0367451 0.0768715 -0.019149 +-0.00349748 0.0870382 0.0570453 +0.0243264 0.0591823 -0.0248233 +-0.0604582 0.154406 0.00215902 +-0.0742084 0.067281 0.00145303 +0.0461952 0.0834391 0.00817714 +-0.0246581 0.0664552 0.0433381 +0.0223219 0.0402539 -0.00770693 +-0.0269495 0.0511315 0.0418642 +-0.0426785 0.060742 -0.0126195 +-0.0470567 0.069722 0.0403886 +-0.057499 0.0889744 0.0446686 +-0.0925962 0.126825 0.0102659 +-0.0627541 0.166279 -0.0425846 +0.00227655 0.0655175 -0.0339267 +-0.0152717 0.181584 -0.0271612 +-0.0527991 0.0578707 0.0222512 +0.0181983 0.0768373 0.0527356 +-0.020287 0.0445184 0.0528933 +-0.0230546 0.0388523 0.0540611 +-0.0591948 0.0603156 -0.00052226 +-0.0356179 0.0505976 -0.0108834 +-0.0125985 0.0420542 -0.026434 +-0.0457346 0.0337173 0.00640665 +-0.0271239 0.117991 -0.0128729 +-0.0287901 0.105845 -0.0221143 +-0.0791947 0.116328 0.04948 +-0.037475 0.126933 -0.001254 +-0.0652274 0.172558 -0.0603808 +0.0249025 0.0659023 0.0447242 +0.0444853 0.062436 0.0294527 +-0.0584017 0.0411488 0.0207065 +-0.0637308 0.0380192 0.0421186 +-0.0224637 0.0768447 0.053535 +-0.0472049 0.132217 0.00449629 +-0.055985 0.033885 0.0237996 +-0.0637704 0.158563 -0.0153492 +-0.0889154 0.0875162 0.0124615 +-0.0630601 0.155204 -0.0366146 +-0.0858283 0.1008 0.00139713 +-0.00849876 0.0884233 0.057199 +-0.0464295 0.156494 0.00819518 +-0.0875333 0.0927687 0.0054156 +-0.0555067 0.053407 0.0086882 +-0.0319429 0.0346356 0.0246022 +-0.0532414 0.127751 -0.00500041 +-0.0324852 0.0946249 0.0445277 +-0.0652259 0.166727 -0.0597961 +0.0318258 0.090298 0.0426417 +0.0227624 0.0959793 -0.0216236 +0.0453464 0.0791637 0.00120688 +-0.00148178 0.0718081 0.0578063 +0.0484981 0.0664872 0.0276228 +-0.0638124 0.0339885 0.0132249 +0.0378702 0.100686 0.0303226 +0.0423416 0.0718943 -0.00578991 +0.0449549 0.0889654 0.0201657 +-0.0505604 0.0431885 -0.0101401 +0.0305345 0.113708 -0.00653825 +0.0175297 0.092684 0.048312 +-0.0405439 0.0338701 -0.0146326 +-0.0151193 0.0387785 0.0315419 +0.0425177 0.0660617 -0.00221978 +-0.0261619 0.0381432 0.054147 +-0.0435068 0.0576714 0.0396679 +-0.0531482 0.161241 0.00587596 +-0.0897425 0.0915834 0.0134432 +0.00549953 0.119637 0.0367537 +-0.00877042 0.130092 0.00788453 +-0.0417274 0.0725105 -0.0179617 +-0.0534984 0.0776159 0.0431279 +-0.0290767 0.121891 0.0239314 +0.0583737 0.0676977 0.00512132 +-0.0647358 0.157148 -0.0507072 +0.0435656 0.0945094 0.0231538 +-0.0220003 0.181634 -0.0125756 +-0.0298816 0.0621837 -0.0234188 +-0.0460097 0.127427 -0.00464706 +-0.0136152 0.0982979 -0.0261721 +-0.0662958 0.0637695 -0.0035905 +-0.0920915 0.118829 0.0424602 +-0.0157421 0.0686009 -0.0381423 +-0.063492 0.0819119 0.043822 +0.0519248 0.0461654 0.00821164 +-0.0528781 0.0490838 0.0346622 +-0.0896974 0.137929 0.0351902 +-0.0502406 0.140114 0.00340131 +-0.0460575 0.131197 0.00582383 +-0.0398248 0.0928735 -0.0232663 +-0.0287922 0.165339 -0.00670006 +-0.0017304 0.0712031 -0.0351875 +-0.0386191 0.118326 -0.013151 +0.0193849 0.126884 0.00540105 +0.0309645 0.0363887 0.0195722 +-0.0314998 0.155167 -8.72409e-05 +-0.000786782 0.0826169 -0.0366787 +-0.0771272 0.155133 0.00894547 +-0.00248977 0.112799 0.0419964 +-0.0279028 0.160261 -0.0136941 +-0.0431979 0.129461 0.00840104 +-0.0208217 0.0854768 -0.038298 +-0.01776 0.0714448 -0.0386564 +0.00624218 0.039472 0.0335072 +-0.0639011 0.119458 -0.00893676 +-0.0667029 0.176899 -0.0509708 +-0.0245413 0.0349941 -0.0287041 +-0.0487364 0.0753122 -0.0176891 +-0.0669945 0.169371 -0.0323347 +-0.00928822 0.0393788 0.0494849 +-0.0239808 0.0936155 -0.0313592 +0.0224894 0.0906371 0.0481279 +0.0242369 0.0748124 -0.0257049 +-0.0243462 0.1625 -0.00551798 +-0.0625942 0.153749 -0.0125838 +-0.0486891 0.137066 0.0163891 +-0.0679674 0.0350577 0.0131968 +-0.0626161 0.12969 0.0410793 +-0.0263812 0.120789 0.0279195 +-0.0802896 0.144766 0.0426469 +0.0132183 0.0794258 -0.0310561 +-0.0415045 0.0548576 0.0396938 +-0.00948994 0.0952069 0.0546127 +-0.0903261 0.135124 0.0222174 +-0.0574953 0.153709 0.0290191 +-0.0428742 0.10707 -0.020141 +0.057983 0.0674087 0.022273 +-0.0297438 0.0593588 -0.0214043 +-0.0562018 0.0589495 -0.00340637 +-0.0230647 0.0402418 0.0541248 +-0.062019 0.17397 -0.0618399 +-0.0412895 0.149153 -0.00363446 +-0.0485728 0.0503685 -0.00899002 +-0.00748812 0.10728 0.0439222 +-0.0336555 0.0709359 -0.0204834 +-0.0407158 0.171931 -0.00126808 +-0.0610791 0.151413 0.0351388 +-0.0221494 0.0384504 -0.005885 +0.00439305 0.11559 -0.018534 +-0.0241215 0.0944713 0.0461972 +-0.0547672 0.0812274 -0.0214088 +-0.0846583 0.0777659 0.00751712 +-0.0574282 0.0507609 0.000628334 +-0.00874511 0.0976201 -0.0294139 +-0.022979 0.0380859 0.023348 +0.043448 0.0916342 -0.00278755 +0.0145196 0.123096 0.0322223 +-0.0415646 0.125825 -0.00703356 +-0.0726695 0.171671 -0.0330178 +-0.010471 0.0378949 -0.0160892 +-0.0488368 0.0970812 -0.0221898 +-0.0586032 0.141 0.0328315 +-0.0117815 0.0347775 0.0429519 +0.0116378 0.0603198 0.0518663 +-0.0459594 0.0560107 0.0380589 +0.0399446 0.107028 0.0121641 +0.00710547 0.0893998 -0.032814 +0.0410678 0.10142 0.0221661 +-0.0244452 0.181836 -0.00961144 +-0.013259 0.121231 -0.0103976 +-0.0454789 0.123431 0.0251209 +0.0285377 0.0523356 -0.0187697 +0.0588289 0.0691072 0.0191593 +0.0125005 0.1007 -0.0226033 +-0.0595569 0.153648 0.0312116 +-0.00403867 0.0994311 -0.025339 +0.00148661 0.108625 0.0426664 +-0.0327389 0.0482896 -0.0213368 +-0.0380117 0.0344553 0.0341354 +-0.072467 0.0968801 0.0405541 +0.0151781 0.0847217 0.0519158 +-0.0425055 0.108838 -0.0192163 +-0.00749309 0.114174 0.0409291 +-0.0434968 0.119301 0.0295385 +0.0363932 0.0476439 -0.00624826 +-0.079546 0.0719865 0.0195582 +-0.0564882 0.042714 0.0457133 +-0.0113851 0.0383094 0.011049 +-0.0865431 0.106355 0.0183534 +-0.0313759 0.0553098 -0.0143786 +0.0515215 0.0651377 0.0281771 +0.0253513 0.0605347 -0.0238887 +-0.0627683 0.164709 -0.0355885 +-0.0520878 0.0489475 0.0226481 +-0.0371717 0.165191 -0.0136726 +0.0421423 0.0738117 0.0292393 +0.0499661 0.0451421 0.0208878 +-0.0394943 0.116662 0.0325452 +-0.085625 0.079203 0.01151 +-0.0716025 0.135501 0.0492566 +-0.00270958 0.0391757 0.033738 +-0.0911953 0.143381 0.0241598 +0.0418026 0.102869 0.0141608 +-0.0319458 0.0708051 -0.0254622 +-0.0626184 0.145978 -0.00858061 +0.0207857 0.0994851 0.0460447 +0.0275851 0.114088 0.0330397 +-0.040502 0.120714 0.028794 +-0.0853944 0.101863 0.0264831 +0.00328879 0.0668715 -0.0332298 +-0.0446453 0.0577855 -0.0118043 +0.0188777 0.03558 -0.00867348 +-0.064488 0.156133 0.0221359 +-0.00921165 0.172686 -0.0275682 +-0.0426232 0.0362716 0.0437883 +-0.0246131 0.0422659 -0.0289978 +-0.0766564 0.0773474 -0.00857073 +0.0281325 0.121698 0.0129367 +-0.00471394 0.0641886 -0.0352179 +-0.0274456 0.0382197 0.0539829 +-0.0417615 0.03357 0.00191851 +-0.0596536 0.0350995 0.0445384 +-0.0458215 0.091313 -0.0218951 +-0.00569643 0.0599053 -0.0346867 +-0.0728066 0.087878 -0.0157134 +0.00467021 0.0347458 0.0211501 +-0.0369631 0.0341718 -0.0179086 +-0.0700564 0.162427 -0.0118963 +-0.0938276 0.126933 0.0242666 +-0.0207424 0.110014 -0.0205123 +0.00150816 0.0911296 0.0556681 +-0.00874857 0.0727984 -0.0375275 +-0.0679476 0.156599 -0.00385029 +-0.076928 0.152806 -0.00788984 +-0.0860408 0.109124 0.0103593 +-0.0514909 0.0544833 0.0216233 +-0.0756545 0.151363 -0.0148873 +0.0423862 0.047532 -0.00502925 +-0.0895419 0.0916017 0.0194388 +-0.014074 0.128231 0.00303832 +-0.0747094 0.155646 0.00979649 +-0.0931712 0.117411 0.0223074 +-0.0548599 0.145302 0.0295141 +-0.058163 0.0467738 0.0296766 +0.00351191 0.0459363 0.0483003 +-0.091423 0.144753 0.0241539 +0.0174632 0.0948293 0.047857 +-0.0326373 0.119597 -0.0104942 +0.0206219 0.119357 0.0335278 +-0.0174992 0.0897364 0.0558751 +-0.00978193 0.0784455 -0.0377778 +0.0236993 0.12332 0.00130956 +-0.0792974 0.15265 0.00222093 +-0.0444956 0.102933 0.0417949 +0.0152822 0.129138 0.0167187 +0.0467013 0.0718392 0.0195936 +-0.0883363 0.112382 0.0405773 +-0.0515091 0.105631 0.0400498 +0.00121056 0.115576 -0.018509 +-0.0525671 0.0335472 0.0123651 +-0.0285962 0.0377287 0.0207135 +0.0043328 0.0341303 0.00522853 +-0.0914252 0.114627 0.0103302 +-0.0231203 0.163764 -0.0160465 +-0.0077447 0.0698983 -0.036343 +-0.0650951 0.162442 -0.0187197 +-0.0652725 0.0613084 0.02088 +0.0455972 0.0415054 0.0160287 +-0.0554928 0.148133 0.0286364 +-0.0709153 0.113624 -0.0087498 +-0.0390311 0.160893 0.00133569 +-0.0669712 0.156006 0.0125516 +-0.0607902 0.0334775 -4.36679e-05 +-0.0634989 0.108392 0.0384413 +-0.0239757 0.0768012 0.0522149 +-0.0671254 0.128435 0.0486555 +-0.0368355 0.153629 0.00272174 +-0.0280768 0.169745 -0.00916431 +0.00750786 0.0518308 0.0519822 +0.017486 0.112589 0.0378808 +-0.0694907 0.0930374 0.0422024 +-0.0457991 0.0336321 0.00104877 +0.0385285 0.0901386 0.0347352 +0.0154693 0.0976312 0.0477084 +-0.0134564 0.0347657 0.0443699 +0.0132374 0.123205 -0.00876652 +0.0204758 0.0975716 0.0468126 +-0.0702558 0.152263 -0.0463745 +-0.0361586 0.0382819 -0.0067057 +0.0546048 0.0478149 0.0122009 +-0.0455357 0.120317 -0.0132441 +-0.00750778 0.0828941 0.0575015 +-0.0338576 0.0347656 0.029445 +-0.0195033 0.118175 0.0352728 +0.0125203 0.0616669 0.0514026 +-0.0196496 0.0582641 0.0484904 +0.0383367 0.0910432 -0.012345 +-0.00538883 0.122125 -0.0114557 +-0.075455 0.0675485 0.016865 +-0.0362517 0.123246 0.0257763 +-0.0815948 0.123081 0.0504133 +-0.00479304 0.130806 0.0179661 +-0.0776418 0.158287 -0.0219264 +-0.0484803 0.117974 0.0310954 +-0.0386541 0.126132 0.0204051 +-0.0786087 0.102098 0.0338163 +0.0464344 0.0792618 0.0111808 +0.0289709 0.0848578 0.043728 +-0.0184969 0.10579 0.0426906 +-0.0245528 0.116739 0.0335827 +-0.0754858 0.146995 0.0422823 +-0.0528151 0.132539 0.0323863 +-0.00781365 0.086863 -0.0372016 +0.0145549 0.126574 -0.00243153 +-0.0834735 0.076324 0.00852235 +-0.0597355 0.0752692 -0.0179534 +-0.0853298 0.111023 0.0405559 +-0.0515948 0.137023 0.025408 +-0.0693375 0.168152 -0.0246084 +-0.0781507 0.115089 0.0495991 +-0.0468723 0.0587675 0.0374438 +0.0193537 0.0349459 0.0257791 +0.0243371 0.123621 0.0229269 +-0.0907106 0.133758 0.0262122 +-0.0542023 0.0435162 0.019691 +-0.036169 0.0335901 -0.0284162 +0.0196024 0.0858351 -0.0269873 +0.0084996 0.0488213 0.0500608 +-0.0308481 0.0664794 -0.025463 +0.0262324 0.0775308 -0.0242027 +0.0470911 0.0422949 0.0155431 +0.0315748 0.0605586 0.0402762 +-0.0722147 0.149455 -0.0385736 +-0.0695516 0.170347 -0.0304219 +-0.0404175 0.171209 -0.00987004 +0.0299365 0.0350356 0.00770058 +-0.0466417 0.133657 0.014443 +0.0130913 0.0937889 -0.0272955 +-0.0579449 0.059547 -0.000261977 +-0.0285818 0.121272 -0.00825717 +-0.0713326 0.0345571 0.00760774 +-0.0666503 0.135429 0.0440071 +-0.0303959 0.0762676 -0.0335676 +-0.00385838 0.101641 -0.0231016 +-0.0679568 0.13115 -0.00879393 +0.00350598 0.0870278 0.056972 +-0.0248582 0.0752289 0.048914 +-0.0588955 0.0336882 0.0145047 +-0.0563129 0.159837 0.00207063 +-0.064096 0.14766 -0.0219948 +-0.00992774 0.110288 -0.021044 +-0.0709029 0.110786 -0.0101311 +4.37647e-05 0.0392736 0.0324137 +0.0144567 0.0617415 0.0506755 +-0.0304982 0.117934 0.0308066 +-0.0124153 0.129138 0.0195683 +-0.0045458 0.042944 0.0478735 +-0.078629 0.155228 0.0230232 +-0.0793587 0.143462 0.044583 +-0.011946 0.163588 -0.0146751 +-0.0489654 0.138607 0.014392 +0.0130851 0.034266 -0.0137357 +0.0405023 0.0484755 0.0322215 +-0.0440255 0.0336276 -0.0225259 +-0.0185094 0.114097 0.0385959 +-0.0708508 0.173984 -0.0409178 +-0.0698895 0.170875 -0.0319754 +-0.0268752 0.105825 -0.0224483 +-0.0921157 0.118792 0.0303066 +-0.0715954 0.155396 -0.0419127 +0.0239203 0.108291 -0.0147313 +-0.0163998 0.119263 -0.0123023 +-0.0327198 0.0652554 -0.0184496 +0.0457714 0.0848094 0.0151676 +-0.062838 0.15526 0.00677387 +-0.0562712 0.146757 0.030967 +-0.00723161 0.0381024 0.0489495 +0.0208841 0.115302 0.0356376 +-0.0311112 0.162246 -0.0146263 +-0.0185025 0.0757876 0.0552584 +0.0369413 0.0993952 0.0325229 +-0.0597781 0.0668249 0.0348598 +-0.0676678 0.0697151 0.0342008 +-0.00507021 0.128586 -0.00238902 +0.035697 0.096801 0.0360155 +0.0179331 0.121039 -0.00844165 +0.00149286 0.100277 0.0469858 +0.0132581 0.0348304 0.0408908 +-0.0746487 0.0760382 -0.00984365 +-0.076866 0.0994719 0.0363813 +-0.00904748 0.0388121 -0.00544357 +-0.0378518 0.0985762 -0.0221892 +-0.0494929 0.0804959 0.044039 +0.0288964 0.120556 0.0189249 +0.0252898 0.0704815 -0.0246106 +-0.0831283 0.107448 0.000408412 +-0.0465019 0.129507 0.0239285 +-0.056621 0.0562362 0.00665228 +-0.00564116 0.0481924 -0.0303539 +-0.0944779 0.122838 0.0232837 +-0.0876178 0.105003 0.0113725 +0.0221833 0.125827 0.00929485 +-0.0376403 0.0562958 -0.0110081 +-0.027315 0.119916 0.0290701 +0.0347431 0.103404 0.0328426 +0.0317883 0.117354 0.00287906 +0.0203254 0.040014 -0.0146997 +-0.0780017 0.150056 -0.00287894 +-0.0106261 0.0451108 -0.0281505 +-0.0729498 0.156259 0.0191473 +0.0393029 0.10195 0.0270711 +0.0182702 0.0422045 0.0436952 +-0.0802626 0.147413 0.0397079 +-0.00132352 0.0966684 -0.0303753 +-0.015259 0.0984512 0.0471298 +0.0451952 0.0433405 0.023507 +-0.0438866 0.108471 -0.0191595 +-0.0159384 0.124168 -0.00545234 +-0.0654957 0.105611 0.0395613 +-0.0904683 0.135081 0.0142287 +0.025208 0.0874192 -0.0236148 +0.0366057 0.0954909 0.0355184 +-0.0887482 0.102363 0.0163794 +0.00249078 0.115545 0.0403845 +-0.0778809 0.0759658 0.0302027 +-0.045814 0.0898818 -0.0220292 +0.0125705 0.0658518 0.0532694 +-0.00597277 0.130385 0.0204408 +-0.0581881 0.125521 0.0404357 +-0.0307415 0.0374976 -0.017878 +-0.0742647 0.109022 0.03931 +0.0186443 0.123322 -0.00490878 +-0.0769902 0.154182 -0.00989517 +0.0130083 0.0956231 -0.0252421 +0.00953036 0.10442 0.0445691 +0.0186389 0.0520546 0.0461071 +-0.0463977 0.0397105 -0.0152844 +0.0444376 0.0959725 0.0121619 +-0.0216077 0.0350207 0.0511065 +0.0463433 0.054773 -0.00593764 +-0.0875696 0.115156 0.045661 +-0.00311195 0.130927 0.00709886 +-0.0627873 0.0335028 0.00493012 +-0.0894432 0.151569 0.0164701 +-0.0668923 0.109473 -0.0126504 +-0.053788 0.0854855 -0.0214384 +-0.00382944 0.108004 -0.0223654 +-0.0447162 0.0448943 -0.0112435 +0.0262334 0.121101 0.000829633 +0.0206734 0.0795401 0.0510479 +-0.0434655 0.127159 0.0186744 +-0.0273746 0.181651 -0.00921581 +-0.0045009 0.116806 -0.0157814 +-0.0529179 0.162663 -0.000927718 +0.0278575 0.109692 -0.0122334 +0.0114621 0.125412 0.0310862 +-0.055877 0.0984248 -0.0207921 +-0.0649536 0.0595166 0.0136311 +-0.0899789 0.116378 0.0441376 +-0.0344621 0.154617 -0.00886992 +-0.0641249 0.156393 -0.0431197 +0.0264267 0.0824949 -0.0235141 +-0.0699148 0.109401 -0.011164 +-0.0645122 0.0398643 -0.00676714 +-0.0927009 0.117475 0.0353038 +0.00812049 0.107282 -0.0201059 +0.0344124 0.0957227 -0.013333 +-0.0617126 0.170956 -0.0545977 +-0.0888439 0.150092 0.0112242 +-0.0600859 0.0421217 0.0440266 +-0.0535039 0.0805657 0.0446207 +0.00913683 0.0873343 0.0554698 +0.0318118 0.100781 0.0373962 +-0.0366211 0.124122 -0.00724685 +0.0255511 0.0463382 0.0384325 +-0.00473212 0.0386351 0.0247855 +-0.0857334 0.153425 0.016223 +3.04988e-05 0.11432 -0.019028 +-0.0622192 0.17721 -0.0606003 +-0.00533435 0.0930519 -0.0346806 +-0.0578363 0.0912193 -0.0212351 +-0.051575 0.132941 -0.0025104 +-0.0215094 0.0983521 -0.0242621 +-0.0663625 0.141125 0.0427387 +0.0411659 0.0952708 0.0280268 +-0.053497 0.0945663 0.0438533 +-0.0745177 0.171112 -0.0322615 +-0.0779361 0.129573 -0.00656407 +-0.0437814 0.0840812 -0.0212189 +0.00326914 0.0682665 -0.0330635 +-0.0739332 0.177709 -0.0464055 +0.0528574 0.0622185 0.0288955 +-0.0365021 0.101484 0.0413625 +-0.0445836 0.0476428 -0.0105653 +-0.0194973 0.101611 0.0435898 +-0.0137239 0.16215 -0.0118322 +-0.0287184 0.0806953 0.0455388 +-0.0933646 0.117392 0.0153085 +-0.0867701 0.113047 0.00428618 +-0.0052769 0.0941788 -0.0338289 +0.0134806 0.0976663 0.0482444 +-0.08743 0.111796 0.0214228 +0.00133097 0.0626915 -0.0339607 +0.0447988 0.0903457 0.000177034 +0.00183354 0.10009 0.0472603 +-0.0323685 0.0497273 -0.0163483 +-0.0848994 0.144621 0.00617242 +-0.0707871 0.0625817 0.00788057 +-0.0334706 0.0589721 0.0386927 +0.0458044 0.0834139 0.0161713 +-0.0638595 0.159101 -0.0532849 +-0.0169095 0.0379753 -0.0273392 +-0.0683614 0.15578 0.00913576 +-0.0841262 0.110345 0.0263651 +-0.0629048 0.1054 -0.0169977 +-0.00482937 0.038542 0.00854039 +0.00442082 0.039258 0.029719 +0.0287437 0.0416628 0.0306503 +-0.0480218 0.144366 0.00442748 +-0.0718881 0.109321 -0.0102252 +-0.0623027 0.153756 -0.0145815 +0.0312054 0.104936 -0.0131412 +-0.0502712 0.143189 0.0133798 +-0.0679015 0.120916 -0.00896008 +-0.0325574 0.126601 0.00788172 +0.00400981 0.0391328 0.0279405 +-0.0790033 0.16525 -0.0329555 +-0.0464892 0.117969 0.0304809 +-0.0171987 0.127433 0.00332106 +-0.0589607 0.145338 0.0340833 +-0.00576935 0.0346302 0.0443351 +-0.0894143 0.118584 0.00330542 +-0.0494955 0.0890237 0.0451636 +-0.0395958 0.118487 -0.0133369 +0.0256371 0.0346096 0.00722464 +0.0101261 0.0846794 0.0551401 +-0.000640169 0.0481947 -0.0300913 +0.00652044 0.0799801 0.0556018 +-0.0485004 0.157854 0.0090451 +-0.0674788 0.153589 0.0328337 +-0.0246191 0.0436702 -0.0286423 +-0.0380903 0.041957 -0.0274154 +-0.0592055 0.155872 0.0109493 +-0.0158317 0.0382446 0.00839116 +-0.0862834 0.141953 0.0402325 +-0.0178783 0.0381567 0.0189161 +-0.00165332 0.0511407 -0.0309868 +-0.0515122 0.0598238 0.030703 +0.0226361 0.118891 -0.00814073 +0.0433138 0.0902166 -0.00378785 +-0.0339799 0.0384942 -0.0120095 +-0.0424937 0.0748068 0.0427898 +-0.0640892 0.172567 -0.049571 +0.037431 0.0794424 0.0366005 +0.041759 0.0432404 0.0265421 +-0.0923571 0.121517 0.0426088 +0.0562687 0.0726263 0.0113628 +0.024692 0.100819 0.0429025 +-0.0729148 0.110726 -0.0089954 +-0.0295018 0.159581 0.00108834 +-0.0672997 0.0435653 0.00884843 +0.0172829 0.0651656 -0.0289948 +-0.0585687 0.0340745 0.0248573 +0.0320945 0.113613 -0.00441584 +-0.0726455 0.0655594 0.00286688 +0.0223162 0.0649555 -0.0263733 +-0.0636659 0.0691264 -0.011804 +-0.0495225 0.143222 0.00950726 +-0.0396922 0.156587 0.00568688 +0.00749975 0.089676 0.055015 +0.0495971 0.0465817 0.0239661 +-0.0390578 0.156263 -0.0100859 +-0.0708823 0.172457 -0.0366471 +0.0126883 0.0343606 -0.00448368 +-0.0454899 0.0690197 0.0407796 +-0.0413446 0.0335325 -0.0237744 +-0.0404379 0.124957 -0.00812413 +0.0440209 0.0945174 0.0011806 +-0.0627245 0.073729 -0.0165415 +-0.0286056 0.0475856 -0.0255224 +-0.0495036 0.153584 0.0107879 +-0.0896132 0.139307 0.0341845 +0.030074 0.119769 0.00796635 +-0.0517393 0.0517191 0.022632 +-0.023961 0.0723529 0.0481115 +-0.0309909 0.0384268 -0.00579914 +-0.00634516 0.0379873 -0.0153566 +-0.0547761 0.0333427 -0.00414144 +0.00202824 0.108029 -0.0204102 +0.0450661 0.0761937 0.0228711 +-0.084679 0.0869987 0.027663 +-0.0219636 0.0681726 0.0490783 +0.0226059 0.0375679 0.034289 +-0.0518654 0.101358 -0.0214215 +-0.0919525 0.126983 0.0392569 +-0.0663498 0.172859 -0.0450539 +0.00551307 0.0856288 0.0568655 +-0.0269831 0.0381412 0.0278748 +0.0430768 0.0411155 0.00329204 +0.0317014 0.117733 0.0199863 +-0.0326228 0.0506668 -0.0115219 +-0.0760639 0.155862 0.0136886 +-0.0581543 0.0337417 0.0181646 +0.0454926 0.0875897 0.015162 +-0.0197923 0.038435 -0.00354579 +-0.0461288 0.15913 -0.00829043 +-0.0235066 0.108523 0.0406075 +0.015525 0.127932 0.00115163 +0.00251501 0.0814623 0.0569927 +-0.0485603 0.131756 0.000870882 +-0.0909462 0.11476 0.0333322 +0.038369 0.0884214 -0.0137726 +0.0179084 0.127905 0.00771503 +0.0457915 0.0862101 0.0121678 +-0.0310416 0.0763051 -0.0325503 +-0.0584963 0.0946188 0.0448266 +-0.00142898 0.112626 -0.0193593 +0.0537506 0.0519895 0.000247391 +-0.00249736 0.0978288 0.0524276 +0.0474285 0.0692644 0.00256538 +-0.0157146 0.17719 -0.0193767 +-0.0688721 0.0369953 0.0119906 +0.0262296 0.0888085 -0.0227773 +-0.0876687 0.0981895 0.00443327 +-0.0435601 0.129686 0.00973169 +-0.0620348 0.146024 -0.00560988 +0.0228232 0.123119 -0.000681491 +0.0192101 0.0791931 -0.0277308 +-0.0285078 0.0348913 0.0463089 +-0.0295006 0.116619 0.032366 +0.00540344 0.040445 -0.0238712 +-0.0861937 0.0819823 0.0184808 +-0.0691313 0.170851 -0.0540166 +0.0232722 0.0691857 -0.0260989 +0.0346775 0.106404 -0.00868031 +-0.0626839 0.154165 0.00249175 +0.0203005 0.047637 0.041402 +0.0426083 0.0915862 -0.00481093 +-0.00121535 0.0394284 0.0356173 +-0.0290126 0.0606872 -0.0244213 +-0.0522249 0.152155 0.0138449 +0.0278367 0.0781921 0.0455692 +-0.0782715 0.168666 -0.0333616 +-0.0631194 0.0357147 0.0189543 +0.00237959 0.0976208 -0.0273765 +-0.0327796 0.0736593 -0.0265049 +-0.0590695 0.143884 0.0338908 +-0.0366032 0.0407784 -0.0289892 +-0.0564911 0.0400264 0.0468768 +-0.0891224 0.133627 0.00423095 +-0.00349883 0.095211 0.054715 +-0.0365564 0.0488017 -0.0133944 +-0.063603 0.0406323 0.0405017 +0.00388987 0.0987683 0.0495103 +-0.0341448 0.166698 -0.0152744 +0.0422984 0.0789118 -0.00576754 +-0.0821777 0.153468 0.0263012 +-0.0618022 0.0852922 -0.0192956 +-0.0825795 0.0937805 -0.00656944 +0.0526059 0.0476644 0.00422036 +-0.0617323 0.155315 -0.018581 +-0.0646798 0.158592 -0.0555006 +-0.0400438 0.127998 0.000725921 +-0.020826 0.0882193 -0.0372663 +-0.072774 0.083565 -0.0157894 +-0.0301375 0.0592681 -0.0204197 +0.053852 0.0700236 0.0237561 +-0.0192952 0.097132 0.0469462 +-0.0379042 0.0350553 0.0424096 +-0.0779467 0.170107 -0.0351609 +-0.0731753 0.162423 -0.0379582 +0.0293531 0.117442 -0.00254348 +0.00923639 0.0753581 -0.0333366 +-0.00523048 0.0381888 0.0482681 +0.0281109 0.0477624 0.0368744 +-0.00549683 0.095262 0.0547887 +0.016279 0.127286 0.0242335 +-0.000357095 0.0346671 0.0418309 +-0.0903031 0.113239 0.0103302 +-0.0435085 0.165227 0.00470373 +-0.000629686 0.0466337 -0.0288231 +-0.00267903 0.0583624 -0.0332032 +-0.0354553 0.163829 -0.00227816 +0.0329891 0.10525 -0.0114692 +-0.0511234 0.159083 -0.0045978 +-0.0738697 0.0672451 0.0209913 +-0.0513379 0.0345855 0.00988953 +0.0449495 0.041538 0.0177108 +0.0131716 0.128382 0.0245166 +-0.0119302 0.0975527 -0.0293786 +-0.0796395 0.11488 0.0476725 +-0.00554666 0.0429634 0.0481135 +0.0336755 0.115893 0.0150272 +-0.0865455 0.109036 0.0123603 +-0.0583287 0.0597422 0.0219213 +0.00142185 0.0361564 -0.0243567 +-0.0249379 0.182957 -0.0150514 +-0.00456935 0.0511652 -0.031379 +0.00983853 0.130485 0.0204326 +-0.020719 0.0739658 0.0533053 +-0.0922608 0.117447 0.0323019 +-0.0687753 0.15954 -0.0529632 +0.00943169 0.130854 0.0188531 +-0.0463671 0.133058 0.0160254 +0.0403868 0.0966272 0.0286723 +-0.0374342 0.125294 0.0223398 +-0.0254349 0.121225 -0.00822483 +-0.0287913 0.121291 0.025511 +-0.0275751 0.181449 -0.0130337 +-0.0292637 0.0364551 -0.0300736 +0.0333063 0.076755 -0.0177777 +-0.00838403 0.100228 -0.0241757 +-0.0917675 0.126924 0.040336 +0.0460105 0.0848241 0.0111686 +-0.0458316 0.03478 0.00723173 +0.0337176 0.0655129 -0.0167917 +-0.0900318 0.128311 0.0429434 +0.00340705 0.0404653 -0.0241388 +-0.0445167 0.0334752 0.00325528 +-0.0417025 0.170926 -0.000183345 +-0.0667272 0.0750614 -0.0156487 +-0.075008 0.0665773 0.0124915 +-0.0256788 0.0387085 -0.0161237 +0.0433708 0.0459415 -0.00338184 +-0.0333944 0.0420411 -0.0295771 +-0.0366574 0.173333 -0.0118804 +0.0279341 0.0376089 0.0251213 +-0.0591944 0.0589798 0.00447595 +-0.0117173 0.0642717 -0.0365887 +0.0284258 0.044601 -0.00619231 +0.0407559 0.0844033 -0.0107694 +-0.0149445 0.0386028 -0.00457425 +-0.0666364 0.150881 -0.0385507 +-0.0441588 0.156514 0.00623469 +-0.0338796 0.174703 -0.0134692 +-0.0700283 0.075334 0.0376711 +-0.0144851 0.120961 0.0347298 +-0.0394983 0.0690894 0.041721 +-0.0820593 0.0748753 0.013529 +-0.0262192 0.162456 -0.00472466 +-0.0573804 0.151726 0.0319973 +0.0238729 0.0463312 0.0395213 +-0.00887703 0.0985896 0.0509585 +-0.00180856 0.0881831 -0.0355551 +-0.0435257 0.128183 0.0171556 +-0.0137851 0.096091 -0.0318323 +-0.0776083 0.0770893 -0.00760024 +0.0515137 0.0637653 0.0289012 +0.0459041 0.087617 0.00917007 +-0.0946685 0.124165 0.0192665 +-0.0424078 0.0392874 -0.0253255 +0.0574465 0.0566575 0.0231489 +-0.0705315 0.0915903 0.0419348 +-0.062769 0.175495 -0.0615699 +-0.0614063 0.0419532 -0.0067475 +0.0222874 0.0635154 -0.025946 +-0.0325454 0.0624467 -0.016419 +0.0406665 0.105637 0.00516291 +0.00508145 0.125851 -0.00757191 +-0.0743566 0.148587 -0.0198592 +0.028537 0.0506236 0.0375191 +0.00550651 0.0897139 0.0554063 +-0.0165465 0.061194 0.0523676 +-0.0548344 0.113627 -0.016162 +-0.078421 0.120421 0.0514142 +0.0224472 0.0375897 0.0352799 +-0.0558038 0.116914 0.0367748 +0.0399293 0.104183 0.0231644 +0.00793957 0.0368635 -0.0077325 +-0.053287 0.119647 -0.012449 +0.0226022 0.1018 -0.0197774 +-0.0735157 0.102656 0.0375574 +-0.0544964 0.10974 0.0378742 +-0.0351154 0.127437 0.0128308 +-0.0759568 0.136911 -0.00615991 +-0.0228623 0.06956 0.0485197 +-0.00937118 0.0387712 0.0309279 +-0.0858362 0.103636 0.0243714 +-0.0777036 0.174395 -0.0426027 +0.0605358 0.0664822 0.0111446 +-0.0456637 0.0382067 -0.0202858 +-0.0494922 0.0833478 0.0446801 +-0.0717916 0.0893503 -0.0160567 +-0.0654224 0.156324 0.0217941 +0.0104303 0.128801 -0.000781749 +-0.0640931 0.122778 0.0478095 +0.012373 0.0343732 -0.00643255 +-0.00549358 0.0898053 0.0568842 +-0.0544984 0.0973596 0.0432594 +-0.0430782 0.154691 -0.00814248 +-0.058643 0.155634 0.0155202 +-0.0309118 0.10664 -0.0209245 +-0.0117675 0.0728437 -0.0380964 +-0.0685186 0.1456 0.0424246 +0.0168366 0.113017 -0.0157876 +-0.0567451 0.0768007 -0.0192338 +-0.0905785 0.121592 0.0451008 +-0.0564995 0.0889847 0.0448198 +-0.062649 0.164698 -0.0365908 +-0.0414211 0.0344456 0.0316667 +0.0235849 0.102638 -0.0186769 +0.0208761 0.115613 -0.0126037 +0.00135548 0.0496637 -0.030356 +0.0172645 0.0713208 0.051333 +0.0277553 0.0619298 0.0435605 +-0.0388696 0.105647 -0.0202518 +0.002402 0.041908 -0.0243037 +-0.00348806 0.11693 0.0398821 +-0.094215 0.120106 0.0172864 +-0.075338 0.161792 -0.0134783 +-0.0313944 0.0721215 -0.0285061 +-0.076236 0.178558 -0.0487103 +-0.0516597 0.0416063 0.0458402 +-0.0191702 0.169734 -0.0206461 +-0.0458479 0.0999438 -0.0215809 +-0.0608063 0.0939347 -0.0190005 +-0.0831639 0.108847 0.00132792 +0.0449523 0.0945963 0.00616781 +-0.089716 0.139255 0.0241831 +-0.0241715 0.165363 -0.00880477 +-0.0808978 0.121685 0.0496566 +-0.0776757 0.0873848 0.0375611 +-0.0575877 0.0343902 0.0335477 +0.0293569 0.0808765 0.0442663 +-0.0413959 0.1089 -0.0192706 +-0.0486555 0.0606014 -0.0118523 +-0.0263871 0.06465 -0.0314802 +-0.0479423 0.118344 0.0305757 +0.0368905 0.10997 0.023344 +0.00465961 0.0959425 -0.0295932 +-0.00250198 0.0647948 0.0567081 +0.0155008 0.0345049 -0.00593057 +-0.0414998 0.0944525 0.0421484 +-0.0425159 0.17187 -0.00332083 +-0.00662603 0.045146 -0.0285621 +-0.0728992 0.107873 -0.010241 +0.0162924 0.0680403 -0.0298148 +-0.058126 0.0494622 0.00265482 +-0.049929 0.0335244 -0.00515732 +-0.0592138 0.116352 -0.0129282 +-0.0876027 0.103683 0.0193632 +-0.0661658 0.170967 -0.0590604 +-0.00423283 0.0951855 -0.0328472 +-0.056711 0.153132 0.0293166 +0.0299135 0.0618945 0.0413957 +-0.0754312 0.179188 -0.0498593 +-0.0890756 0.0982905 0.00941744 +-0.0313333 0.114057 -0.0167329 +-0.0336201 0.0505969 -0.0107597 +0.0152428 0.0807565 -0.0298514 +0.000144172 0.129559 0.0255502 +-0.0166332 0.101644 -0.0236856 +0.0112856 0.0666869 -0.0306751 +-0.0719068 0.110755 -0.00961867 +-0.056773 0.082629 -0.0212703 +0.0224949 0.112674 0.0362232 +0.00494458 0.0356784 0.0456125 +-0.0401622 0.123949 0.0243503 +-0.0494029 0.0516267 0.0356191 +-0.000148869 0.0998138 -0.0237113 +-0.0494252 0.12902 -0.00225187 +-0.0351127 0.162221 -0.0139882 +-0.0801061 0.109977 -0.00253557 +-0.0583279 0.116979 0.0383609 +0.0214316 0.0768422 0.0503677 +-0.0637593 0.0357681 0.0182478 +-0.0679574 0.176267 -0.0485208 +-0.0466544 0.0636155 -0.0134601 +-0.018198 0.0896163 -0.0372798 +-0.0675078 0.167827 -0.0267933 +-0.0891218 0.136568 0.0391914 +-0.00634438 0.0961732 -0.0318818 +-0.0509131 0.144221 0.000402933 +0.020479 0.0822082 0.0508036 +0.0382522 0.0617095 -0.0097618 +0.0414447 0.0957847 0.0271584 +0.0495191 0.0624602 0.0299628 +-0.0525648 0.0515684 -0.00660684 +-0.0507038 0.0543653 0.0186143 +-0.0678764 0.117979 -0.00873338 +-0.0833731 0.0803286 0.00149951 +-0.0102345 0.169322 -0.0249254 +0.0161585 0.128774 0.0170439 +-0.0495011 0.0439447 0.0438293 +-0.0308936 0.0901442 -0.0248987 +-0.0380826 0.159224 -0.0120325 +-0.0684954 0.121776 0.0527683 +-0.0237994 0.178657 -0.0117033 +0.022476 0.125337 0.020807 +-0.0131867 0.0392232 0.050872 +-0.0828365 0.116201 -0.00217327 +-0.0792107 0.0760132 0.0281283 +-0.0418712 0.105657 -0.0205306 +-0.0265289 0.11806 0.03154 +-0.0485021 0.104259 0.0404773 +-0.0515007 0.164119 0.00202375 +-0.0628742 0.175671 -0.0555946 +-0.0385777 0.1595 0.00203018 +-0.0410438 0.162368 0.00371458 +-0.0683486 0.124257 0.0521552 +0.0311264 0.0469699 -0.00653546 +-0.0346775 0.127387 0.0115177 +0.0256926 0.105619 -0.0158649 +-0.0656817 0.0705232 -0.0118151 +-0.0889612 0.111861 0.0183359 +-0.027486 0.0646029 0.0384895 +0.0307322 0.108762 0.0340805 +-0.0647018 0.172123 -0.0473675 +-0.0914367 0.114681 0.021315 +-0.00481581 0.0882239 -0.0361964 +-0.0229882 0.0386094 0.0318708 +-0.0164825 0.0530314 0.0497852 +0.031763 0.0653471 -0.018741 +0.0313568 0.052068 0.0363454 +-0.0937998 0.118753 0.0153042 +-0.0460733 0.0336746 -0.01741 +0.00639772 0.0911374 -0.0325899 +-0.0665077 0.105605 0.0392145 +-0.037944 0.165312 0.00115508 +-0.0447719 0.0826286 -0.0206706 +0.015216 0.0849668 -0.0295884 +-0.00949197 0.121025 0.0361236 +-0.0728889 0.159628 -0.0359308 +-0.0212527 0.0696869 0.051144 +-0.0609844 0.0646638 0.031213 +-0.0787829 0.0926997 0.035689 +0.0098313 0.0644618 0.0545535 +-0.0435636 0.0476726 -0.0110362 +0.00292266 0.0383702 -0.00263564 +-0.0294982 0.0674485 0.03887 +-0.0594483 0.0590098 0.0188119 +-0.0331272 0.0335545 -0.0277881 +-0.0654135 0.17638 -0.0519366 +0.0381247 0.0827831 -0.0147803 +0.0274189 0.0834776 -0.02246 +-0.0754296 0.152593 -0.0138871 +-0.0626337 0.149615 -0.00617193 +0.0395378 0.100622 0.0273876 +-0.00317446 0.0951663 -0.0328247 +0.0284436 0.0721192 -0.0227379 +0.0256796 0.0353829 0.0212256 +-0.0100479 0.0388486 -0.00567581 +-0.0815042 0.149744 0.0353513 +0.0569923 0.0508892 0.0171854 +-0.0844404 0.100576 0.0283951 +-0.066663 0.0704664 -0.0109078 +0.011503 0.108488 0.0403225 +0.0346003 0.059954 -0.013776 +-0.00350072 0.0828956 0.0574459 +-0.0308908 0.0524482 -0.0143777 +0.0220365 0.0430228 -0.0147268 +-0.0499219 0.0558508 0.0334877 +-0.0315001 0.070354 0.040029 +0.0121741 0.0780107 0.0545179 +-0.040483 0.0423569 0.0419938 +-0.0438782 0.0343145 0.0294954 +-0.0243712 0.122748 0.0255975 +-0.013279 0.101966 -0.0239644 +-0.0635872 0.0445618 0.0346899 +-0.09116 0.146144 0.0251605 +0.0191385 0.125192 -0.000918824 +0.0439709 0.0776452 -0.00278508 +-0.034376 0.0448305 0.0451875 +-0.0292764 0.0508797 -0.0213979 +-0.0586802 0.148237 0.034554 +-0.0830867 0.0803012 0.027553 +0.0470243 0.0458757 -0.000608958 +-0.0124544 0.125711 -0.00519106 +-0.0316347 0.0511137 -0.0133654 +-0.0495769 0.126877 0.0317874 +0.0446953 0.0861142 -0.000824781 +-0.0164935 0.0744329 0.0555937 +-0.07397 0.135486 -0.00709777 +-0.0388049 0.0885478 -0.0231132 +-0.0738057 0.149865 -0.0338746 +-0.0612039 0.0347997 0.0427656 +-0.0248108 0.064983 0.0421327 +-0.0374965 0.120729 0.0294163 +-0.0773599 0.0940895 0.0370488 +-0.0221316 0.122996 0.0264112 +-0.0656835 0.180548 -0.0590311 +-0.0654403 0.114174 0.0440564 +-0.0576422 0.035457 -0.0105994 +0.0063341 0.0539359 -0.0303914 +-0.0624964 0.108382 0.0385383 +0.000507196 0.0474213 0.049671 +-0.0768403 0.0682209 0.0124564 +-0.0177152 0.0613627 -0.0358053 +-0.0708829 0.156323 0.0169624 +-0.0801272 0.0895173 -0.00861746 +-0.0681398 0.156014 0.0252192 +-0.0643944 0.0418449 0.0286723 +-0.0223108 0.122995 -0.00618559 +-0.0332179 0.0347336 0.0278325 +-0.0494838 0.129682 0.0301574 +-0.0874269 0.111566 0.0378689 +0.0078939 0.0373631 -0.01008 +-0.0556091 0.0372359 0.0469697 +-0.0495471 0.140136 0.00640196 +-0.0721891 0.0696552 -0.00460695 +-0.0645108 0.135348 0.0400634 +-0.00963836 0.0466527 -0.0295963 +-0.00450177 0.0856564 0.0572774 +-0.0726963 0.163825 -0.0409661 +-0.0831522 0.148677 0.0355101 +-0.0045943 0.109577 -0.0220661 +-0.0700292 0.14319 -0.0126949 +0.0170086 0.0672594 0.0509139 +-0.0184932 0.0842766 0.0574008 +0.0333985 0.0809938 -0.0187374 +-0.00658339 0.116828 -0.0157946 +-0.0830307 0.110356 0.0344756 +-0.0164574 0.11955 0.0353527 +-0.0437556 0.0335262 -0.0205177 +-0.0196754 0.180147 -0.0162801 +0.00748686 0.0427091 0.0452774 +0.047238 0.0525837 0.0312359 +-0.00150012 0.0842876 0.0575029 +-0.0647611 0.154265 0.00245101 +0.0385227 0.108358 0.00315989 +0.00616601 0.0343841 0.0199712 +0.0190967 0.127602 0.0138576 +0.0232916 0.104676 0.0408599 +-0.0209519 0.121676 -0.0087885 +-0.000475449 0.077417 0.0583222 +-0.0340577 0.0344858 -0.0194842 +-0.0449113 0.0342791 0.0293115 +-0.02963 0.125357 0.0045818 +-0.0442513 0.120873 0.0273959 +0.0233607 0.0713858 0.0478141 +0.0294074 0.0974659 -0.0171759 +-0.0251322 0.110719 -0.0192347 +-0.0168318 0.0883012 -0.0380546 +-0.0537516 0.078251 -0.0196488 +-0.0617185 0.155298 -0.026582 +0.0182327 0.0369462 -0.015679 +0.0204347 0.103384 0.043762 +-0.0271652 0.177189 -0.00775302 +-0.078183 0.161072 -0.0259393 +-0.000994284 0.0346324 -0.0168306 +-0.0369077 0.0407733 0.0449918 +-0.0117377 0.0685356 -0.0370961 +-0.0520176 0.136681 0.0271356 +-0.0244827 0.044849 0.0526821 +0.0122811 0.0490196 0.0473922 +-0.0310488 0.126128 0.0128475 +-0.0612252 0.0618413 0.0248018 +0.0110023 0.0872551 0.0546654 +0.0137177 0.0926941 0.0515916 +-0.050909 0.135812 0.0260882 +-0.0514988 0.090386 0.0447021 +-0.0776802 0.121779 0.0520726 +-0.0435045 0.0492094 0.0395536 +0.0427867 0.0445146 0.027427 +-0.0124587 0.0716774 0.0554083 +-0.0903482 0.115904 0.00630147 +-0.0676703 0.159658 -0.00956407 +-0.0534975 0.100135 0.0423919 +0.0299608 0.102103 0.0382304 +-0.0275896 0.0398384 -0.0294326 +-0.0354902 0.0576195 0.0391492 +-0.0365293 0.120277 -0.0112077 +0.000101878 0.111584 -0.0199068 +-0.0568115 0.11798 -0.012657 +-0.0134078 0.0383017 0.0160824 +-0.078485 0.131655 0.0526796 +-0.0630792 0.17626 -0.0613621 +0.00219436 0.0880897 -0.0340427 +-0.00664745 0.0511524 -0.0316637 +-0.0221856 0.122325 -0.00745001 +0.0517581 0.0684217 0.00143507 +-0.0206221 0.0450432 -0.0278804 +-0.0187788 0.181486 -0.0239544 +-0.0435029 0.119128 -0.0140097 +-0.0368374 0.0957548 -0.023046 +0.0360094 0.105316 -0.00780471 +-0.0310017 0.0339922 0.010953 +0.0468601 0.0467385 0.0270828 +-0.0800669 0.107282 -0.00460113 +0.0161405 0.0847501 0.0515574 +-0.0726437 0.152619 -0.0388965 +-0.030372 0.124909 0.019004 +-0.0532086 0.0387959 0.0470712 +-0.00947284 0.0717726 0.0568611 +-0.0417517 0.0449058 -0.0193246 +-0.0324319 0.159505 0.00208324 +-0.064273 0.0404086 0.0266782 +-0.0456914 0.0665681 -0.0150523 +-0.0317955 0.0901023 -0.0248195 +-0.0901544 0.148798 0.0121684 +-0.0448181 0.0898814 -0.0220536 +-0.00651 0.0385696 0.00453582 +-0.0505409 0.146308 0.012527 +-0.0736443 0.148637 -0.0247496 +0.0362923 0.0826461 -0.0167222 +-0.0582688 0.0380855 0.0465946 +0.0420736 0.0957824 -0.00279849 +0.059075 0.0677442 0.0201625 +-0.0118076 0.166362 -0.0213381 +-0.0293882 0.0593157 -0.02241 +-0.00750084 0.0688979 0.0559719 +-0.0834808 0.0763288 0.0055122 +0.0455463 0.0847945 0.0181695 +-0.0853379 0.139291 0.0436042 +-0.0127384 0.0714338 -0.0383051 +0.0288553 0.119043 0.000370228 +0.0382387 0.108322 0.00216703 +-0.0854254 0.147285 0.0350057 +-0.0290239 0.0918566 -0.0266024 +-0.089435 0.0996945 0.016394 +-0.0250572 0.0379934 0.0230062 +-0.0659224 0.108105 -0.0137141 +-0.0197383 0.064191 -0.0362126 +0.0332406 0.0828224 -0.0189128 +-0.050463 0.0627793 0.0338697 +-0.00332118 0.0928352 -0.0344367 +-0.0351624 0.0344214 0.0133327 +0.0337894 0.103744 -0.0118635 +-0.0685313 0.0435239 0.00368786 +-0.0915175 0.140609 0.0191776 +-0.0763247 0.0679089 0.0110614 +-0.0293662 0.0904135 -0.0285737 +-0.0268485 0.0931277 -0.028596 +-0.0493167 0.137038 0.00442458 +-0.0607789 0.121227 0.0419471 +-0.0167795 0.0984818 0.0458118 +-0.0218018 0.0947992 -0.0305488 +-0.0933659 0.118725 0.0133024 +-0.0263107 0.0780916 0.0488984 +-0.0689525 0.144454 -0.0174142 +-0.0698503 0.0980241 -0.015524 +0.0377251 0.0602627 -0.00973714 +-0.0616079 0.160003 -0.0285892 +-0.00362249 0.0451016 -0.0279234 +-0.0658161 0.0866791 -0.018673 +-0.0898976 0.132262 0.00523931 +-0.014426 0.0383347 0.0104075 +-0.0891789 0.14342 0.0311627 +-0.0516305 0.0633366 -0.0105425 +0.0421385 0.102872 0.00916356 +-0.073056 0.163825 -0.0399663 +0.0142799 0.0695538 -0.0310885 +-0.0191804 0.172724 -0.0156293 +-0.0111853 0.109046 -0.0214904 +-6.48961e-05 0.130222 0.00105503 +-0.037907 0.0368934 -0.0113278 +-0.0778791 0.116346 -0.00545689 +-0.0353032 0.042242 0.0460623 +-0.0732356 0.176411 -0.0530886 +0.0601048 0.0608967 0.00715985 +-0.052965 0.0595916 0.0265588 +-0.0564973 0.0762116 0.0428205 +-0.034872 0.104274 -0.0209307 +-0.058681 0.0336414 -0.0106847 +-0.082997 0.0883523 -0.00560613 +-0.0901456 0.140633 0.0231701 +0.059772 0.0594746 0.00715469 +0.0315129 0.0439606 0.0299133 +-0.0749354 0.108383 0.0378851 +-0.0718123 0.0950995 -0.0154446 +-0.017311 0.117579 -0.0145168 +-0.0492219 0.145089 -9.42983e-05 +-0.0492467 0.0335224 -0.00684693 +-0.077013 0.157587 -0.0116646 +-0.0395098 0.12077 0.029092 +-0.0676415 0.155906 0.0108585 +-0.0115046 0.0688083 0.054897 +0.00350877 0.068881 0.0557692 +-0.00832726 0.0349131 -0.024554 +0.00623924 0.0754282 -0.0343629 +-0.0601994 0.14968 0.0358889 +-0.0681006 0.0726203 0.0368546 +-0.0550659 0.154073 0.0197239 +0.0220423 0.0388246 -0.00567731 +-0.050633 0.0633988 -0.0111763 +0.0262673 0.0718723 -0.0242084 +0.00651709 0.084208 0.0565081 +-0.0508195 0.0927229 -0.0217389 +-0.0823617 0.110377 0.0328225 +-0.0443307 0.0345511 0.0362271 +-0.0664541 0.159015 -0.0105538 +-0.065725 0.180452 -0.0578644 +-0.00729397 0.0383333 0.0172997 +-0.083856 0.108875 0.00233606 +-0.0531754 0.160014 0.00733632 +-0.0617546 0.0335347 0.00511487 +-0.0436843 0.0666417 -0.0153695 +-0.0475053 0.16079 0.00736091 +0.0213151 0.0393899 0.0411211 +-0.0126085 0.0434839 -0.0264186 +-0.058072 0.135467 -0.00577889 +-0.0144744 0.0573903 0.0514423 +-0.0480757 0.15465 -0.00633475 +-0.0214326 0.158913 -0.0108411 +0.0317035 0.0927362 -0.0181479 +0.0258633 0.0505634 0.0389033 +-0.0916556 0.116096 0.0323166 +-0.0344737 0.0973629 0.0436701 +-0.0772898 0.158355 -0.013903 +0.00252455 0.078679 0.0567626 +-0.0768599 0.0852186 -0.0125783 +0.00638417 0.060281 0.0547831 +0.00351108 0.067509 0.0559028 +-0.0775506 0.172738 -0.0395384 +-0.0941076 0.120125 0.0222927 +0.0397169 0.0400457 0.0217023 +-0.00993012 0.125562 -0.00707028 +0.0207467 0.0387687 0.0412277 +-0.0770466 0.0947961 -0.0125384 +-0.0208658 0.163381 -0.0161046 +-0.0194871 0.0786419 0.0560662 +-0.00848562 0.0978428 0.0521021 +-0.00195749 0.0369571 0.00873581 +-0.0554658 0.14959 0.0286413 +-0.0613355 0.171315 -0.0617342 +-0.0405058 0.060576 0.0408455 +-0.019245 0.0381493 0.0168345 +0.0318352 0.0959581 -0.0155753 +-0.0894336 0.0956291 0.0144221 +-0.0562826 0.138192 -0.0042334 +-0.0587859 0.118384 0.0394982 +0.0557398 0.0577143 0.000186064 +0.021293 0.0347861 0.0208687 +-0.0521809 0.0564969 0.0230721 +-0.088994 0.140671 0.0361625 +-0.0626529 0.0336856 0.0101657 +-0.0346997 0.0808739 -0.0236048 +-0.0740754 0.0791322 0.0370556 +0.0424523 0.0958497 0.0251568 +0.0156501 0.129207 0.0125793 +-0.0758074 0.0766216 0.033593 +-0.053977 0.0335099 0.00491422 +-0.049617 0.115589 0.0334474 +-0.0151821 0.115592 -0.0164315 +0.0198002 0.113601 -0.0144182 +-0.0297803 0.0833036 -0.0335871 +-0.0888224 0.0929368 0.0224135 +-0.0255078 0.162179 -0.0150106 +-0.0468796 0.105628 -0.0200508 +0.0328144 0.0654355 -0.0177831 +0.0401246 0.0657991 0.0315825 +-0.0619246 0.161563 -0.0295917 +-0.0336612 0.0423072 0.0487868 +-0.0806782 0.140364 -0.00279029 +-0.0575747 0.034031 0.0251021 +-0.00250061 0.0856648 0.0572816 +-0.051497 0.0776631 0.0434639 +-0.0314085 0.177247 -0.00418119 +-0.0382796 0.035429 0.0243806 +-0.0273926 0.0381858 0.00428469 +-0.0590133 0.128179 -0.00718347 +-0.059761 0.058524 0.00837605 +-0.089717 0.142036 0.0301646 +-0.0708787 0.0634588 0.0196178 +0.017237 0.0368135 -0.0176915 +0.0283981 0.0848865 0.0446615 +0.042292 0.0669509 0.0276386 +-0.0400442 0.15362 -0.00816685 +-0.0666868 0.15458 -0.000433214 +0.00520355 0.0894816 -0.0332282 +-0.0438381 0.033833 0.0263899 +-0.0863798 0.100827 0.00341316 +-0.0560788 0.154579 -0.00133297 +-0.0130807 0.0387897 0.0319484 +0.0526374 0.0710929 0.00470311 +0.0114966 0.0923286 0.0527326 +-0.0637555 0.0336685 -0.00625178 +-0.0475689 0.0432884 -0.0109341 +-0.0725775 0.0367142 0.00725292 +-0.0374892 0.112529 0.0350998 +0.0350676 0.0395586 0.0248293 +-0.031508 0.0675059 0.0394967 +0.0422807 0.0831292 -0.00677447 +-0.0617624 0.0810326 -0.0192317 +-0.0601798 0.155861 0.0135147 +-0.0160151 0.185636 -0.0207096 +-0.0495589 0.141679 0.00640064 +0.0451001 0.0791381 0.000209359 +-0.00648871 0.115533 0.0401374 +-0.0179936 0.034905 0.0502652 +-0.0345243 0.0619374 0.0399691 +0.0253647 0.107408 0.0385761 +0.0241683 0.0795725 0.0490812 +-0.076883 0.154198 -0.00789596 +-0.022619 0.0436731 -0.0285417 +0.0302544 0.115002 0.0294335 +-0.0112354 0.0407042 0.0501624 +-0.0374964 0.118015 0.0312717 +-0.0264155 0.169752 -0.0102811 +-0.0325172 0.115309 0.0332233 +-0.0883434 0.0968836 0.00640652 +-0.0074894 0.104457 0.0437929 +-0.0122029 0.0391189 0.0354325 +0.0605626 0.0609358 0.0161739 +-0.0291057 0.0349617 0.0478282 +-0.00632683 0.0367419 -0.0160833 +0.0422139 0.06433 -0.00247442 +-0.0834639 0.0815548 0.0279962 +-0.091428 0.113787 0.018961 +-0.0164849 0.0911174 0.0558291 +-0.0521483 0.153554 0.0122178 +0.0344074 0.0446243 -0.00536213 +-0.09232 0.126938 0.0302595 +-0.0718881 0.12088 -0.00850233 +-0.0769692 0.155214 0.0250641 +-0.0847077 0.140411 0.00224002 +-0.0180254 0.171268 -0.0157212 +0.0102822 0.065327 -0.0312772 +-0.0271732 0.171194 -0.0185934 +-0.0475224 0.0587349 0.0366732 +-0.0815066 0.0980245 0.032594 +-0.0287322 0.0335484 -0.0250427 +0.000965074 0.0348235 0.00577003 +-0.0874433 0.114073 0.0447649 +-0.0745611 0.163685 -0.0159572 +-0.0504998 0.0931897 0.044287 +0.00144942 0.127679 0.0289378 +-0.0830551 0.128552 0.0515383 +-0.0537303 0.0473713 0.0135851 +-0.0226958 0.0380494 0.0144148 +-0.0698996 0.147518 -0.0298062 +-0.0374978 0.0833038 0.0438252 +0.0144108 0.118463 -0.013667 +-0.0810085 0.1097 0.0318734 +-0.0883068 0.151437 0.0121831 +0.0014962 0.114186 0.0411808 +-0.0457512 0.0782542 -0.0192962 +-0.0728503 0.107163 0.0374416 +-0.0546426 0.0335759 -0.00981752 +-0.0905935 0.133662 0.00922276 +-0.0777368 0.158322 -0.016916 +0.0333249 0.108715 0.0307644 +-0.0758319 0.0675199 0.00554661 +-0.0608714 0.0385134 0.0195368 +-0.0766234 0.167356 -0.0265012 +0.0324864 0.115764 0.0245556 +-0.051601 0.149349 0.0154046 +-0.0370133 0.1227 0.0269929 +-0.0556554 0.124247 -0.00722427 +-0.0272643 0.118767 -0.0116611 +-0.0284876 0.0660147 0.0384689 +-0.0890493 0.136506 0.0262024 +0.0455252 0.0918117 0.00617298 +-0.0739705 0.110854 0.0450522 +-0.054929 0.0378655 -0.0109689 +-0.0211646 0.0933284 0.0517404 +-0.00865087 0.0496719 -0.030975 +0.0599111 0.0692057 0.0151972 +0.0182222 0.0631608 0.0491228 +-0.0659867 0.134061 -0.00822741 +-0.0533518 0.117447 -0.0141574 +-0.0356207 0.0519761 -0.0103771 +-0.0674828 0.0383816 0.0133921 +-0.0179472 0.0391243 0.0360362 +-0.0353932 0.0352385 0.0143534 +-0.0381912 0.168168 -0.0127822 +0.0242439 0.0994852 0.044008 +-0.0331278 0.165217 -0.0153881 +0.0419441 0.102888 0.00516309 +-0.0744413 0.0833098 0.038687 +-0.0349807 0.177 -0.00919022 +0.00950876 0.0882899 0.055046 +0.0203114 0.0607424 -0.0267183 +-0.00473829 0.0684427 -0.0355801 +-0.0293549 0.0495451 -0.022456 +0.0213555 0.0521216 -0.0251867 +-0.0608025 0.132515 0.0384279 +-0.086306 0.0981081 0.00140707 +0.0124215 0.122685 -0.01021 +0.0534041 0.0547278 -0.00176167 +-0.0725172 0.105485 0.0374705 +-0.0925573 0.125589 0.0382552 +0.023685 0.124697 0.0198268 +0.0381226 0.0574698 -0.00591549 +-0.0358756 0.107103 -0.0202685 +-0.00445554 0.112864 -0.0195829 +-0.00333512 0.125963 -0.00760181 +0.0355639 0.058664 -0.0117324 +-0.0752743 0.171989 -0.0354168 +0.0264872 0.122262 0.00520712 +-0.0911855 0.114622 0.00933636 +-0.0888501 0.102361 0.0153809 +0.0303343 0.0358493 0.0181065 +0.0388945 0.108364 0.0171641 +0.0444906 0.0861036 -0.00180248 +-0.00457845 0.0388805 0.0300129 +-0.0689372 0.126774 -0.00892675 +0.0352594 0.113795 0.0141522 +0.0379749 0.0374097 0.0109015 +0.00640925 0.0404248 -0.023654 +-0.0569156 0.112617 -0.0162683 +-0.0161127 0.0388433 -0.0124778 +-0.0568734 0.0358081 0.0462717 +-0.0852004 0.111887 0.0434561 +-0.0393334 0.174116 -0.00798067 +-0.0335527 0.156609 0.00223348 +-0.06623 0.13826 0.0429445 +-0.029146 0.168214 -0.0173005 +0.0267233 0.0347365 0.00732658 +-0.0416725 0.0607151 -0.0124173 +-0.0304675 0.175749 -0.00423829 +-0.0888241 0.114444 0.00524771 +-0.00228102 0.038771 0.0269718 +-0.0353955 0.0337248 -0.0302701 +-0.0474965 0.0862056 0.045143 +-0.0615859 0.155307 -0.0235819 +0.0506383 0.0516722 -0.00273463 +0.0335552 0.036072 0.00748554 +-0.00436077 0.12603 -0.00766771 +-0.0239599 0.182991 -0.0170658 +-0.00549985 0.07185 0.0581365 +-0.0328429 0.0972178 -0.0231932 +-0.091474 0.148846 0.0181354 +0.0336134 0.0876336 0.0416906 +-0.0614982 0.101529 0.0422258 +-0.0495014 0.0464837 0.0411417 +-0.0551395 0.054088 0.00915623 +-0.0432223 0.147486 -0.00120685 +-0.0358825 0.108535 -0.0199213 +0.00990352 0.130871 0.0175976 +-0.00150184 0.0978367 0.052434 +-0.0334203 0.0667037 -0.0174892 +0.0289827 0.0467369 -0.00766304 +-0.0555362 0.0629843 -0.00681601 +-0.0758946 0.0992374 -0.0118631 +-0.0367472 0.127095 0.0166739 +-0.0571684 0.0576767 0.00966588 +-0.0823623 0.154598 0.0188308 +-0.0905142 0.129614 0.0405398 +-0.0677394 0.0764997 -0.0160371 +-0.0201192 0.163785 -0.0165508 +-0.0132881 0.113144 -0.01784 +0.0143956 0.046307 -0.0246969 +0.0117341 0.0390743 0.0447312 +-0.0746833 0.155701 -0.000366346 +-0.069527 0.156219 -3.70248e-05 +-0.0226679 0.0341396 -0.0206509 +-0.00924422 0.0344526 -0.0182921 +-0.0276907 0.0335904 -0.024878 +-0.00470812 0.0669686 -0.0349707 +-0.024291 0.106203 -0.0224613 +-0.0142085 0.0972199 -0.0290358 +-0.0465353 0.133196 0.0100953 +-0.0245088 0.108515 0.0403619 +-0.092997 0.116043 0.0153159 +-0.0517083 0.131123 0.0322407 +-0.0456135 0.053373 -0.0104441 +-0.0345226 0.0846315 0.0427551 +-0.00735617 0.0354566 -0.0169734 +-0.0865776 0.109066 0.0163469 +-0.0436408 0.0408205 -0.0223011 +-0.0526724 0.130856 -0.00431281 +-0.0516582 0.0647811 -0.0108241 +0.0182047 0.100313 -0.0224597 +0.0445886 0.0833307 0.0241696 +-0.0749819 0.151307 -0.0268775 +-0.0846364 0.0845811 0.0264985 +-0.0452001 0.165138 -0.00833108 +-0.0791947 0.168601 -0.0366432 +-0.0848581 0.120613 -0.00298955 +0.0319638 0.0780558 -0.0197042 +-0.0923737 0.128196 0.0102559 +0.0394261 0.0716433 -0.0107927 +0.0122035 0.115305 -0.0162457 +-0.0229162 0.0383263 0.00143492 +0.0428254 0.0986969 0.0191637 +0.0153612 0.0463061 -0.0243571 +-0.00764709 0.0511598 -0.0317878 +-0.0853621 0.135278 0.0465646 +-0.0829375 0.116994 0.0487646 +-0.085028 0.100559 0.0275605 +-0.0219183 0.0382906 0.00166561 +-0.0765591 0.0818865 0.0366215 +0.0417584 0.0971928 -0.00282344 +-0.064598 0.141073 0.0399979 +0.0464507 0.0764566 0.0101865 +-0.0788399 0.114858 -0.00418456 +-0.0825062 0.110166 0.000353593 +0.029005 0.0699505 0.0419019 +-0.0144969 0.0814706 0.0569355 +0.0278524 0.115393 0.0316598 +-0.0742949 0.17555 -0.0422185 +-0.0749686 0.158241 -0.0259415 +-0.0378653 0.102824 -0.0209313 +-0.0110297 0.11443 -0.0172182 +0.0092913 0.0739064 -0.0330363 +0.0274028 0.0416284 -0.00496361 +-0.0105374 0.130025 0.0158825 +-0.0530895 0.0530892 -0.00643833 +-0.0165413 0.0573347 0.0511714 +0.0165193 0.125294 -0.00303164 +-0.080526 0.109264 0.0359357 +-0.0639459 0.153257 -0.00670123 +0.0199666 0.126684 0.0198751 +0.0426813 0.101508 0.00916223 +0.0270307 0.0781852 0.0461538 +0.00819303 0.0342719 -0.00156322 +-0.0758021 0.154133 0.0299324 +0.0217183 0.114203 -0.013082 +-0.0761724 0.154401 0.00198863 +0.0253655 0.0814952 -0.0244829 +-0.0357817 0.0871994 -0.0240994 +-0.0181797 0.178658 -0.0176382 +-0.018211 0.0697307 0.0537615 +-0.0393811 0.154717 -0.00895732 +-0.014508 0.0659228 0.0537042 +-0.0294961 0.104302 0.0413374 +-0.0281692 0.171188 -0.018077 +-0.0564789 0.0833746 0.0446901 +-0.0817321 0.120346 0.0490739 +-0.0180945 0.124042 -0.00530863 +-0.0722448 0.0688588 0.0287217 +-0.064637 0.0404566 0.0276669 +-0.0642686 0.171043 -0.0609844 +-0.00150003 0.0520299 0.0541649 +0.0343966 0.0968432 0.0376227 +0.033587 0.0739599 -0.0167921 +-0.0916761 0.122705 0.00729331 +0.0435692 0.0691645 0.0259965 +-0.0583799 0.0342852 0.0299739 +0.0193411 0.0593649 -0.0271573 +-0.0630027 0.145885 -0.0118617 +-0.0492939 0.133961 0.00142725 +-0.0445641 0.0405033 0.0438121 +-0.0534909 0.101517 0.0419949 +-0.0137652 0.0728728 -0.0386088 +-0.000746952 0.0726633 -0.0355323 +-0.00426313 0.130924 0.016725 +-0.0833848 0.0776237 0.00250717 +0.0107457 0.127435 -0.00331768 +-0.0566099 0.136533 -0.00462162 +-0.0137664 0.0742812 -0.0386456 +-0.0253123 0.0865272 0.0518462 +0.0391332 0.0800655 -0.0117735 +-0.0595022 0.0987448 0.042776 +-0.031899 0.0792306 -0.0315346 +-0.074881 0.117904 -0.00727699 +-0.0755718 0.165165 -0.0201548 +0.0408155 0.0939721 0.0292858 +-0.0854938 0.096523 0.0281673 +-0.0644931 0.105621 0.039804 +-0.0196701 0.0554437 -0.0324495 +0.0139693 0.112639 -0.017366 +-0.00232624 0.124886 -0.00844394 +-0.0617679 0.0824635 -0.0193558 +-0.0599121 0.0588939 0.00621161 +-0.0826266 0.146034 0.0392943 +-0.0649084 0.165706 -0.0272764 +-0.0602113 0.0697286 0.0375341 +-0.00175042 0.0897209 -0.0353687 +-0.0275054 0.107176 -0.0215083 +-0.062122 0.0429616 0.0266943 +0.032428 0.0625798 -0.0177725 +-0.0663881 0.0677373 0.0326703 +-0.02076 0.0347198 -0.0277376 +-0.0519381 0.0597689 0.0297286 +-0.0595413 0.0582322 0.0158865 +-0.0445568 0.151229 -0.00569012 +-0.0210951 0.12531 -0.000542597 +-0.020213 0.178617 -0.0227863 +-0.00769265 0.0388371 -0.00333188 +-0.0344924 0.09037 0.0442186 +-0.0786032 0.107051 0.0327104 +-0.0434904 0.12843 0.000929671 +-0.058473 0.115363 0.0369711 +0.045085 0.0833373 0.00221176 +-0.0384977 0.0648621 0.0416261 +-0.0407478 0.0768336 -0.0187281 +-0.0578796 0.102621 -0.0187883 +-0.0846144 0.128516 0.0502768 +0.0170529 0.075444 0.0528157 +-0.018505 0.0786406 0.056357 +-0.0752579 0.0874199 0.0393733 +0.043967 0.0636126 -0.00172463 +-0.0914628 0.146095 0.0181484 +-0.0294715 0.117536 0.0312989 +-0.0581079 0.0480417 -0.000353036 +-0.0384621 0.172216 -0.000421117 +0.0412086 0.0684033 0.0296357 +-0.0332986 0.0384796 -0.0137148 +-0.0549774 0.0335456 0.00467992 +0.00953694 0.103082 0.0459273 +-0.048193 0.133027 0.0241926 +0.00364343 0.0960341 -0.0296841 +-0.0809226 0.0926448 0.0335946 +0.0316471 0.05126 -0.00972402 +-0.0622205 0.164668 -0.0515889 +0.0257137 0.0591918 0.0440938 +-0.0116637 0.0384284 0.00907266 +0.00758624 0.0341288 -0.016561 +-0.0732628 0.0731075 0.0335988 +0.0105031 0.0347322 0.0422156 +0.0273613 0.0592959 -0.0217662 +-0.0329323 0.126815 0.00921204 +-0.0462425 0.0615364 0.0381535 +0.00735972 0.130718 0.020957 +-0.0618449 0.152018 0.0348716 +-0.0311962 0.0475489 -0.0247586 +-0.0384898 0.113893 0.0344296 +-0.0268492 0.155368 -0.00477229 +0.0138974 0.0344287 -0.0156692 +-0.0374813 0.169748 0.00157136 +-0.0892091 0.137796 0.0122163 +-0.0705026 0.0958452 0.0418601 +-0.0862013 0.10903 0.0113533 +-0.0682521 0.15944 -0.00832765 +0.038441 0.100665 0.0293761 +-0.0639313 0.11526 -0.0113233 +-0.0664444 0.151761 -0.0404644 +0.0142088 0.034798 0.0302902 +-0.0244166 0.0931902 0.0479432 +-0.0714792 0.167875 -0.0225174 +-0.0161203 0.0383572 0.000963241 +0.0282773 0.0862159 0.0445154 +0.0375 0.107296 0.0262149 +-0.0891989 0.11586 0.044703 +0.00339178 0.0433892 -0.0247833 +-0.0790801 0.0704064 0.00826811 +-0.0237813 0.0756129 -0.0382516 +0.00190837 0.124868 -0.00847893 +0.0243137 0.119818 0.0300741 +-0.0758951 0.123764 -0.00763971 +0.052991 0.0735097 0.0116286 +-0.0175974 0.0393048 -0.0277532 +-0.013784 0.0799171 -0.0389774 +0.00451197 0.0619711 0.0562284 +-0.0331612 0.0342582 0.0246899 +0.0314823 0.114431 0.0284596 +-0.0530088 0.145722 -0.00115007 +-0.0684496 0.0369814 0.0129839 +-0.0203772 0.158233 -0.00725915 +0.0148967 0.0366228 -0.0205744 +-0.0250413 0.0925197 -0.0322644 +-0.0424949 0.168218 0.00285877 +-0.0414982 0.0719267 0.042103 +-0.0939163 0.120093 0.0142993 +-0.0164902 0.112704 0.0398029 +-0.000484486 0.0703477 0.056848 +0.060415 0.0678562 0.0151973 +-0.0550635 0.116914 0.036091 +0.0200483 0.0385661 -0.0116898 +-0.0250588 0.123734 -0.00291588 +0.0403936 0.0629925 0.0301493 +0.0379656 0.0874795 0.0356781 +-0.0548923 0.105518 -0.0186699 +-0.0311396 0.166714 -0.0162904 +0.0470624 0.0740285 0.0123586 +-0.0678676 0.100922 -0.0154166 +-0.0631629 0.124137 0.0456282 +-0.0731746 0.154066 -0.0319096 +-0.0307727 0.033545 -0.0254394 +-0.0890856 0.122978 0.0464209 +-0.0236634 0.123398 -0.00459221 +0.046259 0.0820395 0.0071847 +-0.000605347 0.130433 0.0223861 +0.0192013 0.0591556 0.0487522 +-0.0498987 0.124057 -0.00910218 +-0.0170638 0.168326 -0.0143421 +0.0265398 0.104204 -0.0163559 +-0.0938575 0.120136 0.0242923 +-0.0179474 0.100123 -0.0240926 +-0.058599 0.155538 0.0184341 +-0.0170777 0.0418831 0.0522589 +-0.0545484 0.0457621 -0.00683862 +0.00723985 0.076824 -0.0341303 +-0.0907031 0.148891 0.0231421 +-0.0174825 0.107148 0.0420092 +-0.0911131 0.129682 0.0362351 +-0.0499113 0.147776 0.0118822 +-0.0657818 0.152842 -0.0413063 +0.0528515 0.0592232 -0.00323634 +-0.0693828 0.0805427 0.0408087 +-0.060108 0.0423138 0.0158374 +0.0281616 0.0699505 0.0424355 +0.00679863 0.0347495 0.0432322 +-0.0458268 0.125298 0.0247658 +-0.0567225 0.043789 0.0226896 +-4.09913e-05 0.10064 0.0465907 +-0.0729374 0.129655 -0.00843737 +0.0415013 0.104244 0.010161 +0.0342459 0.0889575 0.0408509 +-0.0808289 0.138985 -0.00281163 +-0.0425095 0.171123 -0.00130836 +-0.0870569 0.137884 0.0425258 +0.00149552 0.116934 0.0397718 +-0.0158011 0.0388262 -0.0105326 +0.00549603 0.0413259 0.0457036 +-0.0325959 0.124521 0.0211556 +-0.058912 0.109738 -0.0167726 +-0.0772259 0.151416 -0.00590086 +-0.0077735 0.0770379 -0.0376668 +0.0385932 0.0436441 0.0291648 +-0.0778914 0.162484 -0.0299302 +-0.0641074 0.0639595 0.0276548 +0.0187103 0.0342934 0.0023932 +-0.0858293 0.151702 0.00893089 +0.0336067 0.0504819 0.0325279 +-0.0810076 0.10869 -0.00259876 +-0.0557401 0.0547516 -0.00240302 +-0.0335154 0.108413 0.0382413 +-0.00564795 0.049654 -0.0307584 +-0.0765497 0.0728479 -0.00560245 +-0.00214115 0.127727 0.0291435 +-0.0701217 0.159568 -0.0479252 +-0.0794787 0.104524 -0.00660043 +0.00849938 0.0366585 0.0454484 +-0.0305059 0.0889327 0.0438397 +-0.0638439 0.101082 -0.0177706 +-0.0045041 0.0801506 0.0577231 +0.013232 0.0835986 -0.0303791 +-0.0809796 0.0788834 0.0298322 +-0.0148841 0.0959887 -0.031739 +-0.0699437 0.0669048 0.0273786 +-0.0514117 0.134659 0.0288827 +0.0105257 0.123354 0.0336723 +0.0263222 0.107421 0.038207 +-0.0125183 0.095238 0.0536312 +-0.0634853 0.0904216 0.0451002 +0.0377424 0.110293 0.0150624 +-0.0700913 0.0419644 0.00613646 +-0.0565326 0.0401709 -0.00945456 +-0.0553504 0.0460785 0.0138247 +-0.0114916 0.0759418 0.0571389 +-0.0796666 0.0886389 0.0352895 +0.0338998 0.0888046 -0.0179815 +-0.0207237 0.0567772 0.0467736 +0.0293267 0.120376 0.00767428 +-0.0865466 0.137714 0.00320362 +-0.0815177 0.106 -0.00361682 +0.0360857 0.0784054 -0.0147648 +-0.0706254 0.129856 0.0506426 +0.0309103 0.088937 0.0430941 +0.0186908 0.127724 0.0151265 +0.0607002 0.0665033 0.01416 +-0.0347226 0.0711465 -0.0183854 +-0.0475247 0.0335798 -0.00289187 +0.00330662 0.0597508 -0.0323981 +0.0162777 0.117973 -0.0131407 +0.0260142 0.118212 -0.00538239 +-0.0524983 0.0477783 0.0397646 +0.00462528 0.109546 0.0419595 +-0.0848442 0.146005 0.0372765 +-0.0568876 0.0998079 -0.0197942 +-0.0478768 0.15504 0.00962757 +0.0236771 0.0956901 -0.0213272 +-0.0909699 0.113313 0.018324 +-0.0314956 0.0560344 0.0371147 +0.0419523 0.101425 0.00119033 +-0.0205212 0.118181 0.0347958 +0.00296971 0.0341513 0.00863676 +-0.0034922 0.0473569 0.0490622 +0.0168587 0.0347265 0.0236529 +-0.00422658 0.0396088 0.0480089 +0.0402871 0.104196 0.0211608 +-0.0211382 0.0985478 0.044502 +-0.0469324 0.0383628 -0.0152843 +0.0223386 0.0578809 -0.0262309 +-0.094679 0.122825 0.0202733 +-0.00649716 0.0619561 0.0561245 +-0.0530923 0.143138 0.0243879 +0.0586666 0.0690768 0.00715872 +-0.0632884 0.0444363 0.0372932 +-0.0584087 0.0421172 0.0451764 +0.0462769 0.0649494 -0.00109094 +-0.0892011 0.0983026 0.0104143 +-0.050311 0.033406 0.00395206 +-0.0171117 0.123425 0.0297114 +-0.0067867 0.0784694 -0.0378945 +-0.0413793 0.0448727 -0.0203291 +0.00613123 0.105885 -0.0208912 +-0.0209654 0.035527 0.0525237 +0.0515169 0.0664883 0.0274059 +-0.0186581 0.0985081 0.0446525 +0.00326552 0.127077 0.029619 +0.00950248 0.111292 0.0396928 +0.0420852 0.077848 0.0291974 +-0.0404715 0.0343242 0.0319689 +-0.0775002 0.156948 -0.0139048 +-0.0828255 0.0924347 -0.00656966 +-0.0256554 0.124701 0.019279 +0.00649798 0.107134 0.0414437 +-0.0067083 0.0613544 -0.0352012 +-0.0341277 0.165212 -0.0151261 +-0.0305288 0.0353431 -0.0195833 +0.00449494 0.105757 0.0421851 +-0.0313565 0.161046 -0.00157639 +0.00317447 0.0908801 -0.0331491 +-0.066706 0.0375681 0.0351923 +0.0146203 0.128223 0.0236197 +-0.0931816 0.121543 0.0372829 +-0.0390449 0.0344196 0.0339502 +0.0204938 0.0865196 0.0494812 +-0.0909512 0.147073 0.025026 +-0.0398753 0.149194 -0.00215183 +0.0371767 0.095465 0.0345819 +-0.0534525 0.116245 -0.0149003 +-0.00912597 0.168128 -0.0227626 +0.0103593 0.0509634 -0.0286117 +0.00839042 0.0434178 -0.024623 +0.012125 0.10869 -0.0190017 +-0.0749621 0.134014 -0.00721966 +-0.0789216 0.172194 -0.0440002 +-0.0258331 0.0561399 -0.0284181 +-0.0817922 0.143171 0.000171875 +0.0451306 0.0647669 -0.000900002 +-0.0514821 0.113924 -0.0164877 +0.00371763 0.0346901 0.0426483 +-0.0475701 0.0461114 -0.0100167 +0.0406981 0.104234 0.0181671 +-0.0453678 0.060156 0.0387657 +-0.0314314 0.0693522 -0.0254564 +-0.0154911 0.0702181 0.054969 +-0.0300755 0.123175 0.0220771 +-0.0216491 0.0479362 -0.0281524 +-0.0507589 0.144713 0.0133585 +-0.0670917 0.155954 0.0255845 +-0.0852375 0.1104 0.00532111 +-0.0573508 0.121267 0.0398601 +-0.0261065 0.0944666 -0.0262366 +-0.0897054 0.124293 0.0455762 +-0.000486036 0.047441 0.049521 +-0.0438029 0.167379 0.00334272 +0.0111963 0.0864748 -0.0310924 +0.0464517 0.0750534 0.00718936 +-0.036486 0.0619956 0.0409573 +-0.0314993 0.116609 0.0322344 +-0.0544997 0.117303 -0.0139925 +-0.0420673 0.0336103 0.00544111 +-0.0856626 0.0912736 -0.00055353 +-0.050495 0.0974075 0.0440057 +0.0309311 0.0355864 0.0055308 +0.0202177 0.109327 -0.0158556 +0.0249428 0.0968855 0.0450153 +-0.00751 0.070341 0.0568254 +-0.0604012 0.0335984 -0.00916237 +0.0245092 0.0406191 -0.00557292 +-0.0451779 0.152141 0.00822921 +-0.0607654 0.0668786 0.0346016 +-0.0593188 0.114075 -0.0145597 +-0.091214 0.143385 0.025163 +-0.0425978 0.0505652 -0.0109174 +-0.0423266 0.169779 -0.00887745 +-0.0224756 0.0348012 0.0476768 +0.0409735 0.0405135 0.0215425 +-0.0801239 0.110623 0.0438367 +-0.0138651 0.0987904 -0.0246748 +-0.043573 0.126043 -0.00725208 +-0.0208606 0.101617 -0.0238418 +-0.0425016 0.0605517 0.0404213 +-0.00249479 0.0590139 0.0541301 +0.0409984 0.102803 0.000176721 +0.0342014 0.0808856 0.0407312 +-0.0247835 0.166781 -0.00970724 +0.00931572 0.0725689 0.0556419 +-0.0642124 0.145356 0.038849 +-0.0716272 0.0748459 -0.0119866 +-0.012533 0.0458468 0.048979 +-0.0741728 0.15268 -0.0288898 +-0.0211868 0.174176 -0.0217698 +-0.054499 0.0761691 0.0426143 +-0.0851934 0.11068 0.0373035 +-0.00964195 0.120097 -0.0132573 +0.0149745 0.129329 0.00806984 +-0.0535552 0.0335918 0.0121227 +0.0387224 0.1084 0.018173 +-0.0858928 0.108988 0.00834067 +0.00426552 0.0697141 -0.0335935 +0.0304509 0.117992 0.000957505 +-0.0134723 0.0603845 0.0536243 +-0.0809665 0.133877 -0.00363658 +-0.0877284 0.0950339 0.0247524 +-0.0708769 0.155921 0.00969704 +-0.0388302 0.173903 -0.00342781 +0.0123125 0.0680946 -0.0309662 +-0.0540561 0.150161 -0.00256907 +-0.0662654 0.129803 0.0463681 +-0.0481341 0.0344887 0.0319692 +-0.0482356 0.137094 0.0133979 +-0.0638562 0.148524 -0.023921 +-0.0873971 0.140576 0.0399568 +-0.0920359 0.126943 0.0332532 +0.00766079 0.0616753 0.0549139 +-0.0820513 0.0882817 -0.00662822 +-0.0583711 0.0614813 0.0257087 +-0.046355 0.0345569 0.0357917 +0.0473411 0.0488863 -0.00367878 +0.0292435 0.0637114 -0.0199317 +-0.0250309 0.172718 -0.0117738 +0.0423872 0.0459654 -0.00393846 +-0.0484976 0.0805051 0.0439961 +-0.0497297 0.0737805 -0.0165746 +0.0463736 0.0682111 0.00160519 +-0.0334339 0.166782 -0.00461644 +-0.0772978 0.0685904 0.0138065 +-0.0645607 0.153661 0.00110457 +0.00849221 0.108496 0.0406568 +-0.0554287 0.1598 0.000101402 +-0.0412715 0.127285 -0.00254236 +-0.080968 0.0967089 0.0335048 +0.0225187 0.123964 0.0251042 +-0.0559057 0.0379831 0.047068 +-0.0594802 0.0716799 0.0395512 +-0.0618223 0.170491 -0.0617288 +-0.0564955 0.104323 0.0414899 +-0.0810442 0.152541 0.00426923 +-0.0435828 0.0345782 0.0398547 +0.0126008 0.128196 0.0257553 +-0.0526679 0.0579784 0.0235498 +0.0380115 0.110174 0.0108643 +0.0150842 0.114728 -0.0156323 +0.0148813 0.0348012 0.0286151 +-0.0479877 0.121051 0.028756 +-0.0883678 0.128089 0.00227451 +-0.0720422 0.15541 -0.0389078 +0.0112474 0.0724264 -0.0317987 +0.0267956 0.111385 0.0354031 +-0.0649586 0.160381 -0.0157887 +0.00550295 0.0702783 0.0558582 +-0.0238067 0.0899629 -0.0356649 +-0.090988 0.113988 0.0207121 +0.0194892 0.0934174 0.0476186 +-0.0655537 0.161293 -0.0160037 +-0.0625236 0.0609176 -2.19725e-05 +-0.0491589 0.162483 -0.00556124 +-0.042649 0.0378778 -0.0263104 +0.00374161 0.0952291 -0.0308324 +0.025598 0.0610493 -0.0236458 +0.00942462 0.0375116 -0.02327 +-0.00136682 0.125668 -0.00729488 +0.008486 0.0532759 0.0521458 +-0.00749086 0.0675042 0.0558082 +-0.092697 0.117351 0.0113077 +0.0251837 0.112665 -0.0114294 +-0.04997 0.140123 0.00440621 +-0.0534339 0.040168 0.0467985 +-0.0936376 0.124116 0.0132691 +-0.0222759 0.0382517 0.00526325 +0.0600635 0.0664445 0.00913698 +-0.0224559 0.092554 -0.0342812 +0.0582887 0.0538074 0.00917936 +0.046059 0.0834308 0.0121726 +-0.0619009 0.0678892 0.0352357 +-0.0566658 0.0473318 0.0108617 +-0.0457003 0.0694971 -0.0160523 +-0.0618544 0.174099 -0.0565963 +-0.0498016 0.128288 0.0314623 +-0.0225807 0.159177 -0.00302445 +-0.0623624 0.16436 -0.0595797 +0.0383958 0.0505315 -0.00659356 +-0.0332433 0.126938 0.0135159 +-0.0454819 0.0875316 0.0441596 +-0.0835389 0.110217 0.0023021 +0.0386074 0.0617702 0.0328492 +-0.0407686 0.0811968 -0.0203079 +-0.033827 0.0901076 -0.0243377 +0.0506567 0.0703381 0.00346635 +0.0228724 0.125195 0.0195238 +-0.0187529 0.0384803 -0.00337678 +0.0222732 0.12205 0.0293193 +-0.0294959 0.0645466 0.0380401 +-0.0689565 0.166538 -0.0215879 +-0.00506288 0.0387211 0.00101779 +-0.0647592 0.169439 -0.0415812 +0.00438439 0.037904 -0.00378653 +-0.0241621 0.125878 0.0168174 +0.0359934 0.0685324 -0.0147875 +-0.0182052 0.0381955 0.0170088 +-0.0753414 0.15612 0.015399 +0.0453867 0.0413474 0.00824507 +-0.00449218 0.123763 0.0343217 +0.0460213 0.0862262 0.00917159 +0.0346496 0.0972102 -0.0129196 +0.0196844 0.126554 0.00410284 +0.0202619 0.12651 0.00572713 +-0.00449958 0.0504123 0.0519892 +-0.0899789 0.133805 0.0362152 +0.00988218 0.0886651 0.0547874 +-0.00395268 0.131078 0.00966125 +0.00346471 0.0977538 0.051238 +-0.0236164 0.0422618 -0.0289626 +-0.0253603 0.124214 -0.00135534 +-0.00744498 0.124256 -0.00972454 +-0.0577765 0.0494102 0.000630355 +-0.0321623 0.172645 -0.015639 +-0.0661377 0.0669804 0.0316196 +-0.0240269 0.158277 -0.0107707 +-0.0762359 0.113613 0.0494664 +-0.0849952 0.141833 0.00418636 +-0.0569251 0.0366412 0.0466659 +-0.0283222 0.0749245 0.042497 +0.0216856 0.0878179 -0.0250022 +-0.0866951 0.0951098 0.0265657 +0.0296006 0.0982071 0.041203 +-0.0630317 0.060472 0.0203248 +-0.0304883 0.0574252 0.0370157 +-0.0638466 0.159519 -0.0168205 +-0.0544959 0.0848124 0.0452537 +0.0243406 0.113099 -0.011895 +-0.0900837 0.117534 0.0447346 +-0.00144097 0.0378708 0.018909 +-0.0699808 0.136988 -0.00795948 +-0.0823654 0.0815422 -0.00354068 +-0.00681555 0.0385421 0.0244437 +0.00431168 0.0611153 -0.0319161 +-0.0801269 0.10608 0.0309775 +0.0162329 0.0807169 -0.0293214 +-0.0158843 0.0377689 0.0515755 +-0.0829013 0.122118 -0.00412754 +0.0294673 0.106706 -0.01303 +-0.0534948 0.11254 0.0358256 +0.00150254 0.0605844 0.0560506 +-0.0234977 0.101642 0.0439992 +-0.0797566 0.074638 -0.000471413 +-0.00773143 0.0670178 -0.0355816 +-0.0705055 0.0342009 0.00809348 +0.0167377 0.0461846 0.0432665 +0.00646432 0.110948 0.0411124 +-0.0194753 0.160592 -0.0133076 +-0.00449865 0.115591 0.0404715 +0.0280707 0.046664 -0.00969251 +0.048051 0.0496945 0.0288529 +-0.0763852 0.114637 0.0504008 +-0.0886058 0.150235 0.0251076 +-0.0211531 0.0382979 0.0271326 +0.0408293 0.101363 -0.00180736 +-0.0203988 0.177179 -0.0155929 +-0.0718351 0.180364 -0.0513557 +0.00724322 0.0361893 0.0456372 +0.0124253 0.0374345 -0.0223624 +0.0378254 0.108706 0.0222481 +-0.0871672 0.127065 0.0471934 +-0.0686541 0.12565 0.0517171 +-0.0889642 0.136517 0.0281982 +-0.0304896 0.0559845 0.0366491 +-0.0839703 0.0843113 0.0284366 +-0.00895133 0.0384401 0.00779513 +-0.0942308 0.126903 0.0192529 +-0.0569855 0.0507747 0.00670607 +-0.063488 0.037094 -0.00797583 +0.0252887 0.122228 0.0247087 +-0.0433541 0.112279 -0.0167951 +-0.0255625 0.0532992 -0.0274025 +-0.00849647 0.0532799 0.0524507 +-0.0074932 0.0842694 0.0572981 +-0.0760467 0.0689134 0.00354542 +-0.0518697 0.144272 -0.000239851 +0.0302023 0.0808798 0.0437374 +-0.0276563 0.12199 -0.007026 +-0.0484978 0.100158 0.0428666 +-0.0654874 0.143443 -0.0120814 +-0.0308113 0.153953 -0.00248259 +0.0597604 0.0567164 0.0141707 +-0.0480122 0.0341726 0.0287503 +-0.0640462 0.0622661 0.0238361 +-0.0206969 0.0568414 -0.0326165 +0.0309722 0.116471 -0.00147933 +-0.0691516 0.0788347 0.0401452 +-0.058803 0.0883 -0.0207912 +0.00672447 0.0346721 0.0378883 +-0.0746893 0.154119 0.0302893 +-0.0529585 0.135327 0.0304274 +0.00863241 0.128438 -0.00238911 +-0.0478493 0.099947 -0.0217978 +-0.075086 0.0674684 0.00355063 +0.0326927 0.116394 0.0217802 +-0.0842229 0.144678 0.0395137 +-0.0166094 0.128602 0.0136868 +0.00411662 0.125005 -0.00865855 +-0.0754818 0.148362 0.0406222 +-0.065886 0.15405 -0.00011759 +-0.0425085 0.119367 0.0297171 +-0.0902093 0.131023 0.0402096 +0.0383601 0.0921445 -0.0115002 +-0.038495 0.0804525 0.0431634 +-0.0353039 0.0794833 -0.0226806 +0.0441637 0.0973591 0.0111613 +-0.0590115 0.153958 0.00054242 +0.0453728 0.0735622 0.00221503 +0.0569193 0.0710092 0.00714855 +-0.0114956 0.105842 0.0433599 +-0.0698279 0.181394 -0.0549266 +0.0375934 0.102015 0.0299178 +0.00590625 0.0356875 -0.00331654 +-0.0684622 0.16137 -0.0113077 +-0.0742229 0.109724 0.0423296 +-0.0202504 0.182971 -0.0220384 +-0.091455 0.148836 0.0171378 +0.0152238 0.0793568 -0.0300519 +-0.000512 0.107246 0.0433248 +-0.0428418 0.0971034 -0.0220359 +-0.0514947 0.0819216 0.0442721 +-0.00625132 0.0383797 0.0174726 +0.0252504 0.0789879 -0.0247523 +-0.0833347 0.0898073 0.030438 +-0.0509182 0.146274 0.0133981 +0.0202304 0.105998 0.0417108 +0.0571307 0.0508797 0.0151878 +-0.0330104 0.126012 0.0180287 +-0.0217816 0.0797281 0.0555871 +-0.00743438 0.120242 -0.0134406 +-0.0148225 0.086924 -0.0385597 +-0.0375897 0.174214 -0.00298303 +-0.00244861 0.0605864 0.0553645 +-0.00874133 0.128614 -0.000328304 +-0.00579055 0.0798611 -0.0376463 +-0.0096155 0.119132 -0.0142361 +0.000497149 0.0534577 0.0541163 +-0.0928025 0.131035 0.0222365 +0.0372258 0.108268 -0.000834485 +-0.0914674 0.129551 0.00825277 +-0.00149557 0.0675596 0.0566557 +0.0154848 0.0548588 0.0485877 +0.0396568 0.0815034 -0.0117853 +0.0174985 0.119533 0.0343583 +-0.0108678 0.0975625 -0.0293851 +0.0264007 0.116693 0.0313169 +0.005469 0.0964333 0.0520715 +-0.0455856 0.128182 -0.00140207 +-0.0175003 0.0499225 0.0470061 +-0.075934 0.0788992 0.0351468 +-0.0067913 0.0812637 -0.0377236 +-0.0769778 0.155918 0.0162848 +-0.0797877 0.0746142 -0.00147983 +-0.0599651 0.0469723 0.0336736 +0.0382386 0.084194 -0.0147697 +-0.0816947 0.113482 0.0465399 +0.00634478 0.0524665 -0.0299091 +-0.0112874 0.182441 -0.0284978 +-0.026226 0.178551 -0.0179991 +-0.0739945 0.1802 -0.0521965 +0.0105211 0.104445 0.0448284 +0.0580719 0.0523893 0.015182 +-0.0525108 0.0819776 0.0447141 +0.0148643 0.0961115 -0.0237665 +-0.00147854 0.0474532 0.049375 +0.00669444 0.0340637 0.00205518 +-0.0753884 0.151441 -0.0109145 +0.0413586 0.0394374 0.00625535 +-0.0196125 0.0381064 0.0149924 +-0.00986994 0.104508 -0.0232523 +-0.0720157 0.145244 -0.0182167 +0.0416371 0.0669849 0.0284796 +0.0284741 0.0381475 -0.00163189 +0.0474976 0.06778 0.0262203 +0.0259166 0.0434925 0.0371741 +0.0464333 0.0455453 -0.00066213 +-0.00640927 0.120163 -0.0133583 +-0.0236376 0.0387148 -0.0157231 +-0.092269 0.124069 0.00827163 +0.0144954 0.119572 0.0352389 +-0.0702988 0.15533 -0.0489684 +-0.0882036 0.143298 0.0111345 +-0.074863 0.0795889 -0.0115995 +-0.0174424 0.10313 -0.0232301 +-0.0686182 0.0628687 0.0026871 +-0.0620712 0.16624 -0.0525885 +0.058207 0.0538058 0.0191798 +-0.0333511 0.0463754 -0.0256604 +-0.0855025 0.0832965 0.0214753 +-0.0920057 0.11611 0.0343124 +-0.0227771 0.124071 -0.00329832 +-0.0610006 0.129721 0.0398956 +-0.0404973 0.0492165 0.0395965 +-0.0481836 0.0335793 0.00422402 +-0.0654948 0.160255 -0.0145439 +0.00736856 0.0479637 -0.0273222 +-0.0123571 0.12972 0.0137799 +0.0579783 0.0551346 0.00616127 +-0.0164763 0.064491 0.0530345 +-0.0608155 0.0896295 -0.0193008 +-0.0205289 0.0958269 0.048234 +-0.086716 0.132512 0.0465811 +-0.052836 0.095613 -0.0220115 +0.0406946 0.0647331 -0.00578164 +0.0121697 0.0950562 -0.0266386 +-0.00950093 0.0925586 0.0561384 +-0.0157375 0.0671877 -0.037968 +-0.0269293 0.0376983 0.0192799 +0.033595 0.0660055 0.039722 +-0.0481741 0.135565 0.0182752 +-0.0224128 0.163867 -0.00803238 +0.00810708 0.101446 -0.0211916 +-0.0458977 0.166944 -0.00688513 +-0.0238738 0.105835 -0.0226784 +0.0272653 0.121002 0.0240179 +-0.0701585 0.0623473 0.0172092 +0.0578867 0.0607943 0.0238444 +0.0565638 0.0695327 0.00435815 +0.012216 0.0753282 0.0545969 +-0.0583609 0.0339112 0.0215144 +-0.0664905 0.0861274 0.0441111 +-0.0514869 0.0987554 0.0433116 +0.0210708 0.0349944 0.0242708 +-0.0102986 0.126308 0.029096 +-0.0638201 0.089594 -0.0189434 +-0.0782747 0.174383 -0.0433933 +-0.0311143 0.16374 -0.0152454 +-0.0915885 0.128321 0.0362439 +-0.0379874 0.0336299 0.0062497 +-0.0854294 0.151325 0.0282936 +0.0124994 0.0909598 0.0531045 +-0.0434452 0.120253 -0.0131867 +0.0229768 0.0754886 0.0490742 +-0.0334786 0.100129 0.0429194 +-0.0741118 0.0819105 0.0384161 +0.0373216 0.0901862 0.036514 +-0.0565657 0.11693 0.0374284 +0.00334719 0.0481602 -0.0292882 +-0.0324526 0.0336078 -0.0239554 +0.0083446 0.116042 -0.0170347 +-0.00977658 0.0387467 -0.00366788 +-0.0206679 0.0509474 -0.0298149 +-0.0242736 0.181474 -0.0180054 +0.0160525 0.0350115 0.0395034 +-0.0543014 0.146215 0.0264084 +-0.00102573 0.0346607 0.0434939 +-0.0611888 0.155469 0.00589931 +-0.0406241 0.0520111 -0.0110025 +-0.0705109 0.148356 0.0407257 +0.0495286 0.0610841 0.0304744 +-0.019145 0.0893155 0.0554734 +0.00268229 0.12726 -0.0050686 +-0.0743228 0.155495 -0.0229079 +0.021268 0.0762952 -0.0266753 +-0.0239356 0.0374925 -0.0183912 +0.0262803 0.0660857 -0.0226574 +-0.0164998 0.0856439 0.0570811 +-0.0857415 0.120359 0.048887 +-0.0344903 0.0505305 0.0383369 +0.00230798 0.0346028 0.0406387 +-0.0929029 0.129672 0.0252445 +-0.0654938 0.0604629 0.00727621 +0.044722 0.0833037 0.0012072 +-0.0230106 0.0580182 0.0433839 +-0.0105663 0.0350401 0.0482738 +0.0582293 0.0690671 0.00613614 +-0.0600127 0.131125 -0.00733582 +-0.0321751 0.162395 -0.00280539 +-0.0555013 0.0623754 0.0293782 +-0.0252415 0.109687 -0.0201254 +-0.0560506 0.150155 -0.00188433 +-0.0600649 0.129705 0.039485 +0.0338293 0.0767952 -0.0167877 +0.01215 0.0919974 -0.0294248 +-0.0346452 0.0340944 0.0173387 +-0.050492 0.149246 0.012837 +-0.0550682 0.150156 -0.00218973 +-0.00881167 0.085499 -0.0379404 +-0.0780101 0.11134 -0.00369811 +-0.0795926 0.100727 0.0334268 +-0.0423449 0.122373 -0.0114097 +0.0248097 0.124191 0.0159771 +-0.0174692 0.0529782 0.0491698 +-0.0889728 0.101008 0.0133925 +0.00851959 0.0730626 0.056014 +-0.026729 0.159626 -0.000161004 +0.0222613 0.0720727 -0.026869 +0.0396492 0.0970274 -0.00677557 +-0.0301141 0.166809 -0.00684471 +-0.00834781 0.129635 0.0224773 +-0.0198097 0.0813191 -0.0390949 +-0.0489315 0.137078 0.0173942 +-0.0161123 0.0985355 -0.0244159 +0.0331161 0.0795687 -0.0187107 +-0.0365028 0.0761422 0.0420368 +-0.0315196 0.0834471 -0.0305496 +-0.0366299 0.0534085 -0.0105028 +-0.0844928 0.0979861 -0.00258986 +-0.049695 0.0693575 -0.0143663 +-0.0795053 0.148405 0.0389114 +-0.0143105 0.0338147 -0.022462 +-0.036834 0.0382539 -0.0105119 +-0.0528967 0.0476266 0.0236645 +-0.0431625 0.0436516 -0.0173214 +0.0442909 0.0959534 0.0041727 +-0.0499053 0.141681 0.0133989 +-0.084567 0.0897523 0.028848 +-0.035736 0.0740102 -0.0187661 +-0.0624191 0.163107 -0.0445959 +0.0553692 0.0711293 0.0213817 +-0.0384984 0.0634699 0.041507 +-0.0420929 0.156178 -0.00917116 +-0.0641565 0.166823 -0.0341745 +-0.0623968 0.162983 -0.056654 +0.0276466 0.0659543 0.0434322 +0.0454314 0.088986 0.0031764 +-0.0749519 0.164602 -0.018207 +-0.0345505 0.175605 -0.011982 +0.0363374 0.104678 0.0298648 +-0.00375231 0.128091 -0.0038931 +-0.0305006 0.100206 0.0434038 +-0.00849625 0.0547108 0.0528122 +-0.0485842 0.0517801 -0.00897412 +-0.00451507 0.0519264 0.0531932 +-0.0815948 0.0748474 0.0175368 +0.0572159 0.0648465 0.024658 +-0.0403921 0.162356 0.00287494 +-0.0749222 0.126715 -0.00818803 +-0.047238 0.0346371 0.0407654 +-0.0621416 0.141343 -0.00629843 +-0.0251564 0.113713 -0.0163747 +-0.00855727 0.119157 -0.0142712 +-0.074494 0.126019 0.0529923 +-0.0205102 0.0461853 0.0521703 +-0.084864 0.0789836 0.0191297 +-0.0187649 0.125661 -0.000995534 +-0.0218427 0.0567021 0.0450804 +-0.0622179 0.153696 -0.0295936 +-0.0364968 0.0576627 0.0395237 +-0.0368019 0.127806 0.00485952 +-0.0770975 0.0967852 0.0367 +-0.000433486 0.0366062 0.0184413 +0.0131024 0.123925 -0.00754958 +-0.0177683 0.0383192 0.0242073 +-0.0655356 0.0398001 0.0300899 +-0.0778591 0.161105 -0.0269202 +-0.0341012 0.162237 -0.0142117 +-0.017501 0.0842912 0.0575736 +-0.0280973 0.16079 -0.0140776 +-0.0421185 0.122004 0.0266511 +-0.0142563 0.178628 -0.0276625 +-0.0440063 0.0629698 0.0401358 +0.0128613 0.0347903 0.0336338 +-0.0248532 0.0348299 0.0453939 +-0.00152849 0.105863 0.0439958 +-0.0346038 0.123422 0.0248791 +-0.0346304 0.079471 -0.0235463 +-0.0639625 0.126764 -0.00871214 +0.0364026 0.0547846 -0.00674979 +-0.0064883 0.123768 0.0340789 +-0.0470974 0.168427 -0.00297818 +-0.0575443 0.0401418 -0.00909914 +0.0257874 0.0895854 -0.0228249 +0.0183006 0.0383341 -0.0177245 +-0.0524963 0.0848256 0.0453696 +0.0561175 0.0494119 0.0111925 +-0.0588172 0.123244 -0.00816875 +-0.00922198 0.0384881 0.0221926 +-0.0331235 0.126633 0.00621772 +-0.0119418 0.120727 -0.011899 +-0.0607049 0.145387 0.0368926 +-0.0306093 0.125854 0.0144859 +-0.0356146 0.127659 0.0111781 +-0.0776104 0.0802915 -0.00928059 +-0.0702074 0.0394853 -0.000301673 +0.0434891 0.0583702 0.0316051 +-0.0789513 0.128091 -0.00607242 +-0.042519 0.0534194 0.039352 +-0.00449744 0.0939058 0.0556112 +-0.0094927 0.0619497 0.0558121 +-0.0694824 0.0944579 0.0422945 +-0.0771177 0.0879695 -0.0126012 +0.014854 0.103191 -0.021265 +-0.043284 0.169832 -0.00794427 +-0.00983007 0.124748 -0.00821099 +0.048512 0.0692789 0.0025489 +-0.0620323 0.0343503 0.0308946 +-0.074493 0.145596 0.0437863 +-0.0375024 0.104216 0.0394845 +-0.047499 0.0451812 0.0421654 +-0.0836103 0.0769236 0.0176347 +-0.0636092 0.170093 -0.0469941 +-0.0483594 0.137097 0.0143972 +-0.087232 0.102325 0.0223672 +-0.035507 0.104243 0.0399833 +-0.0577119 0.0708497 -0.0156457 +-0.00436115 0.122059 -0.0113929 +0.0024069 0.037633 -0.0245625 +0.00251114 0.0911189 0.0554408 +-0.0357211 0.0710689 -0.0174927 +0.0183807 0.0432425 -0.0223469 +-0.0688327 0.09803 -0.0157395 +-0.0747491 0.155081 0.00248708 +0.0451476 0.0833704 0.0221542 +-0.0657925 0.14111 0.0417765 +-0.0365871 0.119162 -0.0120374 +0.0101976 0.131045 0.010577 +-0.0249388 0.183594 -0.0126758 +0.0330579 0.0598189 -0.0157593 +-0.0212823 0.0391811 0.0388836 +0.0144144 0.0403325 -0.0225056 +-0.0304932 0.104292 0.0413193 +0.0224755 0.0947811 0.0470955 +-0.0694247 0.0337382 0.00515427 +-0.00249301 0.118317 0.039019 +0.0288984 0.0924492 -0.0198656 +0.033052 0.0440867 0.029429 +-0.0616004 0.15843 -0.0275855 +-0.0438223 0.0615675 0.0400039 +-0.0452867 0.0410146 -0.0162976 +0.0314256 0.0991914 -0.015062 +-0.0524965 0.0833785 0.044899 +-0.0298946 0.0436977 0.0506861 +-0.076428 0.148619 -0.00986569 +-0.0761803 0.0914451 0.0387697 +-0.0730299 0.172199 -0.0345665 +-0.0274981 0.0960112 0.0443229 +0.0045023 0.13009 0.02428 +-0.0302254 0.162455 -0.00347789 +-0.0871035 0.11231 0.0319974 +0.00225053 0.0726262 -0.0348847 +-0.0748173 0.152727 -0.0208966 +-0.0354946 0.118017 0.0312708 +0.0436028 0.0973418 0.0171655 +-0.0754981 0.13448 0.0513067 +0.0513136 0.0574694 -0.00408483 +-0.0228193 0.0854366 -0.0379031 +-0.057217 0.0336859 0.0130711 +-0.0749012 0.110639 -0.0076926 +-0.00874782 0.125791 -0.00734235 +0.0343242 0.100732 -0.0126444 +-0.0155312 0.126827 -0.00025822 +0.0145856 0.0341976 0.00165401 +-0.0175043 0.114096 0.0387143 +0.0552517 0.0720728 0.0198735 +0.0406726 0.0731516 -0.00877611 +-0.0268119 0.082528 -0.0368734 +-0.0262156 0.0519422 -0.0264212 +-0.0464977 0.041126 -0.0122454 +-0.0711885 0.173044 -0.0381946 +0.0492058 0.0511603 0.0287949 +-0.00188013 0.105918 -0.0222309 +-0.046455 0.126722 0.0256927 +-0.0142526 0.181479 -0.0279552 +-0.0655009 0.0903733 0.0443899 +-0.0037337 0.131051 0.015481 +-0.0308026 0.0367564 0.0517774 +0.0277802 0.121908 0.0142262 +-0.0344815 0.0575696 0.0386716 +-0.0844149 0.0777754 0.0115138 +0.0294342 0.0383781 -0.00173395 +-0.0423644 0.120691 0.0280931 +-0.0350646 0.156323 -0.010574 +-0.0619093 0.0470515 0.00567882 +-0.00290933 0.0388493 0.0285794 +-0.059258 0.0467212 -0.00132733 +0.00450339 0.123789 0.033846 +-0.0229547 0.12614 0.0172488 +0.0410852 0.0394499 0.00526393 +0.0049695 0.0340349 0.00359293 +-0.0513689 0.0516822 0.0322144 +-0.0606335 0.122654 0.0421622 +-0.0645986 0.15064 0.0368964 +-0.0632078 0.143892 -0.00837073 +-0.0386435 0.0563025 -0.0111331 +-0.0658025 0.083802 -0.0186684 +-0.062835 0.128322 0.0425151 +-0.0715276 0.14003 0.0472238 +0.056383 0.0538774 0.0233551 +-0.0610939 0.0335153 0.00346695 +-0.00051118 0.0978394 0.0524335 +-0.0418663 0.0340021 -0.00580283 +-0.042485 0.0762268 0.0429934 +-0.0512844 0.138511 0.0223666 +0.0367682 0.0888721 0.037463 +0.00724928 0.0711363 -0.0334334 +-0.0505534 0.0543594 0.017626 +0.00614025 0.110185 -0.0202335 +-0.00850551 0.0561268 0.0532043 +-0.0295938 0.0789709 0.0427962 +-0.0287487 0.0349103 0.0496611 +-0.0584012 0.154047 0.0286827 +-0.0127037 0.064273 -0.0367671 +-0.0288624 0.0606727 -0.0254104 +-0.0376712 0.125956 0.0207679 +-0.0612726 0.0708854 0.0380779 +-0.0637251 0.155028 0.0282356 +0.0531328 0.0476715 0.00620176 +-0.00308571 0.124589 0.0331408 +-0.0186888 0.0352267 -0.0190015 +0.001497 0.119685 0.0377723 +-0.032734 0.120436 -0.00935257 +-0.054542 0.0631354 -0.00767633 +0.052054 0.0718585 0.0216053 +-0.00556188 0.116801 -0.0157696 +-0.0504949 0.138575 0.0203939 +-0.00542543 0.120041 -0.0132322 +0.0310541 0.0727142 0.0413756 +-0.0558801 0.045112 0.0236807 +-0.0167974 0.0382847 0.0190235 +0.0256741 0.0809122 0.047736 +-0.0199636 0.0668339 0.051351 +-0.0491191 0.159098 -0.00622225 +-0.0506725 0.0667938 0.036819 +-0.0492762 0.143079 0.00435473 +-0.0216794 0.0538141 -0.0303252 +0.0305352 0.10973 -0.0102674 +-0.0225945 0.157229 -0.0076361 +-0.0530851 0.151641 -0.00314317 +-0.0271151 0.122681 0.0231414 +-0.0134994 0.0884096 0.056966 +-0.0266886 0.0335519 -0.0246454 +-0.008499 0.12243 0.035017 +-0.0393069 0.033537 -0.0233717 +-0.033807 0.0461583 0.044586 +-0.0198183 0.158714 -0.00970491 +-0.0835554 0.0925405 0.0305699 +-0.0340008 0.0766042 -0.0254969 +0.00352334 0.12519 0.0325857 +-0.0424905 0.0424327 0.0427417 +0.0232877 0.123385 0.0253956 +0.0230237 0.100791 0.0439995 +0.0307365 0.117405 0.0253192 +-0.0772723 0.114862 0.0500033 +-0.0264336 0.0535943 0.0384453 +0.0177456 0.0350628 0.0325863 +-0.0121375 0.102128 -0.024127 +-0.000203909 0.130048 0.0239772 +0.00795806 0.127195 -0.00506697 +-0.0252695 0.156633 -0.00336931 +0.0179609 0.1201 -0.00942839 +-0.0769756 0.068555 0.0156381 +-0.0871021 0.111516 0.0397664 +-0.0544907 0.101557 0.0424048 +-0.0572843 0.0589766 -0.000464382 +-0.07902 0.0751794 0.0271309 +0.0102371 0.115602 -0.0165593 +-0.0105893 0.180273 -0.0272114 +-0.0528115 0.0913061 -0.0221889 +-0.064755 0.068231 0.0343382 +-0.0137258 0.125368 -0.00476898 +-0.0635922 0.178326 -0.0570781 +-0.0239683 0.126504 0.0139537 +-0.0600264 0.132579 -0.00719549 +0.044826 0.0791184 -0.000782084 +-0.00541885 0.0969111 -0.0306599 +-0.0301034 0.0537602 -0.0193727 +0.0409333 0.0900371 -0.0097907 +0.024446 0.115337 -0.010308 +-0.0283175 0.0963396 -0.0241496 +0.0299711 0.119398 0.020753 +-0.0265916 0.172718 -0.0105089 +-0.0586682 0.128313 0.0397417 +-0.0818638 0.147313 0.00119815 +-0.0254305 0.0357675 -0.0290845 +-0.038039 0.126372 -0.00365101 +-0.00149717 0.0815096 0.0574492 +-0.00738223 0.0931774 -0.0348179 +0.0558223 0.0493444 0.0161931 +0.0577347 0.0705061 0.0074689 +-0.0778727 0.096767 0.0360596 +0.0144985 0.11402 0.0378951 +0.00389123 0.0355229 -0.0148126 +0.0242948 0.124607 0.0114976 +0.0565412 0.0674698 0.002463 +-0.0308889 0.108768 -0.0191524 +0.011955 0.0349898 0.0332703 +-0.0129143 0.104805 -0.023047 +-0.0938592 0.11877 0.0212975 +0.0106595 0.0357626 0.0286983 +-0.0652684 0.163853 -0.0591668 +-0.0359879 0.0421738 0.0454409 +-0.0685089 0.100042 0.0409867 +0.03476 0.113033 0.0239837 +-0.0346506 0.126197 -0.000232823 +-0.0386758 0.0462873 -0.0214583 +0.0257808 0.10679 -0.0151172 +-0.0618601 0.153758 -0.0185818 +0.03067 0.0917687 -0.019137 +0.0275533 0.0672844 0.0433037 +-0.0414978 0.0748079 0.0427759 +-0.0218204 0.0840783 -0.0384285 +0.037815 0.0630498 -0.0108066 +-0.0602789 0.0617061 0.0251086 +-0.0768171 0.154199 -0.00689913 +0.00550054 0.0990386 0.0482677 +-0.0391759 0.16667 -0.0123913 +-0.0616525 0.116813 -0.0113459 +-0.0227683 0.0699063 -0.0373697 +-0.0825008 0.107588 0.0273509 +0.0253381 0.0418727 -0.00588506 +-0.014565 0.035318 -0.01827 +-0.00278761 0.0390101 -0.00997081 +-0.0895837 0.137934 0.0361877 +-0.0855599 0.112052 0.0307632 +-0.027858 0.0343176 -0.0296609 +-0.0325025 0.0675467 0.0400218 +0.0183334 0.0348857 0.00364336 +-0.0469365 0.0404762 -0.0121149 +-0.0777262 0.0825344 -0.0106004 +-0.00467074 0.0569349 -0.0330586 +-0.0194597 0.165415 -0.0107679 +-0.0210403 0.122456 -0.00761783 +-0.0388087 0.0446425 -0.0234233 +-0.0696543 0.0614896 0.0127042 +0.0440466 0.0931306 0.0221521 +-0.0647046 0.0352193 0.0243246 +-0.0166096 0.0435748 -0.0274243 +0.0441838 0.0712847 0.000450163 +-0.0285281 0.0522637 0.0377683 +-0.0599387 0.147394 -0.00221747 +-0.0440942 0.156163 -0.00853601 +0.0388076 0.0807597 0.0350812 +-0.0141543 0.161827 -0.01362 +-0.0210631 0.0385773 -0.00578617 +-0.0237266 0.161004 -0.00287357 +-0.0863431 0.0896619 0.0263909 +-0.0829431 0.0790271 0.0235207 +0.0268259 0.0605622 0.0439609 +-0.0224026 0.0384511 0.0303351 +-0.0635581 0.170962 -0.0485923 +-0.0456965 0.147701 -0.00292724 +-0.0532705 0.0373829 0.0469289 +0.0231843 0.0658868 0.0457612 +-0.0887459 0.132238 0.00325707 +0.00920248 0.0914355 -0.0308607 +-0.0298874 0.063588 -0.0244234 +0.00157852 0.12719 -0.00497022 +-0.0814436 0.153873 0.00890807 +-0.0624959 0.0607929 0.0219134 +-0.0680579 0.149988 0.0386907 +0.0166077 0.128469 0.0186355 +0.00550411 0.0731036 0.0564845 +-0.00249995 0.0661849 0.0567093 +-0.0735022 0.155469 -0.0279133 +-0.0851803 0.0899483 -0.00256663 +0.0394434 0.0585828 -0.00486619 +-0.0739433 0.134018 -0.00754124 +-0.038066 0.156257 -0.0102365 +0.00335185 0.118611 -0.0157819 +-0.00660848 0.0420213 -0.0257519 +-0.0639921 0.0605727 0.020032 +0.0252819 0.100786 -0.0187149 +-0.0820788 0.0765181 0.0218286 +-0.0167051 0.0584876 -0.0351851 +-0.023274 0.106158 -0.0224283 +-0.0878269 0.087472 0.021463 +-0.0786369 0.113551 0.047197 +0.0360644 0.0861926 0.0381664 +-0.082909 0.123594 -0.00426589 +-0.029497 0.177966 -0.015166 +-0.0170948 0.127006 0.022289 +0.0524062 0.0491022 0.00128138 +-0.0198015 0.10169 -0.0238258 +-0.0221328 0.166772 -0.0183109 +-0.00252234 0.038424 0.00547409 +-0.0255028 0.0606627 0.0401195 +-0.0385432 0.0337417 -0.0196892 +-0.0644389 0.0627719 0.0250864 +-0.0879688 0.113092 0.00628888 +0.000951329 0.10045 0.046938 +0.0386471 0.086118 0.0348681 +-0.0374734 0.0346441 0.0411075 +0.0233517 0.120203 -0.00555174 +0.0462175 0.0761811 0.0179689 +-0.0376403 0.0336717 0.00266115 +-0.0341867 0.172054 -0.0145892 +-0.0623617 0.0420762 0.0420515 +-0.0114712 0.0379322 -0.0163227 +-0.0177227 0.119786 -0.0108098 +-0.0801398 0.154387 0.00935749 +0.00187492 0.0398874 0.0463369 +-0.0730243 0.159629 -0.0349322 +0.0473276 0.0547587 -0.00564531 +-0.0376789 0.0636715 -0.0137557 +-0.0727421 0.180568 -0.051639 +-0.0616232 0.148175 -0.003118 +-0.0248231 0.0839948 -0.0375331 +-0.0652787 0.173897 -0.0604957 +-0.0740506 0.152673 -0.0298916 +-0.0571547 0.150227 -0.00146353 +-0.0903203 0.146073 0.0131505 +-0.0779569 0.132491 -0.00592536 +-0.0290048 0.0550494 -0.0223991 +-0.00849727 0.0898107 0.0570624 +-0.0324948 0.112838 -0.0174448 +-0.0523188 0.0518 0.026645 +0.0302802 0.0506319 0.0365295 +-0.0838507 0.103422 -0.00164978 +-0.0788492 0.100759 0.0340965 +-0.0874564 0.141909 0.0385732 +-0.0155155 0.115507 0.0382335 +-0.0777311 0.0887218 0.0375819 +-0.0730146 0.15545 -0.0319082 +-0.0523124 0.0360662 0.0464431 +-0.06188 0.164622 -0.0566003 +0.0367263 0.0794489 0.0373046 +-0.0734863 0.173577 -0.0500848 +0.00600107 0.0390612 0.028408 +-0.0278792 0.0339265 -0.0214795 +-0.000753868 0.0390895 -0.00403098 +-0.0578284 0.0450681 -0.00544742 +-0.0829344 0.129921 0.0513858 +-0.0111161 0.125335 -0.00680126 +-0.0679477 0.0860672 0.0434473 +-0.0705079 0.105505 0.0376955 +-0.0109443 0.0389825 -0.0115729 +-0.0399106 0.033865 0.000215963 +0.00351496 0.0924905 0.0549546 +-0.0424851 0.033913 -0.0262188 +-0.0792564 0.155246 0.0213567 +-0.0215304 0.127346 0.0119061 +-0.091259 0.117481 0.0430647 +-0.0404902 0.0790417 0.0431478 +-0.0945826 0.122834 0.0222802 +-0.0518346 0.0517811 0.0306554 +-0.0767129 0.161805 -0.0163426 +-0.0867595 0.107707 0.0143554 +-0.0693236 0.142228 -0.0102995 +-0.0204959 0.105781 0.0424626 +0.0438044 0.0987496 0.00916312 +-0.00281997 0.0854457 -0.0370162 +-0.00280088 0.0840687 -0.037315 +0.0293196 0.0632732 0.0423131 +0.00625559 0.0725849 -0.0341185 +0.0203077 0.0621778 -0.0269805 +0.0563556 0.0723446 0.0173318 +-0.0230123 0.107366 -0.0218426 +-0.00742046 0.035877 -0.0249268 +0.0374488 0.0402522 0.0247009 +0.0292061 0.055224 -0.0177993 +-0.0184858 0.127732 0.0173962 +-0.0921542 0.132321 0.0142287 +-0.0583136 0.145422 -0.00203607 +-0.0688478 0.0994593 -0.0152611 +-0.0615047 0.167821 -0.0555677 +-0.0915903 0.125424 0.00726612 +0.0199591 0.0564127 0.0480725 +0.0378679 0.0713179 0.0353865 +-0.000605671 0.129033 0.0267429 +0.0298673 0.0740916 0.0431977 +0.00443138 0.126024 0.0314422 +0.0239815 0.12134 -0.00278507 +-0.0246606 0.0521655 -0.0277657 +0.0146913 0.0820798 0.0529703 +0.0259518 0.075434 0.0462884 +-0.0332069 0.0609523 -0.0145937 +-0.0191994 0.0907344 -0.0364225 +0.0589179 0.0607855 0.00414854 +0.0361999 0.103252 -0.0093129 +-0.0498767 0.0529199 0.0166388 +-0.0681894 0.0774836 0.0397476 +-0.021626 0.038176 0.00908889 +-0.0723232 0.163826 -0.0419605 +0.0104934 0.109851 0.0397458 +-0.0177283 0.0627822 -0.0360863 +-0.0628376 0.161493 -0.0485893 +0.00323101 0.120377 -0.0136716 +0.0551973 0.0674594 0.0252672 +-0.0349319 0.127285 0.00554823 +0.0194228 0.125079 0.025397 +-0.00805064 0.130356 0.00959263 +-0.0314936 0.097435 0.044487 +-0.0557138 0.0342594 0.0288064 +0.0212843 0.0490624 0.0410711 +-0.0898642 0.114175 0.0316644 +-0.0868422 0.134936 0.00226938 +-0.0758819 0.156006 0.016671 +-0.00997005 0.175779 -0.0292074 +-0.0603522 0.0407823 0.0443369 +0.0416146 0.0598915 -0.00407392 +0.0165523 0.0922417 -0.0256623 +-0.0245975 0.0365494 -0.0290831 +-0.0381375 0.160902 0.00087141 +-0.0719085 0.064649 0.0201308 +0.0144227 0.0477589 -0.0252693 +0.0603421 0.0650847 0.0181826 +-0.0146479 0.0481463 -0.0303376 +0.00721829 0.131495 0.00948452 +0.0394741 0.102755 0.0261825 +-0.0127182 0.0685587 -0.0376659 +0.0338414 0.0392101 0.0249005 +-0.0639127 0.160548 -0.0182872 +-0.0885745 0.0901142 0.00646846 +-0.0497297 0.0416675 0.0451167 +-0.0695102 0.148387 0.0405048 +0.0369413 0.0618853 0.0357448 +-0.0614969 0.0987359 0.0427353 +0.0264406 0.0434552 0.0361928 +0.0457541 0.0497206 0.0308161 +-0.0184963 0.0486167 0.0482304 +-0.086692 0.140502 0.00718566 +-0.0116045 0.0420472 -0.0262702 +-0.0708693 0.149702 0.0392474 +-0.061676 0.0343224 0.032737 +-0.00749303 0.115552 0.0402888 +0.0603302 0.0678632 0.0121432 +-0.070517 0.146976 0.0420031 +0.0360463 0.0953891 -0.0118379 +0.0368862 0.0601656 -0.0107732 +0.0239184 0.116674 0.0330029 +-0.0804601 0.148683 0.000173633 +-0.0604926 0.0344653 0.0380756 +-0.0152525 0.177145 -0.0265204 +-0.0773226 0.108517 -0.00660544 +-0.0176381 0.0465514 -0.0286775 +0.0313677 0.11674 -0.000181085 +-0.0465999 0.111104 -0.0175509 +-0.0408947 0.172668 -0.00780492 +0.0241275 0.120631 -0.00401437 +-0.055903 0.111216 -0.0172629 +-0.0781607 0.0935055 -0.0115755 +0.0158369 0.105055 -0.0192576 +-0.0130717 0.0973914 -0.0292103 +0.00114663 0.103071 -0.022297 +-0.0545436 0.0443717 -0.00770843 +0.0381644 0.0887078 -0.0138852 +-0.0638458 0.0366675 0.0422565 +-0.0245954 0.122675 -0.00581505 +-0.0199502 0.0553853 0.0474489 +-0.0454976 0.13168 0.014882 +-0.0808086 0.113339 -0.00208766 +-0.0658194 0.154782 -0.0493821 +-0.0138747 0.104484 -0.023001 +-0.0293428 0.112771 -0.0173776 +0.0139014 0.0962996 -0.0239693 +-0.0834257 0.145967 0.00318768 +-0.0299391 0.175699 -0.00474628 +-0.00851553 0.0759427 0.057359 +-0.0679104 0.122376 -0.00896749 +-0.0104955 0.0731168 0.0565579 +-0.0480021 0.126873 0.0289133 +-0.052022 0.0561083 0.0186673 +-0.0627916 0.150662 -0.00757045 +-0.0667057 0.14638 -0.0236565 +-0.0714698 0.161004 -0.0429413 +-0.0459114 0.0657109 0.0391289 +-0.0127989 0.0827406 -0.0389623 +0.0240686 0.0436305 0.0398361 +0.00979486 0.0360464 0.02827 +-0.0144862 0.0715775 0.0549247 +-0.0798641 0.145899 -0.00181913 +-0.0607177 0.0335659 0.00529637 +-0.0635063 0.156747 -0.0406118 +-0.0171212 0.0383927 0.000728518 +0.02686 0.0646091 0.0440244 +0.0291243 0.117712 -0.00241857 +0.0411571 0.0846831 0.0314273 +0.0246298 0.0347052 0.0125163 +0.0376787 0.105425 -0.00281358 +-0.0520342 0.116871 0.0334143 +-0.0526315 0.0335173 0.00157493 +0.0103692 0.116852 -0.0159048 +-0.0299989 0.178534 -0.0140055 +0.0199608 0.126186 0.00277612 +-0.0226771 0.0567339 -0.0313199 +-0.0693087 0.165593 -0.0188405 +0.0435095 0.0527832 0.0325495 +-0.0292487 0.115981 -0.0147474 +0.0390778 0.105565 0.0241719 +-0.0449049 0.167415 0.00301648 +-0.0575339 0.0493779 -0.000368538 +-0.0396388 0.0548721 -0.0111311 +0.0314293 0.102107 0.036834 +0.000480507 0.104429 0.0436509 +-0.0299338 0.0468967 -0.0261593 +-0.0712424 0.155684 0.00373917 +0.0197271 0.0808668 0.051456 +-0.0761145 0.157637 -0.00836344 +-0.0144941 0.122325 0.033097 +-0.0597928 0.095429 -0.0195264 +0.0309421 0.0646254 0.0411415 +-0.0275054 0.104339 0.0416271 +-0.000516741 0.108636 0.04302 +-0.0777092 0.07194 0.024923 +0.0102045 0.0795083 -0.0323062 +-0.0379505 0.150881 -0.00456722 +-0.013105 0.0382607 0.0125563 +-0.0182317 0.187056 -0.0182936 +-0.0182699 0.166848 -0.0125771 +-0.0264587 0.0902029 -0.033595 +-0.0668807 0.112599 0.0436137 +-0.0537473 0.076818 -0.0192258 +-0.0306082 0.165302 -0.00581873 +-0.0796939 0.0873057 0.0353613 +0.0347714 0.100763 0.034674 +-0.035752 0.0415598 -0.0291214 +0.0289767 0.117846 0.0275093 +-0.000706682 0.0655468 -0.0343894 +-0.0610628 0.138403 -0.00654794 +-0.0625935 0.12412 0.0446596 +-0.0648295 0.14966 -0.0309451 +-0.0234815 0.0974495 0.044821 +-0.026575 0.0476865 -0.0258778 +-0.0528683 0.0367334 -0.0118941 +-0.0116753 0.0526919 -0.0331734 +-0.0615062 0.158429 -0.0265894 +0.0320656 0.117538 0.0186978 +-0.00988755 0.103466 -0.0236142 +0.0484958 0.0691068 0.025078 +0.0156548 0.128965 0.0154331 +-0.0665046 0.10698 0.0385746 +-0.0267998 0.0522633 0.0388472 +-0.058755 0.0782067 -0.0192512 +0.0211493 0.0672779 0.0481082 +-0.0288355 0.125617 0.00924976 +-0.0124826 0.0701993 0.05486 +0.0522007 0.0476683 0.00324556 +-0.0443004 0.130334 0.00946299 +-0.00241533 0.0389975 -0.0136337 +-0.0437474 0.0783133 -0.0194351 +-0.0629007 0.115475 0.040648 +-0.0311605 0.169689 -0.016551 +-0.0263193 0.0386673 0.0347214 +0.0366921 0.0807912 0.0372758 +-0.0395001 0.100068 0.0413695 +-0.0681116 0.112409 0.0451263 +0.0386091 0.0686148 0.0346703 +-0.0759482 0.152671 -0.0129066 +0.0145806 0.0953173 0.0493246 +-0.0385004 0.150676 0.00203305 +-0.0935499 0.129634 0.0192397 +-0.0619642 0.126755 -0.00826981 +-0.0537213 0.0709084 -0.0154466 +-0.0314688 0.175764 -0.00340966 +-0.046761 0.126023 -0.00719597 +0.0128678 0.128966 0.0229731 +-0.0721444 0.145534 -0.0189034 +-0.014649 0.0384586 0.0247211 +-0.0782079 0.165287 -0.027954 +-0.0738874 0.0695898 0.0277412 +-0.0880483 0.145895 0.0319999 +-0.00950131 0.0870429 0.0572309 +-0.082872 0.154403 0.0201091 +-0.0574419 0.0424556 0.0216968 +0.0432211 0.097315 0.0201647 +0.0484167 0.0567471 0.0312254 +-0.0899902 0.146067 0.012148 +-0.0384869 0.0860997 0.0437907 +-0.0677801 0.0837503 -0.017964 +-0.0304968 0.071744 0.0399232 +-0.0267649 0.0754486 -0.0363172 +0.0555795 0.068697 0.0240751 +-0.00326172 0.0994383 0.0499516 +-0.0539364 0.153495 0.0157968 +-0.0264808 0.0509031 0.0429156 +0.0477223 0.0435274 0.0201079 +-0.027646 0.071755 0.0409574 +-0.025483 0.0988427 0.0444451 +0.00433576 0.055339 -0.0305463 +-0.0809392 0.0721012 0.0145438 +-0.0859359 0.0980836 0.000413824 +-0.0660122 0.153896 -0.0475582 +-0.0275574 0.156658 -0.00139783 +-0.0134137 0.0581871 0.0521911 +-0.0774938 0.134462 0.0515018 +0.0104958 0.0560929 0.0526786 +-0.00951583 0.0848597 -0.0382215 +-0.0298676 0.0916468 -0.0252289 +-0.0751451 0.15577 0.0110973 +-0.0887521 0.0969152 0.00742291 +-0.00642846 0.119149 -0.0142793 +-0.0351305 0.127632 0.00987733 +-0.079479 0.1087 0.0330138 +-0.00387451 0.0384228 0.00884205 +-0.0794858 0.0940336 0.0349322 +-0.0809833 0.080323 0.0311985 +-0.0874477 0.148578 0.0299355 +0.015852 0.106086 -0.0183494 +-0.0799154 0.12806 -0.00573177 +-0.0810332 0.092317 -0.00857663 +-0.0428426 0.0956907 -0.0224311 +-0.0843197 0.0830919 -0.00150258 +0.0270369 0.0347621 0.0147774 +-0.0114905 0.108632 0.0428314 +-0.0298836 0.04486 -0.0282273 +-0.0675863 0.0915604 0.0429945 +-0.0858462 0.0806083 0.01849 +-0.0377888 0.0855996 -0.0220857 +-0.080296 0.0886098 0.0345053 +-0.0631283 0.163827 -0.0595262 +-0.0200798 0.0653829 0.0501099 +0.0101376 0.104418 -0.0202461 +0.00311717 0.113125 -0.0199945 +0.00740202 0.0404296 -0.0235788 +-0.0233436 0.179984 -0.0199453 +-0.0849416 0.153745 0.0179582 +-0.00950506 0.0660833 0.0554985 +-0.0149561 0.0997734 -0.0237179 +-0.0625045 0.160053 -0.0215634 +0.0134925 0.114016 0.0379994 +-0.0484084 0.144974 0.000471547 +-0.0765927 0.0770726 0.0330453 +-0.0522524 0.0566167 0.0245415 +-0.0446531 0.0607308 -0.0127894 +-0.077361 0.0729429 -0.00456158 +-0.0164852 0.0870004 0.0567616 +0.00917846 0.101539 -0.0214106 +-0.0114976 0.0883765 0.0564607 +-0.0365032 0.109752 0.0369592 +-0.0622101 0.169551 -0.0614764 +0.0134275 0.117615 -0.0147491 +-0.0194201 0.1246 -0.00382324 +0.000402662 0.121936 0.0359399 +0.0308218 0.101142 -0.0151148 +0.044544 0.0748845 0.0238506 +-0.0190349 0.0930706 -0.0347914 +-0.0284257 0.15795 -0.0115973 +-0.0835152 0.150011 0.0330149 +-0.0723608 0.0363259 0.00395733 +0.049239 0.0437392 0.0164633 +-0.0281399 0.0917982 -0.0286003 +-0.0894337 0.132252 0.00424863 +-0.0478863 0.033513 -0.0102384 +-0.0480003 0.126688 -0.00585567 +-0.0147076 0.0933085 -0.0349989 +-0.0344513 0.172765 -0.000813008 +-0.012881 0.107288 -0.0218461 +-0.0494996 0.111168 0.0370596 +0.0195435 0.100771 0.0459866 +0.0383256 0.0387198 0.0189634 +-0.0490718 0.151664 -0.00461846 +-0.0413062 0.123313 -0.010402 +-0.0764561 0.106685 0.0353026 +-0.0506178 0.0590261 -0.0100428 +-0.0085531 0.0385596 0.00412906 +-0.0510743 0.153146 -0.0044532 +-0.0168415 0.122494 -0.0076608 +-0.0724396 0.129821 0.051541 +-0.0447123 0.0336927 -0.0153017 +-0.0128672 0.038589 0.0285719 +-0.0769694 0.136896 -0.00565009 +-0.0204809 0.0526524 0.0459576 +-0.0190093 0.100114 -0.02409 +0.0491876 0.0602673 -0.00438234 +2.68966e-05 0.0991578 -0.0250032 +-0.0146066 0.0355634 0.0504427 +0.0437747 0.084485 0.0264379 +-0.0613665 0.0430534 -0.00574325 +0.0102029 0.0779579 0.0551886 +-0.0584973 0.109766 0.0377913 +0.0405117 0.0657145 0.0303349 +0.0123622 0.0523525 -0.0283928 +-0.0865442 0.107736 0.017365 +-0.0273471 0.0735222 0.0429845 +-0.076628 0.169808 -0.0316679 +-0.00310182 0.130332 0.00278812 +0.0456485 0.0904179 0.0101632 +0.0367704 0.109675 0.000243105 +-0.0088954 0.108786 -0.0222808 +-0.0722528 0.156819 -0.0369077 +-0.0343294 0.175491 -0.0032043 +-0.0612579 0.167808 -0.0576007 +-0.0225051 0.10854 0.0408657 +-0.0396128 0.0492137 -0.0115104 +-0.0528856 0.104156 -0.0198053 +-0.0114785 0.0965129 0.0526113 +-0.0493499 0.141685 0.00939558 +-0.053326 0.162717 0.00204741 +0.0382413 0.108427 0.0210592 +0.0250594 0.122946 0.0231962 +0.0436593 0.058746 -0.00488132 +-0.052188 0.0559056 0.0136207 +-0.0337241 0.163848 -0.00328844 +-0.0671575 0.17049 -0.0366968 +-0.0780353 0.0880327 -0.0115615 +-0.00752216 0.122122 -0.0114318 +-0.0578223 0.12834 0.0392194 +-0.0624397 0.16285 -0.0548313 +-0.00720215 0.0344571 -0.0178933 +0.0219696 0.0347867 0.0191885 +0.0134971 0.112635 0.0387508 +-0.0188778 0.168283 -0.0134663 +0.0418633 0.0718502 -0.00680416 +0.00188261 0.129936 0.0247306 +-0.0143909 0.0388658 -0.0140202 +-0.0866821 0.0819953 0.0154888 +0.0511122 0.059915 -0.00400422 +-0.0637796 0.0419038 0.0392448 +-0.0334673 0.0532523 0.0375728 +-0.0640539 0.142491 0.0390245 +-0.0197273 0.118003 -0.0129221 +-0.0739294 0.0686501 -0.000515794 +0.022253 0.0430673 -0.0137151 +0.0169102 0.120624 0.0334304 +-0.0533452 0.118341 0.0350731 +-0.0407313 0.0710722 -0.0172567 +-0.0444934 0.108473 0.0392485 +-0.0406946 0.0340162 0.0268873 +-0.0428689 0.104235 -0.0209095 +0.000289503 0.0391337 -0.00386275 +0.0202669 0.0819781 -0.0271085 +0.0339966 0.0363512 0.0147468 +-0.0623699 0.0366895 0.0436353 +0.0112859 0.0638878 -0.0308862 +0.044262 0.0945325 0.00218274 +0.0178069 0.0349979 -0.00592782 +0.00766772 0.130773 0.00395877 +-0.0518373 0.0337424 -0.0112411 +0.05138 0.0464792 0.0212617 +-0.054495 0.0932121 0.0445367 +0.0154864 0.0380581 -0.0207587 +0.0322412 0.0368006 0.00286913 +0.0226382 0.0714084 0.0485432 +-0.0474967 0.0761987 0.0428659 +-0.0433556 0.0337438 -0.00770024 +-0.0507933 0.0869468 -0.0215939 +-0.0428743 0.166323 -0.00997516 +0.0420989 0.0930078 0.0271705 +-0.0133438 0.11201 -0.0186315 +-0.0682581 0.156305 0.0164417 +-0.0709159 0.125294 -0.00875352 +-0.0758095 0.0920857 -0.0139153 +0.00691185 0.038861 0.0287775 +-0.0755745 0.0702081 -0.000465226 +0.0560342 0.0622175 0.0264602 +0.00750328 0.0532576 0.0522142 +-0.0557017 0.0693735 -0.0143448 +-0.0400399 0.0367774 -0.0284153 +0.0452718 0.0917995 0.0131601 +0.0113635 0.0534706 0.0514016 +-0.056641 0.0429978 -0.00777539 +-0.0163006 0.182966 -0.0260091 +-0.0724038 0.116078 0.0519992 +-0.0223961 0.161302 -0.0143028 +-0.016322 0.128515 0.00945034 +-0.0761998 0.14998 -0.0148766 +-0.084898 0.11701 -0.000772283 +0.0215009 0.111167 0.037529 +-0.0116746 0.164119 -0.0176003 +-0.0386977 0.0666031 -0.0147476 +-0.0475127 0.0411749 0.0444313 +-0.0741496 0.147181 -0.0158602 +0.0423699 0.0412112 0.0211935 +-0.0112343 0.126014 -0.00554296 +-0.0627796 0.16313 -0.0285907 +0.0598501 0.0664357 0.0191799 +0.0444747 0.0438727 0.000520461 +-0.0449903 0.16693 -0.00785376 +-0.0241862 0.125789 0.00366503 +0.0303543 0.0942493 0.0422823 +0.0385368 0.0800568 -0.0127167 +-0.0329258 0.120263 0.0285346 +-0.0277494 0.0764615 0.044728 +0.0072822 0.0344718 -0.00192729 +0.0164745 0.103092 0.0456772 +-0.000370674 0.0391495 0.0306363 +-0.0444932 0.109842 0.0382343 +-0.0228558 0.113062 -0.0177116 +-0.0323055 0.0384897 -0.00796454 +0.0330143 0.106332 -0.0106209 +-0.0905664 0.150208 0.0151282 +-0.0473203 0.122487 0.0279328 +-0.079976 0.076532 0.0275303 +-0.0185178 0.0383092 0.00415679 +-0.0400541 0.128036 0.0139949 +-0.0725037 0.079155 0.0383043 +-0.00705924 0.127865 -0.00358478 +-0.0474808 0.0518309 0.037336 +0.0281857 0.0888902 0.0443935 +-0.0325014 0.102916 0.0416129 +-0.0636379 0.131123 0.0413473 +-0.0194422 0.0952996 -0.0310527 +0.0343622 0.0673468 0.0390872 +0.00248248 0.0385592 0.0461627 +-0.0207428 0.0656176 -0.0364653 +-0.0354216 0.17545 -0.00362892 +-0.0186888 0.127303 0.00423263 +-0.0697675 0.129835 0.0501143 +-0.0645483 0.168715 -0.0400434 +0.0176026 0.0520233 0.0463575 +-0.0165066 0.11684 0.0369313 +-0.0539292 0.0475998 -0.00643542 +0.0206619 0.125677 0.022985 +0.0131 0.034428 -0.00821794 +-0.0884031 0.101017 0.0203758 +-0.089294 0.136502 0.0252035 +-0.0633961 0.0610267 0.0215327 +-0.0181382 0.0625693 0.0510808 +-0.0363013 0.0408102 0.0457892 +-0.0348891 0.0341588 0.0262022 +0.0321818 0.0994934 0.0379171 +-0.0650996 0.115729 0.046366 +-0.0446047 0.0505366 -0.0105481 +-0.0170833 0.0896859 -0.0373218 +-0.0135156 0.162506 -0.0153049 +-0.0264962 0.119343 0.030427 +0.053783 0.0561466 -0.00178141 +-0.0659739 0.131145 -0.00872206 +-0.022585 0.185119 -0.0131839 +-0.0902473 0.132271 0.00623314 +-0.0343818 0.038354 -0.0138166 +-0.087117 0.119846 -0.000719646 +-0.0514997 0.047729 0.0396118 +-0.0837154 0.0804764 0.0234959 +0.0452487 0.0681916 0.00167659 +0.0443433 0.0762807 -0.00178421 +0.0393871 0.0828883 -0.0127786 +0.0133395 0.0475307 0.0453837 +0.0393635 0.0445531 -0.00413158 +0.0464068 0.0778555 0.00918735 +0.0498828 0.0474685 0.000307011 +-0.0205115 0.114066 0.0379617 +-0.0795322 0.0826724 -0.00859002 +0.0277802 0.0692504 -0.0226951 +-0.0640511 0.139618 0.0390194 +-0.0622733 0.144309 -0.00616114 +-0.0598164 0.122657 0.0415831 +-0.039222 0.0363262 0.0107899 +-0.0476756 0.0694312 -0.0151035 +-0.0114975 0.12239 0.0342495 +-0.0759886 0.0701373 0.025079 +0.0247695 0.1047 0.0394768 +-0.0424955 0.0464529 0.0406301 +-0.0209812 0.0389557 0.0535988 +-0.0434801 0.0917165 0.0428888 +-0.0936604 0.128255 0.0172452 +-0.0319662 0.163855 -0.00423083 +-0.0864626 0.107749 0.0163884 +0.00261599 0.0960798 -0.0297441 +0.0192696 0.124452 -0.00213625 +-0.0635019 0.0945759 0.0438874 +-0.0434804 0.108484 0.0391565 +-0.0767016 0.15969 -0.0259195 +-0.0207953 0.0784993 -0.0390618 +-0.0168597 0.0382017 0.0136589 +-0.0128908 0.129601 0.0150315 +-0.063562 0.136724 0.0379539 +-0.0592557 0.146819 0.0355066 +-0.0102821 0.0421361 0.0498123 +0.00411674 0.108725 -0.0201726 +-0.0471696 0.16597 0.00363215 +-0.0324882 0.0560654 0.0375153 +0.016314 0.061771 0.0498607 +-0.0633808 0.154539 0.0298218 +0.0319993 0.108737 0.0323781 +0.0224822 0.0578106 0.0464363 +-0.0731478 0.0644323 0.00940567 +-0.0136846 0.0555659 -0.0339274 +-0.0485565 0.0335372 0.00238031 +-0.0485794 0.128753 -0.00187037 +-0.0761205 0.0927947 0.038671 +-0.00890397 0.114438 -0.0172305 +-0.0881957 0.146062 0.0092207 +-0.067835 0.0951999 -0.016639 +-0.0826594 0.0993103 0.0308836 +0.0194806 0.107063 0.040905 +-0.0755472 0.15139 -0.00989046 +-0.0619095 0.118087 -0.0102757 +-0.0770237 0.0716688 -0.00146855 +-0.0090472 0.129209 0.0236827 +0.0166896 0.0645037 0.050425 +-0.044493 0.0860963 0.0437549 +-0.0851043 0.10321 0.0261425 +-0.0929793 0.125561 0.0282631 +-0.0792446 0.0699823 0.0139682 +-0.0541984 0.150844 0.02639 +-0.0544369 0.147753 0.0264091 +0.029273 0.103313 -0.0154093 +-0.0661878 0.156038 -0.00610123 +0.0513324 0.0613858 -0.00348738 +-0.00765334 0.0905691 -0.0361471 +-0.0036313 0.046681 -0.0294588 +-0.0793953 0.154018 0.0066962 +0.0126509 0.103032 -0.0211055 +-0.0534982 0.0344579 0.0343548 +0.0254331 0.0400654 -0.00462996 +-0.0474929 0.163748 0.00542805 +-0.0174765 0.0514437 0.047967 +-0.023601 0.0379574 -0.0288347 +0.0380126 0.0687088 -0.0127776 +0.0454875 0.0624627 0.0298224 +-0.0929393 0.122846 0.0403052 +-0.0619477 0.0629617 0.0272004 +-0.0632548 0.171035 -0.0614506 +-0.062927 0.150005 -0.0233391 +-0.0539078 0.109837 -0.0181931 +-0.0143481 0.129147 0.0116153 +-0.00460956 0.130321 0.00366937 +0.00735598 0.0509889 -0.0291303 +-0.0480744 0.151666 -0.00489643 +-0.0220459 0.166878 -0.0109827 +-0.0178225 0.0869056 -0.0385387 +0.000268234 0.0669357 -0.034172 +-0.0454819 0.0861255 0.0441555 +-0.0606958 0.0340151 0.0191666 +0.0293305 0.049536 -0.0137505 +-0.0661283 0.153073 -0.0457545 +0.0127964 0.0685744 0.0536204 +-0.0806268 0.150792 0.0343829 +0.0338754 0.0626989 -0.015804 +-0.0415032 0.116675 0.0325492 +-0.00995367 0.16681 -0.0217203 +0.059153 0.0704954 0.0131546 +-0.084323 0.0804069 0.00350409 +-0.0217865 0.0742531 -0.0388026 +0.0333307 0.040756 0.0270424 +-0.00920453 0.175559 -0.0287981 +-0.0565093 0.148178 0.0306333 +-0.0476849 0.146264 0.00805502 +-0.0896679 0.144435 0.0294634 +0.028326 0.0882981 -0.0214817 +-0.0129215 0.129318 0.0179306 +-0.0275354 0.0822426 0.0485604 +-0.0727818 0.154043 -0.034905 +0.0264706 0.0430524 -0.00597567 +-0.0461097 0.129234 0.00159921 +0.00227538 0.0668963 -0.0335609 +-0.0869081 0.0847086 0.0134765 +-0.071509 0.105494 0.0375699 +-0.0564975 0.105681 0.0408231 +-0.0709683 0.136976 -0.00769814 +-0.0238604 0.0347884 0.0456435 +-0.0248096 0.123255 -0.00440954 +-0.0504992 0.0917781 0.0442368 +-0.0672114 0.120049 0.0520179 +-0.067142 0.163768 -0.057034 +-0.0628433 0.16149 -0.0495873 +-0.0851762 0.106326 0.0223754 +0.0111461 0.101633 -0.021979 +0.0319374 0.0568888 -0.0147656 +0.0282794 0.120663 0.00443205 +-0.0912918 0.116401 0.0420373 +-0.00467238 0.0555139 -0.0327809 +-0.0267099 0.0794912 0.0492298 +-0.0226371 0.0622591 0.0442913 +0.0496058 0.0730794 0.0103455 +0.0134712 0.0347114 0.0266012 +-0.027103 0.0633188 -0.0304321 +-0.00446177 0.12682 -0.00651375 +-0.0184963 0.10441 0.0431068 +0.0322846 0.110983 -0.00760517 +0.043549 0.0987325 0.00516762 +-0.0442869 0.166804 -0.00853834 +0.0150912 0.0940152 0.0500689 +-0.07081 0.110507 0.0424798 +-0.0141183 0.115602 -0.0164489 +-0.0567507 0.13816 0.0319811 +-0.0047515 0.0726952 -0.0359954 +-0.0647331 0.0606321 0.00547671 +0.0292295 0.102131 0.038919 +-0.0328692 0.104316 -0.0215625 +-0.0105189 0.165484 -0.0170149 +-0.062488 0.161561 -0.0255895 +-0.083006 0.110313 0.0398706 +0.00202549 0.0390793 -0.0109499 +0.0598509 0.0692231 0.0121425 +-0.0486599 0.0649886 -0.0131055 +0.0193632 0.0475344 -0.0219845 +-0.0505005 0.109789 0.0379415 +0.0227584 0.0942129 0.0471436 +-0.054587 0.123231 -0.00812744 +0.0595925 0.0636093 0.00613697 +-0.0304354 0.159526 0.00145329 +-0.0771836 0.152278 0.0340017 +-0.0641378 0.146153 -0.0169913 +-0.012496 0.0828987 0.0575341 +-0.062259 0.0636125 0.0283336 +-0.0543842 0.064934 0.034129 +-0.0580097 0.136726 0.0336791 +0.0431148 0.0723568 0.0271232 +-0.0719688 0.147362 0.0419058 +0.0324265 0.0414912 -0.00365574 +-0.0504972 0.083371 0.044762 +-0.0277551 0.121254 0.0258902 +0.0248126 0.0672364 0.0446067 +-0.0748658 0.148574 -0.0178655 +0.0199833 0.0422265 0.0426566 +0.00936651 0.0494737 -0.0282538 +-0.0209427 0.127053 0.0165011 +0.014824 0.0950266 -0.0246047 +0.0416966 0.0899224 0.0287651 +-0.0417723 0.0826397 -0.0208385 +-0.0228105 0.123961 0.023212 +-0.0701997 0.155611 0.00411308 +-0.0246949 0.0550734 -0.0288078 +-0.0220519 0.163768 -0.0162501 +-0.0324478 0.069454 -0.0224572 +-0.0827552 0.07629 0.0125227 +-0.0606527 0.151084 0.0352378 +-0.0798891 0.0706304 0.0135503 +0.0476495 0.073201 0.00955169 +-0.00859398 0.0391639 -0.0259828 +0.0142802 0.0873929 0.0523851 +-0.00841973 0.128157 0.0268439 +-0.0665531 0.160013 -0.0120422 +-0.029443 0.0834063 0.0447309 +-0.0564979 0.0776594 0.043476 +-0.0483279 0.119696 0.0300033 +0.0232683 0.0857035 -0.0248261 +0.0321971 0.112814 -0.0055615 +0.0190831 0.0713469 0.0504539 +-0.054494 0.0465534 0.0422647 +-0.0121699 0.165481 -0.0142428 +0.000511137 0.0814953 0.0573473 +-0.0115028 0.0730832 0.0562182 +-0.0401042 0.037954 0.0427598 +-0.0114161 0.0382303 0.016554 +0.0328182 0.0967204 -0.0144274 +-0.00449908 0.0732747 0.0586205 +0.00733671 0.115147 -0.0180672 +-0.0476206 0.111206 -0.0176722 +-0.0624082 0.147544 -0.00957064 +-0.0615795 0.156866 -0.0245858 +0.0175138 0.12671 0.0232635 +-0.0697118 0.0764164 -0.0147262 +-0.0543713 0.158326 -0.00178875 +0.00713327 0.105885 -0.0207766 +-0.033517 0.115303 0.0329858 +-0.0114926 0.0897634 0.0564161 +-0.0375058 0.171208 0.000818011 +0.00542741 0.0336773 0.0131964 +0.0379386 0.07401 0.0354837 +-0.0860277 0.0967286 0.000430639 +-0.0311614 0.0791685 -0.0325602 +-0.0541101 0.0531993 -0.0053725 +-0.0592659 0.0599215 0.0215991 +0.0586637 0.0709935 0.0122726 +-0.0792595 0.0894709 -0.0095871 +-0.026159 0.0918036 0.0468933 +-0.0249745 0.12528 0.0180213 +-0.0519836 0.0517496 0.0236325 +-0.0275449 0.178709 -0.00674077 +-0.0715237 0.165101 -0.0167379 +0.0256965 0.123446 0.00917645 +0.0235224 0.0727618 0.0480692 +-0.0144773 0.0603048 0.0528052 +0.0408807 0.0948081 -0.00628698 +-0.0515819 0.0344024 0.0295565 +0.0311435 0.0885162 -0.0196004 +-0.087234 0.0981695 0.00341761 +-0.0165631 0.165424 -0.0118502 +-0.0497796 0.0518319 0.0348836 +0.0296893 0.110128 -0.0107004 +-0.0212542 0.126244 0.0193308 +-0.0315215 0.0732244 0.0404306 +0.0265706 0.0535806 -0.0207269 +-0.0944184 0.12146 0.0172829 +-0.0780287 0.14129 -0.00491664 +-0.0653187 0.152492 0.0351215 +0.0369332 0.102635 -0.00864905 +-0.0100919 0.126182 -0.00573829 +-0.0589643 0.15508 0.0013052 +-0.00782857 0.0386419 0.00238313 +-0.0893654 0.145802 0.0291185 +-0.077209 0.110378 0.0446936 +-0.0127752 0.0770687 -0.0383028 +-0.060466 0.143311 -0.00379205 +-0.0907002 0.137837 0.017198 +-0.0553853 0.15628 0.0108911 +-0.0609254 0.0454597 -0.00231147 +0.041351 0.0574751 -0.0052144 +-0.0111235 0.0346639 0.0467191 +-0.0520649 0.148658 -0.00262972 +-0.0438434 0.0985095 -0.0215595 +-0.0678163 0.0866062 -0.0177767 +0.0287562 0.053781 -0.0187512 +0.0338991 0.057119 -0.0127141 +-0.0189243 0.181629 -0.0169471 +-0.0888863 0.113493 0.0234001 +-0.0456524 0.0621788 -0.0131898 +-0.0205797 0.0906821 0.0540574 +-0.0285047 0.059221 -0.0254142 +-0.0310985 0.154152 -0.00673494 +0.0362687 0.0941823 0.0368117 +0.0223945 0.0860763 -0.025219 +0.0228611 0.0741302 0.0488936 +-0.0274872 0.094655 0.0450969 +-0.0238248 0.0826344 -0.0380614 +-0.044527 0.0601701 0.0393419 +0.0160126 0.0658829 0.0512178 +-0.0663487 0.06206 0.00207137 +0.000401309 0.0390966 -0.0249339 +-0.027107 0.082291 0.0495314 +-0.0617626 0.0415173 0.0247032 +-0.093011 0.118839 0.0352993 +-0.0662787 0.168684 -0.0320741 +-0.000498287 0.0535066 0.0547347 +0.0431795 0.0737197 0.0272167 +-0.0565118 0.0454033 -0.00602573 +-0.0668006 0.086643 -0.0182518 +-0.0652487 0.163342 -0.0202167 +0.0392901 0.0766734 0.0339466 +-0.0619246 0.106845 -0.0166571 +-0.0611633 0.0334354 -0.00188959 +-0.0722746 0.15542 -0.0369062 +-0.0690618 0.110676 0.0409548 +0.0432493 0.100107 0.00716752 +0.0317499 0.0535218 0.0369319 +-0.0492036 0.131059 0.0288275 +-0.0693592 0.176521 -0.047588 +-0.0072207 0.0356289 0.0484876 +-0.0818563 0.150046 0.00220642 +-0.0435006 0.0534118 0.0391466 +-0.0714969 0.156283 0.0152923 +-0.0883581 0.0875191 0.0194553 +-0.0774993 0.127442 0.0532862 +0.0288434 0.0591735 0.0415864 +-0.053835 0.0329874 0.0179508 +-0.0855039 0.140637 0.0423198 +-0.0597327 0.156046 0.0093301 +-0.052462 0.0642313 0.0336351 +0.000500084 0.12107 0.0367737 +-0.0692573 0.169753 -0.0288779 +-0.0156709 0.0385345 -0.00280448 +-0.00949582 0.118295 0.0381649 +0.0330035 0.116489 0.00476188 +0.0153369 0.0552331 -0.0286287 +-0.0105333 0.0457993 0.0483516 +0.00652975 0.0380351 0.0455331 +-0.0714995 0.101334 0.0391804 +0.0236022 0.115739 -0.0107408 +-0.0580129 0.118724 -0.0113962 +-0.0543247 0.0500125 0.0112758 +0.0587422 0.0635506 0.00411936 +-0.0589036 0.112559 -0.0155981 +-0.0640258 0.15968 -0.0562568 +-0.00990982 0.175697 -0.0247542 +0.00695815 0.0340953 -0.0204902 +-0.0591465 0.152697 -5.16463e-05 +-0.00975768 0.167025 -0.0223761 +-0.0383481 0.0417109 -0.0273458 +0.0463963 0.0778578 0.0141787 +-0.0720541 0.0777606 0.0379027 +0.0259403 0.1091 -0.0135959 +-0.0758056 0.0891863 -0.013912 +0.0429603 0.0873797 -0.00580114 +-0.0676348 0.0704852 -0.0103532 +-0.066267 0.176761 -0.0601056 +-0.013866 0.129156 0.0103484 +-0.067642 0.150503 -0.040589 +-0.0180327 0.0404537 0.0526147 +0.0183116 0.0636834 -0.0282837 +-0.078386 0.154762 0.00850622 +0.030569 0.0491561 0.035175 +-0.0622212 0.169401 -0.0515858 +-0.0565139 0.0548538 0.00566103 +0.00623573 0.0382417 0.0273828 +-0.038479 0.0945169 0.0431902 +-0.00987706 0.108745 -0.0220853 +-0.0621803 0.161575 -0.027587 +-0.0176337 0.125847 -0.00119502 +0.0328914 0.0578172 0.038629 +-0.0414935 0.0776367 0.0431734 +0.0432388 0.0804742 0.027354 +-0.0137772 0.0770735 -0.0384143 +0.0572117 0.0509068 0.011186 +-0.0689532 0.132595 -0.00851473 +-0.0655849 0.0622273 0.00026904 +-0.0535585 0.062801 0.0308747 +-0.0779359 0.154614 0.00720975 +0.00448513 0.0964789 0.0523472 +-0.060329 0.11723 -0.0118118 +0.029915 0.0430998 0.0305942 +-0.0275027 0.115261 0.0337596 +-0.0635137 0.0412627 -0.00639269 +-0.0164929 0.11134 0.0406952 +0.0292409 0.0951488 -0.0187111 +0.0324104 0.0430965 -0.00468251 +0.0317605 0.08491 0.0425067 +0.0289099 0.0929198 0.0437028 +-0.0707001 0.15817 -0.0449161 +0.0551137 0.0732038 0.0153863 +-0.0823243 0.154364 0.0217732 +-0.0715111 0.145604 0.0434169 +-0.0325077 0.0632413 0.0389915 +-0.0696524 0.0680017 0.0300044 +0.0102276 0.0809104 -0.0321098 +-0.0244999 0.049902 0.0466266 +-0.0554111 0.0574706 -0.0044262 +-0.0628667 0.101101 -0.0182166 +-0.00650089 0.0661332 0.0560881 +-0.0330903 0.15925 -0.0128209 +0.042117 0.0792074 0.0292753 +-0.085793 0.0818712 0.00648437 +-0.0594817 0.0426754 0.0236965 +-0.0539359 0.0541543 0.0107637 +-0.00998113 0.12997 0.0175362 +-0.0633398 0.0410523 0.0148679 +0.0595186 0.0696512 0.0111197 +-0.0628106 0.0420167 0.0410925 +-0.0280399 0.038261 0.000453129 +-0.0314842 0.0386701 -0.0153847 +-0.0183396 0.183004 -0.0240946 +-0.0414917 0.0662628 0.0414077 +-0.0512875 0.0335238 -0.00177633 +-0.009723 0.0684621 -0.0362531 +-0.0736747 0.166615 -0.0419946 +-0.0678387 0.0966346 -0.0163917 +-0.0609822 0.170956 -0.0597011 +-0.0778143 0.0696403 0.00741827 +-0.00249339 0.0619776 0.0560364 +-0.0574944 0.0732758 0.0411576 +0.0174045 0.0834609 0.0516215 +0.0222999 0.0360441 0.0108303 +-0.0134047 0.0981882 0.0494032 +-0.0437579 0.0335748 -0.0150071 +0.0210813 0.123852 -0.00148905 +-0.0530498 0.14867 -0.00246875 +-0.00549096 0.105886 0.0440438 +0.0181231 0.0349865 -0.00397885 +0.011218 0.0822648 -0.0313395 +-0.0785671 0.172906 -0.0416992 +-0.0304948 0.094646 0.0448519 +-0.0315011 0.101567 0.0426346 +-0.0867319 0.116264 0.0471164 +-0.0745642 0.0928269 0.03994 +-0.0287411 0.0366033 0.0533099 +-0.0733382 0.158682 -0.00576511 +-0.011641 0.172783 -0.0205328 +-0.0261276 0.166758 -0.01752 +0.0323797 0.117481 0.0145242 +-0.073083 0.166616 -0.0429976 +0.00318323 0.0894801 -0.0335291 +-0.0592544 0.0696245 0.0378273 +0.00902499 0.0346466 0.0239397 +-0.0614627 0.0334736 0.00162861 +-0.081048 0.154699 0.0221975 +-0.0337735 0.0765809 -0.0265027 +-0.0440788 0.0336672 -0.00594116 +-0.0501186 0.0375352 0.0462556 +0.0383972 0.0931984 -0.0106151 +-0.0507798 0.0488052 0.0196439 +0.0480167 0.0525694 0.0306027 +-0.0715181 0.0657302 0.000515199 +-0.0584278 0.0383351 -0.00941724 +-0.0484961 0.0987927 0.0435149 +-0.00449408 0.088412 0.0569078 +0.00197552 0.0378956 -0.000532016 +-0.0538466 0.0665391 0.0363755 +-0.0736039 0.148578 -0.0278556 +-0.0406505 0.117474 -0.0142631 +-0.0354963 0.0690808 0.0415601 +-0.063566 0.148289 0.0378536 +0.0187266 0.0350257 0.0273865 +0.00460237 0.0388981 -0.00652166 +-0.0775459 0.0688051 0.0117853 +-0.0880987 0.13916 0.0101984 +-0.0871517 0.106348 0.0123653 +-0.0867616 0.0833332 0.0134846 +-0.053009 0.0343093 0.0275811 +-0.0793348 0.0980896 0.0346601 +-0.0751339 0.0669087 0.0157231 +0.0158163 0.0344928 -0.00398192 +-0.0754309 0.0981509 0.0378194 +-0.0695415 0.15615 0.0130838 +0.00196735 0.0370051 -0.0146847 +-0.0711264 0.142566 -0.0097279 +-0.0202009 0.17418 -0.0222934 +-0.0315791 0.125791 0.0170798 +-0.0460989 0.157633 -0.00826241 +-0.0164967 0.0701922 0.0547571 +0.0456793 0.0890097 0.00617442 +-0.0263303 0.0336202 -0.0227625 +0.0458885 0.0778077 0.00419775 +-0.0613708 0.044683 0.0409908 +0.00384566 0.0341227 -0.0209701 +-0.0771455 0.156966 -0.0119003 +0.0355806 0.113279 0.0157103 +-0.036902 0.0362143 0.0131672 +-0.0532397 0.146242 0.0224016 +-0.0474989 0.107059 0.0399589 +-0.0857477 0.109049 0.020349 +-0.0892569 0.122633 0.00330914 +0.054626 0.0562289 -0.00078591 +-0.0161012 0.16832 -0.0147108 +-0.0788763 0.0949177 -0.010577 +0.026592 0.0578126 -0.0217526 +-0.061825 0.164563 -0.0576805 +-0.0210306 0.180146 -0.0147237 +-0.0474984 0.0833402 0.0443799 +-0.0884317 0.131079 0.0440854 +-0.0591643 0.0341749 0.0263998 +0.0381002 0.078079 0.0357853 +-0.0515897 0.146262 0.0154112 +0.0121111 0.116449 0.0370148 +-0.0414388 0.033531 0.00382893 +-0.0200653 0.172726 -0.0151523 +-0.0170332 0.164657 -0.0177746 +-0.0212056 0.0336704 -0.0218021 +-0.0696662 0.0710058 0.0344116 +-0.0516682 0.152149 0.0128837 +-0.0125103 0.0687513 0.0543288 +0.0366353 0.0982561 -0.0107953 +-0.0789343 0.0700266 0.0104198 +-0.0897898 0.136552 0.0342 +-0.0127086 0.0383825 0.00890404 +-0.0624498 0.166273 -0.0455815 +0.0326592 0.0619445 0.0401066 +-0.0457467 0.132003 0.0161756 +-0.0886572 0.111878 0.019323 +-0.0532618 0.0335957 0.00317772 +-0.0164951 0.109966 0.0413377 +0.0543768 0.0731861 0.0106539 +-0.0174802 0.127364 0.0206736 +0.0567172 0.0621967 0.0256596 +0.0464307 0.0792576 0.0101822 +-0.0292965 0.0818454 -0.0346209 +0.0426284 0.0719164 -0.00480026 +0.0578503 0.0648244 0.0238145 +0.0430174 0.0637781 -0.0018983 +-0.0794408 0.0768726 0.0291038 +0.0545285 0.0622324 0.0277996 +0.0441819 0.0945484 0.0191589 +-0.0284244 0.119569 -0.0104891 +-0.0778403 0.10982 0.0432074 +0.0160506 0.0754058 0.0531341 +-0.0523159 0.0517943 0.0256431 +-0.0181754 0.17123 -0.0220272 +-0.049306 0.147765 0.0110054 +-0.0405044 0.166738 0.00354035 +0.0214342 0.0934308 -0.0229317 +0.0452295 0.0931909 0.0101587 +-0.0352058 0.126987 0.0025067 +-0.0177396 0.0642294 -0.0366219 +-0.0251728 0.1712 -0.0194857 +0.0122607 0.0538397 -0.0290819 +-0.0902417 0.133644 0.00722857 +-0.0815914 0.0767239 0.0235201 +-0.0534472 0.146228 0.0234079 +0.0235949 0.0875751 0.0483132 +-0.0647237 0.158466 -0.0128094 +-0.0260145 0.0688342 -0.034504 +-0.0770801 0.15139 0.0355785 +-0.0630768 0.0336712 -0.00794186 +-0.0574971 0.10156 0.0427298 +0.0435266 0.0664036 0.0265247 +-0.0500812 0.146304 0.0115954 +-0.0568525 0.0521385 0.00567837 +-0.0436626 0.0607395 -0.0127771 +-0.0426472 0.117732 -0.0145554 +-0.0805782 0.112389 0.0458728 +-0.0161125 0.127667 0.00290411 +-0.00749701 0.0576432 0.054379 +-0.0454968 0.0775542 0.0422104 +-0.0694956 0.0958583 0.0420894 +-0.0369639 0.0346855 -0.0305537 +-0.0640756 0.151735 -0.033508 +-0.00249095 0.0718247 0.0580407 +-0.0583644 0.065095 0.0331446 +-0.0748917 0.16378 -0.0359985 +-0.0710199 0.0662278 0.0242287 +0.035425 0.0754528 0.0389267 +-0.0547392 0.075379 -0.0185175 +0.0462455 0.0784487 0.0155769 +-0.0310503 0.155166 -0.00836756 +-0.0879532 0.117604 0.0468721 +-0.0630191 0.169374 -0.0476038 +-0.0445267 0.0423569 -0.0163056 +-0.0624997 0.0818785 0.0437679 +-0.0842794 0.115636 -0.000747849 +-0.0700345 0.0631474 0.0200567 +0.0125104 0.105746 0.0436503 +-0.0795696 0.0976882 -0.00856087 +-0.0495247 0.141678 0.0113921 +0.0166382 0.123302 0.0301317 +-0.0367737 0.0813353 -0.0218258 +0.0465043 0.0597504 0.0314309 +-0.0777677 0.0975799 -0.010556 +-0.0460219 0.166062 0.00401182 +0.0609087 0.0623561 0.0101482 +-0.0403969 0.033577 0.00400031 +0.0286533 0.0578113 0.0412965 +0.0447855 0.0917675 0.0181585 +-0.0238167 0.0929782 -0.0327062 +-0.0714891 0.129823 0.0511416 +-0.0235755 0.157761 -0.0033973 +-0.0525761 0.136549 0.0284096 +-0.0177757 0.0756957 -0.0389571 +-0.0184004 0.0383962 0.0258071 +-0.0162165 0.175672 -0.0252165 +-0.0326786 0.0835446 -0.0285522 +-0.0897198 0.135201 0.0382086 +0.0138704 0.12508 0.0305218 +-0.0334383 0.0383149 -0.00250434 +0.0173372 0.059408 -0.0277846 +0.02739 0.119413 -0.00163712 +-0.055795 0.129741 0.0368819 +-0.0124902 0.0560062 0.0517339 +0.00742257 0.034128 0.000278711 +0.0312441 0.0828649 -0.019558 +-0.0804968 0.149757 0.0362335 +0.0224909 0.107012 0.0395338 +-0.0282283 0.117946 -0.012805 +-0.0726553 0.180933 -0.0546755 +-0.0683563 0.134056 0.04686 +-0.0197453 0.163025 -0.0159769 +-0.0591933 0.155725 0.01387 +-0.0522733 0.13577 -0.00153662 +0.0413723 0.0971667 -0.00382246 +-0.0920493 0.125439 0.00826634 +-0.0522301 0.0388364 0.0467813 +0.0151427 0.107227 -0.0182666 +-0.0397192 0.03358 0.00232461 +0.0373971 0.049112 -0.00639066 +-0.0698932 0.120907 -0.00884856 +-0.0667865 0.156181 0.0155153 +-0.0865635 0.0819919 0.0164862 +-0.0276111 0.0476412 -0.0256716 +-0.050104 0.0515366 0.0156131 +-0.0466794 0.0620985 -0.0127944 +-0.0784369 0.170061 -0.0360578 +-0.0714268 0.173765 -0.0397048 +-0.0313808 0.0567165 -0.0143886 +-0.0309651 0.0347631 0.0441412 +0.0067865 0.130497 0.0221788 +-0.0524448 0.149335 0.0194038 +-0.0414976 0.0860064 0.0425981 +-0.0709701 0.155369 -0.0459101 +0.00322675 0.0810659 -0.0345434 +-0.0294909 0.0917678 0.0440939 +-0.0734658 0.151245 -0.0358847 +-0.079509 0.130274 0.0528999 +-0.00249263 0.0534855 0.0544759 +-0.070992 0.0395652 0.00837515 +-0.0868944 0.122556 -0.00173403 +-0.0574179 0.0608499 0.024689 +-0.0424855 0.09447 0.0423231 +-0.00342977 0.0386245 0.00511046 +-0.018769 0.037629 -0.017491 +-0.0527937 0.0869491 -0.0216809 +-0.0846182 0.106299 0.024344 +0.0443742 0.0818795 -0.000800454 +-0.0894613 0.148789 0.0111841 +-0.0867708 0.110409 0.0193573 +-0.0310025 0.176085 -0.0150686 +0.00863383 0.115058 0.0390007 +-0.0408994 0.163853 0.00394115 +-0.057289 0.0707546 0.0390509 +-0.0646832 0.0432745 0.0336962 +0.0205013 0.0892461 0.0486645 +-0.0625318 0.0662874 0.0329584 +-0.0608083 0.147764 -0.00265379 +0.00615212 0.112907 -0.0196236 +-0.0299927 0.0436118 -0.0290457 +-0.0158151 0.162561 -0.00896512 +0.00597686 0.130404 0.00157669 +0.0284244 0.0822003 0.0446831 +0.0211099 0.0605491 0.0480139 +-0.0234016 0.184697 -0.0149423 +0.00333349 0.0390305 -0.00876711 +-0.0635183 0.159851 -0.052592 +-0.0770983 0.150031 -0.00589737 +0.0214723 0.0878669 0.0490265 +-0.0679264 0.131258 0.0474463 +0.00194863 0.100763 -0.0227079 +0.00777681 0.0385776 0.0292039 +-0.022633 0.08929 0.0533197 +-0.00603192 0.127393 0.0291246 +-0.0911594 0.120221 0.0443019 +-0.0894985 0.121276 0.00330358 +-0.0368227 0.0914861 -0.023804 +-0.0530502 0.151987 0.0175947 +-0.0672887 0.121448 0.0519139 +-0.0568311 0.0912579 -0.0217399 +-0.0697681 0.0822532 -0.0170635 +-0.0874076 0.0990828 0.0243308 +-0.0355048 0.108366 0.0378272 +0.0287346 0.10342 0.0381993 +-0.0860991 0.0964962 0.0273389 +0.0321886 0.108821 -0.00928902 +-0.0781375 0.103077 -0.00856917 +-0.0630075 0.0458305 0.00872119 +-0.0737672 0.068042 0.0238437 +-0.0863239 0.111846 0.0325401 +-0.00949559 0.10164 0.0439977 +-0.0902184 0.117255 0.00530427 +-0.075404 0.0914629 0.0394057 +-0.0453927 0.0336614 -0.0191153 +-0.0827835 0.0790493 0.0255103 +-0.0912019 0.132413 0.0272298 +-0.0564798 0.081975 0.044689 +-0.072928 0.148723 -0.0327819 +-0.00163455 0.0466691 -0.0289171 +-0.0665675 0.0355377 -0.00701232 +-0.000953404 0.100702 0.0462281 +-0.00881786 0.169637 -0.0227487 +-0.0201288 0.165284 -0.0176913 +-0.0859703 0.127103 0.0488324 +0.0255102 0.106068 0.0387825 +0.0570523 0.0522954 0.00619533 +-0.0407044 0.0491484 -0.0113833 +-0.0394747 0.168236 0.00277528 +-0.0690053 0.160967 -0.0519594 +0.0161135 0.0534638 0.0477167 +0.0284604 0.079188 -0.0220838 +0.0113708 0.0523816 -0.0287924 +0.0393128 0.0955964 -0.00780286 +-0.020906 0.0387029 0.0322136 +-0.00871553 0.0642094 -0.0357226 +-0.0547883 0.08548 -0.0214211 +-0.0725291 0.0901409 0.0413911 +-0.0566631 0.0629472 -0.00640536 +0.00234532 0.0524899 -0.0301138 +-0.0938956 0.118755 0.0202995 +-0.0414996 0.0846033 0.0426094 +0.00904636 0.090083 -0.0314826 +0.00730102 0.131 0.00524198 +-0.0637681 0.0809918 -0.0188675 +-0.0414945 0.041025 0.0428519 +-0.087002 0.140499 0.00821758 +-0.0709364 0.151841 0.036169 +-0.0634902 0.106988 0.0392647 +-0.0628225 0.0910404 -0.0189489 +-0.0105509 0.165091 -0.0177492 +-0.00157082 0.0341515 -0.0183868 +-0.0378749 0.105661 -0.0201869 +-0.0689412 0.079144 0.0404114 +-0.0239658 0.0335277 -0.0259671 +-0.0732183 0.172207 -0.0490431 +-0.0205007 0.0971766 0.0453281 +-0.0778797 0.109167 0.0401678 +0.000488577 0.0965409 0.0535304 +-0.0172908 0.177187 -0.018141 +0.00409629 0.128905 0.0269756 +0.0212668 0.080528 -0.0265872 +-0.0484872 0.0931824 0.0442201 +-0.0703872 0.161044 -0.0469664 +-0.0556945 0.0334591 0.00641451 +0.043113 0.0972735 0.00118522 +-0.0465526 0.147719 0.00793526 +-0.0620051 0.0336477 0.00854436 +-0.0789484 0.130998 -0.00538086 +-0.0329884 0.0347673 0.0437059 +-0.011676 0.0389222 -0.00979553 +-0.0102112 0.168384 -0.01842 +-0.058489 0.0747585 0.0420339 +0.0115041 0.129313 0.00109395 +-0.0186879 0.0554617 -0.0328673 +-0.0198225 0.168315 -0.0130587 +-0.013087 0.0382629 0.0179922 +0.0130281 0.0916311 -0.029044 +0.0271142 0.0463333 0.0371793 +-0.0618303 0.167813 -0.0535931 +0.0164903 0.113991 0.0376096 +-0.0592845 0.0336203 0.0127024 +-0.0728419 0.0642516 0.016748 +-0.0527116 0.12267 0.0360612 +-0.091424 0.144749 0.0231531 +0.0225812 0.0946281 -0.0221802 +-0.073319 0.153662 0.0322986 +-0.0384844 0.109782 0.036904 +-0.0551177 0.156069 -0.00176933 +-0.0195075 0.0512747 0.046374 +0.0374508 0.109679 0.00217662 +-0.0624744 0.163093 -0.0485882 +-0.0482041 0.0335795 -0.00119996 +0.0115865 0.127977 -0.0019288 +0.00494704 0.131338 0.0186496 +0.00228726 0.131702 0.0133903 +-0.0890002 0.134996 0.00522535 +0.0114372 0.12283 -0.0103617 +-0.0719092 0.180772 -0.055937 +-0.0144633 0.051615 0.0495133 +0.0147782 0.034634 0.0233109 +-0.0647828 0.177875 -0.0546137 +-0.0882908 0.103675 0.012381 +-0.0631313 0.0343469 0.025414 +-0.0255881 0.169753 -0.0108444 +0.0323006 0.0361518 0.00522301 +-0.0682938 0.06404 -0.00150269 +-0.0705485 0.167591 -0.022181 +0.0271973 0.0508207 -0.0197147 +-0.01565 0.10151 -0.0235687 +-0.0233444 0.0380443 0.0215084 +-3.10615e-05 0.0346258 0.0437307 +-0.0391691 0.162354 0.00112683 +-0.0657552 0.0422954 0.0115704 +-0.0745006 0.142795 0.0461595 +0.0473913 0.0422357 0.0119475 +0.0144595 0.121944 0.0333941 +-0.00358089 0.036197 -0.0248262 +0.0394746 0.0459091 0.0309432 +-0.0744487 0.141666 -0.00675172 +-0.0615813 0.0380878 0.0442214 +-0.0393467 0.0392853 0.042122 +-0.0229052 0.0945537 0.0478017 +-0.0281182 0.0563778 -0.0244009 +-0.0325146 0.112544 0.0353443 +0.0114695 0.0949418 0.0507264 +-0.027899 0.0377311 0.0244577 +-0.0247344 0.0668597 -0.034525 +-0.0623338 0.163141 -0.0335899 +0.0341266 0.0993109 -0.0131459 +-0.0130965 0.169821 -0.0173751 +0.0250182 0.11137 0.036342 +-0.0513993 0.14316 0.0173798 +-0.0521465 0.121207 0.0350569 +0.0134264 0.0403382 -0.0227982 +-0.0919004 0.143349 0.0181646 +0.0256492 0.0831048 -0.024123 +-0.0614955 0.0973435 0.04311 +0.0110632 0.0360404 -0.022358 +-0.0702704 0.159573 -0.0469358 +-0.0135146 0.181607 -0.0231689 +0.0462675 0.0778418 0.00718957 +-0.057322 0.0452663 0.0256799 +-0.0473932 0.0337786 -0.0140697 +0.0180643 0.0577618 0.0488361 +-0.0840242 0.151932 0.0065796 +-0.0547337 0.0738545 -0.0174125 +-0.0647273 0.156687 -0.0474505 +-0.0184955 0.0513594 0.0472431 +0.0314014 0.0491212 -0.0073371 +-0.0336406 0.0339783 -0.0207966 +0.0302861 0.0722616 -0.0207987 +-0.0707237 0.135491 0.0487549 +0.0373244 0.0861524 0.0364715 +-0.0839874 0.129456 -0.00327263 +-0.0579656 0.0599816 -0.000771046 +-0.0374903 0.0917378 0.0437278 +-0.0421167 0.157651 -0.00983865 +-0.0774831 0.151439 -0.0048996 +-0.0664918 0.167987 -0.0292876 +-0.0348246 0.12664 0.0173665 +0.0288107 0.113482 -0.00830654 +-0.0939345 0.122834 0.0252963 +-0.0236453 0.0906062 0.0514725 +-0.0623453 0.151603 -0.000787959 +-0.0394885 0.0520168 0.0393574 +-0.0228668 0.103033 -0.0236969 +-0.0205005 0.115412 0.03703 +-0.0206187 0.158806 -0.0102834 +-0.00380864 0.0840797 -0.0375505 +-0.0846424 0.139002 0.00130344 +-0.0244403 0.0384399 0.0299279 +-0.0256136 0.0707601 0.0441795 +0.0431065 0.0733659 -0.00379081 +-0.0334964 0.0575473 0.0382542 +-0.0732341 0.100848 0.0383652 +-0.0417523 0.0392031 -0.0263092 +-0.0600247 0.0335577 0.00903367 +0.0319454 0.0782138 0.0427262 +-0.0478947 0.122501 0.0288841 +-0.0215102 0.0435311 0.0534788 +-0.0175036 0.0357848 -0.0270478 +-0.0659221 0.115196 -0.0104247 +-0.0452512 0.0574076 0.0387158 +-0.0318518 0.100063 -0.022678 +-0.062214 0.131105 0.0398962 +-0.0570307 0.151068 0.0316808 +-0.0390807 0.159219 -0.0117734 +-0.0575439 0.0421232 0.0457366 +-0.0434958 0.166715 0.00391556 +0.0435215 0.0973118 0.0181533 +0.0364745 0.0384289 0.0206775 +0.00783805 0.034796 0.0434029 +0.00550647 0.0519309 0.0530702 +-0.0452904 0.125307 0.0239255 +0.0384949 0.0469555 0.0314897 +-0.0344994 0.0860255 0.0426749 +-0.0604675 0.0334377 0.00185915 +0.00564306 0.109569 0.0416563 +-0.0341393 0.169665 -0.0151103 +0.0252174 0.115733 -0.00872379 +-0.0432318 0.0365168 -0.0263599 +-0.0648058 0.0881399 -0.0188881 +-0.0113055 0.0420913 0.0500945 +-0.0768733 0.0742923 -0.00658087 +-0.0718355 0.0757492 0.0369191 +-0.00552934 0.126815 -0.00649473 +-0.015298 0.113338 -0.0180384 +-0.0658513 0.168603 -0.0333515 +-0.0769239 0.160393 -0.0146649 +-0.0789031 0.0913518 0.0358575 +-0.0622512 0.175627 -0.0566298 +0.0427075 0.100107 0.0161639 +-0.0122664 0.0420539 0.0504523 +-0.0593768 0.116855 0.0386274 +-0.0207916 0.117992 -0.012906 +-0.0209967 0.0893299 0.0545201 +-0.0293388 0.0522666 -0.0213646 +0.042 0.102859 0.00616839 +-0.0915744 0.128321 0.0372423 +-0.0745556 0.104899 0.0367465 +-0.0874341 0.0860792 0.0144694 +-0.0893403 0.0983511 0.0184032 +0.0265834 0.0915781 0.0456097 +0.0111147 0.0359709 0.0304167 +-0.0251149 0.163764 -0.0159045 +0.0379525 0.0888235 0.0356698 +-0.0308593 0.102934 -0.0225503 +-0.0849458 0.0817985 0.00448942 +0.016843 0.101962 -0.021958 +-0.0602648 0.153206 0.0324327 +-0.00109974 0.118227 -0.0153259 +-0.0277867 0.0904111 0.0457123 +-0.0632329 0.149656 -0.0246848 +-0.0378318 0.0943285 -0.0232947 +0.00942926 0.0360304 0.00452751 +0.00308943 0.0346383 -0.0160359 +-0.0629538 0.164686 -0.0335942 +-0.0707579 0.0639499 0.00302292 +-0.0806378 0.0734203 0.0185511 +-0.0114878 0.0502762 0.0503958 +-0.051624 0.0589527 -0.00929309 +-0.0724662 0.156284 0.0178613 +-0.0755506 0.0791122 0.0357048 +-0.0599662 0.0605914 -0.00103222 +-0.0407972 0.128426 0.00338476 +-0.0685036 0.0972643 0.0418698 +0.0384545 0.081427 -0.0137424 +-0.0869304 0.137738 0.00419643 +-0.0915894 0.118845 0.0433559 +-0.0375104 0.0344317 -0.0164034 +0.0132714 0.0779991 -0.0309033 +-0.000460653 0.0717499 0.0573883 +-0.0689415 0.128234 -0.0091158 +-0.00449889 0.0389099 -0.0139692 +-0.00687105 0.104506 -0.0230032 +-0.0625734 0.0333471 -0.00389969 +-0.0466818 0.0680053 -0.0151447 +0.0325669 0.0564098 0.0381516 +-0.00676687 0.0770295 -0.0375725 +0.031043 0.0535582 0.0376713 +-0.0252324 0.0383969 -0.00646059 +-0.0781312 0.100777 0.0347873 +-0.0351912 0.0448435 0.0445858 +-0.0618482 0.0460583 0.00900481 +-0.0510378 0.148698 -0.00295565 +-0.0758068 0.170822 -0.0449998 +0.0228822 0.0407495 0.0397886 +-0.0556881 0.123137 -0.00801327 +0.041209 0.10285 0.0181659 +-0.057716 0.154704 0.0245626 +-0.0356589 0.0394362 0.046602 +-0.018436 0.0384553 -0.00144245 +-0.0725091 0.147853 -0.0287195 +0.0195403 0.0672509 0.0492981 +-0.00949487 0.11143 0.0422271 +0.0387128 0.0407096 0.0245464 +0.0274937 0.0354669 0.00307886 +0.0251817 0.0344441 0.0110044 +-0.0734653 0.11597 0.0519419 +-0.0517405 0.0367791 -0.0118947 +-0.0313584 0.0347088 0.042355 +-0.0271594 0.0577744 0.0376032 +0.0289959 0.083514 0.0437755 +-0.0609886 0.0421383 0.0435161 +-0.0642758 0.0379734 0.0412454 +-0.0669901 0.171097 -0.0394962 +0.00201718 0.0342688 0.0083365 +-0.0376227 0.0519888 -0.0106273 +-0.0604976 0.0761414 0.0420756 +0.0231651 0.0624431 -0.0251426 +-0.0444966 0.100126 0.0423688 +-0.0434704 0.0888362 0.0427012 +-0.0739012 0.112096 -0.00769672 +0.0113285 0.0381477 0.0446991 +0.0606492 0.0595518 0.0111602 +-0.0344028 0.0453249 -0.0266763 +-0.0238559 0.100178 -0.023968 +0.0124979 0.0363631 -0.0219171 +-0.0386629 0.0606634 -0.011982 +-0.0845122 0.0778323 0.0175087 +-0.0447652 0.0811738 -0.019998 +-0.0325802 0.0708663 -0.0234636 +-0.0428489 0.09852 -0.021578 +0.0343638 0.0491351 -0.00656846 +-0.00173319 0.108975 -0.0214067 +-0.0513914 0.0516798 0.0216239 +0.00608628 0.101527 -0.0214717 +-0.0746196 0.147202 -0.0138555 +-0.0464944 0.0733156 0.0418074 +0.0275533 0.0550749 -0.019815 +-0.0617588 0.0455326 -0.00130544 +-0.0627435 0.14749 -0.0135844 +0.0114636 0.0347788 0.020691 +0.0413154 0.0451948 0.0296022 +-0.0855482 0.149965 0.0308161 +0.045359 0.04899 -0.00489955 +0.000884291 0.038993 0.0274224 +-0.086804 0.0846773 0.00948205 +0.00217921 0.090906 -0.033534 +-0.0074916 0.0518487 0.0520774 +-0.000472995 0.0746288 0.0583091 +0.00707409 0.0348007 0.0234037 +0.0191098 0.127253 0.00673134 +-0.00312412 0.123427 0.0346626 +-0.0251492 0.0379137 0.0122303 +-0.030188 0.124116 0.0205603 +-0.0326284 0.178159 -0.00692862 +-0.0371849 0.0430027 -0.0273252 +0.000516139 0.0703294 0.0566091 +-0.061834 0.155291 -0.0275862 +0.0144787 0.103102 0.0461637 +-0.0601666 0.138122 0.0340792 +0.0447845 0.0903596 0.0201575 +-0.0175794 0.128153 0.00899134 +-0.0654784 0.133956 0.0422213 +-0.078379 0.0698242 0.00895098 +-0.0544145 0.0561001 0.0105768 +-0.0166845 0.0625881 0.0524778 +0.0283147 0.0712973 0.0426773 +0.00750546 0.105745 0.0420743 +-0.0365184 0.126747 -0.000928274 +-0.0297912 0.154227 -0.00467156 +0.0242356 0.0804257 -0.0251216 +-0.0507602 0.0797387 -0.0202693 +-0.0399713 0.112687 -0.0172474 +0.0170749 0.128355 0.00741174 +-0.0399375 0.150681 0.00347523 +-0.0608612 0.0435863 0.0137318 +-0.0365883 0.0485443 -0.0138981 +-0.0910601 0.132402 0.0282222 +-0.0795844 0.0759236 -0.00451678 +-0.0809274 0.12805 -0.00535084 +-0.0711513 0.132664 0.0498849 +0.0150413 0.120568 0.0342385 +0.00849911 0.119651 0.036768 +-0.0569109 0.033599 0.014995 +-0.0689033 0.0887623 0.0428815 +-0.020138 0.166773 -0.018707 +-0.0815894 0.0926183 0.0328436 +0.00319943 0.0866473 -0.0337836 +-0.0528475 0.140082 0.0254195 +0.0217844 0.118301 -0.00950952 +-0.0305318 0.0734349 -0.0315361 +-0.0355385 0.040818 0.0464546 +-0.0446309 0.0563208 -0.0114385 +-0.0779756 0.13395 -0.00568102 +-0.0924453 0.114684 0.0163206 +-0.0427865 0.0855262 -0.0214717 +-0.030041 0.0819074 -0.0335886 +-0.0350329 0.037518 0.0477355 +-0.0574727 0.0791252 0.0438951 +-0.0347822 0.124221 0.0233214 +0.0396853 0.0674479 -0.00978879 +-0.0280887 0.123076 -0.00418723 +-0.0357494 0.0383801 -0.010405 +-0.0896534 0.0983503 0.0154045 +-0.0393744 0.174134 -0.00504658 +-0.00548988 0.121033 0.0366102 +-0.0493281 0.143211 0.0074004 +-0.0618749 0.161566 -0.0365945 +-0.00486561 0.103096 -0.0233724 +-0.0158939 0.0387206 -0.00487532 +-0.0136298 0.0943834 -0.0340901 +-0.0708677 0.158014 -0.00345716 +-0.0679292 0.0674285 0.0308631 +-0.0698001 0.0894083 -0.0167108 +-0.0708742 0.117963 -0.00822963 +0.0544559 0.0679536 0.0254119 +0.0505447 0.0640078 -0.00213219 +-0.0328813 0.11004 -0.0184872 +-0.0329481 0.169751 -0.00390259 +-0.0730465 0.158091 -0.00419381 +-0.0642284 0.165303 -0.0599757 +-0.0393381 0.149359 -0.00118821 +0.027659 0.115893 0.031317 +0.00307915 0.03925 0.0330573 +-0.0268824 0.0338882 -0.0212482 +-0.076206 0.0892711 -0.0135327 +0.036558 0.0887304 -0.0159156 +-0.045503 0.0478046 0.0396725 +-0.00457894 0.0383459 0.0160278 +-0.014359 0.102532 0.0433738 +-0.0263218 0.038308 -0.00105771 +-0.0252694 0.0564528 0.0400125 +-0.0745038 0.137269 0.049596 +-0.0478639 0.102799 -0.0211716 +-0.0698236 0.144589 -0.0179026 +-0.00449355 0.112805 0.041803 +0.0395793 0.107012 0.0171684 +0.0320331 0.117177 0.0215305 +0.0319133 0.103439 0.0357737 +-0.0232571 0.160328 -0.0132723 +-0.0368559 0.101427 -0.0217814 +-0.0779001 0.105799 -0.00757653 +-0.0719733 0.155857 0.00930845 +-0.0667659 0.0664754 0.0301739 +-0.0116086 0.0384341 0.0253641 +-0.0828253 0.0815398 -0.00255091 +-0.00864403 0.0481881 -0.0304747 +-0.0695881 0.0687436 -0.00572614 +-0.053703 0.069339 -0.0141095 +-0.0875622 0.147255 0.0314849 +-0.060703 0.146825 0.0369155 +0.0559661 0.0563559 0.00119345 +-0.0899141 0.140577 0.0142032 +0.0290556 0.0480892 -0.0107335 +-0.0444676 0.0959215 0.0428438 +-0.0126944 0.0614008 -0.0362648 +-0.00712049 0.126279 0.0302479 +0.00717458 0.125139 0.032446 +0.0130051 0.123122 0.0330958 +-0.0658939 0.119442 -0.00885604 +-0.0535827 0.0550746 0.0114399 +0.00820634 0.0865719 -0.0325157 +-0.0358588 0.100033 -0.0223224 +-0.0816885 0.110103 -0.000571623 +-0.0517049 0.0693137 -0.014154 +-0.0304078 0.0499703 0.0425042 +0.0090211 0.0602846 0.0533569 +-0.0102692 0.126825 -0.00441849 +-0.0412575 0.123881 0.0239565 +-0.0304041 0.179805 -0.0103906 +-0.0119972 0.115638 -0.0165051 +0.0413233 0.102851 0.0171643 +-0.032272 0.0343596 0.0389523 +-0.0854712 0.0791996 0.00951147 +-0.0138083 0.082755 -0.0391488 +-0.0256473 0.0335939 -0.0244827 +0.0452831 0.0511563 0.0319003 +-0.0829803 0.153189 0.00837374 +-0.0435404 0.0351992 0.0428237 +0.0114184 0.0389206 -0.0228692 +0.0440394 0.0405103 0.0110966 +-0.0218345 0.0725147 0.0516294 +0.0173744 0.124995 0.027504 +-0.0771042 0.163136 -0.0202013 +0.0282746 0.0494546 -0.0167442 +-0.0703245 0.0805604 0.0403227 +-0.0558701 0.154311 0.0223113 +-0.0790495 0.0785612 -0.00658771 +0.0023439 0.122378 0.0350184 +-0.0220309 0.0609111 0.0451603 +-0.0853195 0.117662 0.0484974 +-0.0580048 0.0366442 0.0464062 +-0.00844255 0.0358982 -0.0250895 +0.0243113 0.119024 -0.0062727 +-0.0558892 0.141955 -0.00229647 +-0.0642262 0.115635 0.0441038 +-0.0719279 0.153998 -0.0419035 +0.0423481 0.0732982 -0.00579253 +0.0103113 0.0595614 -0.0298764 +-0.0818376 0.116236 -0.00283916 +0.0590795 0.0663557 0.00613696 +-0.039497 0.0436994 0.0413132 +-0.0702982 0.0846763 0.0415948 +-0.0167436 0.068615 -0.0382083 +-0.0690033 0.127063 0.0512206 +-0.0485018 0.102883 0.0409949 +-0.0541716 0.144673 0.0274046 +0.0243198 0.0564051 0.0438207 +-0.0308589 0.0382072 0.0517831 +-0.00548321 0.119649 0.0378412 +-0.0606463 0.0434636 0.0431332 +-0.008712 0.171156 -0.0257232 +-0.0444845 0.0846726 0.04342 +-0.0897848 0.135174 0.0342114 +-0.00690926 0.0349718 0.0473534 +-0.0808786 0.122166 -0.00503067 +-0.0779103 0.070378 0.00551561 +0.0134856 0.129689 0.00607818 +-0.0225837 0.0666453 0.0469216 +-0.0525012 0.046573 0.0420391 +-0.0444858 0.091688 0.0430295 +-0.0394965 0.0662956 0.0417788 +0.00897384 0.0364118 0.0277765 +-0.0782046 0.166684 -0.029962 +0.0192461 0.0777761 -0.0276631 +-0.0483417 0.137106 0.010396 +0.0258883 0.12226 0.00355652 +0.0398565 0.0384519 0.0122163 +-0.0408758 0.107069 -0.0201235 +-0.0315055 0.0689302 0.0397623 +-0.068912 0.148468 -0.034342 +-0.0496681 0.0705507 0.0391462 +0.00414266 0.131018 0.00407154 +0.0204354 0.100784 0.0455262 +-0.0587133 0.0708136 -0.0155469 +-0.00369415 0.0386815 0.0249596 +-0.0546088 0.0601814 -0.0071333 +0.0277597 0.0984362 -0.0181936 +0.00136992 0.128685 0.0274437 +-0.0166951 0.0555255 -0.0336624 +0.0054852 0.109984 0.0416767 +-0.079955 0.130987 -0.00485489 +-0.00265109 0.0497012 -0.030809 +-0.0697849 0.145343 0.0431021 +-0.0903934 0.12698 0.0433203 +-0.0409656 0.122163 0.0270528 +-0.056363 0.13673 0.0325483 +-0.00422605 0.0355815 -0.0164762 +-0.0158888 0.123338 -0.00654807 +0.0233356 0.0389315 -0.00470356 +-0.0377622 0.0797629 -0.0199128 +-0.0274204 0.12046 -0.00942796 +-0.0745042 0.0669844 0.00328572 +-0.0544992 0.0400332 0.0469658 +-0.022854 0.100181 -0.0240549 +-0.0748342 0.156367 -0.00257451 +0.00532997 0.0389553 -0.00830106 +-0.0591545 0.129731 0.0390508 +-0.0365933 0.117132 -0.0139142 +0.00710349 0.126169 0.0309735 +0.00420316 0.0838546 -0.0341295 +0.0424932 0.0541962 0.0323753 +-0.0447782 0.039524 -0.0212903 +0.0130456 0.0946785 -0.0262358 +0.0515873 0.047616 0.00226708 +-0.0226971 0.059684 -0.0328522 +-0.0489531 0.117804 -0.0145786 +-0.00521852 0.130779 0.0091953 +-0.0745798 0.155493 -0.021916 +-0.0211637 0.171222 -0.0207379 +-0.0681899 0.15036 -0.0415571 +-0.0645431 0.0356401 -0.00785526 +0.0444401 0.0776895 -0.00177282 +0.0191352 0.0356125 -0.00767677 +-0.0879901 0.0928029 0.00642738 +-0.0274823 0.0617236 0.037721 +0.0406194 0.104193 0.00117617 +-0.0205806 0.0342261 -0.0203167 +0.052283 0.0559902 -0.003254 +-0.0826845 0.0884898 0.0312484 +-0.0354914 0.0719062 0.0418497 +0.00222867 0.0810902 -0.0349213 +-0.0247631 0.123128 0.0239793 +0.00210157 0.111597 -0.0202587 +-0.029962 0.122606 -0.0056563 +-0.0642809 0.173904 -0.0612545 +0.0164873 0.128764 0.0128859 +-0.0290915 0.0334798 -0.0269263 +0.0563251 0.0686891 0.0234174 +0.0388229 0.0428364 0.0281231 +-0.0364553 0.171237 0.000642707 +-0.0695352 0.0422413 0.00168563 +0.0115865 0.119151 -0.014401 +-0.0445078 0.128204 0.0197407 +-0.0735439 0.101276 0.0379813 +-0.0842997 0.131249 0.0498733 +-0.0456134 0.0424471 -0.0132755 +0.00124079 0.0740793 -0.0353703 +-0.0590284 0.155612 0.0197248 +0.00626131 0.0696979 -0.0331897 +-0.0465413 0.123419 -0.0104793 +-0.0145087 0.0587885 0.0518852 +-0.0412993 0.127471 0.0164976 +-0.0621264 0.0457845 0.0326787 +0.00861617 0.0348422 -0.0132521 +-0.0699384 0.129684 -0.00901632 +-0.0174184 0.0961382 -0.0299203 +-0.0408477 0.0999502 -0.0215042 +-0.0629342 0.109643 -0.0151294 +-0.0588992 0.0593658 0.0203903 +-0.0622614 0.0594461 0.0178467 +0.0503092 0.0575099 -0.00459296 +0.0328071 0.0781213 -0.0187889 +0.0297936 0.0354746 0.0165125 +-0.0592597 0.0343664 0.034953 +-0.0736653 0.0761112 -0.0107553 +0.0358581 0.0686798 0.0377462 +-0.0814983 0.102013 0.0310531 +0.0072631 0.0968089 -0.0265119 +-0.0107695 0.0756601 -0.0381615 +-0.0665448 0.142647 -0.010737 +-0.0861837 0.0868588 0.0248974 +-0.0323987 0.114036 -0.016697 +-0.0526124 0.143167 0.0204083 +-0.00749979 0.118315 0.0383098 +-0.0366574 0.0591917 -0.011518 +-0.0854765 0.145991 0.0364919 +-0.0590102 0.131118 -0.0069845 +0.0099878 0.0342067 -0.0142754 +0.0406313 0.0833746 0.032449 +-0.0377389 0.0753784 -0.0182557 +-0.0265179 0.111211 0.0374625 +-0.0457781 0.109842 -0.0182449 +0.0106021 0.12463 0.0322012 +-0.0714609 0.172223 -0.0354286 +-0.0918002 0.143353 0.0191654 +0.009256 0.0681484 -0.0312392 +0.00426025 0.0352382 0.0224392 +-0.0497576 0.0782604 -0.019072 +-0.0628575 0.0953598 -0.0185102 +0.0594691 0.0677866 0.0081304 +0.0120479 0.124912 -0.00663019 +-0.0896003 0.111903 0.0133388 +-0.000572916 0.131478 0.0109076 +-0.0856485 0.103181 0.0252723 +-0.0825849 0.0762413 0.018536 +0.0357614 0.089262 -0.0164786 +-0.0853874 0.0978708 0.0280062 +-0.0250231 0.0373676 -0.0184933 +-0.0224668 0.0384735 -0.00782567 +-0.0215612 0.127036 0.0148264 +0.0375018 0.0527008 0.0316063 +0.0132903 0.0644915 0.0525417 +0.021025 0.0444507 -0.0197096 +-0.0230202 0.0380885 0.0125034 +-0.0190143 0.123258 -0.00649836 +-0.0634892 0.101502 0.0420523 +-0.0022961 0.120938 -0.0122094 +-0.0682754 0.155222 0.00480981 +-0.0105391 0.0444694 0.0492224 +-0.0314884 0.0988001 0.0440684 +-0.0162822 0.113495 -0.0182068 +0.0427502 0.0832247 0.0284671 +-0.0317184 0.124145 0.0214762 +-0.0228243 0.0868132 -0.0375213 +0.0112412 0.122679 0.0339481 +-0.0624726 0.093208 0.0448109 +-0.0195149 0.0474114 0.0506124 +-0.0305029 0.105682 0.0404793 +0.0297926 0.0510441 -0.0147439 +-0.0660587 0.0336733 0.00769062 +0.01375 0.126078 -0.00389468 +0.00623348 0.0768314 -0.0342539 +0.00723812 0.0725784 -0.0338132 +-0.0345032 0.0747169 0.0417978 +-0.0533429 0.0572662 -0.00744815 +-0.0588626 0.0344147 0.0367317 +-0.0597544 0.151092 0.0347772 +-0.066041 0.156288 0.0201296 +-0.0519452 0.0542248 0.0130044 +-0.0536545 0.154299 0.0129697 +-0.0553709 0.131821 -0.00535733 +-0.0165812 0.0355875 -0.0267111 +-0.0671293 0.149176 -0.0346332 +0.0364911 0.112064 0.0146153 +-0.0678122 0.0908837 -0.0169858 +-0.0433492 0.123979 0.0232099 +0.0233446 0.0489622 -0.0213372 +-0.0401353 0.162183 -0.0119788 +-0.0436993 0.0680874 -0.0160622 +-0.0575 0.0589785 0.0215704 +0.002504 0.0605716 0.0560843 +-0.0230753 0.078299 0.0540943 +-0.0532839 0.150877 0.0224035 +-0.0536299 0.144677 0.0243972 +0.0138044 0.129402 0.00474998 +0.0390959 0.0382591 0.0140545 +-0.0935248 0.128245 0.016248 +-0.017174 0.169749 -0.0215263 +-0.00210217 0.035143 0.0464295 +0.00913637 0.105871 -0.0204027 +-0.0861865 0.0926674 0.00242789 +-0.0615271 0.0344278 0.0378839 +0.0506397 0.0652197 -0.00133714 +-0.0859779 0.129848 0.0487451 +-0.0269007 0.0388242 0.0362546 +0.0349035 0.0987755 -0.0125611 +-0.0895593 0.13929 0.0311867 +0.0210026 0.126515 0.0102791 +0.0155029 0.119565 0.0348769 +-0.0660877 0.178333 -0.0536421 +-0.0134986 0.0911752 0.0564813 +-0.0462738 0.0671086 0.039469 +-0.0691002 0.0421453 0.000699576 +0.0106377 0.0658124 0.0539651 +-0.0372457 0.0381548 -0.00680953 +-0.0415057 0.0396254 0.0430594 +-0.0658022 0.0335619 0.00426403 +-0.0549779 0.135599 -0.00339213 +-0.0654711 0.157635 -0.0545345 +-0.0699145 0.135483 0.0481625 +-0.0647392 0.157599 -0.0538703 +-0.0405119 0.125571 0.0212459 +-0.0408461 0.0957242 -0.0225993 +-0.0211708 0.123144 -0.00636628 +0.0528302 0.048039 0.0216552 +0.0292509 0.119574 0.0033793 +0.0456488 0.0861985 0.00518381 +-0.0697746 0.169428 -0.052035 +-0.0583932 0.146765 0.0331817 +-0.0748301 0.174171 -0.0395847 +0.0397534 0.0685495 0.0327941 +0.0603506 0.0581587 0.0121666 +-0.0615125 0.0729203 0.0397926 +0.0320567 0.106099 0.0342281 +0.0259569 0.0632491 0.0444844 +-0.017781 0.12071 -0.00976707 +-0.00292868 0.129815 0.0244395 +0.042563 0.0650705 0.0275619 +0.051394 0.0726569 0.00804397 +-0.0147356 0.124887 0.0290085 +0.0124993 0.116805 0.0367613 +-0.0095857 0.128017 -0.00170998 +-0.0353912 0.0475494 -0.0206462 +-0.0197639 0.0714243 -0.0385337 +-0.0646745 0.0721957 -0.0143162 +-0.0418918 0.129001 0.00740866 +-0.0217734 0.0713925 -0.0382795 +-0.0493632 0.1301 -0.00139208 +0.0232238 0.0822541 0.0494986 +0.0449291 0.081953 0.02316 +0.0595997 0.0567108 0.0101713 +-0.0496185 0.140151 0.0144011 +-0.0524988 0.102874 0.0411998 +0.0342709 0.0876121 0.0408726 +-0.0295799 0.174217 -0.00600797 +-0.0251232 0.165382 -0.00841584 +0.0176002 0.124344 -0.00401113 +0.054323 0.064171 -0.000208879 +-0.0129906 0.0568055 0.0517595 +-0.0751884 0.153035 0.033144 +0.0124885 0.114028 0.0382457 +0.0104651 0.0444795 0.0447526 +-0.033472 0.124985 -0.00213286 +-0.0519318 0.0352921 -0.0124585 +-0.0621937 0.156854 -0.0175927 +-0.0755066 0.11755 0.0524265 +-0.0660809 0.135405 0.0431027 +0.0020291 0.0342762 0.0137843 +0.0320171 0.111398 0.0306261 +-0.0685791 0.147786 -0.0311476 +0.0139278 0.129741 0.0148027 +-0.075709 0.170829 -0.032719 +-0.0241819 0.175647 -0.0202251 +-0.0729646 0.147133 -0.0208616 +-0.0588824 0.0997395 -0.0190365 +-0.0396703 0.036174 -0.00733977 +-0.0195581 0.181635 -0.0160858 +-0.0449923 0.0381195 -0.0222607 +-0.0298707 0.101527 -0.0228594 +-0.0447239 0.169659 -0.000473292 +-0.0547075 0.153861 0.0184094 +-0.00344803 0.111769 -0.0204187 +-0.048864 0.162635 -0.0057974 +-0.0837218 0.154141 0.0154269 +-0.0709606 0.172226 -0.0520527 +-0.000498029 0.0505184 0.0529377 +-0.0916834 0.116094 0.0407438 +0.029535 0.0987313 -0.0165204 +-0.0649388 0.16711 -0.0315896 +-0.00669968 0.0599043 -0.0346663 +-0.0086066 0.042026 -0.0258639 +0.0380982 0.0589726 0.0320786 +0.0284966 0.0768217 0.0447581 +-0.0365356 0.155076 0.00317988 +0.0173692 0.0476632 -0.0235115 +0.0152466 0.0765161 -0.0298116 +-0.061679 0.175513 -0.061381 +-0.03626 0.0434916 0.0442696 +0.0033481 0.0346494 0.040814 +-0.0708559 0.177779 -0.0481346 +-0.0522853 0.153955 0.0120432 +-0.00577511 0.0770351 -0.037534 +-0.0279795 0.0577645 -0.0254 +-0.0474968 0.101477 0.0417865 +0.0418115 0.0872841 -0.00879032 +-0.0272728 0.0383881 -0.00686007 +-0.0828517 0.110648 0.028886 +-0.0677301 0.181168 -0.057983 +-0.0339959 0.0752105 -0.0234884 +0.0227878 0.0350417 0.0227582 +-0.0132511 0.177151 -0.0280569 +-0.0662758 0.159515 -0.0565111 +-0.0759663 0.179251 -0.0520449 +0.0494532 0.0710682 0.00472592 +-0.0158055 0.0931896 -0.0348885 +0.0506418 0.0475027 0.0012667 +-0.0220809 0.0348313 0.0494485 +-0.0681005 0.179488 -0.0529195 +-0.0457387 0.0767861 -0.0183415 +-0.0849611 0.0883696 0.0278927 +0.0410895 0.0670315 0.0294468 +0.0123862 0.0342845 -0.0119874 +-0.0861176 0.152173 0.0250218 +0.00146529 0.0341167 -0.0177588 +-0.0847663 0.132585 0.0488829 +0.041918 0.0732584 -0.00676718 +-0.0704834 0.174975 -0.0436743 +0.0101806 0.114501 -0.0173735 +-0.0274005 0.0647434 -0.0304718 +0.00306398 0.0374048 0.023868 +-0.0908043 0.122683 0.00627651 +-0.0126271 0.0337462 -0.0239473 +0.0294467 0.0623083 -0.0198501 +-0.031353 0.158667 -0.0125849 +-0.0600161 0.129661 -0.00742185 +0.0141451 0.0740257 0.0538731 +0.0348792 0.0378052 0.00236551 +-0.0223477 0.16248 -0.006155 +0.0184989 0.11258 0.037522 +-0.0107925 0.18028 -0.0267448 +0.0112772 0.0752122 -0.0313695 +-0.0481785 0.0341964 0.00728185 +-0.0564997 0.107064 0.0398466 +-0.0510086 0.119975 -0.0128249 +-0.0142596 0.175663 -0.0267921 +-0.028881 0.124884 0.00195054 +-0.0744184 0.069256 0.0261761 +-0.0527672 0.0812315 -0.0212685 +0.0424296 0.0696684 0.0278335 +-0.0272214 0.163934 -0.00616346 +0.0566888 0.0635446 0.0256358 +0.0446243 0.0959671 0.00617079 +-0.0160443 0.174209 -0.0181164 +-0.0310058 0.156198 -0.0100049 +-0.039513 0.166742 0.00312951 +-0.0651923 0.176525 -0.0608469 +-0.0649089 0.110873 0.0375872 +-0.0545067 0.0904158 0.0449797 +0.0328041 0.0682575 -0.0177764 +0.0296649 0.110072 0.0343033 +-0.00848516 0.121007 0.0363393 +-0.0284943 0.0674472 0.03888 +0.0207654 0.126697 0.0144664 +-0.0231479 0.0919482 0.0509374 +-0.0105985 0.0406145 -0.0262787 +0.0525369 0.0651172 0.0279377 +-0.0709498 0.165209 -0.0469921 +0.0101258 0.125306 -0.00703851 +-0.0198334 0.107697 -0.0220521 +0.0228667 0.107306 -0.0156684 +0.0410305 0.0422896 -0.000687891 +-0.0687631 0.080836 -0.0170666 +-0.0685062 0.142066 -0.00982847 +-0.0288706 0.171229 -0.00855169 +-0.0870246 0.129415 0.000309032 +-0.0367401 0.0754253 -0.0187666 +-0.0231137 0.159172 -0.011899 +-0.0445 0.113887 0.0346508 +-0.0617979 0.154608 0.0289232 +0.0322191 0.117688 0.00875184 +0.00258681 0.125467 0.0322572 +-0.0668846 0.117985 -0.00889164 +-0.0560239 0.144237 -0.00161522 +-0.0939473 0.122782 0.0142819 +-0.057663 0.155278 0.0187721 +-0.0653495 0.0459059 0.00467835 +-0.0838817 0.150077 0.00420446 +-0.0574972 0.100168 0.0430053 +0.0447715 0.070791 0.0233171 +0.0114258 0.129163 0.0238841 +-0.0415072 0.0605699 0.0406995 +-0.0495023 0.0862453 0.0455995 +-0.0309567 0.166794 -0.00630909 +-0.0310964 0.125815 0.0157855 +0.0577493 0.0579199 0.00320063 +-0.00748502 0.105882 0.0440003 +-0.0594987 0.0932573 0.0451741 +-0.0584823 0.080492 0.0436889 +0.0565518 0.0722252 0.0100192 +-0.0154726 0.123613 0.0307813 +-0.017794 0.0799068 -0.038901 +-0.0670193 0.0901061 0.04379 +-0.0506534 0.0619401 -0.0109597 +-0.0284985 0.0631152 0.0376198 +0.0405765 0.0793262 0.0323176 +0.0350622 0.0909926 -0.0162992 +-0.0679473 0.136882 0.0457212 +-0.0626008 0.160001 -0.0205855 +0.0143086 0.0623633 -0.0295361 +0.00349883 0.0605728 0.0559342 +0.0235231 0.0943993 -0.0219282 +0.0425314 0.0623712 0.0287546 +-0.0352518 0.156597 0.00331287 +-0.0807586 0.0950245 -0.00854945 +-0.085825 0.114595 0.0464925 +0.0420636 0.0915328 -0.00679501 +-0.0369296 0.0455099 -0.0248207 +-0.0610521 0.0460525 0.00962048 +-0.0476199 0.057734 -0.011287 +-0.0595357 0.0400627 -0.00844467 +-0.0604419 0.114971 -0.0134731 +-0.016194 0.128088 0.0051496 +-0.0365847 0.122192 -0.00920846 +-0.0464591 0.0345029 0.0305523 +-0.0644598 0.0432795 0.035714 +-0.0241405 0.168248 -0.0186857 +-0.0743787 0.145821 -0.0108474 +0.0173308 0.0566344 -0.0283721 +-0.0548894 0.136747 0.0311423 +-0.0579822 0.0343384 0.0317603 +-0.0262958 0.0634474 0.0394208 +-0.0183558 0.127798 0.00725695 +-0.0750251 0.152273 0.0347437 +-0.0648702 0.0334576 -0.000853911 +-0.0610584 0.138406 -0.00654552 +0.0224766 0.0920198 0.0478397 +0.044722 0.0945895 0.0131657 +-0.0873336 0.126682 -0.000726608 +-0.0880434 0.125329 0.00027907 +-0.0364509 0.174337 -0.00256774 +-0.053938 0.138144 0.0289679 +-0.00559979 0.114688 -0.0175182 +-0.00635915 0.0931082 -0.0347376 +-0.0861558 0.100815 0.00240792 +0.0184724 0.0934238 0.0476306 +-0.000245612 0.0350857 0.0144067 +-0.0547132 0.153591 0.0213081 +0.0445999 0.0931357 0.00219092 +-0.0649995 0.134056 -0.00807462 +-0.0360819 0.0351453 0.0214963 +0.0444988 0.0569914 0.0320977 +-0.0597101 0.0723346 -0.0163812 +-0.0468406 0.0985145 -0.021833 +-0.0397006 0.0666136 -0.0148744 +-0.0847301 0.0966436 -0.00257686 +-0.00176079 0.0741065 -0.0358743 +-0.0671962 0.0736816 0.0379285 +-0.0347085 0.169768 -0.00115359 +-0.0213445 0.0916844 -0.035421 +-0.0625559 0.150623 -0.0205762 +0.055585 0.0535517 0.00220948 +-0.0136228 0.128915 0.00609854 +-0.0654189 0.16417 -0.0217177 +-0.0613445 0.0434338 0.042412 +-0.0144732 0.096429 0.0522087 +-0.0707666 0.171245 -0.0323024 +-0.0713393 0.134067 0.0496215 +-0.0458732 0.104238 -0.0208285 +-0.0551833 0.07213 0.0401196 +0.0364832 0.0422343 0.0281778 +-0.0336503 0.0577563 -0.0112696 +-0.0810791 0.117571 0.0486733 +0.044724 0.0588042 -0.00496063 +-0.0568258 0.120959 -0.0097287 +-0.0257724 0.0797722 -0.0374309 +-0.0800654 0.121688 0.0502425 +-0.0569634 0.0335771 0.00964709 +-0.00939357 0.0354504 -0.0173725 +0.046214 0.0637709 -0.0019104 +0.00900714 0.0383394 0.0314785 +0.0457806 0.0890199 0.00717609 +-0.0524951 0.0747684 0.0423102 +0.0334058 0.0446363 -0.00548551 +-0.063072 0.0346346 0.0391063 +0.0073001 0.0907939 -0.0322622 +0.026147 0.0875952 0.0467145 +0.0130004 0.0419341 0.0448362 +0.0263999 0.0348437 0.0163952 +-0.0056357 0.0466988 -0.0297075 +-0.000747471 0.0987058 -0.0265343 +-0.0688283 0.0966095 -0.0161149 +0.00300687 0.0991424 0.049182 +-0.0154864 0.0814755 0.0571167 +-0.074497 0.120396 0.0533632 +-0.0748436 0.114924 -0.0060803 +-0.0168418 0.107354 -0.0217003 +-0.0459377 0.145792 0.000601046 +-0.0487849 0.0715634 0.0402545 +-0.0581679 0.154986 0.022946 +0.044397 0.0945546 0.0171571 +-0.0810292 0.0940061 0.0336494 +0.032953 0.0994589 0.0373001 +-0.0181454 0.0347978 0.0451006 +-0.0487902 0.0855221 -0.0217064 +-0.0776336 0.147268 -0.0038625 +-0.0891133 0.14743 0.0101992 +0.0134061 0.0767276 0.0545687 +-0.0451757 0.14769 0.00639824 +0.0340849 0.114614 0.00225198 +-0.0494981 0.105619 0.0396922 +-0.0291786 0.175627 -0.0167894 +0.0516271 0.0736236 0.0155669 +-0.0333156 0.0365169 -0.0174853 +-0.00225297 0.0388793 -0.00041461 +-0.0884617 0.14585 0.0310303 +-0.087958 0.12395 0.000268768 +-0.0637456 0.154158 0.00252195 +-0.0680618 0.0606588 0.013756 +0.00946449 0.0616923 0.0540126 +-0.00707285 0.12974 0.0027455 +-0.0190315 0.0389958 0.035931 +-0.00971778 0.0670387 -0.0360005 +0.0406669 0.102735 -0.000789188 +-0.085128 0.0845897 0.0244984 +0.00248558 0.111415 0.0422707 +0.00320889 0.0824712 -0.0345101 +-0.0467495 0.117966 -0.0147678 +0.0250223 0.110364 -0.0129553 +-0.044347 0.146755 0.000226372 +-0.0616655 0.144455 -0.00523057 +0.000474346 0.0977989 0.0522897 +0.0207702 0.036271 0.0339301 +0.0400498 0.0387801 0.0063192 +-0.0199993 0.185902 -0.0200623 +0.018427 0.0917703 -0.0251723 +-0.0354635 0.0860418 0.0431394 +-0.0475855 0.0518372 -0.00929506 +0.0429858 0.0691484 -0.00178958 +-0.0244489 0.052187 0.0413714 +-0.0500639 0.141673 0.0143962 +0.0144323 0.129298 0.0192627 +-0.0561449 0.04824 0.0383427 +0.0358665 0.0404526 0.0260172 +-0.0213253 0.0444675 0.0531428 +-0.0609289 0.112535 -0.0147528 +-0.0699845 0.139935 -0.00772138 +-0.0748631 0.106362 -0.00967707 +-0.0346028 0.0344648 0.0366099 +-0.0425153 0.118993 -0.0138741 +0.0153464 0.0537553 -0.0279934 +-0.0719831 0.170733 -0.0298702 +0.0460203 0.0848226 0.00718276 +-0.0760167 0.15688 -0.0219252 +-0.010059 0.109235 -0.0217082 +0.0010095 0.0346721 0.0439005 +-0.0198215 0.0841085 -0.0387066 +-0.020574 0.115387 -0.0161841 +-0.00203672 0.0345877 -0.0169988 +-0.0424883 0.0846004 0.0426298 +-0.0313435 0.0707327 -0.0274782 +-0.0490828 0.13552 0.0213898 +-0.0481015 0.157608 -0.00698963 +-0.0579692 0.0408152 0.0462221 +-0.0682257 0.127075 0.0505767 +-0.0434944 0.0733818 0.0425428 +-0.0905017 0.114314 0.0223543 +0.0242723 0.0647548 -0.0237835 +0.050682 0.0731977 0.010749 +0.0604945 0.0595549 0.015166 +-0.0490636 0.126668 -0.00583208 +0.00647697 0.0459611 0.0484012 +0.0279051 0.0395203 0.0288639 +-0.0314585 0.0335695 -0.0237257 +-0.0485262 0.0344313 0.0301756 +-0.0386172 0.0505956 -0.0110053 +-0.000657388 0.0511382 -0.0308268 +-0.0630072 0.0689485 0.0358468 +0.0316541 0.0351286 0.0116939 +-0.0517065 0.163863 0.00241874 +-0.0634695 0.0445577 0.0356919 +-0.0832566 0.147367 0.0370632 +0.02323 0.0762417 -0.0259573 +-0.0735922 0.0833012 0.0392631 +-0.00431736 0.130694 0.00665461 +-0.021599 0.0382532 0.00358087 +0.0465019 0.0778624 0.0111839 +0.0604451 0.0678689 0.0141533 +0.0213931 0.0489728 -0.0223035 +-0.0630692 0.153725 -0.0105955 +-0.0236572 0.0507797 -0.028024 +0.00430293 0.0625774 -0.0325544 +0.0421362 0.0845969 0.0293292 +0.010951 0.0562864 0.05258 +0.0369412 0.107321 0.0271722 +0.0502975 0.0560957 -0.00457555 +0.0410804 0.10284 0.0191681 +0.0102664 0.0739304 0.0552835 +-0.0397448 0.172952 -0.00234724 +-0.0829232 0.125068 -0.00442148 +-0.0284893 0.0903534 -0.0305816 +-0.0616586 0.172539 -0.056588 +0.0182369 0.0749953 -0.0283712 +-0.0168303 0.0382802 0.00815469 +0.0453551 0.0805854 0.0221747 +-0.0718567 0.0701514 0.0311867 +-0.0814119 0.152728 0.0295837 +0.0555021 0.0730293 0.0140468 +0.00650419 0.123782 0.0339598 +0.0422452 0.0986357 -0.000817871 +-0.072904 0.112135 -0.00834183 +-0.00786498 0.13001 0.00533674 +-0.0614753 0.15686 -0.0265876 +-0.0234913 0.103006 0.0434545 +-0.0093342 0.174192 -0.0247468 +0.048187 0.0717514 0.00605259 +-0.0554773 0.0820103 0.045038 +-0.091005 0.124034 0.00628346 +-0.0147917 0.0951887 -0.0329173 +-0.00125147 0.122854 0.0353 +-0.017497 0.0485942 0.047882 +0.0194854 0.0989751 0.0466096 +-0.0889579 0.0901579 0.00845534 +-0.065396 0.0605193 0.0180241 +-0.0469507 0.168415 -0.00396135 +0.0205156 0.111203 0.0377036 +-0.0928924 0.122885 0.0362699 +0.0213879 0.0686569 0.0484685 +0.0214143 0.0463213 0.0412437 +0.00882931 0.0373958 0.0286749 +0.0465562 0.0764652 0.0121829 +-0.0618529 0.153757 -0.0195806 +-0.0262234 0.119963 0.0294562 +-0.0354913 0.0889091 0.0432238 +0.037993 0.109314 0.0194453 +-0.0377299 0.0739307 -0.0178742 +-0.0184902 0.0815159 0.0575038 +-0.0314396 0.0637247 -0.0204391 +-0.0825513 0.110697 0.0307352 +-0.0728404 0.156111 0.0119063 +-0.0663982 0.164105 -0.0192035 +0.0062922 0.0654161 -0.0325779 +-0.0624759 0.0959475 0.043683 +-0.033686 0.0637452 -0.0146972 +0.0353693 0.102677 -0.0107148 +-0.0710479 0.166372 -0.0194754 +-0.059243 0.0367531 0.0461369 +-0.0908243 0.114994 0.023547 +-0.0650258 0.156351 -0.0487028 +-0.034444 0.159452 0.00265373 +0.0357616 0.0967769 -0.0118087 +0.044965 0.0903773 0.0181662 +0.0498767 0.0734333 0.0134213 +-0.031608 0.0496402 -0.0193495 +0.0404724 0.0408436 0.0229665 +-0.0473115 0.134637 0.0112388 +0.00743122 0.0352845 0.0446812 +-0.0297131 0.0509006 -0.0193584 +-0.0241845 0.177125 -0.0200954 +-0.0632603 0.157387 -0.0151607 +-0.0598965 0.0343774 0.0365453 +-0.0242309 0.0382399 0.0265535 +0.0433792 0.0972945 0.00218055 +-0.00691412 0.124317 0.0332409 +0.00451269 0.0561377 0.0533474 +-0.00250438 0.0842991 0.0575402 +-0.0903673 0.145762 0.0273033 +-0.0523714 0.143148 0.0193902 +0.0362345 0.0967824 0.0350211 +0.0264539 0.106068 0.0383874 +-0.0729303 0.131104 -0.00814819 +0.0116228 0.130194 0.0054038 +-0.0409771 0.113795 -0.0164017 +-0.0828306 0.150071 0.00319212 +-0.0676468 0.0338307 -0.00583252 +-0.0857374 0.0792227 0.0125087 +-0.0651015 0.0410328 0.0295625 +-0.0136795 0.0987823 0.0477955 +0.0258821 0.0794179 -0.0243188 +0.0449394 0.0734628 0.0226146 +-0.0694849 0.173671 -0.0550315 +0.0142482 0.127965 9.03059e-05 +0.0564285 0.0727253 0.0143999 +-0.0172735 0.180097 -0.0253788 +-0.0699136 0.162391 -0.0489495 +-0.09118 0.143373 0.022161 +-0.0644984 0.100116 0.0422372 +-0.0564709 0.0847764 0.0446514 +-0.043754 0.152254 -0.00662286 +-0.0547181 0.0708998 -0.0155975 +-0.0401471 0.163848 0.00326215 +-0.0814342 0.154656 0.0132857 +-0.0513196 0.0514695 0.0138904 +0.00680734 0.129132 0.0265205 +-0.0614938 0.0959769 0.0438595 +-0.0091676 0.171172 -0.0227371 +-0.0769695 0.154154 -0.0139015 +-0.0502302 0.126885 0.0326315 +0.00555777 0.034446 -0.000384949 +-0.0206136 0.0379294 -0.0283016 +0.00719386 0.0810104 -0.0336874 +0.0390033 0.0387188 0.0172773 +-0.0737727 0.0928414 0.040556 +-0.0829975 0.0763193 0.0155222 +0.0461381 0.0792322 0.00519228 +0.0313444 0.106098 0.0349666 +-0.0157326 0.0383302 0.0246146 +-0.0739329 0.072514 0.0322154 +-0.0287063 0.168278 -0.00832187 +-0.02709 0.0386639 -0.0126398 +-0.0689895 0.156345 -0.00130196 +-0.0622523 0.152181 -0.0215758 +-0.0408691 0.158042 0.00401656 +-0.0324935 0.0903869 0.0442776 +0.0156162 0.0904755 -0.0278196 +0.00543406 0.120555 -0.0138758 +-0.0874054 0.110457 0.012344 +-0.0534973 0.0903982 0.0447559 +-0.0007305 0.0683317 -0.0340878 +-0.0847135 0.152577 0.00925173 +0.0453586 0.0547792 -0.00610681 +-0.0513173 0.146268 0.0144074 +0.0146587 0.125796 -0.00358107 +-0.0790281 0.166651 -0.0329632 +-0.0519257 0.0563169 0.0201359 +-0.0206011 0.0382174 0.00381729 +-0.0499923 0.0342577 0.028256 +0.0222487 0.0365239 0.0303911 +-0.0762222 0.0981393 0.0371985 +-0.0381245 0.162196 -0.0129852 +-0.0462852 0.149202 0.00834502 +0.039774 0.0618507 -0.00575724 +0.0461841 0.0778325 0.00618859 +-0.0770439 0.154813 -0.0101321 +-0.0615001 0.152383 0.000341367 +-0.0665808 0.0334125 0.000644743 +-0.0212653 0.0381372 0.0218515 +-0.071123 0.111741 0.0467572 +-0.0265438 0.177186 -0.00862049 +-0.0523481 0.125498 -0.00654313 +-0.0522635 0.0343446 0.0312176 +0.0191745 0.060499 0.0487078 +-0.0855607 0.111744 0.0263451 +-0.0360977 0.156596 0.00383263 +-0.0479431 0.0356599 -0.0132734 +0.0366613 0.0821332 0.0372523 +-0.0478798 0.107016 -0.0192852 +-0.0356524 0.0460406 0.0421919 +0.00919662 0.0865327 -0.0319845 +-0.0808705 0.11922 -0.0043482 +-0.0335583 0.116878 -0.0136466 +-0.0112898 0.0395292 0.0388441 +-0.0194927 0.0814879 0.0571676 +0.0239403 0.124821 0.0127882 +-0.0444942 0.105717 0.0408954 +-0.0484929 0.162245 0.00645185 +-0.00849807 0.0801615 0.0580203 +-0.0487025 0.121311 -0.0122547 +0.00400584 0.0386131 0.0458842 +-0.00449485 0.0488681 0.0504112 +-0.0507263 0.122615 0.0336033 +-0.0801811 0.108648 -0.00360377 +0.029758 0.0352966 0.00556049 +-0.0236293 0.0665652 0.045154 +0.0470549 0.0602552 -0.00440662 +-0.059554 0.155543 0.0209921 +-0.00550703 0.0787847 0.0579843 +-0.0451509 0.0424209 -0.0143059 +-0.0674032 0.144345 -0.0161484 +-0.0621766 0.125515 0.0434733 +-0.0885651 0.0963045 0.0227197 +-0.0623911 0.154382 0.0301734 +-0.078298 0.0745267 0.0278337 +0.00377395 0.13125 0.00536065 +-0.0351573 0.0361738 0.0471926 +-0.0517432 0.0487299 0.0143843 +-0.0578034 0.0854472 -0.0211977 +0.0151488 0.10026 -0.0226403 +0.0225321 0.104677 0.0415312 +-0.0605798 0.155686 0.00466574 +-0.0891628 0.0942977 0.0214104 +0.0393896 0.106975 0.00316583 +0.00351619 0.0800296 0.056385 +0.0405703 0.105644 0.0131657 +-0.0507419 0.0753249 -0.0179378 +0.0269605 0.111014 -0.0116501 +0.0303852 0.098223 0.0405823 +0.0431361 0.0419917 0.0224684 +-0.0738026 0.1492 0.0397758 +-0.0725455 0.148857 -0.0337299 +-0.072371 0.0860632 0.0407672 +0.0158441 0.0475203 0.043749 +0.0104341 0.0346525 0.0368683 +0.0344146 0.0399125 -0.00185272 +-0.0764595 0.111219 0.0459768 +0.042138 0.101461 0.00217211 +-0.0213522 0.127058 0.00761225 +-0.0556879 0.0677603 -0.0123408 +0.00811587 0.129858 0.0241077 +-0.0637641 0.044271 -0.0022694 +-0.0104962 0.0897854 0.05669 +-0.0147283 0.0657495 -0.0376113 +-0.0881508 0.144556 0.0335371 +-0.0807759 0.0773963 -0.00349851 +-0.0388999 0.0345526 0.0391301 +0.0239365 0.0972468 -0.020928 +-0.0559996 0.126683 -0.00642409 +0.015329 0.118191 -0.013375 +-0.0894904 0.112329 0.0187618 +-0.0771865 0.153815 0.000183792 +0.00297917 0.0389607 -0.010651 +-0.0571826 0.122684 0.0401181 +0.0453844 0.091806 0.0121583 +-0.0908751 0.135104 0.0182068 +0.0216273 0.125269 0.00337714 +0.0572674 0.0722428 0.0147076 +-0.0417782 0.0473939 -0.012205 +-0.0658407 0.0938498 -0.0179236 +0.0102801 0.12364 -0.00922404 +0.00517588 0.113065 -0.0197995 +0.0139965 0.0343089 -0.00230394 +-0.0757024 0.160453 -0.0116926 +-0.0694905 0.10551 0.0380162 +0.0123252 0.0595168 -0.0292981 +0.00242842 0.0916453 -0.033159 +0.0363451 0.0519755 -0.00662669 +-0.0899083 0.121615 0.0458595 +-0.0569713 0.125238 -0.00711806 +-0.0616474 0.0458147 0.0384356 +-0.0816857 0.104685 0.0297488 +0.0417455 0.0760505 -0.00673474 +-0.0249373 0.175681 -0.0116247 +0.0233583 0.0592365 -0.0255115 +0.0296356 0.107455 0.0360045 +-0.0171544 0.0383178 0.00624466 +-0.0338857 0.12324 -0.00632922 +-0.0295434 0.168268 -0.00777595 +0.0237606 0.105983 -0.0162548 +-0.0636907 0.124164 0.0466174 +0.0299589 0.119939 0.0150519 +0.0387947 0.101959 0.0281808 +0.0346979 0.108688 0.0292348 +-0.00481267 0.108148 -0.0225124 +-0.0921162 0.126957 0.038246 +-0.0708767 0.0346286 -0.00100073 +-0.0434981 0.0803632 0.0422528 +-0.00776303 0.0742012 -0.03739 +-0.0164203 0.103082 -0.0232082 +-0.0368601 0.0336856 -0.0211611 +-0.0794788 0.13585 0.0504167 +-0.0622192 0.166249 -0.0495907 +-0.0632785 0.0347611 0.0232648 +-0.0678048 0.17421 -0.0455841 +-0.0292876 0.113893 -0.0165575 +-0.0116236 0.0451107 -0.0281433 +-0.0853661 0.0910995 0.0281927 +0.0152572 0.124805 0.0295869 +-0.0730257 0.141351 -0.00730576 +-0.0694123 0.111827 0.045291 +-0.048008 0.0642705 0.0370013 +-0.000600787 0.0405329 -0.0249772 +-0.0932444 0.124186 0.027283 +-0.050904 0.119772 0.0333476 +-0.00274076 0.0726647 -0.0356738 +-0.0635974 0.151927 -0.0324488 +0.025021 0.085012 -0.0240764 +-0.0749218 0.0661459 0.00857247 +0.0115292 0.119123 0.0361473 +0.0363972 0.0461521 -0.00588406 +0.0385505 0.0378908 0.0124577 +-0.0599745 0.14101 0.03437 +0.00637279 0.049483 -0.0283693 +-0.0896361 0.0969931 0.0144152 +0.0291455 0.0491758 0.0366259 +-0.013551 0.0588296 0.0525443 +-0.0381244 0.127641 0.0146907 +-0.00888364 0.107351 -0.0226177 +-0.0497129 0.165582 0.00102101 +0.0449595 0.0889486 0.000172046 +-0.0339085 0.177047 -0.0109944 +-0.0278445 0.0535534 0.0370258 +-0.0334735 0.0337737 0.0142583 +-0.0926366 0.121498 0.0312794 +-0.0298476 0.105726 -0.0219826 +-0.0771466 0.113816 0.049094 +0.0166749 0.0347919 -0.00596505 +-0.0767718 0.0716181 -0.00247133 +-0.0788159 0.0818529 0.0346403 +-0.0751616 0.0715622 0.0292788 +-0.0629391 0.12384 -0.00881569 +0.0155707 0.100538 -0.0224673 +0.0252284 0.116758 -0.00782512 +0.00112155 0.035712 0.0195623 +-0.0623204 0.0448503 0.0109236 +0.0577561 0.0565381 0.00419435 +-0.000697034 0.0626894 -0.03411 +-0.0739419 0.129646 -0.00820737 +-0.0552142 0.155428 0.0123927 +-0.0749344 0.128178 -0.00819506 +0.0183304 0.0579992 -0.0277502 +-0.0259227 0.123138 -0.0042558 +0.0130981 0.124462 0.0316831 +-0.0723893 0.172498 -0.0357772 +-0.015947 0.124632 0.0285893 +-0.0583387 0.0706756 0.0389009 +-0.0347052 0.0384254 -0.0102399 +-0.0149752 0.125602 0.0274605 +-0.0153278 0.0389782 0.0349161 +-0.0482032 0.131003 0.0267578 +0.0538412 0.0539826 0.0267309 +-0.0845696 0.12714 0.0502672 +0.0343613 0.111866 -0.00251995 +-0.0679623 0.16261 -0.0140168 +0.0251056 0.0902557 0.0469821 +-0.0373144 0.033633 0.00457247 +0.00149673 0.110036 0.0425823 +-0.0886162 0.100967 0.00940891 +-0.0734724 0.155984 0.0233451 +0.00740252 0.0402134 0.0455033 +0.0454345 0.0918112 0.0111626 +0.0252284 0.0420597 0.0372934 +0.026048 0.117275 -0.00637096 +-0.0768401 0.178514 -0.0509284 +-0.0719676 0.138437 -0.00730592 +0.00750673 0.0758763 0.0563548 +-0.0485658 0.0404434 -0.0115683 +-0.0402074 0.168164 -0.0113973 +-0.044494 0.0987314 0.042632 +-0.0530679 0.140053 0.026392 +0.0521064 0.0510719 0.0259326 +-0.0545309 0.0352136 0.0455493 +-0.0717133 0.0715245 -0.00752229 +-0.0899797 0.128138 0.00527223 +0.0045004 0.121001 0.0358516 +-0.0641393 0.143504 -0.0105249 +-0.0769685 0.156212 -0.0102521 +-0.0645952 0.155196 -0.0084031 +0.0323835 0.0460752 0.0307026 +-0.023205 0.178608 -0.0204967 +-0.042033 0.113762 -0.0163433 +-0.0512269 0.150712 0.0135153 +0.00120164 0.0839391 -0.0353946 +0.0300054 0.104778 0.0365239 +-0.00649214 0.0965537 0.0536631 +-0.0289152 0.0846603 -0.0346291 +0.0207024 0.0373647 0.039246 +-0.0386568 0.0577511 -0.0111914 +-0.0605191 0.153857 0.0308432 +0.0410047 0.0395957 0.0043142 +-0.0837262 0.151367 0.00522149 +-0.0378805 0.108506 -0.019759 +-0.0169176 0.183111 -0.0193016 +-0.0614849 0.0946016 0.0445824 +0.0332816 0.116574 0.0106008 +-0.0378618 0.101418 -0.0215553 +0.0383745 0.038179 0.01581 +0.010493 0.111264 0.0393941 +0.0353685 0.0600237 -0.0127796 +-0.0203175 0.0933679 0.052311 +-0.0434938 0.0619471 0.0402773 +-0.0393599 0.0418158 -0.0263353 +-0.0588856 0.105471 -0.0181522 +-0.0278953 0.124828 0.00229374 +-0.0894349 0.136561 0.0381888 +-0.0455406 0.124353 -0.00945534 +-0.0850289 0.111596 0.00326083 +0.01399 0.106595 -0.01887 +-0.0765357 0.0692333 0.0204809 +-0.0741239 0.165568 -0.0191297 +-0.056116 0.131133 0.036427 +-0.0715838 0.158191 -0.0409255 +-0.077037 0.111295 -0.0046823 +-0.0135016 0.0573891 0.0517499 +0.0374899 0.0469458 0.0313688 +-0.0297919 0.108873 -0.0192723 +-0.0616758 0.113831 0.0370124 +-0.0157188 0.0628375 -0.0366012 +-0.0879795 0.148554 0.029057 +-0.0890892 0.0955882 0.00942496 +-0.0709327 0.178806 -0.0496057 +0.0454967 0.0611109 0.0306935 +0.0193158 0.0835035 0.0508805 +0.000580692 0.131584 0.0113306 +-0.0615895 0.155312 -0.0215829 +-0.0134922 0.122339 0.0335983 +0.0458248 0.0806172 0.0201703 +-0.0225646 0.0983245 -0.0242201 +-0.0682478 0.066271 0.0282875 +0.0302092 0.117283 0.0265434 +-0.0829482 0.128017 -0.00457928 +-0.0715343 0.141411 0.0464325 +-0.0800761 0.0936246 -0.00957758 +-0.0851808 0.153525 0.0149377 +-0.0865771 0.124349 0.048115 +-0.0221188 0.100222 -0.0241961 +0.0224909 0.111137 0.037371 +0.00736705 0.0494733 -0.028237 +0.0432386 0.0750761 0.0273062 +-0.0564476 0.153922 0.0264803 +-0.0288608 0.0448354 -0.0281934 +-0.0776003 0.156937 -0.0149108 +-0.0784376 0.171472 -0.0389273 +-0.0178474 0.12806 0.016159 +-0.0284556 0.0472262 0.0488083 +-0.0677451 0.0629578 0.0224748 +-0.0567391 0.0576068 -0.000420382 +-0.0769537 0.132513 -0.00657383 +-0.0837476 0.0952109 -0.00455405 +-0.0427254 0.0358312 -0.0275925 +0.00623069 0.0782309 -0.0341321 +-0.0758642 0.117897 -0.00698249 +-0.0903736 0.13787 0.0221843 +-0.027962 0.155009 -0.00579987 +-0.0193391 0.0386082 -0.00732295 +-0.0237931 0.0698259 -0.0366341 +-0.015124 0.037267 -0.0266656 +0.0113671 0.0479427 -0.0268055 +0.0141489 0.0347135 0.0249225 +-0.0669549 0.160975 -0.0568649 +0.0208979 0.0359371 0.0087849 +-0.0570669 0.0493259 -0.00137722 +-0.0186112 0.0386738 -0.00909396 +-0.0055195 0.0443362 0.047543 +-0.0714237 0.153981 -0.0448933 +0.0119572 0.125728 -0.00550935 +-0.0310683 0.0679104 -0.0254551 +0.0514754 0.0531199 -0.00283685 +0.0135274 0.12988 0.0160733 +-0.0728856 0.148047 -0.0249504 +-0.0233454 0.122752 0.0259903 +-0.0578948 0.0983776 -0.0200563 +-0.0203263 0.0825295 0.0568715 +-0.0643532 0.142586 -0.00864957 +-0.0793976 0.151048 0.0347829 +0.0356609 0.104701 0.030636 +0.0063888 0.115364 -0.0182909 +-0.0289964 0.0383539 -0.00532847 +-0.0834239 0.0965619 -0.00458039 +0.019508 0.109842 0.0390589 +-0.0767379 0.10491 0.0348158 +-0.0825915 0.143398 0.0421649 +0.0182147 0.0834619 -0.0281698 +-0.0633435 0.060722 0.00207171 +0.0428335 0.076148 -0.00478426 +-0.0724349 0.0644357 0.0131399 +-0.0114637 0.165492 -0.0149909 +-0.0493961 0.033823 0.00737414 +0.0502518 0.0446339 0.0182039 +-0.0439305 0.0432632 0.0429545 +-0.0713305 0.0628284 0.00935991 +-0.0276378 0.158958 -0.0125395 +0.0600492 0.0581198 0.0161748 +0.00134506 0.0511101 -0.0304682 +-0.0692332 0.158118 -0.0519432 +-0.0133594 0.127978 0.0236019 +0.0292021 0.0619142 0.0421314 +-0.0667582 0.180263 -0.0553199 +-0.0197539 0.0671131 -0.0375162 +-0.0704746 0.040884 0.00781861 +-0.049499 0.112564 0.0357174 +-0.0322502 0.0367926 -0.0305484 +-0.00789583 0.129197 0.00105287 +-0.016169 0.117727 -0.0146898 +0.0295964 0.0580473 -0.0178274 +-0.0883598 0.0874311 0.00547496 +-0.0274913 0.101587 0.0432231 +-0.0768992 0.155831 0.0192356 +-0.0364902 0.0634253 0.0412069 +-0.0388025 0.125966 -0.00521606 +0.0196905 0.0550135 0.047657 +0.0571135 0.071717 0.0176058 +-0.0064991 0.0952675 0.0547927 +0.0174901 0.0346463 0.0220409 +-0.0024963 0.10305 0.0439671 +-0.0184804 0.0543192 0.0487134 +-0.0334418 0.0335662 -0.0297364 +-0.0620472 0.176838 -0.0608311 +-0.0308715 0.0522855 0.0371048 +-0.0367079 0.0695483 -0.0163464 +0.0158791 0.123986 0.0298499 +-0.0320536 0.0356449 0.0500425 +-0.0493943 0.14168 0.0103932 +-0.0558858 0.106922 -0.0182628 +0.059454 0.0647075 0.0208869 +0.0152596 0.125955 0.0281714 +0.038478 0.0980354 0.0312187 +-0.0744916 0.146991 0.0423999 +-0.0846211 0.0992422 0.0286106 +-0.0661191 0.156294 0.0171964 +-0.0794888 0.111206 0.0453002 +0.00519891 0.0880579 -0.0334439 +0.0153315 0.0346194 -0.0136599 +0.0395267 0.0632302 -0.00776648 +-0.0463407 0.0629206 0.0382092 +-0.0514201 0.121192 0.0343754 +-0.0528867 0.0334295 0.0213081 +-0.062446 0.163101 -0.0455941 +-0.0770308 0.167319 -0.027484 +-0.041999 0.126936 -0.00419358 +0.0289857 0.090239 0.0438092 +-0.0634397 0.158343 -0.0445972 +0.00692319 0.0630369 0.0555875 +-0.0294344 0.0381755 0.00387704 +0.0228628 0.0351973 0.0171792 +-0.0738758 0.0993275 -0.0132564 +-0.0668982 0.151542 -0.0415298 +-0.0629724 0.133897 0.038809 +-0.0928035 0.121507 0.0322842 +0.0305387 0.0609912 -0.0187852 +0.0385799 0.0739884 0.0346445 +-0.0814052 0.08555 -0.00656718 +-0.0621323 0.0602572 0.0206983 +-0.0294013 0.0804353 -0.034602 +0.0164763 0.0348375 -0.0136598 +-0.0659203 0.122383 -0.00896938 +-0.0328324 0.0929676 -0.0240794 +0.000521824 0.0801146 0.0573693 +0.0221547 0.0979182 -0.0216266 +-0.0649149 0.0392337 0.0390271 +0.0351689 0.0928995 0.0387113 +-0.0125327 0.0502379 0.050201 +-0.05553 0.12546 -0.00656458 +0.0330446 0.111446 -0.00610948 +0.0255618 0.120425 0.027665 +-0.0243325 0.126263 0.00798048 +-0.0654853 0.0944999 0.0429585 +-0.0478356 0.0970782 -0.0220591 +-0.0332116 0.0851655 -0.0254848 +0.00641089 0.036109 -0.0234066 +-0.0192798 0.0610993 0.0494354 +0.0363164 0.11089 0.0231265 +-0.0705311 0.0972485 0.0414142 +-0.0514267 0.135712 0.0273837 +-0.0564984 0.0918565 0.0453856 +-0.042499 0.113906 0.034677 +-0.0717955 0.156396 0.0195489 +-0.0215446 0.0942792 -0.0320343 +-0.0246821 0.177174 -0.0112336 +0.0177118 0.0944604 -0.0240064 +-0.0881735 0.15196 0.0139234 +-0.000296991 0.0392472 -0.00781836 +-0.00248723 0.115552 0.0407434 +-0.0147779 0.0756914 -0.0387415 +0.0503819 0.0717878 0.00597587 +-0.0396993 0.117276 -0.0140617 +-0.0628784 0.16149 -0.0515871 +-0.0769868 0.0713943 0.0255408 +-0.01852 0.115493 0.0376203 +-0.0632135 0.155458 0.00808821 +-0.0244921 0.103004 0.0433541 +-0.0392444 0.0481623 -0.0129943 +0.0317796 0.0647744 0.0406274 +-0.00516147 0.100957 0.0442706 +-0.0196118 0.040807 -0.0284935 +-0.0288146 0.0436325 0.0510094 +-0.0690473 0.0727409 0.0365464 +-0.0478629 0.125952 -0.00709772 +-0.0456346 0.123874 0.0250844 +-0.0214969 0.0498836 0.0466158 +0.0515378 0.0461489 0.00621743 +0.0472621 0.0627303 -0.00287883 +-0.0738666 0.0846755 0.0394915 +0.0247439 0.0490967 0.0390469 +0.0150281 0.097439 -0.0231662 +0.0456884 0.0904192 0.00716979 +0.0173787 0.046209 -0.0233857 +-0.00349533 0.123738 0.0342998 +-0.0905223 0.128294 0.0420009 +-0.0733752 0.0741466 0.034437 +-0.0106209 0.130105 0.0129711 +-0.0754549 0.158227 -0.0249553 +-0.0125993 0.0922824 -0.0359459 +-0.064348 0.0611447 0.0212332 +-0.0246221 0.0450443 -0.0281165 +-0.0383306 0.0379343 0.0437226 +-0.0423655 0.110099 -0.0185262 +-0.0750214 0.166563 -0.0400315 +-0.0338231 0.0915286 -0.0241849 +-0.0857793 0.088721 -0.000547834 +-0.00485752 0.103786 0.0439754 +-0.0334914 0.0960174 0.044365 +-0.040497 0.0705056 0.0418211 +0.0309495 0.065969 0.041175 +-0.0649024 0.119454 -0.00881631 +-0.0326689 0.0382268 0.0507498 +0.0366581 0.0727136 0.0371657 +0.0102886 0.13098 0.0134608 +0.0549839 0.0534895 0.00121219 +0.0229081 0.0608908 -0.0255785 +-0.0578484 0.0576892 0.00460939 +-0.0380707 0.123893 0.0251235 +0.0425051 0.049941 0.0324381 +-0.0208164 0.0797246 0.0560382 +-0.0600611 0.155861 0.0164593 +0.0128031 0.126304 -0.00413421 +0.0254584 0.0383883 -0.00303811 +-0.0782251 0.104799 0.0333593 +-0.011635 0.0466548 -0.0295721 +-0.0227746 0.0968676 -0.024693 +0.00330234 0.0626197 -0.0330565 +-0.00750217 0.0787518 0.0577101 +-0.043485 0.109867 0.0381531 +0.000280959 0.0655552 -0.0344559 +0.0303619 0.0982175 -0.0159971 +-0.0671228 0.150867 0.0375155 +-0.0251523 0.0635221 0.0411049 +-0.0732036 0.147141 -0.0198634 +-0.0403541 0.121097 -0.0120881 +0.0144177 0.0388354 -0.0218485 +-0.0912331 0.114706 0.0382141 +0.0261502 0.120654 0.0264581 +-0.0131682 0.0974746 0.0509922 +-0.0718669 0.115007 -0.00776782 +0.0425779 0.0929869 -0.00379718 +-0.0228308 0.0881946 -0.0369029 +-0.00860718 0.0361712 0.0494902 +-0.0685057 0.159542 -0.0539539 +-0.0864902 0.103559 0.00540359 +-0.0697818 0.16064 -0.00887941 +-0.05157 0.0657725 0.0357523 +0.036411 0.0430004 -0.00393346 +-0.0617308 0.0752409 -0.0175405 +-0.0384866 0.112537 0.0353486 +0.0446565 0.076299 -0.00080692 +-0.0444716 0.165339 -0.00887164 +0.0234256 0.0994865 0.0445818 +0.0411691 0.0899632 0.029736 +-0.0188353 0.12777 0.00853266 +-0.079023 0.172207 -0.0429929 +-0.0509196 0.141445 0.00173554 +-0.013506 0.0486161 0.0481837 +0.0193259 0.0665212 -0.0284749 +-0.0472913 0.128011 -0.00322004 +-0.0626481 0.167836 -0.0465871 +-0.0304696 0.0875178 0.0438182 +-0.0917743 0.120197 0.0434965 +-0.0648107 0.0617811 0.00082735 +0.000497836 0.114196 0.0414191 +0.0574118 0.0647963 0.00219725 +-0.0558676 0.0941545 -0.0217392 +-0.0336084 0.073768 -0.0234794 +0.00599322 0.131555 0.0161709 +0.00890036 0.0630937 0.0549611 +-0.062689 0.110949 0.0372761 +0.000505603 0.092515 0.0555251 +0.0223468 0.121292 -0.00473526 +-0.0486224 0.0562169 -0.0104362 +-0.00349838 0.0938964 0.0554871 +-0.0444734 0.111133 -0.0175908 +-0.0110869 0.111309 -0.0199045 +-0.0706182 0.161097 -0.00919138 +-0.0852334 0.0992128 0.0278144 +-0.0739196 0.15466 0.0290556 +0.0296062 0.0693912 -0.0207509 +-0.0310679 0.0435994 -0.0290446 +-0.0381696 0.0351458 0.0102677 +0.0601731 0.0664558 0.0181654 +-0.0779755 0.159708 -0.0199256 +-0.0656034 0.0619186 0.0220381 +-0.0875197 0.139142 0.00819442 +0.057949 0.0523838 0.0161799 +-0.0789979 0.165257 -0.0319521 +-0.0651299 0.139658 0.0409855 +-0.021445 0.0539977 0.0453008 +-0.0896519 0.136557 0.0371913 +-0.0534965 0.0890047 0.0449968 +-0.0534319 0.15708 0.0101259 +-0.0328837 0.0835575 -0.0275315 +-0.0164672 0.0659336 0.0534892 +-0.0354329 0.0383545 -0.00847377 +-0.0708675 0.102264 -0.0137609 +-0.023563 0.126621 0.00971624 +0.0103735 0.0460953 0.0463477 +-0.0660593 0.179544 -0.0550745 +-0.0527874 0.0854974 -0.0215293 +-0.0859388 0.0819759 0.019473 +0.0105508 0.12954 0.0235608 +-0.0103855 0.174149 -0.0227989 +-0.0669072 0.0448192 0.00702222 +-0.0284871 0.0932302 -0.0255941 +-0.0674877 0.041922 -0.00126982 +-0.0650925 0.142629 -0.00933509 +0.0420248 0.0845075 -0.00777453 +-0.0790747 0.0713835 0.0198308 +-0.0261077 0.0372445 -0.0185929 +-0.0370217 0.0410946 -0.0286549 +-0.0635554 0.166233 -0.0355972 +-0.0218769 0.105849 -0.0224625 +-0.0880158 0.125695 0.0466833 +-0.0621699 0.128298 0.0417254 +-0.0849635 0.115612 0.0476218 +-0.0132844 0.180127 -0.0228495 +-0.0282267 0.181005 -0.00798034 +-0.0312929 0.0665317 -0.0234435 +0.0182349 0.0355117 -0.0116753 +0.0151438 0.128336 0.0223847 +-0.0440686 0.0364096 0.0444754 +0.00518099 0.090879 -0.0329112 +-0.00712692 0.130239 0.0200248 +-0.00350074 0.0760658 0.0587997 +0.0285239 0.105924 -0.0141978 +-0.0560757 0.0486306 0.0102324 +-0.0647346 0.0751547 -0.0168067 +-0.0681413 0.163425 -0.0155251 +-0.0632877 0.151202 -0.0295741 +-0.0467953 0.0573798 0.0374139 +-0.0434795 0.10013 0.0422114 +0.0285718 0.0898068 -0.0210622 +0.0330592 0.116487 0.0176444 +-0.0241054 0.0348343 0.0490127 +-0.0124791 0.0354015 -0.0179384 +0.0405961 0.0624185 0.0297312 +-0.081387 0.11145 0.0446717 +0.00150869 0.0675259 0.0561223 +0.00629906 0.0381702 -0.0111411 +-0.0201579 0.171232 -0.0211109 +-0.0418025 0.1163 -0.0150397 +0.00651017 0.0786147 0.0558016 +-0.0940189 0.11877 0.0172997 +-0.0685972 0.0635876 0.000162346 +-0.0328398 0.0722904 -0.0244709 +-0.0455312 0.131052 0.00748081 +-0.023441 0.181825 -0.0105699 +0.0108694 0.130662 0.0179509 +0.0123886 0.0463398 -0.0252064 +-0.0652697 0.118619 0.0495916 +0.00206776 0.0348089 0.0386094 +-0.0298407 0.0705727 -0.0304857 +-0.0632339 0.164684 -0.0315914 +0.0353918 0.0491057 -0.00653987 +-0.0392946 0.123101 -0.0101877 +-0.0885378 0.137788 0.0102157 +-0.0234958 0.100256 0.0443804 +0.04037 0.0460545 -0.00454494 +-0.016752 0.0336597 -0.0246752 +0.0413281 0.0697537 0.029756 +-0.077268 0.161738 -0.0185704 +0.00995573 0.0897855 -0.0311748 +-0.0494127 0.0345257 0.0351696 +-0.00258654 0.0376582 -0.0251248 +-0.0538672 0.149311 0.025406 +0.0281029 0.0968693 0.0425418 +-0.0296256 0.0384042 -0.00919904 +-0.0659714 0.070335 0.0357803 +-0.0792849 0.109686 0.041215 +-0.0609581 0.142927 -0.00458074 +-0.064489 0.16418 -0.0242498 +-0.0585553 0.060477 0.023496 +-0.0851998 0.104954 0.024348 +0.0164098 0.126062 -0.00187701 +0.0235925 0.125057 0.0140956 +-0.00865281 0.123002 -0.0103525 +-0.0132305 0.174198 -0.0268981 +-0.0453894 0.130637 0.0193744 +0.0162761 0.0694793 -0.03005 +-0.0894525 0.128349 0.0437622 +-0.0562473 0.0708294 0.0392023 +0.0180456 0.044911 0.0433906 +-0.0626788 0.119898 0.0446407 +-0.0206698 0.116197 -0.0150314 +0.051506 0.0461707 0.0202521 +-0.0541367 0.13422 -0.00388726 +0.0303748 0.106409 -0.0127112 +0.0453408 0.0805541 0.00120995 +-0.00350137 0.0788045 0.0582113 +-0.052917 0.144693 0.0213981 +-0.0810085 0.136808 -0.00286908 +0.0435987 0.0482711 0.0311843 +-0.00549934 0.085642 0.0570911 +-0.0414264 0.125093 -0.00826982 +-0.0534716 0.0490986 0.0276613 +-0.0833044 0.10329 0.0285866 +-0.0394866 0.111153 0.0363447 +0.00954728 0.0389439 0.0451085 +-0.035694 0.0666325 -0.0153314 +-0.0301817 0.12316 -0.0042413 +-0.0383432 0.127011 0.0175779 +-0.0603252 0.0707596 0.0383929 +-0.0249438 0.0380891 0.0543244 +0.0144999 0.10985 0.0401157 +-0.0387789 0.0392857 0.0427431 +-0.0390181 0.126516 -0.0038056 +-0.0628844 0.116571 -0.0108779 +-0.0718222 0.0666154 0.0237319 +-0.0176233 0.0640054 0.0519373 +-0.0878362 0.112676 0.0422322 +-0.0661452 0.115702 0.0482687 +-0.0464951 0.116619 0.0318843 +-0.0501411 0.130626 -0.00198394 +-0.0497482 0.0767922 -0.0184367 +-0.0234881 0.0462034 0.0522022 +-0.0739006 0.162422 -0.0359639 +-0.0262017 0.0878115 0.0498853 +-0.0133444 0.0389099 -0.0138542 +0.040243 0.0970923 -0.00582991 +-0.011153 0.129981 0.0142184 +0.0309714 0.035145 0.0133989 +-0.0426252 0.0534503 -0.0112074 +-0.0538286 0.0338166 -0.0117099 +-0.0622047 0.0394245 0.0433885 +-0.0746849 0.14995 -0.0294029 +-0.0611865 0.0441212 -0.00432669 +-0.0182092 0.177147 -0.0243125 +0.0435018 0.0542009 0.0324922 +0.0364352 0.0371002 0.0145635 +-0.0321091 0.03378 0.0163326 +-0.0627516 0.145959 -0.00957815 +-0.0054968 0.061946 0.0559894 +-0.0738575 0.159643 -0.0319319 +-0.0640268 0.154208 0.0310565 +-0.0679826 0.0819454 0.0421862 +-0.0571357 0.158766 0.00595884 +0.0416081 0.101418 0.000182195 +-0.0235633 0.0565791 0.042552 +-0.0707052 0.0656331 -0.000502385 +0.0151645 0.126939 0.0266898 +0.0319146 0.0808971 0.042698 +0.0591439 0.0594194 0.00516163 +-0.0517306 0.164095 4.31123e-05 +-0.0802487 0.109228 0.032428 +-0.0124889 0.0964872 0.0522501 +0.0122905 0.06666 -0.0305971 +-0.00890819 0.0389895 -0.0111716 +-0.0414812 0.0634467 0.0412468 +0.0440882 0.090317 0.0231627 +-0.048759 0.14421 0.00252118 +-0.0240109 0.113853 -0.0165323 +-0.0863077 0.083293 0.0084931 +-0.0848578 0.117602 -0.00112226 +-0.0758939 0.107753 -0.00831552 +-0.0240922 0.0551393 0.0417051 +-0.048723 0.134043 0.0239744 +-0.075211 0.159631 -0.0279486 +-0.0458972 0.108476 -0.0187253 +-0.0827664 0.0789303 0.000509537 +-0.0413647 0.150284 -0.00509832 +0.00543597 0.131652 0.0145423 +-0.0567655 0.0797174 -0.020408 +-0.0314842 0.0875139 0.0436743 +-0.0272508 0.169746 -0.00972716 +-0.055503 0.0918468 0.0452512 +-0.0250407 0.11597 -0.0147569 +-0.0757456 0.155966 0.0196325 +0.0124869 0.0936385 0.0515089 +-0.0205861 0.122762 0.0284276 +-0.0807235 0.116228 0.0481624 +0.0260285 0.0450625 -0.0106845 +-0.0593728 0.0579489 0.0125735 +-0.049763 0.132774 0.0280532 +-0.0486523 0.128248 0.029602 +-0.0786364 0.0880738 -0.010561 +-0.0292743 0.157003 -0.0105584 +-0.0728269 0.0950692 -0.0149677 +-0.0571361 0.0333705 -0.00647115 +0.00471531 0.10507 -0.02128 +-0.0617504 0.158434 -0.0225881 +-0.044324 0.0573856 0.0392571 +-0.0231291 0.0608213 0.0434196 +-0.0736852 0.109489 0.0408578 +-0.0434867 0.102921 0.0416521 +-0.0745585 0.102629 0.0369846 +-0.00580621 0.0826794 -0.0377615 +-0.0293232 0.155967 -0.00892475 +-0.0785045 0.111148 0.0455755 +-0.0789041 0.126621 -0.00628203 +0.0387126 0.0984064 -0.00782785 +-0.00546749 0.0386155 0.00470576 +-0.00150095 0.0925253 0.0558525 +-0.0200678 0.0384268 0.0272406 +-0.0900294 0.114549 0.0240977 +-0.0775366 0.070359 0.00451989 +-0.0719896 0.139908 -0.00735583 +-0.0574975 0.0987515 0.0429871 +-0.0321271 0.107425 -0.0197503 +0.0188647 0.126347 0.0223312 +0.00641604 0.0962346 -0.0278978 +0.00311817 0.108714 -0.0201476 +-0.0160251 0.0375717 -0.0270066 +-0.0497158 0.140127 0.00540861 +-0.0603383 0.155998 0.00765284 +-0.0315045 0.100214 0.0434156 +-0.0865647 0.0978132 0.0263535 +0.030619 0.119354 0.0124235 +-0.0618449 0.153748 -0.0225793 +0.0357348 0.111877 0.0229152 +-0.0825172 0.108952 0.0273498 +-0.06497 0.156112 0.0234152 +-0.0141713 0.0391912 0.0511685 +0.0418096 0.0482673 0.0320498 +0.0293522 0.0768437 0.0442363 +-0.00664275 0.113752 -0.0185066 +-0.0339572 0.173519 -0.0141904 +-0.0868865 0.136539 0.0438118 +-0.0358508 0.0350331 0.0126434 +-0.0538363 0.0491492 0.0306601 +-0.0555251 0.040203 -0.0098178 +0.00654381 0.0340863 -0.0167284 +0.00392426 0.0984839 -0.0242888 +-0.0798351 0.078638 0.0310296 +-0.0520723 0.122646 0.0352105 +-0.0550812 0.153793 0.0226168 +0.014566 0.128157 0.000776346 +-0.0875094 0.103632 0.00838188 +0.0565843 0.0508466 0.00719292 +-0.0301736 0.0353405 0.0506988 +-0.054126 0.0491389 0.0369634 +-0.0213227 0.0927441 -0.0344661 +-0.0512299 0.133896 0.029412 +-0.0175551 0.0668893 0.0531861 +-0.0306537 0.125522 0.0174226 +0.00435638 0.0524337 -0.0297062 +-0.030037 0.0383331 -1.37538e-05 +-0.0748829 0.104948 -0.0102086 +0.0281452 0.12091 0.0214948 +-0.00129242 0.0339647 -0.0219341 +-0.0193753 0.114664 -0.0174341 +-0.0226586 0.185005 -0.0161016 +0.0333802 0.116202 0.0163348 +-0.0182505 0.0920203 0.0545129 +0.0291993 0.0821983 0.0440432 +0.040955 0.104188 0.00218636 +-0.0221399 0.16826 -0.0191908 +-0.0160775 0.128732 0.0124337 +-0.0494959 0.115246 0.0337414 +-0.0623926 0.155248 -0.0336012 +-0.0504873 0.0646576 0.0351978 +-0.0738463 0.114952 -0.00659368 +-0.0195012 0.0351765 0.0514244 +-0.0448823 0.107056 -0.0197924 +-0.0768765 0.119334 -0.00688293 +0.0107885 0.0345143 -0.0106366 +0.024237 0.0727429 0.0473317 +-0.00865103 0.0511695 -0.0319029 +-0.0877012 0.0963902 0.0247068 +-0.0518399 0.0559545 0.028629 +-0.00150749 0.0442279 0.0463824 +-0.066685 0.0361231 0.0351414 +-0.0298413 0.0511486 0.0404908 +-0.0104881 0.125079 0.0309157 +-0.0478366 0.0336224 0.000642732 +-0.0567073 0.152073 0.0307854 +-0.0772744 0.177812 -0.051035 +-0.0147745 0.0770701 -0.0384436 +-0.0929915 0.122891 0.0372721 +-0.0104786 0.116885 0.0389916 +0.0382147 0.0603208 -0.00873991 +-0.0754893 0.145614 0.0436847 +-0.0484504 0.134772 0.0211152 +0.013378 0.056283 0.0508299 +-0.00197361 0.0339973 -0.0202101 +0.0414332 0.100023 0.0231582 +0.0306311 0.076191 -0.0209647 +-0.0663516 0.155012 0.0287678 +-0.0710496 0.158811 -0.00499394 +-0.0554619 0.115432 0.0354757 +-0.0357408 0.0754574 -0.0191515 +0.000523827 0.0787529 0.057707 +-0.0189564 0.187079 -0.0195498 +-0.0849859 0.149949 0.0316738 +-0.0578691 0.0427244 -0.00751381 +-0.0739068 0.123785 -0.00803832 +-0.0355104 0.105608 0.0391036 +-0.0437169 0.0336921 -0.00956971 +0.0503986 0.0446075 0.0172106 +0.028338 0.0371627 0.023798 +-0.0835031 0.123045 0.0493423 +-0.051023 0.051637 0.0206282 +0.00799809 0.131294 0.0169006 +-0.0154642 0.0617228 0.0531313 +-0.0548148 0.0898539 -0.0222515 +0.0183688 0.0727072 0.0511848 +-0.0528816 0.143158 0.0234068 +0.0423208 0.0885482 0.027912 +-0.0489879 0.148715 -0.00337283 +0.0536516 0.0710277 0.00477709 +-0.0558317 0.154614 0.0193814 +-0.078074 0.0921324 -0.0116061 +-0.0138482 0.126055 -0.00351425 +-0.0484951 0.107035 0.0396855 +-0.0617568 0.113454 -0.0138737 +-0.0539631 0.0449066 0.021682 +-0.0323187 0.0763806 -0.0295323 +0.0441984 0.0917353 0.0221589 +-0.0830674 0.136771 -0.000769185 +-0.0741071 0.154101 -0.0239055 +-0.0686886 0.176906 -0.0487674 +-0.0561408 0.0460708 0.0131999 +-0.0685022 0.101419 0.0404594 +-0.0739688 0.0653923 0.0119616 +0.001175 0.0909253 -0.0339059 +0.0263146 0.0782009 0.0468843 +0.00192116 0.123969 -0.00948312 +-0.0587405 0.0737726 -0.0173801 +-0.0627949 0.167828 -0.0455908 +-0.0508006 0.0883889 -0.0215985 +-0.0481052 0.0559539 0.0359192 +0.0442623 0.0959503 0.0151546 +-0.0608758 0.0968112 -0.0186271 +-0.0345924 0.0485568 0.0396695 +-0.0618805 0.102572 -0.018381 +0.024797 0.0615121 -0.0241542 +0.0398079 0.0440192 0.0290809 +-0.0138249 0.0869198 -0.0385386 +-0.00950254 0.0801627 0.0580817 +-0.0893667 0.135016 0.00621309 +-0.0210328 0.0946153 0.0501685 +0.0124741 0.0347469 0.026362 +-0.0837947 0.100615 0.0291484 +-0.0677074 0.147127 -0.0273126 +-0.080936 0.0720826 0.0105433 +-0.0486367 0.0591511 -0.0114572 +-0.0856634 0.1104 0.0223511 +-0.0321401 0.16671 -0.0160336 +-0.0724955 0.174948 -0.0415233 +-0.0260317 0.0348457 -0.0200988 +-0.0274922 0.0497667 0.0454723 +-0.0394917 0.0534182 0.0393765 +0.0515114 0.0691441 0.0252354 +-0.0257438 0.12256 -0.00564443 +0.0437634 0.0832354 -0.00281017 +-0.0247629 0.0727034 -0.0370836 +-0.0655551 0.156269 0.0188465 +-0.0629848 0.136718 0.0370028 +0.0602499 0.0678328 0.0161531 +-0.0168173 0.0841632 -0.0392397 +-0.0683543 0.152019 -0.0462463 +-0.0567286 0.155485 0.0133042 +-0.0124895 0.119639 0.0367572 +-0.0620219 0.161552 -0.0385959 +-0.0485081 0.0504118 0.037253 +-0.0681426 0.159579 -0.055037 +-0.0339899 0.0738027 -0.0224777 +0.0187727 0.038419 -0.0166964 +-0.00951396 0.0647096 0.055646 +0.0373151 0.0659642 0.0362985 +-0.0697681 0.156742 -0.0499137 +-0.07512 0.161006 -0.0309706 +0.0445653 0.094573 0.0151616 +-0.0642545 0.154418 -0.039754 +0.0245051 0.108393 0.0385583 +-0.0423597 0.0337264 -0.0019814 +0.0111186 0.130773 0.0109156 +-0.0366056 0.0484481 -0.0142844 +-0.00762999 0.0387797 -0.0144679 +-0.0695561 0.0340783 0.00839793 +-0.0566909 0.0334951 0.00618234 +-0.0565711 0.159859 0.00306588 +0.000399482 0.0419381 -0.024642 +-0.0505546 0.0490872 0.0373101 +-0.0513639 0.0402537 0.0462611 +-0.0256858 0.0575487 -0.0293997 +-0.0524956 0.0890116 0.0451123 +0.044036 0.0973464 0.00517085 +-0.0774531 0.156901 -0.0199195 +0.0267966 0.0534918 0.0403155 +-0.0887231 0.0888754 0.0204484 +0.014348 0.0534071 0.0486823 +-0.0495075 0.0490436 0.0377607 +-0.0321324 0.154142 -0.000565596 +-0.0856354 0.143297 0.0395519 +-0.0344784 0.0932112 0.0445123 +-0.0688653 0.0860793 0.0429202 +-0.068567 0.167578 -0.0243154 +-0.0155024 0.084237 0.0568519 +-0.0768438 0.0975378 -0.0115852 +-0.054418 0.142404 0.0282888 +-0.00749562 0.091199 0.0567536 +0.0202715 0.077733 -0.0270961 +-0.0748613 0.102114 -0.0115761 +-0.0102609 0.0389601 -0.0132864 +-0.060805 0.0953608 -0.018741 +-0.0557308 0.0738305 -0.0174435 +-0.0789903 0.0900056 0.0359819 +0.0427074 0.0831548 -0.00579292 +-0.00549246 0.097843 0.0523265 +0.046038 0.0679968 0.0252834 +-0.0235521 0.116765 0.0343279 +0.0302394 0.0759037 -0.0212804 +-0.0212883 0.0638258 0.0471454 +0.0285217 0.0480557 -0.0127278 +-0.0326422 0.080708 -0.0295257 +-0.0545922 0.126915 0.0368606 +-0.07894 0.12954 -0.00577029 +-0.0871517 0.0874756 0.0234341 +0.0457525 0.0862068 0.0131643 +-0.0636848 0.163906 -0.0268361 +-0.01113 0.175691 -0.0290055 +-0.0644352 0.0424097 0.0302481 +0.00751322 0.0883379 0.0556646 +0.0450791 0.0411084 0.0144119 +-0.0801842 0.0990978 -0.00757647 +0.00942317 0.0752723 0.0558271 +-0.0720162 0.169175 -0.0255925 +-0.0706469 0.0749114 -0.0128891 +-0.0231537 0.124452 0.0216177 +-0.0354775 0.0932002 0.0444179 +-0.0467494 0.0782878 -0.0191673 +0.0402616 0.088708 0.0319407 +-0.0668021 0.0909191 -0.0174744 +-0.0798777 0.0922401 -0.00961163 +-0.00990791 0.168128 -0.0187599 +-0.0538472 0.144686 0.025416 +-0.0506923 0.0693793 -0.0143111 +-0.0628457 0.158366 -0.0406006 +-0.0472527 0.147738 0.00869118 +-0.0798492 0.140347 -0.0037915 +-0.0633595 0.155022 0.00583483 +0.0194938 0.0948135 0.0473832 +-0.0235952 0.03653 -0.0288249 +-0.0625329 0.155555 0.0257427 +-0.0293056 0.125075 0.00323421 +-0.0848075 0.100731 -0.000569426 +0.0362036 0.112389 0.0159326 +0.0148576 0.0726711 0.0531263 +-0.0648898 0.0353536 0.0257632 +-0.0225355 0.115413 0.0360839 +0.0344395 0.062733 -0.0148459 +-0.0404982 0.0548597 0.0396645 +0.0241838 0.0363666 0.0254891 +0.0185331 0.065881 0.0495848 +0.0124938 0.0589954 0.0513278 +0.00977817 0.131153 0.0118468 +0.0100829 0.0519948 0.0512903 +-0.0361503 0.127316 0.0154104 +-0.0482545 0.05323 0.0361705 +-0.0940988 0.124142 0.016266 +-0.0100812 0.168118 -0.0236136 +-0.00900002 0.1303 0.0121232 +0.044368 0.0832642 0.000211132 +-0.0417803 0.126317 0.0192991 +-0.0875576 0.0954908 0.0044419 +-0.0679508 0.168029 -0.055011 +-0.0131452 0.0346678 0.0462791 +0.00685606 0.0990064 -0.0228407 +0.0328304 0.0354201 0.0116657 +0.0278048 0.121695 0.017093 +0.0445188 0.0721805 0.0237826 +-0.0754994 0.115715 0.0515239 +-0.0115085 0.0815323 0.0578355 +-0.0530625 0.0625594 0.0307632 +-0.0510483 0.053037 0.0206135 +-0.0505791 0.0488657 -0.00826795 +-0.0426076 0.0338549 0.0069173 +0.0392521 0.0940728 0.0323259 +-0.0394892 0.0846821 0.0435801 +-0.0451321 0.0560164 0.0386443 +-0.00431394 0.0929621 -0.0345661 +-0.0559672 0.149602 0.0296453 +-0.0635672 0.159894 -0.0552656 +-0.0854828 0.0924603 0.0282645 +-0.000403311 0.102922 0.0441774 +-0.0728513 0.077742 0.0372898 +-0.0264927 0.0850795 0.0502634 +0.00748229 0.118415 -0.0155852 +-0.0301257 0.165235 -0.016018 +-0.00266679 0.0554838 -0.0324138 +0.0588141 0.0660698 0.0217199 +-0.0227042 0.0651451 0.0456598 +-0.0254758 0.0447668 0.0519525 +-0.0221249 0.165275 -0.017299 +-0.0673863 0.146352 -0.0244353 +0.0358297 0.112651 0.00431137 +-0.0600953 0.0345101 0.0398512 +-0.0315135 0.112545 0.0354646 +-0.0495533 0.0335732 0.00214603 +0.00748118 0.122397 -0.0118721 +-0.017033 0.0949215 -0.0326512 +-0.0465027 0.162256 0.00645028 +-0.0377072 0.0695284 -0.0160926 +0.0515389 0.0638758 -0.00198972 +-0.0406583 0.0577787 -0.0115563 +-0.078333 0.108337 0.035368 +-0.00970184 0.120973 -0.0121849 +0.0223756 0.0822421 0.0500191 +-0.0598969 0.0982824 -0.0189251 +-0.000418527 0.128183 0.0282442 +0.0398162 0.107019 0.0141667 +-0.0275139 0.118013 0.031246 +-0.0270215 0.0563432 0.0375362 +0.0105198 0.130786 0.00926843 +0.00339772 0.0418993 -0.0241367 +-0.0275013 0.113896 0.0350206 +0.0202412 0.0763232 -0.0271232 +-0.0919625 0.126955 0.0342506 +-0.0433008 0.0345877 0.0364134 +0.0433553 0.0860087 -0.00480358 +0.0208045 0.119446 -0.00872458 +-0.0930264 0.120177 0.0342925 +-0.0379377 0.157973 0.00463177 +-0.0253167 0.177183 -0.0103739 +-0.0366224 0.0519804 -0.0105023 +-0.0707047 0.079127 0.0393559 +-0.0260772 0.0606359 0.0392914 +-0.0238556 0.126292 0.00669874 +0.00550694 0.0561304 0.0532033 +-0.0537237 0.147766 0.0244131 +-0.0691531 0.167331 -0.0231015 +-0.0596786 0.0738084 0.0412039 +0.0326792 0.103442 0.0351236 +-0.0614661 0.174127 -0.0585981 +-0.0717687 0.0836085 -0.0162896 +-0.0457927 0.0869975 -0.0219586 +0.0105224 0.0990052 0.0483243 +-0.0829648 0.129479 -0.00406234 +-0.0356761 0.0343506 0.0364799 +-0.0884531 0.0888833 0.0214341 +-0.0627252 0.0416196 0.0257026 +-0.0564562 0.159872 0.00406757 +-0.0891671 0.0942549 0.0124334 +0.00850148 0.0561026 0.0528172 +-0.0897269 0.113038 0.0361809 +0.0510319 0.0481609 0.0243415 +-0.0355318 0.0341909 0.0278174 +0.0439268 0.0945301 0.0211547 +-0.0579061 0.0357757 0.046064 +-0.0154366 0.0383652 0.00473292 +-0.0175221 0.187321 -0.0198494 +-0.00549946 0.0842482 0.0569765 +0.0601999 0.0678503 0.0111396 +0.0144807 0.0658974 0.0525165 +0.0293268 0.0963357 -0.0179631 +-0.0397817 0.126122 -0.00537397 +0.0345713 0.109241 -0.00571538 +0.0142478 0.0846938 0.0523116 +-0.00151223 0.107257 0.0435513 +-0.0568094 0.0336832 0.0202688 +-0.00449913 0.108643 0.0435023 +0.0366018 0.0989128 -0.0107075 +-0.0520805 0.0552272 0.0244826 +-0.0564227 0.125779 -0.00685719 +-0.045508 0.0519257 0.0382686 +0.0321211 0.116144 0.000111339 +-0.0560271 0.142758 -0.00201441 +-0.0204991 0.12085 0.0318342 +-0.0572069 0.155002 0.0203881 +-0.0683862 0.0434928 0.00469407 +-0.0749362 0.167415 -0.0237916 +0.00950453 0.0758273 0.0557308 +0.0134626 0.0962698 0.0490469 +-0.0352581 0.0336435 0.0104036 +0.0033475 0.0524625 -0.0299019 +-0.0200406 0.0417644 0.0532372 +-0.020634 0.03806 0.0202475 +-0.0354822 0.0590569 0.0395591 +-0.0633421 0.145588 -0.0131138 +0.0560276 0.0714782 0.0201554 +-0.034079 0.157748 -0.0116645 +0.0430592 0.0871926 0.0271788 +-0.067061 0.0617728 0.0200983 +0.0054202 0.0385344 -0.0060218 +-0.0562382 0.115455 0.0360976 +0.0318915 0.0727133 0.0408308 +0.00701986 0.131464 0.0165435 +-0.00758439 0.038449 0.00988421 +-0.0401838 0.128459 0.00507702 +0.0467715 0.0482711 0.0287479 +-0.0918049 0.126804 0.00826817 +-0.0821184 0.0782385 0.0256306 +-0.0812562 0.103354 0.0307723 +-0.0639536 0.144435 -0.0123561 +-0.0108662 0.129871 0.00999779 +0.0155048 0.112635 0.0385412 +0.0182534 0.0792348 -0.0283217 +-0.0893331 0.0983151 0.0114073 +-0.00325216 0.0396403 0.0476826 +-0.0241255 0.089259 0.0519927 +-0.0858632 0.106258 0.00536057 +0.00408474 0.0346021 -0.0158016 +-0.0407936 0.0869784 -0.0214607 +-0.0166484 0.0480949 -0.029815 +-0.0157153 0.0613848 -0.0360938 +-0.0566239 0.0482507 0.0375737 +-0.0424946 0.0619914 0.040787 +-0.0676789 0.0735575 -0.0139417 +-0.00550026 0.0815011 0.0573318 +-0.0466697 0.166955 -0.00590454 +0.050335 0.0531616 -0.00370253 +-0.075448 0.162419 -0.0329687 +-0.0614914 0.089051 0.0454546 +-0.0467107 0.0709021 -0.0159388 +0.0485116 0.0611011 0.0306918 +0.0308141 0.0862286 0.0429136 +0.041033 0.0788113 -0.0077656 +-0.0332536 0.0434286 -0.0288825 +-0.0599631 0.0455474 0.028679 +-0.0106693 0.0383927 0.00930564 +0.00450171 0.04895 0.0512539 +-0.0567297 0.0738308 -0.0175741 +-0.0395016 0.128216 0.0127148 +-0.0236465 0.18441 -0.0150532 +-0.0541007 0.0517729 -0.00535724 +-0.00963566 0.0383633 0.0204127 +-0.072501 0.11898 0.053434 +-0.072483 0.0356257 0.00284128 +-0.0164962 0.0815146 0.0575151 +0.0321311 0.10568 -0.0119259 +-0.0628015 0.0867155 -0.0190743 +-0.0747157 0.155426 0.0258403 +-0.0655092 0.0986926 0.0420188 +-0.0621042 0.153787 0.0317461 +0.0075074 0.0702645 0.0557506 +-0.0873725 0.140519 0.00919988 +-0.0816979 0.073476 0.0105355 +-0.0251078 0.125921 0.00624226 +0.0143125 0.129601 0.0135477 +0.0537172 0.0701657 0.00367339 +-0.0658178 0.165764 -0.0247368 +-0.0706171 0.164859 -0.0164358 +-0.0268181 0.0385613 -0.0106363 +-0.0308492 0.121938 -0.00695618 +-0.0240991 0.0708914 0.0469009 +0.00836584 0.0509624 -0.0290525 +0.0146552 0.0361528 0.0436042 +-0.0759244 0.155422 0.00936737 +0.00291872 0.0383891 0.0247663 +-0.0483005 0.12541 0.0300666 +0.00749081 0.093253 -0.0307631 +-0.0441374 0.160646 -0.00957119 +-0.0454954 0.0945383 0.0433792 +0.0153865 0.0350801 0.00287497 +-0.0507565 0.078263 -0.0192091 +-0.014682 0.0540945 -0.0332776 +-0.0697195 0.0625059 0.018914 +-0.0850789 0.151288 0.0289026 +0.000998881 0.131517 0.0100563 +-0.0866192 0.111201 0.0383037 +-0.0257526 0.069725 -0.0351721 +-0.0832913 0.0938266 -0.00556456 +-0.00149798 0.121047 0.037107 +-0.0164922 0.103019 0.043564 +-0.00175716 0.0797524 -0.0362245 +-0.065193 0.165273 -0.0595568 +-0.00746087 0.0391472 0.0345828 +-0.0384976 0.0790115 0.0428361 +-0.00149834 0.095227 0.054625 +-0.00277478 0.078376 -0.0365291 +-0.0780329 0.155476 0.0217657 +-0.0632159 0.147647 -0.016402 +-0.0801569 0.0817921 0.0331577 +-0.0500022 0.16408 -0.00389251 +-0.0747874 0.0892505 -0.0147771 +-0.00949475 0.122405 0.0348735 +-0.0322196 0.0423712 0.0501883 +-0.00876131 0.174216 -0.0276966 +-0.0545091 0.161256 6.9518e-05 +0.0181832 0.102054 0.0457705 +-0.0604933 0.102915 0.04183 +0.0437773 0.0804492 0.0262342 +0.0388648 0.0842467 -0.0137667 +-0.00550336 0.0647558 0.0562438 +-0.0929299 0.122874 0.0352771 +-0.043447 0.0338958 0.0281851 +-0.0649274 0.155826 -0.0455264 +-0.00117719 0.0381217 -0.0144579 +-0.0146742 0.180146 -0.0213737 +-0.0911602 0.113316 0.0133388 +0.0114933 0.0990667 0.0482243 +-0.030492 0.093206 0.0443051 +-0.00885946 0.13031 0.0150517 +-0.073851 0.0979023 -0.0138506 +0.00349864 0.0505127 0.0525247 +0.0579498 0.0621469 0.0239372 +-0.0266127 0.121438 0.026306 +-0.0640364 0.138454 -0.00746704 +-0.0881537 0.0875035 0.020457 +-0.0693202 0.16097 -0.0509443 +-0.0258632 0.0384431 -0.0103374 +-0.0445084 0.162276 0.00597583 +0.002127 0.0994865 0.0488443 +-0.00523434 0.128086 0.0279795 +0.0441694 0.0706598 0.0245614 +0.00913312 0.10443 -0.020596 +-0.00849151 0.104452 0.0437135 +-0.0709552 0.134052 -0.00817596 +0.040546 0.0860518 0.0323351 +0.026933 0.109961 -0.012516 +0.0171797 0.119654 -0.0109592 +-0.0154871 0.10859 0.0421893 +-0.0544999 0.0945829 0.0441089 +-0.0942376 0.122836 0.024283 +0.0145822 0.10067 -0.0225932 +0.0416553 0.0900846 -0.00877196 +-0.0627089 0.0722313 -0.0153832 +-0.0265055 0.0946665 0.044662 +-0.0241067 0.108647 -0.0210644 +-0.0475093 0.0504634 0.0377677 +-0.0271626 0.0836755 0.0495254 +-0.0707023 0.155807 0.00247134 +0.0113316 0.0343299 -0.00659923 +0.0271512 0.0740976 0.0445232 +-0.00214312 0.101026 -0.0230018 +-0.0518271 0.094161 -0.0217872 +-0.0685768 0.0699128 0.0338326 +-0.0538957 0.0344051 0.0325721 +-0.0280624 0.17271 -0.00913079 +-0.0710555 0.148357 -0.0346175 +-0.0392482 0.165334 0.00281642 +-0.0494961 0.159354 0.00844009 +-0.0887346 0.0956375 0.0224045 +-0.0856504 0.126624 -0.00269798 +-0.0486707 0.147744 0.0101492 +-0.0735613 0.16372 -0.0149978 +0.0180716 0.0350245 0.0344937 +-0.0307362 0.053835 -0.015374 +-0.0887393 0.0928617 0.00944255 +-0.016725 0.0627999 -0.0362248 +-0.0190611 0.063953 0.0505398 +-0.0441816 0.0346721 0.0413945 +-0.0593157 0.126918 0.0405689 +-0.0111259 0.174182 -0.0282833 +-0.0436679 0.0621935 -0.0131864 +0.0275209 0.088828 -0.0220264 +-0.0297851 0.0890261 -0.0295849 +-0.0303849 0.154168 -0.00247422 +-0.0425281 0.128954 0.00568377 +0.0162787 0.126801 -0.0006607 +-0.0727179 0.0806647 -0.0147187 +-0.0753424 0.0928083 0.039305 +-0.0798316 0.111318 -0.00180655 +0.0192462 0.0346832 0.00400718 +-0.088108 0.129743 0.0452172 +-0.0103013 0.038437 0.0111565 +-0.0466082 0.166842 0.00289141 +-0.0459915 0.152139 0.00880917 +-0.02765 0.0504128 -0.0240838 +-0.00316977 0.101093 -0.0230747 +-0.081903 0.123614 -0.00465545 +0.0308134 0.104771 0.0359398 +-0.0649698 0.0444252 -0.000282601 +-0.0411724 0.128614 0.0047134 +-0.0566724 0.0661356 -0.00992741 +-0.0768027 0.1218 0.0526081 +0.0286707 0.0432432 0.0323583 +-0.0776442 0.112189 0.0467134 +-0.0599288 0.0595089 0.00385673 +-0.0751102 0.148577 -0.0168689 +-0.0422557 0.0435263 -0.021317 +-0.0109825 0.18157 -0.0273657 +0.0160657 0.128852 0.0141586 +0.0353395 0.113619 0.00703904 +-0.0746273 0.149901 -0.0298709 +-0.0108803 0.105927 -0.0227775 +-0.0134961 0.0472092 0.0480936 +0.0366578 0.0576635 0.0335112 +-0.019761 0.0984382 0.0445534 +-0.0662568 0.117183 0.0498756 +-0.0659606 0.17389 -0.0478108 +-0.0116079 0.0434695 -0.0263093 +-0.0926722 0.117507 0.0393006 +-0.0764843 0.145607 0.0435529 +-0.0467321 0.0337537 0.00617309 +-0.0558876 0.104087 -0.0189213 +-0.0920931 0.126941 0.031257 +-0.0204778 0.086949 0.0559493 +0.0205756 0.0550317 0.0471809 +0.0164894 0.10985 0.0397676 +-0.0639427 0.125311 -0.00880074 +-0.0233699 0.0380458 0.0160874 +0.00571651 0.037694 -0.0126956 +-0.0305064 0.059434 -0.0194047 +-0.0286182 0.0422955 -0.0294891 +-0.074262 0.155148 0.0274653 +-0.0780672 0.161102 -0.0219327 +-0.0710541 0.174778 -0.0424234 +-0.0641619 0.126957 0.0459503 +-0.0724375 0.0643068 0.0185598 +-0.0568864 0.106915 -0.0181412 +0.0293195 0.0995163 0.0407971 +-0.0644558 0.155894 0.01199 +0.00534877 0.131711 0.0116581 +-0.070964 0.169422 -0.0500317 +0.0101411 0.103018 -0.0207697 +0.0413802 0.0547717 -0.00646982 +-0.0385096 0.0776202 0.0427509 +-0.0239792 0.115969 -0.0147616 +-0.0225483 0.119525 0.0321637 +-0.060198 0.152175 0.0339452 +-0.0535114 0.0452153 0.0437642 +-0.0037319 0.0346421 0.0447442 +0.0102653 0.0944766 -0.0280245 +0.0270364 0.0347184 0.00926922 +-0.0660514 0.11246 0.0412419 +-0.0427238 0.072521 -0.0180673 +-0.057924 0.0453324 0.0266819 +0.0321473 0.0354374 0.0133726 +-0.0750002 0.0776536 0.0352037 +-0.0404922 0.11531 0.0337051 +-0.0201478 0.16826 -0.0196016 +-0.0263171 0.178663 -0.00829314 +0.0232364 0.0706221 -0.0263108 +-0.0228968 0.117028 -0.0138782 +-0.0477554 0.130992 0.0255865 +-0.05149 0.104281 0.0405196 +-0.00121687 0.120006 -0.0132177 +-0.0299396 0.0649723 -0.0274594 +-0.0187899 0.0784905 -0.0388371 +-0.0498267 0.109983 -0.0185775 +0.00334971 0.0510613 -0.029847 +0.0259096 0.0534724 0.0407837 +-0.0455367 0.111121 -0.0175743 +-0.0124237 0.0348026 0.0445556 +-0.0887181 0.123977 0.00228597 +-0.088156 0.151596 0.0228856 +-0.0530084 0.149326 0.0224058 +0.0191744 0.125775 0.0238749 +-0.0735068 0.118971 0.0531919 +-0.0585002 0.0987496 0.0428962 +-0.0310887 0.159271 -0.0130615 +0.000886159 0.12297 -0.0104051 +-0.0872227 0.0941086 0.00335062 +-0.0273424 0.0931435 -0.0275899 +0.0213306 0.126248 0.00896939 +0.0549036 0.0506667 0.00319831 +-0.0245658 0.115393 0.0346209 +-0.0908157 0.133668 0.01022 +0.011387 0.126452 0.0296316 +0.0342091 0.0430428 0.0288022 +-0.0759039 0.154928 -0.00089291 +-0.0834635 0.136224 -0.000676656 +-0.0242249 0.124407 -0.00155437 +-0.00949715 0.103034 0.0436292 +-0.0448632 0.102817 -0.0213129 +-0.0762912 0.162417 -0.0319674 +-0.087261 0.137734 0.00520439 +0.0359972 0.0915666 0.0381116 +0.0515419 0.0610093 0.0297195 +-0.0759846 0.168851 -0.0284951 +0.0192535 0.076364 -0.0276613 +0.00153258 0.130437 0.0231622 +-0.0552695 0.058846 -0.00542677 +-0.0478299 0.094184 -0.0219241 +0.0413096 0.0957202 -0.00478826 +0.00646546 0.131591 0.014917 +-0.0921802 0.132348 0.0172238 +-0.00096127 0.131397 0.0150615 +0.0373767 0.0519575 -0.00666499 +0.000499624 0.0661631 0.0564081 +-0.0624427 0.149095 -0.00857615 +-0.0158277 0.127263 0.00131837 +-0.0534778 0.0544994 -0.00645482 +-0.0393097 0.122071 -0.0111029 +-0.0552136 0.0346314 0.0441945 +-0.062546 0.0614527 -0.00215685 +0.0190515 0.0781917 0.0522129 +-0.00645816 0.122156 -0.0114796 +0.0547648 0.068691 0.024634 +-0.0165146 0.104417 0.0427511 +-0.0914381 0.133727 0.0162105 +-0.0621573 0.163143 -0.0375929 +-0.0927674 0.130992 0.0172311 +0.00308348 0.0981539 0.0507387 +0.0223728 0.0658814 0.0463438 +-0.039497 0.060614 0.0410267 +-0.0547684 0.0513541 0.0102674 +0.00252507 0.0561606 0.0537161 +-0.0427018 0.0681213 -0.0161497 +0.0102881 0.063916 -0.0312717 +-0.0443833 0.12939 0.00495951 +-0.0186027 0.160444 -0.0128213 +0.0371116 0.111176 0.0148387 +0.0282213 0.0875505 0.0444323 +-0.0274771 0.120676 0.0274866 +-0.0584936 0.0439589 0.0439647 +0.0240603 0.0822578 0.0489414 +0.0351443 0.071382 0.0384881 +-0.0164918 0.0897515 0.056205 +-0.0781864 0.161095 -0.0229348 +-0.0701455 0.111146 0.0439061 +-0.00742751 0.0346718 0.0457358 +-0.0757375 0.106056 0.0359296 +-0.0735163 0.138649 0.0485985 +-0.0786866 0.073183 -0.00146774 +-0.0425028 0.11664 0.0325093 +-0.0294965 0.105676 0.0405837 +-0.0253323 0.089221 0.0503626 +-0.00687638 0.105938 -0.022783 +-0.0680331 0.17369 -0.0570223 +-0.0709606 0.152484 -0.0460812 +-0.0145326 0.0386197 0.0300043 +-0.0284453 0.0903864 0.0448476 +-0.0688215 0.145351 0.0427408 +-0.0488146 0.109958 -0.0184987 +-0.0764868 0.144228 0.0448323 +-0.0204228 0.0384821 -0.0074254 +-0.050433 0.0505709 0.0355945 +0.00517866 0.131021 0.00445011 +-0.0697426 0.08081 -0.0166425 +-0.084857 0.0924919 0.0290512 +-0.00149439 0.0870302 0.0569025 +-0.072621 0.142849 -0.00891964 +0.0127783 0.105278 -0.0195273 +0.00375967 0.0343287 0.0177156 +-0.0724944 0.126022 0.052902 +-0.0520295 0.0429585 0.0453289 +-0.0373786 0.0478297 -0.016773 +-0.0165095 0.0446732 0.0513338 +0.0115347 0.118055 -0.0152175 +-0.0461946 0.0601644 0.0381445 +-0.0730192 0.156843 -0.0319176 +-0.0665818 0.173704 -0.0590137 +-0.0904622 0.133649 0.00822658 +-0.0661919 0.0387353 0.0332699 +0.0285711 0.0632767 0.0429905 +-0.0191373 0.0348399 0.0448528 +-0.0144945 0.115487 0.0386767 +-0.0885619 0.129493 0.00323888 +-0.00509715 0.039098 -0.012386 +0.00551873 0.0842341 0.0568816 +-0.0784525 0.0962411 -0.0105211 +-0.0126763 0.05824 0.052838 +-0.00571704 0.0642049 -0.0354496 +-0.0659809 0.169803 -0.037696 +0.00534315 0.0567731 -0.0307134 +-0.0104849 0.101611 0.0440429 +-0.0320291 0.108616 -0.01899 +0.0442879 0.0415947 0.0193873 +0.0261947 0.0449183 0.0375802 +-0.0626054 0.158425 -0.0185846 +-0.0321937 0.0694259 -0.0234551 +-0.0597828 0.0810723 -0.0197911 +-0.0274915 0.0602914 0.037483 +0.0278788 0.120142 0.00144262 +-0.00359535 0.0391334 -0.025473 +-0.0104902 0.0619157 0.0554492 +-0.0851123 0.133936 0.0477712 +0.0133897 0.0389058 -0.0222843 +-0.0778477 0.159718 -0.0189229 +-0.0817169 0.081448 -0.00456785 +0.00880568 0.131337 0.0114907 +-0.0885025 0.144515 0.032494 +0.00248318 0.0413744 0.0461608 +0.0393065 0.105567 0.023165 +0.0485408 0.0662379 -0.000364329 +-0.074114 0.159638 -0.0309374 +-0.0656277 0.0636798 0.0258038 +0.0326128 0.0934199 -0.0168733 +-0.0691845 0.152183 -0.0467119 +-0.0356328 0.0347409 0.0201566 +-0.067463 0.166618 -0.0559977 +0.0410852 0.0860175 0.0313838 +-0.0465484 0.0404249 0.0444582 +-0.0884823 0.147207 0.0295866 +-0.047064 0.168385 -0.0010022 +0.0204505 0.044377 -0.0207645 +-0.0460107 0.0426896 -0.0115747 +-0.0892694 0.136527 0.0301984 +-0.00170296 0.0612915 -0.034176 +0.016206 0.0927227 0.0499244 +-0.0816886 0.154881 0.0175845 +-0.0434863 0.0776041 0.0427475 +-0.0883068 0.098239 0.00641854 +-0.045625 0.056311 -0.011298 +-0.0524843 0.150872 0.017395 +-0.0641668 0.0334738 0.00287677 +0.0361211 0.0586877 -0.0107678 +0.0141254 0.0589894 0.0501816 +-0.0864962 0.112872 0.0280752 +-0.0863885 0.112851 0.0441987 +-0.0524922 0.0384865 -0.0115467 +-0.0776496 0.163935 -0.0239336 +-0.0554697 0.0345193 -0.0117205 +0.0176795 0.0740469 0.0519763 +-0.0728932 0.0642808 0.0113714 +0.0261658 0.0809584 -0.0239333 +0.058376 0.0713467 0.0136326 +0.0257313 0.0968616 0.0444005 +0.00516452 0.0344202 0.0197338 +-0.0686185 0.0687175 -0.00655491 +-0.0803464 0.147298 -0.000827063 +0.000190276 0.131527 0.0154789 +-0.0687909 0.0354139 0.0127136 +-0.05562 0.146743 0.0301728 +0.0240878 0.0645552 0.0452968 +0.0313304 0.0475675 0.0327114 +-0.0107396 0.0713653 -0.0375278 +-0.0444884 0.0733739 0.0424053 +-0.0892862 0.137904 0.0301929 +0.0430064 0.0930319 -0.00281527 +0.00152278 0.0688979 0.0560686 +0.02743 0.0663837 -0.0217206 +-0.0610765 0.167736 -0.0598039 +0.0469057 0.0738955 0.00933063 +0.010569 0.0630758 0.0538717 +-0.0636657 0.175908 -0.0542108 +-0.00887643 0.105922 -0.0227472 +0.0366768 0.0861722 0.0373065 +-0.00750518 0.0661146 0.0558703 +-0.0311481 0.174122 -0.0158676 +0.0165049 0.115408 0.0369209 +-0.0599957 0.135288 0.0360766 +0.023446 0.0385037 -0.00396461 +-0.0512658 0.0335234 0.00365116 +-0.0640041 0.0417908 0.0276702 +0.0505407 0.062451 0.0297568 +0.0381071 0.0767371 0.0357901 +0.0348186 0.114435 0.00971518 +-0.0808584 0.15153 0.0328055 +-0.0292731 0.0691492 -0.0304581 +-0.0482843 0.133992 0.00441773 +-0.0151264 0.0382524 0.0175843 +0.0457402 0.0749932 0.00321166 +-0.0514912 0.0529568 0.0308804 +-0.0841758 0.0777074 0.00551439 +-0.0724891 0.168081 -0.0228518 +-0.0578499 0.140998 0.0321632 +-0.0824678 0.0844329 0.0311552 +-0.035201 0.0380831 0.0475916 +-0.0225654 0.0336394 -0.0239171 +0.0463796 0.0792543 0.0131749 +0.0210505 0.125312 0.00175976 +-0.0835133 0.0843594 0.0293933 +-0.00767881 0.0555674 -0.03337 +-0.052489 0.159007 -0.00340529 +-0.0244459 0.156552 -0.00701262 +-0.0598434 0.0384999 0.0207227 +-0.0725078 0.160609 -0.0083559 +0.0429565 0.0986678 0.00218951 +-0.00967767 0.118026 -0.0150602 +0.038419 0.105512 0.0261645 +-0.00651495 0.0746355 0.058305 +0.0450144 0.0945871 0.00816469 +-0.0454802 0.123445 -0.0105099 +-0.00122028 0.0938312 -0.0334376 +-0.067038 0.143551 -0.013347 +0.043578 0.0888313 -0.0037919 +-0.0238161 0.078256 0.0534268 +-0.0455234 0.131922 0.0119481 +-0.0735087 0.137262 0.0493527 +-0.0183224 0.184952 -0.0232094 +-0.0148238 0.091051 -0.0367095 +-0.000496937 0.0620135 0.0565388 +-0.0217336 0.0611778 -0.0340471 +-0.0922703 0.125567 0.0322584 +0.0255559 0.0952317 -0.0208124 +-0.0748894 0.152721 -0.0218881 +-0.0770206 0.0981288 0.0365817 +-0.0262775 0.073604 0.0447421 +0.00842909 0.131472 0.01278 +-0.0815194 0.125984 0.0522053 +-0.0768497 0.156895 -0.0209209 +-0.0774933 0.0717304 0.000534742 +-0.0610597 0.172553 -0.0606091 +-0.00957846 0.178815 -0.0287373 +-0.062208 0.167823 -0.0505845 +-0.0225076 0.125867 0.0188793 +-0.0580565 0.0334897 0.00410791 +-0.00649004 0.112763 0.0415025 +-0.00176067 0.0755229 -0.0360316 +0.0456774 0.0904203 0.00916591 +0.0441351 0.0749462 0.0250125 +-0.0810675 0.11076 0.0435122 +0.00990869 0.048971 0.0492516 +-0.0728744 0.10362 -0.0122376 +0.0374772 0.106859 -0.00183322 +0.0151574 0.0988592 -0.0229537 +-0.016863 0.0640072 0.0526042 +-0.0418006 0.0462579 -0.0152948 +-0.0768234 0.0927696 0.0379671 +-0.0661935 0.155092 0.00556387 +-0.0810703 0.0752023 0.0214152 +-0.0235527 0.156826 -0.00518035 +-0.0194871 0.0883195 0.0557235 +-0.0716986 0.077793 -0.0140498 +-0.010631 0.0389663 -0.00962591 +-0.0570892 0.0602319 -0.00257411 +-0.0419839 0.128576 0.0133734 +-0.0151399 0.0382506 0.0121533 +-0.0759996 0.139851 -0.00609906 +-0.0506105 0.0694238 0.0381651 +-0.0658919 0.11864 0.0504465 +-0.0528899 0.106976 -0.018917 +-0.0521172 0.0545658 0.0256302 +-0.005498 0.103045 0.0437796 +-0.0524893 0.156469 0.0106374 +-0.0439563 0.147482 -0.0018962 +0.00349012 0.116915 0.0395094 +-0.0116538 0.0496371 -0.0310034 +-0.0360677 0.156277 -0.0104898 +0.0262747 0.0376552 0.0265482 +0.00369465 0.0390982 -0.00688719 +0.037401 0.0414131 -0.00242752 +-0.010004 0.0383201 0.0185669 +-0.0807853 0.0817556 0.0323751 +-0.00609738 0.037339 0.0487481 +-0.0254987 0.0945485 0.0446378 +-0.0446176 0.0345408 0.0396657 +-0.0522913 0.124591 -0.00759738 +-0.0244524 0.16187 -0.0148048 +-0.0144465 0.128429 0.00434765 +-0.0238211 0.0384511 -0.00993154 +0.0184111 0.122524 0.0307587 +-0.0815439 0.112456 0.0456165 +0.0549908 0.0567623 0.0266396 +0.0309112 0.0754873 0.0429619 +-0.0278697 0.103003 -0.0233536 +-0.0640545 0.149152 -0.0269946 +-0.0594536 0.133932 0.0368692 +0.0130152 0.130057 0.0144613 +0.0491953 0.0732159 0.0116573 +-0.0364993 0.0733348 0.0420574 +-0.0859116 0.107692 0.0193681 +0.0386236 0.109277 0.0110826 +0.00584547 0.0353648 -0.01428 +0.0198737 0.0358544 0.0359282 +-0.0174269 0.182963 -0.0250022 +0.0258436 0.0563286 -0.0217568 +0.0362122 0.112176 0.0188059 +-0.0564979 0.0805451 0.0445004 +0.0450117 0.0805305 0.000199058 +-0.043786 0.126623 -0.00583839 +0.0366462 0.100736 0.0320541 +-0.0198519 0.0357263 0.0525976 +-0.0872471 0.125707 0.0473263 +-0.0180735 0.0611876 0.0510587 +-0.0608049 0.0596005 0.019786 +0.0269735 0.121605 0.0224835 +0.033449 0.0380742 0.000639692 +-0.0174889 0.0856455 0.0572522 +-0.0298765 0.0607745 -0.022409 +-0.0371209 0.127449 0.0017956 +-0.0397839 0.0471068 -0.0160895 +-0.0245336 0.118082 0.0325274 +-0.0715136 0.0887445 0.0416191 +0.00419323 0.0880606 -0.0335488 +0.0353118 0.0520079 -0.00674902 +-0.00049849 0.101653 0.0443576 +-0.0570055 0.133804 -0.00545801 +-0.0215772 0.158162 -0.00503193 +-0.0640639 0.0351963 0.0227232 +-0.00287353 0.108795 -0.0218002 +0.0462936 0.0792458 0.00718673 +-0.00951316 0.0575536 0.0537045 +-0.0477812 0.0840973 -0.0215817 +-0.0526608 0.0504363 0.0276515 +-0.0340312 0.123966 -0.00509105 +0.00648697 0.11688 0.0387497 +0.0343069 0.0578226 0.0371782 +-0.0220745 0.169763 -0.0127977 +-0.0106374 0.0466553 -0.0295813 +0.0335656 0.114779 0.000629741 +-0.0269131 0.180109 -0.00739997 +0.0390081 0.105539 0.000161276 +-0.00175381 0.0993639 -0.0251444 +0.040909 0.0985658 0.0261474 +-0.0617277 0.159994 -0.0345941 +-0.0434138 0.111151 -0.0176174 +0.0319241 0.0700307 0.0408624 +-0.0349471 0.109117 -0.019515 +-0.0733885 0.111282 0.0466166 +0.0354121 0.0430461 -0.00417186 +-0.093028 0.117371 0.013308 +-0.0756832 0.149968 -0.01987 +0.0201512 0.0605237 0.0483852 +-0.0639979 0.158311 -0.048587 +0.0410638 0.0928718 -0.0077952 +-0.0845757 0.151155 0.0298105 +-0.0752762 0.167899 -0.0253615 +0.0587584 0.0580034 0.00517536 +-0.070971 0.166609 -0.0480118 +-0.0488701 0.10281 -0.0210946 +-0.0609926 0.128204 -0.00783795 +-0.0772884 0.155547 -0.0128979 +0.0120566 0.130535 0.0112565 +-0.0655484 0.039711 0.0142785 +-0.0465128 0.0438401 0.043121 +-0.0215234 0.0739469 0.0526909 +0.0238579 0.0490757 0.0395236 +-0.00446924 0.111373 0.0424038 +-0.0646993 0.150616 -0.0327557 +-0.0547216 0.118372 0.0366122 +0.055991 0.067441 0.024671 +-0.0164973 0.0485745 0.0476342 +-0.0243246 0.0415463 0.0540712 +-0.0679818 0.0653371 -0.00356488 +-0.0887934 0.125677 0.0460403 +-0.0672794 0.176766 -0.0591515 +-0.0201696 0.169725 -0.0202727 +0.0232197 0.0818757 -0.0256198 +-0.0521106 0.0503642 0.0236349 +-0.00378569 0.0826645 -0.03749 +0.0103848 0.03606 -0.0224393 +0.0144027 0.129384 0.00642559 +0.0154718 0.101771 0.0468044 +-0.0222044 0.174173 -0.0211642 +0.0605561 0.0664891 0.0161665 +-0.0110072 0.128401 0.0244439 +0.00979123 0.127622 -0.00353983 +-0.0586426 0.0335837 0.0110854 +-0.0324964 0.0518418 0.0373712 +0.0339681 0.114736 0.0222644 +-0.0278327 0.179989 -0.0150111 +0.0505141 0.0610459 0.0301699 +-0.084345 0.0818627 0.0244959 +-0.0780694 0.106243 0.0333548 +-0.0400434 0.149481 0.00241998 +0.0415851 0.0779004 0.0302476 +-0.0934884 0.117419 0.0203018 +0.0145324 0.0686382 0.0526166 +0.0105088 0.0546576 0.0523588 +-0.0166719 0.128014 0.0194984 +0.0111864 0.115382 -0.0163281 +0.0433489 0.0761902 -0.00378764 +0.00361131 0.0929227 -0.0324448 +0.0374765 0.0967619 0.0332563 +0.0118435 0.0418607 0.0449613 +0.00151372 0.070315 0.0563646 +-0.089555 0.092956 0.0194329 +-0.0309867 0.0458642 -0.0271867 +-0.0127025 0.0628523 -0.0366298 +-0.0211402 0.175693 -0.0149194 +-0.0410644 0.0466663 -0.0156422 +0.0229642 0.0564103 0.0453711 +-0.0689131 0.06155 0.0163724 +-0.0351956 0.0394954 0.0475468 +0.0545544 0.0478595 0.011201 +0.0307617 0.0848812 0.0428147 +-0.0854234 0.100771 0.000422318 +-0.00263926 0.0481807 -0.0301073 +0.0341204 0.0781827 0.0405841 +-0.0753485 0.151324 -0.0238793 +-0.040104 0.0359968 0.0427867 +0.00880995 0.127795 -0.00370552 +-0.0546717 0.0587861 -0.00643621 +-0.0527782 0.0338002 0.0103069 +-0.0644915 0.087588 0.0448694 +-0.0649403 0.125308 -0.00887181 +-0.0623267 0.035582 -0.00867786 +-0.0178682 0.127784 0.00598386 +-0.0477624 0.119115 -0.0139706 +-0.0272958 0.178509 -0.0169626 +-0.036773 0.0446897 0.0419462 +-0.0643144 0.0445281 -0.000908113 +0.0310215 0.117934 0.00259488 +-0.0657027 0.155342 0.0275329 +0.00812544 0.105869 -0.0206053 +-0.0845132 0.150109 0.0051703 +0.0147267 0.0343671 -0.00408399 +-0.0738652 0.150214 0.0382196 +-0.0396346 0.151103 -0.0056598 +-0.0548476 0.0665624 0.0361422 +-0.053656 0.116868 0.0345992 +0.0407085 0.0956949 -0.00580768 +-0.0407505 0.126266 0.0196745 +0.0327193 0.0632979 0.0402054 +-0.0423878 0.124291 -0.00941969 +0.0148847 0.0378033 0.0441286 +-0.0385893 0.036902 -0.00962928 +-0.0735502 0.095526 0.040254 +-0.0625469 0.169393 -0.0495927 +-0.0666556 0.0360676 0.0353877 +0.00702297 0.127188 0.0294846 +0.0123661 0.0479119 -0.026429 +0.00707963 0.0365612 -0.00575515 +0.00660499 0.0617786 0.0553203 +-0.056364 0.156406 0.0105108 +-0.02141 0.0511007 0.0448554 +-0.0417892 0.0855226 -0.0213401 +-0.0454873 0.0789625 0.0423892 +0.0541155 0.0731329 0.017974 +0.0124978 0.092313 0.0523832 +-0.0184886 0.0801089 0.0571361 +-0.0426749 0.0622014 -0.0131851 +-0.0711139 0.162407 -0.0449498 +-0.0234912 0.0474961 0.0510145 +-0.0722633 0.0367738 0.0082856 +-0.0207862 0.0638606 0.0480406 +-0.0570496 0.0562866 0.00362097 +0.023226 0.077646 -0.0258357 +0.00592655 0.0339685 0.0148513 +0.0327331 0.0942636 0.0404449 +0.0170625 0.0448711 0.043693 +0.0335588 0.0862851 0.0416032 +-0.0588111 0.0334057 -0.00501142 +-0.0718597 0.148728 0.0404251 +-0.0700765 0.0619608 0.0139832 +-0.0302069 0.174221 -0.00514504 +-0.088803 0.151599 0.0211964 +0.0155832 0.0893609 -0.0286847 +0.0270636 0.120631 0.00113345 +0.033576 0.0781814 -0.0177928 +-0.0894235 0.0942851 0.0164251 +-0.0386513 0.0344774 0.0357393 +-0.0348698 0.176878 -0.00628812 +-0.0102548 0.179004 -0.0295955 +-0.0708792 0.115031 -0.00817569 +0.0203316 0.0551325 -0.0272049 +-0.0942207 0.120117 0.0202902 +-0.0704743 0.121802 0.053345 +0.0441954 0.0847004 0.0251589 +-0.0662148 0.171945 -0.0435535 +-0.0579078 0.0494657 0.0056917 +-0.0364996 0.0789928 0.0425809 +0.00849936 0.0744764 0.056192 +-0.0263916 0.0563779 0.0383176 +-0.0556017 0.0336949 -0.0101219 +-0.0593537 0.140997 0.0335026 +-0.0941834 0.120103 0.0162919 +0.0184196 0.0442138 -0.0226321 +-0.0628603 0.033866 0.0135258 +-0.0229828 0.0566251 0.0433992 +-0.0295276 0.0383617 0.0343291 +-0.0439439 0.166904 -0.00881722 +-0.00750585 0.0633646 0.0562436 +-0.0553809 0.0486564 0.0109541 +0.0106398 0.0390088 0.044914 +0.0440071 0.0846602 -0.00280808 +-0.0184891 0.0743773 0.0548673 +0.0214529 0.0415824 -0.013701 +-0.0137336 0.0383402 0.0141683 +-0.0895155 0.0983259 0.0124123 +0.0129339 0.063079 0.0520141 +-0.0749499 0.112554 -0.00662315 +-0.0128237 0.0855345 -0.0387685 +-0.0175101 0.0381991 0.0207599 +-0.065046 0.0423247 0.012291 +-0.0570589 0.0507155 -0.000374425 +-0.0630045 0.132588 -0.00795426 +-0.0415001 0.0972709 0.0420669 +0.0313679 0.117954 0.0212794 +-0.00373539 0.0684024 -0.0350771 +-0.0896129 0.139294 0.0321884 +-0.0239769 0.0381215 0.0231095 +0.0347467 0.0670098 -0.0158076 +0.0178644 0.101883 -0.0218675 +-0.064813 0.0428917 0.034688 +-0.0618962 0.0443648 0.0286813 +0.0425837 0.100055 0.002186 +-0.056712 0.0708617 -0.0156392 +-0.066713 0.154086 0.0315791 +-0.0348246 0.0872331 -0.0245609 +-0.0155018 0.080076 0.0569734 +-0.0431381 0.128903 0.00398376 +0.0456202 0.0421608 0.019117 +-0.0637474 0.0766435 -0.0177206 +-0.070335 0.0339385 0.00479187 +-0.0452276 0.131073 0.0164666 +0.0175902 0.128186 0.00902123 +-0.0332219 0.0344808 0.0386469 +-0.000130337 0.0395577 0.0357254 +-0.0384117 0.12376 -0.00887525 +-0.0384745 0.0533908 0.0391471 +-0.0105486 0.0921685 -0.035821 +-0.0292627 0.125707 0.0105611 +-0.0740612 0.16798 -0.0430295 +-0.0794475 0.0732175 0.0216948 +-0.0525459 0.0430871 -0.00935537 +-0.0275149 0.0591111 -0.027433 +-0.0608279 0.0910686 -0.0191968 +0.0214831 0.0388585 0.0402401 +-0.0185078 0.0382343 0.0205228 +-0.0193476 0.0973552 -0.0251961 +-0.014626 0.03858 -0.00263697 +0.0364765 0.110061 0.0246179 +0.0394879 0.0499122 0.0322705 +-0.0738314 0.151256 -0.033887 +-0.0276072 0.0488225 -0.0246209 +0.0254616 0.0727112 0.0456024 +-0.054118 0.157553 -0.00229988 +-0.0100751 0.129607 0.0204184 +-0.0507271 0.115538 0.0335799 +-0.064203 0.176904 -0.0544031 +-0.0327997 0.0624741 -0.0154176 +-0.050486 0.0585567 0.0325562 +-0.0115057 0.0716604 0.0558672 +-0.041271 0.0338554 -0.00188008 +0.00149737 0.0969588 -0.0286791 +0.0222207 0.0833264 -0.0261432 +-0.0379669 0.0433397 0.0417712 +0.0433566 0.094461 -0.000803958 +-0.0485055 0.0490796 0.0381424 +-0.0398915 0.109923 -0.0189257 +-0.00650042 0.0533369 0.0530605 +-0.0902689 0.112791 0.0182006 +-0.0256204 0.0436547 -0.0287136 +-0.0432877 0.171276 -0.00598005 +0.00651867 0.0674599 0.0552944 +0.00755739 0.101711 0.046537 +0.0201484 0.0899648 -0.02526 +0.00621941 0.0351341 0.00654928 +-0.0641258 0.0611318 0.00140431 +-0.0841699 0.0979316 0.0296062 +-0.0893171 0.151601 0.0194969 +-0.0509112 0.0517382 0.0331779 +-0.0345095 0.0761212 0.0417709 +-0.0210879 0.0852798 0.0561484 +-0.0647084 0.033787 -0.00655215 +0.0485032 0.0638048 0.0293893 +0.0553414 0.0563023 0.000211666 +0.031191 0.0977616 -0.015509 +-0.0271419 0.168228 -0.0179326 +-0.0594934 0.0832968 0.0436941 +0.00712427 0.107292 -0.0202517 +-0.0670075 0.139964 -0.00790796 +-0.072631 0.169409 -0.0470274 +-0.0668128 0.0894987 -0.0177562 +-0.0638648 0.166212 -0.0336016 +-0.0305285 0.0348948 0.0458677 +-0.07494 0.0707543 0.0282709 +0.0217204 0.105135 -0.0173432 +0.0129112 0.111627 -0.0182976 +-0.0346615 0.0395406 0.0484261 +-0.0244963 0.105758 0.0419767 +-0.0275166 0.057436 0.037149 +-0.071563 0.151347 -0.0436244 +-0.00477478 0.0812297 -0.0373809 +-0.0544968 0.108447 0.0390956 +0.0191276 0.0370481 -0.0116797 +-0.0477678 0.125154 -0.0082648 +0.00907863 0.112423 -0.0191367 +-0.0148223 0.129108 0.012888 +-0.0685095 0.148391 0.0402581 +0.0438124 0.093116 0.0231537 +-0.0295173 0.175738 -0.0052542 +-0.0580932 0.155356 0.0200663 +-0.0140302 0.116852 -0.0157862 +-0.00427283 0.034883 0.0462122 +-0.0365117 0.0860935 0.0436284 +0.0428337 0.0789534 -0.0047828 +0.0143759 0.121374 -0.0108038 +-0.0478629 0.0335429 0.00613354 +0.0399096 0.0632641 -0.00677014 +0.0382182 0.0855917 -0.0147556 +-0.0586226 0.156199 0.00971481 +-0.0768739 0.0698402 0.0216311 +0.0359859 0.0660034 0.0379002 +-0.0517494 0.0782459 -0.0193853 +-0.0836382 0.0870656 -0.00453769 +0.0314216 0.0415146 -0.00377022 +-0.0633942 0.159878 -0.0495887 +-0.0762229 0.149992 -0.0128764 +0.0360298 0.0573371 -0.00970954 +-0.0378631 0.100009 -0.0219618 +-0.0631703 0.172516 -0.0516045 +-0.0893681 0.0902559 0.0194368 +0.0559048 0.0631077 0.000905369 +0.00350533 0.0758855 0.0563752 +0.0327662 0.0475454 0.0312717 +-0.0144964 0.104421 0.0432413 +-0.0925078 0.121485 0.0292837 +-0.0225266 0.123574 -0.00478676 +0.027859 0.114683 -0.0075901 +0.0336358 0.0725575 -0.0168317 +0.0133955 0.0900754 0.0528858 +-0.0320964 0.160758 -0.0138294 +-0.0665218 0.173689 -0.0465659 +-0.0314315 0.062325 -0.0194293 +0.0355057 0.0498307 0.031489 +0.0409937 0.0830284 -0.00976566 +-0.0484259 0.152144 0.0105657 +-0.0760489 0.0702549 0.00053996 +-0.0939567 0.121435 0.0142863 +0.0458128 0.0848143 0.0141708 +-0.088753 0.130866 0.00325856 +-0.0762076 0.0680671 0.0162505 +0.0295583 0.0594698 -0.0188239 +-0.0470685 0.0362699 0.0454096 +0.0515085 0.0678015 0.0264788 +0.0229945 0.0535474 0.0436214 +0.0102584 0.0738736 -0.0323425 +-0.0208293 0.0841002 -0.0385977 +0.013479 0.118711 -0.0139326 +-0.0577142 0.0723919 -0.0167433 +0.0343469 0.0740244 -0.0157906 +-0.0384895 0.050603 0.0393394 +-0.0411819 0.166655 -0.0111213 +-0.0314187 0.0525029 -0.0133876 +-0.0530781 0.119794 0.0354828 +0.0402398 0.0815675 -0.0107641 +-0.0334936 0.0817447 0.0419617 +-0.0284374 0.0381394 0.00411543 +-0.0669412 0.126769 -0.00883964 +-0.089797 0.129515 0.00524651 +-0.0607661 0.0796035 -0.0191344 +-0.0878523 0.0860961 0.00747941 +-0.00447426 0.0385132 0.0213354 +0.0222429 0.0463236 0.0406841 +-0.0167958 0.0799195 -0.0388883 +-0.0714505 0.16941 -0.0490283 +-0.00251639 0.0442645 0.0466529 +-0.0648891 0.0981501 -0.0170112 +0.00754987 0.100371 0.0472771 +-0.0694963 0.16803 -0.0520069 +-0.0920162 0.126943 0.0352547 +0.0233968 0.0355618 0.0133136 +-0.0660161 0.169448 -0.0590294 +-0.0555411 0.128344 0.0372391 +-0.0488244 0.0927169 -0.0215945 +0.0343104 0.114465 0.0209626 +-0.0501985 0.140132 0.0173988 +-0.0658096 0.0445087 0.000718728 +-0.0512856 0.136981 0.000438627 +-0.0269157 0.0703179 -0.0345192 +-0.0636699 0.112355 0.0376208 +-0.0754912 0.144221 0.0449451 +-0.062524 0.167829 -0.0475902 +0.030542 0.0511254 -0.0127382 +-0.0237052 0.0596068 -0.0321069 +-0.0547922 0.153188 0.0241866 +-0.0414961 0.0902351 0.0425692 +-0.0494981 0.0477699 0.0395132 +0.0289271 0.110086 0.0349831 +-0.0402206 0.0433137 -0.0233156 +-0.0246897 0.0560336 -0.0294195 +0.00733033 0.058195 -0.0305865 +-0.0633574 0.155908 0.0123853 +-0.0679376 0.162368 -0.0549778 +-0.0588165 0.0667309 0.0351477 +-0.0598716 0.0453976 -0.00333599 +-0.0238165 0.0812337 -0.0381734 +-0.047565 0.0370224 -0.0142792 +-0.010699 0.104948 -0.0231645 +0.0375184 0.0915609 -0.0128884 +-0.056974 0.0573893 0.011763 +-0.00401542 0.033994 -0.0206047 +0.0133173 0.0638081 -0.0300932 +-0.0402517 0.127178 -0.0024642 +0.00549546 0.0489597 0.051102 +-0.0755445 0.0668624 0.00857418 +-0.0465015 0.0643139 0.0383309 +0.00586085 0.130491 0.00185259 +-0.00908444 0.0392597 0.0359512 +-0.0724815 0.0696506 0.0297377 +-0.0588318 0.146817 0.0344225 +-0.0460118 0.126697 0.0245216 +-0.044079 0.0336811 -0.000461832 +-0.0565021 0.0946206 0.04473 +-0.0615844 0.155311 -0.0225818 +-0.0650869 0.155169 -0.00713868 +-0.089472 0.092961 0.0204149 +-0.0824758 0.0764829 0.0200121 +0.0429803 0.0916104 -0.003806 +-0.0914285 0.144743 0.0221537 +0.00329581 0.06408 -0.0335736 +-0.0554437 0.158541 0.0079523 +-0.0624977 0.0789785 0.042462 +0.00538842 0.0383711 -0.011506 +-0.0682947 0.162375 -0.0539731 +-0.0809901 0.135346 -0.00326263 +-0.0418435 0.0928469 -0.022966 +-0.0664939 0.0917254 0.0436166 +-0.0741328 0.170753 -0.0306566 +0.00842498 0.094018 -0.0295425 +-0.00912603 0.126983 -0.00460672 +-0.0144839 0.0911543 0.0563071 +-0.0247385 0.124904 0.000549003 +-0.064327 0.034541 0.0284972 +-0.0668589 0.156842 -0.00635476 +-0.0565065 0.0629707 0.0300974 +0.0567694 0.0522665 0.0211855 +0.0120332 0.0793354 0.0543348 +0.00749695 0.108523 0.0409368 +-0.0385157 0.0761871 0.0423388 +-0.0861163 0.11208 0.0430934 +-0.0554974 0.0776601 0.0434775 +-0.0519782 0.0531903 0.0286494 +0.00382899 0.0387567 -0.00467455 +-0.0437453 0.0348723 0.00757323 +-0.0876033 0.102265 0.00739801 +-0.0538689 0.152421 0.0214004 +0.0305964 0.0407785 0.0282841 +0.0465387 0.0750529 0.00819241 +-0.0664147 0.112558 0.0425241 +-0.0212669 0.123736 0.0252343 +-0.0144966 0.0485988 0.0478804 +-0.0270125 0.0891105 0.0478066 +-0.0328048 0.0886955 -0.0250147 +-0.0387676 0.0812185 -0.0204237 +-0.0179622 0.106228 -0.0225141 +-0.0121468 0.17267 -0.0267827 +-0.0155019 0.119619 0.0357771 +-0.0763961 0.0968047 0.0374195 +-0.00349611 0.0897823 0.0565938 +-0.0378917 0.0335733 -0.0268663 +-0.0464981 0.0451704 0.0419279 +0.0287219 0.115289 -0.00622497 +-0.0639806 0.135327 0.039077 +-0.045498 0.105695 0.0408472 +0.0546227 0.0668075 0.00110467 +-0.0690913 0.143 -0.0123014 +0.0356753 0.0619319 0.0374332 +-0.0141081 0.128922 0.00736661 +-0.0561495 0.0341243 0.0270787 +-0.038546 0.128369 0.00715642 +-0.0876142 0.116272 0.0465171 +-0.0722303 0.134063 0.0500963 +-0.0156039 0.0392636 -0.0272219 +-0.0361326 0.034299 0.0293707 +0.0285657 0.120967 0.00738594 +0.0111022 0.114226 -0.0170859 +-0.0218549 0.118022 -0.0129203 +0.0460721 0.0848306 0.00817735 +-0.0800935 0.138964 -0.00379173 +-0.0574953 0.0747475 0.0420563 +-0.00684325 0.130599 0.0100344 +0.020602 0.0768409 0.0509288 +0.0342103 0.0795441 0.0407378 +-0.0387822 0.0841715 -0.021953 +0.00854197 0.104373 0.044167 +0.0284181 0.0835438 0.0446794 +-0.0809789 0.0720684 0.0125422 +-0.0870329 0.152942 0.0187545 +0.0227098 0.105005 -0.0172062 +-0.0259693 0.156664 -0.00260696 +0.00630512 0.0970077 -0.026738 +-0.0293004 0.175699 -0.00559167 +-0.00764633 0.048167 -0.0303862 +-0.045682 0.0680577 -0.0156409 +-0.0545225 0.0645764 -0.00897215 +-0.0511988 0.137011 0.0243968 +-0.00714364 0.101607 -0.0236448 +0.00975279 0.123922 0.0333795 +-0.069363 0.163799 -0.0509746 +-0.000145407 0.0355938 -0.0156782 +0.0251101 0.0562501 -0.0227775 +0.047185 0.0692848 0.0242283 +-0.0610844 0.0335982 -0.00747508 +-0.0215973 0.0387212 -0.015323 +0.00621551 0.0824281 -0.0337654 +-0.0768656 0.120803 -0.0071099 +-0.072234 0.147352 -0.0242316 +-0.0251276 0.16525 -0.016804 +-0.00350994 0.110634 -0.0212045 +-0.051883 0.143128 0.0183637 +0.0388034 0.0687739 -0.0117998 +0.0522529 0.049588 0.0243549 +-0.0484974 0.0974063 0.0440017 +0.0292296 0.08295 -0.0208022 +0.0215976 0.121636 0.0305088 +-0.0576661 0.143885 0.0324483 +-0.062789 0.152113 -0.0295989 +-0.0686144 0.0632303 0.0220506 +-0.0812769 0.136213 -0.00276757 +-0.0898521 0.112924 0.020019 +0.0399617 0.0984844 -0.00581339 +-0.0197337 0.0627381 -0.0357065 +-0.0715197 0.0915892 0.0417662 +-0.0176796 0.037751 -0.0173923 +-0.0034931 0.0519852 0.0535284 +-0.0477302 0.0753108 -0.0175447 +-0.0720239 0.158203 -0.0389152 +0.012618 0.0562866 0.0514947 +-0.00341476 0.129699 0.000449344 +0.00761699 0.0345564 0.0219225 +0.0197796 0.101487 -0.0214363 +-0.0718751 0.150885 -0.0428436 +0.0226049 0.0994887 0.0451477 +-0.0275114 0.0379423 0.00991362 +0.0449899 0.0861501 0.00118902 +-0.0724942 0.0928706 0.0413391 +-0.0668563 0.151928 -0.044894 +-0.00758529 0.0395118 0.037828 +-0.0717266 0.143977 -0.0139286 +-0.0485566 0.0446478 -0.0101195 +-0.0498454 0.098516 -0.0220736 +-0.0687032 0.155739 0.000270534 +0.0305837 0.118921 0.00529549 +0.0181431 0.0408036 0.0434958 +-0.0644897 0.161538 -0.0184978 +-0.082117 0.127195 0.0520765 +0.0194801 0.0975854 0.0469408 +-0.0593004 0.0460479 0.0107053 +-0.051494 0.097382 0.0437255 +-0.0629042 0.151488 -0.0283316 +-0.0520794 0.132523 0.0317044 +-0.0086348 0.124041 -0.00947049 +-0.0408505 0.0971293 -0.022095 +-0.0501242 0.144161 0.00100252 +-0.0374501 0.127748 0.0031441 +-0.0242006 0.107431 -0.0217757 +-0.0185705 0.0597254 0.0501838 +0.0506634 0.0663167 -0.000433246 +-0.0778197 0.0981202 0.035968 +-0.0344836 0.0604651 0.0395531 +0.0141481 0.100268 -0.0227789 +-0.0201048 0.0920391 0.0535514 +0.0405223 0.0582848 0.0307512 +-0.0234669 0.126337 0.0156088 +-0.0879353 0.140547 0.0390784 +0.0495003 0.0691238 0.025332 +-0.0550177 0.034541 0.0409139 +-0.0558687 0.156831 -0.000812957 +-0.033113 0.162236 -0.0143657 +-0.0040053 0.127195 0.0298616 +0.00247063 0.0977635 0.0514765 +-0.0372934 0.126961 0.0179492 +0.00433485 0.120467 -0.0137766 +0.00930976 0.0595795 -0.0301167 +0.0437257 0.0902921 0.0241674 +-0.0363397 0.0344675 0.0327184 +0.000637516 0.0346318 0.0420689 +0.0283669 0.0563832 0.0408635 +-0.0890554 0.136524 0.0291987 +-0.0526322 0.0603614 -0.00917272 +-0.0555168 0.0610654 0.0262173 +-0.0398616 0.102806 -0.020798 +-0.0554959 0.0959795 0.0436611 +-0.0625279 0.0435825 0.012569 +-0.012539 0.0432081 0.0504383 +-0.0295399 0.0777526 0.042206 +0.0250153 0.0699448 0.0449142 +0.0418505 0.0929433 -0.00581175 +0.00749052 0.0923616 0.0534281 +-0.0508873 0.105589 -0.0194525 +-0.0577516 0.0752955 -0.0185275 +-0.0341251 0.166782 -0.00385534 +0.0204867 0.0961927 0.0470968 +-0.0860696 0.110951 0.0368762 +-0.0623929 0.0445563 0.039213 +0.0212831 0.0679005 -0.027755 +-0.0459741 0.03576 0.00812075 +-0.0128757 0.105895 -0.0226089 +-0.0713104 0.164383 -0.0152637 +-0.00570768 0.129479 0.0248833 +-0.0759611 0.0715461 -0.00349282 +-0.0154987 0.0485755 0.0476399 +-0.0271627 0.125166 0.0172175 +-0.052909 0.0559665 0.0126205 +0.0445771 0.0875296 0.0231612 +-0.0679602 0.132601 -0.00851511 +-0.0735016 0.14861 -0.0288774 +0.0321816 0.0968615 0.0396789 +-0.0617331 0.156868 -0.0205842 +-0.0310423 0.0467686 -0.0260418 +-0.0285615 0.0382432 0.0537594 +-0.0934477 0.121479 0.0262963 +-0.0220941 0.0710555 0.0505203 +-0.0299308 0.0348009 0.0443343 +-0.0161025 0.0382877 0.022773 +-0.0328698 0.101492 -0.0223548 +0.0454742 0.0412367 0.0106737 +-0.028101 0.0890412 0.0460663 +-0.0440047 0.127209 -0.00443148 +0.0593281 0.0649895 0.00613553 +0.0127896 0.130142 0.00867876 +0.0391468 0.0887707 0.0338836 +0.0223265 0.0535979 0.0444334 +-0.0897234 0.125377 0.0042981 +0.0287018 0.0447465 0.0341399 +-0.0924969 0.121493 0.0302824 +-0.0717492 0.0821807 -0.0161321 +-0.0756445 0.156326 -0.00458549 +0.00148921 0.104407 0.0433078 +-0.0361895 0.0355992 0.0192692 +-0.0662775 0.0734947 0.0382764 +-0.0730867 0.169281 -0.0259539 +-0.00640617 0.0386668 0.0262232 +-0.053287 0.0610602 0.0282137 +-0.0820828 0.0871799 0.032118 +-0.0474969 0.0477925 0.0396528 +0.0505278 0.0445977 0.0162148 +0.0314571 0.0378867 -6.50808e-05 +0.0244076 0.117212 -0.0083203 +0.0193833 0.052146 -0.0261511 +0.0213663 0.0593118 -0.0264401 +-0.0223265 0.0696009 0.0493961 +-0.0803036 0.100707 0.0327244 +0.0516025 0.0650498 -0.00116678 +-0.0572939 0.0597447 0.0223608 +0.0272121 0.088765 -0.0222319 +-0.0760712 0.152304 0.0343668 +0.0287584 0.0359201 0.00291435 +-0.00327774 0.125061 -0.00864173 +-0.0492123 0.134029 0.0252722 +-0.0157732 0.0799164 -0.0389165 +0.0137184 0.0699424 0.0531931 +0.0181521 0.124421 0.0277923 +0.0195548 0.127052 0.0182976 +-0.0788582 0.171448 -0.0399026 +-0.0820398 0.150272 0.03397 +0.0134064 0.0478115 -0.0258783 +-0.0637307 0.0344451 0.0269565 +0.00741391 0.0920665 -0.0315473 +0.0394368 0.0688303 -0.0107955 +-0.064416 0.154996 0.00586526 +-0.066663 0.144317 -0.015468 +0.0353499 0.042038 0.028119 +-0.00141558 0.03896 -0.0133998 +-0.0338581 0.0334994 -0.0260028 +0.0142608 0.0359816 -0.0203372 +-0.0776263 0.175005 -0.043567 +-0.0525965 0.0345626 0.0431188 +0.0335361 0.0372674 0.00265432 +0.0308902 0.0632769 0.0410591 +-0.0895335 0.144692 0.0121557 +-0.0612693 0.0337096 0.0122134 +-0.00661675 0.0976221 -0.0294208 +-0.0504448 0.128295 0.0323161 +-0.0571803 0.062383 0.0287138 +-0.0529076 0.136719 0.0287121 +-0.0247725 0.0390001 0.0365321 +-0.00277907 0.0769693 -0.0364873 +-0.0894255 0.0956236 0.0134235 +0.0183336 0.0566072 -0.0279953 +-0.0945117 0.124183 0.0222757 +-0.0670539 0.154574 0.0299913 +0.0377471 0.104052 -0.00484079 +-0.0277489 0.0877005 0.0471838 +-0.0465602 0.122394 -0.0114017 +0.0512982 0.0545874 -0.00353058 +-0.0255237 0.116678 0.0329121 +-0.0558854 0.0479468 0.0296668 +-0.0384602 0.127124 -0.00162988 +0.00941217 0.040392 -0.0233006 +-0.0788042 0.109939 0.0428886 +-0.00952807 0.0385271 0.0257083 +-0.0151514 0.041952 0.0515406 +-0.0896796 0.114349 0.0422656 +-0.0130415 0.0639857 0.0543784 +-0.0709434 0.168021 -0.0490096 +-0.042508 0.0562794 0.0398023 +-0.0723361 0.155599 0.00334302 +-0.0804662 0.0800422 -0.00555374 +-0.0320486 0.122707 -0.00572396 +0.0215589 0.120837 -0.00625561 +0.0181166 0.118416 -0.011621 +-0.0473179 0.0397941 -0.0120624 +-0.0797756 0.0706254 0.0155549 +0.00931098 0.130351 0.0216675 +-0.0082877 0.0388999 0.0310374 +-0.0475138 0.156385 0.00914965 +-0.000599084 0.0391028 -0.0250468 +-0.0114889 0.103024 0.0436761 +-0.0176179 0.0378672 -0.0275216 +-0.0423688 0.123346 -0.0104204 +-0.0387324 0.156611 0.00532643 +0.0047217 0.0940547 -0.0316305 +-0.0728512 0.152626 -0.0378881 +-0.00186255 0.103074 -0.0227526 +0.0529842 0.0692584 0.0249064 +-0.0792715 0.107765 0.0320009 +0.0324709 0.0353558 0.0097886 +-0.083008 0.154405 0.0171359 +0.0123335 0.0581189 -0.0294366 +-0.0570144 0.0335354 0.00427397 +-0.0520347 0.0349067 0.0446489 +0.0239781 0.084017 -0.0250643 +0.0450177 0.0875447 0.000184881 +-0.00260981 0.0434451 -0.0255195 +-0.00349422 0.0718336 0.0581766 +-0.0470698 0.154668 -0.0068409 +-0.0764224 0.152995 0.0327283 +-0.0382612 0.0345343 0.0375294 +-0.00240135 0.128537 0.0275513 +-0.0924704 0.117461 0.033305 +-0.0714888 0.127424 0.0521873 +-0.0439578 0.12961 0.0140149 +-0.0725837 0.0763091 -0.0123208 +-0.0595593 0.0341176 0.0246105 +-0.00343172 0.0385593 0.0215021 +0.0311358 0.0782102 0.04331 +-0.0494476 0.122586 0.0319364 +-0.0665119 0.0621274 0.0216726 +0.0544596 0.058178 0.0276568 +-0.0495972 0.118308 0.0316941 +-0.0314789 0.174225 -0.0034609 +-0.0728795 0.116451 -0.00740226 +0.00249754 0.108619 0.0424686 +0.0280724 0.0678498 -0.0217391 +-0.0278862 0.165359 -0.00713919 +-0.0117661 0.182389 -0.0287496 +-2.83383e-05 0.0370817 -0.0151505 +-0.0721646 0.155417 -0.0379087 +0.0297368 0.100819 0.0396604 +0.0224793 0.124852 0.00370943 +-0.0278708 0.104417 -0.0229648 +-0.0388092 0.0372561 -0.0289196 +0.0393949 0.0519685 -0.00680892 +-0.0114113 0.0387598 0.0305221 +-0.0668989 0.0372019 0.0312012 +-0.0634206 0.167809 -0.0425955 +-0.0738654 0.102167 -0.0123482 +0.000515293 0.09714 -0.0288497 +0.00321341 0.034575 0.0192003 +-0.0313524 0.158102 0.00192058 +-0.0879015 0.148743 0.00925863 +-0.0552908 0.158294 -0.000771282 +0.00144018 0.127924 -0.00374837 +-0.0374859 0.0491992 0.0393813 +0.0225251 0.100664 -0.0205487 +-0.0149527 0.0339242 -0.0208085 +0.00432828 0.0582523 -0.0314184 +0.0463488 0.0792498 0.00918224 +-0.0375014 0.105589 0.0387333 +-0.062506 0.149124 -0.0145611 +0.00329475 0.129383 -0.00133175 +-0.00689488 0.0384553 0.0136435 +-0.0384034 0.0343958 0.0323426 +-0.062465 0.163086 -0.0495893 +-0.0639661 0.0690471 0.0355624 +-0.0131121 0.0626059 0.0545133 +-0.0449324 0.0358062 0.00829108 +0.0406445 0.0871881 -0.0107716 +-0.0230795 0.0932192 0.0494322 +-0.0186385 0.0465274 -0.0284289 +-0.0571213 0.0576422 0.00058007 +-0.0705055 0.0343308 -0.00278598 +-0.0578994 0.112578 -0.0159728 +-0.0106785 0.0383169 0.0202432 +-0.0593417 0.119814 0.0404797 +-0.0505461 0.0403717 -0.011217 +-0.0453989 0.0342539 -0.0215146 +-0.011074 0.178648 -0.0249266 +-0.0523515 0.0582314 0.0273813 +-0.0254941 0.0486931 0.0489695 +0.0374187 0.0855245 -0.0157145 +0.0453002 0.0932088 0.00816687 +-0.0612769 0.133878 0.0377403 +0.00152786 0.0745369 0.0570999 +0.0245032 0.122816 0.00162459 +-0.00938967 0.130192 0.0162996 +-0.0703883 0.0339052 -0.000577152 +-0.0733601 0.156855 -0.0299134 +-0.0171472 0.166778 -0.0196136 +0.0116998 0.0819851 0.0538895 +-0.0502854 0.11522 -0.0158495 +0.050316 0.0546413 -0.00421167 +-0.0667548 0.115724 0.0491405 +-0.0609102 0.120922 -0.00906619 +-0.0866023 0.111811 0.0414218 +-0.0669546 0.128237 -0.00895731 +-0.0654028 0.177571 -0.0533847 +-0.0437352 0.0753785 -0.0184868 +-0.0329958 0.0793378 -0.0275102 +-0.00469334 0.101051 0.0441761 +-0.0137252 0.0671481 -0.0375067 +-0.0531289 0.138241 -0.000765665 +-0.0361236 0.163705 -0.0141169 +-0.0249029 0.0722756 0.0462509 +-0.0119797 0.0383916 0.0235247 +-0.0246067 0.157782 -0.00250374 +-0.0748771 0.109206 -0.00842538 +-0.0314894 0.0845774 0.0421902 +-0.0849159 0.123546 -0.00333555 +0.052731 0.0672551 0.000627241 +0.0453449 0.0710055 0.0220458 +-0.0665131 0.0419133 -0.00333369 +0.0194908 0.113962 0.0368661 +-0.0674148 0.142782 -0.0112266 +-0.0931203 0.121503 0.0403997 +-0.0084076 0.0932235 -0.0348708 +0.0125532 0.0900642 0.0534187 +0.0432399 0.0747788 -0.00379578 +0.00477967 0.130785 0.0214562 +0.0461172 0.0759623 0.0190037 +-0.0870553 0.118453 0.000244653 +0.00651257 0.056103 0.0529931 +-0.0623783 0.167824 -0.0485899 +-0.0258496 0.0864897 0.0509722 +0.0602482 0.0581464 0.0141691 +-0.0923082 0.120116 0.0282975 +0.00750533 0.0660627 0.0552439 +0.060666 0.0609482 0.0151682 +-0.0674289 0.114212 0.0481237 +-0.0514122 0.146842 -0.00193867 +-0.0768562 0.117877 -0.00659127 +-0.0825551 0.152911 0.00706582 +-0.0839745 0.0804809 0.0225006 +0.041166 0.0819934 0.0314416 +-0.0655442 0.155124 -0.0481259 +-0.0384965 0.0620329 0.0413169 +-0.0627141 0.159943 -0.0425974 +-0.0767176 0.159013 -0.0120318 +-0.0856607 0.0832001 0.00448541 +-0.0278526 0.181478 -0.0120494 +0.0114013 0.0419017 -0.0239008 +0.0243085 0.123343 0.00295625 +-0.0474528 0.119349 0.0293599 +-0.0304487 0.0334492 -0.0290445 +-0.0696417 0.0422524 0.0026904 +-0.0644028 0.146849 -0.019975 +0.0503218 0.0589081 -0.00447436 +0.0476236 0.0467222 0.0264254 +-0.0303554 0.117939 -0.0127791 +0.0338995 0.0591949 0.0383404 +-0.0746238 0.166812 -0.0222329 +-0.0186858 0.118957 -0.0119398 +0.0507854 0.0445928 0.0142166 +-0.0844285 0.0832425 0.0264792 +0.0593532 0.0636103 0.0211835 +-0.073524 0.16243 -0.0369561 +-0.0525841 0.0574366 -0.00812203 +0.0221795 0.040783 0.0405434 +0.0281375 0.0902298 0.0443276 +0.0214874 0.0892516 0.0486681 +-0.0702718 0.110271 0.0410027 +0.0386345 0.0753534 0.0347776 +-0.0646561 0.0344494 0.0319916 +-0.00663677 0.109707 -0.0221975 +-0.029185 0.0634891 -0.02746 +-0.0671416 0.145678 -0.0214457 +-0.0135214 0.0353632 -0.0181023 +-0.0376703 0.125135 -0.00632213 +0.0114179 0.0489704 0.047894 +-0.0923638 0.118682 0.00930083 +0.0483264 0.0430255 0.0152188 +0.00550628 0.0441375 0.0457857 +-0.0652333 0.0338884 0.0112389 +0.0482587 0.0460086 0.000382582 +0.0586626 0.0538435 0.0111779 +-0.000982862 0.0386959 0.0236934 +-0.0245147 0.119422 0.0312229 +-0.0155858 0.183111 -0.0209193 +-0.0867126 0.0819778 0.0134931 +-0.0785905 0.0980977 0.0353146 +-0.0907184 0.115992 0.0263684 +-0.0614986 0.158424 -0.0305881 +-0.090971 0.141997 0.0221703 +0.049023 0.0722611 0.00748575 +-0.0495658 0.0446328 -0.00989725 +0.000576288 0.0353387 0.0179719 +-0.00263978 0.131127 0.015882 +0.0260716 0.115341 -0.00830033 +-0.0571034 0.0535249 0.00264062 +-0.0471993 0.162132 -0.00733312 +-0.0750917 0.0664543 0.00723246 +-0.0617686 0.159987 -0.035592 +-0.0267825 0.079725 -0.0369434 +-0.061465 0.0438948 -0.0044823 +0.0457823 0.0862054 0.00618349 +-0.065804 0.0609905 0.0192925 +0.0197913 0.0781802 0.0515303 +0.0377275 0.0928421 0.0353087 +-0.0179367 0.12631 0.000372783 +0.0437374 0.0902563 -0.00280325 +-0.00792408 0.0384127 0.0189094 +0.0556221 0.0493651 0.00819776 +0.00641397 0.0375702 -0.0238447 +-0.0274537 0.0485303 0.0479606 +-0.0610187 0.152669 0.0336579 +-0.078775 0.170042 -0.0371202 +0.0527843 0.0462443 0.0112063 +0.0173793 0.0631583 0.049653 +-0.0359664 0.162375 -0.00125909 +-0.0559722 0.134715 -0.00446003 +-0.0484961 0.113915 0.0346796 +-0.00776872 0.0756191 -0.0375185 +-0.085947 0.104892 0.00437979 +-0.0866438 0.152376 0.0233632 +-0.0520552 0.0559741 0.0276222 +0.060777 0.0637293 0.0161648 +-0.0634196 0.15027 -0.0277557 +-0.0514307 0.12406 0.0344067 +-0.00747581 0.101243 0.0443796 +-0.0489909 0.133982 0.00241474 +-0.0174145 0.118412 -0.0133815 +0.0106556 0.0345311 0.0225637 +0.0207029 0.0950845 -0.0226908 +-0.000596635 0.0433605 -0.0249736 +-0.0628762 0.0967673 -0.0179048 +0.0102648 0.0752773 0.0552991 +-0.0281556 0.17562 -0.0175208 +-0.00541266 0.130784 0.0163058 +-0.0708319 0.0345819 -0.00103676 +-0.0204551 0.0879984 0.0554627 +-0.0640233 0.0347562 0.0388023 +-0.0255632 0.0589456 -0.0304089 +-0.0856596 0.0858717 -0.000523015 +0.000533962 0.0773889 0.0579724 +-0.0911932 0.147489 0.0241289 +-0.0536699 0.0338623 0.0207675 +-0.0330023 0.0807475 -0.0275162 +-0.0598207 0.148547 -0.00150215 +-0.0292722 0.116973 -0.0137779 +0.0389134 0.0603588 -0.00677348 +0.00149281 0.111426 0.0424095 +-0.0567184 0.0723883 -0.016755 +-0.0557727 0.0333786 -0.00437552 +-0.0514926 0.0503999 0.033682 +-0.00426203 0.129106 -0.000929037 +0.0209419 0.0535563 0.0459234 +-0.0665114 0.0931036 0.0430214 +-0.0313926 0.112895 -0.0174931 +-0.0358232 0.127618 0.00522677 +-0.0126066 0.128516 0.0224096 +0.0435838 0.0705579 0.0258591 +-0.00308793 0.0379842 0.0148477 +-0.0348769 0.105695 -0.0204457 +-0.0787914 0.0724652 0.0224838 +0.022277 0.0678419 -0.0269851 +0.021809 0.1242 0.000142479 +0.00528322 0.0682375 -0.0327226 +-0.0813944 0.0817284 0.031574 +0.0109283 0.0616839 0.0526314 +-0.0233033 0.0429927 0.0537933 +0.0135067 0.1196 0.0353985 +-0.0856435 0.0805169 0.00650219 +-0.0555634 0.0386377 0.0471443 +-0.0925953 0.129683 0.0262582 +-0.0908852 0.150208 0.0181276 +0.0274474 0.0591653 0.0430806 +-0.0143101 0.113201 -0.0178955 +-0.0695125 0.145609 0.0428052 +0.002489 0.103843 -0.0219556 +0.034067 0.0981569 0.0371457 +-0.0663951 0.140334 -0.00790584 +-0.0462961 0.162745 -0.00789878 +0.0286561 0.108194 -0.012625 +-0.0852651 0.14863 0.0333956 +-0.0290693 0.0677067 -0.0294879 +0.0414097 0.104256 0.00616512 +-0.0693963 0.0393871 -0.00132267 +0.0255358 0.0435625 -0.00763706 +0.0562825 0.0508178 0.0201866 +-0.0867977 0.144597 0.036443 +-0.0252829 0.0751884 0.0479421 +-0.0224834 0.0681349 0.0481925 +0.0575606 0.0537805 0.0213286 +0.00845802 0.129083 -0.00108013 +0.0113649 0.0538487 -0.0294289 +-0.0501252 0.138572 0.00341268 +-0.074971 0.152728 -0.0179063 +-0.0312043 0.0422041 -0.0297469 +-0.0846068 0.0791109 0.00453817 +-0.0536323 0.0602894 -0.00841331 +-0.0171387 0.171259 -0.0162017 +0.0409378 0.0397959 0.0185201 +-0.0781974 0.153502 0.00273811 +-0.0824089 0.107319 0.0275588 +-0.0723216 0.169832 -0.0271166 +-0.0716176 0.109058 0.0379622 +0.000146179 0.101649 -0.0227639 +-0.0522094 0.0517797 0.0246371 +0.0118426 0.0562933 0.0521284 +-0.0625131 0.11843 0.0430565 +0.00861514 0.0345206 0.0221572 +0.0244049 0.0741131 0.0475942 +0.00453562 0.128718 -0.00265628 +0.0138565 0.129875 0.0119166 +-0.070378 0.149076 -0.0386493 +0.0445575 0.0847276 0.0241575 +-0.0157056 0.0599572 -0.0358177 +-0.0558806 0.154815 0.016521 +0.000379078 0.127909 -0.00372478 +0.0266539 0.122169 0.0209401 +-0.0679962 0.167786 -0.0255431 +-0.0920426 0.126958 0.0362532 +-0.0594207 0.0398239 0.0196241 +0.0364837 0.0469104 0.0311466 +-0.0568261 0.139571 0.0318926 +-0.053019 0.141421 -0.000504477 +0.0435234 0.0433666 0.0249665 +-0.0277895 0.06758 -0.0314768 +0.0362342 0.0398741 0.0247937 +-0.0212837 0.0381384 0.0164325 +0.0257555 0.0994695 0.0426751 +0.0399676 0.101315 -0.00381805 +-0.0152962 0.0433291 0.0513434 +0.0573469 0.0674291 0.0231143 +-0.0520755 0.0475411 0.0216528 +0.0328365 0.0876935 -0.0188869 +0.0143568 0.0522918 -0.0274834 +-0.0725069 0.145589 0.0436497 +0.00651279 0.0647152 0.0557475 +0.00953758 0.128186 0.0275085 +-0.052193 0.119749 -0.012566 +-0.0686715 0.165205 -0.0529941 +-0.0896326 0.092928 0.0134378 +0.0289756 0.116666 0.0289439 +-0.0642519 0.118577 0.0476092 +-0.0257723 0.182903 -0.0115399 +-0.0844232 0.100698 -0.00156743 +-0.0206629 0.0479548 -0.0285983 +-0.0532393 0.0448331 0.0206817 +0.00230145 0.0612209 -0.0331693 +0.020878 0.117607 -0.0107498 +-0.0818428 0.103274 -0.0045788 +-0.0184976 0.101625 0.0435583 +-0.0305 0.0674574 0.0390127 +-0.0485029 0.0452121 0.0424266 +-0.0929791 0.124188 0.0282747 +-0.0302252 0.0523701 -0.0173649 +0.00350969 0.0897377 0.0556751 +-0.0219245 0.161037 -0.00376903 +-0.0619129 0.0458194 0.037691 +-0.00376935 0.0769928 -0.0369082 +0.0411698 0.0806497 0.0314486 +-0.0115592 0.100495 0.0448823 +-0.063251 0.15135 -0.00497603 +-0.0271171 0.059077 -0.028426 +0.0053978 0.0390279 -0.0240405 +-0.0676491 0.065582 -0.00407795 +-0.063925 0.0448804 0.0097039 +-0.00969446 0.0598719 -0.0345693 +-0.0860777 0.110355 0.00735249 +-0.0152136 0.174214 -0.0186712 +0.00434041 0.0596672 -0.031584 +0.0213842 0.125707 0.00472943 +-0.0835093 0.13127 0.0505027 +0.0165672 0.128654 0.015768 +0.0285444 0.0459645 -0.0070843 +-0.0721129 0.15894 -0.00533295 +-0.0525858 0.147787 0.0204037 +-0.0465092 0.0776139 0.042786 +-0.00623267 0.10133 -0.0233757 +0.0572046 0.0564633 0.00317356 +-0.0122436 0.112093 -0.0187249 +0.00624351 0.0810351 -0.0338384 +0.0462734 0.0764388 0.00619417 +-0.0168246 0.0855538 -0.0389836 +-0.0869607 0.111738 0.00633151 +-0.0370469 0.152854 -0.00726744 +0.0405338 0.105622 0.0141627 +-0.0164738 0.10119 0.0439603 +-0.0854876 0.0791977 0.0105097 +0.0272664 0.0760665 -0.0234764 +-0.0438604 0.102816 -0.0213031 +0.00350403 0.0533854 0.0535456 +0.0169167 0.127898 0.0201801 +0.0184941 0.0838333 0.0510457 +-0.00847869 0.123725 0.0338017 +0.0387498 0.0659721 -0.0107606 +-0.0437917 0.0422818 -0.0193111 +-0.0126098 0.0384695 0.0251301 +0.0135799 0.0887495 0.0531421 +0.00935699 0.131232 0.0131197 +0.0135065 0.109861 0.0400106 +-0.0850182 0.0831804 0.00149618 +-0.0740846 0.0657329 0.0152043 +-0.0265661 0.0706408 0.0422848 +-0.0847398 0.106178 0.00238203 +-0.0345218 0.0818067 0.0425242 +-0.0428232 0.12861 0.00263817 +0.0121427 0.100268 -0.0226753 +0.0447259 0.0749152 0.000215102 +0.0232974 0.0648673 -0.0252072 +-0.0822784 0.0951136 -0.0065238 +-0.0614844 0.158425 -0.031588 +-0.0521163 0.12407 0.0351298 +-0.0424777 0.104302 0.0409096 +-0.00407779 0.0345848 -0.0173958 +-0.0284243 0.0487716 0.0462084 +-0.0184625 0.0729785 0.0545802 +-0.015609 0.128774 0.0111587 +-0.0694586 0.153877 0.0321166 +-0.0484639 0.149215 0.0104667 +-0.0526002 0.146245 0.0194042 +-0.0263327 0.111444 -0.0179843 +-0.0331847 0.0445939 -0.0279862 +-0.0538972 0.104145 -0.0195691 +-0.0294956 0.124519 0.0193203 +0.0346714 0.0916012 0.0397133 +-0.0247788 0.0379568 0.0140716 +-0.0643494 0.153359 -0.00540282 +-0.00557634 0.0347311 -0.0241073 +-0.0258097 0.0766327 0.0484243 +-0.00867178 0.0387364 -0.0146344 +-0.0783855 0.0873596 0.0368663 +-0.0346878 0.0651683 -0.0148251 +0.0404983 0.0499404 0.0324741 +-0.0738591 0.0964804 -0.0142486 +0.0267717 0.107644 -0.0140409 +-0.0404701 0.104257 0.0399236 +-0.0381489 0.0448685 -0.0242105 +-0.0095211 0.045789 0.0480158 +-0.0311715 0.171175 -0.0164295 +-0.0695038 0.173637 -0.0418473 +-0.0823392 0.111551 0.0443764 +-0.0227424 0.0655154 -0.0353045 +-0.0508568 0.0999518 -0.0219402 +-0.0589296 0.1241 0.041105 +0.000488727 0.108629 0.0427903 +-0.0412638 0.110187 -0.018624 +-0.0147098 0.0613984 -0.0362354 +0.0459347 0.0413813 0.0124396 +0.00323976 0.128177 0.0281353 +-0.0743879 0.143042 -0.00684484 +-0.0264004 0.0577755 0.0382862 +-0.00692431 0.038377 0.0191445 +-0.0864209 0.080641 0.0154973 +-0.077237 0.0721326 0.0266059 +-0.0686311 0.136892 0.0464956 +-0.0792347 0.153789 0.0287725 +-0.0537819 0.0840761 -0.0215562 +-0.0117053 0.0909225 -0.0365538 +0.0365178 0.0541167 0.0317039 +-0.0616584 0.114654 -0.0131207 +0.0390548 0.0884875 -0.0128108 +-0.0887111 0.101017 0.0193703 +0.0162822 0.0666125 -0.0295206 +-0.064714 0.0600149 0.00783247 +-0.0175786 0.180143 -0.0185198 +-0.0408442 0.152602 -0.00723164 +0.0352097 0.0379704 0.0208298 +-0.0618294 0.0342021 0.0275686 +0.0185142 0.0412688 -0.0207398 +-0.0195264 0.159643 -0.00556617 +0.0318624 0.0768516 0.0425881 +0.0347681 0.0641816 -0.0148052 +-0.0479777 0.147732 0.00938552 +-0.0126851 0.0570335 -0.0344182 +0.00495057 0.130435 0.00152594 +-0.0486835 0.0664435 -0.0136416 +-0.0356438 0.0562686 -0.010631 +-0.084499 0.088474 -0.00355332 +-0.0503848 0.141583 0.00270968 +-0.0858587 0.125737 0.0487678 +-0.0426772 0.14763 -0.000244299 +-0.0378831 0.156583 0.00477982 +0.00350659 0.0388434 0.0262887 +-0.0887855 0.102363 0.0143842 +-0.0646755 0.142507 0.0398915 +-0.0909161 0.13091 0.00724248 +-0.055962 0.0343325 0.0321978 +-0.0723047 0.162425 -0.0409479 +-0.0696851 0.11012 0.0394623 +-0.083003 0.0803028 0.000504056 +0.0247589 0.0435818 0.039017 +-0.0218764 0.182954 -0.0200262 +0.0236525 0.124901 0.0169603 +0.0463445 0.0561751 -0.00589814 +-0.0218308 0.117001 -0.0138605 +-0.0747558 0.067415 0.00253432 +-0.0625552 0.176839 -0.0611671 +-0.0660641 0.0384249 0.0148213 +-0.000107958 0.12991 0.000141982 +-0.054081 0.071101 0.0394438 +-0.00558231 0.0361988 -0.024956 +-0.0684451 0.117201 0.0519481 +0.0333957 0.0461492 -0.00598528 +-0.0146115 0.03779 -0.0266447 +0.00133195 0.0385877 -0.00128958 +-0.0348901 0.0738831 -0.020486 +0.0373363 0.105992 0.0277645 +0.0084546 0.131034 0.0184964 +-0.0324996 0.0498708 0.0403614 +-0.0444999 0.0719382 0.0422118 +0.0369643 0.0405549 -0.00158789 +-0.0354954 0.0733233 0.0419636 +-0.0457735 0.0826328 -0.0207974 +0.00732527 0.0595899 -0.0304419 +-0.0874242 0.111776 0.00733879 +-0.0592783 0.115234 -0.0137669 +-0.0928043 0.11882 0.0332998 +-0.0116325 0.0385039 0.00355749 +-0.0398903 0.0344806 0.00870734 +-0.0722375 0.138308 0.048356 +0.0262204 0.0344897 0.0111735 +-0.0200589 0.0348282 0.0498878 +-0.0246346 0.0382795 0.00294393 +-0.0889887 0.147168 0.0287003 +-0.0574968 0.1584 0.00209189 +-0.0329778 0.0448862 0.0466174 +-0.0605914 0.0623502 0.0262507 +-0.0785506 0.0699758 0.0176232 +-0.0362833 0.17342 -0.00108904 +-0.0627087 0.161508 -0.0465953 +-0.0397898 0.0855606 -0.0217035 +-0.0064056 0.10047 0.0472751 +-0.0646908 0.166411 -0.0300665 +-0.0508247 0.0941547 -0.0216781 +0.00716942 0.125754 -0.00749941 +0.000702847 0.0392103 -0.00758345 +-0.0407154 0.0462046 -0.018322 +-0.0401921 0.166668 -0.0117758 +0.0124864 0.11785 -0.0149995 +-0.0887986 0.114294 0.0264066 +-0.0614886 0.156862 -0.0235899 +0.0301602 0.0673157 0.0417954 +-0.0697061 0.156309 0.0202886 +0.0512708 0.0700979 0.0242688 +-0.00208274 0.0390983 0.0321346 +-0.091649 0.146116 0.0221478 +-0.0423664 0.0392174 0.0434612 +-0.0288487 0.0944704 -0.0247187 +-0.0724483 0.148649 -0.034807 +0.0270658 0.12207 0.0196667 +-0.0370838 0.159234 -0.0122889 +-0.00750248 0.0619634 0.0561006 +-0.0533112 0.162693 5.53048e-05 +-0.00276518 0.0755391 -0.036261 +-0.0186814 0.0539839 -0.0321072 +-0.0875792 0.134961 0.00324767 +0.0120758 0.0363869 0.044646 +-0.0753955 0.0901087 0.0394375 +0.0338247 0.108829 -0.00728203 +-0.0444976 0.0789577 0.0421738 +0.0235632 0.0862591 0.0483322 +0.0465947 0.0750442 0.0151558 +-0.0733825 0.135448 0.0501828 +-0.0150618 0.0383341 0.0229424 +-0.00891681 0.0351082 0.0414685 +0.0315143 0.0525771 -0.0117816 +0.045527 0.0791773 0.00219591 +-0.0464963 0.076159 0.0423522 +-0.0708979 0.122353 -0.00862039 +-0.08595 0.110378 0.0213654 +-0.0783775 0.103446 0.0335489 +-0.0758029 0.111217 -0.00664466 +-0.0554837 0.0805968 0.0447827 +-0.0353516 0.166776 -0.00214363 +0.0562979 0.0633024 0.00123284 +0.0465716 0.0440008 0.0231655 +-0.0476369 0.0591928 -0.0118235 +-0.0288774 0.169748 -0.00856256 +0.0153133 0.121135 -0.0105519 +-0.0397313 0.072486 -0.017441 +-0.016397 0.0337307 -0.02279 +0.0603039 0.0650788 0.0091381 +-0.0878637 0.152463 0.0169978 +-0.0754938 0.127441 0.0530403 +-0.067202 0.162346 -0.0569974 +-0.0865386 0.147279 0.0332936 +-0.0535025 0.0440354 0.0449405 +-0.0735938 0.149845 -0.0348818 +-0.0728566 0.162156 -0.0114327 +0.0495045 0.0651553 0.0285253 +0.012555 0.130318 0.0128667 +0.0220735 0.113988 0.0356074 +0.0224569 0.125562 0.0179459 +-0.0810243 0.0936828 -0.00856919 +-0.0756675 0.155622 -0.00260296 +-0.0431622 0.0422126 -0.0213185 +-0.000694781 0.0597985 -0.0333207 +0.0271246 0.0849281 0.0463473 +0.0173609 0.0897252 -0.0270298 +-0.0358944 0.0334964 -0.0263993 +-0.0576531 0.0612704 -0.00372094 +-0.00707611 0.0386628 0.0278929 +-0.0560526 0.151627 -0.00172465 +-0.030326 0.045 0.0496314 +-0.00103499 0.117326 -0.0163697 +-0.0252491 0.162472 -0.00507229 +0.00208806 0.113117 -0.0199282 +-0.0939 0.124133 0.015262 +-0.0129795 0.0384272 0.0232864 +0.00120237 0.0867098 -0.0346725 +0.0353317 0.112044 0.0241962 +0.00450167 0.0459455 0.0484199 +-0.0863511 0.0872693 0.000483167 +-0.0164554 0.0963571 0.0512639 +0.0121283 0.11013 -0.0187853 +-0.0778795 0.103388 -0.00866618 +0.0245137 0.102392 -0.0184072 +0.0201875 0.0974057 -0.022456 +-0.0168907 0.0921233 -0.0358082 +-0.0691832 0.153837 -0.0495596 +0.0155185 0.129225 0.0096832 +-0.00814574 0.0386661 0.000442505 +-0.0927289 0.125458 0.0102641 +-0.0846445 0.0832051 0.023501 +-0.0527541 0.0782706 -0.0196088 +-0.0206459 0.171255 -0.0142383 +0.0273486 0.110085 0.0362063 +-0.0144833 0.105825 0.0431811 +-0.0295885 0.120405 -0.00932945 +-0.0914492 0.117418 0.0293041 +-0.0259115 0.159753 -0.0130913 +-0.0498456 0.123179 -0.0101809 +0.0474532 0.047084 -0.00164907 +0.0201466 0.0658754 0.0483972 +-0.0546819 0.0486825 0.0116705 +0.0366139 0.0573407 -0.00875458 +0.016382 0.0888799 -0.0281622 +-0.0128318 0.0653357 0.0541739 +-0.0495043 0.073253 0.0416255 +0.0380257 0.084795 0.0357219 +-0.055962 0.148162 0.0296522 +-0.00335679 0.11693 -0.0159223 +-0.0164885 0.0382449 0.0155037 +-0.0943085 0.12145 0.0162821 +-0.0604949 0.104288 0.0411949 +-0.0485787 0.153602 0.0103738 +0.0214629 0.119376 0.0329783 +-0.00921964 0.0390042 -0.0131222 +0.046038 0.044353 0.0245911 +0.00963825 0.115048 0.0386641 +-0.077742 0.161125 -0.0199262 +-0.0274983 0.0932247 0.0447643 +-0.0237144 0.062529 -0.0332478 +0.0256802 0.0685786 0.0440967 +-0.000627469 0.039269 0.0340794 +0.0387649 0.0834441 0.0350467 +-0.0144799 0.123658 0.0314246 +-0.0415001 0.0733705 0.042415 +0.0543119 0.0722872 0.00750454 +-0.0799536 0.133905 -0.00443135 +-0.0728995 0.10646 -0.0108772 +0.0465866 0.0714909 0.00427537 +-0.0734754 0.158245 -0.0309204 +-0.0217961 0.0784868 -0.0389208 +0.0328256 0.0611992 -0.0167775 +-0.00849082 0.119665 0.0373867 +-0.0345047 0.106995 0.0387065 +-0.0624367 0.153758 -0.0135798 +0.0343704 0.104711 0.0323207 +-0.0583832 0.0335298 0.00219999 +0.0202943 0.113982 0.0365633 +0.0149493 0.0344805 -0.015521 +0.0238985 0.104719 0.0399907 +-0.0270163 0.155641 -0.00359794 +-0.0207265 0.111071 -0.0196229 +0.00439792 0.0404664 -0.024069 +-0.0314988 0.165308 -0.00534483 +-0.0506374 0.0334455 0.00204379 +-0.0518913 0.130385 -0.00375074 +0.00347876 0.039945 0.0459765 +-0.0174912 0.108558 0.0415716 +-0.0618685 0.158412 -0.0345942 +-0.0509699 0.122064 -0.0109984 +-0.0801245 0.0746668 0.000525034 +0.0485976 0.0429932 0.0132228 +0.0202555 0.0707617 -0.0282449 +-0.086473 0.130788 0.000288786 +-0.0859798 0.13928 0.042828 +-0.0419021 0.157999 0.00424081 +0.0301266 0.0646197 0.0417292 +-0.0241332 0.0349697 0.043675 +-0.0554996 0.0466308 0.0421953 +0.0244135 0.114257 -0.0111426 +-0.0687634 0.168362 -0.025835 +-0.0212185 0.178615 -0.022031 +0.0451425 0.0775553 0.0229667 +0.0084768 0.116844 0.0380952 +-0.0619218 0.112503 -0.0143567 +0.0015045 0.0661578 0.0563313 +-0.0473123 0.0369901 -0.0152765 +0.0576745 0.0551294 0.00518333 +-0.0736262 0.148585 -0.0238576 +0.055706 0.0507437 0.0211984 +0.0038008 0.130941 0.0210967 +-0.0360463 0.0347343 0.0430826 +-0.0865396 0.139093 0.00420465 +-0.000664914 0.0539666 -0.0309917 +-0.0785368 0.0694183 0.0145853 +-0.0521695 0.144678 0.0173655 +0.0205519 0.0414936 -0.0177079 +-0.0764027 0.109871 -0.00664525 +-0.0455151 0.0533187 0.0381544 +-0.010362 0.0388675 -0.00761727 +-0.0465826 0.121367 -0.0123258 +0.060067 0.0636708 0.0191758 +-0.0214848 0.0347602 0.0479269 +0.0295458 0.115836 -0.00482165 +0.0188031 0.106638 -0.0169667 +-0.00873489 0.068452 -0.036144 +-0.0504955 0.0733248 0.0417999 +0.00250961 0.101617 0.0444387 +-0.0134598 0.0645734 0.0539775 +-0.0304851 0.038633 -0.015152 +-0.00443456 0.111901 -0.0205597 +-0.038606 0.0392918 -0.0284798 +-0.022624 0.0450535 -0.0281102 +0.0262273 0.117277 0.0307934 +0.0282585 0.063629 -0.0207965 +-0.0649158 0.115218 -0.010913 +-0.0197994 0.0799106 -0.0390737 +-0.042508 0.0930307 0.0424902 +-0.0683794 0.0434664 0.00169373 +-0.0648724 0.131147 0.0430922 +-0.00487539 0.105927 -0.0225105 +-0.0678583 0.112732 0.0457592 +0.00821621 0.124741 -0.00840458 +-0.0564446 0.0520481 -0.00138381 +-0.020896 0.107686 -0.0220438 +-0.0919111 0.120015 0.00829626 +-0.0188214 0.0841215 -0.0388306 +-0.00848834 0.10866 0.0434392 +-0.0674721 0.0639504 -0.00252382 +-0.0321962 0.0487152 0.0429222 +0.0422051 0.0972089 -0.00180239 +-0.0312857 0.125233 0.0186818 +0.0348151 0.0605689 0.0379285 +-0.07566 0.1555 -0.0199215 +-0.0582195 0.03947 0.0465299 +-0.0144966 0.0687907 0.0546395 +-0.0630713 0.173863 -0.0616798 +0.0398379 0.0874103 0.0331324 +0.0167269 0.0821369 0.052401 +0.0403742 0.101353 -0.00282827 +-0.0622911 0.150653 -0.0125749 +-0.0707931 0.0879477 -0.0165704 +0.048521 0.043083 0.00923259 +0.0132697 0.0603324 0.0507028 +-0.0230427 0.038006 0.0179945 +0.0585617 0.0538351 0.0161785 +-0.0548868 0.108372 -0.0183778 +-0.0712698 0.156094 0.0241098 +-0.0053845 0.126096 -0.00772897 +-0.076026 0.151346 0.0359505 +0.00881068 0.127643 0.0286728 +-0.0229191 0.119996 -0.0109969 +-0.0702091 0.156071 0.0113882 +-0.0285896 0.0704574 -0.0325207 +-0.0373694 0.173381 -0.00150317 +0.043508 0.0438731 -6.08517e-05 +-0.0434927 0.0747943 0.0426652 +-0.0817644 0.0758778 0.0206878 +-0.00439411 0.0968663 -0.0305974 +0.00748123 0.0937253 0.0527164 +0.0101565 0.0860282 0.0551829 +-0.0132478 0.039072 0.0352601 +-0.0786774 0.168631 -0.0343418 +-0.0500333 0.148713 -0.00320857 +0.00694939 0.128215 0.0280149 +0.0132662 0.0737717 -0.03084 +-0.089989 0.142041 0.0291697 +-0.0298412 0.0944347 -0.0243277 +-0.0866185 0.103641 0.022352 +0.0179014 0.114016 -0.0148856 +0.0537258 0.0735615 0.0163564 +-0.0413654 0.128702 0.0120304 +-0.0855876 0.0939777 -0.00157288 +-0.0828574 0.0764021 0.018249 +-0.0454932 0.0491469 0.0390026 +-0.0317045 0.0693753 -0.0244624 +-0.0587034 0.0579543 0.010904 +-0.0269178 0.034755 0.0450156 +-0.0520173 0.146257 0.0174096 +-0.0759561 0.112612 -0.00567952 +-0.0164906 0.0786958 0.056769 +-0.0778425 0.108614 0.0370385 +0.0422463 0.0403355 0.0183005 +-0.0845698 0.0831877 0.0245094 +0.00429984 0.0654625 -0.0332399 +-0.0572715 0.0482006 0.0365817 +0.0290027 0.0741128 0.0436952 +-0.0600502 0.143934 0.0360579 +0.0366467 0.0673305 0.0371158 +-0.0199983 0.126616 0.0197793 +-0.0728415 0.165906 -0.0186805 +-0.0634251 0.128316 0.0434644 +-0.0437757 0.12944 0.0066621 +0.000274533 0.0683164 -0.033854 +0.00152244 0.03707 0.0220484 +-0.0349517 0.151884 -0.00344832 +-0.0271199 0.0347243 -0.0201972 +0.0433938 0.0426486 0.00136855 +0.000501319 0.0576739 0.0545888 +-0.0636327 0.155181 -0.0386163 +-0.0884108 0.0928321 0.00744302 +-0.0495652 0.0614019 0.0343808 +-0.0434939 0.0930777 0.0427388 +-0.0662865 0.178231 -0.0601734 +-0.054498 0.111159 0.0367038 +-0.0460532 0.057401 0.0380948 +-0.0820259 0.0858257 0.0320864 +-0.0277337 0.0521019 -0.0243965 +-0.00442413 0.130145 0.0224484 +-0.00149759 0.0549023 0.0548542 +-0.035558 0.0430076 -0.0284728 +0.0593498 0.066038 0.0207029 +0.0515344 0.0624078 0.0294591 +-0.0197872 0.118912 -0.0118682 +-0.0168075 0.0827608 -0.0394117 +-0.0487872 0.0545643 0.0352206 +-0.0311424 0.174761 -0.015609 +-0.0326324 0.0534241 -0.0105104 +0.00577065 0.131636 0.0103849 +-0.0185368 0.123815 0.0276913 +-0.0454963 0.0818291 0.0431013 +-0.0634376 0.179008 -0.0598746 +-0.00652958 0.0443624 0.0478753 +-0.0308041 0.0566412 -0.01742 +0.0448472 0.0735234 0.00122364 +-0.00349567 0.0504603 0.052334 +-0.0298753 0.0537337 -0.0203803 +-0.00256734 0.0388997 -0.00235847 +-0.0502892 0.0334774 -0.00701976 +-0.00481396 0.0840888 -0.0377627 +0.0387801 0.058953 0.031306 +-0.0243507 0.0852386 0.0537426 +-0.077502 0.0785105 0.0333799 +-0.0695501 0.0378481 -0.00149869 +-0.0313945 0.0862693 -0.0285563 +-0.0759552 0.133992 -0.00682355 +-0.0783042 0.161088 -0.0239376 +0.0512217 0.0595245 0.030012 +0.0455105 0.0777762 0.00219892 +-0.0860997 0.0805682 0.0085045 +-0.0347118 0.121713 -0.00868145 +-0.0621446 0.0384632 0.0179813 +-0.0124987 0.115524 0.0391996 +-0.0407326 0.0341812 -0.0112599 +-0.0762949 0.0689313 0.00454567 +-0.0900211 0.137875 0.0231818 +0.0335661 0.0612752 -0.015761 +-0.0620569 0.121268 0.0436785 +0.0389827 0.104151 0.026189 +-0.0724692 0.135469 0.0497506 +0.0222613 0.0692548 -0.0269722 +-0.0614967 0.0876222 0.0452319 +-0.0694862 0.120387 0.0531587 +0.0384699 0.0786144 -0.011749 +-0.0225096 0.10992 0.040117 +0.0140839 0.123776 -0.0073928 +0.0455444 0.0774866 0.0217209 +0.0421217 0.0751567 0.0292241 +-0.0637125 0.165316 -0.0311513 +0.00714876 0.108764 -0.0200496 +-0.0613421 0.118288 0.041013 +0.0150763 0.0900809 0.0517899 +0.0392297 0.0926988 -0.0100859 +-0.0707648 0.0836514 -0.0167885 +0.0199669 0.107838 -0.0162613 +-0.0573264 0.0521522 0.00163442 +0.03817 0.0983612 -0.0088053 +-2.43522e-05 0.0348774 0.0110061 +-0.0647928 0.0346609 0.0159953 +-0.0765127 0.164562 -0.0208538 +-0.0398786 0.107079 -0.0200332 +-0.0315509 0.053914 -0.013393 +-0.0689152 0.109432 -0.0116742 +-0.0426992 0.0344898 0.0348747 +-0.0113643 0.182132 -0.0288209 +-0.0251052 0.162299 -0.0151004 +-0.0745879 0.156108 0.0200327 +-0.0686632 0.162379 -0.0529737 +-0.0867316 0.100467 0.0250232 +0.0335218 0.0499029 0.0322045 +0.0110844 0.0345718 0.0406762 +0.047975 0.0710438 0.0215578 +-0.0471313 0.132491 0.00541336 +0.0385464 0.0954957 -0.00890109 +-0.055495 0.154378 0.0181054 +-0.0486202 0.0403225 0.04496 +-0.0918049 0.121541 0.0434848 +-0.0427276 0.129253 0.0100405 +-0.0641572 0.150753 -0.03179 +0.0203307 0.08353 0.050588 +-0.0025157 0.127417 -0.00520554 +-0.0664375 0.153657 -0.0486366 +0.00823253 0.112336 0.0401545 +-0.0239671 0.075324 0.0508435 +-0.0519769 0.0340995 -0.0134375 +-0.0444607 0.0902688 0.0428496 +-0.043053 0.153237 -0.00732462 +-0.0520076 0.145723 -0.00116844 +-0.0587286 0.0620484 0.0269094 +-0.0876727 0.111787 0.0358475 +-0.0843489 0.0925325 -0.00454911 +-0.00849886 0.0856701 0.0574538 +-0.0681283 0.146379 -0.0251159 +-0.0800217 0.102057 0.0324029 +-0.0662458 0.167287 -0.027765 +0.0214869 0.0865002 0.0492244 +-0.0485551 0.129676 -0.000935313 +-0.021529 0.17126 -0.0137526 +0.0263623 0.0808978 0.0469671 +-0.00180556 0.0384438 0.0201303 +0.0199827 0.116932 -0.0120267 +0.000700235 0.0374335 0.0215506 +-0.0849215 0.130733 -0.00170191 +-0.0566837 0.0492811 -0.00237706 +0.013902 0.054865 0.0498147 +-0.0487235 0.0738176 -0.0166605 +-0.0588289 0.089737 -0.0207103 +-0.00415565 0.0996194 0.0496007 +0.00922789 0.0860105 0.0556146 +-0.052373 0.126911 0.0347775 +-0.0647638 0.0397203 0.0149016 +-0.0375028 0.102851 0.0403695 +0.012678 0.130036 0.0186174 +0.01582 0.0346802 0.0234839 +-0.0834012 0.146003 0.0386574 +-0.0855432 0.111388 0.0330811 +-0.0905559 0.1297 0.0402277 +0.0225 0.108418 0.039052 +-0.034538 0.033729 0.00866796 +0.0580527 0.0523859 0.0111812 +0.0489522 0.045877 0.023734 +-0.0741385 0.0703655 0.0287707 +-0.0261092 0.0409213 0.0540071 +-0.0124916 0.0801274 0.0575032 +-0.0480938 0.0362157 0.0456887 +0.0295798 0.047722 0.0354768 +-0.051366 0.129708 0.032749 +-0.0258406 0.0339312 -0.0210821 +-0.0627466 0.0751872 -0.0173542 +-0.0208698 0.104444 -0.0228641 +0.0391583 0.108387 0.0121653 +-0.0217873 0.0728206 -0.0385569 +-0.00162182 0.0363065 0.0130228 +-0.0125908 0.182249 -0.0250896 +-0.0463216 0.125305 0.0258345 +0.00739775 0.110951 0.0406753 +-0.0698286 0.0965949 -0.0159812 +0.0495953 0.0662964 -0.000416722 +0.0214 0.116687 0.0346491 +0.0355013 0.0605581 0.0371681 +0.0347485 0.0981702 0.0363481 +-0.0784998 0.130283 0.0530344 +-0.0139533 0.0338864 -0.0205741 +-0.0185901 0.128007 0.0115203 +-0.0538047 0.0884108 -0.022116 +0.0213383 0.0635548 -0.0266585 +-0.0194915 0.120861 0.0324568 +-0.0347476 0.127441 0.00854521 +-0.0126238 0.0952928 -0.0330113 +-0.00102634 0.107271 -0.0216101 +0.0225395 0.0352111 0.00978173 +0.0193228 0.0679612 -0.0287395 +0.00111873 0.0344764 0.0134191 +0.0375161 0.110639 0.00638069 +0.0222494 0.0762728 -0.0263867 +-0.0729386 0.0646873 0.0146181 +-0.0397368 0.0739371 -0.0178005 +-0.0543178 0.0387289 0.0471882 +0.016338 0.0566541 -0.0286494 +0.0299119 0.0491593 0.0359714 +0.0525507 0.0462401 0.0172033 +0.0138891 0.0942573 -0.0257865 +-0.00745761 0.0338748 -0.0230567 +-0.073507 0.121801 0.0535653 +-0.0771635 0.0705018 0.0227664 +0.014215 0.083589 -0.0300782 +0.0187635 0.105558 -0.0177865 +-0.0943455 0.121485 0.0232874 +-0.0190471 0.0582949 0.0492947 +-0.0482842 0.164088 -0.00583628 +0.00750123 0.074495 0.0564449 +0.0114903 0.0896115 0.0540357 +0.0111129 0.0739356 0.0547693 +-0.0243199 0.0387345 -0.0140132 +0.0343886 0.107359 0.0305696 +0.0280618 0.0416802 0.0314173 +0.01142 0.0374719 -0.022733 +0.0330999 0.114889 0.024788 +-0.0199406 0.122541 -0.00772092 +-0.0662581 0.15274 0.0347724 +0.00215199 0.101646 -0.0224127 +0.0164932 0.112605 0.0382483 +-0.06512 0.166493 -0.0287867 +-0.0848366 0.0898781 -0.00356125 +-0.0321536 0.0380399 -0.0168 +-0.000666067 0.037425 0.0194672 +-0.0009793 0.0356154 0.0137824 +-0.0338572 0.100054 -0.0225702 +-0.0466969 0.0694537 -0.0155404 +-0.0236112 0.0386852 0.0334692 +0.0506847 0.044695 0.00922239 +0.0143403 0.11733 -0.0144441 +0.0447757 0.0875223 -0.000814326 +0.0359341 0.0727624 -0.0138488 +-0.0526285 0.0588799 -0.00854194 +-0.090746 0.114598 0.00833305 +0.0454568 0.0819591 0.00221362 +-0.0191965 0.175667 -0.0232885 +-0.062765 0.0780997 -0.0182585 +0.0414338 0.0676164 -0.00577635 +-0.053491 0.113891 0.0350292 +0.0043588 0.0510132 -0.0293749 +-0.00874604 0.0713519 -0.0371122 +0.0193852 0.0915557 -0.024942 +-0.0944514 0.122808 0.0172688 +-0.00774122 0.115628 -0.0165086 +-0.0406319 0.0534345 -0.0110028 +0.0230588 0.0463265 0.0401038 +-0.0769246 0.0689689 0.00654258 +0.0278197 0.108769 0.0368873 +-0.078478 0.142827 0.0455967 +0.0339472 0.0368914 0.0179028 +0.0140143 0.0357038 0.00388789 +-0.0699623 0.155307 -0.0499609 +-0.0144161 0.0343188 -0.0191903 +-0.044261 0.122001 0.0258917 +-0.064466 0.170264 -0.0443864 +-0.0614851 0.112533 0.0365644 +-0.0649074 0.120907 -0.00883756 +0.0114806 0.097647 0.0487825 +0.00178793 0.0344587 0.00626566 +0.0404914 0.098527 -0.00482713 +-0.0714142 0.166619 -0.0469903 +0.0553639 0.0729653 0.0110394 +-0.00645384 0.126073 -0.0076982 +-0.042494 0.0676556 0.0412962 +-0.0328931 0.0486572 0.0421875 +-0.0218312 0.0882119 -0.0370399 +0.0433826 0.0987102 0.00417641 +-0.034498 0.0533048 0.037996 +-0.0749535 0.0823401 -0.0135889 +-0.0755022 0.131669 0.0524935 +-0.0118269 0.118985 -0.0140536 +-0.0698809 0.100876 -0.0145572 +-0.0920212 0.128183 0.00926455 +-0.0277533 0.155598 -0.00253083 +-0.0155991 0.0421323 -0.0272897 +0.0125549 0.119968 -0.0132874 +-0.0862929 0.15121 0.027304 +-0.0726068 0.147127 -0.0218633 +-0.0713282 0.0982044 0.0407618 +-0.023785 0.0621839 0.0426152 +-0.0294793 0.0446083 0.0503994 +0.050676 0.0693821 0.00244948 +-0.0520559 0.142894 8.38275e-05 +-0.085494 0.083212 0.00349969 +0.0219046 0.0892697 -0.0245066 +-0.0923861 0.125586 0.0352607 +-0.0578149 0.12313 -0.00798101 +-0.0630458 0.0345815 0.0177326 +-0.0890554 0.0888307 0.00946144 +-0.066735 0.167252 -0.0265095 +0.0143257 0.0594816 -0.0287805 +0.00349695 0.0519735 0.0532512 +-0.0658642 0.141582 -0.00840157 +0.014169 0.0603418 0.050255 +-0.0638047 0.152122 -0.00224548 +0.0332402 0.0814034 -0.0189012 +-0.0246071 0.0408479 -0.0291354 +-0.0320867 0.0651952 -0.0194497 +-0.0719291 0.0394019 0.00652921 +-0.0297834 0.0409697 0.0520218 +-0.035582 0.0336826 0.00849877 +-0.088744 0.0996845 0.0203875 +0.0516874 0.0662489 -0.000355134 +-0.0802571 0.096729 0.0342047 +-0.0669809 0.135535 -0.00827796 +-0.069479 0.0337046 -0.000209101 +-0.0675145 0.148386 0.0398761 +-0.0805311 0.123088 0.0509172 +-0.0084955 0.0503277 0.0510127 +0.00205693 0.129985 1.8398e-05 +-0.0172313 0.12808 0.0178394 +0.00170313 0.0343139 0.0118694 +-0.0773727 0.156953 -0.0129034 +-0.0717154 0.0632455 0.0160979 +0.00858548 0.0340902 -0.01633 +0.0124197 0.0403679 -0.0230567 +-0.0511271 0.116882 0.0329705 +-0.0728598 0.0355014 0.00645302 +-0.0791962 0.16801 -0.0379842 +-0.00268972 0.128069 -0.00389854 +0.0597918 0.0567046 0.013171 +0.0154995 0.111258 0.0392925 +-0.019299 0.0668878 0.052102 +-0.0233826 0.0866124 0.0541509 +0.0432138 0.091668 0.0251628 +-0.0396808 0.0636721 -0.0135815 +0.00652038 0.0518639 0.0525018 +0.0124104 0.0389053 -0.0225983 +-0.0119403 0.171322 -0.0192115 +-0.069435 0.0972593 0.0417284 +-0.0942583 0.125557 0.0232684 +0.030238 0.0814876 -0.0201701 +0.0449279 0.0945923 0.00916323 +-0.0553588 0.131132 0.0357618 +0.00929414 0.0653548 -0.0316941 +-0.0357484 0.0768864 -0.0192776 +-0.062693 0.156802 -0.0376031 +-0.0460193 0.128067 0.0236255 +0.0133301 0.0609017 -0.0290805 +0.00152141 0.0773467 0.0574533 +-0.0636035 0.156128 0.0166435 +-0.0361137 0.162217 -0.0137308 +-0.0595062 0.0386574 -0.00901889 +-0.0620309 0.153757 -0.0155846 +-0.0533723 0.122605 0.0368904 +-0.0264702 0.0676761 0.0408217 +-0.0147452 0.123455 -0.00671201 +-0.0703548 0.0643588 0.00158224 +-0.0814272 0.0752484 0.0195365 +0.0402499 0.0787503 -0.00875238 +-0.00644119 0.0828529 0.0570838 +0.0242228 0.0902502 0.0474811 +0.0336268 0.0557054 -0.0117007 +-0.0623153 0.13671 0.0362243 +0.0149059 0.124307 -0.00595517 +-0.0401601 0.165169 -0.0119868 +-0.077431 0.108115 0.0357399 +0.0402513 0.0940026 0.0302416 +0.0370616 0.0382621 0.0191175 +0.0225195 0.106011 0.0397482 +-0.0255993 0.037974 -0.029094 +-0.0759547 0.129619 -0.00760722 +-0.0360191 0.153642 0.00214438 +0.0596848 0.0566967 0.0151763 +-0.0264473 0.181471 -0.0150302 +-0.0346676 0.0359024 -0.017193 +0.0391135 0.0904981 -0.0117677 +0.00550174 0.0745058 0.0566062 +-0.0615874 0.117934 -0.0105067 +-0.0897323 0.115129 0.0291209 +0.0371127 0.037099 0.0128773 +0.000643571 0.127035 0.0301068 +0.04471 0.0789677 0.024116 +-0.0294983 0.0588236 0.0368769 +0.0243457 0.102123 0.0424029 +-0.0890326 0.125361 0.00330134 +-0.0671124 0.0618759 0.00376788 +0.0207378 0.105279 -0.0174962 +-0.0640597 0.156709 -0.043612 +-0.053836 0.112592 -0.0169505 +-0.0738585 0.0762694 0.0355202 +-0.00709045 0.130506 0.0171336 +-0.0735939 0.077695 0.036626 +-0.0453238 0.169855 -0.00399069 +-0.0609112 0.060145 0.00105228 +-0.0602298 0.119796 0.0409592 +-0.037803 0.0885803 -0.0235006 +0.0220645 0.0375334 0.0362702 +-5.6077e-05 0.112952 -0.0196345 +-0.0156034 0.097548 -0.0273897 +0.0330435 0.104766 0.033885 +0.0234619 0.0343557 0.00702041 +0.0309186 0.094253 -0.0177648 +-0.0406484 0.0563266 -0.0113192 +0.0305338 0.0929359 0.042541 +-0.0713282 0.155382 -0.0439108 +-0.0246656 0.0492403 -0.0269082 +-0.0344954 0.118007 0.0312549 +0.03264 0.0822319 0.0419892 +0.0393737 0.0381589 0.0105128 +0.00986741 0.131059 0.0147331 +-0.0521114 0.156091 -0.00406652 +0.0125143 0.121868 -0.0113432 +-0.019839 0.0610753 0.0486026 +-0.0714347 0.109953 0.0409933 +-0.0435006 0.115257 0.0335166 +-0.0700918 0.147968 0.0410511 +-0.0628279 0.151059 0.0360546 +-0.0269995 0.0383068 0.000625566 +-0.0459023 0.0546326 0.0380387 +-0.0705411 0.0860609 0.0417748 +-0.0360717 0.157766 -0.0114869 +0.018169 0.108481 -0.0169141 +-0.0656915 0.0720893 -0.0135891 +-0.0604976 0.0847283 0.0441029 +0.00648432 0.0413231 0.0455852 +-0.0757282 0.0754387 0.0328339 +0.00417753 0.0922823 -0.0325433 +-0.0272993 0.0381948 -0.0178418 +-0.0315044 0.0860003 0.0426216 +-0.00681874 0.0868473 -0.0370495 +0.0396972 0.0744788 -0.00980523 +0.0376515 0.0947835 -0.010301 +-0.078491 0.121738 0.0515581 +-0.0274838 0.105666 0.0409158 +-0.0202559 0.0365056 -0.0280118 +0.0201693 0.125674 0.00144037 +-0.0587501 0.0482189 0.00571238 +-0.013346 0.168342 -0.0159797 +-0.0683811 0.149044 -0.0363633 +-0.0558475 0.0343686 0.0374162 +-0.0590903 0.0626036 0.0281123 +-0.0331372 0.0336314 -0.0222436 +-0.0678611 0.0980605 -0.0159397 +-0.0472308 0.0334623 0.00452598 +-0.0167567 0.0714512 -0.0386579 +-0.0184671 0.10319 -0.0232847 +-0.0675365 0.0805511 0.0417814 +-0.0666009 0.15275 -0.0468174 +-0.00387787 0.10737 -0.022403 +-0.0300213 0.0579734 -0.0204069 +-0.00579466 0.103184 -0.0232761 +-0.0775304 0.143071 -0.00473432 +-0.00757151 0.0346922 -0.0244599 +-0.0355091 0.0676694 0.0413832 +-0.0185092 0.127137 0.00354165 +0.0289004 0.0650837 -0.0199869 +-0.0224914 0.04868 0.0491885 +-0.0194885 0.0856172 0.056795 +-0.0625301 0.147537 -0.0105732 +0.00324634 0.0726279 -0.0347233 +-0.0117444 0.129778 0.0154481 +0.0381223 0.106958 0.0251953 +0.0134297 0.0343278 -0.0118215 +0.00450615 0.0772491 0.0561317 +0.00914326 0.112364 0.0397506 +0.0165994 0.0933382 -0.024824 +-0.0530349 0.0448324 0.0176964 +-0.0861503 0.0818963 0.00748815 +-0.07574 0.144451 -0.00587632 +-0.0796195 0.104749 0.0319273 +0.0404835 0.052774 0.0322642 +0.0420568 0.0986443 0.0231563 +-0.0887511 0.102351 0.0133854 +0.0132668 0.0723896 -0.0312102 +-0.0507233 0.0723393 -0.0157137 +-0.00754786 0.039018 -0.00905888 +-0.0488259 0.138613 0.00940263 +0.0057745 0.128094 -0.00399317 +-0.0523396 0.147791 0.0193952 +-0.048265 0.136372 0.0159973 +-0.0604426 0.0470258 0.0346715 +0.0367367 0.0902141 0.03744 +-0.0895793 0.136441 0.0122186 +0.0376089 0.108292 0.000165208 +0.0353713 0.0915869 0.0389643 +-0.0211976 0.0347654 0.0444796 +0.00223085 0.129379 -0.00131325 +-0.0737831 0.0864021 -0.0154104 +-0.0127393 0.0700008 -0.0380391 +-0.0657273 0.0751276 -0.0164058 +0.00937487 0.0377648 0.0302588 +-0.035816 0.0448118 0.0437923 +-0.0549046 0.102722 -0.0198351 +0.0460481 0.046714 0.0276632 +0.00759173 0.131318 0.00819364 +-0.0721931 0.161015 -0.0399435 +0.0102622 0.0710503 -0.0323195 +0.0194745 0.0851519 0.050256 +-0.0399319 0.0345158 0.0389424 +-0.0616692 0.167812 -0.0545903 +-0.0056922 0.0584499 -0.034018 +-0.0203692 0.094546 -0.032294 +-0.070351 0.158156 -0.0469171 +-0.023866 0.103031 -0.0237009 +0.0528846 0.0533107 -0.0017243 +-0.0319516 0.077812 -0.0315646 +0.00951738 0.0660057 0.0546772 +0.0137336 0.122464 0.0333928 +-0.0199595 0.125484 -0.000738697 +0.00049871 0.116947 0.0399069 +-0.0359892 0.0344491 0.0345711 +-0.0443682 0.129764 0.015339 +0.0452819 0.0932028 0.00617084 +-0.00813465 0.0391286 -0.0130168 +0.0394097 0.0618135 -0.00677045 +-0.0701845 0.158483 -0.00465374 +0.0322675 0.102123 0.0362847 +-0.0374987 0.0819015 0.0436538 +0.0396969 0.0616754 0.0309066 +-0.0455673 0.0475992 -0.010259 +-0.0527627 0.115451 0.034109 +0.0208176 0.0631975 0.0476002 +-0.0618301 0.0924936 -0.0189652 +-0.053883 0.150856 0.0253998 +0.0245243 0.105615 0.0392344 +0.00385761 0.129628 0.0254511 +-0.00549072 0.0488848 0.0502608 +-0.0300389 0.036799 0.0524219 +-0.0580426 0.153536 0.0303048 +0.0220166 0.125337 0.0220596 +0.0312265 0.0393227 0.0260732 +-0.0171047 0.17569 -0.0178772 +0.016571 0.0940211 0.0486896 +-0.0505514 0.0338848 0.0267025 +-0.0625417 0.0410514 0.0154849 +0.0355348 0.112677 0.0214127 +0.00150774 0.0897546 0.056027 +-0.0190957 0.0968508 -0.0266962 +0.0511508 0.0608575 0.0299274 +0.0163905 0.0491901 -0.024833 +0.0345652 0.114846 0.0110543 +0.0581139 0.0523629 0.0131822 +-0.0417396 0.0754091 -0.018561 +-0.0814751 0.118981 0.0489466 +0.00013405 0.105909 -0.0216496 +-0.0908345 0.139239 0.02018 +-0.0424766 0.101515 0.0416909 +-0.0260624 0.0837492 0.0512652 +-0.0500875 0.0531258 0.0337221 +-0.0706477 0.0874116 0.0418374 +-0.0366978 0.0363155 -0.0300943 +0.00451245 0.064772 0.0563635 +-0.0753069 0.109577 0.0422017 +-0.0284025 0.119846 0.0286714 +0.033406 0.0822268 0.04133 +0.0595932 0.0608555 0.0201843 +-0.00204808 0.0983649 0.051847 +-0.0574847 0.0623327 0.0283417 +-0.0229389 0.126187 0.00412352 +0.0390327 0.0744186 -0.0107818 +-0.0855097 0.129367 -0.00169404 +-0.0647036 0.0653044 0.0298737 +-0.0064934 0.10867 0.043581 +-0.0685164 0.0669975 0.0293604 +-0.0705096 0.1624 -0.046948 +0.0125251 0.129483 0.0214195 +-0.0221845 0.172691 -0.0208918 +0.0153262 0.0767707 0.0538598 +-0.0905235 0.137837 0.0161933 +-0.0545439 0.0402656 -0.0102441 +-0.0688509 0.171089 -0.0344529 +-0.0884641 0.0887716 0.00547605 +-0.0903526 0.116014 0.0283099 +-0.0623807 0.147545 -0.00857398 +-0.061927 0.109672 -0.0156348 +-0.0579856 0.116646 -0.0132522 +0.0395731 0.0448559 0.0300931 +0.00658391 0.130753 0.00354793 +-0.0647804 0.153444 -0.00410741 +0.00522677 0.078235 -0.0342467 +-0.0495662 0.0335706 -0.0032948 +0.00181081 0.131692 0.0146438 +-0.0635975 0.15411 -0.00948093 +-0.0855227 0.133522 0.000289437 +-0.025262 0.107417 -0.0217613 +-0.0340021 0.0409714 0.0491624 +-0.0146057 0.0406867 -0.0271172 +-0.0174894 0.0687336 0.053904 +-0.01522 0.183001 -0.0269465 +-0.0500642 0.142991 0.00242772 +-0.0679313 0.0622594 0.0032802 +-0.0551811 0.133216 -0.00483226 +-0.0284216 0.0792864 0.045297 +0.00824429 0.0809884 -0.0331618 +0.00929618 0.123787 -0.00937811 +0.0228212 0.0889774 -0.0242065 +-0.0185099 0.0883573 0.0560195 +0.0282298 0.0717826 -0.0228933 +-0.0251238 0.125152 0.00185767 +0.019545 0.103378 0.0442321 +-0.0673703 0.122848 0.0518073 +0.0357587 0.067099 -0.014806 +0.00197653 0.0987575 -0.0246237 +-0.0655762 0.155146 -0.00586759 +0.012488 0.119576 0.0355898 +-0.0514967 0.101534 0.0419051 +-0.0095351 0.0444416 0.0488648 +-0.00470695 0.0982478 -0.0280611 +-0.05601 0.0575293 -0.00241387 +-0.0602761 0.139548 0.0339321 +-0.0517453 0.0753545 -0.0181561 +-0.038969 0.042042 0.0415955 +-0.0636896 0.064322 -0.00564195 +-0.0398457 0.0985451 -0.0219087 +-0.0191826 0.127252 0.0185952 +-0.0873123 0.0886781 0.00248146 +-0.0488082 0.0884112 -0.0217819 +-0.0498768 0.104205 -0.0203216 +-0.0409029 0.149467 0.00342301 +-0.069185 0.156032 0.0248455 +-0.0506717 0.0501974 0.0196351 +-0.0301161 0.0396403 0.0523893 +-0.000520242 0.104454 0.0440018 +-0.0290025 0.0578755 -0.022406 +-0.0610145 0.0336026 0.00878975 +-0.0917872 0.143341 0.0171661 +-0.0279974 0.0383174 -0.0050935 +-0.0913132 0.113305 0.0163255 +0.0313508 0.109263 -0.00976359 +-0.00332487 0.0387243 0.0268007 +0.0222104 0.125239 0.00503339 +-0.04503 0.129294 0.00327025 +-0.0176724 0.0933571 0.0538975 +-0.0234883 0.0487024 0.0493089 +0.0421092 0.0724515 0.0291612 +-0.0653912 0.159256 -0.0130566 +-0.00402317 0.0387663 0.0011878 +-0.0338313 0.0929547 -0.0239607 +0.00379004 0.0367184 0.046186 +-0.0186801 0.0525094 -0.0314832 +-0.0351354 0.165203 -0.0147634 +-0.0705038 0.108294 0.0372772 +0.0246817 0.0360382 0.0240669 +-0.0204805 0.0828473 0.0567838 +0.0326609 0.0673309 0.0401471 +-0.0296335 0.0635627 -0.0254272 +-0.0548571 0.0546624 -0.0043828 +0.00968485 0.0342244 -0.0162577 +-0.0810826 0.144759 0.0420272 +0.00767659 0.0346834 0.0054103 +-0.0830301 0.110196 0.00131843 +-0.00544058 0.119032 -0.0141551 +-0.0255852 0.0930492 -0.0306058 +-0.0714911 0.116102 0.0521112 +0.0318609 0.0710037 -0.0187224 +0.0280264 0.121739 0.0100361 +-0.0514799 0.0384723 -0.0115832 +-0.0764395 0.0988661 -0.011539 +-0.0186212 0.04503 -0.027692 +0.0334766 0.0519565 -0.00767966 +-0.0541438 0.151337 0.0259237 +-0.00148294 0.0606073 0.0558577 +0.0148272 0.0344434 -0.00977208 +-0.0391932 0.171233 -0.0109027 +-0.035755 0.0783248 -0.0195335 +0.0355134 0.0795005 0.0390801 +0.0603494 0.0609121 0.0171857 +0.0394635 0.075864 -0.00982057 +-0.0470363 0.0359078 0.0451061 +-0.0608634 0.154346 0.0292597 +-0.0748097 0.109257 0.0407877 +-0.0262745 0.0692227 0.0420449 +0.0243768 0.0533073 -0.022554 +-0.0530668 0.0348658 0.0444554 +0.0259946 0.0347155 0.014606 +-0.0591124 0.121234 0.0408265 +-0.0144894 0.112737 0.0404341 +-0.0838486 0.0803675 0.00250235 +-0.0582446 0.13534 0.0351018 +-0.0214986 0.100246 0.0444424 +-0.0713881 0.068562 0.0291565 +-0.0155474 0.160527 -0.0107791 +0.0215063 0.107058 0.0398344 +-0.0331542 0.158077 0.00281987 +-0.0863235 0.110381 0.0203696 +-0.0312005 0.162424 -0.00314295 +0.0384543 0.0395883 0.0218564 +0.0385307 0.0554981 0.0313684 +-0.0114896 0.0560578 0.0523304 +0.0593092 0.0622231 0.0211664 +-0.0648434 0.0339553 0.0130374 +0.0180082 0.0355585 0.00482766 +0.0399371 0.077993 0.0331058 +0.00160174 0.0351275 0.0454175 +-0.032718 0.0396362 0.0507617 +-0.0524899 0.0973506 0.0433264 +-0.032502 0.104286 0.0408563 +-0.00468764 0.0584239 -0.0337898 +-0.0672529 0.0760725 0.0393761 +0.0584714 0.0552095 0.0201836 +-0.0416396 0.0548863 -0.0113812 +0.014767 0.129313 0.0151085 +0.0271615 0.0578042 0.0426556 +-0.0133509 0.0384568 0.00507202 +-0.0770775 0.0703016 0.00351307 +-0.0514866 0.0748352 0.0426181 +-0.0882111 0.0936365 0.0238814 +-0.0906238 0.143032 0.0276653 +0.0233319 0.059176 0.0459237 +-0.036826 0.0446589 -0.0260242 +0.0332346 0.0955533 0.0394336 +-0.000484271 0.038989 -0.00201961 +0.0427221 0.101476 0.00816485 +0.0419002 0.102864 0.0131587 +-0.0208004 0.181643 -0.0143459 +0.0352424 0.0726953 -0.0147969 +-0.0234839 0.0509996 0.0435588 +0.0352381 0.0443124 0.029693 +0.000403091 0.0348316 -0.0232847 +-0.0684959 0.10279 0.039811 +0.019265 0.0708008 -0.0287723 +-0.0516068 0.0345225 0.0433683 +0.0391514 0.0617239 0.0318804 +0.0135008 0.111258 0.0394003 +0.0304359 0.108504 -0.0109544 +-0.038743 0.0768256 -0.018638 +-0.0223183 0.094515 0.0486399 +-0.0435018 0.0478421 0.040059 +-0.0727332 0.173623 -0.0510446 +-0.00349112 0.118315 0.0390164 +-0.0884421 0.133772 0.0426038 +-0.0454967 0.109818 0.0383281 +-0.0145 0.0392233 0.0384538 +-0.00466385 0.129429 0.0252614 +-0.00582274 0.088227 -0.0364178 +-0.0454902 0.0352033 -0.0224188 +-0.0348607 0.100046 -0.0224582 +-0.0792519 0.17071 -0.0410714 +-0.0376133 0.0393512 -0.0290006 +-0.0640598 0.170094 -0.0457055 +0.0303225 0.119467 0.0166127 +-0.0902791 0.116199 0.0435835 +0.0222032 0.0352055 0.0243097 +-0.073336 0.0968702 0.0400088 +-0.0376144 0.0393494 0.044329 +-0.0105011 0.0870252 0.0569814 +-0.0507332 0.161533 -0.00440491 +-0.0779412 0.162504 -0.0229403 +-0.0754919 0.128859 0.0530266 +-0.0541372 0.0344723 0.0359505 +0.0113242 0.0581457 -0.0297724 +-0.0442953 0.0391467 0.0441537 +0.0242713 0.035754 0.000294462 +-0.0615051 0.159991 -0.0325895 +-0.00166807 0.0568963 -0.03242 +-0.0119937 0.164096 -0.013967 +0.0166698 0.0900802 0.0505874 +0.0232051 0.0672264 0.0457926 +-0.0547028 0.0693497 -0.0142348 +-0.0645039 0.15312 0.03389 +-0.0344884 0.0918084 0.0445658 +0.0553932 0.0493283 0.0071983 +-0.047221 0.115086 -0.0157836 +-0.0737507 0.0835282 -0.0152437 +-0.00700363 0.0992954 0.0501023 +-0.0124605 0.0646213 0.0545516 +-0.0529942 0.0345374 0.0413527 +-0.0926054 0.122844 0.0302746 +-0.0652377 0.0419529 0.0337045 +0.0450967 0.0889619 0.00117113 +-0.0632063 0.0448721 0.0103941 +-0.0177692 0.074285 -0.0389303 +-0.0226723 0.0582322 -0.0321918 +-0.0233871 0.0380454 0.010662 +0.0144228 0.120472 -0.0118376 +-0.00758227 0.0362053 -0.0250795 +-0.0394882 0.0804267 0.0429074 +0.0505096 0.0651476 0.0284061 +0.0412879 0.0914659 -0.00877665 +-0.0613587 0.0343255 -0.00949544 +-0.0739143 0.148544 -0.0218644 +-0.0607701 0.0447346 0.0418038 +-0.0300938 0.0476999 -0.0248901 +-0.0666558 0.0720875 -0.0129051 +-0.0732714 0.156195 0.0132096 +-0.0340151 0.0498932 -0.013349 +-0.0484988 0.0762375 0.0432182 +-0.0614924 0.0384787 0.0187446 +-0.0572292 0.155416 0.0145778 +-0.0105966 0.0391805 -0.0262222 +0.00120442 0.117582 -0.0166604 +-0.070211 0.165211 -0.0489867 +0.0483875 0.0444574 0.00325794 +-0.0764978 0.13308 0.0521415 +-0.035201 0.0345651 0.0381519 +-0.00449959 0.107273 0.0439086 +-0.0266181 0.042276 -0.0292233 +-0.0364985 0.120712 0.0292752 +-0.0735593 0.15583 0.0102013 +-0.0554797 0.0848037 0.0450617 +-0.0845128 0.0817443 0.00347449 +-0.0169788 0.106067 -0.0223329 +-0.0699464 0.151677 0.0365135 +-0.0160243 0.0897174 -0.0373532 +-0.035698 0.0857595 -0.0237144 +-0.0308696 0.105755 -0.0215547 +-0.0475005 0.084795 0.044997 +0.00720445 0.088027 -0.0329216 +0.0388792 0.085648 -0.0137779 +-0.0451911 0.163637 -0.00858913 +-0.0752855 0.176467 -0.0519633 +-0.0568165 0.155074 0.0161832 +0.0369538 0.108295 0.0261877 +-0.0788782 0.172865 -0.0427748 +-0.0439777 0.0345259 0.038072 +0.0238242 0.0981836 0.0451545 +-0.0394936 0.0548399 0.0395943 +0.0242629 0.0790161 -0.0251629 +-0.0665084 0.0903473 0.0440273 +0.0291366 0.0495584 -0.0147305 +0.0191581 0.0357679 0.0376614 +-0.0278785 0.0535209 -0.0244081 +-0.00947834 0.12371 0.0334225 +-0.0570388 0.149629 0.0316784 +0.0117574 0.130329 0.0182774 +-0.00158005 0.131357 0.0134024 +-0.0657222 0.0431534 -0.00229362 +0.0404535 0.0689201 -0.00879299 +-0.0195496 0.161752 -0.0147401 +0.0435566 0.0695959 0.0259839 +-0.0893231 0.14203 0.0321578 +-0.0832597 0.10897 0.0263609 +0.00296745 0.0390391 -0.00510833 +0.0160439 0.0505074 0.0458237 +-0.0213985 0.181639 -0.0134576 +0.000249699 0.0347599 0.0129869 +-0.0138688 0.163706 -0.0171714 +-0.0787597 0.163865 -0.0299483 +-0.0321103 0.178539 -0.0110044 +-0.0062818 0.102371 0.0437669 +-0.0504236 0.113946 -0.0165184 +-0.0808373 0.0858965 0.0337281 +-0.0833697 0.0790868 0.0225099 +0.0174757 0.101745 0.0462033 +0.0562413 0.0521934 0.00418603 +-0.0386753 0.127489 0.0159666 +-0.0714887 0.0860678 0.0412957 +0.00930465 0.0639279 -0.0315779 +-0.038992 0.126654 0.0188148 +-0.0617292 0.0435742 0.0131822 +-0.0807044 0.109603 0.0338418 +0.01567 0.0343236 0.00175615 +-0.0151083 0.184586 -0.0219884 +-0.0792845 0.0704649 0.0170607 +-0.0611161 0.170955 -0.0586033 +-0.0656715 0.0684169 0.0339875 +-0.0346163 0.0505906 -0.0107587 +0.0292004 0.0566287 -0.0178044 +0.0402348 0.101386 0.0251818 +-0.0356488 0.118923 -0.0117804 +-0.00759062 0.117967 -0.0150103 +-0.0344873 0.0959942 0.0440904 +-0.0675456 0.035487 -0.00647 +-0.0177849 0.0784811 -0.0386843 +-0.0357813 0.0828042 -0.0224653 +-0.0217893 0.122494 0.0280004 +-0.040789 0.084093 -0.0212481 +-0.0448136 0.0629573 0.0395248 +-0.0851812 0.137956 0.0449006 +-0.0879612 0.103656 0.0103875 +-0.0558857 0.0998486 -0.020419 +0.017256 0.079507 0.0531399 +-0.0315382 0.178553 -0.0120253 +-0.06991 0.11224 -0.0100103 +-0.0512969 0.0556828 0.0150377 +0.0224682 0.0520683 0.0428376 +0.0143831 0.0448677 -0.0245168 +-0.0794364 0.144805 0.0432098 +-0.0638846 0.103946 -0.0172176 +-0.0284346 0.0849121 0.0465284 +0.0144928 0.11263 0.0387455 +-0.0860797 0.0882889 0.0261675 +-0.00931865 0.0862591 -0.0377315 +-0.0226749 0.0380487 0.0198364 +-0.0875543 0.0861148 0.0194651 +-0.0578317 0.0344516 0.0369209 +-0.0410907 0.157679 -0.0102957 +-0.0680436 0.0337635 0.00720288 +-0.0778811 0.104813 -0.00803583 +0.0518058 0.0553999 0.0290848 +-0.0504997 0.160817 0.00728082 +0.0241356 0.0632152 0.0453534 +-0.0268604 0.100151 -0.0237263 +0.0127955 0.0874066 0.0537621 +-0.0616261 0.155549 0.00719382 +-0.0593595 0.0336431 -0.00899455 +-0.065903 0.0643977 0.026882 +0.0278843 0.0536982 -0.0197695 +-0.0335041 0.0789099 0.0415331 +0.0414488 0.0873044 0.0301508 +-0.0627531 0.161513 -0.0475897 +0.0292606 0.0447502 0.0332372 +0.0105493 0.122164 -0.0116505 +-0.0908004 0.115922 0.00730178 +0.0306755 0.0581744 -0.0167704 +-0.0745653 0.158254 -0.0269305 +0.0417869 0.088692 -0.00877741 +-0.0765465 0.107865 0.0361429 +0.0291715 0.104768 0.0370747 +-0.0435198 0.0436724 -0.0163157 +-0.0639905 0.155091 0.00636862 +-0.0676976 0.156296 0.0180917 +0.0361371 0.0605355 0.0363255 +-0.0831336 0.135327 0.0485953 +-0.0205283 0.125395 0.0225414 +0.0218584 0.126105 0.0106 +-0.0573551 0.0335045 0.00783858 +-0.0766685 0.144473 -0.00485242 +0.0215827 0.0449804 0.0414892 +-0.0623027 0.152202 -0.0135791 +-0.0124889 0.118271 0.037774 +-0.058999 0.129653 -0.00698695 +0.0212269 0.035264 0.00760182 +-0.0558448 0.0533792 -0.00239414 +-0.042206 0.147853 0.000366775 +-0.0732213 0.156852 -0.0309091 +0.00482377 0.0349755 -0.00101746 +0.00553205 0.131427 0.00744951 +-0.0606157 0.0459479 0.0402046 +0.00228793 0.0626666 -0.0335374 +-0.00869718 0.172706 -0.0257786 +0.0265924 0.0466157 -0.0146569 +0.0293044 0.0481199 -0.00974071 +-0.0278981 0.0863323 0.047373 +0.029421 0.0461183 -0.00671048 +-0.058539 0.0588103 0.0191792 +-0.0577583 0.0479183 0.03595 +0.0299489 0.069977 0.0415097 +-0.0877683 0.149882 0.0273982 +-0.0403006 0.122206 -0.0112466 +-0.0731823 0.109139 0.039466 +0.00748061 0.115492 0.0392535 +-0.0323193 0.0339823 0.0197127 +-0.00249248 0.0911617 0.056251 +-0.0410706 0.0335739 0.0056728 +-0.0167629 0.120643 -0.00969861 +0.0170314 0.126681 0.0245104 +-0.0933703 0.118789 0.0242915 +-0.0167466 0.161131 -0.0135692 +-0.037714 0.0710075 -0.016855 +-0.0748306 0.094995 -0.0139518 +-0.0653015 0.169027 -0.0374543 +-0.0171592 0.0387994 -0.0126424 +-0.0649264 0.112407 -0.0127033 +0.0089357 0.131311 0.0143899 +-0.0695053 0.106913 0.0375568 +-0.0679519 0.129695 -0.00900682 +0.0196594 0.10025 -0.0221259 +0.0187375 0.0672729 0.0498973 +-0.0634922 0.0626336 0.0253957 +-0.0640428 0.0593154 0.0139941 +-0.0365043 0.0691064 0.0417512 +-0.0509946 0.0547172 0.0191515 +-0.0684996 0.106934 0.0379267 +-0.0391114 0.149509 -0.00165293 +0.00150153 0.0534013 0.0535077 +-0.0610153 0.131125 -0.0076807 +-0.015856 0.0980295 -0.0258983 +0.0549279 0.0723085 0.00788581 +0.0296197 0.117006 0.0277632 +0.00535242 0.130989 0.0202309 +-0.000691446 0.0612541 -0.0338404 +0.00150093 0.0441835 0.0459725 +-0.0611099 0.11531 0.0378549 +-0.0695161 0.108303 0.0373324 +-0.0543547 0.158623 0.00837339 +-0.0945603 0.124158 0.0182654 +-0.0535009 0.111177 0.0367213 +-0.0119534 0.0385403 0.00164014 +-0.0370531 0.166795 0.000693639 +0.0161005 0.115637 -0.0146217 +-0.0669681 0.132599 -0.00847972 +-0.0192376 0.0362049 0.0528295 +-0.0510947 0.138549 0.00140254 +0.0199501 0.126815 0.00703133 +-0.0280876 0.0511424 0.0415727 +0.0021184 0.108719 -0.0202691 +-0.0455158 0.0889126 0.0438293 +0.00898082 0.0376394 0.0339008 +-0.0913279 0.147458 0.016148 +-0.00573884 0.0712887 -0.036141 +0.0184912 0.0906471 0.0481735 +-0.0240484 0.159369 -0.0122932 +-0.00386335 0.103093 -0.0232514 +-0.0903131 0.126767 0.00528424 +-0.00141239 0.101018 0.0444401 +-0.0265472 0.0384572 -0.00862977 +-0.0461338 0.160629 -0.00828859 +0.0434078 0.0958974 0.0221477 +-0.0323682 0.0778417 -0.0305703 +-0.0104869 0.166942 -0.0170857 +0.0335642 0.11614 0.00925074 +-0.0679156 0.112303 -0.0110315 +0.0448529 0.0917799 0.0171662 +-0.0902457 0.140661 0.0271695 +0.0361358 0.102075 -0.0100705 +-0.0774559 0.158948 -0.0154272 +-0.0718839 0.142969 -0.00986002 +0.0254315 0.0862638 0.0474376 +0.0233509 0.0549381 -0.0249484 +0.0445042 0.0650854 0.0275412 +0.0472882 0.0731371 0.0168777 +0.0310703 0.0352449 0.00774073 +-0.0540072 0.144242 -0.000990452 +-0.0901845 0.132425 0.0322244 +-0.0305014 0.066031 0.0387492 +-0.0636396 0.163113 -0.0245909 +0.0265757 0.0754454 0.0454823 +0.0560761 0.0692634 0.0230866 +0.0323242 0.117657 0.0116569 +-0.0744896 0.128852 0.0526631 +-0.092535 0.126933 0.0292581 +-0.021881 0.107267 -0.0220871 +0.0216673 0.125834 0.0205048 +-0.0892808 0.140568 0.013241 +-0.0188177 0.0683045 0.0530002 +0.0181426 0.117476 -0.0126083 +-0.0562843 0.049932 0.00898241 +0.0271917 0.0858851 -0.0222975 +-0.0354636 0.172718 -0.000342918 +-0.0113055 0.0991708 0.0485876 +-0.0512476 0.149342 0.0143776 +0.0112062 0.129253 0.000760937 +-0.027273 0.123571 -0.00271305 +-0.0942867 0.122796 0.0162787 +-0.0731111 0.152638 -0.0358925 +-0.0630631 0.0351206 0.0420909 +-0.0638567 0.0981567 -0.0173229 +-0.0886136 0.0969805 0.0223931 +0.0376971 0.0381803 0.0174952 +-0.0389196 0.163835 0.00150184 +0.0470726 0.048551 -0.0036464 +-0.0195067 0.119545 0.0340058 +-0.0154952 0.101637 0.0439764 +-0.0615198 0.167807 -0.0565879 +0.000487515 0.110024 0.0426254 +0.0218587 0.0714183 0.0491823 +-0.0891206 0.0888853 0.014456 +0.00728906 0.0602827 0.0543511 +0.0159015 0.122788 0.0313235 +0.0287151 0.0982016 0.0416756 +-0.0515592 0.162515 0.00512403 +-0.0562626 0.0437454 0.0167126 +-0.0181312 0.0948304 -0.0325641 +-0.0375002 0.0337858 -0.019518 +-0.0283411 0.0368095 0.0535577 +0.0138368 0.126165 0.029064 +-0.0698832 0.115052 -0.00855978 +-0.0166197 0.126668 0.0238945 +-0.062914 0.11807 -0.00990368 +-0.0489018 0.129654 0.0292632 +-0.0524468 0.0489914 0.023647 +-0.0590382 0.132561 -0.00680716 +-0.0429798 0.150656 0.00610371 +-0.0708619 0.0368523 0.00979504 +0.0198172 0.102563 -0.0205962 +0.0416527 0.0846461 0.030449 +-0.0215106 0.119492 0.0328652 +-0.0144877 0.185446 -0.0257702 +0.0475192 0.0568404 0.0316921 +-0.0913388 0.115949 0.00831473 +0.0281313 0.0591962 0.0423168 +-0.035495 0.171374 -0.0137494 +-0.0736292 0.156748 -0.0014693 +-0.00249426 0.0505094 0.0526827 +-0.0909607 0.144377 0.0265412 +-0.0410851 0.123071 0.0255089 +-0.0226414 0.0961417 -0.0259441 +0.0264078 0.120534 -0.000510633 +-0.0193661 0.126578 0.00214409 +0.0465619 0.0568462 0.0320779 +0.0207007 0.040829 0.0419301 +-0.0564899 0.0440403 0.0448345 +0.000863008 0.0381264 -0.0140589 +-0.0418598 0.102811 -0.0210501 +-0.00158954 0.0376715 -0.025054 +-0.0723294 0.177884 -0.0550149 +-0.0544961 0.0732542 0.0409056 +-0.00649673 0.121064 0.0364033 +0.0504194 0.0446982 0.00822878 +-0.0153541 0.0337728 -0.0226273 +-0.0303696 0.0486908 0.0439216 +-0.0334968 0.033775 0.00883944 +-0.0685163 0.108328 0.0375372 +-0.0304988 0.0603029 0.0376116 +-0.0662971 0.0363734 0.0376513 +0.0311541 0.072342 -0.0197804 +0.016819 0.0860765 0.050782 +-0.067492 0.0944588 0.0423306 +-0.0187655 0.0714126 -0.0384549 +-0.0605051 0.128314 0.040613 +0.00838174 0.0449018 -0.0251393 +-0.0164768 0.122235 0.0319313 +0.0227625 0.125142 0.00666699 +-0.0528343 0.0337802 -0.0114802 +0.0451301 0.0903696 0.00218472 +-0.0576106 0.148673 -0.00161022 +0.00250457 0.100333 0.0462614 +-0.0262513 0.0350951 0.0517484 +-0.054684 0.067848 -0.0128124 +-0.0441291 0.159145 -0.00944971 +-0.0440467 0.0380432 -0.0230799 +-0.0447681 0.146394 0.00358641 +-0.0894274 0.0915536 0.0114438 +-0.0751139 0.0954949 0.0389973 +0.0383178 0.106879 0.000185785 +-0.0732998 0.0654414 0.00491231 +-0.00228741 0.13015 0.0232201 +-0.0372213 0.150899 -0.00386632 +-0.0261116 0.0809919 0.0513952 +0.0322341 0.112712 0.0291688 +-0.0690565 0.0338884 -0.00389811 +0.0101437 0.101615 -0.0217271 +0.0425651 0.10009 0.017161 +-0.0355201 0.16973 -0.000114667 +0.00176571 0.0954911 -0.0311224 +0.0373922 0.0461028 -0.00552229 +-0.0261166 0.163762 -0.0159025 +-0.0651006 0.0458549 0.00368955 +0.0212923 0.0982999 -0.0220426 +0.026467 0.0383015 -0.00253304 +-0.0231343 0.0383693 -0.0171708 +0.00758009 0.121578 -0.0129987 +-0.0491724 0.116402 -0.0151155 +-0.0174383 0.038419 -0.00120725 +-0.0368548 0.0985914 -0.0223265 +-0.0599288 0.145383 0.0362513 +0.00646924 0.0964123 0.0516046 +-0.0630484 0.138442 -0.00719818 +-0.0266978 0.0917701 0.0460149 +-0.0534968 0.0790911 0.0438637 +-0.0203653 0.0682964 0.0517114 +0.0203853 0.049027 -0.0227929 +-0.0539349 0.0527611 0.0108042 +0.0460422 0.0848268 0.0101717 +-0.0728228 0.148718 -0.0323717 +0.0337238 0.11401 0.0250189 +-0.0718098 0.0864713 -0.016231 +-0.000525817 0.0352062 0.0124275 +0.0044963 0.0605551 0.0556784 +0.0278498 0.045613 -0.00720046 +0.0242032 0.0987613 -0.0205495 +0.0133536 0.0359529 -0.0210721 +-0.00614443 0.0386147 0.00639011 +-0.091603 0.144731 0.0191577 +-0.00870302 0.0387758 0.0292604 +0.00137957 0.0343513 0.00995357 +0.0580311 0.0716366 0.0149943 +0.029585 0.0495591 -0.0127459 +-0.0873232 0.0873446 0.00247822 +-0.0562907 0.154938 0.0178178 +0.0227189 0.116065 -0.0110894 +-0.089541 0.143417 0.0301691 +-0.0295204 0.0607307 -0.0234192 +-0.072166 0.0982206 0.0402281 +0.0461397 0.0764263 0.0052018 +-0.0650238 0.0405393 0.0286621 +-0.0357662 0.0798799 -0.0213145 +-0.0210545 0.100222 -0.024166 +-0.051798 0.0884029 -0.0218862 +-0.0585235 0.0425717 0.0226979 +-0.0581184 0.132538 0.0370402 +-0.0500652 0.125773 -0.00688378 +-0.0570027 0.145725 -0.00171879 +-0.000114754 0.120081 -0.0133088 +-0.0558569 0.135328 0.0332838 +-0.071744 0.162192 -0.0110365 +-0.0533559 0.0609747 0.0280244 +-0.0678966 0.110866 -0.0116376 +-0.0708871 0.119431 -0.00850422 +-0.0743754 0.0995209 0.0381506 +-0.0827936 0.110133 0.0365 +0.0274001 0.0354299 0.0197116 +-0.0700593 0.152584 0.0349486 +-0.0594807 0.0398598 0.0207095 +-0.0506478 0.0648447 -0.0114426 +-0.0548507 0.0955893 -0.0216695 +-0.0735032 0.144216 0.0449341 +-0.0746874 0.169403 -0.0279937 +-0.041349 0.172669 -0.00697494 +-0.0879813 0.0968653 0.0054141 +-0.0639066 0.158701 -0.0499459 +-0.0295413 0.0348538 0.0461198 +0.0425062 0.0610428 0.0297234 +-0.0761006 0.0693618 0.0222283 +0.0350916 0.102085 0.0333486 +-0.0434936 0.107078 0.040105 +-0.0210995 0.166843 -0.0113898 +-0.0599936 0.0459773 0.0409964 +0.0260763 0.0726986 0.044735 +0.0368852 0.111459 0.00613554 +-0.00301536 0.127034 0.030217 +-0.0313536 0.0384061 -0.00216621 +0.0173795 0.0350198 0.030737 +-0.072846 0.165216 -0.0419869 +-0.0344415 0.176449 -0.00471515 +0.00170995 0.0392427 0.0309786 +-0.04085 0.0985381 -0.021696 +-0.0479764 0.135553 0.00940627 +-0.0332667 0.0835875 -0.0265323 +0.0206498 0.0781917 0.0510092 +0.0122103 0.0893249 -0.030653 +-0.0464803 0.0335784 -0.0137021 +-0.0367962 0.0383714 -0.00507539 +-0.00449141 0.0911839 0.0565229 +0.0243337 0.0605883 -0.0247185 +-0.0826166 0.123078 0.0498508 +0.0540378 0.0525213 0.0252382 +-0.0675101 0.0369158 -0.0062949 +-0.0205096 0.124449 -0.00369667 +0.0285796 0.107031 -0.0133812 +0.0320794 0.0526694 -0.0107538 +-0.0203373 0.0610131 0.0476733 +-0.0674469 0.0396367 -0.00494886 +-0.0599339 0.120955 -0.00911512 +0.0168017 0.105866 -0.0181237 +-0.0787857 0.0744548 -0.00455566 +0.0193044 0.127372 0.00964815 +-0.038368 0.0457007 -0.0229731 +-0.025877 0.125557 0.00449924 +-0.0609237 0.0414243 0.0237035 +-0.0433646 0.153626 0.00736711 +-0.0513808 0.0500433 0.0347314 +-0.0212772 0.0382158 0.00549847 +0.0220013 0.0348195 0.00816409 +-0.0519377 0.0335199 0.00532131 +0.00789859 0.0999878 -0.0218807 +0.0337096 0.115696 0.0178949 +-0.0404258 0.0418709 -0.0242648 +-0.0188763 0.105884 -0.0226282 +-0.0648153 0.175482 -0.051724 +-0.070065 0.148313 -0.0344143 +-0.0584005 0.0439707 0.0246877 +0.0215152 0.0795452 0.0505127 +-0.000765864 0.0811873 -0.0364626 +-0.0633527 0.0454486 0.000289555 +-0.0455004 0.113892 0.0345333 +-0.0205229 0.0336428 -0.0235211 +-0.0658189 0.0895406 -0.0182783 +0.00772286 0.0346363 0.0381279 +0.044441 0.093115 0.00120191 +-0.0859796 0.119771 -0.00178632 +0.00662772 0.0374926 -0.0123303 +-0.0495602 0.0418248 -0.0110192 +-0.0863354 0.129395 -0.000699295 +-0.00570279 0.0613633 -0.0351663 +-0.0195101 0.114089 0.03835 +-0.0679008 0.1038 -0.0147014 +0.045275 0.0917907 0.0041773 +0.0258455 0.110181 -0.0127425 +-0.00858661 0.0376839 -0.0256139 +-0.0494924 0.160775 0.00747898 +-0.0186783 0.101771 -0.0238107 +-0.0870678 0.11107 0.0203515 +-0.0692028 0.135485 0.0474165 +-0.0665472 0.0446244 0.00170489 +-0.0679768 0.0791427 0.0408622 +0.0184726 0.0851741 0.0505075 +-0.0203373 0.158355 -0.00674555 +-0.0364979 0.119358 0.0304421 +-0.0395021 0.0450562 0.0411081 +-0.00309828 0.0379762 0.00940157 +-0.054497 0.10568 0.0405938 +-0.0354869 0.0903478 0.043788 +-0.0882673 0.102346 0.019362 +-0.0518479 0.128319 0.033784 +0.0163666 0.0522247 -0.0268816 +-0.0216233 0.0450569 -0.0280185 +-0.0332919 0.124337 -0.00345787 +-0.0603705 0.118249 -0.0108601 +-0.0883316 0.128385 0.0454834 +-0.0681462 0.033688 -0.00353141 +0.0232453 0.12098 -0.00440593 +-0.0294449 0.038677 -0.0149866 +0.0110249 0.0988999 -0.0227192 +-0.0218748 0.174208 -0.0142339 +0.0205417 0.0741225 0.0508294 +-0.0627477 0.148893 -0.0169766 +-0.0398023 0.0338119 -0.0274661 +-0.0319551 0.0348046 0.0438977 +0.0104998 0.108437 0.040345 +-0.0139772 0.164028 -0.0115888 +-0.0247602 0.0379556 0.0194943 +-0.000934383 0.0340393 -0.0200439 +0.0476809 0.0472678 -0.00164326 +-0.0400291 0.0354632 0.00960076 +-0.0671756 0.0610764 0.00625684 +-0.0852257 0.114326 0.001271 +-0.0754019 0.151364 -0.0118956 +-0.0437605 0.146927 0.00133694 +-0.0619528 0.15527 -0.030594 +0.0363929 0.0490985 -0.00642376 +-0.0100186 0.0981603 -0.0280043 +-0.0119452 0.129197 0.00527137 +-0.0346207 0.0519685 -0.0102527 +0.0527588 0.0510331 0.0250995 +-0.0635082 0.148832 -0.022668 +-0.0147336 0.0671673 -0.0377424 +-0.0704174 0.170744 -0.0307374 +0.0105902 0.125785 0.0307704 +-0.0258145 0.0894344 -0.0348302 +-0.0177853 0.0383982 0.00785589 +-0.0875073 0.0954698 0.00341799 +-0.0424838 0.105689 0.0405023 +0.049326 0.0581361 0.0307698 +-0.0426568 0.0578158 -0.011891 +-0.0506189 0.0517055 -0.00806622 +-0.0751298 0.155996 0.0213056 +-0.0740765 0.0662649 0.0182774 +-0.055953 0.151039 0.0297159 +0.00149895 0.0519342 0.0529111 +-0.0476623 0.135572 0.0124001 +0.00259703 0.093007 -0.0325523 +-0.021995 0.185609 -0.0143485 +0.0421516 0.0805501 0.0292856 +-0.014868 0.104453 -0.022832 +-0.0398868 0.108509 -0.0195593 +0.0259209 0.122835 0.0206655 +-0.0616544 0.15599 0.0144357 +-0.0733101 0.14716 -0.0188577 +-0.0262613 0.119664 -0.0106051 +0.0355444 0.109985 0.0269213 +0.04069 0.0703475 -0.0087868 +-0.0658232 0.100991 -0.0166158 +0.0443888 0.0846966 -0.000809941 +-0.0235014 0.109891 0.0398372 +0.0275195 0.0713136 0.0432798 +0.0364601 0.111481 0.0203251 +-0.0766191 0.168746 -0.0293719 +0.041872 0.069712 0.028792 +-0.0188551 0.177186 -0.0168879 +-0.0430291 0.148351 -0.00306372 +0.0241638 0.0853333 -0.0244737 +0.017675 0.127712 0.00477874 +-0.0888835 0.0983415 0.0204012 +-0.0202474 0.0582316 0.0476806 +-0.0719293 0.126758 -0.00881076 +-0.0294958 0.0960659 0.0449891 +-0.0491744 0.14016 0.00939463 +-0.0284952 0.105677 0.0407009 +0.0215711 0.035903 0.0289947 +0.0112282 0.0780681 -0.031821 +0.0343153 0.115038 0.0152609 +0.0213375 0.0536353 -0.0261911 +-0.0754641 0.149954 -0.0208706 +0.0174704 0.1044 0.0442882 +0.00640724 0.0390095 -0.0238414 +-0.0396234 0.150027 -0.00409811 +-0.0900489 0.137821 0.0141988 +0.0252808 0.0733562 -0.0251315 +-0.0492373 0.132883 0.0267635 +-0.0430533 0.034543 -0.0263375 +0.0217093 0.0520814 0.0434982 +-0.0333828 0.0807789 -0.0265175 +-0.0761052 0.14997 -0.0158781 +-0.0707786 0.0690222 0.0306409 +0.0401031 0.0589615 -0.00453029 +-0.0260252 0.0904818 0.0482145 +-0.0895062 0.0902087 0.0114561 +-0.0526923 0.0334338 -0.00380212 +-0.0114811 0.0646532 0.0550744 +-0.0370678 0.157759 -0.0113588 +0.00952731 0.105746 0.0431674 +-0.0410118 0.126885 0.0180931 +0.0197485 0.105413 -0.017636 +-0.0629292 0.155832 0.0110869 +-0.0581695 0.15592 0.011334 +-0.00650086 0.0561902 0.0537938 +-0.0338729 0.15688 -0.0110666 +0.0405297 0.0779725 0.0322363 +-0.0642469 0.0423257 0.0129047 +0.0237846 0.0476926 0.0394013 +-0.0217726 0.172729 -0.0141007 +-0.0416287 0.0534443 -0.0111279 +-0.077087 0.154176 -0.0108977 +0.0304203 0.0366341 0.0210583 +-0.0306156 0.0552316 -0.0163811 +-0.0584355 0.0482117 0.00674018 +-0.0284904 0.0917855 0.0443788 +-0.0347085 0.0681808 -0.0168555 +0.0286267 0.117101 -0.00417221 +0.000831008 0.0996342 -0.0235195 +0.00330328 0.0611715 -0.0325304 +-0.0739165 0.113504 -0.00683708 +-0.0898235 0.126994 0.0441831 +-0.0889746 0.0942393 0.0114303 +-0.0279086 0.0704216 -0.0334901 +-0.041504 0.0562873 0.0399374 +0.0394095 0.0793879 0.0341721 +-0.0669825 0.112069 0.0420748 +-0.0847653 0.103459 0.000382003 +-0.00649785 0.0801379 0.0576218 +-0.0226054 0.126675 0.00715587 +-0.000755212 0.130746 0.00366553 +-0.0328403 0.0348519 -0.0195836 +0.0396279 0.0857065 -0.0127726 +-0.0805255 0.14991 0.0359696 +0.0353489 0.0955322 0.0372114 +0.0102384 0.0781052 -0.0323493 +-0.0296143 0.0551126 -0.0213868 +-0.0699315 0.126779 -0.00900092 +-0.0795103 0.126002 0.0528073 +-0.000474921 0.0732072 0.0579427 +0.00749418 0.095088 0.0520151 +-0.0841797 0.101927 0.0280813 +0.0424909 0.101472 0.00517268 +0.00951997 0.0673959 0.0546877 +-0.0472854 0.0671503 0.0390298 +0.0376148 0.100847 -0.00874384 +-0.0374929 0.116616 0.0320198 +0.029259 0.120361 0.0176317 +-0.0737149 0.158251 -0.0299203 +-0.0114976 0.116917 0.038689 +0.0413371 0.0444728 -0.00290745 +-0.0627029 0.150609 -0.0235776 +-0.0302691 0.080511 -0.0335682 +0.0300872 0.0497043 -0.0117138 +0.0222773 0.0620859 -0.0257917 +-0.0570144 0.147201 -0.00173114 +-0.0760781 0.173825 -0.0400503 +-0.00149572 0.101631 0.0441885 +-0.0261888 0.17564 -0.0188354 +0.0231825 0.0577956 0.0456852 +-0.0924811 0.125593 0.0372603 +0.00115082 0.131147 0.0187057 +-0.0841614 0.142011 0.042356 +0.042729 0.0901813 -0.0058099 +0.0213045 0.0372836 -0.00268556 +-0.0160362 0.0338015 -0.0209075 +0.0394869 0.10531 0.000602508 +-0.0239168 0.0383626 0.00119722 +-0.0164538 0.0343139 -0.019589 +-0.0592802 0.154415 0.0283608 +-0.0609269 0.155849 0.0219449 +-0.0250081 0.0361291 -0.0192131 +-0.0853634 0.14876 0.00617316 +-0.0253618 0.0386908 -0.0141849 +-0.0881693 0.0922771 0.0238938 +-0.0728038 0.0921924 -0.0153063 +-0.0708783 0.150832 0.0377201 +0.00548074 0.111376 0.0414038 +-0.0524967 0.0945727 0.0438723 +0.0115063 0.0343546 -0.0179688 +0.00151312 0.081484 0.0572224 +-0.0149936 0.0395459 0.0398583 +0.0120392 0.129427 0.0226627 +0.0591195 0.05666 0.00817454 +0.0328155 0.102974 -0.0130264 +-0.0371359 0.123595 0.025439 +0.0450698 0.0805625 0.0231647 +-0.028064 0.0385407 0.0362565 +-0.00648913 0.0732625 0.0583326 +-0.0374981 0.0719295 0.0420686 +-0.0736872 0.176894 -0.0449171 +-0.0672224 0.0339784 0.0107486 +-0.0758756 0.104904 -0.00955908 +0.0439403 0.083251 -0.00181959 +-0.0614723 0.15843 -0.0295877 +0.0442849 0.0945485 0.0181566 +-0.065503 0.044849 0.00843715 +0.00357616 0.0395385 0.0347033 +-0.028754 0.0634689 -0.0284339 +0.0315757 0.0914687 -0.0188156 +0.00716348 0.0343484 0.0202029 +-0.0216788 0.0493937 -0.0287126 +-0.0716516 0.139715 0.0474384 +-0.043721 0.033715 -0.00407894 +-0.0817894 0.0909919 -0.00761357 +0.0425053 0.0513815 0.0326154 +-0.0638693 0.170945 -0.0476012 +0.0316414 0.11271 0.0301021 +-0.0306212 0.159741 -0.0134031 +-0.0214041 0.0879871 0.0549671 +-0.0670934 0.0625692 0.00143601 +-0.0365003 0.087456 0.0430956 +0.00150165 0.0919153 -0.0334107 +-0.024293 0.124271 0.0211991 +-0.0604952 0.0932426 0.0451145 +0.00516194 0.0978455 -0.0256065 +-0.00249882 0.081515 0.0574957 +-0.0636907 0.146369 -0.0159165 +-0.0129939 0.103563 -0.0236849 +0.00282967 0.131401 0.0178813 +0.00250691 0.0883899 0.0564027 +0.0220994 0.0476682 0.0404859 +-0.0466625 0.12523 -0.00836412 +0.00382851 0.0992997 -0.0231609 +-0.0879384 0.126705 0.000268669 +-0.0725213 0.0636798 0.0102197 +-0.00645782 0.0338359 -0.0228235 +-0.0523786 0.138216 -8.53499e-05 +-0.041943 0.114992 -0.0156494 +0.0435142 0.0513638 0.0325031 +0.0432433 0.0958712 0.000187851 +-0.0729725 0.170894 -0.0302341 +-0.0303619 0.0381166 0.0307902 +-0.0942177 0.125518 0.0172578 +0.0446543 0.0959754 0.00716634 +-0.0263933 0.0864552 0.0500994 +0.0352313 0.064664 0.0385641 +-0.0913521 0.14609 0.0171489 +-0.00798473 0.0348553 0.0472244 +-0.00181216 0.086792 -0.0360393 +-0.0153678 0.09644 0.0517723 +0.0268857 0.117842 -0.00498093 +-0.0354986 0.0747267 0.0419454 +-0.0573263 0.0481094 0.0336642 +-0.0386241 0.125328 -0.00654651 +-0.020119 0.0431531 0.0531418 +-0.0226834 0.174208 -0.0136486 +-0.0554979 0.0889982 0.0448936 +-0.0321193 0.0366883 0.0508235 +0.013731 0.104072 -0.0202068 +0.0407967 0.0661529 -0.00677209 +-0.0792933 0.16941 -0.0399858 +-0.0250378 0.174204 -0.0117666 +-0.0718111 0.0631642 0.010775 +-0.0710553 0.181198 -0.0554882 +-0.058796 0.0868581 -0.0207882 +-0.0136362 0.0466649 -0.0295427 +-0.0924917 0.124196 0.0312677 +-0.0331602 0.171158 -0.0153905 +-0.0724259 0.0727975 0.0340482 +-0.0566618 0.0645338 -0.00803085 +-0.0705221 0.098629 0.0408842 +0.0118568 0.126524 -0.00436904 +-0.0784161 0.116342 0.0501163 +-0.0677948 0.160582 -0.0110564 +-0.0456903 0.11799 -0.0148012 +0.0526315 0.0462656 0.0102089 +0.0453672 0.0456539 0.0269438 +-0.00726729 0.129761 0.0228793 +-0.0659232 0.105312 -0.014993 +-0.087769 0.118492 0.00124641 +-0.00149512 0.0562755 0.0546084 +-0.089164 0.0928946 0.0114433 +-0.0841907 0.078353 0.0198111 +-0.0679412 0.0656184 0.0271584 +0.0224551 0.0368363 -0.00219983 +-0.0356854 0.0435567 0.045098 +-0.0457595 0.0797224 -0.0196258 +-0.0405031 0.0762353 0.0429954 +-0.0640239 0.14106 0.0390925 +-0.0797368 0.119028 0.049952 +-0.0864815 0.0846104 0.00248575 +-0.0774908 0.137247 0.0499166 +-0.0586931 0.0693474 -0.0143558 +-0.0340813 0.159269 -0.0127772 +-0.0889533 0.124321 0.0462453 +-0.0611638 0.0468972 0.00167818 +-0.0925249 0.130961 0.0132346 +-0.0707251 0.033867 0.00298473 +0.0514024 0.0510939 0.0266785 +-0.000225629 0.097747 0.0525183 +0.0260546 0.112325 -0.0110571 +-0.0429452 0.0345628 0.0382617 +-0.0174331 0.0625913 0.0517909 +0.0422611 0.0397457 0.00959333 +-0.0374974 0.0705158 0.0419336 +-0.0368535 0.0362973 -0.0142764 +-0.0132005 0.128825 0.00480743 +-0.0808442 0.110042 -0.00155764 +-0.0890966 0.114815 0.0438036 +-0.0195037 0.11681 0.0364149 +-0.0653439 0.127011 0.0477296 +-0.0749324 0.152731 -0.0198994 +-0.0131083 0.128689 0.020774 +-0.0761869 0.149999 -0.0118749 +-0.0657951 0.0852369 -0.0187501 +-0.0515872 0.0558557 0.0146208 +0.0414903 0.0541829 0.0322405 +-0.0094881 0.112787 0.0415502 +-0.0473098 0.0390167 0.04506 +-0.076903 0.112654 -0.00467049 +-0.0792829 0.109073 0.0381388 +0.0277273 0.0646184 0.0435417 +-0.0923959 0.132359 0.0202239 +-0.0505803 0.0502828 -0.00813802 +0.00549299 0.117639 -0.0167508 +-0.0166687 0.038571 -0.00303984 +-0.0728836 0.119408 -0.00813229 +-0.00373228 0.0669631 -0.0346735 +0.0373953 0.0445589 -0.00471693 +0.00577997 0.0365296 -0.0134893 +0.0065091 0.0772612 0.0561769 +-0.0785581 0.153669 0.00407716 +-0.0631137 0.14437 -0.00863045 +0.0335076 0.0453895 0.0300756 +-0.00148382 0.131063 0.00627096 +-0.0117022 0.0613984 -0.0359464 +-0.0390182 0.0473551 -0.0162983 +0.0174871 0.10577 0.0429453 +0.0173606 0.128011 0.00608341 +-0.0587951 0.0337712 0.0197789 +-0.0554323 0.145321 0.0304155 +-0.021174 0.184521 -0.0131308 +-0.0546552 0.0656851 0.0351815 +-0.00872132 0.0656071 -0.0355909 +0.00329381 0.0654903 -0.0335962 +-0.0874212 0.0861211 0.0204627 +0.0341358 0.0641297 -0.0158137 +-0.063479 0.0384929 -0.0076832 +0.0174063 0.0417452 -0.0219906 +-0.069028 0.0409064 0.00923732 +0.0577041 0.0703778 0.00716237 +-0.0506338 0.0663851 -0.0124105 +-0.04882 0.119077 -0.0139102 +-0.0660878 0.161167 -0.014759 +0.060054 0.0678303 0.0101401 +-0.063913 0.169258 -0.0441943 +-0.053845 0.0463107 0.0236764 +-0.0784828 0.175619 -0.0475153 +-0.0313957 0.12387 -0.00298136 +0.0154947 0.107116 0.0420405 +-0.036876 0.0434502 0.0434666 +-0.06715 0.145376 0.0416405 +-0.0155327 0.181625 -0.0208343 +-0.0715781 0.0968766 0.0410625 +0.0306462 0.0968954 0.0409575 +0.00964614 0.0589005 0.0527021 +0.0527245 0.0736707 0.0159788 +-0.0861826 0.104908 0.00538017 +-0.0812551 0.138069 0.0480599 +0.0475108 0.0597433 0.0313293 +-0.0156256 0.0450397 -0.0279587 +-0.0221316 0.125526 0.0205056 +-0.0322922 0.122832 0.0242564 +-0.0132407 0.164048 -0.012311 +-0.0415061 0.0620057 0.0410722 +-0.0657901 0.128396 0.0470862 +0.0282252 0.0760107 -0.0227881 +-0.0701785 0.136914 0.0477863 +0.03413 0.0822192 0.0406334 +0.0609039 0.0609671 0.0121585 +-0.0515277 0.136697 0.0258426 +-0.00994091 0.089177 -0.0367642 +0.0451266 0.0727442 0.0219703 +0.0336533 0.110026 0.0294894 +-0.0721725 0.156265 0.0135984 +0.0312336 0.051167 -0.0107736 +-0.0023355 0.0926921 -0.0342848 +-0.0524965 0.0790864 0.0437156 +-0.0095237 0.0431051 0.0494016 +0.000300907 0.0626948 -0.0340909 +-0.0905968 0.140629 0.0221693 +-0.00800869 0.0388567 -0.00527149 +-0.0584939 0.0847167 0.0439692 +-0.0635243 0.0334646 -0.00419693 +-0.090351 0.14066 0.0261698 +-0.0588327 0.0911696 -0.0205864 +-0.020414 0.0541289 0.0465389 +-0.056688 0.067746 -0.0120827 +-0.0344045 0.152028 -0.00248634 +-0.0154988 0.114109 0.0392017 +-0.0384878 0.168246 0.00236894 +-0.0115711 0.100192 -0.0241483 +-0.0167308 0.0657547 -0.0377116 +-0.0466962 0.147986 -0.00319779 +-0.0926613 0.122825 0.0414622 +0.0312237 0.0871647 -0.0198177 +-0.0257476 0.0682496 -0.0344079 +-0.0524537 0.0504524 0.0306643 +-0.0768211 0.0804727 0.0355147 +-0.00449363 0.0456798 0.0470573 +0.0418422 0.0690449 -0.00578965 +-0.0262667 0.110544 -0.0190457 +-0.00251293 0.105882 0.0441369 +-0.0707082 0.0395895 0.000643319 +0.0128917 0.127573 0.0272919 +-0.0354687 0.054727 0.0384538 +0.00920102 0.0837298 -0.0322138 +0.0094791 0.0347704 0.0365664 +-0.0435038 0.0438236 0.0424673 +-0.0551839 0.140262 -0.00246039 +0.00523902 0.0341335 -0.0189244 +0.0273731 0.0578707 -0.0207586 +0.0119495 0.129938 0.00409466 +-0.0494983 0.102885 0.0411106 +-0.0370447 0.0379826 0.045213 +0.0150108 0.0349639 0.0393317 +0.0345233 0.0498189 0.0314944 +-0.0153828 0.128676 0.0170423 +-0.0618725 0.160013 -0.0255862 +-0.0525544 0.0504168 0.0256484 +-0.073344 0.0672327 0.000494062 +0.0393875 0.0460438 -0.00485579 +-0.0152754 0.103231 -0.0233341 +-0.0753549 0.104884 0.0361423 +0.0108274 0.0362708 -0.0225637 +0.0342152 0.0862629 0.0407864 +-0.088758 0.143311 0.0121502 +-0.0572353 0.0465198 -0.0043437 +0.0198267 0.035157 0.00555798 +0.0261922 0.0507168 -0.0207207 +0.0268986 0.0357578 0.0211357 +-0.0349846 0.0837189 -0.0236297 +-0.0222119 0.158173 -0.00418672 +0.024391 0.115338 0.0336864 +-0.0200061 0.124102 0.0256765 +-0.069632 0.0719472 -0.0104624 +-0.0322859 0.0792627 -0.0305329 +-0.0506516 0.033429 -0.00887801 +-0.0358626 0.101452 -0.0219425 +0.0293657 0.0447288 -0.00609588 +-0.0662305 0.0339335 0.0109932 +-0.00786973 0.104508 -0.0230207 +-0.0712429 0.177886 -0.0560058 +-0.00159432 0.129182 0.0263815 +-0.0283933 0.0831937 -0.0356194 +0.0443268 0.0511334 0.0322609 +-0.0318469 0.0958266 -0.0236233 +0.0205346 0.0937418 -0.0232686 +-0.012793 0.0813325 -0.0389447 +-0.0235889 0.0983837 -0.0242804 +-0.062496 0.105649 0.040196 +-0.0194646 0.0347564 0.0483645 +-0.0124518 0.038713 0.0303489 +-0.0444408 0.0335855 -0.0133031 +-0.00148369 0.0732377 0.0582942 +-0.0837769 0.153466 0.0110188 +-0.0898767 0.135147 0.0252168 +0.0369605 0.105409 -0.00483089 +-0.0255274 0.113962 0.0353265 +-0.0539587 0.0338764 0.0242313 +-0.0789197 0.104773 0.0326412 +0.0105421 0.118176 -0.0153416 +-0.0256953 0.0385914 0.0331228 +-0.0336328 0.126783 0.00457249 +-0.0470116 0.0710509 0.0409961 +-0.0930389 0.129675 0.0242521 +-0.0464764 0.0861628 0.0446798 +-0.0561893 0.159558 0.00559608 +-0.0091854 0.130144 0.00917512 +-0.0798951 0.0840617 -0.00859358 +-0.0336645 0.0339705 0.0230467 +0.00935764 0.0539048 -0.0300706 +-0.0831098 0.0777207 0.0215128 +-0.0470469 0.155045 0.00906939 +-0.0135887 0.169514 -0.0234669 +0.0418337 0.0395215 0.00781447 +-0.0276517 0.15535 -0.00385533 +-0.0201931 0.18164 -0.0152257 +-0.0335046 0.177862 -0.00863199 +0.0345014 0.0513521 0.0321623 +-0.0804527 0.143139 -0.00181198 +-0.0816965 0.144555 0.000152955 +0.0607459 0.0623413 0.0091502 +-0.0779458 0.175786 -0.0452228 +-0.0577187 0.146758 0.0323537 +-0.0403111 0.127303 0.0168527 +0.0204871 0.0934146 0.0476927 +0.00588424 0.100173 -0.0220733 +-0.00768539 0.0584014 -0.0338334 +-0.0447099 0.069553 -0.0165571 +-0.0287391 0.0620637 -0.0274208 +0.0157473 0.0947545 -0.0243195 +-0.063441 0.156071 0.0225051 +0.00824182 0.0753956 -0.0338579 +0.00561249 0.0927088 -0.0322048 +-0.0475077 0.0732702 0.0416223 +0.0145005 0.11127 0.0394252 +0.00450182 0.0413372 0.0458645 +0.00631667 0.061015 -0.0309472 +-0.0794763 0.0926775 0.0349659 +-0.0718543 0.111061 0.0453722 +-0.0891984 0.129697 0.0434765 +0.0151955 0.129241 0.0138359 +0.0236821 0.0824052 -0.0254011 +-0.0015019 0.110031 0.0427805 +-0.0215043 0.109928 0.0403615 +-0.0939826 0.118759 0.0192971 +-0.0624131 0.11535 0.0394932 +-0.0833865 0.140392 0.00124854 +-0.0465624 0.124393 -0.00950278 +-0.0146513 0.0496822 -0.0311895 +-0.0641648 0.15616 0.0149932 +-0.0729217 0.126742 -0.00866826 +-0.0253625 0.126177 0.010523 +0.0277777 0.108556 -0.0130095 +-0.0788017 0.0846357 0.0359502 +-0.0247742 0.180145 -0.00956802 +0.0188129 0.101666 -0.0216414 +0.00516264 0.131576 0.00874185 +-0.0633822 0.164679 -0.0305938 +-0.0375944 0.116238 -0.0149818 +0.0194959 0.111012 -0.0156283 +-0.0342918 0.0780403 -0.0245107 +-0.0861846 0.083225 0.00647736 +-0.0161451 0.166792 -0.0199866 +-0.0872007 0.147399 0.00826035 +0.0567195 0.0508531 0.00818949 +-0.0594966 0.100149 0.0427407 +-0.0584967 0.0761953 0.0427061 +-0.0218317 0.124906 0.0220793 +-0.00826101 0.0384472 0.0115633 +-0.0383343 0.121902 -0.0109317 +-0.0521665 0.136903 -0.000627156 +-0.0215605 0.0383186 -0.00194746 +0.0481264 0.060275 -0.00442661 +0.0154998 0.108504 0.0406925 +-0.0729927 0.08468 0.0400334 +0.0156625 0.0631375 0.0506866 +-0.0244911 0.101622 0.043846 +-0.0464946 0.131544 0.00524728 +-0.0496757 0.0678792 -0.0135965 +0.0429479 0.0845778 -0.00579145 +-0.0889655 0.0969901 0.0204055 +-0.0641121 0.152654 -0.0038572 +0.0409571 0.0971716 0.0271682 +-0.0171621 0.0382418 0.0171791 +0.00646008 0.118492 -0.0156628 +0.0328247 0.054955 0.0367483 +-0.0843958 0.13208 -0.00165487 +-0.0521768 0.0517998 0.0286453 +0.0415397 0.0690275 -0.00677 +-0.00193982 0.12966 0.0247961 +-0.0686037 0.157344 -0.00409918 +-0.0332546 0.12417 0.0223928 +-0.0762473 0.0920177 -0.013581 +0.0392491 0.0672477 0.0338308 +-0.0841314 0.0776758 0.00449933 +-0.0638136 0.0680952 0.0346563 +-0.00579523 0.10109 0.0444886 +-0.0717812 0.166615 -0.0459981 +-0.0474379 0.0355948 -0.0152688 +0.0581028 0.0523658 0.0121806 +-0.0787218 0.0967552 0.0354897 +-0.0561139 0.139571 -0.00370722 +-0.0605064 0.0394509 -0.00845033 +-0.0890965 0.111935 0.0113594 +-0.0579064 0.158452 0.00407429 +0.0204977 0.0920241 0.0479175 +-0.0224928 0.0988548 0.044702 +-0.0289733 0.124361 0.000543811 +-0.00750575 0.0457415 0.0474579 +0.043354 0.053395 -0.00666154 +0.0230359 0.124766 0.00534006 +-0.0773785 0.174262 -0.0420678 +-0.0273153 0.0387018 0.0344821 +-2.85469e-05 0.0391507 -0.00580542 +-0.0653748 0.149517 -0.0319115 +-0.0386792 0.0336259 0.00249375 +-0.0655034 0.106997 0.0388261 +0.0203192 0.0679349 -0.0283363 +0.0395784 0.104495 -0.000545476 +-0.0239953 0.114912 -0.0156465 +-0.0660228 0.160133 -0.0132914 +0.0397718 0.0940445 0.031303 +-0.0719497 0.132579 -0.00806719 +-0.0634812 0.0760895 0.041143 +-0.0484925 0.14723 -0.00252533 +0.054748 0.0690996 0.0027667 +-0.0723713 0.156038 0.0237254 +0.034267 0.0613198 -0.014809 +-0.0483876 0.0348751 0.0437589 +-0.05979 0.0839541 -0.0202843 +0.0501248 0.0723145 0.00745971 +0.0347025 0.105449 -0.00966587 +-0.0352566 0.0382472 -0.0299775 +0.0470963 0.045623 0.0254581 +-0.0855435 0.108961 0.00733555 +-0.0206804 0.112216 -0.0188434 +0.00523056 0.0796312 -0.0340387 +-0.0465619 0.047561 -0.00986957 +-0.033587 0.0348608 0.0452447 +-0.0202523 0.125914 0.000840735 +-0.0501104 0.138566 0.0193811 +-0.0264363 0.125919 0.0130719 +-0.0691022 0.159548 -0.0519447 +-0.0245412 0.057448 -0.0303989 +-0.046121 0.0336712 -0.000864342 +-0.0742841 0.155582 0.00848891 +-0.0298186 0.154044 -0.00457012 +0.0302323 0.0969553 -0.0166472 +0.0266877 0.104744 0.0387392 +-0.0843417 0.109004 0.0243603 +-0.0496377 0.143234 0.0104059 +0.0174929 0.0962345 0.0475335 +0.0450677 0.0917906 0.015163 +0.0374841 0.076757 0.0366434 +-0.0215406 0.0711033 0.0513847 +-0.0282153 0.125116 0.00364014 +-0.0284773 0.177212 -0.00607735 +-0.0204956 0.109916 0.0405701 +-0.0784664 0.0703272 0.00666705 +-0.0031698 0.0384355 0.0180459 +-0.0655548 0.153788 -0.00146085 +-0.0229763 0.0945367 -0.0302901 +-0.0192339 0.166857 -0.012207 +-0.0866345 0.094046 0.00237751 +-0.0759405 0.177963 -0.0471435 +0.0442559 0.0973532 0.00916034 +-0.071904 0.103673 -0.0126696 +-0.00666902 0.0541115 -0.0328784 +0.0144947 0.105783 0.0434399 +-0.029312 0.0383797 -0.00726542 +0.0562076 0.0536042 0.00319408 +-0.0829319 0.114342 0.0473556 +-0.069928 0.113662 -0.00916203 +-0.080837 0.120705 -0.00484118 +-0.0680148 0.177312 -0.0499759 +-0.077886 0.0811556 -0.0096326 +0.0350121 0.104701 0.0314746 +-0.0571796 0.0582032 0.0181974 +-0.0932449 0.120197 0.0372886 +-0.0536204 0.0647024 -0.00963527 +0.00250481 0.0870342 0.0569864 +-0.0802055 0.0754813 0.024867 +-0.062996 0.0444935 0.0306768 +-0.00402267 0.0975528 0.0526596 +-0.0883984 0.103684 0.0133796 +-0.0637361 0.133925 0.0394224 +-0.00469624 0.0613427 -0.0349676 +-0.0570417 0.148685 -0.00168484 +-0.062221 0.119852 0.0434664 +-0.0361997 0.0483313 -0.0162949 +0.00950265 0.0517655 0.0513753 +0.00822226 0.0366869 -0.011267 +-0.0383571 0.0360437 0.0112202 +-0.0890914 0.0956431 0.0204208 +-0.0256081 0.0408536 -0.0292407 +0.0374062 0.0397236 -0.000139169 +-0.094388 0.124185 0.0232804 +-0.0615536 0.151288 -0.000477545 +-0.0674057 0.140585 -0.00814985 +-0.0913588 0.113353 0.0143394 +-0.0162447 0.115598 -0.0164334 +-0.00395415 0.0388026 0.0284096 +0.0272466 0.0774691 -0.0233342 +0.0337889 0.112917 0.0264745 +-0.0342171 0.0808501 -0.0245506 +0.0395831 0.0953666 0.0310696 +0.0424402 0.100042 0.00119598 +0.0588348 0.0704992 0.0161593 +0.0129551 0.034265 -0.00247291 +-0.0884357 0.140552 0.0112052 +-0.0545209 0.0388646 -0.0108239 +-0.00760223 0.0406064 -0.0259713 +-0.0671149 0.0634665 0.0239226 +-0.0571873 0.13241 -0.00599886 +-0.0652367 0.0347413 0.0281307 +-0.0733817 0.154066 -0.0309045 +-0.00253313 0.0428829 0.047136 +-0.0768102 0.145866 -0.00487051 +-0.0675702 0.166262 -0.0225175 +-0.0425031 0.0662262 0.0410651 +-0.0579829 0.147131 -0.0018633 +0.0230336 0.049071 0.0400904 +-0.0829949 0.0843947 0.0302754 +-0.0147977 0.0813547 -0.0393324 +-0.015272 0.0385359 0.0263224 +-0.0764401 0.163184 -0.0180705 +-0.00855639 0.121127 -0.0123669 +-0.018702 0.0459339 0.0516744 +-0.0274925 0.0577126 -0.0264141 +-0.0571934 0.155255 0.0174937 +-0.0620081 0.0469936 0.00367346 +-0.010275 0.170544 -0.0261793 +0.0537831 0.0477401 0.0192041 +0.0402375 0.104169 0.000177419 +0.0289937 0.118368 -0.00105099 +-0.039498 0.118035 0.0314 +0.0367284 0.0875226 0.0373878 +0.0431893 0.0764104 0.0272109 +0.0404723 0.0752779 0.0321515 +-0.071418 0.176406 -0.0454588 +-0.0570823 0.138706 -0.0047975 +-0.0666306 0.0689692 -0.00898899 +-0.0691773 0.0628504 0.020491 +0.0144923 0.104443 0.0448169 +-0.0227823 0.0798633 -0.0386035 +0.0278587 0.0463325 0.0365003 +-0.00850193 0.0391005 0.0344133 +-0.0677578 0.16996 -0.0326164 +-0.0367265 0.0725274 -0.0180009 +-0.0681226 0.115765 0.0506532 +-0.0824105 0.154634 0.0158747 +-0.0197211 0.109971 -0.0204733 +-0.0626214 0.149057 -0.0155813 +-0.0414792 0.111213 0.0366505 +0.0570161 0.0508675 0.0161892 +-0.0934473 0.129632 0.0182372 +-0.0463999 0.150559 -0.00488163 +-0.0823822 0.144566 0.00117046 +-0.0310391 0.0892178 -0.0256627 +-0.065854 0.172894 -0.0463248 +-0.069909 0.0416997 0.00317022 +0.0312116 0.11742 0.0240751 +-0.0118175 0.0387383 -0.00407256 +0.01303 0.126665 0.0287751 +-0.0440446 0.129866 0.0080667 +-0.0797747 0.106127 0.0313842 +0.00451933 0.0800063 0.0560543 +0.00739517 0.116252 -0.017256 +0.0277812 0.063284 0.0436054 +-0.0569949 0.126695 -0.00683103 +-0.00960244 0.0420101 -0.025949 +0.0084074 0.123136 -0.0106652 +-0.0428042 0.0338676 0.0265755 +-0.0325056 0.0760815 0.0412743 +-0.0386562 0.0591953 -0.0114762 +-0.0405007 0.0690879 0.0417151 +0.0419622 0.102841 0.00417469 +-0.047644 0.121343 -0.0122933 +-0.0729009 0.105047 -0.011511 +-0.0927931 0.126937 0.0282668 +-0.0656106 0.156261 -0.00734027 +-0.0802248 0.0719997 0.00554401 +-0.00476651 0.0755803 -0.0368945 +-0.0779912 0.139819 -0.00526751 +-0.0864372 0.14049 0.00618869 +-0.0427881 0.157985 0.00470835 +-0.0697618 0.112838 0.0482345 +-0.0800017 0.0786467 -0.00556567 +-0.00794001 0.0994214 0.049751 +0.00252738 0.0716721 0.0561852 +0.0244581 0.0366925 -0.000851561 +-0.0618581 0.153131 0.03333 +-0.0730605 0.177343 -0.046073 +-0.0670133 0.0791411 0.0413099 +-0.00657967 0.0361819 -0.0249969 +0.0332241 0.115988 0.0034015 +-0.0314758 0.118803 -0.0116777 +-0.0714107 0.144356 -0.0151846 +-0.0414986 0.120686 0.028403 +0.0126257 0.034994 0.0315996 +-0.0344792 0.0382691 -0.00267158 +-0.0696814 0.0354769 0.0114289 +-0.0454423 0.0336713 -0.00255197 +-0.0611633 0.0698433 0.0372322 +-0.0520495 0.147795 0.0183962 +0.0467993 0.0745196 0.0137565 +-0.00850445 0.0619527 0.0559735 +-0.0157643 0.0353272 -0.0263783 +-0.0915821 0.144732 0.0201581 +-0.0274038 0.123285 0.0215594 +-0.0667152 0.0419014 -0.00231002 +-0.0408646 0.104225 -0.0205494 +-0.092402 0.129661 0.0272343 +-0.0876501 0.0954829 0.0054069 +-0.063731 0.0751942 -0.0171769 +-0.016949 0.0909918 -0.0366612 +0.0216857 0.0374896 0.0372608 +-0.0733019 0.081934 0.0390113 +-0.033579 0.117839 -0.0126505 +0.00291054 0.0385481 0.0460492 +-0.0648688 0.0938916 -0.0183701 +-0.0931568 0.120191 0.0362904 +-0.0105693 0.129741 0.0187791 +-0.0330922 0.108613 -0.0189923 +-0.0867528 0.121192 -0.00171893 +-0.0398856 0.0351398 0.0419144 +-0.0500753 0.0599861 0.0335137 +-0.0362769 0.163827 -0.00170672 +-0.0161498 0.040504 0.0518582 +0.0390213 0.100628 0.0284944 +-0.0525203 0.0581461 0.0261597 +-0.06389 0.0397139 0.0154457 +-0.0114781 0.0589986 0.0537512 +-0.00335674 0.0424141 0.0475525 +-0.0200738 0.0389483 0.0357554 +0.0112326 0.0738116 -0.0315294 +0.0128141 0.0504969 0.0481838 +-0.0548971 0.104115 -0.019193 +-0.0887169 0.125354 0.00227396 +-0.0712974 0.0669397 0.02531 +-0.0542529 0.0545999 -0.00539104 +-0.0538048 0.159768 -0.00183632 +0.0171004 0.120495 -0.00987579 +0.00927611 0.0667424 -0.0314011 +-0.0928802 0.118867 0.0402859 +-0.0167191 0.0613704 -0.0359554 +-0.0515886 0.0460739 0.0176829 +-0.0182635 0.180096 -0.0244849 +-0.0014996 0.0938866 0.0553603 +-0.0518826 0.071407 0.0396894 +-0.0529375 0.0335557 0.00508499 +-0.0597956 0.0925385 -0.0196216 +-0.0869937 0.104951 0.00838372 +0.0481666 0.0731681 0.01124 +-0.00827202 0.0394277 0.049182 +-0.0607911 0.0810335 -0.0194373 +0.000667625 0.0985049 0.0513232 +0.00310867 0.129093 0.0266332 +0.0296013 0.119582 0.02204 +-0.0285282 0.0378067 0.0260568 +-0.0367133 0.0353138 0.0122122 +-0.0468392 0.132859 0.0202702 +-0.0139293 0.126622 0.0263262 +-0.0191687 0.171226 -0.0215143 +0.0205957 0.0394417 0.0417168 +-0.0692562 0.143958 0.0438704 +-0.037992 0.128312 0.00883318 +-0.0237829 0.0770195 -0.0382449 +-0.0940603 0.120098 0.0152926 +-0.0545976 0.139948 -0.00193829 +-0.0869674 0.103645 0.0213508 +-0.0689616 0.177928 -0.0580053 +-0.079103 0.0731629 0.0235749 +-0.0563149 0.0534289 -0.00138708 +-0.00430179 0.125159 -0.00873129 +-0.0217957 0.119089 -0.0120655 +0.047344 0.0721054 0.0183678 +-0.0206715 0.0524183 -0.0304469 +-0.0292161 0.178518 -0.014988 +-0.0567221 0.0575063 0.0096837 +0.00796175 0.131494 0.0140347 +-0.0163209 0.175704 -0.0185048 +0.0207575 0.0645289 0.0475184 +-0.0365005 0.0676756 0.0415398 +-0.0504985 0.079101 0.0439987 +0.0338763 0.0978118 -0.0135516 +-0.00887371 0.0385959 0.0022117 +-0.0644851 0.0755505 0.0404189 +-0.0877008 0.0923103 0.0248018 +-0.082219 0.074838 0.0095308 +-0.0554964 0.111163 0.0367062 +0.0260064 0.0465031 -0.0156607 +-0.0633419 0.155193 -0.0376165 +-0.0732519 0.0648877 0.00719031 +-0.0769992 0.155545 -0.0179052 +0.0377103 0.0955073 -0.00984226 +0.0174667 0.122816 0.0304302 +-0.0366198 0.0505806 -0.010756 +-0.0144968 0.0472352 0.0484474 +0.00848126 0.0936832 0.0524446 +0.0197906 0.106497 -0.0168156 +-0.0930778 0.121531 0.0352811 +-0.0613674 0.169388 -0.0565896 +-0.0301276 0.038694 -0.0132786 +-0.0662928 0.044787 0.00771957 +-0.0195138 0.0448322 0.0525308 +-0.0886025 0.0887878 0.00646717 +0.0380432 0.109702 0.0166041 +-0.024753 0.0755695 -0.0376923 +-0.089639 0.0983559 0.0164014 +0.0373474 0.083464 0.036489 +0.0200866 0.0429332 -0.0206714 +-0.0362408 0.12776 0.00652715 +-0.0114267 0.182822 -0.0276369 +0.033977 0.115595 0.0137221 +0.016644 0.0381609 -0.019755 +-0.0160134 0.0959893 0.0521651 +-0.0194344 0.115555 -0.0163687 +0.00996296 0.0988804 -0.0226985 +0.0207021 0.0348049 0.000449352 +-0.0655859 0.0333717 0.000880867 +-0.0387964 0.0870429 -0.0222174 +-0.0365713 0.0483594 -0.015218 +0.0310154 0.110075 0.0327245 +-0.0376939 0.0665912 -0.0149459 +0.0401046 0.0466866 0.0313873 +-0.0110827 0.102149 -0.0241692 +0.00841559 0.0375405 -0.0234702 +0.0448731 0.0945767 0.0111579 +0.0145335 0.034759 0.0322003 +-0.059392 0.149673 0.0353015 +0.000291607 0.0641338 -0.034343 +0.00429568 0.0640516 -0.0331969 +0.0450422 0.0931924 0.0131619 +-0.00448954 0.122402 0.0358368 +-0.0326251 0.166779 -0.00520273 +-0.0566266 0.157159 0.00899778 +-0.0131915 0.184654 -0.0268832 +0.0372616 0.0915229 0.0364203 +0.0164447 0.0548852 0.0482217 +-0.0124867 0.11689 0.0385307 +0.00769138 0.039029 0.0323953 +-0.0150057 0.127967 0.0215456 +-0.0860589 0.113009 0.00328149 +-0.0718647 0.175275 -0.0427173 +0.000497507 0.112823 0.0420607 +-0.0832204 0.140695 0.0442806 +-0.0316065 0.039499 -0.0303181 +-0.0689448 0.129685 -0.00899835 +-0.020775 0.0742803 -0.0390259 +-0.0727533 0.0995199 0.0393322 +0.0032483 0.071196 -0.0343078 +-0.0400491 0.154783 -0.00892819 +-0.0345081 0.0832025 0.0425625 +-0.0522702 0.141391 0.00017327 +0.0278273 0.0795375 0.0455649 +0.0269552 0.122658 0.0110745 +0.0348501 0.112087 -0.000408122 +-0.0694924 0.0846972 0.0421957 +-0.0861949 0.139089 0.00320204 +-0.0823568 0.0802033 -0.00152209 +0.00894636 0.0644445 0.055029 +0.0266313 0.0563972 -0.0207832 +0.023933 0.0390696 0.0352942 +-0.0656041 0.136814 0.0420793 +0.0407616 0.105622 0.0111617 +0.058143 0.0551653 0.0211996 +-0.0138904 0.0897489 -0.0373664 +0.0117209 0.130528 0.015412 +-0.0181782 0.126773 0.00187925 +0.039239 0.0589589 -0.00512401 +0.0118091 0.0576645 0.0520801 +0.0101538 0.113447 -0.018237 +0.00107085 0.0391982 -0.0112505 +-0.0726176 0.0747594 -0.0108396 +-0.0504976 0.104261 0.040368 +-0.06047 0.0776106 0.0424994 +-0.0726162 0.166612 -0.0440006 +-0.0345099 0.109779 0.0372255 +0.0371511 0.110987 0.0177157 +-0.0594963 0.1084 0.0386802 +-0.0218558 0.120004 -0.0110164 +-0.0726436 0.159626 -0.0369279 +0.0162217 0.120841 -0.0102336 +0.0462172 0.0729792 0.0194263 +0.0503974 0.0595708 0.0303584 +-0.069034 0.139725 0.045939 +0.0222487 0.0359069 0.0273161 +-0.083623 0.0857135 0.0294569 +-0.0427492 0.0421438 -0.0223063 +-0.0635342 0.161573 -0.0210278 +-0.0632778 0.158345 -0.0436013 +0.049468 0.0445737 0.00523787 +-0.00949755 0.0856659 0.0574293 +0.0137231 0.129888 0.00901711 +-0.0849311 0.0980032 -0.00158096 +0.0094116 0.0360543 -0.0227822 +0.029005 0.115546 0.0303821 +-0.0136476 0.0481469 -0.0303471 +0.0203578 0.0985304 -0.0223097 +0.0386883 0.0767039 0.0348633 +0.0505119 0.0665023 0.0275359 +-0.0236064 0.038163 0.0249493 +-0.0662075 0.060375 0.00901189 +-0.0309847 0.0381919 0.0323901 +-0.0577888 0.0439091 -0.00660137 +0.0319539 0.0795563 0.0427459 +-0.0888256 0.100978 0.0104077 +-0.0149675 0.0986909 -0.0245721 +0.0080932 0.126458 -0.00628099 +-0.0629819 0.128219 -0.0083429 +0.00592947 0.0982847 -0.0240623 +-0.0791963 0.120405 0.0507691 +0.0385114 0.0583288 0.0314228 +0.0327231 0.116168 0.00178038 +-0.0838537 0.110728 0.0339922 +-0.0559583 0.0478125 -0.00439058 +-0.0864154 0.152983 0.0204471 +-0.0846489 0.0778245 0.0165124 +-0.0244888 0.120706 0.0294035 +-0.0565129 0.051223 0.00779351 +-0.00649552 0.111418 0.0421995 +-0.0400289 0.0336199 0.00584373 +0.00964377 0.120482 -0.0138306 +-0.0819198 0.126566 -0.00507678 +-0.023502 0.180157 -0.0112302 +-0.033578 0.0448331 0.0458046 +-0.0771053 0.177652 -0.0476237 +-0.0244946 0.0357757 0.0532784 +0.044574 0.0903504 0.0211613 +0.0317623 0.0938577 -0.0173357 +-0.0767292 0.0860417 0.0380634 +-0.0291365 0.165225 -0.016186 +-0.0558064 0.0562012 0.00862658 +-0.0197239 0.0612902 -0.0351879 +-0.0624763 0.163084 -0.0515885 +-0.00157869 0.0347285 -0.0237137 +0.0250862 0.0741055 0.0468243 +-0.00657564 0.0346831 -0.0243352 +-0.0927326 0.12419 0.0292678 +-0.0642565 0.0418897 0.0384072 +0.0074848 0.0976824 0.0494394 +-0.0324803 0.0436623 0.0489836 +0.0309993 0.0686673 0.04128 +-0.00959045 0.0337105 -0.0233226 +-0.0692347 0.176505 -0.0570351 +-0.0524975 0.111152 0.036921 +0.0434926 0.056984 0.0319757 +-0.0448698 0.104232 -0.0209188 +-0.0689139 0.148999 -0.0367601 +-0.0366298 0.0344715 0.0361774 +-0.0772403 0.0846603 0.0372078 +-0.0866727 0.139248 0.0421058 +-0.0692038 0.156713 -0.0519425 +-0.0286406 0.154979 -0.0065778 +-0.0516452 0.119776 0.0340339 +-0.0604002 0.0591276 0.0185111 +-0.0789005 0.172846 -0.0440952 +-0.0733588 0.0659821 0.00263497 +-0.0644533 0.0351399 0.0400818 +0.0349985 0.0619413 0.0382049 +-0.0116935 0.0584778 -0.0346471 +0.0397873 0.104095 -0.000789682 +0.0261507 0.0923065 -0.0217116 +-0.0643301 0.156694 -0.0446094 +0.0312874 0.108108 -0.0105276 +-0.0718754 0.119424 -0.00835095 +-0.0897483 0.0929448 0.0154361 +-0.0322408 0.125589 0.00213325 +0.0193474 0.0551603 -0.0276297 +-0.0355381 0.0335618 -0.0245193 +-0.0323633 0.175433 -0.0143069 +0.0591153 0.0705615 0.014025 +-0.0685156 0.168032 -0.0539935 +-0.0408127 0.127672 -0.0010356 +-0.070932 0.129672 -0.00889239 +-0.0315034 0.0717826 0.0402663 +0.0139874 0.0924572 -0.0278842 +-0.00310937 0.0390986 -0.00637767 +-0.0315484 0.0749387 -0.030532 +-0.0658202 0.0597996 0.0132017 +-0.074125 0.079542 -0.012586 +-0.042758 0.0336059 0.00168497 +-0.0376274 0.0534153 -0.0106276 +-0.0609006 0.106856 -0.0171292 +-0.0465015 0.112315 -0.0168133 +-0.00832405 0.129364 0.00227931 +0.000993844 0.0989182 -0.0247915 +-0.092775 0.128304 0.0272531 +-0.0024916 0.073257 0.0585379 +-0.0354714 0.0959602 0.0437897 +-0.0798628 0.122191 -0.00554615 +-0.0379836 0.153062 -0.00765575 +-0.0574689 0.0413481 0.0461934 +-0.0681352 0.166058 -0.0212868 +-0.0655788 0.037063 0.0157921 +-0.0104996 0.03868 -0.00189881 +0.00192546 0.0390395 0.0275923 +-0.0598545 0.0467827 -0.000327155 +-0.0510269 0.136724 0.0245519 +-0.0626706 0.0343644 0.032487 +0.0368248 0.11128 0.0190303 +0.047871 0.0733255 0.0156276 +-0.0291332 0.059286 -0.0234112 +-0.0554108 0.0344947 0.0391385 +-0.0892997 0.0956389 0.0174174 +-0.0880049 0.11182 0.00834875 +0.0309816 0.102484 -0.0145328 +0.0183118 0.0665429 -0.0287115 +0.00448658 0.111391 0.0416751 +-0.0902127 0.122664 0.0052855 +-0.0900898 0.119956 0.00430245 +-0.026505 0.174198 -0.0103819 +-0.0214492 0.0963545 -0.0261739 +0.0574071 0.0691343 0.00477569 +-0.0755392 0.154957 0.000803149 +-0.0205078 0.049871 0.046386 +-0.0302748 0.116055 -0.0148216 +0.0522643 0.0732287 0.00987093 +-0.0353184 0.153664 -0.00782609 +-0.0468563 0.101377 -0.0215448 +0.0252483 0.0713214 0.0452679 +-0.01624 0.0963836 -0.0301721 +-0.0374901 0.0505918 0.0391881 +-0.000727236 0.069749 -0.034387 +-0.0295801 0.0368886 0.052851 +0.0174262 0.0350846 0.00327627 +-0.0408044 0.0884947 -0.0224789 +-0.0540496 0.0546601 0.0106814 +-0.0841802 0.136658 0.046769 +0.0265654 0.0388814 0.0291555 +-0.0365515 0.115187 -0.0158874 +-0.0746646 0.0981736 0.0384691 +-0.0461647 0.162128 -0.00806097 +-0.0838755 0.106118 0.000396239 +-0.0634664 0.0345901 0.0373297 +-0.0487026 0.0708482 -0.0151225 +-0.0490488 0.150196 -0.0040443 +-0.0454995 0.107082 0.0401134 +0.015502 0.109895 0.0399577 +0.0339767 0.0796167 -0.0178174 +-0.064903 0.110966 -0.0133006 +-0.0884279 0.0874564 0.00647862 +0.0303366 0.0352283 0.0150252 +-0.0476647 0.15359 0.00991943 +0.0491492 0.0460297 0.00132033 +0.0571336 0.0721807 0.0116675 +0.0423629 0.0398964 0.0150374 +-0.0075036 0.12108 0.0363047 +-0.0304017 0.0791045 -0.033577 +-0.0707511 0.0654954 0.0231537 +-0.0344941 0.171246 -0.000779029 +-0.0516393 0.0618882 -0.0103104 +0.0364959 0.064355 -0.0127735 +0.0258636 0.0344283 0.00929921 +-0.06094 0.0410414 0.0167056 +0.0388283 0.102661 -0.00481845 +0.00951185 0.0560842 0.0527429 +0.0250009 0.0629104 -0.0235842 +-0.0883814 0.100948 0.00841627 +-0.0896675 0.150196 0.0231327 +-0.0502775 0.0487457 0.0176637 +-0.0574379 0.0576833 0.0026039 +-0.0889127 0.145822 0.0300758 +0.00105802 0.0387062 0.0241019 +0.0432951 0.0987146 0.0161577 +-0.00981592 0.123797 -0.00918874 +-0.0235467 0.119499 0.0316537 +-0.0203743 0.127028 0.00506457 +-0.0546314 0.138445 -0.00241154 +0.0144977 0.11819 0.0360011 +-0.0468871 0.150669 0.00925072 +0.00310943 0.110155 -0.0202398 +-0.0315082 0.0817114 0.0416031 +-0.0361907 0.169669 -0.0137878 +-0.0266475 0.0904555 0.0474235 +0.00393808 0.131671 0.0154244 +-0.0594984 0.109765 0.0377884 +-0.0632488 0.167828 -0.0435907 +0.02054 0.116646 0.0351499 +0.046015 0.0862238 0.00817489 +-0.0472066 0.033531 -0.00644781 +-0.0382901 0.126893 -0.00216373 +0.0358746 0.0755562 -0.0137901 +-0.00915886 0.0385694 0.027547 +-0.083022 0.132397 -0.0026267 +-0.0665414 0.155108 -0.00331096 +-0.0344162 0.168264 -0.00253059 +-0.0891077 0.101031 0.0163881 +-0.0165765 0.119912 -0.0109781 +0.00442197 0.11861 -0.0157775 +-0.0234514 0.0892984 0.0527307 +0.0565327 0.0523952 0.0217798 +-0.0515006 0.111173 0.0369493 +-0.0218128 0.183092 -0.0122978 +0.0044132 0.0376001 -0.0242202 +-0.0654801 0.0675388 0.0330326 +-0.010497 0.0717087 0.0563199 +-0.065424 0.0399796 0.0326661 +-0.0228869 0.180156 -0.0121058 +0.0203379 0.125091 8.19329e-05 +-0.0802772 0.089954 0.0344521 +-0.0772906 0.165906 -0.0257637 +-0.012412 0.0382658 0.0163183 +0.0102284 0.0616887 0.0533551 +-0.00987882 0.105925 -0.0227673 +-0.00348977 0.122389 0.0359468 +-0.0759061 0.0675035 0.00967604 +-0.0414986 0.0874028 0.042497 +-0.0605969 0.06056 0.0225173 +0.0395569 0.0702481 -0.0107925 +-0.0329324 0.0638892 -0.016427 +-0.000943594 0.0381622 0.0205587 +-0.0338755 0.107095 -0.0200162 +-0.0125023 0.0486789 0.0487656 +0.0274856 0.0400248 0.0301572 +-0.0008153 0.10869 -0.0211159 +0.0343096 0.0419726 0.0279684 +-0.0247603 0.0865587 0.0527086 +-0.00553736 0.113796 -0.0185731 +-0.021633 0.035044 -0.0280533 +0.00828872 0.130472 0.0213052 +-0.0242184 0.0593353 0.0417104 +0.0288386 0.111536 -0.010211 +-0.0581339 0.0334069 -0.00670381 +0.037704 0.0574555 -0.00668675 +-0.0710158 0.13691 0.0483444 +-0.0305078 0.112529 0.0355647 +0.0343502 0.114842 0.0181324 +-0.0485971 0.0359097 0.00925535 +-0.0288479 0.0578621 -0.0233922 +-0.051497 0.0890197 0.045238 +0.0121456 0.0347039 0.0353715 +-0.0716902 0.155937 0.00211062 +-0.0790692 0.0804499 0.033529 +0.0545445 0.0589886 -0.00181806 +0.0529955 0.0716182 0.0219676 +-0.056511 0.121265 0.0393235 +0.032607 0.0527076 -0.00976892 +-0.0376644 0.0335909 0.0081569 +-0.0936994 0.128298 0.0232525 +-0.0809806 0.0720629 0.0115411 +-0.0239408 0.0886576 -0.0363455 +-0.0859344 0.107632 0.00736881 +-0.0277915 0.0782183 -0.0359607 +-0.0571511 0.0394305 0.0468685 +-0.0839381 0.0791399 0.0214982 +-0.0234217 0.0359155 0.0533704 +-0.0739011 0.106421 -0.010241 +-0.0567145 0.0334976 0.000765085 +-0.0241329 0.157302 -0.00905689 +-0.0128819 0.126866 -0.00238505 +-0.0250553 0.0707727 0.0450037 +-0.0444963 0.119293 0.0294103 +-0.0463222 0.0411097 -0.0132713 +-0.0451547 0.0437693 -0.0122411 +0.0475648 0.0553802 0.031711 +-0.0494965 0.11266 -0.0171746 +0.00314926 0.122256 -0.0116623 +-0.089161 0.137877 0.0251937 +-0.0171561 0.0387671 0.0311342 +-0.0659181 0.10388 -0.0158661 +-0.062107 0.163118 -0.0365927 +0.0444569 0.0444867 0.0259758 +-0.0206484 0.0464719 -0.0278809 +-0.0668387 0.144945 -0.0185544 +-0.0574928 0.102919 0.0421703 +-0.0655518 0.166572 -0.0275081 +-0.0339393 0.126307 0.017694 +-0.0176989 0.0554882 -0.03328 +0.012239 0.0794574 -0.0314827 +-0.0344963 0.094609 0.0443801 +0.0228685 0.123786 0.00100726 +-0.0920259 0.132307 0.0132318 +-0.0713267 0.169665 -0.0267525 +-0.081588 0.0788215 -0.00249997 +-0.0755712 0.102178 0.0364401 +-0.0482055 0.0335674 -0.00667883 +-0.0295069 0.109802 0.0378356 +-0.0819634 0.103331 0.0300688 +-0.0766364 0.0788383 -0.00918256 +-0.0472353 0.12392 0.0280317 +-0.0424858 0.064826 0.0410217 +-0.00749383 0.112788 0.0415528 +-0.0321607 0.174124 -0.015122 +-0.0148084 0.124344 -0.00565133 +-0.0630295 0.126909 0.044075 +-0.0122771 0.129643 0.0167063 +-0.0137469 0.0714346 -0.0382786 +0.0253964 0.0981715 0.0439168 +-0.0105339 0.100499 0.0452584 +-0.0909546 0.139232 0.0191849 +-0.0239226 0.16684 -0.0101968 +-0.00433796 0.0387886 -0.000752538 +0.00920046 0.0879669 -0.0320124 +-0.0404937 0.0662835 0.0416604 +-0.0569887 0.118401 0.0385929 +-0.0715396 0.0362187 -0.000138838 +0.0226226 0.0591926 0.0466634 +-0.0544937 0.112536 0.0358256 +-0.0843481 0.145997 0.00513587 +-0.022811 0.0756351 -0.0385829 +-0.0666897 0.0735998 -0.0145924 +-0.0404977 0.116683 0.0325662 +0.0032744 0.114489 -0.0193505 +0.00148054 0.0413996 0.0463959 +-0.0245078 0.0767611 0.0513331 +-0.0308625 0.101511 -0.0227041 +0.00533966 0.0345787 0.0412861 +-0.0774755 0.170095 -0.0341987 +-0.0650593 0.125632 0.048098 +0.0112751 0.0505364 0.0494832 +-0.0786212 0.0976351 -0.0095679 +-0.0726748 0.0647223 0.00565049 +-0.0350102 0.158094 0.00367693 +0.0175012 0.11539 0.036772 +-0.0205761 0.0350586 0.0512942 +-0.0408828 0.108487 -0.0195205 +-0.0324978 0.0661054 0.0396515 +-0.0860138 0.0845642 0.00148082 +0.00924462 0.0710839 -0.0326657 +-0.0573888 0.0342428 0.0302238 +-0.0809405 0.141759 -0.00181375 +0.0351408 0.0931106 -0.0145377 +0.0391769 0.106978 0.0201683 +-0.0378047 0.0342916 0.0307956 +-0.0614885 0.0932285 0.0449784 +-0.00750736 0.0561433 0.0534652 +0.0317881 0.0564278 0.038783 +-0.0258626 0.0378286 0.0139698 +-0.0515546 0.0445278 -0.00899667 +-0.010869 0.165486 -0.0158779 +-0.0297303 0.109983 -0.0184292 +-0.0469177 0.0346518 0.0071269 +-0.0286016 0.109083 -0.0194963 +-0.0109096 0.172768 -0.0212178 +0.00821291 0.0711477 -0.0331375 +0.00315167 0.10307 -0.0219554 +-0.0472567 0.132959 0.0215876 +-0.0825276 0.142074 0.0435561 +-0.0136058 0.093388 -0.035076 +-0.0179202 0.0385865 -0.0163394 +-0.0641268 0.0405801 0.0396199 +0.0124469 0.129111 0.00141235 +-0.0637038 0.0343279 0.0323025 +0.0354218 0.100763 0.0338403 +0.0121385 0.130422 0.0141392 +0.00281822 0.126541 -0.00629609 +0.000901863 0.122026 -0.0113896 +-0.0702669 0.176516 -0.0559875 +-0.0576072 0.0336162 0.0112663 +0.0129045 0.125515 -0.00527553 +-0.021518 0.115416 0.036565 +-0.01542 0.16691 -0.0137031 +-0.0365035 0.168234 0.000585726 +0.00464616 0.034105 0.00716872 +-0.0319348 0.125225 0.000800634 +-0.0169495 0.0390889 0.0362738 +-0.024481 0.104364 0.0426891 +0.0161036 0.0393372 0.0440174 +-0.0397156 0.127552 0.0155957 +-0.0063009 0.09425 -0.0339062 +-0.00549064 0.104476 0.0440202 +-0.0455034 0.104326 0.041412 +-0.0625466 0.16468 -0.0375945 +-0.0334032 0.0765382 -0.0275106 +-0.0118225 0.0855318 -0.0386599 +0.0100166 0.0833203 0.0549696 +-0.0685481 0.156429 0.0206858 +-0.0705717 0.158164 -0.0459142 +-0.0185161 0.125172 -0.00248935 +-0.0185539 0.095955 -0.0297446 +0.0191428 0.127427 0.0167214 +-0.0145095 0.171282 -0.0176637 +0.0352621 0.0826509 -0.01774 +-0.0526579 0.0504274 0.026653 +0.00237351 0.0465882 -0.0283321 +-0.0854761 0.132564 0.04817 +-0.0868299 0.0846427 0.00348465 +-0.0105903 0.0377043 -0.0258398 +0.00953188 0.0455622 0.0461832 +-0.0662037 0.154495 -0.0505507 +-0.0856221 0.107687 0.0203552 +-0.0858054 0.102155 0.00239755 +-0.0248162 0.126254 0.00926143 +-0.0398081 0.128271 0.00374611 +-0.00949649 0.0546877 0.0525704 +-0.0474662 0.0960033 0.0439936 +-0.0787761 0.1431 -0.00379727 +0.0264606 0.0663192 -0.0226274 +-0.0294891 0.119549 -0.0104626 +-0.0285179 0.0948797 -0.0246293 +-0.0561001 0.14389 0.0312058 +-0.0930288 0.116051 0.018311 +-0.00894653 0.174179 -0.0257648 +-0.0524908 0.113899 0.0349209 +0.0158504 0.0959717 -0.0236278 +-0.0694879 0.0368888 0.0112092 +-0.0802884 0.146109 0.0411929 +-0.0498232 0.0349806 0.0446412 +0.0342731 0.115225 0.0123899 +0.0283978 0.0955434 -0.019149 +-0.0515486 0.141607 0.0193759 +-0.0458573 0.147704 0.00717141 +-0.0735436 0.175947 -0.0433626 +-0.0758292 0.0935231 -0.0136873 +-0.0554898 0.041398 0.0465154 +0.0604856 0.0623173 0.00815473 +0.0135991 0.100782 -0.0226731 +-0.021666 0.16235 -0.015178 +-0.0474866 0.0573572 0.0366835 +-0.0645248 0.154173 -0.00692339 +0.0454055 0.0747572 0.0215389 +-0.0497578 0.0797288 -0.020162 +-0.0463447 0.129406 0.0234768 +0.0153317 0.0580768 -0.0287753 +0.0124861 0.100431 0.0478938 +-0.0288456 0.0986889 -0.0235542 +-0.00949656 0.0471698 0.047803 +-0.0644726 0.165628 -0.0285568 +0.0564615 0.0703554 0.0055259 +-0.0477419 0.0345444 0.0337565 +-0.0415114 0.0520187 0.0393909 +-0.0165872 0.128419 0.0166112 +-0.0649318 0.168832 -0.0387572 +-0.0230309 0.0906523 0.0522978 +-0.0289316 0.0889882 -0.0316153 +-0.0522528 0.0567257 0.0259279 +-0.0113061 0.169739 -0.0249506 +0.0329977 0.0514306 -0.00763543 +-0.0104801 0.120983 0.0360777 +-0.0848294 0.111312 0.0422165 +0.0597675 0.0609389 0.00613027 +-0.0264774 0.0473675 0.0499125 +-0.00223749 0.0939165 -0.0335391 +-0.0188762 0.171241 -0.0152046 +0.0460317 0.0820288 0.0151733 +-0.00015619 0.0389464 0.0272511 +-0.0490964 0.156122 -0.00621407 +0.0240569 0.111353 0.0367066 +-0.0427705 0.0826571 -0.0207663 +-0.0844768 0.0856095 0.0274708 +-0.0120306 0.174239 -0.0210892 +-0.00550834 0.0689154 0.0563731 +0.0289606 0.0679277 -0.0207366 +-0.0308933 0.12367 0.0217821 +-0.00650569 0.0675101 0.0559953 +-0.0789661 0.0859916 0.0360799 +-0.0291346 0.177171 -0.00534178 +-0.0560039 0.140764 -0.00299974 +-0.0584999 0.107052 0.0397144 +0.00834583 0.0539265 -0.0302958 +-0.0169173 0.16018 -0.0117745 +-0.0698587 0.0680767 -0.00467294 +0.00525002 0.0740223 -0.0345195 +0.0110199 0.0860342 0.0546992 +0.0173361 0.0608154 -0.0277985 +0.0111302 0.107269 -0.019511 +-0.021494 0.10578 0.0424616 +0.0436775 0.0859385 0.0262014 +-0.0587477 0.0767588 -0.0188591 +0.0107799 0.0548821 0.052327 +0.0185294 0.0358466 0.0392699 +-0.0859998 0.135257 0.0457789 +-0.0767885 0.154209 -0.0148974 +-0.0613392 0.0587193 0.00967832 +-0.0712669 0.0381904 0.00872646 +0.00351715 0.0561463 0.0534882 +-0.0427983 0.0884442 -0.0218161 +-0.0898373 0.133802 0.0342135 +-0.0414226 0.150668 0.00483874 +0.0173651 0.049165 -0.0241471 +-0.0213294 0.0783028 0.0551779 +0.0143433 0.0537792 -0.0282321 +-0.0784743 0.140032 0.0478552 +-0.0334891 0.0889549 0.0439078 +0.0190476 0.0795376 0.0522219 +0.0286264 0.0638437 -0.020406 +-0.054069 0.139552 0.0288194 +-0.0132381 0.0385471 0.0267309 +0.0118566 0.0887261 0.0541581 +0.0316481 0.100683 -0.014625 +-0.093138 0.120057 0.0112982 +0.0244505 0.0384021 -0.00302114 +0.0122037 0.0864617 -0.0308592 +-0.0121165 0.0973987 0.0513433 +0.0371269 0.09285 0.0362758 +0.00753839 0.119505 -0.0147629 +-0.0698326 0.0937229 -0.0162704 +-0.046496 0.105677 0.0407002 +-0.00449814 0.0870358 0.0571267 +-0.00560579 0.042007 -0.0256504 +-0.0748416 0.154048 -0.0189002 +0.0138852 0.0348367 0.0283807 +-0.0890009 0.118943 0.0464523 +-0.0703858 0.16802 -0.0500308 +-0.0208115 0.124915 -0.0021319 +-0.0399669 0.0343914 -0.00210399 +-0.0188044 0.120762 -0.00982397 +-0.0825182 0.0816676 0.0298907 +-0.0625957 0.0588736 0.0128867 +-0.0908844 0.150204 0.0171288 +-0.073715 0.17176 -0.0333959 +0.0304194 0.0446109 0.0313507 +-0.0364972 0.0605644 0.0405385 +-0.0684905 0.158118 -0.0539401 +0.011386 0.0343226 -0.0122219 +-0.0375464 0.119352 -0.0122401 +-0.036497 0.102841 0.0405772 +0.0373988 0.0430101 -0.00376662 +-0.00864037 0.0526884 -0.0330777 +-0.0505191 0.112725 -0.0172384 +0.000747713 0.131321 0.00709666 +-0.0821064 0.110205 0.0294137 +-0.0338319 0.0498039 0.0388148 +-0.0399647 0.128635 0.00811119 +0.0262642 0.0479348 -0.017662 +-0.093142 0.118716 0.0123041 +-0.0234219 0.0537493 0.0424994 +0.0109672 0.0977693 -0.023517 +-1.32571e-05 0.13145 0.0125463 +0.0200527 0.0618555 0.0482337 +-0.0119089 0.128954 0.021205 +-0.0524994 0.0903873 0.0447034 +-0.0334979 0.0845774 0.0421828 +0.0190672 0.117213 -0.0123322 +-0.0263135 0.0381467 0.0262093 +0.034589 0.108233 -0.00663102 +0.0435886 0.091694 0.0241609 +-0.00849618 0.0939016 0.0554996 +-0.0579701 0.125253 -0.00738272 +-0.016138 0.0382862 0.0119165 +-0.0709351 0.0742605 0.0366097 +-0.0125367 0.128434 0.00198737 +-0.0244307 0.0379986 0.0104913 +-0.0681277 0.152206 0.0356633 +-0.0279464 0.0689892 -0.032513 +0.0398535 0.0752995 0.0330037 +-0.0636875 0.0722354 -0.0149801 +0.00569987 0.0949071 -0.0304911 +0.0217235 0.120687 0.0315848 +0.0306109 0.0549842 0.038821 +-0.0719231 0.155792 0.0253493 +-0.0350091 0.168257 -0.00164334 +-0.0919787 0.13239 0.0232249 +-0.0781961 0.0730005 -0.00359699 +0.0587114 0.0663183 0.00513779 +-0.0669656 0.147091 -0.0266318 +-0.0880403 0.150094 0.0102212 +-0.0137235 0.0657235 -0.0372342 +-0.0884987 0.102354 0.0183681 +-0.0219433 0.0386564 0.0320445 +-0.0629896 0.0341974 0.0167609 +0.0436977 0.0404602 0.0147575 +-0.0413787 0.124797 0.0224172 +-0.0255118 0.0931431 0.0461963 +-0.0122206 0.175683 -0.0283056 +-0.0580888 0.115436 0.0369297 +-0.0783607 0.150068 -0.00187639 +0.0561422 0.049398 0.0141897 +-0.0334907 0.0932064 0.044455 +-0.0784392 0.144133 0.0443751 +0.0134754 0.0990564 0.0479483 +-0.0673994 0.0396352 0.0118227 +-0.0719379 0.131113 -0.00828186 +-0.0675058 0.060447 0.0122781 +-0.0276134 0.0408758 -0.0294796 +0.0326756 0.117173 0.0132168 +-0.0741715 0.151271 -0.0318825 +0.0191559 0.0577995 0.0486799 +-0.0624968 0.102902 0.0415908 +-0.0467288 0.054632 0.0374442 +0.0400692 0.0773178 -0.00879643 +-0.0293794 0.119962 0.0282913 +0.026315 0.0849274 0.0469361 +0.00747158 0.0458651 0.0478111 +-0.0644149 0.0731789 0.038947 +0.0243686 0.118145 -0.00732959 +0.0357612 0.0614637 -0.0127934 +-0.00578852 0.0784633 -0.0377499 +-0.0177178 0.125534 0.0250034 +-0.0264348 0.0891318 0.0486594 +0.000504451 0.0842848 0.0575158 +0.00240772 0.0390703 -0.0246208 +-0.0401081 0.172699 -0.00896014 +-0.0494967 0.101524 0.042218 +-0.0255895 0.0365546 -0.0292581 +0.0458597 0.0428246 0.0032848 +-0.0627733 0.141026 0.037362 +-0.0278525 0.100136 -0.023576 +0.03144 0.0681325 -0.0188162 +0.0112459 0.129755 0.00240428 +-0.0872718 0.144583 0.0355002 +-0.0552077 0.119827 0.0376818 +-0.0324974 0.0859857 0.0423469 +-0.0872251 0.0950749 0.0256867 +-0.0468678 0.104213 -0.0207743 +-0.0445775 0.0462028 -0.0108205 +-0.0612826 0.0343712 0.0345145 +-0.0144859 0.0951551 0.0535558 +-0.0770239 0.141306 -0.00545257 +-0.0572927 0.0447946 0.0143752 +0.0334156 0.0430777 -0.00456693 +-0.073856 0.154091 -0.0259028 +0.0392277 0.108354 0.00916622 +-0.0254312 0.0379511 0.0211651 +-0.0579761 0.145744 -0.00191597 +0.016043 0.107446 -0.0178315 +0.0243862 0.0955601 0.0459654 +-0.0527854 0.146248 0.0203946 +-0.0908456 0.137855 0.0191944 +-0.0688648 0.111591 0.0438135 +0.00950305 0.108494 0.0403312 +-0.0846701 0.133487 -0.000689201 +-0.0146178 0.161254 -0.0115208 +-0.0517406 0.0704199 0.0388209 +-0.00483682 0.0910121 -0.035647 +-0.0455024 0.0438631 0.0430524 +-0.0269915 0.165366 -0.00760144 +-0.000429299 0.131494 0.0138246 +-0.0108252 0.0340132 -0.0200775 +-0.053792 0.141582 0.0273817 +-0.0807416 0.0720213 0.00853917 +-0.0886543 0.102345 0.0123871 +0.00450201 0.0745047 0.0565768 +-0.0651106 0.120024 0.049809 +-0.0816493 0.14593 0.000178819 +-0.0317919 0.0396266 0.0512352 +-0.0868829 0.105004 0.0193534 +-0.0587854 0.0839965 -0.0207846 +-0.0568787 0.10406 -0.0186489 +0.0234195 0.0349614 0.0211471 +-0.0247363 0.0683356 -0.0352871 +-0.0124919 0.105832 0.0432095 +0.040945 0.0957511 0.0281635 +-0.0357042 0.0681118 -0.016092 +0.0393973 0.0899152 -0.0117774 +-0.00550412 0.0547964 0.0538028 +0.0275305 0.105074 -0.0152759 +0.0436438 0.0973161 0.0031761 +-0.0642775 0.0356785 0.0173446 +-0.0578787 0.118384 0.0390612 +-0.0235304 0.111308 0.039012 +-0.0248685 0.10443 -0.0231858 +0.0332298 0.0870923 -0.0186827 +-0.050788 0.13247 -0.00197537 +0.0485095 0.0723104 0.0188157 +0.0122831 0.123395 -0.0089862 +0.0075079 0.0786108 0.055765 +0.00110358 0.114412 -0.0192684 +-0.0434472 0.0344528 0.0312293 +0.0149724 0.0740286 0.0533099 +-0.0773286 0.0696655 0.0199272 +-0.000294503 0.124716 -0.00828566 +0.0391665 0.0916193 -0.0109453 +-0.0671371 0.169442 -0.0570354 +-0.0101504 0.0993437 0.0489973 +-0.0383111 0.172675 -0.0109203 +-0.048519 0.137086 0.0153953 +0.0537553 0.0686728 0.0251859 +-0.0642372 0.158555 -0.0140759 +-0.0177679 0.0959988 0.0511065 +-0.071022 0.0408196 0.00705143 +-0.0272272 0.0562777 -0.0264072 +-0.0594982 0.10293 0.0419773 +-0.0516777 0.0668198 0.0365892 +-0.00645905 0.128953 0.0260767 +0.0161504 0.121694 -0.0091598 +0.0437177 0.0457281 0.0283091 +-0.092911 0.118706 0.0113064 +0.0110654 0.0346569 0.0243461 +-0.0131306 0.0351789 0.049391 +0.0159998 0.123366 -0.00698095 +-0.0668407 0.0952437 -0.0171577 +-0.071815 0.0936645 -0.0155813 +-0.0350082 0.162373 -0.00163299 +-0.00952557 0.169814 -0.0256004 +-0.0483792 0.0345623 0.0353569 +0.042732 0.0733313 -0.00479409 +-0.0838195 0.113254 0.0462465 +-0.0700699 0.0415411 0.00206928 +-0.0834164 0.110194 0.0380909 +0.0395682 0.0582726 0.0307001 +-0.0527297 0.0738092 -0.0169322 +-0.0800112 0.0826849 -0.00756298 +0.0378591 0.102628 -0.00683982 +-0.010049 0.165099 -0.0207588 +-0.0214981 0.0486638 0.0490621 +-0.0429934 0.0337652 -0.0113325 +-0.000805756 0.0881637 -0.035184 +-0.0796191 0.0899783 0.0351979 +-0.0774871 0.138654 0.0489668 +-0.0910383 0.131037 0.0312282 +-0.0353528 0.121762 0.0276148 +-0.0692517 0.16944 -0.0530112 +-0.0314965 0.0760483 0.040909 +0.0238425 0.124265 0.00565298 +0.00628938 0.0341841 -0.018778 +-0.0581165 0.0576994 0.00562055 +0.0291881 0.120758 0.0119009 +-0.0722612 0.0718535 0.0331389 +0.00962203 0.129808 0.0232185 +-0.0350797 0.159271 -0.0126349 +-0.0536324 0.0335534 0.00133593 +-0.0104359 0.0944019 -0.0340934 +-0.00347107 0.112728 -0.01944 +0.0492065 0.0445737 0.00425603 +-0.014689 0.0555534 -0.0339367 +-0.0729302 0.110914 0.0452396 +0.0128104 0.0891816 -0.030491 +0.0173644 0.052219 -0.0267492 +-0.0755038 0.138646 0.0489499 +-0.0664863 0.0657678 0.0290911 +0.014321 0.0608889 -0.0289153 +-0.0109854 0.0891937 -0.0368255 +-0.0714642 0.155388 -0.0429121 +-0.0674015 0.178779 -0.0526749 +-0.0136021 0.0406665 -0.0268707 +-0.0656159 0.148667 -0.029991 +-0.0795217 0.0705829 0.00954625 +-0.0757838 0.06757 0.0150388 +-0.0619636 0.125289 -0.00856668 +-0.0639176 0.153606 -0.0366205 +-0.0839617 0.114292 0.0471508 +-0.0125655 0.164041 -0.0130929 +-0.0519903 0.161388 0.00628165 +0.0020129 0.0391581 -0.00540617 +-0.0585951 0.0582039 0.0052961 +0.034843 0.0862437 0.0399362 +-0.0416697 0.0377451 -0.0272469 +0.0488349 0.0718069 0.020409 +0.0223863 0.0449715 0.0408911 +-0.0822334 0.107404 -0.00162196 +-0.0602698 0.154572 0.0280125 +0.0297856 0.120093 0.00926746 +-0.0669649 0.131148 -0.00876196 +-0.0800697 0.154441 0.0255089 +-0.0849288 0.12649 -0.00334252 +-0.000500036 0.0952296 0.0545194 +0.0151613 0.0863718 -0.029541 +0.0388132 0.0794166 0.0350891 +-0.0171133 0.0390763 0.0521827 +-0.0784063 0.0886978 0.0368492 +-0.0643001 0.179479 -0.0601392 +-0.0766538 0.11399 -0.00481419 +-0.016912 0.0931258 -0.0348233 +0.0379841 0.0406211 -0.00115448 +-0.0331507 0.0821697 -0.0275285 +0.0162383 0.0953367 0.0482094 +-0.0326141 0.0638332 -0.0174509 +-0.0725041 0.146981 0.0423864 +-0.0910261 0.12541 0.00626868 +-0.0833424 0.104748 -0.00163012 +0.0153058 0.128412 0.00248962 +0.0403512 0.038719 0.00830945 +-0.0325027 0.0603855 0.0384943 +-0.0195554 0.0387278 -0.0149268 +-0.0839725 0.0897798 0.0296574 +-0.00149888 0.0634085 0.0566876 +0.0387554 0.108357 0.00416438 +-0.0444079 0.0409084 -0.0203048 +-0.0868827 0.0896245 0.0255163 +0.0430409 0.10011 0.0131585 +0.0194835 0.105739 0.0423148 +0.032957 0.115724 0.0233075 +-0.0114871 0.063283 0.055206 +-0.0528865 0.15117 0.0191272 +0.0045048 0.104341 0.0428855 +0.00104791 0.0346359 -0.0164332 +-0.0674529 0.180926 -0.0583799 +-0.0344427 0.15352 -0.00733684 +0.0397392 0.0658643 0.0327972 +-0.0465986 0.120315 -0.0132329 +0.015269 0.034844 0.035887 +-0.0554963 0.0791301 0.0442202 +-0.0342911 0.0473692 0.0421968 +-0.0842876 0.108899 0.00336188 +-0.0262668 0.179961 -0.0169689 +-0.0836964 0.0763445 0.00752427 +-0.0696635 0.159559 -0.0499324 +-0.0661058 0.151041 -0.0375744 +-0.0455019 0.122005 0.0261109 +-0.0890685 0.0969888 0.0194042 +-0.0946116 0.124177 0.0212718 +0.00351301 0.0828608 0.0571024 +-0.0555168 0.154658 0.0152234 +0.00450223 0.0730917 0.0563795 +-0.0125112 0.037888 -0.0164908 +-0.0595378 0.0337212 0.0161226 +-0.0645332 0.120008 0.0489179 +-0.0396568 0.0577566 -0.0113194 +-0.052454 0.13854 0.0254099 +-0.0106577 0.165418 -0.0198106 +-0.0477868 0.0855382 -0.0218048 +-0.07021 0.168534 -0.0249229 +0.0345025 0.0454126 0.0301845 +-0.0261438 0.168232 -0.0181898 +-0.0685956 0.0422314 0.00876662 +0.00130397 0.128647 -0.00252095 +-0.0558871 0.108356 -0.0181276 +-0.0163928 0.0384645 -0.00103951 +-0.0364756 0.0917702 0.0440382 +0.0409317 0.0971197 -0.00479362 +-0.015772 0.160715 -0.00958045 +-0.0428613 0.102811 -0.0212634 +-0.0285136 0.112565 0.0358423 +0.0484971 0.0678077 0.0264809 +-0.0319101 0.121969 -0.00695975 +-0.0200308 0.127492 0.00809368 +-0.0860481 0.114371 0.00228673 +-0.0597203 0.0638916 0.0303834 +0.00627327 0.0682324 -0.0325665 +0.0114155 0.128646 -0.000626619 +-0.0516778 0.140064 0.0213757 +-0.0218071 0.110009 -0.0205036 +-0.0218161 0.0798852 -0.0388524 +-0.02847 0.045966 0.0500228 +0.0429765 0.0987175 0.0181666 +-0.0795395 0.117686 0.0497856 +0.0342026 0.113899 0.000840527 +0.0067112 0.0353739 0.0246266 +0.0402464 0.0618954 -0.00472398 +-0.049455 0.118007 0.0316443 +-0.0442176 0.170815 -0.00391429 +0.00731658 0.0846292 0.0563131 +-0.0542668 0.0504201 -0.00539584 +-0.00648076 0.0969085 -0.030657 +0.0597202 0.067814 0.0181758 +-0.0267919 0.0380272 0.00817341 +-0.0702433 0.163232 -0.0134117 +0.0368364 0.0754262 0.037436 +-0.077497 0.168713 -0.0313178 +0.00996165 0.130854 0.00764162 +0.0133618 0.0523173 -0.0278769 +-0.0337147 0.120592 -0.00951232 +-0.0398766 0.113891 -0.0165093 +-0.089592 0.111931 0.0163329 +-0.0841359 0.0832101 0.027497 +-0.0848856 0.0792043 0.0194951 +-0.0291817 0.0832547 -0.0346104 +0.013224 0.0341678 -0.000459678 +-0.00759782 0.103673 0.0436498 +-0.0514921 0.0804912 0.0440592 +-0.0929632 0.124088 0.0102675 +-0.0586925 0.0677294 -0.0118268 +0.0392263 0.0874331 0.033936 +-0.052704 0.143169 0.0214165 +-0.0286941 0.0380883 0.0293671 +0.0183138 0.0348993 0.0256062 +-0.0644855 0.101502 0.0419335 +-0.0547363 0.159762 -0.000811248 +0.0123244 0.0567269 -0.0296218 +0.0294314 0.0509988 -0.0157519 +0.0386176 0.0874608 0.0348475 +-0.0759101 0.148612 -0.0128604 +0.0152406 0.0723235 -0.0303843 +-0.0475913 0.133999 0.00741747 +-0.0109726 0.115573 -0.0164387 +-0.040716 0.0681271 -0.0158645 +-0.000345107 0.127203 0.0297544 +-0.0856388 0.100529 0.0267624 +0.0372748 0.0576283 0.0326444 +0.0454709 0.0664599 0.0266758 +-0.040383 0.152127 0.00460721 +-0.0503264 0.131112 0.0307063 +-0.061863 0.0953699 -0.0186332 +-0.0356336 0.11996 -0.0108661 +-0.000498349 0.118323 0.0391474 +-0.00744633 0.0386202 0.0260498 +-0.0702648 0.156758 -0.047919 +-0.0607772 0.146055 -0.00361746 +-0.0557733 0.0797194 -0.0205764 +-0.0286229 0.0450027 -0.0280846 +-0.0400285 0.0339876 -0.0295458 +-0.0244818 0.0974513 0.0444604 +-0.0736592 0.0887741 0.0405778 +-0.0626256 0.150596 -0.021578 +-0.0455006 0.117978 0.0306048 +-0.0153159 0.119411 -0.012435 +0.00132313 0.0358703 0.0464707 +-0.0231138 0.0666037 0.0460408 +-0.0487946 0.0869761 -0.0218357 +0.0312031 0.0842875 -0.0196213 +-0.0866673 0.109085 0.0143521 +-0.0716243 0.157487 -0.00225608 +0.0404941 0.0555582 0.0318463 +-0.0624591 0.155071 0.0054624 +-0.043713 0.0695592 -0.0168487 +0.00662363 0.128671 -0.00261559 +0.0292045 0.0356392 0.0180684 +0.0152063 0.0878077 -0.0294658 +0.0560899 0.059136 0.000193317 +0.0162996 0.0623114 -0.0287447 +0.00333411 0.0539266 -0.0303683 +-0.0212016 0.0383732 -7.87452e-05 +-0.0683674 0.147186 -0.0280671 +-0.0614001 0.124084 0.0428232 +-0.0273522 0.0939518 -0.0257303 +-0.0526652 0.0647199 -0.0102 +-0.032486 0.0449059 0.0475402 +-0.0090473 0.168146 -0.0217175 +-0.069891 0.119438 -0.0086356 +-0.0744393 0.114503 0.0509494 +-0.0648928 0.0350374 0.038379 +-0.00019365 0.125094 0.0326823 +-0.039166 0.0355671 -0.0293815 +-0.0258209 0.0692735 0.0430043 +-0.0620187 0.175667 -0.057604 +-0.0903815 0.130904 0.00623191 +-0.00457753 0.11466 -0.0174869 +-0.0733982 0.114573 0.051125 +0.00137655 0.0380516 0.0229424 +-0.0197661 0.0728664 -0.0388949 +-0.0370853 0.162227 -0.0135318 +-0.0166846 0.109701 -0.0201927 +-0.0564987 0.0932477 0.0451284 +-0.086761 0.084678 0.016478 +-0.0201321 0.0568083 0.0475876 +-0.0893331 0.111939 0.012355 +-0.0291964 0.162421 -0.00376774 +-0.0840799 0.143223 0.00416483 +-0.0550692 0.121281 0.0379498 +-0.0258999 0.0382697 0.0279803 +-0.0881372 0.150234 0.0261027 +-0.0189632 0.0385431 -0.0165058 +0.0252198 0.0478964 -0.0186081 +-0.0250024 0.118057 -0.0129436 +-0.0341053 0.162392 -0.00207929 +-0.0455587 0.0461599 -0.0105245 +-0.0673284 0.11863 0.0518333 +-0.0767393 0.157602 -0.0105393 +-0.0460199 0.0377083 0.0451098 +0.00937824 0.0346871 0.0203526 +-0.0232543 0.181611 -0.01087 +-0.0185423 0.0342292 -0.0199208 +0.0094823 0.034855 0.0256576 +-0.00349094 0.060529 0.0547186 +-0.0536823 0.0678463 -0.0129474 +0.0573543 0.0687146 0.022093 +0.0297466 0.036015 0.0196643 +0.0183828 0.0447123 -0.0227438 +-0.00451438 0.1296 0.000561158 +-0.0575172 0.037335 -0.0101901 +-0.0273178 0.113609 -0.0162558 +-0.0127855 0.0392769 0.0369668 +0.0359154 0.0915824 -0.0149202 +-0.0321871 0.0680263 -0.0214501 +0.0373115 0.0673123 0.0362946 +-0.0482709 0.0345995 0.0405757 +-0.0586992 0.142676 -0.00307276 +-0.0720231 0.149543 -0.0391183 +-0.0926193 0.122848 0.0312739 +-0.00649959 0.103045 0.0436802 +-0.0172605 0.128293 0.0149127 +0.0500544 0.0553974 0.0300563 +-0.0459009 0.131661 0.0191601 +-0.0355139 0.176726 -0.00796363 +-0.0132739 0.162396 -0.014817 +-0.0205091 0.112696 0.0389743 +0.0400974 0.0943736 -0.00783899 +0.0445099 0.0945603 0.0161557 +-0.00940844 0.100291 -0.0242411 +-0.0880121 0.147225 0.0305337 +-0.0134729 0.17718 -0.0214028 +0.0289055 0.0408264 0.0297172 +-0.0386238 0.0335154 -0.0250853 +-0.0474847 0.0931518 0.0438057 +0.0385195 0.109282 0.00815775 +-0.0094889 0.119647 0.0372435 +-0.0558334 0.0358523 0.0464479 +0.0391497 0.108397 0.00837586 +-0.0166742 0.0668915 0.0537111 +-0.0514343 0.0647808 0.0348885 +-0.0506054 0.0575708 -0.00965819 +0.0186225 0.0355557 -0.00967449 +-0.0507888 0.0855066 -0.0215873 +-0.0563207 0.0562341 0.00763908 +0.00416104 0.0393786 0.0331643 +0.00410872 0.110162 -0.02034 +-0.0326921 0.152804 -0.00294992 +-0.0105902 0.0385498 0.00372703 +-0.0450772 0.0337168 -0.000691764 +0.00110427 0.111585 -0.0201254 +-0.086661 0.123026 0.0482846 +-0.00349688 0.0633763 0.0563118 +0.0181674 0.0959966 -0.023265 +0.0171824 0.126495 -0.000336309 +0.0349695 0.0577828 0.0363582 +-0.0893883 0.0956403 0.0164184 +-0.0132244 0.172771 -0.0193112 +-0.0115098 0.0702302 0.0553956 +0.0292762 0.0431552 0.0314362 +0.0355897 0.0411906 0.0271165 +-0.0396848 0.0344413 0.0355548 +-0.0488762 0.0335766 0.000473902 +-0.0845392 0.0778023 0.0145171 +-0.0600467 0.0342661 0.0313871 +-0.0484946 0.156406 0.00957752 +-0.0435279 0.0506014 0.0392212 +-0.0581322 0.0624985 0.0284102 +-0.0319273 0.126498 0.0125244 +-0.0692254 0.124258 0.0526584 +0.0346263 0.114673 0.0139267 +-0.0707453 0.113137 0.049314 +0.0440515 0.0722274 0.0248494 +-0.0190238 0.0384735 0.0274147 +0.0318733 0.11664 0.0243218 +-0.00980958 0.166665 -0.0207735 +-0.075878 0.0954761 0.0383509 +0.04237 0.0533961 -0.00679891 +-0.00515103 0.127241 0.0295045 +-0.0386117 0.0406767 0.0425487 +0.0591522 0.0552732 0.011174 +0.0399613 0.0806226 0.0334139 +-0.0892353 0.14446 0.0304266 +-0.0104754 0.127368 -0.00300647 +-0.0635158 0.162004 -0.0583208 +-0.0801984 0.0868229 -0.00856132 +-0.0600399 0.13696 -0.00647222 +-0.0777335 0.153443 0.0307864 +-0.046469 0.119345 0.0289808 +-0.0313084 0.126018 0.00688499 +-0.0190244 0.0385858 -0.00538325 +-0.0698329 0.112058 0.0465849 +-0.0761752 0.110468 0.0448594 +0.0607736 0.0651167 0.0161629 +-0.0738077 0.102191 0.0374953 +-0.0406116 0.0337811 0.00738645 +-0.0152574 0.166467 -0.0199789 +0.0135127 0.0860479 0.0530247 +-0.072308 0.159721 -0.00687103 +0.00549414 0.130728 0.00313392 +-0.00649655 0.0870315 0.0570873 +-0.0353742 0.125928 -0.00196324 +0.00551011 0.0870055 0.0566199 +0.00569172 0.093878 -0.0314287 +0.0453353 0.0533808 -0.00616451 +-0.0788788 0.16526 -0.0309581 +0.0122616 0.0765812 -0.0308581 +-0.0471876 0.131943 0.0231102 +0.0442177 0.0860807 -0.00279659 +-0.0735334 0.165176 -0.017728 +-0.0896904 0.116203 0.0443945 +-0.0887705 0.0969872 0.0214096 +-0.0201887 0.0754016 0.0541402 +0.0203245 0.0636 -0.0272806 +-0.0513256 0.0345659 0.0399502 +-0.0461113 0.034482 0.0324006 +-0.0773794 0.109459 0.0418273 +0.0262228 0.0747294 -0.0245497 +-0.0281178 0.0845911 -0.0356125 +-0.029049 0.0511502 0.0411139 +-0.0685509 0.065132 0.0256966 +-0.0660181 0.127026 0.048508 +-0.0475948 0.0403553 0.044655 +-0.0711998 0.15079 -0.0434624 +0.0346942 0.0401467 0.0260507 +-0.0803051 0.0719229 0.0175051 +0.0266708 0.121701 0.00384182 +-0.0637803 0.118542 0.0465326 +0.0257185 0.0699313 0.0441746 +-0.0865836 0.11378 0.0451954 +-0.0543656 0.153368 0.0199938 +-0.0147843 0.0981951 -0.0260468 +-0.0480746 0.134034 0.00539884 +-0.0172971 0.0386165 -0.00691824 +0.024363 0.0867852 -0.0239669 +0.000502788 0.056275 0.0546165 +0.0460119 0.0750141 0.00420589 +-0.0813458 0.154098 0.0250842 +-0.0504992 0.111154 0.0370407 +0.0480441 0.0725423 0.0171549 +0.0177377 0.0821568 0.0520978 +-0.0634907 0.0833477 0.0441845 +-0.0287709 0.04365 -0.0290051 +0.0412886 0.0858436 -0.00978207 +-0.0434867 0.0959016 0.0426578 +-0.0685902 0.112767 0.0465657 +0.0446015 0.0889424 0.0221651 +0.0387218 0.0993392 0.0297824 +-0.0569101 0.0984236 -0.0203516 +0.0460228 0.0834207 0.0061859 +-0.0608711 0.101136 -0.0186334 +0.0198592 0.123572 0.0284223 +-0.0670185 0.155095 -0.00202392 +0.00194178 0.0353485 0.0200578 +-0.0202225 0.0381837 0.0220241 +0.0372544 0.111046 0.00772111 +-0.0226761 0.0552382 -0.0304344 +-0.0500773 0.15315 -0.00486218 +0.0361622 0.075448 0.0382492 +0.00638813 0.0448624 -0.0253374 +0.0240783 0.123806 0.00430528 +-0.0874625 0.123933 -0.000723767 +0.0191746 0.064523 0.0487473 +-0.0528554 0.116872 0.0339893 +0.0012658 0.0697321 -0.0339789 +0.0363552 0.112269 0.0088181 +-0.0336364 0.0836212 -0.0255231 +0.0394621 0.0820907 0.0342997 +-0.0759857 0.112794 0.0483899 +0.042364 0.0505846 -0.00668018 +-0.0878291 0.0895228 0.0236162 +-0.0717396 0.156144 0.0122972 +-0.0118777 0.107304 -0.0220947 +-0.0518036 0.0898543 -0.0220029 +-0.0605307 0.142151 -0.00455603 +-0.00730388 0.0394625 0.048838 +-0.0695099 0.151355 -0.0447129 +0.0461391 0.0820336 0.0131698 +-0.0680095 0.151244 0.0371953 +-0.0696447 0.155522 0.00577511 +0.0106458 0.0343542 -0.00488721 +-0.0717447 0.165221 -0.0449739 +0.00872274 0.0346011 0.0383625 +-0.0601559 0.0472008 0.00728305 +-0.072526 0.149972 -0.0424686 +-0.0921507 0.129567 0.0102504 +-0.0195451 0.0382679 0.00943 +0.017351 0.0351839 -0.014686 +0.026638 0.0619848 -0.0226053 +-0.0779425 0.0757661 -0.00656744 +0.0456648 0.0834028 0.0181693 +-0.00238392 0.0391586 -0.00815532 +-0.0760947 0.171183 -0.0343205 +-0.037685 0.127343 0.0163262 +0.0200653 0.084847 0.0502217 +-0.0576821 0.0438911 0.0236882 +-0.00181158 0.0365903 0.0109133 +-0.0227414 0.0640418 -0.0345473 +-0.0607804 0.0397294 0.0180031 +0.00451899 0.0966593 -0.0283637 +-0.00904759 0.0994069 0.0493883 +0.036694 0.0368281 0.0111245 +-0.0476151 0.0378648 -0.0125385 +-0.0374934 0.0620193 0.0412021 +-0.0678369 0.0706443 0.0351197 +0.0262359 0.122255 0.0222063 +-0.0258834 0.0347926 0.045205 +-0.0730191 0.0808411 -0.0145801 +0.0272041 0.0968528 0.0430049 +-0.0387216 0.0710357 -0.0169218 +-0.0802983 0.0953773 0.0342868 +-0.0928216 0.122866 0.0342742 +0.0288283 0.120572 0.00606361 +-0.0872644 0.139206 0.0412952 +-0.0528885 0.108408 -0.0187758 +-0.0614742 0.149784 0.0364078 +-0.0888928 0.113895 0.0428033 +0.0133289 0.0681229 -0.0310343 +-0.000536732 0.10034 0.0474846 +0.0582707 0.0579579 0.00417743 +-0.0896629 0.124003 0.00427429 +-0.0333755 0.0483636 -0.0203394 +-0.0335104 0.169764 -0.00293532 +-0.0488446 0.119728 0.0310062 +0.0426741 0.0972641 0.0231497 +-0.0441044 0.0451364 -0.0122986 +-0.059855 0.0594826 0.0200848 +0.0270691 0.0942437 0.0445649 +-0.0896385 0.0969877 0.0134181 +-0.0456599 0.0636306 -0.0135866 +0.0575548 0.053733 0.00618309 +-0.054499 0.0776179 0.0432703 +0.0434163 0.0464179 0.0294988 +-0.0134899 0.0951663 0.0534531 +0.0324423 0.0754774 0.0416539 +-0.0117218 0.0382705 0.0200729 +-0.0308456 0.0396262 0.0517145 +0.0564645 0.0594668 0.0252844 +-0.0475135 0.0491287 0.0385522 +-0.0396908 0.0651397 -0.0142325 +0.0201781 0.0351992 0.0293411 +-0.0219159 0.175693 -0.0142737 +-0.0688718 0.063973 0.0231175 +0.0174279 0.12392 0.0289777 +-0.0699032 0.0687756 0.0310328 +-0.0528961 0.143026 -0.000455911 +-0.0475121 0.0438565 0.0432608 +-0.0275879 0.0384125 -0.00879832 +0.0421339 0.102871 0.00816377 +0.0276939 0.085014 -0.0220629 +-0.0593718 0.0422854 0.0165091 +0.0245725 0.122909 0.0244414 +0.00141552 0.0990584 0.0500955 +-0.0208664 0.103024 -0.023442 +-0.04595 0.0351008 -0.0224117 +0.0425933 0.066459 0.0273252 +-0.085327 0.0926016 -0.00256332 +-0.0496528 0.0345916 0.0385506 +-0.023191 0.178657 -0.0125853 +-0.0179257 0.0971306 -0.0269629 +0.0383787 0.0575308 -0.00558257 +-0.0190955 0.0939751 -0.033709 +-0.0659978 0.135528 -0.00820667 +-0.0379695 0.0348544 -0.0150276 +0.0231948 0.0344554 0.00500709 +-0.0577114 0.148197 0.0324041 +0.0473189 0.0638822 -0.00202275 +-0.091122 0.115466 0.0410527 +-0.0499316 0.141822 0.00385784 +-0.0663647 0.0360087 0.0372253 +-0.0453211 0.0345932 0.035979 +-0.00367712 0.0569332 -0.0329252 +-0.0883137 0.103697 0.0153744 +0.0333218 0.0981688 0.0378146 +0.0206459 0.0429683 -0.0197059 +-0.0718069 0.0887788 0.0415418 +-0.050581 0.0445938 -0.00942218 +-0.0589701 0.121961 -0.00876657 +-0.0786152 0.163841 -0.0309629 +-0.0919702 0.114664 0.0123319 +-0.0387263 0.127561 -0.000266265 +0.0573405 0.0635192 0.0248021 +-0.0778913 0.126656 -0.00702073 +-0.0685283 0.0434892 0.00727271 +-0.0779351 0.161108 -0.0209335 +-0.0892037 0.0956419 0.0194144 +-0.091675 0.147474 0.0191435 +0.00817319 0.0832888 0.0558122 +-0.051142 0.0627417 0.0330975 +0.00546913 0.116627 -0.0176566 +-0.0278605 0.124718 0.0184442 +-0.0689992 0.150311 0.0384044 +-0.0690062 0.162382 -0.0519693 +-0.00661995 0.130084 0.0216557 +0.0403849 0.0533789 -0.00673496 +0.0156377 0.0348863 0.0377268 +0.0577131 0.0523367 0.00917793 +-0.00120988 0.105335 0.044053 +-0.00579434 0.0351694 0.0474261 +0.0411666 0.0833385 0.031438 +-0.0325019 0.0988116 0.0438807 +0.00307304 0.124054 -0.00961404 +-0.0350636 0.0383682 -0.0121121 +-0.073931 0.128192 -0.0084465 +0.015055 0.123588 -0.00721903 +0.0455542 0.0875891 0.00417683 +-0.006733 0.0684593 -0.0359965 +0.00394905 0.100531 -0.0224465 +-0.0399008 0.128531 0.0110866 +-0.0778707 0.177255 -0.0480374 +-0.0310993 0.177108 -0.0141677 +-0.0307989 0.0833965 -0.031578 +0.00828982 0.0846467 0.0559983 +-0.0926147 0.121379 0.00928006 +-0.0309131 0.0848198 -0.0305724 +-0.0610919 0.155915 0.0160896 +0.0269409 0.117743 0.0296345 +-0.029909 0.0904807 -0.0265953 +0.0341142 0.0605859 0.0386759 +0.04958 0.0652138 -0.00133913 +-0.0406916 0.0651596 -0.014333 +-0.0186192 0.0393436 -0.0280481 +-0.0321414 0.16968 -0.0161315 +-0.0303394 0.0344325 -0.0205625 +-0.0749113 0.125246 -0.00804661 +0.0179783 0.035483 -0.0126728 +-0.0572916 0.0479655 -0.00237378 +-0.030388 0.0876244 -0.0295653 +-0.00273996 0.130454 0.0216129 +-0.0785777 0.0907895 -0.0106208 +-0.0237519 0.0683934 -0.0360687 +0.0305158 0.11943 0.00953878 +0.0436886 0.0777182 0.0262206 +-0.00223658 0.0383059 0.0473338 +-0.0174973 0.104415 0.0431217 +0.045327 0.0519476 -0.00589943 +-0.022701 0.0611501 -0.0334866 +-0.0334865 0.126881 0.00753677 +0.0458812 0.084809 0.00618736 +-0.0775185 0.147451 0.0411778 +-0.00849166 0.110041 0.0429425 +-0.00827497 0.0389568 -0.00728452 +-0.0154767 0.0545272 0.0507241 +0.0455115 0.0861913 0.0171661 +-0.0286176 0.124173 0.0196508 +-0.0903937 0.142028 0.0281621 +-0.00750142 0.0590729 0.0550185 +-0.0691508 0.152358 -0.047074 +-0.00484252 0.0384695 0.0194856 +-0.00149467 0.116953 0.0400314 +-0.0148242 0.128616 0.018702 +-0.00749757 0.0939067 0.0556187 +0.031866 0.115189 -0.00211013 +-0.0515259 0.0439564 0.0445165 +-0.0773104 0.159761 -0.0159076 +0.0205013 0.108449 0.0395681 +-0.0648774 0.159303 -0.0143091 +0.0267364 0.0606633 -0.022785 +0.00150878 0.0883997 0.0564367 +-0.0659091 0.06022 0.0163937 +-0.0625921 0.1213 0.0447428 +-0.0789765 0.135392 -0.00472816 +-0.0709567 0.0767623 0.0380194 +-0.0506142 0.0560954 -0.00917258 +-0.0707687 0.155356 -0.0469258 +-0.0675837 0.112197 0.043642 +-0.0159686 0.128428 0.0182857 +-0.0564715 0.132545 0.0359114 +-0.044247 0.157947 0.00609665 +-0.011089 0.038804 -0.005846 +-0.0380666 0.0385186 -0.00730796 +0.0253529 0.0520143 0.0399629 +0.00465347 0.0341223 0.0126365 +-0.0905147 0.136459 0.016202 +-0.0184793 0.0336465 -0.023124 +0.0165026 0.118175 0.0355154 +0.0109305 0.0685438 0.0544088 +-0.00849797 0.0952525 0.0545557 +-0.050269 0.11691 0.032477 +-0.0301947 0.125922 0.0102205 +-0.0914405 0.117414 0.0273008 +-0.0231534 0.0352107 0.0523184 +-0.0922901 0.125582 0.0342578 +-0.0703512 0.170836 -0.0520339 +-0.0881528 0.129472 0.0022725 +-0.0125497 0.0445369 0.0499253 +0.0104221 0.127848 0.0278469 +-0.0114754 0.0546403 0.0519269 +-0.0665146 0.16661 -0.0580261 +-0.0384984 0.169734 0.00180247 +0.0290438 0.0509642 -0.0167532 +0.0292682 0.0673021 0.0422638 +-0.0643695 0.149877 -0.0298747 +-0.0741326 0.180484 -0.0536706 +-0.0484658 0.144752 0.00741107 +0.02369 0.10485 -0.01704 +0.0383652 0.101327 -0.00724085 +-0.0516205 0.0604369 -0.00991236 +-0.0080847 0.125292 0.0313586 +-0.0117515 0.0714338 -0.0381291 +-0.0358096 0.12684 0.0170169 +-0.0620073 0.155313 -0.0175819 +-0.0861256 0.0937891 0.0274526 +-0.0627193 0.152197 -0.01058 +0.0557633 0.0538969 0.024211 +-0.0501537 0.152144 0.0115744 +-0.0504041 0.0345678 0.0349233 +-0.0622094 0.0655019 0.0319825 +-0.0630381 0.154049 0.0314099 +-0.0864944 0.112209 0.0250023 +-0.0765838 0.178662 -0.0494737 +-0.0880478 0.0908955 0.0237752 +-0.0540202 0.0513732 0.0109294 +0.0220807 0.125732 0.0192313 +0.000503516 0.0856702 0.0573793 +-0.0624013 0.116928 0.041368 +-0.0687693 0.0793684 -0.0165822 +0.0312024 0.114939 -0.00384217 +0.0394926 0.052754 0.032086 +-0.076502 0.12459 0.0526576 +0.0461265 0.0736153 0.00421619 +0.0493794 0.0453908 0.0224152 +0.0422961 0.0655994 0.0276352 +0.0444235 0.0917457 0.0211574 +-0.04812 0.128214 0.028687 +-0.0256026 0.0837946 0.0522209 +-0.00959872 0.0391743 -0.0260833 +0.0242446 0.0762105 -0.0254816 +-0.050147 0.145259 -0.000515581 +-0.0729617 0.136954 -0.00717713 +-0.0321019 0.119786 0.0288381 +-0.0723819 0.152607 -0.0408904 +0.0595077 0.0567056 0.0171693 +-0.0647247 0.16489 -0.0257757 +0.0214018 0.0473917 -0.0206345 +-0.0652965 0.147932 -0.0271042 +0.0404164 0.0647148 -0.00677085 +-0.0440757 0.0335994 -0.0169421 +-0.0658186 0.154852 0.00425231 +-0.0457713 0.156483 0.00739285 +-0.0550494 0.0577849 0.0202145 +-0.0233757 0.163881 -0.00766181 +-0.0658954 0.166616 -0.0590008 +0.0309109 0.0511672 -0.0117352 +0.0380176 0.101228 -0.00786632 +0.0272437 0.0732614 -0.0238068 +-0.0161865 0.0377383 0.0516902 +-0.051271 0.0356477 0.0458842 +-0.0184884 0.107161 0.042158 +0.0143121 0.0753991 0.0540935 +0.012486 0.0990688 0.0481132 +-0.069936 0.13258 -0.0084535 +-0.0324718 0.0546382 0.0373194 +-0.0637186 0.179242 -0.0585917 +-0.0560047 0.159776 0.00109778 +-0.0940215 0.120122 0.0233001 +-0.0734929 0.154069 -0.0299022 +0.0334431 0.0930091 -0.0164312 +-0.0568079 0.0869026 -0.0213473 +0.0600207 0.0595165 0.0181686 +-0.0282716 0.0376885 0.0226211 +-0.0608814 0.102587 -0.0185388 +-0.0689777 0.172299 -0.0388012 +-0.0333033 0.176609 -0.00426163 +-0.0726003 0.145757 -0.0168539 +-0.0351155 0.0460859 0.0430647 +-0.0668221 0.16563 -0.0222317 +0.0223344 0.0535713 -0.0254238 +-0.0555068 0.0341015 0.0254741 +0.0591828 0.0594427 0.0211715 +-0.076476 0.07597 0.0322323 +-0.0548438 0.043635 0.0177242 +-0.0545598 0.0616597 -0.0074577 +-0.0717138 0.073474 0.0353741 +-0.0123858 0.0383448 0.0108168 +-0.0878417 0.140531 0.0102059 +-0.0338438 0.0337316 0.012415 +-0.0362549 0.153841 -0.0082413 +-0.066147 0.0353356 0.0361254 +-0.0149468 0.125073 -0.0044168 +-0.0517378 0.0545135 0.0226244 +-0.0791517 0.0792478 0.0324066 +-0.0311673 0.0386498 -0.0134468 +-0.00138514 0.0391216 -0.00791905 +0.0249209 0.0782259 0.0483953 +-0.0288805 0.079237 0.0443379 +-0.0499299 0.0335056 -0.0106454 +0.000248169 0.0726618 -0.0353693 +-0.00679601 0.100851 0.0456503 +0.00749727 0.121002 0.0360768 +0.0281364 0.0448054 0.035097 +-0.0616338 0.0739295 0.0406212 +-0.0184922 0.11816 0.035496 +-0.0231843 0.0348489 0.0439808 +0.0524989 0.0718135 0.00595977 +-0.0114982 0.0943996 -0.0340943 +-0.0574587 0.045976 0.042703 +0.0272754 0.0703879 -0.0233186 +-0.0208041 0.127131 0.0063587 +-0.0449931 0.152736 -0.00651735 +-0.0154877 0.167822 -0.0210841 +-0.0738833 0.122317 -0.0079807 +0.0163998 0.0834424 0.0519345 +-0.0615988 0.156867 -0.0225865 +-0.0504372 0.0529682 0.0186225 +-0.0607622 0.0781498 -0.0187637 +-0.0208042 0.125974 0.0209606 +-0.0245306 0.112636 0.0373469 +-0.030708 0.121227 -0.00820323 +-0.0511359 0.0502476 0.0206335 +-0.0384993 0.0733372 0.0420402 +-0.0588719 0.102608 -0.018764 +-0.0774969 0.130279 0.0531227 +-0.0375712 0.124334 -0.00748059 +-0.0119956 0.0882297 -0.0377812 +0.0547499 0.0492946 0.00521444 +0.017211 0.088423 -0.0276786 +0.0381646 0.0644978 -0.0107883 +-0.04783 0.0927226 -0.0216222 +-0.0132756 0.0597275 0.0533794 +-0.00158335 0.0361983 -0.0246741 +-0.0612049 0.174131 -0.0607222 +-0.0655175 0.0356165 -0.00754656 +-0.0874441 0.0860134 0.00347726 +-0.00749507 0.10164 0.0441128 +-0.0175041 0.0382782 0.00983265 +0.00351386 0.100332 0.0462561 +0.0252498 0.0645397 -0.0230446 +-0.0717344 0.131221 0.0507858 +0.0525721 0.0648669 -0.000960413 +-0.0901978 0.11358 0.0212183 +-0.0560194 0.129616 -0.00591188 +0.0441279 0.0748554 -0.00179683 +-0.0307721 0.0349136 0.04922 +-0.0554801 0.0452738 0.0437595 +0.000511374 0.0503823 0.0524384 +0.0295573 0.0375392 0.0237122 +-0.00766545 0.0541253 -0.0331554 +-0.0226026 0.0379508 -0.0287016 +-0.0187506 0.162746 -0.0157051 +0.0546767 0.0732977 0.0167178 +0.042064 0.10006 0.0201605 +-0.0889838 0.099691 0.0193911 +-0.0644638 0.129733 0.0437115 +-0.043484 0.0987241 0.0424341 +-0.0252565 0.120536 -0.00953586 +-0.0159529 0.0390542 0.0365141 +-0.0915486 0.143335 0.0161726 +-0.0405267 0.169768 0.0017705 +-0.0726712 0.0651053 0.0195713 +-0.0132255 0.182074 -0.023933 +-0.0456018 0.0629458 0.0388902 +0.0287985 0.0385521 0.0262584 +0.0314095 0.0695437 -0.0187779 +-0.0625738 0.156865 -0.0165766 +0.0106756 0.0489592 0.0485841 +-0.0781956 0.163891 -0.0259488 +0.0262919 0.101687 -0.017683 +-0.0681573 0.180556 -0.0543707 +-0.0464942 0.100125 0.0422537 +-0.0294775 0.17726 -0.00505881 +0.00976325 0.0346476 0.0385339 +0.0351088 0.100136 -0.012024 +0.0398312 0.0992984 0.027798 +-0.0544975 0.080589 0.0448325 +-0.0251898 0.177123 -0.0193397 +-0.00463984 0.12746 -0.00519523 +0.0365694 0.109049 0.0260841 +-0.062967 0.159919 -0.044604 +0.0156331 0.0915267 -0.0269033 +-0.0577811 0.0472143 0.0403119 +-0.086179 0.107645 0.0083646 +-0.00357674 0.0347286 -0.0239915 +-0.0205507 0.066817 0.0505282 +-0.0590047 0.132542 0.0375172 +0.00657766 0.034511 0.0217547 +-0.0730595 0.110042 0.0423406 +-0.0725117 0.163674 -0.014076 +-0.0130193 0.115677 -0.016537 +0.0190348 0.0768352 0.0521916 +0.00221518 0.114462 -0.0193126 +-0.0142885 0.0390252 0.0350884 +-0.0492809 0.152135 0.0110836 +0.0378754 0.0980648 0.0320906 +-0.0377624 0.0420706 0.0430123 +0.00890997 0.125517 0.0316176 +0.00478616 0.0342999 0.00145343 +-0.0220536 0.0952953 -0.0290683 +-0.0883767 0.125344 0.00127971 +-0.055499 0.0761852 0.0427309 +-0.0505039 0.0487703 0.0186583 +0.0374548 0.0781001 0.0366194 +0.00520505 0.129939 3.61829e-05 +-0.0464525 0.146291 0.00643191 +-0.0545162 0.049049 -0.0054035 +-0.0209524 0.0920017 0.0529687 +-0.0534945 0.105667 0.0403502 +-0.0355002 0.174151 -0.00180627 +-0.0654804 0.146553 -0.0219125 +-0.0577458 0.131139 0.0375772 +0.0440584 0.0860884 0.0251529 +0.0484396 0.0486951 -0.00266239 +-0.0510317 0.0544187 0.0196187 +-0.0305049 0.0720397 -0.0305133 +-0.0513349 0.057067 0.0306313 +-0.0444577 0.123407 -0.0104693 +-0.0404418 0.0351129 -0.0289386 +-0.0611441 0.169381 -0.0576009 +-0.0704838 0.120388 0.0533274 +0.00150053 0.0591133 0.0550768 +-0.0504978 0.159322 0.00851944 +-0.0127755 0.126776 0.0267341 +0.00508634 0.0345614 -0.0155701 +-0.0433649 0.150829 -0.00565896 +-0.0276025 0.0888516 -0.0335952 +-0.0536948 0.0661603 -0.0107375 +0.0453129 0.0698237 0.023466 +-0.0407211 0.150643 0.00408479 +0.0111265 0.120476 0.0355761 +0.000791005 0.0398223 0.046536 +0.0460187 0.0482649 0.029417 +-0.0748889 0.119375 -0.00765967 +0.0240318 0.0591603 0.0451764 +0.0102193 0.129407 0.000604352 +-0.0662744 0.179701 -0.0600508 +-0.0165098 0.0772307 0.0561424 +0.0294369 0.0781918 0.0443709 +-0.0510278 0.0474301 0.0166894 +-0.0808293 0.0720933 0.0155437 +0.0139163 0.0953242 -0.0249235 +-0.0756827 0.0823892 -0.0125945 +0.00119778 0.0825383 -0.0355009 +-0.0614832 0.0775692 0.0421583 +-0.0816839 0.0830971 0.0318157 +-0.0257584 0.0736396 0.0456283 +0.0071927 0.124822 -0.00847934 +-0.0749667 0.0683767 0.0215337 +-0.0415307 0.127763 -0.00103989 +0.0217652 0.0862022 0.0491664 +-0.0758742 0.102063 -0.0106997 +0.00933423 0.0567711 -0.0303022 +-0.010684 0.0584354 -0.034314 +-0.0126507 0.0350556 0.0425263 +0.0424994 0.0597124 0.0306347 +-0.0147222 0.0643235 -0.037347 +0.0579415 0.0716454 0.0119821 +-0.000418875 0.0389219 -0.0131688 +-0.0480228 0.144604 0.00545108 +-0.0124881 0.120998 0.0354929 +-0.0941295 0.121483 0.024294 +0.0533093 0.0573451 -0.00263239 +-0.0426699 0.0336999 -0.0149012 +-0.0466248 0.0577591 -0.0115398 +-0.0628785 0.0393963 0.0426563 +-0.072166 0.063706 0.0120556 +-0.0912059 0.14882 0.0151457 +-0.033491 0.0904012 0.0444067 +0.0152459 0.0821521 -0.0296185 +-0.0608506 0.0333964 -0.00541551 +0.0483298 0.0694277 0.0246416 +-0.0144087 0.0383376 0.0158464 +-0.00316996 0.131012 0.0171239 +0.0247594 0.0929114 0.046503 +-0.0615203 0.153356 0.00130737 +-0.0618578 0.099667 -0.0183374 +0.0303629 0.0483136 -0.00765132 +0.00253507 0.0394917 0.0345311 +-0.0713444 0.144531 -0.0156116 +-0.0188175 0.159674 -0.00630165 +-0.0174928 0.111329 0.0404434 +-0.0425002 0.0437706 0.0420539 +0.038489 0.0484512 0.0319961 +-0.011814 0.163592 -0.0157611 +-0.0526941 0.0334208 -0.00928256 +-0.0613494 0.131082 0.0393909 +-0.0276253 0.0450182 -0.0280952 +-0.0449077 0.159414 0.00690868 +0.00747686 0.0474111 0.0493962 +-0.0535025 0.0917839 0.0444757 +0.0372578 0.0658262 -0.0127785 +-0.0616099 0.158421 -0.0325909 +-0.0443417 0.035118 -0.0243716 +0.0228959 0.0358901 0.0147404 +-0.0312846 0.119331 0.0291556 +-0.0748251 0.0906869 -0.0145799 +-0.0607901 0.0839118 -0.0197808 +-0.060035 0.0645406 0.0315175 +-0.0506187 0.0531538 -0.00831388 +0.0189959 0.104672 0.0434338 +-0.0328687 0.10291 -0.0220775 +0.0293781 0.0721886 -0.0217847 +0.0490097 0.0482239 0.0267018 +-0.00202044 0.0386496 0.0235231 +0.00793635 0.0980328 -0.0238123 +-0.0353308 0.0347033 0.016646 +0.00129902 0.039118 0.0292011 +0.0433693 0.0561672 -0.00598915 +0.0455002 0.059749 0.0314265 +-0.0891212 0.0888935 0.0154552 +-0.00853579 0.044404 0.0484956 +0.0227707 0.10612 -0.0163977 +-0.0830074 0.117688 0.0489709 +-0.0652397 0.150467 -0.0337229 +-0.0787271 0.0954037 0.0355432 +0.0320582 0.11345 0.0286813 +-0.0641355 0.160881 -0.0576174 +0.0459242 0.0806108 0.00418728 +0.0093871 0.0434015 -0.0246765 +-0.0501776 0.124028 0.032677 +-0.0486159 0.0547593 -0.0100622 +0.000494108 0.118289 0.0391022 +-0.0267825 0.0768545 -0.0363352 +0.039504 0.0914002 0.0327084 +0.0495572 0.0525985 0.0293193 +-0.0221892 0.177131 -0.0213718 +0.00724524 0.0369774 0.0269173 +0.0174748 0.0934539 0.0481542 +-0.021119 0.180019 -0.0220004 +-0.0938873 0.12827 0.0192438 +-0.0558806 0.138039 -0.00386657 +-0.0754975 0.123189 0.0531282 +-0.0682563 0.169911 -0.0313673 +0.00486454 0.131282 0.0057704 +-0.0544491 0.156028 0.0112408 +0.0259161 0.0713197 0.0444841 +-0.0205993 0.0408181 -0.0286892 +0.0326751 0.0902947 0.0421046 +0.0303546 0.107428 0.0353018 +-0.043641 0.0451148 -0.0133235 +0.0453399 0.0504735 -0.00539794 +-0.0640884 0.160897 -0.0576117 +-0.015926 0.178652 -0.0196554 +0.0285634 0.0463012 0.0357516 +-0.00467538 0.0353718 0.0474871 +0.00649755 0.131366 0.0177838 +-0.0721007 0.175064 -0.0530188 +-0.0454824 0.0959409 0.0431744 +-0.0892808 0.0888643 0.0124572 +0.00219675 0.0376886 0.0234384 +-0.0084105 0.095275 -0.0329664 +-0.0384962 0.11803 0.0312871 +-0.0451864 0.146266 0.00463419 +-0.0870838 0.0846865 0.0114769 +-0.0855325 0.107606 0.0053458 +-0.0457969 0.126831 -0.00605616 +-0.0164306 0.0384009 0.00449856 +-0.0355073 0.0662414 0.0411418 +0.0174851 0.0852069 0.0507856 +0.0160687 0.122524 -0.00804645 +-0.0586545 0.152137 0.0330321 +-0.0294308 0.0847062 -0.0336139 +-0.0725432 0.15415 0.0310449 +0.0567814 0.0724634 0.0130365 +0.0378457 0.0726607 0.0353699 +0.00540963 0.0375924 -0.0240752 +-0.0555707 0.033544 0.017104 +0.0295902 0.119982 0.0063504 +0.0197767 0.104476 -0.0186365 +-0.0484985 0.160789 0.00748776 +-0.0928176 0.120043 0.0102955 +-0.0427809 0.0464775 -0.012357 +-0.0285046 0.0645461 0.0380462 +0.00349921 0.126284 0.0311054 +-0.0670064 0.156281 0.0226936 +-0.0656496 0.0339611 -0.00733584 +-0.00649844 0.0814993 0.0573243 +0.0421622 0.0427592 0.0252421 +-0.0873651 0.0927561 0.00443631 +-0.00151033 0.108645 0.043169 +-0.0908157 0.116185 0.0427025 +0.0200734 0.0372985 0.0402199 +-0.062954 0.125297 -0.00870732 +-0.0633546 0.0720236 0.0383997 +-0.0691914 0.171601 -0.0360136 +-0.0688255 0.0937312 -0.0163709 +-0.0485029 0.112572 0.035725 +-0.00574267 0.0339825 -0.0190499 +-0.0604857 0.094604 0.0446906 +-0.0257335 0.166803 -0.00931015 +-0.0159771 0.186924 -0.0221541 +0.0463322 0.0743214 0.0180018 +0.0030519 0.130996 0.00365966 +-0.0421665 0.16366 -0.0107342 +-0.0225871 0.168294 -0.0117855 +-0.0484917 0.0718083 0.0405326 +0.0122698 0.0710113 -0.031719 +-0.0857101 0.0869161 0.0258492 +-0.0715046 0.0901731 0.0417302 +-0.0699133 0.123828 -0.00875488 +0.0279019 0.110786 -0.0114065 +-0.0354864 0.12379 0.0245568 +0.0305321 0.081181 -0.0200863 +0.0102651 0.128706 0.0263309 +0.0148603 0.0562539 0.0494599 +-0.0366932 0.0665933 -0.0149481 +0.041469 0.0711384 0.0300167 +-0.0554857 0.0834027 0.0450839 +-0.0113051 0.0389162 -0.0134542 +-0.0701665 0.143936 0.0443089 +0.0424986 0.0527982 0.0326152 +0.0132 0.115178 -0.01612 +-0.0566151 0.0335713 0.0115144 +-0.0746759 0.158036 -0.00628607 +-0.0710897 0.0678996 0.0280309 +-0.0684162 0.160948 -0.0539628 +-0.0788405 0.11444 0.0481937 +0.0425653 0.0859482 -0.00679004 +0.00508264 0.128731 0.0273249 +-0.0460392 0.132757 0.0146796 +-0.0644245 0.0335892 0.00631261 +-0.0779562 0.0727271 0.0259414 +-0.0320811 0.1577 -0.0118106 +-0.08561 0.123026 0.0486561 +-0.0183468 0.0445922 0.0521871 +-0.0646788 0.0378404 0.0247428 +-0.09254 0.118824 0.0413658 +0.0439353 0.0973509 0.0141605 +-0.0925657 0.116008 0.0123183 +-0.00476329 0.0770151 -0.03731 +-0.0647922 0.176686 -0.0531637 +-0.0267774 0.122204 0.0247423 +-0.0331437 0.169673 -0.0156322 +-0.0663865 0.0388997 0.0348294 +0.0255945 0.0477251 0.0385093 +0.0336609 0.0968599 0.0382997 +-0.0916539 0.147467 0.0181472 +-0.0336992 0.0435791 0.0473765 +-0.0785063 0.162438 -0.0279579 +-0.0756712 0.0759423 -0.00884701 +-0.0623186 0.155306 -0.0155862 +-0.0754942 0.124603 0.052984 +-0.0710841 0.0626658 0.0113319 +-0.0214966 0.101664 0.0441706 +0.0325091 0.0454335 0.0302933 +0.023348 0.0930459 -0.0224955 +-0.0477168 0.123954 0.0291105 +0.026559 0.119879 -0.0019388 +-0.0671262 0.150692 -0.0396095 +-0.054551 0.0416447 -0.00949548 +-0.0689 0.115705 0.0512836 +0.0420833 0.0409609 0.00227771 +0.021477 0.0961774 0.0469631 +-0.0517663 0.0812234 -0.0211522 +0.0324154 0.0541402 -0.0117355 +-0.0283184 0.0383801 -0.00152859 +-0.0454995 0.122409 -0.0114255 +-0.0786209 0.174303 -0.0444916 +-0.0570614 0.151623 -0.00120922 +0.0242791 0.118022 0.0317589 +-0.0639993 0.0370815 0.0170442 +-0.0395018 0.0733502 0.0421461 +-0.0174724 0.0388154 -0.0145918 +-0.0829949 0.115554 0.048125 +-0.0155328 0.0386551 0.0297691 +-0.00449743 0.110031 0.0429169 +-0.062341 0.164692 -0.0435908 +-0.016985 0.0384848 0.0278228 +0.0153998 0.109294 -0.0177665 +-0.0121134 0.0347053 0.046472 +0.0238752 0.0421864 0.0394869 +-0.0510476 0.139892 0.00172061 +-0.073661 0.147179 -0.0178577 +-0.0673436 0.155169 0.0284164 +-0.0375089 0.0790164 0.0426336 +-0.0881282 0.0888644 0.0224361 +-0.0165385 0.0459978 0.0505746 +0.0187298 0.0489829 0.0426596 +0.00514365 0.0400743 0.045751 +-0.0405081 0.080404 0.0427771 +-0.0559081 0.112628 -0.0165116 +-0.0414824 0.100082 0.0415393 +0.0326734 0.101648 -0.0136311 +0.0591059 0.0677548 0.00712748 +-0.00525238 0.0350087 0.0405181 +0.0272291 0.0788716 -0.0231926 +0.0526679 0.0554283 0.0285725 +-0.074839 0.15964 -0.0289433 +-0.0475589 0.0335011 0.00261705 +0.0224079 0.0809035 0.0500644 +-0.0774544 0.072993 0.0275707 +-0.0817516 0.140386 -0.000790241 +-0.0203273 0.127615 0.0123404 +-0.0570931 0.0535244 0.00162534 +-0.0775213 0.124569 0.0523637 +-0.0267733 0.15662 -0.0020223 +-0.0341168 0.0383136 -0.000825234 +-0.0926373 0.122856 0.0322729 +0.00549857 0.09243 0.054294 +0.0202616 0.0749268 -0.0272874 +0.0133552 0.13008 0.0103074 +0.0423653 0.0519948 -0.00681796 +-0.0627003 0.150649 -0.00857321 +0.0200754 0.0713524 0.0501382 +-0.0182235 0.123174 0.0292543 +-0.0130686 0.183424 -0.0252779 +-0.0128628 0.0896836 -0.0372956 +-0.0301706 0.0421547 -0.0296993 +0.0403707 0.0444834 -0.00362771 +-0.0253772 0.0722169 0.0453002 +-0.0241328 0.0565311 0.0416958 +-0.0657729 0.0378142 0.038507 +-0.0475733 0.0504004 -0.00924022 +0.0347756 0.0548514 0.0342768 +-0.01273 0.098974 -0.0248693 +-0.0749897 0.139866 -0.00647617 +0.0541381 0.0477755 0.0182012 +0.026052 0.121668 0.00219807 +-0.0178133 0.0827451 -0.0392154 +-0.00506384 0.129812 0.0236663 +-0.0022335 0.116052 -0.016996 +0.0194826 0.0892535 0.0485994 +-0.00549695 0.108658 0.0435455 +0.0411799 0.0844321 -0.00979241 +-0.0546525 0.154186 0.0155249 +0.0209039 0.0386887 -0.00868617 +-0.0522987 0.0504261 0.0316576 +-0.00860205 0.0406149 -0.0260948 +-0.0064872 0.119657 0.0377321 +-0.0794636 0.141716 -0.00376694 +-0.0494618 0.0347575 0.043629 +-0.0282938 0.176171 -0.0172378 +-0.0337476 0.119587 0.029726 +-0.0548148 0.0883935 -0.0220325 +-0.0759162 0.179384 -0.0516058 +-0.0444968 0.0747696 0.0424527 +0.0361181 0.111694 0.0216233 +-0.0677747 0.0370061 0.0137537 +-0.0497774 0.0826759 -0.0213753 +0.0238372 0.12269 -3.58731e-05 +-0.0478227 0.148347 -0.00331487 +-0.00860618 0.0968801 -0.0306409 +-0.0545965 0.0575496 0.0196126 +-0.06512 0.0430832 -0.00329452 +-0.0719312 0.128266 -0.00893149 +-0.0409612 0.0344092 -0.00782476 +0.0534457 0.0510274 0.0243391 +0.0276856 0.0494518 -0.0176966 +-0.0336693 0.0607336 -0.0127906 +-0.0284587 0.0446173 0.0507119 +-0.0255118 0.0936195 -0.0293755 +-0.0717668 0.172238 -0.0510285 +-0.047089 0.156143 -0.00736831 +-0.0756553 0.0837701 -0.0135751 +-0.013224 0.172718 -0.0260103 +-0.0301691 0.174141 -0.0165339 +-0.00226303 0.0382357 0.0184109 +0.0412731 0.0417215 0.0241695 +-0.0559192 0.0335546 0.0152404 +0.0277966 0.12141 0.0199376 +-0.0649916 0.0659907 0.0309635 +-0.0512719 0.127504 -0.00467957 +0.0313718 0.118521 0.0155758 +-0.0621134 0.0350003 0.0423988 +0.00602626 0.127371 -0.00517179 +-0.0500909 0.0358963 0.0459805 +-0.0852266 0.0854944 0.0253873 +-0.0209874 0.04034 0.0536055 +-0.0719403 0.179282 -0.0559874 +-0.0521219 0.120842 -0.0117106 +0.0579437 0.0700837 0.0193768 +-0.0786649 0.0764169 0.0296559 +-0.0724896 0.12743 0.0524304 +0.0400371 0.107017 0.0091647 +-0.0677955 0.0355805 0.0137906 +-0.0212083 0.0825271 0.0563448 +0.0305816 0.112813 -0.00758269 +0.0546919 0.0524816 0.0244106 +0.000503407 0.0647904 0.0566018 +-0.0211614 0.183089 -0.0130948 +-0.0364897 0.0648519 0.0414613 +0.00739557 0.0347435 -0.0216037 +-0.091466 0.14613 0.0241501 +-0.0496442 0.0620141 -0.0117058 +-0.0844141 0.083121 -0.000497419 +0.00924009 0.0846665 0.0556174 +-0.00137013 0.0367929 0.00718583 +0.0499211 0.0443554 0.0178724 +-0.0257693 0.158564 -0.0117505 +-0.08951 0.140665 0.0311774 +0.0074706 0.129229 -0.00123166 +0.0318377 0.0822312 0.0425933 +0.0347555 0.0768972 -0.0157225 +-0.0103619 0.179472 -0.0295714 +0.0350602 0.0968439 0.0368099 +0.0192972 0.063662 -0.0278633 +-0.0758841 0.106327 -0.00893896 +0.0225495 0.119713 -0.00701355 +0.0522449 0.0480372 0.0225432 +-0.0142613 0.0350279 0.0492532 +0.0588535 0.0566417 0.00718098 +-0.0834209 0.0911774 0.0304851 +-0.0354827 0.0945899 0.0441989 +0.0491837 0.0442045 0.019604 +-0.0441515 0.0335185 0.00510187 +-0.0605024 0.111127 0.0368734 +-0.0368482 0.0336146 -0.0266993 +0.0043237 0.131753 0.0112849 +-0.0519904 0.135575 0.0286552 +-0.0628904 0.102548 -0.0180123 +-0.0194395 0.062521 0.0495605 +0.0173831 0.0447578 -0.0232543 +-0.0925995 0.118805 0.0322947 +0.00218481 0.0838969 -0.0348518 +0.0331279 0.0428909 0.0287274 +-0.0528013 0.0884055 -0.0219839 +0.0151848 0.115917 -0.0149184 +0.0567976 0.0508328 0.0181941 +-0.0621222 0.0345142 0.0394173 +-0.0642021 0.071089 0.0372614 +-0.0701839 0.0658802 0.0247105 +0.0178908 0.0563588 0.0485803 +0.0392199 0.073038 -0.0108301 +0.0263921 0.0549677 -0.020802 +-0.0858835 0.0833066 0.0204824 +-0.0812999 0.0747823 0.0185535 +0.0025057 0.0688921 0.0558596 +-0.0804035 0.0745659 0.0220984 +-0.0604943 0.0804378 0.0430854 +0.0220864 0.122759 -0.00230579 +0.0416849 0.100037 0.02216 +-0.0387577 0.150948 -0.00516845 +0.0420841 0.090131 -0.00780186 +0.0270265 0.12251 0.0139387 +-0.0715501 0.0763344 0.0374538 +-0.0885696 0.137819 0.0397738 +0.00156461 0.124373 0.0333352 +-0.00526883 0.0355403 -0.0166416 +-0.0769711 0.133968 -0.00621304 +-0.0750334 0.0851031 -0.01456 +-0.00549741 0.0675328 0.0561955 +0.00134414 0.0524973 -0.030237 +-0.0573916 0.0718042 0.0398933 +0.0283911 0.0672932 0.0427559 +-0.0910025 0.133774 0.0232232 +-0.0354998 0.17123 0.000174393 +0.0458285 0.0801218 0.0204223 +-0.0574741 0.0819362 0.0441691 +0.0510603 0.0729911 0.0094016 +-0.0363492 0.0338444 -0.0305686 +-0.024023 0.17718 -0.0120308 +-0.0625429 0.143922 0.0377415 +0.0323895 0.0490788 -0.00667281 +0.00525838 0.123196 -0.010701 +-0.0294162 0.0890096 -0.030595 +0.0479414 0.0588591 -0.00500215 +0.0158474 0.128954 0.00837281 +0.0170299 0.0590745 0.0491032 +0.0534095 0.0553934 0.0278769 +-0.0600285 0.134031 -0.00683616 +-0.0595027 0.0876292 0.04502 +-0.0323351 0.172733 -0.00297212 +-0.0374903 0.172653 -0.000576721 +0.00749482 0.0546914 0.0525351 +0.0383894 0.0519545 -0.00670373 +-0.0331162 0.0436399 0.0481995 +0.0444193 0.0734774 0.000193217 +-0.0392699 0.127033 -0.00231305 +-0.0377966 0.0870844 -0.0227292 +0.0398005 0.0712586 0.0329247 +0.0227875 0.0348957 0.00078699 +-0.0825515 0.0748682 0.00752949 +-0.0162407 0.125507 -0.00287714 +-0.0654856 0.0398574 0.0313799 +-0.0623389 0.163139 -0.0325913 +-0.0686122 0.0432054 0.00454593 +-0.0379623 0.174733 -0.00453553 +-0.0563002 0.154681 0.0207165 +-0.0455391 0.0396225 -0.0172907 +0.033177 0.0592197 0.0390624 +-0.030845 0.0944191 -0.0240931 +0.0149304 0.0913967 0.05159 +-0.0283564 0.125587 0.00796681 +-0.0364861 0.0547872 0.0389196 +-0.0284285 0.0821494 0.0466355 +-0.0626767 0.0346583 0.0408688 +0.0226817 0.0618915 0.0467691 +-0.00273397 0.0346073 0.0449802 +-0.0747362 0.0663817 0.0145125 +-0.0135041 0.11966 0.0364252 +-0.0466771 0.0355018 -0.0172702 +-0.0711048 0.153963 -0.0459144 +-0.0910141 0.11449 0.034742 +-0.0801763 0.0854684 -0.0085384 +-0.0199842 0.183117 -0.0149159 +-0.0705018 0.155741 0.00837641 +-0.0229946 0.0381678 0.00700416 +-0.0428236 0.0913841 -0.0227682 +-0.0679787 0.154919 -0.0513588 +-0.0787367 0.168047 -0.0389551 +-0.0308479 0.0972408 -0.0233409 +-0.0127769 0.0784711 -0.0383296 +-0.0528408 0.0970645 -0.0221327 +0.0578361 0.0662412 0.00314493 +0.0132266 0.0822053 -0.0304726 +-0.058487 0.113928 0.0361856 +-0.0609416 0.0341022 0.0225725 +0.0498583 0.0540108 0.0297623 +-0.00985903 0.128582 0.0248602 +0.0180859 0.068641 0.0507282 +-0.0275932 0.0779206 0.0459339 +-0.0474983 0.11254 0.0358059 +-0.00306313 0.0346488 0.0430839 +-0.0494839 0.141682 0.00839735 +-0.0444006 0.0337168 -0.00238543 +0.0222885 0.0564166 0.0461469 +0.00464996 0.0378242 0.0256263 +0.00823548 0.113838 -0.0186606 +-0.0404969 0.0634536 0.0414219 +0.0464934 0.0638096 0.0291729 +-0.0275092 0.181505 -0.00874152 +-0.0850366 0.134888 0.000298852 +-0.053967 0.0687802 0.0379578 +0.0458863 0.0820184 0.0171704 +-0.0630174 0.113067 -0.0134471 +0.0163641 0.0348027 -0.00791773 +-0.0668226 0.0923514 -0.017257 +-0.073517 0.104058 0.0373151 +-0.0520334 0.0346252 0.0362685 +0.00147793 0.131501 0.00880182 +-0.0874177 0.131128 0.0459004 +-0.0124954 0.103038 0.0437348 +-0.0148129 0.0841518 -0.0390669 +-0.061937 0.111099 -0.0150221 +0.0286115 0.078186 0.0449305 +-0.0884601 0.0976543 0.0226015 +-0.0196643 0.111086 -0.0196461 +-0.0196772 0.178663 -0.0162873 +-0.0220478 0.0811409 0.0558034 +0.00850296 0.118331 -0.0155001 +-0.0404972 0.0506061 0.0393715 +-0.0833705 0.0767799 0.0142875 +-0.085765 0.112351 0.0286477 +0.0363022 0.0619082 0.0365841 +-0.000508059 0.0576316 0.0544767 +-0.089275 0.0969971 0.0184044 +-0.0708142 0.0694524 -0.00574088 +-0.0186131 0.0378854 -0.0277917 +0.0283679 0.103615 -0.0157324 +-0.0354292 0.0472715 0.0405203 +-0.0748611 0.163212 -0.0154286 +-0.0862421 0.14327 0.00816028 +0.0357067 0.0981492 -0.0118335 +0.0223181 0.0592817 -0.0260832 +-0.0625553 0.041701 -0.00649092 +-0.0824187 0.100645 0.0306028 +-0.0598691 0.101152 -0.0187591 +-0.0309758 0.0383278 -0.0168292 +0.0239145 0.0835849 0.0487444 +-0.00271812 0.0380275 0.0166967 +-0.00631097 0.0354995 -0.0168068 +-0.0435801 0.0491173 -0.010788 +-0.0586891 0.065984 -0.0090861 +-0.072851 0.148958 0.0401319 +0.0442902 0.0875035 0.0241471 +-0.0155441 0.165408 -0.0121335 +-0.084276 0.107651 0.0243439 +-0.0705376 0.04043 0.00377428 +-0.0107227 0.165105 -0.0188107 +-0.0550975 0.13533 0.0326236 +-0.0735773 0.0648576 0.0107478 +-0.0227215 0.0797443 0.0551012 +-0.0404988 0.043751 0.0418177 +-0.0507215 0.132501 0.0301542 +-0.0728912 0.11354 -0.00756484 +0.00242535 0.0343652 0.00462872 +-0.0556704 0.0335434 0.000932366 +0.00528142 0.0509933 -0.0292119 +0.0213389 0.0621093 -0.0262711 +-0.0275166 0.0348502 0.0465557 +-0.0826299 0.110259 0.0284001 +-0.00850001 0.125156 0.0314578 +-0.0707102 0.149836 -0.0414255 +0.0204972 0.107072 0.0404393 +-0.0215031 0.108553 0.041118 +-0.0404837 0.0818282 0.0429123 +-0.0586314 0.0580318 0.0162523 +-0.0648762 0.109524 -0.0137682 +-0.0687139 0.0394283 -0.00171366 +0.00150188 0.0938741 0.0550191 +0.027072 0.122359 0.0168201 +-0.0275307 0.0918372 0.0449329 +-0.00320104 0.131164 0.014241 +0.00886384 0.130684 0.0200808 +0.0402562 0.0857576 -0.0117696 +-0.0823675 0.147331 0.00217458 +-0.082659 0.0776741 0.0225196 +-0.0388763 0.107081 -0.0200218 +0.0151073 0.108635 -0.0180644 +0.0460054 0.0746307 0.0193568 +-0.0735009 0.117559 0.0527975 +-0.0337749 0.0338108 0.0177666 +0.032372 0.116958 0.0202394 +-0.0763319 0.15494 -0.00387485 +-0.0687774 0.0837142 -0.0175822 +-0.010498 0.0517545 0.0512545 +0.0210632 0.038679 -0.00769573 +0.0140028 0.091392 0.0520062 +-0.0842337 0.150005 0.032317 +0.0332536 0.0916169 0.0411931 +-0.0394897 0.0874644 0.0433271 +0.0207921 0.106393 -0.0166835 +-0.0368012 0.111669 -0.0181954 +-0.0495137 0.0503617 0.0366255 +-0.0314035 0.121359 0.0260922 +-0.0745094 0.140045 0.0479791 +-0.020484 0.0842242 0.0566713 +-0.00549585 0.0911858 0.0567127 +-0.0870672 0.0882048 0.024333 +-0.0377523 0.0783086 -0.0194038 +0.0407806 0.0717592 -0.0087638 +0.00365619 0.131646 0.00960837 +-0.0157548 0.0714554 -0.0386719 +0.0597099 0.0650292 0.0201784 +-0.0675187 0.0874976 0.0437834 +0.0405833 0.0670896 0.0305002 +-0.0180479 0.0418467 0.0526068 +-0.0427079 0.151894 -0.00649313 +-0.0220141 0.0388944 0.0538623 +0.00616925 0.0895403 -0.0330971 +-0.0064158 0.0391939 0.0347568 +0.0557201 0.0581302 0.0259556 +0.0563341 0.0711373 0.00671617 +-0.0727258 0.157431 -0.00265266 +0.0125423 0.120941 -0.012332 +0.00414764 0.103055 -0.021794 +-0.029166 0.0762862 0.0418904 +-0.0268469 0.0423164 0.0533212 +-0.0621198 0.0344764 0.0202314 +-0.0618524 0.169383 -0.0535961 +0.0250825 0.10872 0.0381638 +-0.0908254 0.142021 0.0251655 +-0.046283 0.129949 0.00285861 +0.0179105 0.0350278 -0.0116533 +-0.0397746 0.0826803 -0.0210594 +-0.0651763 0.16954 -0.0402745 +-0.0621336 0.16002 -0.0235787 +-0.0355709 0.168274 -0.000671324 +-0.037536 0.159586 0.00182669 +-0.0681305 0.148403 -0.0333773 +-0.0364875 0.100095 0.0421869 +0.0545857 0.0608947 0.0278753 +0.0195769 0.0347391 0.0223805 +-0.0765172 0.154938 0.0266851 +0.0329357 0.0710876 -0.0177809 +-0.0434945 0.111176 0.0370674 +-0.0144911 0.124164 0.030554 +-0.0644813 0.157544 -0.049277 +0.0162463 0.0722881 -0.029887 +0.0292794 0.111414 0.0337321 +-0.0730559 0.14548 -0.015959 +-0.032702 0.0694797 -0.021456 +-0.0682487 0.153053 0.0340661 +-0.0810659 0.143393 0.0434586 +-0.0508913 0.0474088 0.0186488 +-0.041491 0.0832013 0.0425516 +-0.0689521 0.151509 0.0368557 +0.00620362 0.0387395 0.045605 +-0.0437238 0.0739429 -0.018203 +-0.0589977 0.125247 -0.00779139 +0.0113495 0.0553023 -0.0296776 +-0.0665061 0.0972756 0.0420058 +0.00151221 0.0828796 0.0573767 +-0.000819486 0.131234 0.00795191 +0.0463579 0.0575632 -0.00556359 +-0.0223022 0.165377 -0.00961273 +0.0177451 0.0379283 0.0429098 +-0.0914397 0.143364 0.0211639 +-0.0366139 0.0493085 -0.0123994 +-0.0374871 0.0576725 0.0398228 +-0.0252778 0.0383536 -0.00088571 +-0.0593549 0.0410534 0.0179552 +-0.0667502 0.0337781 -0.00695475 +-0.0206534 0.0391059 0.0372895 +-0.0144184 0.0997913 0.0448499 +-0.0451841 0.16983 -0.00497124 +-0.017913 0.184413 -0.0239895 +-0.0265191 0.0388768 0.0380618 +-0.0908997 0.126938 0.0424248 +-0.000826517 0.0853922 -0.0362438 +-0.0534467 0.125409 -0.00644153 +-0.0368662 0.104233 -0.0205194 +-0.02728 0.181917 -0.0121056 +-0.0487731 0.0349958 0.0444688 +-0.0894993 0.135155 0.0302067 +0.0152294 0.0345961 -0.00794828 +-0.0135581 0.166929 -0.0145181 +-0.00316211 0.129199 -0.00103699 +0.0125106 0.108449 0.040622 +0.0494051 0.0734301 0.0147277 +-0.0427147 0.0710705 -0.0176966 +-0.0505553 0.136728 0.0232523 +-0.055076 0.154226 0.0167194 +-0.0598887 0.10828 -0.0169771 +-0.00348603 0.0489394 0.050606 +-0.0325038 0.107028 0.0393329 +-0.0558273 0.114722 -0.0152839 +-0.024429 0.062147 0.0418364 +0.0610039 0.0637491 0.0121545 +-0.0307981 0.0381678 0.00179566 +-0.0224893 0.0462052 0.0523041 +-0.0626699 0.13529 0.0374908 +-0.0871093 0.106357 0.0153576 +0.018535 0.0346925 0.0222104 +-0.0633642 0.142485 0.0383017 +0.0395752 0.0602985 0.0307005 +0.0196495 0.0356664 -0.00567711 +-0.00666974 0.0555272 -0.0330407 +-0.0554731 0.154191 0.0210182 +-0.00998984 0.177238 -0.0295136 +0.0366228 0.111865 0.00747742 +-0.00322809 0.0999661 -0.0238789 +0.00852647 0.0349744 0.0253569 +0.0337455 0.11169 -0.0043358 +-0.033869 0.10148 -0.022225 +0.0215013 0.108432 0.0393095 +0.027565 0.119234 0.026993 +-0.0477832 0.129154 -0.000397631 +-0.057288 0.0521607 0.00365094 +0.0119513 0.0873992 0.0542929 +0.0510679 0.0720267 0.021243 +-0.0525522 0.0487323 -0.0069784 +0.0419877 0.102851 0.0121565 +-0.0154922 0.126886 0.0243264 +-0.010476 0.0965182 0.0531854 +-0.0107078 0.0628117 -0.0359649 +-0.0848416 0.0858026 -0.00253503 +-0.0300028 0.125562 0.00590559 +-0.0137234 0.0643092 -0.0370705 +0.025242 0.0761745 -0.0249679 +-0.0268088 0.0852978 -0.0363495 +0.028746 0.0693043 -0.0217828 +-0.0525052 0.112524 0.0359139 +0.0608734 0.0637391 0.0151617 +-0.0820606 0.151973 0.00432386 +-0.065153 0.0712063 0.036955 +-0.0590564 0.0335255 0.00387291 +-0.0726667 0.0777379 -0.0132872 +-0.0639501 0.166025 -0.0326719 +0.033089 0.0892132 -0.0184699 +-0.0410037 0.148494 -0.000715623 +0.0152676 0.11708 -0.0141694 +-0.0405102 0.127658 -0.000961794 +0.0135046 0.108467 0.0407674 +-0.0598038 0.0341949 0.0280011 +-0.025416 0.0905129 0.0490114 +-0.0383992 0.0420226 0.0422608 +-0.0414999 0.0478558 0.040117 +-0.0525584 0.0501546 -0.00685551 +-0.0394783 0.0832832 0.0435432 +-0.0409872 0.0335947 -0.0218947 +-0.0234596 0.184384 -0.0119315 +-0.00549722 0.0633676 0.0561862 +-0.0249111 0.0958255 0.0441185 +-0.0794946 0.12171 0.0507273 +0.0218787 0.0430332 -0.0157248 +-0.0284679 0.0718578 -0.0335433 +-0.0287174 0.0344722 -0.0298467 +-0.0375646 0.0407082 -0.0285349 +-0.0684694 0.153743 0.0324784 +0.0275012 0.1187 -0.00304813 +-0.0654981 0.100096 0.041968 +-0.0728966 0.155445 -0.0329107 +-0.024103 0.171237 -0.0122056 +-0.0213641 0.0384977 0.0305062 +-0.00878734 0.0798675 -0.0379507 +-0.0034971 0.0703995 0.0574239 +-0.0628591 0.0679841 0.0349557 +-0.0205114 0.0512056 0.0456176 +-0.0215925 0.0364837 -0.0283556 +0.0308475 0.0751439 -0.0207339 +0.0345069 0.0483661 0.0310725 +0.00650269 0.044152 0.0457422 +-0.0404948 0.0733395 0.0422389 +0.00152573 0.0717149 0.0566366 +-0.00449638 0.110771 -0.0213478 +-0.0786622 0.0733343 0.0252726 +-0.00997021 0.129828 0.00744342 +-0.0368781 0.107107 -0.0201846 +0.0114979 0.112659 0.03891 +-0.0516419 0.126901 0.0340875 +-0.05391 0.13392 0.032587 +-0.0537085 0.0491368 0.0316573 +-0.086972 0.143283 0.00915353 +-0.0889751 0.0969295 0.00842099 +-0.0378902 0.121927 0.0281694 +-0.0870357 0.141902 0.00919077 +-0.056635 0.0350546 0.0452244 +-0.019816 0.0347801 0.0465131 +0.0392931 0.086096 0.0340337 +-0.0869334 0.0861006 0.0224549 +-0.0643967 0.0646443 0.0287462 +-0.0398612 0.101404 -0.0212384 +-0.0536876 0.0334698 -0.00403732 +-0.0785163 0.162478 -0.0269418 +-0.0638695 0.16329 -0.0240265 +-0.087202 0.10043 0.0240701 +-0.0736795 0.145791 -0.0128538 +0.0436314 0.0736519 0.026072 +-0.0326308 0.0352345 0.0485487 +-0.0158901 0.160985 -0.0130889 +0.0154243 0.0781303 0.053988 +0.00317805 0.0980649 -0.0258881 +-0.00360287 0.0419944 -0.0253901 +-0.0681856 0.169443 -0.0550153 +-0.0937199 0.12277 0.0132819 +-0.0335083 0.11115 0.0363293 +-0.0897769 0.0915868 0.0144438 +-0.00790609 0.0389527 -0.0109414 +-0.0512486 0.0474505 0.019655 +0.0299943 0.101654 -0.0156302 +-0.0688114 0.086573 -0.0173858 +-0.0425222 0.0435673 -0.0203211 +-0.0411345 0.037889 -0.0275181 +-0.0451234 0.0336213 -0.00611106 +-0.0513475 0.115214 -0.0158415 +-0.0135796 0.18457 -0.0255034 +0.0514482 0.0490026 0.000289284 +-0.0154766 0.160714 -0.011803 +-0.0871595 0.128427 0.0471391 +0.0253818 0.0487646 -0.0196147 +-0.0226623 0.0866242 0.0548392 +-0.00567144 0.0569411 -0.0332111 +0.046481 0.0764536 0.00918999 +0.0579995 0.0690441 0.020859 +-0.0371 0.126156 -0.00341777 +-0.073756 0.0716254 0.0312714 +-0.0320938 0.0457263 -0.0270587 +-0.0109396 0.165104 -0.0156606 +-0.088578 0.151544 0.0220955 +0.00637955 0.131641 0.0120332 +-0.00648723 0.114138 0.040862 +-0.058347 0.0335497 0.00759386 +0.00578775 0.0392649 0.0317966 +-0.0571091 0.140994 0.0314586 +-0.00487882 0.107372 -0.0225382 +-0.0806197 0.114932 0.047462 +-0.0334955 0.0874648 0.043047 +-0.0460993 0.132381 0.0175967 +-0.0638759 0.0334217 -0.000619218 +-0.0121322 0.038759 -0.00601251 +-0.0743637 0.153685 0.0319267 +-0.0445292 0.0547767 0.038815 +0.0265401 0.0686018 0.0436052 +0.0300756 0.0946988 -0.0182345 +-0.00649809 0.0703887 0.0571625 +-0.0574852 0.0861616 0.0444185 +-0.0204789 0.081458 0.0566556 +-0.045663 0.0367902 -0.0212772 +-0.0660163 0.156182 0.0230465 +0.0105014 0.112682 0.0391847 +-0.0863368 0.153207 0.0174967 +-0.0314199 0.0595176 -0.0174145 +-0.0903295 0.150229 0.0211233 +-0.0394972 0.0648803 0.0416583 +-0.0107858 0.0386823 0.0289151 +-0.0567014 0.0534733 -0.0003903 +-0.00348704 0.121028 0.0369539 +0.0367923 0.0967547 0.0340658 +-0.0206904 0.0538665 -0.0309758 +0.0171483 0.0535046 0.047456 +-0.052342 0.035529 0.0457534 +-0.0350351 0.0408695 0.0473482 +-0.0364795 0.0519621 0.0386972 +0.0339284 0.0669478 -0.0167571 +-0.0277715 0.0852268 -0.0356683 +0.00655622 0.121628 -0.0130526 +-0.0586532 0.0645395 -0.00761311 +-0.0582249 0.0344034 0.0351394 +-0.00633129 0.0388612 -0.00122239 +-0.0669198 0.113752 -0.0107887 +-0.0667337 0.0374088 0.0337222 +-0.00249774 0.0520145 0.0539036 +-0.0450377 0.0345968 0.0325315 +0.0242293 0.119847 -0.00515511 +-0.0932424 0.12021 0.0392849 +-0.0535442 0.129727 0.0348674 +-0.00517846 0.0367339 0.04845 +-0.0734548 0.0752713 0.0352251 +-0.0687371 0.155896 0.0104629 +-0.0471614 0.0336254 -0.00103179 +-0.00441737 0.117961 -0.0150091 +-0.0238639 0.0825121 0.0547585 +-0.0132802 0.102485 0.0435875 +-0.0649278 0.105334 -0.0156241 +0.0286778 0.116188 -0.00517917 +-0.0236663 0.0381653 0.00868472 +-0.0645999 0.0432992 0.0347148 +-0.0856886 0.0926246 -0.00156242 +-0.0835056 0.0777286 0.0204901 +0.0321567 0.107734 -0.010124 +-0.0895151 0.151559 0.0181181 +0.0110134 0.130158 0.00376449 +-0.0202842 0.16977 -0.0137262 +-0.00591514 0.12799 -0.00376372 +0.0143906 0.0373653 -0.0212799 +-0.0719296 0.11219 -0.00889601 +-0.0157228 0.0642918 -0.0372774 +0.0269219 0.115924 -0.00692402 +-0.0665225 0.0435914 0.00948645 +-0.0747288 0.102175 0.0369848 +0.0207343 0.120306 -0.00765281 +-0.0240392 0.0380418 0.0177619 +-0.0806691 0.107746 0.0299304 +0.0541727 0.0734662 0.0150335 +-0.0828869 0.0763004 0.0145215 +-0.0490771 0.154645 -0.00592496 +0.0211784 0.0973838 -0.0221644 +-0.0576844 0.0467193 0.0286753 +0.00985328 0.0602892 0.0527986 +0.0232608 0.0748451 -0.0261321 +-0.0524982 0.0862336 0.045539 +-0.0783198 0.147274 -0.0028373 +0.0082875 0.114937 -0.017843 +0.018445 0.0456517 -0.0226728 +-0.0239275 0.1816 -0.0100979 +-0.040758 0.0797297 -0.0196637 +-0.0485257 0.121087 0.0297472 +-0.0345208 0.0633716 0.0403553 +-0.00118398 0.0362533 0.0473478 +0.000189104 0.0867348 -0.0351526 +0.0231695 0.0520348 0.0420858 +-0.0324783 0.0337381 0.0144953 +-0.0597681 0.0334439 0.00560092 +0.0177557 0.0344112 0.00209212 +0.0159863 0.0860656 0.0513294 +-0.0393291 0.127134 0.01721 +-0.0628998 0.1209 -0.00884208 +0.04086 0.101423 0.0231764 +-0.0146702 0.122522 -0.00773793 +-0.0292113 0.156649 -0.000270817 +-0.0415254 0.172553 -0.00373349 +-0.0365135 0.084703 0.0437856 +-0.0208969 0.0381794 0.0236923 +0.011579 0.120136 -0.0134617 +-0.0347516 0.0383809 -0.00467189 +-0.0166266 0.172732 -0.0172138 +-0.0531086 0.126902 0.0355005 +-0.0154789 0.0347707 0.0439361 +-0.0110657 0.112343 -0.0190003 +0.0286979 0.0806527 -0.0216026 +-0.00681305 0.0345833 0.0441587 +-0.0245442 0.0708437 0.0459353 +-0.0613991 0.0718897 0.0389316 +-0.0682443 0.179461 -0.0589214 +-0.00573885 0.0698843 -0.0361103 +-0.0875967 0.100907 0.00640641 +0.0169866 0.0348952 0.0343866 +0.0228667 0.0444458 -0.0147763 +-0.0536029 0.162357 0.00297376 +-0.0723862 0.156822 -0.0359122 +0.000140075 0.103071 -0.0225088 +-0.0543692 0.0334679 -0.00234676 +-0.0771859 0.109877 -0.00559641 +-0.0922148 0.11614 0.0373108 +0.00616718 0.124896 -0.00854967 +-0.00125449 0.12189 -0.0112382 +0.0349132 0.114353 0.0126105 +-0.0534959 0.107052 0.0398334 +0.0553645 0.0492819 0.0192078 +0.0496613 0.0501912 -0.00270335 +-0.0917143 0.128313 0.0332436 +0.00552678 0.0619607 0.0559576 +-0.0252475 0.0736694 0.0465167 +-0.0656879 0.156227 0.015899 +0.0167178 0.128574 0.00869666 +-0.0616277 0.154191 0.00244865 +-0.0845352 0.136246 0.000324782 +-0.0835033 0.0804619 0.0265017 +-0.0380583 0.154792 -0.00920218 +-0.0683549 0.0382578 0.0114352 +-0.0713665 0.156324 0.018248 +0.0326986 0.0781958 0.0420379 +-0.0267044 0.158758 -0.0121466 +0.0274612 0.0417732 0.0323464 +-0.00748374 0.116886 0.0393445 +-0.0618946 0.0333508 -0.00558837 +-0.022958 0.166842 -0.0105567 +0.000373363 0.0349968 0.00734292 +-0.0437553 0.033642 0.00144997 +0.0267259 0.120866 0.0252428 +-0.0859248 0.0832079 0.00547822 +-0.00269975 0.109146 -0.0216168 +0.055733 0.052157 0.00319809 +-0.0704697 0.181218 -0.0537747 +0.00698645 0.0818884 0.0558396 +0.0424628 0.0943961 -0.00280162 +-0.0560128 0.0334549 0.00994988 +-0.000497737 0.11557 0.0407823 +0.0115122 0.104463 0.0449641 +0.0113328 0.124014 0.0325236 +-0.0257103 0.0983522 -0.0242349 +0.0385114 0.038461 0.00447642 +0.0274866 0.0994982 0.0416519 +-0.0205044 0.11679 0.0360351 +-0.0287307 0.0748955 0.0414817 +0.021677 0.0354914 0.00935068 +-0.0604978 0.109778 0.0376942 +0.0349482 0.114159 0.0154869 +-0.0891171 0.11284 0.0400327 +-0.0525174 0.133925 0.0310668 +-0.0467675 0.0811826 -0.0202513 +0.0148515 0.129255 0.0180171 +0.0134018 0.0418881 -0.0236384 +-0.0196836 0.0524593 -0.0309769 +-0.0907522 0.136478 0.0191999 +-0.0282073 0.178522 -0.0159874 +-0.0456817 0.146626 -0.00135754 +-0.0234782 0.174205 -0.0130294 +0.0157394 0.128861 0.0183169 +-0.049553 0.0432181 -0.0104928 +-0.0364431 0.0379518 -0.0296736 +-0.0342528 0.161016 -0.000502552 +-0.0106993 0.061373 -0.0355475 +0.0155546 0.034804 0.0269401 +0.0445305 0.0664178 0.0264316 +-0.0692603 0.166617 -0.0519986 +0.00900275 0.0343116 -0.0200681 +-0.0789639 0.13393 -0.00512141 +0.0183835 0.0490953 -0.0235496 +-0.0211568 0.177178 -0.0149257 +-0.0459855 0.0341655 0.0291843 +0.0234635 0.12256 0.0268857 +-0.0437241 0.0724973 -0.0179849 +-0.0492665 0.143175 0.00640774 +0.0310235 0.0363382 0.00298341 +-0.0703389 0.0353326 0.0107638 +-0.0505002 0.0762293 0.0432414 +-0.0641035 0.141307 -0.00745692 +-0.0474934 0.115292 0.0331905 +-0.050108 0.144746 0.0113816 +0.0325029 0.117364 0.00744623 +-0.0183192 0.124686 -0.00393431 +-0.00150748 0.059016 0.0544507 +-0.0104895 0.115533 0.0397944 +-0.023487 0.0435372 0.0536017 +-0.0655471 0.154522 0.00288522 +-0.0675989 0.156142 0.0239498 +-0.03165 0.0339865 0.0180432 +-0.0447604 0.0336698 -0.00424497 +-0.0348481 0.110331 -0.0188 +-0.0114927 0.0938853 0.0554733 +-0.0700706 0.155642 0.00707306 +0.0444883 0.05975 0.0312137 +-0.0788477 0.0773102 0.0306071 +-0.0712203 0.0706743 0.0326242 +0.00153616 0.078717 0.0572683 +-0.0243177 0.0607418 0.04177 +0.0445696 0.0677675 0.0254424 +0.0516179 0.0503639 -0.000756444 +-0.0610049 0.129668 -0.00770337 +-0.0731244 0.174613 -0.0403365 +-0.021137 0.166765 -0.0184531 +-0.068723 0.163208 -0.0142948 +-0.0415011 0.0676725 0.0415782 +-0.0829782 0.147345 0.00316952 +-0.056007 0.145723 -0.001571 +-0.023276 0.0768174 0.0529315 +-0.0303597 0.158405 -0.0122944 +-0.0594923 0.107014 0.0396564 +-0.0680504 0.156343 0.0223236 +-0.050518 0.054445 0.0327051 +-0.0324286 0.126663 0.0108668 +-0.0629263 0.108221 -0.0156274 +-0.0283572 0.0862879 0.0464179 +0.0304249 0.0399897 -0.00292852 +-0.0820851 0.106006 0.028693 +-0.081432 0.0776141 0.0263044 +0.0121657 0.0990535 -0.0228743 +-0.0148931 0.161809 -0.0143393 +0.0322568 0.0814321 -0.0193234 +-0.0249634 0.0631201 -0.0324542 +-0.0844782 0.152284 0.0269844 +-0.0284889 0.100156 0.0431683 +0.0335187 0.113275 -0.00203325 +0.0243141 0.0347256 0.0105738 +-0.0189924 0.127884 0.0157415 +-0.0555 0.0488797 0.0362241 +-0.0675079 0.104205 0.0395869 +-0.0181173 0.0384288 0.000495732 +-0.0138101 0.0841459 -0.0389466 +-0.0343542 0.0367977 0.0484644 +0.0170352 0.0393356 0.0436644 +-0.0255828 0.0620727 0.0401653 +0.0012257 0.0797035 -0.0352779 +-0.0033226 0.122983 -0.0103909 +0.0377895 0.0954381 0.0337234 +-0.0779478 0.107702 0.034147 +0.0309974 0.0673207 0.0412553 +0.0125192 0.0833344 0.053329 +-0.0569108 0.0471914 0.0407265 +-0.0765896 0.172837 -0.038783 +-0.0243798 0.168291 -0.0108587 +-0.0849208 0.114388 0.046865 +0.0270076 0.100021 -0.0178938 +-0.00936568 0.0388306 -0.00738531 +0.0124903 0.101789 0.047403 +0.0153634 0.050802 -0.0265798 +-0.051492 0.107057 0.0393982 +0.00022872 0.0769217 -0.0357549 +-0.073138 0.156184 0.0161734 +-0.0171943 0.171219 -0.0224352 +0.0282636 0.073195 -0.0229429 +-0.0554943 0.112513 0.0359102 +0.0268698 0.0448976 0.0368034 +-0.0567448 0.0548796 0.00465654 +0.00393342 0.0340406 0.014385 +-0.0269434 0.0864227 0.0492292 +-0.050859 0.0487888 0.015667 +-0.0524919 0.0762203 0.042799 +-0.025733 0.0751362 0.0469781 +-0.0870453 0.0846718 0.00449266 +-0.0765303 0.0961207 -0.0124976 +0.0303449 0.112749 0.0317399 +-0.070531 0.151779 -0.0453729 +0.0534729 0.0645627 -0.000631784 +0.0104112 0.0375138 -0.0230668 +0.0592863 0.0552837 0.0131736 +0.00525297 0.069736 -0.0335357 +0.0167263 0.0350159 0.0378322 +-0.0679113 0.0395796 0.0109828 +0.013918 0.129208 0.0205036 +-0.079478 0.142827 0.0451049 +-0.0708238 0.0631793 0.00551684 +-0.0687786 0.16979 -0.0301319 +-0.0187811 0.119777 -0.0107944 +0.021663 0.053586 0.0452157 +0.015783 0.0914175 0.0510677 +0.0258521 0.119872 -0.00319504 +-0.0172292 0.104564 -0.022745 +-0.0618136 0.0453397 -0.00172473 +0.0207685 0.0449736 0.0420523 +-0.0231964 0.0651165 0.0447582 +-0.0305175 0.0847809 -0.0315638 +-0.0658758 0.122838 0.0504663 +-0.0148324 0.107132 -0.0214612 +0.0460436 0.0778241 0.00519064 +0.00396334 0.0346642 0.000955872 +-0.000496537 0.0675633 0.0565514 +0.0342214 0.0813611 -0.0182381 +-0.0464961 0.0464761 0.0407845 +0.0547176 0.0680176 0.00187225 +-0.0580682 0.132534 -0.0063879 +0.0331199 0.0754691 0.0408773 +0.0401875 0.102783 0.0241636 +-0.0783656 0.151459 -0.000884796 +0.0238113 0.0754906 0.0485213 +0.0164183 0.0726599 0.0518741 +-0.0674097 0.173701 -0.0580011 +-0.0179511 0.175707 -0.0173471 +-0.0334973 0.0859864 0.0423406 +-0.0416172 0.17268 -0.00599082 +-0.0883846 0.119913 0.00130167 +-0.0154061 0.185475 -0.025609 +0.0464852 0.0429053 0.00427528 +0.0545912 0.0717149 0.021096 +-0.0661916 0.0334877 0.00245273 +-0.0495852 0.124005 0.0317323 +-0.0537144 0.0491343 0.0296614 +-0.0818927 0.122139 -0.0045131 +-0.0718108 0.0955414 0.0413269 +0.0221671 0.0444704 -0.016762 +-0.0798314 0.0733447 0.0205614 +0.0166594 0.125691 0.027245 +-0.0892473 0.0888575 0.0104669 +0.00551166 0.0504095 0.0521406 +-0.0627982 0.16724 -0.0607839 +-0.0646154 0.0457888 0.00269728 +-0.0485702 0.047508 -0.00937813 +0.026502 0.121591 0.0237374 +-0.0353601 0.152626 -0.00619729 +0.0403422 0.10564 0.0161674 +-0.0615416 0.034204 0.0241166 +0.0380593 0.0869714 -0.0147288 +0.0319925 0.114417 -0.00326976 +-0.0267368 0.0385445 0.0329521 +-0.0618964 0.108239 -0.0162152 +-0.063845 0.150027 0.0371387 +-0.0739579 0.155489 -0.0249104 +-0.0709691 0.153934 -0.0469289 +0.0249948 0.0405751 0.0353079 +-0.0304784 0.0381297 0.00370653 +-0.0247632 0.0741431 -0.0374571 +-0.0216593 0.0509046 -0.0292926 +-0.0446505 0.0592548 -0.0123035 +-0.0410267 0.172571 -0.00282243 +-0.060985 0.168641 -0.0594898 +0.0260213 0.111246 -0.0119 +-0.0224982 0.103036 0.0436276 +-0.0720537 0.0640001 0.00639175 +-0.08755 0.12805 0.000278104 +-0.0790371 0.0873264 0.0361062 +-0.055031 0.152471 0.0270238 +0.0537262 0.0622241 0.0283948 +0.0248385 0.107021 -0.0153684 +-0.0817292 0.154617 0.0205129 +-0.0776054 0.0804635 0.0348861 +-0.0644463 0.0769092 0.0410862 +-0.0737119 0.082093 -0.0148287 +-0.0782342 0.0694181 0.011104 +-0.0678631 0.0335656 -0.00155997 +-0.0771555 0.15282 -0.00488816 +0.028309 0.049176 0.0371723 +0.0122273 0.0342048 -0.000691958 +-0.0643947 0.15704 -0.046105 +-0.0276636 0.0522618 0.0383069 +-0.0587411 0.154535 0.0270999 +0.0275645 0.122014 0.00844231 +-0.0465457 0.0337901 0.0276252 +-0.0853906 0.110991 0.0352247 +-0.0338206 0.0367327 0.0490996 +-0.0145535 0.06115 0.0532234 +0.0367927 0.111755 0.0132988 +0.0458177 0.0820138 0.0181729 +-0.0444555 0.121377 -0.0123561 +0.0224202 0.0430392 -0.0127301 +0.0158478 0.102035 -0.022 +-0.0100884 0.0347013 0.0469069 +0.0374928 0.0498822 0.031843 +0.0351777 0.0559301 -0.00964394 +-0.00946358 0.169654 -0.0207426 +-0.0656264 0.15567 -0.0512009 +-0.0254805 0.0434932 0.0531599 +-0.0270955 0.0576776 -0.0274029 +-0.0228583 0.0350556 -0.0196661 +-0.0139903 0.169817 -0.0169155 +0.0176377 0.0348968 0.0272836 +-0.0144859 0.107222 0.0429439 +-0.0291189 0.15522 -0.00190906 +-0.0411739 0.165162 -0.0113688 +-0.0123514 0.0384213 0.00530714 +-0.0527141 0.141625 0.0234145 +-0.0612038 0.154834 0.027675 +-0.0338487 0.098628 -0.022813 +-0.000859642 0.105926 -0.0219248 +-0.0203431 0.186558 -0.0166005 +-0.01883 0.0882728 -0.037792 +-0.0635094 0.0987058 0.0422669 +-0.000483407 0.0787781 0.0579546 +-0.0700187 0.074071 0.0369567 +-0.0201986 0.186115 -0.0151371 +0.00141145 0.0376391 -0.024717 +0.0439647 0.0888964 0.0241631 +-0.0774025 0.100791 0.0354679 +-0.078513 0.145668 0.0427459 +0.0241305 0.0618675 0.0453428 +0.0109129 0.0833325 0.0545132 +-0.0798758 0.117757 -0.00451351 +0.0302928 0.119677 0.0137476 +0.0354021 0.0399255 -0.00156043 +-0.0489211 0.0687544 0.0390214 +-0.0493842 0.0558982 0.0343669 +-0.0524939 0.0776533 0.0431774 +-0.00761105 0.112944 -0.01965 +-0.0631004 0.038056 0.0429096 +-0.078061 0.117721 0.0511362 +-0.0228935 0.0375359 -0.0182249 +0.0168546 0.104974 -0.0191686 +-0.062493 0.0385506 -0.00796777 +-0.0814183 0.138999 -0.00180871 +-0.0585811 0.0344322 0.0332983 +-0.0299241 0.172727 -0.00652243 +0.0112861 0.130316 0.0195341 +-0.0325036 0.10978 0.0375732 +-0.0826224 0.141799 0.00118353 +-0.0805022 0.0831735 0.0334637 +0.0122352 0.0808526 -0.0312408 +-0.0771876 0.0907032 -0.0125611 +-0.0140608 0.038299 0.0231793 +-0.0386607 0.116212 -0.0149511 +-0.0276455 0.0376114 0.0210157 +-0.0832306 0.0871025 0.0304136 +-0.0334887 0.0471143 -0.0243565 +-0.0400971 0.153595 0.0050429 +-0.0647302 0.154215 -0.0408208 +-0.0194396 0.0527865 0.0471813 +-0.0665534 0.156088 0.0243177 +0.00850109 0.107119 0.0411949 +-0.0740753 0.174982 -0.0510829 +-0.0131928 0.11434 -0.0171133 +-0.00874908 0.0742103 -0.037697 +0.00967799 0.130572 0.00468392 +0.0318663 0.0862689 0.0426688 +0.0197994 0.0399634 -0.0167042 +0.0141672 0.0347073 0.00296826 +-0.0334912 0.0604137 0.038899 +-0.010802 0.0812949 -0.0382665 +-0.0626127 0.0339199 -0.00909656 +-0.0225179 0.0594554 0.0442529 +-0.0744235 0.152695 -0.0268913 +-0.0148262 0.181632 -0.021586 +-0.0501691 0.0348773 0.00986405 +0.0104481 0.102845 -0.020901 +-0.0127527 0.177163 -0.0221029 +0.008145 0.103004 -0.0207662 +-0.0548867 0.101301 -0.0205491 +-0.0772028 0.162464 -0.0309387 +0.0379552 0.0588939 -0.00773658 +-0.0134957 0.0925258 0.0558596 +0.0248886 0.0970269 -0.0206985 +-0.0393214 0.0342416 -0.0147308 +-0.0458838 0.129671 0.00293555 +-0.0574217 0.135337 0.0345321 +-0.0820284 0.13533 -0.00235647 +0.038582 0.0659177 0.034606 +-0.0494896 0.157875 0.00921755 +-0.0225598 0.125982 0.00280455 +0.0216881 0.102085 -0.0200779 +-0.0136509 0.0496769 -0.0312069 +-0.0615955 0.15529 0.0260796 +-0.0115193 0.0773584 0.0574493 +0.0404486 0.0745397 -0.00879543 +-0.057886 0.0969698 -0.0206731 +-0.0109392 0.038438 0.0236915 +-0.0148475 0.162865 -0.0159421 +-0.0183748 0.0353493 0.0515278 +0.029169 0.114081 0.0318014 +0.0232083 0.0449556 0.0403488 +-0.0234883 0.122057 0.0276339 +0.0359605 0.0936242 -0.0130764 +-0.0175335 0.0392471 0.0378093 +-0.0308588 0.171231 -0.00613945 +0.0247031 0.0463341 0.0389677 +-0.0925247 0.128292 0.0282327 +-0.0665656 0.122847 0.0512252 +0.0584586 0.0607609 0.022909 +-0.00884754 0.115581 -0.0164541 +-0.00309453 0.0984522 0.0515066 +0.0115015 0.119616 0.0358941 +-0.0494977 0.0903933 0.0446494 +-0.0126691 0.0348865 0.0479592 +-0.0149576 0.0897382 -0.0373658 +-0.0152002 0.174208 -0.0254562 +-0.0756281 0.167353 -0.024657 +-0.0627225 0.0402195 0.0247088 +-0.058955 0.151077 0.0341866 +-0.00932165 0.17502 -0.028678 +-0.0123491 0.183911 -0.0264322 +-0.0896074 0.135171 0.0322127 +-0.0426789 0.168728 0.0023488 +-0.0748775 0.0739125 0.0325733 +0.03891 0.10882 0.00971935 +-0.0633729 0.0431313 0.0286681 +-0.0551792 0.0336096 0.018904 +0.0268834 0.0875842 0.0460207 +-0.0168782 0.0351038 0.0503404 +-0.00549453 0.0590678 0.0548923 +-0.0286315 0.0383676 -0.00896928 +-0.0332631 0.177035 -0.011981 +-0.0748045 0.167943 -0.0420608 +-0.0851109 0.0939488 -0.00257672 +0.00096833 0.121103 -0.0124156 +-0.0558825 0.0465312 0.026676 +0.00712802 0.0975509 -0.0252935 +-0.00450103 0.0746726 0.0587526 +-0.0754962 0.141423 0.0471972 +-0.0514204 0.0548853 0.0209522 +-0.0107189 0.0642451 -0.0362023 +0.0428473 0.0944698 0.0251639 +0.0161732 0.12869 0.00706423 +0.0172673 0.128465 0.0103258 +-0.0624218 0.113827 0.0376933 +-0.0694289 0.039567 0.00968578 +-0.00956353 0.172645 -0.0227849 +-0.036529 0.0344176 0.0112583 +0.00747563 0.0378784 -0.00876072 +-0.0105064 0.0884021 0.0567868 +-0.0306153 0.0495713 -0.0203608 +-0.0832173 0.13898 0.000315163 +-0.00610064 0.0339097 -0.0209348 +-0.0081869 0.0386049 0.00598379 +0.0213573 0.057915 -0.0266602 +0.0391712 0.0402919 0.0231925 +-0.0346283 0.0533938 -0.0102529 +-0.00324688 0.0367886 -0.0155194 +-0.0734226 0.0711647 -0.00664488 +-0.0628413 0.144409 -0.0076345 +-0.0258745 0.104437 -0.023108 +-0.0100477 0.178214 -0.0295899 +-0.0839857 0.132609 0.0495198 +-0.0498484 0.121182 -0.0121 +0.0108333 0.130856 0.0150885 +-0.0104958 0.0939039 0.0555039 +-0.0863431 0.112514 0.0302243 +0.0475429 0.0429463 0.00623912 +-0.0334893 0.050539 0.0382432 +-0.0209099 0.158178 -0.00579641 +0.011514 0.10312 0.0464311 +0.0350456 0.0627954 -0.0138277 +-0.0161876 0.171234 -0.0230543 +-0.0268555 0.0987274 -0.0239779 +0.0118541 0.0404814 0.0449158 +-0.0104973 0.0856567 0.0572952 +0.0271955 0.0520724 0.0391174 +0.00248489 0.105788 0.0426651 +-0.0037871 0.0812341 -0.0371832 +-0.0231675 0.184436 -0.0160624 +-0.0612844 0.044277 0.027687 +0.0239731 0.061977 -0.0246362 +-0.00946933 0.0932363 -0.0348935 +-0.0178949 0.0971863 0.0483787 +-0.00196639 0.0392296 -0.0118812 +-0.0067485 0.0755804 -0.0372256 +-0.00967937 0.0555867 -0.0337759 +0.000980617 0.120181 -0.0134191 +-0.0806495 0.10968 0.039129 +0.0358807 0.0812282 -0.0166923 +0.0146499 0.0699433 0.0528108 +-0.034478 0.0590226 0.0391844 +0.0203856 0.0348183 -0.00149748 +0.0142674 0.0709686 -0.0310685 +-0.0334971 0.119329 0.0299275 +-0.0341948 0.0435484 0.0464376 +-0.00450247 0.056202 0.0539356 +-0.0721189 0.15515 0.0282101 +-0.000346509 0.12561 -0.00723663 +-0.0756644 0.0774182 -0.00947264 +0.014908 0.106309 -0.0185911 +0.0267515 0.102116 0.0406018 +-0.0626019 0.174089 -0.0546038 +-0.0574874 0.0805202 0.0440851 +-0.0609158 0.169795 -0.0608698 +0.0438296 0.0973504 0.015162 +-0.072512 0.104082 0.0376881 +0.0359801 0.0821479 0.0380155 +-0.0573808 0.129734 0.0381066 +-0.0236825 0.0566574 -0.0305632 +-0.0351787 0.0336265 -0.0226404 +-0.0257826 0.0783385 -0.0372231 +-0.0733446 0.159645 -0.0339252 +-0.024717 0.169741 -0.0113487 +-0.0597904 0.0825229 -0.0201763 +-0.0638365 0.0996097 -0.0175199 +-0.0897172 0.118919 0.0457459 +0.00851027 0.105753 0.0425683 +-0.0857293 0.121702 0.0488414 +-0.00654714 0.043 0.0484741 +-0.0524991 0.109798 0.0378325 +0.0089719 0.130372 0.00300057 +-0.0912936 0.114724 0.0218532 +-0.0758153 0.155373 0.0254598 +0.0443256 0.0931523 0.0201621 +-0.00159763 0.0391157 -0.0252097 +0.0358716 0.112393 0.0201061 +-0.0582724 0.0345955 0.0435663 +0.0444341 0.0861163 0.024155 +-0.0798668 0.12036 0.0500614 +-0.0486801 0.12235 -0.0113455 +0.044671 0.0931702 0.0171607 +-0.0867731 0.0820034 0.0144903 +-0.0444986 0.0465011 0.0409291 +-0.0132439 0.178631 -0.0284206 +-0.0014976 0.0856652 0.0573264 +-0.0555627 0.0351736 0.0453577 +-0.0757755 0.0948358 -0.0134771 +0.0116939 0.0459283 0.0447695 +-0.0334941 0.0690232 0.0409338 +-0.0717098 0.161007 -0.0419418 +-0.0620707 0.163126 -0.0385937 +0.0188526 0.103753 -0.0198618 +-0.0699102 0.14965 -0.0409667 +-0.0405063 0.0902417 0.0426463 +-0.071716 0.148756 -0.0367532 +-0.0218007 0.0637891 0.0462553 +0.0567259 0.0536428 0.00417778 +-0.0893948 0.09291 0.012442 +-0.0603715 0.133894 0.0372893 +0.0314991 0.054058 -0.0137198 +0.0203015 0.126964 0.0128708 +-0.0845068 0.120355 0.0490624 +-0.0624258 0.0342984 0.0291094 +-0.0395093 0.0930879 0.0428865 +-0.0277909 0.0380629 0.00793761 +0.0321502 0.106752 -0.0110706 +0.0298444 0.106115 0.0363002 +-0.054857 0.0970227 -0.0215362 +-0.0397671 0.127634 -0.000654541 +-0.0249592 0.0767123 0.050372 +-0.0265277 0.10717 0.0404632 +-0.0283702 0.0535742 -0.0233936 +0.00450189 0.050474 0.0524519 +0.00174762 0.0944417 -0.0320379 +-0.0810711 0.076096 -0.000474637 +0.0169426 0.11422 -0.015094 +-0.0380634 0.127686 0.00145512 +-0.0320932 0.0877303 -0.0254981 +-0.0569735 0.056267 0.00463231 +-0.0692551 0.175557 -0.0461164 +-0.0461819 0.130936 0.0220239 +0.0424151 0.101486 0.0141591 +-0.0816004 0.110405 0.0418977 +-0.0486814 0.0634873 -0.0123857 +-0.0354984 0.0491504 0.038916 +0.0232288 0.125257 0.0153837 +0.0251982 0.123641 0.0075622 +-0.0357278 0.07254 -0.0181295 +0.0451439 0.0802684 0.0230283 +-0.00649644 0.0605343 0.0557379 +-0.0697973 0.159564 -0.0489352 +-0.037469 0.120514 -0.011464 +-0.0869577 0.133848 0.0453706 +0.0185257 0.0352322 0.0362088 +-0.0206549 0.0768238 0.0545752 +0.0458945 0.0764062 0.00420006 +-0.0137194 0.091107 -0.0367438 +-0.0375014 0.106979 0.038117 +-0.0446156 0.0437685 -0.0132939 +-0.064545 0.156137 -0.0442784 +0.0275233 0.0621538 -0.0218174 +-0.0642285 0.0429095 -0.00424321 +-0.00460043 0.0434181 -0.0258683 +-0.0778454 0.158312 -0.0179205 +0.00252706 0.0800582 0.0567791 +0.0174798 0.0919971 -0.0254067 +-0.08982 0.133788 0.032216 +0.0343452 0.114918 0.0052408 +-0.0630651 0.167844 -0.0445874 +0.0164152 0.127597 0.00146207 +-0.0755176 0.120378 0.0530566 +-0.00615627 0.0994928 -0.025355 +-0.0501125 0.157587 -0.00554245 +-0.0332242 0.152554 -0.00262082 +0.0104732 0.0962984 0.0498872 +-0.0184975 0.111326 0.0402128 +-0.0228147 0.0826618 -0.0384205 +0.025553 0.0822419 0.0475803 +-0.0841632 0.11158 0.00227497 +-0.0198477 0.126879 0.00378288 +-0.069852 0.0951674 -0.0161643 +-0.0306901 0.0678681 -0.026462 +0.0155988 0.0699697 0.0524229 +-0.0167333 0.0642714 -0.0369951 +-0.0167796 0.121583 -0.00869919 +-0.0594953 0.0747194 0.0418121 +-0.0630515 0.152177 -0.00858675 +-0.0111714 0.129564 0.00700207 +-0.0890821 0.101017 0.0143926 +-0.0145147 0.116898 0.0378441 +-0.0462973 0.0368721 -0.0182757 +0.0251418 0.056415 0.0432482 +-0.0114906 0.0532044 0.051601 +-0.0514985 0.0931716 0.0440238 +-0.0536498 0.152894 0.0173581 +-0.0226294 0.157855 -0.00422736 +-0.0723402 0.0380689 0.00697334 +-0.0100211 0.0383173 0.0131334 +-0.0469913 0.0345734 0.0373898 +0.0117235 0.127254 -0.00315056 +0.0163555 0.0343012 4.3653e-05 +-0.000810177 0.084021 -0.0366442 +-0.0417008 0.153622 0.00625938 +-0.0695833 0.156717 -0.0509483 +-0.00967078 0.0541668 -0.0336446 +-0.0862734 0.13657 0.044609 +0.0363518 0.0562159 0.0330449 +-0.0528028 0.0666303 0.0365007 +0.0263615 0.0352587 0.00303932 +0.00111992 0.10872 -0.0203906 +0.00958242 0.0350342 0.0036093 +-0.0639107 0.108163 -0.0148371 +-0.00462988 0.0451748 -0.0282624 +0.00356053 0.130245 0.0239041 +-0.0428482 0.128274 0.00047704 +-0.0896015 0.136498 0.0242003 +-0.011119 0.163582 -0.018751 +-0.0521911 0.0531856 0.0256383 +0.02777 0.0808734 0.0454779 +0.0197898 0.0754906 0.0515075 +-0.0405912 0.0404909 -0.0262976 +-0.0184208 0.185917 -0.0222223 +-0.0738815 0.117926 -0.00764413 +0.0124741 0.0346639 0.0372734 +-0.057552 0.0336321 0.0166122 +0.0220421 0.0848959 0.0495666 +0.0184956 0.0962193 0.0472822 +-0.0577255 0.0578321 0.0166151 +0.00647696 0.11413 0.0402504 +-0.073854 0.100736 -0.0128364 +-0.0528758 0.0985097 -0.0219976 +0.0185485 0.111232 -0.0158588 +0.0257216 0.0672521 0.0441644 +-0.000523566 0.0428273 0.0465064 +-0.0354915 0.050532 0.0385401 +-0.0294972 0.0602632 0.0372614 +0.00410653 0.111609 -0.0202712 +0.0583904 0.0706508 0.00920486 +-0.0644959 0.084745 0.0443622 +-0.0182219 0.0954777 -0.0312615 +0.0163111 0.0608546 -0.0282401 +-0.0725001 0.120391 0.0535845 +-0.0164977 0.0828905 0.0574138 +0.0130474 0.0490028 0.046739 +-0.072956 0.173805 -0.0388399 +-0.0264766 0.0576077 -0.0284232 +-0.0644961 0.0602892 0.0183972 +0.0357477 0.074144 -0.0137952 +-0.0655596 0.171143 -0.0433207 +-0.0784904 0.133065 0.0521095 +-0.0651287 0.156206 0.0175513 +-0.0205565 0.183109 -0.0139659 +-0.0680156 0.156066 0.0121787 +0.0233417 0.0549864 0.0441504 +-0.0745084 0.134461 0.0510337 +-0.0489659 0.12587 -0.00699728 +-0.0422261 0.0339521 -0.0076663 +0.00337017 0.091416 -0.0329064 +0.040054 0.0998936 -0.00479776 +-0.0939204 0.128289 0.0212475 +-0.0301543 0.157156 -0.0110394 +-0.0456539 0.0606919 -0.0125779 +-0.0534986 0.0833862 0.0450488 +-0.047648 0.0614917 0.0367154 +-0.0486267 0.13356 0.00299082 +-0.0895466 0.0969995 0.0164128 +-0.0339552 0.0695264 -0.0185169 +-0.0176031 0.0711548 0.0545194 +0.0454033 0.0457238 -0.00184235 +-0.0546836 0.0478194 0.0276676 +-0.0875304 0.0861027 0.015468 +0.00919687 0.124582 -0.00824181 +0.0404579 0.0971405 0.0281735 +0.0219677 0.0346711 0.00269802 +-0.0114833 0.0618754 0.0549615 +-0.0209254 0.127401 0.0135903 +-0.0681737 0.074979 0.0383298 +-0.0357386 0.176065 -0.00515676 +0.0340797 0.115381 0.00660331 +-0.0207606 0.0670735 -0.0371287 +-0.075369 0.155134 0.0270903 +0.000773445 0.126081 0.0315854 +0.0414985 0.058326 0.0311197 +-0.03873 0.0340634 -0.0163036 +-0.0929281 0.121393 0.0102886 +-0.0680681 0.061235 0.0168081 +-0.0756991 0.0688679 0.00254149 +-0.0138611 0.0386244 0.0283378 +-0.0806333 0.120347 0.049427 +-0.0534714 0.115278 0.0343029 +-0.0365049 0.169731 0.000981263 +-0.0624922 0.100117 0.0423224 +0.00907886 0.126317 -0.00613291 +-0.0935493 0.125561 0.0262639 +0.022475 0.0933993 0.047467 +-0.015827 0.0921385 -0.0358122 +-0.0210449 0.0384562 -0.0168371 +-0.0207268 0.0612423 -0.0346723 +-0.0134967 0.109686 -0.0201653 +0.0456137 0.0708816 0.00289794 +-0.0090863 0.16966 -0.0247514 +-0.0889386 0.0888873 0.0194501 +-0.0532128 0.133944 -0.00360453 +0.0195053 0.0351963 0.0310168 +-0.0255119 0.104394 0.0424048 +-0.0174974 0.103031 0.0436129 +-0.0299173 0.0383162 -0.0299848 +0.00451386 0.0856474 0.057126 +0.0147725 0.0939169 -0.0254338 +0.0242867 0.0719771 -0.0256393 +0.0172719 0.0348529 0.0254373 +0.0558147 0.064873 0.0261542 +-0.0364911 0.0662596 0.041455 +-0.0758603 0.151341 -0.0198831 +-0.0616679 0.0643653 -0.00651734 +0.0383551 0.0603737 0.0324667 +-0.0477542 0.0782681 -0.0190718 +-0.0550269 0.0560444 -0.00440953 +-0.0395059 0.0972892 0.042147 +-0.0777926 0.167262 -0.0295303 +0.0604641 0.0623144 0.017179 +-0.0777137 0.177848 -0.0500546 +-0.0521757 0.0461175 0.0166821 +-0.0754874 0.130275 0.0528009 +0.0116887 0.0343979 -0.00472037 +-0.0617898 0.16156 -0.0335933 +0.0442649 0.0973538 0.00716867 +-0.0616258 0.0641254 0.029779 +0.00550935 0.0688576 0.0555484 +-0.053845 0.0955972 -0.0217935 +0.00741716 0.0375454 -0.0236134 +-0.0596132 0.113903 0.0363038 +-0.0508811 0.108424 -0.0190099 +-0.0437584 0.079737 -0.0197567 +-0.0733029 0.15632 0.000130521 +-0.003234 0.0960652 -0.0317479 +-0.0575581 0.0507849 0.00163524 +0.00435827 0.129372 -0.0013469 +-0.025212 0.123605 0.0223303 +-0.0669175 0.115159 -0.00990572 +-0.0722654 0.153589 0.032663 +-0.0147591 0.033582 -0.024214 +-0.00115893 0.11911 -0.0142672 +0.019441 0.0384709 -0.0146972 +-0.0772499 0.172214 -0.0459981 +-0.069531 0.14702 0.0417131 +-0.0343373 0.0443897 -0.0277936 +-0.0705699 0.152776 -0.0468148 +-0.0918951 0.117319 0.00831437 +0.0103421 0.0567446 -0.0299462 +-0.0336919 0.119642 -0.0105178 +-0.0629712 0.145905 -0.0115915 +0.00646739 0.0342464 -2.28584e-05 +0.00713618 0.103008 -0.0210892 +-0.018026 0.0384381 0.0276504 +0.0433583 0.0505545 -0.0063311 +-0.0882504 0.0900881 0.0054683 +0.00248872 0.118285 0.0387448 +-0.0227774 0.0713561 -0.0378898 +-0.0154972 0.122303 0.0324651 +-0.0322294 0.0708154 -0.0244722 +-0.025189 0.174162 -0.0196112 +-0.0871031 0.0846537 0.0064784 +0.00836869 0.0928852 -0.0303774 +-0.0424793 0.0958739 0.0423242 +-0.0640607 0.152536 -0.00179872 +0.00949301 0.118213 -0.015379 +0.0461867 0.0806341 0.00618373 +-0.0408599 0.102809 -0.0209257 +-0.0431187 0.159159 -0.0099383 +-0.0154785 0.0828416 0.0569929 +-0.0775215 0.161144 -0.0189221 +0.0358655 0.112954 0.0143927 +-0.0759551 0.131077 -0.00722143 +0.0465282 0.0726943 0.00507292 +-0.0784776 0.134439 0.0514602 +-0.0718916 0.0995338 0.0398851 +0.0174027 0.127944 0.018931 +-0.0494895 0.143125 0.00338457 +0.0333197 0.0357288 0.0133458 +0.0132595 0.0751478 -0.0304595 +-0.0324893 0.100164 0.0432113 +0.0343769 0.112004 0.0266888 +-0.0108703 0.180136 -0.0264173 +-0.0872312 0.1132 0.0437313 +0.0353616 0.106017 0.0302164 +-0.0282335 0.0382933 0.0310718 +-0.0646654 0.132541 0.0415985 +-0.0416682 0.0336125 -0.0201879 +-0.0690362 0.134069 0.0476421 +0.023852 0.057789 0.0449027 +0.0440963 0.0735854 0.0249308 +-0.0624573 0.163073 -0.0525854 +-0.0341025 0.169759 -0.00204136 +0.0589446 0.0649523 0.0051412 +-0.0602752 0.0336649 0.0124615 +-0.0628859 0.1495 -0.0200671 +-0.0722644 0.0671374 -0.000515551 +0.0135851 0.0658847 0.0529797 +-0.00198691 0.0368792 0.0142478 +0.0367682 0.0700097 -0.0138015 +-0.0296169 0.0408892 -0.0298249 +-0.0376612 0.0606745 -0.0122764 +0.00800811 0.0345328 -0.00370443 +0.0105539 0.104067 -0.0202515 +-0.0488192 0.0586801 0.0351334 +-0.0557857 0.0840569 -0.0214422 +0.0308153 0.0525508 -0.0137522 +0.0423969 0.0451283 0.0286278 +-0.0332147 0.036763 0.0499127 +-0.0736682 0.0730938 -0.00832442 +-0.0175484 0.124749 0.0265509 +-0.063425 0.163107 -0.0254606 +-0.0727351 0.0832969 0.03983 +0.0319929 0.088146 -0.0193446 +-0.0444371 0.122416 -0.011439 +-0.0858505 0.116285 0.047652 +-0.00444148 0.0916785 -0.0352643 +0.022957 0.0981907 0.0456622 +-0.053144 0.0595659 0.0253997 +-0.0788525 0.107465 0.0324362 +-0.0457478 0.130844 0.0207105 +-0.0684896 0.172346 -0.0400602 +-0.034733 0.0498868 -0.0123113 +0.0415062 0.0499285 0.0325086 +-0.0665679 0.0404538 -0.00528616 +-0.00650346 0.112991 -0.0197156 +-0.0448474 0.0999398 -0.0215303 +-0.0816586 0.137613 -0.00180043 +-0.0585618 0.124728 -0.00774237 +-0.0466281 0.0592297 -0.0120314 +-0.0670784 0.0653289 0.0275882 +-0.0835882 0.125784 0.0507488 +-0.0164643 0.0842755 0.0572298 +-0.0904705 0.135055 0.0132171 +-0.022546 0.116788 0.03495 +-0.0334891 0.091814 0.044517 +-0.0719917 0.151909 0.0358108 +-0.0151953 0.168341 -0.0151527 +-0.0590718 0.156479 0.0080978 +-0.0154402 0.120098 -0.0111735 +-0.036496 0.17271 -0.000384966 +0.0392898 0.0993144 0.028831 +0.024983 0.0795787 0.048494 +0.0483695 0.0734096 0.0143189 +0.0196959 0.0394038 0.04222 +-0.00886334 0.103392 -0.0235214 +-0.0118005 0.0841384 -0.0387163 +0.0252205 0.0888413 -0.0232794 +0.0298168 0.052105 0.0376191 +-0.0776927 0.169444 -0.0419634 +-0.0314915 0.057461 0.0373842 +-0.0504539 0.0558071 0.0326022 +0.0138422 0.0901622 -0.0294996 +-0.0510104 0.149266 0.0138316 +-0.0341485 0.0337694 0.0159272 +-0.085608 0.144617 0.0380805 +-0.0475132 0.0875996 0.0450977 +-0.091127 0.143391 0.0261688 +-0.0781968 0.0778917 0.0320122 +0.0284509 0.104793 -0.0149826 +-0.0223025 0.0957816 -0.0275832 +-0.0179573 0.123303 -0.00653742 +0.0369901 0.111103 0.00416682 +-0.0643667 0.159406 -0.0155654 +-0.0701684 0.165994 -0.0191552 +-0.0863906 0.0819518 0.00951177 +-0.0224965 0.100254 0.0443771 +-0.0757302 0.147214 -0.00986768 +0.0357939 0.0699287 -0.0148404 +-0.0376499 0.0577418 -0.0112619 +0.019292 0.0988007 -0.0225555 +-0.00992376 0.097544 0.0521376 +-0.0493712 0.0572598 0.0342952 +0.0255474 0.054922 0.0420386 +-0.0494259 0.144129 0.00171058 +-0.0624989 0.104282 0.0409609 +-0.0430319 0.0336432 -0.0167728 +0.0179185 0.121996 -0.0074786 +-0.0190623 0.127503 0.00554509 +-0.0474205 0.145822 -0.000777163 +0.0526083 0.0475984 0.0212218 +0.00022388 0.0797271 -0.0356555 +-0.0301525 0.168207 -0.0169318 +-0.00151732 0.0576213 0.0542293 +-0.00248496 0.0548872 0.0545581 +-0.0502022 0.12654 -0.00566411 +-0.0529063 0.0676787 0.0373317 +0.00249985 0.107203 0.0424791 +0.0029144 0.125773 -0.00745627 +0.00334453 0.0496343 -0.0297987 +0.00449641 0.11692 0.039168 +0.0399282 0.041091 0.0244564 +0.0178192 0.126124 0.0248053 +-0.0799402 0.132433 -0.00455304 +-0.0649027 0.179945 -0.0575726 +0.0404255 0.0914089 -0.00978781 +-0.065797 0.132562 0.0435297 +-0.0372368 0.172627 -0.0118528 +-0.0554974 0.10569 0.0407246 +-0.076892 0.165957 -0.0247772 +-0.0587093 0.0344925 0.0418625 +0.00823978 0.0768076 -0.0338586 +-0.0626545 0.150596 -0.0225786 +-0.0384668 0.0931237 0.0434147 +0.0141618 0.0576523 0.0502255 +-0.0683767 0.176522 -0.0580176 +-0.0129882 0.119781 -0.0128781 +0.00848559 0.0950467 0.0516302 +-0.0429797 0.127137 -0.00436425 +-0.0497252 0.141657 0.00538484 +-0.0179056 0.127636 0.0191062 +-0.0520277 0.0563658 0.0215194 +-0.02384 0.0968692 -0.0247025 +-0.0561697 0.0684762 0.0377129 +0.0120601 0.0343849 -0.00838478 +0.0299331 0.0362092 0.00288494 +-0.0763652 0.1528 -0.0108857 +-0.0736067 0.154075 -0.0289008 +0.00533532 0.0538992 -0.0301758 +-0.0599208 0.0394628 0.0453423 +-0.0184879 0.0856371 0.0571362 +-0.0208094 0.0376226 -0.0178912 +-0.0137231 0.183161 -0.0241068 +-0.0648137 0.0346657 0.0352478 +-0.0271872 0.0379033 0.0118238 +0.0264669 0.0477487 0.0380114 +-0.0723733 0.0352474 0.00704331 +-0.0322701 0.0835031 -0.0295487 +0.0272688 0.122366 0.00977001 +-0.0603093 0.0652594 0.0325934 +-0.00180254 0.0385071 0.00372255 +-0.0522762 0.123638 -0.00859751 +-0.0776201 0.171284 -0.03689 +-0.0802965 0.0872747 0.0345612 +-0.0889001 0.136394 0.00820864 +0.000412609 0.0393166 0.0342543 +-0.0642567 0.0344972 0.033776 +-0.0921303 0.11612 0.0363104 +-0.0679654 0.134068 -0.0084026 +-0.0839818 0.115583 0.0478751 +-0.00536465 0.129031 -0.000823415 +0.00514522 0.103044 -0.0216473 +-0.0496209 0.0517545 -0.00857532 +-0.0757023 0.177226 -0.0456228 +-0.0298766 0.05514 -0.0203901 +-0.0861039 0.0846923 0.0224682 +-0.0238144 0.0879301 0.05313 +-0.0611505 0.153585 0.0321143 +-0.0917527 0.113836 0.0170127 +-0.0374964 0.0591338 0.0402834 +-0.0187977 0.0799028 -0.0389405 +-0.0680553 0.17056 -0.0341587 +-0.0658521 0.0361993 0.0388506 +0.0111435 0.100252 -0.0225401 +-0.0425873 0.125894 -0.0070983 +-0.0265027 0.0498541 0.0461184 +0.00111147 0.110147 -0.0201294 +-0.00249391 0.119678 0.0379989 +-0.0117585 0.0742488 -0.0381827 +-0.0586841 0.0466878 -0.00234651 +0.0295244 0.0750328 -0.0218147 +-0.0218606 0.101624 -0.0238704 +0.0287102 0.0942447 0.0434182 +-0.0709345 0.0627948 0.0166551 +-0.0225064 0.10717 0.041634 +-0.0335027 0.074683 0.04142 +-0.092242 0.128315 0.0292604 +-0.0374976 0.0888821 0.0433743 +0.0303768 0.0578247 0.0402716 +-0.00891857 0.0338467 -0.0251248 +-0.0533378 0.162724 0.0010506 +-0.0869041 0.141929 0.0394374 +-0.047972 0.135544 0.0173874 +0.0485157 0.0597129 0.0310438 +-0.00667005 0.0904165 -0.0359686 +-0.0759966 0.0994807 0.0369297 +-0.0625222 0.149113 -0.00558111 +-0.0718118 0.14996 0.0389054 +-0.0844416 0.147376 0.00515339 +-0.0165344 0.0392124 0.0380479 +-0.079893 0.0949635 -0.0095262 +0.0236407 0.0347514 0.0177381 +-0.0196654 0.0683158 0.0524244 +0.0245994 0.0981921 0.0445203 +-0.0849795 0.0952966 -0.00257745 +-0.0528207 0.121242 0.0358805 +-0.0236049 0.0394052 -0.0289635 +-0.0332166 0.165305 -0.0043102 +-0.0251865 0.160795 -0.0139572 +-0.0865509 0.152927 0.0144746 +-0.0693964 0.157876 -0.00437702 +-0.0628145 0.169399 -0.0485883 +-0.0643644 0.153473 -0.0380226 +-0.081904 0.115723 0.0482136 +0.0101277 0.0911581 -0.0305812 +-0.0405043 0.0944618 0.0422679 +0.021919 0.118008 0.0336347 +-0.0203338 0.123782 -0.00500918 +0.0111252 0.108699 -0.019265 +-0.0574976 0.0776487 0.0433498 +-0.0354848 0.0987251 0.0428224 +-0.0651932 0.141087 0.0409428 +-0.0240513 0.0386342 -0.0120079 +0.039324 0.106993 0.0191699 +-0.0754947 0.142836 0.0460912 +-0.0122699 0.0338184 -0.0220638 +-0.0246982 0.0551057 0.0409028 +-0.0578691 0.105465 -0.0183362 +-0.0264983 0.10435 0.041876 +-0.07915 0.166638 -0.0349654 +-0.0578202 0.140285 -0.0045343 +0.0220783 0.0686046 0.0476717 +-0.0770892 0.107143 -0.00760422 +-0.0902136 0.13513 0.0232187 +-0.0723372 0.156305 0.0208189 +-0.0650055 0.135525 -0.0079735 +-0.0549293 0.154823 0.0139773 +0.0292317 0.0773621 -0.0219141 +-0.0817276 0.0964548 -0.00656413 +-0.018203 0.175668 -0.0239316 +-0.0553377 0.0457536 -0.00639551 +-0.0161975 0.0432999 0.0517769 +0.0304284 0.0383851 -0.001443 +-0.0345483 0.152531 -0.00560476 +-0.0629676 0.160574 -0.0208244 +-0.0935783 0.124186 0.0262856 +-0.0311645 0.0580869 -0.017406 +-0.0317989 0.0382037 0.00155838 +0.0576172 0.0686777 0.0217698 +-0.00505811 0.0339518 -0.0207718 +-0.0696447 0.166615 -0.0510113 +-0.0629867 0.155807 0.0241223 +-0.0340215 0.0794269 -0.0255119 +-0.0867747 0.0981404 0.0024092 +-0.0880604 0.13085 0.0022566 +0.0184887 0.0948214 0.0475148 +-0.021497 0.0988475 0.0444941 +-0.0416678 0.0592681 -0.0121392 +-0.0567258 0.0480405 0.0316684 +-0.0423133 0.129133 0.00872164 +-0.000508444 0.105851 0.0435843 +-0.0592465 0.046889 0.0316721 +0.0461219 0.0806353 0.0161697 +-0.0281528 0.0348412 0.0481365 +-0.0702797 0.180333 -0.0522624 +-0.0478122 0.134031 0.00640478 +-0.0077489 0.0713239 -0.0366154 +-0.0122439 0.168894 -0.023749 +0.0212552 0.0777078 -0.0266851 +-0.0917522 0.132325 0.0122241 +-0.0361034 0.165201 -0.01444 +-0.052501 0.0805516 0.0443114 +-0.0654153 0.0336345 0.00606909 +-0.0623235 0.139333 -0.00679766 +-0.0616576 0.170967 -0.0555865 +0.00174509 0.0392548 -0.00741822 +-0.0260001 0.0677977 0.0418131 +-0.0684331 0.0336931 0.00540027 +-0.0448348 0.0942101 -0.0220316 +-0.0731091 0.158237 -0.0329184 +0.0078778 0.0989406 -0.0227671 +0.0314417 0.115539 0.0270138 +-0.00906667 0.129748 0.004892 +0.00649868 0.108551 0.0413323 +-0.0382124 0.150071 -0.00262103 +0.0332799 0.0564373 0.0374441 +-0.00349826 0.0647878 0.0565544 +-0.0487816 0.084091 -0.021606 +-0.0568391 0.118972 -0.0116757 +-0.0644875 0.156696 -0.0456027 +-0.0411616 0.152146 0.00524032 +-0.0636742 0.142603 -0.0078783 +-0.0711318 0.0777267 0.0384114 +0.00321355 0.0796602 -0.0346071 +0.00447281 0.110003 0.0420134 +-0.0174998 0.0772311 0.0559767 +-0.0263139 0.182659 -0.010558 +-0.0322455 0.15809 0.00238998 +0.045843 0.0760483 0.0203743 +-0.0548028 0.0464121 0.0246755 +-0.0376206 0.0376543 -0.029358 +-0.0523414 0.0402098 0.0465679 +-0.0432186 0.121963 0.0262727 +-0.0321664 0.125608 0.018357 +-0.0857232 0.0792432 0.0155047 +-0.0782439 0.151233 0.0351897 +-0.0187146 0.058392 -0.0343021 +0.0452185 0.0847535 0.00320441 +-0.0640415 0.167322 -0.0369994 +-0.0823499 0.132665 0.0507367 +-0.0301219 0.0493909 -0.0214267 +-0.0843946 0.0818335 0.0225112 +-0.0246526 0.0386383 0.0332956 +0.0563147 0.0580894 0.0250386 +0.00021169 0.0389894 0.029096 +-0.00241379 0.126666 -0.00637642 +-0.0301429 0.0551656 -0.0193914 +0.0331811 0.0417541 0.0279348 +-0.0861938 0.104994 0.0213645 +-0.0824118 0.0788951 -0.000494108 +-0.0743937 0.157452 -0.00470821 +0.0187225 0.127515 0.0179893 +-0.0829047 0.0763015 0.0175246 +-0.0650238 0.0641454 0.0272956 +0.0355567 0.0878311 -0.0169845 +-0.0887171 0.117597 0.0462102 +-0.0760085 0.141318 -0.005968 +-0.0127703 0.0756733 -0.0384193 +-0.0158456 0.122449 -0.00760827 +-0.0842393 0.107513 0.00238784 +-0.0674898 0.0986608 0.0416951 +-0.0554949 0.0427291 0.0458455 +-0.0201912 0.0383436 0.00560257 +-0.0372682 0.0344921 0.0377782 +-0.0357437 0.0380351 0.0467216 +-0.0450103 0.054631 0.0385549 +-0.0369768 0.047531 -0.0185543 +0.0520769 0.0581909 0.0294992 +-0.0329038 0.153455 -0.00604291 +-0.0725184 0.128806 0.0519752 +-0.0270556 0.0706113 0.0413767 +-0.0285061 0.116641 0.0323888 +-0.0144886 0.109993 0.0419529 +-0.0285168 0.0803552 -0.0356291 +0.00952067 0.0702149 0.0551678 +-0.0355616 0.151785 -0.00432824 +-0.0826529 0.0796856 0.0277856 +-0.0365963 0.127614 0.0137714 +-0.0657008 0.139678 0.041893 +-0.0758694 0.0777615 0.0343673 +-0.00737907 0.0367231 0.0491533 +-0.0704775 0.114632 0.0510417 +-0.059558 0.128315 0.0402204 +-0.0538405 0.0941624 -0.0218364 +-0.0274601 0.124651 0.00100866 +-0.0637125 0.0705931 -0.0131267 +-0.0644549 0.043254 0.0326925 +-0.0746657 0.154121 -0.0198989 +-0.0348879 0.043516 0.0457289 +-0.0234602 0.17569 -0.0129988 +-0.0720698 0.176015 -0.0442709 +-0.043544 0.157959 0.00535766 +-0.0407405 0.0739506 -0.0180651 +-0.0696125 0.150354 -0.0430103 +0.0418343 0.0943991 0.0271656 +-0.0932461 0.129666 0.0232459 +-0.0398464 0.0957237 -0.0225845 +-0.0764914 0.171559 -0.0359139 +0.0408836 0.0614281 -0.00367417 +-0.0356978 0.0346221 -0.0180732 +-0.0895729 0.151493 0.0191084 +0.0263253 0.122966 0.0165355 +0.0113407 0.0567362 -0.0298085 +-0.0736511 0.180693 -0.0540178 +-0.042544 0.16227 0.00511409 +-0.0522198 0.0374253 0.0467614 +-0.0777691 0.0689598 0.0151422 +0.0463347 0.0428813 0.020444 +0.0509435 0.0554131 0.029582 +0.0233146 0.125046 0.00829766 +0.00834665 0.0958673 -0.0275066 +-0.00680856 0.127356 -0.00506622 +-0.0554704 0.157309 0.00940753 +-0.0754721 0.103526 0.0362863 +0.044978 0.086159 0.0221711 +-0.0716236 0.170198 -0.0283222 +-0.0196387 0.0464931 -0.0280998 +0.0569791 0.0686933 0.0226042 +-0.0233118 0.182976 -0.0180572 +0.0290367 0.060539 0.0418753 +-0.0708458 0.0980019 -0.0152545 +-0.044501 0.0562098 0.0390177 +-0.00787685 0.105931 -0.0227718 +-0.0774743 0.140015 0.0480697 +0.0275361 0.10477 0.0382193 +0.00254476 0.127971 -0.00383507 +0.0235041 0.108407 0.0388101 +-0.055098 0.146723 0.029184 +-0.0257112 0.0634738 0.0402437 +0.0222133 0.103397 0.0428172 +0.0239484 0.0901184 -0.0234122 +-0.0265532 0.080945 0.0504296 +-0.0801014 0.0881671 -0.00858727 +-0.0467634 0.0560036 0.0374321 +0.0562967 0.0661688 0.0251012 +-0.0323569 0.124066 -0.00320487 +-0.00891511 0.126415 -0.00600997 +0.0343206 0.094597 -0.0141158 +-0.0876587 0.151372 0.0112162 +-0.0723621 0.114661 0.051285 +-0.033385 0.126374 0.00317306 +-0.0465636 0.146777 -0.00183655 +-0.0086601 0.174145 -0.0268323 +0.0224333 0.0422246 0.0409441 +-0.0723219 0.171178 -0.0314543 +-0.0633454 0.159973 -0.0185957 +-0.0741825 0.156237 0.0158024 +0.0283215 0.117455 0.0287048 +-0.0518625 0.050332 0.0226347 +-0.0345112 0.112532 0.034973 +0.0102504 0.0766955 -0.0323547 +-0.0628937 0.146875 -0.0135938 +-0.0913593 0.126907 0.0414668 +-0.0755221 0.11896 0.0528247 +-0.0186351 0.0933648 0.0534492 +-0.00679579 0.0826768 -0.0377354 +0.00822704 0.0782053 -0.033734 +-0.0942744 0.126919 0.0202522 +-0.0462848 0.131856 0.0204922 +-0.05065 0.0706021 0.0388719 +-0.00522459 0.0384215 0.0122026 +-0.0524927 0.0987339 0.0429361 +-0.0388306 0.112851 -0.0174267 +-0.0268641 0.101582 -0.02361 +-0.0846396 0.153647 0.0136585 +0.0166715 0.0353808 -0.0156588 +-0.0553627 0.139574 0.0304759 +-0.0257886 0.0768981 -0.036857 +-0.0402218 0.0342366 0.0285657 +-0.045101 0.156152 -0.00816042 +-0.0348248 0.0473223 0.0413292 +0.0145592 0.0672414 0.0526521 +-0.0436275 0.0548777 -0.0111987 +-0.0248971 0.163359 -0.0156802 +-0.0449755 0.115277 -0.0159431 +-0.0492995 0.0345621 0.0403913 +-0.0257365 0.0348667 0.0503471 +-0.0754593 0.159053 -0.00907047 +-0.0632614 0.0601538 0.00426714 +-0.0265686 0.0382637 0.0296453 +-0.0355718 0.165308 -0.0024565 +-0.0727498 0.180616 -0.0549771 +-0.0381364 0.171203 -0.0118442 +0.0153228 0.0362397 0.00366285 +-0.0383106 0.0336688 0.00433881 +-0.0125102 0.0897843 0.0566766 +-0.0484982 0.0890084 0.0450201 +-0.0889791 0.0915153 0.00944503 +-0.0511466 0.124736 -0.0077758 +-0.00758688 0.0376797 -0.0254717 +-0.0509981 0.147813 0.0138388 +-0.0147745 0.0382944 0.014 +-0.0305049 0.0617476 0.0379767 +-0.0109155 0.0356188 0.0494667 +-0.0703667 0.142544 -0.0104932 +-0.0424925 0.0902452 0.0426486 +0.0099296 0.113714 0.0390911 +0.0145599 0.088488 -0.0297413 +-0.00249512 0.122376 0.0359373 +-0.0216559 0.0972103 0.0449705 +-0.0717874 0.0850294 -0.0163139 +0.0281202 0.0348895 0.0148787 +-0.0582075 0.154657 0.0258383 +0.0103893 0.0434318 -0.0247637 +0.0283214 0.115107 0.0315696 +-0.0408808 0.115001 -0.0156637 +-0.0569818 0.0548922 0.00263009 +-0.0347008 0.0666358 -0.0153327 +-0.0518449 0.146252 0.0164181 +-0.0388328 0.0943088 -0.0230504 +-0.0315145 0.0788556 0.0411289 +0.0268942 0.0988154 -0.0185978 +-0.0875561 0.0968363 0.00343541 +0.0426825 0.0805137 0.0283126 +-0.0683872 0.0690317 0.0328821 +-0.0609319 0.0343399 0.0363539 +-0.0258016 0.0867079 -0.0364604 +-0.0891389 0.120288 0.0465529 +-0.062692 0.155999 0.0140721 +0.0223974 0.0473356 -0.0199928 +-0.0616833 0.0676348 -0.0109359 +-0.0752375 0.0864841 -0.0145142 +0.014283 0.0681091 -0.0306905 +-0.0603219 0.0470192 0.0356706 +-0.015495 0.104397 0.0428489 +-0.0698499 0.0994423 -0.0150141 +-0.0293842 0.08757 0.0444817 +-0.00548831 0.112771 0.0416249 +-0.0120723 0.0353434 0.0494553 +0.0118631 0.0894057 -0.0307263 +0.0362901 0.0769906 -0.0138255 +-0.0372663 0.033541 -0.0229762 +0.0110129 0.0846936 0.0546683 +-0.0563673 0.0575771 -0.00141956 +0.0162242 0.0835192 -0.0290783 +-0.0466776 0.13337 0.0173732 +0.0116668 0.0548951 0.0518589 +-0.0175019 0.0758159 0.0556202 +-0.0865692 0.133541 0.00131146 +-0.0366797 0.0636525 -0.0138021 +-0.074087 0.0734714 0.0331119 +-0.0762512 0.156264 -0.00677505 +-0.0414995 0.168206 0.00296291 +0.0023065 0.128418 0.0277808 +-0.0141822 0.0378114 0.0510973 +-0.0674332 0.127053 0.0499702 +-0.0482072 0.0335431 -0.012174 +-0.072499 0.117558 0.0529308 +-0.0281279 0.03862 -0.0128123 +-0.0616129 0.149191 -0.00221638 +0.0436181 0.0416961 0.0210317 +-0.0758657 0.097813 -0.01246 +-0.0818672 0.120683 -0.00433302 +0.00940058 0.0342529 -0.0182643 +-0.018805 0.0625267 0.0503254 +-0.053876 0.126919 0.0361236 +-0.0884983 0.0941957 0.00744581 +-0.0165005 0.120964 0.0336371 +0.0433486 0.0519969 -0.00665823 +-0.0624811 0.149792 0.0367836 +-0.0615025 0.16984 -0.0615386 +-0.0364388 0.0352264 0.0443258 +0.0340769 0.0556934 -0.0107486 +-0.00261634 0.0450445 -0.0274328 +-0.0328486 0.0986298 -0.0228073 +0.0198481 0.0795335 0.0516115 +-0.0599778 0.148254 0.0362061 +-0.00849422 0.0674811 0.0555845 +-0.0530196 0.144246 -0.000696127 +-0.0836424 0.0924862 -0.00555232 +-0.0691184 0.165207 -0.0519806 +-0.0305063 0.111166 0.0367005 +-0.0447319 0.125394 0.0226968 +-0.0165708 0.056922 0.0510974 +-0.0568794 0.0548721 0.000601057 +-0.0355126 0.10012 0.0421792 +-0.00149054 0.131258 0.0163007 +-0.0814469 0.0761204 0.000521161 +-0.0700369 0.0765697 0.0383694 +-0.0791449 0.166643 -0.0339646 +0.0151117 0.0434234 0.0444141 +-0.0568399 0.0344097 0.0371692 +-0.0180623 0.177182 -0.017491 +0.0492456 0.0728121 0.0176064 +-0.0178752 0.105871 -0.0225888 +0.00334696 0.0342028 0.0159318 +0.0153617 0.0344714 0.021761 +-0.0945397 0.121475 0.0202819 +-0.073516 0.18065 -0.0535934 +-0.0934071 0.117385 0.0163015 +-0.0631359 0.0699525 0.0366992 +-0.0252161 0.0550594 0.0400126 +-0.00605897 0.125119 0.0321155 +-0.0360017 0.17408 -0.0118959 +-0.00638198 0.124385 -0.00985914 +-0.0145975 0.0378025 -0.0168233 +0.00417447 0.127894 0.028461 +-0.0410286 0.0345047 0.0334549 +0.0292997 0.0538256 -0.0177694 +0.0372061 0.0980869 0.0328651 +-0.0745356 0.104026 0.0368301 +-0.00436707 0.0386778 0.0266309 +0.0189949 0.0449386 0.0430002 +0.00529011 0.0668325 -0.0327227 +0.00166319 0.130955 0.0203219 +-0.0905947 0.115833 0.0426569 +0.00338984 0.116722 -0.0177517 +0.0203176 0.126182 0.0214303 +-0.0598293 0.139488 -0.00569497 +0.0142784 0.11622 -0.015243 +0.0231289 0.0835821 0.0493611 +0.0515475 0.0540038 0.0286923 +-0.0317664 0.058161 -0.0143983 +-0.0397537 0.0782783 -0.0191449 +0.012627 0.12184 0.0342326 +-0.0823735 0.148711 0.0361489 +-0.012301 0.110982 -0.0195491 +-0.0883046 0.122998 0.0470686 +-0.0315077 0.113893 0.0345441 +-0.0888952 0.137894 0.0271916 +-0.0610259 0.126912 0.0416133 +-0.0475344 0.05323 0.0369443 +-0.00961348 0.0434416 -0.0262361 +-0.0541404 0.124102 0.0375109 +0.0509994 0.044648 0.0132154 +0.0303038 0.118886 0.0223059 +-0.0596345 0.0336285 0.0108415 +-0.0196267 0.0450293 -0.0277098 +-0.0247099 0.0381195 0.00851258 +-0.0774982 0.133088 0.0521596 +0.0276359 0.0629152 -0.0215123 +0.0535119 0.0717543 0.00602975 +-0.0334971 0.0831472 0.0419572 +-0.0596476 0.14187 -0.00422882 +-0.0924522 0.125595 0.0392516 +-0.068714 0.143769 -0.0144235 +-0.0468988 0.126761 -0.00595632 +-0.0303571 0.0537911 -0.0173707 +-0.0709316 0.147597 -0.0300096 +-0.0514754 0.115278 0.0338114 +0.0190263 0.120653 0.0329746 +-0.0340031 0.1089 -0.0192874 +-0.0335001 0.116617 0.0321346 +-0.0671562 0.0724925 0.0371747 +-0.0746759 0.152711 -0.0238933 +-0.0590669 0.120714 -0.00943474 +0.00548706 0.108567 0.0416722 +-0.0114996 0.101652 0.0440245 +-0.0649779 0.141437 -0.00794337 +0.0112608 0.130411 0.00668952 +0.0436616 0.0987354 0.0121603 +-0.0558948 0.101262 -0.0199275 +-0.0309036 0.0436875 0.0502489 +0.0142962 0.0652331 -0.0300484 +0.000574283 0.0347216 0.0149023 +-0.00623443 0.0389648 -0.00688285 +-0.0810472 0.147398 0.0390836 +-0.0491606 0.0375682 0.0458781 +-0.055978 0.0534457 0.00767233 +-0.0685375 0.17487 -0.0458569 +0.0289287 0.100617 -0.0165368 +-0.0709835 0.0353942 0.00988845 +0.0337836 0.0754424 0.0400679 +0.041497 0.0527902 0.0324777 +-0.0204109 0.178661 -0.0155986 +-0.0623894 0.149097 -0.0105741 +-0.0644192 0.16051 -0.0170316 +-0.0350535 0.0346922 0.0433273 +-0.0740398 0.145796 -0.011857 +0.0214237 0.0444841 -0.0187153 +-0.0570526 0.113331 -0.0158151 +0.0134717 0.127798 0.0260714 +0.0324011 0.0446474 -0.00561054 +0.00231866 0.0568936 -0.0320023 +-0.0273763 0.112504 -0.0170987 +-0.0224223 0.072452 0.0507888 +-0.0614531 0.154118 0.0305097 +-0.0222065 0.179998 -0.0209469 +0.00315207 0.102056 -0.0221009 +0.0413778 0.0561233 -0.00592276 +0.037882 0.105959 0.026802 +-0.0607248 0.0722644 -0.016058 +0.00061382 0.126415 -0.00611002 +0.0592992 0.0566775 0.0181738 +0.0474969 0.0638142 0.0292952 +-0.0321069 0.162239 -0.0144989 +-0.0520198 0.147215 -0.00210798 +-0.0819286 0.0748755 0.0145293 +-0.0333602 0.0339348 0.0195439 +-0.0555018 0.0987713 0.0432834 +-0.0630837 0.164691 -0.0325918 +-0.0473982 0.0343754 -0.0164682 +-0.0807821 0.0980376 0.0332837 +-0.0645109 0.0370591 -0.00764757 +-0.085403 0.141865 0.00516647 +0.0420715 0.0859357 0.0292923 +0.0391529 0.107674 0.00402907 +0.024552 0.110059 0.0374287 +-0.0631521 0.0360725 0.0429133 +-0.0619885 0.156033 0.0186659 +-0.024223 0.17569 -0.0123366 +-0.0138299 0.0392302 0.0367944 +-0.0306217 0.126038 0.0115365 +-0.0714938 0.120397 0.053531 +-0.0869305 0.151358 0.010227 +-0.0788893 0.125151 -0.00625598 +-0.0447778 0.0409599 -0.0173005 +-0.09234 0.131039 0.0252374 +0.0321511 0.0724311 -0.0187615 +-0.0735819 0.0777026 -0.0122023 +-0.0678037 0.166983 -0.024036 +-0.0897153 0.135171 0.0332079 +-0.0447805 0.0840976 -0.0212945 +0.0371007 0.10968 0.00116733 +0.0112368 0.0836448 -0.0310335 +-0.036484 0.0505609 0.038833 +-0.0118972 0.116803 -0.015741 +-0.0346708 0.0621866 -0.0131726 +-0.0397664 0.0812015 -0.0202928 +-0.069532 0.172114 -0.0375728 +0.00626682 0.131047 0.00486423 +-0.0590022 0.0579904 0.014414 +-0.00972298 0.0642282 -0.0359259 +-0.0269413 0.181454 -0.0140289 +0.033222 0.0842418 -0.0188996 +0.00639168 0.0433788 -0.024537 +0.00926262 0.129557 0.000393265 +-0.00751646 0.0732149 0.0579299 +-0.0513203 0.142869 0.00077197 +-0.0288553 0.0385536 -0.0110371 +0.0555265 0.0728462 0.0170262 +-0.085954 0.146023 0.00719275 +-0.0371011 0.0461641 -0.0234326 +0.0579592 0.0537863 0.0201793 +0.0104003 0.0418913 -0.0239147 +-0.0396188 0.0505923 -0.0110041 +0.0326207 0.0944486 -0.0159568 +-0.0170933 0.0554767 0.0502631 +-0.0891859 0.139294 0.0371595 +-0.0637097 0.166224 -0.0345967 +0.00422867 0.0824562 -0.0341922 +-0.0594261 0.151258 -0.000475846 +-0.0552814 0.0464664 0.0256754 +-0.0424851 0.0776249 0.0430145 +0.0184693 0.111176 0.038468 +-0.0294978 0.0574079 0.0367222 +-0.0435452 0.0405422 0.0435069 +-0.0600989 0.0598417 0.00157193 +0.0526979 0.0525681 0.0268245 +-0.0625031 0.0602955 0.00246046 +-0.0675133 0.108346 0.0377589 +-0.00349512 0.111424 0.0424267 +-0.00549779 0.110034 0.0429298 +0.0164758 0.0713296 0.0519403 +0.0458506 0.0876137 0.00718075 +0.0244747 0.0400424 -0.00510986 +0.00547063 0.131454 0.017409 +-0.0728779 0.117943 -0.00788041 +-0.0142717 0.17714 -0.027303 +-0.0257193 0.0617764 -0.0314442 +-0.050991 0.0504175 0.03464 +0.00152343 0.0759482 0.0573355 +-0.0304944 0.064586 0.038393 +0.016253 0.0794879 0.0534651 +-0.00764651 0.0496471 -0.0308946 +-0.077844 0.0743656 -0.00558198 +-0.0326464 0.0563525 -0.0113988 +-0.061813 0.175696 -0.0586065 +-0.0681691 0.0682156 0.031879 +-0.0493845 0.0657885 0.0368321 +-0.019309 0.0362824 -0.0277788 +-0.063712 0.167032 -0.0383216 +-0.0379003 0.123041 0.0266516 +-0.000679533 0.0554388 -0.0315999 +-0.0886752 0.135106 0.0413889 +0.011146 0.128332 0.0266558 +-0.0740639 0.178692 -0.0478641 +-0.0809318 0.142082 0.0447817 +-0.00975763 0.0742329 -0.0379217 +-0.0600964 0.0334795 0.00370066 +-0.0566436 0.0657735 0.0346839 +-0.0767139 0.070678 0.0244626 +-0.0810351 0.0787684 -0.0035164 +0.0405001 0.076619 0.0321646 +-0.0283979 0.155793 -0.00852382 +-0.0535904 0.0617699 -0.00886774 +-0.0149347 0.127911 0.00262222 +-0.0197362 0.181499 -0.0230211 +-0.0781409 0.0718256 0.0231698 +-0.0337588 0.121858 0.0267132 +-0.0741051 0.0686193 0.025039 +0.0417534 0.0788713 -0.00674491 +-0.0515024 0.0340065 0.0263967 +-0.0763933 0.111249 -0.00565203 +-0.0538034 0.0898608 -0.0222645 +-0.000575856 0.0980296 -0.0278345 +0.0581094 0.0704417 0.00814168 +-0.0891434 0.137902 0.0291936 +0.00340212 0.0390598 -0.024445 +-0.0620333 0.153738 -0.0275809 +-0.0177087 0.0584461 -0.0348025 +-0.0823897 0.104663 0.0290404 +-0.0194981 0.10024 0.044034 +0.0242883 0.0705502 -0.0254969 +-0.0899225 0.133822 0.0382154 +-0.0195055 0.108574 0.0413935 +-0.0446392 0.0548635 -0.0110876 +0.00035867 0.048192 -0.0299591 +0.0364284 0.0413843 -0.00274773 +0.0187875 0.0351105 0.0327558 +-0.0568852 0.111179 -0.0170834 +0.0118445 0.0806629 0.0540991 +-0.0687285 0.155709 0.0264626 +0.00655625 0.109588 0.0412446 +0.00917706 0.113608 -0.0184169 +-0.0613933 0.155777 0.0101812 +-0.0314952 0.0903684 0.0441958 +0.0124021 0.0448701 -0.0249804 +-0.0241038 0.0865955 0.0534593 +-0.0631641 0.149054 -0.0215452 +-0.0401934 0.0365351 0.0429119 +-0.0898981 0.135185 0.0362087 +-0.0526397 0.0618282 -0.00966488 +-0.0844214 0.0777776 0.012517 +0.0222568 0.0748707 -0.0265095 +-0.0150366 0.0384845 0.00106724 +0.0180702 0.0879847 -0.0272411 +-0.0142291 0.127243 0.024765 +0.0382486 0.104643 0.0273123 +-0.0748494 0.0964384 -0.0137204 +-0.0808743 0.136754 0.0491531 +-0.0568962 0.0970004 -0.0209687 +-0.0803034 0.072641 0.00422068 +-0.0584156 0.0459799 0.0422363 +-0.0579142 0.114001 -0.0151155 +-0.0561079 0.0571065 0.0121919 +0.00037651 0.0978532 -0.0276151 +-0.0336642 0.082217 -0.0255373 +0.0457702 0.0735931 0.00320764 +-0.056498 0.07472 0.0419593 +0.00305684 0.124987 -0.00863513 +-0.0272404 0.0877435 0.0480762 +-0.040496 0.0577326 0.0402811 +-0.0202415 0.0392282 0.0390567 +-0.020926 0.0334921 -0.0253378 +-0.0690953 0.0751628 0.0379926 +-0.0520047 0.0344961 0.0416004 +-0.0141843 0.128965 0.0174774 +0.0288353 0.0368345 0.0223773 +-0.0444076 0.0394861 -0.0222996 +-0.0838483 0.119157 -0.00284212 +-0.0034971 0.0732704 0.0586485 +-0.03681 0.0886191 -0.0239226 +-0.0669297 0.105269 -0.0144963 +-0.07603 0.0941366 0.0385416 +-0.0716625 0.145448 -0.0198949 +-0.0165056 0.0382425 0.0100681 +-0.0909349 0.113307 0.0123445 +-0.0192269 0.0381483 0.0222601 +0.026296 0.0862676 0.0469202 +-0.0118259 0.0386358 0.028745 +-0.0513331 0.0334323 -0.00718543 +-0.0685946 0.0353745 -0.00558788 +-0.0370306 0.151785 -0.00571407 +-0.0891386 0.129503 0.00423129 +-0.0447856 0.0348265 0.00740272 +0.040097 0.105566 0.00218117 +0.00862183 0.120558 -0.0139068 +-0.0679053 0.171131 -0.036968 +0.0164071 0.0345184 0.0219352 +-0.0501179 0.137029 0.00241503 +0.0125996 0.0459414 0.0443461 +-0.0654928 0.0818627 0.0433416 +-0.0215596 0.0891328 -0.036783 +-0.0685096 0.147001 0.0412847 +0.0400896 0.0702922 -0.00980716 +-0.0291528 0.0378835 0.0276599 +-0.0624944 0.145991 -0.00758108 +-0.029375 0.0621337 -0.0244169 +-0.0655919 0.151202 -0.0366034 +-0.064581 0.128354 0.0453237 +-0.0626195 0.153328 0.0013944 +-0.0863817 0.148632 0.0316852 +-0.0153553 0.112218 -0.0188504 +-0.0602045 0.0441634 0.0266895 +-0.0204995 0.111306 0.0398343 +-0.0454802 0.112265 -0.0167776 +0.0212764 0.0693138 -0.0277613 +-0.0458225 0.146281 0.00549558 +-0.065521 0.0335373 -0.00466605 +-0.00710114 0.0339482 -0.0211688 +0.0551094 0.0539301 0.0250409 +-0.0781434 0.0927222 0.0364655 +0.0291436 0.0707502 -0.0218013 +-0.091117 0.143373 0.0231646 +-0.0575628 0.0576989 0.003607 +-0.0745558 0.0684435 0.0233437 +0.000679346 0.0933957 -0.0329817 +0.0136703 0.0446634 0.0441067 +0.0425933 0.0791563 0.0282081 +-0.0098481 0.112657 -0.0193422 +-0.0678577 0.102354 -0.0152646 +-0.0245236 0.0838729 0.0539551 +-0.0522319 0.125489 0.0349878 +-0.0331359 0.168192 -0.0157544 +0.0437182 0.0944809 0.000197915 +-0.0271741 0.161328 -0.0145155 +-0.0635247 0.139599 0.0380296 +-0.0105236 0.0787711 0.0579243 +0.0221704 0.109999 -0.014573 +-0.0626188 0.166275 -0.0435849 +-0.0162218 0.186444 -0.0207352 +-0.00481374 0.128076 -0.00386981 +-0.0761439 0.154623 0.0283179 +-0.00628506 0.0952929 -0.0329709 +-0.0244623 0.0348843 0.0471798 +-0.0764469 0.175411 -0.0430646 +-0.0374817 0.0903202 0.0435434 +0.0448755 0.0917539 0.00218552 +-0.0464937 0.0411703 0.0442462 +0.00738566 0.0463583 -0.0259834 +-0.0269838 0.158131 -0.000540227 +-0.0195125 0.0800523 0.0567242 +0.0535386 0.0505579 0.00123438 +-0.0704829 0.066568 0.025804 +-0.0478545 0.117892 -0.0146818 +-0.0645863 0.144373 -0.0132186 +-0.0619148 0.161553 -0.037594 +-0.0328555 0.100056 -0.0225692 +-0.0605435 0.0660534 0.0336067 +-0.00290962 0.037693 0.0115129 +-0.0101883 0.0876449 -0.0371912 +-0.0625754 0.042738 -0.00542472 +0.00650044 0.0910463 0.0545358 +-0.0756811 0.154032 -0.0169094 +-0.0034723 0.130516 0.00409153 +0.00232953 0.116694 -0.0177181 +-0.0378274 0.0929022 -0.0235348 +-0.02161 0.158057 -0.00899889 +0.0304133 0.0415863 -0.00412062 +-0.0728954 0.176495 -0.0445729 +-0.0420309 0.0335517 -0.0220625 +-0.0187514 0.0906841 0.0550582 +-0.0855548 0.125248 -0.00272359 +-0.0137086 0.0614344 -0.0364468 +-0.020723 0.0597726 -0.0340423 +-0.0708646 0.0384387 0.000437312 +0.0310181 0.112726 0.0309619 +0.0131047 0.129972 0.0173477 +-0.0216432 0.124246 -0.00349177 +-0.0626999 0.0706798 -0.0138683 +-0.0865991 0.0833319 0.0164838 +-0.0644302 0.0384213 0.0160253 +-0.0187164 0.0611476 0.0502898 +-0.0791607 0.170809 -0.0419883 +0.00181256 0.0994772 -0.0233519 +0.0199074 0.11877 -0.0100039 +-0.0361903 0.151017 -0.000604378 +-0.084275 0.0897993 -0.00457099 +-0.0554832 0.0861944 0.0449632 +-0.0623633 0.0458155 0.0336786 +0.034658 0.114539 0.0168181 +-0.0736982 0.167846 -0.0232955 +-0.0181465 0.166773 -0.0192359 +0.0113761 0.0494361 -0.0277541 +-0.0440746 0.154693 -0.007872 +0.0606816 0.0664976 0.015162 +0.044367 0.0575454 -0.00546316 +0.0134639 0.0616949 0.0510096 +0.0400149 0.0829397 -0.0117765 +0.0423451 0.0690926 -0.00378897 +-0.0691689 0.0336248 0.00172074 +0.0582234 0.0593447 0.00320204 +-0.0900566 0.133779 0.0292173 +-0.0381652 0.0336678 -0.0288809 +0.0397017 0.104178 0.024171 +-0.0755036 0.121787 0.0531411 +-0.025634 0.122393 0.025161 +0.058528 0.0565928 0.00617045 +-0.0801768 0.155046 0.0137223 +0.0277963 0.0835666 0.045536 +-0.0628566 0.145948 -0.0105775 +-0.0133824 0.0383808 0.0105781 +-0.049358 0.146268 -0.00147688 +-0.0484712 0.0517504 0.0365675 +-0.0467968 0.0869913 -0.021986 +0.0553821 0.0590684 -0.000816519 +-0.0179551 0.0921164 -0.0358084 +-0.0789524 0.0921836 -0.0106406 +0.0374058 0.0893177 -0.0145297 +-0.032345 0.0473443 -0.0245628 +0.0173629 0.0537245 -0.0278081 +-0.0616059 0.160004 -0.0295877 +-0.0123225 0.124091 -0.00743567 +-0.0401607 0.163674 -0.0120006 +-0.06497 0.154244 -0.00563561 +-0.0510279 0.0336678 0.0250302 +-0.0771941 0.0893363 -0.0125642 +0.0224953 0.109772 0.0381484 +-0.0545656 0.13815 0.0298405 +-0.00171216 0.066944 -0.0344014 +-0.00330066 0.124033 -0.00952648 +-0.0724141 0.159616 -0.0379306 +-0.0128309 0.0869146 -0.0385108 +0.0379635 0.103337 0.0286718 +0.00150556 0.0870476 0.0569313 +0.0339501 0.0683557 -0.0167775 +-0.0296157 0.053701 -0.0213818 +-0.0239053 0.0350134 -0.0198326 +0.00348633 0.110018 0.042298 +-0.00459976 0.0405792 -0.0256485 +0.0313837 0.0352278 0.00968341 +-0.0524893 0.105673 0.0402508 +-0.0334757 0.072353 -0.0224701 +-0.00165204 0.0347369 0.0450897 +-0.0251253 0.179165 -0.0186166 +0.0418909 0.0939077 0.0272858 +-0.0417165 0.069628 -0.0168617 +-0.0751265 0.0670609 0.00488552 +-0.0702901 0.063891 0.0211244 +-0.0777094 0.170825 -0.0439812 +-0.0735195 0.135848 0.0500526 +-0.0690768 0.0739443 0.0372765 +0.0123912 0.116671 -0.0157278 +-0.0504991 0.105636 0.0396146 +0.0194996 0.0489742 0.0420155 +-0.0652338 0.145869 -0.0189253 +0.0183651 0.124757 -0.00246117 +-0.067493 0.105571 0.0389191 +0.00451331 0.0814276 0.0565046 +-0.0126391 0.0466477 -0.0295757 +-0.043534 0.0422491 -0.0203181 +-0.0576807 0.133928 0.0359191 +-0.0847679 0.10454 0.0257763 +-0.0763966 0.0748983 0.0314167 +-0.0163248 0.0390132 0.0346782 +0.0455396 0.083395 0.0201668 +-0.0404951 0.0747761 0.0426102 +0.0326457 0.113685 0.0274718 +-0.0533008 0.118582 -0.0133417 +-0.0548347 0.0518559 -0.00436961 +-0.0444358 0.0344955 0.0309851 +0.0022525 0.0986072 0.0504164 +0.0280941 0.107442 0.0372758 +0.0311382 0.100809 0.0381724 +-0.0608693 0.0982413 -0.018491 +-0.0808258 0.116274 -0.00349703 +-0.00493749 0.124022 0.0339675 +-0.0202041 0.0383371 0.000156328 +0.000176932 0.0881362 -0.0348875 +-0.0122454 0.128019 0.000407111 +-0.0750529 0.0860661 0.0392001 +-0.0200226 0.0403705 0.0532551 +-0.0196618 0.127752 0.0140421 +-0.0544977 0.0747139 0.0418232 +-0.0850765 0.107567 0.00438106 +-0.0759578 0.071995 0.0287387 +-0.0434567 0.155083 0.00724724 +-0.090134 0.132434 0.0362229 +0.022282 0.0706591 -0.0268891 +-0.090924 0.128274 0.0409748 +-0.0889908 0.13778 0.0388031 +-0.0788715 0.122217 -0.0060966 +-0.00443014 0.100204 0.0479984 +0.0327247 0.0646521 0.0402099 +-0.066223 0.15556 -0.0520809 +0.0118954 0.0685639 0.0540604 +-0.0805181 0.12599 0.0525745 +0.0465562 0.0753029 0.0092212 +-0.0743025 0.151276 -0.0308835 +-0.0905476 0.146077 0.0141502 +-0.0715441 0.112225 0.0480665 +-0.0679786 0.137002 -0.008171 +-0.0672001 0.044789 0.00569382 +-0.0714328 0.168025 -0.0480185 +-0.0584837 0.088969 0.0446761 +-0.0444852 0.0411138 0.0436529 +0.0142229 0.0821798 -0.0300828 +0.0137354 0.10206 -0.0220537 +-0.0532836 0.0335112 0.0086601 +-0.046743 0.0767653 -0.0182293 +-0.0653246 0.173014 -0.0475844 +-0.0105123 0.0633015 0.0555068 +-0.0652467 0.122825 0.0496059 +-0.0587837 0.0940397 -0.0203993 +-0.061496 0.107016 0.0394252 +0.032159 0.0404592 0.0270704 +-0.0550412 0.129739 0.0362139 +0.0187645 0.036357 0.00611202 +-0.051625 0.0474378 0.0157122 +-0.0945263 0.121474 0.0192827 +-0.0874631 0.104981 0.0103802 +-0.0444225 0.0587761 0.0392912 +0.00550135 0.107149 0.041587 +-0.0023107 0.0375379 0.0154093 +0.0365396 0.111887 0.0174946 +-0.0667677 0.0809002 -0.0178421 +0.0212994 0.0550028 0.0464604 +-0.00474995 0.0391641 0.0333259 +0.0385436 0.103322 0.0277283 +-0.0350927 0.168167 -0.014918 +-0.0381943 0.124735 0.0235454 +-0.0436117 0.125739 0.0201433 +-0.0122465 0.124398 0.0313659 +-0.018196 0.038272 0.00607299 +-0.0454731 0.0675709 0.040115 +0.0397094 0.0887389 0.0329441 +-0.0612601 0.0653881 0.0322823 +0.0358388 0.063303 0.0376893 +-0.0894207 0.0969969 0.0174102 +0.0247051 0.054807 -0.022754 +-0.0362363 0.0345287 0.0379647 +-0.0134852 0.104433 0.0435318 +-0.0390753 0.0353444 0.00990175 +-0.032893 0.0386199 -0.0119052 +-0.066881 0.172737 -0.0437921 +-0.0844296 0.0777425 0.00651672 +0.0102401 0.13009 0.0220074 +-0.0184847 0.091067 0.0550019 +-0.048793 0.155022 0.0100543 +-0.042488 0.1112 0.0368617 +-0.00484603 0.0989761 -0.0268273 +-0.0667655 0.079447 -0.0174677 +-0.0520123 0.033434 -0.00549431 +-0.0309502 0.0376665 0.0292806 +0.0125353 0.118934 -0.0141702 +0.0393762 0.0393721 0.0023232 +-0.0154839 0.0388074 -0.00858919 +-0.027433 0.108265 -0.0206521 +-0.0335566 0.11282 -0.0174155 +-0.0428158 0.126503 0.0190139 +0.0359007 0.0374161 0.00496434 +0.030827 0.118499 0.003976 +0.0482689 0.0616107 -0.00376704 +0.0172995 0.0637271 -0.0287659 +0.0352999 0.0727523 0.0387329 +0.0325099 0.0439072 0.0294151 +0.0434928 0.0597185 0.030951 +-0.0849411 0.14333 0.0402714 +-0.0419573 0.15213 0.00584722 +-0.0478585 0.101383 -0.0215741 +0.0158763 0.121559 0.0327664 +0.0196134 0.0505877 0.0439573 +-0.0408143 0.0899706 -0.0230035 +0.0179499 0.0360095 0.0408071 +-0.0491945 0.137084 0.0184007 +0.0422067 0.0898824 0.0277847 +-0.0568073 0.122 -0.00880521 +-0.0535468 0.0500774 -0.00609453 +-0.0791017 0.171279 -0.0410322 +-0.0812381 0.0774347 -0.00249764 +0.00451011 0.08973 0.0555486 +0.0360129 0.0947297 -0.0122566 +-0.0267986 0.0839175 -0.0367186 +-0.0336466 0.125738 0.0192922 +-0.0645061 0.0384674 -0.00726163 +-0.069197 0.145134 -0.0204031 +-0.0453102 0.150665 0.00801555 +-0.016121 0.0347931 0.0455365 +0.0372267 0.0827114 -0.0157704 +-0.0586519 0.047167 0.0396282 +-0.0723413 0.0352299 0.00501169 +-0.00850771 0.0457646 0.047699 +-0.0361402 0.0481769 -0.0171107 +-0.0694918 0.0986232 0.041191 +-0.0145821 0.0365575 -0.0175497 +-0.0152331 0.178626 -0.0269991 +-0.0375015 0.0761535 0.0421853 +0.0230994 0.0700125 0.0474321 +-0.0769031 0.149462 0.0386995 +-0.0160344 0.0394989 0.0396851 +-0.077278 0.155614 0.0132673 +-0.0461472 0.0695191 0.0407559 +0.013766 0.105146 -0.0193832 +-0.00180961 0.102694 -0.0227875 +-0.0404787 0.102851 0.0403978 +-0.0256602 0.0491814 -0.0262646 +-0.0640267 0.155773 0.0106957 +-0.0188798 0.0381919 0.018679 +0.0251044 0.111527 -0.0122017 +-0.00771141 0.130468 0.0154714 +-0.0143198 0.128437 0.0203415 +0.000556364 0.0427979 0.0462128 +-0.0107039 0.129221 0.0216334 +-0.0755898 0.0796389 -0.010614 +-0.0618567 0.156837 -0.0325918 +-0.0516893 0.0678068 -0.0129959 +-0.0631142 0.178334 -0.0583576 +-0.0386855 0.0651385 -0.0142461 +-0.0594798 0.0790546 0.0431577 +-0.029726 0.121561 0.0251755 +-0.0328596 0.153633 -0.000344229 +0.0339626 0.0356317 0.0117064 +-0.0718527 0.158151 -0.00382487 +-0.0194857 0.0486564 0.0485018 +0.0319575 0.0889685 0.042819 +0.00933955 0.0624337 -0.0310444 +-0.0172265 0.113695 -0.0184196 +-0.0866231 0.0846922 0.0194779 +-0.0663134 0.0608279 0.00678018 +-0.0718125 0.0922256 -0.0157107 +0.0550352 0.064867 0.0267865 +-0.0446824 0.0651214 -0.0145177 +-0.066499 0.0958724 0.0422345 +-0.0484771 0.135525 0.0064169 +0.0419641 0.0872658 0.0291034 +-0.0144336 0.120974 -0.0101151 +0.00537913 0.115468 -0.0184153 +-0.0169313 0.0940904 -0.0338108 +-0.0311219 0.087675 -0.0275557 +-0.0733475 0.129801 0.0519745 +-0.0628563 0.0432731 0.0396846 +-0.0181419 0.159077 -0.00932452 +-0.0244219 0.0752703 0.0498831 +0.0278638 0.0367181 0.000104301 +0.0464062 0.0525822 0.0317783 +-0.0352134 0.127051 0.0157486 +-0.037493 0.0605801 0.0408152 +0.0435542 0.0709351 0.0259153 +-0.061811 0.0896079 -0.0190442 +-0.0487502 0.167013 -0.00197199 +-0.011981 0.180127 -0.0244833 +-0.0273118 0.0346998 0.0432305 +0.0260624 0.113339 -0.0101501 +0.00139388 0.0977439 -0.0275242 +0.0217437 0.0348491 0.000619009 +-0.0598385 0.0385019 0.0199857 +-0.0742583 0.12978 0.0523998 +0.0125017 0.103142 0.0463418 +0.0222613 0.0768462 0.049813 +0.0226846 0.125635 0.0109073 +-0.0664848 0.153437 0.0331838 +-0.0635064 0.100118 0.0422551 +-0.0884181 0.136485 0.0410708 +-0.0821317 0.151156 0.0323844 +-0.035019 0.035354 0.0462574 +-0.0445836 0.049099 -0.0105442 +-0.0913513 0.126793 0.00727091 +-0.00465552 0.0526099 -0.031899 +-0.0536395 0.0361733 0.0466553 +-0.0624928 0.0775409 0.0419345 +-0.0454844 0.1652 0.00481603 +-0.0176555 0.10171 -0.0237622 +-0.0517386 0.139928 0.000994108 +-0.0894422 0.0969694 0.0114146 +0.0282036 0.106111 0.0374341 +-0.0930784 0.128223 0.0132485 +-0.0710378 0.113905 0.0504272 +-0.0589666 0.06768 0.0360494 +0.0249541 0.12014 0.0288767 +-0.0467094 0.0345808 0.0339444 +-0.0627411 0.0766785 -0.0179436 +-0.00548466 0.051944 0.0528973 +-0.0355056 0.0705073 0.0417804 +0.00377856 0.127353 -0.00517835 +-0.0595895 0.0659394 0.0339087 +-0.0639025 0.0344657 0.0356117 +-0.0549717 0.132532 0.0345672 +-0.0762259 0.0790445 0.0349679 +-0.0259103 0.0721759 0.0444214 +0.0315716 0.117859 0.00423829 +-0.0696582 0.0642657 0.000568637 +-0.0882731 0.143189 0.0351319 +-0.031681 0.0679763 -0.0234472 +-0.0699144 0.1253 -0.00883057 +0.0435982 0.0888699 0.0251665 +-0.0914617 0.144737 0.0211556 +-0.0205009 0.126788 0.0181341 +0.0311284 0.103423 0.0364018 +-0.0196184 0.043638 -0.0281382 +-0.0192518 0.185941 -0.0210687 +0.0556563 0.0725898 0.00964459 +-0.0899954 0.135014 0.00922069 +-0.0658394 0.170333 -0.0405107 +-0.0487066 0.064243 0.0362896 +0.0115006 0.100446 0.0479384 +-0.0479295 0.132887 0.00374503 +0.0216229 0.0700379 0.048827 +0.0151599 0.050478 0.0463014 +0.00510611 0.0386758 0.0457599 +-0.0284578 0.0789297 -0.0355663 +-0.081069 0.152209 0.0312004 +-0.0814521 0.13302 0.0511119 +-0.0115065 0.0517326 0.051159 +0.0190773 0.108184 -0.0165978 +-0.0879813 0.0860844 0.0054873 +-0.0565924 0.0442297 -0.00693458 +-0.0358918 0.166781 -0.00116722 +0.0263229 0.122689 0.0193841 +-0.0305096 0.0608404 -0.0204127 +-0.0790435 0.0718734 0.00353541 +-0.0264818 0.101588 0.0434387 +0.0224815 0.0892515 0.0484736 +-0.07435 0.0711851 0.0297739 +-0.0366402 0.0563002 -0.0110085 +-0.0858069 0.133905 0.0470456 +-0.0347686 0.16678 -0.00304399 +-0.0318926 0.0385829 -0.0116716 +0.0173027 0.0680054 -0.0293377 +-0.084368 0.114299 0.000284663 +-0.0761089 0.149998 -0.0108814 +0.0437289 0.0987183 0.00617361 +0.0134057 0.0374127 -0.0219366 +0.000807934 0.124791 -0.00838237 +-0.0406768 0.0621783 -0.0128097 +-0.0926608 0.121474 0.0282925 +-0.0595443 0.155728 0.018094 +-0.0646509 0.168222 -0.0372156 +-0.0197896 0.127727 0.0110836 +0.0112619 0.069597 -0.0315203 +-0.0784667 0.141403 0.0468168 +-0.0881381 0.0996585 0.0223676 +-0.0495985 0.048927 -0.00879829 +-0.0567267 0.15478 0.0220083 +-0.0273659 0.119585 -0.010507 +0.0191093 0.0375318 0.0414884 +-0.054786 0.147744 0.027387 +0.0185111 0.114004 0.0370685 +-0.0106027 0.171925 -0.0271985 +-0.0795217 0.0748572 0.0255446 +0.0527001 0.0462105 0.0152086 +0.0191089 0.0889764 -0.0262512 +-0.0917278 0.114662 0.0113396 +-0.0311696 0.0749025 -0.031542 +0.0103976 0.0505032 0.04997 +0.00150167 0.0504398 0.0522275 +-0.00913054 0.0987984 -0.026694 +-0.0607072 0.0707896 -0.0151427 +-0.0314435 0.033488 -0.0292746 +0.0322402 0.0842577 -0.0191914 +-0.0617587 0.160001 -0.0265888 +0.0366758 0.0659888 0.0371374 +-0.0410386 0.153314 -0.00775366 +-0.0916156 0.146104 0.0201482 +-0.008275 0.130081 0.0196055 +-0.0716229 0.0395313 0.00756641 +-0.0555501 0.0448059 0.0154665 +-0.0519883 0.0545681 0.0276385 +-0.063796 0.145383 -0.0141799 +-0.0204903 0.107154 0.041938 +-0.00950118 0.06052 0.0554819 +-0.0297859 0.073336 -0.0325546 +0.0225502 0.0873848 -0.0245875 +-0.0658345 0.0367656 0.0273328 +-0.0335698 0.0354174 0.0482024 +-0.0826039 0.0829175 -0.00455606 +0.0133284 0.055284 -0.0292269 +-0.000932932 0.0363158 0.0167895 +0.0190541 0.116198 -0.0132311 +-0.000494259 0.0911454 0.0560111 +0.0112951 0.130595 0.0166808 +-0.0164761 0.0673645 0.0539812 +-0.0180225 0.0385494 -0.00514634 +-0.0610891 0.0339525 0.017372 +-0.0707478 0.147309 -0.0278341 +-0.0189873 0.180146 -0.0170482 +0.0237757 0.0343382 0.00896337 +-0.00265737 0.0899953 -0.0354905 +-0.0718661 0.100809 -0.0137558 +-0.00649817 0.0939276 0.0556503 +-0.0246455 0.126418 0.012252 +-0.0157508 0.070024 -0.0384074 +0.0256059 0.12104 -0.000826914 +0.00250363 0.0489881 0.0513443 +-0.029644 0.125848 0.0118936 +-0.024804 0.0737635 0.0475256 +-0.0672658 0.131206 0.0466969 +-0.0817178 0.0953366 0.0328835 +-0.0286351 0.0918211 -0.0275955 +0.0414472 0.0971985 0.0261597 +-0.0680972 0.121444 0.0525081 +-0.0683202 0.166619 -0.0540065 +-0.0375072 0.0775843 0.0424046 +-0.0143913 0.0384112 0.00490303 +-0.0518947 0.109852 -0.0185479 +0.0338477 0.0711662 -0.016803 +-0.0450894 0.154663 -0.00752455 +-0.0564919 0.0875695 0.0445907 +0.0391967 0.0726247 0.033788 +0.0574073 0.0717824 0.0103168 +-0.0237163 0.0380022 0.0196686 +0.0120538 0.0907862 -0.0301745 +-0.0669793 0.134061 -0.00834965 +-0.00947746 0.116894 0.0392479 +-0.0328734 0.0680853 -0.0194707 +0.030263 0.116206 0.0279976 +-0.0348513 0.0345425 0.0400019 +-0.0532018 0.0733522 0.0412342 +-0.0577592 0.033805 0.0199655 +-0.00439966 0.119978 -0.0131705 +0.0162591 0.0434903 0.0442636 +-0.0567225 0.0423764 0.0206991 +0.00325132 0.12142 -0.0127844 +0.0145581 0.125506 0.0293407 +0.00448398 0.0989824 0.0487111 +-0.0896848 0.0929338 0.0144339 +-0.04491 0.13036 0.00775303 +-0.048947 0.138616 0.00839947 +-0.0307428 0.0552453 -0.0153798 +-0.0826044 0.1367 0.0480323 +-0.0749507 0.0661289 0.00944516 +-0.00473325 0.069866 -0.0358872 +-0.0167995 0.0347343 0.0471976 +-0.0426342 0.12559 0.0204963 +-0.0444709 0.120321 -0.0132547 +0.010477 0.116818 0.0374755 +-0.0744965 0.123196 0.0533572 +-0.047302 0.16443 0.00497116 +-0.0859996 0.118394 -0.000793117 +-0.0326967 0.0849828 -0.026556 +-0.0843669 0.106153 0.00138874 +0.0167493 0.127305 0.0229819 +0.0223908 0.0489358 -0.0217863 +-0.0762839 0.155844 0.0209052 +-0.0839499 0.0979633 -0.0036111 +-0.0216926 0.126501 0.0176944 +0.0378596 0.0914955 0.035553 +0.0420895 0.102851 0.00717012 +0.0366464 0.103365 0.0302885 +-0.0696779 0.086056 0.0423345 +-0.0340311 0.0339294 0.0212063 +0.0162763 0.0361212 0.00396256 +-0.0426327 0.0338426 -0.00397459 +-0.027617 0.125471 0.0155889 +-0.0937433 0.118772 0.0222988 +-0.0518432 0.133909 0.0302884 +-0.0413643 0.124214 -0.00934406 +-0.0413386 0.121239 -0.0122322 +-0.0396582 0.0336638 0.00768797 +-0.0853564 0.091162 -0.00253932 +0.0179914 0.120614 0.0332262 +-0.0717184 0.0792466 -0.0147262 +0.0215785 0.11262 0.0367657 +0.0236405 0.0366106 0.026972 +-0.07448 0.0662148 0.0164657 +-0.00149557 0.0973426 -0.0290749 +0.0342448 0.0842103 -0.0184253 +0.0045204 0.0661365 0.0560558 +-0.0072649 0.0384115 0.0117959 +0.0362267 0.104294 -0.00842134 +0.0232091 0.0782074 0.0494446 +-0.0204762 0.0786229 0.0556935 +0.0189956 0.125897 0.000310264 +0.0582502 0.0661055 0.0226582 +-0.0884672 0.113635 0.0306037 +-0.0595891 0.155231 0.0238846 +-0.0540479 0.142765 -0.001179 +0.0139994 0.0807368 0.0537041 +-0.0660333 0.155202 -0.00458552 +-0.0371914 0.175481 -0.00856986 +-0.0114786 0.114128 0.0403922 +0.00280587 0.10648 -0.0207933 +-0.061629 0.148291 0.0370712 +-0.0305056 0.115271 0.0335326 +-0.0847456 0.0911272 0.0289858 +0.0294623 0.103445 0.0374919 +-0.0884887 0.122612 0.00129126 +-0.0869453 0.0846809 0.01048 +0.04631 0.0778469 0.00818385 +-0.077491 0.135849 0.0507593 +0.00650523 0.0745046 0.0565842 +-0.0193751 0.0711448 0.0534686 +-0.03164 0.0581442 -0.0153958 +0.00337821 0.0392113 0.0295452 +0.026954 0.116596 0.0310646 +-0.0623115 0.16311 -0.0435951 +0.0154275 0.0350916 0.0411096 +-0.0724818 0.165221 -0.0429802 +-0.0359956 0.151076 -0.00202594 +0.0162209 0.0779008 -0.0293961 +-0.0478366 0.133877 0.0213554 +0.0569921 0.0661536 0.0243514 +-0.0318346 0.0915622 -0.0244444 +-0.0864107 0.0819973 0.0174801 +-0.0497993 0.0677848 0.0379447 +-0.0671663 0.164687 -0.0194859 +-0.00868026 0.111843 -0.0204858 +-0.0195177 0.0933631 0.0529187 +-0.0535918 0.114983 -0.0155816 +-0.068804 0.18096 -0.0579804 +-0.0846698 0.148755 0.00515607 +-0.0808035 0.0868637 -0.00756861 +-0.0309282 0.156627 0.000764301 +-0.0561456 0.0642166 0.0326189 +-0.0864523 0.0899653 0.00147962 +-0.0802598 0.0734072 0.0195467 +-0.025101 0.114847 -0.0155729 +-0.0348703 0.102876 -0.0215726 +0.00151752 0.0547965 0.0538164 +-0.0216758 0.0969718 -0.024798 +0.0367496 0.0931371 -0.012555 +0.00330684 0.0583228 -0.0321215 +-0.0697412 0.154452 0.0305168 +-0.0618525 0.0343021 0.022204 +-0.00886294 0.171168 -0.0237423 +-0.0216854 0.168305 -0.0122385 +-0.0435207 0.0562403 0.0394546 +-0.0620233 0.159983 -0.0376027 +-0.0751309 0.154085 -0.0179327 +-0.0480694 0.153165 -0.00566954 +0.0283556 0.0605487 0.0426528 +0.0115864 0.0348612 0.0423222 +-0.064559 0.11407 0.0417666 +0.0210547 0.0358177 -0.00168489 +-0.042575 0.0491291 -0.011035 +-0.0742409 0.113562 0.0499634 +-0.0659446 0.146784 0.0398667 +-0.0670071 0.172276 -0.0580562 +0.0251821 0.0357118 0.0226481 +-0.0129957 0.0883892 -0.0379783 +0.01814 0.0713245 0.0508426 +0.0161851 0.0347246 0.0253316 +-0.0234485 0.122824 -0.00599554 +0.00849456 0.0412846 0.0453159 +-0.0253871 0.124202 0.0208009 +0.00860136 0.121512 -0.0129363 +-0.0764996 0.128859 0.0532215 +-0.0637886 0.083851 -0.0191517 +-0.073438 0.175304 -0.0418354 +-0.0464485 0.132668 0.0189406 +-0.018505 0.112714 0.0394706 +-0.0579749 0.117711 -0.0123561 +-0.0241311 0.0384069 -0.0174035 +0.0286891 0.119649 0.00175522 +0.0135044 0.118213 0.0361594 +0.00748569 0.0942514 -0.0297902 +0.0223281 0.111319 -0.0139783 +0.00796203 0.131149 0.00690102 +-0.0888712 0.101031 0.0183836 +0.0208523 0.0352023 0.0276656 +-0.0939805 0.118754 0.0182968 +-0.0886426 0.129716 0.0443401 +-0.0562403 0.128346 0.0379943 +-0.0946719 0.122818 0.0192736 +-0.0844496 0.151409 0.0062115 +-0.0488054 0.124161 -0.00921799 +-0.0495787 0.0503337 -0.00863311 +-0.0642728 0.174473 -0.0515364 +-0.0355869 0.116022 -0.0147547 +0.0353133 0.0362497 0.0114171 +-0.0570854 0.136926 -0.00500822 +-0.033504 0.079379 -0.0265108 +-0.062469 0.033932 0.0153305 +-0.000579953 0.0361804 -0.0245898 +-0.0314067 0.0423682 0.0507901 +-0.0112759 0.125368 0.030237 +-0.00950387 0.075936 0.0571919 +-0.0424487 0.125177 -0.00834623 +-0.0077039 0.113721 -0.0184781 +-0.00342161 0.0338005 -0.0221963 +-0.0140717 0.118746 -0.0137718 +-0.0231943 0.0388081 0.0352395 +-0.0639512 0.156212 0.0208686 +-0.0624954 0.0890364 0.0453804 +-0.0303734 0.125779 0.00722581 +0.003605 0.0340592 0.00699628 +-0.0765794 0.15423 -0.00189723 +-0.0759273 0.08606 0.0386654 +0.0508473 0.0446622 0.0112162 +0.00609443 0.127443 0.0291456 +-0.0428742 0.105667 -0.0205602 +-0.0188968 0.0381911 0.0132528 +-0.086324 0.106283 0.0073644 +-0.0320928 0.0336737 -0.0220791 +-0.0466544 0.119173 -0.0140371 +-0.0710688 0.156192 0.0139947 +-0.055712 0.155088 0.0136896 +-0.0525045 0.159361 0.00819169 +-0.0543637 0.116891 0.0353365 +0.0318466 0.0424663 0.0288342 +-0.051547 0.125478 0.0342157 +-0.00249266 0.0760635 0.0587913 +-0.00575365 0.0727093 -0.0362416 +-0.00680153 0.129324 0.00093339 +0.0495021 0.0664943 0.0276338 +-0.0282448 0.11486 -0.0155715 +0.031224 0.0786608 -0.0202592 +-0.0148026 0.0827563 -0.0392327 +-0.071855 0.0993885 -0.014251 +0.0177513 0.0462342 0.0429632 +-0.0242082 0.121982 0.0271598 +-0.0922854 0.116039 0.0223382 +0.0434814 0.0832239 -0.00379707 +-0.0384996 0.171162 0.000767348 +-0.0712408 0.114861 0.0513991 +-0.0157632 0.12799 0.00385748 +0.019082 0.126548 0.00245443 +-0.00388013 0.0394939 0.0368098 +-0.0204678 0.122105 0.0297617 +-0.0285693 0.0399846 -0.0296196 +-0.0831878 0.0764607 0.0163622 +0.0190867 0.0428243 -0.0216805 +0.0483631 0.0628304 -0.00297175 +-0.0927311 0.120157 0.0322864 +-0.0241838 0.0579409 0.0417219 +-0.0517297 0.0723507 -0.015831 +-0.0217729 0.0684817 -0.0372671 +-0.00949546 0.0829261 0.0578441 +0.0172524 0.0778474 -0.0286871 +-0.0441607 0.162142 -0.00945516 +-0.00587725 0.105934 -0.0226578 +0.0253567 0.0518232 -0.0216362 +-0.0494861 0.156424 0.00985611 +-0.0174771 0.0924389 0.0547456 +-0.0151406 0.126373 0.0259068 +-0.0852968 0.0818288 0.005494 +-0.0244818 0.0988555 0.0446892 +-0.0930791 0.118839 0.037294 +-0.0662836 0.114247 0.046332 +0.0127465 0.0672208 0.05354 +-0.0414757 0.109827 0.0377618 +-0.0435203 0.0519967 0.0390799 +-0.0417672 0.0812092 -0.0204027 +-0.0786424 0.0732312 0.000545367 +-0.0358502 0.0986071 -0.0225695 +0.0443653 0.0561662 -0.00597205 +0.0226111 0.0458717 -0.017849 +-0.0108336 0.116804 -0.0157483 +-0.0865451 0.110395 0.00835385 +0.031421 0.0399741 -0.00264961 +0.0363991 0.039859 -0.00104313 +-0.0468008 0.0347657 0.0424884 +-0.0398282 0.0914347 -0.0233046 +-0.025008 0.0334859 -0.0261337 +-0.0465231 0.0804789 0.0433941 +-0.0689665 0.135529 -0.00828838 +-0.0264689 0.0379883 0.0100865 +-0.0345116 0.111154 0.0360997 +-0.0225694 0.0387321 0.0336407 +0.0372794 0.0574491 -0.00767997 +-0.0707981 0.0672067 0.0269443 +-0.0150683 0.0384098 0.0065829 +-0.0592389 0.0452743 -0.00430196 +-0.0334924 0.102881 0.0413291 +-0.079025 0.153836 0.00536375 +-0.0229321 0.055215 0.043371 +-0.0601957 0.0341396 0.0262143 +-0.0688541 0.147497 -0.029579 +-0.0613597 0.172535 -0.0585911 +-0.0748166 0.0921259 -0.0144369 +-0.0632016 0.165278 -0.0601981 +0.0402098 0.04091 0.000378677 +-0.047469 0.117985 0.0306301 +0.0368134 0.0781201 0.03746 +0.000515748 0.0349973 0.0453092 +-0.0534255 0.124412 -0.00739059 +-0.000488424 0.0801341 0.0575904 +-0.0706455 0.0701231 -0.00669595 +-0.0477034 0.0649971 -0.0135628 +-0.0348898 0.0767003 -0.020496 +-0.00451076 0.0788064 0.0581316 +-0.0693915 0.117164 0.0523368 +-0.0200653 0.164398 -0.0170398 +-0.073544 0.177863 -0.0540307 +0.0427163 0.0399244 0.0113768 +0.0240483 0.0713748 0.0470522 +-0.0154968 0.0659374 0.0537935 +-0.0686329 0.175846 -0.0473222 +-0.0628372 0.172536 -0.0525874 +-0.0796429 0.148681 -0.00084361 +-0.0663392 0.0600723 0.0146241 +-0.00400483 0.123769 0.0343163 +0.0322222 0.0597861 -0.0166881 +-0.0640918 0.158696 -0.0546245 +-0.00248901 0.0456504 0.0469622 +-0.072774 0.10871 0.0380686 +-0.0810086 0.154578 0.0119766 +-0.0695005 0.091616 0.0421021 +-0.0665162 0.155345 0.00690315 +-0.030539 0.0748507 -0.0325674 +-0.0672648 0.0680031 0.0322561 +-0.0660205 0.131186 0.0449542 +-0.0246171 0.125897 0.00496292 +-0.077893 0.12518 -0.00689701 +-0.0883724 0.121658 0.047175 +-0.0773948 0.167309 -0.02854 +-0.0604 0.0470132 0.0371523 +-0.027746 0.0753954 -0.0356568 +-0.0748509 0.0782361 -0.0105914 +-0.0571323 0.14819 0.0314465 +-0.0415029 0.0803953 0.042616 +-0.0628829 0.0649103 0.0305991 +-0.00169833 0.0598396 -0.033652 +0.0151569 0.107807 -0.0181851 +0.0566945 0.0674374 0.0239376 +-0.0717279 0.155642 0.00502354 +-0.00382186 0.102465 0.0438439 +-0.0587089 0.155741 0.0125904 +0.0572801 0.0608152 0.0247108 +0.017703 0.0913635 0.0485583 +0.0260543 0.116303 -0.00733098 +-0.0345036 0.0690703 0.0414109 +-0.0292922 0.117943 -0.0127907 +0.0213023 0.0835644 0.0502546 +0.0464907 0.0664648 0.0271426 +-0.0564929 0.14962 0.0306387 +0.0282135 0.118937 -0.00132982 +-0.000391601 0.123621 0.0341495 +-0.00114981 0.12653 0.03091 +0.0304544 0.114562 -0.00546317 +-0.0547437 0.0337519 0.0206417 +-0.0468823 0.107031 -0.0193009 +-0.0631801 0.0406886 0.0415101 +-0.0910325 0.133669 0.0112223 +-0.0592476 0.145654 -0.00231326 +-0.0125718 0.100502 0.0445971 +-0.0298246 0.0378766 0.0293214 +-0.0839351 0.123564 -0.00377373 +-0.0621407 0.163665 -0.0567978 +-0.0389566 0.155104 0.00497717 +-0.0878144 0.105004 0.012374 +-0.0794305 0.0908376 -0.00963692 +-0.0246551 0.0507167 -0.0273858 +-0.0796103 0.0799856 -0.0065507 +0.0330411 0.10941 -0.00791346 +-0.00231596 0.121888 -0.0112268 +-0.0597326 0.154693 0.0267485 +0.0339669 0.0697663 -0.0167955 +0.0205734 0.0999616 -0.0218299 +-0.0354929 0.0917868 0.0443508 +0.00339585 0.0355203 0.0220096 +-0.0315414 0.125778 0.00387502 +-0.0478194 0.135564 0.0104014 +-0.00879058 0.0812731 -0.0379859 +-0.0037488 0.0386615 0.00318783 +-0.0464486 0.0959731 0.0434949 +-0.0306087 0.0394849 -0.0300968 +-0.00234671 0.0967246 -0.0304442 +-0.0312616 0.0735186 -0.0295121 +-0.0423301 0.0340883 0.0282541 +0.0355908 0.113068 0.0185826 +0.000833787 0.106762 -0.0210825 +-0.021676 0.184465 -0.0190713 +-0.0305406 0.0566147 -0.0184018 +-0.0876394 0.113262 0.0257017 +-0.0851868 0.0966727 -0.00156833 +-0.0465061 0.0425232 0.0438042 +0.0106037 0.121274 -0.0126925 +0.0290611 0.0523826 -0.0177704 +-0.000764451 0.0769261 -0.0359174 +-0.0416101 0.0338187 0.00715256 +-0.0893298 0.0969555 0.0104169 +-0.0345694 0.163827 -0.00275159 +-0.0888276 0.090232 0.0214359 +0.0208395 0.034464 0.00266226 +0.0428658 0.0623821 -0.00251673 +-0.00588102 0.130577 0.00751387 +-0.0133142 0.0337765 -0.0222266 +-0.0435242 0.0590876 0.0398271 +0.0545899 0.0478435 0.0151974 +-0.0107349 0.0699421 -0.0371274 +0.027906 0.0578072 0.0419759 +-0.0416225 0.0520166 -0.011127 +-0.0207276 0.168298 -0.0126147 +0.0256959 0.0491338 0.0386649 +-0.0550795 0.153114 -0.00215772 +-0.0380808 0.0483205 -0.0131774 +-0.0276317 0.056316 -0.0254148 +-0.00815144 0.127733 -0.00346398 +-0.0627849 0.0852772 -0.0191174 +-0.0619877 0.169385 -0.052596 +0.0234401 0.112665 0.0358138 +-0.0659073 0.110934 -0.0126703 +0.0280721 0.0360499 0.0211097 +0.0105243 0.0687767 0.0545753 +-0.00679638 0.0982761 -0.0281107 +-0.0309109 0.0462432 0.0473418 +-0.0196031 0.0393462 -0.028238 +-0.0871129 0.152836 0.0157593 +-0.0911632 0.133688 0.01322 +-0.0464961 0.102903 0.0415914 +-0.0206991 0.0553418 -0.0317435 +-0.00949277 0.073156 0.0570282 +-0.0864179 0.083353 0.0184733 +-0.0841891 0.111446 0.02976 +-0.0940387 0.126929 0.0232615 +0.0406221 0.0899944 0.0307666 +0.0208423 0.104696 0.0425993 +0.0445354 0.0407636 0.0127885 +-0.0623396 0.172509 -0.0536126 +0.0342346 0.0852576 -0.0183147 +-0.0866427 0.151554 0.0100877 +-0.0470988 0.0345244 0.0321531 +-0.080576 0.154494 0.0106641 +-0.0137759 0.0756859 -0.0386228 +0.0216235 0.0430155 -0.0167288 +0.0376424 0.109732 0.0031582 +0.0589875 0.0607291 0.021951 +-0.0923003 0.132372 0.0212228 +0.0311691 0.0942449 0.0417029 +-0.0174159 0.162512 -0.00777918 +-0.0156178 0.12076 -0.00985742 +-0.0507328 0.121196 0.0335979 +0.028716 0.119662 0.0245591 +-0.0738138 0.0950345 -0.0145557 +0.0204425 0.0350747 0.0258809 +-0.0207737 0.0351435 -0.019333 +0.0223353 0.12586 0.0121947 +-0.0155009 0.0951913 0.0533641 +-0.0143883 0.038338 0.0212719 +0.00741103 0.0391504 0.030425 +0.0433932 0.0691823 -0.000799598 +-0.0760543 0.149976 -0.0168736 +-0.0701178 0.170154 -0.0291958 +-0.0483555 0.146018 -0.00117385 +0.0336441 0.0578174 0.0379601 +-0.0913716 0.140622 0.0201693 +-0.0308539 0.0958394 -0.0237431 +-0.0766992 0.0702795 0.00252119 +-0.0544948 0.107078 0.0398767 +-0.0587729 0.0796565 -0.019784 +-0.013621 0.128874 0.0191382 +-0.0634727 0.156127 0.0195874 +-0.0880436 0.0977019 0.0235765 +-0.0606626 0.0738612 0.0409255 +0.0348653 0.0795228 0.0399156 +0.0387467 0.0828368 -0.0137708 +-0.0573402 0.0424553 0.0177175 +-0.0784976 0.148406 0.0395361 +-0.0917148 0.117385 0.0263102 +-0.0330041 0.122377 0.0254817 +0.0172403 0.0768113 0.0531129 +0.0595736 0.0691817 0.0101411 +0.0306903 0.0708797 -0.0198199 +-0.0845462 0.119028 0.0490922 +-0.0501127 0.0337803 -0.0127711 +-0.0670049 0.0372923 0.032499 +-0.0915067 0.129676 0.0312386 +-0.0550517 0.0504886 -0.00434688 +-0.0484873 0.0790818 0.0439275 +-0.0635173 0.159862 -0.0515858 +-0.0706155 0.173275 -0.0394062 +0.0352172 0.0952034 -0.0127755 +0.0251052 0.0382735 0.0297226 +-0.0668809 0.106639 -0.013906 +-0.0678418 0.143634 -0.0139334 +-0.0235762 0.184403 -0.0123621 +-0.0257601 0.0726356 -0.0363191 +-0.0573375 0.0472769 0.0101218 +-0.085611 0.106332 0.02136 +-0.0265671 0.0617846 0.0387137 +-0.0126044 0.12951 0.0108053 +0.0214416 0.0362735 0.0322576 +-0.0354711 0.126342 0.0186171 +-0.0594976 0.0904384 0.0451853 +0.00310705 0.0348555 0.0387811 +0.0254813 0.0942452 0.0457882 +-0.0308576 0.10008 -0.0228293 +-0.0176768 0.0510699 -0.0312435 +-0.0162281 0.181624 -0.0200739 +-0.0195138 0.038345 0.00392275 +-0.0645154 0.121409 0.0489254 +-0.0248162 0.0593033 0.0409035 +-0.0571389 0.136712 0.0331888 +-0.0435213 0.0379732 -0.0242868 +-0.0606582 0.12408 0.0421371 +0.0346832 0.0519191 0.0323364 +-0.0913706 0.116528 0.0258009 +-0.0426868 0.0651551 -0.0146214 +-0.0215064 0.116765 0.0355266 +-0.0581012 0.158247 0.00415445 +0.00842312 0.0385006 0.0330183 +-0.0523141 0.162661 -0.0019165 +0.0606845 0.0623337 0.0161711 +-0.0495055 0.0848369 0.0453213 +0.0333786 0.06058 0.0393695 +-0.0689469 0.131135 -0.00874709 +-0.078943 0.132461 -0.00522567 +-0.0196521 0.0386292 -0.00926197 +-0.0594457 0.0334843 -0.00338966 +-0.054161 0.0337073 0.0136843 +-0.0384829 0.0959056 0.0428235 +-0.0869182 0.148604 0.0308154 +-0.0323987 0.116048 -0.0147978 +0.0359194 0.0798211 -0.0157295 +-0.0328255 0.12127 -0.00820532 +0.0414852 0.0569681 0.0316528 +-0.0270871 0.0520359 -0.0253933 +0.0508347 0.0727393 0.0196905 +-0.0198767 0.105865 -0.0225965 +0.0206869 0.0400703 -0.0126929 +-0.0285033 0.0616825 0.0373869 +-0.0714181 0.143109 -0.0104276 +-0.0804568 0.138622 0.0481167 +-0.0458049 0.0532278 0.0379952 +-0.0509023 0.125469 0.0333647 +-0.0871853 0.145927 0.0339699 +0.0558536 0.0594884 0.0261475 +-0.0889169 0.126733 0.0032966 +0.0110737 0.125093 -0.00680678 +-0.0358405 0.094357 -0.023472 +0.0259145 0.102099 0.0411479 +0.0426389 0.0764517 0.0281735 +0.00597565 0.131268 0.0190237 +-0.0475211 0.165506 -0.00586183 +0.0138473 0.035286 0.0424107 +-0.0544751 0.0987674 0.042954 +0.0329063 0.0668566 -0.0177475 +-0.0715523 0.0819441 0.0400873 +-0.0483263 0.149906 -0.00403153 +0.0417112 0.0986332 0.0241669 +-0.0591403 0.039472 0.0459797 +-0.0649985 0.156251 0.0205012 +-0.0389795 0.034282 0.00907489 +-0.0627215 0.0592404 0.0161384 +-0.0367435 0.0437017 -0.0271198 +-0.0164726 0.0387782 -0.0143554 +0.0302495 0.0773125 -0.0211724 +0.0378723 0.109729 0.00416584 +-0.0033562 0.120959 -0.0122202 +-0.0465665 0.0433151 -0.011194 +-0.0597431 0.093988 -0.019461 +-0.0756514 0.0743685 0.0320217 +0.0461779 0.083439 0.010174 +-0.0757827 0.151399 -0.00889222 +-0.0417451 0.0768346 -0.0188724 +-0.0617437 0.0421117 0.0428503 +0.00176163 0.130465 0.00157228 +0.0429689 0.0696277 0.0268653 +-0.0432762 0.0450842 -0.0143236 +-0.0525312 0.0475838 0.0226634 +-0.0153636 0.128543 0.00690549 +-0.0685053 0.109678 0.0379594 +0.0174805 0.103096 0.0453391 +0.0217176 0.0632088 0.0471364 +0.0359993 0.0955223 0.036379 +-0.0451488 0.0335546 0.00486717 +-0.0681193 0.15804 -0.05439 +-0.0661021 0.155727 0.025928 +-0.00573558 0.0684573 -0.035843 +-0.0181282 0.187252 -0.018852 +-0.0445141 0.050571 0.038927 +-0.00049716 0.0856626 0.0573342 +0.016507 0.0913965 0.0503683 +-0.0333397 0.0410057 0.0499212 +-0.0351946 0.125334 -0.00338173 +-0.0616183 0.16622 -0.0565931 +-0.0624979 0.0760891 0.0414437 +0.0350466 0.107363 0.0297386 +-0.0720199 0.063399 0.00874547 +-0.0877434 0.135138 0.0431967 +0.0458379 0.0588925 -0.00503856 +-0.0385014 0.119389 0.0303589 +-0.0647267 0.0417808 0.0373932 +-0.0226655 0.0537608 -0.0296706 +-0.0584982 0.105689 0.0406051 +-0.0137228 0.0685659 -0.0377913 +-0.0817302 0.142079 0.0441697 +-0.0426358 0.0548841 -0.0113796 +-0.0135008 0.082884 0.0573146 +-0.00338001 0.130095 0.0228247 +0.0172769 0.0708593 -0.0295557 +-0.0246932 0.065394 -0.0335995 +-0.0314011 0.178523 -0.00645128 +-0.0575589 0.154615 -0.000238768 +-0.0407441 0.0753914 -0.0183192 +-0.084936 0.144668 0.0388142 +-0.0365092 0.108385 0.0376381 +-0.0851088 0.102115 0.000391121 +-0.0646522 0.0642554 -0.00503339 +-0.0754983 0.145823 -0.00786764 +-0.0474148 0.133778 0.0200381 +0.012958 0.0904818 -0.0298536 +-0.0425054 0.0705013 0.0420152 +0.0369946 0.0686204 -0.0137746 +0.0462743 0.0775122 0.0165366 +-0.0417874 0.128546 0.00302224 +0.00250208 0.0547919 0.0536548 +-0.0543206 0.140979 0.0284164 +-0.0492132 0.138613 0.0153977 +-0.0204064 0.162527 -0.00684616 +-0.0194926 0.111309 0.040066 +-0.00849594 0.0829198 0.0577964 +-0.0467773 0.0826601 -0.021013 +-0.0535197 0.0472233 -0.00680686 +-0.0092432 0.169141 -0.0244221 +-0.0594862 0.0804633 0.0433033 +-0.0764447 0.154164 -0.0158984 +0.0585888 0.0538213 0.0151823 +-0.0588396 0.0925945 -0.0203375 +-0.0761105 0.167387 -0.0256061 +0.0432176 0.0401728 0.0130684 +-0.0395679 0.152136 0.0040279 +-0.0685344 0.180035 -0.058648 +-0.0404998 0.0930589 0.0424923 +0.0428754 0.100088 0.00417324 +-0.0320271 0.0553591 -0.0124271 +0.0199862 0.0348656 0.0241629 +-0.069479 0.123198 0.0530616 +-0.0239594 0.117024 -0.0138685 +-0.013157 0.175712 -0.0209577 +0.00451102 0.0674972 0.0557889 +0.0304128 0.0431004 -0.0051324 +-0.0887794 0.151473 0.0131594 +0.0317917 0.0949031 -0.0164462 +0.0342895 0.112223 -0.00202032 +-0.0728652 0.170808 -0.0480355 +0.0253565 0.075473 0.0472224 +-0.0754952 0.15561 -0.00190651 +0.060278 0.0581371 0.013168 +0.00444274 0.131539 0.0170385 +0.00950273 0.0546854 0.0525766 +-0.028415 0.178753 -0.00594863 +-0.011518 0.0431769 0.0500228 +-0.0504724 0.141671 0.0164028 +-0.0424936 0.045133 0.0413379 +0.0207994 0.125738 0.00307388 +-0.0689469 0.0433261 0.00632212 +0.0111753 0.0766426 0.0548499 +0.0297504 0.0462054 0.0339396 +-0.0674791 0.0622216 0.0214031 +0.0131787 0.0793804 0.0542326 +-0.0630395 0.136976 -0.00741235 +-0.0026931 0.0386465 0.0251959 +-0.0862725 0.103636 0.0233541 +-0.072832 0.162419 -0.0389636 +-0.0670825 0.156321 0.0197603 +-0.0572305 0.057508 0.0152056 +-0.0876158 0.136354 0.00421533 +-0.0214752 0.0609386 0.0459919 +-0.007347 0.0952877 -0.0329727 +-0.0613578 0.0586321 0.0151557 +0.00350505 0.0590839 0.0549927 +-0.0372275 0.160948 0.000450465 +-0.0457572 0.0336839 -0.00997088 +0.0106658 0.0351593 0.00371028 +-0.0714997 0.16363 -0.0138384 +0.00840839 0.117161 -0.0162388 +-0.0493716 0.143224 0.00839291 +0.0251748 0.123444 0.0203849 +0.0329112 0.096871 0.0389677 +0.044554 0.0917551 0.0201604 +-0.0384935 0.0562767 0.0397971 +-0.0785284 0.123123 0.0516319 +0.0426769 0.101505 0.0101616 +0.00833271 0.0567886 -0.0305627 +-0.0876135 0.100396 0.0230423 +-0.0327059 0.0779055 -0.0285245 +0.0119151 0.0860485 0.0542349 +-0.0675927 0.17056 -0.0354212 +-0.0807265 0.0770568 0.0269252 +-0.0384859 0.0520062 0.0392089 +0.0452145 0.0482364 0.0300085 +0.0204736 0.0851385 0.0500118 +-0.0600179 0.155783 0.0193707 +0.0164701 0.0976264 0.0474551 +-0.0456663 0.0410589 -0.0152981 +-0.0821974 0.128571 0.0521036 +-0.0304964 0.0974331 0.0445755 +-0.0540878 0.128312 0.0358453 +0.0390858 0.0407779 -0.000614316 +-0.0725241 0.13724 0.0489632 +-0.0620129 0.0587144 0.0113478 +0.0455822 0.0848004 0.0171734 +-0.0839185 0.112898 0.00127069 +-0.0728197 0.155564 0.00463235 +0.0277412 0.121021 0.0227689 +0.0301995 0.0768447 0.0437008 +-0.0106344 0.174261 -0.0225996 +-0.0617342 0.0737271 -0.0167014 +-0.0414956 0.0464933 0.0408152 +0.03243 0.0535036 0.0361605 +-0.0377322 0.150234 -0.00179971 +-0.0847627 0.109032 0.02334 +-0.0642974 0.167953 -0.0385345 +-0.0221614 0.0825281 0.0558751 +-0.0504951 0.0960175 0.0443724 +-0.0508177 0.0501221 0.014822 +-0.0436492 0.0577877 -0.0118151 +-0.0189776 0.0390241 0.0529956 +-0.0623698 0.169401 -0.0505859 +-0.0105368 0.0850533 -0.0384463 +-0.0181795 0.183113 -0.0176247 +0.0314401 0.110365 -0.00894711 +-0.0127075 0.065682 -0.0367743 +-0.0273345 0.172717 -0.009826 +-0.0666857 0.141706 -0.00893584 +0.0408833 0.10285 0.0201769 +-0.0876525 0.145908 0.0330215 +-0.0436328 0.056346 -0.0115255 +-0.0611631 0.0428583 0.0256966 +-0.0330915 0.16076 -0.0136886 +-0.085208 0.150101 0.00618898 +-0.0615069 0.172523 -0.0575905 +0.0555907 0.0604655 -0.000426808 +-0.0850315 0.151395 0.00719993 +-0.0728007 0.0864364 -0.0158265 +-0.003188 0.127967 0.0287063 +0.0455462 0.0861954 0.016167 +-0.0217098 0.115215 -0.0159934 +-0.0414975 0.0916447 0.0424797 +0.0487043 0.0430197 0.0122221 +-0.0869351 0.106366 0.0163624 +-0.0156753 0.0541059 -0.0332392 +-0.06162 0.150156 -0.00124665 +-0.00577101 0.098213 -0.0280417 +0.0223236 0.0550419 -0.0260567 +-0.00429403 0.131101 0.0138416 +-0.0636168 0.143654 -0.00954122 +-0.0855598 0.0912595 -0.00155473 +-0.0404413 0.10705 0.0387043 +0.0547917 0.0553704 0.0263503 +-0.0822116 0.101996 0.0303518 +-0.0437463 0.128889 0.0155826 +-0.0664819 0.0397537 -0.00588584 +-0.067283 0.161835 -0.0137578 +-0.061699 0.0599431 0.00295203 +-0.0715633 0.170815 -0.0500445 +-0.0861137 0.0805676 0.00950062 +-0.0502228 0.125461 0.0326401 +0.0589666 0.0552427 0.017183 +-0.0327176 0.125444 0.0196276 +-0.0632934 0.151996 -0.00122225 +-0.0512927 0.135429 -0.000552487 +-0.0184842 0.0897075 0.0555921 +-0.0260646 0.11803 -0.0129143 +0.0198889 0.0631747 0.0480195 +-0.0465912 0.145038 0.00283923 +0.0534733 0.0728245 0.019221 +-0.0352804 0.0341155 -0.0193879 +-0.0829241 0.126549 -0.00467577 +0.0279852 0.0352646 0.0181572 +-0.0531741 0.150869 0.0213978 +0.0202497 0.0347399 0.020698 +-0.062763 0.149042 -0.0175788 +0.00226918 0.115596 -0.0185376 +0.0250704 0.12404 0.011788 +-0.045498 0.101529 0.0420301 +-0.058497 0.0426323 0.0447374 +0.0455164 0.0904085 0.0121603 +0.0215692 0.0352857 0.025924 +-0.0274987 0.0631476 0.0380009 +-0.0140602 0.172758 -0.0187663 +0.0587826 0.0538552 0.0121765 +-0.0628795 0.15219 -0.00958093 +-0.0468135 0.1536 0.00939603 +-0.0928405 0.121514 0.033281 +-0.0622964 0.150648 -0.0145762 +0.0475064 0.0611159 0.0308231 +0.00412571 0.107297 -0.0203039 +-0.0703978 0.156305 0.0156818 +-0.053643 0.135335 0.0311995 +0.0067064 0.0341407 0.0184863 +-0.0466442 0.0397388 -0.0142756 +0.0119051 0.0711889 0.0540767 +-0.0447375 0.0357143 0.0441717 +-0.0228183 0.0840509 -0.0381648 +-0.023326 0.122164 -0.00726067 +0.0441999 0.0790177 0.0251667 +-0.0276246 0.160982 -0.00149388 +-0.0399791 0.126816 0.018458 +0.0222264 0.09191 -0.0233017 +-0.0627692 0.156841 -0.0155919 +0.044508 0.0412168 0.00624902 +-0.0731279 0.155455 -0.0309078 +0.0183024 0.0347298 -0.00182982 +-0.01652 0.0715906 0.0550352 +-0.091634 0.141989 0.0201675 +0.0440337 0.0734407 -0.000804833 +-0.0524198 0.0648658 0.0346087 +0.0572481 0.0508905 0.0141872 +-0.0164766 0.111102 -0.0196668 +-0.0418874 0.108498 -0.0194287 +0.0321354 0.0549697 0.0375085 +-0.0644897 0.102874 0.0413067 +0.0465079 0.0583728 0.0318256 +-0.0334582 0.0518969 0.0377238 +-0.0729908 0.139888 -0.00698816 +-0.0534544 0.124093 0.0367404 +0.0173165 0.0622663 -0.028279 +-0.0554104 0.0513256 0.00948897 +-0.014903 0.172738 -0.0182312 +-0.0502115 0.141667 0.015397 +0.0229958 0.0375848 0.0332895 +-0.0749615 0.135451 -0.00681495 +-0.0855353 0.0938173 0.0282665 +-0.069508 0.102769 0.0393316 +-0.0205392 0.0971418 -0.0249761 +-0.0312923 0.0362769 0.0513145 +0.0260175 0.0991397 -0.0189626 +-0.00594641 0.0989148 -0.0267499 +-0.0708605 0.0347825 0.00928864 +-0.0845393 0.103233 0.0269979 +0.0406232 0.0953057 0.0289912 +-0.0456818 0.0650665 -0.0140257 +-0.0326318 0.168236 -0.00522072 +-0.0765723 0.0689281 0.00553415 +-0.0176728 0.049548 -0.0303695 +0.00113463 0.130461 0.00151005 +-0.08699 0.0859713 0.00247197 +-0.0338357 0.095789 -0.0234311 +-0.0304987 0.10293 0.0419798 +0.0336335 0.0713894 0.0398251 +-0.0224957 0.101642 0.0440993 +0.0309373 0.119109 0.0111337 +-0.0734894 0.156164 0.020416 +-0.000755237 0.0740961 -0.035785 +0.0354988 0.0469226 0.030944 +-0.00617179 0.128513 -0.00228639 +-0.00460988 0.0388908 -0.00276124 +-0.0678289 0.135464 0.0458614 +0.0345596 0.114411 0.00388032 +-0.0884532 0.112251 0.0353052 +-0.0709934 0.170517 -0.0295248 +0.0284454 0.0995183 0.0412905 +0.0402167 0.0685122 0.0317439 +-0.0665769 0.0362823 0.0365183 +-0.0765583 0.148625 -0.00886956 +0.0576507 0.0606695 0.00219201 +0.060413 0.0664733 0.017165 +0.022246 0.0835763 0.0498509 +-0.0821459 0.0912329 0.0320422 +-0.0746727 0.145787 -0.00986958 +0.0345089 0.111329 0.0271807 +0.0594367 0.0663847 0.00713811 +0.0282217 0.0664463 -0.0207545 +-0.0619747 0.170963 -0.0535908 +-0.0394944 0.0492076 0.0395541 +-0.0787666 0.165266 -0.0299591 +-0.0749441 0.129634 -0.00796551 +-0.00112962 0.125371 0.0323555 +-0.0154803 0.0500282 0.047966 +0.0153592 0.0953434 0.0487033 +-0.085237 0.147388 0.00618456 +-0.0128008 0.0841443 -0.0388521 +0.024383 0.0518665 -0.0223004 +-0.0342551 0.0766309 -0.0244955 +-0.0670839 0.173532 -0.0453192 +-0.0772544 0.0764799 0.0316515 +-0.0270646 0.053566 0.0376661 +-0.0225205 0.112681 0.0384786 +-0.0884304 0.0874699 0.00847782 +-0.0737584 0.0914853 0.0405847 +-0.064968 0.128232 -0.00872903 +0.000512384 0.127929 0.028588 +-0.0599553 0.0610872 0.0239566 +-0.0384792 0.116679 0.0322191 +-0.0485119 0.112536 -0.0170517 +-0.0304781 0.0523954 -0.0163632 +0.0387588 0.108855 0.00681782 +-0.0406156 0.155109 0.0060988 +-0.0471466 0.149481 -0.0040486 +0.0179495 0.127337 0.00345096 +-0.0395837 0.0336987 -0.0198537 +-0.0633751 0.0344193 0.0288044 +-0.0424853 0.128365 0.0145816 +-0.0364913 0.113889 0.0338295 +0.0353283 0.112832 0.00268414 +-0.0653226 0.0343003 0.0144151 +0.0435313 0.065065 0.0273105 +-0.0795726 0.0867837 -0.00954059 +-0.0104381 0.171321 -0.0205524 +-0.0737003 0.156269 0.0145144 +-0.0733818 0.155466 -0.0289107 +-0.0198527 0.0382258 0.0238627 +-0.0188257 0.0725897 0.0542693 +-0.0778777 0.117832 -0.00599287 +-0.0365049 0.10423 0.0397359 +-0.00948278 0.0978353 0.051868 +-0.0103201 0.0393296 0.0497389 +-0.0876274 0.137747 0.00620032 +0.0416732 0.0819555 0.0304093 +0.0608524 0.0609661 0.0101561 +-0.0767143 0.154218 -0.0048969 +0.0174945 0.0838575 0.0514031 +-0.066433 0.0337378 -0.00503676 +-0.0232113 0.177135 -0.0206374 +0.0100949 0.034771 0.018605 +0.042675 0.0751161 0.0282624 +-0.0866662 0.0833296 0.0114916 +-0.0504965 0.157865 0.00943584 +0.0433406 0.0973216 0.0191637 +-0.0888303 0.0915034 0.00845607 +-0.0555242 0.0415797 -0.00918326 +-0.0337405 0.075174 -0.025488 +-0.0906275 0.137865 0.0211926 +-0.0123027 0.0389534 -0.0136872 +-0.045835 0.0941966 -0.0219229 +-0.0238433 0.163025 -0.0155105 +-0.0522937 0.12758 -0.00475935 +0.0308793 0.0356029 0.0166157 +0.0423563 0.0588819 -0.00453174 +-0.00663392 0.0466819 -0.0297341 +-0.0484493 0.0656843 0.0374132 +-0.0270407 0.125883 0.0113821 +-0.0910269 0.129538 0.0072515 +-0.0455907 0.0447683 -0.0109766 +0.00905498 0.0971664 -0.0248901 +0.00396755 0.0341147 0.00886829 +0.00550365 0.123767 0.0339438 +0.0400787 0.0432895 0.0279756 +-0.00815712 0.126302 0.0298556 +-0.0609217 0.118124 -0.010668 +-0.0141549 0.129252 0.0145753 +0.0274448 0.120188 0.0255104 +-0.0485004 0.111187 0.0370789 +0.0451596 0.0789195 0.0230398 +-0.0138991 0.162654 -0.0155462 +-0.0528814 0.0447887 0.0196824 +0.0277468 0.0465681 -0.0107176 +-0.0580291 0.124109 0.0406616 +-0.0404897 0.0874362 0.0429424 +0.0316544 0.117354 0.0228159 +0.0277648 0.098182 0.0420578 +-0.0391765 0.165177 -0.0125287 +-0.0691207 0.112747 0.0474107 +-0.0614963 0.102908 0.0417081 +0.0393676 0.0927337 0.0325144 +0.0214921 0.125223 0.0232941 +-0.0167077 0.059948 -0.0356741 +-0.0619704 0.118373 0.041992 +-0.0359339 0.109235 -0.0196158 +-0.0150259 0.185694 -0.0231645 +0.0245929 0.0577938 0.0442192 +-0.00233157 0.122878 -0.010278 +-0.0434949 0.0817618 0.042266 +0.0298844 0.0350171 0.0132987 +-0.00424346 0.0409986 0.0479883 +-0.0776115 0.15005 -0.0049035 +-0.0124244 0.108763 -0.0212047 +-0.0798966 0.083235 0.0342815 +-0.0813623 0.104616 -0.00457868 +-0.0167402 0.0671791 -0.0380101 +0.0259555 0.123153 0.0178233 +0.0406613 0.0638232 0.0297482 +-0.0129458 0.117871 -0.0148632 +-0.0708515 0.0937008 -0.0159297 +-0.0688238 0.1383 0.0462399 +-0.0886846 0.136388 0.00720801 +0.0460186 0.0714912 0.0208033 +0.0465334 0.07646 0.0111853 +0.000795729 0.0345137 0.0115011 +0.0318042 0.0661523 0.0406683 +-0.0277917 0.0810724 -0.036339 +-0.012329 0.0361667 0.050366 +-0.0672863 0.151256 -0.0426939 +0.0328851 0.0556122 -0.0127142 +-0.0444939 0.107088 0.0401229 +-0.088037 0.113814 0.026966 +-0.0228073 0.184465 -0.0170667 +-0.00369909 0.0598617 -0.0340393 +-0.0698551 0.16523 -0.017589 +-0.0464984 0.047794 0.0396541 +-0.0756919 0.143067 -0.00582827 +-0.0208788 0.0383361 0.00183886 +-0.0768287 0.154208 -0.00589938 +-0.0147866 0.0799249 -0.0391233 +-0.0699384 0.150598 0.0380766 +-0.0866088 0.126656 -0.00171455 +-0.0792409 0.168033 -0.0359701 +-0.0650871 0.0417056 0.03635 +0.0353256 0.109535 -0.00390394 +0.00651309 0.0828012 0.0562471 +-0.0512535 0.0528689 0.0137817 +-0.0635072 0.0590749 0.0125217 +-0.0892074 0.127019 0.0449806 +0.0451896 0.0875706 0.0191665 +-0.0576689 0.0350157 0.0450337 +-0.0441239 0.129077 0.0169132 +0.00351519 0.0634007 0.0566286 +-0.0456618 0.0741031 -0.0174455 +-0.045802 0.0382259 -0.0192856 +-0.0774749 0.141413 0.0470689 +0.019092 0.0350694 0.0292369 +-0.0721908 0.176974 -0.0457483 +-0.0228049 0.0784515 -0.0385457 +-0.0196863 0.0539295 -0.0316066 +0.0370985 0.0632585 0.0359995 +-0.0097823 0.0613531 -0.0352263 +-0.0518485 0.147799 0.0174109 +-0.0424957 0.11253 0.0356818 +-0.00161218 0.0387745 0.0252993 +0.0432025 0.0777701 0.0272794 +0.0158912 0.0644868 0.0510299 +-0.0624956 0.0861834 0.0447184 +0.0226823 0.0605452 0.0467602 +-0.0345153 0.0780634 -0.0235017 +-0.0693572 0.156301 0.0160519 +-0.0848272 0.110715 0.0391424 +0.00397477 0.0389229 -0.0104191 +-0.0107444 0.0685007 -0.0365794 +0.0105122 0.0673666 0.0542979 +-0.0493982 0.113885 -0.0164603 +0.0292359 0.120576 0.0147663 +0.0143954 0.0433708 -0.024029 +-0.0548811 0.099887 -0.0210509 +-0.0345638 0.113971 -0.0166195 +-0.00945158 0.0346766 0.0453022 +-0.0114995 0.0486859 0.0490069 +0.047721 0.0729559 0.00883547 +0.00782583 0.131487 0.0111342 +0.018385 0.126365 0.000765748 +-0.0801977 0.117632 0.0490824 +0.0508224 0.0446928 0.0102182 +-0.0792484 0.154932 0.0111245 +-0.0616259 0.175734 -0.0596865 +-0.0554957 0.10156 0.042627 +-0.0693451 0.162383 -0.0509602 +0.0464905 0.0624784 0.0299685 +-0.0626979 0.149033 -0.0165859 +-0.027787 0.0838632 -0.0360686 +-0.068908 0.112267 -0.0105177 +-0.0464636 0.157957 0.00818306 +-0.0656199 0.0690554 -0.0100807 +-0.0594903 0.081873 0.0434438 +-0.042501 0.0803745 0.0423542 +-0.0715599 0.0733863 -0.0105456 +-0.00392373 0.129832 0.00104637 +0.0231411 0.0844685 -0.0255261 +-0.0582906 0.0411368 0.01871 +-0.0231503 0.121506 -0.00857745 +0.0353371 0.0534224 -0.00701071 +-0.028498 0.108421 0.0390601 +-0.0161996 0.0386499 0.0314325 +0.0417053 0.0943445 -0.00480688 +-0.037505 0.0874848 0.0436782 +-0.0859867 0.140484 0.00417932 +-0.0394569 0.124785 -0.00795634 +-0.0629125 0.111049 -0.0145904 +-0.0697706 0.0337438 0.00328799 +0.0353216 0.0863185 -0.0174167 +-0.0529232 0.125495 0.0357533 +-0.0145001 0.0870236 0.0569643 +-0.00422597 0.10111 -0.0231367 +0.026954 0.114984 -0.00791167 +0.0123614 0.0509077 -0.0278502 +-0.0705953 0.157132 -0.0018785 +-0.0270301 0.0604609 -0.0294673 +-0.0252429 0.163867 -0.00684922 +0.0164575 0.0900289 -0.0273543 +0.0182356 0.126981 0.00216332 +-0.0276261 0.15573 -0.00786612 +-0.0687195 0.165823 -0.0200644 +-0.0237576 0.0713185 -0.0373359 +-0.0350727 0.157773 -0.0116201 +-0.0115095 0.129073 0.00398865 +-0.000506085 0.0442149 0.046198 +0.0372544 0.109701 0.0220387 +-0.0154921 0.0382096 0.0157388 +-0.0500202 0.131989 -0.0014354 +-0.025472 0.0851651 0.0520429 +-0.0328435 0.125555 0.000439943 +-0.0773991 0.152954 0.0323974 +-0.0504161 0.144734 0.0123765 +-0.0576549 0.124438 -0.00742698 +0.0532901 0.0621073 -0.00218568 +-0.0298754 0.0748068 -0.0335581 +-0.0642433 0.0338438 0.0114826 +-0.0316113 0.0409091 -0.0301005 +0.00142887 0.0392678 -0.00936829 +0.0274179 0.122108 0.0155174 +-0.0144987 0.0884006 0.0568363 +-0.0184962 0.109943 0.0409607 +0.0379028 0.0997575 -0.00879746 +-0.0244855 0.0461464 0.0516096 +0.03717 0.0713299 0.0361376 +0.0442521 0.0804694 -0.00179963 +-0.0693598 0.153979 -0.049866 +-0.045049 0.0367204 -0.0222184 +0.0226853 0.115014 -0.0119595 +0.0308676 0.0713453 0.0410867 +-0.0253533 0.0381958 0.00468802 +0.0115087 0.101793 0.0474223 +0.0122157 0.0346138 -0.0197432 +-0.078807 0.10613 0.032485 +0.0412927 0.101424 0.0211601 +0.0449984 0.0413097 0.00725015 +-0.0614983 0.0861808 0.0447299 +0.0201601 0.0357218 -0.00467829 +-0.0270641 0.0376545 -0.0293745 +-0.0491197 0.137061 0.00540677 +-0.00249881 0.0829011 0.0575494 +0.021052 0.0358187 -0.0026817 +-0.0154895 0.0559453 0.0511175 +-0.0718433 0.0833097 0.0403454 +-0.087976 0.141871 0.0376917 +-0.0787586 0.163869 -0.0289482 +-0.0485008 0.0732772 0.0415918 +-0.0366615 0.0606699 -0.0121541 +0.0262206 0.0435744 -0.00668237 +0.000219502 0.0370979 0.0467851 +-0.00149685 0.0456811 0.047029 +-0.0545635 0.122251 -0.00910565 +-0.0186556 0.0480312 -0.0293255 +0.0387854 0.0701818 -0.0117862 +-0.0654945 0.0398115 -0.0063825 +-0.0437744 0.116579 -0.0153348 +-0.0344901 0.0987486 0.043091 +0.0610023 0.062364 0.012157 +0.0141007 0.120583 0.0346592 +-0.0823269 0.108767 -0.000607289 +0.0214843 0.092023 0.0479434 +-0.070667 0.0763937 -0.014042 +0.021114 0.0592021 0.0480036 +0.0252499 0.0775815 -0.0248688 +-0.0601377 0.0338299 0.0176745 +-0.0579501 0.0592474 0.0206872 +-0.0769058 0.154074 0.0295482 +0.0198639 0.11968 -0.0089705 +0.0022305 0.0754937 -0.0353597 +-0.00780413 0.0840976 -0.0379648 +-0.0611789 0.172541 -0.0596341 +-0.0447417 0.0768063 -0.0185987 +-0.017374 0.0569064 0.0504968 +0.00450466 0.087016 0.0568401 +-0.0709391 0.109631 0.0395791 +-0.0674006 0.0406253 -0.00334064 +-0.0311093 0.169745 -0.00652433 +0.0242906 0.0676576 -0.0247124 +-0.0326084 0.171239 -0.00339173 +-0.0325897 0.0666513 -0.0194517 +0.0319052 0.0437397 0.0295375 +-0.0450254 0.127281 -0.00449582 +-0.0226309 0.0478785 -0.0276417 +-0.0583127 0.0580812 0.00726379 +-0.037778 0.0827556 -0.0219531 +-0.0518874 0.106988 -0.0190452 +0.0163996 0.044784 -0.0236657 +0.0103374 0.0553349 -0.0300221 +0.0206753 0.126786 0.0115854 +-0.0850979 0.131233 0.0492505 +-0.0192324 0.177141 -0.0234526 +-0.0199616 0.0697296 0.0526775 +-0.0561055 0.158254 0.000206899 +-0.055732 0.115927 -0.0145408 +-0.0417663 0.162365 0.00442786 +-0.0305905 0.119479 -0.0103702 +0.0234999 0.0955508 0.0464417 +-0.0498856 0.149233 0.0119087 +-0.0154824 0.185702 -0.0219175 +0.00917376 0.125511 -0.00726227 +-0.0913426 0.147495 0.0231401 +-0.00381375 0.0896299 -0.0357356 +-0.0686943 0.154419 0.0308917 +-0.02552 0.111233 0.0379672 +-0.0705473 0.1414 0.0460484 +-0.00201946 0.100869 0.0458524 +-0.0876244 0.129442 0.00130199 +-0.00449535 0.0965559 0.0536663 +-0.0271292 0.0850573 0.0494379 +-0.0914908 0.1337 0.0152201 +0.00523694 0.126704 0.0302977 +-0.0470651 0.153179 -0.00606436 +-0.0672153 0.156284 0.0168104 +-0.0427934 0.0869807 -0.0215837 +0.0423379 0.0683118 0.0277209 +-0.0295859 0.0790353 -0.0345348 +-0.0477964 0.062891 0.036824 +-0.00968443 0.0570101 -0.0338896 +0.0451851 0.0861731 0.0211635 +0.00951284 0.0532319 0.0521285 +0.0302906 0.0787129 -0.0208549 +-0.0738862 0.104992 -0.0108534 +0.0453646 0.0575572 -0.00557548 +-0.0663103 0.0759418 0.0397029 +0.0143833 0.128699 0.00214848 +0.00580886 0.130668 0.0218239 +-0.0131274 0.0387957 -0.00624825 +-0.00997898 0.172997 -0.0279186 +-0.0620827 0.174072 -0.0556227 +-0.0546337 0.0334816 0.0119976 +0.0208676 0.121124 0.0316774 +0.0220436 0.125932 0.0163676 +0.0377227 0.0561747 0.0314909 +-0.0721609 0.147032 -0.0238695 +-0.0738111 0.0907253 -0.0150698 +-0.0362217 0.0335837 -0.0228111 +0.0387097 0.105846 2.20656e-05 +-0.0556277 0.0365615 0.0468082 +-0.0836005 0.0763298 0.006515 +0.0280677 0.100848 0.0407486 +-0.0831241 0.100626 0.0298981 +-0.0305493 0.0479587 -0.0242789 +0.0165747 0.0519808 0.0466207 +0.0447673 0.0847221 0.00118921 +-0.0146056 0.0435263 -0.0269315 +0.0273074 0.0346174 0.0112772 +-0.0683005 0.139737 0.0452157 +-0.0485925 0.132707 0.00186362 +0.00897502 0.113705 0.0394792 +0.010104 0.0343592 -0.0200136 +-0.0769339 0.126684 -0.00758482 +0.00350625 0.0547769 0.0535608 +-0.0850528 0.0993835 -0.000573805 +0.00144009 0.0350568 0.0184024 +-0.0301745 0.17266 -0.0167996 +-0.0732751 0.148715 -0.0303812 +-0.0837086 0.0952625 0.0306499 +-0.0742711 0.149885 -0.0318724 +-0.00654578 0.0384949 0.010053 +-0.0248989 0.0968475 -0.0246804 +-0.0633856 0.148243 -0.0195768 +-0.0647288 0.126998 0.0468559 +-0.058406 0.0598457 0.000248469 +0.0425358 0.0710418 0.0280089 +-0.0915343 0.140602 0.0181819 +-0.0407824 0.116214 -0.0149415 +-0.0445073 0.0491885 0.039305 +0.0294698 0.0801098 -0.0210213 +-0.0277559 0.0348695 0.0499059 +-0.0137302 0.107232 -0.0215702 +-0.0482685 0.037339 -0.0123839 +-0.0673815 0.0659915 0.0287149 +-0.0567046 0.11983 0.0390246 +0.0211901 0.113994 0.0360983 +0.0319596 0.11565 0.0257836 +-0.050462 0.0402796 0.0458238 +-0.0364752 0.09732 0.0430461 +0.00119043 0.0895238 -0.0341779 +-0.0699807 0.149351 0.039589 +0.0439472 0.0917185 0.0231564 +-0.0559199 0.113507 -0.0160179 +-0.0853556 0.095327 -0.00158429 +-0.0662723 0.154476 -0.00173975 +-0.0186027 0.111108 -0.0196906 +-0.0563562 0.140993 0.0307629 +-0.00358231 0.0383094 0.0162632 +-0.0568935 0.0562594 0.000567085 +-0.00649422 0.0590504 0.0549316 +-0.0245507 0.183147 -0.010424 +-0.032468 0.175717 -0.00291757 +-0.0132616 0.175663 -0.0275653 +0.00407218 0.0361395 0.0234015 +-0.00250245 0.104479 0.0441797 +0.00787676 0.127927 0.0283381 +-0.0760841 0.164579 -0.0198769 +-0.0814657 0.130234 0.0522094 +0.0322493 0.109934 -0.00848346 +-0.0747758 0.152715 -0.0228916 +-0.0360726 0.1261 0.0198793 +0.00651921 0.0869957 0.0564058 +-0.0863282 0.151358 0.00923307 +-0.00766666 0.0527037 -0.0328501 +0.0329828 0.110047 0.0302661 +-0.0819069 0.0844754 0.0320139 +0.020413 0.0521197 0.0451417 +-0.043267 0.149185 0.00566881 +0.03267 0.0767015 -0.0187757 +-0.0861456 0.140625 0.0415389 +-0.0665323 0.154667 0.00252946 +-0.0231566 0.158136 -0.0102789 +-0.0217907 0.0957944 0.0466571 +-0.0638349 0.156748 -0.0426051 +-0.0346441 0.117803 -0.0126135 +0.00980894 0.0658051 0.0545289 +-0.080258 0.0859229 0.0345477 +-0.0117542 0.0386862 -0.015202 +-0.080536 0.135397 0.0502642 +-0.0325368 0.0792892 -0.0295289 +-0.0784828 0.0717889 0.00251767 +-0.00149343 0.0883979 0.0566431 +-0.0137942 0.0386802 -0.0156021 +-0.0444896 0.101534 0.0420576 +-0.00192307 0.107424 -0.021877 +-0.0440699 0.153194 -0.00699527 +0.00318991 0.0880718 -0.0337792 +-0.0344943 0.0718865 0.0415833 +-0.030416 0.0692532 -0.0284548 +-0.0622359 0.167822 -0.0495929 +-0.0344858 0.100109 0.0424402 +0.00649387 0.0590149 0.0539921 +0.0360791 0.111295 0.00152105 +-0.0587368 0.0434475 0.0440841 +-0.0417025 0.0666657 -0.0153449 +-0.0533816 0.0513995 0.0117052 +-0.0285002 0.097396 0.0440561 +-0.0690491 0.153118 -0.0485047 +-0.0144923 0.093841 0.0546527 +-0.0633747 0.036885 -0.0080479 +-0.0706693 0.165215 -0.0479768 +0.0127157 0.0350729 0.0423657 +0.00853944 0.100396 0.0475311 +0.0211162 0.126093 0.00605375 +-0.0514924 0.113914 0.0348157 +0.0172187 0.117738 -0.0128881 +-0.01069 0.0969192 -0.0307004 +0.0121568 0.0930338 -0.0284961 +-0.0772387 0.158974 -0.0142914 +-0.0667905 0.0852019 -0.0183581 +0.0154254 0.0834009 0.0522607 +-0.0487147 0.0723044 -0.01565 +-0.0464696 0.0675313 0.0396048 +-0.0110203 0.0383532 0.0129011 +-0.0205151 0.114503 -0.0172551 +-0.0556769 0.0499718 0.00979142 +-0.0503626 0.0642656 0.0349674 +-0.00189958 0.130575 0.00323807 +-0.00749418 0.0533074 0.0526841 +-0.0781504 0.0736081 0.0268981 +-0.00216638 0.09997 -0.023881 +-0.0374964 0.119384 0.0304732 +-0.0237883 0.0932085 0.0487292 +-0.0846322 0.139314 0.044315 +0.00579995 0.0355749 0.0242599 +-0.0498385 0.0970763 -0.0221981 +0.0311277 0.0795524 0.0433085 +-0.080771 0.105947 -0.00458985 +-0.0541694 0.136721 0.0304424 +-0.0158788 0.038593 -0.0159367 +0.0375503 0.0588742 -0.00872526 +-0.0278572 0.0972984 -0.0239915 +-0.0609119 0.0678343 0.0355003 +0.0406749 0.0801882 -0.00878559 +-0.0891047 0.101026 0.0153901 +0.0370023 0.11146 0.00905905 +-0.00649525 0.0576581 0.0543368 +0.0215982 0.0645366 0.046975 +-0.0290293 0.160675 -0.0139931 +0.00903586 0.100133 -0.0220275 +-0.0584961 0.104303 0.041452 +-0.0664115 0.162305 -0.0579417 +0.0239006 0.0520481 0.0413924 +-0.0216874 0.126575 0.00458035 +-0.0485184 0.0438796 0.0435224 +-0.0231474 0.0384868 -0.00611954 +-0.00826521 0.0380456 0.0491273 +-0.0528526 0.147782 0.0214111 +-0.0907516 0.137857 0.0201957 +-0.0758557 0.103473 -0.0101675 +-0.0397582 0.079747 -0.0196231 +-0.0147733 0.078434 -0.0385776 +0.00381296 0.0379313 -0.0132938 +-0.0694673 0.0635361 0.0216095 +-0.0528954 0.105563 -0.0191967 +0.0343906 0.0529675 -0.00763383 +-0.0293172 0.172724 -0.00740528 +0.00850711 0.0688384 0.055257 +-0.016261 0.181575 -0.0262548 +0.0213104 0.0415776 -0.0147 +-0.0780733 0.100357 -0.00962255 +-0.0846334 0.108922 0.00436756 +-0.0186964 0.0569405 -0.033635 +-0.037924 0.175153 -0.00739726 +-0.049768 0.081217 -0.020889 +0.0335081 0.0942386 0.0398247 +-0.0729901 0.154042 -0.0338982 +-0.0233975 0.156883 -0.00572928 +-0.0873262 0.103661 0.0203534 +-0.0501055 0.129693 0.0310292 +0.029581 0.0907082 -0.0200166 +0.043329 0.066441 -0.000599376 +-0.00664168 0.0482162 -0.0304375 +0.021889 0.0963552 -0.0220144 +-0.0265893 0.161003 -0.00174275 +0.044803 0.0945847 0.0121616 +-0.0725608 0.109721 0.0409258 +-0.0372497 0.126436 -0.00264816 +0.005339 0.0971934 -0.026912 +-0.0241177 0.120704 -0.00972559 +-0.0462757 0.0390662 0.0448146 +-0.00565778 0.12946 0.000751082 +0.0213227 0.122349 -0.00385694 +-0.0414913 0.0790271 0.0430475 +0.0190905 0.127062 0.0195525 +-0.0805286 0.124537 0.0519983 +-0.0782836 0.0860139 0.0367982 +0.0219644 0.126042 0.013483 +-0.0325696 0.0410226 0.0505793 +0.0295979 0.039453 0.0274445 +-0.0475678 0.0446906 -0.0104074 +-0.0654918 0.0917539 0.043991 +-0.0307813 0.122738 0.0233033 +-0.0854845 0.112639 0.0445732 +0.0231366 0.0404268 -0.00664294 +-0.00398687 0.126095 0.0313534 +-0.0641503 0.0436305 0.0113748 +-0.0314872 0.0646167 0.0387865 +-0.0776274 0.0692865 0.00957677 +-0.0195579 0.0946763 0.0515134 +0.014517 0.0344542 -0.0117299 +-0.0376663 0.0621956 -0.0129723 +0.00459507 0.101613 0.0450146 +-0.0281642 0.0346776 -0.0203658 +0.0147654 0.125019 -0.0047274 +-0.0344283 0.0338921 0.0139586 +-0.0364985 0.117968 0.0313259 +-0.0456444 0.0592254 -0.0120696 +-0.0260288 0.0381935 0.00636573 +-0.088169 0.124336 0.0468831 +-0.0540681 0.135339 -0.00310003 +-0.0291607 0.171183 -0.0175503 +0.0104455 0.0488162 0.0487077 +-0.0881632 0.0861128 0.0124706 +-0.0258758 0.0578187 0.0391737 +0.00450037 0.0427385 0.0456181 +-0.0537204 0.0491564 0.0326591 +0.0388727 0.0645792 -0.00975725 +-0.0500679 0.0501277 0.0166633 +-0.0669104 0.120913 -0.00889891 +-0.036233 0.0469115 -0.0220883 +-0.0118859 0.163867 -0.0168515 +-0.0619905 0.129678 -0.00799355 +-0.0652279 0.0397522 0.0288372 +-0.0508809 0.104197 -0.0202021 +-0.00186382 0.104504 -0.0225214 +-0.0619023 0.120903 -0.00899386 +0.00323955 0.0754773 -0.0351385 +-0.0384934 0.105604 0.0386511 +-0.0905225 0.118622 0.0053153 +-0.0284893 0.0835322 0.0466293 +0.00823162 0.0387858 0.0309201 +-0.0616053 0.156855 -0.0285887 +-0.0508615 0.101367 -0.0215394 +-0.0318582 0.102916 -0.0222908 +0.00526525 0.0350275 0.0444668 +-0.0646344 0.0337755 0.00968147 +-0.0640121 0.136992 -0.00763419 +-0.0456074 0.0345826 0.0394197 +-0.0864043 0.111678 0.00530063 +-0.0207807 0.0581858 0.0468036 +-0.0608886 0.105445 -0.0177606 +0.0417928 0.0746499 -0.00676608 +0.0195225 0.0821843 0.0511684 +-0.0464961 0.0833304 0.0442498 +0.0164933 0.119532 0.0345952 +-0.0626731 0.158367 -0.0396045 +0.00725591 0.129807 0.000165614 +-0.0909094 0.114612 0.0400043 +-0.0496217 0.0532216 -0.00894483 +-0.0204558 0.0772045 0.0549311 +-0.0225647 0.184728 -0.0122995 +-0.0389284 0.111648 -0.0181691 +-0.0312712 0.125373 0.00251041 +-0.0157734 0.075693 -0.0388238 +0.0245364 0.0862451 0.0478999 +-0.0296756 0.125596 0.0148252 +-0.0446861 0.130064 0.0166863 +-0.0225936 0.0382891 0.00334965 +-0.0787949 0.0758277 -0.00557109 +-0.0665305 0.155586 -0.0523326 +-0.0631388 0.0620641 0.0242 +0.0275571 0.0875682 0.0452466 +-0.0838788 0.153353 0.0242347 +-0.0365497 0.124951 0.0226726 +0.0318595 0.0673315 0.0407335 +0.00950257 0.0896505 0.0545501 +-0.0597218 0.118329 0.0399103 +-0.0840037 0.0992695 0.0294026 +-0.0777723 0.0832737 0.0363717 +0.0427594 0.0986702 0.00117933 +-0.0422677 0.111306 -0.0177858 +-0.0762231 0.16043 -0.0125715 +-0.0634008 0.115527 0.0417242 +-0.036507 0.106984 0.0382357 +-0.0384749 0.0351927 -0.0135871 +-0.0744578 0.144386 -0.00789461 +0.0593202 0.0701868 0.012517 +-0.0226744 0.0522819 -0.0290541 +-0.0875766 0.122583 -0.000713178 +-0.0170034 0.127025 0.0015954 +-0.0705369 0.155342 -0.0479286 +-0.0709342 0.128224 -0.00904999 +0.00705252 0.0346309 0.0397936 +-0.0585604 0.133937 0.0364008 +-0.0863384 0.102179 0.00442425 +0.0107631 0.0671702 0.0541647 +-0.0695537 0.163673 -0.0146023 +-0.0452915 0.1298 0.0046882 +0.00836647 0.0494746 -0.0282442 +-0.0691053 0.0641529 -0.000471523 +-0.0065051 0.0518538 0.05236 +-0.0557789 0.0811944 -0.0212002 +-0.0801928 0.109885 0.0408487 +-0.0136098 0.0997657 0.0454373 +0.0375013 0.045461 0.0306904 +-0.0857877 0.152992 0.0221351 +-0.00139702 0.0346206 0.0416594 +-0.0501963 0.061364 0.033592 +0.0161097 0.0974052 -0.0230873 +-0.0194917 0.0568426 0.0483686 +0.0492985 0.0561391 -0.00508332 +0.0184753 0.100361 0.0464541 +-0.0504953 0.154968 0.0107183 +0.0147875 0.105075 -0.0193 +0.023524 0.11536 0.0341991 +0.0310013 0.118944 0.0140014 +-0.0172406 0.178621 -0.0252251 +-0.0367055 0.112873 -0.0174612 +-0.026888 0.0344315 -0.0290471 +-0.052616 0.0542078 0.012269 +-0.0374932 0.0478153 0.0397186 +-0.0727381 0.151148 -0.0398146 +0.0042421 0.0740405 -0.0347398 +-0.0170835 0.187214 -0.0216216 +-0.0744375 0.0658205 0.00791081 +-0.0225303 0.159751 -0.00283877 +-0.015413 0.0343578 -0.0194213 +0.0138178 0.034673 0.033937 +-0.0756035 0.0846721 0.0383975 +-0.0823671 0.0939609 0.0321712 +-0.0597053 0.0675469 -0.0111319 +-0.0911321 0.146088 0.0161475 +0.0350128 0.0797448 -0.0167143 +-0.0835371 0.151134 0.0310567 +-0.0125098 0.0759113 0.0569785 +-0.014877 0.12853 0.00563728 +-0.067594 0.162379 -0.0559888 +-0.0299722 0.0523401 -0.0183637 +-0.0175125 0.109971 0.0410978 +-0.0602175 0.0443014 -0.00489461 +0.047415 0.0539813 0.0314992 +-0.0695317 0.0366687 -0.00405392 +-0.0710533 0.04057 0.0057746 +-0.0594926 0.112518 0.0361699 +-0.0870454 0.128039 -0.000695727 +-0.0548606 0.0532734 -0.00439052 +0.0197584 0.121448 -0.00690816 +-0.0217284 0.0919768 0.0523353 +-0.0331407 0.073693 -0.0254949 +-0.0165233 0.0472885 0.0494939 +0.0430185 0.100102 0.00517011 +-0.0941673 0.124186 0.0242853 +0.0398988 0.106999 0.0131638 +-0.0388567 0.0985732 -0.0220835 +-0.013744 0.0347692 0.0478272 +0.0525444 0.0728335 0.00848027 +0.0340202 0.108707 0.0300072 +0.0135389 0.0341511 0.00148413 +-0.0255703 0.121939 -0.00698176 +-0.0627659 0.0795658 -0.0187488 +0.0159163 0.0366121 0.0434543 +-0.0677812 0.0823162 -0.0178553 +-0.00231448 0.129778 0.000344647 +-0.0224096 0.15809 -0.00961754 +-0.0369427 0.15804 0.00437449 +-0.0557441 0.0768187 -0.0193441 +-0.0661875 0.165349 -0.0586121 +-0.0764308 0.11585 0.051182 +0.00923994 0.0795457 -0.0327494 +-0.0141356 0.103403 -0.0235224 +-0.0725643 0.165173 -0.0170441 +-0.0708131 0.0922561 -0.0160967 +-0.052837 0.143168 0.022419 +-0.0289488 0.0487095 0.0453204 +-0.033511 0.104273 0.0404948 +0.0173468 0.0552065 -0.0282783 +-0.0643722 0.0392301 0.0399397 +0.0154605 0.100515 0.0471558 +-0.0389991 0.0361252 0.0429011 +-0.0912831 0.133698 0.0142161 +-0.042206 0.166657 -0.0103803 +-0.0829702 0.111001 0.0428895 +-0.0244677 0.122018 -0.00707965 +-0.00847955 0.107265 0.0437628 +-0.0410173 0.12678 -0.00403845 +-0.00247117 0.091392 -0.0349524 +-0.0733228 0.17276 -0.036126 +-0.0584972 0.102936 0.0420973 +-0.0275816 0.0549129 -0.0253866 +-0.0567567 0.0416998 -0.00856929 +0.00796329 0.0376774 0.0282412 +-0.0764966 0.130271 0.0529935 +-0.0385029 0.0346069 0.040918 +-0.0178242 0.0882801 -0.0380186 +-0.0592916 0.0381211 0.04617 +-0.0507734 0.0826521 -0.0214824 +-0.011501 0.0787467 0.0576654 +0.0135076 0.115425 0.0371825 +-0.0649944 0.132589 -0.00831046 +0.00449953 0.0474774 0.0501288 +-0.0183564 0.0639745 0.0512546 +-0.0454992 0.0425256 0.0437126 +0.00186325 0.0380873 -0.0138264 +0.0213321 0.100802 0.0450693 +-0.0855641 0.121149 -0.00272592 +-0.0898794 0.136494 0.0232114 +-0.0498262 0.0941747 -0.0218116 +0.0413792 0.0533854 -0.00680998 +-0.0912918 0.11477 0.0353243 +0.0585317 0.0565811 0.0212119 +0.000449556 0.130948 0.00412356 +-0.0343831 0.0766477 -0.0234928 +-0.0394659 0.108422 0.0377073 +-0.0477552 0.161949 -0.00697323 +-0.0278288 0.122593 -0.00568164 +-0.0563034 0.124125 0.0396482 +-0.0656415 0.129793 0.0454963 +0.0484031 0.0553841 0.03118 +-0.0455014 0.116621 0.0320048 +-0.0728613 0.102198 -0.0128504 +-0.0867252 0.0994863 0.00342747 +-0.00226785 0.0370021 0.0122687 +-0.0557143 0.0709328 -0.0156898 +-0.0610115 0.132585 -0.00747053 +0.00217526 0.0894962 -0.0338845 +-0.012585 0.0933765 -0.0350613 +-0.0553875 0.143884 0.0305002 +-0.0920989 0.117453 0.031314 +-0.0616144 0.155309 -0.0245851 +0.0502575 0.0602229 -0.00418894 +-0.0735402 0.0708078 0.0302704 +0.00614005 0.103026 -0.0213684 +-0.00271026 0.0669475 -0.0345168 +-0.049518 0.0344739 0.029929 +-0.0525731 0.128311 0.0345149 +-0.0605331 0.151186 -0.000375192 +-0.0866695 0.135213 0.0450386 +-0.0515626 0.0460585 0.0186779 +-0.00891802 0.0982381 -0.0280905 +-0.0170028 0.0977503 -0.0256286 +-0.0541413 0.128093 -0.005327 +-0.0234618 0.0385102 -0.00806272 +-0.0234875 0.125296 0.0010065 +0.0238248 0.0404881 0.03829 +-0.0564079 0.0334582 -0.0027528 +-0.0667678 0.0695012 0.0345692 +-0.00845839 0.0346349 0.045549 +-0.0748544 0.15611 0.0141114 +-0.0718277 0.141507 -0.00801564 +-0.0263582 0.120444 -0.00943021 +-0.0384861 0.0847024 0.0437961 +0.0154742 0.126309 -0.00212525 +-0.0329093 0.0461288 0.0451027 +-0.00179731 0.0390446 -0.00419837 +-0.0830843 0.0843065 -0.0045636 +-0.00849798 0.051815 0.0518583 +0.0211703 0.0458979 -0.0197309 +0.0250466 0.0534973 0.0413033 +-0.00301309 0.0994095 -0.0252863 +-0.0286636 0.0662687 -0.0294695 +-0.0275164 0.0588544 0.0372755 +0.021248 0.0707121 -0.0275992 +0.0118973 0.0699023 0.0540919 +-0.0850671 0.0831487 0.00248224 +0.0112963 0.123527 -0.00913288 +-0.0471043 0.0355495 0.00808039 +-0.0305886 0.0341169 0.0127308 +0.0232695 0.0795597 0.0495474 +-0.0781795 0.165241 -0.0349583 +-0.00548333 0.122374 0.0356916 +0.02636 0.0531741 -0.0208871 +-0.0117787 0.0784571 -0.0380559 +-0.0374622 0.0945463 0.043653 +0.0298506 0.0915959 0.0433109 +-0.063716 0.150986 -0.0306408 +-0.0915859 0.128175 0.00825933 +0.0456498 0.0806034 0.02116 +-0.0483119 0.0614742 0.035964 +0.0375235 0.0968947 -0.00979522 +-0.0923144 0.132364 0.0182222 +0.0175115 0.118187 0.0352964 +-0.027798 0.0824702 -0.0362167 +-0.0679219 0.123838 -0.00890383 +-0.0136906 0.0585033 -0.0353384 +-0.0560167 0.0334996 0.00451355 +-0.00170896 0.0655406 -0.0343993 +-0.0134843 0.053101 0.0504987 +-0.0675811 0.143978 0.0427672 +-0.0395371 0.165252 0.00310729 +-0.00177026 0.0987839 -0.0266092 +0.0449905 0.0917771 0.0161555 +-0.0142754 0.0385008 0.0265607 +-0.024936 0.0546494 -0.0284077 +-0.0737754 0.0849525 -0.0153987 +-0.00225491 0.0393816 0.0354457 +0.00953649 0.101759 0.0470503 +-0.030493 0.0731979 0.0402297 +0.0418277 0.0395362 0.0134182 +-0.0622707 0.058834 0.014793 +-0.0042883 0.0999626 -0.0238822 +-0.0511241 0.157581 -0.00475152 +-0.0110467 0.0382737 0.0183997 +-0.0111844 0.110115 -0.0206413 +-0.0906536 0.150215 0.0201223 +-0.0636975 0.0593607 0.0104272 +-0.00965605 0.0527028 -0.0331963 +0.011809 0.0846857 0.0540696 +-0.0439904 0.115156 -0.0158426 +0.00534103 0.0581999 -0.0308279 +-0.00449084 0.119679 0.0378771 +0.00251006 0.102973 0.0437486 +-0.0256326 0.0383152 0.00270994 +0.0101829 0.0893384 -0.0312282 +0.0359735 0.108741 0.0274101 +0.000505152 0.0675448 0.0563482 +-0.0431097 0.0335646 0.0052718 +-0.0748156 0.16245 -0.0339456 +-0.0890383 0.09964 0.0104144 +0.0425362 0.0972508 -0.000830625 +-0.0136711 0.162609 -0.0156561 +0.0241599 0.0418198 -0.00678118 +-0.0181519 0.16827 -0.0202389 +-0.0404977 0.0986657 0.0417206 +-0.0809707 0.15134 0.0022444 +0.0151979 0.0420601 0.0445385 +-0.00221102 0.0959857 -0.0316631 +-0.0329609 0.0709036 -0.0224656 +-0.079699 0.101798 -0.00757602 +-0.0725189 0.144585 -0.0159026 +-0.0466234 0.165492 -0.0068396 +0.0185106 0.12405 -0.00369129 +-0.014344 0.183095 -0.0226028 +-0.0788576 0.105851 -0.00657974 +-0.0240104 0.109837 -0.0203148 +0.00980942 0.110782 -0.0193656 +0.0108601 0.117776 0.0369396 +0.0193075 0.0536075 0.0470681 +-0.0925525 0.131032 0.0242364 +0.00749212 0.131495 0.0152913 +0.00495998 0.131626 0.0157979 +-0.00415159 0.0385426 0.00685716 +-0.0241881 0.038442 -0.0062907 +-0.0114972 0.0870124 0.0568248 +0.0383205 0.0589284 -0.00670105 +-0.050793 0.124044 0.0335488 +0.0216558 0.0436146 0.0415846 +-0.0488766 0.0663121 0.037594 +-0.0460367 0.115268 -0.015925 +0.0354061 0.0981387 0.0355669 +-0.0414966 0.064844 0.0412967 +-0.0492702 0.0334521 0.00412227 +-0.0788564 0.173596 -0.0449928 +-0.0720001 0.0374977 0.00101403 +-0.0745188 0.135846 0.0503978 +-0.0705133 0.0930254 0.0420143 +0.0544062 0.0520207 0.00120422 +-0.016347 0.159993 -0.0102438 +0.00949781 0.0440631 0.0448456 +-0.0123976 0.0991026 0.0482068 +-0.00535711 0.0347531 0.0461025 +0.026456 0.0929171 0.0454329 +0.0245089 0.042142 0.038636 +0.043716 0.0750115 0.0261739 +-0.0839359 0.102045 -0.00261805 +-0.0806754 0.155074 0.0150117 +-0.0689 0.172262 -0.0550342 +-0.0523543 0.073291 0.0414729 +-0.0301406 0.0636155 -0.0234264 +0.0407753 0.0452541 0.0299878 +0.00638455 0.0464233 -0.0264515 +-0.0755977 0.151334 -0.0218791 +-0.00594273 0.0383379 0.0139478 +-0.0600908 0.115373 0.0375616 +-0.0424965 0.0733822 0.0425454 +-0.00260003 0.0405608 -0.0253579 +0.00350637 0.0702767 0.0558823 +-0.0897267 0.135137 0.0262095 +-0.0591547 0.117476 -0.0120923 +-0.024542 0.0428919 0.0537128 +-0.0054972 0.0576157 0.054162 +-0.0397846 0.0841362 -0.0215764 +0.0415613 0.0751972 0.0301802 +-0.0631728 0.0596464 0.0174802 +0.0423363 0.101455 0.00317956 +-0.0533301 0.1416 0.0264013 +-0.0464855 0.0931347 0.0435353 +-0.0629725 0.150532 -0.00369044 +-0.0853889 0.108959 0.00634578 +-0.0909761 0.118636 0.00631645 +-0.0384966 0.101445 0.0410637 +0.0194941 0.107309 0.0406484 +0.0396169 0.0843072 -0.0127653 +-0.0223745 0.0566587 0.0441983 +0.0607493 0.059571 0.0121639 +-0.0844811 0.123027 0.0489478 +-0.0570341 0.144219 -0.00185162 +-0.0723674 0.177806 -0.0472523 +-0.0466801 0.130916 0.0233152 +-0.02246 0.183226 -0.0115124 +-0.0707386 0.165621 -0.0179174 +-0.0739884 0.1541 -0.0249038 +0.00161401 0.13159 0.0117114 +0.0295344 0.0524338 -0.0167463 +0.00137166 0.0465972 -0.0284573 +-0.0349979 0.152158 8.20736e-05 +-0.0459591 0.0424584 -0.0122548 +0.032247 0.0800194 -0.0194064 +-0.0215329 0.0768164 0.0540336 +0.0182351 0.12763 0.00640475 +0.0169629 0.0348939 0.0289563 +0.0193977 0.0490363 -0.0230642 +-0.0596322 0.0604401 0.0228281 +0.0145003 0.108488 0.0407955 +-0.0720741 0.0646161 0.00403373 +-0.0712116 0.15818 -0.0429219 +-0.0175993 0.15966 -0.00802789 +-0.0759222 0.159085 -0.0100036 +-0.0384682 0.15361 0.00387723 +-0.0725333 0.0379686 0.00575754 +0.0455601 0.0904134 0.011166 +0.0375907 0.0937201 -0.0111657 +0.00483671 0.039382 0.0314929 +-0.026559 0.0377408 0.0211248 +0.0385027 0.0454964 0.0307784 +-0.0564952 0.047766 0.0395183 +-0.0198831 0.107284 -0.0222237 +-0.0779551 0.163899 -0.0249456 +-0.0563521 0.0342791 0.0304121 +-0.00751948 0.0746046 0.0579524 +-0.0827498 0.154172 0.0128373 +-0.00710449 0.125174 0.0317411 +-0.0367613 0.0798086 -0.0204262 +-0.036915 0.175546 -0.00898243 +-0.0705043 0.0887655 0.0418556 +-0.0522651 0.0335597 0.0034159 +-0.0677174 0.0409231 -0.00173026 +-0.0113677 0.180126 -0.0253581 +-0.0161521 0.03911 0.0518105 +-0.0690092 0.122845 0.052951 +0.00570986 0.0341754 0.0182505 +0.0184933 0.0865452 0.0498488 +6.3531e-05 0.129314 -0.00119744 +-0.0804587 0.135827 0.0500319 +-0.0754196 0.111293 0.0461553 +0.0424555 0.0902012 0.0271644 +-0.0928081 0.120209 0.0412843 +-0.0634884 0.0789934 0.0424288 +-0.0615251 0.0457206 0.0316818 +-0.0115387 0.0458293 0.048671 +-0.066289 0.0747237 0.0389788 +-0.0173046 0.166847 -0.0129407 +0.0331853 0.116604 0.00769666 +0.0445518 0.069148 0.0246508 +-0.091691 0.12831 0.0342454 +0.0434619 0.0930961 0.0241585 +-0.0678925 0.0435809 0.00801004 +0.0234224 0.0519071 -0.0231048 +-0.0208141 0.0595795 0.0467936 +-0.087519 0.112 0.0410625 +-0.0213082 0.126358 0.00326486 +-0.0606822 0.0362429 0.0450162 +-0.0576914 0.0693962 -0.0144511 +-0.0769716 0.13837 -0.00578148 +-0.0653565 0.1551 0.00564588 +0.0264433 0.0485879 -0.0182655 +0.039746 0.101828 -0.00373788 +-0.0610724 0.144529 -0.00434459 +-0.0662237 0.145026 -0.0176812 +-0.0283728 0.156641 -0.000811787 +-0.00971651 0.0348541 0.0433186 +-0.00481466 0.0868424 -0.0368113 +-0.031088 0.0335574 -0.0273919 +-0.0544366 0.120435 -0.011246 +0.00248882 0.121002 0.0363406 +-0.00349433 0.0911707 0.0563818 +-0.0931447 0.118854 0.0382959 +0.0254683 0.121415 0.0262007 +-0.0467966 0.0336683 0.000813328 +0.0319522 0.103353 -0.0134365 +-0.0633409 0.155276 -0.011594 +-0.0720139 0.180999 -0.0528377 +-0.0164541 0.0630817 0.0527623 +0.016475 0.0352036 0.002978 +-0.00226088 0.124171 0.0334893 +0.0391263 0.0631992 -0.00875738 +-0.0818614 0.114723 -0.0022038 +-0.0930555 0.120208 0.0402916 +-0.0904236 0.116034 0.0273085 +-0.0705028 0.159578 -0.0459334 +-0.0862816 0.117641 0.0480424 +0.0531688 0.0733724 0.0176223 +-0.0578751 0.134121 -0.00585274 +0.0423147 0.091604 0.0271557 +0.0101515 0.071231 0.055077 +-0.0435318 0.087421 0.0430041 +-0.0560394 0.131064 -0.00575471 +0.00125071 0.0712122 -0.0347068 +-0.0348542 0.165303 -0.00316457 +-0.0860328 0.0912972 0.00145067 +-0.00116523 0.0371346 0.0178171 +-0.0637756 0.0795327 -0.0183843 +0.00482779 0.0366504 -0.0137865 +0.0435599 0.0987371 0.0131605 +0.00150087 0.101618 0.0443156 +0.0314312 0.0625198 -0.0186445 +-0.0672777 0.169987 -0.0338702 +-0.0903951 0.118903 0.0450094 +-0.0501563 0.11976 0.0326732 +-0.0750921 0.156856 -0.022942 +-0.0275197 0.109846 0.0382427 +-0.0535612 0.0416919 -0.00977582 +0.0556505 0.0677792 0.00213147 +-0.0685182 0.0368214 -0.0053939 +-0.0780099 0.114072 0.0486721 +-0.0248787 0.0796614 0.0530244 +-0.0638477 0.164736 -0.0283363 +0.0142201 0.0793919 -0.0305544 +0.00713749 0.130032 0.0237524 +-0.0187348 0.175696 -0.0167204 +-0.00682337 0.088234 -0.0365489 +-0.0217663 0.11209 -0.0186927 +-0.0171714 0.0432613 0.0521182 +0.00513012 0.0373402 0.0458408 +0.0461568 0.0626078 -0.00274862 +-0.0412659 0.160879 0.0033623 +-0.0853172 0.110382 0.0233555 +-0.0158006 0.108342 -0.0207487 +0.00813236 0.110171 -0.0197068 +0.0265802 0.0345508 0.0130494 +-0.0660018 0.133981 0.0432166 +0.041807 0.0885902 0.0288907 +-0.024509 0.109889 0.0396002 +0.0354948 0.10491 -0.00909103 +-0.00850916 0.0688709 0.0557558 +-0.054442 0.0373135 0.0469328 +-0.010539 0.0390893 0.0340058 +-0.0858022 0.150106 0.00719342 +-0.0451719 0.0347129 0.0411467 +-0.00510128 0.0385919 0.0229448 +-0.0521978 0.0336397 0.008764 +-0.0162925 0.180099 -0.0261659 +-0.0902934 0.147439 0.0121579 +-0.0793826 0.0705862 0.00854889 +0.0209269 0.0658956 0.0477693 +-0.0116051 0.171103 -0.0260001 +-0.0635102 0.151152 0.0361873 +-0.0865918 0.127084 0.0480364 +-0.0756208 0.166729 -0.0233779 +-0.0507818 0.0840955 -0.0217037 +-0.0623945 0.164686 -0.0405941 +0.0109143 0.034258 -0.00287102 +-0.0326136 0.0384639 -0.0154224 +-0.0883155 0.139178 0.0394996 +-0.0317158 0.0383538 -0.00403424 +-0.00682874 0.0896331 -0.0361816 +-0.060744 0.0766988 -0.0182193 +-0.00743574 0.129906 0.00405669 +-0.0792494 0.0723341 0.0207326 +-0.036173 0.152719 -0.00677506 +-0.0305128 0.10708 0.0396423 +-0.0435905 0.0505542 -0.0107756 +-0.0204554 0.0347978 0.0481157 +-0.0591045 0.0344689 0.0400978 +-0.0840365 0.147342 0.0364323 +0.00340018 0.0348289 -0.0229504 +-0.0693319 0.141141 0.045512 +-0.0561609 0.0344771 0.0355158 +0.00119588 0.0881146 -0.0344258 +0.0583564 0.0538008 0.0181861 +0.0342539 0.0387023 0.0236157 +-0.0264982 0.125984 0.010106 +-0.0611832 0.146298 -0.00395593 +-0.0910251 0.124245 0.0440568 +-0.089862 0.115281 0.0432597 +0.0247433 0.124313 0.0130924 +-0.000820873 0.128641 -0.00248283 +-0.0554557 0.0533368 -0.00338183 +-0.0464641 0.122081 0.0270508 +-0.0451868 0.126658 0.0224837 +0.00145793 0.0977369 0.0519067 +0.0405445 0.0610221 0.0298369 +-0.0744952 0.0941746 0.0398302 +-0.0351234 0.033632 -0.0282515 +-0.0839267 0.145982 0.00417548 +-0.0224934 0.0435545 0.0535652 +0.0159352 0.127804 0.0226817 +-0.0572144 0.154757 0.0232881 +-0.0498753 0.0336124 0.000239655 +-0.0191672 0.0596981 0.049368 +-0.0242921 0.0918773 0.0492675 +-0.0523718 0.133555 -0.00317026 +-0.0557218 0.0723836 -0.0166307 +-0.00457986 0.0361758 -0.0248798 +-0.0737533 0.0901294 0.040627 +-0.00549531 0.10728 0.0439307 +-0.0181568 0.165005 -0.0179156 +-0.0554997 0.108443 0.0389722 +-0.0144882 0.101623 0.0437286 +0.0215585 0.0387445 -0.00669407 +-0.0752039 0.0696978 0.0256249 +-0.0569183 0.115707 -0.0143002 +-0.0731283 0.155734 0.00889607 +0.0347498 0.081125 -0.0176886 +0.00113903 0.131571 0.0129682 +-0.0279379 0.155215 -0.0039665 +0.0438288 0.0860483 -0.00379124 +-0.0202818 0.0386671 -0.01315 +-0.0639713 0.0651159 0.0301523 +-0.0729034 0.123797 -0.00826534 +-0.00948854 0.0965445 0.0534324 +-0.0616146 0.158432 -0.0255892 +0.0348698 0.112104 0.0254475 +0.0462561 0.0792459 0.0151754 +0.0132092 0.0348336 0.0300558 +-0.0650018 0.0435996 0.0108034 +-0.0629926 0.156114 0.0183129 +0.0432806 0.100121 0.0101615 +-0.0634166 0.118511 0.0453283 +-0.0718747 0.151003 0.0373736 +-0.0693203 0.155248 -0.0509683 +-0.058528 0.0400924 -0.008802 +0.0150592 0.0590177 0.0497649 +-0.0136861 0.0570325 -0.0345667 +-0.02332 0.0391695 0.0384733 +0.0410592 0.0985428 -0.00379645 +-0.042915 0.0436274 -0.0183221 +-0.0324875 0.068969 0.0402984 +-0.0927384 0.122733 0.00927055 +-0.0697859 0.156365 0.01735 +-0.0525617 0.0403541 -0.0109145 +-0.0163792 0.186908 -0.0208435 +0.00555045 0.034504 0.00513967 +0.0259201 0.0406241 0.0333279 +0.0340795 0.103399 0.0336714 +-0.0295185 0.0579228 -0.0214101 +0.0443631 0.0475049 -0.00446946 +0.00261537 0.0341134 0.0122343 +-0.0104909 0.104437 0.0435533 +0.0240885 0.124582 0.018553 +-0.084606 0.0993653 -0.00159598 +0.0315994 0.0505647 0.0349136 +-0.0887091 0.0983318 0.0213821 +-0.0109917 0.177231 -0.0295208 +-0.00927372 0.0384768 0.00588152 +-0.0731505 0.0794744 -0.0135813 +0.0377774 0.0672774 -0.012792 +-0.0257539 0.157476 -0.0102144 +-0.0524923 0.0340498 0.0261507 +0.0359032 0.0905437 -0.0158269 +-0.0358241 0.0900699 -0.0240653 +-0.0507764 0.0715485 0.0397729 +-0.0857724 0.0872268 -0.000524277 +0.0122145 0.0850407 -0.0307351 +-0.0818191 0.154205 0.0234297 +0.0239009 0.12202 -0.0014718 +0.0509663 0.0446851 0.0122122 +0.0405026 0.0469928 0.0315524 +0.00123226 0.0769082 -0.0355253 +0.0395203 0.0569025 0.0311403 +-0.0861982 0.144641 0.0372484 +-0.0218898 0.0382146 0.0234539 +0.0278568 0.0643129 -0.0209613 +-0.06664 0.0601639 0.0127094 +-0.0682452 0.17678 -0.058273 +-0.0326534 0.0578275 -0.0120318 +0.0449519 0.0847263 0.00223902 +-0.0243874 0.0379977 0.0213348 +-0.0375049 0.0648832 0.0416292 +-0.049486 0.0531643 0.034537 +-0.00680823 0.0840973 -0.0379387 +-0.00662043 0.0383357 0.0156226 +0.0246827 0.0347978 0.0179097 +0.052528 0.0664738 0.0271694 +-0.017323 0.112508 -0.01916 +-0.0589359 0.0481542 0.00467247 +0.0560814 0.0704234 0.0216351 +0.0445162 0.087501 -0.00181141 +0.0204668 0.0400207 -0.013702 +-0.0828557 0.0979824 0.0311146 +0.0393677 0.0547517 -0.00623241 +-0.0301563 0.0382285 0.0524978 +-0.0740972 0.155492 -0.0239137 +-0.0266047 0.0397022 -0.0293069 +0.0044664 0.0344032 0.010526 +-0.0644057 0.16752 -0.0356951 +-0.085796 0.123875 -0.00272102 +-0.0251727 0.175641 -0.0195733 +-0.0147266 0.0922559 -0.0359307 +0.0166529 0.120978 0.0330533 +-0.0652865 0.1555 -0.0467797 +-0.0622893 0.15065 -0.0135783 +-0.0173344 0.128368 0.0119773 +-0.044366 0.0366412 -0.0232589 +-0.0913152 0.114759 0.0363194 +-0.0647364 0.118589 0.0486106 +0.011956 0.0976358 -0.0233787 +-0.0378922 0.04725 -0.0183117 +-0.079848 0.116269 0.0487575 +0.0431642 0.0987038 0.0171581 +-0.0334777 0.0546734 0.0376709 +-0.0677151 0.171772 -0.0397619 +-0.0124935 0.123722 0.0323282 +-0.00945147 0.0352364 0.0483453 +-0.0729035 0.125275 -0.00849683 +-0.0837744 0.107497 0.00138169 +-0.0529962 0.0461208 0.0157076 +-0.0677529 0.141137 0.0442717 +-0.0840303 0.151908 0.0287412 +-0.0636039 0.0445634 0.0326846 +0.0192911 0.109605 -0.016128 +-0.0838969 0.104764 -0.000610535 +-0.0887185 0.143427 0.0331607 +-0.0929968 0.130998 0.0182299 +-0.0543463 0.160987 0.00512087 +-0.0909281 0.132287 0.0082314 +-0.0354987 0.113848 0.0338946 +-0.0465077 0.088954 0.0443573 +0.0301352 0.0955658 0.0419698 +-0.0199202 0.0381456 0.0185107 +-0.0186134 0.161522 -0.0143726 +-0.0646921 0.0617226 0.0224003 +0.0222832 0.066418 -0.0268569 +-0.0661617 0.0353568 0.0288449 +0.0192795 0.122165 0.0310901 +-0.00560235 0.0406015 -0.0258376 +-0.0404738 0.108409 0.038128 +0.0420248 0.0710795 0.0289899 +0.0450277 0.0945898 0.0071675 +-0.0490784 0.153156 -0.00527602 +-0.00149713 0.0689596 0.0566805 +-0.0709057 0.106531 -0.0119068 +-0.0626824 0.0436041 -0.00418427 +-0.066536 0.166455 -0.0250024 +-0.0218698 0.104438 -0.0229686 +-0.0731886 0.149857 -0.036868 +-0.0122347 0.0392642 0.0504717 +-0.0935435 0.118764 0.0233045 +-0.0797382 0.10948 0.0394939 +-0.0892801 0.091541 0.0104497 +-0.0547119 0.146209 0.0284156 +-0.00241231 0.037367 0.0100902 +0.000818555 0.130756 0.00282721 +0.04586 0.0820013 0.00419826 +-0.0250963 0.0348756 0.0487637 +-0.0673565 0.112647 0.0446949 +-0.0634506 0.15272 2.24523e-05 +-0.0706828 0.180611 -0.0569213 +-0.0205931 0.163965 -0.00888333 +0.0115331 0.101889 -0.0218781 +-0.0664983 0.102849 0.0407048 +0.0185027 0.118159 0.035136 +0.0458454 0.0834099 0.00517797 +-0.00887527 0.109466 -0.0219533 +-0.0858669 0.119072 -0.00140229 +-0.0102872 0.0344076 -0.0184603 +-0.0211482 0.169745 -0.0200914 +-0.00849115 0.111421 0.0423213 +-0.0613599 0.128292 0.04114 +-0.0076798 0.0569676 -0.0334142 +-0.0710297 0.16381 -0.0459687 +-0.0454992 0.112558 0.0357052 +-0.0343115 0.126654 0.00282732 +0.0360267 0.110062 0.0258818 +0.0368044 0.0942002 -0.0116901 +-0.0421812 0.123012 0.0251172 +-0.066012 0.139954 -0.00779963 +0.00198723 0.123051 -0.0105036 +0.0172553 0.072257 -0.0294021 +-0.013113 0.184484 -0.0260544 +-0.072893 0.152634 -0.0368963 +-0.0938278 0.128299 0.0222532 +-0.0675171 0.0409229 0.0105489 +-0.0735479 0.162209 -0.012171 +-0.0517008 0.0626767 0.0322349 +-0.0433082 0.037957 -0.0253239 +-0.0516781 0.0345962 0.0381142 +-0.0046354 0.0467251 -0.0296701 +-0.0777504 0.112676 -0.00382147 +-0.0281162 0.181397 -0.0109687 +-0.047699 0.144615 0.00435323 +-0.0663959 0.148276 0.0393784 +-0.0249816 0.15956 -0.0126947 +-0.00758477 0.0968518 -0.0305822 +-0.019536 0.116371 -0.0152209 +-0.0298632 0.102958 -0.0228236 +-0.0224181 0.05387 0.0440179 +-0.0625128 0.145366 0.0377954 +-0.0843383 0.133967 0.0484219 +-0.00452146 0.0443187 0.0472734 +0.000177098 0.0839833 -0.0361114 +0.0207016 0.113271 -0.0140876 +-0.065484 0.0847424 0.0442074 +-0.0201913 0.175663 -0.0226485 +-0.0364476 0.166788 -0.00019754 +-0.0206091 0.162049 -0.0149623 +0.0350254 0.0700182 0.0383083 +-0.0455491 0.131451 0.0178282 +0.00819795 0.130005 0.00128654 +-0.0353536 0.12061 0.029103 +-0.0271732 0.169704 -0.0183584 +-0.0657382 0.0436129 0.0101245 +-0.0722291 0.166627 -0.044985 +0.0309191 0.0539829 -0.0147501 +-0.0308747 0.056662 -0.0163864 +-0.0867734 0.123909 -0.00174219 +-0.0279078 0.0347965 0.0447705 +0.0191594 0.100268 -0.0222959 +-0.0154293 0.0382918 0.0211029 +-0.0578159 0.0636603 0.0309898 +-0.024177 0.172689 -0.0201134 +-0.0669849 0.0359436 0.0326963 +-0.0879792 0.086094 0.00648058 +-0.0181742 0.169737 -0.0210312 +-0.0170499 0.122405 0.0312344 +0.00906582 0.123154 0.0343752 +-0.034503 0.0874637 0.0428605 +0.0391693 0.108394 0.0111647 +-0.0917004 0.143358 0.0201656 +0.027747 0.0902677 -0.021551 +0.0430843 0.0496743 0.0322331 +-0.0791989 0.150078 -0.000876106 +-0.0259631 0.177171 -0.00957335 +-0.0395279 0.079033 0.0429651 +0.0302372 0.118499 0.00231637 +0.0449793 0.061326 -0.0034541 +-0.0376334 0.0548474 -0.0107543 +-0.0274342 0.111364 -0.0178958 +-0.0315627 0.048073 -0.0232988 +-0.018823 0.121694 -0.0088173 +0.00895989 0.0979651 -0.0237371 +-0.0254423 0.0473682 0.0503166 +-0.046654 0.0606571 -0.0123502 +0.0606526 0.0595573 0.0131644 +-0.0873547 0.094105 0.00537923 +-0.0202891 0.184471 -0.0210772 +-0.093713 0.126863 0.0152623 +0.00938205 0.0449001 -0.0251557 +-0.0903092 0.140666 0.025165 +-0.0676501 0.0667159 0.0297862 +-0.0164899 0.0602176 0.0520938 +0.019355 0.0565693 -0.0275356 +0.0104604 0.0340987 0.00091581 +-0.0785409 0.166665 -0.0309637 +-0.018017 0.0390618 0.0526069 +0.0189962 0.123953 0.0281041 +-0.0814357 0.0734392 0.00553468 +-0.0223732 0.03801 0.0163235 +0.0110271 0.112101 -0.0187639 +0.0456518 0.0904151 0.00617296 +-0.0789509 0.170805 -0.0389931 +-0.0312407 0.0510927 0.0390643 +0.0359235 0.106756 -0.00582268 +-0.0815808 0.0950721 -0.00753639 +-0.0849546 0.0871617 -0.00253673 +-0.0265403 0.0592021 0.0383808 +0.0398305 0.0739567 0.0329917 +-0.00085919 0.0358547 0.00813469 +-0.0747624 0.0700921 -0.00148683 +0.0313786 0.113275 -0.00606229 +-0.0902327 0.124018 0.00527185 +0.0268091 0.0506065 0.038521 +-0.0727909 0.0685075 0.0271607 +-0.0578274 0.0666818 0.0354001 +-0.0738208 0.0921589 -0.0148323 +-0.0390631 0.127858 0.0143467 +-0.00922314 0.174168 -0.0285672 +-0.0035205 0.039017 -0.00265492 +0.0435098 0.098719 0.0141568 +-0.0493916 0.144765 0.00938332 +0.0189816 0.0563976 0.0484166 +-0.0731928 0.064943 0.0125198 +0.0453289 0.0833826 0.0211694 +-0.0211162 0.1638 -0.0163957 +-0.0306102 0.125527 0.00421635 +-0.0262987 0.113585 -0.0162365 +0.0252163 0.1238 0.0175509 +-0.0237403 0.0669252 -0.0352956 +-0.00549562 0.0472961 0.0485942 +0.0045023 0.122399 0.0348631 +-0.0701614 0.178224 -0.0493215 +-0.0173769 0.125333 -0.00267782 +-0.0470115 0.129603 0.00120357 +-0.0317094 0.0374952 0.0310681 +-0.0297217 0.0382812 -0.0035606 +-0.0415986 0.169934 0.00129157 +-0.064505 0.152553 -0.0362048 +-0.0667255 0.178008 -0.0524224 +-0.0236086 0.0335974 -0.0240827 +-0.0156885 0.0555599 -0.0339026 +0.0182783 0.0708328 -0.0291795 +0.0541184 0.0510309 0.0235647 +-0.0765193 0.119025 0.0524244 +-0.0118673 0.0339713 -0.0202424 +0.00548892 0.118228 0.0378342 +-0.067477 0.0336926 -0.00520632 +0.0168316 0.0926978 0.0490711 +0.0255432 0.0768418 0.0475089 +-0.0617634 0.0795901 -0.0189973 +-0.0156786 0.0526029 -0.032522 +0.000420458 0.036172 -0.0244623 +-0.0256593 0.0810401 0.0523557 +0.026836 0.0634537 -0.0220606 +-0.0621975 0.166246 -0.0505873 +0.0578529 0.0523616 0.0171842 +-0.0217254 0.126122 0.00269746 +0.0235742 0.124212 0.0226421 +-0.0578055 0.0883401 -0.0213124 +-0.0798409 0.103395 0.0321858 +-0.0123464 0.178658 -0.023274 +0.0212154 0.0476501 0.0409677 +-0.0342487 0.0752311 -0.0224883 +-0.0230529 0.0839079 0.0553134 +-0.0214993 0.112665 0.0388138 +-0.0327955 0.0873016 -0.0254019 +0.0258836 0.0605349 0.0443599 +-0.0096598 0.0907753 -0.0363722 +0.0450284 0.0875565 0.0211548 +0.0334239 0.0414863 -0.00351395 +-0.0488087 0.138617 0.0133952 +-0.0658054 0.0924099 -0.017991 +0.0104979 0.0896334 0.054299 +-0.0043048 0.123153 -0.010566 +-0.0174665 0.17272 -0.016673 +-0.0344763 0.0561322 0.0383021 +-0.0857072 0.152777 0.0118249 +-0.0575671 0.0494422 0.00671449 +-0.0430533 0.0345113 0.0330204 +-0.065164 0.147357 -0.0239331 +-0.0326268 0.0520227 -0.0107626 +-0.067905 0.106631 -0.013438 +-0.0258738 0.125824 0.0147443 +0.0544233 0.0635568 0.0276516 +-0.0872747 0.139127 0.00719289 +-0.0315055 0.109789 0.0377033 +-0.0763386 0.161799 -0.0152953 +0.0232414 0.0663429 -0.0257954 +0.0174948 0.109841 0.0394103 +-0.0507289 0.129704 0.0318965 +-0.0425042 0.0577064 0.0400486 +0.022545 0.0955327 0.0468247 +0.0403951 0.0475373 -0.00531603 +0.0183271 0.0475932 -0.02269 +-0.0572639 0.0601869 -0.00219809 +-0.0852337 0.104506 0.0248257 +-0.0933098 0.126856 0.0132534 +0.0352918 0.108619 -0.00504659 +-0.0628349 0.0939281 -0.0188357 +0.00277101 0.099815 0.0475918 +-0.0637196 0.147938 -0.020833 +-0.0636347 0.156368 -0.0124044 +-0.0882602 0.111934 0.0373837 +0.0451564 0.0931924 0.00517592 +-0.0883906 0.0874807 0.0144622 +-0.0179879 0.0654395 0.0522544 +-0.0334338 0.0382234 0.0500909 +-0.00283875 0.0389996 -0.00436591 +-0.0295052 0.11528 0.03366 +-0.00151332 0.104469 0.0441334 +0.0194927 0.0906432 0.0481529 +-0.0877693 0.113692 0.0289151 +-0.0661933 0.0335338 -0.00299624 +-0.0273899 0.0499801 0.045145 +-0.0338474 0.0972112 -0.023083 +-0.075849 0.149415 0.0390624 +0.0325609 0.114759 0.0260072 +-0.0821806 0.0776422 0.0235195 +-0.0759474 0.151351 -0.0188826 +0.013384 0.043414 -0.024368 +-0.0077421 0.0340597 -0.0195129 +-0.00965525 0.0511768 -0.0320162 +-0.0677487 0.111258 0.0407689 +-0.0214969 0.0461967 0.0522939 +-0.0466073 0.0518764 -0.00969859 +0.0357625 0.0364791 0.0131618 +-0.0124847 0.111379 0.041672 +-0.079194 0.0832222 0.0349745 +-0.0926331 0.130966 0.0142325 +0.00419789 0.123154 -0.0106599 +0.00969178 0.121836 0.0352946 +-0.0295306 0.123946 -0.00125424 +-0.0711733 0.128436 0.0516087 +-0.0585141 0.0386878 -0.00928985 +-0.0739244 0.0668664 0.00165643 +-0.0424856 0.0410553 0.0431368 +-0.0176939 0.162435 -0.0154936 +-0.00215916 0.0369163 -0.0154166 +0.0205271 0.126116 0.00440152 +0.000359464 0.0907103 -0.0342066 +0.038908 0.0631632 0.033303 +0.0223132 0.124739 0.023599 +-0.070737 0.159582 -0.0449318 +-0.0281334 0.155101 -0.00344078 +0.0323761 0.107397 0.032947 +0.0390072 0.0393837 0.00207442 +0.0420748 0.0457918 0.0297783 +-0.0187683 0.0699858 -0.0381989 +0.0176298 0.0382941 -0.0187111 +-0.0688111 0.0922897 -0.0164711 +0.0419266 0.101462 0.0171593 +0.00341059 0.0376223 -0.0244648 +0.0461634 0.0792418 0.0171768 +-0.0637535 0.0431846 0.0296789 +-0.0273632 0.0534705 -0.0254085 +-0.0394955 0.0562825 0.0399491 +0.00548498 0.0590856 0.0545593 +-0.0934182 0.124107 0.0122673 +0.0324897 0.100233 -0.014155 +-0.00952254 0.0688375 0.0554289 +0.0191204 0.042209 0.0431814 +0.0195848 0.035993 0.00660837 +-0.0748916 0.10354 -0.0108565 +-0.0685642 0.0406581 -0.00126009 +-0.0225344 0.118142 0.03379 +-0.013583 0.0386256 -0.002471 +-0.0898618 0.113382 0.0394321 +0.0601893 0.0595178 0.0171788 +-0.0630097 0.121328 0.0458592 +-0.0196415 0.0725672 0.0536854 +-0.0211896 0.172692 -0.021286 +0.024653 0.104647 -0.0168345 +-0.0795268 0.096746 0.0348816 +0.0485163 0.0672488 0.000612911 +0.0400064 0.0422019 -0.00166327 +-0.0197891 0.0785016 -0.0390423 +-0.0260568 0.0375908 -0.0291887 +-0.00717802 0.130589 0.0142265 +0.0156678 0.0346738 -0.0117297 +0.0424576 0.0845381 -0.00679736 +-0.0302701 0.0365155 -0.0302567 +-0.0274598 0.0863801 0.0483431 +-0.0831854 0.11075 0.0323354 +-0.0514986 0.109783 0.0378241 +-0.0183396 0.126605 0.021835 +-0.0497522 0.0716181 0.0399477 +0.0165016 0.116787 0.0362663 +-0.0670324 0.0672056 0.0312385 +0.0201473 0.0414664 -0.0187017 +0.0364932 0.0484054 0.0314672 +-0.0501327 0.159092 -0.00542351 +-0.0752763 0.0667216 0.0105318 +-0.0341695 0.0337715 0.0105094 +0.0137891 0.103175 -0.021246 +-0.073587 0.148629 -0.0261691 +-0.0169441 0.184483 -0.0249355 +-0.0097273 0.130072 0.0104159 +-0.00405402 0.0391419 -0.01222 +-0.0887371 0.0955614 0.00743378 +-0.0864769 0.0806081 0.0125015 +0.040053 0.107027 0.0101639 +-0.042812 0.14778 0.00347562 +0.0248383 0.0835695 -0.0246296 +0.0277899 0.116538 -0.00556904 +-0.0291577 0.0380555 0.005854 +-0.0525571 0.150877 0.0178 +-0.0639921 0.134062 -0.00777265 +-0.0838901 0.110998 0.0281595 +-0.0134922 0.107228 0.0429665 +-0.0586918 0.149676 0.0345486 +-0.0616651 0.119834 0.0424717 +0.0456475 0.0890064 0.00517807 +-0.0089791 0.0383636 0.0133044 +-0.0903646 0.135051 0.0122148 +0.0317594 0.0835691 0.0424885 +-0.0240368 0.11082 -0.0193477 +0.0271768 0.112761 0.0342135 +-0.0356473 0.116902 -0.0136714 +-0.0739197 0.151223 0.0366634 +0.0410535 0.0759945 -0.00777525 +-0.0734182 0.169757 -0.0275332 +-0.00232938 0.0359607 0.0474459 +-0.085737 0.110915 0.0387737 +-0.0775985 0.123137 0.0521223 +-0.0748309 0.100681 -0.0121692 +-0.0866976 0.109058 0.0133472 +-0.0701875 0.0395708 0.00901355 +-0.0306891 0.120328 -0.00923215 +-0.045477 0.1214 -0.012376 +-0.033489 0.172734 -0.00156283 +-0.0565822 0.0339881 0.0253464 +-0.0404955 0.0451407 0.0414639 +-0.0555537 0.0420256 -0.00889368 +-0.0598777 0.102599 -0.0186645 +0.0592051 0.0552531 0.0121703 +-0.0758111 0.0741872 -0.00760517 +-0.038197 0.0342285 0.0289964 +-0.00312706 0.0390512 0.0319597 +0.0476183 0.0426691 0.0171605 +-0.0306281 0.0831438 0.0423752 +-0.049274 0.1386 0.00640083 +-0.0210747 0.0753924 0.0536136 +-0.093596 0.126936 0.0252692 +-0.0629825 0.129686 -0.00825839 +0.00470729 0.128083 -0.0039713 +-0.0335515 0.0373466 -0.0164398 +0.0425502 0.0637218 0.0280932 +-0.0707401 0.13973 0.0469958 +-0.0644842 0.0804582 0.0430441 +-0.0618671 0.112377 0.0367302 +-0.0698247 0.169548 -0.0276555 +-0.0863191 0.0806082 0.0115067 +-0.0216814 0.0523409 -0.0297011 +0.0377238 0.110496 0.0121805 +-0.0689171 0.158096 -0.0529848 +-0.067181 0.156627 -0.0534662 +-0.0268045 0.0811284 -0.0369845 +-0.0546722 0.139567 0.0297056 +-0.0554146 0.0649279 0.0339175 +-0.0193967 0.186852 -0.0171886 +-0.0357817 0.0351096 0.0179926 +-0.0718839 0.173642 -0.0520314 +-0.0409497 0.0337305 -0.016439 +0.0396966 0.105593 0.0211678 +-0.0789279 0.0699144 0.0158521 +-0.0414163 0.0476371 -0.0122303 +-0.00671791 0.0642099 -0.0355692 +0.0547677 0.0509942 0.0227339 +-0.0686614 0.0735088 -0.0131618 +-0.0738123 0.0655371 0.0172042 +-0.0904479 0.129526 0.00625875 +0.0197334 0.044328 -0.0216983 +-0.0896348 0.140659 0.0301806 +-0.00748945 0.0870384 0.0571349 +0.0217161 0.119158 -0.00841047 +-0.0545346 0.125365 -0.00640975 +0.0368294 0.108237 -0.00182731 +-0.0672538 0.152901 0.0344187 +-0.0807043 0.0827741 -0.00656651 +-0.0305099 0.113915 0.0346878 +-0.0721764 0.154012 -0.0399025 +-0.045061 0.130334 0.0180279 +-0.00652053 0.0688834 0.0561767 +-0.0444953 0.0817848 0.0424707 +-0.0874489 0.105009 0.0173545 +-0.0175711 0.0387182 -0.00892429 +0.000506539 0.0883906 0.0565122 +-0.0265193 0.12549 0.0159805 +-0.0464789 0.0917181 0.0434263 +0.0455125 0.0918121 0.0101608 +-0.0834627 0.110719 0.0412267 +-0.057205 0.0480928 0.032667 +0.00517049 0.0350387 0.0228068 +0.0457999 0.0820138 0.0191697 +-0.0420324 0.171559 -0.00171063 +-0.0475118 0.128596 -0.00180437 +0.0204841 0.0948066 0.0474378 +-0.0719895 0.163815 -0.0429694 +-0.0644943 0.0861671 0.0446171 +0.00851416 0.06604 0.0550264 +-0.0670308 0.141141 0.0435296 +-0.0848818 0.142006 0.0416598 +-0.0384808 0.106985 0.038039 +0.0180116 0.0754634 0.0524537 +-0.0725251 0.155433 -0.0349062 +0.0182337 0.128007 0.0135344 +-0.0233093 0.162498 -0.00577898 +-0.0850563 0.112998 0.00231897 +-0.0823398 0.145942 0.00119384 +-0.0852211 0.103481 0.00138673 +-0.071875 0.136886 0.0488574 +-0.0794627 0.138625 0.0485832 +-0.0435009 0.117967 0.030956 +-0.038588 0.0341641 0.0271976 +-0.0408255 0.0914222 -0.0231618 +-0.0551021 0.154591 -0.0020359 +-0.0748456 0.159073 -0.00827714 +-0.0621666 0.152205 -0.0155784 +-0.0494972 0.0776899 0.0438666 +0.00751862 0.0799738 0.0554444 +0.00532494 0.0625045 -0.0319907 +0.00237701 0.131635 0.0162813 +-0.0546261 0.151324 0.0271982 +-0.0236176 0.123316 0.0244011 +0.00251869 0.05336 0.0534808 +0.0225511 0.0888829 0.0485585 +-0.0370273 0.174099 -0.0109221 +-0.090997 0.129691 0.0382289 +-0.0732672 0.148476 -0.0292583 +-0.053498 0.0465766 0.0420409 +-0.0330184 0.0474571 0.0438647 +-0.0246064 0.033636 -0.0243161 +-0.0234471 0.125053 0.0200484 +-0.0830784 0.138234 -0.000100609 +0.0406549 0.0820323 0.0324674 +-0.0842996 0.0965857 0.0297797 +-0.0527544 0.03448 0.0379838 +-0.0799451 0.15529 0.0167266 +-0.057093 0.0521243 0.00061739 +0.0154036 0.0477404 -0.0246897 +-0.060782 0.082481 -0.019648 +-0.0700267 0.166609 -0.0500213 +0.0451823 0.091796 0.014161 +0.0346837 0.106039 0.030986 +-0.0396713 0.0621627 -0.012718 +-0.05111 0.0375368 0.0465746 +-0.0688918 0.119449 -0.00874323 +0.000197079 0.035652 0.0464555 +-0.00149822 0.0661867 0.0567241 +0.00350858 0.074484 0.056374 +-0.0284992 0.0703316 0.0397848 +-0.0555164 0.0482866 0.0387265 +-0.0908309 0.136473 0.0182032 +-0.0634905 0.0861851 0.0447067 +-0.00918339 0.033864 -0.0215021 +-0.0748916 0.123775 -0.00787892 +-0.0270496 0.033483 -0.0265278 +0.00488911 0.035483 -0.0145807 +-0.0442085 0.165146 -0.00911238 +-0.0322103 0.0386054 -0.0136114 +0.0190336 0.11528 0.0364777 +-0.000494586 0.0897644 0.0562541 +-0.0350004 0.157209 -0.0112204 +-0.0635638 0.147341 -0.0176577 +-0.0902987 0.121315 0.00530766 +-0.0705068 0.102745 0.0389474 +-0.0662636 0.175335 -0.0598585 +-0.0239792 0.0680021 0.045464 +0.0413142 0.0637288 -0.00386959 +-0.051889 0.108419 -0.0189045 +-0.0477652 0.131125 0.00158524 +-0.0400469 0.169775 -0.0108504 +-0.0755266 0.109807 -0.00760163 +0.00107791 0.130709 0.0215491 +-0.0655994 0.0349763 0.0155159 +-0.0628742 0.161547 -0.05443 +0.0359645 0.0981106 0.0346243 +0.00934693 0.129002 0.0260013 +-0.0768843 0.109139 0.0404116 +-0.010503 0.0674297 0.0550101 +-0.028646 0.0535523 0.0364431 +-0.072824 0.0936306 -0.0150907 +0.028615 0.035804 0.0196241 +0.0282076 0.0706829 -0.0227535 +0.0596824 0.0622541 0.020173 +-0.0025152 0.0575969 0.0540026 +0.000110958 0.036978 0.020027 +-0.0273656 0.0360131 -0.0296152 +-0.0624735 0.0344952 0.0183787 +-0.0360892 0.159232 -0.0124312 +0.0418577 0.100066 0.0211691 +-0.063571 0.122754 0.0468224 +0.0523857 0.0624129 -0.0025136 +0.0383109 0.0632029 0.0342252 +-0.0144971 0.0786767 0.0566892 +-0.0928565 0.129591 0.0132418 +-0.0681034 0.152856 -0.0481556 +-0.0746787 0.169356 -0.0440586 +-0.0335137 0.107031 0.0389932 +0.0424926 0.0583469 0.0313486 +-0.0223256 0.0637459 0.0453694 +-0.0648797 0.106687 -0.0146649 +0.0250125 0.0632249 0.0448766 +-0.0624284 0.159959 -0.0405984 +0.00349445 0.12099 0.0360851 +0.022067 0.0981797 0.0461337 +-0.0734899 0.123206 0.0535424 +-0.0321688 0.171168 -0.015915 +-0.0848969 0.106313 0.0233612 +-0.067172 0.174543 -0.0467986 +0.0246727 0.0884534 -0.0236513 +-0.0504949 0.0477308 0.0397221 +-0.064202 0.155431 -0.0413859 +0.00347944 0.095162 0.0537659 +0.0105108 0.100431 0.0479236 +0.021311 0.123415 0.0275211 +0.0415141 0.104253 0.009162 +-0.0617635 0.0387159 0.0237173 +-0.0044982 0.0952431 0.0547633 +0.0398123 0.066053 -0.00878746 +-0.00271622 0.0627636 -0.0349069 +-0.00914442 0.0387021 0.000210725 +-0.0814422 0.106028 0.0294684 +-0.0136643 0.0922643 -0.0359313 +0.0420557 0.0676716 -0.00377172 +-0.0364793 0.0945677 0.0439429 +-0.05033 0.0517928 0.0340061 +-0.0470088 0.130577 0.00217989 +-0.0286777 0.158132 0.000508817 +0.0185266 0.0345532 0.000246197 +-0.0147199 0.184604 -0.0232088 +-0.0384921 0.111131 0.0361977 +-0.0384978 0.102835 0.0403416 +-0.0215751 0.0667511 0.0487462 +-0.0887264 0.0996152 0.00841821 +-0.060662 0.0644224 -0.00688354 +0.0397235 0.080129 -0.010751 +-0.0136601 0.0389486 0.0334846 +-0.0106876 0.129553 0.00573838 +0.00810435 0.0348429 0.0181346 +0.0256081 0.104449 -0.0166247 +-0.0682325 0.168499 -0.0270627 +-0.0474794 0.0917467 0.0438194 +0.00950115 0.119644 0.0365249 +0.0437324 0.0790794 0.0263023 +-0.0905234 0.132421 0.0302253 +-0.0748541 0.107208 0.0370405 +-0.0943565 0.12553 0.0182582 +-0.0131926 0.0378477 0.0507876 +-0.0570855 0.0480965 0.0356642 +-0.04493 0.0346468 0.0377647 +-0.0665925 0.064199 -0.00375071 +-0.0829976 0.133839 -0.00205551 +-0.0406365 0.0548831 -0.0112562 +-0.00950098 0.0884225 0.0571104 +0.0335068 0.0468989 0.0306812 +4.31947e-06 0.034593 -0.0165995 +-0.0725884 0.155473 0.0265843 +-0.0755167 0.0714511 -0.00453448 +-0.0669139 0.0704667 0.0354638 +-0.069981 0.180634 -0.0574865 +-0.0116389 0.034923 0.0481436 +-0.0307766 0.0720324 -0.0295197 +-0.0178239 0.107521 -0.0218927 +0.020822 0.043607 0.0421342 +-0.025466 0.0460651 0.0509844 +0.0349766 0.11396 0.0183585 +-0.0599273 0.122373 -0.00867944 +0.0365334 0.0980835 0.033685 +-0.0621481 0.159972 -0.0385982 +-0.0915531 0.115336 0.039285 +-0.0888763 0.0982745 0.00841224 +-0.00324635 0.130613 0.0199814 +-0.0668526 0.0914559 0.0435065 +0.0175786 0.0475536 0.0427473 +0.0318002 0.118052 0.00717688 +-0.0414667 0.104283 0.0404247 +0.0562407 0.0648113 0.00118357 +-0.0753758 0.170369 -0.0311391 +-0.0620405 0.138434 -0.00686017 +-0.00249822 0.0870283 0.0569791 +-0.0542914 0.129735 0.0355428 +-0.0274963 0.100194 0.0434874 +-0.00951883 0.17115 -0.0217635 +-0.0305995 0.121953 0.0248664 +-0.0770757 0.068957 0.00853894 +0.0135031 0.119752 -0.013055 +0.0413777 0.0491221 -0.00619394 +-0.0669027 0.0396709 0.012801 +-0.0249365 0.0607087 0.0409751 +-0.0124795 0.0517352 0.0508543 +-0.0304 0.0650386 -0.0254348 +-0.0267061 0.0765373 0.0464972 +0.0196875 0.0385058 -0.013693 +0.0518591 0.0461434 0.019211 +-0.0447475 0.146272 0.00240034 +-0.0336457 0.0562895 -0.0107616 +0.0237552 0.0887468 -0.0239425 +-0.000502572 0.0965565 0.053664 +-0.0664522 0.0376478 0.0363332 +-0.041205 0.169789 -0.00987939 +-0.0630084 0.142674 -0.00705706 +-0.0305333 0.178655 -0.00565353 +-0.0137626 0.0784616 -0.0384771 +-0.0616465 0.0397266 0.0174413 +0.00939844 0.0418898 -0.0239164 +0.0403895 0.0519763 -0.00684208 +0.00239172 0.0434053 -0.0248906 +-0.0663598 0.15609 0.0142173 +-0.0667166 0.136853 0.0439657 +-0.0132042 0.171245 -0.025107 +-0.0511148 0.117699 -0.0144446 +-0.0686887 0.0620968 0.00507892 +-0.066502 0.0889512 0.0442634 +-0.0531749 0.0487012 0.0129919 +-0.0464945 0.0532702 0.037612 +-0.0763048 0.0702707 0.00153293 +0.00237024 0.0481449 -0.0294793 +-0.0669085 0.108072 -0.0133167 +-0.0614834 0.166203 -0.0576271 +0.028089 0.0929174 0.0442737 +-0.0239187 0.036252 -0.0191133 +-0.0394562 0.0347283 0.0406132 +-0.0679286 0.17514 -0.0470724 +-0.0737519 0.14858 -0.0228576 +-0.0335079 0.105635 0.0395993 +-0.0780357 0.0769322 0.031104 +0.047273 0.0720618 0.00573289 +-0.0566027 0.0562228 -0.000407584 +-0.0336617 0.0592604 -0.0121578 +0.0390714 0.108406 0.0131668 +-0.067572 0.158668 -0.00806913 +-0.0668441 0.0995074 -0.0160123 +-0.0155786 0.0348181 -0.0259692 +0.0524799 0.0636428 -0.00173686 +-0.0666208 0.161046 -0.0135117 +0.012487 0.118181 0.036207 +0.00850767 0.067431 0.0550095 +-0.0568164 0.0333332 -0.00454462 +-0.00056724 0.0909565 -0.0345037 +0.0122553 0.0695892 -0.0315106 +-0.0747099 0.0713354 -0.00558545 +-0.0151964 0.178666 -0.0203777 +-0.0707468 0.161979 -0.010709 +-0.00364517 0.0496603 -0.0307711 +0.0292759 0.0787271 -0.0215887 +-0.0606931 0.0659255 -0.00858452 +-0.055281 0.0594285 0.0232183 +0.0168274 0.0658911 0.0506364 +-0.0286315 0.159193 -0.0128611 +-0.0753259 0.0689002 0.0227894 +-0.0278046 0.0364789 0.0536304 +-0.020238 0.0938075 -0.0335417 +-0.0787919 0.108745 0.0367247 +-0.0627356 0.150882 -0.0252578 +-0.0374903 0.111156 0.0359971 +0.0123741 0.0494269 -0.0274814 +-0.0550935 0.0685958 0.0378502 +0.0152655 0.0695272 -0.0306629 +0.0304209 0.0460912 -0.00653037 +-0.0896888 0.137919 0.0321971 +-0.076768 0.156222 -0.00903892 +-0.0177411 0.17422 -0.017052 +-0.0582856 0.0695544 0.0380966 +-0.0710157 0.179813 -0.0510815 +-0.0283604 0.112635 -0.0172343 +-0.0441537 0.0408799 -0.0213021 +0.0104769 0.0949778 0.0509942 +-0.00239285 0.100006 0.0487279 +0.0421962 0.0929549 -0.00479827 +0.0401191 0.0900359 0.0318057 +0.0226855 0.103953 -0.0180758 +-0.0705692 0.037778 -0.000833243 +0.0213756 0.0429924 -0.0177346 +0.0141656 0.0475343 0.0448184 +0.02539 0.0849287 0.0474039 +-0.0485578 0.0361757 -0.0124661 +0.0237226 0.0699627 0.0465409 +-0.062494 0.155703 0.00979223 +-0.0499478 0.135176 0.00116888 +-0.0731261 0.154051 -0.0329012 +-0.0565591 0.0344267 0.0337344 +-0.0757231 0.155771 0.0225635 +-0.081733 0.0783168 0.0273929 +-0.0465781 0.0504461 -0.00966731 +0.0370638 0.0376395 0.0160314 +0.0401736 0.0801429 -0.00978947 +-0.0295615 0.171229 -0.00778742 +-0.0625363 0.158377 -0.0386027 +-0.0482692 0.133969 0.0226705 +0.00454759 0.0341639 -0.0171912 +-0.0620171 0.153759 -0.016582 +-0.0878261 0.11219 0.0337097 +-0.05597 0.0519966 -0.00239063 +0.0400386 0.0871415 -0.0117889 +0.0205921 0.0807207 0.0509473 +-0.0296224 0.0352251 0.019146 +-0.0381589 0.163687 -0.0131595 +-0.0675595 0.163657 -0.0167503 +-0.0522361 0.15086 0.0163848 +0.0360023 0.103374 0.0311349 +0.0272712 0.0929162 0.0448522 +-0.0277389 0.0423333 0.0528015 +-0.0824451 0.140729 0.0449221 +-0.0329396 0.0386558 -0.0303928 +0.0296623 0.114075 -0.00693776 +-0.0221975 0.0652175 0.046591 +0.045212 0.0819736 0.0221688 +-0.0258761 0.0796032 0.0512286 +0.0272389 0.0873294 -0.0222582 +0.00242016 0.0361514 -0.024222 +-0.0615581 0.145382 0.0374116 +-0.0695688 0.160974 -0.049948 +-0.0858053 0.0953564 -0.000572964 +-0.0464927 0.165223 0.0045927 +-0.0624159 0.15064 -0.016574 +0.0473464 0.0561746 -0.0057008 +0.0237088 0.0942271 0.0467477 +-0.0494979 0.0762481 0.043343 +-0.078769 0.165248 -0.0339573 +-0.00950205 0.12806 0.0264334 +0.05377 0.0682444 0.00163269 +-0.0679209 0.163786 -0.054975 +0.0290078 0.087549 0.0438096 +-0.0840398 0.132376 -0.0018283 +-0.0306543 0.0650659 -0.0244333 +0.0322458 0.0355363 0.00770856 +0.00335212 0.131364 0.00663122 +-0.0154115 0.128891 0.0141212 +-0.0372876 0.0421099 0.0439093 +0.0308492 0.0931255 -0.0185705 +-0.029871 0.0459583 -0.0272702 +0.0300675 0.0822073 0.0435477 +0.000382137 0.128869 0.0270967 +-0.0174793 0.0730127 0.0550809 +-0.0387497 0.0782817 -0.0191475 +-0.0433943 0.0335852 -0.0186462 +0.0391881 0.0673984 -0.0107969 +-0.0280713 0.175691 -0.00734553 +0.0316149 0.0916151 0.0423373 +-0.0762132 0.0879097 -0.0135406 +-0.0316751 0.0665766 -0.0214412 +-0.00307655 0.0345443 -0.0171652 +-0.0426807 0.0636637 -0.0138633 +-0.0921228 0.126953 0.0372491 +-0.0235086 0.0347636 0.0474886 +-0.0506072 0.0546369 -0.00878713 +-0.0685971 0.162283 -0.0128033 +-0.0637348 0.156074 0.0136991 +0.0233928 0.0475951 -0.0196868 +-0.0519018 0.105587 -0.0193502 +-0.00551889 0.0746529 0.0585785 +0.000500504 0.0519731 0.0534094 +-0.0412672 0.0338015 -0.0128657 +-0.0819225 0.125087 -0.0048212 +0.00722702 0.0796252 -0.0338785 +-0.0893296 0.0956153 0.0124232 +-0.00167125 0.0554598 -0.0320096 +0.0267785 0.0402768 0.0313512 +-0.0867821 0.10632 0.010369 +-0.0451957 0.131364 0.0135329 +0.018149 0.0699846 0.0508404 +-0.0878008 0.119885 0.00028492 +-0.0612546 0.0341987 0.0206565 +0.0115009 0.111256 0.0392728 +0.0152633 0.0751002 -0.0297036 +-0.0351444 0.0865581 -0.0244792 +0.000649673 0.0963928 -0.0300705 +-0.0345272 0.121283 0.0279162 +0.0296818 0.0815643 -0.0205093 +-0.03348 0.115008 -0.0157024 +-0.0728312 0.136891 0.0492499 +-0.00265601 0.0540246 -0.0319128 +-0.0422272 0.127744 0.0161624 +-0.0494399 0.119744 0.0319359 +-0.0574019 0.116942 0.0379675 +-0.0468361 0.0970763 -0.0219471 +-0.0616292 0.146031 -0.00460349 +-0.0933662 0.126937 0.0262691 +-0.0228186 0.161021 -0.00330981 +-0.0635624 0.152855 0.034229 +-0.0625195 0.144437 -0.00658249 +-0.0839827 0.0830482 -0.0025149 +0.0144965 0.116791 0.0366152 +-0.0766305 0.155099 0.0076657 +-0.0365494 0.127902 0.0108341 +0.02042 0.126659 0.0186188 +-0.0470606 0.0628926 0.0375096 +-0.00665705 0.114661 -0.0174859 +0.0409886 0.104212 0.016155 +0.0264254 0.054947 0.041554 +-0.064618 0.0659249 -0.00682147 +0.0143052 0.127349 0.0263844 +-0.0254714 0.0379526 0.0103195 +0.0213669 0.0851498 -0.0262488 +-0.0469792 0.133264 0.00837709 +-0.0845615 0.0777561 0.014943 +0.0384886 0.0513309 0.0319844 +-0.0128833 0.165453 -0.0135102 +-0.0811951 0.147316 0.000164965 +-0.0523892 0.141597 0.0213852 +-0.045982 0.130505 0.00444274 +0.0279356 0.0520839 0.0384098 +-0.0931866 0.124098 0.0112689 +-0.0316005 0.0707575 -0.0264789 +0.00339515 0.0448431 -0.0258796 +-0.019688 0.0352649 -0.0192337 +-0.0492398 0.164062 -0.00484765 +-0.00759694 0.039172 -0.0259394 +-0.0456148 0.043386 -0.0114089 +-0.0706825 0.163806 -0.0469738 +-0.0111277 0.166928 -0.0162357 +0.0150914 0.0873948 0.0517971 +-0.0488841 0.0335499 -0.0104742 +0.0191832 0.0974256 -0.0227258 +-0.068761 0.17368 -0.0560297 +0.0347852 0.0821986 0.0398055 +-0.0656191 0.164967 -0.0232289 +0.0488884 0.0431235 0.0112233 +-0.0204394 0.0725535 0.0530664 +0.0198178 0.127196 0.0112616 +-0.0870347 0.13912 0.00619253 +-0.0619782 0.15683 -0.0335967 +0.0192552 0.0735767 -0.0281447 +-0.0582892 0.0589697 0.00149643 +-0.0794885 0.131664 0.0524764 +-0.0625817 0.159955 -0.0415973 +-0.0344319 0.0350721 -0.0182387 +0.0339652 0.0955609 0.0387182 +-0.0350568 0.0344135 0.0294961 +-0.00649976 0.0842428 0.0569087 +-0.0606247 0.0394421 0.0446315 +-0.066026 0.146409 -0.0228827 +0.0265887 0.0491527 0.0382012 +-0.0447519 0.078285 -0.0193632 +0.0442188 0.0833029 0.0251703 +-0.025021 0.178659 -0.00994683 +0.0382789 0.10977 0.00952257 +-0.0756137 0.176488 -0.0441876 +-0.0706968 0.169922 -0.0279808 +-0.0514769 0.0344526 0.0347935 +0.00449209 0.108585 0.0419458 +0.0591616 0.0552765 0.0151753 +0.0295012 0.0578054 0.0407589 +0.0323993 0.0505614 -0.00746951 +-0.0570338 0.131087 -0.00617819 +-0.0304972 0.101559 0.0427282 +-0.00116978 0.0991573 0.0506694 +-0.0238077 0.0811303 0.0547388 +-0.00701023 0.0988653 -0.0267279 +-0.0156999 0.0584946 -0.0353551 +0.00922562 0.0809438 -0.0326125 +0.0453737 0.0474164 -0.00383546 +0.0044338 0.117686 -0.0167913 +0.0239341 0.0561524 -0.0247597 +0.0591083 0.0705376 0.015147 +-0.0594646 0.151494 0.0342364 +-0.0657091 0.157202 -0.00882727 +-0.0250337 0.0381576 0.00660247 +0.0420581 0.102887 0.0101643 +0.0436509 0.0403831 0.00924323 +-0.00449056 0.130995 0.0108991 +0.0044777 0.112767 0.0412512 +0.00553763 0.100304 0.04669 +-0.0942962 0.120123 0.0192891 +-0.0620801 0.0339964 0.0171254 +-0.0160023 0.128658 0.015367 +-0.0432963 0.128843 0.0142751 +-0.0634932 0.104261 0.0408123 +-0.0746115 0.103538 0.0368408 +-0.0222463 0.0739152 0.0519932 +-0.0544743 0.034136 0.0256577 +-0.0252277 0.12616 0.0135052 +-0.0320296 0.171249 -0.00429305 +-0.0132393 0.1837 -0.0278845 +-0.0324962 0.0718107 0.0406773 +-0.0765269 0.165965 -0.0237196 +-0.0833313 0.0829966 0.0292517 +0.0259015 0.0902483 0.0463733 +0.0095961 0.0354723 -0.00987583 +0.0511798 0.0581784 0.029952 +-0.0848476 0.0845966 0.0254873 +-0.0509379 0.131197 -0.00260501 +0.00252027 0.0730778 0.0562797 +-0.0135504 0.122737 -0.00796322 +-0.00761024 0.0420402 -0.0258045 +-0.0508461 0.134795 0.0276114 +-0.0804072 0.155064 0.0209566 +0.00350727 0.103765 -0.0218529 +-0.0106066 0.0420419 -0.0261259 +-0.0713436 0.0632651 0.0179295 +-0.067959 0.169303 -0.0298283 +-0.0236585 0.049302 -0.027521 +-0.069473 0.158882 -0.00587612 +-0.0766843 0.15421 -0.00390102 +-0.0220401 0.0852804 0.0556778 +0.0275877 0.0465825 -0.0117097 +-0.00852427 0.130326 0.0108566 +0.0130382 0.0344991 0.00293188 +0.0559458 0.0605187 0.000117677 +-0.0348266 0.0900917 -0.0242073 +-0.0890869 0.135136 0.0402764 +-0.0897624 0.136545 0.033205 +0.00547548 0.112757 0.0410095 +-0.0712367 0.159654 -0.00650092 +-0.0121993 0.177175 -0.0288808 +-0.0823069 0.0748418 0.00552391 +-0.054558 0.0460859 0.0144477 +-0.070487 0.0669606 -0.00253268 +-0.0556924 0.159448 0.00648476 +-0.00649361 0.105887 0.04408 +-0.0602281 0.059992 0.0213112 +-0.0580325 0.0579587 0.00923969 +-0.0338627 0.110196 -0.0186635 +0.0546876 0.0597691 -0.00173886 +-0.0625369 0.149102 -0.00757295 +0.0542703 0.0575789 -0.00178727 +-0.0088618 0.129865 0.0208462 +-0.0801514 0.109359 0.0377151 +-0.00679227 0.0798757 -0.0378854 +-0.0424904 0.0860159 0.0426903 +0.0479819 0.0723794 0.00739708 +-0.0560722 0.13957 0.0312222 +-0.0365138 0.0804626 0.0431357 +0.00167631 0.105337 -0.0215515 +-0.0775111 0.0860271 0.0374369 +0.0259521 0.11908 -0.00433188 +-0.0558236 0.0526652 0.00846948 +-0.0846054 0.11036 0.02536 +-0.0765518 0.15421 -0.000899711 +0.0127846 0.0699169 0.0536174 +0.0208082 0.1264 0.00735797 +-0.0504584 0.0502644 0.0363006 +0.0174244 0.125027 -0.00283112 +-0.0308709 0.178515 -0.0130008 +-0.00718543 0.0385691 0.00621806 +0.0407891 0.0886694 0.0309807 +-0.0357951 0.124657 -0.0058294 +-0.0554873 0.0400326 0.0469712 +-0.057026 0.0675163 0.0366088 +-0.0497286 0.133927 0.0265636 +-0.00790814 0.0384861 0.0079669 +-0.0811308 0.0841829 -0.00653469 +-0.010479 0.0991873 -0.02508 +0.00856046 0.0354979 0.0447263 +-0.0634822 0.166302 -0.0366942 +-0.0223475 0.0360366 0.0535038 +-0.0795325 0.124539 0.0521412 +-0.00951606 0.0745243 0.0569833 +-0.0130122 0.127478 0.0251829 +-0.0936226 0.120076 0.0132919 +-0.0540996 0.154592 -0.00271527 +-0.0879876 0.132208 0.00230713 +-0.034669 0.15585 -0.0101443 +-0.0197012 0.0598498 -0.0346368 +-0.0276791 0.155231 -0.00339809 +-0.0842452 0.0818537 0.025498 +-0.054537 0.0560032 -0.00541843 +-0.0497623 0.0665865 0.0371903 +-0.0891577 0.092949 0.0214162 +-0.0577737 0.0782037 -0.0194332 +-0.064492 0.104249 0.0405622 +-0.0336047 0.0695556 -0.0194645 +-0.0558611 0.0955845 -0.021564 +-0.0184974 0.0869962 0.0565805 +0.00637923 0.0372606 0.0264872 +-0.0665048 0.104229 0.0399675 +0.0566718 0.0553009 0.0238011 +-0.0283123 0.0383433 -0.00703005 +-0.0114184 0.169868 -0.0184586 +0.0211822 0.0909362 -0.0242734 +0.0406295 0.0806796 0.0323988 +0.0123659 0.128443 -0.000397752 +-0.0384845 0.0833049 0.0437838 +-0.01051 0.0531978 0.0517663 +0.00250545 0.0842781 0.0574483 +-0.0674995 0.0972695 0.0419768 +-0.0618921 0.119466 -0.00942759 +-0.00594439 0.13066 0.0175514 +-0.0188708 0.0382701 0.00775373 +-0.0605698 0.0727907 0.0401099 +-0.0115041 0.115551 0.0394745 +0.0300401 0.11902 0.00366373 +-0.0812551 0.10738 0.02923 +-0.0704758 0.123201 0.0533571 +-0.0711231 0.141136 0.0464522 +-0.0222312 0.125137 -0.000350139 +0.0436968 0.0818627 -0.00278544 +-0.00557531 0.0383818 0.0157938 +-0.0175218 0.187118 -0.0194148 +0.000510392 0.0689287 0.0563645 +0.0339979 0.0519394 0.0331121 +0.00286804 0.129802 0.0250965 +-0.0290472 0.0777737 0.0431405 +0.0209137 0.102084 0.0444516 +-0.00628355 0.0409075 0.0485853 +0.0605521 0.0595441 0.0141714 +0.0386236 0.0898511 -0.0127692 +0.0302987 0.0539206 -0.0157566 +-0.0421651 0.149301 -0.00412295 +-0.0126067 0.040646 -0.0265976 +-0.0788091 0.168052 -0.033971 +0.0359211 0.112779 0.0172688 +-0.0394762 0.17111 0.000601324 +-0.0330305 0.0384181 -0.00620006 +-0.0859939 0.0940196 0.000445293 +-0.0359122 0.158048 0.00410154 +-0.0745011 0.151286 -0.0298782 +0.0531496 0.0491587 0.00225551 +-0.0243767 0.179986 -0.0189674 +-0.0891975 0.0996627 0.0124046 +-0.0742533 0.17954 -0.0493425 +-0.0510836 0.145457 -0.000907293 +0.0483282 0.0561556 -0.00540695 +-0.0224848 0.0474635 0.0510926 +-0.0647533 0.163375 -0.0214725 +-0.0127683 0.163589 -0.0126806 +0.0112702 0.0766287 -0.031501 +-0.0460801 0.153165 -0.0063697 +-0.0396673 0.0606846 -0.0120669 +0.0304753 0.100799 0.0389817 +0.0504441 0.0731136 0.0180651 +0.0195371 0.122997 -0.00457304 +-0.0455152 0.0505363 0.0385492 +-0.0525396 0.0458696 -0.00783738 +-0.0679101 0.109459 -0.0121777 +0.0257715 0.122252 0.0234619 +-0.0641925 0.158337 -0.0512857 +-0.0679573 0.0636968 0.0236258 +0.0336501 0.0872305 -0.0183746 +-0.081408 0.0801232 -0.00353296 +-0.068364 0.143961 0.043402 +-0.060807 0.170968 -0.0607383 +-0.0530022 0.0712206 0.0395879 +-0.0629233 0.149038 -0.01858 +-0.0911763 0.131044 0.0302322 +-0.0866097 0.0859466 0.00148078 +-0.0213048 0.0567472 0.0459531 +-0.0884724 0.111842 0.0093465 +-0.0232358 0.0382045 0.0267906 +-0.0687325 0.178002 -0.0502345 +0.0171734 0.0960138 -0.0234178 +-0.0336295 0.0533957 -0.0102549 +0.0404048 0.0661215 -0.00776758 +0.0352114 0.113974 0.0112756 +-0.0509894 0.131098 0.0315417 +-0.0825925 0.0857998 0.0312629 +0.0165569 0.0367823 -0.018664 +-0.0158447 0.163118 -0.0162484 +0.0463618 0.0504062 -0.00492067 +-0.0256024 0.0918183 0.0477571 +0.0401119 0.105635 0.0181717 +-0.075865 0.120825 -0.00747435 +-0.0515138 0.0502892 0.0216268 +-0.0597307 0.0737738 -0.017073 +0.0327302 0.0795508 0.0421017 +0.0561478 0.0493933 0.0131905 +-0.0491927 0.149222 0.0111539 +-0.0505664 0.0459962 -0.00889176 +-0.0346044 0.0381371 0.0484275 +-0.0571418 0.0341673 0.0268338 +-0.0508978 0.0335658 0.00549258 +0.0499018 0.0460625 0.00228276 +0.000648366 0.101032 0.0453587 +-0.064515 0.0945534 0.0434117 +-0.00933623 0.127529 -0.00319765 +-0.0931674 0.126844 0.0122586 +-0.0775055 0.120428 0.0519362 +-0.00412302 0.0390868 0.0317249 +-0.0444953 0.12065 0.0276432 +-0.0808257 0.114785 -0.00282613 +0.00848893 0.0976878 0.0492062 +-0.0204952 0.119495 0.0334766 +-0.0744171 0.1312 0.052182 +-0.0354802 0.0365931 -0.0303176 +-0.0158225 0.127346 0.0227279 +-0.0622273 0.163125 -0.0345932 +-0.0308039 0.0345326 0.0408762 +-0.0684942 0.0944611 0.0423345 +-0.0282259 0.115945 -0.0147131 +-0.00496131 0.0393649 0.0367022 +0.000507606 0.089764 0.0561546 +0.0184391 0.121423 0.0322194 +-0.0293563 0.0761839 -0.0345604 +-0.0798193 0.0993879 0.0336913 +-0.0260706 0.125207 0.0176138 +-0.0466789 0.0383303 -0.0162856 +-0.0551627 0.0709645 0.0393255 +-0.0708102 0.086505 -0.0166182 +-0.0534691 0.0491595 0.0373719 +-0.0176627 0.0365106 -0.0181139 +0.00950436 0.0910078 0.0538342 +-0.0895706 0.136541 0.0322035 +0.0538065 0.0721186 0.0208488 +-0.00549555 0.115561 0.0401898 +0.00964519 0.0349724 -0.00752839 +-0.0134864 0.112741 0.0406725 +-0.00206815 0.039143 -0.00620903 +0.0130247 0.112857 -0.017601 +-0.0790398 0.119048 0.050662 +-0.0808858 0.0872378 0.0337267 +-0.0123796 0.124965 -0.00637162 +-0.0213885 0.125739 0.00103732 +-0.089509 0.125659 0.045333 +-0.05553 0.137483 -0.00349047 +0.0417216 0.100008 -0.000812454 +-0.0294372 0.045874 0.0494957 +0.0458807 0.0774123 0.0204549 +-0.010796 0.120869 -0.0120713 +-0.0650859 0.171096 -0.0446086 +-0.0309091 0.0594671 -0.0184147 +0.0318276 0.102039 -0.0140664 +-0.050474 0.137043 0.0223997 +-0.0892111 0.0956026 0.0114219 +-0.0551272 0.0478339 0.0400497 +-0.0376142 0.115213 -0.0159111 +-0.0262205 0.0604134 -0.0304432 +-0.0395514 0.159448 0.00235113 +-0.0548296 0.0912974 -0.0221769 +0.0140209 0.113717 -0.0165571 +-0.0376838 0.0651596 -0.0143574 +-0.0357596 0.0367769 0.0465803 +0.0218833 0.124858 0.00205716 +-0.0515413 0.0403485 -0.0110842 +0.0196453 0.0521206 0.045827 +-0.0274751 0.109286 -0.019717 +-0.054346 0.125513 0.0372066 +-0.061806 0.172532 -0.0555873 +0.0193853 0.0367967 0.0404 +0.00315064 0.0340463 -0.0192491 +-0.0419902 0.127061 0.0177443 +-0.0753578 0.0671035 0.0137678 +-0.017747 0.0685932 -0.0381265 +0.0502404 0.0581527 0.030355 +-0.01349 0.11138 0.0414506 +-0.088473 0.0908539 0.022804 +-0.0623246 0.0380624 0.0435494 +-0.0315191 0.0831203 0.0417649 +-0.0908528 0.131057 0.0322319 +-0.0524868 0.0959601 0.0436811 +0.0383485 0.10917 0.00520513 +0.0405643 0.0599899 -0.00408877 +-0.00769877 0.0598808 -0.0345717 +0.0253549 0.0875981 0.0473346 +-0.0126907 0.166905 -0.0150111 +0.0384994 0.0541178 0.0316123 +-0.034906 0.0367338 -0.0161439 +-0.057208 0.048538 0.00854022 +-0.0255159 0.108511 0.0401259 +0.0305676 0.0350004 0.0115893 +-0.0520943 0.0559627 0.0266271 +-0.0610057 0.155949 0.0190169 +-0.067333 0.1766 -0.0497355 +0.0258363 0.0844839 -0.0235493 +-0.0689178 0.164003 -0.0158096 +-0.00849374 0.116931 0.0393004 +-0.0752784 0.113511 0.0497641 +-0.0888148 0.144497 0.0313918 +-0.0453871 0.145929 0.00156561 +-0.0599561 0.0677317 0.0357891 +-0.0125434 0.0386707 -0.00229897 +-0.000271447 0.0356914 0.00658166 +-0.0415825 0.0366566 0.0434527 +-0.0297036 0.165315 -0.00626903 +-0.0467885 0.0855251 -0.0217462 +-0.0827882 0.125806 0.051363 +-0.0176693 0.0966335 -0.0284397 +-0.0464991 0.115243 0.033257 +-0.0569748 0.146758 0.0317266 +-0.0430879 0.156177 -0.00890493 +-0.00350236 0.0774419 0.0585703 +-0.0699027 0.158151 -0.0489236 +0.0362459 0.112339 0.00591924 +0.0367118 0.0920329 -0.0133924 +-0.0539202 0.0610131 0.0274265 +-0.0093317 0.127279 0.0279745 +-0.0726772 0.112018 0.047983 +-0.0451365 0.160644 -0.00892562 +-0.0209165 0.172715 -0.0146234 +-0.0477839 0.125387 0.0290716 +-0.0734873 0.156859 -0.0289164 +0.00860516 0.061703 0.0545256 +-0.0246606 0.0422329 0.0539554 +-0.0315436 0.153515 -0.00448892 +0.0345459 0.0571781 -0.011728 +-0.0791321 0.170818 -0.0399882 +0.0254504 0.0415949 -0.00563526 +0.0230318 0.0355156 0.0114574 +-0.0554984 0.107053 0.0399469 +-0.0296361 0.0522471 0.0373693 +-0.0438179 0.0928034 -0.0224841 +-0.0199243 0.0387302 -0.0112686 +0.0212455 0.0791286 -0.0267859 +-0.0532861 0.0527919 0.0115704 +0.00450017 0.0441843 0.0459802 +-0.0329932 0.0339759 0.0213799 +0.0553011 0.0604636 -0.000842819 +0.00165238 0.0932332 -0.0327923 +-0.0552284 0.0527023 0.00927604 +-0.0783599 0.0708413 0.0204513 +-0.0767777 0.176413 -0.0510191 +-0.0394918 0.104211 0.0396007 +0.0327921 0.0889736 0.0422708 +-0.00991923 0.0986226 0.0505787 +-0.0806729 0.108958 0.0307202 +-0.0822864 0.135367 0.0491747 +-0.0649369 0.0609076 0.00327394 +0.0386477 0.0715748 -0.0117783 +-0.0240415 0.126597 0.0109996 +-0.0781422 0.141688 -0.0047364 +-0.0427782 0.0841106 -0.0212812 +-0.0641686 0.178174 -0.0558405 +0.0252976 0.0661311 -0.0233121 +0.0189895 0.0631559 0.0484766 +0.0182463 0.0722224 -0.0290012 +-0.0777504 0.161717 -0.020949 +-0.051966 0.138521 0.000416067 +-0.0605353 0.155832 0.0177371 +0.0437866 0.098742 0.00716534 +-0.0494703 0.0370271 -0.0120635 +0.0464078 0.0806576 0.0101793 +0.0218218 0.116393 -0.0114503 +-0.0533273 0.132699 -0.00427378 +-0.0681775 0.0762505 0.039044 +-0.0250035 0.0896 -0.0352857 +0.000769534 0.0946028 -0.0322154 +-0.0158082 0.0346932 0.0474464 +-0.076979 0.148604 -0.00699397 +0.0467055 0.0730498 0.0181295 +-0.0496483 0.0634464 -0.0118311 +-0.0197535 0.0700012 -0.0382558 +0.0232727 0.0989983 -0.0208236 +-0.0777 0.16251 -0.0219398 +-0.0908755 0.147455 0.0141474 +-0.0334742 0.0638502 -0.015538 +0.00219672 0.0825025 -0.0349885 +-0.0814773 0.128835 0.0524787 +-0.0784807 0.13724 0.0497912 +0.0361312 0.11046 8.71157e-05 +-0.0454849 0.0931252 0.0434035 +-0.0635463 0.153079 -0.00800928 +-0.0529285 0.0339107 0.0244154 +-0.00862356 0.0451919 -0.0286362 +0.0192377 0.117984 0.0350388 +-0.000496915 0.0883839 0.0565827 +0.0316988 0.118246 0.0142694 +-0.0398347 0.169198 -0.01127 +0.0219416 0.125622 0.00635903 +-0.092876 0.129604 0.0142376 +-0.023566 0.0579721 0.0425175 +-0.0447621 0.126552 0.0211574 +-0.0390659 0.157734 -0.0109824 +-0.0038734 0.104505 -0.022849 +-0.0810823 0.146103 0.0405774 +-0.00499552 0.038756 0.0282379 +0.00659654 0.102942 0.0449664 +-0.0528078 0.0898592 -0.0221628 +-0.0415043 0.0340515 -0.0039392 +-0.0118724 0.166916 -0.0155725 +0.00801932 0.113693 0.0398597 +-0.0873717 0.0895698 0.0245766 +0.0235801 0.11767 -0.00881398 +-0.0592051 0.0411249 -0.00803844 +-0.0631955 0.174736 -0.0540401 +-0.00904474 0.102005 -0.0240096 +-0.0893459 0.0888735 0.0114634 +-0.0847817 0.111591 0.0313073 +-0.0318636 0.155275 -0.00893878 +0.020119 0.0578214 0.0483165 +-0.0884363 0.140505 0.0381916 +0.0268748 0.0768062 0.0459093 +0.00650425 0.06886 0.0554952 +-0.0600274 0.155812 0.00342033 +0.00439509 0.0433687 -0.0246925 +-0.0644393 0.157952 -0.0526177 +-0.0626717 0.152516 0.0345768 +-0.0686641 0.0435432 0.00268116 +-0.0668913 0.155545 0.00822429 +-0.0513204 0.0545255 0.0306253 +-0.0216946 0.055283 -0.031103 +0.0201038 0.121698 0.0313961 +-0.0435092 0.0973014 0.0425845 +-0.0598342 0.124083 0.0415696 +-0.0290584 0.0385824 0.0360072 +-0.0211666 0.0959679 -0.0277597 +0.0393164 0.0948581 -0.00836399 +-0.0465497 0.0354834 -0.0182685 +-0.0577953 0.0577539 0.0112722 +0.0343862 0.0533953 0.033694 +-0.0356597 0.12459 0.0229985 +-0.0703962 0.0382223 -0.000484462 +0.0394034 0.0772645 -0.00977482 +0.0374516 0.110677 0.0163977 +0.022681 0.0549804 0.0449373 +-0.00661876 0.0388692 0.029605 +-0.0298463 0.0958488 -0.0239617 +-0.0500656 0.165567 2.77718e-05 +-0.0624265 0.163056 -0.0535855 +0.0182459 0.035082 -0.00972071 +-0.0535426 0.139527 0.0278286 +0.0535157 0.0664189 0.0268642 +-0.0618871 0.044625 0.0401036 +0.0279315 0.0813321 -0.0222629 +-0.0364738 0.0959436 0.0435424 +-0.0648009 0.0867059 -0.0190299 +-0.0910478 0.113254 0.017639 +0.0328625 0.115479 0.000361714 +-5.55454e-05 0.1192 -0.0143689 +0.00440015 0.0419024 -0.0241382 +-0.0356548 0.0459643 -0.0252685 +-0.00874142 0.0699019 -0.0364843 +-0.0786816 0.173602 -0.0460003 +-0.0750442 0.11265 0.048722 +0.0132032 0.0850348 -0.0305799 +-0.0275703 0.070462 0.0404211 +-0.0333885 0.082189 -0.0265241 +-0.0498121 0.0912811 -0.0216901 +-0.0121305 0.129539 0.00953518 +-0.0888371 0.0942243 0.00943852 +-0.0733262 0.151241 -0.0368807 +0.0159012 0.0347663 0.0342789 +-0.0464698 0.0336288 0.00272222 +-0.0219797 0.0381347 0.0126751 +-0.0434985 0.112577 0.0357301 +0.0374146 0.0807844 0.0365828 +-0.0150623 0.160937 -0.0114195 +0.00882514 0.0347544 -0.00561715 +-0.0793646 0.150083 0.036366 +0.0444807 0.0526489 0.0324592 +-0.0140843 0.0382987 0.0177555 +0.0371109 0.0630101 -0.0117592 +-0.0795655 0.0711751 0.0181423 +0.0314182 0.0968966 0.040312 +0.0553211 0.0622297 0.0271921 +-0.0344916 0.0789231 0.04184 +-0.0708134 0.0893817 -0.0163657 +-0.0786856 0.174223 -0.045863 +-0.0497628 0.0345507 0.0333201 +-0.026557 0.0646504 0.0393284 +0.0499455 0.0733656 0.0164225 +0.0233132 0.0902311 0.0479207 +-0.0441494 0.163638 -0.00943446 +-0.048497 0.0464891 0.040915 +-0.0638143 0.15519 -0.0396115 +0.0296208 0.115866 0.0291818 +-0.0505003 0.100168 0.042883 +0.00450871 0.0910904 0.0550512 +0.0223914 0.093257 -0.0227104 +-0.0346391 0.0469045 -0.0241611 +0.0600903 0.0608951 0.0181821 +0.0174829 0.0976104 0.0472234 +0.0245219 0.0382712 0.0311236 +0.0373902 0.0561474 -0.00613784 +-0.0725233 0.143597 -0.0104167 +-0.0755086 0.133058 0.0519758 +-0.0469091 0.134066 0.0158053 +-0.0365004 0.0719314 0.0420432 +0.0599383 0.0692126 0.0131498 +-0.0228512 0.126901 0.0114323 +0.0370832 0.0408236 0.0259314 +0.0430366 0.0709859 0.0269587 +0.0442558 0.0917077 -0.00080891 +0.0366443 0.0915417 0.0373244 +0.0149217 0.127634 0.0251635 +-0.0260773 0.0547586 -0.0274003 +0.0223322 0.0348324 0.0210401 +-0.0674741 0.169344 -0.0310786 +-0.0943935 0.125559 0.0222675 +0.000334373 0.0554042 -0.031412 +-0.023822 0.0694685 0.046666 +0.024828 0.0768588 0.0482443 +-0.0593221 0.0615947 0.0254084 +-0.0274704 0.0506795 -0.0243965 +-0.0172176 0.177147 -0.0249576 +0.0433823 0.0490357 -0.00560381 +0.0244317 0.116294 -0.00934411 +0.0184177 0.0350663 0.0309125 +0.0404265 0.102791 0.0231613 +-0.0243375 0.1639 -0.00728245 +-0.0675442 0.151908 -0.0456642 +-0.0311974 0.0474073 0.0447828 +-0.0726957 0.175719 -0.0430358 +-0.0165027 0.0499584 0.0473896 +0.0323852 0.0461686 -0.00610484 +0.0214495 0.0822346 0.0504578 +0.016822 0.123899 -0.00554312 +-0.0694694 0.178653 -0.050518 +-0.0741019 0.156119 0.0187476 +0.0510202 0.0736047 0.0138558 +-0.0739033 0.14718 -0.0168588 +-0.0165785 0.162548 -0.00831661 +-0.0414778 0.0347327 0.0401772 +0.0319294 0.118052 0.0100791 +-0.0502835 0.146495 -0.00183305 +-0.0758664 0.116415 -0.00636144 +-0.0824071 0.136209 -0.001703 +-0.0519598 0.0335208 -0.000101812 +-0.0819554 0.0993316 0.0315904 +0.0213579 0.055075 -0.0266156 +-0.0422106 0.112435 -0.0169649 +0.0150002 0.128745 0.00378903 +-0.0430993 0.157658 -0.00954173 +-0.0816795 0.117485 0.0486704 +-0.00999143 0.0383941 0.00762464 +0.0248936 0.12332 0.00461274 +-0.0644877 0.0972949 0.0424471 +-0.032514 0.105674 0.0400124 +-0.0517751 0.0826668 -0.0215624 +0.00214252 0.103065 -0.0221511 +-0.0609083 0.169363 -0.0596932 +0.0270498 0.0919981 -0.0213752 +0.00735643 0.038818 0.0454516 +0.0115845 0.121127 -0.0125402 +0.0591992 0.0552614 0.014176 +-0.0901723 0.112303 0.0149799 +-0.0627834 0.035148 0.0195098 +-0.074757 0.111898 0.0475989 +0.0570719 0.0578424 0.00217676 +-0.0528487 0.0500508 0.0126245 +-0.00477608 0.0784365 -0.0374195 +-0.0645432 0.0673992 0.033354 +-0.0540085 0.145723 -0.00127177 +-0.010995 0.0388834 0.0322933 +0.00247314 0.0964836 0.053027 +-0.0624566 0.177245 -0.0586155 +0.0368789 0.0941727 0.035906 +-0.0219544 0.120804 -0.00985027 +0.0570851 0.0508934 0.0101876 +0.0102738 0.0724526 -0.032232 +0.0544954 0.0655564 0.000403771 +0.0210681 0.0415437 -0.0156999 +-0.0692317 0.155651 0.00154206 +0.0527009 0.0518645 -0.000768796 +0.0334294 0.116181 0.00636312 +0.0448957 0.0945828 0.0101613 +0.00249575 0.0952068 0.0540463 +-0.0124032 0.0388598 -0.00801871 +0.045282 0.0889737 0.0021781 +-0.00350234 0.0388725 -0.0137373 +-0.0678317 0.0335757 0.00383638 +0.00921578 0.0767579 -0.0331902 +-0.0534996 0.0987387 0.0427565 +-0.0124888 0.126191 0.0283067 +0.0103285 0.130654 0.00635323 +0.0314005 0.0446447 -0.00577901 +-0.0295471 0.0804664 0.0436378 +0.00584239 0.0374362 -0.00493399 +0.0435663 0.0408867 0.018056 +-0.0206234 0.0950485 -0.0308006 +-0.0216102 0.0408331 -0.028871 +-0.0256808 0.0663835 0.041558 +0.0103698 0.0351865 0.034574 +0.0249548 0.0809223 0.0484627 +-0.0551501 0.0641879 0.0328568 +-0.0633147 0.132484 0.0400888 +-0.062948 0.163113 -0.0275941 +-0.0620302 0.141028 0.0366839 +-0.0484797 0.126826 0.0298997 +0.00950548 0.107102 0.041296 +0.0390056 0.0914413 0.0336848 +0.0300323 0.108764 0.0348296 +-0.0198832 0.0335337 -0.0251748 +0.0128315 0.0391361 0.0445812 +-0.0263531 0.11244 -0.0170322 +0.0359611 0.109622 -0.00183337 +-0.0572001 0.0380562 0.0469117 +0.00550248 0.121034 0.0357708 +-0.0667821 0.14845 -0.031825 +-0.016957 0.186039 -0.0193264 +-0.0878947 0.131105 0.044958 +0.0363312 0.107346 0.0280412 +-0.0614985 0.0833224 0.0439406 +0.0542552 0.0478973 0.00920996 +-0.0787615 0.0867217 -0.0105634 +0.0226207 0.0360088 0.0127544 +0.00886878 0.0343168 0.00225753 +-0.0266191 0.0618553 -0.0304537 +-0.00302574 0.0387303 0.00142158 +-0.019905 0.038668 0.0324503 +0.0527798 0.0683653 0.00150186 +0.021964 0.0402022 -0.00870612 +-0.0126432 0.0481635 -0.0303259 +-0.0124951 0.0925417 0.056096 +-0.0373842 0.0433946 0.0425967 +0.0243858 0.124139 0.00725423 +-0.0540808 0.0434992 0.0186914 +-0.0590026 0.0609591 0.0242669 +-0.0846496 0.129332 -0.00265191 +0.0108129 0.0887938 0.0544498 +-0.0599027 0.106882 -0.0174092 +0.0235199 0.123889 0.00267512 +-0.0364958 0.116629 0.0319219 +-0.0274016 0.0386836 -0.0145853 +0.0575354 0.0620414 0.00218896 +-0.0617076 0.156842 -0.0315932 +-0.0566848 0.0344893 0.0422998 +-0.0515556 0.0459336 -0.00836292 +0.034036 0.037677 0.020853 +0.0440634 0.064827 -0.000963389 +-0.0783551 0.090033 0.0367591 +-0.0451437 0.162134 -0.00879907 +-0.0870992 0.0913786 0.00345195 +-0.0896332 0.0983435 0.0144056 +0.00267954 0.131212 0.00494959 +-0.0521038 0.0531706 0.024633 +0.033292 0.0856433 -0.0187503 +-0.0284873 0.0606333 -0.0264114 +-0.0366237 0.123115 -0.00817194 +-0.0417568 0.0797359 -0.0197866 +-0.0466787 0.0650533 -0.0138917 +0.0360448 0.0392022 -6.35907e-05 +-0.0192403 0.0387115 -0.0129795 +0.0431391 0.098698 0.00317491 +-0.0224767 0.091498 -0.0352097 +0.0093588 0.0524416 -0.0295377 +-0.0833358 0.105954 0.0271122 +-0.0146006 0.127548 0.000963555 +0.0122907 0.0652688 -0.0305463 +-0.0515682 0.0488001 -0.00762593 +0.0214986 0.122612 0.0290301 +-0.0271235 0.11599 -0.0147668 +0.0381316 0.109734 0.0151646 +-0.00681664 0.0854791 -0.0376549 +-0.0147515 0.07145 -0.0385454 +-0.0659657 0.129697 -0.00887578 +0.0359834 0.11203 0.00292702 +-0.0631298 0.144906 -0.0101196 +0.00903132 0.0343268 -0.014573 +-0.0348704 0.101474 -0.022105 +-0.0693077 0.0614952 0.0145437 +0.0349262 0.0896582 -0.0169179 +-0.037886 0.109925 -0.0191545 +-0.0372775 0.0472266 -0.0193178 +0.0112393 0.0349033 0.0350041 +0.0430009 0.0705508 -0.00279727 +0.0400623 0.0956447 -0.00679711 +-0.0676126 0.155322 0.00651001 +0.0598737 0.0581052 0.00916393 +-0.061495 0.100138 0.0425963 +-0.0575075 0.0435504 0.0160321 +0.0228298 0.0827896 -0.0258286 +-0.0115004 0.0925527 0.0561224 +-0.0223058 0.184466 -0.0180708 +-0.0624348 0.161527 -0.0435948 +-0.0143997 0.0383922 -0.000568703 +-0.0793362 0.0881239 -0.0095476 +-0.0548971 0.10981 -0.018029 +-0.0707512 0.156365 0.0199172 +0.0244407 0.0405616 0.0372831 +-0.0545055 0.113958 0.0351234 +-0.00749363 0.0547355 0.05304 +0.044284 0.0819099 0.0251484 +0.0117499 0.0519912 0.0501875 +-0.0706809 0.109318 0.0378585 +-0.0640006 0.161566 -0.01976 +-0.0122192 0.0378665 0.050479 +-0.0715061 0.148353 0.0408514 +-0.0652549 0.0667307 0.0320259 +0.0162842 0.118981 -0.0122323 +-0.0584978 0.0959813 0.0440843 +-0.0261553 0.169713 -0.0187023 +0.0163086 0.108997 -0.0174538 +0.019812 0.035154 0.0274956 +0.0403843 0.0547484 -0.00641578 +-0.0370524 0.128064 0.00917633 +-0.0181528 0.0388364 -0.0128782 +-0.0703699 0.144073 -0.0154773 +-0.0821317 0.15265 0.0057634 +-0.0121975 0.182647 -0.0286755 +-0.0179487 0.126229 0.0234428 +-0.0713342 0.065071 0.0216423 +-0.0135059 0.0357879 0.0504712 +-0.0551243 0.0482803 0.0389113 +-0.043841 0.0970933 -0.0219235 +0.0307935 0.0619124 0.0409121 +-0.0872404 0.149912 0.0282765 +-0.0777833 0.0694772 0.0182331 +-0.0479563 0.0699321 0.0400053 +-0.0325179 0.0704032 0.0404934 +-0.04199 0.0336868 -0.0166047 +0.00497409 0.0340864 0.0145521 +-0.0449304 0.0643377 0.0396087 +-0.0778694 0.106226 -0.00738941 +-0.0126221 0.0389953 0.033657 +-0.0632121 0.172304 -0.0615699 +-0.0276205 0.0874255 -0.0346253 +-0.0625254 0.138119 0.0359126 +0.00425284 0.0711834 -0.0342035 +-0.0788838 0.153282 0.0303949 +0.00652169 0.0362747 0.0255863 +-0.0662316 0.0345008 0.0140489 +-0.02106 0.174206 -0.0148174 +0.0185004 0.109841 0.0391791 +-0.0646081 0.0450546 0.000685835 +-0.0136021 0.0363077 -0.0261392 +-9.29522e-05 0.131467 0.0096514 +-0.0451771 0.128971 0.00184527 +0.00750493 0.0561002 0.0528313 +0.0361319 0.074097 0.0381795 +0.022807 0.125614 0.0138049 +-0.0196774 0.0509888 -0.0303435 +-0.0930693 0.120128 0.0262942 +-0.0230193 0.120798 -0.0098328 +-0.0271496 0.0384219 0.0311819 +-0.0748224 0.0935599 -0.014192 +-0.0354943 0.119369 0.0303337 +0.060906 0.0609648 0.0111554 +0.0112135 0.130703 0.0137986 +-0.0266186 0.0589226 0.0382515 +0.0218458 0.0672628 0.0473581 +0.00922858 0.116392 0.0380826 +-0.0579872 0.0576809 0.00662705 +-0.0151861 0.168246 -0.0215615 +0.0431809 0.0791159 0.0272636 +-0.0755673 0.0727762 -0.00660131 +0.0242315 0.0818412 -0.0251267 +-0.0250124 0.0782139 0.0518051 +-0.0338224 0.0338142 0.00692539 +-0.00946746 0.0362215 -0.025425 +-0.0416936 0.0652006 -0.0145392 +-0.0546754 0.0335075 0.00116676 +-0.0233106 0.15969 -0.00223977 +-0.0842752 0.141807 0.00320102 +-0.0818378 0.131303 0.0516681 +-0.0234556 0.161598 -0.0145283 +-0.0499699 0.150693 0.011804 +-0.010495 0.0471724 0.0477907 +0.0380379 0.075373 0.0356471 +-0.0450739 0.0363473 0.0448052 +-0.0737333 0.15548 -0.0259091 +-0.0716137 0.178389 -0.0484 +-0.0384987 0.0691035 0.0417776 +0.00141943 0.122927 0.0347542 +-0.057332 0.137224 -0.00518105 +-0.0557698 0.136063 -0.00393718 +0.0558337 0.0494217 0.00919997 +-0.0580135 0.04944 0.00163802 +-0.0357372 0.111668 -0.0181975 +-0.0550044 0.145721 -0.00143834 +0.00110225 0.0344701 0.00796988 +-0.0157589 0.038402 0.00281447 +-0.0521458 0.121812 -0.0107191 +-0.00850406 0.11834 0.0382239 +-0.0498654 0.102788 -0.0210486 +-0.0630574 0.15313 -0.033029 +-0.0734528 0.143001 -0.00787011 +-0.0577717 0.0334512 -0.00484461 +-0.0926703 0.124234 0.0402542 +-0.0236253 0.0450591 -0.0281331 +0.0444641 0.0686626 0.00115575 +-0.0394989 0.0620307 0.0413298 +-0.0489043 0.0531988 0.0353928 +-0.0549375 0.140991 0.0293007 +0.0134789 0.100443 0.0476777 +0.0344381 0.102088 0.0341795 +-0.0629237 0.112473 -0.0138486 +0.0456048 0.0918125 0.0071715 +-0.0679688 0.135528 -0.00836676 +-0.0561131 0.145329 0.0311927 +0.0222077 0.0403059 0.0403109 +-0.0930104 0.131018 0.0202297 +-0.073597 0.161047 -0.0349306 +-0.073142 0.0762988 0.0362199 +-0.0868887 0.102318 0.0233696 +-0.074876 0.107788 -0.00905848 +-0.061968 0.159998 -0.0366167 +0.0234524 0.0505688 0.0407158 +-0.0374809 0.113893 0.0340704 +-0.052457 0.144675 0.0183665 +0.000496502 0.103028 0.0440499 +-0.0107515 0.039289 0.0373765 +0.0177346 0.123618 -0.0052308 +-0.0278908 0.0903405 -0.0316075 +0.0555538 0.0665692 0.0013688 +-0.0679616 0.181138 -0.0572245 +-0.0246921 0.156571 -0.00408158 +-0.0295045 0.112518 0.0356692 +-0.0523224 0.146252 0.0184018 +-0.0831779 0.111548 0.00129095 +0.0381693 0.109765 0.0141664 +-0.0465876 0.132486 0.00741919 +0.0351546 0.112861 0.0227039 +0.00752051 0.0855871 0.0562726 +-0.0236256 0.0464233 -0.0274769 +-0.0820555 0.138062 0.0474469 +-0.0332203 0.171246 -0.00251328 +-0.0471051 0.157621 -0.00763511 +-0.0883909 0.0874867 0.0154625 +-0.0769362 0.0914256 0.0381174 +-0.075265 0.148568 -0.0158698 +0.015355 0.119233 -0.0124997 +-0.0073165 0.13056 0.0112981 +-0.0167502 0.070002 -0.0383082 +-0.0672167 0.147775 -0.0296135 +0.00424945 0.126892 0.0299609 +0.0188897 0.120837 -0.00821554 +-0.0628446 0.0334683 -0.00588606 +0.0333858 0.103442 0.0343819 +-0.0748011 0.0878022 -0.0147955 +0.00250445 0.0519435 0.0530423 +-0.0565994 0.0548437 -0.000400453 +-0.0657591 0.0794867 -0.0178324 +-0.0893947 0.113204 0.00833335 +0.00550466 0.122397 0.0349805 +-0.0593516 0.0471429 0.038917 +-0.0691412 0.109612 0.0381472 +0.012166 0.127075 0.0284779 +0.00215147 0.0340847 -0.0194818 +-0.0357383 0.152143 0.000762654 +-0.0225608 0.0608496 0.0442445 +-0.00675345 0.0727271 -0.0364938 +-0.0504985 0.0776737 0.0437561 +0.012653 0.128571 8.59956e-05 +-0.0775017 0.148428 0.039927 +0.0194833 0.0961991 0.0471957 +-0.00134544 0.0999407 0.0490888 +-0.00745251 0.100521 0.0469096 +0.0293349 0.108769 0.0355782 +-0.0628076 0.0881622 -0.0190458 +0.0438908 0.0973298 0.0041758 +-0.0618594 0.154827 0.00385225 +0.0224603 0.0878572 0.0487762 +-0.0684419 0.0805248 0.0412962 +-0.0414824 0.0817867 0.0423837 +-0.0394972 0.0591632 0.0405173 +-0.0699138 0.0616664 0.0106715 +-0.0256486 0.050648 -0.0266189 +-0.0189668 0.125144 0.0245507 +-0.0548939 0.161294 0.00305835 +0.0593671 0.0566851 0.00917266 +-0.0619624 0.0371632 0.0192279 +-0.0458599 0.129594 0.0221735 +-0.078334 0.175787 -0.0461739 +-0.00822607 0.100046 0.0481626 +-0.0580744 0.136937 -0.00566118 +-0.0915979 0.115467 0.0229868 +0.0255167 0.123738 0.0133816 +-0.0331932 0.0348891 0.047012 +-0.076964 0.129602 -0.00711544 +-0.0598599 0.0358888 0.0454954 +0.0450831 0.0463904 0.0280485 +-0.0315243 0.0802674 0.0412906 +-0.0239631 0.11903 -0.0119726 +-0.0346068 0.0483825 -0.0183276 +-0.0825971 0.103328 -0.00360734 +-0.0887132 0.118572 0.00232339 +-0.0188128 0.082729 -0.0390748 +-0.0866936 0.0833424 0.0154842 +0.00371617 0.0348648 0.0208524 +0.0267042 0.122545 0.0181085 +-0.0738109 0.0935956 -0.0146814 +0.0287557 0.0348074 0.0132587 +-0.0344434 0.174206 -0.0015497 +-0.053794 0.086942 -0.0216962 +-0.0584166 0.126929 0.0401124 +-0.0837712 0.127162 0.0508887 +-0.0249431 0.0907384 -0.0344432 +-0.0817429 0.0748341 0.0165378 +-0.0709721 0.148372 0.0407622 +0.0453179 0.0861686 0.00320477 +-0.052904 0.159748 -0.00276649 +-0.0630387 0.15529 -0.0125891 +-0.0628558 0.170957 -0.0505963 +0.0198342 0.0408002 0.0424386 +0.0114164 0.0403794 -0.0231815 +-0.0270194 0.12568 0.0143315 +-0.0340325 0.126267 0.001455 +-0.0096483 0.171546 -0.0270746 +0.0461889 0.0792428 0.016179 +-0.0314795 0.0774889 0.0410863 +0.00441886 0.0361314 -0.0238164 +0.0140504 0.0379362 -0.0217239 +-0.0064667 0.128955 -0.000718006 +-0.00729042 0.0388645 0.0312728 +-0.0537922 0.14151 -0.001138 +-0.0843649 0.125772 0.0501053 +-0.0489003 0.033496 0.00596365 +-0.00972794 0.166651 -0.0186764 +-0.0537672 0.0812389 -0.0213883 +-0.0327797 0.0337757 0.0180041 +-0.0738907 0.107101 0.0373066 +0.0441357 0.0659575 -7.19207e-05 +-0.0929503 0.128215 0.0122521 +-0.0898716 0.133794 0.0302191 +-0.0643705 0.154697 0.0294695 +0.023375 0.0504685 -0.0225374 +-0.052801 0.0690675 0.0379843 +-0.0823518 0.0966615 0.0320686 +0.00650836 0.0813916 0.0558754 +0.0249135 0.0390596 0.0323329 +0.0422621 0.0746939 -0.00581448 +-0.0239734 0.0636045 0.0427616 +-0.0648684 0.0967433 -0.0176098 +-0.0661842 0.163921 -0.0584969 +-0.0338218 0.0886934 -0.0246941 +-0.0545067 0.102902 0.0418134 +-0.0298032 0.034287 0.0163531 +0.00993007 0.126906 -0.00476687 +-0.0376745 0.0379475 0.0444361 +-0.0658844 0.114191 0.045149 +0.0205436 0.121905 -0.00538746 +-0.0134808 0.108609 0.0426611 +-0.0484883 0.0960313 0.0444485 +-0.0326323 0.125019 -0.000941466 +-0.0254216 0.0999543 -0.0239282 +-0.0410688 0.11258 -0.017122 +-0.0434945 0.0676224 0.0409141 +0.0153651 0.0493118 -0.0259325 +0.00422707 0.0782528 -0.0345112 +0.0285181 0.0968051 -0.0184722 +-0.0597676 0.0796261 -0.0193897 +-0.0714963 0.118989 0.0533881 +-0.0566004 0.0335105 0.0169198 +-0.0880799 0.113511 0.0432934 +-0.0208348 0.0956185 -0.0294009 +-0.010501 0.0759377 0.0571751 +-0.0797391 0.110092 0.0425713 +0.0423965 0.0704871 -0.00480867 +-0.071352 0.110742 0.0439553 +-0.0617103 0.0604885 0.000571471 +-0.000492298 0.0605899 0.0560413 +-0.0819087 0.121685 0.0492514 +0.0133657 0.116504 -0.0155461 +-0.0035043 0.0589584 0.0540181 +-0.0700245 0.0833021 0.0413654 +0.0410401 0.0656705 0.029359 +-0.0623583 0.164673 -0.0485921 +0.027252 0.0549488 0.0409918 +-0.0568093 0.0883611 -0.0215879 +0.0409151 0.0390283 0.00994476 +0.0189976 0.0408013 0.0429893 +0.038497 0.0527286 0.031838 +-0.0436566 0.0592613 -0.0123074 +-0.0456035 0.0504974 -0.010193 +-0.0427107 0.0335694 -0.0203532 +-0.0107484 0.0348144 0.0431359 +0.0366972 0.106807 -0.00382741 +-0.0475 0.109814 0.0383224 +-0.0581584 0.0685383 0.037238 +-0.0888985 0.128369 0.0446279 +-0.0618211 0.164489 -0.0586698 +-0.0622151 0.166391 -0.0605094 +0.000668194 0.039196 0.03081 +-0.0494963 0.0974185 0.0440407 +-0.0327214 0.154341 -0.00788327 +0.00831584 0.0624371 -0.0312473 +-0.0441024 0.124581 0.0229348 +-0.00474585 0.0712867 -0.0359934 +-0.0211964 0.0725528 0.0524066 +0.0440002 0.0888695 -0.00280666 +0.0083541 0.0524293 -0.0297113 +0.0104364 0.0472441 0.0475563 +0.0130443 0.113867 -0.0167218 +0.035717 0.0533288 0.0320909 +-0.0439793 0.169659 0.00035763 +-0.0261771 0.0395393 0.0541115 +0.0142627 0.0751304 -0.0300927 +0.0172008 0.0849074 -0.0286671 +-0.0301348 0.156065 -0.00950629 +0.0153602 0.0672491 0.0520407 +0.038354 0.0547461 -0.00609927 +0.0326073 0.112448 0.0288842 +-0.0230436 0.0879523 0.0537722 +-0.0507107 0.0708743 -0.0151986 +0.00170937 0.0361659 0.0210822 +-0.0106905 0.18126 -0.0286694 +-0.0543257 0.121248 0.0372193 +-0.086895 0.143263 0.0379805 +-0.0300853 0.179019 -0.00589649 +-0.0624495 0.15591 0.022857 +-0.0597659 0.0448149 0.0126042 +0.00226448 0.0346925 0.0189009 +0.00270214 0.10527 -0.0214784 +-0.0843731 0.110309 0.0377873 +-0.0603328 0.153535 0.00105643 +-0.00601124 0.0348376 0.0423067 +-0.0419337 0.160883 0.00416203 +0.025639 0.0740461 0.0458389 +-0.0724467 0.0361675 0.00255211 +-0.0515329 0.0431219 -0.00982617 +-0.0668209 0.036036 0.0339126 +0.0328708 0.0740673 0.0404957 +0.0429413 0.0682748 0.0268013 +-0.0687158 0.171626 -0.0372714 +0.0231488 0.116662 0.0336476 +0.0322304 0.0505255 0.0340589 +-0.0869233 0.112018 0.0232463 +-0.078057 0.0907599 -0.0115869 +-0.0538087 0.119788 0.0361741 +0.00650273 0.121045 0.0359095 +-0.00425882 0.128035 0.0283342 +-0.0558184 0.158024 -0.000144968 +-0.0699106 0.10657 -0.0124287 +0.0101685 0.124401 -0.00806495 +-0.0774125 0.06897 0.0169693 +-0.0204069 0.09844 -0.0243451 +-0.0678094 0.180556 -0.0587896 +-0.0490427 0.0341369 0.0285626 +-0.0112286 0.0338605 -0.0218986 +0.0300773 0.0754873 0.0435133 +0.00030024 0.0612559 -0.033673 +0.000950727 0.129943 0.000110463 +-0.083524 0.154076 0.0213615 +-0.0688604 0.0819375 0.0416515 +-0.0674926 0.0889102 0.043735 +-0.000658033 0.0525337 -0.0307361 +-0.0805064 0.103384 0.0314383 +-0.0596514 0.142474 0.0348633 +-0.00849673 0.105867 0.0437425 +-0.0317522 0.0735748 -0.0285005 +0.0171692 0.0345228 -0.00186568 +-0.0229141 0.111944 -0.0185359 +-0.00375332 0.07411 -0.0361467 +-0.00849121 0.103027 0.0437022 +-0.0323725 0.16532 -0.00484492 +0.0250885 0.119458 -0.00473925 +0.00228893 0.0341509 0.0103163 +0.03989 0.0630598 0.0312004 +-0.0146968 0.175692 -0.019662 +-0.00218576 0.0355897 -0.0160761 +0.0318792 0.0686784 0.0407831 +-0.0783091 0.16249 -0.0249404 +-0.0807007 0.0752735 0.0231846 +-0.00686818 0.0385321 0.0081342 +-0.0114932 0.036278 -0.0256312 +-0.076524 0.178854 -0.050295 +-0.093475 0.1283 0.0242551 +-0.063929 0.0354009 0.0416662 +-0.064733 0.15377 0.0322824 +0.0293628 0.105677 -0.0139766 +-0.0544684 0.119419 -0.0121872 +-0.0878486 0.143233 0.0360974 +-0.0866257 0.081991 0.0115028 +0.0324736 0.0490215 0.0326282 +-0.0472578 0.121113 0.0280085 +0.0275416 0.0349624 0.00541796 +-0.0827616 0.091206 0.0312465 +-0.0627318 0.159944 -0.0435973 +0.0444941 0.0637658 0.0284543 +0.0512305 0.0723962 0.00737259 +-0.0374845 0.100078 0.0419234 +0.00446502 0.0977292 0.050995 +-0.090055 0.132436 0.0352224 +-0.0771832 0.107237 0.0346968 +0.0132863 0.0695708 -0.0313558 +-0.0833513 0.099287 0.0301656 +-0.050588 0.0599426 0.0326193 +-0.0116999 0.0599414 -0.0352829 +-0.0629554 0.156782 -0.0386059 +0.0452979 0.0875774 0.0181674 +0.0367705 0.074074 0.0373409 +-0.0378297 0.12794 0.00447467 +0.000472166 0.0388678 0.0256446 +0.00293826 0.0356401 -0.0151121 +0.0194959 0.11257 0.0373879 +0.0178674 0.103889 -0.0200126 +-0.0197782 0.075693 -0.0390468 +-0.0162539 0.171251 -0.016682 +-0.0719027 0.156807 -0.0389123 +-0.0816716 0.0734987 0.0125379 +0.00248698 0.0399628 0.0461692 +-0.0118767 0.105907 -0.0227385 +-0.0633264 0.159631 -0.0180726 +-0.0147126 0.0384481 0.00298688 +-0.0598094 0.0896854 -0.0200419 +-0.0586861 0.0603162 0.0231261 +-0.0518133 0.0531756 0.0296409 +-0.0201151 0.123178 -0.00639815 +-0.0197736 0.0998405 0.0442778 +-0.00649912 0.118331 0.038456 +-0.0868133 0.0846987 0.0154763 +-0.0052065 0.0389581 0.0316148 +-0.0886495 0.113065 0.0417436 +0.0045077 0.107168 0.0418669 +-0.0635616 0.174109 -0.0525858 +-0.0657828 0.082373 -0.0185031 +0.00281465 0.0379685 -0.0135285 +-0.0863919 0.099468 0.00241821 +0.0544797 0.0539552 0.0258897 +-0.0865727 0.08823 0.0252282 +-0.0778042 0.156927 -0.0169128 +-0.00349196 0.114194 0.0413026 +-0.0523232 0.13528 0.029621 +0.0359531 0.0673443 0.0378699 +0.0103588 0.130588 0.0191927 +0.0383356 0.10264 -0.0058258 +-0.0906686 0.139207 0.0161786 +-0.0534974 0.0876167 0.045276 +-0.0609918 0.138116 0.0346365 +-0.010493 0.114167 0.0405696 +-0.0260866 0.0349169 0.0485155 +-0.0519529 0.0531525 0.0236322 +-0.0670544 0.153567 -0.0495044 +-0.000486159 0.0689333 0.056515 +-0.034827 0.0929417 -0.0239227 +0.0157074 0.0821031 0.0526782 +-0.0185046 0.116829 0.0366774 +-0.0357116 0.0358916 0.0155029 +-0.0711005 0.148774 -0.0369587 +-0.0146296 0.185817 -0.0244743 +-0.0871678 0.11039 0.0183619 +-0.0897192 0.129664 0.0425949 +-0.0278047 0.074956 0.0433932 +-0.0408028 0.033851 -0.0276993 +-0.0260362 0.165356 -0.00798775 +-0.022832 0.0348259 0.0458328 +-0.0327846 0.0346162 0.0403814 +0.0292084 0.0350186 0.0149853 +-0.0908558 0.14471 0.0151666 +-0.0389013 0.0336802 -0.0215651 +-0.00950572 0.0590791 0.0548422 +-0.0252687 0.0931263 -0.0308668 +0.00727173 0.0667978 -0.0321541 +-0.0478216 0.109884 -0.018362 +0.00164525 0.0348132 0.00406568 +0.0377191 0.0632143 0.0350986 +-0.0468821 0.108426 -0.0186436 +0.0252001 0.0818001 -0.0245703 +0.00238035 0.127411 0.0292755 +0.0255053 0.103245 -0.0173339 +0.011492 0.0445292 0.0444785 +0.0458991 0.0414061 0.011234 +-0.0302302 0.0537755 -0.0183734 +-0.0870355 0.111737 0.0342553 +0.0298569 0.0835122 0.0432289 +0.0344154 0.0409101 0.0271225 +0.00697892 0.131225 0.0065571 +0.0443985 0.0748779 -0.000803542 +-0.0703751 0.112557 0.0480687 +0.0398576 0.101362 0.0261824 +-0.0146217 0.0450296 -0.0279689 +0.0305372 0.0592022 0.0405121 +-0.0427308 0.169809 0.000879537 +-0.00260639 0.0419888 -0.0252454 +0.000821596 0.0412233 0.0465397 +0.0447686 0.0889311 -0.000811854 +-0.00992934 0.166943 -0.0180552 +-0.0743075 0.170773 -0.046055 +-0.0564797 0.0356812 -0.0108166 +0.0302902 0.078207 0.0438447 +-0.0601407 0.0410386 0.0173224 +-0.0404944 0.0478337 -0.0126145 +-0.00989846 0.0384846 0.0238656 +-0.0338875 0.0780022 -0.0265044 +-0.0309197 0.0805646 -0.0325792 +-0.0788495 0.1177 0.0505094 +0.00204515 0.0345955 -0.0162029 +-0.0115453 0.0445033 0.0495732 +-0.048476 0.116631 0.0320328 +-0.0121876 0.113225 -0.0179296 +-0.0193167 0.0754023 0.0546877 +-0.0653246 0.0648097 0.0284194 +-0.0417336 0.0739469 -0.0182277 +0.0129121 0.0806948 0.0538726 +-0.087913 0.0900756 0.00446758 +-0.0459794 0.167363 0.00259136 +-0.00407632 0.124795 0.032822 +0.00214512 0.131665 0.0104804 +-0.0242177 0.0387671 0.0542484 +-0.0864391 0.131188 0.0477462 +0.0208043 0.12624 0.020186 +-0.0682771 0.163789 -0.0539724 +-0.0225729 0.172715 -0.0135004 +-0.0434823 0.12913 0.00531313 +-0.0465355 0.0790498 0.0431447 +0.0415243 0.0623608 0.0290336 +0.0206713 0.0868458 -0.0260413 +-0.0616015 0.0614498 -0.00273471 +-0.0698033 0.087974 -0.016854 +0.00908719 0.0358267 -0.00842564 +-0.0333922 0.068118 -0.0184774 +-0.0820819 0.150001 0.0344048 +0.0348029 0.113058 0.00110003 +-0.00477205 0.0345951 0.0445699 +-0.0740526 0.172196 -0.0480444 +-0.0192069 0.125855 0.0229991 +-0.0404977 0.0520197 0.0394004 +-0.0367886 0.156481 -0.0105439 +-0.0531367 0.0490718 0.026657 +0.015473 0.0962531 0.0481291 +-0.0492612 0.115146 -0.0157671 +0.0536465 0.0728799 0.00890065 +-0.0263571 0.0549776 0.0383278 +0.0333229 0.0997779 -0.013667 +-0.0551968 0.138069 -0.00309725 +-0.0563111 0.122698 0.0396267 +-0.02088 0.107273 -0.0222055 +0.000924532 0.100829 -0.0227814 +-0.0907853 0.117276 0.00630342 +-0.0134985 0.11551 0.0389419 +-0.0921826 0.114725 0.0193089 +-0.0218136 0.116051 -0.0148581 +-0.0915139 0.140599 0.0171878 +-0.0723659 0.100858 0.0389128 +-0.0227439 0.0669905 -0.0360641 +0.0133914 0.0448806 -0.0247967 +-0.0334245 0.0346344 0.0419763 +-0.083931 0.103265 0.0277985 +-0.0172469 0.116672 -0.0155678 +0.0141307 0.108667 -0.0183815 +-0.0676215 0.0688155 -0.00772966 +-0.049646 0.138599 0.0173958 +-0.0836562 0.0966099 0.0305537 +-0.0662913 0.165749 -0.0234747 +0.0434836 0.0734019 -0.00279222 +-0.0672802 0.0405919 -0.00423161 +-0.0468922 0.0334761 -0.010008 +-0.00688399 0.107372 -0.022762 +-0.0471129 0.13404 0.0104021 +-0.0613177 0.0470312 0.00669678 +-0.0857102 0.0912822 0.000468321 +-0.0564836 0.0589584 -0.00242578 +-0.0544716 0.0607811 0.0269495 +0.0392359 0.0685928 0.0338195 +-0.0907738 0.125596 0.0437739 +-0.0123469 0.0383491 0.0216787 +-0.00750765 0.123161 -0.01054 +0.0441233 0.0959295 0.00318315 +0.0262791 0.0675449 -0.0231801 +-0.0432671 0.0465873 -0.0113888 +0.00633058 0.0567988 -0.0308016 +-0.0135852 0.123715 -0.00700086 +-0.00140945 0.12836 0.0278943 +-0.0283882 0.0380697 -0.0179434 +0.0478387 0.0734572 0.0126134 +0.0038745 0.0367677 -0.0140867 +-0.05057 0.0335281 0.00739754 +0.036728 0.111857 0.010401 +-0.00844614 0.128164 -0.00189615 +-0.0247501 0.0578943 0.0408638 +-0.0467618 0.0657183 0.0385512 +0.038544 0.0726461 0.034619 +-0.00748755 0.111393 0.0423782 +-0.0658988 0.116581 -0.00961273 +-0.0415297 0.118854 -0.0137293 +-0.062219 0.164671 -0.0505894 +-0.00870995 0.128748 0.0252759 +-0.0315128 0.115295 0.0334421 +0.0503991 0.0466746 0.0233055 +-0.0753594 0.113961 -0.00568407 +-0.0866603 0.10494 0.00737931 +-0.0457163 0.0345386 0.0341935 +-0.0466235 0.0548092 -0.0105711 +-0.0516722 0.0693248 0.037985 +-0.0826957 0.0898386 0.0312187 +-0.0154881 0.0758696 0.0561745 +-0.0518084 0.0913012 -0.0220555 +-0.0751346 0.145812 -0.00886348 +-0.0732189 0.155097 0.0278276 +-0.0127272 0.0348945 -0.0256797 +-0.0698308 0.071946 0.0353261 +-0.0657288 0.163321 -0.0189522 +-0.0464914 0.08757 0.0446532 +0.0296359 0.112746 0.0324848 +0.0275411 0.044881 0.0360262 +-0.0187772 0.186086 -0.0166294 +-0.0884282 0.0874635 0.00747939 +0.0325508 0.115423 -0.000329209 +-0.0410423 0.0336551 0.000178151 +-0.0638018 0.0632948 0.0265284 +-0.0224569 0.0524128 0.0435307 +0.057327 0.0700157 0.00587175 +0.0345611 0.0740948 0.0394254 +-0.0409173 0.0351021 0.0417247 +-0.0742127 0.154103 -0.0229066 +-0.0824094 0.151775 0.0307901 +-0.0803828 0.11899 0.049226 +-0.010458 0.0953808 -0.0330949 +-0.0630414 0.149018 -0.0195802 +-0.0293211 0.123712 0.0208659 +-0.0231795 0.0622145 0.0434152 +-0.0287301 0.172704 -0.00834509 +0.00364827 0.128043 -0.00393793 +-0.0642706 0.166732 -0.060237 +-0.0108397 0.175678 -0.0290324 +0.0244048 0.112688 0.0354614 +-0.047561 0.0361661 -0.0123414 +-0.0534987 0.0427392 0.045857 +-0.0231257 0.165273 -0.0171671 +0.0388181 0.104067 -0.00210374 +-0.0356652 0.156121 -0.0104266 +-0.072524 0.106883 0.0374001 +-0.0331471 0.172636 -0.0149853 +0.040265 0.0391745 0.017119 +-0.0342456 0.0708723 -0.0195447 +-0.0687416 0.11428 0.0497375 +-0.0559525 0.0473442 0.0115659 +-0.0244817 0.107102 0.0411704 +-0.00571075 0.0627939 -0.0354611 +0.00805559 0.124767 0.0327601 +-0.0144892 0.0800879 0.0568709 +-0.0444848 0.0775765 0.0423436 +-0.063261 0.129725 0.0418859 +0.0349031 0.111324 -0.00180439 +0.00654043 0.0954774 -0.0291051 +-0.0290961 0.0410008 0.0527549 +-0.0234218 0.0738847 0.0503501 +-0.0567453 0.0342237 0.02862 +0.0376516 0.0425419 0.0281451 +0.0336732 0.115326 0.0207292 +-0.0174938 0.122238 0.0311921 +-0.073145 0.152886 0.0338966 +0.0392908 0.0660103 -0.00977956 +-0.0671096 0.125666 0.0504247 +-0.0815589 0.10988 0.0387619 +-0.00472043 0.0655745 -0.0349603 +-0.0584923 0.0818911 0.043717 +0.0395145 0.0415874 0.025748 +-0.0134628 0.0989564 0.047529 +-0.086226 0.143316 0.0387173 +-0.0675131 0.145595 0.0418048 +-0.0142233 0.174199 -0.0261217 +-0.0564238 0.0718073 0.0399857 +-0.0748487 0.0664559 0.00653551 +0.0254329 0.0835701 0.0474102 +-0.0735012 0.145587 0.0437725 +-0.0684894 0.104161 0.0391613 +0.046334 0.0533506 -0.00578803 +0.0111342 0.034487 -0.019828 +-0.0362745 0.033679 0.00474125 +-0.0580289 0.129633 -0.0066561 +-0.0674348 0.171149 -0.0382253 +0.0172278 0.0353072 0.0394845 +0.0290523 0.120756 0.00899975 +-0.0788357 0.148682 -0.00186858 +-0.0257486 0.0365571 0.0540093 +-0.076603 0.120411 0.0526033 +-0.0107827 0.0784509 -0.0379132 +-0.0283013 0.0648191 -0.0294785 +-0.0318386 0.0929851 -0.0242124 +-0.0504991 0.156412 0.0101915 +0.0435836 0.0722927 0.0259867 +0.0187342 0.112585 -0.0153321 +-0.0434831 0.0762058 0.0427502 +-0.00415334 0.0367895 0.0481682 +-0.0469304 0.116649 -0.0154073 +-0.0434764 0.0335212 0.0034233 +-0.0527322 0.0723715 -0.0160877 +-0.0593593 0.0651443 0.0328932 +-0.05784 0.0926528 -0.0211082 +-0.07134 0.156839 -0.0007386 +-0.000856246 0.103081 -0.0226647 +-0.000582144 0.0347482 -0.0236897 +-0.0384944 0.0464446 0.0402202 +0.0567142 0.0522491 0.00518691 +-0.0616825 0.0346164 0.0411183 +0.00851655 0.0758606 0.0561295 +0.0196258 0.127091 0.0083394 +-0.0719446 0.159605 -0.0399328 +-0.0356475 0.0379034 -0.0136529 +0.0172444 0.125917 0.0260258 +0.0094903 0.116849 0.0377607 +0.0232634 0.124781 0.0210949 +-0.0349607 0.125018 0.0217662 +0.0185443 0.12732 0.00510228 +0.0118903 0.0349087 0.0279111 +-0.00450764 0.0842735 0.0572857 +-0.0148777 0.0364156 0.0513074 +-0.0861402 0.0859086 0.000475654 +-0.0472303 0.164057 -0.00679428 +0.010042 0.0970288 -0.0247384 +0.0134328 0.0846923 0.0528905 +0.0456558 0.0449086 0.0258493 +-0.00349992 0.0746709 0.0587938 +-0.0719223 0.112846 0.049279 +-0.0117304 0.0670858 -0.0365895 +-0.0107336 0.0670714 -0.0363227 +0.0281295 0.110111 0.0355841 +0.00524969 0.0395071 0.0332712 +-0.030417 0.0360576 0.0517185 +-0.0191865 0.172705 -0.0222871 +0.032634 0.0954843 -0.0150589 +-0.0901468 0.129651 0.0415795 +0.015143 0.0346779 0.0251566 +-0.0926446 0.122835 0.02928 +-0.0735699 0.131215 0.0516643 +-0.0342826 0.126777 0.01609 +0.00752119 0.0813632 0.0555605 +-0.0325031 0.116645 0.0321616 +0.0237641 0.0349876 0.0120857 +-0.0592101 0.142401 0.0336275 +0.0449966 0.0931749 0.00418165 +0.0373285 0.0874946 0.0364747 +0.0175277 0.0348888 -0.0135142 +0.0451983 0.0889806 0.0171667 +0.0123957 0.0434077 -0.0245497 +-0.0759299 0.126701 -0.00794305 +-0.0895421 0.090213 0.0124508 +0.0392717 0.0938049 -0.00924672 +-0.087269 0.112677 0.0244432 +0.0369017 0.0770479 -0.0128074 +-0.019615 0.127443 0.00679651 +-0.058632 0.131139 0.0380532 +-0.0759599 0.0675387 0.00855626 +-0.0867924 0.139107 0.00519652 +-0.051888 0.0528335 0.0130005 +-0.0604943 0.108372 0.0386396 +-0.0620497 0.155563 0.0244621 +-0.0414999 0.0690877 0.0417125 +-0.000194321 0.121911 -0.011267 +0.0260147 0.0563895 0.0427437 +-0.00627779 0.0395112 0.048561 +0.0073902 0.0433817 -0.0245369 +0.00650458 0.105723 0.0419107 +-0.0890324 0.144705 0.01118 +0.0241216 0.0968854 0.045587 +-0.0284948 0.111359 -0.0178892 +-0.0842319 0.104575 0.0266516 +-0.0575865 0.0586919 0.0194779 +-0.0281815 0.125725 0.0109634 +-0.0638193 0.158306 -0.0465978 +-0.0355455 0.11407 -0.0167228 +-0.0683421 0.111385 0.0423299 +-0.0144529 0.178665 -0.0210547 +-0.00977952 0.0372711 0.0498001 +-0.0625714 0.164724 -0.0395894 +-0.088699 0.0915828 0.0224195 +-0.0594754 0.144099 -0.00268098 +-0.0925679 0.116061 0.0213084 +-0.0317212 0.0350332 0.0489115 +-0.0106525 0.165176 -0.016643 +0.00734712 0.12316 -0.0106668 +-0.0554936 0.104327 0.041387 +0.00250176 0.0620246 0.0566613 +-0.00947595 0.130265 0.0133884 +0.0276842 0.0768145 0.0453329 +0.00629218 0.0639808 -0.0323017 +0.00798329 0.130466 0.00265255 +0.0573764 0.0621793 0.0248727 +-0.0628961 0.158419 -0.0175871 +-0.0639761 0.129691 -0.00851425 +-0.0630898 0.161515 -0.0224551 +-0.0838815 0.111187 0.0425305 +0.0464938 0.0778639 0.0121785 +-0.0265128 0.116639 0.0325108 +-0.0545075 0.047347 0.012948 +-0.0677458 0.149084 -0.0355035 +-0.0687437 0.173038 -0.0415702 +-0.0258142 0.0389536 0.0363636 +0.0354622 0.0808406 0.0390375 +-0.028407 0.156859 -0.0100656 +-0.0728523 0.100773 -0.0133449 +-0.000973441 0.0353569 0.0464761 +0.0217031 0.104101 -0.0182402 +-0.0900893 0.135135 0.0242145 +-0.0209098 0.0382599 0.00734769 +-0.0384975 0.0676842 0.0417259 +0.0505086 0.0461176 0.0032623 +-0.0324927 0.0932098 0.0444316 +-0.029469 0.17882 -0.00554327 +-0.0770271 0.0743283 0.0300122 +0.0313581 0.116535 0.0255569 +-0.0772285 0.173502 -0.0405421 +0.0114915 0.130592 0.00962923 +-0.0739058 0.125263 -0.00826143 +-0.0709356 0.0780686 0.0386829 +-0.0450603 0.156487 0.00667449 +-0.00258285 0.0361873 -0.0247048 +-0.00135222 0.101336 0.0444015 +-0.0894746 0.139279 0.0281819 +-0.00967152 0.0968708 -0.0306358 +-0.0704928 0.117562 0.0527864 +-0.0678494 0.155094 0.00351036 +-0.0752747 0.175704 -0.0425921 +-0.032145 0.0863362 -0.0265533 +-0.0345086 0.0775176 0.0416541 +0.0409071 0.0711839 0.0309718 +0.0182107 0.084868 -0.0280483 +0.037986 0.0861315 0.0356473 +-0.0158582 0.107196 -0.0215252 +-0.0536497 0.0382495 -0.0113033 +0.0400088 0.107038 0.00721094 +-0.0111671 0.0867859 -0.0382994 +-0.0758579 0.0963896 -0.0129621 +0.00275941 0.0343655 0.0174794 +-0.0528912 0.109829 -0.018387 +0.0352142 0.037348 0.0177424 +-0.0770086 0.090082 0.0382275 +-0.0537852 0.0344427 0.037794 +-0.0317722 0.0335835 -0.0256749 +-0.0533077 0.12062 -0.0114531 +-0.0670377 0.155239 -0.0519345 +0.0248201 0.0343822 0.00913252 +-0.077345 0.0838842 -0.0115833 +0.0143045 0.0638067 -0.0299257 +-0.00129201 0.123843 -0.0093277 +0.0380905 0.0941294 0.0341306 +-0.0932985 0.125478 0.0122618 +-0.034118 0.163722 -0.0147399 +0.0298704 0.114081 0.0310466 +0.0255132 0.110081 0.0370706 +-0.0476672 0.0405803 -0.0117113 +-0.0472716 0.130968 0.0245047 +-0.0619845 0.128209 -0.0080954 +-0.0644855 0.0917771 0.0443552 +0.00846054 0.0341727 0.000449307 +0.000942621 0.0347668 0.0167534 +-0.0160225 0.0958165 -0.0315688 +-0.0534556 0.0353304 0.0456783 +0.0142349 0.129723 0.0106274 +-0.0726014 0.0365856 0.00586956 +0.033081 0.038417 0.0236373 +-0.0678588 0.128454 0.0493479 +0.0276968 0.0797349 -0.0226793 +0.0317217 0.0639399 -0.0186866 +-0.00482566 0.0896201 -0.0359284 +-0.0704978 0.124601 0.053003 +-0.00149487 0.115594 0.0408235 +-0.0360812 0.0358497 0.0136623 +-0.00514848 0.0385788 0.00662082 +-0.0791696 0.110508 0.0441428 +-0.0215028 0.0448835 0.0530162 +0.0173223 0.0699836 0.0514025 +0.0379734 0.0672941 0.0355158 +-0.0858805 0.0926571 0.00145452 +0.00396412 0.0977772 0.0510597 +-0.0656399 0.11715 0.0490043 +-0.0771179 0.165222 -0.035974 +-0.0198829 0.0383003 0.00206982 +-0.0187849 0.159551 -0.0109781 +-0.0655235 0.0347285 0.0315692 +0.0298088 0.0848631 0.0431899 +-0.0202144 0.186446 -0.0187314 +-0.0737921 0.165213 -0.0399888 +-0.0287531 0.0767493 -0.0350292 +-0.0108764 0.178532 -0.0297831 +0.00248459 0.114158 0.0410016 +0.0523216 0.0588453 -0.00357691 +-0.0424144 0.147803 0.00244515 +-0.0387777 0.0827042 -0.0213153 +-0.0338762 0.105703 -0.0205658 +-0.087924 0.1365 0.0420055 +-0.0747046 0.0837005 -0.0145969 +-0.0657521 0.033742 -0.00672308 +-0.045381 0.0381676 -0.0212668 +-0.0868004 0.0846768 0.00848321 +0.0294149 0.118962 0.0248216 +-0.034174 0.107559 -0.0198979 +0.0280502 0.0740858 0.0440821 +-0.0776167 0.0914005 0.037394 +0.0235133 0.0407023 0.0389233 +-0.0568656 0.102623 -0.018982 +-0.0678684 0.063022 0.000880975 +0.0360361 0.100737 0.0329764 +-0.0922724 0.125575 0.0332589 +-0.0929242 0.120168 0.0332909 +-0.018498 0.108568 0.0416031 +0.0174435 0.128281 0.0160914 +-0.0242219 0.178615 -0.0196227 +-0.0704096 0.163806 -0.0479588 +-0.0810819 0.0814326 -0.00557353 +-0.0595808 0.0380953 -0.00917151 +-0.00023307 0.0988811 0.0510016 +0.00703854 0.0344034 -0.0150394 +-0.092972 0.125468 0.0112596 +-0.00348845 0.115565 0.0406522 +-0.000499736 0.11143 0.0424297 +-0.00349598 0.0562185 0.05401 +0.0274875 0.0380349 0.0264602 +-0.0191507 0.168261 -0.0198644 +-0.0708777 0.131245 0.0502751 +-0.0591241 0.1154 0.0371963 +0.015252 0.122005 -0.00948865 +-0.0238533 0.0958019 -0.0255967 +-0.0225065 0.111294 0.03935 +0.0394335 0.0834241 0.0342316 +-0.0599597 0.121237 0.0413621 +-0.0151227 0.160977 -0.0122661 +-0.0856126 0.0792275 0.0145081 +-0.0304111 0.0336116 -0.02356 +-0.0300276 0.0875944 -0.030572 +-0.0387164 0.0695709 -0.0161311 +-0.0658849 0.153363 -0.0443952 +-0.0108819 0.168382 -0.0176467 +0.0450682 0.090383 0.0171641 +-0.0624967 0.149081 -0.013576 +-0.0222042 0.178612 -0.0212581 +0.0294982 0.120461 0.0105965 +-0.0414977 0.115265 0.0337662 +-0.0499421 0.135837 0.0234945 +-0.0843142 0.152356 0.00793113 +-0.0410616 0.156231 -0.0095971 +-0.0238697 0.104438 -0.0232028 +-0.0067213 0.065597 -0.0353344 +-0.0108037 0.0827117 -0.0384206 +0.0138699 0.049008 0.0461763 +0.016266 0.0750624 -0.0291952 +-0.0813824 0.099165 -0.00657823 +-0.0355882 0.126454 -0.000576513 +-0.0627783 0.0343233 0.0272634 +-0.0864194 0.133874 0.0462429 +-0.0424946 0.0972875 0.0422451 +-0.00875136 0.116762 -0.015718 +-0.00610573 0.035829 0.0485597 +-0.0634859 0.146784 0.0381458 +0.00949393 0.109876 0.0399119 +-0.0286135 0.0817842 -0.0355888 +-0.0785092 0.126003 0.0529555 +-0.0564526 0.0602802 -0.00348733 +-0.0632263 0.153648 -0.0346156 +-0.0212315 0.0839098 0.0563274 +-0.0185478 0.0382321 0.00966598 +-0.0629734 0.126755 -0.00855487 +-0.0607657 0.139716 -0.00595313 +-0.0192289 0.178619 -0.0235673 +-0.0154933 0.0730227 0.0553537 +0.0208153 0.0564412 0.0475406 +-0.0390833 0.0486663 -0.0122287 +-0.065493 0.153273 0.0335324 +0.0608914 0.0637395 0.0141606 +-0.0153829 0.18014 -0.0206255 +-0.0822314 0.0842513 -0.00555381 +-0.0678037 0.0880304 -0.0174902 +0.0361089 0.0577094 0.0344737 +-0.0464121 0.035458 -0.0187253 +-0.0666201 0.0338653 0.00919115 +-0.0674808 0.0688292 0.0332504 +-0.0659293 0.156005 0.0129201 +-0.0294246 0.0861745 0.0444819 +-0.0581309 0.155502 0.017154 +-0.0726537 0.15621 0.0148854 +-0.0168438 0.180138 -0.0192059 +-0.0656741 0.0356447 0.0159226 +0.0163545 0.0507599 -0.025927 +-0.0293383 0.123554 -0.00265044 +0.00679991 0.131589 0.0107583 +-0.0398245 0.0942915 -0.0229995 +-0.0945717 0.122812 0.0182725 +0.00440363 0.0390362 -0.0241943 +-0.0798195 0.105901 -0.00558882 +-0.0117856 0.0813065 -0.0386038 +0.00749342 0.0372096 -0.0118978 +-0.0744971 0.176396 -0.0436946 +-0.00968478 0.0584187 -0.0340646 +0.0312312 0.117425 0.00123717 +0.0184875 0.0976002 0.0470854 +-0.0716235 0.0693585 0.0301698 +0.039816 0.0393083 0.00327619 +-0.0835287 0.11032 0.027366 +-0.0245014 0.043543 0.0534366 +0.0370893 0.106835 -0.00283087 +-0.0567623 0.154944 0.0190948 +-0.0275761 0.125766 0.0126577 +-0.00827698 0.0408222 0.049207 +0.0553826 0.0699889 0.0228528 +0.012476 0.0976634 0.0485624 +0.0597169 0.0580863 0.0181825 +-0.0261346 0.168251 -0.00989215 +-0.0319337 0.0680008 -0.0224492 +-0.0367004 0.0680804 -0.0157124 +-0.0192371 0.0959207 0.0497533 +-0.0482812 0.115062 -0.0157267 +-0.0625405 0.132491 0.039434 +-0.0464975 0.163768 0.00545168 +-0.0809296 0.0885877 0.0337432 +-0.0341216 0.0395911 0.0493113 +0.0322123 0.0856789 -0.0192748 +-0.0822934 0.0775365 0.000511811 +0.00709964 0.0342068 0.00386204 +-0.086438 0.0832915 0.00949498 +-0.0244616 0.0474336 0.050725 +0.00565547 0.0365592 0.0251573 +-0.0274618 0.045988 0.0503593 +0.010522 0.119127 0.036469 +-0.0736141 0.151246 -0.0348888 +-0.024687 0.0892375 0.0511394 +0.00296667 0.0390863 0.0277676 +-0.0494919 0.154959 0.0103413 +-0.058864 0.139321 -0.00549203 +-0.0327877 0.082138 -0.0285334 +-0.0423065 0.150496 -0.00548521 +-0.0631749 0.149 -0.0205832 +-0.0218319 0.0363367 -0.0187811 +-0.0723757 0.0638786 0.0154336 +-0.0358563 0.126885 0.000788129 +0.0192111 0.080597 -0.0276192 +-0.0620809 0.0336347 -0.00771095 +-0.0313625 0.0510794 -0.0143586 +-0.063822 0.115596 0.0429106 +-0.0645614 0.138204 0.0400205 +-0.0824235 0.124446 0.0510342 +0.0555936 0.0567472 0.0257684 +-0.0293723 0.0422984 0.0515712 +0.0526995 0.0702438 0.0035897 +-0.0647148 0.06349 0.0261636 +0.00450679 0.0702611 0.0557926 +-0.0421206 0.171253 -0.0079388 +-0.00823225 0.127328 0.0283641 +0.0085198 0.0716538 0.0557746 +-0.0603515 0.116839 0.0389782 +-0.0758447 0.151365 -0.0158827 +-0.0913489 0.117296 0.00730629 +-0.0787438 0.101744 -0.00857364 +-0.0758718 0.109158 -0.00765228 +0.0141976 0.0850086 -0.0301852 +0.0110282 0.0968851 -0.0245853 +-0.0821235 0.0802564 0.0295192 +-0.0500787 0.154631 -0.00525635 +-0.0278864 0.105837 -0.0222471 +-0.0355149 0.0804148 0.0426568 +0.0156112 0.0519525 0.0469795 +-0.0758417 0.114903 -0.00554375 +-0.00130995 0.124776 -0.00834251 +-0.0285122 0.180211 -0.00692909 +0.0124807 0.0949598 0.0504131 +-0.0679136 0.113718 -0.0102762 +-0.0871543 0.105024 0.0183639 +0.0375648 0.0926236 -0.0120119 +-0.0297787 0.125132 0.0177406 +-0.0253546 0.121816 0.0267508 +0.0463872 0.0806547 0.00917972 +-0.0386145 0.0492284 -0.011639 +-0.0604969 0.0918487 0.0452694 +-0.0754744 0.151328 -0.022882 +0.0184783 0.101734 0.0458501 +-0.0250671 0.0385158 0.031526 +-0.0384759 0.091717 0.0434324 +-0.0394992 0.0916803 0.0429883 +-0.0668335 0.143964 0.0420823 +-0.0653424 0.0629827 0.0247148 +-0.0644392 0.112372 0.0382632 +0.0242087 0.039076 0.0343007 +-0.0535427 0.0402957 -0.0106063 +-0.082326 0.0748249 0.00451639 +-0.0544972 0.0959632 0.0436086 +-0.020823 0.0868434 -0.0377816 +-0.0636947 0.167813 -0.0415938 +-0.0448731 0.128505 0.000263047 +-0.0608825 0.0996865 -0.0185327 +0.0079329 0.0630739 0.055296 +0.00434495 0.0973121 -0.027058 +-0.091323 0.113292 0.0153266 +-0.0074977 0.0801462 0.0578122 +-0.0899881 0.118599 0.00429898 +-0.072593 0.155911 0.00171291 +0.00944326 0.128939 -0.000930002 +-0.0669203 0.110822 0.0381745 +-0.0378406 0.0957387 -0.0228102 +-0.00994641 0.0339021 -0.0251924 +-0.0261195 0.0706905 0.0432458 +0.0285346 0.121033 0.017364 +-0.0702811 0.17421 -0.0421289 +-0.00949024 0.104446 0.0436658 +-0.0877186 0.105023 0.0153645 +0.0487537 0.043125 0.0102298 +-0.0709615 0.148056 -0.0324394 +-0.0785455 0.146115 0.0422588 +-0.0777749 0.150053 -0.00387978 +-0.0747481 0.158885 -0.00783629 +0.022966 0.0347513 0.0194226 +-0.000497806 0.0842866 0.0575088 +0.0329127 0.116986 0.00902312 +0.0303386 0.119339 0.00661655 +0.0335365 0.0483507 0.0312493 +-0.0506321 0.0530807 0.0328365 +-0.0283907 0.123379 0.0211752 +0.043167 0.0831963 -0.0047762 +-0.00976599 0.121876 -0.011136 +-0.0836817 0.0786288 0.0214472 +-0.0584699 0.0344613 0.0385122 +-0.031399 0.116965 -0.0137545 +-0.0679334 0.145349 0.0422649 +0.0355447 0.11347 0.012835 +-0.0343438 0.0384811 -0.00836679 +-0.0303159 0.0678299 -0.0274662 +0.030827 0.0835413 0.0428747 +-0.0367713 0.0871639 -0.0235593 +-0.0249824 0.117062 -0.0139085 +-0.0633873 0.169402 -0.0465883 +-0.0567938 0.0498747 0.00808849 +-0.0719281 0.148635 -0.0350398 +-0.0764024 0.150045 -0.00692327 +-0.085242 0.115675 0.000251725 +0.0352163 0.0367258 0.0146563 +-0.0476332 0.0345872 0.0389835 +-0.0306482 0.0819602 -0.032565 +-0.0258283 0.172717 -0.011167 +-0.0745076 0.115686 0.0517763 +-0.0625234 0.0413191 -0.00677899 +-0.02745 0.110307 -0.0187882 +-0.0444951 0.104328 0.0415155 +-0.0774643 0.155549 -0.0139037 +0.0154943 0.105779 0.0433144 +-0.00688511 0.0982482 0.0516445 +-0.0476227 0.122378 -0.0113753 +-0.0830725 0.139367 0.045586 +-0.0431901 0.039319 -0.0232745 +0.00551778 0.0828244 0.0566316 +-0.0364708 0.152123 0.0014574 +-0.00749897 0.0815283 0.0577578 +-0.0165021 0.118207 0.0361456 +0.013481 0.0358562 0.0436245 +0.0102178 0.0836927 -0.0316174 +0.0514697 0.0462224 0.00523719 +0.0399822 0.0910991 -0.010396 +-0.0510223 0.0339346 0.00874224 +-0.0327803 0.0793117 -0.0285199 +0.0549936 0.0732019 0.0123756 +0.0461994 0.0750316 0.00518987 +0.0371924 0.0391306 0.0220088 +-0.0737191 0.152664 -0.0318934 +-0.0548531 0.149577 0.0276913 +-0.00305215 0.125834 0.0316944 +-0.021742 0.0389771 0.0371835 +0.0252695 0.0532659 -0.021679 +-0.0633235 0.0388939 0.025715 +-0.053898 0.105542 -0.0189379 +-0.0718855 0.122345 -0.00846405 +-0.0334848 0.0561021 0.0379001 +-0.0635384 0.061476 -0.00191873 +0.0137785 0.0346695 0.0230735 +0.0204936 0.1267 0.00866396 +-0.0258672 0.156547 -0.00846874 +-0.089402 0.0996815 0.0144017 +-0.010288 0.172711 -0.0218803 +0.00772266 0.115023 0.0394097 +-0.0363729 0.176071 -0.00683571 +-0.0525546 0.0444744 -0.00849373 +-0.0577063 0.155408 0.0158579 +-0.0512663 0.12652 -0.00563382 +-0.0277699 0.0661915 -0.0304661 +-0.0394907 0.0422995 0.0416287 +-0.0592646 0.0346371 0.0433189 +-0.0917594 0.117442 0.030311 +0.0188028 0.0349604 -0.00569856 +-0.0184644 0.0528818 0.0482087 +-0.0649365 0.1467 -0.0209465 +-0.0397769 0.152293 -0.00702124 +0.056742 0.0696177 0.0218717 +0.0435205 0.0637429 0.0281056 +0.0514429 0.0626408 -0.00275857 +-0.0668197 0.100942 -0.0159632 +-0.078886 0.0812827 -0.00855752 +0.0483563 0.0710513 0.00477309 +-0.0415729 0.151549 -0.00635576 +-0.0122139 0.169818 -0.0178463 +-0.0454996 0.163749 0.00555272 +-0.0779251 0.168693 -0.0322923 +-0.0455017 0.0973341 0.0429686 +-0.0932761 0.122751 0.0112823 +-0.00193792 0.0388572 0.00152241 +0.0379602 0.108292 0.00117706 +0.0447742 0.0777119 -0.00080388 +-0.0365645 0.0341557 0.0276322 +-0.077566 0.155252 0.0102497 +-0.00781043 0.0346187 0.0439246 +0.0218954 0.061892 0.0473866 +0.0229726 0.108506 -0.0149598 +0.0350891 0.111006 -0.00183676 +0.00866181 0.128565 0.0271896 +0.00435977 0.0481043 -0.0288152 +-0.00551112 0.0390255 -0.00865823 +-0.0205328 0.113457 -0.0181494 +-0.0851368 0.0832799 0.0224738 +0.00348766 0.115539 0.0402625 +-0.0174898 0.105786 0.0424611 +-0.087451 0.133828 0.0444349 +0.00492538 0.111581 -0.020193 +0.0318279 0.0713659 0.0407221 +-0.0121811 0.0984293 0.0498089 +-0.0747959 0.149331 0.0394056 +-0.0571923 0.0344404 0.0353306 +0.0154304 0.0417921 -0.0229429 +-0.0481114 0.159106 -0.00699154 +-0.0285 0.0960446 0.0448096 +0.0354946 0.0642547 -0.0137843 +-0.0204882 0.0388257 0.0339872 +0.0353716 0.0741014 0.0388421 +-0.0157653 0.161968 -0.0148041 +0.00551566 0.0799926 0.0558154 +0.0181043 0.128017 0.0106305 +-0.0644854 0.0986987 0.0423063 +-0.0415014 0.0492193 0.0396812 +-0.0900528 0.132428 0.0342227 +-0.0126494 0.0496668 -0.0310907 +-0.0321289 0.0337822 0.0109163 +-0.0625403 0.149101 -0.00657536 +-0.0124899 0.104431 0.0434394 +-0.0728072 0.15012 0.0385587 +-0.0275374 0.156717 -0.00957418 +-0.0627683 0.04307 0.0276693 +0.00651507 0.0344231 0.0163793 +-0.0631947 0.163133 -0.0265887 +-0.0264832 0.105687 0.0411729 +0.0072963 0.0341516 -0.018557 +-0.018657 0.109944 -0.0204332 +-0.0843505 0.0842533 0.0274024 +-0.0531944 0.139931 -0.000456373 +-0.0741436 0.100877 0.037779 +-0.0658548 0.0952898 -0.0176963 +-0.0504071 0.163936 0.00393123 +-0.00384396 0.0384339 0.019723 +-0.0889438 0.137894 0.0261932 +-0.017832 0.0346972 0.047013 +0.0156145 0.128768 0.00543431 +-0.0517309 0.0489114 0.0216412 +-0.0358204 0.046598 -0.0238768 +-0.059344 0.139552 0.0335155 +0.0510761 0.0567889 0.0297952 +-0.0787812 0.166656 -0.0319662 +0.030718 0.111397 0.0323042 +0.0535299 0.049514 0.0226619 +-0.0446433 0.0346533 0.0343218 +-0.0169852 0.186593 -0.0230311 +-0.0743965 0.149892 -0.0310959 +-0.0373231 0.0354917 0.0439186 +-0.000691629 0.100255 0.0478272 +-0.0818959 0.141783 0.000186922 +-0.0304023 0.0382885 -0.00186367 +-0.00349386 0.0925503 0.0560196 +-0.088924 0.151541 0.0211005 +-0.0824519 0.0856305 -0.00554258 +0.0469336 0.0511672 0.030779 +-0.0852791 0.132127 -0.000702015 +-0.0891862 0.112803 0.0347042 +0.0229651 0.0928857 0.047441 +-0.0442655 0.127665 -0.00291939 +-0.0917744 0.132406 0.0242297 +0.00738689 0.0359942 0.0260187 +0.0456627 0.0890114 0.0111648 +-0.0860966 0.11232 0.0268196 +-0.0556879 0.117086 -0.0137514 +0.0093902 0.0739182 0.0557875 +-0.0794167 0.137236 0.0495785 +-0.0893497 0.130881 0.0042394 +-0.0656682 0.0337431 0.00949839 +-0.0263524 0.059005 -0.029433 +0.0104643 0.0346107 -0.00703394 +-0.0631576 0.119928 0.0457283 +0.0423355 0.0972587 0.0241615 +0.0603447 0.0595379 0.00916361 +0.0495034 0.0488243 -0.00166079 +-0.0740753 0.155198 0.0041876 +-0.0656926 0.125639 0.0489587 +-0.00648958 0.0503786 0.0513549 +0.0381951 0.102007 0.0289909 +-0.0592102 0.0595951 0.00211544 +0.0285202 0.0622348 -0.0207982 +-0.0876555 0.144675 0.00917716 +0.0519851 0.0567984 0.0293579 +-0.0300707 0.124739 0.00148409 +-0.0725865 0.0874189 0.0409577 +-0.00281209 0.0882041 -0.0358187 +-0.0637344 0.0736795 -0.0161836 +0.0142616 0.0794232 0.0540604 +0.0458875 0.0787805 0.0205292 +0.0245051 0.0849065 0.0478503 +-0.0617895 0.083881 -0.0194032 +0.0333636 0.0364347 0.0163708 +0.0165102 0.111269 0.0389693 +0.033894 0.111352 0.0280456 +-0.00616098 0.0344967 -0.0177303 +-0.0662325 0.14347 -0.0127636 +-0.0199914 0.0962147 -0.0280142 +-0.0259005 0.126064 0.0117956 +-0.0929641 0.121523 0.0342815 +0.00656148 0.101677 0.0461619 +-0.0600389 0.0627348 0.027804 +0.0335486 0.0889696 0.0416029 +-0.0688127 0.0908552 -0.0166124 +-0.0856608 0.0854539 0.0244177 +-0.0759458 0.0974591 -0.0125133 +-0.0667171 0.171901 -0.0422833 +-0.0191016 0.0431933 0.0528315 +-0.0589426 0.0357407 0.0458703 +0.013481 0.127543 -0.00145794 +-0.0239185 0.0383353 -0.00428996 +-0.0627701 0.0824471 -0.0192325 +-0.0614696 0.136692 0.0357094 +-0.0810116 0.0734375 0.0175497 +-0.0759173 0.12523 -0.00781198 +-0.00824401 0.0384507 0.0170014 +-0.0641628 0.157463 -0.0125984 +-0.0178575 0.122517 -0.00769635 +-0.0596856 0.0659756 -0.00895149 +-0.0807952 0.106052 0.0302403 +0.0156574 0.0925729 -0.0260099 +-0.081817 0.0734713 0.00853447 +-0.052947 0.1293 -0.00466978 +0.0313864 0.0929268 0.0420114 +-0.0242749 0.174204 -0.0124276 +-0.0678958 0.0610238 0.00808464 +-0.0477867 0.135371 0.0169352 +-0.0514248 0.0500855 0.0140283 +0.0463863 0.075041 0.00619921 +-0.0120829 0.121468 -0.0106691 +0.0474936 0.0651497 0.0284001 +-0.0370341 0.127886 0.0121304 +-0.0240288 0.0385625 0.0316972 +0.0484803 0.0651161 -0.0012457 +-0.0516556 0.0569841 0.0295138 +-0.0639861 0.131146 -0.00837414 +-0.0504965 0.087636 0.0455301 +0.03603 0.0808066 0.0380541 +-0.0869174 0.117103 0.00125292 +-0.0617229 0.155313 -0.01958 +-0.0631289 0.15403 -0.0107687 +0.00528045 0.114267 -0.0191116 +-0.0639453 0.167747 -0.0398404 +0.0288613 0.0520696 0.0379853 +-0.0623548 0.166257 -0.0465894 +0.000543528 0.123331 0.0344653 +0.0375704 0.0618629 0.0348997 +-0.0391935 0.128299 0.00543562 +-0.0593991 0.0472653 0.0079341 +-0.0244003 0.0390404 0.0383653 +-0.0676508 0.0338326 0.0090061 +-0.0292136 0.07193 -0.032514 +-0.0374976 0.0861098 0.0439188 +0.0247244 0.0549721 0.0426251 +-0.0892169 0.151457 0.0141575 +-0.02429 0.121354 -0.00839434 +-0.0618416 0.098205 -0.0180486 +-0.0320742 0.0383234 -0.000421092 +-0.0488761 0.107007 -0.0192731 +-0.0476462 0.123357 -0.010393 +0.0220922 0.12286 0.0278182 +-0.00150357 0.0647954 0.0567431 +0.000502823 0.0870298 0.0569751 +-0.0581295 0.0643065 0.0321224 +-0.0188005 0.0568615 0.0490899 +-0.0794271 0.0732336 0.00151817 +0.019219 0.0848258 -0.027423 +-0.0344972 0.116614 0.0320154 +0.000192029 0.0811649 -0.0359709 +-0.0741702 0.0968478 0.0394202 +0.00621596 0.083814 -0.033411 +-0.0671177 0.159814 -0.0107973 +-0.0187526 0.0641914 -0.0363857 +0.0556876 0.0493473 0.0181935 +-0.0364983 0.059104 0.0398977 +-0.071802 0.181053 -0.0556554 +-0.0116602 0.168404 -0.0170453 +-0.0478952 0.0713156 0.0406183 +0.0354015 0.0476244 -0.00628637 +-0.0262003 0.0750789 0.0460261 +-0.0550327 0.0674609 0.0370807 +-0.0565425 0.0415574 -0.00871771 +-0.0546448 0.115434 0.0349037 +-0.0682182 0.15577 -0.00101225 +-0.066899 0.132617 0.0454244 +-0.0743656 0.172848 -0.0365047 +-0.0734703 0.155395 0.00293075 +-0.0125152 0.0589286 0.0534547 +0.00233104 0.0554199 -0.0313859 +-0.0805618 0.101855 -0.00659893 +-0.0537592 0.0797599 -0.020636 +-0.0237797 0.125538 0.0184413 +-0.0508814 0.161419 0.0066624 +-0.0742588 0.0655235 0.0100016 +0.0457502 0.0805926 0.00319942 +-0.0764848 0.142819 0.0460732 +-0.0442438 0.113637 -0.0162318 +-0.00550074 0.0870334 0.0571343 +-0.059876 0.0997119 -0.0187764 +-0.069062 0.149033 -0.0371338 +-0.0598711 0.154188 0.0296083 +-0.044481 0.0973337 0.0428134 +0.0255359 0.118038 0.0305151 +-0.000498881 0.112805 0.0421187 +-0.073083 0.0981963 0.0397086 +-0.0766217 0.068534 0.0175211 +-0.038773 0.11398 -0.0166127 +0.0194763 0.0837958 0.0507486 +-0.0809353 0.145916 -0.000819165 +0.0301953 0.0476864 0.0346108 +-0.0284906 0.0932063 0.0444855 +-0.071967 0.162417 -0.0419522 +-0.0647895 0.0838376 -0.0190209 +-0.00994817 0.0389455 -0.0113423 +0.00268547 0.035256 0.0455248 +-0.0587181 0.0481161 0.00163754 +-0.0537032 0.140954 0.0276054 +-0.0166811 0.0377146 -0.0171581 +-0.0896263 0.0969991 0.0154111 +-0.0475653 0.166962 -0.00492463 +-0.0684985 0.0986495 0.0414678 +0.0399619 0.0730961 -0.00981181 +-0.0433911 0.121364 -0.0123522 +-0.0619851 0.167813 -0.0525933 +-0.0768904 0.0733563 0.0291265 +-0.058879 0.104045 -0.0185386 +-0.0154965 0.0573571 0.0513792 +-0.0115598 0.09531 -0.0330219 +-0.0335104 0.125389 -0.00127044 +0.0292004 0.119729 0.0233163 +-0.0141909 0.171251 -0.024451 +0.00225805 0.0711729 -0.0343766 +0.000838494 0.130009 0.0243594 +-0.0186635 0.0360947 0.0525267 +0.0441946 0.0874765 -0.00278813 +-0.0347028 0.122731 -0.00776716 +-0.0478246 0.129609 0.027299 +-0.0784918 0.144814 0.0436628 +0.020477 0.0989516 0.0463466 +-0.0870404 0.113136 0.0295379 +0.012093 0.120504 0.0352323 +0.00825492 0.0739666 -0.0336091 +0.00112807 0.104475 -0.0219821 +-0.0142621 0.120334 -0.0114431 +-0.0507965 0.0345143 0.033135 +0.0311896 0.0857114 -0.0197343 +-0.0894234 0.0956355 0.01542 +-0.0775093 0.0961888 -0.0115304 +-0.0358262 0.0929298 -0.0238031 +-0.0774962 0.131676 0.0527303 +-0.0421326 0.160667 -0.0107094 +-0.0276983 0.125752 0.00966815 +-0.045336 0.129618 0.020889 +-0.00368188 0.0613041 -0.0346439 +-0.0748644 0.171601 -0.033829 +-0.0207882 0.0770942 -0.0390427 +-0.044533 0.160785 0.0064482 +-0.0789135 0.0799145 -0.00757704 +-0.0700794 0.154941 0.0289273 +-0.0313268 0.0609036 -0.0184352 +-0.0853384 0.107683 0.0213404 +-0.0624789 0.152144 -0.0275875 +-0.0427656 0.0797392 -0.0197597 +0.00722196 0.0865913 -0.0328221 +-0.0720619 0.109399 0.0395074 +-0.0911632 0.132299 0.00922827 +-0.00610552 0.129863 0.0232869 +0.02524 0.115374 0.03316 +0.00541955 0.0912903 -0.0327619 +0.00896308 0.0344141 -0.00340754 +-0.0356782 0.0636593 -0.0138055 +-0.0555057 0.153886 0.023914 +0.0207355 0.0349558 0.0059225 +0.0360179 0.0848402 0.038086 +-0.0488433 0.098515 -0.0220378 +-0.0633934 0.178218 -0.0607118 +-0.0846638 0.0778105 0.0155166 +0.0437393 0.0720229 -0.000789276 +-0.0288953 0.122588 -0.00566495 +-0.025973 0.0851197 0.051146 +-0.0782416 0.0913778 0.0366028 +-0.0494978 0.0960237 0.0444817 +-0.0785831 0.0731535 -0.00247436 +-0.0698391 0.165209 -0.0499791 +-0.0586839 0.0335669 0.00570948 +-0.0610591 0.155387 0.024814 +-0.0642828 0.163385 -0.0227384 +-0.0658667 0.0334936 -0.00108817 +0.037341 0.0888457 0.0365275 +0.02301 0.0347163 0.00286296 +-0.0590207 0.126708 -0.0075139 +0.0463679 0.0792556 0.0081871 +-0.00960203 0.0406207 -0.0262166 +-0.0771598 0.160359 -0.0157997 +-0.0425011 0.163766 0.00491011 +-0.00971544 0.177216 -0.0294611 +0.021747 0.102101 0.0439088 +-0.087802 0.139216 0.0403868 +-0.0694557 0.0421945 0.00370163 +0.0173244 0.0580274 -0.0281164 +-0.011686 0.178646 -0.0240587 +-0.0245154 0.158144 -0.00224812 +0.021637 0.0948486 -0.0224193 +0.00951901 0.0504027 0.0504431 +-0.0252093 0.112572 -0.0171753 +-0.0736758 0.108402 0.0380105 +-0.0551152 0.0341599 0.0272668 +-0.0462814 0.155049 0.00841735 +-0.0164865 0.0730277 0.0553332 +-0.0853981 0.109039 0.0213496 +-0.0817879 0.0734817 0.0075372 +-0.0543644 0.15733 0.00977334 +-0.0391365 0.0406682 0.0418102 +0.00445432 0.130749 0.00275136 +0.0247455 0.105845 -0.0161092 +-0.0554962 0.0904299 0.0451691 +-0.00849692 0.0731924 0.0575239 +-0.0665361 0.11864 0.0512424 +-0.0771905 0.152834 -0.00389169 +-0.0684956 0.0958684 0.0422138 +-0.086559 0.0806364 0.0135028 +-0.065258 0.156162 0.0146042 +-0.0134788 0.105828 0.0432751 +-0.00273284 0.0712345 -0.035418 +0.0276777 0.0972525 -0.0189451 +-0.0768441 0.113421 -0.00459179 +-0.0291819 0.174148 -0.0171874 +-0.0392913 0.0344977 0.0373408 +-0.00249868 0.0965524 0.0536599 +-0.026518 0.10985 0.0386071 +-0.0272212 0.114809 -0.0155223 +-0.0617195 0.0669875 0.0343055 +-0.0824261 0.101938 -0.00456304 +-0.0889571 0.0955775 0.00843273 +-0.0288529 0.100117 -0.0233232 +-0.0899265 0.130893 0.00523191 +-0.0346189 0.112824 -0.0174204 +-0.0154754 0.111334 0.0410203 +-0.053649 0.0335392 -0.00958395 +-0.000215874 0.126274 0.0312521 +0.00810763 0.0366956 0.0273459 +-0.0915032 0.133721 0.0182157 +0.0193574 0.0537071 -0.027254 +-0.0617049 0.070743 -0.0146345 +-0.0745149 0.121791 0.0533186 +-0.070524 0.0682803 0.0295828 +-0.0206697 0.0697068 0.051972 +-0.0918785 0.141976 0.0181723 +-0.0408421 0.0345979 0.00840679 +-0.0738542 0.15551 0.00718209 +0.0055205 0.0427186 0.0455303 +-0.065431 0.168513 -0.0346313 +0.0194077 0.0659 0.0490938 +-0.0485039 0.0876217 0.0453743 +-0.0622817 0.0458517 0.0346831 +0.0349983 0.0362655 0.0094693 +-0.0912374 0.140583 0.0161703 +-0.0884146 0.113764 0.0250911 +0.0142472 0.0860448 0.0523279 +-0.0131413 0.127389 -0.000900164 +0.0289187 0.0580129 -0.0187889 +0.00423189 0.0768627 -0.0347545 +0.0204663 0.0385832 -0.00969847 +-0.0217971 0.0348633 0.0460203 +-0.0864575 0.101794 0.0247295 +0.00132582 0.0568889 -0.0321653 +-0.0697484 0.0793376 -0.0160307 +-0.0845391 0.102087 -0.000621587 +-0.0733924 0.0656461 0.018954 +-0.0391909 0.0342717 0.0287528 +-0.065551 0.112475 0.040245 +-0.0628947 0.161497 -0.0505862 +-0.0455612 0.125305 -0.00846085 +0.0204165 0.110729 -0.0153427 +-0.0119941 0.16759 -0.0225943 +-0.0778434 0.153328 0.00140062 +-0.0743032 0.152688 -0.027892 +-0.0719627 0.134048 -0.00796724 +-0.0322554 0.0722092 -0.0264952 +-0.0689145 0.123836 -0.00886831 +-0.0292201 0.0564848 -0.022383 +-0.0336564 0.0343441 0.0369141 +0.0587559 0.0579922 0.0215357 +0.0331644 0.1138 0.0262385 +0.0155789 0.125536 -0.0032763 +-0.0511913 0.034459 0.0313456 +0.0336899 0.0357287 0.00969367 +0.0540437 0.0734433 0.0120297 +-0.0588961 0.106893 -0.0176578 +-0.0158316 0.18484 -0.0207268 +0.0120317 0.0342138 -0.0138856 +0.0335354 0.0380053 0.0222769 +-0.0118847 0.117889 -0.0148923 +0.00991822 0.0342953 -0.00310719 +0.00806259 0.0342288 -0.0204182 +-0.00962665 0.0384388 0.00947704 +-0.00349166 0.0534503 0.0541192 +0.0248931 0.108132 -0.0145556 +-0.0355172 0.106999 0.038376 +0.0298839 0.118971 0.0235707 +-0.0896201 0.0969823 0.0124196 +0.00795856 0.126912 0.0298215 +-0.0734288 0.149863 -0.0358672 +-0.0513643 0.132495 0.031006 +-0.056967 0.0535025 0.000612409 +-0.0226813 0.0349023 0.0509736 +0.0573538 0.0634191 0.00214341 +-0.0178849 0.0387376 -0.0108688 +-0.0690262 0.170476 -0.0316587 +-0.0162544 0.183109 -0.0200888 +-0.0569078 0.052097 -0.000371255 +-0.0845703 0.11062 0.0357089 +0.035496 0.0454077 0.0303438 +-0.00267498 0.100539 0.0471075 +-0.080721 0.0845507 0.0336553 +-0.0900133 0.150126 0.0131697 +-0.0628916 0.0631016 0.0268901 +-0.0739067 0.163816 -0.0379732 +-0.0313311 0.0487062 0.0434625 +-0.036476 0.0533606 0.0387027 +-0.0636484 0.15559 0.00937973 +0.0135801 0.0874029 0.0531363 +-0.0259964 0.0967524 -0.0245741 +-0.0665286 0.168031 -0.0580342 +-0.0794099 0.141428 0.0463829 +-0.0496093 0.0334738 -0.00871292 +0.0373859 0.082128 0.0365587 +-0.00650329 0.0547609 0.0534371 +0.0253836 0.0503366 -0.0210264 +-0.00332845 0.128773 0.0271941 +0.0363318 0.0601344 -0.0117401 +-0.0258635 0.103016 -0.0235702 +-0.0251408 0.168241 -0.0184358 +0.018845 0.0956057 -0.0232473 +-0.0712372 0.167165 -0.0209901 +-0.0759412 0.151358 -0.0178788 +-0.0784019 0.152013 0.0336008 +0.000968412 0.0391138 -0.00557511 +-0.0865136 0.106289 0.0083757 +-0.0623969 0.0335761 0.00673913 +-0.0769787 0.135423 -0.00568624 +0.021851 0.0591836 0.0473037 +-0.0524335 0.115217 0.0341034 +-0.0884925 0.144689 0.01017 +-0.0774954 0.147028 0.0416906 +0.00429953 0.0340852 0.0162355 +-0.0489061 0.0346101 0.0421693 +-0.0377668 0.0812615 -0.0209367 +-0.0321125 0.0496937 -0.0183514 +-0.00333701 0.121977 -0.0113118 +-0.063853 0.129717 0.0428324 +0.0122687 0.0724051 -0.0314733 +-0.0295052 0.113904 0.0347936 +0.0428284 0.0676747 -0.00179274 +-0.0665096 0.0944832 0.0425185 +-0.0324964 0.117987 0.0309791 +-0.0240568 0.0972281 0.0446316 +-0.0729302 0.128204 -0.00868672 +-0.0930613 0.118852 0.0392987 +-0.0179932 0.0940702 -0.0337993 +-0.0276364 0.0917699 -0.0296042 +0.0270825 0.114018 -0.00875387 +-0.0701334 0.160982 -0.047936 +0.0160414 0.0343167 -0.00190332 +-0.0407181 0.0336157 0.00208844 +0.0537368 0.0581963 0.0283843 +0.0459393 0.0792136 0.00418579 +0.00219887 0.0866713 -0.0341557 +-0.0874475 0.125307 -0.000719081 +0.0171658 0.0974165 -0.0229214 +-0.0555243 0.0344634 0.0339194 +0.00337546 0.131746 0.0137901 +-0.037361 0.155079 0.00374727 +-0.00966712 0.0394179 0.0374824 +0.0401633 0.102703 -0.00178896 +-0.0792807 0.167978 -0.037009 +0.0137845 0.0344 -0.00993851 +-0.0224906 0.034851 -0.0281799 +-0.0815485 0.124491 0.0516101 +0.0440694 0.0973609 0.0121636 +-0.0361101 0.0351289 -0.0167641 +-0.0672139 0.168667 -0.0295504 +0.00726635 0.0696573 -0.0326992 +-0.0474987 0.0987688 0.0431343 +-0.0879643 0.115809 0.00328051 +0.0212116 0.083355 -0.0266295 +-0.0413155 0.0345032 0.0369079 +-0.0830031 0.148729 0.00315098 +-0.0365029 0.0818729 0.0434567 +-0.0265303 0.0632322 0.0390504 +0.0560084 0.0549549 0.0021707 +-0.00162661 0.100486 0.0474782 +-0.00782745 0.0882395 -0.0367822 +-0.0874416 0.113109 0.00532366 +-0.0755108 0.126011 0.0529241 +0.0317406 0.107408 0.0337947 +-0.0280888 0.121741 0.0242898 +-0.0114519 0.126605 -0.00415103 +-0.00942316 0.129915 0.019193 +0.0305901 0.117314 -0.000462026 +-0.00449008 0.116939 0.0397737 +-0.0174829 0.0365879 0.0522725 +-0.0480399 0.136313 0.0145941 +0.0078895 0.0386539 0.0453509 +-0.059976 0.125502 0.0413668 +0.00922467 0.131237 0.0102208 +-0.0164537 0.0924837 0.0552632 +-0.0397063 0.0680709 -0.01554 +0.0144891 0.0990552 0.047648 +-0.0194892 0.0771957 0.0553527 +0.00314961 0.0344334 0.00286196 +0.0322227 0.0828447 -0.0192606 +-0.086166 0.115735 0.00128445 +-0.0628659 0.161473 -0.0525859 +-0.0897633 0.133813 0.0392039 +-0.0931113 0.126933 0.0272608 +0.0442448 0.0902943 -0.00180307 +0.0383075 0.041189 0.0258499 +-0.038679 0.0636652 -0.0136088 +-0.0640888 0.165507 -0.029848 +0.00695321 0.13108 0.0193768 +-0.0281007 0.162292 -0.0150733 +0.0192374 0.0749637 -0.0278698 +0.0244608 0.0941673 -0.021671 +0.0131476 0.100265 -0.0227775 +-0.0301385 0.166718 -0.0165418 +-0.0651412 0.159482 -0.0565006 +0.0342867 0.0700233 0.0389954 +-0.0695171 0.141232 -0.00845814 +-0.0904292 0.148866 0.0241237 +-0.0253439 0.0693349 0.0439513 +-0.0623474 0.166249 -0.0485903 +-0.0193027 0.0445534 0.0525624 +-0.0258791 0.105846 -0.022482 +-0.0331634 0.0381954 -0.000525199 +-0.0640739 0.0617863 -0.0011495 +0.0413993 0.0942972 -0.00577735 +-0.030183 0.155051 -0.00785968 +-0.0209835 0.159643 -0.00415092 +0.0227131 0.118044 0.0330191 +-0.0268485 0.124528 0.000469072 +-0.0241773 0.17417 -0.0202285 +-0.012912 0.0339283 -0.0204101 +0.0235417 0.109895 0.0378397 +-0.0800641 0.107437 0.0308747 +-0.0374695 0.0383458 -0.0088734 +0.0372523 0.0646113 0.0362056 +-0.0324907 0.0817336 0.0416408 +0.0138217 0.125251 -0.00497301 +-0.0427639 0.126553 -0.0057736 +-0.0467249 0.0753156 -0.0175399 +-0.0861037 0.109061 0.0193453 +0.0206619 0.0348672 0.0224824 +-0.0804996 0.127434 0.052885 +0.00919876 0.0964636 -0.0261302 +-0.0321423 0.0806683 -0.0305334 +0.0242996 0.120934 0.0286395 +-0.0429021 0.171269 -0.00696466 +0.0145253 0.126603 0.0278836 +-0.0657391 0.142564 -0.0101503 +-0.0125598 0.0943837 -0.0340846 +-0.0809608 0.0720856 0.0135459 +-0.0230054 0.0386784 -0.0118395 +-0.0234022 0.157317 -0.0083471 +-0.0700956 0.06197 0.00856658 +0.0361469 0.0875521 0.038321 +-0.00703497 0.101085 0.0445106 +-0.0217097 0.181473 -0.0209735 +-0.0310875 0.179405 -0.00921261 +0.00340822 0.117733 -0.0168392 +-0.0306641 0.062253 -0.0214244 +-0.00851812 0.0604987 0.0555487 +-0.0105044 0.0745085 0.0567054 +-0.00265316 0.0511482 -0.0311061 +-0.0764634 0.157616 -0.00941011 +-0.0224335 0.0371726 0.0541058 +-0.0432016 0.171084 -0.00202068 +-0.0523174 0.057382 0.0266177 +0.0595665 0.0566863 0.0161765 +0.00171621 0.126464 -0.00619605 +-0.0635036 0.095949 0.0432601 +-0.00748541 0.0856517 0.0572176 +-0.0142172 0.114376 -0.0171381 +-0.0106623 0.0511436 -0.032067 +-0.0292482 0.0345559 -0.0204636 +-0.0369573 0.0340894 0.0258321 +-0.0544756 0.0413314 0.0465715 +-0.0940023 0.125512 0.016258 +-0.0685195 0.0916417 0.0424016 +-0.076491 0.140037 0.0480957 +-0.021763 0.159801 -0.0034487 +0.0107652 0.110575 -0.0191667 +-0.0296434 0.0486725 0.0446006 +0.0205709 0.0463131 0.0417824 +0.0371829 0.0726727 0.036151 +0.00170794 0.1258 0.0319097 +0.00812607 0.108726 -0.0199063 +-0.088847 0.0874807 0.0104655 +-0.0614823 0.0761372 0.0417782 +-0.077632 0.077285 -0.00766199 +-0.0914347 0.132413 0.0262297 +-0.0380759 0.16073 -0.01276 +-0.0580841 0.132712 -0.00634758 +-0.00546375 0.117984 -0.0150376 +-0.0825526 0.110518 0.0415894 +-0.0567945 0.0589511 -0.00142935 +-0.00849356 0.0842936 0.0575382 +-0.0464941 0.0987388 0.0427545 +0.0199235 0.0365522 0.038924 +-0.0181358 0.159669 -0.00704365 +0.0214919 0.0906421 0.0482356 +-0.0308996 0.107699 -0.0200324 +0.0310327 0.118783 0.0168832 +-0.049761 0.069112 0.038562 +-0.0388211 0.091456 -0.0235256 +-0.0139638 0.180133 -0.0220777 +0.0153381 0.127037 -0.000904662 +-0.0219975 0.107603 -0.0219593 +-0.0448317 0.0927682 -0.0220335 +-0.0127292 0.0909963 -0.036642 +0.0174939 0.0350076 -0.00788091 +-0.016176 0.165587 -0.0188354 +0.0276821 0.0862408 0.0453967 +-0.00121407 0.102594 0.0440764 +-0.0167645 0.162218 -0.0151135 +-0.0446938 0.0665983 -0.0153032 +-0.0709583 0.135514 -0.00804855 +0.0152869 0.0794603 0.0538116 +-0.028039 0.0849631 0.0475609 +-0.0252122 0.108563 -0.020971 +-0.0501485 0.141642 0.00337658 +-0.0802229 0.143442 0.044034 +-0.0728736 0.0659781 0.0205309 +-0.083982 0.134868 -0.000717316 +-0.070349 0.172644 -0.037875 +-0.015485 0.0673895 0.0543529 +-0.0374989 0.108379 0.0375203 +0.0194281 0.0399108 -0.0177171 +-0.0508059 0.0898498 -0.0218327 +-0.0916067 0.130926 0.00923792 +-0.0657827 0.158229 -0.0103034 +0.00352818 0.0386899 -0.0121702 +-0.0147383 0.10835 -0.0207588 +-0.0496313 0.111407 -0.0178803 +-0.0413837 0.128875 0.00906534 +-0.0523163 0.134709 -0.00240246 +0.00961512 0.122501 0.0348066 +-0.0755017 0.140041 0.0481 +-0.0678883 0.145704 -0.022127 +-0.0230319 0.0374462 0.0541561 +-0.00425848 0.0961384 -0.0318255 +-0.0895594 0.135155 0.0312102 +-0.0623104 0.0594537 0.00702264 +0.00422975 0.0796448 -0.0342885 +-0.0618471 0.153751 -0.0215773 +-0.00905798 0.034739 0.0470958 +-0.0575286 0.126935 0.0396404 +-0.0298496 0.180049 -0.0116061 +-0.0317613 0.0567558 -0.0133876 +-0.0839019 0.105911 0.0262878 +-0.0715304 0.102729 0.03849 +0.0144241 0.127312 -0.00121761 +-0.0787914 0.14589 -0.00282549 +-0.00925999 0.0421824 0.0495336 +-0.0284001 0.0385729 0.034376 +-0.0690967 0.148938 0.0398784 +-0.0561651 0.153258 0.0280528 +0.0408211 0.10424 0.0171662 +0.0569661 0.0701435 0.00568959 +-0.0318479 0.09723 -0.023215 +0.00233723 0.0391647 0.0293747 +-0.0839319 0.117006 0.0485566 +-0.0310508 0.0693178 -0.0264576 +-0.0270974 0.0794315 0.0481933 +-0.00975454 0.0728065 -0.0376393 +-0.0907216 0.131054 0.0332303 +-0.00149823 0.0535022 0.0547476 +-0.0920442 0.126938 0.0322524 +-0.049095 0.140149 0.0113941 +-0.0605441 0.113772 -0.0142303 +-0.00976932 0.0756525 -0.0380331 +-0.0878532 0.127045 0.0464651 +-0.010533 0.178644 -0.025906 +0.0593699 0.0691831 0.0171767 +-0.024781 0.0769658 -0.0376048 +0.0423711 0.0575006 -0.00528711 +0.0460928 0.061454 -0.00359733 +-0.0408554 0.101386 -0.0212924 +-0.0446853 0.169846 -0.00596698 +-0.0499657 0.0572278 0.0334797 +-0.0145604 0.127706 0.0231688 +-0.0624931 0.153672 -0.0316068 +0.0559752 0.0635544 0.0263749 +-0.0741944 0.0678888 0.022137 +0.0128784 0.0534523 0.0500797 +-0.014497 0.082865 0.0570346 +0.0100519 0.0351376 0.0435561 +-0.0764979 0.135856 0.0507679 +-0.0505672 0.0545537 0.0173366 +-0.073291 0.0682485 0.025526 +0.0168973 0.0504721 0.0453108 +0.0597511 0.0567143 0.0111681 +0.00962081 0.119433 -0.0146957 +-0.0261763 0.0931476 0.0454624 +-0.0034975 0.0661744 0.0565538 +-0.0174573 0.0601724 0.0514531 +0.0587589 0.059387 0.00417226 +-0.0388249 0.122181 0.0278208 +-0.0685252 0.175096 -0.0570393 +-0.0628061 0.0896011 -0.0190246 +0.0306772 0.118704 0.0210209 +-0.0655003 0.083298 0.0438708 +0.0560223 0.0713695 0.00682475 +-0.0298518 0.100096 -0.0230635 +-0.0422245 0.148296 -0.00246029 +-0.00149333 0.112805 0.0421166 +-0.0829153 0.0925695 0.0313446 +-0.0394018 0.0468721 -0.0179145 +-0.0784825 0.135851 0.0506454 +-0.0734876 0.127439 0.0525898 +-0.0280931 0.033441 -0.0266965 +0.0607571 0.0609589 0.0141669 +-0.0692316 0.172989 -0.0403442 +-0.0397906 0.162354 0.00198884 +-0.0505067 0.0805184 0.044061 +-0.0716519 0.156794 -0.0409079 +0.0407885 0.10564 0.00816522 +-0.00717727 0.0999816 0.0485274 +-0.0646289 0.156694 -0.0465976 +-0.089623 0.0983355 0.0134109 +0.00279805 0.0339767 -0.0211497 +-0.0142152 0.17272 -0.0253585 +-0.0396036 0.174135 -0.00601981 +-0.0669938 0.0358141 0.0313063 +-0.0497731 0.0627792 0.0345527 +0.0229897 0.121378 0.0295865 +-0.0457551 0.0336493 -0.0154708 +-0.0539285 0.152376 0.0223916 +-0.0664975 0.108359 0.0380432 +0.0293811 0.04325 -0.00550019 +-0.0166832 0.0525719 -0.0322771 +0.0164877 0.105762 0.0431793 +-0.0171637 0.0956465 -0.0313986 +-0.0314959 0.111117 0.0366419 +-0.0788622 0.169438 -0.0409605 +-0.0673163 0.13687 0.0448543 +-0.00450662 0.0828853 0.0572758 +-0.086732 0.125284 -0.00171301 +-0.0339024 0.123839 0.0236394 +-0.0665906 0.0686018 0.0336345 +-0.0647932 0.143933 0.0397518 +0.0283692 0.0466516 -0.00870467 +0.0329293 0.104175 -0.0123189 +-0.0761401 0.0728821 0.0296904 +-0.0142042 0.169737 -0.0232161 +-0.068634 0.151185 -0.044245 +-0.0135754 0.0347863 -0.0255909 +0.019989 0.0436019 0.0426848 +-0.015693 0.057044 -0.0346551 +-0.00164401 0.0482043 -0.0300627 +-0.0311183 0.172722 -0.00474304 +-0.0250193 0.118984 -0.0119284 +-0.0325683 0.124672 -0.00180773 +-0.0781672 0.0694403 0.0164131 +0.0335232 0.0673414 0.0396281 +-0.0927165 0.117489 0.0383035 +0.0402856 0.10561 0.017163 +-0.0284035 0.166813 -0.0078902 +-0.00473635 0.13076 0.00793547 +-0.0216948 0.0386212 -0.00966204 +-0.0436382 0.11786 -0.014681 +0.0533192 0.0587911 -0.00291354 +-0.0153516 0.0970497 -0.0288687 +-0.0434963 0.0661943 0.0406667 +-0.0466152 0.145766 -0.000178732 +-0.0206008 0.0386838 -0.0150911 +-0.0509261 0.0335608 -0.00538789 +-0.0896998 0.137926 0.0341919 +-0.0278811 0.0378156 0.0189805 +0.0364086 0.0854455 -0.0167057 +0.0349072 0.0875927 0.04003 +-0.0243811 0.0738035 0.0484997 +-0.0470246 0.133586 0.0187098 +0.00950521 0.0772084 0.0556135 +-0.0192998 0.0985099 -0.0244 +0.0447739 0.0438422 0.0248039 +-0.0504965 0.0819144 0.0441383 +-0.0346492 0.0577427 -0.0111408 +-0.048101 0.135891 0.0168055 +0.00147386 0.103921 -0.02207 +0.0494979 0.0678406 0.0265165 +0.00621357 0.0880484 -0.0332214 +-0.0763594 0.158279 -0.023921 +0.0359549 0.0646627 0.0378653 +-0.0462327 0.128102 0.0242709 +-0.0570384 0.142741 -0.0023851 +-0.0156536 0.0496375 -0.0309655 +-0.0157015 0.164 -0.0105798 +0.0160661 0.0349193 -0.0155613 +-0.0555615 0.0615422 -0.00607893 +-0.0506452 0.142899 0.00154993 +0.0227041 0.124378 0.0023667 +-0.0690811 0.0343024 0.0100819 +0.0296092 0.114943 -0.00583865 +0.0252655 0.0864752 -0.0236184 +-0.0579352 0.153021 -0.000467328 +-0.0699851 0.168026 -0.0510102 +-0.0649515 0.126767 -0.00875296 +-0.0310902 0.124844 0.00108587 +-0.07951 0.149797 0.0367578 +-0.0514931 0.156432 0.0104716 +-0.0854224 0.0885478 -0.00153705 +-0.0622051 0.0333895 -0.00205752 +-0.00958914 0.0376967 -0.0257201 +0.0438525 0.0874765 0.0251696 +-0.00448652 0.114189 0.0411781 +-0.0741351 0.0860483 0.039718 +-0.0162681 0.118552 -0.0135478 +-0.00571384 0.0655793 -0.035147 +-0.051609 0.164108 -0.000948719 +-0.0346229 0.116833 -0.0136016 +0.0105065 0.107115 0.0414414 +-0.0484736 0.0917654 0.0440291 +9.10767e-05 0.108392 -0.0207972 +0.0522547 0.0611036 -0.00320855 +0.00856462 0.11946 -0.0147195 +0.0326237 0.0768475 0.0419257 +0.0282302 0.0872832 -0.0216049 +-0.0693757 0.155378 0.0277002 +-0.0182673 0.180142 -0.0177524 +-0.0285043 0.0545632 0.0363758 +-0.0218074 0.0756618 -0.0388536 +-0.0633749 0.1608 -0.057006 +-0.0892506 0.151522 0.0201032 +-0.0472272 0.0642822 0.0376403 +-0.0699509 0.134055 -0.00826728 +-0.0820286 0.074884 0.0125291 +-0.0576046 0.151067 0.0326375 +-0.0425494 0.0346163 0.040046 +-0.0619058 0.105434 -0.0174028 +-0.0753497 0.108878 0.0391875 +-0.0594974 0.0946317 0.0447571 +0.013384 0.078066 0.0545225 +-0.0431375 0.160652 -0.0100842 +-0.0258359 0.0945143 -0.0266147 +-0.0245117 0.0536384 0.0409132 +-0.0664072 0.169883 -0.0364165 +-0.0726615 0.0640995 0.00799778 +-0.0451579 0.0395668 -0.0202936 +-0.00773777 0.0727528 -0.0370634 +0.0135086 0.116829 0.0366875 +-0.0836964 0.106272 0.0263573 +-0.0303071 0.0339954 0.0147064 +-0.000759903 0.102685 -0.0227147 +0.0258263 0.0624492 -0.0231007 +-0.0674047 0.179923 -0.0541082 +-0.0857367 0.111526 0.0418488 +-0.0560454 0.148678 -0.00182226 +-0.0476918 0.0635243 -0.0129244 +-0.0642806 0.164881 -0.0270495 +-0.0574962 0.108397 0.0389105 +0.00241269 0.0347278 -0.0230504 +-0.00449379 0.0548276 0.0540049 +-0.0627171 0.147502 -0.0125815 +-0.0213288 0.0581411 0.0459349 +-0.0608837 0.0367165 0.0449842 +0.0211328 0.126504 0.0131782 +0.00740015 0.0418656 -0.0238182 +-0.0737971 0.148055 0.0412991 +-0.00374732 0.0726737 -0.0357771 +-0.0204954 0.103009 0.0433484 +-0.0210495 0.127369 0.0106273 +0.0306407 0.0431175 0.0298982 +0.0109957 0.0698921 0.0545336 +-0.0439898 0.0350927 -0.0256307 +-0.0670986 0.0347786 0.0136227 +0.0215717 0.0401714 -0.00970048 +0.0214864 0.0934187 0.0477129 +-0.0174765 0.0715932 0.0547125 +-0.0246025 0.0824997 0.0540808 +-0.0774249 0.155543 -0.015906 +-0.00557868 0.109705 -0.0221876 +-0.00234233 0.10113 0.044176 +0.0314145 0.0384146 -0.00113672 +-0.0708385 0.0965734 -0.0156262 +-0.0358426 0.0345846 0.0397566 +0.0166934 0.111749 -0.0164123 +-0.0461447 0.0396778 -0.0162811 +0.0460542 0.0820303 0.0141751 +0.024254 0.0776067 -0.0252579 +-0.0585858 0.14384 -0.00236725 +-0.0590542 0.155341 0.0226214 +-0.0425019 0.049221 0.0396798 +-0.0737231 0.156865 -0.0279142 +-0.0640946 0.155219 -0.00966954 +-0.0136075 0.0420889 -0.0267571 +-0.0149109 0.0391012 0.0366853 +-0.0768619 0.116386 -0.00596474 +0.0464851 0.0651547 0.0281822 +-0.0672589 0.077344 0.0400985 +-0.0768893 0.176966 -0.046083 +-0.0870251 0.136346 0.00321516 +-0.046566 0.128368 -0.00156221 +-0.0881324 0.103677 0.0173573 +-0.0358716 0.10426 -0.0206916 +-0.00158589 0.110252 -0.0207823 +-0.0645869 0.117148 0.0471018 +-0.0493593 0.121175 0.032055 +0.00351232 0.0575709 0.0538233 +-0.0114209 0.107659 -0.022044 +-0.0134464 0.0388153 -0.00818864 +-0.0485053 0.108444 0.0391022 +-0.0783276 0.0839475 -0.0105972 +-0.0422429 0.129048 0.0117038 +0.0230175 0.0903576 -0.0236845 +-0.0840147 0.0993167 -0.00358504 +-0.0538991 0.108397 -0.0185513 +-0.00168424 0.0583535 -0.0329231 +0.00135578 0.0347199 0.040341 +-0.0858041 0.131212 0.0485351 +0.0546169 0.0694261 0.0240301 +0.0349752 0.0684447 -0.0157877 +0.0095201 0.0716259 0.0554078 +-0.00749453 0.0952341 0.0547544 +-0.019553 0.163976 -0.00913576 +-0.0640343 0.0457636 0.00169557 +-0.017901 0.0381554 0.0134869 +0.0133255 0.0594987 -0.0290386 +0.00648582 0.047441 0.0497645 +-0.0239518 0.123773 0.0227902 +-0.0318252 0.0609455 -0.0174329 +-0.0928746 0.122834 0.0282828 +0.00226062 0.131309 0.0062251 +-0.0414935 0.112526 0.0356807 +0.0202561 0.0791555 -0.0271913 +-0.0331056 0.0338156 0.0161014 +0.0297787 0.0446629 0.032196 +-0.0792621 0.084024 -0.00957002 +-0.0697175 0.155623 0.0028257 +-0.0391149 0.0337868 -0.0291782 +-0.0893977 0.135151 0.0292068 +0.04371 0.0987542 0.0111628 +-0.0281559 0.0380199 0.00608926 +0.0552084 0.0493743 0.00621284 +-0.0861539 0.149931 0.0300167 +0.042296 0.0775058 -0.00576261 +0.0415736 0.0765545 0.0302447 +-0.0532046 0.133931 0.0318349 +-0.0939252 0.118758 0.016301 +-0.027019 0.123094 -0.00421217 +-0.0471842 0.0355635 -0.0162689 +0.0137449 0.12859 0.0232984 +-0.0388402 0.0957243 -0.0226737 +0.0393482 0.0966985 0.0306886 +0.0405486 0.0596459 0.0301455 +-0.083332 0.0992842 -0.00460735 +0.0403123 0.0491555 -0.00629774 +-0.0135559 0.0378433 -0.0166597 +-0.0655014 0.0958911 0.0424957 +-0.00976126 0.0358952 0.049479 +-0.0624412 0.150596 -0.00171821 +-0.064981 0.131148 -0.00860586 +-0.0763864 0.109432 0.0420745 +-0.00149437 0.0801423 0.0576885 +-0.0163316 0.166866 -0.0132843 +-0.0862104 0.140486 0.00518463 +-0.0484837 0.159357 0.00832828 +-0.063685 0.169395 -0.0455915 +-0.0676574 0.0344024 0.0120657 +-0.0324957 0.0889348 0.0439847 +-0.0285919 0.0494861 -0.0235098 +-0.0925344 0.124191 0.0302708 +-0.0898664 0.135182 0.0372006 +-0.0675175 0.146991 0.0409028 +-0.0643109 0.0721294 0.0381075 +0.0336777 0.107392 0.0312726 +0.0416487 0.0806113 0.0304012 +0.0108925 0.130607 0.00797847 +0.00350574 0.071674 0.0559901 +-0.0687556 0.0680025 -0.00564855 +-0.0668955 0.116554 -0.00922261 +-0.0147132 0.0599449 -0.0358879 +-0.023059 0.0825255 0.0553698 +-0.0305016 0.108423 0.0388291 +-0.0575086 0.0507939 0.00466306 +-0.0811465 0.155009 0.0163089 +-0.0281138 0.125637 0.0139342 +0.00450187 0.0575756 0.0536585 +-0.0124992 0.0745024 0.0565746 +0.030795 0.119096 0.00823469 +0.0112449 0.0943173 -0.0278535 +-0.00350029 0.0856691 0.0572933 +-0.0135749 0.18083 -0.0284353 +-0.0387321 0.0724952 -0.0174162 +-0.0366243 0.151025 -0.00298791 +0.0282135 0.0579727 -0.0197309 +-0.0828916 0.0775885 0.00151125 +-0.00164877 0.0496874 -0.0307148 +0.0386307 0.106935 0.00116239 +-0.0871923 0.0861012 0.021463 +-0.0760841 0.104861 0.0354581 +-0.0244788 0.0486839 0.0492934 +-0.0883766 0.141855 0.0366703 +-0.0509887 0.143164 0.0163768 +-0.0496168 0.0561697 -0.00993077 +-0.00378208 0.0390472 -0.0102032 +-0.0843646 0.087116 -0.00354087 +0.00990951 0.0819581 0.0548044 +-0.0425006 0.0888114 0.0424593 +-0.0728637 0.099356 -0.013752 +-0.0206243 0.0436469 -0.0283402 +-0.0828496 0.117685 -0.00271563 +-0.0715585 0.181081 -0.0541999 +-0.0338561 0.0475081 -0.0226504 +0.00224005 0.0768974 -0.0352993 +-0.0935755 0.117419 0.0183042 +-0.0754318 0.155396 0.00808247 +-0.0674328 0.172594 -0.0425404 +0.027377 0.122298 0.0126488 +0.0174898 0.0874014 0.0499964 +0.0109848 0.123169 0.033628 +-0.0367194 0.0710436 -0.0172369 +-0.0285781 0.0423048 0.0521933 +0.033068 0.0984004 -0.0141329 +-0.0475947 0.0601221 0.0367025 +-0.0635768 0.155628 0.0253794 +0.0262764 0.100811 0.0416679 +0.0147323 0.129513 0.0122405 +0.0321413 0.0366814 0.019545 +-0.00794631 0.127212 -0.00487976 +0.0374618 0.0376657 0.00680115 +-0.0450017 0.0355455 0.0439167 +-0.0613089 0.0634913 0.028639 +-0.0275028 0.0988006 0.0435593 +0.051337 0.0560222 -0.00385605 +-0.0701879 0.175082 -0.0550269 +-0.0424973 0.155091 0.0068798 +-0.0156018 0.0435495 -0.027203 +-0.0387577 0.0797624 -0.0199123 +0.036687 0.0909845 -0.0142871 +-0.0621605 0.170953 -0.0526019 +-0.0503178 0.0515583 0.0186309 +0.0183954 0.0645286 0.0493775 +-0.0816036 0.0774754 -0.00149976 +-0.0167638 0.0728801 -0.0389011 +-0.0612458 0.141043 0.0360828 +-0.0650382 0.153613 0.000196596 +-0.0506214 0.0416531 0.0455899 +-0.0218256 0.086832 -0.0376579 +-0.0368977 0.110447 -0.0189068 +-0.0390704 0.124042 0.0247581 +-0.0145052 0.0544906 0.0506759 +0.0346875 0.0955379 0.0380285 +-0.0427281 0.0478381 -0.0112773 +-0.0589463 0.0436711 -0.00636451 +0.044641 0.0945606 0.00417916 +0.0417801 0.041383 0.0227466 +-0.066757 0.170863 -0.0580345 +-0.0104152 0.0998773 0.0473736 +-0.0467325 0.133652 0.0114554 +-0.0376877 0.163829 -0.000238726 +-0.0725153 0.142823 0.0458217 +0.0207674 0.103342 -0.0194283 +-0.00540678 0.121074 -0.0123374 +-0.0424989 0.102887 0.0413486 +-0.0462349 0.0354247 -0.01929 +0.0180016 0.125305 0.0262968 +-0.0162469 0.184587 -0.0200786 +-0.079084 0.0994215 0.0343706 +-0.0557053 0.132552 0.0352577 +-0.0512629 0.0388692 0.0464256 +-0.0515065 0.160835 0.00704803 +-0.0826893 0.152358 0.0291683 +-0.0584964 0.0932599 0.0452695 +0.024564 0.103479 -0.0175815 +-0.0846694 0.0831371 0.000497005 +-0.0865668 0.118992 0.0483015 +-0.0192412 0.184576 -0.0155995 +-0.00659114 0.03769 -0.0254352 +-0.0245806 0.124862 0.0196194 +-0.0368731 0.105664 -0.0202847 +-0.0621883 0.177235 -0.0596222 +-0.0672213 0.1608 -0.0122924 +-0.0303274 0.0375897 0.0276802 +-0.0234293 0.0522884 0.0423691 +0.0538492 0.0711959 0.0223128 +0.00550075 0.0772523 0.0562045 +0.0438483 0.076237 -0.00278527 +0.00633738 0.0581963 -0.0307089 +-0.0646256 0.0674757 -0.0084666 +-0.0310521 0.0450006 0.0489427 +0.0109104 0.126748 -0.00460652 +-0.0409513 0.128783 0.00774742 +-0.000502218 0.0938722 0.0552243 +-0.0166066 0.035315 -0.0186674 +-0.02118 0.169768 -0.013264 +-0.048723 0.166988 -0.000980568 +0.0301667 0.116977 -0.00204442 +-0.0129037 0.181603 -0.0240442 +-0.0461681 0.033576 -0.00628041 +0.0377831 0.0813859 -0.0147095 +-0.050774 0.143198 0.0153986 +-0.0591392 0.118534 -0.0111826 +0.0601642 0.0622865 0.0071402 +0.0055201 0.0674746 0.0556049 +0.0539548 0.0603844 -0.00239402 +0.0345037 0.0468848 0.0307194 +-0.0226112 0.04084 -0.0289768 +-0.088041 0.0995721 0.00642464 +0.0313753 0.111403 0.0314731 +-0.0818093 0.0776109 0.0245029 +0.0196586 0.112307 -0.0150514 +-0.0547371 0.114833 -0.0154193 +-0.00335753 0.11894 -0.0140663 +-0.0675878 0.0614559 0.0185068 +-0.0374891 0.0973119 0.0427062 +-0.0618754 0.0967815 -0.0181397 +-0.0177948 0.161129 -0.00657359 +-0.0762411 0.0901005 0.0388673 +-0.00749994 0.0647419 0.0560829 +-0.0872439 0.132483 0.0457019 +-0.0207923 0.0756874 -0.0390657 +0.00773677 0.0341095 0.00222437 +-0.00405506 0.101077 0.0451334 +-0.0537766 0.0826585 -0.0215583 +-0.0484986 0.0425777 0.0442245 +0.0370248 0.10907 0.0248298 +0.0550045 0.0727719 0.0183019 +-0.0531047 0.0345095 0.0361399 +0.0240424 0.122784 0.0256717 +-0.0321586 0.0349269 0.0472031 +-0.0487458 0.123267 -0.0102852 +0.0164927 0.107123 0.0418084 +-0.0518639 0.0999443 -0.0218198 +-0.0259535 0.0592275 0.0392168 +-0.0169683 0.186741 -0.0196674 +0.012157 0.123544 0.032833 +-0.0236685 0.0919017 0.0500491 +0.0048864 0.127407 -0.00526463 +-0.00324909 0.0389153 -0.000648163 +0.0108689 0.0576426 0.0524778 +0.0396737 0.107002 0.0161655 +-0.0816849 0.073475 0.00953613 +-0.0743109 0.165184 -0.0390136 +-0.0728909 0.120866 -0.00826881 +0.040969 0.0926354 0.0294955 +-0.00410534 0.0385566 0.0231802 +-0.0167703 0.0742961 -0.0390024 +0.0376363 0.109584 0.0207569 +0.00538144 0.0464854 -0.0270709 +-0.0503176 0.0388958 0.046006 +-0.0793777 0.154922 0.0242883 +-0.0476898 0.0679558 -0.0146484 +-0.0108886 0.108738 -0.0217426 +-0.0532571 0.151368 0.0204421 +-0.068651 0.163792 -0.0529788 +-0.0441151 0.0643553 0.040206 +-0.0275094 0.107088 0.0401149 +-0.0275566 0.0890776 0.0469337 +-0.0274957 0.102963 0.0425886 +-0.0266136 0.0837142 0.0504396 +0.015157 0.122808 -0.00836184 +-0.0234279 0.0636514 0.0436342 +-0.00941329 0.0943623 -0.0340451 +-0.0174189 0.178658 -0.0183022 +-0.0187779 0.183117 -0.0166827 +0.0130462 0.129592 0.0201813 +-0.0751825 0.149958 -0.0238676 +0.00897367 0.131122 0.0172577 +0.0483469 0.0589383 -0.00490848 +0.0422406 0.0986762 0.0221715 +-0.0921564 0.130934 0.011242 +-0.0327106 0.0764924 -0.028531 +0.0102149 0.0725802 0.055192 +-0.0636711 0.0593571 0.0158341 +-0.0123306 0.0394822 0.0386711 +-0.0718333 0.156164 0.022455 +-0.0864971 0.150096 0.00821548 +-0.0110742 0.123419 -0.00875247 +-0.080097 0.11274 -0.00201289 +-0.00271881 0.0655507 -0.0345764 +0.00140103 0.0390882 -0.0248121 +-0.0618299 0.0939366 -0.0189413 +-0.0716693 0.147461 -0.0281971 +-0.0231858 0.17269 -0.0205136 +-0.0637876 0.155678 -0.0402328 +-0.0228589 0.0637031 0.0444908 +-0.0238626 0.169762 -0.0118641 +-0.0752191 0.155599 0.0242023 +-0.0345019 0.0461718 -0.0254652 +-0.01605 0.0946681 0.0536372 +0.0246905 0.0477085 0.0389599 +0.0101881 0.0341976 -0.00109267 +-0.0293326 0.154386 -0.00360575 +0.00276097 0.131717 0.0121378 +-0.0859012 0.0899317 0.000454719 +-0.0297834 0.121969 -0.0069874 +-0.0297126 0.0508986 -0.0203549 +-0.0888501 0.151809 0.0151852 +-0.0824868 0.0965084 -0.00559576 +-0.0279025 0.124426 0.000511349 +-0.0111071 0.0879305 -0.0374747 +-0.0895782 0.133632 0.00522749 +-0.0325779 0.0341004 0.0231549 +-0.087069 0.100891 0.00537711 +-0.0182966 0.038653 -0.00715499 +-0.0181652 0.097581 -0.0254283 +0.00716304 0.0378885 -0.010707 +-0.0117789 0.0582633 0.0533407 +-0.0679898 0.154859 0.0296647 +0.0270346 0.0384464 0.0278157 +-0.0446977 0.147484 -0.0025954 +-0.0797208 0.0757926 0.0264575 +-0.0827795 0.113314 0.0464356 +-0.0405007 0.118003 0.0314814 +0.00913581 0.103011 -0.0206427 +-0.0712761 0.153449 0.0330143 +0.0296113 0.108994 -0.0114792 +0.0120747 0.0958655 -0.0254962 +-0.0357119 0.0695868 -0.0167299 +-0.0777217 0.159728 -0.0179219 +-0.0619192 0.0343817 0.0361087 +-0.0839142 0.0843714 -0.00355138 +0.0295472 0.11806 0.0262972 +-0.0344935 0.0733008 0.0417052 +0.0305902 0.0996469 -0.0155371 +-0.0731059 0.151228 -0.0378853 +-0.0740388 0.151266 -0.032878 +-0.0419789 0.152954 -0.00736227 +-0.00349089 0.112806 0.0419152 +0.00607582 0.0348373 0.023168 +-0.000568628 0.0388214 0.0254737 +0.0445611 0.0931651 0.0181595 +-0.0469298 0.126751 0.026776 +-0.0318643 0.104333 -0.0219242 +0.0119312 0.0725978 0.0541603 +-0.0435985 0.108724 -0.0190759 +-0.0274517 0.043312 0.0519115 +-0.00149233 0.077429 0.0585147 +-0.0618993 0.0433992 0.0415482 +0.0131559 0.129936 0.00738875 +0.00749621 0.107111 0.0412811 +0.0354668 0.0573224 -0.0106723 +-0.0211412 0.0652998 0.0483526 +-0.00680045 0.129424 0.0244883 +-0.0187344 0.126979 0.0202236 +0.00853139 0.0813381 0.0552215 +-0.0254455 0.0389929 0.0381911 +-0.0507728 0.111366 -0.017973 +-0.027716 0.0387019 -0.0165247 +-0.000266462 0.0936214 -0.0332218 +-0.0855847 0.0806062 0.0194802 +0.0100369 0.130324 0.00340984 +-0.0449017 0.148739 -0.00386394 +-0.0321132 0.0482449 -0.0223421 +-0.0893696 0.140675 0.0341739 +0.0448261 0.0875458 0.0221634 +-0.0454912 0.0719252 0.0419203 +-0.0718306 0.148291 -0.0327712 +-0.0812513 0.108802 0.0293202 +0.0429574 0.0859786 -0.00579554 +-0.0338336 0.0380945 -0.0153271 +-0.060738 0.148827 -0.00180261 +-0.0568701 0.141076 -0.0033696 +-0.0358396 0.125396 0.0214464 +-0.0789386 0.168616 -0.0354931 +-0.0315115 0.108439 0.0386203 +-0.0842691 0.117693 0.0488129 +-0.032501 0.101545 0.0423652 +-0.0289779 0.174216 -0.00689295 +-0.0622726 0.163207 -0.0582148 +-0.00885889 0.172674 -0.0247544 +-0.0519291 0.13698 0.0263868 +-0.0829532 0.112769 0.000219247 +-0.0237394 0.038003 0.0142418 +0.0321413 0.0513188 -0.0087021 +-0.0473947 0.0359569 0.0452833 +-0.0488828 0.108449 -0.0190525 +0.0415402 0.0928967 -0.0067838 +-0.0800241 0.0745873 0.0239149 +0.005197 0.0866258 -0.0333998 +0.00148166 0.107215 0.0427825 +-0.0694376 0.159556 -0.0509365 +-0.0306541 0.0650706 -0.0234343 +-0.0653365 0.167223 -0.0303028 +-0.0262324 0.15581 -0.00635861 +-0.0362329 0.165306 -0.00162934 +-0.00330758 0.0379537 -0.0147265 +-0.0267799 0.0893467 -0.0340353 +-0.0591073 0.155657 0.0168017 +-0.0331866 0.15511 0.000984746 +-0.0671323 0.152011 0.0359968 +0.0112495 0.0710359 -0.0320326 +-0.0289103 0.0508426 -0.0224168 +-0.0582351 0.043574 0.0153571 +-0.0770169 0.112922 0.0479771 +-0.0146932 0.0570315 -0.0346956 +-0.0735209 0.134443 0.0506533 +-0.0445794 0.130477 0.0137726 +-0.0744939 0.127436 0.052791 +-0.0376156 0.0492564 -0.0118933 +-0.0462534 0.123907 0.0259058 +-0.0434909 0.104315 0.0413728 +-0.0779429 0.0893818 -0.0115854 +-0.067492 0.10005 0.0413205 +-0.0882017 0.0949941 0.0238463 +0.0438775 0.06952 0.000229591 +-0.0171444 0.168289 -0.0207283 +-0.0236004 0.0383091 -0.00235181 +-0.0697889 0.172796 -0.0390999 +-0.0291426 0.042089 -0.0296009 +-0.0446441 0.0338442 0.00651202 +-0.000500925 0.121055 0.0369996 +0.022042 0.12426 0.000701449 +0.00803725 0.125889 0.0313 +-0.0517799 0.0840941 -0.0216716 +-0.0145005 0.0842486 0.056982 +-0.0886066 0.113065 0.00725433 +0.0156656 0.0713152 0.0525386 +-0.0164665 0.068805 0.0544258 +0.0182285 0.0820502 -0.0281776 +-0.00610364 0.0386755 0.000846714 +-0.0599938 0.126727 -0.00781868 +-0.0155017 0.100285 0.044225 +-0.0638562 0.0423917 -0.00506847 +-0.0444796 0.0338614 0.0280014 +-0.000499767 0.100727 0.0463954 +-0.0162094 0.172709 -0.0239586 +-0.0690346 0.0338087 0.00696066 +-0.062316 0.158431 -0.019584 +0.00644358 0.129282 -0.00129108 +0.0188124 0.0393785 0.042705 +-0.0847946 0.140657 0.0430258 +-0.0835274 0.0979539 0.0303801 +-0.0241902 0.160559 -0.0136368 +-0.06502 0.161419 -0.0172527 +-0.0772789 0.154395 0.0279022 +-0.0681261 0.15638 0.0193912 +-0.0337268 0.111492 -0.0180397 +-0.0323736 0.176483 -0.0134412 +-0.0291608 0.0806486 0.0445728 +-0.0846331 0.0781756 0.0181083 +-0.0498753 0.106996 -0.0192538 +0.00350083 0.0730867 0.0562031 +-0.0231171 0.0347933 0.0492623 +-0.0616059 0.0342155 0.0188015 +-0.0516 0.0545447 0.0296397 +-0.0763817 0.169448 -0.0429673 +-0.069513 0.17974 -0.0519891 +-0.0588484 0.13671 0.0342246 +-0.0780833 0.1597 -0.0209281 +0.00109253 0.113026 -0.0199046 +-0.0227366 0.157094 -0.00651614 +0.0344933 0.0929192 0.0394802 +-0.000408544 0.126448 -0.00615558 +-0.0805024 0.128853 0.052889 +-0.00020637 0.0947598 -0.0324026 +-0.089811 0.143072 0.0296513 +0.0321792 0.0929416 0.0413986 +-0.0145721 0.168692 -0.0222333 +0.0595491 0.0594739 0.0201736 +-0.0810451 0.0800939 -0.00453207 +-0.0267843 0.0880044 -0.0350453 +-0.040033 0.126629 -0.00388698 +-0.0208083 0.0348218 0.0462671 +-0.082826 0.11472 -0.00162443 +-0.0301654 0.12556 0.01613 +-0.0485613 0.0418518 -0.011173 +-0.0784181 0.163881 -0.0269512 +0.0387541 0.0617571 -0.00875906 +0.0464006 0.0792571 0.0121793 +-0.00359562 0.043415 -0.0257386 +-0.0333921 0.126443 0.0164188 +-0.00106292 0.130975 0.00499363 +-0.0668008 0.060458 0.0159676 +-0.0254977 0.107106 0.0408331 +-0.0682758 0.06442 0.0246162 +-0.0298175 0.125729 0.00888885 +-0.088267 0.147416 0.00925394 +0.0542609 0.050631 0.00222604 +0.0422118 0.100079 0.0191646 +-0.081175 0.14869 0.00117764 +-0.0344163 0.0346761 0.0417292 +-0.0623017 0.163119 -0.0425932 +-0.0298952 0.0565521 -0.0204023 +-0.076686 0.0781369 0.0338733 +-0.0338704 0.102893 -0.0218261 +-0.0355104 0.0775398 0.0419002 +-0.0584924 0.0630612 0.0296076 +0.0454221 0.0889974 0.0141646 +-0.0417964 0.0347181 0.00810808 +0.0363875 0.0505227 -0.00658574 +-0.053281 0.144674 0.0233765 +0.0262687 0.0352193 0.019674 +-0.0168964 0.123328 -0.00656517 +-0.0606083 0.118309 0.0403758 +0.00639612 0.0418759 -0.0239341 +0.0231261 0.0431609 -0.0107258 +-0.00718079 0.0390105 -0.0127195 +-0.00364386 0.0901332 -0.0356262 +-0.00854262 0.033753 -0.0231542 +-0.0124761 0.0531764 0.0512005 +-0.0231395 0.168252 -0.0189417 +0.0233331 0.0354178 0.02435 +-0.000241537 0.0397743 0.0467748 +-0.0723661 0.147118 -0.0228625 +-0.0517688 0.0612265 0.030932 +-0.063068 0.161146 -0.0557557 +-0.0279123 0.0793217 0.046185 +-0.0627986 0.0441541 -0.00325511 +-0.0165065 0.100263 0.0439632 +-0.0217072 0.0582569 -0.0327502 +0.0254642 0.12325 0.0062381 +-0.086501 0.0833246 0.0174861 +-0.074502 0.11613 0.052068 +0.032458 0.0910982 -0.0184345 +-0.0729629 0.155811 0.0249814 +-0.0506733 0.162525 0.00564316 +-0.0697867 0.034416 -0.00452426 +0.0189467 0.0754919 0.0520404 +-0.0165401 0.0997826 0.0440769 +-0.086829 0.0847067 0.0174745 +-0.0474936 0.146975 -0.00223523 +-0.065417 0.154594 -0.0449582 +-0.0614906 0.0590888 0.0075192 +-0.0686207 0.128453 0.0500102 +-0.023162 0.0958328 0.0451924 +-0.0258056 0.0550238 0.0391969 +-0.0102599 0.0407381 0.0498453 +-0.0664749 0.0875478 0.0443297 +0.0581415 0.0538012 0.00818348 +-0.0384918 0.0903063 0.0434643 +-0.0457684 0.132352 0.0133121 +-0.0728932 0.0941961 0.0410307 +-0.0809085 0.111715 -0.000772193 +-0.0833393 0.0979244 -0.00460929 +-0.0671961 0.15591 -0.00355939 +-0.0455114 0.0338265 0.027816 +0.01975 0.0343373 0.00255688 +-0.0875501 0.120326 0.0478169 +0.0353576 0.0505704 -0.00670224 +0.00356645 0.0339958 0.0125338 +0.0590653 0.0552605 0.0161784 +-0.084435 0.0791603 0.0205035 +-0.0255122 0.0349295 -0.0287387 +-0.0724789 0.110508 0.0438845 +0.00447986 0.0385716 -0.0118677 +-0.066989 0.136993 -0.00809827 +0.0384287 0.064558 0.0344028 +-0.0516036 0.0560273 -0.00839821 +-0.00350028 0.110017 0.0429859 +-0.0111634 0.0391658 0.035606 +0.0183426 0.0906063 -0.0259275 +-0.031909 0.154239 -0.00732019 +-0.0800971 0.0773092 -0.00453369 +-0.0190564 0.0920061 -0.0357108 +0.0133608 0.0494245 -0.0271921 +-0.0787339 0.140316 -0.00472414 +-0.0275167 0.116662 0.0324113 +0.00652621 0.104352 0.0432895 +0.0358497 0.0713653 0.0377445 +-0.0918605 0.116299 0.0240619 +-0.0522199 0.061167 0.0299696 +-0.0201447 0.166816 -0.0117812 +-0.0433732 0.122414 -0.0114499 +-0.0645963 0.0430073 0.0358234 +-0.0779043 0.1583 -0.0209193 +0.0367132 0.0547551 0.0317845 +-0.0351109 0.16372 -0.0144674 +-0.0434603 0.109995 -0.0184047 +-0.0576869 0.0677197 -0.0118328 +0.00623854 0.074018 -0.0343382 +0.0443987 0.0959613 0.0131589 +-0.089865 0.120262 0.0458544 +0.0103837 0.0449023 -0.0251665 +-0.0770006 0.139838 -0.00569476 +-0.072687 0.0955359 0.0408041 +-0.0569361 0.046073 0.0125834 +-0.0604913 0.0818799 0.0434166 +-0.0460645 0.151688 -0.00554828 +-0.015331 0.0349099 0.0491212 +-0.0229594 0.0811266 0.055321 +0.0274663 0.0754645 0.0450048 +-0.00267666 0.0374926 0.0135597 +-0.011518 0.0673875 0.054571 +0.013368 0.122467 -0.00997636 +-0.0722821 0.143895 -0.0129091 +0.0454962 0.0443878 0.000424365 +-0.0127602 0.0382241 0.0199007 +-0.091546 0.146121 0.023146 +0.00392744 0.0371222 0.0242968 +-0.0385489 0.119476 -0.0123722 +0.0114833 0.0936471 0.0518498 +-0.0643328 0.146767 0.0386771 +-0.0624894 0.163088 -0.0505885 +-0.0375004 0.0464372 0.040096 +0.0460037 0.0834239 0.0131685 +0.033027 0.108336 -0.00876159 +0.013228 0.0990749 -0.0229052 +0.034148 0.0442132 0.0295363 +-0.0907186 0.113289 0.0113419 +0.0210633 0.106016 0.0411627 +-0.0454948 0.119311 0.0290591 +-0.0676975 0.0607342 0.0101856 +-0.0195364 0.0461211 0.0518679 +0.0161339 0.0672434 0.0514025 +-0.0693216 0.0620201 0.0176481 +0.0429729 0.0944315 -0.00180352 +-0.0494828 0.135763 0.0221907 +-0.060805 0.0867676 -0.0196616 +-0.0247298 0.125997 0.0151584 +0.059297 0.0608379 0.0211666 +-0.080116 0.153024 0.0299773 +0.0574282 0.0681585 0.00377242 +-0.0535498 0.0486673 -0.00635158 +-0.0304741 0.177281 -0.004356 +-0.0855011 0.0792275 0.0175034 +-0.0804698 0.130248 0.0526854 +0.000343862 0.0539275 -0.0306641 +-0.0900062 0.133811 0.0372136 +0.0104354 0.0347372 0.0259595 +-0.0574962 0.0440189 0.0444763 +-0.0573422 0.0335757 0.00237022 +0.0404449 0.0739232 0.0320846 +-0.00464724 0.0496642 -0.0307417 +-0.0311133 0.0510509 -0.015361 +0.0169782 0.128539 0.0144983 +-0.0872732 0.151714 0.0113029 +-0.0345546 0.0409268 0.0482929 +-0.0745628 0.173554 -0.0490908 +-0.0213027 0.0381376 0.0110019 +0.0223647 0.0782061 0.0499784 +0.0111959 0.0879068 -0.0311136 +0.0141654 0.115006 -0.0159235 +-0.0175094 0.116845 0.0368185 +0.0185047 0.0369619 -0.0146835 +-0.0924063 0.129578 0.0112381 +-0.00949945 0.0517772 0.0514996 +-0.0666563 0.0656524 -0.0048951 +-0.0494962 0.100168 0.0429965 +0.00776642 0.130336 0.022539 +-0.0564976 0.0904367 0.0452654 +-0.0648339 0.153263 -0.0390895 +0.0140569 0.12802 0.0248446 +-0.00977705 0.174183 -0.0237537 +-0.0154865 0.0530505 0.0500296 +-0.0627622 0.0810191 -0.0190992 +-0.0385594 0.173184 -0.00190958 +-0.00314149 0.0972112 0.0530078 +-0.0418773 0.107078 -0.0201516 +0.0363342 0.109637 -0.000829727 +0.021507 0.126326 0.01189 +-0.030496 0.0988081 0.0439786 +-0.0769628 0.150462 0.0371334 +-0.0941104 0.126894 0.0182531 +-0.0255083 0.112568 0.0366767 +-0.0746801 0.157704 -0.00556618 +-0.0418449 0.0971142 -0.0220611 +-0.0359493 0.125342 -0.00457539 +-0.0258164 0.0853463 -0.0368715 +0.0497106 0.0482066 0.0259506 +-0.0716942 0.1568 -0.0399156 +-0.0618117 0.0590403 0.0165038 +-0.0714498 0.15679 -0.0419165 +-0.0701989 0.0368637 0.0105096 +0.0597267 0.0636404 0.0201833 +-0.0915748 0.124221 0.0431828 +-0.0690929 0.156328 0.0219534 +-0.0302767 0.0622182 -0.0224251 +-0.00771091 0.0627931 -0.0356131 +0.0394872 0.0513548 0.03224 +-0.0229845 0.0724431 0.0499564 +-0.0290201 0.125445 0.00626167 +-0.0729777 0.138423 -0.00695981 +-0.00991212 0.111561 -0.0201766 +0.000200297 0.0825801 -0.036136 +0.0364442 0.0590953 0.0349595 +0.0364996 0.0928818 0.0370772 +-0.0181329 0.0432293 0.0524811 +0.00280759 0.0350639 0.0204847 +-0.0626379 0.152126 -0.0285986 +-0.0704211 0.15543 0.027334 +0.000301963 0.100099 0.0481787 +-0.049492 0.0917757 0.044207 +-0.015502 0.0897786 0.0564851 +-0.0318792 0.156356 -0.0104816 +0.0416778 0.102863 0.015161 +0.0504722 0.048918 -0.000684915 +-0.0611415 0.0359024 -0.0090437 +-0.0264937 0.098817 0.0439871 +-0.000436317 0.122463 0.0356275 +-0.0875676 0.129767 0.0460862 +-0.0312863 0.0777611 -0.0325602 +-0.0303664 0.112853 -0.0174686 +-0.00773829 0.0684701 -0.0360951 +-0.0647534 0.156678 -0.0475943 +-0.0891175 0.0983455 0.0194044 +0.00833741 0.055373 -0.0305597 +-0.0550257 0.131065 -0.00539027 +-0.0305029 0.0689001 0.0393777 +-0.0596554 0.0343168 0.0331724 +0.0436089 0.0680569 -0.000247417 +-0.0786395 0.163873 -0.0279533 +-0.0574243 0.0613459 0.0260206 +-0.0338728 0.0483909 -0.0193366 +-0.0287306 0.074519 0.0412207 +0.016916 0.0577101 0.0489225 +-0.0184307 0.0347944 0.0485523 +-0.0655112 0.0803784 0.0426229 +-0.0332327 0.160967 -0.000804209 +-0.0533105 0.0541891 0.0115512 +-0.0356689 0.117866 -0.0126779 +-0.0699903 0.034504 0.00971713 +-0.0588141 0.0341524 0.0282501 +-0.0177813 0.0770869 -0.0388032 +0.0445157 0.0467554 0.0289718 +0.00964716 0.128306 -0.00229994 +-0.0666126 0.148623 0.0392621 +-0.0325544 0.0348985 0.0454309 +-0.0623108 0.039732 0.0166963 +-0.0917483 0.122888 0.0433845 +0.0271866 0.0819517 -0.0229154 +-0.00863658 0.0467032 -0.0298179 +-0.0620847 0.166243 -0.0515916 +-0.0912832 0.125583 0.0428488 +-0.0588072 0.0481223 0.00266039 +-0.0913122 0.133748 0.0212171 +0.0482658 0.0433313 0.0185611 +0.00774922 0.0351262 -0.0136823 +0.0357585 0.0562848 0.0339755 +-0.029123 0.166739 -0.016877 +-0.0338028 0.122413 -0.00742547 +0.0216799 0.0415358 -0.0117265 +-0.0257594 0.171231 -0.0110774 +-0.0641199 0.162494 -0.0212451 +-0.0535748 0.155622 0.0115317 +0.0531674 0.0736169 0.0146631 +0.0135129 0.0347107 0.0374491 +0.0227019 0.123147 0.0266031 +0.025252 0.0719314 -0.0249494 +0.0309797 0.118122 0.0225615 +0.0415492 0.0724945 0.03012 +0.000493498 0.119652 0.0380928 +0.0229975 0.123119 -0.000380287 +0.0234322 0.100371 -0.0202365 +-0.0620057 0.153738 -0.0265835 +-0.0398723 0.105663 -0.0203219 +-0.0632416 0.0445478 0.0366988 +-0.0310386 0.154131 -0.00157547 +-0.0042992 0.0348909 0.0408189 +-0.00181562 0.0826307 -0.0368615 +0.0388816 0.0927717 0.0335536 +-0.0335058 0.0760991 0.0415371 +-0.0314963 0.0917789 0.0442247 +-0.0512549 0.0612644 0.0318233 +-0.00281159 0.131227 0.0100802 +-0.0531145 0.157563 -0.00324336 +-0.0635867 0.03486 0.0405057 +-0.0627936 0.15522 -0.0356106 +0.0166245 0.122097 0.0315907 +-0.0106759 0.119083 -0.0141801 +-0.0465015 0.0689677 0.0402969 +-0.0626599 0.0423324 0.0141491 +-0.0515376 0.053149 0.0306286 +0.00413437 0.124074 -0.00964261 +-0.0105331 0.127013 0.0275477 +-0.042312 0.0337552 -0.0130352 +0.0472026 0.0681414 0.0256953 +0.0213439 0.0741385 0.0502206 +0.0156241 0.128368 0.0211329 +0.0358549 0.0843357 -0.0172902 +-0.0533892 0.064921 0.0343521 +0.0273368 0.091573 0.0449418 +-0.0440333 0.0423079 -0.0173091 +-0.0764978 0.13864 0.0490601 +0.00750117 0.0716903 0.0560753 +0.0454321 0.0861887 0.0181684 +-0.0812985 0.084505 0.0328118 +-0.0605375 0.155317 0.003221 +-0.0065332 0.130449 0.0187888 +0.0247646 0.122114 0.0259409 +-0.0711064 0.152637 0.0345827 +-0.0155013 0.0716083 0.0551341 +0.0277791 0.0822205 0.0455159 +-0.0445183 0.0675631 0.0404632 +-0.0772746 0.147261 -0.00486297 +-0.0868795 0.0927253 0.00342064 +-0.0458425 0.0985138 -0.0217256 +-0.0906083 0.131058 0.0342318 +-0.091547 0.146101 0.0191506 +-0.00249086 0.116945 0.0398999 +0.0385734 0.0699568 0.0346425 +-0.0129648 0.116833 -0.0157687 +0.0215791 0.120444 0.0319368 +-0.0899229 0.115405 0.0270455 +-0.0697992 0.0836733 -0.0171139 +-0.0415794 0.128056 0.0149128 +-0.0734779 0.180121 -0.0504836 +-0.0466973 0.0665278 -0.0146823 +-0.0673893 0.156703 -0.00509746 +0.00108438 0.119342 -0.0145393 +-0.019494 0.0842608 0.0571688 +0.0285713 0.0551672 -0.0188053 +0.00650695 0.0731027 0.0564796 +-0.0557862 0.0854763 -0.0214113 +-0.0743851 0.163815 -0.0369793 +-0.0286768 0.123948 -0.00103929 +-0.0301123 0.163751 -0.0154896 +0.0410386 0.099944 -0.00278716 +0.00848446 0.0518256 0.0516867 +-0.051108 0.0530218 0.0319282 +-0.0905758 0.113954 0.0388293 +-0.00470317 0.038779 0.00289117 +-0.0247258 0.0638997 -0.032873 +-0.04111 0.159177 -0.0108205 +-0.0892399 0.140676 0.0351725 +-0.075004 0.141334 -0.0064915 +-0.0463338 0.132474 0.00863126 +-0.0541416 0.034749 0.0443256 +-0.0781873 0.168068 -0.0319708 +0.0328915 0.0696754 -0.0177356 +0.0346158 0.0369318 0.00517598 +-0.0694908 0.124597 0.0526574 +0.0581844 0.0711857 0.0106064 +-0.0378081 0.0841771 -0.022143 +-0.0281622 0.169703 -0.0179592 +0.0305485 0.118199 0.0238252 +-0.0289649 0.0747374 -0.0345478 +-0.0272221 0.0904382 0.0465675 +-0.0514982 0.0848246 0.0453901 +-0.051623 0.0531083 0.0226238 +-0.0398125 0.0899922 -0.0232612 +-0.0236559 0.0709438 0.0478646 +-0.053816 0.0559281 -0.00642904 +0.0603322 0.0636924 0.0181801 +-0.0884616 0.136381 0.00620417 +-0.0394936 0.046476 0.0404962 +-0.0530638 0.0723343 0.0404003 +0.0102711 0.0695708 -0.0315811 +0.0339253 0.115718 0.0108315 +-0.0295473 0.0358282 0.0521362 +0.0116453 0.090034 0.0538428 +0.0450904 0.0875663 0.0201674 +0.0326336 0.0519746 0.0346532 +0.03367 0.072742 0.0398859 +0.024638 0.124378 0.010214 +0.0415181 0.0484385 0.0321463 +-0.044143 0.159411 0.00624881 +-0.0495653 0.047469 -0.00900107 +-0.0894571 0.131034 0.0422704 +-0.075804 0.161028 -0.0299559 +-0.0164919 0.0968814 -0.0286925 +0.0229929 0.0371968 0.0317242 +0.0352506 0.101471 -0.011425 +-0.049558 0.0389942 -0.0116749 +-0.0223649 0.171249 -0.0132085 +-0.0667327 0.078026 -0.0171522 +0.0442166 0.0846846 -0.00180459 +-0.0518774 0.104165 -0.0200373 +-0.0393536 0.0336231 0.00416845 +0.00720473 0.0823989 -0.0333538 +-0.0288578 0.101545 -0.0231915 +0.0245524 0.106048 0.0391612 +-0.0851811 0.0897279 0.0280525 +-0.00334607 0.0347739 0.0411187 +-0.0430221 0.128224 0.015861 +0.0243931 0.0503998 -0.0217952 +-0.0394902 0.0506047 0.0393469 +0.0293799 0.0892796 -0.0205263 +-0.0574934 0.0875623 0.0444505 +-0.0644211 0.0347126 0.0370276 +-0.0169241 0.181626 -0.0193127 +-0.0564978 0.0732565 0.0410435 +-0.0544221 0.144671 0.0284168 +0.0203184 0.0650483 -0.0276666 +-0.0648645 0.041891 0.032665 +-0.0451284 0.159142 -0.00893675 +0.0451235 0.093189 0.0121575 +-0.0577489 0.0479998 -0.00135721 +-0.0606371 0.0448145 0.012064 +0.0495086 0.0638139 0.0293036 +0.0458685 0.0862133 0.0111669 +-0.0531099 0.136165 -0.00197183 +0.0285441 0.0509095 -0.0177614 +-0.013074 0.0383381 0.00704947 +-0.0223231 0.0391341 0.0387105 +0.0393846 0.0429207 -0.00283799 +0.0202147 0.0847891 -0.0269071 +0.00923869 0.035402 -0.0117616 +-0.060367 0.11933 -0.00999174 +-0.0772797 0.157576 -0.0127941 +-0.0732669 0.179344 -0.0490063 +-0.0683896 0.0420777 -0.000309277 +-0.0539058 0.102757 -0.0202213 +-0.0453256 0.169857 -0.00299568 +-0.0616838 0.0659304 -0.00830259 +0.00414244 0.129952 4.9397e-05 +-0.0404915 0.113924 0.0347061 +-0.0942425 0.120105 0.0182851 +-0.0324906 0.080327 0.0414535 +0.0529677 0.0595446 0.0290441 +-0.0904857 0.114242 0.0332623 +-0.0703591 0.181312 -0.0565189 +-0.0475241 0.112407 -0.0169253 +0.0109831 0.0341684 -0.0140433 +-0.089612 0.139257 0.0251846 +-0.0373738 0.0365422 0.044687 +0.0564401 0.0662549 0.00171258 +-0.0581251 0.0334091 -0.00125013 +-0.0407273 0.0696207 -0.0166002 +-0.0669961 0.165196 -0.05701 +0.0131268 0.120538 0.0349816 +0.0367009 0.0812747 -0.0157528 +-0.0077824 0.0784642 -0.0379203 +-0.0647128 0.155185 0.0278857 +0.00549498 0.0951378 0.0528545 +-0.0108057 0.0342947 -0.0255969 +-0.0911579 0.129687 0.0342384 +-0.080608 0.0720682 0.0165498 +-0.073439 0.148627 -0.0298053 +-0.0271937 0.174158 -0.0183459 +-0.0244966 0.0509689 0.0431921 +-0.00162246 0.0450436 -0.027024 +-0.0775221 0.104823 0.0340694 +0.0154861 0.0927165 0.0506449 +-0.0599536 0.123822 -0.00839074 +-0.079866 0.0706372 0.0115498 +-0.0815235 0.0899003 0.0328752 +0.0313378 0.118325 0.00558524 +0.0248331 0.123944 0.0188283 +-0.0898787 0.112224 0.0169361 +-0.0662043 0.065068 0.0280019 +0.0246717 0.0434401 -0.00867806 +-0.0469681 0.134154 0.0128397 +-0.0291377 0.0860908 -0.0335904 +0.0147704 0.0519654 0.0475176 +-0.0296475 0.169744 -0.0079151 +-0.0211888 0.175661 -0.0220113 +-0.0347689 0.0780934 -0.0215038 +-0.013019 0.129549 0.0120959 +0.0421932 0.0662609 -0.00283376 +0.0111358 0.0352671 0.0436641 +-0.0705399 0.100871 0.0399167 +-0.0604975 0.0832903 0.0437356 +-0.0659485 0.126772 -0.00885106 +-0.0702518 0.06756 0.0285092 +-0.00688661 0.108791 -0.0226031 +-0.0786437 0.112204 0.0464731 +0.00637271 0.130879 0.0205945 +-0.066894 0.110895 -0.0121462 +0.0123118 0.0623753 -0.0299343 +-0.0285044 0.109801 0.0380702 +0.00650421 0.0883449 0.0558788 +-0.0545694 0.124267 -0.00721739 +-0.0626588 0.161511 -0.0455953 +-0.0861214 0.132549 0.0473951 +-0.0627776 0.125519 0.0444184 +-0.0177321 0.160293 -0.0123373 +-0.0490182 0.0345781 0.0369526 +-0.0297799 0.106834 -0.0211406 +-0.079558 0.151858 0.0332132 +-0.0404921 0.0648693 0.0415314 +-0.0530069 0.153493 0.0132253 +-0.0339683 0.0485791 0.0404406 +-0.0421354 0.0449426 -0.0173193 +-0.0517467 0.076797 -0.0188523 +-0.060863 0.0583083 0.0137477 +0.0112347 0.0794806 -0.0318525 +0.00351036 0.0856577 0.0572413 +-0.0648576 0.101039 -0.0173044 +-0.0601123 0.0381131 0.0455939 +-0.015494 0.0515277 0.0489706 +-0.0275254 0.1668 -0.00838328 +-0.0365126 0.077567 0.0421306 +-0.0195832 0.1596 -0.0115811 +0.00251466 0.0744821 0.0563666 +0.0589788 0.062133 0.0220601 +-0.066902 0.117219 0.0507079 +-0.0396194 0.0335538 -0.0253204 +-0.0297618 0.107877 -0.0202294 +-0.00601771 0.0990415 0.0504631 +-0.084398 0.0778007 0.013518 +0.0271613 0.0368693 0.0238228 +-0.0589877 0.0335902 0.00921609 +0.029871 0.0968887 0.0415927 +0.00949394 0.0426698 0.0450285 +-0.0697739 0.0382195 0.0100596 +0.0231426 0.0768603 0.0493195 +-0.00501253 0.125042 0.0324689 +-0.00710159 0.0387114 0.00061319 +-0.0177128 0.0599179 -0.0354327 +-0.045698 0.157938 0.00750606 +0.00190257 0.130874 0.00322319 +-0.0444648 0.0945053 0.0429498 +-0.0772757 0.148645 -0.0058688 +-0.069822 0.156776 -0.00162593 +-0.0445001 0.117958 0.0308281 +-0.0409685 0.0462375 -0.0173222 +-0.0305996 0.0509893 -0.0173575 +0.00196704 0.0385066 0.0244659 +-0.00668986 0.0584241 -0.0339312 +-0.0587805 0.0811174 -0.0202922 +-0.0492044 0.143127 0.00539863 +-0.0686509 0.155409 0.00612964 +-0.0404209 0.150087 -0.00469474 +-0.00449521 0.0925603 0.0561444 +-0.000397233 0.131333 0.0167016 +-0.0552402 0.138165 0.0306253 +0.0215752 0.056436 0.0468827 +-0.0248564 0.100174 -0.0239639 +-0.0165731 0.0386082 0.0295958 +0.0232801 0.125085 0.0182493 +0.0228318 0.0357435 0.0257706 +-0.0492021 0.127407 -0.00458885 +-0.0878029 0.112934 0.0313303 +0.0465727 0.0554592 0.0320923 +-0.0288967 0.0499669 0.0438168 +-0.000173892 0.120963 -0.0122496 +-0.0704499 0.154022 0.0317661 +-0.0151711 0.0346724 0.0458457 +-0.0640566 0.138182 0.0390191 +0.0398408 0.105612 0.0201716 +0.0444976 0.0583814 0.0318302 +0.031639 0.0370094 0.0209702 +-0.0104878 0.112778 0.0413082 +-0.0672962 0.0785128 0.0408262 +-0.0760729 0.0675487 0.00755458 +-0.0571409 0.0642584 0.0323718 +0.0261418 0.0859362 -0.0230192 +-0.015502 0.0856307 0.0568812 +0.0189265 0.119915 -0.00924366 +-0.0119328 0.103575 -0.0236984 +-0.00622128 0.0384574 0.0119659 +-0.0779451 0.128117 -0.00684087 +-0.0657248 0.120041 0.0506761 +-0.0623817 0.147548 -0.00757469 +-0.0875561 0.121673 0.0477803 +0.0222529 0.0365833 0.0139797 +-0.00142937 0.126525 -0.00622577 +-0.0226373 0.0386776 -0.0154938 +-0.0648114 0.0335165 0.00450366 +0.0210136 0.0713836 0.0497227 +-0.0348346 0.0347214 0.0345782 +-0.027609 0.0850124 0.048532 +-0.0856119 0.0819492 0.0204815 +-0.0601038 0.0347331 -0.00989443 +0.00929494 0.0956507 -0.0272714 +-0.0915391 0.118654 0.00731945 +-0.00449819 0.0604864 0.0551163 +0.0204818 0.0854612 -0.0266087 +-0.0429251 0.129071 0.00699388 +-0.0789967 0.138332 -0.00474353 +0.0343592 0.0519767 -0.00689954 +-0.0921408 0.125525 0.040859 +0.0516782 0.0702939 0.00352664 +-0.022659 0.0508417 -0.0286643 +-0.00138527 0.0424799 0.0468649 +0.0452912 0.0903849 0.0031762 +0.0401652 0.0717052 -0.00977551 +-0.0905185 0.148805 0.0131551 +-0.0470106 0.149195 0.00904699 +-0.0201874 0.0711262 0.0528634 +-0.0555353 0.0388223 -0.0103544 +-0.0714965 0.154091 0.0314059 +0.0232354 0.0968772 0.0460698 +-0.020264 0.0381835 0.0111715 +-0.0267635 0.177003 -0.0181719 +-0.0755105 0.151351 -0.0138965 +-0.00749931 0.0925693 0.0562701 +-0.063994 0.152679 -0.0352218 +0.0453927 0.0833662 0.00319518 +-0.0137973 0.081348 -0.0391911 +-0.0433806 0.120699 0.0278302 +0.0462048 0.0792353 0.00618416 +-0.0498122 0.141672 0.00439987 +-0.0592291 0.156682 0.00368263 +-0.0525972 0.055954 -0.00763978 +-0.0796979 0.108952 0.0363543 +-0.0334959 0.0335656 -0.024125 +0.0047441 0.131688 0.0100125 +-0.0530342 0.15087 0.0203968 +-0.0794975 0.133078 0.0519067 +0.0231582 0.125381 0.0124998 +-0.0898343 0.122953 0.0457467 +0.0336909 0.115719 0.00499933 +-0.0364989 0.0705154 0.0419282 +-0.0641133 0.155183 -0.0406054 +-0.0303694 0.034667 0.0426012 +-0.0474034 0.126784 0.0277907 +0.0312862 0.107094 -0.0114403 +-0.0399374 0.122179 0.0274746 +-0.0715157 0.106884 0.0372861 +0.0432452 0.100105 0.0111579 +-0.0264035 0.0386467 -0.0143525 +-0.053047 0.162457 0.00378602 +-0.0573985 0.155942 0.000257732 +-0.0104925 0.119661 0.037142 +-0.0107108 0.0656519 -0.03625 +0.0153129 0.0637748 -0.0295702 +-0.047649 0.128193 0.0275289 +-0.0395091 0.0986823 0.0417741 +0.0582857 0.0709436 0.0165587 +0.0144142 0.0418406 -0.0232939 +-0.0406818 0.0636695 -0.0135779 +-0.0700194 0.0408862 0.000674154 +-0.0898984 0.139201 0.0142132 +-0.0368759 0.102855 -0.0211016 +-0.031161 0.177923 -0.0048433 +-0.0216559 0.0380957 0.0145856 +-0.00121026 0.129846 0.000241032 +-0.0176504 0.0583335 0.0507279 +0.0492902 0.0704301 0.0235452 +0.008888 0.126629 0.0301427 +-0.0897638 0.136555 0.0361946 +-0.0903944 0.113745 0.0354564 +0.0327067 0.0659933 0.0401778 +-0.0167299 0.0383654 0.0243772 +0.0403616 0.0561214 -0.00579676 +-0.0891677 0.150225 0.0241083 +-0.0128992 0.165641 -0.0199242 +-0.0596113 0.0581543 0.0105384 +0.0326521 0.108705 0.0315863 +-0.0448105 0.126695 -0.00590468 +0.0440256 0.0973461 0.0131583 +-0.0694635 0.0618968 0.00696654 +-0.0667991 0.06462 0.0265045 +0.0388894 0.060327 0.0314833 +0.0120611 0.11304 -0.0178164 +-0.0635386 0.151731 -0.00361755 +-0.00656125 0.130634 0.0158888 +0.0344174 0.0430387 -0.00433126 +-0.00549778 0.129792 0.00189197 +-0.0499313 0.134148 0.000258943 +-0.0563569 0.155043 0.0148967 +-0.00737522 0.0388161 -0.00139235 +0.0283929 0.0347449 0.011384 +-0.010683 0.0908469 -0.0364652 +-0.048501 0.109818 0.0382143 +-0.0690431 0.169001 -0.0273587 +0.0102657 0.0954683 -0.0270889 +0.0126468 0.0820043 0.0535026 +-0.0507783 0.0613366 0.0327704 +0.00559724 0.128727 -0.00267638 +-0.044734 0.0724552 -0.0176324 +-0.0283736 0.0336157 -0.0231629 +-0.0679859 0.155562 0.00782161 +-0.0939853 0.126886 0.0172543 +-0.0238126 0.0840242 -0.0378907 +-0.0152029 0.16973 -0.0225848 +0.0303318 0.0382842 0.0249985 +-0.0463034 0.0382871 -0.0172845 +-0.012857 0.0968183 -0.0306036 +0.0139515 0.0933972 -0.0268828 +-0.0598089 0.0334419 -0.0052474 +-0.0682308 0.180685 -0.0584278 +-0.0564615 0.0452367 0.0437224 +0.0122525 0.036039 -0.0217262 +-0.0324956 0.119317 0.0295507 +-0.050852 0.0985174 -0.022094 +0.0359226 0.0926166 -0.0140085 +0.0475195 0.0583521 0.0315949 +0.00440154 0.12483 0.0329119 +-0.0725064 0.152612 -0.0398907 +-0.00124079 0.0388178 0.0271443 +-0.0855936 0.143251 0.00719107 +-0.0618131 0.161554 -0.0315928 +-0.0315498 0.0848744 -0.0295692 +-0.0167783 0.0770825 -0.0387039 +-0.024832 0.0930098 -0.0316179 +-0.0356976 0.121856 -0.0088333 +0.0456324 0.0875991 0.0131626 +0.0344601 0.0660136 0.0392214 +0.008313 0.0639391 -0.0318667 +0.0352496 0.0656442 -0.0147977 +-0.0468498 0.0999476 -0.0216953 +-0.0215077 0.111305 0.0395987 +-0.0345319 0.122423 0.0264163 +0.0333657 0.0835669 0.0412915 +-0.0594982 0.143919 0.0350801 +-0.0210079 0.184692 -0.0198306 +-0.09225 0.125605 0.0402535 +-0.0764966 0.117544 0.0520468 +0.0261457 0.100404 -0.0183041 +0.0314049 0.0431209 -0.00494122 +-0.000675964 0.056864 -0.0322097 +-0.0759667 0.135448 -0.00632576 +0.0194608 0.0865014 0.0497298 +0.0480114 0.0447211 0.0227621 +0.0382636 0.109749 0.0121659 +-0.0191397 0.0920316 0.0539979 +0.0148906 0.112386 -0.0170744 +-0.0156084 0.0378086 -0.0269252 +0.0166879 0.0355485 0.0409566 +-0.0719103 0.125286 -0.00863314 +0.0390766 0.0901064 0.0338413 +0.0238446 0.123573 0.0241681 +0.0180905 0.1262 -1.26099e-05 +-0.0241861 0.0351713 0.0521271 +-0.0864494 0.107673 0.0113573 +0.00554907 0.0341243 -0.0169616 +-0.0740319 0.152138 0.0351116 +-0.00773495 0.12664 -0.00628182 +-0.0408221 0.0343419 0.0301151 +0.0589083 0.0700926 0.0167877 +-0.0321537 0.168198 -0.0161712 +-0.0504087 0.0385253 -0.0116443 +-0.0719982 0.132651 0.0504199 +-0.0314938 0.0946271 0.0446065 +0.0415387 0.0610238 0.0295203 +0.0439094 0.0623682 -0.0025277 +-0.0745832 0.173457 -0.038075 +-0.0135013 0.163627 -0.011822 +0.00544999 0.097676 0.0507202 +-0.0233157 0.0695067 0.0475588 +0.0280693 0.112767 0.0337398 +0.0217645 0.057833 0.0471676 +-0.0875176 0.123015 0.0477063 +-0.0696847 0.0339658 -0.0022881 +-0.0251326 0.166747 -0.01768 +-0.0196064 0.177176 -0.0161969 +-0.0704588 0.109521 0.0380634 +-0.068398 0.171087 -0.0357069 +0.0111209 0.0908234 -0.0303895 +-0.0634854 0.149796 0.0371525 +0.00199826 0.122137 -0.0115071 +-0.0620402 0.161574 -0.0285866 +0.0543448 0.0567886 0.0274783 +0.00150309 0.0619973 0.0566118 +-0.0476286 0.0532889 -0.00972253 +0.0589424 0.064749 0.0219118 +0.00619535 0.0866083 -0.0331365 +0.00933928 0.0947261 -0.0283032 +0.0354634 0.113562 0.00993821 +-0.0622597 0.0337543 0.0119702 +-0.0286126 0.0778208 0.0441079 +-0.0291848 0.0649007 -0.0284708 +0.00716146 0.130043 0.000903466 +0.00854238 0.122369 -0.0118647 +0.0207709 0.0422154 0.0420468 +-0.0728566 0.114991 -0.00711315 +-0.062327 0.161572 -0.0265871 +-0.029645 0.121258 -0.00823608 +-0.0358448 0.0971832 -0.0228124 +-0.0241278 0.166765 -0.0179136 +-0.0833762 0.111067 0.0302504 +-0.0714085 0.0715566 0.0335759 +-0.0285052 0.11799 0.0309781 +-0.0436341 0.171062 -0.00299049 +-0.0254563 0.120601 0.0288472 +0.029856 0.0552774 -0.0168073 +-0.0277474 0.076815 -0.0357774 +-0.0305568 0.0845973 0.042796 +-0.0927119 0.117479 0.0363033 +0.00128405 0.131584 0.0158806 +-0.0853072 0.129862 0.0494994 +-0.0379579 0.11044 -0.0188969 +-0.0647113 0.0736859 -0.0158833 +-0.055064 0.0698751 0.038539 +-0.049499 0.0747526 0.0426395 +-0.0315694 0.0461612 0.0465874 +-0.0452548 0.169651 -0.00135352 +-0.0891941 0.0888738 0.0164555 +-0.0424866 0.0396651 0.043393 +-0.0870945 0.0846532 0.00548002 +-0.0530436 0.142764 -0.000526483 +-0.0664988 0.146992 0.0401715 +-0.0606301 0.0613516 -0.00265703 +-0.0321846 0.121876 0.025771 +0.0462743 0.0806463 0.0131736 +0.0355309 0.0527205 0.03199 +-0.0515418 0.0389441 -0.0114685 +0.0203586 0.0565379 -0.0271575 +-0.065976 0.0624665 0.0232686 +-0.0399438 0.0336374 -0.0217314 +-0.0584862 0.0833066 0.0438144 +-0.0449507 0.157934 0.00683281 +-0.0161733 0.168253 -0.0210405 +-0.0807961 0.0747709 0.0205502 +-0.0450711 0.153185 -0.00674331 +0.0122509 0.0766796 0.0546284 +-0.0165839 0.159908 -0.00982549 +-0.000693426 0.0367942 0.0054988 +-0.051438 0.0643214 0.0343604 +0.0173166 0.0411975 -0.0216758 +-0.0350925 0.0344983 0.0186791 +-0.0263041 0.10845 -0.0208491 +-0.0233997 0.0384863 0.0301002 +0.0336304 0.116029 0.0121428 +-0.084184 0.106292 0.0253661 +-0.0668605 0.102389 -0.0157781 +-0.0617744 0.0585089 0.0133805 +-0.037501 0.0634549 0.0414009 +0.0430852 0.0973049 0.0211625 +-0.0895621 0.0902365 0.017449 +0.0358939 0.0591552 0.0359628 +0.00041272 0.0994106 0.0497851 +0.0297429 0.112241 -0.00897067 +-0.0614607 0.155749 0.0232098 +-0.0190678 0.0347878 0.0501361 +0.0278403 0.121636 0.00711658 +-0.0293538 0.0475081 0.0471486 +-0.0878748 0.0861246 0.0134664 +-0.065267 0.132559 0.042478 +-0.0557536 0.0782586 -0.0197587 +0.0163546 0.0537375 -0.0279072 +-0.0768389 0.102007 -0.0101454 +-0.0762457 0.0708701 0.0261488 +-0.0434929 0.0410777 0.0433607 +-0.0820951 0.100566 -0.0055776 +-0.0124865 0.114128 0.0400495 +0.0495003 0.0496818 0.0274333 +0.0157351 0.0562704 0.0489701 +-0.0269138 0.0660937 -0.0314934 +-0.0205217 0.0448565 0.0528623 +-0.0147659 0.0742889 -0.0388052 +0.0292558 0.120076 0.0204837 +-0.0416192 0.0505822 -0.0110011 +0.00560187 0.0957087 -0.0293479 +-0.00449169 0.0575673 0.0538908 +0.0302324 0.0374168 2.32521e-05 +0.0404422 0.105635 0.0151656 +-0.0407521 0.0782965 -0.0192261 +-0.0321404 0.106348 -0.0206098 +0.0240312 0.1242 0.0213823 +0.0163901 0.0476981 -0.0240512 +-0.0540847 0.0341953 0.0274512 +0.0565883 0.0716209 0.0188851 +-0.063971 0.0343652 0.0164556 +0.0222263 0.0790988 -0.0263649 +-0.0480529 0.15019 -0.0042011 +-0.0364615 0.155102 -0.00949574 +-0.0107913 0.165034 -0.0192459 +-0.0720629 0.166594 -0.0198059 +0.0596228 0.0581166 0.00817617 +0.0193916 0.12656 0.0211758 +-0.029103 0.162278 -0.0149633 +-0.0114929 0.118282 0.0379089 +-0.0766495 0.0810868 -0.0106019 +-0.00184307 0.128669 -0.00252946 +-0.0100488 0.177211 -0.0257537 +-0.0544738 0.0624824 0.0299832 +-0.0840733 0.0966087 -0.0036103 +-0.0707265 0.080778 -0.0161096 +-0.0214771 0.122102 0.0291424 +-0.0428932 0.0358165 0.00869673 +0.0135568 0.129672 0.01894 +-0.00280854 0.081222 -0.0368531 +0.00517895 0.130408 0.0230466 +-0.067269 0.167119 -0.0252721 +-0.00747948 0.0919417 -0.035549 +-0.0365036 0.0478079 0.0395886 +-0.0569665 0.0548885 0.00161507 +-0.0744851 0.0663284 0.00571192 +0.0455621 0.0889987 0.00417598 +-0.0292503 0.036802 0.0530596 +-0.0435044 0.0605182 0.0400424 +-0.0915766 0.14196 0.0161629 +-0.0696706 0.14899 -0.0379959 +-0.0770107 0.152809 -0.00688788 +-0.0705529 0.0628294 0.0184736 +-0.044794 0.0870021 -0.0219374 +-0.0107414 0.120001 -0.0131465 +-0.000720709 0.0669492 -0.0343521 +-0.0214315 0.0906458 0.0534872 +-0.0354995 0.0619703 0.0405316 +-0.0628269 0.1502 -0.00476792 +-0.0640626 0.136748 0.0389546 +-0.0474986 0.102884 0.0412273 +-0.0116527 0.129557 0.00826831 +-0.0347732 0.0337732 -0.0208295 +-0.0214023 0.161048 -0.0139992 +-0.0752954 0.15636 -0.00353298 +-0.0688076 0.150274 -0.0424283 +-0.0238582 0.0382811 0.0283891 +-0.0935937 0.118737 0.0143019 +0.0184606 0.0475775 0.0422564 +0.00850874 0.0575011 0.0529664 +-0.0532082 0.149319 0.0233918 +-0.0320154 0.082069 -0.0305372 +-0.0190294 0.0739916 0.05444 +-0.00216392 0.0992947 0.0503069 +-0.0162644 0.11453 -0.017303 +0.0278981 0.113772 -0.00862034 +0.0459848 0.0602104 -0.00435135 +-0.0564936 0.0465915 0.0420515 +0.0169002 0.103075 -0.0211457 +-0.00731691 0.128182 0.0272242 +0.0205916 0.112587 0.0371117 +-0.0176105 0.0435992 -0.0276633 +-0.0274971 0.0619365 -0.0294418 +0.000272434 0.109746 -0.0202486 +0.0416377 0.084481 -0.00877138 +-0.0784224 0.0725404 0.0242536 +-0.00880164 0.0826803 -0.0379328 +-0.0147316 0.0685868 -0.0380387 +0.0333786 0.0476367 -0.00619535 +0.00348805 0.0413645 0.0460201 +-0.0227229 0.0625945 -0.0340193 +-0.0669932 0.138471 -0.00790807 +-0.037224 0.169679 -0.0130647 +0.0535575 0.0477942 0.0072134 +-0.0575878 0.158069 0.0020235 +0.0345395 0.0727588 0.0393885 +-0.0699466 0.072981 0.0361776 +0.020686 0.0367224 0.0371237 +-0.0728722 0.0355547 0.00103582 +0.00487825 0.131703 0.0129125 +0.0580945 0.0523756 0.014183 +-0.0866528 0.145956 0.0348405 +-0.00749813 0.125151 0.0317009 +0.0403042 0.0398794 0.0201445 +0.0355341 0.0875716 0.0391778 +-0.0249398 0.157384 -0.00964166 +0.00350274 0.0489558 0.0513808 +-0.00381736 0.131135 0.0125816 +-0.00837752 0.0353543 0.048476 +0.0140849 0.129676 0.00773008 +-0.010101 0.102023 -0.0240718 +0.0446756 0.091763 0.0191604 +-0.0637279 0.173384 -0.0513558 +-0.031495 0.061765 0.0382603 +0.0366571 0.0968397 -0.0108144 +-0.0285085 0.115306 0.0336868 +-0.00497421 0.126254 0.0309961 +0.00248615 0.104372 0.0430232 +0.00642086 0.116423 -0.0174422 +-0.0636795 0.0658475 -0.00727738 +-0.0891519 0.0956005 0.0104313 +-0.0860649 0.0994533 0.00140442 +-0.0735831 0.152654 -0.0328925 +0.00651157 0.066084 0.0555109 +0.0344822 0.102017 -0.0120204 +-0.0637552 0.15245 -0.00517189 +-0.077532 0.159745 -0.0169143 +0.00251128 0.0661582 0.0562906 +0.0151093 0.0887421 0.0518346 +-0.00945842 0.0387253 -0.00172767 +-0.0471724 0.133935 0.00981498 +-0.0188178 0.158773 -0.00942574 +-0.0194961 0.0654004 0.0509321 +-0.0774489 0.163906 -0.0229523 +-0.0267283 0.156621 -0.00899742 +-0.0465008 0.111213 0.0371008 +-0.00249784 0.0939038 0.0553992 +-0.0715513 0.0342218 0.00249626 +0.0107439 0.130936 0.0122066 +0.0266603 0.0421651 0.0343135 +0.011996 0.0344545 0.00276628 +-0.0653727 0.074532 0.0393295 +-0.0417745 0.172541 -0.00446528 +-0.0368752 0.0345479 0.0395694 +0.00440907 0.131695 0.0141669 +0.0189748 0.0699869 0.0502663 +-0.0690298 0.155601 0.00744971 +-0.0265663 0.0356908 0.0529027 +-0.0621593 0.13389 0.0382274 +-0.0375341 0.0356789 0.0117182 +-0.00861273 0.0434199 -0.0261503 +0.0317849 0.0490447 0.0333888 +-0.0637123 0.0445754 0.0336875 +0.0376665 0.0374378 0.0089364 +-0.058497 0.0904388 0.0452323 +-0.0442728 0.0437529 -0.0143172 +0.0204519 0.0357096 0.00704168 +0.0282191 0.0941913 -0.0197138 +-0.0688839 0.117973 -0.00851105 +0.0338372 0.104851 -0.0110391 +0.024912 0.0505255 0.0392969 +0.0125119 0.107097 0.0421465 +-0.00117532 0.0998676 -0.0237773 +0.0246952 0.0420222 0.0382704 +-0.0398433 0.0971287 -0.022179 +0.0268619 0.108823 -0.0133055 +-0.0799271 0.140795 0.0466609 +0.0180138 0.0808533 0.0524986 +-0.0868879 0.111328 0.0363925 +0.000567537 0.0921561 -0.0336854 +-0.0892038 0.0969467 0.00941895 +0.00816432 0.0904541 -0.0318561 +-0.064746 0.155508 0.00899366 +-0.0911853 0.113324 0.0173235 +-0.00120622 0.113981 -0.0187843 +-0.00924245 0.0407867 0.049553 +-0.00349897 0.0575855 0.053786 +-0.0375091 0.0407357 0.0441865 +-0.0584982 0.108398 0.0387966 +0.0391307 0.0786589 -0.0107679 +-0.0474967 0.100136 0.0424923 +0.0275962 0.102142 0.0400686 +0.0233313 0.0578274 -0.025582 +-0.0510235 0.0723937 0.0407728 +0.0280639 0.121158 0.0057742 +-0.0318235 0.0637622 -0.0194381 +-0.038893 0.0378836 0.042947 +-0.0455156 0.14919 0.00769333 +-0.0724664 0.0678961 0.0260135 +-0.0614699 0.156861 -0.0255852 +0.0511802 0.0687267 0.0256724 +-0.0639329 0.153712 -0.0368711 +-0.055548 0.0628794 0.0303893 +0.0228246 0.0344564 0.00866393 +0.0333583 0.0505553 -0.00686804 +-0.0436286 0.0534388 -0.0110764 +0.0170321 0.128388 0.0173658 +-0.0484634 0.122511 0.0297787 +-0.0908772 0.119982 0.00630567 +-0.0251882 0.121015 0.0283088 +-0.0621056 0.167818 -0.0515918 +-0.0434918 0.0451945 0.0416496 +-0.0261859 0.172679 -0.0191085 +0.0581533 0.0685799 0.00535861 +-0.0308235 0.12443 -0.00028071 +-0.088653 0.0982606 0.00741366 +0.000114549 0.110154 -0.0201623 +0.032895 0.11463 -0.00105927 +0.0393368 0.0984458 -0.00682083 +0.0171551 0.0988258 -0.0226279 +0.0605804 0.0651016 0.017176 +-0.0528261 0.149337 0.0214103 +-0.0213292 0.159914 -0.0125433 +0.000685965 0.124734 0.0330095 +0.0425127 0.0872289 0.028142 +-0.0754377 0.172239 -0.0469918 +-0.00949675 0.039136 0.0341772 +-0.0750736 0.0773173 0.0349007 +-0.0204972 0.104391 0.0429524 +0.044682 0.0804275 0.0241291 +0.0288766 0.0477511 0.0362254 +-0.0590849 0.0584397 0.0175987 +-0.0187468 0.0685918 -0.0381091 +-0.0908268 0.137853 0.0181986 +-0.0934137 0.128236 0.0152484 +-0.0722094 0.155629 0.00630789 +-0.0701241 0.109501 0.0382316 +-0.0833629 0.0829469 -0.00357326 +-0.0219158 0.177176 -0.0142605 +-0.0038834 0.0389548 -0.00453366 +-0.0468309 0.0956366 -0.0220125 +0.0589161 0.0621713 0.00415053 +-0.0518659 0.144686 0.0163701 +-0.0589723 0.0448133 0.0132235 +0.05973 0.0664208 0.00812497 +-0.0911185 0.128332 0.0402364 +0.0082766 0.0667723 -0.0317926 +-0.0557755 0.0826404 -0.0214196 +-0.0254275 0.181837 -0.00892324 +-0.0899879 0.140645 0.0281829 +-0.0725199 0.141421 0.0466976 +0.0173961 0.0343459 0.000212982 +-0.0435004 0.0424369 0.0431009 +-0.0397849 0.155107 0.00553982 +0.0474231 0.0702463 0.00356979 +0.00935197 0.130836 0.00599246 +-0.0466333 0.0562665 -0.0109539 +-0.0134154 0.0393527 0.0385623 +0.0202221 0.0721388 -0.0279345 +-0.0855696 0.139064 0.00222203 +-0.0690425 0.0382325 0.0107396 +-0.0147406 0.129011 0.0158201 +-0.0436768 0.0636379 -0.0137577 +0.058107 0.0694858 0.00643586 +-0.0523916 0.160438 -0.00307609 +-0.0208502 0.120881 -0.00994613 +-0.0144972 0.0772805 0.0565653 +0.0146633 0.0548535 0.0491553 +-0.0872189 0.103599 0.00739967 +-0.013497 0.0701643 0.0543951 +-0.0727808 0.161025 -0.0379399 +0.0541744 0.0495318 0.0218692 +-0.0180637 0.122407 0.0308158 +-0.0437406 0.150663 0.00676805 +-0.0471693 0.128157 0.0265222 +0.000324051 0.0583269 -0.0327186 +0.0183373 0.109817 -0.016338 +-0.0826495 0.137607 -0.000712655 +0.0256839 0.122773 0.00490001 +0.0354824 0.111268 -0.000157004 +-0.0457208 0.0643263 0.038969 +0.0547017 0.0700348 0.00381661 +-0.00761606 0.128811 0.0256727 +-0.0687402 0.156349 0.0177202 +-0.085121 0.108927 0.00536277 +-0.0739548 0.136937 -0.00691386 +-0.00649589 0.0884166 0.05709 +-0.068322 0.144999 -0.0199128 +-0.0891584 0.142048 0.0331685 +-0.0282821 0.0889315 -0.0326167 +-0.0270715 0.0381475 0.00619785 +0.0226739 0.0430625 -0.011732 +-0.0895091 0.147137 0.0278175 +-0.0396286 0.0534411 -0.011004 +-0.0570587 0.0521462 0.00466373 +-0.0421407 0.162162 -0.0108328 +-0.0831356 0.0816494 -0.00150376 +-0.0274399 0.180304 -0.00715734 +-0.055838 0.0927189 -0.0219026 +-0.0624754 0.163097 -0.0475912 +-0.064973 0.0365283 0.0405192 +-0.0434783 0.0690982 0.041489 +0.0407433 0.102836 0.021176 +-0.0588838 0.0468495 0.0306747 +0.00493781 0.100395 -0.0223096 +0.00122691 0.116615 -0.0176232 +-0.035551 0.0451135 -0.0264751 +-0.025842 0.091626 -0.0326108 +0.0509675 0.0463703 0.0218015 +-0.077144 0.164539 -0.0230622 +-0.0613807 0.122656 0.0428396 +0.0364941 0.0454217 0.0304675 +-0.0655017 0.0931357 0.0435076 +-0.0869021 0.114398 0.00327085 +-0.0624965 0.109755 0.0377659 +-0.0219613 0.124807 -0.00195706 +-0.0564977 0.109762 0.0379025 +-0.0489044 0.0413839 -0.0112514 +-0.0464999 0.104301 0.0412272 +-0.0689362 0.173831 -0.0430963 +-0.0274521 0.175685 -0.00821886 +-0.00850113 0.0633575 0.0560799 +-0.0350673 0.0752529 -0.020583 +-0.0702674 0.128451 0.0511564 +-0.0318141 0.156607 0.00124178 +0.0187844 0.127527 0.00803838 +-0.0133229 0.0978873 -0.0277326 +0.00349851 0.0356817 -6.66678e-05 +-0.0714787 0.0630924 0.012741 +-0.0723877 0.16801 -0.0460141 +-0.0314985 0.12639 0.0112101 +0.0103131 0.0935662 -0.0290602 +0.0162881 0.0708862 -0.0299631 +-0.0486922 0.0693814 -0.0146213 +-0.00965082 0.0496857 -0.0310806 +-0.0472721 0.035073 0.043832 +-0.0505797 0.0528906 0.0145102 +-0.00843296 0.037899 -0.0156923 +-0.0276376 0.0383723 -0.00322479 +-0.0394609 0.174124 -0.00699657 +-0.0444987 0.125316 -0.00848377 +0.0413134 0.0732089 -0.00778125 +-0.0654437 0.17819 -0.0606312 +-0.0194942 0.0498847 0.046612 +-0.0470957 0.0376632 0.0453493 +-0.0435029 0.0832144 0.0426759 +-0.0134871 0.123689 0.0319378 +-0.0174978 0.0744121 0.0553624 +0.0333782 0.11597 0.0192002 +-0.0203318 0.0946383 0.0508766 +-0.0412055 0.0419705 -0.0232873 +-0.0815038 0.0885533 0.0328994 +-0.0703591 0.0620888 0.0120183 +-0.0334658 0.0396217 0.0500837 +-0.036771 0.0343273 0.0309808 +-0.0165061 0.126041 -0.00139683 +0.0369819 0.102039 0.0307859 +-0.0207502 0.0626823 -0.0352205 +0.0061481 0.104478 -0.0212191 +0.0323926 0.117262 0.0173907 +-0.0357746 0.08137 -0.0222094 +-0.0375579 0.0341991 0.0273875 +-0.0503289 0.0543622 0.0156654 +-0.0287388 0.076371 0.0428795 +-0.0631791 0.0597373 0.0065938 +-0.00649181 0.104468 0.0439265 +0.00653601 0.0924318 -0.0319265 +-0.0371937 0.168177 -0.0134205 +-0.0375614 0.128197 0.00751871 +-0.0898903 0.135179 0.0352087 +0.037196 0.0699864 0.036159 +0.0276189 0.0564968 -0.0197599 +0.0447325 0.0931835 0.0161662 +0.0398803 0.0927067 0.0314285 +-0.0468272 0.125328 0.0268353 +-0.0715318 0.0347543 -0.000134182 +-0.0859938 0.0978404 0.0272064 +-0.0460065 0.0410789 -0.0142843 +-0.0499829 0.0586014 0.0334591 +-0.0614235 0.172219 -0.0618413 +0.00350193 0.0474397 0.0500395 +0.0226438 0.0875613 0.0487078 +0.0374992 0.0644481 -0.0117672 +-0.00648083 0.111994 -0.0206545 +-0.0934649 0.120072 0.0123034 +0.00542168 0.12935 -0.00135496 +-0.0765071 0.126009 0.0528667 +-0.0308338 0.109919 -0.0183719 +0.018594 0.125548 0.0250901 +-0.0205082 0.0474421 0.0508554 +-0.0252811 0.168282 -0.0104061 +-0.051716 0.150726 0.0145842 +-0.0317716 0.0863018 -0.027557 +-0.0793223 0.151473 0.000118749 +-0.0823192 0.154091 0.0115231 +0.0432611 0.071972 -0.00279979 +-0.0761461 0.154973 -0.00265921 +-0.032878 0.156591 -0.0107994 +0.0360211 0.0628935 -0.0127986 +-0.0321679 0.120788 0.027294 +-0.00521106 0.038426 0.0176436 +0.0377365 0.0388851 0.0205214 +0.0183131 0.127887 0.0164149 +-0.0580398 0.0608775 0.0245548 +-0.0791963 0.108632 0.0349508 +-0.00201716 0.131125 0.0175388 +0.0407504 0.0633497 -0.00473671 +0.0447287 0.0917385 0.00119217 +-0.0534928 0.0848236 0.0453456 +0.00605741 0.0346665 0.039556 +-0.0276244 0.0436594 -0.0289391 +-0.00868086 0.056987 -0.0336771 +-0.058573 0.0613666 -0.00334192 +0.00741372 0.0360842 -0.0231635 +0.00514996 0.0337963 0.0112147 +-0.064123 0.113942 -0.0123233 +0.0527625 0.0723674 0.0204268 +-0.0354974 0.0634085 0.0409173 +0.0287147 0.0352518 0.00538775 +-0.0522813 0.0461425 0.0206748 +0.0547864 0.0548406 0.00018303 +0.00557978 0.101599 0.0456072 +0.00472897 0.0950887 -0.030676 +0.0355131 0.0781566 0.0390786 +0.0402454 0.0843611 -0.0117637 +-0.0605819 0.0468615 0.000669297 +-0.0394923 0.074754 0.042367 +-0.0331798 0.0779303 -0.0275261 +-0.0683095 0.178205 -0.0587107 +-0.00995429 0.0389301 0.0324647 +-0.0495001 0.108413 0.0388185 +-0.0659124 0.113781 -0.0114133 +-0.0404538 0.105662 0.0393313 +-0.0654729 0.17978 -0.0563035 +-0.0614888 0.0918402 0.045217 +0.0333657 0.0640658 -0.0168115 +-0.0809488 0.144539 -0.000825536 +-0.0545043 0.0918174 0.0448821 +-0.0504943 0.147794 0.0128405 +-0.0745085 0.118967 0.0529255 +-0.0596424 0.0629313 -0.00554826 +0.0600133 0.0636587 0.00714888 +0.0272456 0.0746657 -0.023693 +0.0433693 0.0575272 -0.00543691 +-0.0084928 0.0591086 0.0550857 +0.0327041 0.0686805 0.0402125 +-0.0371896 0.166685 -0.0135589 +0.0115191 0.107071 0.0419973 +0.0398757 0.096658 0.0297176 +-0.0882102 0.118977 0.047099 +-0.0794917 0.134473 0.0511764 +-0.0147562 0.0388704 -0.0103641 +-0.0729608 0.135493 -0.0074448 +-0.0829718 0.144576 0.00217748 +0.0121355 0.107265 -0.0192728 +0.00249537 0.0427747 0.0458993 +-0.0590743 0.136941 -0.00615344 +-0.0740187 0.0822617 -0.01463 +0.0274881 0.0349726 0.0165028 +0.0249311 0.118938 0.0303034 +-0.0860712 0.137702 0.0022107 +-0.00546373 0.0337972 -0.022595 +-0.0425018 0.0506116 0.0394181 +0.0044907 0.119648 0.0370088 +-0.066886 0.129814 0.0472408 +-0.033949 0.0667384 -0.0165589 +0.0265464 0.0699406 0.043619 +-0.0486667 0.134012 0.00340208 +0.0201914 0.117982 0.0346477 +-0.033458 0.0353739 -0.0310204 +-0.0251991 0.0536651 0.0400375 +-0.0689113 0.147966 -0.0319204 +-0.0650665 0.151369 -0.0356223 +-0.065894 0.118002 -0.00906639 +-0.00150449 0.0350731 0.0394353 +0.00648653 0.0951017 0.0524749 +0.0322641 0.11194 -0.00663069 +0.0356067 0.113152 0.00567562 +-0.0317604 0.120314 -0.00921321 +-0.0666072 0.0846933 0.0437683 +-0.0745085 0.13306 0.0516401 +-0.0914301 0.133749 0.0202171 +-0.0271327 0.0917299 -0.030613 +0.0356733 0.107346 0.028881 +0.021724 0.104691 0.0421173 +-0.0214953 0.0474568 0.0509792 +0.0189666 0.119003 -0.0102495 +0.0330783 0.0534528 0.0353209 +-0.0796959 0.154266 0.00805358 +-0.0370933 0.175555 -0.00565624 +-0.0324183 0.116998 -0.0137964 +-0.015069 0.117815 -0.0147928 +-0.0541455 0.0482522 0.0392578 +-0.017538 0.18639 -0.0186026 +-0.0486882 0.138613 0.0123943 +-0.0134995 0.0786948 0.0569449 +-0.0792474 0.0803083 0.033239 +-0.0523607 0.12647 -0.00557636 +-0.0261456 0.180134 -0.00803266 +-0.0654933 0.0875673 0.0446215 +0.0410795 0.0647663 -0.00478377 +0.038759 0.104954 -0.0010414 +0.0213206 0.103387 0.0432887 +0.00249002 0.112797 0.0416669 +-0.02662 0.157614 -0.0107103 +-0.0524373 0.0487028 0.0136696 +0.0367672 0.0605146 0.0354804 +-0.0769184 0.0832691 0.0369336 +-0.0650248 0.0337055 0.00787315 +-0.0515046 0.159378 0.00834015 +-0.0547588 0.079768 -0.0207581 +-0.0799475 0.0796892 0.0318714 +-0.0819371 0.129486 -0.00455242 +0.0162371 0.0359566 0.0423025 +-0.052497 0.108432 0.038849 +-0.0330169 0.0750953 -0.0275046 +-0.0367909 0.0856326 -0.0224706 +-0.0909792 0.143017 0.0266346 +-0.0790213 0.169435 -0.0369802 +-0.0224887 0.120777 0.0306794 +-0.0714154 0.063966 0.00470687 +-0.0833338 0.121705 0.0492392 +-0.00224884 0.0410819 0.0473849 +-0.0064961 0.0647536 0.0562043 +-0.0154675 0.0382885 0.0102401 +0.0316901 0.0754766 0.0423249 +-0.0682663 0.0409329 0.00988698 +-0.0397472 0.0753921 -0.0181662 +-0.0404974 0.0534278 0.0394751 +-0.027235 0.0964545 -0.0242996 +0.01346 0.094917 0.0501359 +-0.0101655 0.178729 -0.0267529 +-0.0368558 0.0971787 -0.022608 +-0.0618627 0.061311 0.023361 +-0.00785703 0.0384956 0.0242725 +-0.00828946 0.0422134 0.0491908 +-0.0626761 0.177191 -0.057627 +-0.0197826 0.0770974 -0.0390157 +-0.0283747 0.0368322 -0.0186629 +-0.0678325 0.165206 -0.0549947 +-0.0762767 0.179149 -0.050884 +-0.0126939 0.0585083 -0.0350263 +0.0259904 0.108758 0.0377477 +0.042201 0.0819186 0.0294354 +0.0164623 0.11028 -0.0168584 +-0.000216315 0.0411702 0.046762 +-0.0166283 0.0393036 -0.0275139 +-0.0660426 0.171124 -0.0420386 +0.0456785 0.0862046 0.0141695 +0.00138117 0.044939 -0.0263139 +0.0461205 0.0704224 0.0223322 +-0.0776245 0.0703136 0.0210685 +-0.0756983 0.148597 -0.0138657 +-0.00849865 0.0773628 0.0576515 +-0.0145231 0.0446315 0.0506096 +-0.0683418 0.0625091 0.0209713 +0.0172542 0.0764235 -0.0285503 +0.00803706 0.0343648 -0.0148062 +0.02126 0.0748992 -0.0268979 +-0.0630463 0.113863 0.0385547 +-0.0145507 0.0980154 0.0489953 +-0.0546077 0.131128 0.0350935 +-0.012492 0.061843 0.0546212 +-0.028497 0.0550003 -0.0233987 +0.0217846 0.11532 -0.0122874 +-0.0931885 0.121553 0.0392843 +-0.0522878 0.055669 0.0133058 +-0.0592645 0.138135 0.0336221 +-0.0895773 0.139272 0.0261794 +-0.0653179 0.156011 -0.0499494 +0.0382996 0.103126 -0.00513692 +-0.00322923 0.0355467 -0.0162422 +0.0141613 0.0988714 -0.0229756 +-0.0404979 0.0776396 0.043177 +-0.000517251 0.0386237 0.0468325 +-0.0745039 0.117561 0.0526615 +-0.0404908 0.101464 0.0408992 +0.00150976 0.0562224 0.0541662 +-0.0302058 0.0649962 -0.0264588 +-0.0427465 0.0393017 -0.0242897 +-0.0680504 0.12005 0.0525411 +0.0105239 0.101777 0.0472989 +-0.051788 0.0855011 -0.0215694 +0.0121427 0.124109 -0.00776299 +-0.0714952 0.123214 0.0534125 +-0.0377025 0.0444987 -0.0253388 +-0.0285008 0.0573948 0.0366096 +-0.0557355 0.0753549 -0.0185519 +-0.0136024 0.0377623 -0.0264268 +-0.055443 0.13396 0.033868 +-0.0329956 0.122915 -0.00595413 +-0.0659107 0.120913 -0.00886784 +-0.00952503 0.0920885 -0.0357277 +-0.0437604 0.036567 -0.0252782 +-0.020729 0.181491 -0.0220031 +0.00793492 0.130935 0.0197362 +-0.00287417 0.10736 -0.0221559 +-0.0531678 0.0503031 -0.00638771 +-0.0649059 0.116607 -0.0100071 +0.0311853 0.0491232 0.0343139 +-0.0464498 0.034849 -0.0185661 +-0.0448976 0.168579 0.00154181 +0.0324248 0.0752705 -0.0187807 +0.00488488 0.0387234 -0.0100497 +-0.0607447 0.0752603 -0.0176616 +-0.0575406 0.0387439 -0.00960491 +-0.0874426 0.110454 0.0173412 +-0.0517698 0.0516016 0.0312301 +-0.0727656 0.156832 -0.0339136 +0.0123073 0.0638424 -0.0304488 +-0.00866157 0.0541436 -0.0334268 +0.00183737 0.0373069 0.04638 +-0.0298138 0.0344903 0.0411187 +-0.0674167 0.149888 -0.0375972 +-0.0770317 0.088754 0.0382806 +-0.0857815 0.0897033 0.0272482 +-0.0125983 0.037741 -0.0261872 +0.0182378 0.0893522 -0.0266421 +-0.0766704 0.154203 -0.00290271 +-0.0684648 0.0617211 0.0180797 +0.0505111 0.0637895 0.0291551 +-0.0497918 0.143216 0.0113941 +-0.0616227 0.156855 -0.0295846 +0.0290304 0.0968725 0.0421292 +-0.0756542 0.0679921 0.00394259 +-0.0526765 0.0514226 0.0124143 +-0.0625972 0.0348156 0.0215996 +-0.0544966 0.0791235 0.0440855 +-0.0544133 0.159808 0.00694146 +2.76528e-05 0.0391548 -0.0114154 +-0.00549746 0.0503818 0.0516227 +-0.0646199 0.0359342 0.0410351 +0.0410489 0.0445052 0.0289111 +-0.0356376 0.0548341 -0.0105043 +0.0272051 0.0465425 -0.0127095 +-0.0513967 0.161204 -0.00381805 +-0.0424671 0.124776 0.022048 +-0.0300883 0.0335187 -0.027157 +-0.0362553 0.0336801 0.0101688 +0.0513156 0.0588831 -0.00408417 +0.0399488 0.0688733 -0.0097971 +-0.0617146 0.155302 -0.0255819 +-0.0112103 0.129394 0.0199977 +-0.0552256 0.153277 0.0254807 +-0.0697772 0.0409122 0.00855159 +-0.0257631 0.0755055 -0.0369491 +-0.0601959 0.0422699 -0.00706205 +-0.0475933 0.134581 0.0184866 +0.0267481 0.0659374 0.0438828 +-0.0790343 0.0886679 0.0360671 +0.0606094 0.0637127 0.00915317 +-0.0823359 0.140394 0.000222625 +-0.0792589 0.1445 -0.00280742 +0.0288607 0.118772 0.0260462 +-0.000258207 0.0388058 4.93079e-05 +0.0142249 0.0779815 -0.0305449 +0.0279207 0.111816 -0.0105079 +-0.0649061 0.108122 -0.0141961 +0.0372666 0.0547889 -0.00619261 +-0.0258342 0.159627 -0.000620301 +-0.0761165 0.0874143 0.0388159 +0.0425599 0.101502 0.0121632 +0.0533305 0.0723883 0.0073663 +-0.0814882 0.139397 0.0468344 +-0.0119496 0.127575 -0.00116297 +0.0308488 0.116432 0.0267923 +-0.0342458 0.127284 0.0102001 +0.0488271 0.0733963 0.0130056 +-0.017912 0.059765 0.0509406 +0.0133103 0.0753629 0.0544488 +-0.0896061 0.126751 0.00429509 +0.034401 0.0461473 -0.00601616 +-0.0485411 0.166778 0.000587101 +0.0342862 0.0782566 -0.0167489 +-0.00549615 0.0925657 0.0562617 +-0.0700277 0.153659 -0.0489787 +0.00562336 0.034628 0.021452 +-0.0825014 0.0978733 -0.00561152 +-0.0665019 0.0818141 0.0428543 +-0.0628077 0.166262 -0.0415912 +0.0329576 0.0753133 -0.0177979 +0.0159612 0.0887478 0.0513106 +-0.0348521 0.0972102 -0.0229902 +0.00689753 0.13043 0.00224143 +0.0163113 0.0637479 -0.0291811 +-0.0681449 0.144372 -0.0168262 +-0.0709402 0.170831 -0.0510269 +-0.0618586 0.161576 -0.034591 +-0.05709 0.0562779 0.00261705 +-0.0511762 0.163872 0.00329038 +-0.0295002 0.0688631 0.0391758 +-0.0548706 0.0634738 0.0317723 +0.00519565 0.0838361 -0.0338494 +0.0412244 0.0703917 -0.00779979 +-0.0485608 0.164 0.00493162 +0.0405319 0.0913292 0.030651 +-0.0364055 0.0394201 0.0459276 +-0.0885895 0.126718 0.00227148 +-0.00135158 0.0925397 -0.0341169 +-0.0155034 0.0472755 0.0490261 +-0.0533709 0.0334238 -0.0075905 +-0.0135602 0.174221 -0.0197865 +0.0151695 0.0534137 0.0481113 +0.00249824 0.119676 0.0375233 +-0.0574904 0.0847348 0.0442092 +-0.0706266 0.111419 0.0453421 +-0.0498404 0.122243 -0.0112035 +-0.0580787 0.133988 -0.00600022 +-0.0856455 0.0845341 0.000486997 +-0.0677324 0.0847093 0.0432514 +-0.0516192 0.112658 -0.0171697 +-0.0294883 0.101537 0.0426799 +-0.0562967 0.0548357 0.00668262 +-0.0870689 0.0968011 0.00243877 +-0.0809104 0.126584 -0.00546143 +0.0226682 0.115322 0.0347114 +-0.0702279 0.156078 0.0244771 +0.00613975 0.0976727 -0.0254362 +-0.0654107 0.0782591 0.0414837 +0.0154936 0.104462 0.0445958 +-0.0557216 0.125528 0.0387388 +-0.0708946 0.1037 -0.0131771 +0.0207514 0.10232 -0.0203322 +0.040798 0.105646 0.00916422 +-0.0789759 0.136856 -0.00458832 +0.00163159 0.126824 0.0304308 +0.0217692 0.0444645 -0.0177596 +0.00149843 0.0965502 0.0531993 +0.00416774 0.034456 0.0194982 +-0.022279 0.185099 -0.0171819 +-0.0144819 0.0759021 0.0565083 +-0.062395 0.163038 -0.0545883 +0.0386856 0.0757975 -0.0108084 +0.0230618 0.0389706 0.0372995 +-0.0661823 0.154393 0.00121795 +-0.0751879 0.179229 -0.0530087 +-0.000499764 0.0590718 0.0548831 +-0.0616117 0.16 -0.0305904 +-0.0254372 0.0796492 0.0521904 +-0.087722 0.128407 0.0462822 +-0.0361331 0.122312 0.027301 +-0.0259579 0.0383264 -0.00469023 +-0.0615278 0.0399873 -0.00779984 +-0.0911978 0.147452 0.0151543 +-0.0776353 0.15693 -0.0189052 +-0.048662 0.0345502 0.0387985 +0.00500615 0.0390969 0.0281732 +-0.0664605 0.152204 -0.0437352 +-0.0514963 0.157854 0.00954267 +-0.0893902 0.139278 0.0291842 +-0.092072 0.128303 0.0302461 +-0.0166194 0.0421642 -0.027592 +-0.0880283 0.128084 0.00127828 +-0.06275 0.178179 -0.0598124 +-0.0242491 0.0796961 0.0538111 +-0.0575802 0.14965 0.0326026 +-0.0598499 0.0364094 -0.00954648 +0.0260337 0.0639191 -0.0225668 +-0.0215138 0.185205 -0.0184453 +0.00733204 0.0567933 -0.0307054 +-0.0394107 0.125604 0.021627 +-0.0805747 0.154604 0.0238516 +0.0319556 0.0942571 0.0410831 +-0.0503335 0.0345244 0.0401985 +-0.0521615 0.159088 -0.00368491 +-0.0816591 0.0828436 -0.00556986 +0.0120628 0.0346214 0.0245844 +0.00946799 0.112678 0.0395888 +-0.00501719 0.0348021 0.0425449 +-0.080434 0.0763484 0.0258387 +0.0419394 0.0802864 -0.00678235 +-0.0270715 0.179993 -0.0160072 +-0.00929516 0.17029 -0.0258484 +0.028889 0.0549767 0.0398373 +-0.0324184 0.123701 0.0227019 +-0.00768132 0.0976452 -0.0294292 +-0.0534956 0.0478266 0.0400304 +-0.0637998 0.0852745 -0.0191701 +0.0175395 0.0364962 0.0420884 +0.0289699 0.100814 0.0402993 +-0.0384924 0.0478181 0.0398313 +-0.00649796 0.0457161 0.0472731 +0.00861625 0.13122 0.00857267 +-0.0424707 0.0634258 0.0409808 +-0.0147714 0.163994 -0.0109737 +0.0514504 0.0735674 0.0125302 +0.0157166 0.0461353 0.0435597 +-0.0886232 0.152074 0.0182297 +-0.0732612 0.155462 -0.02991 +0.0560042 0.0728404 0.0157211 +-0.0465551 0.0447198 -0.0107805 +-0.020486 0.18455 -0.0138786 +0.00948927 0.0976692 0.0490505 +0.0112322 0.0342419 -0.000927635 +0.0153695 0.0617406 0.0502582 +-0.0137598 0.0382596 0.0196658 +0.0302365 0.0828976 -0.0200496 +-0.00484087 0.0994589 -0.0252596 +-0.0335771 0.177292 -0.00581839 +-0.0706171 0.160991 -0.0459386 +-0.0381352 0.155099 0.00439417 +0.0262713 0.112733 0.0346521 +-0.0288992 0.0377652 0.0242203 +-0.0741081 0.174769 -0.0407073 +0.0312687 0.106096 -0.0123707 +-0.0467828 0.168244 0.000200438 +-0.0544952 0.0440117 0.0450302 +0.00623037 0.129867 0.000104943 +-0.043169 0.163647 -0.0101027 +-0.0034944 0.103046 0.0439357 +-0.0265042 0.106069 -0.02235 +-0.0577843 0.0811473 -0.0206854 +-0.0358177 0.0886369 -0.024178 +-0.0726405 0.148337 -0.0310398 +-0.0454975 0.111194 0.0370842 +-0.0671848 0.0335335 0.00220964 +-0.0117936 0.0667192 0.0544625 +-0.0609674 0.125285 -0.00834926 +-0.080841 0.0760714 -0.00147772 +-0.0522091 0.118697 -0.0134778 +-0.074349 0.162439 -0.0349528 +-0.0740415 0.112641 0.0489542 +-0.0294567 0.0847909 0.044594 +-0.0204364 0.038385 0.0254029 +-0.0497015 0.070866 -0.0150622 +-0.0525829 0.113848 -0.0164008 +-0.0415348 0.163761 0.00444738 +-0.0644934 0.106993 0.039043 +0.0437981 0.0734503 -0.00176783 +-0.0284962 0.0946634 0.0451029 +0.0309795 0.0506032 0.0357766 +-0.0395331 0.128532 0.0067941 +-0.0424235 0.12018 -0.013117 +-0.0197167 0.103079 -0.0233045 +-0.0430994 0.12944 0.0113807 +-0.0913339 0.117411 0.0283055 +0.026348 0.0463448 0.037827 +-0.0406738 0.0606904 -0.0121867 +-0.071511 0.0930107 0.0417462 +-0.0866623 0.0964635 0.0264805 +0.00386952 0.131337 0.0182591 +0.0282305 0.08443 -0.0217055 +0.0128412 0.0347905 0.0282102 +0.00434097 0.053874 -0.0300717 +-0.0754795 0.0704499 0.0266608 +-0.0699695 0.135529 -0.00821968 +-0.0305143 0.0348089 0.0211376 +0.00750189 0.118272 0.0376599 +-0.0504996 0.108397 0.0385655 +-0.0779682 0.135412 -0.00525448 +-0.0273965 0.0380183 0.0261038 +-0.0520915 0.129726 0.0334448 +-0.0221568 0.157426 -0.00647102 +-0.0562219 0.0560519 -0.00142054 +-0.0817829 0.110167 0.0313299 +-0.0502435 0.0335698 -0.00160666 +0.0331444 0.0584441 -0.0147212 +-0.00651273 0.0760152 0.058184 +-0.0285619 0.108073 -0.0204718 +-0.0157027 0.123907 0.0301351 +-0.0175006 0.10024 0.0438179 +-0.0297515 0.154263 -0.00514597 +-0.0475033 0.113884 0.0346438 +-0.0154952 0.087016 0.0568367 +0.0435889 0.0706095 -0.000776861 +-0.0930208 0.116049 0.0173125 +-0.0783399 0.174997 -0.0480125 +-0.0650728 0.117149 0.0481049 +0.0600369 0.0650499 0.00814341 +-0.0678832 0.147765 -0.0303891 +-0.0802136 0.0813857 -0.00655277 +-0.0356852 0.127701 0.00820492 +0.0154871 0.0990335 0.0473819 +-0.019377 0.127678 0.00978651 +-0.0208657 0.123339 0.0268408 +-0.0553906 0.073233 0.0409139 +0.0560337 0.0553031 0.0245952 +-0.0306612 0.0816984 0.0420491 +0.04335 0.0902653 0.0251673 +-0.0137008 0.0599733 -0.0359611 +-0.0535493 0.045819 -0.00734382 +0.0152704 0.07093 -0.0305648 +-0.0706849 0.0819434 0.0406373 +0.0104915 0.114065 0.0387753 +-0.052073 0.150157 -0.00315276 +0.00150908 0.0458287 0.0477014 +-0.00149907 0.122451 0.0357652 +0.0346578 0.114254 0.0196698 +-0.0263079 0.125672 0.00579971 +-0.0662371 0.173912 -0.0594768 +-0.0111949 0.178453 -0.0296295 +-0.039457 0.0403768 -0.0273046 +-0.0321606 0.153429 -0.00535973 +0.0505072 0.0678423 0.0265215 +0.0377143 0.106919 0.0261871 +-0.0717609 0.172825 -0.0369735 +-0.034656 0.0592094 -0.011649 +-0.0237103 0.0348634 0.0507821 +-0.0409865 0.0355803 0.00929737 +0.0240747 0.0915746 0.0472686 +-0.0576816 0.0336048 -0.0104516 +0.034582 0.0563647 0.0357928 +-0.0304985 0.0631621 0.0381216 +-0.0145978 0.0392398 -0.0269855 +-0.0446029 0.130656 0.0108143 +0.0240159 0.124704 0.0156714 +0.00222038 0.0796794 -0.0348837 +-0.029229 0.179986 -0.0130226 +-0.0371614 0.0338798 0.00980443 +-0.0654857 0.101487 0.0416824 +-0.0386286 0.0534191 -0.0107521 +-0.0743388 0.0659419 0.0131754 +-0.0775178 0.172972 -0.0399134 +-0.0704983 0.0999903 0.0403231 +-0.0754673 0.153642 0.0315487 +-0.0567915 0.158113 0.00751453 +-0.0733158 0.165215 -0.0409863 +-0.0878452 0.096803 0.00445868 +0.02849 0.120167 0.00308975 +-0.0866911 0.107697 0.0133542 +-0.0422556 0.127428 -0.00269381 +-0.0684868 0.135467 0.0467048 +-0.0187173 0.108826 -0.0212527 +-0.0109134 0.038586 0.0018115 +-0.0689089 0.106601 -0.012938 +0.00232768 0.0597693 -0.0328325 +-0.0759088 0.150426 0.0375079 +-0.0642836 0.175364 -0.0612207 +-0.0626162 0.142488 0.0376248 +-0.0388973 0.150052 -0.00339157 +0.0187974 0.0398349 -0.0187285 +0.0404333 0.0725805 0.0320798 +-0.0863763 0.0991625 0.0261078 +0.0544186 0.0725633 0.0195702 +-0.076294 0.155585 0.0106948 +-0.0611522 0.045903 0.0393286 +-0.0167746 0.0756989 -0.0389455 +-0.0578115 0.0619893 0.0271205 +-0.0127071 0.179586 -0.0289228 +-0.0568431 0.0926948 -0.0216401 +-0.0900812 0.150215 0.0221142 +0.0222403 0.0416489 -0.00972259 +-0.0504069 0.135839 0.0247969 +-0.0304966 0.0545819 0.0366047 +-0.0103146 0.180354 -0.0288775 +0.0320122 0.117952 0.0129635 +0.0440424 0.0496996 0.0318585 +0.0393181 0.0603877 -0.00577734 +-0.071953 0.16101 -0.0409434 +-0.0437665 0.168716 0.00196199 +-0.0498819 0.105595 -0.0195612 +0.0217639 0.0458254 -0.0188683 +-0.0921421 0.116123 0.0383102 +-0.0636791 0.157483 -0.0138656 +0.0266706 0.04428 -0.00700704 +0.0433132 0.0818321 0.0274518 +-0.0580456 0.0494852 0.00468232 +-0.0735836 0.159386 -0.00731186 +-0.0544231 0.0344532 0.039385 +-0.00150237 0.089761 0.0564112 +0.015933 0.126357 0.0269718 +-0.0425015 0.0719333 0.0422422 +-0.0589488 0.147198 -0.00200697 +-0.087209 0.0941073 0.00444199 +-0.0120214 0.178126 -0.0292101 +-0.0835465 0.101952 0.0288636 +0.041496 0.0555737 0.0320634 +-0.0025007 0.0675576 0.0566246 +-0.0756877 0.15767 -0.00739081 +-0.0105023 0.0829243 0.0578427 +-0.00627368 0.128136 0.0276028 +-0.0404708 0.109814 0.0374017 +-0.00378356 0.130498 0.0212315 +0.0580765 0.0566038 0.0222343 +-0.0853725 0.111782 0.0273822 +0.0428559 0.0972978 0.0221679 +0.00122739 0.121444 0.0362285 +-0.0274798 0.0446461 0.0507675 +-0.0304832 0.12104 0.0263992 +-0.0371379 0.127502 0.0150528 +-0.0778671 0.177131 -0.0494084 +-0.0775564 0.166657 -0.0379504 +-0.0605167 0.0386224 -0.00865968 +-0.0171147 0.161213 -0.00734926 +-0.0726687 0.161352 -0.00991102 +0.032766 0.0700345 0.0403232 +-0.0458559 0.10138 -0.0215412 +0.017353 0.0374009 0.0430484 +0.000357196 0.0347559 0.0401008 +-0.0604421 0.0427792 0.0246961 +-0.0440271 0.128143 0.0184429 +0.0423724 0.056151 -0.00596664 +0.00534844 0.0596161 -0.0309806 +0.0320447 0.061134 -0.0177676 +-0.00279591 0.0988433 -0.0266823 +0.0289846 0.0664902 -0.0199255 +0.000300027 0.0360761 0.019065 +-0.0250833 0.0379957 0.0175874 +0.0345167 0.0754586 -0.0157294 +0.0153241 0.0623295 -0.0291944 +-0.0609083 0.0612023 0.0236586 +-0.0698972 0.0655268 -0.00153079 +0.00337067 0.115645 -0.0185908 +-0.0315398 0.0589058 0.0377684 +-0.00748372 0.0488969 0.0502433 +-0.0877886 0.0861226 0.0174689 +0.0414464 0.101443 0.020163 +0.0252372 0.0926012 -0.0220221 +-0.0572172 0.0498044 0.00711465 +-0.0384957 0.0719179 0.0419735 +0.0143485 0.0552312 -0.0288146 +-0.0512659 0.0360808 0.0462964 +-0.0880011 0.0941555 0.00641769 +-0.0508873 0.109845 -0.0186279 +-0.0514991 0.112527 0.0359192 +-0.0338144 0.0342727 0.0263277 +-0.0615036 0.0804118 0.0430159 +-0.0663263 0.0606754 0.0176657 +-0.0909825 0.11607 0.0303184 +0.0184707 0.107054 0.0413783 +-0.0243398 0.183957 -0.0138554 +-0.0158705 0.161111 -0.00904539 +-0.0335094 0.0647262 0.0398847 +-0.0782927 0.098997 -0.00960155 +0.0486963 0.0730972 0.0159514 +-0.0478872 0.0335336 -0.00475407 +-0.0154917 0.0883884 0.056678 +-0.077344 0.119067 0.051823 +-0.0560293 0.0674866 0.0368481 +-0.0635813 0.138158 0.0379352 +-0.0217661 0.0670215 -0.0366181 +0.0483442 0.0575601 -0.00531363 +-0.0237817 0.0727523 -0.0377511 +0.0443603 0.0490341 -0.0052894 +-0.0604973 0.0904382 0.0452731 +-0.0627563 0.152415 -0.0301468 +-0.0714195 0.067071 -0.00151156 +-0.0861662 0.147397 0.00721409 +0.011631 0.0474937 0.0464252 +0.0254946 0.0406248 0.0343049 +0.035443 0.111045 0.0256623 +-0.000588677 0.037658 -0.0249499 +-0.0388448 0.0971399 -0.0223049 +-0.0660244 0.166553 -0.0262486 +-0.048499 0.0848032 0.0451307 +0.0371019 0.111384 0.0119604 +-0.00927598 0.177254 -0.0287785 +-0.0389846 0.1533 -0.00797514 +-0.0351198 0.0484277 -0.0173281 +-0.00353807 0.0389271 0.0301841 +0.0132013 0.0864568 -0.0307211 +-0.0390625 0.110364 -0.0188163 +0.033372 0.106071 0.0326127 +-0.0831505 0.0857608 0.0304017 +0.0552187 0.0635647 0.027041 +0.0399168 0.0999289 0.0271558 +-0.0579697 0.0339719 0.0233097 +-0.0137397 0.178677 -0.0217984 +-0.0203244 0.0385446 0.0306811 +0.00122549 0.0359125 0.00298025 +0.0117447 0.0343946 -0.0103375 +-0.0913959 0.132306 0.0102259 +-0.0429194 0.0898997 -0.0223492 +-0.0511515 0.0337361 -0.0129379 +-0.0750027 0.155319 0.00677634 +-0.0771027 0.0689891 0.00817725 +-0.0353224 0.0340121 0.0244595 +-0.0291276 0.0386567 -0.0130433 +0.0303577 0.105377 -0.0136057 +0.0235082 0.12516 0.0112114 +-0.00249775 0.0787967 0.0582683 +0.0533686 0.0732758 0.0102917 +-0.0586915 0.0472669 0.00864036 +0.0328626 0.0738919 -0.0178203 +-0.017795 0.038392 0.00241319 +-0.044502 0.0478297 0.0399289 +-0.0747378 0.0687745 0.000531905 +0.0172248 0.12732 0.0217261 +0.0428517 0.0885116 0.026874 +-0.078089 0.159705 -0.0229182 +-0.00858725 0.0362397 -0.025275 +-0.0867205 0.102198 0.00542391 +-0.0926774 0.131034 0.0232376 +0.0167938 0.128074 0.00445644 +0.0541315 0.0553714 0.0271399 +-0.000925431 0.131188 0.0179397 +0.0288719 0.121048 0.0132077 +-0.00849451 0.0965679 0.0534544 +0.0226575 0.102902 -0.0189538 +-0.0787984 0.113337 -0.0032043 +-0.0099585 0.1135 -0.0182227 +-0.0282274 0.162443 -0.0041123 +-0.082525 0.0896742 -0.00660526 +-0.0477053 0.0708612 -0.0154107 +-0.0435026 0.0465062 0.0407289 +0.00126756 0.0669175 -0.0339113 +-0.0341799 0.0335887 -0.0224091 +-0.0623664 0.0443972 0.0296888 +-0.0374964 0.0676867 0.0416821 +0.00859545 0.0382141 0.0296981 +0.0458872 0.0834155 0.0151706 +-0.0908205 0.132399 0.0292201 +-0.0191683 0.0336751 -0.0214022 +-0.0140554 0.126614 -0.00210251 +-0.0260065 0.0335246 -0.026366 +0.0324259 0.0399358 -0.00240332 +-0.0296544 0.0346993 -0.0301222 +-0.0669615 0.129698 -0.00899609 +-0.0471845 0.0383965 -0.0142868 +-0.0572808 0.0345537 0.0438127 +-0.0627957 0.153425 0.0330074 +-0.0515105 0.13416 -0.00180112 +-0.0434907 0.171345 -0.00503558 +-0.0677742 0.0808646 -0.0174732 +0.00350312 0.0441648 0.0458711 +0.0291321 0.0686302 0.0420784 +0.0132792 0.0343795 0.0214237 +-0.0866978 0.12169 0.0483599 +-0.00350013 0.0801522 0.057807 +0.0371657 0.0997172 -0.00981258 +-0.0447383 0.0738987 -0.0178782 +-0.0605228 0.155495 0.0235493 +-0.0362392 0.151744 -0.00510561 +0.0454797 0.0637982 0.0288243 +-0.0672083 0.0609402 0.0172424 +0.0241031 0.0782197 0.0489777 +0.0442629 0.0672699 0.000591455 +-0.0289948 0.0522303 -0.0223864 +-0.0645013 0.0774777 0.0413253 +0.0444938 0.0959562 0.00517859 +-0.00459579 0.039143 -0.025596 +0.0184671 0.0913654 0.0479185 +0.0146407 0.129582 0.00935921 +-0.0505573 0.0439128 0.0441317 +-0.0141262 0.119616 -0.0126879 +-0.0849191 0.117035 0.0482987 +0.0280536 0.119554 5.13011e-05 +-0.0247655 0.0712486 -0.0365856 +0.0034971 0.091096 0.055256 +-0.0641848 0.0432086 0.0316934 +-0.0881185 0.151555 0.0230923 +-0.0680885 0.16093 -0.05501 +0.0474345 0.0682488 0.00159582 +0.0111403 0.105858 -0.0199086 +-0.0369545 0.0349347 0.0427177 +-0.0604782 0.144516 -0.00363507 +-0.0394712 0.08608 0.0435352 +-0.0548214 0.143869 0.0295389 +-0.028506 0.107069 0.0398546 +0.0281659 0.121502 0.0158045 +-0.0797197 0.143117 -0.0027917 +-0.0616803 0.166235 -0.0555923 +-0.0204271 0.0893191 -0.0369723 +0.0361287 0.085855 -0.0169039 +-0.00251199 0.107268 0.0437857 +-0.0114962 0.0842854 0.0575311 +-0.0738001 0.0651206 0.00865838 +-0.0114808 0.0353662 -0.0177045 +0.0391473 0.0421646 0.0269754 +-0.0565891 0.129759 0.0374849 +-0.0720408 0.171996 -0.0342175 +-0.0139288 0.0883705 -0.0380287 +-0.0562656 0.0335637 0.0133743 +-0.0196985 0.0957936 -0.0295783 +-0.00486881 0.104509 -0.0228932 +-0.0550525 0.129598 -0.0055846 +-0.0584858 0.0776493 0.0431837 +-0.0898534 0.121302 0.00430136 +-0.0191218 0.165312 -0.0179178 +-0.0249563 0.0383168 0.00102848 +-0.0199274 0.0958752 0.0490354 +-0.0574825 0.113918 0.0359516 +-0.00850157 0.101663 0.0440465 +-0.0873724 0.124348 0.0475064 +0.00764213 0.03621 -0.0128239 +-0.0264494 0.0648769 0.0395324 +0.0541546 0.0547912 -0.000791322 +-0.0434926 0.0789866 0.0425224 +0.0241906 0.121901 0.0271611 +-0.0866809 0.0819772 0.0124969 +-0.0717212 0.0344863 0.00580157 +0.0302841 0.11623 -0.00325108 +-0.0737112 0.155478 -0.0269075 +-0.0424683 0.108486 0.0389261 +0.0176716 0.0658898 0.0500991 +0.0494857 0.064014 -0.00214923 +-0.0514961 0.0945888 0.044111 +0.0340749 0.0901032 -0.0173771 +-0.0719584 0.0942006 0.0415089 +-0.0544894 0.0594391 0.0238452 +-0.0877192 0.101 0.0223776 +-0.0758319 0.173116 -0.0385323 +-0.0114857 0.119632 0.0369891 +-0.0313874 0.0581183 -0.0163942 +-0.0157652 0.0728861 -0.0388826 +0.0167046 0.0945555 -0.0241181 +-0.000498244 0.0647983 0.0567029 +0.0256473 0.0420743 0.0363142 +-0.0630437 0.12273 0.0457647 +-0.0540131 0.144678 0.0264098 +0.0135054 0.10711 0.0421551 +-0.00428335 0.124198 -0.00969837 +0.0415325 0.0816649 -0.00777347 +-0.0392229 0.0337594 -0.0179786 +0.0593141 0.0691549 0.00914325 +-0.0219522 0.0382139 0.00717586 +0.0288925 0.112764 0.0331675 +-0.0524014 0.152599 0.0134601 +-0.0628726 0.147915 -0.0152353 +-0.030456 0.158107 0.0014598 +0.0308953 0.0400111 0.0272142 +-0.0757616 0.109947 0.0435791 +0.0253341 0.0591059 -0.0237971 +-0.0261555 0.155801 -0.00568703 +-0.0679463 0.128236 -0.00906158 +-0.0156387 0.0377596 -0.0169892 +-0.0757064 0.112028 0.0472849 +-0.0155135 0.0631057 0.0533345 +-0.0512066 0.125627 -0.00670494 +-0.0896222 0.111892 0.015334 +-0.0493777 0.160927 -0.00574679 +-0.0630274 0.166296 -0.040584 +0.058244 0.0580344 0.0225642 +0.0413547 0.102812 0.0011821 +-0.0162922 0.125122 0.0270033 +0.02338 0.0632213 0.0460213 +0.0609114 0.0623534 0.0131596 +-0.0691061 0.164802 -0.0173282 +-0.0870447 0.0977755 0.0254107 +-0.00849378 0.112803 0.0415796 +0.0145027 0.115416 0.0371643 +-0.0184257 0.066889 0.0526426 +-0.0448982 0.123992 0.0241166 +-0.050497 0.0903958 0.0446608 +-0.0315626 0.0348573 0.0456798 +-0.0684915 0.0902546 0.0428415 +-0.0180785 0.0337977 -0.021304 +0.0043349 0.0389929 -0.00853324 +-0.0830349 0.153941 0.0230111 +-0.0800798 0.103192 -0.0065999 +0.0437731 0.0973301 0.016155 +0.00944321 0.131132 0.0160037 +-0.0514165 0.0627417 0.0327301 +-0.0528926 0.154865 0.0118243 +0.0187407 0.0740964 0.0517477 +-0.0721682 0.0657282 0.00147121 +0.00959045 0.131031 0.00893055 +-0.0694847 0.181423 -0.0563964 +-0.0569551 0.11454 -0.0150747 +-0.0821005 0.0885236 0.0320901 +-0.0174725 0.0383553 0.00432532 +-0.00258809 0.0348892 -0.0237423 +0.0413648 0.0939401 0.0283252 +-0.00375638 0.13079 0.0183493 +-0.0686466 0.0719376 -0.0111307 +-0.0688202 0.180176 -0.0531787 +-0.0397209 0.0710215 -0.0169451 +0.0184831 0.105752 0.0426872 +0.00809551 0.112572 -0.0192987 +0.0206432 0.121117 -0.00652883 +-0.0718516 0.0979698 -0.0147575 +-0.0662716 0.170413 -0.0392349 +0.0237477 0.0605032 -0.0251433 +-0.0340875 0.177472 -0.00744261 +-0.0167857 0.0784752 -0.0385587 +-0.0565291 0.0373798 -0.0104777 +0.00297843 0.0341587 0.014086 +-0.0667756 0.124253 0.0509201 +-0.026364 0.0359692 -0.029405 +-0.0550408 0.0334649 -0.000671931 +-0.0697701 0.0874139 0.0423816 +0.0246944 0.0835826 0.0481083 +0.0199488 0.115322 0.0360728 +0.0383916 0.042968 -0.00337479 +-0.0365829 0.0335193 -0.0246869 +-0.0355007 0.112502 0.0349387 +-0.0689238 0.125301 -0.00884615 +0.0395927 0.0385536 0.0157178 +-0.0889313 0.0875027 0.0114635 +0.0448665 0.0945715 0.00517989 +-0.0477042 0.0664777 -0.0141832 +-0.0434727 0.125255 -0.0084227 +-0.0166904 0.169787 -0.0155577 +-0.0134983 0.0501789 0.0495792 +-0.0624968 0.0833205 0.0441176 +-0.0342132 0.0345231 0.0384015 +0.043295 0.084533 0.027498 +-0.0819819 0.112797 -0.000848269 +0.0121624 0.129948 0.0198557 +-0.0674677 0.10143 0.0408399 +-0.0626754 0.059895 0.0191264 +-0.0367892 0.0459324 0.0404864 +-0.027194 0.0764697 0.0455544 +-0.0824053 0.0748814 0.00852871 +-0.0656294 0.0642362 -0.0044412 +0.032725 0.116988 0.0160848 +-0.0764226 0.102162 0.0358668 +0.00148048 0.0952613 0.0542408 +0.0228866 0.122341 0.0280976 +-0.0584486 0.139576 0.0330542 +-0.0402835 0.123242 -0.0103332 +-0.012241 0.0406566 0.0504983 +-0.0489426 0.0614374 0.0351759 +-0.0844851 0.0778045 0.00951927 +-0.0369817 0.156591 0.00432745 +-0.0882804 0.103688 0.0163664 +-0.0258065 0.0825691 -0.0373737 +-0.0355052 0.102861 0.0407303 +-0.0524183 0.131115 0.0329855 +-0.0227031 0.175691 -0.0136597 +0.050697 0.0684106 0.00144017 +0.000504835 0.0911354 0.0558722 +0.00231832 0.0583343 -0.0324165 +-0.0148886 0.169807 -0.0164639 +-0.0722033 0.152534 -0.0417656 +-0.0134817 0.073078 0.0557755 +-0.0255231 0.109882 0.0391184 +-0.0655581 0.135384 0.0421104 +-0.024745 0.0698061 -0.0360534 +0.0559546 0.0524347 0.0227151 +-0.0283257 0.118773 -0.011655 +-0.0335185 0.0974234 0.0440535 +-0.0817699 0.0748179 0.0155353 +-0.027189 0.162441 -0.00437298 +-0.0267454 0.0711222 -0.0350441 +-0.03015 0.171175 -0.0170282 +-0.026605 0.06607 0.0397555 +-0.074698 0.179765 -0.0510072 +0.0143367 0.0504741 0.0468665 +-0.0594975 0.111137 0.0367915 +-0.0346758 0.127158 0.0144691 +-0.0465015 0.0847604 0.0446321 +0.00381747 0.0354686 0.0455691 +0.0172732 0.0792708 -0.0288683 +0.0323738 0.104756 0.0346971 +-0.0794458 0.0813481 -0.00752304 +-0.0312226 0.0367355 -0.0304453 +-0.0110616 0.168437 -0.0238044 +-0.0579369 0.119806 -0.0105246 +-0.0337394 0.0355643 0.0323212 +0.0312129 0.0525777 -0.012761 +-0.0346988 0.120729 -0.0096591 +-0.0388776 0.0364147 0.043017 +-0.0271127 0.16377 -0.0158754 +-0.0114338 0.0347606 0.0448027 +-0.0897559 0.114544 0.00631807 +0.0408171 0.04213 0.0255289 +-0.0648854 0.102482 -0.0170908 +-0.0137359 0.061178 0.0537969 +-0.00359581 0.130946 0.00835725 +0.0439346 0.0959403 0.0181595 +-0.0194977 0.104404 0.0429832 +-0.0691323 0.0776098 0.0394254 +-0.00248627 0.097432 -0.0292057 +0.00445885 0.0387258 0.0265895 +0.0492859 0.0567642 0.0307116 +-0.077476 0.164468 -0.0240677 +-0.0666867 0.175728 -0.049503 +-0.0251661 0.0664206 0.0424455 +-0.027701 0.0549269 0.0368456 +-0.018943 0.164042 -0.0169159 +-0.0435133 0.0846552 0.0431729 +-0.0888345 0.136443 0.0400961 +0.00149473 0.112812 0.0419217 +-0.0298299 0.09304 -0.0247313 +-0.0836967 0.0790161 0.00252063 +-0.000924151 0.039273 -0.0117161 +-0.0567677 0.0811908 -0.0210238 +-0.0934681 0.120116 0.0253121 +-0.0429479 0.170625 -0.000616016 +-0.075975 0.156283 -0.00563956 +-0.00861288 0.0384077 0.0151551 +-0.00160584 0.0434015 -0.0251635 +-0.00451637 0.113738 -0.0185133 +-0.0780673 0.0690482 0.0132523 +-0.0237986 0.0784163 -0.0381462 +0.0404558 0.0643575 0.0302495 +0.00150103 0.0576486 0.0543674 +-0.0314973 0.0746234 0.0406619 +-0.0430409 0.0337266 -0.000289053 +-0.0303409 0.0462461 0.0481864 +0.0215433 0.04083 0.0414017 +-0.0328294 0.0901297 -0.0245803 +-0.0654933 0.0370192 -0.00733845 +-0.0128512 0.129269 0.0078276 +-0.0102634 0.129467 0.00444971 +-0.0525768 0.0530264 -0.00686565 +0.0152424 0.0737083 -0.0300265 +-0.0523202 0.0474101 0.0149978 +-0.03228 0.059616 -0.0144015 +0.0262796 0.0733084 -0.0244949 +-0.091934 0.128302 0.0312437 +-0.0556539 0.153362 0.0267778 +0.00449629 0.118272 0.0381357 +-0.00902947 0.129018 0.00125187 +-0.00169837 0.0391357 -0.00987107 +0.0277845 0.0849076 0.045525 +-0.0241779 0.1712 -0.0197595 +0.0450874 0.0847681 0.0221666 +-0.0251342 0.0878826 0.0516343 +0.00641806 0.0347537 -0.00236123 +-0.0411191 0.111396 -0.0179091 +0.027653 0.0506012 0.0379885 +0.0219297 0.123716 0.0263137 +-0.0688294 0.148429 -0.0341374 +-0.0315292 0.124197 -0.00202254 +0.00150698 0.0801002 0.0571866 +-0.0615835 0.0366556 0.0444374 +-0.0481389 0.160609 -0.00688834 +-0.0254054 0.0766649 0.0494071 +-0.0774728 0.155537 -0.0149084 +-0.0401214 0.159176 -0.0112287 +0.0596647 0.0691741 0.016158 +-0.011487 0.110004 0.0424075 +-0.0381186 0.128235 0.00584498 +0.048576 0.0464424 0.0249843 +-0.0923754 0.118793 0.0312942 +-0.0639323 0.123848 -0.00887264 +-0.0798905 0.126603 -0.00582167 +-0.0413231 0.0462396 -0.0163116 +-0.0908165 0.145736 0.0263481 +0.0446156 0.0959646 0.00916087 +-0.0821218 0.075868 0.0188618 +0.05068 0.0673838 0.000483718 +-0.0501479 0.0515412 0.017644 +-0.00617289 0.130741 0.0117189 +-0.051836 0.0956238 -0.0221428 +-0.074878 0.122304 -0.00772392 +-0.00159817 0.0419657 -0.0250292 +-0.0474982 0.162268 0.00647513 +-0.0331161 0.0498057 0.0395103 +0.00234342 0.0510926 -0.0302041 +-0.0851404 0.125756 0.0494653 +-0.0699016 0.160977 -0.0489386 +-0.0798846 0.0706301 0.0125498 +-0.0697873 0.0819627 0.0411407 +-0.0547576 0.161266 0.00105716 +-0.0895055 0.0902528 0.0184453 +-0.0261075 0.162258 -0.0150297 +0.046501 0.0611194 0.0308227 +0.0238707 0.0929061 0.0469915 +-0.0533713 0.0334322 -0.00211203 +0.0417012 0.085878 -0.00880084 +0.0288139 0.110493 -0.0110929 +-0.083716 0.087071 0.0295098 +-0.0798758 0.155212 0.019678 +0.0049172 0.0339971 0.00916661 +0.0160048 0.0590435 0.0493667 +0.0573849 0.0699459 0.0206376 +0.0345802 0.103262 -0.0113359 +-0.0797481 0.0789376 0.0314228 +-0.0346581 0.0340056 0.0228095 +-0.0631272 0.0656833 0.0316274 +-0.0145321 0.0459268 0.0498594 +-0.0364091 0.0339112 -0.0194195 +0.0181222 0.116444 -0.0134944 +0.0341932 0.113962 0.0237708 +-0.0761778 0.148614 -0.0108668 +-0.0044937 0.0473352 0.0489501 +-0.0328741 0.0807299 -0.0285171 +-0.0724981 0.121807 0.0536688 +-0.0657234 0.153927 0.0319321 +-0.0548973 0.112625 -0.01673 +0.0464212 0.0764513 0.00819032 +0.0272261 0.0451183 -0.00768323 +-0.0629092 0.156144 0.021238 +-0.0631603 0.151216 -0.00238889 +-0.0347632 0.076687 -0.0214942 +-0.0906385 0.147509 0.0131579 +-0.0122779 0.122169 -0.00937841 +-0.0588974 0.156171 0.00210438 +-0.0123378 0.123047 -0.00831897 +-0.0496312 0.0590927 -0.0108209 +-0.0409256 0.153594 0.00561766 +-0.0405007 0.0860467 0.0431081 +0.0445131 0.0735224 0.0237705 +-0.0213844 0.123724 -0.0049697 +-0.0633941 0.159891 -0.0485891 +0.0364077 0.044553 -0.00488844 +-0.0739928 0.155924 0.011504 +-0.0111043 0.0366055 0.0502176 +0.03375 0.0929319 0.0401542 +-0.00645978 0.0918654 -0.0354548 +-0.0827096 0.131285 0.0511192 +-0.0835459 0.133987 0.0490485 +-0.0294951 0.0617035 0.0376524 +-0.0493817 0.138599 0.0163919 +-0.055623 0.120216 -0.0109924 +-0.00449347 0.121049 0.0367461 +-0.048904 0.144756 0.0084067 +0.00645901 0.0392685 0.0301228 +-0.0913214 0.114759 0.0373166 +-0.0265805 0.0377426 0.0157053 +-0.00572231 0.0669806 -0.0352658 +-0.0525421 0.050441 0.0296546 +0.0313831 0.11825 0.0184294 +-0.0288441 0.0958675 -0.0242091 +-0.0149484 0.177196 -0.0200335 +0.0230906 0.0973761 -0.0211755 +-0.0134888 0.11412 0.0398002 +-0.0652337 0.169622 -0.0599681 +-0.069106 0.161031 -0.0101008 +-0.0147444 0.0700214 -0.0382575 +0.000412578 0.0376462 -0.0248548 +-0.0694764 0.165214 -0.0509787 +-0.0817245 0.100671 0.0313188 +-0.0464909 0.0704463 0.0410366 +-0.0604958 0.0890419 0.0453253 +-0.0356646 0.155102 0.0026804 +0.0313895 0.0549645 0.0381834 +-0.0390844 0.149487 -0.000628748 +-0.0799141 0.109193 0.0343277 +-0.033406 0.159477 0.0024166 +0.0461298 0.0806288 0.00519237 +-0.00455042 0.0384226 0.0105194 +0.054633 0.0708998 0.00492223 +0.0466692 0.0754291 0.0122452 +-0.0510158 0.118895 -0.0136999 +0.0442088 0.0931449 0.0211603 +-0.026052 0.036748 0.0540507 +-0.0121151 0.0568039 0.0522997 +-0.0605217 0.0372227 -0.00906293 +-0.0505374 0.138563 0.00240881 +-0.0499851 0.135487 0.00142097 +0.0375229 0.0590309 0.0330268 +0.00350924 0.0842701 0.0573364 +0.0132839 0.0652538 -0.0302637 +-0.0742776 0.161639 -0.0118948 +-0.0507685 0.164108 -0.00292996 +-0.0198709 0.104468 -0.0228058 +0.0376047 0.0616532 -0.0107499 +-0.0773811 0.108845 0.0387481 +0.0226208 0.102094 0.0434114 +-0.0882171 0.135133 0.0423395 +-0.0506614 0.0515945 0.0196285 +-0.0603044 0.155837 0.0105687 +-0.0124866 0.11001 0.0423152 +0.02167 0.125998 0.00768374 +0.0323984 0.0396183 0.0260504 +-0.0709343 0.126767 -0.00893718 +-0.0135132 0.116917 0.0382221 +-0.0116656 0.051126 -0.0319435 +-0.0309822 0.125744 0.00553845 +0.0459345 0.0862193 0.0101703 +0.00749696 0.119642 0.0368719 +-0.00350244 0.107276 0.0438161 +-0.0521339 0.128852 -0.00413976 +-0.0786185 0.152695 0.0319953 +0.0163345 0.0781449 0.0535802 +0.0377538 0.0771288 -0.0117747 +-0.0215296 0.0387791 0.0338148 +-0.0350693 0.0384092 -0.00660408 +-0.0919891 0.124178 0.0422069 +-0.0444587 0.11222 -0.0167423 +-0.0171725 0.0985232 -0.0244048 +-0.057494 0.112512 0.0360215 +0.0396241 0.0900718 0.0328369 +-0.0621913 0.163125 -0.0405922 +-0.0255449 0.0384207 -0.00839698 +0.0162606 0.0736784 -0.0295549 +-0.0663455 0.040996 0.0121932 +-0.0292314 0.114996 -0.0157151 +0.0252254 0.095572 0.0454222 +0.00388853 0.130454 0.00153712 +-0.0454814 0.0335414 -0.0134702 +-0.08387 0.148679 0.0348187 +-0.0174749 0.184587 -0.0183292 +0.0188962 0.0370007 -0.0126843 +-0.0625159 0.163122 -0.0305925 +-0.0433987 0.03363 -0.0131325 +0.0291629 0.037982 0.025034 +0.0129127 0.129715 0.00445998 +0.0182606 0.0778122 -0.0281935 +-0.0476906 0.0356242 -0.0142735 +-0.0190478 0.0404047 0.0529202 +-0.00364871 0.0982082 -0.0280452 +-0.0195235 0.184467 -0.0220738 +0.00382729 0.106411 -0.0207174 +0.00350781 0.064793 0.0565955 +-0.0205171 0.0383642 -0.00178242 +0.0122268 0.0836141 -0.0306261 +-0.0444606 0.147723 0.0056898 +-0.0869664 0.148754 0.00824898 +-0.0689807 0.155012 0.0293114 +0.0302795 0.0795477 0.0438394 +-0.0660235 0.174935 -0.0492702 +-0.0804891 0.133061 0.0515278 +-0.0447252 0.109884 -0.0183457 +-0.0902839 0.137831 0.0151959 +-0.0702292 0.153353 0.0333614 +-0.0915979 0.146114 0.0211525 +-0.0905232 0.122929 0.0450175 +0.00448177 0.0951431 0.0532987 +-0.0234909 0.120747 0.0300444 +0.0274801 0.0445395 -0.0065618 +-0.091814 0.116108 0.0403567 +-0.0537253 0.151161 0.0246275 +-0.0205455 0.126353 0.00242085 +-0.00205946 0.129266 -0.00113907 +0.00252933 0.0758769 0.0564116 +0.00824452 0.129671 0.000311795 +-0.000397685 0.0923281 -0.0338988 +-0.0559448 0.126938 0.0384169 +-0.0428369 0.0942645 -0.0226678 +-0.0598806 0.105454 -0.017999 +-0.0837054 0.10067 -0.00361944 +-0.0545817 0.152467 0.0257328 +0.0103827 0.0365006 0.0297934 +-0.0898089 0.133793 0.0332137 +-0.0618767 0.15376 -0.0175826 +-0.0665983 0.155819 0.0112334 +-0.0454977 0.108441 0.0393231 +0.000688563 0.105475 -0.0216898 +0.0156183 0.0348875 0.0323047 +0.0598096 0.0622539 0.00613597 +0.0222628 0.0359732 0.0163557 +-0.0492522 0.165358 0.00274428 +-0.018422 0.0583296 0.0500808 +-0.0233794 0.126748 0.0127038 +-0.0635915 0.172518 -0.0506017 +0.000120368 0.0351316 0.0162576 +-0.0286059 0.0564269 -0.0233938 +0.0373643 0.110979 0.0106211 +-0.0143444 0.162546 -0.0104323 +0.0174821 0.10039 0.0467276 +0.00834248 0.0609508 -0.0305126 +-0.0650557 0.129761 0.0446036 +0.0584157 0.0647883 0.022872 +0.0450662 0.0889731 0.0191643 +-0.0554099 0.0334223 -0.00251784 +-0.00144558 0.106667 0.0437112 +-0.0626402 0.0627915 -0.00434322 +-0.0406608 0.0335117 -0.0254825 +-0.0621215 0.15372 -0.0285871 +-0.0304827 0.0538056 -0.016375 +0.0276877 0.0607373 -0.0218456 +-0.0332153 0.107417 -0.0197253 +-0.0709666 0.138448 -0.00754922 +-0.0554983 0.0973521 0.0432389 +0.0051585 0.127708 0.0288034 +-0.0497318 0.0354763 -0.0126201 +-0.0713898 0.160567 -0.00801414 +-0.0135985 0.108507 -0.0209218 +-0.0701499 0.0695315 0.0320822 +-0.0618453 0.155287 -0.0285878 +-0.0774937 0.145636 0.0432119 +-0.0499442 0.140127 0.0163925 +-0.0622517 0.147555 -0.00557481 +0.0112895 0.0624411 -0.0303571 +-0.054281 0.0573695 -0.00641449 +-0.0468263 0.128888 -6.3255e-05 +0.0167125 0.0343686 0.00192575 +0.025374 0.0938744 -0.0213667 +0.0374202 0.110869 0.0135214 +-0.0202897 0.0381028 0.016664 +0.0122214 0.13032 0.0170232 +-0.0424979 0.0817557 0.0420871 +0.0247834 0.123596 0.021665 +0.0458295 0.0890233 0.00817039 +-0.0246722 0.05361 -0.0281576 +-0.0368219 0.0900544 -0.0239252 +-0.0331266 0.0338175 0.0106794 +-0.0863242 0.111849 0.0243217 +-0.0881544 0.121251 0.000301062 +-0.0639205 0.112438 -0.0133308 +0.00114374 0.101639 -0.0226194 +0.0117494 0.0671858 0.0538619 +-0.0177987 0.0336176 -0.0248428 +0.0384483 0.10837 0.0201721 +-0.0895436 0.0902218 0.014448 +-0.0441053 0.129054 0.00361434 +-0.0447524 0.033564 -0.0207541 +-0.040486 0.0346908 0.0404235 +0.0158804 0.124131 -0.00578699 +-0.0301445 0.169695 -0.0171502 +-0.0906194 0.139243 0.0211829 +-0.0653253 0.142516 0.0407395 +-0.0320761 0.0447291 -0.0281131 +-0.0764158 0.0699842 0.0233785 +-0.0254497 0.052221 0.0403383 +0.0262523 0.076131 -0.0243472 +-0.0174971 0.101623 0.0437353 +0.00533357 0.055349 -0.0305496 +-0.0493266 0.134948 0.0237381 +0.0053984 0.122421 -0.0118951 +0.038604 0.108395 0.0191762 +-0.0638345 0.0431637 0.0378429 +-0.0748055 0.0863518 -0.0148055 +0.0157558 0.127182 0.025475 +0.0337414 0.0384723 -6.48206e-05 +-0.0564853 0.0791423 0.0441771 +0.0234983 0.102092 0.0429315 +-0.00524932 0.101176 -0.023207 +-0.0804177 0.153092 0.00488677 +-0.0764988 0.13725 0.0499203 +-0.0550791 0.134447 -0.00412579 +0.0139517 0.124505 -0.00617757 +-0.0839821 0.127994 -0.00381712 +-0.0571198 0.115445 0.0365816 +-0.0622396 0.155257 -0.0325976 +-0.0454972 0.0761548 0.042184 +0.0313815 0.0461664 -0.00629419 +-0.0438412 0.0942345 -0.0223045 +-0.0236613 0.0852675 0.0544729 +-0.0616609 0.147135 -0.00399772 +-0.0600825 0.0413306 0.0227014 +-0.0105535 0.180959 -0.0288535 +-0.0676833 0.155656 0.026832 +0.0282931 0.118599 0.0272385 +-0.0871972 0.102223 0.00642609 +0.0103624 0.0494805 -0.028102 +0.0154246 0.0685991 0.0521564 +-0.0416312 0.117641 -0.0144485 +-0.0276264 0.046347 -0.026964 +-0.0916136 0.132311 0.0112256 +0.0178346 0.0505132 0.0449253 +-0.0444935 0.155066 0.00750552 +-0.037487 0.115255 0.0329307 +-0.0185008 0.119534 0.0344711 +-0.052516 0.0452355 0.0436109 +-0.00977222 0.11683 -0.0157853 +-0.0558279 0.0635792 0.0314789 +-0.0607324 0.0592584 0.00571875 +-0.0621725 0.160005 -0.022587 +-0.0603904 0.152423 0.000272984 +-0.0697355 0.134074 0.048407 +-0.0688943 0.103764 -0.0141878 +-0.0871513 0.117629 0.0474896 +0.0463722 0.0764454 0.00719365 +0.0582269 0.0686747 0.0208601 +0.0410646 0.07659 0.0312229 +-0.0298717 0.104385 -0.0225787 +-0.0346365 0.0766699 -0.022492 +-0.0639324 0.147049 -0.0189093 +0.0414492 0.10286 0.0161642 +0.041276 0.104245 0.0131611 +-0.0550666 0.151635 -0.00215779 +-0.0723648 0.0763024 0.0368597 +-0.0166996 0.0540293 -0.0329391 +-0.0108856 0.107334 -0.0222671 +-0.0609787 0.126745 -0.00811044 +-0.0495024 0.109811 0.0380885 +-0.0814376 0.0978185 -0.00662583 +-0.0771326 0.163938 -0.0219397 +-0.0690818 0.18144 -0.0564572 +0.031034 0.0964814 -0.0161287 +0.0445032 0.0555996 0.0323503 +-0.0335401 0.0732865 0.0413362 +0.0315592 0.035603 0.0149292 +-0.0625155 0.0344693 0.0376364 +0.0223706 0.0505198 -0.0231651 +-0.051638 0.0663266 -0.0117848 +0.0132667 0.0519749 0.0488584 +-0.0568732 0.108333 -0.017952 +0.0448639 0.0833492 0.023175 +-0.0316705 0.0806285 -0.0315587 +-0.0714676 0.155482 0.0269686 +0.0118001 0.034659 0.0389456 +-0.0860496 0.128472 0.048867 +-0.0155071 0.175699 -0.0190868 +-0.058019 0.131103 -0.00658932 +0.0113955 0.0434069 -0.0246972 +0.0568205 0.0566796 0.0240006 +-0.0267763 0.0365192 0.0538225 +-0.0564971 0.0987696 0.0431638 +0.0353453 0.0835128 0.0388598 +-0.0602464 0.144668 -0.00329576 +-0.00749863 0.0884246 0.0571361 +-0.0816964 0.0734472 0.00653139 +0.0399806 0.105624 0.0191716 +-0.0676913 0.172275 -0.0570278 +-0.0358314 0.0356542 0.0457978 +0.0503129 0.0516868 -0.00299828 +-0.0414959 0.0705202 0.0419075 +0.0246022 0.0942401 0.0462765 +-0.0735775 0.170801 -0.0470392 +0.0373196 0.105416 -0.00382358 +0.0463401 0.0518943 -0.00540594 +0.0400167 0.0646852 -0.00776271 +-0.0597593 0.07671 -0.0185219 +-0.0237194 0.0639841 -0.033754 +-0.0473867 0.0345201 0.0356021 +0.00159304 0.131118 0.00454966 +-0.073925 0.126728 -0.0084362 +-0.0243269 0.0616478 -0.0324508 +0.0457562 0.0904226 0.00816981 +-0.0688748 0.159133 -0.00709894 +-0.0394914 0.0944889 0.0427101 +-0.0687998 0.0822684 -0.0173873 +-0.0455924 0.119193 -0.014062 +-0.0369476 0.033676 0.00641963 +-0.09079 0.1297 0.0392322 +-0.0389556 0.0350986 0.042208 +-0.0414578 0.107073 0.0393054 +-0.00265934 0.098112 -0.0279111 +-0.0331649 0.0652734 -0.0174782 +-0.0343312 0.0836736 -0.0246034 +0.0134882 0.101805 0.0472084 +-0.0594997 0.0846925 0.0439263 +-0.0423306 0.040657 -0.0232664 +0.0092124 0.114671 -0.0175632 +0.0538026 0.0595499 0.0284925 +-0.0256867 0.0380701 0.0246091 +-0.0693658 0.16286 -0.0130912 +0.0333604 0.037057 0.0194583 +0.00949693 0.121023 0.0358683 +0.0321446 0.0360609 0.0164637 +0.0341544 0.0548861 0.0351403 +-0.000334987 0.0965293 -0.0302242 +0.0585628 0.0673807 0.0213416 +-0.053406 0.12345 -0.00838645 +-0.0749578 0.132548 -0.00734349 +0.0282219 0.0816125 -0.0219304 +-0.0351889 0.171161 -0.0140358 +0.00949153 0.0936876 0.0522363 +-0.0157849 0.172748 -0.017746 +-0.0175848 0.169785 -0.0150947 +-0.0835905 0.112379 0.0452164 +-0.0404862 0.0846544 0.0431896 +0.0231358 0.0404562 0.0392455 +-0.00366205 0.0540631 -0.0322696 +0.00959837 0.0403395 0.0451906 +-0.0692421 0.0422187 0.00798097 +-0.0285258 0.0717501 0.0402231 +-0.00789542 0.108803 -0.0224197 +0.0159009 0.113257 -0.0160529 +-0.00149436 0.0620061 0.056412 +-0.0420891 0.0363826 -0.0272583 +-0.00449341 0.104477 0.0440393 +-0.0683512 0.0607717 0.0117847 +-0.0927055 0.120137 0.0415853 +-0.0484911 0.115278 0.0334198 +0.02514 0.0350088 0.0196342 +-0.065935 0.125307 -0.00885715 +-0.0621483 0.0699034 0.036962 +-0.0178695 0.104461 -0.0227631 +0.0351768 0.0563002 0.0348659 +0.0105044 0.115477 0.0381888 +-0.0938558 0.126876 0.0162567 +-0.0632514 0.033799 0.0117273 +-0.0736013 0.0654333 0.0137843 +-0.0577792 0.0341881 0.0284371 +-0.0763952 0.0838159 -0.0125906 +-0.0296632 0.180174 -0.00867233 +0.00819029 0.0851531 -0.0324575 +-0.071633 0.174549 -0.0412084 +-0.0538265 0.0927341 -0.0220469 +-0.0471905 0.156504 0.00887867 +-0.0661815 0.0615106 0.0205126 +0.0144985 0.107111 0.0421568 +-0.0721929 0.152802 0.0342528 +0.0142765 0.0666697 -0.0302658 +0.0349485 0.0942163 0.0384062 +-0.0664891 0.0369705 -0.00688594 +-0.077495 0.158339 -0.0149115 +-0.0739383 0.160975 -0.0103701 +-0.00971429 0.0386927 -0.0148008 +-0.0618555 0.155289 -0.0295874 +-0.0621574 0.152203 -0.016578 +-0.032494 0.096035 0.0446186 +0.044345 0.0519693 -0.00630996 +0.0319954 0.0520213 0.0354999 +-0.0300925 0.0509394 -0.0183595 +-0.018449 0.0388382 0.0343981 +-0.0670639 0.154762 0.000889218 +0.0361767 0.0888967 0.0383392 +0.0262873 0.0942382 0.0451936 +0.0186534 0.103359 0.0446898 +-0.0523328 0.0334686 -0.00741897 +0.0507066 0.0540083 0.0292331 +0.0529037 0.0462692 0.0142047 +-0.0888522 0.0996312 0.00941041 +0.0275656 0.0563642 0.0414619 +-0.0371627 0.0336289 -0.0286501 +-0.0198294 0.0882519 -0.0375379 +-0.0907603 0.140585 0.0151783 +-0.00458896 0.0376652 -0.0252351 +-0.093041 0.12831 0.0262642 +-0.0743429 0.0955133 0.0396401 +-0.089704 0.111925 0.0143387 +0.0453684 0.0889907 0.0151607 +0.0456444 0.086201 0.0151659 +-0.0635175 0.0399079 -0.00714576 +-0.0294925 0.0903536 0.0441109 +-0.0888771 0.100994 0.011394 +-0.0121064 0.0869584 -0.0384624 +0.0373352 0.108319 0.0251875 +-0.0882187 0.112165 0.0210064 +0.0349174 0.110993 0.0268865 +-0.0849268 0.122064 -0.00322109 +0.0124968 0.112648 0.0387734 +-0.0662562 0.163203 -0.0177078 +-0.0640701 0.113939 0.0406208 +-0.0654246 0.0794919 0.0421931 +-0.0519669 0.0569186 0.0284516 +-0.0519207 0.0493094 0.0353906 +0.00333114 0.0341656 0.00499397 +-0.056914 0.133942 0.035273 +-0.0780215 0.158305 -0.0199209 +0.0276406 0.111416 0.0348725 +-0.0172565 0.181572 -0.0253576 +0.0372544 0.0379189 0.00466817 +-0.0211197 0.1653 -0.017528 +-0.0557637 0.121264 0.0386516 +0.0274329 0.121878 0.0183804 +-0.0623369 0.16467 -0.04959 +0.00450432 0.0883672 0.0562441 +-0.0649333 0.145142 -0.016034 +-0.0918355 0.118761 0.0292947 +0.0503561 0.073461 0.0121181 +-0.0732571 0.0860546 0.040246 +-0.0543933 0.14384 0.0284354 +0.0235922 0.124679 0.00697037 +0.049638 0.0724241 0.0192263 +-0.0691135 0.0647604 0.0241382 +-0.0277318 0.0385796 0.0327127 +0.0249679 0.0605263 0.0447882 +0.0220764 0.0741142 0.049509 +-0.012493 0.16839 -0.0164935 +0.0220311 0.0550166 0.0457656 +-0.0197467 0.0364265 -0.0184459 +0.000577278 0.0388845 -0.0129362 +-0.0178004 0.121647 -0.00876548 +-0.0516521 0.0334655 -0.0091126 +0.0221612 0.0754835 0.0496518 +-0.0384539 0.162349 0.000413916 +-0.0711225 0.0388168 0.00193457 +0.0334725 0.0950337 -0.0145821 +-0.00505247 0.102417 0.0438081 +0.0159216 0.0348476 0.0287894 +0.0277666 0.0347822 0.00749516 +-0.0675802 0.144972 -0.0192338 +-0.0477088 0.132967 0.0228963 +-0.0134912 0.0386664 0.0301779 +-0.0590273 0.134027 -0.00648451 +0.0244484 0.124114 0.020115 +0.0218798 0.0374214 -0.00364164 +-0.0658775 0.102439 -0.0164403 +-0.0743971 0.166132 -0.0206985 +-0.0634619 0.0339766 0.015084 +-0.0497324 0.138579 0.00441928 +-0.00151689 0.0428507 0.0468014 +0.00660528 0.0935786 -0.0311099 +-0.0862444 0.0819176 0.00849345 +-0.0634827 0.0876134 0.0450541 +0.0182388 0.0763952 -0.028136 +-0.0765343 0.0681368 0.0143622 +-0.092883 0.116038 0.0143172 +0.000494981 0.0442085 0.0460563 +-0.0518518 0.0970732 -0.0222063 +-0.0248173 0.0693751 0.0448313 +-0.089421 0.135156 0.0282104 +-0.0566159 0.0573558 0.0107416 +0.0312695 0.0800594 -0.0199503 +-0.03437 0.0738393 -0.0214808 +0.0226051 0.113885 -0.0127298 +-0.0658838 0.16421 -0.0204509 +-0.0417953 0.0435116 -0.0223513 +-0.0710782 0.156778 -0.0439119 +0.00348525 0.108604 0.0422849 +-0.0239399 0.118058 -0.0129545 +-0.0498545 0.0999668 -0.0218887 +0.0176793 0.0852191 -0.0283526 +-0.0426623 0.0592741 -0.0122692 +-0.0642751 0.044386 -0.00129652 +-0.0456062 0.127883 0.0223049 +-0.0818286 0.147374 0.0384552 +0.0125066 0.10443 0.0450477 +-0.0763281 0.174543 -0.0415648 +-0.0144887 0.0387707 -0.00835843 +-0.00853122 0.0430617 0.0490142 +-0.0783677 0.176339 -0.0480853 +-0.0408918 0.109911 -0.0187996 +-0.0634329 0.159891 -0.0505847 +-0.0278615 0.0987172 -0.0237448 +0.0172353 0.0806842 -0.0288156 +-0.0768582 0.104852 -0.0089026 +0.0310274 0.118497 0.0197321 +0.0262422 0.122687 0.00652555 +-0.000524008 0.041433 0.0467891 +0.0292827 0.060879 -0.0197951 +0.00853553 0.0366751 -0.00931803 +-0.092315 0.125571 0.0312621 +-0.000472926 0.0972534 -0.0289903 +-0.0604964 0.0861621 0.0446513 +0.0117525 0.0432202 0.0447834 +-0.0738828 0.103582 -0.0116089 +-0.00249719 0.0488761 0.0505372 +-0.0307845 0.0580469 -0.0184096 +-0.00234994 0.125819 -0.00745455 +-0.0301636 0.153871 -0.00371356 +-0.0815418 0.0912589 0.0328461 +-0.0901131 0.132441 0.0382173 +0.037389 0.0476423 -0.00613109 +-0.0646684 0.155196 -0.0425404 +-0.0928057 0.124227 0.0372672 +-0.0297999 0.12434 0.000117203 +-0.032492 0.0746402 0.0409516 +-0.0555716 0.122697 0.0389476 +-0.0717789 0.154685 0.0298089 +-0.0930714 0.12018 0.0352857 +0.0144798 0.109585 -0.0180587 +0.00343169 0.0361267 -0.0240106 +-0.0288758 0.046967 -0.0262149 +-0.0616418 0.158426 -0.0235923 +0.0103202 0.0609665 -0.0299301 +-0.0910325 0.14477 0.0261671 +-0.083926 0.0775674 0.0187821 +-0.0575363 0.138153 0.0326058 +-0.0295 0.0703058 0.0395502 +-0.0217308 0.0626511 -0.0346671 +-0.0640717 0.164086 -0.0255357 +-0.063271 0.158522 -0.0165888 +0.0210264 0.0895934 -0.0248804 +-0.0731992 0.145774 -0.0148545 +-0.0334943 0.0803079 0.0415842 +-0.0862122 0.111364 0.0347412 +0.0338239 0.11087 -0.00547119 +-0.0135288 0.0458914 0.0493586 +-0.0643715 0.139866 -0.00735458 +-0.0568939 0.158351 0.00118769 +-0.0405106 0.151258 -0.00613685 +-0.00551608 0.110856 -0.0214408 +-0.0787639 0.0696569 0.0125705 +0.00378339 0.0381062 0.0251953 +-0.0650446 0.154908 -0.0437098 +-0.089228 0.114813 0.0276717 +-0.00277394 0.0797805 -0.0365537 +-0.0661523 0.136835 0.0429956 +-0.0434818 0.0902492 0.04268 +-0.0184702 0.0959697 0.0503933 +-0.0801387 0.142096 0.0454029 +-0.00485582 0.0989472 0.0508482 +-0.0336234 0.153659 0.000337049 +0.00250661 0.0924946 0.055168 +-0.0729484 0.132565 -0.00781242 +0.0194715 0.127423 0.0125674 +0.00484292 0.129473 0.025811 +-0.0576054 0.0658547 0.0344063 +-0.0502601 0.0543084 0.0166402 +-0.027407 0.0396009 0.0539527 +-0.0105297 0.0560622 0.0527517 +-0.0456126 0.0519231 -0.010201 +0.000501847 0.0590908 0.0549783 +-0.0569845 0.0535242 0.00365398 +-0.0671097 0.0432428 -0.000257978 +0.0214666 0.0975514 0.0465681 +-0.08997 0.132328 0.0399309 +-0.0761969 0.167972 -0.0410261 +0.0170202 0.121328 -0.0087569 +-0.0138948 0.17568 -0.0202542 +-0.0281655 0.17267 -0.018055 +-0.0638531 0.04136 -0.00615806 +-0.0348821 0.0342989 0.0153052 +-0.000342105 0.0380462 0.00257941 +-0.00749789 0.0898138 0.0570783 +0.028524 0.0808687 0.0448153 +-0.0331206 0.0356024 -0.0184705 +0.0043586 0.119499 -0.0147306 +0.0467625 0.0462832 0.0266316 +0.0368364 0.111573 0.0161776 +0.00851174 0.0799624 0.0552814 +-0.00244825 0.112634 -0.0193375 +-0.0235385 0.11268 0.0379979 +-0.0115345 0.0922826 -0.0359317 +-0.09304 0.122895 0.0392709 +-0.0271645 0.17563 -0.018169 +-0.0772929 0.117422 0.0514809 +0.0179164 0.102978 -0.02104 +-0.0709646 0.0754682 0.0373385 +0.0216627 0.126095 0.0176515 +-0.0640284 0.119984 0.047923 +-0.0444795 0.0874935 0.0436599 +-0.0893861 0.0943037 0.0204146 +-0.0720651 0.173384 -0.0385311 +-0.0894927 0.14204 0.0311659 +-0.0454987 0.120637 0.0275066 +-0.0250745 0.0954862 -0.0252675 +-0.0895496 0.13918 0.0132126 +0.0192289 0.0820148 -0.027672 +-0.0154803 0.0645289 0.0535158 +0.0164872 0.108442 0.0405002 +-0.00663864 0.115688 -0.0165748 +-0.0494985 0.104247 0.040228 +-0.0673252 0.149334 0.0390086 +0.0300883 0.0872505 -0.0203879 +-0.0278877 0.0633808 -0.0294488 +0.0182732 0.069417 -0.0291542 +0.0171905 0.116688 -0.0137466 +0.0502632 0.0713497 0.022405 +0.0350985 0.114043 0.00837763 +-0.0505103 0.0452467 0.0429196 +0.0302544 0.113856 0.0308506 +-0.0605348 0.0333568 -0.0034971 +-0.00390558 0.0383472 0.0143493 +0.0270583 0.122199 0.00683201 +-0.0241505 0.0378782 0.0124647 +-0.0606031 0.0352186 0.0442288 +-0.0906667 0.113308 0.0195238 +-0.00876475 0.075634 -0.0378123 +-0.0531345 0.0641573 0.0333061 +-0.0262078 0.123609 -0.00273748 +-0.0629032 0.154793 0.00389792 +0.00322165 0.0782734 -0.0348651 +-0.0232226 0.0950277 -0.0288098 +-0.0497962 0.0869626 -0.02172 +0.0239811 0.109404 -0.0139261 +-0.00287196 0.105931 -0.0223953 +0.00350624 0.0619975 0.0564502 +0.0152965 0.129062 0.00674245 +-0.0198254 0.120831 -0.00989132 +-0.0672111 0.0749069 0.0386416 +-0.0199192 0.0375867 0.0533971 +-0.0507132 0.054338 0.0146004 +0.0338375 0.109906 -0.00644408 +-0.052068 0.0531865 0.02764 +-0.0665349 0.0638845 0.0254353 +-0.0340904 0.160759 -0.0135462 +-0.0456409 0.0577841 -0.0117617 +0.0425336 0.0678584 0.0273676 +-0.0549188 0.148123 0.0275408 +0.0178543 0.0352284 0.0378786 +-0.0254848 0.100235 0.0442056 +-0.014497 0.0856418 0.0570702 +0.0151023 0.0860518 0.0518047 +-0.0616341 0.0628646 -0.00472902 +0.02366 0.0848996 0.0483924 +-0.0496187 0.054694 -0.00943972 +-0.0328776 0.105721 -0.0208169 +-0.0144506 0.103914 0.0432646 +-0.0248813 0.105869 -0.0225199 +0.024788 0.0591582 0.0445118 +-0.0159391 0.0999021 -0.023843 +-0.0539979 0.153168 0.0186815 +-0.0738816 0.120852 -0.00799698 +0.0296461 0.118491 0.000643936 +-0.0540045 0.13652 -0.00234857 +-0.0593798 0.0335176 0.00740926 +0.0366379 0.08347 0.0371909 +-0.0520867 0.151648 -0.00355308 +-0.0188227 0.0387965 0.0325596 +0.00898388 0.131012 0.0072855 +-0.0682589 0.154325 -0.0506473 +-0.0521805 0.0531921 0.0266366 +-0.0617514 0.175333 -0.0614739 +-0.0169338 0.185679 -0.0240586 +0.015477 0.103104 0.045929 +-0.0729148 0.0713134 0.0317175 +-0.0172476 0.114664 -0.0174436 +-0.0126734 0.0384579 0.00339052 +-0.0832791 0.0884633 0.0304387 +-0.0858155 0.103519 0.00339021 +-0.0146369 0.0466344 -0.0294365 +-0.0773163 0.098935 -0.0105842 +-0.0145015 0.0631456 0.0536787 +-0.0689178 0.0717538 0.0356819 +-0.0255986 0.0394109 -0.0291464 +-0.0623671 0.0719748 0.0386642 +-0.0301518 0.0360809 0.0236741 +-0.030565 0.0383245 0.0341404 +-0.0574984 0.0918591 0.045399 +-0.0861528 0.0951452 0.0274373 +-0.0644941 0.0412041 -0.00599039 +-0.0363521 0.126723 0.0183002 +0.00755707 0.10303 0.0452955 +-0.0396625 0.0399023 -0.0274567 +-0.0838382 0.11616 -0.00137187 +0.0166591 0.0349342 0.0324763 +-0.0647933 0.15319 -0.00116291 +0.00911841 0.110151 -0.0195223 +-0.0697747 0.155761 0.0260978 +0.045415 0.0763654 0.00219579 +-0.0127734 0.171309 -0.0186592 +0.00748545 0.0964088 0.0510363 +0.0125027 0.109886 0.0398286 +-0.0779306 0.0866645 -0.0115691 +-0.0830177 0.0951656 -0.00554205 +-0.0184064 0.186879 -0.0179354 +-0.0866419 0.0923952 0.0266005 +0.026251 0.103389 0.0398709 +0.0333357 0.116389 0.013468 +-0.0452756 0.131436 0.0105618 +-0.035474 0.0519266 0.0383228 +-0.0536233 0.0657097 0.0353836 +0.0013977 0.0433563 -0.0248502 +0.0269244 0.118903 0.0281816 +0.0395 0.055533 0.0316092 +-0.0723024 0.111428 0.0467445 +-0.0364387 0.0357946 -0.0155844 +-0.0276413 0.159598 0.000270855 +-0.00596208 0.0394 0.0364646 +-0.00479094 0.0798443 -0.0373862 +-0.00779065 0.130523 0.0125627 +-0.0464848 0.12067 0.0277891 +-0.0645002 0.0889975 0.0448988 +-0.0896121 0.0902414 0.0154476 +0.0130231 0.0965172 -0.0241956 +-0.0452605 0.0391077 0.0445023 +0.0587398 0.0709245 0.0152557 +-0.0596114 0.0726835 0.0404064 +0.0240499 0.0348797 0.0195293 +-0.0682817 0.156606 -0.0532672 +0.0178388 0.104825 -0.0190099 +-0.0288938 0.180785 -0.00982491 +0.0323759 0.0738626 -0.0187418 +0.0314474 0.112439 -0.00717966 +-0.074091 0.144362 -0.00888576 +0.0510178 0.0461394 0.00424124 +0.00750963 0.0646928 0.0554932 +-0.0643093 0.0665984 0.0323388 +0.0133515 0.0566849 -0.029233 +-0.0243216 0.10004 -0.0240037 +-0.00749239 0.096543 0.0535421 +-0.00533786 0.0388247 -0.000985585 +-0.0884258 0.0996766 0.0213895 +-0.0320326 0.0609937 -0.0164107 +0.0535495 0.0533436 -0.000784809 +0.0393899 0.0533602 -0.00667374 +-0.0717205 0.168577 -0.0240459 +-0.0704919 0.126012 0.052539 +-0.0388888 0.109926 -0.019043 +-0.0507025 0.140081 0.0193694 +-0.0263231 0.034658 0.0434735 +0.0398861 0.0766416 0.0330246 +-0.0941682 0.126929 0.0222624 +-0.0117712 0.0770642 -0.0382004 +-0.0417668 0.040639 -0.0243092 +-0.0517327 0.164109 0.00103678 +-0.0721705 0.158208 -0.0379206 +-0.0356893 0.0651361 -0.0144415 +-0.065143 0.156205 -0.00860924 +0.00354988 0.0342019 -0.0174252 +0.00312416 0.107287 -0.0203844 +-0.0340011 0.127005 0.00589371 +-0.0418419 0.09571 -0.0225712 +-0.0333161 0.126997 0.0105451 +-0.0717391 0.165925 -0.0182956 +0.0559734 0.0494153 0.0101945 +0.0174969 0.108466 0.0401752 +-0.0507291 0.133637 -0.00121966 +0.0083246 0.0581885 -0.03043 +-0.0711713 0.176467 -0.0550529 +0.0165931 0.100464 -0.0223776 +-0.0544905 0.0862124 0.0452239 +-0.0574075 0.0649991 0.0334306 +0.0195092 0.092819 -0.0242669 +-0.0856512 0.0899172 -0.000541045 +0.0081342 0.104445 -0.020865 +-0.0752567 0.160324 -0.0108988 +-0.0376087 0.118212 -0.0130418 +-0.055019 0.14719 -0.00165707 +-0.04909 0.0628007 0.0352845 +-0.018783 0.0770899 -0.0389016 +-0.0336421 0.175583 -0.0129563 +-0.082659 0.0871422 0.0312687 +-0.0621779 0.061949 0.0245023 +-0.0782836 0.162467 -0.0289415 +0.0339055 0.0599168 -0.014725 +-0.0414124 0.128336 0.00169512 +-0.0398827 0.035133 -0.0101165 +-0.00781609 0.0854881 -0.0377912 +0.0082433 0.13138 0.00986533 +-0.0358714 0.105673 -0.0204021 +0.00749975 0.0589567 0.0535286 +-0.072631 0.0670284 0.0231935 +0.0525192 0.0691267 0.0251103 +-0.0688901 0.0621533 0.0194032 +-0.0824666 0.11008 0.0383967 +-0.0438038 0.0884337 -0.0219011 +-0.00534725 0.0379464 -0.0151277 +-0.0425045 0.0478596 0.0401075 +0.0214753 0.11175 -0.0144217 +-0.000497779 0.0489051 0.0509033 +0.0236032 0.116718 -0.00979024 +-0.0648062 0.0852609 -0.0190538 +-0.0395435 0.101505 0.0409276 +0.0209425 0.124573 -0.000263497 +-0.0286807 0.0383267 -0.00339493 +-0.0585081 0.0422988 0.0170665 +-0.0316383 0.0367739 0.0511824 +-0.085482 0.104867 0.00337403 +-0.00926648 0.100073 0.0477845 +-0.00448593 0.118295 0.0389891 +-0.0377467 0.0768482 -0.0188928 +-0.0640837 0.156142 0.0179222 +-0.0515285 0.144709 0.0153879 +-0.0267903 0.0866521 -0.0358137 +-0.0626407 0.163129 -0.0295903 +-0.00752629 0.0443832 0.0481509 +-0.0750304 0.169881 -0.0295693 +-0.0907748 0.12133 0.00629364 +0.0164129 0.0417834 -0.0225068 +-0.0317772 0.169741 -0.00573949 +-0.0546238 0.0527377 0.0100793 +0.0453589 0.0561811 -0.00597324 +-0.0651505 0.0366918 0.0402161 +-0.032507 0.108409 0.0384637 +0.0185107 0.108486 0.0398481 +0.0450172 0.0749324 0.00120229 +0.00251449 0.0702821 0.0560425 +-0.0434424 0.160833 0.00573037 +0.056541 0.064854 0.0254614 +-0.0648306 0.156078 0.013307 +-0.00545884 0.111961 -0.020621 +-0.0222505 0.0336283 -0.0219672 +-0.0319114 0.16826 -0.00591385 +0.0045246 0.0828376 0.0569094 +-0.0849678 0.0844642 -0.00152644 +0.0277057 0.120723 0.00280565 +-0.0133613 0.182397 -0.0284169 +-0.0569294 0.13993 -0.00415472 +-0.0104844 0.118266 0.038122 +-0.0725121 0.144203 0.0447958 +-0.0661037 0.0713259 0.0366501 +-0.050851 0.138527 0.021367 +-0.0580927 0.0577897 0.0147789 +-0.0157117 0.033701 -0.0245127 +-0.00261732 0.0341102 -0.0185505 +-0.0614975 0.10975 0.0377559 +0.00661243 0.131425 0.00784474 +-0.0602206 0.142504 0.0358229 +0.0126673 0.104052 -0.020179 +-0.0624955 0.0904382 0.0452713 +0.0164839 0.0699861 0.0519409 +-0.0334933 0.0946149 0.0444857 +-0.0904058 0.114907 0.0416618 +-0.0182558 0.178619 -0.0243596 +-0.0436529 0.0346111 0.0345638 +-0.00297107 0.0340356 -0.0204416 +-0.0246065 0.0394112 -0.0290873 +-0.0257404 0.0712076 -0.0359148 +-0.0285156 0.0433359 0.0513164 +0.0262381 0.119658 0.0279158 +-0.0734823 0.0649094 0.0160661 +0.0249492 0.109234 -0.0137375 +-0.0651326 0.157423 -0.0100634 +-0.0578906 0.0600472 -0.00173427 +-0.0868853 0.0847213 0.0144753 +-0.0610173 0.135506 -0.00686914 +0.0547011 0.0728313 0.00929699 +0.00513733 0.104474 -0.0214038 +-0.0199542 0.180019 -0.0229778 +0.022195 0.0344915 0.00477409 +-0.0509846 0.123023 -0.00999375 +0.0173702 0.0506958 -0.0254566 +0.0327797 0.0727287 0.040356 +-0.0376189 0.0505906 -0.0108802 +-0.057408 0.0521648 0.00264452 +-0.0845698 0.111358 0.0279354 +0.045113 0.0861573 0.00219478 +-0.0694333 0.0348816 0.0112742 +-0.0621334 0.15599 0.0157191 +0.0379075 0.0398433 0.0233434 +-0.0695824 0.180796 -0.0534457 +0.00287682 0.0368053 -0.01432 +0.0592296 0.0635939 0.00512091 +-0.0326951 0.0680731 -0.0204474 +-0.017619 0.161286 -0.0140538 +-0.00121244 0.0358159 0.011737 +-0.0485025 0.167013 -0.00296472 +0.0139694 0.0974449 -0.0231882 +0.0336763 0.102539 -0.0125747 +-0.0769165 0.147253 -0.00586064 +-0.0894763 0.140666 0.0321759 +-0.079441 0.139988 0.0475582 +-0.019773 0.0742847 -0.0390372 +-0.066871 0.0626922 0.0228964 +-0.0473301 0.134807 0.0120125 +0.0244991 0.106997 0.0390493 +0.0296386 0.114736 0.0306143 +0.0275719 0.0433403 0.0342886 +-0.0524918 0.107066 0.0397432 +-0.0544973 0.0427375 0.0458563 +-0.0837407 0.129905 0.0507752 +0.0390362 0.108381 0.0141662 +0.0136873 0.0685864 0.0531495 +-0.0780988 0.162499 -0.0239377 +-0.0804325 0.078146 0.029561 +-0.0720693 0.0709772 0.0321852 +-0.036497 0.0903135 0.0436162 +-0.0157593 0.121529 -0.00864145 +-0.0640118 0.135519 -0.00771971 +-0.0096474 0.0481504 -0.030386 +-0.0889991 0.11248 0.0367803 +-0.0718704 0.117956 -0.00810673 +-0.00253303 0.110473 -0.0210263 +-0.0151271 0.118705 -0.0137294 +-0.0533766 0.126536 -0.00565695 +-0.050165 0.0501393 0.0176523 +-0.0617795 0.126914 0.0422805 +-0.0077906 0.079881 -0.0380243 +-0.0181903 0.172708 -0.0227977 +0.0362974 0.0657667 -0.0137187 +-0.0193672 0.122992 0.0288371 +0.0118921 0.127946 0.0270512 +-0.0528594 0.0344415 0.0327571 +-0.0440834 0.0344755 0.0328349 +0.00820576 0.0343954 0.0203732 +-0.0384853 0.0819001 0.0436414 +0.0279153 0.112797 -0.00956049 +-0.0233818 0.177171 -0.0128784 +0.00211138 0.110155 -0.0201605 +-0.0214231 0.0385184 -0.00765668 +-0.0590379 0.13549 -0.00623086 +-0.0654804 0.152163 -0.03833 +-0.0328363 0.0957996 -0.0235469 +-0.0574937 0.0333307 -0.00285911 +-0.0723124 0.154022 -0.038905 +-0.00125765 0.0383424 0.0470318 +0.022422 0.125761 0.0150782 +-0.0285891 0.0935252 -0.0252241 +-0.0395009 0.16971 0.00189803 +-0.0211973 0.0363196 0.0534993 +-0.0671438 0.037039 0.0145094 +-0.0455015 0.115241 0.0333765 +-0.0416597 0.057808 -0.0117566 +-0.0597745 0.0434652 0.0436848 +-0.0594246 0.0334838 0.00203125 +-0.0609255 0.122379 -0.00879585 +-0.0633414 0.0357702 0.0187502 +-0.0629834 0.0594485 0.00869517 +-0.0240199 0.0537379 0.0416895 +-0.0382462 0.044597 -0.024375 +-0.00732189 0.100225 -0.0241674 +-0.0425982 0.0463965 -0.0133084 +-0.0889045 0.133745 0.0416542 +0.00049898 0.0385943 0.0466363 +-0.0295864 0.0462965 0.0488628 +0.00439164 0.0448792 -0.025855 +-0.0608362 0.0341593 0.0278122 +-0.0547243 0.0723714 -0.0165135 +-0.0274694 0.155208 -0.00473974 +0.0246484 0.0713321 0.0461382 +0.0124372 0.0548875 0.0512192 +-0.00549842 0.0828666 0.0570203 +-0.0616148 0.0337181 0.0103501 +-0.0346312 0.0752701 -0.0214845 +-0.0629229 0.058915 0.0109817 +-0.0424386 0.147805 0.00141712 +-0.0363751 0.12414 0.0242241 +0.0176113 0.111464 -0.0161155 +-0.0314976 0.0603384 0.0380002 +-0.0138112 0.128252 0.0219818 +-0.0603076 0.0409502 -0.0078507 +-0.0735166 0.141431 0.0469479 +0.0326456 0.111384 0.0297678 +-0.0635438 0.0341847 -0.00786744 +0.02297 0.122414 -0.00191144 +0.0401375 0.0953636 -0.00688813 +-0.0141538 0.0965092 0.052175 +-0.00422659 0.0383846 0.0124357 +-0.0311024 0.0343581 0.019624 +-0.0780471 0.153854 0.029137 +-0.0581213 0.151582 -0.000807379 +-0.0267449 0.0725846 -0.0356647 +-0.0191918 0.174184 -0.0227992 +-0.00378536 0.0798194 -0.0370348 +-0.0249464 0.0349691 -0.0199992 +-0.0564664 0.0423189 0.0186897 +0.0266976 0.119444 -0.00271582 +-0.023525 0.0349287 -0.0283944 +-0.0800951 0.15261 0.00324045 +0.0268493 0.119915 0.0267269 +0.0354747 0.0390827 0.0235255 +-0.0127812 0.17424 -0.0204206 +-0.0338617 0.168258 -0.00349456 +-0.0144845 0.0744882 0.056153 +0.0261935 0.0402752 0.032238 +0.0102706 0.0681153 -0.0309054 +-0.00974239 0.0387292 0.0290909 +-0.0644512 0.125591 0.047275 +0.010367 0.0479585 -0.0270631 +-0.0246099 0.0984431 -0.024327 +-0.0476227 0.0370311 -0.0128189 +-0.0780422 0.0846436 0.0366002 +-0.0566171 0.135321 0.0339425 +-0.0556004 0.0505584 -0.00338763 +-0.0907186 0.136468 0.0172046 +-0.0245124 0.180278 -0.0098524 +0.00742535 0.0346722 0.0416328 +-0.0699342 0.0651273 0.0236486 +-0.0124071 0.172769 -0.0198823 +-0.041856 0.149196 0.00419837 +-0.0809107 0.103235 -0.00559799 +-0.0631328 0.0335051 0.0030611 +-0.00851461 0.0647289 0.0558918 +0.0154483 0.127759 0.0239281 +0.0255922 0.123349 0.0191129 +0.0138934 0.0631004 0.0516475 +0.00118569 0.0983354 -0.0261952 +-0.0325387 0.118791 -0.011658 +-0.000757843 0.0354065 0.0103826 +-0.0248998 0.158417 -0.0112592 +-0.035233 0.0374002 -0.014964 +-0.0541243 0.156074 -0.00260128 +-0.0584646 0.0588965 0.0024905 +-0.0615294 0.0333928 -0.00373148 +-0.0602915 0.0343294 0.0347628 +0.0265767 0.0994658 0.0420977 +0.0347214 0.0712416 -0.0157876 +-0.040399 0.128703 0.00942739 +0.00251855 0.096887 -0.0286022 +-0.076485 0.148385 0.0403892 +-0.0606115 0.155938 0.0148123 +0.010878 0.0806434 0.0544608 +0.0384784 0.105492 -0.00082855 +0.0438672 0.0916755 -0.00180444 +-0.0513529 0.0733082 0.0416893 +0.0451032 0.0777437 0.000209071 +-0.0817242 0.148679 0.0369003 +0.0461375 0.0834298 0.00718398 +-0.0514739 0.135214 -0.000924577 +-0.00531173 0.100039 -0.0239686 +-0.0176147 0.042187 -0.0278695 +0.00727636 0.114035 -0.0188609 +0.0268989 0.0632714 0.044083 +0.0102735 0.0924657 -0.0299319 +0.010651 0.121836 0.0349107 +0.00895558 0.0361581 -0.0106394 +-0.0905601 0.144393 0.0275534 +0.043756 0.0467626 0.0296361 +-0.0417806 0.126404 -0.00562318 +-0.0358424 0.095771 -0.0231986 +-0.0809037 0.153834 0.0267225 +-0.0777263 0.156926 -0.0159116 +0.00417967 0.034897 0.044357 +-0.0351879 0.125718 0.0201989 +-0.0284012 0.038721 -0.0148192 +-0.0351226 0.169652 -0.0145814 +-0.0203438 0.180146 -0.0154935 +0.0345359 0.11019 -0.00473263 +-0.0932568 0.121548 0.0382795 +-0.0334767 0.152548 -0.00159465 +-0.0271731 0.174192 -0.00959576 +0.0159989 0.11444 -0.0153318 +-0.054238 0.13299 -0.00459005 +0.0366798 0.105376 -0.00582172 +0.0386277 0.0672715 0.0346845 +-0.0227209 0.162682 -0.0153632 +-0.0760409 0.0677685 0.0130189 +0.00250507 0.0772798 0.0565792 +-0.0345053 0.101515 0.0417518 +-0.0546003 0.0541349 0.0100271 +-0.000643212 0.127926 -0.00376413 +0.00284904 0.131659 0.0150261 +-0.0184884 0.186846 -0.021092 +0.0335193 0.114014 -0.000843968 +0.00632048 0.123167 -0.0106939 +-0.0564752 0.0624455 0.0290854 +-0.0138322 0.105995 -0.0224296 +0.00423384 0.0754618 -0.0348642 +-0.0281096 0.0778495 0.0450018 +-0.0776289 0.158329 -0.0159141 +0.0148253 0.0447411 0.0439981 +-0.0859023 0.122521 -0.0027014 +-0.0578481 0.0940916 -0.0211113 +0.00150378 0.0842858 0.0575429 +0.0326379 0.0849202 0.042017 +-0.0549752 0.0499938 0.0105067 +-0.0568824 0.10976 -0.0175883 +-0.00970298 0.0627929 -0.0357349 +-0.0178968 0.163686 -0.0167578 +-0.074969 0.105672 0.0364824 +0.00650677 0.0702743 0.0558788 +0.00487604 0.0992462 -0.0230983 +0.042474 0.101514 0.0131646 +-0.0643723 0.0593574 0.0120942 +0.0593748 0.0580631 0.00716733 +-0.00149842 0.111423 0.0424113 +-0.00749339 0.119159 -0.0142858 +-0.0771313 0.0754374 0.0308061 +-0.0477996 0.0869772 -0.0218762 +0.014411 0.0833733 0.0525453 +-0.0202678 0.159643 -0.00488449 +-0.0159305 0.0950186 -0.0327431 +-0.0279294 0.0931359 -0.0265478 +-0.0855021 0.102147 0.00137916 +-0.0938092 0.125562 0.0252741 +-0.058744 0.140559 -0.00481674 +-0.031677 0.126244 0.00820251 +-0.0264922 0.0447022 0.0511549 +-0.0205862 0.0382221 0.00925741 +-0.053491 0.104292 0.0408761 +-0.0370674 0.156264 -0.0103696 +-0.0634966 0.109514 0.0378318 +-0.0867621 0.084687 0.0184803 +-0.0830364 0.104646 0.028271 +0.0442212 0.0804374 0.0252067 +-0.0448473 0.0339909 -0.0230279 +-0.0037539 0.0755488 -0.0365646 +-0.0661663 0.158028 -0.0551775 +-0.0238007 0.0741774 -0.0380398 +-0.018731 0.0627665 -0.0359648 +0.0446574 0.0720977 0.0012022 +-0.0927955 0.121487 0.0416389 +-0.0620012 0.1241 0.0437622 +0.0300963 0.0995295 0.0401727 +-0.0719316 0.149607 -0.0394232 +0.0355637 0.0889227 0.0392444 +0.0493081 0.0547033 -0.00484617 +-0.0668328 0.0604514 0.0106116 +0.00304719 0.123088 -0.0105402 +-0.0255191 0.118043 0.0319974 +-0.0394865 0.115305 0.0335817 +-0.0326614 0.0592947 -0.0125392 +0.0575508 0.0523393 0.00818574 +-0.0893959 0.0942918 0.0174254 +-0.0269084 0.160002 -0.0134029 +-0.0506856 0.0345547 0.0383582 +-0.0800885 0.0739226 0.0209531 +-0.0277305 0.073972 -0.0353872 +-0.0320496 0.0849187 -0.0285721 +-0.0217999 0.0866355 0.0553929 +-0.0322022 0.0465812 -0.0258568 +-0.0442317 0.12547 0.021384 +0.0214935 0.0781932 0.0504764 +-0.0444883 0.150664 0.00744383 +-0.0303843 0.0566029 -0.0193937 +-0.0723854 0.155427 -0.0359059 +-0.0245149 0.0811097 0.0540325 +0.0189031 0.068639 0.0501604 +-0.0650109 0.041163 0.0307556 +-0.0194954 0.107168 0.0420699 +-0.0325124 0.113906 0.0343195 +-0.0544418 0.118427 -0.0131672 +-0.0536811 0.113759 -0.0162997 +-0.0559476 0.153959 0.0252069 +-0.0675391 0.124252 0.0515729 +0.0440796 0.0450784 0.0271934 +-0.0594971 0.101543 0.0424741 +-0.0184988 0.100234 0.0438197 +0.0434554 0.0790039 -0.00377815 +0.0140981 0.0343905 -0.0079847 +-0.0615105 0.0406302 -0.00752326 +0.0320683 0.0578123 0.0392046 +0.0144666 0.0962642 0.0485999 +-0.0315047 0.0631978 0.0384961 +-0.0306251 0.038441 -0.00943325 +-0.0847861 0.0804507 0.00450965 +-0.0549519 0.160962 0.00433648 +-0.0470839 0.131413 0.00333034 +-0.00104546 0.0391448 0.0323048 +-0.0526926 0.151783 0.016281 +-0.0223808 0.0958588 0.045836 +-0.0841478 0.15365 0.0123539 +0.0536189 0.0735747 0.0133449 +-0.00350831 0.0975151 -0.0292875 +-0.0571277 0.155869 0.0117051 +0.00341369 0.131576 0.0166618 +-0.0237378 0.0654511 -0.0345337 +-0.0858145 0.0991904 0.0269676 +-0.0759199 0.0783227 -0.00959072 +0.032684 0.0640121 -0.0177767 +-0.056282 0.132113 -0.00567386 +0.00328959 0.131137 0.0194851 +0.00882643 0.110931 -0.0195298 +-0.00876485 0.1716 -0.0262973 +-0.0151483 0.0405525 0.0515137 +-0.0498071 0.0343093 0.00865348 +-0.0569766 0.0339283 0.0235563 +-0.0226683 0.0381298 0.00891697 +-0.0855438 0.106245 0.00446783 +0.0454924 0.0651146 0.027904 +0.0150017 0.0576648 0.0496654 +0.00644791 0.119491 -0.0147367 +-0.0156486 0.0481142 -0.0300898 +-0.0650134 0.13537 0.0410634 +0.0113952 0.116794 -0.0158535 +0.0173388 0.0781757 0.0532571 +0.0536226 0.0587546 -0.00269037 +-0.0709897 0.0340252 0.000991695 +0.038384 0.106978 0.0241932 +-0.0385431 0.038993 -0.0286239 +-0.0451337 0.127804 0.0210049 +-0.0690676 0.152436 0.0353067 +-0.0883368 0.137775 0.00920322 +-0.0714828 0.0362083 0.00943052 +-0.0717062 0.159603 -0.040933 +-0.0255949 0.125933 0.00752005 +-0.047874 0.0346487 0.0423594 +0.0367516 0.111162 0.00316661 +-0.00949217 0.110042 0.0428369 +-0.0572015 0.0336196 0.0184714 +0.0150246 0.0392642 0.0442415 +-0.00832489 0.0993422 -0.0252442 +-0.0304761 0.0342807 0.0180201 +-0.026997 0.0382812 -0.00486026 +-0.0916784 0.144722 0.0181573 +-0.0703317 0.172249 -0.0530308 +-0.0159101 0.1643 -0.0176565 +-0.0850976 0.106195 0.00337687 +-0.035284 0.173981 -0.0126295 +-0.032733 0.155408 -0.00943888 +0.00217615 0.12934 0.0262849 +0.00123579 0.075497 -0.0355058 +-0.0332024 0.0455956 -0.0269373 +-0.0155006 0.103015 0.0432792 +0.0396392 0.106988 0.00416547 +-0.021523 0.118151 0.0342827 +-0.0184974 0.103009 0.0434402 +-0.047784 0.038449 -0.0122332 +-0.0104903 0.0604984 0.0550813 +0.0293518 0.0659692 0.0423806 +0.0185572 0.0930309 -0.0244868 +0.0173756 0.109987 -0.0165543 +-0.0865489 0.109072 0.0153468 +0.0363255 0.10537 -0.00683316 +-0.0394998 0.076195 0.0426907 +-0.0603651 0.0470889 0.0366883 +-0.0144951 0.119623 0.0361429 +0.0406661 0.105634 0.0121644 +0.0383891 0.0460848 -0.00524865 +0.0295409 0.0942529 0.0428642 +0.0373159 0.0880544 -0.0152271 +-0.0784316 0.0799342 0.0337318 +-0.0548348 0.124111 0.0382711 +0.0178682 0.0672532 0.0504022 +-0.0788979 0.123682 -0.00614143 +-0.0298552 0.0986755 -0.0232224 +-0.0771653 0.156191 -0.0114635 +-0.0923833 0.130942 0.0122392 +-0.0651094 0.121429 0.0498115 +-0.042493 0.0690949 0.0416622 +0.0416337 0.0792551 0.0303335 +0.0189066 0.0808659 0.0520326 +-0.029145 0.125694 0.0135548 +-0.0619967 0.14761 -0.00462246 +0.0255017 0.0449453 0.0383425 +-0.0925798 0.11747 0.0343056 +-0.00233027 0.0339229 -0.0220991 +0.00799401 0.0819204 0.0555296 +-0.0699548 0.147947 -0.0321477 +0.0415131 0.0394077 0.00724875 +-0.0712173 0.0846981 0.0410753 +-0.0880447 0.0874003 0.00446864 +0.00798497 0.0890814 -0.0324293 +-0.0117258 0.0656807 -0.0365783 +-0.0114796 0.112753 0.0411508 +-0.0817304 0.107364 -0.00260486 +-0.0293156 0.0820403 0.0446588 +-0.0495645 0.0375773 -0.0119604 +-0.043838 0.0956679 -0.0221641 +-0.00869681 0.129559 0.00358698 +-0.0933816 0.129671 0.0222434 +-0.0700603 0.163804 -0.0489659 +-0.00755399 0.0384559 0.0207545 +0.0159604 0.125249 0.0284184 +-0.0514974 0.0791051 0.0438079 +-0.0840796 0.0818676 0.0264914 +0.037525 0.0785071 -0.0127982 +0.0299804 0.119686 0.0179058 +-0.0638039 0.0881523 -0.0190251 +-0.0272788 0.0350567 0.0515587 +-0.00562089 0.115673 -0.0165634 +-0.0104428 0.0347186 0.0450504 +-0.0427898 0.116428 -0.015168 +0.0165768 0.126998 0.000104849 +-0.0238911 0.0738255 0.0493988 +-0.0485539 0.0376116 -0.0123218 +-0.0396922 0.0460798 -0.021311 +-0.0485652 0.0335345 -0.00306359 +0.0414749 0.104231 0.00716597 +-0.0445241 0.0409237 -0.0192998 +-0.0220397 0.0354083 0.0523916 +-0.0380711 0.0340829 0.00944176 +0.0139247 0.0348347 0.0392218 +-0.0297288 0.0335868 -0.0252735 +-0.00107263 0.0385746 0.00195199 +0.0117524 0.0352863 0.00381322 +0.0170772 0.0847646 0.051153 +-0.0656775 0.067321 -0.00750664 +-0.00543271 0.0918052 -0.0353894 +0.0133691 0.0343357 -0.00620151 +0.0451372 0.0875619 0.0011816 +0.0503362 0.0703636 0.0239238 +-0.0474927 0.0804818 0.0437565 +-0.00542063 0.0391587 0.0349931 +0.00193935 0.03568 -0.0153447 +-0.0774115 0.160346 -0.0169397 +0.049877 0.0727457 0.00893584 +-0.0640788 0.0598458 0.0171155 +-0.00650105 0.0472142 0.0482843 +-0.0241121 0.163789 -0.0160029 +-0.0173263 0.0611887 0.051725 +0.0171559 0.100271 -0.022436 +-0.0604932 0.155795 0.0206537 +-0.0609595 0.142497 0.0365005 +-0.0668489 0.0966702 -0.0167929 +-0.0149394 0.183104 -0.021718 +-0.0321779 0.0750041 -0.0285287 +-0.0226305 0.0710127 0.0496427 +0.0463117 0.0820487 0.00917902 +-0.0795939 0.112319 0.0461682 +-0.0658419 0.0995396 -0.0165139 +-0.0810165 0.134048 0.0507919 +-0.0486855 0.131027 0.0278379 +-0.0788429 0.112725 -0.00283498 +-0.0784933 0.0832425 0.0356821 +-0.0258381 0.0781035 0.0498012 +0.0426426 0.0858997 0.0283401 +-0.0677549 0.154168 0.0312275 +-0.0306743 0.0383989 -0.00386137 +-0.0857757 0.0926386 -0.000557841 +-0.0210104 0.0417331 0.053591 +0.0161529 0.100264 -0.0224296 +0.0387814 0.0821002 0.0350599 +0.0484193 0.0639761 -0.00211304 +-0.0858985 0.111778 0.0253403 +-0.0389634 0.128304 0.0114309 +-0.0634823 0.0352819 -0.00824664 +0.0395163 0.0646366 -0.0087647 +-0.0591064 0.0435686 0.0148077 +0.00621882 0.12419 0.0335647 +-0.0171539 0.0347559 0.0453522 +-0.0314811 0.0546225 0.0370229 +-0.0182701 0.114743 -0.017523 +-0.0605388 0.141029 0.0353291 +-0.063605 0.126943 0.0449774 +-0.03749 0.0533987 0.0390423 +-0.0573191 0.0507885 0.00568774 +-0.0424884 0.109818 0.0380938 +-0.082569 0.0790202 0.0265184 +-0.0653913 0.0757553 0.0400472 +-0.0105137 0.0589924 0.0541839 +0.0198393 0.0700116 0.0497622 +-0.0814721 0.135361 0.0497671 +0.00809889 0.111578 -0.0196036 +-0.0276072 0.038217 0.0294729 +-0.0647783 0.173212 -0.0488362 +-0.0760415 0.0675654 0.00655947 +-0.0322855 0.0610195 -0.0154117 +-0.00948933 0.0674612 0.0553354 +-0.0922478 0.11733 0.00930597 +0.0325339 0.116751 0.00316678 +-0.0788837 0.117794 -0.00533035 +0.0177807 0.10571 -0.0179484 +-0.0648315 0.0895741 -0.0187043 +-0.0303114 0.0384164 -0.0075003 +-0.0728418 0.0685704 -0.00149472 +0.0396278 0.103602 -0.00160767 +-0.0575003 0.109781 0.0378101 +-0.0359224 0.034124 0.026018 +-0.0230844 0.126658 0.00843513 +-0.0904612 0.131068 0.0382266 +-0.0782718 0.165861 -0.029036 +0.0284552 0.0607955 -0.0208488 +-0.0495337 0.163976 0.00447865 +-0.0665318 0.134006 0.0442059 +-0.0622043 0.0590015 0.0092504 +0.0124693 0.0962821 0.0494059 +0.0199668 0.115907 -0.0129188 +-0.0101559 0.0386047 0.027311 +-0.0224495 0.0580629 0.0442448 +-0.0768471 0.09916 -0.0110394 +-0.0438495 0.0999429 -0.0214407 +-0.0642587 0.173261 -0.0500973 +-0.0291541 0.123106 -0.00418201 +-0.0785185 0.16527 -0.0289621 +-0.0773807 0.0774654 0.0325309 +0.0184997 0.0892768 0.0486726 +-0.0147168 0.0628748 -0.03682 +0.0133075 0.062355 -0.0296823 +0.0174899 0.111215 0.038757 +-0.0829923 0.130939 -0.00341376 +-0.0749763 0.152739 -0.0169005 +-0.00979029 0.0798633 -0.0379189 +-0.0243904 0.183518 -0.0110527 +0.0382626 0.0899111 -0.0131489 +0.0353274 0.107617 -0.00596632 +-0.0649093 0.06918 0.0352438 +0.0545625 0.0595427 0.0278248 +-0.0664402 0.128427 0.0478848 +0.0302544 0.035019 0.00964843 +-0.0212084 0.186026 -0.0155815 +-0.00559653 0.0391515 -0.0257085 +-0.00382316 0.0854518 -0.0372434 +0.0556932 0.0688929 0.00299188 +0.0435925 0.0958855 0.00119521 +-0.061875 0.156868 -0.0195857 +-0.0283944 0.174224 -0.00779385 +0.000326986 0.131385 0.00837406 +0.0583787 0.0621209 0.00318289 +0.0262357 0.0740751 0.0449841 +-0.0747322 0.0729443 0.0316828 +-0.0650821 0.148822 -0.0290175 +-0.0436469 0.0601588 0.0398932 +0.0443703 0.0410834 0.0161644 +-0.0674507 0.155183 -0.000720573 +-0.0165017 0.177176 -0.0187481 +0.0352588 0.0755049 -0.0148105 +0.00551455 0.110936 0.0415028 +0.0248664 0.0898261 -0.023121 +0.00550646 0.078617 0.0558754 +-0.0698407 0.127049 0.051763 +-0.0375072 0.123454 -0.00854988 +-0.052616 0.0657163 0.0355847 +-0.0748963 0.0690517 0.0244939 +0.023431 0.11936 -0.00662051 +-0.0185076 0.120924 0.0327413 +0.0394332 0.101324 0.027167 +-0.00864992 0.124983 -0.00848236 +-0.0872247 0.152479 0.0216964 +-0.0215688 0.0623472 0.0460467 +-0.0475797 0.035695 0.0449374 +-0.0510737 0.151654 -0.00393732 +-0.0415 0.0930514 0.0423592 +-0.0544965 0.100156 0.0427594 +0.049267 0.0717276 0.00605578 +0.0292141 0.0815364 -0.0209002 +-0.0052585 0.095242 -0.0329133 +0.0151527 0.129419 0.0109697 +-0.0294996 0.100187 0.0432585 +0.0363367 0.0432226 0.0290731 +0.0327757 0.035977 0.0148418 +0.00349523 0.0427434 0.0456833 +0.046121 0.0848311 0.00917504 +-0.067462 0.157723 -0.00658264 +-0.0876012 0.0995367 0.00546504 +-0.0356487 0.0352259 -0.0310792 +-0.0585981 0.0658974 0.0341563 +-0.0639239 0.116652 -0.0103062 +-0.0525394 0.0472909 -0.00733632 +-0.0398304 0.034299 0.0303636 +0.0252131 0.0803965 -0.024704 +-0.0721022 0.165224 -0.0439746 +-0.058758 0.148538 -0.00150368 +-0.0625812 0.150647 -0.00957658 +-0.0878641 0.137757 0.00720039 +0.0109534 0.0475021 0.0472035 +-0.0699012 0.105141 -0.0130553 +0.0318353 0.0540522 -0.0127622 +-0.0866591 0.107689 0.0123597 +0.0552547 0.0595292 0.0270628 +0.0320484 0.11465 0.0272407 +0.0433462 0.0818009 -0.00379375 +-0.0294668 0.176906 -0.0160057 +-0.0169961 0.094658 0.0531741 +-0.0202578 0.0596247 0.0476545 +-0.0798939 0.123658 -0.00558813 +0.0482025 0.0703533 0.0231278 +-0.0206189 0.186125 -0.0151754 +0.0100127 0.0349584 -0.0111996 +-0.0661914 0.152591 -0.0424622 +-0.0478408 0.098515 -0.0219326 +0.026913 0.0619271 0.0440949 +-0.0328507 0.126562 0.0151396 +-0.0689146 0.108019 -0.0123122 +-0.00583756 0.0390351 0.0332216 +-0.0125377 0.0365668 -0.017148 +-0.0373858 0.0446552 0.0411638 +-0.0759006 0.161818 -0.014334 +0.0304033 0.107421 -0.0117891 +-0.0654084 0.175187 -0.050486 +-0.0633716 0.143922 0.0382956 +0.0194957 0.0920261 0.0477827 +-0.0288404 0.0972702 -0.0238091 +-0.00475508 0.0741241 -0.036385 +-0.0104985 0.0362063 -0.0254961 +-0.0625516 0.147537 -0.0115723 +-0.0816708 0.0869142 -0.00660013 +-0.00823999 0.130343 0.0167173 +-0.0809733 0.130966 -0.00434035 +-0.0437659 0.0811743 -0.0201658 +0.00743904 0.129465 0.0253135 +-0.00451238 0.0760575 0.0586977 +0.0302883 0.103408 0.0369471 +-0.0379006 0.151906 -0.00621808 +-0.00550346 0.076042 0.0585145 +-0.0217032 0.0597401 -0.0334972 +-0.0868755 0.112781 0.0262639 +-0.0336701 0.155604 -0.00983793 +-0.0126927 0.0599517 -0.0357172 +-0.0638978 0.150075 -0.0288161 +-0.0144059 0.112046 -0.0186792 +-0.00421023 0.0383902 0.0178766 +-0.0453052 0.113634 -0.0162273 +0.0147972 0.102084 -0.0220848 +-0.0484999 0.105649 0.0400819 +0.0216294 0.0875507 0.0490393 +-0.0124184 0.175705 -0.0216387 +-0.0328373 0.163842 -0.00376818 +-0.0666614 0.0672261 -0.0064803 +-0.0395052 0.119385 0.0302298 +-0.0489243 0.0675117 0.0383488 +-0.0552807 0.0343936 0.0305403 +0.00553119 0.0603997 0.0554086 +-0.0914264 0.14884 0.0201323 +0.0231929 0.110938 -0.0135659 +-0.065154 0.164972 -0.0244937 +-0.050496 0.074792 0.0427038 +-0.0657515 0.154274 -0.0462128 +-0.0343486 0.0367995 -0.0305331 +-0.0826303 0.103323 0.0293175 +-0.0597443 0.0338929 0.0194732 +-0.0425056 0.0591222 0.0401769 +-0.0743438 0.156862 -0.0249223 +-0.00222977 0.0396912 0.0474006 +-0.00562206 0.0388337 0.0298422 +-0.0338556 0.0723894 -0.0214737 +-0.0635465 0.0333817 0.00128463 +-0.0330138 0.0356955 0.0305887 +-0.0730865 0.16659 -0.0202232 +-0.0570856 0.153101 -0.000954757 +0.0275543 0.0960379 -0.019637 +-0.0229677 0.169763 -0.0123298 +0.0217819 0.106251 -0.0165369 +-0.0575003 0.0630187 0.0298519 +-0.00864981 0.171144 -0.0247734 +-0.053919 0.0587242 -0.00741756 +-0.0595 0.105675 0.0404663 +0.0351077 0.0740897 -0.0147891 +-0.0620479 0.155306 -0.016587 +0.0278721 0.0522836 -0.0197543 +0.0325208 0.0469245 0.0310812 +-0.06629 0.139698 0.0427919 +-0.078132 0.172939 -0.0407193 +-0.0294988 0.0559628 0.0364214 +-0.0374897 0.0562507 0.0395531 +-0.0662219 0.155662 0.00991681 +-0.0408786 0.0346362 0.0386374 +-0.0208999 0.185581 -0.0139755 +-0.0330517 0.0624982 -0.0144201 +-0.0767419 0.164619 -0.0220172 +-0.0697905 0.0865423 -0.0170841 +-0.0784816 0.0755217 0.0287043 +0.0172033 0.118701 -0.0119316 +-0.0185134 0.0473863 0.05026 +0.00729554 0.0653986 -0.0323322 +-0.0415011 0.0506114 0.0394281 +-0.0541424 0.033642 0.0190888 +-0.0921005 0.132392 0.0222257 +-0.0136741 0.0384938 0.00315386 +-0.0383322 0.163825 0.00056966 +-0.0762889 0.0738479 0.0305832 +-0.0875285 0.133568 0.00229932 +-0.0736181 0.0688668 0.0266732 +0.02687 0.0981666 0.0425225 +-0.051308 0.153569 0.0116824 +4.86222e-05 0.11836 -0.0154829 +-0.0517937 0.0583908 0.0296448 +0.0605105 0.0595417 0.010156 +-0.0573945 0.0371513 -0.0102727 +0.00965733 0.0345667 0.0223294 +0.0463647 0.0703187 0.00350637 +-0.0625718 0.1468 0.0377209 +-0.089178 0.137924 0.0381661 +-0.0134956 0.0759117 0.0568004 +-0.00574286 0.0755721 -0.037104 +0.0261865 0.123233 0.0107875 +-0.0580499 0.11553 -0.0140963 +-0.00762589 0.0451743 -0.028662 +0.0535357 0.0635428 0.028124 +-0.0718987 0.123811 -0.00847645 +-0.0635357 0.119961 0.0469254 +0.00211859 0.130671 0.0219319 +0.00252859 0.0358017 0.021576 +0.0527591 0.0693467 0.00250314 +-0.0451218 0.0335948 -0.0116042 +-0.0769111 0.100434 -0.0105662 +0.0223237 0.0564658 -0.026195 +0.0394644 0.107011 0.0181712 +-0.0776021 0.0994637 0.0357144 +-0.0632381 0.170981 -0.0495819 +-0.00862433 0.122038 -0.0113292 +-0.0548269 0.0450002 0.0157095 +-0.0506815 0.134691 -0.000340536 +-0.0495888 0.146296 0.0105853 +-0.00908464 0.173025 -0.027717 +-0.00410488 0.0346022 0.0429088 +-0.0260906 0.0386266 -0.0124061 +0.0283176 0.118208 -0.00273298 +-0.0318098 0.121167 -0.00811427 +-0.0737276 0.154081 -0.027902 +0.0162665 0.119939 -0.0112703 +-0.0270805 0.0349584 0.0482667 +-0.0284917 0.101554 0.0428228 +-0.0249764 0.159657 -0.0011434 +-0.0585904 0.142433 0.0328417 +-0.0486888 0.138617 0.0104009 +-0.0234979 0.0724108 0.049066 +-0.019247 0.158526 -0.00845424 +-0.0716194 0.0382939 0.000706648 +-0.0412769 0.0356814 0.042879 +0.0483353 0.0532726 -0.00489034 +0.0606695 0.0664968 0.0121468 +-0.069489 0.104131 0.0386578 +0.00750734 0.0990008 0.0480837 +-0.0624532 0.126929 0.0430601 +-0.0629568 0.15367 -0.0336031 +-0.0374985 0.0747273 0.041938 +0.0426086 0.0930422 0.0261716 +-0.0849422 0.153595 0.0209155 +-0.0543959 0.12661 -0.00573734 +-0.0742502 0.161028 -0.0329547 +-0.0627767 0.112367 0.0371562 +-0.0532977 0.158553 0.00873827 +-0.0769168 0.123731 -0.00719316 +0.0393533 0.0847596 0.0341247 +-0.0692244 0.15634 0.0190049 +0.0343018 0.0936044 -0.01506 +-0.0165008 0.0800909 0.0572191 +-0.014166 0.184338 -0.0242563 +-0.0631574 0.159924 -0.0465929 +-0.0374857 0.0519831 0.0389557 +0.03646 0.112262 0.0117392 +-0.0411413 0.0364371 -0.0278037 +0.0185712 0.126949 0.0207922 +-0.0603223 0.0385556 0.0217181 +-0.0769591 0.131054 -0.00672048 +-0.0295123 0.0565107 -0.0214026 +0.0430875 0.0930739 0.0251589 +-0.00582403 0.0390405 -0.0106025 +-0.0553855 0.0337802 0.0222515 +0.014479 0.100435 0.047468 +-0.0548752 0.0984577 -0.0213117 +-0.0501571 0.0529434 0.0176286 +0.0183573 0.0461568 -0.0227219 +-0.0554809 0.0440191 0.0450323 +-0.0877934 0.0860475 0.0044818 +0.00321463 0.130705 0.0223233 +-0.0505315 0.0389504 -0.011562 +-0.0819835 0.132406 -0.00340088 +-0.0758067 0.0877331 -0.0139103 +-0.091338 0.14476 0.0251578 +-0.0649682 0.034557 0.0300942 +-0.0283013 0.113756 -0.016413 +0.0259713 0.0619044 0.0444933 +-0.0535159 0.0640852 0.0330775 +-0.0046427 0.0482096 -0.0303136 +-0.0584956 0.0861498 0.0443498 +-0.0655423 0.145055 -0.0169033 +-0.0423586 0.123855 0.0235885 +-0.0864234 0.0806346 0.0145003 +-0.033107 0.125984 0.00180258 +0.000400525 0.0433705 -0.0249688 +-0.0337351 0.126905 0.0148106 +0.0594437 0.0677773 0.0191638 +-0.0433018 0.0342732 -0.0267127 +-0.0668634 0.040937 0.011312 +-0.0651408 0.146773 0.0392721 +0.0142259 0.080787 -0.0303234 +-0.0564981 0.0973554 0.0431547 +0.0234826 0.113521 -0.012343 +-0.022737 0.0385766 -0.00982941 +-0.0695434 0.0352232 -0.00418951 +0.060768 0.0651161 0.0111484 +-0.00338536 0.100168 0.0483773 +-0.0154942 0.0772732 0.0564359 +-0.0581438 0.114319 -0.0148345 +-0.0758612 0.165153 -0.0370257 +-0.0666041 0.164889 -0.0207192 +-0.0401309 0.160681 -0.0117333 +-0.00727995 0.0389199 -0.00704692 +-0.0726288 0.07489 0.035733 +0.0572537 0.0657957 0.00220085 +-0.0564793 0.151056 0.0307055 +-0.0459743 0.153608 0.00885524 +-0.046245 0.034596 0.0410145 +-0.0611658 0.168359 -0.0606871 +-0.0242347 0.0401682 0.0541848 +0.0432765 0.10012 0.00816425 +0.0330202 0.102118 0.0356213 +-0.00368236 0.0583856 -0.0334327 +-0.016783 0.0973001 -0.0271368 +0.018711 0.100467 -0.0223545 +-0.0500289 0.122604 0.03284 +-0.063243 0.0333437 -0.00222576 +-0.0187202 0.0613304 -0.0355606 +-0.0268504 0.0548324 -0.0264063 +0.0215374 0.086463 -0.0256391 +-0.0138967 0.099791 -0.0237429 +-0.00550708 0.0774167 0.0583085 +0.055466 0.0507517 0.00421414 +0.00822806 0.0344179 0.00390084 +0.028423 0.0535254 0.0391477 +-0.00689074 0.103109 -0.0232386 +-0.0320031 0.0370471 -0.0177181 +-0.0255422 0.0377889 0.0158759 +-0.0476682 0.165409 0.0039929 +-0.0673807 0.115762 0.049991 +0.00348136 0.111402 0.0420175 +-0.081586 0.0734778 0.0135382 +0.0427229 0.10007 0.00318201 +-0.0456223 0.0548403 -0.0108081 +-0.0226179 0.0464363 -0.0275647 +-0.0201905 0.172698 -0.0217858 +0.0374948 0.0941477 0.0350502 +0.0227469 0.0686119 0.0468992 +-0.012216 0.174205 -0.0276647 +-0.0906322 0.112714 0.0163744 +-0.0599044 0.111127 -0.0158584 +0.00535116 0.0480874 -0.0284111 +-0.0295604 0.158116 0.000994125 +0.0104513 0.122961 -0.0105071 +-0.0619452 0.123832 -0.00870252 +0.00605345 0.0341614 0.00369541 +-0.0696099 0.138316 0.0468524 +0.00349102 0.11963 0.0373483 +-0.0495577 0.0338416 0.0269497 +-0.0500211 0.0529295 0.0155558 +-0.0534917 0.0491191 0.0286591 +0.0546976 0.0478581 0.0131951 +-0.0803392 0.0841108 -0.00756769 +-0.0693719 0.180628 -0.057909 +-0.0247145 0.161052 -0.00252569 +0.0299408 0.0713176 0.0415086 +-0.0779905 0.173544 -0.0470087 +-0.0168218 0.086916 -0.0386596 +-0.0658968 0.109505 -0.0131657 +0.0326969 0.10609 0.0333845 +0.0191388 0.0356129 -0.00667825 +-0.0168818 0.100112 -0.0240537 +-0.0620293 0.135502 -0.00717407 +0.0377405 0.110012 0.0179226 +0.0360001 0.0381146 0.00239588 +-0.0151683 0.160834 -0.010917 +-0.0894324 0.117571 0.0455052 +0.0402874 0.063301 -0.00576463 +0.000231956 0.0755133 -0.0357459 +-0.0663652 0.0422587 0.0107808 +-0.0908359 0.114163 0.0368153 +0.0456753 0.0833922 0.00418733 +-0.0426429 0.0563425 -0.0115708 +-0.0472127 0.168412 -0.001987 +0.0163989 0.0433061 -0.0232691 +-0.0181224 0.165314 -0.018178 +0.014203 0.08785 -0.0301032 +0.00716038 0.0832586 0.0561062 +0.0547452 0.0661481 0.0263648 +0.0207672 0.0700064 0.0493524 +-0.0820552 0.1102 0.0401793 +0.0336664 0.0753805 -0.0167583 +-0.0827158 0.108829 0.000295564 +0.0250546 0.0420912 0.0376641 +-0.0866523 0.0868042 0.0239447 +-0.082018 0.151309 0.00327526 +0.0209029 0.107601 -0.0159886 +-0.0134952 0.0659366 0.0537869 +-0.0902062 0.143054 0.0286714 +0.0484774 0.0431365 0.00824398 +0.00679595 0.0352467 -0.0139815 +0.0154 0.0448131 -0.0240573 +-0.0715189 0.0972122 0.0409969 +0.0152962 0.0652155 -0.0297912 +0.0106046 0.128135 -0.0020835 +0.0273536 0.106086 0.0379553 +-0.0176729 0.0540415 -0.0325983 +-0.00110521 0.131378 0.0121444 +-0.0724827 0.124619 0.0532114 +-0.0738593 0.174047 -0.0391959 +-0.0646169 0.109762 0.0377795 +0.00521659 0.0824462 -0.0340286 +-0.0280135 0.0591603 -0.0264206 +-0.0676617 0.0433934 0.000689977 +0.0407264 0.0999947 0.0251764 +-0.0322885 0.177691 -0.00536129 +-0.0547546 0.035972 0.0465789 +-0.0425002 0.115266 0.0336474 +-0.0687451 0.0708436 0.0347552 +-0.0375019 0.0804666 0.0432825 +-0.0182946 0.181579 -0.0243778 +-0.0789826 0.115456 0.0491224 +-0.0415063 0.0534301 0.0394734 +-0.0708913 0.0403263 0.00282802 +-0.0548298 0.0927311 -0.0220321 +-0.0745142 0.138634 0.0488155 +-0.0807745 0.102028 0.0317433 +-0.0249646 0.181509 -0.0170525 +-0.0727415 0.154031 -0.0358995 +-0.0698172 0.0908437 -0.0164973 +-0.0366476 0.0577363 -0.0111372 +-0.0192308 0.0947234 -0.0324688 +-0.0118669 0.165326 -0.0197278 +-0.0804375 0.137229 0.0490949 +0.0134351 0.129972 0.01319 +0.0457654 0.0791979 0.00319646 +-0.0469166 0.129554 0.0250362 +-0.0581769 0.137607 -0.00562722 +0.04256 0.0817421 -0.00578018 +-0.0478101 0.0884245 -0.0219224 +-0.0424147 0.0344885 0.0314161 +-0.0645764 0.139638 0.0400104 +0.00451352 0.10035 0.0463879 +0.0423459 0.0915624 -0.00580854 +-0.0833163 0.106091 -0.000625527 +-0.0510681 0.0429687 0.0449412 +-0.0258019 0.0564099 0.0391373 +-0.0908661 0.142018 0.0261694 +-0.0222707 0.180155 -0.0129798 +-0.0375032 0.0987213 0.042382 +-0.0135516 0.0445689 0.0502862 +-0.0749157 0.0818909 0.0378096 +-0.042351 0.0336287 -0.0184783 +-0.0104895 0.0660607 0.0552117 +-0.0713722 0.163817 -0.0449613 +-0.0170629 0.040485 0.0522671 +-0.0629502 0.151043 -0.0063137 +-0.0420636 0.159404 0.00394669 +-0.0438717 0.105649 -0.0205239 +0.00352724 0.10161 0.0446753 +-0.00861199 0.118019 -0.01506 +-0.0658335 0.0881117 -0.0184537 +0.00251222 0.126485 0.0307749 +-0.0485567 0.0390246 -0.0119389 +-0.0600846 0.0399274 0.0217122 +0.0128427 0.034706 0.0391137 +-0.0306178 0.0409006 -0.0300462 +-0.0635449 0.0356868 -0.00823988 +-0.0063607 0.125295 -0.00886018 +-0.025376 0.059259 0.0400414 +0.0015066 0.0490028 0.0513272 +-0.0107915 0.0798668 -0.0380291 +0.0455381 0.0540654 0.0323771 +-0.0645999 0.0347243 0.0265296 +-0.074389 0.0874223 0.0399149 +0.0147945 0.0909396 -0.0283095 +-0.0256418 0.0382997 -0.00275652 +-0.0249427 0.17123 -0.0116584 +-0.0860007 0.147303 0.0341634 +-0.00989368 0.129282 0.00314288 +-0.056803 0.119986 -0.0107265 +0.0131837 0.129339 0.0031365 +0.0204173 0.0925165 -0.0239466 +-0.0881399 0.122604 0.000302573 +-0.0687931 0.166618 -0.053004 +-0.0116307 0.0337076 -0.023716 +-0.0395047 0.0776369 0.0429957 +-0.0435015 0.086056 0.04322 +0.0313221 0.0899509 -0.0192278 +-0.0512591 0.0544504 0.0206222 +0.0450165 0.0718833 0.00186291 +-0.0240342 0.0381218 0.00683415 +-0.0643335 0.153058 -0.000307605 +-0.0553413 0.0491317 -0.00437815 +0.0461434 0.0834347 0.0111711 +0.0469552 0.0427274 0.0188429 +0.0403147 0.061632 0.0300225 +-0.0345217 0.127119 0.00425139 +-0.0560415 0.0335011 -0.000906542 +0.0458803 0.0848141 0.013166 +0.0355169 0.0713149 -0.0148173 +-0.00649249 0.0978569 0.0522238 +-0.0720202 0.152598 -0.0428872 +0.00936768 0.0509673 -0.0289075 +-0.017803 0.0813337 -0.0391893 +-0.0164921 0.101629 0.0439544 +-0.0749763 0.136928 -0.00646616 +-0.018438 0.165372 -0.011068 +-0.0749694 0.0749712 0.0333987 +-0.0344916 0.0547205 0.0381399 +-0.0252176 0.0351344 0.0519405 +-0.0785113 0.10447 -0.00758869 +-0.0837382 0.0804711 0.0245022 +0.0352492 0.043109 0.0289456 +-0.0657408 0.0353871 0.0379044 +-0.0633722 0.04322 0.0387983 +0.0187703 0.0504962 0.0444745 +0.0134519 0.128957 0.00181284 +0.00181742 0.106617 -0.0209271 +-0.069971 0.156225 0.0143836 +-0.0793623 0.0739499 0.024599 +0.0192573 0.0903239 -0.0256184 +-0.0785673 0.0716608 0.0214639 +0.0207235 0.123161 0.0287274 +-0.0694864 0.116115 0.0518347 +-0.022007 0.0754165 0.0531212 +0.00541958 0.0361021 -0.0235849 +0.0126937 0.0345417 0.0229719 +-0.0272554 0.0377383 0.0173779 +0.0183414 0.126234 0.023568 +-0.0782171 0.159705 -0.021925 +0.0319954 0.11684 0.00152318 +-0.0364949 0.0747255 0.0419725 +-0.00631217 0.0422986 0.0485312 +-0.0696892 0.0733745 -0.0120577 +-0.0574743 0.0452883 0.0435332 +0.0270163 0.115378 0.0322111 +0.0100342 0.126121 -0.00591235 +-0.0765631 0.160404 -0.0136187 +0.0104935 0.0976882 0.0488434 +-0.088546 0.102334 0.0113879 +-0.0488628 0.0600536 0.0351294 +-0.0102645 0.038442 0.0220215 +-0.0471272 0.159118 -0.00765489 +0.0282711 0.0480264 -0.0137299 +0.0106928 0.0341923 -0.0160349 +-0.0413207 0.122297 -0.0113384 +-0.0112299 0.173502 -0.0278641 +-0.0702692 0.146349 -0.0238997 +-0.0311686 0.0820079 -0.0315681 +-0.058698 0.0349789 0.0448461 +0.0225489 0.0444802 -0.0157666 +0.00650352 0.0547197 0.0529464 +0.0375985 0.10834 0.0241868 +0.026474 0.110098 0.0367031 +0.0104332 0.0344417 -0.0125223 +-0.00834994 0.0943471 -0.0340215 +-0.0726673 0.155437 -0.0339106 +-0.0830075 0.0762889 0.0105229 +-0.0846192 0.0805533 0.0214764 +-0.0805239 0.148418 0.0381727 +-0.087237 0.106355 0.0143591 +-0.0447805 0.0423866 -0.0153071 +-0.0837301 0.147364 0.00414541 +-0.0832136 0.0770175 0.0194025 +-0.0259181 0.0649186 0.0404266 +0.0449079 0.0931824 0.0151569 +0.0348585 0.0808647 0.0399076 +-0.000497657 0.066177 0.0565989 +-0.081976 0.138997 -0.000769762 +-0.0164973 0.088378 0.056467 +-0.0655061 0.041163 -0.00538315 +0.0250139 0.0449606 -0.012685 +-0.0684343 0.0667749 -0.00454154 +0.0313723 0.0597573 -0.0175925 +-0.073748 0.0805288 0.0380979 +-0.0431166 0.0378307 0.0441123 +-0.0704863 0.169511 -0.0510127 +-0.0418064 0.0884466 -0.0220226 +-0.0725566 0.0737794 0.034925 +-0.0432285 0.12305 0.0247373 +0.0537086 0.0670896 0.000808459 +-0.0318715 0.0510682 0.0382665 +0.00533718 0.124533 0.0332195 +-0.0234982 0.0988724 0.0447778 +-0.0873895 0.143261 0.0370491 +0.0450408 0.0625178 -0.00265494 +-0.0618764 0.138649 -0.0067701 +-0.0637266 0.174609 -0.0527846 +-0.0739864 0.158247 -0.0289285 +-0.0616651 0.174109 -0.0575903 +-0.0346424 0.0780819 -0.0225024 +-0.0310543 0.0337173 -0.0219116 +-0.0769455 0.154831 -0.00883158 +-0.0339952 0.0752026 -0.0244888 +0.0354333 0.111001 -0.000827134 +-0.0790203 0.0935614 -0.0105962 +-0.0879913 0.136375 0.00520661 +-0.0582272 0.048399 0.00675942 +-0.00714757 0.130278 0.00704353 +0.0114556 0.0340617 0.001148 +0.0458421 0.0876102 0.0101629 +0.00312017 0.129984 5.00643e-07 +-0.0376568 0.0591992 -0.0116433 +0.00923557 0.129984 0.00166977 +-0.0579608 0.139021 -0.00516612 +-0.0909934 0.148856 0.0221303 +-0.0611919 0.0341824 0.0259657 +-0.0917869 0.115969 0.00931507 +0.00445187 0.116712 -0.0177471 +0.00711096 0.111601 -0.019782 +-0.00341693 0.115827 -0.0167447 +0.0411288 0.0792971 0.0313687 +-0.0358185 0.0337288 -0.0209957 +-0.0304972 0.0703216 0.0396594 +-0.076218 0.0887607 0.0388797 +-0.0701244 0.0632147 0.00385793 +0.0432229 0.0888059 -0.00480108 +-0.0321931 0.123411 -0.0044713 +0.0221624 0.0959197 -0.0219723 +0.0234605 0.0367801 -0.00165856 +-0.0234711 0.183379 -0.010712 +-0.0461137 0.0368295 -0.0192985 +0.023814 0.119372 0.031074 +-0.0617151 0.0722545 -0.0157777 +-0.0697425 0.164473 -0.0161193 +-0.0700395 0.077854 0.0390736 +-0.0793237 0.108591 -0.00458021 +-0.0622625 0.155951 0.0127725 +-0.0579896 0.126711 -0.00710506 +-0.0819874 0.0788394 -0.00151395 +-0.051802 0.111349 -0.0178923 +-0.0548009 0.0547174 0.00969263 +0.0456361 0.0819814 0.00319705 +-0.0362696 0.0447516 0.0428152 +-0.0678285 0.156225 0.0151421 +-0.0441012 0.15765 -0.00916962 +-0.0698712 0.102299 -0.0142744 +-0.0434973 0.0719505 0.0423325 +-0.0385101 0.124563 -0.00772445 +-0.0720478 0.154003 -0.0409023 +-0.0415192 0.155101 0.00654483 +0.030443 0.0496674 -0.00974777 +0.0100263 0.0352289 0.0272451 +-0.0657931 0.0349145 0.0296068 +-0.00453349 0.0975685 -0.029357 +-0.0575464 0.0576229 0.00774375 +-0.0675655 0.156308 0.0210392 +-0.0625478 0.177823 -0.0603383 +-0.0164994 0.107189 0.0421238 +-0.0628199 0.164682 -0.0345962 +-0.0725695 0.162422 -0.0399552 +-0.0295698 0.0377598 0.0258888 +-0.0285577 0.048864 -0.0238529 +-0.051128 0.0487627 0.0151791 +0.0297172 0.11319 -0.0079908 +-0.0129858 0.0389757 -0.0119758 +-0.0519687 0.0514416 0.0131188 +0.00659366 0.0345497 0.005308 +0.0431201 0.0959054 0.0231686 +0.0426395 0.101487 0.00716583 +-0.0326038 0.039499 -0.0302708 +-0.022273 0.0879769 0.0544159 +-0.0501719 0.132485 0.029178 +-0.0104724 0.123683 0.0330383 +0.0158783 0.103153 -0.0212298 +-0.0380583 0.0406922 0.0433465 +-0.05672 0.0341106 -0.0113244 +0.00284082 0.0994342 -0.0233056 +-0.00189869 0.037664 0.017192 +0.00849573 0.122392 0.0350922 +-0.0911887 0.13375 0.0222165 +0.0145889 0.124413 0.0307966 +0.0365837 0.0686678 0.0370221 +0.00534141 0.0341316 0.016402 +-0.0652159 0.16242 -0.0585196 +-0.0708983 0.120893 -0.00865195 +-0.0790974 0.103427 0.0328545 +-0.0233223 0.0386973 -0.0137829 +-0.0870669 0.0909973 0.0256595 +-0.0237781 0.0389651 0.0367703 +-0.0314981 0.107032 0.0395669 +-0.0488684 0.125064 -0.00815774 +0.0188255 0.104686 -0.0188612 +-0.0214383 0.162534 -0.00657802 +-0.0923673 0.124202 0.041188 +-0.0116952 0.0383509 0.0145738 +-0.0933085 0.117399 0.0213072 +0.00147085 0.0388322 0.0258794 +0.041327 0.0986069 0.0251647 +-0.063339 0.160302 -0.0538579 +0.0235731 0.114695 -0.0116124 +-0.0828981 0.101969 0.02963 +-0.0616452 0.139553 0.0354433 +-0.0343725 0.0357923 0.047703 +-0.0451209 0.0377458 0.0446873 +-0.0920088 0.118668 0.00830639 +-0.0495672 0.135498 0.00241956 +-0.0603606 0.0633645 0.0289482 +-0.067238 0.175347 -0.0588701 +0.053058 0.0705565 0.0234346 +0.0380671 0.0821074 0.0357563 +-0.0797544 0.0720045 0.0191472 +-0.0844521 0.153452 0.0225801 +-0.0749035 0.113464 -0.00617122 +-0.0384926 0.0605846 0.0409778 +-0.075255 0.0832856 0.0380964 +-0.0198342 0.0855003 -0.0383524 +-0.0649244 0.113824 -0.0119395 +0.0421 0.0690665 -0.00478535 +-0.0615968 0.0595411 0.0052883 +0.0357976 0.0378059 0.0192762 +-0.0314223 0.0343059 -0.0206653 +-0.0805979 0.0786983 -0.00455339 +-0.0516467 0.0481272 0.0388737 +-0.0325014 0.0618008 0.0386259 +0.0188656 0.11384 -0.0146811 +0.0360105 0.106014 0.0293761 +-0.0489136 0.125469 0.0310273 +-0.0702125 0.173659 -0.0540385 +0.0100557 0.112263 -0.0189498 +-0.0643724 0.0341771 0.0147182 +-0.023212 0.165344 -0.00918469 +0.059734 0.0692161 0.0111359 +0.0164747 0.104398 0.044527 +-0.0870127 0.10633 0.011369 +0.030786 0.0765476 -0.0208061 +-0.0657333 0.121445 0.0506733 +-0.00450341 0.0703715 0.0573471 +-0.0525943 0.0544911 -0.00726112 +-0.0226202 0.181624 -0.0117104 +0.00179227 0.0340095 -0.0213712 +-0.0768516 0.103431 -0.00952853 +-0.0773369 0.105608 0.0341784 +-0.0364954 0.0987325 0.0427313 +-0.0532526 0.161216 -0.00188451 +-0.0658747 0.0981197 -0.0167177 +-0.00202406 0.126832 0.0305449 +0.0396296 0.0392572 0.0187428 +0.0114981 0.0658063 0.0534716 +-0.0660116 0.154522 0.0303582 +0.0322049 0.0871235 -0.0192744 +-0.0161934 0.116736 -0.0156361 +-0.00805531 0.101876 -0.0238922 +-0.0425065 0.0548487 0.0395533 +-0.0623557 0.152158 -0.0235797 +-0.0550956 0.0333795 -0.00606735 +0.0194036 0.123725 -0.00335403 +0.0149002 0.0348014 0.0340409 +-0.0174953 0.112701 0.0395679 +-0.0824727 0.0992304 -0.00559052 +-0.0428553 0.101381 -0.0214106 +-0.0291214 0.0621103 -0.0254198 +-0.0530392 0.146248 0.021397 +-0.0658806 0.040185 0.0344505 +0.0298766 0.0889056 0.0433386 +0.0206783 0.0361727 0.0176735 +-0.029331 0.0791866 0.0433726 +-0.0474654 0.135069 0.0155888 +-0.0798447 0.116298 -0.00419638 +0.0278259 0.115624 -0.00659973 +-0.0400692 0.157713 -0.010751 +-0.087695 0.0860952 0.016472 +0.0119148 0.0630446 0.0522963 +-0.0586388 0.0367329 -0.00984378 +-0.0545581 0.0628278 0.0306388 +-0.0904983 0.133768 0.0272133 +0.0424823 0.0958192 -0.00180898 +-0.085893 0.115781 0.0473131 +-0.0827739 0.0762807 0.0135216 +-0.0783317 0.109572 0.0415234 +-0.0535658 0.132546 0.0330634 +-0.0901834 0.114057 0.0406088 +0.0134074 0.0463149 -0.0249889 +0.0112253 0.0952809 -0.0268838 +0.0150227 0.080777 0.0534508 +-0.0278391 0.168266 -0.00883037 +-0.0698489 0.175309 -0.0448893 +-0.0895811 0.137877 0.0241855 +-0.0790004 0.100402 -0.00859092 +-0.062851 0.116991 0.0425454 +0.0239206 0.0352552 0.0228022 +-0.000501715 0.0634055 0.0567322 +0.046037 0.0806318 0.0171753 +-0.0766672 0.154399 0.00327135 +-0.0117177 0.129576 0.0183624 +-0.0885031 0.148521 0.0281728 +-0.0728479 0.14776 0.0416103 +-0.015205 0.175685 -0.0260892 +-0.082938 0.100617 -0.00458659 +0.0398543 0.102779 0.025179 +-0.0336965 0.120802 0.028215 +-0.0625742 0.17727 -0.0581696 +-0.00806953 0.0988363 -0.0267114 +-0.0560752 0.0602595 -0.0044615 +0.0597447 0.0594744 0.0191904 +-0.0106444 0.0481591 -0.0303544 +0.00351281 0.081445 0.056735 +-0.0672464 0.173921 -0.0582812 +0.00251634 0.0459065 0.0480561 +0.000471055 0.038278 0.000679374 +-0.0002129 0.122901 -0.0103152 +-0.0382613 0.0393263 0.043596 +0.00848754 0.0426921 0.0451471 +-0.0482154 0.137103 0.0123981 +-0.015727 0.0657542 -0.0377517 +-0.0282054 0.0676114 -0.0305119 +-0.0306807 0.0363386 -0.0186663 +-0.0476849 0.119711 0.0291692 +-0.0663764 0.12565 0.049733 +-0.0488788 0.134867 0.0224297 +-0.0877229 0.0888584 0.0234132 +-0.0756171 0.172473 -0.0369846 +-0.033348 0.0384446 -0.00813352 +-0.0442894 0.126542 0.0198398 +0.0235131 0.101506 -0.0194672 +0.0538716 0.0661448 0.0268494 +-0.073604 0.148628 -0.0255988 +-0.0671901 0.0335697 -0.00322908 +-0.0886344 0.0949473 0.0228281 +-0.0761608 0.175035 -0.0499961 +0.0306065 0.111866 -0.00856301 +-0.0317456 0.124703 -0.000629789 +-0.0904268 0.150188 0.0141369 +-0.0639022 0.10675 -0.0154602 +-0.0541798 0.157923 -0.00210942 +-0.00323215 0.0940338 -0.0336602 +-0.0164901 0.115444 0.0380258 +0.053298 0.0648217 0.0277585 +-0.0843615 0.0993477 -0.00259153 +-0.00674006 0.0712942 -0.0362643 +-0.0653258 0.140047 -0.00770568 +-0.00635478 0.123294 -0.010702 +-0.055158 0.0361639 -0.0112393 +0.00412979 0.113096 -0.0199676 +-0.064574 0.0418551 0.0316967 +0.0525746 0.0462075 0.0162071 +-0.0234833 0.0448815 0.0530288 +-0.071322 0.138326 0.0479203 +0.0425401 0.0986672 0.000167984 +0.0273648 0.102724 -0.0167839 +0.0332874 0.111381 0.0289227 +-0.0537039 0.0594504 0.0244709 +-0.0227345 0.0390118 0.0369431 +-0.00354236 0.0429091 0.0474905 +-0.0724136 0.156792 -0.00114359 +-0.00249623 0.0689511 0.056733 +-0.0482461 0.131793 0.0256765 +-0.0515081 0.0490357 0.0376444 +-0.0944953 0.125552 0.0212653 +0.00638447 0.0346255 0.0414585 +0.0141724 0.0940368 0.0505038 +-0.0688973 0.120914 -0.00896239 +-0.0520364 0.14934 0.0173988 +0.00422853 0.0810435 -0.0341743 +-0.0515685 0.0473635 -0.00788512 +-0.0237608 0.156715 -0.0053038 +-0.0356104 0.127425 0.0141251 +0.035299 0.113666 0.0170439 +0.0334236 0.0903004 0.0414245 +-0.0251823 0.172681 -0.0196186 +-0.08807 0.113074 0.0239452 +0.0189601 0.036126 0.0191857 +0.00788239 0.0363273 0.00580236 +-0.0173959 0.0348327 0.0487444 +-0.0878896 0.111968 0.039224 +-0.064655 0.115706 0.0452756 +0.0311169 0.0445787 0.030603 +0.0441778 0.076309 0.025099 +-0.0896358 0.0915718 0.0124456 +-0.065807 0.090969 -0.0181206 +-0.0709064 0.123821 -0.00862928 +0.00649864 0.0924086 0.053834 +-0.0704989 0.134077 0.0490714 +-0.0596081 0.0614162 -0.00289701 +0.0242732 0.0346695 0.0161217 +-0.0464984 0.101529 0.041912 +-0.0498635 0.101385 -0.021584 +0.00433106 0.0496013 -0.0292546 +0.0107427 0.041795 0.045086 +-0.0739382 0.132552 -0.00766265 +-0.0162071 0.174195 -0.0247085 +-0.0886736 0.132413 0.0428724 +0.0320792 0.05838 -0.0156698 +-0.0192343 0.038226 0.00590432 +-0.0445033 0.11527 0.0334071 +-0.0847891 0.15265 0.0254465 +-0.0933214 0.129622 0.0172404 +-0.0346417 0.056288 -0.0107606 +-0.072488 0.172225 -0.0500329 +0.0233375 0.0606402 -0.0253621 +0.0366723 0.106016 0.0285439 +-0.0276074 0.0356491 0.0527176 +-0.053407 0.152198 0.0189083 +-0.0742721 0.166608 -0.0409997 +-0.0457331 0.0753099 -0.0177194 +-0.00672552 0.0670096 -0.035497 +-0.00219357 0.131295 0.0117423 +-0.0261647 0.0620468 0.0393395 +-0.0553241 0.0335005 0.00825618 +-0.0228582 0.119091 -0.0120569 +0.0213076 0.110412 -0.0149847 +-0.0314817 0.0889488 0.0439042 +0.0313336 0.0477022 -0.006755 +-0.0386183 0.174771 -0.00621679 +0.040988 0.0392554 0.0153655 +0.0608733 0.0623548 0.014161 +-0.00841473 0.0366574 -0.0164161 +-0.0191613 0.038383 0.000326194 +-0.00880856 0.0882704 -0.0368626 +-0.0596465 0.149865 -0.00094307 +0.00994371 0.0978413 -0.0235989 +0.0455086 0.055594 0.0323303 +-0.0860233 0.102167 0.0034068 +-0.0281256 0.165243 -0.0164075 +0.00425042 0.072607 -0.0344972 +0.0235113 0.118015 0.0324132 +-0.000261091 0.0350803 0.00896105 +-0.0532978 0.147774 0.0234078 +-0.0554295 0.0433 -0.00807812 +-0.0771312 0.155572 -0.0108986 +-0.0841536 0.0790628 0.0035277 +-0.0900384 0.135039 0.0102136 +-0.0727986 0.0849862 -0.0158247 +0.0336101 0.0962478 -0.0138935 +-0.0284441 0.0732827 -0.0345293 +0.00969167 0.0357093 0.0447693 +-0.0267255 0.0380235 0.0244373 +-0.0572883 0.132547 0.0364836 +-0.0528311 0.0941603 -0.0218064 +0.0400501 0.0644468 0.0314841 +-0.036531 0.116238 -0.0149852 +-0.00649604 0.0912014 0.0567618 +0.0144842 0.101799 0.0469727 +0.00323629 0.131729 0.0108817 +-0.0308992 0.0734931 -0.0305082 +0.0172066 0.068625 0.0512164 +-0.0657497 0.0765846 -0.017077 +-0.0737602 0.111876 0.0478461 +-0.0694356 0.066827 -0.00357005 +-0.0585001 0.119809 0.0399342 +0.0441644 0.0931187 0.000177172 +-0.0843417 0.0952366 0.029868 +-0.054753 0.0782755 -0.0197234 +-0.00738705 0.0379427 -0.0155249 +-0.0910658 0.143334 0.0151805 +-0.00249685 0.08015 0.0577289 +0.0340507 0.0835544 0.0405264 +-0.0523382 0.161184 -0.00281855 +-0.0812419 0.109765 0.0353982 +-0.0582589 0.129739 0.0385905 +0.0543559 0.049285 0.0042337 +0.015086 0.0406501 0.0443863 +-0.0280294 0.0835807 0.0475884 +-0.0393811 0.128131 0.00244283 +0.0208178 0.0415166 -0.0167046 +-0.0881465 0.111869 0.0203319 +0.0179003 0.0347727 0.0238228 +-0.0656433 0.0657616 -0.0058195 +-0.0840769 0.0911454 0.0297191 +0.00624923 0.0796338 -0.0339546 +0.0328487 0.0876389 0.0423414 +0.0276661 0.034679 0.0131567 +-0.00286572 0.104506 -0.0226523 +-0.0862889 0.10771 0.0183439 +0.0408829 0.0937805 -0.00720194 +0.000164408 0.0895345 -0.0346177 +-0.0843436 0.144613 0.00514953 +-0.0675701 0.180805 -0.0555973 +0.0220024 0.0727679 0.0493999 +-0.0156461 0.186781 -0.0233704 +-0.0187078 0.0364661 -0.0182818 +-0.0254003 0.0649585 0.0413183 +0.0122459 0.0780339 -0.0313519 +-0.0555013 0.0547806 0.00866941 +-0.0521449 0.157571 -0.00396744 +-0.073564 0.156227 0.0174776 +-0.00865052 0.104822 -0.0230347 +-0.0529425 0.0516633 -0.00638853 +-0.0652396 0.0384193 0.0154218 +0.0233172 0.0809188 0.0496338 +-0.0494012 0.054529 0.0344155 +0.0222475 0.0847573 -0.0259093 +0.0413844 0.0438265 0.0277643 +-0.0818597 0.146076 0.0399402 +0.0111047 0.0345035 -0.00868495 +-0.006336 0.10011 -0.0240468 +0.0245413 0.0819542 -0.0249712 +-0.00496439 0.130958 0.0121612 +-0.00978935 0.0841125 -0.0382567 +0.00551162 0.104351 0.0429177 +-0.0384918 0.0874952 0.0437107 +0.00946556 0.123094 -0.0106511 +-0.0897739 0.137922 0.033196 +-0.0653284 0.0349129 0.0366619 +0.00350126 0.104382 0.0428343 +-0.0368171 0.04253 -0.0279956 +-0.0634962 0.0775171 0.0416907 +-0.0558399 0.0666 0.0358943 +-0.033501 0.113967 -0.0166209 +-0.0105678 0.0384807 0.0255376 +-0.0875349 0.110472 0.0163392 +-0.0221423 0.0430524 0.0536615 +-0.0485662 0.0337988 0.0271958 +-0.0681764 0.0335792 0.00196619 +-0.00165753 0.05399 -0.0314052 +0.0457818 0.0746903 0.0202853 +-0.0845781 0.148672 0.0341151 +0.0452897 0.0861791 0.0201631 +0.00831626 0.0356874 -0.00657792 +-0.0196215 0.042233 -0.0284571 +-0.0649431 0.145366 0.0395451 +-0.0704953 0.104114 0.0382884 +-0.0414996 0.117985 0.0314618 +-0.0712521 0.17555 -0.0439596 +0.0452514 0.0931962 0.00916141 +0.00133085 0.058325 -0.0325937 +-0.0620033 0.158406 -0.0355965 +0.030344 0.1101 0.0335023 +0.0463602 0.0692197 0.00260588 +0.0444762 0.0945372 0.00319063 +-0.0491293 0.0430398 0.0442413 +-0.0789669 0.172206 -0.0419919 +0.0106503 0.130383 0.00504386 +-0.0484141 0.113756 -0.016334 +0.00450584 0.0547654 0.053433 +0.0441531 0.0720542 0.000197496 +-0.0134923 0.120989 0.0351213 +-0.0907438 0.135107 0.0202099 +-0.0590287 0.0481317 0.00366474 +0.0364319 0.108205 -0.00282023 +0.0178615 0.122874 -0.00643626 +-0.0356427 0.112876 -0.017464 +-0.0668607 0.154942 0.00387089 +-0.0486527 0.162759 0.00599863 +-0.00949915 0.105857 0.0435217 +-0.0615042 0.121243 0.0426924 +-0.0784762 0.0731416 -0.000473316 +-0.0740322 0.156054 0.0216877 +-0.0847959 0.101901 0.0272869 +-0.0596957 0.14074 -0.00502874 +-0.050497 0.0987878 0.0435099 +-0.071801 0.0745407 0.0361884 +-0.0549619 0.14242 0.0292765 +-0.0427321 0.0739589 -0.0183224 +-0.0508117 0.0354248 -0.0125858 +-0.0642011 0.0410429 0.0143098 +-0.0132685 0.101107 0.0437078 +-0.0475187 0.0790945 0.0436556 +0.0209941 0.0373175 -0.00464913 +-0.0204991 0.100239 0.044421 +-0.0684679 0.110537 0.0393979 +0.0243777 0.124503 0.0143821 +-0.0830368 0.0762381 0.00350806 +-0.073622 0.0747015 -0.00970199 +-0.0461368 0.13275 0.0116924 +0.0104091 0.0389479 -0.0231008 +0.0155004 0.116786 0.0363781 +0.0387891 0.096727 0.0316453 +0.0196906 0.074125 0.0513576 +-0.0225582 0.0383546 -0.00218286 +0.0487458 0.0724992 0.00846572 +-0.0668418 0.138273 0.0438208 +-0.0309771 0.0339917 0.0163773 +0.0411176 0.0661976 -0.00575682 +-0.0229076 0.0852723 0.0551257 +0.000828067 0.123861 -0.00936286 +-0.0250326 0.0621165 0.0410328 +-0.0651714 0.128382 0.0462127 +-0.0434333 0.15941 0.00551467 +-0.0264854 0.0348879 0.0467436 +-0.0628107 0.150584 -0.0245802 +-0.0123081 0.181626 -0.0249909 +-0.00919366 0.172678 -0.0237455 +0.0126063 0.0576596 0.0514859 +-0.0332159 0.0709306 -0.0214641 +0.0240158 0.0658883 0.0452055 +-0.0660765 0.124251 0.0501642 +-0.0588552 0.0351368 -0.0102919 +0.0124134 0.0346609 0.020994 +0.0122384 0.0644368 0.0527864 +0.0452304 0.0763569 0.00121116 +0.0242611 0.0448626 -0.0136813 +-0.0304238 0.12007 0.0279522 +0.0145126 0.0347575 0.026768 +-0.0217663 0.065545 -0.0358558 +0.00816067 0.125635 -0.0073679 +0.0183075 0.0679765 -0.028974 +-0.0180555 0.0909221 -0.0366017 +0.00824317 0.0602927 0.0539848 +-0.0687967 0.0894213 -0.0168337 +-0.0450098 0.146255 0.00342574 +-0.0335022 0.0661629 0.0402747 +-0.0781465 0.155117 0.0246877 +0.00450914 0.0758818 0.0564153 +-0.0135396 0.0366033 -0.0173816 +0.045728 0.077798 0.00320493 +-0.0913745 0.142001 0.0211607 +-0.0284862 0.102933 0.0423265 +-0.0302445 0.16108 -0.00171322 +0.0327554 0.116907 0.00609585 +0.0201031 0.0379621 0.0410367 +-0.090178 0.113449 0.0375353 +0.0422255 0.0887323 -0.00780894 +-0.0632995 0.045657 0.000708444 +-0.0344955 0.0889014 0.0434521 +-0.0735138 0.0874308 0.0404487 +-0.081144 0.11 0.0405445 +-0.046701 0.144949 0.00345496 +0.0239825 0.114006 0.0348506 +0.00951792 0.0799496 0.0550675 +-0.0589753 0.0343808 0.0315144 +-0.0715764 0.0724969 0.0344898 +-0.0763465 0.151411 -0.00788806 +0.0476241 0.0444058 0.00228058 +-0.0865319 0.0910336 0.0265354 +-0.0761893 0.0686573 0.0192806 +-0.0738377 0.169377 -0.0450494 +-0.013497 0.089796 0.0568243 +-0.003677 0.129286 0.0256231 +0.00334505 0.0372684 -0.00154693 +0.0285394 0.0735396 -0.0227021 +-0.067513 0.132633 0.0463034 +0.0459145 0.0862168 0.00717824 +-0.0631406 0.152896 -0.00931447 +-0.0777879 0.113218 0.0476364 +-0.023707 0.0340979 -0.0208155 +-0.0144671 0.110884 -0.0194361 +0.0102739 0.0667155 -0.0310192 +-0.00350236 0.0842813 0.0574606 +-0.0664798 0.0832826 0.043443 +-0.0635622 0.0403137 0.0257086 +-0.0426942 0.0666296 -0.0154091 +-0.017221 0.187225 -0.0211553 +-0.0336762 0.062222 -0.0135529 +-0.0673972 0.0641749 0.025006 +-0.0740248 0.149858 -0.0328754 +-0.0467235 0.128128 0.0253508 +-0.0262045 0.163884 -0.00647025 +-0.0271883 0.118982 0.0306038 +0.033772 0.0543003 -0.00971113 +-0.0758953 0.12228 -0.00740649 +0.00448236 0.11415 0.0407558 +-0.0698932 0.103728 -0.0136756 +-0.0567617 0.0782351 -0.019665 +0.0543638 0.0534389 0.000229046 +-0.081811 0.11456 0.047449 +-0.0565132 0.053486 0.0056729 +-0.057003 0.128342 0.0386502 +-0.0664962 0.0370022 0.0293944 +-0.0624918 0.101519 0.0421076 +-0.0687869 0.155336 0.00316719 +-0.0685122 0.141137 0.0449382 +-0.0527211 0.0709092 -0.0154358 +-0.00549985 0.0703921 0.057296 +-0.0709113 0.107952 -0.0112859 +0.00912605 0.108716 -0.0196568 +0.0361188 0.0794771 0.0382118 +-0.0588731 0.101172 -0.0189069 +-0.068257 0.129831 0.0487832 +0.0374605 0.0754022 0.0365814 +-0.032324 0.161031 -0.00122654 +0.0285746 0.0351013 0.0166057 +0.0394117 0.0870933 -0.0127933 +0.0113423 0.0644371 0.0532354 +-0.0583019 0.0447396 0.0435847 +-0.00749863 0.0773617 0.0576592 +-0.050194 0.116459 -0.0151638 +-0.0481437 0.0545922 0.0360102 +-0.0104704 0.100279 -0.0242341 +-0.0347529 0.111555 -0.0180951 +-0.0155011 0.120965 0.0341268 +-0.0784442 0.154274 0.027518 +0.0120599 0.0739551 0.0543847 +-0.0633352 0.0436031 0.0119653 +0.0217763 0.115313 0.0351727 +-0.0415089 0.165252 0.00421093 +0.0335736 0.0700381 0.039723 +0.00251112 0.0647983 0.0566425 +-0.0654261 0.0391693 0.0381077 +-0.0695564 0.114278 0.0502908 +-0.00162211 0.0369274 0.0160989 +-0.058966 0.123797 -0.00809452 +-0.0942641 0.126921 0.0212556 +-0.0335104 0.175675 -0.00315318 +-0.0368415 0.0943464 -0.0233446 +0.0133357 0.128238 -0.000223601 +0.00322397 0.0768846 -0.0351052 +0.00583724 0.038604 -0.0097514 +0.0244991 0.0390622 0.0333159 +0.039204 0.0699354 0.0337973 +-0.00749309 0.122405 0.0352331 +-0.0204932 0.0624346 0.0477982 +-0.0366651 0.0353042 0.023032 +0.0167127 0.0887461 0.050636 +-0.0697357 0.167099 -0.0218834 +0.0364696 0.0632797 0.0368445 +-0.0745038 0.141441 0.0470955 +-0.0621205 0.0458041 0.0366793 +-0.0544906 0.0820201 0.0451936 +-0.0645123 0.172574 -0.0485643 +-0.0421309 0.128083 -3.62159e-05 +0.0281636 0.121218 0.0186511 +-0.0121987 0.171236 -0.0257581 +-0.0281113 0.0605968 -0.0274147 +-0.0631879 0.0449558 -0.00115255 +-0.056884 0.0955743 -0.0213395 +-0.0516987 0.131736 -0.00321408 +0.00826283 0.110977 0.0402103 +-0.0738401 0.154086 -0.0269016 +0.00525204 0.071179 -0.0340737 +-0.0710521 0.173649 -0.0530415 +-0.0508226 0.162642 -0.00385759 +-0.0802179 0.141741 -0.00280512 +-0.0104908 0.12238 0.0346088 +-0.082839 0.145958 0.00218243 +-0.0764995 0.134472 0.0515165 +0.0572674 0.0552579 0.0228777 +-0.0459192 0.038241 -0.0182827 +0.0212995 0.0664627 -0.0275106 +-0.00266999 0.131274 0.0130017 +-0.0615996 0.159996 -0.0335919 +-0.0172476 0.12413 0.0281151 +0.0257469 0.104744 0.0391433 +0.033213 0.112692 0.0276861 +0.0156033 0.0352036 -0.0174539 +-0.030256 0.0608147 -0.0214135 +-0.0554996 0.0746996 0.0418498 +0.0250243 0.0618819 0.0448807 +0.0333333 0.0528011 -0.00875184 +0.0462789 0.0820452 0.011174 +0.0413782 0.0519867 -0.00685663 +-0.0228771 0.11806 -0.0129657 +-0.0608849 0.0381036 0.0449409 +-0.0255027 0.103002 0.0430099 +-0.0102615 0.128766 0.00159795 +-0.0140304 0.0389318 -0.0121434 +0.0242826 0.0691154 -0.0252241 +-0.0262141 0.0383199 -0.0177378 +0.000134491 0.116503 -0.0174981 +-0.0556551 0.0575 -0.00342108 +-0.0641179 0.115013 -0.0114251 +-0.0523454 0.059725 0.0287459 +-0.039493 0.0888698 0.0432118 +-0.0635876 0.0600882 0.0187607 +-0.0527647 0.138519 0.0263974 +-0.0421778 0.150669 0.00550662 +-0.0898169 0.147438 0.0111767 +-0.0440117 0.149183 0.00634807 +-0.0124981 0.0842783 0.057419 +-0.041501 0.0888244 0.0425932 +0.0390954 0.0814754 -0.0127535 +-0.00978632 0.0812687 -0.0379822 +-0.0143122 0.127128 -0.000614565 +0.043146 0.0650339 -0.00117659 +0.0508787 0.0465582 0.0223162 +-0.0187679 0.0341854 -0.027695 +0.0104088 0.0403968 -0.0232872 +-0.0615714 0.111062 0.0370307 +-0.0574772 0.0344195 0.038759 +-0.029988 0.0381577 0.0326274 +-0.0293835 0.0775974 -0.0345936 +-0.0174998 0.115454 0.0379182 +-0.0492034 0.0336154 -0.00143623 +-0.0160718 0.124871 -0.00420428 +0.0153397 0.120197 -0.0115352 +-0.0588103 0.157344 0.00530008 +-0.0448304 0.0956436 -0.0219722 +0.0199962 0.120682 0.0326204 +0.050389 0.0482108 0.0251806 +0.0208954 0.116644 -0.0117151 +-0.079388 0.147286 -0.00182539 +-0.0747645 0.0849032 -0.0147477 +-0.0505016 0.107064 0.0390734 +-0.0174992 0.03427 -0.0197565 +-0.01005 0.166619 -0.017705 +-0.0581312 0.0342101 0.0265873 +-0.0613803 0.17096 -0.0575947 +-0.0304965 0.0917653 0.0441169 +-0.0458806 0.10564 -0.0201801 +0.0202101 0.0833915 -0.0271395 +0.0323169 0.0376319 0.0223694 +-0.0223063 0.0380908 0.0216787 +0.035616 0.10962 -0.00284805 +0.0484836 0.0582148 0.031165 +-0.0809138 0.125107 -0.00520991 +-0.00566591 0.0540919 -0.0326394 +-0.00149662 0.114206 0.0415504 +-0.0263202 0.0930635 -0.029586 +-0.0680426 0.110046 0.0381289 +0.0249883 0.12025 -0.003603 +-0.0736149 0.155479 0.0262237 +-0.0299566 0.122268 0.0236125 +0.0238471 0.107154 -0.0155051 +-0.0566015 0.0451895 0.0246815 +-0.028491 0.0987621 0.0434122 +-0.0338535 0.0870951 -0.024854 +-0.0478322 0.0956344 -0.0220665 +-0.0226614 0.177177 -0.0135831 +-0.0810787 0.154935 0.0192662 +0.0439336 0.0428821 0.0236685 +-0.0114115 0.128814 0.0228458 +-0.0417827 0.0840916 -0.0212196 +0.0249862 0.118037 0.0310154 +-0.0641215 0.0336259 -0.00810847 +-0.0795112 0.081834 0.0339273 +-0.041505 0.119362 0.0299569 +-0.0033398 0.119986 -0.0131833 +0.0411805 0.0745986 -0.0077775 +-0.0446675 0.0636475 -0.0137193 +0.00937092 0.0937948 -0.0292997 +0.0415042 0.104246 0.00816492 +-0.0792333 0.169423 -0.0379787 +-0.0414888 0.0437926 0.0421195 +-0.00148881 0.0760516 0.0586512 +-0.0126769 0.0541386 -0.0335166 +-0.00577674 0.0385885 0.0246132 +-0.0394947 0.0676998 0.0417669 +0.0147262 0.129115 0.00511474 +-0.0045144 0.0774415 0.0584948 +0.0334512 0.0365216 0.00521608 +-0.0662857 0.0625946 -0.00141881 +-0.0659868 0.0418098 -0.00430732 +-0.0485691 0.0460686 -0.00963735 +0.0269239 0.0493817 -0.018692 +-0.0652895 0.175332 -0.0607504 +0.0558431 0.0722822 0.0186151 +0.0389971 0.039341 0.0203664 +-0.0252734 0.05785 0.0399799 +-0.0537245 0.0723552 -0.016258 +-0.0214963 0.104399 0.0429755 +-0.0649507 0.13395 0.041174 +-0.0641915 0.179229 -0.0572988 +-0.00649249 0.110023 0.0430195 +-0.0925801 0.120153 0.0312943 +0.0364682 0.111067 0.00216795 +-0.0487462 0.118344 0.031163 +0.0272987 0.047751 0.0374572 +-0.0235246 0.079724 0.0545007 +0.044563 0.0819287 0.0241608 +0.018083 0.0887399 0.0491141 +0.0180337 0.115273 -0.0142355 +-0.0838753 0.135332 0.0479212 +-0.0707318 0.154624 0.0301689 +-0.0897339 0.0916034 0.0174376 +-0.0487526 0.0782553 -0.019094 +-0.021696 0.0567795 -0.0319795 +-0.0524624 0.139899 0.000243693 +-0.016317 0.0384896 0.0261516 +-0.0172081 0.172701 -0.0233314 +-0.0664965 0.109745 0.0377695 +-0.0117557 0.0345134 -0.025836 +-0.000654571 0.0391799 -0.00969942 +0.00820345 0.083757 -0.0326005 +-0.0458982 0.107069 -0.0194756 +-0.0567459 0.15948 0.00480369 +0.00650779 0.0575337 0.0533257 +0.037787 0.0377202 0.0142753 +0.00846774 0.13132 0.015646 +-0.0475009 0.0425468 0.0439593 +-0.0766415 0.100814 0.0361238 +-0.028614 0.0408765 -0.0296027 +0.00929873 0.115842 -0.01682 +-0.0828745 0.119161 -0.00328383 +-0.0769895 0.0790529 0.034321 +-0.0878006 0.151251 0.0245374 +0.0208653 0.122279 0.030221 +-0.00768551 0.130297 0.0183702 +-0.0545511 0.0430136 -0.00860983 +0.030217 0.0843227 -0.0201565 +-0.0467665 0.152145 0.00944802 +-0.0631219 0.156103 0.0153645 +-0.0681832 0.155264 -0.0517309 +0.0142805 0.0345676 -0.0138073 +-0.0664934 0.0624679 -0.000297249 +-0.0641994 0.16384 -0.059407 +0.0464327 0.0769932 0.014129 +-0.041507 0.0591281 0.0403212 +0.0223695 0.0993436 -0.0211483 +-0.088603 0.087513 0.0164636 +0.00038562 0.0392239 -0.00953586 +0.0270604 0.0795391 0.0462139 +-0.0684865 0.0611195 0.0150424 +0.0105195 0.053345 0.0519069 +-0.0620106 0.15528 -0.0315878 +-0.00991465 0.0385501 0.00204441 +-0.0151984 0.171233 -0.0237028 +-0.026193 0.171192 -0.0190186 +0.0404914 0.0541681 0.032094 +-0.0115119 0.181449 -0.0261319 +-0.027122 0.166756 -0.0173778 +0.0338583 0.105892 -0.0101458 +-0.0671444 0.0628365 -0.000338348 +-0.0788571 0.120751 -0.0060883 +-0.0525645 0.0417313 -0.0101531 +0.0278652 0.0996344 -0.0174729 +-0.0681363 0.122845 0.0524474 +-0.0228108 0.0770465 -0.0385748 +-0.0135961 0.12464 -0.00600832 +-0.00365126 0.0525899 -0.0316543 +-0.068996 0.139931 -0.00789046 +-0.0310262 0.153728 -0.00354608 +-0.0497211 0.131062 0.0298847 +-0.00109314 0.103948 0.0441727 +-0.0204702 0.16083 -0.0136222 +-0.0865394 0.109089 0.0183378 +0.0400949 0.095337 0.0300286 +-0.0693797 0.128452 0.0506772 +-0.0438868 0.107083 -0.0199439 +-0.0470477 0.150201 -0.00445632 +-0.0370064 0.121579 0.0285082 +0.0198288 0.120602 -0.00797301 +-0.0549804 0.0334872 0.0101333 +0.00782186 0.127915 -0.00384433 +-0.0495314 0.12548 0.031876 +-0.0926082 0.117405 0.0243082 +-0.0215209 0.0382567 0.0252967 +0.00181128 0.125691 -0.00735123 +-0.0771897 0.117737 0.0516815 +-0.0554751 0.0519418 -0.00338574 +-0.0771699 0.154422 0.00455736 +-0.00649896 0.092559 0.0563419 +-0.0704303 0.164039 -0.0149268 +-0.036643 0.118048 -0.0128637 +-0.0535056 0.136701 0.0296589 +-0.0594928 0.0761776 0.0424443 +-0.00649656 0.0856337 0.0569558 +-0.0586618 0.0637687 0.0307411 +-0.0650964 0.155112 0.00596226 +-0.0626129 0.0371673 0.0184653 +0.0330114 0.107386 0.0320976 +0.0333812 0.0490928 -0.00645546 +-0.069711 0.1744 -0.043385 +-0.00744712 0.0961017 -0.0318028 +0.0413373 0.0392631 0.0117259 +-0.0487556 0.137056 0.00741027 +-0.0845701 0.112449 0.0449336 +0.0531449 0.0608429 -0.00288049 +-0.0358592 0.10284 -0.0213952 +-0.0778493 0.11932 -0.00645768 +0.0172333 0.0750251 -0.0287502 +-0.0195083 0.11546 0.0373373 +-0.0542618 0.0348321 -0.0120282 +-0.0344386 0.125663 -0.00162003 +-0.0690003 0.160066 -0.00858817 +0.0285895 0.0979793 -0.017709 +0.015268 0.0341755 -6.02454e-05 +-0.012432 0.12921 0.00653602 +-0.0222335 0.171216 -0.0204735 +-0.0656059 0.0615317 0.0026003 +-0.0324965 0.174231 -0.00238999 +-0.0398336 0.0384391 -0.0280596 +-0.0513902 0.122634 0.0344378 +-0.0735123 0.142806 0.0460464 +-0.0703661 0.16678 -0.0206717 +0.0128439 0.0343776 -0.0158182 +-0.074941 0.152735 -0.0189 +-0.0785348 0.0771858 -0.00655705 +0.0347176 0.114447 0.00679736 +-0.0192836 0.0385916 0.0308544 +-0.00226925 0.130756 0.00454173 +-0.0622845 0.161545 -0.0405978 +-0.0687671 0.0900946 0.0427048 +-0.028252 0.050761 -0.0234049 +-0.0818245 0.107456 0.0283887 +0.0216927 0.103078 -0.0191449 +-0.0539655 0.0364915 -0.0115887 +-0.0577688 0.142406 -0.00278963 +0.0347443 0.08354 0.0397721 +0.041088 0.0912985 0.0296287 +0.0209984 0.0578395 0.0478214 +-0.0607897 0.155834 0.0118473 +-0.0427999 0.167662 -0.00952768 +-0.0135045 0.0870342 0.0571061 +0.0551275 0.0637038 0.000299703 +-0.0500088 0.124901 -0.00796654 +0.040891 0.0917758 -0.00909975 +-0.057302 0.152908 0.030569 +-0.0490908 0.140152 0.0103957 +-0.062514 0.0399436 -0.00751704 +-0.0901142 0.14065 0.0241685 +-0.0614977 0.0847334 0.0442553 +0.00401707 0.125848 -0.00755459 +-0.0295217 0.0402041 -0.0298306 +-0.0770884 0.0866038 -0.0125752 +0.00250242 0.0441898 0.0459568 +-0.0884166 0.13498 0.0042424 +-0.0144984 0.11138 0.0412273 +-0.0543527 0.155034 0.0127444 +-0.0485461 0.135607 0.0194861 +-0.0763654 0.155962 0.0179624 +0.0194741 0.0351845 0.0201392 +0.0604235 0.0678625 0.0131519 +-0.0147437 0.0383723 0.00849375 +0.0123077 0.035562 0.0436453 +-0.0878555 0.0861109 0.00948006 +0.0461918 0.0820393 0.0121748 +-0.0376617 0.0344352 0.0359896 +-0.0640313 0.13251 0.040793 +0.00650251 0.122426 0.0350167 +0.046473 0.0747304 0.00699979 +-0.090578 0.13228 0.00723516 +-0.0665138 0.0986787 0.0417758 +-0.0753611 0.0724331 0.0302407 +-0.0737585 0.160179 -0.00884095 +-0.0875779 0.102333 0.0213648 +-0.0213902 0.0905176 -0.0361974 +-0.0663379 0.132604 0.0444522 +0.0420458 0.0817019 -0.00677657 +-0.0739471 0.131099 -0.00783391 +-0.00249367 0.0925505 0.0559214 +-0.0748382 0.149925 -0.0278668 +-0.0734967 0.126028 0.0530224 +-0.0386362 0.117281 -0.0140679 +0.00347668 0.0964809 0.0526894 +0.0453833 0.074968 0.00220665 +0.012072 0.11405 -0.0168987 +-0.0774663 0.168085 -0.0299733 +-0.0534988 0.0761753 0.0426023 +-0.0233682 0.126286 0.00541909 +-0.00704598 0.0392708 0.0363567 +-0.0791658 0.0990564 -0.00863296 +-0.0464518 0.0945568 0.0436355 +-0.0404194 0.128239 0.00205017 +0.0393898 0.107905 0.00701069 +-0.0398611 0.0338561 -0.0163385 +-0.0665222 0.156255 0.0214077 +-0.0672076 0.171872 -0.0410051 +-0.0708261 0.144835 -0.0182015 +-0.0650483 0.0701635 0.0361166 +-0.00764186 0.11082 -0.0214014 +-0.0836837 0.151385 0.0303528 +-0.0496912 0.162854 0.00564102 +-0.0114821 0.125053 0.0306553 +-0.0713615 0.158186 -0.0419305 +-0.0348112 0.0336186 -0.0263013 +-0.0652015 0.0334423 0.00269659 +-0.00682217 0.0390777 -0.0108403 +-0.0745121 0.155307 0.0054919 +0.00849016 0.0441134 0.0451901 +-0.041821 0.0914074 -0.0230213 +0.0243874 0.048835 -0.0205112 +-0.0578612 0.158406 0.00308521 +-0.0781467 0.116431 0.0503206 +0.0429791 0.071952 -0.00379352 +-0.00196689 0.131088 0.00752604 +-0.0728984 0.156837 -0.0329194 +0.00543206 0.119469 -0.0147017 +-0.00442631 0.0386612 0.00487339 +-0.089531 0.0983552 0.0174009 +0.00679264 0.0379024 -0.00704418 +-0.0255688 0.0356598 0.0531386 +-0.0343151 0.0794495 -0.0245241 +-0.0124944 0.0870249 0.0570339 +-0.0710693 0.155098 0.0285743 +-0.0663511 0.0350877 0.0310837 +0.00349789 0.122445 0.0347995 +-0.0414975 0.045132 0.0414403 +0.0348194 0.0365264 0.00732462 +-0.0740113 0.141343 -0.00688783 +-0.0303332 0.0706347 -0.0294852 +0.0503042 0.0691243 0.0253774 +-0.0701319 0.158154 -0.0479233 +-0.0358242 0.0915039 -0.0239402 +-0.0645394 0.0596403 0.015406 +0.0213135 0.0650138 -0.0271409 +0.0262112 0.0873747 -0.0229809 +-0.052671 0.112615 -0.017101 +-0.0592898 0.045994 0.0417021 +-0.0717164 0.163822 -0.0439567 +0.0178664 0.127935 0.017674 +-0.0655034 0.108381 0.0382088 +0.0278762 0.0942373 0.043974 +-0.0457869 0.0855328 -0.0217062 +-0.0643109 0.169365 -0.0428818 +0.0100266 0.0346111 0.0241784 +-0.00361434 0.0341476 -0.0187856 +-0.0389438 0.047744 -0.0146455 +-0.0676963 0.0648397 0.0261272 +-0.0374998 0.0691046 0.0417769 +-0.0568378 0.0613597 0.0260949 +-0.0369296 0.036554 0.0451414 +-0.0284901 0.0688983 0.0393825 +-0.0534824 0.0340932 0.0259063 +-0.0631168 0.15992 -0.0455978 +-0.0444353 0.0335419 -0.0188134 +-0.0168224 0.0960286 0.0515795 +-0.076233 0.145832 -0.00587217 +-0.0231748 0.0709692 0.0487695 +-0.0104382 0.0354056 -0.0175403 +-0.0897878 0.136555 0.0351995 +-0.0717761 0.0344583 0.000444464 +0.0353682 0.103387 0.0319873 +-0.00977607 0.0770524 -0.0379416 +0.00551406 0.0375423 0.0260562 +-0.00350144 0.0675505 0.0564719 +-0.0564947 0.102955 0.042036 +-0.061361 0.0336079 0.00692461 +0.00850062 0.121038 0.0360118 +0.0202826 0.0693621 -0.0284085 +-0.00908512 0.169637 -0.0217386 +0.0255848 0.123614 0.0162626 +0.0234098 0.0871372 -0.0242525 +0.0269727 0.112042 -0.0107557 +0.0262833 0.0935743 -0.0210485 +-0.059 0.0412164 0.021703 +0.0345357 0.0373492 0.0194302 +0.0530102 0.0462982 0.0132036 +-0.00365111 0.0511553 -0.0312289 +-0.0591025 0.0338635 0.0178635 +-0.0144888 0.0673806 0.0542261 +-0.0416194 0.0336308 -0.0257822 +-0.0186097 0.0407857 -0.0282477 +-0.0298888 0.0474725 0.0462905 +-0.00306646 0.0386027 0.0233477 +0.0330707 0.110451 -0.00703014 +0.0146846 0.037467 0.0442233 +-0.0390505 0.154795 -0.00905663 +-0.0306702 0.0891071 -0.0265975 +-0.090498 0.131069 0.0362301 +-0.0189866 0.10628 -0.022556 +-0.0125142 0.181139 -0.0289621 +-0.0236648 0.0522261 -0.0284113 +-0.0564969 0.100177 0.0431307 +-0.0314961 0.10429 0.0412052 +-0.0509168 0.0335668 6.7085e-05 +-0.0773495 0.081875 0.035997 +-0.0834254 0.141805 0.00220396 +0.00104126 0.108173 -0.0205653 +0.0181741 0.0988563 -0.0226017 +-0.0797776 0.115912 0.0485816 +-0.0816869 0.0734846 0.011537 +0.00150486 0.0856703 0.0573817 +-0.00849476 0.0745791 0.0575173 +-0.00549893 0.0939194 0.0556385 +0.0221626 0.0490425 0.0405889 +0.0363661 0.0873006 -0.0164353 +0.0491174 0.0712134 0.0219878 +-0.079214 0.155524 0.0184351 +-0.0654627 0.0598015 0.0150426 +0.0330982 0.0626311 -0.0167961 +-0.0839336 0.126519 -0.00402298 +-0.00950667 0.125161 0.0310898 +0.0292092 0.0563773 0.0403225 +-0.0273861 0.0720614 0.0416635 +-0.0647467 0.0379255 0.0402853 +-0.0521847 0.140082 0.0224024 +-0.0276164 0.0422898 -0.0293674 +0.0360108 0.100867 -0.0107814 +-0.0946899 0.124172 0.0202666 +0.0446233 0.0903218 -0.000806954 +-0.00230838 0.0348204 0.04129 +0.00391726 0.126651 -0.0064175 +-0.0633881 0.0336212 0.00649796 +0.00838362 0.046349 -0.0258656 +-0.0577252 0.156918 0.00853143 +-0.0693669 0.17099 -0.0332104 +0.0249955 0.0347512 0.0143719 +0.00961895 0.12141 -0.0128393 +0.021665 0.0416371 -0.0126942 +-0.0521438 0.0568294 0.0272279 +-0.0628733 0.0996403 -0.0179913 +0.0218834 0.0415901 -0.0107198 +-0.0546838 0.0435714 0.0206922 +-0.0176301 0.183064 -0.0184359 +-0.00750517 0.0471136 0.0478292 +-0.0520933 0.154615 -0.00405641 +-0.0865732 0.0860822 0.023453 +-0.0665787 0.163768 -0.0579853 +0.00636801 0.0479975 -0.0276935 +0.0368613 0.0587703 -0.00975684 +-0.0879266 0.10368 0.0183585 +-0.016623 0.0450359 -0.0278307 +-0.0895401 0.135156 0.0272131 +0.000356348 0.0496808 -0.0306188 +-0.0836962 0.138005 0.0462469 +0.0441945 0.077668 0.0251701 +-0.0685147 0.0930476 0.0422841 +-0.0232574 0.100051 -0.0240138 +-0.03748 0.0548048 0.0392179 +-0.0293599 0.15815 -0.0119938 +-0.021522 0.0336815 -0.0237529 +0.00128503 0.0655494 -0.0343406 +-0.0861178 0.0953813 0.000442214 +0.0350885 0.099465 0.0350983 +-0.0779853 0.13835 -0.00526914 +-0.0857179 0.124363 0.0486993 +-0.0309707 0.163858 -0.00458082 +-0.0722468 0.174258 -0.0400013 +-0.0149026 0.105901 -0.0222117 +-0.0673665 0.165482 -0.0209987 +-0.0876017 0.152029 0.0126504 +-0.0220763 0.0666765 0.0478151 +-0.0624814 0.094591 0.0443423 +-0.0196147 0.0379102 -0.0280301 +-0.0346582 0.0422066 0.0469558 +-0.0199036 0.0739897 0.0538964 +-0.00877818 0.0387104 -0.00343461 +0.000535895 0.0548656 0.0545076 +-0.0454881 0.10014 0.0423159 +-0.0404927 0.0958661 0.0421915 +-5.87354e-05 0.100974 -0.0229378 +-0.0283024 0.0362399 -0.0299084 +0.026308 0.0822369 0.0469135 +-0.06337 0.156813 -0.0136043 +-0.0624231 0.0357528 0.0196573 +-0.0709978 0.0698591 0.0316215 +-0.00550273 0.0661441 0.0562254 +0.00539692 0.0418924 -0.0240197 +-0.0711187 0.0642492 0.0206358 +-0.0614458 0.0606683 0.0222701 +0.0189142 0.0353585 0.00519133 +0.0315596 0.0497964 -0.00774264 +-0.0548596 0.0462919 -0.006395 +0.0010398 0.0392387 0.0326514 +0.0448141 0.0889533 0.0211601 +-0.0898897 0.136442 0.013225 +0.0409408 0.0873455 0.0311847 +-0.0866496 0.106304 0.00937201 +0.0315171 0.118424 0.0085036 +-0.091229 0.14471 0.0161551 +-0.00263717 0.12924 0.026005 +0.0142425 0.0645148 0.0521595 +-0.0509259 0.0571242 0.0316152 +-0.0585706 0.155353 0.0213449 +0.0242207 0.111888 -0.0125803 +-0.0305755 0.0788685 0.0415824 +-0.0664528 0.145477 0.0410093 +-0.00432524 0.0423738 0.047881 +-0.0434528 0.12491 0.0216806 +-0.0610445 0.045667 0.0306816 +-0.0148175 0.0855384 -0.0388203 +0.0594886 0.0594575 0.00616841 +-0.0740871 0.156873 -0.0259173 +-0.0414785 0.105663 0.0400022 +-0.0376995 0.0680509 -0.0154542 +-0.0698935 0.122364 -0.00881274 +-0.00848477 0.0718045 0.0573713 +-0.0394932 0.127549 -0.000886358 +-0.0856022 0.136615 0.0453504 +-0.0889467 0.143422 0.0321606 +-0.0738723 0.109242 -0.00905672 +-0.0222267 0.0906414 0.0528718 +0.00551724 0.0661119 0.0558057 +-0.0588983 0.0582416 0.00880815 +0.0225876 0.0388978 0.0383164 +0.0022443 0.0974458 0.0519249 +-0.056455 0.12554 0.0394323 +-0.00949777 0.091187 0.0566315 +0.00149085 0.103013 0.043912 +-0.00374904 0.0712712 -0.0357267 +-0.0394946 0.119701 -0.0126173 +-0.0631669 0.152168 -0.0312981 +-0.0139477 0.0625843 0.0539847 +-0.0604937 0.100137 0.0425915 +-0.0749718 0.138395 -0.00644263 +0.00624486 0.0401371 0.0456279 +0.0193551 0.0475975 0.0417872 +-0.0303971 0.0890708 -0.0275789 +0.0196022 0.0462781 0.0421275 +0.0317544 0.0632771 0.0405733 +-0.0662966 0.156977 -0.00759157 +0.0183734 0.0506657 -0.0252113 +0.0404388 0.0427247 -0.00185446 +0.0115151 0.105777 0.0436811 +-0.0301364 0.0349235 0.0476426 +0.0254917 0.0369057 0.0252691 +-0.0850483 0.109026 0.0223524 +0.0157867 0.112048 -0.0167369 +0.0360751 0.0370336 0.00715793 +-0.0781026 0.0818813 0.0353359 +-0.00650962 0.0773868 0.0579538 +-0.0494324 0.0586474 0.0343285 +0.0112135 0.116429 0.0374582 +-0.0555782 0.159581 0.0063787 +-0.0454954 0.160804 0.00677344 +-0.0709975 0.139911 -0.00751202 +-0.0547852 0.0339346 -0.0120065 +-0.079504 0.128859 0.053141 +-0.0155349 0.0459646 0.0502157 +-0.0704857 0.116111 0.0520944 +-0.0454716 0.0404727 0.0442216 +-0.0890267 0.148493 0.027289 +0.0192952 0.126057 0.00111502 +0.00542039 0.0392223 0.0299552 +-0.0509634 0.152153 0.0121451 +0.0432798 0.100122 0.00916351 +-0.0722295 0.16736 -0.0213426 +-0.0311459 0.0354418 0.0504241 +-0.0834736 0.114211 -0.000781836 +-0.0258217 0.181482 -0.0160394 +-0.0517798 0.115481 0.0337859 +-0.0763629 0.108471 -0.00759882 +-0.0757916 0.155001 0.00503825 +-0.0893649 0.111932 0.017326 +-0.0619999 0.132592 -0.00773229 +-0.033844 0.171255 -0.00164046 +-0.0352015 0.153653 0.00157065 +-0.0722895 0.147809 -0.0265569 +-0.0217088 0.114301 -0.017023 +0.026785 0.0955535 0.0441601 +-0.0481378 0.0672057 0.0386531 +-0.026667 0.0823364 0.0504973 +0.00619086 0.131536 0.009113 +-0.0526119 0.0580506 0.0248562 +0.00250286 0.0576093 0.0540213 +-0.0810169 0.0953587 0.0335948 +0.029848 0.0875415 0.0432926 +0.0464379 0.0778615 0.0131806 +-0.0134997 0.0856507 0.057198 +0.0263535 0.0795425 0.0469281 +-0.0265857 0.0603669 0.0385952 +-0.0334943 0.11802 0.0311453 +-0.00337868 0.117905 -0.0149619 +-0.0660268 0.177263 -0.0521591 +-0.0238887 0.156697 -0.00604726 +-0.00760592 0.125948 -0.00752899 +-0.0221488 0.0383333 0.0268965 +-0.0293863 0.155004 -0.00725783 +0.0105543 0.126889 0.0293082 +0.0501729 0.0446765 0.00723117 +0.0310879 0.115727 -0.00269046 +-0.0191314 0.122285 0.0303949 +-0.0777065 0.155692 0.0145746 +-0.0797904 0.152563 0.0316147 +-0.0710154 0.0391332 0.00421404 +-0.0889531 0.100999 0.0124002 +-0.0147295 0.0942902 -0.0339999 +-0.0812191 0.0785924 0.0290188 +-0.0766463 0.0803349 -0.0100768 +-0.0435275 0.152141 0.00710463 +-0.0608313 0.092512 -0.0191943 +0.0227948 0.124775 0.0223512 +-0.0831943 0.132626 0.0501472 +-0.0317593 0.0449779 0.048226 +0.00552401 0.0633596 0.0561453 +-0.0492065 0.128269 0.0305743 +-0.0634388 0.152153 -0.00650488 +-0.0568117 0.135044 -0.00489316 +0.0252231 0.117755 -0.00691168 +-0.0716366 0.0874136 0.0414306 +-0.0725279 0.091561 0.0413901 +-0.0764449 0.084677 0.0378167 +-0.00880306 0.0841017 -0.0380883 +-0.0688616 0.033602 -0.00179476 +0.0161578 0.0988387 -0.0226848 +-0.0829912 0.0966357 0.0312921 +0.00854504 0.101743 0.0468013 +-0.0161113 0.0419173 0.0519008 +-0.0115772 0.0991016 -0.0249869 +0.026625 0.0839457 -0.0229857 +0.0451532 0.0931968 0.0111604 +-0.0264982 0.113889 0.035131 +-0.00351628 0.0442826 0.04692 +-0.0202282 0.0639107 0.048901 +0.0154069 0.0403121 -0.0220991 +-0.0725345 0.140015 0.0475615 +-0.0340447 0.1653 -0.00374721 +0.00850451 0.0883096 0.055394 +-0.0516913 0.0680528 0.0372779 +-0.070167 0.162396 -0.0479528 +-0.0174382 0.127681 0.00469302 +0.0354105 0.0965418 -0.0122281 +-0.0427202 0.152139 0.00651185 +-0.00023381 0.123831 -0.00932637 +-0.073929 0.152666 -0.0308896 +0.0244967 0.0375596 0.0281073 +-0.038496 0.0450464 0.0406484 +0.0424477 0.0803262 -0.00578172 +-0.017618 0.163994 -0.00984759 +0.042638 0.101488 0.0111603 +-0.0114747 0.111375 0.0418865 +-0.0878262 0.152428 0.0199936 +-0.0605498 0.0341606 0.0243603 +-0.0474966 0.088987 0.0447599 +0.0139221 0.0913152 -0.0287052 +-0.0182228 0.038194 0.0115761 +-0.0697006 0.0619862 0.0158161 +0.0317346 0.0619381 0.0405155 +0.0470668 0.0701831 0.0226957 +-0.0222639 0.0783263 0.0546841 +-0.0624118 0.148891 -0.00459657 +-0.0245152 0.111258 0.0385919 +-0.0623581 0.164692 -0.0425931 +0.0189449 0.0348191 0.0239933 +-0.0489525 0.123989 0.0308621 +-0.0294789 0.0732089 0.0403736 +-0.0912678 0.12968 0.0332366 +0.0188735 0.102787 -0.0208351 +-0.0542898 0.0343509 0.030786 +0.0541934 0.0628656 -0.00090927 +-0.024607 0.037979 -0.0290368 +-0.0461075 0.164061 -0.00779976 +-0.00480748 0.0854817 -0.0373491 +-0.0398973 0.160894 0.00183362 +0.0122013 0.0878954 -0.0308742 +-0.0609826 0.13955 0.0346529 +0.01801 0.126774 0.0220214 +-0.0720383 0.149669 -0.0395937 +0.0268545 0.0350543 0.018119 +-0.00249757 0.0952299 0.0546317 +-0.0177632 0.0728777 -0.0388934 +-0.00835092 0.0354934 -0.0172056 +-0.0123646 0.109877 -0.0203825 +-0.0385 0.120755 0.0293207 +-0.0614467 0.0335533 -0.00933279 +-0.0144984 0.108621 0.0424908 +-0.071459 0.151188 -0.0433221 +-0.0227544 0.0753712 0.0524561 +-0.0581897 0.157381 0.00697939 +-0.0588054 0.0825509 -0.0205914 +-0.0254269 0.0781373 0.050782 +-0.0176233 0.0450417 -0.02779 +-0.0345002 0.10287 0.040969 +0.0398172 0.0390737 0.00420564 +-0.0642915 0.169488 -0.0607786 +-0.0391909 0.150688 0.00279786 +-0.0817139 0.108721 -0.00159489 +-0.0691226 0.174646 -0.044619 +0.0542982 0.0579702 -0.00188368 +-0.0903603 0.143336 0.0142018 +-0.0554977 0.109766 0.0379077 +-0.0646073 0.15754 -0.0113176 +-0.0857257 0.0994313 0.000394941 +-0.0634657 0.0730594 0.0392535 +-0.0114926 0.0604332 0.0544994 +0.00136064 0.0481752 -0.0296995 +-0.0476605 0.124307 -0.00939578 +0.00152589 0.0731231 0.0568629 +0.0454513 0.0412382 0.0102351 +-0.0555526 0.124119 0.0389742 +0.0111749 0.035437 0.032711 +-0.0631468 0.156791 -0.0395997 +-0.0364943 0.115224 0.0327734 +-0.0687764 0.180487 -0.0583042 +-0.0558353 0.0912839 -0.0220329 +-0.0487756 0.0826651 -0.0212781 +0.0222353 0.0804964 -0.0261413 +-0.0698715 0.11424 0.0504282 +-0.0534972 0.0732542 0.0410474 +-0.0354707 0.0874527 0.0429689 +-0.0522647 0.117566 -0.0142997 +-0.0687471 0.158212 -0.0056007 +0.0254863 0.0578069 0.043747 +-0.0625026 0.0973365 0.0428841 +-0.00849427 0.0925522 0.0562249 +-0.076914 0.17371 -0.0479126 +0.0285085 0.121244 0.0144975 +-0.0649629 0.0620542 -0.00149187 +-0.0487919 0.135536 0.0203921 +-0.0406031 0.160882 0.00257136 +-0.0717214 0.0807275 -0.0154713 +-0.0759462 0.128163 -0.00785989 +0.0065117 0.129736 0.0249737 +-0.00106791 0.0391062 -0.00597311 +-0.0539473 0.03352 0.0103166 +0.0264479 0.103016 -0.017087 +0.0368588 0.0672041 -0.0137655 +-0.0209608 0.0380992 0.0183358 +-0.0922682 0.12272 0.00827864 +-0.0758891 0.119352 -0.00728174 +-0.0619808 0.0469192 0.00268857 +0.0286963 0.0991802 -0.016993 +0.0173223 0.125777 -0.00156033 +-0.071812 0.0879125 -0.0161091 +-0.0634945 0.102894 0.0414572 +-0.0534816 0.0491363 0.0336594 +-0.0677428 0.164471 -0.018256 +0.0418243 0.102828 0.00318021 +-0.0345003 0.0347932 0.0310568 +-0.0508009 0.0912872 -0.0218676 +0.0344847 0.0868408 -0.0179179 +0.0193386 0.0579734 -0.027391 +-0.0621388 0.0334692 0.00329381 +-0.017215 0.175671 -0.0245809 +-0.0538714 0.0449084 0.0167075 +0.0201621 0.124133 -0.00175315 +0.00612185 0.108732 -0.0201634 +0.0101112 0.110138 -0.0193681 +0.0407992 0.0698146 0.0307925 +-0.0186672 0.0495328 -0.0300927 +-0.0804551 0.134426 0.050865 +-0.0719585 0.0377493 0.00378419 +0.00950065 0.0688226 0.0549942 +0.0451024 0.091769 0.003186 +0.0116064 0.121838 0.0345253 +-0.07744 0.155698 0.0205089 +0.0154982 0.118174 0.0357451 +0.0455409 0.0918154 0.00916522 +-0.0825371 0.14737 0.037761 +0.00019241 0.0853625 -0.035651 +-0.0413557 0.0405762 -0.0252979 +-0.00795135 0.129264 0.0240771 +-0.00779714 0.0812765 -0.0379169 +0.0279176 0.0508447 -0.0187774 +-0.0851867 0.0791254 0.00650076 +-0.071556 0.161392 -0.00951947 +0.0302201 0.119789 0.0108648 +-0.0664004 0.120055 0.0514481 +-0.0652563 0.0459546 0.00568144 +-0.0484523 0.0349311 0.00836568 +0.050668 0.0451751 0.0191374 +0.0235092 0.118527 -0.00774096 +-0.0799897 0.135372 -0.00407226 +0.0454193 0.0875784 0.00318139 +0.0218862 0.107458 -0.0158341 +0.0519418 0.0525693 0.0274887 +-0.0174883 0.044685 0.0517611 +-0.0503006 0.134918 0.0263293 +-0.0797918 0.11331 -0.00252121 +0.0170867 0.039703 -0.0206999 +-0.00603107 0.130744 0.0146461 +-0.0614566 0.0372076 0.0201515 +-0.0634342 0.039353 0.0417984 +-0.0520389 0.0545474 0.0246248 +-0.0700192 0.172057 -0.036324 +0.0425828 0.0778099 0.0282065 +-0.0943409 0.12415 0.0172628 +-0.03739 0.165304 0.000185179 +0.0380556 0.0834519 0.0357476 +-0.0140374 0.0384483 0.0012996 +-0.0834291 0.14469 0.0401339 +-0.055347 0.0335038 0.00284205 +-0.0577441 0.0590406 0.000553128 +-0.0586534 0.154964 0.024223 +-0.0627416 0.148221 0.0374769 +-0.0597552 0.0781833 -0.0189903 +-0.0882134 0.141936 0.0111996 +0.0441966 0.0973694 0.0101636 +0.00324014 0.0740573 -0.0349749 +-0.0320743 0.0763998 -0.0305477 +0.0424682 0.0642865 0.0278791 +0.00647808 0.111357 0.041027 +0.0241747 0.0351145 0.0138772 +-0.0842625 0.100702 -0.00260902 +-0.0538049 0.0486373 0.0382673 +0.0033632 0.097467 -0.0272178 +-0.0526204 0.141613 0.022402 +0.0331357 0.0570437 -0.0137102 +0.00753436 0.104363 0.0436686 +-0.029494 0.0631194 0.0377814 +0.0357221 0.0994501 0.0342567 +0.0398205 0.0604422 -0.00479028 +-0.0134826 0.109991 0.0421694 +-0.0618817 0.161578 -0.0325898 +-0.00560304 0.0434101 -0.0260312 +-0.0274608 0.0473022 0.0495228 +-0.065855 0.0967089 -0.0173163 +-0.00276158 0.0698244 -0.0351738 +-0.00250067 0.110029 0.0428965 +0.0142116 0.123033 -0.00860213 +-0.0633963 0.145356 0.0382744 +-0.033621 0.0519746 -0.0102559 +0.0385319 0.0997972 -0.00779458 +0.0312326 0.118751 0.0098088 +-0.011143 0.128894 0.00267925 +-0.0574832 0.0833327 0.0441985 +-0.0668542 0.114225 0.0472279 +0.0369848 0.0561762 0.0322 +-0.0688663 0.102328 -0.014772 +-0.0246521 0.0478035 -0.0267776 +-0.0806498 0.110292 0.0422048 +-0.0475911 0.163428 -0.00670042 +-0.00358669 0.0376696 -0.025221 +-0.0499193 0.118992 -0.0138138 +-0.0766944 0.171427 -0.0358927 +0.0174979 0.126711 0.000451693 +-0.0107378 0.177152 -0.0244143 +0.0397983 0.0672171 0.0328832 +0.00289976 0.039936 0.0460731 +0.030847 0.0875798 0.0429743 +-0.0394926 0.102848 0.0402648 +0.00332264 0.0568618 -0.0316357 +-0.0367537 0.0783235 -0.0195335 +-0.038823 0.0928858 -0.0233898 +-0.0644838 0.0931562 0.0439721 +-0.0298466 0.0385336 -0.0167929 +-0.0548009 0.0449973 0.0226803 +0.0118375 0.0344099 -0.0160341 +-0.0683506 0.181259 -0.055895 +-0.0107728 0.0387832 -0.00390135 +-0.0300375 0.0890464 -0.0285748 +-0.0710857 0.168903 -0.0252489 +-0.0757782 0.149978 -0.0188682 +0.030839 0.0995119 0.0394948 +-0.0329249 0.0369927 0.0503412 +-0.0732448 0.144163 -0.0109449 +-0.0897565 0.140652 0.029182 +-0.0735905 0.154201 0.0306806 +0.00579855 0.0347845 0.042995 +-0.0519166 0.0545256 0.0236155 +-0.01212 0.102458 0.0438351 +-0.0211595 0.178661 -0.0149212 +-0.014608 0.0421127 -0.0270124 +-0.0885789 0.0922253 0.0228661 +-0.0145885 0.128899 0.00863716 +0.010498 0.0909888 0.0536897 +-0.0066489 0.0388823 -0.00316153 +-0.0258212 0.0839605 -0.0371412 +-0.0797525 0.15498 0.0124103 +-0.0414563 0.108465 0.0385585 +-0.0525315 0.149847 0.0192949 +-0.0156627 0.184575 -0.0209705 +0.0428837 0.0887839 -0.00581701 +0.0242564 0.0734016 -0.0257301 +0.0192994 0.062217 -0.0274738 +-0.0310269 0.122601 -0.0056394 +-0.0569847 0.153801 0.0277423 +-0.0526515 0.0504392 0.0286525 +0.00150192 0.0634213 0.0567922 +-0.0838556 0.139345 0.0449552 +-0.0476133 0.0562658 -0.0107838 +-0.0527007 0.0693372 -0.0141095 +-0.0311494 0.157393 -0.0113544 +0.00313658 0.0348497 0.0441849 +-0.0311581 0.17265 -0.0162683 +0.0453494 0.0847845 0.0201731 +0.0285114 0.0619268 0.0428923 +0.000499004 0.0634057 0.0567297 +0.00751117 0.0575089 0.0530994 +-0.000499443 0.114191 0.0415203 +-0.0794921 0.146102 0.0417961 +-0.0252738 0.0381933 0.0263814 +-0.0376796 0.16681 0.00156763 +0.0387661 0.0870401 -0.0137857 +0.0296088 0.12015 0.0163431 +-0.0938694 0.121489 0.0252875 +-0.0396002 0.125498 -0.0067103 +0.0370837 0.103994 -0.00683208 +-0.0465559 0.0461276 -0.0102455 +0.0404351 0.0389029 0.0137659 +-0.0424925 0.100104 0.042001 +-0.0285717 0.12063 0.0270994 +-0.0800863 0.148726 0.0380799 +0.00214563 0.119376 -0.0145717 +-0.0288792 0.104408 -0.0227314 +-0.0312735 0.034639 0.0229335 +-0.0669165 0.12238 -0.00897156 +-0.0890273 0.0956446 0.021399 +-0.0897683 0.091592 0.0154417 +-0.0739499 0.156872 -0.0269145 +0.00919729 0.039194 0.0451612 +-0.0374937 0.109757 0.0368609 +0.0523694 0.0545712 -0.00274385 +-0.0339801 0.0348087 0.0434578 +-0.00541562 0.128879 0.0264449 +-0.0636022 0.151642 0.0357576 +-0.0693902 0.0672718 0.0289371 +-0.0220481 0.121595 -0.00868192 +-0.0390536 0.127857 0.00108873 +-0.090122 0.144414 0.0285066 +-0.0629168 0.114269 -0.0126902 +-0.0930993 0.129616 0.0162363 +-0.0325132 0.0575193 0.0378292 +-0.0193156 0.162502 -0.00702982 +0.00550789 0.0910775 0.054811 +-0.0234801 0.168298 -0.011313 +0.0473422 0.0575607 -0.00551801 +0.0214637 0.0989203 0.04607 +-0.0827604 0.106087 -0.00164696 +-7.52397e-05 0.037877 0.020989 +-0.0345343 0.126083 0.0189612 +-0.0512338 0.164096 -0.00192926 +-0.0477776 0.0826677 -0.0211258 +-0.0368214 0.16531 -0.000729186 +-0.0673944 0.162815 -0.015253 +-0.0186701 0.0971551 0.0477534 +-0.0366241 0.0360289 0.0452882 +-0.0195815 0.0341867 -0.0200865 +0.0298019 0.0862025 0.0431971 +-0.0932655 0.120203 0.038289 +-0.000505415 0.110024 0.0426421 +-0.0191383 0.16678 -0.0189611 +0.0173062 0.0421724 0.0440438 +0.0105403 0.105742 0.0436489 +-0.0345641 0.11594 -0.0146748 +-0.0944618 0.125537 0.019259 +-0.0679091 0.108046 -0.0128123 +0.0268137 0.118694 -0.00391821 +-0.0577288 0.0738232 -0.0175832 +-0.0494959 0.0988033 0.0435442 +0.0425948 0.0873487 -0.0068057 +-0.0366079 0.114094 -0.0167422 +-0.0064886 0.118022 -0.0150746 +-0.0694599 0.155751 0.00874428 +-0.0727804 0.0887809 0.0411113 +-0.0921325 0.117269 0.0252198 +-0.0769942 0.154149 -0.012901 +0.00413641 0.0979047 -0.0256761 +-0.0504737 0.113932 0.0347324 +-0.00655213 0.0389811 -0.00882376 +-0.021105 0.0431099 0.0534593 +-0.0732611 0.161033 -0.0359392 +-0.0668535 0.0938084 -0.0173106 +0.0523234 0.0724358 0.00729932 +-0.02575 0.0536249 0.0391706 +-0.0529014 0.114056 -0.0162353 +-0.0887923 0.1378 0.0112057 +-0.0604332 0.0585193 0.0100455 +-0.0105014 0.0546468 0.0522278 +0.0475389 0.0482604 0.0280949 +0.00247406 0.123881 0.0337357 +0.0282809 0.0389301 0.0276504 +-0.0903128 0.141958 0.0142327 +-0.0457178 0.0724199 -0.0170809 +-0.0393802 0.149525 0.00137589 +-0.0384762 0.128323 0.0101316 +-0.0387951 0.0343342 0.0305488 +-0.0627886 0.154765 0.0285735 +-0.044804 0.0884409 -0.0220028 +0.00621048 0.0851628 -0.0331463 +-0.0124997 0.0938947 0.0551641 +-0.0760018 0.163203 -0.0170986 +-0.0568081 0.154369 0.0248865 +0.0141304 0.056278 0.0501629 +-0.000201542 0.0357861 0.0174114 +-0.0687337 0.0764635 -0.0155195 +-0.0465141 0.0518831 0.0377757 +0.0306859 0.0377485 0.0237503 +-0.0887758 0.149859 0.0255696 +-0.0468066 0.088437 -0.0220186 +-0.0104567 0.111397 0.0420636 +0.00949238 0.0487693 0.0494463 +-0.0344171 0.0343826 0.0278837 +-0.0747225 0.161031 -0.0319529 +-0.00127097 0.123959 0.0338052 +0.0484686 0.0511467 0.0294828 +0.0216142 0.042218 0.0415059 +0.0159587 0.0874032 0.0512942 +-0.0579584 0.0336225 0.00939861 +0.0262865 0.0689766 -0.0234385 +-0.0457839 0.11676 -0.0154906 +-0.0431023 0.149502 -0.00451393 +0.0575358 0.0592738 0.00218909 +-0.0907151 0.116093 0.0293225 +-0.0626986 0.0658458 -0.00782349 +-0.0680529 0.0874243 0.0435129 +-0.0323521 0.0336874 -0.0296376 +-0.0208013 0.108893 -0.0213287 +0.00800637 0.0345135 0.0400968 +0.0600686 0.0650603 0.0191749 +-0.0881094 0.0861284 0.0104766 +-0.0292466 0.166794 -0.00735295 +-0.0455037 0.159315 0.00726546 +-0.0361152 0.127822 0.0095198 +-0.00430156 0.130062 0.00233767 +-0.032509 0.0506603 0.0384213 +-0.0316129 0.119551 -0.0104429 +0.0414143 0.104258 0.0111621 +-0.075527 0.0733333 0.0311756 +-0.0549715 0.161246 0.00205939 +-0.0503915 0.140104 0.0183826 +0.0152276 0.0835585 -0.0295949 +-0.0464862 0.0718998 0.0415251 +-0.00551998 0.0732424 0.0584734 +-0.0900165 0.133639 0.00622839 +-0.069719 0.0887582 0.0422978 +0.00474777 0.0367585 0.0247919 +-0.027126 0.165248 -0.0165316 +-0.0283135 0.0350192 0.0513697 +-0.0318897 0.0721821 -0.0275085 +0.0437433 0.0945326 0.0221692 +-0.0126802 0.0961728 -0.031918 +-0.0567215 0.04662 0.0276747 +-0.00532834 0.0367049 -0.0158504 +-0.0529595 0.0335568 -0.000338033 +-0.0240311 0.112816 -0.0174462 +0.01097 0.0520216 0.0508135 +-0.0328411 0.0915526 -0.0242438 +-0.0552728 0.0335199 0.0136226 +-0.0820994 0.104661 -0.00359906 +0.035799 0.0558975 -0.00871505 +-0.0868952 0.0991223 0.0252196 +-0.0296012 0.120713 0.0267425 +-0.0695324 0.125657 0.0522171 +-0.0424937 0.0790081 0.0428161 +-0.0632658 0.0419596 0.040132 +-0.0699149 0.161541 -0.0103834 +-0.0345105 0.0676457 0.041143 +-0.00514301 0.0997589 0.0492461 +-0.0697588 0.147131 -0.0275571 +0.0580762 0.0648724 0.00314588 +0.0241035 0.1245 0.0085821 +0.0377445 0.110141 0.00501649 +0.0413546 0.0999884 -0.00181466 +0.0180964 0.0604579 0.0488964 +-0.0341434 0.0780256 -0.025502 +0.0365014 0.0756142 -0.0127863 +0.0485013 0.0651587 0.0285278 +-0.0331365 0.162399 -0.0024379 +-0.0578171 0.08688 -0.0211007 +-0.0591308 0.125513 0.0408421 +-0.0248084 0.0826031 -0.0377611 +-0.00847175 0.0920515 -0.0356471 +-0.0281451 0.166722 -0.0170726 +0.0321478 0.0740867 0.0412125 +-0.0318598 0.0496767 -0.0173511 +-0.0683644 0.0381281 -0.00463362 +-0.0293612 0.0383343 -0.00169706 +-0.0546971 0.0334232 0.00665025 +-0.0604511 0.0584329 0.0155226 +0.0356702 0.108162 -0.00482135 +-0.087994 0.0981671 0.00544953 +0.042672 0.0737568 0.0282004 +-0.0414969 0.095865 0.0421344 +0.0227593 0.0727654 0.0487302 +0.0247922 0.121532 -0.00113746 +0.0282353 0.0775351 -0.0225519 +-0.0487687 0.0559317 0.0351683 +-0.0192566 0.180095 -0.0235875 +-0.0250606 0.0603159 -0.031412 +-0.0310964 0.160762 -0.0139612 +0.0143682 0.0767494 0.0542274 +-0.0714649 0.159596 -0.0419316 +0.0454023 0.0875829 0.0161653 +-0.0354973 0.0470472 -0.0223112 +-0.0465703 0.0490167 -0.00974944 +0.025334 0.0435501 0.0381106 +-0.0785372 0.168054 -0.0329755 +-0.0148858 0.0985034 0.047376 +-0.0302927 0.117007 -0.0138211 +-0.0802651 0.0963563 -0.00854135 +-0.030624 0.0348272 -0.0303515 +-0.000406928 0.0996624 0.04942 +-0.0576871 0.0335309 0.00594357 +-0.0923088 0.114683 0.0143254 +0.00732004 0.0351406 -0.00439972 +-0.00948171 0.174183 -0.0285537 +-0.0320503 0.12646 0.00953655 +0.0270529 0.0822264 0.0462092 +-0.0900419 0.139254 0.023178 +-0.0498185 0.0927102 -0.0215416 +-0.00751389 0.102333 0.0437439 +-0.0775302 0.161724 -0.0197184 +-0.044496 0.0451943 0.0419603 +-0.0362032 0.160944 0.000172036 +-0.0314741 0.053189 0.0369367 +-0.072385 0.158213 -0.0369175 +-0.0860963 0.145967 0.0357039 +-0.0554937 0.100184 0.0430705 +-0.0523102 0.116406 -0.0150785 +-0.0518166 0.09273 -0.0219218 +-0.024907 0.0916549 -0.0335476 +-0.0634479 0.141036 0.0381413 +0.0152366 0.121915 0.0327966 +-0.0631227 0.0445391 0.0377156 +-0.0865336 0.141884 0.00820248 +0.00748358 0.11412 0.0398951 +-0.071965 0.136965 -0.0074383 +-0.0608999 0.058839 0.0168686 +-0.0886398 0.102364 0.0173768 +-0.0688031 0.0659098 0.026726 +0.02824 0.0686155 0.0425458 +-0.0196877 0.127428 0.0169554 +0.0332508 0.0906175 -0.0178979 +0.019654 0.122236 -0.00577023 +-0.0457281 0.151677 -0.00565337 +-0.0685681 0.156629 -0.0529972 +0.0455148 0.0801982 0.0216904 +0.0232513 0.0734458 -0.026356 +-0.0856264 0.110331 0.00634317 +0.032415 0.0383305 -0.000488607 +-0.0697489 0.17084 -0.0530327 +0.0127518 0.0887452 0.0537008 +-0.0650469 0.168333 -0.0359323 +-0.0312058 0.066507 -0.0244549 +-0.0481456 0.14427 0.00342034 +-0.0250932 0.0385898 -0.0121739 +-0.0268796 0.181867 -0.0133655 +-0.0624905 0.0804598 0.0431805 +-0.0664501 0.0353918 0.0342807 +-0.0287674 0.078167 -0.0351681 +0.0384815 0.0729589 -0.0117402 +-0.0325668 0.0347124 0.0262002 +0.0258782 0.0645831 0.0443789 +-0.0486546 0.0620591 -0.0122264 +-0.086684 0.149909 0.029141 +0.0138472 0.123867 0.0319554 +-0.0513866 0.0584422 0.0306256 +-0.00251219 0.0378133 0.00785027 +-0.00926128 0.126278 0.029483 +0.0147315 0.0347337 -0.0176578 +0.0417187 0.066227 -0.00378154 +-0.0149615 0.0883672 -0.0380383 +-0.0678931 0.0900993 0.043242 +0.0149683 0.113515 -0.0163113 +-0.0719356 0.110274 0.042413 +-0.0333618 0.0751438 -0.0264858 +0.0116984 0.034577 0.0227351 +-0.0670519 0.166375 -0.0237602 +-0.0454276 0.0345386 0.0307405 +-0.00249621 0.0883993 0.0567366 +-0.0235661 0.115415 0.0353667 +-0.0944357 0.121484 0.0222838 +0.0334736 0.0940135 -0.0155006 +-0.0436018 0.0519969 -0.0109067 +-0.0781065 0.0948585 -0.0115273 +0.0456581 0.0729488 0.0206934 +-0.0274951 0.157765 -0.0111917 +-0.00306441 0.100922 0.0454807 +-0.0618021 0.116863 0.0404147 +-0.0344937 0.041903 -0.0294247 +-0.0427476 0.159417 0.00474491 +0.0374917 0.0484328 0.0317174 +-0.00814387 0.0339061 -0.0213361 +-0.0737927 0.132633 0.0513524 +-0.0397231 0.116184 -0.0149076 +-0.00950395 0.0773592 0.0576807 +-0.0505908 0.03436 0.0298011 +0.0187381 0.119283 0.0342968 +0.00523462 0.075444 -0.0346019 +-0.0321194 0.165225 -0.0156285 +-0.0276791 0.1239 0.019992 +0.0190254 0.061825 0.0484929 +-0.0821717 0.11152 0.00033013 +0.0241621 0.0505303 0.0399762 +0.0378012 0.0604211 0.0334272 +-0.0182252 0.159192 -0.00975232 +0.0423754 0.100105 0.0181719 +-0.0546942 0.0661242 -0.0103565 +-0.0685912 0.131247 0.0482807 +0.000498438 0.0938703 0.0551155 +-0.0281544 0.168213 -0.0175818 +-0.0417796 0.0485307 -0.0113147 +0.0287445 0.109341 -0.0118595 +-0.00260812 0.130913 0.0187596 +-0.0454889 0.0660999 0.0395126 +-0.0655106 0.0972881 0.0421527 +-0.0194848 0.0869694 0.0563134 +-0.0264967 0.121204 -0.00819998 +0.00829502 0.0653838 -0.032076 +-0.0287456 0.0753309 -0.0348961 +-0.0727338 0.0821447 -0.0156124 +-0.0470607 0.146242 0.00718592 +-0.0209665 0.0386858 -0.0114366 +-0.0600079 0.128191 -0.00754937 +-0.0653109 0.180421 -0.0593142 +-0.0559148 0.0548054 0.00768529 +-0.0524976 0.0917711 0.0441581 +0.0212182 0.0847586 -0.026404 +-0.0579878 0.0414274 -0.0083271 +-0.0726954 0.0791971 -0.0139413 +-0.0307256 0.0915724 -0.0247467 +-0.0556334 0.11822 -0.0129265 +-0.0457806 0.0841121 -0.0213757 +0.00438413 0.0465246 -0.0275852 +-0.010477 0.110005 0.0426237 +-0.0896333 0.0929554 0.018431 +0.0397783 0.106996 0.0151622 +-0.0127593 0.0728576 -0.0383837 +0.0319543 0.0766492 -0.0197037 +0.00131984 0.0612266 -0.0334746 +-0.0834451 0.136657 0.0474496 +-0.0558128 0.0869147 -0.0214989 +0.00250708 0.0474439 0.0499052 +0.0125018 0.115423 0.0374065 +-0.00563766 0.13083 0.0104776 +-0.0658527 0.144237 -0.0148815 +-0.089646 0.0929438 0.0164332 +0.0436072 0.041137 0.00426675 +0.0444767 0.0889055 -0.00179899 +-0.057137 0.0562876 0.0015684 +0.00522768 0.0810328 -0.0339223 +-0.0137183 0.0628763 -0.0368336 +0.00133514 0.0554198 -0.0315391 +-0.0188851 0.0334951 -0.0249427 +0.052927 0.0495927 0.0235839 +0.0522184 0.0461787 0.0182078 +0.0165976 0.0348504 0.0271124 +-0.0589342 0.12267 0.0410891 +-0.0669714 0.163891 -0.0179699 +-0.0703202 0.132668 0.0493213 +-0.0776493 0.0787462 -0.00818258 +-0.0881736 0.132451 0.0437642 +-0.0632228 0.141176 -0.0069873 +-0.0713401 0.171022 -0.0310853 +-0.047409 0.166836 0.00227952 +-0.0141433 0.181604 -0.0223083 +-0.0619045 0.104018 -0.0180451 +-0.0483068 0.13712 0.0113971 +0.0136813 0.0952834 0.0497668 +0.035272 0.0660164 0.0386352 +0.0461881 0.0785676 0.017326 +-0.0532105 0.0335853 0.013987 +-0.0171786 0.0971676 0.04907 +-0.0725346 0.145512 -0.0179133 +-0.0333802 0.0498304 -0.01435 +0.0509184 0.0496314 0.0259504 +-0.0572784 0.0576838 0.00160501 +-0.0619689 0.153737 -0.0245819 +-0.0544985 0.104295 0.0412117 +-0.0500704 0.137041 0.0213927 +-0.0191411 0.0697535 0.053261 +0.0582061 0.0634965 0.00313887 +-0.0204853 0.0800483 0.0563065 +-0.0472097 0.0335059 -0.0119372 +-0.0749299 0.155492 -0.0209193 +-0.0698715 0.116492 -0.00825865 +0.0375436 0.055493 0.03143 +-0.0538462 0.137744 -0.0016929 +-0.0607335 0.034496 0.0414254 +0.0295159 0.107768 -0.0121736 +-0.0689178 0.168027 -0.0530164 +-0.0779935 0.171503 -0.0379488 +-0.0881443 0.0887489 0.00447233 +-0.00442605 0.128738 0.0268092 +0.00451348 0.0633892 0.056472 +-0.0818952 0.134036 0.0502533 +-0.0372574 0.124492 0.0238955 +0.0138426 0.11139 -0.0180298 +-0.0818741 0.119187 -0.00382424 +-0.0756587 0.0744591 -0.00795246 +-0.026115 0.158145 -0.00104516 +0.037495 0.0513025 0.031739 +0.0589255 0.0580383 0.0211692 +0.0434376 0.0874432 0.0261531 +-0.0260776 0.125932 0.00880255 +-0.0740662 0.155757 0.0246008 +-0.0178239 0.0387614 0.0327968 +0.0417114 0.091515 -0.00780409 +-0.0241449 0.0905492 0.0505682 +-0.074497 0.124608 0.0532356 +-0.0458334 0.0927472 -0.0217986 +-0.0804383 0.111326 0.0449881 +-0.00529252 0.125273 -0.00885488 +-0.0889223 0.0888194 0.00846703 +-0.00624295 0.130196 0.00449841 +-0.0669483 0.0447271 0.0026821 +-0.0548497 0.0941617 -0.0218342 +-0.0534962 0.0931826 0.0441514 +-0.0347147 0.0696617 -0.0176192 +-0.0440132 0.0366004 -0.0242792 +-0.0474979 0.0464882 0.040801 +-0.0653409 0.0600919 0.00943789 +-0.0231718 0.171204 -0.0201308 +-0.00587295 0.130011 0.00319127 +-0.0664676 0.0383698 -0.00648508 +-0.0886456 0.0935942 0.0229142 +-0.0447618 0.116708 -0.0154556 +0.0194756 0.100345 0.0462123 +-0.0154951 0.0911415 0.0560918 +-0.0371641 0.0342638 0.0291868 +0.0162971 0.0651874 -0.0294171 +-0.0291548 0.169699 -0.0175574 +-0.0704877 0.0623972 0.0153213 +-0.0774944 0.092744 0.0372295 +-0.00984328 0.0975178 -0.0293224 +-0.0784995 0.162482 -0.0259435 +-0.0145068 0.0730096 0.0554058 +0.0203473 0.0727595 0.0505294 +-0.0616196 0.156864 -0.0215888 +-0.0832232 0.0789707 0.00151853 +0.0163786 0.0403059 -0.0216745 +0.000325641 0.0568761 -0.0321896 +-0.0192766 0.0554309 0.0481999 +-0.00592104 0.0389465 -0.0049376 +-0.0499986 0.143197 0.012378 +-0.0355049 0.076131 0.0419036 +0.053394 0.0525543 0.0260735 +0.00630024 0.125509 0.0321214 +-0.0349082 0.033686 0.00682403 +-0.0714928 0.117552 0.0529474 +-0.0589919 0.15382 0.0299308 +0.0585035 0.0621132 0.0229868 +0.00569406 0.0341002 0.00181761 +-0.0155184 0.118264 0.0365807 +-0.0424989 0.16674 0.00381643 +-0.0863225 0.128011 -0.00168174 +-0.0553953 0.118382 0.0373919 +0.0469197 0.0444607 0.00136465 +-0.056091 0.0334157 -0.00629765 +-0.0361548 0.166687 -0.0142688 +-0.0127937 0.0386426 -0.0153707 +-0.0118501 0.11995 -0.013068 +-0.00670797 0.0627873 -0.0354975 +-0.079327 0.169353 -0.0390258 +-0.0437872 0.0855322 -0.0215732 +-0.0280896 0.0549613 -0.0243859 +-0.0584052 0.033525 -0.00869675 +-0.0482395 0.144672 0.00644062 +-0.0554929 0.0932384 0.0449182 +-0.0347045 0.0851136 -0.0245778 +-0.0494996 0.0791204 0.0440794 +0.0372047 0.0385834 0.00228863 +0.0193241 0.0607694 -0.0271316 +0.00852018 0.0702413 0.0555324 +-0.0778099 0.148638 -0.00388521 +-0.06539 0.178765 -0.0548301 +-0.04996 0.133052 -0.000571002 +-0.0847199 0.0939171 -0.00356265 +-0.0326229 0.0385148 -0.00990233 +0.032773 0.036599 0.0179277 +0.0427869 0.0611675 -0.0033403 +-0.0366336 0.0548529 -0.010755 +-0.0870489 0.0900041 0.00248653 +0.0416085 0.0656213 0.0284032 +0.00293844 0.100629 -0.0225769 +-0.0728162 0.0907583 -0.0154663 +-0.0718707 0.116473 -0.00776413 +-0.0937263 0.121427 0.0132848 +0.00471758 0.0346554 0.0428856 +-0.0704897 0.0719829 -0.0097429 +-0.050201 0.0344166 0.0315946 +-0.0796522 0.0704439 0.0152371 +-0.0425023 0.0986936 0.0421906 +0.0383887 0.0445417 -0.00444706 +0.0311086 0.103751 -0.0138751 +-0.0667119 0.155932 -0.00484005 +-0.0912006 0.121567 0.0443209 +-0.019019 0.0418114 0.0529435 +-0.0892823 0.141954 0.0132429 +-0.0221125 0.0389367 0.0353489 +-0.0563218 0.0335364 0.00802021 +-0.0896372 0.0929496 0.0174335 +0.0130767 0.125591 0.0302496 +0.0537776 0.0692651 0.00258827 +0.0106605 0.0363802 0.031763 +-0.0297187 0.0523119 -0.0193651 +-0.0140732 0.0383739 0.00681638 +0.0269054 0.0726895 0.0441444 +0.0246103 0.075474 0.0479027 +-0.00359864 0.0405713 -0.0254999 +0.0269298 0.0804165 -0.0233375 +-0.0488158 0.0912881 -0.0217052 +-0.00415439 0.0390536 -0.00654274 +0.000507304 0.0828912 0.0574668 +-0.0158173 0.038248 0.0138275 +-0.0624172 0.0599054 0.00479638 +0.0162074 0.0821136 -0.0291532 +-0.0419982 0.0337727 -0.000124238 +0.0250957 0.0348061 0.00319961 +-0.0309108 0.0608665 -0.0194213 +-0.0387236 0.174145 -0.00898261 +0.0464355 0.0778581 0.0101835 +-0.0639936 0.132595 -0.00811291 +-0.0340062 0.0381682 0.049242 +-0.0477004 0.131837 0.0244001 +-0.00268932 0.130846 0.00581897 +0.0302059 0.0857499 -0.020278 +0.0384903 0.0499056 0.0320993 +0.010384 0.0463357 -0.0254801 +-0.00660048 0.0405957 -0.0258634 +-0.0114989 0.0366056 -0.0169842 +0.0105059 0.0348976 0.020389 +-0.0487973 0.070279 0.0395574 +-0.0394971 0.057712 0.040203 +-0.0253679 0.125634 0.0163937 +0.0361389 0.0902387 0.0383091 +-0.0654905 0.0889779 0.0446185 +-0.0197462 0.0656505 -0.036857 +0.0320676 0.117774 0.0158308 +0.00351414 0.0661565 0.0562774 +-0.0226137 0.0422636 -0.0288734 +-0.019191 0.123923 -0.00519119 +-0.0532423 0.046246 0.0226735 +-0.021638 0.0464604 -0.0276852 +0.0272834 0.0689403 -0.022937 +0.0211914 0.124678 0.000362022 +0.04653 0.0760573 0.0105389 +-0.0338201 0.127158 0.00888963 +-0.077651 0.154407 0.00585132 +-0.0417202 0.0710768 -0.017536 +-0.0887218 0.0874968 0.0134639 +0.0165095 0.0354073 -0.0166384 +-0.0454406 0.0336534 -0.00804117 +-0.0504088 0.153575 0.0112235 +-0.0286428 0.107004 -0.0213195 +-0.0218765 0.0933131 0.0510401 +0.0329715 0.116865 0.0119087 +-0.0914625 0.148845 0.019136 +-0.0596259 0.155781 0.0151651 +0.0375784 0.099381 0.0316743 +-0.0157845 0.0784788 -0.0385671 +-0.0795217 0.123111 0.0512585 +-0.0418108 0.0343847 0.029868 +0.0389991 0.108356 0.0151637 +-0.0709225 0.109376 -0.0106672 +0.0579353 0.0634887 0.0239229 +-0.058577 0.0727277 0.0406017 +-0.062479 0.152546 0.000181648 +-0.0544934 0.0834141 0.0452404 +0.0357112 0.102065 0.0324889 +-0.0715263 0.0944187 0.0416527 +-0.0651404 0.112408 0.0390225 +-0.0545541 0.160714 0.00540511 +-0.0144079 0.183333 -0.0275579 +-0.0621531 0.152198 -0.0185797 +-0.0657166 0.14722 -0.0249021 +-0.0460756 0.154674 -0.00723534 +0.01519 0.127729 0.000331934 +-0.0489579 0.137072 0.00640402 +-0.0485683 0.0335187 -0.00854361 +-0.0885037 0.114225 0.0283481 +-0.0540375 0.141288 -0.0013423 +-0.0472373 0.134368 0.0171539 +-0.0272298 0.037736 0.022792 +-0.0518585 0.0985114 -0.0220738 +-0.0110867 0.180248 -0.025982 +-0.0236236 0.0593674 0.0425181 +-0.0408247 0.092859 -0.0231395 +0.0561988 0.0567015 0.0248562 +-0.0086058 0.172644 -0.0268228 +0.0163504 0.0552051 -0.0284322 +-0.0344945 0.0336038 -0.0243554 +-0.0556539 0.0345276 0.0424927 +-0.0348371 0.155104 0.00211833 +0.0276605 0.0605608 0.0434107 +-0.0623508 0.146001 -0.00658982 +-0.0248115 0.081196 -0.037776 +0.0240847 0.110594 -0.013209 +-0.0895075 0.148492 0.0263454 +-0.0926235 0.124077 0.00926903 +0.0292051 0.0843756 -0.0209031 +-0.0353048 0.127501 0.00687019 +-0.0859011 0.134922 0.00126737 +-0.0742444 0.0756609 0.0347079 +-0.0752605 0.157705 -0.0064221 +-0.0337955 0.0808164 -0.0255276 +-0.0288635 0.154571 -0.00355817 +0.0360371 0.0547702 0.0325687 +-0.0101249 0.0392126 0.0357767 +0.0288986 0.120838 0.016073 +-0.0106831 0.0570151 -0.0340192 +-0.0628045 0.144114 -0.00718004 +-0.0895701 0.151478 0.0161361 +-0.0176156 0.0385615 0.0294218 +-0.0211148 0.0389017 0.0355855 +0.0329392 0.0541774 -0.0107445 +-0.00428899 0.0367463 -0.0156853 +-0.0458368 0.0956376 -0.0219211 +0.0381262 0.080772 0.035847 +0.0268148 0.0976356 -0.019356 +-0.0625367 0.161521 -0.0446005 +-0.0517979 0.0869425 -0.0216307 +0.0344672 0.111064 -0.00366583 +-0.0911264 0.115738 0.024682 +-0.0753098 0.0805155 0.0368289 +-0.0133248 0.129244 0.00909724 +-0.0272428 0.0370384 -0.018628 +-0.0384762 0.0423266 0.0418914 +0.0203738 0.0521374 -0.0257342 +0.0585485 0.0552063 0.00817117 +0.0134367 0.121611 -0.0110511 +-0.089438 0.113514 0.0412091 +0.0444691 0.0790854 -0.00178456 +-0.000786355 0.0797462 -0.0360298 +-0.0269011 0.155694 -0.0071882 +-0.08839 0.0995952 0.00742201 +-0.0662162 0.0396687 0.0135434 +-0.0355277 0.0846755 0.0433772 +-0.0858238 0.104979 0.0223569 +-0.0778773 0.120773 -0.00663343 +-0.0263675 0.107348 -0.0216948 +-0.0927086 0.12286 0.0332776 +-0.0661966 0.15171 0.0363078 +-0.0202018 0.177138 -0.0227808 +-0.0855834 0.141979 0.0409477 +-0.0504886 0.0946205 0.0445363 +-0.0604928 0.101522 0.0423039 +0.0379519 0.0659398 0.0354557 +-0.0840048 0.140674 0.0436515 +-0.0558989 0.109796 -0.0177742 +0.00991096 0.0343624 0.00242681 +-0.0506409 0.0514954 0.0146147 +-0.0324809 0.117911 -0.0127388 +-0.0621631 0.164652 -0.0535815 +0.0025214 0.130289 0.0235241 +-0.0506513 0.150706 0.0125676 +-0.0175006 0.0829087 0.0576844 +-0.00809599 0.0347439 0.04196 +-0.0340295 0.0384544 -0.00643688 +-0.0694928 0.101384 0.0400561 +0.0446992 0.0776181 0.0241159 +-0.0935142 0.126862 0.0142561 +0.0248702 0.121138 0.0274186 +0.00114443 0.118463 -0.015597 +-0.053795 0.115431 0.0343764 +-0.0905823 0.131055 0.0352302 +-0.00177837 0.0811944 -0.0365591 +0.0316669 0.110076 0.0318865 +0.0355137 0.0902592 0.0391607 +-0.0911524 0.122908 0.0442317 +-0.0909787 0.118866 0.0441649 +-0.0647368 0.0350417 0.0261211 +-0.0694997 0.166373 -0.0203616 +-0.0256221 0.0450194 -0.0280788 +-0.0652445 0.171051 -0.0600934 +-0.0773393 0.152802 -0.0018868 +-0.00223434 0.118045 -0.0151238 +-0.0662482 0.063188 0.0243484 +0.0400602 0.0922366 -0.00959201 +-0.00562712 0.0451708 -0.0285409 +0.000501495 0.0457296 0.0472541 +-0.0123701 0.125297 0.0298351 +-0.0778681 0.101964 -0.00928868 +-0.0609537 0.123826 -0.00859412 +0.0224677 0.112582 -0.013341 +0.00921575 0.0781468 -0.0329463 +-0.0349236 0.126603 0.0011375 +-0.00878487 0.0784493 -0.0377777 +0.00650569 0.075888 0.056486 +0.0412418 0.0802411 -0.00774788 +-0.093262 0.128309 0.02526 +-0.0314363 0.171254 -0.00518552 +-0.0520579 0.0336325 0.0248414 +-0.0815026 0.127419 0.0524098 +-0.0894637 0.136534 0.031204 +-0.084288 0.111698 0.0438155 +0.0333653 0.0918289 -0.0171871 +-0.0324333 0.126109 0.00355422 +-0.00141447 0.0391026 0.0304627 +0.00110904 0.0340429 -0.0196452 +-0.0650297 0.138462 -0.00769967 +-0.015954 0.105864 -0.0221228 +-0.0523859 0.0626167 0.0314055 +0.026783 0.122575 0.00815739 +-0.0385209 0.128019 0.0130694 +-0.029395 0.125597 0.00758806 +-0.0328882 0.0666632 -0.0184721 +-0.0494036 0.13704 0.0193807 +-0.0782331 0.109897 -0.00456592 +0.0157741 0.036715 -0.0196413 +-0.0294956 0.0660091 0.0384906 +-0.0679029 0.105215 -0.0140793 +-0.0620463 0.158428 -0.0205873 +-0.0703503 0.159267 -0.00619145 +-0.0378682 0.104226 -0.0203027 +-0.0918252 0.118761 0.028299 +-0.0411447 0.163664 -0.0114686 +-0.0574975 0.0426993 0.0453715 +-0.0747471 0.147201 -0.0128585 +-0.0134963 0.0744967 0.0564394 +-0.054142 0.0722337 0.0402304 +-0.0642908 0.169609 -0.0607929 +-0.0154978 0.0977476 0.0489325 +-0.0800099 0.07203 0.0185532 +-0.0921132 0.115989 0.0103178 +0.00725505 0.0754138 -0.0341479 +0.0536301 0.0568087 0.0282148 +-0.0479854 0.0346149 0.0371396 +-0.00149257 0.0746611 0.0586297 +0.0203189 0.05934 -0.026848 +-0.0115998 0.0391898 -0.02633 +-0.0295596 0.0663471 -0.0284716 +0.00348965 0.105764 0.0424132 +-0.0703543 0.0703917 0.033048 +-0.0606347 0.0629111 -0.00512698 +-0.01408 0.166026 -0.0199736 +-0.061044 0.0400333 0.0227114 +-0.0810735 0.143155 -0.000828212 +-0.0617474 0.0766736 -0.0179709 +0.0217467 0.124535 0.0248197 +0.00507814 0.101571 -0.0215886 +0.0346034 0.0592134 0.0376264 +-0.0712039 0.0342165 0.00436442 +-0.0288195 0.0384506 0.0326078 +-0.053518 0.1534 0.0145047 +-0.0556759 0.0661408 -0.010195 +-0.0677895 0.175109 -0.0580246 +-0.0699291 0.0421822 0.0072491 +-0.0067422 0.0741543 -0.0369448 +0.0199779 0.0885978 -0.0258535 +-0.0488263 0.0941792 -0.0218889 +0.0343607 0.0505331 -0.00657713 +-0.0725404 0.162229 -0.0113532 +-0.00793663 0.0384098 0.0134736 +-0.0556415 0.043673 0.0216881 +-0.0145298 0.100345 0.0444168 +-0.0815281 0.1484 0.0374104 +-0.0387388 0.0753845 -0.0180569 +-0.0116442 0.0481633 -0.0303354 +0.0363562 0.0559126 -0.00774494 +-0.0652193 0.1682 -0.0598394 +-0.0776736 0.10169 -0.00957801 +-0.0196644 0.0494984 -0.0297043 +-0.0282432 0.0763981 0.0437868 +-0.0328471 0.033696 0.0126517 +0.00347146 0.128699 -0.00262952 +0.0461484 0.0806375 0.015174 +0.0337656 0.111689 0.027893 +-0.0271752 0.172675 -0.0185845 +-0.0693701 0.141497 -0.00893397 +0.0317719 0.115994 -0.000976469 +0.0347163 0.0544411 -0.00865089 +-0.0651886 0.172101 -0.0460875 +-0.0678768 0.1616 -0.0125361 +-0.0634522 0.0423282 0.0135276 +0.0601313 0.0581272 0.0101639 +-0.0107388 0.117999 -0.0150205 +0.0339646 0.0916099 0.0404552 +-0.0498374 0.138571 0.0183794 +-0.0934962 0.117401 0.0173034 +0.0383972 0.0491164 -0.00642484 +-0.0280195 0.0378733 -0.0295429 +-0.0146147 0.12166 -0.00880985 +0.0372641 0.0686531 0.0362559 +0.0239959 0.0549509 0.0433236 +0.00994394 0.0362916 0.0335003 +-0.0208017 0.0799082 -0.0390716 +0.0233991 0.0534151 -0.0239637 +0.00722024 0.0851796 -0.0327872 +-0.0639758 0.128226 -0.00858393 +0.0238189 0.124864 0.00990899 +0.00150975 0.0474485 0.049901 +-0.0361905 0.168183 -0.0140562 +-0.0174884 0.0801344 0.0573382 +-0.0918829 0.116106 0.0333156 +0.00614351 0.12581 -0.00755937 +0.0340287 0.115127 0.0194375 +-0.0908622 0.135106 0.0192089 +-0.000650637 0.0496936 -0.0307015 +-0.0856199 0.144636 0.00717286 +0.0438423 0.0804362 -0.00278861 +-0.00949487 0.0503088 0.0507661 +0.0271211 0.103444 0.039376 +-0.0386188 0.04066 -0.0277325 +-0.0654456 0.154232 -0.00436037 +-0.0264896 0.100224 0.0439794 +-0.0715324 0.144165 0.0446205 +-0.0694829 0.118967 0.0529378 +0.0378869 0.110163 0.00793964 +0.0353212 0.108669 0.0283742 +0.0601522 0.0581329 0.0151721 +-0.0542607 0.057796 0.0208407 +0.00222051 0.130562 0.00190808 +-0.0641033 0.156361 -0.011127 +0.0432299 0.0944972 0.0241641 +-0.0229686 0.033489 -0.025736 +-0.0221215 0.127119 0.0131583 +-0.0671797 0.0604061 0.0141816 +-0.0288776 0.0903901 -0.0295833 +0.0603694 0.0609168 0.00815448 +-0.0494359 0.138587 0.00541192 +-0.0023893 0.0424447 0.047211 +-0.0543474 0.135324 0.0319505 +0.0228597 0.125444 0.016672 +-0.0334812 0.0737514 -0.024477 +0.0348071 0.0781711 0.0398247 +0.0054972 0.0547598 0.0532635 +0.00645879 0.122419 -0.0119062 +-0.0438011 0.128754 0.0022734 +-0.0849152 0.0791131 0.00550947 +-0.0506838 0.0678366 -0.0132392 +0.0126337 0.110109 -0.0186257 +-0.0497701 0.140145 0.0153991 +-0.0724387 0.0819305 0.0395669 +0.0576036 0.0717386 0.0163116 +0.00802743 0.0346823 0.0237027 +0.00218868 0.098191 -0.0260404 +-0.0368205 0.162344 -0.00074381 +-0.070799 0.0908224 -0.0163205 +-0.0539828 0.0700164 0.038652 +0.0135945 0.128354 0.000408423 +-0.0264981 0.0959784 0.0437675 +0.0190214 0.118116 -0.0113006 +-0.0618485 0.153752 -0.0205795 +-0.0552085 0.151192 0.0284379 +-0.0266144 0.0408668 -0.0293519 +0.00698354 0.131641 0.013682 +-0.0316463 0.0595496 -0.0164023 +-0.0758985 0.159659 -0.0269354 +-0.0491601 0.160603 -0.00598464 +-0.00858383 0.0384847 0.0096485 +-0.0717673 0.146065 -0.0213605 +-0.0899696 0.15095 0.0147905 +-0.00955085 0.0385956 0.00389466 +-0.0607249 0.0737695 -0.0169262 +-0.0751542 0.0995011 0.0375123 +-0.0707959 0.0850638 -0.0167146 +-0.0312047 0.123257 -0.00431908 +-0.053995 0.0675039 0.0372692 +-0.0419532 0.0345214 0.0385087 +-0.0289695 0.0380956 -0.0297496 +-0.0121936 0.163667 -0.0136225 +0.021294 0.0721108 -0.027322 +0.0597965 0.0678036 0.00914167 +-0.0657015 0.0736405 -0.0152375 +0.00697022 0.12731 -0.00520393 +0.033357 0.100796 0.0361067 +0.0587791 0.0686289 0.0199155 +0.00149398 0.0394449 0.0343588 +-0.0875531 0.12123 -0.000692815 +-0.0744527 0.154114 -0.0209063 +-0.0172261 0.0356447 0.0515267 +-0.0200013 0.0389743 0.053287 +-0.0569508 0.0343746 0.0319473 +-0.0184875 0.0829081 0.0576141 +-0.019368 0.183116 -0.0157888 +-0.0626506 0.153382 -0.0318715 +-0.00943219 0.095325 -0.0330289 +0.0431395 0.100108 0.0121576 +-0.0608162 0.0881975 -0.019441 +0.0357777 0.070014 0.0376374 +0.0505254 0.0735568 0.0151501 +0.0307633 0.0476275 0.0336614 +0.0294554 0.0416168 0.02991 +-0.0611913 0.173613 -0.0615062 +-0.0146115 0.109635 -0.0201085 +0.0379445 0.0686366 0.0354907 +-0.076675 0.154077 0.000107436 +-0.0315189 0.0351239 -0.0306591 +-0.0768434 0.109781 0.0434593 +-0.0522791 0.0490314 0.0356585 +-0.0380005 0.12652 0.0191796 +-0.0861323 0.103534 0.00440203 +-0.0659084 0.106679 -0.0142087 +0.000468869 0.0388702 -0.00172096 +-0.0623487 0.141045 -0.00649873 +-0.0484952 0.0862244 0.0454118 +-0.0685451 0.170527 -0.0328985 +-0.037499 0.101465 0.0412127 +0.0274201 0.0431121 -0.00573463 +-0.0197554 0.158352 -0.00754965 +-0.0567366 0.0753362 -0.0185878 +0.0533817 0.063336 -0.00140725 +0.0135006 0.105771 0.0435499 +-0.0631905 0.166285 -0.0395881 +-0.0932173 0.122834 0.0272862 +-0.0284888 0.0396421 0.053637 +-0.0134794 0.0559661 0.0512091 +-0.04424 0.130203 0.0124253 +0.0196407 0.0940896 -0.0236062 +-0.0625219 0.151129 0.0359075 +-0.0585008 0.0732388 0.0410714 +0.0608111 0.0651191 0.0151635 +-0.0275116 0.0560234 0.0370088 +-0.0127931 0.0799092 -0.038653 +-0.0544725 0.0478754 0.0402183 +-0.0905041 0.147099 0.0259896 +0.0291224 0.0877617 -0.0209279 +0.0381679 0.0993665 0.0307411 +0.00549435 0.0474709 0.0500045 +-0.0842531 0.102059 -0.0016008 +0.0164869 0.128389 0.00575868 +-0.043156 0.162156 -0.0100947 +0.0445553 0.0846952 0.000180444 +0.0409145 0.07739 -0.0077683 +0.0297353 0.111221 -0.00987421 +-0.0220481 0.0379707 0.0182323 +-0.0636401 0.0337302 0.00992182 +-0.0277909 0.0796672 -0.0363416 +-0.0247513 0.0944605 0.0453863 +-0.0291577 0.0733109 -0.0335988 +-0.0264744 0.0486202 0.0485825 +-0.0654948 0.104238 0.0403184 +-0.054309 0.153692 0.0171048 +0.000886988 0.0365316 0.0205866 +0.025787 0.114054 0.0339562 +-0.0624998 0.091833 0.0450322 +-0.0825753 0.107428 -0.000626511 +-0.0879726 0.100935 0.0073995 +-0.0849555 0.110375 0.0243559 +-0.00450509 0.0815118 0.0573962 +0.0411647 0.0886413 -0.00977915 +0.00923376 0.0823418 -0.0323881 +0.0250818 0.0983923 -0.0201688 +-0.0460388 0.0353834 -0.0203139 +-0.0563344 0.154371 0.0236088 +-0.0786725 0.15564 0.0171569 +-0.0174933 0.120917 0.0332266 +-0.0405771 0.0447491 -0.0223069 +-0.0706839 0.0363372 -0.00115986 +-0.0827485 0.134001 0.0496722 +-0.0566419 0.0336495 -0.0102846 +-0.0932956 0.12823 0.014251 +-0.0183957 0.116542 -0.0154107 +0.03698 0.0590759 0.0339965 +-0.0709427 0.132583 -0.00826816 +-0.0697213 0.0778913 -0.0154943 +-0.0222445 0.159024 -0.0114139 +-0.0571999 0.0684533 0.0375014 +-0.04663 0.0533425 -0.0102323 +0.00628325 0.0668147 -0.0324472 +-0.0477443 0.0767654 -0.0182192 +0.000336625 0.0525175 -0.0304496 +-0.0562455 0.0345922 0.0440034 +-0.00249349 0.0474079 0.0491587 +-0.00849662 0.115566 0.0401952 +-0.0346349 0.176996 -0.009991 +-0.0315471 0.0665587 -0.0224416 +-0.0114919 0.121016 0.0357517 +-0.00348929 0.0884115 0.0568027 +-0.0275554 0.0689002 0.0398598 +0.0463861 0.080656 0.0111753 +-0.0335046 0.109774 0.0374515 +-0.0104184 0.179993 -0.0295246 +0.0299649 0.0370453 0.0224182 +-0.0229027 0.109901 -0.0203838 +0.0326144 0.117295 0.0103313 +0.0369028 0.0954111 -0.0108822 +-0.0564742 0.041367 0.0464242 +-0.0770729 0.168746 -0.0303374 +-0.0310065 0.124592 0.0202545 +-0.06762 0.17339 -0.0440641 +-0.0124743 0.0632507 0.0548154 +-0.06879 0.067714 0.0304363 +-0.0188136 0.124392 0.0261122 +-0.0775236 0.155819 0.0175602 +-0.0744868 0.14835 0.0408614 +-0.0798509 0.120721 -0.00541034 +-0.0474977 0.0747299 0.0422594 +-0.0819076 0.08016 -0.00254028 +-0.0104535 0.0366522 -0.0168147 +0.0107598 0.0346122 0.0387698 +-0.0618853 0.158437 -0.0215849 +-0.0248668 0.103031 -0.023615 +0.0521945 0.0697716 0.0245573 +0.0156704 0.0936059 -0.0251021 +0.0371318 0.111041 0.00479819 +-0.0835634 0.0897492 -0.00557879 +0.00648846 0.118239 0.0378444 +-0.0454996 0.0464888 0.0408011 +0.00251072 0.0388788 0.0260522 +-0.0757603 0.10082 0.036651 +-0.072674 0.131225 0.051196 +-0.0107806 0.0770662 -0.0381287 +-0.0336363 0.153436 -0.00674709 +-0.0843022 0.0938821 0.0298739 +-0.00957953 0.177197 -0.0268263 +-0.06621 0.148552 -0.030869 +-0.0367939 0.127143 0.000444502 +0.0450752 0.0819431 0.00117926 +0.00252922 0.0387278 -0.0124032 +0.0124259 0.130345 0.00996559 +-0.039483 0.112566 0.0355031 +-0.0896451 0.11724 0.00430849 +-0.0307561 0.0876495 -0.0285591 +-0.0336555 0.0363317 0.0490618 +0.00481949 0.0349074 0.0372909 +0.0324749 0.095557 0.0400886 +-0.0601974 0.126918 0.041055 +0.0561271 0.0494063 0.0121912 +-0.0663732 0.0796127 0.0418746 +-0.0634873 0.105626 0.040045 +-0.0348887 0.174114 -0.0129217 +-0.0331172 0.123673 -0.00477506 +-0.0158191 0.0855498 -0.0389623 +-0.0630684 0.138136 0.036884 +0.00839558 0.0418967 -0.0238735 +-0.000234213 0.0957245 -0.0313684 +-0.00270805 0.0387067 0.00335713 +-0.0066107 0.0434378 -0.0261152 +0.0267348 0.0889072 0.0458132 +-0.057498 0.0762057 0.0428357 +-0.0559977 0.128155 -0.00607843 +-0.0652856 0.176792 -0.0608019 +-0.0847322 0.10481 0.00139005 +0.0045205 0.0842507 0.0571459 +-0.0540417 0.148675 -0.00217424 +0.00157845 0.0388465 -0.0127005 +-0.0649294 0.123847 -0.00887936 +0.0268943 0.0906576 -0.0219805 +-0.0692389 0.149629 -0.0402111 +0.0424058 0.101483 0.00416631 +-0.069135 0.0354547 0.0122501 +-0.0311414 0.168206 -0.0166543 +0.0247254 0.0405634 0.0363023 +-0.035656 0.0591967 -0.0115208 +-0.0492298 0.13342 0.00108021 +0.0186953 0.0943115 -0.0238444 +-0.0632815 0.159908 -0.0475928 +-0.0744952 0.144184 0.0450216 +-0.0273351 0.0750142 0.0443436 +0.0129485 0.0726239 0.0538836 +-0.0256504 0.178665 -0.00908499 +-0.0152817 0.126335 -0.00175389 +0.0171854 0.035921 0.00432788 +0.00536983 0.0385261 0.026955 +-0.069701 0.0749104 -0.0135814 +-0.0936513 0.125496 0.0142597 +-0.0218218 0.0854612 -0.0381675 +-0.0670338 0.0819342 0.0426575 +-0.0637771 0.0824308 -0.0191299 +-0.0579197 0.0410941 0.0197057 +0.004329 0.114453 -0.0192954 +-0.0743852 0.111313 0.0463698 +0.0153242 0.0566704 -0.0288596 +0.0201589 0.0349933 -0.00358051 +-0.0674387 0.0336478 0.00564073 +0.0380425 0.109755 0.0161689 +0.0214264 0.0348625 -0.00133145 +0.0129483 0.0405423 0.0447572 +-0.00171529 0.0627358 -0.0345403 +-0.0206569 0.0494682 -0.0293042 +0.0369479 0.0784891 -0.0137448 +-0.0877279 0.139146 0.00920485 +-0.0228745 0.0383806 -0.00412065 +0.0407791 0.105635 0.00716484 +-0.0164884 0.161116 -0.0081783 +0.0261701 0.115347 0.0327443 +-0.0171143 0.0393698 0.0395766 +0.0364251 0.0840505 -0.0167267 +-0.0413094 0.0336719 -0.0183114 +-0.00449481 0.0619627 0.0557718 +0.0354002 0.054813 0.0334165 +0.0257124 0.0795754 0.0477924 +-0.0900689 0.132434 0.0392074 +0.0111597 0.124256 -0.00791398 +0.023574 0.105697 0.0395934 +0.0172046 0.061784 0.0493931 +-0.0738846 0.110669 -0.00843945 +0.00601824 0.128477 0.0276707 +-0.0581623 0.155642 0.0142378 +-0.046474 0.0903329 0.04369 +-0.0204963 0.0988407 0.0444811 +0.0448392 0.0847511 0.0231667 +-0.0246346 0.0464142 -0.0272665 +-0.0164056 0.0347921 0.0489909 +-0.048358 0.146267 0.00883601 +-0.0626778 0.0407451 0.0424121 +-0.06586 0.154377 -0.00304604 +0.0375072 0.103901 -0.00584413 +-0.00221994 0.0380783 -0.0146251 +0.00247871 0.110023 0.0425049 +0.0588331 0.0552392 0.0181818 +-0.0156079 0.0352742 -0.0184368 +-0.0112854 0.0344473 -0.0186905 +-0.0170355 0.0338392 -0.0211402 +-0.0137571 0.128142 0.00234571 +0.0353694 0.082169 0.0388786 +-0.065182 0.160968 -0.0576695 +-0.0324895 0.0874934 0.0434306 +-0.0637445 0.0781022 -0.0180675 +-0.0882379 0.0914593 0.00646904 +0.0256941 0.120543 -0.00190068 +-0.0750751 0.149943 -0.025867 +-0.0477253 0.135673 0.0140062 +-0.0678845 0.116524 -0.00880656 +-0.0627671 0.15529 -0.013592 +-0.0588282 0.0408079 0.0456406 +-0.056691 0.0506774 -0.00137882 +-0.0828622 0.0910525 -0.0066104 +-0.0499126 0.0515141 0.0166499 +-0.0490107 0.146266 0.00962371 +0.0122318 0.130219 0.0070475 +-0.0116803 0.0570084 -0.0342026 +-0.0651676 0.167884 -0.0330971 +-0.0730453 0.0699885 -0.00346826 +0.0174821 0.0990004 0.0469682 +-0.0908453 0.133761 0.025216 +-0.0657306 0.150277 -0.0347821 +-0.0671422 0.159475 -0.0561779 +-0.00377564 0.078412 -0.0370359 +-0.0617811 0.042326 0.0146867 +-0.0252077 0.0348536 0.0435448 +-0.028493 0.0602587 0.0370952 +-0.08903 0.119932 0.00232561 +-0.0345174 0.105629 0.0392495 +-0.0234134 0.181486 -0.0190275 +-0.0664685 0.0611724 0.00451786 +0.0367619 0.0414833 0.0270934 +-0.0275613 0.121213 -0.00819283 +0.0347392 0.0848817 0.0397697 +-0.0655835 0.0626949 -0.00273961 +-0.0187525 0.0671388 -0.037784 +-0.0904123 0.13106 0.0392156 +0.0183728 0.0521803 -0.0265242 +-0.0394837 0.113931 0.0345962 +-0.050497 0.0848226 0.0453947 +-0.026736 0.125755 0.00710307 +-0.0284884 0.0890334 0.0453918 +-0.0441667 0.0657175 0.0402548 +0.0109368 0.035027 0.0276086 +-0.0219243 0.0335307 -0.0255712 +-0.0865855 0.100865 0.00437928 +-0.0114057 0.038823 -0.00778731 +-0.0606205 0.136712 0.0351771 +-0.0938957 0.124187 0.0252761 +-0.0877217 0.151511 0.024071 +0.0027861 0.0392982 -0.00725238 +-0.0435747 0.127942 -0.00117905 +0.00626863 0.114136 -0.0189815 +-0.0182416 0.0386382 0.0310248 +-0.065785 0.145733 -0.0198954 +-0.0867571 0.0833567 0.0144816 +0.0263294 0.0517767 -0.02097 +0.0205436 0.0357642 -0.00368285 +-0.0174561 0.0544373 0.0497557 +0.0051136 0.11017 -0.0202785 +0.0320036 0.0972394 -0.014969 +0.018368 0.0537078 -0.0275601 +0.00449367 0.115547 0.0400425 +0.030957 0.0564285 0.0393343 +-0.0480871 0.166778 0.00155196 +-0.0374511 0.122567 -0.00961353 +-0.067466 0.154933 0.00219081 +-0.0645473 0.0334176 0.0010517 +-0.0507826 0.0530079 0.0196214 +-0.0269873 0.0549465 0.0375414 +-0.0318114 0.0361324 -0.0187 +0.0211923 0.12581 0.0217553 +-0.0485738 0.111377 -0.0178292 +-0.0790938 0.10996 -0.003593 +0.0410408 0.0408917 0.00130956 +-0.0171973 0.174198 -0.0240623 +-0.0136738 0.0526181 -0.0325173 +-0.0194987 0.0828823 0.05729 +-0.00149547 0.119691 0.0381347 +0.0125362 0.127772 -0.00169738 +0.00352032 0.0772514 0.0561756 +-0.0037108 0.0392109 0.0335024 +-0.0682887 0.164315 -0.0170259 +-0.0861823 0.107654 0.00936346 +0.0116633 0.0616767 0.0519085 +-0.0828359 0.104706 -0.00261356 +-0.0473623 0.129578 0.0262098 +0.0143608 0.0508459 -0.0270896 +-0.0265586 0.171236 -0.0104749 +0.0203688 0.0459169 -0.020834 +-0.0404996 0.0591463 0.0404229 +-0.0164937 0.0758406 0.0558352 +-0.00649647 0.0898144 0.056995 +-0.070489 0.118975 0.0531649 +-0.0665486 0.169315 -0.0336077 +-0.0869443 0.101766 0.0237835 +0.0413201 0.104267 0.012164 +-0.0705201 0.0646959 0.0221381 +-0.0345088 0.104256 0.0402356 +0.0590657 0.0691634 0.0182335 +0.0274527 0.103904 -0.0160338 +-0.0321732 0.0461161 0.0457813 +-0.0446011 0.0519723 -0.0106716 +-0.0932418 0.125562 0.0272746 +-0.0458642 0.128671 0.00011454 +-0.0885465 0.0902329 0.022415 +-0.0693724 0.136902 0.0471868 +0.0383558 0.102292 -0.0062663 +-0.0638617 0.125566 0.0463833 +-0.017504 0.0870094 0.0567302 +-0.0370734 0.0393951 0.0451959 +0.00329134 0.119473 -0.0147093 +-0.0543235 0.0334648 0.00849253 +0.0274945 0.0381011 -0.00197122 +-0.0703836 0.151592 -0.0450749 +0.0441667 0.0973563 0.00616912 +0.0240844 0.0547426 -0.0237664 +-0.015779 0.0770791 -0.0385675 +-0.0731035 0.0667848 0.0215468 +0.0455074 0.0569933 0.0321208 +-0.0438752 0.128361 0.000408951 +-0.0622566 0.0709345 0.0378148 +-0.0713089 0.156055 0.0109968 +0.0323876 0.047596 -0.00623106 +-0.0610541 0.068813 0.0363796 +-0.0175437 0.119111 -0.0121224 +-0.0136792 0.0541002 -0.0332811 +-0.0477406 0.135604 0.0113959 +-0.0709176 0.112214 -0.00951227 +0.0301974 0.0887542 -0.0200097 +-0.0734581 0.168 -0.0440151 +-0.0685258 0.165031 -0.0185494 +-0.0264962 0.0690788 0.0415599 +-0.0249134 0.0383716 -0.00452352 +-0.086697 0.114875 0.0460769 +-0.0752073 0.156095 0.0183637 +-0.0189411 0.0376177 0.0530488 +-0.0634886 0.064446 0.0291098 +-0.0261594 0.066324 0.0406106 +-0.0142604 0.0974009 0.0506069 +-0.0316679 0.0763713 -0.0315414 +-0.040787 0.0855384 -0.021437 +0.0590343 0.06983 0.00945078 +-0.07763 0.165322 -0.0259443 +-0.0631195 0.176032 -0.0554618 +-0.0918958 0.129686 0.0292517 +-0.029505 0.0545565 0.0362962 +-0.0356809 0.123888 -0.0070042 +0.0421291 0.070468 -0.00580336 +0.0297749 0.0920783 -0.0194766 +-0.0415439 0.148326 -0.00168489 +-0.090059 0.136447 0.0142016 +-0.0555057 0.0946 0.044463 +-0.0945025 0.125547 0.0202583 +-0.0304869 0.0532061 0.0367531 +0.00830607 0.0917456 -0.031199 +0.0182274 0.125477 -0.00123802 +0.0138055 0.0712841 0.0533593 +0.0294478 0.0506302 0.0370841 +-0.0802909 0.104732 0.0311813 +0.0308738 0.115323 0.0282321 +-0.0889738 0.137888 0.0281941 +-0.0750897 0.149941 -0.0248696 +0.0395014 0.0469731 0.0315971 +-0.0599935 0.0586398 0.0172334 +-0.0790056 0.166641 -0.0359617 +-0.00233373 0.114874 -0.0177321 +-0.0241436 0.180147 -0.0104229 +-0.0746876 0.0700138 0.0272066 +-0.00503592 0.13043 0.00494647 +-0.069435 0.179317 -0.0579979 +-0.0896062 0.137812 0.0131974 +-0.0625358 0.155244 -0.0346054 +-0.071543 0.155755 0.00800576 +-0.0746181 0.165272 -0.019163 +-0.0386347 0.0548667 -0.0110053 +0.00350742 0.103001 0.0436938 +-0.0629079 0.15056 -0.0255866 +0.0200283 0.0371524 -0.00668325 +-0.0375331 0.127856 0.0134298 +-0.075576 0.155851 0.0124034 +-0.0145239 0.118305 0.0371093 +-0.0528711 0.15259 0.0147483 +-0.0639569 0.158297 -0.0475943 +-0.0437953 0.0869983 -0.0218056 +0.0183 0.0651194 -0.0285252 +0.0410434 0.0689808 -0.00777311 +-0.0391241 0.157933 0.00465789 +-0.0617079 0.155317 -0.0205813 +0.049194 0.055373 0.030576 +-0.0577821 0.0826022 -0.0210434 +0.00750154 0.123796 0.0339733 +-0.0844011 0.0777797 0.0105147 +-0.0508742 0.137048 0.0234112 +-0.0487311 0.13178 0.0269763 +-0.0224768 0.123487 0.0248086 +0.0572102 0.0550739 0.00417234 +0.0523558 0.0647992 0.0281407 +-0.0804668 0.131637 0.0521945 +0.0276827 0.0480336 -0.0156964 +-0.0121824 0.178673 -0.0292354 +-0.0228778 0.10587 -0.0225138 +-0.0644637 0.0743344 0.0396953 +-0.0655821 0.153706 -0.0431373 +-0.0176845 0.0525387 -0.0318817 +0.0256228 0.0363687 8.49366e-07 +-0.0208533 0.0866413 0.055877 +-0.0490886 0.157599 -0.00632625 +0.00958152 0.0417197 0.0451866 +-0.0135001 0.0800899 0.0570677 +-0.0885594 0.112819 0.0222051 +0.0440561 0.0945388 0.0201582 +0.00630898 0.0624816 -0.0315869 +-0.0560997 0.155362 -0.00113519 +-0.0238123 0.0867774 -0.0372362 +-0.0711896 0.155374 -0.0449035 +0.018728 0.0549999 0.0480114 +-0.0696134 0.172257 -0.054028 +-0.00359831 0.101107 0.0440537 +-0.033095 0.0723179 -0.02347 +0.0338305 0.107861 -0.00824999 +-0.0354812 0.0383051 -0.00290933 +-0.0238593 0.0838986 0.0547079 +0.0239371 0.103424 0.0418106 +-0.076687 0.14724 -0.00686649 +-0.0113442 0.129847 0.0112634 +-0.0595215 0.131137 0.0385262 +-0.00250336 0.0633801 0.0564795 +-0.0765967 0.152807 -0.00988734 +0.00617007 0.126444 0.0306412 +0.0264293 0.0400385 -0.00421056 +-0.0261224 0.165258 -0.0166522 +-0.00669164 0.129496 0.00145082 +-0.0531001 0.154605 -0.00338641 +0.0347186 0.113797 0.00249877 +-0.0746345 0.0660496 0.0075612 +-0.0897609 0.0915993 0.0164407 +-0.0848984 0.0965537 0.0289739 +-0.0217829 0.111029 -0.0195757 +-0.0890662 0.123985 0.0032876 +0.0609254 0.0637423 0.0131584 +-0.0495476 0.147557 -0.00269468 +-0.00609162 0.0391352 -0.0126175 +-0.047607 0.144918 0.0010701 +-0.0484709 0.165547 -0.00491912 +0.0489576 0.0466396 0.0248167 +-0.0391315 0.160685 -0.012118 +-0.0530423 0.14778 0.0224018 +-0.0471085 0.0683456 0.0397676 +-0.0785029 0.128864 0.0532728 +0.0368255 0.109713 0.0241821 +0.0163171 0.0686116 0.0516854 +-0.0729482 0.0914984 0.0411605 +-0.0805357 0.113778 0.0465863 +0.0302378 0.0727042 0.0419554 +-0.0625354 0.122703 0.0447625 +-0.0615083 0.170965 -0.0565878 +-0.0124852 0.0659775 0.0542376 +0.0219313 0.0605513 0.0474343 +-0.048186 0.135579 0.00839494 +-0.014696 0.0585192 -0.0354314 +-0.0818834 0.109932 0.0368633 +-0.0564976 0.101562 0.0427397 +-0.0692156 0.0343564 -0.00463486 +-0.0924819 0.125444 0.00927262 +-0.0116015 0.0406252 -0.0263738 +0.000388646 0.0448955 -0.0263577 +-0.0474886 0.05462 0.0367747 +-0.0150651 0.12575 -0.00315467 +-0.0225002 0.104414 0.0430095 +-0.016108 0.038364 0.00641286 +-0.0474972 0.105664 0.0404447 +0.053572 0.0650953 0.0274823 +-0.068963 0.0874301 0.0429809 +-0.0206158 0.0422474 -0.0286271 +-0.0745126 0.131657 0.0521168 +0.0246516 0.122175 0.000230276 +-0.00982514 0.16696 -0.0220459 +-0.00885716 0.0385311 0.024037 +-0.0568241 0.063612 0.0312362 +-0.0787856 0.109366 0.039802 +0.0392221 0.075321 0.0338531 +-0.0725057 0.102685 0.0380563 +0.0318729 0.0380045 0.0237472 +-0.0704322 0.13832 0.0474328 +-0.0325018 0.177105 -0.00443384 +-0.0226059 0.0381278 0.0251854 +-0.00949201 0.129843 0.00617837 +-0.00878563 0.110674 -0.0212403 +0.0347324 0.0882263 -0.0174421 +-0.046782 0.0841151 -0.0215173 +-0.0692662 0.0692944 0.0324707 +0.00925419 0.0696192 -0.0318888 +-0.0303184 0.0423041 0.0510935 +-0.0780856 0.0784826 -0.00760345 +0.0256389 0.0929167 0.0460121 +0.00457646 0.108164 0.0418882 +-0.0519222 0.0461016 0.019678 +0.00234204 0.0367065 0.0225428 +0.0457266 0.0847913 0.00519644 +0.0292205 0.0857953 -0.020938 +-0.0196964 0.0384682 0.0290787 +0.0127826 0.0926962 0.0520031 +0.0390362 0.0980073 0.030266 +0.0186124 0.127837 0.0122439 +-0.0535608 0.0430661 -0.00900679 +-0.0509276 0.0346131 0.0417321 +0.0233086 0.0634336 -0.024957 +0.00850697 0.0546686 0.0524774 +-0.0275662 0.123979 -0.00112939 +-0.0688326 0.13265 0.047942 +0.0112159 0.0922395 -0.029689 +0.00233442 0.0539469 -0.0306143 +-0.0446508 0.040942 -0.0182992 +-0.00948977 0.114167 0.0408028 +0.0254079 0.10205 -0.0180571 +-0.0850056 0.146006 0.00617966 +-0.00850241 0.0870443 0.0572609 +0.0097783 0.1251 0.0319006 +-0.0222638 0.126605 0.016039 +-0.0722117 0.0348867 0.00176609 +-0.0327045 0.111423 -0.0179721 +-0.057835 0.0897878 -0.0213715 +-0.076573 0.153595 0.0311713 +0.0595629 0.058084 0.0191786 +-0.0323163 0.155148 0.000487548 +0.0120506 0.0505153 0.0488388 +-0.0524497 0.140085 0.0234103 +-0.0325359 0.172727 -0.00270207 +-0.0711683 0.149278 -0.039104 +-0.0641214 0.155412 0.0266328 +0.0288394 0.112544 -0.00929606 +-0.0217358 0.0384567 0.028668 +-0.0719124 0.168014 -0.0470137 +-0.0448486 0.0351369 -0.0234128 +0.0159855 0.12897 0.0112743 +0.0311432 0.0373381 0.0223917 +-0.000793766 0.0867716 -0.0355698 +-0.0900654 0.132428 0.033223 +-0.0935895 0.122834 0.0262964 +-0.0520638 0.0723523 0.0405753 +-0.0111299 0.129809 0.0171219 +-0.0491641 0.0344528 0.0317811 +-0.0849325 0.0938555 0.0290926 +-0.0809703 0.132422 -0.00393108 +-0.0887798 0.140493 0.0370948 +-0.0577868 0.0840301 -0.0211707 +-0.0814849 0.0872077 0.0329213 +0.0191348 0.102061 0.0453843 +0.0573171 0.0523102 0.00718519 +0.039991 0.0847392 0.0332858 +-0.0668403 0.0335301 0.004077 +-0.0117893 0.0392416 0.0372019 +0.0216437 0.120011 -0.00733339 +-0.0125093 0.0883992 0.0567932 +-0.0378236 0.125803 -0.00505851 +-0.0750347 0.154671 0.0286993 +-0.0887093 0.112351 0.0387402 +-0.0638899 0.102518 -0.0176142 +-0.0600535 0.138395 -0.00620678 +-0.0103882 0.129888 0.00873113 +-0.0610188 0.119808 0.0416066 +0.0158574 0.104091 -0.0202309 +-0.0839121 0.122095 -0.00374203 +-0.0841686 0.143365 0.0409129 +-0.00166671 0.12799 -0.00382866 +-0.0434723 0.0647942 0.0406198 +0.0406639 0.0815903 -0.00978474 +-0.0652464 0.154114 0.00157024 +-0.0257535 0.0740897 -0.0368116 +-0.0739579 0.13841 -0.00677972 +-0.0288788 0.0592582 -0.0244095 +0.0093177 0.0926652 -0.0301396 +-0.0452267 0.150119 -0.00491516 +-0.0319894 0.0384633 -0.00603174 +-0.0794952 0.0854073 -0.00956797 +-0.0675492 0.129835 0.0480321 +-0.0523266 0.033478 -0.00194369 +-0.00450192 0.0718383 0.058171 +-0.0535372 0.0578641 0.0215172 +-0.0140108 0.0596764 0.0527295 +-0.000532268 0.111266 -0.0199168 +0.0523683 0.0540101 0.0281247 +0.0211966 0.123092 -0.002693 +-0.00468835 0.0598784 -0.0344633 +-0.0718785 0.102239 -0.0132694 +-0.0678239 0.15109 -0.0436673 +0.0350895 0.0686836 0.0383949 +0.0422361 0.101506 0.0151693 +0.0317521 0.0794454 -0.0197442 +-0.0577724 0.0796775 -0.0200459 +-0.0461631 0.0335506 -0.0117706 +-0.0827169 0.105982 0.0279083 +-0.0922534 0.122854 0.0424865 +0.0128317 0.0712714 0.0536973 +-0.0126798 0.126321 -0.00380105 +-0.00116162 0.0980337 0.0521962 +-0.0814909 0.0788596 0.028943 +-0.0501013 0.15611 -0.00554414 +0.00939521 0.0609325 -0.0302492 +-0.030101 0.160758 -0.0141091 +-0.031497 0.117989 0.0308563 +0.0231755 0.0916964 -0.0230758 +0.0434109 0.0987186 0.0151565 +-0.0514982 0.108428 0.0386132 +-0.0644896 0.0833289 0.0440861 +-0.0238622 0.101613 -0.0238665 +0.04258 0.0422624 0.0239479 +0.0354547 0.103863 -0.00997386 +0.0217345 0.0994968 0.0456553 +-0.0743457 0.168929 -0.0264214 +0.01504 0.0343531 -0.00213727 +0.00148487 0.0399885 0.0464307 +0.0273636 0.0699427 0.0430425 +-0.0548013 0.086928 -0.0216118 +-0.0729344 0.0901459 0.0411907 +0.0305961 0.110839 -0.00946183 +-0.0721093 0.0846859 0.0405598 +-0.067036 0.180898 -0.0568882 +0.0496382 0.068363 0.00147832 +-0.0149904 0.165173 -0.0188028 +-0.0928971 0.117368 0.0123132 +-0.000378579 0.101174 0.0451223 +-0.00167056 0.0392225 0.0339103 +0.0308479 0.0567691 -0.0158074 +0.00821609 0.0823703 -0.0328688 +0.0179771 0.0393777 0.0432522 +-0.0917891 0.141969 0.0171701 +0.0284614 0.0398271 -0.00325429 +-0.0273719 0.0335777 -0.022929 +-0.0799767 0.138308 -0.00390962 +0.0224205 0.0519815 -0.0241272 +-0.0206006 0.0393656 -0.0285093 +-0.075081 0.147222 -0.0118498 +-0.0748806 0.0992858 -0.0126164 +0.0126717 0.127043 -0.00291981 +-0.0321779 0.0474216 0.0442941 +0.0248435 0.0822524 0.0483141 +-0.087169 0.0964235 0.0255876 +-0.00114332 0.0356309 -0.0159104 +-0.0674627 0.138295 0.0446438 +-0.0656974 0.169193 -0.0361564 +-0.065794 0.155512 0.00862557 +0.0346025 0.0754478 0.0394941 +-0.0145323 0.043279 0.0510718 +-0.0739879 0.139879 -0.00672352 +-0.0921938 0.132347 0.0162256 +-0.077508 0.174998 -0.0490226 +-0.0161182 0.180144 -0.0199393 +0.0442692 0.0973579 0.00816486 +-0.0885535 0.112746 0.0331115 +-0.0527601 0.0447727 0.0186838 +-0.0301237 0.12585 0.013192 +-0.0359512 0.151053 -0.00163407 +-0.0579079 0.121934 -0.00872095 +-0.0709562 0.158172 -0.0439179 +-0.00996463 0.114432 -0.0172214 +-0.0308542 0.0986541 -0.0229751 +-0.0199407 0.0381449 0.0130842 +-0.0439068 0.129921 0.011069 +0.0290675 0.120111 0.00471365 +-0.0203588 0.175699 -0.0155519 +0.0542673 0.0491964 0.0212031 +-0.0348545 0.0986254 -0.0227182 +0.0413986 0.0830578 -0.00877387 +-0.0554939 0.0477978 0.0398952 +-0.0760774 0.166574 -0.0390172 +0.0438486 0.0846749 0.0261721 +0.0021495 0.0388151 -0.00319944 +0.04114 0.104231 0.00317036 +0.0165359 0.0912212 -0.0265781 +-0.0518469 0.0545626 0.0286406 +-0.0568589 0.0562507 0.00563881 +-0.0383911 0.127983 0.00280515 +-0.0857603 0.130763 -0.000714461 +-0.0173678 0.0389666 0.0345056 +-0.0266954 0.125077 0.00273937 +0.0143393 0.0349605 0.0410018 +0.0132369 0.0709965 -0.0314873 +-0.0317622 0.0338243 0.0127586 +-0.0767072 0.0724697 0.0281768 +-0.0694593 0.040787 -0.000292884 +0.013984 0.129601 0.0176686 +-0.00527436 0.124342 -0.0098488 +-0.0749724 0.149924 -0.0268701 +-0.0188238 0.0855077 -0.0385626 +-0.0577531 0.141417 -0.00374252 +-0.0506075 0.0335251 -0.00346549 +-0.0105008 0.103039 0.0436514 +-0.062498 0.0847471 0.0443617 +-0.0166725 0.0495705 -0.0306349 +-0.0368813 0.108512 -0.0198737 +0.0510305 0.0733741 0.0168194 +-0.0275083 0.112548 0.0360564 +-0.0636421 0.0627085 -0.00368166 +0.0411669 0.104244 0.0141607 +-0.00149973 0.0965741 0.0536819 +-0.0288186 0.0862428 0.0454609 +-0.0526183 0.0343668 0.0293685 +-0.0601235 0.15512 0.0251504 +-0.0378644 0.111663 -0.0181901 +0.0344602 0.0726275 -0.0157808 +-0.0144826 0.0530653 0.0501401 +-0.0700881 0.131265 0.0496481 +-0.0878883 0.0914318 0.00546674 +-0.0415923 0.0491549 -0.0111971 +0.0234288 0.0618809 0.0460892 +-0.0630663 0.151874 -0.00782908 +-0.0866506 0.128453 0.0480393 +-0.0781275 0.152854 0.000107941 +-0.0106285 0.174518 -0.0286758 +-0.0596993 0.0345337 0.0416145 +-0.0579832 0.0466328 -0.00336399 +-0.0265008 0.124041 -0.00116405 +-0.0254725 0.0400777 0.0541415 +-0.0178664 0.12824 0.013233 +-0.0206926 0.0385034 0.0288434 +-0.0534934 0.0747559 0.0420439 +-0.0652623 0.158339 -0.0115587 +-0.0767656 0.152802 -0.00889022 +0.0245199 0.0520168 0.0405174 +0.0264125 0.0450979 -0.0096842 +-0.012488 0.107228 0.0430572 +-0.078668 0.170753 -0.0430283 +-0.0625286 0.164689 -0.038593 +-0.0241791 0.159685 -0.00173809 +0.00849261 0.092349 0.0531984 +-0.0759472 0.132533 -0.00707033 +-0.0806057 0.0720192 0.00754007 +0.00646347 0.117501 -0.0166002 +-0.0178266 0.0947205 0.0526193 +0.000481761 0.10723 0.0430499 +-0.013526 0.162053 -0.0127433 +-0.0186103 0.042208 -0.0281438 +-0.0252891 0.0336623 -0.0225985 +0.00751041 0.0688465 0.0554032 +0.0252903 0.0675893 -0.0238235 +-0.065902 0.112354 -0.012152 +-0.0476622 0.0620749 -0.0123691 +-0.0940806 0.122789 0.0152778 +-0.0229201 0.115998 -0.0147881 +-0.0344826 0.0519106 0.0380623 +-0.0890068 0.11621 0.0451247 +0.0107555 0.0404168 0.045078 +-0.0894686 0.136415 0.011209 +-0.0757697 0.145819 -0.00688494 +-0.071833 0.152571 -0.043913 +0.0235861 0.0352777 0.0154316 +-0.0926495 0.129588 0.0122381 +-0.0647445 0.0780775 -0.0178137 +-0.00582898 0.0896214 -0.0360418 +0.0559073 0.0721087 0.0082759 +-0.0261702 0.0823861 0.0514348 +-0.0558857 0.0970202 -0.0212239 +-0.0630553 0.148575 -0.0182369 +0.00714931 0.123902 0.0338795 +0.0304322 0.0902625 -0.0195701 +-0.0137593 0.0388335 -0.0101314 +0.0427673 0.0818692 0.0284169 +-0.0651233 0.155698 0.0103085 +-0.0897032 0.113874 0.0229056 +-0.0447211 0.129823 0.00637961 +-0.0575 0.0588269 0.0212602 +0.0104936 0.11823 0.0368787 +0.0202805 0.12337 -0.00295598 +-0.0340138 0.155107 0.00155033 +0.0602047 0.0622908 0.0181797 +-0.0859874 0.153017 0.0132012 +0.0433237 0.0846089 -0.00479162 +-0.0678527 0.0937535 -0.0166708 +0.0608755 0.0651235 0.0141559 +-0.0737739 0.0878479 -0.0153893 +0.0296171 0.11988 0.0191943 +-0.00324005 0.038276 0.0477168 +-0.0806315 0.139432 0.0474021 +0.0455013 0.0583861 0.0319381 +-0.0740734 0.172255 -0.0349568 +0.0224678 0.0975265 0.046211 +-0.0525514 0.0389481 -0.0113995 +0.0281531 0.119463 0.0257844 +-0.0765864 0.155527 -0.0189073 +-0.0289503 0.0931616 -0.025199 +-0.0573663 0.0338673 0.0217593 +0.0396386 0.064502 0.0326274 +0.00539495 0.0433546 -0.0245866 +0.0256558 0.0782254 0.0477034 +0.0162437 0.0764684 -0.0291666 +0.0272037 0.100805 0.0412523 +-0.0316694 0.0357391 0.0272619 +-0.0623836 0.163119 -0.0315939 +0.0275463 0.095549 0.0435012 +0.0393856 0.0475887 -0.00567863 +-0.0394934 0.163848 0.00245451 +0.0242993 0.0928305 -0.0222726 +-0.0271788 0.0358787 -0.0194139 +-0.0734977 0.124615 0.0532793 +-0.0883817 0.123968 0.00128346 +-0.0257849 0.174205 -0.0110873 +-0.0281104 0.163768 -0.0157424 +-0.0662143 0.0386042 0.0318887 +-0.0109132 0.103533 -0.0236899 +-0.0616548 0.140062 -0.00630976 +-0.060057 0.135486 -0.00665791 +0.0434691 0.0624283 0.0290897 +-0.0236196 0.0436733 -0.0286374 +0.043495 0.0610671 0.0301862 +-0.0910584 0.133686 0.0122173 +0.0291029 0.0938741 -0.0193597 +-0.0261534 0.0383869 0.0314189 +0.00850666 0.0896726 0.0548038 +-0.0247527 0.0340557 -0.0209813 +-0.0186132 0.0436215 -0.0279143 +-0.0124858 0.0911558 0.0565265 +0.0053433 0.0524636 -0.0297405 +0.0403239 0.0999619 0.0261672 +-0.0522155 0.149331 0.0183918 +-0.0534968 0.0973516 0.0432358 +-0.0284959 0.10431 0.0415782 +-0.0908913 0.139194 0.0171389 +0.0264487 0.0948748 -0.0204583 +-0.0834511 0.149763 0.0335021 +-0.00425208 0.0941246 -0.0337645 +-0.0337113 0.0652961 -0.0165207 +-0.0405229 0.128682 0.00643622 +0.025364 0.0547555 -0.0216571 +0.0209176 0.124997 0.0245115 +0.0147936 0.104084 -0.0202238 +-0.0510936 0.156101 -0.00485677 +-0.00104637 0.116277 -0.0172455 +-0.0564804 0.0613799 -0.00459099 +-0.0261657 0.11885 -0.0117616 +-0.0612216 0.155927 0.0131437 +-0.0264503 0.181668 -0.00853376 +0.0163083 0.0594423 -0.028212 +-0.0188061 0.081321 -0.0390856 +-0.0660982 0.156586 -0.0534726 +-0.0596936 0.155857 0.0122367 +-0.0656404 0.0608118 0.00501538 +0.00550383 0.0716948 0.0562222 +-0.0473457 0.134062 0.00939848 +0.0233312 0.0436331 0.0404882 +0.0342215 0.0827959 -0.0185003 +0.00407718 0.131556 0.00833758 +-0.0524976 0.0931679 0.0439324 +-0.0206125 0.0553712 0.0467047 +-0.0499367 0.0345722 0.0419808 +-0.0720303 0.169416 -0.0480254 +0.0463102 0.0820482 0.0101764 +0.0239273 0.0383233 0.0327312 +-0.0556472 0.0657358 0.0349277 +0.0082124 0.0879974 -0.0324239 +-0.0483251 0.123967 0.0299918 +-0.00979541 0.0826872 -0.0380854 +-0.0104818 0.0688481 0.0551963 +-0.0738713 0.116445 -0.00712552 +-0.0783268 0.0804305 0.0341941 +-0.0318616 0.0386777 -0.0303614 +-0.0685663 0.0335043 0.000153325 +0.0419445 0.0972272 0.0251571 +-0.0324967 0.0831278 0.0417023 +-0.0385753 0.165326 0.00202421 +-0.0574991 0.105703 0.0407441 +-0.0735089 0.120392 0.0535609 +-0.0194999 0.105809 0.042534 +-0.0918084 0.11461 0.0202058 +0.0373089 0.0604869 0.0345236 +-0.0397982 0.0885212 -0.0227204 +-0.0838603 0.0771078 0.0156983 +-0.0683511 0.16683 -0.0228013 +0.00825384 0.0357096 0.0264477 +-0.0487592 0.0797294 -0.0200154 +-0.067984 0.13847 -0.00792156 +-0.0205709 0.127392 0.00935219 +0.0158596 0.0940217 0.0494261 +-0.00476401 0.100643 0.0463697 +-0.0144795 0.0617481 0.0535104 +-0.0635003 0.0931972 0.0443921 +-0.06148 0.0371866 -0.00855801 +-0.0235696 0.0368882 0.0541538 +-0.00084278 0.129714 0.0251926 +-0.0857238 0.0792489 0.0165033 +-0.00382707 0.0868147 -0.0366286 +-0.0623716 0.0433162 0.04063 +-0.0481783 0.127343 -0.00452632 +0.0258208 0.0577421 -0.0227411 +-0.0464997 0.109825 0.0383354 +-0.0632202 0.150553 -0.0275915 +0.0594014 0.060828 0.00515272 +-0.0379322 0.0359407 -0.029738 +-0.0628566 0.163115 -0.0590591 +0.032875 0.0504741 0.0332188 +-0.0798256 0.114817 -0.00349908 +0.00979876 0.0631089 0.0545118 +-0.00479883 0.0826783 -0.0376925 +-0.0586564 0.152453 0.0326111 +-0.0847868 0.0979024 0.0288114 +-0.0248237 0.0853842 -0.0372699 +-0.00156343 0.13088 0.0191419 +-0.0624949 0.0729745 0.0395167 +-0.0208752 0.105853 -0.0224653 +0.0381305 0.0743398 -0.0117665 +0.00679871 0.128004 -0.00391746 +-0.0769289 0.125211 -0.00745968 +-0.0251918 0.111615 -0.0181703 +-0.0538836 0.0984784 -0.021806 +-0.0535445 0.0444164 -0.0080927 +0.0449223 0.0903552 0.00117592 +0.00748556 0.116867 0.0384917 +0.0479919 0.0426572 0.0134999 +0.0269115 0.116892 -0.00595645 +0.0287509 0.0911639 -0.0204971 +-0.00583539 0.0910195 -0.0356702 +0.0122548 0.126063 0.0299441 +-0.0732964 0.0791377 0.0376894 +-0.0578898 0.108324 -0.0176181 +-0.0316803 0.111369 -0.0179291 +-0.00248889 0.101618 0.0440339 +0.0583601 0.0593964 0.0227402 +-0.0568793 0.105485 -0.0183902 +0.0313941 0.108732 0.0332945 +-0.0104953 0.0801622 0.0580036 +-0.0799858 0.150056 0.000166757 +-0.0448968 0.146123 0.00263093 +-0.0595037 0.0344238 0.0383245 +-0.0836036 0.133464 -0.00169527 +-0.0115063 0.0575113 0.0530742 +-0.0112578 0.037897 0.0501369 +-0.0404967 0.071918 0.0419528 +-0.024201 0.0373653 0.0542269 +-0.063129 0.0366622 0.0429743 +0.0461067 0.069238 0.0238359 +-0.0217169 0.0945664 0.0494448 +0.0519577 0.0621966 0.0293389 +0.0286828 0.072686 0.0432253 +0.0389262 0.103315 -0.00332456 +-0.0908979 0.126784 0.00627265 +-0.0604951 0.097348 0.0432235 +0.00320361 0.0838721 -0.0343861 +-0.0615214 0.155998 0.0173864 +0.0174482 0.090927 -0.0262636 +-0.0428815 0.108469 -0.0193857 +0.0528827 0.0476533 0.00520477 +-0.0692155 0.155426 0.0044718 +-0.0116319 0.126956 0.0271535 +0.0555832 0.0661715 0.0258304 +-0.0669079 0.139705 0.0437201 +0.0208911 0.120687 0.0321527 +-0.0692559 0.157013 -0.00287665 +-0.0642658 0.131126 0.0422113 +-0.00350345 0.108655 0.04343 +0.00595359 0.131311 0.0061803 +-0.0652676 0.179645 -0.0602668 +0.0113097 0.0609536 -0.0296395 +0.0202287 0.0385462 -0.010699 +-0.0528896 0.0556157 0.0124842 +-0.0830831 0.152763 0.0275295 +-0.0929926 0.121477 0.0272936 +-0.0679169 0.115123 -0.00939662 +-0.0715189 0.150138 -0.0417489 +0.0502478 0.0496891 0.0267596 +-0.088826 0.122625 0.00229599 +0.045739 0.0876044 0.00618298 +0.0276204 0.0364605 0.0224657 +0.0550864 0.0576626 -0.000774412 +-0.0601415 0.0397484 0.0187938 +-0.0467117 0.131872 0.0218067 +-0.00211002 0.131247 0.0146415 +0.0400335 0.107013 0.011165 +-0.0875275 0.141918 0.0101858 +-0.0321386 0.0511687 -0.0124242 +-0.05996 0.047085 0.0381143 +-0.0771576 0.158311 -0.0229061 +-0.0910473 0.139231 0.0181913 +0.0586943 0.0552354 0.0191792 +0.0541025 0.0616928 -0.00172111 +0.0193458 0.0347743 -0.00166328 +-0.0785503 0.175004 -0.046006 +0.0361753 0.0767902 0.0382584 +-0.00218115 0.0950603 -0.0327048 +-0.00446475 0.03907 -0.00848801 +-0.0509412 0.0543847 0.0317288 +-0.031974 0.126184 0.0154629 +-0.0517139 0.047497 0.0206563 +0.0390432 0.106963 0.0211652 +-0.0661031 0.169296 -0.0348743 +-0.0461189 0.0353483 0.0438447 +-0.0618314 0.155872 0.0114752 +-0.0414861 0.169687 0.00162271 +-0.0640913 0.154089 -0.00821335 +-0.0474977 0.0776489 0.0433419 +-0.000495324 0.0870356 0.0569136 +0.0572432 0.0508915 0.0131865 +0.0162675 0.0348087 0.0361219 +-0.0561497 0.0697401 0.0384165 +-0.0632023 0.166731 -0.0605917 +-0.0297129 0.0382953 0.00190139 +-0.00511763 0.0345398 -0.0175639 +-0.0614326 0.0342559 0.0293559 +-0.0526737 0.0678526 -0.0129346 +0.0213104 0.092205 -0.0236008 +0.0197097 0.119321 0.0339587 +-0.0214979 0.120818 0.0311972 +0.0121652 0.0940439 -0.0275601 +0.0264769 0.122884 0.00946172 +-0.0236707 0.0536853 -0.0289139 +-0.0413464 0.0470648 -0.0139804 +0.0254796 0.122858 0.0219249 +-0.0924012 0.125564 0.030262 +-0.0879683 0.133795 0.0435491 +-0.0521211 0.0500618 0.0133132 +-0.0655655 0.115703 0.0473772 +-0.0739163 0.0808829 -0.0136046 +-0.0678507 0.166619 -0.0550103 +-0.0116556 0.127143 -0.00273206 +-0.0318682 0.101497 -0.022474 +-0.0710899 0.143489 -0.012899 +-0.0174739 0.0587291 0.0509898 +-0.0238083 0.125586 0.00234805 +-0.0296624 0.0691842 -0.029462 +0.00123889 0.0998292 0.0485145 +-0.0648099 0.0910089 -0.0186372 +-0.0624633 0.170945 -0.051605 +-0.0911968 0.145718 0.0253129 +-0.0208075 0.0827095 -0.0389174 +-0.0156288 0.184043 -0.0262877 +0.0422094 0.0873179 -0.00779978 +0.00273738 0.0943137 -0.0318997 +-0.082233 0.0925905 0.0320729 +-0.0782161 0.110396 0.044452 +-0.0842181 0.153993 0.0196689 +-0.00949468 0.0532459 0.0520833 +-0.0867806 0.115997 0.0469199 +-0.0547757 0.0826557 -0.0215494 +-0.0382309 0.0365042 0.0436563 +0.021227 0.0727783 0.05004 +-0.00441949 0.0338393 -0.022426 +-0.0712771 0.0648585 0.00216525 +-0.0364976 0.111093 0.0360234 +-0.0669244 0.123843 -0.00898539 +-0.0178669 0.0554748 0.0496143 +0.020489 0.0906324 0.0482147 +-0.00549595 0.0605287 0.0555985 +-0.0289733 0.0536405 -0.0223788 +0.0191474 0.0435971 0.0432171 +0.00434602 0.0346139 0.0410512 +-0.0400219 0.111533 -0.0180322 +0.012127 0.0534588 0.0507501 +0.0284176 0.0415874 -0.00471776 +-0.0270737 0.125279 0.00405866 +-0.0221888 0.0348068 0.0442295 +-0.0447592 0.0797381 -0.0197229 +-0.0304968 0.172715 -0.00561384 +-0.0762362 0.0865455 -0.0135615 +0.0197685 0.0371215 -0.00768223 +0.0379293 0.0417908 0.0270611 +-0.0809612 0.0747382 0.0015261 +0.00168043 0.0346784 0.042239 +0.0257721 0.0915784 0.0461947 +-0.0898405 0.133789 0.0312158 +-0.0355388 0.0441134 -0.0275262 +0.00710192 0.0379595 0.027814 +-0.0620019 0.0401372 0.0237075 +0.0429025 0.100097 0.0151567 +-0.00267325 0.0569172 -0.0326724 +-0.0285904 0.110146 -0.0186081 +-0.0762074 0.0906406 -0.013533 +0.0535161 0.0677623 0.0259787 +-0.00262958 0.0466399 -0.0290845 +-0.0839307 0.125043 -0.00388859 +-0.0340047 0.0386047 -0.0302796 +0.0184751 0.082463 0.0515958 +-0.0574796 0.115365 0.0367006 +-0.0420623 0.154724 -0.00848194 +-0.0860758 0.0924352 0.0274562 +-0.0930739 0.122895 0.0382751 +0.051883 0.0734548 0.0112114 +-0.0811474 0.0769537 0.0251701 +-0.0618709 0.0338217 0.0137712 +0.0195119 0.0370935 -0.00868114 +0.00449835 0.0590783 0.0547231 +-0.0645467 0.148975 -0.0280488 +0.0404587 0.0426892 0.0267677 +-0.0712073 0.146616 -0.0240304 +-0.0512571 0.0488673 0.0206327 +-0.00789661 0.098211 -0.0280331 +-0.0821992 0.0980013 0.0318751 +0.0249936 0.037232 0.0266864 +-0.00349731 0.0456721 0.0469862 +0.0464132 0.0472054 -0.00271728 +-0.0659208 0.0390922 0.037189 +-0.0655814 0.167928 -0.031824 +-0.0726143 0.1704 -0.0286759 +-0.032982 0.0423452 0.0495212 +-0.0442602 0.153622 0.00782588 +0.0320708 0.117667 0.00585111 +0.0181014 0.0354956 -0.0136744 +-0.0756189 0.168382 -0.0269354 +-0.0302725 0.114038 -0.0167089 +-0.06455 0.166996 -0.0328772 +-0.0136948 0.125921 0.0278767 +-0.0594946 0.0973472 0.0432255 +-0.0660053 0.138467 -0.00776776 +-0.0538886 0.161243 -0.000916627 +-0.0521229 0.0491646 0.0356345 +-0.0669695 0.167967 -0.0280306 +-0.0692702 0.0635509 0.00193084 +-0.057893 0.109749 -0.0172343 +0.0162169 0.116863 -0.0139359 +-0.0837452 0.0818387 0.0274964 +-0.0188705 0.104448 -0.0228566 +0.017085 0.0604224 0.0492086 +-0.0636469 0.11387 0.0394431 +0.0060852 0.126695 -0.00651247 +-0.0563559 0.0448266 0.0148606 +-0.0534962 0.0959644 0.0436141 +0.0587007 0.0538335 0.0141792 +0.00148321 0.105804 0.0429258 +-0.0696571 0.0662079 0.0262916 +0.0292497 0.0745452 -0.0220465 +-0.0363535 0.0380033 0.0459253 +-0.0388642 0.104209 -0.02036 +0.0363189 0.106784 -0.00482843 +-0.0506381 0.0473796 0.0176699 +0.0415736 0.0738523 0.0301911 +0.00841968 0.0357631 -0.0122614 +-0.0449132 0.130768 0.0151196 +-0.0348253 0.0822923 -0.0236386 +-0.0756565 0.0672218 0.011813 +-0.0840475 0.0856522 0.0284432 +0.0358352 0.11315 0.0115155 +0.0378536 0.10688 -0.000832307 +0.0327708 0.0862789 0.0422215 +-0.0510409 0.034583 0.0365198 +0.0285939 0.108783 0.0362583 +-0.0291219 0.163733 -0.0155493 +-0.0075062 0.071811 0.0576623 +-0.0285902 0.125327 0.00496117 +0.022493 0.120697 0.0309281 +-0.081164 0.0734408 0.004547 +-0.011709 0.0628424 -0.0363307 +-0.0258651 0.101595 -0.0237434 +0.0205831 0.11206 -0.0147671 +0.0444356 0.0931566 0.0191609 +-0.04739 0.113671 -0.0162364 +-0.0489307 0.0334882 -0.00491951 +-0.0129236 0.118879 -0.0139348 +-0.0161652 0.0382063 0.017415 +-0.00495697 0.0978375 0.052341 +-0.0277397 0.0605536 -0.0284245 +-0.00547292 0.0385489 0.021098 +-0.00115741 0.0949656 -0.0326157 +-0.0444374 0.124419 -0.00954541 +-0.0821611 0.0761834 0.00152312 +-0.0144467 0.0348076 0.0441223 +-0.0715687 0.153984 -0.0439053 +-0.00636015 0.130593 0.00877385 +-0.0127796 0.0382227 0.0144711 +0.0370519 0.110502 0.0205344 +-0.0322265 0.0637977 -0.0184499 +-0.0106706 0.054151 -0.0336931 +-0.0455975 0.169625 -0.00241942 +0.0182033 0.0435661 0.0436183 +-0.0718144 0.147892 -0.0304457 +-0.0577521 0.050802 0.00265023 +-0.0586963 0.0588331 0.00348495 +-0.0866227 0.109058 0.0173532 +-0.0383512 0.122877 -0.00994551 +-0.070675 0.0778663 -0.0147995 +-0.0181879 0.174194 -0.0234207 +-0.0587357 0.153161 0.0315118 +-0.0350971 0.16074 -0.013448 +0.00536912 0.049521 -0.0287338 +-0.0474407 0.134003 0.00841493 +-0.0624554 0.1522 -0.0115838 +-0.0760236 0.150016 -0.00789124 +-0.0261434 0.0379494 0.0119939 +-0.068707 0.0613453 0.00749837 +0.0495547 0.0702574 0.0035522 +0.0608929 0.0651253 0.0121512 +0.0417276 0.0683416 0.0285931 +-0.0322652 0.177059 -0.0129859 +-0.027328 0.0951114 -0.0248637 +-0.0207784 0.0714012 -0.0384405 +-0.0483231 0.128062 -0.00327126 +-0.0424968 0.0449805 -0.0163196 +-0.0550216 0.142767 -0.00162505 +-0.0444981 0.112567 0.0357183 +0.039909 0.107011 0.00616363 +0.0103602 0.0524141 -0.0291489 +-0.0621527 0.0372105 -0.00831557 +0.0052003 0.124064 -0.00964829 +0.0584567 0.0701808 0.018095 +0.0154065 0.0880419 -0.0292971 +-0.0675878 0.0672405 -0.0057657 +0.0141143 0.129082 0.00347211 +-0.0769907 0.154191 -0.00889586 +-0.0351753 0.160922 -0.000113952 +-0.0865124 0.0819745 0.0105022 +-0.0802058 0.0759672 -0.0035211 +0.0412042 0.046738 0.0312341 +0.0531089 0.0539671 0.0274209 +-0.0202736 0.0966137 -0.0264451 +-0.021864 0.108885 -0.0213157 +0.0172909 0.0900542 0.0497289 +0.0151151 0.0645034 0.0516546 +-0.00371721 0.100591 0.046739 +-0.0281684 0.117044 -0.0138686 +0.044615 0.0762444 0.0239446 +0.00250222 0.0504849 0.0522926 +-0.0407291 0.0724971 -0.0177035 +-0.076873 0.114866 -0.00505023 +-0.0509699 0.0334609 -0.0108109 +-0.0307494 0.125973 0.00854668 +-0.0842046 0.10344 -0.000635192 +-0.0637785 0.0335481 0.00468656 +0.0573103 0.0709688 0.0191461 +-0.0548852 0.0344475 0.0323271 +-0.0566985 0.0694351 -0.0145553 +0.0116873 0.128578 0.0254498 +-0.0635208 0.0384034 0.0165311 +-0.0193913 0.161115 -0.00536021 +-0.0517184 0.0708739 -0.0153462 +-0.0355107 0.0789772 0.0422885 +-0.0308674 0.0359912 0.0254031 +-0.0496962 0.137023 0.0203775 +-0.000496498 0.0549075 0.0548747 +0.0203519 0.0506032 0.0432764 +-0.00603714 0.0387093 0.0280658 +-0.0424971 0.165251 0.00449932 +-0.088747 0.148763 0.0102254 +0.0140119 0.072675 0.0536492 +-0.0355033 0.109745 0.0370663 +-0.0495176 0.0451863 0.0426306 +0.0161864 0.128058 0.00281004 +-0.0689044 0.110844 -0.0111483 +-0.0648164 0.0412793 0.0318749 +-0.0594946 0.0959853 0.0440949 +-0.0201946 0.0918367 -0.0355405 +-0.00451061 0.0534011 0.0538125 +-0.0256167 0.0422692 -0.0291044 +-0.0366019 0.0472824 -0.0203909 +-0.0714721 0.152551 -0.0449162 +-0.0686495 0.0395764 0.0103048 +-0.0916814 0.147477 0.020141 +0.0344933 0.0646793 0.0392567 +0.0354037 0.0848596 0.0389463 +0.0335837 0.114911 0.0235455 +-0.00948608 0.0488348 0.0496357 +0.0162564 0.0875946 -0.0288434 +-0.0495004 0.0876335 0.045502 +-0.00788756 0.107371 -0.0226705 +0.0279061 0.0479696 -0.0147397 +-0.0593675 0.145365 0.0352791 +-0.0297371 0.179987 -0.0120259 +-0.00152895 0.1273 -0.00507098 +-0.053021 0.0473885 0.0142865 +-0.031661 0.0351392 -0.0196159 +-0.0428508 0.127424 0.0174253 +0.00853656 0.103079 0.0455737 +-0.0428329 0.0928281 -0.0227901 +-0.0533229 0.121583 -0.0104498 +-0.0281276 0.163902 -0.00573037 +0.00550696 0.0647473 0.0560963 +-0.0786632 0.155487 0.0200952 +0.0373574 0.0841251 -0.0157743 +0.00845531 0.04577 0.0469205 +-0.0816426 0.140732 0.045535 +-0.0198636 0.184564 -0.0147357 +-0.0441 0.149758 -0.00480897 +-0.0394895 0.0478295 0.0398724 +-0.0902912 0.136455 0.0152001 +-0.0912584 0.116106 0.0417079 +-0.078373 0.161039 -0.0249642 +-0.0823003 0.143183 0.00115625 +-0.0366712 0.0621691 -0.0130418 +0.0483193 0.0518215 -0.00445791 +-0.0647832 0.179003 -0.0560548 +-0.066692 0.1555 0.0271809 +0.0251524 0.123931 0.0146708 +-0.0729716 0.175028 -0.0520538 +0.0249807 0.0645674 0.0448324 +0.0189844 0.127654 0.0109555 +-0.023546 0.114036 0.0366055 +-0.0166929 0.178668 -0.0190282 +-0.0838411 0.0884243 0.0295799 +0.0340178 0.106064 0.0317678 +0.0172301 0.0834905 -0.0285819 +-0.0836745 0.0939124 0.0306595 +0.00650612 0.0856084 0.0565927 +-0.00650337 0.0633626 0.0562557 +0.00724714 0.123914 -0.00950504 +-0.04049 0.0677003 0.0417506 +-0.083014 0.0816043 0.0289568 +-0.0791181 0.10724 -0.00560787 +-0.0643983 0.155173 -0.0416037 +-0.0194853 0.0382676 0.0257029 +0.017193 0.0407686 0.0438767 +-0.0578741 0.0997697 -0.0193936 +-0.00470039 0.0340249 -0.0188849 +0.009491 0.0923319 0.053062 +-0.0679779 0.0615132 0.00568001 +-0.00851004 0.0960786 -0.0317903 +0.0222567 0.0734747 -0.02675 +0.0396829 0.102719 -0.00275708 +0.0333394 0.0519958 0.0339463 +-0.0317958 0.166782 -0.0057687 +-0.0851069 0.104842 0.00238218 +0.040355 0.0712163 0.0319238 +-0.0796414 0.0719293 0.00453596 +-0.00871509 0.0670095 -0.035665 +-0.04676 0.0797358 -0.0197068 +0.00759602 0.120603 -0.0139518 +-0.00757253 0.0384534 0.015324 +0.027396 0.0902329 0.0450202 +-0.0837001 0.104608 0.0275279 +-0.0648437 0.159826 -0.0567739 +-0.0182921 0.113707 -0.0184295 +-0.0318101 0.0499111 0.0410759 +0.0042017 0.130577 0.0226921 +-0.0882785 0.102304 0.00940329 +-0.0669196 0.157864 -0.00782765 +-0.0574974 0.104327 0.0414929 +-0.028183 0.0499752 0.0445203 +0.0437475 0.087439 -0.00380588 +0.047365 0.0735855 0.0109418 +-0.0355275 0.04785 0.0396404 +-0.00564979 0.0511569 -0.0315211 +-0.0622081 0.163133 -0.0355907 +-0.0126796 0.0555759 -0.033924 +-0.0434133 0.12436 -0.00948612 +0.0325363 0.0605817 0.0399114 +0.00828387 0.0859903 0.0560092 +-0.0377619 0.0480619 -0.0149351 +-0.0152064 0.0377587 0.0513804 +0.0337034 0.0740969 0.0399489 +0.0386678 0.106943 0.0231645 +-0.0568902 0.10122 -0.0192994 +-0.0629975 0.158364 -0.0415982 +0.0174963 0.116768 0.0361173 +-0.018574 0.174216 -0.0164984 +-0.0916005 0.147489 0.0211447 +0.0351839 0.113522 0.00409669 +-0.0642224 0.175708 -0.0529566 +-0.0646189 0.0691309 -0.0109873 +-0.0744709 0.159641 -0.0299365 +-0.0810037 0.0777776 0.0280061 +-0.0468539 0.0397424 -0.0132276 +-0.0387576 0.152152 0.00343994 +-0.0355301 0.0350253 0.0446914 +-0.0252945 0.179999 -0.0179968 +-0.0594833 0.0440844 0.0256893 +-0.0262483 0.175689 -0.00998917 +-0.0357 0.0344414 0.0311095 +-0.0348452 0.0957896 -0.0233484 +-0.0694619 0.0701676 0.0334316 +-0.0704025 0.156596 -0.000355665 +0.0197946 0.0872171 -0.0264236 +-0.00225576 0.119004 -0.0141489 +0.0447595 0.0819096 0.000199099 +-0.0414725 0.16704 -0.0108149 +0.0383695 0.0533606 -0.00654853 +0.0436976 0.0763605 0.0261605 +-0.059412 0.0342492 0.0297869 +-0.0105538 0.0962042 -0.0319333 +0.0354985 0.0483762 0.03122 +-0.0232213 0.183101 -0.0108227 +-0.0454832 0.0704956 0.0415155 +-0.0818632 0.143391 0.0428465 +-0.00588211 0.0384235 0.0193174 +-0.0715611 0.065876 0.0226562 +-0.0557658 0.0561367 -0.00241411 +-0.007704 0.0613485 -0.0352024 +-0.050582 0.13546 0.000440434 +-0.0239591 0.0958294 0.044594 +-0.0344217 0.156595 0.00275895 +-0.0721769 0.146332 -0.0246714 +-0.00172768 0.0683482 -0.0343533 +0.0465137 0.0736858 0.00606841 +-0.0379081 0.0345108 0.0393807 +-0.0536272 0.0632225 -0.00927695 +0.0216001 0.0346735 0.00635285 +-0.00546011 0.130518 0.00622904 +0.025022 0.0994981 0.0433749 +-0.059626 0.14292 -0.00334389 +-0.0662647 0.160967 -0.0574681 +-0.086688 0.0937529 0.026595 +-0.0292509 0.122699 0.0223824 +-0.020881 0.0609703 0.0467992 +-0.0727056 0.0704556 0.030746 +-0.0670342 0.154632 -0.0510962 +-0.0818617 0.117704 -0.00327392 +-0.00930377 0.0384012 0.0113924 +-0.0294534 0.0382504 0.0532249 +-0.0428028 0.034428 0.0296237 +0.034591 0.113857 0.0224952 +0.0260945 0.0981604 0.0431638 +0.0157288 0.0740195 0.0526622 +0.00528348 0.0654438 -0.0329345 +0.0342272 0.113045 -0.000582475 +0.0177023 0.127344 0.0204737 +-0.00349601 0.0619414 0.0556852 +-0.0633856 0.13531 0.0381918 +-0.0187732 0.0742782 -0.038946 +-0.0714922 0.124606 0.0531293 +-0.0387588 0.0432047 -0.0253505 +-0.0377685 0.112865 -0.0174473 +-0.0811078 0.0831466 0.0326628 +0.0121734 0.0347014 0.0407838 +-0.0423463 0.0344667 0.0367209 +-0.0247884 0.0905387 0.0498003 +-0.0589097 0.111154 -0.0162513 +-0.0119878 0.0389387 -0.0117395 +-0.0746688 0.0730125 -0.00771761 +-0.0636783 0.0344406 0.016873 +-0.0718387 0.063614 0.0140147 +-0.0537353 0.0753205 -0.0183524 +0.0399868 0.0793585 0.0332409 +0.0342696 0.0686799 0.038964 +0.0283038 0.121367 0.00870899 +0.020694 0.101208 -0.0211426 +-0.0607079 0.149875 -0.000940868 +-0.0663226 0.0771733 0.0404118 +-0.0856352 0.151298 0.0280417 +0.00450086 0.0533884 0.0535142 +0.0193556 0.0370965 -0.0106758 +-0.073245 0.152646 -0.0348949 +-0.0311279 0.168264 -0.00654632 +-0.0314769 0.122323 0.024544 +-0.00965298 0.0383614 0.0149817 +0.0322912 0.117174 0.00450048 +-0.0303956 0.0833549 -0.0325649 +-0.0305081 0.109824 0.0377476 +0.060267 0.0581373 0.011162 +-0.0782363 0.119072 0.0512696 +-0.0819743 0.130956 -0.00393996 +0.0125568 0.129953 0.0057397 +-0.0750314 0.165158 -0.038026 +-0.0842614 0.0857549 -0.00354776 +-0.0194949 0.122198 0.0303074 +-0.0885869 0.0914877 0.00746285 +0.0183032 0.0622432 -0.0278633 +-0.0188389 0.0383463 0.00224079 +0.0169223 0.0354899 -0.0154522 +-0.0510859 0.154625 -0.00472421 +-0.04134 0.171235 -0.00891614 +-0.00271064 0.0641639 -0.0348647 +-0.0404957 0.119327 0.0301663 +0.0161104 0.038261 0.0437952 +-0.0788559 0.0706244 0.0187647 +-0.0565382 0.0387829 -0.00997998 +0.00406092 0.0347375 0.0390843 +-0.052431 0.0503969 0.0246465 +-0.0548238 0.136818 -0.00273484 +-0.0168361 0.163394 -0.0165332 +0.0085002 0.0589241 0.0531764 +-0.00349833 0.104479 0.0440938 +0.041165 0.0675922 -0.00677134 +-0.0766837 0.0941158 0.0377884 +-0.0715005 0.108276 0.0374406 +-0.0514917 0.154976 0.0111 +-0.0766573 0.0758638 -0.0078194 +-0.0708734 0.116483 -0.00801313 +-0.0584915 0.0333664 -0.00308936 +-0.0132404 0.0420117 0.0507817 +0.0504568 0.0627892 -0.00292241 +0.0181009 0.0617863 0.0489038 +-0.0686053 0.155434 -0.0518073 +-0.0866142 0.111799 0.023338 +-0.0087012 0.0613261 -0.0351009 +-0.0667075 0.179209 -0.0538653 +0.0133269 0.036855 0.044466 +-0.0308424 0.0930072 -0.0244625 +-0.0526579 0.118327 0.034303 +-0.0802651 0.0940224 0.034298 +-0.0895241 0.094286 0.0154262 +-0.0580951 0.0448084 0.0137644 +0.0187472 0.0369987 -0.01368 +-0.0174935 0.0786826 0.056671 +-0.026682 0.0779832 0.0478067 +0.0449566 0.0931917 0.0141646 +-0.0598355 0.0968573 -0.0194316 +-0.015743 0.0388551 0.0331436 +0.045657 0.07639 0.00319799 +0.00221136 0.0782941 -0.0352071 +-0.0725589 0.0360747 0.00146649 +-0.0641358 0.117113 0.0460384 +-0.0709488 0.0833216 0.0408543 +0.0230126 0.0366914 0.0285839 +0.0164832 0.101772 0.0464774 +-0.0114886 0.10724 0.0431864 +-0.0748949 0.0968349 0.0387401 +-0.0428468 0.0368545 0.044028 +-0.0121243 0.183164 -0.0282842 +-0.0110799 0.0973863 0.0517395 +-0.0283441 0.0346627 0.0430398 +-0.0591236 0.0454581 0.0276809 +0.0359903 0.0834983 0.0380665 +-0.0894731 0.112826 0.0381953 +-0.0633619 0.165109 -0.0324564 +-0.0893245 0.139298 0.0361742 +-0.0113718 0.177173 -0.0236196 +0.0314957 0.0386039 0.0249642 +-0.0153586 0.171251 -0.0171482 +-0.0501632 0.165541 -0.000963216 +-0.0125979 0.0362885 -0.0258846 +-0.0109041 0.121705 -0.010941 +-0.01134 0.181374 -0.0292688 +-0.0636417 0.067527 -0.00924444 +-0.0645561 0.151545 -0.0345673 +0.0234128 0.0685823 0.0460905 +-0.0204536 0.184888 -0.0139868 +-0.0362035 0.16829 0.000195359 +-0.0423655 0.0354607 0.0428683 +0.029434 0.0414849 -0.00426139 +-0.0548859 0.0335879 0.0154264 +0.0301337 0.0958138 -0.0174156 +-0.0231819 0.174173 -0.0207431 +0.0495183 0.0596792 0.0306871 +-0.0615314 0.169388 -0.0555899 +-0.0645149 0.156191 0.0192193 +-0.0808163 0.150056 0.00117383 +-0.0203106 0.127423 0.0152774 +-0.048501 0.0946267 0.0446158 +-0.0621404 0.0458224 0.0356845 +0.014817 0.0713159 0.0530708 +-0.0482359 0.0600875 0.0359237 +0.0583839 0.0607371 0.00317993 +0.0532979 0.0476993 0.0202039 +-0.00334167 0.13115 0.0113211 +-0.0451105 0.146112 0.00345863 +-0.0728436 0.0965116 -0.0147387 +-0.00290701 0.128667 -0.00250924 +-0.0175351 0.0472943 0.0498404 +-0.0710465 0.156278 0.000878407 +0.0130461 0.106823 -0.0191157 +-0.0241467 0.169732 -0.0193183 +0.0184844 0.092024 0.0477707 +-0.0849646 0.0925759 -0.00355765 +-0.0135115 0.0617879 0.0541775 +0.0358003 0.0371828 0.0161878 +-0.0563756 0.0338236 0.0220041 +-0.0344987 0.119335 0.0301753 +-0.0207895 0.0363821 -0.0186131 +0.0366896 0.0394563 0.0234361 +0.0454465 0.0903989 0.00417224 +-0.0686026 0.0339552 0.0087048 +-0.0248008 0.0797877 -0.0377608 +-0.0253831 0.0645504 -0.0324979 +-0.0924079 0.114699 0.0153245 +0.0404169 0.104204 0.0201615 +-0.0864551 0.137921 0.0433346 +0.0453383 0.0861836 0.0191712 +-0.0550359 0.12552 0.0379729 +0.0499773 0.0719552 0.0208312 +-0.0878453 0.10502 0.0133698 +0.0226563 0.0416586 -0.00875234 +0.00847112 0.0503629 0.0509458 +0.0193029 0.12103 0.032512 +-0.0288694 0.102979 -0.023086 +-0.0655006 0.155906 0.0116223 +-0.0865291 0.125714 0.0480303 +-0.0762092 0.103511 0.0356214 +0.027039 0.0433782 0.0352623 +-0.00878391 0.0340179 -0.0196776 +0.01688 0.104029 -0.0201606 +-0.0779922 0.155321 0.011561 +0.012978 0.0975651 -0.0232996 +-0.0570356 0.142438 0.0315884 +0.00678439 0.0392286 0.0320303 +-0.0187316 0.184448 -0.0230478 +-0.05583 0.0898375 -0.0220234 +-0.0624118 0.168239 -0.0611966 +-0.019552 0.0381879 0.0203532 +-0.0619388 0.0647772 0.0309092 +-0.0929984 0.129612 0.0152364 +0.0241882 0.0633761 -0.0240832 +-0.0154901 0.11097 -0.019533 +0.0335254 0.101204 -0.0131717 +0.0440036 0.0411539 0.00525252 +0.0443474 0.05051 -0.00579969 +-0.00564997 0.0526431 -0.0322774 +0.024909 0.124002 0.00889289 +-0.0551719 0.0344352 0.0357625 +-0.00149801 0.0828985 0.0574954 +-0.0649207 0.122383 -0.00889091 +-0.0371067 0.163706 -0.0138205 +-0.013511 0.0673225 0.0538556 +-0.0664425 0.121454 0.0513831 +-0.0749127 0.151363 0.0363064 +-0.0786131 0.166659 -0.0369473 +0.0259941 0.0889184 0.046498 +-0.0508607 0.133588 0.0291236 +-0.0624206 0.150641 -0.0155752 +-0.0345377 0.0353482 -0.0311793 +-0.0926334 0.130971 0.0152338 +0.00420379 0.0852404 -0.0337772 +0.0493319 0.0575419 -0.00502247 +0.0210858 0.0848756 0.0499424 +-0.0209282 0.0711316 0.0521839 +-0.0556334 0.121157 -0.00996616 +-0.0578782 0.0955404 -0.0210377 +-0.0636177 0.149382 -0.0259273 +-0.023437 0.0753613 0.0517266 +-0.0424368 0.033567 0.00359466 +-0.0366861 0.0651313 -0.0144389 +0.00275029 0.0392893 0.0311503 +-0.0858603 0.137915 0.0441653 +0.00249981 0.0938632 0.054785 +-0.0405815 0.125646 -0.00686289 +0.00652265 0.0633208 0.0557678 +-0.0736187 0.0665006 0.01992 +0.0178849 0.106917 -0.0172488 +-0.0404999 0.16823 0.00286674 +-0.0578818 0.101192 -0.0190391 +0.0415111 0.0596706 0.0303495 +0.0445386 0.0917351 0.000179816 +0.0404099 0.0926692 0.0304567 +-0.0715386 0.177351 -0.0469381 +-0.00955325 0.129382 0.0220461 +-0.0304508 0.11875 -0.0116176 +-0.0553453 0.138992 -0.00307013 +0.0373215 0.0444316 0.0300039 +-0.0439866 0.0342955 -0.0250034 +0.0438502 0.081834 0.0262681 +0.0105117 0.057471 0.0526043 +-0.0609073 0.0423237 0.0152297 +-0.0566933 0.0478983 -0.00338525 +-0.0882052 0.0955366 0.00643448 +-0.0697305 0.146842 -0.0262196 +-0.0654573 0.131176 0.0439868 +-0.0332792 0.168261 -0.00439757 +0.0262829 0.0520004 0.03955 +-0.0246803 0.0386712 -0.0158919 +-0.0243119 0.0382419 0.00485642 +-0.0650689 0.0416148 -0.00522845 +-0.0224969 0.105778 0.0423492 +-0.0675666 0.163787 -0.0559757 +-0.0625249 0.0642497 0.029495 +-0.066705 0.170483 -0.0379595 +-0.0387912 0.0855771 -0.0218281 +-0.0362227 0.121033 0.0288309 +-0.0351413 0.166693 -0.0148789 +0.0484731 0.0728694 0.00986875 +-0.0715958 0.035386 0.00909438 +-0.0654475 0.0414866 0.0340095 +-0.0897915 0.135018 0.00821888 +-0.0256856 0.161028 -0.00218154 +-0.0294591 0.0367076 -0.0187628 +-0.0318602 0.0341892 0.0214236 +-0.0741619 0.0781636 -0.0115723 +-0.0759684 0.138187 -0.00615578 +-0.0746432 0.067744 0.0203901 +-0.0481968 0.058714 0.0359259 +-0.0809888 0.100705 0.031995 +0.0223647 0.0795488 0.0499944 +-0.0164996 0.0587643 0.0515064 +-0.0843239 0.0775269 0.0169616 +-0.0474174 0.157905 0.00867917 +0.0256365 0.0450396 -0.0116814 +-0.0560862 0.153109 -0.0014946 +-0.0364777 0.0491722 0.0391199 +-0.0353775 0.172711 -0.013245 +0.0345426 0.0361041 0.0132537 +-0.0476575 0.0606291 -0.0121142 +0.0517359 0.0693876 0.00244776 +-0.0895642 0.139283 0.0271809 +-0.0554895 0.087587 0.0448409 +-0.00460242 0.0419996 -0.0255341 +-0.0747436 0.0846695 0.0389578 +-0.0522959 0.0518057 0.0276471 +0.0344259 0.0713949 0.0392126 +-0.0858246 0.111645 0.00429163 +7.90085e-05 0.131159 0.00541676 +-0.0876151 0.1105 0.015342 +-0.0308705 0.0385373 -0.0301935 +-0.0174841 0.088353 0.056296 +-0.0717036 0.179379 -0.0498901 +-0.0872579 0.113355 0.0275168 +-0.0132522 0.180136 -0.0286131 +0.0147067 0.111012 -0.0176211 +0.0100468 0.0698695 0.0549195 +-0.00549411 0.130838 0.0134037 +-0.0444864 0.070528 0.0418968 +-0.0694946 0.0902043 0.0422251 +-0.0125029 0.0673483 0.0540527 +-0.0889341 0.0928773 0.0104474 +-0.049902 0.0335302 0.00572664 +0.0224871 0.0436168 0.0410219 +-0.0391731 0.163682 -0.0125377 +-0.0389872 0.0336658 0.00601497 +0.0423783 0.0676875 -0.00279832 +-0.0314483 0.177007 -0.0139273 +0.0365023 0.0700019 0.0369139 +-0.0817843 0.113273 -0.0014411 +-0.0155011 0.0786732 0.0567092 +-0.0616004 0.115786 -0.012288 +0.0336937 0.0994802 0.0365924 +-0.0819199 0.0775142 -0.000486403 +-0.0620032 0.154899 0.00420466 +-0.0689571 0.134062 -0.00839151 +0.0341993 0.115326 0.00949444 +-0.0853268 0.127125 0.0496018 +-0.0075399 0.0430305 0.0487452 +-0.000964681 0.0992981 -0.0251507 +-0.0896495 0.146064 0.0111487 +0.0457169 0.0792126 0.021174 +-0.0677903 0.180834 -0.0585489 +-0.0525855 0.0528134 0.0122839 +0.045458 0.0847917 0.019171 +-0.0620511 0.164652 -0.0545872 +-0.0012817 0.0411143 0.047028 +-0.0620444 0.166711 -0.0606187 +0.0416044 0.0774454 -0.0068035 +-0.0180891 0.0568831 0.0497969 +0.0289502 0.0888845 0.043761 +-0.0361509 0.0471597 -0.0213258 +0.0209931 0.0505428 0.042434 +-0.081698 0.0939818 0.0329068 +-0.0701548 0.148741 -0.0366493 +-0.0726057 0.158224 -0.0359121 +0.0452801 0.0777562 0.00119407 +0.0034868 0.107186 0.0422902 +-0.0603898 0.116109 -0.0126519 +-0.0799294 0.154987 0.0226092 +-0.0412543 0.0342017 0.0283816 +-0.073067 0.0692219 0.0282366 +-0.0232836 0.0382816 -0.000419572 +-0.0843726 0.0952582 -0.00357113 +-0.0871856 0.0923586 0.0257303 +0.0415318 0.09261 0.0284783 +-0.0528539 0.1113 -0.0177773 +-0.0653767 0.0770838 0.0407622 +0.0608603 0.0609709 0.0131614 +0.0163938 0.128844 0.0100049 +-0.028759 0.0386585 -0.0166912 +-0.0688752 0.11651 -0.00852528 +-0.00266028 0.0525834 -0.0313625 +0.0395925 0.0979794 0.0293107 +-0.063517 0.0417383 0.0266777 +-0.0206145 0.038142 0.0147556 +-0.0746919 0.0745094 -0.0088781 +-0.0730235 0.16103 -0.0369405 +-0.0511023 0.141628 0.018382 +0.026686 0.0963684 -0.0200186 +0.00049039 0.0952019 0.0544773 +-0.0374215 0.0466159 -0.0218044 +-0.0396639 0.0592228 -0.0116772 +0.0589085 0.0593684 0.0217913 +-0.069935 0.128232 -0.00913858 +-0.0154583 0.128246 0.0199229 +-0.082956 0.0762572 0.0165263 +-0.0698527 0.139727 0.0465118 +-0.0793995 0.0962934 -0.0095136 +0.029447 0.119051 0.00204245 +-0.0406195 0.0505975 -0.0111291 +-0.0337259 0.125903 0.000119567 +-0.00361865 0.109419 -0.0218821 +-0.0324923 0.0845615 0.0419149 +-0.0304819 0.0903593 0.0440392 +-0.0289421 0.0848695 0.0456392 +-0.067993 0.172429 -0.0412978 +-0.0699656 0.167828 -0.0233999 +-0.0633908 0.0664235 0.0326881 +-0.0328103 0.178226 -0.00982944 +-0.0144938 0.0897854 0.0566872 +-0.00301248 0.0391855 -0.0120497 +-0.0467348 0.10982 -0.0182008 +-0.0347751 0.123588 -0.00668109 +-0.081672 0.0966878 0.0327979 +0.0208066 0.08618 0.0495337 +-0.0294922 0.102919 0.0420695 +-0.0514977 0.0917694 0.0441515 +-0.0561584 0.13394 0.0346041 +0.0587961 0.055231 0.00916964 +0.0239769 0.0672243 0.0451455 +-0.0590987 0.135299 0.0356206 +-0.0833215 0.153324 0.00972396 +-0.0775565 0.148654 -0.00488618 +0.0134356 0.129163 0.0217505 +0.00242681 0.0392303 -0.00913048 +-0.00111738 0.0369593 -0.0152505 +-0.0884159 0.102321 0.0103913 +0.0452046 0.0684536 0.0248447 +-0.0107692 0.1278 -0.0014358 +-0.067702 0.169446 -0.0560134 +-0.0645991 0.162478 -0.0199783 +-0.0384905 0.0591295 0.0404813 +-0.0133897 0.0383025 0.0215062 +-0.0335039 0.113859 0.0341437 +0.00725148 0.0739904 -0.0339985 +-0.0197912 0.0347004 -0.0276305 +-0.0364291 0.0383909 -0.00870817 +-0.0382525 0.154358 -0.00883541 +-0.0576615 0.0645392 -0.00788705 +0.0271486 0.0677873 -0.0226945 +-0.0484929 0.0776741 0.0437591 +-0.0538207 0.0913026 -0.0221948 +-0.0414756 0.102877 0.0407886 +-0.0194769 0.0384097 -0.0016118 +0.0409764 0.0725373 0.0310711 +-0.046711 0.0723683 -0.0164352 +-0.0169229 0.0385492 -0.0161043 +0.0274461 0.0888981 0.0450769 +0.0384486 0.0446185 0.0300797 +-0.0498739 0.120141 -0.01301 +-0.0147995 0.0382136 0.0194957 +-0.034222 0.0422724 0.0479221 +-0.00554376 0.0388664 -0.0141367 +-0.00771915 0.0642161 -0.0356843 +0.0380609 0.108343 0.0221716 +-0.0496329 0.05762 -0.010324 +-0.0640324 0.0336604 0.00811729 +0.0288939 0.0349903 0.0075309 +-0.0369254 0.170672 -0.0129456 +0.0567415 0.0605855 0.00115011 +-0.026353 0.0382316 0.0044532 +-0.088166 0.0963498 0.023753 +-0.0332851 0.0368458 -0.0306141 +-0.0138558 0.0387296 -0.0044727 +0.0597512 0.0650182 0.00715554 +-0.0267551 0.0740245 -0.0360482 +0.0214915 0.0369736 0.0352586 +-0.0515738 0.0559395 0.0296214 +0.00622241 0.123988 -0.00957575 +0.0558148 0.0493476 0.0171957 +-0.0766567 0.112144 0.0469767 +0.0408877 0.0928069 -0.00817715 +-0.0862272 0.0886081 0.000477626 +-0.0341682 0.0723955 -0.0204945 +0.0468003 0.0745424 0.0107517 +-0.00983206 0.0896484 -0.0366649 +-0.00782261 0.0985178 0.051315 +-0.070543 0.17193 -0.0350862 +0.0371254 0.0869172 -0.0157926 +-0.059432 0.152725 0.0327387 +-0.0644942 0.149793 0.0375095 +-0.02966 0.0875784 -0.0315907 +0.0234483 0.0350084 0.0101439 +-0.0672661 0.155709 0.00954294 +0.0249549 0.0915796 0.0467751 +-0.0750729 0.0675817 0.0186826 +-0.065557 0.158804 -0.0559152 +-0.0869809 0.112371 0.0426661 +-0.0388924 0.0336117 -0.0270987 +-0.0925871 0.117342 0.0103086 +-0.0285134 0.0559644 0.0364164 +-0.0592485 0.148248 0.0355123 +-0.0386245 0.0472623 -0.0172994 +0.0417415 0.0676611 -0.00475281 +0.017067 0.127696 0.00312982 +-0.00768714 0.116771 -0.0157299 +-0.0210692 0.0667823 0.0496379 +0.0306718 0.0605569 0.0407187 +-0.086202 0.0805924 0.0105044 +0.0248868 0.0727438 0.0465386 +-0.0226479 0.182963 -0.0190305 +-0.064868 0.0953298 -0.0181139 +-0.0212331 0.0553385 0.0459146 +-0.0900228 0.148451 0.0254546 +-0.0659345 0.109414 0.0377967 +-0.0156357 0.0466082 -0.0291798 +-0.0783295 0.108958 0.0384425 +-0.0353519 0.169773 -0.000327923 +-0.0576724 0.155657 0.012957 +0.0299243 0.0902598 0.0434097 +-0.0938789 0.125503 0.0152603 +0.00849738 0.0910108 0.0540495 +-0.0924729 0.117499 0.0403021 +-0.0538856 0.101336 -0.0209374 +0.0230068 0.125355 0.00960117 +-0.0753773 0.0887668 0.039456 +-0.0164714 0.0348128 0.0436847 +-0.0124833 0.108618 0.0427908 +0.00650022 0.0937602 0.0531051 +-0.0254901 0.101602 0.0435889 +-0.0681644 0.132655 0.0471068 +0.0116725 0.130674 0.0125466 +-0.0658455 0.0693268 0.0349111 +0.0131057 0.0346676 0.0247536 +0.0111453 0.0752893 0.0548169 +-0.0414315 0.120058 -0.0129928 +-0.0667828 0.0837809 -0.018353 +-0.0558768 0.105489 -0.0184971 +-0.0646849 0.0705888 -0.0125799 +0.00250861 0.0634123 0.0567384 +-0.0102337 0.0987343 -0.0266102 +-0.0475686 0.0376232 -0.0123457 +0.0326729 0.0388984 0.0249367 +-0.0754158 0.14997 -0.0218646 +0.0149498 0.0475024 0.0442108 +-0.0897923 0.144692 0.013139 +-0.065193 0.0597221 0.0116014 +-0.0777759 0.113375 -0.00398806 +-0.0457101 0.131722 0.0089192 +-0.0575663 0.0481384 0.0346641 +-0.0838122 0.128533 0.0508937 +-0.0104939 0.0933018 -0.0349679 +0.0252085 0.0464911 -0.0166174 +-0.0789879 0.13894 -0.00474105 +-0.0475728 0.0656919 0.0379498 +0.0110822 0.113195 -0.0179885 +-0.0649225 0.170267 -0.0430968 +-0.00871405 0.112847 -0.0195489 +0.0452857 0.0889846 0.0161633 +-0.0171038 0.128182 0.00771491 +-0.0114919 0.0911558 0.0564108 +-0.0672347 0.158081 -0.05503 +-0.0375789 0.0335576 -0.0249215 +-0.028354 0.0521667 -0.0233844 +-0.0687469 0.179151 -0.0517127 +-0.0635972 0.164728 -0.0295802 +-0.00849416 0.0661021 0.0557034 +0.0018938 0.131459 0.00752669 +-0.0104875 0.10724 0.0431922 +0.0420847 0.0764929 0.0291356 +-0.0164676 0.125926 0.0254562 +-0.0666931 0.162075 -0.0149837 +0.000392133 0.0405199 -0.0247969 +-0.062597 0.0740287 0.040345 +-0.038486 0.115285 0.0333239 +-0.0134767 0.0545379 0.0508338 +-0.0379773 0.128134 0.0117903 +0.0282176 0.0746072 -0.022898 +-0.00949856 0.0898059 0.0569552 +-0.0633588 0.166271 -0.0375898 +-0.088608 0.0874693 0.0094764 +-0.00658802 0.126776 -0.00645935 +0.00550371 0.0533623 0.0533002 +0.0568364 0.0723477 0.016027 +-0.0746813 0.077485 -0.0103851 +0.0599778 0.0622697 0.0191849 +-0.0834343 0.143353 0.0415913 +0.0461466 0.0773319 0.0190905 +-0.0643928 0.0366139 0.0414145 +0.017105 0.0913787 0.0494605 +0.0113838 0.0463423 -0.025328 +0.00150906 0.0925101 0.0553138 +-0.0905552 0.131061 0.0372264 +0.0271939 0.0479684 -0.0167032 +0.0118641 0.130407 0.00833975 +-0.0534963 0.0413918 0.0463882 +-0.00348783 0.0548509 0.0542207 +-0.0241218 0.165279 -0.0170232 +0.0526044 0.0736805 0.0129696 +0.00493694 0.0358587 0.023833 +-0.0308996 0.0862326 -0.0295626 +-0.0749566 0.152744 -0.0158977 +0.022407 0.0700249 0.0481925 +-0.0644326 0.152123 0.0354487 +-0.083145 0.0762813 0.00952219 +-0.0066641 0.130277 0.00578337 +-0.0503124 0.0487527 0.0166746 +-0.0857975 0.0926505 0.000473688 +0.0319954 0.0554568 -0.0137989 +-0.0325248 0.0371997 0.032926 +-0.0378236 0.0914714 -0.0236656 +0.0107752 0.0603237 0.0523688 +-0.0709378 0.0995366 0.0403447 +0.00229927 0.0641027 -0.0339638 +0.0301658 0.0510827 -0.0137422 +-0.0152122 0.0387061 -0.0065833 +0.0328168 0.0373031 0.0209449 +-0.0564976 0.0959787 0.0438593 +-0.0530296 0.137293 -0.00118635 +-0.0114929 0.0745162 0.0566704 +0.0339687 0.0768049 0.0403387 +0.0229251 0.0476731 0.039919 +0.0153286 0.0594649 -0.0285327 +-0.0650165 0.0356472 0.0166692 +-0.0872319 0.104968 0.0093836 +0.0317565 0.0752189 -0.019756 +0.0174897 0.107108 0.0415537 +0.00650555 0.0716952 0.056225 +0.0214733 0.0808843 0.0504673 +-0.0157973 0.0382489 0.019257 +-0.073889 0.119392 -0.00790358 +-0.0588895 0.0969269 -0.0201624 +-0.0614701 0.166956 -0.0604533 +-0.0411287 0.160673 -0.0112161 +-0.0558134 0.0883826 -0.0218608 +-0.0206962 0.0385843 -0.00942784 +0.0401892 0.0759203 -0.00879733 +0.0191194 0.0349494 -0.00374623 +-0.0414976 0.113906 0.0346806 +-0.00581815 0.0854694 -0.0375201 +-0.0859756 0.0805547 0.00750576 +-0.0833395 0.103378 -0.00262342 +-0.0446335 0.126046 -0.00723965 +0.0260088 0.0910229 -0.0223512 +0.034944 0.10998 0.0278542 +-0.00248857 0.0703789 0.0573235 +-0.0102702 0.0385128 0.00564525 +-0.0283572 0.0578046 -0.0244014 +-0.0210295 0.0958616 0.0473023 +-0.0141375 0.0347096 0.0460356 +-0.0244241 0.178665 -0.0108375 +0.00749812 0.109597 0.0408218 +-0.0356643 0.0606925 -0.0124069 +-0.0638002 0.166551 -0.0354938 +-0.0862312 0.0940245 0.00140199 +-0.0365789 0.0337187 0.00826156 +0.0240933 0.0685753 0.045325 +-0.0891661 0.132396 0.0419315 +-0.0177346 0.065722 -0.0374816 +-0.0224613 0.12203 0.0284859 +-0.0509119 0.055753 0.0316394 +-0.0340805 0.0680941 -0.0175876 +-0.0166639 0.0364717 -0.017882 +0.0347021 0.0768104 0.0396564 +0.0213412 0.0565052 -0.0267347 +-0.0707159 0.179287 -0.0569572 +-0.0748092 0.0790936 0.0363823 +-0.0577944 0.0460393 0.0120187 +-0.0302932 0.123607 -0.00301843 +0.00749105 0.050377 0.0513506 +-0.0641553 0.162388 -0.0586672 +-0.0197076 0.059653 0.0484949 +0.0376477 0.110588 0.00928033 +-0.0151896 0.0391404 0.0514631 +0.020848 0.0400652 -0.0117024 +-0.0208303 0.119929 -0.0109428 +0.0157129 0.124796 -0.00448994 +-0.00658665 0.0388228 -0.0143041 +0.0254417 0.121647 0.000551492 +0.0535789 0.0658041 0.000119664 +0.0473148 0.0518659 -0.00495567 +0.0299175 0.0524736 -0.0157475 +-0.0183959 0.112492 -0.0191613 +-0.0893828 0.0916068 0.0204288 +-0.0614858 0.175719 -0.0606762 +-0.0901396 0.13244 0.0372222 +-0.0238257 0.0881589 -0.0366228 +-0.0218791 0.0383442 -0.00388387 +0.00124143 0.0390154 -0.00356473 +-0.0669805 0.1589 -0.00929727 +0.0483233 0.0547304 -0.00526262 +-0.0444857 0.0661533 0.0401374 +-0.0514919 0.076238 0.0430598 +-0.0301912 0.0664057 -0.0274649 +-0.0408343 0.0942887 -0.0229156 +-0.00749956 0.121159 -0.0124082 +-0.061476 0.158429 -0.028587 +-0.0675029 0.109729 0.0377486 +-0.0697083 0.1638 -0.0499695 +-0.062151 0.152195 -0.0205783 +0.0342924 0.0619556 0.0389482 \ No newline at end of file diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny_ran.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny_ran.pts new file mode 100644 index 000000000000..91de67a41378 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/bunny_ran.pts @@ -0,0 +1,35948 @@ +150 +-0.0164722 0.0382453 0.0209318 +-0.0641407 0.171114 -0.0471776 +0.023086 0.119339 0.0317977 +0.00506037 0.0347021 0.0393176 +-0.066143 0.143958 0.0413147 +-0.0445017 0.163753 0.00542301 +-0.0689729 0.181022 -0.0546459 +-0.0931085 0.131006 0.0192314 +0.000506827 0.0489752 0.0512269 +-0.0615935 0.160001 -0.0315914 +-0.0245032 0.0960169 0.0442753 +-0.0258992 0.0891655 0.049535 +-0.000499367 0.0456802 0.0470389 +-0.0171808 0.0654583 0.0528522 +0.00116916 0.131228 0.00582139 +-0.0356565 0.122935 -0.00798984 +-0.0701892 0.156285 0.021569 +-0.0173569 0.038443 0.0259817 +-0.0716413 0.0763478 -0.0132577 +0.0528545 0.0568172 0.0288563 +-0.0325067 0.0732308 0.0407775 +-0.0760686 0.150008 -0.00987485 +-0.030561 0.0774145 0.0410957 +-0.0833901 0.0762729 0.00451303 +-0.000492618 0.0925258 0.0556594 +-0.0358778 0.159506 0.00240863 +0.0115111 0.114076 0.0384616 +-0.0877889 0.0887187 0.00347532 +-0.0261028 0.115949 -0.0147279 +-0.0682913 0.165205 -0.0539869 +-0.0225512 0.0933694 -0.0331106 +-0.0538783 0.0999149 -0.0214389 +0.0435587 0.0959151 0.0211557 +-0.0167991 0.0388632 -0.0107644 +-0.0569142 0.0548839 0.00364185 +0.00749229 0.091015 0.0542708 +-0.065316 0.0625169 -0.002419 +-0.00749647 0.119689 0.0375376 +-0.0772165 0.0934484 -0.0125951 +-0.029008 0.0478606 -0.0250513 +0.00934189 0.0553527 -0.0303034 +-0.0578677 0.104042 -0.0186102 +0.0405495 0.0999198 -0.00379356 +-0.0894314 0.137929 0.0371779 +0.00710731 0.126603 -0.00643182 +0.058913 0.070492 0.0108657 +-0.0922485 0.120133 0.0292903 +0.0395325 0.105566 0.0221621 +-0.0376065 0.0365426 0.0444186 +-0.0550158 0.128128 -0.00563226 +-0.0561672 0.0336533 0.0186553 +0.0123436 0.0351165 0.0296251 +-0.0899184 0.131005 0.0413145 +0.0065365 0.100373 0.0469448 +-0.0502879 0.133796 0.0278403 +-0.0716838 0.0351362 0.00880221 +0.0579126 0.0523842 0.0101848 +-0.0639212 0.154791 0.00385831 +-0.0654795 0.0384216 -0.00684663 +-0.0615513 0.0624603 0.0259481 +-0.0368013 0.0842007 -0.0223672 +0.0522757 0.0574291 -0.0035048 +-0.0764972 0.123179 0.0527664 +0.0302998 0.0694384 -0.019812 +-0.0334269 0.0486094 0.0413091 +-0.00450651 0.0689184 0.0565193 +0.0425976 0.0887597 -0.00680771 +-0.0707351 0.156208 0.0228366 +0.0548799 0.0492406 0.0202107 +-0.00962948 0.168316 -0.023669 +-0.0313363 0.11605 -0.0148117 +-0.0225249 0.125571 0.0012278 +0.0122871 0.124953 0.0313975 +-0.0343047 0.125361 0.0205265 +-0.038499 0.0747376 0.0420783 +0.0292349 0.0759579 -0.0220376 +-0.0255784 0.0477093 -0.0263526 +-0.0750958 0.151313 -0.0258791 +0.0057743 0.0347896 0.0375885 +-0.0926124 0.120126 0.0272917 +-0.0366664 0.175138 -0.00407486 +-0.00549337 0.088417 0.0570387 +-0.0711473 0.17507 -0.0540267 +-0.0776118 0.0739521 0.0284675 +0.0376746 0.104662 0.0282621 +-0.0634881 0.121359 0.0469409 +0.0233296 0.0564006 -0.0254415 +-0.0399361 0.123254 0.0259269 +-0.000577398 0.0341134 -0.0181551 +-0.000496894 0.0520342 0.0541515 +-0.0701023 0.177167 -0.0478719 +-0.0641167 0.143926 0.0389732 +-0.0679369 0.165269 -0.0197719 +-0.0681029 0.138305 0.0455026 +-0.00280426 0.0384802 0.0198949 +-0.0628273 0.0924874 -0.0189476 +0.0084946 0.0869435 0.0558386 +0.00910286 0.0348066 0.0183719 +-0.0195983 0.126231 0.0213862 +-0.0584949 0.143878 0.0330085 +-0.0218343 0.0553077 0.0451067 +-0.0645685 0.147457 -0.0230581 +0.0426227 0.0691122 -0.00279622 +-0.035813 0.0842739 -0.0225525 +-0.0819685 0.0791215 0.0284136 +0.0328852 0.113087 -0.00384394 +-0.0677123 0.168615 -0.0283035 +-0.0556635 0.140996 0.0299986 +-0.0764958 0.131682 0.0526442 +0.0421796 0.0832522 0.0293553 +-0.0848653 0.0855483 0.0264341 +-0.0329445 0.121338 0.0269922 +-0.0320197 0.058187 -0.0133973 +-0.0322785 0.0421631 -0.0296986 +0.0401757 0.067497 -0.00878165 +-0.0904989 0.148452 0.0245146 +-0.00947974 0.0561444 0.0530127 +-0.0310333 0.0383692 -0.000250742 +-0.0780713 0.150403 0.0367551 +-0.0872126 0.146051 0.00824907 +-0.0735722 0.148626 -0.0268487 +-0.00548676 0.116904 0.0394711 +-0.0599006 0.132533 0.037981 +-0.093479 0.129659 0.0212406 +-0.0639063 0.120904 -0.00875525 +-0.028606 0.0356961 0.0524615 +-0.0652024 0.153998 -0.041972 +-0.0262134 0.0765572 0.0473962 +-0.0774721 0.155387 0.0234212 +-0.0628707 0.0345025 0.0358026 +0.0434964 0.0555926 0.0322399 +-0.0618022 0.142496 0.0370478 +-0.0638273 0.0910291 -0.0188305 +-0.0636286 0.0672101 0.0337087 +-0.0842132 0.092522 0.0298256 +0.0185123 0.115397 0.0365584 +-0.0666269 0.131204 0.0458398 +-0.0653475 0.165775 -0.0260007 +-0.0182573 0.181629 -0.0177335 +-0.0142757 0.185348 -0.0257883 +0.0485082 0.0624718 0.0300814 +-0.0254927 0.0974122 0.0441083 +-0.0446561 0.0349999 0.0427486 +-0.0616719 0.0410515 0.0160296 +-0.0179307 0.0931593 -0.0348763 +-0.00828798 0.130102 0.00662088 +-0.0525878 0.149334 0.020403 +-0.0102534 0.128943 0.0232512 +0.0445378 0.0959706 0.0101622 +-0.0465291 0.0335268 -0.00814027 +0.00437534 0.131145 0.0198749 +-0.0394369 0.03436 0.0321562 +-0.0107155 0.127812 0.0260097 +-0.0273383 0.17123 -0.0098418 +-0.0037118 0.0655569 -0.0347446 +-0.0630689 0.150547 -0.0265942 +-0.0776846 0.16386 -0.0329461 +-0.0728796 0.151218 -0.0388899 +0.038172 0.0967289 0.0325586 +-0.058907 0.0983413 -0.0195805 +-0.00549542 0.0965711 0.0536823 +0.00650609 0.0503877 0.0517539 +-0.0847722 0.113367 0.0459387 +0.0309512 0.0822193 0.0430727 +-0.0159859 0.0984773 0.0464357 +0.0361586 0.0781359 0.0382445 +0.0417308 0.0422749 0.000248643 +-0.0631435 0.175042 -0.061564 +-0.0251041 0.0945178 -0.0276305 +0.018776 0.122594 -0.0061273 +0.0173125 0.0726566 0.0514253 +-0.0377229 0.0724783 -0.0174913 +0.0173872 0.0432828 -0.0228623 +0.0416262 0.0912615 0.0286616 +-0.050567 0.0474222 -0.00850865 +-0.0150865 0.162585 -0.00969001 +0.0143357 0.0566765 -0.0290221 +-0.0309078 0.065095 -0.0224325 +0.045522 0.0805737 0.00219452 +-0.0725374 0.138625 0.0483183 +-0.0476365 0.150675 0.00992423 +-0.0799103 0.125126 -0.00560703 +-0.051025 0.159915 -0.00453945 +0.00139766 0.0419298 -0.0244976 +-0.0664219 0.0352675 0.015055 +-0.00832508 0.130422 0.0138058 +-0.00366678 0.0481589 -0.0301707 +-0.0738566 0.161044 -0.0339379 +0.0319703 0.0475137 0.0318758 +0.0188215 0.126955 0.00377584 +-0.0309617 0.044825 -0.0281993 +0.0456484 0.0875951 0.00518134 +-0.0521074 0.0583062 0.0285239 +-0.0171825 0.0382402 0.011747 +-0.0692976 0.0615474 0.00912978 +-0.0232044 0.175652 -0.0207635 +-0.0406662 0.0592305 -0.0118049 +0.0572429 0.0508905 0.0121849 +-0.0488285 0.0416917 0.0446681 +0.0455301 0.0677752 0.0254231 +-0.0846369 0.110251 0.00429821 +-0.0754652 0.163196 -0.0162299 +-0.0247271 0.0564997 0.0408849 +-0.0639975 0.0601011 0.00610183 +-0.0741599 0.155538 0.00126713 +-0.0728899 0.122329 -0.00823917 +0.010861 0.0360066 0.0447493 +0.0150176 0.0355797 0.04239 +-0.0437155 0.0710509 -0.0175901 +0.0271589 0.093209 -0.0206672 +-0.00592646 0.12418 0.0336126 +-0.0810295 0.0895599 -0.00769505 +-0.0920663 0.121362 0.00826874 +-0.0862277 0.0832671 0.00749085 +-0.085371 0.127983 -0.0026626 +-0.081815 0.108922 0.02836 +-0.0491537 0.135503 0.0034228 +0.00885847 0.0887054 -0.0320419 +-0.0673146 0.0446682 0.00602001 +0.0152697 0.128852 0.0195703 +0.0231834 0.0422122 0.040252 +-0.0286261 0.0463451 -0.0269667 +0.0449154 0.0763231 0.00019353 +-0.0387296 0.0739178 -0.0177449 +0.0212191 0.0819428 -0.0266321 +-0.00126307 0.039726 0.0470556 +-0.0261021 0.0379463 0.0228342 +-0.0448562 0.101383 -0.0214692 +-0.0014827 0.0390261 -0.00225591 +-0.0648948 0.103911 -0.0165942 +-0.0624902 0.155293 -0.0145941 +0.000436968 0.130385 0.0227651 +-0.0219738 0.059501 0.0451263 +-0.0502789 0.129408 -0.00267456 +-0.0216757 0.065257 0.0474751 +-0.0621482 0.16155 -0.0395978 +0.0427418 0.0916392 0.0261768 +0.00967962 0.127274 0.0289934 +-0.0728707 0.168003 -0.0450202 +-0.0305611 0.179398 -0.00755573 +0.0341402 0.0902832 0.0407178 +-0.0491119 0.0361611 0.0459929 +0.0392087 0.0739776 0.0338431 +-0.0897017 0.151503 0.0171224 +0.0407967 0.105643 0.0101649 +-0.023633 0.0478399 -0.0272396 +-0.0504958 0.0862332 0.0455716 +-0.0451092 0.153606 0.00834539 +-0.0616087 0.146812 0.0373554 +0.0280342 0.0346822 0.009507 +0.0565861 0.0685555 0.00335277 +-0.027568 0.0674298 0.0392602 +-0.0926576 0.117463 0.0373027 +-0.0334278 0.124984 0.0208436 +-0.0602518 0.034678 0.0430709 +-0.0574989 0.107052 0.0398301 +-0.091226 0.128161 0.00727002 +0.0400022 0.0913669 0.0315547 +-0.0656743 0.138242 0.0419702 +-0.0852141 0.0805923 0.0204766 +-0.0444957 0.111173 0.0370595 +-0.044489 0.0803636 0.042222 +-0.00648998 0.122405 0.0354776 +0.00602348 0.111527 -0.0200414 +-0.0860119 0.132159 0.00027761 +0.0521231 0.0734583 0.0172399 +-0.0155403 0.0446621 0.0510487 +-0.0397503 0.0768521 -0.0186787 +-0.0682155 0.0787029 0.0404793 +-0.0813927 0.0758934 0.0225084 +-0.010188 0.0386565 4.14997e-05 +-0.00149609 0.0912323 -0.0347548 +-0.0294974 0.111128 0.0367729 +-0.0503924 0.0501648 0.0186468 +-0.0104698 0.070299 0.0557764 +0.0327323 0.0809002 0.0421262 +-0.0328911 0.122131 -0.00712262 +-0.0861948 0.1005 0.0258994 +-0.0319282 0.178722 -0.00808101 +-0.050675 0.140101 0.0024044 +-0.0346788 0.0636729 -0.0139354 +-0.00820144 0.0344928 -0.0181278 +-0.0830162 0.0939316 0.0314035 +0.0438286 0.0611702 -0.00330591 +-0.0162799 0.127645 0.0211086 +-0.0615233 0.0354132 0.043881 +-0.0755937 0.0809959 -0.0116148 +-0.0632393 0.166259 -0.0385929 +-0.0156738 0.0511142 -0.0317767 +0.000751147 0.0339678 -0.0215355 +-0.0534027 0.0336932 0.022744 +0.0102837 0.0348658 -0.0091814 +-0.0285082 0.0874866 -0.0336017 +-0.0849712 0.111906 0.0292041 +-0.0732162 0.169408 -0.0460252 +-0.00746424 0.110009 0.0430329 +-0.0587154 0.0723411 -0.016523 +-0.00333145 0.0968513 -0.0305901 +0.0385608 0.0713011 0.0346329 +-0.0463734 0.133247 0.0130756 +-0.0474986 0.104275 0.0408376 +-0.0714849 0.147284 -0.0260827 +-0.0404433 0.0461446 -0.0193164 +0.000709469 0.125628 -0.00726116 +0.028516 0.117882 -0.00302906 +-0.00249354 0.0746702 0.0587588 +0.0463101 0.0806468 0.00818141 +-0.0245515 0.114015 0.0358596 +-0.0396488 0.0563195 -0.0111963 +-0.0236961 0.0607746 0.0425604 +-0.0336359 0.0548461 -0.0105101 +-0.0585033 0.0337545 0.0163089 +0.0212208 0.126407 0.0160623 +-0.0729862 0.15207 0.0354642 +-0.085378 0.128494 0.0496125 +0.00429457 0.122356 -0.0118056 +0.0203517 0.0672611 0.0487139 +-0.0452845 0.0395903 -0.0182935 +-0.0211124 0.182965 -0.0210132 +-0.0295465 0.0819132 0.0441437 +-0.0777488 0.07493 0.029356 +0.00824435 0.0966482 -0.0263491 +-0.0588066 0.0854157 -0.0208208 +-0.0718999 0.113582 -0.00821597 +-0.0893735 0.0901981 0.0104595 +0.032603 0.0835706 0.0419526 +-0.0230608 0.0594124 0.0433799 +0.0284544 0.121423 0.0116324 +-0.0832785 0.12444 0.0504652 +-0.0396241 0.0520021 -0.0108773 +0.00721225 0.0837864 -0.0330068 +-0.046713 0.131987 0.00556897 +-0.0663702 0.157999 -0.00906779 +-0.067736 0.0779793 -0.0166569 +-0.0508692 0.102779 -0.0209206 +-0.0828958 0.151378 0.00422572 +-0.0346622 0.118788 -0.0116368 +-0.0726425 0.0716156 -0.00744076 +-0.059725 0.0469427 0.0326718 +-0.0468444 0.033579 -0.0045851 +-0.0384976 0.100064 0.0415702 +-0.050989 0.121022 -0.0119137 +-0.0624226 0.152205 -0.0125757 +-0.085741 0.151793 0.0266482 +-0.0826468 0.144713 0.0407672 +-0.0685649 0.0705046 -0.00966184 +-0.0734033 0.167233 -0.0217479 +-0.0455099 0.155064 0.0077969 +0.022652 0.0862116 0.0486888 +0.043364 0.0547822 -0.00644446 +-0.054457 0.14621 0.0274041 +-0.0639777 0.155958 0.0237716 +-0.0882347 0.0861347 0.011472 +0.00545294 0.1216 -0.0129959 +-0.0334673 0.174268 -0.00177832 +-0.00402179 0.129762 0.0240423 +-0.0185051 0.0711438 0.0540217 +-0.0872329 0.150111 0.00920897 +-0.090033 0.147105 0.0269347 +-0.0141936 0.0419832 0.0511586 +-0.0335873 0.154463 -0.00838872 +0.0441357 0.083266 -0.000805736 +-0.0528842 0.102762 -0.0205636 +-0.0125091 0.0815143 0.0575917 +0.0197435 0.125962 0.0226458 +-0.067993 0.0619274 0.01978 +-0.0216083 0.039391 -0.0287125 +-0.0767116 0.165247 -0.022942 +-0.0861936 0.111308 0.0401352 +-0.0238165 0.0854111 -0.0376407 +-0.0442161 0.123225 0.0243959 +-0.0175443 0.0460366 0.0510389 +-0.0272334 0.0902723 -0.0326005 +-0.0459359 0.168402 -0.00594095 +0.0355423 0.0512597 0.0315836 +0.0451079 0.0636949 -0.00183531 +-0.0368834 0.125578 -0.00482073 +0.0196258 0.0457587 -0.0217227 +-0.00773224 0.109619 -0.0221011 +-0.0514957 0.0876341 0.0455102 +-0.00269376 0.0613003 -0.0344696 +-0.0512049 0.147808 0.0143958 +0.0266901 0.106496 -0.0148024 +0.0383861 0.0476151 -0.00591592 +-0.0136895 0.0952904 -0.0330103 +0.0368491 0.0767795 0.0374896 +-0.029592 0.0522946 -0.0203629 +0.0482309 0.0500295 -0.00369862 +0.0381363 0.0794306 0.0358549 +-0.0677271 0.155796 -0.00229118 +0.026043 0.0392404 0.0305576 +0.0208388 0.126564 0.0173475 +0.0159735 0.0448127 0.0438765 +-0.0681757 0.118633 0.0523539 +-0.065068 0.136793 0.0410949 +-0.0454458 0.168254 0.00168996 +-0.0715222 0.142818 0.0455702 +-0.0604912 0.112522 0.03629 +-0.00074702 0.0712329 -0.0350931 +-0.0894331 0.150114 0.0121902 +-0.0185746 0.0381525 0.0151621 +0.0291213 0.0348096 0.00960912 +0.0404448 0.0985503 0.0271661 +0.0134712 0.0936014 0.0511282 +-0.021496 0.103017 0.0435858 +0.00918856 0.0342345 -0.00132638 +-0.0508332 0.0956285 -0.0221275 +-0.0613646 0.0394268 0.0439671 +0.0264379 0.0968548 0.0436578 +-0.0646669 0.0405364 0.0387423 +0.0125029 0.0475354 0.045933 +0.0412949 0.104257 0.00416372 +-0.00222052 0.117102 -0.0161156 +-0.00995662 0.169734 -0.0198047 +0.0200755 0.0399795 -0.0157069 +-0.0839165 0.110514 0.0395089 +-0.0546435 0.116042 -0.0146857 +0.0268767 0.0854059 -0.022529 +-0.0543926 0.0337363 0.0224962 +-0.049781 0.0841032 -0.0216622 +0.0431463 0.100109 0.00616795 +0.0393814 0.0780345 0.0341058 +-0.0162612 0.17862 -0.0260128 +-0.0335093 0.0676035 0.0406399 +-0.0176483 0.0352702 -0.0188352 +-0.031463 0.0519033 0.0373773 +-0.0803572 0.0803552 0.0319871 +-0.0320868 0.159267 -0.0129293 +0.0132853 0.0589897 0.0507165 +-0.0103631 0.180289 -0.0277342 +-0.0144925 0.0559441 0.0511232 +-0.0246444 0.0381166 0.0247786 +0.0170669 0.0871276 -0.028336 +0.00372554 0.105196 -0.0213905 +-0.0777857 0.156925 -0.0179137 +0.0578227 0.0710073 0.0178627 +-0.0582482 0.0336534 0.0128901 +-0.0520861 0.0545712 0.0266312 +0.0269849 0.113053 -0.00983991 +0.0429421 0.0467386 0.030224 +0.00548112 0.11414 0.0405028 +0.0607975 0.0637336 0.0101416 +-0.0895137 0.135181 0.0391853 +-0.0822803 0.139383 0.0462108 +0.00350363 0.0883757 0.0563643 +-0.0599112 0.109712 -0.0163845 +-0.0699244 0.107994 -0.0118147 +-0.073438 0.145781 -0.0138542 +-0.0702694 0.156361 0.0186365 +0.0365208 0.0713424 0.036933 +-0.0764811 0.141399 0.0471717 +-0.0338378 0.0943788 -0.02372 +-0.0185768 0.055451 0.0489119 +-0.0294962 0.107041 0.0398129 +0.0351663 0.0783387 -0.0157415 +-0.0823976 0.095314 0.0321564 +0.0458052 0.08902 0.00916777 +0.00466954 0.0341296 0.0180802 +0.012258 0.0751733 -0.0308354 +-0.0176564 0.0480544 -0.0295902 +-0.0487658 0.0811872 -0.020682 +-0.0375125 0.045091 0.0407522 +0.00960807 0.0375632 0.0322947 +0.0522688 0.0462249 0.00921199 +-0.0452834 0.0395877 -0.019291 +-0.0396931 0.126183 0.0200311 +-0.0903381 0.144712 0.0141544 +-0.0430213 0.0450576 -0.0153284 +-0.0539191 0.129665 -0.00510771 +-0.0384876 0.108386 0.0375357 +-0.0496388 0.0605583 -0.0113235 +-0.034501 0.115223 0.0328885 +-0.0540284 0.131061 -0.00500164 +-0.0147028 0.0389017 0.0333119 +-0.0207376 0.0641563 -0.0358205 +0.00590682 0.131658 0.0132863 +-0.0819436 0.154696 0.0145801 +0.0526661 0.0660937 -0.000184776 +-0.0526201 0.14007 0.0244025 +-0.0752504 0.177839 -0.0529463 +-0.0574955 0.0946379 0.0447737 +0.0456129 0.0904097 0.00518194 +-0.0282629 0.122524 0.022734 +-0.0680338 0.142566 0.0438693 +-0.0643033 0.0426016 0.0312522 +-0.0314971 0.102929 0.041974 +-0.00589664 0.0980966 0.0519993 +-0.0542782 0.132533 0.0338047 +-0.0911122 0.11473 0.0343167 +-0.0493972 0.140141 0.00739907 +-0.0577664 0.0485104 0.00767417 +-0.0629684 0.139576 0.0370615 +-0.0122087 0.128137 0.0240139 +0.00116984 0.129366 -0.00128907 +-0.039496 0.0634667 0.0415276 +-0.0427066 0.0696149 -0.0170299 +-0.0721201 0.149786 -0.0402916 +-0.0637423 0.168365 -0.0426884 +-0.0228169 0.0383283 0.0285633 +-0.0894925 0.143336 0.0131803 +-0.0408822 0.128708 0.0107294 +-0.043783 0.147719 0.00491206 +0.00912223 0.0833108 0.0554277 +-0.0543042 0.0335497 0.00301212 +-0.0544171 0.0333785 -0.00775516 +0.0295237 0.0727272 0.042682 +-0.0504982 0.112495 0.0358796 +-0.0240218 0.119915 -0.0108978 +-0.0535232 0.0556038 0.0117195 +-0.0480175 0.133707 0.00490199 +0.00583381 0.129313 0.0261699 +-0.0405566 0.149165 -0.00293165 +-0.0286765 0.0690744 -0.0314836 +0.0453693 0.0693828 0.00245115 +0.0581659 0.056561 0.00517446 +0.0192888 0.0651078 -0.0282476 +-0.0228892 0.0739252 0.0512281 +-0.0217183 0.113234 -0.017904 +0.0365187 0.0526805 0.0315096 +0.0490482 0.0539975 0.0303486 +0.0175085 0.114012 0.0373101 +-0.0328107 0.126843 0.0122027 +-0.0687814 0.0336983 0.00353162 +0.0220892 0.0906332 -0.0239505 +-0.0460528 0.122513 0.026245 +0.0381409 0.109688 0.00657231 +0.0368421 0.0742334 -0.0127504 +-0.0657975 0.0340784 0.0127357 +-0.0706216 0.146831 -0.0255714 +-0.0468292 0.091298 -0.0217206 +-0.0914681 0.144718 0.0171554 +-0.0624908 0.0343254 0.0238098 +0.0543739 0.0477987 0.0161989 +-0.0195403 0.1757 -0.0161256 +0.0224671 0.0343921 0.00678503 +-0.0654707 0.155271 0.00728456 +-0.0897135 0.12265 0.00431103 +-0.0501651 0.0361307 0.0461721 +-0.0901888 0.139114 0.0151891 +-0.0726107 0.156829 -0.0349095 +-0.0334964 0.0718545 0.0411869 +0.0106165 0.0644536 0.0539383 +0.0274263 0.0491525 0.0376576 +-0.0157908 0.169796 -0.0160148 +-0.0608326 0.17151 -0.0610901 +0.0136156 0.126814 -0.00267762 +0.0293325 0.0535401 0.0386956 +-0.0652579 0.153012 -0.0402459 +0.0264019 0.036087 0.0225582 +0.0101281 0.105858 -0.0202342 +-0.0674046 0.0833115 0.0429955 +-0.0312435 0.0538841 -0.0143722 +0.0424267 0.0441756 -0.00158684 +-0.0305089 0.0760274 0.0408429 +-0.0849899 0.127963 -0.0030064 +-0.0223249 0.0386602 -0.0135496 +0.0216012 0.112963 -0.0137495 +-0.0224297 0.0552774 0.0442986 +-0.093152 0.121537 0.0362834 +-0.0384463 0.166779 0.00239389 +0.0317419 0.0667553 -0.0187125 +-0.0127135 0.100022 -0.0239701 +0.0204112 0.0371925 -0.00568428 +0.0383001 0.0969495 -0.00880451 +-0.0500528 0.150184 -0.0037815 +-0.0578783 0.106898 -0.0179862 +0.0485378 0.0682762 0.00156381 +-0.0708965 0.0341323 0.00629169 +-0.0871174 0.110466 0.0103621 +-0.0235739 0.0944939 0.0470656 +-0.0164815 0.0515035 0.0485835 +0.0325428 0.0380502 1.57112e-05 +0.0385774 0.0888011 0.0348199 +-0.0628692 0.0445185 0.0382675 +-0.0572856 0.125533 0.0399888 +-0.0780066 0.0940671 0.0362827 +-0.0361012 0.160724 -0.0132118 +0.0200495 0.124902 -0.000599563 +0.0101263 0.107276 -0.0197522 +0.0224877 0.0961643 0.0466342 +-0.077715 0.0852782 -0.0115916 +-0.0164955 0.105778 0.0423459 +-0.0725318 0.101313 0.038599 +-0.0663565 0.0783826 0.0411592 +-0.0644378 0.17995 -0.0588828 +-0.0645973 0.171184 -0.0458828 +0.0111199 0.129735 0.0223368 +-0.018333 0.172741 -0.0161594 +-0.0864925 0.10492 0.00639597 +-0.0144943 0.0500942 0.0487331 +-0.0855601 0.095177 0.0282718 +1.67787e-05 0.0386604 0.0239291 +0.0109499 0.0344084 0.00259617 +-0.0270041 0.168274 -0.00938266 +-0.0378811 0.107099 -0.0200653 +0.060304 0.0664655 0.0101406 +-0.0478845 0.108472 -0.0188663 +0.0181085 0.0591163 0.0489014 +-0.0260899 0.0522789 0.0395517 +0.0049437 0.0984176 -0.0242128 +-0.0623314 0.0357831 0.0433788 +0.0110403 0.0725847 0.0546235 +-0.0864956 0.084691 0.0204775 +-0.00849993 0.0787667 0.0579153 +-0.0260008 0.0382709 0.000860974 +-0.06937 0.145758 -0.0234859 +-0.0314168 0.117929 -0.0127586 +-0.0261669 0.0378674 0.0174813 +-0.0832309 0.120353 0.049216 +-0.0617814 0.16156 -0.0355923 +-0.0779669 0.165862 -0.0278956 +-0.0698398 0.0922797 -0.0162924 +0.0483255 0.0503286 -0.00380134 +0.0451716 0.0889782 0.0181643 +0.0329815 0.112282 -0.00498623 +0.0279206 0.0916217 -0.0209795 +0.0155 0.11402 0.0377783 +-0.0105379 0.0431327 0.0497176 +0.0606167 0.0609422 0.00915424 +-0.0181983 0.18599 -0.0174024 +0.0189716 0.115037 -0.0139804 +-0.0590849 0.0644137 0.0318252 +-0.0819254 0.12582 0.0519232 +-0.0588398 0.0954803 -0.0203334 +-0.0674426 0.148384 -0.0326115 +0.0387628 0.10462 0.0262683 +0.00841723 0.129272 0.0256623 +-0.0196119 0.0364667 -0.0278852 +-0.0376923 0.162356 -0.000243841 +1.88808e-05 0.115368 -0.0182789 +0.0393962 0.0505525 -0.00668347 +-0.0116788 0.0555838 -0.0339192 +0.0363865 0.0713868 -0.0138007 +-0.0821651 0.110069 0.034903 +0.022728 0.117081 -0.0101857 +-0.0515389 0.0417461 -0.0105815 +0.0219588 0.123501 -0.00109075 +0.00735928 0.0960033 -0.0276522 +-0.00349428 0.119696 0.0379021 +-0.0470844 0.151656 -0.00519447 +-0.0242296 0.0941248 -0.0298734 +0.0152433 0.0658912 0.0518711 +-0.021804 0.0376594 -0.0181241 +-0.0133966 0.121962 -0.00916065 +0.0365536 0.108655 0.0265769 +-0.0668098 0.0880715 -0.0180091 +-0.0665181 0.171112 -0.0407548 +0.0493343 0.0532247 -0.0043679 +0.0423933 0.0901635 -0.00682346 +-0.0624126 0.150651 -0.0115734 +0.0373944 0.0505276 -0.00658166 +-0.0411461 0.162173 -0.0113613 +-0.065916 0.0662086 0.0305519 +-0.0289729 0.083488 0.0456837 +-0.000642523 0.0347913 0.0398677 +-0.0738147 0.065744 0.00631032 +0.00351431 0.0938625 0.0544725 +-0.0467733 0.12389 0.0269319 +0.0246632 0.123785 0.00595837 +-0.0715256 0.0958228 0.0413941 +0.00252922 0.0362636 0.0463395 +0.00948792 0.0963424 0.0500581 +0.0292035 0.0400739 0.0286474 +-0.0309481 0.0706991 -0.0284733 +-0.054091 0.152763 0.0215579 +0.0118527 0.105542 -0.0197545 +-0.0404793 0.0832528 0.0431634 +-0.0448438 0.0985036 -0.0215544 +-0.032014 0.0567822 -0.0123897 +0.00040853 0.0356817 0.00488121 +0.0447245 0.0861403 0.0231669 +-0.0426307 0.0338188 -0.00946517 +-0.0710495 0.141325 -0.00813095 +-0.0255896 0.182763 -0.0105092 +-0.0838169 0.107636 0.0253505 +-0.0796245 0.0859561 0.0353266 +0.0240034 0.0449703 0.0396985 +0.00450108 0.0716864 0.0560951 +-0.0676894 0.0750921 -0.0153176 +-0.0466572 0.0369109 -0.0172699 +-0.016529 0.0558872 0.0508401 +-0.087831 0.103641 0.0093887 +0.0272256 0.10745 0.0377741 +-0.0670064 0.0337953 0.0073865 +-0.0866888 0.0833263 0.0124872 +0.0152687 0.0779357 -0.0299953 +-0.0851819 0.152725 0.0105454 +0.000352424 0.0511166 -0.0306262 +0.0518495 0.0464359 0.0201911 +0.0554005 0.0553511 0.0254886 +-0.0886141 0.0928486 0.00844707 +0.0129712 0.130228 0.0115965 +-0.085549 0.104961 0.0233427 +0.0515991 0.0496316 0.0251833 +0.0131946 0.0878791 -0.0305989 +-0.0693376 0.131255 0.0489674 +-0.0660205 0.167997 -0.0305503 +-0.0666146 0.174697 -0.0480375 +-0.0293346 0.0347045 0.0427947 +-0.0553259 0.126836 -0.00601308 +-0.058583 0.0460291 0.0113967 +-0.0416277 0.0337441 -0.014735 +-0.0446642 0.0621749 -0.0132201 +0.0295862 0.120365 0.0134787 +-0.0697163 0.064282 0.022673 +-0.0805487 0.0789662 0.0306236 +-0.0787564 0.154933 0.00983696 +-0.0662707 0.14708 -0.0258685 +-0.0248167 0.0949702 -0.0267501 +-0.0407693 0.0826515 -0.0208197 +0.000514101 0.0346343 0.00952105 +-0.0533361 0.138123 0.0280776 +-0.0689277 0.115103 -0.00892086 +-0.0865224 0.0913375 0.0024428 +0.0232602 0.0790529 -0.0256674 +0.0296786 0.0679688 -0.0198342 +-0.0331127 0.123309 0.0239558 +0.0276403 0.118218 0.0284429 +0.00238303 0.0449286 -0.0261957 +-0.0928278 0.124236 0.0382657 +-0.0868685 0.11045 0.00936714 +-0.0254875 0.0959781 0.0438332 +0.0132252 0.0808221 -0.0308314 +0.035265 0.0591791 0.0368077 +-0.00944135 0.168135 -0.0197365 +0.0011864 0.12951 0.0259323 +-0.0139593 0.0967237 -0.0305143 +-0.00848922 0.0385737 0.0258802 +0.0562981 0.0619429 0.0011209 +0.0322546 0.0987343 -0.0145759 +-0.0268707 0.103016 -0.0234914 +-0.00655639 0.0384205 0.0209905 +-0.0296666 0.0774462 0.0418826 +-0.0626586 0.0676213 -0.0103966 +0.0374569 0.0904362 -0.0137042 +-0.0712181 0.161 -0.0439365 +0.0243668 0.0889213 0.0476805 +-0.0336134 0.0408899 -0.0298935 +-0.0404969 0.0916505 0.0425962 +0.0443454 0.0903358 0.0221636 +-0.0435232 0.163746 0.00524284 +-0.0649943 0.0623954 0.0235277 +-0.0613093 0.0593276 0.0181457 +-0.0717978 0.155398 -0.0409076 +-0.00868753 0.0584178 -0.0339256 +-0.0904383 0.119966 0.00529664 +-0.0601615 0.0333995 -0.00165181 +-0.0612252 0.0407891 0.0437895 +-0.0537348 0.0738508 -0.0172852 +-0.0709057 0.10512 -0.0125462 +-0.00333997 0.039253 0.0353398 +-0.0469903 0.145002 0.00194161 +-0.0250386 0.0659034 -0.0335362 +-0.023273 0.0382876 0.00502865 +0.0111228 0.0960826 -0.0257288 +0.0198113 0.0954368 -0.0230239 +0.038476 0.104075 -0.00282883 +-0.0843581 0.0883713 0.0286614 +-0.0930341 0.118841 0.0362969 +-0.0646767 0.146003 -0.0179612 +0.0284626 0.102127 0.0395666 +-0.0435018 0.113907 0.034675 +-0.0604863 0.0790224 0.042794 +-0.089042 0.112536 0.0205154 +-0.0524675 0.0344946 0.0345461 +-0.0848716 0.119101 -0.00207765 +-0.0120923 0.11442 -0.0172013 +-0.079929 0.151371 0.00121035 +-0.0920085 0.116136 0.0393096 +0.0361533 0.112569 0.0130564 +-0.0196629 0.125034 -0.00230889 +0.000499429 0.115573 0.0406664 +-0.0560183 0.147198 -0.00168648 +-0.0873616 0.110481 0.0113565 +-0.0416844 0.0636674 -0.0137203 +-0.0651889 0.153592 -0.00278678 +0.0471599 0.07398 0.0153485 +0.0404106 0.0873775 0.0321991 +-0.019434 0.184905 -0.0153275 +-0.0438294 0.0913555 -0.0224139 +-0.0527613 0.0797578 -0.020501 +-0.0314155 0.0651435 -0.021432 +0.00948509 0.0950229 0.0512669 +0.0346346 0.107297 -0.007625 +-0.0870053 0.0954387 0.00242783 +-0.0617312 0.142927 -0.00565867 +-0.0538929 0.14622 0.0244012 +0.0339044 0.115273 0.00366751 +0.049575 0.0693171 0.00251779 +-0.0861009 0.106274 0.00635995 +-0.00751182 0.075985 0.0578234 +-0.0761849 0.0933719 -0.0135017 +0.0266626 0.0672707 0.0437593 +-0.0314925 0.0932138 0.0444288 +0.0112937 0.0680868 -0.0307505 +-0.086045 0.141863 0.00720055 +0.000490707 0.111422 0.0424934 +-0.0516022 0.0502173 -0.00741774 +-0.0709386 0.131124 -0.00852217 +-0.0291841 0.125368 0.0164845 +-0.0012258 0.095852 -0.0315171 +-0.000697567 0.0641196 -0.0342689 +-0.0797379 0.0738711 0.0228323 +-0.0705682 0.0382102 0.00943236 +-0.0558807 0.102663 -0.0193944 +0.0262875 0.0835737 0.0468767 +-0.0206175 0.0364922 -0.0281092 +0.0306136 0.0779431 -0.0207534 +0.037492 0.0983062 -0.0097724 +-0.0861064 0.0806138 0.0174966 +-0.0488748 0.105594 -0.0196597 +-0.0499497 0.0724883 0.0409516 +-0.060435 0.131107 0.0389542 +-0.0197383 0.108898 -0.0213322 +-0.0328414 0.0943934 -0.0238538 +0.0071329 0.104451 -0.0211019 +-0.0904392 0.125398 0.00528343 +0.0579573 0.0676391 0.00414749 +-0.0890486 0.0915916 0.0214249 +0.0544885 0.0716156 0.00618127 +0.037936 0.0901639 0.0356574 +-0.0631289 0.155254 0.0269868 +0.0280038 0.120349 0.024295 +0.00325461 0.0697315 -0.0336623 +0.0198002 0.0768324 0.0515324 +0.0135718 0.0504901 0.0475195 +-0.0220331 0.041681 0.0538782 +-0.0322365 0.126297 0.00653811 +-0.020497 0.0855906 0.0563403 +0.0100844 0.123139 0.0340691 +-0.0917617 0.141982 0.0191718 +-0.00665267 0.0526646 -0.0325345 +0.0325469 0.0922927 -0.0176842 +-0.00490321 0.0383839 0.0141185 +0.0393963 0.049102 -0.00636122 +-0.0468295 0.0927337 -0.0216687 +0.0393484 0.0561243 -0.00568756 +0.0381042 0.0392738 0.00134927 +-0.02061 0.0653432 0.0492306 +-0.0644858 0.152894 -0.00250698 +0.0316363 0.118365 0.0113851 +-0.0625842 0.162383 -0.0563311 +-0.0126137 0.180121 -0.0236267 +-0.0562637 0.142432 0.0309288 +0.0389203 0.10838 0.0161659 +0.0468209 0.0708789 0.021127 +0.0153317 0.060873 -0.028643 +-0.067208 0.0447917 0.00368814 +-0.0638714 0.15469 -0.0385902 +-0.0624126 0.161536 -0.0416011 +-0.011049 0.124435 -0.00785173 +0.0143712 0.0493733 -0.0267066 +-0.0374862 0.0931566 0.0438456 +-0.0278525 0.0807805 0.0474761 +0.0573848 0.0670309 0.00292365 +-0.0304938 0.0960556 0.0449536 +0.0182602 0.127523 0.0192457 +0.0182204 0.080645 -0.0282763 +-0.00275795 0.0740872 -0.0359501 +-0.072697 0.155649 0.00759319 +-0.0857527 0.0792184 0.0135098 +-0.0604443 0.0456013 0.0296807 +-0.0528198 0.0927332 -0.0219739 +-0.0457202 0.0709417 -0.0164642 +-0.054497 0.0889964 0.0448823 +-0.0541353 0.147754 0.0254132 +0.05074 0.0503045 -0.00171178 +-0.0926993 0.124215 0.0352716 +0.00850767 0.0786 0.0556334 +-0.0141847 0.0405865 0.0511605 +-0.0500491 0.0345412 0.0367666 +-0.0744234 0.156022 0.0128056 +-0.0148381 0.0386367 -0.0157684 +-0.0896535 0.0916031 0.0184402 +-0.0279306 0.125506 0.00666413 +-0.0249827 0.0918474 0.0485489 +-0.0247746 0.0385687 -0.0102357 +-0.0718755 0.10648 -0.0114758 +0.0303733 0.115414 -0.00438737 +0.0390771 0.099844 -0.00681802 +-0.0601235 0.0447437 0.0425684 +0.0559507 0.0508031 0.00520531 +-0.087948 0.102288 0.00840013 +-0.0802939 0.0732789 0.00250413 +-0.00347452 0.114725 -0.0175669 +-0.0780015 0.155773 0.018849 +-0.0868392 0.0873072 0.00147849 +0.0114304 0.0346172 0.0371012 +-0.0154945 0.0925097 0.0555061 +0.0207547 0.10431 -0.0184628 +-0.0805113 0.153427 0.0283513 +-0.0133702 0.0343611 -0.0190243 +0.045363 0.0932019 0.00717004 +-0.0517619 0.079747 -0.0203928 +-0.011137 0.171308 -0.0197957 +-0.0797359 0.0706327 0.0105539 +-0.0435047 0.116629 0.0323741 +0.0461192 0.0786876 0.0190773 +0.0257679 0.0349257 0.0180133 +-0.0377436 0.127354 0.000111554 +0.0455391 0.0875946 0.0141649 +-0.0115776 0.0962625 -0.032007 +-0.0304054 0.0580102 -0.0194062 +-0.0519213 0.118323 0.0336042 +-0.0615165 0.15114 0.0355512 +-0.0268549 0.175688 -0.00910606 +0.0291872 0.0462618 0.034893 +-0.0828817 0.143196 0.00216401 +-0.0229243 0.0972075 0.044901 +-0.0420606 0.0344689 0.0332688 +0.00840712 0.0404044 -0.0234014 +-0.0584986 0.100161 0.0428821 +0.0267286 0.0521731 -0.0207566 +-0.0343564 0.043282 -0.028737 +0.035312 0.0840703 -0.0177861 +0.0167493 0.0874098 0.0506847 +-0.0706375 0.156126 0.0126907 +0.0395317 0.0596774 0.0306966 +0.0160357 0.0807986 0.0531419 +-0.0719071 0.105086 -0.0120336 +0.057752 0.0523416 0.0181873 +-0.0705862 0.166615 -0.0490027 +-0.069998 0.157611 -0.0031485 +-0.0629727 0.118457 0.044154 +-0.0098895 0.107351 -0.0224128 +-0.0668287 0.169972 -0.0351376 +-0.0538607 0.152062 0.0231076 +0.0286155 0.0795328 0.044942 +0.00747725 0.131195 0.0181386 +0.0525355 0.0678367 0.0261828 +-0.069983 0.033931 0.00665746 +-0.00449526 0.10588 0.044033 +-0.0647467 0.143415 -0.011401 +-0.0242451 0.0337053 -0.0224295 +0.0405945 0.102819 0.0221712 +-0.0253936 0.106122 -0.0223873 +-0.031866 0.126076 0.00521848 +-0.0903832 0.132413 0.0312232 +0.0270423 0.0648893 -0.0216756 +-0.0416036 0.125525 0.0208631 +-0.0642885 0.148287 -0.0250747 +0.043249 0.0705728 -0.00179391 +0.00750831 0.0772509 0.056126 +-0.0360471 0.125746 -0.0036679 +-0.0534999 0.0820142 0.0450601 +-0.0268076 0.0782799 -0.0366273 +-0.0630392 0.0336157 0.00836468 +0.00450283 0.0924607 0.0546761 +-0.0794816 0.0846149 0.0352279 +-0.0354976 0.116636 0.0319301 +0.0590094 0.0552651 0.0101755 +0.0177618 0.100614 -0.0224544 +0.0141872 0.0347155 0.0357788 +-0.0626395 0.0644043 -0.00619313 +-0.0472223 0.168222 -0.000777409 +-0.0688709 0.156258 0.0147705 +-0.00209707 0.130745 0.0203917 +0.0438165 0.0959355 0.0191615 +0.0272253 0.120021 -0.000250724 +-0.0623918 0.152158 -0.026581 +-0.0619803 0.153737 -0.02558 +-0.0110119 0.122536 -0.00980812 +-0.00845767 0.100229 0.0476033 +-0.053626 0.1255 0.0365054 +0.029243 0.0872327 -0.0208644 +-0.0561028 0.133503 -0.00512832 +-0.0536146 0.150855 0.0243962 +-0.0729449 0.0805494 0.0386997 +-0.0113093 0.0384672 0.00547553 +0.013929 0.0392001 0.0444158 +-0.0743245 0.179234 -0.0539852 +-0.0670834 0.168031 -0.0569976 +0.0269196 0.0418157 0.0333163 +-0.0261604 0.114813 -0.0155316 +0.054979 0.06227 -0.000302264 +0.0447631 0.0931576 0.00318223 +-0.028552 0.159576 0.000695282 +-0.0196334 0.0906851 0.0545345 +-0.0681661 0.173216 -0.0428508 +-0.0670035 0.166617 -0.0570134 +-0.00170857 0.0641356 -0.0344906 +-0.0302923 0.115032 -0.0157497 +-0.017789 0.0998203 0.0439009 +0.0575984 0.0711737 0.0088801 +-0.0559485 0.119826 0.0383628 +-0.0508832 0.106998 -0.0191626 +-0.0856518 0.096702 -0.000561949 +0.0433856 0.0475038 -0.0047769 +-0.0141839 0.177168 -0.0206609 +-0.0318261 0.0623615 -0.0184459 +-0.0694684 0.158126 -0.0509379 +-0.059088 0.0445923 -0.00517311 +-0.0680469 0.0887699 0.043444 +0.0413366 0.0588699 -0.00449648 +-0.0108613 0.16611 -0.0209706 +-0.0810695 0.111472 -0.000645954 +0.0236683 0.0535376 0.0428398 +-0.0525009 0.104252 0.0406803 +0.0178265 0.128119 0.0148069 +-0.0833287 0.0817012 -0.000498118 +-0.0582078 0.148218 0.0334722 +0.0469627 0.0735494 0.00823046 +0.0348898 0.0889372 0.0400127 +0.0544139 0.0478718 0.0102055 +-0.0519767 0.0343446 0.0277664 +-0.0526872 0.144684 0.0193835 +-0.0654577 0.0403952 0.0367257 +-0.0632766 0.146612 -0.0147592 +-0.0756638 0.0968147 0.0380937 +-0.0121766 0.169774 -0.0245851 +-0.0313173 0.115081 -0.0157968 +0.00550009 0.105744 0.0419393 +0.0170456 0.0808203 0.0528345 +0.00997537 0.129323 0.0247881 +-0.000565033 0.0348667 0.0451983 +-0.0170398 0.124093 -0.00535053 +0.0359746 0.112738 0.007259 +-0.0264982 0.112519 0.0362632 +-0.0108141 0.0841239 -0.038537 +-0.0464922 0.097353 0.0431423 +0.0456344 0.0820067 0.0201819 +-0.00765915 0.0388225 0.0294318 +0.00952232 0.057476 0.0527668 +-0.0114724 0.180094 -0.0295969 +-0.0324762 0.0778813 -0.0295332 +-0.0515001 0.0465582 0.0417907 +-0.0716564 0.0639047 0.0190638 +-0.00648988 0.10728 0.0440126 +0.0517118 0.048146 0.0235716 +-0.00973422 0.0712867 -0.0371391 +-0.0311873 0.0499402 0.0418672 +-0.0652548 0.0380623 0.0267185 +-0.0353491 0.0346157 0.0221204 +-0.00455763 0.115688 -0.0165869 +-0.0158711 0.0941172 -0.0338261 +-0.0307264 0.0510087 -0.0163552 +-0.0674749 0.0861001 0.0436947 +-0.00549495 0.0456998 0.0471564 +-0.0127624 0.0742651 -0.0384156 +-0.0667813 0.0354951 0.0323861 +-0.0650934 0.040468 0.0377689 +0.00949782 0.11825 0.0371477 +0.042476 0.0986857 0.0211679 +0.0134353 0.0833572 0.0528968 +-0.006265 0.0381462 0.0486516 +0.019505 0.108463 0.0397034 +-0.0531501 0.13113 0.0336749 +-0.0169066 0.174228 -0.0176024 +-0.0877346 0.144562 0.0345528 +-0.0620052 0.131132 -0.00795604 +0.00350354 0.0967589 -0.0284524 +-0.0379926 0.15214 0.00278328 +-0.0250008 0.0678945 0.0436439 +0.013488 0.120719 -0.0120957 +-0.0546814 0.0342953 0.0289953 +-0.0493523 0.128134 -0.0033313 +-0.00536457 0.0387134 0.026395 +-0.0301008 0.162274 -0.0148279 +-0.0520761 0.153139 -0.00390728 +-0.0312974 0.120401 0.0276066 +-0.072708 0.173064 -0.0373345 +-0.0634981 0.0847405 0.0443851 +-0.00748204 0.123738 0.0339317 +0.0398166 0.0726016 0.0329349 +-0.0204571 0.159751 -0.0120682 +-0.0398664 0.104215 -0.0203975 +0.006345 0.0351555 0.0445736 +-0.0295025 0.0974144 0.0445077 +-0.00148646 0.0489421 0.0507365 +-0.0158009 0.0813621 -0.039398 +-0.0661715 0.0383371 0.0290301 +-0.0520592 0.0517918 0.0296489 +0.0132683 0.0765435 -0.0305058 +0.0357248 0.113154 0.00859849 +0.0452751 0.0847797 0.0211588 +0.0408906 0.0942563 -0.00676992 +-0.0621992 0.16466 -0.0525894 +-0.0704991 0.101365 0.0396906 +-0.0514936 0.0959907 0.0439844 +-0.0738976 0.0662178 0.00410027 +-0.0308753 0.104365 -0.0222089 +-0.0454852 0.0411575 0.0440424 +0.0264018 0.0591975 -0.0228202 +-0.0372554 0.154082 -0.00855912 +-0.0104302 0.175693 -0.0238578 +-0.0581296 0.0583212 0.0178996 +-0.0237002 0.0610797 -0.032726 +-0.0366248 0.127943 0.00786237 +-0.00749367 0.0605601 0.0556586 +-0.0317091 0.0749949 -0.0294856 +-0.0617882 0.138121 0.0352393 +-0.0764283 0.117143 0.0518912 +-0.0476607 0.120291 -0.0131944 +-0.0617261 0.158412 -0.0335949 +-0.0794782 0.106106 0.0317497 +-0.00127622 0.127442 0.029403 +-0.0850735 0.0819457 0.0214598 +-0.088151 0.137836 0.0407884 +-0.0622605 0.152178 -0.0225796 +-0.0896207 0.132365 0.0409732 +-0.0392773 0.153597 0.0044688 +-0.0477636 0.0797421 -0.0198355 +0.0475024 0.06248 0.0300852 +0.0137309 0.0344041 -0.00431645 +-0.0864106 0.136323 0.00223079 +-0.0622483 0.0470201 0.00467011 +-0.0218601 0.0893132 0.0539604 +-0.0404866 0.0390699 -0.027317 +-0.0563767 0.0650155 0.0336358 +-0.022785 0.0727991 -0.0382731 +0.00745846 0.0952014 -0.0287983 +-0.0728877 0.143976 -0.0119757 +-0.0485361 0.130681 1.6802e-05 +-0.08227 0.0830732 0.0310042 +-0.0458007 0.0884477 -0.0220772 +-0.0674901 0.102816 0.040307 +-0.0295082 0.0987895 0.0437091 +0.0266247 0.0591987 0.0436528 +-0.0166425 0.0970062 0.0498004 +-0.0754488 0.151352 -0.0128993 +-0.0561187 0.04231 0.0196965 +-0.0125561 0.107483 -0.0218463 +-0.0258638 0.0987461 -0.0241399 +-0.0150968 0.0965608 -0.0303463 +0.0403869 0.0505617 -0.00671315 +-0.0618596 0.135275 0.0369058 +-0.00853806 0.120181 -0.0133625 +0.0152242 0.123558 0.0310525 +-0.0669104 0.112326 -0.011534 +-0.00121369 0.0389243 -0.000247464 +0.0599261 0.0581121 0.0171753 +-0.0104999 0.0842933 0.0575891 +0.0236959 0.120687 0.0298434 +0.0407626 0.105627 0.00616707 +-0.0204813 0.10165 0.0438784 +-0.0497999 0.0884036 -0.0217208 +0.0455191 0.0847794 0.00419259 +-0.0113995 0.128605 0.00179072 +-0.0808762 0.0733317 0.00350919 +-0.0634956 0.0804499 0.0432131 +-0.0737877 0.170302 -0.0290826 +-0.00649113 0.0718493 0.0579775 +-0.0445186 0.0533636 0.0386768 +0.0320623 0.104555 -0.0127247 +-0.0491177 0.138604 0.00740359 +0.0459251 0.0848195 0.0121712 +0.0423718 0.0547731 -0.00653415 +-0.0505603 0.0417939 -0.0107632 +-0.0551112 0.0477166 -0.00539308 +-0.0492183 0.150688 0.0111503 +-0.0868019 0.0886457 0.00149241 +-0.0414982 0.166749 0.00369508 +-0.00533161 0.123249 -0.0106624 +0.00612795 0.107304 -0.0203065 +0.023391 0.0605296 0.0460187 +-0.0778945 0.102117 0.0345146 +-0.0177322 0.108689 -0.0211068 +-0.0341359 0.168185 -0.0152479 +-0.0364811 0.0931828 0.0441998 +-0.0645148 0.15586 0.0250316 +-0.0133496 0.124356 0.0309811 +-0.053528 0.131291 -0.0047694 +0.0236875 0.0373106 0.0299772 +0.00806894 0.0972917 -0.0250353 +0.0518069 0.0518147 -0.00170668 +-0.0580149 0.0675718 0.0363481 +-0.0916942 0.124053 0.00727726 +0.0143227 0.0344255 0.0215932 +-0.0828034 0.0762521 0.011522 +-0.0523769 0.119775 0.034728 +-0.0380638 0.174118 -0.00995608 +-0.0515288 0.0559219 0.0167726 +-0.0665225 0.10009 0.04154 +0.0449219 0.0497223 0.0313654 +-0.00374083 0.069852 -0.0355987 +-0.0448162 0.12956 0.0195798 +0.00318984 0.0852564 -0.0341139 +-0.0901249 0.125637 0.04453 +0.0248625 0.12099 -0.00239034 +-0.0357073 0.03405 0.0117511 +-0.0461509 0.05879 0.0381434 +0.0389649 0.108275 0.00542368 +-0.0857362 0.141867 0.00617644 +-0.0755097 0.135846 0.0506323 +0.0384382 0.0954258 0.0328906 +0.00385238 0.131766 0.0125385 +-0.0277181 0.0382234 0.00237012 +0.0554262 0.0714159 0.00640835 +-0.0707971 0.168292 -0.02371 +-0.0131917 0.169758 -0.0239616 +-0.0344904 0.0661905 0.0406967 +-0.00154364 0.130277 0.00186507 +-0.0647696 0.148087 -0.0261392 +-0.0577571 0.0334518 0.000595927 +-0.0334995 0.0618586 0.0392638 +-0.0657123 0.171986 -0.0448274 +-0.0254896 0.049863 0.0466034 +-0.0207287 0.058287 -0.0332963 +-0.040488 0.088839 0.0428058 +0.00826686 0.0681716 -0.0316571 +-0.0382076 0.0431174 -0.0263315 +-0.0192007 0.0392753 0.0392298 +0.0446778 0.0701888 0.00161208 +-0.0681688 0.0340999 0.0104427 +-0.0891956 0.099693 0.0183885 +0.00250408 0.0856622 0.0573274 +0.00673484 0.0364109 -0.0131882 +-0.0273112 0.0917698 0.0451953 +0.0360152 0.072737 0.038003 +-0.0174841 0.0910963 0.0554741 +-0.0882831 0.114383 0.0443189 +-0.0562701 0.0534697 0.00668599 +0.0184737 0.104403 0.0439338 +0.0591195 0.067343 0.0203999 +-0.0464971 0.107057 0.0400682 +0.0224712 0.125479 0.00796738 +-0.00281596 0.0896133 -0.0355773 +-0.0892259 0.113441 0.0323782 +-0.0532781 0.0476794 0.0246524 +0.00120832 0.0811183 -0.0353756 +-0.0820812 0.0748515 0.0115294 +-0.0344414 0.153644 0.000910386 +-0.0915313 0.147463 0.0171482 +-0.0778811 0.12224 -0.00662917 +0.00275904 0.130985 0.0207146 +0.0333375 0.115599 0.0220283 +-0.0925663 0.116874 0.0234322 +-0.0461657 0.168264 0.000998904 +-0.0608088 0.148246 0.0367611 +-0.0740333 0.13404 0.0510058 +0.046183 0.0806404 0.0141758 +-0.0177485 0.0700027 -0.0382786 +-0.05252 0.0490121 0.0379722 +-0.0142459 0.168321 -0.0155387 +-0.0894247 0.0996886 0.0153976 +-0.0654783 0.0861634 0.0444498 +0.0323217 0.116577 0.0230638 +-0.0676059 0.141897 -0.00935244 +-0.0514978 0.10289 0.0412322 +-0.00575874 0.0741425 -0.036638 +-0.0913439 0.11607 0.03131 +-0.0313824 0.0877015 -0.0265568 +0.0373688 0.102607 -0.00785264 +-0.0106393 0.169838 -0.0190633 +-0.0716387 0.0675256 0.0265031 +-0.0396636 0.0340515 0.0270767 +-0.0779219 0.0717107 0.00150831 +0.0451585 0.0670735 0.000845212 +-0.045692 0.126639 0.0237789 +-0.0914166 0.131046 0.0292353 +-0.0845601 0.0832447 0.0254813 +-0.00465613 0.0540645 -0.0324247 +-0.0573264 0.15429 0.0261567 +-0.0776607 0.0817583 -0.0102119 +-0.0614708 0.165833 -0.0590275 +-0.0866007 0.129822 0.0479412 +-0.0751026 0.155922 -0.00200459 +0.0292911 0.0364248 0.021021 +0.0168648 0.0958851 -0.0235234 +0.0566532 0.0608369 0.0255651 +-0.0447794 0.128887 0.00190497 +-0.024583 0.0635737 0.0419612 +-0.0534745 0.0360014 0.0464895 +-0.0488506 0.0999451 -0.0218934 +0.00224668 0.0740592 -0.0351433 +-0.0223056 0.126998 0.0101726 +-0.0907871 0.14608 0.0151486 +-0.0506704 0.0680761 0.0375114 +-0.0689054 0.113678 -0.00975253 +-0.032497 0.0917926 0.0443017 +0.0282492 0.102359 -0.0164093 +0.0375206 0.0540908 0.0314327 +-0.00566586 0.0555015 -0.0328252 +-0.0896969 0.139298 0.033185 +-0.0707473 0.127025 0.0521985 +-0.0455052 0.162274 0.00622301 +-0.0188243 0.0868874 -0.0382929 +0.00890069 0.0988547 -0.0226736 +0.0103725 0.130878 0.016344 +-0.0568151 0.142191 -0.00256359 +-0.0576833 0.0660478 -0.00944709 +-0.0394154 0.128541 0.00978788 +-0.0112757 0.0392934 0.0501019 +-0.0875442 0.11045 0.0133403 +0.0108543 0.128955 0.0251156 +-0.0306705 0.0692801 -0.0274547 +0.0193368 0.0460939 -0.0219388 +0.0280428 0.0928381 -0.0202889 +0.0101954 0.0879315 -0.0314901 +-0.0425303 0.153621 0.00682011 +0.046342 0.0671736 0.000660587 +0.0133755 0.0508647 -0.0275026 +-0.0815821 0.0803018 0.0303913 +-0.059075 0.137911 -0.00597298 +0.0419587 0.0958192 0.0261617 +0.0444321 0.0482656 0.0306384 +-0.0444939 0.0519693 0.038747 +0.0141421 0.107244 -0.018655 +-0.0258198 0.0880859 -0.0357275 +0.0511643 0.0525875 0.0281258 +-0.0838035 0.0884157 -0.00457068 +-0.0075843 0.111951 -0.0206051 +0.020155 0.0344845 0.00437508 +-0.0141697 0.038751 -0.00641336 +0.0160515 0.039741 -0.0214719 +-0.0627129 0.161593 -0.024579 +-0.0329051 0.0359381 0.0496011 +-0.0738068 0.0892836 -0.0151913 +0.0299737 0.0934986 -0.0189639 +-0.0618436 0.129703 0.0404325 +0.0117043 0.110341 -0.0188996 +0.013386 0.0576661 0.0508541 +-0.0636966 0.117092 0.044917 +-0.0634835 0.0890243 0.0452141 +-0.0874124 0.136542 0.0428952 +-0.0391888 0.168166 -0.0121398 +0.0376532 0.101954 -0.00791483 +-0.0708338 0.143978 -0.0149516 +-0.0135013 0.0687469 0.0541774 +-0.0671166 0.134015 0.0451603 +-0.0645196 0.148285 0.0383203 +-0.0216796 0.18469 -0.0188168 +-0.00148992 0.070365 0.0570874 +-0.0291401 0.0875323 -0.0325902 +0.0251009 0.122815 0.00327552 +-0.0111221 0.0980696 -0.0279124 +-0.0635024 0.0918143 0.0447779 +-0.0887995 0.0901451 0.00746775 +0.0164935 0.0962515 0.0477962 +0.046272 0.0806446 0.00718674 +0.038459 0.094268 -0.00974763 +0.0100793 0.0873522 0.0550703 +0.0183745 0.0874107 0.0495162 +-0.0547819 0.0840722 -0.0215429 +0.0249849 0.0576546 -0.0237943 +0.0262469 0.11849 0.0293617 +0.0187045 0.0462587 0.0425837 +-0.0433933 0.123406 -0.0104784 +-0.0615139 0.0385816 -0.00827445 +-0.0234882 0.104381 0.0428298 +0.0334188 0.115464 0.00204907 +-0.0251305 0.0810774 0.0532367 +-0.0661661 0.0431586 -0.00127362 +-0.0689806 0.138464 -0.0078252 +0.0324954 0.0484967 0.0321634 +-0.0650217 0.154743 0.00396393 +-0.0615004 0.0818818 0.0435978 +0.0289072 0.10744 0.0367037 +-0.0720417 0.156813 -0.0379146 +-0.0232564 0.171248 -0.0127378 +0.0211195 0.109025 -0.0155233 +-0.0668614 0.150018 -0.036632 +0.0204284 0.122662 -0.00423372 +-0.0628194 0.162004 -0.0576316 +-0.0641553 0.168532 -0.0413683 +0.0278158 0.0649933 -0.0208789 +-0.0788364 0.0742331 0.0262211 +0.0527925 0.0505032 0.000257908 +-0.0738772 0.107826 -0.00969763 +-0.0819791 0.08171 0.030761 +-0.0904343 0.136488 0.021207 +-0.0584473 0.145323 0.0330944 +0.00225674 0.0697235 -0.0336823 +-0.0228155 0.081267 -0.0385568 +0.0290261 0.106116 0.036871 +0.0121361 0.105839 -0.0196306 +-0.0365486 0.12125 -0.0102225 +-0.070219 0.146984 -0.026659 +0.00749947 0.122404 0.035106 +-0.0234912 0.107132 0.0414501 +0.0116034 0.0355849 -0.021581 +-0.0896067 0.0902304 0.0134498 +0.0274272 0.0781922 -0.0230908 +-0.0228318 0.114095 -0.016802 +-0.0510675 0.0598803 0.0316706 +0.0525281 0.0730706 0.0188626 +-0.0503624 0.128323 -0.00347306 +-0.0758088 0.0906346 -0.0139136 +0.0428831 0.0902351 0.0261862 +-0.00171604 0.131316 0.0104838 +-0.0845537 0.143232 0.00516668 +0.0183451 0.0551894 -0.0280076 +-0.0914715 0.128331 0.0382421 +-0.0654644 0.148292 0.0388168 +0.025254 0.122206 0.00192061 +0.0102154 0.0850922 -0.0315035 +-0.0913446 0.12833 0.0392393 +-0.0282035 0.125211 0.0168448 +0.0435793 0.0677809 0.0261624 +-0.014506 0.114132 0.0394731 +0.0146525 0.0927004 0.0511905 +-0.0777124 0.0900603 0.0375253 +0.0426104 0.0723991 0.0281081 +-0.0165087 0.10859 0.0417725 +-0.0293809 0.118905 0.0298455 +-0.0747355 0.161794 -0.0126957 +-0.0194977 0.103001 0.0433214 +-0.0774975 0.111156 0.045792 +-0.0235187 0.0551838 0.0425567 +0.00826699 0.0696219 -0.0321852 +-0.0671246 0.042281 0.0101216 +0.0443577 0.0547836 -0.00632411 +-0.0771697 0.152833 -0.00289126 +-0.0455143 0.0335109 0.00302189 +-0.0154906 0.0744572 0.0558178 +0.0390604 0.0575755 -0.00514174 +-0.0300453 0.0861604 -0.0315778 +0.0243112 0.0999667 -0.0198415 +0.0337476 0.0534432 0.0345417 +-0.0207506 0.0685447 -0.0377382 +-0.0883977 0.0983242 0.022387 +-0.043533 0.162269 0.00566221 +-0.0580451 0.047259 0.00941407 +-0.0435244 0.129538 0.0127129 +-0.0129572 0.163516 -0.016687 +-0.018238 0.0985224 -0.0244062 +-0.0468429 0.132502 0.00641278 +-0.012834 0.128656 0.00349339 +-0.00949586 0.0938956 0.0554931 +0.0405174 0.0829825 -0.0107762 +-0.0306755 0.0409906 0.0514223 +-0.0887381 0.139163 0.03848 +-0.0639163 0.105371 -0.0163736 +0.0319159 0.0876168 0.0427503 +-0.0165553 0.128252 0.0064647 +-0.0695817 0.168848 -0.0261289 +-0.0702082 0.141157 0.0460159 +0.0179624 0.0489942 0.0433049 +0.0363477 0.102053 0.0316389 +-0.029898 0.0385093 -0.0112051 +-0.0687619 0.169445 -0.0540038 +-0.0726588 0.143932 -0.0130219 +0.0162319 0.0849386 -0.0291053 +-0.0620358 0.136971 -0.00707833 +0.0166416 0.0740317 0.0522091 +0.0213347 0.0607071 -0.0262571 +-0.0576194 0.143675 -0.00218012 +-0.0913297 0.148826 0.016141 +-0.0751782 0.152724 -0.0149145 +-0.062838 0.153641 -0.0115615 +-0.0579073 0.152669 0.031812 +-0.0401847 0.173392 -0.00391542 +0.0166876 0.0475243 0.0432195 +-0.0393167 0.0432044 -0.0243027 +0.00658649 0.0945677 -0.0301242 +-0.00883076 0.130134 0.0179537 +-0.0248377 0.0867614 -0.0367865 +0.0135609 0.0343729 -0.0176058 +-0.0367327 0.0739624 -0.0182558 +-0.0891756 0.088886 0.0174542 +-0.0869535 0.131154 0.0468504 +0.00298644 0.131511 0.0079308 +-0.0116778 0.0541503 -0.0336719 +-0.00992638 0.128404 -5.81123e-05 +-0.0544374 0.131586 -0.00508481 +-0.0384968 0.104212 0.0394832 +-0.074384 0.0726496 -0.00763941 +-0.0530656 0.150158 -0.00286677 +-0.0166345 0.0465837 -0.0289175 +0.0567453 0.0707667 0.0204115 +0.0381172 0.0659142 -0.0117557 +0.00256341 0.131601 0.00920655 +0.0391019 0.106936 0.00217583 +-0.0480338 0.0685335 0.039429 +-0.0794876 0.0745597 -0.0035364 +-0.0248661 0.101609 -0.0237851 +-0.0647841 0.0448471 0.00913709 +-0.0446647 0.117939 -0.0147658 +-0.0152743 0.180101 -0.0270399 +-0.0859599 0.106341 0.0203569 +0.0111873 0.0893276 -0.0308633 +-0.0922566 0.126816 0.00926569 +-0.0618365 0.166237 -0.0545929 +0.0181719 0.0795251 0.0527143 +-0.0684871 0.120374 0.0527878 +-0.0476953 0.0723623 -0.0159721 +-0.0472614 0.125357 0.0280089 +-0.0494961 0.113894 0.0347794 +-0.0374992 0.0847101 0.0439351 +-0.0404923 0.0620428 0.0412639 +0.0609826 0.0637492 0.0111528 +-0.0849504 0.136625 0.0461206 +0.0337121 0.104741 0.0331059 +-0.00864132 0.0907031 -0.0362798 +0.00988706 0.0373676 0.0450724 +-0.024511 0.0782394 0.0527049 +-0.0716377 0.0368114 0.00909586 +-0.0832904 0.111663 0.0440643 +-0.0156647 0.109623 -0.0201068 +-0.0766606 0.163806 -0.0339802 +0.0165486 0.0631544 0.0502063 +-0.0753023 0.155004 0.00375308 +0.039051 0.0380783 0.00858362 +0.0420573 0.0943632 -0.00379153 +-0.0924935 0.124207 0.0332695 +-0.0745678 0.155931 0.022959 +-0.0348878 0.0336855 0.0122448 +-0.0755817 0.14859 -0.0148673 +-0.0712419 0.0628661 0.0147709 +-0.0722512 0.170824 -0.0490235 +-0.044945 0.146638 -0.00064718 +-0.0327132 0.0383899 -0.00426549 +-0.0656128 0.0626699 -0.00283823 +-0.0615924 0.156857 -0.0275883 +-0.0306139 0.051126 0.0398517 +-0.0552831 0.0478834 0.0286656 +-0.0825962 0.0869865 -0.00556699 +-0.0743429 0.0777095 0.0359578 +-0.00912413 0.125328 0.0309758 +-0.0877256 0.112462 0.0226926 +-0.0624682 0.148372 0.0373168 +-0.0772099 0.0954309 0.0368548 +-0.0657805 0.04031 0.0356744 +0.0390337 0.102562 -0.00454148 +-0.0218167 0.0770677 -0.0388569 +-0.013694 0.165443 -0.0129401 +-0.0242656 0.0588495 -0.0313753 +-0.0201769 0.16108 -0.00474531 +-0.0746468 0.151291 -0.0288803 +-0.0870878 0.147265 0.0324302 +-0.0667973 0.0823343 -0.0181512 +-0.0894818 0.137913 0.0311948 +0.0410937 0.100015 0.0241739 +0.0260496 0.0420955 0.0353242 +-0.0497977 0.134944 0.0250398 +-0.0824554 0.0748386 0.00652396 +-0.0420037 0.0449364 -0.0183222 +-0.00587956 0.107379 -0.0226761 +-0.0298783 0.0719759 -0.0315267 +-0.0649016 0.118019 -0.00923352 +-0.0461849 0.131841 0.0072241 +-0.0384968 0.066293 0.0418062 +-0.0375363 0.128085 0.0104763 +-0.0684218 0.173931 -0.0443685 +-0.0921191 0.131045 0.0262423 +-0.0269088 0.0720784 0.0425891 +-0.0318614 0.109962 -0.0183828 +-0.0576346 0.139576 0.0324737 +-0.0582272 0.151065 0.033498 +-0.0824187 0.0788859 0.0267668 +-0.0386191 0.0474546 -0.0163861 +0.0266281 0.0902434 0.0456585 +-0.00674435 0.0340208 -0.0192827 +0.0167681 0.0348096 -0.0116543 +0.00555478 0.102979 0.0445124 +0.0101351 0.0346886 0.0403762 +-0.0715049 0.147007 0.0421623 +0.0583177 0.0551766 0.00716644 +-0.0774854 0.142838 0.0458543 +-0.0630637 0.0343143 0.0307056 +-0.00979508 0.122843 -0.0101629 +-0.0497184 0.0723081 -0.0156401 +0.0463136 0.0660623 -0.000202599 +-0.0455839 0.0490621 -0.0101677 +-0.0746807 0.110131 0.0436879 +-0.0107636 0.0728162 -0.0377336 +-0.0155087 0.105817 0.0426846 +-0.0419504 0.0338103 -0.0111665 +0.0243299 0.0661738 -0.0239819 +0.0195943 0.041435 -0.0196763 +0.0590873 0.0566489 0.0191831 +-0.0828908 0.120639 -0.00384458 +0.0299951 0.111426 0.0329993 +-0.0685146 0.033856 -0.00470573 +-0.0492135 0.140151 0.00839688 +-0.0489146 0.121146 0.0309679 +-0.00870224 0.0627847 -0.0356447 +-0.086772 0.140601 0.0407491 +-0.0293203 0.0381642 0.0309659 +-0.0330003 0.0497903 -0.0153502 +-0.0425517 0.127843 -0.00110505 +0.0328934 0.0381571 -2.41096e-05 +-0.0525195 0.0426931 0.0456595 +0.021748 0.0349954 0.0225893 +0.00827474 0.123868 -0.00945393 +-0.029563 0.0377844 -0.01791 +-0.0370175 0.163827 -0.00102436 +-0.0664999 0.101466 0.0412188 +0.0064937 0.048929 0.05087 +0.0287604 0.121079 0.0103057 +0.0252285 0.11379 -0.0106368 +-0.0599544 0.0581084 0.014112 +-0.062196 0.154993 0.0273195 +-0.0901963 0.136492 0.0222062 +0.0243441 0.0535282 0.0420575 +-0.0779175 0.0954136 0.0361479 +0.0233436 0.112218 -0.0129499 +-0.0707139 0.0721775 0.0349299 +-0.0640765 0.0658063 0.0313225 +-0.012499 0.112778 0.04085 +0.00184795 0.0345666 0.017115 +-0.0706528 0.0621972 0.0100461 +-0.0885678 0.139164 0.0111992 +-0.0188224 0.0347384 0.0467634 +-0.0867734 0.103584 0.00638913 +0.0585617 0.0692487 0.0195963 +-0.0597919 0.0868174 -0.0202685 +0.00547344 0.0964656 -0.0281399 +0.0206378 0.123881 0.0271063 +-0.0699457 0.0641869 0.00125597 +-0.0625615 0.156051 0.017016 +-0.0417544 0.0339701 -0.0279962 +-0.0649712 0.129694 -0.00875388 +-0.0862104 0.107661 0.0103578 +-0.0932554 0.121405 0.0112928 +-0.0354965 0.0533413 0.0383699 +-0.0288938 0.0821008 0.0456772 +-0.0504899 0.115263 0.0337703 +0.0589314 0.0635744 0.022157 +-0.0186162 0.0391183 0.0377018 +-0.00206852 0.0346139 0.0433223 +-0.0274904 0.108416 0.0392888 +0.0114791 0.0353993 0.0291949 +0.0231094 0.1217 -0.00313916 +-0.0577454 0.0767844 -0.0191155 +-0.00909377 0.175718 -0.0267745 +0.0517415 0.0673755 0.000499527 +-0.0128851 0.164546 -0.0183954 +-0.0673534 0.170861 -0.0570311 +-0.0929853 0.13101 0.0212315 +0.0234643 0.0889079 0.0481435 +-0.088271 0.126713 0.00126975 +-0.0657845 0.0809163 -0.0181411 +-0.0623578 0.139562 0.0361839 +0.0537838 0.0608937 0.0284739 +-0.0417084 0.0681156 -0.0160245 +0.0391698 0.101249 -0.00580082 +0.0314319 0.059214 0.0400505 +-0.0609535 0.135292 0.0364528 +-0.000337321 0.0338454 -0.0216338 +-0.0194278 0.169807 -0.0142312 +-0.0348191 0.0886631 -0.024431 +0.0343015 0.0925788 -0.0159761 +-0.0484766 0.166987 4.90724e-06 +-0.0665297 0.149283 -0.0337543 +-0.0801184 0.0845811 0.0344552 +-0.0728936 0.109289 -0.00959602 +-0.0631344 0.177233 -0.0567528 +-0.0405211 0.16525 0.00379284 +-0.0231365 0.166757 -0.0180638 +0.00733914 0.0539337 -0.0304234 +-0.0448725 0.105637 -0.0203982 +-0.0120489 0.177175 -0.0228491 +-0.0935183 0.117402 0.0193034 +-0.0218743 0.178667 -0.0141782 +0.0371376 0.0728556 -0.0127896 +0.00251304 0.0828672 0.0572444 +-0.0659599 0.128235 -0.00885739 +0.0572369 0.0523165 0.0201815 +0.00234985 0.1177 -0.0168004 +0.0136405 0.0534411 0.0494225 +0.0440001 0.081852 -0.00180195 +-0.0352323 0.0337248 0.00491425 +-0.0852903 0.152844 0.0238067 +-0.0841107 0.0938743 -0.00455389 +-0.0327087 0.156604 0.00170747 +-0.0136478 0.0384232 0.0249573 +0.0203982 0.126887 0.0157559 +-0.0256832 0.0878506 0.050771 +-0.0859766 0.117044 0.000228439 +-0.0275277 0.0660102 0.0388181 +0.0386899 0.0941002 0.0332667 +-0.0072203 0.0994662 -0.0253456 +-0.0387089 0.068094 -0.0155018 +-0.0447414 0.149173 0.00704529 +-0.037003 0.126393 0.0195465 +-0.0691196 0.118603 0.052746 +0.0126876 0.0376693 0.0445214 +0.00235997 0.0496442 -0.0301148 +-0.0852421 0.0804972 0.00551565 +-0.0315104 0.105689 0.0403731 +0.045017 0.0410596 0.00889517 +-0.0645229 0.0335011 -0.00443342 +-0.0237309 0.092173 -0.0338912 +-0.0696939 0.158144 -0.0499358 +-0.00649106 0.116924 0.0392844 +0.0203532 0.0579488 -0.0270415 +0.0454669 0.0761165 0.0216249 +-0.0776599 0.103464 0.0342449 +-0.0732 0.113624 0.050147 +-0.0760799 0.147225 -0.00886324 +0.0300894 0.118197 0.0250757 +0.0134949 0.103141 0.0462202 +-0.0890108 0.142042 0.0341592 +-0.0804084 0.0719394 0.00662383 +-0.0695221 0.143851 -0.0150076 +-0.0608967 0.108264 -0.0166058 +0.024601 0.0954054 -0.0210454 +-0.022965 0.108799 -0.0212234 +-0.0611808 0.060116 0.0210055 +0.0302694 0.104198 -0.014346 +-0.0556068 0.119255 -0.0119973 +0.0521834 0.0709362 0.0231159 +-0.0314011 0.159502 0.00180977 +-0.0393243 0.172677 -0.00992732 +-0.0273795 0.0859709 -0.0356537 +-0.0158141 0.084157 -0.0391976 +-0.0748503 0.150353 0.0378605 +-0.0898842 0.145774 0.0282412 +-0.0830081 0.135296 -0.00152379 +0.00239673 0.0404932 -0.0244502 +0.0427154 0.0482477 0.0316879 +-0.0266384 0.166791 -0.00886205 +0.0140069 0.0433574 0.0445182 +-0.0554949 0.102938 0.0419937 +-0.0535677 0.121244 0.0365515 +-0.091536 0.147482 0.0221363 +-0.0926871 0.118696 0.0103064 +-0.0944412 0.121464 0.0182801 +-0.0562674 0.0521079 0.00770249 +0.0268173 0.0563551 0.0421393 +0.0126767 0.102031 -0.0220157 +-0.0753389 0.14722 -0.0108566 +-0.0856054 0.119006 0.0487694 +-0.0533885 0.122494 -0.00938247 +0.0431078 0.0438619 0.0262578 +-0.0605291 0.0337655 0.01588 +-0.0126252 0.045057 -0.0279244 +-0.045035 0.131096 0.00921538 +-0.0885624 0.127032 0.0457658 +0.040497 0.0569389 0.0314027 +0.0364907 0.111851 0.00455337 +-0.0834729 0.144593 0.00316535 +0.0433385 0.080395 -0.00378638 +-0.0318429 0.0944059 -0.023975 +-0.0484939 0.0747239 0.0424157 +-0.0110217 0.175722 -0.0231509 +0.000137104 0.104495 -0.0221519 +-0.0521218 0.0553341 0.025863 +0.0390662 0.103279 0.0267541 +-0.0365034 0.105591 0.0389607 +0.0135363 0.0347941 0.0319644 +-0.0857201 0.113489 0.0456231 +-0.0225205 0.114038 0.037332 +-0.0424861 0.107068 0.0398635 +-0.0498903 0.161248 0.00701432 +-0.0261589 0.0660162 -0.0325063 +-0.061193 0.167783 -0.0585846 +-0.0153476 0.186173 -0.0245951 +-0.0220085 0.0386415 -0.0116054 +-0.0746541 0.0660086 0.0112783 +-0.0857094 0.107615 0.00636703 +-0.000110081 0.106984 -0.0213197 +-0.0293764 0.039648 0.0531021 +0.028771 0.0495105 -0.0157345 +-0.0168713 0.184583 -0.0192109 +-0.0517714 0.14934 0.0163945 +-0.059475 0.0776368 0.0428908 +-0.0109445 0.0385116 0.00732721 +-0.0636281 0.177112 -0.0556446 +-0.074576 0.0901236 0.0400162 +0.0161292 0.0604031 0.0495734 +0.022982 0.114019 0.0351746 +0.0259399 0.098006 -0.0197455 +-0.0097165 0.0698878 -0.0366754 +-0.069561 0.132665 0.0486469 +-0.0530949 0.0350628 -0.012244 +-0.0680607 0.153823 -0.0498908 +-0.0135439 0.125168 0.0294386 +-0.00340282 0.12679 -0.00651364 +-0.0391911 0.149452 0.000405422 +-0.0764653 0.177807 -0.0519745 +-0.0287178 0.121983 -0.00700749 +-0.0619687 0.155933 0.0215789 +-0.0411389 0.0448599 -0.0213399 +-0.0553956 0.0560936 -0.00341211 +-0.0930152 0.116045 0.0163142 +-0.0538732 0.0634525 0.0320061 +-0.0265911 0.123944 0.0203778 +0.0521155 0.073659 0.0142686 +-0.0733241 0.158247 -0.0319134 +-0.0109096 0.167211 -0.0224966 +-0.0387656 0.0459335 -0.0222844 +-0.0438685 0.104239 -0.0209341 +-0.0404958 0.0464911 0.0408136 +-0.0546568 0.133929 0.033262 +-0.0875345 0.0914089 0.00446769 +0.0213976 0.0505253 -0.0237217 +0.00734362 0.0524803 -0.0298755 +0.0300864 0.0686462 0.0416997 +0.0343005 0.110021 0.028645 +0.0541591 0.0648613 0.0272743 +-0.0267629 0.124714 0.018819 +-0.084006 0.130916 -0.00261237 +-0.032464 0.126152 0.0167563 +0.0411083 0.0816433 -0.00876203 +0.0569799 0.0538694 0.0224893 +-0.0104937 0.0502816 0.0505289 +-0.0809192 0.0899278 0.0336764 +-0.0706578 0.10688 0.0373417 +-0.0634399 0.160562 -0.0195565 +-0.0491873 0.165537 -0.00392571 +-0.0506864 0.137014 0.00141591 +0.0414602 0.0985756 -0.00280597 +-0.0725308 0.161023 -0.0389355 +-0.0593508 0.0339548 0.0212701 +-0.0724089 0.155986 0.0106072 +0.0454654 0.0819915 0.0211715 +-0.0231673 0.169718 -0.0195033 +0.014393 0.129494 0.0163965 +-0.0185111 0.0499058 0.0467842 +-0.0180519 0.128104 0.0102643 +-0.0161793 0.169751 -0.0220442 +0.0178585 0.0957539 -0.0234025 +0.0277062 0.122023 0.0113437 +-0.0356288 0.0533886 -0.010251 +-0.00862621 0.0394649 0.0376552 +-0.0708134 0.0624523 0.0134268 +-0.0338786 0.104305 -0.0212068 +-0.0471517 0.160622 -0.00754132 +-0.0925898 0.124211 0.034269 +-0.0584616 0.0717087 0.039721 +-0.0146591 0.0511639 -0.0318396 +-0.0607891 0.0597911 0.00342454 +0.0222547 0.0819067 -0.0260667 +0.0230644 0.109683 -0.0142211 +-0.0844174 0.110829 0.0409213 +-0.0687289 0.0779401 -0.0161359 +-0.0752643 0.0941545 0.0391883 +-0.0876028 0.105024 0.0163629 +-0.077844 0.114867 -0.00473455 +-0.0325542 0.0341026 -0.0206973 +-0.0589604 0.0340153 0.0230639 +-0.00211759 0.125578 0.0320366 +0.0126989 0.0342761 -0.010037 +0.013184 0.0740073 0.0542309 +-0.0477691 0.130137 0.000614804 +-0.0718381 0.155405 -0.0399144 +-0.0622568 0.148888 -0.00391238 +-0.0159434 0.0385311 0.027994 +0.0373005 0.103362 0.0294506 +-0.02276 0.093942 -0.0316991 +-0.0520122 0.14159 0.0203687 +-0.082015 0.110886 0.0432009 +-0.0745865 0.0720219 0.0307608 +-0.00953059 0.096141 -0.0318625 +-0.0495789 0.046041 -0.00928879 +-0.00423381 0.0382248 0.0479393 +-0.0382126 0.169665 -0.0124129 +0.0318584 0.0981802 0.0392129 +-0.0314643 0.126198 0.0141678 +-0.0622546 0.152185 -0.0195775 +-0.0424907 0.0831788 0.0422885 +-0.0205087 0.18589 -0.0190712 +-0.00369262 0.0366899 0.0482034 +-0.0197122 0.0583602 -0.0339067 +-0.0106092 0.0434444 -0.026227 +0.0245832 0.0562081 -0.0237654 +-0.0891532 0.121635 0.0465292 +-0.0629277 0.161435 -0.0535909 +0.047295 0.0711844 0.0046334 +-0.0417522 0.0782987 -0.0193601 +-0.000496629 0.0828922 0.0574621 +-0.0320822 0.0335961 -0.0276233 +-0.0571072 0.154583 -0.000558004 +0.0584978 0.0634546 0.0229811 +-0.0581231 0.149655 0.0336366 +-0.0619701 0.160031 -0.0245798 +-0.0800787 0.0980611 0.0339873 +-0.0219645 0.0403079 0.0539432 +-0.0699065 0.110817 -0.0106385 +-0.0725366 0.154032 -0.0369032 +-0.0224974 0.0498852 0.046496 +0.00485548 0.0339942 -0.0207847 +-0.0614772 0.0338873 0.0155724 +0.00946392 0.0472926 0.0483305 +-0.019502 0.109944 0.0407387 +-0.0539465 0.0486826 0.012352 +-0.0355502 0.175589 -0.0109785 +-0.0784832 0.155333 0.0128492 +0.0266099 0.122879 0.0123678 +-0.0472066 0.134653 0.0142236 +-0.0078767 0.103255 -0.023393 +-0.0504989 0.101536 0.0421291 +-0.0266231 0.0450263 -0.028096 +-0.0916243 0.131038 0.0282288 +0.0125747 0.0445985 0.0442752 +-0.0196537 0.0480066 -0.0290701 +0.0172432 0.108764 -0.0171862 +-0.0295071 0.0635474 -0.0264265 +-0.0620034 0.040777 0.0431481 +-0.00243593 0.113721 -0.0185019 +-0.0630177 0.135513 -0.00745136 +0.0433285 0.0874073 -0.00479371 +-0.0154888 0.0688106 0.054717 +-0.0882956 0.116235 0.0458325 +-0.0494969 0.0946343 0.044743 +-0.0619637 0.147832 -0.00431835 +-0.092816 0.124239 0.0392636 +-0.0629366 0.147438 -0.0146052 +-0.0782928 0.163856 -0.0319501 +-0.064798 0.174285 -0.0502768 +-0.0112267 0.038611 -0.000125945 +-0.0820175 0.148708 0.00217249 +0.0401192 0.0979552 0.0282751 +-0.0877344 0.132461 0.0447656 +-0.050513 0.143196 0.0143929 +0.0136958 0.0672461 0.0531523 +-0.0608764 0.033777 0.0140174 +0.00552563 0.0813962 0.0561869 +-0.0768476 0.148423 0.040238 +-0.0306152 0.0552238 -0.0173804 +-0.0567885 0.123073 -0.00794084 +-0.0255089 0.119394 0.0308336 +0.0223261 0.116663 0.0342169 +-0.0475261 0.0335634 -0.00837623 +-0.0582936 0.157998 0.00361947 +0.0051303 0.105879 -0.0208781 +-0.00896496 0.0383664 0.01874 +-0.0444005 0.0336982 -0.00787213 +-0.00659427 0.0391448 -0.0257394 +-0.0414965 0.0424145 0.0425934 +-0.0846517 0.135301 0.0472783 +-0.0634992 0.0973124 0.0426152 +-0.0488679 0.135513 0.00441971 +0.037597 0.0883595 -0.0147642 +-0.00186878 0.0388962 0.0287527 +-0.028023 0.0380941 0.0277005 +-0.0474992 0.0718408 0.0410603 +-0.0899231 0.113261 0.00935255 +0.044663 0.094574 0.0141596 +-0.0613242 0.174126 -0.0596453 +0.0131192 0.0913894 0.0524895 +0.0569982 0.0642691 0.00177262 +0.029911 0.120086 0.0121698 +-0.0341992 0.124637 -0.00378015 +-0.0714932 0.121802 0.0535223 +-0.060211 0.120578 -0.00928669 +0.0514409 0.0718132 0.00596213 +-0.0055446 0.0384588 0.0102869 +0.0401137 0.0933035 -0.00871241 +-0.077868 0.12372 -0.00684832 +-0.0438994 0.148485 -0.00356582 +-0.0478093 0.0898718 -0.0219802 +-0.050356 0.0501549 0.0156949 +-0.044116 0.168361 -0.0078879 +0.0274031 0.12156 0.0212208 +-0.0198084 0.119865 -0.0108751 +-0.00808629 0.0392239 0.0361848 +-0.074679 0.177203 -0.0452121 +-0.0717079 0.162415 -0.0429474 +-0.0817249 0.153192 0.027965 +-0.0830361 0.0952877 0.0313817 +-0.0410879 0.12806 0.000341883 +-0.0268762 0.104433 -0.0231038 +-0.028867 0.0620809 -0.0264195 +0.0400441 0.0834026 0.0333734 +0.00148401 0.0427923 0.0460657 +-0.021597 0.124211 0.0236359 +-0.0493581 0.0389276 0.0456407 +-0.0251636 0.119759 -0.0107128 +-0.0305455 0.0776911 -0.0335901 +0.0434944 0.0719976 -0.00179535 +-0.0730641 0.148297 -0.027137 +-0.0403032 0.0335749 -0.0236075 +-0.0838696 0.117633 -0.00194246 +-0.0183958 0.0360837 -0.0274195 +0.0306925 0.119003 0.0181751 +-0.0287719 0.0876257 0.045371 +-0.0150862 0.116786 -0.0157023 +-0.0226105 0.0393974 -0.0288175 +-0.00549593 0.114185 0.0409403 +0.0172148 0.0820814 -0.0286624 +0.0204946 0.0878829 0.0490965 +0.0144377 0.119508 -0.0127985 +0.0084105 0.0389663 -0.0233493 +0.042717 0.0705281 -0.00378792 +-0.0721585 0.0349122 0.00711943 +-0.0700117 0.176166 -0.0463861 +-0.0559881 0.0594067 0.0225062 +-0.0934924 0.121416 0.0122906 +0.0386755 0.101225 -0.00680717 +-0.00386806 0.105937 -0.0224388 +-0.0104995 0.091174 0.0564817 +-0.0012394 0.131315 0.00922853 +-0.0497873 0.0855205 -0.0216876 +-0.0168713 0.104463 -0.0227606 +0.0101956 0.0865002 -0.0314726 +-0.0534959 0.108443 0.038977 +-0.0548951 0.0610993 0.0270145 +-0.0755046 0.137255 0.0498073 +-0.0485754 0.0489523 -0.00913959 +-0.0331264 0.163719 -0.0148995 +-0.00945074 0.100225 0.0471086 +-0.0342862 0.0340473 0.0246456 +-0.0294128 0.0335741 -0.023325 +-0.026685 0.0349864 0.0500364 +-0.061923 0.12237 -0.00883821 +0.0501668 0.0567787 0.0302284 +-0.011856 0.127622 0.0255897 +-0.0429498 0.0338754 -0.00590515 +-0.000398209 0.131157 0.00667235 +-0.0163397 0.112374 -0.0190184 +-0.0651151 0.138224 0.0409979 +0.0355326 0.0544702 -0.00765701 +0.0264528 0.0348348 0.00531809 +-0.0438555 0.101385 -0.0214526 +-0.0234974 0.0498976 0.0468652 +-0.0436816 0.0651561 -0.0146099 +-0.00750789 0.0386054 0.00429878 +-0.0494719 0.0643044 0.0356628 +-0.0857911 0.0847131 0.0234468 +0.0202388 0.0735294 -0.0276011 +-0.0826135 0.153724 0.024657 +0.0377117 0.0799594 -0.0137509 +-0.0629014 0.0384346 0.017326 +-0.0564952 0.112508 0.0359017 +-0.00450514 0.0647631 0.0563697 +0.0228849 0.0849076 0.049031 +-0.0136101 0.17129 -0.0181213 +-0.0659308 0.168025 -0.05906 +0.00616007 0.130231 0.0233995 +0.0200475 0.0355684 0.0326031 +0.0207235 0.0355731 0.0309275 +-0.0914203 0.133738 0.0192152 +-0.0894168 0.0942943 0.0184246 +-0.0486795 0.137079 0.00840446 +-0.0268516 0.0981872 -0.024073 +-0.0296061 0.0499557 0.0431146 +-0.0645444 0.136771 0.0400377 +0.00960463 0.0369501 0.029234 +-0.0077992 0.0826766 -0.0378216 +-0.0705096 0.145613 0.0431794 +0.038042 0.109981 0.0137429 +-0.0323904 0.0346717 0.0421656 +0.0166765 0.12456 0.0286792 +0.0496183 0.0673428 0.0005193 +-0.0256005 0.175695 -0.0107936 +-0.0178219 0.0896296 -0.0373512 +-0.010186 0.0339025 -0.0217341 +-0.047823 0.0912927 -0.0217091 +0.0214379 0.121585 -0.00505488 +-0.063535 0.0741856 0.0400495 +-0.0175015 0.119559 0.0348485 +0.0378045 0.0701003 -0.0128173 +-0.06064 0.140962 -0.00527103 +-0.0745647 0.162191 -0.0132518 +0.0175747 0.0931801 -0.024649 +-0.0413443 0.159411 0.00325579 +-0.0692325 0.161954 -0.0115912 +-0.0598828 0.104039 -0.0184233 +-0.0275135 0.111195 0.0372083 +0.017284 0.0435398 0.0440147 +-0.043478 0.0633766 0.0405033 +0.0234516 0.0389975 0.0363054 +-0.0705331 0.144185 0.0442754 +-0.00248752 0.0897873 0.0564419 +-0.0728742 0.149812 -0.0379734 +0.0462595 0.0834414 0.00917612 +0.00549045 0.0459551 0.048539 +0.038562 0.0568882 0.0311978 +-0.0404973 0.10005 0.041322 +-0.0633155 0.125546 0.0454063 +-0.0425091 0.0520201 0.0393163 +0.00748602 0.041302 0.0454759 +-0.0652746 0.0378654 0.0394026 +-0.0208078 0.081314 -0.039065 +0.00735987 0.131518 0.0123881 +-0.0507686 0.0812185 -0.0210302 +0.0289317 0.0369927 0.000264038 +-0.0895362 0.119938 0.00329723 +0.0339261 0.0564017 0.0366181 +0.0387571 0.0780554 0.0349576 +-0.00249465 0.111426 0.042426 +0.0312166 0.0814571 -0.0197537 +0.00710696 0.112707 -0.0194319 +0.0182552 0.0736117 -0.028651 +-0.0747384 0.149908 -0.0288721 +-0.0142729 0.16729 -0.0212151 +-0.0796554 0.0776931 0.0301108 +-0.0308995 0.0385461 -0.0114399 +-0.0135011 0.162185 -0.0138332 +-0.062358 0.172308 -0.0618736 +-0.0779551 0.131028 -0.00606492 +0.0053093 0.0610791 -0.0314051 +-0.0622044 0.163118 -0.0415929 +-0.0875561 0.0900472 0.00346813 +-0.0693763 0.0627096 0.00438827 +0.0577316 0.0594186 0.0235899 +-0.076964 0.0686471 0.0102516 +-0.068516 0.156454 -0.00263594 +-0.0116226 0.0389602 0.0338935 +-0.053617 0.0500325 0.0119809 +0.0600963 0.059514 0.00816569 +-0.0667396 0.168684 -0.03081 +0.0461456 0.0820314 0.0061875 +-0.0433217 0.0391871 0.0438385 +0.0426589 0.0598822 -0.00401987 +-0.0496436 0.132456 0.0281905 +0.0526393 0.0635217 0.0285801 +0.0276786 0.107363 -0.0137282 +0.0429561 0.100122 0.0141624 +0.0420203 0.102869 0.0111608 +0.0352633 0.113355 0.0198926 +-0.0527821 0.0840792 -0.0215781 +-0.0731314 0.179106 -0.0550054 +-0.0772542 0.116219 0.0507045 +-0.0448961 0.131042 0.0121815 +-0.0659423 0.149401 -0.0328697 +-0.00381497 0.0882175 -0.036071 +-0.00434542 0.130565 0.019581 +0.0267602 0.0365817 2.43485e-05 +0.0169695 0.107204 -0.0175448 +-0.062502 0.0625858 0.0256444 +-0.00350098 0.0815126 0.05747 +0.000251433 0.0712294 -0.0349609 +-0.0113059 0.174226 -0.0217772 +-0.0348319 0.0943645 -0.0236767 +-0.0786972 0.0940445 0.0355566 +0.0177903 0.112808 -0.0155711 +-0.0318198 0.0887354 -0.0251772 +-0.0198038 0.0827175 -0.0390158 +-0.0190696 0.126125 0.000571573 +-0.0793168 0.102079 0.0331119 +0.021502 0.109802 0.0384228 +-0.0927296 0.124224 0.0362665 +-0.0209485 0.0682779 0.0508919 +0.041224 0.101389 -0.000814438 +-0.0468126 0.0898791 -0.022022 +-0.0348994 0.124334 -0.00549397 +-0.0341879 0.127198 0.0131711 +-0.049291 0.131272 -0.000642386 +-0.0359021 0.0337218 0.00658675 +-0.0837824 0.091132 -0.00556609 +-0.0335134 0.101547 0.0420338 +0.0210931 0.0429808 -0.0187308 +0.0424902 0.0555855 0.0321183 +-0.0557185 0.0570014 0.011057 +-0.0194912 0.112675 0.0392933 +-0.025189 0.156576 -0.00769163 +0.0400265 0.10701 0.00816505 +-0.0540901 0.153118 -0.00271435 +-0.00486253 0.101638 -0.0232055 +-0.0436472 0.0338067 0.00674466 +-0.0211436 0.168262 -0.0193322 +-0.0763578 0.141673 -0.00573846 +0.0465682 0.041911 0.0139236 +-0.0534989 0.109802 0.0378386 +-0.0811057 0.0748245 0.0195385 +0.0366496 0.0848209 0.0372394 +0.0520606 0.0608742 0.0294954 +-0.0810176 0.109646 0.0372868 +0.0260062 0.121547 0.0249766 +-0.0134941 0.0773082 0.0569169 +-0.0759274 0.108411 0.0376421 +0.0131577 0.0548631 0.0504935 +-0.0556243 0.0335264 0.0117574 +-0.0445311 0.119183 -0.0140568 +-0.0651138 0.155569 0.0262833 +0.0254608 0.100767 0.0422505 +-0.0354939 0.101471 0.0414493 +-0.0526525 0.152155 0.0150192 +-0.0578899 0.111162 -0.0167182 +-0.050471 0.0571806 0.032579 +-0.0881725 0.103664 0.0113862 +-0.0124346 0.0985527 -0.0264295 +0.0459022 0.0876188 0.00817319 +-0.0598831 0.0337324 0.0142605 +0.0420206 0.092566 0.0274869 +-0.0622887 0.152203 -0.0145776 +-0.0483961 0.150684 0.0105827 +0.00023463 0.0985537 -0.0263753 +-0.0719091 0.107919 -0.010771 +0.0379248 0.0575872 0.0318029 +-0.0684803 0.169194 -0.0285889 +-0.0388617 0.099995 -0.0218283 +-0.0776097 0.0796169 0.0342011 +0.00633113 0.0553726 -0.0306713 +0.0163088 0.048977 0.0444188 +-0.0838449 0.0817176 0.00149669 +-0.0216263 0.0341828 -0.0204844 +-0.0187634 0.0728738 -0.0388715 +-0.0626025 0.0388129 0.0247151 +-0.0373475 0.0347779 0.0107604 +-0.00558664 0.0376733 -0.0253626 +0.0599615 0.0678313 0.0171716 +-0.0295401 0.0904607 -0.0275932 +0.0284451 0.114053 0.0325229 +0.0418253 0.0830818 -0.00779351 +0.00746772 0.0343056 0.0166757 +-0.0865698 0.0833108 0.0104907 +-0.0729271 0.151083 0.037025 +-0.0781924 0.155673 0.0158655 +-0.0788514 0.116332 -0.0048797 +0.00512317 0.107303 -0.0203142 +-0.0103272 0.0383585 0.0166568 +-0.0348025 0.040194 -0.0297923 +-0.000491404 0.0814979 0.0573536 +-0.0290382 0.16386 -0.00530596 +-0.0694805 0.121794 0.053195 +-0.0704544 0.150585 -0.0434585 +-0.0639717 0.0459278 0.00771742 +-0.03056 0.124009 -0.00164624 +0.0144021 0.0780973 0.054252 +-0.0808546 0.140749 0.0461596 +0.0103353 0.0581557 -0.0299403 +-0.00949578 0.084298 0.0576062 +-0.0249013 0.0382346 0.0282196 +-0.0316389 0.0409999 0.051064 +0.0387381 0.0381712 0.0065938 +-0.0580729 0.0345066 0.0402882 +-0.0663198 0.150167 -0.0356652 +-0.064292 0.168172 -0.0605879 +-0.0314424 0.0679449 -0.0244554 +0.0603913 0.0595429 0.0161691 +0.0102649 0.129908 0.00205228 +-0.0440813 0.0336392 -0.0114358 +0.0309277 0.0497348 -0.00874 +-0.0267697 0.0750695 0.0452054 +-0.0791015 0.170034 -0.0382691 +-0.0864283 0.0954013 0.00141653 +0.00852849 0.0646614 0.0551736 +0.0473561 0.0503594 -0.00438005 +0.039601 0.107391 0.00564087 +-0.0861267 0.0833147 0.0194823 +-0.0786738 0.10815 0.0335843 +0.043481 0.0832455 0.0271768 +0.0281352 0.0915776 0.0443357 +-0.0298099 0.0677811 -0.0284707 +-0.0229012 0.115018 -0.0157633 +-0.0270064 0.0808968 0.0494715 +0.0404227 0.0885874 -0.0107894 +-0.087216 0.0937177 0.0257149 +-0.0690509 0.0654544 -0.0025414 +-0.0695527 0.04187 0.00402445 +0.00429234 0.0668529 -0.0329804 +-0.046755 0.0336866 -0.0157033 +0.0576125 0.0580597 0.0234109 +-0.000994561 0.129288 -0.0011666 +0.0454245 0.0904044 0.0131633 +-0.0438081 0.0899046 -0.0222231 +0.0199328 0.127154 0.0141603 +0.0114882 0.0963254 0.0495798 +0.0218142 0.117368 -0.0105004 +-0.0438465 0.0359346 0.00839642 +-0.0714426 0.0632696 0.00712846 +-0.0759079 0.150006 -0.00888842 +-0.06794 0.126772 -0.00890268 +-0.0343726 0.127227 0.0072164 +0.0578211 0.0537494 0.00717652 +-0.0483087 0.135537 0.00740851 +-0.0568342 0.0666429 0.0356476 +0.0481112 0.0431114 0.00725444 +-0.0425043 0.117982 0.0312159 +0.0144699 0.0976455 0.0479677 +0.0563061 0.0508424 0.00620646 +-0.0300578 0.163895 -0.00500569 +0.0102245 0.0823018 -0.0318649 +0.0598453 0.0608733 0.0191849 +-0.0620027 0.172528 -0.0545971 +-0.0197571 0.0971344 0.046022 +-0.0611783 0.167226 -0.0592729 +-0.00613038 0.0999315 0.0488982 +0.0488619 0.047436 -0.000620948 +-0.0208111 0.118967 -0.0119295 +0.00352005 0.0786345 0.0561775 +-0.071061 0.15959 -0.0439233 +-0.0765957 0.161076 -0.0289322 +0.0259255 0.123359 0.0149571 +-0.0746094 0.14858 -0.0188631 +0.0569296 0.058069 0.024171 +-0.0338241 0.152569 -0.00489392 +-0.0455023 0.0615609 0.0388319 +-0.0654625 0.143948 0.0405383 +-0.0560519 0.0345032 0.0407254 +-0.0709341 0.162789 -0.0122264 +-0.078067 0.144487 -0.00381208 +-0.094099 0.121442 0.0152795 +-0.00327736 0.0410332 0.0476549 +-0.0500433 0.165539 -0.00195268 +-0.0774288 0.0712256 0.0238415 +-0.00725841 0.0408714 0.048906 +-0.0833667 0.142023 0.0429747 +-0.0692361 0.153199 0.0337122 +-0.0360543 0.0398378 -0.0294769 +-0.0403231 0.0344611 0.0371557 +-0.0207576 0.069984 -0.0381379 +0.0122374 0.0737871 -0.031159 +-0.0241603 0.0665253 0.044272 +0.0399369 0.0860773 0.0331939 +-0.0809073 0.123633 -0.00507492 +-0.00964827 0.166616 -0.0197629 +-0.00664529 0.1307 0.0129838 +-0.0209361 0.0381808 0.0128466 +-0.0538563 0.0970443 -0.0219059 +-0.0662078 0.0723697 0.0374848 +-0.0398566 0.099981 -0.0216989 +-0.0494761 0.0600183 0.034326 +-0.0157667 0.0742966 -0.0389627 +-0.0875711 0.0977385 0.0245274 +-0.0529166 0.0566407 0.0191372 +0.000745542 0.0955759 -0.0312149 +-0.0688619 0.10089 -0.0150284 +-0.0130273 0.178658 -0.0225027 +-0.00548585 0.118301 0.0387556 +-0.063934 0.169417 -0.04458 +0.00224686 0.131192 0.0191047 +-0.0526917 0.0662141 -0.0112413 +0.0316126 0.104759 0.0353509 +0.0222548 0.0776918 -0.0264111 +-0.0685061 0.105552 0.0384458 +-0.0576201 0.135609 -0.00546838 +-0.00760577 0.128788 -0.000526473 +-0.0262755 0.0383516 -0.00662702 +0.0096904 0.0344726 -0.0051827 +0.0183649 0.0355244 -0.0106716 +-0.0892922 0.0996701 0.0134013 +-0.0748707 0.116421 -0.00675171 +-0.054019 0.0333099 0.015848 +-0.0927402 0.125562 0.0292626 +-0.00859312 0.0384098 0.0205847 +-0.0574617 0.0399955 0.0466824 +-0.0890962 0.0996533 0.0114017 +-0.0393675 0.120945 -0.0119262 +-0.0498057 0.144755 0.010389 +-0.0800056 0.108388 0.0313605 +-0.0694061 0.153071 -0.0482738 +-0.0529002 0.0701503 0.0387731 +-0.00979568 0.178776 -0.0277733 +-0.0749384 0.177982 -0.0467773 +-0.080224 0.0913049 0.0343483 +0.0274404 0.0399547 -0.00370609 +0.0064659 0.11274 0.0407332 +-0.0218179 0.0350986 -0.0195001 +-0.0723907 0.151114 -0.0412874 +0.00590733 0.0340449 -0.020637 +0.0460177 0.0800284 0.0189631 +-0.0576496 0.0629466 -0.00612077 +-0.0519433 0.0503866 0.0326949 +0.0377573 0.0757194 -0.0117756 +0.0434133 0.0930689 -0.00182579 +-0.0445007 0.165214 0.00483168 +-0.0196553 0.063928 0.0497256 +-0.0766812 0.154876 -0.00631355 +-0.0344859 0.0335245 -0.0299041 +0.0132509 0.0349689 -0.0195966 +-0.0264467 0.0459901 0.0505652 +-0.00131456 0.122836 -0.0102349 +0.0122169 0.129551 0.00276868 +-0.0137494 0.0383366 0.00873382 +-0.0445005 0.116602 0.0322264 +-0.0346258 0.0408721 -0.0296689 +-0.0706305 0.0401508 0.00122659 +-0.0765009 0.0716493 0.0271716 +-0.0708234 0.155869 0.0257344 +-0.0311277 0.0566897 -0.0153882 +-0.0896944 0.133694 0.0395953 +0.000231967 0.0783204 -0.0356621 +0.0338144 0.115724 0.00791606 +-0.0300912 0.15662 0.000215848 +0.0464982 0.0677769 0.0257597 +-0.0214151 0.0595466 0.0459898 +-0.0572298 0.0696188 0.0382761 +0.0366123 0.064635 0.0370437 +-0.0264937 0.0973851 0.0437224 +0.0404949 0.0513767 0.0324659 +-0.0350844 0.107815 -0.0201106 +-0.0205025 0.0486482 0.0489372 +-0.0610181 0.13697 -0.00676267 +-0.0906044 0.135075 0.015212 +-0.0194066 0.174211 -0.0159442 +-0.0394983 0.0719214 0.0419294 +-0.0883414 0.120307 0.04718 +-0.00748928 0.0978336 0.0520944 +-0.0846404 0.107661 0.0233457 +-0.0214945 0.10716 0.0418366 +0.0181073 0.0398088 -0.0196993 +0.0190777 0.0384168 -0.0157069 +-0.0636502 0.159498 -0.051954 +0.0283128 0.0754542 0.0444772 +-0.054074 0.15164 -0.0027148 +-0.083614 0.154208 0.0184012 +-0.056485 0.0343785 0.0390076 +0.0337482 0.102096 0.0349353 +-0.0782584 0.1764 -0.0490322 +0.0136057 0.0460076 0.0440344 +-0.00550326 0.0801395 0.0576107 +0.0334132 0.0849144 0.041374 +-0.0113988 0.126257 0.0287047 +-0.0655972 0.169628 -0.0389928 +-0.0832568 0.154212 0.0141255 +-0.0820934 0.0898659 0.0320222 +-0.067283 0.17966 -0.0595334 +-0.062529 0.150617 -0.0195776 +-0.0299377 0.0847457 -0.0326018 +0.0607552 0.0664989 0.0131533 +-0.0228597 0.101618 -0.023963 +-0.0618668 0.165619 -0.0600772 +-0.081854 0.0937329 -0.00756112 +-0.0679516 0.170855 -0.0560296 +-0.0295118 0.108456 0.0388793 +0.0482509 0.0539799 0.0309574 +0.00823122 0.079605 -0.0335706 +-0.0526044 0.041455 0.0460966 +-0.0496802 0.165544 -0.00294037 +-0.0910152 0.129688 0.0372352 +-0.0404973 0.0972715 0.0419896 +0.00850648 0.0772375 0.0559821 +-0.0717922 0.153989 -0.0428988 +-0.0507334 0.147965 -0.00270623 +0.0127323 0.0860509 0.0536553 +0.0565626 0.0508082 0.0192018 +-0.047499 0.10845 0.0392246 +-0.00917487 0.0875708 -0.0370938 +-0.0783316 0.0788746 0.032897 +-0.0896787 0.135012 0.00721892 +0.00550113 0.0883518 0.0561015 +-0.0423419 0.0335706 -0.0240051 +0.0405574 0.104219 0.0191648 +0.00286437 0.130486 0.00148286 +-0.0643911 0.133918 0.0402655 +-0.0620868 0.139878 -0.00655442 +-0.0557051 0.12209 -0.00891575 +0.0589396 0.0566475 0.0201757 +0.0386112 0.0603508 -0.0077511 +-0.0806595 0.0855046 -0.00754297 +-0.0718229 0.0965348 -0.0152102 +0.0459498 0.0806271 0.0191734 +-0.0515557 0.141366 0.000880581 +-0.0859779 0.0910726 0.0273961 +-0.0194809 0.0757644 0.0547346 +-0.0526104 0.0335154 0.00699108 +-0.080479 0.155159 0.0180021 +-0.0500595 0.117739 -0.014504 +-0.0638596 0.0939187 -0.018635 +-0.0469776 0.034208 0.0289371 +0.0315208 0.0994913 0.038731 +0.0444927 0.0610909 0.0304355 +0.0212529 0.1262 0.0189269 +-0.0254692 0.0509386 0.0434079 +0.0476579 0.0715472 0.019969 +0.022698 0.118017 -0.00920048 +-0.0384222 0.125448 0.0219859 +-0.038314 0.170034 -0.0122167 +-0.0530543 0.14469 0.0223994 +-0.00492317 0.0389099 -0.00470281 +0.0373499 0.0533605 -0.00643641 +-0.0696712 0.171569 -0.0347594 +0.0436954 0.0959268 0.0201595 +0.0285253 0.065965 0.0429423 +-0.0466394 0.0345455 0.0392313 +0.0412883 0.0886287 0.0299331 +-0.0251747 0.0383636 -0.0175696 +-0.0674763 0.168038 -0.0560148 +-0.0634115 0.166723 -0.0396505 +-0.0443984 0.0671335 0.0404051 +-0.0524987 0.100127 0.0423619 +-0.0837023 0.110333 0.0361338 +-0.0757541 0.0819089 0.037226 +-0.0475033 0.0973719 0.0436212 +-0.0418104 0.0899475 -0.0227382 +-0.0308563 0.174216 -0.00433975 +-0.00771604 0.130016 0.0212618 +-0.0691125 0.156051 0.011784 +-0.049655 0.0664173 -0.0130805 +0.0212145 0.0401172 -0.0107008 +-0.0418108 0.128972 0.0103834 +-0.0623408 0.164683 -0.0455908 +-0.0776167 0.145877 -0.00384676 +0.0294578 0.079544 0.0444105 +-0.052057 0.15088 0.0153954 +0.0551015 0.0521065 0.00221795 +-0.0568769 0.116868 -0.0135067 +-0.0856284 0.151402 0.00824006 +-0.0512523 0.116429 -0.0151143 +-0.0568623 0.0941345 -0.0215512 +-0.0153943 0.099814 0.0443638 +0.0368805 0.101462 -0.00941022 +-0.0293998 0.0355494 -0.0195486 +-0.040872 0.105663 -0.0204372 +-0.0279821 0.0821961 0.0475971 +-0.0106963 0.176084 -0.0292514 +-0.00933224 0.038323 0.0168951 +-0.0792032 0.10313 -0.00756064 +-0.0540718 0.118333 0.0357708 +0.00450074 0.0938217 0.0540732 +-0.0746595 0.15617 0.0170913 +-0.0708414 0.0994113 -0.0147342 +-0.0516111 0.0530832 -0.00753985 +-0.0486234 0.0532712 -0.0094518 +-0.031704 0.172718 -0.00384226 +-0.00272576 0.130091 0.00149765 +-0.092388 0.120024 0.00928585 +-0.037643 0.153612 0.00331291 +0.0356049 0.0577583 0.0355158 +-0.0668801 0.103821 -0.0153002 +0.0379456 0.10977 0.0171703 +0.0191769 0.0959952 -0.0230407 +0.0391807 0.0658814 0.0336832 +-0.0690863 0.0666121 0.0278101 +-0.089106 0.114375 0.0298659 +-0.0216155 0.0436703 -0.028439 +-0.0266188 0.0490904 -0.0254391 +0.000108091 0.0340814 -0.0198793 +-0.0171613 0.159788 -0.00903074 +0.041574 0.0397142 0.0168995 +0.019656 0.0347604 0.000281692 +0.00764804 0.128583 -0.00254334 +-0.0553782 0.151032 0.0287496 +-0.0528315 0.0558373 -0.00742005 +0.0115037 0.109883 0.0397133 +0.03545 0.105907 -0.00815474 +-0.0629114 0.115341 -0.0117985 +-0.0234208 0.172725 -0.0129655 +-0.0890673 0.101028 0.0173829 +0.0236359 0.056409 0.0445932 +-0.0187325 0.0374026 0.0529482 +-0.0394792 0.105608 0.0388858 +0.0151319 0.0603601 0.0498992 +-0.080949 0.137599 -0.00280806 +-0.0546196 0.0345652 0.0426785 +-0.0465281 0.033544 -0.0026564 +0.0395657 0.0998694 -0.00580754 +0.0101223 0.108705 -0.0195083 +-0.0104988 0.09255 0.056119 +0.0330296 0.116688 0.0147767 +-0.0910722 0.141959 0.0151878 +-0.00849613 0.0703395 0.0565554 +-0.0574961 0.0904385 0.0452768 +-0.0530142 0.0490552 0.0256583 +-0.0294931 0.0717523 0.039896 +-0.0311676 0.0348856 0.0474529 +-0.00876366 0.0347363 0.0436201 +-0.0666703 0.0612745 0.0188657 +0.0173575 0.0940342 0.0480767 +0.0284806 0.111435 0.0343318 +-0.0468308 0.0941893 -0.021914 +-0.0265985 0.0562164 -0.027412 +-0.0871843 0.135176 0.0441499 +-0.063207 0.06374 0.0280276 +-0.0345021 0.0647803 0.0405279 +0.0597837 0.0567045 0.0121686 +-0.0474843 0.0818872 0.0439119 +-0.0589237 0.11399 -0.014753 +-0.0490056 0.122549 0.0307687 +0.0548584 0.0611516 -0.00113589 +-0.0458004 0.0353434 -0.021332 +0.00134052 0.0539375 -0.0306386 +-0.0278278 0.177181 -0.00696301 +-0.0427537 0.0783105 -0.0194623 +0.00651372 0.089712 0.0551929 +-0.0494951 0.0819134 0.044146 +0.0305588 0.055351 -0.0157687 +0.0297469 0.0929269 0.0431563 +0.0125099 0.0519837 0.0495237 +0.0459653 0.0806289 0.018177 +-0.053548 0.149321 0.0244145 +-0.0317948 0.0651814 -0.020436 +-0.019834 0.0868717 -0.0379507 +-0.0119886 0.038466 0.00715809 +-0.0770198 0.170132 -0.03325 +-0.0269539 0.17866 -0.00745161 +-0.0756616 0.0695139 0.0239361 +-0.0474944 0.116586 0.0319739 +-0.0671319 0.0355924 0.0145398 +-0.0783661 0.108548 -0.00557568 +-0.0284012 0.0860445 -0.0346283 +0.0257301 0.0379057 0.0280361 +0.00740689 0.0389878 -0.0235836 +-0.0629696 0.131105 0.0405653 +-0.0380606 0.157756 -0.011216 +-0.0361107 0.0459963 0.0412564 +-0.053455 0.0625326 0.0304805 +-0.0731839 0.178324 -0.0475338 +0.0137018 0.0888713 -0.0301465 +-0.0894038 0.140678 0.0331776 +-0.0114925 0.06602 0.0547394 +-0.0853984 0.0872002 -0.00151975 +-0.00957697 0.128995 0.00181181 +0.0571986 0.0536922 0.00517882 +0.0181761 0.0974249 -0.0228373 +0.0414526 0.0425673 -0.000513932 +-0.0423634 0.121318 -0.0123099 +-0.0854479 0.0898939 -0.00155092 +-0.0136017 0.0392183 -0.0267222 +-0.0353577 0.174409 -0.00212011 +-0.0930586 0.122743 0.0102788 +0.0208421 0.0882147 -0.0254487 +0.000267595 0.0697483 -0.0342392 +0.0443612 0.0458824 -0.00271937 +-0.0794062 0.147442 0.0402641 +0.0285362 0.120755 0.0202147 +-0.0354498 0.0346389 0.0415402 +0.0189212 0.0875932 -0.0268145 +-0.0326685 0.0478014 -0.0229356 +0.0213046 0.0374522 0.0382518 +0.0119628 0.111848 -0.018535 +-0.0754368 0.114522 0.050709 +-0.0575342 0.0415089 -0.00843308 +-0.0289002 0.0348381 0.0445217 +-0.0558188 0.0336396 0.0205147 +-0.0294901 0.0946648 0.0450535 +0.0140142 0.0519753 0.0481823 +-0.0499383 0.162625 -0.0047964 +-0.0285131 0.111188 0.0369648 +-0.0777024 0.176292 -0.0501047 +-0.0458377 0.0970756 -0.021885 +-0.0647866 0.167644 -0.0344082 +-0.08472 0.111015 0.033569 +-0.0624074 0.1491 -0.0095736 +0.0455563 0.078849 0.0217954 +0.0386173 0.0673644 -0.0117551 +-0.0516941 0.147804 0.0164166 +-0.0638593 0.0953482 -0.0183667 +-0.0887889 0.117194 0.003272 +-0.0667452 0.0342007 0.0124321 +-0.0921816 0.132336 0.0152245 +-0.0790475 0.168047 -0.0349702 +-0.0445079 0.0424992 0.043443 +-0.0914924 0.12135 0.00727423 +0.00205109 0.0347195 0.0440743 +-0.0757523 0.0687815 0.0210323 +0.0254197 0.0394349 0.0320923 +0.0445209 0.095967 0.011159 +0.00418461 0.0908826 -0.0329329 +-0.0447434 0.0753343 -0.0181391 +0.0465277 0.0497043 0.0301725 +-0.0231678 0.124994 -0.000333927 +-0.0261386 0.0359205 -0.0192491 +0.000314733 0.0597904 -0.0332055 +-0.0664067 0.0336797 0.00582425 +-0.0179785 0.068344 0.053543 +0.0128834 0.035495 0.00385056 +-0.064012 0.0432207 0.0306772 +0.0356112 0.0942094 0.0375896 +0.0433586 0.0589158 -0.00469925 +-0.0741431 0.153026 0.0335308 +-0.0366764 0.0421455 0.0447176 +-0.0616357 0.158429 -0.0245888 +-0.0777899 0.164478 -0.0251991 +-0.0774203 0.177255 -0.0472003 +-0.0723466 0.0663158 0.0221054 +-0.00945876 0.0366145 -0.0165831 +-0.00782909 0.0896438 -0.0364286 +-0.0483458 0.0338972 -0.0143683 +-0.0548931 0.111218 -0.0174922 +0.0263272 0.0545944 -0.0208638 +-0.078467 0.147461 0.0407301 +0.0472196 0.0430325 0.00527833 +0.0313294 0.118714 0.0127065 +-0.00880796 0.0868775 -0.037347 +-0.054028 0.0344996 0.0411656 +-0.00639115 0.121199 -0.012466 +0.0300864 0.0564003 0.0398351 +-0.0790124 0.0782686 0.0315155 +-0.0134683 0.0964232 0.0523159 +-0.0763221 0.159003 -0.0110053 +-0.0600876 0.0367271 0.0456071 +0.0364957 0.049851 0.0316154 +0.00849848 0.0402756 0.0453316 +0.0205837 0.0754832 0.0508919 +-0.071014 0.148895 -0.037822 +0.0170761 0.115474 -0.0144429 +-0.063767 0.0615586 0.0227478 +0.0437965 0.0987467 0.00816432 +-0.0513326 0.0542594 0.0137993 +-0.0414552 0.0341096 -0.00949275 +0.0395669 0.101281 -0.00480928 +-0.0918243 0.128307 0.0322434 +-0.0474749 0.0945717 0.0440635 +-0.0704486 0.16924 -0.0264473 +0.027192 0.101376 -0.017349 +-0.0895884 0.114751 0.0258504 +-0.0713206 0.156784 -0.042915 +0.0384501 0.0914717 0.0346309 +0.0214747 0.0996539 -0.0214946 +-0.0106582 0.0527176 -0.0332954 +0.00773558 0.128847 0.0268569 +0.0202904 0.0912514 -0.02462 +0.00332905 0.0553943 -0.0309954 +-0.0921247 0.116117 0.0353113 +-0.0146765 0.0526113 -0.0325234 +-0.0657759 0.0410192 0.0130518 +0.0587274 0.0538199 0.013179 +0.0291394 0.102042 -0.0160578 +-0.0701142 0.0625797 0.0062174 +0.0457389 0.0876049 0.0111625 +0.00224905 0.118538 -0.0156887 +0.0520156 0.0596733 -0.00368903 +-0.0891532 0.136419 0.0102028 +-0.0400348 0.0344619 0.0337052 +-0.0461887 0.0335082 0.00469546 +-0.0923435 0.115998 0.0113188 +-0.00713141 0.127357 0.0287426 +0.0252624 0.0747714 -0.0251152 +-0.0453044 0.0587827 0.038737 +0.03635 0.0368836 0.00917982 +-0.0527446 0.0753599 -0.0182797 +-0.0728584 0.132623 0.0509226 +-0.00672844 0.0698676 -0.0361675 +0.0413912 0.0459759 -0.00421898 +-0.0201655 0.0348026 0.0446658 +-0.0641545 0.0391804 0.0263583 +-0.00246627 0.111608 -0.0202454 +-0.0134033 0.110892 -0.0194483 +0.043074 0.0401669 0.0073914 +0.0192967 0.0693907 -0.0288221 +-0.0619039 0.16157 -0.0305885 +0.00333358 0.0341967 0.0104872 +0.0421258 0.100042 0.000179811 +-0.0386776 0.11516 -0.0158482 +-0.00807178 0.0386982 0.0276584 +-0.0756134 0.163772 -0.0350068 +-0.0672387 0.155112 0.00519073 +0.0276118 0.053509 0.0397341 +-0.0779406 0.158305 -0.0189233 +-0.00470743 0.0627772 -0.0352137 +0.0325643 0.0981766 0.0384761 +0.0296733 0.0481683 -0.00874324 +0.0113105 0.059545 -0.0296135 +-0.0653574 0.0733073 0.0386226 +-0.0120884 0.101067 0.0439606 +-0.0268179 0.0735627 0.0438663 +-0.0513902 0.0530791 0.0216216 +-0.0678614 0.042287 0.00944731 +-0.0899071 0.133806 0.0352156 +-0.0122404 0.0385117 0.0269697 +-0.0719375 0.16298 -0.0125698 +0.0473212 0.0533258 -0.00537345 +-0.030503 0.0588732 0.0373493 +-0.0905557 0.120241 0.0451196 +0.0219406 0.0388423 0.0393076 +-0.0672891 0.178209 -0.0595336 +0.0302182 0.0535528 0.0382346 +-0.0815406 0.110006 0.0333062 +-0.0477684 0.0811966 -0.0205178 +-0.048671 0.138621 0.0113976 +-0.0562999 0.0506286 -0.00237306 +-0.0854189 0.0791501 0.00750351 +0.000105856 0.117482 -0.0165473 +-0.0624071 0.149633 -0.00268499 +-0.0682914 0.172271 -0.0560251 +-0.0642448 0.0333797 -0.00245942 +0.0203456 0.053671 -0.0267089 +-0.0711203 0.163576 -0.0137477 +-0.0126641 0.0511309 -0.0317686 +-0.066211 0.180426 -0.0565833 +0.0266688 0.0892152 -0.0224539 +0.01736 0.128384 0.0132094 +-0.0541813 0.154195 0.0142529 +-0.0799749 0.0710714 0.0163832 +-0.0379044 0.0336424 -0.0213286 +-0.0747588 0.0669346 0.0175421 +-0.0221189 0.12668 0.005878 +-0.0623544 0.152149 -0.0255836 +0.0137867 0.0377633 0.0443361 +0.0469104 0.0589185 -0.00506663 +-0.0188119 0.0964492 -0.0282644 +-0.000384494 0.130522 0.00237337 +-0.0647338 0.0418755 0.0296857 +-0.0418518 0.0999485 -0.0214177 +-0.0135206 0.0432479 0.0507363 +0.0314548 0.113206 0.0298812 +0.0211096 0.0343656 0.00467028 +0.0493524 0.0516707 -0.00371978 +0.0324504 0.0916248 0.0417895 +-0.0405477 0.118695 -0.0135582 +-0.0421609 0.128746 0.00435225 +0.00852878 0.034888 0.0362651 +-0.0599768 0.12527 -0.00809043 +-0.0624255 0.16468 -0.0465913 +0.0305387 0.114047 0.0302625 +-0.0209297 0.158088 -0.00822134 +-0.00449554 0.0633716 0.0561592 +0.00751849 0.0440876 0.0454461 +-0.0617319 0.160008 -0.0275856 +-0.00111302 0.130629 0.0207594 +-0.000792652 0.0894877 -0.0349748 +-0.0534886 0.0862338 0.0454573 +0.0102426 0.0752832 -0.032327 +-0.0866178 0.151117 0.0269024 +0.00586712 0.0991316 -0.0229749 +-0.018487 0.0772258 0.0557066 +-0.0220963 0.0623062 0.0451655 +-0.0263156 0.124827 0.00142734 +0.00449781 0.0519669 0.0532713 +-0.0318681 0.105727 -0.021166 +-0.034171 0.0822565 -0.0245355 +-0.0160192 0.104518 -0.0227486 +-0.0336086 0.0394857 -0.0301589 +0.0179261 0.0900567 0.048881 +0.028994 0.0915879 0.0438177 +0.0419459 0.0625408 -0.0027477 +-0.0623435 0.161536 -0.0425937 +0.0521127 0.0595383 0.0295528 +0.00603967 0.0344425 -0.0152712 +-0.0200036 0.0384998 -0.0166705 +0.0335055 0.0549395 0.0359782 +0.0413899 0.0475369 -0.00516876 +0.0571049 0.0594437 0.0244408 +-0.0642323 0.124186 0.0475964 +-0.0104933 0.0952299 0.0545267 +0.0183283 0.0593891 -0.0275077 +0.0556724 0.0698728 0.00398853 +0.02895 0.086199 0.0437135 +-0.00575467 0.1008 0.0460186 +-0.0117555 0.0969094 -0.0306933 +-0.0570352 0.129621 -0.00626418 +-0.06396 0.034704 0.0249317 +-0.0269668 0.0674701 -0.0325423 +0.00372222 0.0941665 -0.0317421 +-0.0708312 0.0951391 -0.0158707 +0.0351494 0.0633173 0.038442 +0.0303372 0.119206 0.0194646 +-0.0174811 0.118153 0.0357243 +-0.0928105 0.116053 0.0203106 +-0.012498 0.078722 0.0572931 +0.0102589 0.100444 -0.0223447 +0.0311369 0.0982118 0.0399163 +-0.0870966 0.0995146 0.0044219 +0.0372771 0.100696 0.0312566 +-0.0464652 0.16842 -0.00496016 +-0.0340766 0.172586 -0.0145127 +-0.0632966 0.144361 -0.00960502 +-0.00396533 0.128634 -0.00247998 +-0.0810179 0.0964125 -0.00756981 +-0.0296304 0.159454 -0.0131553 +0.0323433 0.0592178 0.0396143 +0.0171685 0.0490344 0.0439112 +-0.0798847 0.0706373 0.0145533 +0.00550249 0.0758881 0.0564988 +-0.0285046 0.0588067 0.036767 +-0.054422 0.152991 0.0228754 +-0.0663081 0.150341 0.0377708 +-0.0409099 0.173193 -0.0056112 +-0.00259587 0.0391262 -0.0253465 +0.0394316 0.0807401 0.0342345 +0.048793 0.049707 0.0281736 +-0.0225905 0.0365035 -0.0286129 +-0.0185117 0.0387718 -0.0147573 +-0.0889514 0.121274 0.00229944 +0.0255827 0.034587 0.0128177 +-0.0258582 0.100162 -0.023852 +-0.0317095 0.0382098 0.0512104 +-0.0608875 0.104029 -0.0182853 +-0.0577034 0.0591273 0.0216745 +-0.0316861 0.0553325 -0.0133983 +-0.0579004 0.0336435 0.0147513 +-0.050636 0.0604891 -0.0105672 +-0.0484979 0.101507 0.0419588 +-0.0735846 0.159652 -0.032921 +-0.0596849 0.136693 0.0347693 +-0.0527883 0.0490273 0.0246529 +-0.00587038 0.038496 0.0083708 +0.0443161 0.095966 0.0141619 +-0.0355281 0.0832646 0.0432735 +-0.0552893 0.160933 0.00328411 +-0.0694051 0.177621 -0.0490523 +0.0553162 0.0608807 0.0271604 +-0.0115038 0.082913 0.0576973 +0.00149573 0.118307 0.0388892 +-0.0643923 0.178295 -0.0607754 +-0.0696234 0.0702067 -0.00731499 +-0.0684446 0.156174 0.0134711 +-0.0631402 0.158352 -0.0425984 +-0.028277 0.0807444 0.0465032 +-0.0851037 0.143224 0.00618561 +-0.0701909 0.171451 -0.0335218 +-0.0542038 0.149302 0.0263885 +-0.0230864 0.0416339 0.0540702 +-0.0848397 0.124371 0.0492354 +-0.0509437 0.0349503 0.0448676 +0.0147035 0.0490065 0.0456198 +-0.059742 0.156334 0.00641085 +-0.07522 0.0688188 0.0015368 +-0.0196569 0.0390707 0.0375255 +0.0459174 0.0834201 0.0141703 +-0.0785236 0.0894249 -0.0105705 +-0.0200463 0.0893341 0.0549931 +-0.0173075 0.11558 -0.0164072 +0.000516136 0.0760027 0.0580883 +0.042165 0.0859172 -0.00778247 +0.0203197 0.0664896 -0.0280597 +-0.0604906 0.0959808 0.043977 +-0.00180047 0.0840422 -0.0369301 +0.0106204 0.119324 -0.014581 +0.000242427 0.128645 -0.00250259 +-0.0544918 0.0876045 0.0451014 +-0.081252 0.0993542 0.0322994 +0.0225815 0.0632207 0.0466294 +-0.0528036 0.129718 0.0341858 +0.0388075 0.10554 0.0251669 +-0.071237 0.156366 0.0212013 +-0.0419921 0.0349859 0.0415962 +0.0319555 0.0413937 0.028007 +-0.0465003 0.112564 0.0357108 +0.00310161 0.111606 -0.0202814 +0.0306552 0.102095 0.0374778 +0.0158981 0.0576764 0.0492073 +-0.036508 0.127508 0.00348399 +0.0403284 0.0574912 -0.00511853 +-0.06805 0.157495 -0.00534926 +-0.0870566 0.0847034 0.0124776 +-0.0785035 0.127443 0.053282 +0.0093755 0.0479282 -0.0271091 +-0.00151782 0.111398 -0.0200294 +-0.0386619 0.0336282 0.00792475 +-0.0321818 0.0666221 -0.0204419 +-0.0516478 0.0334795 -0.00363494 +-0.0505323 0.0346392 0.0434961 +-0.0871097 0.129792 0.0470428 +-0.00115829 0.0378141 0.0044798 +0.00250327 0.0351261 0.00210209 +0.0232927 0.0720269 -0.0262872 +0.0386441 0.0772022 -0.0107761 +0.00730214 0.0624461 -0.0313742 +-0.0601285 0.0334799 -0.007174 +-0.0311809 0.165241 -0.0158459 +-0.0456556 0.126096 -0.00729728 +0.01482 0.0920349 -0.0274402 +-0.0578658 0.154169 0.0274197 +-0.0766831 0.148629 -0.00786722 +-0.0548976 0.0574275 -0.00541424 +-0.0213746 0.0936314 -0.0333712 +-0.0795038 0.127439 0.0531413 +-0.0719602 0.0381531 0.00797803 +0.0465231 0.0539629 0.0319545 +-0.0327551 0.126411 0.00489661 +-0.0907403 0.135093 0.0162106 +-0.0798437 0.119249 -0.00499812 +-0.0195891 0.186548 -0.0163318 +-0.0336818 0.0474202 0.0430149 +0.0387003 0.0847793 0.034951 +0.005123 0.108732 -0.0201833 +-0.0355723 0.127236 0.00383072 +-0.0593755 0.0706339 0.0387044 +-0.0701237 0.0337481 0.00141754 +-0.0596389 0.0645563 -0.0073211 +-0.0247044 0.0349045 0.050534 +-0.0698349 0.155896 0.010068 +-0.00664542 0.0496313 -0.030799 +-0.0560508 0.049202 -0.00336342 +-0.0846449 0.0777798 0.00851725 +0.0428444 0.0958802 0.0241636 +0.0226208 0.0505695 0.0412719 +-0.0421939 0.165153 -0.0106292 +-0.0530779 0.153128 -0.00337034 +-0.0183995 0.128105 0.0144964 +0.0110096 0.125946 -0.00574203 +0.0135498 0.109816 -0.0183273 +0.0246987 0.1167 0.0323736 +-0.0323986 0.169744 -0.00487272 +0.0414995 0.0513848 0.032599 +-0.0820948 0.0748388 0.0105311 +-0.0771842 0.102138 0.0352151 +-0.0627985 0.161541 -0.0235962 +0.0203907 0.0490438 0.0415331 +-0.0284862 0.120462 -0.00941436 +0.00850898 0.0990197 0.0481875 +0.0181919 0.0781799 0.0527467 +-0.0323958 0.0383608 -0.00233468 +-0.0198811 0.121697 -0.00881459 +-0.0289402 0.154865 -0.00285823 +-0.055522 0.0600566 -0.00554029 +-0.0446949 0.0680713 -0.0159309 +-0.0505296 0.0657745 0.0361047 +0.0251595 0.0995713 -0.0194056 +0.0456643 0.0876028 0.0121678 +-0.0533672 0.143136 0.0253913 +-0.05283 0.138085 0.0270749 +-0.0324865 0.0974182 0.0443398 +0.00543862 0.118556 -0.0157347 +-0.0704807 0.1602 -0.00768602 +0.00476485 0.0378127 -0.0129945 +0.0453303 0.0875809 0.0171699 +0.00844159 0.109753 0.0403226 +0.0199305 0.0645206 0.0480779 +-0.0865012 0.0967606 0.00143514 +0.0239407 0.0433254 -0.00969837 +-0.0464991 0.0818806 0.0436011 +-0.0365053 0.0832925 0.043701 +-0.0511539 0.144707 0.0143676 +-0.0354688 0.0973337 0.0432864 +0.0315086 0.0361416 0.0180806 +-0.0620392 0.152203 -0.0175795 +-0.00174908 0.0726707 -0.0356483 +0.0482658 0.0482112 0.0273759 +0.0205204 0.0686316 0.0489712 +0.0055446 0.129937 0.0246284 +-0.0509363 0.126898 0.0333376 +0.0503401 0.0525815 0.0286903 +-0.0663805 0.0356243 0.0152158 +-0.0631059 0.039729 0.0160762 +-0.0794629 0.0702542 0.0118898 +-0.0440204 0.0437247 -0.0153148 +-0.0258047 0.0811626 -0.0373791 +-0.0654527 0.156561 -0.05302 +-0.0801896 0.0926573 0.034266 +-0.0226625 0.0493576 -0.0281762 +-0.076512 0.15561 -0.00689633 +-0.0316228 0.0384779 -0.00967109 +0.0073096 0.0609801 -0.0307365 +-0.036779 0.0827886 -0.0223365 +-0.0454595 0.0846983 0.0440929 +-0.0310517 0.0636961 -0.0214339 +0.044971 0.0748214 0.0226935 +-0.0245671 0.182966 -0.016053 +-0.0343794 0.125292 -0.00246071 +0.0260218 0.0493062 -0.0196675 +0.00451349 0.0786214 0.0559314 +-0.0272596 0.0409813 0.0537728 +-0.0865558 0.105007 0.0203641 +-0.0427952 0.0347556 0.00787321 +-0.0294944 0.0889496 0.044252 +-0.0691615 0.0832998 0.0419252 +-0.077704 0.175863 -0.0450747 +-0.0595653 0.0407951 0.0449735 +-0.0118194 0.129824 0.0125318 +-0.0304269 0.169744 -0.0072967 +0.00750596 0.0674413 0.055134 +-0.0895098 0.0942825 0.014433 +0.0566953 0.0550372 0.00319006 +0.0358581 0.0995241 -0.0113664 +-0.0541815 0.15229 0.0244282 +-0.0924737 0.125588 0.0362608 +-0.0750911 0.110634 0.0449752 +-0.0272685 0.0368017 0.0538626 +-0.0614955 0.104283 0.0410789 +-0.0721148 0.067315 0.0248191 +0.034236 0.094243 0.0391072 +-0.0724407 0.178857 -0.0487083 +-0.06691 0.033448 -0.00125687 +-0.0660379 0.0349778 0.0329828 +-0.0701097 0.156012 0.00122102 +-0.0157478 0.0352634 0.050467 +-0.0465076 0.160794 0.0071118 +-0.0156218 0.0365183 -0.0177136 +-0.00687536 0.0389886 0.0330493 +0.0201949 0.0959886 -0.0227072 +0.00536718 0.125777 0.0317922 +-0.0689036 0.105186 -0.0135662 +-0.0576505 0.0508003 0.0036576 +-0.0372877 0.0353832 0.0246264 +-0.0766222 0.0824671 -0.0115781 +-0.0570813 0.0344654 0.0405363 +0.0284042 0.0431456 -0.00552671 +-0.078005 0.151454 -0.00188508 +0.00274784 0.0953419 -0.0309592 +-0.0764328 0.147234 -0.00786196 +-0.0187399 0.0656914 -0.0372373 +-0.0626784 0.0670893 0.0340154 +-0.066213 0.0377522 0.0375383 +0.00946024 0.0346841 0.0420404 +-0.00763703 0.046711 -0.0299661 +0.0217664 0.106013 0.0404033 +0.0159395 0.0900955 0.0512828 +-0.0714939 0.126019 0.0527835 +-0.035368 0.122868 0.0260927 +0.0397669 0.0885289 -0.0117744 +-0.0235296 0.159196 -0.00227474 +-0.0299919 0.0383903 -0.00556396 +0.00840449 0.0360838 -0.0229864 +-0.0688351 0.0951745 -0.0162656 +0.0188202 0.124811 0.0265908 +-0.0542034 0.0477679 0.0266683 +-0.00718512 0.0384992 0.0226001 +0.0191993 0.0352366 0.0345338 +-0.0486962 0.13553 0.00541025 +0.0065027 0.0533154 0.0528127 +-0.064997 0.0410349 0.013689 +0.0235192 0.107033 0.0392433 +-0.0526101 0.0632972 -0.0100113 +0.0288769 0.120252 0.0217702 +-0.00882418 0.0896578 -0.0365764 +-0.0563459 0.0335397 0.00260276 +0.0287652 0.114389 -0.00726895 +0.0564669 0.0577845 0.00118215 +-0.0623836 0.163016 -0.0556039 +-0.0235351 0.118111 0.0331575 +0.0443232 0.0889197 0.0231574 +0.0349753 0.114037 0.00545779 +0.0269837 0.108749 0.0374141 +-0.000496913 0.056284 0.0547664 +-0.0889882 0.115854 0.0042936 +-0.0688144 0.0851338 -0.0175228 +-0.0304795 0.0746468 0.0405648 +-0.0616784 0.0692367 -0.0132074 +-0.0554108 0.0334149 -0.00799207 +-0.0610813 0.0342293 0.0311986 +-0.0655517 0.155937 0.0246661 +-0.0767597 0.163153 -0.0191399 +-0.0140741 0.0388251 0.0317136 +-0.02858 0.0731702 0.040795 +-0.0480086 0.134685 0.0198054 +-0.00949027 0.107257 0.0434611 +-0.0224071 0.0510134 0.0440995 +0.0026516 0.0341771 0.00670019 +-0.00282121 0.086807 -0.0363939 +0.00461042 0.092806 -0.0323339 +0.0444404 0.0425371 0.0222477 +-0.0251232 0.0838362 0.0531591 +-0.0711154 0.155676 0.00670049 +-0.0144639 0.0977101 -0.0275565 +-0.0176152 0.0407641 -0.0279656 +-0.0273216 0.038344 -0.00129213 +-0.0781679 0.14865 -0.00288263 +-0.071113 0.171733 -0.033865 +-0.0362701 0.0365605 0.0458807 +-0.0245074 0.0384654 -0.0082311 +-0.0768529 0.106269 -0.00826114 +0.0173624 0.088714 0.0498122 +-0.0872512 0.106353 0.0133638 +-0.0647985 0.124215 0.0485 +0.0274255 0.0686124 0.0431235 +-0.0275944 0.0717748 -0.0345689 +-0.00449702 0.0590031 0.0543234 +-0.00869265 0.0598566 -0.0344628 +-0.0624896 0.106999 0.0393995 +0.00296819 0.0986498 -0.0244883 +-0.0716108 0.0701594 -0.00639514 +-0.0454969 0.0733342 0.042072 +0.0217583 0.0505253 0.0417779 +0.0599479 0.0692188 0.0141571 +0.0159709 0.0859869 -0.0291978 +0.0474137 0.0671743 0.000684928 +0.045537 0.0890033 0.0131643 +0.025235 0.0690602 -0.0242719 +-0.0140104 0.117853 -0.0148385 +-0.0417786 0.156522 0.00614116 +0.0529468 0.0608894 0.0290245 +-0.0623778 0.167137 -0.0608155 +-0.043781 0.0422821 -0.0183128 +0.0194047 0.0727279 0.0509389 +-0.025431 0.180214 -0.00870569 +0.00163035 0.0962275 -0.0299038 +-0.0609057 0.119508 -0.00974426 +-0.0265539 0.180361 -0.00771033 +-0.00586693 0.104511 -0.0229142 +-0.0446124 0.0534121 -0.0108089 +-0.0607974 0.125499 0.0419374 +-0.0676844 0.160922 -0.0559942 +-0.0718937 0.0376106 0.00231258 +-0.0769618 0.103489 0.0349575 +-0.0136243 0.0450811 -0.0280269 +-0.0656393 0.145367 0.0403005 +-0.067848 0.0994807 -0.015636 +-0.0674005 0.156127 0.0138467 +-0.0814089 0.141772 -0.000809353 +0.0343092 0.113032 0.0252402 +-0.0378129 0.0900392 -0.0237743 +0.0410972 0.0779427 0.031296 +-0.0594968 0.104294 0.0413247 +-0.045045 0.0657131 0.0396946 +0.0424943 0.0569701 0.0318321 +0.0380924 0.0618152 0.0338774 +-0.0181385 0.038277 0.0223668 +-0.0680503 0.114246 0.0489904 +-0.089636 0.0902445 0.0164491 +-0.0259323 0.124597 0.000115117 +-0.0341212 0.124555 0.022076 +-0.0117695 0.075665 -0.0382916 +-0.0666005 0.156329 0.0184798 +0.0143467 0.0580862 -0.0289605 +0.00620145 0.0832401 0.0564613 +-0.07299 0.158232 -0.0339184 +0.0179038 0.0866718 -0.0278625 +-0.0447879 0.085543 -0.0216723 +0.0240528 0.0347605 0.00303304 +0.0471472 0.0437632 0.0216364 +-0.0254743 0.105723 0.0415881 +-0.0914335 0.120003 0.00730918 +-0.0381624 0.035793 0.0434599 +-0.0470742 0.127422 -0.00463291 +0.000501079 0.0620074 0.0565701 +-0.0488714 0.104198 -0.020417 +-0.00949444 0.063336 0.0558203 +-0.0227837 0.0742285 -0.0385317 +-0.00949145 0.115547 0.0400498 +-0.0665386 0.0804536 0.042224 +0.00148883 0.121012 0.0365952 +-0.024281 0.069418 0.0457102 +0.019893 0.114777 -0.0136897 +-0.0904011 0.115144 0.0307537 +-0.00370938 0.0627709 -0.0350699 +-0.00367406 0.0555102 -0.0326331 +-0.0125077 0.0773203 0.0572074 +-0.0574951 0.093265 0.0451928 +-0.0942113 0.120123 0.0212925 +-0.0213358 0.165379 -0.00997448 +-0.0615068 0.0789665 0.042503 +0.00239149 0.0343213 0.0156312 +-0.0639126 0.11101 -0.0139478 +0.0381439 0.103967 -0.00387277 +-0.0816033 0.101897 -0.00556882 +-0.0582639 0.12123 0.0402958 +-0.0729322 0.156105 0.0220745 +-0.0514974 0.086244 0.0456131 +-0.0876158 0.137864 0.0416648 +0.0120082 0.0967361 -0.024421 +0.0147782 0.0929392 -0.0263979 +-0.0510555 0.150177 -0.00351578 +-0.0165661 0.163924 -0.0100865 +-0.00519498 0.0390091 -0.00671136 +-0.021716 0.0641363 -0.0354017 +-0.0523357 0.136679 0.027812 +0.0335961 0.0633113 0.0397473 +-0.0384865 0.0492045 0.0394845 +-0.0339969 0.152567 -0.000573454 +0.0175453 0.0645325 0.0499023 +-0.0895247 0.139293 0.0351741 +-0.0870044 0.115772 0.00228167 +-0.0852267 0.0792333 0.0184927 +-0.0927665 0.116031 0.013321 +-0.0240588 0.111793 -0.0183639 +0.0191819 0.123133 0.0296014 +0.0163312 0.0767998 0.0535416 +-0.0834123 0.0856961 -0.00454328 +-0.0614974 0.0904473 0.0454009 +-0.0648003 0.0370671 0.0164284 +-0.0102366 0.125327 0.0306172 +-0.0512935 0.0556822 0.0305914 +-0.0674962 0.0930678 0.0426016 +-0.0707247 0.156767 -0.045914 +-0.0611468 0.0584317 0.0117762 +0.0152753 0.0680849 -0.0302874 +-0.0638387 0.163409 -0.0592654 +0.030267 0.0496887 -0.0107252 +-0.0227695 0.0684387 -0.0367377 +0.0216497 0.065881 0.0470485 +-0.0849335 0.125015 -0.00321773 +-0.0364959 0.0562316 0.0392716 +-0.0132153 0.0406258 0.0508237 +0.00695506 0.0982177 -0.0239936 +0.00047843 0.12713 -0.00487855 +0.0354045 0.046148 -0.00604177 +-0.0913848 0.129679 0.0322355 +-0.0924762 0.124198 0.0322659 +-0.0057025 0.12744 -0.00517306 +0.032332 0.110047 0.0311032 +-0.0374975 0.0662835 0.0416878 +-0.0306651 0.155159 -0.000638202 +0.0161 0.12839 0.0198796 +-0.0392376 0.124806 0.0231803 +0.00131504 0.0597888 -0.0330641 +-0.0445007 0.0931064 0.043109 +-0.0174373 0.0336888 -0.022956 +-0.0536509 0.0343311 0.0291848 +0.0348249 0.110986 -0.0028353 +0.0280633 0.100998 -0.0169482 +0.0423903 0.0490515 -0.00589339 +0.0306614 0.119205 0.0153072 +-0.0604957 0.0876028 0.045161 +-0.0137303 0.0699989 -0.0380502 +-0.00750341 0.130405 0.00835201 +-0.0494799 0.116621 0.0323892 +-0.058737 0.075302 -0.0183386 +-0.0518764 0.0550741 0.0228473 +-0.0293899 0.118762 -0.0116358 +-0.0743199 0.158257 -0.0279194 +-0.0265758 0.0533991 -0.0263925 +-0.047508 0.0903548 0.0442194 +-0.0104972 0.0815462 0.0580111 +-0.0356136 0.0408304 -0.0293778 +-0.0622824 0.159968 -0.0396048 +-0.0727292 0.0730957 -0.00887693 +0.0252321 0.0889244 0.0471615 +0.0362811 0.0443655 0.0298564 +-0.0583717 0.138143 0.0331568 +0.0516174 0.0711387 0.00464104 +0.00649466 0.0427198 0.0454361 +-0.0187116 0.0598792 -0.0350421 +-0.0603468 0.0339987 0.0210215 +0.0310626 0.107429 0.0345663 +-0.0153967 0.0384283 -0.000805549 +0.0390675 0.0617702 -0.00778266 +-0.0718188 0.0907915 -0.0158595 +-0.0066784 0.0569449 -0.0331859 +0.00738229 0.0448872 -0.0251556 +0.0193881 0.0506007 -0.0247336 +-0.0171345 0.165288 -0.0183426 +0.0172728 0.0694422 -0.0295359 +0.0518225 0.072596 0.0200635 +-0.085483 0.140457 0.00319222 +-0.049383 0.140141 0.0133936 +-0.076884 0.155644 0.0221655 +-0.0584972 0.111135 0.0367864 +-0.0264895 0.102963 0.0427118 +-0.016526 0.0387631 -0.00875803 +-0.060493 0.107007 0.0395303 +-0.0133132 0.0385196 -0.000466347 +0.027107 0.0406036 0.0313674 +-0.0852773 0.137655 0.00128094 +-0.0776954 0.16804 -0.0399638 +-0.0465214 0.0505047 0.038174 +-0.0251912 0.178602 -0.0188241 +-0.0524991 0.101502 0.0417298 +-0.0142894 0.184628 -0.0268303 +0.00710791 0.110158 -0.019992 +-0.0766628 0.155608 -0.00789132 +-0.0814761 0.0734707 0.0145404 +-0.0644951 0.0789605 0.0422031 +0.0403539 0.105584 0.00317596 +-0.0633486 0.0371336 0.0178291 +-0.0808831 0.117721 -0.00384392 +-0.0265027 0.10847 0.0397156 +0.0236097 0.121674 0.028372 +-0.0623736 0.164689 -0.0415928 +-0.0495545 0.0404082 -0.0113965 +-0.0562131 0.054804 -0.00139993 +-0.0418518 0.098529 -0.0215916 +0.0133351 0.058103 -0.0291864 +-0.0594448 0.063179 0.0293052 +0.0113019 0.0652847 -0.0308368 +-0.0783582 0.0994351 0.0350546 +-0.0715439 0.0376425 0.00026118 +-0.0154996 0.112736 0.0400881 +0.0417289 0.0704356 -0.00679567 +-0.0406463 0.127804 0.0152535 +-0.0627661 0.170921 -0.0616075 +-0.0923057 0.12017 0.0426167 +-0.00727442 0.0422617 0.0488857 +0.0350851 0.0848737 -0.0178837 +-0.01578 0.128598 0.00819831 +-0.03217 0.0735917 -0.0275208 +-0.0673634 0.110954 0.0392365 +-0.0271001 0.0779439 0.0468281 +-0.0765081 0.156243 -0.00790412 +0.0277565 0.117474 -0.00457839 +-0.0113381 0.0986434 -0.0265191 +-0.0330823 0.0695155 -0.0204574 +-0.0652177 0.144322 -0.0140816 +-0.0094303 0.0379372 -0.0159242 +-0.0245144 0.0945317 -0.028309 +-0.05375 0.0560385 0.0116204 +-0.0679678 0.0383221 0.0123903 +0.00399334 0.0399971 0.0458959 +-0.0841715 0.0870272 0.0285556 +-0.0274573 0.0734015 0.0426855 +-0.0626773 0.153684 -0.0325991 +-0.0741408 0.105214 0.0369385 +-0.0134986 0.081495 0.0573009 +0.0463327 0.0421886 0.017365 +-0.0644937 0.108375 0.0384047 +-0.0653695 0.151233 0.0366147 +-0.018937 0.178659 -0.0169738 +-0.0820692 0.0748107 0.00351555 +-0.0841353 0.146019 0.0379782 +-0.0148578 0.163977 -0.0174595 +-0.0817263 0.0747702 0.00249857 +0.000235601 0.0740952 -0.0356038 +0.000940682 0.0357179 -0.0155776 +-0.0719363 0.129668 -0.0086833 +0.0301411 0.102934 -0.0150039 +-0.0651961 0.0334974 -0.00275965 +-0.0185844 0.16399 -0.00948536 +-0.0592125 0.042121 0.0445708 +7.57538e-05 0.0369473 0.00366537 +0.0152945 0.0666369 -0.0299356 +0.0410157 0.0739041 0.031202 +-0.0577153 0.0344512 0.0421091 +-0.0920793 0.129683 0.0282033 +-0.0497426 0.0753235 -0.0177986 +-0.0484934 0.047761 0.0395051 +-0.0809803 0.104706 0.0304576 +-0.0746935 0.111142 -0.00760178 +0.0204806 0.109788 0.0388648 +-0.0734977 0.128836 0.0522844 +-0.0426178 0.0520018 -0.0109441 +0.0112198 0.0932651 -0.0287439 +-0.0119274 0.182669 -0.0262872 +0.0145534 0.0347576 0.0376203 +-0.0810222 0.100509 -0.00657927 +-0.0033633 0.038102 0.0128662 +-0.0937861 0.128264 0.0182441 +0.0084061 0.0949783 -0.0285638 +-0.0695902 0.113495 0.0492959 +0.000169576 0.131258 0.0183392 +-0.0931626 0.117374 0.0143043 +-0.0195343 0.112367 -0.0190097 +-0.0524215 0.162453 0.00456363 +0.0184901 0.0879016 0.0492476 +-0.0685433 0.170852 -0.0550244 +-0.087182 0.130813 0.00128919 +0.00130454 0.0641388 -0.0343264 +-0.000757317 0.075519 -0.0359212 +0.0308776 0.0902792 0.0430757 +-0.00578939 0.0386518 0.00278679 +-0.076212 0.155059 0.00635026 +-0.0248315 0.0881388 -0.0362597 +-0.0222598 0.160103 -0.0129456 +-0.00877699 0.0770434 -0.0377883 +-0.06674 0.0383979 0.0141071 +-0.00350265 0.0689326 0.0566398 +-0.0295614 0.0861399 -0.0326125 +-0.0286647 0.125711 0.0122564 +-0.0699648 0.0791315 0.0398469 +0.0142764 0.128727 0.0220636 +-0.0638003 0.110914 0.037425 +-0.0719625 0.135504 -0.00769556 +-0.0527869 0.124083 0.0359567 +-0.0467161 0.0738381 -0.0169211 +-0.0117423 0.070003 -0.0378791 +-0.0517809 0.138537 0.023394 +-0.00482205 0.130969 0.0150835 +0.034711 0.0383001 0.0222555 +-0.00127486 0.120883 -0.0121504 +0.0112227 0.0850587 -0.0310098 +-0.0506063 0.0369029 -0.0119734 +0.0433147 0.0831895 0.0275132 +0.0112941 0.127457 0.0281604 +0.0151622 0.122267 0.032438 +0.0400834 0.082061 0.0334038 +-0.0745622 0.152707 -0.0248951 +-0.0528479 0.141625 0.0244146 +0.0245482 0.035172 0.0211866 +-0.0325075 0.11115 0.0364446 +0.0417109 0.0957641 -0.00380547 +-0.00538241 0.130597 0.0192035 +-0.0649174 0.0364897 0.025021 +-0.0770334 0.158982 -0.013085 +-0.0760388 0.148613 -0.0118618 +0.0283559 0.116347 0.030146 +-0.088594 0.121257 0.00130017 +-0.0268076 0.122539 -0.00562189 +-0.0346629 0.0607102 -0.0125376 +0.0413795 0.0505691 -0.00672382 +-0.0906746 0.1365 0.0201946 +0.00951942 0.100425 0.0477045 +-0.0642867 0.172466 -0.0611328 +-0.0242433 0.172722 -0.0123976 +0.00950564 0.0990636 0.0482467 +0.0101664 0.120462 0.0359466 +-0.0187755 0.107692 -0.0220397 +0.0335012 0.0795469 0.0414506 +-0.0834882 0.14321 0.00316117 +-0.0530161 0.141613 0.0254095 +-0.0395373 0.172163 -0.000837254 +0.0387477 0.0589461 -0.0057234 +-0.0647673 0.0795072 -0.0181104 +-0.00140393 0.0361018 0.00962515 +-0.00524162 0.0395598 0.0483202 +0.0236373 0.103743 -0.0178545 +-0.000477761 0.0760312 0.0584165 +-0.0210492 0.0348694 0.0496408 +-0.00244654 0.131114 0.00878185 +-0.033711 0.0384262 -0.00450177 +-0.0745333 0.152696 -0.0258905 +0.055409 0.0509629 0.0218922 +-0.0134774 0.127753 0.000758007 +-0.0120362 0.0388366 0.0321214 +-0.0278604 0.0487672 0.0470543 +0.0327952 0.0713854 0.0403707 +-0.0728362 0.0979301 -0.0143404 +-0.0367225 0.125751 0.02112 +0.0198232 0.0385183 -0.0126921 +-0.0377749 0.150712 0.00133662 +-0.0665966 0.180807 -0.0581921 +-0.0215095 0.114043 0.0376946 +-0.0620515 0.035927 0.0204607 +-0.0584945 0.150006 -0.0011129 +-0.0335992 0.1188 -0.0116562 +0.0196457 0.116633 0.0356159 +0.0248522 0.0685926 0.0446792 +-0.0164926 0.0544756 0.0504072 +-0.051136 0.140067 0.0203692 +-0.089139 0.139182 0.0122002 +0.0163249 0.0580554 -0.0285 +-0.0621816 0.0342254 0.0257179 +-0.0188821 0.0387745 -0.0111028 +-0.053388 0.034491 0.0395762 +-0.000472072 0.130948 0.0195451 +-0.0634988 0.173693 -0.0615446 +-0.054487 0.0452173 0.0438312 +-0.0202902 0.0906146 -0.0362948 +-0.0725702 0.17984 -0.0501722 +-0.0707759 0.162402 -0.0459559 +-0.0463694 0.113628 -0.0162147 +-0.0523573 0.0345285 0.0397607 +-0.0136632 0.0511316 -0.0317578 +-0.00948303 0.0703233 0.0561585 +-0.0852113 0.0869359 0.026743 +-0.0745333 0.0805197 0.0374668 +0.00349251 0.118288 0.0385113 +0.0493697 0.0693787 0.0250272 +0.029581 0.0736246 -0.0217333 +-0.0400646 0.156235 -0.00986121 +-0.0818113 0.136716 0.048659 +-0.0809364 0.129495 -0.00494346 +-0.0875459 0.110452 0.0143395 +0.0253164 0.112728 0.0350367 +-0.0852858 0.0845126 -0.000515374 +0.00212883 0.120316 -0.0135831 +-0.0192664 0.0381478 0.0114056 +0.0493315 0.0589269 -0.00474568 +-0.0183092 0.162495 -0.00732366 +-0.00730789 0.12834 -0.00208974 +-0.0286194 0.180015 -0.014033 +0.0255963 0.0648009 -0.0228004 +-0.00925832 0.177251 -0.027731 +-0.0485485 0.0432385 -0.0107358 +-0.0600861 0.14609 -0.00280453 +-0.026172 0.174158 -0.0190728 +-0.059111 0.0686528 0.0369372 +-0.0434854 0.0944868 0.0426487 +-0.0216341 0.038095 0.0200103 +-0.0670537 0.071446 0.0363402 +-0.0348255 0.0915164 -0.024068 +-0.0202598 0.174222 -0.0154191 +0.0344662 0.114921 0.00815778 +-0.0686919 0.0750175 -0.0147112 +0.026272 0.0789381 -0.0240124 +0.0202522 0.0805604 -0.0270674 +-0.0432329 0.156565 0.00586077 +-0.00650833 0.0787624 0.0577507 +-0.0335034 0.0774945 0.0414157 +-0.0606769 0.0676671 -0.0113119 +-0.0656284 0.162324 -0.0174746 +0.00729944 0.0639619 -0.0320669 +-0.00448657 0.0898027 0.0567005 +-0.0584972 0.0918588 0.045399 +0.00218731 0.0852799 -0.0344916 +-0.0417916 0.0869783 -0.0214259 +0.0463392 0.0489694 -0.00446687 +-0.0389761 0.128486 0.00847309 +0.00727028 0.11232 0.040519 +-0.0234564 0.0680424 0.0463484 +-0.0797185 0.0803984 0.0327643 +0.0232549 0.0645506 0.0458531 +0.0198821 0.0449543 0.0425235 +-0.0394974 0.0902763 0.0431118 +-0.0662858 0.172388 -0.0591199 +0.0259452 0.0364961 0.0239139 +-0.0714148 0.0386609 0.00057855 +-0.0638254 0.0924713 -0.0188016 +-0.0584874 0.112515 0.0360801 +-0.0623619 0.166253 -0.047591 +0.0452758 0.0875665 0.00218329 +-0.0244115 0.0379996 0.0159179 +0.0452209 0.0659646 -0.000116442 +-0.0707693 0.176767 -0.0466577 +-0.0650223 0.156803 -0.0519494 +0.0354173 0.0414682 -0.003097 +-0.0416808 0.0622091 -0.0130274 +0.0326595 0.114633 -0.00147403 +-0.0495274 0.14168 0.00739502 +0.0388579 0.0970015 -0.00784 +-0.00249575 0.0389742 0.0303561 +0.0070795 0.101453 -0.021277 +0.0291938 0.0754716 0.043989 +0.00502464 0.126695 -0.00649713 +-0.016158 0.0884114 -0.0380198 +0.0115883 0.102988 -0.0210311 +0.0576451 0.0661396 0.0235216 +0.0317192 0.118031 0.0171382 +-0.0116954 0.175688 -0.0223293 +0.00121183 0.0853285 -0.0350521 +-0.0158308 0.0883117 -0.038067 +-0.0686258 0.0846974 0.0427491 +0.00833511 0.0595736 -0.0302453 +0.0450509 0.0423962 0.0206492 +-0.027467 0.0793682 0.0471485 +-0.0679777 0.0716192 0.0360049 +-0.0718018 0.158195 -0.0399213 +-0.0114987 0.0856547 0.0572923 +0.0131441 0.0346685 0.0356066 +-0.0620328 0.156862 -0.0185851 +-0.0607717 0.113836 0.03657 +-0.0764751 0.146968 0.0421376 +-0.0207673 0.117009 -0.0138783 +0.0416942 0.0655359 -0.00371801 +-0.0306051 0.0524133 -0.0153638 +0.0107636 0.130209 0.0207729 +-0.0902734 0.133771 0.0282153 +-0.0235934 0.0383252 0.00311252 +-0.012672 0.0526484 -0.0327744 +-0.0309385 0.0622798 -0.0204312 +-0.0337803 0.122942 0.0251825 +-0.0598823 0.146825 0.0363335 +-0.0447526 0.0336781 0.00121434 +-0.0540428 0.0334293 -0.000440359 +0.0119421 0.123166 0.0332435 +0.0105328 0.103079 0.0462759 +-0.00696577 0.0389018 -0.00510709 +-0.033478 0.0632761 0.0395519 +-0.0386238 0.0519962 -0.0107523 +-0.0778526 0.159695 -0.0239243 +-0.0154805 0.109966 0.0416657 +-0.0688005 0.087996 -0.0171065 +-0.0428494 0.0999447 -0.0214282 +0.02441 0.101163 -0.0191142 +-0.0630974 0.160042 -0.0195595 +-0.0591899 0.154851 0.0254882 +-0.0694874 0.100005 0.0406788 +-0.063101 0.150495 -0.0266018 +-0.000774843 0.0783346 -0.0358957 +-0.0335129 0.112536 0.0351002 +0.00348618 0.11278 0.041408 +0.0454091 0.0918015 0.00517469 +-0.030521 0.0636541 -0.0224277 +-0.0564983 0.108415 0.0389345 +-0.0454982 0.045182 0.0420491 +0.0366564 0.089932 -0.0151793 +-0.00318743 0.0350129 0.0463208 +0.0397193 0.0787183 -0.00974279 +-0.0456155 0.165496 -0.00783315 +-0.0401614 0.110268 -0.0187071 +-0.0607836 0.171276 -0.0609166 +-0.0849643 0.0885105 -0.00254627 +0.000663768 0.131541 0.0142252 +-0.0773558 0.163115 -0.0213545 +-0.00442024 0.118937 -0.0140576 +0.029367 0.1045 -0.0146741 +-0.0767078 0.176155 -0.0445645 +-0.087862 0.117151 0.00226309 +-0.0674561 0.1652 -0.0559896 +0.0417828 0.101446 0.0181564 +-0.0504972 0.0465484 0.0414292 +0.0334855 0.0808915 0.0414362 +-0.0640951 0.0700461 0.0364211 +-0.0500004 0.121197 0.0329094 +-0.0640156 0.0344353 0.0303981 +0.0161688 0.0407187 0.0441528 +-0.0175288 0.165418 -0.0114925 +-0.0156111 0.0407209 -0.0274801 +-0.0136265 0.129395 0.0133241 +-0.060628 0.0588072 0.00794551 +0.0064803 0.0977098 0.0499318 +0.0439772 0.079046 -0.00278888 +0.0418428 0.0986036 -0.00180869 +-0.0225444 0.178667 -0.0133919 +-0.0606264 0.0336734 0.0105944 +-0.0434 0.0336807 -0.00215159 +-0.0886031 0.143176 0.0340326 +-0.0849284 0.107666 0.0223625 +0.0592303 0.0580467 0.0201933 +-0.0540206 0.147182 -0.0016614 +-0.00601913 0.126314 0.0306279 +-0.0686207 0.149674 -0.0393499 +-0.0919325 0.130933 0.0102425 +-0.0568299 0.143897 0.0319274 +-0.0354984 0.115235 0.0327878 +-0.0174958 0.0701523 0.0542792 +0.0270421 0.0862601 0.0462384 +-0.0488595 0.101383 -0.02158 +-0.0733679 0.152652 -0.0338969 +-0.0750934 0.159541 -0.00936327 +-0.0374543 0.155389 -0.00975319 +-0.0381729 0.166677 -0.0130206 +-0.087877 0.0990467 0.0233782 +-0.00160432 0.0405525 -0.0251988 +-0.0903048 0.139241 0.0221876 +-0.00139541 0.0385701 0.0219096 +-0.0221672 0.0839099 0.0558332 +-0.000827607 0.0389424 0.0289209 +-0.0177093 0.0385258 -0.00321073 +-0.0221552 0.169733 -0.0198584 +-0.0574718 0.156359 0.0101234 +0.0162407 0.0793143 -0.0294472 +0.0309621 0.0953572 -0.0169293 +-0.0167051 0.126576 2.44266e-05 +-0.0210968 0.161053 -0.00432438 +-0.0244887 0.100244 0.0443393 +-0.0637376 0.15365 0.0326508 +0.0154945 0.115387 0.0371086 +-0.0110238 0.098585 0.0502027 +-0.0466991 0.122484 0.0270727 +0.015569 0.110589 -0.0172093 +-0.0540772 0.146211 0.0253916 +0.0117081 0.0589891 0.0519593 +-0.0289244 0.033884 -0.0216457 +-0.08784 0.105023 0.0143674 +0.0262802 0.123151 0.0136687 +0.0122982 0.128768 0.0241985 +0.0428587 0.0803554 -0.00479839 +-0.0249679 0.0851951 0.0529639 +0.0259953 0.123127 0.0078705 +-0.000612836 0.0356605 0.0156316 +0.0462948 0.0820457 0.00817944 +-0.0179779 0.15947 -0.0103936 +-0.0237993 0.184341 -0.0145966 +-0.0300075 0.0337589 -0.0217484 +0.0233024 0.124378 0.00401489 +-0.0457643 0.0811616 -0.0200148 +-0.0786005 0.174957 -0.0470491 +0.00992987 0.0806149 0.0548353 +-0.036507 0.0464425 0.0402005 +-0.0229776 0.0681076 0.0472951 +0.0359077 0.111056 0.0244077 +-0.0691331 0.0612207 0.0112337 +-0.0653605 0.174136 -0.0490346 +-0.0246777 0.0366811 0.0541279 +0.00549638 0.115538 0.0397987 +-0.0512593 0.128575 -0.00377835 +-0.0227541 0.0889021 -0.0365754 +-0.052801 0.144689 0.0203903 +-0.0373724 0.0344314 0.0325332 +0.0302609 0.0461225 0.032895 +-0.0668934 0.119448 -0.00885989 +-0.0781478 0.107183 -0.00659237 +-0.0262448 0.109573 -0.0200299 +-0.0930011 0.116069 0.0193086 +0.0199447 0.104671 0.0430468 +-0.0902973 0.114585 0.00733567 +-0.0597131 0.0708022 -0.0154129 +0.011503 0.0909852 0.0534706 +-0.0601621 0.0433793 -0.00606772 +-0.0690356 0.068492 0.0314599 +-0.0662201 0.0390045 0.0360529 +0.0111444 0.104428 -0.02004 +-0.0620602 0.155611 0.00849054 +0.038029 0.105425 -0.00179734 +0.00952421 0.0346423 -0.0128865 +-0.0475328 0.0338333 0.0273813 +0.0275059 0.121239 0.00414409 +-0.0713739 0.162409 -0.0439557 +-0.0388285 0.0339925 0.000319116 +0.0209713 0.0966458 -0.0223043 +-0.0117867 0.0798822 -0.0383021 +-0.00231276 0.123919 -0.0094032 +-0.0623035 0.158393 -0.0375989 +-0.0498834 0.108435 -0.0190271 +-0.0450959 0.122461 0.0255697 +-0.086583 0.1077 0.0153543 +-0.0640141 0.128346 0.0443555 +-0.0910616 0.140621 0.0211716 +0.0222184 0.122028 -0.00352468 +-0.0197563 0.0685528 -0.0378978 +-0.0747315 0.0809443 -0.0125955 +0.0381487 0.056188 -0.00571384 +0.0310862 0.0808926 0.0432566 +-0.0418955 0.0336683 0.02694 +0.0454971 0.0861837 0.00419421 +-0.0515955 0.0575054 -0.00888629 +-0.0923422 0.120143 0.0302906 +-0.0388134 0.0900157 -0.0235053 +-0.0678286 0.139237 -0.00787376 +-0.0500776 0.136736 0.0219567 +-0.0524826 0.132311 -0.00383544 +-0.0725073 0.154019 -0.0378993 +-0.0164965 0.114086 0.0389356 +-0.0266334 0.0505574 -0.0257305 +0.0285947 0.0646316 0.0430307 +-0.050498 0.10288 0.0412159 +-0.0147348 0.0348101 0.0475803 +-0.0147627 0.0728806 -0.0387608 +-0.0425799 0.160887 0.00499665 +-0.0516371 0.0334814 0.00180973 +-0.0574972 0.0973516 0.04313 +-0.0294813 0.179959 -0.00726258 +-0.0696084 0.159782 -0.00738408 +-0.00175707 0.0783385 -0.0360812 +-0.0778906 0.0797955 -0.00863863 +0.0383322 0.0928141 0.0344469 +-0.0459579 0.0368224 -0.0202942 +0.0126438 0.130236 0.0157508 +0.0370668 0.109719 0.0231776 +-0.0650007 0.0600171 0.0167571 +-0.0294928 0.0931993 0.044345 +-0.0849548 0.0952071 0.0290738 +-0.0314917 0.0660582 0.0391556 +0.0283827 0.10475 0.0376855 +0.0125555 0.034405 -0.0178251 +0.0407099 0.0684593 0.0306869 +-0.0321086 0.163743 -0.0150961 +0.00529533 0.064011 -0.0326857 +0.0428516 0.0972538 0.000192155 +0.0475361 0.0451237 0.0241502 +-0.0188094 0.0382725 0.0240343 +-0.0242622 0.0650295 0.043001 +-0.0247852 0.0783802 -0.0377363 +0.0104929 0.0923225 0.0529394 +-0.0684671 0.140894 -0.00832284 +-0.013606 0.0435021 -0.0266802 +-0.0324058 0.05963 -0.0134049 +-0.0709313 0.156768 -0.044906 +-0.0794975 0.113845 0.0467655 +0.0215945 0.126233 0.0147739 +-0.0653369 0.0416124 0.0352199 +0.0546053 0.0733755 0.0137165 +-0.0893171 0.0996957 0.0173941 +-0.0835863 0.0817078 0.00050138 +0.029436 0.039931 -0.00313898 +-0.0614917 0.0661812 0.0332998 +-0.0923901 0.114734 0.0183133 +0.030053 0.0567138 -0.0167759 +-0.00342912 0.0915905 -0.0351346 +-0.0758824 0.100651 -0.0113429 +-0.0457293 0.0348843 0.042622 +0.00615023 0.0385922 -0.00780619 +-0.0547458 0.0768339 -0.0193157 +-0.0356142 0.0493225 -0.0125317 +0.024593 0.0345639 0.00705834 +-0.0892328 0.114145 0.0245988 +0.0348936 0.0586201 -0.0127038 +-0.0828513 0.138047 0.046826 +0.0569539 0.0508846 0.00918952 +-0.0797103 0.0711205 0.00752586 +-0.092065 0.118755 0.0273051 +-0.0103683 0.0388061 0.0306894 +-0.0431813 0.165147 -0.00997877 +-0.0813565 0.109598 0.0300528 +0.0477122 0.0511499 0.0301456 +-0.0678831 0.155252 0.000581516 +0.0349362 0.113582 0.0211925 +0.0280387 0.0549866 0.0403705 +-0.0615433 0.125505 0.042614 +0.0450739 0.0427888 0.00232236 +-0.0544975 0.121335 -0.0101688 +0.0117318 0.0833298 0.0539432 +-0.0144997 0.103011 0.0432504 +-0.0752992 0.149965 -0.0228671 +0.0196742 0.0686359 0.0495084 +-0.0394722 0.107013 0.0383007 +-0.0321381 0.0435397 -0.0289857 +0.0231687 0.0915577 0.0477207 +-0.0480905 0.156132 -0.00685995 +0.00882114 0.0589209 0.053036 +0.000540453 0.0731645 0.0574875 +-0.0842824 0.0818436 0.0235004 +-0.072066 0.0353469 0.00817017 +-0.0548518 0.122696 0.0382478 +-0.0283817 0.123518 -0.00261643 +-0.0178271 0.0855379 -0.0388455 +-0.00772146 0.0656018 -0.0354736 +0.0230836 0.12416 0.0238853 +-0.0125037 0.0730609 0.0559849 +0.0551355 0.0581678 0.0268835 +-0.0288448 0.124881 0.0180835 +-0.0566945 0.126945 0.0390945 +-0.0491155 0.0337431 -0.0125383 +-0.0100076 0.130157 0.0146359 +-0.0114787 0.0934019 -0.0350786 +-0.012503 0.0856552 0.057236 +-0.00822614 0.0384527 0.0224267 +-0.0288615 0.0353967 0.01735 +-0.035527 0.115134 -0.015836 +-0.085501 0.0791776 0.00851156 +0.0457594 0.0890174 0.0101642 +-0.0775133 0.126 0.0528602 +-0.0598229 0.0911123 -0.0198104 +0.0349018 0.0698502 -0.0158378 +-0.00371064 0.0641813 -0.0350983 +-0.0232497 0.0336668 -0.0221987 +-0.0337721 0.121485 -0.00843946 +0.0123855 0.0603174 0.0511841 +-0.0454994 0.0804154 0.0426755 +0.00893209 0.124393 0.0330753 +-0.00403191 0.0987119 0.0511654 +-0.0481285 0.0573264 0.0358964 +-0.0166099 0.0407431 -0.0277394 +-0.0440479 0.169839 -0.00695693 +0.0412738 0.0872408 -0.00977382 +-0.0604546 0.071762 0.0392488 +0.0529297 0.0581906 0.02898 +-0.0521631 0.138551 0.0244099 +-0.0366167 0.15106 0.000396988 +0.0417493 0.0611977 -0.0033567 +-0.070996 0.0683351 -0.00354604 +-0.0356709 0.0621736 -0.0130441 +-0.0170991 0.0383232 0.0225362 +-0.0487856 0.0573034 0.0351442 +0.022412 0.0372285 0.0333476 +-0.0249633 0.0931679 0.047071 +0.018008 0.0349409 0.0291289 +-0.0796085 0.154132 0.0271276 +-0.0406237 0.0336557 -0.0200198 +0.0169165 0.123099 -0.00667688 +0.0210051 0.0618768 0.0478546 +-0.0427644 0.0812202 -0.0203472 +-0.0672645 0.175508 -0.0482636 +-0.0639988 0.121381 0.0479339 +-0.0622266 0.158391 -0.0366041 +-0.0261802 0.161053 -0.0142499 +0.0186318 0.0821747 0.0516425 +-0.00531922 0.0961442 -0.0318294 +0.00250665 0.0341604 -0.0175888 +0.0167477 0.0563074 0.0486799 +-0.0106808 0.0555967 -0.0338825 +0.00925016 0.0724976 -0.0328208 +0.0123553 0.0552818 -0.0294499 +0.0212602 0.0735043 -0.0271352 +-0.0845249 0.129883 0.0501389 +-0.0764965 0.154899 -0.0050946 +-0.0621627 0.163132 -0.0395927 +-0.0144955 0.0701698 0.0547379 +-0.0084766 0.0489124 0.0500846 +-0.000135712 0.0381648 -0.0142912 +-0.0503963 0.1183 0.0322871 +-0.0761087 0.083292 0.0375324 +-0.0736943 0.094184 0.0404336 +-0.0691138 0.0763852 0.0387083 +-0.0290376 0.038297 0.000217512 +-0.0348553 0.0342935 0.020715 +-0.0220444 0.0384934 -0.0170721 +-0.0114987 0.0471911 0.0478612 +0.0375264 0.0714822 -0.0127977 +-0.0282394 0.087664 0.0462444 +-0.0757136 0.107486 0.0366393 +-0.0610115 0.134041 -0.00711168 +-0.0797372 0.0717415 0.00518109 +-0.0658978 0.147832 -0.0279808 +-0.00653882 0.110902 -0.0214831 +0.0296673 0.0591775 0.0410177 +-0.0217889 0.0696447 0.0502694 +0.0234089 0.0418644 -0.00766906 +-0.0364935 0.0888766 0.0431732 +0.0306541 0.0520995 0.0370911 +-0.060098 0.0687043 0.0366734 +0.0187338 0.0862153 -0.0273821 +-0.0839692 0.148747 0.00414299 +-0.0354821 0.0561791 0.038801 +-0.0481382 0.0376145 0.0455768 +-0.0676248 0.117206 0.0513943 +-0.0281854 0.174153 -0.0178233 +0.0359289 0.0386712 0.0221633 +-0.0256851 0.0824232 0.052338 +-0.0145953 0.0363242 -0.0264317 +-0.0303622 0.055196 -0.0183802 +-0.00165167 0.0525486 -0.0310164 +-0.0132125 0.168083 -0.022507 +-0.00949762 0.078776 0.0580091 +-0.0361357 0.127268 0.00216052 +0.048778 0.0525636 0.0299433 +-0.0256526 0.0520956 -0.0269974 +-0.0603733 0.0335628 0.0071663 +-0.0426157 0.035917 -0.0271302 +-0.0144999 0.162187 -0.0103051 +-0.0384864 0.0548303 0.0394681 +-0.0831442 0.107611 0.0263767 +-0.00111933 0.100971 -0.0229536 +-0.0548742 0.10693 -0.0184788 +-0.0218282 0.127027 0.00889322 +-0.0174982 0.111166 -0.0197324 +-0.0652616 0.0722487 0.0377992 +-0.0576238 0.145329 0.032529 +-0.0184507 0.117417 -0.0143314 +-0.081937 0.128034 -0.00496911 +0.0195332 0.12729 0.0154357 +-0.0293484 0.0705264 -0.0315108 +-0.00525979 0.0409541 0.0483014 +0.0555717 0.0706847 0.00515518 +-0.048428 0.0531039 0.036022 +-0.00279611 0.0826469 -0.0371795 +-0.0287124 0.0382592 0.00213562 +-0.0574984 0.0959784 0.0439666 +-0.091525 0.133725 0.0172151 +-0.016864 0.128415 0.0107007 +-0.0636978 0.164648 -0.0286005 +-0.0829735 0.127181 0.0515051 +-0.0488321 0.0956358 -0.0221459 +0.0400863 0.0899903 -0.0108207 +-0.0619683 0.12268 0.0437909 +0.0605435 0.0650981 0.0101416 +-0.0665542 0.169448 -0.0580509 +-0.0891009 0.0902275 0.0204481 +-0.0825815 0.112383 0.0454387 +0.0104883 0.0936688 0.0521003 +0.0142529 0.0765304 -0.0302113 +0.0165164 0.126586 0.0257514 +-0.0283423 0.118847 0.030216 +0.0142697 0.034212 -0.000289798 +-0.0478723 0.105599 -0.0198923 +-0.0739256 0.098177 0.0391323 +-0.049674 0.141672 0.0123895 +-0.0475977 0.15214 0.0100027 +-0.0424553 0.128377 0.00131486 +0.0224361 0.0645464 0.046427 +-0.0885609 0.087538 0.0184581 +0.0147132 0.0897404 -0.0290836 +-0.054132 0.143048 0.0274248 +0.00550441 0.0575487 0.0534334 +-0.0772682 0.155563 -0.0118971 +-0.0677628 0.079419 -0.0170759 +-0.0464924 0.159333 0.00779524 +0.0261579 0.0768253 0.0466356 +-0.0552963 0.0473377 0.0123212 +-0.0298441 0.0972531 -0.0235715 +-0.00563259 0.0974901 -0.0292726 +-0.0261993 0.095287 -0.0250572 +-0.0716941 0.0684125 -0.00254325 +0.00127365 0.0682996 -0.0335875 +0.0575871 0.0523587 0.0191771 +-0.00134429 0.0361889 0.0150058 +-0.0715096 0.1041 0.0379435 +-0.0921823 0.117455 0.0412015 +-0.0384872 0.0337149 -0.0296051 +-0.0287365 0.0475545 0.0479663 +-0.0257999 0.0422849 0.0537317 +-0.0230963 0.124618 -0.00175855 +-0.0924128 0.11471 0.0173177 +-0.00492025 0.0362041 0.048453 +-0.0186551 0.184576 -0.0164922 +-0.0802253 0.0772741 0.0285988 +0.0463015 0.0806481 0.0121762 +-0.0304105 0.0861968 -0.0305753 +-0.0346214 0.0348242 0.0450553 +-0.0652339 0.0355811 0.0395373 +-0.0788426 0.0825957 -0.0096075 +-0.0127163 0.038878 -0.00996632 +-0.0624916 0.166267 -0.0445898 +-0.0746075 0.156859 -0.0239292 +-0.0773753 0.161145 -0.0179242 +-0.0883931 0.1336 0.00326444 +-0.0661323 0.162373 -0.0581655 +-0.0510928 0.12386 -0.00885828 +-0.0384971 0.0705176 0.0419076 +-0.0723264 0.176481 -0.0540086 +-0.0271072 0.11707 -0.0138992 +-0.0591735 0.11954 -0.0102201 +0.0222809 0.11936 0.0323905 +-0.0302503 0.17123 -0.00702025 +-0.0809167 0.107332 -0.00361395 +-0.0627188 0.046051 0.00845692 +-0.00639449 0.0347093 0.0459249 +-0.0877048 0.0873692 0.00346654 +-0.0410427 0.15478 -0.00878846 +-0.069373 0.0655009 0.0252048 +-0.0270649 0.0689032 -0.0335294 +0.00976243 0.126251 0.030462 +-0.002483 0.114172 0.0414823 +-0.0532846 0.152692 0.0160461 +-0.0190668 0.12797 0.0127969 +-0.0645056 0.0818668 0.0436415 +-0.0144784 0.0645279 0.0535035 +-0.0598098 0.08825 -0.0201729 +-0.0614957 0.105649 0.0403113 +-0.0278003 0.174225 -0.00868668 +-0.0525152 0.0439969 0.0448982 +-0.00749319 0.0503553 0.0512463 +-0.0786706 0.0853441 -0.0105854 +-0.0447185 0.0709976 -0.0171011 +-0.0635722 0.0753573 0.0407707 +-0.0124985 0.0603974 0.0541523 +0.0344134 0.0655586 -0.0158419 +0.0196499 0.124334 0.0268969 +-0.0627763 0.0614875 0.0230054 +0.0416143 0.102832 0.00217563 +-0.0552881 0.147721 0.0283494 +-0.0143864 0.174216 -0.0192271 +0.0144149 0.0343798 -0.00603429 +-0.0101902 0.177186 -0.0254506 +0.0284808 0.120403 0.0230436 +-0.0149461 0.0384961 0.0282276 +-0.0778803 0.0710945 0.0220932 +-0.042083 0.168351 -0.00985967 +-0.056782 0.043535 0.0167171 +0.0143083 0.122234 -0.00973054 +-0.0266054 0.0916781 -0.031606 +-0.00249278 0.121064 0.0370013 +-0.0199096 0.0382242 0.00758286 +-0.0135056 0.0842656 0.0572305 +-0.0720125 0.148777 -0.0357596 +0.0251623 0.118606 -0.00580398 +-0.0618325 0.0334319 -0.000212632 +-0.0855476 0.136296 0.00125685 +-0.032605 0.0408975 -0.030074 +0.0426847 0.0986805 0.020158 +-0.00736899 0.0366982 -0.0162506 +0.00250252 0.0590979 0.0551087 +-0.0674921 0.106947 0.0382762 +-0.0289938 0.16114 -0.00164375 +-0.0509402 0.0584984 0.0315938 +-0.0350845 0.124972 -0.00417237 +-0.0686385 0.0435335 0.00569826 +0.0441509 0.0959467 0.0161545 +0.0131317 0.10725 -0.0189993 +0.0358259 0.0928903 0.0378885 +-0.0154981 0.060248 0.0524646 +0.0276762 0.118315 -0.00350857 +-0.0683312 0.0833327 0.042485 +0.033847 0.106899 -0.00922375 +0.048317 0.0466984 0.0256626 +-0.0570131 0.128126 -0.00643112 +-0.0788672 0.111379 -0.00271807 +0.0115311 0.122019 -0.0114981 +0.0275945 0.106191 -0.0144774 +-0.0591334 0.0584459 0.00677121 +-0.0780191 0.149419 0.0383262 +-0.0559631 0.0464314 -0.00541258 +-0.0192836 0.0894928 -0.0371367 +-0.033131 0.166707 -0.0157536 +-0.0495065 0.107045 0.0392662 +-0.073496 0.147014 0.0424214 +-0.0404833 0.111172 0.036485 +0.0284708 0.0565571 -0.0188308 +0.0511996 0.0711486 0.0227866 +-0.0681397 0.0738079 0.0376094 +-0.0905331 0.135117 0.0212107 +-0.0733037 0.155556 0.00591793 +0.0500217 0.0446984 0.00624267 +-0.00949805 0.0815484 0.0580308 +0.0211117 0.124199 0.0260136 +-0.0611133 0.149657 0.036321 +-0.0635959 0.153475 0.00125628 +0.0344187 0.0994578 0.0359067 +-0.0734442 0.163812 -0.0389777 +-0.0852938 0.0858468 -0.00152115 +-0.0559297 0.13815 0.0313829 +-0.0870302 0.13217 0.00132034 +0.0204036 0.0474506 -0.0212729 +-0.076548 0.0954614 0.0376104 +-0.0855527 0.153551 0.0192298 +-0.0729125 0.0928513 0.0411123 +-0.0404958 0.0478428 0.0400733 +-0.0121854 0.0980546 -0.0279084 +-0.0464966 0.108432 0.0393098 +-0.0177034 0.0569685 -0.0340386 +-0.0908687 0.135097 0.0172074 +-0.0862565 0.0846802 0.0214754 +-0.0297808 0.0348722 0.0494682 +-0.0764922 0.155931 0.0149956 +-0.0618119 0.115344 0.0386033 +-0.0487475 0.0767781 -0.0183253 +-0.0907804 0.150219 0.0191245 +-0.0524535 0.0335708 0.023045 +-0.0384946 0.0577019 0.0400515 +-0.074873 0.151297 -0.0278802 +0.00653661 0.120619 -0.0139577 +-0.0483957 0.0389613 0.0452757 +-0.0779524 0.165292 -0.0269536 +-0.0536531 0.0334694 0.00682116 +-0.0561549 0.118392 0.0380484 +-0.0201622 0.0337128 -0.0216346 +-0.0794073 0.0772395 -0.00557672 +-0.0135947 0.071631 0.0548042 +-0.0382622 0.0335792 -0.0232089 +-0.0183288 0.115615 -0.0164437 +-0.0507515 0.0768088 -0.0186854 +-0.0176367 0.181628 -0.0186063 +0.001434 0.0980064 0.0516014 +0.00449684 0.131467 0.00706378 +-0.0839655 0.111209 0.0317911 +-0.0769529 0.128149 -0.00749249 +0.0471199 0.0728094 0.00697834 +0.0460243 0.0737836 0.00392327 +-0.00149572 0.0505531 0.0529099 +-0.0431936 0.0363833 0.0440447 +-0.054345 0.151005 0.0266856 +0.00514071 0.12498 -0.00862525 +-0.0729614 0.112778 0.0490933 +0.0152498 0.0348445 0.0304622 +-0.0111539 0.0386404 0.0270766 +-0.0431779 0.113636 -0.0162215 +-0.0754447 0.164601 -0.0189193 +-0.0685657 0.0346013 0.0116976 +0.036686 0.110763 0.0218417 +-0.058015 0.128168 -0.00680186 +-0.0805084 0.121673 0.0499202 +-0.0750852 0.174913 -0.0410877 +-0.0394764 0.081876 0.0433844 +-0.01065 0.0383969 0.0147482 +-0.0236788 0.0551648 -0.029679 +-0.0207747 0.0728486 -0.0387932 +0.00733312 0.0553775 -0.0306811 +-0.0497252 0.137033 0.00342407 +-0.0650198 0.154365 0.0307072 +0.00051428 0.0383337 0.0225142 +-0.0625323 0.1568 -0.0366082 +-0.00383551 0.130671 0.00539431 +0.0310854 0.118732 0.00690653 +-0.0699388 0.131128 -0.00863643 +-0.023911 0.123885 -0.00309916 +-0.0495628 0.0402984 0.0453668 +-0.0639487 0.168098 -0.0606895 +-0.0706835 0.155594 0.0053992 +-0.0686442 0.156175 0.0235781 +-0.0572185 0.0575347 0.00867749 +-0.0788442 0.154658 0.0259054 +-0.0721793 0.15961 -0.0389315 +-0.0545051 0.119806 0.0369329 +-0.0254081 0.182912 -0.0140439 +-0.0729406 0.0676849 0.0243239 +-0.0353285 0.0851433 -0.0237512 +-0.0478735 0.104217 -0.0205651 +-0.0558395 0.0589131 -0.0044052 +0.0448613 0.0903726 0.0191701 +0.0576189 0.0719687 0.0133447 +-0.0511061 0.129858 -0.00316533 +-0.00880359 0.113633 -0.0183799 +-0.0618121 0.09105 -0.0190303 +0.0313027 0.114101 -0.00492854 +-0.042497 0.0874008 0.0424798 +-0.0508473 0.0970748 -0.0222124 +-0.0654906 0.102864 0.0410679 +-0.00458022 0.0347745 -0.0240516 +0.0553581 0.0524903 0.0236336 +0.00626754 0.071137 -0.0337471 +-0.0135115 0.118298 0.0374588 +-0.0604029 0.0342918 0.0295439 +0.0406411 0.0462159 0.0309092 +-0.0278584 0.0385169 -0.0108032 +0.0266728 0.0713177 0.0438181 +0.0101968 0.116422 0.0377394 +0.0446411 0.0959729 0.00816419 +-0.0597937 0.0334415 0.000190139 +-0.0210999 0.0811322 0.0562803 +-0.0474593 0.0559824 0.0367034 +0.0340242 0.115407 0.0165889 +0.0416569 0.0832977 0.0303966 +0.0340782 0.100772 0.035418 +-0.0604756 0.0747304 0.0414998 +0.0147905 0.128825 0.0208219 +-0.00109958 0.115152 -0.0180337 +-0.0237291 0.0650733 0.0438813 +-0.0261862 0.17712 -0.0185723 +-0.0381348 0.0338853 -0.0178771 +-0.0323789 0.115075 -0.0157884 +0.0168479 0.0856792 -0.0288312 +0.0383914 0.0390949 0.00219016 +0.0192558 0.0721931 -0.0285132 +-0.0837506 0.0776431 0.00349824 +0.00549734 0.0937843 0.053579 +0.0381875 0.10978 0.0131678 +-0.0707773 0.0822058 -0.016572 +-0.0623556 0.0337533 -0.00969501 +-0.0657944 0.0348418 0.0348835 +0.029813 0.0605585 0.0412449 +-0.067274 0.142559 0.0431983 +-0.00437946 0.039206 0.0351678 +-0.091267 0.130919 0.00823808 +0.056791 0.0717301 0.0086079 +-0.088725 0.0942104 0.00844208 +-0.0527517 0.076824 -0.0190661 +-0.075716 0.071204 0.0277224 +-0.0296574 0.175524 -0.0164728 +0.0201633 0.0535759 0.04656 +0.00320624 0.036422 0.0229702 +0.0192058 0.0834241 -0.02764 +-0.0918136 0.129556 0.00925121 +0.0276788 0.117119 0.0298812 +-0.0251464 0.0824617 0.0532115 +-0.0728771 0.154609 0.0294193 +0.00904539 0.03456 0.0402645 +-0.0534903 0.102908 0.0413848 +0.00940878 0.0389595 -0.0232113 +-0.0859627 0.109007 0.009354 +-0.0484951 0.0903851 0.0445307 +0.00263147 0.0345612 0.0425417 +-0.0770465 0.161776 -0.0174081 +0.0134975 0.104436 0.0449316 +-0.0388918 0.123217 0.0263098 +-0.0364947 0.112507 0.0349484 +-0.0629025 0.103986 -0.017642 +-0.0678178 0.0923118 -0.0167386 +-0.0689104 0.122371 -0.00889897 +-0.0255023 0.125351 0.00317915 +-0.000607228 0.0419595 -0.0248688 +0.0460131 0.0820178 0.0051921 +-0.0223034 0.0381733 0.0107634 +-0.0861005 0.10314 0.0243088 +-0.0674874 0.0958602 0.0421807 +-0.0538319 0.138205 -0.00152003 +-0.0199623 0.0624791 0.0486773 +-0.0187732 0.0946942 0.0521396 +0.0415957 0.0859827 0.0303559 +-0.0405006 0.0562797 0.0399754 +-0.0396087 0.0392284 -0.0278507 +-0.0203015 0.124709 0.0241059 +-0.0667178 0.127063 0.0492263 +-0.0727925 0.0893223 -0.0156729 +0.0370031 0.104683 0.029035 +0.0279524 0.103456 0.0388242 +-0.0186121 0.038597 0.0291868 +-0.0776508 0.152845 -0.000892884 +-0.0334818 0.0987718 0.0435747 +0.0329891 0.092935 0.0408139 +0.0391956 0.0712805 0.0337887 +-0.0631802 0.0590341 0.0144269 +-0.0537547 0.143134 0.0264016 +-0.0301924 0.153974 -0.00357072 +-0.0448379 0.0970765 -0.0217835 +0.00941817 0.0340541 0.000745803 +-0.0432126 0.168352 -0.00885275 +0.0554664 0.0549257 0.00120797 +-0.0225677 0.0932815 0.0503229 +-0.0524989 0.157892 0.00946562 +0.0390425 0.0953983 0.0320312 +0.04296 0.0817702 -0.00479044 +0.00635062 0.0510121 -0.0292209 +-0.0543105 0.149562 0.0267072 +0.0221931 0.100779 0.0445472 +0.0329366 0.0724958 -0.0177814 +0.0248886 0.114037 0.0344109 +-0.0550232 0.14424 -0.00134547 +0.0163915 0.04625 -0.0239163 +0.0177475 0.036867 -0.0166881 +-0.0617992 0.0867358 -0.0192812 +-0.0893599 0.133717 0.0406984 +-0.039718 0.0695625 -0.0162922 +-0.0089161 0.0389771 0.0326408 +-0.0245194 0.0879123 0.052427 +-0.0855508 0.0883229 0.0270467 +-0.0419398 0.0356984 0.00899705 +-0.0715816 0.0791203 0.0388191 +-0.0444898 0.0690526 0.0411578 +-0.070025 0.173518 -0.0406121 +-0.0628508 0.0981808 -0.0176907 +-0.0750322 0.144421 -0.00688246 +-0.0499825 0.0544896 0.033589 +-0.065333 0.177827 -0.0606985 +-0.0316114 0.123192 0.0229888 +-0.0760927 0.0805105 0.0361956 +-0.0370838 0.0486029 -0.013278 +-0.0785283 0.124553 0.0522615 +-0.0708435 0.0731956 0.0357937 +-0.0403104 0.0336344 -0.0180813 +-0.0609885 0.0628534 0.0274979 +-0.0323315 0.0624018 -0.0174393 +-0.0368547 0.100015 -0.0221726 +-0.0783796 0.172116 -0.0450441 +-0.0633655 0.139636 -0.00706655 +0.00173262 0.13137 0.0174841 +-0.0105091 0.0646847 0.0553841 +0.0266795 0.122765 0.0152477 +-0.0360635 0.034528 0.0238485 +-0.0541027 0.122637 0.0375656 +-0.0544908 0.0344999 0.0341095 +0.0176998 0.103348 0.0450658 +-0.0685644 0.145677 -0.0229009 +-0.0356468 0.0577276 -0.0110125 +-0.0696054 0.110911 0.0424293 +-0.0584669 0.0577494 0.0129387 +-0.0398029 0.0870085 -0.0218621 +-0.00967624 0.104885 -0.0231041 +0.00669982 0.0383228 -0.00932299 +-0.0609169 0.109692 -0.0160089 +-0.0646221 0.122809 0.0487379 +0.0174813 0.0865744 0.0503122 +-0.0067878 0.0386876 0.00254936 +-0.0628956 0.119461 -0.00917238 +-0.0404347 0.128451 0.0123721 +0.0304082 0.04464 -0.00596234 +0.00950687 0.0785812 0.0553914 +-0.0185636 0.161122 -0.00592394 +-0.0407009 0.066639 -0.0151117 +-0.0638844 0.0392942 0.0408356 +0.00208256 0.0392848 0.0328214 +-0.0891635 0.0901786 0.00945748 +-0.0714603 0.0390724 0.00325296 +0.0396909 0.105526 0.00119339 +-0.092918 0.118828 0.0342968 +-0.0809093 0.0912865 0.0336272 +0.0106278 0.12033 -0.0136749 +-0.079254 0.149169 0.0379325 +-0.0700516 0.177913 -0.0570165 +-0.0584973 0.0875674 0.0446281 +0.0363875 0.037641 0.0177175 +-0.0266625 0.178341 -0.0176816 +-0.0257516 0.0380733 0.00834253 +-0.0514727 0.147804 0.0154008 +-0.0475605 0.047528 -0.00960427 +0.0464078 0.0756596 0.0165703 +-0.0659757 0.132606 -0.00839654 +-0.0795255 0.0953936 0.0349279 +-0.0512091 0.118302 0.0328718 +-0.00441308 0.12096 -0.0123131 +-0.0322918 0.0358193 0.0288559 +-0.0907178 0.142015 0.0241681 +-0.0555193 0.152453 0.0283051 +-0.044345 0.152142 0.00768226 +0.0241695 0.0809229 0.0490966 +-0.0528659 0.0999263 -0.0216782 +-0.0669331 0.125307 -0.0088761 +-0.0303567 0.119073 0.029499 +0.025846 0.107916 -0.0143268 +-0.0617056 0.1325 0.0388812 +-0.0185965 0.0364224 -0.0275796 +-0.0207908 0.0384714 -0.00378381 +-0.0617181 0.0598008 0.019418 +-0.0474373 0.120726 0.0283448 +0.0366967 0.103968 -0.00783268 +0.0303183 0.0797251 -0.0205953 +-0.0317074 0.0436869 0.0496355 +-0.0623412 0.156794 -0.0356173 +-0.0765015 0.121776 0.0527715 +-0.0184879 0.122208 0.0309285 +0.0230909 0.103393 0.0423419 +0.0609018 0.0651278 0.0131549 +0.00916248 0.0355108 0.0268151 +0.0313289 0.0554154 -0.0147753 +-0.0025035 0.108652 0.0433127 +0.0546992 0.0478618 0.0141962 +-0.0620154 0.0689049 0.0360997 +-0.0388626 0.102809 -0.0208006 +-0.0555708 0.142434 0.0301615 +-0.0688026 0.146519 -0.0258522 +0.0194777 0.0878818 0.0491927 +-0.0228793 0.110931 -0.0194728 +-0.0324125 0.0849398 -0.0275574 +-0.0438855 0.03574 0.0440005 +-0.0917791 0.117463 0.0421754 +-0.0690116 0.129833 0.0494501 +-0.0743362 0.15411 -0.0219057 +-0.0638117 0.0867138 -0.0190744 +-0.045027 0.168395 -0.00690925 +0.0270479 0.080882 0.0462053 +-0.0114995 0.164138 -0.0150087 +-0.0325011 0.058955 0.0382451 +-0.0606931 0.0692955 -0.0138548 +-0.0566913 0.0572662 0.0137312 +-0.00649633 0.0488329 0.050181 +0.0223101 0.120965 0.030775 +-0.0805231 0.0993639 0.0329828 +-0.0644795 0.0959078 0.0429389 +-0.075154 0.17882 -0.048244 +0.00607351 0.0358936 0.0456569 +-0.035492 0.0648204 0.0410644 +-0.0576415 0.155076 0.0216791 +-0.0762945 0.152787 -0.0118902 +-0.00761327 0.0434711 -0.0261832 +-0.0814624 0.13163 0.0517276 +-0.0743185 0.067053 0.0192856 +-0.0842709 0.104792 0.000381661 +-0.0374161 0.12162 -0.0106267 +0.0282004 0.082909 -0.0218038 +-0.0538885 0.131144 0.0343613 +0.0268226 0.046511 -0.0137061 +-0.0500801 0.151654 -0.00422617 +-0.0843259 0.153929 0.0166903 +-0.0840259 0.124392 0.0498267 +-0.0906893 0.11752 0.0439252 +-0.0636773 0.162484 -0.0225185 +0.0362915 0.0534119 -0.00658438 +-0.0733102 0.0700068 0.0292571 +0.0432125 0.0858656 0.0273897 +0.0392299 0.108358 0.0101653 +-0.0357967 0.0383351 -0.00483874 +-0.0645865 0.0628123 -0.00359236 +-0.0838768 0.108986 0.0253683 +-0.0538875 0.139905 -0.00121756 +0.0463511 0.0764838 0.0150474 +0.0180384 0.119266 -0.0105437 +-0.0812898 0.0735018 0.0165324 +-0.0437426 0.076832 -0.018848 +-0.0489995 0.126854 0.0308899 +0.00913686 0.107291 -0.0199257 +0.0413467 0.0718054 -0.00779903 +-0.0407607 0.126285 -0.00553285 +-0.0564807 0.113914 0.0357075 +-0.0477527 0.149202 0.00972608 +-0.0737025 0.144377 -0.00986626 +-0.0237128 0.058121 -0.0313582 +-0.0884618 0.142054 0.0361609 +-0.00450592 0.0661541 0.056364 +-0.0448888 0.108464 -0.0189265 +-0.0531399 0.13506 -0.0028018 +0.0308728 0.114122 0.0296728 +-0.0120858 0.0382274 0.0182274 +0.045976 0.0820209 0.01617 +-0.0474955 0.0344671 0.0303636 +0.0116443 0.129846 0.0210966 +0.0429126 0.0775596 -0.00475805 +-0.0639176 0.122377 -0.00881224 +-0.0219078 0.0581082 0.0451165 +-0.0185957 0.118181 -0.0131167 +-0.0381658 0.165183 -0.0131497 +-0.0445045 0.0438483 0.042919 +-0.0464974 0.074738 0.042075 +-0.0819901 0.133862 -0.00285904 +-0.0633534 0.0445301 0.031682 +-0.0314905 0.0960436 0.0448087 +-0.0575997 0.0574661 0.0133658 +-0.0303698 0.154176 -0.00601441 +0.0133009 0.0666579 -0.0304883 +0.0108109 0.0819726 0.0543646 +-0.068057 0.178404 -0.0514469 +-0.0806807 0.0760273 -0.00253172 +0.0394926 0.0541437 0.0318453 +-0.00450121 0.0675415 0.056336 +-0.019491 0.0387907 0.0342254 +0.0147818 0.0631153 0.0511723 +-0.0291704 0.172664 -0.0174314 +0.0262968 0.070421 -0.0238548 +-0.0421212 0.159153 -0.0103433 +-0.0367588 0.172073 -0.0125043 +-0.0196292 0.117165 -0.0140584 +-0.042525 0.149193 0.00498605 +-0.0175612 0.186044 -0.0184493 +0.0221884 0.0973608 -0.0216774 +-0.0197019 0.0568866 -0.0331333 +-0.045504 0.0832988 0.0437099 +-0.0212803 0.0387041 -0.0133833 +-0.0770943 0.154164 -0.0118975 +-0.0484907 0.0833394 0.0445457 +-0.0238036 0.0798229 -0.0381557 +-0.0372926 0.0394674 -0.0291193 +-0.00273038 0.0683735 -0.0347173 +-0.0659296 0.14253 0.0416232 +0.0452769 0.0467388 0.0283148 +-0.0898014 0.11587 0.00528404 +0.0263587 0.0577877 0.0432503 +-0.0486968 0.067904 -0.0141574 +-0.0893812 0.113196 0.0217139 +-0.0841444 0.110242 0.00330414 +-0.0631329 0.17411 -0.0535854 +0.0348962 0.0387881 -4.46661e-05 +0.0431163 0.0888383 0.0261767 +-0.0444887 0.166716 0.00379579 +-0.0235591 0.0953745 -0.0271663 +0.0455985 0.0918132 0.00816712 +-0.0917403 0.12555 0.0418871 +-0.0890224 0.136404 0.0092064 +-0.0364114 0.175555 -0.00996795 +-0.0345906 0.0727451 -0.0199624 +0.0429111 0.040977 0.0196984 +0.00148534 0.0385845 0.0464325 +-0.0585016 0.0973698 0.0431908 +-0.0484982 0.0819185 0.0441136 +0.00821862 0.116409 0.0384227 +0.0456517 0.0413562 0.00923967 +-0.0769167 0.0873975 0.0382106 +-0.061867 0.101123 -0.0184855 +0.0202898 0.124676 0.0257091 +-0.0101432 0.130124 0.0117041 +-0.0138894 0.183111 -0.0237643 +-0.0707552 0.0792696 -0.0152786 +0.0465284 0.0761532 0.0136843 +-0.0888827 0.140531 0.0122011 +-0.0659605 0.110851 0.0377691 +-0.0638988 0.109582 -0.0144399 +0.0445103 0.0541956 0.0324876 +-0.0545376 0.0335773 0.0172858 +0.0156666 0.0726831 0.0525311 +-0.0224929 0.0448955 0.0530527 +0.00250097 0.0897336 0.0558646 +-0.0427601 0.128938 0.0129983 +-0.0749067 0.100837 0.0372176 +0.0100662 0.0792875 0.0550109 +0.031592 0.0738009 -0.0197207 +-0.0295595 0.111353 -0.0178807 +-0.0265381 0.155425 -0.00506198 +0.0110253 0.0793101 0.0546505 +0.0455932 0.0834007 0.019176 +-0.00963497 0.0389293 -0.00939263 +-0.0740278 0.157006 -0.00316778 +0.026879 0.121193 0.00250168 +-0.0840153 0.1376 0.000355984 +0.00144074 0.0344391 0.0153316 +-0.062494 0.0746373 0.0407954 +-0.0714338 0.100882 0.0394174 +-0.0511894 0.0558131 0.0154354 +0.0142545 0.0887312 0.0523539 +-0.0217647 0.0699552 -0.0378816 +0.042865 0.0958458 -0.000810373 +-0.0225278 0.18149 -0.0200273 +-0.0516224 0.0545433 -0.00792825 +-0.0894416 0.0943032 0.0194238 +-0.0450754 0.033637 -0.0171737 +-0.0189216 0.122512 -0.00768052 +-0.0278603 0.101566 -0.0234492 +0.0273313 0.094554 -0.020088 +-0.0568394 0.145329 0.0319256 +0.0299199 0.11779 -0.000781916 +0.0345811 0.0368089 0.0162808 +0.0130795 0.0927597 -0.0282037 +0.0239979 0.0768543 0.0488301 +-0.0560741 0.15232 0.0295584 +-0.0713082 0.165213 -0.0459899 +0.0214853 0.0948038 0.0473574 +-0.0124976 0.0472007 0.0479814 +0.0101747 0.096292 -0.0259611 +-0.0424942 0.0916602 0.0426604 +-0.000674255 0.10997 -0.0204918 +-0.0731036 0.0721584 0.0326952 +-0.0863191 0.0806349 0.0164939 +-0.0174959 0.0984963 0.0451272 +-0.0516134 0.0334804 0.007228 +0.0210892 0.0521114 0.044364 +-0.0767842 0.155599 0.0119802 +-0.0737106 0.0699801 -0.00251138 +0.0277999 0.0727164 0.0436883 +0.0605691 0.0637105 0.0171755 +-0.0720961 0.156364 0.000513559 +-0.0818934 0.154016 0.0102104 +-0.0184806 0.169783 -0.0146335 +-0.073631 0.173473 -0.03767 +-0.0385075 0.0888951 0.0435504 +-0.056184 0.0374619 -0.0105738 +-0.0164629 0.0616668 0.0525376 +-0.0214965 0.0525299 0.044709 +-0.0324599 0.0722556 -0.0254696 +-0.0781568 0.167257 -0.0305864 +-0.0633087 0.117017 0.0436447 +-0.084428 0.138004 0.0455627 +0.0287818 0.0480764 -0.0117305 +-0.0706135 0.175903 -0.0451833 +-0.0430742 0.0335089 -0.0222312 +0.0203664 0.0506236 -0.0244327 +-0.0807714 0.153393 0.00628177 +-0.0784635 0.138605 0.0489019 +-0.0754126 0.068174 0.019879 +-0.0105025 0.0773598 0.0576687 +-0.0399608 0.0418525 -0.0253044 +-0.0880973 0.137764 0.00820327 +-0.0862825 0.106347 0.0193454 +-0.0114851 0.123708 0.0326887 +-0.00700917 0.0348727 0.042072 +-0.0760973 0.0851761 -0.013541 +0.0421377 0.0912242 0.0276147 +0.0298218 0.119509 0.00500708 +-0.0550443 0.148674 -0.00204704 +-0.0107558 0.0386486 -0.0149703 +0.00849857 0.118254 0.0373924 +0.0373294 0.0848074 0.0364738 +0.0506886 0.0511228 0.0274131 +-0.0538924 0.106961 -0.0186698 +-0.0735555 0.105459 0.0371635 +-0.0532563 0.0343869 0.0309731 +-0.015483 0.0938222 0.0546278 +0.0454513 0.052559 0.0321398 +0.032601 0.100801 0.0367685 +-0.0688527 0.142579 0.0444582 +-0.0908832 0.150197 0.0161314 +-0.0811312 0.129963 0.0524484 +0.00846909 0.111301 0.0401143 +-0.0622744 0.0344133 0.0342699 +-0.0343155 0.0340522 0.0192395 +-0.0869096 0.111745 0.0223587 +0.0507656 0.0446256 0.0152142 +-0.0767707 0.151403 -0.00690852 +-0.00150011 0.103045 0.0440564 +-0.051019 0.147224 -0.00224048 +-0.025918 0.122982 0.0235755 +-0.0527617 0.0461943 0.0216742 +-0.0178184 0.0841429 -0.0390768 +-0.0345091 0.0461323 0.043875 +-0.0623881 0.149093 -0.0125752 +-0.0809179 0.0761444 0.0241516 +-0.00945917 0.175708 -0.0257473 +-0.0334992 0.0704401 0.0410454 +-0.0886682 0.141939 0.0121971 +-0.0120612 0.0383071 0.0127308 +-0.0853843 0.0980412 -0.000554198 +-0.0325205 0.0646875 0.0393461 +0.0503466 0.0615208 -0.00363326 +0.00449283 0.103624 -0.0217086 +-0.0698084 0.085099 -0.0171261 +0.0438316 0.0832073 0.0263179 +-0.0486418 0.0576652 -0.0108452 +0.0123248 0.0609207 -0.0293142 +0.0429772 0.0902337 -0.00478341 +-0.0619824 0.166238 -0.0535924 +0.0140441 0.0406072 0.0445814 +0.00249558 0.116934 0.0396534 +0.018473 0.0989902 0.0468145 +-0.0169827 0.0385945 -0.00497776 +0.0309161 0.0955754 0.0413413 +-0.0735982 0.110276 0.0438156 +-0.0903629 0.11521 0.0252935 +-0.0566835 0.124286 -0.00724626 +-0.0620082 0.134045 -0.00734981 +0.00521493 0.0852237 -0.0334342 +-0.0903999 0.124268 0.0448512 +0.0114719 0.1182 0.0365719 +0.0344326 0.0414166 -0.00330414 +-0.0403754 0.124077 -0.00919956 +0.0484547 0.0702338 0.00359645 +-0.0285016 0.113902 0.0349068 +-0.0526285 0.0596472 0.0276152 +-0.0325191 0.174119 -0.0148634 +-0.0204902 0.108532 0.041306 +0.010276 0.076623 0.0552854 +0.0133781 0.0537725 -0.0285433 +0.0402901 0.0698645 0.0318359 +0.0401742 0.0671588 0.0316675 +-0.0866887 0.120341 0.0484058 +0.0245253 0.0875975 0.0479106 +-0.050498 0.0890212 0.0452499 +-0.0598028 0.0853759 -0.0202992 +0.0354525 0.106753 -0.0069512 +0.0111874 0.0630268 0.0529412 +-0.0416003 0.12872 0.00602836 +0.0443487 0.0533892 -0.00643258 +-0.0229394 0.0985982 0.0448104 +-0.0678177 0.0894605 -0.0172539 +-0.0826703 0.0762102 0.00250991 +-0.0152189 0.172708 -0.0246075 +-0.0748382 0.0978559 -0.0133191 +0.0284295 0.0955564 0.0430179 +-0.04802 0.136068 0.0153684 +-0.0475691 0.0489734 -0.00936479 +-0.0813576 0.0734641 0.0155425 +-0.07594 0.14997 -0.0178724 +-0.0649871 0.152354 -0.0372683 +-0.0229947 0.122243 0.0275866 +-0.0108296 0.0855471 -0.0384547 +-0.0447583 0.0336472 -0.00973579 +-0.041838 0.0942787 -0.0228038 +-0.038857 0.101401 -0.0214118 +0.00839351 0.0342854 -0.0184828 +0.0436422 0.0748109 -0.00280304 +0.00409443 0.101828 -0.021842 +-0.0194474 0.054231 0.0477027 +0.0410346 0.0752467 0.03121 +0.0588047 0.0677091 0.00614939 +0.021598 0.10091 -0.0208238 +-0.0696323 0.156261 0.0232204 +-0.086966 0.0846591 0.00747852 +-0.0660124 0.176151 -0.0507054 +0.0425261 0.101486 0.00616657 +0.0305131 0.0418181 0.0291512 +-0.0554982 0.113948 0.0354054 +-0.0763852 0.108818 0.0389983 +-0.0785959 0.152697 0.00118419 +0.0184567 0.127794 0.00934393 +0.0105917 0.043143 0.0448676 +-0.0719858 0.0346482 0.00381826 +-0.0341243 0.0335931 -0.0280196 +-0.0564439 0.115317 0.036137 +-0.0928438 0.126838 0.0112559 +-0.0661071 0.164936 -0.0219713 +-0.0665376 0.142546 0.0425061 +-0.0167827 0.0388081 0.0329676 +-0.0614351 0.156032 0.020314 +0.0388231 0.106965 0.0221712 +0.0247856 0.0449735 0.0390757 +-0.0324984 0.0788891 0.0412743 +-0.068331 0.155325 0.0280685 +0.0267262 0.114038 0.0335472 +-0.0888783 0.111909 0.0103621 +-0.0772308 0.0920788 -0.012603 +0.0457689 0.0431024 0.0219801 +0.0474981 0.0737139 0.0139878 +-0.061487 0.0746791 0.0411579 +-0.0861526 0.148758 0.00721004 +0.0341879 0.0913684 -0.0166968 +-0.0200728 0.100101 -0.0240875 +-0.0286491 0.125506 0.0152069 +-0.0268606 0.0378639 0.0137313 +-0.0352216 0.0346633 0.0327857 +-0.0444613 0.12936 0.0182577 +0.0373383 0.0740435 0.0363986 +0.00751373 0.0869673 0.0561316 +-0.0888328 0.0942898 0.0224093 +0.00897858 0.127106 -0.00499333 +0.0363106 0.0994119 0.033375 +-0.0448194 0.0913346 -0.0221278 +0.000368669 0.0466323 -0.0286891 +-0.0606782 0.0639978 0.0300882 +-0.0735086 0.078138 -0.0125733 +-0.0358361 0.11045 -0.0189078 +0.0300578 0.0632721 0.0416198 +0.0173543 0.0349384 0.0362289 +-0.0104845 0.10863 0.0429333 +-0.0265155 0.115287 0.0336658 +0.0257868 0.0967214 -0.0203669 +0.0255714 0.119263 0.0291067 +-0.0404457 0.119913 -0.0128413 +-0.0596429 0.0622343 0.0265494 +-0.0522074 0.122732 -0.00965468 +0.00419216 0.0340885 -0.0190827 +-0.0614977 0.108395 0.0385563 +-0.0154933 0.0392591 0.0382209 +0.0568425 0.0592039 0.0011688 +0.033494 0.0619462 0.0395497 +0.0378948 0.0699732 0.0354084 +-0.0643687 0.155314 0.00767719 +-0.017163 0.124753 -0.00408239 +-0.0892062 0.128127 0.00426293 +-0.058497 0.101559 0.0426268 +-0.00170163 0.130406 0.0219933 +0.0258358 0.123453 0.0120756 +0.0200283 0.102079 0.0449293 +-0.0034976 0.0965806 0.0535793 +-0.0805988 0.090913 -0.0086158 +0.0307316 0.091606 0.0428217 +0.0293141 0.095566 0.0425395 +0.011103 0.0779768 0.0547588 +-0.0912353 0.14886 0.0211316 +0.0484812 0.0443317 0.021366 +-0.00581925 0.0868408 -0.0369183 +-0.0454559 0.0902978 0.0432333 +-0.0346794 0.119765 -0.0106544 +-0.00349323 0.113677 -0.0184484 +-0.0434907 0.101526 0.0420227 +-0.0385061 0.0986889 0.0419871 +-0.0599081 0.112539 -0.0152225 +-0.0242322 0.124794 -0.000701199 +0.0400813 0.104202 0.0221684 +-0.0828121 0.0830332 0.030132 +0.0159137 0.128436 0.00413586 +-0.0645186 0.0597262 0.00993302 +-0.0324512 0.0353306 -0.0309147 +-0.0484861 0.137101 0.00939484 +-0.0304745 0.0860755 0.0433189 +0.0188415 0.121733 -0.00718615 +-0.0643746 0.145275 -0.0151376 +0.0208541 0.11855 -0.00976629 +0.037465 0.0434297 0.0291248 +0.0517879 0.0461689 0.0072143 +-0.0837871 0.0829476 0.0282971 +-0.0917215 0.129668 0.0302355 +-0.0261628 0.0674202 -0.0335157 +-0.0631555 0.156855 -0.014582 +0.043463 0.077603 -0.00378219 +-0.0602407 0.058232 0.0121428 +-0.0458636 0.102811 -0.0213024 +-0.038884 0.108506 -0.019659 +-0.0705258 0.142815 0.0451961 +-0.0781039 0.070111 0.0193756 +-0.0758474 0.109198 0.0406016 +-0.0318501 0.0986369 -0.02282 +-0.038215 0.0471675 -0.018189 +-0.0134374 0.0516868 0.0502089 +0.0151412 0.0754034 0.0535569 +-0.043493 0.105703 0.0408668 +-0.0822959 0.0773319 0.0228488 +0.0452717 0.0903987 0.0151606 +0.0159567 0.120613 0.0338084 +-0.0623049 0.142641 -0.00633906 +0.000467241 0.105823 0.0432483 +-0.0177409 0.0671746 -0.0379913 +-0.0891252 0.0889064 0.0184472 +-0.0678748 0.125664 0.0510849 +-0.0337468 0.127104 0.0118588 +-0.0518684 0.102767 -0.0207881 +0.00221584 0.0364728 0.00081639 +-0.0296253 0.0759773 0.0411397 +0.00226876 0.0682822 -0.0333186 +-0.0542457 0.0574384 0.01981 +-0.0659991 0.136994 -0.00799651 +-0.00357593 0.127459 -0.0052112 +0.0103564 0.0538895 -0.0297771 +0.0272815 0.0718243 -0.0235929 +-0.0123281 0.0344052 -0.018857 +0.0416155 0.0404142 0.0199255 +-0.0106878 0.0598858 -0.0348312 +-0.0305006 0.116618 0.0322439 +0.0427332 0.084569 0.0284544 +-0.0712328 0.151001 -0.0437008 +0.0423623 0.0944394 0.0261744 +-0.000687654 0.0583509 -0.0327859 +-0.0779789 0.136876 -0.0051311 +-0.0657518 0.0780369 -0.0174491 +-0.0789069 0.155396 0.0141592 +-0.0701046 0.156748 -0.048906 +0.0281353 0.0593598 -0.0207767 +-0.066567 0.147777 -0.0287654 +-0.0167976 0.0383562 0.00264497 +-0.0708835 0.160996 -0.0449446 +0.0230988 0.111339 0.037076 +-0.0237033 0.091176 -0.0348871 +-0.0477118 0.073839 -0.0167643 +-0.0540526 0.0334248 -0.00589512 +-0.0535445 0.0389126 -0.0111352 +0.00251277 0.0675114 0.055914 +-0.0324736 0.0532348 0.0372028 +-0.0416459 0.056333 -0.0114534 +-0.0460476 0.0363198 0.0451262 +-0.0215027 0.163915 -0.00845889 +-0.0530817 0.139518 0.0266624 +-0.00971954 0.0656257 -0.0358484 +-0.0175293 0.038199 0.0153321 +-0.0388176 0.128112 0.00411022 +-0.0579212 0.120852 -0.00959233 +-0.0215953 0.03793 -0.0285032 +0.00849245 0.0473031 0.0488481 +-0.045123 0.157633 -0.00869072 +-0.0845016 0.0911794 -0.00456302 +-0.0130394 0.0384127 0.00153612 +-0.0054932 0.111405 0.0422861 +-0.00614297 0.0385457 0.0227705 +-0.0588822 0.108299 -0.017343 +-0.0647452 0.0766241 -0.0174472 +0.0333079 0.0768384 0.0411622 +-0.0345058 0.0704863 0.0415356 +-0.00385823 0.0988046 -0.0266644 +-0.0940576 0.125561 0.0242759 +-0.0406606 0.156554 0.00601794 +0.0458479 0.0724092 0.00333418 +-0.0536298 0.0345249 0.0429297 +0.0422446 0.0760949 -0.00580476 +0.0305908 0.106106 0.0356297 +-0.0744956 0.13026 0.0524093 +-0.060795 0.0853339 -0.0197774 +-0.0659276 0.123847 -0.00897257 +-0.0587952 0.0334058 0.000425547 +-0.0355002 0.111108 0.0360398 +0.0106562 0.0589179 0.0524466 +0.0220342 0.108737 -0.0152173 +0.0414017 0.104253 0.00516521 +-0.0487319 0.132909 0.0254731 +-0.073147 0.0648981 0.0178865 +-0.0655672 0.149686 0.0379738 +-0.0866855 0.14466 0.00818677 +-0.0690156 0.163795 -0.0519803 +0.0474899 0.0664975 0.0274045 +-0.0693729 0.175081 -0.056043 +-0.0811978 0.140383 -0.00182247 +-0.0609117 0.111106 -0.0154828 +-0.027448 0.125478 0.0053817 +-0.0601827 0.0460596 0.0101722 +-0.0116048 0.0377441 -0.0259987 +-0.0623577 0.147557 -0.00658086 +-0.0635933 0.167459 -0.0411888 +-0.0420303 0.153306 -0.00761985 +0.0045298 0.102977 0.0440255 +-0.0571296 0.124118 0.0402058 +-0.010491 0.0487865 0.0492904 +-0.00149595 0.0911539 0.0561263 +-0.0644925 0.0903995 0.0447493 +-0.0621097 0.156825 -0.0345957 +-0.0626845 0.0455625 -0.000282658 +-0.054778 0.0344845 0.0375447 +-0.0704967 0.156763 -0.0469167 +-0.0501084 0.0429877 0.0445637 +-0.074873 0.120838 -0.00772479 +0.0354301 0.112103 0.00127449 +-0.0218649 0.103029 -0.0235712 +-0.09096 0.148814 0.0141536 +-0.0645626 0.0459512 0.00669838 +0.0314584 0.111437 -0.00809824 +-0.022876 0.0362943 -0.0189473 +-0.0428901 0.0435976 -0.0193145 +-0.0746823 0.0663852 0.00625465 +-0.0476209 0.0547841 -0.0103184 +-0.0197585 0.171251 -0.0147167 +-0.0705035 0.0901829 0.0418541 +0.0494272 0.0628335 -0.00296645 +0.0266028 0.105322 -0.0155495 +0.0202061 0.126966 0.0100746 +0.013717 0.127103 0.0275992 +0.00956448 0.122301 -0.0117968 +-0.0846111 0.084433 -0.00253466 +-0.0889485 0.13651 0.0272017 +-0.000398103 0.0385343 0.0221462 +0.0428913 0.0402636 0.016655 +-0.0531156 0.156084 -0.00339606 +-0.0586999 0.141645 -0.00399496 +0.0175889 0.0549386 0.0481228 +0.0242735 0.0576737 -0.0247443 +-0.0435028 0.0548283 0.0392794 +-0.0509876 0.0343016 0.0280109 +-0.0371778 0.128019 0.00618657 +-0.067159 0.152634 -0.0476967 +-0.0524481 0.115128 -0.0157418 +-0.00787248 0.0390234 0.0328097 +-0.0368889 0.109941 -0.0191779 +0.0473251 0.0497353 0.0295737 +-0.0155015 0.10721 0.0425067 +-0.0607907 0.0609394 -0.0015406 +0.0214998 0.0358071 0.0181694 +-0.0152794 0.114388 -0.017154 +-0.0618553 0.153745 -0.0235803 +-0.00541506 0.100313 0.0476265 +0.0438051 0.0987511 0.0101628 +-0.0274965 0.0973724 0.0435854 +0.0448746 0.0601039 -0.00424277 +0.031559 0.0460718 0.0312637 +-0.0615188 0.0448284 0.0115308 +-0.0397761 0.115072 -0.015742 +-0.0918654 0.131039 0.0272344 +-0.0646035 0.156332 -0.00986181 +0.0383993 0.0413521 -0.00190432 +-0.026722 0.0386646 -0.0162927 +-0.0736148 0.0995067 0.0387799 +0.006499 0.119638 0.036869 +0.0405971 0.101404 0.0241737 +-0.0944613 0.121476 0.0212834 +-0.0105851 0.0337493 -0.0235512 +-0.0799934 0.136838 -0.00393652 +0.0529009 0.0462649 0.0122044 +-0.0539028 0.11125 -0.0176614 +0.00874316 0.130156 0.0228898 +0.0260633 0.114349 -0.00924148 +0.0113837 0.0449118 -0.0251572 +-0.0461015 0.150679 0.0086365 +0.00236523 0.128663 -0.00254763 +-0.0158845 0.0910066 -0.0366604 +0.0456174 0.0890068 0.0121612 +-0.0634393 0.144588 -0.0113838 +0.0175304 0.120577 0.0333463 +-0.0256229 0.0463679 -0.0270847 +-0.0606463 0.0343588 0.0329219 +-0.0622926 0.149098 -0.0115749 +-0.0266239 0.0463597 -0.0270834 +0.0142234 0.0864184 -0.0301272 +-0.0242795 0.0383175 -0.000652306 +-0.0599506 0.0340585 0.0228145 +-0.031899 0.0595768 -0.0154053 +0.0335035 0.0686838 0.0396083 +-0.00350655 0.105885 0.0441283 +-0.00849376 0.0576353 0.0542501 +-0.0596861 0.0693591 -0.0143393 +-0.0246408 0.0382637 -0.00251941 +0.0142384 0.0723592 -0.0308856 +0.0360996 0.112682 0.0101589 +0.00650478 0.0989998 0.0481043 +-0.0406764 0.0344836 0.0353061 +0.0208126 0.114503 -0.0133998 +-0.0664042 0.0385079 0.0306689 +-0.00851871 0.0471234 0.047663 +-0.0607941 0.143953 0.0367655 +-0.0469959 0.06153 0.0374819 +-0.0566078 0.0521283 0.00668717 +-0.0117953 0.0827249 -0.0387188 +-0.0651684 0.0346977 0.0334093 +0.0334291 0.0781951 0.0413414 +-0.00319773 0.0384234 0.00715593 +-0.0255204 0.115294 0.0339151 +-0.070852 0.100833 -0.0142398 +-0.0647775 0.0824087 -0.0188685 +0.0351918 0.0673501 0.0385292 +-0.0201767 0.0929008 -0.0346271 +-0.0292631 0.0351386 0.0510616 +-0.0487306 0.0345868 0.0335095 +-0.0909618 0.13376 0.0242167 +-0.0399614 0.0343338 -0.0130933 +0.0409886 0.0643095 0.0292691 +-0.0656099 0.0655077 0.0295065 +0.0113576 0.0509388 -0.0282254 +-0.0831709 0.101988 -0.00359129 +-0.0345055 0.113874 0.0339275 +0.0308648 0.0460986 0.0320207 +-0.023595 0.180085 -0.0196757 +0.056025 0.0493916 0.0151904 +-0.0805557 0.0977534 -0.00758611 +0.0084218 0.0346373 0.0418695 +-0.0774116 0.159696 -0.0249188 +0.0602932 0.0636878 0.00814035 +-0.0302474 0.125253 0.00290344 +-0.0741812 0.074527 0.0339368 +-0.0636646 0.15831 -0.045603 +-0.0332687 0.15271 -0.00392746 +0.0267163 0.0450608 -0.00869474 +0.0351226 0.0921155 -0.0154837 +-0.0278275 0.158128 -8.54892e-06 +-0.0771542 0.152814 -0.00588992 +0.00726262 0.0682112 -0.0321527 +-0.0590296 0.0424919 -0.00727859 +-0.0604873 0.0987275 0.0428004 +-0.0916073 0.128323 0.0352449 +0.0474407 0.0661575 -0.000283122 +0.03984 0.106962 0.00517391 +-0.0609078 0.155801 0.00889681 +-0.00849418 0.114178 0.0409373 +0.00894357 0.0819404 0.0551438 +-0.0767684 0.0756527 -0.0076025 +-0.0670227 0.0607355 0.00842954 +-0.0186908 0.0510113 -0.0307584 +-0.0706351 0.0733936 -0.01149 +-0.026674 0.0382695 0.00254021 +0.0585127 0.0649229 0.00410871 +0.0241246 0.0605253 0.0453245 +0.0172623 0.073643 -0.0290458 +-0.0564969 0.111123 0.0367634 +0.0543584 0.0674371 0.0258007 +-0.0511173 0.128308 0.0330935 +-0.075231 0.151315 -0.0248804 +-0.0492462 0.132382 0.000177088 +-0.0694944 0.11756 0.0525327 +-0.0721635 0.113702 0.0503204 +-0.0647819 0.0809531 -0.0185144 +0.00336694 0.130688 0.00234495 +0.0243671 0.0699418 0.0457082 +-0.000607851 0.0448652 -0.0263872 +-0.0506782 0.141637 0.0173818 +-0.0618089 0.0881716 -0.0191682 +-0.0886021 0.087516 0.0174642 +0.011433 0.034701 0.0261941 +-0.0405676 0.171048 0.000226569 +0.0111139 0.110132 -0.0191278 +0.0136046 0.121889 0.0339065 +-0.0107442 0.0742291 -0.0379783 +0.0438711 0.0959127 0.00218342 +-0.0299153 0.155169 -0.001314 +-0.0469317 0.0369443 -0.0162782 +-0.0887949 0.142048 0.03516 +-0.0459209 0.0346888 0.0375199 +-0.0022788 0.119988 -0.0131916 +0.00522675 0.0768423 -0.034472 +-0.0277078 0.0725313 -0.0348614 +-0.0679296 0.125304 -0.00887173 +-0.0528849 0.101359 -0.0212107 +0.0356786 0.076967 -0.014745 +-0.0567974 0.0854612 -0.0213212 +0.00206285 0.121236 -0.012553 +-0.0659186 0.159142 -0.0118027 +-0.0857862 0.0939971 -0.00056361 +-0.0318889 0.124978 0.0199371 +0.0110379 0.0712445 0.0546046 +-0.043282 0.147753 0.00390043 +0.0142589 0.0737441 -0.0304465 +-0.037534 0.168232 0.00175297 +0.0421124 0.0467315 0.0307997 +-0.0195242 0.0336044 -0.023287 +-0.0581683 0.0606896 -0.00283185 +-0.0892904 0.149814 0.024685 +-0.0328117 0.0335416 -0.0258378 +-0.0534094 0.150878 0.0234093 +0.0224588 0.120521 -0.00588511 +0.0297724 0.0549903 0.0393628 +-0.0689711 0.136995 -0.00816407 +0.0327608 0.11383 -0.00261931 +-0.0138771 0.164812 -0.0186885 +0.00401259 0.0341521 0.00329327 +-0.0776837 0.154812 0.0263001 +-0.0617213 0.0781294 -0.0185002 +0.0405341 0.105626 0.00416435 +-0.033143 0.157873 -0.0118064 +-0.0244152 0.0723023 0.0471532 +0.000983167 0.0373381 0.00163376 +-0.0227666 0.126779 0.0143916 +-0.0151278 0.128803 0.00988702 +0.000514565 0.0717586 0.0570729 +0.0202169 0.0591906 0.0484605 +-0.0591321 0.0334434 -0.0069378 +-0.0338188 0.0345795 0.040191 +-0.000499113 0.11695 0.0400287 +-0.0463678 0.13079 0.00400616 +0.0171482 0.0349466 -0.009792 +-0.064905 0.0607648 0.0196679 +-0.0624362 0.150651 -0.0105777 +-0.0354607 0.154847 -0.00919588 +-0.0211471 0.0377711 0.0538261 +-0.0691709 0.147293 -0.0286567 +-0.0360974 0.127648 0.0124754 +-0.0776508 0.151441 -0.00388634 +0.0365033 0.0512847 0.031619 +0.0193623 0.0370952 -0.00967348 +0.0153438 0.0522442 -0.0271619 +-0.0174947 0.0815257 0.0576296 +-0.0629203 0.122369 -0.00879811 +0.0168951 0.128644 0.0116162 +0.0397845 0.0699028 0.0328672 +0.00847616 0.0963576 0.0505263 +-0.0532837 0.0454354 0.0434394 +-0.0154326 0.0388218 -0.0141873 +0.058968 0.0691324 0.00813536 +-0.0155327 0.116851 0.0372458 +-0.0261049 0.0632214 -0.0314499 +-0.0580383 0.122682 0.0406302 +-0.0153478 0.0972963 0.0501876 +-0.0480268 0.116533 -0.0152488 +-0.0440293 0.0378087 0.0445145 +0.0122229 0.0822322 -0.030844 +-0.00477881 0.0390844 -0.0104359 +-0.0106511 0.0496684 -0.0311061 +-0.0197213 0.123533 0.0272668 +-0.000499702 0.119705 0.0381547 +-0.0497662 0.165331 0.00186024 +0.0034577 0.0989815 0.0493164 +-0.0623164 0.153672 -0.0306063 +-0.0676947 0.134039 0.046063 +-0.0536041 0.0588172 -0.00776341 +-0.0774688 0.144183 0.0446652 +-0.054123 0.064196 0.0330627 +-0.0515128 0.0452783 0.043411 +-0.0216106 0.0422609 -0.0287762 +-0.0721201 0.0655088 0.0210948 +-0.0214414 0.0682091 0.0499624 +0.0246691 0.103387 0.0411037 +-0.0584632 0.0480819 0.000648377 +-0.0193941 0.113623 -0.0183331 +-0.0642327 0.0431706 0.0367918 +-0.0673041 0.044774 0.00468689 +0.00124491 0.0726488 -0.0351082 +0.0293752 0.0646271 0.0424024 +0.0334188 0.0399387 -0.00226403 +-0.0648162 0.092445 -0.0185198 +-0.0588392 0.0371017 0.0463605 +-0.0464973 0.113852 0.0344899 +-0.0253214 0.158135 -0.00165461 +0.0565751 0.0564133 0.00219071 +-0.0628971 0.106793 -0.0162163 +-0.0672273 0.135447 0.0449702 +-0.0874127 0.118983 0.0477049 +0.0264339 0.0415833 -0.00518191 +-0.0649816 0.114139 0.0429675 +-0.087689 0.0861087 0.0184696 +-0.0759388 0.151364 -0.016882 +-0.00938485 0.0992897 -0.0251913 +-0.0906583 0.12815 0.00627512 +0.0420818 0.101483 0.016165 +-0.0366993 0.124957 -0.00615077 +0.0344101 0.0633165 0.0391255 +0.0312208 0.0578184 0.0397344 +-0.0245116 0.0679611 0.0445844 +-0.0494967 0.0932039 0.0445022 +-0.0762012 0.149986 -0.0138757 +-0.0469178 0.060141 0.0374462 +-0.0939221 0.128285 0.0202478 +-0.0488103 0.0898531 -0.0217755 +-0.013542 0.129298 0.0162538 +0.0557083 0.0616421 0.000366134 +0.0340796 0.0848941 0.0405554 +0.0303873 0.0525299 -0.0147333 +0.0173214 0.127268 0.00181685 +-0.0623602 0.164675 -0.0475927 +-0.0633366 0.0613129 -0.000511486 +-0.0663574 0.0370366 0.0151548 +-0.0567588 0.053509 0.00466959 +-0.082746 0.0802849 -0.00049163 +-0.00173892 0.0697883 -0.0347021 +-0.0444708 0.0888726 0.0431834 +-0.0676524 0.0720092 -0.0120172 +0.0578262 0.0552267 0.0219335 +-0.0418656 0.104235 -0.0206965 +0.0300166 0.0708304 -0.0207823 +-0.0533336 0.128311 0.0351755 +-0.0275965 0.0836272 0.048557 +-0.0894883 0.139285 0.0301857 +0.0461177 0.0511569 0.0313544 +0.0505588 0.0711508 0.00463977 +-0.0653079 0.154958 0.0291369 +-0.0185448 0.0460852 0.0515079 +-0.0843685 0.105877 0.0253348 +-0.0875722 0.151019 0.0254764 +-0.0711952 0.0805577 0.0397762 +0.0367726 0.100261 -0.0101361 +0.0280869 0.0432543 0.0332457 +0.000487446 0.041412 0.0465786 +-0.0266388 0.038336 -0.00299264 +-0.00342216 0.0391144 -0.00832149 +-0.0611289 0.0344725 0.039662 +-0.0517362 0.0738243 -0.0167692 +-0.0804236 0.104574 -0.00559216 +-0.0319013 0.0525534 -0.0124561 +-0.0616634 0.0612417 -0.00198952 +-0.0659473 0.151954 -0.0393992 +0.0336372 0.112962 -0.00230707 +-0.0699642 0.138462 -0.00776795 +0.00139789 0.0405023 -0.0245871 +-0.059508 0.0890036 0.0450344 +-0.0550222 0.141298 -0.00203484 +-0.0720681 0.0805547 0.0392361 +0.0126182 0.0846922 0.0534757 +0.0593665 0.0622129 0.00511321 +-0.0924363 0.118744 0.0263157 +-0.0166806 0.0510876 -0.0315182 +0.0119118 0.0342207 -0.00263798 +-0.0646486 0.156189 0.0162701 +-0.022872 0.104437 -0.0231879 +-0.0799264 0.129511 -0.00520384 +0.0394641 0.063132 0.032359 +-0.0114897 0.0951792 0.0542781 +-0.0474976 0.111158 0.0371638 +-0.0683525 0.155277 0.00186884 +-0.000867993 0.104495 -0.0223762 +-0.0462686 0.12794 -0.00315273 +-0.0306198 0.11135 -0.017885 +-0.0420238 0.0464078 -0.0143471 +-0.0115071 0.0801438 0.0578104 +-0.00552471 0.130134 0.0220582 +0.0553699 0.0651884 0.000788532 +0.000971023 0.0370418 -0.0149189 +-0.0695999 0.162389 -0.0499627 +-0.0593254 0.0447426 0.0431798 +-0.0163529 0.16023 -0.0109161 +-0.0074892 0.108662 0.0435531 +-1.59767e-05 0.130672 0.0211571 +-0.0414957 0.0762285 0.0430404 +-0.00181283 0.0854279 -0.036655 +-0.0573252 0.157131 0.000943525 +-0.0582662 0.0597287 0.0219286 +-0.0158083 0.0827626 -0.0393641 +-0.0636754 0.156752 -0.0416076 +-0.0399677 0.0461402 -0.0203282 +-0.025156 0.16972 -0.0189618 +-0.0527747 0.0826622 -0.0215537 +0.0251411 0.10209 0.0417928 +-0.043632 0.0462886 -0.0112814 +-0.0620154 0.164635 -0.0555847 +0.0104502 0.0343141 -0.0181143 +-0.0391566 0.162183 -0.0124024 +-0.0483573 0.129635 0.0282843 +0.00538744 0.0448871 -0.0255741 +-0.0054947 0.0533903 0.0535249 +-0.00732851 0.0942973 -0.033961 +-0.0241934 0.0388427 0.0350005 +-0.0181599 0.0393223 0.0394029 +0.0346554 0.10439 -0.0105413 +-0.0459466 0.0345121 -0.0200076 +-0.0409396 0.168342 -0.0108401 +0.0103005 0.0624571 -0.0307796 +-0.0681652 0.158429 -0.00684039 +-0.00243741 0.0385239 0.0217416 +0.060795 0.0623425 0.0151668 +-0.0927217 0.128206 0.0112525 +-0.0740576 0.168348 -0.0248615 +-0.0345432 0.114978 -0.015669 +-0.0591204 0.0334451 -0.00148219 +-0.0599836 0.043576 0.0142711 +-0.0568374 0.0898133 -0.021762 +-0.0727774 0.16869 -0.0244081 +-0.00877695 0.169647 -0.023748 +-0.0733702 0.171289 -0.0318245 +-0.0533609 0.033209 0.01963 +-0.012858 0.0386932 -0.00424091 +0.0446984 0.0804984 -0.000780025 +-0.0604981 0.105663 0.0403307 +-0.0437727 0.082626 -0.0206932 +-0.0251898 0.0388783 0.0347661 +-0.00550353 0.0561986 0.0539335 +-0.0649478 0.164181 -0.0229827 +-0.0145881 0.165422 -0.0124907 +-0.0415058 0.0577139 0.0401965 +0.0385298 0.0631329 -0.0097765 +-0.0643222 0.166215 -0.0313693 +-0.0769851 0.0690914 0.0187275 +-0.013127 0.120519 -0.0116431 +-0.0624813 0.156041 0.0199412 +-0.0475747 0.0390527 -0.0120963 +0.0154157 0.0433241 -0.0236953 +-0.00124361 0.130098 0.0236021 +-0.00149237 0.118319 0.0391398 +-0.0454304 0.130382 0.00608349 +0.0094151 0.117047 -0.0161127 +-0.0370213 0.0344129 0.0343812 +-0.0266349 0.121939 -0.00696588 +-0.0514954 0.0833657 0.0447762 +-0.0661547 0.1622 -0.0162285 +0.0354074 0.0446129 -0.00524037 +-0.0839561 0.144602 0.00415973 +-0.0114934 0.104435 0.0434539 +-0.0811445 0.153633 0.00754624 +0.0416181 0.0637615 0.0286411 +0.0336503 0.0646637 0.0398008 +0.00904657 0.129598 0.024451 +-0.075728 0.151337 -0.0208826 +-0.047856 0.132056 0.00259359 +-0.0635915 0.15525 -0.0109401 +-0.025528 0.0383109 0.0298198 +-0.0664625 0.145705 -0.0206681 +-0.0675712 0.139722 0.0445155 +-0.0630199 0.134039 -0.00765574 +-0.0859393 0.101835 0.0256124 +-0.0530219 0.147196 -0.00187885 +-0.00620458 0.038993 0.0313778 +0.0378425 0.10835 0.0231802 +-0.0877357 0.0860979 0.0084778 +0.0064767 0.115498 0.0396093 +-0.027105 0.162286 -0.015104 +-0.0801261 0.144525 -0.00183492 +-0.0858754 0.148602 0.0326009 +-0.060661 0.155018 0.0264156 +-0.0104794 0.0575747 0.0533869 +-0.0433 0.0336903 -0.024306 +-0.0668671 0.0980924 -0.0163226 +-0.0682097 0.171724 -0.0385204 +0.049328 0.0615911 -0.00371844 +-0.059497 0.0861573 0.0445009 +-0.0875265 0.087486 0.0224433 +-0.0660555 0.0600044 0.0111686 +-0.0578054 0.142438 0.0322424 +0.00123277 0.0783068 -0.0354173 +-0.0916354 0.132395 0.0252256 +-0.0117599 0.104933 -0.0231377 +-0.0346346 0.0548282 -0.01038 +-0.0222409 0.0383275 -0.000251248 +0.00824961 0.0725345 -0.0333305 +0.0313861 0.0740897 0.0418701 +0.0164934 0.100411 0.0468922 +-0.0719809 0.156292 0.0165776 +-0.0221908 0.175658 -0.0213821 +-0.00588737 0.108814 -0.0225516 +0.0336337 0.112484 -0.0031866 +-0.0393568 0.123991 -0.00912015 +-0.00841793 0.0387705 -0.00155909 +-0.0431088 0.0347881 0.0415217 +-0.0281377 0.171231 -0.00924208 +0.0317135 0.0955631 0.0407455 +0.0166807 0.124611 -0.00431903 +-0.0923991 0.132355 0.0192227 +0.0141807 0.0900592 0.0522594 +-0.0553478 0.054711 -0.00338754 +-0.0742948 0.147166 -0.0148659 +-0.0210322 0.0623911 0.0469253 +-0.0808524 0.0720445 0.00954101 +0.0185494 0.0379494 0.0423026 +-0.0841291 0.0817203 0.00248105 +0.0309459 0.0700081 0.0411857 +-0.0394974 0.0705046 0.0418138 +-0.0762918 0.169333 -0.0300921 +-0.0537237 0.0477139 0.0256667 +0.0448999 0.0861351 0.000186186 +-0.0313094 0.0384531 -0.00773361 +-0.0305219 0.0474445 0.0454913 +-0.0809514 0.0882189 -0.0076035 +0.0546575 0.0706779 0.0225865 +-0.0414965 0.0986758 0.0418571 +-0.0484435 0.0628471 0.0360579 +0.0594927 0.066407 0.020186 +-0.0627925 0.0838575 -0.0191674 +-0.0214511 0.184864 -0.013038 +-0.0935392 0.129637 0.0202382 +-0.0799546 0.100457 -0.00758867 +-0.0552688 0.126926 0.0376418 +0.0378584 0.0645918 0.0353403 +-0.0361046 0.0383233 -0.0122787 +-0.049226 0.14015 0.0123965 +-0.0164997 0.0938314 0.054193 +-0.0746007 0.0914774 0.0400082 +-0.0791205 0.0709783 0.00599758 +0.0253641 0.0347082 0.00521179 +-0.0594957 0.0918578 0.0453847 +0.0136708 0.0820393 0.0532361 +-0.0193315 0.182966 -0.0230088 +-0.000544127 0.127196 -0.00494172 +-0.030476 0.0664272 -0.0264734 +-0.0734051 0.0674458 0.022683 +-0.0136727 0.0337044 -0.0241151 +0.0214461 0.036336 0.0158614 +0.0583506 0.0662943 0.00413175 +-0.0639059 0.118033 -0.00945272 +-0.0454908 0.0987379 0.0426533 +-0.0318359 0.0344957 0.0406866 +-0.0657843 0.167288 -0.0290298 +0.0181885 0.053509 0.04724 +-0.0610973 0.169393 -0.058599 +-0.0167464 0.108538 -0.0209441 +-0.0826184 0.0802381 0.0286257 +-0.0731223 0.134062 0.0505767 +-0.0135829 0.03702 0.0510108 +0.0354665 0.0768048 0.0390018 +0.0499493 0.051169 0.0281186 +-0.00858939 0.0389741 -0.00922854 +-0.0482262 0.166987 -0.00394405 +0.000506781 0.0605965 0.0560209 +-0.0571262 0.0333733 -0.00101401 +-0.0527176 0.0611373 0.029069 +-0.0225206 0.0919822 0.0517607 +-0.0727584 0.158224 -0.0349231 +0.0221671 0.123584 -0.0006811 +-0.0697019 0.142554 0.0449861 +-0.0890361 0.146068 0.0101777 +0.0300144 0.0389449 0.0261617 +0.0457459 0.0834058 0.0171675 +-0.0828165 0.0790258 0.0245191 +-0.0216847 0.180158 -0.0138785 +-0.0260473 0.11708 -0.0139183 +-0.0263102 0.123352 0.021955 +-0.026277 0.0795343 0.0501986 +-0.04015 0.0473434 -0.014266 +-0.0911404 0.129685 0.035237 +-0.0376719 0.114063 -0.0167039 +-0.0138183 0.0855391 -0.0388001 +-0.0574963 0.111121 0.0367615 +-0.0459611 0.149058 -0.0040494 +-0.06359 0.153594 -0.035633 +0.0294595 0.116659 -0.00368699 +-0.0465112 0.0491437 0.0387964 +-0.0476612 0.135572 0.0133995 +-0.0122712 0.0385653 -0.000297189 +0.0438612 0.0930832 -0.000804157 +-0.00849948 0.0911907 0.056727 +-0.0554517 0.0444829 -0.0071986 +0.0112279 0.0808839 -0.0317275 +-0.0364414 0.0346808 0.041293 +-0.0768829 0.108524 0.037335 +-0.0212115 0.177139 -0.0220322 +-0.0498078 0.0898419 -0.0216876 +0.00832653 0.130915 0.00561741 +-0.0834391 0.153089 0.025871 +-0.0797915 0.0746069 -0.00248195 +0.0162926 0.0348913 0.030635 +-0.0720312 0.141354 -0.00781974 +-0.0640613 0.0606361 0.00380817 +-0.0616877 0.169385 -0.0545934 +-0.0180884 0.184586 -0.0174536 +-0.083714 0.0804887 0.0254979 +-0.0378459 0.0971527 -0.0224307 +-0.048763 0.120209 -0.0131018 +0.0257432 0.120365 -0.00224906 +0.0155215 0.0490175 0.0450471 +-0.0516538 0.162634 -0.00285466 +-0.00249513 0.0774404 0.0585569 +-0.0676995 0.0606833 0.0155957 +-0.0530523 0.0333885 -0.00566149 +0.00632209 0.0596079 -0.030662 +-0.075813 0.0681115 0.0180714 +0.0416741 0.0642804 0.0284921 +-0.04591 0.132311 0.0103278 +-0.0266282 0.0932643 0.045173 +-0.0409763 0.128303 0.0136557 +-0.0295455 0.0745738 0.040676 +-0.0236123 0.0408478 -0.0290846 +-0.062999 0.13114 -0.0082084 +-0.0282657 0.0357556 -0.0195136 +0.0383138 0.109087 0.0181423 +-0.0225227 0.0903335 -0.0360154 +-0.00581332 0.0840953 -0.0378871 +-0.0560848 0.155673 0.012015 +-0.0384894 0.0436513 0.0409963 +0.0250684 0.0912521 -0.0226015 +0.0327251 0.116757 0.0189485 +-0.00849679 0.081545 0.0579523 +0.00549376 0.116905 0.0389072 +-0.0684642 0.035536 0.0130279 +-0.0274333 0.0808284 0.0484505 +-0.0892338 0.0888828 0.0134587 +0.040773 0.0858024 -0.0107788 +-0.018787 0.0654231 0.0516453 +-0.057411 0.0334884 -0.00846165 +-0.0515646 0.0516091 -0.00736491 +-0.0341101 0.171131 -0.0149349 +0.0224908 0.0672402 0.0465227 +0.00748827 0.048894 0.0505047 +-0.0891497 0.139122 0.0375101 +-0.0324992 0.033739 0.00907408 +-0.00547868 0.112944 -0.019663 +-0.00364368 0.038223 0.0108877 +-0.00888297 0.175714 -0.027834 +-0.0616908 0.156845 -0.0305919 +-0.0454927 0.0747515 0.0421648 +-0.0628753 0.0333858 -0.000385113 +0.0200484 0.122759 0.029923 +-0.0624127 0.150637 -0.0175763 +-0.0772056 0.0717509 -0.00044869 +-0.070203 0.179305 -0.0507979 +-0.021805 0.0812974 -0.0389167 +0.00417139 0.0894659 -0.0333631 +-0.00354618 0.035584 0.0475305 +-0.0881296 0.100997 0.0213597 +-0.0344927 0.0803488 0.0420944 +-0.0142597 0.180104 -0.0279187 +-0.0772012 0.161073 -0.0279344 +0.0267764 0.0373043 0.025139 +-0.0764984 0.127442 0.0532158 +0.0305998 0.0741029 0.0424942 +-0.0429656 0.115061 -0.0157138 +-0.0569157 0.131148 0.0370227 +-0.087746 0.09368 0.0248353 +-0.0282695 0.0620042 -0.0284458 +-0.026741 0.0877745 0.0490115 +-0.0141005 0.0382966 0.0123251 +-0.040335 0.124745 0.0227896 +-0.0176742 0.109826 -0.020315 +0.0100598 0.0371564 0.0309489 +0.0330284 0.116174 0.0204895 +0.0194916 0.111179 0.0380087 +-0.0468321 0.144886 0.00412892 +0.00432629 0.0568097 -0.0310178 +0.0172994 0.0665713 -0.0290602 +-0.0776345 0.165887 -0.0268309 +-0.0754949 0.117024 0.0522099 +0.0129986 0.124708 -0.00640366 +-0.0551543 0.0561755 0.00960447 +0.0258384 0.0659192 0.0443144 +-0.0892157 0.0956404 0.0184193 +-0.062275 0.152174 -0.0245791 +-0.0712276 0.159591 -0.0429327 +-0.0468614 0.102797 -0.0212675 +-0.0888687 0.0942285 0.0104297 +0.00705483 0.113673 0.0402142 +-0.0846088 0.10754 0.00337493 +-0.0567766 0.0840541 -0.0213935 +0.0291103 0.0713139 0.0420683 +-0.0416245 0.172695 -0.00500345 +0.0467254 0.0741323 0.0166809 +0.0182946 0.123502 0.0292701 +-0.032545 0.0821172 -0.0295502 +0.0405942 0.0847142 0.0324234 +-0.063874 0.0967575 -0.0177619 +-0.0200635 0.0385408 -0.00554998 +-0.0617567 0.139364 -0.00656769 +-0.0151158 0.0388065 -0.0122456 +0.0258671 0.111418 0.0358303 +-0.0323169 0.126646 0.013854 +0.0128496 0.0432822 0.0446281 +0.0410596 0.104249 0.0151631 +0.0413114 0.0661977 -0.00477755 +-0.0524783 0.0442541 0.0446515 +-0.00534534 0.0423344 0.0481709 +-0.0154906 0.0587868 0.0517337 +-0.0768702 0.122267 -0.00710647 +0.018318 0.0607989 -0.0274966 +-0.0414689 0.101488 0.0411988 +-0.03948 0.109789 0.0371385 +-0.071689 0.171513 -0.0326505 +-0.0562412 0.0479891 0.0306662 +0.0198041 0.103539 -0.0196351 +-0.06089 0.146655 -0.00344226 +-0.0625194 0.150622 -0.0185752 +0.0162788 0.0421207 0.0443108 +-0.0926435 0.13098 0.0162303 +-0.0102744 0.0864318 -0.0379838 +0.0437196 0.0846401 -0.00379782 +-0.0575438 0.119835 0.0395668 +-0.0312754 0.118165 0.0306394 +-0.0384168 0.120732 -0.0116964 +-0.0133826 0.1039 0.0435877 +0.0232434 0.0804535 -0.0255191 +-0.0102585 0.0379591 0.0497745 +-0.0427371 0.0753968 -0.0185868 +0.0223381 0.0606785 -0.0258752 +-0.0124978 0.122374 0.0339942 +0.00450508 0.0688823 0.055725 +0.0471561 0.0614873 -0.00363177 +-0.0496676 0.0649029 -0.0122308 +-0.0360083 0.0485228 -0.0153235 +0.0255211 0.116701 0.0317994 +0.000516492 0.101662 0.0444028 +0.00434751 0.121547 -0.0129175 +-0.0374873 0.0959326 0.0432114 +0.0252705 0.0346338 0.0163557 +-0.0124579 0.0545987 0.0514221 +-0.0889602 0.131049 0.0432066 +-0.0372423 0.152141 0.00211029 +-0.0892956 0.0942653 0.013432 +-0.0518302 0.0344778 0.0329457 +-0.0187757 0.0756949 -0.0390019 +-0.0719603 0.0681626 0.0276375 +-0.0847959 0.147297 0.0357863 +-0.0683786 0.160357 -0.00982452 +-0.0326605 0.0863757 -0.0255732 +0.0456643 0.0848033 0.01617 +0.0560044 0.0608622 0.0263962 +0.0242808 0.034582 0.00510919 +-0.0255484 0.0414464 0.0539815 +0.0584482 0.0538047 0.0101717 +-0.0507323 0.0738128 -0.0166527 +-0.0145896 0.101524 -0.0235873 +0.00379349 0.0393361 0.0313217 +-0.060041 0.155524 0.0222725 +0.0330115 0.107346 -0.00970764 +-0.0356538 0.120932 -0.00987931 +0.0252334 0.114772 -0.00969056 +-0.0560291 0.051292 0.00869383 +0.039494 0.0484532 0.0321483 +0.0260206 0.095556 0.0448127 +-0.0144952 0.092498 0.0556089 +-0.0745303 0.0887706 0.0400356 +-0.0427423 0.0768225 -0.0188988 +-0.0254944 0.0348465 0.0469921 +0.0115755 0.104003 -0.020168 +0.0177398 0.128218 0.01192 +-0.0537709 0.0460941 0.0150722 +-0.0260174 0.0351047 -0.0290083 +0.0146321 0.0460649 0.043757 +-0.0725348 0.149777 -0.0387435 +-0.067793 0.0851703 -0.0179862 +-0.0345051 0.0491976 0.0390013 +-0.0575351 0.0727864 0.0407731 +-0.0902562 0.135043 0.0112131 +-0.0341019 0.0350895 0.0466468 +0.0354707 0.0862229 0.039086 +-0.0635111 0.15292 -0.0340962 +0.000752728 0.131478 0.01712 +0.0415962 0.101461 0.0191676 +0.0199544 0.117871 -0.0110405 +0.0125 0.0341066 0.00131673 +-0.0104877 0.105844 0.0434252 +0.000625364 0.130997 0.01994 +-0.00947876 0.108641 0.0432746 +0.0427329 0.0747306 -0.00479562 +0.0175177 0.121695 0.0318921 +-0.0724967 0.123205 0.0535111 +-0.0217998 0.0826894 -0.0387559 +-0.0474379 0.0384277 -0.0132876 +-0.0453217 0.127718 -0.00291517 +0.00149278 0.115548 0.0405079 +-0.00268673 0.0598311 -0.0338297 +-0.0282466 0.0410133 0.0533665 +-0.084979 0.0912122 -0.0035611 +-0.00188052 0.0377314 0.00623396 +-0.0719012 0.152408 -0.0434229 +0.0297667 0.100164 -0.016062 +-0.0446553 0.0615526 0.0394256 +-0.0935168 0.125484 0.0132627 +0.00892319 0.0349264 0.0435129 +-0.0906919 0.142015 0.0231619 +-0.0362968 0.126232 -0.00232089 +-0.0581074 0.0494572 0.00366497 +0.0584743 0.0538121 0.0171841 +0.0453685 0.090397 0.014157 +0.0451698 0.0903876 0.0161628 +-0.0648504 0.099576 -0.0170426 +-0.0336174 0.0385515 -0.0101375 +-0.0818746 0.144748 0.0414084 +-0.0921915 0.114676 0.0133297 +-0.0735116 0.140055 0.0477493 +-0.0625074 0.0334277 0.00145514 +0.0301634 0.0659717 0.0417895 +-0.0313891 0.0338671 0.0146006 +-0.0524964 0.0876231 0.0453765 +-0.0763164 0.155546 0.0238171 +0.0473804 0.0650284 -0.00116263 +-0.0203751 0.165368 -0.0103486 +-0.074953 0.131092 -0.00759533 +-0.0200723 0.0361973 0.0530852 +-0.0623326 0.164687 -0.0445921 +-0.0432796 0.127517 -0.00276726 +-0.0794589 0.155317 0.0154304 +0.0484584 0.0430177 0.0142199 +0.0516914 0.0635003 0.0289607 +0.0124992 0.111251 0.0392691 +-0.00916969 0.168123 -0.0207225 +-0.0624966 0.0987153 0.0424769 +0.0403564 0.0602895 0.0300713 +0.000529964 0.0745913 0.0578265 +-0.00430704 0.037991 -0.0149598 +-0.0458025 0.0336244 -0.00441422 +0.0244543 0.124393 0.0172632 +-0.0566778 0.0485827 0.00942267 +0.0118497 0.0354401 0.0310392 +-0.0460906 0.156154 -0.00788178 +0.0200436 0.125383 0.0241901 +-0.0110606 0.128229 0.000136123 +-0.0680155 0.149781 -0.0384715 +-0.0340535 0.158097 0.00328753 +-0.063246 0.0709836 0.037551 +0.00837353 0.0479453 -0.0272176 +-0.0704921 0.0944433 0.0420805 +0.0271048 0.0835778 0.0462962 +-0.0814225 0.0858535 0.0328878 +-0.0311244 0.126183 0.00987945 +0.00420219 0.0866314 -0.0335404 +-0.0160918 0.0359549 0.0514785 +-0.0387772 0.152061 -0.00669739 +-0.0394877 0.095879 0.0424449 +-0.0556734 0.0645255 -0.00818248 +-0.0721186 0.0637108 0.0173676 +-0.00866441 0.055565 -0.0335626 +0.034399 0.0476191 -0.006288 +0.0184894 0.03497 -0.0076507 +-0.0208903 0.0376209 0.05361 +-0.0721389 0.12842 0.0519775 +-0.0135421 0.093873 0.0547462 +-0.0114977 0.038716 -0.00213082 +-0.0444942 0.0761733 0.0424299 +-0.0162113 0.0387427 -0.00681752 +-0.0632795 0.162306 -0.0238202 +-0.0678999 0.11945 -0.00879052 +-0.0624555 0.163099 -0.0465902 +-0.0197676 0.0376635 -0.0177276 +-0.00982564 0.0339746 -0.0198462 +-0.0334993 0.115969 -0.0147052 +0.0241258 0.0914782 -0.0228484 +0.0393714 0.104176 0.025187 +-0.0877422 0.114422 0.00426669 +0.0169437 0.0346991 -0.00395051 +-0.0659364 0.0364202 0.0386491 +0.0236414 0.0741206 0.0482553 +0.0360643 0.108191 -0.003826 +-0.0498837 0.0340852 -0.0133065 +0.0109544 0.0459934 0.0454216 +0.0232194 0.06778 -0.026032 +0.0407755 0.0675587 -0.00776366 +0.0164452 0.127885 0.0214354 +0.0306214 0.073711 -0.0207585 +0.0310665 0.0768618 0.0431993 +-0.0326395 0.0549161 -0.0112709 +-0.0264479 0.0721314 0.0435447 +0.0185916 0.116689 0.0359263 +0.0210399 0.118016 0.0341276 +-0.0910253 0.115214 0.0323598 +0.000420695 0.0340758 -0.0179207 +0.011475 0.115421 0.0379758 +0.0558934 0.0728505 0.0127047 +-0.0168011 0.0813465 -0.0393174 +-0.0884013 0.103686 0.0143755 +0.00687166 0.100046 -0.0219438 +0.00938176 0.0463536 -0.0257255 +-0.0376115 0.11722 -0.0140038 +-0.0454999 0.102932 0.0417867 +-0.0638509 0.0597328 0.00826283 +-0.0626761 0.0691812 -0.0125769 +-0.0654105 0.124234 0.0493774 +-0.0585036 0.0790577 0.0434985 +0.025387 0.103408 0.0403826 +0.0322433 0.0896617 -0.0189276 +-0.0875821 0.0909427 0.0247332 +-0.0855607 0.103501 0.00239284 +-0.0436971 0.0419128 0.0432773 +-0.0946145 0.122826 0.0212791 +0.0282404 0.0858422 -0.0216043 +0.00524711 0.0726037 -0.0343433 +0.00348793 0.114165 0.0408953 +-0.0345349 0.108408 0.0380462 +-0.053757 0.152473 0.0202331 +-0.0684765 0.061182 0.0096252 +-0.0653795 0.17033 -0.0418012 +0.0335191 0.0398635 0.0260657 +0.00150101 0.0647986 0.0566673 +-0.0386685 0.0621637 -0.0127302 +0.0514753 0.0731205 0.0184716 +-0.0475108 0.159316 0.00812402 +-0.0418554 0.101378 -0.0213767 +0.059111 0.0580409 0.00617531 +-0.0235023 0.105779 0.0421282 +-0.0564932 0.0861648 0.0446121 +0.0463019 0.07925 0.0141776 +-0.037115 0.160706 -0.0129903 +-0.0454732 0.0917007 0.0431865 +-0.08762 0.143285 0.0101199 +0.0294825 0.0348729 0.0114843 +0.0351631 0.0941496 -0.0136388 +0.0169892 0.122251 -0.00777586 +-0.0286955 0.175698 -0.00647862 +-0.0586479 0.0629437 -0.00583333 +-0.0799097 0.0706493 0.0132254 +0.0440384 0.0959414 0.0171588 +0.00466861 0.0365644 -0.00250089 +-0.0368263 0.0929138 -0.0236695 +-0.0126068 0.0392015 -0.0264338 +0.014095 0.041997 0.0446638 +0.00757449 0.035092 0.025056 +-0.0564565 0.03337 -0.00815977 +-0.0774971 0.128861 0.0533302 +0.0348978 0.0613787 -0.0138096 +-0.0348784 0.10713 -0.0202183 +0.0074278 0.117326 -0.0164147 +-0.0416698 0.0345261 0.0350582 +-0.0711528 0.180791 -0.0525602 +-0.0633069 0.0343768 0.0340823 +-0.0795725 0.091329 0.0351135 +-0.00149388 0.0787876 0.0581499 +-0.0838841 0.12062 -0.00343109 +-0.0017512 0.0769296 -0.0360915 +0.00921045 0.0851252 -0.032 +0.0528986 0.056075 -0.00272531 +-0.088793 0.0888086 0.00747102 +0.0367516 0.061565 -0.0117718 +-0.00560731 0.0389273 -0.00299633 +-0.0145783 0.0348246 -0.0259715 +-0.0668255 0.162993 -0.016474 +0.0537671 0.0492093 0.00323447 +0.0164968 0.0990289 0.0471605 +0.0350254 0.0533499 0.0328505 +-0.0502577 0.127427 -0.00458948 +-0.0354996 0.0605317 0.0401535 +-0.0445094 0.0832466 0.0430632 +-0.061134 0.11687 0.0396165 +0.0288023 0.0594063 -0.0198054 +-0.0345743 0.120058 0.0294165 +-0.00577775 0.0812461 -0.0375203 +-0.0271582 0.125819 0.00840694 +-0.00487894 0.130442 0.0208375 +-0.0485449 0.165375 0.00344343 +0.00426734 0.0682596 -0.032922 +-0.0887148 0.12811 0.00328264 +-0.0688911 0.0610594 0.0132079 +-0.0845844 0.121705 0.0490448 +0.0086501 0.130656 0.00430717 +-0.0694892 0.109539 0.0380952 +-0.0883053 0.149858 0.0265188 +-0.0556122 0.136727 0.0318764 +0.00753471 0.0632773 0.055432 +-0.0675754 0.0334584 0.000400215 +0.0390555 0.064539 0.0335561 +0.00752021 0.073081 0.0562837 +-0.0898786 0.113438 0.0340422 +-0.0729585 0.134037 -0.00770509 +-0.0713317 0.151217 -0.0439201 +0.00350232 0.123774 0.0338316 +-0.0682244 0.142863 -0.0118107 +-0.0110454 0.113378 -0.0180964 +0.0539053 0.0478505 0.00821457 +-0.0614468 0.141404 -0.00570472 +-0.0113089 0.0383954 0.0218511 +-0.0281079 0.177558 -0.016771 +0.012409 0.0418787 -0.0238148 +-0.00282516 0.102957 -0.0229221 +0.0254031 0.123772 0.0104796 +-0.0305987 0.0803029 0.0419758 +-0.0750181 0.0761727 0.0341343 +-0.0144519 0.166922 -0.0140569 +0.00338055 0.0465728 -0.0280809 +-0.0162255 0.177147 -0.0257279 +0.0131167 0.108671 -0.0187213 +0.0272829 0.121723 0.00548626 +-0.0883907 0.115479 0.0451949 +-0.0879259 0.102339 0.0203636 +-0.0548201 0.128324 0.0365339 +-0.0820753 0.129944 0.0519532 +0.00724365 0.07823 -0.0340312 +-0.0819891 0.0923793 -0.00757573 +-0.0303556 0.168269 -0.0071929 +-0.00250456 0.0562401 0.0542942 +-0.0616678 0.143939 0.037247 +-0.0776245 0.151441 -0.00287924 +0.0374138 0.110303 0.0192381 +0.0348067 0.0902706 0.0399059 +-0.0127063 0.0671038 -0.0370425 +0.0160068 0.0347306 -0.00980024 +-0.0372246 0.0368821 -0.0130308 +0.0340234 0.0585319 -0.0137143 +0.0541559 0.0477549 0.017206 +-0.0405048 0.15944 0.00272423 +-0.0015963 0.0981039 -0.0279083 +-0.092935 0.117416 0.0233037 +-0.0832007 0.119017 0.0492012 +0.00140058 0.0348342 -0.0234319 +-0.0868724 0.106357 0.0173489 +-0.0166991 0.0570076 -0.034416 +-0.0907644 0.142021 0.0271708 +-0.0822477 0.106043 -0.00262262 +-0.0929753 0.11876 0.0253083 +-0.0263289 0.0434924 0.0526862 +-0.0374936 0.0733328 0.0420467 +-0.0355255 0.0818589 0.0431427 +-0.0650055 0.136996 -0.00788185 +-0.0705444 0.0712752 0.0339991 +-0.0549513 0.0339195 0.0239841 +-0.00779971 0.114512 -0.0173201 +0.0213851 0.0754916 0.050294 +0.0297243 0.0538559 -0.0167895 +-0.00746204 0.125196 -0.00874293 +-0.0385113 0.0973107 0.0424108 +0.0437641 0.0599949 -0.00412714 +0.00932784 0.0581716 -0.0301717 +-0.07404 0.148543 -0.0208687 +-0.067363 0.177688 -0.0512074 +-0.00213372 0.123188 0.0349488 +-0.0180211 0.168338 -0.0139614 +-0.0254657 0.0678395 0.0426887 +-0.0266217 0.0436536 -0.0288174 +-0.0498332 0.0956322 -0.0221283 +-0.0772795 0.155549 -0.0169029 +0.0369068 0.0799159 -0.0147176 +-0.0788489 0.119288 -0.00581129 +-0.0101059 0.171125 -0.0207965 +-0.0324932 0.0774699 0.0412179 +-0.0434937 0.0705308 0.0420517 +-0.0158265 0.0869335 -0.0385904 +-0.00548754 0.123746 0.0343085 +0.0610091 0.0623122 0.0111052 +-0.00962571 0.0451144 -0.0282927 +-0.0687445 0.160961 -0.0529537 +-0.00991099 0.115578 -0.0164445 +0.0199768 0.126969 0.0170274 +-0.0827793 0.0771313 0.0211566 +-0.0119077 0.0894805 -0.0370977 +0.0238643 0.100811 0.0434608 +-0.0130347 0.166801 -0.0212915 +-0.0934989 0.122762 0.0122811 +-0.0667245 0.0765676 -0.016644 +-0.0391998 0.0351247 -0.0118182 +-0.0445637 0.128075 -0.00132731 +-0.0258871 0.0377455 0.0194558 +-0.093776 0.124126 0.0142628 +-0.0698753 0.117966 -0.00835455 +-0.0515005 0.100157 0.0426446 +-0.0404873 0.112547 0.0355988 +-0.0674682 0.0382926 -0.00574154 +-0.0624974 0.0876076 0.0451456 +-0.0367451 0.0768715 -0.019149 +-0.00349748 0.0870382 0.0570453 +0.0243264 0.0591823 -0.0248233 +-0.0604582 0.154406 0.00215902 +-0.0742084 0.067281 0.00145303 +0.0461952 0.0834391 0.00817714 +-0.0246581 0.0664552 0.0433381 +0.0223219 0.0402539 -0.00770693 +-0.0269495 0.0511315 0.0418642 +-0.0426785 0.060742 -0.0126195 +-0.0470567 0.069722 0.0403886 +-0.057499 0.0889744 0.0446686 +-0.0925962 0.126825 0.0102659 +-0.0627541 0.166279 -0.0425846 +0.00227655 0.0655175 -0.0339267 +-0.0152717 0.181584 -0.0271612 +-0.0527991 0.0578707 0.0222512 +0.0181983 0.0768373 0.0527356 +-0.020287 0.0445184 0.0528933 +-0.0230546 0.0388523 0.0540611 +-0.0591948 0.0603156 -0.00052226 +-0.0356179 0.0505976 -0.0108834 +-0.0125985 0.0420542 -0.026434 +-0.0457346 0.0337173 0.00640665 +-0.0271239 0.117991 -0.0128729 +-0.0287901 0.105845 -0.0221143 +-0.0791947 0.116328 0.04948 +-0.037475 0.126933 -0.001254 +-0.0652274 0.172558 -0.0603808 +0.0249025 0.0659023 0.0447242 +0.0444853 0.062436 0.0294527 +-0.0584017 0.0411488 0.0207065 +-0.0637308 0.0380192 0.0421186 +-0.0224637 0.0768447 0.053535 +-0.0472049 0.132217 0.00449629 +-0.055985 0.033885 0.0237996 +-0.0637704 0.158563 -0.0153492 +-0.0889154 0.0875162 0.0124615 +-0.0630601 0.155204 -0.0366146 +-0.0858283 0.1008 0.00139713 +-0.00849876 0.0884233 0.057199 +-0.0464295 0.156494 0.00819518 +-0.0875333 0.0927687 0.0054156 +-0.0555067 0.053407 0.0086882 +-0.0319429 0.0346356 0.0246022 +-0.0532414 0.127751 -0.00500041 +-0.0324852 0.0946249 0.0445277 +-0.0652259 0.166727 -0.0597961 +0.0318258 0.090298 0.0426417 +0.0227624 0.0959793 -0.0216236 +0.0453464 0.0791637 0.00120688 +-0.00148178 0.0718081 0.0578063 +0.0484981 0.0664872 0.0276228 +-0.0638124 0.0339885 0.0132249 +0.0378702 0.100686 0.0303226 +0.0423416 0.0718943 -0.00578991 +0.0449549 0.0889654 0.0201657 +-0.0505604 0.0431885 -0.0101401 +0.0305345 0.113708 -0.00653825 +0.0175297 0.092684 0.048312 +-0.0405439 0.0338701 -0.0146326 +-0.0151193 0.0387785 0.0315419 +0.0425177 0.0660617 -0.00221978 +-0.0261619 0.0381432 0.054147 +-0.0435068 0.0576714 0.0396679 +-0.0531482 0.161241 0.00587596 +-0.0897425 0.0915834 0.0134432 +0.00549953 0.119637 0.0367537 +-0.00877042 0.130092 0.00788453 +-0.0417274 0.0725105 -0.0179617 +-0.0534984 0.0776159 0.0431279 +-0.0290767 0.121891 0.0239314 +0.0583737 0.0676977 0.00512132 +-0.0647358 0.157148 -0.0507072 +0.0435656 0.0945094 0.0231538 +-0.0220003 0.181634 -0.0125756 +-0.0298816 0.0621837 -0.0234188 +-0.0460097 0.127427 -0.00464706 +-0.0136152 0.0982979 -0.0261721 +-0.0662958 0.0637695 -0.0035905 +-0.0920915 0.118829 0.0424602 +-0.0157421 0.0686009 -0.0381423 +-0.063492 0.0819119 0.043822 +0.0519248 0.0461654 0.00821164 +-0.0528781 0.0490838 0.0346622 +-0.0896974 0.137929 0.0351902 +-0.0502406 0.140114 0.00340131 +-0.0460575 0.131197 0.00582383 +-0.0398248 0.0928735 -0.0232663 +-0.0287922 0.165339 -0.00670006 +-0.0017304 0.0712031 -0.0351875 +-0.0386191 0.118326 -0.013151 +0.0193849 0.126884 0.00540105 +0.0309645 0.0363887 0.0195722 +-0.0314998 0.155167 -8.72409e-05 +-0.000786782 0.0826169 -0.0366787 +-0.0771272 0.155133 0.00894547 +-0.00248977 0.112799 0.0419964 +-0.0279028 0.160261 -0.0136941 +-0.0431979 0.129461 0.00840104 +-0.0208217 0.0854768 -0.038298 +-0.01776 0.0714448 -0.0386564 +0.00624218 0.039472 0.0335072 +-0.0639011 0.119458 -0.00893676 +-0.0667029 0.176899 -0.0509708 +-0.0245413 0.0349941 -0.0287041 +-0.0487364 0.0753122 -0.0176891 +-0.0669945 0.169371 -0.0323347 +-0.00928822 0.0393788 0.0494849 +-0.0239808 0.0936155 -0.0313592 +0.0224894 0.0906371 0.0481279 +0.0242369 0.0748124 -0.0257049 +-0.0243462 0.1625 -0.00551798 +-0.0625942 0.153749 -0.0125838 +-0.0486891 0.137066 0.0163891 +-0.0679674 0.0350577 0.0131968 +-0.0626161 0.12969 0.0410793 +-0.0263812 0.120789 0.0279195 +-0.0802896 0.144766 0.0426469 +0.0132183 0.0794258 -0.0310561 +-0.0415045 0.0548576 0.0396938 +-0.00948994 0.0952069 0.0546127 +-0.0903261 0.135124 0.0222174 +-0.0574953 0.153709 0.0290191 +-0.0428742 0.10707 -0.020141 +0.057983 0.0674087 0.022273 +-0.0297438 0.0593588 -0.0214043 +-0.0562018 0.0589495 -0.00340637 +-0.0230647 0.0402418 0.0541248 +-0.062019 0.17397 -0.0618399 +-0.0412895 0.149153 -0.00363446 +-0.0485728 0.0503685 -0.00899002 +-0.00748812 0.10728 0.0439222 +-0.0336555 0.0709359 -0.0204834 +-0.0407158 0.171931 -0.00126808 +-0.0610791 0.151413 0.0351388 +-0.0221494 0.0384504 -0.005885 +0.00439305 0.11559 -0.018534 +-0.0241215 0.0944713 0.0461972 +-0.0547672 0.0812274 -0.0214088 +-0.0846583 0.0777659 0.00751712 +-0.0574282 0.0507609 0.000628334 +-0.00874511 0.0976201 -0.0294139 +-0.022979 0.0380859 0.023348 +0.043448 0.0916342 -0.00278755 +0.0145196 0.123096 0.0322223 +-0.0415646 0.125825 -0.00703356 +-0.0726695 0.171671 -0.0330178 +-0.010471 0.0378949 -0.0160892 +-0.0488368 0.0970812 -0.0221898 +-0.0586032 0.141 0.0328315 +-0.0117815 0.0347775 0.0429519 +0.0116378 0.0603198 0.0518663 +-0.0459594 0.0560107 0.0380589 +0.0399446 0.107028 0.0121641 +0.00710547 0.0893998 -0.032814 +0.0410678 0.10142 0.0221661 +-0.0244452 0.181836 -0.00961144 +-0.013259 0.121231 -0.0103976 +-0.0454789 0.123431 0.0251209 +0.0285377 0.0523356 -0.0187697 +0.0588289 0.0691072 0.0191593 +0.0125005 0.1007 -0.0226033 +-0.0595569 0.153648 0.0312116 +-0.00403867 0.0994311 -0.025339 +0.00148661 0.108625 0.0426664 +-0.0327389 0.0482896 -0.0213368 +-0.0380117 0.0344553 0.0341354 +-0.072467 0.0968801 0.0405541 +0.0151781 0.0847217 0.0519158 +-0.0425055 0.108838 -0.0192163 +-0.00749309 0.114174 0.0409291 +-0.0434968 0.119301 0.0295385 +0.0363932 0.0476439 -0.00624826 +-0.079546 0.0719865 0.0195582 +-0.0564882 0.042714 0.0457133 +-0.0113851 0.0383094 0.011049 +-0.0865431 0.106355 0.0183534 +-0.0313759 0.0553098 -0.0143786 +0.0515215 0.0651377 0.0281771 +0.0253513 0.0605347 -0.0238887 +-0.0627683 0.164709 -0.0355885 +-0.0520878 0.0489475 0.0226481 +-0.0371717 0.165191 -0.0136726 +0.0421423 0.0738117 0.0292393 +0.0499661 0.0451421 0.0208878 +-0.0394943 0.116662 0.0325452 +-0.085625 0.079203 0.01151 +-0.0716025 0.135501 0.0492566 +-0.00270958 0.0391757 0.033738 +-0.0911953 0.143381 0.0241598 +0.0418026 0.102869 0.0141608 +-0.0319458 0.0708051 -0.0254622 +-0.0626184 0.145978 -0.00858061 +0.0207857 0.0994851 0.0460447 +0.0275851 0.114088 0.0330397 +-0.040502 0.120714 0.028794 +-0.0853944 0.101863 0.0264831 +0.00328879 0.0668715 -0.0332298 +-0.0446453 0.0577855 -0.0118043 +0.0188777 0.03558 -0.00867348 +-0.064488 0.156133 0.0221359 +-0.00921165 0.172686 -0.0275682 +-0.0426232 0.0362716 0.0437883 +-0.0246131 0.0422659 -0.0289978 +-0.0766564 0.0773474 -0.00857073 +0.0281325 0.121698 0.0129367 +-0.00471394 0.0641886 -0.0352179 +-0.0274456 0.0382197 0.0539829 +-0.0417615 0.03357 0.00191851 +-0.0596536 0.0350995 0.0445384 +-0.0458215 0.091313 -0.0218951 +-0.00569643 0.0599053 -0.0346867 +-0.0728066 0.087878 -0.0157134 +0.00467021 0.0347458 0.0211501 +-0.0369631 0.0341718 -0.0179086 +-0.0700564 0.162427 -0.0118963 +-0.0938276 0.126933 0.0242666 +-0.0207424 0.110014 -0.0205123 +0.00150816 0.0911296 0.0556681 +-0.00874857 0.0727984 -0.0375275 +-0.0679476 0.156599 -0.00385029 +-0.076928 0.152806 -0.00788984 +-0.0860408 0.109124 0.0103593 +-0.0514909 0.0544833 0.0216233 +-0.0756545 0.151363 -0.0148873 +0.0423862 0.047532 -0.00502925 +-0.0895419 0.0916017 0.0194388 +-0.014074 0.128231 0.00303832 +-0.0747094 0.155646 0.00979649 +-0.0931712 0.117411 0.0223074 +-0.0548599 0.145302 0.0295141 +-0.058163 0.0467738 0.0296766 +0.00351191 0.0459363 0.0483003 +-0.091423 0.144753 0.0241539 +0.0174632 0.0948293 0.047857 +-0.0326373 0.119597 -0.0104942 +0.0206219 0.119357 0.0335278 +-0.0174992 0.0897364 0.0558751 +-0.00978193 0.0784455 -0.0377778 +0.0236993 0.12332 0.00130956 +-0.0792974 0.15265 0.00222093 +-0.0444956 0.102933 0.0417949 +0.0152822 0.129138 0.0167187 +0.0467013 0.0718392 0.0195936 +-0.0883363 0.112382 0.0405773 +-0.0515091 0.105631 0.0400498 +0.00121056 0.115576 -0.018509 +-0.0525671 0.0335472 0.0123651 +-0.0285962 0.0377287 0.0207135 +0.0043328 0.0341303 0.00522853 +-0.0914252 0.114627 0.0103302 +-0.0231203 0.163764 -0.0160465 +-0.0077447 0.0698983 -0.036343 +-0.0650951 0.162442 -0.0187197 +-0.0652725 0.0613084 0.02088 +0.0455972 0.0415054 0.0160287 +-0.0554928 0.148133 0.0286364 +-0.0709153 0.113624 -0.0087498 +-0.0390311 0.160893 0.00133569 +-0.0669712 0.156006 0.0125516 +-0.0607902 0.0334775 -4.36679e-05 +-0.0634989 0.108392 0.0384413 +-0.0239757 0.0768012 0.0522149 +-0.0671254 0.128435 0.0486555 +-0.0368355 0.153629 0.00272174 +-0.0280768 0.169745 -0.00916431 +0.00750786 0.0518308 0.0519822 +0.017486 0.112589 0.0378808 +-0.0694907 0.0930374 0.0422024 +-0.0457991 0.0336321 0.00104877 +0.0385285 0.0901386 0.0347352 +0.0154693 0.0976312 0.0477084 +-0.0134564 0.0347657 0.0443699 +0.0132374 0.123205 -0.00876652 +0.0204758 0.0975716 0.0468126 +-0.0702558 0.152263 -0.0463745 +-0.0361586 0.0382819 -0.0067057 +0.0546048 0.0478149 0.0122009 +-0.0455357 0.120317 -0.0132441 +-0.00750778 0.0828941 0.0575015 +-0.0338576 0.0347656 0.029445 +-0.0195033 0.118175 0.0352728 +0.0125203 0.0616669 0.0514026 +-0.0196496 0.0582641 0.0484904 +0.0383367 0.0910432 -0.012345 +-0.00538883 0.122125 -0.0114557 +-0.075455 0.0675485 0.016865 +-0.0362517 0.123246 0.0257763 +-0.0815948 0.123081 0.0504133 +-0.00479304 0.130806 0.0179661 +-0.0776418 0.158287 -0.0219264 +-0.0484803 0.117974 0.0310954 +-0.0386541 0.126132 0.0204051 +-0.0786087 0.102098 0.0338163 +0.0464344 0.0792618 0.0111808 +0.0289709 0.0848578 0.043728 +-0.0184969 0.10579 0.0426906 +-0.0245528 0.116739 0.0335827 +-0.0754858 0.146995 0.0422823 +-0.0528151 0.132539 0.0323863 +-0.00781365 0.086863 -0.0372016 +0.0145549 0.126574 -0.00243153 +-0.0834735 0.076324 0.00852235 +-0.0597355 0.0752692 -0.0179534 +-0.0853298 0.111023 0.0405559 +-0.0515948 0.137023 0.025408 +-0.0693375 0.168152 -0.0246084 +-0.0781507 0.115089 0.0495991 +-0.0468723 0.0587675 0.0374438 +0.0193537 0.0349459 0.0257791 +0.0243371 0.123621 0.0229269 +-0.0907106 0.133758 0.0262122 +-0.0542023 0.0435162 0.019691 +-0.036169 0.0335901 -0.0284162 +0.0196024 0.0858351 -0.0269873 +0.0084996 0.0488213 0.0500608 +-0.0308481 0.0664794 -0.025463 +0.0262324 0.0775308 -0.0242027 +0.0470911 0.0422949 0.0155431 +0.0315748 0.0605586 0.0402762 +-0.0722147 0.149455 -0.0385736 +-0.0695516 0.170347 -0.0304219 +-0.0404175 0.171209 -0.00987004 +0.0299365 0.0350356 0.00770058 +-0.0466417 0.133657 0.014443 +0.0130913 0.0937889 -0.0272955 +-0.0579449 0.059547 -0.000261977 +-0.0285818 0.121272 -0.00825717 +-0.0713326 0.0345571 0.00760774 +-0.0666503 0.135429 0.0440071 +-0.0303959 0.0762676 -0.0335676 +-0.00385838 0.101641 -0.0231016 +-0.0679568 0.13115 -0.00879393 +0.00350598 0.0870278 0.056972 +-0.0248582 0.0752289 0.048914 +-0.0588955 0.0336882 0.0145047 +-0.0563129 0.159837 0.00207063 +-0.064096 0.14766 -0.0219948 +-0.00992774 0.110288 -0.021044 +-0.0709029 0.110786 -0.0101311 +4.37647e-05 0.0392736 0.0324137 +0.0144567 0.0617415 0.0506755 +-0.0304982 0.117934 0.0308066 +-0.0124153 0.129138 0.0195683 +-0.0045458 0.042944 0.0478735 +-0.078629 0.155228 0.0230232 +-0.0793587 0.143462 0.044583 +-0.011946 0.163588 -0.0146751 +-0.0489654 0.138607 0.014392 +0.0130851 0.034266 -0.0137357 +0.0405023 0.0484755 0.0322215 +-0.0440255 0.0336276 -0.0225259 +-0.0185094 0.114097 0.0385959 +-0.0708508 0.173984 -0.0409178 +-0.0698895 0.170875 -0.0319754 +-0.0268752 0.105825 -0.0224483 +-0.0921157 0.118792 0.0303066 +-0.0715954 0.155396 -0.0419127 +0.0239203 0.108291 -0.0147313 +-0.0163998 0.119263 -0.0123023 +-0.0327198 0.0652554 -0.0184496 +0.0457714 0.0848094 0.0151676 +-0.062838 0.15526 0.00677387 +-0.0562712 0.146757 0.030967 +-0.00723161 0.0381024 0.0489495 +0.0208841 0.115302 0.0356376 +-0.0311112 0.162246 -0.0146263 +-0.0185025 0.0757876 0.0552584 +0.0369413 0.0993952 0.0325229 +-0.0597781 0.0668249 0.0348598 +-0.0676678 0.0697151 0.0342008 +-0.00507021 0.128586 -0.00238902 +0.035697 0.096801 0.0360155 +0.0179331 0.121039 -0.00844165 +0.00149286 0.100277 0.0469858 +0.0132581 0.0348304 0.0408908 +-0.0746487 0.0760382 -0.00984365 +-0.076866 0.0994719 0.0363813 +-0.00904748 0.0388121 -0.00544357 +-0.0378518 0.0985762 -0.0221892 +-0.0494929 0.0804959 0.044039 +0.0288964 0.120556 0.0189249 +0.0252898 0.0704815 -0.0246106 +-0.0831283 0.107448 0.000408412 +-0.0465019 0.129507 0.0239285 +-0.056621 0.0562362 0.00665228 +-0.00564116 0.0481924 -0.0303539 +-0.0944779 0.122838 0.0232837 +-0.0876178 0.105003 0.0113725 +0.0221833 0.125827 0.00929485 +-0.0376403 0.0562958 -0.0110081 +-0.027315 0.119916 0.0290701 +0.0347431 0.103404 0.0328426 +0.0317883 0.117354 0.00287906 +0.0203254 0.040014 -0.0146997 +-0.0780017 0.150056 -0.00287894 +-0.0106261 0.0451108 -0.0281505 +-0.0729498 0.156259 0.0191473 +0.0393029 0.10195 0.0270711 +0.0182702 0.0422045 0.0436952 +-0.0802626 0.147413 0.0397079 +-0.00132352 0.0966684 -0.0303753 +-0.015259 0.0984512 0.0471298 +0.0451952 0.0433405 0.023507 +-0.0438866 0.108471 -0.0191595 +-0.0159384 0.124168 -0.00545234 +-0.0654957 0.105611 0.0395613 +-0.0904683 0.135081 0.0142287 +0.025208 0.0874192 -0.0236148 +0.0366057 0.0954909 0.0355184 +-0.0887482 0.102363 0.0163794 +0.00249078 0.115545 0.0403845 +-0.0778809 0.0759658 0.0302027 +-0.045814 0.0898818 -0.0220292 +0.0125705 0.0658518 0.0532694 +-0.00597277 0.130385 0.0204408 +-0.0581881 0.125521 0.0404357 +-0.0307415 0.0374976 -0.017878 +-0.0742647 0.109022 0.03931 +0.0186443 0.123322 -0.00490878 +-0.0769902 0.154182 -0.00989517 +0.0130083 0.0956231 -0.0252421 +0.00953036 0.10442 0.0445691 +0.0186389 0.0520546 0.0461071 +-0.0463977 0.0397105 -0.0152844 +0.0444376 0.0959725 0.0121619 +-0.0216077 0.0350207 0.0511065 +0.0463433 0.054773 -0.00593764 +-0.0875696 0.115156 0.045661 +-0.00311195 0.130927 0.00709886 +-0.0627873 0.0335028 0.00493012 +-0.0894432 0.151569 0.0164701 +-0.0668923 0.109473 -0.0126504 +-0.053788 0.0854855 -0.0214384 +-0.00382944 0.108004 -0.0223654 +-0.0447162 0.0448943 -0.0112435 +0.0262334 0.121101 0.000829633 +0.0206734 0.0795401 0.0510479 +-0.0434655 0.127159 0.0186744 +-0.0273746 0.181651 -0.00921581 +-0.0045009 0.116806 -0.0157814 +-0.0529179 0.162663 -0.000927718 +0.0278575 0.109692 -0.0122334 +0.0114621 0.125412 0.0310862 +-0.055877 0.0984248 -0.0207921 +-0.0649536 0.0595166 0.0136311 +-0.0899789 0.116378 0.0441376 +-0.0344621 0.154617 -0.00886992 +-0.0641249 0.156393 -0.0431197 +0.0264267 0.0824949 -0.0235141 +-0.0699148 0.109401 -0.011164 +-0.0645122 0.0398643 -0.00676714 +-0.0927009 0.117475 0.0353038 +0.00812049 0.107282 -0.0201059 +0.0344124 0.0957227 -0.013333 +-0.0617126 0.170956 -0.0545977 +-0.0888439 0.150092 0.0112242 +-0.0600859 0.0421217 0.0440266 +-0.0535039 0.0805657 0.0446207 +0.00913683 0.0873343 0.0554698 +0.0318118 0.100781 0.0373962 +-0.0366211 0.124122 -0.00724685 +0.0255511 0.0463382 0.0384325 +-0.00473212 0.0386351 0.0247855 +-0.0857334 0.153425 0.016223 +3.04988e-05 0.11432 -0.019028 +-0.0622192 0.17721 -0.0606003 +-0.00533435 0.0930519 -0.0346806 +-0.0578363 0.0912193 -0.0212351 +-0.051575 0.132941 -0.0025104 +-0.0215094 0.0983521 -0.0242621 +-0.0663625 0.141125 0.0427387 +0.0411659 0.0952708 0.0280268 +-0.053497 0.0945663 0.0438533 +-0.0745177 0.171112 -0.0322615 +-0.0779361 0.129573 -0.00656407 +-0.0437814 0.0840812 -0.0212189 +0.00326914 0.0682665 -0.0330635 +-0.0739332 0.177709 -0.0464055 +0.0528574 0.0622185 0.0288955 +-0.0365021 0.101484 0.0413625 +-0.0445836 0.0476428 -0.0105653 +-0.0194973 0.101611 0.0435898 +-0.0137239 0.16215 -0.0118322 +-0.0287184 0.0806953 0.0455388 +-0.0933646 0.117392 0.0153085 +-0.0867701 0.113047 0.00428618 +-0.0052769 0.0941788 -0.0338289 +0.0134806 0.0976663 0.0482444 +-0.08743 0.111796 0.0214228 +0.00133097 0.0626915 -0.0339607 +0.0447988 0.0903457 0.000177034 +0.00183354 0.10009 0.0472603 +-0.0323685 0.0497273 -0.0163483 +-0.0848994 0.144621 0.00617242 +-0.0707871 0.0625817 0.00788057 +-0.0334706 0.0589721 0.0386927 +0.0458044 0.0834139 0.0161713 +-0.0638595 0.159101 -0.0532849 +-0.0169095 0.0379753 -0.0273392 +-0.0683614 0.15578 0.00913576 +-0.0841262 0.110345 0.0263651 +-0.0629048 0.1054 -0.0169977 +-0.00482937 0.038542 0.00854039 +0.00442082 0.039258 0.029719 +0.0287437 0.0416628 0.0306503 +-0.0480218 0.144366 0.00442748 +-0.0718881 0.109321 -0.0102252 +-0.0623027 0.153756 -0.0145815 +0.0312054 0.104936 -0.0131412 +-0.0502712 0.143189 0.0133798 +-0.0679015 0.120916 -0.00896008 +-0.0325574 0.126601 0.00788172 +0.00400981 0.0391328 0.0279405 +-0.0790033 0.16525 -0.0329555 +-0.0464892 0.117969 0.0304809 +-0.0171987 0.127433 0.00332106 +-0.0589607 0.145338 0.0340833 +-0.00576935 0.0346302 0.0443351 +-0.0894143 0.118584 0.00330542 +-0.0494955 0.0890237 0.0451636 +-0.0395958 0.118487 -0.0133369 +0.0256371 0.0346096 0.00722464 +0.0101261 0.0846794 0.0551401 +-0.000640169 0.0481947 -0.0300913 +0.00652044 0.0799801 0.0556018 +-0.0485004 0.157854 0.0090451 +-0.0674788 0.153589 0.0328337 +-0.0246191 0.0436702 -0.0286423 +-0.0380903 0.041957 -0.0274154 +-0.0592055 0.155872 0.0109493 +-0.0158317 0.0382446 0.00839116 +-0.0862834 0.141953 0.0402325 +-0.0178783 0.0381567 0.0189161 +-0.00165332 0.0511407 -0.0309868 +-0.0515122 0.0598238 0.030703 +0.0226361 0.118891 -0.00814073 +0.0433138 0.0902166 -0.00378785 +-0.0339799 0.0384942 -0.0120095 +-0.0424937 0.0748068 0.0427898 +-0.0640892 0.172567 -0.049571 +0.037431 0.0794424 0.0366005 +0.041759 0.0432404 0.0265421 +-0.0923571 0.121517 0.0426088 +0.0562687 0.0726263 0.0113628 +0.024692 0.100819 0.0429025 +-0.0729148 0.110726 -0.0089954 +-0.0295018 0.159581 0.00108834 +-0.0672997 0.0435653 0.00884843 +0.0172829 0.0651656 -0.0289948 +-0.0585687 0.0340745 0.0248573 +0.0320945 0.113613 -0.00441584 +-0.0726455 0.0655594 0.00286688 +0.0223162 0.0649555 -0.0263733 +-0.0636659 0.0691264 -0.011804 +-0.0495225 0.143222 0.00950726 +-0.0396922 0.156587 0.00568688 +0.00749975 0.089676 0.055015 +0.0495971 0.0465817 0.0239661 +-0.0390578 0.156263 -0.0100859 +-0.0708823 0.172457 -0.0366471 +0.0126883 0.0343606 -0.00448368 +-0.0454899 0.0690197 0.0407796 +-0.0413446 0.0335325 -0.0237744 +-0.0404379 0.124957 -0.00812413 +0.0440209 0.0945174 0.0011806 +-0.0627245 0.073729 -0.0165415 +-0.0286056 0.0475856 -0.0255224 +-0.0495036 0.153584 0.0107879 +-0.0896132 0.139307 0.0341845 +0.030074 0.119769 0.00796635 +-0.0517393 0.0517191 0.022632 +-0.023961 0.0723529 0.0481115 +-0.0309909 0.0384268 -0.00579914 +-0.00634516 0.0379873 -0.0153566 +-0.0547761 0.0333427 -0.00414144 +0.00202824 0.108029 -0.0204102 +0.0450661 0.0761937 0.0228711 +-0.084679 0.0869987 0.027663 +-0.0219636 0.0681726 0.0490783 +0.0226059 0.0375679 0.034289 +-0.0518654 0.101358 -0.0214215 +-0.0919525 0.126983 0.0392569 +-0.0663498 0.172859 -0.0450539 +0.00551307 0.0856288 0.0568655 +-0.0269831 0.0381412 0.0278748 +0.0430768 0.0411155 0.00329204 +0.0317014 0.117733 0.0199863 +-0.0326228 0.0506668 -0.0115219 +-0.0760639 0.155862 0.0136886 +-0.0581543 0.0337417 0.0181646 +0.0454926 0.0875897 0.015162 +-0.0197923 0.038435 -0.00354579 +-0.0461288 0.15913 -0.00829043 +-0.0235066 0.108523 0.0406075 +0.015525 0.127932 0.00115163 +0.00251501 0.0814623 0.0569927 +-0.0485603 0.131756 0.000870882 +-0.0909462 0.11476 0.0333322 +0.038369 0.0884214 -0.0137726 +0.0179084 0.127905 0.00771503 +0.0457915 0.0862101 0.0121678 +-0.0310416 0.0763051 -0.0325503 +-0.0584963 0.0946188 0.0448266 +-0.00142898 0.112626 -0.0193593 +0.0537506 0.0519895 0.000247391 +-0.00249736 0.0978288 0.0524276 +0.0474285 0.0692644 0.00256538 +-0.0157146 0.17719 -0.0193767 +-0.0688721 0.0369953 0.0119906 +0.0262296 0.0888085 -0.0227773 +-0.0876687 0.0981895 0.00443327 +-0.0435601 0.129686 0.00973169 +-0.0620348 0.146024 -0.00560988 +0.0228232 0.123119 -0.000681491 +0.0192101 0.0791931 -0.0277308 +-0.0285078 0.0348913 0.0463089 +-0.0295006 0.116619 0.032366 +0.00540344 0.040445 -0.0238712 +-0.0861937 0.0819823 0.0184808 +-0.0691313 0.170851 -0.0540166 +0.0232722 0.0691857 -0.0260989 +0.0346775 0.106404 -0.00868031 +-0.0626839 0.154165 0.00249175 +0.0203005 0.047637 0.041402 +0.0426083 0.0915862 -0.00481093 +-0.00121535 0.0394284 0.0356173 +-0.0290126 0.0606872 -0.0244213 +-0.0522249 0.152155 0.0138449 +0.0278367 0.0781921 0.0455692 +-0.0782715 0.168666 -0.0333616 +-0.0631194 0.0357147 0.0189543 +0.00237959 0.0976208 -0.0273765 +-0.0327796 0.0736593 -0.0265049 +-0.0590695 0.143884 0.0338908 +-0.0366032 0.0407784 -0.0289892 +-0.0564911 0.0400264 0.0468768 +-0.0891224 0.133627 0.00423095 +-0.00349883 0.095211 0.054715 +-0.0365564 0.0488017 -0.0133944 +-0.063603 0.0406323 0.0405017 +0.00388987 0.0987683 0.0495103 +-0.0341448 0.166698 -0.0152744 +0.0422984 0.0789118 -0.00576754 +-0.0821777 0.153468 0.0263012 +-0.0618022 0.0852922 -0.0192956 +-0.0825795 0.0937805 -0.00656944 +0.0526059 0.0476644 0.00422036 +-0.0617323 0.155315 -0.018581 +-0.0646798 0.158592 -0.0555006 +-0.0400438 0.127998 0.000725921 +-0.020826 0.0882193 -0.0372663 +-0.072774 0.083565 -0.0157894 +-0.0301375 0.0592681 -0.0204197 +0.053852 0.0700236 0.0237561 +-0.0192952 0.097132 0.0469462 +-0.0379042 0.0350553 0.0424096 +-0.0779467 0.170107 -0.0351609 +-0.0731753 0.162423 -0.0379582 +0.0293531 0.117442 -0.00254348 +0.00923639 0.0753581 -0.0333366 +-0.00523048 0.0381888 0.0482681 +0.0281109 0.0477624 0.0368744 +-0.00549683 0.095262 0.0547887 +0.016279 0.127286 0.0242335 +-0.000357095 0.0346671 0.0418309 +-0.0903031 0.113239 0.0103302 +-0.0435085 0.165227 0.00470373 +-0.000629686 0.0466337 -0.0288231 +-0.00267903 0.0583624 -0.0332032 +-0.0354553 0.163829 -0.00227816 +0.0329891 0.10525 -0.0114692 +-0.0511234 0.159083 -0.0045978 +-0.0738697 0.0672451 0.0209913 +-0.0513379 0.0345855 0.00988953 +0.0449495 0.041538 0.0177108 +0.0131716 0.128382 0.0245166 +-0.0119302 0.0975527 -0.0293786 +-0.0796395 0.11488 0.0476725 +-0.00554666 0.0429634 0.0481135 +0.0336755 0.115893 0.0150272 +-0.0865455 0.109036 0.0123603 +-0.0583287 0.0597422 0.0219213 +0.00142185 0.0361564 -0.0243567 +-0.0249379 0.182957 -0.0150514 +-0.00456935 0.0511652 -0.031379 +0.00983853 0.130485 0.0204326 +-0.020719 0.0739658 0.0533053 +-0.0922608 0.117447 0.0323019 +-0.0687753 0.15954 -0.0529632 +0.00943169 0.130854 0.0188531 +-0.0463671 0.133058 0.0160254 +0.0403868 0.0966272 0.0286723 +-0.0374342 0.125294 0.0223398 +-0.0254349 0.121225 -0.00822483 +-0.0287913 0.121291 0.025511 +-0.0275751 0.181449 -0.0130337 +-0.0292637 0.0364551 -0.0300736 +0.0333063 0.076755 -0.0177777 +-0.00838403 0.100228 -0.0241757 +-0.0917675 0.126924 0.040336 +0.0460105 0.0848241 0.0111686 +-0.0458316 0.03478 0.00723173 +0.0337176 0.0655129 -0.0167917 +-0.0900318 0.128311 0.0429434 +0.00340705 0.0404653 -0.0241388 +-0.0445167 0.0334752 0.00325528 +-0.0417025 0.170926 -0.000183345 +-0.0667272 0.0750614 -0.0156487 +-0.075008 0.0665773 0.0124915 +-0.0256788 0.0387085 -0.0161237 +0.0433708 0.0459415 -0.00338184 +-0.0333944 0.0420411 -0.0295771 +-0.0366574 0.173333 -0.0118804 +0.0279341 0.0376089 0.0251213 +-0.0591944 0.0589798 0.00447595 +-0.0117173 0.0642717 -0.0365887 +0.0284258 0.044601 -0.00619231 +0.0407559 0.0844033 -0.0107694 +-0.0149445 0.0386028 -0.00457425 +-0.0666364 0.150881 -0.0385507 +-0.0441588 0.156514 0.00623469 +-0.0338796 0.174703 -0.0134692 +-0.0700283 0.075334 0.0376711 +-0.0144851 0.120961 0.0347298 +-0.0394983 0.0690894 0.041721 +-0.0820593 0.0748753 0.013529 +-0.0262192 0.162456 -0.00472466 +-0.0573804 0.151726 0.0319973 +0.0238729 0.0463312 0.0395213 +-0.00887703 0.0985896 0.0509585 +-0.00180856 0.0881831 -0.0355551 +-0.0435257 0.128183 0.0171556 +-0.0137851 0.096091 -0.0318323 +-0.0776083 0.0770893 -0.00760024 +0.0515137 0.0637653 0.0289012 +0.0459041 0.087617 0.00917007 +-0.0946685 0.124165 0.0192665 +-0.0424078 0.0392874 -0.0253255 +0.0574465 0.0566575 0.0231489 +-0.0705315 0.0915903 0.0419348 +-0.062769 0.175495 -0.0615699 +-0.0614063 0.0419532 -0.0067475 +0.0222874 0.0635154 -0.025946 +-0.0325454 0.0624467 -0.016419 +0.0406665 0.105637 0.00516291 +0.00508145 0.125851 -0.00757191 +-0.0743566 0.148587 -0.0198592 +0.028537 0.0506236 0.0375191 +0.00550651 0.0897139 0.0554063 +-0.0165465 0.061194 0.0523676 +-0.0548344 0.113627 -0.016162 +-0.078421 0.120421 0.0514142 +0.0224472 0.0375897 0.0352799 +-0.0558038 0.116914 0.0367748 +0.0399293 0.104183 0.0231644 +0.00793957 0.0368635 -0.0077325 +-0.053287 0.119647 -0.012449 +0.0226022 0.1018 -0.0197774 +-0.0735157 0.102656 0.0375574 +-0.0544964 0.10974 0.0378742 +-0.0351154 0.127437 0.0128308 +-0.0759568 0.136911 -0.00615991 +-0.0228623 0.06956 0.0485197 +-0.00937118 0.0387712 0.0309279 +-0.0858362 0.103636 0.0243714 +-0.0777036 0.174395 -0.0426027 +0.0605358 0.0664822 0.0111446 +-0.0456637 0.0382067 -0.0202858 +-0.0494922 0.0833478 0.0446801 +-0.0717916 0.0893503 -0.0160567 +-0.0654224 0.156324 0.0217941 +0.0104303 0.128801 -0.000781749 +-0.0640931 0.122778 0.0478095 +0.012373 0.0343732 -0.00643255 +-0.00549358 0.0898053 0.0568842 +-0.0544984 0.0973596 0.0432594 +-0.0430782 0.154691 -0.00814248 +-0.058643 0.155634 0.0155202 +-0.0309118 0.10664 -0.0209245 +-0.0117675 0.0728437 -0.0380964 +-0.0685186 0.1456 0.0424246 +0.0168366 0.113017 -0.0157876 +-0.0567451 0.0768007 -0.0192338 +-0.0905785 0.121592 0.0451008 +-0.0564995 0.0889847 0.0448198 +-0.062649 0.164698 -0.0365908 +-0.0414211 0.0344456 0.0316667 +0.0235849 0.102638 -0.0186769 +0.0208761 0.115613 -0.0126037 +0.00135548 0.0496637 -0.030356 +0.0172645 0.0713208 0.051333 +0.0277553 0.0619298 0.0435605 +-0.0388696 0.105647 -0.0202518 +0.002402 0.041908 -0.0243037 +-0.00348806 0.11693 0.0398821 +-0.094215 0.120106 0.0172864 +-0.075338 0.161792 -0.0134783 +-0.0313944 0.0721215 -0.0285061 +-0.076236 0.178558 -0.0487103 +-0.0516597 0.0416063 0.0458402 +-0.0191702 0.169734 -0.0206461 +-0.0458479 0.0999438 -0.0215809 +-0.0608063 0.0939347 -0.0190005 +-0.0831639 0.108847 0.00132792 +0.0449523 0.0945963 0.00616781 +-0.089716 0.139255 0.0241831 +-0.0241715 0.165363 -0.00880477 +-0.0808978 0.121685 0.0496566 +-0.0776757 0.0873848 0.0375611 +-0.0575877 0.0343902 0.0335477 +0.0293569 0.0808765 0.0442663 +-0.0413959 0.1089 -0.0192706 +-0.0486555 0.0606014 -0.0118523 +-0.0263871 0.06465 -0.0314802 +-0.0479423 0.118344 0.0305757 +0.0368905 0.10997 0.023344 +0.00465961 0.0959425 -0.0295932 +-0.00250198 0.0647948 0.0567081 +0.0155008 0.0345049 -0.00593057 +-0.0414998 0.0944525 0.0421484 +-0.0425159 0.17187 -0.00332083 +-0.00662603 0.045146 -0.0285621 +-0.0728992 0.107873 -0.010241 +0.0162924 0.0680403 -0.0298148 +-0.058126 0.0494622 0.00265482 +-0.049929 0.0335244 -0.00515732 +-0.0592138 0.116352 -0.0129282 +-0.0876027 0.103683 0.0193632 +-0.0661658 0.170967 -0.0590604 +-0.00423283 0.0951855 -0.0328472 +-0.056711 0.153132 0.0293166 +0.0299135 0.0618945 0.0413957 +-0.0754312 0.179188 -0.0498593 +-0.0890756 0.0982905 0.00941744 +-0.0313333 0.114057 -0.0167329 +-0.0336201 0.0505969 -0.0107597 +0.0152428 0.0807565 -0.0298514 +0.000144172 0.129559 0.0255502 +-0.0166332 0.101644 -0.0236856 +0.0112856 0.0666869 -0.0306751 +-0.0719068 0.110755 -0.00961867 +-0.056773 0.082629 -0.0212703 +0.0224949 0.112674 0.0362232 +0.00494458 0.0356784 0.0456125 +-0.0401622 0.123949 0.0243503 +-0.0494029 0.0516267 0.0356191 +-0.000148869 0.0998138 -0.0237113 +-0.0494252 0.12902 -0.00225187 +-0.0351127 0.162221 -0.0139882 +-0.0801061 0.109977 -0.00253557 +-0.0583279 0.116979 0.0383609 +0.0214316 0.0768422 0.0503677 +-0.0637593 0.0357681 0.0182478 +-0.0679574 0.176267 -0.0485208 +-0.0466544 0.0636155 -0.0134601 +-0.018198 0.0896163 -0.0372798 +-0.0675078 0.167827 -0.0267933 +-0.0891218 0.136568 0.0391914 +-0.00634438 0.0961732 -0.0318818 +-0.0509131 0.144221 0.000402933 +0.020479 0.0822082 0.0508036 +0.0382522 0.0617095 -0.0097618 +0.0414447 0.0957847 0.0271584 +0.0495191 0.0624602 0.0299628 +-0.0525648 0.0515684 -0.00660684 +-0.0507038 0.0543653 0.0186143 +-0.0678764 0.117979 -0.00873338 +-0.0833731 0.0803286 0.00149951 +-0.0102345 0.169322 -0.0249254 +0.0161585 0.128774 0.0170439 +-0.0495011 0.0439447 0.0438293 +-0.0308936 0.0901442 -0.0248987 +-0.0380826 0.159224 -0.0120325 +-0.0684954 0.121776 0.0527683 +-0.0237994 0.178657 -0.0117033 +0.022476 0.125337 0.020807 +-0.0131867 0.0392232 0.050872 +-0.0828365 0.116201 -0.00217327 +-0.0792107 0.0760132 0.0281283 +-0.0418712 0.105657 -0.0205306 +-0.0265289 0.11806 0.03154 +-0.0485021 0.104259 0.0404773 +-0.0515007 0.164119 0.00202375 +-0.0628742 0.175671 -0.0555946 +-0.0385777 0.1595 0.00203018 +-0.0410438 0.162368 0.00371458 +-0.0683486 0.124257 0.0521552 +0.0311264 0.0469699 -0.00653546 +-0.0346775 0.127387 0.0115177 +0.0256926 0.105619 -0.0158649 +-0.0656817 0.0705232 -0.0118151 +-0.0889612 0.111861 0.0183359 +-0.027486 0.0646029 0.0384895 +0.0307322 0.108762 0.0340805 +-0.0647018 0.172123 -0.0473675 +-0.0914367 0.114681 0.021315 +-0.00481581 0.0882239 -0.0361964 +-0.0229882 0.0386094 0.0318708 +-0.0164825 0.0530314 0.0497852 +0.031763 0.0653471 -0.018741 +0.0313568 0.052068 0.0363454 +-0.0937998 0.118753 0.0153042 +-0.0460733 0.0336746 -0.01741 +0.00639772 0.0911374 -0.0325899 +-0.0665077 0.105605 0.0392145 +-0.037944 0.165312 0.00115508 +-0.0447719 0.0826286 -0.0206706 +0.015216 0.0849668 -0.0295884 +-0.00949197 0.121025 0.0361236 +-0.0728889 0.159628 -0.0359308 +-0.0212527 0.0696869 0.051144 +-0.0609844 0.0646638 0.031213 +-0.0787829 0.0926997 0.035689 +0.0098313 0.0644618 0.0545535 +-0.0435636 0.0476726 -0.0110362 +0.00292266 0.0383702 -0.00263564 +-0.0294982 0.0674485 0.03887 +-0.0594483 0.0590098 0.0188119 +-0.0331272 0.0335545 -0.0277881 +-0.0654135 0.17638 -0.0519366 +0.0381247 0.0827831 -0.0147803 +0.0274189 0.0834776 -0.02246 +-0.0754296 0.152593 -0.0138871 +-0.0626337 0.149615 -0.00617193 +0.0395378 0.100622 0.0273876 +-0.00317446 0.0951663 -0.0328247 +0.0284436 0.0721192 -0.0227379 +0.0256796 0.0353829 0.0212256 +-0.0100479 0.0388486 -0.00567581 +-0.0815042 0.149744 0.0353513 +0.0569923 0.0508892 0.0171854 +-0.0844404 0.100576 0.0283951 +-0.066663 0.0704664 -0.0109078 +0.011503 0.108488 0.0403225 +0.0346003 0.059954 -0.013776 +-0.00350072 0.0828956 0.0574459 +-0.0308908 0.0524482 -0.0143777 +0.0220365 0.0430228 -0.0147268 +-0.0499219 0.0558508 0.0334877 +-0.0315001 0.070354 0.040029 +0.0121741 0.0780107 0.0545179 +-0.040483 0.0423569 0.0419938 +-0.0438782 0.0343145 0.0294954 +-0.0243712 0.122748 0.0255975 +-0.013279 0.101966 -0.0239644 +-0.0635872 0.0445618 0.0346899 +-0.09116 0.146144 0.0251605 +0.0191385 0.125192 -0.000918824 +0.0439709 0.0776452 -0.00278508 +-0.034376 0.0448305 0.0451875 +-0.0292764 0.0508797 -0.0213979 +-0.0586802 0.148237 0.034554 +-0.0830867 0.0803012 0.027553 +0.0470243 0.0458757 -0.000608958 +-0.0124544 0.125711 -0.00519106 +-0.0316347 0.0511137 -0.0133654 +-0.0495769 0.126877 0.0317874 +0.0446953 0.0861142 -0.000824781 +-0.0164935 0.0744329 0.0555937 +-0.07397 0.135486 -0.00709777 +-0.0388049 0.0885478 -0.0231132 +-0.0738057 0.149865 -0.0338746 +-0.0612039 0.0347997 0.0427656 +-0.0248108 0.064983 0.0421327 +-0.0374965 0.120729 0.0294163 +-0.0773599 0.0940895 0.0370488 +-0.0221316 0.122996 0.0264112 +-0.0656835 0.180548 -0.0590311 +-0.0654403 0.114174 0.0440564 +-0.0576422 0.035457 -0.0105994 +0.0063341 0.0539359 -0.0303914 +-0.0624964 0.108382 0.0385383 +0.000507196 0.0474213 0.049671 +-0.0768403 0.0682209 0.0124564 +-0.0177152 0.0613627 -0.0358053 +-0.0708829 0.156323 0.0169624 +-0.0801272 0.0895173 -0.00861746 +-0.0681398 0.156014 0.0252192 +-0.0643944 0.0418449 0.0286723 +-0.0223108 0.122995 -0.00618559 +-0.0332179 0.0347336 0.0278325 +-0.0494838 0.129682 0.0301574 +-0.0874269 0.111566 0.0378689 +0.0078939 0.0373631 -0.01008 +-0.0556091 0.0372359 0.0469697 +-0.0495471 0.140136 0.00640196 +-0.0721891 0.0696552 -0.00460695 +-0.0645108 0.135348 0.0400634 +-0.00963836 0.0466527 -0.0295963 +-0.00450177 0.0856564 0.0572774 +-0.0726963 0.163825 -0.0409661 +-0.0831522 0.148677 0.0355101 +-0.0045943 0.109577 -0.0220661 +-0.0700292 0.14319 -0.0126949 +0.0170086 0.0672594 0.0509139 +-0.0184932 0.0842766 0.0574008 +0.0333985 0.0809938 -0.0187374 +-0.00658339 0.116828 -0.0157946 +-0.0830307 0.110356 0.0344756 +-0.0164574 0.11955 0.0353527 +-0.0437556 0.0335262 -0.0205177 +-0.0196754 0.180147 -0.0162801 +0.00748686 0.0427091 0.0452774 +0.047238 0.0525837 0.0312359 +-0.00150012 0.0842876 0.0575029 +-0.0647611 0.154265 0.00245101 +0.0385227 0.108358 0.00315989 +0.00616601 0.0343841 0.0199712 +0.0190967 0.127602 0.0138576 +0.0232916 0.104676 0.0408599 +-0.0209519 0.121676 -0.0087885 +-0.000475449 0.077417 0.0583222 +-0.0340577 0.0344858 -0.0194842 +-0.0449113 0.0342791 0.0293115 +-0.02963 0.125357 0.0045818 +-0.0442513 0.120873 0.0273959 +0.0233607 0.0713858 0.0478141 +0.0294074 0.0974659 -0.0171759 +-0.0251322 0.110719 -0.0192347 +-0.0168318 0.0883012 -0.0380546 +-0.0537516 0.078251 -0.0196488 +-0.0617185 0.155298 -0.026582 +0.0182327 0.0369462 -0.015679 +0.0204347 0.103384 0.043762 +-0.0271652 0.177189 -0.00775302 +-0.078183 0.161072 -0.0259393 +-0.000994284 0.0346324 -0.0168306 +-0.0369077 0.0407733 0.0449918 +-0.0117377 0.0685356 -0.0370961 +-0.0520176 0.136681 0.0271356 +-0.0244827 0.044849 0.0526821 +0.0122811 0.0490196 0.0473922 +-0.0310488 0.126128 0.0128475 +-0.0612252 0.0618413 0.0248018 +0.0110023 0.0872551 0.0546654 +0.0137177 0.0926941 0.0515916 +-0.050909 0.135812 0.0260882 +-0.0514988 0.090386 0.0447021 +-0.0776802 0.121779 0.0520726 +-0.0435045 0.0492094 0.0395536 +0.0427867 0.0445146 0.027427 +-0.0124587 0.0716774 0.0554083 +-0.0903482 0.115904 0.00630147 +-0.0676703 0.159658 -0.00956407 +-0.0534975 0.100135 0.0423919 +0.0299608 0.102103 0.0382304 +-0.0275896 0.0398384 -0.0294326 +-0.0354902 0.0576195 0.0391492 +-0.0365293 0.120277 -0.0112077 +0.000101878 0.111584 -0.0199068 +-0.0568115 0.11798 -0.012657 +-0.0134078 0.0383017 0.0160824 +-0.078485 0.131655 0.0526796 +-0.0630792 0.17626 -0.0613621 +0.00219436 0.0880897 -0.0340427 +-0.00664745 0.0511524 -0.0316637 +-0.0221856 0.122325 -0.00745001 +0.0517581 0.0684217 0.00143507 +-0.0206221 0.0450432 -0.0278804 +-0.0187788 0.181486 -0.0239544 +-0.0435029 0.119128 -0.0140097 +-0.0368374 0.0957548 -0.023046 +0.0360094 0.105316 -0.00780471 +-0.0310017 0.0339922 0.010953 +0.0468601 0.0467385 0.0270828 +-0.0800669 0.107282 -0.00460113 +0.0161405 0.0847501 0.0515574 +-0.0726437 0.152619 -0.0388965 +-0.030372 0.124909 0.019004 +-0.0532086 0.0387959 0.0470712 +-0.00947284 0.0717726 0.0568611 +-0.0417517 0.0449058 -0.0193246 +-0.0324319 0.159505 0.00208324 +-0.064273 0.0404086 0.0266782 +-0.0456914 0.0665681 -0.0150523 +-0.0317955 0.0901023 -0.0248195 +-0.0901544 0.148798 0.0121684 +-0.0448181 0.0898814 -0.0220536 +-0.00651 0.0385696 0.00453582 +-0.0505409 0.146308 0.012527 +-0.0736443 0.148637 -0.0247496 +0.0362923 0.0826461 -0.0167222 +-0.0582688 0.0380855 0.0465946 +0.0420736 0.0957824 -0.00279849 +0.059075 0.0677442 0.0201625 +-0.0118076 0.166362 -0.0213381 +-0.0293882 0.0593157 -0.02241 +-0.00750084 0.0688979 0.0559719 +-0.0834808 0.0763288 0.0055122 +0.0455463 0.0847945 0.0181695 +-0.0853379 0.139291 0.0436042 +-0.0127384 0.0714338 -0.0383051 +0.0288553 0.119043 0.000370228 +0.0382387 0.108322 0.00216703 +-0.0854254 0.147285 0.0350057 +-0.0290239 0.0918566 -0.0266024 +-0.089435 0.0996945 0.016394 +-0.0250572 0.0379934 0.0230062 +-0.0659224 0.108105 -0.0137141 +-0.0197383 0.064191 -0.0362126 +0.0332406 0.0828224 -0.0189128 +-0.050463 0.0627793 0.0338697 +-0.00332118 0.0928352 -0.0344367 +-0.0351624 0.0344214 0.0133327 +0.0337894 0.103744 -0.0118635 +-0.0685313 0.0435239 0.00368786 +-0.0915175 0.140609 0.0191776 +-0.0763247 0.0679089 0.0110614 +-0.0293662 0.0904135 -0.0285737 +-0.0268485 0.0931277 -0.028596 +-0.0493167 0.137038 0.00442458 +-0.0607789 0.121227 0.0419471 +-0.0167795 0.0984818 0.0458118 +-0.0218018 0.0947992 -0.0305488 +-0.0933659 0.118725 0.0133024 +-0.0263107 0.0780916 0.0488984 +-0.0689525 0.144454 -0.0174142 +-0.0698503 0.0980241 -0.015524 +0.0377251 0.0602627 -0.00973714 +-0.0616079 0.160003 -0.0285892 +-0.00362249 0.0451016 -0.0279234 +-0.0658161 0.0866791 -0.018673 +-0.0898976 0.132262 0.00523931 +-0.014426 0.0383347 0.0104075 +-0.0891789 0.14342 0.0311627 +-0.0516305 0.0633366 -0.0105425 +0.0421385 0.102872 0.00916356 +-0.073056 0.163825 -0.0399663 +0.0142799 0.0695538 -0.0310885 +-0.0191804 0.172724 -0.0156293 +-0.0111853 0.109046 -0.0214904 +-6.48961e-05 0.130222 0.00105503 +-0.037907 0.0368934 -0.0113278 +-0.0778791 0.116346 -0.00545689 +-0.0353032 0.042242 0.0460623 +-0.0732356 0.176411 -0.0530886 +0.0601048 0.0608967 0.00715985 +-0.052965 0.0595916 0.0265588 +-0.0564973 0.0762116 0.0428205 +-0.034872 0.104274 -0.0209307 +-0.058681 0.0336414 -0.0106847 +-0.082997 0.0883523 -0.00560613 +-0.0901456 0.140633 0.0231701 +0.059772 0.0594746 0.00715469 +0.0315129 0.0439606 0.0299133 +-0.0749354 0.108383 0.0378851 +-0.0718123 0.0950995 -0.0154446 +-0.017311 0.117579 -0.0145168 +-0.0492219 0.145089 -9.42983e-05 +-0.0492467 0.0335224 -0.00684693 +-0.077013 0.157587 -0.0116646 +-0.0395098 0.12077 0.029092 +-0.0676415 0.155906 0.0108585 +-0.0115046 0.0688083 0.054897 +0.00350877 0.068881 0.0557692 +-0.00832726 0.0349131 -0.024554 +0.00623924 0.0754282 -0.0343629 +-0.0601994 0.14968 0.0358889 +-0.0681006 0.0726203 0.0368546 +-0.0550659 0.154073 0.0197239 +0.0220423 0.0388246 -0.00567731 +-0.050633 0.0633988 -0.0111763 +0.0262673 0.0718723 -0.0242084 +0.00651709 0.084208 0.0565081 +-0.0508195 0.0927229 -0.0217389 +-0.0823617 0.110377 0.0328225 +-0.0443307 0.0345511 0.0362271 +-0.0664541 0.159015 -0.0105538 +-0.065725 0.180452 -0.0578644 +-0.00729397 0.0383333 0.0172997 +-0.083856 0.108875 0.00233606 +-0.0531754 0.160014 0.00733632 +-0.0617546 0.0335347 0.00511487 +-0.0436843 0.0666417 -0.0153695 +-0.0475053 0.16079 0.00736091 +0.0213151 0.0393899 0.0411211 +-0.0126085 0.0434839 -0.0264186 +-0.058072 0.135467 -0.00577889 +-0.0144744 0.0573903 0.0514423 +-0.0480757 0.15465 -0.00633475 +-0.0214326 0.158913 -0.0108411 +0.0317035 0.0927362 -0.0181479 +0.0258633 0.0505634 0.0389033 +-0.0916556 0.116096 0.0323166 +-0.0344737 0.0973629 0.0436701 +-0.0772898 0.158355 -0.013903 +0.00252455 0.078679 0.0567626 +-0.0768599 0.0852186 -0.0125783 +0.00638417 0.060281 0.0547831 +0.00351108 0.067509 0.0559028 +-0.0775506 0.172738 -0.0395384 +-0.0941076 0.120125 0.0222927 +0.0397169 0.0400457 0.0217023 +-0.00993012 0.125562 -0.00707028 +0.0207467 0.0387687 0.0412277 +-0.0770466 0.0947961 -0.0125384 +-0.0208658 0.163381 -0.0161046 +-0.0194871 0.0786419 0.0560662 +-0.00848562 0.0978428 0.0521021 +-0.00195749 0.0369571 0.00873581 +-0.0554658 0.14959 0.0286413 +-0.0613355 0.171315 -0.0617342 +-0.0405058 0.060576 0.0408455 +-0.019245 0.0381493 0.0168345 +0.0318352 0.0959581 -0.0155753 +-0.0894336 0.0956291 0.0144221 +-0.0562826 0.138192 -0.0042334 +-0.0587859 0.118384 0.0394982 +0.0557398 0.0577143 0.000186064 +0.021293 0.0347861 0.0208687 +-0.0521809 0.0564969 0.0230721 +-0.088994 0.140671 0.0361625 +-0.0626529 0.0336856 0.0101657 +-0.0346997 0.0808739 -0.0236048 +-0.0740754 0.0791322 0.0370556 +0.0424523 0.0958497 0.0251568 +0.0156501 0.129207 0.0125793 +-0.0758074 0.0766216 0.033593 +-0.053977 0.0335099 0.00491422 +-0.049617 0.115589 0.0334474 +-0.0151821 0.115592 -0.0164315 +0.0198002 0.113601 -0.0144182 +-0.0297803 0.0833036 -0.0335871 +-0.0888224 0.0929368 0.0224135 +-0.0255078 0.162179 -0.0150106 +-0.0468796 0.105628 -0.0200508 +0.0328144 0.0654355 -0.0177831 +0.0401246 0.0657991 0.0315825 +-0.0619246 0.161563 -0.0295917 +-0.0336612 0.0423072 0.0487868 +-0.0806782 0.140364 -0.00279029 +-0.0575747 0.034031 0.0251021 +-0.00250061 0.0856648 0.0572816 +-0.051497 0.0776631 0.0434639 +-0.0314085 0.177247 -0.00418119 +-0.0382796 0.035429 0.0243806 +-0.0273926 0.0381858 0.00428469 +-0.0590133 0.128179 -0.00718347 +-0.059761 0.058524 0.00837605 +-0.089717 0.142036 0.0301646 +-0.0708787 0.0634588 0.0196178 +0.017237 0.0368135 -0.0176915 +0.0283981 0.0848865 0.0446615 +0.042292 0.0669509 0.0276386 +-0.0400442 0.15362 -0.00816685 +-0.0666868 0.15458 -0.000433214 +0.00520355 0.0894816 -0.0332282 +-0.0438381 0.033833 0.0263899 +-0.0863798 0.100827 0.00341316 +-0.0560788 0.154579 -0.00133297 +-0.0130807 0.0387897 0.0319484 +0.0526374 0.0710929 0.00470311 +0.0114966 0.0923286 0.0527326 +-0.0637555 0.0336685 -0.00625178 +-0.0475689 0.0432884 -0.0109341 +-0.0725775 0.0367142 0.00725292 +-0.0374892 0.112529 0.0350998 +0.0350676 0.0395586 0.0248293 +-0.031508 0.0675059 0.0394967 +0.0422807 0.0831292 -0.00677447 +-0.0617624 0.0810326 -0.0192317 +-0.0601798 0.155861 0.0135147 +-0.0160151 0.185636 -0.0207096 +-0.0495589 0.141679 0.00640064 +0.0451001 0.0791381 0.000209359 +-0.00648871 0.115533 0.0401374 +-0.0179936 0.034905 0.0502652 +-0.0345243 0.0619374 0.0399691 +0.0253647 0.107408 0.0385761 +0.0241683 0.0795725 0.0490812 +-0.076883 0.154198 -0.00789596 +-0.022619 0.0436731 -0.0285417 +0.0302544 0.115002 0.0294335 +-0.0112354 0.0407042 0.0501624 +-0.0374964 0.118015 0.0312717 +-0.0264155 0.169752 -0.0102811 +-0.0325172 0.115309 0.0332233 +-0.0883434 0.0968836 0.00640652 +-0.0074894 0.104457 0.0437929 +-0.0122029 0.0391189 0.0354325 +0.0605626 0.0609358 0.0161739 +-0.0291057 0.0349617 0.0478282 +-0.00632683 0.0367419 -0.0160833 +0.0422139 0.06433 -0.00247442 +-0.0834639 0.0815548 0.0279962 +-0.091428 0.113787 0.018961 +-0.0164849 0.0911174 0.0558291 +-0.0521483 0.153554 0.0122178 +0.0344074 0.0446243 -0.00536213 +-0.09232 0.126938 0.0302595 +-0.0718881 0.12088 -0.00850233 +-0.0769692 0.155214 0.0250641 +-0.0847077 0.140411 0.00224002 +-0.0180254 0.171268 -0.0157212 +0.0102822 0.065327 -0.0312772 +-0.0271732 0.171194 -0.0185934 +-0.0475224 0.0587349 0.0366732 +-0.0815066 0.0980245 0.032594 +-0.0287322 0.0335484 -0.0250427 +0.000965074 0.0348235 0.00577003 +-0.0874433 0.114073 0.0447649 +-0.0745611 0.163685 -0.0159572 +-0.0504998 0.0931897 0.044287 +0.00144942 0.127679 0.0289378 +-0.0830551 0.128552 0.0515383 +-0.0537303 0.0473713 0.0135851 +-0.0226958 0.0380494 0.0144148 +-0.0698996 0.147518 -0.0298062 +-0.0374978 0.0833038 0.0438252 +0.0144108 0.118463 -0.013667 +-0.0810085 0.1097 0.0318734 +-0.0883068 0.151437 0.0121831 +0.0014962 0.114186 0.0411808 +-0.0457512 0.0782542 -0.0192962 +-0.0728503 0.107163 0.0374416 +-0.0546426 0.0335759 -0.00981752 +-0.0905935 0.133662 0.00922276 +-0.0777368 0.158322 -0.016916 +0.0333249 0.108715 0.0307644 +-0.0758319 0.0675199 0.00554661 +-0.0608714 0.0385134 0.0195368 +-0.0766234 0.167356 -0.0265012 +0.0324864 0.115764 0.0245556 +-0.051601 0.149349 0.0154046 +-0.0370133 0.1227 0.0269929 +-0.0556554 0.124247 -0.00722427 +-0.0272643 0.118767 -0.0116611 +-0.0284876 0.0660147 0.0384689 +-0.0890493 0.136506 0.0262024 +0.0455252 0.0918117 0.00617298 +-0.0739705 0.110854 0.0450522 +-0.054929 0.0378655 -0.0109689 +-0.0211646 0.0933284 0.0517404 +-0.00865087 0.0496719 -0.030975 +0.0599111 0.0692057 0.0151972 +0.0182222 0.0631608 0.0491228 +-0.0659867 0.134061 -0.00822741 +-0.0533518 0.117447 -0.0141574 +-0.0356207 0.0519761 -0.0103771 +-0.0674828 0.0383816 0.0133921 +-0.0179472 0.0391243 0.0360362 +-0.0353932 0.0352385 0.0143534 +-0.0381912 0.168168 -0.0127822 +0.0242439 0.0994852 0.044008 +-0.0331278 0.165217 -0.0153881 +0.0419441 0.102888 0.00516309 +-0.0744413 0.0833098 0.038687 +-0.0349807 0.177 -0.00919022 +0.00950876 0.0882899 0.055046 +0.0203114 0.0607424 -0.0267183 +-0.00473829 0.0684427 -0.0355801 +-0.0293549 0.0495451 -0.022456 +0.0213555 0.0521216 -0.0251867 +-0.0608025 0.132515 0.0384279 +-0.086306 0.0981081 0.00140707 +0.0124215 0.122685 -0.01021 +0.0534041 0.0547278 -0.00176167 +-0.0725172 0.105485 0.0374705 +-0.0925573 0.125589 0.0382552 +0.023685 0.124697 0.0198268 +0.0381226 0.0574698 -0.00591549 +-0.0358756 0.107103 -0.0202685 +-0.00445554 0.112864 -0.0195829 +-0.00333512 0.125963 -0.00760181 +0.0355639 0.058664 -0.0117324 +-0.0752743 0.171989 -0.0354168 +0.0264872 0.122262 0.00520712 +-0.0911855 0.114622 0.00933636 +-0.0888501 0.102361 0.0153809 +0.0303343 0.0358493 0.0181065 +0.0388945 0.108364 0.0171641 +0.0444906 0.0861036 -0.00180248 +-0.00457845 0.0388805 0.0300129 +-0.0689372 0.126774 -0.00892675 +0.0352594 0.113795 0.0141522 +0.0379749 0.0374097 0.0109015 +0.00640925 0.0404248 -0.023654 +-0.0569156 0.112617 -0.0162683 +-0.0161127 0.0388433 -0.0124778 +-0.0568734 0.0358081 0.0462717 +-0.0852004 0.111887 0.0434561 +-0.0393334 0.174116 -0.00798067 +-0.0335527 0.156609 0.00223348 +-0.06623 0.13826 0.0429445 +-0.029146 0.168214 -0.0173005 +0.0267233 0.0347365 0.00732658 +-0.0416725 0.0607151 -0.0124173 +-0.0304675 0.175749 -0.00423829 +-0.0888241 0.114444 0.00524771 +-0.00228102 0.038771 0.0269718 +-0.0353955 0.0337248 -0.0302701 +-0.0474965 0.0862056 0.045143 +-0.0615859 0.155307 -0.0235819 +0.0506383 0.0516722 -0.00273463 +0.0335552 0.036072 0.00748554 +-0.00436077 0.12603 -0.00766771 +-0.0239599 0.182991 -0.0170658 +-0.00549985 0.07185 0.0581365 +-0.0328429 0.0972178 -0.0231932 +-0.091474 0.148846 0.0181354 +0.0336134 0.0876336 0.0416906 +-0.0614982 0.101529 0.0422258 +-0.0495014 0.0464837 0.0411417 +-0.0551395 0.054088 0.00915623 +-0.0432223 0.147486 -0.00120685 +-0.0358825 0.108535 -0.0199213 +0.00990352 0.130871 0.0175976 +-0.00150184 0.0978367 0.052434 +-0.0334203 0.0667037 -0.0174892 +0.0289827 0.0467369 -0.00766304 +-0.0555362 0.0629843 -0.00681601 +-0.0758946 0.0992374 -0.0118631 +-0.0367472 0.127095 0.0166739 +-0.0571684 0.0576767 0.00966588 +-0.0823623 0.154598 0.0188308 +-0.0905142 0.129614 0.0405398 +-0.0677394 0.0764997 -0.0160371 +-0.0201192 0.163785 -0.0165508 +-0.0132881 0.113144 -0.01784 +0.0143956 0.046307 -0.0246969 +0.0117341 0.0390743 0.0447312 +-0.0746833 0.155701 -0.000366346 +-0.069527 0.156219 -3.70248e-05 +-0.0226679 0.0341396 -0.0206509 +-0.00924422 0.0344526 -0.0182921 +-0.0276907 0.0335904 -0.024878 +-0.00470812 0.0669686 -0.0349707 +-0.024291 0.106203 -0.0224613 +-0.0142085 0.0972199 -0.0290358 +-0.0465353 0.133196 0.0100953 +-0.0245088 0.108515 0.0403619 +-0.092997 0.116043 0.0153159 +-0.0517083 0.131123 0.0322407 +-0.0456135 0.053373 -0.0104441 +-0.0345226 0.0846315 0.0427551 +-0.00735617 0.0354566 -0.0169734 +-0.0865776 0.109066 0.0163469 +-0.0436408 0.0408205 -0.0223011 +-0.0526724 0.130856 -0.00431281 +-0.0516582 0.0647811 -0.0108241 +0.0182047 0.100313 -0.0224597 +0.0445886 0.0833307 0.0241696 +-0.0749819 0.151307 -0.0268775 +-0.0846364 0.0845811 0.0264985 +-0.0452001 0.165138 -0.00833108 +-0.0791947 0.168601 -0.0366432 +-0.0848581 0.120613 -0.00298955 +0.0319638 0.0780558 -0.0197042 +-0.0923737 0.128196 0.0102559 +0.0394261 0.0716433 -0.0107927 +0.0122035 0.115305 -0.0162457 +-0.0229162 0.0383263 0.00143492 +0.0428254 0.0986969 0.0191637 +0.0153612 0.0463061 -0.0243571 +-0.00764709 0.0511598 -0.0317878 +-0.0853621 0.135278 0.0465646 +-0.0829375 0.116994 0.0487646 +-0.085028 0.100559 0.0275605 +-0.0219183 0.0382906 0.00166561 +-0.0765591 0.0818865 0.0366215 +0.0417584 0.0971928 -0.00282344 +-0.064598 0.141073 0.0399979 +0.0464507 0.0764566 0.0101865 +-0.0788399 0.114858 -0.00418456 +-0.0825062 0.110166 0.000353593 +0.029005 0.0699505 0.0419019 +-0.0144969 0.0814706 0.0569355 +0.0278524 0.115393 0.0316598 +-0.0742949 0.17555 -0.0422185 +-0.0749686 0.158241 -0.0259415 +-0.0378653 0.102824 -0.0209313 +-0.0110297 0.11443 -0.0172182 +0.0092913 0.0739064 -0.0330363 +0.0274028 0.0416284 -0.00496361 +-0.0105374 0.130025 0.0158825 +-0.0530895 0.0530892 -0.00643833 +-0.0165413 0.0573347 0.0511714 +0.0165193 0.125294 -0.00303164 +-0.080526 0.109264 0.0359357 +-0.0639459 0.153257 -0.00670123 +0.0199666 0.126684 0.0198751 +0.0426813 0.101508 0.00916223 +0.0270307 0.0781852 0.0461538 +0.00819303 0.0342719 -0.00156322 +-0.0758021 0.154133 0.0299324 +0.0217183 0.114203 -0.013082 +-0.0761724 0.154401 0.00198863 +0.0253655 0.0814952 -0.0244829 +-0.0357817 0.0871994 -0.0240994 +-0.0181797 0.178658 -0.0176382 +-0.018211 0.0697307 0.0537615 +-0.0393811 0.154717 -0.00895732 +-0.014508 0.0659228 0.0537042 +-0.0294961 0.104302 0.0413374 +-0.0281692 0.171188 -0.018077 +-0.0564789 0.0833746 0.0446901 +-0.0817321 0.120346 0.0490739 +-0.0180945 0.124042 -0.00530863 +-0.0722448 0.0688588 0.0287217 +-0.064637 0.0404566 0.0276669 +-0.0642686 0.171043 -0.0609844 +-0.00150003 0.0520299 0.0541649 +0.0343966 0.0968432 0.0376227 +0.033587 0.0739599 -0.0167921 +-0.0916761 0.122705 0.00729331 +0.0435692 0.0691645 0.0259965 +-0.0583799 0.0342852 0.0299739 +0.0193411 0.0593649 -0.0271573 +-0.0630027 0.145885 -0.0118617 +-0.0492939 0.133961 0.00142725 +-0.0445641 0.0405033 0.0438121 +-0.0534909 0.101517 0.0419949 +-0.0137652 0.0728728 -0.0386088 +-0.000746952 0.0726633 -0.0355323 +-0.00426313 0.130924 0.016725 +-0.0833848 0.0776237 0.00250717 +0.0107457 0.127435 -0.00331768 +-0.0566099 0.136533 -0.00462162 +-0.0137664 0.0742812 -0.0386456 +-0.0253123 0.0865272 0.0518462 +0.0391332 0.0800655 -0.0117735 +-0.0595022 0.0987448 0.042776 +-0.031899 0.0792306 -0.0315346 +-0.074881 0.117904 -0.00727699 +-0.0755718 0.165165 -0.0201548 +0.0408155 0.0939721 0.0292858 +-0.0854938 0.096523 0.0281673 +-0.0644931 0.105621 0.039804 +-0.0196701 0.0554437 -0.0324495 +0.0139693 0.112639 -0.017366 +-0.00232624 0.124886 -0.00844394 +-0.0617679 0.0824635 -0.0193558 +-0.0599121 0.0588939 0.00621161 +-0.0826266 0.146034 0.0392943 +-0.0649084 0.165706 -0.0272764 +-0.0602113 0.0697286 0.0375341 +-0.00175042 0.0897209 -0.0353687 +-0.0275054 0.107176 -0.0215083 +-0.062122 0.0429616 0.0266943 +0.032428 0.0625798 -0.0177725 +-0.0663881 0.0677373 0.0326703 +-0.02076 0.0347198 -0.0277376 +-0.0519381 0.0597689 0.0297286 +-0.0595413 0.0582322 0.0158865 +-0.0445568 0.151229 -0.00569012 +-0.0210951 0.12531 -0.000542597 +-0.020213 0.178617 -0.0227863 +-0.00769265 0.0388371 -0.00333188 +-0.0344924 0.09037 0.0442186 +-0.0786032 0.107051 0.0327104 +-0.0434904 0.12843 0.000929671 +-0.058473 0.115363 0.0369711 +0.045085 0.0833373 0.00221176 +-0.0384977 0.0648621 0.0416261 +-0.0407478 0.0768336 -0.0187281 +-0.0578796 0.102621 -0.0187883 +-0.0846144 0.128516 0.0502768 +0.0170529 0.075444 0.0528157 +-0.018505 0.0786406 0.056357 +-0.0752579 0.0874199 0.0393733 +0.043967 0.0636126 -0.00172463 +-0.0914628 0.146095 0.0181484 +-0.0294715 0.117536 0.0312989 +-0.0581079 0.0480417 -0.000353036 +-0.0384621 0.172216 -0.000421117 +0.0412086 0.0684033 0.0296357 +-0.0332986 0.0384796 -0.0137148 +-0.0549774 0.0335456 0.00467992 +0.00953694 0.103082 0.0459273 +-0.048193 0.133027 0.0241926 +0.00364343 0.0960341 -0.0296841 +-0.0809226 0.0926448 0.0335946 +0.0316471 0.05126 -0.00972402 +-0.0622205 0.164668 -0.0515889 +0.0257137 0.0591918 0.0440938 +-0.0116637 0.0384284 0.00907266 +0.00758624 0.0341288 -0.016561 +-0.0732628 0.0731075 0.0335988 +0.0105031 0.0347322 0.0422156 +0.0273613 0.0592959 -0.0217662 +-0.0329323 0.126815 0.00921204 +-0.0462425 0.0615364 0.0381535 +0.00735972 0.130718 0.020957 +-0.0618449 0.152018 0.0348716 +-0.0311962 0.0475489 -0.0247586 +-0.0384898 0.113893 0.0344296 +-0.0268492 0.155368 -0.00477229 +0.0138974 0.0344287 -0.0156692 +-0.0374813 0.169748 0.00157136 +-0.0892091 0.137796 0.0122163 +-0.0705026 0.0958452 0.0418601 +-0.0862013 0.10903 0.0113533 +-0.0682521 0.15944 -0.00832765 +0.038441 0.100665 0.0293761 +-0.0639313 0.11526 -0.0113233 +-0.0664444 0.151761 -0.0404644 +0.0142088 0.034798 0.0302902 +-0.0244166 0.0931902 0.0479432 +-0.0714792 0.167875 -0.0225174 +-0.0161203 0.0383572 0.000963241 +0.0282773 0.0862159 0.0445154 +0.0375 0.107296 0.0262149 +-0.0891989 0.11586 0.044703 +0.00339178 0.0433892 -0.0247833 +-0.0790801 0.0704064 0.00826811 +-0.0237813 0.0756129 -0.0382516 +0.00190837 0.124868 -0.00847893 +0.0243137 0.119818 0.0300741 +-0.0758951 0.123764 -0.00763971 +0.052991 0.0735097 0.0116286 +-0.0175974 0.0393048 -0.0277532 +-0.013784 0.0799171 -0.0389774 +0.00451197 0.0619711 0.0562284 +-0.0331612 0.0342582 0.0246899 +0.0314823 0.114431 0.0284596 +-0.0530088 0.145722 -0.00115007 +-0.0684496 0.0369814 0.0129839 +-0.0203772 0.158233 -0.00725915 +0.0148967 0.0366228 -0.0205744 +-0.0250413 0.0925197 -0.0322644 +-0.0424949 0.168218 0.00285877 +-0.0414982 0.0719267 0.042103 +-0.0939163 0.120093 0.0142993 +-0.0164902 0.112704 0.0398029 +-0.000484486 0.0703477 0.056848 +0.060415 0.0678562 0.0151973 +-0.0550635 0.116914 0.036091 +0.0200483 0.0385661 -0.0116898 +-0.0250588 0.123734 -0.00291588 +0.0403936 0.0629925 0.0301493 +0.0379656 0.0874795 0.0356781 +-0.0548923 0.105518 -0.0186699 +-0.0311396 0.166714 -0.0162904 +0.0470624 0.0740285 0.0123586 +-0.0678676 0.100922 -0.0154166 +-0.0631629 0.124137 0.0456282 +-0.0731746 0.154066 -0.0319096 +-0.0307727 0.033545 -0.0254394 +-0.0890856 0.122978 0.0464209 +-0.0236634 0.123398 -0.00459221 +0.046259 0.0820395 0.0071847 +-0.000605347 0.130433 0.0223861 +0.0192013 0.0591556 0.0487522 +-0.0498987 0.124057 -0.00910218 +-0.0170638 0.168326 -0.0143421 +0.0265398 0.104204 -0.0163559 +-0.0938575 0.120136 0.0242923 +-0.0179474 0.100123 -0.0240926 +-0.058599 0.155538 0.0184341 +-0.0170777 0.0418831 0.0522589 +-0.0545484 0.0457621 -0.00683862 +0.00723985 0.076824 -0.0341303 +-0.0907031 0.148891 0.0231421 +-0.0174825 0.107148 0.0420092 +-0.0911131 0.129682 0.0362351 +-0.0499113 0.147776 0.0118822 +-0.0657818 0.152842 -0.0413063 +0.0528515 0.0592232 -0.00323634 +-0.0693828 0.0805427 0.0408087 +-0.060108 0.0423138 0.0158374 +0.0281616 0.0699505 0.0424355 +0.00679863 0.0347495 0.0432322 +-0.0458268 0.125298 0.0247658 +-0.0567225 0.043789 0.0226896 +-4.09913e-05 0.10064 0.0465907 +-0.0729374 0.129655 -0.00843737 +0.0415013 0.104244 0.010161 +0.0342459 0.0889575 0.0408509 +-0.0808289 0.138985 -0.00281163 +-0.0425095 0.171123 -0.00130836 +-0.0870569 0.137884 0.0425258 +0.00149552 0.116934 0.0397718 +-0.0158011 0.0388262 -0.0105326 +0.00549603 0.0413259 0.0457036 +-0.0325959 0.124521 0.0211556 +-0.058912 0.109738 -0.0167726 +-0.0772259 0.151416 -0.00590086 +-0.0077735 0.0770379 -0.0376668 +0.0385932 0.0436441 0.0291648 +-0.0778914 0.162484 -0.0299302 +-0.0641074 0.0639595 0.0276548 +0.0187103 0.0342934 0.0023932 +-0.0858293 0.151702 0.00893089 +0.0336067 0.0504819 0.0325279 +-0.0810076 0.10869 -0.00259876 +-0.0557401 0.0547516 -0.00240302 +-0.0335154 0.108413 0.0382413 +-0.00564795 0.049654 -0.0307584 +-0.0765497 0.0728479 -0.00560245 +-0.00214115 0.127727 0.0291435 +-0.0701217 0.159568 -0.0479252 +-0.0794787 0.104524 -0.00660043 +0.00849938 0.0366585 0.0454484 +-0.0305059 0.0889327 0.0438397 +-0.0638439 0.101082 -0.0177706 +-0.0045041 0.0801506 0.0577231 +0.013232 0.0835986 -0.0303791 +-0.0809796 0.0788834 0.0298322 +-0.0148841 0.0959887 -0.031739 +-0.0699437 0.0669048 0.0273786 +-0.0514117 0.134659 0.0288827 +0.0105257 0.123354 0.0336723 +0.0263222 0.107421 0.038207 +-0.0125183 0.095238 0.0536312 +-0.0634853 0.0904216 0.0451002 +0.0377424 0.110293 0.0150624 +-0.0700913 0.0419644 0.00613646 +-0.0565326 0.0401709 -0.00945456 +-0.0553504 0.0460785 0.0138247 +-0.0114916 0.0759418 0.0571389 +-0.0796666 0.0886389 0.0352895 +0.0338998 0.0888046 -0.0179815 +-0.0207237 0.0567772 0.0467736 +0.0293267 0.120376 0.00767428 +-0.0865466 0.137714 0.00320362 +-0.0815177 0.106 -0.00361682 +0.0360857 0.0784054 -0.0147648 +-0.0706254 0.129856 0.0506426 +0.0309103 0.088937 0.0430941 +0.0186908 0.127724 0.0151265 +0.0607002 0.0665033 0.01416 +-0.0347226 0.0711465 -0.0183854 +-0.0475247 0.0335798 -0.00289187 +0.00330662 0.0597508 -0.0323981 +0.0162777 0.117973 -0.0131407 +0.0260142 0.118212 -0.00538239 +-0.0524983 0.0477783 0.0397646 +0.00462528 0.109546 0.0419595 +-0.0848442 0.146005 0.0372765 +-0.0568876 0.0998079 -0.0197942 +-0.0478768 0.15504 0.00962757 +0.0236771 0.0956901 -0.0213272 +-0.0909699 0.113313 0.018324 +-0.0314956 0.0560344 0.0371147 +0.0419523 0.101425 0.00119033 +-0.0205212 0.118181 0.0347958 +0.00296971 0.0341513 0.00863676 +-0.0034922 0.0473569 0.0490622 +0.0168587 0.0347265 0.0236529 +-0.00422658 0.0396088 0.0480089 +0.0402871 0.104196 0.0211608 +-0.0211382 0.0985478 0.044502 +-0.0469324 0.0383628 -0.0152843 +0.0223386 0.0578809 -0.0262309 +-0.094679 0.122825 0.0202733 +-0.00649716 0.0619561 0.0561245 +-0.0530923 0.143138 0.0243879 +0.0586666 0.0690768 0.00715872 +-0.0632884 0.0444363 0.0372932 +-0.0584087 0.0421172 0.0451764 +0.0462769 0.0649494 -0.00109094 +-0.0892011 0.0983026 0.0104143 +-0.050311 0.033406 0.00395206 +-0.0171117 0.123425 0.0297114 +-0.0067867 0.0784694 -0.0378945 +-0.0413793 0.0448727 -0.0203291 +0.00613123 0.105885 -0.0208912 +-0.0209654 0.035527 0.0525237 +0.0515169 0.0664883 0.0274059 +-0.0186581 0.0985081 0.0446525 +0.00326552 0.127077 0.029619 +0.00950248 0.111292 0.0396928 +0.0420852 0.077848 0.0291974 +-0.0404715 0.0343242 0.0319689 +-0.0775002 0.156948 -0.0139048 +-0.0828255 0.0924347 -0.00656966 +-0.0256554 0.124701 0.019279 +0.00649798 0.107134 0.0414437 +-0.0067083 0.0613544 -0.0352012 +-0.0341277 0.165212 -0.0151261 +-0.0305288 0.0353431 -0.0195833 +0.00449494 0.105757 0.0421851 +-0.0313565 0.161046 -0.00157639 +0.00317447 0.0908801 -0.0331491 +-0.066706 0.0375681 0.0351923 +0.0146203 0.128223 0.0236197 +-0.0931816 0.121543 0.0372829 +-0.0390449 0.0344196 0.0339502 +0.0204938 0.0865196 0.0494812 +-0.0909512 0.147073 0.025026 +-0.0398753 0.149194 -0.00215183 +0.0371767 0.095465 0.0345819 +-0.0534525 0.116245 -0.0149003 +-0.00912597 0.168128 -0.0227626 +0.0103593 0.0509634 -0.0286117 +0.00839042 0.0434178 -0.024623 +0.012125 0.10869 -0.0190017 +-0.0749621 0.134014 -0.00721966 +-0.0789216 0.172194 -0.0440002 +-0.0258331 0.0561399 -0.0284181 +-0.0817922 0.143171 0.000171875 +0.0451306 0.0647669 -0.000900002 +-0.0514821 0.113924 -0.0164877 +0.00371763 0.0346901 0.0426483 +-0.0475701 0.0461114 -0.0100167 +0.0406981 0.104234 0.0181671 +-0.0453678 0.060156 0.0387657 +-0.0314314 0.0693522 -0.0254564 +-0.0154911 0.0702181 0.054969 +-0.0300755 0.123175 0.0220771 +-0.0216491 0.0479362 -0.0281524 +-0.0507589 0.144713 0.0133585 +-0.0670917 0.155954 0.0255845 +-0.0852375 0.1104 0.00532111 +-0.0573508 0.121267 0.0398601 +-0.0261065 0.0944666 -0.0262366 +-0.0897054 0.124293 0.0455762 +-0.000486036 0.047441 0.049521 +-0.0438029 0.167379 0.00334272 +0.0111963 0.0864748 -0.0310924 +0.0464517 0.0750534 0.00718936 +-0.036486 0.0619956 0.0409573 +-0.0314993 0.116609 0.0322344 +-0.0544997 0.117303 -0.0139925 +-0.0420673 0.0336103 0.00544111 +-0.0856626 0.0912736 -0.00055353 +-0.050495 0.0974075 0.0440057 +0.0309311 0.0355864 0.0055308 +0.0202177 0.109327 -0.0158556 +0.0249428 0.0968855 0.0450153 +-0.00751 0.070341 0.0568254 +-0.0604012 0.0335984 -0.00916237 +0.0245092 0.0406191 -0.00557292 +-0.0451779 0.152141 0.00822921 +-0.0607654 0.0668786 0.0346016 +-0.0593188 0.114075 -0.0145597 +-0.091214 0.143385 0.025163 +-0.0425978 0.0505652 -0.0109174 +-0.0423266 0.169779 -0.00887745 +-0.0224756 0.0348012 0.0476768 +0.0409735 0.0405135 0.0215425 +-0.0801239 0.110623 0.0438367 +-0.0138651 0.0987904 -0.0246748 +-0.043573 0.126043 -0.00725208 +-0.0208606 0.101617 -0.0238418 +-0.0425016 0.0605517 0.0404213 +-0.00249479 0.0590139 0.0541301 +0.0409984 0.102803 0.000176721 +0.0342014 0.0808856 0.0407312 +-0.0247835 0.166781 -0.00970724 +0.00931572 0.0725689 0.0556419 +-0.0642124 0.145356 0.038849 +-0.0716272 0.0748459 -0.0119866 +-0.012533 0.0458468 0.048979 +-0.0741728 0.15268 -0.0288898 +-0.0211868 0.174176 -0.0217698 +-0.054499 0.0761691 0.0426143 +-0.0851934 0.11068 0.0373035 +-0.00964195 0.120097 -0.0132573 +0.0149745 0.129329 0.00806984 +-0.0535552 0.0335918 0.0121227 +0.0387224 0.1084 0.018173 +-0.0858928 0.108988 0.00834067 +0.00426552 0.0697141 -0.0335935 +0.0304509 0.117992 0.000957505 +-0.0134723 0.0603845 0.0536243 +-0.0809665 0.133877 -0.00363658 +-0.0877284 0.0950339 0.0247524 +-0.0708769 0.155921 0.00969704 +-0.0388302 0.173903 -0.00342781 +0.0123125 0.0680946 -0.0309662 +-0.0540561 0.150161 -0.00256907 +-0.0662654 0.129803 0.0463681 +-0.0481341 0.0344887 0.0319692 +-0.0482356 0.137094 0.0133979 +-0.0638562 0.148524 -0.023921 +-0.0873971 0.140576 0.0399568 +-0.0920359 0.126943 0.0332532 +0.00766079 0.0616753 0.0549139 +-0.0820513 0.0882817 -0.00662822 +-0.0583711 0.0614813 0.0257087 +-0.046355 0.0345569 0.0357917 +0.0473411 0.0488863 -0.00367878 +0.0292435 0.0637114 -0.0199317 +-0.0250309 0.172718 -0.0117738 +0.0423872 0.0459654 -0.00393846 +-0.0484976 0.0805051 0.0439961 +-0.0497297 0.0737805 -0.0165746 +0.0463736 0.0682111 0.00160519 +-0.0334339 0.166782 -0.00461644 +-0.0772978 0.0685904 0.0138065 +-0.0645607 0.153661 0.00110457 +0.00849221 0.108496 0.0406568 +-0.0554287 0.1598 0.000101402 +-0.0412715 0.127285 -0.00254236 +-0.080968 0.0967089 0.0335048 +0.0225187 0.123964 0.0251042 +-0.0559057 0.0379831 0.047068 +-0.0594802 0.0716799 0.0395512 +-0.0618223 0.170491 -0.0617288 +-0.0564955 0.104323 0.0414899 +-0.0810442 0.152541 0.00426923 +-0.0435828 0.0345782 0.0398547 +0.0126008 0.128196 0.0257553 +-0.0526679 0.0579784 0.0235498 +0.0380115 0.110174 0.0108643 +0.0150842 0.114728 -0.0156323 +0.0148813 0.0348012 0.0286151 +-0.0479877 0.121051 0.028756 +-0.0883678 0.128089 0.00227451 +-0.0720422 0.15541 -0.0389078 +0.0112474 0.0724264 -0.0317987 +0.0267956 0.111385 0.0354031 +-0.0649586 0.160381 -0.0157887 +0.00550295 0.0702783 0.0558582 +-0.0238067 0.0899629 -0.0356649 +-0.090988 0.113988 0.0207121 +0.0194892 0.0934174 0.0476186 +-0.0655537 0.161293 -0.0160037 +-0.0625236 0.0609176 -2.19725e-05 +-0.0491589 0.162483 -0.00556124 +-0.042649 0.0378778 -0.0263104 +0.00374161 0.0952291 -0.0308324 +0.025598 0.0610493 -0.0236458 +0.00942462 0.0375116 -0.02327 +-0.00136682 0.125668 -0.00729488 +0.008486 0.0532759 0.0521458 +-0.00749086 0.0675042 0.0558082 +-0.092697 0.117351 0.0113077 +0.0251837 0.112665 -0.0114294 +-0.04997 0.140123 0.00440621 +-0.0534339 0.040168 0.0467985 +-0.0936376 0.124116 0.0132691 +-0.0222759 0.0382517 0.00526325 +0.0600635 0.0664445 0.00913698 +-0.0224559 0.092554 -0.0342812 +0.0582887 0.0538074 0.00917936 +0.046059 0.0834308 0.0121726 +-0.0619009 0.0678892 0.0352357 +-0.0566658 0.0473318 0.0108617 +-0.0457003 0.0694971 -0.0160523 +-0.0618544 0.174099 -0.0565963 +-0.0498016 0.128288 0.0314623 +-0.0225807 0.159177 -0.00302445 +-0.0623624 0.16436 -0.0595797 +0.0383958 0.0505315 -0.00659356 +-0.0332433 0.126938 0.0135159 +-0.0454819 0.0875316 0.0441596 +-0.0835389 0.110217 0.0023021 +0.0386074 0.0617702 0.0328492 +-0.0407686 0.0811968 -0.0203079 +-0.033827 0.0901076 -0.0243377 +0.0506567 0.0703381 0.00346635 +0.0228724 0.125195 0.0195238 +-0.0187529 0.0384803 -0.00337678 +0.0222732 0.12205 0.0293193 +-0.0294959 0.0645466 0.0380401 +-0.0689565 0.166538 -0.0215879 +-0.00506288 0.0387211 0.00101779 +-0.0647592 0.169439 -0.0415812 +0.00438439 0.037904 -0.00378653 +-0.0241621 0.125878 0.0168174 +0.0359934 0.0685324 -0.0147875 +-0.0182052 0.0381955 0.0170088 +-0.0753414 0.15612 0.015399 +0.0453867 0.0413474 0.00824507 +-0.00449218 0.123763 0.0343217 +0.0460213 0.0862262 0.00917159 +0.0346496 0.0972102 -0.0129196 +0.0196844 0.126554 0.00410284 +0.0202619 0.12651 0.00572713 +-0.00449958 0.0504123 0.0519892 +-0.0899789 0.133805 0.0362152 +0.00988218 0.0886651 0.0547874 +-0.00395268 0.131078 0.00966125 +0.00346471 0.0977538 0.051238 +-0.0236164 0.0422618 -0.0289626 +-0.0253603 0.124214 -0.00135534 +-0.00744498 0.124256 -0.00972454 +-0.0577765 0.0494102 0.000630355 +-0.0321623 0.172645 -0.015639 +-0.0661377 0.0669804 0.0316196 +-0.0240269 0.158277 -0.0107707 +-0.0762359 0.113613 0.0494664 +-0.0849952 0.141833 0.00418636 +-0.0569251 0.0366412 0.0466659 +-0.0283222 0.0749245 0.042497 +0.0216856 0.0878179 -0.0250022 +-0.0866951 0.0951098 0.0265657 +0.0296006 0.0982071 0.041203 +-0.0630317 0.060472 0.0203248 +-0.0304883 0.0574252 0.0370157 +-0.0638466 0.159519 -0.0168205 +-0.0544959 0.0848124 0.0452537 +0.0243406 0.113099 -0.011895 +-0.0900837 0.117534 0.0447346 +-0.00144097 0.0378708 0.018909 +-0.0699808 0.136988 -0.00795948 +-0.0823654 0.0815422 -0.00354068 +-0.00681555 0.0385421 0.0244437 +0.00431168 0.0611153 -0.0319161 +-0.0801269 0.10608 0.0309775 +0.0162329 0.0807169 -0.0293214 +-0.0158843 0.0377689 0.0515755 +-0.0829013 0.122118 -0.00412754 +0.0294673 0.106706 -0.01303 +-0.0534948 0.11254 0.0358256 +0.00150254 0.0605844 0.0560506 +-0.0234977 0.101642 0.0439992 +-0.0797566 0.074638 -0.000471413 +-0.00773143 0.0670178 -0.0355816 +-0.0705055 0.0342009 0.00809348 +0.0167377 0.0461846 0.0432665 +0.00646432 0.110948 0.0411124 +-0.0194753 0.160592 -0.0133076 +-0.00449865 0.115591 0.0404715 +0.0280707 0.046664 -0.00969251 +0.048051 0.0496945 0.0288529 +-0.0763852 0.114637 0.0504008 +-0.0886058 0.150235 0.0251076 +-0.0211531 0.0382979 0.0271326 +0.0408293 0.101363 -0.00180736 +-0.0203988 0.177179 -0.0155929 +-0.0718351 0.180364 -0.0513557 +0.00724322 0.0361893 0.0456372 +0.0124253 0.0374345 -0.0223624 +0.0378254 0.108706 0.0222481 +-0.0871672 0.127065 0.0471934 +-0.0686541 0.12565 0.0517171 +-0.0889642 0.136517 0.0281982 +-0.0304896 0.0559845 0.0366491 +-0.0839703 0.0843113 0.0284366 +-0.00895133 0.0384401 0.00779513 +-0.0942308 0.126903 0.0192529 +-0.0569855 0.0507747 0.00670607 +-0.063488 0.037094 -0.00797583 +0.0252887 0.122228 0.0247087 +-0.0433541 0.112279 -0.0167951 +-0.0255625 0.0532992 -0.0274025 +-0.00849647 0.0532799 0.0524507 +-0.0074932 0.0842694 0.0572981 +-0.0760467 0.0689134 0.00354542 +-0.0518697 0.144272 -0.000239851 +0.0302023 0.0808798 0.0437374 +-0.0276563 0.12199 -0.007026 +-0.0484978 0.100158 0.0428666 +-0.0654874 0.143443 -0.0120814 +-0.0308113 0.153953 -0.00248259 +0.0597604 0.0567164 0.0141707 +-0.0480122 0.0341726 0.0287503 +-0.0640462 0.0622661 0.0238361 +-0.0206969 0.0568414 -0.0326165 +0.0309722 0.116471 -0.00147933 +-0.0691516 0.0788347 0.0401452 +-0.058803 0.0883 -0.0207912 +0.00672447 0.0346721 0.0378883 +-0.0746893 0.154119 0.0302893 +-0.0529585 0.135327 0.0304274 +0.00863241 0.128438 -0.00238911 +-0.0478493 0.099947 -0.0217978 +-0.075086 0.0674684 0.00355063 +0.0326927 0.116394 0.0217802 +-0.0842229 0.144678 0.0395137 +-0.0166094 0.128602 0.0136868 +0.00411662 0.125005 -0.00865855 +-0.0754818 0.148362 0.0406222 +-0.065886 0.15405 -0.00011759 +-0.0425085 0.119367 0.0297171 +-0.0902093 0.131023 0.0402096 +0.0383601 0.0921445 -0.0115002 +-0.038495 0.0804525 0.0431634 +-0.0353039 0.0794833 -0.0226806 +0.0441637 0.0973591 0.0111613 +-0.0590115 0.153958 0.00054242 +0.0453728 0.0735622 0.00221503 +0.0569193 0.0710092 0.00714855 +-0.0114956 0.105842 0.0433599 +-0.0698279 0.181394 -0.0549266 +0.0375934 0.102015 0.0299178 +0.00590625 0.0356875 -0.00331654 +-0.0684622 0.16137 -0.0113077 +-0.0742229 0.109724 0.0423296 +-0.0202504 0.182971 -0.0220384 +-0.091455 0.148836 0.0171378 +0.0152238 0.0793568 -0.0300519 +-0.000512 0.107246 0.0433248 +-0.0428418 0.0971034 -0.0220359 +-0.0514947 0.0819216 0.0442721 +-0.00625132 0.0383797 0.0174726 +0.0252504 0.0789879 -0.0247523 +-0.0833347 0.0898073 0.030438 +-0.0509182 0.146274 0.0133981 +0.0202304 0.105998 0.0417108 +0.0571307 0.0508797 0.0151878 +-0.0330104 0.126012 0.0180287 +-0.0217816 0.0797281 0.0555871 +-0.00743438 0.120242 -0.0134406 +-0.0148225 0.086924 -0.0385597 +-0.0375897 0.174214 -0.00298303 +-0.00244861 0.0605864 0.0553645 +-0.00874133 0.128614 -0.000328304 +-0.00579055 0.0798611 -0.0376463 +-0.0096155 0.119132 -0.0142361 +0.000497149 0.0534577 0.0541163 +-0.0928025 0.131035 0.0222365 +0.0372258 0.108268 -0.000834485 +-0.0914674 0.129551 0.00825277 +-0.00149557 0.0675596 0.0566557 +0.0154848 0.0548588 0.0485877 +0.0396568 0.0815034 -0.0117853 +0.0174985 0.119533 0.0343583 +-0.0108678 0.0975625 -0.0293851 +0.0264007 0.116693 0.0313169 +0.005469 0.0964333 0.0520715 +-0.0455856 0.128182 -0.00140207 +-0.0175003 0.0499225 0.0470061 +-0.075934 0.0788992 0.0351468 +-0.0067913 0.0812637 -0.0377236 +-0.0769778 0.155918 0.0162848 +-0.0797877 0.0746142 -0.00147983 +-0.0599651 0.0469723 0.0336736 +0.0382386 0.084194 -0.0147697 +-0.0816947 0.113482 0.0465399 +0.00634478 0.0524665 -0.0299091 +-0.0112874 0.182441 -0.0284978 +-0.026226 0.178551 -0.0179991 +-0.0739945 0.1802 -0.0521965 +0.0105211 0.104445 0.0448284 +0.0580719 0.0523893 0.015182 +-0.0525108 0.0819776 0.0447141 +0.0148643 0.0961115 -0.0237665 +-0.00147854 0.0474532 0.049375 +0.00669444 0.0340637 0.00205518 +-0.0753884 0.151441 -0.0109145 +0.0413586 0.0394374 0.00625535 +-0.0196125 0.0381064 0.0149924 +-0.00986994 0.104508 -0.0232523 +-0.0720157 0.145244 -0.0182167 +0.0416371 0.0669849 0.0284796 +0.0284741 0.0381475 -0.00163189 +0.0474976 0.06778 0.0262203 +0.0259166 0.0434925 0.0371741 +0.0464333 0.0455453 -0.00066213 +-0.00640927 0.120163 -0.0133583 +-0.0236376 0.0387148 -0.0157231 +-0.092269 0.124069 0.00827163 +0.0144954 0.119572 0.0352389 +-0.0702988 0.15533 -0.0489684 +-0.0882036 0.143298 0.0111345 +-0.074863 0.0795889 -0.0115995 +-0.0174424 0.10313 -0.0232301 +-0.0686182 0.0628687 0.0026871 +-0.0620712 0.16624 -0.0525885 +0.058207 0.0538058 0.0191798 +-0.0333511 0.0463754 -0.0256604 +-0.0855025 0.0832965 0.0214753 +-0.0920057 0.11611 0.0343124 +-0.0227771 0.124071 -0.00329832 +-0.0610006 0.129721 0.0398956 +-0.0404973 0.0492165 0.0395965 +-0.0481836 0.0335793 0.00422402 +-0.0654948 0.160255 -0.0145439 +0.00736856 0.0479637 -0.0273222 +-0.0123571 0.12972 0.0137799 +0.0579783 0.0551346 0.00616127 +-0.0164763 0.064491 0.0530345 +-0.0608155 0.0896295 -0.0193008 +-0.0205289 0.0958269 0.048234 +-0.086716 0.132512 0.0465811 +-0.052836 0.095613 -0.0220115 +0.0406946 0.0647331 -0.00578164 +0.0121697 0.0950562 -0.0266386 +-0.00950093 0.0925586 0.0561384 +-0.0157375 0.0671877 -0.037968 +-0.0269293 0.0376983 0.0192799 +0.033595 0.0660055 0.039722 +-0.0481741 0.135565 0.0182752 +-0.0224128 0.163867 -0.00803238 +0.00810708 0.101446 -0.0211916 +-0.0458977 0.166944 -0.00688513 +-0.0238738 0.105835 -0.0226784 +0.0272653 0.121002 0.0240179 +-0.0701585 0.0623473 0.0172092 +0.0578867 0.0607943 0.0238444 +0.0565638 0.0695327 0.00435815 +0.012216 0.0753282 0.0545969 +-0.0583609 0.0339112 0.0215144 +-0.0664905 0.0861274 0.0441111 +-0.0514869 0.0987554 0.0433116 +0.0210708 0.0349944 0.0242708 +-0.0102986 0.126308 0.029096 +-0.0638201 0.089594 -0.0189434 +-0.0782747 0.174383 -0.0433933 +-0.0311143 0.16374 -0.0152454 +-0.0915885 0.128321 0.0362439 +-0.0379874 0.0336299 0.0062497 +-0.0854294 0.151325 0.0282936 +0.0124994 0.0909598 0.0531045 +-0.0434452 0.120253 -0.0131867 +0.0229768 0.0754886 0.0490742 +-0.0334786 0.100129 0.0429194 +-0.0741118 0.0819105 0.0384161 +0.0373216 0.0901862 0.036514 +-0.0565657 0.11693 0.0374284 +0.00334719 0.0481602 -0.0292882 +-0.0324526 0.0336078 -0.0239554 +0.0083446 0.116042 -0.0170347 +-0.00977658 0.0387467 -0.00366788 +-0.0206679 0.0509474 -0.0298149 +-0.0242736 0.181474 -0.0180054 +0.0160525 0.0350115 0.0395034 +-0.0543014 0.146215 0.0264084 +-0.00102573 0.0346607 0.0434939 +-0.0611888 0.155469 0.00589931 +-0.0406241 0.0520111 -0.0110025 +-0.0705109 0.148356 0.0407257 +0.0495286 0.0610841 0.0304744 +-0.019145 0.0893155 0.0554734 +0.00268229 0.12726 -0.0050686 +-0.0743228 0.155495 -0.0229079 +0.021268 0.0762952 -0.0266753 +-0.0239356 0.0374925 -0.0183912 +0.0262803 0.0660857 -0.0226574 +-0.0164998 0.0856439 0.0570811 +-0.0857415 0.120359 0.048887 +-0.0344903 0.0505305 0.0383369 +0.00230798 0.0346028 0.0406387 +-0.0929029 0.129672 0.0252445 +-0.0654938 0.0604629 0.00727621 +0.044722 0.0833037 0.0012072 +-0.0230106 0.0580182 0.0433839 +-0.0105663 0.0350401 0.0482738 +0.0582293 0.0690671 0.00613614 +-0.0600127 0.131125 -0.00733582 +-0.0321751 0.162395 -0.00280539 +-0.0555013 0.0623754 0.0293782 +-0.0252415 0.109687 -0.0201254 +-0.0560506 0.150155 -0.00188433 +-0.0600649 0.129705 0.039485 +0.0338293 0.0767952 -0.0167877 +0.01215 0.0919974 -0.0294248 +-0.0346452 0.0340944 0.0173387 +-0.050492 0.149246 0.012837 +-0.0550682 0.150156 -0.00218973 +-0.00881167 0.085499 -0.0379404 +-0.0780101 0.11134 -0.00369811 +-0.0795926 0.100727 0.0334268 +-0.0423449 0.122373 -0.0114097 +0.0248097 0.124191 0.0159771 +-0.0174692 0.0529782 0.0491698 +-0.0889728 0.101008 0.0133925 +0.00851959 0.0730626 0.056014 +-0.026729 0.159626 -0.000161004 +0.0222613 0.0720727 -0.026869 +0.0396492 0.0970274 -0.00677557 +-0.0301141 0.166809 -0.00684471 +-0.00834781 0.129635 0.0224773 +-0.0198097 0.0813191 -0.0390949 +-0.0489315 0.137078 0.0173942 +-0.0161123 0.0985355 -0.0244159 +0.0331161 0.0795687 -0.0187107 +-0.0365028 0.0761422 0.0420368 +-0.0315196 0.0834471 -0.0305496 +-0.0366299 0.0534085 -0.0105028 +-0.0844928 0.0979861 -0.00258986 +-0.049695 0.0693575 -0.0143663 +-0.0795053 0.148405 0.0389114 +-0.0143105 0.0338147 -0.022462 +-0.036834 0.0382539 -0.0105119 +-0.0528967 0.0476266 0.0236645 +-0.0431625 0.0436516 -0.0173214 +0.0442909 0.0959534 0.0041727 +-0.0499053 0.141681 0.0133989 +-0.084567 0.0897523 0.028848 +-0.035736 0.0740102 -0.0187661 +-0.0624191 0.163107 -0.0445959 +0.0553692 0.0711293 0.0213817 +-0.0384984 0.0634699 0.041507 +-0.0420929 0.156178 -0.00917116 +-0.0641565 0.166823 -0.0341745 +-0.0623968 0.162983 -0.056654 +0.0276466 0.0659543 0.0434322 +0.0454314 0.088986 0.0031764 +-0.0749519 0.164602 -0.018207 +-0.0345505 0.175605 -0.011982 +0.0363374 0.104678 0.0298648 +-0.00375231 0.128091 -0.0038931 +-0.0305006 0.100206 0.0434038 +-0.00849625 0.0547108 0.0528122 +-0.0485842 0.0517801 -0.00897412 +-0.00451507 0.0519264 0.0531932 +-0.0815948 0.0748474 0.0175368 +0.0572159 0.0648465 0.024658 +-0.0403921 0.162356 0.00287494 +-0.0749222 0.126715 -0.00818803 +-0.047238 0.0346371 0.0407654 +-0.0621416 0.141343 -0.00629843 +-0.0251564 0.113713 -0.0163747 +-0.00855727 0.119157 -0.0142712 +-0.074494 0.126019 0.0529923 +-0.0205102 0.0461853 0.0521703 +-0.084864 0.0789836 0.0191297 +-0.0187649 0.125661 -0.000995534 +-0.0218427 0.0567021 0.0450804 +-0.0622179 0.153696 -0.0295936 +-0.0364968 0.0576627 0.0395237 +-0.0368019 0.127806 0.00485952 +-0.0770975 0.0967852 0.0367 +-0.000433486 0.0366062 0.0184413 +0.0131024 0.123925 -0.00754958 +-0.0177683 0.0383192 0.0242073 +-0.0655356 0.0398001 0.0300899 +-0.0778591 0.161105 -0.0269202 +-0.0341012 0.162237 -0.0142117 +-0.017501 0.0842912 0.0575736 +-0.0280973 0.16079 -0.0140776 +-0.0421185 0.122004 0.0266511 +-0.0142563 0.178628 -0.0276625 +-0.0440063 0.0629698 0.0401358 +0.0128613 0.0347903 0.0336338 +-0.0248532 0.0348299 0.0453939 +-0.00152849 0.105863 0.0439958 +-0.0346038 0.123422 0.0248791 +-0.0346304 0.079471 -0.0235463 +-0.0639625 0.126764 -0.00871214 +0.0364026 0.0547846 -0.00674979 +-0.0064883 0.123768 0.0340789 +-0.0470974 0.168427 -0.00297818 +-0.0575443 0.0401418 -0.00909914 +0.0257874 0.0895854 -0.0228249 +0.0183006 0.0383341 -0.0177245 +-0.0524963 0.0848256 0.0453696 +0.0561175 0.0494119 0.0111925 +-0.0588172 0.123244 -0.00816875 +-0.00922198 0.0384881 0.0221926 +-0.0331235 0.126633 0.00621772 +-0.0119418 0.120727 -0.011899 +-0.0607049 0.145387 0.0368926 +-0.0306093 0.125854 0.0144859 +-0.0356146 0.127659 0.0111781 +-0.0776104 0.0802915 -0.00928059 +-0.0702074 0.0394853 -0.000301673 +0.0434891 0.0583702 0.0316051 +-0.0789513 0.128091 -0.00607242 +-0.042519 0.0534194 0.039352 +-0.00449744 0.0939058 0.0556112 +-0.0094927 0.0619497 0.0558121 +-0.0694824 0.0944579 0.0422945 +-0.0771177 0.0879695 -0.0126012 +0.014854 0.103191 -0.021265 +-0.043284 0.169832 -0.00794427 +-0.00983007 0.124748 -0.00821099 +0.048512 0.0692789 0.0025489 +-0.0620323 0.0343503 0.0308946 +-0.074493 0.145596 0.0437863 +-0.0375024 0.104216 0.0394845 +-0.047499 0.0451812 0.0421654 +-0.0836103 0.0769236 0.0176347 +-0.0636092 0.170093 -0.0469941 +-0.0483594 0.137097 0.0143972 +-0.087232 0.102325 0.0223672 +-0.035507 0.104243 0.0399833 +-0.0577119 0.0708497 -0.0156457 +-0.00436115 0.122059 -0.0113929 +0.0024069 0.037633 -0.0245625 +0.00251114 0.0911189 0.0554408 +-0.0357211 0.0710689 -0.0174927 +0.0183807 0.0432425 -0.0223469 +-0.0688327 0.09803 -0.0157395 +-0.0747491 0.155081 0.00248708 +0.0451476 0.0833704 0.0221542 +-0.0657925 0.14111 0.0417765 +-0.0365871 0.119162 -0.0120374 +0.0101976 0.131045 0.010577 +-0.0249388 0.183594 -0.0126758 +0.0330579 0.0598189 -0.0157593 +-0.0212823 0.0391811 0.0388836 +0.0144144 0.0403325 -0.0225056 +-0.0304932 0.104292 0.0413193 +0.0224755 0.0947811 0.0470955 +-0.0694247 0.0337382 0.00515427 +-0.00249301 0.118317 0.039019 +0.0288984 0.0924492 -0.0198656 +0.033052 0.0440867 0.029429 +-0.0616004 0.15843 -0.0275855 +-0.0438223 0.0615675 0.0400039 +-0.0452867 0.0410146 -0.0162976 +0.0314256 0.0991914 -0.015062 +-0.0524965 0.0833785 0.044899 +-0.0298946 0.0436977 0.0506861 +-0.076428 0.148619 -0.00986569 +-0.0761803 0.0914451 0.0387697 +-0.0730299 0.172199 -0.0345665 +-0.0274981 0.0960112 0.0443229 +0.0045023 0.13009 0.02428 +-0.0302254 0.162455 -0.00347789 +-0.0871035 0.11231 0.0319974 +0.00225053 0.0726262 -0.0348847 +-0.0748173 0.152727 -0.0208966 +-0.0354946 0.118017 0.0312708 +0.0436028 0.0973418 0.0171655 +-0.0754981 0.13448 0.0513067 +0.0513136 0.0574694 -0.00408483 +-0.0228193 0.0854366 -0.0379031 +-0.057217 0.0336859 0.0130711 +-0.0749012 0.110639 -0.0076926 +-0.00874782 0.125791 -0.00734235 +0.0343242 0.100732 -0.0126444 +-0.0155312 0.126827 -0.00025822 +0.0145856 0.0341976 0.00165401 +-0.0175043 0.114096 0.0387143 +0.0552517 0.0720728 0.0198735 +0.0406726 0.0731516 -0.00877611 +-0.0268119 0.082528 -0.0368734 +-0.0262156 0.0519422 -0.0264212 +-0.0464977 0.041126 -0.0122454 +-0.0711885 0.173044 -0.0381946 +0.0492058 0.0511603 0.0287949 +-0.00188013 0.105918 -0.0222309 +-0.046455 0.126722 0.0256927 +-0.0142526 0.181479 -0.0279552 +-0.0655009 0.0903733 0.0443899 +-0.0037337 0.131051 0.015481 +-0.0308026 0.0367564 0.0517774 +0.0277802 0.121908 0.0142262 +-0.0344815 0.0575696 0.0386716 +-0.0844149 0.0777754 0.0115138 +0.0294342 0.0383781 -0.00173395 +-0.0423644 0.120691 0.0280931 +-0.0350646 0.156323 -0.010574 +-0.0619093 0.0470515 0.00567882 +-0.00290933 0.0388493 0.0285794 +-0.059258 0.0467212 -0.00132733 +0.00450339 0.123789 0.033846 +-0.0229547 0.12614 0.0172488 +0.0410852 0.0394499 0.00526393 +0.0049695 0.0340349 0.00359293 +-0.0513689 0.0516822 0.0322144 +-0.0606335 0.122654 0.0421622 +-0.0645986 0.15064 0.0368964 +-0.0632078 0.143892 -0.00837073 +-0.0386435 0.0563025 -0.0111331 +-0.0658025 0.083802 -0.0186684 +-0.062835 0.128322 0.0425151 +-0.0715276 0.14003 0.0472238 +0.056383 0.0538774 0.0233551 +-0.0610939 0.0335153 0.00346695 +-0.00051118 0.0978394 0.0524335 +-0.0418663 0.0340021 -0.00580283 +-0.042485 0.0762268 0.0429934 +-0.0512844 0.138511 0.0223666 +0.0367682 0.0888721 0.037463 +0.00724928 0.0711363 -0.0334334 +-0.0505534 0.0543594 0.017626 +0.00614025 0.110185 -0.0202335 +-0.00850551 0.0561268 0.0532043 +-0.0295938 0.0789709 0.0427962 +-0.0287487 0.0349103 0.0496611 +-0.0584012 0.154047 0.0286827 +-0.0127037 0.064273 -0.0367671 +-0.0288624 0.0606727 -0.0254104 +-0.0376712 0.125956 0.0207679 +-0.0612726 0.0708854 0.0380779 +-0.0637251 0.155028 0.0282356 +0.0531328 0.0476715 0.00620176 +-0.00308571 0.124589 0.0331408 +-0.0186888 0.0352267 -0.0190015 +0.001497 0.119685 0.0377723 +-0.032734 0.120436 -0.00935257 +-0.054542 0.0631354 -0.00767633 +0.052054 0.0718585 0.0216053 +-0.00556188 0.116801 -0.0157696 +-0.0504949 0.138575 0.0203939 +-0.00542543 0.120041 -0.0132322 +0.0310541 0.0727142 0.0413756 +-0.0558801 0.045112 0.0236807 +-0.0167974 0.0382847 0.0190235 +0.0256741 0.0809122 0.047736 +-0.0199636 0.0668339 0.051351 +-0.0491191 0.159098 -0.00622225 +-0.0506725 0.0667938 0.036819 +-0.0492762 0.143079 0.00435473 +-0.0216794 0.0538141 -0.0303252 +0.0305352 0.10973 -0.0102674 +-0.0225945 0.157229 -0.0076361 +-0.0530851 0.151641 -0.00314317 +-0.0271151 0.122681 0.0231414 +-0.0134994 0.0884096 0.056966 +-0.0266886 0.0335519 -0.0246454 +-0.008499 0.12243 0.035017 +-0.0393069 0.033537 -0.0233717 +-0.033807 0.0461583 0.044586 +-0.0198183 0.158714 -0.00970491 +-0.0835554 0.0925405 0.0305699 +-0.0340008 0.0766042 -0.0254969 +0.00352334 0.12519 0.0325857 +-0.0424905 0.0424327 0.0427417 +0.0232877 0.123385 0.0253956 +0.0230237 0.100791 0.0439995 +0.0307365 0.117405 0.0253192 +-0.0772723 0.114862 0.0500033 +-0.0264336 0.0535943 0.0384453 +0.0177456 0.0350628 0.0325863 +-0.0121375 0.102128 -0.024127 +-0.000203909 0.130048 0.0239772 +0.00795806 0.127195 -0.00506697 +-0.0252695 0.156633 -0.00336931 +0.0179609 0.1201 -0.00942839 +-0.0769756 0.068555 0.0156381 +-0.0871021 0.111516 0.0397664 +-0.0544907 0.101557 0.0424048 +-0.0572843 0.0589766 -0.000464382 +-0.07902 0.0751794 0.0271309 +0.0102371 0.115602 -0.0165593 +-0.0105893 0.180273 -0.0272114 +-0.0528115 0.0913061 -0.0221889 +-0.064755 0.068231 0.0343382 +-0.0137258 0.125368 -0.00476898 +-0.0635922 0.178326 -0.0570781 +-0.0239683 0.126504 0.0139537 +-0.0600264 0.132579 -0.00719549 +0.044826 0.0791184 -0.000782084 +-0.00541885 0.0969111 -0.0306599 +-0.0301034 0.0537602 -0.0193727 +0.0409333 0.0900371 -0.0097907 +0.024446 0.115337 -0.010308 +-0.0283175 0.0963396 -0.0241496 +0.0299711 0.119398 0.020753 +-0.0265916 0.172718 -0.0105089 +-0.0586682 0.128313 0.0397417 +-0.0818638 0.147313 0.00119815 +-0.0254305 0.0357675 -0.0290845 +-0.038039 0.126372 -0.00365101 +-0.00149717 0.0815096 0.0574492 +-0.00738223 0.0931774 -0.0348179 +0.0558223 0.0493444 0.0161931 +0.0577347 0.0705061 0.0074689 +-0.0778727 0.096767 0.0360596 +0.0144985 0.11402 0.0378951 +0.00389123 0.0355229 -0.0148126 +0.0242948 0.124607 0.0114976 +0.0565412 0.0674698 0.002463 +-0.0308889 0.108768 -0.0191524 +0.011955 0.0349898 0.0332703 +-0.0129143 0.104805 -0.023047 +-0.0938592 0.11877 0.0212975 +0.0106595 0.0357626 0.0286983 +-0.0652684 0.163853 -0.0591668 +-0.0359879 0.0421738 0.0454409 +-0.0685089 0.100042 0.0409867 +0.03476 0.113033 0.0239837 +-0.0346506 0.126197 -0.000232823 +-0.0386758 0.0462873 -0.0214583 +0.0257808 0.10679 -0.0151172 +-0.0618601 0.153758 -0.0185818 +0.03067 0.0917687 -0.019137 +0.0275533 0.0672844 0.0433037 +-0.0414978 0.0748079 0.0427759 +-0.0218204 0.0840783 -0.0384285 +0.037815 0.0630498 -0.0108066 +-0.0602789 0.0617061 0.0251086 +-0.0768171 0.154199 -0.00689913 +0.00550054 0.0990386 0.0482677 +-0.0391759 0.16667 -0.0123913 +-0.0616525 0.116813 -0.0113459 +-0.0227683 0.0699063 -0.0373697 +-0.0825008 0.107588 0.0273509 +0.0253381 0.0418727 -0.00588506 +-0.014565 0.035318 -0.01827 +-0.00278761 0.0390101 -0.00997081 +-0.0895837 0.137934 0.0361877 +-0.0855599 0.112052 0.0307632 +-0.027858 0.0343176 -0.0296609 +-0.0325025 0.0675467 0.0400218 +0.0183334 0.0348857 0.00364336 +-0.0469365 0.0404762 -0.0121149 +-0.0777262 0.0825344 -0.0106004 +-0.00467074 0.0569349 -0.0330586 +-0.0194597 0.165415 -0.0107679 +-0.0210403 0.122456 -0.00761783 +-0.0388087 0.0446425 -0.0234233 +-0.0696543 0.0614896 0.0127042 +0.0440466 0.0931306 0.0221521 +-0.0647046 0.0352193 0.0243246 +-0.0166096 0.0435748 -0.0274243 +0.0441838 0.0712847 0.000450163 +-0.0285281 0.0522637 0.0377683 +-0.0599387 0.147394 -0.00221747 +-0.0440942 0.156163 -0.00853601 +0.0388076 0.0807597 0.0350812 +-0.0141543 0.161827 -0.01362 +-0.0210631 0.0385773 -0.00578617 +-0.0237266 0.161004 -0.00287357 +-0.0863431 0.0896619 0.0263909 +-0.0829431 0.0790271 0.0235207 +0.0268259 0.0605622 0.0439609 +-0.0224026 0.0384511 0.0303351 +-0.0635581 0.170962 -0.0485923 +-0.0456965 0.147701 -0.00292724 +-0.0532705 0.0373829 0.0469289 +0.0231843 0.0658868 0.0457612 +-0.0887459 0.132238 0.00325707 +0.00920248 0.0914355 -0.0308607 +-0.0298874 0.063588 -0.0244234 +0.00157852 0.12719 -0.00497022 +-0.0814436 0.153873 0.00890807 +-0.0624959 0.0607929 0.0219134 +-0.0680579 0.149988 0.0386907 +0.0166077 0.128469 0.0186355 +0.00550411 0.0731036 0.0564845 +-0.00249995 0.0661849 0.0567093 +-0.0735022 0.155469 -0.0279133 +-0.0851803 0.0899483 -0.00256663 +0.0394434 0.0585828 -0.00486619 +-0.0739433 0.134018 -0.00754124 +-0.038066 0.156257 -0.0102365 +0.00335185 0.118611 -0.0157819 +-0.00660848 0.0420213 -0.0257519 +-0.0639921 0.0605727 0.020032 +0.0252819 0.100786 -0.0187149 +-0.0820788 0.0765181 0.0218286 +-0.0167051 0.0584876 -0.0351851 +-0.023274 0.106158 -0.0224283 +-0.0878269 0.087472 0.021463 +-0.0786369 0.113551 0.047197 +0.0360644 0.0861926 0.0381664 +-0.082909 0.123594 -0.00426589 +-0.029497 0.177966 -0.015166 +-0.0170948 0.127006 0.022289 +0.0524062 0.0491022 0.00128138 +-0.0198015 0.10169 -0.0238258 +-0.0221328 0.166772 -0.0183109 +-0.00252234 0.038424 0.00547409 +-0.0255028 0.0606627 0.0401195 +-0.0385432 0.0337417 -0.0196892 +-0.0644389 0.0627719 0.0250864 +-0.0879688 0.113092 0.00628888 +0.000951329 0.10045 0.046938 +0.0386471 0.086118 0.0348681 +-0.0374734 0.0346441 0.0411075 +0.0233517 0.120203 -0.00555174 +0.0462175 0.0761811 0.0179689 +-0.0376403 0.0336717 0.00266115 +-0.0341867 0.172054 -0.0145892 +-0.0623617 0.0420762 0.0420515 +-0.0114712 0.0379322 -0.0163227 +-0.0177227 0.119786 -0.0108098 +-0.0801398 0.154387 0.00935749 +0.00187492 0.0398874 0.0463369 +-0.0730243 0.159629 -0.0349322 +0.0473276 0.0547587 -0.00564531 +-0.0376789 0.0636715 -0.0137557 +-0.0727421 0.180568 -0.051639 +-0.0616232 0.148175 -0.003118 +-0.0248231 0.0839948 -0.0375331 +-0.0652787 0.173897 -0.0604957 +-0.0740506 0.152673 -0.0298916 +-0.0571547 0.150227 -0.00146353 +-0.0903203 0.146073 0.0131505 +-0.0779569 0.132491 -0.00592536 +-0.0290048 0.0550494 -0.0223991 +-0.00849727 0.0898107 0.0570624 +-0.0324948 0.112838 -0.0174448 +-0.0523188 0.0518 0.026645 +0.0302802 0.0506319 0.0365295 +-0.0838507 0.103422 -0.00164978 +-0.0788492 0.100759 0.0340965 +-0.0874564 0.141909 0.0385732 +-0.0155155 0.115507 0.0382335 +-0.0777311 0.0887218 0.0375819 +-0.0730146 0.15545 -0.0319082 +-0.0523124 0.0360662 0.0464431 +-0.06188 0.164622 -0.0566003 +0.0367263 0.0794489 0.0373046 +-0.0734863 0.173577 -0.0500848 +0.00600107 0.0390612 0.028408 +-0.0278792 0.0339265 -0.0214795 +-0.000753868 0.0390895 -0.00403098 +-0.0578284 0.0450681 -0.00544742 +-0.0829344 0.129921 0.0513858 +-0.0111161 0.125335 -0.00680126 +-0.0679477 0.0860672 0.0434473 +-0.0705079 0.105505 0.0376955 +-0.0109443 0.0389825 -0.0115729 +-0.0399106 0.033865 0.000215963 +0.00351496 0.0924905 0.0549546 +-0.0424851 0.033913 -0.0262188 +-0.0792564 0.155246 0.0213567 +-0.0215304 0.127346 0.0119061 +-0.091259 0.117481 0.0430647 +-0.0404902 0.0790417 0.0431478 +-0.0945826 0.122834 0.0222802 +-0.0518346 0.0517811 0.0306554 +-0.0767129 0.161805 -0.0163426 +-0.0867595 0.107707 0.0143554 +-0.0693236 0.142228 -0.0102995 +-0.0204959 0.105781 0.0424626 +0.0438044 0.0987496 0.00916312 +-0.00281997 0.0854457 -0.0370162 +-0.00280088 0.0840687 -0.037315 +0.0293196 0.0632732 0.0423131 +0.00625559 0.0725849 -0.0341185 +0.0203077 0.0621778 -0.0269805 +0.0563556 0.0723446 0.0173318 +-0.0230123 0.107366 -0.0218426 +-0.00742046 0.035877 -0.0249268 +0.0374488 0.0402522 0.0247009 +0.0292061 0.055224 -0.0177993 +-0.0184858 0.127732 0.0173962 +-0.0921542 0.132321 0.0142287 +-0.0583136 0.145422 -0.00203607 +-0.0688478 0.0994593 -0.0152611 +-0.0615047 0.167821 -0.0555677 +-0.0915903 0.125424 0.00726612 +0.0199591 0.0564127 0.0480725 +0.0378679 0.0713179 0.0353865 +-0.000605671 0.129033 0.0267429 +0.0298673 0.0740916 0.0431977 +0.00443138 0.126024 0.0314422 +0.0239815 0.12134 -0.00278507 +-0.0246606 0.0521655 -0.0277657 +0.0146913 0.0820798 0.0529703 +0.0259518 0.075434 0.0462884 +-0.0332069 0.0609523 -0.0145937 +-0.0191994 0.0907344 -0.0364225 +0.0589179 0.0607855 0.00414854 +0.0361999 0.103252 -0.0093129 +-0.0498767 0.0529199 0.0166388 +-0.0681894 0.0774836 0.0397476 +-0.021626 0.038176 0.00908889 +-0.0723232 0.163826 -0.0419605 +0.0104934 0.109851 0.0397458 +-0.0177283 0.0627822 -0.0360863 +-0.0628376 0.161493 -0.0485893 +0.00323101 0.120377 -0.0136716 +0.0551973 0.0674594 0.0252672 +-0.0349319 0.127285 0.00554823 +0.0194228 0.125079 0.025397 +-0.00805064 0.130356 0.00959263 +-0.0314936 0.097435 0.044487 +-0.0557138 0.0342594 0.0288064 +0.0212843 0.0490624 0.0410711 +-0.0898642 0.114175 0.0316644 +-0.0868422 0.134936 0.00226938 +-0.0758819 0.156006 0.016671 +-0.00997005 0.175779 -0.0292074 +-0.0603522 0.0407823 0.0443369 +0.0416146 0.0598915 -0.00407392 +0.0165523 0.0922417 -0.0256623 +-0.0245975 0.0365494 -0.0290831 +-0.0381375 0.160902 0.00087141 +-0.0719085 0.064649 0.0201308 +0.0144227 0.0477589 -0.0252693 +0.0603421 0.0650847 0.0181826 +-0.0146479 0.0481463 -0.0303376 +0.00721829 0.131495 0.00948452 +0.0394741 0.102755 0.0261825 +-0.0127182 0.0685587 -0.0376659 +0.0338414 0.0392101 0.0249005 +-0.0639127 0.160548 -0.0182872 +-0.0885745 0.0901142 0.00646846 +-0.0497297 0.0416675 0.0451167 +-0.0695102 0.148387 0.0405048 +0.0369413 0.0618853 0.0357448 +-0.0614969 0.0987359 0.0427353 +0.0264406 0.0434552 0.0361928 +0.0457541 0.0497206 0.0308161 +-0.0184963 0.0486167 0.0482304 +-0.086692 0.140502 0.00718566 +-0.0116045 0.0420472 -0.0262702 +-0.0708693 0.149702 0.0392474 +-0.061676 0.0343224 0.032737 +-0.00749303 0.115552 0.0402888 +0.0603302 0.0678632 0.0121432 +-0.070517 0.146976 0.0420031 +0.0360463 0.0953891 -0.0118379 +0.0368862 0.0601656 -0.0107732 +0.0239184 0.116674 0.0330029 +-0.0804601 0.148683 0.000173633 +-0.0604926 0.0344653 0.0380756 +-0.0152525 0.177145 -0.0265204 +-0.0773226 0.108517 -0.00660544 +-0.0176381 0.0465514 -0.0286775 +0.0313677 0.11674 -0.000181085 +-0.0465999 0.111104 -0.0175509 +-0.0408947 0.172668 -0.00780492 +0.0241275 0.120631 -0.00401437 +-0.055903 0.111216 -0.0172629 +-0.0781607 0.0935055 -0.0115755 +0.0158369 0.105055 -0.0192576 +-0.0130717 0.0973914 -0.0292103 +0.00114663 0.103071 -0.022297 +-0.0545436 0.0443717 -0.00770843 +0.0381644 0.0887078 -0.0138852 +-0.0638458 0.0366675 0.0422565 +-0.0245954 0.122675 -0.00581505 +-0.0199502 0.0553853 0.0474489 +-0.0454976 0.13168 0.014882 +-0.0808086 0.113339 -0.00208766 +-0.0658194 0.154782 -0.0493821 +-0.0138747 0.104484 -0.023001 +-0.0293428 0.112771 -0.0173776 +0.0139014 0.0962996 -0.0239693 +-0.0834257 0.145967 0.00318768 +-0.0299391 0.175699 -0.00474628 +-0.00851553 0.0759427 0.057359 +-0.0679104 0.122376 -0.00896749 +-0.0104955 0.0731168 0.0565579 +-0.0480021 0.126873 0.0289133 +-0.052022 0.0561083 0.0186673 +-0.0627916 0.150662 -0.00757045 +-0.0667057 0.14638 -0.0236565 +-0.0714698 0.161004 -0.0429413 +-0.0459114 0.0657109 0.0391289 +-0.0127989 0.0827406 -0.0389623 +0.0240686 0.0436305 0.0398361 +0.00979486 0.0360464 0.02827 +-0.0144862 0.0715775 0.0549247 +-0.0798641 0.145899 -0.00181913 +-0.0607177 0.0335659 0.00529637 +-0.0635063 0.156747 -0.0406118 +-0.0171212 0.0383927 0.000728518 +0.02686 0.0646091 0.0440244 +0.0291243 0.117712 -0.00241857 +0.0411571 0.0846831 0.0314273 +0.0246298 0.0347052 0.0125163 +0.0376787 0.105425 -0.00281358 +-0.0520342 0.116871 0.0334143 +-0.0526315 0.0335173 0.00157493 +0.0103692 0.116852 -0.0159048 +-0.0299989 0.178534 -0.0140055 +0.0199608 0.126186 0.00277612 +-0.0226771 0.0567339 -0.0313199 +-0.0693087 0.165593 -0.0188405 +0.0435095 0.0527832 0.0325495 +-0.0292487 0.115981 -0.0147474 +0.0390778 0.105565 0.0241719 +-0.0449049 0.167415 0.00301648 +-0.0575339 0.0493779 -0.000368538 +-0.0396388 0.0548721 -0.0111311 +0.0314293 0.102107 0.036834 +0.000480507 0.104429 0.0436509 +-0.0299338 0.0468967 -0.0261593 +-0.0712424 0.155684 0.00373917 +0.0197271 0.0808668 0.051456 +-0.0761145 0.157637 -0.00836344 +-0.0144941 0.122325 0.033097 +-0.0597928 0.095429 -0.0195264 +0.0309421 0.0646254 0.0411415 +-0.0275054 0.104339 0.0416271 +-0.000516741 0.108636 0.04302 +-0.0777092 0.07194 0.024923 +0.0102045 0.0795083 -0.0323062 +-0.0379505 0.150881 -0.00456722 +-0.013105 0.0382607 0.0125563 +-0.0182317 0.187056 -0.0182936 +-0.0182699 0.166848 -0.0125771 +-0.0264587 0.0902029 -0.033595 +-0.0668807 0.112599 0.0436137 +-0.0537473 0.076818 -0.0192258 +-0.0306082 0.165302 -0.00581873 +-0.0796939 0.0873057 0.0353613 +0.0347714 0.100763 0.034674 +-0.035752 0.0415598 -0.0291214 +0.0289767 0.117846 0.0275093 +-0.000706682 0.0655468 -0.0343894 +-0.0610628 0.138403 -0.00654794 +-0.0625935 0.12412 0.0446596 +-0.0648295 0.14966 -0.0309451 +-0.0234815 0.0974495 0.044821 +-0.026575 0.0476865 -0.0258778 +-0.0528683 0.0367334 -0.0118941 +-0.0116753 0.0526919 -0.0331734 +-0.0615062 0.158429 -0.0265894 +0.0320656 0.117538 0.0186978 +-0.00988755 0.103466 -0.0236142 +0.0484958 0.0691068 0.025078 +0.0156548 0.128965 0.0154331 +-0.0665046 0.10698 0.0385746 +-0.0267998 0.0522633 0.0388472 +-0.058755 0.0782067 -0.0192512 +0.0211493 0.0672779 0.0481082 +-0.0288355 0.125617 0.00924976 +-0.0124826 0.0701993 0.05486 +0.0522007 0.0476683 0.00324556 +-0.0443004 0.130334 0.00946299 +-0.00241533 0.0389975 -0.0136337 +-0.0437474 0.0783133 -0.0194351 +-0.0629007 0.115475 0.040648 +-0.0311605 0.169689 -0.016551 +-0.0263193 0.0386673 0.0347214 +0.0366921 0.0807912 0.0372758 +-0.0395001 0.100068 0.0413695 +-0.0681116 0.112409 0.0451263 +0.0386091 0.0686148 0.0346703 +-0.0759482 0.152671 -0.0129066 +0.0145806 0.0953173 0.0493246 +-0.0385004 0.150676 0.00203305 +-0.0935499 0.129634 0.0192397 +-0.0619642 0.126755 -0.00826981 +-0.0537213 0.0709084 -0.0154466 +-0.0314688 0.175764 -0.00340966 +-0.046761 0.126023 -0.00719597 +0.0128678 0.128966 0.0229731 +-0.0721444 0.145534 -0.0189034 +-0.014649 0.0384586 0.0247211 +-0.0782079 0.165287 -0.027954 +-0.0738874 0.0695898 0.0277412 +-0.0880483 0.145895 0.0319999 +-0.00950131 0.0870429 0.0572309 +-0.082872 0.154403 0.0201091 +-0.0574419 0.0424556 0.0216968 +0.0432211 0.097315 0.0201647 +0.0484167 0.0567471 0.0312254 +-0.0899902 0.146067 0.012148 +-0.0384869 0.0860997 0.0437907 +-0.0677801 0.0837503 -0.017964 +-0.0304968 0.071744 0.0399232 +-0.0267649 0.0754486 -0.0363172 +0.0555795 0.068697 0.0240751 +-0.00326172 0.0994383 0.0499516 +-0.0539364 0.153495 0.0157968 +-0.0264808 0.0509031 0.0429156 +0.0477223 0.0435274 0.0201079 +-0.027646 0.071755 0.0409574 +-0.025483 0.0988427 0.0444451 +0.00433576 0.055339 -0.0305463 +-0.0809392 0.0721012 0.0145438 +-0.0859359 0.0980836 0.000413824 +-0.0660122 0.153896 -0.0475582 +-0.0275574 0.156658 -0.00139783 +-0.0134137 0.0581871 0.0521911 +-0.0774938 0.134462 0.0515018 +0.0104958 0.0560929 0.0526786 +-0.00951583 0.0848597 -0.0382215 +-0.0298676 0.0916468 -0.0252289 +-0.0751451 0.15577 0.0110973 +-0.0887521 0.0969152 0.00742291 +-0.00642846 0.119149 -0.0142793 +-0.0351305 0.127632 0.00987733 +-0.079479 0.1087 0.0330138 +-0.00387451 0.0384228 0.00884205 +-0.0794858 0.0940336 0.0349322 +-0.0809833 0.080323 0.0311985 +-0.0874477 0.148578 0.0299355 +0.015852 0.106086 -0.0183494 +-0.0799154 0.12806 -0.00573177 +-0.0810332 0.092317 -0.00857663 +-0.0428426 0.0956907 -0.0224311 +-0.0843197 0.0830919 -0.00150258 +0.0270369 0.0347621 0.0147774 +-0.0114905 0.108632 0.0428314 +-0.0298836 0.04486 -0.0282273 +-0.0675863 0.0915604 0.0429945 +-0.0858462 0.0806083 0.01849 +-0.0377888 0.0855996 -0.0220857 +-0.080296 0.0886098 0.0345053 +-0.0631283 0.163827 -0.0595262 +-0.0200798 0.0653829 0.0501099 +0.0101376 0.104418 -0.0202461 +0.00311717 0.113125 -0.0199945 +0.00740202 0.0404296 -0.0235788 +-0.0233436 0.179984 -0.0199453 +-0.0849416 0.153745 0.0179582 +-0.00950506 0.0660833 0.0554985 +-0.0149561 0.0997734 -0.0237179 +-0.0625045 0.160053 -0.0215634 +0.0134925 0.114016 0.0379994 +-0.0484084 0.144974 0.000471547 +-0.0765927 0.0770726 0.0330453 +-0.0522524 0.0566167 0.0245415 +-0.0446531 0.0607308 -0.0127894 +-0.077361 0.0729429 -0.00456158 +-0.0164852 0.0870004 0.0567616 +0.00917846 0.101539 -0.0214106 +-0.0114976 0.0883765 0.0564607 +-0.0365032 0.109752 0.0369592 +-0.0622101 0.169551 -0.0614764 +0.0134275 0.117615 -0.0147491 +-0.0194201 0.1246 -0.00382324 +0.000402662 0.121936 0.0359399 +0.0308218 0.101142 -0.0151148 +0.044544 0.0748845 0.0238506 +-0.0190349 0.0930706 -0.0347914 +-0.0284257 0.15795 -0.0115973 +-0.0835152 0.150011 0.0330149 +-0.0723608 0.0363259 0.00395733 +0.049239 0.0437392 0.0164633 +-0.0281399 0.0917982 -0.0286003 +-0.0894337 0.132252 0.00424863 +-0.0478863 0.033513 -0.0102384 +-0.0480003 0.126688 -0.00585567 +-0.0147076 0.0933085 -0.0349989 +-0.0344513 0.172765 -0.000813008 +-0.012881 0.107288 -0.0218461 +-0.0494996 0.111168 0.0370596 +0.0195435 0.100771 0.0459866 +0.0383256 0.0387198 0.0189634 +-0.0490718 0.151664 -0.00461846 +-0.0413062 0.123313 -0.010402 +-0.0764561 0.106685 0.0353026 +-0.0506178 0.0590261 -0.0100428 +-0.0085531 0.0385596 0.00412906 +-0.0510743 0.153146 -0.0044532 +-0.0168415 0.122494 -0.0076608 +-0.0724396 0.129821 0.051541 +-0.0447123 0.0336927 -0.0153017 +-0.0128672 0.038589 0.0285719 +-0.0769694 0.136896 -0.00565009 +-0.0204809 0.0526524 0.0459576 +-0.0190093 0.100114 -0.02409 +0.0491876 0.0602673 -0.00438234 +2.68966e-05 0.0991578 -0.0250032 +-0.0146066 0.0355634 0.0504427 +0.0437747 0.084485 0.0264379 +-0.0613665 0.0430534 -0.00574325 +0.0102029 0.0779579 0.0551886 +-0.0584973 0.109766 0.0377913 +0.0405117 0.0657145 0.0303349 +0.0123622 0.0523525 -0.0283928 +-0.0865442 0.107736 0.017365 +-0.0273471 0.0735222 0.0429845 +-0.076628 0.169808 -0.0316679 +-0.00310182 0.130332 0.00278812 +0.0456485 0.0904179 0.0101632 +0.0367704 0.109675 0.000243105 +-0.0088954 0.108786 -0.0222808 +-0.0722528 0.156819 -0.0369077 +-0.0343294 0.175491 -0.0032043 +-0.0612579 0.167808 -0.0576007 +-0.0225051 0.10854 0.0408657 +-0.0396128 0.0492137 -0.0115104 +-0.0528856 0.104156 -0.0198053 +-0.0114785 0.0965129 0.0526113 +-0.0493499 0.141685 0.00939558 +-0.053326 0.162717 0.00204741 +0.0382413 0.108427 0.0210592 +0.0250594 0.122946 0.0231962 +0.0436593 0.058746 -0.00488132 +-0.052188 0.0559056 0.0136207 +-0.0337241 0.163848 -0.00328844 +-0.0671575 0.17049 -0.0366968 +-0.0780353 0.0880327 -0.0115615 +-0.00752216 0.122122 -0.0114318 +-0.0578223 0.12834 0.0392194 +-0.0624397 0.16285 -0.0548313 +-0.00720215 0.0344571 -0.0178933 +0.0219696 0.0347867 0.0191885 +0.0134971 0.112635 0.0387508 +-0.0188778 0.168283 -0.0134663 +0.0418633 0.0718502 -0.00680416 +0.00188261 0.129936 0.0247306 +-0.0143909 0.0388658 -0.0140202 +-0.0866821 0.0819953 0.0154888 +0.0511122 0.059915 -0.00400422 +-0.0637796 0.0419038 0.0392448 +-0.0334673 0.0532523 0.0375728 +-0.0640539 0.142491 0.0390245 +-0.0197273 0.118003 -0.0129221 +-0.0739294 0.0686501 -0.000515794 +0.022253 0.0430673 -0.0137151 +0.0169102 0.120624 0.0334304 +-0.0533452 0.118341 0.0350731 +-0.0407313 0.0710722 -0.0172567 +-0.0444934 0.108473 0.0392485 +-0.0406946 0.0340162 0.0268873 +-0.0428689 0.104235 -0.0209095 +0.000289503 0.0391337 -0.00386275 +0.0202669 0.0819781 -0.0271085 +0.0339966 0.0363512 0.0147468 +-0.0623699 0.0366895 0.0436353 +0.0112859 0.0638878 -0.0308862 +0.044262 0.0945325 0.00218274 +0.0178069 0.0349979 -0.00592782 +0.00766772 0.130773 0.00395877 +-0.0518373 0.0337424 -0.0112411 +0.05138 0.0464792 0.0212617 +-0.054495 0.0932121 0.0445367 +0.0154864 0.0380581 -0.0207587 +0.0322412 0.0368006 0.00286913 +0.0226382 0.0714084 0.0485432 +-0.0474967 0.0761987 0.0428659 +-0.0433556 0.0337438 -0.00770024 +-0.0507933 0.0869468 -0.0215939 +-0.0428743 0.166323 -0.00997516 +0.0420989 0.0930078 0.0271705 +-0.0133438 0.11201 -0.0186315 +-0.0682581 0.156305 0.0164417 +-0.0709159 0.125294 -0.00875352 +-0.0758095 0.0920857 -0.0139153 +0.00691185 0.038861 0.0287775 +-0.0755745 0.0702081 -0.000465226 +0.0560342 0.0622175 0.0264602 +0.00750328 0.0532576 0.0522142 +-0.0557017 0.0693735 -0.0143448 +-0.0400399 0.0367774 -0.0284153 +0.0452718 0.0917995 0.0131601 +0.0113635 0.0534706 0.0514016 +-0.056641 0.0429978 -0.00777539 +-0.0163006 0.182966 -0.0260091 +-0.0724038 0.116078 0.0519992 +-0.0223961 0.161302 -0.0143028 +-0.016322 0.128515 0.00945034 +-0.0761998 0.14998 -0.0148766 +-0.084898 0.11701 -0.000772283 +0.0215009 0.111167 0.037529 +-0.0116746 0.164119 -0.0176003 +-0.0386977 0.0666031 -0.0147476 +-0.0475127 0.0411749 0.0444313 +-0.0741496 0.147181 -0.0158602 +0.0423699 0.0412112 0.0211935 +-0.0112343 0.126014 -0.00554296 +-0.0627796 0.16313 -0.0285907 +0.0598501 0.0664357 0.0191799 +0.0444747 0.0438727 0.000520461 +-0.0449903 0.16693 -0.00785376 +-0.0241862 0.125789 0.00366503 +0.0303543 0.0942493 0.0422823 +0.0385368 0.0800568 -0.0127167 +-0.0329258 0.120263 0.0285346 +-0.0277494 0.0764615 0.044728 +0.0072822 0.0344718 -0.00192729 +0.0164745 0.103092 0.0456772 +-0.000370674 0.0391495 0.0306363 +-0.0444932 0.109842 0.0382343 +-0.0228558 0.113062 -0.0177116 +-0.0323055 0.0384897 -0.00796454 +0.0330143 0.106332 -0.0106209 +-0.0905664 0.150208 0.0151282 +-0.0473203 0.122487 0.0279328 +-0.079976 0.076532 0.0275303 +-0.0185178 0.0383092 0.00415679 +-0.0400541 0.128036 0.0139949 +-0.0725037 0.079155 0.0383043 +-0.00705924 0.127865 -0.00358478 +-0.0474808 0.0518309 0.037336 +0.0281857 0.0888902 0.0443935 +-0.0325014 0.102916 0.0416129 +-0.0636379 0.131123 0.0413473 +-0.0194422 0.0952996 -0.0310527 +0.0343622 0.0673468 0.0390872 +0.00248248 0.0385592 0.0461627 +-0.0207428 0.0656176 -0.0364653 +-0.0354216 0.17545 -0.00362892 +-0.0186888 0.127303 0.00423263 +-0.0697675 0.129835 0.0501143 +-0.0645483 0.168715 -0.0400434 +0.0176026 0.0520233 0.0463575 +-0.0165066 0.11684 0.0369313 +-0.0539292 0.0475998 -0.00643542 +0.0206619 0.125677 0.022985 +0.0131 0.034428 -0.00821794 +-0.0884031 0.101017 0.0203758 +-0.089294 0.136502 0.0252035 +-0.0633961 0.0610267 0.0215327 +-0.0181382 0.0625693 0.0510808 +-0.0363013 0.0408102 0.0457892 +-0.0348891 0.0341588 0.0262022 +0.0321818 0.0994934 0.0379171 +-0.0650996 0.115729 0.046366 +-0.0446047 0.0505366 -0.0105481 +-0.0170833 0.0896859 -0.0373218 +-0.0135156 0.162506 -0.0153049 +-0.0264962 0.119343 0.030427 +0.053783 0.0561466 -0.00178141 +-0.0659739 0.131145 -0.00872206 +-0.022585 0.185119 -0.0131839 +-0.0902473 0.132271 0.00623314 +-0.0343818 0.038354 -0.0138166 +-0.087117 0.119846 -0.000719646 +-0.0514997 0.047729 0.0396118 +-0.0837154 0.0804764 0.0234959 +0.0452487 0.0681916 0.00167659 +0.0443433 0.0762807 -0.00178421 +0.0393871 0.0828883 -0.0127786 +0.0133395 0.0475307 0.0453837 +0.0393635 0.0445531 -0.00413158 +0.0464068 0.0778555 0.00918735 +0.0498828 0.0474685 0.000307011 +-0.0205115 0.114066 0.0379617 +-0.0795322 0.0826724 -0.00859002 +0.0277802 0.0692504 -0.0226951 +-0.0640511 0.139618 0.0390194 +-0.0622733 0.144309 -0.00616114 +-0.0598164 0.122657 0.0415831 +-0.039222 0.0363262 0.0107899 +-0.0476756 0.0694312 -0.0151035 +-0.0114975 0.12239 0.0342495 +-0.0759886 0.0701373 0.025079 +0.0247695 0.1047 0.0394768 +-0.0424955 0.0464529 0.0406301 +-0.0209812 0.0389557 0.0535988 +-0.0434801 0.0917165 0.0428888 +-0.0936604 0.128255 0.0172452 +-0.0319662 0.163855 -0.00423083 +-0.0864626 0.107749 0.0163884 +0.00261599 0.0960798 -0.0297441 +0.0192696 0.124452 -0.00213625 +-0.0635019 0.0945759 0.0438874 +-0.0434804 0.108484 0.0391565 +-0.0767016 0.15969 -0.0259195 +-0.0207953 0.0784993 -0.0390618 +-0.0168597 0.0382017 0.0136589 +-0.0128908 0.129601 0.0150315 +-0.063562 0.136724 0.0379539 +-0.0592557 0.146819 0.0355066 +-0.0102821 0.0421361 0.0498123 +0.00411674 0.108725 -0.0201726 +-0.0471696 0.16597 0.00363215 +-0.0324882 0.0560654 0.0375153 +0.016314 0.061771 0.0498607 +-0.0633808 0.154539 0.0298218 +0.0319993 0.108737 0.0323781 +0.0224822 0.0578106 0.0464363 +-0.0731478 0.0644323 0.00940567 +-0.0136846 0.0555659 -0.0339274 +-0.0485565 0.0335372 0.00238031 +-0.0485794 0.128753 -0.00187037 +-0.0761205 0.0927947 0.038671 +-0.00890397 0.114438 -0.0172305 +-0.0881957 0.146062 0.0092207 +-0.067835 0.0951999 -0.016639 +-0.0826594 0.0993103 0.0308836 +0.0194806 0.107063 0.040905 +-0.0755472 0.15139 -0.00989046 +-0.0619095 0.118087 -0.0102757 +-0.0770237 0.0716688 -0.00146855 +-0.0090472 0.129209 0.0236827 +0.0166896 0.0645037 0.050425 +-0.044493 0.0860963 0.0437549 +-0.0851043 0.10321 0.0261425 +-0.0929793 0.125561 0.0282631 +-0.0792446 0.0699823 0.0139682 +-0.0541984 0.150844 0.02639 +-0.0544369 0.147753 0.0264091 +0.029273 0.103313 -0.0154093 +-0.0661878 0.156038 -0.00610123 +0.0513324 0.0613858 -0.00348738 +-0.00765334 0.0905691 -0.0361471 +-0.0036313 0.046681 -0.0294588 +-0.0793953 0.154018 0.0066962 +0.0126509 0.103032 -0.0211055 +-0.0534982 0.0344579 0.0343548 +0.0254331 0.0400654 -0.00462996 +-0.0474929 0.163748 0.00542805 +-0.0174765 0.0514437 0.047967 +-0.023601 0.0379574 -0.0288347 +0.0380126 0.0687088 -0.0127776 +0.0454875 0.0624627 0.0298224 +-0.0929393 0.122846 0.0403052 +-0.0619477 0.0629617 0.0272004 +-0.0632548 0.171035 -0.0614506 +-0.062927 0.150005 -0.0233391 +-0.0539078 0.109837 -0.0181931 +-0.0143481 0.129147 0.0116153 +-0.00460956 0.130321 0.00366937 +0.00735598 0.0509889 -0.0291303 +-0.0480744 0.151666 -0.00489643 +-0.0220459 0.166878 -0.0109827 +-0.0178225 0.0869056 -0.0385387 +0.000268234 0.0669357 -0.034172 +-0.0454819 0.0861255 0.0441555 +-0.0606958 0.0340151 0.0191666 +0.0293305 0.049536 -0.0137505 +-0.0661283 0.153073 -0.0457545 +0.0127964 0.0685744 0.0536204 +-0.0806268 0.150792 0.0343829 +0.0338754 0.0626989 -0.015804 +-0.0415032 0.116675 0.0325492 +-0.00995367 0.16681 -0.0217203 +0.059153 0.0704954 0.0131546 +-0.084323 0.0804069 0.00350409 +-0.0217865 0.0742531 -0.0388026 +0.0333307 0.040756 0.0270424 +-0.00920453 0.175559 -0.0287981 +-0.0565093 0.148178 0.0306333 +-0.0476849 0.146264 0.00805502 +-0.0896679 0.144435 0.0294634 +0.028326 0.0882981 -0.0214817 +-0.0129215 0.129318 0.0179306 +-0.0275354 0.0822426 0.0485604 +-0.0727818 0.154043 -0.034905 +0.0264706 0.0430524 -0.00597567 +-0.0461097 0.129234 0.00159921 +0.00227538 0.0668963 -0.0335609 +-0.0869081 0.0847086 0.0134765 +-0.071509 0.105494 0.0375699 +-0.0564975 0.105681 0.0408231 +-0.0709683 0.136976 -0.00769814 +-0.0238604 0.0347884 0.0456435 +-0.0248096 0.123255 -0.00440954 +-0.0504992 0.0917781 0.0442368 +-0.0672114 0.120049 0.0520179 +-0.067142 0.163768 -0.057034 +-0.0628433 0.16149 -0.0495873 +-0.0851762 0.106326 0.0223754 +0.0111461 0.101633 -0.021979 +0.0319374 0.0568888 -0.0147656 +0.0282794 0.120663 0.00443205 +-0.0912918 0.116401 0.0420373 +-0.00467238 0.0555139 -0.0327809 +-0.0267099 0.0794912 0.0492298 +-0.0226371 0.0622591 0.0442913 +0.0496058 0.0730794 0.0103455 +0.0134712 0.0347114 0.0266012 +-0.027103 0.0633188 -0.0304321 +-0.00446177 0.12682 -0.00651375 +-0.0184963 0.10441 0.0431068 +0.0322846 0.110983 -0.00760517 +0.043549 0.0987325 0.00516762 +-0.0442869 0.166804 -0.00853834 +0.0150912 0.0940152 0.0500689 +-0.07081 0.110507 0.0424798 +-0.0141183 0.115602 -0.0164489 +-0.0567507 0.13816 0.0319811 +-0.0047515 0.0726952 -0.0359954 +-0.0647331 0.0606321 0.00547671 +0.0292295 0.102131 0.038919 +-0.0328692 0.104316 -0.0215625 +-0.0105189 0.165484 -0.0170149 +-0.062488 0.161561 -0.0255895 +-0.083006 0.110313 0.0398706 +0.00202549 0.0390793 -0.0109499 +0.0598509 0.0692231 0.0121425 +-0.0486599 0.0649886 -0.0131055 +0.0193632 0.0475344 -0.0219845 +-0.0505005 0.109789 0.0379415 +0.0227584 0.0942129 0.0471436 +-0.054587 0.123231 -0.00812744 +0.0595925 0.0636093 0.00613697 +-0.0304354 0.159526 0.00145329 +-0.0771836 0.152278 0.0340017 +-0.0641378 0.146153 -0.0169913 +-0.012496 0.0828987 0.0575341 +-0.062259 0.0636125 0.0283336 +-0.0543842 0.064934 0.034129 +-0.0580097 0.136726 0.0336791 +0.0431148 0.0723568 0.0271232 +-0.0719688 0.147362 0.0419058 +0.0324265 0.0414912 -0.00365574 +-0.0504972 0.083371 0.044762 +-0.0277551 0.121254 0.0258902 +0.0248126 0.0672364 0.0446067 +-0.0748658 0.148574 -0.0178655 +0.0199833 0.0422265 0.0426566 +0.00936651 0.0494737 -0.0282538 +-0.0209427 0.127053 0.0165011 +0.014824 0.0950266 -0.0246047 +0.0416966 0.0899224 0.0287651 +-0.0417723 0.0826397 -0.0208385 +-0.0228105 0.123961 0.023212 +-0.0701997 0.155611 0.00411308 +-0.0246949 0.0550734 -0.0288078 +-0.0220519 0.163768 -0.0162501 +-0.0324478 0.069454 -0.0224572 +-0.0827552 0.07629 0.0125227 +-0.0606527 0.151084 0.0352378 +-0.0798891 0.0706304 0.0135503 +0.0476495 0.073201 0.00955169 +-0.00859398 0.0391639 -0.0259828 +0.0142802 0.0873929 0.0523851 +-0.00841973 0.128157 0.0268439 +-0.0665531 0.160013 -0.0120422 +-0.029443 0.0834063 0.0447309 +-0.0564979 0.0776594 0.043476 +-0.0483279 0.119696 0.0300033 +0.0232683 0.0857035 -0.0248261 +0.0321971 0.112814 -0.0055615 +0.0190831 0.0713469 0.0504539 +-0.054494 0.0465534 0.0422647 +-0.0121699 0.165481 -0.0142428 +0.000511137 0.0814953 0.0573473 +-0.0115028 0.0730832 0.0562182 +-0.0401042 0.037954 0.0427598 +-0.0114161 0.0382303 0.016554 +0.0328182 0.0967204 -0.0144274 +-0.00449908 0.0732747 0.0586205 +0.00733671 0.115147 -0.0180672 +-0.0476206 0.111206 -0.0176722 +-0.0624082 0.147544 -0.00957064 +-0.0615795 0.156866 -0.0245858 +0.0175138 0.12671 0.0232635 +-0.0697118 0.0764164 -0.0147262 +-0.0543713 0.158326 -0.00178875 +0.00713327 0.105885 -0.0207766 +-0.033517 0.115303 0.0329858 +-0.0114926 0.0897634 0.0564161 +-0.0375058 0.171208 0.000818011 +0.00542741 0.0336773 0.0131964 +0.0379386 0.07401 0.0354837 +-0.0860277 0.0967286 0.000430639 +-0.0311614 0.0791685 -0.0325602 +-0.0541101 0.0531993 -0.0053725 +-0.0592659 0.0599215 0.0215991 +0.0586637 0.0709935 0.0122726 +-0.0792595 0.0894709 -0.0095871 +-0.026159 0.0918036 0.0468933 +-0.0249745 0.12528 0.0180213 +-0.0519836 0.0517496 0.0236325 +-0.0275449 0.178709 -0.00674077 +-0.0715237 0.165101 -0.0167379 +0.0256965 0.123446 0.00917645 +0.0235224 0.0727618 0.0480692 +-0.0144773 0.0603048 0.0528052 +0.0408807 0.0948081 -0.00628698 +-0.0515819 0.0344024 0.0295565 +0.0311435 0.0885162 -0.0196004 +-0.087234 0.0981695 0.00341761 +-0.0165631 0.165424 -0.0118502 +-0.0497796 0.0518319 0.0348836 +0.0296893 0.110128 -0.0107004 +-0.0212542 0.126244 0.0193308 +-0.0315215 0.0732244 0.0404306 +0.0265706 0.0535806 -0.0207269 +-0.0944184 0.12146 0.0172829 +-0.0780287 0.14129 -0.00491664 +-0.0653187 0.152492 0.0351215 +0.0369332 0.102635 -0.00864905 +-0.0100919 0.126182 -0.00573829 +-0.0589643 0.15508 0.0013052 +-0.00782857 0.0386419 0.00238313 +-0.0893654 0.145802 0.0291185 +-0.077209 0.110378 0.0446936 +-0.0127752 0.0770687 -0.0383028 +-0.060466 0.143311 -0.00379205 +-0.0907002 0.137837 0.017198 +-0.0553853 0.15628 0.0108911 +-0.0609254 0.0454597 -0.00231147 +0.041351 0.0574751 -0.0052144 +-0.0111235 0.0346639 0.0467191 +-0.0520649 0.148658 -0.00262972 +-0.0438434 0.0985095 -0.0215595 +-0.0678163 0.0866062 -0.0177767 +0.0287562 0.053781 -0.0187512 +0.0338991 0.057119 -0.0127141 +-0.0189243 0.181629 -0.0169471 +-0.0888863 0.113493 0.0234001 +-0.0456524 0.0621788 -0.0131898 +-0.0205797 0.0906821 0.0540574 +-0.0285047 0.059221 -0.0254142 +-0.0310985 0.154152 -0.00673494 +0.0362687 0.0941823 0.0368117 +0.0223945 0.0860763 -0.025219 +0.0228611 0.0741302 0.0488936 +-0.0274872 0.094655 0.0450969 +-0.0238248 0.0826344 -0.0380614 +-0.044527 0.0601701 0.0393419 +0.0160126 0.0658829 0.0512178 +-0.0663487 0.06206 0.00207137 +0.000401309 0.0390966 -0.0249339 +-0.027107 0.082291 0.0495314 +-0.0617626 0.0415173 0.0247032 +-0.093011 0.118839 0.0352993 +-0.0662787 0.168684 -0.0320741 +-0.000498287 0.0535066 0.0547347 +0.0431795 0.0737197 0.0272167 +-0.0565118 0.0454033 -0.00602573 +-0.0668006 0.086643 -0.0182518 +-0.0652487 0.163342 -0.0202167 +0.0392901 0.0766734 0.0339466 +-0.0619246 0.106845 -0.0166571 +-0.0611633 0.0334354 -0.00188959 +-0.0722746 0.15542 -0.0369062 +-0.0690618 0.110676 0.0409548 +0.0432493 0.100107 0.00716752 +0.0317499 0.0535218 0.0369319 +-0.0492036 0.131059 0.0288275 +-0.0693592 0.176521 -0.047588 +-0.0072207 0.0356289 0.0484876 +-0.0818563 0.150046 0.00220642 +-0.0435006 0.0534118 0.0391466 +-0.0714969 0.156283 0.0152923 +-0.0883581 0.0875191 0.0194553 +-0.0774993 0.127442 0.0532862 +0.0288434 0.0591735 0.0415864 +-0.053835 0.0329874 0.0179508 +-0.0855039 0.140637 0.0423198 +-0.0597327 0.156046 0.0093301 +-0.052462 0.0642313 0.0336351 +0.000500084 0.12107 0.0367737 +-0.0692573 0.169753 -0.0288779 +-0.0156709 0.0385345 -0.00280448 +-0.00949582 0.118295 0.0381649 +0.0330035 0.116489 0.00476188 +0.0153369 0.0552331 -0.0286287 +-0.0105333 0.0457993 0.0483516 +0.00652975 0.0380351 0.0455331 +-0.0714995 0.101334 0.0391804 +0.0236022 0.115739 -0.0107408 +-0.0580129 0.118724 -0.0113962 +-0.0543247 0.0500125 0.0112758 +0.0587422 0.0635506 0.00411936 +-0.0589036 0.112559 -0.0155981 +-0.0640258 0.15968 -0.0562568 +-0.00990982 0.175697 -0.0247542 +0.00695815 0.0340953 -0.0204902 +-0.0591465 0.152697 -5.16463e-05 +-0.00975768 0.167025 -0.0223761 +-0.0383481 0.0417109 -0.0273458 +0.0463963 0.0778578 0.0141787 +-0.0720541 0.0777606 0.0379027 +0.0259403 0.1091 -0.0135959 +-0.0758056 0.0891863 -0.013912 +0.0429603 0.0873797 -0.00580114 +-0.0676348 0.0704852 -0.0103532 +-0.066267 0.176761 -0.0601056 +-0.013866 0.129156 0.0103484 +-0.067642 0.150503 -0.040589 +-0.0180327 0.0404537 0.0526147 +0.0183116 0.0636834 -0.0282837 +-0.078386 0.154762 0.00850622 +0.030569 0.0491561 0.035175 +-0.0622212 0.169401 -0.0515858 +-0.0565139 0.0548538 0.00566103 +0.00623573 0.0382417 0.0273828 +-0.038479 0.0945169 0.0431902 +-0.00987706 0.108745 -0.0220853 +-0.0621803 0.161575 -0.027587 +-0.0176337 0.125847 -0.00119502 +0.0328914 0.0578172 0.038629 +-0.0414935 0.0776367 0.0431734 +0.0432388 0.0804742 0.027354 +-0.0137772 0.0770735 -0.0384143 +0.0572117 0.0509068 0.011186 +-0.0689532 0.132595 -0.00851473 +-0.0655849 0.0622273 0.00026904 +-0.0535585 0.062801 0.0308747 +-0.0779359 0.154614 0.00720975 +0.00448513 0.0964789 0.0523472 +-0.060329 0.11723 -0.0118118 +0.029915 0.0430998 0.0305942 +-0.0275027 0.115261 0.0337596 +-0.0635137 0.0412627 -0.00639269 +-0.0164929 0.11134 0.0406952 +0.0292409 0.0951488 -0.0187111 +0.0324104 0.0430965 -0.00468251 +0.0317605 0.08491 0.0425067 +0.0289099 0.0929198 0.0437028 +-0.0707001 0.15817 -0.0449161 +0.0551137 0.0732038 0.0153863 +-0.0823243 0.154364 0.0217732 +-0.0715111 0.145604 0.0434169 +-0.0325077 0.0632413 0.0389915 +-0.0696524 0.0680017 0.0300044 +0.0102276 0.0809104 -0.0321098 +-0.0244999 0.049902 0.0466266 +-0.0554111 0.0574706 -0.0044262 +-0.0628667 0.101101 -0.0182166 +-0.00650089 0.0661332 0.0560881 +-0.0330903 0.15925 -0.0128209 +0.042117 0.0792074 0.0292753 +-0.085793 0.0818712 0.00648437 +-0.0594817 0.0426754 0.0236965 +-0.0539359 0.0541543 0.0107637 +-0.00998113 0.12997 0.0175362 +-0.0633398 0.0410523 0.0148679 +0.0595186 0.0696512 0.0111197 +-0.0628106 0.0420167 0.0410925 +-0.0280399 0.038261 0.000453129 +-0.0314842 0.0386701 -0.0153847 +-0.0183396 0.183004 -0.0240946 +-0.0414917 0.0662628 0.0414077 +-0.0512875 0.0335238 -0.00177633 +-0.009723 0.0684621 -0.0362531 +-0.0736747 0.166615 -0.0419946 +-0.0678387 0.0966346 -0.0163917 +-0.0609822 0.170956 -0.0597011 +-0.0778143 0.0696403 0.00741827 +-0.00249339 0.0619776 0.0560364 +-0.0574944 0.0732758 0.0411576 +0.0174045 0.0834609 0.0516215 +0.0222999 0.0360441 0.0108303 +-0.0134047 0.0981882 0.0494032 +-0.0437579 0.0335748 -0.0150071 +0.0210813 0.123852 -0.00148905 +-0.0530498 0.14867 -0.00246875 +-0.00549096 0.105886 0.0440438 +0.0181231 0.0349865 -0.00397885 +0.011218 0.0822648 -0.0313395 +-0.0785671 0.172906 -0.0416992 +-0.0304948 0.094646 0.0448519 +-0.0315011 0.101567 0.0426346 +-0.0867319 0.116264 0.0471164 +-0.0745642 0.0928269 0.03994 +-0.0287411 0.0366033 0.0533099 +-0.0733382 0.158682 -0.00576511 +-0.011641 0.172783 -0.0205328 +-0.0261276 0.166758 -0.01752 +0.0323797 0.117481 0.0145242 +-0.073083 0.166616 -0.0429976 +0.00318323 0.0894801 -0.0335291 +-0.0592544 0.0696245 0.0378273 +0.00902499 0.0346466 0.0239397 +-0.0614627 0.0334736 0.00162861 +-0.081048 0.154699 0.0221975 +-0.0337735 0.0765809 -0.0265027 +-0.0440788 0.0336672 -0.00594116 +-0.0501186 0.0375352 0.0462556 +0.0383972 0.0931984 -0.0106151 +-0.0507798 0.0488052 0.0196439 +0.0480167 0.0525694 0.0306027 +-0.0715181 0.0657302 0.000515199 +-0.0584278 0.0383351 -0.00941724 +-0.0484961 0.0987927 0.0435149 +-0.00449408 0.088412 0.0569078 +0.00197552 0.0378956 -0.000532016 +-0.0538466 0.0665391 0.0363755 +-0.0736039 0.148578 -0.0278556 +-0.0406505 0.117474 -0.0142631 +-0.0354963 0.0690808 0.0415601 +-0.063566 0.148289 0.0378536 +0.0187266 0.0350257 0.0273865 +0.00460237 0.0388981 -0.00652166 +-0.0775459 0.0688051 0.0117853 +-0.0880987 0.13916 0.0101984 +-0.0871517 0.106348 0.0123653 +-0.0867616 0.0833332 0.0134846 +-0.053009 0.0343093 0.0275811 +-0.0793348 0.0980896 0.0346601 +-0.0751339 0.0669087 0.0157231 +0.0158163 0.0344928 -0.00398192 +-0.0754309 0.0981509 0.0378194 +-0.0695415 0.15615 0.0130838 +0.00196735 0.0370051 -0.0146847 +-0.0711264 0.142566 -0.0097279 +-0.0202009 0.17418 -0.0222934 +-0.0315791 0.125791 0.0170798 +-0.0460989 0.157633 -0.00826241 +-0.0164967 0.0701922 0.0547571 +0.0456793 0.0890097 0.00617442 +-0.0263303 0.0336202 -0.0227625 +0.0458885 0.0778077 0.00419775 +-0.0613708 0.044683 0.0409908 +0.00384566 0.0341227 -0.0209701 +-0.0771455 0.156966 -0.0119003 +0.0355806 0.113279 0.0157103 +-0.036902 0.0362143 0.0131672 +-0.0532397 0.146242 0.0224016 +-0.0474989 0.107059 0.0399589 +-0.0857477 0.109049 0.020349 +-0.0892569 0.122633 0.00330914 +0.054626 0.0562289 -0.00078591 +-0.0161012 0.16832 -0.0147108 +-0.0788763 0.0949177 -0.010577 +0.026592 0.0578126 -0.0217526 +-0.061825 0.164563 -0.0576805 +-0.0210306 0.180146 -0.0147237 +-0.0474984 0.0833402 0.0443799 +-0.0884317 0.131079 0.0440854 +-0.0591643 0.0341749 0.0263998 +0.0381002 0.078079 0.0357853 +-0.0515897 0.146262 0.0154112 +0.0121111 0.116449 0.0370148 +-0.0414388 0.033531 0.00382893 +-0.0200653 0.172726 -0.0151523 +-0.0170332 0.164657 -0.0177746 +-0.0212056 0.0336704 -0.0218021 +-0.0696662 0.0710058 0.0344116 +-0.0516682 0.152149 0.0128837 +-0.0125103 0.0687513 0.0543288 +0.0366353 0.0982561 -0.0107953 +-0.0789343 0.0700266 0.0104198 +-0.0897898 0.136552 0.0342 +-0.0127086 0.0383825 0.00890404 +-0.0624498 0.166273 -0.0455815 +0.0326592 0.0619445 0.0401066 +-0.0457467 0.132003 0.0161756 +-0.0886572 0.111878 0.019323 +-0.0532618 0.0335957 0.00317772 +-0.0164951 0.109966 0.0413377 +0.0543768 0.0731861 0.0106539 +-0.0174802 0.127364 0.0206736 +0.0567172 0.0621967 0.0256596 +0.0464307 0.0792576 0.0101822 +-0.0292965 0.0818454 -0.0346209 +0.0426284 0.0719164 -0.00480026 +0.0578503 0.0648244 0.0238145 +0.0430174 0.0637781 -0.0018983 +-0.0794408 0.0768726 0.0291038 +0.0545285 0.0622324 0.0277996 +0.0441819 0.0945484 0.0191589 +-0.0284244 0.119569 -0.0104891 +-0.0778403 0.10982 0.0432074 +0.0160506 0.0754058 0.0531341 +-0.0523159 0.0517943 0.0256431 +-0.0181754 0.17123 -0.0220272 +-0.049306 0.147765 0.0110054 +-0.0405044 0.166738 0.00354035 +0.0214342 0.0934308 -0.0229317 +0.0452295 0.0931909 0.0101587 +-0.0352058 0.126987 0.0025067 +-0.0177396 0.0642294 -0.0366219 +-0.0251728 0.1712 -0.0194857 +0.0122607 0.0538397 -0.0290819 +-0.0902417 0.133644 0.00722857 +-0.0815914 0.0767239 0.0235201 +-0.0534472 0.146228 0.0234079 +0.0235949 0.0875751 0.0483132 +-0.0647237 0.158466 -0.0128094 +-0.0260145 0.0688342 -0.034504 +-0.0770801 0.15139 0.0355785 +-0.0630768 0.0336712 -0.00794186 +-0.0574971 0.10156 0.0427298 +0.0435266 0.0664036 0.0265247 +-0.0500812 0.146304 0.0115954 +-0.0568525 0.0521385 0.00567837 +-0.0436626 0.0607395 -0.0127771 +-0.0426472 0.117732 -0.0145554 +-0.0805782 0.112389 0.0458728 +-0.0161125 0.127667 0.00290411 +-0.00749701 0.0576432 0.054379 +-0.0454968 0.0775542 0.0422104 +-0.0694956 0.0958583 0.0420894 +-0.0369639 0.0346855 -0.0305537 +-0.0640756 0.151735 -0.033508 +-0.00249095 0.0718247 0.0580407 +-0.0583644 0.065095 0.0331446 +-0.0748917 0.16378 -0.0359985 +-0.0710199 0.0662278 0.0242287 +0.035425 0.0754528 0.0389267 +-0.0547392 0.075379 -0.0185175 +0.0462455 0.0784487 0.0155769 +-0.0310503 0.155166 -0.00836756 +-0.0879532 0.117604 0.0468721 +-0.0630191 0.169374 -0.0476038 +-0.0445267 0.0423569 -0.0163056 +-0.0624997 0.0818785 0.0437679 +-0.0842794 0.115636 -0.000747849 +-0.0700345 0.0631474 0.0200567 +0.0125104 0.105746 0.0436503 +-0.0795696 0.0976882 -0.00856087 +-0.0495247 0.141678 0.0113921 +0.0166382 0.123302 0.0301317 +-0.0367737 0.0813353 -0.0218258 +0.0465043 0.0597504 0.0314309 +-0.0777677 0.0975799 -0.010556 +-0.0460219 0.166062 0.00401182 +0.0609087 0.0623561 0.0101482 +-0.0403969 0.033577 0.00400031 +0.0286533 0.0578113 0.0412965 +0.0447855 0.0917675 0.0181585 +-0.0238167 0.0929782 -0.0327062 +-0.0714891 0.129823 0.0511416 +-0.0235755 0.157761 -0.0033973 +-0.0525761 0.136549 0.0284096 +-0.0177757 0.0756957 -0.0389571 +-0.0184004 0.0383962 0.0258071 +-0.0162165 0.175672 -0.0252165 +-0.0326786 0.0835446 -0.0285522 +-0.0897198 0.135201 0.0382086 +0.0138704 0.12508 0.0305218 +-0.0334383 0.0383149 -0.00250434 +0.0173372 0.059408 -0.0277846 +0.02739 0.119413 -0.00163712 +-0.055795 0.129741 0.0368819 +-0.0124902 0.0560062 0.0517339 +0.00742257 0.034128 0.000278711 +0.0312441 0.0828649 -0.019558 +-0.0804968 0.149757 0.0362335 +0.0224909 0.107012 0.0395338 +-0.0282283 0.117946 -0.012805 +-0.0726553 0.180933 -0.0546755 +-0.0683563 0.134056 0.04686 +-0.0197453 0.163025 -0.0159769 +-0.0591933 0.155725 0.01387 +-0.0522733 0.13577 -0.00153662 +0.0413723 0.0971667 -0.00382246 +-0.0920493 0.125439 0.00826634 +-0.0522301 0.0388364 0.0467813 +0.0151427 0.107227 -0.0182666 +-0.0397192 0.03358 0.00232461 +0.0373971 0.049112 -0.00639066 +-0.0698932 0.120907 -0.00884856 +-0.0667865 0.156181 0.0155153 +-0.0865635 0.0819919 0.0164862 +-0.0276111 0.0476412 -0.0256716 +-0.050104 0.0515366 0.0156131 +-0.0466794 0.0620985 -0.0127944 +-0.0784369 0.170061 -0.0360578 +-0.0714268 0.173765 -0.0397048 +-0.0313808 0.0567165 -0.0143886 +-0.0309651 0.0347631 0.0441412 +0.0067865 0.130497 0.0221788 +-0.0524448 0.149335 0.0194038 +-0.0414976 0.0860064 0.0425981 +-0.0709701 0.155369 -0.0459101 +0.00322675 0.0810659 -0.0345434 +-0.0294909 0.0917678 0.0440939 +-0.0734658 0.151245 -0.0358847 +-0.079509 0.130274 0.0528999 +-0.00249263 0.0534855 0.0544759 +-0.070992 0.0395652 0.00837515 +-0.0868944 0.122556 -0.00173403 +-0.0574179 0.0608499 0.024689 +-0.0424855 0.09447 0.0423231 +-0.00342977 0.0386245 0.00511046 +-0.018769 0.037629 -0.017491 +-0.0527937 0.0869491 -0.0216809 +-0.0846182 0.106299 0.024344 +0.0443742 0.0818795 -0.000800454 +-0.0894613 0.148789 0.0111841 +-0.0867708 0.110409 0.0193573 +-0.0310025 0.176085 -0.0150686 +0.00863383 0.115058 0.0390007 +-0.0408994 0.163853 0.00394115 +-0.057289 0.0707546 0.0390509 +-0.0646832 0.0432745 0.0336962 +0.0205013 0.0892461 0.0486645 +-0.0625318 0.0662874 0.0329584 +-0.0608083 0.147764 -0.00265379 +0.00615212 0.112907 -0.0196236 +-0.0299927 0.0436118 -0.0290457 +-0.0158151 0.162561 -0.00896512 +0.00597686 0.130404 0.00157669 +0.0284244 0.0822003 0.0446831 +0.0211099 0.0605491 0.0480139 +-0.0234016 0.184697 -0.0149423 +0.00333349 0.0390305 -0.00876711 +-0.0635183 0.159851 -0.052592 +-0.0770983 0.150031 -0.00589737 +0.0214723 0.0878669 0.0490265 +-0.0679264 0.131258 0.0474463 +0.00194863 0.100763 -0.0227079 +0.00777681 0.0385776 0.0292039 +-0.022633 0.08929 0.0533197 +-0.00603192 0.127393 0.0291246 +-0.0911594 0.120221 0.0443019 +-0.0894985 0.121276 0.00330358 +-0.0368227 0.0914861 -0.023804 +-0.0530502 0.151987 0.0175947 +-0.0672887 0.121448 0.0519139 +-0.0568311 0.0912579 -0.0217399 +-0.0697681 0.0822532 -0.0170635 +-0.0874076 0.0990828 0.0243308 +-0.0355048 0.108366 0.0378272 +0.0287346 0.10342 0.0381993 +-0.0860991 0.0964962 0.0273389 +0.0321886 0.108821 -0.00928902 +-0.0781375 0.103077 -0.00856917 +-0.0630075 0.0458305 0.00872119 +-0.0737672 0.068042 0.0238437 +-0.0863239 0.111846 0.0325401 +-0.00949559 0.10164 0.0439977 +-0.0902184 0.117255 0.00530427 +-0.075404 0.0914629 0.0394057 +-0.0453927 0.0336614 -0.0191153 +-0.0827835 0.0790493 0.0255103 +-0.0912019 0.132413 0.0272298 +-0.0564798 0.081975 0.044689 +-0.072928 0.148723 -0.0327819 +-0.00163455 0.0466691 -0.0289171 +-0.0665675 0.0355377 -0.00701232 +-0.000953404 0.100702 0.0462281 +-0.00881786 0.169637 -0.0227487 +-0.0201288 0.165284 -0.0176913 +-0.0859703 0.127103 0.0488324 +0.0255102 0.106068 0.0387825 +0.0570523 0.0522954 0.00619533 +-0.0407044 0.0491484 -0.0113833 +-0.0394747 0.168236 0.00277528 +-0.0690053 0.160967 -0.0519594 +0.0161135 0.0534638 0.0477167 +0.0284604 0.079188 -0.0220838 +0.0113708 0.0523816 -0.0287924 +0.0393128 0.0955964 -0.00780286 +-0.020906 0.0387029 0.0322136 +-0.00871553 0.0642094 -0.0357226 +-0.0547883 0.08548 -0.0214211 +-0.0725291 0.0901409 0.0413911 +-0.0566631 0.0629472 -0.00640536 +0.00234532 0.0524899 -0.0301138 +-0.0938956 0.118755 0.0202995 +-0.0414996 0.0846033 0.0426094 +0.00904636 0.090083 -0.0314826 +0.00730102 0.131 0.00524198 +-0.0637681 0.0809918 -0.0188675 +-0.0414945 0.041025 0.0428519 +-0.087002 0.140499 0.00821758 +-0.0709364 0.151841 0.036169 +-0.0634902 0.106988 0.0392647 +-0.0628225 0.0910404 -0.0189489 +-0.0105509 0.165091 -0.0177492 +-0.00157082 0.0341515 -0.0183868 +-0.0378749 0.105661 -0.0201869 +-0.0689412 0.079144 0.0404114 +-0.0239658 0.0335277 -0.0259671 +-0.0732183 0.172207 -0.0490431 +-0.0205007 0.0971766 0.0453281 +-0.0778797 0.109167 0.0401678 +0.000488577 0.0965409 0.0535304 +-0.0172908 0.177187 -0.018141 +0.00409629 0.128905 0.0269756 +0.0212668 0.080528 -0.0265872 +-0.0484872 0.0931824 0.0442201 +-0.0703872 0.161044 -0.0469664 +-0.0556945 0.0334591 0.00641451 +0.043113 0.0972735 0.00118522 +-0.0465526 0.147719 0.00793526 +-0.0620051 0.0336477 0.00854436 +-0.0789484 0.130998 -0.00538086 +-0.0329884 0.0347673 0.0437059 +-0.011676 0.0389222 -0.00979553 +-0.0102112 0.168384 -0.01842 +-0.058489 0.0747585 0.0420339 +0.0115041 0.129313 0.00109395 +-0.0186879 0.0554617 -0.0328673 +-0.0198225 0.168315 -0.0130587 +-0.013087 0.0382629 0.0179922 +0.0130281 0.0916311 -0.029044 +0.0271142 0.0463333 0.0371793 +-0.0618303 0.167813 -0.0535931 +0.0164903 0.113991 0.0376096 +-0.0592845 0.0336203 0.0127024 +-0.0728419 0.0642516 0.016748 +-0.0527116 0.12267 0.0360612 +-0.091424 0.144749 0.0231531 +0.0225812 0.0946281 -0.0221802 +-0.073319 0.153662 0.0322986 +-0.0384844 0.109782 0.036904 +-0.0551177 0.156069 -0.00176933 +-0.0195075 0.0512747 0.046374 +0.0374508 0.109679 0.00217662 +-0.0624744 0.163093 -0.0485882 +-0.0482041 0.0335795 -0.00119996 +0.0115865 0.127977 -0.0019288 +0.00494704 0.131338 0.0186496 +0.00228726 0.131702 0.0133903 +-0.0890002 0.134996 0.00522535 +0.0114372 0.12283 -0.0103617 +-0.0719092 0.180772 -0.055937 +-0.0144633 0.051615 0.0495133 +0.0147782 0.034634 0.0233109 +-0.0647828 0.177875 -0.0546137 +-0.0882908 0.103675 0.012381 +-0.0631313 0.0343469 0.025414 +-0.0255881 0.169753 -0.0108444 +0.0323006 0.0361518 0.00522301 +-0.0682938 0.06404 -0.00150269 +-0.0705485 0.167591 -0.022181 +0.0271973 0.0508207 -0.0197147 +-0.01565 0.10151 -0.0235687 +-0.0233444 0.0380443 0.0215084 +-3.10615e-05 0.0346258 0.0437307 +-0.0391691 0.162354 0.00112683 +-0.0657552 0.0422954 0.0115704 +-0.0745006 0.142795 0.0461595 +0.0473913 0.0422357 0.0119475 +0.0144595 0.121944 0.0333941 +-0.00358089 0.036197 -0.0248262 +0.0394746 0.0459091 0.0309432 +-0.0744487 0.141666 -0.00675172 +-0.0615813 0.0380878 0.0442214 +-0.0393467 0.0392853 0.042122 +-0.0229052 0.0945537 0.0478017 +-0.0281182 0.0563778 -0.0244009 +-0.0325146 0.112544 0.0353443 +0.0114695 0.0949418 0.0507264 +-0.027899 0.0377311 0.0244577 +-0.0247344 0.0668597 -0.034525 +-0.0623338 0.163141 -0.0335899 +0.0341266 0.0993109 -0.0131459 +-0.0130965 0.169821 -0.0173751 +0.0250182 0.11137 0.036342 +-0.0513993 0.14316 0.0173798 +-0.0521465 0.121207 0.0350569 +0.0134264 0.0403382 -0.0227982 +-0.0919004 0.143349 0.0181646 +0.0256492 0.0831048 -0.024123 +-0.0614955 0.0973435 0.04311 +0.0110632 0.0360404 -0.022358 +-0.0702704 0.159573 -0.0469358 +-0.0135146 0.181607 -0.0231689 +0.0462675 0.0778418 0.00718957 +-0.057322 0.0452663 0.0256799 +-0.0473932 0.0337786 -0.0140697 +0.0180643 0.0577618 0.0488361 +-0.0840242 0.151932 0.0065796 +-0.0547337 0.0738545 -0.0174125 +-0.0647273 0.156687 -0.0474505 +-0.0184955 0.0513594 0.0472431 +0.0314014 0.0491212 -0.0073371 +-0.0336406 0.0339783 -0.0207966 +0.0302861 0.0722616 -0.0207987 +-0.0707237 0.135491 0.0487549 +0.0373244 0.0861524 0.0364715 +-0.0839874 0.129456 -0.00327263 +-0.0579656 0.0599816 -0.000771046 +-0.0374903 0.0917378 0.0437278 +-0.0421167 0.157651 -0.00983865 +-0.0774831 0.151439 -0.0048996 +-0.0664918 0.167987 -0.0292876 +-0.0348246 0.12664 0.0173665 +0.0288107 0.113482 -0.00830654 +-0.0939345 0.122834 0.0252963 +-0.0236453 0.0906062 0.0514725 +-0.0623453 0.151603 -0.000787959 +-0.0394885 0.0520168 0.0393574 +-0.0228668 0.103033 -0.0236969 +-0.0205005 0.115412 0.03703 +-0.0206187 0.158806 -0.0102834 +-0.00380864 0.0840797 -0.0375505 +-0.0846424 0.139002 0.00130344 +-0.0244403 0.0384399 0.0299279 +-0.0256136 0.0707601 0.0441795 +0.0431065 0.0733659 -0.00379081 +-0.0334964 0.0575473 0.0382542 +-0.0732341 0.100848 0.0383652 +-0.0417523 0.0392031 -0.0263092 +-0.0600247 0.0335577 0.00903367 +0.0319454 0.0782138 0.0427262 +-0.0478947 0.122501 0.0288841 +-0.0215102 0.0435311 0.0534788 +-0.0175036 0.0357848 -0.0270478 +-0.0659221 0.115196 -0.0104247 +-0.0452512 0.0574076 0.0387158 +-0.0318518 0.100063 -0.022678 +-0.062214 0.131105 0.0398962 +-0.0570307 0.151068 0.0316808 +-0.0390807 0.159219 -0.0117734 +-0.0575439 0.0421232 0.0457366 +-0.0434958 0.166715 0.00391556 +0.0435215 0.0973118 0.0181533 +0.0364745 0.0384289 0.0206775 +0.00783805 0.034796 0.0434029 +0.00550647 0.0519309 0.0530702 +-0.0452904 0.125307 0.0239255 +0.0384949 0.0469555 0.0314897 +-0.0344994 0.0860255 0.0426749 +-0.0604675 0.0334377 0.00185915 +0.00564306 0.109569 0.0416563 +-0.0341393 0.169665 -0.0151103 +0.0252174 0.115733 -0.00872379 +-0.0432318 0.0365168 -0.0263599 +-0.0648058 0.0881399 -0.0188881 +-0.0113055 0.0420913 0.0500945 +-0.0768733 0.0742923 -0.00658087 +-0.0718355 0.0757492 0.0369191 +-0.00552934 0.126815 -0.00649473 +-0.015298 0.113338 -0.0180384 +-0.0658513 0.168603 -0.0333515 +-0.0769239 0.160393 -0.0146649 +-0.0789031 0.0913518 0.0358575 +-0.0622512 0.175627 -0.0566298 +0.0427075 0.100107 0.0161639 +-0.0122664 0.0420539 0.0504523 +-0.0593768 0.116855 0.0386274 +-0.0207916 0.117992 -0.012906 +-0.0209967 0.0893299 0.0545201 +-0.0293388 0.0522666 -0.0213646 +0.042 0.102859 0.00616839 +-0.0915744 0.128321 0.0372423 +-0.0745556 0.104899 0.0367465 +-0.0874341 0.0860792 0.0144694 +-0.0893403 0.0983511 0.0184032 +0.0265834 0.0915781 0.0456097 +0.0111147 0.0359709 0.0304167 +-0.0251149 0.163764 -0.0159045 +0.0379525 0.0888235 0.0356698 +-0.0308593 0.102934 -0.0225503 +-0.0849458 0.0817985 0.00448942 +0.016843 0.101962 -0.021958 +-0.0602648 0.153206 0.0324327 +-0.00109974 0.118227 -0.0153259 +-0.0277867 0.0904111 0.0457123 +-0.0632329 0.149656 -0.0246848 +-0.0378318 0.0943285 -0.0232947 +0.00942926 0.0360304 0.00452751 +0.00308943 0.0346383 -0.0160359 +-0.0629538 0.164686 -0.0335942 +-0.0707579 0.0639499 0.00302292 +-0.0806378 0.0734203 0.0185511 +-0.0114878 0.0502762 0.0503958 +-0.051624 0.0589527 -0.00929309 +-0.0724662 0.156284 0.0178613 +-0.0755506 0.0791122 0.0357048 +-0.0599662 0.0605914 -0.00103222 +-0.0407972 0.128426 0.00338476 +-0.0685036 0.0972643 0.0418698 +0.0384545 0.081427 -0.0137424 +-0.0869304 0.137738 0.00419643 +-0.0915894 0.118845 0.0433559 +-0.0375104 0.0344317 -0.0164034 +0.0132714 0.0779991 -0.0309033 +-0.000460653 0.0717499 0.0573883 +-0.0689415 0.128234 -0.0091158 +-0.00449889 0.0389099 -0.0139692 +-0.00687105 0.104506 -0.0230032 +-0.0625734 0.0333471 -0.00389969 +-0.0466818 0.0680053 -0.0151447 +0.0325669 0.0564098 0.0381516 +-0.00676687 0.0770295 -0.0375725 +0.031043 0.0535582 0.0376713 +-0.0252324 0.0383969 -0.00646059 +-0.0781312 0.100777 0.0347873 +-0.0351912 0.0448435 0.0445858 +-0.0618482 0.0460583 0.00900481 +-0.0510378 0.148698 -0.00295565 +-0.0758068 0.170822 -0.0449998 +0.0228822 0.0407495 0.0397886 +-0.0556881 0.123137 -0.00801327 +0.041209 0.10285 0.0181659 +-0.057716 0.154704 0.0245626 +-0.0356589 0.0394362 0.046602 +-0.018436 0.0384553 -0.00144245 +-0.0725091 0.147853 -0.0287195 +0.0195403 0.0672509 0.0492981 +-0.00949487 0.11143 0.0422271 +0.0387128 0.0407096 0.0245464 +0.0274937 0.0354669 0.00307886 +0.0251817 0.0344441 0.0110044 +-0.0734653 0.11597 0.0519419 +-0.0517405 0.0367791 -0.0118947 +-0.0313584 0.0347088 0.042355 +-0.0271594 0.0577744 0.0376032 +0.0289959 0.083514 0.0437755 +-0.0609886 0.0421383 0.0435161 +-0.0642758 0.0379734 0.0412454 +-0.0669901 0.171097 -0.0394962 +0.00201718 0.0342688 0.0083365 +-0.0376227 0.0519888 -0.0106273 +-0.0604976 0.0761414 0.0420756 +0.0231651 0.0624431 -0.0251426 +-0.0444966 0.100126 0.0423688 +-0.0434704 0.0888362 0.0427012 +-0.0739012 0.112096 -0.00769672 +0.0113285 0.0381477 0.0446991 +0.0606492 0.0595518 0.0111602 +-0.0344028 0.0453249 -0.0266763 +-0.0238559 0.100178 -0.023968 +0.0124979 0.0363631 -0.0219171 +-0.0386629 0.0606634 -0.011982 +-0.0845122 0.0778323 0.0175087 +-0.0447652 0.0811738 -0.019998 +-0.0325802 0.0708663 -0.0234636 +-0.0428489 0.09852 -0.021578 +0.0343638 0.0491351 -0.00656846 +-0.00173319 0.108975 -0.0214067 +-0.0513914 0.0516798 0.0216239 +0.00608628 0.101527 -0.0214717 +-0.0746196 0.147202 -0.0138555 +-0.0464944 0.0733156 0.0418074 +0.0275533 0.0550749 -0.019815 +-0.0617588 0.0455326 -0.00130544 +-0.0627435 0.14749 -0.0135844 +0.0114636 0.0347788 0.020691 +0.0413154 0.0451948 0.0296022 +-0.0855482 0.149965 0.0308161 +0.045359 0.04899 -0.00489955 +0.000884291 0.038993 0.0274224 +-0.086804 0.0846773 0.00948205 +0.00217921 0.090906 -0.033534 +-0.0074916 0.0518487 0.0520774 +-0.000472995 0.0746288 0.0583091 +0.00707409 0.0348007 0.0234037 +0.0191098 0.127253 0.00673134 +-0.00312412 0.123427 0.0346626 +-0.0251492 0.0379137 0.0122303 +-0.030188 0.124116 0.0205603 +-0.0326284 0.178159 -0.00692862 +-0.0371849 0.0430027 -0.0273252 +0.000516139 0.0703294 0.0566091 +-0.061834 0.155291 -0.0275862 +0.0144787 0.103102 0.0461637 +-0.0601666 0.138122 0.0340792 +0.0447845 0.0903596 0.0201575 +-0.0175794 0.128153 0.00899134 +-0.0654784 0.133956 0.0422213 +-0.078379 0.0698242 0.00895098 +-0.0544145 0.0561001 0.0105768 +-0.0166845 0.0625881 0.0524778 +0.0283147 0.0712973 0.0426773 +0.00750546 0.105745 0.0420743 +-0.0365184 0.126747 -0.000928274 +-0.0297912 0.154227 -0.00467156 +0.0242356 0.0804257 -0.0251216 +-0.0507602 0.0797387 -0.0202693 +-0.0399713 0.112687 -0.0172474 +0.0170749 0.128355 0.00741174 +-0.0399375 0.150681 0.00347523 +-0.0608612 0.0435863 0.0137318 +-0.0365883 0.0485443 -0.0138981 +-0.0910601 0.132402 0.0282222 +-0.0795844 0.0759236 -0.00451678 +-0.0809274 0.12805 -0.00535084 +-0.0711513 0.132664 0.0498849 +0.0150413 0.120568 0.0342385 +0.00849911 0.119651 0.036768 +-0.0569109 0.033599 0.014995 +-0.0689033 0.0887623 0.0428815 +-0.020138 0.166773 -0.018707 +-0.0815894 0.0926183 0.0328436 +0.00319943 0.0866473 -0.0337836 +-0.0528475 0.140082 0.0254195 +0.0217844 0.118301 -0.00950952 +-0.0305318 0.0734349 -0.0315361 +-0.0355385 0.040818 0.0464546 +-0.0446309 0.0563208 -0.0114385 +-0.0779756 0.13395 -0.00568102 +-0.0924453 0.114684 0.0163206 +-0.0427865 0.0855262 -0.0214717 +-0.030041 0.0819074 -0.0335886 +-0.0350329 0.037518 0.0477355 +-0.0574727 0.0791252 0.0438951 +-0.0347822 0.124221 0.0233214 +0.0396853 0.0674479 -0.00978879 +-0.0280887 0.123076 -0.00418723 +-0.0357494 0.0383801 -0.010405 +-0.0896534 0.0983503 0.0154045 +-0.0393744 0.174134 -0.00504658 +-0.00548988 0.121033 0.0366102 +-0.0493281 0.143211 0.0074004 +-0.0618749 0.161566 -0.0365945 +-0.00486561 0.103096 -0.0233724 +-0.0158939 0.0387206 -0.00487532 +-0.0136298 0.0943834 -0.0340901 +-0.0708677 0.158014 -0.00345716 +-0.0679292 0.0674285 0.0308631 +-0.0698001 0.0894083 -0.0167108 +-0.0708742 0.117963 -0.00822963 +0.0544559 0.0679536 0.0254119 +0.0505447 0.0640078 -0.00213219 +-0.0328813 0.11004 -0.0184872 +-0.0329481 0.169751 -0.00390259 +-0.0730465 0.158091 -0.00419381 +-0.0642284 0.165303 -0.0599757 +-0.0393381 0.149359 -0.00118821 +0.027659 0.115893 0.031317 +0.00307915 0.03925 0.0330573 +-0.0268824 0.0338882 -0.0212482 +-0.076206 0.0892711 -0.0135327 +0.036558 0.0887304 -0.0159156 +-0.045503 0.0478046 0.0396725 +-0.00457894 0.0383459 0.0160278 +-0.014359 0.102532 0.0433738 +-0.0263218 0.038308 -0.00105771 +-0.0252694 0.0564528 0.0400125 +-0.0745038 0.137269 0.049596 +-0.0478639 0.102799 -0.0211716 +-0.0698236 0.144589 -0.0179026 +-0.00449355 0.112805 0.041803 +0.0395793 0.107012 0.0171684 +0.0320331 0.117177 0.0215305 +0.0319133 0.103439 0.0357737 +-0.0232571 0.160328 -0.0132723 +-0.0368559 0.101427 -0.0217814 +-0.0779001 0.105799 -0.00757653 +-0.0719733 0.155857 0.00930845 +-0.0667659 0.0664754 0.0301739 +-0.0116086 0.0384341 0.0253641 +-0.0828253 0.0815398 -0.00255091 +-0.00864403 0.0481881 -0.0304747 +-0.0695881 0.0687436 -0.00572614 +-0.053703 0.069339 -0.0141095 +-0.0875622 0.147255 0.0314849 +-0.060703 0.146825 0.0369155 +0.0559661 0.0563559 0.00119345 +-0.0899141 0.140577 0.0142032 +0.0290556 0.0480892 -0.0107335 +-0.0444676 0.0959215 0.0428438 +-0.0126944 0.0614008 -0.0362648 +-0.00712049 0.126279 0.0302479 +0.00717458 0.125139 0.032446 +0.0130051 0.123122 0.0330958 +-0.0658939 0.119442 -0.00885604 +-0.0535827 0.0550746 0.0114399 +0.00820634 0.0865719 -0.0325157 +-0.0358588 0.100033 -0.0223224 +-0.0816885 0.110103 -0.000571623 +-0.0517049 0.0693137 -0.014154 +-0.0304078 0.0499703 0.0425042 +0.0090211 0.0602846 0.0533569 +-0.0102692 0.126825 -0.00441849 +-0.0412575 0.123881 0.0239565 +-0.0304041 0.179805 -0.0103906 +-0.0119972 0.115638 -0.0165051 +0.0413233 0.102851 0.0171643 +-0.032272 0.0343596 0.0389523 +-0.0854712 0.0791996 0.00951147 +-0.0138083 0.082755 -0.0391488 +-0.0256473 0.0335939 -0.0244827 +0.0452831 0.0511563 0.0319003 +-0.0829803 0.153189 0.00837374 +-0.0435404 0.0351992 0.0428237 +0.0114184 0.0389206 -0.0228692 +0.0440394 0.0405103 0.0110966 +-0.0218345 0.0725147 0.0516294 +0.0173744 0.124995 0.027504 +-0.0771042 0.163136 -0.0202013 +0.0282746 0.0494546 -0.0167442 +-0.0703245 0.0805604 0.0403227 +-0.0558701 0.154311 0.0223113 +-0.0790495 0.0785612 -0.00658771 +0.0023439 0.122378 0.0350184 +-0.0220309 0.0609111 0.0451603 +-0.0853195 0.117662 0.0484974 +-0.0580048 0.0366442 0.0464062 +-0.00844255 0.0358982 -0.0250895 +0.0243113 0.119024 -0.0062727 +-0.0558892 0.141955 -0.00229647 +-0.0642262 0.115635 0.0441038 +-0.0719279 0.153998 -0.0419035 +0.0423481 0.0732982 -0.00579253 +0.0103113 0.0595614 -0.0298764 +-0.0818376 0.116236 -0.00283916 +0.0590795 0.0663557 0.00613696 +-0.039497 0.0436994 0.0413132 +-0.0702982 0.0846763 0.0415948 +-0.0167436 0.068615 -0.0382083 +-0.0690033 0.127063 0.0512206 +-0.0485018 0.102883 0.0409949 +-0.0541716 0.144673 0.0274046 +0.0243198 0.0564051 0.0438207 +-0.0308589 0.0382072 0.0517831 +-0.00548321 0.119649 0.0378412 +-0.0606463 0.0434636 0.0431332 +-0.008712 0.171156 -0.0257232 +-0.0444845 0.0846726 0.04342 +-0.0897848 0.135174 0.0342114 +-0.00690926 0.0349718 0.0473534 +-0.0808786 0.122166 -0.00503067 +-0.0779103 0.070378 0.00551561 +0.0134856 0.129689 0.00607818 +-0.0225837 0.0666453 0.0469216 +-0.0525012 0.046573 0.0420391 +-0.0444858 0.091688 0.0430295 +-0.0394965 0.0662956 0.0417788 +0.00897384 0.0364118 0.0277765 +-0.0782046 0.166684 -0.029962 +0.0192461 0.0777761 -0.0276631 +-0.0483417 0.137106 0.010396 +0.0258883 0.12226 0.00355652 +0.0398565 0.0384519 0.0122163 +-0.0408758 0.107069 -0.0201235 +-0.0315055 0.0689302 0.0397623 +-0.068912 0.148468 -0.034342 +-0.0496681 0.0705507 0.0391462 +0.00414266 0.131018 0.00407154 +0.0204354 0.100784 0.0455262 +-0.0587133 0.0708136 -0.0155469 +-0.00369415 0.0386815 0.0249596 +-0.0546088 0.0601814 -0.0071333 +0.0277597 0.0984362 -0.0181936 +0.00136992 0.128685 0.0274437 +-0.0166951 0.0555255 -0.0336624 +0.0054852 0.109984 0.0416767 +-0.079955 0.130987 -0.00485489 +-0.00265109 0.0497012 -0.030809 +-0.0697849 0.145343 0.0431021 +-0.0903934 0.12698 0.0433203 +-0.0409656 0.122163 0.0270528 +-0.056363 0.13673 0.0325483 +-0.00422605 0.0355815 -0.0164762 +-0.0158888 0.123338 -0.00654807 +0.0233356 0.0389315 -0.00470356 +-0.0377622 0.0797629 -0.0199128 +-0.0274204 0.12046 -0.00942796 +-0.0745042 0.0669844 0.00328572 +-0.0544992 0.0400332 0.0469658 +-0.022854 0.100181 -0.0240549 +-0.0748342 0.156367 -0.00257451 +0.00532997 0.0389553 -0.00830106 +-0.0591545 0.129731 0.0390508 +-0.0365933 0.117132 -0.0139142 +0.00710349 0.126169 0.0309735 +0.00420316 0.0838546 -0.0341295 +0.0424932 0.0541962 0.0323753 +-0.0447782 0.039524 -0.0212903 +0.0130456 0.0946785 -0.0262358 +0.0515873 0.047616 0.00226708 +-0.0226971 0.059684 -0.0328522 +-0.0489531 0.117804 -0.0145786 +-0.00521852 0.130779 0.0091953 +-0.0745798 0.155493 -0.021916 +-0.0211637 0.171222 -0.0207379 +-0.0681899 0.15036 -0.0415571 +-0.0645431 0.0356401 -0.00785526 +0.0444401 0.0776895 -0.00177282 +0.0191352 0.0356125 -0.00767677 +-0.0879901 0.0928029 0.00642738 +-0.0274823 0.0617236 0.037721 +0.0406194 0.104193 0.00117617 +-0.0205806 0.0342261 -0.0203167 +0.052283 0.0559902 -0.003254 +-0.0826845 0.0884898 0.0312484 +-0.0354914 0.0719062 0.0418497 +0.00222867 0.0810902 -0.0349213 +-0.0247631 0.123128 0.0239793 +0.00210157 0.111597 -0.0202587 +-0.029962 0.122606 -0.0056563 +-0.0642809 0.173904 -0.0612545 +0.0164873 0.128764 0.0128859 +-0.0290915 0.0334798 -0.0269263 +0.0563251 0.0686891 0.0234174 +0.0388229 0.0428364 0.0281231 +-0.0364553 0.171237 0.000642707 +-0.0695352 0.0422413 0.00168563 +0.0115865 0.119151 -0.014401 +-0.0445078 0.128204 0.0197407 +-0.0735439 0.101276 0.0379813 +-0.0842997 0.131249 0.0498733 +-0.0456134 0.0424471 -0.0132755 +0.00124079 0.0740793 -0.0353703 +-0.0590284 0.155612 0.0197248 +0.00626131 0.0696979 -0.0331897 +-0.0465413 0.123419 -0.0104793 +-0.0145087 0.0587885 0.0518852 +-0.0412993 0.127471 0.0164976 +-0.0621264 0.0457845 0.0326787 +0.00861617 0.0348422 -0.0132521 +-0.0699384 0.129684 -0.00901632 +-0.0174184 0.0961382 -0.0299203 +-0.0408477 0.0999502 -0.0215042 +-0.0629342 0.109643 -0.0151294 +-0.0588992 0.0593658 0.0203903 +-0.0622614 0.0594461 0.0178467 +0.0503092 0.0575099 -0.00459296 +0.0328071 0.0781213 -0.0187889 +0.0297936 0.0354746 0.0165125 +-0.0592597 0.0343664 0.034953 +-0.0736653 0.0761112 -0.0107553 +0.0358581 0.0686798 0.0377462 +-0.0814983 0.102013 0.0310531 +0.0072631 0.0968089 -0.0265119 +-0.0107695 0.0756601 -0.0381615 +-0.0665448 0.142647 -0.010737 +-0.0861837 0.0868588 0.0248974 +-0.0323987 0.114036 -0.016697 +-0.0526124 0.143167 0.0204083 +-0.00749979 0.118315 0.0383098 +-0.0366574 0.0591917 -0.011518 +-0.0854765 0.145991 0.0364919 +-0.0590102 0.131118 -0.0069845 +0.0099878 0.0342067 -0.0142754 +0.0406313 0.0833746 0.032449 +-0.0377389 0.0753784 -0.0182557 +-0.0265179 0.111211 0.0374625 +-0.0457781 0.109842 -0.0182449 +0.0106021 0.12463 0.0322012 +-0.0714609 0.172223 -0.0354286 +-0.0918002 0.143353 0.0191654 +0.009256 0.0681484 -0.0312392 +0.00426025 0.0352382 0.0224392 +-0.0497576 0.0782604 -0.019072 +-0.0628575 0.0953598 -0.0185102 +0.0594691 0.0677866 0.0081304 +0.0120479 0.124912 -0.00663019 +-0.0896003 0.111903 0.0133388 +-0.000572916 0.131478 0.0109076 +-0.0856485 0.103181 0.0252723 +-0.0825849 0.0762413 0.018536 +0.0357614 0.089262 -0.0164786 +-0.0853874 0.0978708 0.0280062 +-0.0250231 0.0373676 -0.0184933 +-0.0224668 0.0384735 -0.00782567 +-0.0215612 0.127036 0.0148264 +0.0375018 0.0527008 0.0316063 +0.0132903 0.0644915 0.0525417 +0.021025 0.0444507 -0.0197096 +-0.0230202 0.0380885 0.0125034 +-0.0190143 0.123258 -0.00649836 +-0.0634892 0.101502 0.0420523 +-0.0022961 0.120938 -0.0122094 +-0.0682754 0.155222 0.00480981 +-0.0105391 0.0444694 0.0492224 +-0.0314884 0.0988001 0.0440684 +-0.0162822 0.113495 -0.0182068 +0.0427502 0.0832247 0.0284671 +-0.0317184 0.124145 0.0214762 +-0.0228243 0.0868132 -0.0375213 +0.0112412 0.122679 0.0339481 +-0.0624726 0.093208 0.0448109 +-0.0195149 0.0474114 0.0506124 +-0.0305029 0.105682 0.0404793 +0.0297926 0.0510441 -0.0147439 +-0.0660587 0.0336733 0.00769062 +0.01375 0.126078 -0.00389468 +0.00623348 0.0768314 -0.0342539 +0.00723812 0.0725784 -0.0338132 +-0.0345032 0.0747169 0.0417978 +-0.0533429 0.0572662 -0.00744815 +-0.0588626 0.0344147 0.0367317 +-0.0597544 0.151092 0.0347772 +-0.066041 0.156288 0.0201296 +-0.0519452 0.0542248 0.0130044 +-0.0536545 0.154299 0.0129697 +-0.0553709 0.131821 -0.00535733 +-0.0165812 0.0355875 -0.0267111 +-0.0671293 0.149176 -0.0346332 +0.0364911 0.112064 0.0146153 +-0.0678122 0.0908837 -0.0169858 +-0.0433492 0.123979 0.0232099 +0.0233446 0.0489622 -0.0213372 +-0.0401353 0.162183 -0.0119788 +-0.0436993 0.0680874 -0.0160622 +-0.0575 0.0589785 0.0215704 +0.002504 0.0605716 0.0560843 +-0.0230753 0.078299 0.0540943 +-0.0532839 0.150877 0.0224035 +-0.0536299 0.144677 0.0243972 +0.0138044 0.129402 0.00474998 +0.0390959 0.0382591 0.0140545 +-0.0935248 0.128245 0.016248 +-0.017174 0.169749 -0.0215263 +-0.00210217 0.035143 0.0464295 +0.00913637 0.105871 -0.0204027 +-0.0861865 0.0926674 0.00242789 +-0.0615271 0.0344278 0.0378839 +0.0506397 0.0652197 -0.00133714 +-0.0859779 0.129848 0.0487451 +-0.0269007 0.0388242 0.0362546 +0.0349035 0.0987755 -0.0125611 +-0.0895593 0.13929 0.0311867 +0.0210026 0.126515 0.0102791 +0.0155029 0.119565 0.0348769 +-0.0660877 0.178333 -0.0536421 +-0.0134986 0.0911752 0.0564813 +-0.0462738 0.0671086 0.039469 +-0.0691002 0.0421453 0.000699576 +0.0106377 0.0658124 0.0539651 +-0.0372457 0.0381548 -0.00680953 +-0.0415057 0.0396254 0.0430594 +-0.0658022 0.0335619 0.00426403 +-0.0549779 0.135599 -0.00339213 +-0.0654711 0.157635 -0.0545345 +-0.0699145 0.135483 0.0481625 +-0.0647392 0.157599 -0.0538703 +-0.0405119 0.125571 0.0212459 +-0.0408461 0.0957242 -0.0225993 +-0.0211708 0.123144 -0.00636628 +0.0528302 0.048039 0.0216552 +0.0292509 0.119574 0.0033793 +0.0456488 0.0861985 0.00518381 +-0.0697746 0.169428 -0.052035 +-0.0583932 0.146765 0.0331817 +-0.0748301 0.174171 -0.0395847 +0.0397534 0.0685495 0.0327941 +0.0603506 0.0581587 0.0121666 +-0.0615125 0.0729203 0.0397926 +0.0320567 0.106099 0.0342281 +0.0259569 0.0632491 0.0444844 +-0.017781 0.12071 -0.00976707 +-0.00292868 0.129815 0.0244395 +0.042563 0.0650705 0.0275619 +0.051394 0.0726569 0.00804397 +-0.0147356 0.124887 0.0290085 +0.0124993 0.116805 0.0367613 +-0.0095857 0.128017 -0.00170998 +-0.0353912 0.0475494 -0.0206462 +-0.0197639 0.0714243 -0.0385337 +-0.0646745 0.0721957 -0.0143162 +-0.0418918 0.129001 0.00740866 +-0.0217734 0.0713925 -0.0382795 +-0.0493632 0.1301 -0.00139208 +0.0232238 0.0822541 0.0494986 +0.0449291 0.081953 0.02316 +0.0595997 0.0567108 0.0101713 +-0.0496185 0.140151 0.0144011 +-0.0524988 0.102874 0.0411998 +0.0342709 0.0876121 0.0408726 +-0.0295799 0.174217 -0.00600797 +-0.0251232 0.165382 -0.00841584 +0.0176002 0.124344 -0.00401113 +0.054323 0.064171 -0.000208879 +-0.0129906 0.0568055 0.0517595 +-0.0751884 0.153035 0.033144 +0.0124885 0.114028 0.0382457 +0.0104651 0.0444795 0.0447526 +-0.033472 0.124985 -0.00213286 +-0.0519318 0.0352921 -0.0124585 +-0.0621937 0.156854 -0.0175927 +-0.0755066 0.11755 0.0524265 +-0.0660809 0.135405 0.0431027 +0.0020291 0.0342762 0.0137843 +0.0320171 0.111398 0.0306261 +-0.0685791 0.147786 -0.0311476 +0.0139278 0.129741 0.0148027 +-0.075709 0.170829 -0.032719 +-0.0241819 0.175647 -0.0202251 +-0.0729646 0.147133 -0.0208616 +-0.0588824 0.0997395 -0.0190365 +-0.0396703 0.036174 -0.00733977 +-0.0195581 0.181635 -0.0160858 +-0.0449923 0.0381195 -0.0222607 +-0.0298707 0.101527 -0.0228594 +-0.0447239 0.169659 -0.000473292 +-0.0547075 0.153861 0.0184094 +-0.00344803 0.111769 -0.0204187 +-0.048864 0.162635 -0.0057974 +-0.0837218 0.154141 0.0154269 +-0.0709606 0.172226 -0.0520527 +-0.000498029 0.0505184 0.0529377 +-0.0916834 0.116094 0.0407438 +0.029535 0.0987313 -0.0165204 +-0.0649388 0.16711 -0.0315896 +-0.00669968 0.0599043 -0.0346663 +-0.0086066 0.042026 -0.0258639 +0.0380982 0.0589726 0.0320786 +0.0284966 0.0768217 0.0447581 +-0.0365356 0.155076 0.00317988 +0.0173692 0.0476632 -0.0235115 +0.0152466 0.0765161 -0.0298116 +-0.061679 0.175513 -0.061381 +-0.03626 0.0434916 0.0442696 +0.0033481 0.0346494 0.040814 +-0.0708559 0.177779 -0.0481346 +-0.0522853 0.153955 0.0120432 +-0.00577511 0.0770351 -0.037534 +-0.0279795 0.0577645 -0.0254 +-0.0474968 0.101477 0.0417865 +0.0418115 0.0872841 -0.00879032 +-0.0272728 0.0383881 -0.00686007 +-0.0828517 0.110648 0.028886 +-0.0677301 0.181168 -0.057983 +-0.0339959 0.0752105 -0.0234884 +0.0227878 0.0350417 0.0227582 +-0.0132511 0.177151 -0.0280569 +-0.0662758 0.159515 -0.0565111 +-0.0759663 0.179251 -0.0520449 +0.0494532 0.0710682 0.00472592 +-0.0158055 0.0931896 -0.0348885 +0.0506418 0.0475027 0.0012667 +-0.0220809 0.0348313 0.0494485 +-0.0681005 0.179488 -0.0529195 +-0.0457387 0.0767861 -0.0183415 +-0.0849611 0.0883696 0.0278927 +0.0410895 0.0670315 0.0294468 +0.0123862 0.0342845 -0.0119874 +-0.0861176 0.152173 0.0250218 +0.00146529 0.0341167 -0.0177588 +-0.0847663 0.132585 0.0488829 +0.041918 0.0732584 -0.00676718 +-0.0704834 0.174975 -0.0436743 +0.0101806 0.114501 -0.0173735 +-0.0274005 0.0647434 -0.0304718 +0.00306398 0.0374048 0.023868 +-0.0908043 0.122683 0.00627651 +-0.0126271 0.0337462 -0.0239473 +0.0294467 0.0623083 -0.0198501 +-0.031353 0.158667 -0.0125849 +-0.0600161 0.129661 -0.00742185 +0.0141451 0.0740257 0.0538731 +0.0348792 0.0378052 0.00236551 +-0.0223477 0.16248 -0.006155 +0.0184989 0.11258 0.037522 +-0.0107925 0.18028 -0.0267448 +0.0112772 0.0752122 -0.0313695 +-0.0481785 0.0341964 0.00728185 +-0.0564997 0.107064 0.0398466 +-0.0510086 0.119975 -0.0128249 +-0.0142596 0.175663 -0.0267921 +-0.028881 0.124884 0.00195054 +-0.0744184 0.069256 0.0261761 +-0.0527672 0.0812315 -0.0212685 +0.0424296 0.0696684 0.0278335 +-0.0272214 0.163934 -0.00616346 +0.0566888 0.0635446 0.0256358 +0.0446243 0.0959671 0.00617079 +-0.0160443 0.174209 -0.0181164 +-0.0310058 0.156198 -0.0100049 +-0.039513 0.166742 0.00312951 +-0.0651923 0.176525 -0.0608469 +-0.0649089 0.110873 0.0375872 +-0.0545067 0.0904158 0.0449797 +0.0328041 0.0682575 -0.0177764 +0.0296649 0.110072 0.0343033 +-0.00848516 0.121007 0.0363393 +-0.0284943 0.0674472 0.03888 +0.0207654 0.126697 0.0144664 +-0.0231479 0.0919482 0.0509374 +-0.0105985 0.0406145 -0.0262787 +0.0525369 0.0651172 0.0279377 +-0.0709498 0.165209 -0.0469921 +0.0101258 0.125306 -0.00703851 +-0.0198334 0.107697 -0.0220521 +0.0228667 0.107306 -0.0156684 +0.0410305 0.0422896 -0.000687891 +-0.0687631 0.080836 -0.0170666 +-0.0685062 0.142066 -0.00982847 +-0.0288706 0.171229 -0.00855169 +-0.0870246 0.129415 0.000309032 +-0.0367401 0.0754253 -0.0187666 +-0.0231137 0.159172 -0.011899 +-0.0445 0.113887 0.0346508 +-0.0617979 0.154608 0.0289232 +0.0322191 0.117688 0.00875184 +0.00258681 0.125467 0.0322572 +-0.0668846 0.117985 -0.00889164 +-0.0560239 0.144237 -0.00161522 +-0.0939473 0.122782 0.0142819 +-0.057663 0.155278 0.0187721 +-0.0653495 0.0459059 0.00467835 +-0.0838817 0.150077 0.00420446 +-0.0574972 0.100168 0.0430053 +0.0447715 0.070791 0.0233171 +0.0114258 0.129163 0.0238841 +-0.0415072 0.0605699 0.0406995 +-0.0495023 0.0862453 0.0455995 +-0.0309567 0.166794 -0.00630909 +-0.0310964 0.125815 0.0157855 +0.0577493 0.0579199 0.00320063 +-0.00748502 0.105882 0.0440003 +-0.0594987 0.0932573 0.0451741 +-0.0584823 0.080492 0.0436889 +0.0565518 0.0722252 0.0100192 +-0.0154726 0.123613 0.0307813 +-0.017794 0.0799068 -0.038901 +-0.0670193 0.0901061 0.04379 +-0.0506534 0.0619401 -0.0109597 +-0.0284985 0.0631152 0.0376198 +0.0405765 0.0793262 0.0323176 +0.0350622 0.0909926 -0.0162992 +-0.0679473 0.136882 0.0457212 +-0.0626008 0.160001 -0.0205855 +0.0143086 0.0623633 -0.0295361 +0.00349883 0.0605728 0.0559342 +0.0235231 0.0943993 -0.0219282 +0.0425314 0.0623712 0.0287546 +-0.0352518 0.156597 0.00331287 +-0.0807586 0.0950245 -0.00854945 +-0.085825 0.114595 0.0464925 +0.0420636 0.0915328 -0.00679501 +-0.0369296 0.0455099 -0.0248207 +-0.0610521 0.0460525 0.00962048 +-0.0476199 0.057734 -0.011287 +-0.0595357 0.0400627 -0.00844467 +-0.0604419 0.114971 -0.0134731 +-0.016194 0.128088 0.0051496 +-0.0365847 0.122192 -0.00920846 +-0.0464591 0.0345029 0.0305523 +-0.0644598 0.0432795 0.035714 +-0.0241405 0.168248 -0.0186857 +-0.0743787 0.145821 -0.0108474 +0.0173308 0.0566344 -0.0283721 +-0.0548894 0.136747 0.0311423 +-0.0579822 0.0343384 0.0317603 +-0.0262958 0.0634474 0.0394208 +-0.0183558 0.127798 0.00725695 +-0.0750251 0.152273 0.0347437 +-0.0648702 0.0334576 -0.000853911 +-0.0610584 0.138406 -0.00654552 +0.0224766 0.0920198 0.0478397 +0.044722 0.0945895 0.0131657 +-0.0873336 0.126682 -0.000726608 +-0.0880434 0.125329 0.00027907 +-0.0364509 0.174337 -0.00256774 +-0.053938 0.138144 0.0289679 +-0.00559979 0.114688 -0.0175182 +-0.00635915 0.0931082 -0.0347376 +-0.0861558 0.100815 0.00240792 +0.0184724 0.0934238 0.0476306 +-0.000245612 0.0350857 0.0144067 +-0.0547132 0.153591 0.0213081 +0.0445999 0.0931357 0.00219092 +-0.0649995 0.134056 -0.00807462 +-0.0360819 0.0351453 0.0214963 +0.0444988 0.0569914 0.0320977 +-0.0597101 0.0723346 -0.0163812 +-0.0468406 0.0985145 -0.021833 +-0.0397006 0.0666136 -0.0148744 +-0.0847301 0.0966436 -0.00257686 +-0.00176079 0.0741065 -0.0358743 +-0.0671962 0.0736816 0.0379285 +-0.0347085 0.169768 -0.00115359 +-0.0213445 0.0916844 -0.035421 +-0.0625559 0.150623 -0.0205762 +0.055585 0.0535517 0.00220948 +-0.0136228 0.128915 0.00609854 +-0.0654189 0.16417 -0.0217177 +-0.0613445 0.0434338 0.042412 +-0.0144732 0.096429 0.0522087 +-0.0707666 0.171245 -0.0323024 +-0.0713393 0.134067 0.0496215 +-0.0458732 0.104238 -0.0208285 +-0.0551833 0.07213 0.0401196 +0.0364832 0.0422343 0.0281778 +-0.0336503 0.0577563 -0.0112696 +-0.0810791 0.117571 0.0486733 +0.044724 0.0588042 -0.00496063 +-0.0568258 0.120959 -0.0097287 +-0.0257724 0.0797722 -0.0374309 +-0.0800654 0.121688 0.0502425 +-0.0569634 0.0335771 0.00964709 +-0.00939357 0.0354504 -0.0173725 +0.046214 0.0637709 -0.0019104 +0.00900714 0.0383394 0.0314785 +0.0457806 0.0890199 0.00717609 +-0.0524951 0.0747684 0.0423102 +0.0334058 0.0446363 -0.00548551 +-0.063072 0.0346346 0.0391063 +0.0073001 0.0907939 -0.0322622 +0.026147 0.0875952 0.0467145 +0.0130004 0.0419341 0.0448362 +0.0263999 0.0348437 0.0163952 +-0.0056357 0.0466988 -0.0297075 +-0.000747471 0.0987058 -0.0265343 +-0.0688283 0.0966095 -0.0161149 +0.00300687 0.0991424 0.049182 +-0.0154864 0.0814755 0.0571167 +-0.074497 0.120396 0.0533632 +-0.0748436 0.114924 -0.0060803 +-0.0168418 0.107354 -0.0217003 +-0.0459377 0.145792 0.000601046 +-0.0487849 0.0715634 0.0402545 +-0.0581679 0.154986 0.022946 +0.044397 0.0945546 0.0171571 +-0.0810292 0.0940061 0.0336494 +0.032953 0.0994589 0.0373001 +-0.0181454 0.0347978 0.0451006 +-0.0487902 0.0855221 -0.0217064 +-0.0776336 0.147268 -0.0038625 +-0.0891133 0.14743 0.0101992 +0.0134061 0.0767276 0.0545687 +-0.0451757 0.14769 0.00639824 +0.0340849 0.114614 0.00225198 +-0.0494981 0.105619 0.0396922 +-0.0291786 0.175627 -0.0167894 +0.0516271 0.0736236 0.0155669 +-0.0333156 0.0365169 -0.0174853 +-0.00225297 0.0388793 -0.00041461 +-0.0884617 0.14585 0.0310303 +-0.087958 0.12395 0.000268768 +-0.0637456 0.154158 0.00252195 +-0.0680618 0.0606588 0.013756 +0.00946449 0.0616923 0.0540126 +-0.00707285 0.12974 0.0027455 +-0.0190315 0.0389958 0.035931 +-0.00971778 0.0670387 -0.0360005 +0.0406669 0.102735 -0.000789188 +-0.085128 0.0845897 0.0244984 +0.00248558 0.111415 0.0422707 +0.00320889 0.0824712 -0.0345101 +-0.0467495 0.117966 -0.0147678 +0.0250223 0.110364 -0.0129553 +-0.044347 0.146755 0.000226372 +-0.0616655 0.144455 -0.00523057 +0.000474346 0.0977989 0.0522897 +0.0207702 0.036271 0.0339301 +0.0400498 0.0387801 0.0063192 +-0.0199993 0.185902 -0.0200623 +0.018427 0.0917703 -0.0251723 +-0.0354635 0.0860418 0.0431394 +-0.0475855 0.0518372 -0.00929506 +0.0429858 0.0691484 -0.00178958 +-0.0244489 0.052187 0.0413714 +-0.0500639 0.141673 0.0143962 +0.0144323 0.129298 0.0192627 +-0.0561449 0.04824 0.0383427 +0.0358665 0.0404526 0.0260172 +-0.0213253 0.0444675 0.0531428 +-0.0609289 0.112535 -0.0147528 +-0.0699845 0.139935 -0.00772138 +-0.0748631 0.106362 -0.00967707 +-0.0346028 0.0344648 0.0366099 +-0.0425153 0.118993 -0.0138741 +0.0153464 0.0537553 -0.0279934 +-0.0719831 0.170733 -0.0298702 +0.0460203 0.0848226 0.00718276 +-0.0760167 0.15688 -0.0219252 +-0.010059 0.109235 -0.0217082 +0.0010095 0.0346721 0.0439005 +-0.0198215 0.0841085 -0.0387066 +-0.020574 0.115387 -0.0161841 +-0.00203672 0.0345877 -0.0169988 +-0.0424883 0.0846004 0.0426298 +-0.0313435 0.0707327 -0.0274782 +-0.0490828 0.13552 0.0213898 +-0.0481015 0.157608 -0.00698963 +-0.0579692 0.0408152 0.0462221 +-0.0682257 0.127075 0.0505767 +-0.0434944 0.0733818 0.0425428 +-0.0905017 0.114314 0.0223543 +0.0242723 0.0647548 -0.0237835 +0.050682 0.0731977 0.010749 +0.0604945 0.0595549 0.015166 +-0.0490636 0.126668 -0.00583208 +0.00647697 0.0459611 0.0484012 +0.0279051 0.0395203 0.0288639 +-0.0314585 0.0335695 -0.0237257 +-0.0485262 0.0344313 0.0301756 +-0.0386172 0.0505956 -0.0110053 +-0.000657388 0.0511382 -0.0308268 +-0.0630072 0.0689485 0.0358468 +0.0316541 0.0351286 0.0116939 +-0.0517065 0.163863 0.00241874 +-0.0634695 0.0445577 0.0356919 +-0.0832566 0.147367 0.0370632 +0.02323 0.0762417 -0.0259573 +-0.0735922 0.0833012 0.0392631 +-0.00431736 0.130694 0.00665461 +-0.021599 0.0382532 0.00358087 +0.0465019 0.0778624 0.0111839 +0.0604451 0.0678689 0.0141533 +0.0213931 0.0489728 -0.0223035 +-0.0630692 0.153725 -0.0105955 +-0.0236572 0.0507797 -0.028024 +0.00430293 0.0625774 -0.0325544 +0.0421362 0.0845969 0.0293292 +0.010951 0.0562864 0.05258 +0.0369412 0.107321 0.0271722 +0.0502975 0.0560957 -0.00457555 +0.0410804 0.10284 0.0191681 +0.0102664 0.0739304 0.0552835 +-0.0397448 0.172952 -0.00234724 +-0.0829232 0.125068 -0.00442148 +-0.0284893 0.0903534 -0.0305816 +-0.0616586 0.172539 -0.056588 +0.0182369 0.0749953 -0.0283712 +-0.0168303 0.0382802 0.00815469 +0.0453551 0.0805854 0.0221747 +-0.0718567 0.0701514 0.0311867 +-0.0814119 0.152728 0.0295837 +0.0555021 0.0730293 0.0140468 +0.00650419 0.123782 0.0339598 +0.0422452 0.0986357 -0.000817871 +-0.072904 0.112135 -0.00834183 +-0.00786498 0.13001 0.00533674 +-0.0614753 0.15686 -0.0265876 +-0.0234913 0.103006 0.0434545 +-0.0093342 0.174192 -0.0247468 +0.048187 0.0717514 0.00605259 +-0.0554773 0.0820103 0.045038 +-0.091005 0.124034 0.00628346 +-0.0147917 0.0951887 -0.0329173 +-0.00125147 0.122854 0.0353 +-0.017497 0.0485942 0.047882 +0.0194854 0.0989751 0.0466096 +-0.0889579 0.0901579 0.00845534 +-0.065396 0.0605193 0.0180241 +-0.0469507 0.168415 -0.00396135 +0.0205156 0.111203 0.0377036 +-0.0928924 0.122885 0.0362699 +0.0213879 0.0686569 0.0484685 +0.0214143 0.0463213 0.0412437 +0.00882931 0.0373958 0.0286749 +0.0465562 0.0764652 0.0121829 +-0.0618529 0.153757 -0.0195806 +-0.0262234 0.119963 0.0294562 +-0.0354913 0.0889091 0.0432238 +0.037993 0.109314 0.0194453 +-0.0377299 0.0739307 -0.0178742 +-0.0184902 0.0815159 0.0575038 +-0.0314396 0.0637247 -0.0204391 +-0.0825513 0.110697 0.0307352 +-0.0728404 0.156111 0.0119063 +-0.0663982 0.164105 -0.0192035 +0.0062922 0.0654161 -0.0325779 +-0.0624759 0.0959475 0.043683 +-0.033686 0.0637452 -0.0146972 +0.0353693 0.102677 -0.0107148 +-0.0710479 0.166372 -0.0194754 +-0.059243 0.0367531 0.0461369 +-0.0908243 0.114994 0.023547 +-0.0650258 0.156351 -0.0487028 +-0.034444 0.159452 0.00265373 +0.0357616 0.0967769 -0.0118087 +0.044965 0.0903773 0.0181662 +0.0498767 0.0734333 0.0134213 +-0.031608 0.0496402 -0.0193495 +0.0404724 0.0408436 0.0229665 +-0.0473115 0.134637 0.0112388 +0.00743122 0.0352845 0.0446812 +-0.0297131 0.0509006 -0.0193584 +-0.0241845 0.177125 -0.0200954 +-0.0632603 0.157387 -0.0151607 +-0.0598965 0.0343774 0.0365453 +-0.0242309 0.0382399 0.0265535 +0.0433792 0.0972945 0.00218055 +-0.00691412 0.124317 0.0332409 +0.00451269 0.0561377 0.0533474 +-0.00250438 0.0842991 0.0575402 +-0.0903673 0.145762 0.0273033 +-0.0523714 0.143148 0.0193902 +0.0362345 0.0967824 0.0350211 +0.0264539 0.106068 0.0383874 +-0.0729303 0.131104 -0.00814819 +0.0116228 0.130194 0.0054038 +-0.0409771 0.113795 -0.0164017 +-0.0828306 0.150071 0.00319212 +-0.0676468 0.0338307 -0.00583252 +-0.0857374 0.0792227 0.0125087 +-0.0651015 0.0410328 0.0295625 +-0.0136795 0.0987823 0.0477955 +0.0258821 0.0794179 -0.0243188 +0.0449394 0.0734628 0.0226146 +-0.0694849 0.173671 -0.0550315 +0.0142482 0.127965 9.03059e-05 +0.0564285 0.0727253 0.0143999 +-0.0172735 0.180097 -0.0253788 +-0.0699136 0.162391 -0.0489495 +-0.09118 0.143373 0.022161 +-0.0644984 0.100116 0.0422372 +-0.0564709 0.0847764 0.0446514 +-0.043754 0.152254 -0.00662286 +-0.0547181 0.0708998 -0.0155975 +-0.0401471 0.163848 0.00326215 +-0.0814342 0.154656 0.0132857 +-0.0513196 0.0514695 0.0138904 +0.00680734 0.129132 0.0265205 +-0.0614938 0.0959769 0.0438595 +-0.0091676 0.171172 -0.0227371 +-0.0769695 0.154154 -0.0139015 +-0.0502302 0.126885 0.0326315 +0.00555777 0.034446 -0.000384949 +-0.0206136 0.0379294 -0.0283016 +0.00719386 0.0810104 -0.0336874 +0.0390033 0.0387188 0.0172773 +-0.0737727 0.0928414 0.040556 +-0.0829975 0.0763193 0.0155222 +0.0461381 0.0792322 0.00519228 +0.0313444 0.106098 0.0349666 +-0.0157326 0.0383302 0.0246146 +-0.0739329 0.072514 0.0322154 +-0.0287063 0.168278 -0.00832187 +-0.02709 0.0386639 -0.0126398 +-0.0689895 0.156345 -0.00130196 +-0.0622523 0.152181 -0.0215758 +-0.0408691 0.158042 0.00401656 +-0.0324935 0.0903869 0.0442776 +0.0156162 0.0904755 -0.0278196 +0.00543406 0.120555 -0.0138758 +-0.0874054 0.110457 0.012344 +-0.0534973 0.0903982 0.0447559 +-0.0007305 0.0683317 -0.0340878 +-0.0847135 0.152577 0.00925173 +0.0453586 0.0547792 -0.00610681 +-0.0513173 0.146268 0.0144074 +0.0146587 0.125796 -0.00358107 +-0.0790281 0.166651 -0.0329632 +-0.0519257 0.0563169 0.0201359 +-0.0206011 0.0382174 0.00381729 +-0.0499923 0.0342577 0.028256 +0.0222487 0.0365239 0.0303911 +-0.0762222 0.0981393 0.0371985 +-0.0381245 0.162196 -0.0129852 +-0.0462852 0.149202 0.00834502 +0.039774 0.0618507 -0.00575724 +0.0461841 0.0778325 0.00618859 +-0.0770439 0.154813 -0.0101321 +-0.0615001 0.152383 0.000341367 +-0.0665808 0.0334125 0.000644743 +-0.0212653 0.0381372 0.0218515 +-0.071123 0.111741 0.0467572 +-0.0265438 0.177186 -0.00862049 +-0.0523481 0.125498 -0.00654313 +-0.0522635 0.0343446 0.0312176 +0.0191745 0.060499 0.0487078 +-0.0855607 0.111744 0.0263451 +-0.0360977 0.156596 0.00383263 +-0.0479431 0.0356599 -0.0132734 +0.0366613 0.0821332 0.0372523 +-0.0478798 0.107016 -0.0192852 +-0.0356524 0.0460406 0.0421919 +0.00919662 0.0865327 -0.0319845 +-0.0808705 0.11922 -0.0043482 +-0.0335583 0.116878 -0.0136466 +-0.0112898 0.0395292 0.0388441 +-0.0194927 0.0814879 0.0571676 +0.0239403 0.124821 0.0127882 +-0.0444942 0.105717 0.0408954 +-0.0484929 0.162245 0.00645185 +-0.00849807 0.0801615 0.0580203 +-0.0487025 0.121311 -0.0122547 +0.00400584 0.0386131 0.0458842 +-0.00449485 0.0488681 0.0504112 +-0.0507263 0.122615 0.0336033 +-0.0801811 0.108648 -0.00360377 +0.029758 0.0352966 0.00556049 +-0.0236293 0.0665652 0.045154 +0.0470549 0.0602552 -0.00440662 +-0.059554 0.155543 0.0209921 +-0.00550703 0.0787847 0.0579843 +-0.0451509 0.0424209 -0.0143059 +-0.0674032 0.144345 -0.0161484 +-0.0621766 0.125515 0.0434733 +-0.0885651 0.0963045 0.0227197 +-0.0623911 0.154382 0.0301734 +-0.078298 0.0745267 0.0278337 +0.00377395 0.13125 0.00536065 +-0.0351573 0.0361738 0.0471926 +-0.0517432 0.0487299 0.0143843 +-0.0578034 0.0854472 -0.0211977 +0.0151488 0.10026 -0.0226403 +0.0225321 0.104677 0.0415312 +-0.0605798 0.155686 0.00466574 +-0.0891628 0.0942977 0.0214104 +0.0393896 0.106975 0.00316583 +0.00351619 0.0800296 0.056385 +0.0405703 0.105644 0.0131657 +-0.0507419 0.0753249 -0.0179378 +0.0269605 0.111014 -0.0116501 +0.0303852 0.098223 0.0405823 +0.0431361 0.0419917 0.0224684 +-0.0738026 0.1492 0.0397758 +-0.0725455 0.148857 -0.0337299 +-0.072371 0.0860632 0.0407672 +0.0158441 0.0475203 0.043749 +0.0104341 0.0346525 0.0368683 +0.0344146 0.0399125 -0.00185272 +-0.0764595 0.111219 0.0459768 +0.042138 0.101461 0.00217211 +-0.0213522 0.127058 0.00761225 +-0.0556879 0.0677603 -0.0123408 +0.00811587 0.129858 0.0241077 +-0.0637641 0.044271 -0.0022694 +-0.0104962 0.0897854 0.05669 +-0.0147283 0.0657495 -0.0376113 +-0.0881508 0.144556 0.0335371 +-0.0807759 0.0773963 -0.00349851 +-0.0388999 0.0345526 0.0391301 +0.0239365 0.0972468 -0.020928 +-0.0559996 0.126683 -0.00642409 +0.015329 0.118191 -0.013375 +-0.0894904 0.112329 0.0187618 +-0.0771865 0.153815 0.000183792 +0.00297917 0.0389607 -0.010651 +-0.0571826 0.122684 0.0401181 +0.0453844 0.091806 0.0121583 +-0.0908751 0.135104 0.0182068 +0.0216273 0.125269 0.00337714 +0.0572674 0.0722428 0.0147076 +-0.0417782 0.0473939 -0.012205 +-0.0658407 0.0938498 -0.0179236 +0.0102801 0.12364 -0.00922404 +0.00517588 0.113065 -0.0197995 +0.0139965 0.0343089 -0.00230394 +-0.0757024 0.160453 -0.0116926 +-0.0694905 0.10551 0.0380162 +0.0123252 0.0595168 -0.0292981 +0.00242842 0.0916453 -0.033159 +0.0363451 0.0519755 -0.00662669 +-0.0899083 0.121615 0.0458595 +-0.0569713 0.125238 -0.00711806 +-0.0616474 0.0458147 0.0384356 +-0.0816857 0.104685 0.0297488 +0.0417455 0.0760505 -0.00673474 +-0.0249373 0.175681 -0.0116247 +0.0233583 0.0592365 -0.0255115 +0.0296356 0.107455 0.0360045 +-0.0171544 0.0383178 0.00624466 +-0.0338857 0.12324 -0.00632922 +-0.0295434 0.168268 -0.00777595 +0.0237606 0.105983 -0.0162548 +-0.0636907 0.124164 0.0466174 +0.0299589 0.119939 0.0150519 +0.0387947 0.101959 0.0281808 +0.0346979 0.108688 0.0292348 +-0.00481267 0.108148 -0.0225124 +-0.0921162 0.126957 0.038246 +-0.0708767 0.0346286 -0.00100073 +-0.0434981 0.0803632 0.0422528 +-0.00776303 0.0742012 -0.03739 +-0.0164203 0.103082 -0.0232082 +-0.0368601 0.0336856 -0.0211611 +-0.0794788 0.13585 0.0504167 +-0.0622192 0.166249 -0.0495907 +-0.0632785 0.0347611 0.0232648 +-0.0678048 0.17421 -0.0455841 +-0.0292876 0.113893 -0.0165575 +-0.0116236 0.0451107 -0.0281433 +-0.0853661 0.0910995 0.0281927 +0.0152572 0.124805 0.0295869 +-0.0730257 0.141351 -0.00730576 +-0.0694123 0.111827 0.045291 +-0.048008 0.0642705 0.0370013 +-0.000600787 0.0405329 -0.0249772 +-0.0932444 0.124186 0.027283 +-0.050904 0.119772 0.0333476 +-0.00274076 0.0726647 -0.0356738 +-0.0635974 0.151927 -0.0324488 +0.025021 0.085012 -0.0240764 +-0.0749218 0.0661459 0.00857247 +0.0115292 0.119123 0.0361473 +0.0363972 0.0461521 -0.00588406 +0.0385505 0.0378908 0.0124577 +-0.0599745 0.14101 0.03437 +0.00637279 0.049483 -0.0283693 +-0.0896361 0.0969931 0.0144152 +0.0291455 0.0491758 0.0366259 +-0.013551 0.0588296 0.0525443 +-0.0381244 0.127641 0.0146907 +-0.00888364 0.107351 -0.0226177 +-0.0497129 0.165582 0.00102101 +0.0449595 0.0889486 0.000172046 +-0.0339085 0.177047 -0.0109944 +-0.0278445 0.0535534 0.0370258 +-0.0334735 0.0337737 0.0142583 +-0.0926366 0.121498 0.0312794 +-0.0298476 0.105726 -0.0219826 +-0.0771466 0.113816 0.049094 +0.0166749 0.0347919 -0.00596505 +-0.0767718 0.0716181 -0.00247133 +-0.0788159 0.0818529 0.0346403 +-0.0751616 0.0715622 0.0292788 +-0.0629391 0.12384 -0.00881569 +0.0155707 0.100538 -0.0224673 +0.0252284 0.116758 -0.00782512 +0.00112155 0.035712 0.0195623 +-0.0623204 0.0448503 0.0109236 +0.0577561 0.0565381 0.00419435 +-0.000697034 0.0626894 -0.03411 +-0.0739419 0.129646 -0.00820737 +-0.0552142 0.155428 0.0123927 +-0.0749344 0.128178 -0.00819506 +0.0183304 0.0579992 -0.0277502 +-0.0259227 0.123138 -0.0042558 +0.0130981 0.124462 0.0316831 +-0.0723893 0.172498 -0.0357772 +-0.015947 0.124632 0.0285893 +-0.0583387 0.0706756 0.0389009 +-0.0347052 0.0384254 -0.0102399 +-0.0149752 0.125602 0.0274605 +-0.0153278 0.0389782 0.0349161 +-0.0482032 0.131003 0.0267578 +0.0538412 0.0539826 0.0267309 +-0.0845696 0.12714 0.0502672 +0.0343613 0.111866 -0.00251995 +-0.0679623 0.16261 -0.0140168 +0.0251056 0.0902557 0.0469821 +-0.0373144 0.033633 0.00457247 +0.00149673 0.110036 0.0425823 +-0.0886162 0.100967 0.00940891 +-0.0734724 0.155984 0.0233451 +0.00740252 0.0402134 0.0455033 +0.0454345 0.0918112 0.0111626 +0.0252284 0.0420597 0.0372934 +0.026048 0.117275 -0.00637096 +-0.0768401 0.178514 -0.0509284 +-0.0719676 0.138437 -0.00730592 +0.00750673 0.0758763 0.0563548 +-0.0485658 0.0404434 -0.0115683 +-0.0402074 0.168164 -0.0113973 +-0.044494 0.0987314 0.042632 +-0.0530679 0.140053 0.026392 +0.0521064 0.0510719 0.0259326 +-0.0545309 0.0352136 0.0455493 +-0.0717133 0.0715245 -0.00752229 +-0.0899797 0.128138 0.00527223 +0.0045004 0.121001 0.0358516 +-0.0641393 0.143504 -0.0105249 +-0.0769685 0.156212 -0.0102521 +-0.0645952 0.155196 -0.0084031 +0.0323835 0.0460752 0.0307026 +-0.023205 0.178608 -0.0204967 +-0.042033 0.113762 -0.0163433 +-0.0512269 0.150712 0.0135153 +0.00120164 0.0839391 -0.0353946 +0.0300054 0.104778 0.0365239 +-0.00649214 0.0965537 0.0536631 +-0.0289152 0.0846603 -0.0346291 +0.0207024 0.0373647 0.039246 +-0.0386568 0.0577511 -0.0111914 +-0.0605191 0.153857 0.0308432 +0.0410047 0.0395957 0.0043142 +-0.0837262 0.151367 0.00522149 +-0.0378805 0.108506 -0.019759 +-0.0169176 0.183111 -0.0193016 +-0.0614849 0.0946016 0.0445824 +0.0332816 0.116574 0.0106008 +-0.0378618 0.101418 -0.0215553 +0.0383745 0.038179 0.01581 +0.010493 0.111264 0.0393941 +0.0353685 0.0600237 -0.0127796 +-0.0203175 0.0933679 0.052311 +-0.0434938 0.0619471 0.0402773 +-0.0393599 0.0418158 -0.0263353 +-0.0588856 0.105471 -0.0181522 +-0.0278953 0.124828 0.00229374 +-0.0894349 0.136561 0.0381888 +-0.0455406 0.124353 -0.00945534 +-0.0850289 0.111596 0.00326083 +0.01399 0.106595 -0.01887 +-0.0765357 0.0692333 0.0204809 +-0.0741239 0.165568 -0.0191297 +-0.056116 0.131133 0.036427 +-0.0715838 0.158191 -0.0409255 +-0.077037 0.111295 -0.0046823 +-0.0135016 0.0573891 0.0517499 +0.0374899 0.0469458 0.0313688 +-0.0297919 0.108873 -0.0192723 +-0.0616758 0.113831 0.0370124 +-0.0157188 0.0628375 -0.0366012 +-0.0879795 0.148554 0.029057 +-0.0890892 0.0955882 0.00942496 +-0.0709327 0.178806 -0.0496057 +0.0454967 0.0611109 0.0306935 +0.0193158 0.0835035 0.0508805 +0.000580692 0.131584 0.0113306 +-0.0615895 0.155312 -0.0215829 +-0.0134922 0.122339 0.0335983 +0.0458248 0.0806172 0.0201703 +-0.0225646 0.0983245 -0.0242201 +-0.0682478 0.066271 0.0282875 +0.0302092 0.117283 0.0265434 +-0.0829482 0.128017 -0.00457928 +-0.0715343 0.141411 0.0464325 +-0.0800761 0.0936246 -0.00957758 +-0.0851808 0.153525 0.0149377 +-0.0865771 0.124349 0.048115 +-0.0221188 0.100222 -0.0241961 +0.0224909 0.111137 0.037371 +0.00736705 0.0494733 -0.028237 +0.0432386 0.0750761 0.0273062 +-0.0564476 0.153922 0.0264803 +-0.0288608 0.0448354 -0.0281934 +-0.0776003 0.156937 -0.0149108 +-0.0784376 0.171472 -0.0389273 +-0.0178474 0.12806 0.016159 +-0.0284556 0.0472262 0.0488083 +-0.0677451 0.0629578 0.0224748 +-0.0567391 0.0576068 -0.000420382 +-0.0769537 0.132513 -0.00657383 +-0.0837476 0.0952109 -0.00455405 +-0.0427254 0.0358312 -0.0275925 +0.00623069 0.0782309 -0.0341321 +-0.0758642 0.117897 -0.00698249 +-0.0903736 0.13787 0.0221843 +-0.027962 0.155009 -0.00579987 +-0.0193391 0.0386082 -0.00732295 +-0.0237931 0.0698259 -0.0366341 +-0.015124 0.037267 -0.0266656 +0.0113671 0.0479427 -0.0268055 +0.0141489 0.0347135 0.0249225 +-0.0669549 0.160975 -0.0568649 +0.0208979 0.0359371 0.0087849 +-0.0570669 0.0493259 -0.00137722 +-0.0186112 0.0386738 -0.00909396 +-0.0055195 0.0443362 0.047543 +-0.0714237 0.153981 -0.0448933 +0.0119572 0.125728 -0.00550935 +-0.0310683 0.0679104 -0.0254551 +0.0514754 0.0531199 -0.00283685 +0.0135274 0.12988 0.0160733 +-0.0728856 0.148047 -0.0249504 +-0.0233454 0.122752 0.0259903 +-0.0578948 0.0983776 -0.0200563 +-0.0203263 0.0825295 0.0568715 +-0.0643532 0.142586 -0.00864957 +-0.0793976 0.151048 0.0347829 +0.0356609 0.104701 0.030636 +0.0063888 0.115364 -0.0182909 +-0.0289964 0.0383539 -0.00532847 +-0.0834239 0.0965619 -0.00458039 +0.019508 0.109842 0.0390589 +-0.0767379 0.10491 0.0348158 +-0.0825915 0.143398 0.0421649 +0.0182147 0.0834619 -0.0281698 +-0.0633435 0.060722 0.00207171 +0.0428335 0.076148 -0.00478426 +-0.0724349 0.0644357 0.0131399 +-0.0114637 0.165492 -0.0149909 +-0.0493961 0.033823 0.00737414 +0.0502518 0.0446339 0.0182039 +-0.0439305 0.0432632 0.0429545 +-0.0713305 0.0628284 0.00935991 +-0.0276378 0.158958 -0.0125395 +0.0600492 0.0581198 0.0161748 +0.00134506 0.0511101 -0.0304682 +-0.0692332 0.158118 -0.0519432 +-0.0133594 0.127978 0.0236019 +0.0292021 0.0619142 0.0421314 +-0.0667582 0.180263 -0.0553199 +-0.0197539 0.0671131 -0.0375162 +-0.0704746 0.040884 0.00781861 +-0.049499 0.112564 0.0357174 +-0.0322502 0.0367926 -0.0305484 +-0.00789583 0.129197 0.00105287 +-0.016169 0.117727 -0.0146898 +0.0295964 0.0580473 -0.0178274 +-0.0883598 0.0874311 0.00547496 +-0.0274913 0.101587 0.0432231 +-0.0768992 0.155831 0.0192356 +-0.0364902 0.0634253 0.0412069 +-0.0388025 0.125966 -0.00521606 +0.0196905 0.0550135 0.047657 +0.0571135 0.071717 0.0176058 +-0.0064991 0.0952675 0.0547927 +0.0174901 0.0346463 0.0220409 +-0.0024963 0.10305 0.0439671 +-0.0184804 0.0543192 0.0487134 +-0.0334418 0.0335662 -0.0297364 +-0.0620472 0.176838 -0.0608311 +-0.0308715 0.0522855 0.0371048 +-0.0367079 0.0695483 -0.0163464 +0.0158791 0.123986 0.0298499 +-0.0320536 0.0356449 0.0500425 +-0.0493943 0.14168 0.0103932 +-0.0558858 0.106922 -0.0182628 +0.059454 0.0647075 0.0208869 +0.0152596 0.125955 0.0281714 +0.038478 0.0980354 0.0312187 +-0.0744916 0.146991 0.0423999 +-0.0846211 0.0992422 0.0286106 +-0.0661191 0.156294 0.0171964 +-0.0794888 0.111206 0.0453002 +0.00519891 0.0880579 -0.0334439 +0.0153315 0.0346194 -0.0136599 +0.0395267 0.0632302 -0.00776648 +-0.0463407 0.0629206 0.0382092 +-0.0514201 0.121192 0.0343754 +-0.0528867 0.0334295 0.0213081 +-0.062446 0.163101 -0.0455941 +-0.0770308 0.167319 -0.027484 +-0.041999 0.126936 -0.00419358 +0.0289857 0.090239 0.0438092 +-0.0634397 0.158343 -0.0445972 +0.00692319 0.0630369 0.0555875 +-0.0294344 0.0381755 0.00387704 +0.0228628 0.0351973 0.0171792 +-0.0738758 0.0993275 -0.0132564 +-0.0668982 0.151542 -0.0415298 +-0.0629724 0.133897 0.038809 +-0.0928035 0.121507 0.0322842 +0.0305387 0.0609912 -0.0187852 +0.0385799 0.0739884 0.0346445 +-0.0814052 0.08555 -0.00656718 +-0.0621323 0.0602572 0.0206983 +-0.0294013 0.0804353 -0.034602 +0.0164763 0.0348375 -0.0136598 +-0.0659203 0.122383 -0.00896938 +-0.0328324 0.0929676 -0.0240794 +0.000521824 0.0801146 0.0573693 +0.0221547 0.0979182 -0.0216266 +-0.0649149 0.0392337 0.0390271 +0.0351689 0.0928995 0.0387113 +-0.0125327 0.0502379 0.050201 +-0.05553 0.12546 -0.00656458 +0.0330446 0.111446 -0.00610948 +0.0255618 0.120425 0.027665 +-0.0243325 0.126263 0.00798048 +-0.0654853 0.0944999 0.0429585 +-0.0478356 0.0970782 -0.0220591 +-0.0332116 0.0851655 -0.0254848 +0.00641089 0.036109 -0.0234066 +-0.0192798 0.0610993 0.0494354 +0.0363164 0.11089 0.0231265 +-0.0705311 0.0972485 0.0414142 +-0.0514267 0.135712 0.0273837 +-0.0564984 0.0918565 0.0453856 +-0.042499 0.113906 0.034677 +-0.0717955 0.156396 0.0195489 +-0.0215446 0.0942792 -0.0320343 +-0.0246821 0.177174 -0.0112336 +0.0177118 0.0944604 -0.0240064 +-0.0881735 0.15196 0.0139234 +-0.000296991 0.0392472 -0.00781836 +-0.00248723 0.115552 0.0407434 +-0.0147779 0.0756914 -0.0387415 +0.0503819 0.0717878 0.00597587 +-0.0396993 0.117276 -0.0140617 +-0.0628784 0.16149 -0.0515871 +-0.0769868 0.0713943 0.0255408 +-0.01852 0.115493 0.0376203 +-0.0632135 0.155458 0.00808821 +-0.0244921 0.103004 0.0433541 +-0.0392444 0.0481623 -0.0129943 +0.0317796 0.0647744 0.0406274 +-0.00516147 0.100957 0.0442706 +-0.0196118 0.040807 -0.0284935 +-0.0288146 0.0436325 0.0510094 +-0.0690473 0.0727409 0.0365464 +-0.0478629 0.125952 -0.00709772 +-0.0456346 0.123874 0.0250844 +-0.0214969 0.0498836 0.0466158 +0.0515378 0.0461489 0.00621743 +0.0472621 0.0627303 -0.00287883 +-0.0738666 0.0846755 0.0394915 +0.0247439 0.0490967 0.0390469 +0.0150281 0.097439 -0.0231662 +0.0456884 0.0904192 0.00716979 +0.0173787 0.046209 -0.0233857 +-0.00349533 0.123738 0.0342998 +-0.0905223 0.128294 0.0420009 +-0.0733752 0.0741466 0.034437 +-0.0106209 0.130105 0.0129711 +-0.0754549 0.158227 -0.0249553 +-0.0125993 0.0922824 -0.0359459 +-0.064348 0.0611447 0.0212332 +-0.0246221 0.0450443 -0.0281165 +-0.0383306 0.0379343 0.0437226 +-0.0423655 0.110099 -0.0185262 +-0.0750214 0.166563 -0.0400315 +-0.0338231 0.0915286 -0.0241849 +-0.0857793 0.088721 -0.000547834 +-0.00485752 0.103786 0.0439754 +-0.0334914 0.0960174 0.044365 +-0.040497 0.0705056 0.0418211 +0.0309495 0.065969 0.041175 +-0.0649024 0.119454 -0.00881631 +-0.0326689 0.0382268 0.0507498 +0.0366581 0.0727136 0.0371657 +0.0102886 0.13098 0.0134608 +0.0549839 0.0534895 0.00121219 +0.0229081 0.0608908 -0.0255785 +-0.0578484 0.0576892 0.00460939 +-0.0380707 0.123893 0.0251235 +0.0425051 0.049941 0.0324381 +-0.0208164 0.0797246 0.0560382 +-0.0600611 0.155861 0.0164593 +0.0128031 0.126304 -0.00413421 +0.0254584 0.0383883 -0.00303811 +-0.0782251 0.104799 0.0333593 +-0.011635 0.0466548 -0.0295721 +-0.0227746 0.0968676 -0.024693 +0.00330234 0.0626197 -0.0330565 +-0.00750217 0.0787518 0.0577101 +-0.043485 0.109867 0.0381531 +0.000280959 0.0655552 -0.0344559 +0.0303619 0.0982175 -0.0159971 +-0.0671228 0.150867 0.0375155 +-0.0251523 0.0635221 0.0411049 +-0.0732036 0.147141 -0.0198634 +-0.0403541 0.121097 -0.0120881 +0.0144177 0.0388354 -0.0218485 +-0.0912331 0.114706 0.0382141 +0.0261502 0.120654 0.0264581 +-0.0131682 0.0974746 0.0509922 +-0.0718669 0.115007 -0.00776782 +0.0425779 0.0929869 -0.00379718 +-0.0228308 0.0881946 -0.0369029 +-0.00860718 0.0361712 0.0494902 +-0.0685057 0.159542 -0.0539539 +-0.0864902 0.103559 0.00540359 +-0.0697818 0.16064 -0.00887941 +-0.05157 0.0657725 0.0357523 +0.036411 0.0430004 -0.00393346 +-0.0617308 0.0752409 -0.0175405 +-0.0384866 0.112537 0.0353486 +0.0446565 0.076299 -0.00080692 +-0.0444716 0.165339 -0.00887164 +0.0234256 0.0994865 0.0445818 +0.0411691 0.0899632 0.029736 +-0.0188353 0.12777 0.00853266 +-0.079023 0.172207 -0.0429929 +-0.0509196 0.141445 0.00173554 +-0.013506 0.0486161 0.0481837 +0.0193259 0.0665212 -0.0284749 +-0.0472913 0.128011 -0.00322004 +-0.0626481 0.167836 -0.0465871 +-0.0304696 0.0875178 0.0438182 +-0.0917743 0.120197 0.0434965 +-0.0648107 0.0617811 0.00082735 +0.000497836 0.114196 0.0414191 +0.0574118 0.0647963 0.00219725 +-0.0558676 0.0941545 -0.0217392 +-0.0336084 0.073768 -0.0234794 +0.00599322 0.131555 0.0161709 +0.00890036 0.0630937 0.0549611 +-0.062689 0.110949 0.0372761 +0.000505603 0.092515 0.0555251 +0.0223468 0.121292 -0.00473526 +-0.0486224 0.0562169 -0.0104362 +-0.00349838 0.0938964 0.0554871 +-0.0444734 0.111133 -0.0175908 +-0.0110869 0.111309 -0.0199045 +-0.0706182 0.161097 -0.00919138 +-0.0852334 0.0992128 0.0278144 +-0.0739196 0.15466 0.0290556 +0.0296062 0.0693912 -0.0207509 +-0.0310679 0.0435994 -0.0290446 +-0.0381696 0.0351458 0.0102677 +0.0601731 0.0664558 0.0181654 +-0.0779755 0.159708 -0.0199256 +-0.0656034 0.0619186 0.0220381 +-0.0875197 0.139142 0.00819442 +0.057949 0.0523838 0.0161799 +-0.0789979 0.165257 -0.0319521 +-0.0651299 0.139658 0.0409855 +-0.021445 0.0539977 0.0453008 +-0.0896519 0.136557 0.0371913 +-0.0534965 0.0890047 0.0449968 +-0.0534319 0.15708 0.0101259 +-0.0328837 0.0835575 -0.0275315 +-0.0164672 0.0659336 0.0534892 +-0.0354329 0.0383545 -0.00847377 +-0.0708675 0.102264 -0.0137609 +-0.023563 0.126621 0.00971624 +0.0103735 0.0460953 0.0463477 +-0.0660593 0.179544 -0.0550745 +-0.0527874 0.0854974 -0.0215293 +-0.0859388 0.0819759 0.019473 +0.0105508 0.12954 0.0235608 +-0.0103855 0.174149 -0.0227989 +-0.0669072 0.0448192 0.00702222 +-0.0284871 0.0932302 -0.0255941 +-0.0674877 0.041922 -0.00126982 +-0.0650925 0.142629 -0.00933509 +0.0420248 0.0845075 -0.00777453 +-0.0790747 0.0713835 0.0198308 +-0.0261077 0.0372445 -0.0185929 +-0.0370217 0.0410946 -0.0286549 +-0.0635554 0.166233 -0.0355972 +-0.0218769 0.105849 -0.0224625 +-0.0880158 0.125695 0.0466833 +-0.0621699 0.128298 0.0417254 +-0.0849635 0.115612 0.0476218 +-0.0132844 0.180127 -0.0228495 +-0.0282267 0.181005 -0.00798034 +-0.0312929 0.0665317 -0.0234435 +0.0182349 0.0355117 -0.0116753 +0.0151438 0.128336 0.0223847 +-0.0440686 0.0364096 0.0444754 +0.00518099 0.090879 -0.0329112 +-0.00712692 0.130239 0.0200248 +-0.00350074 0.0760658 0.0587997 +0.0285239 0.105924 -0.0141978 +-0.0560757 0.0486306 0.0102324 +-0.0647346 0.0751547 -0.0168067 +-0.0681413 0.163425 -0.0155251 +-0.0632877 0.151202 -0.0295741 +-0.0467953 0.0573798 0.0374139 +-0.0434795 0.10013 0.0422114 +0.0285718 0.0898068 -0.0210622 +0.0330592 0.116487 0.0176444 +-0.0241054 0.0348343 0.0490127 +-0.0124791 0.0354015 -0.0179384 +0.0405961 0.0624185 0.0297312 +-0.081387 0.11145 0.0446717 +0.00150869 0.0675259 0.0561223 +0.00629906 0.0381702 -0.0111411 +-0.0201579 0.171232 -0.0211109 +-0.0418025 0.1163 -0.0150397 +0.00651017 0.0786147 0.0558016 +-0.0940189 0.11877 0.0172997 +-0.0685972 0.0635876 0.000162346 +-0.0328398 0.0722904 -0.0244709 +-0.0455312 0.131052 0.00748081 +-0.023441 0.181825 -0.0105699 +0.0108694 0.130662 0.0179509 +0.0123886 0.0463398 -0.0252064 +-0.0652697 0.118619 0.0495916 +0.00206776 0.0348089 0.0386094 +-0.0298407 0.0705727 -0.0304857 +-0.0632339 0.164684 -0.0315914 +0.0353918 0.0491057 -0.00653987 +-0.0392946 0.123101 -0.0101877 +-0.0885378 0.137788 0.0102157 +-0.0234958 0.100256 0.0443804 +0.04037 0.0460545 -0.00454494 +-0.016752 0.0336597 -0.0246752 +0.0413281 0.0697537 0.029756 +-0.077268 0.161738 -0.0185704 +0.00995573 0.0897855 -0.0311748 +-0.0494127 0.0345257 0.0351696 +-0.00258654 0.0376582 -0.0251248 +-0.0538672 0.149311 0.025406 +0.0281029 0.0968693 0.0425418 +-0.0296256 0.0384042 -0.00919904 +-0.0659714 0.070335 0.0357803 +-0.0792849 0.109686 0.041215 +-0.0609581 0.142927 -0.00458074 +-0.064489 0.16418 -0.0242498 +-0.0585553 0.060477 0.023496 +-0.0851998 0.104954 0.024348 +0.0164098 0.126062 -0.00187701 +0.0235925 0.125057 0.0140956 +-0.00865281 0.123002 -0.0103525 +-0.0132305 0.174198 -0.0268981 +-0.0453894 0.130637 0.0193744 +0.0162761 0.0694793 -0.03005 +-0.0894525 0.128349 0.0437622 +-0.0562473 0.0708294 0.0392023 +0.0180456 0.044911 0.0433906 +-0.0626788 0.119898 0.0446407 +-0.0206698 0.116197 -0.0150314 +0.051506 0.0461707 0.0202521 +-0.0541367 0.13422 -0.00388726 +0.0303748 0.106409 -0.0127112 +0.0453408 0.0805541 0.00120995 +-0.00350137 0.0788045 0.0582113 +-0.052917 0.144693 0.0213981 +-0.0810085 0.136808 -0.00286908 +0.0435987 0.0482711 0.0311843 +-0.00549934 0.085642 0.0570911 +-0.0414264 0.125093 -0.00826982 +-0.0534716 0.0490986 0.0276613 +-0.0833044 0.10329 0.0285866 +-0.0394866 0.111153 0.0363447 +0.00954728 0.0389439 0.0451085 +-0.035694 0.0666325 -0.0153314 +-0.0301817 0.12316 -0.0042413 +-0.0383432 0.127011 0.0175779 +-0.0603252 0.0707596 0.0383929 +-0.0249438 0.0380891 0.0543244 +0.0144999 0.10985 0.0401157 +-0.0387789 0.0392857 0.0427431 +-0.0390181 0.126516 -0.0038056 +-0.0628844 0.116571 -0.0108779 +-0.0718222 0.0666154 0.0237319 +-0.0176233 0.0640054 0.0519373 +-0.0878362 0.112676 0.0422322 +-0.0661452 0.115702 0.0482687 +-0.0464951 0.116619 0.0318843 +-0.0501411 0.130626 -0.00198394 +-0.0497482 0.0767922 -0.0184367 +-0.0234881 0.0462034 0.0522022 +-0.0739006 0.162422 -0.0359639 +-0.0262017 0.0878115 0.0498853 +-0.0133444 0.0389099 -0.0138542 +0.040243 0.0970923 -0.00582991 +-0.011153 0.129981 0.0142184 +0.0309714 0.035145 0.0133989 +-0.0426252 0.0534503 -0.0112074 +-0.0538286 0.0338166 -0.0117099 +-0.0622047 0.0394245 0.0433885 +-0.0746849 0.14995 -0.0294029 +-0.0611865 0.0441212 -0.00432669 +-0.0182092 0.177147 -0.0243125 +0.0435018 0.0542009 0.0324922 +0.0364352 0.0371002 0.0145635 +-0.0321091 0.03378 0.0163326 +-0.0627516 0.145959 -0.00957815 +-0.0054968 0.061946 0.0559894 +-0.0738575 0.159643 -0.0319319 +-0.0640268 0.154208 0.0310565 +-0.0679826 0.0819454 0.0421862 +-0.0571357 0.158766 0.00595884 +0.0416081 0.101418 0.000182195 +-0.0235633 0.0565791 0.042552 +-0.0707052 0.0656331 -0.000502385 +0.0151645 0.126939 0.0266898 +0.0319146 0.0808971 0.042698 +0.0591439 0.0594194 0.00516163 +-0.0517306 0.164095 4.31123e-05 +-0.0802487 0.109228 0.032428 +-0.0124889 0.0964872 0.0522501 +0.0122905 0.06666 -0.0305971 +-0.00890819 0.0389895 -0.0111716 +-0.0414812 0.0634467 0.0412468 +0.0440882 0.090317 0.0231627 +-0.048759 0.14421 0.00252118 +-0.0240109 0.113853 -0.0165323 +-0.0863077 0.083293 0.0084931 +-0.0848578 0.117602 -0.00112226 +-0.0758939 0.107753 -0.00831552 +-0.0240922 0.0551393 0.0417051 +-0.048723 0.134043 0.0239744 +-0.075211 0.159631 -0.0279486 +-0.0458972 0.108476 -0.0187253 +-0.0827664 0.0789303 0.000509537 +-0.0413647 0.150284 -0.00509832 +0.00543597 0.131652 0.0145423 +-0.0567655 0.0797174 -0.020408 +-0.0314842 0.0875139 0.0436743 +-0.0272508 0.169746 -0.00972716 +-0.055503 0.0918468 0.0452512 +-0.0250407 0.11597 -0.0147569 +-0.0757456 0.155966 0.0196325 +0.0124869 0.0936385 0.0515089 +-0.0205861 0.122762 0.0284276 +-0.0807235 0.116228 0.0481624 +0.0260285 0.0450625 -0.0106845 +-0.0593728 0.0579489 0.0125735 +-0.049763 0.132774 0.0280532 +-0.0486523 0.128248 0.029602 +-0.0786364 0.0880738 -0.010561 +-0.0292743 0.157003 -0.0105584 +-0.0728269 0.0950692 -0.0149677 +-0.0571361 0.0333705 -0.00647115 +0.00471531 0.10507 -0.02128 +-0.0617504 0.158434 -0.0225881 +-0.044324 0.0573856 0.0392571 +-0.0231291 0.0608213 0.0434196 +-0.0736852 0.109489 0.0408578 +-0.0434867 0.102921 0.0416521 +-0.0745585 0.102629 0.0369846 +-0.00580621 0.0826794 -0.0377615 +-0.0293232 0.155967 -0.00892475 +-0.0785045 0.111148 0.0455755 +-0.0789041 0.126621 -0.00628203 +0.0387126 0.0984064 -0.00782785 +-0.00546749 0.0386155 0.00470576 +-0.00150095 0.0925253 0.0558525 +-0.0200678 0.0384268 0.0272406 +-0.0900294 0.114549 0.0240977 +-0.0775366 0.070359 0.00451989 +-0.0719896 0.139908 -0.00735583 +-0.0574975 0.0987515 0.0429871 +-0.0321271 0.107425 -0.0197503 +0.0188647 0.126347 0.0223312 +0.00641604 0.0962346 -0.0278978 +0.00311817 0.108714 -0.0201476 +-0.0160251 0.0375717 -0.0270066 +-0.0497158 0.140127 0.00540861 +-0.0603383 0.155998 0.00765284 +-0.0315045 0.100214 0.0434156 +-0.0865647 0.0978132 0.0263535 +0.030619 0.119354 0.0124235 +-0.0618449 0.153748 -0.0225793 +0.0357348 0.111877 0.0229152 +-0.0825172 0.108952 0.0273498 +-0.06497 0.156112 0.0234152 +-0.0141713 0.0391912 0.0511685 +0.0418096 0.0482673 0.0320498 +0.0293522 0.0768437 0.0442363 +-0.00664275 0.113752 -0.0185066 +-0.0339572 0.173519 -0.0141904 +-0.0868865 0.136539 0.0438118 +-0.0358508 0.0350331 0.0126434 +-0.0538363 0.0491492 0.0306601 +-0.0555251 0.040203 -0.0098178 +0.00654381 0.0340863 -0.0167284 +0.00392426 0.0984839 -0.0242888 +-0.0798351 0.078638 0.0310296 +-0.0520723 0.122646 0.0352105 +-0.0550812 0.153793 0.0226168 +0.014566 0.128157 0.000776346 +-0.0875094 0.103632 0.00838188 +0.0565843 0.0508466 0.00719292 +-0.0301736 0.0353405 0.0506988 +-0.054126 0.0491389 0.0369634 +-0.0213227 0.0927441 -0.0344661 +-0.0512299 0.133896 0.029412 +-0.0175551 0.0668893 0.0531861 +-0.0306537 0.125522 0.0174226 +0.00435638 0.0524337 -0.0297062 +-0.030037 0.0383331 -1.37538e-05 +-0.0748829 0.104948 -0.0102086 +0.0281452 0.12091 0.0214948 +-0.00129242 0.0339647 -0.0219341 +-0.0193753 0.114664 -0.0174341 +-0.0226586 0.185005 -0.0161016 +0.0333802 0.116202 0.0163348 +-0.0182505 0.0920203 0.0545129 +0.0291993 0.0821983 0.0440432 +0.040955 0.104188 0.00218636 +-0.0221399 0.16826 -0.0191908 +-0.0160775 0.128732 0.0124337 +-0.0494959 0.115246 0.0337414 +-0.0623926 0.155248 -0.0336012 +-0.0504873 0.0646576 0.0351978 +-0.0738463 0.114952 -0.00659368 +-0.0195012 0.0351765 0.0514244 +-0.0448823 0.107056 -0.0197924 +-0.0768765 0.119334 -0.00688293 +0.0107885 0.0345143 -0.0106366 +0.024237 0.0727429 0.0473317 +-0.00865103 0.0511695 -0.0319029 +-0.0877012 0.0963902 0.0247068 +-0.0518399 0.0559545 0.028629 +-0.00150749 0.0442279 0.0463824 +-0.066685 0.0361231 0.0351414 +-0.0298413 0.0511486 0.0404908 +-0.0104881 0.125079 0.0309157 +-0.0478366 0.0336224 0.000642732 +-0.0567073 0.152073 0.0307854 +-0.0772744 0.177812 -0.051035 +-0.0147745 0.0770701 -0.0384436 +-0.0929915 0.122891 0.0372721 +-0.0104786 0.116885 0.0389916 +0.0382147 0.0603208 -0.00873991 +-0.0754893 0.145614 0.0436847 +-0.0484504 0.134772 0.0211152 +0.013378 0.056283 0.0508299 +-0.00197361 0.0339973 -0.0202101 +0.0414332 0.100023 0.0231582 +0.0306311 0.076191 -0.0209647 +-0.0663516 0.155012 0.0287678 +-0.0710496 0.158811 -0.00499394 +-0.0554619 0.115432 0.0354757 +-0.0357408 0.0754574 -0.0191515 +0.000523827 0.0787529 0.057707 +-0.0189564 0.187079 -0.0195498 +-0.0849859 0.149949 0.0316738 +-0.0578691 0.0427244 -0.00751381 +-0.0739068 0.123785 -0.00803832 +-0.0355104 0.105608 0.0391036 +-0.0437169 0.0336921 -0.00956971 +0.0503986 0.0446075 0.0172106 +0.028338 0.0371627 0.023798 +-0.0835031 0.123045 0.0493423 +-0.051023 0.051637 0.0206282 +0.00799809 0.131294 0.0169006 +-0.0154642 0.0617228 0.0531313 +-0.0548148 0.0898539 -0.0222515 +0.0183688 0.0727072 0.0511848 +-0.0528816 0.143158 0.0234068 +0.0423208 0.0885482 0.027912 +-0.0489879 0.148715 -0.00337283 +0.0536516 0.0710277 0.00477709 +-0.0558317 0.154614 0.0193814 +-0.078074 0.0921324 -0.0116061 +-0.0138482 0.126055 -0.00351425 +-0.0484951 0.107035 0.0396855 +-0.0617568 0.113454 -0.0138737 +-0.0539631 0.0449066 0.021682 +-0.0323187 0.0763806 -0.0295323 +0.0441984 0.0917353 0.0221589 +-0.0830674 0.136771 -0.000769185 +-0.0741071 0.154101 -0.0239055 +-0.0686886 0.176906 -0.0487674 +-0.0561408 0.0460708 0.0131999 +-0.0685022 0.101419 0.0404594 +-0.0739688 0.0653923 0.0119616 +0.001175 0.0909253 -0.0339059 +0.0263146 0.0782009 0.0468843 +0.00192116 0.123969 -0.00948312 +-0.0587405 0.0737726 -0.0173801 +-0.0627949 0.167828 -0.0455908 +-0.0508006 0.0883889 -0.0215985 +-0.0481052 0.0559539 0.0359192 +0.0442623 0.0959503 0.0151546 +-0.0608758 0.0968112 -0.0186271 +-0.0345924 0.0485568 0.0396695 +-0.0618805 0.102572 -0.018381 +0.024797 0.0615121 -0.0241542 +0.0398079 0.0440192 0.0290809 +-0.0138249 0.0869198 -0.0385386 +-0.00950254 0.0801627 0.0580817 +-0.0893667 0.135016 0.00621309 +-0.0210328 0.0946153 0.0501685 +0.0124741 0.0347469 0.026362 +-0.0837947 0.100615 0.0291484 +-0.0677074 0.147127 -0.0273126 +-0.080936 0.0720826 0.0105433 +-0.0486367 0.0591511 -0.0114572 +-0.0856634 0.1104 0.0223511 +-0.0321401 0.16671 -0.0160336 +-0.0724955 0.174948 -0.0415233 +-0.0260317 0.0348457 -0.0200988 +-0.0274922 0.0497667 0.0454723 +-0.0394917 0.0534182 0.0393765 +0.0515114 0.0691441 0.0252354 +-0.0257438 0.12256 -0.00564443 +0.0437634 0.0832354 -0.00281017 +-0.0247629 0.0727034 -0.0370836 +-0.0655551 0.156269 0.0188465 +-0.0629848 0.136718 0.0370028 +0.0602499 0.0678328 0.0161531 +-0.0168173 0.0841632 -0.0392397 +-0.0683543 0.152019 -0.0462463 +-0.0567286 0.155485 0.0133042 +-0.0124895 0.119639 0.0367572 +-0.0620219 0.161552 -0.0385959 +-0.0485081 0.0504118 0.037253 +-0.0681426 0.159579 -0.055037 +-0.0339899 0.0738027 -0.0224777 +0.0187727 0.038419 -0.0166964 +-0.00951396 0.0647096 0.055646 +0.0373151 0.0659642 0.0362985 +-0.0697681 0.156742 -0.0499137 +-0.07512 0.161006 -0.0309706 +0.0445653 0.094573 0.0151616 +-0.0642545 0.154418 -0.039754 +0.0245051 0.108393 0.0385583 +-0.0423597 0.0337264 -0.0019814 +0.0111186 0.130773 0.0109156 +-0.0366056 0.0484481 -0.0142844 +-0.00762999 0.0387797 -0.0144679 +-0.0695561 0.0340783 0.00839793 +-0.0566909 0.0334951 0.00618234 +-0.0565711 0.159859 0.00306588 +0.000399482 0.0419381 -0.024642 +-0.0505546 0.0490872 0.0373101 +-0.0513639 0.0402537 0.0462611 +-0.0256858 0.0575487 -0.0293997 +-0.0524956 0.0890116 0.0451123 +0.044036 0.0973464 0.00517085 +-0.0774531 0.156901 -0.0199195 +0.0267966 0.0534918 0.0403155 +-0.0887231 0.0888754 0.0204484 +0.014348 0.0534071 0.0486823 +-0.0495075 0.0490436 0.0377607 +-0.0321324 0.154142 -0.000565596 +-0.0856354 0.143297 0.0395519 +-0.0344784 0.0932112 0.0445123 +-0.0688653 0.0860793 0.0429202 +-0.068567 0.167578 -0.0243154 +-0.0155024 0.084237 0.0568519 +-0.0768438 0.0975378 -0.0115852 +-0.054418 0.142404 0.0282888 +-0.00749562 0.091199 0.0567536 +0.0202715 0.077733 -0.0270961 +-0.0748613 0.102114 -0.0115761 +-0.0102609 0.0389601 -0.0132864 +-0.060805 0.0953608 -0.018741 +-0.0557308 0.0738305 -0.0174435 +-0.0789903 0.0900056 0.0359819 +0.0427074 0.0831548 -0.00579292 +-0.00549246 0.097843 0.0523265 +0.046038 0.0679968 0.0252834 +-0.0235521 0.116765 0.0343279 +0.0302394 0.0759037 -0.0212804 +-0.0212883 0.0638258 0.0471454 +0.0285217 0.0480557 -0.0127278 +-0.0326422 0.080708 -0.0295257 +-0.0545922 0.126915 0.0368606 +-0.07894 0.12954 -0.00577029 +-0.0871517 0.0874756 0.0234341 +0.0457525 0.0862068 0.0131643 +-0.0636848 0.163906 -0.0268361 +-0.01113 0.175691 -0.0290055 +-0.0644352 0.0424097 0.0302481 +0.00751322 0.0883379 0.0556646 +0.0450791 0.0411084 0.0144119 +-0.0801842 0.0990978 -0.00757647 +0.00942317 0.0752723 0.0558271 +-0.0720162 0.169175 -0.0255925 +-0.0706469 0.0749114 -0.0128891 +-0.0231537 0.124452 0.0216177 +-0.0354775 0.0932002 0.0444179 +-0.0467494 0.0782878 -0.0191673 +0.0402616 0.088708 0.0319407 +-0.0668021 0.0909191 -0.0174744 +-0.0798777 0.0922401 -0.00961163 +-0.00990791 0.168128 -0.0187599 +-0.0538472 0.144686 0.025416 +-0.0506923 0.0693793 -0.0143111 +-0.0628457 0.158366 -0.0406006 +-0.0472527 0.147738 0.00869118 +-0.0798492 0.140347 -0.0037915 +-0.0633595 0.155022 0.00583483 +0.0194938 0.0948135 0.0473832 +-0.0235952 0.03653 -0.0288249 +-0.0625329 0.155555 0.0257427 +-0.0293056 0.125075 0.00323421 +-0.0848075 0.100731 -0.000569426 +0.0362036 0.112389 0.0159326 +0.0148576 0.0726711 0.0531263 +-0.0648898 0.0353536 0.0257632 +-0.0225355 0.115413 0.0360839 +0.0344395 0.062733 -0.0148459 +-0.0404982 0.0548597 0.0396645 +0.0241838 0.0363666 0.0254891 +0.0185331 0.065881 0.0495848 +0.0124938 0.0589954 0.0513278 +0.00977817 0.131153 0.0118468 +0.0100829 0.0519948 0.0512903 +-0.0361503 0.127316 0.0154104 +-0.0482545 0.05323 0.0361705 +-0.0940988 0.124142 0.016266 +-0.0100812 0.168118 -0.0236136 +-0.00900002 0.1303 0.0121232 +0.044368 0.0832642 0.000211132 +-0.0417803 0.126317 0.0192991 +-0.0875576 0.0954908 0.0044419 +-0.0679508 0.168029 -0.055011 +-0.0131452 0.0346678 0.0462791 +0.00685606 0.0990064 -0.0228407 +0.0328304 0.0354201 0.0116657 +0.0278048 0.121695 0.017093 +0.0445188 0.0721805 0.0237826 +-0.0754994 0.115715 0.0515239 +-0.0115085 0.0815323 0.0578355 +-0.0530625 0.0625594 0.0307632 +-0.0510483 0.053037 0.0206135 +-0.0505791 0.0488657 -0.00826795 +-0.0426076 0.0338549 0.0069173 +0.0392521 0.0940728 0.0323259 +-0.0394892 0.0846821 0.0435801 +-0.0451321 0.0560164 0.0386443 +-0.00431394 0.0929621 -0.0345661 +-0.0559672 0.149602 0.0296453 +-0.0635672 0.159894 -0.0552656 +-0.0854828 0.0924603 0.0282645 +-0.000403311 0.102922 0.0441774 +-0.0728513 0.077742 0.0372898 +-0.0264927 0.0850795 0.0502634 +0.00748229 0.118415 -0.0155852 +-0.0301257 0.165235 -0.016018 +-0.00266679 0.0554838 -0.0324138 +0.0588141 0.0660698 0.0217199 +-0.0227042 0.0651451 0.0456598 +-0.0254758 0.0447668 0.0519525 +-0.0221249 0.165275 -0.017299 +-0.0673863 0.146352 -0.0244353 +0.0358297 0.112651 0.00431137 +-0.0600953 0.0345101 0.0398512 +-0.0315135 0.112545 0.0354646 +-0.0495533 0.0335732 0.00214603 +0.00748118 0.122397 -0.0118721 +-0.017033 0.0949215 -0.0326512 +-0.0465027 0.162256 0.00645028 +-0.0377072 0.0695284 -0.0160926 +0.0515389 0.0638758 -0.00198972 +-0.0406583 0.0577787 -0.0115563 +-0.078333 0.108337 0.035368 +-0.00970184 0.120973 -0.0121849 +0.0223756 0.0822421 0.0500191 +-0.0598969 0.0982824 -0.0189251 +-0.000418527 0.128183 0.0282442 +0.0398162 0.107019 0.0141667 +-0.0275139 0.118013 0.031246 +-0.0270215 0.0563432 0.0375362 +0.0105198 0.130786 0.00926843 +0.00339772 0.0418993 -0.0241367 +-0.0275013 0.113896 0.0350206 +0.0202412 0.0763232 -0.0271232 +-0.0919625 0.126955 0.0342506 +-0.0433008 0.0345877 0.0364134 +0.0433553 0.0860087 -0.00480358 +0.0208045 0.119446 -0.00872458 +-0.0930264 0.120177 0.0342925 +-0.0379377 0.157973 0.00463177 +-0.0253167 0.177183 -0.0103739 +-0.0366224 0.0519804 -0.0105023 +-0.0707047 0.079127 0.0393559 +-0.0260772 0.0606359 0.0392914 +-0.0238556 0.126292 0.00669874 +0.00550694 0.0561304 0.0532033 +-0.0537237 0.147766 0.0244131 +-0.0691531 0.167331 -0.0231015 +-0.0596786 0.0738084 0.0412039 +0.0326792 0.103442 0.0351236 +-0.0614661 0.174127 -0.0585981 +-0.0717687 0.0836085 -0.0162896 +-0.0457927 0.0869975 -0.0219586 +0.0105224 0.0990052 0.0483243 +-0.0829648 0.129479 -0.00406234 +-0.0356761 0.0343506 0.0364799 +-0.0884531 0.0888833 0.0214341 +-0.0627252 0.0416196 0.0257026 +-0.0564562 0.159872 0.00406757 +-0.0891671 0.0942549 0.0124334 +0.00850148 0.0561026 0.0528172 +-0.0897269 0.113038 0.0361809 +0.0510319 0.0481609 0.0243415 +-0.0355318 0.0341909 0.0278174 +0.0439268 0.0945301 0.0211547 +-0.0579061 0.0357757 0.046064 +-0.0154366 0.0383652 0.00473292 +-0.0175221 0.187321 -0.0198494 +-0.00549946 0.0842482 0.0569765 +0.0601999 0.0678503 0.0111396 +0.0144807 0.0658974 0.0525165 +0.0293268 0.0963357 -0.0179631 +-0.0397817 0.126122 -0.00537397 +0.0345713 0.109241 -0.00571538 +0.0142478 0.0846938 0.0523116 +-0.00151223 0.107257 0.0435513 +-0.0568094 0.0336832 0.0202688 +-0.00449913 0.108643 0.0435023 +0.0366018 0.0989128 -0.0107075 +-0.0520805 0.0552272 0.0244826 +-0.0564227 0.125779 -0.00685719 +-0.045508 0.0519257 0.0382686 +0.0321211 0.116144 0.000111339 +-0.0560271 0.142758 -0.00201441 +-0.0204991 0.12085 0.0318342 +-0.0572069 0.155002 0.0203881 +-0.0683862 0.0434928 0.00469407 +-0.0749362 0.167415 -0.0237916 +0.00950453 0.0758273 0.0557308 +0.0134626 0.0962698 0.0490469 +-0.0352581 0.0336435 0.0104036 +0.0033475 0.0524625 -0.0299019 +-0.0200406 0.0417644 0.0532372 +-0.020634 0.03806 0.0202475 +-0.0354822 0.0590569 0.0395591 +-0.0633421 0.145588 -0.0131138 +0.0560276 0.0714782 0.0201554 +-0.034079 0.157748 -0.0116645 +0.0430592 0.0871926 0.0271788 +-0.067061 0.0617728 0.0200983 +0.0054202 0.0385344 -0.0060218 +-0.0562382 0.115455 0.0360976 +0.0318915 0.0727133 0.0408308 +0.00701986 0.131464 0.0165435 +-0.00758439 0.038449 0.00988421 +-0.0401838 0.128459 0.00507702 +0.0467715 0.0482711 0.0287479 +-0.0918049 0.126804 0.00826817 +-0.0821184 0.0782385 0.0256306 +-0.0812562 0.103354 0.0307723 +-0.0639536 0.144435 -0.0123561 +-0.0108662 0.129871 0.00999779 +0.0155048 0.112635 0.0385412 +0.0182534 0.0792348 -0.0283217 +-0.0893331 0.0983151 0.0114073 +-0.00325216 0.0396403 0.0476826 +-0.0241255 0.089259 0.0519927 +-0.0858632 0.106258 0.00536057 +0.00408474 0.0346021 -0.0158016 +-0.0407936 0.0869784 -0.0214607 +-0.0166484 0.0480949 -0.029815 +-0.0157153 0.0613848 -0.0360938 +-0.0566239 0.0482507 0.0375737 +-0.0424946 0.0619914 0.040787 +-0.0676789 0.0735575 -0.0139417 +-0.00550026 0.0815011 0.0573318 +-0.0466697 0.166955 -0.00590454 +0.050335 0.0531616 -0.00370253 +-0.075448 0.162419 -0.0329687 +-0.0614914 0.089051 0.0454546 +-0.0467107 0.0709021 -0.0159388 +0.0485116 0.0611011 0.0306918 +0.0308141 0.0862286 0.0429136 +0.041033 0.0788113 -0.0077656 +-0.0332536 0.0434286 -0.0288825 +-0.0599631 0.0455474 0.028679 +-0.0106693 0.0383927 0.00930564 +0.00450171 0.04895 0.0512539 +-0.0567297 0.0738308 -0.0175741 +-0.0395016 0.128216 0.0127148 +-0.0236465 0.18441 -0.0150532 +-0.0541007 0.0517729 -0.00535724 +-0.00963566 0.0383633 0.0204127 +-0.072501 0.11898 0.053434 +-0.072483 0.0356257 0.00284128 +-0.0164962 0.0815146 0.0575151 +0.0321311 0.10568 -0.0119259 +-0.0628015 0.0867155 -0.0190743 +-0.0747157 0.155426 0.0258403 +-0.0655092 0.0986926 0.0420188 +-0.0621042 0.153787 0.0317461 +0.0075074 0.0702645 0.0557506 +-0.0873725 0.140519 0.00919988 +-0.0816979 0.073476 0.0105355 +-0.0251078 0.125921 0.00624226 +0.0143125 0.129601 0.0135477 +0.0537172 0.0701657 0.00367339 +-0.0658178 0.165764 -0.0247368 +-0.0706171 0.164859 -0.0164358 +-0.0268181 0.0385613 -0.0106363 +-0.0308492 0.121938 -0.00695618 +-0.0240991 0.0708914 0.0469009 +0.00836584 0.0509624 -0.0290525 +0.0146552 0.0361528 0.0436042 +-0.0759244 0.155422 0.00936737 +0.00291872 0.0383891 0.0247663 +-0.0483005 0.12541 0.0300666 +0.00749081 0.093253 -0.0307631 +-0.0441374 0.160646 -0.00957119 +-0.0454954 0.0945383 0.0433792 +0.0153865 0.0350801 0.00287497 +-0.0507565 0.078263 -0.0192091 +-0.014682 0.0540945 -0.0332776 +-0.0697195 0.0625059 0.018914 +-0.0850789 0.151288 0.0289026 +0.000998881 0.131517 0.0100563 +-0.0866192 0.111201 0.0383037 +-0.0257526 0.069725 -0.0351721 +-0.0832913 0.0938266 -0.00556456 +-0.00149798 0.121047 0.037107 +-0.0164922 0.103019 0.043564 +-0.00175716 0.0797524 -0.0362245 +-0.065193 0.165273 -0.0595568 +-0.00746087 0.0391472 0.0345828 +-0.0384976 0.0790115 0.0428361 +-0.00149834 0.095227 0.054625 +-0.00277478 0.078376 -0.0365291 +-0.0780329 0.155476 0.0217657 +-0.0632159 0.147647 -0.016402 +-0.0801569 0.0817921 0.0331577 +-0.0500022 0.16408 -0.00389251 +-0.0747874 0.0892505 -0.0147771 +-0.00949475 0.122405 0.0348735 +-0.0322196 0.0423712 0.0501883 +-0.00876131 0.174216 -0.0276966 +-0.0545091 0.161256 6.9518e-05 +0.0181832 0.102054 0.0457705 +-0.0604933 0.102915 0.04183 +0.0437773 0.0804492 0.0262342 +0.0388648 0.0842467 -0.0137667 +-0.00550336 0.0647558 0.0562438 +-0.0929299 0.122874 0.0352771 +-0.043447 0.0338958 0.0281851 +-0.0649274 0.155826 -0.0455264 +-0.00117719 0.0381217 -0.0144579 +-0.0146742 0.180146 -0.0213737 +-0.0911602 0.113316 0.0133388 +0.0114933 0.0990667 0.0482243 +-0.030492 0.093206 0.0443051 +-0.00885946 0.13031 0.0150517 +-0.073851 0.0979023 -0.0138506 +0.00349864 0.0505127 0.0525247 +0.0579498 0.0621469 0.0239372 +-0.0266127 0.121438 0.026306 +-0.0640364 0.138454 -0.00746704 +-0.0881537 0.0875035 0.020457 +-0.0693202 0.16097 -0.0509443 +-0.0258632 0.0384431 -0.0103374 +-0.0445084 0.162276 0.00597583 +0.002127 0.0994865 0.0488443 +-0.00523434 0.128086 0.0279795 +0.0441694 0.0706598 0.0245614 +0.00913312 0.10443 -0.020596 +-0.00849151 0.104452 0.0437135 +-0.0709552 0.134052 -0.00817596 +0.040546 0.0860518 0.0323351 +0.026933 0.109961 -0.012516 +0.0171797 0.119654 -0.0109592 +-0.0154871 0.10859 0.0421893 +-0.0544999 0.0945829 0.0441089 +-0.0942376 0.122836 0.024283 +0.0145822 0.10067 -0.0225932 +0.0416553 0.0900846 -0.00877196 +-0.0627089 0.0722313 -0.0153832 +-0.0265055 0.0946665 0.044662 +-0.0241067 0.108647 -0.0210644 +-0.0475093 0.0504634 0.0377677 +-0.0271626 0.0836755 0.0495254 +-0.0707023 0.155807 0.00247134 +0.0113316 0.0343299 -0.00659923 +0.0271512 0.0740976 0.0445232 +-0.00214312 0.101026 -0.0230018 +-0.0518271 0.094161 -0.0217872 +-0.0685768 0.0699128 0.0338326 +-0.0538957 0.0344051 0.0325721 +-0.0280624 0.17271 -0.00913079 +-0.0710555 0.148357 -0.0346175 +-0.0392482 0.165334 0.00281642 +-0.0494961 0.159354 0.00844009 +-0.0887346 0.0956375 0.0224045 +-0.0856504 0.126624 -0.00269798 +-0.0486707 0.147744 0.0101492 +-0.0735613 0.16372 -0.0149978 +0.0180716 0.0350245 0.0344937 +-0.0307362 0.053835 -0.015374 +-0.0887393 0.0928617 0.00944255 +-0.016725 0.0627999 -0.0362248 +-0.0190611 0.063953 0.0505398 +-0.0441816 0.0346721 0.0413945 +-0.0593157 0.126918 0.0405689 +-0.0111259 0.174182 -0.0282833 +-0.0436679 0.0621935 -0.0131864 +0.0275209 0.088828 -0.0220264 +-0.0297851 0.0890261 -0.0295849 +-0.0303849 0.154168 -0.00247422 +-0.0425281 0.128954 0.00568377 +0.0162787 0.126801 -0.0006607 +-0.0727179 0.0806647 -0.0147187 +-0.0753424 0.0928083 0.039305 +-0.0798316 0.111318 -0.00180655 +0.0192462 0.0346832 0.00400718 +-0.088108 0.129743 0.0452172 +-0.0103013 0.038437 0.0111565 +-0.0466082 0.166842 0.00289141 +-0.0459915 0.152139 0.00880917 +-0.02765 0.0504128 -0.0240838 +-0.00316977 0.101093 -0.0230747 +-0.081903 0.123614 -0.00465545 +0.0308134 0.104771 0.0359398 +-0.0649698 0.0444252 -0.000282601 +-0.0411724 0.128614 0.0047134 +-0.0566724 0.0661356 -0.00992741 +-0.0768027 0.1218 0.0526081 +0.0286707 0.0432432 0.0323583 +-0.0776442 0.112189 0.0467134 +-0.0599288 0.0595089 0.00385673 +-0.0751102 0.148577 -0.0168689 +-0.0422557 0.0435263 -0.021317 +-0.0109825 0.18157 -0.0273657 +0.0160657 0.128852 0.0141586 +0.0353395 0.113619 0.00703904 +-0.0746273 0.149901 -0.0298709 +-0.0108803 0.105927 -0.0227775 +-0.0134961 0.0472092 0.0480936 +0.0366578 0.0576635 0.0335112 +-0.019761 0.0984382 0.0445534 +-0.0662568 0.117183 0.0498756 +-0.0659606 0.17389 -0.0478108 +-0.0116079 0.0434695 -0.0263093 +-0.0926722 0.117507 0.0393006 +-0.0764843 0.145607 0.0435529 +-0.0467321 0.0337537 0.00617309 +-0.0558876 0.104087 -0.0189213 +-0.0920931 0.126941 0.031257 +-0.0204778 0.086949 0.0559493 +0.0205756 0.0550317 0.0471809 +0.0164894 0.10985 0.0397676 +-0.0639427 0.125311 -0.00880074 +-0.0233699 0.0380458 0.0160874 +0.00571651 0.037694 -0.0126956 +-0.0305064 0.059434 -0.0194047 +-0.0286182 0.0422955 -0.0294891 +-0.074262 0.155148 0.0274653 +-0.0780672 0.161102 -0.0219327 +-0.0710541 0.174778 -0.0424234 +-0.0641619 0.126957 0.0459503 +-0.0724375 0.0643068 0.0185598 +-0.0568864 0.106915 -0.0181412 +0.0293195 0.0995163 0.0407971 +-0.0644558 0.155894 0.01199 +0.00534877 0.131711 0.0116581 +-0.070964 0.169422 -0.0500317 +0.0101411 0.103018 -0.0207697 +0.0413802 0.0547717 -0.00646982 +-0.0385096 0.0776202 0.0427509 +-0.0239792 0.115969 -0.0147616 +-0.0225483 0.119525 0.0321637 +-0.060198 0.152175 0.0339452 +-0.0535114 0.0452153 0.0437642 +-0.0037319 0.0346421 0.0447442 +0.0102653 0.0944766 -0.0280245 +0.0270364 0.0347184 0.00926922 +-0.0660514 0.11246 0.0412419 +-0.0427238 0.072521 -0.0180673 +-0.057924 0.0453324 0.0266819 +0.0321473 0.0354374 0.0133726 +-0.0750002 0.0776536 0.0352037 +-0.0404922 0.11531 0.0337051 +-0.0201478 0.16826 -0.0196016 +-0.0263171 0.178663 -0.00829314 +0.0232364 0.0706221 -0.0263108 +-0.0228968 0.117028 -0.0138782 +-0.0477554 0.130992 0.0255865 +-0.05149 0.104281 0.0405196 +-0.00121687 0.120006 -0.0132177 +-0.0299396 0.0649723 -0.0274594 +-0.0187899 0.0784905 -0.0388371 +-0.0498267 0.109983 -0.0185775 +0.00334971 0.0510613 -0.029847 +0.0259096 0.0534724 0.0407837 +-0.0455367 0.111121 -0.0175743 +-0.0124237 0.0348026 0.0445556 +-0.0887181 0.123977 0.00228597 +-0.088156 0.151596 0.0228856 +-0.0530084 0.149326 0.0224058 +0.0191744 0.125775 0.0238749 +-0.0735068 0.118971 0.0531919 +-0.0585002 0.0987496 0.0428962 +-0.0310887 0.159271 -0.0130615 +0.000886159 0.12297 -0.0104051 +-0.0872227 0.0941086 0.00335062 +-0.0273424 0.0931435 -0.0275899 +0.0213306 0.126248 0.00896939 +0.0549036 0.0506667 0.00319831 +-0.0245658 0.115393 0.0346209 +-0.0908157 0.133668 0.01022 +0.011387 0.126452 0.0296316 +0.0342091 0.0430428 0.0288022 +-0.0759039 0.154928 -0.00089291 +-0.0834635 0.136224 -0.000676656 +-0.0242249 0.124407 -0.00155437 +-0.00949715 0.103034 0.0436292 +-0.0448632 0.102817 -0.0213129 +-0.0762912 0.162417 -0.0319674 +-0.087261 0.137734 0.00520439 +0.0359972 0.0915666 0.0381116 +0.0515419 0.0610093 0.0297195 +-0.0759846 0.168851 -0.0284951 +0.0192535 0.076364 -0.0276613 +0.00153258 0.130437 0.0231622 +-0.0552695 0.058846 -0.00542677 +-0.0478299 0.094184 -0.0219241 +0.0413096 0.0957202 -0.00478826 +0.00646546 0.131591 0.014917 +-0.0921802 0.132348 0.0172238 +-0.00096127 0.131397 0.0150615 +0.0373767 0.0519575 -0.00666499 +0.000499624 0.0661631 0.0564081 +-0.0624427 0.149095 -0.00857615 +-0.0158277 0.127263 0.00131837 +-0.0534778 0.0544994 -0.00645482 +-0.0393097 0.122071 -0.0111029 +-0.0552136 0.0346314 0.0441945 +-0.062546 0.0614527 -0.00215685 +0.0190515 0.0781917 0.0522129 +-0.00645816 0.122156 -0.0114796 +0.0547648 0.068691 0.024634 +-0.0165146 0.104417 0.0427511 +-0.0914381 0.133727 0.0162105 +-0.0621573 0.163143 -0.0375929 +-0.0927674 0.130992 0.0172311 +0.00308348 0.0981539 0.0507387 +0.0223728 0.0658814 0.0463438 +-0.039497 0.060614 0.0410267 +-0.0547684 0.0513541 0.0102674 +0.00252507 0.0561606 0.0537161 +-0.0427018 0.0681213 -0.0161497 +0.0102881 0.063916 -0.0312717 +-0.0443833 0.12939 0.00495951 +-0.0186027 0.160444 -0.0128213 +0.0371116 0.111176 0.0148387 +0.0282213 0.0875505 0.0444323 +-0.0274771 0.120676 0.0274866 +-0.0584936 0.0439589 0.0439647 +0.0240603 0.0822578 0.0489414 +0.0351443 0.071382 0.0384881 +-0.0164918 0.0897515 0.056205 +-0.0781864 0.161095 -0.0229348 +-0.0701455 0.111146 0.0439061 +-0.00742751 0.0346718 0.0457358 +-0.0757375 0.106056 0.0359296 +-0.0735163 0.138649 0.0485985 +-0.0786866 0.073183 -0.00146774 +-0.0425028 0.11664 0.0325093 +-0.0294965 0.105676 0.0405837 +-0.0253323 0.089221 0.0503626 +-0.00687638 0.105938 -0.022783 +-0.0680331 0.17369 -0.0570223 +-0.0709606 0.152484 -0.0460812 +-0.0145326 0.0386197 0.0300043 +-0.0284453 0.0903864 0.0448476 +-0.0688215 0.145351 0.0427408 +-0.0488146 0.109958 -0.0184987 +-0.0764868 0.144228 0.0448323 +-0.0204228 0.0384821 -0.0074254 +-0.050433 0.0505709 0.0355945 +0.00517866 0.131021 0.00445011 +-0.0697426 0.08081 -0.0166425 +-0.084857 0.0924919 0.0290512 +-0.00149439 0.0870302 0.0569025 +-0.072621 0.142849 -0.00891964 +0.0127783 0.105278 -0.0195273 +0.00375967 0.0343287 0.0177156 +-0.0724944 0.126022 0.052902 +-0.0520295 0.0429585 0.0453289 +-0.0373786 0.0478297 -0.016773 +-0.0165095 0.0446732 0.0513338 +0.0115347 0.118055 -0.0152175 +-0.0461946 0.0601644 0.0381445 +-0.0730192 0.156843 -0.0319176 +-0.0665818 0.173704 -0.0590137 +-0.0904622 0.133649 0.00822658 +-0.0661919 0.0387353 0.0332699 +0.0285711 0.0632767 0.0429905 +-0.0191373 0.0348399 0.0448528 +-0.0144945 0.115487 0.0386767 +-0.0885619 0.129493 0.00323888 +-0.00509715 0.039098 -0.012386 +0.00551873 0.0842341 0.0568816 +-0.0784525 0.0962411 -0.0105211 +-0.0126763 0.05824 0.052838 +-0.00571704 0.0642049 -0.0354496 +-0.0659809 0.169803 -0.037696 +0.00534315 0.0567731 -0.0307134 +-0.0104849 0.101611 0.0440429 +-0.0320291 0.108616 -0.01899 +0.0442879 0.0415947 0.0193873 +0.0261947 0.0449183 0.0375802 +-0.0626054 0.158425 -0.0185846 +-0.0321937 0.0694259 -0.0234551 +-0.0597828 0.0810723 -0.0197911 +-0.0274915 0.0602914 0.037483 +0.0278788 0.120142 0.00144262 +-0.00359535 0.0391334 -0.025473 +-0.0104902 0.0619157 0.0554492 +-0.0851123 0.133936 0.0477712 +0.0133897 0.0389058 -0.0222843 +-0.0778477 0.159718 -0.0189229 +-0.0817169 0.081448 -0.00456785 +0.00880568 0.131337 0.0114907 +-0.0885025 0.144515 0.032494 +0.00248318 0.0413744 0.0461608 +0.0393065 0.105567 0.023165 +0.0485408 0.0662379 -0.000364329 +-0.074114 0.159638 -0.0309374 +-0.0656277 0.0636798 0.0258038 +0.0326128 0.0934199 -0.0168733 +-0.0691845 0.152183 -0.0467119 +-0.0356328 0.0347409 0.0201566 +-0.067463 0.166618 -0.0559977 +0.0410852 0.0860175 0.0313838 +-0.0465484 0.0404249 0.0444582 +-0.0884823 0.147207 0.0295866 +-0.047064 0.168385 -0.0010022 +0.0204505 0.044377 -0.0207645 +-0.0460107 0.0426896 -0.0115747 +-0.0892694 0.136527 0.0301984 +-0.00170296 0.0612915 -0.034176 +0.016206 0.0927227 0.0499244 +-0.0816886 0.154881 0.0175845 +-0.0434863 0.0776041 0.0427475 +-0.0883068 0.098239 0.00641854 +-0.045625 0.056311 -0.011298 +-0.0524843 0.150872 0.017395 +-0.0641668 0.0334738 0.00287677 +0.0361211 0.0586877 -0.0107678 +0.0141254 0.0589894 0.0501816 +-0.0864962 0.112872 0.0280752 +-0.0863885 0.112851 0.0441987 +-0.0524922 0.0384865 -0.0115467 +-0.0776496 0.163935 -0.0239336 +-0.0554697 0.0345193 -0.0117205 +0.0176795 0.0740469 0.0519763 +-0.0728932 0.0642808 0.0113714 +0.0261658 0.0809584 -0.0239333 +0.058376 0.0713467 0.0136326 +0.0257313 0.0968616 0.0444005 +0.00516452 0.0344202 0.0197338 +-0.0686185 0.0687175 -0.00655491 +-0.0803464 0.147298 -0.000827063 +0.000190276 0.131527 0.0154789 +-0.0687909 0.0354139 0.0127136 +-0.05562 0.146743 0.0301728 +0.0240878 0.0645552 0.0452968 +0.0313304 0.0475675 0.0327114 +-0.0107396 0.0713653 -0.0375278 +-0.0444884 0.0733739 0.0424053 +-0.0892862 0.137904 0.0301929 +0.0430064 0.0930319 -0.00281527 +0.00152278 0.0688979 0.0560686 +0.02743 0.0663837 -0.0217206 +-0.0610765 0.167736 -0.0598039 +0.0469057 0.0738955 0.00933063 +0.010569 0.0630758 0.0538717 +-0.0636657 0.175908 -0.0542108 +-0.00887643 0.105922 -0.0227472 +0.0366768 0.0861722 0.0373065 +-0.00750518 0.0661146 0.0558703 +-0.0311481 0.174122 -0.0158676 +0.0165049 0.115408 0.0369209 +-0.0599957 0.135288 0.0360766 +0.023446 0.0385037 -0.00396461 +-0.0512658 0.0335234 0.00365116 +-0.0640041 0.0417908 0.0276702 +0.0505407 0.062451 0.0297568 +0.0381071 0.0767371 0.0357901 +0.0348186 0.114435 0.00971518 +-0.0808584 0.15153 0.0328055 +-0.0292731 0.0691492 -0.0304581 +-0.0482843 0.133992 0.00441773 +-0.0151264 0.0382524 0.0175843 +0.0457402 0.0749932 0.00321166 +-0.0514912 0.0529568 0.0308804 +-0.0841758 0.0777074 0.00551439 +-0.0724891 0.168081 -0.0228518 +-0.0578499 0.140998 0.0321632 +-0.0824678 0.0844329 0.0311552 +-0.035201 0.0380831 0.0475916 +-0.0225654 0.0336394 -0.0239171 +0.0463796 0.0792543 0.0131749 +0.0210505 0.125312 0.00175976 +-0.0835133 0.0843594 0.0293933 +-0.00767881 0.0555674 -0.03337 +-0.052489 0.159007 -0.00340529 +-0.0244459 0.156552 -0.00701262 +-0.0598434 0.0384999 0.0207227 +-0.0725078 0.160609 -0.0083559 +0.0429565 0.0986678 0.00218951 +-0.00967767 0.118026 -0.0150602 +0.038419 0.105512 0.0261645 +-0.00651495 0.0746355 0.058305 +0.0450144 0.0945871 0.00816469 +-0.0454802 0.123445 -0.0105099 +-0.00122028 0.0938312 -0.0334376 +-0.067038 0.143551 -0.013347 +0.043578 0.0888313 -0.0037919 +-0.0238161 0.078256 0.0534268 +-0.0455234 0.131922 0.0119481 +-0.0735087 0.137262 0.0493527 +-0.0183224 0.184952 -0.0232094 +-0.0148238 0.091051 -0.0367095 +-0.000496937 0.0620135 0.0565388 +-0.0217336 0.0611778 -0.0340471 +-0.0922703 0.125567 0.0322584 +0.0255559 0.0952317 -0.0208124 +-0.0748894 0.152721 -0.0218881 +-0.0770206 0.0981288 0.0365817 +-0.0262775 0.073604 0.0447421 +0.00842909 0.131472 0.01278 +-0.0815194 0.125984 0.0522053 +-0.0768497 0.156895 -0.0209209 +-0.0774933 0.0717304 0.000534742 +-0.0610597 0.172553 -0.0606091 +-0.00957846 0.178815 -0.0287373 +-0.062208 0.167823 -0.0505845 +-0.0225076 0.125867 0.0188793 +-0.0580565 0.0334897 0.00410791 +-0.00649004 0.112763 0.0415025 +-0.00176067 0.0755229 -0.0360316 +0.0456774 0.0904203 0.00916591 +0.0441351 0.0749462 0.0250125 +-0.0810675 0.11076 0.0435122 +0.00990869 0.048971 0.0492516 +-0.0728744 0.10362 -0.0122376 +0.0374772 0.106859 -0.00183322 +0.0151574 0.0988592 -0.0229537 +-0.016863 0.0640072 0.0526042 +-0.0418006 0.0462579 -0.0152948 +-0.0768234 0.0927696 0.0379671 +-0.0661935 0.155092 0.00556387 +-0.0810703 0.0752023 0.0214152 +-0.0235527 0.156826 -0.00518035 +-0.0194871 0.0883195 0.0557235 +-0.0716986 0.077793 -0.0140498 +-0.010631 0.0389663 -0.00962591 +-0.0570892 0.0602319 -0.00257411 +-0.0419839 0.128576 0.0133734 +-0.0151399 0.0382506 0.0121533 +-0.0759996 0.139851 -0.00609906 +-0.0506105 0.0694238 0.0381651 +-0.0658919 0.11864 0.0504465 +-0.0528899 0.106976 -0.018917 +-0.0521172 0.0545658 0.0256302 +-0.005498 0.103045 0.0437796 +-0.0524893 0.156469 0.0106374 +-0.0439563 0.147482 -0.0018962 +0.00349012 0.116915 0.0395094 +-0.0116538 0.0496371 -0.0310034 +-0.0360677 0.156277 -0.0104898 +0.0262747 0.0376552 0.0265482 +0.00369465 0.0390982 -0.00688719 +0.037401 0.0414131 -0.00242752 +-0.010004 0.0383201 0.0185669 +-0.0807853 0.0817556 0.0323751 +-0.00609738 0.037339 0.0487481 +-0.0254987 0.0945485 0.0446378 +-0.0446176 0.0345408 0.0396657 +-0.0522913 0.124591 -0.00759738 +-0.0244524 0.16187 -0.0148048 +-0.0144465 0.128429 0.00434765 +-0.0238211 0.0384511 -0.00993154 +0.0184111 0.122524 0.0307587 +-0.0815439 0.112456 0.0456165 +0.0549908 0.0567623 0.0266396 +0.0309112 0.0754873 0.0429619 +-0.0278697 0.103003 -0.0233536 +-0.0640545 0.149152 -0.0269946 +-0.0594536 0.133932 0.0368692 +0.0130152 0.130057 0.0144613 +0.0491953 0.0732159 0.0116573 +-0.0364993 0.0733348 0.0420574 +-0.0859116 0.107692 0.0193681 +0.0386236 0.109277 0.0110826 +0.00584547 0.0353648 -0.01428 +0.0198737 0.0358544 0.0359282 +-0.0174269 0.182963 -0.0250022 +0.0258436 0.0563286 -0.0217568 +0.0362122 0.112176 0.0188059 +-0.0564979 0.0805451 0.0445004 +0.0450117 0.0805305 0.000199058 +-0.043786 0.126623 -0.00583839 +0.0366462 0.100736 0.0320541 +-0.0198519 0.0357263 0.0525976 +-0.0872471 0.125707 0.0473263 +-0.0180735 0.0611876 0.0510587 +-0.0608049 0.0596005 0.019786 +0.0269735 0.121605 0.0224835 +0.033449 0.0380742 0.000639692 +-0.0174889 0.0856455 0.0572522 +-0.0298765 0.0607745 -0.022409 +-0.0371209 0.127449 0.0017956 +-0.0397839 0.0471068 -0.0160895 +-0.0245336 0.118082 0.0325274 +-0.0715136 0.0887445 0.0416191 +0.00419323 0.0880606 -0.0335488 +0.0353118 0.0520079 -0.00674902 +-0.00049849 0.101653 0.0443576 +-0.0570055 0.133804 -0.00545801 +-0.0215772 0.158162 -0.00503193 +-0.0640639 0.0351963 0.0227232 +-0.00287353 0.108795 -0.0218002 +0.0462936 0.0792458 0.00718673 +-0.00951316 0.0575536 0.0537045 +-0.0477812 0.0840973 -0.0215817 +-0.0526608 0.0504363 0.0276515 +-0.0340312 0.123966 -0.00509105 +0.00648697 0.11688 0.0387497 +0.0343069 0.0578226 0.0371782 +-0.0220745 0.169763 -0.0127977 +-0.0106374 0.0466553 -0.0295813 +0.0335656 0.114779 0.000629741 +-0.0269131 0.180109 -0.00739997 +0.0390081 0.105539 0.000161276 +-0.00175381 0.0993639 -0.0251444 +0.040909 0.0985658 0.0261474 +-0.0617277 0.159994 -0.0345941 +-0.0434138 0.111151 -0.0176174 +0.0319241 0.0700307 0.0408624 +-0.0349471 0.109117 -0.019515 +-0.0733885 0.111282 0.0466166 +0.0354121 0.0430461 -0.00417186 +-0.093028 0.117371 0.013308 +-0.0756832 0.149968 -0.01987 +0.0201512 0.0605237 0.0483852 +-0.0639979 0.158311 -0.048587 +0.0410638 0.0928718 -0.0077952 +-0.0845757 0.151155 0.0298105 +-0.0752762 0.167899 -0.0253615 +0.0587584 0.0580034 0.00517536 +-0.070971 0.166609 -0.0480118 +-0.0488701 0.10281 -0.0210946 +-0.0609926 0.128204 -0.00783795 +-0.0772884 0.155547 -0.0128979 +0.0120566 0.130535 0.0112565 +-0.0655484 0.039711 0.0142785 +-0.0465128 0.0438401 0.043121 +-0.0215234 0.0739469 0.0526909 +0.0238579 0.0490757 0.0395236 +-0.00446924 0.111373 0.0424038 +-0.0646993 0.150616 -0.0327557 +-0.0547216 0.118372 0.0366122 +0.055991 0.067441 0.024671 +-0.0164973 0.0485745 0.0476342 +-0.0243246 0.0415463 0.0540712 +-0.0679818 0.0653371 -0.00356488 +-0.0887934 0.125677 0.0460403 +-0.0672794 0.176766 -0.0591515 +-0.0201696 0.169725 -0.0202727 +0.0232197 0.0818757 -0.0256198 +-0.0521106 0.0503642 0.0236349 +-0.00378569 0.0826645 -0.03749 +0.0103848 0.03606 -0.0224393 +0.0144027 0.129384 0.00642559 +0.0154718 0.101771 0.0468044 +-0.0222044 0.174173 -0.0211642 +0.0605561 0.0664891 0.0161665 +-0.0110072 0.128401 0.0244439 +0.00979123 0.127622 -0.00353983 +-0.0586426 0.0335837 0.0110854 +-0.0324964 0.0518418 0.0373712 +0.0339681 0.114736 0.0222644 +-0.0278327 0.179989 -0.0150111 +0.0505141 0.0610459 0.0301699 +-0.084345 0.0818627 0.0244959 +-0.0780694 0.106243 0.0333548 +-0.0400434 0.149481 0.00241998 +0.0415851 0.0779004 0.0302476 +-0.0934884 0.117419 0.0203018 +0.0145324 0.0686382 0.0526166 +0.0105088 0.0546576 0.0523588 +-0.0166719 0.128014 0.0194984 +0.0111864 0.115382 -0.0163281 +0.0433489 0.0761902 -0.00378764 +0.00361131 0.0929227 -0.0324448 +0.0374765 0.0967619 0.0332563 +0.0118435 0.0418607 0.0449613 +0.00151372 0.070315 0.0563646 +-0.089555 0.092956 0.0194329 +-0.0309867 0.0458642 -0.0271867 +-0.0127025 0.0628523 -0.0366298 +-0.0211402 0.175693 -0.0149194 +-0.0410644 0.0466663 -0.0156422 +0.0229642 0.0564103 0.0453711 +-0.0689131 0.06155 0.0163724 +-0.0351956 0.0394954 0.0475468 +0.0545544 0.0478595 0.011201 +0.0307617 0.0848812 0.0428147 +-0.0854234 0.100771 0.000422318 +-0.00263926 0.0481807 -0.0301073 +0.0341204 0.0781827 0.0405841 +-0.0753485 0.151324 -0.0238793 +-0.040104 0.0359968 0.0427867 +0.00880995 0.127795 -0.00370552 +-0.0546717 0.0587861 -0.00643621 +-0.0527782 0.0338002 0.0103069 +-0.0644915 0.087588 0.0448694 +-0.0649403 0.125308 -0.00887181 +-0.0623267 0.035582 -0.00867786 +-0.0178682 0.127784 0.00598386 +-0.0477624 0.119115 -0.0139706 +-0.0272958 0.178509 -0.0169626 +-0.036773 0.0446897 0.0419462 +-0.0643144 0.0445281 -0.000908113 +0.0310215 0.117934 0.00259488 +-0.0657027 0.155342 0.0275329 +0.00812544 0.105869 -0.0206053 +-0.0845132 0.150109 0.0051703 +0.0147267 0.0343671 -0.00408399 +-0.0738652 0.150214 0.0382196 +-0.0396346 0.151103 -0.0056598 +-0.0548476 0.0665624 0.0361422 +-0.053656 0.116868 0.0345992 +0.0407085 0.0956949 -0.00580768 +-0.0407505 0.126266 0.0196745 +0.0327193 0.0632979 0.0402054 +-0.0423878 0.124291 -0.00941969 +0.0148847 0.0378033 0.0441286 +-0.0385893 0.036902 -0.00962928 +-0.0735502 0.095526 0.040254 +-0.0625469 0.169393 -0.0495927 +-0.0666556 0.0360676 0.0353877 +0.00702297 0.127188 0.0294846 +0.0123661 0.0479119 -0.026429 +0.00707963 0.0365612 -0.00575515 +0.00660499 0.0617786 0.0553203 +-0.056364 0.156406 0.0105108 +-0.02141 0.0511007 0.0448554 +-0.0417892 0.0855226 -0.0213401 +-0.0454873 0.0789625 0.0423892 +0.0541155 0.0731329 0.017974 +0.0124978 0.092313 0.0523832 +-0.0184886 0.0801089 0.0571361 +-0.0426749 0.0622014 -0.0131851 +-0.0711139 0.162407 -0.0449498 +-0.0234912 0.0474961 0.0510145 +-0.0722633 0.0367738 0.0082856 +-0.0207862 0.0638606 0.0480406 +-0.0570496 0.0562866 0.00362097 +0.023226 0.077646 -0.0258357 +0.00592655 0.0339685 0.0148513 +0.0327331 0.0942636 0.0404449 +0.0170625 0.0448711 0.043693 +0.0335588 0.0862851 0.0416032 +-0.0588111 0.0334057 -0.00501142 +-0.0718597 0.148728 0.0404251 +-0.0700765 0.0619608 0.0139832 +-0.0302069 0.174221 -0.00514504 +-0.088803 0.151599 0.0211964 +0.0155832 0.0893609 -0.0286847 +0.0270636 0.120631 0.00113345 +0.033576 0.0781814 -0.0177928 +-0.0894235 0.0942851 0.0164251 +-0.0386513 0.0344774 0.0357393 +-0.0348698 0.176878 -0.00628812 +-0.0102548 0.179004 -0.0295955 +-0.0708792 0.115031 -0.00817569 +0.0203316 0.0551325 -0.0272049 +-0.0942207 0.120117 0.0202902 +-0.0704743 0.121802 0.053345 +0.0441954 0.0847004 0.0251589 +-0.0662148 0.171945 -0.0435535 +-0.0579078 0.0494657 0.0056917 +-0.0364996 0.0789928 0.0425809 +0.00849936 0.0744764 0.056192 +-0.0263916 0.0563779 0.0383176 +-0.0556017 0.0336949 -0.0101219 +-0.0593537 0.140997 0.0335026 +-0.0941834 0.120103 0.0162919 +0.0184196 0.0442138 -0.0226321 +-0.0628603 0.033866 0.0135258 +-0.0229828 0.0566251 0.0433992 +-0.0295276 0.0383617 0.0343291 +-0.0439439 0.166904 -0.00881722 +-0.00750585 0.0633646 0.0562436 +-0.0553809 0.0486564 0.0109541 +0.0106398 0.0390088 0.044914 +0.0440071 0.0846602 -0.00280808 +-0.0184891 0.0743773 0.0548673 +0.0214529 0.0415824 -0.013701 +-0.0137336 0.0383402 0.0141683 +-0.0895155 0.0983259 0.0124123 +0.0129339 0.063079 0.0520141 +-0.0749499 0.112554 -0.00662315 +-0.0128237 0.0855345 -0.0387685 +-0.0175101 0.0381991 0.0207599 +-0.065046 0.0423247 0.012291 +-0.0570589 0.0507155 -0.000374425 +-0.0630045 0.132588 -0.00795426 +-0.0415001 0.0972709 0.0420669 +0.0313679 0.117954 0.0212794 +-0.00373539 0.0684024 -0.0350771 +-0.0896129 0.139294 0.0321884 +-0.0239769 0.0381215 0.0231095 +0.0347467 0.0670098 -0.0158076 +0.0178644 0.101883 -0.0218675 +-0.064813 0.0428917 0.034688 +-0.0618962 0.0443648 0.0286813 +0.0425837 0.100055 0.002186 +-0.056712 0.0708617 -0.0156392 +-0.066713 0.154086 0.0315791 +-0.0348246 0.0872331 -0.0245609 +-0.0155018 0.080076 0.0569734 +-0.0431381 0.128903 0.00398376 +0.0456202 0.0421608 0.019117 +-0.0637474 0.0766435 -0.0177206 +-0.070335 0.0339385 0.00479187 +-0.0452276 0.131073 0.0164666 +0.0175902 0.128186 0.00902123 +-0.0332219 0.0344808 0.0386469 +-0.000130337 0.0395577 0.0357254 +-0.0384117 0.12376 -0.00887525 +-0.0384745 0.0533908 0.0391471 +-0.0105486 0.0921685 -0.035821 +-0.0292627 0.125707 0.0105611 +-0.0740612 0.16798 -0.0430295 +-0.0794475 0.0732175 0.0216948 +-0.0525459 0.0430871 -0.00935537 +-0.0275149 0.0591111 -0.027433 +-0.0608279 0.0910686 -0.0191968 +0.0214831 0.0388585 0.0402401 +-0.0185078 0.0382343 0.0205228 +-0.0193476 0.0973552 -0.0251961 +-0.014626 0.03858 -0.00263697 +0.0364765 0.110061 0.0246179 +0.0394879 0.0499122 0.0322705 +-0.0738314 0.151256 -0.033887 +-0.0276072 0.0488225 -0.0246209 +0.0254616 0.0727112 0.0456024 +-0.054118 0.157553 -0.00229988 +-0.0100751 0.129607 0.0204184 +-0.0507271 0.115538 0.0335799 +-0.064203 0.176904 -0.0544031 +-0.0327997 0.0624741 -0.0154176 +-0.050486 0.0585567 0.0325562 +-0.0115057 0.0716604 0.0558672 +-0.041271 0.0338554 -0.00188008 +0.00149737 0.0969588 -0.0286791 +0.0222207 0.0833264 -0.0261432 +-0.0379669 0.0433397 0.0417712 +0.0433566 0.094461 -0.000803958 +-0.0485055 0.0490796 0.0381424 +-0.0398915 0.109923 -0.0189257 +-0.00650042 0.0533369 0.0530605 +-0.0902689 0.112791 0.0182006 +-0.0256204 0.0436547 -0.0287136 +-0.0432877 0.171276 -0.00598005 +0.00651867 0.0674599 0.0552944 +0.00755739 0.101711 0.046537 +0.0201484 0.0899648 -0.02526 +0.00621941 0.0351341 0.00654928 +-0.0641258 0.0611318 0.00140431 +-0.0841699 0.0979316 0.0296062 +-0.0893171 0.151601 0.0194969 +-0.0509112 0.0517382 0.0331779 +-0.0345095 0.0761212 0.0417709 +-0.0210879 0.0852798 0.0561484 +-0.0647084 0.033787 -0.00655215 +0.0485032 0.0638048 0.0293893 +0.0553414 0.0563023 0.000211666 +0.031191 0.0977616 -0.015509 +-0.0271419 0.168228 -0.0179326 +-0.0594934 0.0832968 0.0436941 +0.00712427 0.107292 -0.0202517 +-0.0670075 0.139964 -0.00790796 +-0.072631 0.169409 -0.0470274 +-0.0668128 0.0894987 -0.0177562 +-0.0638648 0.166212 -0.0336016 +-0.0305285 0.0348948 0.0458677 +-0.07494 0.0707543 0.0282709 +0.0217204 0.105135 -0.0173432 +0.0129112 0.111627 -0.0182976 +-0.0346615 0.0395406 0.0484261 +-0.0244963 0.105758 0.0419767 +-0.0275166 0.057436 0.037149 +-0.071563 0.151347 -0.0436244 +-0.00477478 0.0812297 -0.0373809 +-0.0544968 0.108447 0.0390956 +0.0191276 0.0370481 -0.0116797 +-0.0477678 0.125154 -0.0082648 +0.00907863 0.112423 -0.0191367 +-0.0148223 0.129108 0.012888 +-0.0685095 0.148391 0.0402581 +0.0438124 0.093116 0.0231537 +-0.0295173 0.175738 -0.0052542 +-0.0580932 0.155356 0.0200663 +-0.0140302 0.116852 -0.0157862 +-0.00427283 0.034883 0.0462122 +-0.0365117 0.0860935 0.0436284 +0.0428337 0.0789534 -0.0047828 +0.0143759 0.121374 -0.0108038 +-0.0478629 0.0335429 0.00613354 +0.0399096 0.0632641 -0.00677014 +0.0382182 0.0855917 -0.0147556 +-0.0586226 0.156199 0.00971481 +-0.0768739 0.0698402 0.0216311 +0.0359859 0.0660034 0.0379002 +-0.0517494 0.0782459 -0.0193853 +-0.0836382 0.0870656 -0.00453769 +0.0314216 0.0415146 -0.00377022 +-0.0633942 0.159878 -0.0495887 +-0.0762229 0.149992 -0.0128764 +0.0360298 0.0573371 -0.00970954 +-0.0378631 0.100009 -0.0219618 +-0.0631703 0.172516 -0.0516045 +-0.0893681 0.0902559 0.0194368 +0.0559048 0.0631077 0.000905369 +0.00350533 0.0758855 0.0563752 +0.0327662 0.0475454 0.0312717 +-0.0144964 0.104421 0.0432413 +-0.0925078 0.121485 0.0292837 +-0.0225266 0.123574 -0.00478676 +0.027859 0.114683 -0.0075901 +0.0336358 0.0725575 -0.0168317 +0.0133955 0.0900754 0.0528858 +-0.0320964 0.160758 -0.0138294 +-0.0665218 0.173689 -0.0465659 +-0.0314315 0.062325 -0.0194293 +0.0355057 0.0498307 0.031489 +0.0409937 0.0830284 -0.00976566 +-0.0484259 0.152144 0.0105657 +-0.0760489 0.0702549 0.00053996 +-0.0939567 0.121435 0.0142863 +0.0458128 0.0848143 0.0141708 +-0.088753 0.130866 0.00325856 +-0.0762076 0.0680671 0.0162505 +0.0295583 0.0594698 -0.0188239 +-0.0470685 0.0362699 0.0454096 +0.0515085 0.0678015 0.0264788 +0.0229945 0.0535474 0.0436214 +0.0102584 0.0738736 -0.0323425 +-0.0208293 0.0841002 -0.0385977 +0.013479 0.118711 -0.0139326 +-0.0577142 0.0723919 -0.0167433 +0.0343469 0.0740244 -0.0157906 +-0.0384895 0.050603 0.0393394 +-0.0411819 0.166655 -0.0111213 +-0.0314187 0.0525029 -0.0133876 +-0.0530781 0.119794 0.0354828 +0.0402398 0.0815675 -0.0107641 +-0.0334936 0.0817447 0.0419617 +-0.0284374 0.0381394 0.00411543 +-0.0669412 0.126769 -0.00883964 +-0.089797 0.129515 0.00524651 +-0.0607661 0.0796035 -0.0191344 +-0.0878523 0.0860961 0.00747941 +-0.00447426 0.0385132 0.0213354 +0.0222429 0.0463236 0.0406841 +-0.0167958 0.0799195 -0.0388883 +-0.0714505 0.16941 -0.0490283 +-0.00251639 0.0442645 0.0466529 +-0.0648891 0.0981501 -0.0170112 +0.00754987 0.100371 0.0472771 +-0.0694963 0.16803 -0.0520069 +-0.0920162 0.126943 0.0352547 +0.0233968 0.0355618 0.0133136 +-0.0660161 0.169448 -0.0590294 +-0.0555411 0.128344 0.0372391 +-0.0488244 0.0927169 -0.0215945 +0.0343104 0.114465 0.0209626 +-0.0501985 0.140132 0.0173988 +-0.0658096 0.0445087 0.000718728 +-0.0512856 0.136981 0.000438627 +-0.0269157 0.0703179 -0.0345192 +-0.0636699 0.112355 0.0376208 +-0.0754912 0.144221 0.0449451 +-0.062524 0.167829 -0.0475902 +0.030542 0.0511254 -0.0127382 +-0.0237052 0.0596068 -0.0321069 +-0.0547922 0.153188 0.0241866 +-0.0414961 0.0902351 0.0425692 +-0.0494981 0.0477699 0.0395132 +0.0289271 0.110086 0.0349831 +-0.0402206 0.0433137 -0.0233156 +-0.0246897 0.0560336 -0.0294195 +0.00733033 0.058195 -0.0305865 +-0.0633574 0.155908 0.0123853 +-0.0679376 0.162368 -0.0549778 +-0.0588165 0.0667309 0.0351477 +-0.0598716 0.0453976 -0.00333599 +-0.0238165 0.0812337 -0.0381734 +-0.047565 0.0370224 -0.0142792 +-0.010699 0.104948 -0.0231645 +0.0375184 0.0915609 -0.0128884 +-0.056974 0.0573893 0.011763 +-0.00401542 0.033994 -0.0206047 +0.0133173 0.0638081 -0.0300932 +-0.0402517 0.127178 -0.0024642 +0.00549546 0.0489597 0.051102 +-0.0755445 0.0668624 0.00857418 +-0.0465015 0.0643139 0.0383309 +0.00586085 0.130491 0.00185259 +-0.00908444 0.0392597 0.0359512 +-0.0724815 0.0696506 0.0297377 +-0.0588318 0.146817 0.0344225 +-0.0460118 0.126697 0.0245216 +-0.044079 0.0336811 -0.000461832 +-0.0565021 0.0946206 0.04473 +-0.0615844 0.155311 -0.0225818 +-0.0650869 0.155169 -0.00713868 +-0.089472 0.092961 0.0204149 +-0.0824758 0.0764829 0.0200121 +0.0429803 0.0916104 -0.003806 +-0.0914285 0.144743 0.0221537 +0.00329581 0.06408 -0.0335736 +-0.0554437 0.158541 0.0079523 +-0.0624977 0.0789785 0.042462 +0.00538842 0.0383711 -0.011506 +-0.0682947 0.162375 -0.0539731 +-0.0809901 0.135346 -0.00326263 +-0.0418435 0.0928469 -0.022966 +-0.0664939 0.0917254 0.0436166 +-0.0741328 0.170753 -0.0306566 +0.00842498 0.094018 -0.0295425 +-0.00912603 0.126983 -0.00460672 +-0.0144839 0.0911543 0.0563071 +-0.0247385 0.124904 0.000549003 +-0.064327 0.034541 0.0284972 +-0.0668589 0.156842 -0.00635476 +-0.0565065 0.0629707 0.0300974 +0.0567694 0.0522665 0.0211855 +0.0120332 0.0793354 0.0543348 +0.00749695 0.108523 0.0409368 +-0.0385157 0.0761871 0.0423388 +-0.0861163 0.11208 0.0430934 +-0.0554974 0.0776601 0.0434775 +-0.0519782 0.0531903 0.0286494 +0.00382899 0.0387567 -0.00467455 +-0.0437453 0.0348723 0.00757323 +-0.0876033 0.102265 0.00739801 +-0.0538689 0.152421 0.0214004 +0.0305964 0.0407785 0.0282841 +0.0465387 0.0750529 0.00819241 +-0.0664147 0.112558 0.0425241 +-0.0212669 0.123736 0.0252343 +-0.0144966 0.0485988 0.0478804 +-0.0270125 0.0891105 0.0478066 +-0.0328048 0.0886955 -0.0250147 +-0.0387676 0.0812185 -0.0204237 +-0.0179622 0.106228 -0.0225141 +-0.0121468 0.17267 -0.0267827 +-0.0155019 0.119619 0.0357771 +-0.0763961 0.0968047 0.0374195 +-0.00349611 0.0897823 0.0565938 +-0.0378917 0.0335733 -0.0268663 +-0.0464981 0.0451704 0.0419279 +0.0287219 0.115289 -0.00622497 +-0.0639806 0.135327 0.039077 +-0.045498 0.105695 0.0408472 +0.0546227 0.0668075 0.00110467 +-0.0690913 0.143 -0.0123014 +0.0356753 0.0619319 0.0374332 +-0.0141081 0.128922 0.00736661 +-0.0561495 0.0341243 0.0270787 +-0.038546 0.128369 0.00715642 +-0.0876142 0.116272 0.0465171 +-0.0722303 0.134063 0.0500963 +-0.0156039 0.0392636 -0.0272219 +-0.0361326 0.034299 0.0293707 +0.0285657 0.120967 0.00738594 +0.0111022 0.114226 -0.0170859 +-0.0218549 0.118022 -0.0129203 +0.0460721 0.0848306 0.00817735 +-0.0800935 0.138964 -0.00379173 +-0.0574953 0.0747475 0.0420563 +-0.00684325 0.130599 0.0100344 +0.020602 0.0768409 0.0509288 +0.0342103 0.0795441 0.0407378 +-0.0387822 0.0841715 -0.021953 +0.00854197 0.104373 0.044167 +0.0284181 0.0835438 0.0446794 +-0.0809789 0.0720684 0.0125422 +-0.0870329 0.152942 0.0187545 +0.0227098 0.105005 -0.0172062 +-0.0259693 0.156664 -0.00260696 +0.00630512 0.0970077 -0.026738 +-0.0293004 0.175699 -0.00559167 +-0.00764633 0.048167 -0.0303862 +-0.045682 0.0680577 -0.0156409 +-0.0545225 0.0645764 -0.00897215 +-0.0511988 0.137011 0.0243968 +-0.00714364 0.101607 -0.0236448 +0.00975279 0.123922 0.0333795 +-0.069363 0.163799 -0.0509746 +-0.000145407 0.0355938 -0.0156782 +0.0251101 0.0562501 -0.0227775 +0.047185 0.0692848 0.0242283 +-0.0610844 0.0335982 -0.00747508 +-0.0215973 0.0387212 -0.015323 +0.00621551 0.0824281 -0.0337654 +-0.0768656 0.120803 -0.0071099 +-0.072234 0.147352 -0.0242316 +-0.0251276 0.16525 -0.016804 +-0.00350994 0.110634 -0.0212045 +-0.051883 0.143128 0.0183637 +0.0388034 0.0687739 -0.0117998 +0.0522529 0.049588 0.0243549 +-0.0484974 0.0974063 0.0440017 +0.0292296 0.08295 -0.0208022 +0.0215976 0.121636 0.0305088 +-0.0576661 0.143885 0.0324483 +-0.062789 0.152113 -0.0295989 +-0.0686144 0.0632303 0.0220506 +-0.0812769 0.136213 -0.00276757 +-0.0898521 0.112924 0.020019 +0.0399617 0.0984844 -0.00581339 +-0.0197337 0.0627381 -0.0357065 +-0.0715197 0.0915892 0.0417662 +-0.0176796 0.037751 -0.0173923 +-0.0034931 0.0519852 0.0535284 +-0.0477302 0.0753108 -0.0175447 +-0.0720239 0.158203 -0.0389152 +0.012618 0.0562866 0.0514947 +-0.00341476 0.129699 0.000449344 +0.00761699 0.0345564 0.0219225 +0.0197796 0.101487 -0.0214363 +-0.0718751 0.150885 -0.0428436 +0.0226049 0.0994887 0.0451477 +-0.0275114 0.0379423 0.00991362 +0.0449899 0.0861501 0.00118902 +-0.0724942 0.0928706 0.0413391 +-0.0668563 0.151928 -0.044894 +-0.00758529 0.0395118 0.037828 +-0.0717266 0.143977 -0.0139286 +-0.0485566 0.0446478 -0.0101195 +-0.0498454 0.098516 -0.0220736 +-0.0687032 0.155739 0.000270534 +0.0305837 0.118921 0.00529549 +0.0181431 0.0408036 0.0434958 +-0.0644897 0.161538 -0.0184978 +-0.082117 0.127195 0.0520765 +0.0194801 0.0975854 0.0469408 +-0.0593004 0.0460479 0.0107053 +-0.051494 0.097382 0.0437255 +-0.0629042 0.151488 -0.0283316 +-0.0520794 0.132523 0.0317044 +-0.0086348 0.124041 -0.00947049 +-0.0408505 0.0971293 -0.022095 +-0.0501242 0.144161 0.00100252 +-0.0374501 0.127748 0.0031441 +-0.0242006 0.107431 -0.0217757 +-0.0185705 0.0597254 0.0501838 +0.0506634 0.0663167 -0.000433246 +-0.0778197 0.0981202 0.035968 +-0.0344836 0.0604651 0.0395531 +0.0141481 0.100268 -0.0227789 +-0.0201048 0.0920391 0.0535514 +0.0405223 0.0582848 0.0307512 +-0.0234669 0.126337 0.0156088 +-0.0879353 0.140547 0.0390784 +0.0495003 0.0691238 0.025332 +-0.0550177 0.034541 0.0409139 +-0.0558687 0.156831 -0.000812957 +-0.033113 0.162236 -0.0143657 +-0.0040053 0.127195 0.0298616 +0.00247063 0.0977635 0.0514765 +-0.0372934 0.126961 0.0179492 +0.00433485 0.120467 -0.0137766 +0.00930976 0.0595795 -0.0301167 +0.0437257 0.0902921 0.0241674 +-0.0363397 0.0344675 0.0327184 +0.000637516 0.0346318 0.0420689 +0.0283669 0.0563832 0.0408635 +-0.0890554 0.136524 0.0291987 +-0.0526322 0.0603614 -0.00917272 +-0.0555168 0.0610654 0.0262173 +-0.0398616 0.102806 -0.020798 +-0.0554959 0.0959795 0.0436611 +-0.0625279 0.0435825 0.012569 +-0.012539 0.0432081 0.0504383 +-0.0295399 0.0777526 0.042206 +0.0250153 0.0699448 0.0449142 +0.0418505 0.0929433 -0.00581175 +0.00749052 0.0923616 0.0534281 +-0.0508873 0.105589 -0.0194525 +-0.0577516 0.0752955 -0.0185275 +-0.0341251 0.166782 -0.00385534 +0.0204867 0.0961927 0.0470968 +-0.0860696 0.110951 0.0368762 +-0.0623929 0.0445563 0.039213 +0.0212831 0.0679005 -0.027755 +-0.0459741 0.03576 0.00812075 +-0.0128757 0.105895 -0.0226089 +-0.0713104 0.164383 -0.0152637 +-0.00570768 0.129479 0.0248833 +-0.0759611 0.0715461 -0.00349282 +-0.0154987 0.0485755 0.0476399 +-0.0271627 0.125166 0.0172175 +-0.052909 0.0559665 0.0126205 +0.0445771 0.0875296 0.0231612 +-0.0679602 0.132601 -0.00851511 +-0.0735016 0.14861 -0.0288774 +0.0321816 0.0968615 0.0396789 +-0.0617331 0.156868 -0.0205842 +-0.0310423 0.0467686 -0.0260418 +-0.0285615 0.0382432 0.0537594 +-0.0934477 0.121479 0.0262963 +-0.0220941 0.0710555 0.0505203 +-0.0299308 0.0348009 0.0443343 +-0.0161025 0.0382877 0.022773 +-0.0328698 0.101492 -0.0223548 +0.0454742 0.0412367 0.0106737 +-0.028101 0.0890412 0.0460663 +-0.0440047 0.127209 -0.00443148 +0.0593281 0.0649895 0.00613553 +0.0127896 0.130142 0.00867876 +0.0391468 0.0887707 0.0338836 +0.0223265 0.0535979 0.0444334 +-0.0897234 0.125377 0.0042981 +0.0287018 0.0447465 0.0341399 +-0.0924969 0.121493 0.0302824 +-0.0717492 0.0821807 -0.0161321 +-0.0756445 0.156326 -0.00458549 +0.00148921 0.104407 0.0433078 +-0.0361895 0.0355992 0.0192692 +-0.0662775 0.0734947 0.0382764 +-0.0730867 0.169281 -0.0259539 +-0.00640617 0.0386668 0.0262232 +-0.053287 0.0610602 0.0282137 +-0.0820828 0.0871799 0.032118 +-0.0474969 0.0477925 0.0396528 +0.0505278 0.0445977 0.0162148 +0.0314571 0.0378867 -6.50808e-05 +0.0244076 0.117212 -0.0083203 +0.0193833 0.052146 -0.0261511 +0.0213663 0.0593118 -0.0264401 +-0.0223265 0.0696009 0.0493961 +-0.0803036 0.100707 0.0327244 +0.0516025 0.0650498 -0.00116678 +-0.0572939 0.0597447 0.0223608 +0.0272121 0.088765 -0.0222319 +-0.0760712 0.152304 0.0343668 +0.0287584 0.0359201 0.00291435 +-0.00327774 0.125061 -0.00864173 +-0.0492123 0.134029 0.0252722 +-0.0157732 0.0799164 -0.0389165 +0.0137184 0.0699424 0.0531931 +0.0181521 0.124421 0.0277923 +0.0195548 0.127052 0.0182976 +-0.0788582 0.171448 -0.0399026 +-0.0820398 0.150272 0.03397 +0.0134064 0.0478115 -0.0258783 +-0.0637307 0.0344451 0.0269565 +0.00741391 0.0920665 -0.0315473 +0.0394368 0.0688303 -0.0107955 +-0.064416 0.154996 0.00586526 +-0.066663 0.144317 -0.015468 +0.0353499 0.042038 0.028119 +-0.00141558 0.03896 -0.0133998 +-0.0338581 0.0334994 -0.0260028 +0.0142608 0.0359816 -0.0203372 +-0.0776263 0.175005 -0.043567 +-0.0525965 0.0345626 0.0431188 +0.0335361 0.0372674 0.00265432 +0.0308902 0.0632769 0.0410591 +-0.0895335 0.144692 0.0121557 +-0.0612693 0.0337096 0.0122134 +-0.00661675 0.0976221 -0.0294208 +-0.0504448 0.128295 0.0323161 +-0.0571803 0.062383 0.0287138 +-0.0529076 0.136719 0.0287121 +-0.0247725 0.0390001 0.0365321 +-0.00277907 0.0769693 -0.0364873 +-0.0894255 0.0956236 0.0134235 +0.0183336 0.0566072 -0.0279953 +-0.0945117 0.124183 0.0222757 +-0.0670539 0.154574 0.0299913 +0.0377471 0.104052 -0.00484079 +-0.0277489 0.0877005 0.0471838 +-0.0465602 0.122394 -0.0114017 +0.0512982 0.0545874 -0.00353058 +-0.0255237 0.116678 0.0329121 +-0.0558854 0.0479468 0.0296668 +-0.0384602 0.127124 -0.00162988 +0.00941217 0.040392 -0.0233006 +-0.0788042 0.109939 0.0428886 +-0.00952807 0.0385271 0.0257083 +-0.0151514 0.041952 0.0515406 +-0.0896796 0.114349 0.0422656 +-0.0130415 0.0639857 0.0543784 +-0.0709434 0.168021 -0.0490096 +-0.042508 0.0562794 0.0398023 +-0.0723361 0.155599 0.00334302 +-0.0804662 0.0800422 -0.00555374 +-0.0320486 0.122707 -0.00572396 +0.0215589 0.120837 -0.00625561 +0.0181166 0.118416 -0.011621 +-0.0473179 0.0397941 -0.0120624 +-0.0797756 0.0706254 0.0155549 +0.00931098 0.130351 0.0216675 +-0.0082877 0.0388999 0.0310374 +-0.0475138 0.156385 0.00914965 +-0.000599084 0.0391028 -0.0250468 +-0.0114889 0.103024 0.0436761 +-0.0176179 0.0378672 -0.0275216 +-0.0423688 0.123346 -0.0104204 +-0.0387324 0.156611 0.00532643 +0.0047217 0.0940547 -0.0316305 +-0.0728512 0.152626 -0.0378881 +-0.00186255 0.103074 -0.0227526 +0.0529842 0.0692584 0.0249064 +-0.0792715 0.107765 0.0320009 +0.0324709 0.0353558 0.0097886 +-0.083008 0.154405 0.0171359 +0.0123335 0.0581189 -0.0294366 +-0.0570144 0.0335354 0.00427397 +-0.0520347 0.0349067 0.0446489 +0.0239781 0.084017 -0.0250643 +0.0450177 0.0875447 0.000184881 +-0.00260981 0.0434451 -0.0255195 +-0.00349422 0.0718336 0.0581766 +-0.0470698 0.154668 -0.0068409 +-0.0764224 0.152995 0.0327283 +-0.0382612 0.0345343 0.0375294 +-0.00240135 0.128537 0.0275513 +-0.0924704 0.117461 0.033305 +-0.0714888 0.127424 0.0521873 +-0.0439578 0.12961 0.0140149 +-0.0725837 0.0763091 -0.0123208 +-0.0595593 0.0341176 0.0246105 +-0.00343172 0.0385593 0.0215021 +0.0311358 0.0782102 0.04331 +-0.0494476 0.122586 0.0319364 +-0.0665119 0.0621274 0.0216726 +0.0544596 0.058178 0.0276568 +-0.0495972 0.118308 0.0316941 +-0.0314789 0.174225 -0.0034609 +-0.0728795 0.116451 -0.00740226 +0.00249754 0.108619 0.0424686 +0.0280724 0.0678498 -0.0217391 +-0.0278862 0.165359 -0.00713919 +-0.0117661 0.182389 -0.0287496 +-2.83383e-05 0.0370817 -0.0151505 +-0.0721646 0.155417 -0.0379087 +0.0297368 0.100819 0.0396604 +0.0224793 0.124852 0.00370943 +-0.0278708 0.104417 -0.0229648 +-0.0388092 0.0372561 -0.0289196 +0.0393949 0.0519685 -0.00680892 +-0.0114113 0.0387598 0.0305221 +-0.0668989 0.0372019 0.0312012 +-0.0634206 0.167809 -0.0425955 +-0.0738654 0.102167 -0.0123482 +0.000515293 0.09714 -0.0288497 +0.00321341 0.034575 0.0192003 +-0.0313524 0.158102 0.00192058 +-0.0879015 0.148743 0.00925863 +-0.0552908 0.158294 -0.000771282 +0.00144018 0.127924 -0.00374837 +-0.0374859 0.0491992 0.0393813 +0.0225251 0.100664 -0.0205487 +-0.0149527 0.0339242 -0.0208085 +0.00432828 0.0582523 -0.0314184 +0.0463488 0.0792498 0.00918224 +-0.0375014 0.105589 0.0387333 +-0.062506 0.149124 -0.0145611 +0.00329475 0.129383 -0.00133175 +-0.00689488 0.0384553 0.0136435 +-0.0384034 0.0343958 0.0323426 +-0.062465 0.163086 -0.0495893 +-0.0639661 0.0690471 0.0355624 +-0.0131121 0.0626059 0.0545133 +-0.0449324 0.0358062 0.00829108 +0.0406445 0.0871881 -0.0107716 +-0.0230795 0.0932192 0.0494322 +-0.0186385 0.0465274 -0.0284289 +-0.0571213 0.0576422 0.00058007 +-0.0705055 0.0343308 -0.00278598 +-0.0578994 0.112578 -0.0159728 +-0.0106785 0.0383169 0.0202432 +-0.0593417 0.119814 0.0404797 +-0.0505461 0.0403717 -0.011217 +-0.0453989 0.0342539 -0.0215146 +-0.011074 0.178648 -0.0249266 +-0.0523515 0.0582314 0.0273813 +-0.0254941 0.0486931 0.0489695 +0.0374187 0.0855245 -0.0157145 +0.0453002 0.0932088 0.00816687 +-0.0612769 0.133878 0.0377403 +0.00152786 0.0745369 0.0570999 +0.0245032 0.122816 0.00162459 +-0.00938967 0.130192 0.0162996 +-0.0703883 0.0339052 -0.000577152 +-0.0733601 0.156855 -0.0299134 +-0.0171472 0.166778 -0.0196136 +0.0116998 0.0819851 0.0538895 +-0.0502854 0.11522 -0.0158495 +0.050316 0.0546413 -0.00421167 +-0.0667548 0.115724 0.0491405 +-0.0609102 0.120922 -0.00906619 +-0.0866023 0.111811 0.0414218 +-0.0669546 0.128237 -0.00895731 +-0.0654028 0.177571 -0.0533847 +-0.0437352 0.0753785 -0.0184868 +-0.0329958 0.0793378 -0.0275102 +-0.00469334 0.101051 0.0441761 +-0.0137252 0.0671481 -0.0375067 +-0.0531289 0.138241 -0.000765665 +-0.0361236 0.163705 -0.0141169 +-0.0249029 0.0722756 0.0462509 +-0.0119797 0.0383916 0.0235247 +-0.0246067 0.157782 -0.00250374 +-0.0748771 0.109206 -0.00842538 +-0.0314894 0.0845774 0.0421902 +-0.0849159 0.123546 -0.00333555 +0.052731 0.0672551 0.000627241 +0.0453449 0.0710055 0.0220458 +-0.0665131 0.0419133 -0.00333369 +0.0194908 0.113962 0.0368661 +-0.0674148 0.142782 -0.0112266 +-0.0931203 0.121503 0.0403997 +-0.0084076 0.0932235 -0.0348708 +0.0125532 0.0900642 0.0534187 +0.0432399 0.0747788 -0.00379578 +0.00477967 0.130785 0.0214562 +0.0461172 0.0759623 0.0190037 +-0.0870553 0.118453 0.000244653 +0.00651257 0.056103 0.0529931 +-0.0623783 0.167824 -0.0485899 +-0.0258496 0.0864897 0.0509722 +0.0602482 0.0581464 0.0141691 +-0.0923082 0.120116 0.0282975 +0.00750533 0.0660627 0.0552439 +0.060666 0.0609482 0.0151682 +-0.0674289 0.114212 0.0481237 +-0.0514122 0.146842 -0.00193867 +-0.0768562 0.117877 -0.00659127 +-0.0825551 0.152911 0.00706582 +-0.0839745 0.0804809 0.0225006 +0.041166 0.0819934 0.0314416 +-0.0655442 0.155124 -0.0481259 +-0.0384965 0.0620329 0.0413169 +-0.0627141 0.159943 -0.0425974 +-0.0767176 0.159013 -0.0120318 +-0.0856607 0.0832001 0.00448541 +-0.0278526 0.181478 -0.0120494 +0.0114013 0.0419017 -0.0239008 +0.0243085 0.123343 0.00295625 +-0.0474528 0.119349 0.0293599 +-0.0304487 0.0334492 -0.0290445 +-0.0696417 0.0422524 0.0026904 +-0.0644028 0.146849 -0.019975 +0.0503218 0.0589081 -0.00447436 +0.0476236 0.0467222 0.0264254 +-0.0303554 0.117939 -0.0127791 +0.0338995 0.0591949 0.0383404 +-0.0746238 0.166812 -0.0222329 +-0.0186858 0.118957 -0.0119398 +0.0507854 0.0445928 0.0142166 +-0.0844285 0.0832425 0.0264792 +0.0593532 0.0636103 0.0211835 +-0.073524 0.16243 -0.0369561 +-0.0525841 0.0574366 -0.00812203 +0.0221795 0.040783 0.0405434 +0.0281375 0.0902298 0.0443276 +0.0214874 0.0892516 0.0486681 +-0.0702718 0.110271 0.0410027 +0.0386345 0.0753534 0.0347776 +-0.0646561 0.0344494 0.0319916 +-0.00663677 0.109707 -0.0221975 +-0.029185 0.0634891 -0.02746 +-0.0671416 0.145678 -0.0214457 +-0.0135214 0.0353632 -0.0181023 +-0.0376703 0.125135 -0.00632213 +0.0114179 0.0489704 0.047894 +-0.0923638 0.118682 0.00930083 +0.0483264 0.0430255 0.0152188 +0.00550628 0.0441375 0.0457857 +-0.0652333 0.0338884 0.0112389 +0.0482587 0.0460086 0.000382582 +0.0586626 0.0538435 0.0111779 +-0.000982862 0.0386959 0.0236934 +-0.0245147 0.119422 0.0312229 +-0.0155858 0.183111 -0.0209193 +-0.0867126 0.0819778 0.0134931 +-0.0785905 0.0980977 0.0353146 +-0.0907184 0.115992 0.0263684 +-0.0614986 0.158424 -0.0305881 +-0.090971 0.141997 0.0221703 +0.049023 0.0722611 0.00748575 +-0.0495658 0.0446328 -0.00989725 +0.000576288 0.0353387 0.0179719 +-0.00263978 0.131127 0.015882 +0.0260716 0.115341 -0.00830033 +-0.0571034 0.0535249 0.00264062 +-0.0471993 0.162132 -0.00733312 +-0.0750917 0.0664543 0.00723246 +-0.0617686 0.159987 -0.035592 +-0.0267825 0.079725 -0.0369434 +-0.061465 0.0438948 -0.0044823 +0.0457823 0.0862054 0.00618349 +-0.065804 0.0609905 0.0192925 +0.0197913 0.0781802 0.0515303 +0.0377275 0.0928421 0.0353087 +-0.0179367 0.12631 0.000372783 +0.0437374 0.0902563 -0.00280325 +-0.00792408 0.0384127 0.0189094 +0.0556221 0.0493651 0.00819776 +0.00641397 0.0375702 -0.0238447 +-0.0274537 0.0485303 0.0479606 +-0.0610187 0.152669 0.0336579 +-0.078775 0.170042 -0.0371202 +0.0527843 0.0462443 0.0112063 +0.0173793 0.0631583 0.049653 +-0.0359664 0.162375 -0.00125909 +-0.0559722 0.134715 -0.00446003 +-0.0484961 0.113915 0.0346796 +-0.00776872 0.0756191 -0.0375185 +-0.085947 0.104892 0.00437979 +-0.0866438 0.152376 0.0233632 +-0.0520552 0.0559741 0.0276222 +0.060777 0.0637293 0.0161648 +-0.0634196 0.15027 -0.0277557 +-0.0514307 0.12406 0.0344067 +-0.00747581 0.101243 0.0443796 +-0.0489909 0.133982 0.00241474 +-0.0174145 0.118412 -0.0133815 +0.0106556 0.0345311 0.0225637 +0.0207029 0.0950845 -0.0226908 +-0.000596635 0.0433605 -0.0249736 +-0.0628762 0.0967673 -0.0179048 +0.0102648 0.0752773 0.0552991 +-0.0281556 0.17562 -0.0175208 +-0.00541266 0.130784 0.0163058 +-0.0708319 0.0345819 -0.00103676 +-0.0204551 0.0879984 0.0554627 +-0.0640233 0.0347562 0.0388023 +-0.0255632 0.0589456 -0.0304089 +-0.0856596 0.0858717 -0.000523015 +0.000533962 0.0773889 0.0579724 +-0.0911932 0.147489 0.0241289 +-0.0536699 0.0338623 0.0207675 +-0.0330023 0.0807475 -0.0275162 +-0.0598207 0.148547 -0.00150215 +-0.0292722 0.116973 -0.0137779 +0.0389134 0.0603588 -0.00677348 +0.00149281 0.111426 0.0424095 +-0.0567184 0.0723883 -0.016755 +-0.0557727 0.0333786 -0.00437552 +-0.0514926 0.0503999 0.033682 +-0.00426203 0.129106 -0.000929037 +0.0209419 0.0535563 0.0459234 +-0.0665114 0.0931036 0.0430214 +-0.0313926 0.112895 -0.0174931 +-0.0358232 0.127618 0.00522677 +-0.0126066 0.128516 0.0224096 +0.0435838 0.0705579 0.0258591 +-0.00308793 0.0379842 0.0148477 +-0.0348769 0.105695 -0.0204457 +-0.0787914 0.0724652 0.0224838 +0.022277 0.0678419 -0.0269851 +0.021809 0.1242 0.000142479 +0.00528322 0.0682375 -0.0327226 +-0.0813944 0.0817284 0.031574 +0.0109283 0.0616839 0.0526314 +-0.0233033 0.0429927 0.0537933 +0.0135067 0.1196 0.0353985 +-0.0856435 0.0805169 0.00650219 +-0.0555634 0.0386377 0.0471443 +-0.0925953 0.129683 0.0262582 +-0.0908852 0.150208 0.0181276 +0.0274474 0.0591653 0.0430806 +-0.0143101 0.113201 -0.0178955 +-0.0695125 0.145609 0.0428052 +0.002489 0.103843 -0.0219556 +0.034067 0.0981569 0.0371457 +-0.0663951 0.140334 -0.00790584 +-0.0462961 0.162745 -0.00789878 +0.0286561 0.108194 -0.012625 +-0.0852651 0.14863 0.0333956 +-0.0290693 0.0677067 -0.0294879 +0.0414097 0.104256 0.00616512 +-0.0693963 0.0393871 -0.00132267 +0.0255358 0.0435625 -0.00763706 +0.0562825 0.0508178 0.0201866 +-0.0867977 0.144597 0.036443 +-0.0252829 0.0751884 0.0479421 +-0.0224834 0.0681349 0.0481925 +0.0575606 0.0537805 0.0213286 +0.00845802 0.129083 -0.00108013 +0.0113649 0.0538487 -0.0294289 +-0.0501252 0.138572 0.00341268 +-0.074971 0.152728 -0.0179063 +-0.0312043 0.0422041 -0.0297469 +-0.0846068 0.0791109 0.00453817 +-0.0536323 0.0602894 -0.00841331 +-0.0171387 0.171259 -0.0162017 +0.0409378 0.0397959 0.0185201 +-0.0781974 0.153502 0.00273811 +-0.0824089 0.107319 0.0275588 +-0.0723216 0.169832 -0.0271166 +-0.0716176 0.109058 0.0379622 +0.000146179 0.101649 -0.0227639 +-0.0522094 0.0517797 0.0246371 +0.0118426 0.0562933 0.0521284 +-0.0625131 0.11843 0.0430565 +0.00861514 0.0345206 0.0221572 +0.0244049 0.0741131 0.0475942 +0.00453562 0.128718 -0.00265628 +0.0138565 0.129875 0.0119166 +-0.070378 0.149076 -0.0386493 +0.0445575 0.0847276 0.0241575 +-0.0157056 0.0599572 -0.0358177 +-0.0558806 0.154815 0.016521 +0.000379078 0.127909 -0.00372478 +0.0266539 0.122169 0.0209401 +-0.0679962 0.167786 -0.0255431 +-0.0920426 0.126958 0.0362532 +-0.0594207 0.0398239 0.0196241 +0.0364837 0.0469104 0.0311466 +-0.0568261 0.139571 0.0318926 +-0.053019 0.141421 -0.000504477 +0.0435234 0.0433666 0.0249665 +-0.0277895 0.06758 -0.0314768 +0.0362342 0.0398741 0.0247937 +-0.0212837 0.0381384 0.0164325 +0.0257555 0.0994695 0.0426751 +0.0399676 0.101315 -0.00381805 +-0.0152962 0.0433291 0.0513434 +0.0573469 0.0674291 0.0231143 +-0.0520755 0.0475411 0.0216528 +0.0328365 0.0876935 -0.0188869 +0.0143568 0.0522918 -0.0274834 +-0.0725069 0.145589 0.0436497 +0.00651279 0.0647152 0.0557475 +0.00953758 0.128186 0.0275085 +-0.052193 0.119749 -0.012566 +-0.0686715 0.165205 -0.0529941 +-0.0896326 0.092928 0.0134378 +0.0289756 0.116666 0.0289439 +-0.0642519 0.118577 0.0476092 +-0.0257723 0.182903 -0.0115399 +-0.0844232 0.100698 -0.00156743 +-0.0206629 0.0479548 -0.0285983 +-0.0532393 0.0448331 0.0206817 +0.00230145 0.0612209 -0.0331693 +0.020878 0.117607 -0.0107498 +-0.0818428 0.103274 -0.0045788 +-0.0184976 0.101625 0.0435583 +-0.0305 0.0674574 0.0390127 +-0.0485029 0.0452121 0.0424266 +-0.0929791 0.124188 0.0282747 +-0.0302252 0.0523701 -0.0173649 +0.00350969 0.0897377 0.0556751 +-0.0219245 0.161037 -0.00376903 +-0.0619129 0.0458194 0.037691 +-0.00376935 0.0769928 -0.0369082 +0.0411698 0.0806497 0.0314486 +-0.0115592 0.100495 0.0448823 +-0.063251 0.15135 -0.00497603 +-0.0271171 0.059077 -0.028426 +0.0053978 0.0390279 -0.0240405 +-0.0676491 0.065582 -0.00407795 +-0.063925 0.0448804 0.0097039 +-0.00969446 0.0598719 -0.0345693 +-0.0860777 0.110355 0.00735249 +-0.0152136 0.174214 -0.0186712 +0.00434041 0.0596672 -0.031584 +0.0213842 0.125707 0.00472943 +-0.0835093 0.13127 0.0505027 +0.0165672 0.128654 0.015768 +0.0285444 0.0459645 -0.0070843 +-0.0721129 0.15894 -0.00533295 +-0.0525858 0.147787 0.0204037 +-0.0465092 0.0776139 0.042786 +-0.00623267 0.10133 -0.0233757 +0.0572046 0.0564633 0.00317356 +-0.0122436 0.112093 -0.0187249 +0.00624351 0.0810351 -0.0338384 +0.0462734 0.0764388 0.00619417 +-0.0168246 0.0855538 -0.0389836 +-0.0869607 0.111738 0.00633151 +-0.0370469 0.152854 -0.00726744 +0.0405338 0.105622 0.0141627 +-0.0164738 0.10119 0.0439603 +-0.0854876 0.0791977 0.0105097 +0.0272664 0.0760665 -0.0234764 +-0.0438604 0.102816 -0.0213031 +0.00350403 0.0533854 0.0535456 +0.0169167 0.127898 0.0201801 +0.0184941 0.0838333 0.0510457 +-0.00847869 0.123725 0.0338017 +0.0387498 0.0659721 -0.0107606 +-0.0437917 0.0422818 -0.0193111 +-0.0126098 0.0384695 0.0251301 +0.0135799 0.0887495 0.0531421 +0.00935699 0.131232 0.0131197 +0.0135065 0.109861 0.0400106 +-0.0850182 0.0831804 0.00149618 +-0.0740846 0.0657329 0.0152043 +-0.0265661 0.0706408 0.0422848 +-0.0847398 0.106178 0.00238203 +-0.0345218 0.0818067 0.0425242 +-0.0428232 0.12861 0.00263817 +0.0121427 0.100268 -0.0226753 +0.0447259 0.0749152 0.000215102 +0.0232974 0.0648673 -0.0252072 +-0.0822784 0.0951136 -0.0065238 +-0.0614844 0.158425 -0.031588 +-0.0521163 0.12407 0.0351298 +-0.0424777 0.104302 0.0409096 +-0.00407779 0.0345848 -0.0173958 +-0.0284243 0.0487716 0.0462084 +-0.0184625 0.0729785 0.0545802 +-0.015609 0.128774 0.0111587 +-0.0694586 0.153877 0.0321166 +-0.0484639 0.149215 0.0104667 +-0.0526002 0.146245 0.0194042 +-0.0263327 0.111444 -0.0179843 +-0.0331847 0.0445939 -0.0279862 +-0.0538972 0.104145 -0.0195691 +-0.0294956 0.124519 0.0193203 +0.0346714 0.0916012 0.0397133 +-0.0247788 0.0379568 0.0140716 +-0.0643494 0.153359 -0.00540282 +-0.00557634 0.0347311 -0.0241073 +-0.0258097 0.0766327 0.0484243 +-0.00867178 0.0387364 -0.0146344 +-0.0783855 0.0873596 0.0368663 +-0.0346878 0.0651683 -0.0148251 +0.0404983 0.0499404 0.0324741 +-0.0738591 0.0964804 -0.0142486 +0.0267717 0.107644 -0.0140409 +-0.0404701 0.104257 0.0399236 +-0.0381489 0.0448685 -0.0242105 +-0.0095211 0.045789 0.0480158 +-0.0311715 0.171175 -0.0164295 +-0.0695038 0.173637 -0.0418473 +-0.0823392 0.111551 0.0443764 +-0.0227424 0.0655154 -0.0353045 +-0.0508568 0.0999518 -0.0219402 +-0.0589296 0.1241 0.041105 +0.000488727 0.108629 0.0427903 +-0.0412638 0.110187 -0.018624 +-0.0147098 0.0613984 -0.0362354 +0.0459347 0.0413813 0.0124396 +0.00323976 0.128177 0.0281353 +-0.0743879 0.143042 -0.00684484 +-0.0264004 0.0577755 0.0382862 +-0.00692431 0.038377 0.0191445 +-0.0864209 0.080641 0.0154973 +-0.077237 0.0721326 0.0266059 +-0.0686311 0.136892 0.0464956 +-0.0792347 0.153789 0.0287725 +-0.0537819 0.0840761 -0.0215562 +-0.0117053 0.0909225 -0.0365538 +0.0365178 0.0541167 0.0317039 +-0.0616584 0.114654 -0.0131207 +0.0390548 0.0884875 -0.0128108 +-0.0887111 0.101017 0.0193703 +0.0162822 0.0666125 -0.0295206 +-0.064714 0.0600149 0.00783247 +-0.0175786 0.180143 -0.0185198 +-0.0408442 0.152602 -0.00723164 +0.0352097 0.0379704 0.0208298 +-0.0618294 0.0342021 0.0275686 +0.0185142 0.0412688 -0.0207398 +-0.0195264 0.159643 -0.00556617 +0.0318624 0.0768516 0.0425881 +0.0347681 0.0641816 -0.0148052 +-0.0479777 0.147732 0.00938552 +-0.0126851 0.0570335 -0.0344182 +0.00495057 0.130435 0.00152594 +-0.0486835 0.0664435 -0.0136416 +-0.0356438 0.0562686 -0.010631 +-0.084499 0.088474 -0.00355332 +-0.0503848 0.141583 0.00270968 +-0.0858587 0.125737 0.0487678 +-0.0426772 0.14763 -0.000244299 +-0.0378831 0.156583 0.00477982 +0.00350659 0.0388434 0.0262887 +-0.0887855 0.102363 0.0143842 +-0.0646755 0.142507 0.0398915 +-0.0909161 0.13091 0.00724248 +-0.055962 0.0343325 0.0321978 +-0.0723047 0.162425 -0.0409479 +-0.0696851 0.11012 0.0394623 +-0.083003 0.0803028 0.000504056 +0.0247589 0.0435818 0.039017 +-0.0218764 0.182954 -0.0200262 +0.0236525 0.124901 0.0169603 +0.0463445 0.0561751 -0.00589814 +-0.0218308 0.117001 -0.0138605 +-0.0747558 0.067415 0.00253432 +-0.0625552 0.176839 -0.0611671 +-0.0660641 0.0384249 0.0148213 +-0.000107958 0.12991 0.000141982 +-0.054081 0.071101 0.0394438 +-0.00558231 0.0361988 -0.024956 +-0.0684451 0.117201 0.0519481 +0.0333957 0.0461492 -0.00598528 +-0.0146115 0.03779 -0.0266447 +0.00133195 0.0385877 -0.00128958 +-0.0348901 0.0738831 -0.020486 +0.0373363 0.105992 0.0277645 +0.0084546 0.131034 0.0184964 +-0.0324996 0.0498708 0.0403614 +-0.0444999 0.0719382 0.0422118 +0.0369643 0.0405549 -0.00158789 +-0.0354954 0.0733233 0.0419636 +-0.0457735 0.0826328 -0.0207974 +0.00732527 0.0595899 -0.0304419 +-0.0874242 0.111776 0.00733879 +-0.0592783 0.115234 -0.0137669 +-0.0928043 0.11882 0.0332998 +-0.0116325 0.0385039 0.00355749 +-0.0398903 0.0344806 0.00870734 +-0.0722375 0.138308 0.048356 +0.0262204 0.0344897 0.0111735 +-0.0200589 0.0348282 0.0498878 +-0.0246346 0.0382795 0.00294393 +-0.0889887 0.147168 0.0287003 +-0.0574968 0.1584 0.00209189 +-0.0329778 0.0448862 0.0466174 +-0.0605914 0.0623502 0.0262507 +-0.0785506 0.0699758 0.0176232 +-0.0362833 0.17342 -0.00108904 +-0.0627087 0.161508 -0.0465953 +-0.0397898 0.0855606 -0.0217035 +-0.0064056 0.10047 0.0472751 +-0.0646908 0.166411 -0.0300665 +-0.0508247 0.0941547 -0.0216781 +0.00716942 0.125754 -0.00749941 +0.000702847 0.0392103 -0.00758345 +-0.0407154 0.0462046 -0.018322 +-0.0401921 0.166668 -0.0117758 +0.0124864 0.11785 -0.0149995 +-0.0887986 0.114294 0.0264066 +-0.0614886 0.156862 -0.0235899 +0.0301602 0.0673157 0.0417954 +-0.0697061 0.156309 0.0202886 +0.0512708 0.0700979 0.0242688 +-0.00208274 0.0390983 0.0321346 +-0.091649 0.146116 0.0221478 +-0.0423664 0.0392174 0.0434612 +-0.0288487 0.0944704 -0.0247187 +-0.0724483 0.148649 -0.034807 +0.0270658 0.12207 0.0196667 +-0.0370838 0.159234 -0.0122889 +-0.00750248 0.0619634 0.0561006 +-0.0533112 0.162693 5.53048e-05 +-0.00276518 0.0755391 -0.036261 +-0.0186814 0.0539839 -0.0321072 +-0.0875792 0.134961 0.00324767 +0.0120758 0.0363869 0.044646 +-0.0753955 0.0901087 0.0394375 +0.0338247 0.108829 -0.00728203 +-0.0444976 0.0789577 0.0421738 +0.0235632 0.0862591 0.0483322 +0.0465947 0.0750442 0.0151558 +-0.0733825 0.135448 0.0501828 +-0.0150618 0.0383341 0.0229424 +-0.00891681 0.0351082 0.0414685 +0.0315143 0.0525771 -0.0117816 +0.045527 0.0791773 0.00219591 +-0.0464963 0.076159 0.0423522 +-0.0708979 0.122353 -0.00862039 +-0.08595 0.110378 0.0213654 +-0.0783775 0.103446 0.0335489 +-0.0758029 0.111217 -0.00664466 +-0.0554837 0.0805968 0.0447827 +-0.0353516 0.166776 -0.00214363 +0.0562979 0.0633024 0.00123284 +0.0465716 0.0440008 0.0231655 +-0.0476369 0.0591928 -0.0118235 +-0.0288774 0.169748 -0.00856256 +0.0153133 0.121135 -0.0105519 +-0.0397313 0.072486 -0.017441 +-0.016397 0.0337307 -0.02279 +0.0603039 0.0650788 0.0091381 +-0.0878637 0.152463 0.0169978 +-0.0754938 0.127441 0.0530403 +-0.067202 0.162346 -0.0569974 +-0.0865386 0.147279 0.0332936 +-0.0535025 0.0440354 0.0449405 +-0.0735938 0.149845 -0.0348818 +-0.0728566 0.162156 -0.0114327 +0.0495045 0.0651553 0.0285253 +0.012555 0.130318 0.0128667 +0.0220735 0.113988 0.0356074 +0.0224569 0.125562 0.0179459 +-0.0810243 0.0936828 -0.00856919 +-0.0756675 0.155622 -0.00260296 +-0.0431622 0.0422126 -0.0213185 +-0.000694781 0.0597985 -0.0333207 +0.0271246 0.0849281 0.0463473 +0.0173609 0.0897252 -0.0270298 +-0.0358944 0.0334964 -0.0263993 +-0.0576531 0.0612704 -0.00372094 +-0.00707611 0.0386628 0.0278929 +-0.0560526 0.151627 -0.00172465 +-0.030326 0.045 0.0496314 +-0.00103499 0.117326 -0.0163697 +-0.0252491 0.162472 -0.00507229 +0.00208806 0.113117 -0.0199282 +-0.0939 0.124133 0.015262 +-0.0129795 0.0384272 0.0232864 +0.00120237 0.0867098 -0.0346725 +0.0353317 0.112044 0.0241962 +0.00450167 0.0459455 0.0484199 +-0.0863511 0.0872693 0.000483167 +-0.0164554 0.0963571 0.0512639 +0.0121283 0.11013 -0.0187853 +-0.0778795 0.103388 -0.00866618 +0.0245137 0.102392 -0.0184072 +0.0201875 0.0974057 -0.022456 +-0.0168907 0.0921233 -0.0358082 +-0.0691832 0.153837 -0.0495596 +0.0155185 0.129225 0.0096832 +-0.00814574 0.0386661 0.000442505 +-0.0927289 0.125458 0.0102641 +-0.0846445 0.0832051 0.023501 +-0.0527541 0.0782706 -0.0196088 +-0.0206459 0.171255 -0.0142383 +0.0273486 0.110085 0.0362063 +-0.0144833 0.105825 0.0431811 +-0.0295885 0.120405 -0.00932945 +-0.0914492 0.117418 0.0293041 +-0.0259115 0.159753 -0.0130913 +-0.0498456 0.123179 -0.0101809 +0.0474532 0.047084 -0.00164907 +0.0201466 0.0658754 0.0483972 +-0.0546819 0.0486825 0.0116705 +0.0366139 0.0573407 -0.00875458 +0.016382 0.0888799 -0.0281622 +-0.0128318 0.0653357 0.0541739 +-0.0495043 0.073253 0.0416255 +0.0380257 0.084795 0.0357219 +-0.055962 0.148162 0.0296522 +-0.00335679 0.11693 -0.0159223 +-0.0164885 0.0382449 0.0155037 +-0.0943085 0.12145 0.0162821 +-0.0604949 0.104288 0.0411949 +-0.0485787 0.153602 0.0103738 +0.0214629 0.119376 0.0329783 +-0.00921964 0.0390042 -0.0131222 +0.046038 0.044353 0.0245911 +0.00963825 0.115048 0.0386641 +-0.077742 0.161125 -0.0199262 +-0.0274983 0.0932247 0.0447643 +-0.0237144 0.062529 -0.0332478 +0.0256802 0.0685786 0.0440967 +-0.000627469 0.039269 0.0340794 +0.0387649 0.0834441 0.0350467 +-0.0144799 0.123658 0.0314246 +-0.0415001 0.0733705 0.042415 +0.0543119 0.0722872 0.00750454 +-0.0799536 0.133905 -0.00443135 +-0.0728995 0.10646 -0.0108772 +0.0465866 0.0714909 0.00427537 +-0.0734754 0.158245 -0.0309204 +-0.0217961 0.0784868 -0.0389208 +0.0328256 0.0611992 -0.0167775 +-0.00849082 0.119665 0.0373867 +-0.0345047 0.106995 0.0387065 +-0.0624367 0.153758 -0.0135798 +0.0343704 0.104711 0.0323207 +-0.0583832 0.0335298 0.00219999 +0.0202943 0.113982 0.0365633 +0.0149493 0.0344805 -0.015521 +0.0238985 0.104719 0.0399907 +-0.0270163 0.155641 -0.00359794 +-0.0207265 0.111071 -0.0196229 +0.00439792 0.0404664 -0.024069 +-0.0314988 0.165308 -0.00534483 +-0.0506374 0.0334455 0.00204379 +-0.0518913 0.130385 -0.00375074 +0.00347876 0.039945 0.0459765 +-0.0174912 0.108558 0.0415716 +-0.0618685 0.158412 -0.0345942 +-0.0509699 0.122064 -0.0109984 +-0.0801245 0.0746668 0.000525034 +0.0485976 0.0429932 0.0132228 +0.0202555 0.0707617 -0.0282449 +-0.086473 0.130788 0.000288786 +-0.0859798 0.13928 0.042828 +-0.0419021 0.157999 0.00424081 +0.0301266 0.0646197 0.0417292 +-0.0241332 0.0349697 0.043675 +-0.0554996 0.0466308 0.0421953 +0.0244135 0.114257 -0.0111426 +-0.0687634 0.168362 -0.025835 +-0.0212185 0.178615 -0.022031 +0.0451425 0.0775553 0.0229667 +0.0084768 0.116844 0.0380952 +-0.0619218 0.112503 -0.0143567 +0.0015045 0.0661578 0.0563313 +-0.0473123 0.0369901 -0.0152765 +0.0576745 0.0551294 0.00518333 +-0.0736262 0.148585 -0.0238576 +0.055706 0.0507437 0.0211984 +0.0038008 0.130941 0.0210967 +-0.0360463 0.0347343 0.0430826 +-0.0865396 0.139093 0.00420465 +-0.000664914 0.0539666 -0.0309917 +-0.0785368 0.0694183 0.0145853 +-0.0521695 0.144678 0.0173655 +0.0205519 0.0414936 -0.0177079 +-0.0764027 0.109871 -0.00664525 +-0.0455151 0.0533187 0.0381544 +-0.010362 0.0388675 -0.00761727 +-0.0465826 0.121367 -0.0123258 +0.060067 0.0636708 0.0191758 +-0.0214848 0.0347602 0.0479269 +0.0295458 0.115836 -0.00482165 +0.0188031 0.106638 -0.0169667 +-0.00873489 0.068452 -0.036144 +-0.0504955 0.0733248 0.0417999 +0.00250961 0.101617 0.0444387 +-0.0134598 0.0645734 0.0539775 +-0.0304851 0.038633 -0.015152 +-0.00443456 0.111901 -0.0205597 +-0.038606 0.0392918 -0.0284798 +-0.022624 0.0450535 -0.0281102 +0.0262273 0.117277 0.0307934 +0.0282585 0.063629 -0.0207965 +-0.0649158 0.115218 -0.010913 +-0.0197994 0.0799106 -0.0390737 +-0.042508 0.0930307 0.0424902 +-0.0683794 0.0434664 0.00169373 +-0.0648724 0.131147 0.0430922 +-0.00487539 0.105927 -0.0225105 +-0.0678583 0.112732 0.0457592 +0.00821621 0.124741 -0.00840458 +-0.0564446 0.0520481 -0.00138381 +-0.020896 0.107686 -0.0220438 +-0.0919111 0.120015 0.00829626 +-0.0188214 0.0841215 -0.0388306 +-0.00848834 0.10866 0.0434392 +-0.0674721 0.0639504 -0.00252382 +-0.0321962 0.0487152 0.0429222 +0.0422051 0.0972089 -0.00180239 +-0.0312857 0.125233 0.0186818 +0.0348151 0.0605689 0.0379285 +-0.07566 0.1555 -0.0199215 +-0.0582195 0.03947 0.0465299 +-0.0144966 0.0687907 0.0546395 +-0.0630713 0.173863 -0.0616798 +0.0398379 0.0874103 0.0331324 +0.0167269 0.0821369 0.052401 +0.0403742 0.101353 -0.00282827 +-0.0622911 0.150653 -0.0125749 +-0.0707931 0.0879477 -0.0165704 +0.048521 0.043083 0.00923259 +0.0132697 0.0603324 0.0507028 +-0.0230427 0.038006 0.0179945 +0.0585617 0.0538351 0.0161785 +-0.0548868 0.108372 -0.0183778 +-0.0712698 0.156094 0.0241098 +-0.0053845 0.126096 -0.00772897 +-0.076026 0.151346 0.0359505 +0.00881068 0.127643 0.0286728 +-0.0229191 0.119996 -0.0109969 +-0.0702091 0.156071 0.0113882 +-0.0285896 0.0704574 -0.0325207 +-0.0373694 0.173381 -0.00150317 +0.043508 0.0438731 -6.08517e-05 +-0.0434927 0.0747943 0.0426652 +-0.0817644 0.0758778 0.0206878 +-0.00439411 0.0968663 -0.0305974 +0.00748123 0.0937253 0.0527164 +0.0101565 0.0860282 0.0551829 +-0.0132478 0.039072 0.0352601 +-0.0786774 0.168631 -0.0343418 +-0.0500333 0.148713 -0.00320857 +0.00694939 0.128215 0.0280149 +0.0132662 0.0737717 -0.03084 +-0.089989 0.142041 0.0291697 +-0.0298412 0.0944347 -0.0243277 +-0.0866185 0.103641 0.022352 +0.0179014 0.114016 -0.0148856 +0.0537258 0.0735615 0.0163564 +-0.0413654 0.128702 0.0120304 +-0.0855876 0.0939777 -0.00157288 +-0.0828574 0.0764021 0.018249 +-0.0454932 0.0491469 0.0390026 +-0.0317045 0.0693753 -0.0244624 +-0.0587034 0.0579543 0.010904 +-0.0269178 0.034755 0.0450156 +-0.0520173 0.146257 0.0174096 +-0.0759561 0.112612 -0.00567952 +-0.0164906 0.0786958 0.056769 +-0.0778425 0.108614 0.0370385 +0.0422463 0.0403355 0.0183005 +-0.0845698 0.0831877 0.0245094 +0.00429984 0.0654625 -0.0332399 +-0.0572715 0.0482006 0.0365817 +0.0290027 0.0741128 0.0436952 +-0.0600502 0.143934 0.0360579 +0.0366467 0.0673305 0.0371158 +-0.0199983 0.126616 0.0197793 +-0.0728415 0.165906 -0.0186805 +-0.0634251 0.128316 0.0434644 +-0.0437757 0.12944 0.0066621 +0.000274533 0.0683164 -0.033854 +0.00152244 0.03707 0.0220484 +-0.0349517 0.151884 -0.00344832 +-0.0271199 0.0347243 -0.0201972 +0.0433938 0.0426486 0.00136855 +0.000501319 0.0576739 0.0545888 +-0.0636327 0.155181 -0.0386163 +-0.0884108 0.0928321 0.00744302 +-0.0495652 0.0614019 0.0343808 +-0.0434939 0.0930777 0.0427388 +-0.0662865 0.178231 -0.0601734 +-0.054498 0.111159 0.0367038 +-0.0460532 0.057401 0.0380948 +-0.0820259 0.0858257 0.0320864 +-0.0277337 0.0521019 -0.0243965 +-0.00442413 0.130145 0.0224484 +-0.00149759 0.0549023 0.0548542 +-0.035558 0.0430076 -0.0284728 +0.0593498 0.066038 0.0207029 +0.0515344 0.0624078 0.0294591 +-0.0197872 0.118912 -0.0118682 +-0.0168075 0.0827608 -0.0394117 +-0.0487872 0.0545643 0.0352206 +-0.0311424 0.174761 -0.015609 +-0.0326324 0.0534241 -0.0105104 +0.00577065 0.131636 0.0103849 +-0.0185368 0.123815 0.0276913 +-0.0454963 0.0818291 0.0431013 +-0.0634376 0.179008 -0.0598746 +-0.00652958 0.0443624 0.0478753 +-0.0308041 0.0566412 -0.01742 +0.0448472 0.0735234 0.00122364 +-0.00349567 0.0504603 0.052334 +-0.0298753 0.0537337 -0.0203803 +-0.00256734 0.0388997 -0.00235847 +-0.0502892 0.0334774 -0.00701976 +-0.00481396 0.0840888 -0.0377627 +0.0387801 0.058953 0.031306 +-0.0243507 0.0852386 0.0537426 +-0.077502 0.0785105 0.0333799 +-0.0695501 0.0378481 -0.00149869 +-0.0313945 0.0862693 -0.0285563 +-0.0759552 0.133992 -0.00682355 +-0.0783042 0.161088 -0.0239376 +0.0512217 0.0595245 0.030012 +0.0455105 0.0777762 0.00219892 +-0.0860997 0.0805682 0.0085045 +-0.0347118 0.121713 -0.00868145 +-0.0621446 0.0384632 0.0179813 +-0.0124987 0.115524 0.0391996 +-0.0407326 0.0341812 -0.0112599 +-0.0762949 0.0689313 0.00454567 +-0.0900211 0.137875 0.0231818 +0.0335661 0.0612752 -0.015761 +-0.0620569 0.121268 0.0436785 +0.0389827 0.104151 0.026189 +-0.0724692 0.135469 0.0497506 +0.0222613 0.0692548 -0.0269722 +-0.0614967 0.0876222 0.0452319 +-0.0694862 0.120387 0.0531587 +0.0384699 0.0786144 -0.011749 +-0.0225096 0.10992 0.040117 +0.0140839 0.123776 -0.0073928 +0.0455444 0.0774866 0.0217209 +0.0421217 0.0751567 0.0292241 +-0.0637125 0.165316 -0.0311513 +0.00714876 0.108764 -0.0200496 +-0.0613421 0.118288 0.041013 +0.0150763 0.0900809 0.0517899 +0.0392297 0.0926988 -0.0100859 +-0.0707648 0.0836514 -0.0167885 +0.0199669 0.107838 -0.0162613 +-0.0573264 0.0521522 0.00163442 +0.03817 0.0983612 -0.0088053 +-2.43522e-05 0.0348774 0.0110061 +-0.0647928 0.0346609 0.0159953 +-0.0765127 0.164562 -0.0208538 +-0.0398786 0.107079 -0.0200332 +-0.0315509 0.053914 -0.013393 +-0.0689152 0.109432 -0.0116742 +-0.0426992 0.0344898 0.0348747 +-0.0113643 0.182132 -0.0288209 +-0.0251052 0.162299 -0.0151004 +-0.0745879 0.156108 0.0200327 +-0.0686632 0.162379 -0.0529737 +-0.0867316 0.100467 0.0250232 +0.0335218 0.0499029 0.0322045 +0.0110844 0.0345718 0.0406762 +0.047975 0.0710438 0.0215578 +-0.0471313 0.132491 0.00541336 +0.0385464 0.0954957 -0.00890109 +-0.055495 0.154378 0.0181054 +-0.0486202 0.0403225 0.04496 +-0.0918049 0.121541 0.0434848 +-0.0427276 0.129253 0.0100405 +-0.0641572 0.150753 -0.03179 +0.0203307 0.08353 0.050588 +-0.0025157 0.127417 -0.00520554 +-0.0664375 0.153657 -0.0486366 +0.00823253 0.112336 0.0401545 +-0.0239671 0.075324 0.0508435 +-0.0519769 0.0340995 -0.0134375 +-0.0444607 0.0902688 0.0428496 +-0.043053 0.153237 -0.00732462 +-0.0520076 0.145723 -0.00116844 +-0.0587286 0.0620484 0.0269094 +-0.0876727 0.111787 0.0358475 +-0.0843489 0.0925325 -0.00454911 +-0.00849886 0.0856701 0.0574538 +-0.0681283 0.146379 -0.0251159 +-0.0800217 0.102057 0.0324029 +-0.0662458 0.167287 -0.027765 +0.0214869 0.0865002 0.0492244 +-0.0485551 0.129676 -0.000935313 +-0.021529 0.17126 -0.0137526 +0.0263623 0.0808978 0.0469671 +-0.00180556 0.0384438 0.0201303 +0.0199827 0.116932 -0.0120267 +0.000700235 0.0374335 0.0215506 +-0.0849215 0.130733 -0.00170191 +-0.0566837 0.0492811 -0.00237706 +0.013902 0.054865 0.0498147 +-0.0487235 0.0738176 -0.0166605 +-0.0588289 0.089737 -0.0207103 +-0.00415565 0.0996194 0.0496007 +0.00922789 0.0860105 0.0556146 +-0.052373 0.126911 0.0347775 +-0.0647638 0.0397203 0.0149016 +-0.0375028 0.102851 0.0403695 +0.012678 0.130036 0.0186174 +0.01582 0.0346802 0.0234839 +-0.0834012 0.146003 0.0386574 +-0.0855432 0.111388 0.0330811 +-0.0905559 0.1297 0.0402277 +0.0225 0.108418 0.039052 +-0.034538 0.033729 0.00866796 +0.0580527 0.0523859 0.0111812 +0.0489522 0.045877 0.023734 +-0.0741385 0.0703655 0.0287707 +-0.0261092 0.0409213 0.0540071 +-0.0124916 0.0801274 0.0575032 +-0.0480938 0.0362157 0.0456887 +0.0295798 0.047722 0.0354768 +-0.051366 0.129708 0.032749 +-0.0258406 0.0339312 -0.0210821 +-0.0627466 0.0751872 -0.0173542 +-0.0208698 0.104444 -0.0228641 +0.0391583 0.108387 0.0121653 +-0.0217873 0.0728206 -0.0385569 +-0.00162182 0.0363065 0.0130228 +-0.0125908 0.182249 -0.0250896 +-0.0463216 0.125305 0.0258345 +0.00739775 0.110951 0.0406753 +-0.0698286 0.0965949 -0.0159812 +0.0495953 0.0662964 -0.000416722 +0.0214 0.116687 0.0346491 +0.0355013 0.0605581 0.0371681 +0.0347485 0.0981702 0.0363481 +-0.0784998 0.130283 0.0530344 +-0.0139533 0.0338864 -0.0205741 +-0.0185901 0.128007 0.0115203 +-0.0538047 0.0884108 -0.022116 +0.0213383 0.0635548 -0.0266585 +-0.0194915 0.120861 0.0324568 +-0.0347476 0.127441 0.00854521 +-0.0126238 0.0952928 -0.0330113 +-0.00102634 0.107271 -0.0216101 +0.0225395 0.0352111 0.00978173 +0.0193228 0.0679612 -0.0287395 +0.00111873 0.0344764 0.0134191 +0.0375161 0.110639 0.00638069 +0.0222494 0.0762728 -0.0263867 +-0.0729386 0.0646873 0.0146181 +-0.0397368 0.0739371 -0.0178005 +-0.0543178 0.0387289 0.0471882 +0.016338 0.0566541 -0.0286494 +0.0299119 0.0491593 0.0359714 +0.0525507 0.0462401 0.0172033 +0.0138891 0.0942573 -0.0257865 +-0.00745761 0.0338748 -0.0230567 +-0.073507 0.121801 0.0535653 +-0.0771635 0.0705018 0.0227664 +0.014215 0.083589 -0.0300782 +0.0187635 0.105558 -0.0177865 +-0.0943455 0.121485 0.0232874 +-0.0190471 0.0582949 0.0492947 +-0.0482842 0.164088 -0.00583628 +0.00750123 0.074495 0.0564449 +0.0114903 0.0896115 0.0540357 +0.0111129 0.0739356 0.0547693 +-0.0243199 0.0387345 -0.0140132 +0.0343886 0.107359 0.0305696 +0.0280618 0.0416802 0.0314173 +0.01142 0.0374719 -0.022733 +0.0330999 0.114889 0.024788 +-0.0199406 0.122541 -0.00772092 +-0.0662581 0.15274 0.0347724 +0.00215199 0.101646 -0.0224127 +0.0164932 0.112605 0.0382483 +-0.06512 0.166493 -0.0287867 +-0.0848366 0.0898781 -0.00356125 +-0.0321536 0.0380399 -0.0168 +-0.000666067 0.037425 0.0194672 +-0.0009793 0.0356154 0.0137824 +-0.0338572 0.100054 -0.0225702 +-0.0466969 0.0694537 -0.0155404 +-0.0236112 0.0386852 0.0334692 +0.0506847 0.044695 0.00922239 +0.0143403 0.11733 -0.0144441 +0.0447757 0.0875223 -0.000814326 +0.0359341 0.0727624 -0.0138488 +-0.0526285 0.0588799 -0.00854194 +-0.090746 0.114598 0.00833305 +0.0454568 0.0819591 0.00221362 +-0.0191965 0.175667 -0.0232885 +-0.062765 0.0780997 -0.0182585 +0.0414338 0.0676164 -0.00577635 +-0.053491 0.113891 0.0350292 +0.0043588 0.0510132 -0.0293749 +-0.00874604 0.0713519 -0.0371122 +0.0193852 0.0915557 -0.024942 +-0.0944514 0.122808 0.0172688 +-0.00774122 0.115628 -0.0165086 +-0.0406319 0.0534345 -0.0110028 +0.0230588 0.0463265 0.0401038 +-0.0769246 0.0689689 0.00654258 +0.0278197 0.108769 0.0368873 +-0.078478 0.142827 0.0455967 +0.0339472 0.0368914 0.0179028 +0.0140143 0.0357038 0.00388789 +-0.0699623 0.155307 -0.0499609 +-0.0144161 0.0343188 -0.0191903 +-0.044261 0.122001 0.0258917 +-0.064466 0.170264 -0.0443864 +-0.0614851 0.112533 0.0365644 +-0.0649074 0.120907 -0.00883756 +0.0114806 0.097647 0.0487825 +0.00178793 0.0344587 0.00626566 +0.0404914 0.098527 -0.00482713 +-0.0714142 0.166619 -0.0469903 +0.0553639 0.0729653 0.0110394 +-0.00645384 0.126073 -0.0076982 +-0.042494 0.0676556 0.0412962 +-0.0328931 0.0486572 0.0421875 +-0.0218312 0.0882119 -0.0370399 +0.0433826 0.0987102 0.00417641 +-0.034498 0.0533048 0.037996 +-0.0749535 0.0823401 -0.0135889 +-0.0755022 0.131669 0.0524935 +-0.0118269 0.118985 -0.0140536 +-0.0698809 0.100876 -0.0145572 +-0.0920212 0.128183 0.00926455 +-0.0277533 0.155598 -0.00253083 +-0.0155991 0.0421323 -0.0272897 +0.0125549 0.119968 -0.0132874 +-0.0862929 0.15121 0.027304 +-0.0726068 0.147127 -0.0218633 +-0.0713282 0.0982044 0.0407618 +-0.023785 0.0621839 0.0426152 +-0.0294793 0.0446083 0.0503994 +0.050676 0.0693821 0.00244948 +-0.0520559 0.142894 8.38275e-05 +-0.085494 0.083212 0.00349969 +0.0219046 0.0892697 -0.0245066 +-0.0923861 0.125586 0.0352607 +-0.0578149 0.12313 -0.00798101 +-0.0630458 0.0345815 0.0177326 +-0.0890554 0.0888307 0.00946144 +-0.066735 0.167252 -0.0265095 +0.0143257 0.0594816 -0.0287805 +0.00349695 0.0519735 0.0532512 +-0.0658642 0.141582 -0.00840157 +0.014169 0.0603418 0.050255 +-0.0638047 0.152122 -0.00224548 +0.0332402 0.0814034 -0.0189012 +-0.0246071 0.0408479 -0.0291354 +-0.0320867 0.0651952 -0.0194497 +-0.0719291 0.0394019 0.00652921 +-0.0297834 0.0409697 0.0520218 +-0.035582 0.0336826 0.00849877 +-0.088744 0.0996845 0.0203875 +0.0516874 0.0662489 -0.000355134 +-0.0802571 0.096729 0.0342047 +-0.0669809 0.135535 -0.00827796 +-0.069479 0.0337046 -0.000209101 +-0.0675145 0.148386 0.0398761 +-0.0805311 0.123088 0.0509172 +-0.0084955 0.0503277 0.0510127 +0.00205693 0.129985 1.8398e-05 +-0.0172313 0.12808 0.0178394 +0.00170313 0.0343139 0.0118694 +-0.0773727 0.156953 -0.0129034 +-0.0717154 0.0632455 0.0160979 +0.00858548 0.0340902 -0.01633 +0.0124197 0.0403679 -0.0230567 +-0.0511271 0.116882 0.0329705 +-0.0728598 0.0355014 0.00645302 +-0.0791962 0.16801 -0.0379842 +-0.00268972 0.128069 -0.00389854 +0.0597918 0.0567046 0.013171 +0.0154995 0.111258 0.0392925 +-0.019299 0.0668878 0.052102 +-0.0233826 0.0866124 0.0541509 +0.0432138 0.091668 0.0251628 +-0.0396808 0.0636721 -0.0135815 +0.00652038 0.0518639 0.0525018 +0.0124104 0.0389053 -0.0225983 +-0.0119403 0.171322 -0.0192115 +-0.069435 0.0972593 0.0417284 +-0.0942583 0.125557 0.0232684 +0.030238 0.0814876 -0.0201701 +0.0449279 0.0945923 0.00916323 +-0.0553588 0.131132 0.0357618 +0.00929414 0.0653548 -0.0316941 +-0.0357484 0.0768864 -0.0192776 +-0.062693 0.156802 -0.0376031 +-0.0460193 0.128067 0.0236255 +0.0133301 0.0609017 -0.0290805 +0.00152141 0.0773467 0.0574533 +-0.0636035 0.156128 0.0166435 +-0.0361137 0.162217 -0.0137308 +-0.0595062 0.0386574 -0.00901889 +-0.0620309 0.153757 -0.0155846 +-0.0533723 0.122605 0.0368904 +-0.0264702 0.0676761 0.0408217 +-0.0147452 0.123455 -0.00671201 +-0.0703548 0.0643588 0.00158224 +-0.0814272 0.0752484 0.0195365 +0.0402499 0.0787503 -0.00875238 +-0.00644119 0.0828529 0.0570838 +0.0242228 0.0902502 0.0474811 +0.0336268 0.0557054 -0.0117007 +-0.0623153 0.13671 0.0362243 +0.0149059 0.124307 -0.00595517 +-0.0401601 0.165169 -0.0119868 +-0.077431 0.108115 0.0357399 +0.0402513 0.0940026 0.0302416 +0.0370616 0.0382621 0.0191175 +0.0225195 0.106011 0.0397482 +-0.0255993 0.037974 -0.029094 +-0.0759547 0.129619 -0.00760722 +-0.0360191 0.153642 0.00214438 +0.0596848 0.0566967 0.0151763 +-0.0264473 0.181471 -0.0150302 +-0.0346676 0.0359024 -0.017193 +0.0391135 0.0904981 -0.0117677 +0.00550174 0.0745058 0.0566062 +-0.0615874 0.117934 -0.0105067 +-0.0897323 0.115129 0.0291209 +0.0371127 0.037099 0.0128773 +0.000643571 0.127035 0.0301068 +0.04471 0.0789677 0.024116 +-0.0294983 0.0588236 0.0368769 +0.0243457 0.102123 0.0424029 +-0.0890326 0.125361 0.00330134 +-0.0671124 0.0618759 0.00376788 +0.0207378 0.105279 -0.0174962 +-0.0640597 0.156709 -0.043612 +-0.053836 0.112592 -0.0169505 +-0.0738585 0.0762694 0.0355202 +-0.00709045 0.130506 0.0171336 +-0.0735939 0.077695 0.036626 +-0.0453238 0.169855 -0.00399069 +-0.0609112 0.060145 0.00105228 +-0.0602298 0.119796 0.0409592 +-0.037803 0.0885803 -0.0235006 +0.0220645 0.0375334 0.0362702 +-5.6077e-05 0.112952 -0.0196345 +-0.0156034 0.097548 -0.0273897 +0.0330435 0.104766 0.033885 +0.0234619 0.0343557 0.00702041 +0.0309186 0.094253 -0.0177648 +-0.0406484 0.0563266 -0.0113192 +0.0305338 0.0929359 0.042541 +-0.0713282 0.155382 -0.0439108 +-0.0246656 0.0492403 -0.0269082 +-0.0344954 0.118007 0.0312549 +0.03264 0.0822319 0.0419892 +0.0393737 0.0381589 0.0105128 +0.00986741 0.131059 0.0147331 +-0.0521114 0.156091 -0.00406652 +0.0125143 0.121868 -0.0113432 +-0.019839 0.0610753 0.0486026 +-0.0714347 0.109953 0.0409933 +-0.0435006 0.115257 0.0335166 +-0.0700918 0.147968 0.0410511 +-0.0628279 0.151059 0.0360546 +-0.0269995 0.0383068 0.000625566 +-0.0459023 0.0546326 0.0380387 +-0.0705411 0.0860609 0.0417748 +-0.0360717 0.157766 -0.0114869 +0.018169 0.108481 -0.0169141 +-0.0656915 0.0720893 -0.0135891 +-0.0604976 0.0847283 0.0441029 +0.00648432 0.0413231 0.0455852 +-0.0757282 0.0754387 0.0328339 +0.00417753 0.0922823 -0.0325433 +-0.0272993 0.0381948 -0.0178418 +-0.0315044 0.0860003 0.0426216 +-0.00681874 0.0868473 -0.0370495 +0.0396972 0.0744788 -0.00980523 +0.0376515 0.0947835 -0.010301 +-0.078491 0.121738 0.0515581 +-0.0274838 0.105666 0.0409158 +-0.0202559 0.0365056 -0.0280118 +0.0201693 0.125674 0.00144037 +-0.0587501 0.0482189 0.00571238 +-0.013346 0.168342 -0.0159797 +-0.0683811 0.149044 -0.0363633 +-0.0558475 0.0343686 0.0374162 +-0.0590903 0.0626036 0.0281123 +-0.0331372 0.0336314 -0.0222436 +-0.0678611 0.0980605 -0.0159397 +-0.0472308 0.0334623 0.00452598 +-0.0167567 0.0714512 -0.0386579 +-0.0184671 0.10319 -0.0232847 +-0.0675365 0.0805511 0.0417814 +-0.0666009 0.15275 -0.0468174 +-0.00387787 0.10737 -0.022403 +-0.0300213 0.0579734 -0.0204069 +-0.00579466 0.103184 -0.0232761 +-0.0775304 0.143071 -0.00473432 +-0.00757151 0.0346922 -0.0244599 +-0.0355091 0.0676694 0.0413832 +-0.0185092 0.127137 0.00354165 +0.0289004 0.0650837 -0.0199869 +-0.0224914 0.04868 0.0491885 +-0.0194885 0.0856172 0.056795 +-0.0625301 0.147537 -0.0105732 +0.00324634 0.0726279 -0.0347233 +-0.0117444 0.129778 0.0154481 +0.0381223 0.106958 0.0251953 +0.0134297 0.0343278 -0.0118215 +0.00450615 0.0772491 0.0561317 +0.00914326 0.112364 0.0397506 +0.0165994 0.0933382 -0.024824 +-0.0530349 0.0448324 0.0176964 +-0.0861503 0.0818963 0.00748815 +-0.07574 0.144451 -0.00587632 +-0.0796195 0.104749 0.0319273 +0.0404835 0.052774 0.0322642 +0.0420568 0.0986443 0.0231563 +-0.0887511 0.102351 0.0133854 +0.0132668 0.0723896 -0.0312102 +-0.0507233 0.0723393 -0.0157137 +-0.00754786 0.039018 -0.00905888 +-0.0488259 0.138613 0.00940263 +0.0057745 0.128094 -0.00399317 +-0.0523396 0.147791 0.0193952 +-0.048265 0.136372 0.0159973 +-0.0604426 0.0470258 0.0346715 +0.0367367 0.0902141 0.03744 +-0.0895793 0.136441 0.0122186 +0.0376089 0.108292 0.000165208 +0.0353713 0.0915869 0.0389643 +-0.0211976 0.0347654 0.0444796 +0.00223085 0.129379 -0.00131325 +-0.0737831 0.0864021 -0.0154104 +-0.0127393 0.0700008 -0.0380391 +-0.0657273 0.0751276 -0.0164058 +0.00937487 0.0377648 0.0302588 +-0.035816 0.0448118 0.0437923 +-0.0549046 0.102722 -0.0198351 +0.0460481 0.046714 0.0276632 +0.00759173 0.131318 0.00819364 +-0.0721931 0.161015 -0.0399435 +0.0102622 0.0710503 -0.0323195 +0.0194745 0.0851519 0.050256 +-0.0399319 0.0345158 0.0389424 +-0.0616692 0.167812 -0.0545903 +-0.0056922 0.0584499 -0.034018 +-0.0203692 0.094546 -0.032294 +-0.070351 0.158156 -0.0469171 +-0.023866 0.103031 -0.0237009 +0.0528846 0.0533107 -0.0017243 +-0.0319516 0.077812 -0.0315646 +0.00951738 0.0660057 0.0546772 +0.0137336 0.122464 0.0333928 +-0.0199595 0.125484 -0.000738697 +0.00049871 0.116947 0.0399069 +-0.0359892 0.0344491 0.0345711 +-0.0443682 0.129764 0.015339 +0.0452819 0.0932028 0.00617084 +-0.00813465 0.0391286 -0.0130168 +0.0394097 0.0618135 -0.00677045 +-0.0701845 0.158483 -0.00465374 +0.0322675 0.102123 0.0362847 +-0.0374987 0.0819015 0.0436538 +0.0396969 0.0616754 0.0309066 +-0.0455673 0.0475992 -0.010259 +-0.0527627 0.115451 0.034109 +0.0208176 0.0631975 0.0476002 +-0.0618301 0.0924936 -0.0189652 +-0.053883 0.150856 0.0253998 +0.0245243 0.105615 0.0392344 +0.00385761 0.129628 0.0254511 +-0.00549072 0.0488848 0.0502608 +-0.0300389 0.036799 0.0524219 +-0.0580426 0.153536 0.0303048 +0.0220166 0.125337 0.0220596 +0.0312265 0.0393227 0.0260732 +-0.0171047 0.17569 -0.0178772 +0.016571 0.0940211 0.0486896 +-0.0505514 0.0338848 0.0267025 +-0.0625417 0.0410514 0.0154849 +0.0355348 0.112677 0.0214127 +0.00150774 0.0897546 0.056027 +-0.0190957 0.0968508 -0.0266962 +0.0511508 0.0608575 0.0299274 +0.0163905 0.0491901 -0.024833 +0.0345652 0.114846 0.0110543 +0.0581139 0.0523629 0.0131822 +-0.0417396 0.0754091 -0.018561 +-0.0814751 0.118981 0.0489466 +0.00013405 0.105909 -0.0216496 +-0.0908345 0.139239 0.02018 +-0.0424766 0.101515 0.0416909 +-0.0260624 0.0837492 0.0512652 +-0.0500875 0.0531258 0.0337221 +-0.0706477 0.0874116 0.0418374 +-0.0366978 0.0363155 -0.0300943 +0.00451245 0.064772 0.0563635 +-0.0753069 0.109577 0.0422017 +-0.0284025 0.119846 0.0286714 +0.033406 0.0822268 0.04133 +0.0595932 0.0608555 0.0201843 +-0.00204808 0.0983649 0.051847 +-0.0574847 0.0623327 0.0283417 +-0.0229389 0.126187 0.00412352 +0.0390327 0.0744186 -0.0107818 +-0.0855097 0.129367 -0.00169404 +-0.0647036 0.0653044 0.0298737 +-0.0064934 0.10867 0.043581 +-0.0685164 0.0669975 0.0293604 +-0.0705096 0.1624 -0.046948 +0.0125251 0.129483 0.0214195 +-0.0221845 0.172691 -0.0208918 +0.0153262 0.0767707 0.0538598 +-0.0905235 0.137837 0.0161933 +-0.0545439 0.0402656 -0.0102441 +-0.0688509 0.171089 -0.0344529 +-0.0884641 0.0887716 0.00547605 +-0.0903526 0.116014 0.0283099 +-0.0623807 0.147545 -0.00857398 +-0.061927 0.109672 -0.0156348 +-0.0579856 0.116646 -0.0132522 +0.0395731 0.0448559 0.0300931 +0.00658391 0.130753 0.00354793 +-0.0647804 0.153444 -0.00410741 +0.00522677 0.078235 -0.0342467 +-0.0495662 0.0335706 -0.0032948 +0.00181081 0.131692 0.0146438 +-0.0635975 0.15411 -0.00948093 +-0.0855227 0.133522 0.000289437 +-0.025262 0.107417 -0.0217613 +-0.0340021 0.0409714 0.0491624 +-0.0146057 0.0406867 -0.0271172 +-0.0174894 0.0687336 0.053904 +-0.01522 0.183001 -0.0269465 +-0.0500642 0.142991 0.00242772 +-0.0679313 0.0622594 0.0032802 +-0.0551811 0.133216 -0.00483226 +-0.0284216 0.0792864 0.045297 +0.00824429 0.0809884 -0.0331618 +0.00929618 0.123787 -0.00937811 +0.0228212 0.0889774 -0.0242065 +-0.0185099 0.0883573 0.0560195 +0.0282298 0.0717826 -0.0228933 +-0.0251238 0.125152 0.00185767 +0.019545 0.103378 0.0442321 +-0.0673703 0.122848 0.0518073 +0.0357587 0.067099 -0.014806 +0.00197653 0.0987575 -0.0246237 +-0.0655762 0.155146 -0.00586759 +0.012488 0.119576 0.0355898 +-0.0514967 0.101534 0.0419051 +-0.0095351 0.0444416 0.0488648 +-0.00470695 0.0982478 -0.0280611 +-0.05601 0.0575293 -0.00241387 +-0.0602761 0.139548 0.0339321 +-0.0517453 0.0753545 -0.0181561 +-0.038969 0.042042 0.0415955 +-0.0636896 0.064322 -0.00564195 +-0.0398457 0.0985451 -0.0219087 +-0.0191826 0.127252 0.0185952 +-0.0873123 0.0886781 0.00248146 +-0.0488082 0.0884112 -0.0217819 +-0.0498768 0.104205 -0.0203216 +-0.0409029 0.149467 0.00342301 +-0.069185 0.156032 0.0248455 +-0.0506717 0.0501974 0.0196351 +-0.0301161 0.0396403 0.0523893 +-0.000520242 0.104454 0.0440018 +-0.0290025 0.0578755 -0.022406 +-0.0610145 0.0336026 0.00878975 +-0.0917872 0.143341 0.0171661 +-0.0279974 0.0383174 -0.0050935 +-0.0913132 0.113305 0.0163255 +0.0313508 0.109263 -0.00976359 +-0.00332487 0.0387243 0.0268007 +0.0222104 0.125239 0.00503339 +-0.04503 0.129294 0.00327025 +-0.0176724 0.0933571 0.0538975 +-0.0234883 0.0487024 0.0493089 +0.0421092 0.0724515 0.0291612 +-0.0653912 0.159256 -0.0130566 +-0.00402317 0.0387663 0.0011878 +-0.0338313 0.0929547 -0.0239607 +0.00379004 0.0367184 0.046186 +-0.0186801 0.0525094 -0.0314832 +-0.0351354 0.165203 -0.0147634 +-0.0705038 0.108294 0.0372772 +0.0246817 0.0360382 0.0240669 +-0.0204805 0.0828473 0.0567838 +0.0326609 0.0673309 0.0401471 +-0.0296335 0.0635627 -0.0254272 +-0.0548571 0.0546624 -0.0043828 +0.00968485 0.0342244 -0.0162577 +-0.0810826 0.144759 0.0420272 +0.00767659 0.0346834 0.0054103 +-0.0830301 0.110196 0.00131843 +-0.00544058 0.119032 -0.0141551 +-0.0255852 0.0930492 -0.0306058 +-0.0714911 0.116102 0.0521112 +0.0318609 0.0710037 -0.0187224 +0.0280264 0.121739 0.0100361 +-0.0514799 0.0384723 -0.0115832 +-0.0764395 0.0988661 -0.011539 +-0.0186212 0.04503 -0.027692 +0.0334766 0.0519565 -0.00767966 +-0.0541438 0.151337 0.0259237 +-0.00148294 0.0606073 0.0558577 +0.0148272 0.0344434 -0.00977208 +-0.0391932 0.171233 -0.0109027 +-0.035755 0.0783248 -0.0195335 +0.0355134 0.0795005 0.0390801 +0.0603494 0.0609121 0.0171857 +0.0394635 0.075864 -0.00982057 +-0.0470363 0.0359078 0.0451061 +-0.0608634 0.154346 0.0292597 +-0.0748097 0.109257 0.0407877 +-0.0262745 0.0692227 0.0420449 +0.0243768 0.0533073 -0.022554 +-0.0530668 0.0348658 0.0444554 +0.0259946 0.0347155 0.014606 +-0.0591124 0.121234 0.0408265 +-0.0144894 0.112737 0.0404341 +-0.0838486 0.0803675 0.00250235 +-0.0582446 0.13534 0.0351018 +-0.0214986 0.100246 0.0444424 +-0.0713881 0.068562 0.0291565 +-0.0155474 0.160527 -0.0107791 +0.0215063 0.107058 0.0398344 +-0.0331542 0.158077 0.00281987 +-0.0863235 0.110381 0.0203696 +-0.0312005 0.162424 -0.00314295 +0.0384543 0.0395883 0.0218564 +0.0385307 0.0554981 0.0313684 +-0.0114896 0.0560578 0.0523304 +0.0593092 0.0622231 0.0211664 +-0.0648434 0.0339553 0.0130374 +0.0180082 0.0355585 0.00482766 +0.0399371 0.077993 0.0331058 +0.00160174 0.0351275 0.0454175 +-0.032718 0.0396362 0.0507617 +-0.0524899 0.0973506 0.0433264 +-0.032502 0.104286 0.0408563 +-0.00468764 0.0584239 -0.0337898 +-0.0672529 0.0760725 0.0393761 +0.0584714 0.0552095 0.0201836 +-0.0416396 0.0548863 -0.0113812 +0.014767 0.129313 0.0151085 +0.0271615 0.0578042 0.0426556 +-0.0133509 0.0384568 0.00507202 +-0.0770775 0.0703016 0.00351307 +-0.0514866 0.0748352 0.0426181 +-0.0882111 0.0936365 0.0238814 +-0.0906238 0.143032 0.0276653 +0.0233319 0.059176 0.0459237 +-0.036826 0.0446589 -0.0260242 +0.0332346 0.0955533 0.0394336 +-0.000484271 0.038989 -0.00201961 +0.0427221 0.101476 0.00816485 +0.0419002 0.102864 0.0131587 +-0.0208004 0.181643 -0.0143459 +0.0352424 0.0726953 -0.0147969 +-0.0234839 0.0509996 0.0435588 +0.0352381 0.0443124 0.029693 +0.000403091 0.0348316 -0.0232847 +-0.0684959 0.10279 0.039811 +0.019265 0.0708008 -0.0287723 +-0.0516068 0.0345225 0.0433683 +0.0391514 0.0617239 0.0318804 +0.0135008 0.111258 0.0394003 +0.0304359 0.108504 -0.0109544 +-0.038743 0.0768256 -0.018638 +-0.0223183 0.094515 0.0486399 +-0.0435018 0.0478421 0.040059 +-0.0727332 0.173623 -0.0510446 +-0.00349112 0.118315 0.0390164 +-0.0884421 0.133772 0.0426038 +-0.0454967 0.109818 0.0383281 +-0.0145 0.0392233 0.0384538 +-0.00466385 0.129429 0.0252614 +-0.00582274 0.088227 -0.0364178 +-0.0454902 0.0352033 -0.0224188 +-0.0348607 0.100046 -0.0224582 +-0.0792519 0.17071 -0.0410714 +-0.0376133 0.0393512 -0.0290006 +-0.0640598 0.170094 -0.0457055 +0.0303225 0.119467 0.0166127 +-0.0902791 0.116199 0.0435835 +0.0222032 0.0352055 0.0243097 +-0.073336 0.0968702 0.0400088 +-0.0376144 0.0393494 0.044329 +-0.0105011 0.0870252 0.0569814 +-0.0507332 0.161533 -0.00440491 +-0.0779412 0.162504 -0.0229403 +-0.0754919 0.128859 0.0530266 +-0.0541372 0.0344723 0.0359505 +0.0113242 0.0581457 -0.0297724 +-0.0442953 0.0391467 0.0441537 +0.0242713 0.035754 0.000294462 +-0.0615051 0.159991 -0.0325895 +-0.00166807 0.0568963 -0.03242 +-0.0119937 0.164096 -0.013967 +0.0166698 0.0900802 0.0505874 +0.0232051 0.0672264 0.0457926 +-0.0547028 0.0693497 -0.0142348 +-0.0645039 0.15312 0.03389 +-0.0344884 0.0918084 0.0445658 +0.0553932 0.0493283 0.0071983 +-0.047221 0.115086 -0.0157836 +-0.0737507 0.0835282 -0.0152437 +-0.00700363 0.0992954 0.0501023 +-0.0124605 0.0646213 0.0545516 +-0.0529942 0.0345374 0.0413527 +-0.0926054 0.122844 0.0302746 +-0.0652377 0.0419529 0.0337045 +0.0450967 0.0889619 0.00117113 +-0.0632063 0.0448721 0.0103941 +-0.0177692 0.074285 -0.0389303 +-0.0226723 0.0582322 -0.0321918 +-0.0233871 0.0380454 0.010662 +0.0144228 0.120472 -0.0118376 +-0.00758227 0.0362053 -0.0250795 +-0.0394882 0.0804267 0.0429074 +0.0505096 0.0651476 0.0284061 +0.0412879 0.0914659 -0.00877665 +-0.0613587 0.0343255 -0.00949544 +-0.0739143 0.148544 -0.0218644 +-0.0607701 0.0447346 0.0418038 +-0.0300938 0.0476999 -0.0248901 +-0.0666558 0.0720875 -0.0129051 +-0.0732714 0.156195 0.0132096 +-0.0340151 0.0498932 -0.013349 +-0.0484988 0.0762375 0.0432182 +-0.0614924 0.0384787 0.0187446 +-0.0572292 0.155416 0.0145778 +-0.0105966 0.0391805 -0.0262222 +0.00120442 0.117582 -0.0166604 +-0.070211 0.165211 -0.0489867 +0.0483875 0.0444574 0.00325794 +-0.0764978 0.13308 0.0521415 +-0.035201 0.0345651 0.0381519 +-0.00449959 0.107273 0.0439086 +-0.0266181 0.042276 -0.0292233 +-0.0364985 0.120712 0.0292752 +-0.0735593 0.15583 0.0102013 +-0.0554797 0.0848037 0.0450617 +-0.0845128 0.0817443 0.00347449 +-0.0169788 0.106067 -0.0223329 +-0.0699464 0.151677 0.0365135 +-0.0160243 0.0897174 -0.0373532 +-0.035698 0.0857595 -0.0237144 +-0.0308696 0.105755 -0.0215547 +-0.0475005 0.084795 0.044997 +0.00720445 0.088027 -0.0329216 +0.0388792 0.085648 -0.0137779 +-0.0451911 0.163637 -0.00858913 +-0.0752855 0.176467 -0.0519633 +-0.0568165 0.155074 0.0161832 +0.0369538 0.108295 0.0261877 +-0.0788782 0.172865 -0.0427748 +-0.0439777 0.0345259 0.038072 +0.0238242 0.0981836 0.0451545 +-0.0394936 0.0548399 0.0395943 +0.0242629 0.0790161 -0.0251629 +-0.0665084 0.0903473 0.0440273 +0.0291366 0.0495584 -0.0147305 +0.0191581 0.0357679 0.0376614 +-0.0278785 0.0535209 -0.0244081 +-0.00947834 0.12371 0.0334225 +-0.0570388 0.149629 0.0316784 +0.0117574 0.130329 0.0182774 +-0.00158005 0.131357 0.0134024 +-0.0657222 0.0431534 -0.00229362 +0.0404535 0.0689201 -0.00879299 +-0.0195496 0.161752 -0.0147401 +0.0435566 0.0695959 0.0259839 +-0.0893231 0.14203 0.0321578 +-0.0832597 0.10897 0.0263609 +0.00296745 0.0390391 -0.00510833 +0.0160439 0.0505074 0.0458237 +-0.0213985 0.181639 -0.0134576 +0.000249699 0.0347599 0.0129869 +-0.0138688 0.163706 -0.0171714 +-0.0787597 0.163865 -0.0299483 +-0.0321103 0.178539 -0.0110044 +-0.0062818 0.102371 0.0437669 +-0.0504236 0.113946 -0.0165184 +-0.0808373 0.0858965 0.0337281 +-0.0833697 0.0790868 0.0225099 +0.0174757 0.101745 0.0462033 +0.0562413 0.0521934 0.00418603 +-0.0386753 0.127489 0.0159666 +-0.0714887 0.0860678 0.0412957 +0.00930465 0.0639279 -0.0315779 +-0.038992 0.126654 0.0188148 +-0.0617292 0.0435742 0.0131822 +-0.0807044 0.109603 0.0338418 +0.01567 0.0343236 0.00175615 +-0.0151083 0.184586 -0.0219884 +-0.0792845 0.0704649 0.0170607 +-0.0611161 0.170955 -0.0586033 +-0.0656715 0.0684169 0.0339875 +-0.0346163 0.0505906 -0.0107587 +0.0292004 0.0566287 -0.0178044 +0.0402348 0.101386 0.0251818 +-0.0356488 0.118923 -0.0117804 +-0.00759062 0.117967 -0.0150103 +-0.0344873 0.0959942 0.0440904 +-0.0675456 0.035487 -0.00647 +-0.0177849 0.0784811 -0.0386843 +-0.0357813 0.0828042 -0.0224653 +-0.0217893 0.122494 0.0280004 +-0.040789 0.084093 -0.0212481 +-0.0448136 0.0629573 0.0395248 +-0.0851812 0.137956 0.0449006 +-0.0879612 0.103656 0.0103875 +-0.0558857 0.0998486 -0.020419 +0.017256 0.079507 0.0531399 +-0.0315382 0.178553 -0.0120253 +-0.06991 0.11224 -0.0100103 +-0.0512969 0.0556828 0.0150377 +0.0224682 0.0520683 0.0428376 +0.0143831 0.0448677 -0.0245168 +-0.0794364 0.144805 0.0432098 +-0.0638846 0.103946 -0.0172176 +-0.0284346 0.0849121 0.0465284 +0.0144928 0.11263 0.0387455 +-0.0860797 0.0882889 0.0261675 +-0.00931865 0.0862591 -0.0377315 +-0.0226749 0.0380487 0.0198364 +-0.0875543 0.0861148 0.0194651 +-0.0578317 0.0344516 0.0369209 +-0.0410907 0.157679 -0.0102957 +-0.0680436 0.0337635 0.00720288 +-0.0778811 0.104813 -0.00803583 +0.0518058 0.0553999 0.0290848 +-0.0504997 0.160817 0.00728082 +0.0241356 0.0632152 0.0453534 +-0.0268604 0.100151 -0.0237263 +0.0127955 0.0874066 0.0537621 +-0.0616261 0.155549 0.00719382 +-0.0593595 0.0336431 -0.00899455 +-0.065903 0.0643977 0.026882 +0.0278843 0.0536982 -0.0197695 +-0.0335041 0.0789099 0.0415331 +0.0414488 0.0873044 0.0301508 +-0.0627531 0.161513 -0.0475897 +0.0292606 0.0447502 0.0332372 +0.0105493 0.122164 -0.0116505 +-0.0908004 0.115922 0.00730178 +0.0306755 0.0581744 -0.0167704 +-0.0745653 0.158254 -0.0269305 +0.0417869 0.088692 -0.00877741 +-0.0765465 0.107865 0.0361429 +0.0291715 0.104768 0.0370747 +-0.0435198 0.0436724 -0.0163157 +-0.0639905 0.155091 0.00636862 +-0.0676976 0.156296 0.0180917 +0.0361371 0.0605355 0.0363255 +-0.0831336 0.135327 0.0485953 +-0.0205283 0.125395 0.0225414 +0.0218584 0.126105 0.0106 +-0.0573551 0.0335045 0.00783858 +-0.0766685 0.144473 -0.00485242 +0.0215827 0.0449804 0.0414892 +-0.0623027 0.152202 -0.0135791 +-0.0124889 0.118271 0.037774 +-0.058999 0.129653 -0.00698695 +0.0212269 0.035264 0.00760182 +-0.0558448 0.0533792 -0.00239414 +-0.042206 0.147853 0.000366775 +-0.0732213 0.156852 -0.0309091 +0.00482377 0.0349755 -0.00101746 +0.00553205 0.131427 0.00744951 +-0.0606157 0.0459479 0.0402046 +0.00228793 0.0626666 -0.0335374 +-0.00869718 0.172706 -0.0257786 +0.0265924 0.0466157 -0.0146569 +0.0293044 0.0481199 -0.00974071 +-0.0278981 0.0863323 0.047373 +0.029421 0.0461183 -0.00671048 +-0.058539 0.0588103 0.0191792 +-0.0577583 0.0479183 0.03595 +0.0299489 0.069977 0.0415097 +-0.0877683 0.149882 0.0273982 +-0.0403006 0.122206 -0.0112466 +-0.0731823 0.109139 0.039466 +0.00748061 0.115492 0.0392535 +-0.0323193 0.0339823 0.0197127 +-0.00249248 0.0911617 0.056251 +-0.0410706 0.0335739 0.0056728 +-0.0167629 0.120643 -0.00969861 +0.0170314 0.126681 0.0245104 +-0.0933703 0.118789 0.0242915 +-0.0167466 0.161131 -0.0135692 +-0.037714 0.0710075 -0.016855 +-0.0748306 0.094995 -0.0139518 +-0.0653015 0.169027 -0.0374543 +-0.0171592 0.0387994 -0.0126424 +-0.0649264 0.112407 -0.0127033 +0.0089357 0.131311 0.0143899 +-0.0695053 0.106913 0.0375568 +-0.0679519 0.129695 -0.00900682 +0.0196594 0.10025 -0.0221259 +0.0187375 0.0672729 0.0498973 +-0.0634922 0.0626336 0.0253957 +-0.0640428 0.0593154 0.0139941 +-0.0365043 0.0691064 0.0417512 +-0.0509946 0.0547172 0.0191515 +-0.0684996 0.106934 0.0379267 +-0.0391114 0.149509 -0.00165293 +0.00150153 0.0534013 0.0535077 +-0.0610153 0.131125 -0.0076807 +-0.015856 0.0980295 -0.0258983 +0.0549279 0.0723085 0.00788581 +0.0296197 0.117006 0.0277632 +0.00535242 0.130989 0.0202309 +-0.000691446 0.0612541 -0.0338404 +0.00150093 0.0441835 0.0459725 +-0.0611099 0.11531 0.0378549 +-0.0695161 0.108303 0.0373324 +-0.0543547 0.158623 0.00837339 +-0.0945603 0.124158 0.0182654 +-0.0535009 0.111177 0.0367213 +-0.0119534 0.0385403 0.00164014 +-0.0370531 0.166795 0.000693639 +0.0161005 0.115637 -0.0146217 +-0.0669681 0.132599 -0.00847972 +-0.0192376 0.0362049 0.0528295 +-0.0510947 0.138549 0.00140254 +0.0199501 0.126815 0.00703133 +-0.0280876 0.0511424 0.0415727 +0.0021184 0.108719 -0.0202691 +-0.0455158 0.0889126 0.0438293 +0.00898082 0.0376394 0.0339008 +-0.0913279 0.147458 0.016148 +-0.00573884 0.0712887 -0.036141 +0.0184912 0.0906471 0.0481735 +-0.0240484 0.159369 -0.0122932 +-0.00386335 0.103093 -0.0232514 +-0.0903131 0.126767 0.00528424 +-0.00141239 0.101018 0.0444401 +-0.0265472 0.0384572 -0.00862977 +-0.0461338 0.160629 -0.00828859 +0.0434078 0.0958974 0.0221477 +-0.0323682 0.0778417 -0.0305703 +-0.0104869 0.166942 -0.0170857 +0.0335642 0.11614 0.00925074 +-0.0679156 0.112303 -0.0110315 +0.0448529 0.0917799 0.0171662 +-0.0902457 0.140661 0.0271695 +0.0361358 0.102075 -0.0100705 +-0.0774559 0.158948 -0.0154272 +-0.0718839 0.142969 -0.00986002 +0.0254315 0.0862638 0.0474376 +0.0233509 0.0549381 -0.0249484 +0.0445042 0.0650854 0.0275412 +0.0472882 0.0731371 0.0168777 +0.0310703 0.0352449 0.00774073 +-0.0540072 0.144242 -0.000990452 +-0.0901845 0.132425 0.0322244 +-0.0305014 0.066031 0.0387492 +-0.0636396 0.163113 -0.0245909 +0.0265757 0.0754454 0.0454823 +0.0560761 0.0692634 0.0230866 +0.0323242 0.117657 0.0116569 +-0.0744896 0.128852 0.0526631 +-0.092535 0.126933 0.0292581 +-0.021881 0.107267 -0.0220871 +0.0216673 0.125834 0.0205048 +-0.0892808 0.140568 0.013241 +-0.0188177 0.0683045 0.0530002 +0.0181426 0.117476 -0.0126083 +-0.0562843 0.049932 0.00898241 +0.0271917 0.0858851 -0.0222975 +-0.0354636 0.172718 -0.000342918 +-0.0113055 0.0991708 0.0485876 +-0.0512476 0.149342 0.0143776 +0.0112062 0.129253 0.000760937 +-0.027273 0.123571 -0.00271305 +-0.0942867 0.122796 0.0162787 +-0.0731111 0.152638 -0.0358925 +-0.0630631 0.0351206 0.0420909 +-0.0638567 0.0981567 -0.0173229 +-0.0886136 0.0969805 0.0223931 +0.0376971 0.0381803 0.0174952 +-0.0389196 0.163835 0.00150184 +0.0470726 0.048551 -0.0036464 +-0.0195067 0.119545 0.0340058 +-0.0154952 0.101637 0.0439764 +-0.0615198 0.167807 -0.0565879 +0.000487515 0.110024 0.0426254 +0.0218587 0.0714183 0.0491823 +-0.0891206 0.0888853 0.014456 +0.00728906 0.0602827 0.0543511 +0.0159015 0.122788 0.0313235 +0.0287151 0.0982016 0.0416756 +-0.0515592 0.162515 0.00512403 +-0.0562626 0.0437454 0.0167126 +-0.0181312 0.0948304 -0.0325641 +-0.0375002 0.0337858 -0.019518 +-0.0283411 0.0368095 0.0535577 +0.0138368 0.126165 0.029064 +-0.0698832 0.115052 -0.00855978 +-0.0166197 0.126668 0.0238945 +-0.062914 0.11807 -0.00990368 +-0.0489018 0.129654 0.0292632 +-0.0524468 0.0489914 0.023647 +-0.0590382 0.132561 -0.00680716 +-0.0429798 0.150656 0.00610371 +-0.0708619 0.0368523 0.00979504 +0.0198172 0.102563 -0.0205962 +0.0416527 0.0846461 0.030449 +-0.0215106 0.119492 0.0328652 +-0.0144877 0.185446 -0.0257702 +0.0475192 0.0568404 0.0316921 +-0.0913388 0.115949 0.00831473 +0.0281313 0.0591962 0.0423168 +-0.035495 0.171374 -0.0137494 +-0.0736292 0.156748 -0.0014693 +-0.00249426 0.0505094 0.0526827 +-0.0909607 0.144377 0.0265412 +-0.0410851 0.123071 0.0255089 +-0.0226414 0.0961417 -0.0259441 +0.0264078 0.120534 -0.000510633 +-0.0193661 0.126578 0.00214409 +0.0465619 0.0568462 0.0320779 +0.0207007 0.040829 0.0419301 +-0.0564899 0.0440403 0.0448345 +0.000863008 0.0381264 -0.0140589 +-0.0418598 0.102811 -0.0210501 +-0.00158954 0.0376715 -0.025054 +-0.0723294 0.177884 -0.0550149 +-0.0544961 0.0732542 0.0409056 +-0.00649673 0.121064 0.0364033 +0.0504194 0.0446982 0.00822878 +-0.0153541 0.0337728 -0.0226273 +-0.0303696 0.0486908 0.0439216 +-0.0334968 0.033775 0.00883944 +-0.0685163 0.108328 0.0375372 +-0.0304988 0.0603029 0.0376116 +-0.0662971 0.0363734 0.0376513 +0.0311541 0.072342 -0.0197804 +0.016819 0.0860765 0.050782 +-0.067492 0.0944588 0.0423306 +-0.0187655 0.0714126 -0.0384549 +-0.0605051 0.128314 0.040613 +0.00838174 0.0449018 -0.0251393 +-0.0164768 0.122235 0.0319313 +0.0227625 0.125142 0.00666699 +-0.0528343 0.0337802 -0.0114802 +0.0451301 0.0903696 0.00218472 +-0.0576106 0.148673 -0.00161022 +0.00250457 0.100333 0.0462614 +-0.0262513 0.0350951 0.0517484 +-0.054684 0.067848 -0.0128124 +-0.0441291 0.159145 -0.00944971 +-0.0440467 0.0380432 -0.0230799 +-0.0447681 0.146394 0.00358641 +-0.0894274 0.0915536 0.0114438 +-0.0751139 0.0954949 0.0389973 +0.0383178 0.106879 0.000185785 +-0.0732998 0.0654414 0.00491231 +-0.00228741 0.13015 0.0232201 +-0.0372213 0.150899 -0.00386632 +-0.0261116 0.0809919 0.0513952 +0.0322341 0.112712 0.0291688 +-0.0690565 0.0338884 -0.00389811 +0.0101437 0.101615 -0.0217271 +0.0425651 0.10009 0.017161 +-0.0355201 0.16973 -0.000114667 +0.00176571 0.0954911 -0.0311224 +0.0373922 0.0461028 -0.00552229 +-0.0261166 0.163762 -0.0159025 +-0.0651006 0.0458549 0.00368955 +0.0212923 0.0982999 -0.0220426 +0.026467 0.0383015 -0.00253304 +-0.0231343 0.0383693 -0.0171708 +0.00758009 0.121578 -0.0129987 +-0.0491724 0.116402 -0.0151155 +-0.0174383 0.038419 -0.00120725 +-0.0368548 0.0985914 -0.0223265 +-0.0599288 0.145383 0.0362513 +0.00646924 0.0964123 0.0516046 +-0.0630484 0.138442 -0.00719818 +-0.0266978 0.0917701 0.0460149 +-0.0534968 0.0790911 0.0438637 +-0.0203653 0.0682964 0.0517114 +0.0203853 0.049027 -0.0227929 +-0.0539349 0.0527611 0.0108042 +0.0460422 0.0848268 0.0101717 +-0.0728228 0.148718 -0.0323717 +0.0337238 0.11401 0.0250189 +-0.0718098 0.0864713 -0.016231 +-0.000525817 0.0352062 0.0124275 +0.0044963 0.0605551 0.0556784 +0.0278498 0.045613 -0.00720046 +0.0242032 0.0987613 -0.0205495 +0.0133536 0.0359529 -0.0210721 +-0.00614443 0.0386147 0.00639011 +-0.091603 0.144731 0.0191577 +-0.00870302 0.0387758 0.0292604 +0.00137957 0.0343513 0.00995357 +0.0580311 0.0716366 0.0149943 +0.029585 0.0495591 -0.0127459 +-0.0873232 0.0873446 0.00247822 +-0.0562907 0.154938 0.0178178 +0.0227189 0.116065 -0.0110894 +-0.089541 0.143417 0.0301691 +-0.0295204 0.0607307 -0.0234192 +-0.072166 0.0982206 0.0402281 +0.0461397 0.0764263 0.0052018 +-0.0650238 0.0405393 0.0286621 +-0.0357662 0.0798799 -0.0213145 +-0.0210545 0.100222 -0.024166 +-0.051798 0.0884029 -0.0218862 +-0.0585235 0.0425717 0.0226979 +-0.0581184 0.132538 0.0370402 +-0.0500652 0.125773 -0.00688378 +-0.0570027 0.145725 -0.00171879 +-0.000114754 0.120081 -0.0133088 +-0.0558569 0.135328 0.0332838 +-0.071744 0.162192 -0.0110365 +-0.0533559 0.0609747 0.0280244 +-0.0678966 0.110866 -0.0116376 +-0.0708871 0.119431 -0.00850422 +-0.0743754 0.0995209 0.0381506 +-0.0827936 0.110133 0.0365 +0.0274001 0.0354299 0.0197116 +-0.0700593 0.152584 0.0349486 +-0.0594807 0.0398598 0.0207095 +-0.0506478 0.0648447 -0.0114426 +-0.0548507 0.0955893 -0.0216695 +-0.0735032 0.144216 0.0449341 +-0.0746874 0.169403 -0.0279937 +-0.041349 0.172669 -0.00697494 +-0.0879813 0.0968653 0.0054141 +-0.0639066 0.158701 -0.0499459 +-0.0295413 0.0348538 0.0461198 +0.0425062 0.0610428 0.0297234 +-0.0761006 0.0693618 0.0222283 +0.0350916 0.102085 0.0333486 +-0.0434936 0.107078 0.040105 +-0.0210995 0.166843 -0.0113898 +-0.0599936 0.0459773 0.0409964 +0.0260763 0.0726986 0.044735 +0.0368852 0.111459 0.00613554 +-0.00301536 0.127034 0.030217 +-0.0313536 0.0384061 -0.00216621 +0.0173795 0.0350198 0.030737 +-0.072846 0.165216 -0.0419869 +-0.0344415 0.176449 -0.00471515 +0.00170995 0.0392427 0.0309786 +-0.04085 0.0985381 -0.021696 +-0.0479764 0.135553 0.00940627 +-0.0332667 0.0835875 -0.0265323 +0.0206498 0.0781917 0.0510092 +0.0122103 0.0893249 -0.030653 +-0.0464803 0.0335784 -0.0137021 +-0.0367962 0.0383714 -0.00507539 +-0.00449141 0.0911839 0.0565229 +0.0243337 0.0605883 -0.0247185 +-0.0826166 0.123078 0.0498508 +0.0540378 0.0525213 0.0252382 +-0.0675101 0.0369158 -0.0062949 +-0.0205096 0.124449 -0.00369667 +0.0285796 0.107031 -0.0133812 +0.0320794 0.0526694 -0.0107538 +-0.0203373 0.0610131 0.0476733 +-0.0674469 0.0396367 -0.00494886 +-0.0599339 0.120955 -0.00911512 +0.0168017 0.105866 -0.0181237 +-0.0787857 0.0744548 -0.00455566 +0.0193044 0.127372 0.00964815 +-0.038368 0.0457007 -0.0229731 +-0.025877 0.125557 0.00449924 +-0.0609237 0.0414243 0.0237035 +-0.0433646 0.153626 0.00736711 +-0.0513808 0.0500433 0.0347314 +-0.0212772 0.0382158 0.00549847 +0.0220013 0.0348195 0.00816409 +-0.0519377 0.0335199 0.00532131 +0.00789859 0.0999878 -0.0218807 +0.0337096 0.115696 0.0178949 +-0.0404258 0.0418709 -0.0242648 +-0.0188763 0.105884 -0.0226282 +-0.0648153 0.175482 -0.051724 +-0.070065 0.148313 -0.0344143 +-0.0584005 0.0439707 0.0246877 +0.0215152 0.0795452 0.0505127 +-0.000765864 0.0811873 -0.0364626 +-0.0633527 0.0454486 0.000289555 +-0.0455004 0.113892 0.0345333 +-0.0205229 0.0336428 -0.0235211 +-0.0658189 0.0895406 -0.0182783 +0.00772286 0.0346363 0.0381279 +0.044441 0.093115 0.00120191 +-0.0859796 0.119771 -0.00178632 +0.00662772 0.0374926 -0.0123303 +-0.0495602 0.0418248 -0.0110192 +-0.0863354 0.129395 -0.000699295 +-0.00570279 0.0613633 -0.0351663 +-0.0195101 0.114089 0.03835 +-0.0679008 0.1038 -0.0147014 +0.045275 0.0917907 0.0041773 +0.0258455 0.110181 -0.0127425 +-0.00858661 0.0376839 -0.0256139 +-0.0494924 0.160775 0.00747898 +-0.0186783 0.101771 -0.0238107 +-0.0870678 0.11107 0.0203515 +-0.0692028 0.135485 0.0474165 +-0.0665472 0.0446244 0.00170489 +-0.0679768 0.0791427 0.0408622 +0.0184726 0.0851741 0.0505075 +-0.0203373 0.158355 -0.00674555 +-0.0364979 0.119358 0.0304421 +-0.0395021 0.0450562 0.0411081 +-0.00309828 0.0379762 0.00940157 +-0.054497 0.10568 0.0405938 +-0.0354869 0.0903478 0.043788 +-0.0882673 0.102346 0.019362 +-0.0518479 0.128319 0.033784 +0.0163666 0.0522247 -0.0268816 +-0.0216233 0.0450569 -0.0280185 +-0.0332919 0.124337 -0.00345787 +-0.0603705 0.118249 -0.0108601 +-0.0883316 0.128385 0.0454834 +-0.0681462 0.033688 -0.00353141 +0.0232453 0.12098 -0.00440593 +-0.0294449 0.038677 -0.0149866 +0.0110249 0.0988999 -0.0227192 +-0.0218748 0.174208 -0.0142339 +0.0205417 0.0741225 0.0508294 +-0.0627477 0.148893 -0.0169766 +-0.0398023 0.0338119 -0.0274661 +-0.0319551 0.0348046 0.0438977 +0.0104998 0.108437 0.040345 +-0.0139772 0.164028 -0.0115888 +-0.0247602 0.0379556 0.0194943 +-0.000934383 0.0340393 -0.0200439 +0.0476809 0.0472678 -0.00164326 +-0.0400291 0.0354632 0.00960076 +-0.0671756 0.0610764 0.00625684 +-0.0852257 0.114326 0.001271 +-0.0754019 0.151364 -0.0118956 +-0.0437605 0.146927 0.00133694 +-0.0619528 0.15527 -0.030594 +0.0363929 0.0490985 -0.00642376 +-0.0100186 0.0981603 -0.0280043 +-0.0119452 0.129197 0.00527137 +-0.0346207 0.0519685 -0.0102527 +0.0527588 0.0510331 0.0250995 +-0.0635082 0.148832 -0.022668 +-0.0147336 0.0671673 -0.0377424 +-0.0704174 0.170744 -0.0307374 +0.0105902 0.125785 0.0307704 +-0.0258145 0.0894344 -0.0348302 +-0.0177853 0.0383982 0.00785589 +-0.0875073 0.0954698 0.00341799 +-0.0424838 0.105689 0.0405023 +0.049326 0.0581361 0.0307698 +-0.0426568 0.0578158 -0.011891 +-0.0506189 0.0517055 -0.00806622 +-0.0751298 0.155996 0.0213056 +-0.0740765 0.0662649 0.0182774 +-0.055953 0.151039 0.0297159 +0.00149895 0.0519342 0.0529111 +-0.0476623 0.135572 0.0124001 +0.00259703 0.093007 -0.0325523 +-0.021995 0.185609 -0.0143485 +0.0421516 0.0805501 0.0292856 +-0.014868 0.104453 -0.022832 +-0.0398868 0.108509 -0.0195593 +0.0259209 0.122835 0.0206655 +-0.0616544 0.15599 0.0144357 +-0.0733101 0.14716 -0.0188577 +-0.0262613 0.119664 -0.0106051 +0.0355444 0.109985 0.0269213 +0.04069 0.0703475 -0.0087868 +-0.0658232 0.100991 -0.0166158 +0.0443888 0.0846966 -0.000809941 +-0.0235014 0.109891 0.0398372 +0.0275195 0.0713136 0.0432798 +0.0364601 0.111481 0.0203251 +-0.0766191 0.168746 -0.0293719 +0.041872 0.069712 0.028792 +-0.0188551 0.177186 -0.0168879 +-0.0430291 0.148351 -0.00306372 +0.0241638 0.0853333 -0.0244737 +0.017675 0.127712 0.00477874 +-0.0888835 0.0983415 0.0204012 +-0.0202474 0.0582316 0.0476806 +-0.0719293 0.126758 -0.00881076 +-0.0294958 0.0960659 0.0449891 +-0.0491744 0.14016 0.00939463 +-0.0284952 0.105677 0.0407009 +0.0215711 0.035903 0.0289947 +0.0112282 0.0780681 -0.031821 +0.0343153 0.115038 0.0152609 +0.0213375 0.0536353 -0.0261911 +-0.0754641 0.149954 -0.0208706 +0.0174704 0.1044 0.0442882 +0.00640724 0.0390095 -0.0238414 +-0.0396234 0.150027 -0.00409811 +-0.0900489 0.137821 0.0141988 +0.0252808 0.0733562 -0.0251315 +-0.0492373 0.132883 0.0267635 +-0.0430533 0.034543 -0.0263375 +0.0217093 0.0520814 0.0434982 +-0.0333828 0.0807789 -0.0265175 +-0.0761052 0.14997 -0.0158781 +-0.0707786 0.0690222 0.0306409 +0.0401031 0.0589615 -0.00453029 +-0.0260252 0.0904818 0.0482145 +-0.0895062 0.0902087 0.0114561 +-0.0526923 0.0334338 -0.00380212 +-0.0114811 0.0646532 0.0550744 +-0.0370678 0.157759 -0.0113588 +0.00952731 0.105746 0.0431674 +-0.0410118 0.126885 0.0180931 +0.0197485 0.105413 -0.017636 +-0.0629292 0.155832 0.0110869 +-0.0581695 0.15592 0.011334 +-0.00650086 0.0561902 0.0537938 +-0.0338729 0.15688 -0.0110666 +0.0405297 0.0779725 0.0322363 +-0.0642469 0.0423257 0.0129047 +0.0237846 0.0476926 0.0394013 +-0.0217726 0.172729 -0.0141007 +-0.0416287 0.0534443 -0.0111279 +-0.077087 0.154176 -0.0108977 +0.0304203 0.0366341 0.0210583 +-0.0306156 0.0552316 -0.0163811 +-0.0584355 0.0482117 0.00674018 +-0.0284904 0.0917855 0.0443788 +-0.0347085 0.0681808 -0.0168555 +0.0286267 0.117101 -0.00417221 +0.000831008 0.0996342 -0.0235195 +0.00330328 0.0611715 -0.0325304 +-0.0739165 0.113504 -0.00683708 +-0.0898235 0.126994 0.0441831 +-0.0889746 0.0942393 0.0114303 +-0.0279086 0.0704216 -0.0334901 +-0.041504 0.0562873 0.0399374 +0.0394095 0.0793879 0.0341721 +-0.0669825 0.112069 0.0420748 +-0.0847653 0.103459 0.000382003 +-0.00649785 0.0801379 0.0576218 +-0.0226054 0.126675 0.00715587 +-0.000755212 0.130746 0.00366553 +-0.0328403 0.0348519 -0.0195836 +0.0396279 0.0857065 -0.0127726 +-0.0805255 0.14991 0.0359696 +0.0353489 0.0955322 0.0372114 +0.0102384 0.0781052 -0.0323493 +-0.0296143 0.0551126 -0.0213868 +-0.0699315 0.126779 -0.00900092 +-0.0795103 0.126002 0.0528073 +-0.000474921 0.0732072 0.0579427 +0.00749418 0.095088 0.0520151 +-0.0841797 0.101927 0.0280813 +0.0424909 0.101472 0.00517268 +0.00951997 0.0673959 0.0546877 +-0.0472854 0.0671503 0.0390298 +0.0376148 0.100847 -0.00874384 +-0.0374929 0.116616 0.0320198 +0.029259 0.120361 0.0176317 +-0.0737149 0.158251 -0.0299203 +-0.0114976 0.116917 0.038689 +0.0413371 0.0444728 -0.00290745 +-0.0627029 0.150609 -0.0235776 +-0.0302691 0.080511 -0.0335682 +0.0300872 0.0497043 -0.0117138 +0.0222773 0.0620859 -0.0257917 +-0.0570144 0.147201 -0.00173114 +-0.0760781 0.173825 -0.0400503 +-0.00149572 0.101631 0.0441885 +-0.0261888 0.17564 -0.0188354 +0.0231825 0.0577956 0.0456852 +-0.0924811 0.125593 0.0372603 +0.00115082 0.131147 0.0187057 +-0.0841614 0.142011 0.042356 +0.042729 0.0901813 -0.0058099 +0.0213045 0.0372836 -0.00268556 +-0.0160362 0.0338015 -0.0209075 +0.0394869 0.10531 0.000602508 +-0.0239168 0.0383626 0.00119722 +-0.0164538 0.0343139 -0.019589 +-0.0592802 0.154415 0.0283608 +-0.0609269 0.155849 0.0219449 +-0.0250081 0.0361291 -0.0192131 +-0.0853634 0.14876 0.00617316 +-0.0253618 0.0386908 -0.0141849 +-0.0881693 0.0922771 0.0238938 +-0.0728038 0.0921924 -0.0153063 +-0.0708783 0.150832 0.0377201 +0.00548074 0.111376 0.0414038 +-0.0524967 0.0945727 0.0438723 +0.0115063 0.0343546 -0.0179688 +0.00151312 0.081484 0.0572224 +-0.0149936 0.0395459 0.0398583 +0.0120392 0.129427 0.0226627 +0.0591195 0.05666 0.00817454 +0.0328155 0.102974 -0.0130264 +-0.0371359 0.123595 0.025439 +0.0450698 0.0805625 0.0231647 +-0.028064 0.0385407 0.0362565 +-0.00648913 0.0732625 0.0583326 +-0.0374981 0.0719295 0.0420686 +-0.0736872 0.176894 -0.0449171 +-0.0672224 0.0339784 0.0107486 +-0.0758756 0.104904 -0.00955908 +0.0439403 0.083251 -0.00181959 +-0.0614723 0.15843 -0.0295877 +0.0442849 0.0945485 0.0181566 +-0.065503 0.044849 0.00843715 +0.00357616 0.0395385 0.0347033 +-0.028754 0.0634689 -0.0284339 +0.0315757 0.0914687 -0.0188156 +0.00716348 0.0343484 0.0202029 +-0.0216788 0.0493937 -0.0287126 +-0.0716516 0.139715 0.0474384 +-0.043721 0.033715 -0.00407894 +-0.0817894 0.0909919 -0.00761357 +0.0425053 0.0513815 0.0326154 +-0.0638693 0.170945 -0.0476012 +0.0316414 0.11271 0.0301021 +-0.0306212 0.159741 -0.0134031 +-0.0214041 0.0879871 0.0549671 +-0.0670934 0.0625692 0.00143601 +-0.0365003 0.087456 0.0430956 +0.00150165 0.0919153 -0.0334107 +-0.024293 0.124271 0.0211991 +-0.0604952 0.0932426 0.0451145 +0.00516194 0.0978455 -0.0256065 +-0.00249882 0.081515 0.0574957 +-0.0636907 0.146369 -0.0159165 +-0.0129939 0.103563 -0.0236849 +0.00282967 0.131401 0.0178813 +0.00250691 0.0883899 0.0564027 +0.0220994 0.0476682 0.0404859 +-0.0466625 0.12523 -0.00836412 +0.00382851 0.0992997 -0.0231609 +-0.0879384 0.126705 0.000268669 +-0.0725213 0.0636798 0.0102197 +-0.00645782 0.0338359 -0.0228235 +-0.0523786 0.138216 -8.53499e-05 +-0.041943 0.114992 -0.0156494 +0.0435142 0.0513638 0.0325031 +0.0432433 0.0958712 0.000187851 +-0.0729725 0.170894 -0.0302341 +-0.0303619 0.0381166 0.0307902 +-0.0942177 0.125518 0.0172578 +0.0446543 0.0959754 0.00716634 +-0.0263933 0.0864552 0.0500994 +0.0352313 0.064664 0.0385641 +-0.0913521 0.14609 0.0171489 +-0.00798473 0.0348553 0.0472244 +-0.00181216 0.086792 -0.0360393 +-0.0153678 0.09644 0.0517723 +0.0268857 0.117842 -0.00498093 +-0.0354986 0.0747267 0.0419454 +-0.0573263 0.0481094 0.0336642 +-0.0386241 0.125328 -0.00654651 +-0.020119 0.0431531 0.0531418 +-0.0226834 0.174208 -0.0136486 +-0.0554979 0.0889982 0.0448936 +-0.0321193 0.0366883 0.0508235 +0.013731 0.104072 -0.0202068 +0.0407967 0.0661529 -0.00677209 +-0.0792933 0.16941 -0.0399858 +-0.0250378 0.174204 -0.0117666 +-0.0718111 0.0631642 0.010775 +-0.0710553 0.181198 -0.0554882 +-0.058796 0.0868581 -0.0207882 +-0.0136362 0.0466649 -0.0295427 +-0.0924917 0.124196 0.0312677 +-0.0331602 0.171158 -0.0153905 +-0.0724259 0.0727975 0.0340482 +-0.0566618 0.0645338 -0.00803085 +-0.0705221 0.098629 0.0408842 +0.0118568 0.126524 -0.00436904 +-0.0784161 0.116342 0.0501163 +-0.0677948 0.160582 -0.0110564 +-0.0456903 0.11799 -0.0148012 +0.0526315 0.0462656 0.0102089 +0.0453672 0.0456539 0.0269438 +-0.00726729 0.129761 0.0228793 +-0.0659232 0.105312 -0.014993 +-0.087769 0.118492 0.00124641 +-0.00149512 0.0562755 0.0546084 +-0.089164 0.0928946 0.0114433 +-0.0841907 0.078353 0.0198111 +-0.0679412 0.0656184 0.0271584 +0.0224551 0.0368363 -0.00219983 +-0.0356854 0.0435567 0.045098 +-0.0457595 0.0797224 -0.0196258 +-0.0405031 0.0762353 0.0429954 +-0.0640239 0.14106 0.0390925 +-0.0797368 0.119028 0.049952 +-0.0864815 0.0846104 0.00248575 +-0.0774908 0.137247 0.0499166 +-0.0586931 0.0693474 -0.0143558 +-0.0340813 0.159269 -0.0127772 +-0.0889533 0.124321 0.0462453 +-0.0611638 0.0468972 0.00167818 +-0.0925249 0.130961 0.0132346 +-0.0707251 0.033867 0.00298473 +0.0514024 0.0510939 0.0266785 +-0.000225629 0.097747 0.0525183 +0.0260546 0.112325 -0.0110571 +-0.0429452 0.0345628 0.0382617 +-0.0174331 0.0625913 0.0517909 +0.0422611 0.0397457 0.00959333 +-0.0374974 0.0705158 0.0419336 +-0.0368535 0.0362973 -0.0142764 +-0.0132005 0.128825 0.00480743 +-0.0808442 0.110042 -0.00155764 +-0.0890966 0.114815 0.0438036 +-0.0195037 0.11681 0.0364149 +-0.0653439 0.127011 0.0477296 +-0.0749324 0.152731 -0.0198994 +-0.0131083 0.128689 0.020774 +-0.0761869 0.149999 -0.0118749 +-0.0657951 0.0852369 -0.0187501 +-0.0515872 0.0558557 0.0146208 +0.0414903 0.0541829 0.0322405 +-0.0094881 0.112787 0.0415502 +-0.0473098 0.0390167 0.04506 +-0.076903 0.112654 -0.00467049 +-0.0792829 0.109073 0.0381388 +0.0277273 0.0646184 0.0435417 +-0.0923959 0.132359 0.0202239 +-0.0505803 0.0502828 -0.00813802 +0.00549299 0.117639 -0.0167508 +-0.0166687 0.038571 -0.00303984 +-0.0728836 0.119408 -0.00813229 +-0.00373228 0.0669631 -0.0346735 +0.0373953 0.0445589 -0.00471693 +0.00577997 0.0365296 -0.0134893 +0.0065091 0.0772612 0.0561769 +-0.0785581 0.153669 0.00407716 +-0.0631137 0.14437 -0.00863045 +0.0335076 0.0453895 0.0300756 +-0.00148382 0.131063 0.00627096 +-0.0117022 0.0613984 -0.0359464 +-0.0390182 0.0473551 -0.0162983 +0.0174871 0.10577 0.0429453 +0.0173606 0.128011 0.00608341 +-0.0587951 0.0337712 0.0197789 +-0.0554323 0.145321 0.0304155 +-0.021174 0.184521 -0.0131308 +-0.0546552 0.0656851 0.0351815 +-0.00872132 0.0656071 -0.0355909 +0.00329381 0.0654903 -0.0335962 +-0.0874212 0.0861211 0.0204627 +0.0341358 0.0641297 -0.0158137 +-0.063479 0.0384929 -0.0076832 +0.0174063 0.0417452 -0.0219906 +-0.069028 0.0409064 0.00923732 +0.0577041 0.0703778 0.00716237 +-0.0506338 0.0663851 -0.0124105 +-0.04882 0.119077 -0.0139102 +-0.0660878 0.161167 -0.014759 +0.060054 0.0678303 0.0101401 +-0.063913 0.169258 -0.0441943 +-0.053845 0.0463107 0.0236764 +-0.0784828 0.175619 -0.0475153 +-0.0313957 0.12387 -0.00298136 +0.0154947 0.107116 0.0420405 +-0.036876 0.0434502 0.0434666 +-0.06715 0.145376 0.0416405 +-0.0155327 0.181625 -0.0208343 +-0.0715781 0.0968766 0.0410625 +0.0306462 0.0968954 0.0409575 +0.00964614 0.0589005 0.0527021 +0.0527245 0.0736707 0.0159788 +-0.0861826 0.104908 0.00538017 +-0.0812551 0.138069 0.0480599 +0.0475108 0.0597433 0.0313293 +-0.0156256 0.0450397 -0.0279587 +-0.0221316 0.125526 0.0205056 +-0.0322922 0.122832 0.0242564 +-0.0132407 0.164048 -0.012311 +-0.0415061 0.0620057 0.0410722 +-0.0657901 0.128396 0.0470862 +0.0282252 0.0760107 -0.0227881 +-0.0701785 0.136914 0.0477863 +0.03413 0.0822192 0.0406334 +0.0609039 0.0609671 0.0121585 +-0.0515277 0.136697 0.0258426 +-0.00994091 0.089177 -0.0367642 +0.0451266 0.0727442 0.0219703 +0.0336533 0.110026 0.0294894 +-0.0721725 0.156265 0.0135984 +0.0312336 0.051167 -0.0107736 +-0.0023355 0.0926921 -0.0342848 +-0.0524965 0.0790864 0.0437156 +-0.0095237 0.0431051 0.0494016 +0.000300907 0.0626948 -0.0340909 +-0.0905968 0.140629 0.0221693 +-0.00800869 0.0388567 -0.00527149 +-0.0584939 0.0847167 0.0439692 +-0.0635243 0.0334646 -0.00419693 +-0.090351 0.14066 0.0261698 +-0.0588327 0.0911696 -0.0205864 +-0.020414 0.0541289 0.0465389 +-0.056688 0.067746 -0.0120827 +-0.0344045 0.152028 -0.00248634 +-0.0154988 0.114109 0.0392017 +-0.0384878 0.168246 0.00236894 +-0.0115711 0.100192 -0.0241483 +-0.0167308 0.0657547 -0.0377116 +-0.0466962 0.147986 -0.00319779 +-0.0926613 0.122825 0.0414622 +0.0312237 0.0871647 -0.0198177 +-0.0257476 0.0682496 -0.0344079 +-0.0524537 0.0504524 0.0306643 +-0.0768211 0.0804727 0.0355147 +-0.00449363 0.0456798 0.0470573 +0.0418422 0.0690449 -0.00578965 +-0.0262667 0.110544 -0.0190457 +-0.00251293 0.105882 0.0441369 +-0.0707082 0.0395895 0.000643319 +0.0128917 0.127573 0.0272919 +-0.0354687 0.054727 0.0384538 +0.00920102 0.0837298 -0.0322138 +0.0094791 0.0347704 0.0365664 +-0.0435038 0.0438236 0.0424673 +-0.0551839 0.140262 -0.00246039 +0.00523902 0.0341335 -0.0189244 +0.0273731 0.0578707 -0.0207586 +0.0119495 0.129938 0.00409466 +-0.0494983 0.102885 0.0411106 +-0.0370447 0.0379826 0.045213 +0.0150108 0.0349639 0.0393317 +0.0345233 0.0498189 0.0314944 +-0.0153828 0.128676 0.0170423 +-0.0618725 0.160013 -0.0255862 +-0.0525544 0.0504168 0.0256484 +-0.073344 0.0672327 0.000494062 +0.0393875 0.0460438 -0.00485579 +-0.0152754 0.103231 -0.0233341 +-0.0753549 0.104884 0.0361423 +0.0108274 0.0362708 -0.0225637 +0.0342152 0.0862629 0.0407864 +-0.088758 0.143311 0.0121502 +-0.0572353 0.0465198 -0.0043437 +0.0198267 0.035157 0.00555798 +0.0261922 0.0507168 -0.0207207 +0.0268986 0.0357578 0.0211357 +-0.0349846 0.0837189 -0.0236297 +-0.0222119 0.158173 -0.00418672 +0.024391 0.115338 0.0336864 +-0.0200061 0.124102 0.0256765 +-0.069632 0.0719472 -0.0104624 +-0.0322859 0.0792627 -0.0305329 +-0.0506516 0.033429 -0.00887801 +-0.0358626 0.101452 -0.0219425 +0.0293657 0.0447288 -0.00609588 +-0.0662305 0.0339335 0.0109932 +-0.00786973 0.104508 -0.0230207 +-0.0712429 0.177886 -0.0560058 +-0.00159432 0.129182 0.0263815 +-0.0283933 0.0831937 -0.0356194 +0.0443268 0.0511334 0.0322609 +-0.0318469 0.0958266 -0.0236233 +0.0205346 0.0937418 -0.0232686 +-0.012793 0.0813325 -0.0389447 +-0.0235889 0.0983837 -0.0242804 +-0.062496 0.105649 0.040196 +-0.0194646 0.0347564 0.0483645 +-0.0124518 0.038713 0.0303489 +-0.0444408 0.0335855 -0.0133031 +-0.00148369 0.0732377 0.0582942 +-0.0837769 0.153466 0.0110188 +-0.0898767 0.135147 0.0252168 +0.0369605 0.105409 -0.00483089 +-0.0255274 0.113962 0.0353265 +-0.0539587 0.0338764 0.0242313 +-0.0789197 0.104773 0.0326412 +0.0105421 0.118176 -0.0153416 +-0.0256953 0.0385914 0.0331228 +-0.0336328 0.126783 0.00457249 +-0.0470116 0.0710509 0.0409961 +-0.0930389 0.129675 0.0242521 +-0.0464764 0.0861628 0.0446798 +-0.0561893 0.159558 0.00559608 +-0.0091854 0.130144 0.00917512 +-0.0798951 0.0840617 -0.00859358 +-0.0336645 0.0339705 0.0230467 +0.00935764 0.0539048 -0.0300706 +-0.0831098 0.0777207 0.0215128 +-0.0470469 0.155045 0.00906939 +-0.0135887 0.169514 -0.0234669 +0.0418337 0.0395215 0.00781447 +-0.0276517 0.15535 -0.00385533 +-0.0201931 0.18164 -0.0152257 +-0.0335046 0.177862 -0.00863199 +0.0345014 0.0513521 0.0321623 +-0.0804527 0.143139 -0.00181198 +-0.0816965 0.144555 0.000152955 +0.0607459 0.0623413 0.0091502 +-0.0779458 0.175786 -0.0452228 +-0.0577187 0.146758 0.0323537 +-0.0403111 0.127303 0.0168527 +0.0204871 0.0934146 0.0476927 +0.00588424 0.100173 -0.0220733 +-0.00768539 0.0584014 -0.0338334 +-0.0447099 0.069553 -0.0165571 +-0.0287391 0.0620637 -0.0274208 +0.0157473 0.0947545 -0.0243195 +-0.063441 0.156071 0.0225051 +0.00824182 0.0753956 -0.0338579 +0.00561249 0.0927088 -0.0322048 +-0.0475077 0.0732702 0.0416223 +0.0145005 0.11127 0.0394252 +0.00450182 0.0413372 0.0458645 +0.00631667 0.061015 -0.0309472 +-0.0794763 0.0926775 0.0349659 +-0.0718543 0.111061 0.0453722 +-0.0891984 0.129697 0.0434765 +0.0151955 0.129241 0.0138359 +0.0236821 0.0824052 -0.0254011 +-0.0015019 0.110031 0.0427805 +-0.0215043 0.109928 0.0403615 +-0.0939826 0.118759 0.0192971 +-0.0624131 0.11535 0.0394932 +-0.0833865 0.140392 0.00124854 +-0.0465624 0.124393 -0.00950278 +-0.0146513 0.0496822 -0.0311895 +-0.0641648 0.15616 0.0149932 +-0.0729217 0.126742 -0.00866826 +-0.0253625 0.126177 0.010523 +0.0277777 0.108556 -0.0130095 +-0.0788017 0.0846357 0.0359502 +-0.0247742 0.180145 -0.00956802 +0.0188129 0.101666 -0.0216414 +0.00516264 0.131576 0.00874185 +-0.0633822 0.164679 -0.0305938 +-0.0375944 0.116238 -0.0149818 +0.0194959 0.111012 -0.0156283 +-0.0342918 0.0780403 -0.0245107 +-0.0861846 0.083225 0.00647736 +-0.0161451 0.166792 -0.0199866 +-0.0872007 0.147399 0.00826035 +0.0567195 0.0508531 0.00818949 +-0.0594966 0.100149 0.0427407 +-0.0584967 0.0761953 0.0427061 +-0.0218317 0.124906 0.0220793 +-0.00826101 0.0384472 0.0115633 +-0.0383343 0.121902 -0.0109317 +-0.0521665 0.136903 -0.000627156 +-0.0215605 0.0383186 -0.00194746 +0.0481264 0.060275 -0.00442661 +0.0154998 0.108504 0.0406925 +-0.0729927 0.08468 0.0400334 +0.0156625 0.0631375 0.0506866 +-0.0244911 0.101622 0.043846 +-0.0464946 0.131544 0.00524728 +-0.0496757 0.0678792 -0.0135965 +0.0429479 0.0845778 -0.00579145 +-0.0889655 0.0969901 0.0204055 +-0.0641121 0.152654 -0.0038572 +0.0409571 0.0971716 0.0271682 +-0.0171621 0.0382418 0.0171791 +0.00646008 0.118492 -0.0156628 +0.0328247 0.054955 0.0367483 +-0.0843958 0.13208 -0.00165487 +-0.0521768 0.0517998 0.0286453 +0.0415397 0.0690275 -0.00677 +-0.00193982 0.12966 0.0247961 +-0.0686037 0.157344 -0.00409918 +-0.0332546 0.12417 0.0223928 +-0.0762473 0.0920177 -0.013581 +0.0392491 0.0672477 0.0338308 +-0.0841314 0.0776758 0.00449933 +-0.0638136 0.0680952 0.0346563 +-0.00579523 0.10109 0.0444886 +-0.0717812 0.166615 -0.0459981 +-0.0474379 0.0355948 -0.0152688 +0.0581028 0.0523658 0.0121806 +-0.0787218 0.0967552 0.0354897 +-0.0561139 0.139571 -0.00370722 +-0.0605064 0.0394509 -0.00845033 +-0.0890965 0.111935 0.0113594 +-0.0579064 0.158452 0.00407429 +0.0204977 0.0920241 0.0479175 +-0.0224928 0.0988548 0.044702 +-0.0289733 0.124361 0.000543811 +-0.00750575 0.0457415 0.0474579 +0.043354 0.053395 -0.00666154 +0.0230359 0.124766 0.00534006 +-0.0773785 0.174262 -0.0420678 +-0.0273153 0.0387018 0.0344821 +-2.85469e-05 0.0391507 -0.00580542 +-0.0653748 0.149517 -0.0319115 +-0.0386792 0.0336259 0.00249375 +-0.0655034 0.106997 0.0388261 +0.0203192 0.0679349 -0.0283363 +0.0395784 0.104495 -0.000545476 +-0.0239953 0.114912 -0.0156465 +-0.0660228 0.160133 -0.0132914 +0.0397718 0.0940445 0.031303 +-0.0719497 0.132579 -0.00806719 +-0.0634812 0.0760895 0.041143 +-0.0484925 0.14723 -0.00252533 +0.054748 0.0690996 0.0027667 +-0.0723713 0.156038 0.0237254 +0.034267 0.0613198 -0.014809 +-0.0483876 0.0348751 0.0437589 +-0.05979 0.0839541 -0.0202843 +0.0501248 0.0723145 0.00745971 +0.0347025 0.105449 -0.00966587 +-0.0352566 0.0382472 -0.0299775 +0.0470963 0.045623 0.0254581 +-0.0855435 0.108961 0.00733555 +-0.0206804 0.112216 -0.0188434 +0.00523056 0.0796312 -0.0340387 +-0.0465619 0.047561 -0.00986957 +-0.033587 0.0348608 0.0452447 +-0.0202523 0.125914 0.000840735 +-0.0501104 0.138566 0.0193811 +-0.0264363 0.125919 0.0130719 +-0.0691022 0.159548 -0.0519447 +-0.0245412 0.057448 -0.0303989 +-0.046121 0.0336712 -0.000864342 +-0.0742841 0.155582 0.00848891 +-0.0298186 0.154044 -0.00457012 +0.0302323 0.0969553 -0.0166472 +0.0266877 0.104744 0.0387392 +-0.0843417 0.109004 0.0243603 +-0.0496377 0.143234 0.0104059 +0.0174929 0.0962345 0.0475335 +0.0450677 0.0917906 0.015163 +0.0374841 0.076757 0.0366434 +-0.0215406 0.0711033 0.0513847 +-0.0282153 0.125116 0.00364014 +-0.0284773 0.177212 -0.00607735 +-0.0204956 0.109916 0.0405701 +-0.0784664 0.0703272 0.00666705 +-0.0031698 0.0384355 0.0180459 +-0.0655548 0.153788 -0.00146085 +-0.0229763 0.0945367 -0.0302901 +-0.0192339 0.166857 -0.012207 +-0.0866345 0.094046 0.00237751 +-0.0759405 0.177963 -0.0471435 +0.0442559 0.0973532 0.00916034 +-0.071904 0.103673 -0.0126696 +-0.00666902 0.0541115 -0.0328784 +0.0144947 0.105783 0.0434399 +-0.029312 0.0383797 -0.00726542 +0.0562076 0.0536042 0.00319408 +-0.0829319 0.114342 0.0473556 +-0.069928 0.113662 -0.00916203 +-0.080837 0.120705 -0.00484118 +-0.0680148 0.177312 -0.0499759 +-0.077886 0.0811556 -0.0096326 +0.0350121 0.104701 0.0314746 +-0.0571796 0.0582032 0.0181974 +-0.0932449 0.120197 0.0372886 +-0.0536204 0.0647024 -0.00963527 +0.00250481 0.0870342 0.0569864 +-0.0802055 0.0754813 0.024867 +-0.062996 0.0444935 0.0306768 +-0.00402267 0.0975528 0.0526596 +-0.0883984 0.103684 0.0133796 +-0.0637361 0.133925 0.0394224 +-0.00469624 0.0613427 -0.0349676 +-0.0570417 0.148685 -0.00168484 +-0.062221 0.119852 0.0434664 +-0.0361997 0.0483313 -0.0162949 +0.00950265 0.0517655 0.0513753 +0.00822226 0.0366869 -0.011267 +-0.0383571 0.0360437 0.0112202 +-0.0890914 0.0956431 0.0204208 +-0.0256081 0.0408536 -0.0292407 +0.0374062 0.0397236 -0.000139169 +-0.094388 0.124185 0.0232804 +-0.0615536 0.151288 -0.000477545 +-0.0674057 0.140585 -0.00814985 +-0.0913588 0.113353 0.0143394 +-0.0162447 0.115598 -0.0164334 +-0.00395415 0.0388026 0.0284096 +0.0272466 0.0774691 -0.0233342 +0.0337889 0.112917 0.0264745 +-0.0342171 0.0808501 -0.0245506 +0.0395831 0.0953666 0.0310696 +0.0424402 0.100042 0.00119598 +0.0588348 0.0704992 0.0161593 +0.0129551 0.034265 -0.00247291 +-0.0884357 0.140552 0.0112052 +-0.0545209 0.0388646 -0.0108239 +-0.00760223 0.0406064 -0.0259713 +-0.0671149 0.0634665 0.0239226 +-0.0571873 0.13241 -0.00599886 +-0.0652367 0.0347413 0.0281307 +-0.0733817 0.154066 -0.0309045 +-0.00253313 0.0428829 0.047136 +-0.0768102 0.145866 -0.00487051 +-0.0675702 0.166262 -0.0225175 +-0.0425031 0.0662262 0.0410651 +-0.0579829 0.147131 -0.0018633 +0.0230336 0.049071 0.0400904 +-0.0829949 0.0843947 0.0302754 +-0.0147977 0.0813547 -0.0393324 +-0.015272 0.0385359 0.0263224 +-0.0764401 0.163184 -0.0180705 +-0.00855639 0.121127 -0.0123669 +-0.018702 0.0459339 0.0516744 +-0.0274925 0.0577126 -0.0264141 +-0.0571934 0.155255 0.0174937 +-0.0620081 0.0469936 0.00367346 +-0.010275 0.170544 -0.0261793 +0.0537831 0.0477401 0.0192041 +0.0402375 0.104169 0.000177419 +0.0289937 0.118368 -0.00105099 +-0.039498 0.118035 0.0314 +0.0367284 0.0875226 0.0373878 +0.0431893 0.0764104 0.0272109 +0.0404723 0.0752779 0.0321515 +-0.071418 0.176406 -0.0454588 +-0.0570823 0.138706 -0.0047975 +-0.0666306 0.0689692 -0.00898899 +-0.0691773 0.0628504 0.020491 +0.0144923 0.104443 0.0448169 +-0.0227823 0.0798633 -0.0386035 +0.0278587 0.0463325 0.0365003 +-0.00850193 0.0391005 0.0344133 +-0.0677578 0.16996 -0.0326164 +-0.0367265 0.0725274 -0.0180009 +-0.0681226 0.115765 0.0506532 +-0.0824105 0.154634 0.0158747 +-0.0197211 0.109971 -0.0204733 +-0.0626214 0.149057 -0.0155813 +-0.0414792 0.111213 0.0366505 +0.0570161 0.0508675 0.0161892 +-0.0934473 0.129632 0.0182372 +-0.0463999 0.150559 -0.00488163 +-0.0823822 0.144566 0.00117046 +-0.0310391 0.0892178 -0.0256627 +-0.065854 0.172894 -0.0463248 +-0.069909 0.0416997 0.00317022 +0.0312116 0.11742 0.0240751 +-0.0118175 0.0387383 -0.00407256 +0.01303 0.126665 0.0287751 +-0.0440446 0.129866 0.0080667 +-0.0797747 0.106127 0.0313842 +0.00451933 0.0800063 0.0560543 +0.00739517 0.116252 -0.017256 +0.0277812 0.063284 0.0436054 +-0.0569949 0.126695 -0.00683103 +-0.00960244 0.0420101 -0.025949 +0.0084074 0.123136 -0.0106652 +-0.0428042 0.0338676 0.0265755 +-0.0325056 0.0760815 0.0412743 +-0.0386562 0.0591953 -0.0114762 +-0.0405007 0.0690879 0.0417151 +0.0419622 0.102841 0.00417469 +-0.047644 0.121343 -0.0122933 +-0.0729009 0.105047 -0.011511 +-0.0927931 0.126937 0.0282668 +-0.0656106 0.156261 -0.00734027 +-0.0802248 0.0719997 0.00554401 +-0.00476651 0.0755803 -0.0368945 +-0.0779912 0.139819 -0.00526751 +-0.0864372 0.14049 0.00618869 +-0.0427881 0.157985 0.00470835 +-0.0697618 0.112838 0.0482345 +-0.0800017 0.0786467 -0.00556567 +-0.00794001 0.0994214 0.049751 +0.00252738 0.0716721 0.0561852 +0.0244581 0.0366925 -0.000851561 +-0.0618581 0.153131 0.03333 +-0.0730605 0.177343 -0.046073 +-0.0670133 0.0791411 0.0413099 +-0.00657967 0.0361819 -0.0249969 +0.0332241 0.115988 0.0034015 +-0.0314758 0.118803 -0.0116777 +-0.0714107 0.144356 -0.0151846 +-0.0414986 0.120686 0.028403 +0.0126257 0.034994 0.0315996 +-0.0344792 0.0382691 -0.00267158 +-0.0696814 0.0354769 0.0114289 +-0.0454423 0.0336713 -0.00255197 +-0.0611633 0.0698433 0.0372322 +-0.0520495 0.147795 0.0183962 +0.0467993 0.0745196 0.0137565 +-0.00850445 0.0619527 0.0559735 +-0.0157643 0.0353272 -0.0263783 +-0.0915821 0.144732 0.0201581 +-0.0274038 0.123285 0.0215594 +-0.0667152 0.0419014 -0.00231002 +-0.0408646 0.104225 -0.0205494 +-0.092402 0.129661 0.0272343 +-0.0876501 0.0954829 0.0054069 +-0.063731 0.0751942 -0.0171769 +-0.016949 0.0909918 -0.0366612 +0.0216857 0.0374896 0.0372608 +-0.0733019 0.081934 0.0390113 +-0.033579 0.117839 -0.0126505 +0.00291054 0.0385481 0.0460492 +-0.0648688 0.0938916 -0.0183701 +-0.0931568 0.120191 0.0362904 +-0.0105693 0.129741 0.0187791 +-0.0330922 0.108613 -0.0189923 +-0.0867528 0.121192 -0.00171893 +-0.0398856 0.0351398 0.0419144 +-0.0500753 0.0599861 0.0335137 +-0.0362769 0.163827 -0.00170672 +-0.0161498 0.040504 0.0518582 +0.0390213 0.100628 0.0284944 +-0.0525203 0.0581461 0.0261597 +-0.06389 0.0397139 0.0154457 +-0.0114781 0.0589986 0.0537512 +-0.00335674 0.0424141 0.0475525 +-0.0200738 0.0389483 0.0357554 +0.0112326 0.0738116 -0.0315294 +0.0128141 0.0504969 0.0481838 +-0.0548971 0.104115 -0.019193 +-0.0887169 0.125354 0.00227396 +-0.0712974 0.0669397 0.02531 +-0.0542529 0.0545999 -0.00539104 +-0.0538048 0.159768 -0.00183632 +0.0171004 0.120495 -0.00987579 +0.00927611 0.0667424 -0.0314011 +-0.0928802 0.118867 0.0402859 +-0.0167191 0.0613704 -0.0359554 +-0.0515886 0.0460739 0.0176829 +-0.0182635 0.180096 -0.0244849 +-0.0014996 0.0938866 0.0553603 +-0.0518826 0.071407 0.0396894 +-0.0529375 0.0335557 0.00508499 +-0.0597956 0.0925385 -0.0196216 +-0.0869937 0.104951 0.00838372 +0.0481666 0.0731681 0.01124 +-0.00827202 0.0394277 0.049182 +-0.0607911 0.0810335 -0.0194373 +0.000667625 0.0985049 0.0513232 +0.00310867 0.129093 0.0266332 +0.0296013 0.119582 0.02204 +-0.0285282 0.0378067 0.0260568 +-0.0367133 0.0353138 0.0122122 +-0.0468392 0.132859 0.0202702 +-0.0139293 0.126622 0.0263262 +-0.0191687 0.171226 -0.0215143 +0.0205957 0.0394417 0.0417168 +-0.0692562 0.143958 0.0438704 +-0.037992 0.128312 0.00883318 +-0.0237829 0.0770195 -0.0382449 +-0.0940603 0.120098 0.0152926 +-0.0545976 0.139948 -0.00193829 +-0.0869674 0.103645 0.0213508 +-0.0689616 0.177928 -0.0580053 +-0.079103 0.0731629 0.0235749 +-0.0563149 0.0534289 -0.00138708 +-0.00430179 0.125159 -0.00873129 +-0.0217957 0.119089 -0.0120655 +0.047344 0.0721054 0.0183678 +-0.0206715 0.0524183 -0.0304469 +-0.0292161 0.178518 -0.014988 +-0.0567221 0.0575063 0.0096837 +0.00796175 0.131494 0.0140347 +-0.0163209 0.175704 -0.0185048 +0.0207575 0.0645289 0.0475184 +-0.0365005 0.0676756 0.0415398 +-0.0504985 0.079101 0.0439987 +0.0338763 0.0978118 -0.0135516 +-0.00887371 0.0385959 0.0022117 +-0.0644851 0.0755505 0.0404189 +-0.0877008 0.0923103 0.0248018 +-0.082219 0.074838 0.0095308 +-0.0554964 0.111163 0.0367062 +0.0260064 0.0465031 -0.0156607 +-0.0633419 0.155193 -0.0376165 +-0.0732519 0.0648877 0.00719031 +-0.0769992 0.155545 -0.0179052 +0.0377103 0.0955073 -0.00984226 +0.0174667 0.122816 0.0304302 +-0.0366198 0.0505806 -0.010756 +-0.0144968 0.0472352 0.0484474 +0.00848126 0.0936832 0.0524446 +0.0197906 0.106497 -0.0168156 +-0.0930778 0.121531 0.0352811 +-0.0613674 0.169388 -0.0565896 +-0.0301276 0.038694 -0.0132786 +-0.0662928 0.044787 0.00771957 +-0.0195138 0.0448322 0.0525308 +-0.0886025 0.0887878 0.00646717 +0.0380432 0.109702 0.0166041 +-0.024753 0.0755695 -0.0376923 +-0.089639 0.0983559 0.0164014 +0.0373474 0.083464 0.036489 +0.0200866 0.0429332 -0.0206714 +-0.0362408 0.12776 0.00652715 +-0.0114267 0.182822 -0.0276369 +0.033977 0.115595 0.0137221 +0.016644 0.0381609 -0.019755 +-0.0160134 0.0959893 0.0521651 +-0.0194344 0.115555 -0.0163687 +0.00996296 0.0988804 -0.0226985 +0.0207021 0.0348049 0.000449352 +-0.0655859 0.0333717 0.000880867 +-0.0387964 0.0870429 -0.0222174 +-0.0365713 0.0483594 -0.015218 +0.0310154 0.110075 0.0327245 +-0.0376939 0.0665912 -0.0149459 +0.0401046 0.0466866 0.0313873 +-0.0110827 0.102149 -0.0241692 +0.00841559 0.0375405 -0.0234702 +0.0448731 0.0945767 0.0111579 +0.0145335 0.034759 0.0322003 +-0.059392 0.149673 0.0353015 +0.000291607 0.0641338 -0.034343 +0.00429568 0.0640516 -0.0331969 +0.0450422 0.0931924 0.0131619 +-0.00448954 0.122402 0.0358368 +-0.0326251 0.166779 -0.00520273 +-0.0566266 0.157159 0.00899778 +-0.0131915 0.184654 -0.0268832 +0.0372616 0.0915229 0.0364203 +0.0164447 0.0548852 0.0482217 +-0.0124867 0.11689 0.0385307 +0.00769138 0.039029 0.0323953 +-0.0150057 0.127967 0.0215456 +-0.0860589 0.113009 0.00328149 +-0.0718647 0.175275 -0.0427173 +0.000497507 0.112823 0.0420607 +-0.0832204 0.140695 0.0442806 +-0.0316065 0.039499 -0.0303181 +-0.0689448 0.129685 -0.00899835 +-0.020775 0.0742803 -0.0390259 +-0.0727533 0.0995199 0.0393322 +0.0032483 0.071196 -0.0343078 +-0.0400491 0.154783 -0.00892819 +-0.0345081 0.0832025 0.0425625 +-0.0522702 0.141391 0.00017327 +0.0278273 0.0795375 0.0455649 +0.0269552 0.122658 0.0110745 +0.0348501 0.112087 -0.000408122 +-0.0694924 0.0846972 0.0421957 +-0.0861949 0.139089 0.00320204 +-0.0823568 0.0802033 -0.00152209 +0.00894636 0.0644445 0.055029 +0.0266313 0.0563972 -0.0207832 +0.023933 0.0390696 0.0352942 +-0.0656041 0.136814 0.0420793 +0.0407616 0.105622 0.0111617 +0.058143 0.0551653 0.0211996 +-0.0138904 0.0897489 -0.0373664 +0.0117209 0.130528 0.015412 +-0.0181782 0.126773 0.00187925 +0.039239 0.0589589 -0.00512401 +0.0118091 0.0576645 0.0520801 +0.0101538 0.113447 -0.018237 +0.00107085 0.0391982 -0.0112505 +-0.0726176 0.0747594 -0.0108396 +-0.0504976 0.104261 0.040368 +-0.06047 0.0776106 0.0424994 +-0.0726162 0.166612 -0.0440006 +-0.0345099 0.109779 0.0372255 +0.0371511 0.110987 0.0177157 +-0.0594963 0.1084 0.0386802 +-0.0218558 0.120004 -0.0110164 +-0.0726436 0.159626 -0.0369279 +0.0162217 0.120841 -0.0102336 +0.0462172 0.0729792 0.0194263 +0.0503974 0.0595708 0.0303584 +-0.069034 0.139725 0.045939 +0.0222487 0.0359069 0.0273161 +-0.083623 0.0857135 0.0294569 +-0.0427492 0.0421438 -0.0223063 +-0.0635342 0.161573 -0.0210278 +-0.0632778 0.158345 -0.0436013 +0.049468 0.0445737 0.00523787 +-0.00949755 0.0856659 0.0574293 +0.0137231 0.129888 0.00901711 +-0.0849311 0.0980032 -0.00158096 +0.0094116 0.0360543 -0.0227822 +0.029005 0.115546 0.0303821 +-0.0136476 0.0481469 -0.0303471 +0.0203578 0.0985304 -0.0223097 +0.0386883 0.0767039 0.0348633 +0.0505119 0.0665023 0.0275359 +-0.0236064 0.038163 0.0249493 +-0.0662075 0.060375 0.00901189 +-0.0309847 0.0381919 0.0323901 +-0.0577888 0.0439091 -0.00660137 +0.0319539 0.0795563 0.0427459 +-0.0888256 0.100978 0.0104077 +-0.0149675 0.0986909 -0.0245721 +0.0080932 0.126458 -0.00628099 +-0.0629819 0.128219 -0.0083429 +0.00592947 0.0982847 -0.0240623 +-0.0791963 0.120405 0.0507691 +0.0385114 0.0583288 0.0314228 +0.0327231 0.116168 0.00178038 +-0.0838537 0.110728 0.0339922 +-0.0559583 0.0478125 -0.00439058 +-0.0864154 0.152983 0.0204471 +-0.0846489 0.0778245 0.0165124 +-0.0244888 0.120706 0.0294035 +-0.0565129 0.051223 0.00779351 +-0.00649552 0.111418 0.0421995 +-0.0400289 0.0336199 0.00584373 +0.00964377 0.120482 -0.0138306 +-0.0819198 0.126566 -0.00507678 +-0.023502 0.180157 -0.0112302 +-0.033578 0.0448331 0.0458046 +-0.0771053 0.177652 -0.0476237 +-0.0244946 0.0357757 0.0532784 +0.044574 0.0903504 0.0211613 +0.0317623 0.0938577 -0.0173357 +-0.0767292 0.0860417 0.0380634 +-0.0291365 0.165225 -0.016186 +-0.0558064 0.0562012 0.00862658 +-0.0197239 0.0612902 -0.0351879 +-0.0624763 0.163084 -0.0515885 +-0.00157869 0.0347285 -0.0237137 +0.0250862 0.0741055 0.0468243 +-0.00657564 0.0346831 -0.0243352 +-0.0927326 0.12419 0.0292678 +-0.0642565 0.0418897 0.0384072 +0.0074848 0.0976824 0.0494394 +-0.0324803 0.0436623 0.0489836 +0.0309993 0.0686673 0.04128 +-0.00959045 0.0337105 -0.0233226 +-0.0692347 0.176505 -0.0570351 +-0.0524975 0.111152 0.036921 +0.0434926 0.056984 0.0319757 +-0.0448698 0.104232 -0.0209188 +-0.0689139 0.148999 -0.0367601 +-0.0366298 0.0344715 0.0361774 +-0.0772403 0.0846603 0.0372078 +-0.0866727 0.139248 0.0421058 +-0.0692038 0.156713 -0.0519425 +-0.0286406 0.154979 -0.0065778 +-0.0516452 0.119776 0.0340339 +-0.0604002 0.0591276 0.0185111 +-0.0789005 0.172846 -0.0440952 +-0.0733588 0.0659821 0.00263497 +-0.0644533 0.0351399 0.0400818 +0.0349985 0.0619413 0.0382049 +-0.0116935 0.0584778 -0.0346471 +0.0397873 0.104095 -0.000789682 +0.0261507 0.0923065 -0.0217116 +-0.0643301 0.156694 -0.0446094 +0.0312874 0.108108 -0.0105276 +-0.0718754 0.119424 -0.00835095 +-0.0897483 0.0929448 0.0154361 +-0.0322408 0.125589 0.00213325 +0.0193474 0.0551603 -0.0276297 +-0.0355381 0.0335618 -0.0245193 +-0.0323633 0.175433 -0.0143069 +0.0591153 0.0705615 0.014025 +-0.0685156 0.168032 -0.0539935 +-0.0408127 0.127672 -0.0010356 +-0.070932 0.129672 -0.00889239 +-0.0315034 0.0717826 0.0402663 +0.0139874 0.0924572 -0.0278842 +-0.00310937 0.0390986 -0.00637767 +-0.0315484 0.0749387 -0.030532 +-0.0658202 0.0597996 0.0132017 +-0.074125 0.079542 -0.012586 +-0.042758 0.0336059 0.00168497 +-0.0376274 0.0534153 -0.0106276 +-0.0609006 0.106856 -0.0171292 +-0.0465015 0.112315 -0.0168133 +-0.00832405 0.129364 0.00227931 +0.000993844 0.0989182 -0.0247915 +-0.092775 0.128304 0.0272531 +-0.0024916 0.073257 0.0585379 +-0.0354714 0.0959602 0.0437897 +-0.0798628 0.122191 -0.00554615 +-0.0379836 0.153062 -0.00765575 +-0.0574689 0.0413481 0.0461934 +-0.0681352 0.166058 -0.0212868 +-0.0655788 0.037063 0.0157921 +-0.0104996 0.03868 -0.00189881 +0.00192546 0.0390395 0.0275923 +-0.0598545 0.0467827 -0.000327155 +-0.0510269 0.136724 0.0245519 +-0.0626706 0.0343644 0.032487 +0.0368248 0.11128 0.0190303 +0.047871 0.0733255 0.0156276 +-0.0291332 0.059286 -0.0234112 +-0.0554108 0.0344947 0.0391385 +-0.0892997 0.0956389 0.0174174 +-0.0880049 0.11182 0.00834875 +0.0309816 0.102484 -0.0145328 +0.0183118 0.0665429 -0.0287115 +0.00448658 0.111391 0.0416751 +-0.0902127 0.122664 0.0052855 +-0.0900898 0.119956 0.00430245 +-0.026505 0.174198 -0.0103819 +-0.0214492 0.0963545 -0.0261739 +0.0574071 0.0691343 0.00477569 +-0.0755392 0.154957 0.000803149 +-0.0205078 0.049871 0.046386 +-0.0302748 0.116055 -0.0148216 +0.0522643 0.0732287 0.00987093 +-0.0353184 0.153664 -0.00782609 +-0.0468563 0.101377 -0.0215448 +0.0252483 0.0713214 0.0452679 +-0.01624 0.0963836 -0.0301721 +-0.0374901 0.0505918 0.0391881 +-0.000727236 0.069749 -0.034387 +-0.0295801 0.0368886 0.052851 +0.0174262 0.0350846 0.00327627 +-0.0408044 0.0884947 -0.0224789 +-0.0540496 0.0546601 0.0106814 +-0.0841802 0.136658 0.046769 +0.0265654 0.0388814 0.0291555 +-0.0365515 0.115187 -0.0158874 +-0.0746646 0.0981736 0.0384691 +-0.0461647 0.162128 -0.00806097 +-0.0838755 0.106118 0.000396239 +-0.0634664 0.0345901 0.0373297 +-0.0487026 0.0708482 -0.0151225 +-0.0490488 0.150196 -0.0040443 +-0.0454995 0.107082 0.0401134 +0.015502 0.109895 0.0399577 +0.0339767 0.0796167 -0.0178174 +-0.064903 0.110966 -0.0133006 +-0.0884279 0.0874564 0.00647862 +0.0303366 0.0352283 0.0150252 +-0.0476647 0.15359 0.00991943 +0.0491492 0.0460297 0.00132033 +0.0571336 0.0721807 0.0116675 +0.0423629 0.0398964 0.0150374 +-0.0075036 0.12108 0.0363047 +-0.0304017 0.0791045 -0.033577 +-0.0707511 0.0654954 0.0231537 +-0.0344941 0.171246 -0.000779029 +-0.0516393 0.0618882 -0.0103104 +0.0364959 0.064355 -0.0127735 +0.0258636 0.0344283 0.00929921 +-0.06094 0.0410414 0.0167056 +0.0388283 0.102661 -0.00481845 +0.00951185 0.0560842 0.0527429 +0.0250009 0.0629104 -0.0235842 +-0.0883814 0.100948 0.00841627 +-0.0896675 0.150196 0.0231327 +-0.0502775 0.0487457 0.0176637 +-0.0574379 0.0576833 0.0026039 +-0.0889127 0.145822 0.0300758 +0.00105802 0.0387062 0.0241019 +0.0432951 0.0987146 0.0161577 +-0.00981592 0.123797 -0.00918874 +-0.0235467 0.119499 0.0316537 +-0.0203743 0.127028 0.00506457 +-0.0546314 0.138445 -0.00241154 +0.0144977 0.11819 0.0360011 +-0.0468871 0.150669 0.00925072 +0.00310943 0.110155 -0.0202398 +-0.0315082 0.0817114 0.0416031 +-0.0361907 0.169669 -0.0137878 +-0.0266475 0.0904555 0.0474235 +0.00393808 0.131671 0.0154244 +-0.0594984 0.109765 0.0377884 +-0.0632488 0.167828 -0.0435907 +0.02054 0.116646 0.0351499 +0.046015 0.0862238 0.00817489 +-0.0472066 0.033531 -0.00644781 +-0.0382901 0.126893 -0.00216373 +0.0358746 0.0755562 -0.0137901 +-0.00915886 0.0385694 0.027547 +-0.083022 0.132397 -0.0026267 +-0.0665414 0.155108 -0.00331096 +-0.0344162 0.168264 -0.00253059 +-0.0891077 0.101031 0.0163881 +-0.0165765 0.119912 -0.0109781 +0.00442197 0.11861 -0.0157775 +-0.0234514 0.0892984 0.0527307 +0.0565327 0.0523952 0.0217798 +-0.0515006 0.111173 0.0369493 +-0.0218128 0.183092 -0.0122978 +0.0044132 0.0376001 -0.0242202 +-0.0654801 0.0675388 0.0330326 +-0.010497 0.0717087 0.0563199 +-0.065424 0.0399796 0.0326661 +-0.0228869 0.180156 -0.0121058 +0.0203379 0.125091 8.19329e-05 +-0.0802772 0.089954 0.0344521 +-0.0772906 0.165906 -0.0257637 +-0.012412 0.0382658 0.0163183 +0.0102284 0.0616887 0.0533551 +-0.00987882 0.105925 -0.0227673 +-0.00348977 0.122389 0.0359468 +-0.0759061 0.0675035 0.00967604 +-0.0414986 0.0874028 0.042497 +-0.0605969 0.06056 0.0225173 +0.0395569 0.0702481 -0.0107925 +-0.0329324 0.0638892 -0.016427 +-0.000943594 0.0381622 0.0205587 +-0.0338755 0.107095 -0.0200162 +-0.0125023 0.0486789 0.0487656 +0.0274856 0.0400248 0.0301572 +-0.0008153 0.10869 -0.0211159 +0.0343096 0.0419726 0.0279684 +-0.0247603 0.0865587 0.0527086 +-0.00553736 0.113796 -0.0185731 +-0.021633 0.035044 -0.0280533 +0.00828872 0.130472 0.0213052 +-0.0242184 0.0593353 0.0417104 +0.0288386 0.111536 -0.010211 +-0.0581339 0.0334069 -0.00670381 +0.037704 0.0574555 -0.00668675 +-0.0710158 0.13691 0.0483444 +-0.0305078 0.112529 0.0355647 +0.0343502 0.114842 0.0181324 +-0.0485971 0.0359097 0.00925535 +-0.0288479 0.0578621 -0.0233922 +-0.051497 0.0890197 0.045238 +0.0121456 0.0347039 0.0353715 +-0.0716902 0.155937 0.00211062 +-0.0790692 0.0804499 0.033529 +0.0545445 0.0589886 -0.00181806 +0.0529955 0.0716182 0.0219676 +-0.056511 0.121265 0.0393235 +0.032607 0.0527076 -0.00976892 +-0.0376644 0.0335909 0.0081569 +-0.0936994 0.128298 0.0232525 +-0.0809806 0.0720629 0.0115411 +-0.0239408 0.0886576 -0.0363455 +-0.0859344 0.107632 0.00736881 +-0.0277915 0.0782183 -0.0359607 +-0.0571511 0.0394305 0.0468685 +-0.0839381 0.0791399 0.0214982 +-0.0234217 0.0359155 0.0533704 +-0.0739011 0.106421 -0.010241 +-0.0567145 0.0334976 0.000765085 +-0.0241329 0.157302 -0.00905689 +-0.0128819 0.126866 -0.00238505 +-0.0250553 0.0707727 0.0450037 +-0.0444963 0.119293 0.0294103 +-0.0463222 0.0411097 -0.0132713 +-0.0451547 0.0437693 -0.0122411 +0.0475648 0.0553802 0.031711 +-0.0494965 0.11266 -0.0171746 +0.00314926 0.122256 -0.0116623 +-0.089161 0.137877 0.0251937 +-0.0171561 0.0387671 0.0311342 +-0.0659181 0.10388 -0.0158661 +-0.062107 0.163118 -0.0365927 +0.0444569 0.0444867 0.0259758 +-0.0206484 0.0464719 -0.0278809 +-0.0668387 0.144945 -0.0185544 +-0.0574928 0.102919 0.0421703 +-0.0655518 0.166572 -0.0275081 +-0.0339393 0.126307 0.017694 +-0.0176989 0.0554882 -0.03328 +0.012239 0.0794574 -0.0314827 +-0.0344963 0.094609 0.0443801 +0.0228685 0.123786 0.00100726 +-0.0920259 0.132307 0.0132318 +-0.0713267 0.169665 -0.0267525 +-0.081588 0.0788215 -0.00249997 +-0.0755712 0.102178 0.0364401 +-0.0482055 0.0335674 -0.00667883 +-0.0295069 0.109802 0.0378356 +-0.0819634 0.103331 0.0300688 +-0.0766364 0.0788383 -0.00918256 +-0.0472353 0.12392 0.0280317 +-0.0424858 0.064826 0.0410217 +-0.00749383 0.112788 0.0415528 +-0.0321607 0.174124 -0.015122 +-0.0148084 0.124344 -0.00565133 +-0.0630295 0.126909 0.044075 +-0.0122771 0.129643 0.0167063 +-0.0137469 0.0714346 -0.0382786 +0.0253964 0.0981715 0.0439168 +-0.0105339 0.100499 0.0452584 +-0.0909546 0.139232 0.0191849 +-0.0239226 0.16684 -0.0101968 +-0.00433796 0.0387886 -0.000752538 +0.00920046 0.0879669 -0.0320124 +-0.0404937 0.0662835 0.0416604 +-0.0569887 0.118401 0.0385929 +-0.0715396 0.0362187 -0.000138838 +0.0226226 0.0591926 0.0466634 +-0.0544937 0.112536 0.0358256 +-0.0843481 0.145997 0.00513587 +-0.022811 0.0756351 -0.0385829 +-0.0666897 0.0735998 -0.0145924 +-0.0404977 0.116683 0.0325662 +0.0032744 0.114489 -0.0193505 +0.00148054 0.0413996 0.0463959 +-0.0245078 0.0767611 0.0513331 +-0.0308625 0.101511 -0.0227041 +0.00533966 0.0345787 0.0412861 +-0.0774755 0.170095 -0.0341987 +-0.0650593 0.125632 0.048098 +0.0112751 0.0505364 0.0494832 +-0.0786212 0.0976351 -0.0095679 +-0.0726748 0.0647223 0.00565049 +-0.0350102 0.158094 0.00367693 +0.0175012 0.11539 0.036772 +-0.0205761 0.0350586 0.0512942 +-0.0408828 0.108487 -0.0195205 +-0.0324978 0.0661054 0.0396515 +-0.0860138 0.0845642 0.00148082 +0.00924462 0.0710839 -0.0326657 +-0.0573888 0.0342428 0.0302238 +-0.0809405 0.141759 -0.00181375 +0.0351408 0.0931106 -0.0145377 +0.0391769 0.106978 0.0201683 +-0.0378047 0.0342916 0.0307956 +-0.0614885 0.0932285 0.0449784 +-0.00750736 0.0561433 0.0534652 +0.0317881 0.0564278 0.038783 +-0.0258626 0.0378286 0.0139698 +-0.0515546 0.0445278 -0.00899667 +-0.010869 0.165486 -0.0158779 +-0.0297303 0.109983 -0.0184292 +-0.0469177 0.0346518 0.0071269 +-0.0286016 0.109083 -0.0194963 +-0.0109096 0.172768 -0.0212178 +0.00821291 0.0711477 -0.0331375 +0.00315167 0.10307 -0.0219554 +-0.0472567 0.132959 0.0215876 +-0.0825276 0.142074 0.0435561 +-0.0136058 0.093388 -0.035076 +-0.0179202 0.0385865 -0.0163394 +-0.0641268 0.0405801 0.0396199 +0.0124469 0.129111 0.00141235 +-0.0637038 0.0343279 0.0323025 +0.0354218 0.100763 0.0338403 +0.0121385 0.130422 0.0141392 +0.00281822 0.126541 -0.00629609 +0.000901863 0.122026 -0.0113896 +-0.0702669 0.176516 -0.0559875 +-0.0576072 0.0336162 0.0112663 +0.0129045 0.125515 -0.00527553 +-0.021518 0.115416 0.036565 +-0.01542 0.16691 -0.0137031 +-0.0365035 0.168234 0.000585726 +0.00464616 0.034105 0.00716872 +-0.0319348 0.125225 0.000800634 +-0.0169495 0.0390889 0.0362738 +-0.024481 0.104364 0.0426891 +0.0161036 0.0393372 0.0440174 +-0.0397156 0.127552 0.0155957 +-0.0063009 0.09425 -0.0339062 +-0.00549064 0.104476 0.0440202 +-0.0455034 0.104326 0.041412 +-0.0625466 0.16468 -0.0375945 +-0.0334032 0.0765382 -0.0275106 +-0.0118225 0.0855318 -0.0386599 +0.0100166 0.0833203 0.0549696 +-0.0685481 0.156429 0.0206858 +-0.0705717 0.158164 -0.0459142 +-0.0185161 0.125172 -0.00248935 +-0.0185539 0.095955 -0.0297446 +0.0191428 0.127427 0.0167214 +-0.0145095 0.171282 -0.0176637 +0.0352621 0.0826509 -0.01774 +-0.0526579 0.0504274 0.026653 +0.00237351 0.0465882 -0.0283321 +-0.0854761 0.132564 0.04817 +-0.0868299 0.0846427 0.00348465 +-0.0105903 0.0377043 -0.0258398 +0.00953188 0.0455622 0.0461832 +-0.0662037 0.154495 -0.0505507 +-0.0856221 0.107687 0.0203552 +-0.0858054 0.102155 0.00239755 +-0.0248162 0.126254 0.00926143 +-0.0398081 0.128271 0.00374611 +-0.00949649 0.0546877 0.0525704 +-0.0474662 0.0960033 0.0439936 +-0.0787761 0.1431 -0.00379727 +0.0264606 0.0663192 -0.0226274 +-0.0294891 0.119549 -0.0104626 +-0.0285179 0.0948797 -0.0246293 +-0.0561001 0.14389 0.0312058 +-0.0930288 0.116051 0.018311 +-0.00894653 0.174179 -0.0257648 +-0.0524908 0.113899 0.0349209 +0.0158504 0.0959717 -0.0236278 +-0.0694879 0.0368888 0.0112092 +-0.0802884 0.146109 0.0411929 +-0.0498232 0.0349806 0.0446412 +0.0342731 0.115225 0.0123899 +0.0283978 0.0955434 -0.019149 +-0.0515486 0.141607 0.0193759 +-0.0458573 0.147704 0.00717141 +-0.0735436 0.175947 -0.0433626 +-0.0758292 0.0935231 -0.0136873 +-0.0554898 0.041398 0.0465154 +0.0604856 0.0623173 0.00815473 +0.0135991 0.100782 -0.0226731 +-0.021666 0.16235 -0.015178 +-0.0474866 0.0573572 0.0366835 +-0.0645248 0.154173 -0.00692339 +0.0454055 0.0747572 0.0215389 +-0.0497578 0.0797288 -0.020162 +-0.0463447 0.129406 0.0234768 +0.0153317 0.0580768 -0.0287753 +0.0124861 0.100431 0.0478938 +-0.0288456 0.0986889 -0.0235542 +-0.00949656 0.0471698 0.047803 +-0.0644726 0.165628 -0.0285568 +0.0564615 0.0703554 0.0055259 +-0.0477419 0.0345444 0.0337565 +-0.0415114 0.0520187 0.0393909 +-0.0165872 0.128419 0.0166112 +-0.0649318 0.168832 -0.0387572 +-0.0230309 0.0906523 0.0522978 +-0.0289316 0.0889882 -0.0316153 +-0.0522528 0.0567257 0.0259279 +-0.0113061 0.169739 -0.0249506 +0.0329977 0.0514306 -0.00763543 +-0.0104801 0.120983 0.0360777 +-0.0848294 0.111312 0.0422165 +0.0597675 0.0609389 0.00613027 +-0.0264774 0.0473675 0.0499125 +-0.00223749 0.0939165 -0.0335391 +-0.0188762 0.171241 -0.0152046 +0.0460317 0.0820288 0.0151733 +-0.00015619 0.0389464 0.0272511 +-0.0490964 0.156122 -0.00621407 +0.0240569 0.111353 0.0367066 +-0.0427705 0.0826571 -0.0207663 +-0.0844768 0.0856095 0.0274708 +-0.0120306 0.174239 -0.0210892 +-0.00550834 0.0689154 0.0563731 +0.0289606 0.0679277 -0.0207366 +-0.0308933 0.12367 0.0217821 +-0.00650569 0.0675101 0.0559953 +-0.0789661 0.0859916 0.0360799 +-0.0291346 0.177171 -0.00534178 +-0.0560039 0.140764 -0.00299974 +-0.0584999 0.107052 0.0397144 +0.00834583 0.0539265 -0.0302958 +-0.0169173 0.16018 -0.0117745 +-0.0698587 0.0680767 -0.00467294 +0.00525002 0.0740223 -0.0345195 +0.0110199 0.0860342 0.0546992 +0.0173361 0.0608154 -0.0277985 +0.0111302 0.107269 -0.019511 +-0.021494 0.10578 0.0424616 +0.0436775 0.0859385 0.0262014 +-0.0587477 0.0767588 -0.0188591 +0.0107799 0.0548821 0.052327 +0.0185294 0.0358466 0.0392699 +-0.0859998 0.135257 0.0457789 +-0.0767885 0.154209 -0.0148974 +-0.0613392 0.0587193 0.00967832 +-0.0712669 0.0381904 0.00872646 +0.00351715 0.0561463 0.0534882 +-0.0427983 0.0884442 -0.0218161 +-0.0898373 0.133802 0.0342135 +-0.0414226 0.150668 0.00483874 +0.0173651 0.049165 -0.0241471 +-0.0213294 0.0783028 0.0551779 +0.0143433 0.0537792 -0.0282321 +-0.0784743 0.140032 0.0478552 +-0.0334891 0.0889549 0.0439078 +0.0190476 0.0795376 0.0522219 +0.0286264 0.0638437 -0.020406 +-0.054069 0.139552 0.0288194 +-0.0132381 0.0385471 0.0267309 +0.0118566 0.0887261 0.0541581 +0.0316481 0.100683 -0.014625 +-0.093138 0.120057 0.0112982 +0.0244505 0.0384021 -0.00302114 +0.0122037 0.0864617 -0.0308592 +-0.0121165 0.0973987 0.0513433 +0.0371269 0.09285 0.0362758 +0.00753839 0.119505 -0.0147629 +-0.0698326 0.0937229 -0.0162704 +-0.046496 0.105677 0.0407002 +-0.00449814 0.0870358 0.0571267 +-0.00560579 0.042007 -0.0256504 +-0.0748416 0.154048 -0.0189002 +0.0138852 0.0348367 0.0283807 +-0.0890009 0.118943 0.0464523 +-0.0703858 0.16802 -0.0500308 +-0.0208115 0.124915 -0.0021319 +-0.0399669 0.0343914 -0.00210399 +-0.0188044 0.120762 -0.00982397 +-0.0825182 0.0816676 0.0298907 +-0.0625957 0.0588736 0.0128867 +-0.0908844 0.150204 0.0171288 +-0.073715 0.17176 -0.0333959 +0.0304194 0.0446109 0.0313507 +-0.0364972 0.0605644 0.0405385 +-0.0684905 0.158118 -0.0539401 +0.011386 0.0343226 -0.0122219 +-0.0375464 0.119352 -0.0122401 +-0.036497 0.102841 0.0405772 +0.0373988 0.0430101 -0.00376662 +-0.00864037 0.0526884 -0.0330777 +-0.0505191 0.112725 -0.0172384 +0.000747713 0.131321 0.00709666 +-0.0821064 0.110205 0.0294137 +-0.0338319 0.0498039 0.0388148 +-0.0399647 0.128635 0.00811119 +0.0262642 0.0479348 -0.017662 +-0.093142 0.118716 0.0123041 +-0.0234219 0.0537493 0.0424994 +0.0109672 0.0977693 -0.023517 +-1.32571e-05 0.13145 0.0125463 +0.0200527 0.0618555 0.0482337 +-0.0119089 0.128954 0.021205 +-0.0524994 0.0903873 0.0447034 +-0.0334979 0.0845774 0.0421828 +0.0190672 0.117213 -0.0123322 +-0.0263135 0.0381467 0.0262093 +0.034589 0.108233 -0.00663102 +0.0435886 0.091694 0.0241609 +-0.00849618 0.0939016 0.0554996 +-0.0579701 0.125253 -0.00738272 +-0.016138 0.0382862 0.0119165 +-0.0709351 0.0742605 0.0366097 +-0.0125367 0.128434 0.00198737 +-0.0244307 0.0379986 0.0104913 +-0.0681277 0.152206 0.0356633 +-0.0279464 0.0689892 -0.032513 +0.0398535 0.0752995 0.0330037 +-0.0636875 0.0722354 -0.0149801 +0.00569987 0.0949071 -0.0304911 +0.0217235 0.120687 0.0315848 +0.0306109 0.0549842 0.038821 +-0.0719231 0.155792 0.0253493 +-0.0350091 0.168257 -0.00164334 +-0.0919787 0.13239 0.0232249 +-0.0781961 0.0730005 -0.00359699 +0.0587114 0.0663183 0.00513779 +-0.0669656 0.147091 -0.0266318 +-0.0880403 0.150094 0.0102212 +-0.0137235 0.0657235 -0.0372342 +-0.0884987 0.102354 0.0183681 +-0.0219433 0.0386564 0.0320445 +-0.0629896 0.0341974 0.0167609 +0.0436977 0.0404602 0.0147575 +-0.0413787 0.124797 0.0224172 +-0.0255118 0.0931431 0.0461963 +-0.0122206 0.175683 -0.0283056 +-0.0580888 0.115436 0.0369297 +-0.0783607 0.150068 -0.00187639 +0.0561422 0.049398 0.0141897 +-0.0334907 0.0932064 0.044455 +-0.0784392 0.144133 0.0443751 +0.0134754 0.0990564 0.0479483 +-0.0673994 0.0396352 0.0118227 +-0.0719379 0.131113 -0.00828186 +-0.0675058 0.060447 0.0122781 +-0.0276134 0.0408758 -0.0294796 +0.0326756 0.117173 0.0132168 +-0.0741715 0.151271 -0.0318825 +0.0191559 0.0577995 0.0486799 +-0.0624968 0.102902 0.0415908 +-0.0467288 0.054632 0.0374442 +0.0400692 0.0773178 -0.00879643 +-0.0293794 0.119962 0.0282913 +0.026315 0.0849274 0.0469361 +0.00747158 0.0458651 0.0478111 +-0.0644149 0.0731789 0.038947 +0.0243686 0.118145 -0.00732959 +0.0357612 0.0614637 -0.0127934 +-0.00578852 0.0784633 -0.0377499 +-0.0177178 0.125534 0.0250034 +-0.0264348 0.0891318 0.0486594 +0.000504451 0.0842848 0.0575158 +0.00240772 0.0390703 -0.0246208 +-0.0401081 0.172699 -0.00896014 +-0.0494967 0.101524 0.042218 +-0.0255895 0.0365546 -0.0292581 +0.0458597 0.0428246 0.0032848 +-0.0627733 0.141026 0.037362 +-0.0278525 0.100136 -0.023576 +0.03144 0.0681325 -0.0188162 +0.0112459 0.129755 0.00240428 +-0.0872718 0.144583 0.0355002 +-0.0552077 0.119827 0.0376818 +-0.0324974 0.0859857 0.0423469 +-0.0872251 0.0950749 0.0256867 +-0.0468678 0.104213 -0.0207743 +-0.0445775 0.0462028 -0.0108205 +-0.0612826 0.0343712 0.0345145 +-0.0144859 0.0951551 0.0535558 +-0.0770239 0.141306 -0.00545257 +-0.0572927 0.0447946 0.0143752 +0.0334156 0.0430777 -0.00456693 +-0.073856 0.154091 -0.0259028 +0.0392277 0.108354 0.00916622 +-0.0254312 0.0379511 0.0211651 +-0.0579761 0.145744 -0.00191597 +0.016043 0.107446 -0.0178315 +0.0243862 0.0955601 0.0459654 +-0.0527854 0.146248 0.0203946 +-0.0908456 0.137855 0.0191944 +-0.0688648 0.111591 0.0438135 +0.00950305 0.108494 0.0403312 +-0.0846701 0.133487 -0.000689201 +-0.0146178 0.161254 -0.0115208 +-0.0517406 0.0704199 0.0388209 +-0.00483682 0.0910121 -0.035647 +-0.0455024 0.0438631 0.0430524 +-0.0269915 0.165366 -0.00760144 +-0.000429299 0.131494 0.0138246 +-0.0108252 0.0340132 -0.0200775 +-0.053792 0.141582 0.0273817 +-0.0807416 0.0720213 0.00853917 +-0.0886543 0.102345 0.0123871 +0.00450201 0.0745047 0.0565768 +-0.0651106 0.120024 0.049809 +-0.0816493 0.14593 0.000178819 +-0.0317919 0.0396266 0.0512352 +-0.0868829 0.105004 0.0193534 +-0.0587854 0.0839965 -0.0207846 +-0.0568787 0.10406 -0.0186489 +0.0234195 0.0349614 0.0211471 +-0.0247363 0.0683356 -0.0352871 +-0.0124919 0.105832 0.0432095 +0.040945 0.0957511 0.0281635 +-0.0357042 0.0681118 -0.016092 +0.0393973 0.0899152 -0.0117774 +-0.00550412 0.0547964 0.0538028 +0.0275305 0.105074 -0.0152759 +0.0436438 0.0973161 0.0031761 +-0.0642775 0.0356785 0.0173446 +-0.0578787 0.118384 0.0390612 +-0.0235304 0.111308 0.039012 +-0.0248685 0.10443 -0.0231858 +0.0332298 0.0870923 -0.0186827 +-0.050788 0.13247 -0.00197537 +0.0485095 0.0723104 0.0188157 +0.0122831 0.123395 -0.0089862 +0.0075079 0.0786108 0.055765 +0.00110358 0.114412 -0.0192684 +-0.0434472 0.0344528 0.0312293 +0.0149724 0.0740286 0.0533099 +-0.0773286 0.0696655 0.0199272 +-0.000294503 0.124716 -0.00828566 +0.0391665 0.0916193 -0.0109453 +-0.0671371 0.169442 -0.0570354 +-0.0101504 0.0993437 0.0489973 +-0.0383111 0.172675 -0.0109203 +-0.048519 0.137086 0.0153953 +0.0537553 0.0686728 0.0251859 +-0.0642372 0.158555 -0.0140759 +-0.0177679 0.0959988 0.0511065 +-0.071022 0.0408196 0.00705143 +-0.0272272 0.0562777 -0.0264072 +-0.0594982 0.10293 0.0419773 +-0.0516777 0.0668198 0.0365892 +-0.00645905 0.128953 0.0260767 +0.0161504 0.121694 -0.0091598 +0.0437177 0.0457281 0.0283091 +-0.092911 0.118706 0.0113064 +0.0110654 0.0346569 0.0243461 +-0.0131306 0.0351789 0.049391 +0.0159998 0.123366 -0.00698095 +-0.0668407 0.0952437 -0.0171577 +-0.071815 0.0936645 -0.0155813 +-0.0350082 0.162373 -0.00163299 +-0.00952557 0.169814 -0.0256004 +-0.0483792 0.0345623 0.0353569 +0.042732 0.0733313 -0.00479409 +-0.0838195 0.113254 0.0462465 +-0.0700699 0.0415411 0.00206928 +-0.0834164 0.110194 0.0380909 +0.0395682 0.0582726 0.0307001 +-0.0527297 0.0738092 -0.0169322 +-0.0800112 0.0826849 -0.00756298 +0.0378591 0.102628 -0.00683982 +-0.010049 0.165099 -0.0207588 +-0.0214981 0.0486638 0.0490621 +-0.0429934 0.0337652 -0.0113325 +-0.000805756 0.0881637 -0.035184 +-0.0796191 0.0899783 0.0351979 +-0.0774871 0.138654 0.0489668 +-0.0910383 0.131037 0.0312282 +-0.0353528 0.121762 0.0276148 +-0.0692517 0.16944 -0.0530112 +-0.0314965 0.0760483 0.040909 +0.0238425 0.124265 0.00565298 +0.00628938 0.0341841 -0.018778 +-0.0581165 0.0576994 0.00562055 +0.0291881 0.120758 0.0119009 +-0.0722612 0.0718535 0.0331389 +0.00962203 0.129808 0.0232185 +-0.0350797 0.159271 -0.0126349 +-0.0536324 0.0335534 0.00133593 +-0.0104359 0.0944019 -0.0340934 +-0.00347107 0.112728 -0.01944 +0.0492065 0.0445737 0.00425603 +-0.014689 0.0555534 -0.0339367 +-0.0729302 0.110914 0.0452396 +0.0128104 0.0891816 -0.030491 +0.0173644 0.052219 -0.0267492 +-0.0755038 0.138646 0.0489499 +-0.0664863 0.0657678 0.0290911 +0.014321 0.0608889 -0.0289153 +-0.0109854 0.0891937 -0.0368255 +-0.0714642 0.155388 -0.0429121 +-0.0674015 0.178779 -0.0526749 +-0.0136021 0.0406665 -0.0268707 +-0.0656159 0.148667 -0.029991 +-0.0795217 0.0705829 0.00954625 +-0.0757838 0.06757 0.0150388 +-0.0619636 0.125289 -0.00856668 +-0.0639176 0.153606 -0.0366205 +-0.0839617 0.114292 0.0471508 +-0.0125655 0.164041 -0.0130929 +-0.0519903 0.161388 0.00628165 +0.0020129 0.0391581 -0.00540617 +-0.0585951 0.0582039 0.0052961 +0.034843 0.0862437 0.0399362 +-0.0416697 0.0377451 -0.0272469 +0.0488349 0.0718069 0.020409 +0.0223863 0.0449715 0.0408911 +-0.0822334 0.107404 -0.00162196 +-0.0602698 0.154572 0.0280125 +0.0297856 0.120093 0.00926746 +-0.0669649 0.131148 -0.00876196 +-0.0800697 0.154441 0.0255089 +-0.0849288 0.12649 -0.00334252 +-0.000500036 0.0952296 0.0545194 +0.0151613 0.0863718 -0.029541 +0.0388132 0.0794166 0.0350891 +-0.0171133 0.0390763 0.0521827 +-0.0784063 0.0886978 0.0368492 +-0.0643001 0.179479 -0.0601392 +-0.0766538 0.11399 -0.00481419 +-0.016912 0.0931258 -0.0348233 +0.0379841 0.0406211 -0.00115448 +-0.0331507 0.0821697 -0.0275285 +0.0162383 0.0953367 0.0482094 +-0.0326141 0.0638332 -0.0174509 +-0.0725041 0.146981 0.0423864 +-0.0910261 0.12541 0.00626868 +-0.0833424 0.104748 -0.00163012 +0.0153058 0.128412 0.00248962 +0.0403512 0.038719 0.00830945 +-0.0325027 0.0603855 0.0384943 +-0.0195554 0.0387278 -0.0149268 +-0.0839725 0.0897798 0.0296574 +-0.00149888 0.0634085 0.0566876 +0.0387554 0.108357 0.00416438 +-0.0444079 0.0409084 -0.0203048 +-0.0868827 0.0896245 0.0255163 +0.0430409 0.10011 0.0131585 +0.0194835 0.105739 0.0423148 +0.032957 0.115724 0.0233075 +-0.0114871 0.063283 0.055206 +-0.0528865 0.15117 0.0191272 +0.0045048 0.104341 0.0428855 +0.00104791 0.0346359 -0.0164332 +-0.0674529 0.180926 -0.0583799 +-0.0344427 0.15352 -0.00733684 +0.0397392 0.0658643 0.0327972 +-0.0465986 0.120315 -0.0132329 +0.015269 0.034844 0.035887 +-0.0554963 0.0791301 0.0442202 +-0.0342911 0.0473692 0.0421968 +-0.0842876 0.108899 0.00336188 +-0.0262668 0.179961 -0.0169689 +-0.0836964 0.0763445 0.00752427 +-0.0696635 0.159559 -0.0499324 +-0.0661058 0.151041 -0.0375744 +-0.0455019 0.122005 0.0261109 +-0.0890685 0.0969888 0.0194042 +-0.0946116 0.124177 0.0212718 +0.00351301 0.0828608 0.0571024 +-0.0555168 0.154658 0.0152234 +0.00450223 0.0730917 0.0563795 +-0.0125112 0.037888 -0.0164908 +-0.0595378 0.0337212 0.0161226 +-0.0645332 0.120008 0.0489179 +-0.0396568 0.0577566 -0.0113194 +-0.052454 0.13854 0.0254099 +-0.0106577 0.165418 -0.0198106 +-0.0477868 0.0855382 -0.0218048 +-0.07021 0.168534 -0.0249229 +0.0345025 0.0454126 0.0301845 +-0.0261438 0.168232 -0.0181898 +-0.0685956 0.0422314 0.00876662 +0.00130397 0.128647 -0.00252095 +-0.0558871 0.108356 -0.0181276 +-0.0163928 0.0384645 -0.00103951 +-0.0364756 0.0917702 0.0440382 +0.0409317 0.0971197 -0.00479362 +-0.015772 0.160715 -0.00958045 +-0.0428613 0.102811 -0.0212634 +-0.0285136 0.112565 0.0358423 +0.0484971 0.0678077 0.0264809 +-0.0319101 0.121969 -0.00695975 +-0.0200308 0.127492 0.00809368 +-0.0860481 0.114371 0.00228673 +-0.0597203 0.0638916 0.0303834 +0.00627327 0.0682324 -0.0325665 +0.0114155 0.128646 -0.000626619 +-0.0516778 0.140064 0.0213757 +-0.0218071 0.110009 -0.0205036 +-0.0218161 0.0798852 -0.0388524 +-0.02847 0.045966 0.0500228 +0.0429765 0.0987175 0.0181666 +-0.0795395 0.117686 0.0497856 +0.0342026 0.113899 0.000840527 +0.0067112 0.0353739 0.0246266 +0.0402464 0.0618954 -0.00472398 +-0.049455 0.118007 0.0316443 +-0.0442176 0.170815 -0.00391429 +0.00731658 0.0846292 0.0563131 +-0.0542668 0.0504201 -0.00539584 +-0.00648076 0.0969085 -0.030657 +0.0597202 0.067814 0.0181758 +-0.0267919 0.0380272 0.00817341 +-0.0702433 0.163232 -0.0134117 +0.0368364 0.0754262 0.037436 +-0.077497 0.168713 -0.0313178 +0.00996165 0.130854 0.00764162 +0.0133618 0.0523173 -0.0278769 +-0.0337147 0.120592 -0.00951232 +-0.0398766 0.113891 -0.0165093 +-0.089592 0.111931 0.0163329 +-0.0841359 0.0832101 0.027497 +-0.0848856 0.0792043 0.0194951 +-0.0291817 0.0832547 -0.0346104 +0.013224 0.0341678 -0.000459678 +-0.00759782 0.103673 0.0436498 +-0.0514921 0.0804912 0.0440592 +-0.0929632 0.124088 0.0102675 +-0.0586925 0.0677294 -0.0118268 +0.0392263 0.0874331 0.033936 +-0.052704 0.143169 0.0214165 +-0.0286941 0.0380883 0.0293671 +0.0183138 0.0348993 0.0256062 +-0.0644855 0.101502 0.0419335 +-0.0547363 0.159762 -0.000811248 +0.0123244 0.0567269 -0.0296218 +0.0294314 0.0509988 -0.0157519 +0.0386176 0.0874608 0.0348475 +-0.0759101 0.148612 -0.0128604 +0.0152406 0.0723235 -0.0303843 +-0.0475913 0.133999 0.00741747 +-0.0109726 0.115573 -0.0164387 +-0.040716 0.0681271 -0.0158645 +-0.000345107 0.127203 0.0297544 +-0.0856388 0.100529 0.0267624 +0.0372748 0.0576283 0.0326444 +0.0454709 0.0664599 0.0266758 +-0.040383 0.152127 0.00460721 +-0.0503264 0.131112 0.0307063 +-0.061863 0.0953699 -0.0186332 +-0.0356336 0.11996 -0.0108661 +-0.000498349 0.118323 0.0391474 +-0.00744633 0.0386202 0.0260498 +-0.0702648 0.156758 -0.047919 +-0.0607772 0.146055 -0.00361746 +-0.0557733 0.0797194 -0.0205764 +-0.0286229 0.0450027 -0.0280846 +-0.0400285 0.0339876 -0.0295458 +-0.0244818 0.0974513 0.0444604 +-0.0736592 0.0887741 0.0405778 +-0.0626256 0.150596 -0.021578 +-0.0455006 0.117978 0.0306048 +-0.0153159 0.119411 -0.012435 +0.00132313 0.0358703 0.0464707 +-0.0231138 0.0666037 0.0460408 +-0.0487946 0.0869761 -0.0218357 +0.0312031 0.0842875 -0.0196213 +-0.0866673 0.109085 0.0143521 +-0.0716243 0.157487 -0.00225608 +0.0404941 0.0555582 0.0318463 +-0.0624591 0.155071 0.0054624 +-0.043713 0.0695592 -0.0168487 +0.00662363 0.128671 -0.00261559 +0.0292045 0.0356392 0.0180684 +0.0152063 0.0878077 -0.0294658 +0.0560899 0.059136 0.000193317 +0.0162996 0.0623114 -0.0287447 +0.00333411 0.0539266 -0.0303683 +-0.0212016 0.0383732 -7.87452e-05 +-0.0683674 0.147186 -0.0280671 +-0.0614001 0.124084 0.0428232 +-0.0273522 0.0939518 -0.0257303 +-0.0526652 0.0647199 -0.0102 +-0.032486 0.0449059 0.0475402 +-0.0090473 0.168146 -0.0217175 +-0.069891 0.119438 -0.0086356 +-0.0744393 0.114503 0.0509494 +-0.0648928 0.0350374 0.038379 +-0.00019365 0.125094 0.0326823 +-0.039166 0.0355671 -0.0293815 +-0.0258209 0.0692735 0.0430043 +-0.0620187 0.175667 -0.057604 +-0.0903815 0.130904 0.00623191 +-0.00457753 0.11466 -0.0174869 +-0.0733982 0.114573 0.051125 +0.00137655 0.0380516 0.0229424 +-0.0197661 0.0728664 -0.0388949 +-0.0370853 0.162227 -0.0135318 +-0.0166846 0.109701 -0.0201927 +-0.0564987 0.0932477 0.0451284 +-0.086761 0.084678 0.016478 +-0.0201321 0.0568083 0.0475876 +-0.0893331 0.111939 0.012355 +-0.0291964 0.162421 -0.00376774 +-0.0840799 0.143223 0.00416483 +-0.0550692 0.121281 0.0379498 +-0.0258999 0.0382697 0.0279803 +-0.0881372 0.150234 0.0261027 +-0.0189632 0.0385431 -0.0165058 +0.0252198 0.0478964 -0.0186081 +-0.0250024 0.118057 -0.0129436 +-0.0341053 0.162392 -0.00207929 +-0.0455587 0.0461599 -0.0105245 +-0.0673284 0.11863 0.0518333 +-0.0767393 0.157602 -0.0105393 +-0.0460199 0.0377083 0.0451098 +0.00937824 0.0346871 0.0203526 +-0.0232543 0.181611 -0.01087 +-0.0185423 0.0342292 -0.0199208 +0.0094823 0.034855 0.0256576 +-0.00349094 0.060529 0.0547186 +-0.0536823 0.0678463 -0.0129474 +0.0573543 0.0687146 0.022093 +0.0297466 0.036015 0.0196643 +0.0183828 0.0447123 -0.0227438 +-0.00451438 0.1296 0.000561158 +-0.0575172 0.037335 -0.0101901 +-0.0273178 0.113609 -0.0162558 +-0.0127855 0.0392769 0.0369668 +0.0359154 0.0915824 -0.0149202 +-0.0321871 0.0680263 -0.0214501 +0.0373115 0.0673123 0.0362946 +-0.0482709 0.0345995 0.0405757 +-0.0586992 0.142676 -0.00307276 +-0.0720231 0.149543 -0.0391183 +-0.0926193 0.122848 0.0312739 +-0.00649959 0.103045 0.0436802 +-0.0172605 0.128293 0.0149127 +0.0500544 0.0553974 0.0300563 +-0.0459009 0.131661 0.0191601 +-0.0355139 0.176726 -0.00796363 +-0.0132739 0.162396 -0.014817 +-0.0205091 0.112696 0.0389743 +0.0400974 0.0943736 -0.00783899 +0.0445099 0.0945603 0.0161557 +-0.00940844 0.100291 -0.0242411 +-0.0880121 0.147225 0.0305337 +-0.0134729 0.17718 -0.0214028 +0.0289055 0.0408264 0.0297172 +-0.0386238 0.0335154 -0.0250853 +-0.0474847 0.0931518 0.0438057 +0.0385195 0.109282 0.00815775 +-0.0094889 0.119647 0.0372435 +-0.0558334 0.0358523 0.0464479 +0.0391497 0.108397 0.00837586 +-0.0166742 0.0668915 0.0537111 +-0.0514343 0.0647808 0.0348885 +-0.0506054 0.0575708 -0.00965819 +0.0186225 0.0355557 -0.00967449 +-0.0507888 0.0855066 -0.0215873 +-0.0563207 0.0562341 0.00763908 +0.00416104 0.0393786 0.0331643 +0.00410872 0.110162 -0.02034 +-0.0326921 0.152804 -0.00294992 +-0.0105902 0.0385498 0.00372703 +-0.0450772 0.0337168 -0.000691764 +0.00110427 0.111585 -0.0201254 +-0.086661 0.123026 0.0482846 +-0.00349688 0.0633763 0.0563118 +0.0181674 0.0959966 -0.023265 +0.0171824 0.126495 -0.000336309 +0.0349695 0.0577828 0.0363582 +-0.0893883 0.0956403 0.0164184 +-0.0132244 0.172771 -0.0193112 +-0.0115098 0.0702302 0.0553956 +0.0292762 0.0431552 0.0314362 +0.0355897 0.0411906 0.0271165 +-0.0396848 0.0344413 0.0355548 +-0.0488762 0.0335766 0.000473902 +-0.0845392 0.0778023 0.0145171 +-0.0600467 0.0342661 0.0313871 +-0.0484946 0.156406 0.00957752 +-0.0435279 0.0506014 0.0392212 +-0.0581322 0.0624985 0.0284102 +-0.0319273 0.126498 0.0125244 +-0.0692254 0.124258 0.0526584 +0.0346263 0.114673 0.0139267 +-0.0707453 0.113137 0.049314 +0.0440515 0.0722274 0.0248494 +-0.0190238 0.0384735 0.0274147 +0.0318733 0.11664 0.0243218 +-0.00980958 0.166665 -0.0207735 +-0.075878 0.0954761 0.0383509 +0.04237 0.0533961 -0.00679891 +-0.00515103 0.127241 0.0295045 +-0.0386117 0.0406767 0.0425487 +0.0591522 0.0552732 0.011174 +0.0399613 0.0806226 0.0334139 +-0.0892353 0.14446 0.0304266 +-0.0104754 0.127368 -0.00300647 +-0.0635158 0.162004 -0.0583208 +-0.0801984 0.0868229 -0.00856132 +-0.0600399 0.13696 -0.00647222 +-0.0777335 0.153443 0.0307864 +-0.046469 0.119345 0.0289808 +-0.0313084 0.126018 0.00688499 +-0.0190244 0.0385858 -0.00538325 +-0.0698329 0.112058 0.0465849 +-0.0761752 0.110468 0.0448594 +0.0607736 0.0651167 0.0161629 +-0.0738077 0.102191 0.0374953 +-0.0406116 0.0337811 0.00738645 +-0.0152574 0.166467 -0.0199789 +0.0135127 0.0860479 0.0530247 +-0.072308 0.159721 -0.00687103 +0.00549414 0.130728 0.00313392 +-0.00649655 0.0870315 0.0570873 +-0.0353742 0.125928 -0.00196324 +0.00551011 0.0870055 0.0566199 +0.00569172 0.093878 -0.0314287 +0.0453353 0.0533808 -0.00616451 +-0.0788788 0.16526 -0.0309581 +0.0122616 0.0765812 -0.0308581 +-0.0471876 0.131943 0.0231102 +0.0442177 0.0860807 -0.00279659 +-0.0735334 0.165176 -0.017728 +-0.0896904 0.116203 0.0443945 +-0.0887705 0.0969872 0.0214096 +-0.0201887 0.0754016 0.0541402 +0.0203245 0.0636 -0.0272806 +-0.0513256 0.0345659 0.0399502 +-0.0461113 0.034482 0.0324006 +-0.0773794 0.109459 0.0418273 +0.0262228 0.0747294 -0.0245497 +-0.0281178 0.0845911 -0.0356125 +-0.029049 0.0511502 0.0411139 +-0.0685509 0.065132 0.0256966 +-0.0660181 0.127026 0.048508 +-0.0475948 0.0403553 0.044655 +-0.0711998 0.15079 -0.0434624 +0.0346942 0.0401467 0.0260507 +-0.0803051 0.0719229 0.0175051 +0.0266708 0.121701 0.00384182 +-0.0637803 0.118542 0.0465326 +0.0257185 0.0699313 0.0441746 +-0.0865836 0.11378 0.0451954 +-0.0543656 0.153368 0.0199938 +-0.0147843 0.0981951 -0.0260468 +-0.0480746 0.134034 0.00539884 +-0.0172971 0.0386165 -0.00691824 +0.024363 0.0867852 -0.0239669 +0.000502788 0.056275 0.0546165 +0.0460119 0.0750141 0.00420589 +-0.0813458 0.154098 0.0250842 +-0.0504992 0.111154 0.0370407 +0.0480441 0.0725423 0.0171549 +0.0177377 0.0821568 0.0520978 +-0.0634907 0.0833477 0.0441845 +-0.0287709 0.04365 -0.0290051 +0.0412886 0.0858436 -0.00978207 +-0.0434867 0.0959016 0.0426578 +-0.0685902 0.112767 0.0465657 +0.0446015 0.0889424 0.0221651 +0.0387218 0.0993392 0.0297824 +-0.0569101 0.0984236 -0.0203516 +0.0460228 0.0834207 0.0061859 +-0.0608711 0.101136 -0.0186334 +0.0198592 0.123572 0.0284223 +-0.0670185 0.155095 -0.00202392 +0.00194178 0.0353485 0.0200578 +-0.0202225 0.0381837 0.0220241 +0.0372544 0.111046 0.00772111 +-0.0226761 0.0552382 -0.0304344 +-0.0500773 0.15315 -0.00486218 +0.0361622 0.075448 0.0382492 +0.00638813 0.0448624 -0.0253374 +0.0240783 0.123806 0.00430528 +-0.0874625 0.123933 -0.000723767 +0.0191746 0.064523 0.0487473 +-0.0528554 0.116872 0.0339893 +0.0012658 0.0697321 -0.0339789 +0.0363552 0.112269 0.0088181 +-0.0336364 0.0836212 -0.0255231 +0.0394621 0.0820907 0.0342997 +-0.0759857 0.112794 0.0483899 +0.042364 0.0505846 -0.00668018 +-0.0878291 0.0895228 0.0236162 +-0.0717396 0.156144 0.0122972 +-0.0118777 0.107304 -0.0220947 +-0.0518036 0.0898543 -0.0220029 +-0.0605307 0.142151 -0.00455603 +-0.00730388 0.0394625 0.048838 +-0.0695099 0.151355 -0.0447129 +0.0461391 0.0820336 0.0131698 +-0.0680095 0.151244 0.0371953 +-0.0696447 0.155522 0.00577511 +0.0106458 0.0343542 -0.00488721 +-0.0717447 0.165221 -0.0449739 +0.00872274 0.0346011 0.0383625 +-0.0601559 0.0472008 0.00728305 +-0.072526 0.149972 -0.0424686 +-0.0921507 0.129567 0.0102504 +-0.0195451 0.0382679 0.00943 +0.017351 0.0351839 -0.014686 +0.026638 0.0619848 -0.0226053 +-0.0779425 0.0757661 -0.00656744 +0.0456648 0.0834028 0.0181693 +-0.00238392 0.0391586 -0.00815532 +-0.0760947 0.171183 -0.0343205 +-0.037685 0.127343 0.0163262 +0.0200653 0.084847 0.0502217 +-0.0576821 0.0438911 0.0236882 +-0.00181158 0.0365903 0.0109133 +-0.0227414 0.0640418 -0.0345473 +-0.0607804 0.0397294 0.0180031 +0.00451899 0.0966593 -0.0283637 +-0.00904759 0.0994069 0.0493883 +0.036694 0.0368281 0.0111245 +-0.0476151 0.0378648 -0.0125385 +-0.0374934 0.0620193 0.0412021 +-0.0678369 0.0706443 0.0351197 +0.0262359 0.122255 0.0222063 +-0.0258834 0.0347926 0.045205 +-0.0730191 0.0808411 -0.0145801 +0.0272041 0.0968528 0.0430049 +-0.0387216 0.0710357 -0.0169218 +-0.0802983 0.0953773 0.0342868 +-0.0928216 0.122866 0.0342742 +0.0288283 0.120572 0.00606361 +-0.0872644 0.139206 0.0412952 +-0.0528885 0.108408 -0.0187758 +-0.0614742 0.149784 0.0364078 +-0.0888928 0.113895 0.0428033 +0.0133289 0.0681229 -0.0310343 +-0.000536732 0.10034 0.0474846 +0.0582707 0.0579579 0.00417743 +-0.0896629 0.124003 0.00427429 +-0.0333755 0.0483636 -0.0203394 +-0.0335104 0.169764 -0.00293532 +-0.0488446 0.119728 0.0310062 +0.0426741 0.0972641 0.0231497 +-0.0441044 0.0451364 -0.0122986 +-0.059855 0.0594826 0.0200848 +0.0270691 0.0942437 0.0445649 +-0.0896385 0.0969877 0.0134181 +-0.0456599 0.0636306 -0.0135866 +0.0575548 0.053733 0.00618309 +-0.054499 0.0776179 0.0432703 +0.0434163 0.0464179 0.0294988 +-0.0134899 0.0951663 0.0534531 +0.0324423 0.0754774 0.0416539 +-0.0117218 0.0382705 0.0200729 +-0.0308456 0.0396262 0.0517145 +0.0564645 0.0594668 0.0252844 +-0.0475135 0.0491287 0.0385522 +-0.0396908 0.0651397 -0.0142325 +0.0201781 0.0351992 0.0293411 +-0.0219159 0.175693 -0.0142737 +-0.0688718 0.063973 0.0231175 +0.0174279 0.12392 0.0289777 +-0.0699032 0.0687756 0.0310328 +-0.0528961 0.143026 -0.000455911 +-0.0475121 0.0438565 0.0432608 +-0.0275879 0.0384125 -0.00879832 +0.0421339 0.102871 0.00816377 +0.0276939 0.085014 -0.0220629 +-0.0593718 0.0422854 0.0165091 +0.0245725 0.122909 0.0244414 +0.00141552 0.0990584 0.0500955 +-0.0208664 0.103024 -0.023442 +-0.04595 0.0351008 -0.0224117 +0.0425933 0.066459 0.0273252 +-0.085327 0.0926016 -0.00256332 +-0.0496528 0.0345916 0.0385506 +-0.023191 0.178657 -0.0125853 +-0.0179257 0.0971306 -0.0269629 +0.0383787 0.0575308 -0.00558257 +-0.0190955 0.0939751 -0.033709 +-0.0659978 0.135528 -0.00820667 +-0.0379695 0.0348544 -0.0150276 +0.0231948 0.0344554 0.00500709 +-0.0577114 0.148197 0.0324041 +0.0473189 0.0638822 -0.00202275 +-0.091122 0.115466 0.0410527 +-0.0499316 0.141822 0.00385784 +-0.0663647 0.0360087 0.0372253 +-0.0453211 0.0345932 0.035979 +-0.00367712 0.0569332 -0.0329252 +-0.0883137 0.103697 0.0153744 +0.0333218 0.0981688 0.0378146 +0.0206459 0.0429683 -0.0197059 +-0.0718069 0.0887788 0.0415418 +-0.050581 0.0445938 -0.00942218 +-0.0589701 0.121961 -0.00876657 +-0.0786152 0.163841 -0.0309629 +-0.0919702 0.114664 0.0123319 +-0.0387263 0.127561 -0.000266265 +0.0573405 0.0635192 0.0248021 +-0.0778913 0.126656 -0.00702073 +-0.0685283 0.0434892 0.00727271 +-0.0779351 0.161108 -0.0209335 +-0.0892037 0.0956419 0.0194144 +-0.091675 0.147474 0.0191435 +0.00817319 0.0832888 0.0558122 +-0.051142 0.0627417 0.0330975 +0.00546913 0.116627 -0.0176566 +-0.0278605 0.124718 0.0184442 +-0.0689992 0.150311 0.0384044 +-0.0690062 0.162382 -0.0519693 +-0.00661995 0.130084 0.0216557 +0.0403849 0.0533789 -0.00673496 +0.0156377 0.0348863 0.0377268 +0.0577131 0.0523367 0.00917793 +-0.00120988 0.105335 0.044053 +-0.00579434 0.0351694 0.0474261 +0.0411666 0.0833385 0.031438 +-0.0325019 0.0988116 0.0438807 +0.00307304 0.124054 -0.00961404 +-0.0350636 0.0383682 -0.0121121 +-0.073931 0.128192 -0.0084465 +0.015055 0.123588 -0.00721903 +0.0455542 0.0875891 0.00417683 +-0.006733 0.0684593 -0.0359965 +0.00394905 0.100531 -0.0224465 +-0.0399008 0.128531 0.0110866 +-0.0778707 0.177255 -0.0480374 +-0.0310993 0.177108 -0.0141677 +-0.0307989 0.0833965 -0.031578 +0.00828982 0.0846467 0.0559983 +-0.0926147 0.121379 0.00928006 +-0.0309131 0.0848198 -0.0305724 +-0.0610919 0.155915 0.0160896 +0.0269409 0.117743 0.0296345 +-0.029909 0.0904807 -0.0265953 +0.0341142 0.0605859 0.0386759 +0.04958 0.0652138 -0.00133913 +-0.0406916 0.0651596 -0.014333 +-0.0186192 0.0393436 -0.0280481 +-0.0321414 0.16968 -0.0161315 +-0.0303394 0.0344325 -0.0205625 +-0.0749113 0.125246 -0.00804661 +0.0179783 0.035483 -0.0126728 +-0.0572916 0.0479655 -0.00237378 +-0.030388 0.0876244 -0.0295653 +-0.00273996 0.130454 0.0216129 +-0.0785777 0.0907895 -0.0106208 +-0.0237519 0.0683934 -0.0360687 +0.0305158 0.11943 0.00953878 +0.0436886 0.0777182 0.0262206 +-0.00223658 0.0383059 0.0473338 +-0.0174973 0.104415 0.0431217 +0.045327 0.0519476 -0.00589943 +-0.022701 0.0611501 -0.0334866 +-0.0334865 0.126881 0.00753677 +0.0458812 0.084809 0.00618736 +-0.0775185 0.147451 0.0411778 +-0.00849166 0.110041 0.0429425 +-0.00827497 0.0389568 -0.00728452 +-0.0154767 0.0545272 0.0507241 +0.0455115 0.0861913 0.0171661 +-0.0286176 0.124173 0.0196508 +-0.0903937 0.142028 0.0281621 +-0.00750142 0.0590729 0.0550185 +-0.0691508 0.152358 -0.047074 +-0.00484252 0.0384695 0.0194856 +-0.00149467 0.116953 0.0400314 +-0.0148242 0.128616 0.018702 +-0.00749757 0.0939067 0.0556187 +0.031866 0.115189 -0.00211013 +-0.0515259 0.0439564 0.0445165 +-0.0773104 0.159761 -0.0159076 +0.0205013 0.108449 0.0395681 +-0.0648774 0.159303 -0.0143091 +0.0267364 0.0606633 -0.022785 +0.00150878 0.0883997 0.0564367 +-0.0659091 0.06022 0.0163937 +-0.0625921 0.1213 0.0447428 +-0.0789765 0.135392 -0.00472816 +-0.0709567 0.0767623 0.0380194 +-0.0506142 0.0560954 -0.00917258 +-0.0707687 0.155356 -0.0469258 +-0.0675837 0.112197 0.043642 +-0.0159686 0.128428 0.0182857 +-0.0564715 0.132545 0.0359114 +-0.044247 0.157947 0.00609665 +-0.011089 0.038804 -0.005846 +-0.0380666 0.0385186 -0.00730796 +0.0253529 0.0520143 0.0399629 +0.00465347 0.0341223 0.0126365 +-0.0905147 0.136459 0.016202 +-0.0184793 0.0336465 -0.023124 +0.0165026 0.118175 0.0355154 +0.0109305 0.0685438 0.0544088 +-0.00849797 0.0952525 0.0545557 +-0.050269 0.11691 0.032477 +-0.0301947 0.125922 0.0102205 +-0.0914405 0.117414 0.0273008 +-0.0231534 0.0352107 0.0523184 +-0.0922901 0.125582 0.0342578 +-0.0703512 0.170836 -0.0520339 +-0.0881528 0.129472 0.0022725 +-0.0125497 0.0445369 0.0499253 +0.0104221 0.127848 0.0278469 +-0.0114754 0.0546403 0.0519269 +-0.0665146 0.16661 -0.0580261 +-0.0384984 0.169734 0.00180247 +0.0290438 0.0509642 -0.0167532 +0.0292682 0.0673021 0.0422638 +-0.0643695 0.149877 -0.0298747 +-0.0741326 0.180484 -0.0536706 +-0.0484658 0.144752 0.00741107 +0.02369 0.10485 -0.01704 +0.0383652 0.101327 -0.00724085 +-0.0516205 0.0604369 -0.00991236 +-0.0080847 0.125292 0.0313586 +-0.0117515 0.0714338 -0.0381291 +-0.0358096 0.12684 0.0170169 +-0.0620073 0.155313 -0.0175819 +-0.0861256 0.0937891 0.0274526 +-0.0627193 0.152197 -0.01058 +0.0557633 0.0538969 0.024211 +-0.0501537 0.152144 0.0115744 +-0.0504041 0.0345678 0.0349233 +-0.0622094 0.0655019 0.0319825 +-0.0630381 0.154049 0.0314099 +-0.0864944 0.112209 0.0250023 +-0.0765838 0.178662 -0.0494737 +-0.0880478 0.0908955 0.0237752 +-0.0540202 0.0513732 0.0109294 +0.0220807 0.125732 0.0192313 +0.000503516 0.0856702 0.0573793 +-0.0624013 0.116928 0.041368 +-0.0687693 0.0793684 -0.0165822 +0.0312024 0.114939 -0.00384217 +0.0394926 0.052754 0.032086 +-0.076502 0.12459 0.0526576 +0.0461265 0.0736153 0.00421619 +0.0493794 0.0453908 0.0224152 +0.0422961 0.0655994 0.0276352 +0.0444235 0.0917457 0.0211574 +-0.04812 0.128214 0.028687 +-0.0256026 0.0837946 0.0522209 +-0.00959872 0.0391743 -0.0260833 +0.0242446 0.0762105 -0.0254816 +-0.050147 0.145259 -0.000515581 +-0.0729617 0.136954 -0.00717713 +-0.0321019 0.119786 0.0288381 +-0.0723819 0.152607 -0.0408904 +0.0595077 0.0567056 0.0171693 +-0.0647247 0.16489 -0.0257757 +0.0214018 0.0473917 -0.0206345 +-0.0652965 0.147932 -0.0271042 +0.0404164 0.0647148 -0.00677085 +-0.0440757 0.0335994 -0.0169421 +-0.0658186 0.154852 0.00425231 +-0.0457713 0.156483 0.00739285 +-0.0550494 0.0577849 0.0202145 +-0.0233757 0.163881 -0.00766181 +-0.0658954 0.166616 -0.0590008 +0.0309109 0.0511672 -0.0117352 +0.0380176 0.101228 -0.00786632 +0.0272437 0.0732614 -0.0238068 +-0.0161865 0.0377383 0.0516902 +-0.051271 0.0356477 0.0458842 +-0.0184884 0.107161 0.042158 +0.0143121 0.0753991 0.0540935 +0.012486 0.0990688 0.0481132 +-0.069936 0.13258 -0.0084535 +-0.0324718 0.0546382 0.0373194 +-0.0637186 0.179242 -0.0585917 +-0.0560047 0.159776 0.00109778 +-0.0940215 0.120122 0.0233001 +-0.0734929 0.154069 -0.0299022 +0.0334431 0.0930091 -0.0164312 +-0.0568079 0.0869026 -0.0213473 +0.0600207 0.0595165 0.0181686 +-0.0282716 0.0376885 0.0226211 +-0.0608814 0.102587 -0.0185388 +-0.0689777 0.172299 -0.0388012 +-0.0333033 0.176609 -0.00426163 +-0.0726003 0.145757 -0.0168539 +-0.0351155 0.0460859 0.0430647 +-0.0668221 0.16563 -0.0222317 +0.0223344 0.0535713 -0.0254238 +-0.0555068 0.0341015 0.0254741 +0.0591828 0.0594427 0.0211715 +-0.076476 0.07597 0.0322323 +-0.0548438 0.043635 0.0177242 +-0.0545598 0.0616597 -0.0074577 +-0.0717138 0.073474 0.0353741 +-0.0123858 0.0383448 0.0108168 +-0.0878417 0.140531 0.0102059 +-0.0338438 0.0337316 0.012415 +-0.0362549 0.153841 -0.0082413 +-0.066147 0.0353356 0.0361254 +-0.0149468 0.125073 -0.0044168 +-0.0517378 0.0545135 0.0226244 +-0.0791517 0.0792478 0.0324066 +-0.0311673 0.0386498 -0.0134468 +-0.00138514 0.0391216 -0.00791905 +0.0249209 0.0782259 0.0483953 +-0.0288805 0.079237 0.0443379 +-0.0499299 0.0335056 -0.0106454 +0.000248169 0.0726618 -0.0353693 +-0.00679601 0.100851 0.0456503 +0.00749727 0.121002 0.0360768 +0.0281364 0.0448054 0.035097 +-0.0616338 0.0739295 0.0406212 +-0.0184922 0.11816 0.035496 +-0.0231843 0.0348489 0.0439808 +0.0524989 0.0718135 0.00595977 +-0.0114982 0.0943996 -0.0340943 +-0.0574587 0.045976 0.042703 +0.0272754 0.0703879 -0.0233186 +-0.0208041 0.127131 0.0063587 +-0.0449931 0.152736 -0.00651735 +-0.0154877 0.167822 -0.0210841 +-0.0738833 0.122317 -0.0079807 +0.0163998 0.0834424 0.0519345 +-0.0615988 0.156867 -0.0225865 +-0.0504372 0.0529682 0.0186225 +-0.0607622 0.0781498 -0.0187637 +-0.0208042 0.125974 0.0209606 +-0.0245306 0.112636 0.0373469 +-0.030708 0.121227 -0.00820323 +-0.0511359 0.0502476 0.0206335 +-0.0384993 0.0733372 0.0420402 +-0.0588719 0.102608 -0.018764 +-0.0774969 0.130279 0.0531227 +-0.0375712 0.124334 -0.00748059 +-0.0119956 0.0882297 -0.0377812 +0.0547499 0.0492946 0.00521444 +0.017211 0.088423 -0.0276786 +0.0381646 0.0644978 -0.0107883 +-0.04783 0.0927226 -0.0216222 +-0.0132756 0.0597275 0.0533794 +-0.00158335 0.0361983 -0.0246741 +-0.0612049 0.174131 -0.0607222 +-0.0655175 0.0356165 -0.00754656 +-0.0874441 0.0860134 0.00347726 +-0.00749507 0.10164 0.0441128 +-0.0175041 0.0382782 0.00983265 +0.00351386 0.100332 0.0462561 +0.0252498 0.0645397 -0.0230446 +-0.0717344 0.131221 0.0507858 +0.0525721 0.0648669 -0.000960413 +-0.0901978 0.11358 0.0212183 +-0.0560194 0.129616 -0.00591188 +0.0441279 0.0748554 -0.00179683 +-0.0307721 0.0349136 0.04922 +-0.0554801 0.0452738 0.0437595 +0.000511374 0.0503823 0.0524384 +0.0295573 0.0375392 0.0237122 +-0.00766545 0.0541253 -0.0331554 +-0.0226026 0.0379508 -0.0287016 +-0.0187506 0.162746 -0.0157051 +0.0546767 0.0732977 0.0167178 +0.042064 0.10006 0.0201605 +-0.0889838 0.099691 0.0193911 +-0.0644638 0.129733 0.0437115 +-0.043484 0.0987241 0.0424341 +-0.0252565 0.120536 -0.00953586 +-0.0159529 0.0390542 0.0365141 +-0.0915486 0.143335 0.0161726 +-0.0405267 0.169768 0.0017705 +-0.0726712 0.0651053 0.0195713 +-0.0132255 0.182074 -0.023933 +-0.0456018 0.0629458 0.0388902 +0.0287985 0.0385521 0.0262584 +0.0314095 0.0695437 -0.0187779 +-0.0625738 0.156865 -0.0165766 +0.0106756 0.0489592 0.0485841 +-0.0781956 0.163891 -0.0259488 +0.0262919 0.101687 -0.017683 +-0.0681573 0.180556 -0.0543707 +-0.0464942 0.100125 0.0422537 +-0.0294775 0.17726 -0.00505881 +0.00976325 0.0346476 0.0385339 +0.0351088 0.100136 -0.012024 +0.0398312 0.0992984 0.027798 +-0.0544975 0.080589 0.0448325 +-0.0251898 0.177123 -0.0193397 +-0.00463984 0.12746 -0.00519523 +0.0365694 0.109049 0.0260841 +-0.062967 0.159919 -0.044604 +0.0156331 0.0915267 -0.0269033 +-0.0577811 0.0472143 0.0403119 +-0.086179 0.107645 0.0083646 +-0.00357674 0.0347286 -0.0239915 +-0.0205507 0.066817 0.0505282 +-0.0590047 0.132542 0.0375172 +0.00657766 0.034511 0.0217547 +-0.0730595 0.110042 0.0423406 +-0.0725117 0.163674 -0.014076 +-0.0130193 0.115677 -0.016537 +0.0190348 0.0768352 0.0521916 +0.00221518 0.114462 -0.0193126 +-0.0142885 0.0390252 0.0350884 +-0.0492809 0.152135 0.0110836 +0.0378754 0.0980648 0.0320906 +-0.0377624 0.0420706 0.0430123 +0.00890997 0.125517 0.0316176 +0.00478616 0.0342999 0.00145343 +-0.0220536 0.0952953 -0.0290683 +-0.0883767 0.125344 0.00127971 +-0.055499 0.0761852 0.0427309 +-0.0505039 0.0487703 0.0186583 +0.0374548 0.0781001 0.0366194 +0.00520505 0.129939 3.61829e-05 +-0.0464525 0.146291 0.00643191 +-0.0545162 0.049049 -0.0054035 +-0.0209524 0.0920017 0.0529687 +-0.0534945 0.105667 0.0403502 +-0.0355002 0.174151 -0.00180627 +-0.0654804 0.146553 -0.0219125 +-0.0577458 0.131139 0.0375772 +0.0440584 0.0860884 0.0251529 +0.0484396 0.0486951 -0.00266239 +-0.0510317 0.0544187 0.0196187 +-0.0305049 0.0720397 -0.0305133 +-0.0513349 0.057067 0.0306313 +-0.0444577 0.123407 -0.0104693 +-0.0404418 0.0351129 -0.0289386 +-0.0611441 0.169381 -0.0576009 +-0.0704838 0.120388 0.0533274 +0.00150053 0.0591133 0.0550768 +-0.0504978 0.159322 0.00851944 +-0.0127755 0.126776 0.0267341 +0.00508634 0.0345614 -0.0155701 +-0.0433649 0.150829 -0.00565896 +-0.0276025 0.0888516 -0.0335952 +-0.0536948 0.0661603 -0.0107375 +0.0453129 0.0698237 0.023466 +-0.0407211 0.150643 0.00408479 +0.0111265 0.120476 0.0355761 +0.000791005 0.0398223 0.046536 +0.0460187 0.0482649 0.029417 +-0.0748889 0.119375 -0.00765967 +0.0240318 0.0591603 0.0451764 +0.0102193 0.129407 0.000604352 +-0.0662744 0.179701 -0.0600508 +-0.0165098 0.0772307 0.0561424 +0.0294369 0.0781918 0.0443709 +-0.0510278 0.0474301 0.0166894 +-0.0808293 0.0720933 0.0155437 +0.0139163 0.0953242 -0.0249235 +-0.0756827 0.0823892 -0.0125945 +0.00119778 0.0825383 -0.0355009 +-0.0614832 0.0775692 0.0421583 +-0.0816839 0.0830971 0.0318157 +-0.0257584 0.0736396 0.0456283 +0.0071927 0.124822 -0.00847934 +-0.0749667 0.0683767 0.0215337 +-0.0415307 0.127763 -0.00103989 +0.0217652 0.0862022 0.0491664 +-0.0758742 0.102063 -0.0106997 +0.00933423 0.0567711 -0.0303022 +-0.010684 0.0584354 -0.034314 +-0.0126507 0.0350556 0.0425263 +0.0424994 0.0597124 0.0306347 +-0.0147222 0.0643235 -0.037347 +0.0579415 0.0716454 0.0119821 +-0.000418875 0.0389219 -0.0131688 +-0.0480228 0.144604 0.00545108 +-0.0124881 0.120998 0.0354929 +-0.0941295 0.121483 0.024294 +0.0533093 0.0573451 -0.00263239 +-0.0426699 0.0336999 -0.0149012 +-0.0466248 0.0577591 -0.0115398 +-0.0628785 0.0393963 0.0426563 +-0.072166 0.063706 0.0120556 +-0.0912059 0.14882 0.0151457 +-0.033491 0.0904012 0.0444067 +0.0152459 0.0821521 -0.0296185 +-0.0608506 0.0333964 -0.00541551 +0.0483298 0.0694277 0.0246416 +-0.0144087 0.0383376 0.0158464 +-0.00316996 0.131012 0.0171239 +0.0247594 0.0929114 0.046503 +-0.0615203 0.153356 0.00130737 +-0.0618578 0.099667 -0.0183374 +0.0303629 0.0483136 -0.00765132 +0.00253507 0.0394917 0.0345311 +-0.0713444 0.144531 -0.0156116 +-0.0188175 0.159674 -0.00630165 +-0.0174928 0.111329 0.0404434 +-0.0425002 0.0437706 0.0420539 +0.038489 0.0484512 0.0319961 +-0.011814 0.163592 -0.0157611 +-0.0526941 0.0334208 -0.00928256 +-0.0613494 0.131082 0.0393909 +-0.0276253 0.0450182 -0.0280952 +-0.0449077 0.159414 0.00690868 +0.00747686 0.0474111 0.0493962 +-0.0535025 0.0917839 0.0444757 +0.0372578 0.0658262 -0.0127785 +-0.0616099 0.158421 -0.0325909 +-0.0443417 0.035118 -0.0243716 +0.0228959 0.0358901 0.0147404 +-0.0312846 0.119331 0.0291556 +-0.0748251 0.0906869 -0.0145799 +-0.0607901 0.0839118 -0.0197808 +-0.060035 0.0645406 0.0315175 +-0.0506187 0.0531538 -0.00831388 +0.0189959 0.104672 0.0434338 +-0.0328687 0.10291 -0.0220775 +0.0293781 0.0721886 -0.0217847 +0.0490097 0.0482239 0.0267018 +-0.00202044 0.0386496 0.0235231 +0.00793635 0.0980328 -0.0238123 +-0.0353308 0.0347033 0.016646 +0.00129902 0.039118 0.0292011 +0.0433693 0.0561672 -0.00598915 +0.0455002 0.059749 0.0314265 +-0.0891212 0.0888935 0.0154552 +-0.00853579 0.044404 0.0484956 +0.0227707 0.10612 -0.0163977 +-0.0830074 0.117688 0.0489709 +-0.0652397 0.150467 -0.0337229 +-0.0787271 0.0954037 0.0355432 +0.0320582 0.11345 0.0286813 +-0.0641355 0.160881 -0.0576174 +0.0459242 0.0806108 0.00418728 +0.0093871 0.0434015 -0.0246765 +-0.0501776 0.124028 0.032677 +-0.0486159 0.0547593 -0.0100622 +0.000494108 0.118289 0.0391022 +-0.0267825 0.0768545 -0.0363352 +0.039504 0.0914002 0.0327084 +0.0495572 0.0525985 0.0293193 +-0.0221892 0.177131 -0.0213718 +0.00724524 0.0369774 0.0269173 +0.0174748 0.0934539 0.0481542 +-0.021119 0.180019 -0.0220004 +-0.0938873 0.12827 0.0192438 +-0.0558806 0.138039 -0.00386657 +-0.0754975 0.123189 0.0531282 +-0.0682563 0.169911 -0.0313673 +0.00486454 0.131282 0.0057704 +-0.0544491 0.156028 0.0112408 +0.0259161 0.0713197 0.0444841 +-0.0205993 0.0408181 -0.0286892 +0.0326751 0.0902947 0.0421046 +0.0303546 0.107428 0.0353018 +-0.043641 0.0451148 -0.0133235 +0.0453399 0.0504735 -0.00539794 +-0.0640884 0.160897 -0.0576117 +-0.015926 0.178652 -0.0196554 +0.0285634 0.0463012 0.0357516 +-0.00467538 0.0353718 0.0474871 +0.00649755 0.131366 0.0177838 +-0.0721007 0.175064 -0.0530188 +-0.0454824 0.0959409 0.0431744 +-0.0892808 0.0888643 0.0124572 +0.00219675 0.0376886 0.0234384 +-0.0084105 0.095275 -0.0329664 +-0.0384962 0.11803 0.0312871 +-0.0451864 0.146266 0.00463419 +-0.0870838 0.0846865 0.0114769 +-0.0855325 0.107606 0.0053458 +-0.0457969 0.126831 -0.00605616 +-0.0164306 0.0384009 0.00449856 +-0.0355073 0.0662414 0.0411418 +0.0174851 0.0852069 0.0507856 +0.0160687 0.122524 -0.00804645 +-0.0586545 0.152137 0.0330321 +-0.0294308 0.0847062 -0.0336139 +-0.0725432 0.15415 0.0310449 +0.0567814 0.0724634 0.0130365 +0.0378457 0.0726607 0.0353699 +0.00540963 0.0375924 -0.0240752 +-0.0555707 0.033544 0.017104 +0.0295902 0.119982 0.0063504 +0.0197767 0.104476 -0.0186365 +-0.0484985 0.160789 0.00748776 +-0.0928176 0.120043 0.0102955 +-0.0427809 0.0464775 -0.012357 +-0.0285046 0.0645461 0.0380462 +0.00349921 0.126284 0.0311054 +-0.0670064 0.156281 0.0226936 +-0.0656496 0.0339611 -0.00733584 +-0.00649844 0.0814993 0.0573243 +0.0421622 0.0427592 0.0252421 +-0.0873651 0.0927561 0.00443631 +-0.00151033 0.108645 0.043169 +-0.0908157 0.116185 0.0427025 +0.0200734 0.0372985 0.0402199 +-0.062954 0.125297 -0.00870732 +-0.0633546 0.0720236 0.0383997 +-0.0691914 0.171601 -0.0360136 +-0.0688255 0.0937312 -0.0163709 +-0.0485029 0.112572 0.035725 +-0.00574267 0.0339825 -0.0190499 +-0.0604857 0.094604 0.0446906 +-0.0257335 0.166803 -0.00931015 +-0.0159771 0.186924 -0.0221541 +0.0463322 0.0743214 0.0180018 +0.0030519 0.130996 0.00365966 +-0.0421665 0.16366 -0.0107342 +-0.0225871 0.168294 -0.0117855 +-0.0484917 0.0718083 0.0405326 +0.0122698 0.0710113 -0.031719 +-0.0857101 0.0869161 0.0258492 +-0.0715046 0.0901731 0.0417302 +-0.0699133 0.123828 -0.00875488 +0.0279019 0.110786 -0.0114065 +-0.0354864 0.12379 0.0245568 +0.0305321 0.081181 -0.0200863 +0.0102651 0.128706 0.0263309 +0.0148603 0.0562539 0.0494599 +-0.0366932 0.0665933 -0.0149481 +0.041469 0.0711384 0.0300167 +-0.0554857 0.0834027 0.0450839 +-0.0113051 0.0389162 -0.0134542 +-0.0701665 0.143936 0.0443089 +0.0424986 0.0527982 0.0326152 +0.0132 0.115178 -0.01612 +-0.0566151 0.0335713 0.0115144 +-0.0746759 0.158036 -0.00628607 +-0.0710897 0.0678996 0.0280309 +-0.0684162 0.160948 -0.0539628 +-0.0788405 0.11444 0.0481937 +0.0425653 0.0859482 -0.00679004 +0.00508264 0.128731 0.0273249 +-0.0460392 0.132757 0.0146796 +-0.0644245 0.0335892 0.00631261 +-0.0779562 0.0727271 0.0259414 +-0.0320811 0.1577 -0.0118106 +-0.08561 0.123026 0.0486561 +-0.0183468 0.0445922 0.0521871 +-0.0646788 0.0378404 0.0247428 +-0.09254 0.118824 0.0413658 +0.0439353 0.0973509 0.0141605 +-0.0925657 0.116008 0.0123183 +-0.00476329 0.0770151 -0.03731 +-0.0647922 0.176686 -0.0531637 +-0.0267774 0.122204 0.0247423 +-0.0331437 0.169673 -0.0156322 +-0.0663865 0.0388997 0.0348294 +0.0255945 0.0477251 0.0385093 +0.0336609 0.0968599 0.0382997 +-0.0916539 0.147467 0.0181472 +-0.0336992 0.0435791 0.0473765 +-0.0785063 0.162438 -0.0279579 +-0.0756712 0.0759423 -0.00884701 +-0.0623186 0.155306 -0.0155862 +-0.0754942 0.124603 0.052984 +-0.0710841 0.0626658 0.0113319 +-0.0214966 0.101664 0.0441706 +0.0325091 0.0454335 0.0302933 +0.023348 0.0930459 -0.0224955 +-0.0477168 0.123954 0.0291105 +0.026559 0.119879 -0.0019388 +-0.0671262 0.150692 -0.0396095 +-0.054551 0.0416447 -0.00949548 +-0.0689 0.115705 0.0512836 +0.0420833 0.0409609 0.00227771 +0.021477 0.0961774 0.0469631 +-0.0517663 0.0812234 -0.0211522 +0.0324154 0.0541402 -0.0117355 +-0.0283184 0.0383801 -0.00152859 +-0.0454995 0.122409 -0.0114255 +-0.0786209 0.174303 -0.0444916 +-0.0570614 0.151623 -0.00120922 +0.0242791 0.118022 0.0317589 +-0.0639993 0.0370815 0.0170442 +-0.0395018 0.0733502 0.0421461 +-0.0174724 0.0388154 -0.0145918 +-0.0829949 0.115554 0.048125 +-0.0155328 0.0386551 0.0297691 +-0.00449743 0.110031 0.0429169 +-0.062341 0.164692 -0.0435908 +-0.016985 0.0384848 0.0278228 +0.0153998 0.109294 -0.0177665 +-0.0121134 0.0347053 0.046472 +0.0238752 0.0421864 0.0394869 +-0.0510476 0.139892 0.00172061 +-0.073661 0.147179 -0.0178577 +-0.0673436 0.155169 0.0284164 +-0.0375089 0.0790164 0.0426336 +-0.0881282 0.0888644 0.0224361 +-0.0165385 0.0459978 0.0505746 +0.0187298 0.0489829 0.0426596 +0.00514365 0.0400743 0.045751 +-0.0405081 0.080404 0.0427771 +-0.0559081 0.112628 -0.0165116 +-0.0414824 0.100082 0.0415393 +0.0326734 0.101648 -0.0136311 +0.0591059 0.0677548 0.00712748 +-0.00525238 0.0350087 0.0405181 +0.0272291 0.0788716 -0.0231926 +0.0526679 0.0554283 0.0285725 +-0.074839 0.15964 -0.0289433 +-0.0475589 0.0335011 0.00261705 +0.0224079 0.0809035 0.0500644 +-0.0774544 0.072993 0.0275707 +-0.0817516 0.140386 -0.000790241 +-0.0203273 0.127615 0.0123404 +-0.0570931 0.0535244 0.00162534 +-0.0775213 0.124569 0.0523637 +-0.0267733 0.15662 -0.0020223 +-0.0341168 0.0383136 -0.000825234 +-0.0926373 0.122856 0.0322729 +0.00549857 0.09243 0.054294 +0.0202616 0.0749268 -0.0272874 +0.0133552 0.13008 0.0103074 +0.0423653 0.0519948 -0.00681796 +-0.0627003 0.150649 -0.00857321 +0.0200754 0.0713524 0.0501382 +-0.0182235 0.123174 0.0292543 +-0.0130686 0.183424 -0.0252779 +-0.0128628 0.0896836 -0.0372956 +-0.0301706 0.0421547 -0.0296993 +0.0403707 0.0444834 -0.00362771 +-0.0253772 0.0722169 0.0453002 +-0.0241328 0.0565311 0.0416958 +-0.0657729 0.0378142 0.038507 +-0.0475733 0.0504004 -0.00924022 +0.0347756 0.0548514 0.0342768 +-0.01273 0.098974 -0.0248693 +-0.0749897 0.139866 -0.00647617 +0.0541381 0.0477755 0.0182012 +0.026052 0.121668 0.00219807 +-0.0178133 0.0827451 -0.0392154 +-0.00506384 0.129812 0.0236663 +-0.0022335 0.116052 -0.016996 +0.0194826 0.0892535 0.0485994 +-0.00549695 0.108658 0.0435455 +0.0411799 0.0844321 -0.00979241 +-0.0546525 0.154186 0.0155249 +0.0209039 0.0386887 -0.00868617 +-0.0522987 0.0504261 0.0316576 +-0.00860205 0.0406149 -0.0260948 +-0.0064872 0.119657 0.0377321 +-0.0794636 0.141716 -0.00376694 +-0.0494618 0.0347575 0.043629 +-0.0282938 0.176171 -0.0172378 +-0.0337476 0.119587 0.029726 +-0.0548148 0.0883935 -0.0220325 +-0.0759162 0.179384 -0.0516058 +-0.0444968 0.0747696 0.0424527 +0.0361181 0.111694 0.0216233 +-0.0677747 0.0370061 0.0137537 +-0.0497774 0.0826759 -0.0213753 +0.0238372 0.12269 -3.58731e-05 +-0.0478227 0.148347 -0.00331487 +-0.00860618 0.0968801 -0.0306409 +-0.0545965 0.0575496 0.0196126 +-0.06512 0.0430832 -0.00329452 +-0.0719312 0.128266 -0.00893149 +-0.0409612 0.0344092 -0.00782476 +0.0534457 0.0510274 0.0243391 +0.0276856 0.0494518 -0.0176966 +-0.0336693 0.0607336 -0.0127906 +-0.0284587 0.0446173 0.0507119 +-0.0255118 0.0936195 -0.0293755 +-0.0717668 0.172238 -0.0510285 +-0.047089 0.156143 -0.00736831 +-0.0756553 0.0837701 -0.0135751 +-0.013224 0.172718 -0.0260103 +-0.0301691 0.174141 -0.0165339 +-0.00226303 0.0382357 0.0184109 +0.0412731 0.0417215 0.0241695 +-0.0559192 0.0335546 0.0152404 +0.0277966 0.12141 0.0199376 +-0.0649916 0.0659907 0.0309635 +-0.0512719 0.127504 -0.00467957 +0.0313718 0.118521 0.0155758 +-0.0621134 0.0350003 0.0423988 +0.00602626 0.127371 -0.00517179 +-0.0500909 0.0358963 0.0459805 +-0.0852266 0.0854944 0.0253873 +-0.0209874 0.04034 0.0536055 +-0.0719403 0.179282 -0.0559874 +-0.0521219 0.120842 -0.0117106 +0.0579437 0.0700837 0.0193768 +-0.0786649 0.0764169 0.0296559 +-0.0724896 0.12743 0.0524304 +0.0400371 0.107017 0.0091647 +-0.0677955 0.0355805 0.0137906 +-0.0212083 0.0825271 0.0563448 +0.0305816 0.112813 -0.00758269 +0.0546919 0.0524816 0.0244106 +0.000503407 0.0647904 0.0566018 +-0.0211614 0.183089 -0.0130948 +-0.0364897 0.0648519 0.0414613 +0.00739557 0.0347435 -0.0216037 +-0.091466 0.14613 0.0241501 +-0.0496442 0.0620141 -0.0117058 +-0.0844141 0.083121 -0.000497419 +0.00924009 0.0846665 0.0556174 +-0.00137013 0.0367929 0.00718583 +0.0499211 0.0443554 0.0178724 +-0.0257693 0.158564 -0.0117505 +-0.08951 0.140665 0.0311774 +0.0074706 0.129229 -0.00123166 +0.0318377 0.0822312 0.0425933 +0.0347555 0.0768972 -0.0157225 +-0.0103619 0.179472 -0.0295714 +0.0350602 0.0968439 0.0368099 +0.0192972 0.063662 -0.0278633 +-0.0758841 0.106327 -0.00893896 +0.0225495 0.119713 -0.00701355 +0.0522449 0.0480372 0.0225432 +-0.0142613 0.0350279 0.0492532 +0.0588535 0.0566417 0.00718098 +-0.0834209 0.0911774 0.0304851 +-0.0354827 0.0945899 0.0441989 +0.0491837 0.0442045 0.019604 +-0.0441515 0.0335185 0.00510187 +-0.0605024 0.111127 0.0368734 +-0.0368482 0.0336146 -0.0266993 +0.0043237 0.131753 0.0112849 +-0.0519904 0.135575 0.0286552 +-0.0628904 0.102548 -0.0180123 +-0.0194395 0.062521 0.0495605 +0.0173831 0.0447578 -0.0232543 +-0.0925995 0.118805 0.0322947 +0.00218481 0.0838969 -0.0348518 +0.0331279 0.0428909 0.0287274 +-0.0528013 0.0884055 -0.0219839 +0.0151848 0.115917 -0.0149184 +0.0567976 0.0508328 0.0181941 +-0.0621222 0.0345142 0.0394173 +-0.0642021 0.071089 0.0372614 +-0.0701839 0.0658802 0.0247105 +0.0178908 0.0563588 0.0485803 +0.0392199 0.073038 -0.0108301 +0.0263921 0.0549677 -0.020802 +-0.0858835 0.0833066 0.0204824 +-0.0812999 0.0747823 0.0185535 +0.0025057 0.0688921 0.0558596 +-0.0804035 0.0745659 0.0220984 +-0.0604943 0.0804378 0.0430854 +0.0220864 0.122759 -0.00230579 +0.0416849 0.100037 0.02216 +-0.0387577 0.150948 -0.00516845 +0.0420841 0.090131 -0.00780186 +0.0270265 0.12251 0.0139387 +-0.0715501 0.0763344 0.0374538 +-0.0885696 0.137819 0.0397738 +0.00156461 0.124373 0.0333352 +-0.00526883 0.0355403 -0.0166416 +-0.0769711 0.133968 -0.00621304 +-0.0750334 0.0851031 -0.01456 +-0.00549741 0.0675328 0.0561955 +0.00134414 0.0524973 -0.030237 +-0.0573916 0.0718042 0.0398933 +0.0283911 0.0672932 0.0427559 +-0.0910025 0.133774 0.0232232 +-0.0354998 0.17123 0.000174393 +0.0458285 0.0801218 0.0204223 +-0.0574741 0.0819362 0.0441691 +0.0510603 0.0729911 0.0094016 +-0.0363492 0.0338444 -0.0305686 +-0.024023 0.17718 -0.0120308 +-0.0625429 0.143922 0.0377415 +0.0323895 0.0490788 -0.00667281 +0.00525838 0.123196 -0.010701 +-0.0294162 0.0890096 -0.030595 +0.0479414 0.0588591 -0.00500215 +0.0158474 0.128954 0.00837281 +0.0170299 0.0590745 0.0491032 +0.0534095 0.0553934 0.0278769 +-0.0600285 0.134031 -0.00683616 +-0.0595027 0.0876292 0.04502 +-0.0323351 0.172733 -0.00297212 +-0.0374903 0.172653 -0.000576721 +0.00749482 0.0546914 0.0525351 +0.0383894 0.0519545 -0.00670373 +-0.0331162 0.0436399 0.0481995 +0.0444193 0.0734774 0.000193217 +-0.0392699 0.127033 -0.00231305 +-0.0377966 0.0870844 -0.0227292 +0.0398005 0.0712586 0.0329247 +0.0227875 0.0348957 0.00078699 +-0.0825515 0.0748682 0.00752949 +-0.0162407 0.125507 -0.00287714 +-0.0654856 0.0398574 0.0313799 +-0.0623389 0.163139 -0.0325913 +-0.0686122 0.0432054 0.00454593 +-0.0379623 0.174733 -0.00453553 +-0.0563002 0.154681 0.0207165 +-0.0455391 0.0396225 -0.0172907 +0.033177 0.0592197 0.0390624 +-0.030845 0.0944191 -0.0240931 +0.0149304 0.0913967 0.05159 +-0.0283564 0.125587 0.00796681 +-0.0364861 0.0547872 0.0389196 +-0.0284285 0.0821494 0.0466355 +-0.0626767 0.0346583 0.0408688 +0.0226817 0.0618915 0.0467691 +-0.00273397 0.0346073 0.0449802 +-0.0747362 0.0663817 0.0145125 +-0.0135041 0.11966 0.0364252 +-0.0466771 0.0355018 -0.0172702 +-0.0711048 0.153963 -0.0459144 +-0.0910141 0.11449 0.034742 +-0.0801763 0.0854684 -0.0085384 +-0.0199842 0.183117 -0.0149159 +-0.0705018 0.155741 0.00837641 +-0.0229946 0.0381678 0.00700416 +-0.0428236 0.0913841 -0.0227682 +-0.0679787 0.154919 -0.0513588 +-0.0787367 0.168047 -0.0389551 +-0.0308479 0.0972408 -0.0233409 +-0.0127769 0.0784711 -0.0383296 +-0.0528408 0.0970645 -0.0221327 +0.0578361 0.0662412 0.00314493 +0.0132266 0.0822053 -0.0304726 +-0.058487 0.113928 0.0361856 +-0.0609416 0.0341022 0.0225725 +0.0498583 0.0540108 0.0297623 +-0.00985903 0.128582 0.0248602 +0.0180859 0.068641 0.0507282 +-0.0275932 0.0779206 0.0459339 +-0.0474983 0.11254 0.0358059 +-0.00306313 0.0346488 0.0430839 +-0.0494839 0.141682 0.00839735 +-0.0444006 0.0337168 -0.00238543 +0.0222885 0.0564166 0.0461469 +0.00464996 0.0378242 0.0256263 +0.00823548 0.113838 -0.0186606 +-0.0404969 0.0634536 0.0414219 +0.0464934 0.0638096 0.0291729 +-0.0275092 0.181505 -0.00874152 +-0.0850366 0.134888 0.000298852 +-0.053967 0.0687802 0.0379578 +0.0458863 0.0820184 0.0171704 +-0.0630174 0.113067 -0.0134471 +0.0163641 0.0348027 -0.00791773 +-0.0668226 0.0923514 -0.017257 +-0.073517 0.104058 0.0373151 +-0.0520334 0.0346252 0.0362685 +0.00147793 0.131501 0.00880182 +-0.0874177 0.131128 0.0459004 +-0.0124954 0.103038 0.0437348 +-0.0148129 0.0841518 -0.0390669 +-0.061937 0.111099 -0.0150221 +0.0286115 0.078186 0.0449305 +-0.0884601 0.0976543 0.0226015 +-0.0196643 0.111086 -0.0196461 +-0.0196772 0.178663 -0.0162873 +-0.0220478 0.0811409 0.0558034 +0.00850296 0.118331 -0.0155001 +-0.0404972 0.0506061 0.0393715 +-0.0833705 0.0767799 0.0142875 +-0.085765 0.112351 0.0286477 +0.0363022 0.0619082 0.0365841 +-0.000508059 0.0576316 0.0544767 +-0.089275 0.0969971 0.0184044 +-0.0708142 0.0694524 -0.00574088 +-0.0186131 0.0378854 -0.0277917 +0.0283679 0.103615 -0.0157324 +-0.0354292 0.0472715 0.0405203 +-0.0748611 0.163212 -0.0154286 +-0.0862421 0.14327 0.00816028 +0.0357067 0.0981492 -0.0118335 +0.0223181 0.0592817 -0.0260832 +-0.0625553 0.041701 -0.00649092 +-0.0824187 0.100645 0.0306028 +-0.0598691 0.101152 -0.0187591 +-0.0309758 0.0383278 -0.0168292 +0.0239145 0.0835849 0.0487444 +-0.00271812 0.0380275 0.0166967 +-0.00631097 0.0354995 -0.0168068 +-0.0435801 0.0491173 -0.010788 +-0.0586891 0.065984 -0.0090861 +-0.072851 0.148958 0.0401319 +0.0442902 0.0875035 0.0241471 +-0.0155441 0.165408 -0.0121335 +-0.084276 0.107651 0.0243439 +-0.0705376 0.04043 0.00377428 +-0.0107227 0.165105 -0.0188107 +-0.0550975 0.13533 0.0326236 +-0.0735773 0.0648576 0.0107478 +-0.0227215 0.0797443 0.0551012 +-0.0404988 0.043751 0.0418177 +-0.0507215 0.132501 0.0301542 +-0.0728912 0.11354 -0.00756484 +0.00242535 0.0343652 0.00462872 +-0.0556704 0.0335434 0.000932366 +0.00528142 0.0509933 -0.0292119 +0.0213389 0.0621093 -0.0262711 +-0.0275166 0.0348502 0.0465557 +-0.0826299 0.110259 0.0284001 +-0.00850001 0.125156 0.0314578 +-0.0707102 0.149836 -0.0414255 +0.0204972 0.107072 0.0404393 +-0.0215031 0.108553 0.041118 +-0.0404837 0.0818282 0.0429123 +-0.0586314 0.0580318 0.0162523 +-0.0648762 0.109524 -0.0137682 +-0.0687139 0.0394283 -0.00171366 +0.00150188 0.0938741 0.0550191 +0.027072 0.122359 0.0168201 +-0.0275307 0.0918372 0.0449329 +-0.00320104 0.131164 0.014241 +0.00886384 0.130684 0.0200808 +0.0402562 0.0857576 -0.0117696 +-0.0823675 0.147331 0.00217458 +-0.082659 0.0776741 0.0225196 +-0.0388763 0.107081 -0.0200218 +0.0151073 0.108635 -0.0180644 +0.0460054 0.0746307 0.0193568 +-0.0735009 0.117559 0.0527975 +-0.0337749 0.0338108 0.0177666 +0.032372 0.116958 0.0202394 +-0.0763319 0.15494 -0.00387485 +-0.0687774 0.0837142 -0.0175822 +-0.010498 0.0517545 0.0512545 +0.0210632 0.038679 -0.00769573 +0.0140028 0.091392 0.0520062 +-0.0842337 0.150005 0.032317 +0.0332536 0.0916169 0.0411931 +-0.0394897 0.0874644 0.0433271 +0.0207921 0.106393 -0.0166835 +-0.0368012 0.111669 -0.0181954 +-0.0495137 0.0503617 0.0366255 +-0.0314035 0.121359 0.0260922 +-0.0745094 0.140045 0.0479791 +-0.020484 0.0842242 0.0566713 +-0.00549585 0.0911858 0.0567127 +-0.0870672 0.0882048 0.024333 +-0.0377523 0.0783086 -0.0194038 +0.0407806 0.0717592 -0.0087638 +0.00365619 0.131646 0.00960837 +-0.0157548 0.0714554 -0.0386719 +0.0597099 0.0650292 0.0201784 +-0.0675187 0.0874976 0.0437834 +0.0405833 0.0670896 0.0305002 +-0.0180479 0.0418467 0.0526068 +-0.0427079 0.151894 -0.00649313 +-0.0220141 0.0388944 0.0538623 +0.00616925 0.0895403 -0.0330971 +-0.0064158 0.0391939 0.0347568 +0.0557201 0.0581302 0.0259556 +0.0563341 0.0711373 0.00671617 +-0.0727258 0.157431 -0.00265266 +0.0125423 0.120941 -0.012332 +0.00414764 0.103055 -0.021794 +-0.029166 0.0762862 0.0418904 +-0.0268469 0.0423164 0.0533212 +-0.0621198 0.0344764 0.0202314 +-0.0618524 0.169383 -0.0535961 +0.0250825 0.10872 0.0381638 +-0.0908254 0.142021 0.0251655 +-0.046283 0.129949 0.00285861 +0.0179105 0.0350278 -0.0116533 +-0.0397746 0.0826803 -0.0210594 +-0.0651763 0.16954 -0.0402745 +-0.0621336 0.16002 -0.0235787 +-0.0355709 0.168274 -0.000671324 +-0.037536 0.159586 0.00182669 +-0.0681305 0.148403 -0.0333773 +-0.0364875 0.100095 0.0421869 +0.0545857 0.0608947 0.0278753 +0.0195769 0.0347391 0.0223805 +-0.0765172 0.154938 0.0266851 +0.0329357 0.0710876 -0.0177809 +-0.0434945 0.111176 0.0370674 +-0.0144911 0.124164 0.030554 +-0.0644813 0.157544 -0.049277 +0.0162463 0.0722881 -0.029887 +0.0292794 0.111414 0.0337321 +-0.0730559 0.14548 -0.015959 +-0.032702 0.0694797 -0.021456 +-0.0682487 0.153053 0.0340661 +-0.0810659 0.143393 0.0434586 +-0.0508913 0.0474088 0.0186488 +-0.041491 0.0832013 0.0425516 +-0.0689521 0.151509 0.0368557 +0.00620362 0.0387395 0.045605 +-0.0437238 0.0739429 -0.018203 +-0.0589977 0.125247 -0.00779139 +0.0113495 0.0553023 -0.0296776 +-0.0665061 0.0972756 0.0420058 +0.00151221 0.0828796 0.0573767 +-0.000819486 0.131234 0.00795191 +0.0463579 0.0575632 -0.00556359 +-0.0223022 0.165377 -0.00961273 +0.0177451 0.0379283 0.0429098 +-0.0914397 0.143364 0.0211639 +-0.0366139 0.0493085 -0.0123994 +-0.0374871 0.0576725 0.0398228 +-0.0252778 0.0383536 -0.00088571 +-0.0593549 0.0410534 0.0179552 +-0.0667502 0.0337781 -0.00695475 +-0.0206534 0.0391059 0.0372895 +-0.0144184 0.0997913 0.0448499 +-0.0451841 0.16983 -0.00497124 +-0.017913 0.184413 -0.0239895 +-0.0265191 0.0388768 0.0380618 +-0.0908997 0.126938 0.0424248 +-0.000826517 0.0853922 -0.0362438 +-0.0534467 0.125409 -0.00644153 +-0.0368662 0.104233 -0.0205194 +-0.02728 0.181917 -0.0121056 +-0.0487731 0.0349958 0.0444688 +-0.0894993 0.135155 0.0302067 +0.0152294 0.0345961 -0.00794828 +-0.0135581 0.166929 -0.0145181 +-0.00316211 0.129199 -0.00103699 +0.0125106 0.108449 0.040622 +0.0494051 0.0734301 0.0147277 +-0.0427147 0.0710705 -0.0176966 +-0.0505553 0.136728 0.0232523 +-0.055076 0.154226 0.0167194 +-0.0598887 0.10828 -0.0169771 +-0.00348603 0.0489394 0.050606 +-0.0325038 0.107028 0.0393329 +-0.0558273 0.114722 -0.0152839 +-0.024429 0.062147 0.0418364 +0.0610039 0.0637491 0.0121545 +-0.0307981 0.0381678 0.00179566 +-0.0224893 0.0462052 0.0523041 +-0.0626699 0.13529 0.0374908 +-0.0871093 0.106357 0.0153576 +0.018535 0.0346925 0.0222104 +-0.0633642 0.142485 0.0383017 +0.0395752 0.0602985 0.0307005 +0.0196495 0.0356664 -0.00567711 +-0.00666974 0.0555272 -0.0330407 +-0.0554731 0.154191 0.0210182 +-0.00998984 0.177238 -0.0295136 +0.0366228 0.111865 0.00747742 +-0.00322809 0.0999661 -0.0238789 +0.00852647 0.0349744 0.0253569 +0.0337455 0.11169 -0.0043358 +-0.033869 0.10148 -0.022225 +0.0215013 0.108432 0.0393095 +0.027565 0.119234 0.026993 +-0.0477832 0.129154 -0.000397631 +-0.057288 0.0521607 0.00365094 +0.0119513 0.0873992 0.0542929 +0.0510679 0.0720267 0.021243 +-0.0525522 0.0487323 -0.0069784 +0.0419877 0.102851 0.0121565 +-0.0154922 0.126886 0.0243264 +-0.010476 0.0965182 0.0531854 +-0.0107078 0.0628117 -0.0359649 +-0.0848416 0.0858026 -0.00253503 +-0.0300028 0.125562 0.00590559 +-0.0137234 0.0643092 -0.0370705 +0.025242 0.0761745 -0.0249679 +-0.0268088 0.0852978 -0.0363495 +0.028746 0.0693043 -0.0217828 +-0.0525052 0.112524 0.0359139 +0.0608734 0.0637391 0.0151617 +-0.0820606 0.151973 0.00432386 +-0.065153 0.0712063 0.036955 +-0.0590564 0.0335255 0.00387291 +-0.0726667 0.0777379 -0.0132872 +-0.0639501 0.166025 -0.0326719 +0.033089 0.0892132 -0.0184699 +-0.0410037 0.148494 -0.000715623 +0.0152676 0.11708 -0.0141694 +-0.0405102 0.127658 -0.000961794 +0.0135046 0.108467 0.0407674 +-0.0598038 0.0341949 0.0280011 +-0.025416 0.0905129 0.0490114 +-0.0383992 0.0420226 0.0422608 +-0.0414999 0.0478558 0.040117 +-0.0525584 0.0501546 -0.00685551 +-0.0394783 0.0832832 0.0435432 +-0.0409872 0.0335947 -0.0218947 +-0.0234596 0.184384 -0.0119315 +-0.00549722 0.0633676 0.0561862 +-0.0249111 0.0958255 0.0441185 +-0.0794946 0.12171 0.0507273 +0.0218787 0.0430332 -0.0157248 +-0.0284679 0.0718578 -0.0335433 +-0.0287174 0.0344722 -0.0298467 +-0.0375646 0.0407082 -0.0285349 +-0.0684694 0.153743 0.0324784 +0.0275012 0.1187 -0.00304813 +-0.0654981 0.100096 0.041968 +-0.0728966 0.155445 -0.0329107 +-0.024103 0.171237 -0.0122056 +-0.0213641 0.0384977 0.0305062 +-0.00878734 0.0798675 -0.0379507 +-0.0034971 0.0703995 0.0574239 +-0.0628591 0.0679841 0.0349557 +-0.0205114 0.0512056 0.0456176 +-0.0215925 0.0364837 -0.0283556 +0.0308475 0.0751439 -0.0207339 +0.0345069 0.0483661 0.0310725 +0.00650269 0.044152 0.0457422 +-0.0404948 0.0733395 0.0422389 +0.00152573 0.0717149 0.0566366 +-0.00449638 0.110771 -0.0213478 +-0.0786622 0.0733343 0.0252726 +-0.00997021 0.129828 0.00744342 +-0.0368781 0.107107 -0.0201846 +0.0114979 0.112659 0.03891 +-0.0516419 0.126901 0.0340875 +-0.05391 0.13392 0.032587 +-0.0537085 0.0491368 0.0316573 +-0.086972 0.143283 0.00915353 +-0.0889751 0.0969295 0.00842099 +-0.0378902 0.121927 0.0281694 +-0.0870357 0.141902 0.00919077 +-0.056635 0.0350546 0.0452244 +-0.019816 0.0347801 0.0465131 +0.0392931 0.086096 0.0340337 +-0.0869334 0.0861006 0.0224549 +-0.0643967 0.0646443 0.0287462 +-0.0398612 0.101404 -0.0212384 +-0.0536876 0.0334698 -0.00403732 +-0.0785163 0.162478 -0.0269418 +-0.0638695 0.16329 -0.0240265 +-0.087202 0.10043 0.0240701 +-0.0736795 0.145791 -0.0128538 +0.0436314 0.0736519 0.026072 +-0.0326308 0.0352345 0.0485487 +-0.0158901 0.160985 -0.0130889 +0.0154243 0.0781303 0.053988 +0.00317805 0.0980649 -0.0258881 +-0.00360287 0.0419944 -0.0253901 +-0.0681856 0.169443 -0.0550153 +-0.0937199 0.12277 0.0132819 +-0.0335083 0.11115 0.0363293 +-0.0897769 0.0915868 0.0144438 +-0.00790609 0.0389527 -0.0109414 +-0.0512486 0.0474505 0.019655 +0.0299943 0.101654 -0.0156302 +-0.0688114 0.086573 -0.0173858 +-0.0425222 0.0435673 -0.0203211 +-0.0411345 0.037889 -0.0275181 +-0.0451234 0.0336213 -0.00611106 +-0.0513475 0.115214 -0.0158415 +-0.0135796 0.18457 -0.0255034 +0.0514482 0.0490026 0.000289284 +-0.0154766 0.160714 -0.011803 +-0.0871595 0.128427 0.0471391 +0.0253818 0.0487646 -0.0196147 +-0.0226623 0.0866242 0.0548392 +-0.00567144 0.0569411 -0.0332111 +0.046481 0.0764536 0.00918999 +0.0579995 0.0690441 0.020859 +-0.0371 0.126156 -0.00341777 +-0.073756 0.0716254 0.0312714 +-0.0320938 0.0457263 -0.0270587 +-0.0109396 0.165104 -0.0156606 +-0.088578 0.151544 0.0220955 +0.00637955 0.131641 0.0120332 +-0.00648723 0.114138 0.040862 +-0.058347 0.0335497 0.00759386 +0.00578775 0.0392649 0.0317966 +-0.0571091 0.140994 0.0314586 +-0.00487882 0.107372 -0.0225382 +-0.0806197 0.114932 0.047462 +-0.0334955 0.0874648 0.043047 +-0.0460993 0.132381 0.0175967 +-0.0638759 0.0334217 -0.000619218 +-0.0121322 0.038759 -0.00601251 +-0.0743637 0.153685 0.0319267 +-0.0445292 0.0547767 0.038815 +0.0265401 0.0686018 0.0436052 +0.0300756 0.0946988 -0.0182345 +-0.00649809 0.0703887 0.0571625 +-0.0574852 0.0861616 0.0444185 +-0.0204789 0.081458 0.0566556 +-0.045663 0.0367902 -0.0212772 +-0.0660163 0.156182 0.0230465 +0.0105014 0.112682 0.0391847 +-0.0863368 0.153207 0.0174967 +-0.0314199 0.0595176 -0.0174145 +-0.0903295 0.150229 0.0211233 +-0.0394972 0.0648803 0.0416583 +-0.0107858 0.0386823 0.0289151 +-0.0567014 0.0534733 -0.0003903 +-0.00348704 0.121028 0.0369539 +0.0367923 0.0967547 0.0340658 +-0.0206904 0.0538665 -0.0309758 +0.0171483 0.0535046 0.047456 +-0.052342 0.035529 0.0457534 +-0.0350351 0.0408695 0.0473482 +-0.0364795 0.0519621 0.0386972 +0.0339284 0.0669478 -0.0167571 +-0.0277715 0.0852268 -0.0356683 +0.00655622 0.121628 -0.0130526 +-0.0586532 0.0645395 -0.00761311 +-0.0582249 0.0344034 0.0351394 +-0.00633129 0.0388612 -0.00122239 +-0.0669198 0.113752 -0.0107887 +-0.0667337 0.0374088 0.0337222 +-0.00249774 0.0520145 0.0539036 +-0.0450377 0.0345968 0.0325315 +0.0242293 0.119847 -0.00515511 +-0.0932424 0.12021 0.0392849 +-0.0535442 0.129727 0.0348674 +-0.00517846 0.0367339 0.04845 +-0.0734548 0.0752713 0.0352251 +-0.0687371 0.155896 0.0104629 +-0.0471614 0.0336254 -0.00103179 +-0.00441737 0.117961 -0.0150091 +-0.0238639 0.0825121 0.0547585 +-0.0132802 0.102485 0.0435875 +-0.0649278 0.105334 -0.0156241 +0.0286778 0.116188 -0.00517917 +-0.0236663 0.0381653 0.00868472 +-0.0645999 0.0432992 0.0347148 +-0.0856886 0.0926246 -0.00156242 +-0.0835056 0.0777286 0.0204901 +0.0321567 0.107734 -0.010124 +-0.0895151 0.151559 0.0181181 +0.0110134 0.130158 0.00376449 +-0.0202842 0.16977 -0.0137262 +-0.00591514 0.12799 -0.00376372 +0.0143906 0.0373653 -0.0212799 +-0.0719296 0.11219 -0.00889601 +-0.0157228 0.0642918 -0.0372774 +0.0269219 0.115924 -0.00692402 +-0.0665225 0.0435914 0.00948645 +-0.0747288 0.102175 0.0369848 +0.0207343 0.120306 -0.00765281 +-0.0240392 0.0380418 0.0177619 +-0.0806691 0.107746 0.0299304 +0.0541727 0.0734662 0.0150335 +-0.0828869 0.0763004 0.0145215 +-0.0490771 0.154645 -0.00592496 +0.0211784 0.0973838 -0.0221644 +-0.0576844 0.0467193 0.0286753 +0.00985328 0.0602892 0.0527986 +0.0232608 0.0748451 -0.0261321 +-0.0524982 0.0862336 0.045539 +-0.0783198 0.147274 -0.0028373 +0.0082875 0.114937 -0.017843 +0.018445 0.0456517 -0.0226728 +-0.0239275 0.1816 -0.0100979 +-0.040758 0.0797297 -0.0196637 +-0.0485257 0.121087 0.0297472 +-0.0345208 0.0633716 0.0403553 +-0.00118398 0.0362533 0.0473478 +0.000189104 0.0867348 -0.0351526 +0.0231695 0.0520348 0.0420858 +-0.0324783 0.0337381 0.0144953 +-0.0597681 0.0334439 0.00560092 +0.0177557 0.0344112 0.00209212 +0.0159863 0.0860656 0.0513294 +-0.0393291 0.127134 0.01721 +-0.0628998 0.1209 -0.00884208 +0.04086 0.101423 0.0231764 +-0.0146702 0.122522 -0.00773793 +-0.0292113 0.156649 -0.000270817 +-0.0415254 0.172553 -0.00373349 +-0.0365135 0.084703 0.0437856 +-0.0208969 0.0381794 0.0236923 +0.011579 0.120136 -0.0134617 +-0.0347516 0.0383809 -0.00467189 +-0.0166266 0.172732 -0.0172138 +-0.0531086 0.126902 0.0355005 +-0.0154789 0.0347707 0.0439361 +-0.0110657 0.112343 -0.0190003 +0.0286979 0.0806527 -0.0216026 +-0.00681305 0.0345833 0.0441587 +-0.0245442 0.0708437 0.0459353 +-0.0613991 0.0718897 0.0389316 +-0.0682443 0.179461 -0.0589214 +-0.00573885 0.0698843 -0.0361103 +-0.0875967 0.100907 0.00640641 +0.0169866 0.0348952 0.0343866 +0.0228667 0.0444458 -0.0147763 +-0.0536029 0.162357 0.00297376 +-0.0723862 0.156822 -0.0359122 +0.000140075 0.103071 -0.0225088 +-0.0543692 0.0334679 -0.00234676 +-0.0771859 0.109877 -0.00559641 +-0.0922148 0.11614 0.0373108 +0.00616718 0.124896 -0.00854967 +-0.00125449 0.12189 -0.0112382 +0.0349132 0.114353 0.0126105 +-0.0534959 0.107052 0.0398334 +0.0553645 0.0492819 0.0192078 +0.0496613 0.0501912 -0.00270335 +-0.0917143 0.128313 0.0332436 +0.00552678 0.0619607 0.0559576 +-0.0252475 0.0736694 0.0465167 +-0.0656879 0.156227 0.015899 +0.0167178 0.128574 0.00869666 +-0.0616277 0.154191 0.00244865 +-0.0845352 0.136246 0.000324782 +-0.0835033 0.0804619 0.0265017 +-0.0380583 0.154792 -0.00920218 +-0.0683549 0.0382578 0.0114352 +-0.0713665 0.156324 0.018248 +0.0326986 0.0781958 0.0420379 +-0.0267044 0.158758 -0.0121466 +0.0274612 0.0417732 0.0323464 +-0.00748374 0.116886 0.0393445 +-0.0618946 0.0333508 -0.00558837 +-0.022958 0.166842 -0.0105567 +0.000373363 0.0349968 0.00734292 +-0.0437553 0.033642 0.00144997 +0.0267259 0.120866 0.0252428 +-0.0859248 0.0832079 0.00547822 +-0.00269975 0.109146 -0.0216168 +0.055733 0.052157 0.00319809 +-0.0704697 0.181218 -0.0537747 +0.00698645 0.0818884 0.0558396 +0.0424628 0.0943961 -0.00280162 +-0.0560128 0.0334549 0.00994988 +-0.000497737 0.11557 0.0407823 +0.0115122 0.104463 0.0449641 +0.0113328 0.124014 0.0325236 +-0.0257103 0.0983522 -0.0242349 +0.0385114 0.038461 0.00447642 +0.0274866 0.0994982 0.0416519 +-0.0205044 0.11679 0.0360351 +-0.0287307 0.0748955 0.0414817 +0.021677 0.0354914 0.00935068 +-0.0604978 0.109778 0.0376942 +0.0349482 0.114159 0.0154869 +-0.0891171 0.11284 0.0400327 +-0.0525174 0.133925 0.0310668 +-0.0467675 0.0811826 -0.0202513 +0.0148515 0.129255 0.0180171 +0.0134018 0.0418881 -0.0236384 +-0.0196836 0.0524593 -0.0309769 +-0.0907522 0.136478 0.0191999 +-0.0282073 0.178522 -0.0159874 +-0.0456817 0.146626 -0.00135754 +-0.0234782 0.174205 -0.0130294 +0.0157394 0.128861 0.0183169 +-0.049553 0.0432181 -0.0104928 +-0.0364431 0.0379518 -0.0296736 +-0.0342528 0.161016 -0.000502552 +-0.0106993 0.061373 -0.0355475 +0.0155546 0.034804 0.0269401 +0.0445305 0.0664178 0.0264316 +-0.0692603 0.166617 -0.0519986 +0.00900275 0.0343116 -0.0200681 +-0.0789639 0.13393 -0.00512141 +0.0183835 0.0490953 -0.0235496 +-0.0211568 0.177178 -0.0149257 +-0.0459855 0.0341655 0.0291843 +0.0234635 0.12256 0.0268857 +-0.0437241 0.0724973 -0.0179849 +-0.0492665 0.143175 0.00640774 +0.0310235 0.0363382 0.00298341 +-0.0703389 0.0353326 0.0107638 +-0.0505002 0.0762293 0.0432414 +-0.0641035 0.141307 -0.00745692 +-0.0474934 0.115292 0.0331905 +-0.050108 0.144746 0.0113816 +0.0325029 0.117364 0.00744623 +-0.0183192 0.124686 -0.00393431 +-0.00150748 0.059016 0.0544507 +-0.0104895 0.115533 0.0397944 +-0.023487 0.0435372 0.0536017 +-0.0655471 0.154522 0.00288522 +-0.0675989 0.156142 0.0239498 +-0.03165 0.0339865 0.0180432 +-0.0447604 0.0336698 -0.00424497 +-0.0348481 0.110331 -0.0188 +-0.0114927 0.0938853 0.0554733 +-0.0700706 0.155642 0.00707306 +0.0444883 0.05975 0.0312137 +-0.0788477 0.0773102 0.0306071 +-0.0712203 0.0706743 0.0326242 +0.00153616 0.078717 0.0572683 +-0.0243177 0.0607418 0.04177 +0.0445696 0.0677675 0.0254424 +0.0516179 0.0503639 -0.000756444 +-0.0610049 0.129668 -0.00770337 +-0.0731244 0.174613 -0.0403365 +-0.021137 0.166765 -0.0184531 +-0.068723 0.163208 -0.0142948 +-0.0415011 0.0676725 0.0415782 +-0.0829782 0.147345 0.00316952 +-0.056007 0.145723 -0.001571 +-0.023276 0.0768174 0.0529315 +-0.0303597 0.158405 -0.0122944 +-0.0594923 0.107014 0.0396564 +-0.0680504 0.156343 0.0223236 +-0.050518 0.054445 0.0327051 +-0.0324286 0.126663 0.0108668 +-0.0629263 0.108221 -0.0156274 +-0.0283572 0.0862879 0.0464179 +0.0304249 0.0399897 -0.00292852 +-0.0820851 0.106006 0.028693 +-0.081432 0.0776141 0.0263044 +0.0121657 0.0990535 -0.0228743 +-0.0148931 0.161809 -0.0143393 +0.0322568 0.0814321 -0.0193234 +-0.0249634 0.0631201 -0.0324542 +-0.0844782 0.152284 0.0269844 +-0.0284889 0.100156 0.0431683 +0.0335187 0.113275 -0.00203325 +0.0243141 0.0347256 0.0105738 +-0.0189924 0.127884 0.0157415 +-0.0555 0.0488797 0.0362241 +-0.0675079 0.104205 0.0395869 +-0.0181173 0.0384288 0.000495732 +-0.0138101 0.0841459 -0.0389466 +-0.0343542 0.0367977 0.0484644 +0.0170352 0.0393356 0.0436644 +-0.0255828 0.0620727 0.0401653 +0.0012257 0.0797035 -0.0352779 +-0.0033226 0.122983 -0.0103909 +0.0377895 0.0954381 0.0337234 +-0.0779478 0.107702 0.034147 +0.0309974 0.0673207 0.0412553 +0.0125192 0.0833344 0.053329 +-0.0569108 0.0471914 0.0407265 +-0.0765896 0.172837 -0.038783 +-0.0243798 0.168291 -0.0108587 +-0.0849208 0.114388 0.046865 +0.0270076 0.100021 -0.0178938 +-0.00936568 0.0388306 -0.00738531 +0.0124903 0.101789 0.047403 +0.0153634 0.050802 -0.0265798 +-0.051492 0.107057 0.0393982 +0.00022872 0.0769217 -0.0357549 +-0.073138 0.156184 0.0161734 +-0.0171943 0.171219 -0.0224352 +0.0282636 0.073195 -0.0229429 +-0.0554943 0.112513 0.0359102 +0.0268698 0.0448976 0.0368034 +-0.0567448 0.0548796 0.00465654 +0.00393342 0.0340406 0.014385 +-0.0269434 0.0864227 0.0492292 +-0.050859 0.0487888 0.015667 +-0.0524919 0.0762203 0.042799 +-0.025733 0.0751362 0.0469781 +-0.0870453 0.0846718 0.00449266 +-0.0765303 0.0961207 -0.0124976 +0.0303449 0.112749 0.0317399 +-0.070531 0.151779 -0.0453729 +0.0534729 0.0645627 -0.000631784 +0.0104112 0.0375138 -0.0230668 +0.0592863 0.0552837 0.0131736 +0.00525297 0.069736 -0.0335357 +0.0167263 0.0350159 0.0378322 +-0.0679113 0.0395796 0.0109828 +0.013918 0.129208 0.0205036 +-0.079478 0.142827 0.0451049 +-0.0708238 0.0631793 0.00551684 +-0.0687786 0.16979 -0.0301319 +-0.0187811 0.119777 -0.0107944 +0.021663 0.053586 0.0452157 +0.015783 0.0914175 0.0510677 +0.0258521 0.119872 -0.00319504 +-0.0172292 0.104564 -0.022745 +-0.0618136 0.0453397 -0.00172473 +0.0207685 0.0449736 0.0420523 +-0.0231964 0.0651165 0.0447582 +-0.0305175 0.0847809 -0.0315638 +-0.0658758 0.122838 0.0504663 +-0.0148324 0.107132 -0.0214612 +0.0460436 0.0778241 0.00519064 +0.00396334 0.0346642 0.000955872 +-0.000496537 0.0675633 0.0565514 +0.0342214 0.0813611 -0.0182381 +-0.0464961 0.0464761 0.0407845 +0.0547176 0.0680176 0.00187225 +-0.0580682 0.132534 -0.0063879 +0.0331199 0.0754691 0.0408773 +0.0401875 0.102783 0.0241636 +-0.0783656 0.151459 -0.000884796 +0.0238113 0.0754906 0.0485213 +0.0164183 0.0726599 0.0518741 +-0.0674097 0.173701 -0.0580011 +-0.0179511 0.175707 -0.0173471 +-0.0334973 0.0859864 0.0423406 +-0.0416172 0.17268 -0.00599082 +-0.0883846 0.119913 0.00130167 +-0.0154061 0.185475 -0.025609 +0.0464852 0.0429053 0.00427528 +0.0545912 0.0717149 0.021096 +-0.0661916 0.0334877 0.00245273 +-0.0495852 0.124005 0.0317323 +-0.0537144 0.0491343 0.0296614 +-0.0818927 0.122139 -0.0045131 +-0.0718108 0.0955414 0.0413269 +0.0221671 0.0444704 -0.016762 +-0.0798314 0.0733447 0.0205614 +0.0166594 0.125691 0.027245 +-0.0892473 0.0888575 0.0104669 +0.00551166 0.0504095 0.0521406 +-0.0627982 0.16724 -0.0607839 +-0.0646154 0.0457888 0.00269728 +-0.0485702 0.047508 -0.00937813 +0.026502 0.121591 0.0237374 +-0.0353601 0.152626 -0.00619729 +0.0403422 0.10564 0.0161674 +-0.0615416 0.034204 0.0241166 +0.0380593 0.0869714 -0.0147288 +0.0319925 0.114417 -0.00326976 +-0.0267368 0.0385445 0.0329521 +-0.0618964 0.108239 -0.0162152 +-0.063845 0.150027 0.0371387 +-0.0739579 0.155489 -0.0249104 +-0.0709691 0.153934 -0.0469289 +0.0249948 0.0405751 0.0353079 +-0.0304784 0.0381297 0.00370653 +-0.0247632 0.0741431 -0.0374571 +-0.0216593 0.0509046 -0.0292926 +-0.0446505 0.0592548 -0.0123035 +-0.0410267 0.172571 -0.00282243 +-0.060985 0.168641 -0.0594898 +0.0260213 0.111246 -0.0119 +-0.0224982 0.103036 0.0436276 +-0.0720537 0.0640001 0.00639175 +-0.08755 0.12805 0.000278104 +-0.0790371 0.0873264 0.0361062 +-0.055031 0.152471 0.0270238 +0.0537262 0.0622241 0.0283948 +0.0248385 0.107021 -0.0153684 +-0.0817292 0.154617 0.0205129 +-0.0776054 0.0804635 0.0348861 +-0.0644463 0.0769092 0.0410862 +-0.0737119 0.082093 -0.0148287 +-0.0782342 0.0694181 0.011104 +-0.0678631 0.0335656 -0.00155997 +-0.0771555 0.15282 -0.00488816 +0.028309 0.049176 0.0371723 +0.0122273 0.0342048 -0.000691958 +-0.0643947 0.15704 -0.046105 +-0.0276636 0.0522618 0.0383069 +-0.0587411 0.154535 0.0270999 +0.0275645 0.122014 0.00844231 +-0.0465457 0.0337901 0.0276252 +-0.0853906 0.110991 0.0352247 +-0.0338206 0.0367327 0.0490996 +-0.0145535 0.06115 0.0532234 +0.0367927 0.111755 0.0132988 +0.0458177 0.0820138 0.0181729 +-0.0444555 0.121377 -0.0123561 +0.0224202 0.0430392 -0.0127301 +0.0158478 0.102035 -0.022 +-0.0100884 0.0347013 0.0469069 +0.0374928 0.0498822 0.031843 +0.0351777 0.0559301 -0.00964394 +-0.00946358 0.169654 -0.0207426 +-0.0656264 0.15567 -0.0512009 +-0.0254805 0.0434932 0.0531599 +-0.0270955 0.0576776 -0.0274029 +-0.0228583 0.0350556 -0.0196661 +-0.0139903 0.169817 -0.0169155 +0.0176377 0.0348968 0.0272836 +-0.0144859 0.107222 0.0429439 +-0.0291189 0.15522 -0.00190906 +-0.0411739 0.165162 -0.0113688 +-0.0123514 0.0384213 0.00530714 +-0.0527141 0.141625 0.0234145 +-0.0612038 0.154834 0.027675 +-0.0338487 0.098628 -0.022813 +-0.000859642 0.105926 -0.0219248 +-0.0203431 0.186558 -0.0166005 +-0.01883 0.0882728 -0.037792 +-0.0635094 0.0987058 0.0422669 +-0.000483407 0.0787781 0.0579546 +-0.0700187 0.074071 0.0369567 +-0.0201986 0.186115 -0.0151371 +0.00141145 0.0376391 -0.024717 +0.0439647 0.0888964 0.0241631 +-0.0774025 0.100791 0.0354679 +-0.078513 0.145668 0.0427459 +0.0241305 0.0618675 0.0453428 +0.0109129 0.0833325 0.0545132 +-0.0798758 0.117757 -0.00451351 +0.0302928 0.119677 0.0137476 +0.0354021 0.0399255 -0.00156043 +-0.0489211 0.0687544 0.0390214 +-0.0493842 0.0558982 0.0343669 +-0.0524939 0.0776533 0.0431774 +-0.00761105 0.112944 -0.01965 +-0.0631004 0.038056 0.0429096 +-0.078061 0.117721 0.0511362 +-0.0228935 0.0375359 -0.0182249 +0.0168546 0.104974 -0.0191686 +-0.062493 0.0385506 -0.00796777 +-0.0814183 0.138999 -0.00180871 +-0.0585811 0.0344322 0.0332983 +-0.0299241 0.172727 -0.00652243 +0.0112861 0.130316 0.0195341 +-0.0325036 0.10978 0.0375732 +-0.0826224 0.141799 0.00118353 +-0.0805022 0.0831735 0.0334637 +0.0122352 0.0808526 -0.0312408 +-0.0771876 0.0907032 -0.0125611 +-0.0140608 0.038299 0.0231793 +-0.0386607 0.116212 -0.0149511 +-0.0276455 0.0376114 0.0210157 +-0.0832306 0.0871025 0.0304136 +-0.0334887 0.0471143 -0.0243565 +-0.0400971 0.153595 0.0050429 +-0.0647302 0.154215 -0.0408208 +-0.0194396 0.0527865 0.0471813 +-0.0665534 0.156088 0.0243177 +0.00850109 0.107119 0.0411949 +-0.0740753 0.174982 -0.0510829 +-0.0131928 0.11434 -0.0171133 +-0.00874908 0.0742103 -0.037697 +0.00967799 0.130572 0.00468392 +0.0318663 0.0862689 0.0426688 +0.0197994 0.0399634 -0.0167042 +0.0141672 0.0347073 0.00296826 +-0.0334912 0.0604137 0.038899 +-0.010802 0.0812949 -0.0382665 +-0.0626127 0.0339199 -0.00909656 +-0.0225179 0.0594554 0.0442529 +-0.0744235 0.152695 -0.0268913 +-0.0148262 0.181632 -0.021586 +-0.0501691 0.0348773 0.00986405 +0.0104481 0.102845 -0.020901 +-0.0127527 0.177163 -0.0221029 +0.008145 0.103004 -0.0207662 +-0.0548867 0.101301 -0.0205491 +-0.0772028 0.162464 -0.0309387 +0.0379552 0.0588939 -0.00773658 +-0.0134957 0.0925258 0.0558596 +0.0248886 0.0970269 -0.0206985 +-0.0393214 0.0342416 -0.0147308 +-0.0458838 0.129671 0.00293555 +-0.0574217 0.135337 0.0345321 +-0.0820284 0.13533 -0.00235647 +0.038582 0.0659177 0.034606 +-0.0494896 0.157875 0.00921755 +-0.0225598 0.125982 0.00280455 +0.0216881 0.102085 -0.0200779 +-0.0136509 0.0496769 -0.0312069 +-0.0615955 0.15529 0.0260796 +-0.0115193 0.0773584 0.0574493 +0.0404486 0.0745397 -0.00879543 +-0.057886 0.0969698 -0.0206731 +-0.0109392 0.038438 0.0236915 +-0.0148475 0.162865 -0.0159421 +-0.0183748 0.0353493 0.0515278 +0.029169 0.114081 0.0318014 +0.0232083 0.0449556 0.0403488 +-0.0234883 0.122057 0.0276339 +0.0359605 0.0936242 -0.0130764 +-0.0175335 0.0392471 0.0378093 +-0.0308588 0.171231 -0.00613945 +0.0247031 0.0463341 0.0389677 +-0.0925247 0.128292 0.0282327 +-0.0665656 0.122847 0.0512252 +0.0584586 0.0607609 0.022909 +-0.00884754 0.115581 -0.0164541 +-0.00309453 0.0984522 0.0515066 +0.0115015 0.119616 0.0358941 +-0.0494977 0.0903933 0.0446494 +-0.0126691 0.0348865 0.0479592 +-0.0149576 0.0897382 -0.0373658 +-0.0152002 0.174208 -0.0254562 +-0.0756281 0.167353 -0.024657 +-0.0627225 0.0402195 0.0247088 +-0.058955 0.151077 0.0341866 +-0.00932165 0.17502 -0.028678 +-0.0123491 0.183911 -0.0264322 +-0.0896074 0.135171 0.0322127 +-0.0426789 0.168728 0.0023488 +-0.0748775 0.0739125 0.0325733 +0.03891 0.10882 0.00971935 +-0.0633729 0.0431313 0.0286681 +-0.0551792 0.0336096 0.018904 +0.0268834 0.0875842 0.0460207 +-0.0168782 0.0351038 0.0503404 +-0.00549453 0.0590678 0.0548923 +-0.0286315 0.0383676 -0.00896928 +-0.0332631 0.177035 -0.011981 +-0.0748045 0.167943 -0.0420608 +-0.0851109 0.0939488 -0.00257672 +0.00096833 0.121103 -0.0124156 +-0.0558825 0.0465312 0.026676 +0.00712802 0.0975509 -0.0252935 +-0.00450103 0.0746726 0.0587526 +-0.0754962 0.141423 0.0471972 +-0.0514204 0.0548853 0.0209522 +-0.0107189 0.0642451 -0.0362023 +0.0428473 0.0944698 0.0251639 +0.0161732 0.12869 0.00706423 +0.0172673 0.128465 0.0103258 +-0.0624218 0.113827 0.0376933 +-0.0694289 0.039567 0.00968578 +-0.00956353 0.172645 -0.0227849 +-0.036529 0.0344176 0.0112583 +0.00747563 0.0378784 -0.00876072 +-0.0105064 0.0884021 0.0567868 +-0.0306153 0.0495713 -0.0203608 +-0.0832173 0.13898 0.000315163 +-0.00610064 0.0339097 -0.0209348 +-0.0081869 0.0386049 0.00598379 +0.0213573 0.057915 -0.0266602 +0.0391712 0.0402919 0.0231925 +-0.0346283 0.0533938 -0.0102529 +-0.00324688 0.0367886 -0.0155194 +-0.0734226 0.0711647 -0.00664488 +-0.0628413 0.144409 -0.0076345 +-0.0258745 0.104437 -0.023108 +-0.0100477 0.178214 -0.0295899 +-0.0839857 0.132609 0.0495198 +-0.0498484 0.121182 -0.0121 +0.0108333 0.130856 0.0150885 +-0.0104958 0.0939039 0.0555039 +-0.0863431 0.112514 0.0302243 +0.0475429 0.0429463 0.00623912 +-0.0334893 0.050539 0.0382432 +-0.0209099 0.158178 -0.00579641 +0.011514 0.10312 0.0464311 +0.0350456 0.0627954 -0.0138277 +-0.0161876 0.171234 -0.0230543 +-0.0268555 0.0987274 -0.0239779 +0.0118541 0.0404814 0.0449158 +-0.0104973 0.0856567 0.0572952 +0.0271955 0.0520724 0.0391174 +0.00248489 0.105788 0.0426651 +-0.0037871 0.0812341 -0.0371832 +-0.0231675 0.184436 -0.0160624 +-0.0612844 0.044277 0.027687 +0.0239731 0.061977 -0.0246362 +-0.00946933 0.0932363 -0.0348935 +-0.0178949 0.0971863 0.0483787 +-0.00196639 0.0392296 -0.0118812 +-0.0067485 0.0755804 -0.0372256 +-0.00967937 0.0555867 -0.0337759 +0.000980617 0.120181 -0.0134191 +-0.0806495 0.10968 0.039129 +0.0358807 0.0812282 -0.0166923 +0.0146499 0.0699433 0.0528108 +-0.034478 0.0590226 0.0391844 +0.0203856 0.0348183 -0.00149748 +0.0142674 0.0709686 -0.0310685 +-0.0334971 0.119329 0.0299275 +-0.0341948 0.0435484 0.0464376 +-0.00450247 0.056202 0.0539356 +-0.0721189 0.15515 0.0282101 +-0.000346509 0.12561 -0.00723663 +-0.0756644 0.0774182 -0.00947264 +0.014908 0.106309 -0.0185911 +0.0267515 0.102116 0.0406018 +-0.0626019 0.174089 -0.0546038 +-0.0574874 0.0805202 0.0440851 +-0.0609158 0.169795 -0.0608698 +0.0438296 0.0973504 0.015162 +-0.072512 0.104082 0.0376881 +0.0359801 0.0821479 0.0380155 +-0.0573808 0.129734 0.0381066 +-0.0236825 0.0566574 -0.0305632 +-0.0351787 0.0336265 -0.0226404 +-0.0257826 0.0783385 -0.0372231 +-0.0733446 0.159645 -0.0339252 +-0.024717 0.169741 -0.0113487 +-0.0597904 0.0825229 -0.0201763 +-0.0638365 0.0996097 -0.0175199 +-0.0897172 0.118919 0.0457459 +0.00851027 0.105753 0.0425683 +-0.0857293 0.121702 0.0488414 +-0.00654714 0.043 0.0484741 +-0.0524991 0.109798 0.0378325 +0.0089719 0.130372 0.00300057 +-0.0912936 0.114724 0.0218532 +-0.0758153 0.155373 0.0254598 +0.0443256 0.0931523 0.0201621 +-0.00159763 0.0391157 -0.0252097 +0.0358716 0.112393 0.0201061 +-0.0582724 0.0345955 0.0435663 +0.0444341 0.0861163 0.024155 +-0.0798668 0.12036 0.0500614 +-0.0486801 0.12235 -0.0113455 +0.044671 0.0931702 0.0171607 +-0.0867731 0.0820034 0.0144903 +-0.0444986 0.0465011 0.0409291 +-0.0132439 0.178631 -0.0284206 +-0.0014976 0.0856652 0.0573264 +-0.0555627 0.0351736 0.0453577 +-0.0757755 0.0948358 -0.0134771 +0.0116939 0.0459283 0.0447695 +-0.0334941 0.0690232 0.0409338 +-0.0717098 0.161007 -0.0419418 +-0.0620707 0.163126 -0.0385937 +0.0188526 0.103753 -0.0198618 +-0.0699102 0.14965 -0.0409667 +-0.0405063 0.0902417 0.0426463 +-0.071716 0.148756 -0.0367532 +-0.0218007 0.0637891 0.0462553 +0.0567259 0.0536428 0.00417778 +-0.0893948 0.09291 0.012442 +-0.0603715 0.133894 0.0372893 +0.0314991 0.054058 -0.0137198 +0.0203015 0.126964 0.0128708 +-0.0845068 0.120355 0.0490624 +-0.0624258 0.0342984 0.0291094 +-0.0395093 0.0930879 0.0428865 +-0.0277909 0.0380629 0.00793761 +0.0321502 0.106752 -0.0110706 +0.0298444 0.106115 0.0363002 +-0.054857 0.0970227 -0.0215362 +-0.0397671 0.127634 -0.000654541 +-0.0249592 0.0767123 0.050372 +-0.0265277 0.10717 0.0404632 +-0.0283702 0.0535742 -0.0233936 +0.00450189 0.050474 0.0524519 +0.00174762 0.0944417 -0.0320379 +-0.0810711 0.076096 -0.000474637 +0.0169426 0.11422 -0.015094 +-0.0380634 0.127686 0.00145512 +-0.0320932 0.0877303 -0.0254981 +-0.0569735 0.056267 0.00463231 +-0.0692551 0.175557 -0.0461164 +-0.0461819 0.130936 0.0220239 +0.0424151 0.101486 0.0141591 +-0.0816004 0.110405 0.0418977 +-0.0486814 0.0634873 -0.0123857 +-0.0354984 0.0491504 0.038916 +0.0232288 0.125257 0.0153837 +0.0251982 0.123641 0.0075622 +-0.0357278 0.07254 -0.0181295 +0.0451439 0.0802684 0.0230283 +-0.00649644 0.0605343 0.0557379 +-0.0697973 0.159564 -0.0489352 +-0.037469 0.120514 -0.011464 +-0.0869577 0.133848 0.0453706 +0.0185257 0.0352322 0.0362088 +-0.0206549 0.0768238 0.0545752 +0.0458945 0.0764062 0.00420006 +-0.0137194 0.091107 -0.0367438 +-0.0375014 0.106979 0.038117 +-0.0446156 0.0437685 -0.0132939 +-0.064545 0.156137 -0.0442784 +0.0275233 0.0621538 -0.0218174 +-0.0642285 0.0429095 -0.00424321 +-0.00460043 0.0434181 -0.0258683 +-0.0778454 0.158312 -0.0179205 +0.00252706 0.0800582 0.0567791 +0.0174798 0.0919971 -0.0254067 +-0.08982 0.133788 0.032216 +0.0343452 0.114918 0.0052408 +-0.0630651 0.167844 -0.0445874 +0.0164152 0.127597 0.00146207 +-0.0755176 0.120378 0.0530566 +-0.00615627 0.0994928 -0.025355 +-0.0501125 0.157587 -0.00554245 +-0.0332242 0.152554 -0.00262082 +0.0104732 0.0962984 0.0498872 +-0.0184975 0.111326 0.0402128 +-0.0228147 0.0826618 -0.0384205 +0.025553 0.0822419 0.0475803 +-0.0841632 0.11158 0.00227497 +-0.0198477 0.126879 0.00378288 +-0.069852 0.0951674 -0.0161643 +-0.0306901 0.0678681 -0.026462 +0.0155988 0.0699697 0.0524229 +-0.0167333 0.0642714 -0.0369951 +-0.0167796 0.121583 -0.00869919 +-0.0594953 0.0747194 0.0418121 +-0.0630515 0.152177 -0.00858675 +-0.0111714 0.129564 0.00700207 +-0.0890821 0.101017 0.0143926 +-0.0145147 0.116898 0.0378441 +-0.0462973 0.0368721 -0.0182757 +0.0251418 0.056415 0.0432482 +-0.0114906 0.0532044 0.051601 +-0.0514985 0.0931716 0.0440238 +-0.0536498 0.152894 0.0173581 +-0.0226294 0.157855 -0.00422736 +-0.0723402 0.0380689 0.00697334 +-0.0100211 0.0383173 0.0131334 +-0.0469913 0.0345734 0.0373898 +0.0117235 0.127254 -0.00315056 +0.0163555 0.0343012 4.3653e-05 +-0.000810177 0.084021 -0.0366442 +-0.0417008 0.153622 0.00625938 +-0.0695833 0.156717 -0.0509483 +-0.00967078 0.0541668 -0.0336446 +-0.0862734 0.13657 0.044609 +0.0363518 0.0562159 0.0330449 +-0.0528028 0.0666303 0.0365007 +0.0263615 0.0352587 0.00303932 +0.00111992 0.10872 -0.0203906 +0.00958242 0.0350342 0.0036093 +-0.0639107 0.108163 -0.0148371 +-0.00462988 0.0451748 -0.0282624 +0.00356053 0.130245 0.0239041 +-0.0428482 0.128274 0.00047704 +-0.0896015 0.136498 0.0242003 +-0.011119 0.163582 -0.018751 +-0.0521911 0.0531856 0.0256383 +0.02777 0.0808734 0.0454779 +0.0197898 0.0754906 0.0515075 +-0.0405912 0.0404909 -0.0262976 +-0.0184208 0.185917 -0.0222223 +-0.0738815 0.117926 -0.00764413 +0.0124741 0.0346639 0.0372734 +-0.057552 0.0336321 0.0166122 +0.0220421 0.0848959 0.0495666 +0.0184956 0.0962193 0.0472822 +-0.0577255 0.0578321 0.0166151 +0.00647696 0.11413 0.0402504 +-0.073854 0.100736 -0.0128364 +-0.0528758 0.0985097 -0.0219976 +0.0185485 0.111232 -0.0158588 +0.0257216 0.0672521 0.0441644 +-0.000523566 0.0428273 0.0465064 +-0.0354915 0.050532 0.0385401 +-0.0294972 0.0602632 0.0372614 +0.00410653 0.111609 -0.0202712 +0.0583904 0.0706508 0.00920486 +-0.0644959 0.084745 0.0443622 +-0.0182219 0.0954777 -0.0312615 +0.0163111 0.0608546 -0.0282401 +-0.0725001 0.120391 0.0535845 +-0.0164977 0.0828905 0.0574138 +0.0130474 0.0490028 0.046739 +-0.072956 0.173805 -0.0388399 +-0.0264766 0.0576077 -0.0284232 +-0.0644961 0.0602892 0.0183972 +0.0357477 0.074144 -0.0137952 +-0.0655596 0.171143 -0.0433207 +-0.0784904 0.133065 0.0521095 +-0.0651287 0.156206 0.0175513 +-0.0205565 0.183109 -0.0139659 +-0.0680156 0.156066 0.0121787 +0.0233417 0.0549864 0.0441504 +-0.0745084 0.134461 0.0510337 +-0.0489659 0.12587 -0.00699728 +-0.0422261 0.0339521 -0.0076663 +0.00337017 0.091416 -0.0329064 +0.040054 0.0998936 -0.00479776 +-0.0939204 0.128289 0.0212475 +-0.0301543 0.157156 -0.0110394 +-0.0456539 0.0606919 -0.0125779 +-0.0534986 0.0833862 0.0450488 +-0.047648 0.0614917 0.0367154 +-0.0486267 0.13356 0.00299082 +-0.0895466 0.0969995 0.0164128 +-0.0339552 0.0695264 -0.0185169 +-0.0176031 0.0711548 0.0545194 +0.0454033 0.0457238 -0.00184235 +-0.0546836 0.0478194 0.0276676 +-0.0875304 0.0861027 0.015468 +0.00919687 0.124582 -0.00824181 +0.0404579 0.0971405 0.0281735 +0.0219677 0.0346711 0.00269802 +-0.0114833 0.0618754 0.0549615 +-0.0209254 0.127401 0.0135903 +-0.0681737 0.074979 0.0383298 +-0.0357386 0.176065 -0.00515676 +0.0340797 0.115381 0.00660331 +-0.0207606 0.0670735 -0.0371287 +-0.075369 0.155134 0.0270903 +0.000773445 0.126081 0.0315854 +0.0414985 0.058326 0.0311197 +-0.03873 0.0340634 -0.0163036 +-0.0929281 0.121393 0.0102886 +-0.0680681 0.061235 0.0168081 +-0.0756991 0.0688679 0.00254149 +-0.0138611 0.0386244 0.0283378 +-0.0806333 0.120347 0.049427 +-0.0534714 0.115278 0.0343029 +-0.0365049 0.169731 0.000981263 +-0.0624922 0.100117 0.0423224 +0.00907886 0.126317 -0.00613291 +-0.0935493 0.125561 0.0262639 +0.022475 0.0933993 0.047467 +-0.015827 0.0921385 -0.0358122 +-0.0210449 0.0384562 -0.0168371 +-0.0207268 0.0612423 -0.0346723 +-0.0134967 0.109686 -0.0201653 +0.0456137 0.0708816 0.00289794 +-0.0090863 0.16966 -0.0247514 +-0.0889386 0.0888873 0.0194501 +-0.0532128 0.133944 -0.00360453 +0.0195053 0.0351963 0.0310168 +-0.0255119 0.104394 0.0424048 +-0.0174974 0.103031 0.0436129 +-0.0299173 0.0383162 -0.0299848 +0.00451386 0.0856474 0.057126 +0.0147725 0.0939169 -0.0254338 +0.0242867 0.0719771 -0.0256393 +0.0172719 0.0348529 0.0254373 +0.0558147 0.064873 0.0261542 +-0.0364911 0.0662596 0.041455 +-0.0758603 0.151341 -0.0198831 +-0.0616679 0.0643653 -0.00651734 +0.0383551 0.0603737 0.0324667 +-0.0477542 0.0782681 -0.0190718 +-0.0550269 0.0560444 -0.00440953 +-0.0395059 0.0972892 0.042147 +-0.0777926 0.167262 -0.0295303 +0.0604641 0.0623144 0.017179 +-0.0777137 0.177848 -0.0500546 +-0.0521757 0.0461175 0.0166821 +-0.0754874 0.130275 0.0528009 +0.0116887 0.0343979 -0.00472037 +-0.0617898 0.16156 -0.0335933 +0.0442649 0.0973538 0.00716867 +-0.0616258 0.0641254 0.029779 +0.00550935 0.0688576 0.0555484 +-0.053845 0.0955972 -0.0217935 +0.00741716 0.0375454 -0.0236134 +-0.0596132 0.113903 0.0363038 +-0.0508811 0.108424 -0.0190099 +-0.0437584 0.079737 -0.0197567 +-0.0733029 0.15632 0.000130521 +-0.003234 0.0960652 -0.0317479 +-0.0575581 0.0507849 0.00163524 +0.00435827 0.129372 -0.0013469 +-0.025212 0.123605 0.0223303 +-0.0669175 0.115159 -0.00990572 +-0.0722654 0.153589 0.032663 +-0.0147591 0.033582 -0.024214 +-0.00115893 0.11911 -0.0142672 +0.019441 0.0384709 -0.0146972 +-0.0772499 0.172214 -0.0459981 +-0.069531 0.14702 0.0417131 +-0.0343373 0.0443897 -0.0277936 +-0.0705699 0.152776 -0.0468148 +-0.0918951 0.117319 0.00831437 +0.0103421 0.0567446 -0.0299462 +-0.0336919 0.119642 -0.0105178 +-0.0629712 0.145905 -0.0115915 +0.00646739 0.0342464 -2.28584e-05 +0.00713618 0.103008 -0.0210892 +-0.018026 0.0384381 0.0276504 +0.0433583 0.0505545 -0.0063311 +-0.0882504 0.0900881 0.0054683 +0.00248872 0.118285 0.0387448 +-0.0227774 0.0713561 -0.0378898 +-0.0154972 0.122303 0.0324651 +-0.0322294 0.0708154 -0.0244722 +-0.025189 0.174162 -0.0196112 +-0.0871031 0.0846537 0.0064784 +0.00836869 0.0928852 -0.0303774 +-0.0424793 0.0958739 0.0423242 +-0.0640607 0.152536 -0.00179872 +0.00949301 0.118213 -0.015379 +0.0461867 0.0806341 0.00618373 +-0.0408599 0.102809 -0.0209257 +-0.0431187 0.159159 -0.0099383 +-0.0154785 0.0828416 0.0569929 +-0.0775215 0.161144 -0.0189221 +0.0358655 0.112954 0.0143927 +-0.0759551 0.131077 -0.00722143 +0.0465282 0.0726943 0.00507292 +-0.0784776 0.134439 0.0514602 +-0.0718916 0.0995338 0.0398851 +0.0174027 0.127944 0.018931 +-0.0494895 0.143125 0.00338457 +0.0333197 0.0357288 0.0133458 +0.0132595 0.0751478 -0.0304595 +-0.0324893 0.100164 0.0432113 +0.0343769 0.112004 0.0266888 +-0.0108703 0.180136 -0.0264173 +-0.0872312 0.1132 0.0437313 +0.0353616 0.106017 0.0302164 +-0.0282335 0.0382933 0.0310718 +-0.0646654 0.132541 0.0415985 +-0.0416682 0.0336125 -0.0201879 +-0.0690362 0.134069 0.0476421 +0.023852 0.057789 0.0449027 +0.0440963 0.0735854 0.0249308 +-0.0624573 0.163073 -0.0525854 +-0.0341025 0.169759 -0.00204136 +0.0589446 0.0649523 0.0051412 +-0.0602752 0.0336649 0.0124615 +-0.0628859 0.1495 -0.0200671 +-0.0722644 0.0671374 -0.000515551 +0.0135851 0.0658847 0.0529797 +-0.00198691 0.0368792 0.0142478 +0.0367682 0.0700097 -0.0138015 +-0.0296169 0.0408892 -0.0298249 +-0.0376612 0.0606745 -0.0122764 +0.00800811 0.0345328 -0.00370443 +0.0105539 0.104067 -0.0202515 +-0.0488192 0.0586801 0.0351334 +-0.0557857 0.0840569 -0.0214422 +0.0308153 0.0525508 -0.0137522 +0.0423969 0.0451283 0.0286278 +-0.0332147 0.036763 0.0499127 +-0.0736682 0.0730938 -0.00832442 +-0.0175484 0.124749 0.0265509 +-0.063425 0.163107 -0.0254606 +-0.0727351 0.0832969 0.03983 +0.0319929 0.088146 -0.0193446 +-0.0444371 0.122416 -0.011439 +-0.0858505 0.116285 0.047652 +-0.00444148 0.0916785 -0.0352643 +0.022957 0.0981907 0.0456622 +-0.053144 0.0595659 0.0253997 +-0.0788525 0.107465 0.0324362 +-0.0457478 0.130844 0.0207105 +-0.0684896 0.172346 -0.0400602 +-0.034733 0.0498868 -0.0123113 +0.0415062 0.0499285 0.0325086 +-0.0665679 0.0404538 -0.00528616 +-0.00650346 0.112991 -0.0197156 +-0.0448474 0.0999398 -0.0215303 +-0.0816586 0.137613 -0.00180043 +-0.0585618 0.124728 -0.00774237 +-0.0466281 0.0592297 -0.0120314 +-0.0670784 0.0653289 0.0275882 +-0.0835882 0.125784 0.0507488 +-0.0164643 0.0842755 0.0572298 +-0.0904705 0.135055 0.0132171 +-0.022546 0.116788 0.03495 +-0.0334891 0.091814 0.044517 +-0.0719917 0.151909 0.0358108 +-0.0151953 0.168341 -0.0151527 +-0.0590718 0.156479 0.0080978 +-0.0154402 0.120098 -0.0111735 +-0.036496 0.17271 -0.000384966 +0.0392898 0.0993144 0.028831 +0.024983 0.0795787 0.048494 +0.0483695 0.0734096 0.0143189 +0.0196959 0.0394038 0.04222 +-0.00886334 0.103392 -0.0235214 +-0.0118005 0.0841384 -0.0387163 +0.0252205 0.0888413 -0.0232794 +0.0298168 0.052105 0.0376191 +-0.0776927 0.169444 -0.0419634 +-0.0314915 0.057461 0.0373842 +-0.0504539 0.0558071 0.0326022 +0.0138422 0.0901622 -0.0294996 +-0.0510104 0.149266 0.0138316 +-0.0341485 0.0337694 0.0159272 +-0.085608 0.144617 0.0380805 +-0.0475132 0.0875996 0.0450977 +-0.091127 0.143391 0.0261688 +-0.0781968 0.0778917 0.0320122 +0.0284509 0.104793 -0.0149826 +-0.0223025 0.0957816 -0.0275832 +-0.0179573 0.123303 -0.00653742 +0.0369901 0.111103 0.00416682 +-0.0643667 0.159406 -0.0155654 +-0.0701684 0.165994 -0.0191552 +-0.0863906 0.0819518 0.00951177 +-0.0224965 0.100254 0.0443771 +-0.0757302 0.147214 -0.00986768 +0.0357939 0.0699287 -0.0148404 +-0.0376499 0.0577418 -0.0112619 +0.019292 0.0988007 -0.0225555 +-0.00992376 0.097544 0.0521376 +-0.0493712 0.0572598 0.0342952 +0.0255474 0.054922 0.0420386 +-0.0494259 0.144129 0.00171058 +-0.0624989 0.104282 0.0409609 +-0.0430319 0.0336432 -0.0167728 +0.0179185 0.121996 -0.0074786 +-0.0190623 0.127503 0.00554509 +-0.0474205 0.145822 -0.000777163 +0.0526083 0.0475984 0.0212218 +0.00022388 0.0797271 -0.0356555 +-0.0301525 0.168207 -0.0169318 +-0.00151732 0.0576213 0.0542293 +-0.00248496 0.0548872 0.0545581 +-0.0502022 0.12654 -0.00566411 +-0.0529063 0.0676787 0.0373317 +0.00249985 0.107203 0.0424791 +0.0029144 0.125773 -0.00745627 +0.00334453 0.0496343 -0.0297987 +0.00449641 0.11692 0.039168 +0.0399282 0.041091 0.0244564 +0.0178192 0.126124 0.0248053 +-0.0799402 0.132433 -0.00455304 +-0.0649027 0.179945 -0.0575726 +0.0404255 0.0914089 -0.00978781 +-0.065797 0.132562 0.0435297 +-0.0372368 0.172627 -0.0118528 +-0.0554974 0.10569 0.0407246 +-0.076892 0.165957 -0.0247772 +-0.0587093 0.0344925 0.0418625 +0.00823978 0.0768076 -0.0338586 +-0.0626545 0.150596 -0.0225786 +-0.0384668 0.0931237 0.0434147 +0.0141618 0.0576523 0.0502255 +-0.0683767 0.176522 -0.0580176 +-0.0129882 0.119781 -0.0128781 +0.00848559 0.0950467 0.0516302 +-0.0429797 0.127137 -0.00436425 +-0.0497252 0.141657 0.00538484 +-0.0179056 0.127636 0.0191062 +-0.0520277 0.0563658 0.0215194 +-0.02384 0.0968692 -0.0247025 +-0.0561697 0.0684762 0.0377129 +0.0120601 0.0343849 -0.00838478 +0.0299331 0.0362092 0.00288494 +-0.0763652 0.1528 -0.0108857 +-0.0736067 0.154075 -0.0289008 +0.00533532 0.0538992 -0.0301758 +-0.0599208 0.0394628 0.0453423 +-0.0184879 0.0856371 0.0571362 +-0.0208094 0.0376226 -0.0178912 +-0.0137231 0.183161 -0.0241068 +-0.0648137 0.0346657 0.0352478 +-0.0271872 0.0379033 0.0118238 +0.0264669 0.0477487 0.0380114 +-0.0723733 0.0352474 0.00704331 +-0.0322701 0.0835031 -0.0295487 +0.0272688 0.122366 0.00977001 +-0.0603093 0.0652594 0.0325934 +-0.00180254 0.0385071 0.00372255 +-0.0522762 0.123638 -0.00859751 +-0.0776201 0.171284 -0.03689 +-0.0802965 0.0872747 0.0345612 +-0.0889001 0.136394 0.00820864 +0.000412609 0.0393166 0.0342543 +-0.0642567 0.0344972 0.033776 +-0.0921303 0.11612 0.0363104 +-0.0679654 0.134068 -0.0084026 +-0.0839818 0.115583 0.0478751 +-0.00536465 0.129031 -0.000823415 +0.00514522 0.103044 -0.0216473 +-0.0496209 0.0517545 -0.00857532 +-0.0757023 0.177226 -0.0456228 +-0.0298766 0.05514 -0.0203901 +-0.0861039 0.0846923 0.0224682 +-0.0238144 0.0879301 0.05313 +-0.0611505 0.153585 0.0321143 +-0.0917527 0.113836 0.0170127 +-0.0374964 0.0591338 0.0402834 +-0.0187977 0.0799028 -0.0389405 +-0.0680553 0.17056 -0.0341587 +-0.0658521 0.0361993 0.0388506 +0.0111435 0.100252 -0.0225401 +-0.0425873 0.125894 -0.0070983 +-0.0265027 0.0498541 0.0461184 +0.00111147 0.110147 -0.0201294 +-0.00249391 0.119678 0.0379989 +-0.0117585 0.0742488 -0.0381827 +-0.0586841 0.0466878 -0.00234651 +0.0295244 0.0750328 -0.0218147 +-0.0218606 0.101624 -0.0238704 +0.0287102 0.0942447 0.0434182 +-0.0709345 0.0627948 0.0166551 +-0.0225064 0.10717 0.041634 +-0.0335027 0.074683 0.04142 +-0.092242 0.128315 0.0292604 +-0.0374976 0.0888821 0.0433743 +0.0303768 0.0578247 0.0402716 +-0.00891857 0.0338467 -0.0251248 +-0.0533378 0.162724 0.0010506 +-0.0869041 0.141929 0.0394374 +-0.047972 0.135544 0.0173874 +0.0485157 0.0597129 0.0310438 +-0.00667005 0.0904165 -0.0359686 +-0.0759966 0.0994807 0.0369297 +-0.0625222 0.149113 -0.00558111 +-0.0718118 0.14996 0.0389054 +-0.0844416 0.147376 0.00515339 +-0.0165344 0.0392124 0.0380479 +-0.079893 0.0949635 -0.0095262 +0.0236407 0.0347514 0.0177381 +-0.0196654 0.0683158 0.0524244 +0.0245994 0.0981921 0.0445203 +-0.0849795 0.0952966 -0.00257745 +-0.0528207 0.121242 0.0358805 +-0.0236049 0.0394052 -0.0289635 +-0.0332166 0.165305 -0.0043102 +-0.0251865 0.160795 -0.0139572 +-0.0865509 0.152927 0.0144746 +-0.0693964 0.157876 -0.00437702 +-0.0628145 0.169399 -0.0485883 +-0.0643644 0.153473 -0.0380226 +-0.081904 0.115723 0.0482136 +0.0101277 0.0911581 -0.0305812 +-0.0405043 0.0944618 0.0422679 +0.021919 0.118008 0.0336347 +-0.0203338 0.123782 -0.00500918 +0.0111252 0.108699 -0.019265 +-0.0574976 0.0776487 0.0433498 +-0.0354848 0.0987251 0.0428224 +-0.0651932 0.141087 0.0409428 +-0.0240513 0.0386342 -0.0120079 +0.039324 0.106993 0.0191699 +-0.0754947 0.142836 0.0460912 +-0.0122699 0.0338184 -0.0220638 +-0.0246982 0.0551057 0.0409028 +-0.0578691 0.105465 -0.0183362 +-0.0264983 0.10435 0.041876 +-0.07915 0.166638 -0.0349654 +-0.0578202 0.140285 -0.0045343 +0.0220783 0.0686046 0.0476717 +-0.0770892 0.107143 -0.00760422 +-0.0902136 0.13513 0.0232187 +-0.0723372 0.156305 0.0208189 +-0.0650055 0.135525 -0.0079735 +-0.0549293 0.154823 0.0139773 +0.0292317 0.0773621 -0.0219141 +-0.0817276 0.0964548 -0.00656413 +-0.018203 0.175668 -0.0239316 +-0.0553377 0.0457536 -0.00639551 +-0.0161975 0.0432999 0.0517769 +0.0304284 0.0383851 -0.001443 +-0.0345483 0.152531 -0.00560476 +-0.0629676 0.160574 -0.0208244 +-0.0935783 0.124186 0.0262856 +-0.0311645 0.0580869 -0.017406 +-0.0317989 0.0382037 0.00155838 +0.0576172 0.0686777 0.0217698 +-0.00505811 0.0339518 -0.0207718 +-0.0696447 0.166615 -0.0510113 +-0.0629867 0.155807 0.0241223 +-0.0340215 0.0794269 -0.0255119 +-0.0867747 0.0981404 0.0024092 +-0.0880604 0.13085 0.0022566 +0.0184887 0.0948214 0.0475148 +-0.021497 0.0988475 0.0444941 +-0.0416678 0.0592681 -0.0121392 +-0.0567258 0.0480405 0.0316684 +-0.0423133 0.129133 0.00872164 +-0.000508444 0.105851 0.0435843 +-0.0592465 0.046889 0.0316721 +0.0461219 0.0806353 0.0161697 +-0.0281528 0.0348412 0.0481365 +-0.0702797 0.180333 -0.0522624 +-0.0478122 0.134031 0.00640478 +-0.0077489 0.0713239 -0.0366154 +-0.0122439 0.168894 -0.023749 +0.0212552 0.0777078 -0.0266851 +-0.0917522 0.132325 0.0122241 +-0.0361034 0.165201 -0.01444 +-0.052501 0.0805516 0.0443114 +-0.0654153 0.0336345 0.00606909 +-0.0623235 0.139333 -0.00679766 +-0.0616576 0.170967 -0.0555865 +0.00174509 0.0392548 -0.00741822 +-0.0260001 0.0677977 0.0418131 +-0.0684331 0.0336931 0.00540027 +-0.0448348 0.0942101 -0.0220316 +-0.0731091 0.158237 -0.0329184 +0.0078778 0.0989406 -0.0227671 +0.0314417 0.115539 0.0270138 +-0.00906667 0.129748 0.004892 +0.00649868 0.108551 0.0413323 +-0.0382124 0.150071 -0.00262103 +0.0332799 0.0564373 0.0374441 +-0.00349826 0.0647878 0.0565544 +-0.0487816 0.084091 -0.021606 +-0.0568391 0.118972 -0.0116757 +-0.0644875 0.156696 -0.0456027 +-0.0411616 0.152146 0.00524032 +-0.0636742 0.142603 -0.0078783 +-0.0711318 0.0777267 0.0384114 +0.00321355 0.0796602 -0.0346071 +0.00447281 0.110003 0.0420134 +-0.0174998 0.0772311 0.0559767 +-0.0263139 0.182659 -0.010558 +-0.0322455 0.15809 0.00238998 +0.045843 0.0760483 0.0203743 +-0.0548028 0.0464121 0.0246755 +-0.0376206 0.0376543 -0.029358 +-0.0523414 0.0402098 0.0465679 +-0.0432186 0.121963 0.0262727 +-0.0321664 0.125608 0.018357 +-0.0857232 0.0792432 0.0155047 +-0.0782439 0.151233 0.0351897 +-0.0187146 0.058392 -0.0343021 +0.0452185 0.0847535 0.00320441 +-0.0640415 0.167322 -0.0369994 +-0.0823499 0.132665 0.0507367 +-0.0301219 0.0493909 -0.0214267 +-0.0843946 0.0818335 0.0225112 +-0.0246526 0.0386383 0.0332956 +0.0563147 0.0580894 0.0250386 +0.00021169 0.0389894 0.029096 +-0.00241379 0.126666 -0.00637642 +-0.0301429 0.0551656 -0.0193914 +0.0331811 0.0417541 0.0279348 +-0.0861938 0.104994 0.0213645 +-0.0824118 0.0788951 -0.000494108 +-0.0743937 0.157452 -0.00470821 +0.0187225 0.127515 0.0179893 +-0.0829047 0.0763015 0.0175246 +-0.0650238 0.0641454 0.0272956 +0.0355567 0.0878311 -0.0169845 +-0.0887171 0.117597 0.0462102 +-0.0760085 0.141318 -0.005968 +-0.0127703 0.0756733 -0.0384193 +-0.0158456 0.122449 -0.00760827 +-0.0842393 0.107513 0.00238784 +-0.0674898 0.0986608 0.0416951 +-0.0554949 0.0427291 0.0458455 +-0.0201912 0.0383436 0.00560257 +-0.0372682 0.0344921 0.0377782 +-0.0357437 0.0380351 0.0467216 +-0.0450103 0.054631 0.0385549 +-0.0369768 0.047531 -0.0185543 +0.0520769 0.0581909 0.0294992 +-0.0329038 0.153455 -0.00604291 +-0.0725184 0.128806 0.0519752 +-0.0270556 0.0706113 0.0413767 +-0.0285061 0.116641 0.0323888 +-0.0144886 0.109993 0.0419529 +-0.0285168 0.0803552 -0.0356291 +0.00952067 0.0702149 0.0551678 +-0.0355616 0.151785 -0.00432824 +-0.0826529 0.0796856 0.0277856 +-0.0365963 0.127614 0.0137714 +-0.0657008 0.139678 0.041893 +-0.0758694 0.0777615 0.0343673 +-0.00737907 0.0367231 0.0491533 +-0.0704775 0.114632 0.0510417 +-0.059558 0.128315 0.0402204 +-0.0538405 0.0941624 -0.0218364 +-0.0274601 0.124651 0.00100866 +-0.0637125 0.0705931 -0.0131267 +-0.0644549 0.043254 0.0326925 +-0.0746657 0.154121 -0.0198989 +-0.0348879 0.043516 0.0457289 +-0.0234602 0.17569 -0.0129988 +-0.0720698 0.176015 -0.0442709 +-0.043544 0.157959 0.00535766 +-0.0407405 0.0739506 -0.0180651 +-0.0696125 0.150354 -0.0430103 +0.0418343 0.0943991 0.0271656 +-0.0932461 0.129666 0.0232459 +-0.0398464 0.0957237 -0.0225845 +-0.0764914 0.171559 -0.0359139 +0.0408836 0.0614281 -0.00367417 +-0.0356978 0.0346221 -0.0180732 +-0.0895729 0.151493 0.0191084 +0.0263253 0.122966 0.0165355 +0.0113407 0.0567362 -0.0298085 +-0.0736511 0.180693 -0.0540178 +-0.042544 0.16227 0.00511409 +-0.0522198 0.0374253 0.0467614 +-0.0777691 0.0689598 0.0151422 +0.0463347 0.0428813 0.020444 +0.0509435 0.0554131 0.029582 +0.0233146 0.125046 0.00829766 +0.00834665 0.0958673 -0.0275066 +-0.00680856 0.127356 -0.00506622 +-0.0554704 0.157309 0.00940753 +-0.0754721 0.103526 0.0362863 +0.044978 0.086159 0.0221711 +-0.0716236 0.170198 -0.0283222 +-0.0196387 0.0464931 -0.0280998 +0.0569791 0.0686933 0.0226042 +-0.0233118 0.182976 -0.0180572 +0.0290367 0.060539 0.0418753 +-0.0708458 0.0980019 -0.0152545 +-0.044501 0.0562098 0.0390177 +-0.00787685 0.105931 -0.0227718 +-0.0774743 0.140015 0.0480697 +0.0275361 0.10477 0.0382193 +0.00254476 0.127971 -0.00383507 +0.0235041 0.108407 0.0388101 +-0.055098 0.146723 0.029184 +-0.0257112 0.0634738 0.0402437 +0.0222133 0.103397 0.0428172 +0.0239484 0.0901184 -0.0234122 +-0.0265532 0.080945 0.0504296 +-0.0801014 0.0881671 -0.00858727 +-0.0467634 0.0560036 0.0374321 +0.0562967 0.0661688 0.0251012 +-0.0323569 0.124066 -0.00320487 +-0.00891511 0.126415 -0.00600997 +0.0343206 0.094597 -0.0141158 +-0.0876587 0.151372 0.0112162 +-0.0723621 0.114661 0.051285 +-0.033385 0.126374 0.00317306 +-0.0465636 0.146777 -0.00183655 +-0.0086601 0.174145 -0.0268323 +0.0224333 0.0422246 0.0409441 +-0.0723219 0.171178 -0.0314543 +-0.0633454 0.159973 -0.0185957 +-0.0741825 0.156237 0.0158024 +0.0283215 0.117455 0.0287048 +-0.0518625 0.050332 0.0226347 +-0.0345112 0.112532 0.034973 +0.0102504 0.0766955 -0.0323547 +-0.0628937 0.146875 -0.0135938 +-0.0913593 0.126907 0.0414668 +-0.0755221 0.11896 0.0528247 +-0.0186351 0.0933648 0.0534492 +-0.00679579 0.0826768 -0.0377354 +0.00822704 0.0782053 -0.033734 +-0.0942744 0.126919 0.0202522 +-0.0462848 0.131856 0.0204922 +-0.05065 0.0706021 0.0388719 +-0.00522459 0.0384215 0.0122026 +-0.0524927 0.0987339 0.0429361 +-0.0388306 0.112851 -0.0174267 +-0.0268641 0.101582 -0.02361 +-0.0846396 0.153647 0.0136585 +0.0166715 0.0353808 -0.0156588 +-0.0553627 0.139574 0.0304759 +-0.0257886 0.0768981 -0.036857 +-0.0402218 0.0342366 0.0285657 +-0.045101 0.156152 -0.00816042 +-0.0348248 0.0473223 0.0413292 +0.0145592 0.0672414 0.0526521 +-0.0436275 0.0548777 -0.0111987 +-0.0248971 0.163359 -0.0156802 +-0.0449755 0.115277 -0.0159431 +-0.0492995 0.0345621 0.0403913 +-0.0257365 0.0348667 0.0503471 +-0.0754593 0.159053 -0.00907047 +-0.0632614 0.0601538 0.00426714 +-0.0265686 0.0382637 0.0296453 +-0.0355718 0.165308 -0.0024565 +-0.0727498 0.180616 -0.0549771 +-0.0381364 0.171203 -0.0118442 +0.0153228 0.0362397 0.00366285 +-0.0383106 0.0336688 0.00433881 +-0.0125102 0.0897843 0.0566766 +-0.0484982 0.0890084 0.0450201 +-0.0889791 0.0915153 0.00944503 +-0.0511466 0.124736 -0.0077758 +-0.00758688 0.0376797 -0.0254717 +-0.0509981 0.147813 0.0138388 +-0.0147745 0.0382944 0.014 +-0.0305049 0.0617476 0.0379767 +-0.0109155 0.0356188 0.0494667 +-0.0703667 0.142544 -0.0104932 +-0.0424925 0.0902452 0.0426486 +0.0099296 0.113714 0.0390911 +0.0145599 0.088488 -0.0297413 +-0.00249512 0.122376 0.0359373 +-0.0216559 0.0972103 0.0449705 +-0.0717874 0.0850294 -0.0163139 +0.0281202 0.0348895 0.0148787 +-0.0582075 0.154657 0.0258383 +0.0103893 0.0434318 -0.0247637 +0.0283214 0.115107 0.0315696 +-0.0408808 0.115001 -0.0156637 +-0.0569818 0.0548922 0.00263009 +-0.0347008 0.0666358 -0.0153327 +-0.0518449 0.146252 0.0164181 +-0.0388328 0.0943088 -0.0230504 +-0.0315145 0.0788556 0.0411289 +0.0268942 0.0988154 -0.0185978 +-0.0875561 0.0968363 0.00343541 +0.0426825 0.0805137 0.0283126 +-0.0683872 0.0690317 0.0328821 +-0.0609319 0.0343399 0.0363539 +-0.0258016 0.0867079 -0.0364604 +-0.0891389 0.120288 0.0465529 +-0.062692 0.155999 0.0140721 +0.0223974 0.0473356 -0.0199928 +-0.0616833 0.0676348 -0.0109359 +-0.0752375 0.0864841 -0.0145142 +0.014283 0.0681091 -0.0306905 +-0.0603219 0.0470192 0.0356706 +-0.015495 0.104397 0.0428489 +-0.0698499 0.0994423 -0.0150141 +-0.0293842 0.08757 0.0444817 +-0.00548831 0.112771 0.0416249 +-0.0120723 0.0353434 0.0494553 +0.0118631 0.0894057 -0.0307263 +0.0362901 0.0769906 -0.0138255 +-0.0372663 0.033541 -0.0229762 +0.0110129 0.0846936 0.0546683 +-0.0563673 0.0575771 -0.00141956 +0.0162242 0.0835192 -0.0290783 +-0.0466776 0.13337 0.0173732 +0.0116668 0.0548951 0.0518589 +-0.0175019 0.0758159 0.0556202 +-0.0865692 0.133541 0.00131146 +-0.0366797 0.0636525 -0.0138021 +-0.074087 0.0734714 0.0331119 +-0.0762512 0.156264 -0.00677505 +-0.0414995 0.168206 0.00296291 +0.0023065 0.128418 0.0277808 +-0.0141822 0.0378114 0.0510973 +-0.0674332 0.127053 0.0499702 +-0.0482072 0.0335431 -0.012174 +-0.072499 0.117558 0.0529308 +-0.0281279 0.03862 -0.0128123 +-0.0616129 0.149191 -0.00221638 +0.0436181 0.0416961 0.0210317 +-0.0758657 0.097813 -0.01246 +-0.0818672 0.120683 -0.00433302 +0.00940058 0.0342529 -0.0182643 +-0.018805 0.0625267 0.0503254 +-0.053876 0.126919 0.0361236 +-0.0884983 0.0941957 0.00744581 +-0.0165005 0.120964 0.0336371 +0.0433486 0.0519969 -0.00665823 +-0.0624811 0.149792 0.0367836 +-0.0615025 0.16984 -0.0615386 +-0.0364388 0.0352264 0.0443258 +0.0340769 0.0556934 -0.0107486 +-0.00261634 0.0450445 -0.0274328 +-0.0328486 0.0986298 -0.0228073 +0.0198481 0.0795335 0.0516115 +-0.0599778 0.148254 0.0362061 +-0.00849422 0.0674811 0.0555845 +-0.0530196 0.144246 -0.000696127 +-0.0836424 0.0924862 -0.00555232 +-0.0691184 0.165207 -0.0519806 +-0.0305063 0.111166 0.0367005 +-0.0447319 0.125394 0.0226968 +-0.0165708 0.056922 0.0510974 +-0.0568794 0.0548721 0.000601057 +-0.0355126 0.10012 0.0421792 +-0.00149054 0.131258 0.0163007 +-0.0814469 0.0761204 0.000521161 +-0.0700369 0.0765697 0.0383694 +-0.0791449 0.166643 -0.0339646 +0.0151117 0.0434234 0.0444141 +-0.0568399 0.0344097 0.0371692 +-0.0180623 0.177182 -0.017491 +0.0492456 0.0728121 0.0176064 +-0.0178752 0.105871 -0.0225888 +0.00334696 0.0342028 0.0159318 +0.0153617 0.0344714 0.021761 +-0.0945397 0.121475 0.0202819 +-0.073516 0.18065 -0.0535934 +-0.0934071 0.117385 0.0163015 +-0.0631359 0.0699525 0.0366992 +-0.0252161 0.0550594 0.0400126 +-0.00605897 0.125119 0.0321155 +-0.0360017 0.17408 -0.0118959 +-0.00638198 0.124385 -0.00985914 +-0.0145975 0.0378025 -0.0168233 +0.00417447 0.127894 0.028461 +-0.0410286 0.0345047 0.0334549 +0.0292997 0.0538256 -0.0177694 +0.0372061 0.0980869 0.0328651 +-0.0745356 0.104026 0.0368301 +-0.00436707 0.0386778 0.0266309 +0.0189949 0.0449386 0.0430002 +0.00529011 0.0668325 -0.0327227 +0.00166319 0.130955 0.0203219 +-0.0905947 0.115833 0.0426569 +0.00338984 0.116722 -0.0177517 +0.0203176 0.126182 0.0214303 +-0.0598293 0.139488 -0.00569497 +0.0142784 0.11622 -0.015243 +0.0231289 0.0835821 0.0493611 +0.0515475 0.0540038 0.0286923 +-0.0317664 0.058161 -0.0143983 +-0.0397537 0.0782783 -0.0191449 +0.012627 0.12184 0.0342326 +-0.0823735 0.148711 0.0361489 +-0.012301 0.110982 -0.0195491 +-0.0883046 0.122998 0.0470686 +-0.0315077 0.113893 0.0345441 +-0.0888952 0.137894 0.0271916 +-0.0610259 0.126912 0.0416133 +-0.0475344 0.05323 0.0369443 +-0.00961348 0.0434416 -0.0262361 +-0.0541404 0.124102 0.0375109 +0.0509994 0.044648 0.0132154 +0.0303038 0.118886 0.0223059 +-0.0596345 0.0336285 0.0108415 +-0.0196267 0.0450293 -0.0277098 +-0.0247099 0.0381195 0.00851258 +-0.0774982 0.133088 0.0521596 +0.0276359 0.0629152 -0.0215123 +0.0535119 0.0717543 0.00602975 +-0.0334971 0.0831472 0.0419572 +-0.0596476 0.14187 -0.00422882 +-0.0924522 0.125595 0.0392516 +-0.068714 0.143769 -0.0144235 +-0.0468988 0.126761 -0.00595632 +-0.0303571 0.0537911 -0.0173707 +-0.0709316 0.147597 -0.0300096 +-0.0514754 0.115278 0.0338114 +0.0190263 0.120653 0.0329746 +-0.0340031 0.1089 -0.0192874 +-0.0335001 0.116617 0.0321346 +-0.0671562 0.0724925 0.0371747 +-0.0746759 0.152711 -0.0238933 +-0.0590669 0.120714 -0.00943474 +0.00548706 0.108567 0.0416722 +-0.0114996 0.101652 0.0440245 +-0.0649779 0.141437 -0.00794337 +0.0112608 0.130411 0.00668952 +0.0436616 0.0987354 0.0121603 +-0.0558948 0.101262 -0.0199275 +-0.0309036 0.0436875 0.0502489 +0.0142962 0.0652331 -0.0300484 +0.000574283 0.0347216 0.0149023 +-0.00623443 0.0389648 -0.00688285 +-0.0810472 0.147398 0.0390836 +-0.0491606 0.0375682 0.0458781 +-0.055978 0.0534457 0.00767233 +-0.0685375 0.17487 -0.0458569 +0.0289287 0.100617 -0.0165368 +-0.0709835 0.0353942 0.00988845 +0.0337836 0.0754424 0.0400679 +0.041497 0.0527902 0.0324777 +-0.0204109 0.178661 -0.0155986 +-0.0623894 0.149097 -0.0105741 +-0.0644192 0.16051 -0.0170316 +-0.0350535 0.0346922 0.0433273 +-0.0740398 0.145796 -0.011857 +0.0214237 0.0444841 -0.0187153 +-0.0570526 0.113331 -0.0158151 +0.0134717 0.127798 0.0260714 +0.0324011 0.0446474 -0.00561054 +0.00231866 0.0568936 -0.0320023 +-0.0273763 0.112504 -0.0170987 +-0.0224223 0.072452 0.0507888 +-0.0614531 0.154118 0.0305097 +-0.0222065 0.179998 -0.0209469 +0.00315207 0.102056 -0.0221009 +0.0413778 0.0561233 -0.00592276 +0.037882 0.105959 0.026802 +-0.0607248 0.0722644 -0.016058 +0.00061382 0.126415 -0.00611002 +0.0592992 0.0566775 0.0181738 +0.0474969 0.0638142 0.0292952 +-0.0321069 0.162239 -0.0144989 +-0.0520198 0.147215 -0.00210798 +-0.0819286 0.0748755 0.0145293 +-0.0333602 0.0339348 0.0195439 +-0.0555018 0.0987713 0.0432834 +-0.0630837 0.164691 -0.0325918 +-0.0473982 0.0343754 -0.0164682 +-0.0807821 0.0980376 0.0332837 +-0.0645109 0.0370591 -0.00764757 +-0.085403 0.141865 0.00516647 +0.0420715 0.0859357 0.0292923 +0.0391529 0.107674 0.00402907 +0.024552 0.110059 0.0374287 +-0.0631521 0.0360725 0.0429133 +-0.0619885 0.156033 0.0186659 +-0.024223 0.17569 -0.0123366 +-0.0138299 0.0392302 0.0367944 +-0.0306217 0.126038 0.0115365 +-0.0714938 0.120397 0.053531 +-0.0869305 0.151358 0.010227 +-0.0788893 0.125151 -0.00625598 +-0.0447778 0.0409599 -0.0173005 +-0.09234 0.131039 0.0252374 +0.0321511 0.0724311 -0.0187615 +-0.0735819 0.0777026 -0.0122023 +-0.0678037 0.166983 -0.024036 +-0.0897153 0.135171 0.0332079 +-0.0447805 0.0840976 -0.0212945 +0.0371007 0.10968 0.00116733 +0.0112368 0.0836448 -0.0310335 +-0.036484 0.0505609 0.038833 +-0.0118972 0.116803 -0.015741 +-0.0346708 0.0621866 -0.0131726 +-0.0397664 0.0812015 -0.0202928 +-0.069532 0.172114 -0.0375728 +0.00626682 0.131047 0.00486423 +-0.0590022 0.0579904 0.014414 +-0.00972298 0.0642282 -0.0359259 +-0.0269413 0.181454 -0.0140289 +0.033222 0.0842418 -0.0188996 +0.00639168 0.0433788 -0.024537 +0.00926262 0.129557 0.000393265 +-0.00751646 0.0732149 0.0579299 +-0.0513203 0.142869 0.00077197 +-0.0288553 0.0385536 -0.0110371 +0.0555265 0.0728462 0.0170262 +-0.085954 0.146023 0.00719275 +-0.0371011 0.0461641 -0.0234326 +0.0579592 0.0537863 0.0201793 +0.0104003 0.0418913 -0.0239147 +-0.0396188 0.0505923 -0.0110041 +0.0326207 0.0944486 -0.0159568 +-0.0170933 0.0554767 0.0502631 +-0.0891859 0.139294 0.0371595 +-0.0637097 0.166224 -0.0345967 +0.00422867 0.0824562 -0.0341922 +-0.0594261 0.151258 -0.000475846 +-0.0552814 0.0464664 0.0256754 +-0.0424851 0.0776249 0.0430145 +0.0184693 0.111176 0.038468 +-0.0294978 0.0574079 0.0367222 +-0.0435452 0.0405422 0.0435069 +-0.0600989 0.0598417 0.00157193 +0.0526979 0.0525681 0.0268245 +-0.0625031 0.0602955 0.00246046 +-0.0675133 0.108346 0.0377589 +-0.00349512 0.111424 0.0424267 +-0.00549779 0.110034 0.0429298 +0.0164758 0.0713296 0.0519403 +0.0458506 0.0876137 0.00718075 +0.0244747 0.0400424 -0.00510986 +0.00547063 0.131454 0.017409 +-0.0728779 0.117943 -0.00788041 +-0.0142717 0.17714 -0.027303 +-0.0257193 0.0617764 -0.0314442 +-0.050991 0.0504175 0.03464 +0.00152343 0.0759482 0.0573355 +-0.0304944 0.064586 0.038393 +0.016253 0.0794879 0.0534651 +-0.00764651 0.0496471 -0.0308946 +-0.077844 0.0743656 -0.00558198 +-0.0326464 0.0563525 -0.0113988 +-0.061813 0.175696 -0.0586065 +-0.0681691 0.0682156 0.031879 +-0.0493845 0.0657885 0.0368321 +-0.019309 0.0362824 -0.0277788 +-0.063712 0.167032 -0.0383216 +-0.0379003 0.123041 0.0266516 +-0.000679533 0.0554388 -0.0315999 +-0.0886752 0.135106 0.0413889 +0.011146 0.128332 0.0266558 +-0.0740639 0.178692 -0.0478641 +-0.0809318 0.142082 0.0447817 +-0.00975763 0.0742329 -0.0379217 +-0.0600964 0.0334795 0.00370066 +-0.0566436 0.0657735 0.0346839 +-0.0767139 0.070678 0.0244626 +-0.0810351 0.0787684 -0.0035164 +0.0405001 0.076619 0.0321646 +-0.0283979 0.155793 -0.00852382 +-0.0535904 0.0617699 -0.00886774 +-0.0149347 0.127911 0.00262222 +-0.0197362 0.181499 -0.0230211 +-0.0781409 0.0718256 0.0231698 +-0.0337588 0.121858 0.0267132 +-0.0741051 0.0686193 0.025039 +0.0417534 0.0788713 -0.00674491 +-0.0515024 0.0340065 0.0263967 +-0.0763933 0.111249 -0.00565203 +-0.0538034 0.0898608 -0.0222645 +-0.000575856 0.0980296 -0.0278345 +0.0581094 0.0704417 0.00814168 +-0.0891434 0.137902 0.0291936 +0.00340212 0.0390598 -0.024445 +-0.0620333 0.153738 -0.0275809 +-0.0177087 0.0584461 -0.0348025 +-0.0823897 0.104663 0.0290404 +-0.0194981 0.10024 0.044034 +0.0242883 0.0705502 -0.0254969 +-0.0899225 0.133822 0.0382154 +-0.0195055 0.108574 0.0413935 +-0.0446392 0.0548635 -0.0110876 +0.00035867 0.048192 -0.0299591 +0.0364284 0.0413843 -0.00274773 +0.0187875 0.0351105 0.0327558 +-0.0568852 0.111179 -0.0170834 +0.0118445 0.0806629 0.0540991 +-0.0687285 0.155709 0.0264626 +0.00655625 0.109588 0.0412446 +0.00917706 0.113608 -0.0184169 +-0.0613933 0.155777 0.0101812 +-0.0314952 0.0903684 0.0441958 +0.0124021 0.0448701 -0.0249804 +-0.0241038 0.0865955 0.0534593 +-0.0631641 0.149054 -0.0215452 +-0.0401934 0.0365351 0.0429119 +-0.0898981 0.135185 0.0362087 +-0.0526397 0.0618282 -0.00966488 +-0.0844214 0.0777776 0.012517 +0.0222568 0.0748707 -0.0265095 +-0.0150366 0.0384845 0.00106724 +0.0180702 0.0879847 -0.0272411 +-0.0142291 0.127243 0.024765 +0.0382486 0.104643 0.0273123 +-0.0748494 0.0964384 -0.0137204 +-0.0808743 0.136754 0.0491531 +-0.0568962 0.0970004 -0.0209687 +-0.0803034 0.072641 0.00422068 +-0.0584156 0.0459799 0.0422363 +-0.0579142 0.114001 -0.0151155 +-0.0561079 0.0571065 0.0121919 +0.00037651 0.0978532 -0.0276151 +-0.0336642 0.082217 -0.0255373 +0.0457702 0.0735931 0.00320764 +-0.056498 0.07472 0.0419593 +0.00305684 0.124987 -0.00863513 +-0.0272404 0.0877435 0.0480762 +-0.040496 0.0577326 0.0402811 +-0.0202415 0.0392282 0.0390567 +-0.020926 0.0334921 -0.0253378 +-0.0690953 0.0751628 0.0379926 +-0.0520047 0.0344961 0.0416004 +-0.0141843 0.128965 0.0174774 +0.0288353 0.0368345 0.0223773 +-0.0444076 0.0394861 -0.0222996 +-0.0838483 0.119157 -0.00284212 +-0.0034971 0.0732704 0.0586485 +-0.03681 0.0886191 -0.0239226 +-0.0669297 0.105269 -0.0144963 +-0.07603 0.0941366 0.0385416 +-0.0716625 0.145448 -0.0198949 +-0.0165056 0.0382425 0.0100681 +-0.0909349 0.113307 0.0123445 +-0.0192269 0.0381483 0.0222601 +0.026296 0.0862676 0.0469202 +-0.0118259 0.0386358 0.028745 +-0.0513331 0.0334323 -0.00718543 +-0.0685946 0.0353745 -0.00558788 +-0.0370306 0.151785 -0.00571407 +-0.0891386 0.129503 0.00423129 +-0.0447856 0.0348265 0.00740272 +0.040097 0.105566 0.00218117 +0.00862183 0.120558 -0.0139068 +-0.0679053 0.171131 -0.036968 +0.0164071 0.0345184 0.0219352 +-0.0501179 0.137029 0.00241503 +0.0125996 0.0459414 0.0443461 +-0.0654928 0.0818627 0.0433416 +-0.0215596 0.0891328 -0.036783 +-0.0685096 0.147001 0.0412847 +0.0400896 0.0702922 -0.00980716 +-0.0291528 0.0378835 0.0276599 +-0.0624944 0.145991 -0.00758108 +-0.029375 0.0621337 -0.0244169 +-0.0655919 0.151202 -0.0366034 +-0.064581 0.128354 0.0453237 +-0.0626195 0.153328 0.0013944 +-0.0863817 0.148632 0.0316852 +-0.0153553 0.112218 -0.0188504 +-0.0602045 0.0441634 0.0266895 +-0.0204995 0.111306 0.0398343 +-0.0454802 0.112265 -0.0167776 +0.0212764 0.0693138 -0.0277613 +-0.0458225 0.146281 0.00549558 +-0.065521 0.0335373 -0.00466605 +-0.00710114 0.0339482 -0.0211688 +0.0551094 0.0539301 0.0250409 +-0.0781434 0.0927222 0.0364655 +0.0291436 0.0707502 -0.0218013 +-0.091117 0.143373 0.0231646 +-0.0575628 0.0576989 0.003607 +-0.0745558 0.0684435 0.0233437 +0.000679346 0.0933957 -0.0329817 +0.0136703 0.0446634 0.0441067 +0.0425933 0.0791563 0.0282081 +-0.0098481 0.112657 -0.0193422 +-0.0678577 0.102354 -0.0152646 +-0.0245236 0.0838729 0.0539551 +-0.0522319 0.125489 0.0349878 +-0.0331359 0.168192 -0.0157544 +0.0437182 0.0944809 0.000197915 +-0.0271741 0.161328 -0.0145155 +-0.0635247 0.139599 0.0380296 +-0.0105236 0.0787711 0.0579243 +0.0221704 0.109999 -0.014573 +-0.0626188 0.166275 -0.0435849 +-0.0162218 0.186444 -0.0207352 +-0.00481374 0.128076 -0.00386981 +-0.0761439 0.154623 0.0283179 +-0.00628506 0.0952929 -0.0329709 +-0.0244623 0.0348843 0.0471798 +-0.0764469 0.175411 -0.0430646 +-0.0374817 0.0903202 0.0435434 +0.0448755 0.0917539 0.00218552 +-0.0464937 0.0411703 0.0442462 +0.00738566 0.0463583 -0.0259834 +-0.0269838 0.158131 -0.000540227 +-0.0195125 0.0800523 0.0567242 +0.0535386 0.0505579 0.00123438 +-0.0704829 0.066568 0.025804 +-0.0478545 0.117892 -0.0146818 +-0.0645863 0.144373 -0.0132186 +-0.0619148 0.161553 -0.037594 +-0.0328555 0.100056 -0.0225692 +-0.0605435 0.0660534 0.0336067 +-0.00290962 0.037693 0.0115129 +-0.0101883 0.0876449 -0.0371912 +-0.0625754 0.042738 -0.00542472 +0.00650044 0.0910463 0.0545358 +-0.0756811 0.154032 -0.0169094 +-0.0034723 0.130516 0.00409153 +0.00232953 0.116694 -0.0177181 +-0.0378274 0.0929022 -0.0235348 +-0.02161 0.158057 -0.00899889 +0.0304133 0.0415863 -0.00412062 +-0.0728954 0.176495 -0.0445729 +-0.0420309 0.0335517 -0.0220625 +-0.0187514 0.0906841 0.0550582 +-0.0855548 0.125248 -0.00272359 +-0.0137086 0.0614344 -0.0364468 +-0.020723 0.0597726 -0.0340423 +-0.0708646 0.0384387 0.000437312 +0.0310181 0.112726 0.0309619 +0.0131047 0.129972 0.0173477 +-0.0216432 0.124246 -0.00349177 +-0.0626999 0.0706798 -0.0138683 +-0.0865991 0.0833319 0.0164838 +-0.0644302 0.0384213 0.0160253 +-0.0187164 0.0611476 0.0502898 +-0.0791607 0.170809 -0.0419883 +0.00181256 0.0994772 -0.0233519 +0.0199074 0.11877 -0.0100039 +-0.0361903 0.151017 -0.000604378 +-0.084275 0.0897993 -0.00457099 +-0.0554832 0.0861944 0.0449632 +-0.0623633 0.0458155 0.0336786 +0.034658 0.114539 0.0168181 +-0.0736982 0.167846 -0.0232955 +-0.0181465 0.166773 -0.0192359 +0.0113761 0.0494361 -0.0277541 +-0.0440746 0.154693 -0.007872 +0.0606816 0.0664976 0.015162 +0.044367 0.0575454 -0.00546316 +0.0134639 0.0616949 0.0510096 +0.0400149 0.0829397 -0.0117765 +0.0423451 0.0690926 -0.00378897 +-0.0691689 0.0336248 0.00172074 +0.0582234 0.0593447 0.00320204 +-0.0900566 0.133779 0.0292173 +-0.0381652 0.0336678 -0.0288809 +0.0397017 0.104178 0.024171 +-0.0755036 0.121787 0.0531411 +-0.025634 0.122393 0.025161 +0.058528 0.0565928 0.00617045 +-0.0801768 0.155046 0.0137223 +0.0277963 0.0835666 0.045536 +-0.0628566 0.145948 -0.0105775 +-0.0133824 0.0383808 0.0105781 +-0.049358 0.146268 -0.00147688 +-0.0484712 0.0517504 0.0365675 +-0.0467968 0.0869913 -0.021986 +0.0553821 0.0590684 -0.000816519 +-0.0179551 0.0921164 -0.0358084 +-0.0789524 0.0921836 -0.0106406 +0.0374058 0.0893177 -0.0145297 +-0.032345 0.0473443 -0.0245628 +0.0173629 0.0537245 -0.0278081 +-0.0616059 0.160004 -0.0295877 +-0.0123225 0.124091 -0.00743567 +-0.0401607 0.163674 -0.0120006 +-0.06497 0.154244 -0.00563561 +-0.0510279 0.0336678 0.0250302 +-0.0771941 0.0893363 -0.0125642 +0.0224953 0.109772 0.0381484 +-0.0545656 0.13815 0.0298405 +-0.00171216 0.066944 -0.0344014 +-0.00330066 0.124033 -0.00952648 +-0.0724141 0.159616 -0.0379306 +-0.0128309 0.0869146 -0.0385108 +0.0379635 0.103337 0.0286718 +0.00150556 0.0870476 0.0569313 +0.0339501 0.0683557 -0.0167775 +-0.0296157 0.053701 -0.0213818 +-0.0239053 0.0350134 -0.0198326 +0.00348633 0.110018 0.042298 +-0.00459976 0.0405792 -0.0256485 +0.0313837 0.0352278 0.00968341 +-0.0524893 0.105673 0.0402508 +-0.0334757 0.072353 -0.0224701 +-0.00165204 0.0347369 0.0450897 +-0.0251253 0.179165 -0.0186166 +0.0418909 0.0939077 0.0272858 +-0.0417165 0.069628 -0.0168617 +-0.0751265 0.0670609 0.00488552 +-0.0702901 0.063891 0.0211244 +-0.0777094 0.170825 -0.0439812 +-0.0735195 0.135848 0.0500526 +-0.0690768 0.0739443 0.0372765 +0.0123912 0.116671 -0.0157278 +-0.0504991 0.105636 0.0396146 +0.0194996 0.0489742 0.0420155 +-0.0652338 0.145869 -0.0189253 +0.0183651 0.124757 -0.00246117 +-0.067493 0.105571 0.0389191 +0.00451331 0.0814276 0.0565046 +-0.0126391 0.0466477 -0.0295757 +-0.043534 0.0422491 -0.0203181 +-0.0576807 0.133928 0.0359191 +-0.0847679 0.10454 0.0257763 +-0.0763966 0.0748983 0.0314167 +-0.0163248 0.0390132 0.0346782 +0.0455396 0.083395 0.0201668 +-0.0404951 0.0747761 0.0426102 +0.0326457 0.113685 0.0274718 +-0.0533008 0.118582 -0.0133417 +-0.0548347 0.0518559 -0.00436961 +-0.0444358 0.0344955 0.0309851 +0.0022525 0.0986072 0.0504164 +0.0280941 0.107442 0.0372758 +0.0311382 0.100809 0.0381724 +-0.0608693 0.0982413 -0.018491 +-0.0808258 0.116274 -0.00349703 +-0.00493749 0.124022 0.0339675 +-0.0202041 0.0383371 0.000156328 +0.000176932 0.0881362 -0.0348875 +-0.0122454 0.128019 0.000407111 +-0.0750529 0.0860661 0.0392001 +-0.0200226 0.0403705 0.0532551 +-0.0196618 0.127752 0.0140421 +-0.0544977 0.0747139 0.0418232 +-0.0850765 0.107567 0.00438106 +-0.0759578 0.071995 0.0287387 +-0.0434567 0.155083 0.00724724 +-0.090134 0.132434 0.0362229 +0.022282 0.0706591 -0.0268891 +-0.090924 0.128274 0.0409748 +-0.0889908 0.13778 0.0388031 +-0.0788715 0.122217 -0.0060966 +-0.00443014 0.100204 0.0479984 +0.0327247 0.0646521 0.0402099 +-0.066223 0.15556 -0.0520809 +0.0118954 0.0685639 0.0540604 +-0.0805181 0.12599 0.0525745 +0.0465562 0.0753029 0.0092212 +-0.0743025 0.151276 -0.0308835 +-0.0905476 0.146077 0.0141502 +-0.0715441 0.112225 0.0480665 +-0.0679786 0.137002 -0.008171 +-0.0672001 0.044789 0.00569382 +-0.0714328 0.168025 -0.0480185 +-0.0584837 0.088969 0.0446761 +-0.0444852 0.0411138 0.0436529 +0.0142229 0.0821798 -0.0300828 +0.0137354 0.10206 -0.0220537 +-0.0532836 0.0335112 0.0086601 +-0.046743 0.0767653 -0.0182293 +-0.0653246 0.173014 -0.0475844 +-0.0105123 0.0633015 0.0555068 +-0.0652467 0.122825 0.0496059 +-0.0587837 0.0940397 -0.0203993 +-0.061496 0.107016 0.0394252 +0.032159 0.0404592 0.0270704 +-0.0550412 0.129739 0.0362139 +0.0187645 0.036357 0.00611202 +-0.051625 0.0474378 0.0157122 +-0.0945263 0.121474 0.0192827 +-0.0874631 0.104981 0.0103802 +-0.0444225 0.0587761 0.0392912 +0.00550135 0.107149 0.041587 +-0.0023107 0.0375379 0.0154093 +0.0365396 0.111887 0.0174946 +-0.0667677 0.0809002 -0.0178421 +0.0212994 0.0550028 0.0464604 +-0.00474995 0.0391641 0.0333259 +0.0385436 0.103322 0.0277283 +-0.0350927 0.168167 -0.014918 +-0.0381943 0.124735 0.0235454 +-0.0436117 0.125739 0.0201433 +-0.0122465 0.124398 0.0313659 +-0.018196 0.038272 0.00607299 +-0.0454731 0.0675709 0.040115 +0.0397094 0.0887389 0.0329441 +-0.0612601 0.0653881 0.0322823 +0.0358388 0.063303 0.0376893 +-0.0894207 0.0969969 0.0174102 +0.0247051 0.054807 -0.022754 +-0.0362363 0.0345287 0.0379647 +-0.0134852 0.104433 0.0435318 +-0.0390753 0.0353444 0.00990175 +-0.032893 0.0386199 -0.0119052 +-0.066881 0.172737 -0.0437921 +-0.0844296 0.0777425 0.00651672 +0.0102401 0.13009 0.0220074 +-0.0184847 0.091067 0.0550019 +-0.048793 0.155022 0.0100543 +-0.042488 0.1112 0.0368617 +-0.00484603 0.0989761 -0.0268273 +-0.0667655 0.079447 -0.0174677 +-0.0520123 0.033434 -0.00549431 +-0.0309502 0.0376665 0.0292806 +0.0125353 0.118934 -0.0141702 +0.0393762 0.0393721 0.0023232 +-0.0154839 0.0388074 -0.00858919 +-0.027433 0.108265 -0.0206521 +-0.0335566 0.11282 -0.0174155 +-0.0428158 0.126503 0.0190139 +0.0359007 0.0374161 0.00496434 +0.030827 0.118499 0.003976 +0.0482689 0.0616107 -0.00376704 +0.0172995 0.0637271 -0.0287659 +0.0352999 0.0727523 0.0387329 +0.0325099 0.0439072 0.0294151 +0.0434928 0.0597185 0.030951 +-0.0849411 0.14333 0.0402714 +-0.0419573 0.15213 0.00584722 +-0.0478585 0.101383 -0.0215741 +0.0158763 0.121559 0.0327664 +0.0196134 0.0505877 0.0439573 +-0.0408143 0.0899706 -0.0230035 +0.0179499 0.0360095 0.0408071 +-0.0491945 0.137084 0.0184007 +0.0422067 0.0898824 0.0277847 +-0.0568073 0.122 -0.00880521 +-0.0535468 0.0500774 -0.00609453 +-0.0791017 0.171279 -0.0410322 +-0.0812381 0.0774347 -0.00249764 +0.00451011 0.08973 0.0555486 +0.0360129 0.0947297 -0.0122566 +-0.0267986 0.0839175 -0.0367186 +-0.0336466 0.125738 0.0192922 +-0.0645061 0.0384674 -0.00726163 +-0.069197 0.145134 -0.0204031 +-0.0453102 0.150665 0.00801555 +-0.016121 0.0347931 0.0455365 +0.0372267 0.0827114 -0.0157704 +-0.0586519 0.047167 0.0396282 +-0.0723413 0.0352299 0.00501169 +-0.00850771 0.0457646 0.047699 +-0.0361402 0.0481769 -0.0171107 +-0.0694918 0.0986232 0.041191 +-0.0145821 0.0365575 -0.0175497 +-0.0152331 0.178626 -0.0269991 +-0.0375015 0.0761535 0.0421853 +0.0230994 0.0700125 0.0474321 +-0.0769031 0.149462 0.0386995 +-0.0160344 0.0394989 0.0396851 +-0.077278 0.155614 0.0132673 +-0.0461472 0.0695191 0.0407559 +0.013766 0.105146 -0.0193832 +-0.00180961 0.102694 -0.0227875 +-0.0404787 0.102851 0.0403978 +-0.0256602 0.0491814 -0.0262646 +-0.0640267 0.155773 0.0106957 +-0.0188798 0.0381919 0.018679 +0.0251044 0.111527 -0.0122017 +-0.00771141 0.130468 0.0154714 +-0.0143198 0.128437 0.0203415 +0.000556364 0.0427979 0.0462128 +-0.0107039 0.129221 0.0216334 +-0.0755898 0.0796389 -0.010614 +-0.0618567 0.156837 -0.0325918 +-0.0516893 0.0678068 -0.0129959 +-0.0631142 0.178334 -0.0583576 +-0.0386855 0.0651385 -0.0142461 +-0.0594798 0.0790546 0.0431577 +-0.029726 0.121561 0.0251755 +-0.0328596 0.153633 -0.000344229 +0.0339626 0.0356317 0.0117064 +-0.0718527 0.158151 -0.00382487 +-0.0194857 0.0486564 0.0485018 +0.0319575 0.0889685 0.042819 +0.00933955 0.0624337 -0.0310444 +-0.0172265 0.113695 -0.0184196 +-0.0866231 0.0846922 0.0194779 +-0.0663134 0.0608279 0.00678018 +-0.0718125 0.0922256 -0.0157107 +0.0550352 0.064867 0.0267865 +-0.0446824 0.0651214 -0.0145177 +-0.066499 0.0958724 0.0422345 +-0.0484771 0.135525 0.0064169 +0.0419641 0.0872658 0.0291034 +-0.0144336 0.120974 -0.0101151 +0.00537913 0.115468 -0.0184153 +-0.0169313 0.0940904 -0.0338108 +-0.0311219 0.087675 -0.0275557 +-0.0733475 0.129801 0.0519745 +-0.0628563 0.0432731 0.0396846 +-0.0181419 0.159077 -0.00932452 +-0.0244219 0.0752703 0.0498831 +0.0278638 0.0367181 0.000104301 +0.0464062 0.0525822 0.0317783 +-0.0352134 0.127051 0.0157486 +-0.037493 0.0605801 0.0408152 +0.0435542 0.0709351 0.0259153 +-0.061811 0.0896079 -0.0190442 +-0.0487502 0.167013 -0.00197199 +-0.011981 0.180127 -0.0244833 +-0.0273118 0.0346998 0.0432305 +0.0260624 0.113339 -0.0101501 +0.00139388 0.0977439 -0.0275242 +0.0217437 0.0348491 0.000619009 +-0.0598385 0.0385019 0.0199857 +-0.0742583 0.12978 0.0523998 +0.0125017 0.103142 0.0463418 +0.0222613 0.0768462 0.049813 +0.0226846 0.125635 0.0109073 +-0.0664848 0.153437 0.0331838 +-0.0635064 0.100118 0.0422551 +-0.0884181 0.136485 0.0410708 +-0.0821317 0.151156 0.0323844 +-0.035019 0.035354 0.0462574 +-0.0445836 0.049099 -0.0105442 +-0.0913513 0.126793 0.00727091 +-0.00465552 0.0526099 -0.031899 +-0.0536395 0.0361733 0.0466553 +-0.0624928 0.0775409 0.0419345 +-0.0454844 0.1652 0.00481603 +-0.0176555 0.10171 -0.0237622 +-0.0517386 0.139928 0.000994108 +-0.0894422 0.0969694 0.0114146 +0.0282036 0.106111 0.0374341 +-0.0930784 0.128223 0.0132485 +-0.0710378 0.113905 0.0504272 +-0.0589666 0.06768 0.0360494 +0.0249541 0.12014 0.0288767 +-0.0467094 0.0345808 0.0339444 +-0.0627411 0.0766785 -0.0179436 +-0.00548466 0.051944 0.0528973 +-0.0355056 0.0705073 0.0417804 +0.00377856 0.127353 -0.00517835 +-0.0595895 0.0659394 0.0339087 +-0.0639025 0.0344657 0.0356117 +-0.0549717 0.132532 0.0345672 +-0.0762259 0.0790445 0.0349679 +-0.0259103 0.0721759 0.0444214 +0.0315716 0.117859 0.00423829 +-0.0696582 0.0642657 0.000568637 +-0.0882731 0.143189 0.0351319 +-0.031681 0.0679763 -0.0234472 +-0.0699144 0.1253 -0.00883057 +0.0435982 0.0888699 0.0251665 +-0.0914617 0.144737 0.0211556 +-0.0205009 0.126788 0.0181341 +0.0311284 0.103423 0.0364018 +-0.0196184 0.043638 -0.0281382 +-0.0192518 0.185941 -0.0210687 +0.0556563 0.0725898 0.00964459 +-0.0899954 0.135014 0.00922069 +-0.0658394 0.170333 -0.0405107 +-0.0487066 0.064243 0.0362896 +0.0115006 0.100446 0.0479384 +-0.0479295 0.132887 0.00374503 +0.0216229 0.0700379 0.048827 +0.0151599 0.050478 0.0463014 +0.00510611 0.0386758 0.0457599 +-0.0284578 0.0789297 -0.0355663 +-0.081069 0.152209 0.0312004 +-0.0814521 0.13302 0.0511119 +-0.0115065 0.0517326 0.051159 +0.0190773 0.108184 -0.0165978 +-0.0879813 0.0860844 0.0054873 +-0.0565924 0.0442297 -0.00693458 +-0.0358918 0.166781 -0.00116722 +0.0263229 0.122689 0.0193841 +-0.0305096 0.0608404 -0.0204127 +-0.0790435 0.0718734 0.00353541 +-0.0264818 0.101588 0.0434387 +0.0224815 0.0892515 0.0484736 +-0.07435 0.0711851 0.0297739 +-0.0366402 0.0563002 -0.0110085 +-0.0858069 0.133905 0.0470456 +-0.0347686 0.16678 -0.00304399 +-0.0318926 0.0385829 -0.0116716 +0.0173027 0.0680054 -0.0293377 +-0.084368 0.114299 0.000284663 +-0.0761089 0.149998 -0.0108814 +0.0437289 0.0987183 0.00617361 +0.0134057 0.0374127 -0.0219366 +0.000807934 0.124791 -0.00838237 +-0.0406768 0.0621783 -0.0128097 +-0.0926608 0.121474 0.0282925 +-0.0595443 0.155728 0.018094 +-0.0646509 0.168222 -0.0372156 +-0.0197896 0.127727 0.0110836 +0.0112619 0.069597 -0.0315203 +-0.0784667 0.141403 0.0468168 +-0.0881381 0.0996585 0.0223676 +-0.0495985 0.048927 -0.00879829 +-0.0567267 0.15478 0.0220083 +-0.0273659 0.119585 -0.010507 +0.0191093 0.0375318 0.0414884 +-0.054786 0.147744 0.027387 +0.0185111 0.114004 0.0370685 +-0.0106027 0.171925 -0.0271985 +-0.0795217 0.0748572 0.0255446 +0.0527001 0.0462105 0.0152086 +0.0191089 0.0889764 -0.0262512 +-0.0917278 0.114662 0.0113396 +-0.0311696 0.0749025 -0.031542 +0.0103976 0.0505032 0.04997 +0.00150167 0.0504398 0.0522275 +-0.00913054 0.0987984 -0.026694 +-0.0607072 0.0707896 -0.0151427 +-0.0314435 0.033488 -0.0292746 +0.0322402 0.0842577 -0.0191914 +-0.0617587 0.160001 -0.0265888 +0.0366758 0.0659888 0.0371374 +-0.0410386 0.153314 -0.00775366 +-0.0916156 0.146104 0.0201482 +-0.008275 0.130081 0.0196055 +-0.0716229 0.0395313 0.00756641 +-0.0555501 0.0448059 0.0154665 +-0.0519883 0.0545681 0.0276385 +-0.063796 0.145383 -0.0141799 +-0.0204903 0.107154 0.041938 +-0.00950118 0.06052 0.0554819 +-0.0297859 0.073336 -0.0325546 +0.0225502 0.0873848 -0.0245875 +-0.0658345 0.0367656 0.0273328 +-0.0335698 0.0354174 0.0482024 +-0.0826039 0.0829175 -0.00455606 +0.0133284 0.055284 -0.0292269 +-0.000932932 0.0363158 0.0167895 +0.0190541 0.116198 -0.0132311 +-0.000494259 0.0911454 0.0560111 +0.0112951 0.130595 0.0166808 +-0.0164761 0.0673645 0.0539812 +-0.0180225 0.0385494 -0.00514634 +-0.0610891 0.0339525 0.017372 +-0.0707478 0.147309 -0.0278341 +-0.0189873 0.180146 -0.0170482 +0.0237757 0.0343382 0.00896337 +-0.00265737 0.0899953 -0.0354905 +-0.0718661 0.100809 -0.0137558 +-0.00649817 0.0939276 0.0556503 +-0.0246455 0.126418 0.012252 +-0.0157508 0.070024 -0.0384074 +0.0256059 0.12104 -0.000826914 +0.00250363 0.0489881 0.0513443 +-0.029644 0.125848 0.0118936 +-0.024804 0.0737635 0.0475256 +-0.0672658 0.131206 0.0466969 +-0.0817178 0.0953366 0.0328835 +-0.0286351 0.0918211 -0.0275955 +0.0414472 0.0971985 0.0261597 +-0.0680972 0.121444 0.0525081 +-0.0683202 0.166619 -0.0540065 +-0.0375072 0.0775843 0.0424046 +-0.0143913 0.0384112 0.00490303 +-0.0518947 0.109852 -0.0185479 +0.0338477 0.0711662 -0.016803 +-0.0450894 0.154663 -0.00752455 +-0.0564919 0.0875695 0.0445907 +0.0391967 0.0726247 0.033788 +0.0574073 0.0717824 0.0103168 +-0.0237163 0.0380022 0.0196686 +0.0120538 0.0907862 -0.0301745 +-0.0669793 0.134061 -0.00834965 +-0.00947746 0.116894 0.0392479 +-0.0328734 0.0680853 -0.0194707 +0.030263 0.116206 0.0279976 +-0.0348513 0.0345425 0.0400019 +-0.0532018 0.0733522 0.0412342 +-0.0577592 0.033805 0.0199655 +-0.00439966 0.119978 -0.0131705 +0.0162591 0.0434903 0.0442636 +-0.0567225 0.0423764 0.0206991 +0.00325132 0.12142 -0.0127844 +0.0145581 0.125506 0.0293407 +0.00448398 0.0989824 0.0487111 +-0.0896848 0.0929338 0.0144339 +-0.04491 0.13036 0.00775303 +-0.048947 0.138616 0.00839947 +-0.0307428 0.0552453 -0.0153798 +-0.0826044 0.1367 0.0480323 +-0.0749507 0.0661289 0.00944516 +-0.00473325 0.069866 -0.0358872 +-0.0167995 0.0347343 0.0471976 +-0.0426342 0.12559 0.0204963 +-0.0444709 0.120321 -0.0132547 +0.010477 0.116818 0.0374755 +-0.0744965 0.123196 0.0533572 +-0.047302 0.16443 0.00497116 +-0.0859996 0.118394 -0.000793117 +-0.0326967 0.0849828 -0.026556 +-0.0843669 0.106153 0.00138874 +0.0167493 0.127305 0.0229819 +0.0223908 0.0489358 -0.0217863 +-0.0762839 0.155844 0.0209052 +-0.0839499 0.0979633 -0.0036111 +-0.0216926 0.126501 0.0176944 +0.0378596 0.0914955 0.035553 +0.0420895 0.102851 0.00717012 +0.0366464 0.103365 0.0302885 +-0.0696779 0.086056 0.0423345 +-0.0340311 0.0339294 0.0212063 +0.0162763 0.0361212 0.00396256 +-0.0426327 0.0338426 -0.00397459 +-0.027617 0.125471 0.0155889 +-0.0937433 0.118772 0.0222988 +-0.0518432 0.133909 0.0302884 +-0.0413643 0.124214 -0.00934406 +-0.0413386 0.121239 -0.0122322 +-0.0396582 0.0336638 0.00768797 +-0.0853564 0.091162 -0.00253932 +0.0179914 0.120614 0.0332262 +-0.0717184 0.0792466 -0.0147262 +0.0215785 0.11262 0.0367657 +0.0236405 0.0366106 0.026972 +-0.07448 0.0662148 0.0164657 +-0.00149557 0.0973426 -0.0290749 +0.0342448 0.0842103 -0.0184253 +0.0045204 0.0661365 0.0560558 +-0.0072649 0.0384115 0.0117959 +0.0362267 0.104294 -0.00842134 +0.0232091 0.0782074 0.0494446 +-0.0204762 0.0786229 0.0556935 +0.0189956 0.125897 0.000310264 +0.0582502 0.0661055 0.0226582 +-0.0884672 0.113635 0.0306037 +-0.0595891 0.155231 0.0238846 +-0.0540479 0.142765 -0.001179 +0.0139994 0.0807368 0.0537041 +-0.0660333 0.155202 -0.00458552 +-0.0371914 0.175481 -0.00856986 +-0.0114786 0.114128 0.0403922 +0.00280587 0.10648 -0.0207933 +-0.061629 0.148291 0.0370712 +-0.0305056 0.115271 0.0335326 +-0.0847456 0.0911272 0.0289858 +0.0294623 0.103445 0.0374919 +-0.0884887 0.122612 0.00129126 +-0.0869453 0.0846809 0.01048 +0.04631 0.0778469 0.00818385 +-0.077491 0.135849 0.0507593 +0.00650523 0.0745046 0.0565842 +-0.0193751 0.0711448 0.0534686 +-0.03164 0.0581442 -0.0153958 +0.00337821 0.0392113 0.0295452 +0.026954 0.116596 0.0310646 +-0.0623115 0.16311 -0.0435951 +0.0154275 0.0350916 0.0411096 +-0.0724818 0.165221 -0.0429802 +-0.0359956 0.151076 -0.00202594 +0.0162209 0.0779008 -0.0293961 +-0.0478366 0.133877 0.0213554 +0.0569921 0.0661536 0.0243514 +-0.0318346 0.0915622 -0.0244444 +-0.0864107 0.0819973 0.0174801 +-0.0497993 0.0677848 0.0379447 +-0.0671663 0.164687 -0.0194859 +-0.00868026 0.111843 -0.0204858 +-0.0195177 0.0933631 0.0529187 +-0.0535918 0.114983 -0.0155816 +-0.068804 0.18096 -0.0579804 +-0.0846698 0.148755 0.00515607 +-0.0808035 0.0868637 -0.00756861 +-0.0309282 0.156627 0.000764301 +-0.0561456 0.0642166 0.0326189 +-0.0864523 0.0899653 0.00147962 +-0.0802598 0.0734072 0.0195467 +-0.025101 0.114847 -0.0155729 +-0.0348703 0.102876 -0.0215726 +0.00151752 0.0547965 0.0538164 +-0.0216758 0.0969718 -0.024798 +0.0367496 0.0931371 -0.012555 +0.00330684 0.0583228 -0.0321215 +-0.0697412 0.154452 0.0305168 +-0.0618525 0.0343021 0.022204 +-0.00886294 0.171168 -0.0237423 +-0.0216854 0.168305 -0.0122385 +-0.0435207 0.0562403 0.0394546 +-0.0620233 0.159983 -0.0376027 +-0.0751309 0.154085 -0.0179327 +-0.0480694 0.153165 -0.00566954 +0.0283556 0.0605487 0.0426528 +0.0115864 0.0348612 0.0423222 +-0.064559 0.11407 0.0417666 +0.0210547 0.0358177 -0.00168489 +-0.042575 0.0491291 -0.011035 +-0.0742409 0.113562 0.0499634 +-0.0659446 0.146784 0.0398667 +-0.0670071 0.172276 -0.0580562 +0.0251821 0.0357118 0.0226481 +-0.0129957 0.0883892 -0.0379783 +0.01814 0.0713245 0.0508426 +0.0161851 0.0347246 0.0253316 +-0.0234485 0.122824 -0.00599554 +0.00849456 0.0412846 0.0453159 +-0.0253871 0.124202 0.0208009 +0.00860136 0.121512 -0.0129363 +-0.0764996 0.128859 0.0532215 +-0.0637886 0.083851 -0.0191517 +-0.073438 0.175304 -0.0418354 +-0.0464485 0.132668 0.0189406 +-0.018505 0.112714 0.0394706 +-0.0579749 0.117711 -0.0123561 +-0.0241311 0.0384069 -0.0174035 +0.0286891 0.119649 0.00175522 +0.0135044 0.118213 0.0361594 +0.00748569 0.0942514 -0.0297902 +0.0223281 0.111319 -0.0139783 +0.00796203 0.131149 0.00690102 +-0.0888712 0.101031 0.0183836 +0.0208523 0.0352023 0.0276656 +-0.0939805 0.118754 0.0182968 +-0.0886426 0.129716 0.0443401 +-0.0562403 0.128346 0.0379943 +-0.0946719 0.122818 0.0192736 +-0.0844496 0.151409 0.0062115 +-0.0488054 0.124161 -0.00921799 +-0.0495787 0.0503337 -0.00863311 +-0.0642728 0.174473 -0.0515364 +-0.0355869 0.116022 -0.0147547 +0.0353133 0.0362497 0.0114171 +-0.0570854 0.136926 -0.00500822 +-0.033504 0.079379 -0.0265108 +-0.062469 0.033932 0.0153305 +-0.000579953 0.0361804 -0.0245898 +-0.0314067 0.0423682 0.0507901 +-0.0112759 0.125368 0.030237 +-0.00950387 0.075936 0.0571919 +-0.0424487 0.125177 -0.00834623 +-0.0077039 0.113721 -0.0184781 +-0.00342161 0.0338005 -0.0221963 +-0.0140717 0.118746 -0.0137718 +-0.0231943 0.0388081 0.0352395 +-0.0639512 0.156212 0.0208686 +-0.0624954 0.0890364 0.0453804 +-0.0303734 0.125779 0.00722581 +0.003605 0.0340592 0.00699628 +-0.0765794 0.15423 -0.00189723 +-0.0759273 0.08606 0.0386654 +0.0508473 0.0446622 0.0112162 +0.00609443 0.127443 0.0291456 +-0.0428742 0.105667 -0.0205602 +-0.0188968 0.0381911 0.0132528 +-0.086324 0.106283 0.0073644 +-0.0320928 0.0336737 -0.0220791 +-0.0466544 0.119173 -0.0140371 +-0.0710688 0.156192 0.0139947 +-0.055712 0.155088 0.0136896 +-0.0525045 0.159361 0.00819169 +-0.0543637 0.116891 0.0353365 +0.0318466 0.0424663 0.0288342 +-0.051547 0.125478 0.0342157 +-0.00249266 0.0760635 0.0587913 +-0.00575365 0.0727093 -0.0362416 +-0.00680153 0.129324 0.00093339 +0.0495021 0.0664943 0.0276338 +-0.0282448 0.11486 -0.0155715 +0.031224 0.0786608 -0.0202592 +-0.0148026 0.0827563 -0.0392327 +-0.071855 0.0993885 -0.014251 +0.0177513 0.0462342 0.0429632 +-0.0242082 0.121982 0.0271598 +-0.0922854 0.116039 0.0223382 +0.0434814 0.0832239 -0.00379707 +-0.0384996 0.171162 0.000767348 +-0.0712408 0.114861 0.0513991 +-0.0157632 0.12799 0.00385748 +0.019082 0.126548 0.00245443 +-0.00388013 0.0394939 0.0368098 +-0.0204678 0.122105 0.0297617 +-0.0285693 0.0399846 -0.0296196 +-0.0831878 0.0764607 0.0163622 +0.0190867 0.0428243 -0.0216805 +0.0483631 0.0628304 -0.00297175 +-0.0927311 0.120157 0.0322864 +-0.0241838 0.0579409 0.0417219 +-0.0517297 0.0723507 -0.015831 +-0.0217729 0.0684817 -0.0372671 +-0.00949546 0.0829261 0.0578441 +0.0172524 0.0778474 -0.0286871 +-0.0441607 0.162142 -0.00945516 +-0.00587725 0.105934 -0.0226578 +0.0253567 0.0518232 -0.0216362 +-0.0494861 0.156424 0.00985611 +-0.0174771 0.0924389 0.0547456 +-0.0151406 0.126373 0.0259068 +-0.0852968 0.0818288 0.005494 +-0.0244818 0.0988555 0.0446892 +-0.0930791 0.118839 0.037294 +-0.0662836 0.114247 0.046332 +0.0127465 0.0672208 0.05354 +-0.0414757 0.109827 0.0377618 +-0.0435203 0.0519967 0.0390799 +-0.0417672 0.0812092 -0.0204027 +-0.0786424 0.0732312 0.000545367 +-0.0358502 0.0986071 -0.0225695 +0.0443653 0.0561662 -0.00597205 +0.0226111 0.0458717 -0.017849 +-0.0108336 0.116804 -0.0157483 +-0.0865451 0.110395 0.00835385 +0.031421 0.0399741 -0.00264961 +0.0363991 0.039859 -0.00104313 +-0.0468008 0.0347657 0.0424884 +-0.0398282 0.0914347 -0.0233046 +-0.025008 0.0334859 -0.0261337 +-0.0465231 0.0804789 0.0433941 +-0.0689665 0.135529 -0.00828838 +-0.0264689 0.0379883 0.0100865 +-0.0345116 0.111154 0.0360997 +-0.0225694 0.0387321 0.0336407 +0.0372794 0.0574491 -0.00767997 +-0.0707981 0.0672067 0.0269443 +-0.0150683 0.0384098 0.0065829 +-0.0592389 0.0452743 -0.00430196 +-0.0334924 0.102881 0.0413291 +-0.079025 0.153836 0.00536375 +-0.0229321 0.055215 0.043371 +-0.0601957 0.0341396 0.0262143 +-0.0688541 0.147497 -0.029579 +-0.0613597 0.172535 -0.0585911 +-0.0748166 0.0921259 -0.0144369 +-0.0632016 0.165278 -0.0601981 +0.0402098 0.04091 0.000378677 +-0.047469 0.117985 0.0306301 +0.0368134 0.0781201 0.03746 +0.000515748 0.0349973 0.0453092 +-0.0534255 0.124412 -0.00739059 +-0.000488424 0.0801341 0.0575904 +-0.0706455 0.0701231 -0.00669595 +-0.0477034 0.0649971 -0.0135628 +-0.0348898 0.0767003 -0.020496 +-0.00451076 0.0788064 0.0581316 +-0.0693915 0.117164 0.0523368 +-0.0200653 0.164398 -0.0170398 +-0.073544 0.177863 -0.0540307 +0.0427163 0.0399244 0.0113768 +0.0240483 0.0713748 0.0470522 +-0.0154968 0.0659374 0.0537935 +-0.0686329 0.175846 -0.0473222 +-0.0628372 0.172536 -0.0525874 +-0.0796429 0.148681 -0.00084361 +-0.0663392 0.0600723 0.0146241 +-0.00400483 0.123769 0.0343163 +0.0322222 0.0597861 -0.0166881 +-0.0640918 0.158696 -0.0546245 +-0.00248901 0.0456504 0.0469622 +-0.072774 0.10871 0.0380686 +-0.0810086 0.154578 0.0119766 +-0.0695005 0.091616 0.0421021 +-0.0665162 0.155345 0.00690315 +-0.030539 0.0748507 -0.0325674 +-0.0672648 0.0680031 0.0322561 +-0.0660205 0.131186 0.0449542 +-0.0246171 0.125897 0.00496292 +-0.077893 0.12518 -0.00689701 +-0.0883724 0.121658 0.047175 +-0.0773948 0.167309 -0.02854 +-0.0604 0.0470132 0.0371523 +-0.027746 0.0753954 -0.0356568 +-0.0748509 0.0782361 -0.0105914 +-0.0571323 0.14819 0.0314465 +-0.0415029 0.0803953 0.042616 +-0.0628829 0.0649103 0.0305991 +-0.00169833 0.0598396 -0.033652 +0.0151569 0.107807 -0.0181851 +0.0566945 0.0674374 0.0239376 +-0.0717279 0.155642 0.00502354 +-0.00382186 0.102465 0.0438439 +-0.0587089 0.155741 0.0125904 +0.0572801 0.0608152 0.0247108 +0.017703 0.0913635 0.0485583 +0.0260543 0.116303 -0.00733098 +-0.0345036 0.0690703 0.0414109 +-0.0292922 0.117943 -0.0127907 +0.0213023 0.0835644 0.0502546 +0.0464907 0.0664648 0.0271426 +-0.0564929 0.14962 0.0306387 +0.0282135 0.118937 -0.00132982 +-0.000391601 0.123621 0.0341495 +-0.00114981 0.12653 0.03091 +0.0304544 0.114562 -0.00546317 +-0.0547437 0.0337519 0.0206417 +-0.0468823 0.107031 -0.0193009 +-0.0631801 0.0406886 0.0415101 +-0.0910325 0.133669 0.0112223 +-0.0592476 0.145654 -0.00231326 +-0.0125718 0.100502 0.0445971 +-0.0298246 0.0378766 0.0293214 +-0.0839351 0.123564 -0.00377373 +-0.0621407 0.163665 -0.0567978 +-0.0389566 0.155104 0.00497717 +-0.0878144 0.105004 0.012374 +-0.0794305 0.0908376 -0.00963692 +-0.0246551 0.0507167 -0.0273858 +-0.0796103 0.0799856 -0.0065507 +0.0330411 0.10941 -0.00791346 +-0.00231596 0.121888 -0.0112268 +-0.0597326 0.154693 0.0267485 +0.0339669 0.0697663 -0.0167955 +0.0205734 0.0999616 -0.0218299 +-0.0354929 0.0917868 0.0443508 +0.00339585 0.0355203 0.0220096 +-0.0315414 0.125778 0.00387502 +-0.0478194 0.135564 0.0104014 +-0.00879058 0.0812731 -0.0379859 +-0.0037488 0.0386615 0.00318783 +-0.0464486 0.0959731 0.0434949 +-0.0306087 0.0394849 -0.0300968 +-0.00234671 0.0967246 -0.0304442 +-0.0312616 0.0735186 -0.0295121 +-0.0423301 0.0340883 0.0282541 +0.0355908 0.113068 0.0185826 +0.000833787 0.106762 -0.0210825 +-0.021676 0.184465 -0.0190713 +-0.0305406 0.0566147 -0.0184018 +-0.0876394 0.113262 0.0257017 +-0.0851868 0.0966727 -0.00156833 +-0.0465061 0.0425232 0.0438042 +0.0106037 0.121274 -0.0126925 +0.0290611 0.0523826 -0.0177704 +-0.000764451 0.0769261 -0.0359174 +-0.0416101 0.0338187 0.00715256 +-0.0893298 0.0969555 0.0104169 +-0.0345694 0.163827 -0.00275159 +-0.0888276 0.090232 0.0214359 +0.0208395 0.034464 0.00266226 +0.0428658 0.0623821 -0.00251673 +-0.00588102 0.130577 0.00751387 +-0.0133142 0.0337765 -0.0222266 +-0.0435242 0.0590876 0.0398271 +0.0545899 0.0478435 0.0151974 +-0.0107349 0.0699421 -0.0371274 +0.027906 0.0578072 0.0419759 +-0.0416225 0.0520166 -0.011127 +-0.0207276 0.168298 -0.0126147 +0.0256959 0.0491338 0.0386649 +-0.0550795 0.153114 -0.00215772 +-0.0380808 0.0483205 -0.0131774 +-0.0276317 0.056316 -0.0254148 +-0.00815144 0.127733 -0.00346398 +-0.0627849 0.0852772 -0.0191174 +-0.0619877 0.169385 -0.052596 +0.0234401 0.112665 0.0358138 +-0.0659073 0.110934 -0.0126703 +0.0280721 0.0360499 0.0211097 +0.0105243 0.0687767 0.0545753 +-0.00679638 0.0982761 -0.0281107 +-0.0309109 0.0462432 0.0473418 +-0.0196031 0.0393462 -0.028238 +-0.0871129 0.152836 0.0157593 +-0.0911632 0.133688 0.01322 +-0.0464961 0.102903 0.0415914 +-0.0206991 0.0553418 -0.0317435 +-0.00949277 0.073156 0.0570282 +-0.0864179 0.083353 0.0184733 +-0.0841891 0.111446 0.02976 +-0.0940387 0.126929 0.0232615 +0.0406221 0.0899944 0.0307666 +0.0208423 0.104696 0.0425993 +0.0445354 0.0407636 0.0127885 +-0.0623396 0.172509 -0.0536126 +0.0342346 0.0852576 -0.0183147 +-0.0866427 0.151554 0.0100877 +-0.0470988 0.0345244 0.0321531 +-0.080576 0.154494 0.0106641 +-0.0137759 0.0756859 -0.0386228 +0.0216235 0.0430155 -0.0167288 +0.0376424 0.109732 0.0031582 +0.0589875 0.0607291 0.021951 +-0.0923003 0.132372 0.0212228 +0.0311691 0.0942449 0.0417029 +-0.0174159 0.162512 -0.00777918 +-0.0156178 0.12076 -0.00985742 +-0.0507328 0.121196 0.0335979 +0.028716 0.119662 0.0245591 +-0.0738138 0.0950345 -0.0145557 +0.0204425 0.0350747 0.0258809 +-0.0207737 0.0351435 -0.019333 +0.0223353 0.12586 0.0121947 +-0.0155009 0.0951913 0.0533641 +-0.0143883 0.038338 0.0212719 +0.00741103 0.0391504 0.030425 +0.0433932 0.0691823 -0.000799598 +-0.0760543 0.149976 -0.0168736 +-0.0701178 0.170154 -0.0291958 +-0.0483555 0.146018 -0.00117385 +0.0336441 0.0578174 0.0379601 +-0.0913716 0.140622 0.0201693 +-0.0308539 0.0958394 -0.0237431 +-0.0766992 0.0702795 0.00252119 +-0.0544948 0.107078 0.0398767 +-0.0587729 0.0796565 -0.019784 +-0.013621 0.128874 0.0191382 +-0.0634727 0.156127 0.0195874 +-0.0880436 0.0977019 0.0235765 +-0.0606626 0.0738612 0.0409255 +0.0348653 0.0795228 0.0399156 +0.0387467 0.0828368 -0.0137708 +-0.0573402 0.0424553 0.0177175 +-0.0784976 0.148406 0.0395361 +-0.0917148 0.117385 0.0263102 +-0.0330041 0.122377 0.0254817 +0.0172403 0.0768113 0.0531129 +0.0595736 0.0691817 0.0101411 +0.0306903 0.0708797 -0.0198199 +-0.0845462 0.119028 0.0490922 +-0.0501127 0.0337803 -0.0127711 +-0.0670049 0.0372923 0.032499 +-0.0915067 0.129676 0.0312386 +-0.0550517 0.0504886 -0.00434688 +-0.0484873 0.0790818 0.0439275 +-0.0635173 0.159862 -0.0515858 +-0.0706155 0.173275 -0.0394062 +0.0352172 0.0952034 -0.0127755 +0.0251052 0.0382735 0.0297226 +-0.0668809 0.106639 -0.013906 +-0.0678418 0.143634 -0.0139334 +-0.0235762 0.184403 -0.0123621 +-0.0257601 0.0726356 -0.0363191 +-0.0573375 0.0472769 0.0101218 +-0.085611 0.106332 0.02136 +-0.0265671 0.0617846 0.0387137 +-0.0126044 0.12951 0.0108053 +0.0214416 0.0362735 0.0322576 +-0.0354711 0.126342 0.0186171 +-0.0594976 0.0904384 0.0451853 +0.00310705 0.0348555 0.0387811 +0.0254813 0.0942452 0.0457882 +-0.0308576 0.10008 -0.0228293 +-0.0176768 0.0510699 -0.0312435 +-0.0162281 0.181624 -0.0200739 +-0.0195138 0.038345 0.00392275 +-0.0645154 0.121409 0.0489254 +-0.0248162 0.0593033 0.0409035 +-0.0571389 0.136712 0.0331888 +-0.0435213 0.0379732 -0.0242868 +-0.0606582 0.12408 0.0421371 +0.0346832 0.0519191 0.0323364 +-0.0913706 0.116528 0.0258009 +-0.0426868 0.0651551 -0.0146214 +-0.0215064 0.116765 0.0355266 +-0.0581012 0.158247 0.00415445 +0.00842312 0.0385006 0.0330183 +-0.0523141 0.162661 -0.0019165 +0.0606845 0.0623337 0.0161711 +-0.0495055 0.0848369 0.0453213 +0.0333786 0.06058 0.0393695 +-0.0689469 0.131135 -0.00874709 +-0.078943 0.132461 -0.00522567 +-0.0196521 0.0386292 -0.00926197 +-0.0594457 0.0334843 -0.00338966 +-0.054161 0.0337073 0.0136843 +-0.0384829 0.0959056 0.0428235 +-0.0869182 0.148604 0.0308154 +-0.0323987 0.116048 -0.0147978 +0.0359194 0.0798211 -0.0157295 +-0.0328255 0.12127 -0.00820532 +0.0414852 0.0569681 0.0316528 +-0.0270871 0.0520359 -0.0253933 +0.0508347 0.0727393 0.0196905 +-0.0198767 0.105865 -0.0225965 +0.0206869 0.0400703 -0.0126929 +-0.0285033 0.0616825 0.0373869 +-0.0714181 0.143109 -0.0104276 +-0.0804568 0.138622 0.0481167 +-0.0458049 0.0532278 0.0379952 +-0.0509023 0.125469 0.0333647 +-0.0871853 0.145927 0.0339699 +0.0558536 0.0594884 0.0261475 +-0.0889169 0.126733 0.0032966 +0.0110737 0.125093 -0.00680678 +-0.0358405 0.094357 -0.023472 +0.0259145 0.102099 0.0411479 +0.0426389 0.0764517 0.0281735 +0.00597565 0.131268 0.0190237 +-0.0475211 0.165506 -0.00586183 +0.0138473 0.035286 0.0424107 +-0.0544751 0.0987674 0.042954 +0.0329063 0.0668566 -0.0177475 +-0.0715523 0.0819441 0.0400873 +-0.0483263 0.149906 -0.00403153 +0.0417112 0.0986332 0.0241669 +-0.0591403 0.039472 0.0459797 +-0.0649985 0.156251 0.0205012 +-0.0389795 0.034282 0.00907489 +-0.0627215 0.0592404 0.0161384 +-0.0367435 0.0437017 -0.0271198 +-0.0164726 0.0387782 -0.0143554 +0.0302495 0.0773125 -0.0211724 +0.0378723 0.109729 0.00416584 +-0.0033562 0.120959 -0.0122202 +-0.0465665 0.0433151 -0.011194 +-0.0597431 0.093988 -0.019461 +-0.0756514 0.0743685 0.0320217 +0.0461779 0.083439 0.010174 +-0.0757827 0.151399 -0.00889222 +-0.0417451 0.0768346 -0.0188724 +-0.0617437 0.0421117 0.0428503 +0.00176163 0.130465 0.00157228 +0.0429689 0.0696277 0.0268653 +-0.0432762 0.0450842 -0.0143236 +-0.0525312 0.0475838 0.0226634 +-0.0153636 0.128543 0.00690549 +-0.0685053 0.109678 0.0379594 +0.0174805 0.103096 0.0453391 +0.0217176 0.0632088 0.0471364 +0.0359993 0.0955223 0.036379 +-0.0451488 0.0335546 0.00486717 +-0.0681193 0.15804 -0.05439 +-0.0661021 0.155727 0.025928 +-0.00573558 0.0684573 -0.035843 +-0.0181282 0.187252 -0.018852 +-0.0445141 0.050571 0.038927 +-0.00049716 0.0856626 0.0573342 +0.016507 0.0913965 0.0503683 +-0.0333397 0.0410057 0.0499212 +-0.0351946 0.125334 -0.00338173 +-0.0616183 0.16622 -0.0565931 +-0.0624979 0.0760891 0.0414437 +0.0350466 0.107363 0.0297386 +-0.0720199 0.063399 0.00874547 +-0.0877434 0.135138 0.0431967 +0.0458379 0.0588925 -0.00503856 +-0.0385014 0.119389 0.0303589 +-0.0647267 0.0417808 0.0373932 +-0.0226655 0.0537608 -0.0296706 +-0.0584982 0.105689 0.0406051 +-0.0137228 0.0685659 -0.0377913 +-0.0817302 0.142079 0.0441697 +-0.0426358 0.0548841 -0.0113796 +-0.0135008 0.082884 0.0573146 +-0.00338001 0.130095 0.0228247 +0.0172769 0.0708593 -0.0295557 +-0.0246932 0.065394 -0.0335995 +-0.0314011 0.178523 -0.00645128 +-0.0575589 0.154615 -0.000238768 +-0.0407441 0.0753914 -0.0183192 +-0.084936 0.144668 0.0388142 +-0.0365092 0.108385 0.0376381 +-0.0851088 0.102115 0.000391121 +-0.0646522 0.0642554 -0.00503339 +-0.0754983 0.145823 -0.00786764 +-0.0474148 0.133778 0.0200381 +0.012958 0.0904818 -0.0298536 +-0.0425054 0.0705013 0.0420152 +0.0369946 0.0686204 -0.0137746 +0.0462743 0.0775122 0.0165366 +-0.0417874 0.128546 0.00302224 +0.00250208 0.0547919 0.0536548 +-0.0543206 0.140979 0.0284164 +-0.0492132 0.138613 0.0153977 +-0.0204064 0.162527 -0.00684616 +-0.0194926 0.111309 0.040066 +-0.00849594 0.0829198 0.0577964 +-0.0467773 0.0826601 -0.021013 +-0.0535197 0.0472233 -0.00680686 +-0.0092432 0.169141 -0.0244221 +-0.0594862 0.0804633 0.0433033 +-0.0764447 0.154164 -0.0158984 +0.0585888 0.0538213 0.0151823 +-0.0588396 0.0925945 -0.0203375 +-0.0761105 0.167387 -0.0256061 +0.0432176 0.0401728 0.0130684 +-0.0395679 0.152136 0.0040279 +-0.0685344 0.180035 -0.058648 +-0.0404998 0.0930589 0.0424923 +0.0428754 0.100088 0.00417324 +-0.0320271 0.0553591 -0.0124271 +0.0199862 0.0348656 0.0241629 +-0.069479 0.123198 0.0530616 +-0.0239594 0.117024 -0.0138685 +-0.013157 0.175712 -0.0209577 +0.00451102 0.0674972 0.0557889 +0.0304128 0.0431004 -0.0051324 +-0.0887794 0.151473 0.0131594 +0.0317917 0.0949031 -0.0164462 +0.0342895 0.112223 -0.00202032 +-0.0728652 0.170808 -0.0480355 +0.0253565 0.075473 0.0472224 +-0.0754952 0.15561 -0.00190651 +0.060278 0.0581371 0.013168 +0.00444274 0.131539 0.0170385 +0.00950273 0.0546854 0.0525766 +-0.028415 0.178753 -0.00594863 +-0.011518 0.0431769 0.0500228 +-0.0504724 0.141671 0.0164028 +-0.0424936 0.045133 0.0413379 +0.0207994 0.125738 0.00307388 +-0.0689469 0.0433261 0.00632212 +0.0111753 0.0766426 0.0548499 +0.0297504 0.0462054 0.0339396 +-0.0674791 0.0622216 0.0214031 +0.0131787 0.0793804 0.0542326 +-0.0630395 0.136976 -0.00741235 +-0.0026931 0.0386465 0.0251959 +-0.0862725 0.103636 0.0233541 +-0.072832 0.162419 -0.0389636 +-0.0670825 0.156321 0.0197603 +-0.0572305 0.057508 0.0152056 +-0.0876158 0.136354 0.00421533 +-0.0214752 0.0609386 0.0459919 +-0.007347 0.0952877 -0.0329727 +-0.0613578 0.0586321 0.0151557 +0.00350505 0.0590839 0.0549927 +-0.0372275 0.160948 0.000450465 +-0.0457572 0.0336839 -0.00997088 +0.0106658 0.0351593 0.00371028 +-0.0714997 0.16363 -0.0138384 +0.00840839 0.117161 -0.0162388 +-0.0493716 0.143224 0.00839291 +0.0251748 0.123444 0.0203849 +0.0329112 0.096871 0.0389677 +0.044554 0.0917551 0.0201604 +-0.0384935 0.0562767 0.0397971 +-0.0785284 0.123123 0.0516319 +0.0426769 0.101505 0.0101616 +0.00833271 0.0567886 -0.0305627 +-0.0876135 0.100396 0.0230423 +-0.0327059 0.0779055 -0.0285245 +0.0119151 0.0860485 0.0542349 +-0.0675927 0.17056 -0.0354212 +-0.0807265 0.0770568 0.0269252 +-0.0384859 0.0520062 0.0392089 +0.0452145 0.0482364 0.0300085 +0.0204736 0.0851385 0.0500118 +-0.0600179 0.155783 0.0193707 +0.0164701 0.0976264 0.0474551 +-0.0456663 0.0410589 -0.0152981 +-0.0821974 0.128571 0.0521036 +-0.0304964 0.0974331 0.0445755 +-0.0540878 0.128312 0.0358453 +0.0390858 0.0407779 -0.000614316 +-0.0725241 0.13724 0.0489632 +-0.0620129 0.0587144 0.0113478 +0.0455822 0.0848004 0.0171734 +-0.0839185 0.112898 0.00127069 +-0.0728197 0.155564 0.00463235 +0.0277412 0.121021 0.0227689 +0.0301995 0.0768447 0.0437008 +-0.0106344 0.174261 -0.0225996 +-0.0617342 0.0737271 -0.0167014 +-0.0414956 0.0464933 0.0408152 +0.03243 0.0535036 0.0361605 +-0.0377322 0.150234 -0.00179971 +-0.0847627 0.109032 0.02334 +-0.0642974 0.167953 -0.0385345 +-0.0221614 0.0825281 0.0558751 +-0.0504951 0.0960175 0.0443724 +-0.0508177 0.0501221 0.014822 +-0.0436492 0.0577877 -0.0118151 +-0.0189776 0.0390241 0.0529956 +-0.0623698 0.169401 -0.0505859 +-0.0105368 0.0850533 -0.0384463 +-0.0181795 0.183113 -0.0176247 +0.0314401 0.110365 -0.00894711 +-0.0127075 0.065682 -0.0367743 +-0.0273345 0.172717 -0.009826 +-0.0666857 0.141706 -0.00893584 +0.0408833 0.10285 0.0201769 +-0.0876525 0.145908 0.0330215 +-0.0436328 0.056346 -0.0115255 +-0.0611631 0.0428583 0.0256966 +-0.0330915 0.16076 -0.0136886 +-0.085208 0.150101 0.00618898 +-0.0615069 0.172523 -0.0575905 +0.0555907 0.0604655 -0.000426808 +-0.0850315 0.151395 0.00719993 +-0.0728007 0.0864364 -0.0158265 +-0.003188 0.127967 0.0287063 +0.0455462 0.0861954 0.016167 +-0.0217098 0.115215 -0.0159934 +-0.0414975 0.0916447 0.0424797 +0.0487043 0.0430197 0.0122221 +-0.0869351 0.106366 0.0163624 +-0.0156753 0.0541059 -0.0332392 +-0.06162 0.150156 -0.00124665 +-0.00577101 0.098213 -0.0280417 +0.0223236 0.0550419 -0.0260567 +-0.00429403 0.131101 0.0138416 +-0.0636168 0.143654 -0.00954122 +-0.0855598 0.0912595 -0.00155473 +-0.0404413 0.10705 0.0387043 +0.0547917 0.0553704 0.0263503 +-0.0822116 0.101996 0.0303518 +-0.0437463 0.128889 0.0155826 +-0.0664819 0.0397537 -0.00588584 +-0.067283 0.161835 -0.0137578 +-0.061699 0.0599431 0.00295203 +-0.0715633 0.170815 -0.0500445 +-0.0861137 0.0805676 0.00950062 +-0.0502228 0.125461 0.0326401 +0.0589666 0.0552427 0.017183 +-0.0327176 0.125444 0.0196276 +-0.0632934 0.151996 -0.00122225 +-0.0512927 0.135429 -0.000552487 +-0.0184842 0.0897075 0.0555921 +-0.0260646 0.11803 -0.0129143 +0.0198889 0.0631747 0.0480195 +-0.0465912 0.145038 0.00283923 +0.0534733 0.0728245 0.019221 +-0.0352804 0.0341155 -0.0193879 +-0.0829241 0.126549 -0.00467577 +0.0279852 0.0352646 0.0181572 +-0.0531741 0.150869 0.0213978 +0.0202497 0.0347399 0.020698 +-0.062763 0.149042 -0.0175788 +0.00226918 0.115596 -0.0185376 +0.0250704 0.12404 0.011788 +-0.045498 0.101529 0.0420301 +-0.058497 0.0426323 0.0447374 +0.0455164 0.0904085 0.0121603 +0.0215692 0.0352857 0.025924 +-0.0274987 0.0631476 0.0380009 +-0.0140602 0.172758 -0.0187663 +0.0587826 0.0538552 0.0121765 +-0.0628795 0.15219 -0.00958093 +-0.0468135 0.1536 0.00939603 +-0.0928405 0.121514 0.033281 +-0.0622964 0.150648 -0.0145762 +0.0475064 0.0611159 0.0308231 +0.00412571 0.107297 -0.0203039 +-0.0703978 0.156305 0.0156818 +-0.053643 0.135335 0.0311995 +0.0067064 0.0341407 0.0184863 +-0.0466442 0.0397388 -0.0142756 +0.0119051 0.0711889 0.0540767 +-0.0447375 0.0357143 0.0441717 +-0.0228183 0.0840509 -0.0381648 +-0.023326 0.122164 -0.00726067 +0.0441999 0.0790177 0.0251667 +-0.0276246 0.160982 -0.00149388 +-0.0399791 0.126816 0.018458 +0.0222264 0.09191 -0.0233017 +-0.0627692 0.156841 -0.0155919 +0.044508 0.0412168 0.00624902 +-0.0731279 0.155455 -0.0309078 +0.0183024 0.0347298 -0.00182982 +-0.01652 0.0715906 0.0550352 +-0.091634 0.141989 0.0201675 +0.0440337 0.0734407 -0.000804833 +-0.0524198 0.0648658 0.0346087 +0.0572481 0.0508905 0.0141872 +-0.0164766 0.111102 -0.0196668 +-0.0418874 0.108498 -0.0194287 +0.0321354 0.0549697 0.0375085 +-0.0644897 0.102874 0.0413067 +0.0465079 0.0583728 0.0318256 +-0.0334582 0.0518969 0.0377238 +-0.0729908 0.139888 -0.00698816 +-0.0534544 0.124093 0.0367404 +0.0173165 0.0622663 -0.028279 +-0.0554104 0.0513256 0.00948897 +-0.014903 0.172738 -0.0182312 +-0.0502115 0.141667 0.015397 +0.0229958 0.0375848 0.0332895 +-0.0749615 0.135451 -0.00681495 +-0.0855353 0.0938173 0.0282665 +-0.069508 0.102769 0.0393316 +-0.0205392 0.0971418 -0.0249761 +-0.0312923 0.0362769 0.0513145 +0.0260175 0.0991397 -0.0189626 +-0.00594641 0.0989148 -0.0267499 +-0.0708605 0.0347825 0.00928864 +-0.0845393 0.103233 0.0269979 +0.0406232 0.0953057 0.0289912 +-0.0456818 0.0650665 -0.0140257 +-0.0326318 0.168236 -0.00522072 +-0.0765723 0.0689281 0.00553415 +-0.0176728 0.049548 -0.0303695 +0.00113463 0.130461 0.00151005 +-0.08699 0.0859713 0.00247197 +-0.0338357 0.095789 -0.0234311 +-0.0304987 0.10293 0.0419798 +0.0336335 0.0713894 0.0398251 +-0.0224957 0.101642 0.0440993 +0.0309373 0.119109 0.0111337 +-0.0734894 0.156164 0.020416 +-0.000755237 0.0740961 -0.035785 +0.0354988 0.0469226 0.030944 +-0.00617179 0.128513 -0.00228639 +-0.00460988 0.0388908 -0.00276124 +-0.0678289 0.135464 0.0458614 +0.0345596 0.114411 0.00388032 +-0.0884532 0.112251 0.0353052 +-0.0709934 0.170517 -0.0295248 +0.0284454 0.0995183 0.0412905 +0.0402167 0.0685122 0.0317439 +-0.0665769 0.0362823 0.0365183 +-0.0765583 0.148625 -0.00886956 +0.0576507 0.0606695 0.00219201 +0.060413 0.0664733 0.017165 +0.022246 0.0835763 0.0498509 +-0.0821459 0.0912329 0.0320422 +-0.0746727 0.145787 -0.00986958 +0.0345089 0.111329 0.0271807 +0.0594367 0.0663847 0.00713811 +0.0282217 0.0664463 -0.0207545 +-0.0619747 0.170963 -0.0535908 +-0.0394944 0.0492076 0.0395541 +-0.0787666 0.165266 -0.0299591 +-0.0749441 0.129634 -0.00796551 +-0.00112962 0.125371 0.0323555 +-0.0154803 0.0500282 0.047966 +0.0153592 0.0953434 0.0487033 +-0.085237 0.147388 0.00618456 +-0.0128008 0.0841443 -0.0388521 +0.024383 0.0518665 -0.0223004 +-0.0342551 0.0766309 -0.0244955 +-0.0670839 0.173532 -0.0453192 +-0.0772544 0.0764799 0.0316515 +-0.0270646 0.053566 0.0376661 +-0.0225205 0.112681 0.0384786 +-0.0884304 0.0874699 0.00847782 +-0.0737584 0.0914853 0.0405847 +-0.064968 0.128232 -0.00872903 +0.000512384 0.127929 0.028588 +-0.0599553 0.0610872 0.0239566 +-0.0384792 0.116679 0.0322191 +-0.0485119 0.112536 -0.0170517 +-0.0304781 0.0523954 -0.0163632 +0.0387588 0.108855 0.00681782 +-0.0406156 0.155109 0.0060988 +-0.0471466 0.149481 -0.0040486 +0.0179495 0.127337 0.00345096 +-0.0395837 0.0336987 -0.0198537 +-0.0633751 0.0344193 0.0288044 +-0.0424853 0.128365 0.0145816 +-0.0364913 0.113889 0.0338295 +0.0353283 0.112832 0.00268414 +-0.0653226 0.0343003 0.0144151 +0.0435313 0.065065 0.0273105 +-0.0795726 0.0867837 -0.00954059 +-0.0104381 0.171321 -0.0205524 +-0.0737003 0.156269 0.0145144 +-0.0733818 0.155466 -0.0289107 +-0.0198527 0.0382258 0.0238627 +-0.0188257 0.0725897 0.0542693 +-0.0778777 0.117832 -0.00599287 +-0.0365049 0.10423 0.0397359 +-0.00948278 0.0978353 0.051868 +-0.0103201 0.0393296 0.0497389 +-0.0876274 0.137747 0.00620032 +0.0416732 0.0819555 0.0304093 +0.0608524 0.0609661 0.0101561 +-0.0767143 0.154218 -0.0048969 +0.0174945 0.0838575 0.0514031 +-0.066433 0.0337378 -0.00503676 +-0.0232113 0.177135 -0.0206374 +0.0100949 0.034771 0.018605 +0.042675 0.0751161 0.0282624 +-0.0866662 0.0833296 0.0114916 +-0.0504965 0.157865 0.00943584 +0.0433406 0.0973216 0.0191637 +-0.0888303 0.0915034 0.00845607 +-0.0555242 0.0415797 -0.00918326 +-0.0337405 0.075174 -0.025488 +-0.0906275 0.137865 0.0211926 +-0.0123027 0.0389534 -0.0136872 +-0.045835 0.0941966 -0.0219229 +-0.0238433 0.163025 -0.0155105 +-0.0522937 0.12758 -0.00475935 +0.0308793 0.0356029 0.0166157 +0.0423563 0.0588819 -0.00453174 +-0.00663392 0.0466819 -0.0297341 +-0.0484493 0.0656843 0.0374132 +-0.0270407 0.125883 0.0113821 +-0.0910269 0.129538 0.0072515 +-0.0455907 0.0447683 -0.0109766 +0.00905498 0.0971664 -0.0248901 +0.00396755 0.0341147 0.00886829 +0.00550365 0.123767 0.0339438 +0.0400787 0.0432895 0.0279756 +-0.00815712 0.126302 0.0298556 +-0.0609217 0.118124 -0.010668 +-0.0141549 0.129252 0.0145753 +0.0274448 0.120188 0.0255104 +-0.0485004 0.111187 0.0370789 +0.0451596 0.0789195 0.0230398 +-0.0138991 0.162654 -0.0155462 +-0.0528814 0.0447887 0.0196824 +0.0277468 0.0465681 -0.0107176 +-0.0580291 0.124109 0.0406616 +-0.0404897 0.0874362 0.0429424 +0.0316544 0.117354 0.0228159 +0.0277648 0.098182 0.0420578 +-0.0391765 0.165177 -0.0125287 +-0.0691207 0.112747 0.0474107 +-0.0614963 0.102908 0.0417081 +0.0393676 0.0927337 0.0325144 +0.0214921 0.125223 0.0232941 +-0.0167077 0.059948 -0.0356741 +-0.0619704 0.118373 0.041992 +-0.0359339 0.109235 -0.0196158 +-0.0150259 0.185694 -0.0231645 +0.0245929 0.0577938 0.0442192 +-0.00233157 0.122878 -0.010278 +-0.0434949 0.0817618 0.042266 +0.0298844 0.0350171 0.0132987 +-0.00424346 0.0409986 0.0479883 +-0.0776115 0.15005 -0.0049035 +-0.0124244 0.108763 -0.0212047 +-0.0798966 0.083235 0.0342815 +-0.0813623 0.104616 -0.00457868 +-0.0167402 0.0671791 -0.0380101 +0.0259555 0.123153 0.0178233 +0.0406613 0.0638232 0.0297482 +-0.0129458 0.117871 -0.0148632 +-0.0708515 0.0937008 -0.0159297 +-0.0688238 0.1383 0.0462399 +-0.0886846 0.136388 0.00720801 +0.0460186 0.0714912 0.0208033 +0.0465334 0.07646 0.0111853 +0.000795729 0.0345137 0.0115011 +0.0318042 0.0661523 0.0406683 +-0.0277917 0.0810724 -0.036339 +-0.012329 0.0361667 0.050366 +-0.0672863 0.151256 -0.0426939 +0.0328851 0.0556122 -0.0127142 +-0.0444939 0.107088 0.0401229 +-0.088037 0.113814 0.026966 +-0.0228073 0.184465 -0.0170667 +-0.00369909 0.0598617 -0.0340393 +-0.0698551 0.16523 -0.017589 +-0.0464984 0.047794 0.0396541 +-0.0756919 0.143067 -0.00582827 +-0.0208788 0.0383361 0.00183886 +-0.0768287 0.154208 -0.00589938 +-0.0147866 0.0799249 -0.0391233 +-0.0699384 0.150598 0.0380766 +-0.0866088 0.126656 -0.00171455 +-0.0792409 0.168033 -0.0359701 +-0.0650871 0.0417056 0.03635 +0.0353256 0.109535 -0.00390394 +0.00651309 0.0828012 0.0562471 +-0.0512535 0.0528689 0.0137817 +-0.0635072 0.0590749 0.0125217 +-0.0892074 0.127019 0.0449806 +0.0451896 0.0875706 0.0191665 +-0.0576689 0.0350157 0.0450337 +-0.0441239 0.129077 0.0169132 +0.00351519 0.0634007 0.0566286 +-0.0456618 0.0741031 -0.0174455 +-0.045802 0.0382259 -0.0192856 +-0.0774749 0.141413 0.0470689 +0.019092 0.0350694 0.0292369 +-0.0721908 0.176974 -0.0457483 +-0.0228049 0.0784515 -0.0385457 +-0.0196863 0.0539295 -0.0316066 +0.0370985 0.0632585 0.0359995 +-0.0097823 0.0613531 -0.0352263 +-0.0518485 0.147799 0.0174109 +-0.0424957 0.11253 0.0356818 +-0.00161218 0.0387745 0.0252993 +0.0432025 0.0777701 0.0272794 +0.0158912 0.0644868 0.0510299 +-0.0624956 0.0861834 0.0447184 +0.0226823 0.0605452 0.0467602 +-0.0345153 0.0780634 -0.0235017 +-0.0693572 0.156301 0.0160519 +-0.0848272 0.110715 0.0391424 +0.00397477 0.0389229 -0.0104191 +-0.0107444 0.0685007 -0.0365794 +0.0105122 0.0673666 0.0542979 +-0.0493982 0.113885 -0.0164603 +0.0292359 0.120576 0.0147663 +0.0143954 0.0433708 -0.024029 +-0.0548811 0.099887 -0.0210509 +-0.0345638 0.113971 -0.0166195 +-0.00945158 0.0346766 0.0453022 +-0.0114995 0.0486859 0.0490069 +0.047721 0.0729559 0.00883547 +0.00782583 0.131487 0.0111342 +0.018385 0.126365 0.000765748 +-0.0801977 0.117632 0.0490824 +0.0508224 0.0446928 0.0102182 +-0.0792484 0.154932 0.0111245 +-0.0616259 0.175734 -0.0596865 +-0.0554957 0.10156 0.042627 +-0.0693451 0.162383 -0.0509602 +0.0464905 0.0624784 0.0299685 +-0.0626979 0.149033 -0.0165859 +-0.027787 0.0838632 -0.0360686 +-0.068908 0.112267 -0.0105177 +-0.0464636 0.157957 0.00818306 +-0.0656199 0.0690554 -0.0100807 +-0.0594903 0.081873 0.0434438 +-0.042501 0.0803745 0.0423542 +-0.0715599 0.0733863 -0.0105456 +-0.00392373 0.129832 0.00104637 +0.0231411 0.0844685 -0.0255261 +-0.0582906 0.0411368 0.01871 +-0.0231503 0.121506 -0.00857745 +0.0353371 0.0534224 -0.00701071 +-0.028498 0.108421 0.0390601 +-0.0161996 0.0386499 0.0314325 +0.0417053 0.0943445 -0.00480688 +-0.037505 0.0874848 0.0436782 +-0.0859867 0.140484 0.00417932 +-0.0394569 0.124785 -0.00795634 +-0.0629125 0.111049 -0.0145904 +-0.0697706 0.0337438 0.00328799 +0.0353216 0.0863185 -0.0174167 +-0.0529232 0.125495 0.0357533 +-0.0145001 0.0870236 0.0569643 +-0.00422597 0.10111 -0.0231367 +0.026954 0.114984 -0.00791167 +0.0123614 0.0509077 -0.0278502 +-0.0705953 0.157132 -0.0018785 +-0.0270301 0.0604609 -0.0294673 +-0.0252429 0.163867 -0.00684922 +0.0164575 0.0900289 -0.0273543 +0.0182356 0.126981 0.00216332 +-0.0276261 0.15573 -0.00786612 +-0.0687195 0.165823 -0.0200644 +-0.0237576 0.0713185 -0.0373359 +-0.0350727 0.157773 -0.0116201 +-0.0115095 0.129073 0.00398865 +-0.000506085 0.0442149 0.046198 +0.0372544 0.109701 0.0220387 +-0.0154921 0.0382096 0.0157388 +-0.0500202 0.131989 -0.0014354 +-0.025472 0.0851651 0.0520429 +-0.0328435 0.125555 0.000439943 +-0.0773991 0.152954 0.0323974 +-0.0504161 0.144734 0.0123765 +-0.0576549 0.124438 -0.00742698 +0.0532901 0.0621073 -0.00218568 +-0.0298754 0.0748068 -0.0335581 +-0.0642433 0.0338438 0.0114826 +-0.0316113 0.0409091 -0.0301005 +0.00142887 0.0392678 -0.00936829 +0.0274179 0.122108 0.0155174 +-0.0144987 0.0884006 0.0568363 +-0.0184962 0.109943 0.0409607 +0.0379028 0.0997575 -0.00879746 +-0.0244855 0.0461464 0.0516096 +0.03717 0.0713299 0.0361376 +0.0442521 0.0804694 -0.00179963 +-0.0693598 0.153979 -0.049866 +-0.045049 0.0367204 -0.0222184 +0.0226853 0.115014 -0.0119595 +0.0308676 0.0713453 0.0410867 +-0.0253533 0.0381958 0.00468802 +0.0115087 0.101793 0.0474223 +0.0122157 0.0346138 -0.0197432 +-0.078807 0.10613 0.032485 +0.0412927 0.101424 0.0211601 +0.0449984 0.0413097 0.00725015 +-0.0614983 0.0861808 0.0447299 +0.0201601 0.0357218 -0.00467829 +-0.0270641 0.0376545 -0.0293745 +-0.0491197 0.137061 0.00540677 +-0.00249881 0.0829011 0.0575494 +0.021052 0.0358187 -0.0026817 +-0.0154895 0.0559453 0.0511175 +-0.0718433 0.0833097 0.0403454 +-0.087976 0.141871 0.0376917 +-0.0787586 0.163869 -0.0289482 +-0.0485008 0.0732772 0.0415918 +-0.0366615 0.0606699 -0.0121541 +0.0262206 0.0435744 -0.00668237 +0.000219502 0.0370979 0.0467851 +-0.00149685 0.0456811 0.047029 +-0.0545635 0.122251 -0.00910565 +-0.0186556 0.0480312 -0.0293255 +0.0387854 0.0701818 -0.0117862 +-0.0654945 0.0398115 -0.0063825 +-0.0437744 0.116579 -0.0153348 +-0.0344901 0.0987486 0.043091 +0.0610023 0.062364 0.012157 +0.0141007 0.120583 0.0346592 +-0.0823269 0.108767 -0.000607289 +0.0214843 0.092023 0.0479434 +-0.070667 0.0763937 -0.014042 +0.021114 0.0592021 0.0480036 +0.0252499 0.0775815 -0.0248688 +-0.0601377 0.0338299 0.0176745 +-0.0579501 0.0592474 0.0206872 +-0.0769058 0.154074 0.0295482 +0.0198639 0.11968 -0.0089705 +0.0022305 0.0754937 -0.0353597 +-0.00780413 0.0840976 -0.0379648 +-0.0611789 0.172541 -0.0596341 +-0.0447417 0.0768063 -0.0185987 +-0.017374 0.0569064 0.0504968 +0.00450466 0.087016 0.0568401 +-0.0709391 0.109631 0.0395791 +-0.0674006 0.0406253 -0.00334064 +-0.0311093 0.169745 -0.00652433 +0.0242906 0.0676576 -0.0247124 +-0.0326084 0.171239 -0.00339173 +-0.0325897 0.0666513 -0.0194517 +0.0319052 0.0437397 0.0295375 +-0.0450254 0.127281 -0.00449582 +-0.0226309 0.0478785 -0.0276417 +-0.0583127 0.0580812 0.00726379 +-0.037778 0.0827556 -0.0219531 +-0.0518874 0.106988 -0.0190452 +0.0163996 0.044784 -0.0236657 +0.0103374 0.0553349 -0.0300221 +0.0206753 0.126786 0.0115854 +-0.0850979 0.131233 0.0492505 +-0.0192324 0.177141 -0.0234526 +-0.0199616 0.0697296 0.0526775 +-0.0561055 0.158254 0.000206899 +-0.055732 0.115927 -0.0145408 +-0.0417663 0.162365 0.00442786 +-0.0305905 0.119479 -0.0103702 +0.0234999 0.0955508 0.0464417 +-0.0498856 0.149233 0.0119087 +-0.0154824 0.185702 -0.0219175 +0.00917376 0.125511 -0.00726227 +-0.0913426 0.147495 0.0231401 +-0.00381375 0.0896299 -0.0357356 +-0.0686943 0.154419 0.0308917 +-0.02552 0.111233 0.0379672 +-0.0705473 0.1414 0.0460484 +-0.00201946 0.100869 0.0458524 +-0.0876244 0.129442 0.00130199 +-0.00449535 0.0965559 0.0536663 +-0.0271292 0.0850573 0.0494379 +-0.0914908 0.1337 0.0152201 +0.00523694 0.126704 0.0302977 +-0.0470651 0.153179 -0.00606436 +-0.0672153 0.156284 0.0168104 +-0.0427934 0.0869807 -0.0215837 +0.0423379 0.0683118 0.0277209 +-0.0295859 0.0790353 -0.0345348 +-0.0477964 0.062891 0.036824 +-0.00968443 0.0570101 -0.0338896 +0.0451851 0.0861731 0.0211635 +0.00951284 0.0532319 0.0521285 +0.0302906 0.0787129 -0.0208549 +-0.0738862 0.104992 -0.0108534 +0.0453646 0.0575572 -0.00557548 +-0.0663103 0.0759418 0.0397029 +0.0143833 0.128699 0.00214848 +0.00580886 0.130668 0.0218239 +-0.0131274 0.0387957 -0.00624825 +-0.00997898 0.172997 -0.0279186 +-0.0620827 0.174072 -0.0556227 +-0.0546337 0.0334816 0.0119976 +0.0208676 0.121124 0.0316774 +0.0220436 0.125932 0.0163676 +0.0377227 0.0561747 0.0314909 +-0.0721609 0.147032 -0.0238695 +-0.0738111 0.0907253 -0.0150698 +-0.0362217 0.0335837 -0.0228111 +0.0387097 0.105846 2.20656e-05 +-0.0556277 0.0365615 0.0468082 +-0.0836005 0.0763298 0.006515 +0.0280677 0.100848 0.0407486 +-0.0831241 0.100626 0.0298981 +-0.0305493 0.0479587 -0.0242789 +0.0165747 0.0519808 0.0466207 +0.0447673 0.0847221 0.00118921 +-0.0146056 0.0435263 -0.0269315 +0.0273074 0.0346174 0.0112772 +-0.0683005 0.139737 0.0452157 +-0.0485925 0.132707 0.00186362 +0.00897502 0.113705 0.0394792 +0.010104 0.0343592 -0.0200136 +-0.0769339 0.126684 -0.00758482 +0.00350625 0.0547769 0.0535608 +-0.0850528 0.0993835 -0.000573805 +0.00144009 0.0350568 0.0184024 +-0.0301745 0.17266 -0.0167996 +-0.0732751 0.148715 -0.0303812 +-0.0837086 0.0952625 0.0306499 +-0.0742711 0.149885 -0.0318724 +-0.00654578 0.0384949 0.010053 +-0.0248989 0.0968475 -0.0246804 +-0.0633856 0.148243 -0.0195768 +-0.0647288 0.126998 0.0468559 +-0.058406 0.0598457 0.000248469 +0.0425358 0.0710418 0.0280089 +-0.0915343 0.140602 0.0181819 +-0.0407824 0.116214 -0.0149415 +-0.0445073 0.0491885 0.039305 +0.0294698 0.0801098 -0.0210213 +-0.0277559 0.0348695 0.0499059 +-0.0137302 0.107232 -0.0215702 +-0.0482685 0.037339 -0.0123839 +-0.0673815 0.0659915 0.0287149 +-0.0567046 0.11983 0.0390246 +0.0211901 0.113994 0.0360983 +0.0319596 0.11565 0.0257836 +-0.050462 0.0402796 0.0458238 +-0.0364752 0.09732 0.0430461 +0.00119043 0.0895238 -0.0341779 +-0.0699807 0.149351 0.039589 +0.0439472 0.0917185 0.0231564 +-0.0559199 0.113507 -0.0160179 +-0.0853556 0.095327 -0.00158429 +-0.0662723 0.154476 -0.00173975 +-0.0186027 0.111108 -0.0196906 +-0.0563562 0.140993 0.0307629 +-0.00358231 0.0383094 0.0162632 +-0.0568935 0.0562594 0.000567085 +-0.00649422 0.0590504 0.0549316 +-0.0245507 0.183147 -0.010424 +-0.032468 0.175717 -0.00291757 +-0.0132616 0.175663 -0.0275653 +0.00407218 0.0361395 0.0234015 +-0.00250245 0.104479 0.0441797 +0.00787676 0.127927 0.0283381 +-0.0760841 0.164579 -0.0198769 +-0.0814657 0.130234 0.0522094 +0.0322493 0.109934 -0.00848346 +-0.0747758 0.152715 -0.0228916 +-0.0360726 0.1261 0.0198793 +0.00651921 0.0869957 0.0564058 +-0.0863282 0.151358 0.00923307 +-0.00766666 0.0527037 -0.0328501 +0.0329828 0.110047 0.0302661 +-0.0819069 0.0844754 0.0320139 +0.020413 0.0521197 0.0451417 +-0.043267 0.149185 0.00566881 +0.03267 0.0767015 -0.0187757 +-0.0861456 0.140625 0.0415389 +-0.0665323 0.154667 0.00252946 +-0.0231566 0.158136 -0.0102789 +-0.0217907 0.0957944 0.0466571 +-0.0638349 0.156748 -0.0426051 +-0.0346441 0.117803 -0.0126135 +0.00980894 0.0658051 0.0545289 +-0.080258 0.0859229 0.0345477 +-0.0117542 0.0386862 -0.015202 +-0.080536 0.135397 0.0502642 +-0.0325368 0.0792892 -0.0295289 +-0.0784828 0.0717889 0.00251767 +-0.00149343 0.0883979 0.0566431 +-0.0137942 0.0386802 -0.0156021 +-0.0444896 0.101534 0.0420576 +-0.00192307 0.107424 -0.021877 +-0.0440699 0.153194 -0.00699527 +0.00318991 0.0880718 -0.0337792 +-0.0344943 0.0718865 0.0415833 +-0.030416 0.0692532 -0.0284548 +-0.0622359 0.167822 -0.0495929 +-0.0344858 0.100109 0.0424402 +0.00649387 0.0590149 0.0539921 +0.0360791 0.111295 0.00152105 +-0.0587368 0.0434475 0.0440841 +-0.0417025 0.0666657 -0.0153449 +-0.0533816 0.0513995 0.0117052 +-0.0285002 0.097396 0.0440561 +-0.0690491 0.153118 -0.0485047 +-0.0144923 0.093841 0.0546527 +-0.0633747 0.036885 -0.0080479 +-0.0706693 0.165215 -0.0479768 +0.0127157 0.0350729 0.0423657 +0.00853944 0.100396 0.0475311 +0.0211162 0.126093 0.00605375 +-0.0514924 0.113914 0.0348157 +0.0172187 0.117738 -0.0128881 +-0.01069 0.0969192 -0.0307004 +0.0121568 0.0930338 -0.0284961 +-0.0772387 0.158974 -0.0142914 +-0.0667905 0.0852019 -0.0183581 +0.0154254 0.0834009 0.0522607 +-0.0487147 0.0723044 -0.01565 +-0.0464696 0.0675313 0.0396048 +-0.0110203 0.0383532 0.0129011 +-0.0205151 0.114503 -0.0172551 +-0.0556769 0.0499718 0.00979142 +-0.0503626 0.0642656 0.0349674 +-0.00189958 0.130575 0.00323807 +-0.00749418 0.0533074 0.0526841 +-0.0781504 0.0736081 0.0268981 +-0.00216638 0.09997 -0.023881 +-0.0374964 0.119384 0.0304732 +-0.0237883 0.0932085 0.0487292 +-0.0846322 0.139314 0.044315 +0.00579995 0.0355749 0.0242599 +-0.0498385 0.0970763 -0.0221981 +0.0311277 0.0795524 0.0433085 +-0.080771 0.105947 -0.00458985 +-0.0541694 0.136721 0.0304424 +-0.0158788 0.038593 -0.0159367 +0.0375503 0.0588742 -0.00872526 +-0.0278572 0.0972984 -0.0239915 +-0.0609119 0.0678343 0.0355003 +0.0406749 0.0801882 -0.00878559 +-0.0891047 0.101026 0.0153901 +0.0370023 0.11146 0.00905905 +-0.00649525 0.0576581 0.0543368 +0.0215982 0.0645366 0.046975 +-0.0290293 0.160675 -0.0139931 +0.00903586 0.100133 -0.0220275 +-0.0584961 0.104303 0.041452 +-0.0664115 0.162305 -0.0579417 +0.0239006 0.0520481 0.0413924 +-0.0216874 0.126575 0.00458035 +-0.0485184 0.0438796 0.0435224 +-0.0231474 0.0384868 -0.00611954 +-0.00826521 0.0380456 0.0491273 +-0.0528526 0.147782 0.0214111 +-0.0907516 0.137857 0.0201957 +-0.0758557 0.103473 -0.0101675 +-0.0397582 0.079747 -0.0196231 +-0.0147733 0.078434 -0.0385776 +0.00381296 0.0379313 -0.0132938 +-0.0694673 0.0635361 0.0216095 +-0.0528954 0.105563 -0.0191967 +0.0343906 0.0529675 -0.00763383 +-0.0293172 0.172724 -0.00740528 +0.00850711 0.0688384 0.055257 +-0.016261 0.181575 -0.0262548 +0.0213104 0.0415776 -0.0147 +-0.0780733 0.100357 -0.00962255 +-0.0846334 0.108922 0.00436756 +-0.0186964 0.0569405 -0.033635 +-0.037924 0.175153 -0.00739726 +-0.049768 0.081217 -0.020889 +0.0335081 0.0942386 0.0398247 +-0.0729901 0.154042 -0.0338982 +-0.0233975 0.156883 -0.00572928 +-0.0873262 0.103661 0.0203534 +-0.0501055 0.129693 0.0310292 +0.029581 0.0907082 -0.0200166 +0.043329 0.066441 -0.000599376 +-0.00664168 0.0482162 -0.0304375 +0.021889 0.0963552 -0.0220144 +-0.0265893 0.161003 -0.00174275 +0.044803 0.0945847 0.0121616 +-0.0725608 0.109721 0.0409258 +-0.0372497 0.126436 -0.00264816 +0.005339 0.0971934 -0.026912 +-0.0241177 0.120704 -0.00972559 +-0.0462757 0.0390662 0.0448146 +-0.00565778 0.12946 0.000751082 +0.0213227 0.122349 -0.00385694 +-0.0414913 0.0790271 0.0430475 +0.0190905 0.127062 0.0195525 +-0.0805286 0.124537 0.0519983 +-0.0782836 0.0860139 0.0367982 +0.0219644 0.126042 0.013483 +-0.0325696 0.0410226 0.0505793 +0.0295979 0.039453 0.0274445 +-0.0475678 0.0446906 -0.0104074 +-0.0654918 0.0917539 0.043991 +-0.0307813 0.122738 0.0233033 +-0.0854845 0.112639 0.0445732 +0.0231366 0.0404268 -0.00664294 +-0.00398687 0.126095 0.0313534 +-0.0641503 0.0436305 0.0113748 +-0.0314872 0.0646167 0.0387865 +-0.0776274 0.0692865 0.00957677 +-0.0195579 0.0946763 0.0515134 +0.014517 0.0344542 -0.0117299 +-0.0376663 0.0621956 -0.0129723 +0.00459507 0.101613 0.0450146 +-0.0281642 0.0346776 -0.0203658 +0.0147654 0.125019 -0.0047274 +-0.0344283 0.0338921 0.0139586 +-0.0364985 0.117968 0.0313259 +-0.0456444 0.0592254 -0.0120696 +-0.0260288 0.0381935 0.00636573 +-0.088169 0.124336 0.0468831 +-0.0540681 0.135339 -0.00310003 +-0.0291607 0.171183 -0.0175503 +0.0104455 0.0488162 0.0487077 +-0.0881632 0.0861128 0.0124706 +-0.0258758 0.0578187 0.0391737 +0.00450037 0.0427385 0.0456181 +-0.0537204 0.0491564 0.0326591 +0.0388727 0.0645792 -0.00975725 +-0.0500679 0.0501277 0.0166633 +-0.0669104 0.120913 -0.00889891 +-0.036233 0.0469115 -0.0220883 +-0.0118859 0.163867 -0.0168515 +-0.0619905 0.129678 -0.00799355 +-0.0652279 0.0397522 0.0288372 +-0.0508809 0.104197 -0.0202021 +-0.00186382 0.104504 -0.0225214 +-0.0619023 0.120903 -0.00899386 +0.00323955 0.0754773 -0.0351385 +-0.0384934 0.105604 0.0386511 +-0.0905225 0.118622 0.0053153 +-0.0284893 0.0835322 0.0466293 +0.00823162 0.0387858 0.0309201 +-0.0616053 0.156855 -0.0285887 +-0.0508615 0.101367 -0.0215394 +-0.0318582 0.102916 -0.0222908 +0.00526525 0.0350275 0.0444668 +-0.0646344 0.0337755 0.00968147 +-0.0640121 0.136992 -0.00763419 +-0.0456074 0.0345826 0.0394197 +-0.0864043 0.111678 0.00530063 +-0.0207807 0.0581858 0.0468036 +-0.0608886 0.105445 -0.0177606 +0.0417928 0.0746499 -0.00676608 +0.0195225 0.0821843 0.0511684 +-0.0464961 0.0833304 0.0442498 +0.0164933 0.119532 0.0345952 +-0.0626731 0.158367 -0.0396045 +0.00725591 0.129807 0.000165614 +-0.0909094 0.114612 0.0400043 +-0.0496217 0.0532216 -0.00894483 +-0.0204558 0.0772045 0.0549311 +-0.0225647 0.184728 -0.0122995 +-0.0389284 0.111648 -0.0181691 +-0.0312712 0.125373 0.00251041 +-0.0157734 0.075693 -0.0388238 +0.0245364 0.0862451 0.0478999 +-0.0296756 0.125596 0.0148252 +-0.0446861 0.130064 0.0166863 +-0.0225936 0.0382891 0.00334965 +-0.0787949 0.0758277 -0.00557109 +-0.0665305 0.155586 -0.0523326 +-0.0631388 0.0620641 0.0242 +0.0275571 0.0875682 0.0452466 +-0.0838788 0.153353 0.0242347 +-0.0365497 0.124951 0.0226726 +0.0318595 0.0673315 0.0407335 +0.00950257 0.0896505 0.0545501 +-0.0597218 0.118329 0.0399103 +-0.0840037 0.0992695 0.0294026 +-0.0777723 0.0832737 0.0363717 +0.0427594 0.0986702 0.00117933 +-0.0422677 0.111306 -0.0177858 +-0.0762231 0.16043 -0.0125715 +-0.0634008 0.115527 0.0417242 +-0.036507 0.106984 0.0382357 +-0.0384749 0.0351927 -0.0135871 +-0.0744578 0.144386 -0.00789461 +0.0593202 0.0701868 0.012517 +-0.0226744 0.0522819 -0.0290541 +-0.0875766 0.122583 -0.000713178 +-0.0170034 0.127025 0.0015954 +-0.0705369 0.155342 -0.0479286 +-0.0709342 0.128224 -0.00904999 +0.00705252 0.0346309 0.0397936 +-0.0585604 0.133937 0.0364008 +-0.0863384 0.102179 0.00442425 +0.0107631 0.0671702 0.0541647 +-0.0695537 0.163673 -0.0146023 +-0.0452915 0.1298 0.0046882 +0.00836647 0.0494746 -0.0282442 +-0.0691053 0.0641529 -0.000471523 +-0.0065051 0.0518538 0.05236 +-0.0557789 0.0811944 -0.0212002 +-0.0801928 0.109885 0.0408487 +-0.0136098 0.0997657 0.0454373 +0.0375013 0.045461 0.0306904 +-0.0857877 0.152992 0.0221351 +-0.00139702 0.0346206 0.0416594 +-0.0501963 0.061364 0.033592 +0.0161097 0.0974052 -0.0230873 +-0.0194917 0.0568426 0.0483686 +0.0492985 0.0561391 -0.00508332 +0.0184753 0.100361 0.0464541 +-0.0504953 0.154968 0.0107183 +0.0147875 0.105075 -0.0193 +0.023524 0.11536 0.0341991 +0.0310013 0.118944 0.0140014 +-0.0172406 0.178621 -0.0252251 +-0.0367055 0.112873 -0.0174612 +-0.026888 0.0344315 -0.0290471 +-0.052616 0.0542078 0.012269 +-0.0374932 0.0478153 0.0397186 +-0.0727381 0.151148 -0.0398146 +0.0042421 0.0740405 -0.0347398 +-0.0170835 0.187214 -0.0216216 +-0.0744375 0.0658205 0.00791081 +-0.0225303 0.159751 -0.00283877 +-0.015413 0.0343578 -0.0194213 +0.0138178 0.034673 0.033937 +-0.0756035 0.0846721 0.0383975 +-0.0823671 0.0939609 0.0321712 +-0.0597053 0.0675469 -0.0111319 +-0.0911321 0.146088 0.0161475 +0.0350128 0.0797448 -0.0167143 +-0.0835371 0.151134 0.0310567 +-0.0125098 0.0759113 0.0569785 +-0.014877 0.12853 0.00563728 +-0.067594 0.162379 -0.0559888 +-0.0299722 0.0523401 -0.0183637 +-0.0175125 0.109971 0.0410978 +-0.0602175 0.0443014 -0.00489461 +0.047415 0.0539813 0.0314992 +-0.0695317 0.0366687 -0.00405392 +-0.0710533 0.04057 0.0057746 +-0.0594926 0.112518 0.0361699 +-0.0870454 0.128039 -0.000695727 +-0.0548606 0.0532734 -0.00439052 +0.0197584 0.121448 -0.00690816 +-0.0217284 0.0919768 0.0523353 +-0.0331407 0.073693 -0.0254949 +-0.0165233 0.0472885 0.0494939 +0.0430185 0.100102 0.00517011 +-0.0941673 0.124186 0.0242853 +0.0398988 0.106999 0.0131638 +-0.0388567 0.0985732 -0.0220835 +-0.013744 0.0347692 0.0478272 +0.0525444 0.0728335 0.00848027 +0.0340202 0.108707 0.0300072 +0.0135389 0.0341511 0.00148413 +-0.0255703 0.121939 -0.00698176 +-0.0627659 0.0795658 -0.0187488 +0.0159163 0.0366121 0.0434543 +-0.0677812 0.0823162 -0.0178553 +-0.00231448 0.129778 0.000344647 +-0.0224096 0.15809 -0.00961754 +-0.0369427 0.15804 0.00437449 +-0.0557441 0.0768187 -0.0193441 +-0.0661875 0.165349 -0.0586121 +-0.0764308 0.11585 0.051182 +0.00923994 0.0795457 -0.0327494 +-0.0141356 0.103403 -0.0235224 +-0.0725643 0.165173 -0.0170441 +-0.0708131 0.0922561 -0.0160967 +-0.052837 0.143168 0.022419 +-0.0289488 0.0487095 0.0453204 +-0.033511 0.104273 0.0404948 +0.0173468 0.0552065 -0.0282783 +-0.0643722 0.0392301 0.0399397 +0.0154605 0.100515 0.0471558 +-0.0389991 0.0361252 0.0429011 +-0.0912831 0.133698 0.0142161 +-0.042206 0.166657 -0.0103803 +-0.0829702 0.111001 0.0428895 +-0.0244677 0.122018 -0.00707965 +-0.00847955 0.107265 0.0437628 +-0.0410173 0.12678 -0.00403845 +-0.00247117 0.091392 -0.0349524 +-0.0733228 0.17276 -0.036126 +-0.0584972 0.102936 0.0420973 +-0.0275816 0.0549129 -0.0253866 +-0.0567567 0.0416998 -0.00856929 +0.00796329 0.0376774 0.0282412 +-0.0764966 0.130271 0.0529935 +-0.0385029 0.0346069 0.040918 +-0.0178242 0.0882801 -0.0380186 +-0.0592916 0.0381211 0.04617 +-0.0507734 0.0826521 -0.0214824 +-0.011501 0.0787467 0.0576654 +0.0135076 0.115425 0.0371825 +-0.0649944 0.132589 -0.00831046 +0.00449953 0.0474774 0.0501288 +-0.0183564 0.0639745 0.0512546 +-0.0454992 0.0425256 0.0437126 +0.00186325 0.0380873 -0.0138264 +0.0213321 0.100802 0.0450693 +-0.0855641 0.121149 -0.00272592 +-0.0898794 0.136494 0.0232114 +-0.0498262 0.0941747 -0.0218116 +0.0413792 0.0533854 -0.00680998 +-0.0912918 0.11477 0.0353243 +0.0585317 0.0565811 0.0212119 +0.000449556 0.130948 0.00412356 +-0.0343831 0.0766477 -0.0234928 +-0.0394659 0.108422 0.0377073 +-0.0477552 0.161949 -0.00697323 +-0.0278288 0.122593 -0.00568164 +-0.0563034 0.124125 0.0396482 +-0.0656415 0.129793 0.0454963 +0.0484031 0.0553841 0.03118 +-0.0455014 0.116621 0.0320048 +-0.0728613 0.102198 -0.0128504 +-0.0867252 0.0994863 0.00342747 +-0.00226785 0.0370021 0.0122687 +-0.0557143 0.0709328 -0.0156898 +-0.0610115 0.132585 -0.00747053 +0.00217526 0.0894962 -0.0338845 +-0.012585 0.0933765 -0.0350613 +-0.0553875 0.143884 0.0305002 +-0.0920989 0.117453 0.031314 +-0.0616144 0.155309 -0.0245851 +0.0502575 0.0602229 -0.00418894 +-0.0735402 0.0708078 0.0302704 +0.00614005 0.103026 -0.0213684 +-0.00271026 0.0669475 -0.0345168 +-0.049518 0.0344739 0.029929 +-0.0525731 0.128311 0.0345149 +-0.0605331 0.151186 -0.000375192 +-0.0866695 0.135213 0.0450386 +-0.0515626 0.0460585 0.0186779 +-0.00891802 0.0982381 -0.0280905 +-0.0170028 0.0977503 -0.0256286 +-0.0541413 0.128093 -0.005327 +-0.0234618 0.0385102 -0.00806272 +-0.0234875 0.125296 0.0010065 +0.0238248 0.0404881 0.03829 +-0.0564079 0.0334582 -0.0027528 +-0.0667678 0.0695012 0.0345692 +-0.00845839 0.0346349 0.045549 +-0.0748544 0.15611 0.0141114 +-0.0718277 0.141507 -0.00801564 +-0.0263582 0.120444 -0.00943021 +-0.0384861 0.0847024 0.0437961 +0.0154742 0.126309 -0.00212525 +-0.0329093 0.0461288 0.0451027 +-0.00179731 0.0390446 -0.00419837 +-0.0830843 0.0843065 -0.0045636 +-0.00849798 0.051815 0.0518583 +0.0211703 0.0458979 -0.0197309 +0.0250466 0.0534973 0.0413033 +-0.00301309 0.0994095 -0.0252863 +-0.0286636 0.0662687 -0.0294695 +-0.0275164 0.0588544 0.0372755 +0.021248 0.0707121 -0.0275992 +0.0118973 0.0699023 0.0540919 +-0.0850671 0.0831487 0.00248224 +0.0112963 0.123527 -0.00913288 +-0.0471043 0.0355495 0.00808039 +-0.0305886 0.0341169 0.0127308 +0.0232695 0.0795597 0.0495474 +-0.0781795 0.165241 -0.0349583 +-0.00548333 0.122374 0.0356916 +0.02636 0.0531741 -0.0208871 +-0.0117787 0.0784571 -0.0380559 +-0.0374622 0.0945463 0.043653 +0.0298506 0.0915959 0.0433109 +-0.063716 0.150986 -0.0306408 +-0.0915859 0.128175 0.00825933 +0.0456498 0.0806034 0.02116 +-0.0483119 0.0614742 0.035964 +0.0375235 0.0968947 -0.00979522 +-0.0923144 0.132364 0.0182222 +0.0175115 0.118187 0.0352964 +-0.027798 0.0824702 -0.0362167 +-0.0679219 0.123838 -0.00890383 +-0.0136906 0.0585033 -0.0353384 +-0.0560167 0.0334996 0.00451355 +-0.00170896 0.0655406 -0.0343993 +-0.0134843 0.053101 0.0504987 +-0.0675811 0.143978 0.0427672 +-0.0395371 0.165252 0.00310729 +-0.00177026 0.0987839 -0.0266092 +0.0449905 0.0917771 0.0161555 +-0.0142754 0.0385008 0.0265607 +-0.024936 0.0546494 -0.0284077 +-0.0737754 0.0849525 -0.0153987 +-0.00225491 0.0393816 0.0354457 +0.00953649 0.101759 0.0470503 +-0.030493 0.0731979 0.0402297 +0.0418277 0.0395362 0.0134182 +-0.0622707 0.058834 0.014793 +-0.0042883 0.0999626 -0.0238822 +-0.0511241 0.157581 -0.00475152 +-0.0110467 0.0382737 0.0183997 +-0.0111844 0.110115 -0.0206413 +-0.0906536 0.150215 0.0201223 +-0.0636975 0.0593607 0.0104272 +-0.00965605 0.0527028 -0.0331963 +0.011809 0.0846857 0.0540696 +-0.0439904 0.115156 -0.0158426 +0.00534103 0.0581999 -0.0308279 +-0.00449084 0.119679 0.0378771 +0.00251006 0.102973 0.0437486 +-0.0256326 0.0383152 0.00270994 +0.0101829 0.0893384 -0.0312282 +0.0359735 0.108741 0.0274101 +0.000505152 0.0675448 0.0563482 +-0.0431097 0.0335646 0.0052718 +-0.0748156 0.16245 -0.0339456 +-0.0890383 0.09964 0.0104144 +0.0425362 0.0972508 -0.000830625 +-0.0136711 0.162609 -0.0156561 +0.0241599 0.0418198 -0.00678118 +-0.0181519 0.16827 -0.0202389 +-0.0404977 0.0986657 0.0417206 +-0.0809707 0.15134 0.0022444 +0.0151979 0.0420601 0.0445385 +-0.00221102 0.0959857 -0.0316631 +-0.0329609 0.0709036 -0.0224656 +-0.079699 0.101798 -0.00757602 +-0.0725189 0.144585 -0.0159026 +-0.0466234 0.165492 -0.0068396 +0.0185106 0.12405 -0.00369129 +-0.014344 0.183095 -0.0226028 +-0.0788576 0.105851 -0.00657974 +-0.0240104 0.109837 -0.0203148 +0.00980942 0.110782 -0.0193656 +0.0108601 0.117776 0.0369396 +0.0193075 0.0536075 0.0470681 +-0.0925525 0.131032 0.0242364 +0.00749212 0.131495 0.0152913 +0.00495998 0.131626 0.0157979 +-0.00415159 0.0385426 0.00685716 +-0.0241881 0.038442 -0.0062907 +-0.0114972 0.0870124 0.0568248 +0.0383205 0.0589284 -0.00670105 +-0.050793 0.124044 0.0335488 +0.0216558 0.0436146 0.0415846 +-0.0488766 0.0663121 0.037594 +-0.0460367 0.115268 -0.015925 +0.0354061 0.0981387 0.0355669 +-0.0414966 0.064844 0.0412967 +-0.0492702 0.0334521 0.00412227 +-0.0788564 0.173596 -0.0449928 +-0.0720001 0.0374977 0.00101403 +-0.0745188 0.135846 0.0503978 +-0.0705133 0.0930254 0.0420143 +0.0544062 0.0520207 0.00120422 +-0.016347 0.159993 -0.0102438 +0.00949781 0.0440631 0.0448456 +-0.0123976 0.0991026 0.0482068 +-0.00535711 0.0347531 0.0461025 +0.026456 0.0929171 0.0454329 +0.0245089 0.042142 0.038636 +0.043716 0.0750115 0.0261739 +-0.0839359 0.102045 -0.00261805 +-0.0806754 0.155074 0.0150117 +-0.0689 0.172262 -0.0550342 +-0.0523543 0.073291 0.0414729 +-0.0301406 0.0636155 -0.0234264 +0.0407753 0.0452541 0.0299878 +0.00638455 0.0464233 -0.0264515 +-0.0755977 0.151334 -0.0218791 +-0.00594273 0.0383379 0.0139478 +-0.0600908 0.115373 0.0375616 +-0.0424965 0.0733822 0.0425454 +-0.00260003 0.0405608 -0.0253579 +0.00350637 0.0702767 0.0558823 +-0.0897267 0.135137 0.0262095 +-0.0591547 0.117476 -0.0120923 +-0.024542 0.0428919 0.0537128 +-0.0054972 0.0576157 0.054162 +-0.0397846 0.0841362 -0.0215764 +0.0415613 0.0751972 0.0301802 +-0.0631728 0.0596464 0.0174802 +0.0423363 0.101455 0.00317956 +-0.0533301 0.1416 0.0264013 +-0.0464855 0.0931347 0.0435353 +-0.0629725 0.150532 -0.00369044 +-0.0853889 0.108959 0.00634578 +-0.0909761 0.118636 0.00631645 +-0.0384966 0.101445 0.0410637 +0.0194941 0.107309 0.0406484 +0.0396169 0.0843072 -0.0127653 +-0.0223745 0.0566587 0.0441983 +0.0607493 0.059571 0.0121639 +-0.0844811 0.123027 0.0489478 +-0.0570341 0.144219 -0.00185162 +-0.0723674 0.177806 -0.0472523 +-0.0466801 0.130916 0.0233152 +-0.02246 0.183226 -0.0115124 +-0.0707386 0.165621 -0.0179174 +-0.0739884 0.1541 -0.0249038 +0.00161401 0.13159 0.0117114 +0.0295344 0.0524338 -0.0167463 +0.00137166 0.0465972 -0.0284573 +-0.0349979 0.152158 8.20736e-05 +-0.0459591 0.0424584 -0.0122548 +0.032247 0.0800194 -0.0194064 +-0.0215329 0.0768164 0.0540336 +0.0182351 0.12763 0.00640475 +0.0169629 0.0348939 0.0289563 +0.0193977 0.0490363 -0.0230642 +-0.0596322 0.0604401 0.0228281 +0.0145003 0.108488 0.0407955 +-0.0720741 0.0646161 0.00403373 +-0.0712116 0.15818 -0.0429219 +-0.0175993 0.15966 -0.00802789 +-0.0759222 0.159085 -0.0100036 +-0.0384682 0.15361 0.00387723 +-0.0725333 0.0379686 0.00575754 +0.0455601 0.0904134 0.011166 +0.0375907 0.0937201 -0.0111657 +0.00483671 0.039382 0.0314929 +-0.026559 0.0377408 0.0211248 +0.0385027 0.0454964 0.0307784 +-0.0564952 0.047766 0.0395183 +-0.0198831 0.107284 -0.0222237 +-0.0779551 0.163899 -0.0249456 +-0.0563521 0.0342791 0.0304121 +-0.00751948 0.0746046 0.0579524 +-0.0827498 0.154172 0.0128373 +-0.00710449 0.125174 0.0317411 +-0.0367613 0.0798086 -0.0204262 +-0.036915 0.175546 -0.00898243 +-0.0705043 0.0887655 0.0418556 +-0.0522651 0.0335597 0.0034159 +-0.0677174 0.0409231 -0.00173026 +-0.0113677 0.180126 -0.0253581 +-0.0161521 0.03911 0.0518105 +-0.0690092 0.122845 0.052951 +0.00570986 0.0341754 0.0182505 +0.0184933 0.0865452 0.0498488 +6.3531e-05 0.129314 -0.00119744 +-0.0804587 0.135827 0.0500319 +-0.0754196 0.111293 0.0461553 +0.0424555 0.0902012 0.0271644 +-0.0928081 0.120209 0.0412843 +-0.0634884 0.0789934 0.0424288 +-0.0615251 0.0457206 0.0316818 +-0.0115387 0.0458293 0.048671 +-0.066289 0.0747237 0.0389788 +-0.0173046 0.166847 -0.0129407 +0.0331853 0.116604 0.00769666 +0.0445518 0.069148 0.0246508 +-0.091691 0.12831 0.0342454 +0.0434619 0.0930961 0.0241585 +-0.0678925 0.0435809 0.00801004 +0.0234224 0.0519071 -0.0231048 +-0.0208141 0.0595795 0.0467936 +-0.087519 0.112 0.0410625 +-0.0213082 0.126358 0.00326486 +-0.0606822 0.0362429 0.0450162 +-0.0576914 0.0693962 -0.0144511 +-0.0769716 0.13837 -0.00578148 +-0.0653565 0.1551 0.00564588 +0.0264433 0.0485879 -0.0182655 +0.039746 0.101828 -0.00373788 +-0.0610724 0.144529 -0.00434459 +-0.0662237 0.145026 -0.0176812 +-0.0283728 0.156641 -0.000811787 +-0.00971651 0.0348541 0.0433186 +-0.00481466 0.0868424 -0.0368113 +-0.031088 0.0335574 -0.0273919 +-0.0544366 0.120435 -0.011246 +0.00248882 0.121002 0.0363406 +-0.00349433 0.0911707 0.0563818 +-0.0931447 0.118854 0.0382959 +0.0254683 0.121415 0.0262007 +-0.0467966 0.0336683 0.000813328 +0.0319522 0.103353 -0.0134365 +-0.0633409 0.155276 -0.011594 +-0.0720139 0.180999 -0.0528377 +-0.0164541 0.0630817 0.0527623 +0.016475 0.0352036 0.002978 +-0.00226088 0.124171 0.0334893 +0.0391263 0.0631992 -0.00875738 +-0.0818614 0.114723 -0.0022038 +-0.0930555 0.120208 0.0402916 +-0.0904236 0.116034 0.0273085 +-0.0705028 0.159578 -0.0459334 +-0.0862816 0.117641 0.0480424 +0.0531688 0.0733724 0.0176223 +-0.0578751 0.134121 -0.00585274 +0.0423147 0.091604 0.0271557 +0.0101515 0.071231 0.055077 +-0.0435318 0.087421 0.0430041 +-0.0560394 0.131064 -0.00575471 +0.00125071 0.0712122 -0.0347068 +-0.0348542 0.165303 -0.00316457 +-0.0860328 0.0912972 0.00145067 +-0.00116523 0.0371346 0.0178171 +-0.0637756 0.0795327 -0.0183843 +0.00482779 0.0366504 -0.0137865 +0.0435599 0.0987371 0.0131605 +0.00150087 0.101618 0.0443156 +0.0314312 0.0625198 -0.0186445 +-0.0672777 0.169987 -0.0338702 +-0.0903951 0.118903 0.0450094 +-0.0501563 0.11976 0.0326732 +-0.0750921 0.156856 -0.022942 +-0.0275197 0.109846 0.0382427 +-0.0535612 0.0416919 -0.00977582 +0.0556505 0.0677792 0.00213147 +-0.0685182 0.0368214 -0.0053939 +-0.0780099 0.114072 0.0486721 +-0.0248787 0.0796614 0.0530244 +-0.0638477 0.164736 -0.0283363 +0.0142201 0.0793919 -0.0305544 +0.00713749 0.130032 0.0237524 +-0.0187348 0.175696 -0.0167204 +-0.00682337 0.088234 -0.0365489 +-0.0217663 0.11209 -0.0186927 +-0.0171714 0.0432613 0.0521182 +0.00513012 0.0373402 0.0458408 +0.0461568 0.0626078 -0.00274862 +-0.0412659 0.160879 0.0033623 +-0.0853172 0.110382 0.0233555 +-0.0158006 0.108342 -0.0207487 +0.00813236 0.110171 -0.0197068 +0.0265802 0.0345508 0.0130494 +-0.0660018 0.133981 0.0432166 +0.041807 0.0885902 0.0288907 +-0.024509 0.109889 0.0396002 +0.0354948 0.10491 -0.00909103 +-0.00850916 0.0688709 0.0557558 +-0.054442 0.0373135 0.0469328 +-0.010539 0.0390893 0.0340058 +-0.0858022 0.150106 0.00719342 +-0.0451719 0.0347129 0.0411467 +-0.00510128 0.0385919 0.0229448 +-0.0521978 0.0336397 0.008764 +-0.0162925 0.180099 -0.0261659 +-0.0902934 0.147439 0.0121579 +-0.0793826 0.0705862 0.00854889 +0.0209269 0.0658956 0.0477693 +-0.0116051 0.171103 -0.0260001 +-0.0635102 0.151152 0.0361873 +-0.0865918 0.127084 0.0480364 +-0.0756208 0.166729 -0.0233779 +-0.0507818 0.0840955 -0.0217037 +-0.0623945 0.164686 -0.0405941 +0.0109143 0.034258 -0.00287102 +-0.0326136 0.0384639 -0.0154224 +-0.0883155 0.139178 0.0394996 +-0.0317158 0.0383538 -0.00403424 +-0.00682874 0.0896331 -0.0361816 +-0.060744 0.0766988 -0.0182193 +-0.00743574 0.129906 0.00405669 +-0.0792494 0.0723341 0.0207326 +-0.036173 0.152719 -0.00677506 +-0.0305128 0.10708 0.0396423 +-0.0435905 0.0505542 -0.0107756 +-0.0204554 0.0347978 0.0481157 +-0.0591045 0.0344689 0.0400978 +-0.0840365 0.147342 0.0364323 +0.00340018 0.0348289 -0.0229504 +-0.0693319 0.141141 0.045512 +-0.0561609 0.0344771 0.0355158 +0.00119588 0.0881146 -0.0344258 +0.0583564 0.0538008 0.0181861 +0.0342539 0.0387023 0.0236157 +-0.0264982 0.125984 0.010106 +-0.0611832 0.146298 -0.00395593 +-0.0910251 0.124245 0.0440568 +-0.089862 0.115281 0.0432597 +0.0247433 0.124313 0.0130924 +-0.000820873 0.128641 -0.00248283 +-0.0554557 0.0533368 -0.00338183 +-0.0464641 0.122081 0.0270508 +-0.0451868 0.126658 0.0224837 +0.00145793 0.0977369 0.0519067 +0.0405445 0.0610221 0.0298369 +-0.0744952 0.0941746 0.0398302 +-0.0351234 0.033632 -0.0282515 +-0.0839267 0.145982 0.00417548 +-0.0224934 0.0435545 0.0535652 +0.0159352 0.127804 0.0226817 +-0.0572144 0.154757 0.0232881 +-0.0498753 0.0336124 0.000239655 +-0.0191672 0.0596981 0.049368 +-0.0242921 0.0918773 0.0492675 +-0.0523718 0.133555 -0.00317026 +-0.0557218 0.0723836 -0.0166307 +-0.00457986 0.0361758 -0.0248798 +-0.0737533 0.0901294 0.040627 +-0.00549531 0.10728 0.0439307 +-0.0181568 0.165005 -0.0179156 +-0.0554997 0.108443 0.0389722 +-0.0144882 0.101623 0.0437286 +0.0215585 0.0387445 -0.00669407 +-0.0752039 0.0696978 0.0256249 +-0.0569183 0.115707 -0.0143002 +-0.0731283 0.155734 0.00889607 +0.0347498 0.081125 -0.0176886 +0.00113903 0.131571 0.0129682 +-0.0279379 0.155215 -0.0039665 +0.0438288 0.0860483 -0.00379124 +-0.0202818 0.0386671 -0.01315 +-0.0639713 0.0651159 0.0301523 +-0.0729034 0.123797 -0.00826534 +-0.00948854 0.0965445 0.0534324 +-0.0616146 0.158432 -0.0255892 +0.0348698 0.112104 0.0254475 +0.0462561 0.0792459 0.0151754 +0.0132092 0.0348336 0.0300558 +-0.0650018 0.0435996 0.0108034 +-0.0629926 0.156114 0.0183129 +0.0432806 0.100121 0.0101615 +-0.0634166 0.118511 0.0453283 +-0.0718747 0.151003 0.0373736 +-0.0693203 0.155248 -0.0509683 +-0.058528 0.0400924 -0.008802 +0.0150592 0.0590177 0.0497649 +-0.0136861 0.0570325 -0.0345667 +-0.02332 0.0391695 0.0384733 +0.0410592 0.0985428 -0.00379645 +-0.042915 0.0436274 -0.0183221 +-0.0324875 0.068969 0.0402984 +-0.0927384 0.122733 0.00927055 +-0.0697859 0.156365 0.01735 +-0.0525617 0.0403541 -0.0109145 +-0.0163792 0.186908 -0.0208435 +0.00555045 0.034504 0.00513967 +0.0259201 0.0406241 0.0333279 +0.0340795 0.103399 0.0336714 +-0.0295185 0.0579228 -0.0214101 +0.0443631 0.0475049 -0.00446946 +0.00261537 0.0341134 0.0122343 +-0.0104909 0.104437 0.0435533 +0.0240885 0.124582 0.018553 +-0.084606 0.0993653 -0.00159598 +0.0315994 0.0505647 0.0349136 +-0.0887091 0.0983318 0.0213821 +-0.0109917 0.177231 -0.0295208 +-0.00927372 0.0384768 0.00588152 +-0.0731505 0.0794744 -0.0135813 +0.0377774 0.0672774 -0.012792 +-0.0257539 0.157476 -0.0102144 +-0.0524923 0.0340498 0.0261507 +0.0359032 0.0905437 -0.0158269 +-0.0358241 0.0900699 -0.0240653 +-0.0507764 0.0715485 0.0397729 +-0.0857724 0.0872268 -0.000524277 +0.0122145 0.0850407 -0.0307351 +-0.0818191 0.154205 0.0234297 +0.0239009 0.12202 -0.0014718 +0.0509663 0.0446851 0.0122122 +0.0405026 0.0469928 0.0315524 +0.00123226 0.0769082 -0.0355253 +0.0395203 0.0569025 0.0311403 +-0.0861982 0.144641 0.0372484 +-0.0218898 0.0382146 0.0234539 +0.0278568 0.0643129 -0.0209613 +-0.06664 0.0601639 0.0127094 +-0.0682452 0.17678 -0.058273 +-0.0326534 0.0578275 -0.0120318 +0.0449519 0.0847263 0.00223902 +-0.0243874 0.0379977 0.0213348 +-0.0375049 0.0648832 0.0416292 +-0.049486 0.0531643 0.034537 +-0.00680823 0.0840973 -0.0379387 +-0.00662043 0.0383357 0.0156226 +0.0246827 0.0347978 0.0179097 +0.052528 0.0664738 0.0271694 +-0.017323 0.112508 -0.01916 +-0.0589359 0.0481542 0.00467247 +0.0560814 0.0704234 0.0216351 +0.0445162 0.087501 -0.00181141 +0.0204668 0.0400207 -0.013702 +-0.0828557 0.0979824 0.0311146 +0.0393677 0.0547517 -0.00623241 +-0.0301563 0.0382285 0.0524978 +-0.0740972 0.155492 -0.0239137 +-0.0266047 0.0397022 -0.0293069 +0.0044664 0.0344032 0.010526 +-0.0644057 0.16752 -0.0356951 +-0.085796 0.123875 -0.00272102 +-0.0251727 0.175641 -0.0195733 +-0.0147266 0.0922559 -0.0359307 +0.0166529 0.120978 0.0330533 +-0.0652865 0.1555 -0.0467797 +-0.0622893 0.15065 -0.0135783 +-0.0173344 0.128368 0.0119773 +-0.044366 0.0366412 -0.0232589 +-0.0913152 0.114759 0.0363194 +-0.0647364 0.118589 0.0486106 +0.011956 0.0976358 -0.0233787 +-0.0378922 0.04725 -0.0183117 +-0.079848 0.116269 0.0487575 +0.0431642 0.0987038 0.0171581 +-0.0334777 0.0546734 0.0376709 +-0.0677151 0.171772 -0.0397619 +-0.0124935 0.123722 0.0323282 +-0.00945147 0.0352364 0.0483453 +-0.0729035 0.125275 -0.00849683 +-0.0837744 0.107497 0.00138169 +-0.0529962 0.0461208 0.0157076 +-0.0677529 0.141137 0.0442717 +-0.0840303 0.151908 0.0287412 +-0.0636039 0.0445634 0.0326846 +0.0192911 0.109605 -0.016128 +-0.0838969 0.104764 -0.000610535 +-0.0887185 0.143427 0.0331607 +-0.0929968 0.130998 0.0182299 +-0.0543463 0.160987 0.00512087 +-0.0909281 0.132287 0.0082314 +-0.0354987 0.113848 0.0338946 +-0.0465077 0.088954 0.0443573 +0.0301352 0.0955658 0.0419698 +-0.0199202 0.0381456 0.0185107 +-0.0186134 0.161522 -0.0143726 +-0.0646921 0.0617226 0.0224003 +0.0222832 0.066418 -0.0268569 +-0.0661617 0.0353568 0.0288449 +0.0192795 0.122165 0.0310901 +-0.00560235 0.0406015 -0.0258376 +-0.0404738 0.108409 0.038128 +0.0420248 0.0710795 0.0289899 +0.0450277 0.0945898 0.0071675 +-0.0490784 0.153156 -0.00527602 +-0.00149713 0.0689596 0.0566805 +-0.0709057 0.106531 -0.0119068 +-0.0626824 0.0436041 -0.00418427 +-0.066536 0.166455 -0.0250024 +-0.0218698 0.104438 -0.0229686 +-0.0731886 0.149857 -0.036868 +-0.0122347 0.0392642 0.0504717 +-0.0935435 0.118764 0.0233045 +-0.0797382 0.10948 0.0394939 +-0.0892801 0.091541 0.0104497 +-0.0547119 0.146209 0.0284156 +-0.00241231 0.037367 0.0100902 +0.000818555 0.130756 0.00282721 +0.04586 0.0820013 0.00419826 +-0.0250963 0.0348756 0.0487637 +-0.0673565 0.112647 0.0446949 +-0.0634506 0.15272 2.24523e-05 +-0.0706828 0.180611 -0.0569213 +-0.0205931 0.163965 -0.00888333 +0.0115331 0.101889 -0.0218781 +-0.0664983 0.102849 0.0407048 +0.0185027 0.118159 0.035136 +0.0458454 0.0834099 0.00517797 +-0.00887527 0.109466 -0.0219533 +-0.0858669 0.119072 -0.00140229 +-0.0102872 0.0344076 -0.0184603 +-0.0211482 0.169745 -0.0200914 +-0.00849115 0.111421 0.0423213 +-0.0613599 0.128292 0.04114 +-0.0076798 0.0569676 -0.0334142 +-0.0710297 0.16381 -0.0459687 +-0.0454992 0.112558 0.0357052 +-0.0343115 0.126654 0.00282732 +0.0360267 0.110062 0.0258818 +0.0368044 0.0942002 -0.0116901 +-0.0421812 0.123012 0.0251172 +-0.066012 0.139954 -0.00779963 +0.00198723 0.123051 -0.0105036 +0.0172553 0.072257 -0.0294021 +-0.013113 0.184484 -0.0260544 +-0.072893 0.152634 -0.0368963 +-0.0938278 0.128299 0.0222532 +-0.0675171 0.0409229 0.0105489 +-0.0735479 0.162209 -0.012171 +-0.0517008 0.0626767 0.0322349 +-0.0433082 0.037957 -0.0253239 +-0.0516781 0.0345962 0.0381142 +-0.0046354 0.0467251 -0.0296701 +-0.0777504 0.112676 -0.00382147 +-0.0281162 0.181397 -0.0109687 +-0.047699 0.144615 0.00435323 +-0.0663959 0.148276 0.0393784 +-0.0249816 0.15956 -0.0126947 +-0.00758477 0.0968518 -0.0305822 +-0.019536 0.116371 -0.0152209 +-0.0298632 0.102958 -0.0228236 +-0.0224181 0.05387 0.0440179 +-0.0625128 0.145366 0.0377954 +-0.0843383 0.133967 0.0484219 +-0.00452146 0.0443187 0.0472734 +0.000177098 0.0839833 -0.0361114 +0.0207016 0.113271 -0.0140876 +-0.065484 0.0847424 0.0442074 +-0.0201913 0.175663 -0.0226485 +-0.0364476 0.166788 -0.00019754 +-0.0206091 0.162049 -0.0149623 +0.0350254 0.0700182 0.0383083 +-0.0455491 0.131451 0.0178282 +0.00819795 0.130005 0.00128654 +-0.0353536 0.12061 0.029103 +-0.0271732 0.169704 -0.0183584 +-0.0657382 0.0436129 0.0101245 +-0.0722291 0.166627 -0.044985 +0.0309191 0.0539829 -0.0147501 +-0.0308747 0.056662 -0.0163864 +-0.0867734 0.123909 -0.00174219 +-0.0279078 0.0347965 0.0447705 +0.0191594 0.100268 -0.0222959 +-0.0154293 0.0382918 0.0211029 +-0.0578159 0.0636603 0.0309898 +-0.024177 0.172689 -0.0201134 +-0.0669849 0.0359436 0.0326963 +-0.0879792 0.086094 0.00648058 +-0.0181742 0.169737 -0.0210312 +-0.0170499 0.122405 0.0312344 +0.00906582 0.123154 0.0343752 +-0.034503 0.0874637 0.0428605 +0.0391693 0.108394 0.0111647 +-0.0917004 0.143358 0.0201656 +0.027747 0.0902677 -0.021551 +0.0430843 0.0496743 0.0322331 +-0.0791989 0.150078 -0.000876106 +-0.0259631 0.177171 -0.00957335 +-0.0395279 0.079033 0.0429651 +0.0302372 0.118499 0.00231637 +0.0449793 0.061326 -0.0034541 +-0.0376334 0.0548474 -0.0107543 +-0.0274342 0.111364 -0.0178958 +-0.0315627 0.048073 -0.0232988 +-0.018823 0.121694 -0.0088173 +0.00895989 0.0979651 -0.0237371 +-0.0254423 0.0473682 0.0503166 +-0.046654 0.0606571 -0.0123502 +0.0606526 0.0595573 0.0131644 +-0.0873547 0.094105 0.00537923 +-0.0202891 0.184471 -0.0210772 +-0.093713 0.126863 0.0152623 +0.00938205 0.0449001 -0.0251557 +-0.0903092 0.140666 0.025165 +-0.0676501 0.0667159 0.0297862 +-0.0164899 0.0602176 0.0520938 +0.019355 0.0565693 -0.0275356 +0.0104604 0.0340987 0.00091581 +-0.0785409 0.166665 -0.0309637 +-0.018017 0.0390618 0.0526069 +0.0189962 0.123953 0.0281041 +-0.0814357 0.0734392 0.00553468 +-0.0223732 0.03801 0.0163235 +0.0110271 0.112101 -0.0187639 +0.0456518 0.0904151 0.00617296 +-0.0789509 0.170805 -0.0389931 +-0.0312407 0.0510927 0.0390643 +0.0359235 0.106756 -0.00582268 +-0.0815808 0.0950721 -0.00753639 +-0.0849546 0.0871617 -0.00253673 +-0.0265403 0.0592021 0.0383808 +0.0398305 0.0739567 0.0329917 +-0.00085919 0.0358547 0.00813469 +-0.0747624 0.0700921 -0.00148683 +0.0313786 0.113275 -0.00606229 +-0.0902327 0.124018 0.00527185 +0.0268091 0.0506065 0.038521 +-0.0727909 0.0685075 0.0271607 +-0.0578274 0.0666818 0.0354001 +-0.0738208 0.0921589 -0.0148323 +-0.0390631 0.127858 0.0143467 +-0.00922314 0.174168 -0.0285672 +-0.0035205 0.039017 -0.00265492 +0.0435098 0.098719 0.0141568 +-0.0493916 0.144765 0.00938332 +0.0189816 0.0563976 0.0484166 +-0.0731928 0.064943 0.0125198 +0.0453289 0.0833826 0.0211694 +-0.0211162 0.1638 -0.0163957 +-0.0306102 0.125527 0.00421635 +-0.0262987 0.113585 -0.0162365 +0.0252163 0.1238 0.0175509 +-0.0237403 0.0669252 -0.0352956 +-0.00549562 0.0472961 0.0485942 +0.0045023 0.122399 0.0348631 +-0.0701614 0.178224 -0.0493215 +-0.0173769 0.125333 -0.00267782 +-0.0470115 0.129603 0.00120357 +-0.0317094 0.0374952 0.0310681 +-0.0297217 0.0382812 -0.0035606 +-0.0415986 0.169934 0.00129157 +-0.064505 0.152553 -0.0362048 +-0.0667255 0.178008 -0.0524224 +-0.0236086 0.0335974 -0.0240827 +-0.0156885 0.0555599 -0.0339026 +0.0182783 0.0708328 -0.0291795 +0.0541184 0.0510309 0.0235647 +-0.0765193 0.119025 0.0524244 +-0.0118673 0.0339713 -0.0202424 +0.00548892 0.118228 0.0378342 +-0.067477 0.0336926 -0.00520632 +0.0168316 0.0926978 0.0490711 +0.0255432 0.0768418 0.0475089 +-0.0617634 0.0795901 -0.0189973 +-0.0156786 0.0526029 -0.032522 +0.000420458 0.036172 -0.0244623 +-0.0256593 0.0810401 0.0523557 +0.026836 0.0634537 -0.0220606 +-0.0621975 0.166246 -0.0505873 +0.0578529 0.0523616 0.0171842 +-0.0217254 0.126122 0.00269746 +0.0235742 0.124212 0.0226421 +-0.0578055 0.0883401 -0.0213124 +-0.0798409 0.103395 0.0321858 +-0.0123464 0.178658 -0.023274 +0.0212154 0.0476501 0.0409677 +-0.0342487 0.0752311 -0.0224883 +-0.0230529 0.0839079 0.0553134 +-0.0214993 0.112665 0.0388138 +-0.0327955 0.0873016 -0.0254019 +0.0258836 0.0605349 0.0443599 +-0.0096598 0.0907753 -0.0363722 +0.0450284 0.0875565 0.0211548 +0.0334239 0.0414863 -0.00351395 +-0.0488087 0.138617 0.0133952 +-0.0658054 0.0924099 -0.017991 +0.0104979 0.0896334 0.054299 +-0.0043048 0.123153 -0.010566 +-0.0174665 0.17272 -0.016673 +-0.0344763 0.0561322 0.0383021 +-0.0857072 0.152777 0.0118249 +-0.0575671 0.0494422 0.00671449 +-0.0430533 0.0345113 0.0330204 +-0.065164 0.147357 -0.0239331 +-0.0326268 0.0520227 -0.0107626 +-0.067905 0.106631 -0.013438 +-0.0258738 0.125824 0.0147443 +0.0544233 0.0635568 0.0276516 +-0.0872747 0.139127 0.00719289 +-0.0315055 0.109789 0.0377033 +-0.0763386 0.161799 -0.0152953 +0.0232414 0.0663429 -0.0257954 +0.0174948 0.109841 0.0394103 +-0.0507289 0.129704 0.0318965 +-0.0425042 0.0577064 0.0400486 +0.022545 0.0955327 0.0468247 +0.0403951 0.0475373 -0.00531603 +0.0183271 0.0475932 -0.02269 +-0.0572639 0.0601869 -0.00219809 +-0.0852337 0.104506 0.0248257 +-0.0933098 0.126856 0.0132534 +0.0352918 0.108619 -0.00504659 +-0.0628349 0.0939281 -0.0188357 +0.00277101 0.099815 0.0475918 +-0.0637196 0.147938 -0.020833 +-0.0636347 0.156368 -0.0124044 +-0.0882602 0.111934 0.0373837 +0.0451564 0.0931924 0.00517592 +-0.0883906 0.0874807 0.0144622 +-0.0179879 0.0654395 0.0522544 +-0.0334338 0.0382234 0.0500909 +-0.00283875 0.0389996 -0.00436591 +-0.0295052 0.11528 0.03366 +-0.00151332 0.104469 0.0441334 +0.0194927 0.0906432 0.0481529 +-0.0877693 0.113692 0.0289151 +-0.0661933 0.0335338 -0.00299624 +-0.0273899 0.0499801 0.045145 +-0.0338474 0.0972112 -0.023083 +-0.075849 0.149415 0.0390624 +0.0325609 0.114759 0.0260072 +-0.0821806 0.0776422 0.0235195 +-0.0759474 0.151351 -0.0188826 +0.013384 0.043414 -0.024368 +-0.0077421 0.0340597 -0.0195129 +-0.00965525 0.0511768 -0.0320162 +-0.0677487 0.111258 0.0407689 +-0.0214969 0.0461967 0.0522939 +-0.0466073 0.0518764 -0.00969859 +0.0357625 0.0364791 0.0131618 +-0.0124847 0.111379 0.041672 +-0.079194 0.0832222 0.0349745 +-0.0926331 0.130966 0.0142325 +0.00419789 0.123154 -0.0106599 +0.00969178 0.121836 0.0352946 +-0.0295306 0.123946 -0.00125424 +-0.0711733 0.128436 0.0516087 +-0.0585141 0.0386878 -0.00928985 +-0.0739244 0.0668664 0.00165643 +-0.0424856 0.0410553 0.0431368 +-0.0176939 0.162435 -0.0154936 +-0.00215916 0.0369163 -0.0154166 +0.0205271 0.126116 0.00440152 +0.000359464 0.0907103 -0.0342066 +0.038908 0.0631632 0.033303 +0.0223132 0.124739 0.023599 +-0.070737 0.159582 -0.0449318 +-0.0281334 0.155101 -0.00344078 +0.0323761 0.107397 0.032947 +0.0390072 0.0393837 0.00207442 +0.0420748 0.0457918 0.0297783 +-0.0187683 0.0699858 -0.0381989 +0.0176298 0.0382941 -0.0187111 +-0.0688111 0.0922897 -0.0164711 +0.0419266 0.101462 0.0171593 +0.00341059 0.0376223 -0.0244648 +0.0461634 0.0792418 0.0171768 +-0.0637535 0.0431846 0.0296789 +-0.0273632 0.0534705 -0.0254085 +-0.0394955 0.0562825 0.0399491 +0.00548498 0.0590856 0.0545593 +-0.0934182 0.124107 0.0122673 +0.0324897 0.100233 -0.014155 +-0.00952254 0.0688375 0.0554289 +0.0191204 0.042209 0.0431814 +0.0195848 0.035993 0.00660837 +-0.0748916 0.10354 -0.0108565 +-0.0685642 0.0406581 -0.00126009 +-0.0225344 0.118142 0.03379 +-0.013583 0.0386256 -0.002471 +-0.0898618 0.113382 0.0394321 +0.0601893 0.0595178 0.0171788 +-0.0630097 0.121328 0.0458592 +-0.0196415 0.0725672 0.0536854 +-0.0211896 0.172692 -0.021286 +0.024653 0.104647 -0.0168345 +-0.0795268 0.096746 0.0348816 +0.0485163 0.0672488 0.000612911 +0.0400064 0.0422019 -0.00166327 +-0.0197891 0.0785016 -0.0390423 +-0.0260568 0.0375908 -0.0291887 +-0.00717802 0.130589 0.0142265 +0.0156678 0.0346738 -0.0117297 +0.0424576 0.0845381 -0.00679736 +-0.0302701 0.0365155 -0.0302567 +-0.0274598 0.0863801 0.0483431 +-0.0831854 0.11075 0.0323354 +-0.0514986 0.109783 0.0378241 +-0.0183396 0.126605 0.021835 +-0.0497522 0.0716181 0.0399477 +0.0165016 0.116787 0.0362663 +-0.0670324 0.0672056 0.0312385 +0.0201473 0.0414664 -0.0187017 +0.0364932 0.0484054 0.0314672 +-0.0501327 0.159092 -0.00542351 +-0.0752763 0.0667216 0.0105318 +-0.0341695 0.0337715 0.0105094 +0.0137891 0.103175 -0.021246 +-0.073587 0.148629 -0.0261691 +-0.0169441 0.184483 -0.0249355 +-0.0097273 0.130072 0.0104159 +-0.00405402 0.0391419 -0.01222 +-0.0887371 0.0955614 0.00743378 +-0.0864769 0.0806081 0.0125015 +0.040053 0.107027 0.0101639 +-0.042812 0.14778 0.00347562 +0.0248383 0.0835695 -0.0246296 +0.0277899 0.116538 -0.00556904 +-0.0291577 0.0380555 0.005854 +-0.0525571 0.150877 0.0178 +-0.0639921 0.134062 -0.00777265 +-0.0838901 0.110998 0.0281595 +-0.0134922 0.107228 0.0429665 +-0.0586918 0.149676 0.0345486 +-0.0616651 0.119834 0.0424717 +0.0456475 0.0890064 0.00517807 +-0.0089791 0.0383636 0.0133044 +-0.0903646 0.135051 0.0122148 +0.0317594 0.0835691 0.0424885 +-0.0240368 0.11082 -0.0193477 +0.0271768 0.112761 0.0342135 +-0.0356473 0.116902 -0.0136714 +-0.0739197 0.151223 0.0366634 +0.0410535 0.0759945 -0.00777525 +-0.0734182 0.169757 -0.0275332 +-0.00232938 0.0359607 0.0474459 +-0.085737 0.110915 0.0387737 +-0.0775985 0.123137 0.0521223 +-0.0748309 0.100681 -0.0121692 +-0.0866976 0.109058 0.0133472 +-0.0701875 0.0395708 0.00901355 +-0.0306891 0.120328 -0.00923215 +-0.045477 0.1214 -0.012376 +-0.033489 0.172734 -0.00156283 +-0.0565822 0.0339881 0.0253464 +-0.0404955 0.0451407 0.0414639 +-0.0555537 0.0420256 -0.00889368 +-0.0598777 0.102599 -0.0186645 +0.0592051 0.0552531 0.0121703 +-0.0758111 0.0741872 -0.00760517 +-0.038197 0.0342285 0.0289964 +-0.00312706 0.0390512 0.0319597 +0.0476183 0.0426691 0.0171605 +-0.0306281 0.0831438 0.0423752 +-0.049274 0.1386 0.00640083 +-0.0210747 0.0753924 0.0536136 +-0.093596 0.126936 0.0252692 +-0.0629825 0.129686 -0.00825839 +0.00470729 0.128083 -0.0039713 +-0.0335515 0.0373466 -0.0164398 +0.0425502 0.0637218 0.0280932 +-0.0707401 0.13973 0.0469958 +-0.0644842 0.0804582 0.0430441 +-0.0618671 0.112377 0.0367302 +-0.0698247 0.169548 -0.0276555 +-0.0863191 0.0806082 0.0115067 +-0.0216814 0.0523409 -0.0297011 +0.0377238 0.110496 0.0121805 +-0.0689171 0.158096 -0.0529848 +-0.067181 0.156627 -0.0534662 +-0.0268045 0.0811284 -0.0369845 +-0.0546722 0.139567 0.0297056 +-0.0554146 0.0649279 0.0339175 +-0.0193967 0.186852 -0.0171886 +-0.0357817 0.0351096 0.0179926 +-0.0718839 0.173642 -0.0520314 +-0.0409497 0.0337305 -0.016439 +0.0396966 0.105593 0.0211678 +-0.0789279 0.0699144 0.0158521 +-0.0414163 0.0476371 -0.0122303 +-0.00671791 0.0642099 -0.0355692 +0.0547677 0.0509942 0.0227339 +-0.0686614 0.0735088 -0.0131618 +-0.0738123 0.0655371 0.0172042 +-0.0904479 0.129526 0.00625875 +0.0197334 0.044328 -0.0216983 +-0.0896348 0.140659 0.0301806 +-0.00748945 0.0870384 0.0571349 +0.0217161 0.119158 -0.00841047 +-0.0545346 0.125365 -0.00640975 +0.0368294 0.108237 -0.00182731 +-0.0672538 0.152901 0.0344187 +-0.0807043 0.0827741 -0.00656651 +-0.0305099 0.113915 0.0346878 +-0.0721764 0.154012 -0.0399025 +-0.045061 0.130334 0.0180279 +-0.00652053 0.0688834 0.0561767 +-0.0444953 0.0817848 0.0424707 +-0.0874489 0.105009 0.0173545 +-0.0175711 0.0387182 -0.00892429 +0.000506539 0.0883906 0.0565122 +-0.0265193 0.12549 0.0159805 +-0.0464789 0.0917181 0.0434263 +0.0455125 0.0918121 0.0101608 +-0.0834627 0.110719 0.0412267 +-0.057205 0.0480928 0.032667 +0.00517049 0.0350387 0.0228068 +0.0457999 0.0820138 0.0191697 +-0.0420324 0.171559 -0.00171063 +-0.0475118 0.128596 -0.00180437 +0.0204841 0.0948066 0.0474378 +-0.0719895 0.163815 -0.0429694 +-0.0644943 0.0861671 0.0446171 +0.00851416 0.06604 0.0550264 +-0.0670308 0.141141 0.0435296 +-0.0848818 0.142006 0.0416598 +-0.0384808 0.106985 0.038039 +0.0180116 0.0754634 0.0524537 +-0.0725251 0.155433 -0.0349062 +0.0182337 0.128007 0.0135344 +-0.0233093 0.162498 -0.00577898 +-0.0850563 0.112998 0.00231897 +-0.0823398 0.145942 0.00119384 +-0.0852211 0.103481 0.00138673 +-0.071875 0.136886 0.0488574 +-0.0794627 0.138625 0.0485832 +-0.0435009 0.117967 0.030956 +-0.038588 0.0341641 0.0271976 +-0.0408255 0.0914222 -0.0231618 +-0.0551021 0.154591 -0.0020359 +-0.0748456 0.159073 -0.00827714 +-0.0621666 0.152205 -0.0155784 +-0.0494972 0.0776899 0.0438666 +0.00751862 0.0799738 0.0554444 +0.00532494 0.0625045 -0.0319907 +0.00237701 0.131635 0.0162813 +-0.0546261 0.151324 0.0271982 +-0.0236176 0.123316 0.0244011 +0.00251869 0.05336 0.0534808 +0.0225511 0.0888829 0.0485585 +-0.0370273 0.174099 -0.0109221 +-0.090997 0.129691 0.0382289 +-0.0732672 0.148476 -0.0292583 +-0.053498 0.0465766 0.0420409 +-0.0330184 0.0474571 0.0438647 +-0.0246064 0.033636 -0.0243161 +-0.0234471 0.125053 0.0200484 +-0.0830784 0.138234 -0.000100609 +0.0406549 0.0820323 0.0324674 +-0.0842996 0.0965857 0.0297797 +-0.0527544 0.03448 0.0379838 +-0.0799451 0.15529 0.0167266 +-0.057093 0.0521243 0.00061739 +0.0154036 0.0477404 -0.0246897 +-0.060782 0.082481 -0.019648 +-0.0700267 0.166609 -0.0500213 +0.0451823 0.091796 0.014161 +0.0346837 0.106039 0.030986 +-0.0396713 0.0621627 -0.012718 +-0.05111 0.0375368 0.0465746 +-0.0688918 0.119449 -0.00874323 +0.000197079 0.035652 0.0464555 +-0.00149822 0.0661867 0.0567241 +0.00350858 0.074484 0.056374 +-0.0284992 0.0703316 0.0397848 +-0.0555164 0.0482866 0.0387265 +-0.0908309 0.136473 0.0182032 +-0.0634905 0.0861851 0.0447067 +-0.00918339 0.033864 -0.0215021 +-0.0748916 0.123775 -0.00787892 +-0.0270496 0.033483 -0.0265278 +0.00488911 0.035483 -0.0145807 +-0.0442085 0.165146 -0.00911238 +-0.0322103 0.0386054 -0.0136114 +0.0190336 0.11528 0.0364777 +-0.000494586 0.0897644 0.0562541 +-0.0350004 0.157209 -0.0112204 +-0.0635638 0.147341 -0.0176577 +-0.0902987 0.121315 0.00530766 +-0.0705068 0.102745 0.0389474 +-0.0662636 0.175335 -0.0598585 +-0.0239792 0.0680021 0.045464 +0.0413142 0.0637288 -0.00386959 +-0.051889 0.108419 -0.0189045 +-0.0477652 0.131125 0.00158524 +-0.0400469 0.169775 -0.0108504 +-0.0755266 0.109807 -0.00760163 +0.00107791 0.130709 0.0215491 +-0.0655994 0.0349763 0.0155159 +-0.0628742 0.161547 -0.05443 +0.0359645 0.0981106 0.0346243 +0.00934693 0.129002 0.0260013 +-0.0768843 0.109139 0.0404116 +-0.010503 0.0674297 0.0550101 +-0.028646 0.0535523 0.0364431 +-0.072824 0.0936306 -0.0150907 +0.028615 0.035804 0.0196241 +0.0282076 0.0706829 -0.0227535 +0.0596824 0.0622541 0.020173 +-0.0025152 0.0575969 0.0540026 +0.000110958 0.036978 0.020027 +-0.0273656 0.0360131 -0.0296152 +-0.0624735 0.0344952 0.0183787 +-0.0360892 0.159232 -0.0124312 +0.0418577 0.100066 0.0211691 +-0.063571 0.122754 0.0468224 +0.0523857 0.0624129 -0.0025136 +0.0383109 0.0632029 0.0342252 +-0.0144971 0.0786767 0.0566892 +-0.0928565 0.129591 0.0132418 +-0.0681034 0.152856 -0.0481556 +-0.0746787 0.169356 -0.0440586 +-0.0335137 0.107031 0.0389932 +0.0424926 0.0583469 0.0313486 +-0.0223256 0.0637459 0.0453694 +-0.0648797 0.106687 -0.0146649 +0.0250125 0.0632249 0.0448766 +-0.0624284 0.159959 -0.0405984 +0.00349445 0.12099 0.0360851 +0.022067 0.0981797 0.0461337 +-0.0734899 0.123206 0.0535424 +-0.0321688 0.171168 -0.015915 +-0.0848969 0.106313 0.0233612 +-0.067172 0.174543 -0.0467986 +0.0246727 0.0884534 -0.0236513 +-0.0504949 0.0477308 0.0397221 +-0.064202 0.155431 -0.0413859 +0.00347944 0.095162 0.0537659 +0.0105108 0.100431 0.0479236 +0.021311 0.123415 0.0275211 +0.0415141 0.104253 0.009162 +-0.0617635 0.0387159 0.0237173 +-0.0044982 0.0952431 0.0547633 +0.0398123 0.066053 -0.00878746 +-0.00271622 0.0627636 -0.0349069 +-0.00914442 0.0387021 0.000210725 +-0.0814422 0.106028 0.0294684 +-0.0136643 0.0922643 -0.0359313 +0.0420557 0.0676716 -0.00377172 +-0.0364793 0.0945677 0.0439429 +-0.05033 0.0517928 0.0340061 +-0.0470088 0.130577 0.00217989 +-0.0286777 0.158132 0.000508817 +0.0185266 0.0345532 0.000246197 +-0.0147199 0.184604 -0.0232088 +-0.0384921 0.111131 0.0361977 +-0.0384978 0.102835 0.0403416 +-0.0215751 0.0667511 0.0487462 +-0.0887264 0.0996152 0.00841821 +-0.060662 0.0644224 -0.00688354 +0.0397235 0.080129 -0.010751 +-0.0136601 0.0389486 0.0334846 +-0.0106876 0.129553 0.00573838 +0.00810435 0.0348429 0.0181346 +0.0256081 0.104449 -0.0166247 +-0.0682325 0.168499 -0.0270627 +-0.0474794 0.0917467 0.0438194 +0.00950115 0.119644 0.0365249 +0.0437324 0.0790794 0.0263023 +-0.0905234 0.132421 0.0302253 +-0.0748541 0.107208 0.0370405 +-0.0943565 0.12553 0.0182582 +-0.0131926 0.0378477 0.0507876 +-0.0570855 0.0480965 0.0356642 +-0.04493 0.0346468 0.0377647 +-0.0665925 0.064199 -0.00375071 +-0.0829976 0.133839 -0.00205551 +-0.0406365 0.0548831 -0.0112562 +-0.00950098 0.0884225 0.0571104 +0.0335068 0.0468989 0.0306812 +4.31947e-06 0.034593 -0.0165995 +-0.0725884 0.155473 0.0265843 +-0.0755167 0.0714511 -0.00453448 +-0.0669139 0.0704667 0.0354638 +-0.069981 0.180634 -0.0574865 +-0.0116389 0.034923 0.0481436 +-0.0307766 0.0720324 -0.0295197 +-0.0178239 0.107521 -0.0218927 +0.020822 0.043607 0.0421342 +-0.025466 0.0460651 0.0509844 +0.0349766 0.11396 0.0183585 +-0.0599273 0.122373 -0.00867944 +0.0365334 0.0980835 0.033685 +-0.0621481 0.159972 -0.0385982 +-0.0915531 0.115336 0.039285 +-0.0888763 0.0982745 0.00841224 +-0.00324635 0.130613 0.0199814 +-0.0668526 0.0914559 0.0435065 +0.0175786 0.0475536 0.0427473 +0.0318002 0.118052 0.00717688 +-0.0414667 0.104283 0.0404247 +0.0562407 0.0648113 0.00118357 +-0.0753758 0.170369 -0.0311391 +-0.0620405 0.138434 -0.00686017 +-0.00249822 0.0870283 0.0569791 +-0.0542914 0.129735 0.0355428 +-0.0274963 0.100194 0.0434874 +-0.00951883 0.17115 -0.0217635 +-0.0305995 0.121953 0.0248664 +-0.0770757 0.068957 0.00853894 +0.0135031 0.119752 -0.013055 +0.0413777 0.0491221 -0.00619394 +-0.0669027 0.0396709 0.012801 +-0.0249365 0.0607087 0.0409751 +-0.0124795 0.0517352 0.0508543 +-0.0304 0.0650386 -0.0254348 +-0.0267061 0.0765373 0.0464972 +0.0196875 0.0385058 -0.013693 +0.0518591 0.0461434 0.019211 +-0.0447475 0.146272 0.00240034 +-0.0336457 0.0562895 -0.0107616 +0.0237552 0.0887468 -0.0239425 +-0.000502572 0.0965565 0.053664 +-0.0664522 0.0376478 0.0363332 +-0.041205 0.169789 -0.00987939 +-0.0630084 0.142674 -0.00705706 +-0.0305333 0.178655 -0.00565353 +-0.0137626 0.0784616 -0.0384771 +-0.0616465 0.0397266 0.0174413 +0.00939844 0.0418898 -0.0239164 +0.0403895 0.0519763 -0.00684208 +0.00239172 0.0434053 -0.0248906 +-0.0663598 0.15609 0.0142173 +-0.0667166 0.136853 0.0439657 +-0.0132042 0.171245 -0.025107 +-0.0511148 0.117699 -0.0144446 +-0.0686887 0.0620968 0.00507892 +-0.066502 0.0889512 0.0442634 +-0.0531749 0.0487012 0.0129919 +-0.0464945 0.0532702 0.037612 +-0.0763048 0.0702707 0.00153293 +0.00237024 0.0481449 -0.0294793 +-0.0669085 0.108072 -0.0133167 +-0.0614834 0.166203 -0.0576271 +0.028089 0.0929174 0.0442737 +-0.0239187 0.036252 -0.0191133 +-0.0394562 0.0347283 0.0406132 +-0.0679286 0.17514 -0.0470724 +-0.0737519 0.14858 -0.0228576 +-0.0335079 0.105635 0.0395993 +-0.0780357 0.0769322 0.031104 +0.047273 0.0720618 0.00573289 +-0.0566027 0.0562228 -0.000407584 +-0.0336617 0.0592604 -0.0121578 +0.0390714 0.108406 0.0131668 +-0.067572 0.158668 -0.00806913 +-0.0668441 0.0995074 -0.0160123 +-0.0155786 0.0348181 -0.0259692 +0.0524799 0.0636428 -0.00173686 +-0.0666208 0.161046 -0.0135117 +0.012487 0.118181 0.036207 +0.00850767 0.067431 0.0550095 +-0.0568164 0.0333332 -0.00454462 +-0.00056724 0.0909565 -0.0345037 +0.0122553 0.0695892 -0.0315106 +-0.0747099 0.0713354 -0.00558545 +-0.0151964 0.178666 -0.0203777 +-0.0707468 0.161979 -0.010709 +-0.00364517 0.0496603 -0.0307711 +0.0292759 0.0787271 -0.0215887 +-0.0606931 0.0659255 -0.00858452 +-0.055281 0.0594285 0.0232183 +0.0168274 0.0658911 0.0506364 +-0.0286315 0.159193 -0.0128611 +-0.0753259 0.0689002 0.0227894 +-0.0278046 0.0364789 0.0536304 +-0.020238 0.0938075 -0.0335417 +-0.0787919 0.108745 0.0367247 +-0.0627356 0.150882 -0.0252578 +-0.0374903 0.111156 0.0359971 +0.0123741 0.0494269 -0.0274814 +-0.0550935 0.0685958 0.0378502 +0.0152655 0.0695272 -0.0306629 +0.0304209 0.0460912 -0.00653037 +-0.0896888 0.137919 0.0321971 +-0.076768 0.156222 -0.00903892 +-0.0177411 0.17422 -0.017052 +-0.0582856 0.0695544 0.0380966 +-0.0710157 0.179813 -0.0510815 +-0.0283604 0.112635 -0.0172343 +-0.0441537 0.0408799 -0.0213021 +0.0104769 0.0949778 0.0509942 +-0.00239285 0.100006 0.0487279 +0.0421962 0.0929549 -0.00479827 +0.0401191 0.0900359 0.0318057 +0.0226855 0.103953 -0.0180758 +-0.0705692 0.037778 -0.000833243 +0.0213756 0.0429924 -0.0177346 +0.0141656 0.0475343 0.0448184 +0.02539 0.0849287 0.0474039 +-0.0485578 0.0361757 -0.0124661 +0.0237226 0.0699627 0.0465409 +-0.062494 0.155703 0.00979223 +-0.0499478 0.135176 0.00116888 +-0.0731261 0.154051 -0.0329012 +-0.0565591 0.0344267 0.0337344 +-0.0757231 0.155771 0.0225635 +-0.081733 0.0783168 0.0273929 +-0.0465781 0.0504461 -0.00966731 +0.0370638 0.0376395 0.0160314 +0.0401736 0.0801429 -0.00978947 +-0.0295615 0.171229 -0.00778742 +-0.0625363 0.158377 -0.0386027 +-0.0482692 0.133969 0.0226705 +0.00454759 0.0341639 -0.0171912 +-0.0620171 0.153759 -0.016582 +-0.0878261 0.11219 0.0337097 +-0.05597 0.0519966 -0.00239063 +0.0400386 0.0871415 -0.0117889 +0.0205921 0.0807207 0.0509473 +-0.0296224 0.0352251 0.019146 +-0.0381589 0.163687 -0.0131595 +-0.0675595 0.163657 -0.0167503 +-0.0522361 0.15086 0.0163848 +0.0360023 0.103374 0.0311349 +0.0272712 0.0929162 0.0448522 +-0.0277389 0.0423333 0.0528015 +-0.0824451 0.140729 0.0449221 +-0.0329396 0.0386558 -0.0303928 +0.0296623 0.114075 -0.00693776 +-0.0221975 0.0652175 0.046591 +0.045212 0.0819736 0.0221688 +-0.0258761 0.0796032 0.0512286 +0.0272389 0.0873294 -0.0222582 +0.00242016 0.0361514 -0.024222 +-0.0615581 0.145382 0.0374116 +-0.0695688 0.160974 -0.049948 +-0.0858053 0.0953564 -0.000572964 +-0.0464927 0.165223 0.0045927 +-0.0624159 0.15064 -0.016574 +0.0473464 0.0561746 -0.0057008 +0.0237088 0.0942271 0.0467477 +-0.0494979 0.0762481 0.043343 +-0.078769 0.165248 -0.0339573 +-0.00950205 0.12806 0.0264334 +0.05377 0.0682444 0.00163269 +-0.0679209 0.163786 -0.054975 +0.0290078 0.087549 0.0438096 +-0.0840398 0.132376 -0.0018283 +-0.0306543 0.0650659 -0.0244333 +0.0322458 0.0355363 0.00770856 +0.00335212 0.131364 0.00663122 +-0.0154115 0.128891 0.0141212 +-0.0372876 0.0421099 0.0439093 +0.0308492 0.0931255 -0.0185705 +-0.029871 0.0459583 -0.0272702 +0.0300675 0.0822073 0.0435477 +0.000382137 0.128869 0.0270967 +-0.0174793 0.0730127 0.0550809 +-0.0387497 0.0782817 -0.0191475 +-0.0433943 0.0335852 -0.0186462 +0.0391881 0.0673984 -0.0107969 +-0.0280713 0.175691 -0.00734553 +0.0316149 0.0916151 0.0423373 +-0.0762132 0.0879097 -0.0135406 +-0.0316751 0.0665766 -0.0214412 +-0.00307655 0.0345443 -0.0171652 +-0.0426807 0.0636637 -0.0138633 +-0.0921228 0.126953 0.0372491 +-0.0235086 0.0347636 0.0474886 +-0.0506072 0.0546369 -0.00878713 +-0.0685971 0.162283 -0.0128033 +-0.0637348 0.156074 0.0136991 +0.0233928 0.0475951 -0.0196868 +-0.0519018 0.105587 -0.0193502 +-0.00551889 0.0746529 0.0585785 +0.000500504 0.0519731 0.0534094 +-0.0412672 0.0338015 -0.0128657 +-0.0819225 0.125087 -0.0048212 +0.00722702 0.0796252 -0.0338785 +-0.0893296 0.0956153 0.0124232 +-0.00167125 0.0554598 -0.0320096 +0.0267785 0.0402768 0.0313512 +-0.0867821 0.10632 0.010369 +-0.0451957 0.131364 0.0135329 +0.018149 0.0699846 0.0508404 +-0.0878008 0.119885 0.00028492 +-0.0612546 0.0341987 0.0206565 +0.0115009 0.111256 0.0392728 +0.0152633 0.0751002 -0.0297036 +-0.0351444 0.0865581 -0.0244792 +0.000649673 0.0963928 -0.0300705 +-0.0345272 0.121283 0.0279162 +0.0296818 0.0815643 -0.0205093 +-0.03348 0.115008 -0.0157024 +-0.0728312 0.136891 0.0492499 +-0.00265601 0.0540246 -0.0319128 +-0.0422272 0.127744 0.0161624 +-0.0494399 0.119744 0.0319359 +-0.0574019 0.116942 0.0379675 +-0.0468361 0.0970763 -0.0219471 +-0.0616292 0.146031 -0.00460349 +-0.0933662 0.126937 0.0262691 +-0.0228186 0.161021 -0.00330981 +-0.0635624 0.152855 0.034229 +-0.0625195 0.144437 -0.00658249 +-0.0839827 0.0830482 -0.0025149 +0.0144965 0.116791 0.0366152 +-0.0766305 0.155099 0.0076657 +-0.0365494 0.127902 0.0108341 +0.02042 0.126659 0.0186188 +-0.0470606 0.0628926 0.0375096 +-0.00665705 0.114661 -0.0174859 +0.0409886 0.104212 0.016155 +0.0264254 0.054947 0.041554 +-0.064618 0.0659249 -0.00682147 +0.0143052 0.127349 0.0263844 +-0.0254714 0.0379526 0.0103195 +0.0213669 0.0851498 -0.0262488 +-0.0469792 0.133264 0.00837709 +-0.0845615 0.0777561 0.014943 +0.0384886 0.0513309 0.0319844 +-0.0128833 0.165453 -0.0135102 +-0.0811951 0.147316 0.000164965 +-0.0523892 0.141597 0.0213852 +-0.045982 0.130505 0.00444274 +0.0279356 0.0520839 0.0384098 +-0.0931866 0.124098 0.0112689 +-0.0316005 0.0707575 -0.0264789 +0.00339515 0.0448431 -0.0258796 +-0.019688 0.0352649 -0.0192337 +-0.0492398 0.164062 -0.00484765 +-0.00759694 0.039172 -0.0259394 +-0.0456148 0.043386 -0.0114089 +-0.0706825 0.163806 -0.0469738 +-0.0111277 0.166928 -0.0162357 +0.0150914 0.0873948 0.0517971 +-0.0488841 0.0335499 -0.0104742 +0.0191832 0.0974256 -0.0227258 +-0.068761 0.17368 -0.0560297 +0.0347852 0.0821986 0.0398055 +-0.0656191 0.164967 -0.0232289 +0.0488884 0.0431235 0.0112233 +-0.0204394 0.0725535 0.0530664 +0.0198178 0.127196 0.0112616 +-0.0870347 0.13912 0.00619253 +-0.0619782 0.15683 -0.0335967 +0.0192552 0.0735767 -0.0281447 +-0.0582892 0.0589697 0.00149643 +-0.0794885 0.131664 0.0524764 +-0.0625817 0.159955 -0.0415973 +-0.0344319 0.0350721 -0.0182387 +0.0339652 0.0955609 0.0387182 +-0.0350568 0.0344135 0.0294961 +-0.00649976 0.0842428 0.0569087 +-0.0606247 0.0394421 0.0446315 +-0.066026 0.146409 -0.0228827 +0.0265887 0.0491527 0.0382012 +-0.0447519 0.078285 -0.0193632 +0.0442188 0.0833029 0.0251703 +-0.025021 0.178659 -0.00994683 +0.0382789 0.10977 0.00952257 +-0.0756137 0.176488 -0.0441876 +-0.0706968 0.169922 -0.0279808 +-0.0514769 0.0344526 0.0347935 +0.00449209 0.108585 0.0419458 +0.0591616 0.0552765 0.0151753 +0.0295012 0.0578054 0.0407589 +0.0323993 0.0505614 -0.00746951 +-0.0570338 0.131087 -0.00617819 +-0.0304972 0.101559 0.0427282 +-0.00116978 0.0991573 0.0506694 +-0.0238077 0.0811303 0.0547388 +-0.00701023 0.0988653 -0.0267279 +-0.0156999 0.0584946 -0.0353551 +0.00922562 0.0809438 -0.0326125 +0.0453737 0.0474164 -0.00383546 +0.0044338 0.117686 -0.0167913 +0.0239341 0.0561524 -0.0247597 +0.0591083 0.0705376 0.015147 +-0.0594646 0.151494 0.0342364 +-0.0657091 0.157202 -0.00882727 +-0.0250337 0.0381576 0.00660247 +0.0420581 0.102887 0.0101643 +0.0436509 0.0403831 0.00924323 +-0.00449056 0.130995 0.0108991 +0.0044777 0.112767 0.0412512 +0.00553763 0.100304 0.04669 +-0.0942962 0.120123 0.0192891 +-0.0620801 0.0339964 0.0171254 +-0.0160023 0.128658 0.015367 +-0.0432963 0.128843 0.0142751 +-0.0634932 0.104261 0.0408123 +-0.0746115 0.103538 0.0368408 +-0.0222463 0.0739152 0.0519932 +-0.0544743 0.034136 0.0256577 +-0.0252277 0.12616 0.0135052 +-0.0320296 0.171249 -0.00429305 +-0.0132393 0.1837 -0.0278845 +-0.0324962 0.0718107 0.0406773 +-0.0765269 0.165965 -0.0237196 +-0.0833313 0.0829966 0.0292517 +0.0259015 0.0902483 0.0463733 +0.0095961 0.0354723 -0.00987583 +0.0511798 0.0581784 0.029952 +-0.0848476 0.0845966 0.0254873 +-0.0509379 0.131197 -0.00260501 +0.00252027 0.0730778 0.0562797 +-0.0135504 0.122737 -0.00796322 +-0.00761024 0.0420402 -0.0258045 +-0.0508461 0.134795 0.0276114 +-0.0804072 0.155064 0.0209566 +0.00350727 0.103765 -0.0218529 +-0.0106066 0.0420419 -0.0261259 +-0.0713436 0.0632651 0.0179295 +-0.067959 0.169303 -0.0298283 +-0.0236585 0.049302 -0.027521 +-0.069473 0.158882 -0.00587612 +-0.0766843 0.15421 -0.00390102 +-0.0220401 0.0852804 0.0556778 +0.0275877 0.0465825 -0.0117097 +-0.00852427 0.130326 0.0108566 +0.0130382 0.0344991 0.00293188 +0.0559458 0.0605187 0.000117677 +-0.0348266 0.0900917 -0.0242073 +-0.0890869 0.135136 0.0402764 +-0.0897624 0.136545 0.033205 +0.00547548 0.112757 0.0410095 +-0.0712367 0.159654 -0.00650092 +-0.0121993 0.177175 -0.0288808 +-0.0823069 0.0748418 0.00552391 +-0.054558 0.0460859 0.0144477 +-0.070487 0.0669606 -0.00253268 +-0.0556924 0.159448 0.00648476 +-0.00649361 0.105887 0.04408 +-0.0602281 0.059992 0.0213112 +-0.0580325 0.0579587 0.00923969 +-0.0338627 0.110196 -0.0186635 +0.0546876 0.0597691 -0.00173886 +-0.0625369 0.149102 -0.00757295 +0.0542703 0.0575789 -0.00178727 +-0.0088618 0.129865 0.0208462 +-0.0801514 0.109359 0.0377151 +-0.00679227 0.0798757 -0.0378854 +-0.0424904 0.0860159 0.0426903 +0.0479819 0.0723794 0.00739708 +-0.0560722 0.13957 0.0312222 +-0.0365138 0.0804626 0.0431357 +0.00167631 0.105337 -0.0215515 +-0.0775111 0.0860271 0.0374369 +0.0259521 0.11908 -0.00433188 +-0.0558236 0.0526652 0.00846948 +-0.0846054 0.11036 0.02536 +-0.0765518 0.15421 -0.000899711 +0.0127846 0.0699169 0.0536174 +0.0208082 0.1264 0.00735797 +-0.0504584 0.0502644 0.0363006 +0.0174244 0.125027 -0.00283112 +-0.0308709 0.178515 -0.0130008 +-0.00718543 0.0385691 0.00621806 +0.0407891 0.0886694 0.0309807 +-0.0357951 0.124657 -0.0058294 +-0.0554873 0.0400326 0.0469712 +-0.057026 0.0675163 0.0366088 +-0.0497286 0.133927 0.0265636 +-0.00790814 0.0384861 0.0079669 +-0.0811308 0.0841829 -0.00653469 +-0.010479 0.0991873 -0.02508 +0.00856046 0.0354979 0.0447263 +-0.0634822 0.166302 -0.0366942 +-0.0223475 0.0360366 0.0535038 +-0.0795325 0.124539 0.0521412 +-0.00951606 0.0745243 0.0569833 +-0.0130122 0.127478 0.0251829 +-0.0936226 0.120076 0.0132919 +-0.0540996 0.154592 -0.00271527 +-0.0879876 0.132208 0.00230713 +-0.034669 0.15585 -0.0101443 +-0.0197012 0.0598498 -0.0346368 +-0.0276791 0.155231 -0.00339809 +-0.0842452 0.0818537 0.025498 +-0.054537 0.0560032 -0.00541843 +-0.0497623 0.0665865 0.0371903 +-0.0891577 0.092949 0.0214162 +-0.0577737 0.0782037 -0.0194332 +-0.064492 0.104249 0.0405622 +-0.0336047 0.0695556 -0.0194645 +-0.0558611 0.0955845 -0.021564 +-0.0184974 0.0869962 0.0565805 +0.00637923 0.0372606 0.0264872 +-0.0665048 0.104229 0.0399675 +0.0566718 0.0553009 0.0238011 +-0.0283123 0.0383433 -0.00703005 +-0.0114184 0.169868 -0.0184586 +0.0211822 0.0909362 -0.0242734 +0.0406295 0.0806796 0.0323988 +0.0123659 0.128443 -0.000397752 +-0.0384845 0.0833049 0.0437838 +-0.01051 0.0531978 0.0517663 +0.00250545 0.0842781 0.0574483 +-0.0674995 0.0972695 0.0419768 +-0.0618921 0.119466 -0.00942759 +-0.00594439 0.13066 0.0175514 +-0.0188708 0.0382701 0.00775373 +-0.0605698 0.0727907 0.0401099 +-0.0115041 0.115551 0.0394745 +0.0300401 0.11902 0.00366373 +-0.0812551 0.10738 0.02923 +-0.0704758 0.123201 0.0533571 +-0.0711231 0.141136 0.0464522 +-0.0222312 0.125137 -0.000350139 +0.0436968 0.0818627 -0.00278544 +-0.00557531 0.0383818 0.0157938 +-0.0175218 0.187118 -0.0194148 +0.000510392 0.0689287 0.0563645 +0.0339979 0.0519394 0.0331121 +0.00286804 0.129802 0.0250965 +-0.0290472 0.0777737 0.0431405 +0.0209137 0.102084 0.0444516 +-0.00628355 0.0409075 0.0485853 +0.0605521 0.0595441 0.0141714 +0.0386236 0.0898511 -0.0127692 +0.0302987 0.0539206 -0.0157566 +-0.0421651 0.149301 -0.00412295 +-0.0126067 0.040646 -0.0265976 +-0.0788091 0.168052 -0.033971 +0.0359211 0.112779 0.0172688 +-0.0394762 0.17111 0.000601324 +-0.0330305 0.0384181 -0.00620006 +-0.0859939 0.0940196 0.000445293 +-0.0359122 0.158048 0.00410154 +-0.0745011 0.151286 -0.0298782 +0.0531496 0.0491587 0.00225551 +-0.0243767 0.179986 -0.0189674 +-0.0891975 0.0996627 0.0124046 +-0.0742533 0.17954 -0.0493425 +-0.0510836 0.145457 -0.000907293 +0.0483282 0.0561556 -0.00540695 +-0.0224848 0.0474635 0.0510926 +-0.0647533 0.163375 -0.0214725 +-0.0127683 0.163589 -0.0126806 +0.0112702 0.0766287 -0.031501 +-0.0460801 0.153165 -0.0063697 +-0.0396673 0.0606846 -0.0120669 +0.0304753 0.100799 0.0389817 +0.0504441 0.0731136 0.0180651 +0.0195371 0.122997 -0.00457304 +-0.0455152 0.0505363 0.0385492 +-0.0525396 0.0458696 -0.00783738 +-0.0679101 0.109459 -0.0121777 +0.0257715 0.122252 0.0234619 +-0.0641925 0.158337 -0.0512857 +-0.0679573 0.0636968 0.0236258 +0.0336501 0.0872305 -0.0183746 +-0.081408 0.0801232 -0.00353296 +-0.068364 0.143961 0.043402 +-0.060807 0.170968 -0.0607383 +-0.0530022 0.0712206 0.0395879 +-0.0629233 0.149038 -0.01858 +-0.0911763 0.131044 0.0302322 +-0.0866097 0.0859466 0.00148078 +-0.0213048 0.0567472 0.0459531 +-0.0884724 0.111842 0.0093465 +-0.0232358 0.0382045 0.0267906 +-0.0687325 0.178002 -0.0502345 +0.0171734 0.0960138 -0.0234178 +-0.0336295 0.0533957 -0.0102549 +0.0404048 0.0661215 -0.00776758 +0.0352114 0.113974 0.0112756 +-0.0509894 0.131098 0.0315417 +-0.0825925 0.0857998 0.0312629 +0.0165569 0.0367823 -0.018664 +-0.0158447 0.163118 -0.0162484 +0.0463618 0.0504062 -0.00492067 +-0.0256024 0.0918183 0.0477571 +0.0401119 0.105635 0.0181717 +-0.075865 0.120825 -0.00747435 +-0.0515138 0.0502892 0.0216268 +-0.0597307 0.0737738 -0.017073 +0.0327302 0.0795508 0.0421017 +0.0561478 0.0493933 0.0131905 +-0.0491927 0.149222 0.0111539 +-0.0505664 0.0459962 -0.00889176 +-0.0346044 0.0381371 0.0484275 +-0.0571418 0.0341673 0.0268338 +-0.0508978 0.0335658 0.00549258 +0.0499018 0.0460625 0.00228276 +0.000648366 0.101032 0.0453587 +-0.064515 0.0945534 0.0434117 +-0.00933623 0.127529 -0.00319765 +-0.0931674 0.126844 0.0122586 +-0.0775055 0.120428 0.0519362 +-0.00412302 0.0390868 0.0317249 +-0.0444953 0.12065 0.0276432 +-0.0808257 0.114785 -0.00282613 +0.00848893 0.0976878 0.0492062 +-0.0204952 0.119495 0.0334766 +-0.0744171 0.1312 0.052182 +-0.0354802 0.0365931 -0.0303176 +-0.0158225 0.127346 0.0227279 +-0.0622273 0.163125 -0.0345932 +-0.0308039 0.0345326 0.0408762 +-0.0684942 0.0944611 0.0423345 +-0.0282259 0.115945 -0.0147131 +-0.00496131 0.0393649 0.0367022 +0.000507606 0.089764 0.0561546 +0.0184391 0.121423 0.0322194 +-0.0293563 0.0761839 -0.0345604 +-0.0798193 0.0993879 0.0336913 +-0.0260706 0.125207 0.0176138 +-0.0466789 0.0383303 -0.0162856 +-0.0551627 0.0709645 0.0393255 +-0.0708102 0.086505 -0.0166182 +-0.0534691 0.0491595 0.0373719 +-0.0176627 0.0365106 -0.0181139 +0.00950436 0.0910078 0.0538342 +-0.0895706 0.136541 0.0322035 +0.0538065 0.0721186 0.0208488 +-0.00549555 0.115561 0.0401898 +0.00964519 0.0349724 -0.00752839 +-0.0134864 0.112741 0.0406725 +-0.00206815 0.039143 -0.00620903 +0.0130247 0.112857 -0.017601 +-0.0790398 0.119048 0.050662 +-0.0808858 0.0872378 0.0337267 +-0.0123796 0.124965 -0.00637162 +-0.0213885 0.125739 0.00103732 +-0.089509 0.125659 0.045333 +-0.05553 0.137483 -0.00349047 +0.0417216 0.100008 -0.000812454 +-0.0294372 0.045874 0.0494957 +0.0458807 0.0774123 0.0204549 +-0.010796 0.120869 -0.0120713 +-0.0650859 0.171096 -0.0446086 +-0.0309091 0.0594671 -0.0184147 +0.0318276 0.102039 -0.0140664 +-0.050474 0.137043 0.0223997 +-0.0892111 0.0956026 0.0114219 +-0.0551272 0.0478339 0.0400497 +-0.0376142 0.115213 -0.0159111 +-0.0262205 0.0604134 -0.0304432 +-0.0395514 0.159448 0.00235113 +-0.0548296 0.0912974 -0.0221769 +0.0140209 0.113717 -0.0165571 +-0.0376838 0.0651596 -0.0143574 +-0.0357596 0.0367769 0.0465803 +0.0218833 0.124858 0.00205716 +-0.0515413 0.0403485 -0.0110842 +0.0196453 0.0521206 0.045827 +-0.0274751 0.109286 -0.019717 +-0.054346 0.125513 0.0372066 +-0.061806 0.172532 -0.0555873 +0.0193853 0.0367967 0.0404 +0.00315064 0.0340463 -0.0192491 +-0.0419902 0.127061 0.0177443 +-0.0753578 0.0671035 0.0137678 +-0.017747 0.0685932 -0.0381265 +0.0502404 0.0581527 0.030355 +-0.01349 0.11138 0.0414506 +-0.088473 0.0908539 0.022804 +-0.0623246 0.0380624 0.0435494 +-0.0315191 0.0831203 0.0417649 +-0.0908528 0.131057 0.0322319 +-0.0524868 0.0959601 0.0436811 +0.0383485 0.10917 0.00520513 +0.0405643 0.0599899 -0.00408877 +-0.00769877 0.0598808 -0.0345717 +0.0253549 0.0875981 0.0473346 +-0.0126907 0.166905 -0.0150111 +0.0384994 0.0541178 0.0316123 +-0.034906 0.0367338 -0.0161439 +-0.057208 0.048538 0.00854022 +-0.0255159 0.108511 0.0401259 +0.0305676 0.0350004 0.0115893 +-0.0520943 0.0559627 0.0266271 +-0.0610057 0.155949 0.0190169 +-0.067333 0.1766 -0.0497355 +0.0258363 0.0844839 -0.0235493 +-0.0689178 0.164003 -0.0158096 +-0.00849374 0.116931 0.0393004 +-0.0752784 0.113511 0.0497641 +-0.0888148 0.144497 0.0313918 +-0.0453871 0.145929 0.00156561 +-0.0599561 0.0677317 0.0357891 +-0.0125434 0.0386707 -0.00229897 +-0.000271447 0.0356914 0.00658166 +-0.0415825 0.0366566 0.0434527 +-0.0297036 0.165315 -0.00626903 +-0.0467885 0.0855251 -0.0217462 +-0.0827882 0.125806 0.051363 +-0.0176693 0.0966335 -0.0284397 +-0.0464991 0.115243 0.033257 +-0.0569748 0.146758 0.0317266 +-0.0430879 0.156177 -0.00890493 +-0.00350236 0.0774419 0.0585703 +-0.0699027 0.158151 -0.0489236 +0.0362459 0.112339 0.00591924 +0.0367118 0.0920329 -0.0133924 +-0.0539202 0.0610131 0.0274265 +-0.0093317 0.127279 0.0279745 +-0.0726772 0.112018 0.047983 +-0.0451365 0.160644 -0.00892562 +-0.0209165 0.172715 -0.0146234 +-0.0477839 0.125387 0.0290716 +-0.0734873 0.156859 -0.0289164 +0.00860516 0.061703 0.0545256 +-0.0246606 0.0422329 0.0539554 +-0.0315436 0.153515 -0.00448892 +0.0345459 0.0571781 -0.011728 +-0.0791321 0.170818 -0.0399882 +0.0254504 0.0415949 -0.00563526 +0.0230318 0.0355156 0.0114574 +-0.0554984 0.107053 0.0399469 +-0.0296361 0.0522471 0.0373693 +-0.0438179 0.0928034 -0.0224841 +-0.0199243 0.0387302 -0.0112686 +0.0212455 0.0791286 -0.0267859 +-0.0532861 0.0527919 0.0115704 +0.00450017 0.0441843 0.0459802 +-0.0329932 0.0339759 0.0213799 +0.0553011 0.0604636 -0.000842819 +0.00165238 0.0932332 -0.0327923 +-0.0552284 0.0527023 0.00927604 +-0.0783599 0.0708413 0.0204513 +-0.0767777 0.176413 -0.0510191 +-0.0394918 0.104211 0.0396007 +0.0327921 0.0889736 0.0422708 +-0.00991923 0.0986226 0.0505787 +-0.0806729 0.108958 0.0307202 +-0.0822864 0.135367 0.0491747 +-0.0649369 0.0609076 0.00327394 +0.0386477 0.0715748 -0.0117783 +-0.0240415 0.126597 0.0109996 +-0.0781422 0.141688 -0.0047364 +-0.0427782 0.0841106 -0.0212812 +-0.0641686 0.178174 -0.0558405 +0.0252976 0.0661311 -0.0233121 +0.0189895 0.0631559 0.0484766 +0.0182463 0.0722224 -0.0290012 +-0.0777504 0.161717 -0.020949 +-0.051966 0.138521 0.000416067 +-0.0605353 0.155832 0.0177371 +0.0437866 0.098742 0.00716534 +-0.0494703 0.0370271 -0.0120635 +0.0464078 0.0806576 0.0101793 +0.0218218 0.116393 -0.0114503 +-0.0533273 0.132699 -0.00427378 +-0.0681775 0.0762505 0.039044 +-0.0250035 0.0896 -0.0352857 +0.000769534 0.0946028 -0.0322154 +-0.0158082 0.0346932 0.0474464 +-0.076979 0.148604 -0.00699397 +0.0467055 0.0730498 0.0181295 +-0.0496483 0.0634464 -0.0118311 +-0.0197535 0.0700012 -0.0382558 +0.0232727 0.0989983 -0.0208236 +-0.0777 0.16251 -0.0219398 +-0.0908755 0.147455 0.0141474 +-0.0334742 0.0638502 -0.015538 +0.00219672 0.0825025 -0.0349885 +-0.0814773 0.128835 0.0524787 +-0.0784807 0.13724 0.0497912 +0.0361312 0.11046 8.71157e-05 +-0.0454849 0.0931252 0.0434035 +-0.0635463 0.153079 -0.00800928 +-0.0529285 0.0339107 0.0244154 +-0.00862356 0.0451919 -0.0286362 +0.0192377 0.117984 0.0350388 +-0.000496915 0.0883839 0.0565827 +0.0316988 0.118246 0.0142694 +-0.0398347 0.169198 -0.01127 +0.0219416 0.125622 0.00635903 +-0.092876 0.129604 0.0142376 +-0.023566 0.0579721 0.0425175 +-0.0447621 0.126552 0.0211574 +-0.0390659 0.157734 -0.0109824 +-0.0038734 0.104505 -0.022849 +-0.0810823 0.146103 0.0405774 +-0.00499552 0.038756 0.0282379 +0.00659654 0.102942 0.0449664 +-0.0528078 0.0898592 -0.0221628 +-0.0415043 0.0340515 -0.0039392 +-0.0118724 0.166916 -0.0155725 +0.00801932 0.113693 0.0398597 +-0.0873717 0.0895698 0.0245766 +0.0235801 0.11767 -0.00881398 +-0.0592051 0.0411249 -0.00803844 +-0.0631955 0.174736 -0.0540401 +-0.00904474 0.102005 -0.0240096 +-0.0893459 0.0888735 0.0114634 +-0.0847817 0.111591 0.0313073 +-0.0318636 0.155275 -0.00893878 +0.020119 0.0578214 0.0483165 +-0.0884363 0.140505 0.0381916 +0.0268748 0.0768062 0.0459093 +0.00650425 0.06886 0.0554952 +-0.0600274 0.155812 0.00342033 +0.00439509 0.0433687 -0.0246925 +-0.0644393 0.157952 -0.0526177 +-0.0626717 0.152516 0.0345768 +-0.0686641 0.0435432 0.00268116 +-0.0668913 0.155545 0.00822429 +-0.0513204 0.0545255 0.0306253 +-0.0216946 0.055283 -0.031103 +0.0201038 0.121698 0.0313961 +-0.0435092 0.0973014 0.0425845 +-0.0598342 0.124083 0.0415696 +-0.0290584 0.0385824 0.0360072 +-0.0211666 0.0959679 -0.0277597 +0.0393164 0.0948581 -0.00836399 +-0.0465497 0.0354834 -0.0182685 +-0.0577953 0.0577539 0.0112722 +0.0343862 0.0533953 0.033694 +-0.0356597 0.12459 0.0229985 +-0.0703962 0.0382223 -0.000484462 +0.0394034 0.0772645 -0.00977482 +0.0374516 0.110677 0.0163977 +0.022681 0.0549804 0.0449373 +-0.00661876 0.0388692 0.029605 +-0.0298463 0.0958488 -0.0239617 +-0.0500656 0.165567 2.77718e-05 +-0.0624265 0.163056 -0.0535855 +0.0182459 0.035082 -0.00972071 +-0.0535426 0.139527 0.0278286 +0.0535157 0.0664189 0.0268642 +-0.0618871 0.044625 0.0401036 +0.0279315 0.0813321 -0.0222629 +-0.0364738 0.0959436 0.0435424 +-0.0648009 0.0867059 -0.0190299 +-0.0910478 0.113254 0.017639 +0.0328625 0.115479 0.000361714 +-5.55454e-05 0.1192 -0.0143689 +0.00440015 0.0419024 -0.0241382 +-0.0356548 0.0459643 -0.0252685 +-0.00874142 0.0699019 -0.0364843 +-0.0786816 0.173602 -0.0460003 +-0.0750442 0.11265 0.048722 +0.0132032 0.0850348 -0.0305799 +-0.0275703 0.070462 0.0404211 +-0.0333885 0.082189 -0.0265241 +-0.0498121 0.0912811 -0.0216901 +-0.0121305 0.129539 0.00953518 +-0.0888371 0.0942243 0.00943852 +-0.0733262 0.151241 -0.0368807 +0.0159012 0.0347663 0.0342789 +-0.0464698 0.0336288 0.00272222 +-0.0219797 0.0381347 0.0126751 +-0.0434985 0.112577 0.0357301 +0.0374146 0.0807844 0.0365828 +-0.0150623 0.160937 -0.0114195 +0.00882514 0.0347544 -0.00561715 +-0.0793646 0.150083 0.036366 +0.0444807 0.0526489 0.0324592 +-0.0140843 0.0382987 0.0177555 +0.0371109 0.0630101 -0.0117592 +-0.0795655 0.0711751 0.0181423 +0.0314182 0.0968966 0.040312 +0.0553211 0.0622297 0.0271921 +-0.0344916 0.0789231 0.04184 +-0.0708134 0.0893817 -0.0163657 +-0.0786856 0.174223 -0.045863 +-0.0497628 0.0345507 0.0333201 +-0.026557 0.0646504 0.0393284 +0.0499455 0.0733656 0.0164225 +0.0233132 0.0902311 0.0479207 +-0.0441494 0.163638 -0.00943446 +-0.048497 0.0464891 0.040915 +-0.0638143 0.15519 -0.0396115 +0.0296208 0.115866 0.0291818 +-0.0505003 0.100168 0.042883 +0.00450871 0.0910904 0.0550512 +0.0223914 0.093257 -0.0227104 +-0.0346391 0.0469045 -0.0241611 +0.0600903 0.0608951 0.0181821 +0.0174829 0.0976104 0.0472234 +0.0245219 0.0382712 0.0311236 +0.0373902 0.0561474 -0.00613784 +-0.0725233 0.143597 -0.0104167 +-0.0755086 0.133058 0.0519758 +-0.0469091 0.134066 0.0158053 +-0.0365004 0.0719314 0.0420432 +0.0599383 0.0692126 0.0131498 +-0.0228512 0.126901 0.0114323 +0.0370832 0.0408236 0.0259314 +0.0430366 0.0709859 0.0269587 +0.0442558 0.0917077 -0.00080891 +0.0366443 0.0915417 0.0373244 +0.0149217 0.127634 0.0251635 +-0.0260773 0.0547586 -0.0274003 +0.0223322 0.0348324 0.0210401 +-0.0674741 0.169344 -0.0310786 +-0.0943935 0.125559 0.0222675 +0.000334373 0.0554042 -0.031412 +-0.023822 0.0694685 0.046666 +0.024828 0.0768588 0.0482443 +-0.0593221 0.0615947 0.0254084 +-0.0274704 0.0506795 -0.0243965 +-0.0172176 0.177147 -0.0249576 +0.0433823 0.0490357 -0.00560381 +0.0244317 0.116294 -0.00934411 +0.0184177 0.0350663 0.0309125 +0.0404265 0.102791 0.0231613 +-0.0243375 0.1639 -0.00728245 +-0.0675442 0.151908 -0.0456642 +-0.0311974 0.0474073 0.0447828 +-0.0726957 0.175719 -0.0430358 +-0.0165027 0.0499584 0.0473896 +0.0323852 0.0461686 -0.00610484 +0.0214495 0.0822346 0.0504578 +0.016822 0.123899 -0.00554312 +-0.0694694 0.178653 -0.050518 +-0.0741019 0.156119 0.0187476 +0.0510202 0.0736047 0.0138558 +-0.0739033 0.14718 -0.0168588 +-0.0165785 0.162548 -0.00831661 +-0.0414778 0.0347327 0.0401772 +0.0319294 0.118052 0.0100791 +-0.0502835 0.146495 -0.00183305 +-0.0758664 0.116415 -0.00636144 +-0.0824071 0.136209 -0.001703 +-0.0519598 0.0335208 -0.000101812 +-0.0819554 0.0993316 0.0315904 +0.0213579 0.055075 -0.0266156 +-0.0422106 0.112435 -0.0169649 +0.0150002 0.128745 0.00378903 +-0.0430993 0.157658 -0.00954173 +-0.0816795 0.117485 0.0486704 +-0.00999143 0.0383941 0.00762464 +0.0248936 0.12332 0.00461274 +-0.0644877 0.0972949 0.0424471 +-0.032514 0.105674 0.0400124 +-0.0517751 0.0826668 -0.0215624 +0.00214252 0.103065 -0.0221511 +-0.0609083 0.169363 -0.0596932 +0.0270498 0.0919981 -0.0213752 +0.00735643 0.038818 0.0454516 +0.0115845 0.121127 -0.0125402 +0.0591992 0.0552614 0.014176 +-0.0901723 0.112303 0.0149799 +-0.0627834 0.035148 0.0195098 +-0.074757 0.111898 0.0475989 +0.0570719 0.0578424 0.00217676 +-0.0528487 0.0500508 0.0126245 +-0.00477608 0.0784365 -0.0374195 +-0.0645432 0.0673992 0.033354 +-0.0540085 0.145723 -0.00127177 +-0.010995 0.0388834 0.0322933 +0.00247314 0.0964836 0.053027 +-0.0624566 0.177245 -0.0586155 +0.0368789 0.0941727 0.035906 +-0.0219544 0.120804 -0.00985027 +0.0570851 0.0508934 0.0101876 +0.0102738 0.0724526 -0.032232 +0.0544954 0.0655564 0.000403771 +0.0210681 0.0415437 -0.0156999 +-0.0692317 0.155651 0.00154206 +0.0527009 0.0518645 -0.000768796 +0.0334294 0.116181 0.00636312 +0.0448957 0.0945828 0.0101613 +0.00249575 0.0952068 0.0540463 +-0.0124032 0.0388598 -0.00801871 +0.045282 0.0889737 0.0021781 +-0.00350234 0.0388725 -0.0137373 +-0.0678317 0.0335757 0.00383638 +0.00921578 0.0767579 -0.0331902 +-0.0534996 0.0987387 0.0427565 +-0.0124888 0.126191 0.0283067 +0.0103285 0.130654 0.00635323 +0.0314005 0.0446447 -0.00577901 +-0.0295471 0.0804664 0.0436378 +0.00584239 0.0374362 -0.00493399 +0.0435663 0.0408867 0.018056 +-0.0206234 0.0950485 -0.0308006 +-0.0216102 0.0408331 -0.028871 +-0.0256808 0.0663835 0.041558 +0.0103698 0.0351865 0.034574 +0.0249548 0.0809223 0.0484627 +-0.0551501 0.0641879 0.0328568 +-0.0633147 0.132484 0.0400888 +-0.062948 0.163113 -0.0275941 +-0.0620302 0.141028 0.0366839 +-0.0484797 0.126826 0.0298997 +0.00950548 0.107102 0.041296 +0.0390056 0.0914413 0.0336848 +0.0300323 0.108764 0.0348296 +-0.0198832 0.0335337 -0.0251748 +0.0128315 0.0391361 0.0445812 +-0.0263531 0.11244 -0.0170322 +0.0359611 0.109622 -0.00183337 +-0.0572001 0.0380562 0.0469117 +0.00550248 0.121034 0.0357708 +-0.0667821 0.14845 -0.031825 +-0.016957 0.186039 -0.0193264 +-0.0878947 0.131105 0.044958 +0.0363312 0.107346 0.0280412 +-0.0614985 0.0833224 0.0439406 +0.0542552 0.0478973 0.00920996 +-0.0787615 0.0867217 -0.0105634 +0.0226207 0.0360088 0.0127544 +0.00886878 0.0343168 0.00225753 +-0.0266191 0.0618553 -0.0304537 +-0.00302574 0.0387303 0.00142158 +-0.019905 0.038668 0.0324503 +0.0527798 0.0683653 0.00150186 +0.021964 0.0402022 -0.00870612 +-0.0126432 0.0481635 -0.0303259 +-0.0124951 0.0925417 0.056096 +-0.0373842 0.0433946 0.0425967 +0.0243858 0.124139 0.00725423 +-0.0540808 0.0434992 0.0186914 +-0.0590026 0.0609591 0.0242669 +-0.0846496 0.129332 -0.00265191 +0.0108129 0.0887938 0.0544498 +-0.0599027 0.106882 -0.0174092 +0.0235199 0.123889 0.00267512 +-0.0364958 0.116629 0.0319219 +-0.0274016 0.0386836 -0.0145853 +0.0575354 0.0620414 0.00218896 +-0.0617076 0.156842 -0.0315932 +-0.0566848 0.0344893 0.0422998 +-0.0515556 0.0459336 -0.00836292 +0.034036 0.037677 0.020853 +0.0440634 0.064827 -0.000963389 +-0.0783551 0.090033 0.0367591 +-0.0451437 0.162134 -0.00879907 +-0.0870992 0.0913786 0.00345195 +-0.0896332 0.0983435 0.0144056 +0.00267954 0.131212 0.00494959 +-0.0521038 0.0531706 0.024633 +0.033292 0.0856433 -0.0187503 +-0.0284873 0.0606333 -0.0264114 +-0.0366237 0.123115 -0.00817194 +-0.0417568 0.0797359 -0.0197866 +-0.0466787 0.0650533 -0.0138917 +0.0360448 0.0392022 -6.35907e-05 +-0.0192403 0.0387115 -0.0129795 +0.0431391 0.098698 0.00317491 +-0.0224767 0.091498 -0.0352097 +0.0093588 0.0524416 -0.0295377 +-0.0833358 0.105954 0.0271122 +-0.0146006 0.127548 0.000963555 +0.0122907 0.0652688 -0.0305463 +-0.0515682 0.0488001 -0.00762593 +0.0214986 0.122612 0.0290301 +-0.0271235 0.11599 -0.0147668 +0.0381316 0.109734 0.0151646 +-0.00681664 0.0854791 -0.0376549 +-0.0147515 0.07145 -0.0385454 +-0.0659657 0.129697 -0.00887578 +0.0359834 0.11203 0.00292702 +-0.0631298 0.144906 -0.0101196 +0.00903132 0.0343268 -0.014573 +-0.0348704 0.101474 -0.022105 +-0.0693077 0.0614952 0.0145437 +0.0349262 0.0896582 -0.0169179 +-0.037886 0.109925 -0.0191545 +-0.0372775 0.0472266 -0.0193178 +0.0112393 0.0349033 0.0350041 +0.0430009 0.0705508 -0.00279727 +0.0400623 0.0956447 -0.00679711 +-0.0676126 0.155322 0.00651001 +0.0598737 0.0581052 0.00916393 +-0.061495 0.100138 0.0425963 +-0.0575075 0.0435504 0.0160321 +0.0228298 0.0827896 -0.0258286 +-0.0115004 0.0925527 0.0561224 +-0.0223058 0.184466 -0.0180708 +-0.0624348 0.161527 -0.0435948 +-0.0143997 0.0383922 -0.000568703 +-0.0793362 0.0881239 -0.0095476 +-0.0548971 0.10981 -0.018029 +-0.0707512 0.156365 0.0199172 +0.0244407 0.0405616 0.0372831 +-0.0545055 0.113958 0.0351234 +-0.00749363 0.0547355 0.05304 +0.044284 0.0819099 0.0251484 +0.0117499 0.0519912 0.0501875 +-0.0706809 0.109318 0.0378585 +-0.0640006 0.161566 -0.01976 +-0.0122192 0.0378665 0.050479 +-0.0715061 0.148353 0.0408514 +-0.0652549 0.0667307 0.0320259 +0.0162842 0.118981 -0.0122323 +-0.0584978 0.0959813 0.0440843 +-0.0261553 0.169713 -0.0187023 +0.0163086 0.108997 -0.0174538 +0.019812 0.035154 0.0274956 +0.0403843 0.0547484 -0.00641578 +-0.0370524 0.128064 0.00917633 +-0.0181528 0.0388364 -0.0128782 +-0.0703699 0.144073 -0.0154773 +-0.0821317 0.15265 0.0057634 +-0.0121975 0.182647 -0.0286755 +-0.0179487 0.126229 0.0234428 +-0.0713342 0.065071 0.0216423 +-0.0135059 0.0357879 0.0504712 +-0.0551243 0.0482803 0.0389113 +-0.043841 0.0970933 -0.0219235 +0.0307935 0.0619124 0.0409121 +-0.0872404 0.149912 0.0282765 +-0.0777833 0.0694772 0.0182331 +-0.0479563 0.0699321 0.0400053 +-0.0325179 0.0704032 0.0404934 +-0.04199 0.0336868 -0.0166047 +0.00497409 0.0340864 0.0145521 +-0.0449304 0.0643377 0.0396087 +-0.0778694 0.106226 -0.00738941 +-0.0126221 0.0389953 0.033657 +-0.0632121 0.172304 -0.0615699 +-0.0276205 0.0874255 -0.0346253 +-0.0625254 0.138119 0.0359126 +0.00425284 0.0711834 -0.0342035 +-0.0788838 0.153282 0.0303949 +0.00652169 0.0362747 0.0255863 +-0.0662316 0.0345008 0.0140489 +-0.02106 0.174206 -0.0148174 +0.0185004 0.109841 0.0391791 +-0.0646081 0.0450546 0.000685835 +-0.0136021 0.0363077 -0.0261392 +-9.29522e-05 0.131467 0.0096514 +-0.0451771 0.128971 0.00184527 +0.00750493 0.0561002 0.0528313 +0.0361319 0.074097 0.0381795 +0.022807 0.125614 0.0138049 +-0.0196774 0.0509888 -0.0303435 +-0.0930693 0.120128 0.0262942 +-0.0230193 0.120798 -0.0098328 +-0.0271496 0.0384219 0.0311819 +-0.0748224 0.0935599 -0.014192 +-0.0354943 0.119369 0.0303337 +0.060906 0.0609648 0.0111554 +0.0112135 0.130703 0.0137986 +-0.0266186 0.0589226 0.0382515 +0.0218458 0.0672628 0.0473581 +0.00922858 0.116392 0.0380826 +-0.0579872 0.0576809 0.00662705 +-0.0151861 0.168246 -0.0215615 +0.0431809 0.0791159 0.0272636 +-0.0755673 0.0727762 -0.00660131 +0.0242315 0.0818412 -0.0251267 +-0.0250124 0.0782139 0.0518051 +-0.0338224 0.0338142 0.00692539 +-0.00946746 0.0362215 -0.025425 +-0.0416936 0.0652006 -0.0145392 +-0.0546754 0.0335075 0.00116676 +-0.0233106 0.15969 -0.00223977 +-0.0842752 0.141807 0.00320102 +-0.0818378 0.131303 0.0516681 +-0.0234556 0.161598 -0.0145283 +-0.0499699 0.150693 0.011804 +-0.010495 0.0471724 0.0477907 +0.0380379 0.075373 0.0356471 +-0.0450739 0.0363473 0.0448052 +-0.0737333 0.15548 -0.0259091 +-0.0716137 0.178389 -0.0484 +-0.0384987 0.0691035 0.0417776 +0.00141943 0.122927 0.0347542 +-0.057332 0.137224 -0.00518105 +-0.0557698 0.136063 -0.00393718 +0.0558337 0.0494217 0.00919997 +-0.0580135 0.04944 0.00163802 +-0.0357372 0.111668 -0.0181975 +-0.0550044 0.145721 -0.00143834 +0.00110225 0.0344701 0.00796988 +-0.0157589 0.038402 0.00281447 +-0.0521458 0.121812 -0.0107191 +-0.00850406 0.11834 0.0382239 +-0.0498654 0.102788 -0.0210486 +-0.0630574 0.15313 -0.033029 +-0.0734528 0.143001 -0.00787011 +-0.0577717 0.0334512 -0.00484461 +-0.0926703 0.124234 0.0402542 +-0.0236253 0.0450591 -0.0281331 +0.0444641 0.0686626 0.00115575 +-0.0394989 0.0620307 0.0413298 +-0.0489043 0.0531988 0.0353928 +-0.0549375 0.140991 0.0293007 +0.0134789 0.100443 0.0476777 +0.0344381 0.102088 0.0341795 +-0.0629237 0.112473 -0.0138486 +0.0456048 0.0918125 0.0071715 +-0.0679688 0.135528 -0.00836676 +-0.0561131 0.145329 0.0311927 +0.0222077 0.0403059 0.0403109 +-0.0930104 0.131018 0.0202297 +-0.073597 0.161047 -0.0349306 +-0.073142 0.0762988 0.0362199 +-0.0868887 0.102318 0.0233696 +-0.074876 0.107788 -0.00905848 +-0.061968 0.159998 -0.0366167 +0.0234524 0.0505688 0.0407158 +-0.0374809 0.113893 0.0340704 +-0.052457 0.144675 0.0183665 +0.000496502 0.103028 0.0440499 +-0.0107515 0.039289 0.0373765 +0.0177346 0.123618 -0.0052308 +-0.0278908 0.0903405 -0.0316075 +0.0555538 0.0665692 0.0013688 +-0.0679616 0.181138 -0.0572245 +-0.0246921 0.156571 -0.00408158 +-0.0295045 0.112518 0.0356692 +-0.0523224 0.146252 0.0184018 +-0.0831779 0.111548 0.00129095 +0.0381693 0.109765 0.0141664 +-0.0465876 0.132486 0.00741919 +0.0351546 0.112861 0.0227039 +0.00752051 0.0855871 0.0562726 +-0.0236256 0.0464233 -0.0274769 +-0.0820555 0.138062 0.0474469 +-0.0332203 0.171246 -0.00251328 +-0.0471051 0.157621 -0.00763511 +-0.0883909 0.0874867 0.0154625 +-0.0769362 0.0914256 0.0381174 +-0.075265 0.148568 -0.0158698 +0.015355 0.119233 -0.0124997 +-0.0073165 0.13056 0.0112981 +-0.0167502 0.070002 -0.0383082 +-0.0672167 0.147775 -0.0296135 +0.00424945 0.126892 0.0299609 +0.0188897 0.120837 -0.00821554 +-0.0628446 0.0334683 -0.00588606 +0.0333858 0.103442 0.0343819 +-0.0748011 0.0878022 -0.0147955 +0.00250445 0.0519435 0.0530423 +-0.0565994 0.0548437 -0.000400453 +-0.0657591 0.0794867 -0.0178324 +-0.0893947 0.113204 0.00833335 +0.00550466 0.122397 0.0349805 +-0.0593516 0.0471429 0.038917 +-0.0691412 0.109612 0.0381472 +0.012166 0.127075 0.0284779 +0.00215147 0.0340847 -0.0194818 +-0.0357383 0.152143 0.000762654 +-0.0225608 0.0608496 0.0442445 +-0.00675345 0.0727271 -0.0364938 +-0.0504985 0.0776737 0.0437561 +0.012653 0.128571 8.59956e-05 +-0.0775017 0.148428 0.039927 +0.0194833 0.0961991 0.0471957 +-0.00134544 0.0999407 0.0490888 +-0.00745251 0.100521 0.0469096 +0.0293349 0.108769 0.0355782 +-0.0628076 0.0881622 -0.0190458 +0.0438908 0.0973298 0.0041758 +-0.0618594 0.154827 0.00385225 +0.0224603 0.0878572 0.0487762 +-0.0684419 0.0805248 0.0412962 +-0.0414824 0.0817867 0.0423837 +-0.0394972 0.0591632 0.0405173 +-0.0699138 0.0616664 0.0106715 +-0.0256486 0.050648 -0.0266189 +-0.0189668 0.125144 0.0245507 +-0.0548939 0.161294 0.00305835 +0.0593671 0.0566851 0.00917266 +-0.0619624 0.0371632 0.0192279 +-0.0458599 0.129594 0.0221735 +-0.078334 0.175787 -0.0461739 +-0.00822607 0.100046 0.0481626 +-0.0580744 0.136937 -0.00566118 +-0.0915979 0.115467 0.0229868 +0.0255167 0.123738 0.0133816 +-0.0331932 0.0348891 0.047012 +-0.076964 0.129602 -0.00711544 +-0.0598599 0.0358888 0.0454954 +0.0450831 0.0463904 0.0280485 +-0.0315243 0.0802674 0.0412906 +-0.0239631 0.11903 -0.0119726 +-0.0346068 0.0483825 -0.0183276 +-0.0825971 0.103328 -0.00360734 +-0.0887132 0.118572 0.00232339 +-0.0188128 0.082729 -0.0390748 +-0.0866936 0.0833424 0.0154842 +0.00371617 0.0348648 0.0208524 +0.0267042 0.122545 0.0181085 +-0.0738109 0.0935956 -0.0146814 +0.0287557 0.0348074 0.0132587 +-0.0344434 0.174206 -0.0015497 +-0.053794 0.086942 -0.0216962 +-0.0584166 0.126929 0.0401124 +-0.0837712 0.127162 0.0508887 +-0.0249431 0.0907384 -0.0344432 +-0.0817429 0.0748341 0.0165378 +-0.0709721 0.148372 0.0407622 +0.0453179 0.0861686 0.00320477 +-0.052904 0.159748 -0.00276649 +-0.0630387 0.15529 -0.0125891 +-0.0628558 0.170957 -0.0505963 +0.0198342 0.0408002 0.0424386 +0.0114164 0.0403794 -0.0231815 +-0.0270194 0.12568 0.0143315 +-0.0340325 0.126267 0.001455 +-0.0096483 0.171546 -0.0270746 +0.0461889 0.0792428 0.016179 +-0.0314795 0.0774889 0.0410863 +0.00441886 0.0361314 -0.0238164 +0.0140504 0.0379362 -0.0217239 +-0.0064667 0.128955 -0.000718006 +-0.00729042 0.0388645 0.0312728 +-0.0537922 0.14151 -0.001138 +-0.0843649 0.125772 0.0501053 +-0.0489003 0.033496 0.00596365 +-0.00972794 0.166651 -0.0186764 +-0.0537672 0.0812389 -0.0213883 +-0.0327797 0.0337757 0.0180041 +-0.0738907 0.107101 0.0373066 +0.0441357 0.0659575 -7.19207e-05 +-0.0929503 0.128215 0.0122521 +-0.0898716 0.133794 0.0302191 +-0.0643705 0.154697 0.0294695 +0.023375 0.0504685 -0.0225374 +-0.052801 0.0690675 0.0379843 +-0.0823518 0.0966615 0.0320686 +0.00650836 0.0813916 0.0558754 +0.0249135 0.0390596 0.0323329 +0.0422621 0.0746939 -0.00581448 +-0.0239734 0.0636045 0.0427616 +-0.0648684 0.0967433 -0.0176098 +-0.0661842 0.163921 -0.0584969 +-0.0338218 0.0886934 -0.0246941 +-0.0545067 0.102902 0.0418134 +-0.0298032 0.034287 0.0163531 +0.00993007 0.126906 -0.00476687 +-0.0376745 0.0379475 0.0444361 +-0.0658844 0.114191 0.045149 +0.0205436 0.121905 -0.00538746 +-0.0134808 0.108609 0.0426611 +-0.0484883 0.0960313 0.0444485 +-0.0326323 0.125019 -0.000941466 +-0.0254216 0.0999543 -0.0239282 +-0.0410688 0.11258 -0.017122 +-0.0434945 0.0676224 0.0409141 +0.0153651 0.0493118 -0.0259325 +0.00422707 0.0782528 -0.0345112 +0.0285181 0.0968051 -0.0184722 +-0.0597676 0.0796261 -0.0193897 +-0.0714963 0.118989 0.0533881 +-0.0566004 0.0335105 0.0169198 +-0.0880799 0.113511 0.0432934 +-0.0208348 0.0956185 -0.0294009 +-0.010501 0.0759377 0.0571751 +-0.0797391 0.110092 0.0425713 +0.0423965 0.0704871 -0.00480867 +-0.071352 0.110742 0.0439553 +-0.0617103 0.0604885 0.000571471 +-0.000492298 0.0605899 0.0560413 +-0.0819087 0.121685 0.0492514 +0.0133657 0.116504 -0.0155461 +-0.0035043 0.0589584 0.0540181 +-0.0700245 0.0833021 0.0413654 +0.0410401 0.0656705 0.029359 +-0.0623583 0.164673 -0.0485921 +0.027252 0.0549488 0.0409918 +-0.0568093 0.0883611 -0.0215879 +0.0409151 0.0390283 0.00994476 +0.0189976 0.0408013 0.0429893 +0.038497 0.0527286 0.031838 +-0.0436566 0.0592613 -0.0123074 +-0.0456035 0.0504974 -0.010193 +-0.0427107 0.0335694 -0.0203532 +-0.0107484 0.0348144 0.0431359 +0.0366972 0.106807 -0.00382741 +-0.0475 0.109814 0.0383224 +-0.0581584 0.0685383 0.037238 +-0.0888985 0.128369 0.0446279 +-0.0618211 0.164489 -0.0586698 +-0.0622151 0.166391 -0.0605094 +0.000668194 0.039196 0.03081 +-0.0494963 0.0974185 0.0440407 +-0.0327214 0.154341 -0.00788327 +0.00831584 0.0624371 -0.0312473 +-0.0441024 0.124581 0.0229348 +-0.00474585 0.0712867 -0.0359934 +-0.0211964 0.0725528 0.0524066 +0.0440002 0.0888695 -0.00280666 +0.0083541 0.0524293 -0.0297113 +0.0104364 0.0472441 0.0475563 +0.0130443 0.113867 -0.0167218 +0.035717 0.0533288 0.0320909 +-0.0439793 0.169659 0.00035763 +-0.0261771 0.0395393 0.0541115 +0.0142627 0.0751304 -0.0300927 +0.0172008 0.0849074 -0.0286671 +-0.0301348 0.156065 -0.00950629 +0.0153602 0.0672491 0.0520407 +0.038354 0.0547461 -0.00609927 +0.0326073 0.112448 0.0288842 +-0.0230436 0.0879523 0.0537722 +-0.0507107 0.0708743 -0.0151986 +0.00170937 0.0361659 0.0210822 +-0.0106905 0.18126 -0.0286694 +-0.0543257 0.121248 0.0372193 +-0.086895 0.143263 0.0379805 +-0.0300853 0.179019 -0.00589649 +-0.0624495 0.15591 0.022857 +-0.0597659 0.0448149 0.0126042 +0.00226448 0.0346925 0.0189009 +0.00270214 0.10527 -0.0214784 +-0.0843731 0.110309 0.0377873 +-0.0603328 0.153535 0.00105643 +-0.00601124 0.0348376 0.0423067 +-0.0419337 0.160883 0.00416203 +0.025639 0.0740461 0.0458389 +-0.0724467 0.0361675 0.00255211 +-0.0515329 0.0431219 -0.00982617 +-0.0668209 0.036036 0.0339126 +0.0328708 0.0740673 0.0404957 +0.0429413 0.0682748 0.0268013 +-0.0687158 0.171626 -0.0372714 +0.0231488 0.116662 0.0336476 +0.0322304 0.0505255 0.0340589 +-0.0869233 0.112018 0.0232463 +-0.078057 0.0907599 -0.0115869 +-0.0538087 0.119788 0.0361741 +0.00650273 0.121045 0.0359095 +-0.00425882 0.128035 0.0283342 +-0.0558184 0.158024 -0.000144968 +-0.0699106 0.10657 -0.0124287 +0.0101685 0.124401 -0.00806495 +-0.0774125 0.06897 0.0169693 +-0.0204069 0.09844 -0.0243451 +-0.0678094 0.180556 -0.0587896 +-0.0490427 0.0341369 0.0285626 +-0.0112286 0.0338605 -0.0218986 +0.0300773 0.0754873 0.0435133 +0.00030024 0.0612559 -0.033673 +0.000950727 0.129943 0.000110463 +-0.083524 0.154076 0.0213615 +-0.0688604 0.0819375 0.0416515 +-0.0674926 0.0889102 0.043735 +-0.000658033 0.0525337 -0.0307361 +-0.0805064 0.103384 0.0314383 +-0.0596514 0.142474 0.0348633 +-0.00849673 0.105867 0.0437425 +-0.0317522 0.0735748 -0.0285005 +0.0171692 0.0345228 -0.00186568 +-0.0229141 0.111944 -0.0185359 +-0.00375332 0.07411 -0.0361467 +-0.00849121 0.103027 0.0437022 +-0.0323725 0.16532 -0.00484492 +0.0250885 0.119458 -0.00473925 +0.00228893 0.0341509 0.0103163 +0.03989 0.0630598 0.0312004 +-0.0146968 0.175692 -0.019662 +-0.00218576 0.0355897 -0.0160761 +0.0318792 0.0686784 0.0407831 +-0.0783091 0.16249 -0.0249404 +-0.0807007 0.0752735 0.0231846 +-0.00686818 0.0385321 0.0081342 +-0.0114932 0.036278 -0.0256312 +-0.076524 0.178854 -0.050295 +-0.093475 0.1283 0.0242551 +-0.063929 0.0354009 0.0416662 +-0.064733 0.15377 0.0322824 +0.0293628 0.105677 -0.0139766 +-0.0544684 0.119419 -0.0121872 +-0.0878486 0.143233 0.0360974 +-0.0866257 0.081991 0.0115028 +0.0324736 0.0490215 0.0326282 +-0.0472578 0.121113 0.0280085 +0.0275416 0.0349624 0.00541796 +-0.0827616 0.091206 0.0312465 +-0.0627318 0.159944 -0.0435973 +0.0444941 0.0637658 0.0284543 +0.0512305 0.0723962 0.00737259 +-0.0374845 0.100078 0.0419234 +0.00446502 0.0977292 0.050995 +-0.090055 0.132436 0.0352224 +-0.0771832 0.107237 0.0346968 +0.0132863 0.0695708 -0.0313558 +-0.0833513 0.099287 0.0301656 +-0.050588 0.0599426 0.0326193 +-0.0116999 0.0599414 -0.0352829 +-0.0629554 0.156782 -0.0386059 +0.0452979 0.0875774 0.0181674 +0.0367705 0.074074 0.0373409 +-0.0378297 0.12794 0.00447467 +0.000472166 0.0388678 0.0256446 +0.00293826 0.0356401 -0.0151121 +0.0194959 0.11257 0.0373879 +0.0178674 0.103889 -0.0200126 +-0.0197782 0.075693 -0.0390468 +-0.0162539 0.171251 -0.016682 +-0.0719027 0.156807 -0.0389123 +-0.0816716 0.0734987 0.0125379 +0.00248698 0.0399628 0.0461692 +-0.0118767 0.105907 -0.0227385 +-0.0633264 0.159631 -0.0180726 +-0.0147126 0.0384481 0.00298688 +-0.0598094 0.0896854 -0.0200419 +-0.0586861 0.0603162 0.0231261 +-0.0518133 0.0531756 0.0296409 +-0.0201151 0.123178 -0.00639815 +-0.0197736 0.0998405 0.0442778 +-0.00649912 0.118331 0.038456 +-0.0868133 0.0846987 0.0154763 +-0.0052065 0.0389581 0.0316148 +-0.0886495 0.113065 0.0417436 +0.0045077 0.107168 0.0418669 +-0.0635616 0.174109 -0.0525858 +-0.0657828 0.082373 -0.0185031 +0.00281465 0.0379685 -0.0135285 +-0.0863919 0.099468 0.00241821 +0.0544797 0.0539552 0.0258897 +-0.0865727 0.08823 0.0252282 +-0.0778042 0.156927 -0.0169128 +-0.00349196 0.114194 0.0413026 +-0.0523232 0.13528 0.029621 +0.0359531 0.0673443 0.0378699 +0.0103588 0.130588 0.0191927 +0.0383356 0.10264 -0.0058258 +-0.0906686 0.139207 0.0161786 +-0.0534974 0.0876167 0.045276 +-0.0609918 0.138116 0.0346365 +-0.010493 0.114167 0.0405696 +-0.0260866 0.0349169 0.0485155 +-0.0519529 0.0531525 0.0236322 +-0.0670544 0.153567 -0.0495044 +-0.000486159 0.0689333 0.056515 +-0.034827 0.0929417 -0.0239227 +0.0157074 0.0821031 0.0526782 +-0.0185046 0.116829 0.0366774 +-0.0357116 0.0358916 0.0155029 +-0.0711005 0.148774 -0.0369587 +-0.0146296 0.185817 -0.0244743 +-0.0871678 0.11039 0.0183619 +-0.0897192 0.129664 0.0425949 +-0.0278047 0.074956 0.0433932 +-0.0408028 0.033851 -0.0276993 +-0.0260362 0.165356 -0.00798775 +-0.022832 0.0348259 0.0458328 +-0.0327846 0.0346162 0.0403814 +0.0292084 0.0350186 0.0149853 +-0.0908558 0.14471 0.0151666 +-0.0389013 0.0336802 -0.0215651 +-0.00950572 0.0590791 0.0548422 +-0.0252687 0.0931263 -0.0308668 +0.00727173 0.0667978 -0.0321541 +-0.0478216 0.109884 -0.018362 +0.00164525 0.0348132 0.00406568 +0.0377191 0.0632143 0.0350986 +-0.0468821 0.108426 -0.0186436 +0.0252001 0.0818001 -0.0245703 +0.00238035 0.127411 0.0292755 +0.0255053 0.103245 -0.0173339 +0.011492 0.0445292 0.0444785 +0.0458991 0.0414061 0.011234 +-0.0302302 0.0537755 -0.0183734 +-0.0870355 0.111737 0.0342553 +0.0298569 0.0835122 0.0432289 +0.0344154 0.0409101 0.0271225 +0.00697892 0.131225 0.0065571 +0.0443985 0.0748779 -0.000803542 +-0.0703751 0.112557 0.0480687 +0.0398576 0.101362 0.0261824 +-0.0146217 0.0450296 -0.0279689 +0.0305372 0.0592022 0.0405121 +-0.0427308 0.169809 0.000879537 +-0.00260639 0.0419888 -0.0252454 +0.000821596 0.0412233 0.0465397 +0.0447686 0.0889311 -0.000811854 +-0.00992934 0.166943 -0.0180552 +-0.0743075 0.170773 -0.046055 +-0.0564797 0.0356812 -0.0108166 +0.0302902 0.078207 0.0438447 +-0.0601407 0.0410386 0.0173224 +-0.0404944 0.0478337 -0.0126145 +-0.00989846 0.0384846 0.0238656 +-0.0338875 0.0780022 -0.0265044 +-0.0309197 0.0805646 -0.0325792 +-0.0788495 0.1177 0.0505094 +0.00204515 0.0345955 -0.0162029 +-0.0115453 0.0445033 0.0495732 +-0.048476 0.116631 0.0320328 +-0.0121876 0.113225 -0.0179296 +-0.0193167 0.0754023 0.0546877 +-0.0653246 0.0648097 0.0284194 +-0.0417336 0.0739469 -0.0182277 +0.0129121 0.0806948 0.0538726 +-0.087913 0.0900756 0.00446758 +-0.0459794 0.167363 0.00259136 +-0.00407632 0.124795 0.032822 +0.00214512 0.131665 0.0104804 +-0.0242177 0.0387671 0.0542484 +-0.0864391 0.131188 0.0477462 +0.0208043 0.12624 0.020186 +-0.0682771 0.163789 -0.0539724 +-0.0225729 0.172715 -0.0135004 +-0.0434823 0.12913 0.00531313 +-0.0465355 0.0790498 0.0431447 +0.0415243 0.0623608 0.0290336 +0.0206713 0.0868458 -0.0260413 +-0.0616015 0.0614498 -0.00273471 +-0.0698033 0.087974 -0.016854 +0.00908719 0.0358267 -0.00842564 +-0.0333922 0.068118 -0.0184774 +-0.0820819 0.150001 0.0344048 +0.0348029 0.113058 0.00110003 +-0.00477205 0.0345951 0.0445699 +-0.0740526 0.172196 -0.0480444 +-0.0192069 0.125855 0.0229991 +-0.0404977 0.0520197 0.0394004 +-0.0367886 0.156481 -0.0105439 +-0.0531367 0.0490718 0.026657 +0.015473 0.0962531 0.0481291 +-0.0492612 0.115146 -0.0157671 +0.0536465 0.0728799 0.00890065 +-0.0263571 0.0549776 0.0383278 +0.0333229 0.0997779 -0.013667 +-0.0551968 0.138069 -0.00309725 +-0.0563111 0.122698 0.0396267 +-0.02088 0.107273 -0.0222055 +0.000924532 0.100829 -0.0227814 +-0.0907853 0.117276 0.00630342 +-0.0134985 0.11551 0.0389419 +-0.0921826 0.114725 0.0193089 +-0.0218136 0.116051 -0.0148581 +-0.0915139 0.140599 0.0171878 +-0.0723659 0.100858 0.0389128 +-0.0227439 0.0669905 -0.0360641 +0.0133914 0.0448806 -0.0247967 +-0.0334245 0.0346344 0.0419763 +-0.083931 0.103265 0.0277985 +-0.0172469 0.116672 -0.0155678 +0.0141307 0.108667 -0.0183815 +-0.0676215 0.0688155 -0.00772966 +-0.049646 0.138599 0.0173958 +-0.0836562 0.0966099 0.0305537 +-0.0662913 0.165749 -0.0234747 +0.0434836 0.0734019 -0.00279222 +-0.0672802 0.0405919 -0.00423161 +-0.0468922 0.0334761 -0.010008 +-0.00688399 0.107372 -0.022762 +-0.0471129 0.13404 0.0104021 +-0.0613177 0.0470312 0.00669678 +-0.0857102 0.0912822 0.000468321 +-0.0564836 0.0589584 -0.00242578 +-0.0544716 0.0607811 0.0269495 +0.0392359 0.0685928 0.0338195 +-0.0907738 0.125596 0.0437739 +-0.0123469 0.0383491 0.0216787 +-0.00750765 0.123161 -0.01054 +0.0441233 0.0959295 0.00318315 +0.0262791 0.0675449 -0.0231801 +-0.0432671 0.0465873 -0.0113888 +0.00633058 0.0567988 -0.0308016 +-0.0135852 0.123715 -0.00700086 +-0.00140945 0.12836 0.0278943 +-0.0283882 0.0380697 -0.0179434 +0.0478387 0.0734572 0.0126134 +0.0038745 0.0367677 -0.0140867 +-0.05057 0.0335281 0.00739754 +0.036728 0.111857 0.010401 +-0.00844614 0.128164 -0.00189615 +-0.0247501 0.0578943 0.0408638 +-0.0467618 0.0657183 0.0385512 +0.038544 0.0726461 0.034619 +-0.00748755 0.111393 0.0423782 +-0.0658988 0.116581 -0.00961273 +-0.0415297 0.118854 -0.0137293 +-0.062219 0.164671 -0.0505894 +-0.00870995 0.128748 0.0252759 +-0.0315128 0.115295 0.0334421 +0.0503991 0.0466746 0.0233055 +-0.0753594 0.113961 -0.00568407 +-0.0866603 0.10494 0.00737931 +-0.0457163 0.0345386 0.0341935 +-0.0466235 0.0548092 -0.0105711 +-0.0516722 0.0693248 0.037985 +-0.0826957 0.0898386 0.0312187 +-0.0154881 0.0758696 0.0561745 +-0.0518084 0.0913012 -0.0220555 +-0.0751346 0.145812 -0.00886348 +-0.0732189 0.155097 0.0278276 +-0.0127272 0.0348945 -0.0256797 +-0.0698308 0.071946 0.0353261 +-0.0657288 0.163321 -0.0189522 +-0.0464914 0.08757 0.0446532 +0.0296359 0.112746 0.0324848 +0.0275411 0.044881 0.0360262 +-0.0187772 0.186086 -0.0166294 +-0.0884282 0.0874635 0.00747939 +0.0325508 0.115423 -0.000329209 +-0.0410423 0.0336551 0.000178151 +-0.0638018 0.0632948 0.0265284 +-0.0224569 0.0524128 0.0435307 +0.057327 0.0700157 0.00587175 +0.0345611 0.0740948 0.0394254 +-0.0409173 0.0351021 0.0417247 +-0.0742127 0.154103 -0.0229066 +-0.0824094 0.151775 0.0307901 +-0.0803828 0.11899 0.049226 +-0.010458 0.0953808 -0.0330949 +-0.0630414 0.149018 -0.0195802 +-0.0293211 0.123712 0.0208659 +-0.0231795 0.0622145 0.0434152 +-0.0287301 0.172704 -0.00834509 +0.00364827 0.128043 -0.00393793 +-0.0642706 0.166732 -0.060237 +-0.0108397 0.175678 -0.0290324 +0.0244048 0.112688 0.0354614 +-0.047561 0.0361661 -0.0123414 +-0.0534987 0.0427392 0.045857 +-0.0231257 0.165273 -0.0171671 +0.0388181 0.104067 -0.00210374 +-0.0356652 0.156121 -0.0104266 +-0.072524 0.106883 0.0374001 +-0.0331471 0.172636 -0.0149853 +0.040265 0.0391745 0.017119 +-0.0342456 0.0708723 -0.0195447 +-0.0687416 0.11428 0.0497375 +-0.0559525 0.0473442 0.0115659 +-0.0244817 0.107102 0.0411704 +-0.00571075 0.0627939 -0.0354611 +0.00805559 0.124767 0.0327601 +-0.0144892 0.0800879 0.0568709 +-0.0444848 0.0775765 0.0423436 +-0.063261 0.129725 0.0418859 +0.0349031 0.111324 -0.00180439 +0.00654043 0.0954774 -0.0291051 +-0.0290961 0.0410008 0.0527549 +-0.0234218 0.0738847 0.0503501 +-0.0567453 0.0342237 0.02862 +0.0376516 0.0425419 0.0281451 +0.0336732 0.115326 0.0207292 +-0.0174938 0.122238 0.0311921 +-0.073145 0.152886 0.0338966 +0.0392908 0.0660103 -0.00977956 +-0.0671096 0.125666 0.0504247 +-0.0815589 0.10988 0.0387619 +-0.00472043 0.0655745 -0.0349603 +-0.0584923 0.0818911 0.043717 +0.0395145 0.0415874 0.025748 +-0.0134628 0.0989564 0.047529 +-0.086226 0.143316 0.0387173 +-0.0675131 0.145595 0.0418048 +-0.0142233 0.174199 -0.0261217 +-0.0564238 0.0718073 0.0399857 +-0.0748487 0.0664559 0.00653551 +0.0254329 0.0835701 0.0474102 +-0.0735012 0.145587 0.0437725 +-0.0684894 0.104161 0.0391613 +0.046334 0.0533506 -0.00578803 +0.0111342 0.034487 -0.019828 +-0.0362745 0.033679 0.00474125 +-0.0580289 0.129633 -0.0066561 +-0.0674348 0.171149 -0.0382253 +0.0172278 0.0353072 0.0394845 +0.0290523 0.120756 0.00899975 +-0.0788357 0.148682 -0.00186858 +-0.0257486 0.0365571 0.0540093 +-0.076603 0.120411 0.0526033 +-0.0107827 0.0784509 -0.0379132 +-0.0283013 0.0648191 -0.0294785 +-0.0318386 0.0929851 -0.0242124 +-0.0504991 0.156412 0.0101915 +0.0435836 0.0722927 0.0259867 +0.0187342 0.112585 -0.0153321 +-0.0434831 0.0762058 0.0427502 +-0.00415334 0.0367895 0.0481682 +-0.0469304 0.116649 -0.0154073 +-0.0434764 0.0335212 0.0034233 +-0.0527322 0.0723715 -0.0160877 +-0.0593593 0.0651443 0.0328932 +-0.05784 0.0926528 -0.0211082 +-0.07134 0.156839 -0.0007386 +-0.000856246 0.103081 -0.0226647 +-0.000582144 0.0347482 -0.0236897 +-0.0384944 0.0464446 0.0402202 +0.0567142 0.0522491 0.00518691 +-0.0616825 0.0346164 0.0411183 +0.00851655 0.0758606 0.0561295 +0.0196258 0.127091 0.0083394 +-0.0719446 0.159605 -0.0399328 +-0.0356475 0.0379034 -0.0136529 +0.0172444 0.125917 0.0260258 +0.0094903 0.116849 0.0377607 +0.0232634 0.124781 0.0210949 +-0.0349607 0.125018 0.0217662 +0.0185443 0.12732 0.00510228 +0.0118903 0.0349087 0.0279111 +-0.00450764 0.0842735 0.0572857 +-0.0148777 0.0364156 0.0513074 +-0.0861402 0.0859086 0.000475654 +-0.0472303 0.164057 -0.00679428 +0.010042 0.0970288 -0.0247384 +0.0134328 0.0846923 0.0528905 +0.0456558 0.0449086 0.0258493 +-0.00349992 0.0746709 0.0587938 +-0.0719223 0.112846 0.049279 +-0.0117304 0.0670858 -0.0365895 +-0.0107336 0.0670714 -0.0363227 +0.0281295 0.110111 0.0355841 +0.00524969 0.0395071 0.0332712 +-0.030417 0.0360576 0.0517185 +-0.0191865 0.172705 -0.0222871 +0.032634 0.0954843 -0.0150589 +-0.0901468 0.129651 0.0415795 +0.015143 0.0346779 0.0251566 +-0.0926446 0.122835 0.02928 +-0.0735699 0.131215 0.0516643 +-0.0342826 0.126777 0.01609 +0.00752119 0.0813632 0.0555605 +-0.0325031 0.116645 0.0321616 +0.0237641 0.0349876 0.0120857 +-0.0592101 0.142401 0.0336275 +0.0449966 0.0931749 0.00418165 +0.0373285 0.0874946 0.0364747 +0.0175277 0.0348888 -0.0135142 +0.0451983 0.0889806 0.0171667 +0.0123957 0.0434077 -0.0245497 +-0.0759299 0.126701 -0.00794305 +-0.0895421 0.090213 0.0124508 +0.0392717 0.0938049 -0.00924672 +-0.087269 0.112677 0.0244432 +0.0369017 0.0770479 -0.0128074 +-0.019615 0.127443 0.00679651 +-0.058632 0.131139 0.0380532 +-0.0759599 0.0675387 0.00855626 +-0.0867924 0.139107 0.00519652 +-0.051888 0.0528335 0.0130005 +-0.0604943 0.108372 0.0386396 +-0.0620497 0.155563 0.0244621 +-0.0414999 0.0690877 0.0417125 +-0.000194321 0.121911 -0.011267 +0.0260147 0.0563895 0.0427437 +-0.00627779 0.0395112 0.048561 +0.0073902 0.0433817 -0.0245369 +0.00650458 0.105723 0.0419107 +-0.0890324 0.144705 0.01118 +0.0241216 0.0968854 0.045587 +-0.0284948 0.111359 -0.0178892 +-0.0842319 0.104575 0.0266516 +-0.0575865 0.0586919 0.0194779 +-0.0281815 0.125725 0.0109634 +-0.0638193 0.158306 -0.0465978 +-0.0355455 0.11407 -0.0167228 +-0.0683421 0.111385 0.0423299 +-0.0144529 0.178665 -0.0210547 +-0.00977952 0.0372711 0.0498001 +-0.0625714 0.164724 -0.0395894 +-0.088699 0.0915828 0.0224195 +-0.0594754 0.144099 -0.00268098 +-0.0925679 0.116061 0.0213084 +-0.0317212 0.0350332 0.0489115 +-0.0106525 0.165176 -0.016643 +0.00734712 0.12316 -0.0106668 +-0.0554936 0.104327 0.041387 +0.00250176 0.0620246 0.0566613 +-0.00947595 0.130265 0.0133884 +0.0276842 0.0768145 0.0453329 +0.00629218 0.0639808 -0.0323017 +0.00798329 0.130466 0.00265255 +0.0573764 0.0621793 0.0248727 +-0.0628961 0.158419 -0.0175871 +-0.0639761 0.129691 -0.00851425 +-0.0630898 0.161515 -0.0224551 +-0.0838815 0.111187 0.0425305 +0.0464938 0.0778639 0.0121785 +-0.0265128 0.116639 0.0325108 +-0.0545075 0.047347 0.012948 +-0.0677458 0.149084 -0.0355035 +-0.0687437 0.173038 -0.0415702 +-0.0258142 0.0389536 0.0363636 +0.0354622 0.0808406 0.0390375 +-0.028407 0.156859 -0.0100656 +-0.0728523 0.100773 -0.0133449 +-0.000973441 0.0353569 0.0464761 +0.0217031 0.104101 -0.0182402 +-0.0900893 0.135135 0.0242145 +-0.0209098 0.0382599 0.00734769 +-0.0384975 0.0676842 0.0417259 +0.0505086 0.0461176 0.0032623 +-0.0324927 0.0932098 0.0444316 +-0.029469 0.17882 -0.00554327 +-0.0770271 0.0743283 0.0300122 +0.0313581 0.116535 0.0255569 +-0.0772285 0.173502 -0.0405421 +0.0114915 0.130592 0.00962923 +-0.0739058 0.125263 -0.00826143 +-0.0709356 0.0780686 0.0386829 +-0.0450603 0.156487 0.00667449 +-0.00258285 0.0361873 -0.0247048 +-0.00135222 0.101336 0.0444015 +-0.0894746 0.139279 0.0281819 +-0.00967152 0.0968708 -0.0306358 +-0.0704928 0.117562 0.0527864 +-0.0678494 0.155094 0.00351036 +-0.0752747 0.175704 -0.0425921 +-0.032145 0.0863362 -0.0265533 +-0.0345086 0.0775176 0.0416541 +0.0409071 0.0711839 0.0309718 +0.0182107 0.084868 -0.0280483 +0.037986 0.0861315 0.0356473 +-0.0158582 0.107196 -0.0215252 +-0.0536497 0.0382495 -0.0113033 +0.0400088 0.107038 0.00721094 +-0.0111671 0.0867859 -0.0382994 +-0.0758579 0.0963896 -0.0129621 +0.00275941 0.0343655 0.0174794 +-0.0528912 0.109829 -0.018387 +0.0352142 0.037348 0.0177424 +-0.0770086 0.090082 0.0382275 +-0.0537852 0.0344427 0.037794 +-0.0317722 0.0335835 -0.0256749 +-0.0533077 0.12062 -0.0114531 +-0.0670377 0.155239 -0.0519345 +0.0248201 0.0343822 0.00913252 +-0.077345 0.0838842 -0.0115833 +0.0143045 0.0638067 -0.0299257 +-0.00129201 0.123843 -0.0093277 +0.0380905 0.0941294 0.0341306 +-0.0932985 0.125478 0.0122618 +-0.034118 0.163722 -0.0147399 +0.0298704 0.114081 0.0310466 +0.0255132 0.110081 0.0370706 +-0.0476672 0.0405803 -0.0117113 +-0.0472716 0.130968 0.0245047 +-0.0619845 0.128209 -0.0080954 +-0.0644855 0.0917771 0.0443552 +0.00846054 0.0341727 0.000449307 +0.000942621 0.0347668 0.0167534 +-0.0160225 0.0958165 -0.0315688 +-0.0534556 0.0353304 0.0456783 +0.0142349 0.129723 0.0106274 +-0.0726014 0.0365856 0.00586956 +0.033081 0.038417 0.0236373 +-0.0678588 0.128454 0.0493479 +0.0276968 0.0797349 -0.0226793 +0.0317217 0.0639399 -0.0186866 +-0.00482566 0.0896201 -0.0359284 +-0.0704978 0.124601 0.053003 +-0.00149487 0.115594 0.0408235 +-0.0360812 0.0358497 0.0136623 +-0.00514848 0.0385788 0.00662082 +-0.0791696 0.110508 0.0441428 +-0.0215028 0.0448835 0.0530162 +0.0173223 0.0699836 0.0514025 +0.0379734 0.0672941 0.0355158 +-0.0858805 0.0926571 0.00145452 +0.00396412 0.0977772 0.0510597 +-0.0656399 0.11715 0.0490043 +-0.0771179 0.165222 -0.035974 +-0.0198829 0.0383003 0.00206982 +-0.0187849 0.159551 -0.0109781 +-0.0655235 0.0347285 0.0315692 +0.0298088 0.0848631 0.0431899 +-0.0202144 0.186446 -0.0187314 +-0.0737921 0.165213 -0.0399888 +-0.0287531 0.0767493 -0.0350292 +-0.0108764 0.178532 -0.0297831 +0.00248459 0.114158 0.0410016 +0.0523216 0.0588453 -0.00357691 +-0.0424144 0.147803 0.00244515 +-0.0387777 0.0827042 -0.0213153 +-0.0338762 0.105703 -0.0205658 +-0.087924 0.1365 0.0420055 +-0.0747046 0.0837005 -0.0145969 +-0.0657521 0.033742 -0.00672308 +-0.045381 0.0381676 -0.0212668 +-0.0868004 0.0846768 0.00848321 +0.0294149 0.118962 0.0248216 +-0.034174 0.107559 -0.0198979 +0.0280502 0.0740858 0.0440821 +-0.0776167 0.0914005 0.037394 +0.0235133 0.0407023 0.0389233 +-0.0568656 0.102623 -0.018982 +-0.0678684 0.063022 0.000880975 +0.0360361 0.100737 0.0329764 +-0.0922724 0.125575 0.0332589 +-0.0929242 0.120168 0.0332909 +-0.018498 0.108568 0.0416031 +0.0174435 0.128281 0.0160914 +-0.0242219 0.178615 -0.0196227 +-0.0704096 0.163806 -0.0479588 +-0.0810819 0.0814326 -0.00557353 +-0.0595808 0.0380953 -0.00917151 +-0.00023307 0.0988811 0.0510016 +0.00703854 0.0344034 -0.0150394 +-0.092972 0.125468 0.0112596 +-0.00348845 0.115565 0.0406522 +-0.000499736 0.11143 0.0424297 +-0.00349598 0.0562185 0.05401 +0.0274875 0.0380349 0.0264602 +-0.0191507 0.168261 -0.0198644 +-0.0708777 0.131245 0.0502751 +-0.0591241 0.1154 0.0371963 +0.015252 0.122005 -0.00948865 +-0.0238533 0.0958019 -0.0255967 +-0.0225065 0.111294 0.03935 +0.0394335 0.0834241 0.0342316 +-0.0599597 0.121237 0.0413621 +-0.0151227 0.160977 -0.0122661 +-0.0856126 0.0792275 0.0145081 +-0.0304111 0.0336116 -0.02356 +-0.0300276 0.0875944 -0.030572 +-0.0387164 0.0695709 -0.0161311 +-0.0658849 0.153363 -0.0443952 +-0.0108819 0.168382 -0.0176467 +0.0450682 0.090383 0.0171641 +-0.0624967 0.149081 -0.013576 +-0.0222042 0.178612 -0.0212581 +0.0294982 0.120461 0.0105965 +-0.0414977 0.115265 0.0337662 +-0.0499421 0.135837 0.0234945 +-0.0843142 0.152356 0.00793113 +-0.0410616 0.156231 -0.0095971 +-0.0238697 0.104438 -0.0232028 +-0.0067213 0.065597 -0.0353344 +-0.0108037 0.0827117 -0.0384206 +0.0138699 0.049008 0.0461763 +0.016266 0.0750624 -0.0291952 +-0.0813824 0.099165 -0.00657823 +-0.0355882 0.126454 -0.000576513 +-0.0627783 0.0343233 0.0272634 +-0.0864194 0.133874 0.0462429 +-0.0424946 0.0972875 0.0422451 +-0.00875136 0.116762 -0.015718 +-0.00610573 0.035829 0.0485597 +-0.0634859 0.146784 0.0381458 +0.00949393 0.109876 0.0399119 +-0.0286135 0.0817842 -0.0355888 +-0.0785092 0.126003 0.0529555 +-0.0564526 0.0602802 -0.00348733 +-0.0632263 0.153648 -0.0346156 +-0.0212315 0.0839098 0.0563274 +-0.0185478 0.0382321 0.00966598 +-0.0629734 0.126755 -0.00855487 +-0.0607657 0.139716 -0.00595313 +-0.0192289 0.178619 -0.0235673 +-0.0154933 0.0730227 0.0553537 +0.0208153 0.0564412 0.0475406 +-0.0390833 0.0486663 -0.0122287 +-0.065493 0.153273 0.0335324 +0.0608914 0.0637395 0.0141606 +-0.0153829 0.18014 -0.0206255 +-0.0822314 0.0842513 -0.00555381 +-0.0678037 0.0880304 -0.0174902 +0.0361089 0.0577094 0.0344737 +-0.0464121 0.035458 -0.0187253 +-0.0666201 0.0338653 0.00919115 +-0.0674808 0.0688292 0.0332504 +-0.0659293 0.156005 0.0129201 +-0.0294246 0.0861745 0.0444819 +-0.0581309 0.155502 0.017154 +-0.0726537 0.15621 0.0148854 +-0.0168438 0.180138 -0.0192059 +-0.0656741 0.0356447 0.0159226 +0.0163545 0.0507599 -0.025927 +-0.0293383 0.123554 -0.00265044 +0.00679991 0.131589 0.0107583 +-0.0398245 0.0942915 -0.0229995 +-0.0945717 0.122812 0.0182725 +0.00440363 0.0390362 -0.0241943 +-0.0798195 0.105901 -0.00558882 +-0.0117856 0.0813065 -0.0386038 +0.00749342 0.0372096 -0.0118978 +-0.0744971 0.176396 -0.0436946 +-0.00968478 0.0584187 -0.0340646 +0.0312312 0.117425 0.00123717 +0.0184875 0.0976002 0.0470854 +-0.0716235 0.0693585 0.0301698 +0.039816 0.0393083 0.00327619 +-0.0835287 0.11032 0.027366 +-0.0245014 0.043543 0.0534366 +0.0370893 0.106835 -0.00283087 +-0.0567623 0.154944 0.0190948 +-0.0275761 0.125766 0.0126577 +-0.00827698 0.0408222 0.049207 +0.0553826 0.0699889 0.0228528 +0.012476 0.0976634 0.0485624 +0.0597169 0.0580863 0.0181825 +-0.0261346 0.168251 -0.00989215 +-0.0319337 0.0680008 -0.0224492 +-0.0367004 0.0680804 -0.0157124 +-0.0192371 0.0959207 0.0497533 +-0.0482812 0.115062 -0.0157267 +-0.0625405 0.132491 0.039434 +-0.0464975 0.163768 0.00545168 +-0.0809296 0.0885877 0.0337432 +-0.0341216 0.0395911 0.0493113 +0.0322123 0.0856789 -0.0192748 +-0.0822934 0.0775365 0.000511811 +0.00709964 0.0342068 0.00386204 +-0.086438 0.0832915 0.00949498 +-0.0244616 0.0474336 0.050725 +0.00565547 0.0365592 0.0251573 +-0.0274618 0.045988 0.0503593 +0.010522 0.119127 0.036469 +-0.0736141 0.151246 -0.0348888 +-0.024687 0.0892375 0.0511394 +0.00296667 0.0390863 0.0277676 +-0.0494919 0.154959 0.0103413 +-0.058864 0.139321 -0.00549203 +-0.0327877 0.082138 -0.0285334 +-0.0423065 0.150496 -0.00548521 +-0.0631749 0.149 -0.0205832 +-0.0218319 0.0363367 -0.0187811 +-0.0723757 0.0638786 0.0154336 +-0.0358563 0.126885 0.000788129 +0.0192111 0.080597 -0.0276192 +-0.0620809 0.0336347 -0.00771095 +-0.0313625 0.0510794 -0.0143586 +-0.063822 0.115596 0.0429106 +-0.0645614 0.138204 0.0400205 +-0.0824235 0.124446 0.0510342 +0.0555936 0.0567472 0.0257684 +-0.0293723 0.0422984 0.0515712 +0.0526995 0.0702438 0.0035897 +-0.0647148 0.06349 0.0261636 +0.00450679 0.0702611 0.0557926 +-0.0421206 0.171253 -0.0079388 +-0.00823225 0.127328 0.0283641 +0.0085198 0.0716538 0.0557746 +-0.0603515 0.116839 0.0389782 +-0.0758447 0.151365 -0.0158827 +-0.0913489 0.117296 0.00730629 +-0.0787438 0.101744 -0.00857364 +-0.0758718 0.109158 -0.00765228 +0.0141976 0.0850086 -0.0301852 +0.0110282 0.0968851 -0.0245853 +-0.0821235 0.0802564 0.0295192 +-0.0500787 0.154631 -0.00525635 +-0.0278864 0.105837 -0.0222471 +-0.0355149 0.0804148 0.0426568 +0.0156112 0.0519525 0.0469795 +-0.0758417 0.114903 -0.00554375 +-0.00130995 0.124776 -0.00834251 +-0.0285122 0.180211 -0.00692909 +0.0124807 0.0949598 0.0504131 +-0.0679136 0.113718 -0.0102762 +-0.0871543 0.105024 0.0183639 +0.0375648 0.0926236 -0.0120119 +-0.0297787 0.125132 0.0177406 +-0.0253546 0.121816 0.0267508 +0.0463872 0.0806547 0.00917972 +-0.0386145 0.0492284 -0.011639 +-0.0604969 0.0918487 0.0452694 +-0.0754744 0.151328 -0.022882 +0.0184783 0.101734 0.0458501 +-0.0250671 0.0385158 0.031526 +-0.0384759 0.091717 0.0434324 +-0.0394992 0.0916803 0.0429883 +-0.0668335 0.143964 0.0420823 +-0.0653424 0.0629827 0.0247148 +-0.0644392 0.112372 0.0382632 +0.0242087 0.039076 0.0343007 +-0.0535427 0.0402957 -0.0106063 +-0.082326 0.0748249 0.00451639 +-0.0544972 0.0959632 0.0436086 +-0.020823 0.0868434 -0.0377816 +-0.0636947 0.167813 -0.0415938 +-0.0448731 0.128505 0.000263047 +-0.0608825 0.0996865 -0.0185327 +0.0079329 0.0630739 0.055296 +0.00434495 0.0973121 -0.027058 +-0.091323 0.113292 0.0153266 +-0.0074977 0.0801462 0.0578122 +-0.0899881 0.118599 0.00429898 +-0.072593 0.155911 0.00171291 +0.00944326 0.128939 -0.000930002 +-0.0669203 0.110822 0.0381745 +-0.0378406 0.0957387 -0.0228102 +-0.00994641 0.0339021 -0.0251924 +-0.0261195 0.0706905 0.0432458 +0.0285346 0.121033 0.017364 +-0.0702811 0.17421 -0.0421289 +-0.00949024 0.104446 0.0436658 +-0.0877186 0.105023 0.0153645 +0.0487537 0.043125 0.0102298 +-0.0709615 0.148056 -0.0324394 +-0.0785455 0.146115 0.0422588 +-0.0777749 0.150053 -0.00387978 +-0.0747481 0.158885 -0.00783629 +0.022966 0.0347513 0.0194226 +-0.000497806 0.0842866 0.0575088 +0.0329127 0.116986 0.00902312 +0.0303386 0.119339 0.00661655 +0.0335365 0.0483507 0.0312493 +-0.0506321 0.0530807 0.0328365 +-0.0283907 0.123379 0.0211752 +0.043167 0.0831963 -0.0047762 +-0.00976599 0.121876 -0.011136 +-0.0836817 0.0786288 0.0214472 +-0.0584699 0.0344613 0.0385122 +-0.031399 0.116965 -0.0137545 +-0.0679334 0.145349 0.0422649 +0.0355447 0.11347 0.012835 +-0.0343438 0.0384811 -0.00836679 +-0.0303159 0.0678299 -0.0274662 +0.030827 0.0835413 0.0428747 +-0.0367713 0.0871639 -0.0235593 +-0.0249824 0.117062 -0.0139085 +-0.0633873 0.169402 -0.0465883 +-0.0567938 0.0498747 0.00808849 +-0.0719281 0.148635 -0.0350398 +-0.0764024 0.150045 -0.00692327 +-0.085242 0.115675 0.000251725 +0.0352163 0.0367258 0.0146563 +-0.0476332 0.0345872 0.0389835 +-0.0306482 0.0819602 -0.032565 +-0.0258283 0.172717 -0.011167 +-0.0745076 0.115686 0.0517763 +-0.0625234 0.0413191 -0.00677899 +-0.02745 0.110307 -0.0187882 +-0.0444951 0.104328 0.0415155 +-0.0774643 0.155549 -0.0139037 +0.0154943 0.105779 0.0433144 +-0.00688511 0.0982482 0.0516445 +-0.0476227 0.122378 -0.0113753 +-0.0830725 0.139367 0.045586 +-0.0431901 0.039319 -0.0232745 +0.00551778 0.0828244 0.0566316 +-0.0364708 0.152123 0.0014574 +-0.00749897 0.0815283 0.0577578 +-0.0165021 0.118207 0.0361456 +0.013481 0.0358562 0.0436245 +0.0102178 0.0836927 -0.0316174 +0.0514697 0.0462224 0.00523719 +0.0399822 0.0910991 -0.010396 +-0.0510223 0.0339346 0.00874224 +-0.0327803 0.0793117 -0.0285199 +0.0549936 0.0732019 0.0123756 +0.0461994 0.0750316 0.00518987 +0.0371924 0.0391306 0.0220088 +-0.0737191 0.152664 -0.0318934 +-0.0548531 0.149577 0.0276913 +-0.00305215 0.125834 0.0316944 +-0.021742 0.0389771 0.0371835 +0.0252695 0.0532659 -0.021679 +-0.0633235 0.0388939 0.025715 +-0.053898 0.105542 -0.0189379 +-0.0718855 0.122345 -0.00846405 +-0.0334848 0.0561021 0.0379001 +-0.0635384 0.061476 -0.00191873 +0.0137785 0.0346695 0.0230735 +0.0204936 0.1267 0.00866396 +-0.0258672 0.156547 -0.00846874 +-0.089402 0.0996815 0.0144017 +-0.010288 0.172711 -0.0218803 +0.00772266 0.115023 0.0394097 +-0.0363729 0.176071 -0.00683571 +-0.0525546 0.0444744 -0.00849373 +-0.0577063 0.155408 0.0158579 +-0.0512663 0.12652 -0.00563382 +-0.0277699 0.0661915 -0.0304661 +-0.0394907 0.0422995 0.0416287 +-0.0592646 0.0346371 0.0433189 +-0.0917594 0.117442 0.030311 +0.0188028 0.0349604 -0.00569856 +-0.0184644 0.0528818 0.0482087 +-0.0649365 0.1467 -0.0209465 +-0.0397769 0.152293 -0.00702124 +0.056742 0.0696177 0.0218717 +0.0435205 0.0637429 0.0281056 +0.0514429 0.0626408 -0.00275857 +-0.0668197 0.100942 -0.0159632 +-0.078886 0.0812827 -0.00855752 +0.0483563 0.0710513 0.00477309 +-0.0415729 0.151549 -0.00635576 +-0.0122139 0.169818 -0.0178463 +-0.0454996 0.163749 0.00555272 +-0.0779251 0.168693 -0.0322923 +-0.0455017 0.0973341 0.0429686 +-0.0932761 0.122751 0.0112823 +-0.00193792 0.0388572 0.00152241 +0.0379602 0.108292 0.00117706 +0.0447742 0.0777119 -0.00080388 +-0.0365645 0.0341557 0.0276322 +-0.077566 0.155252 0.0102497 +-0.00781043 0.0346187 0.0439246 +0.0218954 0.061892 0.0473866 +0.0229726 0.108506 -0.0149598 +0.0350891 0.111006 -0.00183676 +0.00866181 0.128565 0.0271896 +0.00435977 0.0481043 -0.0288152 +-0.00551112 0.0390255 -0.00865823 +-0.0205328 0.113457 -0.0181494 +-0.0851368 0.0832799 0.0224738 +0.00348766 0.115539 0.0402625 +-0.0174898 0.105786 0.0424611 +-0.087451 0.133828 0.0444349 +0.00492538 0.111581 -0.020193 +0.0318279 0.0713659 0.0407221 +-0.0121811 0.0984293 0.0498089 +-0.0747959 0.149331 0.0394056 +-0.0571923 0.0344404 0.0353306 +0.0154304 0.0417921 -0.0229429 +-0.0481114 0.159106 -0.00699154 +-0.0285 0.0960446 0.0448096 +0.0354946 0.0642547 -0.0137843 +-0.0204882 0.0388257 0.0339872 +0.0353716 0.0741014 0.0388421 +-0.0157653 0.161968 -0.0148041 +0.00551566 0.0799926 0.0558154 +0.0181043 0.128017 0.0106305 +-0.0644854 0.0986987 0.0423063 +-0.0415014 0.0492193 0.0396812 +-0.0900528 0.132428 0.0342227 +-0.0126494 0.0496668 -0.0310907 +-0.0321289 0.0337822 0.0109163 +-0.0625403 0.149101 -0.00657536 +-0.0124899 0.104431 0.0434394 +-0.0728072 0.15012 0.0385587 +-0.0275374 0.156717 -0.00957418 +-0.0627683 0.04307 0.0276693 +0.00651507 0.0344231 0.0163793 +-0.0631947 0.163133 -0.0265887 +-0.0264832 0.105687 0.0411729 +0.0072963 0.0341516 -0.018557 +-0.018657 0.109944 -0.0204332 +-0.0843505 0.0842533 0.0274024 +-0.0531944 0.139931 -0.000456373 +-0.0741436 0.100877 0.037779 +-0.0658548 0.0952898 -0.0176963 +-0.0504071 0.163936 0.00393123 +-0.00384396 0.0384339 0.019723 +-0.0889438 0.137894 0.0261932 +-0.017832 0.0346972 0.047013 +0.0156145 0.128768 0.00543431 +-0.0517309 0.0489114 0.0216412 +-0.0358204 0.046598 -0.0238768 +-0.059344 0.139552 0.0335155 +0.0510761 0.0567889 0.0297952 +-0.0787812 0.166656 -0.0319662 +0.030718 0.111397 0.0323042 +0.0535299 0.049514 0.0226619 +-0.0446433 0.0346533 0.0343218 +-0.0169852 0.186593 -0.0230311 +-0.0743965 0.149892 -0.0310959 +-0.0373231 0.0354917 0.0439186 +-0.000691629 0.100255 0.0478272 +-0.0818959 0.141783 0.000186922 +-0.0304023 0.0382885 -0.00186367 +-0.00349386 0.0925503 0.0560196 +-0.088924 0.151541 0.0211005 +-0.0824519 0.0856305 -0.00554258 +0.0469336 0.0511672 0.030779 +-0.0852791 0.132127 -0.000702015 +-0.0891862 0.112803 0.0347042 +0.0229651 0.0928857 0.047441 +-0.0442655 0.127665 -0.00291939 +-0.0917744 0.132406 0.0242297 +0.00738689 0.0359942 0.0260187 +0.0456627 0.0890114 0.0111648 +-0.0860966 0.11232 0.0268196 +-0.0556879 0.117086 -0.0137514 +0.0093902 0.0739182 0.0557875 +-0.0794167 0.137236 0.0495785 +-0.0893497 0.130881 0.0042394 +-0.0656682 0.0337431 0.00949839 +-0.0263524 0.059005 -0.029433 +0.0104643 0.0346107 -0.00703394 +-0.0631576 0.119928 0.0457283 +0.0423355 0.0972587 0.0241615 +0.0603447 0.0595379 0.00916361 +0.0495034 0.0488243 -0.00166079 +-0.0740753 0.155198 0.0041876 +-0.0656926 0.125639 0.0489587 +-0.00648958 0.0503786 0.0513549 +0.0381951 0.102007 0.0289909 +-0.0592102 0.0595951 0.00211544 +0.0285202 0.0622348 -0.0207982 +-0.0876555 0.144675 0.00917716 +0.0519851 0.0567984 0.0293579 +-0.0300707 0.124739 0.00148409 +-0.0725865 0.0874189 0.0409577 +-0.00281209 0.0882041 -0.0358187 +-0.0637344 0.0736795 -0.0161836 +0.0142616 0.0794232 0.0540604 +0.0458875 0.0787805 0.0205292 +0.0245051 0.0849065 0.0478503 +-0.0617895 0.083881 -0.0194032 +0.0333636 0.0364347 0.0163708 +0.0165102 0.111269 0.0389693 +0.033894 0.111352 0.0280456 +-0.00616098 0.0344967 -0.0177303 +-0.0662325 0.14347 -0.0127636 +-0.0199914 0.0962147 -0.0280142 +-0.0259005 0.126064 0.0117956 +-0.0929641 0.121523 0.0342815 +0.00656148 0.101677 0.0461619 +-0.0600389 0.0627348 0.027804 +0.0335486 0.0889696 0.0416029 +-0.0688127 0.0908552 -0.0166124 +-0.0856608 0.0854539 0.0244177 +-0.0759458 0.0974591 -0.0125133 +-0.0667171 0.171901 -0.0422833 +-0.0191016 0.0431933 0.0528315 +-0.0589426 0.0357407 0.0458703 +0.013481 0.127543 -0.00145794 +-0.0239185 0.0383353 -0.00428996 +-0.0627701 0.0824471 -0.0192325 +-0.0614696 0.136692 0.0357094 +-0.0810116 0.0734375 0.0175497 +-0.0759173 0.12523 -0.00781198 +-0.00824401 0.0384507 0.0170014 +-0.0641628 0.157463 -0.0125984 +-0.0178575 0.122517 -0.00769635 +-0.0596856 0.0659756 -0.00895149 +-0.0807952 0.106052 0.0302403 +0.0156574 0.0925729 -0.0260099 +-0.081817 0.0734713 0.00853447 +-0.052947 0.1293 -0.00466978 +0.0313864 0.0929268 0.0420114 +-0.0242749 0.174204 -0.0124276 +-0.0678958 0.0610238 0.00808464 +-0.0477867 0.135371 0.0169352 +-0.0514248 0.0500855 0.0140283 +0.0463863 0.075041 0.00619921 +-0.0120829 0.121468 -0.0106691 +0.0474936 0.0651497 0.0284001 +-0.0370341 0.127886 0.0121304 +-0.0240288 0.0385625 0.0316972 +0.0484803 0.0651161 -0.0012457 +-0.0516556 0.0569841 0.0295138 +-0.0639861 0.131146 -0.00837414 +-0.0504965 0.087636 0.0455301 +0.03603 0.0808066 0.0380541 +-0.0869174 0.117103 0.00125292 +-0.0617229 0.155313 -0.01958 +-0.0631289 0.15403 -0.0107687 +0.00528045 0.114267 -0.0191116 +-0.0639453 0.167747 -0.0398404 +0.0288613 0.0520696 0.0379853 +-0.0623548 0.166257 -0.0465894 +0.000543528 0.123331 0.0344653 +0.0375704 0.0618629 0.0348997 +-0.0391935 0.128299 0.00543562 +-0.0593991 0.0472653 0.0079341 +-0.0244003 0.0390404 0.0383653 +-0.0676508 0.0338326 0.0090061 +-0.0292136 0.07193 -0.032514 +-0.0374976 0.0861098 0.0439188 +0.0247244 0.0549721 0.0426251 +-0.0892169 0.151457 0.0141575 +-0.02429 0.121354 -0.00839434 +-0.0618416 0.098205 -0.0180486 +-0.0320742 0.0383234 -0.000421092 +-0.0488761 0.107007 -0.0192731 +-0.0476462 0.123357 -0.010393 +0.0220922 0.12286 0.0278182 +-0.00150357 0.0647954 0.0567431 +0.000502823 0.0870298 0.0569751 +-0.0581295 0.0643065 0.0321224 +-0.0188005 0.0568615 0.0490899 +-0.0794271 0.0732336 0.00151817 +0.019219 0.0848258 -0.027423 +-0.0344972 0.116614 0.0320154 +0.000192029 0.0811649 -0.0359709 +-0.0741702 0.0968478 0.0394202 +0.00621596 0.083814 -0.033411 +-0.0671177 0.159814 -0.0107973 +-0.0187526 0.0641914 -0.0363857 +0.0556876 0.0493473 0.0181935 +-0.0364983 0.059104 0.0398977 +-0.071802 0.181053 -0.0556554 +-0.0116602 0.168404 -0.0170453 +-0.0478952 0.0713156 0.0406183 +0.0354015 0.0476244 -0.00628637 +-0.0262003 0.0750789 0.0460261 +-0.0550327 0.0674609 0.0370807 +-0.0565425 0.0415574 -0.00871771 +-0.0546448 0.115434 0.0349037 +-0.0682182 0.15577 -0.00101225 +-0.066899 0.132617 0.0454244 +-0.0743656 0.172848 -0.0365047 +-0.0734703 0.155395 0.00293075 +-0.0125152 0.0589286 0.0534547 +0.00233104 0.0554199 -0.0313859 +-0.0805618 0.101855 -0.00659893 +-0.0537592 0.0797599 -0.020636 +-0.0237797 0.125538 0.0184413 +-0.0508814 0.161419 0.0066624 +-0.0742588 0.0655235 0.0100016 +0.0457502 0.0805926 0.00319942 +-0.0764848 0.142819 0.0460732 +-0.0442438 0.113637 -0.0162318 +-0.00550074 0.0870334 0.0571343 +-0.059876 0.0997119 -0.0187764 +-0.069062 0.149033 -0.0371338 +-0.0598711 0.154188 0.0296083 +-0.044481 0.0973337 0.0428134 +0.0255359 0.118038 0.0305151 +-0.000498881 0.112805 0.0421187 +-0.073083 0.0981963 0.0397086 +-0.0766217 0.068534 0.0175211 +-0.038773 0.11398 -0.0166127 +0.0194763 0.0837958 0.0507486 +-0.0809353 0.145916 -0.000819165 +0.0301953 0.0476864 0.0346108 +-0.0284906 0.0932063 0.0444855 +-0.071967 0.162417 -0.0419522 +-0.0647895 0.0838376 -0.0190209 +-0.00994817 0.0389455 -0.0113423 +0.00268547 0.035256 0.0455248 +-0.0587181 0.0481161 0.00163754 +-0.0537032 0.140954 0.0276054 +-0.0166811 0.0377146 -0.0171581 +-0.0896263 0.0969991 0.0154111 +-0.0475653 0.166962 -0.00492463 +-0.0684985 0.0986495 0.0414678 +0.0399619 0.0730961 -0.00981181 +-0.0433911 0.121364 -0.0123522 +-0.0619851 0.167813 -0.0525933 +-0.0768904 0.0733563 0.0291265 +-0.058879 0.104045 -0.0185386 +-0.0154965 0.0573571 0.0513792 +-0.0115598 0.09531 -0.0330219 +-0.0335104 0.125389 -0.00127044 +0.0292004 0.119729 0.0233163 +-0.0141909 0.171251 -0.024451 +0.00225805 0.0711729 -0.0343766 +0.000838494 0.130009 0.0243594 +-0.0186635 0.0360947 0.0525267 +0.0441946 0.0874765 -0.00278813 +-0.0347028 0.122731 -0.00776716 +-0.0478246 0.129609 0.027299 +-0.0784918 0.144814 0.0436628 +0.020477 0.0989516 0.0463466 +-0.0870404 0.113136 0.0295379 +0.012093 0.120504 0.0352323 +0.00825492 0.0739666 -0.0336091 +0.00112807 0.104475 -0.0219821 +-0.0142621 0.120334 -0.0114431 +-0.0507965 0.0345143 0.033135 +0.0311896 0.0857114 -0.0197343 +-0.0894234 0.0956355 0.01542 +-0.0775093 0.0961888 -0.0115304 +-0.0358262 0.0929298 -0.0238031 +-0.0774962 0.131676 0.0527303 +-0.0421326 0.160667 -0.0107094 +-0.0276983 0.125752 0.00966815 +-0.045336 0.129618 0.020889 +-0.00368188 0.0613041 -0.0346439 +-0.0748644 0.171601 -0.033829 +-0.0207882 0.0770942 -0.0390427 +-0.044533 0.160785 0.0064482 +-0.0789135 0.0799145 -0.00757704 +-0.0700794 0.154941 0.0289273 +-0.0313268 0.0609036 -0.0184352 +-0.0853384 0.107683 0.0213404 +-0.0624789 0.152144 -0.0275875 +-0.0427656 0.0797392 -0.0197597 +0.00722196 0.0865913 -0.0328221 +-0.0720619 0.109399 0.0395074 +-0.0911632 0.132299 0.00922827 +-0.00610552 0.129863 0.0232869 +0.02524 0.115374 0.03316 +0.00541955 0.0912903 -0.0327619 +0.00896308 0.0344141 -0.00340754 +-0.0356782 0.0636593 -0.0138055 +-0.0555057 0.153886 0.023914 +0.0207355 0.0349558 0.0059225 +0.0360179 0.0848402 0.038086 +-0.0488433 0.098515 -0.0220378 +-0.0633934 0.178218 -0.0607118 +-0.0846638 0.0778105 0.0155166 +0.0437393 0.0720229 -0.000789276 +-0.0288953 0.122588 -0.00566495 +-0.025973 0.0851197 0.051146 +-0.0782416 0.0913778 0.0366028 +-0.0494978 0.0960237 0.0444817 +-0.0785831 0.0731535 -0.00247436 +-0.0698391 0.165209 -0.0499791 +-0.0586839 0.0335669 0.00570948 +-0.0610591 0.155387 0.024814 +-0.0642828 0.163385 -0.0227384 +-0.0658667 0.0334936 -0.00108817 +0.037341 0.0888457 0.0365275 +0.02301 0.0347163 0.00286296 +-0.0590207 0.126708 -0.0075139 +0.0463679 0.0792556 0.0081871 +-0.00960203 0.0406207 -0.0262166 +-0.0771598 0.160359 -0.0157997 +-0.0425011 0.163766 0.00491011 +-0.00971544 0.177216 -0.0294611 +0.021747 0.102101 0.0439088 +-0.087802 0.139216 0.0403868 +-0.0694557 0.0421945 0.00370163 +0.0173244 0.0580274 -0.0281164 +-0.011686 0.178646 -0.0240587 +-0.0245154 0.158144 -0.00224812 +0.021637 0.0948486 -0.0224193 +0.00951901 0.0504027 0.0504431 +-0.0252093 0.112572 -0.0171753 +-0.0736758 0.108402 0.0380105 +-0.0551152 0.0341599 0.0272668 +-0.0462814 0.155049 0.00841735 +-0.0164865 0.0730277 0.0553332 +-0.0853981 0.109039 0.0213496 +-0.0817879 0.0734817 0.0075372 +-0.0543644 0.15733 0.00977334 +-0.0391365 0.0406682 0.0418102 +0.00445432 0.130749 0.00275136 +0.0247455 0.105845 -0.0161092 +-0.0554962 0.0904299 0.0451691 +-0.00849692 0.0731924 0.0575239 +-0.0665361 0.11864 0.0512424 +-0.0771905 0.152834 -0.00389169 +-0.0684956 0.0958684 0.0422138 +-0.086559 0.0806364 0.0135028 +-0.065258 0.156162 0.0146042 +-0.0134788 0.105828 0.0432751 +-0.00273284 0.0712345 -0.035418 +0.0276777 0.0972525 -0.0189451 +-0.0768441 0.113421 -0.00459179 +-0.0291819 0.174148 -0.0171874 +-0.0392913 0.0344977 0.0373408 +-0.00249868 0.0965524 0.0536599 +-0.026518 0.10985 0.0386071 +-0.0272212 0.114809 -0.0155223 +-0.0617195 0.0669875 0.0343055 +-0.0824261 0.101938 -0.00456304 +-0.0889571 0.0955775 0.00843273 +-0.0288529 0.100117 -0.0233232 +-0.0899265 0.130893 0.00523191 +-0.0346189 0.112824 -0.0174204 +-0.0154754 0.111334 0.0410203 +-0.053649 0.0335392 -0.00958395 +-0.000215874 0.126274 0.0312521 +0.00810763 0.0366956 0.0273459 +-0.0915032 0.133721 0.0182157 +0.0193574 0.0537071 -0.027254 +-0.0617049 0.070743 -0.0146345 +-0.0745149 0.121791 0.0533186 +-0.070524 0.0682803 0.0295828 +-0.0206697 0.0697068 0.051972 +-0.0918785 0.141976 0.0181723 +-0.0408421 0.0345979 0.00840679 +-0.0738542 0.15551 0.00718209 +0.0055205 0.0427186 0.0455303 +-0.065431 0.168513 -0.0346313 +0.0194077 0.0659 0.0490938 +-0.0485039 0.0876217 0.0453743 +-0.0622817 0.0458517 0.0346831 +0.0349983 0.0362655 0.0094693 +-0.0912374 0.140583 0.0161703 +-0.0884146 0.113764 0.0250911 +0.0142472 0.0860448 0.0523279 +-0.0131413 0.127389 -0.000900164 +0.0289187 0.0580129 -0.0187889 +0.00423189 0.0768627 -0.0347545 +0.0204663 0.0385832 -0.00969847 +-0.0217971 0.0348633 0.0460203 +-0.0864575 0.101794 0.0247295 +0.00132582 0.0568889 -0.0321653 +-0.0697484 0.0793376 -0.0160307 +-0.0845391 0.102087 -0.000621587 +-0.0733924 0.0656461 0.018954 +-0.0391909 0.0342717 0.0287528 +-0.065551 0.112475 0.040245 +-0.0628947 0.161497 -0.0505862 +-0.0455612 0.125305 -0.00846085 +0.0204165 0.110729 -0.0153427 +-0.0119941 0.16759 -0.0225943 +-0.0778434 0.153328 0.00140062 +-0.0743032 0.152688 -0.027892 +-0.0719627 0.134048 -0.00796724 +-0.0322554 0.0722092 -0.0264952 +-0.0689145 0.123836 -0.00886831 +-0.0292201 0.0564848 -0.022383 +-0.0336564 0.0343441 0.0369141 +0.0587559 0.0579922 0.0215357 +0.0331644 0.1138 0.0262385 +0.0155789 0.125536 -0.0032763 +-0.0511913 0.034459 0.0313456 +0.0336899 0.0357287 0.00969367 +0.0540437 0.0734433 0.0120297 +-0.0588961 0.106893 -0.0176578 +-0.0158316 0.18484 -0.0207268 +0.0120317 0.0342138 -0.0138856 +0.0335354 0.0380053 0.0222769 +-0.0118847 0.117889 -0.0148923 +0.00991822 0.0342953 -0.00310719 +0.00806259 0.0342288 -0.0204182 +-0.00962665 0.0384388 0.00947704 +-0.00349166 0.0534503 0.0541192 +0.0248931 0.108132 -0.0145556 +-0.0355172 0.106999 0.038376 +0.0298839 0.118971 0.0235707 +-0.0896201 0.0969823 0.0124196 +0.00795856 0.126912 0.0298215 +-0.0734288 0.149863 -0.0358672 +-0.0513643 0.132495 0.031006 +-0.056967 0.0535025 0.000612409 +-0.0226813 0.0349023 0.0509736 +0.0573538 0.0634191 0.00214341 +-0.0178849 0.0387376 -0.0108688 +-0.0690262 0.170476 -0.0316587 +-0.0162544 0.183109 -0.0200888 +-0.0569078 0.052097 -0.000371255 +-0.0845703 0.11062 0.0357089 +0.035496 0.0454077 0.0303438 +-0.00267498 0.100539 0.0471075 +-0.080721 0.0845507 0.0336553 +-0.0900133 0.150126 0.0131697 +-0.0628916 0.0631016 0.0268901 +-0.0739067 0.163816 -0.0379732 +-0.0313311 0.0487062 0.0434625 +-0.036476 0.0533606 0.0387027 +-0.0636484 0.15559 0.00937973 +0.0135801 0.0874029 0.0531363 +-0.0259964 0.0967524 -0.0245741 +-0.0665286 0.168031 -0.0580342 +-0.0794099 0.141428 0.0463829 +-0.0496093 0.0334738 -0.00871292 +0.0373859 0.082128 0.0365587 +-0.00650329 0.0547609 0.0534371 +0.0253836 0.0503366 -0.0210264 +-0.00332845 0.128773 0.0271941 +0.0363318 0.0601344 -0.0117401 +-0.0258635 0.103016 -0.0235702 +-0.0251408 0.168241 -0.0184358 +0.018845 0.0956057 -0.0232473 +-0.0712372 0.167165 -0.0209901 +-0.0759412 0.151358 -0.0178788 +-0.0784019 0.152013 0.0336008 +0.000968412 0.0391138 -0.00557511 +-0.0865136 0.106289 0.0083757 +-0.0623969 0.0335761 0.00673913 +-0.0769787 0.135423 -0.00568624 +0.021851 0.0591836 0.0473037 +-0.0524335 0.115217 0.0341034 +-0.0884925 0.144689 0.01017 +-0.0774954 0.147028 0.0416906 +0.00429953 0.0340852 0.0162355 +-0.0489061 0.0346101 0.0421693 +-0.0377668 0.0812615 -0.0209367 +-0.0321125 0.0496937 -0.0183514 +-0.00333701 0.121977 -0.0113118 +-0.063853 0.129717 0.0428324 +0.0122687 0.0724051 -0.0314733 +-0.0295052 0.113904 0.0347936 +0.0428284 0.0676747 -0.00179274 +-0.0665096 0.0944832 0.0425185 +-0.0324964 0.117987 0.0309791 +-0.0240568 0.0972281 0.0446316 +-0.0729302 0.128204 -0.00868672 +-0.0930613 0.118852 0.0392987 +-0.0179932 0.0940702 -0.0337993 +-0.0276364 0.0917699 -0.0296042 +0.0270825 0.114018 -0.00875387 +-0.0701334 0.160982 -0.047936 +0.0160414 0.0343167 -0.00190332 +-0.0407181 0.0336157 0.00208844 +0.0537368 0.0581963 0.0283843 +0.0459393 0.0792136 0.00418579 +0.00219887 0.0866713 -0.0341557 +-0.0874475 0.125307 -0.000719081 +0.0171658 0.0974165 -0.0229214 +-0.0555243 0.0344634 0.0339194 +0.00337546 0.131746 0.0137901 +-0.037361 0.155079 0.00374727 +-0.00966712 0.0394179 0.0374824 +0.0401633 0.102703 -0.00178896 +-0.0792807 0.167978 -0.037009 +0.0137845 0.0344 -0.00993851 +-0.0224906 0.034851 -0.0281799 +-0.0815485 0.124491 0.0516101 +0.0440694 0.0973609 0.0121636 +-0.0361101 0.0351289 -0.0167641 +-0.0672139 0.168667 -0.0295504 +0.00726635 0.0696573 -0.0326992 +-0.0474987 0.0987688 0.0431343 +-0.0879643 0.115809 0.00328051 +0.0212116 0.083355 -0.0266295 +-0.0413155 0.0345032 0.0369079 +-0.0830031 0.148729 0.00315098 +-0.0365029 0.0818729 0.0434567 +-0.0265303 0.0632322 0.0390504 +0.0560084 0.0549549 0.0021707 +-0.00162661 0.100486 0.0474782 +-0.00782745 0.0882395 -0.0367822 +-0.0874416 0.113109 0.00532366 +-0.0755108 0.126011 0.0529241 +0.0317406 0.107408 0.0337947 +-0.0280888 0.121741 0.0242898 +-0.0114519 0.126605 -0.00415103 +-0.00942316 0.129915 0.019193 +0.0305901 0.117314 -0.000462026 +-0.00449008 0.116939 0.0397737 +-0.0174829 0.0365879 0.0522725 +-0.0480399 0.136313 0.0145941 +0.0078895 0.0386539 0.0453509 +-0.059976 0.125502 0.0413668 +0.00922467 0.131237 0.0102208 +-0.0164537 0.0924837 0.0552632 +-0.0397063 0.0680709 -0.01554 +0.0144891 0.0990552 0.047648 +-0.0194892 0.0771957 0.0553527 +0.00314961 0.0344334 0.00286196 +0.0322227 0.0828447 -0.0192606 +-0.086166 0.115735 0.00128445 +-0.0628659 0.161473 -0.0525859 +-0.0897633 0.133813 0.0392039 +-0.0931113 0.126933 0.0272608 +0.0442448 0.0902943 -0.00180307 +0.0383075 0.041189 0.0258499 +-0.038679 0.0636652 -0.0136088 +-0.0640888 0.165507 -0.029848 +0.00695321 0.13108 0.0193768 +-0.0281007 0.162292 -0.0150733 +0.0192374 0.0749637 -0.0278698 +0.0244608 0.0941673 -0.021671 +0.0131476 0.100265 -0.0227775 +-0.0301385 0.166718 -0.0165418 +-0.0651412 0.159482 -0.0565006 +0.0342867 0.0700233 0.0389954 +-0.0695171 0.141232 -0.00845814 +-0.0904292 0.148866 0.0241237 +-0.0253439 0.0693349 0.0439513 +-0.0623474 0.166249 -0.0485903 +-0.0193027 0.0445534 0.0525624 +-0.0258791 0.105846 -0.022482 +-0.0331634 0.0381954 -0.000525199 +-0.0640739 0.0617863 -0.0011495 +0.0413993 0.0942972 -0.00577735 +-0.030183 0.155051 -0.00785968 +-0.0209835 0.159643 -0.00415092 +0.0227131 0.118044 0.0330191 +-0.0268485 0.124528 0.000469072 +-0.0241773 0.17417 -0.0202285 +-0.012912 0.0339283 -0.0204101 +0.0235417 0.109895 0.0378397 +-0.0800641 0.107437 0.0308747 +-0.0374695 0.0383458 -0.0088734 +0.0372523 0.0646113 0.0362056 +-0.0324907 0.0817336 0.0416408 +0.0138217 0.125251 -0.00497301 +-0.0427639 0.126553 -0.0057736 +-0.0467249 0.0753156 -0.0175399 +-0.0861037 0.109061 0.0193453 +0.0206619 0.0348672 0.0224824 +-0.0804996 0.127434 0.052885 +0.00919876 0.0964636 -0.0261302 +-0.0321423 0.0806683 -0.0305334 +0.0242996 0.120934 0.0286395 +-0.0429021 0.171269 -0.00696466 +0.0145253 0.126603 0.0278836 +-0.0657391 0.142564 -0.0101503 +-0.0125598 0.0943837 -0.0340846 +-0.0809608 0.0720856 0.0135459 +-0.0230054 0.0386784 -0.0118395 +-0.0234022 0.157317 -0.0083471 +-0.0700956 0.06197 0.00856658 +0.0361469 0.0875521 0.038321 +-0.00703497 0.101085 0.0445106 +-0.0217097 0.181473 -0.0209735 +-0.0310875 0.179405 -0.00921261 +0.00340822 0.117733 -0.0168392 +-0.0306641 0.062253 -0.0214244 +-0.00851812 0.0604987 0.0555487 +-0.0105044 0.0745085 0.0567054 +-0.00265316 0.0511482 -0.0311061 +-0.0764634 0.157616 -0.00941011 +-0.0224335 0.0371726 0.0541058 +-0.0432016 0.171084 -0.00202068 +-0.0523174 0.057382 0.0266177 +0.0595665 0.0566863 0.0161765 +0.00171621 0.126464 -0.00619605 +-0.0635036 0.095949 0.0432601 +-0.00748541 0.0856517 0.0572176 +-0.0142172 0.114376 -0.0171381 +-0.0106623 0.0511436 -0.032067 +-0.0292482 0.0345559 -0.0204636 +-0.0369573 0.0340894 0.0258321 +-0.0544756 0.0413314 0.0465715 +-0.0940023 0.125512 0.016258 +-0.0685195 0.0916417 0.0424016 +-0.076491 0.140037 0.0480957 +-0.021763 0.159801 -0.0034487 +0.0107652 0.110575 -0.0191667 +-0.0296434 0.0486725 0.0446006 +0.0205709 0.0463131 0.0417824 +0.0371829 0.0726727 0.036151 +0.00170794 0.1258 0.0319097 +0.00812607 0.108726 -0.0199063 +-0.088847 0.0874807 0.0104655 +-0.0614823 0.0761372 0.0417782 +-0.077632 0.077285 -0.00766199 +-0.0914347 0.132413 0.0262297 +-0.0380759 0.16073 -0.01276 +-0.0580841 0.132712 -0.00634758 +-0.00546375 0.117984 -0.0150376 +-0.0825526 0.110518 0.0415894 +-0.0567945 0.0589511 -0.00142935 +-0.00849356 0.0842936 0.0575382 +-0.0464941 0.0987388 0.0427545 +0.0199235 0.0365522 0.038924 +-0.0181358 0.159669 -0.00704365 +0.0214919 0.0906421 0.0482356 +-0.0308996 0.107699 -0.0200324 +0.0310327 0.118783 0.0168832 +-0.049761 0.069112 0.038562 +-0.0388211 0.091456 -0.0235256 +-0.0139638 0.180133 -0.0220777 +0.0153381 0.127037 -0.000904662 +-0.0219975 0.107603 -0.0219593 +-0.0448317 0.0927682 -0.0220335 +-0.0127292 0.0909963 -0.036642 +0.0174939 0.0350076 -0.00788091 +-0.016176 0.165587 -0.0188354 +0.0276821 0.0862408 0.0453967 +-0.00121407 0.102594 0.0440764 +-0.0167645 0.162218 -0.0151135 +-0.0446938 0.0665983 -0.0153032 +-0.0709583 0.135514 -0.00804855 +0.0152869 0.0794603 0.0538116 +-0.028039 0.0849631 0.0475609 +-0.0252122 0.108563 -0.020971 +-0.0501485 0.141642 0.00337658 +-0.0802229 0.143442 0.044034 +-0.0728736 0.0659781 0.0205309 +-0.083982 0.134868 -0.000717316 +-0.070349 0.172644 -0.037875 +-0.015485 0.0673895 0.0543529 +-0.0374989 0.108379 0.0375203 +0.0194281 0.0399108 -0.0177171 +-0.0508059 0.0898498 -0.0218327 +-0.0916067 0.130926 0.00923792 +-0.0657827 0.158229 -0.0103034 +0.00352818 0.0386899 -0.0121702 +-0.0147383 0.10835 -0.0207588 +-0.0496313 0.111407 -0.0178803 +-0.0413837 0.128875 0.00906534 +-0.0523163 0.134709 -0.00240246 +0.00961512 0.122501 0.0348066 +-0.0755017 0.140041 0.0481 +-0.0678883 0.145704 -0.022127 +-0.0230319 0.0374462 0.0541561 +-0.00425848 0.0961384 -0.0318255 +-0.0895594 0.135155 0.0312102 +-0.0623104 0.0594537 0.00702264 +0.00422975 0.0796448 -0.0342885 +-0.0618471 0.153751 -0.0215773 +-0.00905798 0.034739 0.0470958 +-0.0575286 0.126935 0.0396404 +-0.0298496 0.180049 -0.0116061 +-0.0317613 0.0567558 -0.0133876 +-0.0839019 0.105911 0.0262878 +-0.0715304 0.102729 0.03849 +0.0144241 0.127312 -0.00121761 +-0.0787914 0.14589 -0.00282549 +-0.00925999 0.0421824 0.0495336 +-0.0284001 0.0385729 0.034376 +-0.0690967 0.148938 0.0398784 +-0.0561651 0.153258 0.0280528 +0.0408211 0.10424 0.0171662 +0.0569661 0.0701435 0.00568959 +-0.0318479 0.09723 -0.023215 +0.00233723 0.0391647 0.0293747 +-0.0839319 0.117006 0.0485566 +-0.0310508 0.0693178 -0.0264576 +-0.0270974 0.0794315 0.0481933 +-0.00975454 0.0728065 -0.0376393 +-0.0907216 0.131054 0.0332303 +-0.00149823 0.0535022 0.0547476 +-0.0920442 0.126938 0.0322524 +-0.049095 0.140149 0.0113941 +-0.0605441 0.113772 -0.0142303 +-0.00976932 0.0756525 -0.0380331 +-0.0878532 0.127045 0.0464651 +-0.010533 0.178644 -0.025906 +0.0593699 0.0691831 0.0171767 +-0.024781 0.0769658 -0.0376048 +0.0423711 0.0575006 -0.00528711 +0.0460928 0.061454 -0.00359733 +-0.0408554 0.101386 -0.0212924 +-0.0446853 0.169846 -0.00596698 +-0.0499657 0.0572278 0.0334797 +-0.0145604 0.127706 0.0231688 +-0.0624931 0.153672 -0.0316068 +0.0559752 0.0635544 0.0263749 +-0.0741944 0.0678888 0.022137 +0.0128784 0.0534523 0.0500797 +-0.014497 0.082865 0.0570346 +0.0100519 0.0351376 0.0435561 +-0.0764979 0.135856 0.0507679 +-0.0505672 0.0545537 0.0173366 +-0.073291 0.0682485 0.025526 +0.0168973 0.0504721 0.0453108 +0.0597511 0.0567143 0.0111681 +0.00962081 0.119433 -0.0146957 +-0.0261763 0.0931476 0.0454624 +-0.0034975 0.0661744 0.0565538 +-0.0174573 0.0601724 0.0514531 +0.0587589 0.059387 0.00417226 +-0.0388249 0.122181 0.0278208 +-0.0685252 0.175096 -0.0570393 +-0.0628061 0.0896011 -0.0190246 +0.0306772 0.118704 0.0210209 +-0.0655003 0.083298 0.0438708 +0.0560223 0.0713695 0.00682475 +-0.0298518 0.100096 -0.0230635 +-0.0422245 0.148296 -0.00246029 +-0.00149333 0.112805 0.0421166 +-0.0829153 0.0925695 0.0313446 +-0.0394018 0.0468721 -0.0179145 +-0.0784825 0.135851 0.0506454 +-0.0734876 0.127439 0.0525898 +-0.0280931 0.033441 -0.0266965 +0.0607571 0.0609589 0.0141669 +-0.0692316 0.172989 -0.0403442 +-0.0397906 0.162354 0.00198884 +-0.0505067 0.0805184 0.044061 +-0.0716519 0.156794 -0.0409079 +0.0407885 0.10564 0.00816522 +-0.00717727 0.0999816 0.0485274 +-0.0646289 0.156694 -0.0465976 +-0.089623 0.0983355 0.0134109 +0.00279805 0.0339767 -0.0211497 +-0.0142152 0.17272 -0.0253585 +-0.0396036 0.174135 -0.00601981 +-0.0669938 0.0358141 0.0313063 +-0.0497731 0.0627792 0.0345527 +0.0229897 0.121378 0.0295865 +-0.0457551 0.0336493 -0.0154708 +-0.0539285 0.152376 0.0223916 +-0.0664975 0.108359 0.0380432 +0.0293811 0.04325 -0.00550019 +-0.0166832 0.0525719 -0.0322771 +0.0164877 0.105762 0.0431793 +-0.0171637 0.0956465 -0.0313986 +-0.0314959 0.111117 0.0366419 +-0.0788622 0.169438 -0.0409605 +-0.0673163 0.13687 0.0448543 +-0.00450662 0.0828853 0.0572758 +-0.086732 0.125284 -0.00171301 +-0.0339024 0.123839 0.0236394 +-0.0665906 0.0686018 0.0336345 +-0.0647932 0.143933 0.0397518 +0.0283692 0.0466516 -0.00870467 +0.0329293 0.104175 -0.0123189 +-0.0761401 0.0728821 0.0296904 +-0.0142042 0.169737 -0.0232161 +-0.068634 0.151185 -0.044245 +-0.0135754 0.0347863 -0.0255909 +0.019989 0.0436019 0.0426848 +-0.015693 0.057044 -0.0346551 +-0.00164401 0.0482043 -0.0300627 +-0.0311183 0.172722 -0.00474304 +-0.0250193 0.118984 -0.0119284 +-0.0325683 0.124672 -0.00180773 +-0.0781672 0.0694403 0.0164131 +0.0335232 0.0673414 0.0396281 +-0.0927165 0.117489 0.0383035 +0.0402856 0.10561 0.017163 +-0.0284035 0.166813 -0.0078902 +-0.00473635 0.13076 0.00793547 +-0.0216948 0.0386212 -0.00966204 +-0.0436382 0.11786 -0.014681 +0.0533192 0.0587911 -0.00291354 +-0.0153516 0.0970497 -0.0288687 +-0.0434963 0.0661943 0.0406667 +-0.0466152 0.145766 -0.000178732 +-0.0206008 0.0386838 -0.0150911 +-0.0509261 0.0335608 -0.00538789 +-0.0896998 0.137926 0.0341919 +-0.0278811 0.0378156 0.0189805 +0.0364086 0.0854455 -0.0167057 +0.0349072 0.0875927 0.04003 +-0.0243811 0.0738035 0.0484997 +-0.0470246 0.133586 0.0187098 +0.00950521 0.0772084 0.0556135 +-0.0192998 0.0985099 -0.0244 +0.0447739 0.0438422 0.0248039 +-0.0504965 0.0819144 0.0441383 +-0.0346492 0.0577427 -0.0111408 +-0.048101 0.135891 0.0168055 +0.00147386 0.103921 -0.02207 +0.0494979 0.0678406 0.0265165 +0.00621357 0.0880484 -0.0332214 +-0.0763594 0.158279 -0.023921 +0.0359549 0.0646627 0.0378653 +-0.0462327 0.128102 0.0242709 +-0.0570384 0.142741 -0.0023851 +-0.0156536 0.0496375 -0.0309655 +-0.0157015 0.164 -0.0105798 +0.0160661 0.0349193 -0.0155613 +-0.0555615 0.0615422 -0.00607893 +-0.0506452 0.142899 0.00154993 +0.0227041 0.124378 0.0023667 +-0.0690811 0.0343024 0.0100819 +0.0296092 0.114943 -0.00583865 +0.0252655 0.0864752 -0.0236184 +-0.0579352 0.153021 -0.000467328 +-0.0699851 0.168026 -0.0510102 +-0.0649515 0.126767 -0.00875296 +-0.0310902 0.124844 0.00108587 +-0.07951 0.149797 0.0367578 +-0.0514931 0.156432 0.0104716 +-0.0854224 0.0885478 -0.00153705 +-0.0622051 0.0333895 -0.00205752 +-0.00958914 0.0376967 -0.0257201 +0.0438525 0.0874765 0.0251696 +-0.00448652 0.114189 0.0411781 +-0.0741351 0.0860483 0.039718 +-0.0162681 0.118552 -0.0135478 +-0.00571384 0.0655793 -0.035147 +-0.051609 0.164108 -0.000948719 +-0.0346229 0.116833 -0.0136016 +0.0105065 0.107115 0.0414414 +-0.0484736 0.0917654 0.0440291 +9.10767e-05 0.108392 -0.0207972 +0.0522547 0.0611036 -0.00320855 +0.00856462 0.11946 -0.0147195 +0.0326237 0.0768475 0.0419257 +0.0282302 0.0872832 -0.0216049 +-0.0693757 0.155378 0.0277002 +-0.0182673 0.180142 -0.0177524 +-0.0285043 0.0545632 0.0363758 +-0.0218074 0.0756618 -0.0388536 +-0.0633749 0.1608 -0.057006 +-0.0892506 0.151522 0.0201032 +-0.0472272 0.0642822 0.0376403 +-0.0699509 0.134055 -0.00826728 +-0.0820286 0.074884 0.0125291 +-0.0576046 0.151067 0.0326375 +-0.0425494 0.0346163 0.040046 +-0.0619058 0.105434 -0.0174028 +-0.0753497 0.108878 0.0391875 +-0.0594974 0.0946317 0.0447571 +0.013384 0.078066 0.0545225 +-0.0431375 0.160652 -0.0100842 +-0.0258359 0.0945143 -0.0266147 +-0.0245117 0.0536384 0.0409132 +-0.0664072 0.169883 -0.0364165 +-0.0726615 0.0640995 0.00799778 +-0.0451579 0.0395668 -0.0202936 +-0.00773777 0.0727528 -0.0370634 +0.0135086 0.116829 0.0366875 +-0.0836964 0.106272 0.0263573 +-0.0303071 0.0339954 0.0147064 +-0.000759903 0.102685 -0.0227147 +0.0258263 0.0624492 -0.0231007 +-0.0674047 0.179923 -0.0541082 +-0.0857367 0.111526 0.0418488 +-0.0560454 0.148678 -0.00182226 +-0.0476918 0.0635243 -0.0129244 +-0.0642806 0.164881 -0.0270495 +-0.0574962 0.108397 0.0389105 +0.00241269 0.0347278 -0.0230504 +-0.00449379 0.0548276 0.0540049 +-0.0627171 0.147502 -0.0125815 +-0.0213288 0.0581411 0.0459349 +-0.0608837 0.0367165 0.0449842 +0.0211328 0.126504 0.0131782 +0.00740015 0.0418656 -0.0238182 +-0.0737971 0.148055 0.0412991 +-0.00374732 0.0726737 -0.0357771 +-0.0204954 0.103009 0.0433484 +-0.0210495 0.127369 0.0106273 +0.0306407 0.0431175 0.0298982 +0.0109957 0.0698921 0.0545336 +-0.0439898 0.0350927 -0.0256307 +-0.0670986 0.0347786 0.0136227 +0.0215717 0.0401714 -0.00970048 +0.0214864 0.0934187 0.0477129 +-0.0174765 0.0715932 0.0547125 +-0.0246025 0.0824997 0.0540808 +-0.0774249 0.155543 -0.015906 +-0.00557868 0.109705 -0.0221876 +-0.00234233 0.10113 0.044176 +0.0314145 0.0384146 -0.00113672 +-0.0708385 0.0965734 -0.0156262 +-0.0358426 0.0345846 0.0397566 +0.0166934 0.111749 -0.0164123 +-0.0461447 0.0396778 -0.0162811 +0.0460542 0.0820303 0.0141751 +0.024254 0.0776067 -0.0252579 +-0.0585858 0.14384 -0.00236725 +-0.0590542 0.155341 0.0226214 +-0.0425019 0.049221 0.0396798 +-0.0737231 0.156865 -0.0279142 +-0.0640946 0.155219 -0.00966954 +-0.0136075 0.0420889 -0.0267571 +-0.0149109 0.0391012 0.0366853 +-0.0768619 0.116386 -0.00596474 +0.0464851 0.0651547 0.0281822 +-0.0672589 0.077344 0.0400985 +-0.0768893 0.176966 -0.046083 +-0.0870251 0.136346 0.00321516 +-0.046566 0.128368 -0.00156221 +-0.0881324 0.103677 0.0173573 +-0.0358716 0.10426 -0.0206916 +-0.00158589 0.110252 -0.0207823 +-0.0645869 0.117148 0.0471018 +-0.0493593 0.121175 0.032055 +0.00351232 0.0575709 0.0538233 +-0.0114209 0.107659 -0.022044 +-0.0134464 0.0388153 -0.00818864 +-0.0485053 0.108444 0.0391022 +-0.0783276 0.0839475 -0.0105972 +-0.0422429 0.129048 0.0117038 +0.0230175 0.0903576 -0.0236845 +-0.0840147 0.0993167 -0.00358504 +-0.0538991 0.108397 -0.0185513 +-0.00168424 0.0583535 -0.0329231 +0.00135578 0.0347199 0.040341 +-0.0858041 0.131212 0.0485351 +0.0546169 0.0694261 0.0240301 +0.0349752 0.0684447 -0.0157877 +0.0095201 0.0716259 0.0554078 +-0.00749453 0.0952341 0.0547544 +-0.019553 0.163976 -0.00913576 +-0.0640343 0.0457636 0.00169557 +-0.017901 0.0381554 0.0134869 +0.0133255 0.0594987 -0.0290386 +0.00648582 0.047441 0.0497645 +-0.0239518 0.123773 0.0227902 +-0.0318252 0.0609455 -0.0174329 +-0.0928746 0.122834 0.0282828 +0.00226062 0.131309 0.0062251 +-0.0414935 0.112526 0.0356807 +0.0202561 0.0791555 -0.0271913 +-0.0331056 0.0338156 0.0161014 +0.0297787 0.0446629 0.032196 +-0.0792621 0.084024 -0.00957002 +-0.0697175 0.155623 0.0028257 +-0.0391149 0.0337868 -0.0291782 +-0.0893977 0.135151 0.0292068 +0.04371 0.0987542 0.0111628 +-0.0281559 0.0380199 0.00608926 +0.0552084 0.0493743 0.00621284 +-0.0861539 0.149931 0.0300167 +0.042296 0.0775058 -0.00576261 +0.0415736 0.0765545 0.0302447 +-0.0532046 0.133931 0.0318349 +-0.0939252 0.118758 0.016301 +-0.027019 0.123094 -0.00421217 +-0.0471842 0.0355635 -0.0162689 +0.0137449 0.12859 0.0232984 +-0.0388402 0.0957243 -0.0226737 +0.0393482 0.0966985 0.0306886 +0.0405486 0.0596459 0.0301455 +-0.083332 0.0992842 -0.00460735 +0.0403123 0.0491555 -0.00629774 +-0.0135559 0.0378433 -0.0166597 +-0.0655014 0.0958911 0.0424957 +-0.00976126 0.0358952 0.049479 +-0.0624412 0.150596 -0.00171821 +-0.064981 0.131148 -0.00860586 +-0.0763864 0.109432 0.0420745 +-0.00149437 0.0801423 0.0576885 +-0.0163316 0.166866 -0.0132843 +-0.0862104 0.140486 0.00518463 +-0.0484837 0.159357 0.00832828 +-0.063685 0.169395 -0.0455915 +-0.0676574 0.0344024 0.0120657 +-0.0324957 0.0889348 0.0439847 +-0.0285919 0.0494861 -0.0235098 +-0.0925344 0.124191 0.0302708 +-0.0898664 0.135182 0.0372006 +-0.0675175 0.146991 0.0409028 +-0.0643109 0.0721294 0.0381075 +0.0336777 0.107392 0.0312726 +0.0416487 0.0806113 0.0304012 +0.0108925 0.130607 0.00797847 +0.00350574 0.071674 0.0559901 +-0.0687556 0.0680025 -0.00564855 +-0.0668955 0.116554 -0.00922261 +-0.0147132 0.0599449 -0.0358879 +-0.023059 0.0825255 0.0553698 +-0.0305016 0.108423 0.0388291 +-0.0575086 0.0507939 0.00466306 +-0.0811465 0.155009 0.0163089 +-0.0281138 0.125637 0.0139342 +0.00450187 0.0575756 0.0536585 +-0.0124992 0.0745024 0.0565746 +0.030795 0.119096 0.00823469 +0.0112449 0.0943173 -0.0278535 +-0.00350029 0.0856691 0.0572933 +-0.0135749 0.18083 -0.0284353 +-0.0387321 0.0724952 -0.0174162 +-0.0366243 0.151025 -0.00298791 +0.0282135 0.0579727 -0.0197309 +-0.0828916 0.0775885 0.00151125 +-0.00164877 0.0496874 -0.0307148 +0.0386307 0.106935 0.00116239 +-0.0871923 0.0861012 0.021463 +-0.0760841 0.104861 0.0354581 +-0.0244788 0.0486839 0.0492934 +-0.0883766 0.141855 0.0366703 +-0.0509887 0.143164 0.0163768 +-0.0496168 0.0561697 -0.00993077 +-0.00378208 0.0390472 -0.0102032 +-0.0843646 0.087116 -0.00354087 +0.00990951 0.0819581 0.0548044 +-0.0425006 0.0888114 0.0424593 +-0.0728637 0.099356 -0.013752 +-0.0206243 0.0436469 -0.0283402 +-0.0828496 0.117685 -0.00271563 +-0.0715585 0.181081 -0.0541999 +-0.0338561 0.0475081 -0.0226504 +0.00224005 0.0768974 -0.0352993 +-0.0935755 0.117419 0.0183042 +-0.0754318 0.155396 0.00808247 +-0.0674328 0.172594 -0.0425404 +0.027377 0.122298 0.0126488 +0.0174898 0.0874014 0.0499964 +0.0109848 0.123169 0.033628 +-0.0367194 0.0710436 -0.0172369 +-0.0285781 0.0423048 0.0521933 +0.033068 0.0984004 -0.0141329 +-0.0475947 0.0601221 0.0367025 +-0.0635768 0.155628 0.0253794 +0.0262764 0.100811 0.0416679 +0.0147323 0.129513 0.0122405 +0.0321413 0.0366814 0.019545 +-0.00794631 0.127212 -0.00487976 +0.0374618 0.0376657 0.00680115 +-0.0450017 0.0355455 0.0439167 +-0.0613089 0.0634913 0.028639 +-0.0275028 0.0988006 0.0435593 +0.051337 0.0560222 -0.00385605 +-0.0701879 0.175082 -0.0550269 +-0.0424973 0.155091 0.0068798 +-0.0156018 0.0435495 -0.027203 +-0.0387577 0.0797624 -0.0199123 +0.036687 0.0909845 -0.0142871 +-0.0621605 0.170953 -0.0526019 +-0.0503178 0.0515583 0.0186309 +0.0183954 0.0645286 0.0493775 +-0.0816036 0.0774754 -0.00149976 +-0.0167638 0.0728801 -0.0389011 +-0.0612458 0.141043 0.0360828 +-0.0650382 0.153613 0.000196596 +-0.0506214 0.0416531 0.0455899 +-0.0218256 0.086832 -0.0376579 +-0.0368977 0.110447 -0.0189068 +-0.0390704 0.124042 0.0247581 +-0.0145052 0.0544906 0.0506759 +0.0346875 0.0955379 0.0380285 +-0.0427281 0.0478381 -0.0112773 +-0.0589463 0.0436711 -0.00636451 +0.044641 0.0945606 0.00417916 +0.0417801 0.041383 0.0227466 +-0.066757 0.170863 -0.0580345 +-0.0104152 0.0998773 0.0473736 +-0.0467325 0.133652 0.0114554 +-0.0376877 0.163829 -0.000238726 +-0.0725153 0.142823 0.0458217 +0.0207674 0.103342 -0.0194283 +-0.00540678 0.121074 -0.0123374 +-0.0424989 0.102887 0.0413486 +-0.0462349 0.0354247 -0.01929 +0.0180016 0.125305 0.0262968 +-0.0162469 0.184587 -0.0200786 +-0.079084 0.0994215 0.0343706 +-0.0557053 0.132552 0.0352577 +-0.0512629 0.0388692 0.0464256 +-0.0515065 0.160835 0.00704803 +-0.0826893 0.152358 0.0291683 +-0.0584964 0.0932599 0.0452695 +0.024564 0.103479 -0.0175815 +-0.0846694 0.0831371 0.000497005 +-0.0865668 0.118992 0.0483015 +-0.0192412 0.184576 -0.0155995 +-0.00659114 0.03769 -0.0254352 +-0.0245806 0.124862 0.0196194 +-0.0368731 0.105664 -0.0202847 +-0.0621883 0.177235 -0.0596222 +-0.0672213 0.1608 -0.0122924 +-0.0303274 0.0375897 0.0276802 +-0.0234293 0.0522884 0.0423691 +0.0538492 0.0711959 0.0223128 +0.00550075 0.0772523 0.0562045 +0.0438483 0.076237 -0.00278527 +0.00633738 0.0581963 -0.0307089 +-0.0646256 0.0674757 -0.0084666 +-0.0310521 0.0450006 0.0489427 +0.0109104 0.126748 -0.00460652 +-0.0409513 0.128783 0.00774742 +-0.000502218 0.0938722 0.0552243 +-0.0166066 0.035315 -0.0186674 +-0.02118 0.169768 -0.013264 +-0.048723 0.166988 -0.000980568 +0.0301667 0.116977 -0.00204442 +-0.0129037 0.181603 -0.0240442 +-0.0461681 0.033576 -0.00628041 +0.0377831 0.0813859 -0.0147095 +-0.050774 0.143198 0.0153986 +-0.0591392 0.118534 -0.0111826 +0.0601642 0.0622865 0.0071402 +0.0055201 0.0674746 0.0556049 +0.0539548 0.0603844 -0.00239402 +0.0345037 0.0468848 0.0307194 +-0.0226112 0.04084 -0.0289768 +-0.088041 0.0995721 0.00642464 +0.0313753 0.111403 0.0314731 +-0.0818093 0.0776109 0.0245029 +0.0196586 0.112307 -0.0150514 +-0.0547371 0.114833 -0.0154193 +-0.00335753 0.11894 -0.0140663 +-0.0675878 0.0614559 0.0185068 +-0.0374891 0.0973119 0.0427062 +-0.0618754 0.0967815 -0.0181397 +-0.0177948 0.161129 -0.00657359 +-0.0762411 0.0901005 0.0388673 +-0.00749994 0.0647419 0.0560829 +-0.0872439 0.132483 0.0457019 +-0.0207923 0.0756874 -0.0390657 +0.00773677 0.0341095 0.00222437 +-0.00405506 0.101077 0.0451334 +-0.0537766 0.0826585 -0.0215583 +-0.0484986 0.0425777 0.0442245 +0.0370248 0.10907 0.0248298 +0.0550045 0.0727719 0.0183019 +-0.0531047 0.0345095 0.0361399 +0.0240424 0.122784 0.0256717 +-0.0321586 0.0349269 0.0472031 +-0.0487458 0.123267 -0.0102852 +0.0164927 0.107123 0.0418084 +-0.0518639 0.0999443 -0.0218198 +-0.0259535 0.0592275 0.0392168 +-0.0169683 0.186741 -0.0196674 +0.012157 0.123544 0.032833 +-0.0236685 0.0919017 0.0500491 +0.0048864 0.127407 -0.00526463 +-0.00324909 0.0389153 -0.000648163 +0.0108689 0.0576426 0.0524778 +0.0396737 0.107002 0.0161655 +-0.0816849 0.073475 0.00953613 +-0.0743109 0.165184 -0.0390136 +-0.0728909 0.120866 -0.00826881 +0.040969 0.0926354 0.0294955 +-0.00410534 0.0385566 0.0231802 +-0.0167703 0.0742961 -0.0390024 +0.0376363 0.109584 0.0207569 +0.00538144 0.0464854 -0.0270709 +-0.0503176 0.0388958 0.046006 +-0.0793777 0.154922 0.0242883 +-0.0476898 0.0679558 -0.0146484 +-0.0108886 0.108738 -0.0217426 +-0.0532571 0.151368 0.0204421 +-0.068651 0.163792 -0.0529788 +-0.0441151 0.0643553 0.040206 +-0.0275094 0.107088 0.0401149 +-0.0275566 0.0890776 0.0469337 +-0.0274957 0.102963 0.0425886 +-0.0266136 0.0837142 0.0504396 +0.015157 0.122808 -0.00836184 +-0.0234279 0.0636514 0.0436342 +-0.00941329 0.0943623 -0.0340451 +-0.0174189 0.178658 -0.0183022 +-0.0187779 0.183117 -0.0166827 +0.0130462 0.129592 0.0201813 +-0.0751825 0.149958 -0.0238676 +0.00897367 0.131122 0.0172577 +0.0483469 0.0589383 -0.00490848 +0.0422406 0.0986762 0.0221715 +-0.0921564 0.130934 0.011242 +-0.0327106 0.0764924 -0.028531 +0.0102149 0.0725802 0.055192 +-0.0636711 0.0593571 0.0158341 +-0.0123306 0.0394822 0.0386711 +-0.0718333 0.156164 0.022455 +-0.0864971 0.150096 0.00821548 +-0.0110742 0.123419 -0.00875247 +-0.080097 0.11274 -0.00201289 +-0.00271881 0.0655507 -0.0345764 +0.00140103 0.0390882 -0.0248121 +-0.0618299 0.0939366 -0.0189413 +-0.0716693 0.147461 -0.0281971 +-0.0231858 0.17269 -0.0205136 +-0.0637876 0.155678 -0.0402328 +-0.0228589 0.0637031 0.0444908 +-0.0238626 0.169762 -0.0118641 +-0.0752191 0.155599 0.0242023 +-0.0345019 0.0461718 -0.0254652 +-0.01605 0.0946681 0.0536372 +0.0246905 0.0477085 0.0389599 +0.0101881 0.0341976 -0.00109267 +-0.0293326 0.154386 -0.00360575 +0.00276097 0.131717 0.0121378 +-0.0859012 0.0899317 0.000454719 +-0.0297834 0.121969 -0.0069874 +-0.0297126 0.0508986 -0.0203549 +-0.0888501 0.151809 0.0151852 +-0.0824868 0.0965084 -0.00559576 +-0.0279025 0.124426 0.000511349 +-0.0111071 0.0879305 -0.0374747 +-0.0895782 0.133632 0.00522749 +-0.0325779 0.0341004 0.0231549 +-0.087069 0.100891 0.00537711 +-0.0182966 0.038653 -0.00715499 +-0.0181652 0.097581 -0.0254283 +0.00716304 0.0378885 -0.010707 +-0.0117789 0.0582633 0.0533407 +-0.0679898 0.154859 0.0296647 +0.0270346 0.0384464 0.0278157 +-0.0446977 0.147484 -0.0025954 +-0.0797208 0.0757926 0.0264575 +-0.0827795 0.113314 0.0464356 +-0.0405007 0.118003 0.0314814 +0.00913581 0.103011 -0.0206427 +-0.0712761 0.153449 0.0330143 +0.0296113 0.108994 -0.0114792 +0.0120747 0.0958655 -0.0254962 +-0.0357119 0.0695868 -0.0167299 +-0.0777217 0.159728 -0.0179219 +-0.0619192 0.0343817 0.0361087 +-0.0839142 0.0843714 -0.00355138 +0.0295472 0.11806 0.0262972 +-0.0344935 0.0733008 0.0417052 +0.0305902 0.0996469 -0.0155371 +-0.0731059 0.151228 -0.0378853 +-0.0740388 0.151266 -0.032878 +-0.0419789 0.152954 -0.00736227 +-0.00349089 0.112806 0.0419152 +0.00607582 0.0348373 0.023168 +-0.000568628 0.0388214 0.0254737 +0.0445611 0.0931651 0.0181595 +-0.0469298 0.126751 0.026776 +-0.0318643 0.104333 -0.0219242 +0.0119312 0.0725978 0.0541603 +-0.0435985 0.108724 -0.0190759 +-0.0274517 0.043312 0.0519115 +-0.00149233 0.077429 0.0585147 +-0.0618993 0.0433992 0.0415482 +0.0131559 0.129936 0.00738875 +0.00749621 0.107111 0.0412811 +0.0354668 0.0573224 -0.0106723 +-0.0211412 0.0652998 0.0483526 +-0.00680045 0.129424 0.0244883 +-0.0187344 0.126979 0.0202236 +0.00853139 0.0813381 0.0552215 +-0.0254455 0.0389929 0.0381911 +-0.0507728 0.111366 -0.017973 +-0.027716 0.0387019 -0.0165247 +-0.000266462 0.0936214 -0.0332218 +-0.0855847 0.0806062 0.0194802 +0.0100369 0.130324 0.00340984 +-0.0449017 0.148739 -0.00386394 +-0.0321132 0.0482449 -0.0223421 +-0.0893696 0.140675 0.0341739 +0.0448261 0.0875458 0.0221634 +-0.0454912 0.0719252 0.0419203 +-0.0718306 0.148291 -0.0327712 +-0.0812513 0.108802 0.0293202 +0.0429574 0.0859786 -0.00579554 +-0.0338336 0.0380945 -0.0153271 +-0.060738 0.148827 -0.00180261 +-0.0568701 0.141076 -0.0033696 +-0.0358396 0.125396 0.0214464 +-0.0789386 0.168616 -0.0354931 +-0.0315115 0.108439 0.0386203 +-0.0842691 0.117693 0.0488129 +-0.032501 0.101545 0.0423652 +-0.0289779 0.174216 -0.00689295 +-0.0622726 0.163207 -0.0582148 +-0.00885889 0.172674 -0.0247544 +-0.0519291 0.13698 0.0263868 +-0.0829532 0.112769 0.000219247 +-0.0237394 0.038003 0.0142418 +0.0321413 0.0513188 -0.0087021 +-0.0473947 0.0359569 0.0452833 +-0.0488828 0.108449 -0.0190525 +0.0415402 0.0928967 -0.0067838 +-0.0800241 0.0745873 0.0239149 +0.005197 0.0866258 -0.0333998 +0.00148166 0.107215 0.0427825 +-0.0694376 0.159556 -0.0509365 +-0.0306541 0.0650706 -0.0234343 +-0.0653365 0.167223 -0.0303028 +-0.0262324 0.15581 -0.00635861 +-0.0362329 0.165306 -0.00162934 +-0.00330758 0.0379537 -0.0147265 +-0.0267799 0.0893467 -0.0340353 +-0.0591073 0.155657 0.0168017 +-0.0331866 0.15511 0.000984746 +-0.0671323 0.152011 0.0359968 +0.0112495 0.0710359 -0.0320326 +-0.0289103 0.0508426 -0.0224168 +-0.0582351 0.043574 0.0153571 +-0.0770169 0.112922 0.0479771 +-0.0146932 0.0570315 -0.0346956 +-0.0735209 0.134443 0.0506533 +-0.0445794 0.130477 0.0137726 +-0.0744939 0.127436 0.052791 +-0.0376156 0.0492564 -0.0118933 +-0.0462534 0.123907 0.0259058 +-0.0434909 0.104315 0.0413728 +-0.0779429 0.0893818 -0.0115854 +-0.067492 0.10005 0.0413205 +-0.0882017 0.0949941 0.0238463 +0.0438775 0.06952 0.000229591 +-0.0171444 0.168289 -0.0207283 +-0.0236004 0.0383091 -0.00235181 +-0.0697889 0.172796 -0.0390999 +-0.0291426 0.042089 -0.0296009 +-0.0446441 0.0338442 0.00651202 +-0.000500925 0.121055 0.0369996 +0.022042 0.12426 0.000701449 +0.00803725 0.125889 0.0313 +-0.0517799 0.0840941 -0.0216716 +-0.0145005 0.0842486 0.056982 +-0.0886066 0.113065 0.00725433 +0.0156656 0.0713152 0.0525386 +-0.0164665 0.068805 0.0544258 +0.0182285 0.0820502 -0.0281776 +-0.00610364 0.0386755 0.000846714 +-0.0599938 0.126727 -0.00781868 +-0.0155017 0.100285 0.044225 +-0.0638562 0.0423917 -0.00506847 +-0.0444796 0.0338614 0.0280014 +-0.000499767 0.100727 0.0463954 +-0.0162094 0.172709 -0.0239586 +-0.0690346 0.0338087 0.00696066 +-0.062316 0.158431 -0.019584 +0.00644358 0.129282 -0.00129108 +0.0188124 0.0393785 0.042705 +-0.0847946 0.140657 0.0430258 +-0.0835274 0.0979539 0.0303801 +-0.0241902 0.160559 -0.0136368 +-0.06502 0.161419 -0.0172527 +-0.0772789 0.154395 0.0279022 +-0.0681261 0.15638 0.0193912 +-0.0337268 0.111492 -0.0180397 +-0.0323736 0.176483 -0.0134412 +-0.0291608 0.0806486 0.0445728 +-0.0846331 0.0781756 0.0181083 +-0.0498753 0.106996 -0.0192538 +0.00350083 0.0730867 0.0562031 +-0.0231171 0.0347933 0.0492623 +-0.0616059 0.0342155 0.0188015 +-0.0516 0.0545447 0.0296397 +-0.0763817 0.169448 -0.0429673 +-0.069513 0.17974 -0.0519891 +-0.0588484 0.13671 0.0342246 +-0.0780833 0.1597 -0.0209281 +0.00109253 0.113026 -0.0199046 +-0.0227366 0.157094 -0.00651614 +0.0344933 0.0929192 0.0394802 +-0.000408544 0.126448 -0.00615558 +-0.0805024 0.128853 0.052889 +-0.00020637 0.0947598 -0.0324026 +-0.089811 0.143072 0.0296513 +0.0321792 0.0929416 0.0413986 +-0.0145721 0.168692 -0.0222333 +0.0595491 0.0594739 0.0201736 +-0.0810451 0.0800939 -0.00453207 +-0.0267843 0.0880044 -0.0350453 +-0.040033 0.126629 -0.00388698 +-0.0208083 0.0348218 0.0462671 +-0.082826 0.11472 -0.00162443 +-0.0301654 0.12556 0.01613 +-0.0485613 0.0418518 -0.011173 +-0.0784181 0.163881 -0.0269512 +0.0387541 0.0617571 -0.00875906 +0.0464006 0.0792571 0.0121793 +-0.00359562 0.043415 -0.0257386 +-0.0333921 0.126443 0.0164188 +-0.00106292 0.130975 0.00499363 +-0.0668008 0.060458 0.0159676 +-0.0254977 0.107106 0.0408331 +-0.0682758 0.06442 0.0246162 +-0.0298175 0.125729 0.00888885 +-0.088267 0.147416 0.00925394 +0.0542609 0.050631 0.00222604 +0.0422118 0.100079 0.0191646 +-0.081175 0.14869 0.00117764 +-0.0344163 0.0346761 0.0417292 +-0.0623017 0.163119 -0.0425932 +-0.0298952 0.0565521 -0.0204023 +-0.076686 0.0781369 0.0338733 +-0.0338704 0.102893 -0.0218261 +-0.0355104 0.0775398 0.0419002 +-0.0584924 0.0630612 0.0296076 +0.0454221 0.0889974 0.0141646 +-0.0417964 0.0347181 0.00810808 +0.0363875 0.0505227 -0.00658574 +-0.053281 0.144674 0.0233765 +0.0262687 0.0352193 0.019674 +-0.0168964 0.123328 -0.00656517 +-0.0606083 0.118309 0.0403758 +0.00639612 0.0418759 -0.0239341 +0.0231261 0.0431609 -0.0107258 +-0.00718079 0.0390105 -0.0127195 +-0.00364386 0.0901332 -0.0356262 +-0.00854262 0.033753 -0.0231542 +-0.0124761 0.0531764 0.0512005 +-0.0231395 0.168252 -0.0189417 +0.0233331 0.0354178 0.02435 +-0.000241537 0.0397743 0.0467748 +-0.0723661 0.147118 -0.0228625 +-0.0517688 0.0612265 0.030932 +-0.063068 0.161146 -0.0557557 +-0.0279123 0.0793217 0.046185 +-0.0627986 0.0441541 -0.00325511 +-0.0165065 0.100263 0.0439632 +-0.0217072 0.0582569 -0.0327502 +0.0254642 0.12325 0.0062381 +-0.086501 0.0833246 0.0174861 +-0.074502 0.11613 0.052068 +0.032458 0.0910982 -0.0184345 +-0.0729629 0.155811 0.0249814 +-0.0506733 0.162525 0.00564316 +-0.0697867 0.034416 -0.00452426 +0.0189467 0.0754919 0.0520404 +-0.0165401 0.0997826 0.0440769 +-0.086829 0.0847067 0.0174745 +-0.0474936 0.146975 -0.00223523 +-0.065417 0.154594 -0.0449582 +-0.0614906 0.0590888 0.0075192 +-0.0686207 0.128453 0.0500102 +-0.023162 0.0958328 0.0451924 +-0.0258056 0.0550238 0.0391969 +-0.0102599 0.0407381 0.0498453 +-0.0664749 0.0875478 0.0443297 +0.0581415 0.0538012 0.00818348 +-0.0384918 0.0903063 0.0434643 +-0.0457684 0.132352 0.0133121 +-0.0728932 0.0941961 0.0410307 +-0.0809085 0.111715 -0.000772193 +-0.0833393 0.0979244 -0.00460929 +-0.0671961 0.15591 -0.00355939 +-0.0455114 0.0338265 0.027816 +0.01975 0.0343373 0.00255688 +-0.0875501 0.120326 0.0478169 +0.0353576 0.0505704 -0.00670224 +0.00356645 0.0339958 0.0125338 +0.0590653 0.0552605 0.0161784 +-0.084435 0.0791603 0.0205035 +-0.0255122 0.0349295 -0.0287387 +-0.0724789 0.110508 0.0438845 +0.00447986 0.0385716 -0.0118677 +-0.066989 0.136993 -0.00809827 +0.0384287 0.064558 0.0344028 +-0.0516036 0.0560273 -0.00839821 +-0.00350028 0.110017 0.0429859 +-0.0111634 0.0391658 0.035606 +0.0183426 0.0906063 -0.0259275 +-0.031909 0.154239 -0.00732019 +-0.0800971 0.0773092 -0.00453369 +-0.0190564 0.0920061 -0.0357108 +0.0133608 0.0494245 -0.0271921 +-0.0787339 0.140316 -0.00472414 +-0.0275167 0.116662 0.0324113 +0.00652621 0.104352 0.0432895 +0.0358497 0.0713653 0.0377445 +-0.0918605 0.116299 0.0240619 +-0.0522199 0.061167 0.0299696 +-0.0201447 0.166816 -0.0117812 +-0.0433732 0.122414 -0.0114499 +-0.0645963 0.0430073 0.0358234 +-0.0779043 0.1583 -0.0209193 +0.0367132 0.0547551 0.0317845 +-0.0351109 0.16372 -0.0144674 +-0.0434603 0.109995 -0.0184047 +-0.0576869 0.0677197 -0.0118328 +0.00623854 0.074018 -0.0343382 +0.0443987 0.0959613 0.0131589 +-0.089865 0.120262 0.0458544 +0.0103837 0.0449023 -0.0251665 +-0.0770006 0.139838 -0.00569476 +-0.072687 0.0955359 0.0408041 +-0.0569361 0.046073 0.0125834 +-0.0604913 0.0818799 0.0434166 +-0.0460645 0.151688 -0.00554828 +-0.015331 0.0349099 0.0491212 +-0.0229594 0.0811266 0.055321 +0.0274663 0.0754645 0.0450048 +-0.00267666 0.0374926 0.0135597 +-0.011518 0.0673875 0.054571 +0.013368 0.122467 -0.00997636 +-0.0722821 0.143895 -0.0129091 +0.0454962 0.0443878 0.000424365 +-0.0127602 0.0382241 0.0199007 +-0.091546 0.146121 0.023146 +0.00392744 0.0371222 0.0242968 +-0.0385489 0.119476 -0.0123722 +0.0114833 0.0936471 0.0518498 +-0.0643328 0.146767 0.0386771 +-0.0624894 0.163088 -0.0505885 +-0.0375004 0.0464372 0.040096 +0.0460037 0.0834239 0.0131685 +0.033027 0.108336 -0.00876159 +0.013228 0.0990749 -0.0229052 +0.034148 0.0442132 0.0295363 +-0.0907186 0.113289 0.0113419 +0.0210633 0.106016 0.0411627 +-0.0454948 0.119311 0.0290591 +-0.0676975 0.0607342 0.0101856 +-0.0195364 0.0461211 0.0518679 +0.0161339 0.0672434 0.0514025 +-0.0693216 0.0620201 0.0176481 +0.0429729 0.0944315 -0.00180352 +-0.0494828 0.135763 0.0221907 +-0.060805 0.0867676 -0.0196616 +-0.0247298 0.125997 0.0151584 +0.059297 0.0608379 0.0211666 +-0.080116 0.153024 0.0299773 +0.0574282 0.0681585 0.00377242 +-0.0535498 0.0486673 -0.00635158 +-0.0304741 0.177281 -0.004356 +-0.0855011 0.0792275 0.0175034 +-0.0804698 0.130248 0.0526854 +0.000343862 0.0539275 -0.0306641 +-0.0900062 0.133811 0.0372136 +0.0104354 0.0347372 0.0259595 +-0.0574962 0.0440189 0.0444763 +-0.0573422 0.0335757 0.00237022 +0.0404449 0.0739232 0.0320846 +-0.00464724 0.0496642 -0.0307417 +-0.0311133 0.0510509 -0.015361 +0.0169782 0.128539 0.0144983 +-0.0872732 0.151714 0.0113029 +-0.0345546 0.0409268 0.0482929 +-0.0745628 0.173554 -0.0490908 +-0.0213027 0.0381376 0.0110019 +0.0223647 0.0782061 0.0499784 +0.0111959 0.0879068 -0.0311136 +0.0141654 0.115006 -0.0159235 +-0.0175094 0.116845 0.0368185 +0.0185047 0.0369619 -0.0146835 +-0.0924063 0.129578 0.0112381 +-0.00949945 0.0517772 0.0514996 +-0.0666563 0.0656524 -0.0048951 +-0.0494962 0.100168 0.0429965 +0.00776642 0.130336 0.022539 +-0.0564976 0.0904367 0.0452654 +-0.0648339 0.153263 -0.0390895 +0.0140569 0.12802 0.0248446 +-0.00977705 0.174183 -0.0237537 +-0.0154865 0.0530505 0.0500296 +-0.0627622 0.0810191 -0.0190992 +-0.0385594 0.173184 -0.00190958 +-0.00314149 0.0972112 0.0530078 +-0.0418773 0.107078 -0.0201516 +0.0363342 0.109637 -0.000829727 +0.021507 0.126326 0.01189 +-0.030496 0.0988081 0.0439786 +-0.0769628 0.150462 0.0371334 +-0.0941104 0.126894 0.0182531 +-0.0255083 0.112568 0.0366767 +-0.0746801 0.157704 -0.00556618 +-0.0418449 0.0971142 -0.0220611 +-0.0359493 0.125342 -0.00457539 +-0.0258164 0.0853463 -0.0368715 +0.0497106 0.0482066 0.0259506 +-0.0716942 0.1568 -0.0399156 +-0.0618117 0.0590403 0.0165038 +-0.0714498 0.15679 -0.0419165 +-0.0701989 0.0368637 0.0105096 +0.0597267 0.0636404 0.0201833 +-0.0915748 0.124221 0.0431828 +-0.0690929 0.156328 0.0219534 +-0.0302767 0.0622182 -0.0224251 +-0.00771091 0.0627931 -0.0356131 +0.0394872 0.0513548 0.03224 +-0.0229845 0.0724431 0.0499564 +-0.0290201 0.125445 0.00626167 +-0.0729777 0.138423 -0.00695981 +-0.00991212 0.111561 -0.0201766 +0.000200297 0.0825801 -0.036136 +0.0364442 0.0590953 0.0349595 +0.0364996 0.0928818 0.0370772 +-0.0181329 0.0432293 0.0524811 +0.00280759 0.0350639 0.0204847 +-0.0626379 0.152126 -0.0285986 +-0.0704211 0.15543 0.027334 +0.000301963 0.100099 0.0481787 +-0.049492 0.0917757 0.044207 +-0.015502 0.0897786 0.0564851 +-0.0318792 0.156356 -0.0104816 +0.0416778 0.102863 0.015161 +0.0504722 0.048918 -0.000684915 +-0.0611415 0.0359024 -0.0090437 +-0.0264937 0.098817 0.0439871 +-0.000436317 0.122463 0.0356275 +-0.0875676 0.129767 0.0460862 +-0.0312863 0.0777611 -0.0325602 +-0.0303664 0.112853 -0.0174686 +-0.00773829 0.0684701 -0.0360951 +-0.0647534 0.156678 -0.0475943 +-0.0891175 0.0983455 0.0194044 +0.00833741 0.055373 -0.0305597 +-0.0550257 0.131065 -0.00539027 +-0.0305029 0.0689001 0.0393777 +-0.0596554 0.0343168 0.0331724 +0.0436089 0.0680569 -0.000247417 +-0.0786395 0.163873 -0.0279533 +-0.0574243 0.0613459 0.0260206 +-0.0338728 0.0483909 -0.0193366 +-0.0287306 0.074519 0.0412207 +0.016916 0.0577101 0.0489225 +-0.0184307 0.0347944 0.0485523 +-0.0655112 0.0803784 0.0426229 +-0.0332327 0.160967 -0.000804209 +-0.0533105 0.0541891 0.0115512 +-0.0356689 0.117866 -0.0126779 +-0.0699903 0.034504 0.00971713 +-0.0588141 0.0341524 0.0282501 +-0.0177813 0.0770869 -0.0388032 +0.0445157 0.0467554 0.0289718 +0.00964716 0.128306 -0.00229994 +-0.0666126 0.148623 0.0392621 +-0.0325544 0.0348985 0.0454309 +-0.0623108 0.039732 0.0166963 +-0.0917483 0.122888 0.0433845 +0.0271866 0.0819517 -0.0229154 +-0.00863658 0.0467032 -0.0298179 +-0.0620847 0.166243 -0.0515916 +-0.0912832 0.125583 0.0428488 +-0.0588072 0.0481223 0.00266039 +-0.0913122 0.133748 0.0212171 +0.0482658 0.0433313 0.0185611 +0.00774922 0.0351262 -0.0136823 +0.0357585 0.0562848 0.0339755 +-0.029123 0.166739 -0.016877 +-0.0338028 0.122413 -0.00742547 +0.0216799 0.0415358 -0.0117265 +-0.0257594 0.171231 -0.0110774 +-0.0641199 0.162494 -0.0212451 +-0.0535748 0.155622 0.0115317 +0.0531674 0.0736169 0.0146631 +0.0135129 0.0347107 0.0374491 +0.0227019 0.123147 0.0266031 +0.025252 0.0719314 -0.0249494 +0.0309797 0.118122 0.0225615 +0.0415492 0.0724945 0.03012 +0.000493498 0.119652 0.0380928 +0.0229975 0.123119 -0.000380287 +0.0234322 0.100371 -0.0202365 +-0.0620057 0.153738 -0.0265835 +-0.0398723 0.105663 -0.0203219 +-0.0632416 0.0445478 0.0366988 +-0.0310386 0.154131 -0.00157547 +-0.0042992 0.0348909 0.0408189 +-0.00181562 0.0826307 -0.0368615 +0.0388816 0.0927717 0.0335536 +-0.0335058 0.0760991 0.0415371 +-0.0314963 0.0917789 0.0442247 +-0.0512549 0.0612644 0.0318233 +-0.00281159 0.131227 0.0100802 +-0.0531145 0.157563 -0.00324336 +-0.0635867 0.03486 0.0405057 +-0.0627936 0.15522 -0.0356106 +0.0166245 0.122097 0.0315907 +-0.0106759 0.119083 -0.0141801 +-0.0465015 0.0689677 0.0402969 +-0.0626599 0.0423324 0.0141491 +-0.0515376 0.053149 0.0306286 +0.00413437 0.124074 -0.00964261 +-0.0105331 0.127013 0.0275477 +-0.042312 0.0337552 -0.0130352 +0.0472026 0.0681414 0.0256953 +0.0213439 0.0741385 0.0502206 +0.0156241 0.128368 0.0211329 +0.0358549 0.0843357 -0.0172902 +-0.0533892 0.064921 0.0343521 +0.0273368 0.091573 0.0449418 +-0.0440333 0.0423079 -0.0173091 +-0.0764978 0.13864 0.0490601 +0.00750117 0.0716903 0.0560753 +0.0454321 0.0861887 0.0181684 +-0.0812985 0.084505 0.0328118 +-0.0605375 0.155317 0.003221 +-0.0065332 0.130449 0.0187888 +0.0247646 0.122114 0.0259409 +-0.0711064 0.152637 0.0345827 +-0.0155013 0.0716083 0.0551341 +0.0277791 0.0822205 0.0455159 +-0.0445183 0.0675631 0.0404632 +-0.0772746 0.147261 -0.00486297 +-0.0868795 0.0927253 0.00342064 +-0.0458425 0.0985138 -0.0217256 +-0.0906083 0.131058 0.0342318 +-0.091547 0.146101 0.0191506 +-0.00249086 0.116945 0.0398999 +0.0385734 0.0699568 0.0346425 +-0.0129648 0.116833 -0.0157687 +0.0215791 0.120444 0.0319368 +-0.0899229 0.115405 0.0270455 +-0.0697992 0.0836733 -0.0171139 +-0.0415794 0.128056 0.0149128 +-0.0734779 0.180121 -0.0504836 +-0.0466973 0.0665278 -0.0146823 +-0.0673893 0.156703 -0.00509746 +0.00108438 0.119342 -0.0145393 +-0.019494 0.0842608 0.0571688 +0.0285713 0.0551672 -0.0188053 +0.00650695 0.0731027 0.0564796 +-0.0557862 0.0854763 -0.0214113 +-0.0743851 0.163815 -0.0369793 +-0.0286768 0.123948 -0.00103929 +-0.0301123 0.163751 -0.0154896 +0.0410386 0.099944 -0.00278716 +0.00848446 0.0518256 0.0516867 +-0.051108 0.0530218 0.0319282 +-0.0905758 0.113954 0.0388293 +-0.00470317 0.038779 0.00289117 +-0.0247258 0.0638997 -0.032873 +-0.04111 0.159177 -0.0108205 +-0.0892399 0.140676 0.0351725 +-0.075004 0.141334 -0.0064915 +-0.0463338 0.132474 0.00863126 +-0.0541416 0.034749 0.0443256 +-0.0781873 0.168068 -0.0319708 +0.0328915 0.0696754 -0.0177356 +0.0346158 0.0369318 0.00517598 +-0.0694908 0.124597 0.0526574 +0.0581844 0.0711857 0.0106064 +-0.0378081 0.0841771 -0.022143 +-0.0281622 0.169703 -0.0179592 +0.0305485 0.118199 0.0238252 +-0.0289649 0.0747374 -0.0345478 +-0.0272221 0.0904382 0.0465675 +-0.0514982 0.0848246 0.0453901 +-0.051623 0.0531083 0.0226238 +-0.0398125 0.0899922 -0.0232612 +-0.0236559 0.0709438 0.0478646 +-0.053816 0.0559281 -0.00642904 +0.0603322 0.0636924 0.0181801 +-0.0884616 0.136381 0.00620417 +-0.0394936 0.046476 0.0404962 +-0.0530638 0.0723343 0.0404003 +0.0102711 0.0695708 -0.0315811 +0.0339253 0.115718 0.0108315 +-0.0295473 0.0358282 0.0521362 +0.0116453 0.090034 0.0538428 +0.0450904 0.0875663 0.0201674 +0.0326336 0.0519746 0.0346532 +0.03367 0.072742 0.0398859 +0.024638 0.124378 0.010214 +0.0415181 0.0484385 0.0321463 +-0.044143 0.159411 0.00624881 +-0.0495653 0.047469 -0.00900107 +-0.0894571 0.131034 0.0422704 +-0.075804 0.161028 -0.0299559 +-0.0164919 0.0968814 -0.0286925 +0.0229929 0.0371968 0.0317242 +0.0352506 0.101471 -0.011425 +-0.049558 0.0389942 -0.0116749 +-0.0223649 0.171249 -0.0132085 +-0.0667327 0.078026 -0.0171522 +0.0442166 0.0846846 -0.00180459 +-0.0518774 0.104165 -0.0200373 +-0.0393536 0.0336231 0.00416845 +0.00720473 0.0823989 -0.0333538 +-0.0288578 0.101545 -0.0231915 +0.0245524 0.106048 0.0391612 +-0.0851811 0.0897279 0.0280525 +-0.00334607 0.0347739 0.0411187 +-0.0430221 0.128224 0.015861 +0.0243931 0.0503998 -0.0217952 +-0.0394902 0.0506047 0.0393469 +0.0293799 0.0892796 -0.0205263 +-0.0574934 0.0875623 0.0444505 +-0.0644211 0.0347126 0.0370276 +-0.0169241 0.181626 -0.0193127 +-0.0564978 0.0732565 0.0410435 +-0.0544221 0.144671 0.0284168 +0.0203184 0.0650483 -0.0276666 +-0.0648645 0.041891 0.032665 +-0.0451284 0.159142 -0.00893675 +0.0451235 0.093189 0.0121575 +-0.0577489 0.0479998 -0.00135721 +-0.0606371 0.0448145 0.012064 +0.0495086 0.0638139 0.0293036 +0.0458685 0.0862133 0.0111669 +-0.0531099 0.136165 -0.00197183 +0.0285441 0.0509095 -0.0177614 +-0.013074 0.0383381 0.00704947 +-0.0223231 0.0391341 0.0387105 +0.0393846 0.0429207 -0.00283799 +0.0202147 0.0847891 -0.0269071 +0.00923869 0.035402 -0.0117616 +-0.060367 0.11933 -0.00999174 +-0.0772797 0.157576 -0.0127941 +-0.0732669 0.179344 -0.0490063 +-0.0683896 0.0420777 -0.000309277 +-0.0539058 0.102757 -0.0202213 +-0.0453256 0.169857 -0.00299568 +-0.0616838 0.0659304 -0.00830259 +0.00414244 0.129952 4.9397e-05 +-0.0404915 0.113924 0.0347061 +-0.0942425 0.120105 0.0182851 +-0.0324906 0.080327 0.0414535 +0.0529677 0.0595446 0.0290441 +-0.0904857 0.114242 0.0332623 +-0.0703591 0.181312 -0.0565189 +-0.0475241 0.112407 -0.0169253 +0.0109831 0.0341684 -0.0140433 +-0.089612 0.139257 0.0251846 +-0.0373738 0.0365422 0.044687 +0.0564401 0.0662549 0.00171258 +-0.0581251 0.0334091 -0.00125013 +-0.0407273 0.0696207 -0.0166002 +-0.0669961 0.165196 -0.05701 +0.0131268 0.120538 0.0349816 +0.0367009 0.0812747 -0.0157528 +-0.0077824 0.0784642 -0.0379203 +-0.0647128 0.155185 0.0278857 +0.00549498 0.0951378 0.0528545 +-0.0108057 0.0342947 -0.0255969 +-0.0911579 0.129687 0.0342384 +-0.080608 0.0720682 0.0165498 +-0.073439 0.148627 -0.0298053 +-0.0271937 0.174158 -0.0183459 +-0.0244966 0.0509689 0.0431921 +-0.00162246 0.0450436 -0.027024 +-0.0775221 0.104823 0.0340694 +0.0154861 0.0927165 0.0506449 +-0.0599536 0.123822 -0.00839074 +-0.079866 0.0706372 0.0115498 +-0.0815235 0.0899003 0.0328752 +0.0313378 0.118325 0.00558524 +0.0248331 0.123944 0.0188283 +-0.0898787 0.112224 0.0169361 +-0.0662043 0.065068 0.0280019 +0.0246717 0.0434401 -0.00867806 +-0.0469681 0.134154 0.0128397 +-0.0291377 0.0860908 -0.0335904 +0.0147704 0.0519654 0.0475176 +-0.0296475 0.169744 -0.0079151 +-0.0211888 0.175661 -0.0220113 +-0.0347689 0.0780934 -0.0215038 +-0.013019 0.129549 0.0120959 +0.0421932 0.0662609 -0.00283376 +0.0111358 0.0352671 0.0436641 +-0.0705399 0.100871 0.0399167 +-0.0604975 0.0832903 0.0437356 +-0.0659485 0.126772 -0.00885106 +-0.0702518 0.06756 0.0285092 +-0.00688661 0.108791 -0.0226031 +-0.0786437 0.112204 0.0464731 +0.00637271 0.130879 0.0205945 +-0.066894 0.110895 -0.0121462 +0.0123118 0.0623753 -0.0299343 +-0.0285044 0.109801 0.0380702 +0.00650421 0.0883449 0.0558788 +-0.0545694 0.124267 -0.00721739 +-0.0626588 0.161511 -0.0455953 +-0.0861214 0.132549 0.0473951 +-0.0627776 0.125519 0.0444184 +-0.0177321 0.160293 -0.0123373 +-0.0490182 0.0345781 0.0369526 +-0.0297799 0.106834 -0.0211406 +-0.079558 0.151858 0.0332132 +-0.0404921 0.0648693 0.0415314 +-0.0530069 0.153493 0.0132253 +-0.0339683 0.0485791 0.0404406 +-0.0421354 0.0449426 -0.0173193 +-0.0517467 0.076797 -0.0188523 +-0.060863 0.0583083 0.0137477 +0.0112347 0.0794806 -0.0318525 +0.00351036 0.0856577 0.0572413 +-0.0648576 0.101039 -0.0173044 +-0.0601123 0.0381131 0.0455939 +-0.015494 0.0515277 0.0489706 +-0.0275254 0.1668 -0.00838328 +-0.0365126 0.077567 0.0421306 +-0.0195832 0.1596 -0.0115811 +0.00251466 0.0744821 0.0563666 +0.0589788 0.062133 0.0220601 +-0.066902 0.117219 0.0507079 +-0.0396194 0.0335538 -0.0253204 +-0.0297618 0.107877 -0.0202294 +-0.00601771 0.0990415 0.0504631 +-0.084398 0.0778007 0.013518 +0.0271613 0.0368693 0.0238228 +-0.0589877 0.0335902 0.00921609 +0.029871 0.0968887 0.0415927 +0.00949394 0.0426698 0.0450285 +-0.0697739 0.0382195 0.0100596 +0.0231426 0.0768603 0.0493195 +-0.00501253 0.125042 0.0324689 +-0.00710159 0.0387114 0.00061319 +-0.0177128 0.0599179 -0.0354327 +-0.045698 0.157938 0.00750606 +0.00190257 0.130874 0.00322319 +-0.0444648 0.0945053 0.0429498 +-0.0772757 0.148645 -0.0058688 +-0.069822 0.156776 -0.00162593 +-0.0445001 0.117958 0.0308281 +-0.0409685 0.0462375 -0.0173222 +-0.0305996 0.0509893 -0.0173575 +0.00196704 0.0385066 0.0244659 +-0.00668986 0.0584241 -0.0339312 +-0.0587805 0.0811174 -0.0202922 +-0.0492044 0.143127 0.00539863 +-0.0686509 0.155409 0.00612964 +-0.0404209 0.150087 -0.00469474 +-0.00449521 0.0925603 0.0561444 +-0.000397233 0.131333 0.0167016 +-0.0552402 0.138165 0.0306253 +0.0215752 0.056436 0.0468827 +-0.0248564 0.100174 -0.0239639 +-0.0165731 0.0386082 0.0295958 +0.0232801 0.125085 0.0182493 +0.0228318 0.0357435 0.0257706 +-0.0492021 0.127407 -0.00458885 +-0.0878029 0.112934 0.0313303 +0.0465727 0.0554592 0.0320923 +-0.0288967 0.0499669 0.0438168 +-0.000173892 0.120963 -0.0122496 +-0.0704499 0.154022 0.0317661 +-0.0151711 0.0346724 0.0458457 +-0.0640566 0.138182 0.0390191 +0.0398408 0.105612 0.0201716 +0.0444976 0.0583814 0.0318302 +0.031639 0.0370094 0.0209702 +-0.0104878 0.112778 0.0413082 +-0.0672962 0.0785128 0.0408262 +-0.0760729 0.0675487 0.00755458 +-0.0571409 0.0642584 0.0323718 +0.0261418 0.0859362 -0.0230192 +-0.015502 0.0856307 0.0568812 +0.0189265 0.119915 -0.00924366 +-0.0119328 0.103575 -0.0236984 +-0.00622128 0.0384574 0.0119659 +-0.0779451 0.128117 -0.00684087 +-0.0657248 0.120041 0.0506761 +-0.0623817 0.147548 -0.00757469 +-0.0875561 0.121673 0.0477803 +0.0222529 0.0365833 0.0139797 +-0.00142937 0.126525 -0.00622577 +-0.0226373 0.0386776 -0.0154938 +-0.0648114 0.0335165 0.00450366 +0.0210136 0.0713836 0.0497227 +-0.0348346 0.0347214 0.0345782 +-0.027609 0.0850124 0.048532 +-0.0856119 0.0819492 0.0204815 +-0.0601038 0.0347331 -0.00989443 +0.00929494 0.0956507 -0.0272714 +-0.0915391 0.118654 0.00731945 +-0.00449819 0.0604864 0.0551163 +0.0204818 0.0854612 -0.0266087 +-0.0429251 0.129071 0.00699388 +-0.0789967 0.138332 -0.00474353 +0.0343592 0.0519767 -0.00689954 +-0.0921408 0.125525 0.040859 +0.0516782 0.0702939 0.00352664 +-0.022659 0.0508417 -0.0286643 +-0.00138527 0.0424799 0.0468649 +0.0452912 0.0903849 0.0031762 +0.0401652 0.0717052 -0.00977551 +-0.0905185 0.148805 0.0131551 +-0.0470106 0.149195 0.00904699 +-0.0201874 0.0711262 0.0528634 +-0.0555353 0.0388223 -0.0103544 +-0.0714965 0.154091 0.0314059 +0.0232354 0.0968772 0.0460698 +-0.020264 0.0381835 0.0111715 +-0.0267635 0.177003 -0.0181719 +-0.0755105 0.151351 -0.0138965 +-0.00749931 0.0925693 0.0562701 +-0.063994 0.152679 -0.0352218 +0.0453927 0.0833662 0.00319518 +-0.0137973 0.081348 -0.0391911 +-0.0433806 0.120699 0.0278302 +0.0462048 0.0792353 0.00618416 +-0.0498122 0.141672 0.00439987 +-0.0592291 0.156682 0.00368263 +-0.0525972 0.055954 -0.00763978 +-0.0796979 0.108952 0.0363543 +-0.0334959 0.0335656 -0.024125 +0.0047441 0.131688 0.0100125 +-0.0530342 0.15087 0.0203968 +-0.0794975 0.133078 0.0519067 +0.0231582 0.125381 0.0124998 +-0.0898343 0.122953 0.0457467 +0.0336909 0.115719 0.00499933 +-0.0364989 0.0705154 0.0419282 +-0.0641133 0.155183 -0.0406054 +-0.0303694 0.034667 0.0426012 +-0.0474034 0.126784 0.0277907 +0.0312862 0.107094 -0.0114403 +-0.0399374 0.122179 0.0274746 +-0.0715157 0.106884 0.0372861 +0.0432452 0.100105 0.0111579 +-0.0264035 0.0386467 -0.0143525 +-0.053047 0.162457 0.00378602 +-0.0573985 0.155942 0.000257732 +-0.0104925 0.119661 0.037142 +-0.0107108 0.0656519 -0.03625 +0.0153129 0.0637748 -0.0295702 +-0.047649 0.128193 0.0275289 +-0.0395091 0.0986823 0.0417741 +0.0582857 0.0709436 0.0165587 +0.0144142 0.0418406 -0.0232939 +-0.0406818 0.0636695 -0.0135779 +-0.0700194 0.0408862 0.000674154 +-0.0898984 0.139201 0.0142132 +-0.0368759 0.102855 -0.0211016 +-0.031161 0.177923 -0.0048433 +-0.0216559 0.0380957 0.0145856 +-0.00121026 0.129846 0.000241032 +-0.0176504 0.0583335 0.0507279 +0.0492902 0.0704301 0.0235452 +0.008888 0.126629 0.0301427 +-0.0897638 0.136555 0.0361946 +-0.0903944 0.113745 0.0354564 +0.0327067 0.0659933 0.0401778 +-0.0167299 0.0383654 0.0243772 +0.0403616 0.0561214 -0.00579676 +-0.0891677 0.150225 0.0241083 +-0.0128992 0.165641 -0.0199242 +-0.0596113 0.0581543 0.0105384 +0.0326521 0.108705 0.0315863 +-0.0448105 0.126695 -0.00590468 +0.0440256 0.0973461 0.0131583 +-0.0694635 0.0618968 0.00696654 +-0.0667991 0.06462 0.0265045 +0.0388894 0.060327 0.0314833 +0.0120611 0.11304 -0.0178164 +-0.0635386 0.151731 -0.00361755 +-0.00656125 0.130634 0.0158888 +0.0344174 0.0430387 -0.00433126 +-0.00549778 0.129792 0.00189197 +-0.0499313 0.134148 0.000258943 +-0.0563569 0.155043 0.0148967 +-0.00737522 0.0388161 -0.00139235 +0.0283929 0.0347449 0.011384 +-0.010683 0.0908469 -0.0364652 +-0.048501 0.109818 0.0382143 +-0.0690431 0.169001 -0.0273587 +0.0102657 0.0954683 -0.0270889 +0.0126468 0.0820043 0.0535026 +-0.0507783 0.0613366 0.0327704 +0.00559724 0.128727 -0.00267638 +-0.044734 0.0724552 -0.0176324 +-0.0283736 0.0336157 -0.0231629 +-0.0679859 0.155562 0.00782161 +-0.0939853 0.126886 0.0172543 +-0.0238126 0.0840242 -0.0378907 +-0.0152029 0.16973 -0.0225848 +0.0303318 0.0382842 0.0249985 +-0.0463034 0.0382871 -0.0172845 +-0.012857 0.0968183 -0.0306036 +0.0139515 0.0933972 -0.0268828 +-0.0598089 0.0334419 -0.0052474 +-0.0682308 0.180685 -0.0584278 +-0.0564615 0.0452367 0.0437224 +0.0122525 0.036039 -0.0217262 +-0.0324956 0.119317 0.0295507 +-0.050852 0.0985174 -0.022094 +0.0359226 0.0926166 -0.0140085 +0.0475195 0.0583521 0.0315949 +0.00440154 0.12483 0.0329119 +-0.0725064 0.152612 -0.0398907 +-0.00124079 0.0388178 0.0271443 +-0.0855936 0.143251 0.00719107 +-0.0618131 0.161554 -0.0315928 +-0.0315498 0.0848744 -0.0295692 +-0.0167783 0.0770825 -0.0387039 +-0.024832 0.0930098 -0.0316179 +-0.0356976 0.121856 -0.0088333 +0.0456324 0.0875991 0.0131626 +0.0344601 0.0660136 0.0392214 +0.008313 0.0639391 -0.0318667 +0.0352496 0.0656442 -0.0147977 +-0.0468498 0.0999476 -0.0216953 +-0.0215077 0.111305 0.0395987 +-0.0345319 0.122423 0.0264163 +0.0333657 0.0835669 0.0412915 +-0.0594982 0.143919 0.0350801 +-0.0210079 0.184692 -0.0198306 +-0.09225 0.125605 0.0402535 +-0.0764966 0.117544 0.0520468 +0.0261457 0.100404 -0.0183041 +0.0314049 0.0431209 -0.00494122 +-0.000675964 0.056864 -0.0322097 +-0.0759667 0.135448 -0.00632576 +0.0194608 0.0865014 0.0497298 +0.0480114 0.0447211 0.0227621 +0.0382636 0.109749 0.0121659 +-0.0191397 0.0920316 0.0539979 +0.0148906 0.112386 -0.0170744 +-0.0156084 0.0378086 -0.0269252 +0.0166879 0.0355485 0.0409566 +-0.0719103 0.125286 -0.00863314 +0.0390766 0.0901064 0.0338413 +0.0238446 0.123573 0.0241681 +0.0180905 0.1262 -1.26099e-05 +-0.0241861 0.0351713 0.0521271 +-0.0864494 0.107673 0.0113573 +0.00554907 0.0341243 -0.0169616 +-0.0740319 0.152138 0.0351116 +-0.00773495 0.12664 -0.00628182 +-0.0408221 0.0343419 0.0301151 +0.0589083 0.0700926 0.0167877 +-0.0321537 0.168198 -0.0161712 +-0.0504087 0.0385253 -0.0116443 +-0.0719982 0.132651 0.0504199 +-0.0314938 0.0946271 0.0446065 +0.0415387 0.0610238 0.0295203 +0.0439094 0.0623682 -0.0025277 +-0.0745832 0.173457 -0.038075 +-0.0135013 0.163627 -0.011822 +0.00544999 0.097676 0.0507202 +-0.0233157 0.0695067 0.0475588 +0.0280693 0.112767 0.0337398 +0.0217645 0.057833 0.0471676 +-0.0875176 0.123015 0.0477063 +-0.0696847 0.0339658 -0.0022881 +-0.0251326 0.166747 -0.01768 +-0.0196064 0.177176 -0.0161969 +-0.0704588 0.109521 0.0380634 +-0.068398 0.171087 -0.0357069 +0.0111209 0.0908234 -0.0303895 +-0.0634854 0.149796 0.0371525 +0.00199826 0.122137 -0.0115071 +-0.0620402 0.161574 -0.0285866 +0.0543448 0.0567886 0.0274783 +0.00150309 0.0619973 0.0566118 +-0.0476286 0.0532889 -0.00972253 +0.0589424 0.064749 0.0219118 +0.00619535 0.0866083 -0.0331365 +0.00933928 0.0947261 -0.0283032 +0.0354634 0.113562 0.00993821 +-0.0622597 0.0337543 0.0119702 +-0.0286126 0.0778208 0.0441079 +-0.0291848 0.0649007 -0.0284708 +0.00716146 0.130043 0.000903466 +0.00854238 0.122369 -0.0118647 +0.0207709 0.0422154 0.0420468 +-0.0728566 0.114991 -0.00711315 +-0.062327 0.161572 -0.0265871 +-0.029645 0.121258 -0.00823608 +-0.0358448 0.0971832 -0.0228124 +-0.0241278 0.166765 -0.0179136 +-0.0833762 0.111067 0.0302504 +-0.0714085 0.0715566 0.0335759 +-0.0285052 0.11799 0.0309781 +-0.0436341 0.171062 -0.00299049 +-0.0254563 0.120601 0.0288472 +0.029856 0.0552774 -0.0168073 +-0.0277474 0.076815 -0.0357774 +-0.0305568 0.0845973 0.042796 +-0.0927119 0.117479 0.0363033 +0.00128405 0.131584 0.0158806 +-0.0853072 0.129862 0.0494994 +-0.0379579 0.11044 -0.0188969 +-0.0647113 0.0736859 -0.0158833 +-0.055064 0.0698751 0.038539 +-0.049499 0.0747526 0.0426395 +-0.0315694 0.0461612 0.0465874 +-0.0452548 0.169651 -0.00135352 +-0.0891941 0.0888738 0.0164555 +-0.0424866 0.0396651 0.043393 +-0.0870945 0.0846532 0.00548002 +-0.0530436 0.142764 -0.000526483 +-0.0664988 0.146992 0.0401715 +-0.0606301 0.0613516 -0.00265703 +-0.0321846 0.121876 0.025771 +0.0462743 0.0806463 0.0131736 +0.0355309 0.0527205 0.03199 +-0.0515418 0.0389441 -0.0114685 +0.0203586 0.0565379 -0.0271575 +-0.065976 0.0624665 0.0232686 +-0.0399438 0.0336374 -0.0217314 +-0.0584862 0.0833066 0.0438144 +-0.0449507 0.157934 0.00683281 +-0.0161733 0.168253 -0.0210405 +-0.0807961 0.0747709 0.0205502 +-0.0450711 0.153185 -0.00674331 +0.0122509 0.0766796 0.0546284 +-0.0165839 0.159908 -0.00982549 +-0.000693426 0.0367942 0.0054988 +-0.051438 0.0643214 0.0343604 +0.0173166 0.0411975 -0.0216758 +-0.0350925 0.0344983 0.0186791 +-0.0263041 0.10845 -0.0208491 +-0.0233997 0.0384863 0.0301002 +0.0336304 0.116029 0.0121428 +-0.084184 0.106292 0.0253661 +-0.0668605 0.102389 -0.0157781 +-0.0617744 0.0585089 0.0133805 +-0.037501 0.0634549 0.0414009 +0.0430852 0.0973049 0.0211625 +-0.0895621 0.0902365 0.017449 +0.0358939 0.0591552 0.0359628 +0.00041272 0.0994106 0.0497851 +0.0297429 0.112241 -0.00897067 +-0.0614607 0.155749 0.0232098 +-0.0190678 0.0347878 0.0501361 +0.0278403 0.121636 0.00711658 +-0.0293538 0.0475081 0.0471486 +-0.0878748 0.0861246 0.0134664 +-0.065267 0.132559 0.042478 +-0.0557536 0.0782586 -0.0197587 +0.0163546 0.0537375 -0.0279072 +-0.0768389 0.102007 -0.0101454 +-0.0762457 0.0708701 0.0261488 +-0.0434929 0.0410777 0.0433607 +-0.0820951 0.100566 -0.0055776 +-0.0124865 0.114128 0.0400495 +0.0495003 0.0496818 0.0274333 +0.0157351 0.0562704 0.0489701 +-0.0269138 0.0660937 -0.0314934 +-0.0205217 0.0448565 0.0528623 +-0.0147659 0.0742889 -0.0388052 +0.0292558 0.120076 0.0204837 +-0.0416192 0.0505822 -0.0110011 +0.00560187 0.0957087 -0.0293479 +-0.00449169 0.0575673 0.0538908 +0.0302324 0.0374168 2.32521e-05 +0.0404422 0.105635 0.0151656 +-0.0407521 0.0782965 -0.0192261 +-0.0321404 0.106348 -0.0206098 +0.0240312 0.1242 0.0213823 +0.0163901 0.0476981 -0.0240512 +-0.0540847 0.0341953 0.0274512 +0.0565883 0.0716209 0.0188851 +-0.063971 0.0343652 0.0164556 +0.0222263 0.0790988 -0.0263649 +-0.0480529 0.15019 -0.0042011 +-0.0364615 0.155102 -0.00949574 +-0.0107913 0.165034 -0.0192459 +-0.0720629 0.166594 -0.0198059 +0.0596228 0.0581166 0.00817617 +0.0193916 0.12656 0.0211758 +-0.029103 0.162278 -0.0149633 +-0.0114929 0.118282 0.0379089 +-0.0766495 0.0810868 -0.0106019 +-0.00184307 0.128669 -0.00252946 +-0.0100488 0.177211 -0.0257537 +-0.0544738 0.0624824 0.0299832 +-0.0840733 0.0966087 -0.0036103 +-0.0707265 0.080778 -0.0161096 +-0.0214771 0.122102 0.0291424 +-0.0428932 0.0358165 0.00869673 +0.0135568 0.129672 0.01894 +-0.00280854 0.081222 -0.0368531 +0.00517895 0.130408 0.0230466 +-0.067269 0.167119 -0.0252721 +-0.00747948 0.0919417 -0.035549 +-0.0365036 0.0478079 0.0395886 +-0.0569665 0.0548885 0.00161507 +-0.0744851 0.0663284 0.00571192 +0.0455621 0.0889987 0.00417598 +-0.0292503 0.036802 0.0530596 +-0.0435044 0.0605182 0.0400424 +-0.0915766 0.14196 0.0161629 +-0.0696706 0.14899 -0.0379959 +-0.0770107 0.152809 -0.00688788 +-0.0705529 0.0628294 0.0184736 +-0.044794 0.0870021 -0.0219374 +-0.0107414 0.120001 -0.0131465 +-0.000720709 0.0669492 -0.0343521 +-0.0214315 0.0906458 0.0534872 +-0.0354995 0.0619703 0.0405316 +-0.0628269 0.1502 -0.00476792 +-0.0640626 0.136748 0.0389546 +-0.0474986 0.102884 0.0412273 +-0.0116527 0.129557 0.00826831 +-0.0347732 0.0337732 -0.0208295 +-0.0214023 0.161048 -0.0139992 +-0.0752954 0.15636 -0.00353298 +-0.0688076 0.150274 -0.0424283 +-0.0238582 0.0382811 0.0283891 +-0.0935937 0.118737 0.0143019 +0.0184606 0.0475775 0.0422564 +0.00850874 0.0575011 0.0529664 +-0.0532082 0.149319 0.0233918 +-0.0320154 0.082069 -0.0305372 +-0.0190294 0.0739916 0.05444 +-0.00216392 0.0992947 0.0503069 +-0.0162644 0.11453 -0.017303 +0.0278981 0.113772 -0.00862034 +0.0459848 0.0602104 -0.00435135 +-0.0564936 0.0465915 0.0420515 +0.0169002 0.103075 -0.0211457 +-0.00731691 0.128182 0.0272242 +0.0205916 0.112587 0.0371117 +-0.0176105 0.0435992 -0.0276633 +-0.0274971 0.0619365 -0.0294418 +0.000272434 0.109746 -0.0202486 +0.0416377 0.084481 -0.00877138 +-0.0784224 0.0725404 0.0242536 +-0.00880164 0.0826803 -0.0379328 +-0.0147316 0.0685868 -0.0380387 +0.0333786 0.0476367 -0.00619535 +0.00348805 0.0413645 0.0460201 +-0.0227229 0.0625945 -0.0340193 +-0.0669932 0.138471 -0.00790807 +-0.037224 0.169679 -0.0130647 +0.0535575 0.0477942 0.0072134 +-0.0575878 0.158069 0.0020235 +0.0345395 0.0727588 0.0393885 +-0.0699466 0.072981 0.0361776 +0.020686 0.0367224 0.0371237 +-0.0728722 0.0355547 0.00103582 +0.00487825 0.131703 0.0129125 +0.0580945 0.0523756 0.014183 +-0.0866528 0.145956 0.0348405 +-0.00749813 0.125151 0.0317009 +0.0403042 0.0398794 0.0201445 +0.0355341 0.0875716 0.0391778 +-0.0249398 0.157384 -0.00964166 +0.00350274 0.0489558 0.0513808 +-0.00381736 0.131135 0.0125816 +-0.00837752 0.0353543 0.048476 +0.0140849 0.129676 0.00773008 +-0.010101 0.102023 -0.0240718 +0.0446756 0.091763 0.0191604 +-0.0637279 0.173384 -0.0513558 +-0.031495 0.061765 0.0382603 +0.0366571 0.0968397 -0.0108144 +-0.0285085 0.115306 0.0336868 +-0.00497421 0.126254 0.0309961 +0.00248615 0.104372 0.0430232 +0.00642086 0.116423 -0.0174422 +-0.0636795 0.0658475 -0.00727738 +-0.0891519 0.0956005 0.0104313 +-0.0860649 0.0994533 0.00140442 +-0.0735831 0.152654 -0.0328925 +0.00651157 0.066084 0.0555109 +0.0344822 0.102017 -0.0120204 +-0.0637552 0.15245 -0.00517189 +-0.077532 0.159745 -0.0169143 +0.00251128 0.0661582 0.0562906 +0.0151093 0.0887421 0.0518346 +-0.00945842 0.0387253 -0.00172767 +-0.0471724 0.133935 0.00981498 +-0.0188178 0.158773 -0.00942574 +-0.0194961 0.0654004 0.0509321 +-0.0774489 0.163906 -0.0229523 +-0.0267283 0.156621 -0.00899742 +-0.0465008 0.111213 0.0371008 +-0.00249784 0.0939038 0.0553992 +-0.0715513 0.0342218 0.00249626 +0.0107439 0.130936 0.0122066 +0.0266603 0.0421651 0.0343135 +0.011996 0.0344545 0.00276628 +-0.0653727 0.074532 0.0393295 +-0.0417745 0.172541 -0.00446528 +-0.0368752 0.0345479 0.0395694 +0.00440907 0.131695 0.0141669 +0.0189748 0.0699869 0.0502663 +-0.0690298 0.155601 0.00744971 +-0.0265663 0.0356908 0.0529027 +-0.0621593 0.13389 0.0382274 +-0.0375341 0.0356789 0.0117182 +-0.00861273 0.0434199 -0.0261503 +0.0317849 0.0490447 0.0333888 +-0.0637123 0.0445754 0.0336875 +0.0376665 0.0374378 0.0089364 +-0.058497 0.0904388 0.0452323 +-0.0442728 0.0437529 -0.0143172 +0.0204519 0.0357096 0.00704168 +0.0282191 0.0941913 -0.0197138 +-0.0688839 0.117973 -0.00851105 +0.0338372 0.104851 -0.0110391 +0.024912 0.0505255 0.0392969 +0.0125119 0.107097 0.0421465 +-0.00117532 0.0998676 -0.0237773 +0.0246952 0.0420222 0.0382704 +-0.0398433 0.0971287 -0.022179 +0.0268619 0.108823 -0.0133055 +-0.0799271 0.140795 0.0466609 +0.0180138 0.0808533 0.0524986 +-0.0868879 0.111328 0.0363925 +0.000567537 0.0921561 -0.0336854 +-0.0892038 0.0969467 0.00941895 +0.00816432 0.0904541 -0.0318561 +-0.064746 0.155508 0.00899366 +-0.0911853 0.113324 0.0173235 +-0.00120622 0.113981 -0.0187843 +-0.00924245 0.0407867 0.049553 +-0.00349897 0.0575855 0.053786 +-0.0375091 0.0407357 0.0441865 +-0.0584982 0.108398 0.0387966 +0.0391307 0.0786589 -0.0107679 +-0.0474967 0.100136 0.0424923 +0.0275962 0.102142 0.0400686 +0.0233313 0.0578274 -0.025582 +-0.0510235 0.0723937 0.0407728 +0.0280639 0.121158 0.0057742 +-0.0318235 0.0637622 -0.0194381 +-0.038893 0.0378836 0.042947 +-0.0455156 0.14919 0.00769333 +-0.0724664 0.0678961 0.0260135 +-0.0614699 0.156861 -0.0255852 +0.0511802 0.0687267 0.0256724 +-0.0639329 0.153712 -0.0368711 +-0.055548 0.0628794 0.0303893 +0.0228246 0.0344564 0.00866393 +0.0333583 0.0505553 -0.00686804 +-0.0436286 0.0534388 -0.0110764 +0.0170321 0.128388 0.0173658 +-0.0484634 0.122511 0.0297787 +-0.0908772 0.119982 0.00630567 +-0.0251882 0.121015 0.0283088 +-0.0621056 0.167818 -0.0515918 +-0.0434918 0.0451945 0.0416496 +-0.0261859 0.172679 -0.0191085 +0.0581533 0.0685799 0.00535861 +-0.0308235 0.12443 -0.00028071 +-0.088653 0.0982606 0.00741366 +0.000114549 0.110154 -0.0201623 +0.032895 0.11463 -0.00105927 +0.0393368 0.0984458 -0.00682083 +0.0171551 0.0988258 -0.0226279 +0.0605804 0.0651016 0.017176 +-0.0528261 0.149337 0.0214103 +-0.0213292 0.159914 -0.0125433 +0.000685965 0.124734 0.0330095 +0.0425127 0.0872289 0.028142 +-0.0754377 0.172239 -0.0469918 +-0.00949675 0.039136 0.0341772 +-0.0750736 0.0773173 0.0349007 +-0.0204972 0.104391 0.0429524 +0.044682 0.0804275 0.0241291 +0.0288766 0.0477511 0.0362254 +-0.0590849 0.0584397 0.0175987 +-0.0187468 0.0685918 -0.0381091 +-0.0908268 0.137853 0.0181986 +-0.0934137 0.128236 0.0152484 +-0.0722094 0.155629 0.00630789 +-0.0701241 0.109501 0.0382316 +-0.0833629 0.0829469 -0.00357326 +-0.0219158 0.177176 -0.0142605 +-0.0038834 0.0389548 -0.00453366 +-0.0468309 0.0956366 -0.0220125 +0.0589161 0.0621713 0.00415053 +-0.0518659 0.144686 0.0163701 +-0.0589723 0.0448133 0.0132235 +0.05973 0.0664208 0.00812497 +-0.0911185 0.128332 0.0402364 +0.0082766 0.0667723 -0.0317926 +-0.0557755 0.0826404 -0.0214196 +-0.0254275 0.181837 -0.00892324 +-0.0899879 0.140645 0.0281829 +-0.0725199 0.141421 0.0466976 +0.0173961 0.0343459 0.000212982 +-0.0435004 0.0424369 0.0431009 +-0.0397849 0.155107 0.00553982 +0.0474231 0.0702463 0.00356979 +0.00935197 0.130836 0.00599246 +-0.0466333 0.0562665 -0.0109539 +-0.0134154 0.0393527 0.0385623 +0.0202221 0.0721388 -0.0279345 +-0.0855696 0.139064 0.00222203 +-0.0690425 0.0382325 0.0107396 +-0.0147406 0.129011 0.0158201 +-0.0436768 0.0636379 -0.0137577 +0.058107 0.0694858 0.00643586 +-0.0523916 0.160438 -0.00307609 +-0.0208502 0.120881 -0.00994613 +-0.0144972 0.0772805 0.0565653 +0.0146633 0.0548535 0.0491553 +-0.0872189 0.103599 0.00739967 +-0.013497 0.0701643 0.0543951 +-0.0727808 0.161025 -0.0379399 +0.0541744 0.0495318 0.0218692 +-0.0180637 0.122407 0.0308158 +-0.0437406 0.150663 0.00676805 +-0.0471693 0.128157 0.0265222 +0.000324051 0.0583269 -0.0327186 +0.0183373 0.109817 -0.016338 +-0.0826495 0.137607 -0.000712655 +0.0256839 0.122773 0.00490001 +0.0354824 0.111268 -0.000157004 +-0.0457208 0.0643263 0.038969 +0.0547017 0.0700348 0.00381661 +-0.00761606 0.128811 0.0256727 +-0.0687402 0.156349 0.0177202 +-0.085121 0.108927 0.00536277 +-0.0739548 0.136937 -0.00691386 +-0.00649589 0.0884166 0.05709 +-0.068322 0.144999 -0.0199128 +-0.0891584 0.142048 0.0331685 +-0.0282821 0.0889315 -0.0326167 +-0.0270715 0.0381475 0.00619785 +0.0226739 0.0430625 -0.011732 +-0.0895091 0.147137 0.0278175 +-0.0396286 0.0534411 -0.011004 +-0.0570587 0.0521462 0.00466373 +-0.0421407 0.162162 -0.0108328 +-0.0831356 0.0816494 -0.00150376 +-0.0274399 0.180304 -0.00715734 +-0.055838 0.0927189 -0.0219026 +-0.0624754 0.163097 -0.0475912 +-0.064973 0.0365283 0.0405192 +-0.0434783 0.0690982 0.041489 +0.0407433 0.102836 0.021176 +-0.0588838 0.0468495 0.0306747 +0.00493781 0.100395 -0.0223096 +0.00122691 0.116615 -0.0176232 +-0.035551 0.0451135 -0.0264751 +-0.025842 0.091626 -0.0326108 +0.0509675 0.0463703 0.0218015 +-0.077144 0.164539 -0.0230622 +-0.0613807 0.122656 0.0428396 +0.0364941 0.0454217 0.0304675 +-0.0655017 0.0931357 0.0435076 +-0.0869021 0.114398 0.00327085 +-0.0624965 0.109755 0.0377659 +-0.0219613 0.124807 -0.00195706 +-0.0564977 0.109762 0.0379025 +-0.0489044 0.0413839 -0.0112514 +-0.0464999 0.104301 0.0412272 +-0.0689362 0.173831 -0.0430963 +-0.0274521 0.175685 -0.00821886 +-0.00850113 0.0633575 0.0560799 +-0.0350673 0.0752529 -0.020583 +-0.0702674 0.128451 0.0511564 +-0.0318141 0.156607 0.00124178 +0.0187844 0.127527 0.00803838 +-0.0133229 0.0978873 -0.0277326 +0.00349851 0.0356817 -6.66678e-05 +-0.0714787 0.0630924 0.012741 +-0.0723877 0.16801 -0.0460141 +-0.0314985 0.12639 0.0112101 +0.0103131 0.0935662 -0.0290602 +0.0162881 0.0708862 -0.0299631 +-0.0486922 0.0693814 -0.0146213 +-0.00965082 0.0496857 -0.0310806 +-0.0472721 0.035073 0.043832 +-0.0505797 0.0528906 0.0145102 +-0.00843296 0.037899 -0.0156923 +-0.0276376 0.0383723 -0.00322479 +-0.0394609 0.174124 -0.00699657 +-0.0444987 0.125316 -0.00848377 +0.0413134 0.0732089 -0.00778125 +-0.0654437 0.17819 -0.0606312 +-0.0194942 0.0498847 0.046612 +-0.0470957 0.0376632 0.0453493 +-0.0435029 0.0832144 0.0426759 +-0.0134871 0.123689 0.0319378 +-0.0174978 0.0744121 0.0553624 +0.0333782 0.11597 0.0192002 +-0.0203318 0.0946383 0.0508766 +-0.0412055 0.0419705 -0.0232873 +-0.0815038 0.0885533 0.0328994 +-0.0703591 0.0620888 0.0120183 +-0.0334658 0.0396217 0.0500837 +-0.036771 0.0343273 0.0309808 +-0.0165061 0.126041 -0.00139683 +0.0369819 0.102039 0.0307859 +-0.0207502 0.0626823 -0.0352205 +0.0061481 0.104478 -0.0212191 +0.0323926 0.117262 0.0173907 +-0.0357746 0.08137 -0.0222094 +-0.0375579 0.0341991 0.0273875 +-0.0503289 0.0543622 0.0156654 +-0.0287388 0.076371 0.0428795 +-0.0631791 0.0597373 0.0065938 +-0.00649181 0.104468 0.0439265 +0.00653601 0.0924318 -0.0319265 +-0.0371937 0.168177 -0.0134205 +-0.0375614 0.128197 0.00751871 +-0.0898903 0.135179 0.0352087 +0.037196 0.0699864 0.036159 +0.0276189 0.0564968 -0.0197599 +0.0447325 0.0931835 0.0161662 +0.0398803 0.0927067 0.0314285 +-0.0468272 0.125328 0.0268353 +-0.0715318 0.0347543 -0.000134182 +-0.0859938 0.0978404 0.0272064 +-0.0460065 0.0410789 -0.0142843 +-0.0499829 0.0586014 0.0334591 +-0.0614235 0.172219 -0.0618413 +0.00350193 0.0474397 0.0500395 +0.0226438 0.0875613 0.0487078 +0.0374992 0.0644481 -0.0117672 +-0.00648083 0.111994 -0.0206545 +-0.0934649 0.120072 0.0123034 +0.00542168 0.12935 -0.00135496 +-0.0765071 0.126009 0.0528667 +-0.0308338 0.109919 -0.0183719 +0.018594 0.125548 0.0250901 +-0.0205082 0.0474421 0.0508554 +-0.0252811 0.168282 -0.0104061 +-0.051716 0.150726 0.0145842 +-0.0317716 0.0863018 -0.027557 +-0.0793223 0.151473 0.000118749 +-0.0823192 0.154091 0.0115231 +0.0432611 0.071972 -0.00279979 +-0.0761461 0.154973 -0.00265921 +-0.032878 0.156591 -0.0107994 +0.0360211 0.0628935 -0.0127986 +-0.0321679 0.120788 0.027294 +-0.00521106 0.038426 0.0176436 +0.0377365 0.0388851 0.0205214 +0.0183131 0.127887 0.0164149 +-0.0580398 0.0608775 0.0245548 +-0.0791963 0.108632 0.0349508 +-0.00201716 0.131125 0.0175388 +0.0407504 0.0633497 -0.00473671 +0.0447287 0.0917385 0.00119217 +-0.0534928 0.0848236 0.0453456 +0.00605741 0.0346665 0.039556 +-0.0276244 0.0436594 -0.0289391 +-0.00868086 0.056987 -0.0336771 +-0.058573 0.0613666 -0.00334192 +0.00741372 0.0360842 -0.0231635 +0.00514996 0.0337963 0.0112147 +-0.064123 0.113942 -0.0123233 +0.0527625 0.0723674 0.0204268 +-0.0354974 0.0634085 0.0409173 +0.0287147 0.0352518 0.00538775 +-0.0522813 0.0461425 0.0206748 +0.0547864 0.0548406 0.00018303 +0.00557978 0.101599 0.0456072 +0.00472897 0.0950887 -0.030676 +0.0355131 0.0781566 0.0390786 +0.0402454 0.0843611 -0.0117637 +-0.0605819 0.0468615 0.000669297 +-0.0394923 0.074754 0.042367 +-0.0331798 0.0779303 -0.0275261 +-0.0683095 0.178205 -0.0587107 +-0.00995429 0.0389301 0.0324647 +-0.0495001 0.108413 0.0388185 +-0.0659124 0.113781 -0.0114133 +-0.0404538 0.105662 0.0393313 +-0.0654729 0.17978 -0.0563035 +-0.0614888 0.0918402 0.045217 +0.0333657 0.0640658 -0.0168115 +-0.0809488 0.144539 -0.000825536 +-0.0545043 0.0918174 0.0448821 +-0.0504943 0.147794 0.0128405 +-0.0745085 0.118967 0.0529255 +-0.0596424 0.0629313 -0.00554826 +0.0600133 0.0636587 0.00714888 +0.0272456 0.0746657 -0.023693 +0.0433693 0.0575272 -0.00543691 +-0.0084928 0.0591086 0.0550857 +0.0327041 0.0686805 0.0402125 +-0.0371896 0.166685 -0.0135589 +0.0115191 0.107071 0.0419973 +0.0398757 0.096658 0.0297176 +-0.0882102 0.118977 0.047099 +-0.0794917 0.134473 0.0511764 +-0.0147562 0.0388704 -0.0103641 +-0.0729608 0.135493 -0.0074448 +-0.0829718 0.144576 0.00217748 +0.0121355 0.107265 -0.0192728 +0.00249537 0.0427747 0.0458993 +-0.0590743 0.136941 -0.00615344 +-0.0740187 0.0822617 -0.01463 +0.0274881 0.0349726 0.0165028 +0.0249311 0.118938 0.0303034 +-0.0860712 0.137702 0.0022107 +-0.00546373 0.0337972 -0.022595 +-0.0425018 0.0506116 0.0394181 +0.0044907 0.119648 0.0370088 +-0.066886 0.129814 0.0472408 +-0.033949 0.0667384 -0.0165589 +0.0265464 0.0699406 0.043619 +-0.0486667 0.134012 0.00340208 +0.0201914 0.117982 0.0346477 +-0.033458 0.0353739 -0.0310204 +-0.0251991 0.0536651 0.0400375 +-0.0689113 0.147966 -0.0319204 +-0.0650665 0.151369 -0.0356223 +-0.065894 0.118002 -0.00906639 +-0.00150449 0.0350731 0.0394353 +0.00648653 0.0951017 0.0524749 +0.0322641 0.11194 -0.00663069 +0.0356067 0.113152 0.00567562 +-0.0317604 0.120314 -0.00921321 +-0.0666072 0.0846933 0.0437683 +-0.0745085 0.13306 0.0516401 +-0.0914301 0.133749 0.0202171 +-0.0271327 0.0917299 -0.030613 +0.0356733 0.107346 0.028881 +0.021724 0.104691 0.0421173 +-0.0214953 0.0474568 0.0509792 +0.0189666 0.119003 -0.0102495 +0.0330783 0.0534528 0.0353209 +-0.0796959 0.154266 0.00805358 +-0.0370933 0.175555 -0.00565624 +-0.0324183 0.116998 -0.0137964 +-0.015069 0.117815 -0.0147928 +-0.0541455 0.0482522 0.0392578 +-0.017538 0.18639 -0.0186026 +-0.0486882 0.138613 0.0123943 +-0.0134995 0.0786948 0.0569449 +-0.0792474 0.0803083 0.033239 +-0.0523607 0.12647 -0.00557636 +-0.0261456 0.180134 -0.00803266 +-0.0654933 0.0875673 0.0446215 +0.0410795 0.0647663 -0.00478377 +0.038759 0.104954 -0.0010414 +0.0213206 0.103387 0.0432887 +0.00249002 0.112797 0.0416669 +-0.02662 0.157614 -0.0107103 +-0.0524373 0.0487028 0.0136696 +0.0367672 0.0605146 0.0354804 +-0.0769184 0.0832691 0.0369336 +-0.0650248 0.0337055 0.00787315 +-0.0515046 0.159378 0.00834015 +-0.0547588 0.079768 -0.0207581 +-0.0799475 0.0796892 0.0318714 +-0.0819371 0.129486 -0.00455242 +0.0162371 0.0359566 0.0423025 +-0.052497 0.108432 0.038849 +-0.0330169 0.0750953 -0.0275046 +-0.0367909 0.0856326 -0.0224706 +-0.0909792 0.143017 0.0266346 +-0.0790213 0.169435 -0.0369802 +-0.0224887 0.120777 0.0306794 +-0.0714154 0.063966 0.00470687 +-0.0833338 0.121705 0.0492392 +-0.00224884 0.0410819 0.0473849 +-0.0064961 0.0647536 0.0562043 +-0.0154675 0.0382885 0.0102401 +0.0316901 0.0754766 0.0423249 +-0.0682663 0.0409329 0.00988698 +-0.0397472 0.0753921 -0.0181662 +-0.0404974 0.0534278 0.0394751 +-0.027235 0.0964545 -0.0242996 +0.01346 0.094917 0.0501359 +-0.0101655 0.178729 -0.0267529 +-0.0368558 0.0971787 -0.022608 +-0.0618627 0.061311 0.023361 +-0.00785703 0.0384956 0.0242725 +-0.00828946 0.0422134 0.0491908 +-0.0626761 0.177191 -0.057627 +-0.0197826 0.0770974 -0.0390157 +-0.0283747 0.0368322 -0.0186629 +-0.0678325 0.165206 -0.0549947 +-0.0762767 0.179149 -0.050884 +-0.0126939 0.0585083 -0.0350263 +0.0259904 0.108758 0.0377477 +0.042201 0.0819186 0.0294354 +0.0164623 0.11028 -0.0168584 +-0.000216315 0.0411702 0.046762 +-0.0166283 0.0393036 -0.0275139 +-0.0660426 0.171124 -0.0420386 +0.0456785 0.0862046 0.0141695 +0.00138117 0.044939 -0.0263139 +0.0461205 0.0704224 0.0223322 +-0.0776245 0.0703136 0.0210685 +-0.0756983 0.148597 -0.0138657 +-0.00849865 0.0773628 0.0576515 +-0.0145231 0.0446315 0.0506096 +-0.0683418 0.0625091 0.0209713 +0.0172542 0.0764235 -0.0285503 +0.00803706 0.0343648 -0.0148062 +0.02126 0.0748992 -0.0268979 +-0.0630463 0.113863 0.0385547 +-0.0145507 0.0980154 0.0489953 +-0.0546077 0.131128 0.0350935 +-0.012492 0.061843 0.0546212 +-0.028497 0.0550003 -0.0233987 +0.0217846 0.11532 -0.0122874 +-0.0931885 0.121553 0.0392843 +-0.0522878 0.055669 0.0133058 +-0.0592645 0.138135 0.0336221 +-0.0895773 0.139272 0.0261794 +-0.0653179 0.156011 -0.0499494 +0.0382996 0.103126 -0.00513692 +-0.00322923 0.0355467 -0.0162422 +0.0141613 0.0988714 -0.0229756 +-0.0404979 0.0776396 0.043177 +-0.000517251 0.0386237 0.0468325 +-0.0745039 0.117561 0.0526615 +-0.0404908 0.101464 0.0408992 +0.00150976 0.0562224 0.0541662 +-0.0302058 0.0649962 -0.0264588 +-0.0427465 0.0393017 -0.0242897 +-0.0680504 0.12005 0.0525411 +0.0105239 0.101777 0.0472989 +-0.051788 0.0855011 -0.0215694 +0.0121427 0.124109 -0.00776299 +-0.0714952 0.123214 0.0534125 +-0.0377025 0.0444987 -0.0253388 +-0.0285008 0.0573948 0.0366096 +-0.0557355 0.0753549 -0.0185519 +-0.0136024 0.0377623 -0.0264268 +-0.055443 0.13396 0.033868 +-0.0329956 0.122915 -0.00595413 +-0.0659107 0.120913 -0.00886784 +-0.00952503 0.0920885 -0.0357277 +-0.0437604 0.036567 -0.0252782 +-0.020729 0.181491 -0.0220031 +0.00793492 0.130935 0.0197362 +-0.00287417 0.10736 -0.0221559 +-0.0531678 0.0503031 -0.00638771 +-0.0649059 0.116607 -0.0100071 +0.0311853 0.0491232 0.0343139 +-0.0464498 0.034849 -0.0185661 +-0.0448976 0.168579 0.00154181 +0.0324248 0.0752705 -0.0187807 +0.00488488 0.0387234 -0.0100497 +-0.0607447 0.0752603 -0.0176616 +-0.0575406 0.0387439 -0.00960491 +-0.0874426 0.110454 0.0173412 +-0.0517698 0.0516016 0.0312301 +-0.0727656 0.156832 -0.0339136 +0.0123073 0.0638424 -0.0304488 +-0.00866157 0.0541436 -0.0334268 +0.00183737 0.0373069 0.04638 +-0.0298138 0.0344903 0.0411187 +-0.0674167 0.149888 -0.0375972 +-0.0770317 0.088754 0.0382806 +-0.0857815 0.0897033 0.0272482 +-0.0125983 0.037741 -0.0261872 +0.0182378 0.0893522 -0.0266421 +-0.0766704 0.154203 -0.00290271 +-0.0684648 0.0617211 0.0180797 +0.0505111 0.0637895 0.0291551 +-0.0497918 0.143216 0.0113941 +-0.0616227 0.156855 -0.0295846 +0.0290304 0.0968725 0.0421292 +-0.0756542 0.0679921 0.00394259 +-0.0526765 0.0514226 0.0124143 +-0.0625972 0.0348156 0.0215996 +-0.0544966 0.0791235 0.0440855 +-0.0544133 0.159808 0.00694146 +2.76528e-05 0.0391548 -0.0114154 +-0.00549746 0.0503818 0.0516227 +-0.0646199 0.0359342 0.0410351 +0.0410489 0.0445052 0.0289111 +-0.0356376 0.0548341 -0.0105043 +0.0272051 0.0465425 -0.0127095 +-0.0513967 0.161204 -0.00381805 +-0.0424671 0.124776 0.022048 +-0.0300883 0.0335187 -0.027157 +-0.0362553 0.0336801 0.0101688 +0.0513156 0.0588831 -0.00408417 +0.0399488 0.0688733 -0.0097971 +-0.0617146 0.155302 -0.0255819 +-0.0112103 0.129394 0.0199977 +-0.0552256 0.153277 0.0254807 +-0.0697772 0.0409122 0.00855159 +-0.0257631 0.0755055 -0.0369491 +-0.0601959 0.0422699 -0.00706205 +-0.0475933 0.134581 0.0184866 +0.0267481 0.0659374 0.0438828 +-0.0790343 0.0886679 0.0360671 +0.0606094 0.0637127 0.00915317 +-0.0823359 0.140394 0.000222625 +-0.0792589 0.1445 -0.00280742 +0.0288607 0.118772 0.0260462 +-0.000258207 0.0388058 4.93079e-05 +0.0142249 0.0779815 -0.0305449 +0.0279207 0.111816 -0.0105079 +-0.0649061 0.108122 -0.0141961 +0.0372666 0.0547889 -0.00619261 +-0.0258342 0.159627 -0.000620301 +-0.0761165 0.0874143 0.0388159 +0.0425599 0.101502 0.0121632 +0.0533305 0.0723883 0.0073663 +-0.0814882 0.139397 0.0468344 +-0.0119496 0.127575 -0.00116297 +0.0308488 0.116432 0.0267923 +-0.0342458 0.127284 0.0102001 +0.0488271 0.0733963 0.0130056 +-0.017912 0.059765 0.0509406 +0.0133103 0.0753629 0.0544488 +-0.0896061 0.126751 0.00429509 +0.034401 0.0461473 -0.00601616 +-0.0485411 0.166778 0.000587101 +0.0342862 0.0782566 -0.0167489 +-0.00549615 0.0925657 0.0562617 +-0.0700277 0.153659 -0.0489787 +0.00562336 0.034628 0.021452 +-0.0825014 0.0978733 -0.00561152 +-0.0665019 0.0818141 0.0428543 +-0.0628077 0.166262 -0.0415912 +0.0329576 0.0753133 -0.0177979 +0.0159612 0.0887478 0.0513106 +-0.0348521 0.0972102 -0.0229902 +0.00689753 0.13043 0.00224143 +0.0163113 0.0637479 -0.0291811 +-0.0681449 0.144372 -0.0168262 +-0.0709402 0.170831 -0.0510269 +-0.0618586 0.161576 -0.034591 +-0.05709 0.0562779 0.00261705 +-0.0511762 0.163872 0.00329038 +-0.0295002 0.0688631 0.0391758 +-0.0548706 0.0634738 0.0317723 +0.00519565 0.0838361 -0.0338494 +0.0412244 0.0703917 -0.00779979 +-0.0485608 0.164 0.00493162 +0.0405319 0.0913292 0.030651 +-0.0364055 0.0394201 0.0459276 +-0.0885895 0.126718 0.00227148 +-0.00135158 0.0925397 -0.0341169 +-0.0155034 0.0472755 0.0490261 +-0.0533709 0.0334238 -0.0075905 +-0.0135602 0.174221 -0.0197865 +0.0151695 0.0534137 0.0481113 +0.00249824 0.119676 0.0375233 +-0.0574904 0.0847348 0.0442092 +-0.0706266 0.111419 0.0453421 +-0.0498404 0.122243 -0.0112035 +-0.0580787 0.133988 -0.00600022 +-0.0856455 0.0845341 0.000486997 +-0.0677324 0.0847093 0.0432514 +-0.0516192 0.112658 -0.0171697 +-0.0294883 0.101537 0.0426799 +-0.0562967 0.0548357 0.00668262 +-0.0870689 0.0968011 0.00243877 +-0.0809104 0.126584 -0.00546143 +0.0226682 0.115322 0.0347114 +-0.0702279 0.156078 0.0244771 +0.00613975 0.0976727 -0.0254362 +-0.0654107 0.0782591 0.0414837 +0.0154936 0.104462 0.0445958 +-0.0557216 0.125528 0.0387388 +-0.0708946 0.1037 -0.0131771 +0.0207514 0.10232 -0.0203322 +0.040798 0.105646 0.00916422 +-0.0789759 0.136856 -0.00458832 +0.00163159 0.126824 0.0304308 +0.0217692 0.0444645 -0.0177596 +0.00149843 0.0965502 0.0531993 +0.00416774 0.034456 0.0194982 +-0.022279 0.185099 -0.0171819 +-0.0144819 0.0759021 0.0565083 +-0.062395 0.163038 -0.0545883 +0.0386856 0.0757975 -0.0108084 +0.0230618 0.0389706 0.0372995 +-0.0661823 0.154393 0.00121795 +-0.0751879 0.179229 -0.0530087 +-0.000499764 0.0590718 0.0548831 +-0.0616117 0.16 -0.0305904 +-0.0254372 0.0796492 0.0521904 +-0.087722 0.128407 0.0462822 +-0.0361331 0.122312 0.027301 +-0.0259579 0.0383264 -0.00469023 +-0.0615278 0.0399873 -0.00779984 +-0.0911978 0.147452 0.0151543 +-0.0776353 0.15693 -0.0189052 +-0.048662 0.0345502 0.0387985 +0.00500615 0.0390969 0.0281732 +-0.0664605 0.152204 -0.0437352 +-0.0514963 0.157854 0.00954267 +-0.0893902 0.139278 0.0291842 +-0.092072 0.128303 0.0302461 +-0.0166194 0.0421642 -0.027592 +-0.0880283 0.128084 0.00127828 +-0.06275 0.178179 -0.0598124 +-0.0242491 0.0796961 0.0538111 +-0.0575802 0.14965 0.0326026 +-0.0598499 0.0364094 -0.00954648 +0.0260337 0.0639191 -0.0225668 +-0.0215138 0.185205 -0.0184453 +0.00733204 0.0567933 -0.0307054 +-0.0394107 0.125604 0.021627 +-0.0805747 0.154604 0.0238516 +0.0319556 0.0942571 0.0410831 +-0.0503335 0.0345244 0.0401985 +-0.0521615 0.159088 -0.00368491 +-0.0816591 0.0828436 -0.00556986 +0.0120628 0.0346214 0.0245844 +0.00946799 0.112678 0.0395888 +-0.00501719 0.0348021 0.0425449 +-0.080434 0.0763484 0.0258387 +0.0419394 0.0802864 -0.00678235 +-0.0270715 0.179993 -0.0160072 +-0.00929516 0.17029 -0.0258484 +0.028889 0.0549767 0.0398373 +-0.0324184 0.123701 0.0227019 +-0.00768132 0.0976452 -0.0294292 +-0.0534956 0.0478266 0.0400304 +-0.0637998 0.0852745 -0.0191701 +0.0175395 0.0364962 0.0420884 +0.0289699 0.100814 0.0402993 +-0.0384924 0.0478181 0.0398313 +-0.00649796 0.0457161 0.0472731 +0.00861625 0.13122 0.00857267 +-0.0424707 0.0634258 0.0409808 +-0.0147714 0.163994 -0.0109737 +0.0514504 0.0735674 0.0125302 +0.0157166 0.0461353 0.0435597 +-0.0886232 0.152074 0.0182297 +-0.0732612 0.155462 -0.02991 +0.0560042 0.0728404 0.0157211 +-0.0465551 0.0447198 -0.0107805 +-0.020486 0.18455 -0.0138786 +0.00948927 0.0976692 0.0490505 +0.0112322 0.0342419 -0.000927635 +0.0153695 0.0617406 0.0502582 +-0.0137598 0.0382596 0.0196658 +0.0302365 0.0828976 -0.0200496 +-0.00484087 0.0994589 -0.0252596 +-0.0335771 0.177292 -0.00581839 +-0.0706171 0.160991 -0.0459386 +-0.0381352 0.155099 0.00439417 +0.0262713 0.112733 0.0346521 +-0.0288992 0.0377652 0.0242203 +-0.0741081 0.174769 -0.0407073 +0.0312687 0.106096 -0.0123707 +-0.0467828 0.168244 0.000200438 +-0.0544952 0.0440117 0.0450302 +0.00623037 0.129867 0.000104943 +-0.043169 0.163647 -0.0101027 +-0.0034944 0.103046 0.0439357 +-0.0265042 0.106069 -0.02235 +-0.0577843 0.0811473 -0.0206854 +-0.0358177 0.0886369 -0.024178 +-0.0726405 0.148337 -0.0310398 +-0.0454975 0.111194 0.0370842 +-0.0671848 0.0335335 0.00220964 +-0.0117936 0.0667192 0.0544625 +-0.0609674 0.125285 -0.00834926 +-0.080841 0.0760714 -0.00147772 +-0.0522091 0.118697 -0.0134778 +-0.074349 0.162439 -0.0349528 +-0.0740415 0.112641 0.0489542 +-0.0294567 0.0847909 0.044594 +-0.0204364 0.038385 0.0254029 +-0.0497015 0.070866 -0.0150622 +-0.0525829 0.113848 -0.0164008 +-0.0415348 0.163761 0.00444738 +-0.0644934 0.106993 0.039043 +0.0437981 0.0734503 -0.00176783 +-0.0284962 0.0946634 0.0451029 +0.0309795 0.0506032 0.0357766 +-0.0395331 0.128532 0.0067941 +-0.0424235 0.12018 -0.013117 +-0.0197167 0.103079 -0.0233045 +-0.0430994 0.12944 0.0113807 +-0.0913339 0.117411 0.0283055 +0.026348 0.0463448 0.037827 +-0.0406738 0.0606904 -0.0121867 +-0.071511 0.0930107 0.0417462 +-0.0866623 0.0964635 0.0264805 +0.00386952 0.131337 0.0182591 +0.0282305 0.08443 -0.0217055 +0.0128412 0.0347905 0.0282102 +0.00434097 0.053874 -0.0300717 +-0.0754795 0.0704499 0.0266608 +-0.0699695 0.135529 -0.00821968 +-0.0305143 0.0348089 0.0211376 +0.00750189 0.118272 0.0376599 +-0.0504996 0.108397 0.0385655 +-0.0779682 0.135412 -0.00525448 +-0.0273965 0.0380183 0.0261038 +-0.0520915 0.129726 0.0334448 +-0.0221568 0.157426 -0.00647102 +-0.0562219 0.0560519 -0.00142054 +-0.0817829 0.110167 0.0313299 +-0.0502435 0.0335698 -0.00160666 +0.0331444 0.0584441 -0.0147212 +-0.00651273 0.0760152 0.058184 +-0.0285619 0.108073 -0.0204718 +-0.0157027 0.123907 0.0301351 +-0.0175006 0.10024 0.0438179 +-0.0297515 0.154263 -0.00514597 +-0.0475033 0.113884 0.0346438 +-0.0154952 0.087016 0.0568367 +0.0435889 0.0706095 -0.000776861 +-0.0930208 0.116049 0.0173125 +-0.0783399 0.174997 -0.0480125 +-0.0650728 0.117149 0.0481049 +0.0600369 0.0650499 0.00814341 +-0.0678832 0.147765 -0.0303891 +-0.0802136 0.0813857 -0.00655277 +-0.0356852 0.127701 0.00820492 +0.0154871 0.0990335 0.0473819 +-0.019377 0.127678 0.00978651 +-0.0208657 0.123339 0.0268408 +-0.0553906 0.073233 0.0409139 +0.0560337 0.0553031 0.0245952 +-0.0306612 0.0816984 0.0420491 +0.04335 0.0902653 0.0251673 +-0.0137008 0.0599733 -0.0359611 +-0.0535493 0.045819 -0.00734382 +0.0152704 0.07093 -0.0305648 +-0.0706849 0.0819434 0.0406373 +0.0104915 0.114065 0.0387753 +-0.052073 0.150157 -0.00315276 +0.00150908 0.0458287 0.0477014 +-0.00149907 0.122451 0.0357652 +0.0346578 0.114254 0.0196698 +-0.0263079 0.125672 0.00579971 +-0.0662371 0.173912 -0.0594768 +-0.0111949 0.178453 -0.0296295 +-0.039457 0.0403768 -0.0273046 +-0.0321606 0.153429 -0.00535973 +0.0505072 0.0678423 0.0265215 +0.0377143 0.106919 0.0261871 +-0.0717609 0.172825 -0.0369735 +-0.034656 0.0592094 -0.011649 +-0.0237103 0.0348634 0.0507821 +-0.0409865 0.0355803 0.00929737 +0.0240747 0.0915746 0.0472686 +-0.0576816 0.0336048 -0.0104516 +0.034582 0.0563647 0.0357928 +-0.0304985 0.0631621 0.0381216 +-0.0145978 0.0392398 -0.0269855 +-0.0446029 0.130656 0.0108143 +0.0240159 0.124704 0.0156714 +0.00222038 0.0796794 -0.0348837 +-0.029229 0.179986 -0.0130226 +-0.0371614 0.0338798 0.00980443 +-0.0654857 0.101487 0.0416824 +-0.0386286 0.0534191 -0.0107521 +-0.0743388 0.0659419 0.0131754 +-0.0775178 0.172972 -0.0399134 +-0.0704983 0.0999903 0.0403231 +-0.0754673 0.153642 0.0315487 +-0.0567915 0.158113 0.00751453 +-0.0733158 0.165215 -0.0409863 +-0.0878452 0.096803 0.00445868 +0.02849 0.120167 0.00308975 +-0.0866911 0.107697 0.0133542 +-0.0422556 0.127428 -0.00269381 +-0.0684868 0.135467 0.0467048 +-0.0187173 0.108826 -0.0212527 +-0.0109134 0.038586 0.0018115 +-0.0689089 0.106601 -0.012938 +0.00232768 0.0597693 -0.0328325 +-0.0759088 0.150426 0.0375079 +-0.0642836 0.175364 -0.0612207 +-0.0626162 0.142488 0.0376248 +-0.0388973 0.150052 -0.00339157 +0.0187974 0.0398349 -0.0187285 +0.0404333 0.0725805 0.0320798 +-0.0863763 0.0991625 0.0261078 +0.0544186 0.0725633 0.0195702 +-0.076294 0.155585 0.0106948 +-0.0611522 0.045903 0.0393286 +-0.0167746 0.0756989 -0.0389455 +-0.0578115 0.0619893 0.0271205 +-0.0127071 0.179586 -0.0289228 +-0.0568431 0.0926948 -0.0216401 +-0.0900812 0.150215 0.0221142 +0.0222403 0.0416489 -0.00972259 +-0.0504069 0.135839 0.0247969 +-0.0304966 0.0545819 0.0366047 +-0.0103146 0.180354 -0.0288775 +0.0320122 0.117952 0.0129635 +0.0440424 0.0496996 0.0318585 +0.0393181 0.0603877 -0.00577734 +-0.071953 0.16101 -0.0409434 +-0.0437665 0.168716 0.00196199 +-0.0498819 0.105595 -0.0195612 +0.0217639 0.0458254 -0.0188683 +-0.0921421 0.116123 0.0383102 +-0.0636791 0.157483 -0.0138656 +0.0266706 0.04428 -0.00700704 +0.0433132 0.0818321 0.0274518 +-0.0580456 0.0494852 0.00468232 +-0.0735836 0.159386 -0.00731186 +-0.0544231 0.0344532 0.039385 +-0.00150237 0.089761 0.0564112 +0.015933 0.126357 0.0269718 +-0.0425015 0.0719333 0.0422422 +-0.0589488 0.147198 -0.00200697 +-0.087209 0.0941073 0.00444199 +-0.0120214 0.178126 -0.0292101 +-0.0835465 0.101952 0.0288636 +0.041496 0.0555737 0.0320634 +-0.0025007 0.0675576 0.0566246 +-0.0756877 0.15767 -0.00739081 +-0.0105023 0.0829243 0.0578427 +-0.00627368 0.128136 0.0276028 +-0.0404708 0.109814 0.0374017 +-0.00378356 0.130498 0.0212315 +0.0580765 0.0566038 0.0222343 +-0.0853725 0.111782 0.0273822 +0.0428559 0.0972978 0.0221679 +0.00122739 0.121444 0.0362285 +-0.0274798 0.0446461 0.0507675 +-0.0304832 0.12104 0.0263992 +-0.0371379 0.127502 0.0150528 +-0.0778671 0.177131 -0.0494084 +-0.0775564 0.166657 -0.0379504 +-0.0605167 0.0386224 -0.00865968 +-0.0171147 0.161213 -0.00734926 +-0.0726687 0.161352 -0.00991102 +0.032766 0.0700345 0.0403232 +-0.0458559 0.10138 -0.0215412 +0.017353 0.0374009 0.0430484 +0.000357196 0.0347559 0.0401008 +-0.0604421 0.0427792 0.0246961 +-0.0440271 0.128143 0.0184429 +0.0423724 0.056151 -0.00596664 +0.00534844 0.0596161 -0.0309806 +0.0320447 0.061134 -0.0177676 +-0.00279591 0.0988433 -0.0266823 +0.0289846 0.0664902 -0.0199255 +0.000300027 0.0360761 0.019065 +-0.0250833 0.0379957 0.0175874 +0.0345167 0.0754586 -0.0157294 +0.0153241 0.0623295 -0.0291944 +-0.0609083 0.0612023 0.0236586 +-0.0698972 0.0655268 -0.00153079 +0.00337067 0.115645 -0.0185908 +-0.0315398 0.0589058 0.0377684 +-0.00748372 0.0488969 0.0502433 +-0.0877886 0.0861226 0.0174689 +0.0414464 0.101443 0.020163 +0.0252372 0.0926012 -0.0220221 +-0.0572172 0.0498044 0.00711465 +-0.0384957 0.0719179 0.0419735 +0.0143485 0.0552312 -0.0288146 +-0.0512659 0.0360808 0.0462964 +-0.0880011 0.0941555 0.00641769 +-0.0508873 0.109845 -0.0186279 +-0.0514991 0.112527 0.0359192 +-0.0338144 0.0342727 0.0263277 +-0.0615036 0.0804118 0.0430159 +-0.0663263 0.0606754 0.0176657 +-0.0909825 0.11607 0.0303184 +0.0184707 0.107054 0.0413783 +-0.0243398 0.183957 -0.0138554 +-0.0158705 0.161111 -0.00904539 +-0.0335094 0.0647262 0.0398847 +-0.0782927 0.098997 -0.00960155 +0.0486963 0.0730972 0.0159514 +-0.0478872 0.0335336 -0.00475407 +-0.0154917 0.0883884 0.056678 +-0.077344 0.119067 0.051823 +-0.0560293 0.0674866 0.0368481 +-0.0635813 0.138158 0.0379352 +-0.0217661 0.0670215 -0.0366181 +0.0483442 0.0575601 -0.00531363 +-0.0237817 0.0727523 -0.0377511 +0.0443603 0.0490341 -0.0052894 +-0.0604973 0.0904382 0.0452731 +-0.0627563 0.152415 -0.0301468 +-0.0714195 0.067071 -0.00151156 +-0.0861662 0.147397 0.00721409 +0.011631 0.0474937 0.0464252 +0.0254946 0.0406248 0.0343049 +0.035443 0.111045 0.0256623 +-0.000588677 0.037658 -0.0249499 +-0.0388448 0.0971399 -0.0223049 +-0.0660244 0.166553 -0.0262486 +-0.048499 0.0848032 0.0451307 +0.0371019 0.111384 0.0119604 +-0.00927598 0.177254 -0.0287785 +-0.0389846 0.1533 -0.00797514 +-0.0351198 0.0484277 -0.0173281 +-0.00353807 0.0389271 0.0301841 +0.0132013 0.0864568 -0.0307211 +-0.0390625 0.110364 -0.0188163 +0.033372 0.106071 0.0326127 +-0.0831505 0.0857608 0.0304017 +0.0552187 0.0635647 0.027041 +0.0399168 0.0999289 0.0271558 +-0.0579697 0.0339719 0.0233097 +-0.0137397 0.178677 -0.0217984 +-0.0203244 0.0385446 0.0306811 +0.00122549 0.0359125 0.00298025 +0.0117447 0.0343946 -0.0103375 +-0.0913959 0.132306 0.0102259 +-0.0429194 0.0898997 -0.0223492 +-0.0511515 0.0337361 -0.0129379 +-0.0750027 0.155319 0.00677634 +-0.0771027 0.0689891 0.00817725 +-0.0353224 0.0340121 0.0244595 +-0.0291276 0.0386567 -0.0130433 +0.0303577 0.105377 -0.0136057 +0.0235082 0.12516 0.0112114 +-0.00249775 0.0787967 0.0582683 +0.0533686 0.0732758 0.0102917 +-0.0586915 0.0472669 0.00864036 +0.0328626 0.0738919 -0.0178203 +-0.017795 0.038392 0.00241319 +-0.044502 0.0478297 0.0399289 +-0.0747378 0.0687745 0.000531905 +0.0172248 0.12732 0.0217261 +0.0428517 0.0885116 0.026874 +-0.078089 0.159705 -0.0229182 +-0.00858725 0.0362397 -0.025275 +-0.0867205 0.102198 0.00542391 +-0.0926774 0.131034 0.0232376 +0.0167938 0.128074 0.00445644 +0.0541315 0.0553714 0.0271399 +-0.000925431 0.131188 0.0179397 +0.0288719 0.121048 0.0132077 +-0.00849451 0.0965679 0.0534544 +0.0226575 0.102902 -0.0189538 +-0.0787984 0.113337 -0.0032043 +-0.0099585 0.1135 -0.0182227 +-0.0282274 0.162443 -0.0041123 +-0.082525 0.0896742 -0.00660526 +-0.0477053 0.0708612 -0.0154107 +-0.0435026 0.0465062 0.0407289 +0.00126756 0.0669175 -0.0339113 +-0.0341799 0.0335887 -0.0224091 +-0.0623664 0.0443972 0.0296888 +-0.0374964 0.0676867 0.0416821 +0.00859545 0.0382141 0.0296981 +0.0458872 0.0834155 0.0151706 +-0.0908205 0.132399 0.0292201 +-0.0191683 0.0336751 -0.0214022 +-0.0140554 0.126614 -0.00210251 +-0.0260065 0.0335246 -0.026366 +0.0324259 0.0399358 -0.00240332 +-0.0296544 0.0346993 -0.0301222 +-0.0669615 0.129698 -0.00899609 +-0.0471845 0.0383965 -0.0142868 +-0.0572808 0.0345537 0.0438127 +-0.0627957 0.153425 0.0330074 +-0.0515105 0.13416 -0.00180112 +-0.0434907 0.171345 -0.00503558 +-0.0677742 0.0808646 -0.0174732 +0.00350312 0.0441648 0.0458711 +0.0291321 0.0686302 0.0420784 +0.0132792 0.0343795 0.0214237 +-0.0866978 0.12169 0.0483599 +-0.00350013 0.0801522 0.057807 +0.0371657 0.0997172 -0.00981258 +-0.0447383 0.0738987 -0.0178782 +-0.0605228 0.155495 0.0235493 +-0.0362392 0.151744 -0.00510561 +0.0454797 0.0637982 0.0288243 +-0.0672083 0.0609402 0.0172424 +0.0241031 0.0782197 0.0489777 +0.0442629 0.0672699 0.000591455 +-0.0289948 0.0522303 -0.0223864 +-0.0645013 0.0774777 0.0413253 +0.0444938 0.0959562 0.00517859 +-0.00459579 0.039143 -0.025596 +0.0184671 0.0913654 0.0479185 +0.0146407 0.129582 0.00935921 +-0.0505573 0.0439128 0.0441317 +-0.0141262 0.119616 -0.0126879 +-0.0849191 0.117035 0.0482987 +0.0280536 0.119554 5.13011e-05 +-0.0247655 0.0712486 -0.0365856 +0.0034971 0.091096 0.055256 +-0.0641848 0.0432086 0.0316934 +-0.0881185 0.151555 0.0230923 +-0.0680885 0.16093 -0.05501 +0.0474345 0.0682488 0.00159582 +0.0111403 0.105858 -0.0199086 +-0.0369545 0.0349347 0.0427177 +-0.0604782 0.144516 -0.00363507 +-0.0394712 0.08608 0.0435352 +-0.0548214 0.143869 0.0295389 +-0.028506 0.107069 0.0398546 +0.0281659 0.121502 0.0158045 +-0.0797197 0.143117 -0.0027917 +-0.0616803 0.166235 -0.0555923 +-0.0204271 0.0893191 -0.0369723 +0.0361287 0.085855 -0.0169039 +-0.00251199 0.107268 0.0437857 +-0.0114962 0.0842854 0.0575311 +-0.0738001 0.0651206 0.00865838 +-0.0114808 0.0353662 -0.0177045 +0.0391473 0.0421646 0.0269754 +-0.0565891 0.129759 0.0374849 +-0.0720408 0.171996 -0.0342175 +-0.0139288 0.0883705 -0.0380287 +-0.0562656 0.0335637 0.0133743 +-0.0196985 0.0957936 -0.0295783 +-0.00486881 0.104509 -0.0228932 +-0.0550525 0.129598 -0.0055846 +-0.0584858 0.0776493 0.0431837 +-0.0898534 0.121302 0.00430136 +-0.0191218 0.165312 -0.0179178 +-0.0249563 0.0383168 0.00102848 +-0.0199274 0.0958752 0.0490354 +-0.0574825 0.113918 0.0359516 +-0.00850157 0.101663 0.0440465 +-0.0873724 0.124348 0.0475064 +0.00764213 0.03621 -0.0128239 +-0.0264494 0.0648769 0.0395324 +0.0541546 0.0547912 -0.000791322 +-0.0434926 0.0789866 0.0425224 +0.0241906 0.121901 0.0271611 +-0.0866809 0.0819772 0.0124969 +-0.0717212 0.0344863 0.00580157 +0.0302841 0.11623 -0.00325108 +-0.0737112 0.155478 -0.0269075 +-0.0424683 0.108486 0.0389261 +0.0176716 0.0658898 0.0500991 +0.0494857 0.064014 -0.00214923 +-0.0514961 0.0945888 0.044111 +0.0340749 0.0901032 -0.0173771 +-0.0719584 0.0942006 0.0415089 +-0.0544894 0.0594391 0.0238452 +-0.0877192 0.101 0.0223776 +-0.0758319 0.173116 -0.0385323 +-0.0114857 0.119632 0.0369891 +-0.0313874 0.0581183 -0.0163942 +-0.0157652 0.0728861 -0.0388826 +0.0167046 0.0945555 -0.0241181 +-0.000498244 0.0647983 0.0567029 +0.0256473 0.0420743 0.0363142 +-0.0630437 0.12273 0.0457647 +-0.0540131 0.144678 0.0264098 +0.0135054 0.10711 0.0421551 +-0.00428335 0.124198 -0.00969837 +0.0415325 0.0816649 -0.00777347 +-0.0392229 0.0337594 -0.0179786 +0.0593141 0.0691549 0.00914325 +-0.0219522 0.0382139 0.00717586 +0.0288925 0.112764 0.0331675 +-0.0524014 0.152599 0.0134601 +-0.0628726 0.147915 -0.0152353 +-0.030456 0.158107 0.0014598 +0.0308953 0.0400111 0.0272142 +-0.0757616 0.109947 0.0435791 +0.0253341 0.0591059 -0.0237971 +-0.0261555 0.155801 -0.00568703 +-0.0679463 0.128236 -0.00906158 +-0.0156387 0.0377596 -0.0169892 +-0.0757064 0.112028 0.0472849 +-0.0155135 0.0631057 0.0533345 +-0.0512066 0.125627 -0.00670494 +-0.0896222 0.111892 0.015334 +-0.0493777 0.160927 -0.00574679 +-0.0630274 0.166296 -0.040584 +0.058244 0.0580344 0.0225642 +0.0413547 0.102812 0.0011821 +-0.0162922 0.125122 0.0270033 +0.02338 0.0632213 0.0460213 +0.0609114 0.0623534 0.0131596 +-0.0691061 0.164802 -0.0173282 +-0.0870447 0.0977755 0.0254107 +-0.00849378 0.112803 0.0415796 +0.0145027 0.115416 0.0371643 +-0.0184257 0.066889 0.0526426 +-0.0448982 0.123992 0.0241166 +-0.050497 0.0903958 0.0446608 +-0.0315626 0.0348573 0.0456798 +-0.0684915 0.0902546 0.0428415 +-0.0180785 0.0337977 -0.021304 +0.0043349 0.0389929 -0.00853324 +-0.0830349 0.153941 0.0230111 +-0.0800798 0.103192 -0.0065999 +0.0437731 0.0973301 0.016155 +0.00944321 0.131132 0.0160037 +-0.0514165 0.0627417 0.0327301 +-0.0528926 0.154865 0.0118243 +0.0187407 0.0740964 0.0517477 +-0.0721682 0.0657282 0.00147121 +0.00959045 0.131031 0.00893055 +-0.0694847 0.181423 -0.0563964 +-0.0569551 0.11454 -0.0150747 +-0.0821005 0.0885236 0.0320901 +-0.0174725 0.0383553 0.00432532 +-0.00258809 0.0348892 -0.0237423 +0.0413648 0.0939401 0.0283252 +-0.00375638 0.13079 0.0183493 +-0.0686466 0.0719376 -0.0111307 +-0.0688202 0.180176 -0.0531787 +-0.0397209 0.0710215 -0.0169451 +0.0184831 0.105752 0.0426872 +0.00809551 0.112572 -0.0192987 +0.0206432 0.121117 -0.00652883 +-0.0718516 0.0979698 -0.0147575 +-0.0662716 0.170413 -0.0392349 +0.0237477 0.0605032 -0.0251433 +-0.0340875 0.177472 -0.00744261 +-0.0167857 0.0784752 -0.0385587 +-0.0565291 0.0373798 -0.0104777 +0.00297843 0.0341587 0.014086 +-0.0667756 0.124253 0.0509201 +-0.026364 0.0359692 -0.029405 +-0.0550408 0.0334649 -0.000671931 +-0.0697701 0.0874139 0.0423816 +0.0246944 0.0835826 0.0481083 +0.0199488 0.115322 0.0360728 +0.0383916 0.042968 -0.00337479 +-0.0365829 0.0335193 -0.0246869 +-0.0355007 0.112502 0.0349387 +-0.0689238 0.125301 -0.00884615 +0.0395927 0.0385536 0.0157178 +-0.0889313 0.0875027 0.0114635 +0.0448665 0.0945715 0.00517989 +-0.0477042 0.0664777 -0.0141832 +-0.0434727 0.125255 -0.0084227 +-0.0166904 0.169787 -0.0155577 +-0.0134983 0.0501789 0.0495792 +-0.0624968 0.0833205 0.0441176 +-0.0342132 0.0345231 0.0384015 +0.043295 0.084533 0.027498 +-0.0819819 0.112797 -0.000848269 +0.0121624 0.129948 0.0198557 +-0.0674677 0.10143 0.0408399 +-0.0626754 0.059895 0.0191264 +-0.0367892 0.0459324 0.0404864 +-0.027194 0.0764697 0.0455544 +-0.0824053 0.0748814 0.00852871 +-0.0656294 0.0642362 -0.0044412 +0.032725 0.116988 0.0160848 +-0.0764226 0.102162 0.0358668 +0.00148048 0.0952613 0.0542408 +0.0228866 0.122341 0.0280976 +-0.0584486 0.139576 0.0330542 +-0.0402835 0.123242 -0.0103332 +-0.012241 0.0406566 0.0504983 +-0.0489426 0.0614374 0.0351759 +-0.0844851 0.0778045 0.00951927 +-0.0369817 0.156591 0.00432745 +-0.0882804 0.103688 0.0163664 +-0.0258065 0.0825691 -0.0373737 +-0.0355052 0.102861 0.0407303 +-0.0524183 0.131115 0.0329855 +-0.0227031 0.175691 -0.0136597 +0.050697 0.0684106 0.00144017 +0.000504835 0.0911354 0.0558722 +0.00231832 0.0583343 -0.0324165 +-0.0148886 0.169807 -0.0164639 +-0.0722033 0.152534 -0.0417656 +-0.0134817 0.073078 0.0557755 +-0.0255231 0.109882 0.0391184 +-0.0655581 0.135384 0.0421104 +-0.024745 0.0698061 -0.0360534 +0.0559546 0.0524347 0.0227151 +-0.0283257 0.118773 -0.011655 +-0.0335185 0.0974234 0.0440535 +-0.0817699 0.0748179 0.0155353 +-0.027189 0.162441 -0.00437298 +-0.0267454 0.0711222 -0.0350441 +-0.03015 0.171175 -0.0170282 +-0.026605 0.06607 0.0397555 +-0.074698 0.179765 -0.0510072 +0.0143367 0.0504741 0.0468665 +-0.0594975 0.111137 0.0367915 +-0.0346758 0.127158 0.0144691 +-0.0465015 0.0847604 0.0446321 +0.00381747 0.0354686 0.0455691 +0.0172732 0.0792708 -0.0288683 +0.0323738 0.104756 0.0346971 +-0.0794458 0.0813481 -0.00752304 +-0.0312226 0.0367355 -0.0304453 +-0.0110616 0.168437 -0.0238044 +-0.0579369 0.119806 -0.0105246 +-0.0337394 0.0355643 0.0323212 +0.0312129 0.0525777 -0.012761 +-0.0346988 0.120729 -0.0096591 +-0.0388776 0.0364147 0.043017 +-0.0271127 0.16377 -0.0158754 +-0.0114338 0.0347606 0.0448027 +-0.0897559 0.114544 0.00631807 +0.0408171 0.04213 0.0255289 +-0.0648854 0.102482 -0.0170908 +-0.0137359 0.061178 0.0537969 +-0.00359581 0.130946 0.00835725 +0.0439346 0.0959403 0.0181595 +-0.0194977 0.104404 0.0429832 +-0.0691323 0.0776098 0.0394254 +-0.00248627 0.097432 -0.0292057 +0.00445885 0.0387258 0.0265895 +0.0492859 0.0567642 0.0307116 +-0.077476 0.164468 -0.0240677 +-0.0666867 0.175728 -0.049503 +-0.0251661 0.0664206 0.0424455 +-0.027701 0.0549269 0.0368456 +-0.018943 0.164042 -0.0169159 +-0.0435133 0.0846552 0.0431729 +-0.0888345 0.136443 0.0400961 +0.00149473 0.112812 0.0419217 +-0.0298299 0.09304 -0.0247313 +-0.0836967 0.0790161 0.00252063 +-0.000924151 0.039273 -0.0117161 +-0.0567677 0.0811908 -0.0210238 +-0.0934681 0.120116 0.0253121 +-0.0429479 0.170625 -0.000616016 +-0.075975 0.156283 -0.00563956 +-0.00861288 0.0384077 0.0151551 +-0.00160584 0.0434015 -0.0251635 +-0.00451637 0.113738 -0.0185133 +-0.0780673 0.0690482 0.0132523 +-0.0237986 0.0784163 -0.0381462 +0.0404558 0.0643575 0.0302495 +0.00150103 0.0576486 0.0543674 +-0.0314973 0.0746234 0.0406619 +-0.0430409 0.0337266 -0.000289053 +-0.0303409 0.0462461 0.0481864 +0.0215433 0.04083 0.0414017 +-0.0328294 0.0901297 -0.0245803 +-0.0654933 0.0370192 -0.00733845 +-0.0128512 0.129269 0.0078276 +-0.0102634 0.129467 0.00444971 +-0.0525768 0.0530264 -0.00686565 +0.0152424 0.0737083 -0.0300265 +-0.0523202 0.0474101 0.0149978 +-0.03228 0.059616 -0.0144015 +0.0262796 0.0733084 -0.0244949 +-0.091934 0.128302 0.0312437 +-0.0556539 0.153362 0.0267778 +0.00449629 0.118272 0.0381357 +-0.00902947 0.129018 0.00125187 +-0.00169837 0.0391357 -0.00987107 +0.0277845 0.0849076 0.045525 +-0.0241779 0.1712 -0.0197595 +0.0450874 0.0847681 0.0221666 +-0.0251342 0.0878826 0.0516343 +0.00641806 0.0347537 -0.00236123 +-0.0411191 0.111396 -0.0179091 +0.027653 0.0506012 0.0379885 +0.0219297 0.123716 0.0263137 +-0.0688294 0.148429 -0.0341374 +-0.0315292 0.124197 -0.00202254 +0.00150698 0.0801002 0.0571866 +-0.0615835 0.0366556 0.0444374 +-0.0481389 0.160609 -0.00688834 +-0.0254054 0.0766649 0.0494071 +-0.0774728 0.155537 -0.0149084 +-0.0401214 0.159176 -0.0112287 +0.0596647 0.0691741 0.016158 +-0.011487 0.110004 0.0424075 +-0.0381186 0.128235 0.00584498 +0.048576 0.0464424 0.0249843 +-0.0923754 0.118793 0.0312942 +-0.0639323 0.123848 -0.00887264 +-0.0798905 0.126603 -0.00582167 +-0.0413231 0.0462396 -0.0163116 +-0.0908165 0.145736 0.0263481 +0.0446156 0.0959646 0.00916087 +-0.0821218 0.075868 0.0188618 +0.05068 0.0673838 0.000483718 +-0.0501479 0.0515412 0.017644 +-0.00617289 0.130741 0.0117189 +-0.051836 0.0956238 -0.0221428 +-0.074878 0.122304 -0.00772392 +-0.00159817 0.0419657 -0.0250292 +-0.0474982 0.162268 0.00647513 +-0.0331161 0.0498057 0.0395103 +0.00234342 0.0510926 -0.0302041 +-0.0851404 0.125756 0.0494653 +-0.0699016 0.160977 -0.0489386 +-0.0798846 0.0706301 0.0125498 +-0.0697873 0.0819627 0.0411407 +-0.0547576 0.161266 0.00105716 +-0.0895055 0.0902528 0.0184453 +-0.0261075 0.162258 -0.0150297 +0.046501 0.0611194 0.0308227 +0.0238707 0.0929061 0.0469915 +-0.0533713 0.0334322 -0.00211203 +0.0417012 0.085878 -0.00880084 +0.0288139 0.110493 -0.0110929 +-0.083716 0.087071 0.0295098 +-0.0798758 0.155212 0.019678 +0.0049172 0.0339971 0.00916661 +0.0160048 0.0590435 0.0493667 +0.0573849 0.0699459 0.0206376 +0.0345802 0.103262 -0.0113359 +-0.0797481 0.0789376 0.0314228 +-0.0346581 0.0340056 0.0228095 +-0.0631272 0.0656833 0.0316274 +-0.0145321 0.0459268 0.0498594 +-0.0364091 0.0339112 -0.0194195 +0.0181222 0.116444 -0.0134944 +0.0341932 0.113962 0.0237708 +-0.0761778 0.148614 -0.0108668 +-0.0044937 0.0473352 0.0489501 +-0.0328741 0.0807299 -0.0285171 +-0.0724981 0.121807 0.0536688 +-0.0657234 0.153927 0.0319321 +-0.0548973 0.112625 -0.01673 +0.0464212 0.0764513 0.00819032 +0.0272261 0.0451183 -0.00768323 +-0.0629092 0.156144 0.021238 +-0.0631603 0.151216 -0.00238889 +-0.0347632 0.076687 -0.0214942 +-0.0906385 0.147509 0.0131579 +-0.0122779 0.122169 -0.00937841 +-0.0588974 0.156171 0.00210438 +-0.0123378 0.123047 -0.00831897 +-0.0496312 0.0590927 -0.0108209 +-0.0409256 0.153594 0.00561766 +-0.0405007 0.0860467 0.0431081 +0.0445131 0.0735224 0.0237705 +-0.0213844 0.123724 -0.0049697 +-0.0633941 0.159891 -0.0485891 +0.0364077 0.044553 -0.00488844 +-0.0739928 0.155924 0.011504 +-0.0111043 0.0366055 0.0502176 +0.03375 0.0929319 0.0401542 +-0.00645978 0.0918654 -0.0354548 +-0.0827096 0.131285 0.0511192 +-0.0835459 0.133987 0.0490485 +-0.0294951 0.0617035 0.0376524 +-0.0493817 0.138599 0.0163919 +-0.055623 0.120216 -0.0109924 +-0.00449347 0.121049 0.0367461 +-0.048904 0.144756 0.0084067 +0.00645901 0.0392685 0.0301228 +-0.0913214 0.114759 0.0373166 +-0.0265805 0.0377426 0.0157053 +-0.00572231 0.0669806 -0.0352658 +-0.0525421 0.050441 0.0296546 +0.0313831 0.11825 0.0184294 +-0.0288441 0.0958675 -0.0242091 +-0.0149484 0.177196 -0.0200335 +0.0230906 0.0973761 -0.0211755 +-0.0134888 0.11412 0.0398002 +-0.0652337 0.169622 -0.0599681 +-0.069106 0.161031 -0.0101008 +-0.0147444 0.0700214 -0.0382575 +0.000412578 0.0376462 -0.0248548 +-0.0694764 0.165214 -0.0509787 +-0.0817245 0.100671 0.0313188 +-0.0464909 0.0704463 0.0410366 +-0.0604958 0.0890419 0.0453253 +-0.0356646 0.155102 0.0026804 +0.0313895 0.0549645 0.0381834 +-0.0390844 0.149487 -0.000628748 +-0.0799141 0.109193 0.0343277 +-0.033406 0.159477 0.0024166 +0.0461298 0.0806288 0.00519237 +-0.00455042 0.0384226 0.0105194 +0.054633 0.0708998 0.00492223 +0.0466692 0.0754291 0.0122452 +-0.0510158 0.118895 -0.0136999 +0.0442088 0.0931449 0.0211603 +-0.026052 0.036748 0.0540507 +-0.0121151 0.0568039 0.0522997 +-0.0605217 0.0372227 -0.00906293 +-0.0505374 0.138563 0.00240881 +-0.0499851 0.135487 0.00142097 +0.0375229 0.0590309 0.0330268 +0.00350924 0.0842701 0.0573364 +0.0132839 0.0652538 -0.0302637 +-0.0742776 0.161639 -0.0118948 +-0.0507685 0.164108 -0.00292996 +-0.0198709 0.104468 -0.0228058 +0.0376047 0.0616532 -0.0107499 +-0.0773811 0.108845 0.0387481 +0.0226208 0.102094 0.0434114 +-0.0882171 0.135133 0.0423395 +-0.0506614 0.0515945 0.0196285 +-0.0603044 0.155837 0.0105687 +-0.0124866 0.11001 0.0423152 +0.02167 0.125998 0.00768374 +0.0323984 0.0396183 0.0260504 +-0.0709343 0.126767 -0.00893718 +-0.0135132 0.116917 0.0382221 +-0.0116656 0.051126 -0.0319435 +-0.0309822 0.125744 0.00553845 +0.0459345 0.0862193 0.0101703 +0.00749696 0.119642 0.0368719 +-0.00350244 0.107276 0.0438161 +-0.0521339 0.128852 -0.00413976 +-0.0786185 0.152695 0.0319953 +0.0163345 0.0781449 0.0535802 +0.0377538 0.0771288 -0.0117747 +-0.0215296 0.0387791 0.0338148 +-0.0350693 0.0384092 -0.00660408 +-0.0919891 0.124178 0.0422069 +-0.0444587 0.11222 -0.0167423 +-0.0171725 0.0985232 -0.0244048 +-0.057494 0.112512 0.0360215 +0.0396241 0.0900718 0.0328369 +-0.0621913 0.163125 -0.0405922 +-0.0255449 0.0384207 -0.00839698 +0.0162606 0.0736784 -0.0295549 +-0.0663455 0.040996 0.0121932 +-0.0292314 0.114996 -0.0157151 +0.0252254 0.095572 0.0454222 +0.00388853 0.130454 0.00153712 +-0.0454814 0.0335414 -0.0134702 +-0.08387 0.148679 0.0348187 +-0.0174749 0.184587 -0.0183292 +0.0188962 0.0370007 -0.0126843 +-0.0625159 0.163122 -0.0305925 +-0.0433987 0.03363 -0.0131325 +0.0291629 0.037982 0.025034 +0.0129127 0.129715 0.00445998 +0.0182606 0.0778122 -0.0281935 +-0.0476906 0.0356242 -0.0142735 +-0.0190478 0.0404047 0.0529202 +-0.00364871 0.0982082 -0.0280452 +-0.0195235 0.184467 -0.0220738 +0.00382729 0.106411 -0.0207174 +0.00350781 0.064793 0.0565955 +-0.0205171 0.0383642 -0.00178242 +0.0122268 0.0836141 -0.0306261 +-0.0444606 0.147723 0.0056898 +-0.0869664 0.148754 0.00824898 +-0.0689807 0.155012 0.0293114 +0.0302795 0.0795477 0.0438394 +-0.0660235 0.174935 -0.0492702 +-0.0804891 0.133061 0.0515278 +-0.0447252 0.109884 -0.0183457 +-0.0902839 0.137831 0.0151959 +-0.0702292 0.153353 0.0333614 +-0.0915979 0.146114 0.0211525 +-0.0905232 0.122929 0.0450175 +0.00448177 0.0951431 0.0532987 +-0.0234909 0.120747 0.0300444 +0.0274801 0.0445395 -0.0065618 +-0.091814 0.116108 0.0403567 +-0.0537253 0.151161 0.0246275 +-0.0205455 0.126353 0.00242085 +-0.00205946 0.129266 -0.00113907 +0.00252933 0.0758769 0.0564116 +0.00824452 0.129671 0.000311795 +-0.000397685 0.0923281 -0.0338988 +-0.0559448 0.126938 0.0384169 +-0.0428369 0.0942645 -0.0226678 +-0.0598806 0.105454 -0.017999 +-0.0837054 0.10067 -0.00361944 +-0.0545817 0.152467 0.0257328 +0.0103827 0.0365006 0.0297934 +-0.0898089 0.133793 0.0332137 +-0.0618767 0.15376 -0.0175826 +-0.0665983 0.155819 0.0112334 +-0.0454977 0.108441 0.0393231 +0.000688563 0.105475 -0.0216898 +0.0156183 0.0348875 0.0323047 +0.0598096 0.0622539 0.00613597 +0.0222628 0.0359732 0.0163557 +-0.0492522 0.165358 0.00274428 +-0.018422 0.0583296 0.0500808 +-0.0233794 0.126748 0.0127038 +-0.0635915 0.172518 -0.0506017 +0.000120368 0.0351316 0.0162576 +-0.0286059 0.0564269 -0.0233938 +0.0373643 0.110979 0.0106211 +-0.0143444 0.162546 -0.0104323 +0.0174821 0.10039 0.0467276 +0.00834248 0.0609508 -0.0305126 +-0.0650557 0.129761 0.0446036 +0.0584157 0.0647883 0.022872 +0.0450662 0.0889731 0.0191643 +-0.0554099 0.0334223 -0.00251784 +-0.00144558 0.106667 0.0437112 +-0.0626402 0.0627915 -0.00434322 +-0.0406608 0.0335117 -0.0254825 +-0.0621215 0.15372 -0.0285871 +-0.0304827 0.0538056 -0.016375 +0.0276877 0.0607373 -0.0218456 +-0.0332153 0.107417 -0.0197253 +-0.0709666 0.138448 -0.00754922 +-0.0554983 0.0973521 0.0432389 +0.0051585 0.127708 0.0288034 +-0.0497318 0.0354763 -0.0126201 +-0.0713898 0.160567 -0.00801414 +-0.0135985 0.108507 -0.0209218 +-0.0701499 0.0695315 0.0320822 +-0.0618453 0.155287 -0.0285878 +-0.0774937 0.145636 0.0432119 +-0.0499442 0.140127 0.0163925 +-0.0622517 0.147555 -0.00557481 +0.0112895 0.0624411 -0.0303571 +-0.054281 0.0573695 -0.00641449 +-0.0468263 0.128888 -6.3255e-05 +0.0167125 0.0343686 0.00192575 +0.025374 0.0938744 -0.0213667 +0.0374202 0.110869 0.0135214 +-0.0202897 0.0381028 0.016664 +0.0122214 0.13032 0.0170232 +-0.0424979 0.0817557 0.0420871 +0.0247834 0.123596 0.021665 +0.0458295 0.0890233 0.00817039 +-0.0246722 0.05361 -0.0281576 +-0.0368219 0.0900544 -0.0239252 +-0.0331266 0.0338175 0.0106794 +-0.0863242 0.111849 0.0243217 +-0.0881544 0.121251 0.000301062 +-0.0639205 0.112438 -0.0133308 +0.00114374 0.101639 -0.0226194 +0.0117494 0.0671858 0.0538619 +-0.0177987 0.0336176 -0.0248428 +0.0384483 0.10837 0.0201721 +-0.0895436 0.0902218 0.014448 +-0.0441053 0.129054 0.00361434 +-0.0447524 0.033564 -0.0207541 +-0.040486 0.0346908 0.0404235 +0.0158804 0.124131 -0.00578699 +-0.0301445 0.169695 -0.0171502 +-0.0906194 0.139243 0.0211829 +-0.0653253 0.142516 0.0407395 +-0.0320761 0.0447291 -0.0281131 +-0.0764158 0.0699842 0.0233785 +-0.0254497 0.052221 0.0403383 +0.0262523 0.076131 -0.0243472 +-0.0174971 0.101623 0.0437353 +0.00533357 0.055349 -0.0305496 +-0.0493266 0.134948 0.0237381 +0.0053984 0.122421 -0.0118951 +0.038604 0.108395 0.0191762 +-0.0638345 0.0431637 0.0378429 +-0.0748055 0.0863518 -0.0148055 +0.0157558 0.127182 0.025475 +0.0337414 0.0384723 -6.48206e-05 +-0.0564853 0.0791423 0.0441771 +0.0234983 0.102092 0.0429315 +-0.00524932 0.101176 -0.023207 +-0.0804177 0.153092 0.00488677 +-0.0764988 0.13725 0.0499203 +-0.0550791 0.134447 -0.00412579 +0.0139517 0.124505 -0.00617757 +-0.0839821 0.127994 -0.00381712 +-0.0571198 0.115445 0.0365816 +-0.0622396 0.155257 -0.0325976 +-0.0454972 0.0761548 0.042184 +0.0313815 0.0461664 -0.00629419 +-0.0438412 0.0942345 -0.0223045 +-0.0236613 0.0852675 0.0544729 +-0.0616609 0.147135 -0.00399772 +-0.0600825 0.0413306 0.0227014 +-0.0105535 0.180959 -0.0288535 +-0.0676833 0.155656 0.026832 +0.0282931 0.118599 0.0272385 +-0.0871972 0.102223 0.00642609 +0.0103624 0.0494805 -0.028102 +0.0154246 0.0685991 0.0521564 +-0.0416312 0.117641 -0.0144485 +-0.0276264 0.046347 -0.026964 +-0.0916136 0.132311 0.0112256 +0.0178346 0.0505132 0.0449253 +-0.0444935 0.155066 0.00750552 +-0.037487 0.115255 0.0329307 +-0.0185008 0.119534 0.0344711 +-0.052516 0.0452355 0.0436109 +-0.00977222 0.11683 -0.0157853 +-0.0558279 0.0635792 0.0314789 +-0.0607324 0.0592584 0.00571875 +-0.0621725 0.160005 -0.022587 +-0.0603904 0.152423 0.000272984 +-0.0697355 0.134074 0.048407 +-0.0688943 0.103764 -0.0141878 +-0.0871513 0.117629 0.0474896 +0.0463722 0.0764454 0.00719365 +0.0582269 0.0686747 0.0208601 +0.0410646 0.07659 0.0312229 +-0.0298717 0.104385 -0.0225787 +-0.0346365 0.0766699 -0.022492 +-0.0639324 0.147049 -0.0189093 +0.0414492 0.10286 0.0161642 +0.041276 0.104245 0.0131611 +-0.0550666 0.151635 -0.00215779 +-0.0723648 0.0763024 0.0368597 +-0.0166996 0.0540293 -0.0329391 +-0.0108856 0.107334 -0.0222671 +-0.0609787 0.126745 -0.00811044 +-0.0495024 0.109811 0.0380885 +-0.0814376 0.0978185 -0.00662583 +-0.0771326 0.163938 -0.0219397 +-0.0690818 0.18144 -0.0564572 +0.031034 0.0964814 -0.0161287 +0.0445032 0.0555996 0.0323503 +-0.0335401 0.0732865 0.0413362 +0.0315592 0.035603 0.0149292 +-0.0625155 0.0344693 0.0376364 +0.0223706 0.0505198 -0.0231651 +-0.051638 0.0663266 -0.0117848 +0.0132667 0.0519749 0.0488584 +-0.0568732 0.108333 -0.017952 +0.0448639 0.0833492 0.023175 +-0.0316705 0.0806285 -0.0315587 +-0.0714676 0.155482 0.0269686 +0.0118001 0.034659 0.0389456 +-0.0860496 0.128472 0.048867 +-0.0155071 0.175699 -0.0190868 +-0.058019 0.131103 -0.00658932 +0.0113955 0.0434069 -0.0246972 +0.0568205 0.0566796 0.0240006 +-0.0267763 0.0365192 0.0538225 +-0.0564971 0.0987696 0.0431638 +0.0353453 0.0835128 0.0388598 +-0.0602464 0.144668 -0.00329576 +-0.00749863 0.0884246 0.0571361 +-0.0816964 0.0734472 0.00653139 +0.0399806 0.105624 0.0191716 +-0.0676913 0.172275 -0.0570278 +-0.0358314 0.0356542 0.0457978 +0.0503129 0.0516868 -0.00299828 +-0.0414959 0.0705202 0.0419075 +0.0246022 0.0942401 0.0462765 +-0.0735775 0.170801 -0.0470392 +0.0373196 0.105416 -0.00382358 +0.0463401 0.0518943 -0.00540594 +0.0400167 0.0646852 -0.00776271 +-0.0597593 0.07671 -0.0185219 +-0.0237194 0.0639841 -0.033754 +-0.0473867 0.0345201 0.0356021 +0.00159304 0.131118 0.00454966 +-0.073925 0.126728 -0.0084362 +-0.0243269 0.0616478 -0.0324508 +0.0457562 0.0904226 0.00816981 +-0.0688748 0.159133 -0.00709894 +-0.0394914 0.0944889 0.0427101 +-0.0687998 0.0822684 -0.0173873 +-0.0455924 0.119193 -0.014062 +-0.0369476 0.033676 0.00641963 +-0.09079 0.1297 0.0392322 +-0.0389556 0.0350986 0.042208 +-0.0414578 0.107073 0.0393054 +-0.00265934 0.098112 -0.0279111 +-0.0331649 0.0652734 -0.0174782 +-0.0343312 0.0836736 -0.0246034 +0.0134882 0.101805 0.0472084 +-0.0594997 0.0846925 0.0439263 +-0.0423306 0.040657 -0.0232664 +0.0092124 0.114671 -0.0175632 +0.0538026 0.0595499 0.0284925 +-0.0256867 0.0380701 0.0246091 +-0.0693658 0.16286 -0.0130912 +0.0333604 0.037057 0.0194583 +0.00949693 0.121023 0.0358683 +0.0321446 0.0360609 0.0164637 +0.0341544 0.0548861 0.0351403 +-0.000334987 0.0965293 -0.0302242 +0.0585628 0.0673807 0.0213416 +-0.053406 0.12345 -0.00838645 +-0.0749578 0.132548 -0.00734349 +0.0282219 0.0816125 -0.0219304 +-0.0351889 0.171161 -0.0140358 +0.00949153 0.0936876 0.0522363 +-0.0157849 0.172748 -0.017746 +-0.0175848 0.169785 -0.0150947 +-0.0835905 0.112379 0.0452164 +-0.0404862 0.0846544 0.0431896 +0.0231358 0.0404562 0.0392455 +-0.00366205 0.0540631 -0.0322696 +0.00959837 0.0403395 0.0451906 +-0.0692421 0.0422187 0.00798097 +-0.0285258 0.0717501 0.0402231 +-0.00789542 0.108803 -0.0224197 +0.0159009 0.113257 -0.0160529 +-0.00149436 0.0620061 0.056412 +-0.0420891 0.0363826 -0.0272583 +-0.00449341 0.104477 0.0440393 +-0.0683512 0.0607717 0.0117847 +-0.0927055 0.120137 0.0415853 +-0.0484911 0.115278 0.0334198 +0.02514 0.0350088 0.0196342 +-0.065935 0.125307 -0.00885715 +-0.0621483 0.0699034 0.036962 +-0.0178695 0.104461 -0.0227631 +0.0351768 0.0563002 0.0348659 +0.0105044 0.115477 0.0381888 +-0.0938558 0.126876 0.0162567 +-0.0632514 0.033799 0.0117273 +-0.0736013 0.0654333 0.0137843 +-0.0577792 0.0341881 0.0284371 +-0.0763952 0.0838159 -0.0125906 +-0.0296632 0.180174 -0.00867233 +0.00819029 0.0851531 -0.0324575 +-0.071633 0.174549 -0.0412084 +-0.0538265 0.0927341 -0.0220469 +-0.0471905 0.156504 0.00887867 +-0.0661815 0.0615106 0.0205126 +0.0144985 0.107111 0.0421568 +-0.0721929 0.152802 0.0342528 +0.0142765 0.0666697 -0.0302658 +0.0349485 0.0942163 0.0384062 +-0.0664891 0.0369705 -0.00688594 +-0.077495 0.158339 -0.0149115 +-0.0739383 0.160975 -0.0103701 +-0.00971429 0.0386927 -0.0148008 +-0.0618555 0.155289 -0.0295874 +-0.0621574 0.152203 -0.016578 +-0.032494 0.096035 0.0446186 +0.044345 0.0519693 -0.00630996 +0.0319954 0.0520213 0.0354999 +-0.0300925 0.0509394 -0.0183595 +-0.018449 0.0388382 0.0343981 +-0.0670639 0.154762 0.000889218 +0.0361767 0.0888967 0.0383392 +0.0262873 0.0942382 0.0451936 +0.0186534 0.103359 0.0446898 +-0.0523328 0.0334686 -0.00741897 +0.0507066 0.0540083 0.0292331 +0.0529037 0.0462692 0.0142047 +-0.0888522 0.0996312 0.00941041 +0.0275656 0.0563642 0.0414619 +-0.0371627 0.0336289 -0.0286501 +-0.0198294 0.0882519 -0.0375379 +-0.0907603 0.140585 0.0151783 +-0.00458896 0.0376652 -0.0252351 +-0.093041 0.12831 0.0262642 +-0.0743429 0.0955133 0.0396401 +-0.089704 0.111925 0.0143387 +0.0453684 0.0889907 0.0151607 +0.0456444 0.086201 0.0151659 +-0.0635175 0.0399079 -0.00714576 +-0.0294925 0.0903536 0.0441109 +-0.0888771 0.100994 0.011394 +-0.0121064 0.0869584 -0.0384624 +0.0373352 0.108319 0.0251875 +-0.0882187 0.112165 0.0210064 +0.0349174 0.110993 0.0268865 +-0.0849268 0.122064 -0.00322109 +0.0124968 0.112648 0.0387734 +-0.0662562 0.163203 -0.0177078 +-0.0640701 0.113939 0.0406208 +-0.0654246 0.0794919 0.0421931 +-0.0519669 0.0569186 0.0284516 +-0.0519207 0.0493094 0.0353906 +0.00333114 0.0341656 0.00499397 +-0.056914 0.133942 0.035273 +-0.0780215 0.158305 -0.0199209 +0.0276406 0.111416 0.0348725 +-0.0172565 0.181572 -0.0253576 +0.0372544 0.0379189 0.00466817 +-0.0211197 0.1653 -0.017528 +-0.0557637 0.121264 0.0386516 +0.0274329 0.121878 0.0183804 +-0.0623369 0.16467 -0.04959 +0.00450432 0.0883672 0.0562441 +-0.0649333 0.145142 -0.016034 +-0.0918355 0.118761 0.0292947 +0.0503561 0.073461 0.0121181 +-0.0732571 0.0860546 0.040246 +-0.0543933 0.14384 0.0284354 +0.0235922 0.124679 0.00697037 +0.049638 0.0724241 0.0192263 +-0.0691135 0.0647604 0.0241382 +-0.0277318 0.0385796 0.0327127 +0.0249679 0.0605263 0.0447882 +0.0220764 0.0741142 0.049509 +-0.012493 0.16839 -0.0164935 +0.0220311 0.0550166 0.0457656 +-0.0197467 0.0364265 -0.0184459 +0.000577278 0.0388845 -0.0129362 +-0.0178004 0.121647 -0.00876548 +-0.0516521 0.0334655 -0.0091126 +0.0221612 0.0754835 0.0496518 +-0.0384539 0.162349 0.000413916 +-0.0711225 0.0388168 0.00193457 +0.0334725 0.0950337 -0.0145821 +-0.00505247 0.102417 0.0438081 +0.0159216 0.0348476 0.0287894 +0.0277666 0.0347822 0.00749516 +-0.0675802 0.144972 -0.0192338 +-0.0477088 0.132967 0.0228963 +-0.0134912 0.0386664 0.0301779 +-0.0590273 0.134027 -0.00648451 +0.0244484 0.124114 0.020115 +0.0218798 0.0374214 -0.00364164 +-0.0658775 0.102439 -0.0164403 +-0.0743971 0.166132 -0.0206985 +-0.0634619 0.0339766 0.015084 +-0.0497324 0.138579 0.00441928 +-0.00151689 0.0428507 0.0468014 +0.00660528 0.0935786 -0.0311099 +-0.0862444 0.0819176 0.00849345 +-0.0634827 0.0876134 0.0450541 +0.0182388 0.0763952 -0.028136 +-0.0765343 0.0681368 0.0143622 +-0.092883 0.116038 0.0143172 +0.000494981 0.0442085 0.0460563 +-0.0518518 0.0970732 -0.0222063 +-0.0248173 0.0693751 0.0448313 +-0.089421 0.135156 0.0282104 +-0.0566159 0.0573558 0.0107416 +0.0312695 0.0800594 -0.0199503 +-0.03437 0.0738393 -0.0214808 +0.0226051 0.113885 -0.0127298 +-0.0658838 0.16421 -0.0204509 +-0.0417953 0.0435116 -0.0223513 +-0.0710782 0.156778 -0.0439119 +0.00348525 0.108604 0.0422849 +-0.0239399 0.118058 -0.0129545 +-0.0498545 0.0999668 -0.0218887 +0.0176793 0.0852191 -0.0283526 +-0.0426623 0.0592741 -0.0122692 +-0.0642751 0.044386 -0.00129652 +-0.0456062 0.127883 0.0223049 +-0.0818286 0.147374 0.0384552 +0.0125066 0.10443 0.0450477 +-0.0763281 0.174543 -0.0415648 +-0.0144887 0.0387707 -0.00835843 +-0.00853122 0.0430617 0.0490142 +-0.0783677 0.176339 -0.0480853 +-0.0408918 0.109911 -0.0187996 +-0.0634329 0.159891 -0.0505847 +-0.0278615 0.0987172 -0.0237448 +0.0172353 0.0806842 -0.0288156 +-0.0768582 0.104852 -0.0089026 +0.0310274 0.118497 0.0197321 +0.0262422 0.122687 0.00652555 +-0.000524008 0.041433 0.0467891 +0.0292827 0.060879 -0.0197951 +0.00853553 0.0366751 -0.00931803 +-0.092315 0.125571 0.0312621 +-0.000472926 0.0972534 -0.0289903 +-0.0604964 0.0861621 0.0446513 +0.0117525 0.0432202 0.0447834 +-0.0738828 0.103582 -0.0116089 +-0.00249719 0.0488761 0.0505372 +-0.0307845 0.0580469 -0.0184096 +-0.00234994 0.125819 -0.00745455 +-0.0301636 0.153871 -0.00371356 +-0.0815418 0.0912589 0.0328461 +-0.0901131 0.132441 0.0382173 +0.037389 0.0476423 -0.00613109 +-0.0646684 0.155196 -0.0425404 +-0.0928057 0.124227 0.0372672 +-0.0297999 0.12434 0.000117203 +-0.032492 0.0746402 0.0409516 +-0.0555716 0.122697 0.0389476 +-0.0717789 0.154685 0.0298089 +-0.0930714 0.12018 0.0352857 +0.0144798 0.109585 -0.0180587 +0.00343169 0.0361267 -0.0240106 +-0.0288758 0.046967 -0.0262149 +-0.0616418 0.158426 -0.0235923 +0.0103202 0.0609665 -0.0299301 +-0.0910325 0.14477 0.0261671 +-0.083926 0.0775674 0.0187821 +-0.0575363 0.138153 0.0326058 +-0.0295 0.0703058 0.0395502 +-0.0217308 0.0626511 -0.0346671 +-0.0640717 0.164086 -0.0255357 +-0.063271 0.158522 -0.0165888 +0.0210264 0.0895934 -0.0248804 +-0.0731992 0.145774 -0.0148545 +-0.0334943 0.0803079 0.0415842 +-0.0862122 0.111364 0.0347412 +0.0338239 0.11087 -0.00547119 +-0.0135288 0.0458914 0.0493586 +-0.0643715 0.139866 -0.00735458 +-0.0568939 0.158351 0.00118769 +-0.0405106 0.151258 -0.00613685 +-0.00551608 0.110856 -0.0214408 +-0.0787639 0.0696569 0.0125705 +0.00378339 0.0381062 0.0251953 +-0.0650446 0.154908 -0.0437098 +-0.089228 0.114813 0.0276717 +-0.00277394 0.0797805 -0.0365537 +-0.0661523 0.136835 0.0429956 +-0.0434818 0.0902492 0.04268 +-0.0184702 0.0959697 0.0503933 +-0.0801387 0.142096 0.0454029 +-0.00485582 0.0989472 0.0508482 +-0.0336234 0.153659 0.000337049 +0.00250661 0.0924946 0.055168 +-0.0729484 0.132565 -0.00781242 +0.0194715 0.127423 0.0125674 +0.00484292 0.129473 0.025811 +-0.0576054 0.0658547 0.0344063 +-0.0502601 0.0543084 0.0166402 +-0.027407 0.0396009 0.0539527 +-0.0105297 0.0560622 0.0527517 +-0.0456126 0.0519231 -0.010201 +0.000501847 0.0590908 0.0549783 +-0.0569845 0.0535242 0.00365398 +-0.0671097 0.0432428 -0.000257978 +0.0214666 0.0975514 0.0465681 +-0.08997 0.132328 0.0399309 +-0.0761969 0.167972 -0.0410261 +0.0170202 0.121328 -0.0087569 +-0.0138948 0.17568 -0.0202542 +-0.0281655 0.17267 -0.018055 +-0.0638531 0.04136 -0.00615806 +-0.0348821 0.0342989 0.0153052 +-0.000342105 0.0380462 0.00257941 +-0.00749789 0.0898138 0.0570783 +0.028524 0.0808687 0.0448153 +-0.0331206 0.0356024 -0.0184705 +0.0043586 0.119499 -0.0147306 +0.0467625 0.0462832 0.0266316 +0.0368364 0.111573 0.0161776 +0.00851174 0.0799624 0.0552814 +-0.00244825 0.112634 -0.0193375 +-0.0235385 0.11268 0.0379979 +-0.0115345 0.0922826 -0.0359317 +-0.09304 0.122895 0.0392709 +-0.0271645 0.17563 -0.018169 +-0.0772929 0.117422 0.0514809 +0.0179164 0.102978 -0.02104 +-0.0709646 0.0754682 0.0373385 +0.0216627 0.126095 0.0176515 +-0.0640284 0.119984 0.047923 +-0.0444795 0.0874935 0.0436599 +-0.0893861 0.0943037 0.0204146 +-0.0720651 0.173384 -0.0385311 +-0.0894927 0.14204 0.0311659 +-0.0454987 0.120637 0.0275066 +-0.0250745 0.0954862 -0.0252675 +-0.0895496 0.13918 0.0132126 +0.0192289 0.0820148 -0.027672 +-0.0154803 0.0645289 0.0535158 +0.0164872 0.108442 0.0405002 +-0.00663864 0.115688 -0.0165748 +-0.0494985 0.104247 0.040228 +-0.0673252 0.149334 0.0390086 +0.0300883 0.0872505 -0.0203879 +-0.0278877 0.0633808 -0.0294488 +0.0182732 0.069417 -0.0291542 +0.0171905 0.116688 -0.0137466 +0.0502632 0.0713497 0.022405 +0.0350985 0.114043 0.00837763 +-0.0505103 0.0452467 0.0429196 +0.0302544 0.113856 0.0308506 +-0.0605348 0.0333568 -0.0034971 +-0.00390558 0.0383472 0.0143493 +0.0270583 0.122199 0.00683201 +-0.0241505 0.0378782 0.0124647 +-0.0606031 0.0352186 0.0442288 +-0.0906667 0.113308 0.0195238 +-0.00876475 0.075634 -0.0378123 +-0.0531345 0.0641573 0.0333061 +-0.0262078 0.123609 -0.00273748 +-0.0629032 0.154793 0.00389792 +0.00322165 0.0782734 -0.0348651 +-0.0232226 0.0950277 -0.0288098 +-0.0497962 0.0869626 -0.02172 +0.0239811 0.109404 -0.0139261 +-0.00287196 0.105931 -0.0223953 +0.00350624 0.0619975 0.0564502 +0.0152965 0.129062 0.00674245 +-0.0198254 0.120831 -0.00989132 +-0.0672111 0.0749069 0.0386416 +-0.0199192 0.0375867 0.0533971 +-0.0507132 0.054338 0.0146004 +0.0338375 0.109906 -0.00644408 +-0.052068 0.0531865 0.02764 +-0.0665349 0.0638845 0.0254353 +-0.0340904 0.160759 -0.0135462 +-0.0456409 0.0577841 -0.0117617 +0.0425336 0.0678584 0.0273676 +-0.0549188 0.148123 0.0275408 +0.0178543 0.0352284 0.0378786 +-0.0254848 0.100235 0.0442056 +-0.014497 0.0856418 0.0570702 +0.0151023 0.0860518 0.0518047 +-0.0616341 0.0628646 -0.00472902 +0.02366 0.0848996 0.0483924 +-0.0496187 0.054694 -0.00943972 +-0.0328776 0.105721 -0.0208169 +-0.0144506 0.103914 0.0432646 +-0.0248813 0.105869 -0.0225199 +0.024788 0.0591582 0.0445118 +-0.0159391 0.0999021 -0.023843 +-0.0539979 0.153168 0.0186815 +-0.0738816 0.120852 -0.00799698 +0.0296461 0.118491 0.000643936 +-0.0540045 0.13652 -0.00234857 +-0.0593798 0.0335176 0.00740926 +0.0366379 0.08347 0.0371909 +-0.0520867 0.151648 -0.00355308 +-0.0188227 0.0387965 0.0325596 +0.00898388 0.131012 0.0072855 +-0.0682589 0.154325 -0.0506473 +-0.0521805 0.0531921 0.0266366 +-0.0617514 0.175333 -0.0614739 +-0.0169338 0.185679 -0.0240586 +0.015477 0.103104 0.045929 +-0.0729148 0.0713134 0.0317175 +-0.0172476 0.114664 -0.0174436 +-0.0126734 0.0384579 0.00339052 +-0.0832791 0.0884633 0.0304387 +-0.0858155 0.103519 0.00339021 +-0.0146369 0.0466344 -0.0294365 +-0.0773163 0.098935 -0.0105842 +-0.0145015 0.0631456 0.0536787 +-0.0689178 0.0717538 0.0356819 +-0.0255986 0.0394109 -0.0291464 +-0.0623671 0.0719748 0.0386642 +-0.0301518 0.0360809 0.0236741 +-0.030565 0.0383245 0.0341404 +-0.0574984 0.0918591 0.045399 +-0.0861528 0.0951452 0.0274373 +-0.0644941 0.0412041 -0.00599039 +-0.0363521 0.126723 0.0183002 +0.00755707 0.10303 0.0452955 +-0.0396625 0.0399023 -0.0274567 +-0.0838382 0.11616 -0.00137187 +0.0166591 0.0349342 0.0324763 +-0.0647933 0.15319 -0.00116291 +0.00911841 0.110151 -0.0195223 +-0.0697747 0.155761 0.0260978 +0.045415 0.0763654 0.00219579 +-0.0127734 0.171309 -0.0186592 +0.00748545 0.0964088 0.0510363 +0.0125027 0.109886 0.0398286 +-0.0779306 0.0866645 -0.0115691 +-0.0830177 0.0951656 -0.00554205 +-0.0184064 0.186879 -0.0179354 +-0.0866419 0.0923952 0.0266005 +0.026251 0.103389 0.0398709 +0.0333357 0.116389 0.013468 +-0.0452756 0.131436 0.0105618 +-0.035474 0.0519266 0.0383228 +-0.0536233 0.0657097 0.0353836 +0.0013977 0.0433563 -0.0248502 +0.0269244 0.118903 0.0281816 +0.0395 0.055533 0.0316092 +-0.0723024 0.111428 0.0467445 +-0.0364387 0.0357946 -0.0155844 +-0.0276413 0.159598 0.000270855 +-0.00596208 0.0394 0.0364646 +-0.00479094 0.0798443 -0.0373862 +-0.00779065 0.130523 0.0125627 +-0.0464848 0.12067 0.0277891 +-0.0645002 0.0889975 0.0448988 +-0.0896121 0.0902414 0.0154476 +0.0130231 0.0965172 -0.0241956 +-0.0452605 0.0391077 0.0445023 +0.0587398 0.0709245 0.0152557 +-0.0596114 0.0726835 0.0404064 +0.0240499 0.0348797 0.0195293 +-0.0682817 0.156606 -0.0532672 +0.0178388 0.104825 -0.0190099 +-0.0288938 0.180785 -0.00982491 +0.0323759 0.0738626 -0.0187418 +0.0314474 0.112439 -0.00717966 +-0.074091 0.144362 -0.00888576 +0.0510178 0.0461394 0.00424124 +0.00750963 0.0646928 0.0554932 +-0.0643093 0.0665984 0.0323388 +0.0133515 0.0566849 -0.029233 +-0.0243216 0.10004 -0.0240037 +-0.00749239 0.096543 0.0535421 +-0.00533786 0.0388247 -0.000985585 +-0.0884258 0.0996766 0.0213895 +-0.0320326 0.0609937 -0.0164107 +0.0535495 0.0533436 -0.000784809 +0.0393899 0.0533602 -0.00667374 +-0.0717205 0.168577 -0.0240459 +-0.0704919 0.126012 0.052539 +-0.0388888 0.109926 -0.019043 +-0.0507025 0.140081 0.0193694 +-0.0263231 0.034658 0.0434735 +0.0398861 0.0766416 0.0330246 +-0.0941682 0.126929 0.0222624 +-0.0117712 0.0770642 -0.0382004 +-0.0417668 0.040639 -0.0243092 +-0.0517327 0.164109 0.00103678 +-0.0721705 0.158208 -0.0379206 +-0.0356893 0.0651361 -0.0144415 +-0.065143 0.156205 -0.00860924 +0.00354988 0.0342019 -0.0174252 +0.00312416 0.107287 -0.0203844 +-0.0340011 0.127005 0.00589371 +-0.0418419 0.09571 -0.0225712 +-0.0333161 0.126997 0.0105451 +-0.0717391 0.165925 -0.0182956 +0.0559734 0.0494153 0.0101945 +0.0174969 0.108466 0.0401752 +-0.0507291 0.133637 -0.00121966 +0.0083246 0.0581885 -0.03043 +-0.0711713 0.176467 -0.0550529 +0.0165931 0.100464 -0.0223776 +-0.0544905 0.0862124 0.0452239 +-0.0574075 0.0649991 0.0334306 +0.0195092 0.092819 -0.0242669 +-0.0856512 0.0899172 -0.000541045 +0.0081342 0.104445 -0.020865 +-0.0752567 0.160324 -0.0108988 +-0.0376087 0.118212 -0.0130418 +-0.055019 0.14719 -0.00165707 +-0.04909 0.0628007 0.0352845 +-0.018783 0.0770899 -0.0389016 +-0.0336421 0.175583 -0.0129563 +-0.082659 0.0871422 0.0312687 +-0.0621779 0.061949 0.0245023 +-0.0782836 0.162467 -0.0289415 +0.0339055 0.0599168 -0.014725 +-0.0414124 0.128336 0.00169512 +-0.0398827 0.035133 -0.0101165 +-0.00781609 0.0854881 -0.0377912 +0.0082433 0.13138 0.00986533 +-0.0358714 0.105673 -0.0204021 +0.00749975 0.0589567 0.0535286 +-0.072631 0.0670284 0.0231935 +0.0525192 0.0691267 0.0251103 +-0.0688901 0.0621533 0.0194032 +-0.0824666 0.11008 0.0383967 +-0.0438038 0.0884337 -0.0219011 +-0.00534725 0.0379464 -0.0151277 +-0.0425045 0.0478596 0.0401075 +0.0214753 0.11175 -0.0144217 +-0.000497779 0.0489051 0.0509033 +0.0236032 0.116718 -0.00979024 +-0.0648062 0.0852609 -0.0190538 +-0.0395435 0.101505 0.0409276 +0.0209425 0.124573 -0.000263497 +-0.0286807 0.0383267 -0.00339493 +-0.0585081 0.0422988 0.0170665 +-0.0316383 0.0367739 0.0511824 +-0.085482 0.104867 0.00337403 +-0.00926648 0.100073 0.0477845 +-0.00448593 0.118295 0.0389891 +-0.0377467 0.0768482 -0.0188928 +-0.0640837 0.156142 0.0179222 +-0.0515285 0.144709 0.0153879 +-0.0267903 0.0866521 -0.0358137 +-0.0626407 0.163129 -0.0295903 +-0.00752629 0.0443832 0.0481509 +-0.0750304 0.169881 -0.0295693 +-0.0907748 0.12133 0.00629364 +0.0164129 0.0417834 -0.0225068 +-0.0317772 0.169741 -0.00573949 +-0.0546238 0.0527377 0.0100793 +0.0453589 0.0561811 -0.00597324 +-0.0651505 0.0366918 0.0402161 +-0.032507 0.108409 0.0384637 +0.0185107 0.108486 0.0398481 +0.0450172 0.0749324 0.00120229 +0.00251449 0.0702821 0.0560425 +-0.0434424 0.160833 0.00573037 +0.056541 0.064854 0.0254614 +-0.0648306 0.156078 0.013307 +-0.00545884 0.111961 -0.020621 +-0.0222505 0.0336283 -0.0219672 +-0.0319114 0.16826 -0.00591385 +0.0045246 0.0828376 0.0569094 +-0.0849678 0.0844642 -0.00152644 +0.0277057 0.120723 0.00280565 +-0.0133613 0.182397 -0.0284169 +-0.0569294 0.13993 -0.00415472 +-0.0104844 0.118266 0.038122 +-0.0725121 0.144203 0.0447958 +-0.0661037 0.0713259 0.0366501 +-0.050851 0.138527 0.021367 +-0.0580927 0.0577897 0.0147789 +-0.0157117 0.033701 -0.0245127 +-0.00261732 0.0341102 -0.0185505 +-0.0614975 0.10975 0.0377559 +0.00661243 0.131425 0.00784474 +-0.0602206 0.142504 0.0358229 +0.0126673 0.104052 -0.020179 +-0.0624955 0.0904382 0.0452713 +0.0164839 0.0699861 0.0519409 +-0.0334933 0.0946149 0.0444857 +-0.0904058 0.114907 0.0416618 +-0.0182558 0.178619 -0.0243596 +-0.0436529 0.0346111 0.0345638 +-0.00297107 0.0340356 -0.0204416 +-0.0246065 0.0394112 -0.0290873 +-0.0257404 0.0712076 -0.0359148 +-0.0285156 0.0433359 0.0513164 +0.0262381 0.119658 0.0279158 +-0.0734823 0.0649094 0.0160661 +0.0249492 0.109234 -0.0137375 +-0.0651326 0.157423 -0.0100634 +-0.0578906 0.0600472 -0.00173427 +-0.0868853 0.0847213 0.0144753 +-0.0610173 0.135506 -0.00686914 +0.0547011 0.0728313 0.00929699 +0.00513733 0.104474 -0.0214038 +-0.0199542 0.180019 -0.0229778 +0.022195 0.0344915 0.00477409 +-0.0509846 0.123023 -0.00999375 +0.0173702 0.0506958 -0.0254566 +0.0327797 0.0727287 0.040356 +-0.0376189 0.0505906 -0.0108802 +-0.057408 0.0521648 0.00264452 +-0.0845698 0.111358 0.0279354 +0.045113 0.0861573 0.00219478 +-0.0694333 0.0348816 0.0112742 +-0.0621334 0.15599 0.0157191 +0.0379075 0.0398433 0.0233434 +-0.0695824 0.180796 -0.0534457 +0.00287682 0.0368053 -0.01432 +0.0592296 0.0635939 0.00512091 +-0.0326951 0.0680731 -0.0204474 +-0.017619 0.161286 -0.0140538 +-0.00121244 0.0358159 0.011737 +-0.0485025 0.167013 -0.00296472 +0.0139694 0.0974449 -0.0231882 +0.0336763 0.102539 -0.0125747 +-0.0769165 0.147253 -0.00586064 +-0.0894763 0.140666 0.0321759 +-0.079441 0.139988 0.0475582 +-0.019773 0.0742847 -0.0390372 +-0.066871 0.0626922 0.0228964 +-0.0473301 0.134807 0.0120125 +0.0244991 0.106997 0.0390493 +0.0296386 0.114736 0.0306143 +0.0275719 0.0433403 0.0342886 +-0.0524918 0.107066 0.0397432 +-0.0544973 0.0427375 0.0458563 +-0.0837407 0.129905 0.0507752 +0.0390362 0.108381 0.0141662 +0.0136873 0.0685864 0.0531495 +-0.0780988 0.162499 -0.0239377 +-0.0804325 0.078146 0.029561 +-0.0720693 0.0709772 0.0321852 +-0.036497 0.0903135 0.0436162 +-0.0157593 0.121529 -0.00864145 +-0.0640118 0.135519 -0.00771971 +-0.0096474 0.0481504 -0.030386 +-0.0889991 0.11248 0.0367803 +-0.0718704 0.117956 -0.00810673 +-0.00253303 0.110473 -0.0210263 +-0.0151271 0.118705 -0.0137294 +-0.0533766 0.126536 -0.00565695 +-0.050165 0.0501393 0.0176523 +-0.0617795 0.126914 0.0422805 +-0.0077906 0.079881 -0.0380243 +-0.0181903 0.172708 -0.0227977 +0.0362974 0.0657667 -0.0137187 +-0.0193672 0.122992 0.0288371 +0.0118921 0.127946 0.0270512 +-0.0528594 0.0344415 0.0327571 +-0.0440834 0.0344755 0.0328349 +0.00820576 0.0343954 0.0203732 +-0.0384853 0.0819001 0.0436414 +0.0279153 0.112797 -0.00956049 +-0.0233818 0.177171 -0.0128784 +0.00211138 0.110155 -0.0201605 +-0.0214231 0.0385184 -0.00765668 +-0.0590379 0.13549 -0.00623086 +-0.0654804 0.152163 -0.03833 +-0.0328363 0.0957996 -0.0235469 +-0.0574937 0.0333307 -0.00285911 +-0.0723124 0.154022 -0.038905 +-0.00125765 0.0383424 0.0470318 +0.022422 0.125761 0.0150782 +-0.0285891 0.0935252 -0.0252241 +-0.0395009 0.16971 0.00189803 +-0.0211973 0.0363196 0.0534993 +-0.0671438 0.037039 0.0145094 +-0.0455015 0.115241 0.0333765 +-0.0416597 0.057808 -0.0117566 +-0.0597745 0.0434652 0.0436848 +-0.0594246 0.0334838 0.00203125 +-0.0609255 0.122379 -0.00879585 +-0.0633414 0.0357702 0.0187502 +-0.0629834 0.0594485 0.00869517 +-0.0240199 0.0537379 0.0416895 +-0.0382462 0.044597 -0.024375 +-0.00732189 0.100225 -0.0241674 +-0.0425982 0.0463965 -0.0133084 +-0.0889045 0.133745 0.0416542 +0.00049898 0.0385943 0.0466363 +-0.0295864 0.0462965 0.0488628 +0.00439164 0.0448792 -0.025855 +-0.0608362 0.0341593 0.0278122 +-0.0547243 0.0723714 -0.0165135 +-0.0274694 0.155208 -0.00473974 +0.0246484 0.0713321 0.0461382 +0.0124372 0.0548875 0.0512192 +-0.00549842 0.0828666 0.0570203 +-0.0616148 0.0337181 0.0103501 +-0.0346312 0.0752701 -0.0214845 +-0.0629229 0.058915 0.0109817 +-0.0424386 0.147805 0.00141712 +-0.0363751 0.12414 0.0242241 +0.0176113 0.111464 -0.0161155 +-0.0314976 0.0603384 0.0380002 +-0.0138112 0.128252 0.0219818 +-0.0603076 0.0409502 -0.0078507 +-0.0735166 0.141431 0.0469479 +0.0326456 0.111384 0.0297678 +-0.0635438 0.0341847 -0.00786744 +0.02297 0.122414 -0.00191144 +0.0401375 0.0953636 -0.00688813 +-0.0141538 0.0965092 0.052175 +-0.00422659 0.0383846 0.0124357 +-0.0311024 0.0343581 0.019624 +-0.0780471 0.153854 0.029137 +-0.0581213 0.151582 -0.000807379 +-0.0267449 0.0725846 -0.0356647 +-0.0191918 0.174184 -0.0227992 +-0.00378536 0.0798194 -0.0370348 +-0.0249464 0.0349691 -0.0199992 +-0.0564664 0.0423189 0.0186897 +0.0266976 0.119444 -0.00271582 +-0.023525 0.0349287 -0.0283944 +-0.0800951 0.15261 0.00324045 +0.0268493 0.119915 0.0267269 +0.0354747 0.0390827 0.0235255 +-0.0127812 0.17424 -0.0204206 +-0.0338617 0.168258 -0.00349456 +-0.0144845 0.0744882 0.056153 +0.0261935 0.0402752 0.032238 +0.0102706 0.0681153 -0.0309054 +-0.00974239 0.0387292 0.0290909 +-0.0644512 0.125591 0.047275 +0.010367 0.0479585 -0.0270631 +-0.0246099 0.0984431 -0.024327 +-0.0476227 0.0370311 -0.0128189 +-0.0780422 0.0846436 0.0366002 +-0.0566171 0.135321 0.0339425 +-0.0556004 0.0505584 -0.00338763 +-0.0907186 0.136468 0.0172046 +-0.0245124 0.180278 -0.0098524 +0.00742535 0.0346722 0.0416328 +-0.0699342 0.0651273 0.0236486 +-0.0124071 0.172769 -0.0198823 +-0.041856 0.149196 0.00419837 +-0.0809107 0.103235 -0.00559799 +-0.0631328 0.0335051 0.0030611 +-0.00851461 0.0647289 0.0558918 +0.0154483 0.127759 0.0239281 +0.0255922 0.123349 0.0191129 +0.0138934 0.0631004 0.0516475 +0.00118569 0.0983354 -0.0261952 +-0.0325387 0.118791 -0.011658 +-0.000757843 0.0354065 0.0103826 +-0.0248998 0.158417 -0.0112592 +-0.035233 0.0374002 -0.014964 +-0.0541243 0.156074 -0.00260128 +-0.0584646 0.0588965 0.0024905 +-0.0615294 0.0333928 -0.00373148 +-0.0602915 0.0343294 0.0347628 +0.0265767 0.0994658 0.0420977 +0.0347214 0.0712416 -0.0157876 +-0.040399 0.128703 0.00942739 +0.00251855 0.096887 -0.0286022 +-0.076485 0.148385 0.0403892 +-0.0606115 0.155938 0.0148123 +0.010878 0.0806434 0.0544608 +0.0384784 0.105492 -0.00082855 +0.0438672 0.0916755 -0.00180444 +-0.0513529 0.0733082 0.0416893 +0.0451032 0.0777437 0.000209071 +-0.0817242 0.148679 0.0369003 +0.0461375 0.0834298 0.00718398 +-0.0514739 0.135214 -0.000924577 +-0.00531173 0.100039 -0.0239686 +-0.0176147 0.042187 -0.0278695 +0.00727636 0.114035 -0.0188609 +0.0268989 0.0632714 0.044083 +0.0102735 0.0924657 -0.0299319 +0.010651 0.121836 0.0349107 +0.00895558 0.0361581 -0.0106394 +-0.0905601 0.144393 0.0275534 +0.043756 0.0467626 0.0296361 +-0.0417806 0.126404 -0.00562318 +-0.0358424 0.095771 -0.0231986 +-0.0809037 0.153834 0.0267225 +-0.0777263 0.156926 -0.0159116 +0.00417967 0.034897 0.044357 +-0.0351879 0.125718 0.0201989 +-0.0284012 0.038721 -0.0148192 +-0.0351226 0.169652 -0.0145814 +-0.0203438 0.180146 -0.0154935 +0.0345359 0.11019 -0.00473263 +-0.0932568 0.121548 0.0382795 +-0.0334767 0.152548 -0.00159465 +-0.0271731 0.174192 -0.00959576 +0.0159989 0.11444 -0.0153318 +-0.054238 0.13299 -0.00459005 +0.0366798 0.105376 -0.00582172 +0.0386277 0.0672715 0.0346845 +-0.0227209 0.162682 -0.0153632 +-0.0760409 0.0677685 0.0130189 +0.00250507 0.0772798 0.0565792 +-0.0345053 0.101515 0.0417518 +-0.0546003 0.0541349 0.0100271 +-0.000643212 0.127926 -0.00376413 +0.00284904 0.131659 0.0150261 +-0.0184884 0.186846 -0.021092 +0.0335193 0.114014 -0.000843968 +0.00632048 0.123167 -0.0106939 +-0.0564752 0.0624455 0.0290854 +-0.0138322 0.105995 -0.0224296 +0.00423384 0.0754618 -0.0348642 +-0.0281096 0.0778495 0.0450018 +-0.0776289 0.158329 -0.0159141 +0.0148253 0.0447411 0.0439981 +-0.0859023 0.122521 -0.0027014 +-0.0578481 0.0940916 -0.0211113 +0.00150378 0.0842858 0.0575429 +0.0326379 0.0849202 0.042017 +-0.0549752 0.0499938 0.0105067 +-0.0568824 0.10976 -0.0175883 +-0.00970298 0.0627929 -0.0357349 +-0.0178968 0.163686 -0.0167578 +-0.074969 0.105672 0.0364824 +0.00650677 0.0702743 0.0558788 +0.00487604 0.0992462 -0.0230983 +0.042474 0.101514 0.0131646 +-0.0643723 0.0593574 0.0120942 +0.0593748 0.0580631 0.00716733 +-0.00149842 0.111423 0.0424113 +-0.00749339 0.119159 -0.0142858 +-0.0771313 0.0754374 0.0308061 +-0.0477996 0.0869772 -0.0218762 +0.014411 0.0833733 0.0525453 +-0.0202678 0.159643 -0.00488449 +-0.0159305 0.0950186 -0.0327431 +-0.0279294 0.0931359 -0.0265478 +-0.0855021 0.102147 0.00137916 +-0.0938092 0.125562 0.0252741 +-0.058744 0.140559 -0.00481674 +-0.031677 0.126244 0.00820251 +-0.0264922 0.0447022 0.0511549 +-0.0205862 0.0382221 0.00925741 +-0.053491 0.104292 0.0408761 +-0.0370674 0.156264 -0.0103696 +-0.0634966 0.109514 0.0378318 +-0.0867621 0.084687 0.0184803 +-0.0830364 0.104646 0.028271 +0.0442212 0.0804374 0.0252067 +-0.0448473 0.0339909 -0.0230279 +-0.0037539 0.0755488 -0.0365646 +-0.0661663 0.158028 -0.0551775 +-0.0238007 0.0741774 -0.0380398 +-0.018731 0.0627665 -0.0359648 +0.0446574 0.0720977 0.0012022 +-0.0927955 0.121487 0.0416389 +-0.0620012 0.1241 0.0437622 +0.0300963 0.0995295 0.0401727 +-0.0719316 0.149607 -0.0394232 +0.0355637 0.0889227 0.0392444 +0.0493081 0.0547033 -0.00484617 +-0.0668328 0.0604514 0.0106116 +0.00304719 0.123088 -0.0105402 +-0.0255191 0.118043 0.0319974 +-0.0394865 0.115305 0.0335817 +-0.0326614 0.0592947 -0.0125392 +0.0575508 0.0523393 0.00818574 +-0.0893959 0.0942918 0.0174254 +-0.0269084 0.160002 -0.0134029 +-0.0506856 0.0345547 0.0383582 +-0.0800885 0.0739226 0.0209531 +-0.0277305 0.073972 -0.0353872 +-0.0320496 0.0849187 -0.0285721 +-0.0217999 0.0866355 0.0553929 +-0.0322022 0.0465812 -0.0258568 +-0.0442317 0.12547 0.021384 +0.0214935 0.0781932 0.0504764 +-0.0444883 0.150664 0.00744383 +-0.0303843 0.0566029 -0.0193937 +-0.0723854 0.155427 -0.0359059 +-0.0245149 0.0811097 0.0540325 +0.0189031 0.068639 0.0501604 +-0.0650109 0.041163 0.0307556 +-0.0194954 0.107168 0.0420699 +-0.0325124 0.113906 0.0343195 +-0.0544418 0.118427 -0.0131672 +-0.0536811 0.113759 -0.0162997 +-0.0559476 0.153959 0.0252069 +-0.0675391 0.124252 0.0515729 +0.0440796 0.0450784 0.0271934 +-0.0594971 0.101543 0.0424741 +-0.0184988 0.100234 0.0438197 +0.0434554 0.0790039 -0.00377815 +0.0140981 0.0343905 -0.0079847 +-0.0615105 0.0406302 -0.00752326 +0.0320683 0.0578123 0.0392046 +0.0144666 0.0962642 0.0485999 +-0.0315047 0.0631978 0.0384961 +-0.0306251 0.038441 -0.00943325 +-0.0847861 0.0804507 0.00450965 +-0.0549519 0.160962 0.00433648 +-0.0470839 0.131413 0.00333034 +-0.00104546 0.0391448 0.0323048 +-0.0526926 0.151783 0.016281 +-0.0223808 0.0958588 0.045836 +-0.0841478 0.15365 0.0123539 +0.0536189 0.0735747 0.0133449 +-0.00350831 0.0975151 -0.0292875 +-0.0571277 0.155869 0.0117051 +0.00341369 0.131576 0.0166618 +-0.0237378 0.0654511 -0.0345337 +-0.0858145 0.0991904 0.0269676 +-0.0759199 0.0783227 -0.00959072 +0.032684 0.0640121 -0.0177767 +-0.056282 0.132113 -0.00567386 +0.00328959 0.131137 0.0194851 +0.00882643 0.110931 -0.0195298 +-0.00876485 0.1716 -0.0262973 +-0.0151483 0.0405525 0.0515137 +-0.0498071 0.0343093 0.00865348 +-0.0569766 0.0339283 0.0235563 +-0.0226683 0.0381298 0.00891697 +-0.0855438 0.106245 0.00446783 +0.0454924 0.0651146 0.027904 +0.0150017 0.0576648 0.0496654 +0.00644791 0.119491 -0.0147367 +-0.0156486 0.0481142 -0.0300898 +-0.0650134 0.13537 0.0410634 +0.0113952 0.116794 -0.0158535 +0.0173388 0.0781757 0.0532571 +0.0536226 0.0587546 -0.00269037 +-0.0709897 0.0340252 0.000991695 +0.038384 0.106978 0.0241932 +-0.0385431 0.038993 -0.0286239 +-0.0451337 0.127804 0.0210049 +-0.0690676 0.152436 0.0353067 +-0.0883368 0.137775 0.00920322 +-0.0714828 0.0362083 0.00943052 +-0.0717062 0.159603 -0.040933 +-0.0255949 0.125933 0.00752005 +-0.047874 0.0346487 0.0423594 +0.0367516 0.111162 0.00316661 +-0.00949217 0.110042 0.0428369 +-0.0572015 0.0336196 0.0184714 +0.0150246 0.0392642 0.0442415 +-0.00832489 0.0993422 -0.0252442 +-0.0304761 0.0342807 0.0180201 +-0.026997 0.0382812 -0.00486026 +-0.0916784 0.144722 0.0181573 +-0.0703317 0.172249 -0.0530308 +-0.0159101 0.1643 -0.0176565 +-0.0850976 0.106195 0.00337687 +-0.035284 0.173981 -0.0126295 +-0.032733 0.155408 -0.00943888 +0.00217615 0.12934 0.0262849 +0.00123579 0.075497 -0.0355058 +-0.0332024 0.0455956 -0.0269373 +-0.0155006 0.103015 0.0432792 +0.0396392 0.106988 0.00416547 +-0.021523 0.118151 0.0342827 +-0.0184974 0.103009 0.0434402 +-0.047784 0.038449 -0.0122332 +-0.0104903 0.0604984 0.0550813 +0.0293518 0.0659692 0.0423806 +0.0185572 0.0930309 -0.0244868 +0.0173756 0.109987 -0.0165543 +-0.0865489 0.109072 0.0153468 +0.0363255 0.10537 -0.00683316 +-0.0394998 0.076195 0.0426907 +-0.0603651 0.0470889 0.0366883 +-0.0144951 0.119623 0.0361429 +0.0406661 0.105634 0.0121644 +0.0383891 0.0460848 -0.00524865 +0.0295409 0.0942529 0.0428642 +0.0373159 0.0880544 -0.0152271 +-0.0784316 0.0799342 0.0337318 +-0.0548348 0.124111 0.0382711 +0.0178682 0.0672532 0.0504022 +-0.0788979 0.123682 -0.00614143 +-0.0298552 0.0986755 -0.0232224 +-0.0771653 0.156191 -0.0114635 +-0.0923833 0.130942 0.0122392 +-0.0651094 0.121429 0.0498115 +-0.042493 0.0690949 0.0416622 +0.0416337 0.0792551 0.0303335 +0.0189066 0.0808659 0.0520326 +-0.029145 0.125694 0.0135548 +-0.0619967 0.14761 -0.00462246 +0.0255017 0.0449453 0.0383425 +-0.0925798 0.11747 0.0343056 +-0.00233027 0.0339229 -0.0220991 +0.00799401 0.0819204 0.0555296 +-0.0699548 0.147947 -0.0321477 +0.0415131 0.0394077 0.00724875 +-0.0712173 0.0846981 0.0410753 +-0.0880447 0.0874003 0.00446864 +0.00798497 0.0890814 -0.0324293 +-0.0117258 0.0656807 -0.0365783 +-0.0114796 0.112753 0.0411508 +-0.0817304 0.107364 -0.00260486 +-0.0293156 0.0820403 0.0446588 +-0.0495645 0.0375773 -0.0119604 +-0.043838 0.0956679 -0.0221641 +-0.00869681 0.129559 0.00358698 +-0.0933816 0.129671 0.0222434 +-0.0700603 0.163804 -0.0489659 +-0.00755399 0.0384559 0.0207545 +0.0159604 0.125249 0.0284184 +-0.0514974 0.0791051 0.0438079 +-0.0840796 0.0818676 0.0264914 +0.037525 0.0785071 -0.0127982 +0.0299804 0.119686 0.0179058 +-0.0638039 0.0881523 -0.0190251 +-0.0272788 0.0350567 0.0515587 +-0.00562089 0.115673 -0.0165634 +-0.0104428 0.0347186 0.0450504 +-0.0427898 0.116428 -0.015168 +0.0165768 0.126998 0.000104849 +-0.0238911 0.0738255 0.0493988 +-0.0485539 0.0376116 -0.0123218 +-0.0396922 0.0460798 -0.021311 +-0.0485652 0.0335345 -0.00306359 +0.0414749 0.104231 0.00716597 +-0.0445241 0.0409237 -0.0192998 +-0.0220397 0.0354083 0.0523916 +-0.0380711 0.0340829 0.00944176 +0.0139247 0.0348347 0.0392218 +-0.0297288 0.0335868 -0.0252735 +-0.00107263 0.0385746 0.00195199 +0.0117524 0.0352863 0.00381322 +0.0170772 0.0847646 0.051153 +-0.0656775 0.067321 -0.00750664 +-0.00543271 0.0918052 -0.0353894 +0.0133691 0.0343357 -0.00620151 +0.0451372 0.0875619 0.0011816 +0.0503362 0.0703636 0.0239238 +-0.0474927 0.0804818 0.0437565 +-0.00542063 0.0391587 0.0349931 +0.00193935 0.03568 -0.0153447 +-0.0774115 0.160346 -0.0169397 +0.049877 0.0727457 0.00893584 +-0.0640788 0.0598458 0.0171155 +-0.00650105 0.0472142 0.0482843 +-0.0241121 0.163789 -0.0160029 +-0.0173263 0.0611887 0.051725 +0.0171559 0.100271 -0.022436 +-0.0604932 0.155795 0.0206537 +-0.0609595 0.142497 0.0365005 +-0.0668489 0.0966702 -0.0167929 +-0.0149394 0.183104 -0.021718 +-0.0321779 0.0750041 -0.0285287 +-0.0226305 0.0710127 0.0496427 +0.0463117 0.0820487 0.00917902 +-0.0795939 0.112319 0.0461682 +-0.0658419 0.0995396 -0.0165139 +-0.0810165 0.134048 0.0507919 +-0.0486855 0.131027 0.0278379 +-0.0788429 0.112725 -0.00283498 +-0.0784933 0.0832425 0.0356821 +-0.0258381 0.0781035 0.0498012 +0.0426426 0.0858997 0.0283401 +-0.0677549 0.154168 0.0312275 +-0.0306743 0.0383989 -0.00386137 +-0.0857757 0.0926386 -0.000557841 +-0.0210104 0.0417331 0.053591 +0.0161529 0.100264 -0.0224296 +0.0387814 0.0821002 0.0350599 +0.0484193 0.0639761 -0.00211304 +-0.0858985 0.111778 0.0253403 +-0.0389634 0.128304 0.0114309 +-0.0634823 0.0352819 -0.00824664 +0.0395163 0.0646366 -0.0087647 +-0.0591064 0.0435686 0.0148077 +0.00621882 0.12419 0.0335647 +-0.0171539 0.0347559 0.0453522 +-0.0314811 0.0546225 0.0370229 +-0.0182701 0.114743 -0.017523 +-0.0605388 0.141029 0.0353291 +-0.063605 0.126943 0.0449774 +-0.03749 0.0533987 0.0390423 +-0.0573191 0.0507885 0.00568774 +-0.0424884 0.109818 0.0380938 +-0.082569 0.0790202 0.0265184 +-0.0653913 0.0757553 0.0400472 +-0.0105137 0.0589924 0.0541839 +0.0198393 0.0700116 0.0497622 +-0.0814721 0.135361 0.0497671 +0.00809889 0.111578 -0.0196036 +-0.0276072 0.038217 0.0294729 +-0.0647783 0.173212 -0.0488362 +-0.0760415 0.0675654 0.00655947 +-0.0322855 0.0610195 -0.0154117 +-0.00948933 0.0674612 0.0553354 +-0.0922478 0.11733 0.00930597 +0.0325339 0.116751 0.00316678 +-0.0788837 0.117794 -0.00533035 +0.0177807 0.10571 -0.0179484 +-0.0648315 0.0895741 -0.0187043 +-0.0303114 0.0384164 -0.0075003 +-0.0728418 0.0685704 -0.00149472 +0.0396278 0.103602 -0.00160767 +-0.0575003 0.109781 0.0378101 +-0.0359224 0.034124 0.026018 +-0.0230844 0.126658 0.00843513 +-0.0904612 0.131068 0.0382266 +-0.0782718 0.165861 -0.029036 +0.0284552 0.0607955 -0.0208488 +-0.0495337 0.163976 0.00447865 +-0.0665318 0.134006 0.0442059 +-0.0622043 0.0590015 0.0092504 +0.0124693 0.0962821 0.0494059 +0.0199668 0.115907 -0.0129188 +-0.0101559 0.0386047 0.027311 +-0.0224495 0.0580629 0.0442448 +-0.0768471 0.09916 -0.0110394 +-0.0438495 0.0999429 -0.0214407 +-0.0642587 0.173261 -0.0500973 +-0.0291541 0.123106 -0.00418201 +-0.0785185 0.16527 -0.0289621 +-0.0773807 0.0774654 0.0325309 +0.0184997 0.0892768 0.0486726 +-0.0147168 0.0628748 -0.03682 +0.0133075 0.062355 -0.0296823 +0.0174899 0.111215 0.038757 +-0.0829923 0.130939 -0.00341376 +-0.0749763 0.152739 -0.0169005 +-0.00979029 0.0798633 -0.0379189 +-0.0243904 0.183518 -0.0110527 +0.0382626 0.0899111 -0.0131489 +0.0353274 0.107617 -0.00596632 +-0.0649093 0.06918 0.0352438 +0.0545625 0.0595427 0.0278248 +-0.0664402 0.128427 0.0478848 +0.0302544 0.035019 0.00964843 +-0.0212084 0.186026 -0.0155815 +-0.00559653 0.0391515 -0.0257085 +-0.00382316 0.0854518 -0.0372434 +0.0556932 0.0688929 0.00299188 +0.0435925 0.0958855 0.00119521 +-0.061875 0.156868 -0.0195857 +-0.0283944 0.174224 -0.00779385 +0.000326986 0.131385 0.00837406 +0.0583787 0.0621209 0.00318289 +0.0262357 0.0740751 0.0449841 +-0.0747322 0.0729443 0.0316828 +-0.0650821 0.148822 -0.0290175 +-0.0436469 0.0601588 0.0398932 +0.0443703 0.0410834 0.0161644 +-0.0674507 0.155183 -0.000720573 +-0.0165017 0.177176 -0.0187481 +0.0352588 0.0755049 -0.0148105 +0.00551455 0.110936 0.0415028 +0.0248664 0.0898261 -0.023121 +0.00550646 0.078617 0.0558754 +-0.0698407 0.127049 0.051763 +-0.0375072 0.123454 -0.00854988 +-0.052616 0.0657163 0.0355847 +-0.0748963 0.0690517 0.0244939 +0.023431 0.11936 -0.00662051 +-0.0185076 0.120924 0.0327413 +0.0394332 0.101324 0.027167 +-0.00864992 0.124983 -0.00848236 +-0.0872247 0.152479 0.0216964 +-0.0215688 0.0623472 0.0460467 +-0.0475797 0.035695 0.0449374 +-0.0510737 0.151654 -0.00393732 +-0.0415 0.0930514 0.0423592 +-0.0544965 0.100156 0.0427594 +0.049267 0.0717276 0.00605578 +0.0292141 0.0815364 -0.0209002 +-0.0052585 0.095242 -0.0329133 +0.0151527 0.129419 0.0109697 +-0.0294996 0.100187 0.0432585 +0.0363367 0.0432226 0.0290731 +0.0327757 0.035977 0.0148418 +0.00349523 0.0427434 0.0456833 +0.046121 0.0848311 0.00917504 +-0.067462 0.157723 -0.00658264 +-0.0876012 0.0995367 0.00546504 +-0.0356487 0.0352259 -0.0310792 +-0.0585981 0.0658974 0.0341563 +-0.0639239 0.116652 -0.0103062 +-0.0525394 0.0472909 -0.00733632 +-0.0398304 0.034299 0.0303636 +0.0252131 0.0803965 -0.024704 +-0.0721022 0.165224 -0.0439746 +-0.058758 0.148538 -0.00150368 +-0.0625812 0.150647 -0.00957658 +-0.0878641 0.137757 0.00720039 +0.0109534 0.0475021 0.0472035 +-0.0699012 0.105141 -0.0130553 +0.0318353 0.0540522 -0.0127622 +-0.0866591 0.107689 0.0123597 +0.0552547 0.0595292 0.0270628 +0.0320484 0.11465 0.0272407 +0.0433462 0.0818009 -0.00379375 +-0.0294668 0.176906 -0.0160057 +-0.0169961 0.094658 0.0531741 +-0.0202578 0.0596247 0.0476545 +-0.0798939 0.123658 -0.00558813 +0.0482025 0.0703533 0.0231278 +-0.0206189 0.186125 -0.0151754 +0.0100127 0.0349584 -0.0111996 +-0.0661914 0.152591 -0.0424622 +-0.0478408 0.098515 -0.0219326 +0.026913 0.0619271 0.0440949 +-0.0328507 0.126562 0.0151396 +-0.0689146 0.108019 -0.0123122 +-0.00583756 0.0390351 0.0332216 +-0.0125377 0.0365668 -0.017148 +-0.0373858 0.0446552 0.0411638 +-0.0759006 0.161818 -0.014334 +0.0304033 0.107421 -0.0117891 +-0.0654084 0.175187 -0.050486 +-0.0633716 0.143922 0.0382956 +0.0194957 0.0920261 0.0477827 +-0.0288404 0.0972702 -0.0238091 +-0.00475508 0.0741241 -0.036385 +-0.0104985 0.0362063 -0.0254961 +-0.0625516 0.147537 -0.0115723 +-0.0816708 0.0869142 -0.00660013 +-0.00823999 0.130343 0.0167173 +-0.0809733 0.130966 -0.00434035 +-0.0437659 0.0811743 -0.0201658 +0.00743904 0.129465 0.0253135 +-0.00451238 0.0760575 0.0586977 +0.0302883 0.103408 0.0369471 +-0.0379006 0.151906 -0.00621808 +-0.00550346 0.076042 0.0585145 +-0.0217032 0.0597401 -0.0334972 +-0.0868755 0.112781 0.0262639 +-0.0336701 0.155604 -0.00983793 +-0.0126927 0.0599517 -0.0357172 +-0.0638978 0.150075 -0.0288161 +-0.0144059 0.112046 -0.0186792 +-0.00421023 0.0383902 0.0178766 +-0.0453052 0.113634 -0.0162273 +0.0147972 0.102084 -0.0220848 +-0.0484999 0.105649 0.0400819 +0.0216294 0.0875507 0.0490393 +-0.0124184 0.175705 -0.0216387 +-0.0328373 0.163842 -0.00376818 +-0.0666614 0.0672261 -0.0064803 +-0.0395052 0.119385 0.0302298 +-0.0489243 0.0675117 0.0383488 +-0.0552807 0.0343936 0.0305403 +0.00553119 0.0603997 0.0554086 +-0.0914264 0.14884 0.0201323 +0.0231929 0.110938 -0.0135659 +-0.065154 0.164972 -0.0244937 +-0.050496 0.074792 0.0427038 +-0.0657515 0.154274 -0.0462128 +-0.0343486 0.0367995 -0.0305331 +-0.0826303 0.103323 0.0293175 +-0.0597443 0.0338929 0.0194732 +-0.0425056 0.0591222 0.0401769 +-0.0743438 0.156862 -0.0249223 +-0.00222977 0.0396912 0.0474006 +-0.00562206 0.0388337 0.0298422 +-0.0338556 0.0723894 -0.0214737 +-0.0635465 0.0333817 0.00128463 +-0.0330138 0.0356955 0.0305887 +-0.0730865 0.16659 -0.0202232 +-0.0570856 0.153101 -0.000954757 +0.0275543 0.0960379 -0.019637 +-0.0229677 0.169763 -0.0123298 +0.0217819 0.106251 -0.0165369 +-0.0575003 0.0630187 0.0298519 +-0.00864981 0.171144 -0.0247734 +-0.053919 0.0587242 -0.00741756 +-0.0595 0.105675 0.0404663 +0.0351077 0.0740897 -0.0147891 +-0.0620479 0.155306 -0.016587 +0.0278721 0.0522836 -0.0197543 +0.0325208 0.0469245 0.0310812 +-0.06629 0.139698 0.0427919 +-0.078132 0.172939 -0.0407193 +-0.0294988 0.0559628 0.0364214 +-0.0374897 0.0562507 0.0395531 +-0.0662219 0.155662 0.00991681 +-0.0408786 0.0346362 0.0386374 +-0.0208999 0.185581 -0.0139755 +-0.0330517 0.0624982 -0.0144201 +-0.0767419 0.164619 -0.0220172 +-0.0697905 0.0865423 -0.0170841 +-0.0784816 0.0755217 0.0287043 +0.0172033 0.118701 -0.0119316 +-0.0185134 0.0473863 0.05026 +0.00729554 0.0653986 -0.0323322 +-0.0415011 0.0506114 0.0394281 +-0.0541424 0.033642 0.0190888 +-0.0921005 0.132392 0.0222257 +-0.0136741 0.0384938 0.00315386 +-0.0383322 0.163825 0.00056966 +-0.0762889 0.0738479 0.0305832 +-0.0875285 0.133568 0.00229932 +-0.0736181 0.0688668 0.0266732 +0.02687 0.0981666 0.0425225 +-0.051308 0.153569 0.0116824 +4.86222e-05 0.11836 -0.0154829 +-0.0517937 0.0583908 0.0296448 +0.0605105 0.0595417 0.010156 +-0.0573945 0.0371513 -0.0102727 +0.00965733 0.0345667 0.0223294 +0.0463647 0.0703187 0.00350637 +-0.0625718 0.1468 0.0377209 +-0.089178 0.137924 0.0381661 +-0.0134956 0.0759117 0.0568004 +-0.00574286 0.0755721 -0.037104 +0.0261865 0.123233 0.0107875 +-0.0580499 0.11553 -0.0140963 +-0.00762589 0.0451743 -0.028662 +0.0535357 0.0635428 0.028124 +-0.0718987 0.123811 -0.00847645 +-0.0635357 0.119961 0.0469254 +0.00211859 0.130671 0.0219319 +0.00252859 0.0358017 0.021576 +0.0527591 0.0693467 0.00250314 +-0.0451218 0.0335948 -0.0116042 +-0.0769111 0.100434 -0.0105662 +0.0223237 0.0564658 -0.026195 +0.0394644 0.107011 0.0181712 +-0.0776021 0.0994637 0.0357144 +-0.0632381 0.170981 -0.0495819 +-0.00862433 0.122038 -0.0113292 +-0.0548269 0.0450002 0.0157095 +-0.0506815 0.134691 -0.000340536 +-0.0495888 0.146296 0.0105853 +-0.00908464 0.173025 -0.027717 +-0.00410488 0.0346022 0.0429088 +-0.0260906 0.0386266 -0.0124061 +0.0283176 0.118208 -0.00273298 +-0.0318098 0.121167 -0.00811427 +-0.0737276 0.154081 -0.027902 +0.0162665 0.119939 -0.0112703 +-0.0270805 0.0349584 0.0482667 +-0.0284917 0.101554 0.0428228 +-0.0249764 0.159657 -0.0011434 +-0.0585904 0.142433 0.0328417 +-0.0486888 0.138617 0.0104009 +-0.0234979 0.0724108 0.049066 +-0.019247 0.158526 -0.00845424 +-0.0716194 0.0382939 0.000706648 +-0.0412769 0.0356814 0.042879 +0.0483353 0.0532726 -0.00489034 +0.0606695 0.0664968 0.0121468 +-0.069489 0.104131 0.0386578 +0.00750734 0.0990008 0.0480837 +-0.0624532 0.126929 0.0430601 +-0.0629568 0.15367 -0.0336031 +-0.0374985 0.0747273 0.041938 +0.0426086 0.0930422 0.0261716 +-0.0849422 0.153595 0.0209155 +-0.0543959 0.12661 -0.00573734 +-0.0742502 0.161028 -0.0329547 +-0.0627767 0.112367 0.0371562 +-0.0532977 0.158553 0.00873827 +-0.0769168 0.123731 -0.00719316 +0.0393533 0.0847596 0.0341247 +-0.0692244 0.15634 0.0190049 +0.0343018 0.0936044 -0.01506 +-0.0165008 0.0800909 0.0572191 +-0.014166 0.184338 -0.0242563 +-0.0631574 0.159924 -0.0465929 +-0.0374857 0.0519831 0.0389557 +0.03646 0.112262 0.0117392 +-0.0411413 0.0364371 -0.0278037 +0.0185712 0.126949 0.0207922 +-0.0603223 0.0385556 0.0217181 +-0.0769591 0.131054 -0.00672048 +-0.0295123 0.0565107 -0.0214026 +0.0430875 0.0930739 0.0251589 +-0.00582403 0.0390405 -0.0106025 +-0.0553855 0.0337802 0.0222515 +0.014479 0.100435 0.047468 +-0.0548752 0.0984577 -0.0213117 +-0.0501571 0.0529434 0.0176286 +0.0183573 0.0461568 -0.0227219 +-0.0554809 0.0440191 0.0450323 +-0.0877934 0.0860475 0.0044818 +0.00321463 0.130705 0.0223233 +-0.0505315 0.0389504 -0.011562 +-0.0819835 0.132406 -0.00340088 +-0.0758067 0.0877331 -0.0139103 +-0.091338 0.14476 0.0251578 +-0.0649682 0.034557 0.0300942 +-0.0283013 0.113756 -0.016413 +0.0259713 0.0619044 0.0444933 +-0.0535159 0.0640852 0.0330775 +-0.0046427 0.0482096 -0.0303136 +-0.0584956 0.0861498 0.0443498 +-0.0655423 0.145055 -0.0169033 +-0.0423586 0.123855 0.0235885 +-0.0864234 0.0806346 0.0145003 +-0.033107 0.125984 0.00180258 +0.000400525 0.0433705 -0.0249688 +-0.0337351 0.126905 0.0148106 +0.0594437 0.0677773 0.0191638 +-0.0433018 0.0342732 -0.0267127 +-0.0668634 0.040937 0.011312 +-0.0651408 0.146773 0.0392721 +0.0142259 0.080787 -0.0303234 +-0.0564981 0.0973554 0.0431547 +0.0234826 0.113521 -0.012343 +-0.022737 0.0385766 -0.00982941 +-0.0695434 0.0352232 -0.00418951 +0.060768 0.0651161 0.0111484 +-0.00338536 0.100168 0.0483773 +-0.0154942 0.0772732 0.0564359 +-0.0581438 0.114319 -0.0148345 +-0.0758612 0.165153 -0.0370257 +-0.0666041 0.164889 -0.0207192 +-0.0401309 0.160681 -0.0117333 +-0.00727995 0.0389199 -0.00704692 +-0.0726288 0.07489 0.035733 +0.0572537 0.0657957 0.00220085 +-0.0564793 0.151056 0.0307055 +-0.0459743 0.153608 0.00885524 +-0.046245 0.034596 0.0410145 +-0.0611658 0.168359 -0.0606871 +-0.0242347 0.0401682 0.0541848 +0.0432765 0.10012 0.00816425 +0.0330202 0.102118 0.0356213 +-0.00368236 0.0583856 -0.0334327 +-0.016783 0.0973001 -0.0271368 +0.018711 0.100467 -0.0223545 +-0.0500289 0.122604 0.03284 +-0.063243 0.0333437 -0.00222576 +-0.0187202 0.0613304 -0.0355606 +-0.0268504 0.0548324 -0.0264063 +0.0215374 0.086463 -0.0256391 +-0.0138967 0.099791 -0.0237429 +-0.00550708 0.0774167 0.0583085 +0.055466 0.0507517 0.00421414 +0.00822806 0.0344179 0.00390084 +0.028423 0.0535254 0.0391477 +-0.00689074 0.103109 -0.0232386 +-0.0320031 0.0370471 -0.0177181 +-0.0255422 0.0377889 0.0158759 +-0.0476682 0.165409 0.0039929 +-0.0673807 0.115762 0.049991 +0.00348136 0.111402 0.0420175 +-0.081586 0.0734778 0.0135382 +0.0427229 0.10007 0.00318201 +-0.0456223 0.0548403 -0.0108081 +-0.0226179 0.0464363 -0.0275647 +-0.0201905 0.172698 -0.0217858 +0.0374948 0.0941477 0.0350502 +0.0227469 0.0686119 0.0468992 +-0.012216 0.174205 -0.0276647 +-0.0906322 0.112714 0.0163744 +-0.0599044 0.111127 -0.0158584 +0.00535116 0.0480874 -0.0284111 +-0.0295604 0.158116 0.000994125 +0.0104513 0.122961 -0.0105071 +-0.0619452 0.123832 -0.00870252 +0.00605345 0.0341614 0.00369541 +-0.0696099 0.138316 0.0468524 +0.00349102 0.11963 0.0373483 +-0.0495577 0.0338416 0.0269497 +-0.0500211 0.0529295 0.0155558 +-0.0534917 0.0491191 0.0286591 +0.0546976 0.0478581 0.0131951 +-0.0803392 0.0841108 -0.00756769 +-0.0693719 0.180628 -0.057909 +-0.0247145 0.161052 -0.00252569 +0.0299408 0.0713176 0.0415086 +-0.0779905 0.173544 -0.0470087 +-0.0168218 0.086916 -0.0386596 +-0.0658968 0.109505 -0.0131657 +0.0326969 0.10609 0.0333845 +0.0191388 0.0356129 -0.00667825 +-0.0168818 0.100112 -0.0240537 +-0.0620293 0.135502 -0.00717407 +0.0377405 0.110012 0.0179226 +0.0360001 0.0381146 0.00239588 +-0.0151683 0.160834 -0.010917 +-0.0894324 0.117571 0.0455052 +0.0402874 0.063301 -0.00576463 +0.000231956 0.0755133 -0.0357459 +-0.0663652 0.0422587 0.0107808 +-0.0908359 0.114163 0.0368153 +0.0456753 0.0833922 0.00418733 +-0.0426429 0.0563425 -0.0115708 +-0.0472127 0.168412 -0.001987 +0.0163989 0.0433061 -0.0232691 +-0.0181224 0.165314 -0.018178 +0.014203 0.08785 -0.0301032 +0.00716038 0.0832586 0.0561062 +0.0547452 0.0661481 0.0263648 +0.0207672 0.0700064 0.0493524 +-0.0820552 0.1102 0.0401793 +0.0336664 0.0753805 -0.0167583 +-0.0827158 0.108829 0.000295564 +0.0250546 0.0420912 0.0376641 +-0.0866523 0.0868042 0.0239447 +-0.082018 0.151309 0.00327526 +0.0209029 0.107601 -0.0159886 +-0.0134952 0.0659366 0.0537869 +-0.0902062 0.143054 0.0286714 +0.0484774 0.0431365 0.00824398 +0.00679595 0.0352467 -0.0139815 +0.0154 0.0448131 -0.0240573 +-0.0715189 0.0972122 0.0409969 +0.0152962 0.0652155 -0.0297912 +0.0106046 0.128135 -0.0020835 +0.0273536 0.106086 0.0379553 +-0.0176729 0.0540415 -0.0325983 +-0.00110521 0.131378 0.0121444 +-0.0724827 0.124619 0.0532114 +-0.0738593 0.174047 -0.0391959 +-0.0646169 0.109762 0.0377795 +0.00521659 0.0824462 -0.0340286 +-0.0280135 0.0591603 -0.0264206 +-0.0676617 0.0433934 0.000689977 +0.0407264 0.0999947 0.0251764 +-0.0322885 0.177691 -0.00536129 +-0.0547546 0.035972 0.0465789 +-0.0425002 0.115266 0.0336474 +-0.0687451 0.0708436 0.0347552 +-0.0375019 0.0804666 0.0432825 +-0.0182946 0.181579 -0.0243778 +-0.0789826 0.115456 0.0491224 +-0.0415063 0.0534301 0.0394734 +-0.0708913 0.0403263 0.00282802 +-0.0548298 0.0927311 -0.0220321 +-0.0745142 0.138634 0.0488155 +-0.0807745 0.102028 0.0317433 +-0.0249646 0.181509 -0.0170525 +-0.0727415 0.154031 -0.0358995 +-0.0698172 0.0908437 -0.0164973 +-0.0366476 0.0577363 -0.0111372 +-0.0192308 0.0947234 -0.0324688 +-0.0118669 0.165326 -0.0197278 +-0.0804375 0.137229 0.0490949 +0.0134351 0.129972 0.01319 +0.0457654 0.0791979 0.00319646 +-0.0469166 0.129554 0.0250362 +-0.0581769 0.137607 -0.00562722 +0.04256 0.0817421 -0.00578018 +-0.0478101 0.0884245 -0.0219224 +-0.0424147 0.0344885 0.0314161 +-0.0645764 0.139638 0.0400104 +0.00451352 0.10035 0.0463879 +0.0423459 0.0915624 -0.00580854 +-0.0833163 0.106091 -0.000625527 +-0.0510681 0.0429687 0.0449412 +-0.0258019 0.0564099 0.0391373 +-0.0908661 0.142018 0.0261694 +-0.0222707 0.180155 -0.0129798 +-0.0375032 0.0987213 0.042382 +-0.0135516 0.0445689 0.0502862 +-0.0749157 0.0818909 0.0378096 +-0.042351 0.0336287 -0.0184783 +-0.0104895 0.0660607 0.0552117 +-0.0713722 0.163817 -0.0449613 +-0.0170629 0.040485 0.0522671 +-0.0629502 0.151043 -0.0063137 +-0.0420636 0.159404 0.00394669 +-0.0438717 0.105649 -0.0205239 +0.00352724 0.10161 0.0446753 +-0.00861199 0.118019 -0.01506 +-0.0658335 0.0881117 -0.0184537 +0.00251222 0.126485 0.0307749 +-0.0485567 0.0390246 -0.0119389 +-0.0600846 0.0399274 0.0217122 +0.0128427 0.034706 0.0391137 +-0.0306178 0.0409006 -0.0300462 +-0.0635449 0.0356868 -0.00823988 +-0.0063607 0.125295 -0.00886018 +-0.025376 0.059259 0.0400414 +0.0015066 0.0490028 0.0513272 +-0.0107915 0.0798668 -0.0380291 +0.0455381 0.0540654 0.0323771 +-0.0645999 0.0347243 0.0265296 +-0.074389 0.0874223 0.0399149 +0.0147945 0.0909396 -0.0283095 +-0.0256418 0.0382997 -0.00275652 +-0.0249427 0.17123 -0.0116584 +-0.0860007 0.147303 0.0341634 +-0.00989368 0.129282 0.00314288 +-0.056803 0.119986 -0.0107265 +0.0131837 0.129339 0.0031365 +0.0204173 0.0925165 -0.0239466 +-0.0881399 0.122604 0.000302573 +-0.0687931 0.166618 -0.053004 +-0.0116307 0.0337076 -0.023716 +-0.0395047 0.0776369 0.0429957 +-0.0435015 0.086056 0.04322 +0.0313221 0.0899509 -0.0192278 +-0.0512591 0.0544504 0.0206222 +0.0450165 0.0718833 0.00186291 +-0.0240342 0.0381218 0.00683415 +-0.0643335 0.153058 -0.000307605 +-0.0553413 0.0491317 -0.00437815 +0.0461434 0.0834347 0.0111711 +0.0469552 0.0427274 0.0188429 +0.0403147 0.061632 0.0300225 +-0.0345217 0.127119 0.00425139 +-0.0560415 0.0335011 -0.000906542 +0.0458803 0.0848141 0.013166 +0.0355169 0.0713149 -0.0148173 +-0.00649249 0.0978569 0.0522238 +-0.0720202 0.152598 -0.0428872 +0.00936768 0.0509673 -0.0289075 +-0.017803 0.0813337 -0.0391893 +-0.0164921 0.101629 0.0439544 +-0.0749763 0.136928 -0.00646616 +-0.018438 0.165372 -0.011068 +-0.0749694 0.0749712 0.0333987 +-0.0344916 0.0547205 0.0381399 +-0.0252176 0.0351344 0.0519405 +-0.0785113 0.10447 -0.00758869 +-0.0837382 0.0804711 0.0245022 +0.0352492 0.043109 0.0289456 +-0.0657408 0.0353871 0.0379044 +-0.0633722 0.04322 0.0387983 +0.0187703 0.0504962 0.0444745 +0.0134519 0.128957 0.00181284 +0.00181742 0.106617 -0.0209271 +-0.069971 0.156225 0.0143836 +-0.0793623 0.0739499 0.024599 +0.0192573 0.0903239 -0.0256184 +-0.0785673 0.0716608 0.0214639 +0.0207235 0.123161 0.0287274 +-0.0694864 0.116115 0.0518347 +-0.022007 0.0754165 0.0531212 +0.00541958 0.0361021 -0.0235849 +0.0126937 0.0345417 0.0229719 +-0.0272554 0.0377383 0.0173779 +0.0183414 0.126234 0.023568 +-0.0782171 0.159705 -0.021925 +0.0319954 0.11684 0.00152318 +-0.0364949 0.0747255 0.0419725 +-0.00631217 0.0422986 0.0485312 +-0.0696892 0.0733745 -0.0120577 +-0.0574743 0.0452883 0.0435332 +0.0270163 0.115378 0.0322111 +0.0100342 0.126121 -0.00591235 +-0.0765631 0.160404 -0.0136187 +0.0104935 0.0976882 0.0488434 +-0.088546 0.102334 0.0113879 +-0.0488628 0.0600536 0.0351294 +-0.0102645 0.038442 0.0220215 +-0.0471272 0.159118 -0.00765489 +0.0282711 0.0480264 -0.0137299 +0.0106928 0.0341923 -0.0160349 +-0.0413207 0.122297 -0.0113384 +-0.0112299 0.173502 -0.0278641 +-0.0702692 0.146349 -0.0238997 +-0.0311686 0.0820079 -0.0315681 +-0.058698 0.0349789 0.0448461 +0.0225489 0.0444802 -0.0157666 +0.00650352 0.0547197 0.0529464 +0.0375985 0.10834 0.0241868 +0.026474 0.110098 0.0367031 +0.0104332 0.0344417 -0.0125223 +-0.00834994 0.0943471 -0.0340215 +-0.0726673 0.155437 -0.0339106 +-0.0830075 0.0762889 0.0105229 +-0.0846192 0.0805533 0.0214764 +-0.0805239 0.148418 0.0381727 +-0.087237 0.106355 0.0143591 +-0.0447805 0.0423866 -0.0153071 +-0.0837301 0.147364 0.00414541 +-0.0832136 0.0770175 0.0194025 +-0.0259181 0.0649186 0.0404266 +0.0449079 0.0931824 0.0151569 +0.0348585 0.0808647 0.0399076 +-0.000497657 0.066177 0.0565989 +-0.081976 0.138997 -0.000769762 +-0.0164973 0.088378 0.056467 +-0.0655061 0.041163 -0.00538315 +0.0250139 0.0449606 -0.012685 +-0.0684343 0.0667749 -0.00454154 +0.0313723 0.0597573 -0.0175925 +-0.073748 0.0805288 0.0380979 +-0.0431166 0.0378307 0.0441123 +-0.0704863 0.169511 -0.0510127 +-0.0418064 0.0884466 -0.0220226 +-0.0725566 0.0737794 0.034925 +-0.0432285 0.12305 0.0247373 +0.0537086 0.0670896 0.000808459 +-0.0318715 0.0510682 0.0382665 +0.00533718 0.124533 0.0332195 +-0.0234982 0.0988724 0.0447778 +-0.0873895 0.143261 0.0370491 +0.0450408 0.0625178 -0.00265494 +-0.0618764 0.138649 -0.0067701 +-0.0637266 0.174609 -0.0527846 +-0.0739864 0.158247 -0.0289285 +-0.0616651 0.174109 -0.0575903 +-0.0346424 0.0780819 -0.0225024 +-0.0310543 0.0337173 -0.0219116 +-0.0769455 0.154831 -0.00883158 +-0.0339952 0.0752026 -0.0244888 +0.0354333 0.111001 -0.000827134 +-0.0790203 0.0935614 -0.0105962 +-0.0879913 0.136375 0.00520661 +-0.0582272 0.048399 0.00675942 +-0.00714757 0.130278 0.00704353 +0.0114556 0.0340617 0.001148 +0.0458421 0.0876102 0.0101629 +0.00312017 0.129984 5.00643e-07 +-0.0376568 0.0591992 -0.0116433 +0.00923557 0.129984 0.00166977 +-0.0579608 0.139021 -0.00516612 +-0.0909934 0.148856 0.0221303 +-0.0611919 0.0341824 0.0259657 +-0.0917869 0.115969 0.00931507 +0.00445187 0.116712 -0.0177471 +0.00711096 0.111601 -0.019782 +-0.00341693 0.115827 -0.0167447 +0.0411288 0.0792971 0.0313687 +-0.0358185 0.0337288 -0.0209957 +-0.0304972 0.0703216 0.0396594 +-0.076218 0.0887607 0.0388797 +-0.0701244 0.0632147 0.00385793 +0.0432229 0.0888059 -0.00480108 +-0.0321931 0.123411 -0.0044713 +0.0221624 0.0959197 -0.0219723 +0.0234605 0.0367801 -0.00165856 +-0.0234711 0.183379 -0.010712 +-0.0461137 0.0368295 -0.0192985 +0.023814 0.119372 0.031074 +-0.0617151 0.0722545 -0.0157777 +-0.0697425 0.164473 -0.0161193 +-0.0700395 0.077854 0.0390736 +-0.0793237 0.108591 -0.00458021 +-0.0622625 0.155951 0.0127725 +-0.0579896 0.126711 -0.00710506 +-0.0819874 0.0788394 -0.00151395 +-0.051802 0.111349 -0.0178923 +-0.0548009 0.0547174 0.00969263 +0.0456361 0.0819814 0.00319705 +-0.0362696 0.0447516 0.0428152 +-0.0678285 0.156225 0.0151421 +-0.0441012 0.15765 -0.00916962 +-0.0698712 0.102299 -0.0142744 +-0.0434973 0.0719505 0.0423325 +-0.0385101 0.124563 -0.00772445 +-0.0720478 0.154003 -0.0409023 +-0.0415192 0.155101 0.00654483 +0.030443 0.0496674 -0.00974777 +0.0100263 0.0352289 0.0272451 +-0.0657931 0.0349145 0.0296068 +-0.00453349 0.0975685 -0.029357 +-0.0575464 0.0576229 0.00774375 +-0.0675655 0.156308 0.0210392 +-0.0625478 0.177823 -0.0603383 +-0.0164994 0.107189 0.0421238 +-0.0628199 0.164682 -0.0345962 +-0.0725695 0.162422 -0.0399552 +-0.0295698 0.0377598 0.0258888 +-0.0285577 0.048864 -0.0238529 +-0.051128 0.0487627 0.0151791 +0.0297172 0.11319 -0.0079908 +-0.0129858 0.0389757 -0.0119758 +-0.0519687 0.0514416 0.0131188 +0.00659366 0.0345497 0.005308 +0.0431201 0.0959054 0.0231686 +0.0426395 0.101487 0.00716583 +-0.0326038 0.039499 -0.0302708 +-0.022273 0.0879769 0.0544159 +-0.0501719 0.132485 0.029178 +-0.0104724 0.123683 0.0330383 +0.0158783 0.103153 -0.0212298 +-0.0380583 0.0406922 0.0433465 +-0.05672 0.0341106 -0.0113244 +0.00284082 0.0994342 -0.0233056 +-0.00189869 0.037664 0.017192 +0.00849573 0.122392 0.0350922 +-0.0911887 0.13375 0.0222165 +0.0145889 0.124413 0.0307966 +0.0365837 0.0686678 0.0370221 +0.00534141 0.0341316 0.016402 +-0.0652159 0.16242 -0.0585196 +-0.0708983 0.120893 -0.00865195 +-0.0790974 0.103427 0.0328545 +-0.0233223 0.0386973 -0.0137829 +-0.0870669 0.0909973 0.0256595 +-0.0237781 0.0389651 0.0367703 +-0.0314981 0.107032 0.0395669 +-0.0488684 0.125064 -0.00815774 +0.0188255 0.104686 -0.0188612 +-0.0214383 0.162534 -0.00657802 +-0.0923673 0.124202 0.041188 +-0.0116952 0.0383509 0.0145738 +-0.0933085 0.117399 0.0213072 +0.00147085 0.0388322 0.0258794 +0.041327 0.0986069 0.0251647 +-0.063339 0.160302 -0.0538579 +0.0235731 0.114695 -0.0116124 +-0.0828981 0.101969 0.02963 +-0.0616452 0.139553 0.0354433 +-0.0343725 0.0357923 0.047703 +-0.0451209 0.0377458 0.0446873 +-0.0920088 0.118668 0.00830639 +-0.0495672 0.135498 0.00241956 +-0.0603606 0.0633645 0.0289482 +-0.067238 0.175347 -0.0588701 +0.053058 0.0705565 0.0234346 +0.0380671 0.0821074 0.0357563 +-0.0797544 0.0720045 0.0191472 +-0.0844521 0.153452 0.0225801 +-0.0749035 0.113464 -0.00617122 +-0.0384926 0.0605846 0.0409778 +-0.075255 0.0832856 0.0380964 +-0.0198342 0.0855003 -0.0383524 +-0.0649244 0.113824 -0.0119395 +0.0421 0.0690665 -0.00478535 +-0.0615968 0.0595411 0.0052883 +0.0357976 0.0378059 0.0192762 +-0.0314223 0.0343059 -0.0206653 +-0.0805979 0.0786983 -0.00455339 +-0.0516467 0.0481272 0.0388737 +-0.0325014 0.0618008 0.0386259 +0.0188656 0.11384 -0.0146811 +0.0360105 0.106014 0.0293761 +-0.0489136 0.125469 0.0310273 +-0.0702125 0.173659 -0.0540385 +0.0100557 0.112263 -0.0189498 +-0.0643724 0.0341771 0.0147182 +-0.023212 0.165344 -0.00918469 +0.059734 0.0692161 0.0111359 +0.0164747 0.104398 0.044527 +-0.0870127 0.10633 0.011369 +0.030786 0.0765476 -0.0208061 +-0.0657333 0.121445 0.0506733 +-0.00450341 0.0703715 0.0573471 +-0.0525943 0.0544911 -0.00726112 +-0.0226202 0.181624 -0.0117104 +0.00179227 0.0340095 -0.0213712 +-0.0768516 0.103431 -0.00952853 +-0.0773369 0.105608 0.0341784 +-0.0364954 0.0987325 0.0427313 +-0.0532526 0.161216 -0.00188451 +-0.0658747 0.0981197 -0.0167177 +-0.00202406 0.126832 0.0305449 +0.0396296 0.0392572 0.0187428 +0.0114981 0.0658063 0.0534716 +-0.0660116 0.154522 0.0303582 +0.0322049 0.0871235 -0.0192744 +-0.0161934 0.116736 -0.0156361 +-0.00805531 0.101876 -0.0238922 +-0.0425065 0.0548487 0.0395533 +-0.0623557 0.152158 -0.0235797 +-0.0550956 0.0333795 -0.00606735 +0.0194036 0.123725 -0.00335403 +0.0149002 0.0348014 0.0340409 +-0.0174953 0.112701 0.0395679 +-0.0824727 0.0992304 -0.00559052 +-0.0428553 0.101381 -0.0214106 +-0.0291214 0.0621103 -0.0254198 +-0.0530392 0.146248 0.021397 +-0.0658806 0.040185 0.0344505 +0.0298766 0.0889056 0.0433386 +0.0206783 0.0361727 0.0176735 +-0.029331 0.0791866 0.0433726 +-0.0474654 0.135069 0.0155888 +-0.0798447 0.116298 -0.00419638 +0.0278259 0.115624 -0.00659973 +-0.0400692 0.157713 -0.010751 +-0.087695 0.0860952 0.016472 +0.0119148 0.0630446 0.0522963 +-0.0586388 0.0367329 -0.00984378 +-0.0545581 0.0628278 0.0306388 +-0.0904983 0.133768 0.0272133 +0.0424823 0.0958192 -0.00180898 +-0.085893 0.115781 0.0473131 +-0.0827739 0.0762807 0.0135216 +-0.0783317 0.109572 0.0415234 +-0.0535658 0.132546 0.0330634 +-0.0901834 0.114057 0.0406088 +0.0134074 0.0463149 -0.0249889 +0.0112253 0.0952809 -0.0268838 +0.0150227 0.080777 0.0534508 +-0.0278391 0.168266 -0.00883037 +-0.0698489 0.175309 -0.0448893 +-0.0895811 0.137877 0.0241855 +-0.0790004 0.100402 -0.00859092 +-0.062851 0.116991 0.0425454 +0.0239206 0.0352552 0.0228022 +-0.000501715 0.0634055 0.0567322 +0.046037 0.0806318 0.0171753 +-0.0766672 0.154399 0.00327135 +-0.0117177 0.129576 0.0183624 +-0.0885031 0.148521 0.0281728 +-0.0728479 0.14776 0.0416103 +-0.015205 0.175685 -0.0260892 +-0.082938 0.100617 -0.00458659 +0.0398543 0.102779 0.025179 +-0.0336965 0.120802 0.028215 +-0.0625742 0.17727 -0.0581696 +-0.00806953 0.0988363 -0.0267114 +-0.0560752 0.0602595 -0.0044615 +0.0597447 0.0594744 0.0191904 +-0.0106444 0.0481591 -0.0303544 +0.00351281 0.081445 0.056735 +-0.0672464 0.173921 -0.0582812 +0.00251634 0.0459065 0.0480561 +0.000471055 0.038278 0.000679374 +-0.0002129 0.122901 -0.0103152 +-0.0382613 0.0393263 0.043596 +0.00848754 0.0426921 0.0451471 +-0.0482154 0.137103 0.0123981 +-0.015727 0.0657542 -0.0377517 +-0.0282054 0.0676114 -0.0305119 +-0.0306807 0.0363386 -0.0186663 +-0.0476849 0.119711 0.0291692 +-0.0663764 0.12565 0.049733 +-0.0488788 0.134867 0.0224297 +-0.0877229 0.0888584 0.0234132 +-0.0756171 0.172473 -0.0369846 +-0.033348 0.0384446 -0.00813352 +-0.0442894 0.126542 0.0198398 +0.0235131 0.101506 -0.0194672 +0.0538716 0.0661448 0.0268494 +-0.073604 0.148628 -0.0255988 +-0.0671901 0.0335697 -0.00322908 +-0.0886344 0.0949473 0.0228281 +-0.0761608 0.175035 -0.0499961 +0.0306065 0.111866 -0.00856301 +-0.0317456 0.124703 -0.000629789 +-0.0904268 0.150188 0.0141369 +-0.0639022 0.10675 -0.0154602 +-0.0541798 0.157923 -0.00210942 +-0.00323215 0.0940338 -0.0336602 +-0.0164901 0.115444 0.0380258 +0.053298 0.0648217 0.0277585 +-0.0843615 0.0993477 -0.00259153 +-0.00674006 0.0712942 -0.0362643 +-0.0653258 0.140047 -0.00770568 +-0.00635478 0.123294 -0.010702 +-0.055158 0.0361639 -0.0112393 +0.00412979 0.113096 -0.0199676 +-0.064574 0.0418551 0.0316967 +0.0525746 0.0462075 0.0162071 +-0.0234833 0.0448815 0.0530288 +-0.071322 0.138326 0.0479203 +0.0425401 0.0986672 0.000167984 +0.0273648 0.102724 -0.0167839 +0.0332874 0.111381 0.0289227 +-0.0537039 0.0594504 0.0244709 +-0.0227345 0.0390118 0.0369431 +-0.00354236 0.0429091 0.0474905 +-0.0724136 0.156792 -0.00114359 +-0.00249623 0.0689511 0.056733 +-0.0482461 0.131793 0.0256765 +-0.0515081 0.0490357 0.0376444 +-0.0944953 0.125552 0.0212653 +0.00638447 0.0346255 0.0414585 +0.0141724 0.0940368 0.0505038 +-0.0688973 0.120914 -0.00896239 +-0.0520364 0.14934 0.0173988 +0.00422853 0.0810435 -0.0341743 +-0.0515685 0.0473635 -0.00788512 +-0.0237608 0.156715 -0.0053038 +-0.0356104 0.127425 0.0141251 +0.035299 0.113666 0.0170439 +0.0334236 0.0903004 0.0414245 +-0.0251823 0.172681 -0.0196186 +-0.08807 0.113074 0.0239452 +0.0189601 0.036126 0.0191857 +0.00788239 0.0363273 0.00580236 +-0.0173959 0.0348327 0.0487444 +-0.0878896 0.111968 0.039224 +-0.064655 0.115706 0.0452756 +0.0311169 0.0445787 0.030603 +0.0441778 0.076309 0.025099 +-0.0896358 0.0915718 0.0124456 +-0.065807 0.090969 -0.0181206 +-0.0709064 0.123821 -0.00862928 +0.00649864 0.0924086 0.053834 +-0.0704989 0.134077 0.0490714 +-0.0596081 0.0614162 -0.00289701 +0.0242732 0.0346695 0.0161217 +-0.0464984 0.101529 0.041912 +-0.0498635 0.101385 -0.021584 +0.00433106 0.0496013 -0.0292546 +0.0107427 0.041795 0.045086 +-0.0739382 0.132552 -0.00766265 +-0.0162071 0.174195 -0.0247085 +-0.0886736 0.132413 0.0428724 +0.0320792 0.05838 -0.0156698 +-0.0192343 0.038226 0.00590432 +-0.0445033 0.11527 0.0334071 +-0.0847891 0.15265 0.0254465 +-0.0933214 0.129622 0.0172404 +-0.0346417 0.056288 -0.0107606 +-0.072488 0.172225 -0.0500329 +0.0233375 0.0606402 -0.0253621 +0.0366723 0.106016 0.0285439 +-0.0276074 0.0356491 0.0527176 +-0.053407 0.152198 0.0189083 +-0.0742721 0.166608 -0.0409997 +-0.0457331 0.0753099 -0.0177194 +-0.00672552 0.0670096 -0.035497 +-0.00219357 0.131295 0.0117423 +-0.0261647 0.0620468 0.0393395 +-0.0553241 0.0335005 0.00825618 +-0.0228582 0.119091 -0.0120569 +0.0213076 0.110412 -0.0149847 +-0.0314817 0.0889488 0.0439042 +0.0313336 0.0477022 -0.006755 +-0.0386183 0.174771 -0.00621679 +0.040988 0.0392554 0.0153655 +0.0608733 0.0623548 0.014161 +-0.00841473 0.0366574 -0.0164161 +-0.0191613 0.038383 0.000326194 +-0.00880856 0.0882704 -0.0368626 +-0.0596465 0.149865 -0.00094307 +0.00994371 0.0978413 -0.0235989 +0.0455086 0.055594 0.0323303 +-0.0860233 0.102167 0.0034068 +-0.0281256 0.165243 -0.0164075 +0.00425042 0.072607 -0.0344972 +0.0235113 0.118015 0.0324132 +-0.000261091 0.0350803 0.00896105 +-0.0532978 0.147774 0.0234078 +-0.0554295 0.0433 -0.00807812 +-0.0771312 0.155572 -0.0108986 +-0.0841536 0.0790628 0.0035277 +-0.0900384 0.135039 0.0102136 +-0.0727986 0.0849862 -0.0158247 +0.0336101 0.0962478 -0.0138935 +-0.0284441 0.0732827 -0.0345293 +0.00969167 0.0357093 0.0447693 +-0.0267255 0.0380235 0.0244373 +-0.0572883 0.132547 0.0364836 +-0.0528311 0.0941603 -0.0218064 +0.0400501 0.0644468 0.0314841 +-0.036531 0.116238 -0.0149852 +-0.00649604 0.0912014 0.0567618 +0.0144842 0.101799 0.0469727 +0.00323629 0.131729 0.0108817 +-0.0308992 0.0734931 -0.0305082 +0.0172066 0.068625 0.0512164 +-0.0657497 0.0765846 -0.017077 +-0.0737602 0.111876 0.0478461 +-0.0694356 0.066827 -0.00357005 +-0.0585001 0.119809 0.0399342 +0.0441644 0.0931187 0.000177172 +-0.0843417 0.0952366 0.029868 +-0.054753 0.0782755 -0.0197234 +-0.00738705 0.0379427 -0.0155249 +-0.0910658 0.143334 0.0151805 +-0.00249685 0.08015 0.0577289 +0.0340507 0.0835544 0.0405264 +-0.0523382 0.161184 -0.00281855 +-0.0812419 0.109765 0.0353982 +-0.0582589 0.129739 0.0385905 +0.0543559 0.049285 0.0042337 +0.015086 0.0406501 0.0443863 +-0.0280294 0.0835807 0.0475884 +-0.0393811 0.128131 0.00244283 +0.0208178 0.0415166 -0.0167046 +-0.0881465 0.111869 0.0203319 +0.0179003 0.0347727 0.0238228 +-0.0656433 0.0657616 -0.0058195 +-0.0840769 0.0911454 0.0297191 +0.00624923 0.0796338 -0.0339546 +0.0328487 0.0876389 0.0423414 +0.0276661 0.034679 0.0131567 +-0.00286572 0.104506 -0.0226523 +-0.0862889 0.10771 0.0183439 +0.0408829 0.0937805 -0.00720194 +0.000164408 0.0895345 -0.0346177 +-0.0843436 0.144613 0.00514953 +-0.0675701 0.180805 -0.0555973 +0.0220024 0.0727679 0.0493999 +-0.0156461 0.186781 -0.0233704 +-0.0187078 0.0364661 -0.0182818 +-0.0254003 0.0649585 0.0413183 +0.0122459 0.0780339 -0.0313519 +-0.0555013 0.0547806 0.00866941 +-0.0521449 0.157571 -0.00396744 +-0.073564 0.156227 0.0174776 +-0.00865052 0.104822 -0.0230347 +-0.0529425 0.0516633 -0.00638853 +-0.0652396 0.0384193 0.0154218 +0.0233172 0.0809188 0.0496338 +-0.0494012 0.054529 0.0344155 +0.0222475 0.0847573 -0.0259093 +0.0413844 0.0438265 0.0277643 +-0.0818597 0.146076 0.0399402 +0.0111047 0.0345035 -0.00868495 +-0.006336 0.10011 -0.0240468 +0.0245413 0.0819542 -0.0249712 +-0.00496439 0.130958 0.0121612 +-0.00978935 0.0841125 -0.0382567 +0.00551162 0.104351 0.0429177 +-0.0384918 0.0874952 0.0437107 +0.00946556 0.123094 -0.0106511 +-0.0897739 0.137922 0.033196 +-0.0653284 0.0349129 0.0366619 +0.00350126 0.104382 0.0428343 +-0.0368171 0.04253 -0.0279956 +-0.0634962 0.0775171 0.0416907 +-0.0558399 0.0666 0.0358943 +-0.033501 0.113967 -0.0166209 +-0.0105678 0.0384807 0.0255376 +-0.0875349 0.110472 0.0163392 +-0.0221423 0.0430524 0.0536615 +-0.0485662 0.0337988 0.0271958 +-0.0681764 0.0335792 0.00196619 +-0.00165753 0.05399 -0.0314052 +0.0457818 0.0746903 0.0202853 +-0.0845781 0.148672 0.0341151 +0.0452897 0.0861791 0.0201631 +0.00831626 0.0356874 -0.00657792 +-0.0196215 0.042233 -0.0284571 +-0.0649431 0.145366 0.0395451 +-0.0704953 0.104114 0.0382884 +-0.0414996 0.117985 0.0314618 +-0.0712521 0.17555 -0.0439596 +0.0452514 0.0931962 0.00916141 +0.00133085 0.058325 -0.0325937 +-0.0620033 0.158406 -0.0355965 +0.030344 0.1101 0.0335023 +0.0463602 0.0692197 0.00260588 +0.0444762 0.0945372 0.00319063 +-0.0491293 0.0430398 0.0442413 +-0.0789669 0.172206 -0.0419919 +0.0106503 0.130383 0.00504386 +-0.0484141 0.113756 -0.016334 +0.00450584 0.0547654 0.053433 +0.0441531 0.0720542 0.000197496 +-0.0134923 0.120989 0.0351213 +-0.0907438 0.135107 0.0202099 +-0.0590287 0.0481317 0.00366474 +0.0364319 0.108205 -0.00282023 +0.0178615 0.122874 -0.00643626 +-0.0356427 0.112876 -0.017464 +-0.0668607 0.154942 0.00387089 +-0.0486527 0.162759 0.00599863 +-0.00949915 0.105857 0.0435217 +-0.0615042 0.121243 0.0426924 +-0.0784762 0.0731416 -0.000473316 +-0.0740322 0.156054 0.0216877 +-0.0847959 0.101901 0.0272869 +-0.0596957 0.14074 -0.00502874 +-0.050497 0.0987878 0.0435099 +-0.071801 0.0745407 0.0361884 +-0.0549619 0.14242 0.0292765 +-0.0427321 0.0739589 -0.0183224 +-0.0508117 0.0354248 -0.0125858 +-0.0642011 0.0410429 0.0143098 +-0.0132685 0.101107 0.0437078 +-0.0475187 0.0790945 0.0436556 +0.0209941 0.0373175 -0.00464913 +-0.0204991 0.100239 0.044421 +-0.0684679 0.110537 0.0393979 +0.0243777 0.124503 0.0143821 +-0.0830368 0.0762381 0.00350806 +-0.073622 0.0747015 -0.00970199 +-0.0461368 0.13275 0.0116924 +0.0104091 0.0389479 -0.0231008 +0.0155004 0.116786 0.0363781 +0.0387891 0.096727 0.0316453 +0.0196906 0.074125 0.0513576 +-0.0225582 0.0383546 -0.00218286 +0.0487458 0.0724992 0.00846572 +-0.0668418 0.138273 0.0438208 +-0.0309771 0.0339917 0.0163773 +0.0411176 0.0661976 -0.00575682 +-0.0229076 0.0852723 0.0551257 +0.000828067 0.123861 -0.00936286 +-0.0250326 0.0621165 0.0410328 +-0.0651714 0.128382 0.0462127 +-0.0434333 0.15941 0.00551467 +-0.0264854 0.0348879 0.0467436 +-0.0628107 0.150584 -0.0245802 +-0.0123081 0.181626 -0.0249909 +-0.00919366 0.172678 -0.0237455 +0.0126063 0.0576596 0.0514859 +-0.0332159 0.0709306 -0.0214641 +0.0240158 0.0658883 0.0452055 +-0.0660765 0.124251 0.0501642 +-0.0588552 0.0351368 -0.0102919 +0.0124134 0.0346609 0.020994 +0.0122384 0.0644368 0.0527864 +0.0452304 0.0763569 0.00121116 +0.0242611 0.0448626 -0.0136813 +-0.0304238 0.12007 0.0279522 +0.0145126 0.0347575 0.026768 +-0.0217663 0.065545 -0.0358558 +0.00816067 0.125635 -0.0073679 +0.0183075 0.0679765 -0.028974 +-0.0180555 0.0909221 -0.0366017 +0.00824317 0.0602927 0.0539848 +-0.0687967 0.0894213 -0.0168337 +-0.0450098 0.146255 0.00342574 +-0.0335022 0.0661629 0.0402747 +-0.0781465 0.155117 0.0246877 +0.00450914 0.0758818 0.0564153 +-0.0135396 0.0366033 -0.0173816 +0.045728 0.077798 0.00320493 +-0.0913745 0.142001 0.0211607 +-0.0284862 0.102933 0.0423265 +-0.0302445 0.16108 -0.00171322 +0.0327554 0.116907 0.00609585 +0.0201031 0.0379621 0.0410367 +-0.090178 0.113449 0.0375353 +0.0422255 0.0887323 -0.00780894 +-0.0632995 0.045657 0.000708444 +-0.0344955 0.0889014 0.0434521 +-0.0735138 0.0874308 0.0404487 +-0.081144 0.11 0.0405445 +-0.046701 0.144949 0.00345496 +0.0239825 0.114006 0.0348506 +0.00951792 0.0799496 0.0550675 +-0.0589753 0.0343808 0.0315144 +-0.0715764 0.0724969 0.0344898 +-0.0763465 0.151411 -0.00788806 +0.0476241 0.0444058 0.00228058 +-0.0865319 0.0910336 0.0265354 +-0.0761893 0.0686573 0.0192806 +-0.0738377 0.169377 -0.0450494 +-0.013497 0.089796 0.0568243 +-0.003677 0.129286 0.0256231 +0.00334505 0.0372684 -0.00154693 +0.0285394 0.0735396 -0.0227021 +-0.067513 0.132633 0.0463034 +0.0459145 0.0862168 0.00717824 +-0.0631406 0.152896 -0.00931447 +-0.0777879 0.113218 0.0476364 +-0.023707 0.0340979 -0.0208155 +-0.0144671 0.110884 -0.0194361 +0.0102739 0.0667155 -0.0310192 +-0.00350236 0.0842813 0.0574606 +-0.0664798 0.0832826 0.043443 +-0.0635622 0.0403137 0.0257086 +-0.0426942 0.0666296 -0.0154091 +-0.017221 0.187225 -0.0211553 +-0.0336762 0.062222 -0.0135529 +-0.0673972 0.0641749 0.025006 +-0.0740248 0.149858 -0.0328754 +-0.0467235 0.128128 0.0253508 +-0.0262045 0.163884 -0.00647025 +-0.0271883 0.118982 0.0306038 +0.033772 0.0543003 -0.00971113 +-0.0758953 0.12228 -0.00740649 +0.00448236 0.11415 0.0407558 +-0.0698932 0.103728 -0.0136756 +-0.0567617 0.0782351 -0.019665 +0.0543638 0.0534389 0.000229046 +-0.081811 0.11456 0.047449 +-0.0565132 0.053486 0.0056729 +-0.057003 0.128342 0.0386502 +-0.0664962 0.0370022 0.0293944 +-0.0624918 0.101519 0.0421076 +-0.0687869 0.155336 0.00316719 +-0.0685122 0.141137 0.0449382 +-0.0527211 0.0709092 -0.0154358 +-0.00549985 0.0703921 0.057296 +-0.0709113 0.107952 -0.0112859 +0.00912605 0.108716 -0.0196568 +0.0361188 0.0794771 0.0382118 +-0.0588731 0.101172 -0.0189069 +-0.068257 0.129831 0.0487832 +0.0374605 0.0754022 0.0365814 +-0.032324 0.161031 -0.00122654 +0.0285746 0.0351013 0.0166057 +0.0394117 0.0870933 -0.0127933 +0.0113423 0.0644371 0.0532354 +-0.0583019 0.0447396 0.0435847 +-0.00749863 0.0773617 0.0576592 +-0.050194 0.116459 -0.0151638 +-0.0481437 0.0545922 0.0360102 +-0.0104704 0.100279 -0.0242341 +-0.0347529 0.111555 -0.0180951 +-0.0155011 0.120965 0.0341268 +-0.0784442 0.154274 0.027518 +0.0120599 0.0739551 0.0543847 +-0.0633352 0.0436031 0.0119653 +0.0217763 0.115313 0.0351727 +-0.0415089 0.165252 0.00421093 +0.0335736 0.0700381 0.039723 +0.00251112 0.0647983 0.0566425 +-0.0654261 0.0391693 0.0381077 +-0.0695564 0.114278 0.0502908 +-0.00162211 0.0369274 0.0160989 +-0.058966 0.123797 -0.00809452 +-0.0942641 0.126921 0.0212556 +-0.0335104 0.175675 -0.00315318 +-0.0368415 0.0943464 -0.0233446 +0.0133357 0.128238 -0.000223601 +0.00322397 0.0768846 -0.0351052 +0.00583724 0.038604 -0.0097514 +0.0244991 0.0390622 0.0333159 +0.039204 0.0699354 0.0337973 +-0.00749309 0.122405 0.0352331 +-0.0204932 0.0624346 0.0477982 +-0.0366651 0.0353042 0.023032 +0.0167127 0.0887461 0.050636 +-0.0697357 0.167099 -0.0218834 +0.0364696 0.0632797 0.0368445 +-0.0745038 0.141441 0.0470955 +-0.0621205 0.0458041 0.0366793 +-0.0544906 0.0820201 0.0451936 +-0.0645123 0.172574 -0.0485643 +-0.0421309 0.128083 -3.62159e-05 +0.0281636 0.121218 0.0186511 +-0.0121987 0.171236 -0.0257581 +-0.0281113 0.0605968 -0.0274147 +-0.0631879 0.0449558 -0.00115255 +-0.056884 0.0955743 -0.0213395 +-0.0516987 0.131736 -0.00321408 +0.00826283 0.110977 0.0402103 +-0.0738401 0.154086 -0.0269016 +0.00525204 0.071179 -0.0340737 +-0.0710521 0.173649 -0.0530415 +-0.0508226 0.162642 -0.00385759 +-0.0802179 0.141741 -0.00280512 +-0.0104908 0.12238 0.0346088 +-0.082839 0.145958 0.00218243 +-0.0764995 0.134472 0.0515165 +0.0572674 0.0552579 0.0228777 +-0.0459192 0.038241 -0.0182827 +0.0212995 0.0664627 -0.0275106 +-0.00266999 0.131274 0.0130017 +-0.0615996 0.159996 -0.0335919 +-0.0172476 0.12413 0.0281151 +0.0257469 0.104744 0.0391433 +0.033213 0.112692 0.0276861 +0.0156033 0.0352036 -0.0174539 +-0.030256 0.0608147 -0.0214135 +-0.0554996 0.0746996 0.0418498 +0.0250243 0.0618819 0.0448807 +0.0333333 0.0528011 -0.00875184 +0.0462789 0.0820452 0.011174 +0.0413782 0.0519867 -0.00685663 +-0.0228771 0.11806 -0.0129657 +-0.0608849 0.0381036 0.0449409 +-0.0255027 0.103002 0.0430099 +-0.0102615 0.128766 0.00159795 +-0.0140304 0.0389318 -0.0121434 +0.0242826 0.0691154 -0.0252241 +-0.0262141 0.0383199 -0.0177378 +0.000134491 0.116503 -0.0174981 +-0.0556551 0.0575 -0.00342108 +-0.0641179 0.115013 -0.0114251 +-0.0523454 0.059725 0.0287459 +-0.039493 0.0888698 0.0432118 +-0.0635876 0.0600882 0.0187607 +-0.0527647 0.138519 0.0263974 +-0.0421778 0.150669 0.00550662 +-0.0898169 0.147438 0.0111767 +-0.0440117 0.149183 0.00634807 +-0.0124981 0.0842783 0.057419 +-0.041501 0.0888244 0.0425932 +0.0390954 0.0814754 -0.0127535 +-0.00978632 0.0812687 -0.0379822 +-0.0143122 0.127128 -0.000614565 +0.043146 0.0650339 -0.00117659 +0.0508787 0.0465582 0.0223162 +-0.0187679 0.0341854 -0.027695 +0.0104088 0.0403968 -0.0232872 +-0.0615714 0.111062 0.0370307 +-0.0574772 0.0344195 0.038759 +-0.029988 0.0381577 0.0326274 +-0.0293835 0.0775974 -0.0345936 +-0.0174998 0.115454 0.0379182 +-0.0492034 0.0336154 -0.00143623 +-0.0160718 0.124871 -0.00420428 +0.0153397 0.120197 -0.0115352 +-0.0588103 0.157344 0.00530008 +-0.0448304 0.0956436 -0.0219722 +0.0199962 0.120682 0.0326204 +0.050389 0.0482108 0.0251806 +0.0208954 0.116644 -0.0117151 +-0.079388 0.147286 -0.00182539 +-0.0747645 0.0849032 -0.0147477 +-0.0505016 0.107064 0.0390734 +-0.0174992 0.03427 -0.0197565 +-0.01005 0.166619 -0.017705 +-0.0581312 0.0342101 0.0265873 +-0.0613803 0.17096 -0.0575947 +-0.0304965 0.0917653 0.0441169 +-0.0458806 0.10564 -0.0201801 +0.0202101 0.0833915 -0.0271395 +0.0323169 0.0376319 0.0223694 +-0.0223063 0.0380908 0.0216787 +0.035616 0.10962 -0.00284805 +0.0484836 0.0582148 0.031165 +-0.0809138 0.125107 -0.00520991 +-0.00566591 0.0540919 -0.0326394 +-0.00149662 0.114206 0.0415504 +-0.0263202 0.0930635 -0.029586 +-0.0680426 0.110046 0.0381289 +0.0249883 0.12025 -0.003603 +-0.0736149 0.155479 0.0262237 +-0.0299566 0.122268 0.0236125 +0.0238471 0.107154 -0.0155051 +-0.0566015 0.0451895 0.0246815 +-0.028491 0.0987621 0.0434122 +-0.0338535 0.0870951 -0.024854 +-0.0478322 0.0956344 -0.0220665 +-0.0226614 0.177177 -0.0135831 +-0.0810787 0.154935 0.0192662 +0.0439336 0.0428821 0.0236685 +-0.0114115 0.128814 0.0228458 +-0.0417827 0.0840916 -0.0212196 +0.0249862 0.118037 0.0310154 +-0.0641215 0.0336259 -0.00810847 +-0.0795112 0.081834 0.0339273 +-0.041505 0.119362 0.0299569 +-0.0033398 0.119986 -0.0131833 +0.0411805 0.0745986 -0.0077775 +-0.0446675 0.0636475 -0.0137193 +0.00937092 0.0937948 -0.0292997 +0.0415042 0.104246 0.00816492 +-0.0792333 0.169423 -0.0379787 +-0.0414888 0.0437926 0.0421195 +-0.00148881 0.0760516 0.0586512 +-0.0126769 0.0541386 -0.0335166 +-0.00577674 0.0385885 0.0246132 +-0.0394947 0.0676998 0.0417669 +0.0147262 0.129115 0.00511474 +-0.0045144 0.0774415 0.0584948 +0.0334512 0.0365216 0.00521608 +-0.0662857 0.0625946 -0.00141881 +-0.0659868 0.0418098 -0.00430732 +-0.0485691 0.0460686 -0.00963735 +0.0269239 0.0493817 -0.018692 +-0.0652895 0.175332 -0.0607504 +0.0558431 0.0722822 0.0186151 +0.0389971 0.039341 0.0203664 +-0.0252734 0.05785 0.0399799 +-0.0537245 0.0723552 -0.016258 +-0.0214963 0.104399 0.0429755 +-0.0649507 0.13395 0.041174 +-0.0641915 0.179229 -0.0572988 +-0.00649249 0.110023 0.0430195 +-0.0925801 0.120153 0.0312943 +0.0364682 0.111067 0.00216795 +-0.0487462 0.118344 0.031163 +0.0272987 0.047751 0.0374572 +-0.0235246 0.079724 0.0545007 +0.044563 0.0819287 0.0241608 +0.018083 0.0887399 0.0491141 +0.0180337 0.115273 -0.0142355 +-0.0838753 0.135332 0.0479212 +-0.0707318 0.154624 0.0301689 +-0.0897339 0.0916034 0.0174376 +-0.0487526 0.0782553 -0.019094 +-0.021696 0.0567795 -0.0319795 +-0.0524624 0.139899 0.000243693 +-0.016317 0.0384896 0.0261516 +-0.0172081 0.172701 -0.0233314 +-0.0664965 0.109745 0.0377695 +-0.0117557 0.0345134 -0.025836 +-0.000654571 0.0391799 -0.00969942 +0.00820345 0.083757 -0.0326005 +-0.0458982 0.107069 -0.0194756 +-0.0567459 0.15948 0.00480369 +0.00650779 0.0575337 0.0533257 +0.037787 0.0377202 0.0142753 +0.00846774 0.13132 0.015646 +-0.0475009 0.0425468 0.0439593 +-0.0766415 0.100814 0.0361238 +-0.028614 0.0408765 -0.0296027 +0.00929873 0.115842 -0.01682 +-0.0828745 0.119161 -0.00328383 +-0.0769895 0.0790529 0.034321 +-0.0878006 0.151251 0.0245374 +0.0208653 0.122279 0.030221 +-0.00768551 0.130297 0.0183702 +-0.0545511 0.0430136 -0.00860983 +0.030217 0.0843227 -0.0201565 +-0.0467665 0.152145 0.00944802 +-0.0631219 0.156103 0.0153645 +-0.0681832 0.155264 -0.0517309 +0.0142805 0.0345676 -0.0138073 +-0.0664934 0.0624679 -0.000297249 +-0.0641994 0.16384 -0.059407 +0.0464327 0.0769932 0.014129 +-0.041507 0.0591281 0.0403212 +0.0223695 0.0993436 -0.0211483 +-0.088603 0.087513 0.0164636 +0.00038562 0.0392239 -0.00953586 +0.0270604 0.0795391 0.0462139 +-0.0684865 0.0611195 0.0150424 +0.0105195 0.053345 0.0519069 +-0.0620106 0.15528 -0.0315878 +-0.00991465 0.0385501 0.00204441 +-0.0151984 0.171233 -0.0237028 +-0.026193 0.171192 -0.0190186 +0.0404914 0.0541681 0.032094 +-0.0115119 0.181449 -0.0261319 +-0.027122 0.166756 -0.0173778 +0.0338583 0.105892 -0.0101458 +-0.0671444 0.0628365 -0.000338348 +-0.0788571 0.120751 -0.0060883 +-0.0525645 0.0417313 -0.0101531 +0.0278652 0.0996344 -0.0174729 +-0.0681363 0.122845 0.0524474 +-0.0228108 0.0770465 -0.0385748 +-0.0135961 0.12464 -0.00600832 +-0.00365126 0.0525899 -0.0316543 +-0.068996 0.139931 -0.00789046 +-0.0310262 0.153728 -0.00354608 +-0.0497211 0.131062 0.0298847 +-0.00109314 0.103948 0.0441727 +-0.0204702 0.16083 -0.0136222 +-0.0865394 0.109089 0.0183378 +0.0400949 0.095337 0.0300286 +-0.0693797 0.128452 0.0506772 +-0.0438868 0.107083 -0.0199439 +-0.0470477 0.150201 -0.00445632 +-0.0370064 0.121579 0.0285082 +0.0198288 0.120602 -0.00797301 +-0.0549804 0.0334872 0.0101333 +0.00782186 0.127915 -0.00384433 +-0.0495314 0.12548 0.031876 +-0.0926082 0.117405 0.0243082 +-0.0215209 0.0382567 0.0252967 +0.00181128 0.125691 -0.00735123 +-0.0771897 0.117737 0.0516815 +-0.0554751 0.0519418 -0.00338574 +-0.0771699 0.154422 0.00455736 +-0.00649896 0.092559 0.0563419 +-0.0704303 0.164039 -0.0149268 +-0.036643 0.118048 -0.0128637 +-0.0535056 0.136701 0.0296589 +-0.0594928 0.0761776 0.0424443 +-0.00649656 0.0856337 0.0569558 +-0.0586618 0.0637687 0.0307411 +-0.0650964 0.155112 0.00596226 +-0.0626129 0.0371673 0.0184653 +0.0330114 0.107386 0.0320976 +0.0333812 0.0490928 -0.00645546 +-0.069711 0.1744 -0.043385 +-0.00744712 0.0961017 -0.0318028 +0.0413373 0.0392631 0.0117259 +-0.0487556 0.137056 0.00741027 +-0.0845701 0.112449 0.0449336 +0.0531449 0.0608429 -0.00288049 +-0.0358592 0.10284 -0.0213952 +-0.0778493 0.11932 -0.00645768 +0.0172333 0.0750251 -0.0287502 +-0.0195083 0.11546 0.0373373 +-0.0542618 0.0348321 -0.0120282 +-0.0344386 0.125663 -0.00162003 +-0.0690003 0.160066 -0.00858817 +0.0285895 0.0979793 -0.017709 +0.015268 0.0341755 -6.02454e-05 +-0.012432 0.12921 0.00653602 +-0.0222335 0.171216 -0.0204735 +-0.0656059 0.0615317 0.0026003 +-0.0324965 0.174231 -0.00238999 +-0.0398336 0.0384391 -0.0280596 +-0.0513902 0.122634 0.0344378 +-0.0735123 0.142806 0.0460464 +-0.0703661 0.16678 -0.0206717 +0.0128439 0.0343776 -0.0158182 +-0.074941 0.152735 -0.0189 +-0.0785348 0.0771858 -0.00655705 +0.0347176 0.114447 0.00679736 +-0.0192836 0.0385916 0.0308544 +-0.00226925 0.130756 0.00454173 +-0.0622845 0.161545 -0.0405978 +-0.0687671 0.0900946 0.0427048 +-0.028252 0.050761 -0.0234049 +-0.0818245 0.107456 0.0283887 +0.0216927 0.103078 -0.0191449 +-0.0539655 0.0364915 -0.0115887 +-0.0577688 0.142406 -0.00278963 +0.0347443 0.08354 0.0397721 +0.041088 0.0912985 0.0296287 +0.0209984 0.0578395 0.0478214 +-0.0607897 0.155834 0.0118473 +-0.0427999 0.167662 -0.00952768 +-0.0135045 0.0870342 0.0571061 +0.0551275 0.0637038 0.000299703 +-0.0500088 0.124901 -0.00796654 +0.040891 0.0917758 -0.00909975 +-0.057302 0.152908 0.030569 +-0.0490908 0.140152 0.0103957 +-0.062514 0.0399436 -0.00751704 +-0.0901142 0.14065 0.0241685 +-0.0614977 0.0847334 0.0442553 +0.00401707 0.125848 -0.00755459 +-0.0295217 0.0402041 -0.0298306 +-0.0770884 0.0866038 -0.0125752 +0.00250242 0.0441898 0.0459568 +-0.0884166 0.13498 0.0042424 +-0.0144984 0.11138 0.0412273 +-0.0543527 0.155034 0.0127444 +-0.0485461 0.135607 0.0194861 +-0.0763654 0.155962 0.0179624 +0.0194741 0.0351845 0.0201392 +0.0604235 0.0678625 0.0131519 +-0.0147437 0.0383723 0.00849375 +0.0123077 0.035562 0.0436453 +-0.0878555 0.0861109 0.00948006 +0.0461918 0.0820393 0.0121748 +-0.0376617 0.0344352 0.0359896 +-0.0640313 0.13251 0.040793 +0.00650251 0.122426 0.0350167 +0.046473 0.0747304 0.00699979 +-0.090578 0.13228 0.00723516 +-0.0665138 0.0986787 0.0417758 +-0.0753611 0.0724331 0.0302407 +-0.0737585 0.160179 -0.00884095 +-0.0875779 0.102333 0.0213648 +-0.0213902 0.0905176 -0.0361974 +-0.0663379 0.132604 0.0444522 +0.0420458 0.0817019 -0.00677657 +-0.0739471 0.131099 -0.00783391 +-0.00249367 0.0925505 0.0559214 +-0.0748382 0.149925 -0.0278668 +-0.0734967 0.126028 0.0530224 +-0.0386362 0.117281 -0.0140679 +0.00347668 0.0964809 0.0526894 +0.0453833 0.074968 0.00220665 +0.012072 0.11405 -0.0168987 +-0.0774663 0.168085 -0.0299733 +-0.0534988 0.0761753 0.0426023 +-0.0233682 0.126286 0.00541909 +-0.00704598 0.0392708 0.0363567 +-0.0791658 0.0990564 -0.00863296 +-0.0464518 0.0945568 0.0436355 +-0.0404194 0.128239 0.00205017 +0.0393898 0.107905 0.00701069 +-0.0398611 0.0338561 -0.0163385 +-0.0665222 0.156255 0.0214077 +-0.0672076 0.171872 -0.0410051 +-0.0708261 0.144835 -0.0182015 +-0.0650483 0.0701635 0.0361166 +-0.00764186 0.11082 -0.0214014 +-0.0836837 0.151385 0.0303528 +-0.0496912 0.162854 0.00564102 +-0.0114821 0.125053 0.0306553 +-0.0713615 0.158186 -0.0419305 +-0.0348112 0.0336186 -0.0263013 +-0.0652015 0.0334423 0.00269659 +-0.00682217 0.0390777 -0.0108403 +-0.0745121 0.155307 0.0054919 +0.00849016 0.0441134 0.0451901 +-0.041821 0.0914074 -0.0230213 +0.0243874 0.048835 -0.0205112 +-0.0578612 0.158406 0.00308521 +-0.0781467 0.116431 0.0503206 +0.0429791 0.071952 -0.00379352 +-0.00196689 0.131088 0.00752604 +-0.0728984 0.156837 -0.0329194 +0.00543206 0.119469 -0.0147017 +-0.00442631 0.0386612 0.00487339 +-0.089531 0.0983552 0.0174009 +0.00679264 0.0379024 -0.00704418 +-0.0255688 0.0356598 0.0531386 +-0.0343151 0.0794495 -0.0245241 +-0.0124944 0.0870249 0.0570339 +-0.0710693 0.155098 0.0285743 +-0.0663511 0.0350877 0.0310837 +0.00349789 0.122445 0.0347995 +-0.0414975 0.045132 0.0414403 +0.0348194 0.0365264 0.00732462 +-0.0740113 0.141343 -0.00688783 +-0.0303332 0.0706347 -0.0294852 +0.0503042 0.0691243 0.0253774 +-0.0701319 0.158154 -0.0479233 +-0.0358242 0.0915039 -0.0239402 +-0.0645394 0.0596403 0.015406 +0.0213135 0.0650138 -0.0271409 +0.0262112 0.0873747 -0.0229809 +-0.052671 0.112615 -0.017101 +-0.0592898 0.045994 0.0417021 +-0.0717164 0.163822 -0.0439567 +0.0178664 0.127935 0.017674 +-0.0655034 0.108381 0.0382088 +0.0278762 0.0942373 0.043974 +-0.0457869 0.0855328 -0.0217062 +-0.0643109 0.169365 -0.0428818 +0.0100266 0.0346111 0.0241784 +-0.00361434 0.0341476 -0.0187856 +-0.0389438 0.047744 -0.0146455 +-0.0676963 0.0648397 0.0261272 +-0.0374998 0.0691046 0.0417769 +-0.0568378 0.0613597 0.0260949 +-0.0369296 0.036554 0.0451414 +-0.0284901 0.0688983 0.0393825 +-0.0534824 0.0340932 0.0259063 +-0.0631168 0.15992 -0.0455978 +-0.0444353 0.0335419 -0.0188134 +-0.0168224 0.0960286 0.0515795 +-0.076233 0.145832 -0.00587217 +-0.0231748 0.0709692 0.0487695 +-0.0104382 0.0354056 -0.0175403 +-0.0897878 0.136555 0.0351995 +-0.0717761 0.0344583 0.000444464 +0.0353682 0.103387 0.0319873 +-0.00977607 0.0770524 -0.0379416 +0.00551406 0.0375423 0.0260562 +-0.00350144 0.0675505 0.0564719 +-0.0564947 0.102955 0.042036 +-0.061361 0.0336079 0.00692461 +0.00850062 0.121038 0.0360118 +0.0202826 0.0693621 -0.0284085 +-0.00908512 0.169637 -0.0217386 +0.0255848 0.123614 0.0162626 +0.0234098 0.0871372 -0.0242525 +0.0269727 0.112042 -0.0107557 +0.0262833 0.0935743 -0.0210485 +-0.059 0.0412164 0.021703 +0.0345357 0.0373492 0.0194302 +0.0530102 0.0462982 0.0132036 +-0.00365111 0.0511553 -0.0312289 +-0.0591025 0.0338635 0.0178635 +-0.0144888 0.0673806 0.0542261 +-0.0416194 0.0336308 -0.0257822 +-0.0186097 0.0407857 -0.0282477 +-0.0298888 0.0474725 0.0462905 +-0.00306646 0.0386027 0.0233477 +0.0330707 0.110451 -0.00703014 +0.0146846 0.037467 0.0442233 +-0.0390505 0.154795 -0.00905663 +-0.0306702 0.0891071 -0.0265975 +-0.090498 0.131069 0.0362301 +-0.0189866 0.10628 -0.022556 +-0.0125142 0.181139 -0.0289621 +-0.0236648 0.0522261 -0.0284113 +-0.0564969 0.100177 0.0431307 +-0.0314961 0.10429 0.0412052 +-0.0509168 0.0335668 6.7085e-05 +-0.0773495 0.081875 0.035997 +-0.0834254 0.141805 0.00220396 +0.00104126 0.108173 -0.0205653 +0.0181741 0.0988563 -0.0226017 +-0.0797776 0.115912 0.0485816 +-0.0816869 0.0734846 0.011537 +0.00150486 0.0856703 0.0573817 +-0.00849476 0.0745791 0.0575173 +-0.00549893 0.0939194 0.0556385 +0.0221626 0.0490425 0.0405889 +0.0363661 0.0873006 -0.0164353 +0.0491174 0.0712134 0.0219878 +-0.079214 0.155524 0.0184351 +-0.0654627 0.0598015 0.0150426 +0.0330982 0.0626311 -0.0167961 +-0.0839336 0.126519 -0.00402298 +-0.00950667 0.125161 0.0310898 +0.0292092 0.0563773 0.0403225 +-0.0273861 0.0720614 0.0416635 +-0.0647467 0.0379255 0.0402853 +-0.0521847 0.140082 0.0224024 +-0.0276164 0.0422898 -0.0293674 +0.0360108 0.100867 -0.0107814 +-0.0946899 0.124172 0.0202666 +0.0446233 0.0903218 -0.000806954 +-0.00230838 0.0348204 0.04129 +0.00391726 0.126651 -0.0064175 +-0.0633881 0.0336212 0.00649796 +0.00838362 0.046349 -0.0258656 +-0.0577252 0.156918 0.00853143 +-0.0693669 0.17099 -0.0332104 +0.0249955 0.0347512 0.0143719 +0.00961895 0.12141 -0.0128393 +0.021665 0.0416371 -0.0126942 +-0.0521438 0.0568294 0.0272279 +-0.0628733 0.0996403 -0.0179913 +0.0218834 0.0415901 -0.0107198 +-0.0546838 0.0435714 0.0206922 +-0.0176301 0.183064 -0.0184359 +-0.00750517 0.0471136 0.0478292 +-0.0520933 0.154615 -0.00405641 +-0.0865732 0.0860822 0.023453 +-0.0665787 0.163768 -0.0579853 +0.00636801 0.0479975 -0.0276935 +0.0368613 0.0587703 -0.00975684 +-0.0879266 0.10368 0.0183585 +-0.016623 0.0450359 -0.0278307 +-0.0895401 0.135156 0.0272131 +0.000356348 0.0496808 -0.0306188 +-0.0836962 0.138005 0.0462469 +0.0441945 0.077668 0.0251701 +-0.0685147 0.0930476 0.0422841 +-0.0232574 0.100051 -0.0240138 +-0.03748 0.0548048 0.0392179 +-0.0293599 0.15815 -0.0119938 +-0.021522 0.0336815 -0.0237529 +0.00128503 0.0655494 -0.0343406 +-0.0861178 0.0953813 0.000442214 +0.0350885 0.099465 0.0350983 +-0.0779853 0.13835 -0.00526914 +-0.0857179 0.124363 0.0486993 +-0.0309707 0.163858 -0.00458082 +-0.0722468 0.174258 -0.0400013 +-0.0149026 0.105901 -0.0222117 +-0.0673665 0.165482 -0.0209987 +-0.0876017 0.152029 0.0126504 +-0.0220763 0.0666765 0.0478151 +-0.0624814 0.094591 0.0443423 +-0.0196147 0.0379102 -0.0280301 +-0.0346582 0.0422066 0.0469558 +-0.0199036 0.0739897 0.0538964 +-0.00877818 0.0387104 -0.00343461 +0.000535895 0.0548656 0.0545076 +-0.0454881 0.10014 0.0423159 +-0.0404927 0.0958661 0.0421915 +-5.87354e-05 0.100974 -0.0229378 +-0.0283024 0.0362399 -0.0299084 +0.026308 0.0822369 0.0469135 +-0.06337 0.156813 -0.0136043 +-0.0624231 0.0357528 0.0196573 +-0.0709978 0.0698591 0.0316215 +-0.00550273 0.0661441 0.0562254 +0.00539692 0.0418924 -0.0240197 +-0.0711187 0.0642492 0.0206358 +-0.0614458 0.0606683 0.0222701 +0.0189142 0.0353585 0.00519133 +0.0315596 0.0497964 -0.00774264 +-0.0548596 0.0462919 -0.006395 +0.0010398 0.0392387 0.0326514 +0.0448141 0.0889533 0.0211601 +-0.0898897 0.136442 0.013225 +0.0409408 0.0873455 0.0311847 +-0.0866496 0.106304 0.00937201 +0.0315171 0.118424 0.0085036 +-0.091229 0.14471 0.0161551 +-0.00263717 0.12924 0.026005 +0.0142425 0.0645148 0.0521595 +-0.0509259 0.0571242 0.0316152 +-0.0585706 0.155353 0.0213449 +0.0242207 0.111888 -0.0125803 +-0.0305755 0.0788685 0.0415824 +-0.0664528 0.145477 0.0410093 +-0.00432524 0.0423738 0.047881 +-0.0434528 0.12491 0.0216806 +-0.0610445 0.045667 0.0306816 +-0.0148175 0.0855384 -0.0388203 +0.0594886 0.0594575 0.00616841 +-0.0740871 0.156873 -0.0259173 +-0.0414785 0.105663 0.0400022 +-0.0376995 0.0680509 -0.0154542 +-0.0698935 0.122364 -0.00881274 +-0.00848477 0.0718045 0.0573713 +-0.0394932 0.127549 -0.000886358 +-0.0856022 0.136615 0.0453504 +-0.0889467 0.143422 0.0321606 +-0.0738723 0.109242 -0.00905672 +-0.0222267 0.0906414 0.0528718 +0.00551724 0.0661119 0.0558057 +-0.0588983 0.0582416 0.00880815 +0.0225876 0.0388978 0.0383164 +0.0022443 0.0974458 0.0519249 +-0.056455 0.12554 0.0394323 +-0.00949777 0.091187 0.0566315 +0.00149085 0.103013 0.043912 +-0.00374904 0.0712712 -0.0357267 +-0.0394946 0.119701 -0.0126173 +-0.0631669 0.152168 -0.0312981 +-0.0139477 0.0625843 0.0539847 +-0.0604937 0.100137 0.0425915 +-0.0749718 0.138395 -0.00644263 +0.00624486 0.0401371 0.0456279 +0.0193551 0.0475975 0.0417872 +-0.0303971 0.0890708 -0.0275789 +0.0196022 0.0462781 0.0421275 +0.0317544 0.0632771 0.0405733 +-0.0662966 0.156977 -0.00759157 +0.0183734 0.0506657 -0.0252113 +0.0404388 0.0427247 -0.00185446 +0.0115151 0.105777 0.0436811 +-0.0301364 0.0349235 0.0476426 +0.0254917 0.0369057 0.0252691 +-0.0850483 0.109026 0.0223524 +0.0157867 0.112048 -0.0167369 +0.0360751 0.0370336 0.00715793 +-0.0781026 0.0818813 0.0353359 +-0.00650962 0.0773868 0.0579538 +-0.0494324 0.0586474 0.0343285 +0.0112135 0.116429 0.0374582 +-0.0555782 0.159581 0.0063787 +-0.0454954 0.160804 0.00677344 +-0.0709975 0.139911 -0.00751202 +-0.0547852 0.0339346 -0.0120065 +-0.079504 0.128859 0.053141 +-0.0155349 0.0459646 0.0502157 +-0.0704857 0.116111 0.0520944 +-0.0454716 0.0404727 0.0442216 +-0.0890267 0.148493 0.027289 +0.0192952 0.126057 0.00111502 +0.00542039 0.0392223 0.0299552 +-0.0509634 0.152153 0.0121451 +0.0432798 0.100122 0.00916351 +-0.0722295 0.16736 -0.0213426 +-0.0311459 0.0354418 0.0504241 +-0.0834736 0.114211 -0.000781836 +-0.0258217 0.181482 -0.0160394 +-0.0517798 0.115481 0.0337859 +-0.0763629 0.108471 -0.00759882 +-0.0757916 0.155001 0.00503825 +-0.0893649 0.111932 0.017326 +-0.0619999 0.132592 -0.00773229 +-0.033844 0.171255 -0.00164046 +-0.0352015 0.153653 0.00157065 +-0.0722895 0.147809 -0.0265569 +-0.0217088 0.114301 -0.017023 +0.026785 0.0955535 0.0441601 +-0.0481378 0.0672057 0.0386531 +-0.026667 0.0823364 0.0504973 +0.00619086 0.131536 0.009113 +-0.0526119 0.0580506 0.0248562 +0.00250286 0.0576093 0.0540213 +-0.0810169 0.0953587 0.0335948 +0.029848 0.0875415 0.0432926 +0.0464379 0.0778615 0.0131806 +-0.0134997 0.0856507 0.057198 +0.0263535 0.0795425 0.0469281 +-0.0265857 0.0603669 0.0385952 +-0.0334943 0.11802 0.0311453 +-0.00337868 0.117905 -0.0149619 +-0.0660268 0.177263 -0.0521591 +-0.0238887 0.156697 -0.00604726 +-0.00760592 0.125948 -0.00752899 +-0.0221488 0.0383333 0.0268965 +-0.0293863 0.155004 -0.00725783 +0.0105543 0.126889 0.0293082 +0.0501729 0.0446765 0.00723117 +0.0310879 0.115727 -0.00269046 +-0.0191314 0.122285 0.0303949 +-0.0777065 0.155692 0.0145746 +-0.0797904 0.152563 0.0316147 +-0.0710154 0.0391332 0.00421404 +-0.0889531 0.100999 0.0124002 +-0.0147295 0.0942902 -0.0339999 +-0.0812191 0.0785924 0.0290188 +-0.0766463 0.0803349 -0.0100768 +-0.0435275 0.152141 0.00710463 +-0.0608313 0.092512 -0.0191943 +0.0227948 0.124775 0.0223512 +-0.0831943 0.132626 0.0501472 +-0.0317593 0.0449779 0.048226 +0.00552401 0.0633596 0.0561453 +-0.0492065 0.128269 0.0305743 +-0.0634388 0.152153 -0.00650488 +-0.0568117 0.135044 -0.00489316 +0.0252231 0.117755 -0.00691168 +-0.0716366 0.0874136 0.0414306 +-0.0725279 0.091561 0.0413901 +-0.0764449 0.084677 0.0378167 +-0.00880306 0.0841017 -0.0380883 +-0.0688616 0.033602 -0.00179476 +0.0161578 0.0988387 -0.0226848 +-0.0829912 0.0966357 0.0312921 +0.00854504 0.101743 0.0468013 +-0.0161113 0.0419173 0.0519008 +-0.0115772 0.0991016 -0.0249869 +0.026625 0.0839457 -0.0229857 +0.0451532 0.0931968 0.0111604 +-0.0264982 0.113889 0.035131 +-0.00351628 0.0442826 0.04692 +-0.0202282 0.0639107 0.048901 +0.0154069 0.0403121 -0.0220991 +-0.0725345 0.140015 0.0475615 +-0.0340447 0.1653 -0.00374721 +0.00850451 0.0883096 0.055394 +-0.0516913 0.0680528 0.0372779 +-0.070167 0.162396 -0.0479528 +-0.0174382 0.127681 0.00469302 +0.0354105 0.0965418 -0.0122281 +-0.0427202 0.152139 0.00651185 +-0.00023381 0.123831 -0.00932637 +-0.073929 0.152666 -0.0308896 +0.0244967 0.0375596 0.0281073 +-0.038496 0.0450464 0.0406484 +0.0424477 0.0803262 -0.00578172 +-0.017618 0.163994 -0.00984759 +0.042638 0.101488 0.0111603 +-0.0114747 0.111375 0.0418865 +-0.0878262 0.152428 0.0199936 +-0.0605498 0.0341606 0.0243603 +-0.0474966 0.088987 0.0447599 +0.0139221 0.0913152 -0.0287052 +-0.0182228 0.038194 0.0115761 +-0.0697006 0.0619862 0.0158161 +0.0317346 0.0619381 0.0405155 +0.0470668 0.0701831 0.0226957 +-0.0222639 0.0783263 0.0546841 +-0.0624118 0.148891 -0.00459657 +-0.0245152 0.111258 0.0385919 +-0.0623581 0.164692 -0.0425931 +0.0189449 0.0348191 0.0239933 +-0.0489525 0.123989 0.0308621 +-0.0294789 0.0732089 0.0403736 +-0.0912678 0.12968 0.0332366 +0.0188735 0.102787 -0.0208351 +-0.0542898 0.0343509 0.030786 +0.0541934 0.0628656 -0.00090927 +-0.024607 0.037979 -0.0290368 +-0.0461075 0.164061 -0.00779976 +-0.00480748 0.0854817 -0.0373491 +-0.0398973 0.160894 0.00183362 +0.0122013 0.0878954 -0.0308742 +-0.0609826 0.13955 0.0346529 +0.01801 0.126774 0.0220214 +-0.0720383 0.149669 -0.0395937 +0.0268545 0.0350543 0.018119 +-0.00249757 0.0952299 0.0546317 +-0.0177632 0.0728777 -0.0388934 +-0.00835092 0.0354934 -0.0172056 +-0.0123646 0.109877 -0.0203825 +-0.0385 0.120755 0.0293207 +-0.0614467 0.0335533 -0.00933279 +-0.0144984 0.108621 0.0424908 +-0.071459 0.151188 -0.0433221 +-0.0227544 0.0753712 0.0524561 +-0.0581897 0.157381 0.00697939 +-0.0588054 0.0825509 -0.0205914 +-0.0254269 0.0781373 0.050782 +-0.0176233 0.0450417 -0.02779 +-0.0345002 0.10287 0.040969 +0.0398172 0.0390737 0.00420564 +-0.0642915 0.169488 -0.0607786 +-0.0391909 0.150688 0.00279786 +-0.0817139 0.108721 -0.00159489 +-0.0691226 0.174646 -0.044619 +0.0542982 0.0579702 -0.00188368 +-0.0903603 0.143336 0.0142018 +-0.0554977 0.109766 0.0379077 +-0.0646073 0.15754 -0.0113176 +-0.0857257 0.0994313 0.000394941 +-0.0634657 0.0730594 0.0392535 +-0.0114926 0.0604332 0.0544994 +0.00136064 0.0481752 -0.0296995 +-0.0476605 0.124307 -0.00939578 +0.00152589 0.0731231 0.0568629 +0.0454513 0.0412382 0.0102351 +-0.0555526 0.124119 0.0389742 +0.0111749 0.035437 0.032711 +-0.0631468 0.156791 -0.0395997 +-0.0364943 0.115224 0.0327734 +-0.0687764 0.180487 -0.0583042 +-0.0558353 0.0912839 -0.0220329 +-0.0487756 0.0826651 -0.0212781 +0.0222353 0.0804964 -0.0261413 +-0.0698715 0.11424 0.0504282 +-0.0534972 0.0732542 0.0410474 +-0.0354707 0.0874527 0.0429689 +-0.0522647 0.117566 -0.0142997 +-0.0687471 0.158212 -0.0056007 +0.0254863 0.0578069 0.043747 +-0.0625026 0.0973365 0.0428841 +-0.00849427 0.0925522 0.0562249 +-0.076914 0.17371 -0.0479126 +0.0285085 0.121244 0.0144975 +-0.0649629 0.0620542 -0.00149187 +-0.0487919 0.135536 0.0203921 +-0.0406031 0.160882 0.00257136 +-0.0717214 0.0807275 -0.0154713 +-0.0759462 0.128163 -0.00785989 +0.0065117 0.129736 0.0249737 +-0.00106791 0.0391062 -0.00597311 +-0.0539473 0.03352 0.0103166 +0.0264479 0.103016 -0.017087 +0.0368588 0.0672041 -0.0137655 +-0.0209608 0.0380992 0.0183358 +-0.0922682 0.12272 0.00827864 +-0.0758891 0.119352 -0.00728174 +-0.0619808 0.0469192 0.00268857 +0.0286963 0.0991802 -0.016993 +0.0173223 0.125777 -0.00156033 +-0.071812 0.0879125 -0.0161091 +-0.0634945 0.102894 0.0414572 +-0.0534816 0.0491363 0.0336594 +-0.0677428 0.164471 -0.018256 +0.0418243 0.102828 0.00318021 +-0.0345003 0.0347932 0.0310568 +-0.0508009 0.0912872 -0.0218676 +0.0344847 0.0868408 -0.0179179 +0.0193386 0.0579734 -0.027391 +-0.0621388 0.0334692 0.00329381 +-0.017215 0.175671 -0.0245809 +-0.0538714 0.0449084 0.0167075 +0.0201621 0.124133 -0.00175315 +0.00612185 0.108732 -0.0201634 +0.0101112 0.110138 -0.0193681 +0.0407992 0.0698146 0.0307925 +-0.0186672 0.0495328 -0.0300927 +-0.0804551 0.134426 0.050865 +-0.0719585 0.0377493 0.00378419 +0.00950065 0.0688226 0.0549942 +0.0451024 0.091769 0.003186 +0.0116064 0.121838 0.0345253 +-0.07744 0.155698 0.0205089 +0.0154982 0.118174 0.0357451 +0.0455409 0.0918154 0.00916522 +-0.0825371 0.14737 0.037761 +0.00019241 0.0853625 -0.035651 +-0.0413557 0.0405762 -0.0252979 +-0.00795135 0.129264 0.0240771 +-0.00779714 0.0812765 -0.0379169 +0.0279176 0.0508447 -0.0187774 +-0.0851867 0.0791254 0.00650076 +-0.071556 0.161392 -0.00951947 +0.0302201 0.119789 0.0108648 +-0.0664004 0.120055 0.0514481 +-0.0652563 0.0459546 0.00568144 +-0.0484523 0.0349311 0.00836568 +0.050668 0.0451751 0.0191374 +0.0235092 0.118527 -0.00774096 +-0.0799897 0.135372 -0.00407226 +0.0454193 0.0875784 0.00318139 +0.0218862 0.107458 -0.0158341 +0.0519418 0.0525693 0.0274887 +-0.0174883 0.044685 0.0517611 +-0.0503006 0.134918 0.0263293 +-0.0797918 0.11331 -0.00252121 +0.0170867 0.039703 -0.0206999 +-0.00603107 0.130744 0.0146461 +-0.0614566 0.0372076 0.0201515 +-0.0634342 0.039353 0.0417984 +-0.0520389 0.0545474 0.0246248 +-0.0700192 0.172057 -0.036324 +0.0425828 0.0778099 0.0282065 +-0.0943409 0.12415 0.0172628 +-0.03739 0.165304 0.000185179 +0.0380556 0.0834519 0.0357476 +-0.0140374 0.0384483 0.0012996 +-0.0834291 0.14469 0.0401339 +-0.055347 0.0335038 0.00284205 +-0.0577441 0.0590406 0.000553128 +-0.0586534 0.154964 0.024223 +-0.0627416 0.148221 0.0374769 +-0.0597552 0.0781833 -0.0189903 +-0.0882134 0.141936 0.0111996 +0.0441966 0.0973694 0.0101636 +0.00324014 0.0740573 -0.0349749 +-0.0320743 0.0763998 -0.0305477 +0.0424682 0.0642865 0.0278791 +0.00647808 0.111357 0.041027 +0.0241747 0.0351145 0.0138772 +-0.0842625 0.100702 -0.00260902 +-0.0538049 0.0486373 0.0382673 +0.0033632 0.097467 -0.0272178 +-0.0526204 0.141613 0.022402 +0.0331357 0.0570437 -0.0137102 +0.00753436 0.104363 0.0436686 +-0.029494 0.0631194 0.0377814 +0.0357221 0.0994501 0.0342567 +0.0398205 0.0604422 -0.00479028 +-0.0134826 0.109991 0.0421694 +-0.0618817 0.161578 -0.0325898 +-0.00560304 0.0434101 -0.0260312 +-0.0274608 0.0473022 0.0495228 +-0.065855 0.0967089 -0.0173163 +-0.00276158 0.0698244 -0.0351738 +-0.00250067 0.110029 0.0428965 +0.0142116 0.123033 -0.00860213 +-0.0633963 0.145356 0.0382744 +-0.033621 0.0519746 -0.0102559 +0.0385319 0.0997972 -0.00779458 +0.0312326 0.118751 0.0098088 +-0.011143 0.128894 0.00267925 +-0.0574832 0.0833327 0.0441985 +-0.0668542 0.114225 0.0472279 +0.0369848 0.0561762 0.0322 +-0.0688663 0.102328 -0.014772 +-0.0246521 0.0478035 -0.0267776 +-0.0806498 0.110292 0.0422048 +-0.0475911 0.163428 -0.00670042 +-0.00358669 0.0376696 -0.025221 +-0.0499193 0.118992 -0.0138138 +-0.0766944 0.171427 -0.0358927 +0.0174979 0.126711 0.000451693 +-0.0107378 0.177152 -0.0244143 +0.0397983 0.0672171 0.0328832 +0.00289976 0.039936 0.0460731 +0.030847 0.0875798 0.0429743 +-0.0394926 0.102848 0.0402648 +0.00332264 0.0568618 -0.0316357 +-0.0367537 0.0783235 -0.0195335 +-0.038823 0.0928858 -0.0233898 +-0.0644838 0.0931562 0.0439721 +-0.0298466 0.0385336 -0.0167929 +-0.0548009 0.0449973 0.0226803 +0.0118375 0.0344099 -0.0160341 +-0.0683506 0.181259 -0.055895 +-0.0107728 0.0387832 -0.00390135 +-0.0300375 0.0890464 -0.0285748 +-0.0710857 0.168903 -0.0252489 +-0.0757782 0.149978 -0.0188682 +0.030839 0.0995119 0.0394948 +-0.0329249 0.0369927 0.0503412 +-0.0732448 0.144163 -0.0109449 +-0.0897565 0.140652 0.029182 +-0.0735905 0.154201 0.0306806 +0.00579855 0.0347845 0.042995 +-0.0519166 0.0545256 0.0236155 +-0.01212 0.102458 0.0438351 +-0.0211595 0.178661 -0.0149212 +-0.014608 0.0421127 -0.0270124 +-0.0885789 0.0922253 0.0228661 +-0.0145885 0.128899 0.00863716 +0.010498 0.0909888 0.0536897 +-0.0066489 0.0388823 -0.00316153 +-0.0258212 0.0839605 -0.0371412 +-0.0797525 0.15498 0.0124103 +-0.0414563 0.108465 0.0385585 +-0.0525315 0.149847 0.0192949 +-0.0156627 0.184575 -0.0209705 +0.0428837 0.0887839 -0.00581701 +0.0242564 0.0734016 -0.0257301 +0.0192994 0.062217 -0.0274738 +-0.0310269 0.122601 -0.0056394 +-0.0569847 0.153801 0.0277423 +-0.0526515 0.0504392 0.0286525 +0.00150192 0.0634213 0.0567922 +-0.0838556 0.139345 0.0449552 +-0.0476133 0.0562658 -0.0107838 +-0.0527007 0.0693372 -0.0141095 +-0.0311494 0.157393 -0.0113544 +0.00313658 0.0348497 0.0441849 +-0.0311581 0.17265 -0.0162683 +0.0453494 0.0847845 0.0201731 +0.0285114 0.0619268 0.0428923 +0.000499004 0.0634057 0.0567297 +0.00751117 0.0575089 0.0530994 +-0.000499443 0.114191 0.0415203 +-0.0794921 0.146102 0.0417961 +-0.0252738 0.0381933 0.0263814 +-0.0376796 0.16681 0.00156763 +0.0387661 0.0870401 -0.0137857 +0.0296088 0.12015 0.0163431 +-0.0938694 0.121489 0.0252875 +-0.0396002 0.125498 -0.0067103 +0.0370837 0.103994 -0.00683208 +-0.0465559 0.0461276 -0.0102455 +0.0404351 0.0389029 0.0137659 +-0.0424925 0.100104 0.042001 +-0.0285717 0.12063 0.0270994 +-0.0800863 0.148726 0.0380799 +0.00214563 0.119376 -0.0145717 +-0.0288792 0.104408 -0.0227314 +-0.0312735 0.034639 0.0229335 +-0.0669165 0.12238 -0.00897156 +-0.0890273 0.0956446 0.021399 +-0.0897683 0.091592 0.0154417 +-0.0739499 0.156872 -0.0269145 +0.00919729 0.039194 0.0451612 +-0.0374937 0.109757 0.0368609 +0.0523694 0.0545712 -0.00274385 +-0.0339801 0.0348087 0.0434578 +-0.00541562 0.128879 0.0264449 +-0.0636022 0.151642 0.0357576 +-0.0693902 0.0672718 0.0289371 +-0.0220481 0.121595 -0.00868192 +-0.0390536 0.127857 0.00108873 +-0.090122 0.144414 0.0285066 +-0.0629168 0.114269 -0.0126902 +-0.0930993 0.129616 0.0162363 +-0.0325132 0.0575193 0.0378292 +-0.0193156 0.162502 -0.00702982 +0.00550789 0.0910775 0.054811 +-0.0234801 0.168298 -0.011313 +0.0473422 0.0575607 -0.00551801 +0.0214637 0.0989203 0.04607 +-0.0827604 0.106087 -0.00164696 +-7.52397e-05 0.037877 0.020989 +-0.0345343 0.126083 0.0189612 +-0.0512338 0.164096 -0.00192926 +-0.0477776 0.0826677 -0.0211258 +-0.0368214 0.16531 -0.000729186 +-0.0673944 0.162815 -0.015253 +-0.0186701 0.0971551 0.0477534 +-0.0366241 0.0360289 0.0452882 +-0.0195815 0.0341867 -0.0200865 +0.0298019 0.0862025 0.0431971 +-0.0932655 0.120203 0.038289 +-0.000505415 0.110024 0.0426421 +-0.0191383 0.16678 -0.0189611 +0.0173062 0.0421724 0.0440438 +0.0105403 0.105742 0.0436489 +-0.0345641 0.11594 -0.0146748 +-0.0944618 0.125537 0.019259 +-0.0679091 0.108046 -0.0128123 +0.0268137 0.118694 -0.00391821 +-0.0577288 0.0738232 -0.0175832 +-0.0494959 0.0988033 0.0435442 +0.0425948 0.0873487 -0.0068057 +-0.0366079 0.114094 -0.0167422 +-0.0064886 0.118022 -0.0150746 +-0.0694599 0.155751 0.00874428 +-0.0727804 0.0887809 0.0411113 +-0.0921325 0.117269 0.0252198 +-0.0769942 0.154149 -0.012901 +0.00413641 0.0979047 -0.0256761 +-0.0504737 0.113932 0.0347324 +-0.00655213 0.0389811 -0.00882376 +-0.021105 0.0431099 0.0534593 +-0.0732611 0.161033 -0.0359392 +-0.0668535 0.0938084 -0.0173106 +0.0523234 0.0724358 0.00729932 +-0.02575 0.0536249 0.0391706 +-0.0529014 0.114056 -0.0162353 +-0.0887923 0.1378 0.0112057 +-0.0604332 0.0585193 0.0100455 +-0.0105014 0.0546468 0.0522278 +0.0475389 0.0482604 0.0280949 +0.00247406 0.123881 0.0337357 +0.0282809 0.0389301 0.0276504 +-0.0903128 0.141958 0.0142327 +-0.0457178 0.0724199 -0.0170809 +-0.0393802 0.149525 0.00137589 +-0.0384762 0.128323 0.0101316 +-0.0387951 0.0343342 0.0305488 +-0.0627886 0.154765 0.0285735 +-0.044804 0.0884409 -0.0220028 +0.00621048 0.0851628 -0.0331463 +-0.0124997 0.0938947 0.0551641 +-0.0760018 0.163203 -0.0170986 +-0.0568081 0.154369 0.0248865 +0.0141304 0.056278 0.0501629 +-0.000201542 0.0357861 0.0174114 +-0.0687337 0.0764635 -0.0155195 +-0.0465141 0.0518831 0.0377757 +0.0306859 0.0377485 0.0237503 +-0.0887758 0.149859 0.0255696 +-0.0468066 0.088437 -0.0220186 +-0.0104567 0.111397 0.0420636 +0.00949238 0.0487693 0.0494463 +-0.0344171 0.0343826 0.0278837 +-0.0747225 0.161031 -0.0319529 +-0.00127097 0.123959 0.0338052 +0.0484686 0.0511467 0.0294828 +0.0216142 0.042218 0.0415059 +0.0159587 0.0874032 0.0512942 +-0.0579584 0.0336225 0.00939861 +0.0262865 0.0689766 -0.0234385 +-0.0457839 0.11676 -0.0154906 +-0.0431023 0.149502 -0.00451393 +0.0575358 0.0592738 0.00218909 +-0.0907151 0.116093 0.0293225 +-0.0626986 0.0658458 -0.00782349 +-0.0680529 0.0874243 0.0435129 +-0.0323521 0.0336874 -0.0296376 +-0.0208013 0.108893 -0.0213287 +0.00800637 0.0345135 0.0400968 +0.0600686 0.0650603 0.0191749 +-0.0881094 0.0861284 0.0104766 +-0.0292466 0.166794 -0.00735295 +-0.0455037 0.159315 0.00726546 +-0.0361152 0.127822 0.0095198 +-0.00430156 0.130062 0.00233767 +-0.032509 0.0506603 0.0384213 +-0.0316129 0.119551 -0.0104429 +0.0414143 0.104258 0.0111621 +-0.075527 0.0733333 0.0311756 +-0.0549715 0.161246 0.00205939 +-0.0503915 0.140104 0.0183826 +0.0152276 0.0835585 -0.0295949 +-0.0464862 0.0718998 0.0415251 +-0.00551998 0.0732424 0.0584734 +-0.0900165 0.133639 0.00622839 +-0.069719 0.0887582 0.0422978 +0.00474777 0.0367585 0.0247919 +-0.027126 0.165248 -0.0165316 +-0.0283135 0.0350192 0.0513697 +-0.0318897 0.0721821 -0.0275085 +0.0437433 0.0945326 0.0221692 +-0.0126802 0.0961728 -0.031918 +-0.0567215 0.04662 0.0276747 +-0.00532834 0.0367049 -0.0158504 +-0.0529595 0.0335568 -0.000338033 +-0.0240311 0.112816 -0.0174462 +0.01097 0.0520216 0.0508135 +-0.0328411 0.0915526 -0.0242438 +-0.0552728 0.0335199 0.0136226 +-0.0820994 0.104661 -0.00359906 +0.035799 0.0558975 -0.00871505 +-0.0868952 0.0991223 0.0252196 +-0.0296012 0.120713 0.0267425 +-0.0695324 0.125657 0.0522171 +-0.0424937 0.0790081 0.0428161 +-0.0632658 0.0419596 0.040132 +-0.0699149 0.161541 -0.0103834 +-0.0345105 0.0676457 0.041143 +-0.00514301 0.0997589 0.0492461 +-0.0697588 0.147131 -0.0275571 +0.0580762 0.0648724 0.00314588 +0.0241035 0.1245 0.0085821 +0.0377445 0.110141 0.00501649 +0.0413546 0.0999884 -0.00181466 +0.0180964 0.0604579 0.0488964 +-0.0341434 0.0780256 -0.025502 +0.0365014 0.0756142 -0.0127863 +0.0485013 0.0651587 0.0285278 +-0.0331365 0.162399 -0.0024379 +-0.0578171 0.08688 -0.0211007 +-0.0591308 0.125513 0.0408421 +-0.0248084 0.0826031 -0.0377611 +-0.00847175 0.0920515 -0.0356471 +-0.0281451 0.166722 -0.0170726 +0.0321478 0.0740867 0.0412125 +-0.0318598 0.0496767 -0.0173511 +-0.0683644 0.0381281 -0.00463362 +-0.0293612 0.0383343 -0.00169706 +-0.0546971 0.0334232 0.00665025 +-0.0604511 0.0584329 0.0155226 +0.0356702 0.108162 -0.00482135 +-0.087994 0.0981671 0.00544953 +0.042672 0.0737568 0.0282004 +-0.0414969 0.095865 0.0421344 +0.0227593 0.0727654 0.0487302 +0.0247922 0.121532 -0.00113746 +0.0282353 0.0775351 -0.0225519 +-0.0487687 0.0559317 0.0351683 +-0.0192566 0.180095 -0.0235875 +-0.0250606 0.0603159 -0.031412 +-0.0310964 0.160762 -0.0139612 +0.0143682 0.0767494 0.0542274 +-0.0714649 0.159596 -0.0419316 +0.0454023 0.0875829 0.0161653 +-0.0354973 0.0470472 -0.0223112 +-0.0465703 0.0490167 -0.00974944 +0.025334 0.0435501 0.0381106 +-0.0785372 0.168054 -0.0329755 +-0.0148858 0.0985034 0.047376 +-0.0302927 0.117007 -0.0138211 +-0.0802651 0.0963563 -0.00854135 +-0.030624 0.0348272 -0.0303515 +-0.000406928 0.0996624 0.04942 +-0.0576871 0.0335309 0.00594357 +-0.0923088 0.114683 0.0143254 +0.00732004 0.0351406 -0.00439972 +-0.00948171 0.174183 -0.0285537 +-0.0320503 0.12646 0.00953655 +0.0270529 0.0822264 0.0462092 +-0.0900419 0.139254 0.023178 +-0.0498185 0.0927102 -0.0215416 +-0.00751389 0.102333 0.0437439 +-0.0775302 0.161724 -0.0197184 +-0.044496 0.0451943 0.0419603 +-0.0362032 0.160944 0.000172036 +-0.0314741 0.053189 0.0369367 +-0.072385 0.158213 -0.0369175 +-0.0860963 0.145967 0.0357039 +-0.0554937 0.100184 0.0430705 +-0.0523102 0.116406 -0.0150785 +-0.0518166 0.09273 -0.0219218 +-0.024907 0.0916549 -0.0335476 +-0.0634479 0.141036 0.0381413 +0.0152366 0.121915 0.0327966 +-0.0631227 0.0445391 0.0377156 +-0.0865336 0.141884 0.00820248 +0.00748358 0.11412 0.0398951 +-0.071965 0.136965 -0.0074383 +-0.0608999 0.058839 0.0168686 +-0.0886398 0.102364 0.0173768 +-0.0688031 0.0659098 0.026726 +0.02824 0.0686155 0.0425458 +-0.0196877 0.127428 0.0169554 +0.0332508 0.0906175 -0.0178979 +0.019654 0.122236 -0.00577023 +-0.0457281 0.151677 -0.00565337 +-0.0685681 0.156629 -0.0529972 +0.0455148 0.0801982 0.0216904 +0.0232513 0.0734458 -0.026356 +-0.0856264 0.110331 0.00634317 +0.032415 0.0383305 -0.000488607 +-0.0697489 0.17084 -0.0530327 +0.0127518 0.0887452 0.0537008 +-0.0650469 0.168333 -0.0359323 +-0.0312058 0.066507 -0.0244549 +-0.0481456 0.14427 0.00342034 +-0.0250932 0.0385898 -0.0121739 +-0.0268796 0.181867 -0.0133655 +-0.0624905 0.0804598 0.0431805 +-0.0664501 0.0353918 0.0342807 +-0.0287674 0.078167 -0.0351681 +0.0384815 0.0729589 -0.0117402 +-0.0325668 0.0347124 0.0262002 +0.0258782 0.0645831 0.0443789 +-0.0486546 0.0620591 -0.0122264 +-0.086684 0.149909 0.029141 +0.0138472 0.123867 0.0319554 +-0.0513866 0.0584422 0.0306256 +-0.00251219 0.0378133 0.00785027 +-0.00926128 0.126278 0.029483 +0.0147315 0.0347337 -0.0176578 +0.0417187 0.066227 -0.00378154 +-0.0149615 0.0883672 -0.0380383 +-0.0678931 0.0900993 0.043242 +0.0149683 0.113515 -0.0163113 +-0.0719356 0.110274 0.042413 +-0.0333618 0.0751438 -0.0264858 +0.0116984 0.034577 0.0227351 +-0.0670519 0.166375 -0.0237602 +-0.0454276 0.0345386 0.0307405 +-0.00249621 0.0883993 0.0567366 +-0.0235661 0.115415 0.0353667 +-0.0944357 0.121484 0.0222838 +0.0334736 0.0940135 -0.0155006 +-0.0436018 0.0519969 -0.0109067 +-0.0781065 0.0948585 -0.0115273 +0.0456581 0.0729488 0.0206934 +-0.0274951 0.157765 -0.0111917 +-0.00306441 0.100922 0.0454807 +-0.0618021 0.116863 0.0404147 +-0.0344937 0.041903 -0.0294247 +-0.0427476 0.159417 0.00474491 +0.0374917 0.0484328 0.0317174 +-0.00814387 0.0339061 -0.0213361 +-0.0737927 0.132633 0.0513524 +-0.0397231 0.116184 -0.0149076 +-0.00950395 0.0773592 0.0576807 +-0.0505908 0.03436 0.0298011 +0.0187381 0.119283 0.0342968 +0.00523462 0.075444 -0.0346019 +-0.0321194 0.165225 -0.0156285 +-0.0276791 0.1239 0.019992 +0.0190254 0.061825 0.0484929 +-0.0821717 0.11152 0.00033013 +0.0241621 0.0505303 0.0399762 +0.0378012 0.0604211 0.0334272 +-0.0182252 0.159192 -0.00975232 +0.0423754 0.100105 0.0181719 +-0.0546942 0.0661242 -0.0103565 +-0.0685912 0.131247 0.0482807 +0.000498438 0.0938703 0.0551155 +-0.0281544 0.168213 -0.0175818 +-0.0417796 0.0485307 -0.0113147 +0.0287445 0.109341 -0.0118595 +-0.00260812 0.130913 0.0187596 +-0.0454889 0.0660999 0.0395126 +-0.0655106 0.0972881 0.0421527 +-0.0194848 0.0869694 0.0563134 +-0.0264967 0.121204 -0.00819998 +0.00829502 0.0653838 -0.032076 +-0.0287456 0.0753309 -0.0348961 +-0.0727338 0.0821447 -0.0156124 +-0.0470607 0.146242 0.00718592 +-0.0209665 0.0386858 -0.0114366 +-0.0600079 0.128191 -0.00754937 +-0.0653109 0.180421 -0.0593142 +-0.0559148 0.0548054 0.00768529 +-0.0524976 0.0917711 0.0441581 +0.0212182 0.0847586 -0.026404 +-0.0579878 0.0414274 -0.0083271 +-0.0726954 0.0791971 -0.0139413 +-0.0307256 0.0915724 -0.0247467 +-0.0556334 0.11822 -0.0129265 +-0.0457806 0.0841121 -0.0213757 +0.00438413 0.0465246 -0.0275852 +-0.010477 0.110005 0.0426237 +-0.0896333 0.0929554 0.018431 +0.0397783 0.106996 0.0151622 +-0.0127593 0.0728576 -0.0383837 +0.0319543 0.0766492 -0.0197037 +0.00131984 0.0612266 -0.0334746 +-0.0834451 0.136657 0.0474496 +-0.0558128 0.0869147 -0.0214989 +0.00250708 0.0474439 0.0499052 +0.0125018 0.115423 0.0374065 +-0.00563766 0.13083 0.0104776 +-0.0658527 0.144237 -0.0148815 +-0.089646 0.0929438 0.0164332 +0.0436072 0.041137 0.00426675 +0.0444767 0.0889055 -0.00179899 +-0.057137 0.0562876 0.0015684 +0.00522768 0.0810328 -0.0339223 +-0.0137183 0.0628763 -0.0368336 +0.00133514 0.0554198 -0.0315391 +-0.0188851 0.0334951 -0.0249427 +0.052927 0.0495927 0.0235839 +0.0522184 0.0461787 0.0182078 +0.0165976 0.0348504 0.0271124 +-0.0589342 0.12267 0.0410891 +-0.0669714 0.163891 -0.0179699 +-0.0703202 0.132668 0.0493213 +-0.0776493 0.0787462 -0.00818258 +-0.0881736 0.132451 0.0437642 +-0.0632228 0.141176 -0.0069873 +-0.0713401 0.171022 -0.0310853 +-0.047409 0.166836 0.00227952 +-0.0141433 0.181604 -0.0223083 +-0.0619045 0.104018 -0.0180451 +-0.0483068 0.13712 0.0113971 +0.0136813 0.0952834 0.0497668 +0.035272 0.0660164 0.0386352 +0.0461881 0.0785676 0.017326 +-0.0532105 0.0335853 0.013987 +-0.0171786 0.0971676 0.04907 +-0.0725346 0.145512 -0.0179133 +-0.0333802 0.0498304 -0.01435 +0.0509184 0.0496314 0.0259504 +-0.0572784 0.0576838 0.00160501 +-0.0619689 0.153737 -0.0245819 +-0.0544985 0.104295 0.0412117 +-0.0500704 0.137041 0.0213927 +-0.0191411 0.0697535 0.053261 +0.0582061 0.0634965 0.00313887 +-0.0204853 0.0800483 0.0563065 +-0.0472097 0.0335059 -0.0119372 +-0.0749299 0.155492 -0.0209193 +-0.0698715 0.116492 -0.00825865 +0.0375436 0.055493 0.03143 +-0.0538462 0.137744 -0.0016929 +-0.0607335 0.034496 0.0414254 +0.0295159 0.107768 -0.0121736 +-0.0689178 0.168027 -0.0530164 +-0.0779935 0.171503 -0.0379488 +-0.0881443 0.0887489 0.00447233 +-0.00442605 0.128738 0.0268092 +0.00451348 0.0633892 0.056472 +-0.0818952 0.134036 0.0502533 +-0.0372574 0.124492 0.0238955 +0.0138426 0.11139 -0.0180298 +-0.0818741 0.119187 -0.00382424 +-0.0756587 0.0744591 -0.00795246 +-0.026115 0.158145 -0.00104516 +0.037495 0.0513025 0.031739 +0.0589255 0.0580383 0.0211692 +0.0434376 0.0874432 0.0261531 +-0.0260776 0.125932 0.00880255 +-0.0740662 0.155757 0.0246008 +-0.0178239 0.0387614 0.0327968 +0.0417114 0.091515 -0.00780409 +-0.0241449 0.0905492 0.0505682 +-0.074497 0.124608 0.0532356 +-0.0458334 0.0927472 -0.0217986 +-0.0804383 0.111326 0.0449881 +-0.00529252 0.125273 -0.00885488 +-0.0889223 0.0888194 0.00846703 +-0.00624295 0.130196 0.00449841 +-0.0669483 0.0447271 0.0026821 +-0.0548497 0.0941617 -0.0218342 +-0.0534962 0.0931826 0.0441514 +-0.0347147 0.0696617 -0.0176192 +-0.0440132 0.0366004 -0.0242792 +-0.0474979 0.0464882 0.040801 +-0.0653409 0.0600919 0.00943789 +-0.0231718 0.171204 -0.0201308 +-0.00587295 0.130011 0.00319127 +-0.0664676 0.0383698 -0.00648508 +-0.0886456 0.0935942 0.0229142 +-0.0447618 0.116708 -0.0154556 +0.0194756 0.100345 0.0462123 +-0.0154951 0.0911415 0.0560918 +-0.0371641 0.0342638 0.0291868 +0.0162971 0.0651874 -0.0294171 +-0.0291548 0.169699 -0.0175574 +-0.0704877 0.0623972 0.0153213 +-0.0774944 0.092744 0.0372295 +-0.00984328 0.0975178 -0.0293224 +-0.0784995 0.162482 -0.0259435 +-0.0145068 0.0730096 0.0554058 +0.0203473 0.0727595 0.0505294 +-0.0616196 0.156864 -0.0215888 +-0.0832232 0.0789707 0.00151853 +0.0163786 0.0403059 -0.0216745 +0.000325641 0.0568761 -0.0321896 +-0.0192766 0.0554309 0.0481999 +-0.00592104 0.0389465 -0.0049376 +-0.0499986 0.143197 0.012378 +-0.0355049 0.076131 0.0419036 +0.053394 0.0525543 0.0260735 +0.00630024 0.125509 0.0321214 +-0.0349082 0.033686 0.00682403 +-0.0714928 0.117552 0.0529474 +-0.0589919 0.15382 0.0299308 +0.0585035 0.0621132 0.0229868 +0.00569406 0.0341002 0.00181761 +-0.0155184 0.118264 0.0365807 +-0.0424989 0.16674 0.00381643 +-0.0863225 0.128011 -0.00168174 +-0.0553953 0.118382 0.0373919 +0.0469197 0.0444607 0.00136465 +-0.056091 0.0334157 -0.00629765 +-0.0361548 0.166687 -0.0142688 +-0.0127937 0.0386426 -0.0153707 +-0.0118501 0.11995 -0.013068 +-0.00670797 0.0627873 -0.0354975 +-0.079327 0.169353 -0.0390258 +-0.0437872 0.0855322 -0.0215732 +-0.0280896 0.0549613 -0.0243859 +-0.0584052 0.033525 -0.00869675 +-0.0482395 0.144672 0.00644062 +-0.0554929 0.0932384 0.0449182 +-0.0347045 0.0851136 -0.0245778 +-0.0494996 0.0791204 0.0440794 +0.0372047 0.0385834 0.00228863 +0.0193241 0.0607694 -0.0271316 +0.00852018 0.0702413 0.0555324 +-0.0778099 0.148638 -0.00388521 +-0.06539 0.178765 -0.0548301 +-0.04996 0.133052 -0.000571002 +-0.0847199 0.0939171 -0.00356265 +-0.0326229 0.0385148 -0.00990233 +0.032773 0.036599 0.0179277 +0.0427869 0.0611675 -0.0033403 +-0.0366336 0.0548529 -0.010755 +-0.0870489 0.0900041 0.00248653 +0.0416085 0.0656213 0.0284032 +0.00293844 0.100629 -0.0225769 +-0.0728162 0.0907583 -0.0154663 +-0.0718707 0.116473 -0.00776413 +-0.0937263 0.121427 0.0132848 +0.00471758 0.0346554 0.0428856 +-0.0704897 0.0719829 -0.0097429 +-0.050201 0.0344166 0.0315946 +-0.0796522 0.0704439 0.0152371 +-0.0425023 0.0986936 0.0421906 +0.0383887 0.0445417 -0.00444706 +0.0311086 0.103751 -0.0138751 +-0.0667119 0.155932 -0.00484005 +-0.0912006 0.121567 0.0443209 +-0.019019 0.0418114 0.0529435 +-0.0892823 0.141954 0.0132429 +-0.0221125 0.0389367 0.0353489 +-0.0563218 0.0335364 0.00802021 +-0.0896372 0.0929496 0.0174335 +0.0130767 0.125591 0.0302496 +0.0537776 0.0692651 0.00258827 +0.0106605 0.0363802 0.031763 +-0.0297187 0.0523119 -0.0193651 +-0.0140732 0.0383739 0.00681638 +0.0269054 0.0726895 0.0441444 +0.0246103 0.075474 0.0479027 +-0.00359864 0.0405713 -0.0254999 +0.0269298 0.0804165 -0.0233375 +-0.0488158 0.0912881 -0.0217052 +-0.00415439 0.0390536 -0.00654274 +0.000507304 0.0828912 0.0574668 +-0.0158173 0.038248 0.0138275 +-0.0624172 0.0599054 0.00479638 +0.0162074 0.0821136 -0.0291532 +-0.0419982 0.0337727 -0.000124238 +0.0250957 0.0348061 0.00319961 +-0.0309108 0.0608665 -0.0194213 +-0.0387236 0.174145 -0.00898261 +0.0464355 0.0778581 0.0101835 +-0.0639936 0.132595 -0.00811291 +-0.0340062 0.0381682 0.049242 +-0.0477004 0.131837 0.0244001 +-0.00268932 0.130846 0.00581897 +0.0302059 0.0857499 -0.020278 +0.0384903 0.0499056 0.0320993 +0.010384 0.0463357 -0.0254801 +-0.00660048 0.0405957 -0.0258634 +-0.0114989 0.0366056 -0.0169842 +0.0105059 0.0348976 0.020389 +-0.0487973 0.070279 0.0395574 +-0.0394971 0.057712 0.040203 +-0.0253679 0.125634 0.0163937 +0.0361389 0.0902387 0.0383091 +-0.0654905 0.0889779 0.0446185 +-0.0197462 0.0656505 -0.036857 +0.0320676 0.117774 0.0158308 +0.00351414 0.0661565 0.0562774 +-0.0226137 0.0422636 -0.0288734 +-0.019191 0.123923 -0.00519119 +-0.0532423 0.046246 0.0226735 +-0.021638 0.0464604 -0.0276852 +0.0272834 0.0689403 -0.022937 +0.0211914 0.124678 0.000362022 +0.04653 0.0760573 0.0105389 +-0.0338201 0.127158 0.00888963 +-0.077651 0.154407 0.00585132 +-0.0417202 0.0710768 -0.017536 +-0.0887218 0.0874968 0.0134639 +0.0165095 0.0354073 -0.0166384 +-0.0454406 0.0336534 -0.00804117 +-0.0504088 0.153575 0.0112235 +-0.0286428 0.107004 -0.0213195 +-0.0218765 0.0933131 0.0510401 +0.0329715 0.116865 0.0119087 +-0.0914625 0.148845 0.019136 +-0.0596259 0.155781 0.0151651 +0.0375784 0.099381 0.0316743 +-0.0157845 0.0784788 -0.0385671 +-0.0795217 0.123111 0.0512585 +-0.0418108 0.0343847 0.029868 +0.0389991 0.108356 0.0151637 +-0.0709225 0.109376 -0.0106672 +0.0579353 0.0634887 0.0239229 +-0.058577 0.0727277 0.0406017 +-0.062479 0.152546 0.000181648 +-0.0544934 0.0834141 0.0452404 +0.0357112 0.102065 0.0324889 +-0.0715263 0.0944187 0.0416527 +-0.0651404 0.112408 0.0390225 +-0.0545541 0.160714 0.00540511 +-0.0144079 0.183333 -0.0275579 +-0.0621531 0.152198 -0.0185797 +-0.0657166 0.14722 -0.0249021 +-0.0460756 0.154674 -0.00723534 +0.01519 0.127729 0.000331934 +-0.0489579 0.137072 0.00640402 +-0.0485683 0.0335187 -0.00854361 +-0.0885037 0.114225 0.0283481 +-0.0540375 0.141288 -0.0013423 +-0.0472373 0.134368 0.0171539 +-0.0272298 0.037736 0.022792 +-0.0518585 0.0985114 -0.0220738 +-0.0110867 0.180248 -0.025982 +-0.0236236 0.0593674 0.0425181 +-0.0408247 0.092859 -0.0231395 +0.0561988 0.0567015 0.0248562 +-0.0086058 0.172644 -0.0268228 +0.0163504 0.0552051 -0.0284322 +-0.0344945 0.0336038 -0.0243554 +-0.0556539 0.0345276 0.0424927 +-0.0348371 0.155104 0.00211833 +0.0276605 0.0605608 0.0434107 +-0.0623508 0.146001 -0.00658982 +-0.0248115 0.081196 -0.037776 +0.0240847 0.110594 -0.013209 +-0.0895075 0.148492 0.0263454 +-0.0926235 0.124077 0.00926903 +0.0292051 0.0843756 -0.0209031 +-0.0353048 0.127501 0.00687019 +-0.0859011 0.134922 0.00126737 +-0.0742444 0.0756609 0.0347079 +-0.0752605 0.157705 -0.0064221 +-0.0337955 0.0808164 -0.0255276 +-0.0288635 0.154571 -0.00355817 +0.0360371 0.0547702 0.0325687 +-0.0101249 0.0392126 0.0357767 +0.0288986 0.120838 0.016073 +-0.0106831 0.0570151 -0.0340192 +-0.0628045 0.144114 -0.00718004 +-0.0895701 0.151478 0.0161361 +-0.0176156 0.0385615 0.0294218 +-0.0211148 0.0389017 0.0355855 +0.0329392 0.0541774 -0.0107445 +-0.00428899 0.0367463 -0.0156853 +-0.0458368 0.0956376 -0.0219211 +0.0381262 0.080772 0.035847 +0.0268148 0.0976356 -0.019356 +-0.0625367 0.161521 -0.0446005 +-0.0517979 0.0869425 -0.0216307 +0.0344672 0.111064 -0.00366583 +-0.0911264 0.115738 0.024682 +-0.0753098 0.0805155 0.0368289 +-0.0133248 0.129244 0.00909724 +-0.0272428 0.0370384 -0.018628 +-0.0384762 0.0423266 0.0418914 +0.0203738 0.0521374 -0.0257342 +0.0585485 0.0552063 0.00817117 +0.0134367 0.121611 -0.0110511 +-0.089438 0.113514 0.0412091 +0.0444691 0.0790854 -0.00178456 +-0.000786355 0.0797462 -0.0360298 +-0.0269011 0.155694 -0.0071882 +-0.08839 0.0995952 0.00742201 +-0.0662162 0.0396687 0.0135434 +-0.0355277 0.0846755 0.0433772 +-0.0858238 0.104979 0.0223569 +-0.0778773 0.120773 -0.00663343 +-0.0263675 0.107348 -0.0216948 +-0.0927086 0.12286 0.0332776 +-0.0661966 0.15171 0.0363078 +-0.0202018 0.177138 -0.0227808 +-0.0855834 0.141979 0.0409477 +-0.0504886 0.0946205 0.0445363 +-0.0604928 0.101522 0.0423039 +0.0379519 0.0659398 0.0354557 +-0.0840048 0.140674 0.0436515 +-0.0558989 0.109796 -0.0177742 +0.00991096 0.0343624 0.00242681 +-0.0506409 0.0514954 0.0146147 +-0.0324809 0.117911 -0.0127388 +-0.0621631 0.164652 -0.0535815 +0.0025214 0.130289 0.0235241 +-0.0506513 0.150706 0.0125676 +-0.0175006 0.0829087 0.0576844 +-0.00809599 0.0347439 0.04196 +-0.0340295 0.0384544 -0.00643688 +-0.0694928 0.101384 0.0400561 +0.0446992 0.0776181 0.0241159 +-0.0935142 0.126862 0.0142561 +0.0248702 0.121138 0.0274186 +0.00114443 0.118463 -0.015597 +-0.053795 0.115431 0.0343764 +-0.0905823 0.131055 0.0352302 +-0.00177837 0.0811944 -0.0365591 +0.0316669 0.110076 0.0318865 +0.0355137 0.0902592 0.0391607 +-0.0911524 0.122908 0.0442317 +-0.0909787 0.118866 0.0441649 +-0.0647368 0.0350417 0.0261211 +-0.0694997 0.166373 -0.0203616 +-0.0256221 0.0450194 -0.0280788 +-0.0652445 0.171051 -0.0600934 +-0.0773393 0.152802 -0.0018868 +-0.00223434 0.118045 -0.0151238 +-0.0662482 0.063188 0.0243484 +0.0400602 0.0922366 -0.00959201 +-0.00562712 0.0451708 -0.0285409 +0.000501495 0.0457296 0.0472541 +-0.0123701 0.125297 0.0298351 +-0.0778681 0.101964 -0.00928868 +-0.0609537 0.123826 -0.00859412 +0.0224677 0.112582 -0.013341 +0.00921575 0.0781468 -0.0329463 +-0.0349236 0.126603 0.0011375 +-0.00878487 0.0784493 -0.0377777 +0.00650569 0.075888 0.056486 +0.0412418 0.0802411 -0.00774788 +-0.093262 0.128309 0.02526 +-0.0314363 0.171254 -0.00518552 +-0.0520579 0.0336325 0.0248414 +-0.0815026 0.127419 0.0524098 +-0.0894637 0.136534 0.031204 +-0.084288 0.111698 0.0438155 +0.0333653 0.0918289 -0.0171871 +-0.0324333 0.126109 0.00355422 +-0.00141447 0.0391026 0.0304627 +0.00110904 0.0340429 -0.0196452 +-0.0650297 0.138462 -0.00769967 +-0.015954 0.105864 -0.0221228 +-0.0523859 0.0626167 0.0314055 +0.026783 0.122575 0.00815739 +-0.0385209 0.128019 0.0130694 +-0.029395 0.125597 0.00758806 +-0.0328882 0.0666632 -0.0184721 +-0.0494036 0.13704 0.0193807 +-0.0782331 0.109897 -0.00456592 +0.0157741 0.036715 -0.0196413 +-0.0294956 0.0660091 0.0384906 +-0.0679029 0.105215 -0.0140793 +-0.0620463 0.158428 -0.0205873 +-0.0703503 0.159267 -0.00619145 +-0.0378682 0.104226 -0.0203027 +-0.0918252 0.118761 0.028299 +-0.0411447 0.163664 -0.0114686 +-0.0574975 0.0426993 0.0453715 +-0.0747471 0.147201 -0.0128585 +-0.0134963 0.0744967 0.0564394 +-0.054142 0.0722337 0.0402304 +-0.0642908 0.169609 -0.0607929 +-0.0154978 0.0977476 0.0489325 +-0.0800099 0.07203 0.0185532 +-0.0921132 0.115989 0.0103178 +0.00725505 0.0754138 -0.0341479 +0.0536301 0.0568087 0.0282148 +-0.0479854 0.0346149 0.0371396 +-0.00149257 0.0746611 0.0586297 +0.0203189 0.05934 -0.026848 +-0.0115998 0.0391898 -0.02633 +-0.0295596 0.0663471 -0.0284716 +0.00348965 0.105764 0.0424132 +-0.0703543 0.0703917 0.033048 +-0.0606347 0.0629111 -0.00512698 +-0.01408 0.166026 -0.0199736 +-0.061044 0.0400333 0.0227114 +-0.0810735 0.143155 -0.000828212 +-0.0617474 0.0766736 -0.0179709 +0.0217467 0.124535 0.0248197 +0.00507814 0.101571 -0.0215886 +0.0346034 0.0592134 0.0376264 +-0.0712039 0.0342165 0.00436442 +-0.0288195 0.0384506 0.0326078 +-0.053518 0.1534 0.0145047 +-0.0556759 0.0661408 -0.010195 +-0.0677895 0.175109 -0.0580246 +-0.0699291 0.0421822 0.0072491 +-0.0067422 0.0741543 -0.0369448 +0.0199779 0.0885978 -0.0258535 +-0.0488263 0.0941792 -0.0218889 +0.0343607 0.0505331 -0.00657713 +-0.0725404 0.162229 -0.0113532 +-0.00793663 0.0384098 0.0134736 +-0.0556415 0.043673 0.0216881 +-0.0145298 0.100345 0.0444168 +-0.0815281 0.1484 0.0374104 +-0.0387388 0.0753845 -0.0180569 +-0.0116442 0.0481633 -0.0303354 +0.0363562 0.0559126 -0.00774494 +-0.0652193 0.1682 -0.0598394 +-0.0776736 0.10169 -0.00957801 +-0.0196644 0.0494984 -0.0297043 +-0.0282432 0.0763981 0.0437868 +-0.0328471 0.033696 0.0126517 +0.00347146 0.128699 -0.00262952 +0.0461484 0.0806375 0.015174 +0.0337656 0.111689 0.027893 +-0.0271752 0.172675 -0.0185845 +-0.0693701 0.141497 -0.00893397 +0.0317719 0.115994 -0.000976469 +0.0347163 0.0544411 -0.00865089 +-0.0651886 0.172101 -0.0460875 +-0.0678768 0.1616 -0.0125361 +-0.0634522 0.0423282 0.0135276 +0.0601313 0.0581272 0.0101639 +-0.0107388 0.117999 -0.0150205 +0.0339646 0.0916099 0.0404552 +-0.0498374 0.138571 0.0183794 +-0.0934962 0.117401 0.0173034 +0.0383972 0.0491164 -0.00642484 +-0.0280195 0.0378733 -0.0295429 +-0.0146147 0.12166 -0.00880985 +0.0372641 0.0686531 0.0362559 +0.0239959 0.0549509 0.0433236 +0.00994394 0.0362916 0.0335003 +-0.0208017 0.0799082 -0.0390716 +0.0233991 0.0534151 -0.0239637 +0.00722024 0.0851796 -0.0327872 +-0.0639758 0.128226 -0.00858393 +0.0238189 0.124864 0.00990899 +0.00150975 0.0474485 0.049901 +-0.0361905 0.168183 -0.0140562 +-0.0174884 0.0801344 0.0573382 +-0.0918829 0.116106 0.0333156 +0.00614351 0.12581 -0.00755937 +0.0340287 0.115127 0.0194375 +-0.0908622 0.135106 0.0192089 +-0.000650637 0.0496936 -0.0307015 +-0.0856199 0.144636 0.00717286 +0.0438423 0.0804362 -0.00278861 +-0.00949487 0.0503088 0.0507661 +0.0271211 0.103444 0.039376 +-0.0386188 0.04066 -0.0277325 +-0.0654456 0.154232 -0.00436037 +-0.0264896 0.100224 0.0439794 +-0.0715324 0.144165 0.0446205 +-0.0694829 0.118967 0.0529378 +0.0378869 0.110163 0.00793964 +0.0353212 0.108669 0.0283742 +0.0601522 0.0581329 0.0151721 +-0.0542607 0.057796 0.0208407 +0.00222051 0.130562 0.00190808 +-0.0641033 0.156361 -0.011127 +0.0432299 0.0944972 0.0241641 +-0.0229686 0.033489 -0.025736 +-0.0221215 0.127119 0.0131583 +-0.0671797 0.0604061 0.0141816 +-0.0288776 0.0903901 -0.0295833 +0.0603694 0.0609168 0.00815448 +-0.0494359 0.138587 0.00541192 +-0.0023893 0.0424447 0.047211 +-0.0543474 0.135324 0.0319505 +0.0228597 0.125444 0.016672 +-0.0334812 0.0737514 -0.024477 +0.0348071 0.0781711 0.0398247 +0.0054972 0.0547598 0.0532635 +0.00645879 0.122419 -0.0119062 +-0.0438011 0.128754 0.0022734 +-0.0849152 0.0791131 0.00550947 +-0.0506838 0.0678366 -0.0132392 +0.0126337 0.110109 -0.0186257 +-0.0497701 0.140145 0.0153991 +-0.0724387 0.0819305 0.0395669 +0.0576036 0.0717386 0.0163116 +0.00802743 0.0346823 0.0237027 +0.00218868 0.098191 -0.0260404 +-0.0368205 0.162344 -0.00074381 +-0.070799 0.0908224 -0.0163205 +-0.0539828 0.0700164 0.038652 +0.0135945 0.128354 0.000408423 +-0.0264981 0.0959784 0.0437675 +0.0190214 0.118116 -0.0113006 +-0.0618485 0.153752 -0.0205795 +-0.0552085 0.151192 0.0284379 +-0.0266144 0.0408668 -0.0293519 +0.00698354 0.131641 0.013682 +-0.0316463 0.0595496 -0.0164023 +-0.0758985 0.159659 -0.0269354 +-0.0491601 0.160603 -0.00598464 +-0.00858383 0.0384847 0.0096485 +-0.0717673 0.146065 -0.0213605 +-0.0899696 0.15095 0.0147905 +-0.00955085 0.0385956 0.00389466 +-0.0607249 0.0737695 -0.0169262 +-0.0751542 0.0995011 0.0375123 +-0.0707959 0.0850638 -0.0167146 +-0.0312047 0.123257 -0.00431908 +-0.053995 0.0675039 0.0372692 +-0.0419532 0.0345214 0.0385087 +-0.0289695 0.0380956 -0.0297496 +-0.0121936 0.163667 -0.0136225 +0.021294 0.0721108 -0.027322 +0.0597965 0.0678036 0.00914167 +-0.0657015 0.0736405 -0.0152375 +0.00697022 0.12731 -0.00520393 +0.033357 0.100796 0.0361067 +0.0587791 0.0686289 0.0199155 +0.00149398 0.0394449 0.0343588 +-0.0875531 0.12123 -0.000692815 +-0.0744527 0.154114 -0.0209063 +-0.0172261 0.0356447 0.0515267 +-0.0200013 0.0389743 0.053287 +-0.0569508 0.0343746 0.0319473 +-0.0184875 0.0829081 0.0576141 +-0.019368 0.183116 -0.0157888 +-0.0626506 0.153382 -0.0318715 +-0.00943219 0.095325 -0.0330289 +0.0431395 0.100108 0.0121576 +-0.0608162 0.0881975 -0.019441 +0.0357777 0.070014 0.0376374 +0.0505254 0.0735568 0.0151501 +0.0307633 0.0476275 0.0336614 +0.0294554 0.0416168 0.02991 +-0.0611913 0.173613 -0.0615062 +-0.0146115 0.109635 -0.0201085 +0.0379445 0.0686366 0.0354907 +-0.076675 0.154077 0.000107436 +-0.0315189 0.0351239 -0.0306591 +-0.0768434 0.109781 0.0434593 +-0.0522791 0.0490314 0.0356585 +-0.0380005 0.12652 0.0191796 +-0.0861323 0.103534 0.00440203 +-0.0659084 0.106679 -0.0142087 +0.000468869 0.0388702 -0.00172096 +-0.0623487 0.141045 -0.00649873 +-0.0484952 0.0862244 0.0454118 +-0.0685451 0.170527 -0.0328985 +-0.037499 0.101465 0.0412127 +0.0274201 0.0431121 -0.00573463 +-0.0197554 0.158352 -0.00754965 +-0.0567366 0.0753362 -0.0185878 +0.0533817 0.063336 -0.00140725 +0.0135006 0.105771 0.0435499 +-0.0631905 0.166285 -0.0395881 +-0.0932173 0.122834 0.0272862 +-0.0284888 0.0396421 0.053637 +-0.0134794 0.0559661 0.0512091 +-0.04424 0.130203 0.0124253 +0.0196407 0.0940896 -0.0236062 +-0.0625219 0.151129 0.0359075 +-0.0585008 0.0732388 0.0410714 +0.0608111 0.0651191 0.0151635 +-0.0275116 0.0560234 0.0370088 +-0.0127931 0.0799092 -0.038653 +-0.0544725 0.0478754 0.0402183 +-0.0905041 0.147099 0.0259896 +0.0291224 0.0877617 -0.0209279 +0.0381679 0.0993665 0.0307411 +0.00549435 0.0474709 0.0500045 +-0.0842531 0.102059 -0.0016008 +0.0164869 0.128389 0.00575868 +-0.043156 0.162156 -0.0100947 +0.0445553 0.0846952 0.000180444 +0.0409145 0.07739 -0.0077683 +0.0297353 0.111221 -0.00987421 +-0.0220481 0.0379707 0.0182323 +-0.0636401 0.0337302 0.00992182 +-0.0277909 0.0796672 -0.0363416 +-0.0247513 0.0944605 0.0453863 +-0.0291577 0.0733109 -0.0335988 +-0.0264744 0.0486202 0.0485825 +-0.0654948 0.104238 0.0403184 +-0.054309 0.153692 0.0171048 +0.000886988 0.0365316 0.0205866 +0.025787 0.114054 0.0339562 +-0.0624998 0.091833 0.0450322 +-0.0825753 0.107428 -0.000626511 +-0.0879726 0.100935 0.0073995 +-0.0849555 0.110375 0.0243559 +-0.00450509 0.0815118 0.0573962 +0.0411647 0.0886413 -0.00977915 +0.00923376 0.0823418 -0.0323881 +0.0250818 0.0983923 -0.0201688 +-0.0460388 0.0353834 -0.0203139 +-0.0563344 0.154371 0.0236088 +-0.0786725 0.15564 0.0171569 +-0.0174933 0.120917 0.0332266 +-0.0405771 0.0447491 -0.0223069 +-0.0706839 0.0363372 -0.00115986 +-0.0827485 0.134001 0.0496722 +-0.0566419 0.0336495 -0.0102846 +-0.0932956 0.12823 0.014251 +-0.0183957 0.116542 -0.0154107 +0.03698 0.0590759 0.0339965 +-0.0709427 0.132583 -0.00826816 +-0.0697213 0.0778913 -0.0154943 +-0.0222445 0.159024 -0.0114139 +-0.0571999 0.0684533 0.0375014 +-0.04663 0.0533425 -0.0102323 +0.00628325 0.0668147 -0.0324472 +-0.0477443 0.0767654 -0.0182192 +0.000336625 0.0525175 -0.0304496 +-0.0562455 0.0345922 0.0440034 +-0.00249349 0.0474079 0.0491587 +-0.00849662 0.115566 0.0401952 +-0.0346349 0.176996 -0.009991 +-0.0315471 0.0665587 -0.0224416 +-0.0114919 0.121016 0.0357517 +-0.00348929 0.0884115 0.0568027 +-0.0275554 0.0689002 0.0398598 +0.0463861 0.080656 0.0111753 +-0.0335046 0.109774 0.0374515 +-0.0104184 0.179993 -0.0295246 +0.0299649 0.0370453 0.0224182 +-0.0229027 0.109901 -0.0203838 +0.0326144 0.117295 0.0103313 +0.0369028 0.0954111 -0.0108822 +-0.0564742 0.041367 0.0464242 +-0.0770729 0.168746 -0.0303374 +-0.0310065 0.124592 0.0202545 +-0.06762 0.17339 -0.0440641 +-0.0124743 0.0632507 0.0548154 +-0.06879 0.067714 0.0304363 +-0.0188136 0.124392 0.0261122 +-0.0775236 0.155819 0.0175602 +-0.0744868 0.14835 0.0408614 +-0.0798509 0.120721 -0.00541034 +-0.0474977 0.0747299 0.0422594 +-0.0819076 0.08016 -0.00254028 +-0.0104535 0.0366522 -0.0168147 +0.0107598 0.0346122 0.0387698 +-0.0618853 0.158437 -0.0215849 +-0.0248668 0.103031 -0.023615 +0.0521945 0.0697716 0.0245573 +0.0156704 0.0936059 -0.0251021 +0.0371318 0.111041 0.00479819 +-0.0835634 0.0897492 -0.00557879 +0.00648846 0.118239 0.0378444 +-0.0454996 0.0464888 0.0408011 +0.00251072 0.0388788 0.0260522 +-0.0757603 0.10082 0.036651 +-0.072674 0.131225 0.051196 +-0.0107806 0.0770662 -0.0381287 +-0.0336363 0.153436 -0.00674709 +-0.0843022 0.0938821 0.0298739 +-0.00957953 0.177197 -0.0268263 +-0.06621 0.148552 -0.030869 +-0.0367939 0.127143 0.000444502 +0.0450752 0.0819431 0.00117926 +0.00252922 0.0387278 -0.0124032 +0.0124259 0.130345 0.00996559 +-0.039483 0.112566 0.0355031 +-0.0896451 0.11724 0.00430849 +-0.0307561 0.0876495 -0.0285591 +-0.0336555 0.0363317 0.0490618 +0.00481949 0.0349074 0.0372909 +0.0324749 0.095557 0.0400886 +-0.0601974 0.126918 0.041055 +0.0561271 0.0494063 0.0121912 +-0.0663732 0.0796127 0.0418746 +-0.0634873 0.105626 0.040045 +-0.0348887 0.174114 -0.0129217 +-0.0331172 0.123673 -0.00477506 +-0.0158191 0.0855498 -0.0389623 +-0.0630684 0.138136 0.036884 +0.00839558 0.0418967 -0.0238735 +-0.000234213 0.0957245 -0.0313684 +-0.00270805 0.0387067 0.00335713 +-0.0066107 0.0434378 -0.0261152 +0.0267348 0.0889072 0.0458132 +-0.057498 0.0762057 0.0428357 +-0.0559977 0.128155 -0.00607843 +-0.0652856 0.176792 -0.0608019 +-0.0847322 0.10481 0.00139005 +0.0045205 0.0842507 0.0571459 +-0.0540417 0.148675 -0.00217424 +0.00157845 0.0388465 -0.0127005 +-0.0649294 0.123847 -0.00887936 +0.0268943 0.0906576 -0.0219805 +-0.0692389 0.149629 -0.0402111 +0.0424058 0.101483 0.00416631 +-0.069135 0.0354547 0.0122501 +-0.0311414 0.168206 -0.0166543 +0.0247254 0.0405634 0.0363023 +-0.035656 0.0591967 -0.0115208 +-0.0492298 0.13342 0.00108021 +0.0186953 0.0943115 -0.0238444 +-0.0632815 0.159908 -0.0475928 +-0.0744952 0.144184 0.0450216 +-0.0273351 0.0750142 0.0443436 +0.0129485 0.0726239 0.0538836 +-0.0256504 0.178665 -0.00908499 +-0.0152817 0.126335 -0.00175389 +0.0171854 0.035921 0.00432788 +0.00536983 0.0385261 0.026955 +-0.069701 0.0749104 -0.0135814 +-0.0936513 0.125496 0.0142597 +-0.0218218 0.0854612 -0.0381675 +-0.0670338 0.0819342 0.0426575 +-0.0637771 0.0824308 -0.0191299 +-0.0579197 0.0410941 0.0197057 +0.004329 0.114453 -0.0192954 +-0.0743852 0.111313 0.0463698 +0.0153242 0.0566704 -0.0288596 +0.0201589 0.0349933 -0.00358051 +-0.0674387 0.0336478 0.00564073 +0.0380425 0.109755 0.0161689 +0.0214264 0.0348625 -0.00133145 +0.0129483 0.0405423 0.0447572 +-0.00171529 0.0627358 -0.0345403 +-0.0206569 0.0494682 -0.0293042 +0.0369479 0.0784891 -0.0137448 +-0.0877279 0.139146 0.00920485 +-0.0228745 0.0383806 -0.00412065 +0.0407791 0.105635 0.00716484 +-0.0164884 0.161116 -0.0081783 +0.0261701 0.115347 0.0327443 +-0.0171143 0.0393698 0.0395766 +0.0364251 0.0840505 -0.0167267 +-0.0413094 0.0336719 -0.0183114 +-0.00449481 0.0619627 0.0557718 +0.0354002 0.054813 0.0334165 +0.0257124 0.0795754 0.0477924 +-0.0900689 0.132434 0.0392074 +0.0111597 0.124256 -0.00791398 +0.023574 0.105697 0.0395934 +0.0172046 0.061784 0.0493931 +-0.0738846 0.110669 -0.00843945 +0.00601824 0.128477 0.0276707 +-0.0581623 0.155642 0.0142378 +-0.046474 0.0903329 0.04369 +-0.0204963 0.0988407 0.0444811 +0.0448392 0.0847511 0.0231667 +-0.0246346 0.0464142 -0.0272665 +-0.0164056 0.0347921 0.0489909 +-0.048358 0.146267 0.00883601 +-0.0626778 0.0407451 0.0424121 +-0.06586 0.154377 -0.00304604 +0.0375072 0.103901 -0.00584413 +-0.00221994 0.0380783 -0.0146251 +0.00247871 0.110023 0.0425049 +0.0588331 0.0552392 0.0181818 +-0.0156079 0.0352742 -0.0184368 +-0.0112854 0.0344473 -0.0186905 +-0.0170355 0.0338392 -0.0211402 +-0.0137571 0.128142 0.00234571 +0.0353694 0.082169 0.0388786 +-0.065182 0.160968 -0.0576695 +-0.0324895 0.0874934 0.0434306 +-0.0637445 0.0781022 -0.0180675 +-0.0882379 0.0914593 0.00646904 +0.0256941 0.120543 -0.00190068 +-0.0750751 0.149943 -0.025867 +-0.0477253 0.135673 0.0140062 +-0.0678845 0.116524 -0.00880656 +-0.0627671 0.15529 -0.013592 +-0.0588282 0.0408079 0.0456406 +-0.056691 0.0506774 -0.00137882 +-0.0828622 0.0910525 -0.0066104 +-0.0499126 0.0515141 0.0166499 +-0.0490107 0.146266 0.00962371 +0.0122318 0.130219 0.0070475 +-0.0116803 0.0570084 -0.0342026 +-0.0651676 0.167884 -0.0330971 +-0.0730453 0.0699885 -0.00346826 +0.0174821 0.0990004 0.0469682 +-0.0908453 0.133761 0.025216 +-0.0657306 0.150277 -0.0347821 +-0.0671422 0.159475 -0.0561779 +-0.00377564 0.078412 -0.0370359 +-0.0617811 0.042326 0.0146867 +-0.0252077 0.0348536 0.0435448 +-0.028493 0.0602587 0.0370952 +-0.08903 0.119932 0.00232561 +-0.0345174 0.105629 0.0392495 +-0.0234134 0.181486 -0.0190275 +-0.0664685 0.0611724 0.00451786 +0.0367619 0.0414833 0.0270934 +-0.0275613 0.121213 -0.00819283 +0.0347392 0.0848817 0.0397697 +-0.0655835 0.0626949 -0.00273961 +-0.0187525 0.0671388 -0.037784 +-0.0904123 0.13106 0.0392156 +0.0183728 0.0521803 -0.0265242 +-0.0394837 0.113931 0.0345962 +-0.050497 0.0848226 0.0453947 +-0.026736 0.125755 0.00710307 +-0.0284884 0.0890334 0.0453918 +-0.0441667 0.0657175 0.0402548 +0.0109368 0.035027 0.0276086 +-0.0219243 0.0335307 -0.0255712 +-0.0865855 0.100865 0.00437928 +-0.0114057 0.038823 -0.00778731 +-0.0606205 0.136712 0.0351771 +-0.0938957 0.124187 0.0252761 +-0.0877217 0.151511 0.024071 +0.0027861 0.0392982 -0.00725238 +-0.0435747 0.127942 -0.00117905 +0.00626863 0.114136 -0.0189815 +-0.0182416 0.0386382 0.0310248 +-0.065785 0.145733 -0.0198954 +-0.0867571 0.0833567 0.0144816 +0.0263294 0.0517767 -0.02097 +0.0205436 0.0357642 -0.00368285 +-0.0174561 0.0544373 0.0497557 +0.0051136 0.11017 -0.0202785 +0.0320036 0.0972394 -0.014969 +0.018368 0.0537078 -0.0275601 +0.00449367 0.115547 0.0400425 +0.030957 0.0564285 0.0393343 +-0.0480871 0.166778 0.00155196 +-0.0374511 0.122567 -0.00961353 +-0.067466 0.154933 0.00219081 +-0.0645473 0.0334176 0.0010517 +-0.0507826 0.0530079 0.0196214 +-0.0269873 0.0549465 0.0375414 +-0.0318114 0.0361324 -0.0187 +0.0211923 0.12581 0.0217553 +-0.0485738 0.111377 -0.0178292 +-0.0790938 0.10996 -0.003593 +0.0410408 0.0408917 0.00130956 +-0.0171973 0.174198 -0.0240623 +-0.0136738 0.0526181 -0.0325173 +-0.0194987 0.0828823 0.05729 +-0.00149547 0.119691 0.0381347 +0.0125362 0.127772 -0.00169738 +0.00352032 0.0772514 0.0561756 +-0.0037108 0.0392109 0.0335024 +-0.0682887 0.164315 -0.0170259 +-0.0861823 0.107654 0.00936346 +0.0116633 0.0616767 0.0519085 +-0.0828359 0.104706 -0.00261356 +-0.0473623 0.129578 0.0262098 +0.0143608 0.0508459 -0.0270896 +-0.0265586 0.171236 -0.0104749 +0.0203688 0.0459169 -0.020834 +-0.0404996 0.0591463 0.0404229 +-0.0164937 0.0758406 0.0558352 +-0.00649647 0.0898144 0.056995 +-0.070489 0.118975 0.0531649 +-0.0665486 0.169315 -0.0336077 +-0.0869443 0.101766 0.0237835 +0.0413201 0.104267 0.012164 +-0.0705201 0.0646959 0.0221381 +-0.0345088 0.104256 0.0402356 +0.0590657 0.0691634 0.0182335 +0.0274527 0.103904 -0.0160338 +-0.0321732 0.0461161 0.0457813 +-0.0446011 0.0519723 -0.0106716 +-0.0932418 0.125562 0.0272746 +-0.0458642 0.128671 0.00011454 +-0.0885465 0.0902329 0.022415 +-0.0693724 0.136902 0.0471868 +0.0383558 0.102292 -0.0062663 +-0.0638617 0.125566 0.0463833 +-0.017504 0.0870094 0.0567302 +-0.0370734 0.0393951 0.0451959 +0.00329134 0.119473 -0.0147093 +-0.0543235 0.0334648 0.00849253 +0.0274945 0.0381011 -0.00197122 +-0.0703836 0.151592 -0.0450749 +0.0441667 0.0973563 0.00616912 +0.0240844 0.0547426 -0.0237664 +-0.015779 0.0770791 -0.0385675 +-0.0731035 0.0667848 0.0215468 +0.0455074 0.0569933 0.0321208 +-0.0438752 0.128361 0.000408951 +-0.0622566 0.0709345 0.0378148 +-0.0713089 0.156055 0.0109968 +0.0323876 0.047596 -0.00623106 +-0.0610541 0.068813 0.0363796 +-0.0175437 0.119111 -0.0121224 +-0.0136792 0.0541002 -0.0332811 +-0.0477406 0.135604 0.0113959 +-0.0709176 0.112214 -0.00951227 +0.0301974 0.0887542 -0.0200097 +-0.0734581 0.168 -0.0440151 +-0.0685258 0.165031 -0.0185494 +-0.0264962 0.0690788 0.0415599 +-0.0249134 0.0383716 -0.00452352 +-0.086697 0.114875 0.0460769 +-0.0752073 0.156095 0.0183637 +-0.0189411 0.0376177 0.0530488 +-0.0634886 0.064446 0.0291098 +-0.0261594 0.066324 0.0406106 +-0.0142604 0.0974009 0.0506069 +-0.0316679 0.0763713 -0.0315414 +-0.040787 0.0855384 -0.021437 +0.0590343 0.06983 0.00945078 +-0.07763 0.165322 -0.0259443 +-0.0631195 0.176032 -0.0554618 +-0.0918958 0.129686 0.0292517 +-0.029505 0.0545565 0.0362962 +-0.0356809 0.123888 -0.0070042 +0.0421291 0.070468 -0.00580336 +0.0297749 0.0920783 -0.0194766 +-0.0415439 0.148326 -0.00168489 +-0.090059 0.136447 0.0142016 +-0.0555057 0.0946 0.044463 +-0.0945025 0.125547 0.0202583 +-0.0304869 0.0532061 0.0367531 +0.00830607 0.0917456 -0.031199 +0.0182274 0.125477 -0.00123802 +0.0138055 0.0712841 0.0533593 +0.0294478 0.0506302 0.0370841 +-0.0802909 0.104732 0.0311813 +0.0308738 0.115323 0.0282321 +-0.0889738 0.137888 0.0281941 +-0.0750897 0.149941 -0.0248696 +0.0395014 0.0469731 0.0315971 +-0.0599935 0.0586398 0.0172334 +-0.0790056 0.166641 -0.0359617 +-0.00233373 0.114874 -0.0177321 +-0.0241436 0.180147 -0.0104229 +-0.0746876 0.0700138 0.0272066 +-0.00503592 0.13043 0.00494647 +-0.069435 0.179317 -0.0579979 +-0.0896062 0.137812 0.0131974 +-0.0625358 0.155244 -0.0346054 +-0.071543 0.155755 0.00800576 +-0.0746181 0.165272 -0.019163 +-0.0386347 0.0548667 -0.0110053 +0.00350742 0.103001 0.0436938 +-0.0629079 0.15056 -0.0255866 +0.0200283 0.0371524 -0.00668325 +-0.0375331 0.127856 0.0134298 +-0.075576 0.155851 0.0124034 +-0.0145239 0.118305 0.0371093 +-0.0528711 0.15259 0.0147483 +-0.0639569 0.158297 -0.0475943 +-0.0437953 0.0869983 -0.0218056 +0.0183 0.0651194 -0.0285252 +0.0410434 0.0689808 -0.00777311 +-0.0391241 0.157933 0.00465789 +-0.0617079 0.155317 -0.0205813 +0.049194 0.055373 0.030576 +-0.0577821 0.0826022 -0.0210434 +0.00750154 0.123796 0.0339733 +-0.0844011 0.0777797 0.0105147 +-0.0508742 0.137048 0.0234112 +-0.0487311 0.13178 0.0269763 +-0.0224768 0.123487 0.0248086 +0.0572102 0.0550739 0.00417234 +0.0523558 0.0647992 0.0281407 +-0.0804668 0.131637 0.0521945 +0.0276827 0.0480336 -0.0156964 +-0.0121824 0.178673 -0.0292354 +-0.0228778 0.10587 -0.0225138 +-0.0644637 0.0743344 0.0396953 +-0.0655821 0.153706 -0.0431373 +-0.0176845 0.0525387 -0.0318817 +0.0256228 0.0363687 8.49366e-07 +-0.0208533 0.0866413 0.055877 +-0.0490886 0.157599 -0.00632625 +0.00958152 0.0417197 0.0451866 +-0.0135001 0.0800899 0.0570677 +-0.0885594 0.112819 0.0222051 +0.0440561 0.0945388 0.0201582 +0.00630898 0.0624816 -0.0315869 +-0.0560997 0.155362 -0.00113519 +-0.0238123 0.0867774 -0.0372362 +-0.0711896 0.155374 -0.0449035 +0.018728 0.0549999 0.0480114 +-0.0696134 0.172257 -0.054028 +-0.00359831 0.101107 0.0440537 +-0.033095 0.0723179 -0.02347 +0.0338305 0.107861 -0.00824999 +-0.0354812 0.0383051 -0.00290933 +-0.0238593 0.0838986 0.0547079 +0.0239371 0.103424 0.0418106 +-0.076687 0.14724 -0.00686649 +-0.0113442 0.129847 0.0112634 +-0.0595215 0.131137 0.0385262 +-0.00250336 0.0633801 0.0564795 +-0.0765967 0.152807 -0.00988734 +0.00617007 0.126444 0.0306412 +0.0264293 0.0400385 -0.00421056 +-0.0261224 0.165258 -0.0166522 +-0.00669164 0.129496 0.00145082 +-0.0531001 0.154605 -0.00338641 +0.0347186 0.113797 0.00249877 +-0.0746345 0.0660496 0.0075612 +-0.0897609 0.0915993 0.0164407 +-0.0848984 0.0965537 0.0289739 +-0.0217829 0.111029 -0.0195757 +-0.0890662 0.123985 0.0032876 +0.0609254 0.0637423 0.0131584 +-0.0495476 0.147557 -0.00269468 +-0.00609162 0.0391352 -0.0126175 +-0.047607 0.144918 0.0010701 +-0.0484709 0.165547 -0.00491912 +0.0489576 0.0466396 0.0248167 +-0.0391315 0.160685 -0.012118 +-0.0530423 0.14778 0.0224018 +-0.0471085 0.0683456 0.0397676 +-0.0785029 0.128864 0.0532728 +0.0368255 0.109713 0.0241821 +0.0163171 0.0686116 0.0516854 +-0.0729482 0.0914984 0.0411605 +-0.0805357 0.113778 0.0465863 +0.0302378 0.0727042 0.0419554 +-0.0625354 0.122703 0.0447625 +-0.0615083 0.170965 -0.0565878 +-0.0124852 0.0659775 0.0542376 +0.0219313 0.0605513 0.0474343 +-0.048186 0.135579 0.00839494 +-0.014696 0.0585192 -0.0354314 +-0.0818834 0.109932 0.0368633 +-0.0564976 0.101562 0.0427397 +-0.0692156 0.0343564 -0.00463486 +-0.0924819 0.125444 0.00927262 +-0.0116015 0.0406252 -0.0263738 +0.000388646 0.0448955 -0.0263577 +-0.0474886 0.05462 0.0367747 +-0.0150651 0.12575 -0.00315467 +-0.0225002 0.104414 0.0430095 +-0.016108 0.038364 0.00641286 +-0.0474972 0.105664 0.0404447 +0.053572 0.0650953 0.0274823 +-0.068963 0.0874301 0.0429809 +-0.0206158 0.0422474 -0.0286271 +-0.0745126 0.131657 0.0521168 +0.0246516 0.122175 0.000230276 +-0.00982514 0.16696 -0.0220459 +-0.00885716 0.0385311 0.024037 +-0.0568241 0.063612 0.0312362 +-0.0787856 0.109366 0.039802 +0.0392221 0.075321 0.0338531 +-0.0725057 0.102685 0.0380563 +0.0318729 0.0380045 0.0237472 +-0.0704322 0.13832 0.0474328 +-0.0325018 0.177105 -0.00443384 +-0.0226059 0.0381278 0.0251854 +-0.00949201 0.129843 0.00617837 +-0.00878563 0.110674 -0.0212403 +0.0347324 0.0882263 -0.0174421 +-0.046782 0.0841151 -0.0215173 +-0.0692662 0.0692944 0.0324707 +0.00925419 0.0696192 -0.0318888 +-0.0303184 0.0423041 0.0510935 +-0.0780856 0.0784826 -0.00760345 +0.0256389 0.0929167 0.0460121 +0.00457646 0.108164 0.0418882 +-0.0519222 0.0461016 0.019678 +0.00234204 0.0367065 0.0225428 +0.0457266 0.0847913 0.00519644 +0.0292205 0.0857953 -0.020938 +-0.0196964 0.0384682 0.0290787 +0.0127826 0.0926962 0.0520031 +0.0390362 0.0980073 0.030266 +0.0186124 0.127837 0.0122439 +-0.0535608 0.0430661 -0.00900679 +-0.0509276 0.0346131 0.0417321 +0.0233086 0.0634336 -0.024957 +0.00850697 0.0546686 0.0524774 +-0.0275662 0.123979 -0.00112939 +-0.0688326 0.13265 0.047942 +0.0112159 0.0922395 -0.029689 +0.00233442 0.0539469 -0.0306143 +-0.0446508 0.040942 -0.0182992 +-0.00948977 0.114167 0.0408028 +0.0254079 0.10205 -0.0180571 +-0.0850056 0.146006 0.00617966 +-0.00850241 0.0870443 0.0572609 +0.0097783 0.1251 0.0319006 +-0.0222638 0.126605 0.016039 +-0.0722117 0.0348867 0.00176609 +-0.0327045 0.111423 -0.0179721 +-0.057835 0.0897878 -0.0213715 +-0.076573 0.153595 0.0311713 +0.0595629 0.058084 0.0191786 +-0.0323163 0.155148 0.000487548 +0.0120506 0.0505153 0.0488388 +-0.0524497 0.140085 0.0234103 +-0.0325359 0.172727 -0.00270207 +-0.0711683 0.149278 -0.039104 +-0.0641214 0.155412 0.0266328 +0.0288394 0.112544 -0.00929606 +-0.0217358 0.0384567 0.028668 +-0.0719124 0.168014 -0.0470137 +-0.0448486 0.0351369 -0.0234128 +0.0159855 0.12897 0.0112743 +0.0311432 0.0373381 0.0223917 +-0.000793766 0.0867716 -0.0355698 +-0.0900654 0.132428 0.033223 +-0.0935895 0.122834 0.0262964 +-0.0520638 0.0723523 0.0405753 +-0.0111299 0.129809 0.0171219 +-0.0491641 0.0344528 0.0317811 +-0.0849325 0.0938555 0.0290926 +-0.0809703 0.132422 -0.00393108 +-0.0887798 0.140493 0.0370948 +-0.0577868 0.0840301 -0.0211707 +-0.0814849 0.0872077 0.0329213 +0.0191348 0.102061 0.0453843 +0.0573171 0.0523102 0.00718519 +0.039991 0.0847392 0.0332858 +-0.0668403 0.0335301 0.004077 +-0.0117893 0.0392416 0.0372019 +0.0216437 0.120011 -0.00733339 +-0.0125093 0.0883992 0.0567932 +-0.0378236 0.125803 -0.00505851 +-0.0750347 0.154671 0.0286993 +-0.0887093 0.112351 0.0387402 +-0.0638899 0.102518 -0.0176142 +-0.0600535 0.138395 -0.00620678 +-0.0103882 0.129888 0.00873113 +-0.0610188 0.119808 0.0416066 +0.0158574 0.104091 -0.0202309 +-0.0839121 0.122095 -0.00374203 +-0.0841686 0.143365 0.0409129 +-0.00166671 0.12799 -0.00382866 +-0.0434723 0.0647942 0.0406198 +0.0406639 0.0815903 -0.00978474 +-0.0652464 0.154114 0.00157024 +-0.0257535 0.0740897 -0.0368116 +-0.0739579 0.13841 -0.00677972 +-0.0288788 0.0592582 -0.0244095 +0.0093177 0.0926652 -0.0301396 +-0.0452267 0.150119 -0.00491516 +-0.0319894 0.0384633 -0.00603174 +-0.0794952 0.0854073 -0.00956797 +-0.0675492 0.129835 0.0480321 +-0.0523266 0.033478 -0.00194369 +-0.00450192 0.0718383 0.058171 +-0.0535372 0.0578641 0.0215172 +-0.0140108 0.0596764 0.0527295 +-0.000532268 0.111266 -0.0199168 +0.0523683 0.0540101 0.0281247 +0.0211966 0.123092 -0.002693 +-0.00468835 0.0598784 -0.0344633 +-0.0718785 0.102239 -0.0132694 +-0.0678239 0.15109 -0.0436673 +0.0350895 0.0686836 0.0383949 +0.0422361 0.101506 0.0151693 +0.0317521 0.0794454 -0.0197442 +-0.0577724 0.0796775 -0.0200459 +-0.0461631 0.0335506 -0.0117706 +-0.0827169 0.105982 0.0279083 +-0.0922534 0.122854 0.0424865 +0.0128317 0.0712714 0.0536973 +-0.0126798 0.126321 -0.00380105 +-0.00116162 0.0980337 0.0521962 +-0.0814909 0.0788596 0.028943 +-0.0501013 0.15611 -0.00554414 +0.00939521 0.0609325 -0.0302492 +-0.030101 0.160758 -0.0141091 +-0.031497 0.117989 0.0308563 +0.0231755 0.0916964 -0.0230758 +0.0434109 0.0987186 0.0151565 +-0.0514982 0.108428 0.0386132 +-0.0644896 0.0833289 0.0440861 +-0.0238622 0.101613 -0.0238665 +0.04258 0.0422624 0.0239479 +0.0354547 0.103863 -0.00997386 +0.0217345 0.0994968 0.0456553 +-0.0743457 0.168929 -0.0264214 +0.01504 0.0343531 -0.00213727 +0.00148487 0.0399885 0.0464307 +0.0273636 0.0699427 0.0430425 +-0.0548013 0.086928 -0.0216118 +-0.0729344 0.0901459 0.0411907 +0.0305961 0.110839 -0.00946183 +-0.0721093 0.0846859 0.0405598 +-0.067036 0.180898 -0.0568882 +0.0496382 0.068363 0.00147832 +-0.0149904 0.165173 -0.0188028 +-0.0928971 0.117368 0.0123132 +-0.000378579 0.101174 0.0451223 +-0.00167056 0.0392225 0.0339103 +0.0308479 0.0567691 -0.0158074 +0.00821609 0.0823703 -0.0328688 +0.0179771 0.0393777 0.0432522 +-0.0917891 0.141969 0.0171701 +0.0284614 0.0398271 -0.00325429 +-0.0273719 0.0335777 -0.022929 +-0.0799767 0.138308 -0.00390962 +0.0224205 0.0519815 -0.0241272 +-0.0206006 0.0393656 -0.0285093 +-0.075081 0.147222 -0.0118498 +-0.0748806 0.0992858 -0.0126164 +0.0126717 0.127043 -0.00291981 +-0.0321779 0.0474216 0.0442941 +0.0248435 0.0822524 0.0483141 +-0.087169 0.0964235 0.0255876 +-0.00114332 0.0356309 -0.0159104 +-0.0674627 0.138295 0.0446438 +-0.0656974 0.169193 -0.0361564 +-0.065794 0.155512 0.00862557 +0.0346025 0.0754478 0.0394941 +-0.0145323 0.043279 0.0510718 +-0.0739879 0.139879 -0.00672352 +-0.0921938 0.132347 0.0162256 +-0.077508 0.174998 -0.0490226 +-0.0161182 0.180144 -0.0199393 +0.0442692 0.0973579 0.00816486 +-0.0885535 0.112746 0.0331115 +-0.0527601 0.0447727 0.0186838 +-0.0301237 0.12585 0.013192 +-0.0359512 0.151053 -0.00163407 +-0.0579079 0.121934 -0.00872095 +-0.0709562 0.158172 -0.0439179 +-0.00996463 0.114432 -0.0172214 +-0.0308542 0.0986541 -0.0229751 +-0.0199407 0.0381449 0.0130842 +-0.0439068 0.129921 0.011069 +0.0290675 0.120111 0.00471365 +-0.0203588 0.175699 -0.0155519 +0.0542673 0.0491964 0.0212031 +-0.0348545 0.0986254 -0.0227182 +0.0413986 0.0830578 -0.00877387 +-0.0554939 0.0477978 0.0398952 +-0.0760774 0.166574 -0.0390172 +0.0438486 0.0846749 0.0261721 +0.0021495 0.0388151 -0.00319944 +0.04114 0.104231 0.00317036 +0.0165359 0.0912212 -0.0265781 +-0.0518469 0.0545626 0.0286406 +-0.0568589 0.0562507 0.00563881 +-0.0383911 0.127983 0.00280515 +-0.0857603 0.130763 -0.000714461 +-0.0173678 0.0389666 0.0345056 +-0.0266954 0.125077 0.00273937 +0.0143393 0.0349605 0.0410018 +0.0132369 0.0709965 -0.0314873 +-0.0317622 0.0338243 0.0127586 +-0.0767072 0.0724697 0.0281768 +-0.0694593 0.040787 -0.000292884 +0.013984 0.129601 0.0176686 +-0.00527436 0.124342 -0.0098488 +-0.0749724 0.149924 -0.0268701 +-0.0188238 0.0855077 -0.0385626 +-0.0577531 0.141417 -0.00374252 +-0.0506075 0.0335251 -0.00346549 +-0.0105008 0.103039 0.0436514 +-0.062498 0.0847471 0.0443617 +-0.0166725 0.0495705 -0.0306349 +-0.0368813 0.108512 -0.0198737 +0.0510305 0.0733741 0.0168194 +-0.0275083 0.112548 0.0360564 +-0.0636421 0.0627085 -0.00368166 +0.0411669 0.104244 0.0141607 +-0.00149973 0.0965741 0.0536819 +-0.0288186 0.0862428 0.0454609 +-0.0526183 0.0343668 0.0293685 +-0.0601235 0.15512 0.0251504 +-0.0378644 0.111663 -0.0181901 +0.0344602 0.0726275 -0.0157808 +-0.0144826 0.0530653 0.0501401 +-0.0700881 0.131265 0.0496481 +-0.0878883 0.0914318 0.00546674 +-0.0415923 0.0491549 -0.0111971 +0.0234288 0.0618809 0.0460892 +-0.0630663 0.151874 -0.00782908 +-0.0866506 0.128453 0.0480393 +-0.0781275 0.152854 0.000107941 +-0.0106285 0.174518 -0.0286758 +-0.0596993 0.0345337 0.0416145 +-0.0579832 0.0466328 -0.00336399 +-0.0265008 0.124041 -0.00116405 +-0.0254725 0.0400777 0.0541415 +-0.0178664 0.12824 0.013233 +-0.0206926 0.0385034 0.0288434 +-0.0534934 0.0747559 0.0420439 +-0.0652623 0.158339 -0.0115587 +-0.0767656 0.152802 -0.00889022 +0.0245199 0.0520168 0.0405174 +0.0264125 0.0450979 -0.0096842 +-0.012488 0.107228 0.0430572 +-0.078668 0.170753 -0.0430283 +-0.0625286 0.164689 -0.038593 +-0.0241791 0.159685 -0.00173809 +0.00849261 0.092349 0.0531984 +-0.0759472 0.132533 -0.00707033 +-0.0806057 0.0720192 0.00754007 +0.00646347 0.117501 -0.0166002 +-0.0178266 0.0947205 0.0526193 +0.000481761 0.10723 0.0430499 +-0.013526 0.162053 -0.0127433 +-0.0186103 0.042208 -0.0281438 +-0.0252891 0.0336623 -0.0225985 +0.00751041 0.0688465 0.0554032 +0.0252903 0.0675893 -0.0238235 +-0.065902 0.112354 -0.012152 +-0.0476622 0.0620749 -0.0123691 +-0.0940806 0.122789 0.0152778 +-0.0229201 0.115998 -0.0147881 +-0.0344826 0.0519106 0.0380623 +-0.0890068 0.11621 0.0451247 +0.0107555 0.0404168 0.045078 +-0.0894686 0.136415 0.011209 +-0.0757697 0.145819 -0.00688494 +-0.071833 0.152571 -0.043913 +0.0235861 0.0352777 0.0154316 +-0.0926495 0.129588 0.0122381 +-0.0647445 0.0780775 -0.0178137 +-0.00582898 0.0896214 -0.0360418 +0.0559073 0.0721087 0.0082759 +-0.0261702 0.0823861 0.0514348 +-0.0558857 0.0970202 -0.0212239 +-0.0630553 0.148575 -0.0182369 +0.00714931 0.123902 0.0338795 +0.0304322 0.0902625 -0.0195701 +-0.0137593 0.0388335 -0.0101314 +0.0427673 0.0818692 0.0284169 +-0.0651233 0.155698 0.0103085 +-0.0897032 0.113874 0.0229056 +-0.0447211 0.129823 0.00637961 +-0.0575 0.0588269 0.0212602 +0.0104936 0.11823 0.0368787 +0.0202805 0.12337 -0.00295598 +-0.0340138 0.155107 0.00155033 +0.0602047 0.0622908 0.0181797 +-0.0859874 0.153017 0.0132012 +0.0433237 0.0846089 -0.00479162 +-0.0678527 0.0937535 -0.0166708 +0.0608755 0.0651235 0.0141559 +-0.0737739 0.0878479 -0.0153893 +0.0296171 0.11988 0.0191943 +-0.00324005 0.038276 0.0477168 +-0.0806315 0.139432 0.0474021 +0.0455013 0.0583861 0.0319381 +-0.0740734 0.172255 -0.0349568 +0.0224678 0.0975265 0.046211 +-0.0525514 0.0389481 -0.0113995 +0.0281531 0.119463 0.0257844 +-0.0765864 0.155527 -0.0189073 +-0.0289503 0.0931616 -0.025199 +-0.0573663 0.0338673 0.0217593 +0.0396386 0.064502 0.0326274 +0.00539495 0.0433546 -0.0245866 +0.0256558 0.0782254 0.0477034 +0.0162437 0.0764684 -0.0291666 +0.0272037 0.100805 0.0412523 +-0.0316694 0.0357391 0.0272619 +-0.0623836 0.163119 -0.0315939 +0.0275463 0.095549 0.0435012 +0.0393856 0.0475887 -0.00567863 +-0.0394934 0.163848 0.00245451 +0.0242993 0.0928305 -0.0222726 +-0.0271788 0.0358787 -0.0194139 +-0.0734977 0.124615 0.0532793 +-0.0883817 0.123968 0.00128346 +-0.0257849 0.174205 -0.0110873 +-0.0281104 0.163768 -0.0157424 +-0.0662143 0.0386042 0.0318887 +-0.0109132 0.103533 -0.0236899 +-0.0616548 0.140062 -0.00630976 +-0.060057 0.135486 -0.00665791 +0.0434691 0.0624283 0.0290897 +-0.0236196 0.0436733 -0.0286374 +0.043495 0.0610671 0.0301862 +-0.0910584 0.133686 0.0122173 +0.0291029 0.0938741 -0.0193597 +-0.0261534 0.0383869 0.0314189 +0.00850666 0.0896726 0.0548038 +-0.0247527 0.0340557 -0.0209813 +-0.0186132 0.0436215 -0.0279143 +-0.0124858 0.0911558 0.0565265 +0.0053433 0.0524636 -0.0297405 +0.0403239 0.0999619 0.0261672 +-0.0522155 0.149331 0.0183918 +-0.0534968 0.0973516 0.0432358 +-0.0284959 0.10431 0.0415782 +-0.0908913 0.139194 0.0171389 +0.0264487 0.0948748 -0.0204583 +-0.0834511 0.149763 0.0335021 +-0.00425208 0.0941246 -0.0337645 +-0.0337113 0.0652961 -0.0165207 +-0.0405229 0.128682 0.00643622 +0.025364 0.0547555 -0.0216571 +0.0209176 0.124997 0.0245115 +0.0147936 0.104084 -0.0202238 +-0.0510936 0.156101 -0.00485677 +-0.00104637 0.116277 -0.0172455 +-0.0564804 0.0613799 -0.00459099 +-0.0261657 0.11885 -0.0117616 +-0.0612216 0.155927 0.0131437 +-0.0264503 0.181668 -0.00853376 +0.0163083 0.0594423 -0.028212 +-0.0188061 0.081321 -0.0390856 +-0.0660982 0.156586 -0.0534726 +-0.0596936 0.155857 0.0122367 +-0.0656404 0.0608118 0.00501538 +0.00550383 0.0716948 0.0562222 +-0.0473457 0.134062 0.00939848 +0.0233312 0.0436331 0.0404882 +0.0342215 0.0827959 -0.0185003 +0.00407718 0.131556 0.00833758 +-0.0524976 0.0931679 0.0439324 +-0.0206125 0.0553712 0.0467047 +-0.0499367 0.0345722 0.0419808 +-0.0720303 0.169416 -0.0480254 +0.0463102 0.0820482 0.0101764 +0.0239273 0.0383233 0.0327312 +-0.0556472 0.0657358 0.0349277 +0.0082124 0.0879974 -0.0324239 +-0.0483251 0.123967 0.0299918 +-0.00979541 0.0826872 -0.0380854 +-0.0104818 0.0688481 0.0551963 +-0.0738713 0.116445 -0.00712552 +-0.0783268 0.0804305 0.0341941 +-0.0318616 0.0386777 -0.0303614 +-0.0685663 0.0335043 0.000153325 +0.0419445 0.0972272 0.0251571 +-0.0324967 0.0831278 0.0417023 +-0.0385753 0.165326 0.00202421 +-0.0574991 0.105703 0.0407441 +-0.0735089 0.120392 0.0535609 +-0.0194999 0.105809 0.042534 +-0.0918084 0.11461 0.0202058 +0.0373089 0.0604869 0.0345236 +-0.0397982 0.0885212 -0.0227204 +-0.0838603 0.0771078 0.0156983 +-0.0683511 0.16683 -0.0228013 +0.00825384 0.0357096 0.0264477 +-0.0487592 0.0797294 -0.0200154 +-0.067984 0.13847 -0.00792156 +-0.0205709 0.127392 0.00935219 +0.0158596 0.0940217 0.0494261 +-0.00476401 0.100643 0.0463697 +-0.0144795 0.0617481 0.0535104 +-0.0635003 0.0931972 0.0443921 +-0.06148 0.0371866 -0.00855801 +-0.0235696 0.0368882 0.0541538 +-0.00084278 0.129714 0.0251926 +-0.0857238 0.0792489 0.0165033 +-0.00382707 0.0868147 -0.0366286 +-0.0623716 0.0433162 0.04063 +-0.0481783 0.127343 -0.00452632 +0.0258208 0.0577421 -0.0227411 +-0.0464997 0.109825 0.0383354 +-0.0632202 0.150553 -0.0275915 +0.0594014 0.060828 0.00515272 +-0.0379322 0.0359407 -0.029738 +-0.0628566 0.163115 -0.0590591 +0.032875 0.0504741 0.0332188 +-0.0798256 0.114817 -0.00349908 +0.00979876 0.0631089 0.0545118 +-0.00479883 0.0826783 -0.0376925 +-0.0586564 0.152453 0.0326111 +-0.0847868 0.0979024 0.0288114 +-0.0248237 0.0853842 -0.0372699 +-0.00156343 0.13088 0.0191419 +-0.0624949 0.0729745 0.0395167 +-0.0208752 0.105853 -0.0224653 +0.0381305 0.0743398 -0.0117665 +0.00679871 0.128004 -0.00391746 +-0.0769289 0.125211 -0.00745968 +-0.0251918 0.111615 -0.0181703 +-0.0538836 0.0984784 -0.021806 +-0.0535445 0.0444164 -0.0080927 +0.0449223 0.0903552 0.00117592 +0.00748556 0.116867 0.0384917 +0.0479919 0.0426572 0.0134999 +0.0269115 0.116892 -0.00595645 +0.0287509 0.0911639 -0.0204971 +-0.00583539 0.0910195 -0.0356702 +0.0122548 0.126063 0.0299441 +-0.0732964 0.0791377 0.0376894 +-0.0578898 0.108324 -0.0176181 +-0.0316803 0.111369 -0.0179291 +-0.00248889 0.101618 0.0440339 +0.0583601 0.0593964 0.0227402 +-0.0568793 0.105485 -0.0183902 +0.0313941 0.108732 0.0332945 +-0.0104953 0.0801622 0.0580036 +-0.0799858 0.150056 0.000166757 +-0.0448968 0.146123 0.00263093 +-0.0595037 0.0344238 0.0383245 +-0.0836036 0.133464 -0.00169527 +-0.0115063 0.0575113 0.0530742 +-0.0112578 0.037897 0.0501369 +-0.0404967 0.071918 0.0419528 +-0.024201 0.0373653 0.0542269 +-0.063129 0.0366622 0.0429743 +0.0461067 0.069238 0.0238359 +-0.0217169 0.0945664 0.0494448 +0.0519577 0.0621966 0.0293389 +0.0286828 0.072686 0.0432253 +0.0389262 0.103315 -0.00332456 +-0.0908979 0.126784 0.00627265 +-0.0604951 0.097348 0.0432235 +0.00320361 0.0838721 -0.0343861 +-0.0615214 0.155998 0.0173864 +0.0174482 0.090927 -0.0262636 +-0.0428815 0.108469 -0.0193857 +0.0528827 0.0476533 0.00520477 +-0.0692155 0.155426 0.0044718 +-0.0116319 0.126956 0.0271535 +0.0555832 0.0661715 0.0258304 +-0.0669079 0.139705 0.0437201 +0.0208911 0.120687 0.0321527 +-0.0692559 0.157013 -0.00287665 +-0.0642658 0.131126 0.0422113 +-0.00350345 0.108655 0.04343 +0.00595359 0.131311 0.0061803 +-0.0652676 0.179645 -0.0602668 +0.0113097 0.0609536 -0.0296395 +0.0202287 0.0385462 -0.010699 +-0.0528896 0.0556157 0.0124842 +-0.0830831 0.152763 0.0275295 +-0.0929926 0.121477 0.0272936 +-0.0679169 0.115123 -0.00939662 +-0.0715189 0.150138 -0.0417489 +0.0502478 0.0496891 0.0267596 +-0.088826 0.122625 0.00229599 +0.045739 0.0876044 0.00618298 +0.0276204 0.0364605 0.0224657 +0.0550864 0.0576626 -0.000774412 +-0.0601415 0.0397484 0.0187938 +-0.0467117 0.131872 0.0218067 +-0.00211002 0.131247 0.0146415 +0.0400335 0.107013 0.011165 +-0.0875275 0.141918 0.0101858 +-0.0321386 0.0511687 -0.0124242 +-0.05996 0.047085 0.0381143 +-0.0771576 0.158311 -0.0229061 +-0.0910473 0.139231 0.0181913 +0.0586943 0.0552354 0.0191792 +0.0541025 0.0616928 -0.00172111 +0.0193458 0.0347743 -0.00166328 +-0.0785503 0.175004 -0.046006 +0.0361753 0.0767902 0.0382584 +-0.00218115 0.0950603 -0.0327048 +-0.00446475 0.03907 -0.00848801 +-0.0509412 0.0543847 0.0317288 +-0.031974 0.126184 0.0154629 +-0.0517139 0.047497 0.0206563 +0.0390432 0.106963 0.0211652 +-0.0661031 0.169296 -0.0348743 +-0.0461189 0.0353483 0.0438447 +-0.0618314 0.155872 0.0114752 +-0.0414861 0.169687 0.00162271 +-0.0640913 0.154089 -0.00821335 +-0.0474977 0.0776489 0.0433419 +-0.000495324 0.0870356 0.0569136 +0.0572432 0.0508915 0.0131865 +0.0162675 0.0348087 0.0361219 +-0.0561497 0.0697401 0.0384165 +-0.0632023 0.166731 -0.0605917 +-0.0297129 0.0382953 0.00190139 +-0.00511763 0.0345398 -0.0175639 +-0.0614326 0.0342559 0.0293559 +-0.0526737 0.0678526 -0.0129346 +0.0213104 0.092205 -0.0236008 +0.0197097 0.119321 0.0339587 +-0.0214979 0.120818 0.0311972 +0.0121652 0.0940439 -0.0275601 +0.0264769 0.122884 0.00946172 +-0.0236707 0.0536853 -0.0289139 +-0.0413464 0.0470648 -0.0139804 +0.0254796 0.122858 0.0219249 +-0.0924012 0.125564 0.030262 +-0.0879683 0.133795 0.0435491 +-0.0521211 0.0500618 0.0133132 +-0.0655655 0.115703 0.0473772 +-0.0739163 0.0808829 -0.0136046 +-0.0678507 0.166619 -0.0550103 +-0.0116556 0.127143 -0.00273206 +-0.0318682 0.101497 -0.022474 +-0.0710899 0.143489 -0.012899 +-0.0174739 0.0587291 0.0509898 +-0.0238083 0.125586 0.00234805 +-0.0296624 0.0691842 -0.029462 +0.00123889 0.0998292 0.0485145 +-0.0648099 0.0910089 -0.0186372 +-0.0624633 0.170945 -0.051605 +-0.0911968 0.145718 0.0253129 +-0.0208075 0.0827095 -0.0389174 +-0.0156288 0.184043 -0.0262877 +0.0422094 0.0873179 -0.00779978 +0.00273738 0.0943137 -0.0318997 +-0.082233 0.0925905 0.0320729 +-0.0782161 0.110396 0.044452 +-0.0842181 0.153993 0.0196689 +-0.00949468 0.0532459 0.0520833 +-0.0867806 0.115997 0.0469199 +-0.0547757 0.0826557 -0.0215494 +-0.0382309 0.0365042 0.0436563 +0.021227 0.0727783 0.05004 +-0.00441949 0.0338393 -0.022426 +-0.0712771 0.0648585 0.00216525 +-0.0364976 0.111093 0.0360234 +-0.0669244 0.123843 -0.00898539 +-0.0178669 0.0554748 0.0496143 +0.020489 0.0906324 0.0482147 +-0.00549595 0.0605287 0.0555985 +-0.0289733 0.0536405 -0.0223788 +0.0191474 0.0435971 0.0432171 +0.00434602 0.0346139 0.0410512 +-0.0400219 0.111533 -0.0180322 +0.012127 0.0534588 0.0507501 +0.0284176 0.0415874 -0.00471776 +-0.0270737 0.125279 0.00405866 +-0.0221888 0.0348068 0.0442295 +-0.0447592 0.0797381 -0.0197229 +-0.0304968 0.172715 -0.00561384 +-0.0762362 0.0865455 -0.0135615 +0.0197685 0.0371215 -0.00768223 +0.0379293 0.0417908 0.0270611 +-0.0809612 0.0747382 0.0015261 +0.00168043 0.0346784 0.042239 +0.0257721 0.0915784 0.0461947 +-0.0898405 0.133789 0.0312158 +-0.0355388 0.0441134 -0.0275262 +0.00710192 0.0379595 0.027814 +-0.0620019 0.0401372 0.0237075 +0.0429025 0.100097 0.0151567 +-0.00267325 0.0569172 -0.0326724 +-0.0285904 0.110146 -0.0186081 +-0.0762074 0.0906406 -0.013533 +0.0535161 0.0677623 0.0259787 +-0.00262958 0.0466399 -0.0290845 +-0.0839307 0.125043 -0.00388859 +-0.0340047 0.0386047 -0.0302796 +0.0184751 0.082463 0.0515958 +-0.0574796 0.115365 0.0367006 +-0.0420623 0.154724 -0.00848194 +-0.0860758 0.0924352 0.0274562 +-0.0930739 0.122895 0.0382751 +0.051883 0.0734548 0.0112114 +-0.0811474 0.0769537 0.0251701 +-0.0618709 0.0338217 0.0137712 +0.0195119 0.0370935 -0.00868114 +0.00449835 0.0590783 0.0547231 +-0.0645467 0.148975 -0.0280488 +0.0404587 0.0426892 0.0267677 +-0.0712073 0.146616 -0.0240304 +-0.0512571 0.0488673 0.0206327 +-0.00789661 0.098211 -0.0280331 +-0.0821992 0.0980013 0.0318751 +0.0249936 0.037232 0.0266864 +-0.00349731 0.0456721 0.0469862 +0.0464132 0.0472054 -0.00271728 +-0.0659208 0.0390922 0.037189 +-0.0655814 0.167928 -0.031824 +-0.0726143 0.1704 -0.0286759 +-0.032982 0.0423452 0.0495212 +-0.0442602 0.153622 0.00782588 +0.0320708 0.117667 0.00585111 +0.0181014 0.0354956 -0.0136744 +-0.0756189 0.168382 -0.0269354 +-0.0302725 0.114038 -0.0167089 +-0.06455 0.166996 -0.0328772 +-0.0136948 0.125921 0.0278767 +-0.0594946 0.0973472 0.0432255 +-0.0660053 0.138467 -0.00776776 +-0.0538886 0.161243 -0.000916627 +-0.0521229 0.0491646 0.0356345 +-0.0669695 0.167967 -0.0280306 +-0.0692702 0.0635509 0.00193084 +-0.057893 0.109749 -0.0172343 +0.0162169 0.116863 -0.0139359 +-0.0837452 0.0818387 0.0274964 +-0.0188705 0.104448 -0.0228566 +0.017085 0.0604224 0.0492086 +-0.0636469 0.11387 0.0394431 +0.0060852 0.126695 -0.00651247 +-0.0563559 0.0448266 0.0148606 +-0.0534962 0.0959644 0.0436141 +0.0587007 0.0538335 0.0141792 +0.00148321 0.105804 0.0429258 +-0.0696571 0.0662079 0.0262916 +0.0292497 0.0745452 -0.0220465 +-0.0363535 0.0380033 0.0459253 +-0.0388642 0.104209 -0.02036 +0.0363189 0.106784 -0.00482843 +-0.0506381 0.0473796 0.0176699 +0.0415736 0.0738523 0.0301911 +0.00841968 0.0357631 -0.0122614 +-0.0449132 0.130768 0.0151196 +-0.0348253 0.0822923 -0.0236386 +-0.0756565 0.0672218 0.011813 +-0.0840475 0.0856522 0.0284432 +0.0358352 0.11315 0.0115155 +0.0378536 0.10688 -0.000832307 +0.0327708 0.0862789 0.0422215 +-0.0510409 0.034583 0.0365198 +0.0285939 0.108783 0.0362583 +-0.0291219 0.163733 -0.0155493 +-0.0075062 0.071811 0.0576623 +-0.0285902 0.125327 0.00496117 +0.022493 0.120697 0.0309281 +-0.081164 0.0734408 0.004547 +-0.011709 0.0628424 -0.0363307 +-0.0258651 0.101595 -0.0237434 +0.0205831 0.11206 -0.0147671 +0.0444356 0.0931566 0.0191609 +-0.04739 0.113671 -0.0162364 +-0.0489307 0.0334882 -0.00491951 +-0.0129236 0.118879 -0.0139348 +-0.0161652 0.0382063 0.017415 +-0.00495697 0.0978375 0.052341 +-0.0277397 0.0605536 -0.0284245 +-0.00547292 0.0385489 0.021098 +-0.00115741 0.0949656 -0.0326157 +-0.0444374 0.124419 -0.00954541 +-0.0821611 0.0761834 0.00152312 +-0.0144467 0.0348076 0.0441223 +-0.0715687 0.153984 -0.0439053 +-0.00636015 0.130593 0.00877385 +-0.0127796 0.0382227 0.0144711 +0.0370519 0.110502 0.0205344 +-0.0322265 0.0637977 -0.0184499 +-0.0106706 0.054151 -0.0336931 +-0.0455975 0.169625 -0.00241942 +0.0182033 0.0435661 0.0436183 +-0.0718144 0.147892 -0.0304457 +-0.0577521 0.050802 0.00265023 +-0.0586963 0.0588331 0.00348495 +-0.0866227 0.109058 0.0173532 +-0.0383512 0.122877 -0.00994551 +-0.070675 0.0778663 -0.0147995 +-0.0181879 0.174194 -0.0234207 +-0.0587357 0.153161 0.0315118 +-0.0350971 0.16074 -0.013448 +0.00536912 0.049521 -0.0287338 +-0.0474407 0.134003 0.00841493 +-0.0624554 0.1522 -0.0115838 +-0.0760236 0.150016 -0.00789124 +-0.0261434 0.0379494 0.0119939 +-0.068707 0.0613453 0.00749837 +0.0495547 0.0702574 0.0035522 +0.0608929 0.0651253 0.0121512 +0.0417276 0.0683416 0.0285931 +-0.0322652 0.177059 -0.0129859 +-0.027328 0.0951114 -0.0248637 +-0.0207784 0.0714012 -0.0384405 +-0.0483231 0.128062 -0.00327126 +-0.0424968 0.0449805 -0.0163196 +-0.0550216 0.142767 -0.00162505 +-0.0444981 0.112567 0.0357183 +0.039909 0.107011 0.00616363 +0.0103602 0.0524141 -0.0291489 +-0.0621527 0.0372105 -0.00831557 +0.0052003 0.124064 -0.00964829 +0.0584567 0.0701808 0.018095 +0.0154065 0.0880419 -0.0292971 +-0.0675878 0.0672405 -0.0057657 +0.0141143 0.129082 0.00347211 +-0.0769907 0.154191 -0.00889586 +-0.0351753 0.160922 -0.000113952 +-0.0865124 0.0819745 0.0105022 +-0.0802058 0.0759672 -0.0035211 +0.0412042 0.046738 0.0312341 +0.0531089 0.0539671 0.0274209 +-0.0202736 0.0966137 -0.0264451 +-0.021864 0.108885 -0.0213157 +0.0172909 0.0900542 0.0497289 +0.0151151 0.0645034 0.0516546 +-0.00371721 0.100591 0.046739 +-0.0281684 0.117044 -0.0138686 +0.044615 0.0762444 0.0239446 +0.00250222 0.0504849 0.0522926 +-0.0407291 0.0724971 -0.0177035 +-0.076873 0.114866 -0.00505023 +-0.0509699 0.0334609 -0.0108109 +-0.0307494 0.125973 0.00854668 +-0.0842046 0.10344 -0.000635192 +-0.0637785 0.0335481 0.00468656 +0.0573103 0.0709688 0.0191461 +-0.0548852 0.0344475 0.0323271 +-0.0566985 0.0694351 -0.0145553 +0.0116873 0.128578 0.0254498 +-0.0635208 0.0384034 0.0165311 +-0.0193913 0.161115 -0.00536021 +-0.0517184 0.0708739 -0.0153462 +-0.0355107 0.0789772 0.0422885 +-0.0308674 0.0359912 0.0254031 +-0.0496962 0.137023 0.0203775 +-0.000496498 0.0549075 0.0548747 +0.0203519 0.0506032 0.0432764 +-0.00603714 0.0387093 0.0280658 +-0.0424971 0.165251 0.00449932 +-0.088747 0.148763 0.0102254 +0.0140119 0.072675 0.0536492 +-0.0355033 0.109745 0.0370663 +-0.0495176 0.0451863 0.0426306 +0.0161864 0.128058 0.00281004 +-0.0689044 0.110844 -0.0111483 +-0.0648164 0.0412793 0.0318749 +-0.0594946 0.0959853 0.0440949 +-0.0201946 0.0918367 -0.0355405 +-0.00451061 0.0534011 0.0538125 +-0.0256167 0.0422692 -0.0291044 +-0.0366019 0.0472824 -0.0203909 +-0.0714721 0.152551 -0.0449162 +-0.0686495 0.0395764 0.0103048 +-0.0916814 0.147477 0.020141 +0.0344933 0.0646793 0.0392567 +0.0354037 0.0848596 0.0389463 +0.0335837 0.114911 0.0235455 +-0.00948608 0.0488348 0.0496357 +0.0162564 0.0875946 -0.0288434 +-0.0495004 0.0876335 0.045502 +-0.00788756 0.107371 -0.0226705 +0.0279061 0.0479696 -0.0147397 +-0.0593675 0.145365 0.0352791 +-0.0297371 0.179987 -0.0120259 +-0.00152895 0.1273 -0.00507098 +-0.053021 0.0473885 0.0142865 +-0.031661 0.0351392 -0.0196159 +-0.0428508 0.127424 0.0174253 +0.00853656 0.103079 0.0455737 +-0.0428329 0.0928281 -0.0227901 +-0.0533229 0.121583 -0.0104498 +-0.0281276 0.163902 -0.00573037 +0.00550696 0.0647473 0.0560963 +-0.0786632 0.155487 0.0200952 +0.0373574 0.0841251 -0.0157743 +0.00845531 0.04577 0.0469205 +-0.0816426 0.140732 0.045535 +-0.0198636 0.184564 -0.0147357 +-0.0441 0.149758 -0.00480897 +-0.0394895 0.0478295 0.0398724 +-0.0902912 0.136455 0.0152001 +-0.0912584 0.116106 0.0417079 +-0.078373 0.161039 -0.0249642 +-0.0823003 0.143183 0.00115625 +-0.0366712 0.0621691 -0.0130418 +0.0483193 0.0518215 -0.00445791 +-0.0647832 0.179003 -0.0560548 +-0.066692 0.1555 0.0271809 +0.0251524 0.123931 0.0146708 +-0.0729716 0.175028 -0.0520538 +0.0249807 0.0645674 0.0448324 +0.0189844 0.127654 0.0109555 +-0.023546 0.114036 0.0366055 +-0.0166929 0.178668 -0.0190282 +-0.0838411 0.0884243 0.0295799 +0.0340178 0.106064 0.0317678 +0.0172301 0.0834905 -0.0285819 +-0.0836745 0.0939124 0.0306595 +0.00650612 0.0856084 0.0565927 +-0.00650337 0.0633626 0.0562557 +0.00724714 0.123914 -0.00950504 +-0.04049 0.0677003 0.0417506 +-0.083014 0.0816043 0.0289568 +-0.0791181 0.10724 -0.00560787 +-0.0643983 0.155173 -0.0416037 +-0.0194853 0.0382676 0.0257029 +0.017193 0.0407686 0.0438767 +-0.0578741 0.0997697 -0.0193936 +-0.00470039 0.0340249 -0.0188849 +0.009491 0.0923319 0.053062 +-0.0679779 0.0615132 0.00568001 +-0.00851004 0.0960786 -0.0317903 +0.0222567 0.0734747 -0.02675 +0.0396829 0.102719 -0.00275708 +0.0333394 0.0519958 0.0339463 +-0.0317958 0.166782 -0.0057687 +-0.0851069 0.104842 0.00238218 +0.040355 0.0712163 0.0319238 +-0.0796414 0.0719293 0.00453596 +-0.00871509 0.0670095 -0.035665 +-0.04676 0.0797358 -0.0197068 +0.00759602 0.120603 -0.0139518 +-0.00757253 0.0384534 0.015324 +0.027396 0.0902329 0.0450202 +-0.0837001 0.104608 0.0275279 +-0.0648437 0.159826 -0.0567739 +-0.0182921 0.113707 -0.0184295 +-0.0318101 0.0499111 0.0410759 +0.0042017 0.130577 0.0226921 +-0.0882785 0.102304 0.00940329 +-0.0669196 0.157864 -0.00782765 +-0.0574974 0.104327 0.0414929 +-0.028183 0.0499752 0.0445203 +0.0437475 0.087439 -0.00380588 +0.047365 0.0735855 0.0109418 +-0.0355275 0.04785 0.0396404 +-0.00564979 0.0511569 -0.0315211 +-0.0622081 0.163133 -0.0355907 +-0.0126796 0.0555759 -0.033924 +-0.0434133 0.12436 -0.00948612 +0.0325363 0.0605817 0.0399114 +0.00828387 0.0859903 0.0560092 +-0.0377619 0.0480619 -0.0149351 +-0.0152064 0.0377587 0.0513804 +0.0337034 0.0740969 0.0399489 +0.0386678 0.106943 0.0231645 +-0.0568902 0.10122 -0.0192994 +-0.0629975 0.158364 -0.0415982 +0.0174963 0.116768 0.0361173 +-0.018574 0.174216 -0.0164984 +-0.0916005 0.147489 0.0211447 +0.0351839 0.113522 0.00409669 +-0.0642224 0.175708 -0.0529566 +-0.0646189 0.0691309 -0.0109873 +-0.0744709 0.159641 -0.0299365 +-0.0810037 0.0777776 0.0280061 +-0.0468539 0.0397424 -0.0132276 +-0.0387576 0.152152 0.00343994 +-0.0355301 0.0350253 0.0446914 +-0.0252945 0.179999 -0.0179968 +-0.0594833 0.0440844 0.0256893 +-0.0262483 0.175689 -0.00998917 +-0.0357 0.0344414 0.0311095 +-0.0348452 0.0957896 -0.0233484 +-0.0694619 0.0701676 0.0334316 +-0.0704025 0.156596 -0.000355665 +0.0197946 0.0872171 -0.0264236 +-0.00225576 0.119004 -0.0141489 +0.0447595 0.0819096 0.000199099 +-0.0414725 0.16704 -0.0108149 +0.0383695 0.0533606 -0.00654853 +0.0436976 0.0763605 0.0261605 +-0.059412 0.0342492 0.0297869 +-0.0105538 0.0962042 -0.0319333 +0.0354985 0.0483762 0.03122 +-0.0232213 0.183101 -0.0108227 +-0.0454832 0.0704956 0.0415155 +-0.0818632 0.143391 0.0428465 +-0.00588211 0.0384235 0.0193174 +-0.0715611 0.065876 0.0226562 +-0.0557658 0.0561367 -0.00241411 +-0.007704 0.0613485 -0.0352024 +-0.050582 0.13546 0.000440434 +-0.0239591 0.0958294 0.044594 +-0.0344217 0.156595 0.00275895 +-0.0721769 0.146332 -0.0246714 +-0.00172768 0.0683482 -0.0343533 +0.0465137 0.0736858 0.00606841 +-0.0379081 0.0345108 0.0393807 +-0.0536272 0.0632225 -0.00927695 +0.0216001 0.0346735 0.00635285 +-0.00546011 0.130518 0.00622904 +0.025022 0.0994981 0.0433749 +-0.059626 0.14292 -0.00334389 +-0.0662647 0.160967 -0.0574681 +-0.086688 0.0937529 0.026595 +-0.0292509 0.122699 0.0223824 +-0.020881 0.0609703 0.0467992 +-0.0727056 0.0704556 0.030746 +-0.0670342 0.154632 -0.0510962 +-0.0818617 0.117704 -0.00327392 +-0.00930377 0.0384012 0.0113924 +-0.0294534 0.0382504 0.0532249 +-0.0428028 0.034428 0.0296237 +0.034591 0.113857 0.0224952 +0.0260945 0.0981604 0.0431638 +0.0157288 0.0740195 0.0526622 +0.00528348 0.0654438 -0.0329345 +0.0342272 0.113045 -0.000582475 +0.0177023 0.127344 0.0204737 +-0.00349601 0.0619414 0.0556852 +-0.0633856 0.13531 0.0381918 +-0.0187732 0.0742782 -0.038946 +-0.0714922 0.124606 0.0531293 +-0.0387588 0.0432047 -0.0253505 +-0.0377685 0.112865 -0.0174473 +-0.0811078 0.0831466 0.0326628 +0.0121734 0.0347014 0.0407838 +-0.0423463 0.0344667 0.0367209 +-0.0247884 0.0905387 0.0498003 +-0.0589097 0.111154 -0.0162513 +-0.0119878 0.0389387 -0.0117395 +-0.0746688 0.0730125 -0.00771761 +-0.0636783 0.0344406 0.016873 +-0.0718387 0.063614 0.0140147 +-0.0537353 0.0753205 -0.0183524 +0.0399868 0.0793585 0.0332409 +0.0342696 0.0686799 0.038964 +0.0283038 0.121367 0.00870899 +0.020694 0.101208 -0.0211426 +-0.0607079 0.149875 -0.000940868 +-0.0663226 0.0771733 0.0404118 +-0.0856352 0.151298 0.0280417 +0.00450086 0.0533884 0.0535142 +0.0193556 0.0370965 -0.0106758 +-0.073245 0.152646 -0.0348949 +-0.0311279 0.168264 -0.00654632 +-0.0314769 0.122323 0.024544 +-0.00965298 0.0383614 0.0149817 +0.0322912 0.117174 0.00450048 +-0.0303956 0.0833549 -0.0325649 +-0.0305081 0.109824 0.0377476 +0.060267 0.0581373 0.011162 +-0.0782363 0.119072 0.0512696 +-0.0819743 0.130956 -0.00393996 +0.0125568 0.129953 0.0057397 +-0.0750314 0.165158 -0.038026 +-0.0842614 0.0857549 -0.00354776 +-0.0194949 0.122198 0.0303074 +-0.0885869 0.0914877 0.00746285 +0.0183032 0.0622432 -0.0278633 +-0.0188389 0.0383463 0.00224079 +0.0169223 0.0354899 -0.0154522 +-0.0510859 0.154625 -0.00472421 +-0.04134 0.171235 -0.00891614 +-0.00271064 0.0641639 -0.0348647 +-0.0404957 0.119327 0.0301663 +0.0161104 0.038261 0.0437952 +-0.0788559 0.0706244 0.0187647 +-0.0565382 0.0387829 -0.00997998 +0.00406092 0.0347375 0.0390843 +-0.052431 0.0503969 0.0246465 +-0.0548238 0.136818 -0.00273484 +-0.0168361 0.163394 -0.0165332 +0.0085002 0.0589241 0.0531764 +-0.00349833 0.104479 0.0440938 +0.041165 0.0675922 -0.00677134 +-0.0766837 0.0941158 0.0377884 +-0.0715005 0.108276 0.0374406 +-0.0514917 0.154976 0.0111 +-0.0766573 0.0758638 -0.0078194 +-0.0708734 0.116483 -0.00801313 +-0.0584915 0.0333664 -0.00308936 +-0.0132404 0.0420117 0.0507817 +0.0504568 0.0627892 -0.00292241 +0.0181009 0.0617863 0.0489038 +-0.0686053 0.155434 -0.0518073 +-0.0866142 0.111799 0.023338 +-0.0087012 0.0613261 -0.0351009 +-0.0667075 0.179209 -0.0538653 +0.0133269 0.036855 0.044466 +-0.0308424 0.0930072 -0.0244625 +-0.0526579 0.118327 0.034303 +-0.0802651 0.0940224 0.034298 +-0.0895241 0.094286 0.0154262 +-0.0580951 0.0448084 0.0137644 +0.0187472 0.0369987 -0.01368 +-0.0174935 0.0786826 0.056671 +-0.026682 0.0779832 0.0478067 +0.0449566 0.0931917 0.0141646 +-0.0598355 0.0968573 -0.0194316 +-0.015743 0.0388551 0.0331436 +0.045657 0.07639 0.00319799 +0.00221136 0.0782941 -0.0352071 +-0.0725589 0.0360747 0.00146649 +-0.0641358 0.117113 0.0460384 +-0.0709488 0.0833216 0.0408543 +0.0230126 0.0366914 0.0285839 +0.0164832 0.101772 0.0464774 +-0.0114886 0.10724 0.0431864 +-0.0748949 0.0968349 0.0387401 +-0.0428468 0.0368545 0.044028 +-0.0121243 0.183164 -0.0282842 +-0.0110799 0.0973863 0.0517395 +-0.0283441 0.0346627 0.0430398 +-0.0591236 0.0454581 0.0276809 +0.0359903 0.0834983 0.0380665 +-0.0894731 0.112826 0.0381953 +-0.0633619 0.165109 -0.0324564 +-0.0893245 0.139298 0.0361742 +-0.0113718 0.177173 -0.0236196 +0.0314957 0.0386039 0.0249642 +-0.0153586 0.171251 -0.0171482 +-0.0501632 0.165541 -0.000963216 +-0.0125979 0.0362885 -0.0258846 +-0.0109041 0.121705 -0.010941 +-0.01134 0.181374 -0.0292688 +-0.0636417 0.067527 -0.00924444 +-0.0645561 0.151545 -0.0345673 +0.0234128 0.0685823 0.0460905 +-0.0204536 0.184888 -0.0139868 +-0.0362035 0.16829 0.000195359 +-0.0423655 0.0354607 0.0428683 +0.029434 0.0414849 -0.00426139 +-0.0548859 0.0335879 0.0154264 +0.0301337 0.0958138 -0.0174156 +-0.0231819 0.174173 -0.0207431 +0.0495183 0.0596792 0.0306871 +-0.0615314 0.169388 -0.0555899 +-0.0645149 0.156191 0.0192193 +-0.0808163 0.150056 0.00117383 +-0.0203106 0.127423 0.0152774 +-0.048501 0.0946267 0.0446158 +-0.0621404 0.0458224 0.0356845 +0.014817 0.0713159 0.0530708 +-0.0482359 0.0600875 0.0359237 +0.0583839 0.0607371 0.00317993 +0.0532979 0.0476993 0.0202039 +-0.00334167 0.13115 0.0113211 +-0.0451105 0.146112 0.00345863 +-0.0728436 0.0965116 -0.0147387 +-0.00290701 0.128667 -0.00250924 +-0.0175351 0.0472943 0.0498404 +-0.0710465 0.156278 0.000878407 +0.0130461 0.106823 -0.0191157 +-0.0241467 0.169732 -0.0193183 +0.0184844 0.092024 0.0477707 +-0.0849646 0.0925759 -0.00355765 +-0.0135115 0.0617879 0.0541775 +0.0358003 0.0371828 0.0161878 +-0.0563756 0.0338236 0.0220041 +-0.0344987 0.119335 0.0301753 +-0.0207895 0.0363821 -0.0186131 +0.0366896 0.0394563 0.0234361 +0.0454465 0.0903989 0.00417224 +-0.0686026 0.0339552 0.0087048 +-0.0248008 0.0797877 -0.0377608 +-0.0253831 0.0645504 -0.0324979 +-0.0924079 0.114699 0.0153245 +0.0404169 0.104204 0.0201615 +-0.0864551 0.137921 0.0433346 +0.0453383 0.0861836 0.0191712 +-0.0550359 0.12552 0.0379729 +0.0499773 0.0719552 0.0208312 +-0.0878453 0.10502 0.0133698 +0.0226563 0.0416586 -0.00875234 +0.00847112 0.0503629 0.0509458 +0.0193029 0.12103 0.032512 +-0.0288694 0.102979 -0.023086 +-0.0655006 0.155906 0.0116223 +-0.0865291 0.125714 0.0480303 +-0.0762092 0.103511 0.0356214 +0.027039 0.0433782 0.0352623 +-0.00878391 0.0340179 -0.0196776 +0.01688 0.104029 -0.0201606 +-0.0779922 0.155321 0.011561 +0.012978 0.0975651 -0.0232996 +-0.0570356 0.142438 0.0315884 +0.00678439 0.0392286 0.0320303 +-0.0187316 0.184448 -0.0230478 +-0.05583 0.0898375 -0.0220234 +-0.0624118 0.168239 -0.0611966 +-0.019552 0.0381879 0.0203532 +-0.0619388 0.0647772 0.0309092 +-0.0929984 0.129612 0.0152364 +0.0241882 0.0633761 -0.0240832 +-0.0154901 0.11097 -0.019533 +0.0335254 0.101204 -0.0131717 +0.0440036 0.0411539 0.00525252 +0.0443474 0.05051 -0.00579969 +-0.00564997 0.0526431 -0.0322774 +0.024909 0.124002 0.00889289 +-0.0551719 0.0344352 0.0357625 +-0.00149801 0.0828985 0.0574954 +-0.0649207 0.122383 -0.00889091 +-0.0371067 0.163706 -0.0138205 +-0.013511 0.0673225 0.0538556 +-0.0664425 0.121454 0.0513831 +-0.0749127 0.151363 0.0363064 +-0.0786131 0.166659 -0.0369473 +0.0259941 0.0889184 0.046498 +-0.0508607 0.133588 0.0291236 +-0.0624206 0.150641 -0.0155752 +-0.0345377 0.0353482 -0.0311793 +-0.0926334 0.130971 0.0152338 +0.00420379 0.0852404 -0.0337772 +0.0493319 0.0575419 -0.00502247 +0.0210858 0.0848756 0.0499424 +-0.0209282 0.0711316 0.0521839 +-0.0556334 0.121157 -0.00996616 +-0.0578782 0.0955404 -0.0210377 +-0.0636177 0.149382 -0.0259273 +-0.023437 0.0753613 0.0517266 +-0.0424368 0.033567 0.00359466 +-0.0366861 0.0651313 -0.0144389 +0.00275029 0.0392893 0.0311503 +-0.0858603 0.137915 0.0441653 +0.00249981 0.0938632 0.054785 +-0.0405815 0.125646 -0.00686289 +0.00652265 0.0633208 0.0557678 +-0.0736187 0.0665006 0.01992 +0.0178849 0.106917 -0.0172488 +-0.0404999 0.16823 0.00286674 +-0.0578818 0.101192 -0.0190391 +0.0415111 0.0596706 0.0303495 +0.0445386 0.0917351 0.000179816 +0.0404099 0.0926692 0.0304567 +-0.0715386 0.177351 -0.0469381 +-0.00955325 0.129382 0.0220461 +-0.0304508 0.11875 -0.0116176 +-0.0553453 0.138992 -0.00307013 +0.0373215 0.0444316 0.0300039 +-0.0439866 0.0342955 -0.0250034 +0.0438502 0.081834 0.0262681 +0.0105117 0.057471 0.0526043 +-0.0609073 0.0423237 0.0152297 +-0.0566933 0.0478983 -0.00338525 +-0.0882052 0.0955366 0.00643448 +-0.0697305 0.146842 -0.0262196 +-0.0654573 0.131176 0.0439868 +-0.0332792 0.168261 -0.00439757 +0.0262829 0.0520004 0.03955 +-0.0246803 0.0386712 -0.0158919 +-0.0243119 0.0382419 0.00485642 +-0.0650689 0.0416148 -0.00522845 +-0.0224969 0.105778 0.0423492 +-0.0675666 0.163787 -0.0559757 +-0.0625249 0.0642497 0.029495 +-0.066705 0.170483 -0.0379595 +-0.0387912 0.0855771 -0.0218281 +-0.0362227 0.121033 0.0288309 +-0.0351413 0.166693 -0.0148789 +0.0484731 0.0728694 0.00986875 +-0.0715958 0.035386 0.00909438 +-0.0654475 0.0414866 0.0340095 +-0.0897915 0.135018 0.00821888 +-0.0256856 0.161028 -0.00218154 +-0.0294591 0.0367076 -0.0187628 +-0.0318602 0.0341892 0.0214236 +-0.0741619 0.0781636 -0.0115723 +-0.0759684 0.138187 -0.00615578 +-0.0746432 0.067744 0.0203901 +-0.0481968 0.058714 0.0359259 +-0.0809888 0.100705 0.031995 +0.0223647 0.0795488 0.0499944 +-0.0164996 0.0587643 0.0515064 +-0.0843239 0.0775269 0.0169616 +-0.0474174 0.157905 0.00867917 +0.0256365 0.0450396 -0.0116814 +-0.0560862 0.153109 -0.0014946 +-0.0364777 0.0491722 0.0391199 +-0.0353775 0.172711 -0.013245 +0.0345426 0.0361041 0.0132537 +-0.0476575 0.0606291 -0.0121142 +0.0517359 0.0693876 0.00244776 +-0.0895642 0.139283 0.0271809 +-0.0554895 0.087587 0.0448409 +-0.00460242 0.0419996 -0.0255341 +-0.0747436 0.0846695 0.0389578 +-0.0522959 0.0518057 0.0276471 +0.0344259 0.0713949 0.0392126 +-0.0858246 0.111645 0.00429163 +7.90085e-05 0.131159 0.00541676 +-0.0876151 0.1105 0.015342 +-0.0308705 0.0385373 -0.0301935 +-0.0174841 0.088353 0.056296 +-0.0717036 0.179379 -0.0498901 +-0.0872579 0.113355 0.0275168 +-0.0132522 0.180136 -0.0286131 +0.0147067 0.111012 -0.0176211 +0.0100468 0.0698695 0.0549195 +-0.00549411 0.130838 0.0134037 +-0.0444864 0.070528 0.0418968 +-0.0694946 0.0902043 0.0422251 +-0.0125029 0.0673483 0.0540527 +-0.0889341 0.0928773 0.0104474 +-0.049902 0.0335302 0.00572664 +0.0224871 0.0436168 0.0410219 +-0.0391731 0.163682 -0.0125377 +-0.0389872 0.0336658 0.00601497 +0.0423783 0.0676875 -0.00279832 +-0.0314483 0.177007 -0.0139273 +0.0365023 0.0700019 0.0369139 +-0.0817843 0.113273 -0.0014411 +-0.0155011 0.0786732 0.0567092 +-0.0616004 0.115786 -0.012288 +0.0336937 0.0994802 0.0365924 +-0.0819199 0.0775142 -0.000486403 +-0.0620032 0.154899 0.00420466 +-0.0689571 0.134062 -0.00839151 +0.0341993 0.115326 0.00949444 +-0.0853268 0.127125 0.0496018 +-0.0075399 0.0430305 0.0487452 +-0.000964681 0.0992981 -0.0251507 +-0.0896495 0.146064 0.0111487 +0.0457169 0.0792126 0.021174 +-0.0677903 0.180834 -0.0585489 +-0.0525855 0.0528134 0.0122839 +0.045458 0.0847917 0.019171 +-0.0620511 0.164652 -0.0545872 +-0.0012817 0.0411143 0.047028 +-0.0620444 0.166711 -0.0606187 +0.0416044 0.0774454 -0.0068035 +-0.0180891 0.0568831 0.0497969 +0.0289502 0.0888845 0.043761 +-0.0361509 0.0471597 -0.0213258 +0.0209931 0.0505428 0.042434 +-0.081698 0.0939818 0.0329068 +-0.0701548 0.148741 -0.0366493 +-0.0726057 0.158224 -0.0359121 +0.0452801 0.0777562 0.00119407 +0.0034868 0.107186 0.0422902 +-0.0603898 0.116109 -0.0126519 +-0.0799294 0.154987 0.0226092 +-0.0412543 0.0342017 0.0283816 +-0.073067 0.0692219 0.0282366 +-0.0232836 0.0382816 -0.000419572 +-0.0843726 0.0952582 -0.00357113 +-0.0871856 0.0923586 0.0257303 +0.0415318 0.09261 0.0284783 +-0.0528539 0.1113 -0.0177773 +-0.0653767 0.0770838 0.0407622 +0.0608603 0.0609709 0.0131614 +0.0163938 0.128844 0.0100049 +-0.028759 0.0386585 -0.0166912 +-0.0688752 0.11651 -0.00852528 +-0.00266028 0.0525834 -0.0313625 +0.0395925 0.0979794 0.0293107 +-0.063517 0.0417383 0.0266777 +-0.0206145 0.038142 0.0147556 +-0.0746919 0.0745094 -0.0088781 +-0.0730235 0.16103 -0.0369405 +-0.0511023 0.141628 0.018382 +0.026686 0.0963684 -0.0200186 +0.00049039 0.0952019 0.0544773 +-0.0374215 0.0466159 -0.0218044 +-0.0396639 0.0592228 -0.0116772 +0.0589085 0.0593684 0.0217913 +-0.069935 0.128232 -0.00913858 +-0.0154583 0.128246 0.0199229 +-0.082956 0.0762572 0.0165263 +-0.0698527 0.139727 0.0465118 +-0.0793995 0.0962934 -0.0095136 +0.029447 0.119051 0.00204245 +-0.0406195 0.0505975 -0.0111291 +-0.0337259 0.125903 0.000119567 +-0.00361865 0.109419 -0.0218821 +-0.0324923 0.0845615 0.0419149 +-0.0304819 0.0903593 0.0440392 +-0.0289421 0.0848695 0.0456392 +-0.067993 0.172429 -0.0412978 +-0.0699656 0.167828 -0.0233999 +-0.0633908 0.0664235 0.0326881 +-0.0328103 0.178226 -0.00982944 +-0.0144938 0.0897854 0.0566872 +-0.00301248 0.0391855 -0.0120497 +-0.0467348 0.10982 -0.0182008 +-0.0347751 0.123588 -0.00668109 +-0.081672 0.0966878 0.0327979 +0.0208066 0.08618 0.0495337 +-0.0294922 0.102919 0.0420695 +-0.0514977 0.0917694 0.0441515 +-0.0561584 0.13394 0.0346041 +0.0587961 0.055231 0.00916964 +0.0239769 0.0672243 0.0451455 +-0.0590987 0.135299 0.0356206 +-0.0833215 0.153324 0.00972396 +-0.0775565 0.148654 -0.00488618 +0.0134356 0.129163 0.0217505 +0.00242681 0.0392303 -0.00913048 +-0.00111738 0.0369593 -0.0152505 +-0.0884159 0.102321 0.0103913 +0.0452046 0.0684536 0.0248447 +-0.0107692 0.1278 -0.0014358 +-0.067702 0.169446 -0.0560134 +-0.0645991 0.162478 -0.0199783 +-0.0384905 0.0591295 0.0404813 +-0.0133897 0.0383025 0.0215062 +-0.0335039 0.113859 0.0341437 +0.00725148 0.0739904 -0.0339985 +-0.0197912 0.0347004 -0.0276305 +-0.0364291 0.0383909 -0.00870817 +-0.0382525 0.154358 -0.00883541 +-0.0576615 0.0645392 -0.00788705 +0.0271486 0.0677873 -0.0226945 +-0.0484929 0.0776741 0.0437591 +-0.0538207 0.0913026 -0.0221948 +-0.0414756 0.102877 0.0407886 +-0.0194769 0.0384097 -0.0016118 +0.0409764 0.0725373 0.0310711 +-0.046711 0.0723683 -0.0164352 +-0.0169229 0.0385492 -0.0161043 +0.0274461 0.0888981 0.0450769 +0.0384486 0.0446185 0.0300797 +-0.0498739 0.120141 -0.01301 +-0.0147995 0.0382136 0.0194957 +-0.034222 0.0422724 0.0479221 +-0.00554376 0.0388664 -0.0141367 +-0.00771915 0.0642161 -0.0356843 +0.0380609 0.108343 0.0221716 +-0.0496329 0.05762 -0.010324 +-0.0640324 0.0336604 0.00811729 +0.0288939 0.0349903 0.0075309 +-0.0369254 0.170672 -0.0129456 +0.0567415 0.0605855 0.00115011 +-0.026353 0.0382316 0.0044532 +-0.088166 0.0963498 0.023753 +-0.0332851 0.0368458 -0.0306141 +-0.0138558 0.0387296 -0.0044727 +0.0597512 0.0650182 0.00715554 +-0.0267551 0.0740245 -0.0360482 +0.0214915 0.0369736 0.0352586 +-0.0515738 0.0559395 0.0296214 +0.00622241 0.123988 -0.00957575 +0.0558148 0.0493476 0.0171957 +-0.0766567 0.112144 0.0469767 +0.0408877 0.0928069 -0.00817715 +-0.0862272 0.0886081 0.000477626 +-0.0341682 0.0723955 -0.0204945 +0.0468003 0.0745424 0.0107517 +-0.00983206 0.0896484 -0.0366649 +-0.00782261 0.0985178 0.051315 +-0.070543 0.17193 -0.0350862 +0.0371254 0.0869172 -0.0157926 +-0.059432 0.152725 0.0327387 +-0.0644942 0.149793 0.0375095 +-0.02966 0.0875784 -0.0315907 +0.0234483 0.0350084 0.0101439 +-0.0672661 0.155709 0.00954294 +0.0249549 0.0915796 0.0467751 +-0.0750729 0.0675817 0.0186826 +-0.065557 0.158804 -0.0559152 +-0.0869809 0.112371 0.0426661 +-0.0388924 0.0336117 -0.0270987 +-0.0925871 0.117342 0.0103086 +-0.0285134 0.0559644 0.0364164 +-0.0592485 0.148248 0.0355123 +-0.0386245 0.0472623 -0.0172994 +0.0417415 0.0676611 -0.00475281 +0.017067 0.127696 0.00312982 +-0.00768714 0.116771 -0.0157299 +-0.0210692 0.0667823 0.0496379 +0.0306718 0.0605569 0.0407187 +-0.086202 0.0805924 0.0105044 +0.0248868 0.0727438 0.0465386 +-0.0226479 0.182963 -0.0190305 +-0.064868 0.0953298 -0.0181139 +-0.0212331 0.0553385 0.0459146 +-0.0900228 0.148451 0.0254546 +-0.0659345 0.109414 0.0377967 +-0.0156357 0.0466082 -0.0291798 +-0.0783295 0.108958 0.0384425 +-0.0353519 0.169773 -0.000327923 +-0.0576724 0.155657 0.012957 +0.0299243 0.0902598 0.0434097 +-0.0938789 0.125503 0.0152603 +0.00849738 0.0910108 0.0540495 +-0.0924729 0.117499 0.0403021 +-0.0538856 0.101336 -0.0209374 +0.0230068 0.125355 0.00960117 +-0.0753773 0.0887668 0.039456 +-0.0164714 0.0348128 0.0436847 +-0.0124833 0.108618 0.0427908 +0.00650022 0.0937602 0.0531051 +-0.0254901 0.101602 0.0435889 +-0.0681644 0.132655 0.0471068 +0.0116725 0.130674 0.0125466 +-0.0658455 0.0693268 0.0349111 +0.0131057 0.0346676 0.0247536 +0.0111453 0.0752893 0.0548169 +-0.0414315 0.120058 -0.0129928 +-0.0667828 0.0837809 -0.018353 +-0.0558768 0.105489 -0.0184971 +-0.0646849 0.0705888 -0.0125799 +0.00250861 0.0634123 0.0567384 +-0.0102337 0.0987343 -0.0266102 +-0.0475686 0.0376232 -0.0123457 +0.0326729 0.0388984 0.0249367 +-0.0754158 0.14997 -0.0218646 +0.0149498 0.0475024 0.0442108 +-0.0897923 0.144692 0.013139 +-0.065193 0.0597221 0.0116014 +-0.0777759 0.113375 -0.00398806 +-0.0457101 0.131722 0.0089192 +-0.0575663 0.0481384 0.0346641 +-0.0838122 0.128533 0.0508937 +-0.0104939 0.0933018 -0.0349679 +0.0252085 0.0464911 -0.0166174 +-0.0789879 0.13894 -0.00474105 +-0.0475728 0.0656919 0.0379498 +0.0110822 0.113195 -0.0179885 +-0.0649225 0.170267 -0.0430968 +-0.00871405 0.112847 -0.0195489 +0.0452857 0.0889846 0.0161633 +-0.0171038 0.128182 0.00771491 +-0.0114919 0.0911558 0.0564108 +-0.0672347 0.158081 -0.05503 +-0.0375789 0.0335576 -0.0249215 +-0.028354 0.0521667 -0.0233844 +-0.0687469 0.179151 -0.0517127 +-0.0635972 0.164728 -0.0295802 +-0.00849416 0.0661021 0.0557034 +0.0018938 0.131459 0.00752669 +-0.0104875 0.10724 0.0431922 +0.0420847 0.0764929 0.0291356 +-0.0164676 0.125926 0.0254562 +-0.0666931 0.162075 -0.0149837 +0.000392133 0.0405199 -0.0247969 +-0.062597 0.0740287 0.040345 +-0.038486 0.115285 0.0333239 +-0.0134767 0.0545379 0.0508338 +-0.0379773 0.128134 0.0117903 +0.0282176 0.0746072 -0.022898 +-0.00949856 0.0898059 0.0569552 +-0.0633588 0.166271 -0.0375898 +-0.088608 0.0874693 0.0094764 +-0.00658802 0.126776 -0.00645935 +0.00550371 0.0533623 0.0533002 +0.0568364 0.0723477 0.016027 +-0.0746813 0.077485 -0.0103851 +0.0599778 0.0622697 0.0191849 +-0.0834343 0.143353 0.0415913 +0.0461466 0.0773319 0.0190905 +-0.0643928 0.0366139 0.0414145 +0.017105 0.0913787 0.0494605 +0.0113838 0.0463423 -0.025328 +0.00150906 0.0925101 0.0553138 +-0.0905552 0.131061 0.0372264 +0.0271939 0.0479684 -0.0167032 +0.0118641 0.130407 0.00833975 +-0.0534963 0.0413918 0.0463882 +-0.00348783 0.0548509 0.0542207 +-0.0241218 0.165279 -0.0170232 +0.0526044 0.0736805 0.0129696 +0.00493694 0.0358587 0.023833 +-0.0308996 0.0862326 -0.0295626 +-0.0749566 0.152744 -0.0158977 +0.022407 0.0700249 0.0481925 +-0.0644326 0.152123 0.0354487 +-0.083145 0.0762813 0.00952219 +-0.0066641 0.130277 0.00578337 +-0.0503124 0.0487527 0.0166746 +-0.0857975 0.0926505 0.000473688 +0.0319954 0.0554568 -0.0137989 +-0.0325248 0.0371997 0.032926 +-0.0378236 0.0914714 -0.0236656 +0.0107752 0.0603237 0.0523688 +-0.0709378 0.0995366 0.0403447 +0.00229927 0.0641027 -0.0339638 +0.0301658 0.0510827 -0.0137422 +-0.0152122 0.0387061 -0.0065833 +0.0328168 0.0373031 0.0209449 +-0.0564976 0.0959787 0.0438593 +-0.0530296 0.137293 -0.00118635 +-0.0114929 0.0745162 0.0566704 +0.0339687 0.0768049 0.0403387 +0.0229251 0.0476731 0.039919 +0.0153286 0.0594649 -0.0285327 +-0.0650165 0.0356472 0.0166692 +-0.0872319 0.104968 0.0093836 +0.0317565 0.0752189 -0.019756 +0.0174897 0.107108 0.0415537 +0.00650555 0.0716952 0.056225 +0.0214733 0.0808843 0.0504673 +-0.0157973 0.0382489 0.019257 +-0.073889 0.119392 -0.00790358 +-0.0588895 0.0969269 -0.0201624 +-0.0614701 0.166956 -0.0604533 +-0.0411287 0.160673 -0.0112161 +-0.0558134 0.0883826 -0.0218608 +-0.0206962 0.0385843 -0.00942784 +0.0401892 0.0759203 -0.00879733 +0.0191194 0.0349494 -0.00374623 +-0.0414976 0.113906 0.0346806 +-0.00581815 0.0854694 -0.0375201 +-0.0859756 0.0805547 0.00750576 +-0.0833395 0.103378 -0.00262342 +-0.0446335 0.126046 -0.00723965 +0.0260088 0.0910229 -0.0223512 +0.034944 0.10998 0.0278542 +-0.00248857 0.0703789 0.0573235 +-0.0102702 0.0385128 0.00564525 +-0.0283572 0.0578046 -0.0244014 +-0.0210295 0.0958616 0.0473023 +-0.0141375 0.0347096 0.0460356 +-0.0244241 0.178665 -0.0108375 +0.00749812 0.109597 0.0408218 +-0.0356643 0.0606925 -0.0124069 +-0.0638002 0.166551 -0.0354938 +-0.0862312 0.0940245 0.00140199 +-0.0365789 0.0337187 0.00826156 +0.0240933 0.0685753 0.045325 +-0.0891661 0.132396 0.0419315 +-0.0177346 0.065722 -0.0374816 +-0.0224613 0.12203 0.0284859 +-0.0509119 0.055753 0.0316394 +-0.0340805 0.0680941 -0.0175876 +-0.0166639 0.0364717 -0.017882 +0.0347021 0.0768104 0.0396564 +0.0213412 0.0565052 -0.0267347 +-0.0707159 0.179287 -0.0569572 +-0.0748092 0.0790936 0.0363823 +-0.0577944 0.0460393 0.0120187 +-0.0302932 0.123607 -0.00301843 +0.00749105 0.050377 0.0513506 +-0.0641553 0.162388 -0.0586672 +-0.0197076 0.059653 0.0484949 +0.0376477 0.110588 0.00928033 +-0.0151896 0.0391404 0.0514631 +0.020848 0.0400652 -0.0117024 +-0.0208303 0.119929 -0.0109428 +0.0157129 0.124796 -0.00448994 +-0.00658665 0.0388228 -0.0143041 +0.0254417 0.121647 0.000551492 +0.0535789 0.0658041 0.000119664 +0.0473148 0.0518659 -0.00495567 +0.0299175 0.0524736 -0.0157475 +-0.0183959 0.112492 -0.0191613 +-0.0893828 0.0916068 0.0204288 +-0.0614858 0.175719 -0.0606762 +-0.0901396 0.13244 0.0372222 +-0.0238257 0.0881589 -0.0366228 +-0.0218791 0.0383442 -0.00388387 +0.00124143 0.0390154 -0.00356473 +-0.0669805 0.1589 -0.00929727 +0.0483233 0.0547304 -0.00526262 +-0.0444857 0.0661533 0.0401374 +-0.0514919 0.076238 0.0430598 +-0.0301912 0.0664057 -0.0274649 +-0.0408343 0.0942887 -0.0229156 +-0.00749956 0.121159 -0.0124082 +-0.061476 0.158429 -0.028587 +-0.0675029 0.109729 0.0377486 +-0.0697083 0.1638 -0.0499695 +-0.062151 0.152195 -0.0205783 +0.0342924 0.0619556 0.0389482 \ No newline at end of file diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/cube_ran.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/cube_ran.pts new file mode 100644 index 000000000000..ae0320923a7d --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/cube_ran.pts @@ -0,0 +1,582 @@ +581 +-9496.000158 -6621.999660 73324.000108 +1941.000008 -502.999956 53448.000262 +-13993.000076 -9472.000458 73547.999893 +-3165.000198 2805.999696 53841.000158 +3941.000109 -826.999564 53350.999780 +-13992.999698 -6391.999696 73548.000325 +-4629.000334 -2729.999756 72919.999638 +-14544.000229 7643.999701 62169.999969 +-3539.000009 -7617.000066 72743.000159 +-3569.999951 1963.000330 53954.000331 +4099.000115 540.000082 55720.000195 +3946.000208 3611.000347 54343.000242 +3942.000336 -1955.000290 53845.000430 +24.000106 -8480.000056 72560.000446 +-2817.999819 -7080.000021 72739.999999 +274.999768 2681.999578 53612.999729 +-5673.000363 -8522.000312 72919.999924 +-3569.999681 5328.999917 53954.000391 +7057.000447 22.999921 72019.999778 +-7114.999994 -4259.000412 73100.000243 +3129.999877 -1020.000207 53119.999650 +-14575.999938 2064.000292 60412.000409 +-8087.999603 -2692.999873 73164.999998 +-9496.000263 -8099.000270 73323.999696 +-14575.999757 4785.999619 60412.000416 +1767.000453 -2710.000440 72380.000399 +4723.999558 2984.999684 72199.999829 +4173.000154 -1942.000364 57518.000224 +-14185.000047 -8155.999786 69664.999947 +8462.999751 -2789.999723 72019.999998 +-14475.999680 -6322.000368 63961.000010 +-14185.000218 -6669.000381 69665.000452 +-14411.999521 8769.999611 63528.000202 +-3929.999793 121.999623 53660.000393 +-3538.999885 -6227.999801 72743.000078 +5664.000221 8483.999673 72199.999788 +4160.000223 3746.999664 57257.999712 +16.999585 1061.999516 53479.999584 +3441.000482 4789.999724 53120.000035 +3941.000301 861.000216 53350.999558 +3941.000166 186.000103 53350.999891 +-5672.999756 5721.000193 72920.000053 +-14411.999799 1051.999879 63528.000013 +3441.000192 5308.999633 53119.999836 +-13970.999556 -6778.999631 71592.999827 +-5673.000352 1448.000308 72919.999896 +1941.000287 3661.000398 53448.000221 +4159.999588 2681.999997 57257.999788 +2098.999573 1058.000232 53299.999983 +-3569.999774 280.000127 53953.999842 +-3538.999679 -9006.000017 72743.000111 +-3570.000143 -1402.000081 53954.000006 +-7115.000060 5734.999820 73099.999872 +-1026.999875 -1026.999558 53479.999537 +7056.999811 -4195.999750 72020.000402 +-3570.000168 3085.000137 53954.000020 +-13970.999844 -9803.999811 71592.999532 +17.000252 6285.000424 53479.999576 +-14322.999690 -2587.000320 65092.999918 +-5387.999792 -1969.999910 72920.000067 +-1426.999888 2743.999772 53744.000433 +-3538.999950 -2059.999970 72742.999563 +-14412.000000 6664.999905 63527.999948 +-3570.000271 3646.000059 53954.000087 +-3929.999828 -1973.999852 53659.999952 +-4237.999601 -7080.000344 72740.000252 +-14373.000194 -7866.999965 65785.999683 +3946.000001 2584.000490 54343.000220 +3941.000101 2886.999557 53350.999752 +4160.000230 551.000414 57257.999512 +4264.000084 1686.000457 60564.000497 +-9495.999646 -3667.999852 73323.999965 +4288.000261 1950.999734 60834.000001 +1432.000381 -1938.999865 53464.000475 +-5126.999748 3887.999847 72980.999916 +4287.999632 278.999662 60833.999729 +-2072.000101 17.000308 53479.999547 +-14411.999918 5261.999514 63527.999544 +-14185.000455 -5180.999602 69665.000041 +4263.999685 -536.999855 60563.999513 +4724.000258 1575.000409 72200.000149 +4159.999987 4812.999838 57258.000035 +-3930.000140 4837.999779 53659.999939 +-8543.000324 -8542.999590 73099.999989 +-3570.000177 840.999915 53954.000138 +3941.000105 1874.000098 53351.000382 +3946.000349 4637.999658 54342.999822 +8462.999539 8462.999818 72019.999892 +5664.000082 4253.999844 72200.000354 +-5387.999671 2302.000049 72920.000121 +-5388.000189 166.000459 72919.999521 +5664.000053 -4206.999676 72200.000476 +2473.999900 -2709.999879 72380.000265 +16.999506 -1027.000446 53479.999576 +4263.999639 -1647.999637 60564.000406 +3441.000140 1676.999539 53120.000327 +-9496.000107 -5145.000342 73323.999932 +-13992.999533 -4852.000259 73548.000110 +4287.999970 6968.000328 60833.999686 +275.000199 3746.999653 53612.999629 +-14412.000182 -350.999721 63528.000472 +-13992.999868 -4338.000196 73547.999622 +-8543.000347 -4259.000087 73100.000032 +16.999876 5240.000063 53479.999960 +-14372.999770 -9301.999508 65786.000118 +-5127.000314 8129.000114 72980.999503 +-1394.000093 -4227.999771 72560.000486 +4098.999711 3673.000482 55719.999928 +3946.000083 -1523.000092 54342.999694 +4724.000061 -1246.000449 72200.000281 +-13720.999502 -5353.000086 73556.000360 +4723.999887 7215.000403 72200.000242 +-14184.999932 -2754.999701 67936.999780 +1437.000194 -5630.999670 72380.000099 +-5444.999665 -9188.000372 72930.000378 +-4238.000442 -8500.999822 72740.000263 +-8542.999594 4307.000192 73099.999910 +-5388.000269 6574.999714 72920.000493 +-1394.000324 -2811.000366 72559.999570 +16.999584 16.999963 53479.999782 +-14327.000037 -2687.000254 67063.000303 +-1027.000347 6284.999698 53480.000414 +2850.999763 -5631.000213 72380.000333 +-14543.999669 -8982.999787 62170.000241 +-1426.999789 563.000156 53743.999616 +-5127.000214 -2474.000449 72980.999585 +-8542.999689 5734.999797 73100.000259 +-13993.000354 -8958.999738 73548.000223 +1057.999632 3139.999725 53299.999575 +7056.999573 1429.999852 72020.000196 +-13412.999816 -2989.999795 73597.999993 +-14411.999793 5963.000061 63527.999980 +-14544.000399 3487.000172 62169.999836 +4723.999840 869.999743 72200.000174 +1940.999817 5742.999710 53447.999666 +-14411.999874 7365.999941 63528.000371 +3441.000223 5827.000153 53120.000059 +1941.000349 1579.000153 53447.999990 +4723.999767 5099.999678 72199.999767 +-5444.999773 -6354.000185 72929.999902 +-11526.999785 -8253.000306 73393.000090 +4287.999859 5853.000374 60833.999882 +-3538.999732 -3449.999625 72742.999793 +-13993.000364 -7932.000020 73548.000260 +-14373.000228 -3563.000378 65785.999768 +4253.999995 -7026.999870 72200.000060 +-3164.999721 -539.000085 53841.000259 +3940.999621 -1165.000187 53351.000040 +4251.999655 -1611.999954 58826.000287 +3130.000441 1055.000205 53119.999800 +-7114.999827 -7115.000264 73100.000269 +-5388.000004 5151.000233 72919.999833 +-14543.999690 -4825.999812 62169.999558 +-3929.999555 6411.000130 53659.999733 +1940.999639 4702.000362 53447.999846 +-14411.999716 2454.999607 63527.999612 +3440.999501 -915.999922 53119.999778 +4288.000012 -1950.999731 60833.999534 +275.000261 1616.000437 53612.999949 +-1427.000136 -527.000171 53743.999568 +4251.999503 -525.000281 58825.999809 +-260.999615 -1966.999943 53479.999718 +7057.000208 -5603.000018 72020.000259 +-5127.000479 6715.000320 72980.999619 +-1427.000327 3834.000257 53744.000353 +3440.999911 6346.000423 53120.000030 +2850.999822 -7045.000455 72380.000243 +5664.000435 -1386.999766 72200.000059 +-14412.000002 3156.999581 63527.999801 +-8543.000189 -7115.000435 73099.999877 +3445.999629 2566.999931 53380.000265 +3440.999872 -1434.999562 53119.999546 +-3165.000457 5035.000031 53841.000213 +-3929.999582 2218.000457 53659.999557 +3445.999965 -1512.999532 53379.999504 +-1958.000338 -1957.000101 53738.999698 +275.000452 -1581.000215 53613.000308 +-14088.000048 -2934.999842 70989.999715 +-14373.000177 -4997.999695 65786.000128 +8462.999777 5649.999794 72019.999678 +1058.000275 6263.000038 53300.000358 +-7102.000019 -2619.000327 73101.999718 +-8542.999951 -5687.000307 73099.999616 +-3930.000250 2741.999930 53660.000203 +1300.999742 -1960.999792 53299.999640 +4723.999966 4394.999535 72200.000035 +4098.999994 1583.999527 55720.000241 +-13992.999829 -8445.999614 73548.000422 +4098.999861 -1548.999788 55719.999858 +-3930.000368 -1449.999960 53660.000492 +4287.999872 3066.000210 60833.999876 +4287.999522 2508.000016 60833.999841 +-5445.000250 -3519.000073 72930.000344 +-14232.999547 -8002.000380 67645.000212 +-5126.999777 -1767.000240 72980.999857 +3129.999543 5204.999843 53119.999708 +3946.000005 530.999826 54343.000175 +-13721.000221 -3816.000216 73556.000357 +8463.000349 22.999637 72020.000002 +4724.000003 3690.000471 72200.000108 +1058.000380 4180.999601 53300.000207 +274.999810 5879.000134 53613.000459 +354.000245 -2715.999978 72560.000238 +1437.000165 -4217.000476 72380.000479 +3940.999844 4913.000151 53350.999582 +-2895.000382 -1945.000376 53846.999541 +2099.000389 2099.000230 53300.000474 +8463.000426 1430.000487 72020.000078 +4252.000374 561.000004 58826.000032 +3940.999558 523.000164 53351.000416 +1437.000253 -2804.000496 72380.000323 +-14543.999762 -3440.999829 62169.999916 +-14543.999982 -6211.999551 62170.000041 +3441.000291 2714.999685 53119.999987 +5663.999985 -2797.000025 72200.000024 +-14411.999984 -1051.999942 63528.000370 +3440.999562 4271.000407 53120.000029 +-3539.000186 2107.000409 72743.000388 +1057.999822 -1024.000255 53300.000171 +3945.999666 5664.999689 54342.999562 +-5126.999539 5301.000010 72981.000462 +-14575.999627 -3379.999597 60411.999811 +3180.999744 -2710.000374 72380.000052 +-1026.999719 4195.999827 53480.000234 +-3165.000176 575.999615 53840.999507 +3941.000445 -151.999807 53351.000391 +-14576.000174 -657.999845 60411.999636 +-2349.999962 -1966.999590 53479.999902 +-14411.999854 3858.999681 63528.000283 +-10090.000319 -2795.000040 73260.999652 +3941.000477 5924.999710 53350.999731 +4085.000468 -1954.000357 55213.000428 +4253.999936 -8436.999819 72199.999776 +-1394.000360 -8479.999946 72559.999636 +-3569.999726 -841.000285 53953.999993 +-9083.999507 -2718.999761 73217.000072 +3441.000399 640.000398 53120.000050 +4287.999748 -1394.000023 60833.999874 +5664.000340 7073.999686 72199.999963 +-5387.999666 4438.999817 72919.999562 +7056.999636 -7010.000061 72019.999662 +1057.999689 5222.000173 53299.999663 +-5673.000248 4296.000142 72920.000031 +-1027.000260 5239.999713 53480.000273 +-7114.999766 -8543.000300 73100.000022 +274.999590 551.000141 53612.999775 +-3929.999711 -926.000493 53660.000132 +4288.000365 -836.000403 60833.999756 +3446.000332 3586.999913 53379.999531 +3887.999686 -2709.999801 72379.999876 +-3539.000418 -670.999562 72742.999614 +4251.999963 1648.000235 58826.000350 +7056.999875 -1382.999580 72019.999867 +-11526.999831 -9757.999777 73393.000349 +3130.000328 4167.000247 53120.000320 +8463.000402 2837.000196 72020.000275 +3446.000436 -493.000175 53380.000405 +-1427.000357 6013.999828 53744.000254 +-13993.000352 -5365.000211 73547.999983 +3130.000064 6241.999698 53120.000243 +-1393.999680 -7061.999503 72559.999762 +-3929.999947 3266.000354 53660.000396 +-5388.000052 8711.000308 72919.999522 +-5387.999641 5862.999935 72920.000126 +-5673.000220 24.000330 72919.999842 +4160.000111 -514.999580 57257.999620 +3445.999928 527.000347 53379.999914 +-8542.999580 7162.000367 73099.999863 +2947.999993 -1968.000009 53405.999963 +-3929.999592 -1974.000291 53659.999860 +-1305.999625 -1967.000077 53480.000398 +3129.999665 3130.000305 53119.999882 +-4237.999635 -4237.999904 72739.999541 +7057.000491 4243.000297 72019.999582 +-14576.000246 -6102.000206 60411.999747 +4264.000083 2796.999726 60563.999829 +4724.000254 5805.000459 72199.999985 +-5672.999808 -7097.000478 72920.000322 +-7114.999930 1452.000036 73099.999694 +-3929.999839 4313.999708 53660.000336 +-13971.000086 -5267.000118 71592.999574 +-3164.999892 1691.000266 53840.999559 +3941.000485 1198.999988 53351.000119 +-2071.999680 1062.000046 53480.000119 +-3930.000107 5362.999664 53659.999659 +-13972.000434 -2989.999797 73073.000355 +-5387.999734 1589.999640 72920.000470 +-14575.999747 6147.000157 60412.000152 +-3539.000484 4885.000479 72743.000415 +-8543.000350 23.999745 73100.000201 +4159.999933 5878.999799 57258.000196 +-5444.999733 -7771.000335 72929.999842 +-14372.999532 -6432.999688 65786.000443 +3941.000032 5250.000483 53350.999566 +-2817.999801 -4237.999840 72739.999681 +2099.000054 4180.999939 53300.000374 +3440.999903 121.000021 53120.000493 +-14575.999797 -4741.000478 60411.999775 +3940.999685 1535.999624 53351.000429 +-14576.000473 702.999598 60412.000428 +-14475.999775 -4911.999679 63960.999993 +-14131.000326 -2857.999672 69963.000289 +2099.000221 -1024.000206 53299.999555 +-3539.000177 -4839.000490 72742.999973 +-5672.999696 -4248.999669 72919.999901 +1057.999780 16.999883 53300.000257 +5663.999977 5663.999867 72199.999515 +5663.999992 -8436.999738 72200.000314 +-14412.000335 8068.000149 63527.999665 +-5388.000218 -545.999702 72919.999648 +4264.000448 3907.999781 60564.000285 +3129.999620 2092.000354 53120.000415 +1062.999967 -2715.999634 72560.000024 +3940.999708 -1840.000490 53351.000006 +23.999785 -4227.999646 72560.000090 +-3165.000129 -1654.000323 53840.999660 +-5127.000159 2474.000343 72981.000044 +3941.000234 2210.999659 53351.000276 +1436.999565 -7045.000204 72380.000395 +-1426.999662 1654.000050 53744.000497 +4159.999762 -1580.999657 57257.999765 +2099.000277 6263.000009 53300.000166 +-14233.000173 -9461.999637 67644.999640 +4724.000132 6510.000452 72199.999686 +-5388.000295 3014.999741 72919.999528 +4107.000341 -1973.999932 55973.999842 +-1027.000486 1061.999561 53480.000336 +4263.999763 5018.999546 60563.999509 +-3126.999968 6305.999575 53660.000329 +-1062.999814 -2715.999805 72559.999701 +3441.000092 -398.000054 53119.999576 +23.999882 -5645.000302 72559.999942 +-5126.999834 4594.000338 72980.999829 +4252.000254 4907.999952 58825.999554 +-3569.999712 4767.999673 53953.999940 +-14476.000032 -9143.000078 63960.999819 +4071.000131 -1967.999892 54460.000432 +3440.999875 3752.000283 53120.000467 +-14576.000485 3424.999842 60411.999944 +-5160.999508 -2520.999928 72949.000110 +4287.999692 3622.999957 60834.000077 +-5127.000118 1767.000066 72980.999700 +5663.999655 24.000344 72200.000194 +-14576.000480 7508.000120 60411.999689 +-2881.999956 -1974.000116 53659.999591 +3129.999776 16.999790 53119.999905 +-13993.000072 -5879.000105 73548.000170 +4723.999855 -2656.000037 72200.000312 +3940.999633 4574.999653 53351.000095 +17.000159 3150.999751 53479.999993 +-13721.000066 -6890.000008 73555.999864 +-5673.000136 8569.000239 72919.999812 +4287.999834 1393.999656 60834.000047 +-5127.000002 3181.000499 72980.999577 +1437.000111 -8457.999664 72379.999810 +-1027.000182 3151.000481 53480.000213 +8462.999880 -5602.999786 72020.000397 +5663.999998 -7027.000337 72200.000179 +-2071.999836 5240.000427 53480.000403 +3445.999729 4607.000036 53380.000383 +-1394.000136 -5645.000011 72559.999949 +-3127.000033 2113.999786 53660.000272 +3941.000324 2548.999788 53350.999985 +3940.999570 -1502.000342 53351.000013 +-3126.999914 -1030.999894 53659.999552 +-4238.000253 -2817.999880 72739.999988 +3440.999843 -1953.999504 53120.000421 +259.999737 -1960.999636 53300.000138 +-245.000117 -1948.999943 53618.999915 +-11526.999811 -5243.000037 73392.999756 +4724.000234 165.000038 72199.999547 +-3126.999977 3161.999991 53659.999978 +-3569.999564 4207.000094 53953.999501 +275.000170 -514.999842 53613.000034 +-11526.999613 -6747.999928 73392.999616 +-7390.999730 -5035.000249 73077.999705 +275.000340 4813.000352 53612.999844 +-2071.999948 3150.999602 53480.000403 +4251.999765 2735.000064 58826.000103 +-7115.000351 -5686.999885 73100.000358 +4098.999827 2628.999611 55719.999560 +8463.000124 -7010.000397 72020.000009 +-14232.999615 -6543.000442 67645.000485 +-3930.000232 5887.000299 53659.999634 +-14544.000461 2101.000409 62170.000359 +3372.000265 -1954.000261 53119.999806 +-14412.000115 1754.000439 63527.999500 +-14438.999828 -2520.999738 64242.999578 +-14329.999599 -2661.000068 66073.000238 +1941.000120 -1544.000357 53448.000031 +-4238.000332 -5659.000491 72740.000442 +4098.999594 -505.000192 55720.000025 +-2818.000128 -5658.999652 72739.999655 +4288.000306 -278.999978 60833.999586 +-1026.999893 17.000290 53480.000077 +-7114.999937 2878.999603 73099.999625 +4251.999706 3821.999721 58825.999856 +-14544.000411 -7596.999761 62170.000298 +-3539.000189 6273.999627 72742.999519 +-8542.999929 8590.000255 73100.000232 +-14544.000350 715.999575 62170.000076 +-9495.999848 -9576.000383 73323.999907 +-14576.000232 -7462.000020 60411.999731 +-14184.999642 -9643.999972 69665.000056 +-13970.999811 -8291.000315 71593.000038 +-5126.999814 1060.000113 72981.000052 +-7115.000366 7162.000434 73099.999958 +-3165.000448 6150.000036 53840.999507 +8462.999808 4242.999904 72020.000254 +7057.000202 -2790.000123 72020.000020 +-2071.999832 -1026.999844 53479.999642 +-7114.999518 -1404.000177 73100.000300 +3941.000476 3223.999580 53351.000151 +-3569.999782 1402.000069 53953.999777 +-3570.000289 7012.000244 53953.999930 +-5388.000194 877.999982 72919.999818 +-5126.999702 6008.000102 72980.999919 +4263.999700 6130.999796 60564.000158 +-8543.000290 1452.000226 73100.000426 +2850.999705 -4217.000056 72379.999818 +7056.999509 7057.000433 72019.999792 +-13992.999692 -3312.000439 73548.000061 +2850.999879 -8457.999587 72380.000259 +-3538.999600 718.000352 72742.999931 +-3930.000315 646.000457 53659.999635 +4264.000193 573.999697 60564.000002 +2099.000093 5221.999649 53300.000412 +-2071.999917 6284.999527 53479.999583 +4723.999862 7920.000427 72199.999887 +4330.999705 -1963.000266 59887.000081 +2851.000238 -2803.999644 72380.000218 +3440.999720 2195.999826 53119.999530 +-14543.999739 -2055.000043 62170.000137 +-14544.000178 -669.999739 62170.000308 +-14411.999915 351.000242 63527.999545 +3940.999876 5587.999982 53351.000452 +-11526.999792 -3737.999544 73392.999629 +3940.999584 4236.999929 53351.000136 +-7115.000083 -2831.999613 73099.999909 +-14232.999742 -5082.999812 67645.000324 +-3570.000011 -1963.000243 53954.000457 +-14575.999963 -8822.999905 60411.999771 +-3196.999729 -2722.999629 72739.999728 +4270.999791 -1943.999513 59089.999553 +-3930.000132 -402.000411 53659.999785 +4287.999518 -1951.000148 60834.000344 +1057.999742 2098.999992 53299.999970 +24.000007 -2810.999989 72560.000497 +-3570.000037 -280.000196 53954.000365 +7056.999709 -8415.999536 72020.000349 +7057.000090 5650.000225 72020.000014 +4099.000497 4718.000121 55719.999993 +-7115.000395 24.000272 73099.999724 +-14476.000166 -3502.000326 63961.000485 +-3569.999717 6450.999920 53954.000143 +-1163.000334 -1973.999751 53745.000092 +4723.999824 -541.000100 72200.000243 +3940.999990 3899.999923 53350.999622 +-3127.000218 5257.999652 53659.999673 +8463.000217 -1382.999504 72019.999695 +-14232.999844 -3624.000203 67645.000238 +-7390.999511 -3588.999711 73077.999992 +-5127.000472 352.999759 72981.000130 +2099.000363 16.999945 53300.000261 +-7390.999682 -6480.000469 73077.999642 +-5387.999952 7999.000376 72920.000277 +-3569.999553 2524.000332 53954.000210 +3445.999802 5627.000372 53380.000121 +-8543.000137 2878.999786 73100.000062 +-11225.000154 -2878.000184 73429.000219 +-5444.999752 -4937.000206 72929.999910 +-3539.000116 3495.999641 72743.000028 +4724.000434 -1950.999984 72200.000236 +-5387.999758 7287.000091 72920.000451 +3694.000162 -1947.999707 53364.999539 +-14412.000272 -1753.999800 63528.000480 +4724.000342 8625.000362 72199.999560 +2341.999734 -1961.000092 53299.999848 +-2071.999756 4196.000324 53480.000336 +-8543.000296 -2832.000371 73099.999810 +-5127.000024 8834.999681 72980.999971 +-13992.999602 -3825.000472 73548.000110 +3446.000174 1546.999928 53380.000489 +-3127.000366 4209.999619 53659.999561 +-5387.999685 -1258.000068 72920.000033 +-13720.999529 -8426.000197 73555.999797 +4135.999975 -1958.000343 56742.000312 +1058.000030 1057.999685 53299.999642 +2194.000288 -1954.000142 53438.999837 +1821.999693 -1961.000245 53300.000177 +-2486.000272 -2723.000311 72740.000113 +4251.999519 5994.999969 58825.999706 +-782.999723 -1966.999702 53480.000385 +-14184.999503 -3694.000155 69664.999741 +-7391.000162 -7925.000424 73077.999760 +3941.000365 3562.000286 53350.999697 +-5673.000072 -2824.999976 72920.000076 +-3929.999836 3789.999783 53660.000108 +4288.000033 5295.999782 60834.000285 +8463.000290 -4195.999621 72020.000158 +-1026.999905 2106.000122 53480.000172 +-14544.000315 6258.000031 62169.999860 +2098.999845 3140.000130 53300.000384 +17.000326 2105.999614 53480.000329 +-2817.999707 -2817.999500 72740.000297 +-5127.000216 7421.999889 72980.999545 +-14035.000213 -2961.999816 72026.999857 +3941.000206 -490.000295 53351.000305 +-3127.000000 1065.999857 53660.000041 +-14412.000070 4560.000349 63527.999884 +-1427.000275 -1616.999797 53744.000069 +-6126.000265 -2593.999720 73030.000099 +4099.000391 5762.000184 55719.999589 +3440.999902 1159.000232 53119.999985 +23.999963 -7062.000133 72559.999953 +-3164.999618 3921.000274 53840.999514 +3940.999690 6263.000241 53351.000160 +5663.999668 1434.000202 72199.999998 +3946.000045 -496.000294 54342.999676 +-3538.999923 7662.999718 72742.999936 +3946.000069 1557.999781 54343.000397 +-13992.999519 -7419.000292 73548.000211 +-14576.000246 -2018.999804 60411.999775 +4724.000039 2279.999748 72200.000311 +4253.999732 -5616.999621 72199.999908 +1940.999753 2619.999683 53447.999667 +3441.000116 3234.000032 53120.000379 +-7114.999901 4307.000119 73100.000483 +4288.000399 4738.000285 60834.000007 +4253.999724 -2797.000058 72199.999720 +5664.000222 2843.999541 72200.000437 +7056.999584 8463.000456 72020.000228 +-3930.000418 1694.000154 53659.999991 +-353.999670 -2715.999787 72559.999549 +-14162.999975 -2781.999699 68944.999901 +4287.999827 4180.999517 60834.000197 +-2071.999586 2105.999678 53480.000453 +-7390.999953 -9370.000271 73077.999510 +8462.999606 7057.000057 72020.000254 +7056.999555 2837.000361 72019.999548 +-7114.999806 8589.999936 73100.000030 +-5126.999903 -1060.000339 72980.999664 +8463.000265 -8415.999563 72019.999761 +-14475.999815 -7732.000263 63960.999905 +-14411.999736 -2454.999933 63528.000161 +4253.999680 -4207.000000 72200.000403 +-5341.000241 -2729.999555 72920.000190 +2853.000367 -1953.999662 53119.999629 +-3406.000346 -1973.999690 53659.999516 +-1775.999547 -2723.000080 72740.000246 +4217.999913 -1960.999660 58299.999623 +-12252.999887 -2905.000019 73451.999641 +-8542.999786 -1404.000473 73099.999728 +-3126.999630 16.999618 53660.000475 +4159.999910 1615.999982 57258.000198 +-2818.000192 -8501.000061 72739.999578 +-5673.000319 -5673.000048 72919.999599 +-5126.999657 -352.999916 72981.000008 +-14543.999526 4873.000287 62170.000355 +5664.000113 -5617.000339 72200.000484 +-13992.999970 -6905.000388 73548.000167 +-3906.999574 -2723.000211 72740.000342 +-5672.999570 -1399.999715 72920.000026 +-3569.999982 5890.000467 53954.000331 +4288.000173 6409.999525 60833.999858 +-5387.999815 -2682.000374 72920.000431 +-13971.000415 -3755.000354 71592.999978 +-3930.000128 1170.000156 53659.999938 +-1828.000158 -1966.999726 53479.999657 +17.000335 4196.000427 53479.999613 +-1427.000066 4924.000037 53743.999863 +-13721.000451 -9963.000322 73555.999557 +-5388.000021 3727.000164 72919.999832 +1941.000051 538.000495 53448.000163 +4287.999864 836.000460 60833.999839 +780.999670 -1960.999553 53299.999658 +-5673.000397 7144.999809 72919.999807 +-5673.000146 2871.999537 72920.000249 +533.000383 -1965.000046 53607.999748 +-13992.999662 -9985.999679 73548.000146 +4582.999714 -2702.999761 72199.999726 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/fin b/Alpha_shapes_3/demo/Alpha_shapes_3/data/fin new file mode 100644 index 000000000000..7b20bc03c7fc --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/fin @@ -0,0 +1,8 @@ +7 +5.51274721097227705 8.87625776353026552 1.95944807904169238 +9.0973375091665627 3.5350701520269201 4.7238755547204434 +0.911806739546155987 6.95856700036594145 2.36699662526417143 +5.36336900378107373 1.05840486239320186 1.22179856797203001 +0.289239615689291796 9.24621240074391082 2.17110435171762095 +1.39772879354093327 3.51084799856703622 9.44541630320511771 +7.31227573940480369 2.67306741439382023 0.511378392640958745 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/fout b/Alpha_shapes_3/demo/Alpha_shapes_3/data/fout new file mode 100644 index 000000000000..016012bd00cc --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/fout @@ -0,0 +1,17 @@ +5.51275 8.87626 1.95945 +0.911807 6.95857 2.367 +5.36337 1.0584 1.2218 +7.31228 2.67307 0.511378 +9.09734 3.53507 4.72388 +1.39773 3.51085 9.44542 +0.28924 9.24621 2.1711 +4 5 0 +5 6 0 +1 0 6 +3 2 4 +4 0 3 +2 3 1 +0 1 3 +2 5 4 +5 2 1 +6 5 1 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/head_ran.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/head_ran.pts new file mode 100644 index 000000000000..c9cacabc3ff2 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/head_ran.pts @@ -0,0 +1,857 @@ +856 +304.000000 483.000000 110.000433 +173.000000 315.000000 150.000135 +389.000000 259.000000 110.000009 +197.000000 341.000000 130.000097 +390.000000 329.000000 69.999907 +87.000000 189.000000 119.999588 +427.000000 391.000000 19.999914 +219.000000 283.000000 159.999587 +228.000000 410.000000 149.999687 +176.000000 356.000000 150.000143 +36.000000 243.000000 40.000174 +409.000000 409.000000 9.999581 +345.000000 395.000000 130.000241 +378.000000 336.000000 79.999859 +405.000000 442.000000 29.999878 +437.000000 388.000000 20.000099 +385.000000 345.000000 90.000418 +223.000000 509.000000 10.000330 +253.000000 62.000000 10.000304 +339.000000 498.000000 40.000232 +418.000000 406.000000 20.000279 +203.000000 86.000000 99.999776 +96.000000 159.000000 120.000081 +390.000000 320.000000 69.999762 +344.000000 362.000000 139.999772 +157.000000 57.000000 -0.000304 +130.000000 480.000000 40.000064 +190.000000 294.000000 160.000245 +407.000000 398.000000 30.000234 +396.000000 436.000000 40.000360 +387.000000 332.000000 49.999562 +192.000000 317.000000 149.999693 +90.000000 134.000000 99.999822 +92.000000 252.000000 130.000028 +164.000000 251.000000 159.999649 +161.000000 448.000000 120.000467 +380.000000 453.000000 50.000039 +76.000000 423.000000 39.999921 +410.000000 176.000000 40.000464 +346.000000 238.000000 140.000280 +278.000000 464.000000 130.000458 +318.000000 464.000000 110.000374 +421.000000 273.000000 39.999857 +320.000000 85.000000 9.999990 +230.000000 60.000000 40.000167 +403.000000 443.000000 9.999941 +377.000000 278.000000 129.999965 +211.000000 75.000000 79.999614 +396.000000 451.000000 19.999695 +379.000000 323.000000 100.000100 +138.000000 162.000000 149.999904 +373.000000 359.000000 119.999709 +298.000000 154.000000 140.000005 +377.000000 481.000000 19.999977 +405.000000 280.000000 99.999667 +412.000000 329.000000 20.000329 +392.000000 320.000000 80.000343 +155.000000 323.000000 159.999924 +171.000000 323.000000 149.999700 +70.000000 369.000000 60.000396 +270.000000 512.000000 100.000031 +62.000000 359.000000 10.000338 +401.000000 300.000000 49.999758 +366.000000 156.000000 99.999742 +125.000000 289.000000 150.000344 +306.000000 417.000000 140.000297 +189.000000 303.000000 160.000009 +215.000000 339.000000 140.000396 +346.000000 349.000000 139.999537 +73.000000 365.000000 69.999577 +127.000000 77.000000 70.000150 +108.000000 80.000000 9.999701 +416.000000 396.000000 29.999763 +355.000000 471.000000 70.000335 +383.000000 332.000000 79.999789 +279.000000 495.000000 109.999962 +182.000000 392.000000 139.999695 +418.000000 194.000000 20.000169 +399.000000 396.000000 49.999602 +323.000000 406.000000 139.999632 +401.000000 296.000000 70.000372 +116.000000 94.000000 90.000421 +408.000000 302.000000 39.999870 +398.000000 444.000000 39.999970 +391.000000 316.000000 59.999679 +34.000000 233.000000 29.999582 +406.000000 412.000000 20.000116 +75.000000 278.000000 109.999973 +36.000000 251.000000 19.999539 +387.000000 142.000000 -0.000290 +415.000000 231.000000 60.000112 +114.000000 84.000000 59.999969 +176.000000 309.000000 159.999733 +104.000000 469.000000 79.999782 +134.000000 80.000000 80.000475 +365.000000 453.000000 60.000166 +76.000000 325.000000 100.000301 +372.000000 346.000000 120.000425 +384.000000 160.000000 79.999710 +352.000000 318.000000 129.999934 +385.000000 317.000000 40.000493 +381.000000 319.000000 110.000497 +103.000000 84.000000 19.999857 +400.000000 406.000000 40.000279 +354.000000 491.000000 60.000459 +419.000000 282.000000 10.000487 +203.000000 507.000000 60.000487 +235.000000 510.000000 89.999674 +444.000000 387.000000 29.999811 +391.000000 313.000000 99.999893 +398.000000 450.000000 9.999883 +131.000000 300.000000 150.000225 +83.000000 110.000000 40.000016 +187.000000 503.000000 -0.000434 +155.000000 323.000000 150.000140 +212.000000 54.000000 19.999945 +97.000000 291.000000 129.999725 +148.000000 308.000000 149.999883 +343.000000 211.000000 139.999546 +198.000000 328.000000 120.000389 +431.000000 405.000000 19.999725 +400.000000 300.000000 89.999605 +400.000000 184.000000 80.000122 +362.000000 340.000000 129.999568 +347.000000 272.000000 140.000053 +104.000000 251.000000 140.000464 +71.000000 131.000000 59.999648 +110.000000 94.000000 79.999923 +374.000000 479.000000 40.000239 +372.000000 328.000000 99.999759 +374.000000 456.000000 49.999600 +217.000000 466.000000 129.999695 +207.000000 340.000000 119.999813 +394.000000 298.000000 109.999600 +398.000000 158.000000 20.000463 +376.000000 422.000000 69.999535 +419.000000 204.000000 39.999848 +397.000000 425.000000 39.999772 +425.000000 394.000000 -0.000166 +395.000000 469.000000 0.000180 +203.000000 347.000000 130.000090 +175.000000 356.000000 159.999756 +337.000000 482.000000 79.999700 +403.000000 290.000000 100.000395 +384.000000 441.000000 59.999825 +103.000000 268.000000 139.999921 +88.000000 158.000000 110.000417 +420.000000 264.000000 49.999543 +394.000000 309.000000 59.999763 +403.000000 385.000000 49.999907 +398.000000 274.000000 109.999683 +398.000000 396.000000 30.000477 +188.000000 376.000000 149.999695 +251.000000 467.000000 129.999727 +410.000000 173.000000 -0.000375 +419.000000 388.000000 30.000459 +53.000000 178.000000 70.000064 +386.000000 456.000000 29.999720 +230.000000 432.000000 139.999657 +209.000000 102.000000 119.999952 +399.000000 261.000000 100.000481 +34.000000 263.000000 9.999982 +387.000000 185.000000 100.000227 +166.000000 200.000000 160.000091 +397.000000 459.000000 10.000459 +112.000000 355.000000 119.999623 +151.000000 416.000000 119.999934 +387.000000 396.000000 70.000126 +414.000000 205.000000 59.999887 +84.000000 431.000000 49.999623 +54.000000 333.000000 40.000151 +226.000000 489.000000 120.000098 +210.000000 331.000000 139.999959 +62.000000 355.000000 59.999599 +128.000000 201.000000 149.999744 +399.000000 310.000000 40.000499 +285.000000 137.000000 129.999978 +271.000000 90.000000 79.999948 +392.000000 406.000000 39.999814 +126.000000 71.000000 19.999775 +395.000000 316.000000 69.999631 +196.000000 340.000000 140.000123 +172.000000 101.000000 119.999703 +386.000000 386.000000 20.000299 +412.000000 373.000000 20.000375 +368.000000 337.000000 119.999973 +192.000000 56.000000 29.999926 +326.000000 425.000000 129.999868 +328.000000 124.000000 100.000456 +419.000000 252.000000 60.000317 +101.000000 187.000000 130.000292 +282.000000 510.000000 40.000476 +48.000000 169.000000 19.999612 +368.000000 263.000000 130.000181 +106.000000 86.000000 40.000336 +137.000000 485.000000 60.000020 +337.000000 498.000000 10.000284 +179.000000 390.000000 149.999695 +57.000000 165.000000 60.000363 +370.000000 319.000000 119.999686 +159.000000 305.000000 159.999920 +380.000000 410.000000 69.999540 +66.000000 161.000000 80.000411 +211.000000 325.000000 120.000116 +207.000000 322.000000 110.000247 +136.000000 139.000000 139.999844 +425.000000 364.000000 0.000175 +46.000000 181.000000 50.000130 +407.000000 374.000000 39.999586 +410.000000 170.000000 9.999842 +416.000000 288.000000 40.000290 +301.000000 198.000000 149.999552 +368.000000 431.000000 79.999967 +95.000000 115.000000 89.999527 +190.000000 504.000000 40.000392 +431.000000 381.000000 39.999951 +389.000000 385.000000 60.000331 +111.000000 236.000000 139.999941 +305.000000 86.000000 49.999887 +174.000000 344.000000 150.000400 +406.000000 290.000000 79.999632 +411.000000 176.000000 30.000029 +403.000000 401.000000 0.000395 +186.000000 371.000000 149.999597 +396.000000 378.000000 19.999972 +407.000000 393.000000 50.000248 +314.000000 84.000000 30.000111 +82.000000 442.000000 40.000237 +190.000000 63.000000 59.999546 +418.000000 280.000000 50.000063 +107.000000 109.000000 99.999534 +429.000000 377.000000 20.000148 +241.000000 399.000000 149.999519 +231.000000 480.000000 119.999633 +293.000000 494.000000 110.000320 +386.000000 395.000000 50.000398 +189.000000 304.000000 150.000129 +359.000000 426.000000 100.000239 +404.000000 445.000000 20.000042 +390.000000 362.000000 60.000269 +255.000000 393.000000 149.999647 +266.000000 511.000000 60.000270 +445.000000 377.000000 19.999922 +238.000000 512.000000 80.000183 +263.000000 74.000000 60.000051 +345.000000 327.000000 130.000341 +297.000000 510.000000 69.999558 +204.000000 336.000000 110.000464 +93.000000 273.000000 130.000439 +156.000000 143.000000 149.999849 +214.000000 414.000000 150.000013 +208.000000 475.000000 130.000315 +174.000000 350.000000 149.999545 +406.000000 179.000000 59.999608 +397.000000 418.000000 39.999645 +197.000000 340.000000 109.999887 +305.000000 95.000000 70.000078 +223.000000 451.000000 130.000063 +67.000000 291.000000 99.999993 +374.000000 461.000000 59.999831 +395.000000 317.000000 89.999780 +140.000000 482.000000 100.000201 +364.000000 361.000000 129.999692 +396.000000 462.000000 0.000002 +403.000000 421.000000 10.000436 +373.000000 174.000000 109.999736 +393.000000 458.000000 19.999949 +379.000000 456.000000 39.999971 +396.000000 240.000000 100.000184 +71.000000 118.000000 20.000391 +364.000000 427.000000 90.000438 +390.000000 440.000000 49.999887 +44.000000 183.000000 0.000039 +75.000000 348.000000 90.000315 +405.000000 315.000000 0.000238 +320.000000 96.000000 60.000082 +85.000000 447.000000 50.000024 +391.000000 313.000000 40.000474 +303.000000 506.000000 29.999976 +346.000000 147.000000 110.000432 +203.000000 323.000000 120.000169 +185.000000 502.000000 90.000110 +135.000000 94.000000 100.000385 +385.000000 326.000000 99.999934 +388.000000 474.000000 39.999867 +43.000000 221.000000 70.000067 +415.000000 267.000000 79.999572 +401.000000 300.000000 80.000252 +54.000000 190.000000 79.999547 +388.000000 414.000000 49.999501 +400.000000 435.000000 29.999929 +179.000000 325.000000 149.999681 +390.000000 475.000000 20.000480 +210.000000 329.000000 110.000432 +124.000000 264.000000 149.999656 +380.000000 357.000000 110.000447 +35.000000 221.000000 0.000130 +422.000000 256.000000 -0.000478 +297.000000 502.000000 100.000074 +387.000000 404.000000 40.000484 +121.000000 142.000000 129.999588 +363.000000 488.000000 49.999644 +81.000000 441.000000 -0.000224 +310.000000 125.000000 110.000381 +202.000000 330.000000 129.999580 +154.000000 79.000000 90.000488 +349.000000 281.000000 139.999939 +266.000000 452.000000 139.999876 +419.000000 273.000000 60.000253 +60.000000 291.000000 90.000373 +53.000000 160.000000 30.000462 +401.000000 327.000000 29.999868 +388.000000 333.000000 90.000054 +409.000000 393.000000 39.999876 +329.000000 501.000000 19.999774 +66.000000 203.000000 99.999570 +84.000000 101.000000 0.000252 +378.000000 372.000000 110.000496 +177.000000 378.000000 160.000055 +378.000000 208.000000 120.000080 +39.000000 260.000000 49.999598 +113.000000 439.000000 90.000322 +386.000000 404.000000 50.000352 +88.000000 335.000000 110.000457 +408.000000 239.000000 80.000309 +385.000000 339.000000 79.999563 +65.000000 359.000000 -0.000186 +388.000000 339.000000 70.000118 +194.000000 479.000000 130.000054 +205.000000 359.000000 150.000249 +308.000000 366.000000 149.999771 +411.000000 305.000000 9.999644 +336.000000 473.000000 90.000141 +107.000000 380.000000 100.000196 +413.000000 210.000000 69.999762 +417.000000 191.000000 9.999593 +422.000000 243.000000 30.000485 +290.000000 76.000000 39.999602 +387.000000 321.000000 99.999700 +107.000000 439.000000 79.999777 +240.000000 254.000000 160.000437 +422.000000 265.000000 9.999794 +49.000000 243.000000 79.999624 +396.000000 392.000000 29.999964 +69.000000 389.000000 9.999977 +393.000000 327.000000 79.999595 +383.000000 337.000000 90.000313 +124.000000 155.000000 139.999884 +390.000000 328.000000 89.999610 +388.000000 310.000000 109.999974 +401.000000 437.000000 20.000420 +181.000000 305.000000 149.999817 +122.000000 121.000000 119.999998 +81.000000 441.000000 20.000065 +107.000000 303.000000 129.999801 +51.000000 295.000000 60.000192 +97.000000 458.000000 70.000150 +112.000000 293.000000 140.000309 +392.000000 147.000000 29.999844 +395.000000 458.000000 -0.000345 +396.000000 471.000000 20.000089 +205.000000 445.000000 139.999722 +392.000000 425.000000 49.999927 +407.000000 291.000000 60.000455 +364.000000 329.000000 109.999573 +334.000000 449.000000 110.000287 +377.000000 296.000000 129.999513 +202.000000 396.000000 149.999929 +68.000000 386.000000 19.999990 +376.000000 332.000000 89.999690 +442.000000 399.000000 20.000326 +388.000000 295.000000 120.000295 +387.000000 341.000000 50.000408 +112.000000 81.000000 49.999621 +410.000000 386.000000 50.000226 +59.000000 311.000000 80.000359 +330.000000 499.000000 80.000308 +199.000000 332.000000 110.000351 +202.000000 332.000000 140.000116 +38.000000 196.000000 30.000366 +206.000000 407.000000 150.000108 +385.000000 458.000000 39.999801 +178.000000 370.000000 150.000203 +74.000000 419.000000 10.000074 +417.000000 405.000000 29.999702 +47.000000 272.000000 69.999870 +164.000000 373.000000 160.000203 +408.000000 409.000000 29.999548 +376.000000 335.000000 99.999615 +399.000000 396.000000 19.999683 +334.000000 491.000000 79.999633 +379.000000 478.000000 -0.000167 +303.000000 471.000000 120.000457 +291.000000 478.000000 120.000436 +400.000000 433.000000 0.000031 +90.000000 450.000000 59.999865 +319.000000 291.000000 150.000192 +33.000000 256.000000 20.000497 +445.000000 393.000000 10.000151 +341.000000 497.000000 69.999978 +390.000000 240.000000 110.000036 +276.000000 69.000000 19.999504 +173.000000 57.000000 40.000059 +209.000000 359.000000 139.999774 +387.000000 392.000000 20.000481 +318.000000 503.000000 89.999523 +378.000000 478.000000 39.999991 +84.000000 285.000000 119.999551 +337.000000 335.000000 140.000134 +117.000000 372.000000 109.999629 +359.000000 458.000000 79.999820 +146.000000 67.000000 60.000076 +377.000000 406.000000 90.000477 +381.000000 316.000000 109.999684 +48.000000 183.000000 60.000220 +302.000000 452.000000 130.000413 +138.000000 100.000000 109.999758 +268.000000 511.000000 20.000319 +210.000000 324.000000 109.999505 +331.000000 180.000000 139.999527 +354.000000 422.000000 109.999787 +287.000000 509.000000 80.000157 +217.000000 437.000000 139.999915 +348.000000 294.000000 139.999826 +145.000000 109.000000 119.999748 +86.000000 413.000000 69.999800 +407.000000 365.000000 39.999844 +393.000000 458.000000 29.999694 +180.000000 409.000000 139.999597 +79.000000 429.000000 0.000369 +385.000000 468.000000 50.000300 +167.000000 68.000000 70.000425 +424.000000 392.000000 40.000496 +334.000000 328.000000 139.999843 +88.000000 115.000000 79.999614 +185.000000 284.000000 160.000326 +178.000000 122.000000 140.000324 +96.000000 434.000000 69.999906 +138.000000 390.000000 119.999927 +379.000000 449.000000 60.000479 +383.000000 360.000000 100.000229 +394.000000 447.000000 40.000372 +429.000000 374.000000 0.000267 +250.000000 447.000000 140.000291 +374.000000 395.000000 99.999977 +421.000000 400.000000 29.999804 +173.000000 498.000000 100.000223 +112.000000 80.000000 29.999608 +397.000000 307.000000 69.999990 +94.000000 95.000000 30.000227 +365.000000 214.000000 130.000457 +69.000000 124.000000 -0.000140 +214.000000 342.000000 129.999922 +378.000000 324.000000 50.000407 +170.000000 92.000000 110.000496 +396.000000 206.000000 99.999936 +385.000000 359.000000 89.999911 +262.000000 483.000000 120.000212 +73.000000 418.000000 0.000094 +263.000000 117.000000 120.000412 +392.000000 469.000000 40.000013 +203.000000 340.000000 120.000411 +206.000000 141.000000 149.999614 +65.000000 250.000000 100.000372 +408.000000 263.000000 89.999711 +356.000000 326.000000 120.000249 +390.000000 318.000000 90.000241 +357.000000 369.000000 129.999641 +200.000000 332.000000 149.999692 +356.000000 314.000000 130.000478 +206.000000 335.000000 150.000105 +388.000000 349.000000 79.999724 +422.000000 361.000000 29.999572 +336.000000 384.000000 139.999898 +371.000000 477.000000 49.999938 +383.000000 332.000000 70.000333 +358.000000 117.000000 49.999606 +228.000000 511.000000 109.999685 +391.000000 449.000000 50.000425 +210.000000 331.000000 130.000294 +414.000000 332.000000 10.000205 +79.000000 429.000000 20.000389 +425.000000 348.000000 19.999522 +188.000000 500.000000 120.000132 +414.000000 395.000000 19.999694 +333.000000 502.000000 0.000474 +163.000000 74.000000 80.000256 +414.000000 352.000000 0.000273 +396.000000 471.000000 29.999511 +161.000000 113.000000 130.000121 +38.000000 271.000000 0.000064 +406.000000 390.000000 29.999509 +255.000000 136.000000 140.000180 +143.000000 362.000000 130.000256 +205.000000 348.000000 149.999703 +370.000000 484.000000 39.999679 +361.000000 394.000000 119.999961 +236.000000 511.000000 69.999764 +161.000000 344.000000 150.000324 +271.000000 99.000000 100.000087 +347.000000 129.000000 90.000352 +383.000000 473.000000 20.000348 +418.000000 261.000000 69.999636 +342.000000 477.000000 80.000249 +240.000000 212.000000 159.999945 +93.000000 387.000000 89.999525 +214.000000 335.000000 130.000266 +434.000000 365.000000 19.999711 +377.000000 248.000000 120.000476 +84.000000 227.000000 120.000431 +391.000000 462.000000 39.999559 +390.000000 473.000000 -0.000072 +442.000000 378.000000 29.999932 +357.000000 126.000000 69.999812 +64.000000 143.000000 49.999661 +339.000000 310.000000 139.999787 +376.000000 446.000000 69.999556 +421.000000 272.000000 29.999579 +383.000000 398.000000 79.999947 +377.000000 339.000000 90.000050 +357.000000 461.000000 70.000494 +381.000000 346.000000 99.999989 +198.000000 335.000000 129.999550 +383.000000 383.000000 89.999876 +392.000000 395.000000 50.000489 +385.000000 318.000000 50.000068 +196.000000 506.000000 109.999506 +183.000000 138.000000 150.000295 +434.000000 396.000000 0.000059 +38.000000 219.000000 50.000182 +390.000000 284.000000 120.000395 +365.000000 347.000000 129.999830 +74.000000 118.000000 30.000426 +207.000000 122.000000 140.000380 +113.000000 116.000000 109.999784 +416.000000 292.000000 30.000362 +414.000000 279.000000 80.000030 +441.000000 386.000000 0.000095 +144.000000 337.000000 139.999525 +386.000000 148.000000 60.000351 +93.000000 409.000000 79.999575 +170.000000 409.000000 129.999719 +104.000000 348.000000 119.999514 +377.000000 416.000000 80.000066 +392.000000 410.000000 40.000224 +322.000000 258.000000 150.000354 +387.000000 142.000000 39.999842 +378.000000 327.000000 109.999670 +403.000000 268.000000 99.999822 +219.000000 183.000000 160.000476 +196.000000 361.000000 150.000187 +436.000000 397.000000 30.000102 +187.000000 334.000000 150.000416 +361.000000 476.000000 60.000302 +265.000000 462.000000 129.999811 +357.000000 334.000000 129.999518 +397.000000 317.000000 80.000196 +201.000000 110.000000 129.999544 +170.000000 292.000000 159.999874 +376.000000 342.000000 110.000096 +288.000000 382.000000 150.000470 +385.000000 328.000000 40.000208 +380.000000 263.000000 120.000184 +279.000000 96.000000 90.000454 +298.000000 508.000000 10.000017 +391.000000 274.000000 119.999504 +80.000000 121.000000 70.000114 +414.000000 240.000000 70.000303 +72.000000 385.000000 50.000489 +312.000000 443.000000 129.999958 +381.000000 307.000000 119.999893 +147.000000 60.000000 29.999771 +233.000000 512.000000 49.999755 +129.000000 479.000000 69.999985 +383.000000 474.000000 -0.000300 +119.000000 474.000000 50.000440 +162.000000 87.000000 99.999822 +388.000000 320.000000 60.000475 +208.000000 92.000000 110.000454 +402.000000 441.000000 -0.000434 +247.000000 61.000000 30.000254 +60.000000 177.000000 89.999508 +375.000000 338.000000 100.000112 +388.000000 475.000000 30.000200 +169.000000 361.000000 150.000305 +73.000000 138.000000 69.999613 +151.000000 130.000000 140.000243 +292.000000 428.000000 139.999652 +43.000000 288.000000 40.000209 +411.000000 196.000000 69.999886 +191.000000 440.000000 139.999870 +188.000000 393.000000 150.000062 +379.000000 331.000000 100.000426 +421.000000 211.000000 10.000373 +151.000000 489.000000 110.000018 +214.000000 501.000000 120.000350 +186.000000 475.000000 130.000205 +119.000000 171.000000 139.999644 +166.000000 495.000000 49.999638 +94.000000 139.000000 110.000263 +361.000000 113.000000 30.000475 +287.000000 462.000000 129.999600 +119.000000 472.000000 0.000324 +336.000000 499.000000 59.999701 +397.000000 309.000000 79.999503 +396.000000 468.000000 9.999539 +418.000000 219.000000 50.000021 +188.000000 53.000000 9.999892 +317.000000 484.000000 99.999771 +87.000000 99.000000 9.999789 +440.000000 400.000000 10.000026 +77.000000 414.000000 50.000086 +59.000000 334.000000 69.999692 +389.000000 473.000000 10.000131 +93.000000 364.000000 99.999586 +191.000000 380.000000 140.000324 +397.000000 463.000000 20.000440 +314.000000 83.000000 -0.000144 +404.000000 252.000000 89.999526 +192.000000 55.000000 0.000057 +37.000000 211.000000 39.999811 +408.000000 337.000000 0.000463 +386.000000 321.000000 50.000145 +57.000000 307.000000 69.999726 +399.000000 434.000000 9.999597 +440.000000 394.000000 0.000167 +194.000000 347.000000 139.999819 +187.000000 359.000000 160.000408 +82.000000 430.000000 30.000265 +292.000000 510.000000 90.000293 +179.000000 291.000000 160.000422 +346.000000 484.000000 69.999785 +433.000000 395.000000 19.999927 +238.000000 463.000000 129.999988 +431.000000 404.000000 10.000165 +125.000000 346.000000 130.000258 +364.000000 483.000000 50.000249 +152.000000 60.000000 10.000471 +412.000000 390.000000 50.000296 +167.000000 492.000000 119.999873 +162.000000 360.000000 140.000440 +76.000000 394.000000 60.000355 +404.000000 389.000000 0.000108 +131.000000 68.000000 10.000393 +79.000000 430.000000 9.999539 +414.000000 282.000000 59.999976 +171.000000 344.000000 160.000494 +140.000000 307.000000 150.000051 +371.000000 276.000000 130.000475 +410.000000 320.000000 9.999772 +399.000000 300.000000 60.000152 +410.000000 275.000000 90.000213 +178.000000 501.000000 69.999844 +396.000000 463.000000 29.999717 +270.000000 511.000000 0.000287 +105.000000 365.000000 110.000111 +36.000000 263.000000 29.999728 +42.000000 269.000000 60.000204 +152.000000 382.000000 129.999554 +139.000000 124.000000 129.999830 +178.000000 499.000000 9.999512 +380.000000 329.000000 60.000364 +195.000000 398.000000 149.999704 +105.000000 138.000000 120.000289 +130.000000 480.000000 19.999848 +241.000000 504.000000 110.000227 +249.000000 61.000000 0.000215 +149.000000 63.000000 50.000394 +435.000000 381.000000 19.999612 +370.000000 120.000000 19.999582 +395.000000 363.000000 50.000173 +390.000000 455.000000 0.000083 +345.000000 465.000000 89.999529 +321.000000 451.000000 120.000069 +232.000000 72.000000 69.999566 +78.000000 441.000000 10.000433 +411.000000 254.000000 79.999644 +349.000000 104.000000 9.999972 +40.000000 224.000000 59.999868 +401.000000 417.000000 30.000379 +55.000000 328.000000 60.000186 +136.000000 66.000000 39.999869 +387.000000 459.000000 19.999694 +238.000000 120.000000 129.999648 +380.000000 232.000000 119.999852 +387.000000 336.000000 59.999680 +386.000000 316.000000 100.000192 +202.000000 323.000000 110.000169 +421.000000 243.000000 39.999865 +378.000000 477.000000 19.999946 +403.000000 407.000000 0.000441 +117.000000 473.000000 10.000461 +388.000000 454.000000 40.000397 +36.000000 209.000000 9.999788 +344.000000 158.000000 120.000283 +167.000000 319.000000 160.000206 +80.000000 432.000000 39.999684 +124.000000 318.000000 139.999804 +379.000000 285.000000 130.000148 +420.000000 205.000000 29.999982 +364.000000 457.000000 60.000173 +314.000000 319.000000 150.000372 +271.000000 387.000000 149.999929 +405.000000 324.000000 -0.000038 +393.000000 305.000000 49.999780 +380.000000 472.000000 50.000100 +392.000000 455.000000 10.000360 +430.000000 366.000000 30.000433 +88.000000 433.000000 60.000203 +400.000000 426.000000 20.000350 +198.000000 506.000000 19.999553 +369.000000 321.000000 109.999993 +389.000000 376.000000 70.000300 +447.000000 391.000000 19.999590 +78.000000 255.000000 120.000420 +201.000000 310.000000 150.000380 +385.000000 330.000000 99.999671 +313.000000 506.000000 50.000090 +398.000000 286.000000 110.000315 +366.000000 325.000000 119.999806 +431.000000 389.000000 39.999680 +71.000000 122.000000 9.999706 +416.000000 393.000000 -0.000388 +339.000000 98.000000 40.000373 +354.000000 120.000000 59.999789 +163.000000 480.000000 119.999792 +209.000000 78.000000 90.000471 +340.000000 454.000000 100.000347 +344.000000 120.000000 79.999566 +34.000000 221.000000 20.000076 +130.000000 440.000000 100.000378 +367.000000 328.000000 100.000402 +372.000000 485.000000 29.999664 +35.000000 247.000000 -0.000266 +230.000000 454.000000 130.000398 +155.000000 314.000000 150.000438 +386.000000 168.000000 89.999942 +423.000000 398.000000 20.000409 +252.000000 68.000000 49.999609 +405.000000 314.000000 30.000086 +78.000000 140.000000 90.000406 +373.000000 453.000000 60.000142 +159.000000 328.000000 150.000142 +74.000000 417.000000 30.000409 +330.000000 91.000000 20.000081 +388.000000 332.000000 80.000109 +385.000000 328.000000 60.000013 +174.000000 447.000000 130.000073 +316.000000 226.000000 149.999931 +393.000000 453.000000 30.000415 +361.000000 321.000000 119.999624 +376.000000 465.000000 60.000467 +366.000000 448.000000 79.999941 +58.000000 346.000000 50.000010 +391.000000 384.000000 50.000228 +162.000000 396.000000 129.999672 +425.000000 378.000000 40.000076 +421.000000 278.000000 -0.000240 +179.000000 381.000000 150.000273 +355.000000 483.000000 60.000125 +82.000000 442.000000 29.999998 +83.000000 108.000000 50.000310 +407.000000 175.000000 49.999596 +74.000000 418.000000 19.999690 +132.000000 415.000000 109.999606 +327.000000 489.000000 90.000109 +408.000000 211.000000 79.999683 +416.000000 201.000000 50.000427 +69.000000 380.000000 40.000280 +235.000000 151.000000 150.000472 +369.000000 307.000000 130.000229 +396.000000 164.000000 70.000265 +308.000000 338.000000 149.999970 +175.000000 330.000000 159.999778 +150.000000 349.000000 139.999937 +421.000000 219.000000 -0.000068 +444.000000 384.000000 9.999661 +407.000000 335.000000 29.999975 +123.000000 480.000000 90.000020 +388.000000 207.000000 110.000124 +190.000000 372.000000 140.000446 +127.000000 482.000000 30.000090 +276.000000 476.000000 120.000370 +413.000000 289.000000 49.999591 +240.000000 510.000000 30.000054 +410.000000 316.000000 20.000107 +354.000000 109.000000 -0.000420 +56.000000 226.000000 90.000305 +55.000000 346.000000 20.000297 +373.000000 329.000000 109.999831 +421.000000 269.000000 20.000125 +417.000000 194.000000 -0.000244 +377.000000 477.000000 10.000096 +311.000000 136.000000 120.000023 +355.000000 326.000000 130.000433 +84.000000 110.000000 60.000454 +202.000000 506.000000 80.000296 +398.000000 392.000000 0.000118 +261.000000 501.000000 110.000266 +386.000000 140.000000 10.000112 +75.000000 210.000000 110.000483 +418.000000 392.000000 39.999772 +47.000000 172.000000 39.999530 +201.000000 61.000000 50.000348 +174.000000 426.000000 129.999769 +406.000000 287.000000 89.999588 +406.000000 294.000000 50.000482 +178.000000 464.000000 129.999690 +379.000000 481.000000 0.000359 +66.000000 135.000000 40.000472 +439.000000 380.000000 -0.000057 +410.000000 300.000000 0.000483 +400.000000 198.000000 90.000463 +396.000000 305.000000 99.999628 +112.000000 327.000000 129.999537 +400.000000 351.000000 39.999731 +285.000000 445.000000 140.000481 +194.000000 345.000000 120.000109 +395.000000 373.000000 49.999714 +417.000000 277.000000 69.999982 +220.000000 511.000000 100.000036 +368.000000 181.000000 119.999800 +330.000000 162.000000 130.000194 +355.000000 188.000000 130.000376 +158.000000 58.000000 20.000298 +402.000000 419.000000 0.000043 +389.000000 147.000000 50.000103 +77.000000 161.000000 99.999915 +99.000000 98.000000 69.999881 +383.000000 472.000000 10.000356 +123.000000 366.000000 120.000131 +109.000000 78.000000 -0.000493 +441.000000 394.000000 29.999848 +118.000000 405.000000 100.000021 +148.000000 454.000000 109.999506 +416.000000 405.000000 10.000422 +214.000000 331.000000 120.000073 +377.000000 481.000000 9.999558 +381.000000 413.000000 59.999620 +400.000000 448.000000 30.000243 +185.000000 358.000000 149.999663 +194.000000 362.000000 139.999629 +184.000000 183.000000 160.000453 +391.000000 348.000000 50.000085 +378.000000 477.000000 30.000336 +314.000000 349.000000 150.000272 +159.000000 302.000000 150.000093 +70.000000 396.000000 29.999689 +186.000000 428.000000 140.000092 +384.000000 460.000000 50.000420 +240.000000 438.000000 139.999721 +384.000000 426.000000 59.999785 +396.000000 389.000000 50.000117 +210.000000 348.000000 139.999537 +46.000000 171.000000 9.999837 +173.000000 498.000000 30.000387 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/skull.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/skull.pts new file mode 100644 index 000000000000..563ef228171a --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/skull.pts @@ -0,0 +1,27088 @@ + 106.2500 116.5000 -8.0 + 104.5000 117.2500 -8.0 + 102.2500 119.5000 -8.0 + 97.2500 129.5000 -8.0 + 93.5000 139.2500 -8.0 + 93.2500 147.5000 -8.0 + 94.2500 149.5000 -8.0 + 95.2500 155.5000 -8.0 + 99.2500 161.5000 -8.0 + 102.2500 163.5000 -8.0 + 106.5000 163.7500 -8.0 + 110.5000 160.7500 -8.0 + 113.7500 151.5000 -8.0 + 117.5000 143.7500 -8.0 + 118.5000 138.7500 -8.0 + 118.7500 131.5000 -8.0 + 115.7500 120.5000 -8.0 + 112.7500 116.5000 -8.0 + 105.2500 106.5000 -10.0 + 100.5000 108.2500 -10.0 + 96.2500 112.5000 -10.0 + 92.5000 119.2500 -10.0 + 91.2500 125.5000 -10.0 + 87.5000 135.2500 -10.0 + 87.2500 153.5000 -10.0 + 89.2500 159.5000 -10.0 + 89.2500 163.5000 -10.0 + 94.2500 173.5000 -10.0 + 95.5000 173.7500 -10.0 + 97.5000 175.7500 -10.0 + 102.5000 176.7500 -10.0 + 111.5000 173.7500 -10.0 + 114.7500 170.5000 -10.0 + 119.7500 160.5000 -10.0 + 121.7500 151.5000 -10.0 + 123.7500 147.5000 -10.0 + 125.7500 140.5000 -10.0 + 126.7500 133.5000 -10.0 + 125.7500 131.5000 -10.0 + 125.7500 127.5000 -10.0 + 122.7500 116.5000 -10.0 + 118.7500 110.5000 -10.0 + 111.7500 106.5000 -10.0 + 103.2500 100.5000 -12.0 + 97.5000 103.2500 -12.0 + 92.5000 108.2500 -12.0 + 87.2500 117.5000 -12.0 + 85.2500 126.5000 -12.0 + 83.2500 130.5000 -12.0 + 81.5000 139.2500 -12.0 + 81.2500 148.5000 -12.0 + 82.2500 150.5000 -12.0 + 82.2500 155.5000 -12.0 + 83.2500 157.5000 -12.0 + 84.2500 165.5000 -12.0 + 87.2500 175.5000 -12.0 + 93.5000 181.7500 -12.0 + 100.2500 183.5000 -12.0 + 104.5000 183.7500 -12.0 + 115.5000 179.7500 -12.0 + 121.7500 172.5000 -12.0 + 124.7500 166.5000 -12.0 + 127.7500 151.5000 -12.0 + 131.5000 140.7500 -12.0 + 131.7500 127.5000 -12.0 + 130.7500 125.5000 -12.0 + 129.7500 119.5000 -12.0 + 124.7500 109.5000 -12.0 + 119.5000 104.2500 -12.0 + 112.7500 100.5000 -12.0 + 102.2500 95.5000 -14.0 + 96.5000 98.2500 -14.0 + 88.2500 106.5000 -14.0 + 83.2500 114.5000 -14.0 + 77.5000 137.2500 -14.0 + 77.2500 152.5000 -14.0 + 78.2500 154.5000 -14.0 + 78.2500 160.5000 -14.0 + 79.2500 162.5000 -14.0 + 79.2500 167.5000 -14.0 + 83.2500 178.5000 -14.0 + 87.2500 183.5000 -14.0 + 91.5000 186.7500 -14.0 + 103.5000 188.7500 -14.0 + 105.5000 187.7500 -14.0 + 110.5000 187.7500 -14.0 + 118.5000 183.7500 -14.0 + 125.7500 176.5000 -14.0 + 130.5000 168.7500 -14.0 + 132.7500 152.5000 -14.0 + 135.5000 143.7500 -14.0 + 136.7500 129.5000 -14.0 + 135.7500 127.5000 -14.0 + 134.7500 119.5000 -14.0 + 128.7500 107.5000 -14.0 + 121.5000 100.2500 -14.0 + 112.7500 95.5000 -14.0 + 107.7500 123.5000 -14.0 + 108.5000 122.7500 -14.0 + 109.2500 123.5000 -14.0 + 109.2500 133.5000 -14.0 + 110.2500 135.5000 -14.0 + 109.5000 137.2500 -14.0 + 109.2500 142.5000 -14.0 + 110.2500 144.5000 -14.0 + 110.2500 147.5000 -14.0 + 112.2500 151.5000 -14.0 + 112.2500 153.5000 -14.0 + 111.2500 156.5000 -14.0 + 108.5000 160.2500 -14.0 + 106.5000 161.2500 -14.0 + 104.5000 156.2500 -14.0 + 101.5000 157.2500 -14.0 + 100.5000 159.2500 -14.0 + 98.5000 158.2500 -14.0 + 92.7500 153.5000 -14.0 + 92.7500 149.5000 -14.0 + 94.5000 147.7500 -14.0 + 96.5000 146.7500 -14.0 + 94.7500 143.5000 -14.0 + 94.7500 138.5000 -14.0 + 96.7500 136.5000 -14.0 + 99.5000 132.7500 -14.0 + 101.2500 133.5000 -14.0 + 101.2500 136.5000 -14.0 + 103.2500 138.5000 -14.0 + 105.7500 137.5000 -14.0 + 101.2500 91.5000 -16.0 + 95.5000 94.2500 -16.0 + 87.5000 101.2500 -16.0 + 84.2500 105.5000 -16.0 + 78.2500 117.5000 -16.0 + 73.5000 137.2500 -16.0 + 73.2500 153.5000 -16.0 + 74.2500 155.5000 -16.0 + 74.2500 163.5000 -16.0 + 75.2500 165.5000 -16.0 + 75.2500 169.5000 -16.0 + 76.2500 171.5000 -16.0 + 76.2500 173.5000 -16.0 + 81.2500 183.5000 -16.0 + 86.2500 188.5000 -16.0 + 91.2500 191.5000 -16.0 + 100.5000 191.7500 -16.0 + 102.2500 192.5000 -16.0 + 111.7500 192.5000 -16.0 + 118.5000 189.7500 -16.0 + 127.7500 181.5000 -16.0 + 135.7500 168.5000 -16.0 + 140.7500 133.5000 -16.0 + 139.7500 131.5000 -16.0 + 139.7500 124.5000 -16.0 + 138.7500 122.5000 -16.0 + 137.7500 116.5000 -16.0 + 133.7500 107.5000 -16.0 + 126.7500 99.5000 -16.0 + 122.5000 96.2500 -16.0 + 112.7500 91.5000 -16.0 + 105.7500 108.5000 -16.0 + 107.5000 107.7500 -16.0 + 109.2500 110.5000 -16.0 + 115.5000 114.7500 -16.0 + 117.2500 117.5000 -16.0 + 117.2500 120.5000 -16.0 + 115.5000 129.2500 -16.0 + 115.2500 135.5000 -16.0 + 114.2500 137.5000 -16.0 + 115.2500 139.5000 -16.0 + 115.2500 150.5000 -16.0 + 116.2500 152.5000 -16.0 + 115.5000 153.2500 -16.0 + 115.2500 160.5000 -16.0 + 111.5000 171.2500 -16.0 + 102.5000 170.2500 -16.0 + 98.5000 172.2500 -16.0 + 92.7500 169.5000 -16.0 + 92.7500 166.5000 -16.0 + 90.7500 162.5000 -16.0 + 90.7500 159.5000 -16.0 + 89.7500 157.5000 -16.0 + 89.7500 149.5000 -16.0 + 90.5000 147.7500 -16.0 + 90.7500 140.5000 -16.0 + 94.5000 134.7500 -16.0 + 96.5000 126.7500 -16.0 + 96.7500 121.5000 -16.0 + 98.7500 115.5000 -16.0 + 102.5000 112.7500 -16.0 + 93.7500 176.5000 -16.0 + 95.5000 175.7500 -16.0 + 97.2500 177.5000 -16.0 + 96.5000 181.2500 -16.0 + 104.2500 87.5000 -18.0 + 103.5000 88.2500 -18.0 + 99.5000 88.2500 -18.0 + 91.5000 93.2500 -18.0 + 87.5000 96.2500 -18.0 + 81.2500 103.5000 -18.0 + 75.5000 114.2500 -18.0 + 75.2500 116.5000 -18.0 + 74.2500 118.5000 -18.0 + 73.2500 123.5000 -18.0 + 72.5000 125.2500 -18.0 + 71.2500 133.5000 -18.0 + 70.5000 135.2500 -18.0 + 70.2500 160.5000 -18.0 + 71.2500 162.5000 -18.0 + 71.2500 169.5000 -18.0 + 72.2500 171.5000 -18.0 + 72.5000 173.7500 -18.0 + 76.2500 182.5000 -18.0 + 82.2500 189.5000 -18.0 + 86.5000 192.7500 -18.0 + 88.5000 193.7500 -18.0 + 90.2500 194.5000 -18.0 + 95.5000 194.7500 -18.0 + 102.5000 195.7500 -18.0 + 104.2500 196.5000 -18.0 + 111.7500 196.5000 -18.0 + 120.5000 192.7500 -18.0 + 128.5000 186.7500 -18.0 + 134.7500 179.5000 -18.0 + 138.7500 169.5000 -18.0 + 139.5000 167.7500 -18.0 + 139.7500 164.5000 -18.0 + 140.5000 162.7500 -18.0 + 140.7500 157.5000 -18.0 + 141.7500 148.5000 -18.0 + 142.5000 146.7500 -18.0 + 142.7500 140.5000 -18.0 + 143.5000 138.7500 -18.0 + 143.7500 129.5000 -18.0 + 142.7500 127.5000 -18.0 + 142.7500 122.5000 -18.0 + 141.7500 120.5000 -18.0 + 141.7500 117.5000 -18.0 + 139.7500 113.5000 -18.0 + 139.7500 111.5000 -18.0 + 134.7500 103.5000 -18.0 + 131.7500 99.5000 -18.0 + 124.5000 93.2500 -18.0 + 118.5000 90.2500 -18.0 + 114.7500 88.5000 -18.0 + 112.5000 88.2500 -18.0 + 110.7500 87.5000 -18.0 + 104.7500 102.5000 -18.0 + 105.5000 101.7500 -18.0 + 107.2500 102.5000 -18.0 + 108.2500 104.5000 -18.0 + 119.2500 116.5000 -18.0 + 119.2500 122.5000 -18.0 + 120.2500 124.5000 -18.0 + 120.2500 131.5000 -18.0 + 121.2500 134.5000 -18.0 + 120.5000 136.2500 -18.0 + 120.2500 141.5000 -18.0 + 119.5000 143.2500 -18.0 + 119.2500 160.5000 -18.0 + 117.2500 169.5000 -18.0 + 112.5000 176.2500 -18.0 + 109.5000 176.2500 -18.0 + 107.7500 175.5000 -18.0 + 102.5000 175.2500 -18.0 + 100.5000 178.2500 -18.0 + 100.2500 180.5000 -18.0 + 98.5000 184.2500 -18.0 + 94.5000 184.2500 -18.0 + 92.5000 186.2500 -18.0 + 89.5000 186.2500 -18.0 + 86.7500 181.5000 -18.0 + 83.7500 175.5000 -18.0 + 84.7500 173.5000 -18.0 + 87.5000 170.7500 -18.0 + 87.7500 168.5000 -18.0 + 86.7500 166.5000 -18.0 + 86.7500 160.5000 -18.0 + 85.7500 158.5000 -18.0 + 85.7500 156.5000 -18.0 + 86.7500 149.5000 -18.0 + 87.7500 140.5000 -18.0 + 92.7500 130.5000 -18.0 + 93.7500 121.5000 -18.0 + 94.7500 118.5000 -18.0 + 96.5000 114.7500 -18.0 + 98.7500 108.5000 -18.0 + 100.5000 104.7500 -18.0 + 102.2500 84.5000 -20.0 + 101.5000 85.2500 -20.0 + 99.2500 85.5000 -20.0 + 92.5000 88.2500 -20.0 + 87.5000 92.2500 -20.0 + 85.5000 93.2500 -20.0 + 83.2500 95.5000 -20.0 + 80.5000 99.2500 -20.0 + 77.2500 103.5000 -20.0 + 72.2500 113.5000 -20.0 + 70.2500 122.5000 -20.0 + 69.2500 124.5000 -20.0 + 68.2500 133.5000 -20.0 + 67.5000 135.2500 -20.0 + 67.2500 166.5000 -20.0 + 68.2500 168.5000 -20.0 + 68.5000 173.7500 -20.0 + 72.2500 182.5000 -20.0 + 76.2500 187.5000 -20.0 + 77.2500 189.5000 -20.0 + 78.5000 189.7500 -20.0 + 82.2500 193.5000 -20.0 + 86.5000 196.7500 -20.0 + 88.5000 197.7500 -20.0 + 90.2500 198.5000 -20.0 + 99.5000 198.7500 -20.0 + 101.2500 199.5000 -20.0 + 113.5000 199.7500 -20.0 + 118.5000 197.7500 -20.0 + 122.5000 194.7500 -20.0 + 128.7500 191.5000 -20.0 + 137.7500 181.5000 -20.0 + 141.7500 171.5000 -20.0 + 142.5000 169.7500 -20.0 + 142.7500 165.5000 -20.0 + 143.5000 163.7500 -20.0 + 143.7500 158.5000 -20.0 + 144.5000 156.7500 -20.0 + 144.7500 150.5000 -20.0 + 145.5000 148.7500 -20.0 + 145.7500 140.5000 -20.0 + 146.5000 138.7500 -20.0 + 146.7500 130.5000 -20.0 + 145.7500 128.5000 -20.0 + 145.7500 123.5000 -20.0 + 144.7500 121.5000 -20.0 + 144.7500 117.5000 -20.0 + 141.7500 108.5000 -20.0 + 136.7500 100.5000 -20.0 + 135.7500 98.5000 -20.0 + 130.7500 93.5000 -20.0 + 124.5000 89.2500 -20.0 + 118.5000 86.2500 -20.0 + 113.5000 85.2500 -20.0 + 111.7500 84.5000 -20.0 + 103.7500 97.5000 -20.0 + 105.5000 96.7500 -20.0 + 107.2500 98.5000 -20.0 + 109.2500 102.5000 -20.0 + 118.2500 113.5000 -20.0 + 122.2500 120.5000 -20.0 + 122.2500 124.5000 -20.0 + 124.2500 128.5000 -20.0 + 124.2500 131.5000 -20.0 + 126.2500 133.5000 -20.0 + 125.5000 135.2500 -20.0 + 124.2500 154.5000 -20.0 + 119.2500 177.5000 -20.0 + 121.2500 179.5000 -20.0 + 121.2500 184.5000 -20.0 + 117.5000 187.2500 -20.0 + 115.5000 187.2500 -20.0 + 109.5000 184.2500 -20.0 + 105.7500 180.5000 -20.0 + 102.2500 180.5000 -20.0 + 100.2500 184.5000 -20.0 + 96.5000 188.2500 -20.0 + 94.5000 188.2500 -20.0 + 92.5000 189.2500 -20.0 + 89.5000 188.2500 -20.0 + 83.7500 181.5000 -20.0 + 83.7500 179.5000 -20.0 + 82.7500 177.5000 -20.0 + 82.7500 173.5000 -20.0 + 83.5000 171.7500 -20.0 + 82.7500 170.5000 -20.0 + 82.7500 151.5000 -20.0 + 83.5000 149.7500 -20.0 + 83.7500 138.5000 -20.0 + 89.5000 130.7500 -20.0 + 89.7500 125.5000 -20.0 + 93.5000 116.7500 -20.0 + 93.7500 114.5000 -20.0 + 98.7500 104.5000 -20.0 + 99.7500 99.5000 -20.0 + 101.5000 97.7500 -20.0 + 103.2500 81.5000 -22.0 + 102.5000 82.2500 -22.0 + 98.2500 82.5000 -22.0 + 87.5000 87.2500 -22.0 + 81.2500 92.5000 -22.0 + 78.5000 96.2500 -22.0 + 75.2500 100.5000 -22.0 + 69.2500 112.5000 -22.0 + 67.2500 121.5000 -22.0 + 66.2500 126.5000 -22.0 + 65.2500 133.5000 -22.0 + 64.5000 135.2500 -22.0 + 64.2500 142.5000 -22.0 + 63.2500 151.5000 -22.0 + 64.2500 153.5000 -22.0 + 64.2500 169.5000 -22.0 + 65.2500 171.5000 -22.0 + 65.2500 174.5000 -22.0 + 66.5000 177.7500 -22.0 + 69.2500 184.5000 -22.0 + 77.2500 193.5000 -22.0 + 83.2500 198.5000 -22.0 + 88.2500 201.5000 -22.0 + 99.5000 201.7500 -22.0 + 101.2500 202.5000 -22.0 + 114.5000 202.7500 -22.0 + 128.5000 195.7500 -22.0 + 135.5000 189.7500 -22.0 + 138.7500 185.5000 -22.0 + 142.7500 177.5000 -22.0 + 144.5000 173.7500 -22.0 + 144.7500 171.5000 -22.0 + 145.5000 169.7500 -22.0 + 145.7500 165.5000 -22.0 + 146.5000 163.7500 -22.0 + 146.7500 158.5000 -22.0 + 147.5000 156.7500 -22.0 + 147.7500 148.5000 -22.0 + 148.5000 146.7500 -22.0 + 148.7500 125.5000 -22.0 + 147.7500 123.5000 -22.0 + 147.7500 118.5000 -22.0 + 146.7500 116.5000 -22.0 + 146.7500 114.5000 -22.0 + 145.7500 112.5000 -22.0 + 145.7500 110.5000 -22.0 + 139.7500 98.5000 -22.0 + 134.7500 93.5000 -22.0 + 133.7500 91.5000 -22.0 + 132.5000 91.2500 -22.0 + 129.5000 88.2500 -22.0 + 119.5000 83.2500 -22.0 + 114.5000 82.2500 -22.0 + 112.7500 81.5000 -22.0 + 101.7500 93.5000 -22.0 + 102.5000 92.7500 -22.0 + 105.5000 92.7500 -22.0 + 108.2500 95.5000 -22.0 + 108.2500 97.5000 -22.0 + 111.2500 103.5000 -22.0 + 115.5000 106.7500 -22.0 + 120.2500 113.5000 -22.0 + 126.2500 125.5000 -22.0 + 126.2500 127.5000 -22.0 + 127.2500 130.5000 -22.0 + 128.5000 130.7500 -22.0 + 130.2500 132.5000 -22.0 + 129.5000 133.2500 -22.0 + 129.2500 140.5000 -22.0 + 127.2500 158.5000 -22.0 + 126.2500 163.5000 -22.0 + 125.5000 165.2500 -22.0 + 125.2500 170.5000 -22.0 + 124.2500 173.5000 -22.0 + 123.5000 175.2500 -22.0 + 123.2500 187.5000 -22.0 + 121.5000 188.2500 -22.0 + 115.5000 191.2500 -22.0 + 108.5000 188.2500 -22.0 + 104.5000 184.2500 -22.0 + 101.5000 185.2500 -22.0 + 96.5000 190.2500 -22.0 + 93.5000 190.2500 -22.0 + 91.5000 191.2500 -22.0 + 88.5000 190.2500 -22.0 + 83.7500 184.5000 -22.0 + 81.7500 180.5000 -22.0 + 81.7500 177.5000 -22.0 + 79.7500 173.5000 -22.0 + 79.7500 166.5000 -22.0 + 78.7500 164.5000 -22.0 + 78.7500 157.5000 -22.0 + 79.5000 155.7500 -22.0 + 79.7500 139.5000 -22.0 + 81.7500 135.5000 -22.0 + 84.5000 131.7500 -22.0 + 84.7500 129.5000 -22.0 + 86.5000 125.7500 -22.0 + 86.7500 123.5000 -22.0 + 88.7500 121.5000 -22.0 + 89.7500 119.5000 -22.0 + 93.7500 109.5000 -22.0 + 98.5000 101.7500 -22.0 + 98.7500 99.5000 -22.0 + 99.2500 79.5000 -24.0 + 95.5000 81.2500 -24.0 + 93.5000 81.2500 -24.0 + 81.5000 87.2500 -24.0 + 72.2500 99.5000 -24.0 + 65.2500 115.5000 -24.0 + 61.5000 137.2500 -24.0 + 61.2500 168.5000 -24.0 + 62.2500 170.5000 -24.0 + 62.2500 175.5000 -24.0 + 66.2500 183.5000 -24.0 + 66.2500 185.5000 -24.0 + 69.2500 189.5000 -24.0 + 79.2500 199.5000 -24.0 + 86.2500 203.5000 -24.0 + 90.2500 204.5000 -24.0 + 103.5000 204.7500 -24.0 + 105.2500 205.5000 -24.0 + 113.5000 205.7500 -24.0 + 115.5000 204.7500 -24.0 + 117.5000 204.7500 -24.0 + 132.5000 196.7500 -24.0 + 140.5000 188.7500 -24.0 + 144.5000 181.7500 -24.0 + 148.5000 168.7500 -24.0 + 148.7500 161.5000 -24.0 + 150.5000 151.7500 -24.0 + 151.7500 132.5000 -24.0 + 150.7500 130.5000 -24.0 + 150.7500 122.5000 -24.0 + 149.7500 120.5000 -24.0 + 149.7500 116.5000 -24.0 + 148.7500 114.5000 -24.0 + 148.5000 111.2500 -24.0 + 142.7500 98.5000 -24.0 + 135.7500 89.5000 -24.0 + 127.7500 83.5000 -24.0 + 116.7500 79.5000 -24.0 + 101.7500 90.5000 -24.0 + 102.5000 89.7500 -24.0 + 106.5000 89.7500 -24.0 + 109.2500 94.5000 -24.0 + 109.2500 97.5000 -24.0 + 111.5000 102.7500 -24.0 + 117.5000 105.7500 -24.0 + 121.2500 109.5000 -24.0 + 127.2500 121.5000 -24.0 + 127.2500 123.5000 -24.0 + 133.2500 130.5000 -24.0 + 133.2500 135.5000 -24.0 + 132.2500 138.5000 -24.0 + 133.2500 140.5000 -24.0 + 132.5000 142.2500 -24.0 + 132.2500 149.5000 -24.0 + 130.2500 159.5000 -24.0 + 129.5000 161.2500 -24.0 + 129.2500 167.5000 -24.0 + 128.2500 176.5000 -24.0 + 125.5000 180.2500 -24.0 + 125.2500 182.5000 -24.0 + 123.5000 186.2500 -24.0 + 123.2500 188.5000 -24.0 + 120.5000 192.2500 -24.0 + 118.5000 193.2500 -24.0 + 112.5000 195.2500 -24.0 + 110.7500 194.5000 -24.0 + 109.7500 192.5000 -24.0 + 105.5000 190.2500 -24.0 + 103.5000 189.2500 -24.0 + 101.5000 190.2500 -24.0 + 99.5000 190.2500 -24.0 + 95.5000 192.2500 -24.0 + 92.5000 192.2500 -24.0 + 90.5000 194.2500 -24.0 + 88.5000 194.2500 -24.0 + 85.5000 193.2500 -24.0 + 84.7500 191.5000 -24.0 + 78.7500 179.5000 -24.0 + 78.7500 177.5000 -24.0 + 77.7500 175.5000 -24.0 + 77.7500 173.5000 -24.0 + 76.7500 171.5000 -24.0 + 76.7500 163.5000 -24.0 + 75.7500 161.5000 -24.0 + 75.7500 152.5000 -24.0 + 76.5000 150.7500 -24.0 + 76.7500 137.5000 -24.0 + 79.7500 131.5000 -24.0 + 82.7500 124.5000 -24.0 + 85.5000 121.7500 -24.0 + 89.5000 114.7500 -24.0 + 89.7500 111.5000 -24.0 + 97.5000 102.7500 -24.0 + 97.7500 98.5000 -24.0 + 104.2500 76.5000 -26.0 + 103.5000 77.2500 -26.0 + 98.5000 77.2500 -26.0 + 96.5000 78.2500 -26.0 + 93.5000 78.2500 -26.0 + 85.5000 82.2500 -26.0 + 83.5000 82.2500 -26.0 + 81.5000 84.2500 -26.0 + 79.5000 85.2500 -26.0 + 77.2500 87.5000 -26.0 + 74.5000 91.2500 -26.0 + 70.2500 97.5000 -26.0 + 66.2500 105.5000 -26.0 + 64.5000 109.2500 -26.0 + 63.2500 115.5000 -26.0 + 62.5000 117.2500 -26.0 + 62.2500 122.5000 -26.0 + 61.5000 124.2500 -26.0 + 60.2500 132.5000 -26.0 + 59.5000 134.2500 -26.0 + 59.2500 143.5000 -26.0 + 58.5000 145.2500 -26.0 + 58.2500 150.5000 -26.0 + 59.2500 152.5000 -26.0 + 59.2500 160.5000 -26.0 + 58.5000 162.2500 -26.0 + 58.2500 168.5000 -26.0 + 59.2500 170.5000 -26.0 + 59.2500 174.5000 -26.0 + 61.2500 178.5000 -26.0 + 61.2500 180.5000 -26.0 + 66.2500 190.5000 -26.0 + 72.2500 196.5000 -26.0 + 79.5000 202.7500 -26.0 + 85.5000 205.7500 -26.0 + 87.2500 206.5000 -26.0 + 103.5000 206.7500 -26.0 + 105.2500 207.5000 -26.0 + 117.5000 207.7500 -26.0 + 133.5000 199.7500 -26.0 + 139.5000 193.7500 -26.0 + 142.7500 189.5000 -26.0 + 147.7500 181.5000 -26.0 + 148.7500 176.5000 -26.0 + 149.7500 173.5000 -26.0 + 150.5000 171.7500 -26.0 + 150.7500 167.5000 -26.0 + 151.5000 165.7500 -26.0 + 151.7500 155.5000 -26.0 + 152.5000 153.7500 -26.0 + 152.7500 146.5000 -26.0 + 153.5000 144.7500 -26.0 + 153.7500 131.5000 -26.0 + 152.7500 129.5000 -26.0 + 152.7500 121.5000 -26.0 + 151.7500 119.5000 -26.0 + 151.7500 114.5000 -26.0 + 149.7500 110.5000 -26.0 + 149.5000 108.2500 -26.0 + 146.7500 101.5000 -26.0 + 141.7500 93.5000 -26.0 + 140.7500 91.5000 -26.0 + 133.7500 84.5000 -26.0 + 127.7500 80.5000 -26.0 + 121.5000 78.2500 -26.0 + 119.7500 77.5000 -26.0 + 114.5000 77.2500 -26.0 + 112.7500 76.5000 -26.0 + 102.5000 86.7500 -26.0 + 104.5000 86.7500 -26.0 + 106.5000 87.7500 -26.0 + 110.2500 90.5000 -26.0 + 110.2500 94.5000 -26.0 + 112.2500 98.5000 -26.0 + 112.2500 100.5000 -26.0 + 114.5000 102.7500 -26.0 + 118.5000 104.7500 -26.0 + 123.5000 105.7500 -26.0 + 127.2500 112.5000 -26.0 + 127.2500 114.5000 -26.0 + 130.2500 121.5000 -26.0 + 134.2500 125.5000 -26.0 + 138.2500 133.5000 -26.0 + 137.5000 134.2500 -26.0 + 137.2500 139.5000 -26.0 + 136.5000 141.2500 -26.0 + 136.2500 148.5000 -26.0 + 135.2500 150.5000 -26.0 + 134.2500 159.5000 -26.0 + 133.5000 161.2500 -26.0 + 133.2500 169.5000 -26.0 + 132.2500 174.5000 -26.0 + 130.5000 178.2500 -26.0 + 128.2500 184.5000 -26.0 + 124.5000 188.2500 -26.0 + 124.2500 190.5000 -26.0 + 122.5000 192.2500 -26.0 + 115.5000 196.2500 -26.0 + 112.5000 196.2500 -26.0 + 107.5000 195.2500 -26.0 + 103.5000 192.2500 -26.0 + 101.5000 193.2500 -26.0 + 97.5000 193.2500 -26.0 + 89.5000 197.2500 -26.0 + 87.5000 197.2500 -26.0 + 83.7500 194.5000 -26.0 + 80.7500 188.5000 -26.0 + 76.7500 181.5000 -26.0 + 76.7500 179.5000 -26.0 + 74.7500 175.5000 -26.0 + 74.7500 170.5000 -26.0 + 73.7500 168.5000 -26.0 + 73.7500 162.5000 -26.0 + 72.7500 160.5000 -26.0 + 72.7500 143.5000 -26.0 + 73.7500 138.5000 -26.0 + 72.7500 136.5000 -26.0 + 73.7500 134.5000 -26.0 + 78.7500 125.5000 -26.0 + 79.7500 123.5000 -26.0 + 90.7500 108.5000 -26.0 + 91.7500 106.5000 -26.0 + 93.7500 105.5000 -26.0 + 96.5000 101.7500 -26.0 + 95.7500 99.5000 -26.0 + 96.5000 97.7500 -26.0 + 96.7500 94.5000 -26.0 + 98.5000 93.7500 -26.0 + 99.5000 91.7500 -26.0 + 99.7500 89.5000 -26.0 + 103.2500 74.5000 -28.0 + 102.5000 75.2500 -28.0 + 97.5000 75.2500 -28.0 + 95.5000 76.2500 -28.0 + 92.5000 76.2500 -28.0 + 90.5000 77.2500 -28.0 + 88.5000 77.2500 -28.0 + 80.5000 81.2500 -28.0 + 73.2500 88.5000 -28.0 + 68.2500 96.5000 -28.0 + 62.2500 108.5000 -28.0 + 61.2500 113.5000 -28.0 + 60.5000 115.2500 -28.0 + 60.2500 121.5000 -28.0 + 59.5000 123.2500 -28.0 + 58.2500 131.5000 -28.0 + 57.5000 133.2500 -28.0 + 57.2500 140.5000 -28.0 + 56.5000 142.2500 -28.0 + 56.2500 171.5000 -28.0 + 57.2500 173.5000 -28.0 + 57.2500 176.5000 -28.0 + 58.2500 178.5000 -28.0 + 58.2500 180.5000 -28.0 + 64.2500 192.5000 -28.0 + 72.2500 200.5000 -28.0 + 78.5000 204.7500 -28.0 + 85.2500 208.5000 -28.0 + 103.5000 208.7500 -28.0 + 105.2500 209.5000 -28.0 + 119.5000 209.7500 -28.0 + 131.5000 203.7500 -28.0 + 135.5000 200.7500 -28.0 + 137.7500 199.5000 -28.0 + 140.5000 195.7500 -28.0 + 145.5000 189.7500 -28.0 + 149.5000 182.7500 -28.0 + 151.7500 176.5000 -28.0 + 152.5000 174.7500 -28.0 + 152.7500 170.5000 -28.0 + 153.5000 168.7500 -28.0 + 153.7500 161.5000 -28.0 + 154.5000 159.7500 -28.0 + 154.7500 148.5000 -28.0 + 155.5000 146.7500 -28.0 + 155.7500 130.5000 -28.0 + 154.7500 128.5000 -28.0 + 154.7500 122.5000 -28.0 + 153.7500 120.5000 -28.0 + 153.7500 116.5000 -28.0 + 152.7500 114.5000 -28.0 + 152.7500 111.5000 -28.0 + 150.7500 105.5000 -28.0 + 146.5000 96.2500 -28.0 + 141.7500 89.5000 -28.0 + 137.5000 84.2500 -28.0 + 129.7500 78.5000 -28.0 + 123.5000 76.2500 -28.0 + 121.7500 75.5000 -28.0 + 117.5000 75.2500 -28.0 + 115.7500 74.5000 -28.0 + 100.7500 85.5000 -28.0 + 101.5000 84.7500 -28.0 + 105.5000 84.7500 -28.0 + 107.2500 86.5000 -28.0 + 109.5000 86.7500 -28.0 + 112.5000 85.7500 -28.0 + 114.2500 87.5000 -28.0 + 113.5000 88.2500 -28.0 + 112.2500 92.5000 -28.0 + 113.2500 95.5000 -28.0 + 116.2500 98.5000 -28.0 + 120.5000 98.7500 -28.0 + 124.5000 100.7500 -28.0 + 129.2500 107.5000 -28.0 + 131.2500 111.5000 -28.0 + 131.2500 114.5000 -28.0 + 132.2500 116.5000 -28.0 + 132.2500 118.5000 -28.0 + 134.2500 120.5000 -28.0 + 135.5000 122.7500 -28.0 + 137.5000 123.7500 -28.0 + 142.2500 132.5000 -28.0 + 141.5000 134.2500 -28.0 + 141.2500 138.5000 -28.0 + 140.5000 140.2500 -28.0 + 140.2500 145.5000 -28.0 + 139.5000 147.2500 -28.0 + 139.2500 155.5000 -28.0 + 138.5000 157.2500 -28.0 + 138.2500 162.5000 -28.0 + 137.2500 164.5000 -28.0 + 136.2500 173.5000 -28.0 + 135.2500 178.5000 -28.0 + 134.2500 181.5000 -28.0 + 131.5000 184.2500 -28.0 + 129.5000 185.2500 -28.0 + 123.5000 193.2500 -28.0 + 119.5000 196.2500 -28.0 + 117.5000 196.2500 -28.0 + 113.5000 198.2500 -28.0 + 109.5000 198.2500 -28.0 + 103.5000 195.2500 -28.0 + 101.5000 196.2500 -28.0 + 95.5000 196.2500 -28.0 + 91.5000 199.2500 -28.0 + 89.5000 200.2500 -28.0 + 83.7500 197.5000 -28.0 + 80.7500 193.5000 -28.0 + 77.7500 188.5000 -28.0 + 72.7500 178.5000 -28.0 + 72.7500 176.5000 -28.0 + 71.7500 174.5000 -28.0 + 71.7500 162.5000 -28.0 + 68.7500 158.5000 -28.0 + 68.7500 153.5000 -28.0 + 69.5000 151.7500 -28.0 + 69.7500 134.5000 -28.0 + 70.5000 132.7500 -28.0 + 73.7500 127.5000 -28.0 + 74.7500 125.5000 -28.0 + 89.5000 107.7500 -28.0 + 93.5000 104.7500 -28.0 + 93.7500 101.5000 -28.0 + 92.7500 99.5000 -28.0 + 92.7500 96.5000 -28.0 + 93.7500 94.5000 -28.0 + 92.7500 91.5000 -28.0 + 93.5000 89.7500 -28.0 + 96.5000 90.7500 -28.0 + 103.2500 72.5000 -30.0 + 102.5000 73.2500 -30.0 + 96.5000 73.2500 -30.0 + 94.5000 74.2500 -30.0 + 91.5000 74.2500 -30.0 + 89.5000 75.2500 -30.0 + 87.5000 75.2500 -30.0 + 77.5000 80.2500 -30.0 + 75.2500 82.5000 -30.0 + 72.5000 86.2500 -30.0 + 69.2500 90.5000 -30.0 + 67.2500 94.5000 -30.0 + 64.2500 98.5000 -30.0 + 60.2500 108.5000 -30.0 + 58.5000 112.2500 -30.0 + 58.2500 116.5000 -30.0 + 57.2500 125.5000 -30.0 + 56.2500 128.5000 -30.0 + 55.2500 137.5000 -30.0 + 54.5000 139.2500 -30.0 + 54.2500 157.5000 -30.0 + 53.5000 159.2500 -30.0 + 53.2500 164.5000 -30.0 + 54.2500 166.5000 -30.0 + 54.2500 174.5000 -30.0 + 55.2500 176.5000 -30.0 + 55.2500 178.5000 -30.0 + 56.2500 180.5000 -30.0 + 56.2500 182.5000 -30.0 + 62.2500 194.5000 -30.0 + 69.2500 201.5000 -30.0 + 75.5000 205.7500 -30.0 + 82.2500 209.5000 -30.0 + 84.5000 209.7500 -30.0 + 86.2500 210.5000 -30.0 + 92.5000 210.7500 -30.0 + 94.5000 209.7500 -30.0 + 97.5000 209.7500 -30.0 + 99.2500 210.5000 -30.0 + 105.5000 210.7500 -30.0 + 107.2500 211.5000 -30.0 + 118.5000 211.7500 -30.0 + 120.5000 210.7500 -30.0 + 122.5000 210.7500 -30.0 + 131.5000 206.7500 -30.0 + 136.5000 202.7500 -30.0 + 138.5000 201.7500 -30.0 + 147.7500 190.5000 -30.0 + 153.7500 179.5000 -30.0 + 154.7500 174.5000 -30.0 + 155.5000 172.7500 -30.0 + 155.7500 168.5000 -30.0 + 156.5000 166.7500 -30.0 + 156.7500 154.5000 -30.0 + 157.7500 145.5000 -30.0 + 158.5000 143.7500 -30.0 + 158.7500 137.5000 -30.0 + 157.7500 135.5000 -30.0 + 157.7500 129.5000 -30.0 + 156.7500 127.5000 -30.0 + 156.7500 123.5000 -30.0 + 155.7500 121.5000 -30.0 + 155.7500 117.5000 -30.0 + 154.7500 115.5000 -30.0 + 154.7500 112.5000 -30.0 + 153.7500 110.5000 -30.0 + 153.7500 107.5000 -30.0 + 145.7500 91.5000 -30.0 + 140.7500 85.5000 -30.0 + 139.7500 83.5000 -30.0 + 133.7500 78.5000 -30.0 + 128.5000 75.2500 -30.0 + 123.5000 74.2500 -30.0 + 121.7500 73.5000 -30.0 + 117.5000 73.2500 -30.0 + 115.7500 72.5000 -30.0 +} -30.0 +{ -30.0 + 102.7500 82.5000 -30.0 + 104.5000 81.7500 -30.0 + 107.2500 85.5000 -30.0 + 109.5000 85.7500 -30.0 + 113.5000 83.7500 -30.0 + 117.2500 85.5000 -30.0 + 115.5000 92.2500 -30.0 + 116.5000 93.7500 -30.0 + 118.5000 94.7500 -30.0 + 123.5000 95.7500 -30.0 + 126.2500 98.5000 -30.0 + 135.2500 112.5000 -30.0 + 135.2500 114.5000 -30.0 + 137.2500 120.5000 -30.0 + 143.2500 127.5000 -30.0 + 145.2500 131.5000 -30.0 + 145.2500 135.5000 -30.0 + 144.2500 137.5000 -30.0 + 142.2500 151.5000 -30.0 + 143.2500 153.5000 -30.0 + 141.5000 158.2500 -30.0 + 141.2500 165.5000 -30.0 + 140.2500 167.5000 -30.0 + 141.2500 169.5000 -30.0 + 140.5000 170.2500 -30.0 + 140.2500 175.5000 -30.0 + 138.2500 180.5000 -30.0 + 135.5000 184.2500 -30.0 + 133.5000 185.2500 -30.0 + 126.2500 192.5000 -30.0 + 125.2500 194.5000 -30.0 + 116.5000 199.2500 -30.0 + 109.5000 200.2500 -30.0 + 102.5000 198.2500 -30.0 + 98.5000 200.2500 -30.0 + 96.5000 199.2500 -30.0 + 92.5000 201.2500 -30.0 + 86.5000 201.2500 -30.0 + 82.7500 198.5000 -30.0 + 76.7500 191.5000 -30.0 + 68.7500 176.5000 -30.0 + 68.7500 164.5000 -30.0 + 65.7500 158.5000 -30.0 + 65.7500 154.5000 -30.0 + 66.5000 152.7500 -30.0 + 66.7500 135.5000 -30.0 + 65.7500 133.5000 -30.0 + 68.7500 129.5000 -30.0 + 71.7500 123.5000 -30.0 + 76.5000 119.7500 -30.0 + 79.7500 115.5000 -30.0 + 83.5000 108.7500 -30.0 + 86.7500 99.5000 -30.0 + 90.5000 95.7500 -30.0 + 90.7500 93.5000 -30.0 + 89.7500 91.5000 -30.0 + 97.5000 84.7500 -30.0 + 98.2500 85.5000 -30.0 + 100.5000 84.7500 -30.0 + 104.2500 70.5000 -32.0 + 103.5000 71.2500 -32.0 + 96.5000 71.2500 -32.0 + 94.5000 72.2500 -32.0 + 90.5000 72.2500 -32.0 + 88.5000 73.2500 -32.0 + 86.5000 73.2500 -32.0 + 76.5000 78.2500 -32.0 + 70.2500 85.5000 -32.0 + 65.2500 93.5000 -32.0 + 59.5000 104.2500 -32.0 + 57.2500 110.5000 -32.0 + 56.5000 112.2500 -32.0 + 56.2500 116.5000 -32.0 + 55.2500 125.5000 -32.0 + 54.2500 127.5000 -32.0 + 53.2500 136.5000 -32.0 + 52.5000 138.2500 -32.0 + 52.2500 153.5000 -32.0 + 51.5000 155.2500 -32.0 + 51.2500 171.5000 -32.0 + 52.2500 173.5000 -32.0 + 52.2500 177.5000 -32.0 + 54.2500 181.5000 -32.0 + 54.2500 183.5000 -32.0 + 60.2500 195.5000 -32.0 + 68.5000 203.7500 -32.0 + 76.5000 208.7500 -32.0 + 78.5000 209.7500 -32.0 + 82.2500 211.5000 -32.0 + 101.5000 211.7500 -32.0 + 108.5000 212.7500 -32.0 + 110.2500 213.5000 -32.0 + 118.5000 213.7500 -32.0 + 120.5000 212.7500 -32.0 + 122.5000 212.7500 -32.0 + 124.5000 211.7500 -32.0 + 126.5000 211.7500 -32.0 + 134.5000 206.7500 -32.0 + 136.5000 205.7500 -32.0 + 144.7500 197.5000 -32.0 + 147.5000 193.7500 -32.0 + 150.7500 189.5000 -32.0 + 154.5000 182.7500 -32.0 + 156.7500 176.5000 -32.0 + 157.5000 174.7500 -32.0 + 157.7500 170.5000 -32.0 + 158.5000 168.7500 -32.0 + 158.7500 157.5000 -32.0 + 159.7500 148.5000 -32.0 + 160.5000 146.7500 -32.0 + 160.7500 137.5000 -32.0 + 159.7500 135.5000 -32.0 + 159.7500 129.5000 -32.0 + 158.7500 127.5000 -32.0 + 158.7500 123.5000 -32.0 + 157.7500 121.5000 -32.0 + 157.7500 119.5000 -32.0 + 156.7500 117.5000 -32.0 + 156.7500 112.5000 -32.0 + 155.7500 110.5000 -32.0 + 155.7500 107.5000 -32.0 + 147.7500 91.5000 -32.0 + 144.7500 87.5000 -32.0 + 143.7500 85.5000 -32.0 + 136.5000 78.2500 -32.0 + 128.5000 73.2500 -32.0 + 123.5000 72.2500 -32.0 + 121.7500 71.5000 -32.0 + 115.5000 71.2500 -32.0 + 113.7500 70.5000 -32.0 + 102.7500 80.5000 -32.0 + 103.5000 79.7500 -32.0 + 105.2500 80.5000 -32.0 + 107.2500 84.5000 -32.0 + 111.5000 84.7500 -32.0 + 115.5000 82.7500 -32.0 + 117.5000 82.7500 -32.0 + 121.2500 86.5000 -32.0 + 123.5000 86.7500 -32.0 + 124.2500 88.5000 -32.0 + 129.2500 94.5000 -32.0 + 128.5000 96.2500 -32.0 + 129.2500 97.5000 -32.0 + 130.2500 99.5000 -32.0 + 133.2500 103.5000 -32.0 + 136.2500 109.5000 -32.0 + 139.2500 113.5000 -32.0 + 139.2500 115.5000 -32.0 + 143.2500 123.5000 -32.0 + 144.5000 125.7500 -32.0 + 146.5000 126.7500 -32.0 + 148.2500 129.5000 -32.0 + 148.2500 134.5000 -32.0 + 147.5000 136.2500 -32.0 + 147.2500 141.5000 -32.0 + 146.2500 144.5000 -32.0 + 145.5000 146.2500 -32.0 + 145.2500 154.5000 -32.0 + 144.5000 156.2500 -32.0 + 144.2500 170.5000 -32.0 + 143.2500 175.5000 -32.0 + 140.2500 182.5000 -32.0 + 137.5000 185.2500 -32.0 + 135.5000 186.2500 -32.0 + 125.5000 196.2500 -32.0 + 120.5000 199.2500 -32.0 + 118.5000 199.2500 -32.0 + 112.5000 202.2500 -32.0 + 109.5000 202.2500 -32.0 + 103.5000 200.2500 -32.0 + 99.5000 202.2500 -32.0 + 94.5000 202.2500 -32.0 + 92.5000 203.2500 -32.0 + 88.5000 203.2500 -32.0 + 85.5000 202.2500 -32.0 + 76.5000 193.2500 -32.0 + 74.5000 192.2500 -32.0 + 70.7500 185.5000 -32.0 + 65.7500 175.5000 -32.0 + 65.7500 169.5000 -32.0 + 64.7500 167.5000 -32.0 + 64.7500 161.5000 -32.0 + 63.7500 159.5000 -32.0 + 63.7500 135.5000 -32.0 + 62.7500 132.5000 -32.0 + 64.5000 131.7500 -32.0 + 67.5000 125.7500 -32.0 + 67.7500 123.5000 -32.0 + 76.7500 114.5000 -32.0 + 79.7500 108.5000 -32.0 + 80.7500 103.5000 -32.0 + 85.5000 97.7500 -32.0 + 87.5000 96.7500 -32.0 + 88.7500 94.5000 -32.0 + 87.7500 92.5000 -32.0 + 89.7500 88.5000 -32.0 + 95.5000 83.7500 -32.0 + 97.2500 84.5000 -32.0 + 99.5000 84.7500 -32.0 + 97.2500 69.5000 -34.0 + 96.5000 70.2500 -34.0 + 91.5000 70.2500 -34.0 + 89.5000 71.2500 -34.0 + 86.2500 71.5000 -34.0 + 77.5000 75.2500 -34.0 + 70.5000 82.2500 -34.0 + 66.2500 88.5000 -34.0 + 65.2500 90.5000 -34.0 + 60.2500 98.5000 -34.0 + 56.2500 106.5000 -34.0 + 55.2500 111.5000 -34.0 + 54.5000 113.2500 -34.0 + 54.2500 117.5000 -34.0 + 53.2500 124.5000 -34.0 + 52.2500 129.5000 -34.0 + 51.5000 131.2500 -34.0 + 51.2500 135.5000 -34.0 + 50.5000 137.2500 -34.0 + 50.2500 151.5000 -34.0 + 49.5000 153.2500 -34.0 + 49.2500 173.5000 -34.0 + 50.2500 175.5000 -34.0 + 50.2500 177.5000 -34.0 + 51.2500 179.5000 -34.0 + 51.2500 182.5000 -34.0 + 58.2500 196.5000 -34.0 + 64.2500 202.5000 -34.0 + 70.2500 207.5000 -34.0 + 77.5000 211.7500 -34.0 + 82.5000 212.7500 -34.0 + 84.2500 213.5000 -34.0 + 97.5000 213.7500 -34.0 + 99.5000 212.7500 -34.0 + 100.2500 213.5000 -34.0 + 106.5000 213.7500 -34.0 + 108.2500 214.5000 -34.0 + 121.5000 214.7500 -34.0 + 123.5000 213.7500 -34.0 + 125.5000 213.7500 -34.0 + 135.5000 208.7500 -34.0 + 144.7500 200.5000 -34.0 + 147.5000 196.7500 -34.0 + 152.5000 190.7500 -34.0 + 156.5000 183.7500 -34.0 + 158.7500 177.5000 -34.0 + 159.5000 175.7500 -34.0 + 159.7500 172.5000 -34.0 + 160.5000 170.7500 -34.0 + 160.7500 164.5000 -34.0 + 161.5000 162.7500 -34.0 + 161.7500 150.5000 -34.0 + 162.5000 148.7500 -34.0 + 162.7500 140.5000 -34.0 + 161.7500 138.5000 -34.0 + 161.7500 130.5000 -34.0 + 160.7500 128.5000 -34.0 + 160.7500 123.5000 -34.0 + 159.7500 121.5000 -34.0 + 159.7500 119.5000 -34.0 + 158.7500 117.5000 -34.0 + 158.7500 114.5000 -34.0 + 157.7500 112.5000 -34.0 + 157.7500 109.5000 -34.0 + 156.7500 107.5000 -34.0 + 156.7500 105.5000 -34.0 + 153.7500 99.5000 -34.0 + 148.7500 90.5000 -34.0 + 146.7500 86.5000 -34.0 + 143.7500 83.5000 -34.0 + 142.7500 81.5000 -34.0 + 135.5000 75.2500 -34.0 + 127.5000 71.2500 -34.0 + 125.7500 70.5000 -34.0 + 122.5000 70.2500 -34.0 + 120.7500 69.5000 -34.0 + 102.7500 78.5000 -34.0 + 104.5000 77.7500 -34.0 + 106.2500 79.5000 -34.0 + 106.2500 81.5000 -34.0 + 108.2500 83.5000 -34.0 + 112.5000 83.7500 -34.0 + 116.5000 81.7500 -34.0 + 121.5000 83.7500 -34.0 + 125.2500 86.5000 -34.0 + 129.5000 91.7500 -34.0 + 131.5000 92.7500 -34.0 + 133.2500 96.5000 -34.0 + 139.2500 104.5000 -34.0 + 138.2500 107.5000 -34.0 + 141.2500 113.5000 -34.0 + 151.2500 127.5000 -34.0 + 150.2500 128.5000 -34.0 + 151.2500 130.5000 -34.0 + 150.5000 131.2500 -34.0 + 150.2500 133.5000 -34.0 + 151.2500 136.5000 -34.0 + 150.2500 139.5000 -34.0 + 147.5000 151.2500 -34.0 + 147.2500 160.5000 -34.0 + 146.2500 162.5000 -34.0 + 147.2500 164.5000 -34.0 + 145.2500 176.5000 -34.0 + 142.2500 183.5000 -34.0 + 127.5000 197.2500 -34.0 + 122.5000 200.2500 -34.0 + 120.5000 200.2500 -34.0 + 112.5000 204.2500 -34.0 + 102.5000 203.2500 -34.0 + 98.5000 205.2500 -34.0 + 93.5000 204.2500 -34.0 + 91.5000 205.2500 -34.0 + 89.5000 205.2500 -34.0 + 83.5000 201.2500 -34.0 + 74.7500 194.5000 -34.0 + 73.7500 192.5000 -34.0 + 69.7500 189.5000 -34.0 + 69.7500 187.5000 -34.0 + 66.7500 183.5000 -34.0 + 62.7500 175.5000 -34.0 + 62.7500 170.5000 -34.0 + 61.7500 168.5000 -34.0 + 62.7500 167.5000 -34.0 + 61.7500 165.5000 -34.0 + 61.7500 143.5000 -34.0 + 60.7500 141.5000 -34.0 + 60.7500 135.5000 -34.0 + 59.7500 133.5000 -34.0 + 62.5000 129.7500 -34.0 + 63.7500 123.5000 -34.0 + 67.5000 119.7500 -34.0 + 69.5000 118.7500 -34.0 + 69.7500 117.5000 -34.0 + 71.5000 115.7500 -34.0 + 74.7500 105.5000 -34.0 + 80.5000 98.7500 -34.0 + 82.5000 98.7500 -34.0 + 84.7500 95.5000 -34.0 + 83.7500 93.5000 -34.0 + 83.7500 90.5000 -34.0 + 92.5000 83.7500 -34.0 + 94.5000 83.7500 -34.0 + 96.5000 84.7500 -34.0 + 99.5000 83.7500 -34.0 + 143.7500 191.5000 -34.0 + 145.5000 190.7500 -34.0 + 147.2500 191.5000 -34.0 + 145.5000 192.2500 -34.0 + 104.2500 67.5000 -36.0 + 103.5000 68.2500 -36.0 + 93.5000 68.2500 -36.0 + 91.5000 69.2500 -36.0 + 88.5000 69.2500 -36.0 + 86.5000 70.2500 -36.0 + 84.5000 70.2500 -36.0 + 79.5000 72.2500 -36.0 + 75.5000 75.2500 -36.0 + 73.5000 76.2500 -36.0 + 68.2500 82.5000 -36.0 + 59.2500 96.5000 -36.0 + 55.2500 104.5000 -36.0 + 53.2500 113.5000 -36.0 + 52.2500 120.5000 -36.0 + 51.2500 125.5000 -36.0 + 50.5000 127.2500 -36.0 + 49.2500 135.5000 -36.0 + 48.5000 137.2500 -36.0 + 48.2500 143.5000 -36.0 + 47.5000 145.2500 -36.0 + 47.2500 159.5000 -36.0 + 46.2500 166.5000 -36.0 + 47.2500 168.5000 -36.0 + 47.2500 174.5000 -36.0 + 48.2500 176.5000 -36.0 + 48.2500 178.5000 -36.0 + 50.5000 184.7500 -36.0 + 55.2500 195.5000 -36.0 + 60.2500 201.5000 -36.0 + 67.5000 207.7500 -36.0 + 75.5000 212.7500 -36.0 + 80.5000 213.7500 -36.0 + 82.2500 214.5000 -36.0 + 101.5000 214.7500 -36.0 + 110.5000 215.7500 -36.0 + 112.2500 216.5000 -36.0 + 119.5000 216.7500 -36.0 + 121.5000 215.7500 -36.0 + 124.5000 215.7500 -36.0 + 138.5000 208.7500 -36.0 + 148.7500 198.5000 -36.0 + 151.5000 194.7500 -36.0 + 154.7500 190.5000 -36.0 + 160.7500 179.5000 -36.0 + 161.7500 172.5000 -36.0 + 162.5000 170.7500 -36.0 + 162.7500 163.5000 -36.0 + 163.5000 161.7500 -36.0 + 163.7500 135.5000 -36.0 + 162.7500 133.5000 -36.0 + 162.7500 127.5000 -36.0 + 161.7500 125.5000 -36.0 + 161.7500 121.5000 -36.0 + 160.7500 119.5000 -36.0 + 160.7500 117.5000 -36.0 + 159.7500 115.5000 -36.0 + 159.7500 111.5000 -36.0 + 158.7500 109.5000 -36.0 + 158.7500 106.5000 -36.0 + 149.7500 88.5000 -36.0 + 143.7500 81.5000 -36.0 + 142.7500 79.5000 -36.0 + 136.5000 74.2500 -36.0 + 127.7500 69.5000 -36.0 + 125.5000 69.2500 -36.0 + 123.7500 68.5000 -36.0 + 118.5000 68.2500 -36.0 + 116.7500 67.5000 -36.0 + 101.7500 77.5000 -36.0 + 102.5000 76.7500 -36.0 + 104.5000 76.7500 -36.0 + 106.5000 79.7500 -36.0 + 110.2500 82.5000 -36.0 + 113.5000 82.7500 -36.0 + 117.5000 80.7500 -36.0 + 119.5000 80.7500 -36.0 + 124.5000 81.7500 -36.0 + 126.2500 83.5000 -36.0 + 132.2500 87.5000 -36.0 + 134.2500 91.5000 -36.0 + 136.2500 97.5000 -36.0 + 141.2500 103.5000 -36.0 + 144.2500 108.5000 -36.0 + 144.2500 110.5000 -36.0 + 149.2500 120.5000 -36.0 + 153.2500 127.5000 -36.0 + 153.2500 135.5000 -36.0 + 152.5000 137.2500 -36.0 + 151.2500 145.5000 -36.0 + 150.5000 147.2500 -36.0 + 150.2500 154.5000 -36.0 + 149.5000 156.2500 -36.0 + 149.2500 166.5000 -36.0 + 148.5000 168.2500 -36.0 + 148.2500 173.5000 -36.0 + 147.2500 176.5000 -36.0 + 145.5000 180.2500 -36.0 + 145.2500 182.5000 -36.0 + 142.5000 186.2500 -36.0 + 140.5000 187.2500 -36.0 + 129.5000 198.2500 -36.0 + 122.5000 202.2500 -36.0 + 120.5000 202.2500 -36.0 + 114.5000 205.2500 -36.0 + 112.5000 205.2500 -36.0 + 110.5000 206.2500 -36.0 + 108.5000 206.2500 -36.0 + 106.7500 205.5000 -36.0 + 102.5000 205.2500 -36.0 + 100.5000 206.2500 -36.0 + 96.5000 206.2500 -36.0 + 87.5000 205.2500 -36.0 + 79.5000 200.2500 -36.0 + 77.5000 199.2500 -36.0 + 72.7500 194.5000 -36.0 + 71.7500 192.5000 -36.0 + 69.5000 190.2500 -36.0 + 67.5000 189.2500 -36.0 + 63.7500 182.5000 -36.0 + 60.7500 176.5000 -36.0 + 60.7500 174.5000 -36.0 + 59.7500 172.5000 -36.0 + 59.7500 161.5000 -36.0 + 58.7500 158.5000 -36.0 + 59.5000 156.7500 -36.0 + 59.7500 147.5000 -36.0 + 58.7500 145.5000 -36.0 + 58.7500 141.5000 -36.0 + 57.7500 139.5000 -36.0 + 58.5000 138.7500 -36.0 + 57.7500 137.5000 -36.0 + 57.7500 133.5000 -36.0 + 60.5000 127.7500 -36.0 + 60.7500 123.5000 -36.0 + 63.7500 120.5000 -36.0 + 71.7500 104.5000 -36.0 + 76.7500 98.5000 -36.0 + 75.7500 95.5000 -36.0 + 80.5000 88.7500 -36.0 + 82.5000 87.7500 -36.0 + 86.5000 84.7500 -36.0 + 89.5000 84.7500 -36.0 + 92.5000 81.7500 -36.0 + 94.2500 82.5000 -36.0 + 97.5000 82.7500 -36.0 + 101.5000 79.7500 -36.0 + 145.7500 191.5000 -36.0 + 146.5000 190.7500 -36.0 + 147.2500 191.5000 -36.0 + 146.5000 192.2500 -36.0 + 97.2500 66.5000 -38.0 + 96.5000 67.2500 -38.0 + 90.5000 67.2500 -38.0 + 88.5000 68.2500 -38.0 + 85.2500 68.5000 -38.0 + 76.5000 72.2500 -38.0 + 71.5000 76.2500 -38.0 + 66.5000 82.2500 -38.0 + 62.2500 88.5000 -38.0 + 57.2500 96.5000 -38.0 + 54.2500 102.5000 -38.0 + 53.2500 107.5000 -38.0 + 52.2500 109.5000 -38.0 + 51.2500 116.5000 -38.0 + 50.2500 121.5000 -38.0 + 49.2500 123.5000 -38.0 + 48.2500 132.5000 -38.0 + 47.5000 134.2500 -38.0 + 46.2500 142.5000 -38.0 + 45.5000 144.2500 -38.0 + 45.2500 158.5000 -38.0 + 44.2500 167.5000 -38.0 + 45.2500 169.5000 -38.0 + 45.2500 174.5000 -38.0 + 46.2500 176.5000 -38.0 + 46.2500 179.5000 -38.0 + 48.5000 185.7500 -38.0 + 52.2500 194.5000 -38.0 + 57.2500 200.5000 -38.0 + 58.2500 202.5000 -38.0 + 64.2500 207.5000 -38.0 + 70.5000 211.7500 -38.0 + 74.5000 213.7500 -38.0 + 76.2500 214.5000 -38.0 + 79.5000 214.7500 -38.0 + 81.2500 215.5000 -38.0 + 100.5000 215.7500 -38.0 + 107.5000 216.7500 -38.0 + 109.2500 217.5000 -38.0 + 121.5000 217.7500 -38.0 + 123.5000 216.7500 -38.0 + 125.5000 216.7500 -38.0 + 136.5000 211.7500 -38.0 + 147.7500 202.5000 -38.0 + 150.5000 198.7500 -38.0 + 155.5000 192.7500 -38.0 + 159.5000 186.7500 -38.0 + 162.7500 177.5000 -38.0 + 163.5000 175.7500 -38.0 + 163.7500 172.5000 -38.0 + 164.5000 170.7500 -38.0 + 164.7500 162.5000 -38.0 + 165.5000 160.7500 -38.0 + 165.7500 142.5000 -38.0 + 164.7500 140.5000 -38.0 + 164.7500 133.5000 -38.0 + 163.7500 131.5000 -38.0 + 163.7500 125.5000 -38.0 + 162.7500 123.5000 -38.0 + 162.7500 120.5000 -38.0 + 161.7500 118.5000 -38.0 + 161.7500 114.5000 -38.0 + 160.7500 112.5000 -38.0 + 160.7500 109.5000 -38.0 + 158.7500 105.5000 -38.0 + 158.7500 103.5000 -38.0 + 150.7500 87.5000 -38.0 + 147.7500 84.5000 -38.0 + 146.7500 82.5000 -38.0 + 138.7500 74.5000 -38.0 + 132.7500 70.5000 -38.0 + 126.5000 68.2500 -38.0 + 124.7500 67.5000 -38.0 + 121.5000 67.2500 -38.0 + 119.7500 66.5000 -38.0 + 101.7500 75.5000 -38.0 + 103.5000 74.7500 -38.0 + 105.2500 75.5000 -38.0 + 105.5000 77.7500 -38.0 + 109.2500 80.5000 -38.0 + 116.5000 80.7500 -38.0 + 120.5000 78.7500 -38.0 + 122.2500 79.5000 -38.0 + 123.5000 78.7500 -38.0 + 127.2500 79.5000 -38.0 + 128.2500 81.5000 -38.0 + 129.5000 81.7500 -38.0 + 137.2500 91.5000 -38.0 + 137.2500 95.5000 -38.0 + 139.2500 100.5000 -38.0 + 146.2500 107.5000 -38.0 + 146.2500 109.5000 -38.0 + 155.2500 127.5000 -38.0 + 155.2500 135.5000 -38.0 + 153.5000 142.2500 -38.0 + 153.2500 154.5000 -38.0 + 152.5000 156.2500 -38.0 + 151.2500 171.5000 -38.0 + 146.2500 185.5000 -38.0 + 144.5000 186.2500 -38.0 + 129.5000 200.2500 -38.0 + 122.5000 204.2500 -38.0 + 119.5000 204.2500 -38.0 + 113.5000 207.2500 -38.0 + 102.5000 207.2500 -38.0 + 100.5000 208.2500 -38.0 + 90.5000 207.2500 -38.0 + 84.5000 205.2500 -38.0 + 76.5000 200.2500 -38.0 + 64.7500 187.5000 -38.0 + 58.7500 177.5000 -38.0 + 58.7500 175.5000 -38.0 + 57.7500 173.5000 -38.0 + 57.7500 167.5000 -38.0 + 56.7500 165.5000 -38.0 + 56.7500 155.5000 -38.0 + 57.5000 153.7500 -38.0 + 57.7500 147.5000 -38.0 + 56.7500 145.5000 -38.0 + 56.7500 140.5000 -38.0 + 55.7500 138.5000 -38.0 + 55.7500 134.5000 -38.0 + 54.7500 131.5000 -38.0 + 57.5000 128.7500 -38.0 + 58.7500 123.5000 -38.0 + 61.7500 119.5000 -38.0 + 69.5000 102.7500 -38.0 + 71.7500 94.5000 -38.0 + 79.5000 86.7500 -38.0 + 81.5000 86.7500 -38.0 + 84.5000 83.7500 -38.0 + 86.5000 83.7500 -38.0 + 89.5000 80.7500 -38.0 + 94.5000 80.7500 -38.0 + 96.5000 79.7500 -38.0 + 99.5000 79.7500 -38.0 + 101.5000 77.7500 -38.0 + 50.7500 182.5000 -38.0 + 51.5000 181.7500 -38.0 + 52.2500 182.5000 -38.0 + 51.5000 183.2500 -38.0 + 95.2500 65.5000 -40.0 + 94.5000 66.2500 -40.0 + 90.5000 66.2500 -40.0 + 88.5000 67.2500 -40.0 + 84.5000 67.2500 -40.0 + 74.5000 72.2500 -40.0 + 70.5000 75.2500 -40.0 + 65.5000 81.2500 -40.0 + 61.5000 87.2500 -40.0 + 58.2500 91.5000 -40.0 + 53.2500 101.5000 -40.0 + 52.2500 106.5000 -40.0 + 51.2500 108.5000 -40.0 + 49.2500 118.5000 -40.0 + 47.2500 127.5000 -40.0 + 46.2500 134.5000 -40.0 + 45.5000 136.2500 -40.0 + 44.2500 144.5000 -40.0 + 43.5000 146.2500 -40.0 + 43.2500 174.5000 -40.0 + 44.2500 176.5000 -40.0 + 44.2500 178.5000 -40.0 + 45.2500 180.5000 -40.0 + 45.2500 182.5000 -40.0 + 46.5000 185.7500 -40.0 + 50.2500 194.5000 -40.0 + 59.5000 205.7500 -40.0 + 63.2500 208.5000 -40.0 + 67.5000 211.7500 -40.0 + 74.2500 215.5000 -40.0 + 77.5000 215.7500 -40.0 + 79.2500 216.5000 -40.0 + 99.5000 216.7500 -40.0 + 106.5000 217.7500 -40.0 + 108.2500 218.5000 -40.0 + 122.5000 218.7500 -40.0 + 124.5000 217.7500 -40.0 + 126.5000 217.7500 -40.0 + 137.5000 212.7500 -40.0 + 148.5000 203.7500 -40.0 + 157.7500 192.5000 -40.0 + 163.5000 181.7500 -40.0 + 163.7500 179.5000 -40.0 + 164.7500 176.5000 -40.0 + 165.5000 174.7500 -40.0 + 165.7500 170.5000 -40.0 + 166.5000 168.7500 -40.0 + 166.7500 161.5000 -40.0 + 167.5000 159.7500 -40.0 + 167.7500 149.5000 -40.0 + 166.7500 147.5000 -40.0 + 166.7500 138.5000 -40.0 + 165.7500 136.5000 -40.0 + 165.7500 132.5000 -40.0 + 164.7500 130.5000 -40.0 + 164.7500 124.5000 -40.0 + 163.7500 122.5000 -40.0 + 163.7500 117.5000 -40.0 + 161.7500 113.5000 -40.0 + 161.7500 110.5000 -40.0 + 160.7500 108.5000 -40.0 + 160.7500 106.5000 -40.0 + 159.7500 104.5000 -40.0 + 159.7500 102.5000 -40.0 + 152.7500 88.5000 -40.0 + 147.7500 82.5000 -40.0 + 144.7500 78.5000 -40.0 + 137.5000 72.2500 -40.0 + 127.5000 67.2500 -40.0 + 125.7500 66.5000 -40.0 + 122.5000 66.2500 -40.0 + 120.7500 65.5000 -40.0 + 101.7500 73.5000 -40.0 + 102.5000 72.7500 -40.0 + 104.5000 73.7500 -40.0 + 106.2500 74.5000 -40.0 + 106.2500 77.5000 -40.0 + 110.2500 79.5000 -40.0 + 117.5000 79.7500 -40.0 + 121.5000 77.7500 -40.0 + 129.5000 77.7500 -40.0 + 133.2500 82.5000 -40.0 + 136.2500 88.5000 -40.0 + 140.2500 92.5000 -40.0 + 140.2500 95.5000 -40.0 + 142.2500 97.5000 -40.0 + 141.5000 99.2500 -40.0 + 142.2500 101.5000 -40.0 + 146.2500 105.5000 -40.0 + 150.2500 113.5000 -40.0 + 150.2500 115.5000 -40.0 + 153.2500 119.5000 -40.0 + 156.2500 124.5000 -40.0 + 156.2500 127.5000 -40.0 + 157.2500 130.5000 -40.0 + 156.2500 139.5000 -40.0 + 155.5000 141.2500 -40.0 + 155.2500 158.5000 -40.0 + 154.2500 163.5000 -40.0 + 153.2500 172.5000 -40.0 + 151.2500 178.5000 -40.0 + 149.2500 183.5000 -40.0 + 148.5000 185.2500 -40.0 + 146.5000 186.2500 -40.0 + 139.5000 193.2500 -40.0 + 129.5000 202.2500 -40.0 + 119.5000 207.2500 -40.0 + 116.5000 207.2500 -40.0 + 112.5000 209.2500 -40.0 + 108.5000 209.2500 -40.0 + 103.5000 208.2500 -40.0 + 101.5000 209.2500 -40.0 + 98.5000 209.2500 -40.0 + 96.7500 208.5000 -40.0 + 90.5000 208.2500 -40.0 + 85.5000 207.2500 -40.0 + 83.5000 206.2500 -40.0 + 75.5000 201.2500 -40.0 + 63.7500 188.5000 -40.0 + 60.7500 184.5000 -40.0 + 57.7500 179.5000 -40.0 + 57.7500 177.5000 -40.0 + 55.7500 173.5000 -40.0 + 55.7500 169.5000 -40.0 + 54.7500 167.5000 -40.0 + 54.7500 140.5000 -40.0 + 53.7500 138.5000 -40.0 + 53.7500 133.5000 -40.0 + 52.7500 131.5000 -40.0 + 53.7500 129.5000 -40.0 + 62.5000 112.7500 -40.0 + 62.7500 110.5000 -40.0 + 67.7500 100.5000 -40.0 + 68.5000 98.7500 -40.0 + 68.7500 94.5000 -40.0 + 72.5000 88.7500 -40.0 + 74.7500 87.5000 -40.0 + 81.5000 82.7500 -40.0 + 83.5000 82.7500 -40.0 + 83.7500 81.5000 -40.0 + 85.5000 79.7500 -40.0 + 91.5000 79.7500 -40.0 + 93.5000 78.7500 -40.0 + 95.5000 78.7500 -40.0 + 99.5000 76.7500 -40.0 + 99.7500 74.5000 -40.0 + 143.7500 95.5000 -40.0 + 144.5000 94.7500 -40.0 + 145.2500 95.5000 -40.0 + 144.5000 97.2500 -40.0 + 66.7500 204.5000 -40.0 + 67.5000 203.7500 -40.0 + 68.2500 204.5000 -40.0 + 67.5000 205.2500 -40.0 + 95.2500 64.5000 -42.0 + 94.5000 65.2500 -42.0 + 89.5000 65.2500 -42.0 + 87.5000 66.2500 -42.0 + 84.2500 66.5000 -42.0 + 75.5000 70.2500 -42.0 + 70.5000 74.2500 -42.0 + 68.5000 75.2500 -42.0 + 68.2500 76.5000 -42.0 + 64.5000 80.2500 -42.0 + 58.2500 88.5000 -42.0 + 53.5000 97.2500 -42.0 + 53.2500 99.5000 -42.0 + 51.2500 103.5000 -42.0 + 50.2500 108.5000 -42.0 + 49.2500 110.5000 -42.0 + 48.2500 117.5000 -42.0 + 47.5000 119.2500 -42.0 + 46.2500 127.5000 -42.0 + 45.5000 129.2500 -42.0 + 44.2500 137.5000 -42.0 + 43.2500 139.5000 -42.0 + 42.2500 146.5000 -42.0 + 41.5000 148.2500 -42.0 + 41.2500 154.5000 -42.0 + 40.2500 156.5000 -42.0 + 41.2500 158.5000 -42.0 + 41.2500 173.5000 -42.0 + 42.2500 175.5000 -42.0 + 42.2500 179.5000 -42.0 + 44.2500 183.5000 -42.0 + 44.2500 185.5000 -42.0 + 50.2500 197.5000 -42.0 + 58.2500 206.5000 -42.0 + 64.2500 211.5000 -42.0 + 70.5000 215.7500 -42.0 + 75.5000 216.7500 -42.0 + 77.2500 217.5000 -42.0 + 98.5000 217.7500 -42.0 + 105.5000 218.7500 -42.0 + 107.2500 219.5000 -42.0 + 124.5000 219.7500 -42.0 + 132.5000 215.7500 -42.0 + 134.5000 215.7500 -42.0 + 140.5000 211.7500 -42.0 + 142.5000 210.7500 -42.0 + 148.5000 204.7500 -42.0 + 150.5000 203.7500 -42.0 + 154.5000 198.7500 -42.0 + 159.5000 192.7500 -42.0 + 163.5000 185.7500 -42.0 + 163.7500 183.5000 -42.0 + 165.7500 179.5000 -42.0 + 166.7500 174.5000 -42.0 + 167.5000 172.7500 -42.0 + 167.7500 167.5000 -42.0 + 168.5000 165.7500 -42.0 + 168.7500 147.5000 -42.0 + 167.7500 145.5000 -42.0 + 167.7500 138.5000 -42.0 + 166.7500 136.5000 -42.0 + 166.7500 132.5000 -42.0 + 165.7500 130.5000 -42.0 + 165.7500 123.5000 -42.0 + 164.7500 121.5000 -42.0 + 164.7500 118.5000 -42.0 + 163.7500 116.5000 -42.0 + 163.7500 114.5000 -42.0 + 162.7500 112.5000 -42.0 + 162.7500 108.5000 -42.0 + 160.7500 104.5000 -42.0 + 160.7500 102.5000 -42.0 + 158.7500 98.5000 -42.0 + 156.5000 92.2500 -42.0 + 151.7500 85.5000 -42.0 + 150.7500 83.5000 -42.0 + 139.7500 72.5000 -42.0 + 132.7500 68.5000 -42.0 + 126.5000 66.2500 -42.0 + 124.7500 65.5000 -42.0 + 121.5000 65.2500 -42.0 + 119.7500 64.5000 -42.0 + 99.7500 72.5000 -42.0 + 100.5000 71.7500 -42.0 + 104.5000 71.7500 -42.0 + 108.2500 74.5000 -42.0 + 108.2500 76.5000 -42.0 + 109.5000 76.7500 -42.0 + 111.2500 77.5000 -42.0 + 116.5000 77.7500 -42.0 + 118.5000 76.7500 -42.0 + 121.5000 76.7500 -42.0 + 123.5000 75.7500 -42.0 + 130.5000 75.7500 -42.0 + 132.2500 76.5000 -42.0 + 132.2500 78.5000 -42.0 + 135.2500 82.5000 -42.0 + 137.2500 86.5000 -42.0 + 144.2500 95.5000 -42.0 + 145.2500 97.5000 -42.0 + 147.2500 98.5000 -42.0 + 147.2500 101.5000 -42.0 + 149.2500 105.5000 -42.0 + 149.2500 107.5000 -42.0 + 154.2500 117.5000 -42.0 + 157.2500 122.5000 -42.0 + 157.2500 126.5000 -42.0 + 158.2500 128.5000 -42.0 + 158.2500 132.5000 -42.0 + 157.5000 134.2500 -42.0 + 157.2500 142.5000 -42.0 + 156.2500 144.5000 -42.0 + 157.2500 146.5000 -42.0 + 157.2500 160.5000 -42.0 + 156.5000 162.2500 -42.0 + 156.2500 169.5000 -42.0 + 155.2500 174.5000 -42.0 + 154.2500 177.5000 -42.0 + 151.2500 184.5000 -42.0 + 136.5000 198.2500 -42.0 + 129.5000 204.2500 -42.0 + 124.5000 207.2500 -42.0 + 122.5000 207.2500 -42.0 + 118.5000 209.2500 -42.0 + 116.5000 209.2500 -42.0 + 114.5000 210.2500 -42.0 + 112.5000 210.2500 -42.0 + 109.5000 211.2500 -42.0 + 103.5000 209.2500 -42.0 + 98.5000 211.2500 -42.0 + 96.7500 209.5000 -42.0 + 90.5000 209.2500 -42.0 + 83.5000 208.2500 -42.0 + 79.5000 205.2500 -42.0 + 75.5000 203.2500 -42.0 + 59.7500 186.5000 -42.0 + 54.7500 176.5000 -42.0 + 54.7500 174.5000 -42.0 + 53.7500 172.5000 -42.0 + 53.7500 168.5000 -42.0 + 52.7500 166.5000 -42.0 + 52.7500 134.5000 -42.0 + 51.7500 132.5000 -42.0 + 51.7500 130.5000 -42.0 + 52.7500 127.5000 -42.0 + 54.7500 122.5000 -42.0 + 57.5000 118.7500 -42.0 + 58.7500 114.5000 -42.0 + 60.5000 110.7500 -42.0 + 60.7500 108.5000 -42.0 + 63.7500 104.5000 -42.0 + 66.7500 98.5000 -42.0 + 67.7500 89.5000 -42.0 + 71.5000 86.7500 -42.0 + 75.5000 84.7500 -42.0 + 82.5000 78.7500 -42.0 + 84.5000 77.7500 -42.0 + 86.2500 78.5000 -42.0 + 90.5000 78.7500 -42.0 + 91.5000 76.7500 -42.0 + 94.5000 76.7500 -42.0 + 97.5000 75.7500 -42.0 + 97.7500 73.5000 -42.0 + 46.7500 142.5000 -42.0 + 47.5000 141.7500 -42.0 + 48.2500 142.5000 -42.0 + 47.5000 144.2500 -42.0 + 96.2500 63.5000 -44.0 + 95.5000 64.2500 -44.0 + 90.5000 64.2500 -44.0 + 88.5000 65.2500 -44.0 + 86.5000 65.2500 -44.0 + 84.5000 66.2500 -44.0 + 82.5000 66.2500 -44.0 + 70.5000 72.2500 -44.0 + 65.5000 77.2500 -44.0 + 60.5000 83.2500 -44.0 + 57.2500 87.5000 -44.0 + 51.2500 99.5000 -44.0 + 50.2500 104.5000 -44.0 + 49.2500 106.5000 -44.0 + 47.2500 115.5000 -44.0 + 46.5000 117.2500 -44.0 + 46.2500 121.5000 -44.0 + 45.5000 123.2500 -44.0 + 44.2500 131.5000 -44.0 + 43.2500 133.5000 -44.0 + 40.2500 148.5000 -44.0 + 39.5000 150.2500 -44.0 + 39.2500 170.5000 -44.0 + 40.2500 172.5000 -44.0 + 40.2500 177.5000 -44.0 + 41.2500 179.5000 -44.0 + 41.2500 181.5000 -44.0 + 43.2500 185.5000 -44.0 + 43.2500 187.5000 -44.0 + 47.2500 195.5000 -44.0 + 50.2500 199.5000 -44.0 + 51.2500 201.5000 -44.0 + 59.5000 209.7500 -44.0 + 63.2500 212.5000 -44.0 + 69.5000 216.7500 -44.0 + 74.5000 217.7500 -44.0 + 76.2500 218.5000 -44.0 + 97.5000 218.7500 -44.0 + 104.5000 219.7500 -44.0 + 106.2500 220.5000 -44.0 + 122.5000 220.7500 -44.0 + 124.5000 219.7500 -44.0 + 127.7500 219.5000 -44.0 + 138.5000 214.7500 -44.0 + 143.5000 210.7500 -44.0 + 145.5000 209.7500 -44.0 + 155.5000 199.7500 -44.0 + 160.5000 193.7500 -44.0 + 165.7500 184.5000 -44.0 + 166.7500 179.5000 -44.0 + 168.7500 173.5000 -44.0 + 169.7500 164.5000 -44.0 + 170.5000 162.7500 -44.0 + 170.7500 156.5000 -44.0 + 169.7500 154.5000 -44.0 + 169.7500 145.5000 -44.0 + 168.7500 143.5000 -44.0 + 168.7500 138.5000 -44.0 + 167.7500 136.5000 -44.0 + 167.7500 131.5000 -44.0 + 166.7500 129.5000 -44.0 + 166.7500 124.5000 -44.0 + 165.7500 122.5000 -44.0 + 165.7500 118.5000 -44.0 + 164.7500 116.5000 -44.0 + 164.7500 114.5000 -44.0 + 163.7500 112.5000 -44.0 + 163.7500 108.5000 -44.0 + 161.7500 104.5000 -44.0 + 161.7500 102.5000 -44.0 + 158.7500 96.5000 -44.0 + 158.7500 94.5000 -44.0 + 153.7500 86.5000 -44.0 + 152.7500 84.5000 -44.0 + 147.7500 79.5000 -44.0 + 146.7500 77.5000 -44.0 + 138.5000 71.2500 -44.0 + 131.7500 67.5000 -44.0 + 125.5000 65.2500 -44.0 + 123.7500 64.5000 -44.0 + 119.5000 64.2500 -44.0 + 117.7500 63.5000 -44.0 + 97.5000 70.7500 -44.0 + 99.5000 70.7500 -44.0 + 101.5000 71.7500 -44.0 + 104.5000 70.7500 -44.0 + 106.2500 72.5000 -44.0 + 109.5000 72.7500 -44.0 + 114.5000 74.7500 -44.0 + 120.5000 71.7500 -44.0 + 123.2500 74.5000 -44.0 + 132.5000 74.7500 -44.0 + 134.2500 76.5000 -44.0 + 134.2500 79.5000 -44.0 + 138.2500 83.5000 -44.0 + 140.2500 87.5000 -44.0 + 144.2500 91.5000 -44.0 + 150.2500 101.5000 -44.0 + 150.2500 104.5000 -44.0 + 155.2500 114.5000 -44.0 + 155.2500 116.5000 -44.0 + 158.2500 120.5000 -44.0 + 158.2500 123.5000 -44.0 + 159.2500 125.5000 -44.0 + 159.2500 136.5000 -44.0 + 158.5000 138.2500 -44.0 + 158.2500 145.5000 -44.0 + 159.2500 147.5000 -44.0 + 159.2500 163.5000 -44.0 + 158.5000 165.2500 -44.0 + 158.2500 173.5000 -44.0 + 157.2500 176.5000 -44.0 + 154.2500 183.5000 -44.0 + 147.5000 190.2500 -44.0 + 137.5000 199.2500 -44.0 + 130.5000 205.2500 -44.0 + 125.5000 208.2500 -44.0 + 123.5000 208.2500 -44.0 + 117.5000 211.2500 -44.0 + 115.5000 211.2500 -44.0 + 113.5000 212.2500 -44.0 + 108.5000 212.2500 -44.0 + 106.7500 211.5000 -44.0 + 100.5000 211.2500 -44.0 + 98.5000 212.2500 -44.0 + 96.7500 210.5000 -44.0 + 88.5000 210.2500 -44.0 + 83.5000 209.2500 -44.0 + 75.5000 204.2500 -44.0 + 73.5000 203.2500 -44.0 + 58.7500 187.5000 -44.0 + 55.7500 183.5000 -44.0 + 55.7500 181.5000 -44.0 + 52.7500 175.5000 -44.0 + 52.7500 173.5000 -44.0 + 51.7500 171.5000 -44.0 + 51.7500 168.5000 -44.0 + 50.7500 166.5000 -44.0 + 50.7500 146.5000 -44.0 + 51.5000 144.7500 -44.0 + 51.7500 139.5000 -44.0 + 50.7500 137.5000 -44.0 + 50.7500 131.5000 -44.0 + 49.7500 128.5000 -44.0 + 56.7500 114.5000 -44.0 + 57.5000 112.7500 -44.0 + 57.7500 108.5000 -44.0 + 62.7500 100.5000 -44.0 + 64.7500 90.5000 -44.0 + 67.5000 87.7500 -44.0 + 72.5000 84.7500 -44.0 + 74.7500 83.5000 -44.0 + 77.5000 79.7500 -44.0 + 81.5000 76.7500 -44.0 + 86.5000 76.7500 -44.0 + 90.5000 72.7500 -44.0 + 92.2500 73.5000 -44.0 + 94.5000 73.7500 -44.0 + 98.2500 62.5000 -46.0 + 97.5000 63.2500 -46.0 + 92.5000 63.2500 -46.0 + 90.5000 64.2500 -46.0 + 87.5000 64.2500 -46.0 + 85.5000 65.2500 -46.0 + 82.2500 65.5000 -46.0 + 73.5000 69.2500 -46.0 + 67.5000 74.2500 -46.0 + 65.5000 75.2500 -46.0 + 59.5000 82.2500 -46.0 + 56.2500 86.5000 -46.0 + 50.2500 98.5000 -46.0 + 48.2500 107.5000 -46.0 + 47.2500 109.5000 -46.0 + 44.2500 124.5000 -46.0 + 40.2500 142.5000 -46.0 + 39.5000 144.2500 -46.0 + 38.2500 152.5000 -46.0 + 37.5000 154.2500 -46.0 + 37.2500 167.5000 -46.0 + 38.2500 169.5000 -46.0 + 38.2500 175.5000 -46.0 + 39.2500 177.5000 -46.0 + 39.2500 180.5000 -46.0 + 41.2500 184.5000 -46.0 + 41.5000 186.7500 -46.0 + 45.2500 195.5000 -46.0 + 49.2500 200.5000 -46.0 + 50.2500 202.5000 -46.0 + 57.2500 209.5000 -46.0 + 63.2500 214.5000 -46.0 + 68.5000 217.7500 -46.0 + 73.5000 218.7500 -46.0 + 75.2500 219.5000 -46.0 + 83.5000 219.7500 -46.0 + 85.5000 220.7500 -46.0 + 87.5000 219.7500 -46.0 + 96.5000 219.7500 -46.0 + 105.5000 220.7500 -46.0 + 107.2500 221.5000 -46.0 + 122.5000 221.7500 -46.0 + 124.5000 220.7500 -46.0 + 127.5000 220.7500 -46.0 + 143.5000 212.7500 -46.0 + 158.5000 198.7500 -46.0 + 162.7500 192.5000 -46.0 + 167.7500 182.5000 -46.0 + 169.7500 173.5000 -46.0 + 170.5000 171.7500 -46.0 + 170.7500 167.5000 -46.0 + 171.5000 165.7500 -46.0 + 171.7500 156.5000 -46.0 + 170.7500 154.5000 -46.0 + 170.7500 146.5000 -46.0 + 169.7500 144.5000 -46.0 + 169.7500 139.5000 -46.0 + 168.7500 137.5000 -46.0 + 168.7500 131.5000 -46.0 + 167.7500 129.5000 -46.0 + 167.7500 125.5000 -46.0 + 166.7500 123.5000 -46.0 + 166.7500 120.5000 -46.0 + 165.7500 118.5000 -46.0 + 165.7500 114.5000 -46.0 + 164.7500 112.5000 -46.0 + 164.7500 109.5000 -46.0 + 162.7500 105.5000 -46.0 + 162.7500 103.5000 -46.0 + 160.7500 99.5000 -46.0 + 160.7500 97.5000 -46.0 + 154.7500 85.5000 -46.0 + 146.7500 76.5000 -46.0 + 142.5000 73.2500 -46.0 + 138.7500 70.5000 -46.0 + 131.7500 66.5000 -46.0 + 129.5000 66.2500 -46.0 + 125.5000 64.2500 -46.0 + 118.5000 63.2500 -46.0 + 116.7500 62.5000 -46.0 + 82.5000 69.7500 -46.0 + 96.5000 69.7500 -46.0 + 102.5000 72.7500 -46.0 + 102.7500 70.5000 -46.0 + 104.5000 69.7500 -46.0 + 106.5000 71.7500 -46.0 + 108.5000 70.7500 -46.0 + 110.5000 70.7500 -46.0 + 117.5000 71.7500 -46.0 + 120.5000 70.7500 -46.0 + 125.5000 72.7500 -46.0 + 127.2500 73.5000 -46.0 + 132.5000 73.7500 -46.0 + 134.2500 74.5000 -46.0 + 137.2500 80.5000 -46.0 + 141.5000 83.7500 -46.0 + 143.5000 84.7500 -46.0 + 147.2500 90.5000 -46.0 + 147.2500 92.5000 -46.0 + 148.2500 95.5000 -46.0 + 151.2500 99.5000 -46.0 + 151.2500 102.5000 -46.0 + 152.2500 104.5000 -46.0 + 152.2500 106.5000 -46.0 + 155.2500 110.5000 -46.0 + 155.2500 112.5000 -46.0 + 159.2500 120.5000 -46.0 + 159.2500 122.5000 -46.0 + 160.2500 124.5000 -46.0 + 160.2500 126.5000 -46.0 + 161.2500 128.5000 -46.0 + 160.5000 130.2500 -46.0 + 160.2500 135.5000 -46.0 + 159.5000 137.2500 -46.0 + 159.2500 143.5000 -46.0 + 160.2500 145.5000 -46.0 + 160.2500 148.5000 -46.0 + 161.2500 150.5000 -46.0 + 161.2500 162.5000 -46.0 + 160.5000 164.2500 -46.0 + 160.2500 174.5000 -46.0 + 158.2500 178.5000 -46.0 + 157.2500 183.5000 -46.0 + 155.5000 184.2500 -46.0 + 149.5000 190.2500 -46.0 + 136.2500 202.5000 -46.0 + 129.5000 207.2500 -46.0 + 124.5000 210.2500 -46.0 + 122.5000 210.2500 -46.0 + 118.5000 212.2500 -46.0 + 115.5000 212.2500 -46.0 + 113.5000 213.2500 -46.0 + 109.5000 213.2500 -46.0 + 104.5000 212.2500 -46.0 + 102.5000 211.2500 -46.0 + 100.5000 212.2500 -46.0 + 98.5000 212.2500 -46.0 + 96.7500 211.5000 -46.0 + 88.5000 211.2500 -46.0 + 83.5000 210.2500 -46.0 + 75.5000 206.2500 -46.0 + 71.5000 203.2500 -46.0 + 69.5000 202.2500 -46.0 + 68.7500 200.5000 -46.0 + 54.7500 185.5000 -46.0 + 54.7500 183.5000 -46.0 + 51.7500 177.5000 -46.0 + 51.7500 175.5000 -46.0 + 49.7500 171.5000 -46.0 + 49.7500 168.5000 -46.0 + 48.7500 166.5000 -46.0 + 48.7500 147.5000 -46.0 + 49.5000 145.7500 -46.0 + 49.7500 130.5000 -46.0 + 48.7500 127.5000 -46.0 + 49.5000 125.7500 -46.0 + 49.7500 122.5000 -46.0 + 51.7500 118.5000 -46.0 + 56.5000 109.7500 -46.0 + 56.7500 107.5000 -46.0 + 60.5000 99.7500 -46.0 + 60.7500 95.5000 -46.0 + 63.7500 89.5000 -46.0 + 69.5000 84.7500 -46.0 + 71.5000 83.7500 -46.0 + 73.7500 81.5000 -46.0 + 72.7500 79.5000 -46.0 + 77.5000 76.7500 -46.0 + 81.5000 74.7500 -46.0 + 81.7500 73.5000 -46.0 + 80.7500 71.5000 -46.0 + 100.2500 61.5000 -48.0 + 99.5000 62.2500 -48.0 + 93.5000 62.2500 -48.0 + 91.5000 63.2500 -48.0 + 88.5000 63.2500 -48.0 + 86.5000 64.2500 -48.0 + 83.2500 64.5000 -48.0 + 72.5000 69.2500 -48.0 + 68.5000 72.2500 -48.0 + 66.5000 73.2500 -48.0 + 59.5000 80.2500 -48.0 + 56.2500 84.5000 -48.0 + 50.2500 96.5000 -48.0 + 49.2500 101.5000 -48.0 + 47.2500 105.5000 -48.0 + 46.2500 110.5000 -48.0 + 45.5000 112.2500 -48.0 + 44.2500 120.5000 -48.0 + 43.2500 125.5000 -48.0 + 42.2500 128.5000 -48.0 + 40.2500 137.5000 -48.0 + 39.2500 142.5000 -48.0 + 38.2500 144.5000 -48.0 + 37.2500 151.5000 -48.0 + 36.5000 153.2500 -48.0 + 36.2500 159.5000 -48.0 + 35.2500 162.5000 -48.0 + 36.2500 164.5000 -48.0 + 36.2500 171.5000 -48.0 + 37.2500 173.5000 -48.0 + 37.2500 176.5000 -48.0 + 38.2500 178.5000 -48.0 + 38.2500 180.5000 -48.0 + 39.2500 182.5000 -48.0 + 39.2500 184.5000 -48.0 + 43.2500 192.5000 -48.0 + 43.2500 194.5000 -48.0 + 46.2500 198.5000 -48.0 + 47.2500 200.5000 -48.0 + 55.2500 209.5000 -48.0 + 61.2500 214.5000 -48.0 + 66.2500 217.5000 -48.0 + 72.5000 219.7500 -48.0 + 81.5000 220.7500 -48.0 + 86.5000 221.7500 -48.0 + 88.5000 220.7500 -48.0 + 90.5000 220.7500 -48.0 + 95.5000 221.7500 -48.0 + 98.5000 220.7500 -48.0 + 100.2500 221.5000 -48.0 + 105.5000 221.7500 -48.0 + 107.2500 222.5000 -48.0 + 116.5000 222.7500 -48.0 + 118.5000 221.7500 -48.0 + 125.5000 221.7500 -48.0 + 127.5000 220.7500 -48.0 + 129.7500 220.5000 -48.0 + 142.5000 214.7500 -48.0 + 154.5000 203.7500 -48.0 + 156.5000 202.7500 -48.0 + 156.7500 201.5000 -48.0 + 162.7500 194.5000 -48.0 + 166.5000 187.7500 -48.0 + 169.7500 178.5000 -48.0 + 171.7500 169.5000 -48.0 + 172.5000 167.7500 -48.0 + 172.7500 157.5000 -48.0 + 171.7500 155.5000 -48.0 + 171.7500 147.5000 -48.0 + 170.7500 145.5000 -48.0 + 170.7500 139.5000 -48.0 + 169.7500 137.5000 -48.0 + 169.7500 133.5000 -48.0 + 168.7500 131.5000 -48.0 + 168.7500 127.5000 -48.0 + 167.7500 125.5000 -48.0 + 167.7500 121.5000 -48.0 + 166.7500 119.5000 -48.0 + 166.7500 117.5000 -48.0 + 165.7500 115.5000 -48.0 + 165.7500 110.5000 -48.0 + 163.7500 106.5000 -48.0 + 163.7500 104.5000 -48.0 + 160.7500 98.5000 -48.0 + 160.7500 96.5000 -48.0 + 158.7500 92.5000 -48.0 + 158.7500 90.5000 -48.0 + 154.7500 84.5000 -48.0 + 153.7500 82.5000 -48.0 + 145.7500 74.5000 -48.0 + 139.5000 70.2500 -48.0 + 127.5000 64.2500 -48.0 + 122.5000 63.2500 -48.0 + 120.7500 62.5000 -48.0 + 115.5000 62.2500 -48.0 + 113.7500 61.5000 -48.0 + 81.7500 69.5000 -48.0 + 82.5000 68.7500 -48.0 + 87.5000 69.7500 -48.0 + 89.5000 68.7500 -48.0 + 92.5000 68.7500 -48.0 + 94.5000 69.7500 -48.0 + 99.5000 70.7500 -48.0 + 102.5000 71.7500 -48.0 + 102.7500 70.5000 -48.0 + 104.5000 68.7500 -48.0 + 106.5000 70.7500 -48.0 + 108.5000 69.7500 -48.0 + 110.5000 69.7500 -48.0 + 112.5000 68.7500 -48.0 + 115.5000 68.7500 -48.0 + 117.2500 69.5000 -48.0 + 123.5000 69.7500 -48.0 + 128.5000 71.7500 -48.0 + 132.2500 73.5000 -48.0 + 135.5000 73.7500 -48.0 + 138.2500 78.5000 -48.0 + 139.2500 80.5000 -48.0 + 140.5000 80.7500 -48.0 + 142.5000 82.7500 -48.0 + 144.5000 83.7500 -48.0 + 147.2500 87.5000 -48.0 + 149.2500 91.5000 -48.0 + 149.2500 93.5000 -48.0 + 152.2500 99.5000 -48.0 + 152.2500 103.5000 -48.0 + 158.2500 115.5000 -48.0 + 158.2500 117.5000 -48.0 + 160.2500 119.5000 -48.0 + 160.2500 121.5000 -48.0 + 161.2500 123.5000 -48.0 + 161.2500 125.5000 -48.0 + 162.2500 127.5000 -48.0 + 161.5000 128.2500 -48.0 + 161.2500 134.5000 -48.0 + 160.5000 136.2500 -48.0 + 160.2500 142.5000 -48.0 + 161.2500 144.5000 -48.0 + 161.2500 146.5000 -48.0 + 162.2500 148.5000 -48.0 + 162.2500 169.5000 -48.0 + 161.2500 176.5000 -48.0 + 159.5000 180.2500 -48.0 + 159.2500 182.5000 -48.0 + 146.5000 195.2500 -48.0 + 135.5000 204.2500 -48.0 + 131.5000 207.2500 -48.0 + 119.5000 213.2500 -48.0 + 116.5000 213.2500 -48.0 + 114.5000 214.2500 -48.0 + 109.5000 214.2500 -48.0 + 104.5000 213.2500 -48.0 + 102.5000 212.2500 -48.0 + 100.5000 213.2500 -48.0 + 98.5000 213.2500 -48.0 + 94.7500 211.5000 -48.0 + 93.5000 212.2500 -48.0 + 90.5000 212.2500 -48.0 + 88.7500 211.5000 -48.0 + 82.5000 211.2500 -48.0 + 72.5000 206.2500 -48.0 + 53.7500 186.5000 -48.0 + 51.7500 182.5000 -48.0 + 51.7500 180.5000 -48.0 + 49.7500 176.5000 -48.0 + 49.7500 174.5000 -48.0 + 47.7500 170.5000 -48.0 + 47.7500 164.5000 -48.0 + 46.7500 162.5000 -48.0 + 46.7500 148.5000 -48.0 + 47.7500 143.5000 -48.0 + 48.5000 141.7500 -48.0 + 48.7500 129.5000 -48.0 + 47.7500 127.5000 -48.0 + 49.7500 118.5000 -48.0 + 58.7500 100.5000 -48.0 + 59.5000 98.7500 -48.0 + 59.7500 94.5000 -48.0 + 61.7500 90.5000 -48.0 + 63.5000 89.7500 -48.0 + 63.7500 88.5000 -48.0 + 69.7500 81.5000 -48.0 + 72.5000 77.7500 -48.0 + 74.5000 77.7500 -48.0 + 76.5000 75.7500 -48.0 + 79.5000 70.7500 -48.0 + 101.2500 60.5000 -50.0 + 100.5000 61.2500 -50.0 + 94.5000 61.2500 -50.0 + 92.5000 62.2500 -50.0 + 89.5000 62.2500 -50.0 + 87.5000 63.2500 -50.0 + 85.5000 63.2500 -50.0 + 83.5000 64.2500 -50.0 + 81.5000 64.2500 -50.0 + 69.5000 70.2500 -50.0 + 63.5000 75.2500 -50.0 + 59.5000 78.2500 -50.0 + 55.2500 84.5000 -50.0 + 51.2500 92.5000 -50.0 + 49.5000 96.2500 -50.0 + 49.2500 99.5000 -50.0 + 46.2500 105.5000 -50.0 + 43.2500 120.5000 -50.0 + 41.2500 129.5000 -50.0 + 40.2500 132.5000 -50.0 + 39.5000 134.2500 -50.0 + 39.2500 137.5000 -50.0 + 38.2500 140.5000 -50.0 + 36.2500 149.5000 -50.0 + 35.2500 156.5000 -50.0 + 34.5000 158.2500 -50.0 + 34.2500 167.5000 -50.0 + 35.2500 169.5000 -50.0 + 35.2500 174.5000 -50.0 + 36.2500 176.5000 -50.0 + 36.2500 179.5000 -50.0 + 38.2500 183.5000 -50.0 + 38.5000 185.7500 -50.0 + 41.2500 192.5000 -50.0 + 46.2500 200.5000 -50.0 + 47.2500 202.5000 -50.0 + 59.2500 214.5000 -50.0 + 68.5000 219.7500 -50.0 + 75.5000 220.7500 -50.0 + 77.2500 221.5000 -50.0 + 84.5000 221.7500 -50.0 + 86.5000 222.7500 -50.0 + 88.5000 221.7500 -50.0 + 90.5000 221.7500 -50.0 + 92.2500 222.5000 -50.0 + 105.5000 222.7500 -50.0 + 110.5000 223.7500 -50.0 + 112.5000 222.7500 -50.0 + 125.5000 222.7500 -50.0 + 129.5000 220.7500 -50.0 + 131.7500 220.5000 -50.0 + 140.5000 216.7500 -50.0 + 144.5000 213.7500 -50.0 + 146.5000 212.7500 -50.0 + 157.7500 202.5000 -50.0 + 160.5000 198.7500 -50.0 + 163.7500 194.5000 -50.0 + 169.7500 182.5000 -50.0 + 170.7500 177.5000 -50.0 + 171.7500 175.5000 -50.0 + 172.7500 168.5000 -50.0 + 173.5000 166.7500 -50.0 + 173.7500 161.5000 -50.0 + 172.7500 159.5000 -50.0 + 172.7500 150.5000 -50.0 + 171.7500 148.5000 -50.0 + 171.7500 141.5000 -50.0 + 170.7500 139.5000 -50.0 + 170.7500 135.5000 -50.0 + 169.7500 133.5000 -50.0 + 169.7500 130.5000 -50 + 168.7500 128.5000 -50.0 + 168.7500 122.5000 -50.0 + 167.7500 120.5000 -50.0 + 167.7500 118.5000 -50.0 + 166.7500 116.5000 -50.0 + 166.7500 114.5000 -50.0 + 165.7500 112.5000 -50.0 + 165.7500 108.5000 -50.0 + 162.7500 102.5000 -50.0 + 162.7500 100.5000 -50.0 + 159.7500 94.5000 -50.0 + 159.5000 92.2500 -50.0 + 156.7500 85.5000 -50.0 + 152.7500 80.5000 -50.0 + 151.7500 78.5000 -50.0 + 145.5000 73.2500 -50.0 + 134.7500 66.5000 -50.0 + 132.5000 66.2500 -50.0 + 126.5000 63.2500 -50.0 + 121.5000 62.2500 -50.0 + 119.7500 61.5000 -50.0 + 114.5000 61.2500 -50.0 + 112.7500 60.5000 -50.0 + 112.7500 68.5000 -50.0 + 113.5000 67.7500 -50.0 + 114.2500 68.5000 -50.0 + 115.5000 67.7500 -50.0 + 117.5000 67.7500 -50.0 + 124.5000 68.7500 -50.0 + 129.5000 69.7500 -50.0 + 133.2500 72.5000 -50.0 + 135.5000 72.7500 -50.0 + 140.2500 78.5000 -50.0 + 141.5000 80.7500 -50.0 + 143.5000 81.7500 -50.0 + 149.2500 88.5000 -50.0 + 149.2500 90.5000 -50.0 + 152.2500 96.5000 -50.0 + 152.2500 100.5000 -50.0 + 153.2500 102.5000 -50.0 + 153.2500 104.5000 -50.0 + 156.2500 108.5000 -50.0 + 161.2500 118.5000 -50.0 + 161.2500 121.5000 -50.0 + 162.2500 123.5000 -50.0 + 162.2500 126.5000 -50.0 + 161.5000 128.2500 -50.0 + 161.2500 135.5000 -50.0 + 162.2500 137.5000 -50.0 + 162.2500 144.5000 -50.0 + 163.2500 146.5000 -50.0 + 163.2500 156.5000 -50.0 + 164.2500 158.5000 -50.0 + 164.2500 166.5000 -50.0 + 163.2500 173.5000 -50.0 + 162.2500 178.5000 -50.0 + 159.2500 184.5000 -50.0 + 144.5000 198.2500 -50.0 + 133.5000 207.2500 -50.0 + 124.5000 212.2500 -50.0 + 122.5000 212.2500 -50.0 + 118.5000 214.2500 -50.0 + 116.5000 214.2500 -50.0 + 114.5000 215.2500 -50.0 + 110.5000 215.2500 -50.0 + 108.7500 214.5000 -50.0 + 99.5000 214.2500 -50.0 + 95.7500 212.5000 -50.0 + 92.5000 212.2500 -50.0 + 90.5000 213.2500 -50.0 + 88.7500 212.5000 -50.0 + 84.5000 212.2500 -50.0 + 79.5000 211.2500 -50.0 + 71.5000 207.2500 -50.0 + 61.5000 197.2500 -50.0 + 56.7500 190.5000 -50.0 + 50.7500 185.5000 -50.0 + 50.7500 182.5000 -50.0 + 48.7500 178.5000 -50.0 + 48.7500 176.5000 -50.0 + 45.7500 170.5000 -50.0 + 45.7500 164.5000 -50.0 + 44.7500 162.5000 -50.0 + 45.5000 161.7500 -50.0 + 44.7500 160.5000 -50.0 + 44.7500 147.5000 -50.0 + 46.7500 141.5000 -50.0 + 47.5000 139.7500 -50.0 + 47.7500 127.5000 -50.0 + 46.7500 125.5000 -50.0 + 47.7500 124.5000 -50.0 + 49.7500 115.5000 -50.0 + 57.7500 99.5000 -50.0 + 58.5000 97.7500 -50.0 + 58.7500 93.5000 -50.0 + 60.7500 91.5000 -50.0 + 63.5000 87.7500 -50.0 + 63.7500 84.5000 -50.0 + 67.5000 81.7500 -50.0 + 69.5000 80.7500 -50.0 + 69.7500 79.5000 -50.0 + 71.5000 77.7500 -50.0 + 73.5000 76.7500 -50.0 + 79.5000 69.7500 -50.0 + 82.5000 69.7500 -50.0 + 84.5000 68.7500 -50.0 + 98.5000 68.7500 -50.0 + 100.2500 70.5000 -50.0 + 102.5000 70.7500 -50.0 + 102.7500 69.5000 -50.0 + 104.5000 68.7500 -50.0 + 106.5000 69.7500 -50.0 + 108.5000 68.7500 -50.0 + 39.7500 179.5000 -50.0 + 40.5000 178.7500 -50.0 + 41.2500 179.5000 -50.0 + 40.5000 180.2500 -50.0 + 100.2500 59.5000 -52.0 + 99.5000 60.2500 -52.0 + 94.5000 60.2500 -52.0 + 92.5000 61.2500 -52.0 + 90.5000 61.2500 -52.0 + 88.5000 62.2500 -52.0 + 86.5000 62.2500 -52.0 + 84.5000 63.2500 -52.0 + 82.2500 63.5000 -52.0 + 73.5000 67.2500 -52.0 + 65.5000 72.2500 -52.0 + 63.5000 73.2500 -52.0 + 58.5000 78.2500 -52.0 + 55.2500 82.5000 -52.0 + 52.2500 88.5000 -52.0 + 51.5000 90.2500 -52.0 + 48.2500 99.5000 -52.0 + 47.5000 101.2500 -52.0 + 45.2500 107.5000 -52.0 + 43.2500 116.5000 -52.0 + 41.2500 126.5000 -52.0 + 40.2500 128.5000 -52.0 + 39.2500 133.5000 -52.0 + 38.2500 136.5000 -52.0 + 36.2500 145.5000 -52.0 + 35.2500 150.5000 -52.0 + 34.5000 152.2500 -52.0 + 34.2500 156.5000 -52.0 + 33.5000 158.2500 -52.0 + 33.2500 169.5000 -52.0 + 34.2500 171.5000 -52.0 + 34.2500 175.5000 -52.0 + 35.2500 177.5000 -52.0 + 35.2500 180.5000 -52.0 + 37.2500 184.5000 -52.0 + 37.2500 186.5000 -52.0 + 41.2500 194.5000 -52.0 + 44.2500 199.5000 -52.0 + 45.2500 201.5000 -52.0 + 59.5000 215.7500 -52.0 + 68.2500 220.5000 -52.0 + 70.5000 220.7500 -52.0 + 72.2500 221.5000 -52.0 + 76.5000 221.7500 -52.0 + 78.2500 222.5000 -52.0 + 88.5000 222.7500 -52.0 + 90.2500 223.5000 -52.0 + 120.5000 223.7500 -52.0 + 122.5000 222.7500 -52.0 + 127.5000 222.7500 -52.0 + 133.7500 220.5000 -52.0 + 142.5000 216.7500 -52.0 + 147.5000 212.7500 -52.0 + 149.5000 211.7500 -52.0 + 160.5000 200.7500 -52.0 + 164.7500 194.5000 -52.0 + 170.7500 182.5000 -52.0 + 172.7500 173.5000 -52.0 + 173.5000 171.7500 -52.0 + 173.7500 153.5000 -52.0 + 172.7500 151.5000 -52.0 + 172.7500 144.5000 -52.0 + 171.7500 142.5000 -52.0 + 171.7500 137.5000 -52.0 + 170.7500 135.5000 -52.0 + 170.7500 132.5000 -52.0 + 169.7500 130.5000 -52.0 + 169.7500 126.5000 -52.0 + 168.7500 124.5000 -52.0 + 168.7500 120.5000 -52.0 + 167.7500 118.5000 -52.0 + 167.7500 116.5000 -52.0 + 166.7500 114.5000 -52.0 + 166.7500 112.5000 -52.0 + 165.7500 110.5000 -52.0 + 165.7500 108.5000 -52.0 + 164.7500 106.5000 -52.0 + 164.7500 104.5000 -52.0 + 161.7500 98.5000 -52.0 + 161.5000 96.2500 -52.0 + 158.5000 89.2500 -52.0 + 155.7500 82.5000 -52.0 + 150.5000 76.2500 -52.0 + 146.7500 73.5000 -52.0 + 140.5000 69.2500 -52.0 + 131.7500 64.5000 -52.0 + 125.5000 62.2500 -52.0 + 123.7500 61.5000 -52.0 + 115.5000 60.2500 -52.0 + 113.7500 59.5000 -52.0 + 108.5000 60.7500 -52.0 + 111.5000 60.7500 -52.0 + 113.2500 62.5000 -52.0 + 111.5000 64.2500 -52.0 + 108.5000 64.2500 -52.0 + 106.7500 62.5000 -52.0 + 119.7500 66.5000 -52.0 + 120.5000 65.7500 -52.0 + 123.5000 66.7500 -52.0 + 129.2500 69.5000 -52.0 + 131.5000 69.7500 -52.0 + 135.2500 72.5000 -52.0 + 137.5000 72.7500 -52.0 + 143.2500 78.5000 -52.0 + 143.2500 80.5000 -52.0 + 148.2500 85.5000 -52.0 + 148.2500 87.5000 -52.0 + 151.2500 91.5000 -52.0 + 151.2500 93.5000 -52.0 + 152.2500 95.5000 -52.0 + 152.2500 98.5000 -52.0 + 154.2500 102.5000 -52.0 + 154.2500 104.5000 -52.0 + 159.2500 110.5000 -52.0 + 159.2500 112.5000 -52.0 + 162.2500 118.5000 -52.0 + 162.2500 120.5000 -52.0 + 163.2500 123.5000 -52.0 + 162.2500 125.5000 -52.0 + 161.2500 132.5000 -52.0 + 162.2500 134.5000 -52.0 + 162.2500 138.5000 -52.0 + 163.2500 140.5000 -52.0 + 163.2500 142.5000 -52.0 + 164.2500 144.5000 -52.0 + 164.2500 147.5000 -52.0 + 165.2500 149.5000 -52.0 + 164.5000 150.2500 -52.0 + 164.2500 153.5000 -52.0 + 165.2500 155.5000 -52.0 + 165.2500 169.5000 -52.0 + 163.2500 178.5000 -52.0 + 159.2500 186.5000 -52.0 + 145.2500 199.5000 -52.0 + 138.5000 204.2500 -52.0 + 130.5000 210.2500 -52.0 + 124.5000 213.2500 -52.0 + 122.5000 213.2500 -52.0 + 118.5000 215.2500 -52.0 + 108.5000 215.2500 -52.0 + 101.5000 214.2500 -52.0 + 98.5000 215.2500 -52.0 + 96.7500 213.5000 -52.0 + 84.5000 213.2500 -52.0 + 79.5000 212.2500 -52.0 + 70.5000 208.2500 -52.0 + 65.7500 203.5000 -52.0 + 56.7500 193.5000 -52.0 + 55.7500 191.5000 -52.0 + 53.7500 190.5000 -52.0 + 52.7500 188.5000 -52.0 + 51.5000 188.2500 -52.0 + 48.7500 185.5000 -52.0 + 48.7500 182.5000 -52.0 + 47.7500 180.5000 -52.0 + 47.7500 178.5000 -52.0 + 45.7500 174.5000 -52.0 + 45.7500 172.5000 -52.0 + 43.7500 168.5000 -52.0 + 43.7500 155.5000 -52.0 + 42.7500 153.5000 -52.0 + 42.7500 148.5000 -52.0 + 44.7500 142.5000 -52.0 + 46.5000 138.7500 -52.0 + 46.7500 124.5000 -52.0 + 47.7500 119.5000 -52.0 + 49.7500 113.5000 -52.0 + 53.7500 104.5000 -52.0 + 56.5000 100.7500 -52.0 + 57.7500 94.5000 -52.0 + 58.7500 92.5000 -52.0 + 61.5000 88.7500 -52.0 + 61.7500 86.5000 -52.0 + 62.7500 83.5000 -52.0 + 67.7500 80.5000 -52.0 + 69.7500 76.5000 -52.0 + 71.5000 75.7500 -52.0 + 78.5000 69.7500 -52.0 + 80.5000 69.7500 -52.0 + 84.5000 67.7500 -52.0 + 89.5000 67.7500 -52.0 + 92.5000 68.7500 -52.0 + 94.5000 67.7500 -52.0 + 99.5000 67.7500 -52.0 + 100.2500 69.5000 -52.0 + 102.5000 69.7500 -52.0 + 104.5000 67.7500 -52.0 + 105.5000 68.7500 -52.0 + 109.5000 66.7500 -52.0 + 110.2500 67.5000 -52.0 + 116.5000 67.7500 -52.0 + 37.7500 179.5000 -52.0 + 38.5000 178.7500 -52.0 + 40.2500 179.5000 -52.0 + 39.5000 181.2500 -52.0 + 163.7500 187.5000 -52.0 + 164.5000 186.7500 -52.0 + 165.2500 187.5000 -52.0 + 164.5000 188.2500 -52.0 + 98.2500 58.5000 -54.0 + 97.5000 59.2500 -54.0 + 94.5000 59.2500 -54.0 + 92.5000 60.2500 -54.0 + 88.5000 60.2500 -54.0 + 84.5000 62.2500 -54.0 + 82.2500 62.5000 -54.0 + 69.5000 68.2500 -54.0 + 61.5000 74.2500 -54.0 + 59.5000 75.2500 -54.0 + 59.2500 76.5000 -54.0 + 56.2500 79.5000 -54.0 + 52.5000 86.2500 -54.0 + 50.2500 92.5000 -54.0 + 48.5000 96.2500 -54.0 + 48.2500 98.5000 -54.0 + 45.2500 104.5000 -54.0 + 44.2500 109.5000 -54.0 + 40.2500 127.5000 -54.0 + 39.2500 129.5000 -54.0 + 37.2500 138.5000 -54.0 + 36.2500 141.5000 -54.0 + 35.5000 143.2500 -54.0 + 35.2500 147.5000 -54.0 + 34.2500 150.5000 -54.0 + 33.5000 152.2500 -54.0 + 33.2500 156.5000 -54.0 + 32.5000 158.2500 -54.0 + 32.2500 170.5000 -54.0 + 33.2500 172.5000 -54.0 + 33.2500 175.5000 -54.0 + 34.2500 177.5000 -54.0 + 34.2500 179.5000 -54.0 + 37.5000 188.7500 -54.0 + 40.2500 195.5000 -54.0 + 46.2500 203.5000 -54.0 + 47.2500 205.5000 -54.0 + 49.5000 207.7500 -54.0 + 51.5000 208.7500 -54.0 + 52.5000 210.7500 -54.0 + 54.5000 211.7500 -54.0 + 59.5000 216.7500 -54.0 + 68.2500 221.5000 -54.0 + 76.5000 222.7500 -54.0 + 85.5000 223.7500 -54.0 + 92.5000 224.7500 -54.0 + 94.5000 223.7500 -54.0 + 98.5000 223.7500 -54.0 + 100.2500 224.5000 -54.0 + 114.5000 224.7500 -54.0 + 116.5000 223.7500 -54.0 + 125.5000 223.7500 -54.0 + 127.5000 222.7500 -54.0 + 129.5000 222.7500 -54.0 + 131.5000 221.7500 -54.0 + 133.7500 221.5000 -54.0 + 142.5000 217.7500 -54.0 + 147.5000 213.7500 -54.0 + 149.5000 212.7500 -54.0 + 157.5000 204.7500 -54.0 + 163.7500 197.5000 -54.0 + 170.5000 184.7500 -54.0 + 170.7500 182.5000 -54.0 + 172.7500 178.5000 -54.0 + 173.7500 173.5000 -54.0 + 174.5000 171.7500 -54.0 + 174.7500 156.5000 -54.0 + 173.7500 154.5000 -54.0 + 173.7500 147.5000 -54.0 + 172.7500 145.5000 -54.0 + 172.7500 140.5000 -54.0 + 171.7500 138.5000 -54.0 + 171.7500 134.5000 -54.0 + 170.7500 132.5000 -54.0 + 170.7500 129.5000 -54.0 + 169.7500 127.5000 -54.0 + 169.7500 123.5000 -54.0 + 168.7500 121.5000 -54.0 + 168.7500 118.5000 -54.0 + 167.7500 116.5000 -54.0 + 167.7500 113.5000 -54.0 + 165.7500 109.5000 -54.0 + 165.7500 107.5000 -54.0 + 164.7500 105.5000 -54.0 + 164.7500 103.5000 -54.0 + 161.7500 97.5000 -54.0 + 161.5000 95.2500 -54.0 + 157.5000 86.2500 -54.0 + 154.7500 79.5000 -54.0 + 151.7500 76.5000 -54.0 + 145.7500 71.5000 -54.0 + 140.5000 68.2500 -54.0 + 129.7500 62.5000 -54.0 + 127.5000 62.2500 -54.0 + 123.5000 60.2500 -54.0 + 116.5000 59.2500 -54.0 + 114.7500 58.5000 -54.0 + 106.7500 60.5000 -54.0 + 107.5000 59.7500 -54.0 + 111.5000 59.7500 -54.0 + 113.2500 60.5000 -54.0 + 114.2500 62.5000 -54.0 + 112.5000 63.2500 -54.0 + 110.5000 64.2500 -54.0 + 106.5000 64.2500 -54.0 + 105.7500 62.5000 -54.0 + 98.7500 61.5000 -54.0 + 99.5000 60.7500 -54.0 + 101.5000 60.7500 -54.0 + 103.2500 61.5000 -54.0 + 102.5000 63.2500 -54.0 + 99.5000 63.2500 -54.0 + 119.7500 65.5000 -54.0 + 120.5000 64.7500 -54.0 + 122.5000 64.7500 -54.0 + 125.5000 65.7500 -54.0 + 129.2500 68.5000 -54.0 + 134.2500 71.5000 -54.0 + 137.5000 71.7500 -54.0 + 141.2500 74.5000 -54.0 + 144.2500 78.5000 -54.0 + 144.2500 80.5000 -54.0 + 149.2500 85.5000 -54.0 + 149.2500 87.5000 -54.0 + 153.2500 95.5000 -54.0 + 153.2500 98.5000 -54.0 + 155.2500 103.5000 -54.0 + 160.2500 109.5000 -54.0 + 160.2500 111.5000 -54.0 + 163.2500 117.5000 -54.0 + 163.2500 123.5000 -54.0 + 162.5000 125.2500 -54.0 + 162.2500 135.5000 -54.0 + 163.2500 137.5000 -54.0 + 163.2500 139.5000 -54.0 + 164.2500 141.5000 -54.0 + 164.2500 143.5000 -54.0 + 165.2500 145.5000 -54.0 + 165.2500 156.5000 -54.0 + 166.2500 158.5000 -54.0 + 166.2500 171.5000 -54.0 + 165.2500 174.5000 -54.0 + 164.5000 176.2500 -54.0 + 164.2500 179.5000 -54.0 + 163.2500 182.5000 -54.0 + 159.2500 187.5000 -54.0 + 158.2500 189.5000 -54.0 + 148.5000 198.2500 -54.0 + 144.5000 201.2500 -54.0 + 130.5000 211.2500 -54.0 + 125.5000 214.2500 -54.0 + 122.5000 214.2500 -54.0 + 120.5000 215.2500 -54.0 + 118.5000 215.2500 -54.0 + 114.5000 217.2500 -54.0 + 111.5000 217.2500 -54.0 + 108.5000 216.2500 -54.0 + 106.7500 215.5000 -54.0 + 99.5000 215.2500 -54.0 + 97.7500 214.5000 -54.0 + 92.5000 214.2500 -54.0 + 90.5000 215.2500 -54.0 + 83.5000 214.2500 -54.0 + 74.5000 212.2500 -54.0 + 67.5000 206.2500 -54.0 + 65.5000 205.2500 -54.0 + 50.7500 189.5000 -54.0 + 49.7500 187.5000 -54.0 + 48.5000 187.2500 -54.0 + 47.7500 185.5000 -54.0 + 46.7500 183.5000 -54.0 + 46.7500 181.5000 -54.0 + 45.7500 179.5000 -54.0 + 45.7500 177.5000 -54.0 + 42.7500 171.5000 -54.0 + 42.7500 163.5000 -54.0 + 41.7500 161.5000 -54.0 + 41.7500 146.5000 -54.0 + 45.5000 138.7500 -54.0 + 45.7500 136.5000 -54.0 + 46.7500 131.5000 -54.0 + 45.7500 129.5000 -54.0 + 45.7500 123.5000 -54.0 + 46.7500 121.5000 -54.0 + 47.7500 116.5000 -54.0 + 49.5000 112.7500 -54.0 + 49.7500 110.5000 -54.0 + 52.7500 104.5000 -54.0 + 56.5000 97.7500 -54.0 + 56.7500 95.5000 -54.0 + 59.5000 89.7500 -54.0 + 59.7500 85.5000 -54.0 + 63.5000 81.7500 -54.0 + 65.5000 80.7500 -54.0 + 69.5000 75.7500 -54.0 + 73.5000 73.7500 -54.0 + 76.5000 70.7500 -54.0 + 83.5000 66.7500 -54.0 + 92.5000 66.7500 -54.0 + 94.5000 65.7500 -54.0 + 99.5000 66.7500 -54.0 + 101.5000 68.7500 -54.0 + 103.5000 67.7500 -54.0 + 105.5000 67.7500 -54.0 + 109.5000 65.7500 -54.0 + 110.2500 66.5000 -54.0 + 116.5000 66.7500 -54.0 + 37.7500 180.5000 -54.0 + 38.5000 179.7500 -54.0 + 39.2500 180.5000 -54.0 + 38.5000 181.2500 -54.0 + 97.2500 57.5000 -56.0 + 96.5000 58.2500 -56.0 + 92.5000 58.2500 -56.0 + 90.5000 59.2500 -56.0 + 88.5000 59.2500 -56.0 + 84.5000 61.2500 -56.0 + 82.5000 61.2500 -56.0 + 68.5000 68.2500 -56.0 + 66.2500 69.5000 -56.0 + 59.5000 74.2500 -56.0 + 56.2500 78.5000 -56.0 + 52.2500 86.5000 -56.0 + 49.5000 92.2500 -56.0 + 49.2500 94.5000 -56.0 + 45.2500 102.5000 -56.0 + 43.2500 112.5000 -56.0 + 42.2500 115.5000 -56.0 + 40.2500 124.5000 -56.0 + 39.2500 126.5000 -56.0 + 38.2500 133.5000 -56.0 + 36.2500 137.5000 -56.0 + 34.2500 147.5000 -56.0 + 33.2500 149.5000 -56.0 + 32.2500 158.5000 -56.0 + 31.5000 160.2500 -56.0 + 31.2500 171.5000 -56.0 + 32.2500 173.5000 -56.0 + 32.2500 175.5000 -56.0 + 33.2500 177.5000 -56.0 + 33.2500 179.5000 -56.0 + 36.5000 188.7500 -56.0 + 39.2500 195.5000 -56.0 + 45.2500 203.5000 -56.0 + 46.2500 205.5000 -56.0 + 59.2500 217.5000 -56.0 + 66.2500 221.5000 -56.0 + 72.5000 222.7500 -56.0 + 74.2500 223.5000 -56.0 + 82.5000 223.7500 -56.0 + 84.2500 224.5000 -56.0 + 101.5000 224.7500 -56.0 + 103.2500 225.5000 -56.0 + 111.5000 225.7500 -56.0 + 113.5000 224.7500 -56.0 + 122.5000 224.7500 -56.0 + 124.5000 223.7500 -56.0 + 128.5000 223.7500 -56.0 + 130.5000 222.7500 -56.0 + 132.7500 222.5000 -56.0 + 139.5000 219.7500 -56.0 + 147.5000 214.7500 -56.0 + 149.5000 213.7500 -56.0 + 158.5000 204.7500 -56.0 + 163.5000 198.7500 -56.0 + 166.7500 193.5000 -56.0 + 168.7500 189.5000 -56.0 + 170.5000 185.7500 -56.0 + 173.7500 176.5000 -56.0 + 174.5000 174.7500 -56.0 + 174.7500 152.5000 -56.0 + 173.7500 150.5000 -56.0 + 173.7500 144.5000 -56.0 + 172.7500 142.5000 -56.0 + 172.7500 138.5000 -56.0 + 171.7500 136.5000 -56.0 + 171.7500 132.5000 -56.0 + 170.7500 130.5000 -56.0 + 170.7500 127.5000 -56.0 + 169.7500 125.5000 -56.0 + 169.7500 122.5000 -56.0 + 168.7500 120.5000 -56.0 + 168.7500 117.5000 -56.0 + 167.7500 115.5000 -56.0 + 167.7500 112.5000 -56.0 + 165.7500 108.5000 -56.0 + 165.7500 106.5000 -56.0 + 164.7500 104.5000 -56.0 + 164.7500 102.5000 -56.0 + 160.7500 94.5000 -56.0 + 160.7500 92.5000 -56.0 + 154.7500 80.5000 -56.0 + 154.7500 78.5000 -56.0 + 148.7500 72.5000 -56.0 + 140.5000 67.2500 -56.0 + 124.5000 59.2500 -56.0 + 117.5000 58.2500 -56.0 + 115.7500 57.5000 -56.0 + 99.7500 59.5000 -56.0 + 101.5000 58.7500 -56.0 + 103.2500 59.5000 -56.0 + 104.2500 61.5000 -56.0 + 103.5000 63.2500 -56.0 + 97.5000 63.2500 -56.0 + 95.7500 61.5000 -56.0 + 97.5000 59.7500 -56.0 + 105.7500 59.5000 -56.0 + 106.5000 58.7500 -56.0 + 111.5000 58.7500 -56.0 + 113.2500 59.5000 -56.0 + 114.2500 61.5000 -56.0 + 111.5000 63.2500 -56.0 + 109.5000 63.2500 -56.0 + 107.5000 64.2500 -56.0 + 105.5000 63.2500 -56.0 + 104.7500 61.5000 -56.0 + 114.7500 60.5000 -56.0 + 115.5000 59.7500 -56.0 + 117.5000 59.7500 -56.0 + 119.2500 61.5000 -56.0 + 116.5000 63.2500 -56.0 + 115.7500 62.5000 -56.0 + 119.7500 64.5000 -56.0 + 120.5000 63.7500 -56.0 + 122.5000 63.7500 -56.0 + 127.5000 65.7500 -56.0 + 130.2500 68.5000 -56.0 + 135.2500 71.5000 -56.0 + 139.5000 71.7500 -56.0 + 144.2500 76.5000 -56.0 + 144.2500 78.5000 -56.0 + 146.5000 81.7500 -56.0 + 148.5000 82.7500 -56.0 + 150.2500 85.5000 -56.0 + 150.2500 89.5000 -56.0 + 153.2500 95.5000 -56.0 + 153.2500 97.5000 -56.0 + 155.2500 101.5000 -56.0 + 161.2500 109.5000 -56.0 + 161.2500 111.5000 -56.0 + 163.2500 115.5000 -56.0 + 163.2500 118.5000 -56.0 + 164.2500 120.5000 -56.0 + 162.5000 124.2500 -56.0 + 162.2500 133.5000 -56.0 + 163.2500 135.5000 -56.0 + 163.2500 139.5000 -56.0 + 165.2500 143.5000 -56.0 + 165.2500 147.5000 -56.0 + 166.2500 149.5000 -56.0 + 166.2500 159.5000 -56.0 + 167.2500 161.5000 -56.0 + 167.2500 169.5000 -56.0 + 166.5000 171.2500 -56.0 + 165.2500 179.5000 -56.0 + 163.5000 183.2500 -56.0 + 159.5000 189.2500 -56.0 + 146.2500 201.5000 -56.0 + 139.5000 206.2500 -56.0 + 137.2500 207.5000 -56.0 + 130.5000 212.2500 -56.0 + 124.5000 215.2500 -56.0 + 121.5000 215.2500 -56.0 + 119.5000 216.2500 -56.0 + 117.5000 216.2500 -56.0 + 113.5000 218.2500 -56.0 + 110.5000 218.2500 -56.0 + 107.5000 217.2500 -56.0 + 105.7500 216.5000 -56.0 + 100.5000 216.2500 -56.0 + 98.7500 215.5000 -56.0 + 92.5000 215.2500 -56.0 + 90.5000 216.2500 -56.0 + 88.5000 216.2500 -56.0 + 86.5000 215.2500 -56.0 + 77.5000 214.2500 -56.0 + 74.5000 213.2500 -56.0 + 70.5000 210.2500 -56.0 + 68.5000 209.2500 -56.0 + 45.7500 185.5000 -56.0 + 45.7500 182.5000 -56.0 + 43.7500 178.5000 -56.0 + 43.7500 176.5000 -56.0 + 40.7500 170.5000 -56.0 + 41.7500 168.5000 -56.0 + 40.7500 166.5000 -56.0 + 40.7500 147.5000 -56.0 + 41.7500 144.5000 -56.0 + 44.5000 138.7500 -56.0 + 44.7500 136.5000 -56.0 + 45.5000 134.7500 -56.0 + 45.7500 126.5000 -56.0 + 44.7500 124.5000 -56.0 + 45.7500 119.5000 -56.0 + 47.7500 115.5000 -56.0 + 48.7500 110.5000 -56.0 + 51.5000 104.7500 -56.0 + 55.5000 97.7500 -56.0 + 55.7500 95.5000 -56.0 + 57.5000 91.7500 -56.0 + 57.7500 88.5000 -56.0 + 58.7500 85.5000 -56.0 + 63.5000 80.7500 -56.0 + 65.5000 79.7500 -56.0 + 66.7500 77.5000 -56.0 + 67.7500 75.5000 -56.0 + 72.5000 73.7500 -56.0 + 72.7500 72.5000 -56.0 + 74.5000 71.7500 -56.0 + 80.5000 67.7500 -56.0 + 84.5000 65.7500 -56.0 + 87.5000 65.7500 -56.0 + 90.5000 64.7500 -56.0 + 99.5000 65.7500 -56.0 + 101.2500 66.5000 -56.0 + 106.5000 66.7500 -56.0 + 108.5000 65.7500 -56.0 + 115.5000 65.7500 -56.0 + 117.5000 64.7500 -56.0 + 69.7500 70.5000 -56.0 + 70.5000 69.7500 -56.0 + 71.2500 70.5000 -56.0 + 70.5000 71.2500 -56.0 + 104.2500 55.5000 -58.0 + 103.5000 56.2500 -58.0 + 96.5000 56.2500 -58.0 + 94.5000 57.2500 -58.0 + 90.5000 57.2500 -58.0 + 86.5000 59.2500 -58.0 + 84.5000 59.2500 -58.0 + 64.5000 69.2500 -58.0 + 58.2500 74.5000 -58.0 + 49.5000 91.2500 -58.0 + 49.2500 93.5000 -58.0 + 44.2500 103.5000 -58.0 + 43.2500 110.5000 -58.0 + 42.5000 112.2500 -58.0 + 41.2500 120.5000 -58.0 + 39.2500 124.5000 -58.0 + 38.2500 131.5000 -58.0 + 36.2500 135.5000 -58.0 + 34.2500 144.5000 -58.0 + 33.2500 146.5000 -58.0 + 32.2500 153.5000 -58.0 + 31.5000 155.2500 -58.0 + 31.2500 160.5000 -58.0 + 30.5000 162.2500 -58.0 + 30.2500 170.5000 -58.0 + 31.2500 172.5000 -58.0 + 31.2500 176.5000 -58.0 + 33.2500 180.5000 -58.0 + 33.2500 183.5000 -58.0 + 42.2500 201.5000 -58.0 + 47.2500 207.5000 -58.0 + 56.2500 215.5000 -58.0 + 60.5000 218.7500 -58.0 + 67.2500 222.5000 -58.0 + 69.5000 222.7500 -58.0 + 71.2500 223.5000 -58.0 + 78.5000 223.7500 -58.0 + 80.2500 224.5000 -58.0 + 85.5000 224.7500 -58.0 + 87.2500 225.5000 -58.0 + 93.5000 225.7500 -58.0 + 95.5000 224.7500 -58.0 + 97.2500 225.5000 -58.0 + 118.5000 225.7500 -58.0 + 120.5000 224.7500 -58.0 + 127.5000 224.7500 -58.0 + 129.5000 223.7500 -58.0 + 131.7500 223.5000 -58.0 + 144.5000 217.7500 -58.0 + 148.5000 214.7500 -58.0 + 150.5000 213.7500 -58.0 + 158.5000 205.7500 -58.0 + 163.5000 199.7500 -58.0 + 167.7500 192.5000 -58.0 + 172.7500 182.5000 -58.0 + 173.7500 177.5000 -58.0 + 174.5000 175.7500 -58.0 + 174.7500 170.5000 -58.0 + 175.5000 168.7500 -58.0 + 175.7500 159.5000 -58.0 + 174.7500 157.5000 -58.0 + 174.7500 149.5000 -58.0 + 173.7500 147.5000 -58.0 + 173.7500 140.5000 -58.0 + 172.7500 138.5000 -58.0 + 172.7500 136.5000 -58.0 + 171.7500 134.5000 -58.0 + 171.7500 130.5000 -58.0 + 170.7500 128.5000 -58.0 + 170.7500 126.5000 -58.0 + 169.7500 124.5000 -58.0 + 169.7500 121.5000 -58.0 + 168.7500 119.5000 -58.0 + 168.7500 116.5000 -58.0 + 167.7500 114.5000 -58.0 + 167.7500 112.5000 -58.0 + 166.7500 110.5000 -58.0 + 166.7500 108.5000 -58.0 + 164.7500 104.5000 -58.0 + 164.7500 102.5000 -58.0 + 162.7500 98.5000 -58.0 + 162.7500 96.5000 -58.0 + 158.7500 88.5000 -58.0 + 158.7500 86.5000 -58.0 + 155.7500 82.5000 -58.0 + 153.7500 76.5000 -58.0 + 148.7500 71.5000 -58.0 + 140.5000 66.2500 -58.0 + 131.5000 61.2500 -58.0 + 125.5000 58.2500 -58.0 + 120.5000 57.2500 -58.0 + 118.7500 56.5000 -58.0 + 111.5000 56.2500 -58.0 + 109.7500 55.5000 -58.0 + 99.7500 58.5000 -58.0 + 100.5000 57.7500 -58.0 + 102.5000 57.7500 -58.0 + 104.5000 58.7500 -58.0 + 106.5000 57.7500 -58.0 + 112.5000 57.7500 -58.0 + 121.5000 59.7500 -58.0 + 123.2500 61.5000 -58.0 + 121.5000 63.2500 -58.0 + 117.5000 63.2500 -58.0 + 113.5000 61.2500 -58.0 + 109.5000 63.2500 -58.0 + 107.5000 63.2500 -58.0 + 105.5000 62.2500 -58.0 + 103.5000 63.2500 -58.0 + 94.5000 63.2500 -58.0 + 90.7500 61.5000 -58.0 + 94.5000 58.7500 -58.0 + 118.7500 64.5000 -58.0 + 119.5000 63.7500 -58.0 + 123.5000 63.7500 -58.0 + 128.5000 65.7500 -58.0 + 132.5000 69.7500 -58.0 + 134.5000 70.7500 -58.0 + 136.2500 71.5000 -58.0 + 140.5000 71.7500 -58.0 + 142.2500 73.5000 -58.0 + 146.5000 80.7500 -58.0 + 148.5000 81.7500 -58.0 + 151.2500 86.5000 -58.0 + 151.2500 90.5000 -58.0 + 152.2500 92.5000 -58.0 + 154.5000 98.7500 -58.0 + 162.2500 108.5000 -58.0 + 162.2500 110.5000 -58.0 + 163.2500 112.5000 -58.0 + 163.2500 116.5000 -58.0 + 164.2500 118.5000 -58.0 + 163.2500 123.5000 -58.0 + 162.5000 125.2500 -58.0 + 163.2500 126.5000 -58.0 + 163.2500 137.5000 -58.0 + 165.2500 141.5000 -58.0 + 165.2500 143.5000 -58.0 + 166.2500 145.5000 -58.0 + 166.2500 150.5000 -58.0 + 167.2500 152.5000 -58.0 + 167.2500 172.5000 -58.0 + 166.5000 174.2500 -58.0 + 166.2500 179.5000 -58.0 + 164.5000 183.2500 -58.0 + 160.2500 189.5000 -58.0 + 159.2500 191.5000 -58.0 + 157.5000 192.2500 -58.0 + 151.5000 198.2500 -58.0 + 144.5000 204.2500 -58.0 + 140.5000 206.2500 -58.0 + 135.5000 210.2500 -58.0 + 123.5000 216.2500 -58.0 + 121.5000 216.2500 -58.0 + 119.5000 217.2500 -58.0 + 117.5000 217.2500 -58.0 + 115.5000 218.2500 -58.0 + 108.5000 218.2500 -58.0 + 106.7500 217.5000 -58.0 + 101.5000 217.2500 -58.0 + 95.5000 215.2500 -58.0 + 91.5000 217.2500 -58.0 + 87.5000 217.2500 -58.0 + 82.5000 216.2500 -58.0 + 80.7500 215.5000 -58.0 + 76.5000 215.2500 -58.0 + 70.5000 212.2500 -58.0 + 55.7500 198.5000 -58.0 + 54.7500 196.5000 -58.0 + 43.7500 184.5000 -58.0 + 43.7500 182.5000 -58.0 + 42.7500 180.5000 -58.0 + 42.7500 177.5000 -58.0 + 39.7500 171.5000 -58.0 + 39.7500 149.5000 -58.0 + 40.7500 142.5000 -58.0 + 43.7500 136.5000 -58.0 + 44.7500 131.5000 -58.0 + 45.5000 129.7500 -58.0 + 45.7500 125.5000 -58.0 + 44.7500 123.5000 -58.0 + 45.7500 116.5000 -58.0 + 46.7500 113.5000 -58.0 + 51.5000 102.7500 -58.0 + 55.5000 95.7500 -58.0 + 55.7500 93.5000 -58.0 + 56.7500 88.5000 -58.0 + 57.7500 85.5000 -58.0 + 62.5000 80.7500 -58.0 + 64.7500 79.5000 -58.0 + 66.7500 75.5000 -58.0 + 72.5000 71.7500 -58.0 + 86.5000 64.7500 -58.0 + 99.5000 64.7500 -58.0 + 105.5000 66.7500 -58.0 + 109.5000 64.7500 -58.0 + 68.5000 69.7500 -58.0 + 70.2500 70.5000 -58.0 + 68.5000 72.2500 -58.0 + 66.7500 71.5000 -58.0 + 34.7500 175.5000 -58.0 + 35.5000 174.7500 -58.0 + 36.2500 176.5000 -58.0 + 35.5000 178.2500 -58.0 + 34.7500 177.5000 -58.0 + 169.7500 177.5000 -58.0 + 170.5000 176.7500 -58.0 + 171.2500 177.5000 -58.0 + 170.5000 178.2500 -58.0 + 100.2500 54.5000 -60.0 + 99.5000 55.2500 -60.0 + 93.5000 55.2500 -60.0 + 91.5000 56.2500 -60.0 + 88.5000 56.2500 -60.0 + 62.5000 69.2500 -60.0 + 59.5000 72.2500 -60.0 + 56.2500 77.5000 -60.0 + 49.2500 91.5000 -60.0 + 46.2500 98.5000 -60.0 + 44.5000 102.2500 -60.0 + 41.2500 118.5000 -60.0 + 40.2500 120.5000 -60.0 + 39.2500 125.5000 -60.0 + 37.2500 131.5000 -60.0 + 36.5000 133.2500 -60.0 + 36.2500 136.5000 -60.0 + 34.2500 140.5000 -60.0 + 32.2500 150.5000 -60.0 + 31.5000 152.2500 -60.0 + 31.2500 156.5000 -60.0 + 30.5000 158.2500 -60.0 + 30.2500 174.5000 -60.0 + 31.2500 176.5000 -60.0 + 31.2500 179.5000 -60.0 + 33.2500 183.5000 -60.0 + 33.2500 185.5000 -60.0 + 41.2500 201.5000 -60.0 + 47.2500 208.5000 -60.0 + 54.5000 214.7500 -60.0 + 58.2500 217.5000 -60.0 + 62.5000 220.7500 -60.0 + 66.5000 222.7500 -60.0 + 71.5000 223.7500 -60.0 + 73.2500 224.5000 -60.0 + 82.5000 224.7500 -60.0 + 84.2500 225.5000 -60.0 + 101.5000 225.7500 -60.0 + 103.2500 226.5000 -60.0 + 109.5000 226.7500 -60.0 + 111.5000 225.7500 -60.0 + 123.5000 225.7500 -60.0 + 125.5000 224.7500 -60.0 + 130.5000 224.7500 -60.0 + 148.5000 215.7500 -60.0 + 156.5000 208.7500 -60.0 + 162.7500 201.5000 -60.0 + 167.7500 193.5000 -60.0 + 170.7500 187.5000 -60.0 + 171.5000 185.7500 -60.0 + 173.7500 179.5000 -60.0 + 174.5000 177.7500 -60.0 + 174.7500 173.5000 -60.0 + 175.5000 171.7500 -60.0 + 175.7500 154.5000 -60.0 + 174.7500 152.5000 -60.0 + 174.7500 145.5000 -60.0 + 173.7500 143.5000 -60.0 + 173.7500 139.5000 -60.0 + 172.7500 137.5000 -60.0 + 172.7500 134.5000 -60.0 + 171.7500 132.5000 -60.0 + 171.7500 129.5000 -60.0 + 170.7500 127.5000 -60.0 + 170.7500 125.5000 -60.0 + 169.7500 123.5000 -60.0 + 169.7500 120.5000 -60.0 + 168.7500 118.5000 -60.0 + 168.7500 116.5000 -60.0 + 167.7500 114.5000 -60.0 + 167.7500 112.5000 -60.0 + 160.7500 91.5000 -60.0 + 152.7500 74.5000 -60.0 + 148.7500 70.5000 -60.0 + 135.5000 62.2500 -60.0 + 124.5000 56.2500 -60.0 + 117.5000 55.2500 -60.0 + 115.7500 54.5000 -60.0 + 97.7500 57.5000 -60.0 + 98.5000 56.7500 -60.0 + 103.5000 56.7500 -60.0 + 105.2500 58.5000 -60.0 + 107.5000 56.7500 -60.0 + 115.5000 56.7500 -60.0 + 117.5000 57.7500 -60.0 + 122.5000 58.7500 -60.0 + 126.2500 61.5000 -60.0 + 124.5000 63.2500 -60.0 + 120.5000 63.2500 -60.0 + 117.5000 62.2500 -60.0 + 115.7500 61.5000 -60.0 + 112.5000 61.2500 -60.0 + 107.5000 63.2500 -60.0 + 105.5000 62.2500 -60.0 + 103.5000 63.2500 -60.0 + 99.5000 63.2500 -60.0 + 96.5000 62.2500 -60.0 + 94.5000 63.2500 -60.0 + 88.5000 63.2500 -60.0 + 84.5000 65.2500 -60.0 + 82.5000 65.2500 -60.0 + 81.7500 63.5000 -60.0 + 85.5000 60.7500 -60.0 + 87.5000 60.7500 -60.0 + 93.5000 57.7500 -60.0 + 96.7500 64.5000 -60.0 + 97.5000 63.7500 -60.0 + 99.2500 64.5000 -60.0 + 101.5000 64.7500 -60.0 + 103.2500 65.5000 -60.0 + 107.5000 65.7500 -60.0 + 111.5000 63.7500 -60.0 + 113.2500 64.5000 -60.0 + 121.5000 64.7500 -60.0 + 123.5000 63.7500 -60.0 + 126.5000 64.7500 -60.0 + 132.2500 67.5000 -60.0 + 133.2500 69.5000 -60.0 + 134.5000 69.7500 -60.0 + 136.2500 71.5000 -60.0 + 138.5000 71.7500 -60.0 + 142.2500 73.5000 -60.0 + 144.2500 77.5000 -60.0 + 148.2500 81.5000 -60.0 + 151.2500 85.5000 -60.0 + 151.2500 87.5000 -60.0 + 152.2500 89.5000 -60.0 + 152.2500 91.5000 -60.0 + 154.2500 97.5000 -60.0 + 158.2500 101.5000 -60.0 + 163.2500 109.5000 -60.0 + 163.2500 114.5000 -60.0 + 164.2500 116.5000 -60.0 + 164.2500 118.5000 -60.0 + 163.5000 120.2500 -60.0 + 163.2500 134.5000 -60.0 + 164.2500 136.5000 -60.0 + 164.2500 138.5000 -60.0 + 165.2500 140.5000 -60.0 + 165.2500 142.5000 -60.0 + 166.2500 144.5000 -60.0 + 166.2500 146.5000 -60.0 + 167.2500 148.5000 -60.0 + 167.2500 162.5000 -60.0 + 168.2500 164.5000 -60.0 + 167.5000 166.2500 -60.0 + 167.2500 173.5000 -60.0 + 166.2500 180.5000 -60.0 + 163.2500 186.5000 -60.0 + 152.5000 199.2500 -60.0 + 150.5000 200.2500 -60.0 + 148.2500 202.5000 -60.0 + 141.5000 207.2500 -60.0 + 133.5000 212.2500 -60.0 + 123.5000 217.2500 -60.0 + 120.5000 217.2500 -60.0 + 118.5000 218.2500 -60.0 + 114.5000 218.2500 -60.0 + 112.5000 219.2500 -60.0 + 103.5000 218.2500 -60.0 + 98.5000 217.2500 -60.0 + 96.7500 216.5000 -60.0 + 95.5000 217.2500 -60.0 + 79.5000 217.2500 -60.0 + 69.5000 212.2500 -60.0 + 55.7500 199.5000 -60.0 + 46.7500 189.5000 -60.0 + 44.7500 185.5000 -60.0 + 41.7500 182.5000 -60.0 + 41.7500 180.5000 -60.0 + 40.7500 178.5000 -60.0 + 40.7500 176.5000 -60.0 + 38.7500 172.5000 -60.0 + 38.7500 154.5000 -60.0 + 39.5000 152.7500 -60.0 + 38.7500 151.5000 -60.0 + 39.5000 149.7500 -60.0 + 39.7500 143.5000 -60.0 + 41.7500 139.5000 -60.0 + 42.7500 134.5000 -60.0 + 44.7500 130.5000 -60.0 + 45.7500 125.5000 -60.0 + 43.7500 121.5000 -60.0 + 44.7500 120.5000 -60.0 + 45.7500 113.5000 -60.0 + 48.7500 107.5000 -60.0 + 49.7500 102.5000 -60.0 + 50.5000 100.7500 -60.0 + 53.7500 96.5000 -60.0 + 54.7500 94.5000 -60.0 + 55.5000 92.7500 -60.0 + 55.7500 89.5000 -60.0 + 57.7500 84.5000 -60.0 + 61.5000 80.7500 -60.0 + 63.7500 79.5000 -60.0 + 64.7500 77.5000 -60.0 + 70.5000 71.7500 -60.0 + 78.5000 67.7500 -60.0 + 82.5000 67.7500 -60.0 + 88.5000 64.7500 -60.0 + 65.7500 71.5000 -60.0 + 66.5000 70.7500 -60.0 + 68.2500 71.5000 -60.0 + 67.5000 72.2500 -60.0 + 154.7500 95.5000 -60.0 + 155.5000 94.7500 -60.0 + 156.2500 95.5000 -60.0 + 155.5000 96.2500 -60.0 + 170.7500 173.5000 -60.0 + 171.5000 172.7500 -60.0 + 172.2500 173.5000 -60.0 + 171.5000 175.2500 -60.0 + 95.2500 53.5000 -62.0 + 94.5000 54.2500 -62.0 + 92.5000 54.2500 -62.0 + 90.5000 55.2500 -62.0 + 87.5000 55.2500 -62.0 + 65.5000 66.2500 -62.0 + 60.5000 70.2500 -62.0 + 55.2500 78.5000 -62.0 + 49.5000 89.2500 -62.0 + 49.2500 91.5000 -62.0 + 44.2500 101.5000 -62.0 + 43.2500 108.5000 -62.0 + 41.2500 117.5000 -62.0 + 40.2500 120.5000 -62.0 + 39.5000 122.2500 -62.0 + 39.2500 125.5000 -62.0 + 37.2500 129.5000 -62.0 + 36.2500 134.5000 -62.0 + 34.2500 138.5000 -62.0 + 32.2500 147.5000 -62.0 + 31.2500 152.5000 -62.0 + 30.5000 154.2500 -62.0 + 30.2500 158.5000 -62.0 + 29.5000 160.2500 -62.0 + 29.2500 172.5000 -62.0 + 30.2500 174.5000 -62.0 + 30.2500 177.5000 -62.0 + 33.2500 186.5000 -62.0 + 39.5000 199.7500 -62.0 + 44.2500 206.5000 -62.0 + 56.2500 217.5000 -62.0 + 62.2500 221.5000 -62.0 + 68.5000 223.7500 -62.0 + 70.2500 224.5000 -62.0 + 79.5000 224.7500 -62.0 + 81.2500 225.5000 -62.0 + 86.5000 225.7500 -62.0 + 88.2500 226.5000 -62.0 + 114.5000 226.7500 -62.0 + 116.5000 225.7500 -62.0 + 128.5000 225.7500 -62.0 + 130.5000 224.7500 -62.0 + 132.7500 224.5000 -62.0 + 143.5000 219.7500 -62.0 + 152.5000 212.7500 -62.0 + 154.5000 211.7500 -62.0 + 156.5000 208.7500 -62.0 + 158.5000 207.7500 -62.0 + 158.7500 206.5000 -62.0 + 163.5000 201.7500 -62.0 + 168.7500 192.5000 -62.0 + 173.7500 182.5000 -62.0 + 174.7500 175.5000 -62.0 + 175.5000 173.7500 -62.0 + 175.7500 151.5000 -62.0 + 174.7500 149.5000 -62.0 + 174.7500 142.5000 -62.0 + 173.7500 140.5000 -62.0 + 173.7500 137.5000 -62.0 + 172.7500 135.5000 -62.0 + 172.7500 132.5000 -62.0 + 171.7500 130.5000 -62.0 + 171.7500 128.5000 -62.0 + 170.7500 126.5000 -62.0 + 170.7500 124.5000 -62.0 + 169.7500 122.5000 -62.0 + 169.7500 120.5000 -62.0 + 168.7500 118.5000 -62.0 + 168.7500 116.5000 -62.0 + 167.7500 114.5000 -62.0 + 167.7500 112.5000 -62.0 + 166.7500 110.5000 -62.0 + 166.7500 108.5000 -62.0 + 164.7500 104.5000 -62.0 + 164.7500 102.5000 -62.0 + 162.7500 98.5000 -62.0 + 162.7500 95.5000 -62.0 + 152.7500 75.5000 -62.0 + 152.7500 73.5000 -62.0 + 148.7500 69.5000 -62.0 + 136.7500 61.5000 -62.0 + 129.7500 57.5000 -62.0 + 120.5000 54.2500 -62.0 + 118.7500 53.5000 -62.0 + 108.7500 55.5000 -62.0 + 110.5000 54.7500 -62.0 + 117.5000 55.7500 -62.0 + 121.2500 57.5000 -62.0 + 123.5000 57.7500 -62.0 + 127.2500 60.5000 -62.0 + 128.2500 62.5000 -62.0 + 125.5000 64.2500 -62.0 + 114.7500 60.5000 -62.0 + 112.5000 60.2500 -62.0 + 106.5000 63.2500 -62.0 + 104.5000 62.2500 -62.0 + 102.5000 63.2500 -62.0 + 95.5000 62.2500 -62.0 + 93.5000 63.2500 -62.0 + 91.5000 63.2500 -62.0 + 85.5000 66.2500 -62.0 + 81.5000 66.2500 -62.0 + 79.7500 65.5000 -62.0 + 78.7500 63.5000 -62.0 + 80.5000 61.7500 -62.0 + 84.5000 59.7500 -62.0 + 86.5000 59.7500 -62.0 + 92.5000 56.7500 -62.0 + 102.5000 55.7500 -62.0 + 104.5000 56.7500 -62.0 + 92.7500 64.5000 -62.0 + 93.5000 63.7500 -62.0 + 97.5000 63.7500 -62.0 + 102.5000 64.7500 -62.0 + 105.5000 65.7500 -62.0 + 107.5000 64.7500 -62.0 + 109.5000 64.7500 -62.0 + 111.5000 63.7500 -62.0 + 113.2500 64.5000 -62.0 + 116.5000 64.7500 -62.0 + 121.5000 65.7500 -62.0 + 123.5000 64.7500 -62.0 + 126.5000 64.7500 -62.0 + 131.5000 66.7500 -62.0 + 136.2500 71.5000 -62.0 + 142.5000 73.7500 -62.0 + 149.2500 81.5000 -62.0 + 153.2500 89.5000 -62.0 + 153.2500 91.5000 -62.0 + 154.2500 93.5000 -62.0 + 154.2500 95.5000 -62.0 + 158.2500 99.5000 -62.0 + 163.2500 108.5000 -62.0 + 163.2500 114.5000 -62.0 + 164.2500 116.5000 -62.0 + 163.5000 118.2500 -62.0 + 163.2500 132.5000 -62.0 + 164.2500 134.5000 -62.0 + 164.2500 138.5000 -62.0 + 166.2500 142.5000 -62.0 + 166.2500 146.5000 -62.0 + 167.2500 148.5000 -62.0 + 167.2500 151.5000 -62.0 + 168.2500 153.5000 -62.0 + 167.2500 162.5000 -62.0 + 168.2500 165.5000 -62.0 + 167.5000 167.2500 -62.0 + 167.2500 178.5000 -62.0 + 163.2500 186.5000 -62.0 + 156.2500 195.5000 -62.0 + 153.5000 199.2500 -62.0 + 151.5000 200.2500 -62.0 + 151.2500 201.5000 -62.0 + 148.5000 203.2500 -62.0 + 144.5000 206.2500 -62.0 + 136.5000 211.2500 -62.0 + 126.5000 217.2500 -62.0 + 123.5000 217.2500 -62.0 + 121.5000 218.2500 -62.0 + 118.5000 218.2500 -62.0 + 116.5000 219.2500 -62.0 + 113.5000 219.2500 -62.0 + 111.5000 220.2500 -62.0 + 109.7500 219.5000 -62.0 + 98.5000 218.2500 -62.0 + 96.5000 217.2500 -62.0 + 93.5000 218.2500 -62.0 + 91.7500 217.5000 -62.0 + 90.5000 218.2500 -62.0 + 86.5000 218.2500 -62.0 + 77.5000 217.2500 -62.0 + 72.5000 215.2500 -62.0 + 66.7500 210.5000 -62.0 + 62.5000 207.2500 -62.0 + 60.5000 206.2500 -62.0 + 54.5000 200.2500 -62.0 + 46.7500 190.5000 -62.0 + 43.7500 186.5000 -62.0 + 40.7500 181.5000 -62.0 + 38.7500 177.5000 -62.0 + 38.7500 175.5000 -62.0 + 37.7500 173.5000 -62.0 + 37.7500 166.5000 -62.0 + 36.7500 164.5000 -62.0 + 37.5000 163.7500 -62.0 + 37.7500 155.5000 -62.0 + 38.5000 153.7500 -62.0 + 38.7500 147.5000 -62.0 + 39.5000 145.7500 -62.0 + 39.7500 140.5000 -62.0 + 41.7500 134.5000 -62.0 + 44.5000 128.7500 -62.0 + 44.7500 126.5000 -62.0 + 45.7500 124.5000 -62.0 + 43.7500 120.5000 -62.0 + 44.5000 118.7500 -62.0 + 44.7500 114.5000 -62.0 + 47.5000 108.7500 -62.0 + 47.7500 104.5000 -62.0 + 49.7500 98.5000 -62.0 + 55.5000 91.7500 -62.0 + 55.7500 89.5000 -62.0 + 57.7500 83.5000 -62.0 + 62.5000 78.7500 -62.0 + 64.5000 77.7500 -62.0 + 64.7500 76.5000 -62.0 + 74.5000 67.7500 -62.0 + 81.5000 67.7500 -62.0 + 84.5000 68.7500 -62.0 + 87.7500 66.5000 -62.0 + 133.7500 65.5000 -62.0 + 135.5000 64.7500 -62.0 + 137.2500 66.5000 -62.0 + 135.5000 67.2500 -62.0 + 155.7500 95.5000 -62.0 + 156.5000 94.7500 -62.0 + 157.2500 95.5000 -62.0 + 156.5000 96.2500 -62.0 + 35.7500 185.5000 -62.0 + 36.5000 184.7500 -62.0 + 37.2500 185.5000 -62.0 + 36.5000 186.2500 -62.0 + 110.2500 51.5000 -64.0 + 109.5000 52.2500 -64.0 + 96.5000 52.2500 -64.0 + 94.5000 53.2500 -64.0 + 91.5000 53.2500 -64.0 + 87.5000 55.2500 -64.0 + 85.5000 55.2500 -64.0 + 65.5000 65.2500 -64.0 + 61.5000 68.2500 -64.0 + 57.2500 75.5000 -64.0 + 50.5000 86.2500 -64.0 + 50.2500 88.5000 -64.0 + 45.2500 98.5000 -64.0 + 41.2500 116.5000 -64.0 + 40.2500 118.5000 -64.0 + 39.2500 123.5000 -64.0 + 33.2500 141.5000 -64.0 + 31.2500 150.5000 -64.0 + 30.5000 152.2500 -64.0 + 30.2500 156.5000 -64.0 + 29.5000 158.2500 -64.0 + 29.2500 174.5000 -64.0 + 30.2500 176.5000 -64.0 + 30.2500 179.5000 -64.0 + 33.5000 188.7500 -64.0 + 37.2500 197.5000 -64.0 + 43.2500 205.5000 -64.0 + 44.2500 207.5000 -64.0 + 54.2500 216.5000 -64.0 + 58.5000 219.7500 -64.0 + 66.5000 223.7500 -64.0 + 68.2500 224.5000 -64.0 + 72.5000 224.7500 -64.0 + 74.2500 225.5000 -64.0 + 84.5000 225.7500 -64.0 + 86.2500 226.5000 -64.0 + 126.5000 226.7500 -64.0 + 128.5000 225.7500 -64.0 + 130.5000 225.7500 -64.0 + 132.5000 224.7500 -64.0 + 134.7500 224.5000 -64.0 + 141.5000 221.7500 -64.0 + 149.5000 215.7500 -64.0 + 151.5000 214.7500 -64.0 + 161.5000 204.7500 -64.0 + 165.7500 198.5000 -64.0 + 170.7500 189.5000 -64.0 + 171.7500 187.5000 -64.0 + 173.7500 182.5000 -64.0 + 174.5000 180.7500 -64.0 + 174.7500 177.5000 -64.0 + 175.5000 175.7500 -64.0 + 175.7500 166.5000 -64.0 + 176.5000 164.7500 -64.0 + 176.7500 158.5000 -64.0 + 175.7500 156.5000 -64.0 + 175.7500 147.5000 -64.0 + 174.7500 145.5000 -64.0 + 174.7500 140.5000 -64.0 + 173.7500 138.5000 -64.0 + 173.7500 135.5000 -64.0 + 172.7500 133.5000 -64.0 + 172.7500 130.5000 -64.0 + 171.7500 128.5000 -64.0 + 171.7500 125.5000 -64.0 + 169.7500 121.5000 -64.0 + 169.7500 118.5000 -64.0 + 167.7500 114.5000 -64.0 + 167.7500 112.5000 -64.0 + 160.5000 91.2500 -64.0 + 157.7500 84.5000 -64.0 + 152.7500 76.5000 -64.0 + 152.7500 74.5000 -64.0 + 151.7500 71.5000 -64.0 + 144.5000 65.2500 -64.0 + 136.5000 60.2500 -64.0 + 128.5000 56.2500 -64.0 + 126.7500 55.5000 -64.0 + 120.5000 53.2500 -64.0 + 118.7500 52.5000 -64.0 + 113.5000 52.2500 -64.0 +} -64.0 +{ -64.0 + 106.7500 54.5000 -64.0 + 107.5000 53.7500 -64.0 + 114.5000 53.7500 -64.0 + 118.2500 55.5000 -64.0 + 120.5000 55.7500 -64.0 + 128.5000 59.7500 -64.0 + 131.2500 63.5000 -64.0 + 133.5000 63.7500 -64.0 + 136.2500 66.5000 -64.0 + 137.5000 65.7500 -64.0 + 139.5000 66.7500 -64.0 + 142.2500 69.5000 -64.0 + 141.5000 70.2500 -64.0 + 138.5000 70.2500 -64.0 + 136.7500 69.5000 -64.0 + 135.7500 67.5000 -64.0 + 134.5000 68.2500 -64.0 + 132.5000 68.2500 -64.0 + 128.7500 65.5000 -64.0 + 125.5000 65.2500 -64.0 + 120.5000 64.2500 -64.0 + 116.7500 62.5000 -64.0 + 103.5000 62.2500 -64.0 + 100.5000 63.2500 -64.0 + 98.7500 62.5000 -64.0 + 94.5000 62.2500 -64.0 + 91.5000 63.2500 -64.0 + 87.5000 66.2500 -64.0 + 79.5000 66.2500 -64.0 + 77.7500 65.5000 -64.0 + 76.7500 63.5000 -64.0 + 78.5000 61.7500 -64.0 + 86.5000 57.7500 -64.0 + 89.5000 57.7500 -64.0 + 93.5000 55.7500 -64.0 + 96.5000 55.7500 -64.0 + 98.5000 54.7500 -64.0 + 101.5000 54.7500 -64.0 + 103.5000 55.7500 -64.0 +} -64.0 +{ -64.0 + 92.7500 64.5000 -64.0 + 93.5000 63.7500 -64.0 + 97.5000 63.7500 -64.0 + 102.5000 64.7500 -64.0 + 104.5000 65.7500 -64.0 + 106.5000 64.7500 -64.0 + 115.5000 64.7500 -64.0 + 122.5000 67.7500 -64.0 + 124.5000 66.7500 -64.0 + 126.5000 66.7500 -64.0 + 129.5000 67.7500 -64.0 + 136.2500 73.5000 -64.0 + 141.5000 73.7500 -64.0 + 144.5000 74.7500 -64.0 + 149.2500 81.5000 -64.0 + 150.2500 83.5000 -64.0 + 155.2500 91.5000 -64.0 + 155.2500 95.5000 -64.0 + 158.2500 98.5000 -64.0 + 161.2500 103.5000 -64.0 + 163.2500 107.5000 -64.0 + 163.2500 112.5000 -64.0 + 164.2500 115.5000 -64.0 + 163.5000 117.2500 -64.0 + 163.2500 130.5000 -64.0 + 164.2500 132.5000 -64.0 + 164.2500 135.5000 -64.0 + 165.2500 137.5000 -64.0 + 165.2500 139.5000 -64.0 + 166.2500 141.5000 -64.0 + 166.2500 144.5000 -64.0 + 167.2500 146.5000 -64.0 + 167.2500 150.5000 -64.0 + 168.2500 152.5000 -64.0 + 168.2500 156.5000 -64.0 + 167.2500 161.5000 -64.0 + 168.2500 163.5000 -64.0 + 168.2500 176.5000 -64.0 + 162.2500 188.5000 -64.0 + 159.2500 192.5000 -64.0 + 158.2500 194.5000 -64.0 + 148.5000 204.2500 -64.0 + 146.2500 205.5000 -64.0 + 139.5000 210.2500 -64.0 + 129.5000 216.2500 -64.0 + 125.5000 218.2500 -64.0 + 121.5000 218.2500 -64.0 + 119.5000 219.2500 -64.0 + 117.5000 219.2500 -64.0 + 115.5000 220.2500 -64.0 + 109.5000 220.2500 -64.0 + 107.7500 219.5000 -64.0 + 97.5000 219.2500 -64.0 + 95.7500 218.5000 -64.0 + 79.5000 218.2500 -64.0 + 74.5000 217.2500 -64.0 + 67.7500 212.5000 -64.0 + 58.5000 205.2500 -64.0 + 56.5000 204.2500 -64.0 + 46.7500 192.5000 -64.0 + 43.7500 188.5000 -64.0 + 36.7500 174.5000 -64.0 + 36.7500 158.5000 -64.0 + 37.7500 153.5000 -64.0 + 38.7500 144.5000 -64.0 + 39.7500 137.5000 -64.0 + 40.7500 134.5000 -64.0 + 41.5000 132.7500 -64.0 + 44.7500 127.5000 -64.0 + 45.7500 122.5000 -64.0 + 44.7500 120.5000 -64.0 + 44.7500 113.5000 -64.0 + 46.7500 107.5000 -64.0 + 47.5000 105.7500 -64.0 + 47.7500 101.5000 -64.0 + 48.7500 98.5000 -64.0 + 55.5000 90.7500 -64.0 + 55.7500 87.5000 -64.0 + 57.7500 82.5000 -64.0 + 64.5000 75.7500 -64.0 + 66.5000 74.7500 -64.0 + 74.5000 67.7500 -64.0 + 77.5000 67.7500 -64.0 + 86.5000 68.7500 -64.0 + 90.5000 65.7500 -64.0 + 68.7500 68.5000 -64.0 + 69.5000 67.7500 -64.0 + 70.2500 68.5000 -64.0 + 69.5000 69.2500 -64.0 + 108.2500 50.5000 -66.0 + 107.5000 51.2500 -66.0 + 98.5000 51.2500 -66.0 + 96.5000 52.2500 -66.0 + 94.5000 52.2500 -66.0 + 92.5000 53.2500 -66.0 + 89.5000 53.2500 -66.0 + 85.5000 55.2500 -66.0 + 83.5000 55.2500 -66.0 + 63.5000 65.2500 -66.0 + 60.5000 68.2500 -66.0 + 58.2500 74.5000 -66.0 + 54.2500 79.5000 -66.0 + 50.5000 86.2500 -66.0 + 50.2500 88.5000 -66.0 + 45.2500 98.5000 -66.0 + 44.2500 103.5000 -66.0 + 42.2500 112.5000 -66.0 + 41.2500 114.5000 -66.0 + 40.2500 119.5000 -66.0 + 38.2500 125.5000 -66.0 + 36.5000 129.2500 -66.0 + 35.2500 135.5000 -66.0 + 33.2500 139.5000 -66.0 + 31.2500 148.5000 -66.0 + 30.2500 151.5000 -66.0 + 29.2500 160.5000 -66.0 + 28.2500 167.5000 -66.0 + 29.2500 169.5000 -66.0 + 29.2500 176.5000 -66.0 + 30.2500 178.5000 -66.0 + 30.2500 181.5000 -66.0 + 32.2500 185.5000 -66.0 + 32.2500 187.5000 -66.0 + 39.2500 201.5000 -66.0 + 44.2500 207.5000 -66.0 + 45.2500 209.5000 -66.0 + 50.2500 213.5000 -66.0 + 57.5000 219.7500 -66.0 + 66.2500 224.5000 -66.0 + 68.5000 224.7500 -66.0 + 70.2500 225.5000 -66.0 + 79.5000 225.7500 -66.0 + 88.5000 226.7500 -66.0 + 90.2500 227.5000 -66.0 + 110.5000 227.7500 -66.0 + 112.5000 226.7500 -66.0 + 128.5000 226.7500 -66.0 + 130.5000 225.7500 -66.0 + 132.5000 225.7500 -66.0 + 138.5000 223.7500 -66.0 + 146.5000 218.7500 -66.0 + 148.5000 217.7500 -66.0 + 157.5000 209.7500 -66.0 + 162.5000 203.7500 -66.0 + 166.7500 197.5000 -66.0 + 173.7500 183.5000 -66.0 + 174.5000 181.7500 -66.0 + 174.7500 178.5000 -66.0 + 175.5000 176.7500 -66.0 + 175.7500 171.5000 -66.0 + 176.5000 169.7500 -66.0 + 176.7500 153.5000 -66.0 + 175.7500 151.5000 -66.0 + 175.7500 143.5000 -66.0 + 174.7500 141.5000 -66.0 + 174.7500 136.5000 -66.0 + 173.7500 134.5000 -66.0 + 173.7500 131.5000 -66.0 + 172.7500 129.5000 -66.0 + 172.7500 126.5000 -66.0 + 170.7500 122.5000 -66.0 + 170.7500 120.5000 -66.0 + 168.7500 116.5000 -66.0 + 168.7500 113.5000 -66.0 + 166.7500 109.5000 -66.0 + 166.7500 107.5000 -66.0 + 162.7500 99.5000 -66.0 + 162.7500 97.5000 -66.0 + 161.7500 95.5000 -66.0 + 161.7500 93.5000 -66.0 + 155.7500 81.5000 -66.0 + 152.7500 76.5000 -66.0 + 152.7500 73.5000 -66.0 + 151.7500 71.5000 -66.0 + 151.7500 69.5000 -66.0 + 147.7500 66.5000 -66.0 + 141.5000 62.2500 -66.0 + 127.5000 55.2500 -66.0 + 125.7500 54.5000 -66.0 + 119.5000 52.2500 -66.0 + 117.7500 51.5000 -66.0 + 113.5000 51.2500 -66.0 + 111.7500 50.5000 -66.0 +} -66.0 +{ -66.0 + 105.7500 53.5000 -66.0 + 106.5000 52.7500 -66.0 + 113.5000 52.7500 -66.0 + 116.5000 53.7500 -66.0 + 126.5000 57.7500 -66.0 + 130.2500 59.5000 -66.0 + 131.2500 61.5000 -66.0 + 136.5000 65.7500 -66.0 + 138.5000 66.7500 -66.0 + 144.2500 69.5000 -66.0 + 143.5000 71.2500 -66.0 + 141.5000 71.2500 -66.0 + 139.7500 70.5000 -66.0 + 138.5000 71.2500 -66.0 + 136.7500 69.5000 -66.0 + 135.5000 70.2500 -66.0 + 133.5000 70.2500 -66.0 + 129.5000 68.2500 -66.0 + 127.7500 67.5000 -66.0 + 121.5000 67.2500 -66.0 + 117.7500 63.5000 -66.0 + 111.5000 63.2500 -66.0 + 109.7500 62.5000 -66.0 + 103.5000 62.2500 -66.0 + 101.5000 63.2500 -66.0 + 98.5000 63.2500 -66.0 + 96.5000 62.2500 -66.0 + 94.5000 63.2500 -66.0 + 92.5000 63.2500 -66.0 + 86.5000 67.2500 -66.0 + 84.7500 66.5000 -66.0 + 79.5000 66.2500 -66.0 + 76.5000 65.2500 -66.0 + 75.7500 63.5000 -66.0 + 77.5000 61.7500 -66.0 + 87.5000 56.7500 -66.0 + 89.5000 56.7500 -66.0 + 91.5000 55.7500 -66.0 + 93.5000 55.7500 -66.0 + 95.5000 54.7500 -66.0 + 98.5000 54.7500 -66.0 + 100.5000 53.7500 -66.0 + 103.2500 55.5000 -66.0 +} -66.0 +{ -66.0 + 93.7500 64.5000 -66.0 + 94.5000 63.7500 -66.0 + 97.5000 63.7500 -66.0 + 99.2500 64.5000 -66.0 + 111.5000 64.7500 -66.0 + 118.5000 65.7500 -66.0 + 120.5000 68.7500 -66.0 + 122.5000 69.7500 -66.0 + 125.5000 68.7500 -66.0 + 132.5000 71.7500 -66.0 + 136.2500 74.5000 -66.0 + 138.5000 74.7500 -66.0 + 140.5000 73.7500 -66.0 + 143.5000 73.7500 -66.0 + 150.2500 81.5000 -66.0 + 152.2500 85.5000 -66.0 + 156.2500 90.5000 -66.0 + 156.2500 94.5000 -66.0 + 157.2500 96.5000 -66.0 + 162.2500 104.5000 -66.0 + 162.2500 106.5000 -66.0 + 164.2500 110.5000 -66.0 + 163.5000 111.2500 -66.0 + 164.2500 112.5000 -66.0 + 162.2500 121.5000 -66.0 + 163.2500 123.5000 -66.0 + 163.2500 130.5000 -66.0 + 164.2500 132.5000 -66.0 + 164.2500 135.5000 -66.0 + 165.2500 137.5000 -66.0 + 165.2500 139.5000 -66.0 + 166.2500 141.5000 -66.0 + 166.2500 144.5000 -66.0 + 167.2500 146.5000 -66.0 + 167.2500 152.5000 -66.0 + 168.2500 154.5000 -66.0 + 168.2500 158.5000 -66.0 + 167.2500 161.5000 -66.0 + 168.2500 163.5000 -66.0 + 168.2500 165.5000 -66.0 + 169.2500 167.5000 -66.0 + 168.5000 168.2500 -66.0 + 168.2500 171.5000 -66.0 + 169.2500 174.5000 -66.0 + 160.2500 192.5000 -66.0 + 148.5000 205.2500 -66.0 + 143.5000 208.2500 -66.0 + 141.2500 209.5000 -66.0 + 134.5000 214.2500 -66.0 + 127.5000 218.2500 -66.0 + 124.5000 218.2500 -66.0 + 122.5000 219.2500 -66.0 + 119.5000 219.2500 -66.0 + 117.5000 220.2500 -66.0 + 115.5000 220.2500 -66.0 + 113.5000 221.2500 -66.0 + 111.5000 221.2500 -66.0 + 109.7500 220.5000 -66.0 + 104.5000 220.2500 -66.0 + 102.7500 219.5000 -66.0 + 101.5000 220.2500 -66.0 + 99.5000 220.2500 -66.0 + 97.7500 219.5000 -66.0 + 83.5000 219.2500 -66.0 + 76.5000 218.2500 -66.0 + 70.5000 215.2500 -66.0 + 64.7500 210.5000 -66.0 + 57.7500 206.5000 -66.0 + 56.7500 204.5000 -66.0 + 55.5000 204.2500 -66.0 + 49.7500 197.5000 -66.0 + 43.7500 189.5000 -66.0 + 39.7500 182.5000 -66.0 + 39.7500 180.5000 -66.0 + 35.7500 172.5000 -66.0 + 35.7500 162.5000 -66.0 + 36.5000 160.7500 -66.0 + 36.7500 153.5000 -66.0 + 37.7500 151.5000 -66.0 + 38.7500 142.5000 -66.0 + 39.7500 135.5000 -66.0 + 44.7500 127.5000 -66.0 + 45.7500 122.5000 -66.0 + 44.7500 119.5000 -66.0 + 45.5000 117.7500 -66.0 + 45.7500 113.5000 -66.0 + 44.7500 111.5000 -66.0 + 46.7500 107.5000 -66.0 + 47.5000 105.7500 -66.0 + 47.7500 101.5000 -66.0 + 49.7500 95.5000 -66.0 + 55.5000 89.7500 -66.0 + 55.7500 86.5000 -66.0 + 58.7500 79.5000 -66.0 + 64.5000 75.7500 -66.0 + 66.5000 74.7500 -66.0 + 72.5000 69.7500 -66.0 + 76.5000 66.7500 -66.0 + 78.2500 67.5000 -66.0 + 80.5000 67.7500 -66.0 + 82.2500 68.5000 -66.0 + 87.5000 68.7500 -66.0 + 89.5000 66.7500 -66.0 +} -66.0 +{ -66.0 + 64.7500 70.5000 -66.0 + 65.5000 69.7500 -66.0 + 67.2500 70.5000 -66.0 + 66.5000 71.2500 -66.0 +} -66.0 +v 253 z -68.000000 -64.0 +{ -68.0 + 99.2500 50.5000 -68.0 + 98.5000 51.2500 -68.0 + 95.5000 51.2500 -68.0 + 91.5000 53.2500 -68.0 + 88.5000 53.2500 -68.0 + 82.5000 56.2500 -68.0 + 79.2500 56.5000 -68.0 + 68.5000 61.2500 -68.0 + 60.5000 67.2500 -68.0 + 58.2500 74.5000 -68.0 + 54.2500 79.5000 -68.0 + 46.5000 95.2500 -68.0 + 46.2500 97.5000 -68.0 + 45.2500 99.5000 -68.0 + 44.2500 104.5000 -68.0 + 43.2500 107.5000 -68.0 + 42.5000 109.2500 -68.0 + 42.2500 112.5000 -68.0 + 40.2500 116.5000 -68.0 + 39.2500 121.5000 -68.0 + 37.5000 125.2500 -68.0 + 37.2500 127.5000 -68.0 + 35.2500 131.5000 -68.0 + 34.2500 136.5000 -68.0 + 33.2500 138.5000 -68.0 + 32.2500 143.5000 -68.0 + 31.2500 145.5000 -68.0 + 30.2500 152.5000 -68.0 + 29.5000 154.2500 -68.0 + 29.2500 159.5000 -68.0 + 28.5000 161.2500 -68.0 + 28.2500 170.5000 -68.0 + 29.2500 172.5000 -68.0 + 29.2500 177.5000 -68.0 + 30.2500 179.5000 -68.0 + 30.2500 182.5000 -68.0 + 32.2500 186.5000 -68.0 + 32.2500 188.5000 -68.0 + 38.2500 200.5000 -68.0 + 41.2500 204.5000 -68.0 + 42.2500 206.5000 -68.0 + 49.2500 213.5000 -68.0 + 56.5000 219.7500 -68.0 + 64.5000 223.7500 -68.0 + 68.2500 225.5000 -68.0 + 78.5000 225.7500 -68.0 + 85.5000 226.7500 -68.0 + 87.2500 227.5000 -68.0 + 117.5000 227.7500 -68.0 + 120.5000 226.7500 -68.0 + 122.5000 227.7500 -68.0 + 124.5000 226.7500 -68.0 + 130.5000 226.7500 -68.0 + 132.5000 225.7500 -68.0 + 134.5000 225.7500 -68.0 + 144.5000 220.7500 -68.0 + 148.5000 217.7500 -68.0 + 150.5000 216.7500 -68.0 + 160.7500 206.5000 -68.0 + 163.5000 202.7500 -68.0 + 167.7500 196.5000 -68.0 + 171.5000 189.7500 -68.0 + 173.7500 183.5000 -68.0 + 174.5000 181.7500 -68.0 + 175.7500 173.5000 -68.0 + 176.5000 171.7500 -68.0 + 176.7500 149.5000 -68.0 + 175.7500 147.5000 -68.0 + 175.7500 138.5000 -68.0 + 174.7500 136.5000 -68.0 + 174.7500 132.5000 -68.0 + 173.7500 130.5000 -68.0 + 173.7500 128.5000 -68.0 + 171.7500 124.5000 -68.0 + 171.7500 122.5000 -68.0 + 169.7500 118.5000 -68.0 + 169.7500 116.5000 -68.0 + 167.7500 112.5000 -68.0 + 167.7500 110.5000 -68.0 + 166.7500 108.5000 -68.0 + 166.7500 106.5000 -68.0 + 161.7500 96.5000 -68.0 + 161.7500 94.5000 -68.0 + 151.7500 74.5000 -68.0 + 152.5000 73.7500 -68.0 + 152.7500 70.5000 -68.0 + 151.7500 68.5000 -68.0 + 147.5000 65.2500 -68.0 + 143.7500 62.5000 -68.0 + 137.5000 58.2500 -68.0 + 132.5000 57.2500 -68.0 + 126.7500 54.5000 -68.0 + 117.5000 51.2500 -68.0 + 115.7500 50.5000 -68.0 +} -68.0 +{ -68.0 + 105.7500 52.5000 -68.0 + 106.5000 51.7500 -68.0 + 113.5000 51.7500 -68.0 + 117.2500 53.5000 -68.0 + 119.5000 53.7500 -68.0 + 123.2500 56.5000 -68.0 + 126.5000 56.7500 -68.0 + 130.2500 59.5000 -68.0 + 131.2500 61.5000 -68.0 + 136.2500 65.5000 -68.0 + 136.2500 69.5000 -68.0 + 134.5000 71.2500 -68.0 + 132.5000 71.2500 -68.0 + 129.5000 70.2500 -68.0 + 125.7500 68.5000 -68.0 + 121.5000 68.2500 -68.0 + 119.7500 66.5000 -68.0 + 118.7500 64.5000 -68.0 + 113.5000 64.2500 -68.0 + 103.5000 62.2500 -68.0 + 101.5000 63.2500 -68.0 + 96.5000 63.2500 -68.0 + 88.5000 67.2500 -68.0 + 84.5000 67.2500 -68.0 + 82.7500 65.5000 -68.0 + 79.5000 65.2500 -68.0 + 77.7500 64.5000 -68.0 + 76.7500 62.5000 -68.0 + 79.5000 59.7500 -68.0 + 81.5000 59.7500 -68.0 + 87.5000 56.7500 -68.0 + 89.5000 56.7500 -68.0 + 93.5000 54.7500 -68.0 + 95.5000 54.7500 -68.0 + 97.5000 53.7500 -68.0 + 101.5000 53.7500 -68.0 + 103.2500 54.5000 -68.0 +} -68.0 +{ -68.0 + 71.7500 64.5000 -68.0 + 72.5000 63.7500 -68.0 + 74.2500 64.5000 -68.0 + 73.5000 65.2500 -68.0 + 69.5000 68.2500 -68.0 + 68.7500 66.5000 -68.0 +} -68.0 +{ -68.0 + 93.7500 65.5000 -68.0 + 94.5000 64.7500 -68.0 + 107.5000 64.7500 -68.0 + 116.5000 65.7500 -68.0 + 118.2500 66.5000 -68.0 + 119.5000 68.7500 -68.0 + 121.5000 69.7500 -68.0 + 123.2500 70.5000 -68.0 + 126.5000 70.7500 -68.0 + 128.5000 71.7500 -68.0 + 133.5000 72.7500 -68.0 + 135.2500 74.5000 -68.0 + 144.5000 74.7500 -68.0 + 148.2500 78.5000 -68.0 + 154.2500 85.5000 -68.0 + 154.2500 87.5000 -68.0 + 156.2500 89.5000 -68.0 + 156.2500 92.5000 -68.0 + 163.2500 106.5000 -68.0 + 162.5000 108.2500 -68.0 + 162.2500 111.5000 -68.0 + 163.2500 113.5000 -68.0 + 162.5000 115.2500 -68.0 + 162.2500 121.5000 -68.0 + 163.2500 123.5000 -68.0 + 163.2500 129.5000 -68.0 + 164.2500 131.5000 -68.0 + 164.2500 134.5000 -68.0 + 165.2500 136.5000 -68.0 + 165.2500 138.5000 -68.0 + 166.2500 140.5000 -68.0 + 166.2500 143.5000 -68.0 + 167.2500 145.5000 -68.0 + 167.2500 159.5000 -68.0 + 168.2500 161.5000 -68.0 + 168.2500 164.5000 -68.0 + 169.2500 166.5000 -68.0 + 169.2500 170.5000 -68.0 + 170.2500 172.5000 -68.0 + 169.5000 173.2500 -68.0 + 169.2500 175.5000 -68.0 + 162.2500 189.5000 -68.0 + 159.2500 193.5000 -68.0 + 158.2500 195.5000 -68.0 + 150.5000 204.2500 -68.0 + 146.5000 207.2500 -68.0 + 141.5000 210.2500 -68.0 + 133.5000 215.2500 -68.0 + 125.5000 219.2500 -68.0 + 123.5000 219.2500 -68.0 + 121.5000 220.2500 -68.0 + 117.5000 220.2500 -68.0 + 115.5000 221.2500 -68.0 + 109.5000 221.2500 -68.0 + 107.7500 220.5000 -68.0 + 97.5000 220.2500 -68.0 + 95.7500 219.5000 -68.0 + 88.5000 219.2500 -68.0 + 86.5000 220.2500 -68.0 + 85.7500 219.5000 -68.0 + 84.5000 220.2500 -68.0 + 82.7500 219.5000 -68.0 + 79.5000 219.2500 -68.0 + 74.5000 218.2500 -68.0 + 68.7500 214.5000 -68.0 + 62.5000 210.2500 -68.0 + 60.5000 209.2500 -68.0 + 51.7500 201.5000 -68.0 + 50.5000 199.2500 -68.0 + 42.7500 189.5000 -68.0 + 39.7500 183.5000 -68.0 + 39.7500 181.5000 -68.0 + 36.7500 175.5000 -68.0 + 36.7500 173.5000 -68.0 + 34.7500 169.5000 -68.0 + 34.7500 165.5000 -68.0 + 35.5000 163.7500 -68.0 + 35.7500 157.5000 -68.0 + 36.5000 155.7500 -68.0 + 37.7500 147.5000 -68.0 + 38.5000 145.7500 -68.0 + 39.7500 137.5000 -68.0 + 44.7500 126.5000 -68.0 + 45.5000 124.7500 -68.0 + 45.7500 121.5000 -68.0 + 44.7500 119.5000 -68.0 + 45.5000 117.7500 -68.0 + 45.7500 110.5000 -68.0 + 46.7500 108.5000 -68.0 + 48.7500 99.5000 -68.0 + 49.7500 94.5000 -68.0 + 51.5000 93.7500 -68.0 + 54.5000 90.7500 -68.0 + 54.7500 88.5000 -68.0 + 55.7500 83.5000 -68.0 + 58.5000 79.7500 -68.0 + 62.5000 76.7500 -68.0 + 64.5000 75.7500 -68.0 + 68.5000 72.7500 -68.0 + 71.5000 72.7500 -68.0 + 71.7500 71.5000 -68.0 + 73.5000 69.7500 -68.0 + 77.5000 67.7500 -68.0 + 86.5000 68.7500 -68.0 +} -68.0 +{ -68.0 + 66.7500 68.5000 -68.0 + 67.5000 67.7500 -68.0 + 68.2500 69.5000 -68.0 + 65.5000 71.2500 -68.0 + 63.7500 70.5000 -68.0 +} -68.0 +{ -68.0 + 142.7500 69.5000 -68.0 + 144.5000 68.7500 -68.0 + 146.2500 70.5000 -68.0 + 145.5000 71.2500 -68.0 + 139.5000 71.2500 -68.0 + 137.7500 70.5000 -68.0 + 138.5000 69.7500 -68.0 +} -68.0 +v 195 z -70.000000 -68.0 +{ -68.0 + 101.2500 49.5000 -70.0 + 97.5000 51.2500 -70.0 + 94.5000 51.2500 -70.0 + 90.5000 53.2500 -70.0 + 88.5000 53.2500 -70.0 + 82.5000 56.2500 -70.0 + 81.5000 55.2500 -70.0 + 79.5000 56.2500 -70.0 + 77.5000 56.2500 -70.0 + 66.5000 61.2500 -70.0 + 60.2500 66.5000 -70.0 + 59.2500 73.5000 -70.0 + 53.2500 81.5000 -70.0 + 50.2500 88.5000 -70.0 + 47.5000 92.2500 -70.0 + 42.5000 108.2500 -70.0 + 41.2500 114.5000 -70.0 + 37.5000 123.2500 -70.0 + 37.2500 126.5000 -70.0 + 32.2500 139.5000 -70.0 + 31.2500 146.5000 -70.0 + 30.2500 148.5000 -70.0 + 29.2500 157.5000 -70.0 + 28.5000 159.2500 -70.0 + 28.2500 171.5000 -70.0 + 29.2500 173.5000 -70.0 + 29.2500 178.5000 -70.0 + 32.2500 188.5000 -70.0 + 38.2500 201.5000 -70.0 + 43.2500 208.5000 -70.0 + 49.5000 214.7500 -70.0 + 57.5000 220.7500 -70.0 + 67.2500 225.5000 -70.0 + 76.5000 225.7500 -70.0 + 85.2500 227.5000 -70.0 + 109.5000 228.7500 -70.0 + 111.5000 227.7500 -70.0 + 126.5000 227.7500 -70.0 + 128.5000 226.7500 -70.0 + 135.5000 225.7500 -70.0 + 143.5000 221.7500 -70.0 + 155.5000 212.7500 -70.0 + 164.5000 201.7500 -70.0 + 172.5000 188.7500 -70.0 + 172.7500 186.5000 -70.0 + 174.7500 182.5000 -70.0 + 175.7500 173.5000 -70.0 + 176.5000 171.7500 -70.0 + 176.7500 143.5000 -70.0 + 175.7500 141.5000 -70.0 + 175.7500 135.5000 -70.0 + 174.7500 133.5000 -70.0 + 174.7500 130.5000 -70.0 + 172.7500 126.5000 -70.0 + 172.7500 123.5000 -70.0 + 169.7500 117.5000 -70.0 + 169.7500 115.5000 -70.0 + 167.7500 111.5000 -70.0 + 167.7500 109.5000 -70.0 + 164.7500 103.5000 -70.0 + 164.7500 101.5000 -70.0 + 161.7500 97.5000 -70.0 + 161.7500 95.5000 -70.0 + 151.7500 75.5000 -70.0 + 152.5000 73.7500 -70.0 + 152.7500 68.5000 -70.0 + 145.7500 61.5000 -70.0 + 138.7500 57.5000 -70.0 + 134.5000 56.2500 -70.0 + 132.5000 57.2500 -70.0 + 126.5000 53.2500 -70.0 + 112.7500 49.5000 -70.0 +} -70.0 +{ -70.0 + 106.5000 51.7500 -70.0 + 115.5000 51.7500 -70.0 + 125.5000 56.7500 -70.0 + 129.2500 58.5000 -70.0 + 129.2500 61.5000 -70.0 + 132.5000 64.7500 -70.0 + 135.5000 63.7500 -70.0 + 141.5000 66.7500 -70.0 + 143.2500 70.5000 -70.0 + 141.5000 71.2500 -70.0 + 139.5000 72.2500 -70.0 + 138.7500 71.5000 -70.0 + 134.5000 70.2500 -70.0 + 132.5000 71.2500 -70.0 + 128.5000 71.2500 -70.0 + 121.5000 68.2500 -70.0 + 117.7500 64.5000 -70.0 + 111.5000 64.2500 -70.0 + 105.5000 62.2500 -70.0 + 103.5000 63.2500 -70.0 + 100.5000 63.2500 -70.0 + 98.5000 64.2500 -70.0 + 95.5000 64.2500 -70.0 + 89.5000 68.2500 -70.0 + 86.5000 68.2500 -70.0 + 84.7500 67.5000 -70.0 + 82.7500 63.5000 -70.0 + 80.7500 62.5000 -70.0 + 84.5000 58.7500 -70.0 + 86.5000 58.7500 -70.0 + 90.5000 55.7500 -70.0 + 92.5000 55.7500 -70.0 + 98.5000 52.7500 -70.0 + 101.5000 52.7500 -70.0 + 104.5000 53.7500 -70.0 +} -70.0 +{ -70.0 + 71.7500 64.5000 -70.0 + 72.5000 63.7500 -70.0 + 75.5000 63.7500 -70.0 + 77.2500 65.5000 -70.0 + 76.5000 66.2500 -70.0 + 72.5000 66.2500 -70.0 +} -70.0 +{ -70.0 + 103.7500 64.5000 -70.0 + 105.5000 63.7500 -70.0 + 109.2500 65.5000 -70.0 + 115.5000 65.7500 -70.0 + 118.5000 66.7500 -70.0 + 119.2500 68.5000 -70.0 + 127.2500 72.5000 -70.0 + 130.5000 72.7500 -70.0 + 136.5000 75.7500 -70.0 + 138.5000 74.7500 -70.0 + 141.5000 74.7500 -70.0 + 151.5000 80.7500 -70.0 + 154.2500 84.5000 -70.0 + 154.2500 87.5000 -70.0 + 156.2500 91.5000 -70.0 + 156.2500 93.5000 -70.0 + 162.2500 105.5000 -70.0 + 162.2500 120.5000 -70.0 + 164.2500 126.5000 -70.0 + 164.2500 132.5000 -70.0 + 166.2500 138.5000 -70.0 + 166.2500 142.5000 -70.0 + 167.2500 144.5000 -70.0 + 167.2500 151.5000 -70.0 + 168.2500 153.5000 -70.0 + 168.2500 163.5000 -70.0 + 170.2500 169.5000 -70.0 + 169.5000 171.2500 -70.0 + 169.2500 175.5000 -70.0 + 162.5000 189.2500 -70.0 + 157.2500 197.5000 -70.0 + 147.5000 207.2500 -70.0 + 127.5000 219.2500 -70.0 + 124.5000 219.2500 -70.0 + 122.5000 220.2500 -70.0 + 112.5000 222.2500 -70.0 + 102.5000 220.2500 -70.0 + 99.5000 221.2500 -70.0 + 97.7500 220.5000 -70.0 + 80.5000 220.2500 -70.0 + 72.5000 217.2500 -70.0 + 64.5000 212.2500 -70.0 + 51.7500 202.5000 -70.0 + 43.7500 191.5000 -70.0 + 37.7500 179.5000 -70.0 + 37.7500 177.5000 -70.0 + 35.7500 173.5000 -70.0 + 34.7500 164.5000 -70.0 + 39.7500 138.5000 -70.0 + 45.5000 125.7500 -70.0 + 45.7500 120.5000 -70.0 + 44.7500 118.5000 -70.0 + 46.7500 113.5000 -70.0 + 45.7500 110.5000 -70.0 + 47.7500 106.5000 -70.0 + 49.7500 96.5000 -70.0 + 54.5000 88.7500 -70.0 + 56.7500 80.5000 -70.0 + 66.5000 73.7500 -70.0 + 70.5000 73.7500 -70.0 + 76.5000 69.7500 -70.0 + 78.5000 69.7500 -70.0 + 80.5000 68.7500 -70.0 + 89.5000 69.7500 -70.0 + 98.5000 64.7500 -70.0 +} -70.0 +{ -70.0 + 68.5000 65.7500 -70.0 + 69.2500 66.5000 -70.0 + 68.5000 68.2500 -70.0 + 66.7500 67.5000 -70.0 +} -70.0 +{ -70.0 + 63.7500 69.5000 -70.0 + 64.5000 68.7500 -70.0 + 65.2500 69.5000 -70.0 + 64.5000 71.2500 -70.0 +} -70.0 +{ -70.0 + 66.7500 70.5000 -70.0 + 67.5000 69.7500 -70.0 + 69.2500 70.5000 -70.0 + 68.5000 72.2500 -70.0 +} -70.0 +{ -70.0 + 144.7500 70.5000 -70.0 + 145.5000 69.7500 -70.0 + 149.2500 71.5000 -70.0 + 147.5000 73.2500 -70.0 + 145.7500 72.5000 -70.0 +} -70.0 +v 256 z -72.000000 -64.0 +{ -72.0 + 101.2500 49.5000 -72.0 + 100.5000 50.2500 -72.0 + 98.5000 50.2500 -72.0 + 94.5000 52.2500 -72.0 + 92.5000 52.2500 -72.0 + 90.5000 53.2500 -72.0 + 87.5000 53.2500 -72.0 + 83.5000 55.2500 -72.0 + 78.5000 55.2500 -72.0 + 76.5000 56.2500 -72.0 + 74.5000 56.2500 -72.0 + 67.5000 59.2500 -72.0 + 62.5000 63.2500 -72.0 + 60.5000 64.2500 -72.0 + 59.2500 67.5000 -72.0 + 60.2500 69.5000 -72.0 + 59.2500 74.5000 -72.0 + 57.5000 76.2500 -72.0 + 54.2500 80.5000 -72.0 + 47.5000 93.2500 -72.0 + 47.2500 95.5000 -72.0 + 44.2500 104.5000 -72.0 + 42.5000 108.2500 -72.0 + 42.2500 110.5000 -72.0 + 41.2500 113.5000 -72.0 + 40.5000 115.2500 -72.0 + 37.2500 124.5000 -72.0 + 36.5000 126.2500 -72.0 + 33.2500 135.5000 -72.0 + 32.5000 137.2500 -72.0 + 31.2500 145.5000 -72.0 + 30.2500 147.5000 -72.0 + 29.2500 156.5000 -72.0 + 28.5000 158.2500 -72.0 + 28.2500 172.5000 -72.0 + 29.2500 174.5000 -72.0 + 29.2500 179.5000 -72.0 + 30.2500 181.5000 -72.0 + 30.2500 183.5000 -72.0 + 31.2500 185.5000 -72.0 + 31.5000 187.7500 -72.0 + 37.2500 200.5000 -72.0 + 40.2500 204.5000 -72.0 + 41.2500 206.5000 -72.0 + 52.2500 217.5000 -72.0 + 56.5000 220.7500 -72.0 + 62.5000 223.7500 -72.0 + 66.2500 225.5000 -72.0 + 68.5000 225.7500 -72.0 + 73.5000 226.7500 -72.0 + 75.5000 225.7500 -72.0 + 77.2500 226.5000 -72.0 + 80.5000 226.7500 -72.0 + 87.5000 227.7500 -72.0 + 89.2500 228.5000 -72.0 + 112.5000 228.7500 -72.0 + 114.5000 227.7500 -72.0 + 127.5000 227.7500 -72.0 + 129.5000 226.7500 -72.0 + 133.5000 226.7500 -72.0 + 145.5000 220.7500 -72.0 + 149.5000 217.7500 -72.0 + 151.5000 216.7500 -72.0 + 158.5000 209.7500 -72.0 + 163.5000 203.7500 -72.0 + 167.7500 197.5000 -72.0 + 171.5000 190.7500 -72.0 + 173.7500 184.5000 -72.0 + 174.5000 182.7500 -72.0 + 175.7500 174.5000 -72.0 + 176.5000 172.7500 -72.0 + 176.7500 139.5000 -72.0 + 175.7500 137.5000 -72.0 + 175.7500 134.5000 -72.0 + 174.7500 132.5000 -72.0 + 174.7500 130.5000 -72.0 + 173.7500 128.5000 -72.0 + 173.7500 126.5000 -72.0 + 171.7500 122.5000 -72.0 + 171.7500 120.5000 -72.0 + 169.7500 116.5000 -72.0 + 169.7500 114.5000 -72.0 + 166.7500 108.5000 -72.0 + 166.7500 106.5000 -72.0 + 154.7500 82.5000 -72.0 + 151.7500 77.5000 -72.0 + 151.7500 75.5000 -72.0 + 154.7500 68.5000 -72.0 + 150.7500 64.5000 -72.0 + 149.7500 62.5000 -72.0 + 147.5000 61.2500 -72.0 + 141.5000 58.2500 -72.0 + 139.7500 57.5000 -72.0 + 136.5000 57.2500 -72.0 + 136.2500 58.5000 -72.0 + 137.5000 59.7500 -72.0 + 139.5000 60.7500 -72.0 + 144.2500 66.5000 -72.0 + 146.2500 70.5000 -72.0 + 143.5000 73.2500 -72.0 + 141.5000 73.2500 -72.0 + 139.5000 74.2500 -72.0 + 136.5000 74.2500 -72.0 + 132.5000 72.2500 -72.0 + 125.5000 71.2500 -72.0 + 117.7500 65.5000 -72.0 + 110.5000 65.2500 -72.0 + 105.7500 61.5000 -72.0 + 101.5000 64.2500 -72.0 + 96.5000 64.2500 -72.0 + 88.5000 70.2500 -72.0 + 84.5000 67.2500 -72.0 + 78.5000 70.2500 -72.0 + 73.5000 70.2500 -72.0 + 69.7500 68.5000 -72.0 + 69.7500 66.5000 -72.0 + 70.7500 63.5000 -72.0 + 73.5000 61.7500 -72.0 + 77.5000 59.7500 -72.0 + 81.5000 56.7500 -72.0 + 83.5000 55.7500 -72.0 + 85.2500 57.5000 -72.0 + 85.2500 60.5000 -72.0 + 89.7500 58.5000 -72.0 + 90.7500 56.5000 -72.0 + 92.5000 55.7500 -72.0 + 98.5000 52.7500 -72.0 + 103.5000 52.7500 -72.0 + 107.5000 50.7500 -72.0 + 112.5000 50.7500 -72.0 + 118.2500 53.5000 -72.0 + 120.5000 53.7500 -72.0 + 124.5000 57.7500 -72.0 + 126.5000 58.7500 -72.0 + 128.5000 56.7500 -72.0 + 130.5000 56.7500 -72.0 + 130.7500 55.5000 -72.0 + 126.7500 53.5000 -72.0 + 124.5000 53.2500 -72.0 + 115.5000 50.2500 -72.0 + 113.7500 49.5000 -72.0 +} -72.0 +{ -72.0 + 102.7500 65.5000 -72.0 + 103.5000 64.7500 -72.0 + 107.5000 64.7500 -72.0 + 111.5000 67.7500 -72.0 + 113.5000 66.7500 -72.0 + 117.5000 66.7500 -72.0 + 119.2500 68.5000 -72.0 + 123.5000 71.7500 -72.0 + 125.5000 72.7500 -72.0 + 126.2500 74.5000 -72.0 + 131.5000 74.7500 -72.0 + 135.5000 76.7500 -72.0 + 137.5000 75.7500 -72.0 + 142.5000 75.7500 -72.0 + 144.5000 77.7500 -72.0 + 151.2500 81.5000 -72.0 + 154.2500 86.5000 -72.0 + 153.2500 88.5000 -72.0 + 156.2500 94.5000 -72.0 + 160.2500 101.5000 -72.0 + 160.2500 107.5000 -72.0 + 161.2500 109.5000 -72.0 + 161.2500 111.5000 -72.0 + 162.2500 113.5000 -72.0 + 162.2500 118.5000 -72.0 + 163.2500 120.5000 -72.0 + 163.2500 122.5000 -72.0 + 164.2500 124.5000 -72.0 + 164.2500 126.5000 -72.0 + 165.2500 128.5000 -72.0 + 165.2500 133.5000 -72.0 + 166.2500 135.5000 -72.0 + 166.2500 139.5000 -72.0 + 167.2500 141.5000 -72.0 + 167.2500 145.5000 -72.0 + 168.2500 147.5000 -72.0 + 168.2500 162.5000 -72.0 + 171.2500 168.5000 -72.0 + 169.5000 171.2500 -72.0 + 169.2500 174.5000 -72.0 + 168.2500 179.5000 -72.0 + 165.2500 183.5000 -72.0 + 163.2500 187.5000 -72.0 + 158.2500 195.5000 -72.0 + 156.2500 199.5000 -72.0 + 146.5000 208.2500 -72.0 + 144.5000 209.2500 -72.0 + 136.5000 214.2500 -72.0 + 127.5000 219.2500 -72.0 + 125.5000 219.2500 -72.0 + 121.5000 221.2500 -72.0 + 119.5000 221.2500 -72.0 + 117.5000 222.2500 -72.0 + 110.5000 222.2500 -72.0 + 108.7500 221.5000 -72.0 + 99.5000 221.2500 -72.0 + 92.5000 220.2500 -72.0 + 90.5000 221.2500 -72.0 + 84.5000 221.2500 -72.0 + 79.5000 220.2500 -72.0 + 76.5000 219.2500 -72.0 + 66.7500 214.5000 -72.0 + 60.5000 210.2500 -72.0 + 58.5000 209.2500 -72.0 + 49.7500 200.5000 -72.0 + 40.7500 188.5000 -72.0 + 40.7500 186.5000 -72.0 + 37.7500 180.5000 -72.0 + 37.7500 178.5000 -72.0 + 35.7500 174.5000 -72.0 + 35.7500 169.5000 -72.0 + 34.7500 167.5000 -72.0 + 34.7500 163.5000 -72.0 + 33.7500 161.5000 -72.0 + 35.7500 158.5000 -72.0 + 36.7500 151.5000 -72.0 + 37.7500 146.5000 -72.0 + 41.7500 134.5000 -72.0 + 45.5000 125.7500 -72.0 + 45.7500 116.5000 -72.0 + 46.5000 114.7500 -72.0 + 46.7500 108.5000 -72.0 + 48.5000 104.7500 -72.0 + 48.7500 101.5000 -72.0 + 49.7500 98.5000 -72.0 + 52.5000 92.7500 -72.0 + 55.7500 83.5000 -72.0 + 57.5000 79.7500 -72.0 + 62.5000 76.7500 -72.0 + 66.5000 73.7500 -72.0 + 68.5000 73.7500 -72.0 + 71.5000 74.7500 -72.0 + 75.5000 72.7500 -72.0 + 77.2500 73.5000 -72.0 + 80.5000 73.7500 -72.0 + 80.7500 72.5000 -72.0 + 82.5000 70.7500 -72.0 + 87.5000 71.7500 -72.0 + 93.5000 68.7500 -72.0 + 98.5000 65.7500 -72.0 +} -72.0 +{ -72.0 + 64.7500 67.5000 -72.0 + 65.5000 66.7500 -72.0 + 68.2500 70.5000 -72.0 + 67.5000 71.2500 -72.0 + 63.7500 69.5000 -72.0 +} -72.0 +{ -72.0 + 147.7500 71.5000 -72.0 + 148.5000 70.7500 -72.0 + 150.2500 71.5000 -72.0 + 150.2500 73.5000 -72.0 + 149.5000 75.2500 -72.0 + 147.7500 73.5000 -72.0 +} -72.0 +{ -72.0 + 61.7500 72.5000 -72.0 + 62.5000 71.7500 -72.0 + 63.2500 72.5000 -72.0 + 62.5000 73.2500 -72.0 +} -72.0 +v 199 z -74.000000 -64.0 +{ -74.0 + 105.2500 48.5000 -74.0 + 104.5000 49.2500 -74.0 + 100.5000 49.2500 -74.0 + 92.5000 53.2500 -74.0 + 90.5000 53.2500 -74.0 + 88.5000 54.2500 -74.0 + 91.2500 58.5000 -74.0 + 94.5000 55.7500 -74.0 + 98.5000 52.7500 -74.0 + 100.5000 52.7500 -74.0 + 102.5000 51.7500 -74.0 + 105.5000 52.7500 -74.0 + 106.5000 50.7500 -74.0 + 112.5000 50.7500 -74.0 + 120.2500 54.5000 -74.0 + 121.5000 56.7500 -74.0 + 123.5000 57.7500 -74.0 + 124.7500 54.5000 -74.0 + 113.7500 49.5000 -74.0 + 111.5000 49.2500 -74.0 + 109.7500 48.5000 -74.0 +} -74.0 +{ -74.0 + 68.2500 57.5000 -74.0 + 66.5000 58.2500 -74.0 + 59.5000 64.2500 -74.0 + 59.2500 68.5000 -74.0 + 60.2500 71.5000 -74.0 + 58.2500 76.5000 -74.0 + 55.2500 79.5000 -74.0 + 47.5000 94.2500 -74.0 + 47.2500 96.5000 -74.0 + 32.2500 137.5000 -74.0 + 28.5000 157.2500 -74.0 + 28.2500 172.5000 -74.0 + 29.2500 174.5000 -74.0 + 29.2500 179.5000 -74.0 + 30.2500 181.5000 -74.0 + 31.2500 188.5000 -74.0 + 39.2500 204.5000 -74.0 + 43.2500 208.5000 -74.0 + 44.5000 210.7500 -74.0 + 54.5000 219.7500 -74.0 + 61.2500 223.5000 -74.0 + 69.2500 226.5000 -74.0 + 81.5000 226.7500 -74.0 + 86.2500 228.5000 -74.0 + 107.5000 229.7500 -74.0 + 109.5000 228.7500 -74.0 + 113.5000 228.7500 -74.0 + 115.5000 227.7500 -74.0 + 128.5000 227.7500 -74.0 + 130.5000 226.7500 -74.0 + 132.5000 226.7500 -74.0 + 143.5000 222.7500 -74.0 + 150.5000 217.7500 -74.0 + 160.7500 207.5000 -74.0 + 170.5000 193.7500 -74.0 + 173.7500 184.5000 -74.0 + 176.5000 172.7500 -74.0 + 177.7500 157.5000 -74.0 + 176.7500 155.5000 -74.0 + 177.7500 143.5000 -74.0 + 176.7500 141.5000 -74.0 + 176.7500 137.5000 -74.0 + 175.7500 135.5000 -74.0 + 174.7500 128.5000 -74.0 + 172.7500 124.5000 -74.0 + 172.7500 122.5000 -74.0 + 169.7500 116.5000 -74.0 + 169.7500 114.5000 -74.0 + 165.7500 106.5000 -74.0 + 163.7500 100.5000 -74.0 + 158.7500 92.5000 -74.0 + 154.7500 82.5000 -74.0 + 151.7500 79.5000 -74.0 + 151.7500 75.5000 -74.0 + 155.5000 69.7500 -74.0 + 155.7500 67.5000 -74.0 + 152.7500 63.5000 -74.0 + 148.7500 60.5000 -74.0 + 143.5000 59.2500 -74.0 + 143.2500 61.5000 -74.0 + 145.2500 63.5000 -74.0 + 148.2500 69.5000 -74.0 + 147.5000 70.2500 -74.0 + 147.2500 72.5000 -74.0 + 145.5000 74.2500 -74.0 + 141.5000 76.2500 -74.0 + 139.5000 76.2500 -74.0 + 139.2500 77.5000 -74.0 + 142.5000 77.7500 -74.0 + 148.5000 80.7500 -74.0 + 153.2500 88.5000 -74.0 + 153.2500 90.5000 -74.0 + 159.2500 101.5000 -74.0 + 159.2500 106.5000 -74.0 + 161.2500 110.5000 -74.0 + 163.2500 120.5000 -74.0 + 165.2500 124.5000 -74.0 + 165.2500 126.5000 -74.0 + 166.2500 128.5000 -74.0 + 166.2500 134.5000 -74.0 + 167.2500 136.5000 -74.0 + 167.2500 140.5000 -74.0 + 169.2500 147.5000 -74.0 + 169.2500 162.5000 -74.0 + 171.2500 166.5000 -74.0 + 169.5000 168.2500 -74.0 + 169.2500 175.5000 -74.0 + 167.5000 179.2500 -74.0 + 167.2500 181.5000 -74.0 + 155.2500 200.5000 -74.0 + 146.5000 208.2500 -74.0 + 125.5000 220.2500 -74.0 + 123.5000 220.2500 -74.0 + 119.5000 222.2500 -74.0 + 109.5000 222.2500 -74.0 + 107.7500 221.5000 -74.0 + 101.5000 221.2500 -74.0 + 99.5000 222.2500 -74.0 + 97.7500 221.5000 -74.0 + 81.5000 221.2500 -74.0 + 72.5000 218.2500 -74.0 + 60.5000 211.2500 -74.0 + 50.5000 202.2500 -74.0 + 42.7500 191.5000 -74.0 + 37.7500 181.5000 -74.0 + 37.7500 179.5000 -74.0 + 35.7500 175.5000 -74.0 + 35.7500 170.5000 -74.0 + 34.7500 168.5000 -74.0 + 34.7500 159.5000 -74.0 + 36.7500 149.5000 -74.0 + 45.5000 125.7500 -74.0 + 46.7500 113.5000 -74.0 + 48.5000 111.7500 -74.0 + 48.7500 109.5000 -74.0 + 46.7500 107.5000 -74.0 + 49.7500 102.5000 -74.0 + 50.7500 97.5000 -74.0 + 53.7500 91.5000 -74.0 + 52.7500 89.5000 -74.0 + 54.7500 84.5000 -74.0 + 57.5000 80.7500 -74.0 + 65.5000 74.7500 -74.0 + 67.5000 74.7500 -74.0 + 73.5000 76.7500 -74.0 + 75.5000 74.7500 -74.0 + 79.2500 76.5000 -74.0 + 81.5000 76.7500 -74.0 + 83.5000 74.7500 -74.0 + 85.5000 74.7500 -74.0 + 87.5000 72.7500 -74.0 + 96.7500 67.5000 -74.0 + 94.5000 67.2500 -74.0 + 90.5000 69.2500 -74.0 + 88.5000 69.2500 -74.0 + 82.5000 73.2500 -74.0 + 72.5000 73.2500 -74.0 + 69.5000 72.2500 -74.0 + 66.7500 69.5000 -74.0 + 67.7500 64.5000 -74.0 + 74.7500 57.5000 -74.0 +} -74.0 +{ -74.0 + 105.2500 61.5000 -74.0 + 105.2500 62.5000 -74.0 + 100.5000 66.2500 -74.0 + 97.5000 66.2500 -74.0 + 98.2500 67.5000 -74.0 + 101.5000 67.7500 -74.0 + 103.5000 65.7500 -74.0 + 108.5000 65.7500 -74.0 + 110.5000 68.7500 -74.0 + 112.5000 67.7500 -74.0 + 117.5000 67.7500 -74.0 + 123.2500 73.5000 -74.0 + 125.2500 77.5000 -74.0 + 125.2500 79.5000 -74.0 + 126.5000 79.7500 -74.0 + 128.5000 77.7500 -74.0 + 135.5000 77.7500 -74.0 + 136.7500 76.5000 -74.0 + 131.5000 76.2500 -74.0 + 125.5000 73.2500 -74.0 + 122.7500 68.5000 -74.0 + 120.5000 68.2500 -74.0 + 115.5000 66.2500 -74.0 + 113.5000 67.2500 -74.0 + 111.5000 67.2500 -74.0 +} -74.0 +{ -74.0 + 62.7500 69.5000 -74.0 + 63.5000 68.7500 -74.0 + 65.2500 69.5000 -74.0 + 65.2500 71.5000 -74.0 + 63.5000 73.2500 -74.0 + 61.7500 72.5000 -74.0 + 62.5000 71.7500 -74.0 +} -74.0 +{ -74.0 + 150.5000 71.7500 -74.0 + 151.2500 72.5000 -74.0 + 150.2500 75.5000 -74.0 + 148.5000 76.2500 -74.0 + 147.7500 74.5000 -74.0 +} -74.0 +v 191 z -76.000000 -74.0 +{ -74.0 + 103.2500 48.5000 -74.0 + 101.5000 49.2500 -74.0 + 93.5000 54.2500 -74.0 + 93.2500 61.5000 -74.0 + 96.5000 54.7500 -74.0 + 102.5000 51.7500 -74.0 + 104.5000 51.7500 -74.0 + 106.2500 53.5000 -74.0 + 107.5000 51.7500 -74.0 + 113.5000 51.7500 -74.0 + 116.5000 52.7500 -74.0 + 120.2500 56.5000 -74.0 + 120.2500 59.5000 -74.0 + 121.7500 56.5000 -74.0 + 120.7500 53.5000 -74.0 + 111.7500 48.5000 -74.0 +} -74.0 +{ -74.0 + 65.2500 58.5000 -74.0 + 63.5000 59.2500 -74.0 + 57.5000 65.2500 -74.0 + 60.2500 70.5000 -74.0 + 60.2500 72.5000 -74.0 + 57.5000 78.2500 -74.0 + 54.2500 82.5000 -74.0 + 48.2500 94.5000 -74.0 + 38.2500 121.5000 -74.0 + 32.2500 135.5000 -74.0 + 31.2500 140.5000 -74.0 + 28.5000 156.2500 -74.0 + 28.2500 172.5000 -74.0 + 29.2500 174.5000 -74.0 + 29.2500 179.5000 -74.0 + 30.2500 181.5000 -74.0 + 30.2500 184.5000 -74.0 + 35.2500 197.5000 -74.0 + 41.2500 207.5000 -74.0 + 56.2500 221.5000 -74.0 + 68.2500 226.5000 -74.0 + 78.5000 226.7500 -74.0 + 89.2500 229.5000 -74.0 + 110.5000 229.7500 -74.0 + 112.5000 228.7500 -74.0 + 125.5000 228.7500 -74.0 + 127.5000 227.7500 -74.0 + 130.5000 227.7500 -74.0 + 143.5000 222.7500 -74.0 + 153.5000 215.7500 -74.0 + 160.7500 207.5000 -74.0 + 170.5000 193.7500 -74.0 + 173.7500 184.5000 -74.0 + 176.5000 172.7500 -74.0 + 176.7500 165.5000 -74.0 + 177.5000 163.7500 -74.0 + 177.7500 141.5000 -74.0 + 176.7500 139.5000 -74.0 + 176.7500 134.5000 -74.0 + 174.7500 130.5000 -74.0 + 174.7500 127.5000 -74.0 + 163.7500 101.5000 -74.0 + 155.7500 89.5000 -74.0 + 155.7500 87.5000 -74.0 + 151.7500 79.5000 -74.0 + 151.7500 76.5000 -74.0 + 152.7500 73.5000 -74.0 + 156.5000 70.7500 -74.0 + 156.7500 67.5000 -74.0 + 154.5000 64.2500 -74.0 + 150.7500 61.5000 -74.0 + 147.5000 61.2500 -74.0 + 147.2500 62.5000 -74.0 + 149.2500 66.5000 -74.0 + 149.2500 70.5000 -74.0 + 147.2500 75.5000 -74.0 + 148.5000 75.7500 -74.0 + 150.2500 77.5000 -74.0 + 149.5000 79.2500 -74.0 + 147.5000 78.2500 -74.0 + 146.7500 76.5000 -74.0 + 145.5000 76.2500 -74.0 + 141.5000 78.2500 -74.0 + 138.5000 78.2500 -74.0 + 136.5000 79.2500 -74.0 + 134.7500 78.5000 -74.0 + 125.5000 78.2500 -74.0 + 120.7500 68.5000 -74.0 + 110.5000 68.2500 -74.0 + 106.7500 63.5000 -74.0 + 104.5000 64.2500 -74.0 + 101.5000 68.2500 -74.0 + 99.5000 68.2500 -74.0 + 100.5000 69.7500 -74.0 + 103.5000 68.7500 -74.0 + 103.7500 66.5000 -74.0 + 105.5000 64.7500 -74.0 + 107.2500 65.5000 -74.0 + 110.5000 69.7500 -74.0 + 112.5000 68.7500 -74.0 + 115.5000 68.7500 -74.0 + 117.2500 69.5000 -74.0 + 123.2500 76.5000 -74.0 + 123.2500 78.5000 -74.0 + 125.2500 80.5000 -74.0 + 136.5000 80.7500 -74.0 + 139.5000 81.7500 -74.0 + 143.5000 79.7500 -74.0 + 145.5000 80.7500 -74.0 + 147.2500 84.5000 -74.0 + 151.2500 88.5000 -74.0 + 151.2500 91.5000 -74.0 + 153.2500 93.5000 -74.0 + 156.2500 98.5000 -74.0 + 156.2500 102.5000 -74.0 + 161.2500 110.5000 -74.0 + 161.2500 112.5000 -74.0 + 164.2500 118.5000 -74.0 + 164.2500 121.5000 -74.0 + 166.2500 125.5000 -74.0 + 166.2500 129.5000 -74.0 + 168.2500 136.5000 -74.0 + 168.2500 141.5000 -74.0 + 170.2500 147.5000 -74.0 + 170.2500 161.5000 -74.0 + 171.2500 163.5000 -74.0 + 171.2500 165.5000 -74.0 + 169.5000 167.2500 -74.0 + 169.2500 175.5000 -74.0 + 167.5000 179.2500 -74.0 + 167.2500 181.5000 -74.0 + 158.2500 195.5000 -74.0 + 151.5000 204.2500 -74.0 + 149.2500 205.5000 -74.0 + 148.2500 207.5000 -74.0 + 140.5000 212.2500 -74.0 + 125.5000 220.2500 -74.0 + 123.5000 220.2500 -74.0 + 119.5000 222.2500 -74.0 + 108.5000 222.2500 -74.0 + 103.5000 221.2500 -74.0 + 101.5000 222.2500 -74.0 + 98.5000 222.2500 -74.0 + 96.7500 221.5000 -74.0 + 80.5000 221.2500 -74.0 + 71.7500 217.5000 -74.0 + 69.5000 217.2500 -74.0 + 64.5000 213.2500 -74.0 + 58.5000 210.2500 -74.0 + 49.7500 201.5000 -74.0 + 43.7500 193.5000 -74.0 + 37.7500 181.5000 -74.0 + 37.7500 179.5000 -74.0 + 35.7500 175.5000 -74.0 + 35.7500 173.5000 -74.0 + 34.7500 171.5000 -74.0 + 34.7500 159.5000 -74.0 + 33.7500 157.5000 -74.0 + 35.5000 154.7500 -74.0 + 36.7500 148.5000 -74.0 + 45.5000 125.7500 -74.0 + 46.7500 117.5000 -74.0 + 49.5000 111.7500 -74.0 + 49.7500 107.5000 -74.0 + 48.7500 105.5000 -74.0 + 48.7500 103.5000 -74.0 + 51.7500 100.5000 -74.0 + 52.7500 95.5000 -74.0 + 54.7500 84.5000 -74.0 + 64.5000 75.7500 -74.0 + 67.5000 75.7500 -74.0 + 69.2500 77.5000 -74.0 + 80.5000 78.7500 -74.0 + 86.5000 75.7500 -74.0 + 93.7500 69.5000 -74.0 + 90.5000 69.2500 -74.0 + 89.5000 71.2500 -74.0 + 81.5000 76.2500 -74.0 + 76.5000 76.2500 -74.0 + 67.5000 74.2500 -74.0 + 65.7500 72.5000 -74.0 + 65.7500 64.5000 -74.0 + 69.7500 58.5000 -74.0 +} -74.0 +{ -74.0 + 62.7500 72.5000 -74.0 + 63.5000 71.7500 -74.0 + 64.2500 72.5000 -74.0 + 63.5000 73.2500 -74.0 +} -74.0 +{ -74.0 + 149.7500 73.5000 -74.0 + 150.5000 72.7500 -74.0 + 151.2500 73.5000 -74.0 + 150.5000 74.2500 -74.0 +} -74.0 +{ -74.0 + 61.7500 217.5000 -74.0 + 62.5000 216.7500 -74.0 + 63.2500 217.5000 -74.0 + 62.5000 218.2500 -74.0 +} -74.0 +v 184 z -78.000000 -64.0 +{ -78.0 + 105.2500 47.5000 -78.0 + 104.5000 48.2500 -78.0 + 102.5000 48.2500 -78.0 + 97.5000 52.2500 -78.0 + 95.5000 53.2500 -78.0 + 94.5000 55.2500 -78.0 + 94.2500 60.5000 -78.0 + 95.5000 60.7500 -78.0 + 95.7500 58.5000 -78.0 + 96.7500 55.5000 -78.0 + 101.5000 52.7500 -78.0 + 105.5000 52.7500 -78.0 + 107.5000 54.7500 -78.0 + 111.5000 52.7500 -78.0 + 113.2500 53.5000 -78.0 + 115.5000 53.7500 -78.0 + 118.2500 56.5000 -78.0 + 118.2500 58.5000 -78.0 + 119.5000 61.7500 -78.0 + 119.7500 54.5000 -78.0 + 114.5000 50.2500 -78.0 + 110.5000 48.2500 -78.0 + 108.7500 47.5000 -78.0 +} -78.0 +{ -78.0 + 64.2500 58.5000 -78.0 + 60.5000 60.2500 -78.0 + 58.2500 62.5000 -78.0 + 56.2500 66.5000 -78.0 + 60.2500 70.5000 -78.0 + 60.2500 73.5000 -78.0 + 49.5000 92.2500 -78.0 + 31.5000 137.2500 -78.0 + 31.2500 139.5000 -78.0 + 28.5000 155.2500 -78.0 + 28.2500 172.5000 -78.0 + 29.2500 174.5000 -78.0 + 29.2500 179.5000 -78.0 + 30.2500 181.5000 -78.0 + 30.2500 184.5000 -78.0 + 35.2500 197.5000 -78.0 + 41.2500 207.5000 -78.0 + 53.5000 219.7500 -78.0 + 60.2500 223.5000 -78.0 + 66.5000 225.7500 -78.0 + 74.2500 227.5000 -78.0 + 75.5000 226.7500 -78.0 + 93.2500 230.5000 -78.0 + 106.5000 230.7500 -78.0 + 108.5000 229.7500 -78.0 + 112.5000 229.7500 -78.0 + 114.5000 228.7500 -78.0 + 126.5000 228.7500 -78.0 + 128.5000 227.7500 -78.0 + 132.5000 227.7500 -78.0 + 140.5000 223.7500 -78.0 + 142.5000 223.7500 -78.0 + 154.5000 214.7500 -78.0 + 166.5000 199.7500 -78.0 + 172.7500 188.5000 -78.0 + 174.7500 181.5000 -78.0 + 175.7500 174.5000 -78.0 + 177.5000 164.7500 -78.0 + 177.7500 139.5000 -78.0 + 176.7500 137.5000 -78.0 + 175.7500 130.5000 -78.0 + 173.7500 126.5000 -78.0 + 173.5000 124.2500 -78.0 + 160.7500 96.5000 -78.0 + 155.7500 90.5000 -78.0 + 151.7500 82.5000 -78.0 + 151.7500 75.5000 -78.0 + 157.5000 70.7500 -78.0 + 157.7500 68.5000 -78.0 + 156.5000 65.2500 -78.0 + 152.7500 62.5000 -78.0 + 149.2500 62.5000 -78.0 + 151.2500 68.5000 -78.0 + 148.2500 74.5000 -78.0 + 149.2500 77.5000 -78.0 + 146.5000 80.2500 -78.0 + 142.7500 79.5000 -78.0 + 141.5000 80.2500 -78.0 + 127.5000 81.2500 -78.0 + 124.5000 80.2500 -78.0 + 122.5000 77.2500 -78.0 + 122.2500 79.5000 -78.0 + 123.5000 80.7500 -78.0 + 129.2500 83.5000 -78.0 + 138.5000 83.7500 -78.0 + 144.2500 86.5000 -78.0 + 144.2500 88.5000 -78.0 + 146.5000 88.7500 -78.0 + 149.5000 92.7500 -78.0 + 153.2500 95.5000 -78.0 + 151.2500 96.5000 -78.0 + 152.2500 99.5000 -78.0 + 157.2500 104.5000 -78.0 + 163.2500 113.5000 -78.0 + 163.2500 115.5000 -78.0 + 165.2500 119.5000 -78.0 + 165.2500 122.5000 -78.0 + 167.2500 126.5000 -78.0 + 168.2500 135.5000 -78.0 + 170.2500 137.5000 -78.0 + 169.5000 138.2500 -78.0 + 169.2500 142.5000 -78.0 + 170.2500 144.5000 -78.0 + 170.2500 152.5000 -78.0 + 171.2500 155.5000 -78.0 + 170.2500 158.5000 -78.0 + 172.2500 162.5000 -78.0 + 169.5000 167.2500 -78.0 + 169.2500 171.5000 -78.0 + 170.2500 173.5000 -78.0 + 169.2500 177.5000 -78.0 + 167.5000 179.2500 -78.0 + 167.2500 181.5000 -78.0 + 157.2500 197.5000 -78.0 + 148.5000 207.2500 -78.0 + 130.5000 218.2500 -78.0 + 120.5000 222.2500 -78.0 + 118.5000 222.2500 -78.0 + 116.5000 223.2500 -78.0 + 97.5000 222.2500 -78.0 + 95.7500 221.5000 -78.0 + 90.5000 221.2500 -78.0 + 88.5000 222.2500 -78.0 + 76.5000 220.2500 -78.0 + 68.7500 216.5000 -78.0 + 58.5000 210.2500 -78.0 + 50.7500 203.5000 -78.0 + 44.7500 195.5000 -78.0 + 38.7500 184.5000 -78.0 + 38.7500 182.5000 -78.0 + 35.7500 176.5000 -78.0 + 35.7500 172.5000 -78.0 + 34.7500 170.5000 -78.0 + 34.7500 152.5000 -78.0 + 36.7500 146.5000 -78.0 + 43.5000 130.7500 -78.0 + 46.7500 118.5000 -78.0 + 50.5000 110.7500 -78.0 + 51.7500 101.5000 -78.0 + 54.5000 95.7500 -78.0 + 54.7500 87.5000 -78.0 + 56.7500 82.5000 -78.0 + 59.5000 79.7500 -78.0 + 65.5000 76.7500 -78.0 + 69.2500 79.5000 -78.0 + 74.5000 79.7500 -78.0 + 76.2500 80.5000 -78.0 + 77.2500 82.5000 -78.0 + 80.7500 82.5000 -78.0 + 81.7500 80.5000 -78.0 + 84.7500 78.5000 -78.0 + 72.5000 78.2500 -78.0 + 66.5000 75.2500 -78.0 + 63.7500 69.5000 -78.0 + 63.7500 66.5000 -78.0 + 66.5000 59.7500 -78.0 + 65.7500 58.5000 -78.0 +} -78.0 +{ -78.0 + 104.2500 64.5000 -78.0 + 102.5000 70.2500 -78.0 + 99.5000 70.2500 -78.0 + 100.5000 71.7500 -78.0 + 102.5000 70.7500 -78.0 + 105.7500 71.5000 -78.0 + 104.7500 69.5000 -78.0 +} -78.0 +{ -78.0 + 108.2500 65.5000 -78.0 + 108.5000 69.7500 -78.0 + 110.5000 70.7500 -78.0 + 112.5000 69.7500 -78.0 + 109.7500 68.5000 -78.0 +} -78.0 +{ -78.0 + 92.2500 70.5000 -78.0 + 91.2500 72.5000 -78.0 + 88.2500 75.5000 -78.0 + 87.2500 77.5000 -78.0 + 88.5000 77.7500 -78.0 + 93.7500 70.5000 -78.0 +} -78.0 +{ -78.0 + 119.2500 71.5000 -78.0 + 118.5000 72.2500 -78.0 + 119.2500 74.5000 -78.0 + 121.7500 76.5000 -78.0 + 120.7500 74.5000 -78.0 + 120.7500 72.5000 -78.0 +} -78.0 +v 194 z -80.000000 -64.0 +{ -80.0 + 106.2500 46.5000 -80.0 + 102.5000 48.2500 -80.0 + 95.5000 55.2500 -80.0 + 95.2500 60.5000 -80.0 + 96.5000 59.7500 -80.0 + 96.7500 57.5000 -80.0 + 98.5000 55.7500 -80.0 + 105.5000 54.7500 -80.0 + 108.5000 55.7500 -80.0 + 110.5000 54.7500 -80.0 + 115.5000 54.7500 -80.0 + 118.5000 58.7500 -80.0 + 118.7500 56.5000 -80.0 + 114.7500 50.5000 -80.0 + 107.7500 46.5000 -80.0 +} -80.0 +{ -80.0 + 61.2500 59.5000 -80.0 + 56.5000 63.2500 -80.0 + 56.5000 67.7500 -80.0 + 60.2500 70.5000 -80.0 + 60.2500 75.5000 -80.0 + 58.2500 79.5000 -80.0 + 54.5000 85.2500 -80.0 + 54.2500 87.5000 -80.0 + 48.5000 95.2500 -80.0 + 48.2500 97.5000 -80.0 + 45.2500 103.5000 -80.0 + 44.2500 108.5000 -80.0 + 38.2500 120.5000 -80.0 + 31.2500 138.5000 -80.0 + 29.5000 145.2500 -80.0 + 29.2500 152.5000 -80.0 + 28.5000 154.2500 -80.0 + 28.2500 171.5000 -80.0 + 29.2500 173.5000 -80.0 + 29.2500 178.5000 -80.0 + 30.2500 180.5000 -80.0 + 31.5000 188.7500 -80.0 + 37.2500 201.5000 -80.0 + 41.2500 207.5000 -80.0 + 51.2500 217.5000 -80.0 + 57.2500 222.5000 -80.0 + 59.5000 222.7500 -80.0 + 65.5000 225.7500 -80.0 + 72.2500 227.5000 -80.0 + 79.5000 227.7500 -80.0 + 95.2500 231.5000 -80.0 + 104.5000 231.7500 -80.0 + 106.5000 230.7500 -80.0 + 115.5000 229.7500 -80.0 + 117.5000 228.7500 -80.0 + 118.2500 229.5000 -80.0 + 119.5000 228.7500 -80.0 + 126.5000 228.7500 -80.0 + 128.5000 227.7500 -80.0 + 135.5000 226.7500 -80.0 + 147.5000 220.7500 -80.0 + 155.5000 213.7500 -80.0 + 166.7500 199.5000 -80.0 + 172.7500 188.5000 -80.0 + 175.7500 177.5000 -80.0 + 176.7500 168.5000 -80.0 + 177.5000 166.7500 -80.0 + 177.7500 154.5000 -80.0 + 178.7500 147.5000 -80.0 + 177.7500 145.5000 -80.0 + 177.7500 138.5000 -80.0 + 172.7500 121.5000 -80.0 + 160.7500 96.5000 -80.0 + 152.7500 87.5000 -80.0 + 152.7500 85.5000 -80.0 + 149.7500 81.5000 -80.0 + 152.7500 74.5000 -80.0 + 158.5000 71.7500 -80.0 + 158.7500 69.5000 -80.0 + 157.7500 66.5000 -80.0 + 154.7500 63.5000 -80.0 + 151.2500 63.5000 -80.0 + 152.2500 65.5000 -80.0 + 152.2500 68.5000 -80.0 + 151.2500 71.5000 -80.0 + 146.5000 77.2500 -80.0 + 147.2500 78.5000 -80.0 + 145.2500 79.5000 -80.0 + 144.2500 81.5000 -80.0 + 145.2500 83.5000 -80.0 + 145.2500 89.5000 -80.0 + 144.5000 91.2500 -80.0 + 140.7500 85.5000 -80.0 + 140.7500 81.5000 -80.0 + 139.5000 81.2500 -80.0 + 135.5000 83.2500 -80.0 + 133.5000 83.2500 -80.0 + 131.5000 84.2500 -80.0 + 130.7500 83.5000 -80.0 + 128.5000 83.2500 -80.0 + 128.2500 84.5000 -80.0 + 133.2500 87.5000 -80.0 + 137.5000 87.7500 -80.0 + 157.2500 103.5000 -80.0 + 163.2500 112.5000 -80.0 + 163.2500 114.5000 -80.0 + 166.2500 120.5000 -80.0 + 166.2500 122.5000 -80.0 + 168.2500 126.5000 -80.0 + 169.2500 133.5000 -80.0 + 171.2500 137.5000 -80.0 + 170.5000 139.2500 -80.0 + 170.2500 144.5000 -80.0 + 171.2500 146.5000 -80.0 + 171.2500 157.5000 -80.0 + 172.2500 160.5000 -80.0 + 170.5000 164.2500 -80.0 + 169.5000 169.2500 -80.0 + 170.2500 170.5000 -80.0 + 170.2500 173.5000 -80.0 + 167.2500 181.5000 -80.0 + 157.2500 197.5000 -80.0 + 148.2500 207.5000 -80.0 + 141.5000 212.2500 -80.0 + 132.5000 217.2500 -80.0 + 118.5000 223.2500 -80.0 + 104.5000 222.2500 -80.0 + 102.5000 223.2500 -80.0 + 78.5000 221.2500 -80.0 + 72.5000 219.2500 -80.0 + 65.7500 214.5000 -80.0 + 56.5000 209.2500 -80.0 + 48.7500 201.5000 -80.0 + 45.7500 197.5000 -80.0 + 37.7500 182.5000 -80.0 + 37.7500 180.5000 -80.0 + 35.7500 176.5000 -80.0 + 35.7500 172.5000 -80.0 + 34.7500 170.5000 -80.0 + 34.7500 159.5000 -80.0 + 35.5000 157.7500 -80.0 + 35.7500 152.5000 -80.0 + 34.7500 150.5000 -80.0 + 34.7500 147.5000 -80.0 + 37.5000 141.7500 -80.0 + 37.7500 139.5000 -80.0 + 44.7500 125.5000 -80.0 + 46.7500 116.5000 -80.0 + 50.7500 110.5000 -80.0 + 51.7500 105.5000 -80.0 + 53.5000 103.7500 -80.0 + 53.7500 100.5000 -80.0 + 57.5000 94.7500 -80.0 + 57.7500 90.5000 -80.0 + 56.7500 88.5000 -80.0 + 56.7500 86.5000 -80.0 + 59.7500 80.5000 -80.0 + 62.5000 78.7500 -80.0 + 67.5000 78.7500 -80.0 + 69.2500 80.5000 -80.0 + 71.5000 80.7500 -80.0 + 75.2500 83.5000 -80.0 + 79.5000 83.7500 -80.0 + 81.2500 84.5000 -80.0 + 87.7500 80.5000 -80.0 + 88.7500 78.5000 -80.0 + 84.5000 81.2500 -80.0 + 75.5000 80.2500 -80.0 + 69.5000 78.2500 -80.0 + 65.7500 75.5000 -80.0 + 62.7500 69.5000 -80.0 + 63.7500 59.5000 -80.0 +} -80.0 +{ -80.0 + 118.2500 61.5000 -80.0 + 118.2500 63.5000 -80.0 + 118.7500 62.5000 -80.0 +} -80.0 +{ -80.0 + 104.2500 63.5000 -80.0 + 104.2500 65.5000 -80.0 + 105.7500 63.5000 -80.0 +} -80.0 +{ -80.0 + 107.2500 63.5000 -80.0 + 108.2500 64.5000 -80.0 + 108.7500 63.5000 -80.0 +} -80.0 +{ -80.0 + 108.2500 66.5000 -80.0 + 108.2500 71.5000 -80.0 + 111.5000 71.7500 -80.0 +} -80.0 +{ -80.0 + 104.2500 68.5000 -80.0 + 104.2500 70.5000 -80.0 + 102.5000 72.7500 -80.0 + 104.5000 71.7500 -80.0 + 105.2500 72.5000 -80.0 + 106.5000 71.7500 -80.0 +} -80.0 +{ -80.0 + 117.2500 73.5000 -80.0 + 120.2500 79.5000 -80.0 + 121.5000 79.7500 -80.0 + 119.7500 76.5000 -80.0 + 119.7500 73.5000 -80.0 +} -80.0 +{ -80.0 + 153.7500 92.5000 -80.0 + 154.5000 91.7500 -80.0 + 155.2500 92.5000 -80.0 + 154.5000 93.2500 -80.0 +} -80.0 +v 203 z -82.000000 -64.0 +{ -82.0 + 106.2500 45.5000 -82.0 + 104.5000 46.2500 -82.0 + 96.5000 55.2500 -82.0 + 96.7500 58.5000 -82.0 + 98.5000 56.7500 -82.0 + 100.5000 56.7500 -82.0 + 102.5000 55.7500 -82.0 + 106.5000 55.7500 -82.0 + 108.5000 56.7500 -82.0 + 110.5000 55.7500 -82.0 + 114.5000 55.7500 -82.0 + 116.2500 56.5000 -82.0 + 117.2500 58.5000 -82.0 + 118.5000 58.7500 -82.0 + 118.7500 57.5000 -82.0 + 117.7500 54.5000 -82.0 + 108.7500 45.5000 -82.0 +} -82.0 +{ -82.0 + 60.2500 60.5000 -82.0 + 58.5000 61.2500 -82.0 + 55.5000 64.2500 -82.0 + 55.2500 67.5000 -82.0 + 58.5000 69.7500 -82.0 + 61.2500 73.5000 -82.0 + 61.2500 78.5000 -82.0 + 55.2500 86.5000 -82.0 + 56.2500 88.5000 -82.0 + 55.5000 90.2500 -82.0 + 54.7500 88.5000 -82.0 + 53.5000 88.2500 -82.0 + 52.2500 90.5000 -82.0 + 31.2500 136.5000 -82.0 + 29.5000 143.2500 -82.0 + 29.2500 152.5000 -82.0 + 28.5000 154.2500 -82.0 + 28.2500 171.5000 -82.0 + 29.2500 173.5000 -82.0 + 30.2500 183.5000 -82.0 + 31.2500 185.5000 -82.0 + 31.5000 188.7500 -82.0 + 37.2500 201.5000 -82.0 + 41.2500 207.5000 -82.0 + 52.2500 218.5000 -82.0 + 56.5000 221.7500 -82.0 + 71.2500 227.5000 -82.0 + 80.5000 227.7500 -82.0 + 84.5000 229.7500 -82.0 + 91.2500 231.5000 -82.0 + 103.5000 232.7500 -82.0 + 113.5000 229.7500 -82.0 + 121.5000 229.7500 -82.0 + 123.5000 228.7500 -82.0 + 126.5000 228.7500 -82.0 + 134.7500 226.5000 -82.0 + 147.5000 220.7500 -82.0 + 154.5000 214.7500 -82.0 + 163.5000 203.7500 -82.0 + 171.5000 190.7500 -82.0 + 171.7500 188.5000 -82.0 + 173.7500 184.5000 -82.0 + 175.7500 175.5000 -82.0 + 177.5000 166.7500 -82.0 + 178.7500 143.5000 -82.0 + 177.7500 141.5000 -82.0 + 177.7500 137.5000 -82.0 + 176.7500 135.5000 -82.0 + 175.7500 129.5000 -82.0 + 173.7500 125.5000 -82.0 + 173.7500 123.5000 -82.0 + 162.7500 101.5000 -82.0 + 157.5000 93.2500 -82.0 + 153.7500 90.5000 -82.0 + 152.7500 88.5000 -82.0 + 150.5000 88.2500 -82.0 + 147.7500 83.5000 -82.0 + 148.7500 80.5000 -82.0 + 150.5000 79.7500 -82.0 + 153.7500 74.5000 -82.0 + 158.5000 72.7500 -82.0 + 159.5000 70.7500 -82.0 + 158.7500 67.5000 -82.0 + 153.5000 64.2500 -82.0 + 153.2500 67.5000 -82.0 + 150.5000 74.2500 -82.0 + 148.5000 75.2500 -82.0 + 143.5000 80.2500 -82.0 + 134.5000 85.2500 -82.0 + 126.5000 85.2500 -82.0 + 127.2500 87.5000 -82.0 + 128.5000 87.7500 -82.0 + 131.2500 91.5000 -82.0 + 143.5000 92.7500 -82.0 + 143.7500 90.5000 -82.0 + 141.7500 88.5000 -82.0 + 139.5000 90.2500 -82.0 + 135.5000 90.2500 -82.0 + 133.7500 89.5000 -82.0 + 136.5000 86.7500 -82.0 + 140.5000 86.7500 -82.0 + 140.7500 84.5000 -82.0 + 142.5000 82.7500 -82.0 + 143.2500 83.5000 -82.0 + 143.2500 85.5000 -82.0 + 146.2500 87.5000 -82.0 + 145.5000 91.2500 -82.0 + 148.5000 92.7500 -82.0 + 151.2500 95.5000 -82.0 + 153.2500 99.5000 -82.0 + 161.2500 108.5000 -82.0 + 165.2500 116.5000 -82.0 + 165.2500 118.5000 -82.0 + 167.2500 120.5000 -82.0 + 167.2500 123.5000 -82.0 + 170.2500 129.5000 -82.0 + 170.2500 132.5000 -82.0 + 171.2500 134.5000 -82.0 + 171.2500 140.5000 -82.0 + 170.2500 142.5000 -82.0 + 171.2500 144.5000 -82.0 + 171.2500 151.5000 -82.0 + 172.2500 153.5000 -82.0 + 172.2500 158.5000 -82.0 + 170.5000 163.2500 -82.0 + 170.2500 173.5000 -82.0 + 167.2500 181.5000 -82.0 + 154.2500 201.5000 -82.0 + 147.5000 208.2500 -82.0 + 143.5000 211.2500 -82.0 + 122.5000 222.2500 -82.0 + 120.5000 222.2500 -82.0 + 114.5000 224.2500 -82.0 + 113.7500 223.5000 -82.0 + 109.5000 223.2500 -82.0 + 106.5000 222.2500 -82.0 + 104.5000 223.2500 -82.0 + 82.5000 222.2500 -82.0 + 74.5000 220.2500 -82.0 + 56.5000 209.2500 -82.0 + 46.7500 199.5000 -82.0 + 37.7500 182.5000 -82.0 + 37.7500 180.5000 -82.0 + 35.7500 176.5000 -82.0 + 35.7500 172.5000 -82.0 + 34.7500 170.5000 -82.0 + 34.7500 158.5000 -82.0 + 35.5000 156.7500 -82.0 + 35.7500 145.5000 -82.0 + 34.7500 142.5000 -82.0 + 37.5000 136.7500 -82.0 + 40.7500 132.5000 -82.0 + 42.7500 128.5000 -82.0 + 47.7500 113.5000 -82.0 + 50.5000 110.7500 -82.0 + 51.7500 106.5000 -82.0 + 56.5000 97.7500 -82.0 + 60.5000 94.7500 -82.0 + 60.7500 92.5000 -82.0 + 65.7500 87.5000 -82.0 + 61.5000 87.2500 -82.0 + 59.7500 83.5000 -82.0 + 63.5000 80.7500 -82.0 + 66.5000 80.7500 -82.0 + 75.2500 85.5000 -82.0 + 81.5000 85.7500 -82.0 + 84.7500 84.5000 -82.0 + 85.7500 82.5000 -82.0 + 84.5000 83.2500 -82.0 + 80.5000 83.2500 -82.0 + 67.5000 78.2500 -82.0 + 63.7500 73.5000 -82.0 + 63.7500 71.5000 -82.0 + 61.7500 67.5000 -82.0 + 61.7500 63.5000 -82.0 + 62.5000 61.7500 -82.0 + 61.7500 60.5000 -82.0 +} -82.0 +{ -82.0 + 104.2500 68.5000 -82.0 + 104.2500 69.5000 -82.0 + 103.2500 72.5000 -82.0 + 104.5000 71.7500 -82.0 + 105.5000 72.7500 -82.0 + 107.5000 71.7500 -82.0 + 108.2500 72.5000 -82.0 + 110.5000 72.7500 -82.0 + 108.7500 70.5000 -82.0 + 108.5000 68.2500 -82.0 + 108.2500 70.5000 -82.0 + 106.5000 71.2500 -82.0 +} -82.0 +{ -82.0 + 93.2500 73.5000 -82.0 + 92.2500 76.5000 -82.0 + 94.5000 74.7500 -82.0 +} -82.0 +{ -82.0 + 117.2500 74.5000 -82.0 + 117.2500 76.5000 -82.0 + 118.5000 77.7500 -82.0 + 118.7500 74.5000 -82.0 +} -82.0 +{ -82.0 + 106.7500 49.5000 -82.0 + 107.5000 48.7500 -82.0 + 108.2500 49.5000 -82.0 + 108.2500 53.5000 -82.0 + 106.5000 54.2500 -82.0 + 105.7500 52.5000 -82.0 +} -82.0 +{ -82.0 + 150.7500 91.5000 -82.0 + 152.5000 90.7500 -82.0 + 153.2500 92.5000 -82.0 + 151.5000 93.2500 -82.0 +} -82.0 +v 193 z -84.000000 -82.0 +{ -64.0 + 106.2500 43.5000 -84.0 + 105.2500 44.5000 -84.0 + 96.5000 56.2500 -84.0 + 96.5000 60.7500 -84.0 + 96.7500 58.5000 -84.0 + 99.5000 56.7500 -84.0 + 103.5000 56.7500 -84.0 + 105.5000 54.7500 -84.0 + 105.7500 47.5000 -84.0 + 107.5000 46.7500 -84.0 + 109.2500 48.5000 -84.0 + 109.2500 52.5000 -84.0 + 108.2500 55.5000 -84.0 + 112.2500 57.5000 -84.0 + 115.5000 57.7500 -84.0 + 117.5000 58.7500 -84.0 + 117.7500 56.5000 -84.0 + 116.7500 53.5000 -84.0 + 112.7500 49.5000 -84.0 + 108.7500 43.5000 -84.0 +} -84.0 +{ -84.0 + 57.2500 62.5000 -84.0 + 55.5000 64.2500 -84.0 + 55.2500 68.5000 -84.0 + 59.2500 70.5000 -84.0 + 63.2500 78.5000 -84.0 + 62.2500 81.5000 -84.0 + 59.5000 84.2500 -84.0 + 59.2500 86.5000 -84.0 + 60.2500 88.5000 -84.0 + 56.5000 90.2500 -84.0 + 55.7500 89.5000 -84.0 + 55.7500 87.5000 -84.0 + 54.5000 88.2500 -84.0 + 51.2500 93.5000 -84.0 + 31.2500 135.5000 -84.0 + 28.5000 149.2500 -84.0 + 28.2500 170.5000 -84.0 + 29.2500 172.5000 -84.0 + 29.2500 177.5000 -84.0 + 30.2500 179.5000 -84.0 + 31.2500 186.5000 -84.0 + 35.2500 197.5000 -84.0 + 41.2500 207.5000 -84.0 + 53.2500 219.5000 -84.0 + 60.2500 223.5000 -84.0 + 71.2500 227.5000 -84.0 + 82.5000 228.7500 -84.0 + 86.5000 230.7500 -84.0 + 93.2500 232.5000 -84.0 + 107.5000 232.7500 -84.0 + 111.5000 230.7500 -84.0 + 116.5000 230.7500 -84.0 + 122.5000 228.7500 -84.0 + 126.5000 228.7500 -84.0 + 128.5000 227.7500 -84.0 + 130.5000 227.7500 -84.0 + 147.5000 220.7500 -84.0 + 156.5000 212.7500 -84.0 + 163.7500 203.5000 -84.0 + 172.7500 187.5000 -84.0 + 176.5000 173.7500 -84.0 + 177.7500 160.5000 -84.0 + 178.5000 158.7500 -84.0 + 178.7500 141.5000 -84.0 + 176.7500 134.5000 -84.0 + 175.7500 128.5000 -84.0 + 173.7500 124.5000 -84.0 + 173.7500 122.5000 -84.0 + 168.7500 112.5000 -84.0 + 157.7500 93.5000 -84.0 + 152.5000 90.2500 -84.0 + 151.5000 92.2500 -84.0 + 149.7500 91.5000 -84.0 + 150.7500 89.5000 -84.0 + 147.7500 88.5000 -84.0 + 149.5000 87.7500 -84.0 + 149.7500 85.5000 -84.0 + 145.7500 84.5000 -84.0 + 147.5000 79.7500 -84.0 + 149.7500 80.5000 -84.0 + 151.7500 76.5000 -84.0 + 154.5000 73.7500 -84.0 + 159.5000 73.7500 -84.0 + 159.7500 71.5000 -84.0 + 158.7500 68.5000 -84.0 + 155.7500 65.5000 -84.0 + 154.5000 66.2500 -84.0 + 152.2500 72.5000 -84.0 + 146.5000 78.2500 -84.0 + 138.5000 84.2500 -84.0 + 139.5000 86.7500 -84.0 + 141.5000 85.7500 -84.0 + 143.2500 86.5000 -84.0 + 142.5000 88.2500 -84.0 + 140.5000 88.2500 -84.0 + 134.5000 90.2500 -84.0 + 133.7500 88.5000 -84.0 + 135.5000 86.2500 -84.0 + 131.5000 88.2500 -84.0 + 124.2500 87.5000 -84.0 + 128.2500 92.5000 -84.0 + 135.5000 92.7500 -84.0 + 137.5000 90.7500 -84.0 + 144.5000 90.7500 -84.0 + 147.5000 91.7500 -84.0 + 151.2500 94.5000 -84.0 + 155.2500 101.5000 -84.0 + 163.2500 109.5000 -84.0 + 165.2500 113.5000 -84.0 + 165.2500 115.5000 -84.0 + 168.2500 119.5000 -84.0 + 168.2500 121.5000 -84.0 + 170.2500 125.5000 -84.0 + 170.2500 127.5000 -84.0 + 171.2500 129.5000 -84.0 + 171.2500 135.5000 -84.0 + 172.2500 137.5000 -84.0 + 171.5000 139.2500 -84.0 + 171.2500 148.5000 -84.0 + 173.2500 152.5000 -84.0 + 173.2500 155.5000 -84.0 + 170.5000 164.2500 -84.0 + 170.2500 173.5000 -84.0 + 168.5000 177.2500 -84.0 + 168.2500 179.5000 -84.0 + 161.2500 191.5000 -84.0 + 154.2500 201.5000 -84.0 + 147.5000 208.2500 -84.0 + 132.5000 218.2500 -84.0 + 130.5000 218.2500 -84.0 + 122.5000 222.2500 -84.0 + 120.5000 222.2500 -84.0 + 116.5000 224.2500 -84.0 + 104.5000 223.2500 -84.0 + 102.5000 224.2500 -84.0 + 99.5000 224.2500 -84.0 + 94.7500 222.5000 -84.0 + 79.5000 222.2500 -84.0 + 70.7500 218.5000 -84.0 + 60.5000 211.2500 -84.0 + 56.5000 209.2500 -84.0 + 46.7500 199.5000 -84.0 + 39.7500 187.5000 -84.0 + 39.7500 185.5000 -84.0 + 35.7500 177.5000 -84.0 + 35.7500 174.5000 -84.0 + 34.7500 172.5000 -84.0 + 34.7500 156.5000 -84.0 + 35.5000 154.7500 -84.0 + 35.7500 145.5000 -84.0 + 34.7500 143.5000 -84.0 + 35.5000 141.7500 -84.0 + 35.7500 137.5000 -84.0 + 40.5000 131.7500 -84.0 + 49.5000 108.7500 -84.0 + 49.7500 106.5000 -84.0 + 52.5000 102.7500 -84.0 + 52.7500 100.5000 -84.0 + 55.7500 97.5000 -84.0 + 62.5000 92.7500 -84.0 + 69.5000 91.7500 -84.0 + 73.5000 89.7500 -84.0 + 83.7500 87.5000 -84.0 + 85.5000 84.2500 -84.0 + 83.5000 85.2500 -84.0 + 78.5000 85.2500 -84.0 + 72.7500 81.5000 -84.0 + 70.5000 81.2500 -84.0 + 64.7500 74.5000 -84.0 + 60.7500 66.5000 -84.0 + 60.7500 62.5000 -84.0 +} -84.0 +{ -84.0 + 109.2500 70.5000 -84.0 + 109.5000 73.7500 -84.0 + 111.5000 74.7500 -84.0 + 112.5000 74.2500 -84.0 + 110.5000 73.2500 -84.0 +} -84.0 +{ -84.0 + 94.2500 75.5000 -84.0 + 93.2500 76.5000 -84.0 + 94.7500 76.5000 -84.0 +} -84.0 +{ -84.0 + 115.2500 75.5000 -84.0 + 116.2500 76.5000 -84.0 + 116.7500 75.5000 -84.0 +} -84.0 +{ -84.0 + 63.7500 87.5000 -84.0 + 64.5000 86.7500 -84.0 + 67.5000 86.7500 -84.0 + 69.2500 88.5000 -84.0 + 67.5000 89.2500 -84.0 + 63.5000 91.2500 -84.0 + 62.7500 90.5000 -84.0 +} -84.0 +{ -84.0 + 144.7500 89.5000 -84.0 + 145.5000 88.7500 -84.0 + 146.2500 89.5000 -84.0 + 145.5000 90.2500 -84.0 +} -84.0 +v 247 z -86.000000 -64.0 +{ -86.0 + 107.2500 40.5000 -86.0 + 105.2500 42.5000 -86.0 + 103.2500 46.5000 -86.0 + 97.5000 54.2500 -86.0 + 97.2500 57.5000 -86.0 + 98.5000 57.7500 -86.0 + 101.7500 56.5000 -86.0 + 105.5000 48.7500 -86.0 + 105.7500 46.5000 -86.0 + 107.5000 44.7500 -86.0 + 109.2500 46.5000 -86.0 + 109.2500 49.5000 -86.0 + 111.2500 53.5000 -86.0 + 111.2500 56.5000 -86.0 + 113.2500 58.5000 -86.0 + 114.5000 57.7500 -86.0 + 117.5000 57.7500 -86.0 + 117.7500 56.5000 -86.0 + 114.7500 50.5000 -86.0 + 111.7500 47.5000 -86.0 + 111.7500 44.5000 -86.0 + 108.7500 40.5000 -86.0 +} -86.0 +{ -86.0 + 96.2500 58.5000 -86.0 + 96.2500 60.5000 -86.0 + 96.7500 59.5000 -86.0 +} -86.0 +{ -86.0 + 57.2500 63.5000 -86.0 + 55.5000 65.2500 -86.0 + 55.2500 69.5000 -86.0 + 59.2500 70.5000 -86.0 + 62.2500 76.5000 -86.0 + 65.2500 77.5000 -86.0 + 65.2500 81.5000 -86.0 + 68.5000 84.7500 -86.0 + 70.5000 83.7500 -86.0 + 75.5000 84.7500 -86.0 + 76.2500 86.5000 -86.0 + 78.2500 87.5000 -86.0 + 78.7500 86.5000 -86.0 + 76.5000 84.2500 -86.0 + 70.5000 81.2500 -86.0 + 63.7500 73.5000 -86.0 + 60.7500 67.5000 -86.0 + 60.7500 65.5000 -86.0 + 59.7500 63.5000 -86.0 +} -86.0 +{ -86.0 + 154.2500 67.5000 -86.0 + 153.5000 68.2500 -86.0 + 153.2500 70.5000 -86.0 + 152.2500 73.5000 -86.0 + 144.2500 80.5000 -86.0 + 143.2500 82.5000 -86.0 + 145.5000 82.7500 -86.0 + 147.5000 80.7500 -86.0 + 148.2500 81.5000 -86.0 + 154.5000 74.7500 -86.0 + 159.5000 74.7500 -86.0 + 160.7500 73.5000 -86.0 + 159.7500 71.5000 -86.0 + 159.7500 69.5000 -86.0 + 157.7500 67.5000 -86.0 +} -86.0 +{ -86.0 + 114.2500 76.5000 -86.0 + 113.5000 77.2500 -86.0 + 115.2500 78.5000 -86.0 + 115.7500 77.5000 -86.0 +} -86.0 +{ -86.0 + 63.2500 82.5000 -86.0 + 63.2500 83.5000 -86.0 + 62.5000 85.2500 -86.0 + 62.2500 87.5000 -86.0 + 59.5000 91.2500 -86.0 + 57.5000 91.2500 -86.0 + 55.7500 89.5000 -86.0 + 56.7500 87.5000 -86.0 + 54.5000 89.2500 -86.0 + 51.2500 94.5000 -86.0 + 36.5000 123.2500 -86.0 + 36.2500 125.5000 -86.0 + 30.2500 137.5000 -86.0 + 29.2500 146.5000 -86.0 + 28.5000 148.2500 -86.0 + 28.2500 168.5000 -86.0 + 29.2500 170.5000 -86.0 + 29.2500 175.5000 -86.0 + 30.2500 177.5000 -86.0 + 30.2500 181.5000 -86.0 + 31.2500 183.5000 -86.0 + 31.2500 185.5000 -86.0 + 32.2500 187.5000 -86.0 + 32.5000 190.7500 -86.0 + 37.2500 201.5000 -86.0 + 41.2500 206.5000 -86.0 + 42.2500 208.5000 -86.0 + 51.2500 217.5000 -86.0 + 55.5000 220.7500 -86.0 + 65.5000 225.7500 -86.0 + 74.5000 227.7500 -86.0 + 76.2500 228.5000 -86.0 + 80.5000 228.7500 -86.0 + 82.2500 229.5000 -86.0 + 88.5000 231.7500 -86.0 + 90.2500 232.5000 -86.0 + 94.5000 232.7500 -86.0 + 96.2500 233.5000 -86.0 + 104.5000 233.7500 -86.0 + 106.5000 232.7500 -86.0 + 108.5000 232.7500 -86.0 + 112.5000 230.7500 -86.0 + 116.5000 230.7500 -86.0 + 118.5000 229.7500 -86.0 + 120.5000 229.7500 -86.0 + 122.5000 228.7500 -86.0 + 126.5000 228.7500 -86.0 + 128.5000 227.7500 -86.0 + 130.5000 227.7500 -86.0 + 134.5000 225.7500 -86.0 + 136.5000 225.7500 -86.0 + 148.5000 219.7500 -86.0 + 155.5000 213.7500 -86.0 + 162.5000 204.7500 -86.0 + 166.7500 198.5000 -86.0 + 171.7500 189.5000 -86.0 + 172.7500 184.5000 -86.0 + 174.7500 180.5000 -86.0 + 175.7500 175.5000 -86.0 + 176.5000 173.7500 -86.0 + 176.7500 169.5000 -86.0 + 177.5000 167.7500 -86.0 + 177.7500 161.5000 -86.0 + 178.5000 159.7500 -86.0 + 178.7500 140.5000 -86.0 + 177.7500 138.5000 -86.0 + 177.7500 135.5000 -86.0 + 176.7500 133.5000 -86.0 + 176.7500 131.5000 -86.0 + 173.5000 122.2500 -86.0 + 170.7500 115.5000 -86.0 + 165.7500 107.5000 -86.0 + 161.7500 100.5000 -86.0 + 160.7500 98.5000 -86.0 + 154.5000 91.2500 -86.0 + 150.5000 89.2500 -86.0 + 148.5000 91.2500 -86.0 + 146.7500 87.5000 -86.0 + 145.5000 87.2500 -86.0 + 143.5000 85.2500 -86.0 + 143.2500 87.5000 -86.0 + 142.5000 89.2500 -86.0 + 140.5000 89.2500 -86.0 + 137.5000 88.2500 -86.0 + 135.5000 89.2500 -86.0 + 133.5000 89.2500 -86.0 + 131.5000 90.2500 -86.0 + 125.5000 90.2500 -86.0 + 122.7500 87.5000 -86.0 + 122.2500 88.5000 -86.0 + 127.5000 94.7500 -86.0 + 130.5000 93.7500 -86.0 + 133.5000 90.7500 -86.0 + 142.5000 90.7500 -86.0 + 145.5000 91.7500 -86.0 + 147.2500 92.5000 -86.0 + 150.5000 92.7500 -86.0 + 153.2500 97.5000 -86.0 + 154.2500 99.5000 -86.0 + 161.2500 106.5000 -86.0 + 164.2500 110.5000 -86.0 + 169.2500 119.5000 -86.0 + 169.2500 121.5000 -86.0 + 171.2500 125.5000 -86.0 + 171.2500 129.5000 -86.0 + 172.2500 131.5000 -86.0 + 172.2500 138.5000 -86.0 + 171.2500 143.5000 -86.0 + 172.2500 145.5000 -86.0 + 172.2500 147.5000 -86.0 + 174.2500 151.5000 -86.0 + 172.5000 154.2500 -86.0 + 171.2500 165.5000 -86.0 + 170.5000 167.2500 -86.0 + 170.2500 172.5000 -86.0 + 169.2500 177.5000 -86.0 + 165.2500 183.5000 -86.0 + 163.2500 187.5000 -86.0 + 158.2500 195.5000 -86.0 + 157.2500 197.5000 -86.0 + 150.5000 205.2500 -86.0 + 143.5000 211.2500 -86.0 + 135.5000 216.2500 -86.0 + 123.5000 222.2500 -86.0 + 120.5000 222.2500 -86.0 + 116.5000 224.2500 -86.0 + 112.5000 224.2500 -86.0 + 107.5000 223.2500 -86.0 + 105.5000 224.2500 -86.0 + 99.5000 224.2500 -86.0 + 92.5000 223.2500 -86.0 + 90.7500 222.5000 -86.0 + 78.5000 222.2500 -86.0 + 68.5000 217.2500 -86.0 + 64.7500 214.5000 -86.0 + 58.5000 210.2500 -86.0 + 56.5000 209.2500 -86.0 + 46.7500 199.5000 -86.0 + 43.7500 194.5000 -86.0 + 39.7500 187.5000 -86.0 + 39.7500 185.5000 -86.0 + 35.7500 177.5000 -86.0 + 35.7500 175.5000 -86.0 + 34.7500 173.5000 -86.0 + 34.7500 154.5000 -86.0 + 35.5000 152.7500 -86.0 + 35.7500 146.5000 -86.0 + 34.7500 144.5000 -86.0 + 34.7500 141.5000 -86.0 + 36.5000 137.7500 -86.0 + 36.7500 133.5000 -86.0 + 38.5000 132.7500 -86.0 + 38.7500 131.5000 -86.0 + 40.5000 129.7500 -86.0 + 41.7500 125.5000 -86.0 + 43.7500 120.5000 -86.0 + 44.5000 118.7500 -86.0 + 47.7500 109.5000 -86.0 + 50.7500 105.5000 -86.0 + 52.7500 101.5000 -86.0 + 53.5000 99.7500 -86.0 + 58.5000 93.7500 -86.0 + 62.5000 90.7500 -86.0 + 64.5000 90.7500 -86.0 + 66.5000 89.7500 -86.0 + 69.5000 89.7500 -86.0 + 71.2500 90.5000 -86.0 + 78.5000 90.7500 -86.0 + 80.5000 89.7500 -86.0 + 82.5000 89.7500 -86.0 + 86.5000 87.7500 -86.0 + 86.5000 86.2500 -86.0 + 82.5000 88.2500 -86.0 + 80.5000 88.2500 -86.0 + 77.5000 89.2500 -86.0 + 72.5000 87.2500 -86.0 + 70.5000 88.2500 -86.0 + 69.5000 87.2500 -86.0 + 67.5000 86.2500 -86.0 + 67.2500 87.5000 -86.0 + 64.5000 89.2500 -86.0 + 63.7500 87.5000 -86.0 + 64.5000 85.7500 -86.0 + 64.7500 82.5000 -86.0 +} -86.0 +v 190 z -88.000000 -64.0 +{ -88.0 + 108.2500 35.5000 -88.0 + 106.2500 36.5000 -88.0 + 104.5000 40.2500 -88.0 + 104.2500 44.5000 -88.0 + 97.5000 55.2500 -88.0 + 97.2500 57.5000 -88.0 + 98.5000 56.7500 -88.0 + 101.5000 56.7500 -88.0 + 102.5000 54.7500 -88.0 + 103.7500 46.5000 -88.0 + 106.5000 42.7500 -88.0 + 109.5000 42.7500 -88.0 + 111.2500 45.5000 -88.0 + 111.2500 53.5000 -88.0 + 114.2500 57.5000 -88.0 + 117.7500 57.5000 -88.0 + 115.7500 53.5000 -88.0 + 115.7500 51.5000 -88.0 + 111.7500 45.5000 -88.0 + 112.7500 43.5000 -88.0 + 111.7500 41.5000 -88.0 + 111.7500 39.5000 -88.0 + 109.7500 35.5000 -88.0 +} -88.0 +{ -88.0 + 56.2500 64.5000 -88.0 + 54.5000 67.2500 -88.0 + 54.2500 69.5000 -88.0 + 55.2500 71.5000 -88.0 + 56.5000 70.7500 -88.0 + 59.5000 70.7500 -88.0 + 62.2500 76.5000 -88.0 + 64.7500 76.5000 -88.0 + 61.7500 70.5000 -88.0 + 61.7500 68.5000 -88.0 + 59.7500 64.5000 -88.0 +} -88.0 +{ -88.0 + 155.2500 67.5000 -88.0 + 152.5000 70.2500 -88.0 + 151.2500 74.5000 -88.0 + 147.5000 78.2500 -88.0 + 145.2500 79.5000 -88.0 + 144.2500 81.5000 -88.0 + 147.5000 81.7500 -88.0 + 155.5000 74.7500 -88.0 + 158.5000 75.7500 -88.0 + 159.2500 77.5000 -88.0 + 160.5000 77.7500 -88.0 + 160.7500 71.5000 -88.0 + 157.7500 67.5000 -88.0 +} -88.0 +{ -88.0 + 65.2500 77.5000 -88.0 + 67.2500 81.5000 -88.0 + 67.2500 83.5000 -88.0 + 69.5000 83.7500 -88.0 + 71.5000 82.7500 -88.0 + 66.7500 77.5000 -88.0 +} -88.0 +{ -88.0 + 95.2500 79.5000 -88.0 + 93.5000 81.2500 -88.0 + 93.2500 83.5000 -88.0 + 96.5000 80.7500 -88.0 + 99.5000 80.7500 -88.0 + 99.7500 79.5000 -88.0 +} -88.0 +{ -88.0 + 115.2500 79.5000 -88.0 + 114.2500 81.5000 -88.0 + 117.2500 85.5000 -88.0 + 119.7500 87.5000 -88.0 + 117.7500 83.5000 -88.0 + 117.7500 81.5000 -88.0 +} -88.0 +{ -88.0 + 90.2500 85.5000 -88.0 + 90.2500 86.5000 -88.0 + 91.7500 85.5000 -88.0 +} -88.0 +{ -88.0 + 62.2500 86.5000 -88.0 + 61.2500 88.5000 -88.0 + 58.5000 91.2500 -88.0 + 57.7500 90.5000 -88.0 + 57.7500 87.5000 -88.0 + 55.5000 88.2500 -88.0 + 45.2500 105.5000 -88.0 + 31.2500 134.5000 -88.0 + 28.5000 148.2500 -88.0 + 28.2500 166.5000 -88.0 + 29.2500 168.5000 -88.0 + 29.2500 174.5000 -88.0 + 30.2500 176.5000 -88.0 + 30.2500 180.5000 -88.0 + 31.2500 182.5000 -88.0 + 33.2500 192.5000 -88.0 + 39.2500 204.5000 -88.0 + 47.2500 213.5000 -88.0 + 54.5000 219.7500 -88.0 + 62.5000 224.7500 -88.0 + 76.2500 228.5000 -88.0 + 80.5000 228.7500 -88.0 + 86.5000 231.7500 -88.0 + 93.2500 233.5000 -88.0 + 106.5000 233.7500 -88.0 + 110.5000 231.7500 -88.0 + 112.5000 231.7500 -88.0 + 123.5000 228.7500 -88.0 + 129.5000 227.7500 -88.0 + 146.5000 220.7500 -88.0 + 154.5000 214.7500 -88.0 + 165.7500 199.5000 -88.0 + 173.5000 183.7500 -88.0 + 176.7500 170.5000 -88.0 + 178.5000 161.7500 -88.0 + 178.7500 140.5000 -88.0 + 177.7500 138.5000 -88.0 + 176.7500 130.5000 -88.0 + 168.7500 111.5000 -88.0 + 155.7500 92.5000 -88.0 + 150.7500 89.5000 -88.0 + 147.5000 90.2500 -88.0 + 145.7500 88.5000 -88.0 + 144.5000 89.2500 -88.0 + 141.5000 88.2500 -88.0 + 137.5000 90.2500 -88.0 + 132.5000 89.2500 -88.0 + 130.2500 91.5000 -88.0 + 135.5000 91.7500 -88.0 + 137.5000 90.7500 -88.0 + 143.5000 90.7500 -88.0 + 148.2500 92.5000 -88.0 + 149.5000 91.7500 -88.0 + 151.2500 93.5000 -88.0 + 153.2500 97.5000 -88.0 + 163.2500 107.5000 -88.0 + 166.2500 111.5000 -88.0 + 171.2500 121.5000 -88.0 + 172.2500 130.5000 -88.0 + 173.2500 132.5000 -88.0 + 173.2500 145.5000 -88.0 + 174.2500 147.5000 -88.0 + 174.2500 149.5000 -88.0 + 172.5000 154.2500 -88.0 + 170.2500 174.5000 -88.0 + 165.2500 184.5000 -88.0 + 155.2500 200.5000 -88.0 + 148.5000 207.2500 -88.0 + 130.5000 219.2500 -88.0 + 128.5000 219.2500 -88.0 + 126.5000 221.2500 -88.0 + 120.5000 222.2500 -88.0 + 116.5000 224.2500 -88.0 + 107.5000 224.2500 -88.0 + 105.5000 225.2500 -88.0 + 104.7500 224.5000 -88.0 + 95.5000 224.2500 -88.0 + 86.7500 222.5000 -88.0 + 78.5000 222.2500 -88.0 + 66.5000 216.2500 -88.0 + 56.5000 209.2500 -88.0 + 47.7500 200.5000 -88.0 + 40.7500 189.5000 -88.0 + 40.7500 187.5000 -88.0 + 35.7500 177.5000 -88.0 + 35.7500 175.5000 -88.0 + 34.7500 173.5000 -88.0 + 34.7500 153.5000 -88.0 + 35.5000 151.7500 -88.0 + 35.7500 146.5000 -88.0 + 34.7500 144.5000 -88.0 + 34.7500 140.5000 -88.0 + 36.5000 136.7500 -88.0 + 36.7500 134.5000 -88.0 + 35.7500 132.5000 -88.0 + 40.7500 126.5000 -88.0 + 41.7500 121.5000 -88.0 + 44.7500 115.5000 -88.0 + 45.7500 110.5000 -88.0 + 50.7500 105.5000 -88.0 + 56.7500 93.5000 -88.0 + 65.5000 88.7500 -88.0 + 71.5000 88.7500 -88.0 + 77.2500 91.5000 -88.0 + 80.5000 91.7500 -88.0 + 82.5000 90.7500 -88.0 + 85.5000 90.7500 -88.0 + 87.5000 88.7500 -88.0 + 86.5000 88.2500 -88.0 + 80.5000 90.2500 -88.0 + 76.7500 86.5000 -88.0 + 74.5000 87.2500 -88.0 + 72.7500 86.5000 -88.0 + 71.5000 87.2500 -88.0 + 67.5000 87.2500 -88.0 + 64.5000 88.2500 -88.0 + 63.7500 86.5000 -88.0 +} -88.0 +{ -88.0 + 120.2500 88.5000 -88.0 + 125.2500 96.5000 -88.0 + 127.5000 95.7500 -88.0 + 127.7500 93.5000 -88.0 + 126.5000 93.2500 -88.0 +} -88.0 +///v 207 z -90.000000 -90.0 +{ -90.0 + 106.2500 33.5000 -90.0 + 105.5000 34.2500 -90.0 + 107.2500 35.5000 -90.0 + 109.5000 35.7500 -90.0 + 111.5000 34.7500 -90.0 + 110.7500 33.5000 -90.0 +} -90.0 +{ -90.0 + 104.2500 37.5000 -90.0 + 103.5000 38.2500 -90.0 + 103.2500 44.5000 -90.0 + 99.5000 49.2500 -90.0 + 99.2500 51.5000 -90.0 + 97.2500 56.5000 -90.0 + 98.5000 56.7500 -90.0 + 100.5000 55.7500 -90.0 + 102.5000 55.7500 -90.0 + 102.7500 49.5000 -90.0 + 103.7500 44.5000 -90.0 + 104.5000 42.7500 -90.0 + 104.7500 38.5000 -90.0 +} -90.0 +{ -90.0 + 112.2500 37.5000 -90.0 + 112.2500 46.5000 -90.0 + 111.2500 51.5000 -90.0 + 114.2500 54.5000 -90.0 + 114.2500 57.5000 -90.0 + 116.5000 57.7500 -90.0 + 115.7500 50.5000 -90.0 + 112.7500 44.5000 -90.0 + 113.5000 42.7500 -90.0 + 113.7500 37.5000 -90.0 +} -90.0 +{ -90.0 + 57.2500 64.5000 -90.0 + 53.5000 68.2500 -90.0 + 53.2500 71.5000 -90.0 + 54.5000 72.7500 -90.0 + 58.5000 70.7500 -90.0 + 60.2500 71.5000 -90.0 + 63.2500 76.5000 -90.0 + 63.2500 78.5000 -90.0 + 64.5000 77.7500 -90.0 + 64.7500 75.5000 -90.0 + 61.7500 69.5000 -90.0 + 61.7500 66.5000 -90.0 + 59.7500 64.5000 -90.0 +} -90.0 +{ -90.0 + 155.2500 67.5000 -90.0 + 152.5000 69.2500 -90.0 + 151.2500 73.5000 -90.0 + 145.5000 80.2500 -90.0 + 147.2500 81.5000 -90.0 + 148.5000 79.7500 -90.0 + 156.5000 74.7500 -90.0 + 159.2500 78.5000 -90.0 + 161.5000 78.7500 -90.0 + 161.7500 74.5000 -90.0 + 158.7500 68.5000 -90.0 +} -90.0 +{ -90.0 + 105.2500 81.5000 -90.0 + 104.5000 82.2500 -90.0 + 101.5000 82.2500 -90.0 + 101.2500 84.5000 -90.0 + 104.2500 86.5000 -90.0 + 108.5000 84.7500 -90.0 + 108.7500 83.5000 -90.0 +} -90.0 +{ -90.0 + 93.2500 84.5000 -90.0 + 93.2500 85.5000 -90.0 + 90.5000 88.7500 -90.0 + 94.5000 86.7500 -90.0 + 94.7500 85.5000 -90.0 +} -90.0 +{ -90.0 + 117.2500 85.5000 -90.0 + 116.5000 87.2500 -90.0 + 114.5000 87.2500 -90.0 + 114.5000 88.7500 -90.0 + 116.5000 89.7500 -90.0 + 120.2500 93.5000 -90.0 + 123.5000 98.7500 -90.0 + 125.5000 97.7500 -90.0 + 125.7500 95.5000 -90.0 + 121.5000 93.2500 -90.0 +} -90.0 +{ -90.0 + 66.2500 86.5000 -90.0 + 64.5000 88.2500 -90.0 + 61.5000 87.2500 -90.0 + 61.2500 88.5000 -90.0 + 59.5000 89.2500 -90.0 + 58.7500 87.5000 -90.0 + 57.5000 87.2500 -90.0 + 55.2500 89.5000 -90.0 + 48.5000 100.2500 -90.0 + 32.2500 130.5000 -90.0 + 28.5000 147.2500 -90.0 + 28.2500 164.5000 -90.0 + 29.2500 166.5000 -90.0 + 29.2500 173.5000 -90.0 + 30.2500 175.5000 -90.0 + 30.2500 179.5000 -90.0 + 31.2500 181.5000 -90.0 + 32.2500 187.5000 -90.0 + 38.2500 202.5000 -90.0 + 46.2500 212.5000 -90.0 + 56.5000 220.7500 -90.0 + 63.2500 224.5000 -90.0 + 74.5000 227.7500 -90.0 + 92.2500 233.5000 -90.0 + 106.5000 233.7500 -90.0 + 108.5000 232.7500 -90.0 + 110.5000 232.7500 -90.0 + 114.5000 230.7500 -90.0 + 116.5000 230.7500 -90.0 + 118.5000 229.7500 -90.0 + 122.5000 229.7500 -90.0 + 126.5000 227.7500 -90.0 + 129.5000 227.7500 -90.0 + 133.5000 225.7500 -90.0 + 135.5000 225.7500 -90.0 + 150.5000 217.7500 -90.0 + 161.7500 205.5000 -90.0 + 166.7500 197.5000 -90.0 + 172.7500 185.5000 -90.0 + 173.7500 180.5000 -90.0 + 175.5000 176.7500 -90.0 + 178.5000 162.7500 -90.0 + 178.7500 141.5000 -90.0 + 177.7500 139.5000 -90.0 + 177.7500 133.5000 -90.0 + 175.7500 129.5000 -90.0 + 175.7500 126.5000 -90.0 + 171.7500 118.5000 -90.0 + 171.7500 116.5000 -90.0 + 167.5000 109.2500 -90.0 + 155.5000 93.2500 -90.0 + 151.7500 90.5000 -90.0 + 146.5000 90.2500 -90.0 + 142.5000 88.2500 -90.0 + 138.5000 90.2500 -90.0 + 135.5000 90.2500 -90.0 + 133.7500 89.5000 -90.0 + 130.5000 91.2500 -90.0 + 130.5000 92.7500 -90.0 + 137.5000 90.7500 -90.0 + 144.5000 90.7500 -90.0 + 153.2500 94.5000 -90.0 + 153.2500 96.5000 -90.0 + 156.2500 99.5000 -90.0 + 159.5000 104.7500 -90.0 + 161.5000 105.7500 -90.0 + 166.2500 111.5000 -90.0 + 169.2500 116.5000 -90.0 + 169.2500 118.5000 -90.0 + 173.2500 126.5000 -90.0 + 173.2500 130.5000 -90.0 + 174.2500 132.5000 -90.0 + 174.2500 141.5000 -90.0 + 175.2500 144.5000 -90.0 + 172.5000 156.2500 -90.0 + 170.2500 174.5000 -90.0 + 166.5000 180.2500 -90.0 + 166.2500 182.5000 -90.0 + 157.2500 197.5000 -90.0 + 151.5000 204.2500 -90.0 + 140.5000 213.2500 -90.0 + 125.5000 221.2500 -90.0 + 123.5000 221.2500 -90.0 + 119.5000 223.2500 -90.0 + 117.5000 223.2500 -90.0 + 115.5000 224.2500 -90.0 + 109.5000 224.2500 -90.0 + 107.5000 225.2500 -90.0 + 98.5000 223.2500 -90.0 + 92.5000 225.2500 -90.0 + 84.7500 222.5000 -90.0 + 78.5000 222.2500 -90.0 + 66.5000 216.2500 -90.0 + 56.5000 209.2500 -90.0 + 47.7500 200.5000 -90.0 + 44.7500 196.5000 -90.0 + 37.7500 182.5000 -90.0 + 37.7500 180.5000 -90.0 + 35.7500 176.5000 -90.0 + 35.7500 173.5000 -90.0 + 34.7500 171.5000 -90.0 + 34.7500 159.5000 -90.0 + 33.7500 156.5000 -90.0 + 34.7500 154.5000 -90.0 + 35.7500 147.5000 -90.0 + 34.7500 145.5000 -90.0 + 35.7500 129.5000 -90.0 + 37.7500 127.5000 -90.0 + 41.5000 120.7500 -90.0 + 41.7500 118.5000 -90.0 + 46.7500 106.5000 -90.0 + 52.7500 100.5000 -90.0 + 54.5000 96.7500 -90.0 + 56.5000 95.7500 -90.0 + 56.7500 94.5000 -90.0 + 61.5000 89.7500 -90.0 + 70.5000 88.7500 -90.0 + 68.7500 86.5000 -90.0 +} -90.0 +{ -90.0 + 76.2500 86.5000 -90.0 + 75.5000 88.2500 -90.0 + 72.5000 88.2500 -90.0 + 80.2500 92.5000 -90.0 + 84.5000 92.7500 -90.0 + 87.5000 91.7500 -90.0 + 88.5000 90.2500 -90.0 + 86.5000 91.2500 -90.0 + 80.5000 91.2500 -90.0 + 77.7500 87.5000 -90.0 +} -90.0 +{ -90.0 + 103.2500 154.5000 -90.0 + 103.2500 155.5000 -90.0 + 104.5000 155.7500 -90.0 + 104.7500 154.5000 -90.0 +} -90.0 +v 178 z -92.000000 -64.0 +{ -92.0 + 114.2500 35.5000 -92.0 + 113.5000 36.2500 -92.0 + 113.2500 45.5000 -92.0 + 112.2500 50.5000 -92.0 + 114.2500 52.5000 -92.0 + 114.2500 56.5000 -92.0 + 115.5000 56.7500 -92.0 + 115.7500 48.5000 -92.0 + 114.7500 46.5000 -92.0 + 114.7500 36.5000 -92.0 +} -92.0 +{ -92.0 + 103.2500 36.5000 -92.0 + 102.2500 44.5000 -92.0 + 99.5000 48.2500 -92.0 + 99.5000 55.7500 -92.0 + 101.5000 54.7500 -92.0 + 103.7500 37.5000 -92.0 +} -92.0 +{ -92.0 + 57.2500 64.5000 -92.0 + 54.2500 67.5000 -92.0 + 53.2500 69.5000 -92.0 + 52.2500 74.5000 -92.0 + 53.5000 74.7500 -92.0 + 57.5000 71.7500 -92.0 + 60.5000 71.7500 -92.0 + 64.2500 78.5000 -92.0 + 65.5000 78.7500 -92.0 + 65.7500 76.5000 -92.0 + 62.7500 70.5000 -92.0 + 61.7500 65.5000 -92.0 + 59.7500 64.5000 -92.0 +} -92.0 +{ -92.0 + 153.2500 67.5000 -92.0 + 151.5000 70.2500 -92.0 + 151.2500 73.5000 -92.0 + 146.5000 78.2500 -92.0 + 146.2500 80.5000 -92.0 + 147.5000 80.7500 -92.0 + 153.5000 75.7500 -92.0 + 157.5000 75.7500 -92.0 + 161.2500 79.5000 -92.0 + 162.5000 77.7500 -92.0 + 161.7500 74.5000 -92.0 + 158.7500 68.5000 -92.0 + 156.7500 67.5000 -92.0 +} -92.0 +{ -92.0 + 94.2500 85.5000 -92.0 + 93.2500 87.5000 -92.0 + 94.7500 86.5000 -92.0 +} -92.0 +{ -92.0 + 60.2500 86.5000 -92.0 + 56.5000 88.2500 -92.0 + 56.2500 89.5000 -92.0 + 43.2500 108.5000 -92.0 + 31.5000 132.2500 -92.0 + 28.5000 147.2500 -92.0 + 28.2500 162.5000 -92.0 + 29.2500 164.5000 -92.0 + 29.2500 172.5000 -92.0 + 30.2500 174.5000 -92.0 + 30.2500 177.5000 -92.0 + 32.2500 184.5000 -92.0 + 33.2500 190.5000 -92.0 + 41.2500 206.5000 -92.0 + 51.2500 216.5000 -92.0 + 66.5000 225.7500 -92.0 + 80.5000 229.7500 -92.0 + 91.2500 233.5000 -92.0 + 107.5000 233.7500 -92.0 + 109.5000 232.7500 -92.0 + 111.5000 232.7500 -92.0 + 115.5000 230.7500 -92.0 + 122.5000 229.7500 -92.0 + 126.5000 227.7500 -92.0 + 129.5000 227.7500 -92.0 + 139.5000 223.7500 -92.0 + 147.5000 218.7500 -92.0 + 155.5000 212.7500 -92.0 + 164.7500 200.5000 -92.0 + 170.7500 188.5000 -92.0 + 175.7500 174.5000 -92.0 + 178.5000 163.7500 -92.0 + 178.7500 142.5000 -92.0 + 177.7500 140.5000 -92.0 + 177.7500 135.5000 -92.0 + 176.7500 133.5000 -92.0 + 175.7500 126.5000 -92.0 + 172.7500 120.5000 -92.0 + 170.7500 114.5000 -92.0 + 165.7500 106.5000 -92.0 + 155.5000 93.2500 -92.0 + 151.7500 90.5000 -92.0 + 140.5000 89.2500 -92.0 + 142.2500 90.5000 -92.0 + 145.5000 90.7500 -92.0 + 150.5000 92.7500 -92.0 + 154.2500 95.5000 -92.0 + 156.2500 101.5000 -92.0 + 155.2500 103.5000 -92.0 + 158.2500 105.5000 -92.0 + 161.5000 105.7500 -92.0 + 166.2500 110.5000 -92.0 + 169.2500 116.5000 -92.0 + 169.2500 118.5000 -92.0 + 171.2500 122.5000 -92.0 + 171.2500 124.5000 -92.0 + 174.2500 130.5000 -92.0 + 174.2500 150.5000 -92.0 + 172.2500 157.5000 -92.0 + 170.2500 173.5000 -92.0 + 163.2500 187.5000 -92.0 + 152.2500 203.5000 -92.0 + 150.5000 204.2500 -92.0 + 140.5000 213.2500 -92.0 + 128.5000 220.2500 -92.0 + 126.5000 220.2500 -92.0 + 122.5000 222.2500 -92.0 + 109.5000 225.2500 -92.0 + 105.5000 223.2500 -92.0 + 103.5000 224.2500 -92.0 + 102.7500 223.5000 -92.0 + 97.5000 223.2500 -92.0 + 93.5000 225.2500 -92.0 + 89.5000 225.2500 -92.0 + 84.5000 223.2500 -92.0 + 79.5000 222.2500 -92.0 + 62.5000 214.2500 -92.0 + 52.7500 205.5000 -92.0 + 43.7500 195.5000 -92.0 + 43.7500 193.5000 -92.0 + 37.7500 181.5000 -92.0 + 37.7500 179.5000 -92.0 + 35.7500 175.5000 -92.0 + 35.7500 171.5000 -92.0 + 34.7500 169.5000 -92.0 + 34.7500 163.5000 -92.0 + 33.7500 161.5000 -92.0 + 34.7500 142.5000 -92.0 + 33.7500 140.5000 -92.0 + 33.7500 138.5000 -92.0 + 36.7500 125.5000 -92.0 + 39.5000 121.7500 -92.0 + 39.7500 119.5000 -92.0 + 45.7500 107.5000 -92.0 + 54.5000 95.7500 -92.0 + 56.5000 94.7500 -92.0 + 56.7500 93.5000 -92.0 + 63.5000 88.7500 -92.0 + 76.5000 88.7500 -92.0 + 77.5000 87.2500 -92.0 + 75.5000 86.2500 -92.0 + 73.5000 88.2500 -92.0 + 71.5000 88.2500 -92.0 + 69.7500 86.5000 -92.0 + 67.5000 86.2500 -92.0 + 62.5000 88.2500 -92.0 + 60.7500 87.5000 -92.0 + 61.7500 86.5000 -92.0 +} -92.0 +{ -92.0 + 102.2500 87.5000 -92.0 + 101.2500 89.5000 -92.0 + 102.7500 88.5000 -92.0 +} -92.0 +{ -92.0 + 78.2500 89.5000 -92.0 + 77.5000 90.2500 -92.0 + 78.2500 91.5000 -92.0 + 80.5000 91.7500 -92.0 +} -92.0 +{ -92.0 + 136.2500 90.5000 -92.0 + 132.5000 92.2500 -92.0 + 131.5000 91.2500 -92.0 + 128.5000 92.2500 -92.0 + 128.5000 93.7500 -92.0 + 130.5000 92.7500 -92.0 + 133.5000 92.7500 -92.0 + 137.5000 90.7500 -92.0 + 139.7500 90.5000 -92.0 +} -92.0 +{ -92.0 + 83.2500 93.5000 -92.0 + 83.5000 94.7500 -92.0 + 87.5000 96.7500 -92.0 + 89.5000 93.2500 -92.0 + 86.5000 94.2500 -92.0 +} -92.0 +{ -92.0 + 123.2500 98.5000 -92.0 + 121.5000 99.2500 -92.0 + 121.2500 100.5000 -92.0 + 123.5000 100.7500 -92.0 +} -92.0 +v 171 z -94.000000 -92.0 +{ -64.0 + 114.2500 35.5000 -94.0 + 114.2500 48.5000 -94.0 + 113.5000 50.2500 -94.0 + 115.2500 51.5000 -94.0 + 114.2500 54.5000 -94.0 + 115.5000 55.7500 -94.0 + 116.7500 49.5000 -94.0 + 115.7500 47.5000 -94.0 + 115.7500 38.5000 -94.0 +} -94.0 +{ -94.0 + 102.2500 38.5000 -94.0 + 102.2500 40.5000 -94.0 + 98.2500 48.5000 -94.0 + 99.2500 50.5000 -94.0 + 99.2500 54.5000 -94.0 + 101.5000 54.7500 -94.0 + 101.7500 52.5000 -94.0 + 100.7500 50.5000 -94.0 + 102.5000 43.7500 -94.0 + 102.7500 39.5000 -94.0 +} -94.0 +{ -94.0 + 57.2500 64.5000 -94.0 + 55.2500 66.5000 -94.0 + 51.5000 73.2500 -94.0 + 51.5000 75.7500 -94.0 + 57.5000 71.7500 -94.0 + 60.5000 71.7500 -94.0 + 65.2500 78.5000 -94.0 + 66.5000 78.7500 -94.0 + 66.7500 76.5000 -94.0 + 63.7500 70.5000 -94.0 + 63.7500 68.5000 -94.0 + 60.7500 64.5000 -94.0 +} -94.0 +{ -94.0 + 152.2500 67.5000 -94.0 + 150.2500 74.5000 -94.0 + 146.5000 78.2500 -94.0 + 146.2500 80.5000 -94.0 + 154.5000 75.7500 -94.0 + 157.5000 75.7500 -94.0 + 160.5000 78.7500 -94.0 + 162.5000 79.7500 -94.0 + 162.7500 77.5000 -94.0 + 160.7500 71.5000 -94.0 + 157.7500 67.5000 -94.0 +} -94.0 +{ -94.0 + 75.2500 85.5000 -94.0 + 74.5000 87.2500 -94.0 + 67.5000 86.2500 -94.0 + 63.5000 88.2500 -94.0 + 61.7500 87.5000 -94.0 + 58.2500 87.5000 -94.0 + 47.5000 101.2500 -94.0 + 32.2500 129.5000 -94.0 + 28.5000 147.2500 -94.0 + 28.2500 161.5000 -94.0 + 29.2500 163.5000 -94.0 + 29.2500 171.5000 -94.0 + 30.2500 173.5000 -94.0 + 31.2500 182.5000 -94.0 + 33.2500 186.5000 -94.0 + 34.2500 192.5000 -94.0 + 40.2500 204.5000 -94.0 + 47.2500 212.5000 -94.0 + 53.2500 217.5000 -94.0 + 68.2500 226.5000 -94.0 + 71.5000 226.7500 -94.0 + 84.5000 231.7500 -94.0 + 91.2500 233.5000 -94.0 + 107.5000 233.7500 -94.0 + 109.5000 232.7500 -94.0 + 115.5000 231.7500 -94.0 + 119.5000 229.7500 -94.0 + 126.5000 228.7500 -94.0 + 130.5000 226.7500 -94.0 + 132.5000 226.7500 -94.0 + 144.5000 220.7500 -94.0 + 151.5000 215.7500 -94.0 + 157.7500 209.5000 -94.0 + 163.7500 201.5000 -94.0 + 173.5000 181.7500 -94.0 + 178.5000 163.7500 -94.0 + 178.7500 143.5000 -94.0 + 177.7500 141.5000 -94.0 + 177.7500 136.5000 -94.0 + 176.7500 134.5000 -94.0 + 176.7500 130.5000 -94.0 + 174.7500 126.5000 -94.0 + 174.7500 124.5000 -94.0 + 170.7500 114.5000 -94.0 + 165.7500 106.5000 -94.0 + 152.7500 91.5000 -94.0 + 146.7500 89.5000 -94.0 + 140.5000 89.2500 -94.0 + 137.2500 90.5000 -94.0 + 146.5000 90.7500 -94.0 + 153.2500 95.5000 -94.0 + 154.2500 97.5000 -94.0 + 153.2500 102.5000 -94.0 + 155.2500 104.5000 -94.0 + 160.5000 104.7500 -94.0 + 168.2500 113.5000 -94.0 + 168.2500 115.5000 -94.0 + 171.2500 121.5000 -94.0 + 171.2500 123.5000 -94.0 + 173.2500 127.5000 -94.0 + 173.2500 130.5000 -94.0 + 174.2500 132.5000 -94.0 + 174.2500 151.5000 -94.0 + 170.2500 171.5000 -94.0 + 166.2500 182.5000 -94.0 + 161.5000 189.2500 -94.0 + 156.2500 198.5000 -94.0 + 142.2500 211.5000 -94.0 + 130.5000 219.2500 -94.0 + 128.5000 219.2500 -94.0 + 118.5000 223.2500 -94.0 + 116.5000 223.2500 -94.0 + 114.5000 224.2500 -94.0 + 110.5000 224.2500 -94.0 + 98.5000 222.2500 -94.0 + 94.5000 225.2500 -94.0 + 88.5000 225.2500 -94.0 + 76.7500 220.5000 -94.0 + 74.5000 220.2500 -94.0 + 62.5000 214.2500 -94.0 + 59.5000 211.2500 -94.0 + 57.5000 210.2500 -94.0 + 56.7500 208.5000 -94.0 + 54.7500 207.5000 -94.0 + 53.5000 205.2500 -94.0 + 51.5000 204.2500 -94.0 + 50.7500 202.5000 -94.0 + 45.7500 197.5000 -94.0 + 38.7500 184.5000 -94.0 + 38.7500 182.5000 -94.0 + 36.7500 178.5000 -94.0 + 36.7500 175.5000 -94.0 + 34.7500 168.5000 -94.0 + 34.7500 163.5000 -94.0 + 33.7500 161.5000 -94.0 + 33.7500 152.5000 -94.0 + 34.5000 150.7500 -94.0 + 34.7500 142.5000 -94.0 + 33.7500 140.5000 -94.0 + 33.7500 135.5000 -94.0 + 34.7500 130.5000 -94.0 + 37.7500 122.5000 -94.0 + 44.5000 111.7500 -94.0 + 46.7500 105.5000 -94.0 + 49.5000 102.7500 -94.0 + 53.7500 95.5000 -94.0 + 55.5000 94.7500 -94.0 + 58.5000 91.7500 -94.0 + 66.5000 87.7500 -94.0 + 76.5000 87.7500 -94.0 + 80.2500 92.5000 -94.0 + 82.7500 92.5000 -94.0 + 79.7500 88.5000 -94.0 +} -94.0 +{ -94.0 + 129.2500 91.5000 -94.0 + 127.2500 94.5000 -94.0 + 130.7500 94.5000 -94.0 +} -94.0 +{ -94.0 + 100.2500 94.5000 -94.0 + 99.2500 95.5000 -94.0 + 100.7500 95.5000 -94.0 +} -94.0 +{ -94.0 + 86.2500 97.5000 -94.0 + 88.7500 99.5000 -94.0 + 87.7500 97.5000 -94.0 +} -94.0 +{ -94.0 + 100.2500 97.5000 -94.0 + 100.5000 97.7500 -94.0 + 102.5000 98.7500 -94.0 + 101.7500 97.5000 -94.0 +} -94.0 +{ -94.0 + 102.2500 157.5000 -94.0 + 101.2500 159.5000 -94.0 + 102.5000 159.7500 -94.0 +} -94.0 +v 173 z -96.000000 -64.0 +{ -96.0 + 115.2500 37.5000 -96.0 + 115.2500 45.5000 -96.0 + 114.5000 47.2500 -96.0 + 114.2500 54.5000 -96.0 + 115.5000 54.7500 -96.0 + 117.7500 48.5000 -96.0 + 116.7500 46.5000 -96.0 + 116.7500 40.5000 -96.0 +} -96.0 +{ -96.0 + 101.2500 40.5000 -96.0 + 100.2500 44.5000 -96.0 + 97.5000 48.2500 -96.0 + 99.2500 51.5000 -96.0 + 99.2500 53.5000 -96.0 + 100.5000 54.7500 -96.0 + 101.7500 41.5000 -96.0 +} -96.0 +{ -96.0 + 59.2500 63.5000 -96.0 + 57.5000 64.2500 -96.0 + 55.2500 66.5000 -96.0 + 51.5000 73.2500 -96.0 + 51.5000 75.7500 -96.0 + 57.5000 71.7500 -96.0 + 60.5000 71.7500 -96.0 + 63.2500 75.5000 -96.0 + 64.5000 75.7500 -96.0 + 67.2500 78.5000 -96.0 + 67.7500 77.5000 -96.0 + 62.7500 67.5000 -96.0 + 62.7500 65.5000 -96.0 + 60.7500 63.5000 -96.0 +} -96.0 +{ -96.0 + 153.2500 66.5000 -96.0 + 151.5000 68.2500 -96.0 + 150.2500 73.5000 -96.0 + 147.2500 76.5000 -96.0 + 145.2500 80.5000 -96.0 + 149.5000 77.7500 -96.0 + 151.5000 77.7500 -96.0 + 155.5000 74.7500 -96.0 + 158.5000 75.7500 -96.0 + 161.2500 79.5000 -96.0 + 162.5000 78.7500 -96.0 + 162.7500 76.5000 -96.0 + 160.7500 70.5000 -96.0 + 156.7500 66.5000 -96.0 +} -96.0 +{ -96.0 + 76.2500 85.5000 -96.0 + 75.5000 86.2500 -96.0 + 73.2500 87.5000 -96.0 + 77.5000 88.7500 -96.0 + 82.5000 93.7500 -96.0 + 84.5000 92.7500 -96.0 + 83.7500 91.5000 -96.0 + 82.5000 92.2500 -96.0 + 81.7500 91.5000 -96.0 + 80.7500 89.5000 -96.0 +} -96.0 +{ -96.0 + 67.2500 86.5000 -96.0 + 66.5000 87.2500 -96.0 + 59.5000 87.2500 -96.0 + 48.5000 100.2500 -96.0 + 44.2500 106.5000 -96.0 + 41.2500 112.5000 -96.0 + 36.5000 120.2500 -96.0 + 36.2500 123.5000 -96.0 + 37.7500 122.5000 -96.0 + 40.7500 116.5000 -96.0 + 45.5000 109.7500 -96.0 + 46.7500 105.5000 -96.0 + 52.5000 98.7500 -96.0 + 55.5000 93.7500 -96.0 + 57.5000 93.7500 -96.0 + 59.5000 91.7500 -96.0 + 67.5000 87.7500 -96.0 + 69.5000 87.7500 -96.0 + 70.7500 86.5000 -96.0 +} -96.0 +{ -96.0 + 137.2500 89.5000 -96.0 + 135.5000 91.2500 -96.0 + 136.5000 91.7500 -96.0 + 138.5000 90.7500 -96.0 + 143.5000 90.7500 -96.0 + 148.5000 92.7500 -96.0 + 152.2500 95.5000 -96.0 + 152.5000 102.7500 -96.0 + 156.2500 104.5000 -96.0 + 160.5000 104.7500 -96.0 + 164.2500 107.5000 -96.0 + 169.2500 116.5000 -96.0 + 169.2500 118.5000 -96.0 + 172.2500 124.5000 -96.0 + 172.2500 129.5000 -96.0 + 174.2500 133.5000 -96.0 + 174.2500 149.5000 -96.0 + 173.5000 151.2500 -96.0 + 173.2500 157.5000 -96.0 + 171.2500 164.5000 -96.0 + 170.2500 171.5000 -96.0 + 163.5000 186.2500 -96.0 + 152.5000 202.2500 -96.0 + 138.5000 214.2500 -96.0 + 129.5000 219.2500 -96.0 + 127.5000 219.2500 -96.0 + 121.5000 222.2500 -96.0 + 118.5000 222.2500 -96.0 + 114.5000 224.2500 -96.0 + 109.5000 224.2500 -96.0 + 104.7500 222.5000 -96.0 + 98.5000 222.2500 -96.0 + 94.5000 225.2500 -96.0 + 87.5000 225.2500 -96.0 + 74.7500 219.5000 -96.0 + 65.5000 216.2500 -96.0 + 58.5000 211.2500 -96.0 + 44.7500 195.5000 -96.0 + 38.7500 183.5000 -96.0 + 38.7500 181.5000 -96.0 + 36.7500 177.5000 -96.0 + 36.7500 174.5000 -96.0 + 34.7500 168.5000 -96.0 + 34.7500 164.5000 -96.0 + 33.7500 162.5000 -96.0 + 33.7500 150.5000 -96.0 + 34.5000 148.7500 -96.0 + 34.7500 142.5000 -96.0 + 33.7500 140.5000 -96.0 + 33.7500 134.5000 -96.0 + 35.7500 125.5000 -96.0 + 34.5000 125.2500 -96.0 + 32.2500 130.5000 -96.0 + 28.5000 149.2500 -96.0 + 28.2500 159.5000 -96.0 + 29.2500 161.5000 -96.0 + 29.2500 169.5000 -96.0 + 30.2500 171.5000 -96.0 + 30.2500 175.5000 -96.0 + 31.2500 177.5000 -96.0 + 33.2500 187.5000 -96.0 + 38.2500 200.5000 -96.0 + 45.5000 210.7500 -96.0 + 61.5000 222.7500 -96.0 + 71.5000 227.7500 -96.0 + 78.5000 228.7500 -96.0 + 84.5000 231.7500 -96.0 + 91.2500 233.5000 -96.0 + 107.5000 233.7500 -96.0 + 109.5000 232.7500 -96.0 + 119.5000 230.7500 -96.0 + 123.5000 228.7500 -96.0 + 129.5000 227.7500 -96.0 + 141.5000 221.7500 -96.0 + 154.5000 212.7500 -96.0 + 163.7500 200.5000 -96.0 + 173.7500 180.5000 -96.0 + 178.5000 163.7500 -96.0 + 178.7500 144.5000 -96.0 + 177.7500 142.5000 -96.0 + 176.7500 133.5000 -96.0 + 175.7500 131.5000 -96.0 + 175.7500 129.5000 -96.0 + 167.7500 109.5000 -96.0 + 152.7500 91.5000 -96.0 + 149.5000 91.2500 -96.0 + 145.7500 89.5000 -96.0 + 144.5000 90.2500 -96.0 + 143.7500 89.5000 -96.0 +} -96.0 +{ -96.0 + 127.2500 92.5000 -96.0 + 126.5000 93.2500 -96.0 + 126.2500 95.5000 -96.0 + 128.7500 95.5000 -96.0 + 129.7500 93.5000 -96.0 +} -96.0 +{ -96.0 + 94.2500 108.5000 -96.0 + 93.2500 109.5000 -96.0 + 94.7500 109.5000 -96.0 +} -96.0 +{ -96.0 + 154.7500 71.5000 -96.0 + 155.5000 70.7500 -96.0 + 157.2500 71.5000 -96.0 + 156.5000 72.2500 -96.0 +} -96.0 +v 169 z -98.000000 -64.0 +{ -98.0 + 101.2500 38.5000 -98.0 + 100.2500 39.5000 -98.0 + 99.2500 44.5000 -98.0 + 96.5000 48.2500 -98.0 + 99.2500 51.5000 -98.0 + 99.5000 53.7500 -98.0 + 99.7500 48.5000 -98.0 + 101.7500 39.5000 -98.0 +} -98.0 +{ -98.0 + 116.2500 38.5000 -98.0 + 116.2500 44.5000 -98.0 + 115.2500 46.5000 -98.0 + 116.2500 48.5000 -98.0 + 115.5000 49.2500 -98.0 + 115.2500 53.5000 -98.0 + 116.5000 53.7500 -98.0 + 118.7500 48.5000 -98.0 + 117.7500 46.5000 -98.0 + 117.7500 43.5000 -98.0 +} -98.0 +{ -98.0 + 58.2500 63.5000 -98.0 + 55.5000 66.2500 -98.0 + 52.5000 71.2500 -98.0 + 52.2500 75.5000 -98.0 + 57.5000 71.7500 -98.0 + 60.5000 71.7500 -98.0 + 66.2500 77.5000 -98.0 + 68.5000 77.7500 -98.0 + 68.7500 76.5000 -98.0 + 63.7500 70.5000 -98.0 + 63.7500 67.5000 -98.0 + 61.7500 63.5000 -98.0 +} -98.0 +{ -98.0 + 153.2500 66.5000 -98.0 + 149.2500 74.5000 -98.0 + 143.5000 80.2500 -98.0 + 144.2500 81.5000 -98.0 + 147.5000 77.7500 -98.0 + 151.5000 77.7500 -98.0 + 154.5000 74.7500 -98.0 + 157.5000 74.7500 -98.0 + 160.2500 78.5000 -98.0 + 162.5000 78.7500 -98.0 + 162.7500 76.5000 -98.0 + 160.7500 70.5000 -98.0 + 157.7500 66.5000 -98.0 +} -98.0 +{ -98.0 + 60.2500 87.5000 -98.0 + 50.2500 98.5000 -98.0 + 44.2500 106.5000 -98.0 + 37.2500 119.5000 -98.0 + 32.2500 131.5000 -98.0 + 28.5000 150.2500 -98.0 + 28.2500 159.5000 -98.0 + 29.2500 161.5000 -98.0 + 29.2500 167.5000 -98.0 + 30.2500 169.5000 -98.0 + 30.2500 173.5000 -98.0 + 31.2500 175.5000 -98.0 + 32.2500 183.5000 -98.0 + 34.2500 187.5000 -98.0 + 34.2500 190.5000 -98.0 + 40.2500 202.5000 -98.0 + 46.2500 210.5000 -98.0 + 58.2500 220.5000 -98.0 + 71.5000 227.7500 -98.0 + 80.5000 229.7500 -98.0 + 84.5000 231.7500 -98.0 + 91.2500 233.5000 -98.0 + 107.5000 233.7500 -98.0 + 109.5000 232.7500 -98.0 + 116.5000 231.7500 -98.0 + 126.5000 227.7500 -98.0 + 129.5000 227.7500 -98.0 + 147.5000 217.7500 -98.0 + 156.7500 209.5000 -98.0 + 162.7500 201.5000 -98.0 + 171.7500 184.5000 -98.0 + 175.7500 170.5000 -98.0 + 178.5000 163.7500 -98.0 + 178.7500 147.5000 -98.0 + 177.7500 145.5000 -98.0 + 177.7500 140.5000 -98.0 + 175.7500 133.5000 -98.0 + 174.5000 126.2500 -98.0 + 165.7500 106.5000 -98.0 + 155.7500 96.5000 -98.0 + 153.7500 92.5000 -98.0 + 141.5000 90.2500 -98.0 + 142.2500 91.5000 -98.0 + 145.5000 91.7500 -98.0 + 147.2500 93.5000 -98.0 + 149.5000 93.7500 -98.0 + 152.2500 96.5000 -98.0 + 151.2500 98.5000 -98.0 + 153.2500 102.5000 -98.0 + 163.2500 106.5000 -98.0 + 172.2500 124.5000 -98.0 + 172.2500 130.5000 -98.0 + 174.2500 136.5000 -98.0 + 174.2500 147.5000 -98.0 + 173.5000 149.2500 -98.0 + 173.2500 158.5000 -98.0 + 172.2500 160.5000 -98.0 + 170.2500 170.5000 -98.0 + 166.2500 181.5000 -98.0 + 157.2500 196.5000 -98.0 + 147.5000 207.2500 -98.0 + 140.5000 213.2500 -98.0 + 132.5000 218.2500 -98.0 + 130.5000 218.2500 -98.0 + 124.5000 221.2500 -98.0 + 122.5000 221.2500 -98.0 + 118.5000 223.2500 -98.0 + 115.5000 223.2500 -98.0 + 112.5000 224.2500 -98.0 + 107.7500 222.5000 -98.0 + 100.5000 222.2500 -98.0 + 94.5000 225.2500 -98.0 + 86.5000 225.2500 -98.0 + 70.7500 217.5000 -98.0 + 65.5000 216.2500 -98.0 + 56.5000 208.2500 -98.0 + 54.5000 207.2500 -98.0 + 53.7500 205.5000 -98.0 + 44.7500 194.5000 -98.0 + 40.7500 186.5000 -98.0 + 36.7500 176.5000 -98.0 + 36.7500 174.5000 -98.0 + 35.7500 172.5000 -98.0 + 35.7500 168.5000 -98.0 + 34.7500 166.5000 -98.0 + 34.7500 156.5000 -98.0 + 33.7500 154.5000 -98.0 + 34.7500 142.5000 -98.0 + 33.7500 140.5000 -98.0 + 34.7500 128.5000 -98.0 + 36.7500 124.5000 -98.0 + 48.7500 102.5000 -98.0 + 53.7500 97.5000 -98.0 + 54.7500 95.5000 -98.0 + 59.5000 91.7500 -98.0 + 61.5000 91.7500 -98.0 + 65.5000 89.7500 -98.0 + 73.5000 88.7500 -98.0 + 79.5000 90.7500 -98.0 + 83.2500 94.5000 -98.0 + 84.5000 93.7500 -98.0 + 84.7500 91.5000 -98.0 + 81.5000 90.2500 -98.0 + 80.7500 88.5000 -98.0 + 69.5000 87.2500 -98.0 + 67.5000 88.2500 -98.0 + 66.7500 87.5000 -98.0 +} -98.0 +{ -98.0 + 135.2500 89.5000 -98.0 + 133.5000 91.2500 -98.0 + 134.5000 91.7500 -98.0 + 137.5000 90.7500 -98.0 + 137.7500 89.5000 -98.0 +} -98.0 +{ -98.0 + 128.2500 93.5000 -98.0 + 126.2500 96.5000 -98.0 + 127.5000 96.7500 -98.0 + 129.5000 94.7500 -98.0 +} -98.0 +{ -98.0 + 57.7500 68.5000 -98.0 + 58.5000 67.7500 -98.0 + 59.2500 68.5000 -98.0 + 58.5000 69.2500 -98.0 +} -98.0 +{ -98.0 + 154.7500 70.5000 -98.0 + 155.5000 69.7500 -98.0 + 157.2500 70.5000 -98.0 + 156.5000 72.2500 -98.0 + 154.5000 72.2500 -98.0 + 152.7500 71.5000 -98.0 +} -98.0 +v 192 z -100.000000 -98.0 +{ -98.0 + 116.2500 37.5000 -100.0 + 117.2500 39.5000 -100.0 + 117.2500 47.5000 -100.0 + 116.2500 52.5000 -100.0 + 116.7500 53.5000 -100.0 + 117.7500 51.5000 -100.0 + 121.5000 49.7500 -100.0 + 118.7500 45.5000 -100.0 + 117.7500 38.5000 -100.0 +} -100.0 +{ -100.0 + 100.2500 38.5000 -100.0 + 98.5000 42.2500 -100.0 + 98.2500 44.5000 -100.0 + 95.2500 48.5000 -100.0 + 96.5000 48.7500 -100.0 + 98.2500 50.5000 -100.0 + 98.2500 52.5000 -100.0 + 99.5000 52.7500 -100.0 + 99.7500 51.5000 -100.0 + 98.7500 48.5000 -100.0 + 100.7500 39.5000 -100.0 +} -100.0 +{ -100.0 + 59.2500 62.5000 -100.0 + 56.5000 64.2500 -100.0 + 52.5000 71.2500 -100.0 + 52.2500 74.5000 -100.0 + 53.5000 74.7500 -100.0 + 57.5000 71.7500 -100.0 + 60.5000 71.7500 -100.0 + 62.2500 72.5000 -100.0 + 63.2500 74.5000 -100.0 + 68.7500 77.5000 -100.0 + 63.7500 69.5000 -100.0 + 63.7500 66.5000 -100.0 + 60.7500 62.5000 -100.0 +} -100.0 +{ -100.0 + 154.2500 65.5000 -100.0 + 151.5000 69.2500 -100.0 + 151.2500 71.5000 -100.0 + 146.5000 76.2500 -100.0 + 146.5000 77.7500 -100.0 + 148.5000 76.7500 -100.0 + 151.5000 76.7500 -100.0 + 154.5000 73.7500 -100.0 + 156.5000 73.7500 -100.0 + 160.5000 77.7500 -100.0 + 162.5000 78.7500 -100.0 + 162.7500 75.5000 -100.0 + 160.7500 69.5000 -100.0 + 157.7500 65.5000 -100.0 +} -100.0 +{ -100.0 + 143.2500 79.5000 -100.0 + 142.2500 80.5000 -100.0 + 144.5000 80.7500 -100.0 + 144.7500 79.5000 -100.0 +} -100.0 +{ -100.0 + 61.2500 87.5000 -100.0 + 59.5000 88.2500 -100.0 + 59.2500 89.5000 -100.0 + 51.2500 97.5000 -100.0 + 45.2500 105.5000 -100.0 + 35.2500 124.5000 -100.0 + 31.5000 134.2500 -100.0 + 29.2500 149.5000 -100.0 + 28.5000 151.2500 -100.0 + 28.2500 159.5000 -100.0 + 29.2500 161.5000 -100.0 + 29.2500 165.5000 -100.0 + 30.2500 167.5000 -100.0 + 30.2500 172.5000 -100.0 + 31.2500 174.5000 -100.0 + 31.2500 177.5000 -100.0 + 37.2500 196.5000 -100.0 + 43.2500 206.5000 -100.0 + 50.5000 213.7500 -100.0 + 52.5000 214.7500 -100.0 + 53.2500 216.5000 -100.0 + 54.5000 216.7500 -100.0 + 57.5000 219.7500 -100.0 + 65.5000 224.7500 -100.0 + 84.5000 231.7500 -100.0 + 91.2500 233.5000 -100.0 + 106.5000 233.7500 -100.0 + 108.5000 232.7500 -100.0 + 112.5000 232.7500 -100.0 + 114.5000 231.7500 -100.0 + 116.5000 231.7500 -100.0 + 126.5000 227.7500 -100.0 + 129.7500 227.5000 -100.0 + 136.5000 224.7500 -100.0 + 149.5000 215.7500 -100.0 + 158.5000 206.7500 -100.0 + 162.7500 200.5000 -100.0 + 171.7500 183.5000 -100.0 + 175.7500 169.5000 -100.0 + 178.5000 162.7500 -100.0 + 178.7500 148.5000 -100.0 + 177.7500 146.5000 -100.0 + 177.7500 142.5000 -100.0 + 175.7500 135.5000 -100.0 + 173.7500 124.5000 -100.0 + 163.7500 104.5000 -100.0 + 152.7500 92.5000 -100.0 + 148.5000 92.2500 -100.0 + 146.7500 91.5000 -100.0 + 145.5000 92.2500 -100.0 + 141.5000 91.2500 -100.0 + 145.2500 93.5000 -100.0 + 147.5000 93.7500 -100.0 + 151.2500 96.5000 -100.0 + 151.2500 99.5000 -100.0 + 154.2500 102.5000 -100.0 + 160.5000 104.7500 -100.0 + 163.2500 107.5000 -100.0 + 165.2500 111.5000 -100.0 + 165.2500 113.5000 -100.0 + 166.5000 113.7500 -100.0 + 169.2500 117.5000 -100.0 + 169.2500 119.5000 -100.0 + 172.2500 125.5000 -100.0 + 172.2500 133.5000 -100.0 + 174.2500 137.5000 -100.0 + 174.2500 140.5000 -100.0 + 175.2500 142.5000 -100.0 + 174.5000 143.2500 -100.0 + 173.2500 148.5000 -100.0 + 172.2500 153.5000 -100.0 + 173.2500 155.5000 -100.0 + 169.2500 173.5000 -100.0 + 157.5000 196.2500 -100.0 + 149.5000 205.2500 -100.0 + 139.5000 214.2500 -100.0 + 130.5000 219.2500 -100.0 + 128.5000 219.2500 -100.0 + 122.5000 222.2500 -100.0 + 120.5000 222.2500 -100.0 + 118.5000 223.2500 -100.0 + 111.5000 223.2500 -100.0 + 100.5000 221.2500 -100.0 + 98.5000 223.2500 -100.0 + 94.5000 225.2500 -100.0 + 87.5000 225.2500 -100.0 + 82.5000 224.2500 -100.0 + 74.5000 219.2500 -100.0 + 64.5000 215.2500 -100.0 + 57.7500 209.5000 -100.0 + 45.7500 195.5000 -100.0 + 38.7500 182.5000 -100.0 + 38.7500 179.5000 -100.0 + 36.7500 175.5000 -100.0 + 36.7500 173.5000 -100.0 + 35.7500 171.5000 -100.0 + 35.7500 167.5000 -100.0 + 34.7500 165.5000 -100.0 + 34.7500 143.5000 -100.0 + 33.7500 141.5000 -100.0 + 33.7500 132.5000 -100.0 + 38.7500 122.5000 -100.0 + 42.7500 112.5000 -100.0 + 46.5000 109.7500 -100.0 + 47.7500 105.5000 -100.0 + 55.7500 94.5000 -100.0 + 58.5000 92.7500 -100.0 + 61.5000 92.7500 -100.0 + 63.5000 90.7500 -100.0 + 67.5000 90.7500 -100.0 + 69.5000 89.7500 -100.0 + 71.5000 89.7500 -100.0 + 72.7500 88.5000 -100.0 + 69.5000 88.2500 -100.0 + 67.5000 89.2500 -100.0 + 64.7500 87.5000 -100.0 +} -100.0 +{ -100.0 + 75.2500 89.5000 -100.0 + 74.5000 90.2500 -100.0 + 81.2500 94.5000 -100.0 + 84.5000 94.7500 -100.0 + 82.7500 91.5000 -100.0 + 81.7500 89.5000 -100.0 +} -100.0 +{ -100.0 + 133.2500 91.5000 -100.0 + 132.5000 92.2500 -100.0 + 133.5000 92.7500 -100.0 + 134.7500 91.5000 -100.0 +} -100.0 +{ -100.0 + 127.2500 94.5000 -100.0 + 125.2500 97.5000 -100.0 + 126.5000 97.7500 -100.0 + 128.5000 95.7500 -100.0 +} -100.0 +{ -100.0 + 110.2500 103.5000 -100.0 + 109.2500 104.5000 -100.0 + 110.7500 104.5000 -100.0 +} -100.0 +{ -100.0 + 58.7500 66.5000 -100.0 + 59.5000 65.7500 -100.0 + 60.2500 66.5000 -100.0 + 59.5000 68.2500 -100.0 +} -100.0 +{ -100.0 + 154.7500 69.5000 -100.0 + 155.5000 68.7500 -100.0 + 156.2500 69.5000 -100.0 + 155.5000 70.2500 -100.0 +} -100.0 +v 186 z -102.000000 -64.0 +{ -102.0 + 100.2500 37.5000 -102.0 + 96.5000 45.2500 -102.0 + 94.5000 46.2500 -102.0 + 92.2500 49.5000 -102.0 + 96.5000 49.7500 -102.0 + 98.5000 52.7500 -102.0 + 98.7500 49.5000 -102.0 + 97.7500 47.5000 -102.0 + 98.7500 42.5000 -102.0 + 100.7500 38.5000 -102.0 +} -102.0 +{ -102.0 + 117.2500 38.5000 -102.0 + 117.2500 39.5000 -102.0 + 118.2500 41.5000 -102.0 + 118.2500 49.5000 -102.0 + 117.5000 51.2500 -102.0 + 117.5000 53.7500 -102.0 + 119.5000 50.7500 -102.0 + 124.5000 51.7500 -102.0 + 124.7500 50.5000 -102.0 + 119.7500 45.5000 -102.0 + 119.7500 43.5000 -102.0 +} -102.0 +{ -102.0 + 58.2500 62.5000 -102.0 + 56.2500 64.5000 -102.0 + 52.5000 71.2500 -102.0 + 52.2500 73.5000 -102.0 + 54.5000 73.7500 -102.0 + 57.5000 70.7500 -102.0 + 60.5000 70.7500 -102.0 + 63.5000 73.7500 -102.0 + 68.7500 76.5000 -102.0 + 67.7500 73.5000 -102.0 + 63.7500 69.5000 -102.0 + 63.7500 66.5000 -102.0 + 61.7500 62.5000 -102.0 +} -102.0 +{ -102.0 + 120.2500 64.5000 -102.0 + 119.5000 65.2500 -102.0 + 121.2500 67.5000 -102.0 + 121.5000 70.7500 -102.0 + 121.7500 67.5000 -102.0 +} -102.0 +{ -102.0 + 154.2500 64.5000 -102.0 + 152.5000 66.2500 -102.0 + 150.2500 72.5000 -102.0 + 148.5000 73.2500 -102.0 + 145.2500 77.5000 -102.0 + 150.5000 75.7500 -102.0 + 153.5000 71.7500 -102.0 + 156.5000 71.7500 -102.0 + 160.2500 77.5000 -102.0 + 162.5000 77.7500 -102.0 + 162.7500 74.5000 -102.0 + 160.7500 70.5000 -102.0 + 160.7500 68.5000 -102.0 + 157.7500 64.5000 -102.0 +} -102.0 +{ -102.0 + 142.2500 79.5000 -102.0 + 140.2500 81.5000 -102.0 + 142.5000 81.7500 -102.0 + 143.7500 79.5000 -102.0 +} -102.0 +{ -102.0 + 122.2500 82.5000 -102.0 + 121.2500 84.5000 -102.0 + 125.5000 84.7500 -102.0 + 123.7500 82.5000 -102.0 +} -102.0 +{ -102.0 + 77.2500 87.5000 -102.0 + 76.2500 89.5000 -102.0 + 74.2500 90.5000 -102.0 + 78.5000 91.7500 -102.0 + 84.5000 95.7500 -102.0 + 84.7500 94.5000 -102.0 + 81.7500 88.5000 -102.0 +} -102.0 +{ -102.0 + 60.2500 88.5000 -102.0 + 52.5000 96.2500 -102.0 + 46.5000 104.2500 -102.0 + 33.2500 129.5000 -102.0 + 29.5000 146.2500 -102.0 + 28.2500 157.5000 -102.0 + 30.2500 163.5000 -102.0 + 30.2500 170.5000 -102.0 + 32.2500 177.5000 -102.0 + 33.2500 183.5000 -102.0 + 39.5000 199.7500 -102.0 + 46.5000 209.7500 -102.0 + 48.5000 210.7500 -102.0 + 60.2500 221.5000 -102.0 + 73.2500 228.5000 -102.0 + 86.2500 232.5000 -102.0 + 112.5000 232.7500 -102.0 + 114.5000 231.7500 -102.0 + 117.5000 231.7500 -102.0 + 127.5000 227.7500 -102.0 + 129.5000 227.7500 -102.0 + 135.5000 224.7500 -102.0 + 146.5000 217.7500 -102.0 + 152.5000 211.7500 -102.0 + 154.5000 210.7500 -102.0 + 162.7500 199.5000 -102.0 + 171.5000 182.7500 -102.0 + 174.7500 171.5000 -102.0 + 178.5000 161.7500 -102.0 + 178.7500 150.5000 -102.0 + 176.7500 143.5000 -102.0 + 174.7500 129.5000 -102.0 + 172.7500 125.5000 -102.0 + 172.7500 123.5000 -102.0 + 161.7500 102.5000 -102.0 + 155.7500 97.5000 -102.0 + 153.7500 93.5000 -102.0 + 150.5000 92.2500 -102.0 + 147.5000 93.2500 -102.0 + 145.7500 91.5000 -102.0 + 144.5000 92.2500 -102.0 + 139.2500 91.5000 -102.0 + 142.2500 93.5000 -102.0 + 147.5000 94.7500 -102.0 + 151.2500 98.5000 -102.0 + 151.2500 100.5000 -102.0 + 157.2500 104.5000 -102.0 + 159.5000 104.7500 -102.0 + 163.2500 108.5000 -102.0 + 163.2500 110.5000 -102.0 + 170.2500 121.5000 -102.0 + 170.2500 123.5000 -102.0 + 172.2500 127.5000 -102.0 + 171.2500 128.5000 -102.0 + 172.2500 130.5000 -102.0 + 172.2500 134.5000 -102.0 + 174.2500 138.5000 -102.0 + 174.2500 145.5000 -102.0 + 172.5000 149.2500 -102.0 + 172.2500 160.5000 -102.0 + 171.2500 162.5000 -102.0 + 170.2500 169.5000 -102.0 + 162.2500 188.5000 -102.0 + 155.2500 198.5000 -102.0 + 147.5000 207.2500 -102.0 + 140.5000 213.2500 -102.0 + 125.5000 221.2500 -102.0 + 122.5000 221.2500 -102.0 + 118.5000 223.2500 -102.0 + 111.5000 223.2500 -102.0 + 107.5000 221.2500 -102.0 + 104.5000 222.2500 -102.0 + 101.5000 221.2500 -102.0 + 93.5000 225.2500 -102.0 + 90.5000 225.2500 -102.0 + 80.5000 223.2500 -102.0 + 72.7500 218.5000 -102.0 + 66.5000 216.2500 -102.0 + 59.5000 211.2500 -102.0 + 51.7500 203.5000 -102.0 + 45.7500 194.5000 -102.0 + 37.7500 178.5000 -102.0 + 36.7500 171.5000 -102.0 + 33.7500 160.5000 -102.0 + 34.5000 159.7500 -102.0 + 34.7500 144.5000 -102.0 + 33.7500 142.5000 -102.0 + 33.7500 136.5000 -102.0 + 34.7500 133.5000 -102.0 + 42.7500 113.5000 -102.0 + 46.7500 109.5000 -102.0 + 49.7500 102.5000 -102.0 + 52.5000 99.7500 -102.0 + 56.5000 93.7500 -102.0 + 59.5000 93.7500 -102.0 + 65.5000 90.7500 -102.0 + 67.5000 90.7500 -102.0 + 72.5000 88.7500 -102.0 + 71.5000 88.2500 -102.0 + 69.5000 89.2500 -102.0 +} -102.0 +{ -102.0 + 129.2500 91.5000 -102.0 + 127.5000 92.2500 -102.0 + 124.2500 97.5000 -102.0 + 125.5000 97.7500 -102.0 + 129.5000 94.7500 -102.0 + 128.7500 93.5000 -102.0 + 129.7500 92.5000 -102.0 +} -102.0 +{ -102.0 + 134.2500 91.5000 -102.0 + 130.2500 93.5000 -102.0 + 134.5000 94.7500 -102.0 + 135.7500 91.5000 -102.0 +} -102.0 +{ -102.0 + 111.2500 104.5000 -102.0 + 110.2500 105.5000 -102.0 + 111.7500 105.5000 -102.0 +} -102.0 +{ -102.0 + 58.7500 66.5000 -102.0 + 59.5000 65.7500 -102.0 + 61.2500 66.5000 -102.0 + 60.5000 67.2500 -102.0 +} -102.0 +v 208 z -104.000000 -64.0 +{ -104.0 + 99.2500 38.5000 -104.0 + 97.5000 41.2500 -104.0 + 97.2500 43.5000 -104.0 + 90.5000 49.2500 -104.0 + 90.5000 50.7500 -104.0 + 92.5000 51.7500 -104.0 + 93.5000 49.7500 -104.0 + 95.5000 48.7500 -104.0 + 97.2500 50.5000 -104.0 + 97.5000 52.7500 -104.0 + 97.7500 45.5000 -104.0 + 99.7500 39.5000 -104.0 +} -104.0 +{ -104.0 + 118.2500 39.5000 -104.0 + 118.2500 44.5000 -104.0 + 119.2500 46.5000 -104.0 + 118.2500 53.5000 -104.0 + 121.5000 50.7500 -104.0 + 123.2500 53.5000 -104.0 + 124.5000 53.7500 -104.0 + 127.7500 52.5000 -104.0 + 128.7500 50.5000 -104.0 + 125.5000 49.2500 -104.0 + 121.7500 46.5000 -104.0 +} -104.0 +{ -104.0 + 121.2500 59.5000 -104.0 + 120.2500 61.5000 -104.0 + 121.2500 63.5000 -104.0 + 120.5000 65.2500 -104.0 + 123.2500 66.5000 -104.0 + 123.2500 68.5000 -104.0 + 124.5000 68.7500 -104.0 + 123.7500 67.5000 -104.0 + 123.7500 64.5000 -104.0 +} -104.0 +{ -104.0 + 58.2500 61.5000 -104.0 + 54.5000 66.2500 -104.0 + 52.5000 72.7500 -104.0 + 54.5000 73.7500 -104.0 + 58.5000 69.7500 -104.0 + 60.5000 68.7500 -104.0 + 63.5000 72.7500 -104.0 + 69.5000 75.7500 -104.0 + 69.7500 74.5000 -104.0 + 63.7500 67.5000 -104.0 + 63.7500 65.5000 -104.0 + 61.7500 61.5000 -104.0 +} -104.0 +{ -104.0 + 93.2500 61.5000 -104.0 + 92.5000 62.2500 -104.0 + 92.2500 64.5000 -104.0 + 93.5000 64.7500 -104.0 + 93.7500 62.5000 -104.0 +} -104.0 +{ -104.0 + 153.2500 62.5000 -104.0 + 152.2500 63.5000 -104.0 + 151.2500 68.5000 -104.0 + 145.5000 76.2500 -104.0 + 146.5000 76.7500 -104.0 + 153.5000 69.7500 -104.0 + 155.5000 69.7500 -104.0 + 159.2500 73.5000 -104.0 + 159.2500 75.5000 -104.0 + 162.5000 77.7500 -104.0 + 162.7500 74.5000 -104.0 + 159.7500 65.5000 -104.0 + 156.7500 62.5000 -104.0 +} -104.0 +{ -104.0 + 71.2500 77.5000 -104.0 + 71.5000 78.7500 -104.0 + 73.5000 79.7500 -104.0 +} -104.0 +{ -104.0 + 61.2500 88.5000 -104.0 + 59.5000 89.2500 -104.0 + 59.2500 90.5000 -104.0 + 56.5000 93.2500 -104.0 + 54.5000 94.2500 -104.0 + 54.2500 95.5000 -104.0 + 47.5000 103.2500 -104.0 + 34.2500 128.5000 -104.0 + 30.2500 145.5000 -104.0 + 28.2500 155.5000 -104.0 + 30.2500 162.5000 -104.0 + 30.2500 168.5000 -104.0 + 32.2500 175.5000 -104.0 + 33.2500 181.5000 -104.0 + 39.5000 198.7500 -104.0 + 45.2500 207.5000 -104.0 + 53.2500 214.5000 -104.0 + 54.2500 216.5000 -104.0 + 65.5000 224.7500 -104.0 + 79.5000 230.7500 -104.0 + 86.2500 232.5000 -104.0 + 111.5000 232.7500 -104.0 + 113.5000 231.7500 -104.0 + 120.5000 230.7500 -104.0 + 135.7500 224.5000 -104.0 + 144.5000 218.7500 -104.0 + 151.5000 211.7500 -104.0 + 153.5000 210.7500 -104.0 + 162.7500 198.5000 -104.0 + 169.5000 185.7500 -104.0 + 178.5000 160.7500 -104.0 + 178.7500 151.5000 -104.0 + 176.7500 144.5000 -104.0 + 175.7500 137.5000 -104.0 + 171.7500 123.5000 -104.0 + 163.7500 106.5000 -104.0 + 159.7500 100.5000 -104.0 + 154.7500 96.5000 -104.0 + 153.7500 94.5000 -104.0 + 150.5000 93.2500 -104.0 + 148.5000 94.2500 -104.0 + 146.5000 94.2500 -104.0 + 144.7500 92.5000 -104.0 + 144.7500 90.5000 -104.0 + 143.2500 93.5000 -104.0 + 150.2500 98.5000 -104.0 + 150.2500 100.5000 -104.0 + 154.5000 104.7500 -104.0 + 159.5000 105.7500 -104.0 + 161.2500 107.5000 -104.0 + 163.2500 113.5000 -104.0 + 164.5000 113.7500 -104.0 + 165.2500 115.5000 -104.0 + 168.2500 118.5000 -104.0 + 168.2500 120.5000 -104.0 + 171.2500 126.5000 -104.0 + 171.2500 132.5000 -104.0 + 172.2500 134.5000 -104.0 + 172.2500 136.5000 -104.0 + 174.2500 140.5000 -104.0 + 174.2500 145.5000 -104.0 + 172.5000 149.2500 -104.0 + 172.2500 159.5000 -104.0 + 168.2500 174.5000 -104.0 + 163.5000 184.2500 -104.0 + 163.2500 186.5000 -104.0 + 154.5000 198.2500 -104.0 + 145.2500 209.5000 -104.0 + 133.5000 217.2500 -104.0 + 131.5000 217.2500 -104.0 + 127.5000 220.2500 -104.0 + 125.5000 220.2500 -104.0 + 121.5000 222.2500 -104.0 + 114.5000 223.2500 -104.0 + 106.5000 221.2500 -104.0 + 104.5000 222.2500 -104.0 + 103.7500 221.5000 -104.0 + 100.5000 221.2500 -104.0 + 96.5000 224.2500 -104.0 + 91.5000 225.2500 -104.0 + 81.5000 223.2500 -104.0 + 73.5000 219.2500 -104.0 + 61.5000 212.2500 -104.0 + 51.7500 202.5000 -104.0 + 48.7500 198.5000 -104.0 + 38.7500 180.5000 -104.0 + 38.7500 178.5000 -104.0 + 36.7500 174.5000 -104.0 + 35.7500 166.5000 -104.0 + 33.7500 159.5000 -104.0 + 34.5000 158.7500 -104.0 + 34.7500 146.5000 -104.0 + 33.7500 143.5000 -104.0 + 34.5000 141.7500 -104.0 + 34.7500 134.5000 -104.0 + 37.5000 128.7500 -104.0 + 37.7500 126.5000 -104.0 + 41.7500 116.5000 -104.0 + 45.5000 112.7500 -104.0 + 48.5000 107.7500 -104.0 + 48.7500 105.5000 -104.0 + 57.5000 93.7500 -104.0 + 60.5000 93.7500 -104.0 + 62.5000 91.7500 -104.0 + 64.5000 91.7500 -104.0 + 70.7500 89.5000 -104.0 + 67.5000 89.2500 -104.0 + 64.5000 90.2500 -104.0 + 62.7500 88.5000 -104.0 +} -104.0 +{ -104.0 + 76.2500 88.5000 -104.0 + 74.5000 90.2500 -104.0 + 75.2500 91.5000 -104.0 + 78.5000 90.7500 -104.0 + 82.2500 96.5000 -104.0 + 85.5000 96.7500 -104.0 + 85.7500 95.5000 -104.0 + 82.5000 88.2500 -104.0 + 80.5000 89.2500 -104.0 +} -104.0 +{ -104.0 + 127.2500 92.5000 -104.0 + 121.5000 96.2500 -104.0 + 120.5000 99.7500 -104.0 + 123.5000 98.7500 -104.0 + 126.5000 95.7500 -104.0 + 128.5000 95.7500 -104.0 + 130.5000 93.7500 -104.0 + 135.5000 94.7500 -104.0 + 137.5000 93.7500 -104.0 + 140.7500 93.5000 -104.0 + 136.7500 92.5000 -104.0 +} -104.0 +{ -104.0 + 58.7500 65.5000 -104.0 + 59.5000 64.7500 -104.0 + 61.2500 65.5000 -104.0 + 60.5000 66.2500 -104.0 +} -104.0 +{ -104.0 + 80.7500 91.5000 -104.0 + 81.5000 90.7500 -104.0 + 83.2500 92.5000 -104.0 + 82.5000 93.2500 -104.0 +} -104.0 +{ -104.0 + 152.7500 97.5000 -104.0 + 153.5000 96.7500 -104.0 + 154.2500 97.5000 -104.0 + 157.2500 101.5000 -104.0 + 156.5000 102.2500 -104.0 + 154.5000 101.2500 -104.0 +} -104.0 +//v 230 z -106.000000 -64.0 +{ -64.0 + 99.2500 37.5000 -64.0 + 95.5000 44.2500 -64.0 + 87.5000 50.2500 -64.0 + 91.2500 55.5000 -64.0 + 91.2500 63.5000 -64.0 + 93.5000 63.7500 -64.0 + 91.7500 61.5000 -64.0 + 91.7500 59.5000 -64.0 + 94.7500 55.5000 -64.0 + 93.5000 55.2500 -64.0 + 91.7500 53.5000 -64.0 + 92.5000 49.7500 -64.0 + 94.5000 48.7500 -64.0 + 97.5000 52.7500 -64.0 + 97.7500 49.5000 -64.0 + 96.7500 47.5000 -64.0 + 97.7500 43.5000 -64.0 + 100.7500 37.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 38.5000 -64.0 + 118.2500 39.5000 -64.0 + 119.2500 41.5000 -64.0 + 119.2500 47.5000 -64.0 + 120.2500 49.5000 -64.0 + 119.5000 50.2500 -64.0 + 119.2500 52.5000 -64.0 + 121.5000 51.7500 -64.0 + 123.2500 52.5000 -64.0 + 124.5000 50.7500 -64.0 + 126.5000 50.7500 -64.0 + 128.5000 52.7500 -64.0 + 130.5000 53.7500 -64.0 + 134.5000 51.7500 -64.0 + 132.7500 50.5000 -64.0 + 130.5000 50.2500 -64.0 + 124.5000 48.2500 -64.0 + 121.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 59.2500 59.5000 -64.0 + 57.2500 61.5000 -64.0 + 52.2500 71.5000 -64.0 + 53.2500 73.5000 -64.0 + 59.5000 67.7500 -64.0 + 62.5000 67.7500 -64.0 + 64.2500 70.5000 -64.0 + 64.2500 72.5000 -64.0 + 69.5000 74.7500 -64.0 + 69.7500 73.5000 -64.0 + 65.7500 69.5000 -64.0 + 63.7500 65.5000 -64.0 + 62.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 152.2500 59.5000 -64.0 + 151.5000 60.2500 -64.0 + 151.2500 63.5000 -64.0 + 150.2500 66.5000 -64.0 + 149.5000 68.2500 -64.0 + 146.5000 73.2500 -64.0 + 147.2500 74.5000 -64.0 + 149.7500 72.5000 -64.0 + 150.7500 70.5000 -64.0 + 153.5000 68.7500 -64.0 + 155.5000 68.7500 -64.0 + 157.2500 70.5000 -64.0 + 159.2500 74.5000 -64.0 + 162.2500 78.5000 -64.0 + 163.5000 77.7500 -64.0 + 163.7500 75.5000 -64.0 + 160.7500 69.5000 -64.0 + 160.7500 67.5000 -64.0 + 159.7500 64.5000 -64.0 + 154.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 65.5000 -64.0 + 126.2500 67.5000 -64.0 + 127.7500 67.5000 -64.0 + 126.7500 65.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 82.5000 -64.0 + 92.2500 83.5000 -64.0 + 93.5000 83.7500 -64.0 +} -64.0 +{ -64.0 + 118.2500 83.5000 -64.0 + 116.2500 86.5000 -64.0 + 120.5000 84.7500 -64.0 +} -64.0 +{ -64.0 + 60.2500 89.5000 -64.0 + 58.5000 92.2500 -64.0 + 56.5000 93.2500 -64.0 + 51.2500 98.5000 -64.0 + 38.5000 120.2500 -64.0 + 38.2500 122.5000 -64.0 + 34.2500 130.5000 -64.0 + 29.5000 148.2500 -64.0 + 29.2500 158.5000 -64.0 + 30.2500 160.5000 -64.0 + 30.2500 165.5000 -64.0 + 32.2500 172.5000 -64.0 + 33.2500 181.5000 -64.0 + 39.2500 196.5000 -64.0 + 45.2500 206.5000 -64.0 + 58.2500 219.5000 -64.0 + 68.2500 226.5000 -64.0 + 79.5000 230.7500 -64.0 + 88.2500 232.5000 -64.0 + 108.5000 232.7500 -64.0 + 110.5000 231.7500 -64.0 + 117.5000 231.7500 -64.0 + 121.5000 229.7500 -64.0 + 124.5000 229.7500 -64.0 + 136.5000 223.7500 -64.0 + 147.5000 215.7500 -64.0 + 158.5000 203.7500 -64.0 + 162.7500 197.5000 -64.0 + 169.5000 184.7500 -64.0 + 178.5000 159.7500 -64.0 + 178.7500 152.5000 -64.0 + 176.7500 146.5000 -64.0 + 176.7500 142.5000 -64.0 + 174.7500 138.5000 -64.0 + 171.7500 124.5000 -64.0 + 160.7500 102.5000 -64.0 + 152.7500 94.5000 -64.0 + 150.5000 94.2500 -64.0 + 148.5000 95.2500 -64.0 + 138.5000 94.2500 -64.0 + 134.5000 92.2500 -64.0 + 131.5000 93.2500 -64.0 + 128.5000 92.2500 -64.0 + 125.5000 95.2500 -64.0 + 122.5000 95.2500 -64.0 + 121.5000 93.2500 -64.0 + 121.2500 98.5000 -64.0 + 117.5000 104.7500 -64.0 + 119.5000 103.7500 -64.0 + 123.5000 97.7500 -64.0 + 129.5000 94.7500 -64.0 + 140.5000 94.7500 -64.0 + 144.2500 96.5000 -64.0 + 145.2500 98.5000 -64.0 + 148.5000 98.7500 -64.0 + 155.2500 108.5000 -64.0 + 159.2500 109.5000 -64.0 + 161.5000 113.7500 -64.0 + 163.5000 114.7500 -64.0 + 166.2500 118.5000 -64.0 + 170.2500 126.5000 -64.0 + 171.2500 136.5000 -64.0 + 173.2500 140.5000 -64.0 + 173.2500 145.5000 -64.0 + 171.2500 150.5000 -64.0 + 172.2500 152.5000 -64.0 + 171.2500 164.5000 -64.0 + 168.2500 173.5000 -64.0 + 164.5000 181.2500 -64.0 + 164.2500 183.5000 -64.0 + 161.2500 186.5000 -64.0 + 158.2500 192.5000 -64.0 + 147.5000 207.2500 -64.0 + 139.5000 213.2500 -64.0 + 121.5000 222.2500 -64.0 + 118.5000 222.2500 -64.0 + 116.5000 223.2500 -64.0 + 101.5000 220.2500 -64.0 + 95.5000 224.2500 -64.0 + 88.5000 224.2500 -64.0 + 81.5000 223.2500 -64.0 + 69.5000 217.2500 -64.0 + 56.7500 207.5000 -64.0 + 50.7500 200.5000 -64.0 + 38.7500 181.5000 -64.0 + 38.7500 179.5000 -64.0 + 37.7500 177.5000 -64.0 + 36.7500 170.5000 -64.0 + 33.7500 159.5000 -64.0 + 34.5000 157.7500 -64.0 + 34.7500 141.5000 -64.0 + 35.7500 139.5000 -64.0 + 34.7500 136.5000 -64.0 + 38.5000 127.7500 -64.0 + 40.7500 119.5000 -64.0 + 48.5000 112.7500 -64.0 + 48.7500 106.5000 -64.0 + 57.5000 94.7500 -64.0 + 60.5000 94.7500 -64.0 + 64.5000 91.7500 -64.0 + 69.5000 91.7500 -64.0 + 69.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 76.2500 89.5000 -64.0 + 75.5000 90.2500 -64.0 + 73.5000 90.2500 -64.0 + 71.5000 91.2500 -64.0 + 73.2500 92.5000 -64.0 + 75.5000 92.7500 -64.0 + 77.5000 91.7500 -64.0 + 79.5000 91.7500 -64.0 + 81.2500 93.5000 -64.0 + 80.2500 95.5000 -64.0 + 85.2500 98.5000 -64.0 + 87.5000 98.7500 -64.0 + 87.7500 96.5000 -64.0 + 86.5000 95.2500 -64.0 + 84.5000 96.2500 -64.0 + 81.7500 94.5000 -64.0 + 82.5000 93.7500 -64.0 + 84.7500 93.5000 -64.0 + 82.5000 90.2500 -64.0 + 80.5000 91.2500 -64.0 +} -64.0 +{ -64.0 + 143.2500 89.5000 -64.0 + 143.2500 90.5000 -64.0 + 144.5000 90.7500 -64.0 +} -64.0 +{ -64.0 + 118.2500 118.5000 -64.0 + 117.5000 121.7500 -64.0 + 121.2500 124.5000 -64.0 + 121.7500 123.5000 -64.0 + 119.7500 121.5000 -64.0 + 119.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 144.2500 132.5000 -64.0 + 143.2500 134.5000 -64.0 + 144.2500 136.5000 -64.0 + 147.5000 136.7500 -64.0 + 147.7500 132.5000 -64.0 +} -64.0 +{ -64.0 + 59.7500 63.5000 -64.0 + 60.5000 62.7500 -64.0 + 61.2500 63.5000 -64.0 + 60.5000 65.2500 -64.0 +} -64.0 +{ -64.0 + 153.7500 65.5000 -64.0 + 155.5000 64.7500 -64.0 + 157.2500 65.5000 -64.0 + 156.5000 67.2500 -64.0 + 154.5000 67.2500 -64.0 +} -64.0 +{ -64.0 + 151.7500 97.5000 -64.0 + 152.5000 96.7500 -64.0 + 155.2500 99.5000 -64.0 + 156.2500 101.5000 -64.0 + 155.5000 103.2500 -64.0 + 152.7500 99.5000 -64.0 +} -64.0 +v 251 z -108.000000 -64.0 +{ -64.0 + 98.2500 38.5000 -64.0 + 95.2500 44.5000 -64.0 + 92.2500 46.5000 -64.0 + 81.5000 50.2500 -64.0 + 84.5000 52.7500 -64.0 + 88.5000 50.7500 -64.0 + 91.7500 53.5000 -64.0 + 90.7500 51.5000 -64.0 + 92.5000 48.7500 -64.0 + 95.5000 49.7500 -64.0 + 97.5000 53.7500 -64.0 + 97.7500 50.5000 -64.0 + 96.7500 48.5000 -64.0 + 96.7500 45.5000 -64.0 + 98.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 39.5000 -64.0 + 119.2500 42.5000 -64.0 + 120.2500 44.5000 -64.0 + 119.5000 52.7500 -64.0 + 122.5000 51.7500 -64.0 + 123.5000 49.7500 -64.0 + 125.5000 49.7500 -64.0 + 132.2500 52.5000 -64.0 + 132.7500 57.5000 -64.0 + 133.7500 55.5000 -64.0 + 136.5000 53.7500 -64.0 + 141.5000 53.7500 -64.0 + 144.5000 54.7500 -64.0 + 149.2500 59.5000 -64.0 + 149.2500 63.5000 -64.0 + 145.5000 71.2500 -64.0 + 145.2500 73.5000 -64.0 + 147.5000 73.7500 -64.0 + 147.7500 72.5000 -64.0 + 153.5000 67.7500 -64.0 + 157.2500 69.5000 -64.0 + 160.2500 74.5000 -64.0 + 160.2500 76.5000 -64.0 + 163.2500 80.5000 -64.0 + 164.7500 79.5000 -64.0 + 163.7500 77.5000 -64.0 + 163.7500 74.5000 -64.0 + 157.7500 60.5000 -64.0 + 152.7500 56.5000 -64.0 + 140.7500 51.5000 -64.0 + 128.5000 49.2500 -64.0 + 122.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 62.2500 56.5000 -64.0 + 60.5000 57.2500 -64.0 + 58.2500 59.5000 -64.0 + 52.5000 70.2500 -64.0 + 52.2500 73.5000 -64.0 + 53.5000 73.7500 -64.0 + 59.5000 66.7500 -64.0 + 62.5000 66.7500 -64.0 + 68.2500 73.5000 -64.0 + 69.7500 73.5000 -64.0 + 64.7500 65.5000 -64.0 + 64.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 64.5000 -64.0 + 131.5000 65.2500 -64.0 + 132.5000 65.7500 -64.0 + 133.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 79.5000 -64.0 + 106.5000 84.7500 -64.0 + 106.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 82.5000 -64.0 + 93.2500 83.5000 -64.0 + 94.5000 83.7500 -64.0 + 94.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 84.5000 -64.0 + 119.2500 85.5000 -64.0 + 120.5000 85.7500 -64.0 +} -64.0 +{ -64.0 + 140.2500 86.5000 -64.0 + 142.7500 88.5000 -64.0 + 141.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 123.2500 88.5000 -64.0 + 122.2500 89.5000 -64.0 + 124.5000 89.7500 -64.0 + 124.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 81.2500 89.5000 -64.0 + 81.2500 92.5000 -64.0 + 79.5000 93.2500 -64.0 + 77.5000 91.2500 -64.0 + 75.5000 92.2500 -64.0 + 72.5000 92.2500 -64.0 + 70.5000 90.2500 -64.0 + 68.5000 91.2500 -64.0 + 60.5000 90.2500 -64.0 + 50.5000 100.2500 -64.0 + 35.5000 129.2500 -64.0 + 29.5000 149.2500 -64.0 + 29.2500 156.5000 -64.0 + 31.2500 163.5000 -64.0 + 31.2500 168.5000 -64.0 + 32.2500 170.5000 -64.0 + 33.2500 179.5000 -64.0 + 40.2500 197.5000 -64.0 + 49.2500 209.5000 -64.0 + 58.2500 219.5000 -64.0 + 68.2500 226.5000 -64.0 + 78.2500 230.5000 -64.0 + 83.2500 231.5000 -64.0 + 114.5000 231.7500 -64.0 + 116.5000 230.7500 -64.0 + 119.5000 230.7500 -64.0 + 129.5000 227.7500 -64.0 + 139.5000 221.7500 -64.0 + 147.7500 214.5000 -64.0 + 156.7500 204.5000 -64.0 + 163.7500 194.5000 -64.0 + 169.7500 182.5000 -64.0 + 177.5000 161.7500 -64.0 + 178.7500 153.5000 -64.0 + 177.7500 151.5000 -64.0 + 174.7500 137.5000 -64.0 + 172.7500 133.5000 -64.0 + 172.7500 130.5000 -64.0 + 170.7500 126.5000 -64.0 + 170.7500 124.5000 -64.0 + 159.7500 102.5000 -64.0 + 152.7500 95.5000 -64.0 + 149.5000 95.2500 -64.0 + 145.5000 97.2500 -64.0 + 140.5000 94.2500 -64.0 + 138.5000 95.2500 -64.0 + 135.5000 94.2500 -64.0 + 132.2500 95.5000 -64.0 + 140.5000 95.7500 -64.0 + 145.5000 100.7500 -64.0 + 148.5000 99.7500 -64.0 + 152.2500 106.5000 -64.0 + 152.5000 108.7500 -64.0 + 158.5000 111.7500 -64.0 + 167.2500 122.5000 -64.0 + 167.2500 124.5000 -64.0 + 169.2500 128.5000 -64.0 + 169.2500 133.5000 -64.0 + 170.2500 135.5000 -64.0 + 170.2500 137.5000 -64.0 + 172.2500 139.5000 -64.0 + 171.2500 153.5000 -64.0 + 172.2500 155.5000 -64.0 + 172.2500 160.5000 -64.0 + 167.5000 174.2500 -64.0 + 167.2500 176.5000 -64.0 + 165.5000 178.2500 -64.0 + 165.2500 180.5000 -64.0 + 160.5000 185.2500 -64.0 + 158.2500 191.5000 -64.0 + 150.2500 203.5000 -64.0 + 145.2500 208.5000 -64.0 + 138.5000 213.2500 -64.0 + 123.5000 221.2500 -64.0 + 121.5000 221.2500 -64.0 + 119.5000 222.2500 -64.0 + 101.5000 220.2500 -64.0 + 93.5000 224.2500 -64.0 + 88.5000 224.2500 -64.0 + 83.5000 223.2500 -64.0 + 73.5000 219.2500 -64.0 + 63.5000 213.2500 -64.0 + 50.7500 200.5000 -64.0 + 44.7500 189.5000 -64.0 + 39.7500 181.5000 -64.0 + 39.7500 179.5000 -64.0 + 36.7500 173.5000 -64.0 + 35.7500 163.5000 -64.0 + 34.7500 161.5000 -64.0 + 34.7500 145.5000 -64.0 + 35.5000 143.7500 -64.0 + 35.7500 134.5000 -64.0 + 39.5000 126.7500 -64.0 + 40.7500 121.5000 -64.0 + 45.5000 114.7500 -64.0 + 49.5000 112.7500 -64.0 + 49.7500 105.5000 -64.0 + 58.5000 95.7500 -64.0 + 60.5000 95.7500 -64.0 + 64.5000 92.7500 -64.0 + 76.5000 93.7500 -64.0 + 79.5000 96.7500 -64.0 + 81.5000 97.7500 -64.0 + 86.5000 98.7500 -64.0 + 86.7500 97.5000 -64.0 + 84.5000 97.2500 -64.0 + 82.7500 93.5000 -64.0 + 83.5000 92.7500 -64.0 + 82.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 90.5000 -64.0 + 89.2500 91.5000 -64.0 + 90.5000 91.7500 -64.0 +} -64.0 +{ -64.0 + 128.2500 92.5000 -64.0 + 126.2500 95.5000 -64.0 + 128.5000 95.7500 -64.0 + 129.7500 92.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 94.5000 -64.0 + 122.2500 97.5000 -64.0 + 123.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 102.5000 -64.0 + 118.5000 106.2500 -64.0 + 119.5000 106.7500 -64.0 + 120.7500 103.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 120.5000 -64.0 + 119.2500 124.5000 -64.0 + 120.5000 124.7500 -64.0 + 126.2500 130.5000 -64.0 + 131.2500 133.5000 -64.0 + 135.5000 133.7500 -64.0 + 138.5000 134.7500 -64.0 + 139.2500 136.5000 -64.0 + 142.2500 138.5000 -64.0 + 147.5000 139.7500 -64.0 + 149.5000 138.7500 -64.0 + 150.7500 132.5000 -64.0 + 145.5000 129.2500 -64.0 + 142.5000 130.2500 -64.0 + 135.7500 126.5000 -64.0 + 133.5000 126.2500 -64.0 + 130.5000 127.2500 -64.0 + 125.7500 125.5000 -64.0 + 126.7500 122.5000 -64.0 + 124.5000 122.2500 -64.0 + 123.5000 124.2500 -64.0 + 121.5000 124.2500 -64.0 + 118.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 61.5000 -64.0 + 153.5000 60.7500 -64.0 + 154.2500 61.5000 -64.0 + 157.2500 65.5000 -64.0 + 156.5000 66.2500 -64.0 + 154.5000 66.2500 -64.0 + 152.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 98.5000 -64.0 + 153.5000 97.7500 -64.0 + 155.2500 99.5000 -64.0 + 155.2500 101.5000 -64.0 + 154.5000 103.2500 -64.0 + 151.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 155.5000 104.7500 -64.0 + 156.2500 106.5000 -64.0 + 155.5000 108.2500 -64.0 + 153.7500 106.5000 -64.0 +} -64.0 +{ -64.0 + 157.7500 107.5000 -64.0 + 158.5000 106.7500 -64.0 + 159.2500 107.5000 -64.0 + 158.5000 108.2500 -64.0 +} -64.0 +{ -64.0 + 173.7500 149.5000 -64.0 + 174.5000 148.7500 -64.0 + 175.2500 149.5000 -64.0 + 174.5000 150.2500 -64.0 +} -64.0 +v 304 z -110.000000 -64.0 +{ -64.0 + 97.2500 40.5000 -64.0 + 96.2500 42.5000 -64.0 + 93.5000 45.2500 -64.0 + 88.5000 48.2500 -64.0 + 86.5000 48.2500 -64.0 + 84.5000 49.2500 -64.0 + 75.5000 49.2500 -64.0 + 73.5000 50.2500 -64.0 + 71.5000 50.2500 -64.0 + 63.5000 54.2500 -64.0 + 59.2500 57.5000 -64.0 + 56.2500 63.5000 -64.0 + 52.2500 69.5000 -64.0 + 51.2500 74.5000 -64.0 + 52.5000 74.7500 -64.0 + 60.5000 65.7500 -64.0 + 62.5000 65.7500 -64.0 + 68.5000 71.7500 -64.0 + 68.7500 68.5000 -64.0 + 66.7500 64.5000 -64.0 + 66.7500 61.5000 -64.0 + 68.5000 56.7500 -64.0 + 72.5000 53.7500 -64.0 + 84.5000 54.7500 -64.0 + 83.7500 51.5000 -64.0 + 85.5000 49.7500 -64.0 + 90.5000 49.7500 -64.0 + 92.5000 48.7500 -64.0 + 94.5000 48.7500 -64.0 + 97.5000 52.7500 -64.0 + 97.7500 50.5000 -64.0 + 96.7500 48.5000 -64.0 + 96.7500 44.5000 -64.0 + 97.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 41.5000 -64.0 + 120.2500 48.5000 -64.0 + 119.2500 53.5000 -64.0 + 121.5000 52.7500 -64.0 + 121.7500 51.5000 -64.0 + 123.5000 49.7500 -64.0 + 127.5000 49.7500 -64.0 + 131.2500 51.5000 -64.0 + 133.2500 55.5000 -64.0 + 133.2500 63.5000 -64.0 + 135.5000 63.7500 -64.0 + 135.7500 58.5000 -64.0 + 136.5000 56.7500 -64.0 + 143.5000 56.7500 -64.0 + 146.2500 60.5000 -64.0 + 145.2500 63.5000 -64.0 + 148.2500 65.5000 -64.0 + 148.2500 70.5000 -64.0 + 151.5000 67.7500 -64.0 + 153.5000 67.7500 -64.0 + 157.2500 69.5000 -64.0 + 161.2500 76.5000 -64.0 + 161.2500 78.5000 -64.0 + 166.5000 84.7500 -64.0 + 166.7500 81.5000 -64.0 + 164.7500 77.5000 -64.0 + 164.7500 75.5000 -64.0 + 160.7500 67.5000 -64.0 + 158.7500 61.5000 -64.0 + 153.5000 56.2500 -64.0 + 145.5000 52.2500 -64.0 + 128.5000 49.2500 -64.0 + 122.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 63.5000 -64.0 + 140.5000 64.2500 -64.0 + 140.2500 66.5000 -64.0 + 141.7500 66.5000 -64.0 + 142.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 147.2500 71.5000 -64.0 + 143.2500 74.5000 -64.0 + 145.5000 74.7500 -64.0 + 147.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 86.5000 -64.0 + 118.2500 90.5000 -64.0 + 119.5000 89.7500 -64.0 + 122.5000 89.7500 -64.0 +} -64.0 +{ -64.0 + 87.2500 87.5000 -64.0 + 89.2500 88.5000 -64.0 + 89.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 60.2500 91.5000 -64.0 + 56.2500 94.5000 -64.0 + 55.2500 96.5000 -64.0 + 52.5000 98.2500 -64.0 + 35.5000 130.2500 -64.0 + 35.2500 133.5000 -64.0 + 32.2500 139.5000 -64.0 + 29.5000 150.2500 -64.0 + 29.2500 154.5000 -64.0 + 31.2500 160.5000 -64.0 + 31.2500 165.5000 -64.0 + 32.2500 167.5000 -64.0 + 32.2500 170.5000 -64.0 + 36.2500 187.5000 -64.0 + 45.2500 203.5000 -64.0 + 60.2500 220.5000 -64.0 + 64.5000 223.7500 -64.0 + 73.5000 228.7500 -64.0 + 87.2500 231.5000 -64.0 + 104.5000 231.7500 -64.0 + 106.5000 230.7500 -64.0 + 118.5000 230.7500 -64.0 + 131.7500 226.5000 -64.0 + 140.5000 220.7500 -64.0 + 150.7500 210.5000 -64.0 + 159.7500 199.5000 -64.0 + 168.7500 183.5000 -64.0 + 177.5000 159.7500 -64.0 + 177.7500 149.5000 -64.0 + 176.7500 147.5000 -64.0 + 175.7500 141.5000 -64.0 + 172.7500 135.5000 -64.0 + 172.7500 133.5000 -64.0 + 170.7500 129.5000 -64.0 + 169.7500 124.5000 -64.0 + 165.5000 117.2500 -64.0 + 159.7500 103.5000 -64.0 + 153.7500 97.5000 -64.0 + 150.5000 97.2500 -64.0 + 148.5000 98.2500 -64.0 + 134.7500 95.5000 -64.0 + 133.5000 96.2500 -64.0 + 134.2500 97.5000 -64.0 + 140.5000 97.7500 -64.0 + 141.5000 99.7500 -64.0 + 145.2500 102.5000 -64.0 + 147.5000 102.7500 -64.0 + 150.2500 106.5000 -64.0 + 150.5000 108.7500 -64.0 + 156.5000 111.7500 -64.0 + 162.2500 117.5000 -64.0 + 169.2500 130.5000 -64.0 + 169.2500 132.5000 -64.0 + 171.2500 138.5000 -64.0 + 170.5000 140.2500 -64.0 + 171.2500 142.5000 -64.0 + 170.5000 144.2500 -64.0 + 170.2500 152.5000 -64.0 + 171.2500 154.5000 -64.0 + 171.2500 162.5000 -64.0 + 170.2500 169.5000 -64.0 + 165.5000 176.2500 -64.0 + 164.2500 180.5000 -64.0 + 161.2500 183.5000 -64.0 + 157.2500 191.5000 -64.0 + 148.2500 205.5000 -64.0 + 132.5000 216.2500 -64.0 + 120.5000 222.2500 -64.0 + 115.5000 222.2500 -64.0 + 101.5000 219.2500 -64.0 + 95.5000 223.2500 -64.0 + 91.5000 223.2500 -64.0 + 89.5000 224.2500 -64.0 + 84.5000 223.2500 -64.0 + 66.5000 215.2500 -64.0 + 51.7500 201.5000 -64.0 + 47.7500 194.5000 -64.0 + 47.7500 192.5000 -64.0 + 44.7500 188.5000 -64.0 + 38.7500 176.5000 -64.0 + 38.7500 174.5000 -64.0 + 36.7500 170.5000 -64.0 + 36.7500 168.5000 -64.0 + 35.7500 166.5000 -64.0 + 35.7500 159.5000 -64.0 + 34.7500 157.5000 -64.0 + 34.7500 151.5000 -64.0 + 35.5000 149.7500 -64.0 + 36.7500 132.5000 -64.0 + 40.5000 128.7500 -64.0 + 40.7500 124.5000 -64.0 + 43.7500 117.5000 -64.0 + 48.5000 112.7500 -64.0 + 50.5000 112.7500 -64.0 + 50.7500 110.5000 -64.0 + 49.7500 108.5000 -64.0 + 50.7500 105.5000 -64.0 + 58.5000 96.7500 -64.0 + 62.2500 97.5000 -64.0 + 74.5000 97.7500 -64.0 + 76.2500 100.5000 -64.0 + 77.5000 99.7500 -64.0 + 82.5000 99.7500 -64.0 + 83.7500 98.5000 -64.0 + 82.7500 96.5000 -64.0 + 82.7500 94.5000 -64.0 + 84.5000 92.7500 -64.0 + 87.7500 92.5000 -64.0 + 83.5000 91.2500 -64.0 + 79.5000 96.2500 -64.0 + 72.5000 94.2500 -64.0 + 70.5000 95.2500 -64.0 + 64.5000 92.2500 -64.0 +} -64.0 +{ -64.0 + 120.2500 94.5000 -64.0 + 121.2500 95.5000 -64.0 + 122.5000 94.7500 -64.0 + 124.2500 95.5000 -64.0 + 124.2500 97.5000 -64.0 + 130.7500 96.5000 -64.0 + 126.5000 96.2500 -64.0 + 125.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 99.5000 -64.0 + 120.5000 100.2500 -64.0 + 119.2500 104.5000 -64.0 + 117.5000 105.2500 -64.0 + 119.2500 107.5000 -64.0 + 119.2500 109.5000 -64.0 + 119.7500 108.5000 -64.0 + 121.5000 104.7500 -64.0 + 121.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 100.5000 -64.0 + 88.2500 102.5000 -64.0 + 88.7500 101.5000 -64.0 +} -64.0 +{ -64.0 + 88.2500 120.5000 -64.0 + 88.2500 121.5000 -64.0 + 89.5000 121.7500 -64.0 + 90.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 122.5000 -64.0 + 119.2500 124.5000 -64.0 + 122.5000 127.7500 -64.0 + 128.5000 130.7500 -64.0 + 131.2500 136.5000 -64.0 + 133.2500 137.5000 -64.0 + 136.5000 136.7500 -64.0 + 148.5000 142.7500 -64.0 + 153.7500 140.5000 -64.0 + 154.7500 138.5000 -64.0 + 153.7500 136.5000 -64.0 + 153.7500 130.5000 -64.0 + 152.7500 128.5000 -64.0 + 151.5000 129.2500 -64.0 + 151.2500 133.5000 -64.0 + 152.2500 135.5000 -64.0 + 151.5000 137.2500 -64.0 + 149.5000 137.2500 -64.0 + 147.5000 139.2500 -64.0 + 146.7500 138.5000 -64.0 + 146.7500 133.5000 -64.0 + 145.7500 131.5000 -64.0 + 145.7500 127.5000 -64.0 + 142.5000 129.2500 -64.0 + 139.5000 125.2500 -64.0 + 137.5000 124.2500 -64.0 + 132.5000 123.2500 -64.0 + 130.5000 124.2500 -64.0 + 125.5000 124.2500 -64.0 + 126.2500 126.5000 -64.0 + 124.5000 127.2500 -64.0 + 120.7500 124.5000 -64.0 + 119.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 134.7500 53.5000 -64.0 + 135.5000 52.7500 -64.0 + 137.2500 53.5000 -64.0 + 136.5000 54.2500 -64.0 +} -64.0 +{ -64.0 + 148.7500 58.5000 -64.0 + 150.5000 57.7500 -64.0 + 154.2500 60.5000 -64.0 + 157.2500 65.5000 -64.0 + 156.5000 66.2500 -64.0 + 153.5000 66.2500 -64.0 + 151.7500 62.5000 -64.0 + 150.5000 62.2500 -64.0 +} -64.0 +{ -64.0 + 62.7500 63.5000 -64.0 + 64.5000 62.7500 -64.0 + 65.2500 64.5000 -64.0 + 63.5000 65.2500 -64.0 +} -64.0 +{ -64.0 + 151.7500 99.5000 -64.0 + 152.5000 98.7500 -64.0 + 154.2500 101.5000 -64.0 + 155.2500 103.5000 -64.0 + 153.5000 105.2500 -64.0 + 150.7500 101.5000 -64.0 +} -64.0 +{ -64.0 + 154.7500 105.5000 -64.0 + 156.5000 104.7500 -64.0 + 158.2500 105.5000 -64.0 + 157.2500 107.5000 -64.0 + 155.5000 108.2500 -64.0 + 153.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 133.7500 126.5000 -64.0 + 135.5000 125.7500 -64.0 + 136.2500 127.5000 -64.0 + 134.5000 128.2500 -64.0 +} -64.0 +{ -64.0 + 132.7500 130.5000 -64.0 + 134.5000 129.7500 -64.0 + 136.2500 131.5000 -64.0 + 135.5000 132.2500 -64.0 + 133.5000 132.2500 -64.0 +} -64.0 +{ -64.0 + 139.7500 131.5000 -64.0 + 140.5000 130.7500 -64.0 + 142.2500 131.5000 -64.0 + 140.5000 133.2500 -64.0 +} -64.0 +{ -64.0 + 171.7500 148.5000 -64.0 + 172.5000 147.7500 -64.0 + 174.2500 148.5000 -64.0 + 175.2500 150.5000 -64.0 + 173.5000 151.2500 -64.0 + 171.7500 150.5000 -64.0 +} -64.0 +{ -64.0 + 99.7500 225.5000 -64.0 + 100.5000 224.7500 -64.0 + 101.2500 225.5000 -64.0 + 100.5000 226.2500 -64.0 +} -64.0 +v 387 z -112.000000 -64.0 +{ -64.0 + 97.2500 40.5000 -64.0 + 95.2500 44.5000 -64.0 + 89.5000 48.2500 -64.0 + 85.5000 48.2500 -64.0 + 83.5000 49.2500 -64.0 + 81.5000 49.2500 -64.0 + 79.5000 48.2500 -64.0 + 77.5000 49.2500 -64.0 + 72.5000 49.2500 -64.0 + 68.5000 51.2500 -64.0 + 66.5000 51.2500 -64.0 + 59.5000 57.2500 -64.0 + 49.5000 75.2500 -64.0 + 49.2500 77.5000 -64.0 + 51.5000 76.7500 -64.0 + 51.7500 75.5000 -64.0 + 59.5000 65.7500 -64.0 + 62.5000 65.7500 -64.0 + 65.5000 66.7500 -64.0 + 68.2500 70.5000 -64.0 + 71.5000 70.7500 -64.0 + 70.7500 69.5000 -64.0 + 72.5000 67.7500 -64.0 + 72.5000 65.2500 -64.0 + 70.5000 68.2500 -64.0 + 68.7500 67.5000 -64.0 + 67.7500 65.5000 -64.0 + 69.5000 64.7500 -64.0 + 69.7500 61.5000 -64.0 + 73.7500 57.5000 -64.0 + 75.7500 53.5000 -64.0 + 78.5000 50.7500 -64.0 + 80.5000 50.7500 -64.0 + 82.5000 51.7500 -64.0 + 86.5000 49.7500 -64.0 + 90.5000 49.7500 -64.0 + 92.5000 48.7500 -64.0 + 94.5000 48.7500 -64.0 + 97.5000 52.7500 -64.0 + 97.7500 50.5000 -64.0 + 95.7500 45.5000 -64.0 + 97.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 43.5000 -64.0 + 121.2500 48.5000 -64.0 + 118.5000 52.2500 -64.0 + 118.2500 56.5000 -64.0 + 119.5000 54.7500 -64.0 + 121.5000 53.7500 -64.0 + 121.7500 50.5000 -64.0 + 125.5000 48.7500 -64.0 + 122.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 51.5000 -64.0 + 133.2500 55.5000 -64.0 + 134.5000 55.7500 -64.0 + 135.5000 53.7500 -64.0 + 138.2500 55.5000 -64.0 + 138.7500 54.5000 -64.0 + 140.5000 53.7500 -64.0 + 141.2500 55.5000 -64.0 + 139.2500 56.5000 -64.0 + 140.2500 58.5000 -64.0 + 142.5000 57.7500 -64.0 + 146.5000 59.7500 -64.0 + 149.2500 63.5000 -64.0 + 149.2500 68.5000 -64.0 + 153.5000 66.7500 -64.0 + 157.2500 69.5000 -64.0 + 169.5000 91.7500 -64.0 + 169.7500 86.5000 -64.0 + 167.7500 82.5000 -64.0 + 167.7500 80.5000 -64.0 + 160.7500 66.5000 -64.0 + 155.7500 58.5000 -64.0 + 151.5000 55.2500 -64.0 + 145.7500 52.5000 -64.0 + 141.5000 52.2500 -64.0 + 139.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 58.5000 -64.0 + 107.2500 60.5000 -64.0 + 107.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 59.5000 -64.0 + 118.2500 64.5000 -64.0 + 119.5000 64.7500 -64.0 + 119.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 62.5000 -64.0 + 135.5000 63.7500 -64.0 + 138.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 82.5000 -64.0 + 105.2500 84.5000 -64.0 + 105.7500 85.5000 -64.0 + 106.7500 83.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 84.5000 -64.0 + 92.2500 85.5000 -64.0 + 93.7500 84.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 86.5000 -64.0 + 89.2500 87.5000 -64.0 + 91.5000 87.7500 -64.0 +} -64.0 +{ -64.0 + 118.2500 86.5000 -64.0 + 118.2500 87.5000 -64.0 + 119.2500 89.5000 -64.0 + 120.7500 89.5000 -64.0 + 119.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 87.5000 -64.0 + 93.2500 88.5000 -64.0 + 94.5000 88.7500 -64.0 + 94.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 90.5000 -64.0 + 83.2500 91.5000 -64.0 + 85.5000 91.7500 -64.0 + 84.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 60.2500 92.5000 -64.0 + 59.5000 93.2500 -64.0 + 57.5000 94.2500 -64.0 + 52.5000 99.2500 -64.0 + 49.2500 104.5000 -64.0 + 42.2500 118.5000 -64.0 + 37.5000 127.2500 -64.0 + 35.2500 133.5000 -64.0 + 34.5000 135.2500 -64.0 + 31.2500 144.5000 -64.0 + 30.5000 146.2500 -64.0 + 30.2500 156.5000 -64.0 + 31.2500 158.5000 -64.0 + 31.2500 162.5000 -64.0 + 32.2500 164.5000 -64.0 + 32.2500 167.5000 -64.0 + 33.2500 169.5000 -64.0 + 33.2500 172.5000 -64.0 + 34.2500 174.5000 -64.0 + 34.2500 176.5000 -64.0 + 35.2500 178.5000 -64.0 + 35.2500 181.5000 -64.0 + 36.2500 183.5000 -64.0 + 36.2500 185.5000 -64.0 + 42.2500 197.5000 -64.0 + 48.2500 205.5000 -64.0 + 57.2500 216.5000 -64.0 + 58.2500 218.5000 -64.0 + 59.5000 218.7500 -64.0 + 61.2500 220.5000 -64.0 + 65.5000 223.7500 -64.0 + 74.5000 228.7500 -64.0 + 81.5000 229.7500 -64.0 + 83.2500 230.5000 -64.0 + 107.5000 230.7500 -64.0 + 109.5000 229.7500 -64.0 + 120.5000 229.7500 -64.0 + 122.5000 228.7500 -64.0 + 124.5000 228.7500 -64.0 + 135.5000 223.7500 -64.0 + 141.5000 218.7500 -64.0 + 143.5000 217.7500 -64.0 + 147.5000 212.7500 -64.0 + 153.7500 205.5000 -64.0 + 162.7500 193.5000 -64.0 + 163.7500 191.5000 -64.0 + 166.5000 187.7500 -64.0 + 169.7500 179.5000 -64.0 + 170.5000 177.7500 -64.0 + 174.7500 165.5000 -64.0 + 176.5000 161.7500 -64.0 + 176.7500 159.5000 -64.0 + 177.5000 157.7500 -64.0 + 177.7500 149.5000 -64.0 + 176.7500 147.5000 -64.0 + 176.7500 145.5000 -64.0 + 173.7500 139.5000 -64.0 + 169.7500 127.5000 -64.0 + 157.7500 101.5000 -64.0 + 154.7500 98.5000 -64.0 + 151.5000 98.2500 -64.0 + 147.5000 100.2500 -64.0 + 142.5000 100.2500 -64.0 + 137.5000 99.2500 -64.0 + 133.7500 97.5000 -64.0 + 131.5000 99.2500 -64.0 + 130.7500 98.5000 -64.0 + 123.5000 98.2500 -64.0 + 121.5000 100.2500 -64.0 + 121.2500 102.5000 -64.0 + 119.5000 104.2500 -64.0 + 117.5000 104.2500 -64.0 + 115.5000 105.2500 -64.0 + 116.5000 105.7500 -64.0 + 118.2500 106.5000 -64.0 + 119.2500 108.5000 -64.0 + 120.5000 108.7500 -64.0 + 122.5000 106.7500 -64.0 + 122.7500 102.5000 -64.0 + 127.5000 99.7500 -64.0 + 130.5000 99.7500 -64.0 + 133.5000 102.7500 -64.0 + 137.5000 104.7500 -64.0 + 141.2500 106.5000 -64.0 + 144.5000 106.7500 -64.0 + 146.5000 104.7500 -64.0 + 147.2500 105.5000 -64.0 + 148.2500 107.5000 -64.0 + 155.5000 113.7500 -64.0 + 157.5000 114.7500 -64.0 + 164.2500 122.5000 -64.0 + 167.2500 127.5000 -64.0 + 167.2500 129.5000 -64.0 + 168.2500 131.5000 -64.0 + 168.2500 133.5000 -64.0 + 169.2500 135.5000 -64.0 + 169.2500 141.5000 -64.0 + 168.2500 150.5000 -64.0 + 170.2500 154.5000 -64.0 + 170.2500 160.5000 -64.0 + 169.2500 167.5000 -64.0 + 162.2500 181.5000 -64.0 + 161.5000 183.2500 -64.0 + 154.2500 194.5000 -64.0 + 151.2500 200.5000 -64.0 + 144.5000 207.2500 -64.0 + 142.2500 208.5000 -64.0 + 135.5000 213.2500 -64.0 + 131.5000 216.2500 -64.0 + 119.5000 222.2500 -64.0 + 115.5000 222.2500 -64.0 + 113.5000 221.2500 -64.0 + 106.5000 220.2500 -64.0 + 101.5000 218.2500 -64.0 + 97.5000 222.2500 -64.0 + 95.5000 222.2500 -64.0 + 93.5000 223.2500 -64.0 + 88.5000 223.2500 -64.0 + 81.5000 222.2500 -64.0 + 75.5000 219.2500 -64.0 + 66.5000 214.2500 -64.0 + 64.5000 213.2500 -64.0 + 51.7500 200.5000 -64.0 + 48.7500 195.5000 -64.0 + 48.7500 193.5000 -64.0 + 43.7500 185.5000 -64.0 + 39.7500 177.5000 -64.0 + 39.7500 175.5000 -64.0 + 37.7500 171.5000 -64.0 + 37.7500 169.5000 -64.0 + 36.7500 167.5000 -64.0 + 36.7500 161.5000 -64.0 + 37.7500 159.5000 -64.0 + 35.7500 155.5000 -64.0 + 35.7500 145.5000 -64.0 + 36.5000 143.7500 -64.0 + 36.7500 136.5000 -64.0 + 40.7500 128.5000 -64.0 + 41.7500 123.5000 -64.0 + 43.7500 118.5000 -64.0 + 48.5000 113.7500 -64.0 + 50.5000 112.7500 -64.0 + 52.7500 110.5000 -64.0 + 51.7500 108.5000 -64.0 + 51.7500 106.5000 -64.0 + 50.7500 104.5000 -64.0 + 52.5000 102.7500 -64.0 + 54.5000 102.7500 -64.0 + 60.5000 97.7500 -64.0 + 64.2500 99.5000 -64.0 + 72.5000 99.7500 -64.0 + 76.5000 101.7500 -64.0 + 78.2500 102.5000 -64.0 + 82.5000 102.7500 -64.0 + 85.5000 101.7500 -64.0 + 88.2500 105.5000 -64.0 + 88.7500 104.5000 -64.0 + 86.7500 100.5000 -64.0 + 82.5000 99.2500 -64.0 + 80.5000 100.2500 -64.0 + 78.5000 100.2500 -64.0 + 73.7500 96.5000 -64.0 + 67.5000 96.2500 -64.0 + 66.7500 94.5000 -64.0 + 63.5000 93.2500 -64.0 + 61.7500 92.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 119.5000 -64.0 + 88.5000 121.2500 -64.0 + 86.5000 121.2500 -64.0 + 82.5000 123.2500 -64.0 + 80.5000 122.2500 -64.0 + 79.2500 126.5000 -64.0 + 81.5000 126.7500 -64.0 + 88.7500 123.5000 -64.0 + 90.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 122.5000 -64.0 + 127.5000 125.2500 -64.0 + 126.5000 128.2500 -64.0 + 121.5000 126.2500 -64.0 + 121.2500 127.5000 -64.0 + 124.2500 130.5000 -64.0 + 129.5000 130.7500 -64.0 + 131.5000 129.7500 -64.0 + 136.5000 129.7500 -64.0 + 138.2500 130.5000 -64.0 + 137.5000 132.2500 -64.0 + 133.5000 134.2500 -64.0 + 131.5000 134.2500 -64.0 + 131.2500 137.5000 -64.0 + 134.2500 139.5000 -64.0 + 141.5000 139.7500 -64.0 + 149.2500 144.5000 -64.0 + 153.5000 144.7500 -64.0 + 153.7500 143.5000 -64.0 + 155.5000 142.7500 -64.0 + 156.7500 139.5000 -64.0 + 155.7500 137.5000 -64.0 + 153.5000 137.2500 -64.0 + 153.2500 138.5000 -64.0 + 151.5000 139.2500 -64.0 + 153.2500 142.5000 -64.0 + 152.5000 144.2500 -64.0 + 149.7500 140.5000 -64.0 + 146.7500 138.5000 -64.0 + 146.7500 132.5000 -64.0 + 142.7500 128.5000 -64.0 + 140.7500 124.5000 -64.0 + 140.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 123.5000 -64.0 + 150.2500 124.5000 -64.0 + 151.5000 124.7500 -64.0 + 153.2500 126.5000 -64.0 + 153.5000 130.7500 -64.0 + 155.5000 129.7500 -64.0 + 153.7500 128.5000 -64.0 + 154.5000 126.7500 -64.0 + 154.7500 124.5000 -64.0 + 152.7500 123.5000 -64.0 +} -64.0 +{ -64.0 + 67.7500 54.5000 -64.0 + 68.5000 53.7500 -64.0 + 70.5000 53.7500 -64.0 + 72.2500 54.5000 -64.0 + 68.5000 58.2500 -64.0 + 68.2500 60.5000 -64.0 + 66.5000 61.2500 -64.0 + 66.2500 62.5000 -64.0 + 65.5000 64.2500 -64.0 + 62.5000 64.2500 -64.0 + 60.7500 62.5000 -64.0 + 63.5000 60.7500 -64.0 + 63.7500 57.5000 -64.0 + 65.5000 55.7500 -64.0 +} -64.0 +{ -64.0 + 144.7500 56.5000 -64.0 + 145.5000 55.7500 -64.0 + 150.5000 57.7500 -64.0 + 154.2500 60.5000 -64.0 + 157.2500 65.5000 -64.0 + 156.5000 67.2500 -64.0 + 154.5000 66.2500 -64.0 + 153.7500 64.5000 -64.0 + 150.7500 62.5000 -64.0 + 149.7500 60.5000 -64.0 + 145.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 132.7500 99.5000 -64.0 + 133.5000 98.7500 -64.0 + 135.2500 99.5000 -64.0 + 134.5000 100.2500 -64.0 +} -64.0 +{ -64.0 + 150.7500 101.5000 -64.0 + 152.5000 100.7500 -64.0 + 153.2500 102.5000 -64.0 + 151.5000 103.2500 -64.0 +} -64.0 +{ -64.0 + 156.7500 109.5000 -64.0 + 157.5000 108.7500 -64.0 + 158.2500 109.5000 -64.0 + 157.5000 110.2500 -64.0 +} -64.0 +{ -64.0 + 132.7500 124.5000 -64.0 + 134.5000 123.7500 -64.0 + 136.2500 124.5000 -64.0 + 134.5000 126.2500 -64.0 + 135.2500 127.5000 -64.0 + 134.5000 128.2500 -64.0 + 132.5000 128.2500 -64.0 + 131.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 170.7500 144.5000 -64.0 + 171.5000 143.7500 -64.0 + 173.2500 144.5000 -64.0 + 173.2500 146.5000 -64.0 + 174.2500 148.5000 -64.0 + 174.2500 150.5000 -64.0 + 172.5000 151.2500 -64.0 + 170.7500 150.5000 -64.0 + 170.7500 148.5000 -64.0 + 169.7500 146.5000 -64.0 +} -64.0 +{ -64.0 + 172.7500 153.5000 -64.0 + 173.5000 152.7500 -64.0 + 174.2500 153.5000 -64.0 + 173.5000 154.2500 -64.0 +} -64.0 +v 392 z -114.000000 -64.0 +{ -64.0 + 95.2500 43.5000 -64.0 + 94.5000 45.2500 -64.0 + 88.5000 48.2500 -64.0 + 91.2500 50.5000 -64.0 + 92.5000 49.7500 -64.0 + 96.2500 50.5000 -64.0 + 97.2500 52.5000 -64.0 + 98.7500 52.5000 -64.0 + 95.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 44.5000 -64.0 + 121.2500 47.5000 -64.0 + 118.5000 53.2500 -64.0 + 118.2500 55.5000 -64.0 + 121.5000 53.7500 -64.0 + 120.7500 51.5000 -64.0 + 122.5000 49.7500 -64.0 + 125.5000 49.7500 -64.0 +} -64.0 +{ -64.0 + 78.2500 49.5000 -64.0 + 77.5000 50.2500 -64.0 + 71.5000 50.2500 -64.0 + 65.5000 52.2500 -64.0 + 61.5000 55.2500 -64.0 + 55.2500 63.5000 -64.0 + 46.5000 79.2500 -64.0 + 46.5000 82.7500 -64.0 + 53.5000 73.7500 -64.0 + 57.5000 67.7500 -64.0 + 61.5000 64.7500 -64.0 + 63.5000 64.7500 -64.0 + 67.2500 67.5000 -64.0 + 68.2500 69.5000 -64.0 + 70.2500 70.5000 -64.0 + 70.7500 69.5000 -64.0 + 67.7500 66.5000 -64.0 + 67.7500 60.5000 -64.0 + 64.5000 60.2500 -64.0 + 64.2500 62.5000 -64.0 + 62.5000 63.2500 -64.0 + 60.5000 64.2500 -64.0 + 58.7500 63.5000 -64.0 + 64.5000 56.7500 -64.0 + 68.5000 53.7500 -64.0 + 70.5000 53.7500 -64.0 + 71.2500 55.5000 -64.0 + 72.5000 55.7500 -64.0 + 72.7500 54.5000 -64.0 + 75.5000 51.7500 -64.0 + 77.5000 51.7500 -64.0 + 79.5000 50.7500 -64.0 + 83.5000 50.7500 -64.0 + 84.7500 49.5000 -64.0 +} -64.0 +{ -64.0 + 137.2500 52.5000 -64.0 + 136.2500 54.5000 -64.0 + 142.5000 55.7500 -64.0 + 148.5000 59.7500 -64.0 + 147.7500 58.5000 -64.0 + 148.5000 57.7500 -64.0 + 151.5000 58.7500 -64.0 + 157.2500 65.5000 -64.0 + 155.5000 66.2500 -64.0 + 151.7500 63.5000 -64.0 + 150.7500 61.5000 -64.0 + 149.2500 60.5000 -64.0 + 150.2500 62.5000 -64.0 + 149.5000 67.7500 -64.0 + 151.5000 66.7500 -64.0 + 154.5000 66.7500 -64.0 + 158.2500 70.5000 -64.0 + 164.2500 82.5000 -64.0 + 167.2500 85.5000 -64.0 + 167.2500 88.5000 -64.0 + 169.2500 92.5000 -64.0 + 169.2500 98.5000 -64.0 + 170.5000 98.7500 -64.0 + 170.7500 89.5000 -64.0 + 169.7500 87.5000 -64.0 + 169.7500 85.5000 -64.0 + 167.7500 81.5000 -64.0 + 167.7500 79.5000 -64.0 + 165.5000 76.2500 -64.0 + 160.7500 65.5000 -64.0 + 155.7500 58.5000 -64.0 + 150.5000 55.2500 -64.0 +} -64.0 +{ -64.0 + 107.2500 57.5000 -64.0 + 107.2500 65.5000 -64.0 + 108.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 70.2500 58.5000 -64.0 + 70.2500 59.5000 -64.0 + 71.5000 59.7500 -64.0 +} -64.0 +{ -64.0 + 93.2500 84.5000 -64.0 + 91.2500 87.5000 -64.0 + 94.5000 87.7500 -64.0 + 94.7500 84.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 85.5000 -64.0 + 72.2500 86.5000 -64.0 + 73.5000 86.7500 -64.0 + 73.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 87.5000 -64.0 + 118.5000 88.2500 -64.0 + 118.5000 90.7500 -64.0 + 120.5000 89.7500 -64.0 +} -64.0 +{ -64.0 + 81.2500 89.5000 -64.0 + 82.2500 90.5000 -64.0 + 85.5000 90.7500 -64.0 + 83.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 59.2500 94.5000 -64.0 + 57.5000 95.2500 -64.0 + 52.5000 100.2500 -64.0 + 48.5000 107.2500 -64.0 + 48.2500 109.5000 -64.0 + 39.2500 124.5000 -64.0 + 33.2500 139.5000 -64.0 + 30.5000 147.2500 -64.0 + 30.2500 155.5000 -64.0 + 32.2500 161.5000 -64.0 + 33.2500 169.5000 -64.0 + 35.2500 176.5000 -64.0 + 36.2500 183.5000 -64.0 + 39.2500 189.5000 -64.0 + 39.2500 191.5000 -64.0 + 59.2500 218.5000 -64.0 + 60.5000 218.7500 -64.0 + 66.5000 223.7500 -64.0 + 74.5000 227.7500 -64.0 + 81.2500 229.5000 -64.0 + 115.5000 229.7500 -64.0 + 117.5000 228.7500 -64.0 + 121.5000 228.7500 -64.0 + 123.5000 227.7500 -64.0 + 125.5000 227.7500 -64.0 + 133.5000 223.7500 -64.0 + 141.5000 218.7500 -64.0 + 155.7500 201.5000 -64.0 + 157.7500 197.5000 -64.0 + 159.5000 196.7500 -64.0 + 163.7500 190.5000 -64.0 + 169.7500 179.5000 -64.0 + 173.7500 165.5000 -64.0 + 176.7500 159.5000 -64.0 + 177.7500 150.5000 -64.0 + 176.7500 148.5000 -64.0 + 176.7500 146.5000 -64.0 + 170.7500 132.5000 -64.0 + 166.7500 120.5000 -64.0 + 158.7500 103.5000 -64.0 + 155.5000 100.2500 -64.0 + 153.5000 99.2500 -64.0 + 147.5000 102.2500 -64.0 + 135.2500 101.5000 -64.0 + 136.2500 103.5000 -64.0 + 135.5000 104.2500 -64.0 + 130.7500 101.5000 -64.0 + 127.5000 101.2500 -64.0 + 124.5000 102.2500 -64.0 + 120.5000 106.2500 -64.0 + 119.7500 105.5000 -64.0 + 114.5000 105.2500 -64.0 + 114.2500 106.5000 -64.0 + 115.5000 105.7500 -64.0 + 118.5000 106.7500 -64.0 + 121.5000 109.7500 -64.0 + 123.5000 110.7500 -64.0 + 124.7500 106.5000 -64.0 + 127.5000 104.7500 -64.0 + 137.5000 105.7500 -64.0 + 141.2500 108.5000 -64.0 + 143.5000 108.7500 -64.0 + 149.2500 111.5000 -64.0 + 149.2500 113.5000 -64.0 + 144.5000 118.2500 -64.0 + 144.2500 120.5000 -64.0 + 149.2500 125.5000 -64.0 + 151.5000 125.7500 -64.0 + 154.5000 124.7500 -64.0 + 154.7500 123.5000 -64.0 + 156.5000 122.7500 -64.0 + 158.2500 123.5000 -64.0 + 157.5000 124.2500 -64.0 + 157.2500 126.5000 -64.0 + 153.5000 129.2500 -64.0 + 153.2500 131.5000 -64.0 + 156.2500 133.5000 -64.0 + 156.2500 135.5000 -64.0 + 159.5000 132.7500 -64.0 + 157.7500 128.5000 -64.0 + 159.5000 126.7500 -64.0 + 158.7500 125.5000 -64.0 + 159.5000 121.7500 -64.0 + 161.2500 123.5000 -64.0 + 161.2500 125.5000 -64.0 + 163.5000 125.7500 -64.0 + 167.2500 132.5000 -64.0 + 167.2500 135.5000 -64.0 + 170.2500 137.5000 -64.0 + 167.5000 140.2500 -64.0 + 167.2500 145.5000 -64.0 + 165.5000 147.2500 -64.0 + 165.2500 149.5000 -64.0 + 169.2500 155.5000 -64.0 + 169.2500 162.5000 -64.0 + 167.2500 170.5000 -64.0 + 162.2500 178.5000 -64.0 + 161.2500 183.5000 -64.0 + 158.5000 186.2500 -64.0 + 148.2500 202.5000 -64.0 + 135.5000 213.2500 -64.0 + 129.2500 216.5000 -64.0 + 122.5000 221.2500 -64.0 + 119.5000 221.2500 -64.0 + 117.5000 222.2500 -64.0 + 112.5000 221.2500 -64.0 + 108.7500 219.5000 -64.0 + 105.5000 219.2500 -64.0 + 101.5000 217.2500 -64.0 + 101.2500 218.5000 -64.0 + 96.5000 222.2500 -64.0 + 83.5000 222.2500 -64.0 + 78.5000 220.2500 -64.0 + 65.5000 213.2500 -64.0 + 51.5000 199.2500 -64.0 + 47.7500 188.5000 -64.0 + 43.7500 184.5000 -64.0 + 39.7500 176.5000 -64.0 + 39.7500 174.5000 -64.0 + 37.7500 170.5000 -64.0 + 37.7500 157.5000 -64.0 + 36.7500 155.5000 -64.0 + 36.7500 143.5000 -64.0 + 37.7500 141.5000 -64.0 + 36.7500 139.5000 -64.0 + 38.7500 135.5000 -64.0 + 42.7500 121.5000 -64.0 + 47.5000 115.7500 -64.0 + 55.5000 109.7500 -64.0 + 53.7500 106.5000 -64.0 + 52.5000 107.2500 -64.0 + 50.7500 106.5000 -64.0 + 53.5000 102.7500 -64.0 + 54.2500 103.5000 -64.0 + 54.2500 105.5000 -64.0 + 58.7500 102.5000 -64.0 + 59.7500 100.5000 -64.0 + 61.5000 99.7500 -64.0 + 63.2500 100.5000 -64.0 + 71.5000 100.7500 -64.0 + 73.2500 102.5000 -64.0 + 75.5000 102.7500 -64.0 + 74.7500 100.5000 -64.0 + 67.7500 98.5000 -64.0 + 68.5000 96.7500 -64.0 + 67.7500 95.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 94.5000 -64.0 + 96.5000 95.2500 -64.0 + 97.2500 96.5000 -64.0 + 98.7500 96.5000 -64.0 + 99.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 95.5000 -64.0 + 111.5000 97.7500 -64.0 + 113.5000 96.7500 -64.0 + 111.7500 95.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 101.5000 -64.0 + 79.5000 103.2500 -64.0 + 76.2500 103.5000 -64.0 + 78.5000 106.7500 -64.0 + 82.5000 104.7500 -64.0 + 84.5000 104.7500 -64.0 + 88.2500 107.5000 -64.0 + 88.7500 106.5000 -64.0 + 83.7500 101.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 117.5000 -64.0 + 132.2500 118.5000 -64.0 + 133.5000 119.7500 -64.0 + 133.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 120.5000 -64.0 + 88.5000 122.2500 -64.0 + 83.5000 125.2500 -64.0 + 77.5000 125.2500 -64.0 + 75.7500 124.5000 -64.0 + 76.5000 123.7500 -64.0 + 75.5000 123.2500 -64.0 + 75.2500 124.5000 -64.0 + 68.2500 128.5000 -64.0 + 69.2500 130.5000 -64.0 + 77.2500 132.5000 -64.0 + 79.5000 131.7500 -64.0 + 79.7500 130.5000 -64.0 + 82.5000 127.7500 -64.0 + 88.5000 124.7500 -64.0 + 91.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 120.5000 -64.0 + 142.2500 121.5000 -64.0 + 142.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 122.5000 -64.0 + 119.2500 125.5000 -64.0 + 120.7500 125.5000 -64.0 + 119.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 133.2500 122.5000 -64.0 + 132.5000 123.2500 -64.0 + 130.5000 123.2500 -64.0 + 124.5000 128.2500 -64.0 + 122.5000 127.2500 -64.0 + 122.2500 128.5000 -64.0 + 123.5000 129.7500 -64.0 + 125.5000 130.7500 -64.0 + 127.2500 131.5000 -64.0 + 130.5000 131.7500 -64.0 + 132.2500 132.5000 -64.0 + 132.2500 137.5000 -64.0 + 133.5000 138.7500 -64.0 + 139.5000 141.7500 -64.0 + 141.2500 142.5000 -64.0 + 142.5000 141.7500 -64.0 + 144.5000 141.7500 -64.0 + 152.2500 147.5000 -64.0 + 160.5000 147.7500 -64.0 + 160.7500 145.5000 -64.0 + 157.7500 142.5000 -64.0 + 155.5000 142.2500 -64.0 + 155.2500 143.5000 -64.0 + 154.5000 145.2500 -64.0 + 153.7500 144.5000 -64.0 + 152.7500 142.5000 -64.0 + 147.7500 139.5000 -64.0 + 147.7500 135.5000 -64.0 + 148.5000 133.7500 -64.0 + 147.5000 132.2500 -64.0 + 145.5000 131.2500 -64.0 + 143.7500 130.5000 -64.0 + 141.7500 126.5000 -64.0 + 140.5000 124.2500 -64.0 + 138.5000 123.2500 -64.0 + 136.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 147.2500 127.5000 -64.0 + 148.2500 129.5000 -64.0 + 148.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 61.2500 130.5000 -64.0 + 60.2500 133.5000 -64.0 + 61.2500 135.5000 -64.0 + 64.5000 135.7500 -64.0 + 66.5000 132.7500 -64.0 + 65.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 150.7500 103.5000 -64.0 + 151.5000 102.7500 -64.0 + 153.5000 102.7500 -64.0 + 155.2500 103.5000 -64.0 + 155.2500 106.5000 -64.0 + 153.5000 108.2500 -64.0 + 151.5000 109.2500 -64.0 + 149.7500 107.5000 -64.0 + 150.5000 105.7500 -64.0 +} -64.0 +{ -64.0 + 154.7500 108.5000 -64.0 + 155.5000 107.7500 -64.0 + 157.2500 108.5000 -64.0 + 158.2500 110.5000 -64.0 + 157.5000 112.2500 -64.0 + 155.5000 112.2500 -64.0 + 153.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 131.7500 125.5000 -64.0 + 133.5000 124.7500 -64.0 + 134.2500 126.5000 -64.0 + 133.5000 128.2500 -64.0 + 131.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 136.7500 126.5000 -64.0 + 137.5000 125.7500 -64.0 + 139.2500 126.5000 -64.0 + 138.5000 128.2500 -64.0 + 138.2500 130.5000 -64.0 + 136.5000 131.2500 -64.0 + 134.7500 130.5000 -64.0 + 136.5000 128.7500 -64.0 +} -64.0 +{ -64.0 + 139.7500 130.5000 -64.0 + 141.5000 129.7500 -64.0 + 143.2500 131.5000 -64.0 + 140.5000 135.2500 -64.0 + 139.7500 134.5000 -64.0 +} -64.0 +{ -64.0 + 168.7500 140.5000 -64.0 + 169.5000 139.7500 -64.0 + 170.2500 140.5000 -64.0 + 169.5000 142.2500 -64.0 +} -64.0 +{ -64.0 + 146.7500 141.5000 -64.0 + 147.5000 140.7500 -64.0 + 150.2500 142.5000 -64.0 + 148.5000 143.2500 -64.0 +} -64.0 +{ -64.0 + 168.7500 144.5000 -64.0 + 170.5000 143.7500 -64.0 + 172.2500 144.5000 -64.0 + 174.2500 148.5000 -64.0 + 173.5000 150.2500 -64.0 + 174.2500 151.5000 -64.0 + 174.2500 154.5000 -64.0 + 172.5000 155.2500 -64.0 + 169.7500 152.5000 -64.0 +} -64.0 +v 440 z -116.000000 -64.0 +{ -64.0 + 96.2500 42.5000 -64.0 + 94.5000 45.2500 -64.0 + 90.5000 48.2500 -64.0 + 92.2500 49.5000 -64.0 + 97.5000 49.7500 -64.0 + 96.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 43.5000 -64.0 + 120.2500 49.5000 -64.0 + 121.2500 51.5000 -64.0 + 122.5000 49.7500 -64.0 + 125.5000 49.7500 -64.0 + 121.7500 45.5000 -64.0 + 121.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 51.5000 -64.0 + 71.5000 52.2500 -64.0 + 66.5000 52.2500 -64.0 + 62.5000 55.2500 -64.0 + 60.5000 56.2500 -64.0 + 55.2500 62.5000 -64.0 + 44.2500 82.5000 -64.0 + 43.2500 87.5000 -64.0 + 43.7500 88.5000 -64.0 + 47.7500 80.5000 -64.0 + 52.7500 74.5000 -64.0 + 53.7500 72.5000 -64.0 + 58.5000 66.7500 -64.0 + 62.5000 63.7500 -64.0 + 65.5000 64.7500 -64.0 + 68.2500 67.5000 -64.0 + 69.2500 69.5000 -64.0 + 70.5000 69.7500 -64.0 + 68.7500 66.5000 -64.0 + 68.7500 61.5000 -64.0 + 67.5000 58.2500 -64.0 + 61.5000 63.2500 -64.0 + 59.7500 62.5000 -64.0 + 59.7500 60.5000 -64.0 + 64.5000 56.7500 -64.0 + 68.5000 54.7500 -64.0 + 70.2500 55.5000 -64.0 + 72.5000 53.7500 -64.0 + 74.5000 52.7500 -64.0 + 77.7500 53.5000 -64.0 + 78.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 137.2500 54.5000 -64.0 + 139.5000 54.7500 -64.0 + 141.5000 56.7500 -64.0 + 143.5000 55.7500 -64.0 + 145.5000 56.7500 -64.0 + 148.2500 59.5000 -64.0 + 149.5000 57.7500 -64.0 + 152.5000 59.7500 -64.0 + 157.2500 64.5000 -64.0 + 156.5000 66.2500 -64.0 + 151.5000 62.2500 -64.0 + 150.2500 66.5000 -64.0 + 156.5000 67.7500 -64.0 + 159.2500 70.5000 -64.0 + 167.2500 88.5000 -64.0 + 167.2500 90.5000 -64.0 + 168.2500 92.5000 -64.0 + 168.2500 99.5000 -64.0 + 166.5000 103.2500 -64.0 + 166.2500 108.5000 -64.0 + 164.5000 110.2500 -64.0 + 159.7500 105.5000 -64.0 + 158.7500 103.5000 -64.0 + 154.5000 100.2500 -64.0 + 145.5000 105.2500 -64.0 + 143.5000 105.2500 -64.0 + 141.5000 106.2500 -64.0 + 138.5000 105.2500 -64.0 + 133.5000 100.2500 -64.0 + 127.5000 104.2500 -64.0 + 124.5000 104.2500 -64.0 + 124.2500 107.5000 -64.0 + 122.5000 108.2500 -64.0 + 119.5000 105.2500 -64.0 + 117.5000 104.2500 -64.0 + 116.2500 107.5000 -64.0 + 121.5000 108.7500 -64.0 + 125.5000 112.7500 -64.0 + 127.5000 113.7500 -64.0 + 128.5000 111.7500 -64.0 + 126.7500 108.5000 -64.0 + 126.7500 106.5000 -64.0 + 128.5000 105.7500 -64.0 + 130.2500 106.5000 -64.0 + 133.2500 110.5000 -64.0 + 132.5000 111.2500 -64.0 + 132.2500 113.5000 -64.0 + 133.5000 113.7500 -64.0 + 136.5000 108.7500 -64.0 + 138.2500 109.5000 -64.0 + 137.2500 111.5000 -64.0 + 138.2500 113.5000 -64.0 + 138.2500 115.5000 -64.0 + 141.2500 116.5000 -64.0 + 140.5000 117.2500 -64.0 + 137.5000 117.2500 -64.0 + 135.7500 115.5000 -64.0 + 135.2500 116.5000 -64.0 + 142.2500 122.5000 -64.0 + 152.5000 125.7500 -64.0 + 156.5000 121.7500 -64.0 + 158.2500 124.5000 -64.0 + 157.5000 125.2500 -64.0 + 155.5000 124.2500 -64.0 + 154.2500 130.5000 -64.0 + 152.5000 131.2500 -64.0 + 150.7500 129.5000 -64.0 + 149.5000 132.2500 -64.0 + 143.5000 132.2500 -64.0 + 141.7500 129.5000 -64.0 + 141.7500 127.5000 -64.0 + 136.7500 122.5000 -64.0 + 134.5000 124.2500 -64.0 + 130.5000 124.2500 -64.0 + 129.5000 126.2500 -64.0 + 127.5000 127.2500 -64.0 + 125.7500 125.5000 -64.0 + 124.2500 125.5000 -64.0 + 125.2500 127.5000 -64.0 + 124.5000 128.2500 -64.0 + 120.7500 125.5000 -64.0 + 120.7500 123.5000 -64.0 + 119.5000 123.2500 -64.0 + 119.2500 125.5000 -64.0 + 122.2500 128.5000 -64.0 + 128.5000 132.7500 -64.0 + 134.2500 139.5000 -64.0 + 138.5000 140.7500 -64.0 + 142.2500 144.5000 -64.0 + 145.5000 144.7500 -64.0 + 153.2500 148.5000 -64.0 + 159.5000 148.7500 -64.0 + 162.5000 149.7500 -64.0 + 168.2500 156.5000 -64.0 + 168.2500 162.5000 -64.0 + 167.2500 167.5000 -64.0 + 164.2500 173.5000 -64.0 + 161.5000 177.2500 -64.0 + 160.2500 183.5000 -64.0 + 156.5000 187.2500 -64.0 + 150.2500 198.5000 -64.0 + 143.5000 206.2500 -64.0 + 131.5000 215.2500 -64.0 + 120.5000 221.2500 -64.0 + 112.5000 221.2500 -64.0 + 108.7500 218.5000 -64.0 + 104.5000 218.2500 -64.0 + 102.7500 216.5000 -64.0 + 99.5000 219.2500 -64.0 + 93.5000 222.2500 -64.0 + 82.5000 221.2500 -64.0 + 74.7500 217.5000 -64.0 + 64.5000 211.2500 -64.0 + 58.7500 205.5000 -64.0 + 57.5000 203.2500 -64.0 + 53.7500 200.5000 -64.0 + 50.7500 196.5000 -64.0 + 50.7500 193.5000 -64.0 + 48.7500 187.5000 -64.0 + 43.7500 183.5000 -64.0 + 37.7500 169.5000 -64.0 + 38.7500 157.5000 -64.0 + 37.7500 155.5000 -64.0 + 37.7500 146.5000 -64.0 + 38.7500 143.5000 -64.0 + 37.5000 143.2500 -64.0 + 36.7500 141.5000 -64.0 + 39.5000 139.7500 -64.0 + 40.7500 129.5000 -64.0 + 43.7500 122.5000 -64.0 + 47.5000 118.7500 -64.0 + 49.5000 117.7500 -64.0 + 49.7500 116.5000 -64.0 + 56.5000 110.7500 -64.0 + 56.7500 107.5000 -64.0 + 61.5000 101.7500 -64.0 + 63.5000 102.7500 -64.0 + 68.2500 107.5000 -64.0 + 70.5000 107.7500 -64.0 + 72.5000 105.7500 -64.0 + 77.5000 108.7500 -64.0 + 81.5000 105.7500 -64.0 + 83.5000 105.7500 -64.0 + 84.2500 107.5000 -64.0 + 86.5000 109.7500 -64.0 + 91.7500 107.5000 -64.0 + 89.5000 107.2500 -64.0 + 81.7500 102.5000 -64.0 + 79.2500 104.5000 -64.0 + 78.2500 106.5000 -64.0 + 76.5000 107.2500 -64.0 + 75.7500 105.5000 -64.0 + 74.5000 105.2500 -64.0 + 71.7500 101.5000 -64.0 + 72.5000 100.2500 -64.0 + 69.5000 101.2500 -64.0 + 68.7500 99.5000 -64.0 + 67.5000 99.2500 -64.0 + 67.2500 100.5000 -64.0 + 65.5000 101.2500 -64.0 + 64.7500 99.5000 -64.0 + 66.5000 98.7500 -64.0 + 66.7500 97.5000 -64.0 + 58.5000 96.2500 -64.0 + 55.2500 97.5000 -64.0 + 41.2500 120.5000 -64.0 + 32.2500 142.5000 -64.0 + 30.2500 152.5000 -64.0 + 31.2500 154.5000 -64.0 + 31.2500 158.5000 -64.0 + 33.2500 162.5000 -64.0 + 33.2500 166.5000 -64.0 + 35.2500 173.5000 -64.0 + 36.2500 180.5000 -64.0 + 41.2500 193.5000 -64.0 + 44.2500 196.5000 -64.0 + 50.5000 205.7500 -64.0 + 58.2500 215.5000 -64.0 + 65.5000 221.7500 -64.0 + 74.5000 226.7500 -64.0 + 81.2500 228.5000 -64.0 + 116.5000 228.7500 -64.0 + 118.5000 227.7500 -64.0 + 122.5000 227.7500 -64.0 + 132.5000 223.7500 -64.0 + 142.5000 216.7500 -64.0 + 154.7500 201.5000 -64.0 + 156.7500 197.5000 -64.0 + 160.7500 193.5000 -64.0 + 168.7500 180.5000 -64.0 + 172.7500 166.5000 -64.0 + 175.5000 160.7500 -64.0 + 176.5000 156.7500 -64.0 + 176.7500 146.5000 -64.0 + 169.7500 132.5000 -64.0 + 169.7500 130.5000 -64.0 + 167.7500 126.5000 -64.0 + 167.7500 124.5000 -64.0 + 166.7500 122.5000 -64.0 + 166.7500 118.5000 -64.0 + 170.5000 104.7500 -64.0 + 170.7500 90.5000 -64.0 + 169.7500 88.5000 -64.0 + 169.7500 86.5000 -64.0 + 167.7500 82.5000 -64.0 + 167.7500 80.5000 -64.0 + 164.7500 74.5000 -64.0 + 162.7500 68.5000 -64.0 + 157.7500 60.5000 -64.0 + 151.7500 56.5000 -64.0 + 148.5000 56.2500 -64.0 + 143.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 58.5000 -64.0 + 107.5000 64.7500 -64.0 + 107.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 145.2500 71.5000 -64.0 + 144.2500 73.5000 -64.0 + 145.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 85.5000 -64.0 + 91.2500 87.5000 -64.0 + 93.5000 87.7500 -64.0 +} -64.0 +{ -64.0 + 119.2500 88.5000 -64.0 + 118.5000 90.2500 -64.0 + 116.5000 91.2500 -64.0 + 115.2500 97.5000 -64.0 + 116.5000 96.7500 -64.0 + 117.7500 92.5000 -64.0 + 119.7500 91.5000 -64.0 + 120.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 89.5000 -64.0 + 83.2500 90.5000 -64.0 + 85.5000 90.7500 -64.0 + 85.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 105.2500 91.5000 -64.0 + 104.2500 93.5000 -64.0 + 101.5000 96.2500 -64.0 + 98.5000 96.2500 -64.0 + 99.2500 97.5000 -64.0 + 101.5000 96.7500 -64.0 + 102.2500 98.5000 -64.0 + 103.5000 97.7500 -64.0 + 103.7500 95.5000 -64.0 + 105.5000 94.7500 -64.0 + 111.2500 101.5000 -64.0 + 112.7500 101.5000 -64.0 + 111.7500 99.5000 -64.0 + 111.7500 97.5000 -64.0 + 109.7500 96.5000 -64.0 + 108.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 97.5000 -64.0 + 96.5000 98.7500 -64.0 + 100.5000 100.7500 -64.0 + 101.7500 99.5000 -64.0 + 98.5000 99.2500 -64.0 +} -64.0 +{ -64.0 + 90.2500 120.5000 -64.0 + 90.2500 121.5000 -64.0 + 84.5000 126.2500 -64.0 + 82.5000 126.2500 -64.0 + 78.7500 124.5000 -64.0 + 79.5000 123.7500 -64.0 + 81.5000 123.7500 -64.0 + 81.5000 122.2500 -64.0 + 79.5000 123.2500 -64.0 + 75.7500 121.5000 -64.0 + 73.5000 121.2500 -64.0 + 68.5000 123.2500 -64.0 + 65.5000 127.2500 -64.0 + 62.5000 127.2500 -64.0 + 60.5000 129.2500 -64.0 + 60.2500 131.5000 -64.0 + 63.2500 137.5000 -64.0 + 61.5000 138.2500 -64.0 + 62.5000 138.7500 -64.0 + 64.5000 137.7500 -64.0 + 66.5000 137.7500 -64.0 + 70.5000 135.7500 -64.0 + 72.5000 135.7500 -64.0 + 75.5000 136.7500 -64.0 + 77.7500 134.5000 -64.0 + 78.7500 132.5000 -64.0 + 79.5000 130.7500 -64.0 + 78.7500 129.5000 -64.0 + 80.5000 127.7500 -64.0 + 85.5000 127.7500 -64.0 + 87.5000 125.7500 -64.0 + 89.5000 124.7500 -64.0 + 91.5000 121.7500 -64.0 +} -64.0 +{ -64.0 + 60.2500 122.5000 -64.0 + 60.2500 123.5000 -64.0 + 61.5000 123.7500 -64.0 +} -64.0 +{ -64.0 + 55.2500 126.5000 -64.0 + 53.5000 129.2500 -64.0 + 54.2500 130.5000 -64.0 + 55.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 58.2500 136.5000 -64.0 + 59.2500 137.5000 -64.0 + 59.7500 136.5000 -64.0 +} -64.0 +{ -64.0 + 65.7500 61.5000 -64.0 + 66.5000 60.7500 -64.0 + 67.2500 61.5000 -64.0 + 66.5000 62.2500 -64.0 +} -64.0 +{ -64.0 + 59.5000 97.7500 -64.0 + 60.2500 98.5000 -64.0 + 58.5000 100.2500 -64.0 + 57.7500 99.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 103.5000 -64.0 + 154.5000 102.7500 -64.0 + 156.2500 104.5000 -64.0 + 155.5000 108.2500 -64.0 + 158.2500 109.5000 -64.0 + 151.5000 113.2500 -64.0 + 149.7500 112.5000 -64.0 + 147.7500 108.5000 -64.0 + 150.5000 104.7500 -64.0 +} -64.0 +{ -64.0 + 52.7500 104.5000 -64.0 + 53.5000 103.7500 -64.0 + 55.2500 104.5000 -64.0 + 54.5000 105.2500 -64.0 + 55.2500 106.5000 -64.0 + 55.2500 108.5000 -64.0 + 53.5000 110.2500 -64.0 + 51.7500 109.5000 -64.0 + 52.5000 107.7500 -64.0 +} -64.0 +{ -64.0 + 140.7500 107.5000 -64.0 + 141.5000 106.7500 -64.0 + 143.2500 107.5000 -64.0 + 141.5000 109.2500 -64.0 +} -64.0 +{ -64.0 + 152.7500 113.5000 -64.0 + 153.5000 112.7500 -64.0 + 158.5000 112.7500 -64.0 + 160.2500 113.5000 -64.0 + 161.2500 115.5000 -64.0 + 160.5000 117.2500 -64.0 + 154.5000 120.2500 -64.0 + 152.5000 120.2500 -64.0 + 148.5000 123.2500 -64.0 + 146.7500 122.5000 -64.0 + 147.7500 117.5000 -64.0 + 148.5000 115.7500 -64.0 +} -64.0 +{ -64.0 + 132.7500 127.5000 -64.0 + 133.5000 126.7500 -64.0 + 135.2500 128.5000 -64.0 + 134.5000 129.2500 -64.0 +} -64.0 +{ -64.0 + 163.7500 130.5000 -64.0 + 165.5000 129.7500 -64.0 + 167.2500 131.5000 -64.0 + 167.2500 133.5000 -64.0 + 170.2500 137.5000 -64.0 + 167.5000 140.2500 -64.0 + 165.5000 140.2500 -64.0 + 165.2500 141.5000 -64.0 + 167.2500 142.5000 -64.0 + 168.5000 144.7500 -64.0 + 168.7500 142.5000 -64.0 + 170.5000 140.7500 -64.0 + 173.2500 143.5000 -64.0 + 172.2500 145.5000 -64.0 + 173.2500 147.5000 -64.0 + 171.5000 152.2500 -64.0 + 169.5000 152.2500 -64.0 + 165.7500 149.5000 -64.0 + 167.5000 147.7500 -64.0 + 167.7500 145.5000 -64.0 + 165.5000 146.2500 -64.0 + 163.7500 145.5000 -64.0 + 161.5000 146.2500 -64.0 + 161.2500 147.5000 -64.0 + 159.5000 148.2500 -64.0 + 157.7500 146.5000 -64.0 + 158.5000 145.7500 -64.0 + 160.5000 145.7500 -64.0 + 159.7500 144.5000 -64.0 + 154.5000 144.2500 -64.0 + 147.7500 138.5000 -64.0 + 147.7500 136.5000 -64.0 + 150.7500 132.5000 -64.0 + 152.5000 131.7500 -64.0 + 156.2500 134.5000 -64.0 + 155.5000 136.2500 -64.0 + 158.2500 139.5000 -64.0 + 160.2500 143.5000 -64.0 + 161.7500 142.5000 -64.0 + 160.7500 140.5000 -64.0 + 161.7500 137.5000 -64.0 + 158.7500 134.5000 -64.0 + 159.5000 132.7500 -64.0 + 161.5000 132.7500 -64.0 +} -64.0 +{ -64.0 + 136.7500 131.5000 -64.0 + 137.5000 130.7500 -64.0 + 138.2500 131.5000 -64.0 + 137.5000 132.2500 -64.0 +} -64.0 +{ -64.0 + 169.7500 154.5000 -64.0 + 171.5000 153.7500 -64.0 + 173.2500 155.5000 -64.0 + 171.5000 157.2500 -64.0 + 169.7500 156.5000 -64.0 +} -64.0 +v 505 z -118.000000 -64.0 +{ -64.0 + 96.2500 43.5000 -64.0 + 91.5000 48.2500 -64.0 + 92.2500 49.5000 -64.0 + 94.5000 49.7500 -64.0 + 96.7500 47.5000 -64.0 + 95.7500 45.5000 -64.0 + 96.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 46.5000 -64.0 + 122.2500 50.5000 -64.0 + 123.7500 50.5000 -64.0 + 124.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 52.5000 -64.0 + 68.5000 54.2500 -64.0 + 66.5000 53.2500 -64.0 + 58.5000 57.2500 -64.0 + 54.2500 63.5000 -64.0 + 43.5000 84.2500 -64.0 + 42.5000 88.2500 -64.0 + 42.2500 96.5000 -64.0 + 42.7500 97.5000 -64.0 + 46.7500 83.5000 -64.0 + 57.5000 66.7500 -64.0 + 61.5000 63.7500 -64.0 + 64.5000 63.7500 -64.0 + 68.7500 66.5000 -64.0 + 67.7500 63.5000 -64.0 + 64.7500 60.5000 -64.0 + 59.5000 63.2500 -64.0 + 58.7500 62.5000 -64.0 + 59.5000 61.7500 -64.0 + 59.7500 59.5000 -64.0 + 65.5000 55.7500 -64.0 + 69.2500 56.5000 -64.0 + 73.5000 52.7500 -64.0 + 77.7500 52.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 55.5000 -64.0 + 140.5000 56.2500 -64.0 + 137.5000 56.2500 -64.0 + 138.2500 58.5000 -64.0 + 139.5000 58.7500 -64.0 + 141.5000 56.7500 -64.0 + 145.5000 56.7500 -64.0 + 150.2500 60.5000 -64.0 + 151.5000 58.7500 -64.0 + 156.2500 62.5000 -64.0 + 154.5000 63.2500 -64.0 + 152.7500 62.5000 -64.0 + 151.2500 64.5000 -64.0 + 150.2500 66.5000 -64.0 + 155.5000 66.7500 -64.0 + 159.2500 70.5000 -64.0 + 163.2500 78.5000 -64.0 + 163.2500 80.5000 -64.0 + 165.2500 84.5000 -64.0 + 165.2500 86.5000 -64.0 + 168.2500 92.5000 -64.0 + 169.5000 90.7500 -64.0 + 169.7500 88.5000 -64.0 + 168.7500 86.5000 -64.0 + 168.7500 84.5000 -64.0 + 167.7500 82.5000 -64.0 + 167.7500 80.5000 -64.0 + 163.7500 72.5000 -64.0 + 163.7500 70.5000 -64.0 + 161.7500 65.5000 -64.0 + 156.5000 59.2500 -64.0 + 152.5000 57.2500 -64.0 + 150.7500 56.5000 -64.0 + 146.5000 56.2500 -64.0 + 144.7500 55.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 57.5000 -64.0 + 67.2500 58.5000 -64.0 + 68.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 145.2500 70.5000 -64.0 + 144.2500 72.5000 -64.0 + 145.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 89.5000 -64.0 + 127.2500 90.5000 -64.0 + 129.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 90.5000 -64.0 + 95.2500 91.5000 -64.0 + 95.5000 93.7500 -64.0 + 95.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 105.2500 91.5000 -64.0 + 102.5000 95.2500 -64.0 + 102.2500 97.5000 -64.0 + 100.5000 99.2500 -64.0 + 98.2500 99.5000 -64.0 + 99.2500 102.5000 -64.0 + 104.5000 98.7500 -64.0 + 107.2500 100.5000 -64.0 + 108.2500 102.5000 -64.0 + 109.5000 102.7500 -64.0 + 109.7500 98.5000 -64.0 + 107.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 92.5000 -64.0 + 117.5000 93.2500 -64.0 + 117.5000 95.7500 -64.0 + 119.5000 94.7500 -64.0 +} -64.0 +{ -64.0 + 168.2500 94.5000 -64.0 + 168.2500 95.5000 -64.0 + 167.2500 98.5000 -64.0 + 164.2500 102.5000 -64.0 + 163.2500 104.5000 -64.0 + 161.5000 105.2500 -64.0 + 157.7500 101.5000 -64.0 + 154.5000 101.2500 -64.0 + 152.5000 103.2500 -64.0 + 147.5000 106.2500 -64.0 + 145.5000 106.2500 -64.0 + 143.5000 107.2500 -64.0 + 141.5000 107.2500 -64.0 + 134.5000 106.2500 -64.0 + 132.2500 109.5000 -64.0 + 131.2500 111.5000 -64.0 + 133.2500 112.5000 -64.0 + 133.2500 115.5000 -64.0 + 137.2500 119.5000 -64.0 + 142.2500 122.5000 -64.0 + 144.5000 122.7500 -64.0 + 146.5000 123.7500 -64.0 + 151.5000 124.7500 -64.0 + 156.5000 126.7500 -64.0 + 158.2500 130.5000 -64.0 + 156.5000 132.2500 -64.0 + 153.5000 132.2500 -64.0 + 149.7500 130.5000 -64.0 + 147.5000 131.2500 -64.0 + 147.2500 132.5000 -64.0 + 145.5000 133.2500 -64.0 + 143.5000 134.2500 -64.0 + 141.7500 132.5000 -64.0 + 141.7500 128.5000 -64.0 + 138.7500 125.5000 -64.0 + 138.7500 123.5000 -64.0 + 137.5000 124.2500 -64.0 + 135.5000 125.2500 -64.0 + 130.5000 124.2500 -64.0 + 132.2500 126.5000 -64.0 + 131.5000 127.2500 -64.0 + 129.5000 127.2500 -64.0 + 129.2500 128.5000 -64.0 + 128.5000 130.2500 -64.0 + 124.7500 128.5000 -64.0 + 123.7500 126.5000 -64.0 + 120.5000 125.2500 -64.0 + 120.2500 126.5000 -64.0 + 131.2500 136.5000 -64.0 + 136.2500 139.5000 -64.0 + 138.5000 139.7500 -64.0 + 141.2500 142.5000 -64.0 + 151.2500 148.5000 -64.0 + 157.5000 149.7500 -64.0 + 163.2500 152.5000 -64.0 + 164.2500 154.5000 -64.0 + 165.7500 155.5000 -64.0 + 164.7500 153.5000 -64.0 + 165.5000 151.7500 -64.0 + 167.5000 150.7500 -64.0 + 165.7500 149.5000 -64.0 + 164.7500 147.5000 -64.0 + 163.5000 147.2500 -64.0 + 164.2500 148.5000 -64.0 + 163.5000 149.2500 -64.0 + 160.5000 149.2500 -64.0 + 158.7500 147.5000 -64.0 + 157.5000 145.2500 -64.0 + 151.5000 142.2500 -64.0 + 148.7500 138.5000 -64.0 + 148.7500 136.5000 -64.0 + 150.5000 135.7500 -64.0 + 150.7500 134.5000 -64.0 + 152.5000 132.7500 -64.0 + 156.2500 135.5000 -64.0 + 156.2500 137.5000 -64.0 + 158.2500 138.5000 -64.0 + 160.2500 142.5000 -64.0 + 163.5000 142.7500 -64.0 + 160.7500 140.5000 -64.0 + 160.7500 138.5000 -64.0 + 157.7500 134.5000 -64.0 + 159.5000 132.7500 -64.0 + 161.5000 132.7500 -64.0 + 164.2500 135.5000 -64.0 + 166.5000 133.7500 -64.0 + 170.2500 137.5000 -64.0 + 169.2500 138.5000 -64.0 + 168.2500 140.5000 -64.0 + 167.5000 142.2500 -64.0 + 165.5000 142.2500 -64.0 + 167.2500 144.5000 -64.0 + 166.5000 145.7500 -64.0 + 168.5000 144.7500 -64.0 + 169.5000 145.7500 -64.0 + 171.5000 146.7500 -64.0 + 173.2500 150.5000 -64.0 + 172.5000 152.2500 -64.0 + 172.2500 155.5000 -64.0 + 171.5000 157.2500 -64.0 + 166.5000 157.2500 -64.0 + 166.2500 162.5000 -64.0 + 165.2500 169.5000 -64.0 + 163.2500 173.5000 -64.0 + 160.5000 177.2500 -64.0 + 160.2500 179.5000 -64.0 + 159.2500 182.5000 -64.0 + 154.2500 188.5000 -64.0 + 150.2500 196.5000 -64.0 + 143.2500 205.5000 -64.0 + 133.5000 213.2500 -64.0 + 131.2500 214.5000 -64.0 + 124.5000 219.2500 -64.0 + 121.5000 219.2500 -64.0 + 117.5000 221.2500 -64.0 + 114.5000 221.2500 -64.0 + 108.7500 218.5000 -64.0 + 106.5000 218.2500 -64.0 + 102.7500 215.5000 -64.0 + 98.5000 219.2500 -64.0 + 94.5000 221.2500 -64.0 + 84.5000 221.2500 -64.0 + 81.5000 220.2500 -64.0 + 77.7500 218.5000 -64.0 + 65.5000 210.2500 -64.0 + 63.5000 209.2500 -64.0 + 54.7500 199.5000 -64.0 + 51.7500 195.5000 -64.0 + 51.7500 193.5000 -64.0 + 50.7500 191.5000 -64.0 + 50.7500 188.5000 -64.0 + 44.7500 182.5000 -64.0 + 41.7500 178.5000 -64.0 + 41.7500 176.5000 -64.0 + 39.7500 172.5000 -64.0 + 39.7500 170.5000 -64.0 + 38.7500 168.5000 -64.0 + 38.7500 165.5000 -64.0 + 39.5000 163.7500 -64.0 + 39.7500 158.5000 -64.0 + 38.7500 156.5000 -64.0 + 38.7500 148.5000 -64.0 + 40.5000 144.2500 -64.0 + 38.5000 143.2500 -64.0 + 36.7500 142.5000 -64.0 + 36.7500 140.5000 -64.0 + 38.5000 139.7500 -64.0 + 42.5000 141.7500 -64.0 + 42.7500 139.5000 -64.0 + 40.7500 135.5000 -64.0 + 40.7500 133.5000 -64.0 + 42.7500 127.5000 -64.0 + 44.5000 123.7500 -64.0 + 43.7500 121.5000 -64.0 + 45.5000 119.7500 -64.0 + 46.2500 120.5000 -64.0 + 47.2500 122.5000 -64.0 + 51.2500 126.5000 -64.0 + 52.5000 125.7500 -64.0 + 53.2500 126.5000 -64.0 + 55.7500 122.5000 -64.0 + 60.5000 120.7500 -64.0 + 61.5000 118.7500 -64.0 + 63.5000 117.7500 -64.0 + 65.7500 112.5000 -64.0 + 64.5000 112.2500 -64.0 + 61.5000 115.2500 -64.0 + 58.5000 115.2500 -64.0 + 60.2500 117.5000 -64.0 + 60.2500 119.5000 -64.0 + 58.5000 120.2500 -64.0 + 56.5000 121.2500 -64.0 + 52.7500 118.5000 -64.0 + 52.7500 116.5000 -64.0 + 55.5000 113.7500 -64.0 + 58.5000 113.7500 -64.0 + 58.7500 112.5000 -64.0 + 61.5000 108.7500 -64.0 + 65.5000 110.7500 -64.0 + 66.5000 108.7500 -64.0 + 68.5000 109.7500 -64.0 + 70.2500 110.5000 -64.0 + 71.5000 109.7500 -64.0 + 76.7500 109.5000 -64.0 + 77.7500 107.5000 -64.0 + 81.5000 103.7500 -64.0 + 81.7500 101.5000 -64.0 + 78.5000 104.2500 -64.0 + 76.7500 102.5000 -64.0 + 76.7500 100.5000 -64.0 + 75.5000 101.2500 -64.0 + 69.5000 103.2500 -64.0 + 61.7500 98.5000 -64.0 + 59.5000 98.2500 -64.0 + 57.5000 97.2500 -64.0 + 55.5000 98.2500 -64.0 + 52.2500 102.5000 -64.0 + 51.2500 104.5000 -64.0 + 46.5000 110.2500 -64.0 + 43.5000 115.2500 -64.0 + 41.2500 121.5000 -64.0 + 40.5000 123.2500 -64.0 + 38.2500 129.5000 -64.0 + 32.2500 142.5000 -64.0 + 31.5000 144.2500 -64.0 + 31.2500 156.5000 -64.0 + 33.2500 160.5000 -64.0 + 33.2500 163.5000 -64.0 + 34.2500 165.5000 -64.0 + 34.2500 169.5000 -64.0 + 35.2500 171.5000 -64.0 + 35.2500 173.5000 -64.0 + 36.2500 175.5000 -64.0 + 36.2500 177.5000 -64.0 + 40.2500 189.5000 -64.0 + 47.2500 198.5000 -64.0 + 52.2500 206.5000 -64.0 + 55.2500 210.5000 -64.0 + 59.5000 215.7500 -64.0 + 63.2500 218.5000 -64.0 + 69.5000 222.7500 -64.0 + 77.5000 226.7500 -64.0 + 91.5000 228.7500 -64.0 + 93.5000 227.7500 -64.0 + 117.5000 227.7500 -64.0 + 119.5000 226.7500 -64.0 + 123.5000 226.7500 -64.0 + 135.5000 220.7500 -64.0 + 142.5000 214.7500 -64.0 + 144.5000 213.7500 -64.0 + 153.7500 201.5000 -64.0 + 155.7500 197.5000 -64.0 + 159.5000 193.7500 -64.0 + 162.7500 189.5000 -64.0 + 170.7500 173.5000 -64.0 + 171.7500 168.5000 -64.0 + 172.7500 165.5000 -64.0 + 174.5000 161.7500 -64.0 + 174.7500 159.5000 -64.0 + 175.5000 157.7500 -64.0 + 175.7500 144.5000 -64.0 + 166.7500 126.5000 -64.0 + 166.7500 116.5000 -64.0 + 168.7500 110.5000 -64.0 + 169.5000 108.7500 -64.0 + 169.7500 97.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 100.5000 -64.0 + 128.2500 102.5000 -64.0 + 124.5000 104.2500 -64.0 + 125.2500 105.5000 -64.0 + 124.5000 107.2500 -64.0 + 122.5000 107.2500 -64.0 + 120.7500 105.5000 -64.0 + 118.2500 105.5000 -64.0 + 117.2500 107.5000 -64.0 + 123.5000 108.7500 -64.0 + 125.5000 107.7500 -64.0 + 126.2500 108.5000 -64.0 + 128.5000 108.7500 -64.0 + 127.7500 107.5000 -64.0 + 127.7500 104.5000 -64.0 + 129.5000 102.7500 -64.0 + 131.7500 102.5000 -64.0 + 130.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 104.5000 -64.0 + 83.2500 107.5000 -64.0 + 79.2500 111.5000 -64.0 + 78.2500 113.5000 -64.0 + 79.5000 113.7500 -64.0 + 89.5000 107.7500 -64.0 + 91.5000 107.7500 -64.0 + 91.7500 105.5000 -64.0 + 86.5000 107.2500 -64.0 + 84.7500 106.5000 -64.0 + 84.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 108.5000 -64.0 + 114.2500 109.5000 -64.0 + 115.5000 109.7500 -64.0 + 115.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 111.5000 -64.0 + 122.5000 111.7500 -64.0 + 124.5000 112.7500 -64.0 + 123.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 66.2500 117.5000 -64.0 + 67.2500 119.5000 -64.0 + 67.2500 123.5000 -64.0 + 63.2500 126.5000 -64.0 + 60.5000 130.2500 -64.0 + 60.2500 132.5000 -64.0 + 62.2500 134.5000 -64.0 + 62.2500 136.5000 -64.0 + 63.5000 136.7500 -64.0 + 64.2500 138.5000 -64.0 + 61.5000 140.2500 -64.0 + 59.7500 138.5000 -64.0 + 56.5000 138.2500 -64.0 + 56.2500 139.5000 -64.0 + 58.2500 140.5000 -64.0 + 65.5000 140.7500 -64.0 + 71.5000 136.7500 -64.0 + 72.2500 137.5000 -64.0 + 75.5000 137.7500 -64.0 + 77.5000 135.7500 -64.0 + 77.7500 133.5000 -64.0 + 76.7500 131.5000 -64.0 + 71.5000 131.2500 -64.0 + 68.7500 128.5000 -64.0 + 69.5000 127.7500 -64.0 + 77.5000 127.7500 -64.0 + 79.2500 128.5000 -64.0 + 84.5000 128.7500 -64.0 + 87.5000 127.7500 -64.0 + 90.5000 124.7500 -64.0 + 90.7500 121.5000 -64.0 + 89.5000 121.2500 -64.0 + 86.5000 125.2500 -64.0 + 82.5000 127.2500 -64.0 + 80.7500 125.5000 -64.0 + 81.7500 123.5000 -64.0 + 79.5000 123.2500 -64.0 + 77.5000 121.2500 -64.0 + 73.5000 119.2500 -64.0 + 71.5000 120.2500 -64.0 + 68.5000 120.2500 -64.0 + 67.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 118.5000 -64.0 + 120.5000 119.2500 -64.0 + 120.5000 120.7500 -64.0 + 123.5000 119.7500 -64.0 + 122.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 58.5000 99.7500 -64.0 + 60.2500 100.5000 -64.0 + 59.5000 102.2500 -64.0 + 59.2500 104.5000 -64.0 + 56.5000 108.2500 -64.0 + 53.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 64.7500 103.5000 -64.0 + 65.5000 102.7500 -64.0 + 67.2500 103.5000 -64.0 + 66.5000 104.2500 -64.0 +} -64.0 +{ -64.0 + 154.7500 103.5000 -64.0 + 155.5000 102.7500 -64.0 + 157.2500 106.5000 -64.0 + 154.2500 110.5000 -64.0 + 147.5000 113.2500 -64.0 + 145.7500 112.5000 -64.0 + 145.7500 110.5000 -64.0 + 152.5000 104.7500 -64.0 +} -64.0 +{ -64.0 + 69.7500 105.5000 -64.0 + 70.5000 104.7500 -64.0 + 71.2500 105.5000 -64.0 + 70.5000 106.2500 -64.0 +} -64.0 +{ -64.0 + 52.7500 106.5000 -64.0 + 53.5000 105.7500 -64.0 + 55.2500 108.5000 -64.0 + 54.5000 110.2500 -64.0 + 52.5000 110.2500 -64.0 + 51.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 73.7500 107.5000 -64.0 + 74.5000 106.7500 -64.0 + 76.2500 107.5000 -64.0 + 75.5000 108.2500 -64.0 +} -64.0 +{ -64.0 + 134.7500 109.5000 -64.0 + 135.5000 108.7500 -64.0 + 138.2500 110.5000 -64.0 + 137.5000 112.2500 -64.0 + 135.5000 111.2500 -64.0 +} -64.0 +{ -64.0 + 139.7500 110.5000 -64.0 + 140.5000 109.7500 -64.0 + 142.2500 110.5000 -64.0 + 140.5000 112.2500 -64.0 +} -64.0 +{ -64.0 + 153.7500 112.5000 -64.0 + 154.5000 111.7500 -64.0 + 162.5000 111.7500 -64.0 + 165.2500 114.5000 -64.0 + 165.2500 116.5000 -64.0 + 163.5000 118.2500 -64.0 + 159.5000 120.2500 -64.0 + 157.2500 120.5000 -64.0 + 150.5000 123.2500 -64.0 + 145.5000 122.2500 -64.0 + 143.7500 120.5000 -64.0 + 144.7500 117.5000 -64.0 + 147.5000 113.7500 -64.0 + 150.5000 113.7500 -64.0 +} -64.0 +{ -64.0 + 134.7500 113.5000 -64.0 + 135.5000 112.7500 -64.0 + 136.2500 113.5000 -64.0 + 135.5000 114.2500 -64.0 +} -64.0 +{ -64.0 + 50.5000 120.7500 -64.0 + 52.2500 121.5000 -64.0 + 52.2500 123.5000 -64.0 + 50.5000 124.2500 -64.0 + 48.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 72.7500 123.5000 -64.0 + 73.5000 122.7500 -64.0 + 75.2500 124.5000 -64.0 + 74.5000 126.2500 -64.0 +} -64.0 +{ -64.0 + 168.7500 143.5000 -64.0 + 169.5000 142.7500 -64.0 + 170.2500 143.5000 -64.0 + 169.5000 144.2500 -64.0 +} -64.0 +{ -64.0 + 152.7500 145.5000 -64.0 + 153.5000 144.7500 -64.0 + 154.2500 145.5000 -64.0 + 153.5000 146.2500 -64.0 +} -64.0 +v 552 z -120.000000 -64.0 +{ -64.0 + 95.2500 45.5000 -64.0 + 94.2500 47.5000 -64.0 + 92.5000 48.2500 -64.0 + 92.2500 49.5000 -64.0 + 93.5000 49.7500 -64.0 + 95.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 47.5000 -64.0 + 125.2500 49.5000 -64.0 + 125.2500 51.5000 -64.0 + 127.5000 51.7500 -64.0 + 125.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 70.2500 53.5000 -64.0 + 69.5000 54.2500 -64.0 + 63.5000 54.2500 -64.0 + 59.5000 57.2500 -64.0 + 56.2500 61.5000 -64.0 + 45.2500 83.5000 -64.0 + 44.5000 85.2500 -64.0 + 43.2500 93.5000 -64.0 + 42.5000 95.2500 -64.0 + 42.2500 108.5000 -64.0 + 43.2500 110.5000 -64.0 + 43.2500 114.5000 -64.0 + 42.2500 121.5000 -64.0 + 40.2500 127.5000 -64.0 + 37.5000 133.2500 -64.0 + 33.5000 140.2500 -64.0 + 33.2500 148.5000 -64.0 + 32.2500 150.5000 -64.0 + 33.2500 152.5000 -64.0 + 33.2500 157.5000 -64.0 + 34.2500 159.5000 -64.0 + 34.2500 161.5000 -64.0 + 35.2500 163.5000 -64.0 + 35.2500 167.5000 -64.0 + 36.2500 169.5000 -64.0 + 36.2500 171.5000 -64.0 + 37.2500 173.5000 -64.0 + 37.2500 176.5000 -64.0 + 39.2500 180.5000 -64.0 + 39.2500 182.5000 -64.0 + 42.2500 189.5000 -64.0 + 46.2500 193.5000 -64.0 + 49.2500 198.5000 -64.0 + 54.2500 206.5000 -64.0 + 55.2500 208.5000 -64.0 + 63.5000 216.7500 -64.0 + 67.2500 219.5000 -64.0 + 73.2500 223.5000 -64.0 + 79.5000 225.7500 -64.0 + 81.2500 226.5000 -64.0 + 85.5000 226.7500 -64.0 + 87.2500 227.5000 -64.0 + 94.5000 227.7500 -64.0 + 96.5000 226.7500 -64.0 + 119.5000 226.7500 -64.0 + 121.5000 225.7500 -64.0 + 124.5000 225.7500 -64.0 + 134.5000 220.7500 -64.0 + 138.5000 217.7500 -64.0 + 140.5000 216.7500 -64.0 + 147.5000 209.7500 -64.0 + 153.7500 201.5000 -64.0 + 155.7500 197.5000 -64.0 + 160.5000 192.7500 -64.0 + 164.5000 186.7500 -64.0 + 168.5000 179.7500 -64.0 + 168.7500 177.5000 -64.0 + 171.7500 171.5000 -64.0 + 172.7500 166.5000 -64.0 + 174.7500 160.5000 -64.0 + 175.5000 158.7500 -64.0 + 175.7500 143.5000 -64.0 + 171.7500 135.5000 -64.0 + 166.5000 129.2500 -64.0 + 164.5000 128.2500 -64.0 + 163.5000 130.2500 -64.0 + 158.5000 133.2500 -64.0 + 155.5000 133.2500 -64.0 + 151.7500 131.5000 -64.0 + 148.5000 131.2500 -64.0 + 146.5000 133.2500 -64.0 + 143.5000 133.2500 -64.0 + 141.7500 132.5000 -64.0 + 139.7500 128.5000 -64.0 + 139.5000 125.2500 -64.0 + 136.5000 126.2500 -64.0 + 133.5000 125.2500 -64.0 + 131.7500 121.5000 -64.0 + 133.5000 119.7500 -64.0 + 136.5000 119.7500 -64.0 + 138.2500 121.5000 -64.0 + 139.2500 123.5000 -64.0 + 140.5000 122.7500 -64.0 + 142.5000 123.7500 -64.0 + 144.5000 122.7500 -64.0 + 148.2500 124.5000 -64.0 + 155.5000 124.7500 -64.0 + 161.5000 127.7500 -64.0 + 164.5000 126.7500 -64.0 + 164.7500 123.5000 -64.0 + 163.7500 121.5000 -64.0 + 158.5000 121.2500 -64.0 + 154.5000 123.2500 -64.0 + 149.5000 123.2500 -64.0 + 146.5000 122.2500 -64.0 + 142.7500 120.5000 -64.0 + 143.5000 118.7500 -64.0 + 146.7500 113.5000 -64.0 + 147.7500 111.5000 -64.0 + 148.5000 109.7500 -64.0 + 149.2500 110.5000 -64.0 + 150.2500 112.5000 -64.0 + 151.5000 112.7500 -64.0 + 153.5000 111.7500 -64.0 + 155.5000 111.7500 -64.0 + 157.5000 110.7500 -64.0 + 161.5000 110.7500 -64.0 + 166.7500 111.5000 -64.0 + 169.5000 107.7500 -64.0 + 169.7500 105.5000 -64.0 + 167.7500 101.5000 -64.0 + 164.5000 101.2500 -64.0 + 162.5000 102.2500 -64.0 + 157.5000 101.2500 -64.0 + 148.5000 109.2500 -64.0 + 145.5000 108.2500 -64.0 + 143.5000 109.2500 -64.0 + 134.5000 107.2500 -64.0 + 134.2500 110.5000 -64.0 + 137.2500 112.5000 -64.0 + 135.5000 114.2500 -64.0 + 133.5000 114.2500 -64.0 + 132.5000 116.2500 -64.0 + 129.5000 116.2500 -64.0 + 127.5000 117.2500 -64.0 + 126.7500 116.5000 -64.0 + 125.2500 116.5000 -64.0 + 123.2500 120.5000 -64.0 + 127.5000 120.7500 -64.0 + 131.2500 124.5000 -64.0 + 134.2500 128.5000 -64.0 + 133.5000 129.2500 -64.0 + 132.5000 128.2500 -64.0 + 130.5000 127.2500 -64.0 + 131.2500 128.5000 -64.0 + 130.5000 129.2500 -64.0 + 128.5000 130.2500 -64.0 + 126.7500 129.5000 -64.0 + 123.7500 125.5000 -64.0 + 124.5000 124.7500 -64.0 + 122.5000 123.2500 -64.0 + 122.2500 126.5000 -64.0 + 125.2500 130.5000 -64.0 + 130.2500 133.5000 -64.0 + 131.2500 135.5000 -64.0 + 136.2500 138.5000 -64.0 + 140.5000 138.7500 -64.0 + 142.2500 139.5000 -64.0 + 143.5000 141.7500 -64.0 + 145.5000 142.7500 -64.0 + 151.5000 148.7500 -64.0 + 161.5000 152.7500 -64.0 + 161.7500 149.5000 -64.0 + 159.7500 148.5000 -64.0 + 158.5000 149.2500 -64.0 + 155.5000 148.2500 -64.0 + 154.7500 146.5000 -64.0 + 151.5000 145.2500 -64.0 + 149.7500 141.5000 -64.0 + 151.7500 140.5000 -64.0 + 150.7500 137.5000 -64.0 + 153.5000 133.7500 -64.0 + 155.5000 133.7500 -64.0 + 159.2500 137.5000 -64.0 + 160.2500 139.5000 -64.0 + 161.5000 137.2500 -64.0 + 159.5000 136.2500 -64.0 + 158.7500 134.5000 -64.0 + 160.5000 133.7500 -64.0 + 165.5000 134.7500 -64.0 + 166.2500 136.5000 -64.0 + 168.5000 136.7500 -64.0 + 170.2500 138.5000 -64.0 + 170.2500 141.5000 -64.0 + 172.2500 143.5000 -64.0 + 172.2500 145.5000 -64.0 + 174.2500 147.5000 -64.0 + 173.5000 148.2500 -64.0 + 173.2500 150.5000 -64.0 + 171.5000 151.2500 -64.0 + 169.7500 149.5000 -64.0 + 169.5000 147.2500 -64.0 + 169.2500 151.5000 -64.0 + 170.5000 151.7500 -64.0 + 172.2500 152.5000 -64.0 + 172.2500 156.5000 -64.0 + 168.5000 159.2500 -64.0 + 166.7500 158.5000 -64.0 + 165.5000 156.2500 -64.0 + 165.2500 163.5000 -64.0 + 164.5000 165.2500 -64.0 + 164.2500 170.5000 -64.0 + 162.2500 174.5000 -64.0 + 159.5000 178.2500 -64.0 + 159.2500 181.5000 -64.0 + 156.5000 185.2500 -64.0 + 153.2500 189.5000 -64.0 + 149.2500 197.5000 -64.0 + 145.2500 202.5000 -64.0 + 142.5000 206.2500 -64.0 + 134.5000 212.2500 -64.0 + 132.2500 213.5000 -64.0 + 125.5000 218.2500 -64.0 + 123.5000 218.2500 -64.0 + 119.5000 220.2500 -64.0 + 112.5000 220.2500 -64.0 + 108.5000 216.2500 -64.0 + 101.5000 215.2500 -64.0 + 99.5000 217.2500 -64.0 + 95.5000 220.2500 -64.0 + 86.5000 220.2500 -64.0 + 81.5000 219.2500 -64.0 + 77.5000 216.2500 -64.0 + 75.5000 215.2500 -64.0 + 68.7500 210.5000 -64.0 + 62.7500 206.5000 -64.0 + 56.7500 199.5000 -64.0 + 53.7500 195.5000 -64.0 + 53.7500 193.5000 -64.0 + 52.7500 191.5000 -64.0 + 52.7500 187.5000 -64.0 + 45.7500 181.5000 -64.0 + 42.7500 176.5000 -64.0 + 42.7500 174.5000 -64.0 + 41.7500 172.5000 -64.0 + 41.7500 170.5000 -64.0 + 40.7500 168.5000 -64.0 + 40.7500 166.5000 -64.0 + 42.7500 160.5000 -64.0 + 40.7500 156.5000 -64.0 + 40.7500 149.5000 -64.0 + 42.5000 147.7500 -64.0 + 46.5000 145.7500 -64.0 + 48.7500 145.5000 -64.0 + 49.7500 143.5000 -64.0 + 47.5000 143.2500 -64.0 + 46.7500 141.5000 -64.0 + 45.5000 141.2500 -64.0 + 44.5000 143.2500 -64.0 + 40.5000 145.2500 -64.0 + 39.7500 144.5000 -64.0 + 37.7500 140.5000 -64.0 + 38.5000 138.7500 -64.0 + 40.5000 138.7500 -64.0 + 44.2500 140.5000 -64.0 + 45.5000 139.7500 -64.0 + 43.7500 136.5000 -64.0 + 41.5000 136.2500 -64.0 + 40.7500 134.5000 -64.0 + 42.7500 132.5000 -64.0 + 43.7500 130.5000 -64.0 + 44.5000 128.7500 -64.0 + 43.7500 127.5000 -64.0 + 42.7500 125.5000 -64.0 + 46.5000 120.7500 -64.0 + 48.2500 121.5000 -64.0 + 49.2500 123.5000 -64.0 + 51.5000 122.7500 -64.0 + 50.7500 120.5000 -64.0 + 52.5000 119.7500 -64.0 + 51.7500 117.5000 -64.0 + 53.5000 116.7500 -64.0 + 55.2500 117.5000 -64.0 + 54.2500 120.5000 -64.0 + 55.2500 122.5000 -64.0 + 58.5000 122.7500 -64.0 + 61.5000 121.7500 -64.0 + 62.5000 119.7500 -64.0 + 64.5000 118.7500 -64.0 + 66.5000 119.7500 -64.0 + 68.5000 118.7500 -64.0 + 75.5000 112.7500 -64.0 + 81.5000 109.7500 -64.0 + 83.2500 110.5000 -64.0 + 81.5000 112.7500 -64.0 + 84.5000 111.7500 -64.0 + 88.5000 107.7500 -64.0 + 90.7500 106.5000 -64.0 + 91.7500 104.5000 -64.0 + 89.5000 106.2500 -64.0 + 87.5000 106.2500 -64.0 + 85.7500 105.5000 -64.0 + 86.7500 103.5000 -64.0 + 85.5000 103.2500 -64.0 + 85.2500 104.5000 -64.0 + 80.5000 109.2500 -64.0 + 78.7500 108.5000 -64.0 + 76.7500 104.5000 -64.0 + 69.5000 104.2500 -64.0 + 65.5000 102.2500 -64.0 + 58.7500 98.5000 -64.0 + 56.5000 98.2500 -64.0 + 49.5000 105.2500 -64.0 + 47.5000 106.2500 -64.0 + 45.7500 104.5000 -64.0 + 45.7500 93.5000 -64.0 + 46.7500 88.5000 -64.0 + 48.7500 83.5000 -64.0 + 53.7500 72.5000 -64.0 + 58.5000 66.7500 -64.0 + 62.5000 63.7500 -64.0 + 66.5000 63.7500 -64.0 + 68.5000 64.7500 -64.0 + 68.7500 62.5000 -64.0 + 66.5000 62.2500 -64.0 + 64.7500 60.5000 -64.0 + 65.5000 59.2500 -64.0 + 62.5000 60.2500 -64.0 + 60.7500 59.5000 -64.0 + 61.5000 58.7500 -64.0 + 65.5000 55.7500 -64.0 + 67.5000 55.7500 -64.0 + 69.2500 56.5000 -64.0 + 68.5000 57.2500 -64.0 + 69.5000 57.7500 -64.0 + 72.5000 53.7500 -64.0 + 74.7500 53.5000 -64.0 +} -64.0 +{ -64.0 + 142.2500 56.5000 -64.0 + 141.5000 57.2500 -64.0 + 135.2500 57.5000 -64.0 + 141.5000 57.7500 -64.0 + 143.5000 56.7500 -64.0 + 145.5000 56.7500 -64.0 + 148.5000 57.7500 -64.0 + 152.2500 61.5000 -64.0 + 153.2500 63.5000 -64.0 + 151.5000 65.2500 -64.0 + 149.5000 66.2500 -64.0 + 150.5000 66.7500 -64.0 + 152.5000 65.7500 -64.0 + 154.5000 65.7500 -64.0 + 161.2500 72.5000 -64.0 + 164.2500 78.5000 -64.0 + 164.2500 80.5000 -64.0 + 166.2500 84.5000 -64.0 + 166.2500 87.5000 -64.0 + 168.5000 87.7500 -64.0 + 168.7500 81.5000 -64.0 + 164.7500 73.5000 -64.0 + 164.5000 71.2500 -64.0 + 161.7500 64.5000 -64.0 + 156.5000 59.2500 -64.0 + 152.5000 57.2500 -64.0 + 150.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 86.5000 -64.0 + 93.2500 87.5000 -64.0 + 93.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 87.5000 -64.0 + 126.2500 90.5000 -64.0 + 128.5000 90.7500 -64.0 + 131.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 91.5000 -64.0 + 95.2500 93.5000 -64.0 + 96.5000 92.7500 -64.0 + 95.7500 91.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 91.5000 -64.0 + 105.2500 93.5000 -64.0 + 106.5000 93.7500 -64.0 + 108.2500 95.5000 -64.0 + 108.7500 94.5000 -64.0 + 107.7500 91.5000 -64.0 +} -64.0 +{ -64.0 + 104.2500 94.5000 -64.0 + 102.2500 97.5000 -64.0 + 103.2500 99.5000 -64.0 + 100.2500 101.5000 -64.0 + 101.2500 104.5000 -64.0 + 106.5000 101.7500 -64.0 + 106.7500 98.5000 -64.0 + 103.7500 97.5000 -64.0 + 104.7500 95.5000 -64.0 +} -64.0 +{ -64.0 + 80.2500 99.5000 -64.0 + 78.5000 102.2500 -64.0 + 78.2500 104.5000 -64.0 + 80.5000 103.7500 -64.0 + 83.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 99.5000 -64.0 + 127.2500 101.5000 -64.0 + 129.5000 101.7500 -64.0 +} -64.0 +{ -64.0 + 109.2500 101.5000 -64.0 + 108.5000 102.2500 -64.0 + 108.2500 105.5000 -64.0 + 109.5000 105.7500 -64.0 + 110.7500 102.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 104.5000 -64.0 + 120.2500 105.5000 -64.0 + 118.5000 107.7500 -64.0 + 120.5000 106.7500 -64.0 + 120.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 107.5000 -64.0 + 95.5000 108.2500 -64.0 + 96.2500 109.5000 -64.0 + 96.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 107.5000 -64.0 + 113.2500 108.5000 -64.0 + 114.7500 109.5000 -64.0 + 115.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 156.2500 113.5000 -64.0 + 155.5000 114.2500 -64.0 + 150.2500 118.5000 -64.0 + 151.2500 120.5000 -64.0 + 153.5000 120.7500 -64.0 + 153.7500 118.5000 -64.0 + 156.5000 115.7500 -64.0 + 158.2500 116.5000 -64.0 + 157.5000 118.2500 -64.0 + 155.2500 119.5000 -64.0 + 158.5000 119.7500 -64.0 + 161.5000 118.7500 -64.0 + 163.7500 115.5000 -64.0 + 162.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 116.5000 -64.0 + 117.2500 118.5000 -64.0 + 117.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 70.2500 120.5000 -64.0 + 67.2500 123.5000 -64.0 + 65.2500 127.5000 -64.0 + 67.5000 127.7500 -64.0 + 68.2500 129.5000 -64.0 + 67.5000 131.2500 -64.0 + 65.7500 130.5000 -64.0 + 64.7500 128.5000 -64.0 + 63.5000 128.2500 -64.0 + 60.5000 129.2500 -64.0 + 60.2500 131.5000 -64.0 + 61.2500 134.5000 -64.0 + 59.2500 138.5000 -64.0 + 60.5000 138.7500 -64.0 + 62.5000 137.7500 -64.0 + 66.2500 139.5000 -64.0 + 64.5000 141.2500 -64.0 + 58.5000 141.2500 -64.0 + 59.2500 142.5000 -64.0 + 63.5000 142.7500 -64.0 + 66.5000 141.7500 -64.0 + 70.5000 137.7500 -64.0 + 75.5000 137.7500 -64.0 + 77.5000 136.7500 -64.0 + 77.7500 134.5000 -64.0 + 76.7500 131.5000 -64.0 + 71.5000 130.2500 -64.0 + 70.7500 128.5000 -64.0 + 71.5000 126.7500 -64.0 + 73.5000 126.7500 -64.0 + 77.2500 129.5000 -64.0 + 84.5000 129.7500 -64.0 + 87.5000 128.7500 -64.0 + 90.5000 125.7500 -64.0 + 90.7500 123.5000 -64.0 + 89.5000 123.2500 -64.0 + 87.5000 125.2500 -64.0 + 83.5000 127.2500 -64.0 + 81.7500 125.5000 -64.0 + 82.7500 124.5000 -64.0 + 77.7500 121.5000 -64.0 + 73.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 48.2500 124.5000 -64.0 + 46.2500 127.5000 -64.0 + 47.5000 127.7500 -64.0 + 49.2500 129.5000 -64.0 + 49.2500 131.5000 -64.0 + 48.2500 133.5000 -64.0 + 50.5000 133.7500 -64.0 + 52.5000 127.7500 -64.0 + 54.5000 128.7500 -64.0 + 54.5000 126.2500 -64.0 + 52.5000 125.2500 -64.0 + 51.5000 127.2500 -64.0 + 49.5000 127.2500 -64.0 +} -64.0 +{ -64.0 + 59.2500 125.5000 -64.0 + 59.2500 126.5000 -64.0 + 60.5000 126.7500 -64.0 + 60.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 56.2500 139.5000 -64.0 + 55.2500 141.5000 -64.0 + 56.7500 140.5000 -64.0 +} -64.0 +{ -64.0 + 164.2500 141.5000 -64.0 + 164.2500 143.5000 -64.0 + 165.5000 144.7500 -64.0 + 165.7500 141.5000 -64.0 +} -64.0 +{ -64.0 + 152.2500 142.5000 -64.0 + 156.2500 145.5000 -64.0 + 156.7500 144.5000 -64.0 + 153.7500 142.5000 -64.0 +} -64.0 +{ -64.0 + 163.2500 152.5000 -64.0 + 162.5000 153.2500 -64.0 + 163.5000 153.7500 -64.0 + 164.7500 152.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 60.5000 -64.0 + 153.5000 59.7500 -64.0 + 157.2500 62.5000 -64.0 + 155.5000 63.2500 -64.0 +} -64.0 +{ -64.0 + 57.7500 63.5000 -64.0 + 58.5000 62.7500 -64.0 + 59.2500 63.5000 -64.0 + 58.5000 64.2500 -64.0 +} -64.0 +{ -64.0 + 56.7500 101.5000 -64.0 + 58.5000 100.7500 -64.0 + 60.2500 101.5000 -64.0 + 62.2500 107.5000 -64.0 + 59.5000 111.2500 -64.0 + 55.7500 109.5000 -64.0 + 53.5000 109.2500 -64.0 + 52.7500 107.5000 -64.0 + 53.5000 105.7500 -64.0 + 55.5000 105.7500 -64.0 +} -64.0 +{ -64.0 + 72.7500 106.5000 -64.0 + 73.5000 105.7500 -64.0 + 76.2500 107.5000 -64.0 + 76.2500 110.5000 -64.0 + 74.5000 111.2500 -64.0 + 72.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 165.5000 106.7500 -64.0 + 166.2500 107.5000 -64.0 + 164.5000 109.2500 -64.0 + 163.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 51.7500 111.5000 -64.0 + 53.5000 110.7500 -64.0 + 56.5000 111.7500 -64.0 + 57.2500 113.5000 -64.0 + 56.5000 115.2500 -64.0 + 52.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 137.7500 112.5000 -64.0 + 138.5000 111.7500 -64.0 + 140.5000 111.7500 -64.0 + 142.2500 112.5000 -64.0 + 142.2500 114.5000 -64.0 + 140.5000 115.2500 -64.0 + 138.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 68.7500 124.5000 -64.0 + 70.5000 123.7500 -64.0 + 71.2500 125.5000 -64.0 + 69.5000 126.2500 -64.0 +} -64.0 +{ -64.0 + 74.7500 124.5000 -64.0 + 75.5000 123.7500 -64.0 + 76.2500 124.5000 -64.0 + 75.5000 126.2500 -64.0 +} -64.0 +{ -64.0 + 37.7500 146.5000 -64.0 + 38.5000 145.7500 -64.0 + 40.2500 146.5000 -64.0 + 38.5000 149.2500 -64.0 + 37.7500 148.5000 -64.0 +} -64.0 +v 442 z -122.000000 -64.0 +{ -64.0 + 95.2500 45.5000 -64.0 + 92.2500 49.5000 -64.0 + 93.5000 49.7500 -64.0 + 95.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 50.5000 -64.0 + 126.2500 52.5000 -64.0 + 127.5000 52.7500 -64.0 + 127.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 65.2500 54.5000 -64.0 + 59.5000 57.2500 -64.0 + 53.5000 66.2500 -64.0 + 53.2500 68.5000 -64.0 + 48.5000 76.2500 -64.0 + 48.2500 78.5000 -64.0 + 46.2500 82.5000 -64.0 + 47.2500 84.5000 -64.0 + 48.7500 83.5000 -64.0 + 53.7500 72.5000 -64.0 + 59.5000 65.7500 -64.0 + 65.5000 62.7500 -64.0 + 69.2500 64.5000 -64.0 + 69.7500 63.5000 -64.0 + 64.7500 60.5000 -64.0 + 66.5000 58.2500 -64.0 + 64.5000 59.2500 -64.0 + 62.7500 58.5000 -64.0 + 66.5000 55.7500 -64.0 + 68.2500 56.5000 -64.0 + 67.2500 57.5000 -64.0 + 69.5000 57.7500 -64.0 + 69.7500 56.5000 -64.0 + 73.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 145.2500 56.5000 -64.0 + 144.5000 57.2500 -64.0 + 141.2500 57.5000 -64.0 + 148.5000 57.7500 -64.0 + 152.2500 61.5000 -64.0 + 152.2500 63.5000 -64.0 + 149.5000 65.2500 -64.0 + 147.5000 65.2500 -64.0 + 146.2500 68.5000 -64.0 + 152.5000 65.7500 -64.0 + 155.5000 66.7500 -64.0 + 158.2500 69.5000 -64.0 + 161.2500 73.5000 -64.0 + 165.2500 81.5000 -64.0 + 166.5000 81.7500 -64.0 + 166.7500 78.5000 -64.0 + 164.7500 74.5000 -64.0 + 164.7500 72.5000 -64.0 + 162.7500 68.5000 -64.0 + 162.7500 66.5000 -64.0 + 158.7500 61.5000 -64.0 + 152.7500 57.5000 -64.0 + 150.5000 57.2500 -64.0 +} -64.0 +{ -64.0 + 154.2500 80.5000 -64.0 + 154.2500 82.5000 -64.0 + 155.5000 83.7500 -64.0 + 155.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 88.5000 -64.0 + 90.5000 89.7500 -64.0 + 94.5000 91.7500 -64.0 + 93.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 88.5000 -64.0 + 127.2500 89.5000 -64.0 + 130.5000 89.7500 -64.0 + 130.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 90.5000 -64.0 + 106.2500 92.5000 -64.0 + 107.5000 92.7500 -64.0 + 107.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 91.5000 -64.0 + 121.2500 92.5000 -64.0 + 122.5000 92.7500 -64.0 + 122.7500 91.5000 -64.0 +} -64.0 +{ -64.0 + 45.2500 92.5000 -64.0 + 42.5000 98.2500 -64.0 + 42.2500 104.5000 -64.0 + 44.2500 111.5000 -64.0 + 43.2500 122.5000 -64.0 + 34.5000 139.2500 -64.0 + 34.2500 143.5000 -64.0 + 33.5000 145.2500 -64.0 + 33.2500 155.5000 -64.0 + 38.2500 176.5000 -64.0 + 43.2500 189.5000 -64.0 + 49.2500 196.5000 -64.0 + 52.2500 202.5000 -64.0 + 59.2500 211.5000 -64.0 + 67.5000 218.7500 -64.0 + 73.2500 222.5000 -64.0 + 86.2500 226.5000 -64.0 + 94.5000 226.7500 -64.0 + 96.5000 225.7500 -64.0 + 119.5000 225.7500 -64.0 + 121.5000 224.7500 -64.0 + 124.5000 224.7500 -64.0 + 132.5000 220.7500 -64.0 + 142.5000 213.7500 -64.0 + 152.7500 201.5000 -64.0 + 155.7500 195.5000 -64.0 + 163.7500 186.5000 -64.0 + 171.7500 170.5000 -64.0 + 174.5000 160.7500 -64.0 + 175.7500 147.5000 -64.0 + 171.7500 136.5000 -64.0 + 167.7500 132.5000 -64.0 + 164.5000 132.2500 -64.0 + 162.5000 133.2500 -64.0 + 160.5000 133.2500 -64.0 + 163.2500 134.5000 -64.0 + 161.5000 136.2500 -64.0 + 162.2500 138.5000 -64.0 + 165.7500 139.5000 -64.0 + 164.7500 137.5000 -64.0 + 165.5000 135.7500 -64.0 + 170.5000 137.7500 -64.0 + 172.2500 141.5000 -64.0 + 171.5000 142.2500 -64.0 + 173.2500 145.5000 -64.0 + 172.5000 147.2500 -64.0 + 173.2500 148.5000 -64.0 + 172.5000 149.2500 -64.0 + 170.5000 148.2500 -64.0 + 168.5000 149.2500 -64.0 + 170.2500 150.5000 -64.0 + 170.2500 156.5000 -64.0 + 169.5000 158.2500 -64.0 + 167.5000 159.2500 -64.0 + 165.5000 164.2500 -64.0 + 164.7500 163.5000 -64.0 + 164.7500 161.5000 -64.0 + 162.7500 155.5000 -64.0 + 161.5000 156.2500 -64.0 + 160.7500 155.5000 -64.0 + 160.2500 156.5000 -64.0 + 163.2500 159.5000 -64.0 + 161.2500 173.5000 -64.0 + 158.2500 177.5000 -64.0 + 157.2500 182.5000 -64.0 + 151.2500 190.5000 -64.0 + 146.2500 200.5000 -64.0 + 139.5000 207.2500 -64.0 + 126.5000 216.2500 -64.0 + 124.5000 216.2500 -64.0 + 118.5000 219.2500 -64.0 + 112.5000 219.2500 -64.0 + 108.7500 215.5000 -64.0 + 104.5000 215.2500 -64.0 + 103.7500 213.5000 -64.0 + 101.5000 213.2500 -64.0 + 99.5000 216.2500 -64.0 + 95.5000 219.2500 -64.0 + 92.5000 219.2500 -64.0 + 89.5000 218.2500 -64.0 + 87.5000 219.2500 -64.0 + 85.5000 219.2500 -64.0 + 73.5000 213.2500 -64.0 + 67.5000 208.2500 -64.0 + 63.5000 206.2500 -64.0 + 57.7500 199.5000 -64.0 + 54.7500 193.5000 -64.0 + 53.7500 186.5000 -64.0 + 47.7500 181.5000 -64.0 + 44.7500 177.5000 -64.0 + 42.7500 168.5000 -64.0 + 43.7500 158.5000 -64.0 + 41.7500 154.5000 -64.0 + 41.7500 152.5000 -64.0 + 44.5000 148.7500 -64.0 + 48.5000 146.7500 -64.0 + 51.5000 146.7500 -64.0 + 55.5000 144.7500 -64.0 + 59.5000 144.7500 -64.0 + 65.7500 142.5000 -64.0 + 68.5000 138.7500 -64.0 + 72.5000 138.7500 -64.0 + 75.7500 137.5000 -64.0 + 77.7500 133.5000 -64.0 + 89.5000 127.7500 -64.0 + 89.7500 125.5000 -64.0 + 88.5000 125.2500 -64.0 + 84.5000 127.2500 -64.0 + 82.7500 126.5000 -64.0 + 84.5000 124.7500 -64.0 + 84.5000 123.2500 -64.0 + 82.5000 124.2500 -64.0 + 80.5000 124.2500 -64.0 + 77.5000 121.2500 -64.0 + 75.5000 122.2500 -64.0 + 70.5000 121.2500 -64.0 + 66.5000 126.2500 -64.0 + 68.2500 128.5000 -64.0 + 67.5000 132.2500 -64.0 + 66.7500 131.5000 -64.0 + 66.7500 129.5000 -64.0 + 64.5000 129.2500 -64.0 + 62.5000 130.2500 -64.0 + 61.7500 129.5000 -64.0 + 58.5000 129.2500 -64.0 + 58.2500 130.5000 -64.0 + 62.2500 138.5000 -64.0 + 64.5000 138.7500 -64.0 + 65.2500 140.5000 -64.0 + 59.5000 143.2500 -64.0 + 58.7500 142.5000 -64.0 + 56.5000 142.2500 -64.0 + 54.7500 140.5000 -64.0 + 53.5000 143.2500 -64.0 + 52.5000 142.2500 -64.0 + 47.5000 146.2500 -64.0 + 45.7500 145.5000 -64.0 + 44.5000 147.2500 -64.0 + 42.5000 146.2500 -64.0 + 40.5000 147.2500 -64.0 + 37.7500 140.5000 -64.0 + 39.5000 138.7500 -64.0 + 42.7500 138.5000 -64.0 + 43.7500 136.5000 -64.0 + 42.7500 134.5000 -64.0 + 44.7500 133.5000 -64.0 + 46.5000 129.7500 -64.0 + 51.5000 130.7500 -64.0 + 54.5000 129.7500 -64.0 + 55.5000 127.7500 -64.0 + 56.7500 128.5000 -64.0 + 57.7500 126.5000 -64.0 + 56.5000 126.2500 -64.0 + 54.7500 124.5000 -64.0 + 61.5000 120.7500 -64.0 + 64.5000 120.7500 -64.0 + 76.5000 112.7500 -64.0 + 76.7500 111.5000 -64.0 + 68.5000 110.2500 -64.0 + 67.7500 108.5000 -64.0 + 71.5000 106.7500 -64.0 + 75.2500 107.5000 -64.0 + 75.2500 109.5000 -64.0 + 76.5000 109.7500 -64.0 + 78.5000 108.7500 -64.0 + 75.5000 104.2500 -64.0 + 71.5000 106.2500 -64.0 + 68.5000 106.2500 -64.0 + 64.7500 103.5000 -64.0 + 60.5000 102.2500 -64.0 + 57.5000 99.2500 -64.0 + 55.5000 98.2500 -64.0 + 51.5000 101.2500 -64.0 + 49.5000 101.2500 -64.0 + 46.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 104.2500 94.5000 -64.0 + 104.2500 101.5000 -64.0 + 102.5000 103.2500 -64.0 + 103.2500 104.5000 -64.0 + 103.2500 107.5000 -64.0 + 101.2500 108.5000 -64.0 + 106.5000 108.7500 -64.0 + 107.2500 110.5000 -64.0 + 110.5000 110.7500 -64.0 + 114.2500 113.5000 -64.0 + 114.7500 112.5000 -64.0 + 111.7500 108.5000 -64.0 + 109.5000 108.2500 -64.0 + 107.7500 106.5000 -64.0 + 108.5000 104.7500 -64.0 + 107.5000 104.2500 -64.0 + 107.2500 105.5000 -64.0 + 105.5000 106.2500 -64.0 + 103.7500 104.5000 -64.0 + 105.5000 100.7500 -64.0 + 106.2500 101.5000 -64.0 + 107.5000 100.7500 -64.0 + 106.7500 97.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 97.5000 -64.0 + 81.5000 99.2500 -64.0 + 82.5000 99.7500 -64.0 + 84.5000 98.7500 -64.0 +} -64.0 +{ -64.0 + 128.2500 98.5000 -64.0 + 127.2500 99.5000 -64.0 + 128.7500 99.5000 -64.0 +} -64.0 +{ -64.0 + 161.2500 102.5000 -64.0 + 159.5000 105.2500 -64.0 + 159.5000 106.7500 -64.0 + 165.5000 109.7500 -64.0 + 167.5000 108.7500 -64.0 + 167.7500 104.5000 -64.0 + 163.7500 102.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 105.5000 -64.0 + 91.2500 106.5000 -64.0 + 92.5000 106.7500 -64.0 +} -64.0 +{ -64.0 + 98.2500 108.5000 -64.0 + 96.2500 112.5000 -64.0 + 97.5000 112.7500 -64.0 + 99.5000 109.7500 -64.0 +} -64.0 +{ -64.0 + 136.2500 109.5000 -64.0 + 136.2500 110.5000 -64.0 + 137.2500 112.5000 -64.0 + 136.2500 113.5000 -64.0 + 133.5000 117.2500 -64.0 + 129.5000 117.2500 -64.0 + 128.5000 119.2500 -64.0 + 126.5000 120.2500 -64.0 + 125.5000 122.2500 -64.0 + 126.2500 123.5000 -64.0 + 127.2500 125.5000 -64.0 + 126.2500 128.5000 -64.0 + 128.5000 131.7500 -64.0 + 130.5000 130.7500 -64.0 + 132.2500 131.5000 -64.0 + 132.2500 133.5000 -64.0 + 133.2500 136.5000 -64.0 + 134.5000 136.7500 -64.0 + 136.2500 138.5000 -64.0 + 138.5000 138.7500 -64.0 + 143.5000 139.7500 -64.0 + 147.2500 143.5000 -64.0 + 159.2500 154.5000 -64.0 + 159.7500 153.5000 -64.0 + 160.5000 151.7500 -64.0 + 162.7500 150.5000 -64.0 + 158.7500 147.5000 -64.0 + 157.7500 145.5000 -64.0 + 151.5000 145.2500 -64.0 + 149.7500 142.5000 -64.0 + 150.5000 140.7500 -64.0 + 151.7500 141.5000 -64.0 + 150.7500 139.5000 -64.0 + 151.7500 136.5000 -64.0 + 152.5000 134.7500 -64.0 + 154.5000 133.7500 -64.0 + 151.7500 131.5000 -64.0 + 148.5000 131.2500 -64.0 + 145.5000 132.2500 -64.0 + 145.2500 133.5000 -64.0 + 143.5000 135.2500 -64.0 + 144.2500 136.5000 -64.0 + 142.5000 138.2500 -64.0 + 140.5000 138.2500 -64.0 + 138.7500 137.5000 -64.0 + 139.7500 135.5000 -64.0 + 138.7500 133.5000 -64.0 + 138.7500 131.5000 -64.0 + 140.5000 130.7500 -64.0 + 138.7500 129.5000 -64.0 + 137.7500 127.5000 -64.0 + 135.5000 127.2500 -64.0 + 133.7500 125.5000 -64.0 + 132.7500 123.5000 -64.0 + 133.5000 121.7500 -64.0 + 135.5000 120.7500 -64.0 + 138.5000 121.7500 -64.0 + 142.5000 125.7500 -64.0 + 145.5000 124.7500 -64.0 + 152.5000 125.7500 -64.0 + 154.5000 124.7500 -64.0 + 159.5000 124.7500 -64.0 + 161.2500 125.5000 -64.0 + 162.7500 124.5000 -64.0 + 159.5000 122.2500 -64.0 + 153.5000 124.2500 -64.0 + 151.7500 123.5000 -64.0 + 150.5000 124.2500 -64.0 + 148.5000 123.2500 -64.0 + 142.7500 120.5000 -64.0 + 141.7500 118.5000 -64.0 + 144.5000 114.7500 -64.0 + 144.7500 111.5000 -64.0 + 141.5000 111.2500 -64.0 + 137.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 85.2500 110.5000 -64.0 + 85.2500 111.5000 -64.0 + 87.5000 111.7500 -64.0 + 87.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 160.2500 111.5000 -64.0 + 159.5000 112.2500 -64.0 + 157.5000 112.2500 -64.0 + 153.2500 115.5000 -64.0 + 155.5000 115.7500 -64.0 + 157.5000 113.7500 -64.0 + 159.5000 113.7500 -64.0 + 162.5000 112.7500 -64.0 + 164.7500 114.5000 -64.0 + 163.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 115.5000 -64.0 + 117.5000 118.7500 -64.0 + 117.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 116.5000 -64.0 + 150.5000 117.2500 -64.0 + 151.5000 117.7500 -64.0 + 152.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 117.5000 -64.0 + 89.2500 118.5000 -64.0 + 89.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 162.2500 117.5000 -64.0 + 159.2500 119.5000 -64.0 + 161.5000 119.7500 -64.0 + 163.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 123.5000 -64.0 + 116.2500 124.5000 -64.0 + 119.2500 127.5000 -64.0 + 119.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 156.2500 134.5000 -64.0 + 158.2500 135.5000 -64.0 + 159.7500 134.5000 -64.0 +} -64.0 +{ -64.0 + 152.2500 142.5000 -64.0 + 153.2500 143.5000 -64.0 + 153.7500 142.5000 -64.0 +} -64.0 +{ -64.0 + 59.5000 61.7500 -64.0 + 60.2500 62.5000 -64.0 + 57.5000 65.2500 -64.0 + 56.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 157.7500 65.5000 -64.0 + 158.5000 64.7500 -64.0 + 160.2500 66.5000 -64.0 + 159.5000 68.2500 -64.0 + 158.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 55.7500 101.5000 -64.0 + 57.5000 100.7500 -64.0 + 63.2500 107.5000 -64.0 + 61.5000 110.2500 -64.0 + 59.7500 109.5000 -64.0 + 55.5000 109.2500 -64.0 + 52.7500 106.5000 -64.0 + 54.5000 105.7500 -64.0 +} -64.0 +{ -64.0 + 49.7500 108.5000 -64.0 + 50.5000 107.7500 -64.0 + 52.5000 108.7500 -64.0 + 61.5000 112.7500 -64.0 + 64.2500 118.5000 -64.0 + 61.5000 120.2500 -64.0 + 58.5000 120.2500 -64.0 + 55.7500 117.5000 -64.0 + 53.5000 117.2500 -64.0 + 46.7500 111.5000 -64.0 + 47.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 51.7500 119.5000 -64.0 + 52.5000 118.7500 -64.0 + 53.2500 119.5000 -64.0 + 54.2500 121.5000 -64.0 + 53.5000 123.2500 -64.0 + 51.5000 123.2500 -64.0 + 50.7500 121.5000 -64.0 +} -64.0 +v 430 z -124.000000 -64.0 +{ -64.0 + 96.2500 44.5000 -64.0 + 95.2500 45.5000 -64.0 + 96.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 44.5000 -64.0 + 109.2500 49.5000 -64.0 + 108.2500 52.5000 -64.0 + 109.2500 54.5000 -64.0 + 110.7500 52.5000 -64.0 + 109.7500 50.5000 -64.0 + 109.7500 47.5000 -64.0 + 110.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 46.5000 -64.0 + 91.5000 49.2500 -64.0 + 92.2500 50.5000 -64.0 + 93.7500 49.5000 -64.0 + 94.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 50.5000 -64.0 + 127.2500 53.5000 -64.0 + 127.7500 52.5000 -64.0 + 126.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 66.2500 54.5000 -64.0 + 60.5000 57.2500 -64.0 + 56.2500 62.5000 -64.0 + 48.5000 77.2500 -64.0 + 48.2500 81.5000 -64.0 + 49.5000 80.7500 -64.0 + 54.7500 71.5000 -64.0 + 64.5000 62.7500 -64.0 + 66.5000 62.7500 -64.0 + 70.7500 64.5000 -64.0 + 69.7500 61.5000 -64.0 + 66.5000 61.2500 -64.0 + 65.7500 59.5000 -64.0 + 68.5000 56.7500 -64.0 + 72.5000 54.7500 -64.0 +} -64.0 +{ -64.0 + 142.2500 57.5000 -64.0 + 146.5000 57.7500 -64.0 + 152.5000 60.7500 -64.0 + 153.2500 62.5000 -64.0 + 152.5000 64.2500 -64.0 + 151.7500 63.5000 -64.0 + 148.5000 63.2500 -64.0 + 146.5000 65.2500 -64.0 + 146.2500 67.5000 -64.0 + 147.5000 67.7500 -64.0 + 149.5000 65.7500 -64.0 + 154.5000 65.7500 -64.0 + 163.5000 75.7500 -64.0 + 163.5000 71.2500 -64.0 + 160.7500 64.5000 -64.0 + 156.7500 60.5000 -64.0 + 151.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 154.2500 79.5000 -64.0 + 153.5000 80.2500 -64.0 + 153.2500 83.5000 -64.0 + 155.5000 85.7500 -64.0 + 155.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 87.5000 -64.0 + 90.5000 88.2500 -64.0 + 92.2500 89.5000 -64.0 + 92.2500 91.5000 -64.0 + 93.5000 91.7500 -64.0 + 93.7500 90.5000 -64.0 + 92.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 88.5000 -64.0 + 106.5000 89.2500 -64.0 + 106.2500 94.5000 -64.0 + 107.5000 93.7500 -64.0 + 107.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 88.5000 -64.0 + 127.2500 89.5000 -64.0 + 129.5000 89.7500 -64.0 + 129.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 90.5000 -64.0 + 121.5000 92.2500 -64.0 + 122.5000 92.7500 -64.0 + 123.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 46.2500 96.5000 -64.0 + 43.5000 99.2500 -64.0 + 43.2500 105.5000 -64.0 + 45.5000 107.7500 -64.0 + 47.5000 106.7500 -64.0 + 51.5000 106.7500 -64.0 + 61.2500 111.5000 -64.0 + 63.5000 111.7500 -64.0 + 66.2500 116.5000 -64.0 + 65.5000 118.2500 -64.0 + 63.2500 119.5000 -64.0 + 66.5000 119.7500 -64.0 + 71.5000 117.7500 -64.0 + 76.5000 112.7500 -64.0 + 74.7500 109.5000 -64.0 + 76.5000 107.7500 -64.0 + 75.7500 105.5000 -64.0 + 74.5000 105.2500 -64.0 + 68.5000 108.2500 -64.0 + 64.7500 105.5000 -64.0 + 59.5000 105.2500 -64.0 + 57.5000 107.2500 -64.0 + 54.5000 105.2500 -64.0 + 53.7500 103.5000 -64.0 + 54.5000 101.7500 -64.0 + 56.5000 101.7500 -64.0 + 57.2500 103.5000 -64.0 + 58.5000 103.7500 -64.0 + 57.7500 100.5000 -64.0 + 55.7500 98.5000 -64.0 + 53.5000 98.2500 -64.0 + 49.7500 96.5000 -64.0 +} -64.0 +{ -64.0 + 48.2500 109.5000 -64.0 + 47.2500 110.5000 -64.0 + 48.2500 113.5000 -64.0 + 51.7500 114.5000 -64.0 + 50.7500 112.5000 -64.0 + 50.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 109.5000 -64.0 + 98.5000 110.2500 -64.0 + 95.2500 115.5000 -64.0 + 98.5000 112.7500 -64.0 + 103.5000 112.7500 -64.0 + 105.5000 111.7500 -64.0 + 108.5000 111.7500 -64.0 + 111.5000 112.7500 -64.0 + 115.2500 115.5000 -64.0 + 118.2500 119.5000 -64.0 + 119.7500 119.5000 -64.0 + 114.5000 113.2500 -64.0 + 112.5000 112.2500 -64.0 + 110.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 161.2500 111.5000 -64.0 + 152.5000 116.2500 -64.0 + 151.5000 117.7500 -64.0 + 153.5000 116.7500 -64.0 + 155.5000 116.7500 -64.0 + 157.5000 114.7500 -64.0 + 163.5000 112.7500 -64.0 + 165.5000 114.7500 -64.0 + 165.7500 112.5000 -64.0 + 163.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 85.2500 112.5000 -64.0 + 83.5000 117.2500 -64.0 + 81.7500 116.5000 -64.0 + 82.7500 114.5000 -64.0 + 77.5000 114.2500 -64.0 + 75.2500 117.5000 -64.0 + 78.2500 118.5000 -64.0 + 78.2500 120.5000 -64.0 + 73.5000 123.2500 -64.0 + 70.5000 122.2500 -64.0 + 66.5000 126.2500 -64.0 + 66.2500 129.5000 -64.0 + 64.5000 131.2500 -64.0 + 63.7500 130.5000 -64.0 + 61.5000 130.2500 -64.0 + 57.5000 127.2500 -64.0 + 55.5000 129.2500 -64.0 + 53.5000 129.2500 -64.0 + 49.7500 127.5000 -64.0 + 47.5000 127.2500 -64.0 + 45.7500 125.5000 -64.0 + 42.2500 128.5000 -64.0 + 36.5000 136.2500 -64.0 + 34.5000 142.2500 -64.0 + 34.2500 156.5000 -64.0 + 35.2500 158.5000 -64.0 + 36.2500 168.5000 -64.0 + 40.2500 178.5000 -64.0 + 40.2500 180.5000 -64.0 + 45.2500 190.5000 -64.0 + 48.2500 192.5000 -64.0 + 55.2500 204.5000 -64.0 + 65.5000 215.7500 -64.0 + 73.2500 221.5000 -64.0 + 86.2500 225.5000 -64.0 + 101.5000 225.7500 -64.0 + 103.5000 224.7500 -64.0 + 115.5000 225.7500 -64.0 + 117.5000 224.7500 -64.0 + 120.5000 224.7500 -64.0 + 131.5000 220.7500 -64.0 + 138.5000 215.7500 -64.0 + 150.5000 202.7500 -64.0 + 156.7500 192.5000 -64.0 + 161.7500 187.5000 -64.0 + 165.7500 181.5000 -64.0 + 172.7500 165.5000 -64.0 + 174.5000 156.7500 -64.0 + 174.7500 147.5000 -64.0 + 173.7500 145.5000 -64.0 + 172.7500 139.5000 -64.0 + 167.7500 133.5000 -64.0 + 163.5000 133.2500 -64.0 + 162.2500 139.5000 -64.0 + 165.5000 139.7500 -64.0 + 169.5000 137.7500 -64.0 + 171.2500 140.5000 -64.0 + 167.5000 143.2500 -64.0 + 168.2500 144.5000 -64.0 + 167.2500 148.5000 -64.0 + 169.5000 148.7500 -64.0 + 170.2500 150.5000 -64.0 + 169.2500 152.5000 -64.0 + 171.2500 156.5000 -64.0 + 167.5000 158.2500 -64.0 + 167.2500 164.5000 -64.0 + 166.5000 166.2500 -64.0 + 164.7500 165.5000 -64.0 + 164.7500 163.5000 -64.0 + 163.7500 161.5000 -64.0 + 163.7500 150.5000 -64.0 + 161.5000 150.2500 -64.0 + 156.7500 145.5000 -64.0 + 155.7500 143.5000 -64.0 + 151.7500 142.5000 -64.0 + 150.7500 140.5000 -64.0 + 147.7500 139.5000 -64.0 + 150.5000 137.7500 -64.0 + 153.5000 133.7500 -64.0 + 159.5000 135.7500 -64.0 + 159.7500 134.5000 -64.0 + 153.5000 133.2500 -64.0 + 152.7500 131.5000 -64.0 + 146.7500 128.5000 -64.0 + 148.5000 126.7500 -64.0 + 151.5000 126.7500 -64.0 + 156.7500 124.5000 -64.0 + 150.5000 124.2500 -64.0 + 141.7500 120.5000 -64.0 + 139.5000 120.2500 -64.0 + 137.7500 118.5000 -64.0 + 138.5000 117.7500 -64.0 + 141.5000 117.7500 -64.0 + 143.7500 115.5000 -64.0 + 138.7500 112.5000 -64.0 + 137.2500 112.5000 -64.0 + 136.2500 114.5000 -64.0 + 132.5000 118.2500 -64.0 + 132.2500 120.5000 -64.0 + 138.5000 121.7500 -64.0 + 140.2500 124.5000 -64.0 + 137.5000 127.2500 -64.0 + 134.5000 127.2500 -64.0 + 131.7500 123.5000 -64.0 + 131.7500 121.5000 -64.0 + 129.5000 121.2500 -64.0 + 128.2500 124.5000 -64.0 + 129.2500 127.5000 -64.0 + 133.2500 129.5000 -64.0 + 132.5000 130.2500 -64.0 + 132.2500 134.5000 -64.0 + 134.2500 136.5000 -64.0 + 139.2500 139.5000 -64.0 + 146.2500 141.5000 -64.0 + 147.5000 143.7500 -64.0 + 149.5000 144.7500 -64.0 + 150.2500 146.5000 -64.0 + 153.5000 147.7500 -64.0 + 157.2500 150.5000 -64.0 + 162.2500 160.5000 -64.0 + 162.2500 169.5000 -64.0 + 147.5000 194.2500 -64.0 + 147.2500 197.5000 -64.0 + 141.2500 204.5000 -64.0 + 130.5000 212.2500 -64.0 + 118.5000 218.2500 -64.0 + 116.5000 218.2500 -64.0 + 114.5000 219.2500 -64.0 + 111.7500 217.5000 -64.0 + 108.5000 213.2500 -64.0 + 105.5000 214.2500 -64.0 + 101.5000 211.2500 -64.0 + 99.5000 214.2500 -64.0 + 95.5000 217.2500 -64.0 + 83.5000 217.2500 -64.0 + 73.5000 212.2500 -64.0 + 68.5000 207.2500 -64.0 + 64.5000 205.2500 -64.0 + 60.7500 201.5000 -64.0 + 56.7500 194.5000 -64.0 + 54.7500 185.5000 -64.0 + 50.5000 181.2500 -64.0 + 48.5000 180.2500 -64.0 + 45.7500 175.5000 -64.0 + 45.7500 171.5000 -64.0 + 44.7500 169.5000 -64.0 + 44.7500 157.5000 -64.0 + 43.7500 154.5000 -64.0 + 44.7500 151.5000 -64.0 + 48.5000 148.7500 -64.0 + 52.5000 148.7500 -64.0 + 76.5000 136.7500 -64.0 + 80.5000 132.7500 -64.0 + 88.5000 128.7500 -64.0 + 88.5000 126.2500 -64.0 + 86.5000 125.2500 -64.0 + 84.5000 127.2500 -64.0 + 80.5000 127.2500 -64.0 + 76.7500 124.5000 -64.0 + 80.5000 120.7500 -64.0 + 84.5000 118.7500 -64.0 + 87.7500 119.5000 -64.0 + 85.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 54.2500 115.5000 -64.0 + 54.5000 115.7500 -64.0 + 57.7500 117.5000 -64.0 + 56.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 47.2500 116.5000 -64.0 + 46.5000 117.2500 -64.0 + 46.2500 121.5000 -64.0 + 48.2500 125.5000 -64.0 + 49.5000 125.7500 -64.0 + 51.5000 124.7500 -64.0 + 56.5000 121.7500 -64.0 + 59.5000 121.7500 -64.0 + 62.7500 120.5000 -64.0 + 58.5000 120.2500 -64.0 + 52.5000 117.2500 -64.0 + 50.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 118.5000 -64.0 + 109.2500 119.5000 -64.0 + 111.5000 120.7500 -64.0 + 112.5000 120.2500 -64.0 +} -64.0 +{ -64.0 + 161.2500 118.5000 -64.0 + 159.5000 120.2500 -64.0 + 157.2500 120.5000 -64.0 + 160.5000 120.7500 -64.0 + 162.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 121.5000 -64.0 + 96.5000 122.2500 -64.0 + 97.5000 122.7500 -64.0 + 98.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 121.5000 -64.0 + 115.2500 123.5000 -64.0 + 118.2500 129.5000 -64.0 + 121.2500 131.5000 -64.0 + 126.5000 131.7500 -64.0 + 126.7500 128.5000 -64.0 + 125.7500 125.5000 -64.0 + 124.5000 125.2500 -64.0 + 126.2500 128.5000 -64.0 + 123.5000 131.2500 -64.0 + 119.7500 128.5000 -64.0 + 117.7500 124.5000 -64.0 + 114.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 160.2500 122.5000 -64.0 + 159.2500 123.5000 -64.0 + 161.5000 123.7500 -64.0 + 161.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 47.2500 137.5000 -64.0 + 47.2500 138.5000 -64.0 + 48.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 62.5000 58.7500 -64.0 + 63.2500 59.5000 -64.0 + 57.5000 66.2500 -64.0 + 56.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 157.7500 66.5000 -64.0 + 158.5000 65.7500 -64.0 + 159.2500 66.5000 -64.0 + 158.5000 67.2500 -64.0 +} -64.0 +{ -64.0 + 45.7500 101.5000 -64.0 + 47.5000 100.7500 -64.0 + 48.2500 102.5000 -64.0 + 50.2500 103.5000 -64.0 + 47.5000 105.2500 -64.0 + 45.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 71.7500 108.5000 -64.0 + 72.5000 107.7500 -64.0 + 74.2500 109.5000 -64.0 + 72.5000 112.2500 -64.0 + 68.5000 112.2500 -64.0 + 67.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 140.7500 126.5000 -64.0 + 142.5000 125.7500 -64.0 + 146.2500 133.5000 -64.0 + 145.5000 135.2500 -64.0 + 146.2500 137.5000 -64.0 + 145.5000 139.2500 -64.0 + 141.7500 134.5000 -64.0 + 142.7500 132.5000 -64.0 +} -64.0 +{ -64.0 + 71.5000 126.7500 -64.0 + 73.2500 127.5000 -64.0 + 70.5000 129.2500 -64.0 + 69.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 53.7500 130.5000 -64.0 + 54.5000 129.7500 -64.0 + 56.5000 129.7500 -64.0 + 60.2500 133.5000 -64.0 + 60.2500 135.5000 -64.0 + 61.5000 136.7500 -64.0 + 63.5000 137.7500 -64.0 + 65.2500 138.5000 -64.0 + 64.2500 140.5000 -64.0 + 61.5000 142.2500 -64.0 + 59.5000 142.2500 -64.0 + 56.5000 145.2500 -64.0 + 54.7500 144.5000 -64.0 + 54.7500 141.5000 -64.0 + 53.2500 141.5000 -64.0 + 54.2500 143.5000 -64.0 + 52.5000 146.2500 -64.0 + 51.7500 145.5000 -64.0 + 49.5000 145.2500 -64.0 + 48.5000 147.2500 -64.0 + 44.5000 147.2500 -64.0 + 42.5000 149.2500 -64.0 + 42.2500 151.5000 -64.0 + 40.5000 152.2500 -64.0 + 38.7500 149.5000 -64.0 + 38.7500 145.5000 -64.0 + 40.7500 144.5000 -64.0 + 41.7500 142.5000 -64.0 + 38.5000 142.2500 -64.0 + 37.7500 140.5000 -64.0 + 39.5000 139.7500 -64.0 + 40.5000 137.7500 -64.0 + 42.5000 137.7500 -64.0 + 42.7500 136.5000 -64.0 + 41.7500 134.5000 -64.0 + 43.5000 132.7500 -64.0 + 45.5000 133.7500 -64.0 + 45.7500 131.5000 -64.0 + 47.5000 130.7500 -64.0 + 49.2500 131.5000 -64.0 + 48.2500 133.5000 -64.0 + 50.5000 133.7500 -64.0 + 50.7500 132.5000 -64.0 +} -64.0 +{ -64.0 + 160.7500 154.5000 -64.0 + 161.5000 153.7500 -64.0 + 163.2500 154.5000 -64.0 + 162.5000 155.2500 -64.0 +} -64.0 +v 424 z -126.000000 -64.0 +{ -64.0 + 110.2500 34.5000 -64.0 + 110.2500 37.5000 -64.0 + 109.5000 39.2500 -64.0 + 109.2500 43.5000 -64.0 + 110.5000 43.7500 -64.0 + 111.5000 41.7500 -64.0 + 111.7500 34.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 43.5000 -64.0 + 92.2500 48.5000 -64.0 + 91.2500 50.5000 -64.0 + 92.7500 51.5000 -64.0 + 98.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 43.5000 -64.0 + 120.2500 44.5000 -64.0 + 123.2500 47.5000 -64.0 + 126.2500 52.5000 -64.0 + 127.5000 54.7500 -64.0 + 131.2500 57.5000 -64.0 + 132.7500 57.5000 -64.0 + 127.7500 53.5000 -64.0 + 127.7500 51.5000 -64.0 + 121.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 50.5000 -64.0 + 109.2500 55.5000 -64.0 + 110.5000 53.7500 -64.0 + 110.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 66.2500 55.5000 -64.0 + 65.5000 56.2500 -64.0 + 63.5000 56.2500 -64.0 + 59.5000 59.2500 -64.0 + 56.2500 63.5000 -64.0 + 55.2500 65.5000 -64.0 + 52.5000 71.2500 -64.0 + 52.2500 73.5000 -64.0 + 63.5000 62.7500 -64.0 + 67.5000 62.7500 -64.0 + 71.7500 64.5000 -64.0 + 70.7500 61.5000 -64.0 + 68.5000 60.2500 -64.0 + 66.5000 61.2500 -64.0 + 65.7500 60.5000 -64.0 + 64.7500 58.5000 -64.0 + 68.5000 55.7500 -64.0 + 75.7500 55.5000 -64.0 +} -64.0 +{ -64.0 + 143.2500 57.5000 -64.0 + 141.2500 58.5000 -64.0 + 145.2500 59.5000 -64.0 + 151.5000 59.7500 -64.0 + 153.2500 61.5000 -64.0 + 152.5000 63.2500 -64.0 + 147.2500 63.5000 -64.0 + 145.2500 67.5000 -64.0 + 147.5000 65.7500 -64.0 + 149.5000 65.7500 -64.0 + 151.5000 64.7500 -64.0 + 152.2500 65.5000 -64.0 + 153.5000 64.7500 -64.0 + 155.5000 65.7500 -64.0 + 159.5000 70.7500 -64.0 + 161.5000 71.7500 -64.0 + 161.7500 69.5000 -64.0 + 159.7500 64.5000 -64.0 + 152.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 59.2500 76.5000 -64.0 + 58.2500 79.5000 -64.0 + 59.7500 80.5000 -64.0 + 61.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 79.5000 -64.0 + 152.2500 82.5000 -64.0 + 153.5000 85.7500 -64.0 + 155.5000 86.7500 -64.0 + 155.7500 81.5000 -64.0 + 154.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 88.2500 86.5000 -64.0 + 87.5000 87.2500 -64.0 + 88.5000 87.7500 -64.0 + 89.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 87.5000 -64.0 + 107.2500 89.5000 -64.0 + 107.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 87.5000 -64.0 + 127.2500 88.5000 -64.0 + 129.5000 89.7500 -64.0 + 129.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 123.2500 88.5000 -64.0 + 123.2500 90.5000 -64.0 + 124.5000 89.7500 -64.0 +} -64.0 +{ -64.0 + 93.2500 89.5000 -64.0 + 92.2500 91.5000 -64.0 + 93.5000 92.7500 -64.0 +} -64.0 +{ -64.0 + 124.2500 93.5000 -64.0 + 126.2500 95.5000 -64.0 + 127.5000 94.7500 -64.0 + 126.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 50.2500 97.5000 -64.0 + 47.5000 99.2500 -64.0 + 45.5000 99.2500 -64.0 + 44.2500 102.5000 -64.0 + 45.2500 105.5000 -64.0 + 47.5000 105.7500 -64.0 + 50.5000 104.7500 -64.0 + 52.2500 105.5000 -64.0 + 54.5000 104.7500 -64.0 + 54.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 73.2500 106.5000 -64.0 + 67.5000 110.2500 -64.0 + 66.7500 109.5000 -64.0 + 64.2500 109.5000 -64.0 + 67.2500 113.5000 -64.0 + 67.2500 117.5000 -64.0 + 65.5000 119.2500 -64.0 + 59.5000 121.2500 -64.0 + 55.7500 119.5000 -64.0 + 57.5000 118.7500 -64.0 + 54.7500 117.5000 -64.0 + 53.5000 118.2500 -64.0 + 49.5000 118.2500 -64.0 + 48.5000 120.2500 -64.0 + 48.5000 123.7500 -64.0 + 50.5000 122.7500 -64.0 + 56.5000 122.7500 -64.0 + 62.5000 120.7500 -64.0 + 66.5000 120.7500 -64.0 + 68.5000 119.7500 -64.0 + 70.5000 119.7500 -64.0 + 72.5000 117.7500 -64.0 + 75.5000 117.7500 -64.0 + 77.2500 119.5000 -64.0 + 77.2500 121.5000 -64.0 + 74.5000 124.2500 -64.0 + 70.7500 122.5000 -64.0 + 68.2500 127.5000 -64.0 + 70.2500 128.5000 -64.0 + 69.5000 130.2500 -64.0 + 68.5000 129.2500 -64.0 + 66.5000 130.2500 -64.0 + 62.5000 130.2500 -64.0 + 60.7500 128.5000 -64.0 + 58.5000 128.2500 -64.0 + 55.5000 129.2500 -64.0 + 61.2500 134.5000 -64.0 + 62.2500 136.5000 -64.0 + 63.5000 136.7500 -64.0 + 64.2500 138.5000 -64.0 + 60.5000 142.2500 -64.0 + 58.5000 142.2500 -64.0 + 57.5000 144.2500 -64.0 + 53.5000 146.2500 -64.0 + 51.7500 144.5000 -64.0 + 49.5000 145.2500 -64.0 + 49.2500 149.5000 -64.0 + 47.5000 150.2500 -64.0 + 45.2500 158.5000 -64.0 + 43.5000 159.2500 -64.0 + 41.7500 156.5000 -64.0 + 41.7500 152.5000 -64.0 + 38.7500 149.5000 -64.0 + 37.7500 147.5000 -64.0 + 38.7500 144.5000 -64.0 + 40.7500 143.5000 -64.0 + 39.7500 141.5000 -64.0 + 43.5000 135.7500 -64.0 + 48.5000 136.7500 -64.0 + 46.7500 134.5000 -64.0 + 41.7500 133.5000 -64.0 + 42.5000 132.7500 -64.0 + 46.5000 132.7500 -64.0 + 48.5000 130.7500 -64.0 + 49.2500 131.5000 -64.0 + 53.5000 131.7500 -64.0 + 54.7500 130.5000 -64.0 + 42.5000 129.2500 -64.0 + 39.2500 133.5000 -64.0 + 35.5000 141.2500 -64.0 + 35.2500 148.5000 -64.0 + 34.2500 153.5000 -64.0 + 35.2500 155.5000 -64.0 + 35.2500 159.5000 -64.0 + 36.2500 161.5000 -64.0 + 37.2500 170.5000 -64.0 + 39.2500 174.5000 -64.0 + 39.2500 176.5000 -64.0 + 44.2500 186.5000 -64.0 + 48.2500 190.5000 -64.0 + 59.2500 207.5000 -64.0 + 67.2500 215.5000 -64.0 + 71.5000 218.7500 -64.0 + 79.5000 222.7500 -64.0 + 86.2500 224.5000 -64.0 + 101.5000 224.7500 -64.0 + 103.5000 223.7500 -64.0 + 114.5000 224.7500 -64.0 + 116.5000 223.7500 -64.0 + 120.5000 223.7500 -64.0 + 126.5000 221.7500 -64.0 + 136.5000 215.7500 -64.0 + 147.5000 204.7500 -64.0 + 151.7500 198.5000 -64.0 + 158.5000 190.7500 -64.0 + 165.7500 179.5000 -64.0 + 170.7500 169.5000 -64.0 + 173.5000 157.7500 -64.0 + 173.7500 147.5000 -64.0 + 172.7500 145.5000 -64.0 + 171.7500 139.5000 -64.0 + 166.7500 133.5000 -64.0 + 163.5000 133.2500 -64.0 + 160.5000 134.2500 -64.0 + 155.7500 132.5000 -64.0 + 154.5000 133.2500 -64.0 + 152.7500 128.5000 -64.0 + 154.5000 126.7500 -64.0 + 161.5000 122.7500 -64.0 + 160.5000 122.2500 -64.0 + 156.5000 124.2500 -64.0 + 149.5000 124.2500 -64.0 + 136.5000 119.2500 -64.0 + 140.2500 124.5000 -64.0 + 137.5000 127.2500 -64.0 + 134.5000 127.2500 -64.0 + 133.2500 134.5000 -64.0 + 134.5000 134.7500 -64.0 + 134.7500 132.5000 -64.0 + 137.5000 129.7500 -64.0 + 141.2500 130.5000 -64.0 + 141.2500 135.5000 -64.0 + 137.2500 138.5000 -64.0 + 146.5000 141.7500 -64.0 + 147.2500 143.5000 -64.0 + 150.2500 145.5000 -64.0 + 152.5000 145.7500 -64.0 + 156.2500 148.5000 -64.0 + 162.2500 156.5000 -64.0 + 162.2500 158.5000 -64.0 + 163.2500 160.5000 -64.0 + 163.2500 164.5000 -64.0 + 154.2500 181.5000 -64.0 + 149.5000 187.2500 -64.0 + 146.5000 192.2500 -64.0 + 146.2500 194.5000 -64.0 + 143.5000 200.2500 -64.0 + 131.5000 209.2500 -64.0 + 117.5000 217.2500 -64.0 + 114.5000 217.2500 -64.0 + 109.5000 211.2500 -64.0 + 107.5000 212.2500 -64.0 + 105.5000 212.2500 -64.0 + 102.7500 208.5000 -64.0 + 101.5000 208.2500 -64.0 + 95.5000 215.2500 -64.0 + 83.5000 215.2500 -64.0 + 74.5000 211.2500 -64.0 + 68.5000 205.2500 -64.0 + 64.5000 203.2500 -64.0 + 59.7500 195.5000 -64.0 + 59.7500 193.5000 -64.0 + 53.7500 181.5000 -64.0 + 47.7500 174.5000 -64.0 + 47.7500 169.5000 -64.0 + 46.7500 167.5000 -64.0 + 46.7500 153.5000 -64.0 + 50.5000 150.7500 -64.0 + 52.5000 150.7500 -64.0 + 55.7500 148.5000 -64.0 + 58.5000 144.7500 -64.0 + 65.5000 140.7500 -64.0 + 75.5000 136.7500 -64.0 + 79.5000 132.7500 -64.0 + 77.7500 130.5000 -64.0 + 78.5000 128.7500 -64.0 + 79.2500 129.5000 -64.0 + 85.5000 129.7500 -64.0 + 85.7500 126.5000 -64.0 + 83.7500 125.5000 -64.0 + 82.7500 123.5000 -64.0 + 84.5000 121.7500 -64.0 + 84.7500 118.5000 -64.0 + 81.5000 120.2500 -64.0 + 80.7500 119.5000 -64.0 + 81.7500 116.5000 -64.0 + 79.7500 114.5000 -64.0 + 76.5000 114.2500 -64.0 + 74.7500 111.5000 -64.0 + 74.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 47.2500 108.5000 -64.0 + 47.5000 108.7500 -64.0 + 49.5000 109.7500 -64.0 + 53.2500 111.5000 -64.0 + 53.7500 110.5000 -64.0 + 51.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 102.2500 110.5000 -64.0 + 96.5000 113.2500 -64.0 + 93.5000 117.7500 -64.0 + 99.5000 113.7500 -64.0 + 102.5000 113.7500 -64.0 + 105.5000 112.7500 -64.0 + 110.5000 113.7500 -64.0 + 111.2500 115.5000 -64.0 + 113.5000 115.7500 -64.0 + 119.2500 119.5000 -64.0 + 119.7500 118.5000 -64.0 + 118.5000 118.2500 -64.0 + 116.5000 115.2500 -64.0 + 112.5000 113.2500 -64.0 + 109.5000 110.2500 -64.0 + 106.5000 111.2500 -64.0 +} -64.0 +{ -64.0 + 161.2500 111.5000 -64.0 + 149.5000 117.2500 -64.0 + 150.2500 119.5000 -64.0 + 160.5000 113.7500 -64.0 + 163.5000 113.7500 -64.0 + 164.7500 115.5000 -64.0 + 165.7500 113.5000 -64.0 + 164.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 113.5000 -64.0 + 135.2500 116.5000 -64.0 + 136.5000 117.7500 -64.0 + 138.5000 116.7500 -64.0 + 140.5000 116.7500 -64.0 + 140.7500 115.5000 -64.0 + 137.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 57.2500 114.5000 -64.0 + 58.2500 116.5000 -64.0 + 59.7500 116.5000 -64.0 + 58.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 162.2500 117.5000 -64.0 + 160.5000 118.2500 -64.0 + 159.5000 119.7500 -64.0 + 162.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 105.2500 118.5000 -64.0 + 105.2500 119.5000 -64.0 + 110.5000 119.7500 -64.0 + 108.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 119.5000 -64.0 + 100.5000 120.2500 -64.0 + 98.5000 120.2500 -64.0 + 95.2500 123.5000 -64.0 + 93.2500 127.5000 -64.0 + 99.5000 121.7500 -64.0 + 103.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 121.5000 -64.0 + 117.5000 128.7500 -64.0 + 117.7500 124.5000 -64.0 + 114.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 122.5000 -64.0 + 122.2500 123.5000 -64.0 + 126.2500 129.5000 -64.0 + 125.5000 131.2500 -64.0 + 119.5000 131.2500 -64.0 + 120.2500 132.5000 -64.0 + 124.5000 133.7500 -64.0 + 128.5000 131.7500 -64.0 + 128.7500 127.5000 -64.0 + 126.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 43.2500 147.5000 -64.0 + 42.5000 151.2500 -64.0 + 43.7500 152.5000 -64.0 + 44.7500 150.5000 -64.0 +} -64.0 +{ -64.0 + 59.7500 61.5000 -64.0 + 60.5000 60.7500 -64.0 + 62.2500 61.5000 -64.0 + 58.5000 65.2500 -64.0 + 57.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 71.5000 109.7500 -64.0 + 73.2500 110.5000 -64.0 + 71.5000 112.2500 -64.0 + 69.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 76.7500 124.5000 -64.0 + 78.5000 123.7500 -64.0 + 79.2500 125.5000 -64.0 + 77.5000 127.2500 -64.0 + 75.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 80.7500 126.5000 -64.0 + 81.5000 125.7500 -64.0 + 82.2500 126.5000 -64.0 + 81.5000 127.2500 -64.0 +} -64.0 +{ -64.0 + 141.7500 126.5000 -64.0 + 142.5000 125.7500 -64.0 + 143.2500 126.5000 -64.0 + 142.5000 127.2500 -64.0 +} -64.0 +{ -64.0 + 142.7500 131.5000 -64.0 + 143.5000 130.7500 -64.0 + 145.5000 130.7500 -64.0 + 147.2500 132.5000 -64.0 + 148.2500 134.5000 -64.0 + 146.5000 135.2500 -64.0 + 146.2500 137.5000 -64.0 + 147.2500 139.5000 -64.0 + 146.5000 140.2500 -64.0 + 142.7500 136.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 135.5000 -64.0 + 153.5000 134.7500 -64.0 + 157.5000 134.7500 -64.0 + 159.2500 135.5000 -64.0 + 160.5000 134.7500 -64.0 + 162.2500 135.5000 -64.0 + 165.2500 139.5000 -64.0 + 167.5000 139.7500 -64.0 + 169.2500 141.5000 -64.0 + 168.5000 143.2500 -64.0 + 169.2500 144.5000 -64.0 + 168.5000 146.2500 -64.0 + 170.2500 148.5000 -64.0 + 171.2500 150.5000 -64.0 + 169.5000 152.2500 -64.0 + 171.2500 154.5000 -64.0 + 171.2500 157.5000 -64.0 + 165.5000 160.2500 -64.0 + 162.7500 157.5000 -64.0 + 163.5000 156.7500 -64.0 + 163.7500 154.5000 -64.0 + 164.5000 152.7500 -64.0 + 164.5000 150.2500 -64.0 + 162.5000 153.2500 -64.0 + 161.5000 152.2500 -64.0 + 156.7500 145.5000 -64.0 + 156.7500 143.5000 -64.0 + 153.5000 143.2500 -64.0 + 149.7500 140.5000 -64.0 + 149.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 140.7500 138.5000 -64.0 + 141.5000 137.7500 -64.0 + 143.2500 138.5000 -64.0 + 142.5000 139.2500 -64.0 +} -64.0 +v 396 z -128.000000 -64.0 +{ -64.0 + 111.2500 35.5000 -64.0 + 110.5000 36.2500 -64.0 + 108.5000 37.2500 -64.0 + 108.2500 38.5000 -64.0 + 110.2500 40.5000 -64.0 + 113.5000 40.7500 -64.0 + 113.7500 38.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 41.5000 -64.0 + 99.5000 42.2500 -64.0 + 97.5000 43.2500 -64.0 + 92.5000 48.2500 -64.0 + 91.2500 54.5000 -64.0 + 92.5000 54.7500 -64.0 + 92.7500 51.5000 -64.0 + 95.5000 47.7500 -64.0 + 97.5000 46.7500 -64.0 + 99.5000 43.7500 -64.0 + 101.5000 42.7500 -64.0 + 101.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 41.5000 -64.0 + 109.2500 43.5000 -64.0 + 110.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 42.5000 -64.0 + 118.2500 43.5000 -64.0 + 122.2500 46.5000 -64.0 + 121.5000 47.7500 -64.0 + 123.5000 48.7500 -64.0 + 127.2500 54.5000 -64.0 + 127.5000 56.7500 -64.0 + 127.7500 51.5000 -64.0 + 123.5000 45.2500 -64.0 + 119.7500 42.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 51.5000 -64.0 + 109.5000 52.2500 -64.0 + 109.2500 57.5000 -64.0 + 110.5000 55.7500 -64.0 + 110.7500 52.5000 -64.0 +} -64.0 +{ -64.0 + 67.2500 55.5000 -64.0 + 62.5000 57.2500 -64.0 + 59.5000 60.2500 -64.0 + 56.5000 65.2500 -64.0 + 56.2500 68.5000 -64.0 + 64.5000 61.7500 -64.0 + 68.5000 61.7500 -64.0 + 73.7500 65.5000 -64.0 + 71.7500 60.5000 -64.0 + 66.5000 60.2500 -64.0 + 65.7500 58.5000 -64.0 + 67.5000 56.7500 -64.0 + 75.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 58.5000 -64.0 + 140.2500 59.5000 -64.0 + 142.5000 59.7500 -64.0 + 144.2500 61.5000 -64.0 + 144.2500 66.5000 -64.0 + 145.5000 66.7500 -64.0 + 149.5000 63.7500 -64.0 + 154.5000 63.7500 -64.0 + 154.7500 62.5000 -64.0 + 151.7500 59.5000 -64.0 + 146.5000 59.2500 -64.0 + 144.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 60.2500 75.5000 -64.0 + 59.5000 76.2500 -64.0 + 59.5000 81.7500 -64.0 + 61.5000 80.7500 -64.0 + 61.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 79.5000 -64.0 + 152.5000 80.2500 -64.0 + 152.2500 85.5000 -64.0 + 153.5000 86.7500 -64.0 + 155.5000 87.7500 -64.0 + 155.7500 84.5000 -64.0 + 154.7500 82.5000 -64.0 + 154.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 80.5000 -64.0 + 92.2500 81.5000 -64.0 + 93.2500 83.5000 -64.0 + 91.5000 85.2500 -64.0 + 93.2500 88.5000 -64.0 + 93.5000 90.7500 -64.0 + 93.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 82.5000 -64.0 + 123.2500 84.5000 -64.0 + 125.5000 83.7500 -64.0 +} -64.0 +{ -64.0 + 88.2500 83.5000 -64.0 + 87.5000 84.2500 -64.0 + 87.5000 86.7500 -64.0 + 89.5000 85.7500 -64.0 +} -64.0 +{ -64.0 + 126.2500 84.5000 -64.0 + 126.2500 87.5000 -64.0 + 129.5000 87.7500 -64.0 + 131.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 123.2500 87.5000 -64.0 + 123.2500 88.5000 -64.0 + 122.2500 91.5000 -64.0 + 123.5000 91.7500 -64.0 + 125.2500 92.5000 -64.0 + 126.7500 92.5000 -64.0 + 127.7500 90.5000 -64.0 + 126.5000 90.2500 -64.0 + 124.7500 89.5000 -64.0 + 124.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 48.2500 100.5000 -64.0 + 46.2500 102.5000 -64.0 + 48.7500 102.5000 -64.0 + 49.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 46.2500 107.5000 -64.0 + 44.5000 109.7500 -64.0 + 46.5000 108.7500 -64.0 + 54.5000 112.7500 -64.0 + 52.5000 110.2500 -64.0 + 48.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 71.2500 109.5000 -64.0 + 67.5000 112.2500 -64.0 + 69.2500 116.5000 -64.0 + 67.5000 118.2500 -64.0 + 61.5000 121.2500 -64.0 + 58.5000 121.2500 -64.0 + 55.5000 120.2500 -64.0 + 50.5000 119.2500 -64.0 + 48.5000 120.2500 -64.0 + 49.2500 121.5000 -64.0 + 53.2500 122.5000 -64.0 + 60.5000 122.7500 -64.0 + 62.5000 121.7500 -64.0 + 64.5000 121.7500 -64.0 + 66.5000 122.7500 -64.0 + 68.5000 121.7500 -64.0 + 70.5000 121.7500 -64.0 + 70.7500 119.5000 -64.0 + 72.5000 117.7500 -64.0 + 76.5000 117.7500 -64.0 + 78.5000 116.7500 -64.0 + 78.5000 115.2500 -64.0 + 74.7500 113.5000 -64.0 + 74.7500 111.5000 -64.0 + 73.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 160.2500 110.5000 -64.0 + 159.5000 111.2500 -64.0 + 155.5000 114.2500 -64.0 + 150.5000 117.2500 -64.0 + 152.5000 119.7500 -64.0 + 152.7500 117.5000 -64.0 + 155.5000 115.7500 -64.0 + 157.5000 115.7500 -64.0 + 159.5000 113.7500 -64.0 + 161.2500 114.5000 -64.0 + 160.2500 117.5000 -64.0 + 157.5000 119.2500 -64.0 + 158.5000 119.7500 -64.0 + 161.5000 118.7500 -64.0 + 164.5000 114.7500 -64.0 + 164.7500 112.5000 -64.0 + 161.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 102.2500 112.5000 -64.0 + 101.5000 113.2500 -64.0 + 99.5000 113.2500 -64.0 + 96.5000 114.2500 -64.0 + 94.2500 116.5000 -64.0 + 97.5000 116.7500 -64.0 + 99.5000 115.7500 -64.0 + 101.5000 115.7500 -64.0 + 105.5000 113.7500 -64.0 + 108.5000 114.7500 -64.0 + 109.2500 116.5000 -64.0 + 112.5000 116.7500 -64.0 + 114.2500 118.5000 -64.0 + 118.5000 119.7500 -64.0 + 117.5000 117.2500 -64.0 + 113.7500 114.5000 -64.0 + 111.5000 114.2500 -64.0 + 109.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 55.2500 113.5000 -64.0 + 58.2500 115.5000 -64.0 + 59.7500 115.5000 -64.0 + 56.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 114.5000 -64.0 + 137.2500 116.5000 -64.0 + 138.7500 116.5000 -64.0 + 139.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 119.5000 -64.0 + 99.5000 120.2500 -64.0 + 94.5000 126.2500 -64.0 + 94.2500 128.5000 -64.0 + 95.7500 125.5000 -64.0 + 98.5000 122.7500 -64.0 + 103.5000 119.7500 -64.0 + 107.5000 119.7500 -64.0 + 112.5000 121.7500 -64.0 + 115.2500 124.5000 -64.0 + 118.5000 130.7500 -64.0 + 118.7500 128.5000 -64.0 + 117.7500 126.5000 -64.0 + 117.7500 124.5000 -64.0 + 115.5000 122.2500 -64.0 + 109.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 79.2500 121.5000 -64.0 + 73.5000 124.2500 -64.0 + 71.5000 128.2500 -64.0 + 68.5000 128.2500 -64.0 + 66.5000 131.2500 -64.0 + 61.7500 128.5000 -64.0 + 58.5000 128.2500 -64.0 + 53.2500 130.5000 -64.0 + 55.5000 130.7500 -64.0 + 59.5000 132.7500 -64.0 + 61.2500 136.5000 -64.0 + 63.5000 136.7500 -64.0 + 67.5000 133.7500 -64.0 + 68.2500 135.5000 -64.0 + 66.5000 137.2500 -64.0 + 64.5000 137.2500 -64.0 + 64.2500 138.5000 -64.0 + 65.5000 137.7500 -64.0 + 70.5000 137.7500 -64.0 + 75.5000 135.7500 -64.0 + 78.7500 131.5000 -64.0 + 77.7500 129.5000 -64.0 + 77.7500 127.5000 -64.0 + 81.5000 125.7500 -64.0 + 83.2500 126.5000 -64.0 + 86.2500 131.5000 -64.0 + 92.7500 131.5000 -64.0 + 88.5000 130.2500 -64.0 + 84.7500 126.5000 -64.0 + 86.7500 122.5000 -64.0 + 82.5000 124.2500 -64.0 + 81.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 121.5000 -64.0 + 120.2500 122.5000 -64.0 + 126.2500 128.5000 -64.0 + 127.2500 130.5000 -64.0 + 125.5000 132.2500 -64.0 + 119.5000 132.2500 -64.0 + 120.5000 133.7500 -64.0 + 125.5000 134.7500 -64.0 + 129.5000 132.7500 -64.0 + 129.7500 128.5000 -64.0 + 128.7500 126.5000 -64.0 + 126.5000 126.2500 -64.0 + 124.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 139.2500 121.5000 -64.0 + 141.2500 123.5000 -64.0 + 142.2500 130.5000 -64.0 + 144.5000 130.7500 -64.0 + 148.2500 132.5000 -64.0 + 147.2500 135.5000 -64.0 + 149.2500 136.5000 -64.0 + 148.5000 137.2500 -64.0 + 145.5000 137.2500 -64.0 + 142.5000 136.2500 -64.0 + 141.5000 134.2500 -64.0 + 138.2500 139.5000 -64.0 + 142.5000 136.7500 -64.0 + 146.2500 139.5000 -64.0 + 145.5000 140.2500 -64.0 + 142.5000 139.2500 -64.0 + 142.2500 140.5000 -64.0 + 144.5000 140.7500 -64.0 + 149.2500 144.5000 -64.0 + 152.5000 144.7500 -64.0 + 155.2500 147.5000 -64.0 + 162.2500 157.5000 -64.0 + 162.2500 163.5000 -64.0 + 160.5000 164.2500 -64.0 + 157.2500 163.5000 -64.0 + 156.2500 170.5000 -64.0 + 157.2500 172.5000 -64.0 + 154.2500 179.5000 -64.0 + 147.2500 188.5000 -64.0 + 144.2500 195.5000 -64.0 + 141.5000 199.2500 -64.0 + 124.5000 211.2500 -64.0 + 122.5000 211.2500 -64.0 + 118.5000 214.2500 -64.0 + 115.5000 214.2500 -64.0 + 109.7500 209.5000 -64.0 + 108.5000 210.2500 -64.0 + 105.5000 210.2500 -64.0 + 103.7500 208.5000 -64.0 + 103.7500 205.5000 -64.0 + 100.2500 205.5000 -64.0 + 98.2500 209.5000 -64.0 + 94.5000 213.2500 -64.0 + 87.5000 213.2500 -64.0 + 85.5000 214.2500 -64.0 + 79.5000 212.2500 -64.0 + 72.5000 207.2500 -64.0 + 71.5000 205.2500 -64.0 + 63.7500 199.5000 -64.0 + 61.7500 195.5000 -64.0 + 61.7500 192.5000 -64.0 + 60.7500 189.5000 -64.0 + 56.7500 184.5000 -64.0 + 48.7500 169.5000 -64.0 + 48.7500 166.5000 -64.0 + 47.7500 164.5000 -64.0 + 47.7500 155.5000 -64.0 + 51.5000 150.7500 -64.0 + 56.7500 146.5000 -64.0 + 59.5000 142.7500 -64.0 + 63.5000 139.7500 -64.0 + 62.5000 139.2500 -64.0 + 51.5000 146.2500 -64.0 + 49.5000 146.2500 -64.0 + 45.2500 157.5000 -64.0 + 43.5000 158.2500 -64.0 + 41.7500 157.5000 -64.0 + 40.7500 149.5000 -64.0 + 38.7500 148.5000 -64.0 + 38.7500 144.5000 -64.0 + 37.7500 141.5000 -64.0 + 42.5000 135.7500 -64.0 + 45.5000 137.7500 -64.0 + 46.5000 135.7500 -64.0 + 45.7500 133.5000 -64.0 + 46.5000 131.7500 -64.0 + 50.2500 132.5000 -64.0 + 52.7500 131.5000 -64.0 + 44.7500 129.5000 -64.0 + 42.5000 130.2500 -64.0 + 39.2500 134.5000 -64.0 + 37.2500 138.5000 -64.0 + 35.5000 146.2500 -64.0 + 35.2500 155.5000 -64.0 + 37.2500 161.5000 -64.0 + 37.2500 168.5000 -64.0 + 39.2500 172.5000 -64.0 + 39.2500 174.5000 -64.0 + 42.2500 180.5000 -64.0 + 59.2500 205.5000 -64.0 + 66.5000 212.7500 -64.0 + 74.5000 218.7500 -64.0 + 80.5000 221.7500 -64.0 + 90.5000 223.7500 -64.0 + 92.5000 222.7500 -64.0 + 97.5000 223.7500 -64.0 + 99.5000 222.7500 -64.0 + 100.2500 223.5000 -64.0 + 102.5000 223.7500 -64.0 + 104.5000 222.7500 -64.0 + 118.5000 222.7500 -64.0 + 127.5000 219.7500 -64.0 + 135.5000 214.7500 -64.0 + 140.5000 209.7500 -64.0 + 142.5000 208.7500 -64.0 + 161.5000 185.7500 -64.0 + 161.7500 183.5000 -64.0 + 166.7500 175.5000 -64.0 + 170.5000 167.7500 -64.0 + 172.5000 158.7500 -64.0 + 172.7500 146.5000 -64.0 + 171.7500 144.5000 -64.0 + 171.7500 142.5000 -64.0 + 168.7500 136.5000 -64.0 + 164.5000 133.2500 -64.0 + 162.5000 134.2500 -64.0 + 158.5000 133.2500 -64.0 + 155.7500 130.5000 -64.0 + 155.7500 127.5000 -64.0 + 160.5000 122.7500 -64.0 + 159.5000 122.2500 -64.0 + 157.5000 124.2500 -64.0 + 154.5000 124.2500 -64.0 + 151.5000 125.2500 -64.0 + 143.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 153.7500 134.5000 -64.0 + 154.5000 133.7500 -64.0 + 156.2500 134.5000 -64.0 + 161.5000 134.7500 -64.0 + 162.2500 136.5000 -64.0 + 164.2500 137.5000 -64.0 + 165.2500 139.5000 -64.0 + 167.5000 139.7500 -64.0 + 169.2500 140.5000 -64.0 + 169.2500 143.5000 -64.0 + 170.2500 145.5000 -64.0 + 168.5000 148.2500 -64.0 + 170.2500 153.5000 -64.0 + 169.5000 155.2500 -64.0 + 169.2500 158.5000 -64.0 + 167.5000 160.2500 -64.0 + 165.7500 159.5000 -64.0 + 163.7500 155.5000 -64.0 + 164.5000 153.7500 -64.0 + 163.5000 153.2500 -64.0 + 159.7500 151.5000 -64.0 + 156.7500 146.5000 -64.0 + 156.7500 144.5000 -64.0 + 155.5000 144.2500 -64.0 + 152.5000 141.2500 -64.0 + 150.5000 140.2500 -64.0 + 148.7500 139.5000 -64.0 + 149.5000 138.7500 -64.0 + 151.5000 137.7500 -64.0 +} -64.0 +v 408 z -130.000000 -64.0 +{ -64.0 + 104.2500 39.5000 -64.0 + 94.2500 45.5000 -64.0 + 92.2500 49.5000 -64.0 + 93.5000 49.7500 -64.0 + 93.7500 48.5000 -64.0 + 95.7500 47.5000 -64.0 + 96.7500 45.5000 -64.0 + 101.5000 42.7500 -64.0 + 102.2500 43.5000 -64.0 + 97.5000 48.2500 -64.0 + 97.5000 49.7500 -64.0 + 102.5000 45.7500 -64.0 + 102.7500 43.5000 -64.0 + 106.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 40.5000 -64.0 + 107.2500 41.5000 -64.0 + 108.5000 41.7500 -64.0 +} -64.0 +{ -64.0 + 115.2500 40.5000 -64.0 + 115.5000 41.7500 -64.0 + 119.5000 43.7500 -64.0 + 127.2500 52.5000 -64.0 + 127.7500 51.5000 -64.0 + 124.7500 45.5000 -64.0 + 116.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 42.5000 -64.0 + 109.2500 44.5000 -64.0 + 110.5000 44.7500 -64.0 + 112.5000 43.7500 -64.0 + 110.7500 42.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 44.5000 -64.0 + 117.2500 47.5000 -64.0 + 122.2500 50.5000 -64.0 + 122.7500 49.5000 -64.0 + 115.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 49.5000 -64.0 + 108.5000 52.2500 -64.0 + 108.5000 69.7500 -64.0 + 111.5000 57.7500 -64.0 + 111.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 67.2500 56.5000 -64.0 + 63.5000 59.2500 -64.0 + 65.2500 60.5000 -64.0 + 71.5000 61.7500 -64.0 + 74.5000 64.7500 -64.0 + 74.7500 58.5000 -64.0 + 78.7500 56.5000 -64.0 + 75.5000 56.2500 -64.0 + 72.5000 57.2500 -64.0 + 70.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 138.2500 59.5000 -64.0 + 139.5000 59.7500 -64.0 + 142.2500 63.5000 -64.0 + 142.2500 65.5000 -64.0 + 143.7500 65.5000 -64.0 + 145.7500 61.5000 -64.0 + 143.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 61.2500 75.5000 -64.0 + 60.2500 77.5000 -64.0 + 59.2500 82.5000 -64.0 + 61.5000 82.7500 -64.0 + 62.5000 80.7500 -64.0 + 62.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 79.5000 -64.0 + 151.2500 83.5000 -64.0 + 152.2500 85.5000 -64.0 + 152.2500 87.5000 -64.0 + 155.5000 89.7500 -64.0 + 155.7500 86.5000 -64.0 + 154.7500 84.5000 -64.0 + 154.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 80.5000 -64.0 + 125.2500 82.5000 -64.0 + 126.2500 84.5000 -64.0 + 126.2500 86.5000 -64.0 + 131.5000 85.7500 -64.0 + 132.5000 84.2500 -64.0 + 127.5000 83.2500 -64.0 +} -64.0 +{ -64.0 + 86.2500 82.5000 -64.0 + 86.2500 84.5000 -64.0 + 87.5000 85.7500 -64.0 + 89.5000 84.7500 -64.0 + 91.2500 85.5000 -64.0 + 92.2500 87.5000 -64.0 + 93.5000 87.7500 -64.0 + 93.7500 85.5000 -64.0 + 92.7500 83.5000 -64.0 + 90.5000 84.2500 -64.0 + 89.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 123.2500 86.5000 -64.0 + 123.2500 89.5000 -64.0 + 124.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 45.2500 107.5000 -64.0 + 44.5000 108.2500 -64.0 + 44.2500 110.5000 -64.0 + 45.5000 110.7500 -64.0 + 45.7500 109.5000 -64.0 + 47.5000 108.7500 -64.0 + 49.2500 110.5000 -64.0 + 51.5000 110.7500 -64.0 + 57.5000 115.7500 -64.0 + 59.5000 116.7500 -64.0 + 59.5000 115.2500 -64.0 + 55.5000 113.2500 -64.0 + 49.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 159.2500 109.5000 -64.0 + 152.5000 115.2500 -64.0 + 152.2500 118.5000 -64.0 + 154.2500 119.5000 -64.0 + 157.5000 119.7500 -64.0 + 161.5000 117.7500 -64.0 + 162.7500 113.5000 -64.0 + 160.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 110.5000 -64.0 + 68.5000 112.2500 -64.0 + 69.2500 114.5000 -64.0 + 71.2500 115.5000 -64.0 + 62.5000 121.2500 -64.0 + 54.5000 121.2500 -64.0 + 52.7500 119.5000 -64.0 + 49.5000 119.2500 -64.0 + 49.2500 120.5000 -64.0 + 60.2500 125.5000 -64.0 + 57.2500 127.5000 -64.0 + 56.2500 129.5000 -64.0 + 58.5000 132.7500 -64.0 + 60.5000 133.7500 -64.0 + 61.2500 135.5000 -64.0 + 63.5000 135.7500 -64.0 + 63.7500 134.5000 -64.0 + 62.7500 132.5000 -64.0 + 65.5000 130.7500 -64.0 + 63.7500 129.5000 -64.0 + 63.7500 127.5000 -64.0 + 65.5000 125.7500 -64.0 + 68.2500 130.5000 -64.0 + 67.5000 131.2500 -64.0 + 68.2500 132.5000 -64.0 + 67.5000 134.2500 -64.0 + 69.5000 137.7500 -64.0 + 77.7500 134.5000 -64.0 + 78.7500 132.5000 -64.0 + 77.7500 130.5000 -64.0 + 77.7500 125.5000 -64.0 + 76.7500 123.5000 -64.0 + 73.5000 123.2500 -64.0 + 71.7500 121.5000 -64.0 + 71.7500 119.5000 -64.0 + 75.7500 116.5000 -64.0 + 76.7500 114.5000 -64.0 + 74.7500 112.5000 -64.0 + 75.5000 111.7500 -64.0 + 74.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 104.2500 113.5000 -64.0 + 98.5000 116.2500 -64.0 + 95.5000 116.2500 -64.0 + 93.2500 118.5000 -64.0 + 97.5000 118.7500 -64.0 + 99.5000 117.7500 -64.0 + 102.5000 117.7500 -64.0 + 105.5000 114.7500 -64.0 + 114.2500 119.5000 -64.0 + 116.5000 119.7500 -64.0 + 115.7500 118.5000 -64.0 + 107.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 120.5000 -64.0 + 87.5000 122.2500 -64.0 + 83.5000 124.2500 -64.0 + 83.2500 130.5000 -64.0 + 86.2500 132.5000 -64.0 + 92.7500 132.5000 -64.0 + 93.7500 130.5000 -64.0 + 92.5000 131.2500 -64.0 + 87.5000 131.2500 -64.0 + 84.7500 128.5000 -64.0 + 84.7500 126.5000 -64.0 + 89.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 120.5000 -64.0 + 98.5000 121.2500 -64.0 + 94.5000 126.2500 -64.0 + 94.2500 129.5000 -64.0 + 95.5000 127.7500 -64.0 + 95.7500 125.5000 -64.0 + 97.5000 123.7500 -64.0 + 103.5000 120.7500 -64.0 +} -64.0 +{ -64.0 + 108.2500 120.5000 -64.0 + 115.5000 123.7500 -64.0 + 117.2500 126.5000 -64.0 + 119.5000 132.7500 -64.0 + 123.2500 135.5000 -64.0 + 129.5000 135.7500 -64.0 + 130.7500 128.5000 -64.0 + 129.5000 127.2500 -64.0 + 126.5000 128.2500 -64.0 + 126.2500 129.5000 -64.0 + 129.2500 130.5000 -64.0 + 126.5000 133.2500 -64.0 + 121.5000 132.2500 -64.0 + 118.7500 129.5000 -64.0 + 118.7500 127.5000 -64.0 + 116.7500 122.5000 -64.0 + 112.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 120.5000 -64.0 + 117.5000 121.7500 -64.0 + 123.2500 125.5000 -64.0 + 123.2500 127.5000 -64.0 + 124.7500 127.5000 -64.0 + 123.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 121.5000 -64.0 + 141.2500 122.5000 -64.0 + 144.2500 128.5000 -64.0 + 143.2500 131.5000 -64.0 + 144.5000 130.7500 -64.0 + 146.2500 132.5000 -64.0 + 148.2500 136.5000 -64.0 + 147.2500 138.5000 -64.0 + 148.5000 138.7500 -64.0 + 150.2500 139.5000 -64.0 + 148.5000 141.2500 -64.0 + 145.5000 141.2500 -64.0 + 148.2500 143.5000 -64.0 + 151.5000 143.7500 -64.0 + 155.2500 147.5000 -64.0 + 157.2500 151.5000 -64.0 + 158.7500 150.5000 -64.0 + 156.7500 144.5000 -64.0 + 155.5000 144.2500 -64.0 + 150.7500 138.5000 -64.0 + 151.7500 136.5000 -64.0 + 154.5000 133.7500 -64.0 + 157.5000 133.7500 -64.0 + 160.5000 134.7500 -64.0 + 162.2500 135.5000 -64.0 + 163.2500 137.5000 -64.0 + 164.5000 137.7500 -64.0 + 165.2500 139.5000 -64.0 + 168.2500 141.5000 -64.0 + 168.2500 143.5000 -64.0 + 169.2500 146.5000 -64.0 + 168.5000 148.2500 -64.0 + 170.2500 150.5000 -64.0 + 170.2500 152.5000 -64.0 + 168.5000 154.2500 -64.0 + 169.2500 155.5000 -64.0 + 169.2500 159.5000 -64.0 + 166.5000 162.2500 -64.0 + 164.7500 161.5000 -64.0 + 164.5000 158.2500 -64.0 + 162.5000 157.2500 -64.0 + 160.7500 156.5000 -64.0 + 159.7500 154.5000 -64.0 + 157.5000 154.2500 -64.0 + 157.2500 155.5000 -64.0 + 156.5000 157.2500 -64.0 + 156.2500 171.5000 -64.0 + 154.2500 177.5000 -64.0 + 150.2500 182.5000 -64.0 + 147.5000 186.2500 -64.0 + 144.2500 190.5000 -64.0 + 143.2500 192.5000 -64.0 + 138.2500 197.5000 -64.0 + 134.5000 204.2500 -64.0 + 128.5000 207.2500 -64.0 + 125.5000 207.2500 -64.0 + 119.5000 210.2500 -64.0 + 116.5000 210.2500 -64.0 + 114.7500 209.5000 -64.0 + 113.7500 207.5000 -64.0 + 112.5000 207.2500 -64.0 + 110.5000 208.2500 -64.0 + 106.5000 208.2500 -64.0 + 104.7500 205.5000 -64.0 + 104.7500 202.5000 -64.0 + 102.7500 200.5000 -64.0 + 102.7500 198.5000 -64.0 + 101.5000 198.2500 -64.0 + 99.2500 203.5000 -64.0 + 93.5000 210.2500 -64.0 + 89.5000 210.2500 -64.0 + 85.5000 212.2500 -64.0 + 83.5000 212.2500 -64.0 + 80.5000 211.2500 -64.0 + 70.5000 202.2500 -64.0 + 66.5000 200.2500 -64.0 + 63.7500 196.5000 -64.0 + 63.7500 193.5000 -64.0 + 61.7500 187.5000 -64.0 + 57.7500 183.5000 -64.0 + 51.7500 172.5000 -64.0 + 48.7500 167.5000 -64.0 + 48.7500 165.5000 -64.0 + 47.7500 163.5000 -64.0 + 47.7500 161.5000 -64.0 + 46.7500 159.5000 -64.0 + 46.7500 157.5000 -64.0 + 50.7500 148.5000 -64.0 + 53.5000 146.7500 -64.0 + 57.5000 144.7500 -64.0 + 61.7500 140.5000 -64.0 + 59.5000 140.2500 -64.0 + 55.5000 143.2500 -64.0 + 53.5000 143.2500 -64.0 + 50.2500 145.5000 -64.0 + 49.2500 147.5000 -64.0 + 48.5000 149.2500 -64.0 + 46.2500 149.5000 -64.0 + 47.2500 151.5000 -64.0 + 45.2500 155.5000 -64.0 + 44.5000 157.2500 -64.0 + 42.7500 156.5000 -64.0 + 42.7500 154.5000 -64.0 + 44.5000 153.7500 -64.0 + 44.5000 152.2500 -64.0 + 42.5000 153.2500 -64.0 + 40.5000 152.2500 -64.0 + 38.7500 147.5000 -64.0 + 39.7500 144.5000 -64.0 + 37.7500 142.5000 -64.0 + 39.7500 139.5000 -64.0 + 40.7500 137.5000 -64.0 + 47.5000 134.7500 -64.0 + 46.7500 132.5000 -64.0 + 48.5000 131.7500 -64.0 + 50.5000 132.7500 -64.0 + 53.5000 131.7500 -64.0 + 53.5000 130.2500 -64.0 + 51.5000 131.2500 -64.0 + 49.5000 131.2500 -64.0 + 46.5000 130.2500 -64.0 + 44.7500 129.5000 -64.0 + 43.5000 130.2500 -64.0 + 40.2500 134.5000 -64.0 + 38.2500 138.5000 -64.0 + 37.5000 140.2500 -64.0 + 37.2500 143.5000 -64.0 + 36.5000 145.2500 -64.0 + 36.2500 155.5000 -64.0 + 37.2500 157.5000 -64.0 + 37.2500 165.5000 -64.0 + 40.2500 171.5000 -64.0 + 40.2500 173.5000 -64.0 + 47.2500 187.5000 -64.0 + 53.2500 194.5000 -64.0 + 54.2500 196.5000 -64.0 + 61.2500 204.5000 -64.0 + 62.2500 206.5000 -64.0 + 70.2500 213.5000 -64.0 + 74.5000 216.7500 -64.0 + 82.5000 220.7500 -64.0 + 84.2500 221.5000 -64.0 + 116.5000 221.7500 -64.0 + 118.5000 220.7500 -64.0 + 121.5000 220.7500 -64.0 + 129.5000 216.7500 -64.0 + 133.5000 213.7500 -64.0 + 135.5000 212.7500 -64.0 + 140.5000 207.7500 -64.0 + 142.7500 206.5000 -64.0 + 143.7500 204.5000 -64.0 + 149.7500 198.5000 -64.0 + 158.7500 188.5000 -64.0 + 169.7500 166.5000 -64.0 + 170.5000 164.7500 -64.0 + 170.7500 161.5000 -64.0 + 171.5000 159.7500 -64.0 + 171.7500 145.5000 -64.0 + 169.7500 141.5000 -64.0 + 169.7500 139.5000 -64.0 + 164.7500 133.5000 -64.0 + 160.5000 133.2500 -64.0 + 158.7500 131.5000 -64.0 + 157.7500 129.5000 -64.0 + 158.7500 124.5000 -64.0 + 157.5000 123.2500 -64.0 + 153.5000 125.2500 -64.0 + 151.5000 125.2500 -64.0 + 148.5000 124.2500 -64.0 + 145.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 134.5000 -64.0 + 138.5000 136.2500 -64.0 + 138.2500 138.5000 -64.0 + 139.2500 140.5000 -64.0 + 143.7500 140.5000 -64.0 + 140.5000 140.2500 -64.0 + 139.7500 138.5000 -64.0 + 140.7500 135.5000 -64.0 +} -64.0 +{ -64.0 + 63.2500 138.5000 -64.0 + 62.2500 139.5000 -64.0 + 63.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 155.7500 115.5000 -64.0 + 157.5000 114.7500 -64.0 + 159.2500 115.5000 -64.0 + 158.5000 117.2500 -64.0 + 156.5000 118.2500 -64.0 + 154.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 66.7500 121.5000 -64.0 + 68.5000 120.7500 -64.0 + 70.2500 121.5000 -64.0 + 69.5000 123.2500 -64.0 + 67.5000 124.2500 -64.0 + 65.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 68.7500 130.5000 -64.0 + 69.5000 129.7500 -64.0 + 71.5000 129.7500 -64.0 + 73.2500 130.5000 -64.0 + 74.2500 132.5000 -64.0 + 72.5000 134.2500 -64.0 + 70.5000 134.2500 -64.0 + 68.7500 132.5000 -64.0 +} -64.0 +v 390 z -132.000000 -64.0 +{ -64.0 + 105.2500 38.5000 -64.0 + 101.5000 41.2500 -64.0 + 95.2500 43.5000 -64.0 + 92.2500 49.5000 -64.0 + 97.5000 44.7500 -64.0 + 106.7500 38.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 39.5000 -64.0 + 115.2500 40.5000 -64.0 + 118.5000 42.7500 -64.0 + 120.5000 43.7500 -64.0 + 125.2500 49.5000 -64.0 + 126.2500 51.5000 -64.0 + 128.2500 52.5000 -64.0 + 128.7500 51.5000 -64.0 + 125.7500 47.5000 -64.0 + 125.7500 45.5000 -64.0 + 124.5000 44.2500 -64.0 + 118.5000 41.2500 -64.0 +} -64.0 +{ -64.0 + 105.2500 43.5000 -64.0 + 103.5000 45.2500 -64.0 + 103.2500 47.5000 -64.0 + 101.5000 49.2500 -64.0 + 100.7500 48.5000 -64.0 + 95.5000 50.2500 -64.0 + 95.2500 53.5000 -64.0 + 96.5000 54.7500 -64.0 + 102.5000 50.7500 -64.0 + 104.2500 51.5000 -64.0 + 103.2500 54.5000 -64.0 + 106.2500 58.5000 -64.0 + 106.2500 64.5000 -64.0 + 108.2500 68.5000 -64.0 + 108.2500 73.5000 -64.0 + 109.5000 72.7500 -64.0 + 109.7500 70.5000 -64.0 + 117.5000 56.7500 -64.0 + 120.5000 56.7500 -64.0 + 124.2500 62.5000 -64.0 + 125.5000 62.7500 -64.0 + 125.7500 58.5000 -64.0 + 120.5000 51.2500 -64.0 + 116.7500 49.5000 -64.0 + 116.7500 47.5000 -64.0 + 112.7500 43.5000 -64.0 + 110.5000 43.2500 -64.0 + 108.5000 44.2500 -64.0 + 107.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 79.2500 56.5000 -64.0 + 78.5000 57.2500 -64.0 + 75.5000 57.2500 -64.0 + 73.5000 59.2500 -64.0 + 75.5000 61.7500 -64.0 + 77.5000 62.7500 -64.0 + 77.7500 59.5000 -64.0 + 80.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 135.2500 58.5000 -64.0 + 138.2500 60.5000 -64.0 + 140.2500 64.5000 -64.0 + 141.5000 63.7500 -64.0 + 141.7500 61.5000 -64.0 + 136.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 60.2500 76.5000 -64.0 + 60.2500 77.5000 -64.0 + 59.2500 84.5000 -64.0 + 60.5000 84.7500 -64.0 + 62.7500 81.5000 -64.0 + 63.7500 79.5000 -64.0 + 62.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 77.5000 -64.0 + 90.2500 78.5000 -64.0 + 87.5000 81.2500 -64.0 + 84.5000 81.2500 -64.0 + 86.2500 83.5000 -64.0 + 87.5000 82.7500 -64.0 + 88.2500 84.5000 -64.0 + 90.5000 84.7500 -64.0 + 92.5000 86.7500 -64.0 + 92.5000 84.2500 -64.0 + 90.5000 83.2500 -64.0 + 89.7500 81.5000 -64.0 + 91.5000 79.7500 -64.0 +} -64.0 +{ -64.0 + 126.2500 80.5000 -64.0 + 126.2500 83.5000 -64.0 + 127.2500 86.5000 -64.0 + 129.5000 84.7500 -64.0 + 132.5000 84.7500 -64.0 + 133.7500 83.5000 -64.0 + 129.7500 82.5000 -64.0 + 128.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 152.2500 80.5000 -64.0 + 151.5000 81.2500 -64.0 + 151.2500 86.5000 -64.0 + 152.2500 89.5000 -64.0 + 155.5000 92.7500 -64.0 + 155.7500 88.5000 -64.0 + 154.7500 86.5000 -64.0 + 154.7500 83.5000 -64.0 + 153.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 85.5000 -64.0 + 123.5000 86.2500 -64.0 + 123.2500 88.5000 -64.0 + 125.5000 86.7500 -64.0 +} -64.0 +{ -64.0 + 48.2500 106.5000 -64.0 + 46.5000 107.2500 -64.0 + 46.2500 111.5000 -64.0 + 48.5000 114.7500 -64.0 + 50.5000 115.7500 -64.0 + 48.7500 112.5000 -64.0 + 49.5000 110.7500 -64.0 + 51.5000 110.7500 -64.0 + 54.5000 113.7500 -64.0 + 56.5000 114.7500 -64.0 + 57.2500 116.5000 -64.0 + 58.7500 116.5000 -64.0 + 57.7500 113.5000 -64.0 + 53.5000 111.2500 -64.0 + 50.7500 106.5000 -64.0 +} -64.0 +{ -64.0 + 157.2500 107.5000 -64.0 + 156.2500 110.5000 -64.0 + 153.5000 113.2500 -64.0 + 153.2500 116.5000 -64.0 + 154.2500 118.5000 -64.0 + 158.7500 118.5000 -64.0 + 161.5000 114.7500 -64.0 + 160.7500 113.5000 -64.0 + 160.7500 109.5000 -64.0 + 158.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 74.2500 110.5000 -64.0 + 72.2500 111.5000 -64.0 + 71.2500 113.5000 -64.0 + 73.2500 114.5000 -64.0 + 71.5000 116.2500 -64.0 + 60.5000 122.2500 -64.0 + 57.5000 122.2500 -64.0 + 51.5000 119.2500 -64.0 + 51.2500 121.5000 -64.0 + 54.2500 124.5000 -64.0 + 55.2500 126.5000 -64.0 + 52.5000 129.2500 -64.0 + 48.5000 131.2500 -64.0 + 44.7500 129.5000 -64.0 + 42.2500 132.5000 -64.0 + 38.5000 139.2500 -64.0 + 37.5000 144.2500 -64.0 + 37.2500 156.5000 -64.0 + 38.2500 158.5000 -64.0 + 38.2500 163.5000 -64.0 + 41.2500 169.5000 -64.0 + 41.2500 172.5000 -64.0 + 49.2500 188.5000 -64.0 + 56.2500 195.5000 -64.0 + 57.2500 197.5000 -64.0 + 64.2500 205.5000 -64.0 + 77.5000 216.7500 -64.0 + 83.2500 219.5000 -64.0 + 92.5000 219.7500 -64.0 + 94.2500 220.5000 -64.0 + 108.5000 220.7500 -64.0 + 110.5000 219.7500 -64.0 + 118.5000 219.7500 -64.0 + 127.5000 216.7500 -64.0 + 135.5000 210.7500 -64.0 + 156.5000 189.7500 -64.0 + 160.7500 183.5000 -64.0 + 168.7500 167.5000 -64.0 + 171.7500 151.5000 -64.0 + 170.7500 149.5000 -64.0 + 170.5000 144.2500 -64.0 + 167.7500 137.5000 -64.0 + 159.7500 130.5000 -64.0 + 159.7500 127.5000 -64.0 + 157.5000 123.2500 -64.0 + 153.5000 125.2500 -64.0 + 150.5000 125.2500 -64.0 + 147.5000 122.2500 -64.0 + 143.5000 120.2500 -64.0 + 143.5000 125.7500 -64.0 + 147.2500 128.5000 -64.0 + 147.2500 130.5000 -64.0 + 148.5000 130.7500 -64.0 + 149.2500 132.5000 -64.0 + 147.5000 133.2500 -64.0 + 145.7500 129.5000 -64.0 + 142.5000 131.2500 -64.0 + 145.2500 132.5000 -64.0 + 149.2500 138.5000 -64.0 + 150.5000 138.7500 -64.0 + 150.7500 137.5000 -64.0 + 155.5000 132.7500 -64.0 + 156.2500 133.5000 -64.0 + 160.5000 133.7500 -64.0 + 166.2500 140.5000 -64.0 + 168.2500 146.5000 -64.0 + 167.5000 148.2500 -64.0 + 169.2500 150.5000 -64.0 + 168.5000 152.2500 -64.0 + 166.5000 152.2500 -64.0 + 169.2500 156.5000 -64.0 + 169.2500 158.5000 -64.0 + 167.5000 162.2500 -64.0 + 165.5000 163.2500 -64.0 + 163.7500 161.5000 -64.0 + 163.7500 159.5000 -64.0 + 159.7500 158.5000 -64.0 + 159.7500 155.5000 -64.0 + 157.5000 155.2500 -64.0 + 155.5000 152.2500 -64.0 + 155.2500 157.5000 -64.0 + 156.2500 159.5000 -64.0 + 156.2500 169.5000 -64.0 + 153.2500 177.5000 -64.0 + 147.5000 183.2500 -64.0 + 143.2500 189.5000 -64.0 + 135.5000 198.2500 -64.0 + 135.2500 201.5000 -64.0 + 131.5000 204.2500 -64.0 + 126.5000 203.2500 -64.0 + 123.5000 206.2500 -64.0 + 120.5000 206.2500 -64.0 + 116.7500 204.5000 -64.0 + 114.5000 204.2500 -64.0 + 110.5000 206.2500 -64.0 + 107.7500 204.5000 -64.0 + 107.7500 200.5000 -64.0 + 106.5000 197.2500 -64.0 + 104.5000 196.2500 -64.0 + 103.7500 194.5000 -64.0 + 101.2500 194.5000 -64.0 + 96.5000 202.2500 -64.0 + 94.5000 203.2500 -64.0 + 94.2500 204.5000 -64.0 + 91.5000 206.2500 -64.0 + 89.5000 206.2500 -64.0 + 85.5000 210.2500 -64.0 + 81.5000 210.2500 -64.0 + 73.7500 203.5000 -64.0 + 72.7500 201.5000 -64.0 + 67.7500 198.5000 -64.0 + 64.7500 194.5000 -64.0 + 64.7500 190.5000 -64.0 + 61.7500 184.5000 -64.0 + 57.7500 180.5000 -64.0 + 52.7500 170.5000 -64.0 + 49.7500 166.5000 -64.0 + 49.7500 164.5000 -64.0 + 47.7500 158.5000 -64.0 + 47.7500 154.5000 -64.0 + 49.7500 149.5000 -64.0 + 54.5000 144.7500 -64.0 + 64.7500 139.5000 -64.0 + 62.5000 139.2500 -64.0 + 58.5000 141.2500 -64.0 + 56.5000 141.2500 -64.0 + 51.5000 143.2500 -64.0 + 47.5000 148.2500 -64.0 + 45.5000 149.2500 -64.0 + 44.5000 152.2500 -64.0 + 42.5000 153.2500 -64.0 + 40.7500 151.5000 -64.0 + 40.7500 148.5000 -64.0 + 38.7500 147.5000 -64.0 + 40.5000 145.7500 -64.0 + 41.5000 146.7500 -64.0 + 42.7500 136.5000 -64.0 + 44.5000 135.7500 -64.0 + 48.5000 131.7500 -64.0 + 49.5000 132.7500 -64.0 + 52.5000 131.7500 -64.0 + 61.5000 132.7500 -64.0 + 61.7500 130.5000 -64.0 + 65.5000 127.7500 -64.0 + 67.2500 128.5000 -64.0 + 66.5000 129.2500 -64.0 + 68.2500 131.5000 -64.0 + 68.2500 133.5000 -64.0 + 70.2500 137.5000 -64.0 + 71.7500 137.5000 -64.0 + 72.7500 135.5000 -64.0 + 68.7500 132.5000 -64.0 + 67.7500 127.5000 -64.0 + 70.5000 124.7500 -64.0 + 75.7500 126.5000 -64.0 + 74.7500 124.5000 -64.0 + 74.7500 122.5000 -64.0 + 72.7500 120.5000 -64.0 + 72.7500 118.5000 -64.0 + 75.5000 115.7500 -64.0 + 75.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 105.2500 114.5000 -64.0 + 99.5000 118.2500 -64.0 + 97.2500 118.5000 -64.0 + 90.5000 121.2500 -64.0 + 86.5000 125.2500 -64.0 + 84.5000 124.2500 -64.0 + 82.5000 125.2500 -64.0 + 82.5000 130.7500 -64.0 + 86.2500 133.5000 -64.0 + 91.5000 133.7500 -64.0 + 97.5000 124.7500 -64.0 + 101.5000 121.7500 -64.0 + 103.7500 121.5000 -64.0 + 99.5000 121.2500 -64.0 + 96.2500 123.5000 -64.0 + 91.5000 131.2500 -64.0 + 85.5000 131.2500 -64.0 + 83.7500 127.5000 -64.0 + 87.5000 125.7500 -64.0 + 90.5000 122.7500 -64.0 + 100.5000 118.7500 -64.0 + 106.5000 117.7500 -64.0 + 111.2500 119.5000 -64.0 + 110.2500 121.5000 -64.0 + 113.5000 122.7500 -64.0 + 116.2500 125.5000 -64.0 + 120.2500 133.5000 -64.0 + 125.2500 136.5000 -64.0 + 129.5000 136.7500 -64.0 + 129.7500 134.5000 -64.0 + 131.7500 130.5000 -64.0 + 130.7500 128.5000 -64.0 + 128.2500 130.5000 -64.0 + 125.5000 134.2500 -64.0 + 122.7500 128.5000 -64.0 + 123.7500 125.5000 -64.0 + 122.7500 123.5000 -64.0 + 119.5000 123.2500 -64.0 + 107.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 139.2500 133.5000 -64.0 + 137.5000 134.2500 -64.0 + 138.2500 140.5000 -64.0 + 142.5000 141.7500 -64.0 + 139.7500 137.5000 -64.0 + 139.7500 135.5000 -64.0 + 140.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 139.5000 -64.0 + 151.5000 141.2500 -64.0 + 147.5000 141.2500 -64.0 + 153.2500 145.5000 -64.0 + 156.2500 151.5000 -64.0 + 157.7500 150.5000 -64.0 + 156.7500 148.5000 -64.0 + 157.5000 147.7500 -64.0 + 157.7500 145.5000 -64.0 + 154.7500 144.5000 -64.0 + 155.5000 143.7500 -64.0 + 153.7500 141.5000 -64.0 + 154.5000 140.7500 -64.0 +} -64.0 +{ -64.0 + 111.5000 43.7500 -64.0 + 112.2500 44.5000 -64.0 + 111.5000 46.2500 -64.0 + 109.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 110.7500 49.5000 -64.0 + 112.5000 48.7500 -64.0 + 114.2500 51.5000 -64.0 + 114.2500 54.5000 -64.0 + 111.5000 58.2500 -64.0 + 110.7500 57.5000 -64.0 + 110.7500 54.5000 -64.0 + 109.5000 54.2500 -64.0 + 107.7500 52.5000 -64.0 + 110.5000 50.7500 -64.0 +} -64.0 +{ -64.0 + 107.7500 55.5000 -64.0 + 108.5000 54.7500 -64.0 + 110.2500 56.5000 -64.0 + 108.5000 58.2500 -64.0 + 107.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 156.7500 114.5000 -64.0 + 157.5000 113.7500 -64.0 + 158.2500 115.5000 -64.0 + 156.5000 117.2500 -64.0 + 154.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 66.7500 122.5000 -64.0 + 67.5000 121.7500 -64.0 + 68.2500 122.5000 -64.0 + 67.5000 123.2500 -64.0 +} -64.0 +{ -64.0 + 63.7500 123.5000 -64.0 + 64.5000 122.7500 -64.0 + 65.2500 123.5000 -64.0 + 64.5000 125.2500 -64.0 +} -64.0 +{ -64.0 + 117.7500 124.5000 -64.0 + 118.5000 123.7500 -64.0 + 120.5000 123.7500 -64.0 + 122.2500 124.5000 -64.0 + 122.2500 127.5000 -64.0 + 120.5000 129.2500 -64.0 + 119.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 54.7500 130.5000 -64.0 + 55.5000 129.7500 -64.0 + 56.2500 130.5000 -64.0 + 55.5000 131.2500 -64.0 +} -64.0 +v 423 z -134.000000 -64.0 +{ -64.0 + 107.2500 36.5000 -64.0 + 105.5000 37.2500 -64.0 + 103.2500 39.5000 -64.0 + 106.5000 39.7500 -64.0 + 106.7500 38.5000 -64.0 + 108.7500 36.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 36.5000 -64.0 + 114.2500 38.5000 -64.0 + 114.2500 40.5000 -64.0 + 121.5000 43.7500 -64.0 + 122.2500 45.5000 -64.0 + 126.5000 49.7500 -64.0 + 128.5000 50.7500 -64.0 + 128.7500 49.5000 -64.0 + 124.7500 43.5000 -64.0 + 119.7500 40.5000 -64.0 + 117.5000 40.2500 -64.0 + 113.7500 36.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 40.5000 -64.0 + 99.5000 41.2500 -64.0 + 95.5000 41.2500 -64.0 + 92.2500 48.5000 -64.0 + 93.5000 48.7500 -64.0 + 94.5000 46.7500 -64.0 + 102.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 43.5000 -64.0 + 107.5000 44.2500 -64.0 + 108.5000 44.7500 -64.0 + 110.5000 43.7500 -64.0 + 112.5000 44.7500 -64.0 + 112.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 48.5000 -64.0 + 110.2500 49.5000 -64.0 + 108.5000 51.2500 -64.0 + 107.7500 50.5000 -64.0 + 105.5000 50.2500 -64.0 + 100.5000 49.2500 -64.0 + 97.5000 50.2500 -64.0 + 97.2500 53.5000 -64.0 + 98.7500 53.5000 -64.0 + 99.7500 51.5000 -64.0 + 101.5000 50.7500 -64.0 + 103.2500 51.5000 -64.0 + 96.5000 57.2500 -64.0 + 96.2500 63.5000 -64.0 + 99.5000 61.7500 -64.0 + 99.7500 56.5000 -64.0 + 101.5000 55.7500 -64.0 + 103.2500 56.5000 -64.0 + 103.2500 58.5000 -64.0 + 105.2500 60.5000 -64.0 + 104.2500 61.5000 -64.0 + 103.2500 63.5000 -64.0 + 101.5000 64.2500 -64.0 + 101.2500 65.5000 -64.0 + 103.2500 67.5000 -64.0 + 109.5000 79.7500 -64.0 + 109.7500 73.5000 -64.0 + 110.7500 70.5000 -64.0 + 113.5000 68.7500 -64.0 + 114.2500 69.5000 -64.0 + 115.7500 69.5000 -64.0 + 118.5000 65.7500 -64.0 + 118.5000 63.2500 -64.0 + 116.5000 62.2500 -64.0 + 115.7500 60.5000 -64.0 + 116.5000 58.7500 -64.0 + 116.7500 54.5000 -64.0 + 118.5000 52.7500 -64.0 + 122.2500 54.5000 -64.0 + 122.2500 56.5000 -64.0 + 125.2500 59.5000 -64.0 + 125.2500 61.5000 -64.0 + 126.5000 60.7500 -64.0 + 126.7500 58.5000 -64.0 + 125.5000 57.2500 -64.0 + 123.7500 52.5000 -64.0 + 119.5000 49.2500 -64.0 + 114.5000 51.2500 -64.0 +} -64.0 +{ -64.0 + 79.2500 57.5000 -64.0 + 78.5000 58.2500 -64.0 + 78.2500 61.5000 -64.0 + 79.5000 61.7500 -64.0 + 81.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 57.5000 -64.0 + 134.2500 58.5000 -64.0 + 138.2500 62.5000 -64.0 + 138.5000 68.7500 -64.0 + 138.7500 60.5000 -64.0 + 135.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 62.5000 -64.0 + 121.5000 63.2500 -64.0 + 121.2500 66.5000 -64.0 + 124.2500 69.5000 -64.0 + 125.5000 68.7500 -64.0 + 125.7500 65.5000 -64.0 + 124.5000 65.2500 -64.0 + 123.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 70.5000 -64.0 + 125.2500 79.5000 -64.0 + 127.2500 81.5000 -64.0 + 127.2500 83.5000 -64.0 + 128.7500 80.5000 -64.0 + 125.7500 74.5000 -64.0 +} -64.0 +{ -64.0 + 61.2500 76.5000 -64.0 + 58.5000 86.2500 -64.0 + 59.2500 87.5000 -64.0 + 60.5000 86.7500 -64.0 + 63.5000 81.7500 -64.0 + 63.7500 78.5000 -64.0 + 62.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 76.5000 -64.0 + 87.5000 80.2500 -64.0 + 84.2500 80.5000 -64.0 + 85.2500 82.5000 -64.0 + 91.5000 78.7500 -64.0 + 91.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 81.5000 -64.0 + 88.5000 83.2500 -64.0 + 92.5000 86.7500 -64.0 + 92.7500 83.5000 -64.0 +} -64.0 +{ -64.0 + 133.2500 81.5000 -64.0 + 131.5000 82.2500 -64.0 + 131.2500 85.5000 -64.0 + 132.5000 85.7500 -64.0 + 134.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 81.5000 -64.0 + 151.2500 82.5000 -64.0 + 150.2500 84.5000 -64.0 + 151.2500 86.5000 -64.0 + 151.2500 89.5000 -64.0 + 154.2500 93.5000 -64.0 + 154.2500 95.5000 -64.0 + 155.5000 94.7500 -64.0 + 155.7500 92.5000 -64.0 + 154.7500 90.5000 -64.0 + 154.7500 87.5000 -64.0 + 153.7500 85.5000 -64.0 + 153.7500 83.5000 -64.0 + 152.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 84.5000 -64.0 + 124.2500 85.5000 -64.0 + 123.2500 88.5000 -64.0 + 124.5000 88.7500 -64.0 + 124.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 52.2500 104.5000 -64.0 + 50.5000 105.2500 -64.0 + 47.2500 110.5000 -64.0 + 48.2500 113.5000 -64.0 + 50.5000 115.7500 -64.0 + 55.5000 116.7500 -64.0 + 57.5000 115.7500 -64.0 + 57.7500 113.5000 -64.0 + 52.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 155.2500 104.5000 -64.0 + 155.2500 108.5000 -64.0 + 153.2500 114.5000 -64.0 + 154.2500 117.5000 -64.0 + 158.7500 117.5000 -64.0 + 160.7500 113.5000 -64.0 + 159.7500 111.5000 -64.0 + 159.7500 108.5000 -64.0 + 156.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 111.5000 -64.0 + 72.2500 112.5000 -64.0 + 73.5000 112.7500 -64.0 + 73.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 73.2500 115.5000 -64.0 + 68.5000 118.2500 -64.0 + 66.5000 118.2500 -64.0 + 60.5000 122.2500 -64.0 + 56.5000 122.2500 -64.0 + 52.5000 120.2500 -64.0 + 52.2500 123.5000 -64.0 + 53.2500 125.5000 -64.0 + 52.2500 127.5000 -64.0 + 48.5000 130.2500 -64.0 + 45.5000 130.2500 -64.0 + 41.5000 134.2500 -64.0 + 39.2500 140.5000 -64.0 + 37.2500 150.5000 -64.0 + 38.2500 152.5000 -64.0 + 38.2500 158.5000 -64.0 + 39.2500 160.5000 -64.0 + 39.2500 163.5000 -64.0 + 43.2500 171.5000 -64.0 + 43.2500 173.5000 -64.0 + 50.2500 187.5000 -64.0 + 69.2500 207.5000 -64.0 + 70.2500 209.5000 -64.0 + 71.5000 209.7500 -64.0 + 77.5000 214.7500 -64.0 + 83.2500 217.5000 -64.0 + 107.5000 218.7500 -64.0 + 109.5000 217.7500 -64.0 + 120.7500 217.5000 -64.0 + 127.5000 214.7500 -64.0 + 134.5000 209.7500 -64.0 + 148.5000 195.7500 -64.0 + 150.5000 194.7500 -64.0 + 158.7500 184.5000 -64.0 + 164.7500 173.5000 -64.0 + 168.7500 163.5000 -64.0 + 170.5000 156.7500 -64.0 + 170.7500 149.5000 -64.0 + 169.7500 147.5000 -64.0 + 169.7500 144.5000 -64.0 + 167.7500 137.5000 -64.0 + 162.7500 132.5000 -64.0 + 159.5000 127.2500 -64.0 + 157.5000 126.2500 -64.0 + 156.7500 124.5000 -64.0 + 155.5000 124.2500 -64.0 + 152.5000 125.2500 -64.0 + 149.5000 124.2500 -64.0 + 145.5000 120.2500 -64.0 + 143.5000 119.2500 -64.0 + 143.2500 120.5000 -64.0 + 145.2500 126.5000 -64.0 + 147.5000 126.7500 -64.0 + 150.2500 131.5000 -64.0 + 148.5000 134.2500 -64.0 + 145.7500 130.5000 -64.0 + 143.5000 130.2500 -64.0 + 139.5000 132.2500 -64.0 + 135.5000 132.2500 -64.0 + 131.7500 128.5000 -64.0 + 129.5000 131.2500 -64.0 + 127.5000 131.2500 -64.0 + 125.5000 133.2500 -64.0 + 122.7500 130.5000 -64.0 + 123.5000 124.2500 -64.0 + 108.7500 117.5000 -64.0 + 104.5000 117.2500 -64.0 + 90.2500 122.5000 -64.0 + 89.2500 124.5000 -64.0 + 90.2500 126.5000 -64.0 + 89.5000 128.2500 -64.0 + 87.5000 129.2500 -64.0 + 88.2500 131.5000 -64.0 + 86.5000 132.2500 -64.0 + 84.7500 131.5000 -64.0 + 83.7500 129.5000 -64.0 + 84.5000 127.7500 -64.0 + 82.7500 125.5000 -64.0 + 81.5000 126.2500 -64.0 + 81.2500 130.5000 -64.0 + 82.2500 133.5000 -64.0 + 84.2500 134.5000 -64.0 + 85.5000 133.7500 -64.0 + 91.5000 133.7500 -64.0 + 95.7500 126.5000 -64.0 + 101.5000 121.7500 -64.0 + 103.5000 121.7500 -64.0 + 108.5000 119.7500 -64.0 + 109.2500 121.5000 -64.0 + 114.5000 123.7500 -64.0 + 117.2500 126.5000 -64.0 + 119.2500 130.5000 -64.0 + 123.2500 135.5000 -64.0 + 128.2500 138.5000 -64.0 + 130.5000 138.7500 -64.0 + 130.7500 136.5000 -64.0 + 127.7500 135.5000 -64.0 + 129.5000 133.7500 -64.0 + 131.5000 133.7500 -64.0 + 133.2500 135.5000 -64.0 + 136.5000 135.7500 -64.0 + 141.2500 140.5000 -64.0 + 147.5000 140.7500 -64.0 + 145.7500 139.5000 -64.0 + 147.5000 137.7500 -64.0 + 152.7500 138.5000 -64.0 + 151.7500 136.5000 -64.0 + 151.7500 134.5000 -64.0 + 153.5000 132.7500 -64.0 + 158.5000 132.7500 -64.0 + 161.5000 133.7500 -64.0 + 165.2500 136.5000 -64.0 + 165.2500 139.5000 -64.0 + 168.2500 143.5000 -64.0 + 166.5000 146.2500 -64.0 + 168.2500 148.5000 -64.0 + 167.5000 152.2500 -64.0 + 164.2500 152.5000 -64.0 + 165.2500 155.5000 -64.0 + 166.5000 154.7500 -64.0 + 168.2500 155.5000 -64.0 + 168.2500 158.5000 -64.0 + 167.2500 161.5000 -64.0 + 165.5000 162.2500 -64.0 + 163.7500 161.5000 -64.0 + 163.7500 159.5000 -64.0 + 162.5000 160.2500 -64.0 + 160.7500 159.5000 -64.0 + 159.7500 157.5000 -64.0 + 157.5000 159.2500 -64.0 + 155.5000 158.2500 -64.0 + 155.2500 171.5000 -64.0 + 151.2500 179.5000 -64.0 + 139.2500 190.5000 -64.0 + 138.2500 192.5000 -64.0 + 131.5000 197.2500 -64.0 + 122.5000 198.2500 -64.0 + 114.5000 202.2500 -64.0 + 112.5000 202.2500 -64.0 + 110.7500 200.5000 -64.0 + 110.7500 196.5000 -64.0 + 107.7500 193.5000 -64.0 + 106.7500 191.5000 -64.0 + 104.5000 190.2500 -64.0 + 100.5000 192.2500 -64.0 + 100.2500 193.5000 -64.0 + 94.5000 197.2500 -64.0 + 92.2500 200.5000 -64.0 + 87.5000 202.2500 -64.0 + 87.2500 203.5000 -64.0 + 84.5000 206.2500 -64.0 + 80.5000 206.2500 -64.0 + 76.7500 203.5000 -64.0 + 72.5000 198.2500 -64.0 + 70.5000 197.2500 -64.0 + 67.7500 193.5000 -64.0 + 67.7500 191.5000 -64.0 + 61.7500 181.5000 -64.0 + 56.7500 176.5000 -64.0 + 51.7500 167.5000 -64.0 + 51.7500 159.5000 -64.0 + 48.7500 153.5000 -64.0 + 50.7500 147.5000 -64.0 + 55.5000 142.7500 -64.0 + 58.5000 142.7500 -64.0 + 66.5000 138.7500 -64.0 + 63.5000 137.2500 -64.0 + 61.5000 138.2500 -64.0 + 58.5000 138.2500 -64.0 + 54.5000 140.2500 -64.0 + 48.2500 147.5000 -64.0 + 47.2500 152.5000 -64.0 + 45.5000 154.2500 -64.0 + 44.7500 152.5000 -64.0 + 42.5000 153.2500 -64.0 + 40.7500 151.5000 -64.0 + 41.7500 146.5000 -64.0 + 40.7500 144.5000 -64.0 + 40.7500 141.5000 -64.0 + 42.7500 139.5000 -64.0 + 44.7500 135.5000 -64.0 + 46.5000 134.7500 -64.0 + 49.5000 131.7500 -64.0 + 55.5000 131.7500 -64.0 + 57.2500 133.5000 -64.0 + 59.5000 131.7500 -64.0 + 61.5000 131.7500 -64.0 + 61.7500 129.5000 -64.0 + 64.5000 126.7500 -64.0 + 66.2500 127.5000 -64.0 + 67.5000 126.7500 -64.0 + 66.7500 124.5000 -64.0 + 67.7500 121.5000 -64.0 + 71.5000 118.7500 -64.0 + 74.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 71.2500 120.5000 -64.0 + 72.2500 122.5000 -64.0 + 74.5000 122.7500 -64.0 + 72.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 130.5000 -64.0 + 69.2500 131.5000 -64.0 + 70.5000 138.7500 -64.0 + 72.5000 135.7500 -64.0 + 72.7500 133.5000 -64.0 + 69.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 148.2500 141.5000 -64.0 + 151.2500 144.5000 -64.0 + 153.2500 148.5000 -64.0 + 154.7500 149.5000 -64.0 + 157.5000 145.7500 -64.0 + 157.5000 144.2500 -64.0 + 155.5000 143.2500 -64.0 + 156.2500 144.5000 -64.0 + 154.5000 145.2500 -64.0 + 150.7500 141.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 152.5000 -64.0 + 153.2500 153.5000 -64.0 + 154.7500 156.5000 -64.0 + 155.7500 154.5000 -64.0 +} -64.0 +{ -64.0 + 151.7500 86.5000 -64.0 + 152.5000 85.7500 -64.0 + 154.2500 87.5000 -64.0 + 153.5000 89.2500 -64.0 +} -64.0 +{ -64.0 + 49.7500 111.5000 -64.0 + 51.5000 110.7500 -64.0 + 54.5000 111.7500 -64.0 + 55.2500 113.5000 -64.0 + 54.5000 115.2500 -64.0 + 52.5000 115.2500 -64.0 +} -64.0 +{ -64.0 + 156.7500 112.5000 -64.0 + 157.5000 111.7500 -64.0 + 158.2500 113.5000 -64.0 + 156.5000 115.2500 -64.0 + 155.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 96.7500 121.5000 -64.0 + 98.5000 120.7500 -64.0 + 100.2500 121.5000 -64.0 + 99.5000 122.2500 -64.0 + 97.5000 122.2500 -64.0 + 92.5000 128.2500 -64.0 + 90.7500 127.5000 -64.0 + 90.7500 123.5000 -64.0 + 92.5000 122.7500 -64.0 +} -64.0 +{ -64.0 + 117.7500 124.5000 -64.0 + 118.5000 123.7500 -64.0 + 121.5000 123.7500 -64.0 + 122.2500 125.5000 -64.0 + 121.5000 127.2500 -64.0 + 119.5000 127.2500 -64.0 +} -64.0 +{ -64.0 + 141.7500 132.5000 -64.0 + 143.5000 131.7500 -64.0 + 145.2500 134.5000 -64.0 + 144.5000 138.2500 -64.0 + 142.5000 138.2500 -64.0 + 138.7500 135.5000 -64.0 + 139.5000 133.7500 -64.0 +} -64.0 +v 451 z -136.000000 -64.0 +{ -64.0 + 107.2500 34.5000 -64.0 + 100.5000 39.2500 -64.0 + 95.5000 39.2500 -64.0 + 92.2500 46.5000 -64.0 + 92.7500 47.5000 -64.0 + 95.5000 43.7500 -64.0 + 98.7500 43.5000 -64.0 + 99.7500 41.5000 -64.0 + 103.5000 38.7500 -64.0 + 105.5000 38.7500 -64.0 + 109.5000 35.7500 -64.0 + 108.7500 34.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 34.5000 -64.0 + 112.2500 35.5000 -64.0 + 113.2500 37.5000 -64.0 + 120.5000 41.7500 -64.0 + 122.2500 45.5000 -64.0 + 128.2500 48.5000 -64.0 + 128.7500 47.5000 -64.0 + 125.7500 43.5000 -64.0 + 126.7500 42.5000 -64.0 + 125.7500 39.5000 -64.0 + 117.5000 38.2500 -64.0 + 114.7500 34.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 42.5000 -64.0 + 108.5000 46.2500 -64.0 + 106.5000 46.2500 -64.0 + 104.5000 45.2500 -64.0 + 100.2500 46.5000 -64.0 + 99.2500 48.5000 -64.0 + 100.5000 47.7500 -64.0 + 101.2500 48.5000 -64.0 + 104.5000 48.7500 -64.0 + 110.2500 54.5000 -64.0 + 112.5000 54.7500 -64.0 + 117.5000 48.7500 -64.0 + 122.2500 50.5000 -64.0 + 125.2500 56.5000 -64.0 + 125.2500 60.5000 -64.0 + 127.5000 68.7500 -64.0 + 127.7500 66.5000 -64.0 + 126.7500 64.5000 -64.0 + 126.7500 62.5000 -64.0 + 128.7500 60.5000 -64.0 + 124.7500 52.5000 -64.0 + 124.7500 50.5000 -64.0 + 121.7500 47.5000 -64.0 + 117.5000 47.2500 -64.0 + 115.5000 46.2500 -64.0 + 113.5000 47.2500 -64.0 + 111.7500 45.5000 -64.0 + 112.7500 42.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 50.5000 -64.0 + 95.2500 54.5000 -64.0 + 95.7500 55.5000 -64.0 + 97.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 56.5000 -64.0 + 80.5000 60.2500 -64.0 + 81.2500 61.5000 -64.0 + 81.2500 64.5000 -64.0 + 82.5000 64.7500 -64.0 + 82.7500 63.5000 -64.0 + 81.7500 61.5000 -64.0 + 83.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 56.5000 -64.0 + 136.2500 62.5000 -64.0 + 135.2500 65.5000 -64.0 + 137.2500 69.5000 -64.0 + 137.2500 74.5000 -64.0 + 135.2500 76.5000 -64.0 + 137.5000 76.7500 -64.0 + 138.5000 73.7500 -64.0 + 138.7500 69.5000 -64.0 + 137.7500 67.5000 -64.0 + 137.7500 61.5000 -64.0 + 136.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 69.5000 -64.0 + 91.5000 70.2500 -64.0 + 92.2500 71.5000 -64.0 + 91.2500 73.5000 -64.0 + 86.5000 79.2500 -64.0 + 84.5000 79.2500 -64.0 + 84.2500 82.5000 -64.0 + 85.5000 82.7500 -64.0 + 85.7500 81.5000 -64.0 + 88.5000 78.7500 -64.0 + 89.2500 79.5000 -64.0 + 89.2500 81.5000 -64.0 + 92.7500 74.5000 -64.0 + 93.5000 72.7500 -64.0 + 93.7500 69.5000 -64.0 +} -64.0 +{ -64.0 + 103.2500 71.5000 -64.0 + 102.2500 73.5000 -64.0 + 104.5000 74.7500 -64.0 + 104.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 76.5000 -64.0 + 127.2500 79.5000 -64.0 + 129.2500 80.5000 -64.0 + 125.5000 82.2500 -64.0 + 123.7500 78.5000 -64.0 + 122.2500 78.5000 -64.0 + 124.5000 83.7500 -64.0 + 129.5000 84.7500 -64.0 + 133.5000 86.7500 -64.0 + 132.7500 84.5000 -64.0 + 133.7500 81.5000 -64.0 + 132.5000 81.2500 -64.0 + 131.7500 79.5000 -64.0 + 128.5000 78.2500 -64.0 +} -64.0 +{ -64.0 + 62.2500 77.5000 -64.0 + 60.5000 80.2500 -64.0 + 58.2500 89.5000 -64.0 + 59.5000 89.7500 -64.0 + 60.7500 88.5000 -64.0 + 64.5000 80.7500 -64.0 + 63.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 77.5000 -64.0 + 108.2500 80.5000 -64.0 + 109.5000 80.7500 -64.0 + 111.5000 78.7500 -64.0 + 109.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 82.5000 -64.0 + 90.2500 85.5000 -64.0 + 91.5000 85.7500 -64.0 + 91.7500 83.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 82.5000 -64.0 + 150.5000 84.2500 -64.0 + 150.2500 88.5000 -64.0 + 151.2500 90.5000 -64.0 + 151.2500 93.5000 -64.0 + 153.2500 97.5000 -64.0 + 153.2500 99.5000 -64.0 + 154.2500 101.5000 -64.0 + 154.2500 114.5000 -64.0 + 155.2500 116.5000 -64.0 + 157.5000 116.7500 -64.0 + 159.5000 114.7500 -64.0 + 159.7500 111.5000 -64.0 + 158.7500 109.5000 -64.0 + 158.7500 107.5000 -64.0 + 155.7500 101.5000 -64.0 + 155.7500 95.5000 -64.0 + 154.7500 93.5000 -64.0 + 154.7500 91.5000 -64.0 + 151.7500 90.5000 -64.0 + 152.5000 86.7500 -64.0 + 153.5000 87.7500 -64.0 + 153.7500 84.5000 -64.0 + 152.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 54.2500 102.5000 -64.0 + 52.5000 103.2500 -64.0 + 49.5000 108.2500 -64.0 + 49.2500 113.5000 -64.0 + 52.2500 115.5000 -64.0 + 54.5000 115.7500 -64.0 + 56.5000 114.7500 -64.0 + 56.7500 110.5000 -64.0 + 53.7500 107.5000 -64.0 + 55.7500 102.5000 -64.0 +} -64.0 +{ -64.0 + 67.2500 117.5000 -64.0 + 66.5000 118.2500 -64.0 + 64.5000 118.2500 -64.0 + 62.5000 120.2500 -64.0 + 58.5000 123.2500 -64.0 + 54.7500 121.5000 -64.0 + 53.2500 121.5000 -64.0 + 50.2500 127.5000 -64.0 + 43.5000 133.2500 -64.0 + 40.2500 138.5000 -64.0 + 39.2500 143.5000 -64.0 + 38.5000 145.2500 -64.0 + 38.2500 153.5000 -64.0 + 39.2500 155.5000 -64.0 + 39.2500 158.5000 -64.0 + 40.2500 160.5000 -64.0 + 40.2500 163.5000 -64.0 + 47.2500 177.5000 -64.0 + 47.2500 179.5000 -64.0 + 51.2500 185.5000 -64.0 + 52.2500 187.5000 -64.0 + 58.2500 193.5000 -64.0 + 64.2500 200.5000 -64.0 + 65.2500 202.5000 -64.0 + 75.2500 211.5000 -64.0 + 82.2500 215.5000 -64.0 + 86.5000 215.7500 -64.0 + 88.2500 216.5000 -64.0 + 89.5000 215.7500 -64.0 + 95.5000 215.7500 -64.0 + 97.2500 216.5000 -64.0 + 103.5000 216.7500 -64.0 + 105.5000 215.7500 -64.0 + 120.5000 215.7500 -64.0 + 130.5000 210.7500 -64.0 + 138.5000 203.7500 -64.0 + 151.7500 191.5000 -64.0 + 154.5000 187.7500 -64.0 + 157.7500 183.5000 -64.0 + 167.7500 163.5000 -64.0 + 168.5000 161.7500 -64.0 + 168.7500 158.5000 -64.0 + 169.5000 156.7500 -64.0 + 169.7500 144.5000 -64.0 + 168.7500 142.5000 -64.0 + 168.7500 140.5000 -64.0 + 166.7500 136.5000 -64.0 + 165.5000 134.2500 -64.0 + 161.7500 131.5000 -64.0 + 160.7500 129.5000 -64.0 + 155.7500 126.5000 -64.0 + 152.5000 126.2500 -64.0 + 148.7500 122.5000 -64.0 + 144.5000 119.2500 -64.0 + 144.2500 124.5000 -64.0 + 145.5000 125.7500 -64.0 + 147.5000 124.7500 -64.0 + 149.5000 124.7500 -64.0 + 152.2500 127.5000 -64.0 + 150.5000 131.2500 -64.0 + 150.2500 133.5000 -64.0 + 148.5000 135.2500 -64.0 + 147.7500 133.5000 -64.0 + 146.5000 133.2500 -64.0 + 146.2500 136.5000 -64.0 + 144.5000 138.2500 -64.0 + 134.5000 133.2500 -64.0 + 132.7500 132.5000 -64.0 + 133.5000 131.7500 -64.0 + 135.5000 130.7500 -64.0 + 135.7500 129.5000 -64.0 + 134.5000 129.2500 -64.0 + 130.5000 131.2500 -64.0 + 132.2500 132.5000 -64.0 + 131.5000 133.2500 -64.0 + 128.5000 133.2500 -64.0 + 126.7500 132.5000 -64.0 + 128.5000 130.2500 -64.0 + 124.7500 127.5000 -64.0 + 125.5000 125.7500 -64.0 + 124.5000 124.2500 -64.0 + 118.5000 121.2500 -64.0 + 113.5000 120.2500 -64.0 + 111.7500 119.5000 -64.0 + 100.5000 119.2500 -64.0 + 96.5000 121.2500 -64.0 + 93.5000 121.2500 -64.0 + 91.5000 122.2500 -64.0 + 89.5000 122.2500 -64.0 + 89.2500 126.5000 -64.0 + 91.2500 128.5000 -64.0 + 90.5000 130.2500 -64.0 + 88.5000 130.2500 -64.0 + 86.7500 128.5000 -64.0 + 84.5000 128.2500 -64.0 + 82.7500 126.5000 -64.0 + 80.5000 126.2500 -64.0 + 79.5000 128.2500 -64.0 + 79.2500 130.5000 -64.0 + 82.2500 134.5000 -64.0 + 87.5000 134.7500 -64.0 + 90.5000 133.7500 -64.0 + 93.7500 129.5000 -64.0 + 94.7500 127.5000 -64.0 + 98.5000 124.7500 -64.0 + 103.5000 121.7500 -64.0 + 109.5000 121.7500 -64.0 + 112.5000 122.7500 -64.0 + 120.5000 129.7500 -64.0 + 122.5000 128.7500 -64.0 + 124.5000 128.7500 -64.0 + 126.2500 131.5000 -64.0 + 125.5000 132.2500 -64.0 + 123.5000 133.2500 -64.0 + 123.2500 136.5000 -64.0 + 127.5000 139.7500 -64.0 + 132.5000 140.7500 -64.0 + 132.7500 139.5000 -64.0 + 135.5000 136.7500 -64.0 + 137.5000 136.7500 -64.0 + 147.5000 140.7500 -64.0 + 148.5000 138.7500 -64.0 + 150.5000 137.7500 -64.0 + 152.2500 138.5000 -64.0 + 153.2500 140.5000 -64.0 + 155.5000 140.7500 -64.0 + 155.7500 139.5000 -64.0 + 154.5000 139.2500 -64.0 + 151.7500 136.5000 -64.0 + 151.7500 134.5000 -64.0 + 154.5000 131.7500 -64.0 + 157.5000 131.7500 -64.0 + 163.5000 134.7500 -64.0 + 166.2500 138.5000 -64.0 + 166.2500 140.5000 -64.0 + 167.2500 142.5000 -64.0 + 166.2500 145.5000 -64.0 + 168.2500 147.5000 -64.0 + 168.2500 150.5000 -64.0 + 167.5000 152.2500 -64.0 + 164.5000 152.2500 -64.0 + 162.5000 153.2500 -64.0 + 160.5000 152.2500 -64.0 + 162.2500 155.5000 -64.0 + 157.5000 160.2500 -64.0 + 155.5000 159.2500 -64.0 + 153.7500 156.5000 -64.0 + 153.7500 154.5000 -64.0 + 152.2500 154.5000 -64.0 + 154.2500 158.5000 -64.0 + 154.2500 172.5000 -64.0 + 150.2500 178.5000 -64.0 + 149.2500 180.5000 -64.0 + 142.5000 186.2500 -64.0 + 140.5000 187.2500 -64.0 + 132.5000 192.2500 -64.0 + 128.5000 195.2500 -64.0 + 126.5000 195.2500 -64.0 + 124.5000 196.2500 -64.0 + 119.5000 196.2500 -64.0 + 114.5000 195.2500 -64.0 + 111.5000 194.2500 -64.0 + 107.7500 190.5000 -64.0 + 106.7500 188.5000 -64.0 + 104.5000 186.2500 -64.0 + 100.5000 191.2500 -64.0 + 96.5000 194.2500 -64.0 + 93.5000 194.2500 -64.0 + 89.5000 197.2500 -64.0 + 86.5000 197.2500 -64.0 + 80.5000 199.2500 -64.0 + 75.5000 197.2500 -64.0 + 69.7500 189.5000 -64.0 + 67.7500 185.5000 -64.0 + 56.7500 174.5000 -64.0 + 52.7500 167.5000 -64.0 + 52.7500 159.5000 -64.0 + 53.7500 156.5000 -64.0 + 50.7500 153.5000 -64.0 + 50.7500 148.5000 -64.0 + 51.7500 145.5000 -64.0 + 57.5000 139.7500 -64.0 + 61.5000 137.7500 -64.0 + 63.5000 137.7500 -64.0 + 64.7500 136.5000 -64.0 + 59.5000 136.2500 -64.0 + 56.5000 137.2500 -64.0 + 55.5000 139.2500 -64.0 + 53.5000 140.2500 -64.0 + 53.2500 141.5000 -64.0 + 49.5000 145.2500 -64.0 + 49.2500 147.5000 -64.0 + 47.5000 148.2500 -64.0 + 48.2500 149.5000 -64.0 + 48.2500 152.5000 -64.0 + 47.5000 154.2500 -64.0 + 45.5000 155.2500 -64.0 + 43.7500 151.5000 -64.0 + 41.7500 150.5000 -64.0 + 41.7500 139.5000 -64.0 + 43.7500 138.5000 -64.0 + 45.7500 134.5000 -64.0 + 46.5000 132.7500 -64.0 + 50.5000 130.7500 -64.0 + 53.5000 130.7500 -64.0 + 56.5000 133.7500 -64.0 + 58.5000 132.7500 -64.0 + 60.5000 132.7500 -64.0 + 62.5000 131.7500 -64.0 + 62.7500 129.5000 -64.0 + 64.5000 127.7500 -64.0 + 66.7500 127.5000 -64.0 + 65.7500 125.5000 -64.0 + 69.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 69.2500 129.5000 -64.0 + 69.2500 130.5000 -64.0 + 71.2500 132.5000 -64.0 + 70.2500 134.5000 -64.0 + 68.5000 135.2500 -64.0 + 68.2500 136.5000 -64.0 + 70.5000 136.7500 -64.0 + 74.5000 132.7500 -64.0 + 74.5000 131.2500 -64.0 + 72.5000 130.2500 -64.0 + 70.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 130.5000 -64.0 + 141.2500 131.5000 -64.0 + 145.5000 132.7500 -64.0 + 143.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 148.2500 141.5000 -64.0 + 148.2500 142.5000 -64.0 + 151.2500 146.5000 -64.0 + 150.5000 148.2500 -64.0 + 150.2500 150.5000 -64.0 + 153.5000 147.7500 -64.0 + 152.7500 145.5000 -64.0 + 151.5000 145.2500 -64.0 + 150.7500 143.5000 -64.0 +} -64.0 +{ -64.0 + 131.5000 81.7500 -64.0 + 132.2500 82.5000 -64.0 + 131.5000 84.2500 -64.0 + 129.7500 83.5000 -64.0 +} -64.0 +{ -64.0 + 155.7500 109.5000 -64.0 + 156.5000 108.7500 -64.0 + 157.2500 109.5000 -64.0 + 157.2500 112.5000 -64.0 + 156.5000 114.2500 -64.0 + 155.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 51.7500 110.5000 -64.0 + 52.5000 109.7500 -64.0 + 55.2500 112.5000 -64.0 + 53.5000 114.2500 -64.0 + 51.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 94.7500 122.5000 -64.0 + 95.5000 121.7500 -64.0 + 97.5000 121.7500 -64.0 + 99.2500 122.5000 -64.0 + 98.5000 123.2500 -64.0 + 96.5000 123.2500 -64.0 + 94.5000 126.2500 -64.0 + 92.5000 127.2500 -64.0 + 90.7500 126.5000 -64.0 + 90.7500 124.5000 -64.0 + 91.5000 122.7500 -64.0 +} -64.0 +{ -64.0 + 113.7500 122.5000 -64.0 + 114.5000 121.7500 -64.0 + 119.5000 122.7500 -64.0 + 122.5000 123.7500 -64.0 + 123.2500 125.5000 -64.0 + 122.5000 127.2500 -64.0 + 120.5000 127.2500 -64.0 + 118.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 82.7500 129.5000 -64.0 + 84.5000 128.7500 -64.0 + 86.2500 129.5000 -64.0 + 87.2500 131.5000 -64.0 + 85.5000 133.2500 -64.0 +} -64.0 +{ -64.0 + 126.7500 135.5000 -64.0 + 128.5000 134.7500 -64.0 + 130.2500 135.5000 -64.0 + 129.5000 137.2500 -64.0 + 127.5000 137.2500 -64.0 +} -64.0 +{ -64.0 + 165.5000 158.7500 -64.0 + 166.2500 159.5000 -64.0 + 165.5000 161.2500 -64.0 + 163.7500 160.5000 -64.0 +} -64.0 +{ -64.0 + 105.7500 200.5000 -64.0 + 106.5000 199.7500 -64.0 + 107.2500 201.5000 -64.0 + 105.5000 205.2500 -64.0 + 103.7500 202.5000 -64.0 + 105.5000 201.7500 -64.0 +} -64.0 +v 464 z -138.000000 -64.0 +{ -64.0 + 107.2500 32.5000 -64.0 + 104.5000 35.2500 -64.0 + 101.5000 35.2500 -64.0 + 99.5000 37.2500 -64.0 + 95.5000 37.2500 -64.0 + 92.5000 42.2500 -64.0 + 91.2500 46.5000 -64.0 + 94.5000 46.7500 -64.0 + 95.7500 45.5000 -64.0 + 94.7500 42.5000 -64.0 + 96.5000 41.7500 -64.0 + 99.5000 42.7500 -64.0 + 101.5000 38.7500 -64.0 + 103.5000 38.7500 -64.0 + 105.5000 36.7500 -64.0 + 107.5000 37.7500 -64.0 + 109.7500 34.5000 -64.0 + 108.7500 32.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 32.5000 -64.0 + 112.5000 33.2500 -64.0 + 112.2500 35.5000 -64.0 + 114.2500 37.5000 -64.0 + 116.5000 37.7500 -64.0 + 117.5000 39.7500 -64.0 + 121.2500 41.5000 -64.0 + 122.2500 43.5000 -64.0 + 119.5000 45.2500 -64.0 + 116.7500 43.5000 -64.0 + 114.5000 44.2500 -64.0 + 112.7500 40.5000 -64.0 + 109.5000 40.2500 -64.0 + 108.5000 43.2500 -64.0 + 106.5000 43.2500 -64.0 + 104.5000 44.2500 -64.0 + 103.5000 43.2500 -64.0 + 100.5000 44.2500 -64.0 + 96.5000 49.2500 -64.0 + 94.2500 55.5000 -64.0 + 94.7500 56.5000 -64.0 + 98.7500 47.5000 -64.0 + 101.5000 45.7500 -64.0 + 106.5000 46.7500 -64.0 + 109.5000 49.7500 -64.0 + 111.5000 50.7500 -64.0 + 117.5000 45.7500 -64.0 + 123.2500 49.5000 -64.0 + 126.2500 54.5000 -64.0 + 126.2500 58.5000 -64.0 + 125.2500 60.5000 -64.0 + 126.2500 62.5000 -64.0 + 126.2500 65.5000 -64.0 + 128.2500 69.5000 -64.0 + 129.5000 69.7500 -64.0 + 134.5000 67.7500 -64.0 + 136.2500 69.5000 -64.0 + 136.2500 71.5000 -64.0 + 134.5000 73.2500 -64.0 + 129.5000 73.2500 -64.0 + 129.2500 76.5000 -64.0 + 133.5000 77.7500 -64.0 + 136.5000 76.7500 -64.0 + 138.5000 73.7500 -64.0 + 138.7500 66.5000 -64.0 + 137.7500 64.5000 -64.0 + 137.7500 61.5000 -64.0 + 135.5000 58.2500 -64.0 + 134.5000 63.2500 -64.0 + 128.5000 66.2500 -64.0 + 126.7500 65.5000 -64.0 + 127.5000 61.7500 -64.0 + 129.7500 61.5000 -64.0 + 130.7500 59.5000 -64.0 + 127.7500 57.5000 -64.0 + 127.7500 55.5000 -64.0 + 125.7500 51.5000 -64.0 + 125.7500 49.5000 -64.0 + 122.7500 45.5000 -64.0 + 123.5000 44.7500 -64.0 + 128.5000 46.7500 -64.0 + 128.7500 43.5000 -64.0 + 126.7500 37.5000 -64.0 + 124.5000 37.2500 -64.0 + 120.5000 35.2500 -64.0 + 118.5000 36.2500 -64.0 + 116.7500 33.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 49.5000 -64.0 + 89.5000 50.2500 -64.0 + 90.2500 51.5000 -64.0 + 92.5000 51.7500 -64.0 +} -64.0 +{ -64.0 + 130.2500 49.5000 -64.0 + 129.5000 50.2500 -64.0 + 129.2500 52.5000 -64.0 + 130.5000 52.7500 -64.0 + 134.5000 54.7500 -64.0 + 134.7500 52.5000 -64.0 + 132.7500 51.5000 -64.0 + 132.7500 49.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 57.5000 -64.0 + 82.5000 60.2500 -64.0 + 82.2500 65.5000 -64.0 + 83.5000 64.7500 -64.0 + 86.2500 66.5000 -64.0 + 88.5000 66.7500 -64.0 + 84.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 60.5000 -64.0 + 94.2500 62.5000 -64.0 + 94.7500 61.5000 -64.0 +} -64.0 +{ -64.0 + 81.2500 67.5000 -64.0 + 81.2500 69.5000 -64.0 + 82.5000 72.7500 -64.0 + 82.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 72.5000 -64.0 + 84.2500 73.5000 -64.0 + 88.5000 73.7500 -64.0 + 86.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 76.5000 -64.0 + 93.5000 77.2500 -64.0 + 93.2500 79.5000 -64.0 + 91.5000 81.2500 -64.0 + 88.5000 81.2500 -64.0 + 89.5000 82.7500 -64.0 + 91.5000 81.7500 -64.0 + 93.5000 81.7500 -64.0 + 96.5000 77.7500 -64.0 + 95.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 62.2500 78.5000 -64.0 + 60.5000 82.2500 -64.0 + 60.2500 84.5000 -64.0 + 62.5000 82.7500 -64.0 + 63.2500 83.5000 -64.0 + 62.2500 86.5000 -64.0 + 59.5000 88.2500 -64.0 + 58.2500 96.5000 -64.0 + 50.5000 108.2500 -64.0 + 50.2500 112.5000 -64.0 + 52.2500 114.5000 -64.0 + 54.5000 114.7500 -64.0 + 56.5000 113.7500 -64.0 + 56.7500 108.5000 -64.0 + 55.7500 105.5000 -64.0 + 59.5000 96.7500 -64.0 + 60.7500 90.5000 -64.0 + 63.5000 87.7500 -64.0 + 64.7500 81.5000 -64.0 + 63.7500 78.5000 -64.0 +} -64.0 +{ -64.0 + 86.2500 79.5000 -64.0 + 84.5000 80.2500 -64.0 + 84.2500 82.5000 -64.0 + 87.5000 80.7500 -64.0 +} -64.0 +{ -64.0 + 128.2500 80.5000 -64.0 + 128.2500 81.5000 -64.0 + 127.5000 83.2500 -64.0 + 125.5000 82.2500 -64.0 + 126.2500 83.5000 -64.0 + 129.5000 83.7500 -64.0 + 132.2500 86.5000 -64.0 + 131.5000 87.2500 -64.0 + 134.2500 89.5000 -64.0 + 134.7500 88.5000 -64.0 + 131.7500 84.5000 -64.0 + 131.7500 82.5000 -64.0 + 129.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 83.5000 -64.0 + 150.5000 84.2500 -64.0 + 150.2500 94.5000 -64.0 + 152.2500 98.5000 -64.0 + 152.2500 100.5000 -64.0 + 154.2500 104.5000 -64.0 + 154.2500 115.5000 -64.0 + 156.2500 116.5000 -64.0 + 159.5000 113.7500 -64.0 + 159.7500 111.5000 -64.0 + 158.7500 109.5000 -64.0 + 158.7500 107.5000 -64.0 + 155.7500 101.5000 -64.0 + 155.7500 99.5000 -64.0 + 154.7500 97.5000 -64.0 + 155.7500 94.5000 -64.0 + 153.7500 90.5000 -64.0 + 153.7500 86.5000 -64.0 + 152.7500 83.5000 -64.0 +} -64.0 +{ -64.0 + 65.2500 117.5000 -64.0 + 62.2500 121.5000 -64.0 + 58.5000 124.2500 -64.0 + 54.5000 122.2500 -64.0 + 53.5000 125.2500 -64.0 + 51.5000 124.2500 -64.0 + 47.2500 130.5000 -64.0 + 44.2500 132.5000 -64.0 + 39.5000 142.2500 -64.0 + 39.2500 152.5000 -64.0 + 40.2500 154.5000 -64.0 + 42.2500 164.5000 -64.0 + 50.2500 181.5000 -64.0 + 62.2500 196.5000 -64.0 + 72.2500 206.5000 -64.0 + 76.5000 209.7500 -64.0 + 83.2500 213.5000 -64.0 + 96.5000 213.7500 -64.0 + 99.5000 214.7500 -64.0 + 101.5000 213.7500 -64.0 + 104.5000 214.7500 -64.0 + 106.5000 213.7500 -64.0 + 116.5000 213.7500 -64.0 + 127.5000 209.7500 -64.0 + 133.5000 203.7500 -64.0 + 142.5000 196.7500 -64.0 + 153.5000 186.7500 -64.0 + 156.7500 182.5000 -64.0 + 160.5000 175.7500 -64.0 + 160.7500 173.5000 -64.0 + 166.7500 163.5000 -64.0 + 169.5000 152.7500 -64.0 + 169.7500 143.5000 -64.0 + 165.7500 133.5000 -64.0 + 162.7500 131.5000 -64.0 + 160.5000 131.2500 -64.0 + 160.2500 132.5000 -64.0 + 162.5000 132.7500 -64.0 + 166.2500 139.5000 -64.0 + 164.2500 143.5000 -64.0 + 166.5000 143.7500 -64.0 + 168.2500 146.5000 -64.0 + 167.5000 148.2500 -64.0 + 168.2500 149.5000 -64.0 + 167.5000 151.2500 -64.0 + 164.5000 151.2500 -64.0 + 162.5000 153.2500 -64.0 + 160.5000 153.2500 -64.0 + 160.2500 157.5000 -64.0 + 158.5000 159.2500 -64.0 + 156.5000 159.2500 -64.0 + 154.7500 157.5000 -64.0 + 154.7500 155.5000 -64.0 + 151.2500 154.5000 -64.0 + 153.2500 160.5000 -64.0 + 153.2500 165.5000 -64.0 + 152.5000 167.2500 -64.0 + 153.2500 168.5000 -64.0 + 152.2500 171.5000 -64.0 + 146.5000 181.2500 -64.0 + 134.5000 189.2500 -64.0 + 132.5000 189.2500 -64.0 + 124.5000 193.2500 -64.0 + 114.5000 193.2500 -64.0 + 111.5000 192.2500 -64.0 + 107.7500 188.5000 -64.0 + 105.5000 184.2500 -64.0 + 103.5000 183.2500 -64.0 + 102.2500 186.5000 -64.0 + 99.5000 190.2500 -64.0 + 95.5000 193.2500 -64.0 + 81.5000 193.2500 -64.0 + 77.7500 191.5000 -64.0 + 75.5000 191.2500 -64.0 + 72.7500 186.5000 -64.0 + 60.7500 177.5000 -64.0 + 57.7500 173.5000 -64.0 + 53.7500 165.5000 -64.0 + 54.7500 152.5000 -64.0 + 53.5000 151.2500 -64.0 + 51.5000 154.2500 -64.0 + 50.7500 153.5000 -64.0 + 50.7500 148.5000 -64.0 + 52.5000 147.7500 -64.0 + 54.7500 142.5000 -64.0 + 57.5000 139.7500 -64.0 + 61.7500 137.5000 -64.0 + 59.5000 137.2500 -64.0 + 53.5000 140.2500 -64.0 + 53.2500 141.5000 -64.0 + 51.2500 143.5000 -64.0 + 49.5000 150.2500 -64.0 + 44.5000 149.2500 -64.0 + 42.5000 151.2500 -64.0 + 40.7500 149.5000 -64.0 + 41.7500 148.5000 -64.0 + 40.7500 145.5000 -64.0 + 42.5000 143.7500 -64.0 + 44.7500 136.5000 -64.0 + 46.5000 135.7500 -64.0 + 46.7500 133.5000 -64.0 + 48.5000 131.7500 -64.0 + 52.5000 129.7500 -64.0 + 54.5000 130.7500 -64.0 + 56.5000 133.7500 -64.0 + 63.5000 131.7500 -64.0 + 63.7500 130.5000 -64.0 + 65.5000 129.7500 -64.0 + 65.7500 127.5000 -64.0 + 64.5000 127.2500 -64.0 + 63.7500 125.5000 -64.0 + 65.5000 124.7500 -64.0 + 68.5000 118.7500 -64.0 + 67.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 119.5000 -64.0 + 99.5000 120.2500 -64.0 + 96.2500 120.5000 -64.0 + 99.5000 120.7500 -64.0 + 100.2500 122.5000 -64.0 + 98.5000 123.2500 -64.0 + 92.5000 127.2500 -64.0 + 89.7500 125.5000 -64.0 + 89.7500 123.5000 -64.0 + 92.5000 121.7500 -64.0 + 95.7500 121.5000 -64.0 + 92.5000 121.2500 -64.0 + 88.5000 123.2500 -64.0 + 88.2500 126.5000 -64.0 + 91.2500 128.5000 -64.0 + 94.5000 128.7500 -64.0 + 96.5000 126.7500 -64.0 + 100.5000 123.7500 -64.0 + 106.5000 121.7500 -64.0 + 111.5000 122.7500 -64.0 + 115.5000 125.7500 -64.0 + 117.5000 126.7500 -64.0 + 118.2500 128.5000 -64.0 + 123.5000 130.7500 -64.0 + 124.2500 132.5000 -64.0 + 123.5000 134.2500 -64.0 + 123.2500 137.5000 -64.0 + 127.5000 140.7500 -64.0 + 129.5000 141.7500 -64.0 + 131.2500 142.5000 -64.0 + 135.5000 142.7500 -64.0 + 135.7500 139.5000 -64.0 + 138.5000 137.7500 -64.0 + 139.2500 138.5000 -64.0 + 141.5000 138.7500 -64.0 + 145.2500 140.5000 -64.0 + 148.2500 144.5000 -64.0 + 147.5000 146.2500 -64.0 + 147.2500 148.5000 -64.0 + 148.2500 150.5000 -64.0 + 149.5000 152.7500 -64.0 + 149.7500 150.5000 -64.0 + 150.5000 148.7500 -64.0 + 152.5000 147.7500 -64.0 + 150.7500 146.5000 -64.0 + 147.7500 140.5000 -64.0 + 148.7500 138.5000 -64.0 + 147.5000 137.2500 -64.0 + 145.5000 136.2500 -64.0 + 144.5000 138.2500 -64.0 + 141.5000 137.2500 -64.0 + 139.7500 136.5000 -64.0 + 135.5000 136.2500 -64.0 + 132.5000 139.2500 -64.0 + 131.7500 138.5000 -64.0 + 129.7500 134.5000 -64.0 + 127.5000 134.2500 -64.0 + 125.7500 133.5000 -64.0 + 125.7500 130.5000 -64.0 + 124.5000 129.2500 -64.0 + 120.5000 127.2500 -64.0 + 113.7500 122.5000 -64.0 + 114.5000 121.7500 -64.0 + 118.5000 121.7500 -64.0 + 123.5000 123.7500 -64.0 + 130.2500 131.5000 -64.0 + 134.5000 131.7500 -64.0 + 136.2500 132.5000 -64.0 + 137.5000 131.7500 -64.0 + 142.5000 131.7500 -64.0 + 139.7500 129.5000 -64.0 + 137.5000 129.2500 -64.0 + 134.5000 128.2500 -64.0 + 133.5000 130.2500 -64.0 + 130.5000 130.2500 -64.0 + 128.7500 128.5000 -64.0 + 128.7500 126.5000 -64.0 + 124.5000 123.2500 -64.0 + 122.5000 122.2500 -64.0 + 120.7500 121.5000 -64.0 + 117.5000 121.2500 -64.0 + 115.7500 120.5000 -64.0 + 105.5000 120.2500 -64.0 +} -64.0 +{ -64.0 + 144.2500 120.5000 -64.0 + 143.2500 122.5000 -64.0 + 145.2500 124.5000 -64.0 + 147.5000 122.7500 -64.0 + 149.7500 122.5000 -64.0 + 146.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 78.2500 127.5000 -64.0 + 77.5000 128.2500 -64.0 + 71.5000 128.2500 -64.0 + 71.2500 129.5000 -64.0 + 72.5000 129.7500 -64.0 + 74.2500 131.5000 -64.0 + 73.5000 132.2500 -64.0 + 69.5000 134.2500 -64.0 + 69.5000 135.7500 -64.0 + 71.5000 134.7500 -64.0 + 73.5000 134.7500 -64.0 + 75.5000 133.7500 -64.0 + 76.2500 134.5000 -64.0 + 78.5000 134.7500 -64.0 + 81.5000 133.7500 -64.0 + 83.5000 136.7500 -64.0 + 89.7500 134.5000 -64.0 + 90.7500 132.5000 -64.0 + 89.7500 130.5000 -64.0 + 87.5000 130.2500 -64.0 + 87.2500 131.5000 -64.0 + 86.5000 133.2500 -64.0 + 82.5000 131.2500 -64.0 + 80.7500 130.5000 -64.0 + 81.5000 129.7500 -64.0 + 86.5000 129.7500 -64.0 + 86.7500 128.5000 -64.0 + 83.5000 128.2500 -64.0 + 81.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 154.2500 127.5000 -64.0 + 154.2500 128.5000 -64.0 + 151.5000 131.2500 -64.0 + 149.2500 137.5000 -64.0 + 152.5000 137.7500 -64.0 + 151.7500 136.5000 -64.0 + 151.7500 133.5000 -64.0 + 155.5000 130.7500 -64.0 + 157.5000 131.7500 -64.0 + 159.5000 130.7500 -64.0 + 156.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 154.2500 139.5000 -64.0 + 154.2500 140.5000 -64.0 + 155.5000 140.7500 -64.0 +} -64.0 +{ -64.0 + 150.7500 88.5000 -64.0 + 151.5000 87.7500 -64.0 + 153.2500 88.5000 -64.0 + 153.2500 91.5000 -64.0 + 152.5000 93.2500 -64.0 + 150.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 154.7500 106.5000 -64.0 + 155.5000 105.7500 -64.0 + 157.2500 107.5000 -64.0 + 157.2500 111.5000 -64.0 + 156.5000 113.2500 -64.0 + 155.7500 111.5000 -64.0 + 154.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 52.7500 110.5000 -64.0 + 54.5000 109.7500 -64.0 + 55.2500 111.5000 -64.0 + 53.5000 112.2500 -64.0 +} -64.0 +{ -64.0 + 60.7500 128.5000 -64.0 + 61.5000 127.7500 -64.0 + 63.2500 128.5000 -64.0 + 62.5000 129.2500 -64.0 +} -64.0 +{ -64.0 + 126.7500 136.5000 -64.0 + 128.5000 135.7500 -64.0 + 129.2500 137.5000 -64.0 + 128.5000 139.2500 -64.0 + 126.7500 138.5000 -64.0 +} -64.0 +{ -64.0 + 45.7500 151.5000 -64.0 + 46.5000 150.7500 -64.0 + 48.2500 151.5000 -64.0 + 49.2500 153.5000 -64.0 + 47.5000 155.2500 -64.0 + 45.5000 155.2500 -64.0 + 44.7500 153.5000 -64.0 +} -64.0 +{ -64.0 + 104.5000 195.7500 -64.0 + 105.2500 196.5000 -64.0 + 103.5000 198.2500 -64.0 + 102.7500 197.5000 -64.0 +} -64.0 +v 452 z -140.000000 -64.0 +{ -64.0 + 106.2500 31.5000 -64.0 + 103.5000 33.2500 -64.0 + 100.5000 33.2500 -64.0 + 100.2500 35.5000 -64.0 + 103.5000 37.7500 -64.0 + 105.5000 36.7500 -64.0 + 108.7500 36.5000 -64.0 + 109.7500 34.5000 -64.0 + 111.5000 33.7500 -64.0 + 114.5000 37.7500 -64.0 + 116.5000 36.7500 -64.0 + 118.2500 39.5000 -64.0 + 121.2500 40.5000 -64.0 + 120.5000 41.2500 -64.0 + 114.5000 41.2500 -64.0 + 113.7500 39.5000 -64.0 + 109.5000 38.2500 -64.0 + 106.5000 41.2500 -64.0 + 104.5000 41.2500 -64.0 + 102.5000 42.2500 -64.0 + 100.7500 41.5000 -64.0 + 100.7500 38.5000 -64.0 + 97.5000 35.2500 -64.0 + 95.5000 36.2500 -64.0 + 91.5000 42.2500 -64.0 + 91.2500 45.5000 -64.0 + 96.2500 46.5000 -64.0 + 96.2500 48.5000 -64.0 + 94.5000 50.2500 -64.0 + 90.7500 46.5000 -64.0 + 89.5000 47.2500 -64.0 + 89.2500 49.5000 -64.0 + 90.2500 51.5000 -64.0 + 94.2500 52.5000 -64.0 + 94.2500 54.5000 -64.0 + 99.5000 45.7500 -64.0 + 103.5000 42.7500 -64.0 + 108.5000 43.7500 -64.0 + 111.2500 46.5000 -64.0 + 116.5000 43.7500 -64.0 + 121.5000 44.7500 -64.0 + 127.2500 53.5000 -64.0 + 127.2500 55.5000 -64.0 + 125.5000 60.2500 -64.0 + 126.2500 61.5000 -64.0 + 126.2500 64.5000 -64.0 + 129.2500 70.5000 -64.0 + 129.5000 76.7500 -64.0 + 134.5000 77.7500 -64.0 + 138.5000 74.7500 -64.0 + 138.7500 65.5000 -64.0 + 137.7500 63.5000 -64.0 + 137.7500 60.5000 -64.0 + 136.5000 59.2500 -64.0 + 134.5000 62.2500 -64.0 + 129.5000 65.2500 -64.0 + 127.7500 64.5000 -64.0 + 127.7500 62.5000 -64.0 + 130.5000 60.7500 -64.0 + 130.7500 58.5000 -64.0 + 129.5000 58.2500 -64.0 + 127.7500 56.5000 -64.0 + 127.7500 53.5000 -64.0 + 128.5000 51.7500 -64.0 + 133.5000 54.7500 -64.0 + 134.5000 56.7500 -64.0 + 136.5000 57.7500 -64.0 + 136.7500 55.5000 -64.0 + 135.7500 53.5000 -64.0 + 135.7500 51.5000 -64.0 + 133.7500 50.5000 -64.0 + 132.5000 48.2500 -64.0 + 130.5000 47.2500 -64.0 + 127.5000 50.2500 -64.0 + 124.7500 46.5000 -64.0 + 125.5000 44.7500 -64.0 + 129.5000 45.7500 -64.0 + 129.7500 43.5000 -64.0 + 127.7500 36.5000 -64.0 + 124.5000 36.2500 -64.0 + 120.5000 33.2500 -64.0 + 118.5000 34.2500 -64.0 + 116.7500 31.5000 -64.0 + 113.5000 31.2500 -64.0 + 111.5000 32.2500 -64.0 + 109.7500 31.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 60.5000 -64.0 + 82.2500 64.5000 -64.0 + 87.5000 66.7500 -64.0 + 89.5000 65.7500 -64.0 + 89.7500 63.5000 -64.0 + 87.7500 62.5000 -64.0 + 86.7500 60.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 65.5000 -64.0 + 91.2500 67.5000 -64.0 + 92.7500 66.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 68.5000 -64.0 + 82.2500 71.5000 -64.0 + 86.5000 74.7500 -64.0 + 90.5000 72.7500 -64.0 + 89.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 62.2500 79.5000 -64.0 + 61.2500 84.5000 -64.0 + 63.5000 82.7500 -64.0 + 64.2500 83.5000 -64.0 + 63.2500 87.5000 -64.0 + 61.5000 89.2500 -64.0 + 60.7500 88.5000 -64.0 + 59.5000 89.2500 -64.0 + 58.2500 95.5000 -64.0 + 50.2500 109.5000 -64.0 + 52.5000 112.7500 -64.0 + 54.5000 113.7500 -64.0 + 56.5000 112.7500 -64.0 + 57.7500 102.5000 -64.0 + 64.5000 88.7500 -64.0 + 64.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 79.5000 -64.0 + 88.5000 81.2500 -64.0 + 85.5000 80.2500 -64.0 + 83.5000 83.7500 -64.0 + 85.5000 82.7500 -64.0 + 92.5000 81.7500 -64.0 +} -64.0 +{ -64.0 + 151.2500 84.5000 -64.0 + 149.5000 87.2500 -64.0 + 149.2500 95.5000 -64.0 + 153.2500 103.5000 -64.0 + 153.2500 106.5000 -64.0 + 154.2500 108.5000 -64.0 + 154.2500 113.5000 -64.0 + 155.2500 115.5000 -64.0 + 156.7500 115.5000 -64.0 + 159.5000 111.7500 -64.0 + 158.7500 110.5000 -64.0 + 157.7500 104.5000 -64.0 + 155.7500 100.5000 -64.0 + 155.7500 95.5000 -64.0 + 153.7500 91.5000 -64.0 + 153.7500 87.5000 -64.0 + 152.7500 84.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 117.5000 -64.0 + 64.2500 118.5000 -64.0 + 59.5000 124.2500 -64.0 + 55.5000 124.2500 -64.0 + 54.5000 126.2500 -64.0 + 50.5000 126.2500 -64.0 + 50.2500 127.5000 -64.0 + 44.5000 132.2500 -64.0 + 40.5000 139.2500 -64.0 + 40.2500 141.5000 -64.0 + 39.5000 143.2500 -64.0 + 39.2500 147.5000 -64.0 + 40.2500 149.5000 -64.0 + 40.2500 152.5000 -64.0 + 42.2500 156.5000 -64.0 + 42.2500 158.5000 -64.0 + 43.2500 160.5000 -64.0 + 43.2500 162.5000 -64.0 + 52.2500 180.5000 -64.0 + 53.5000 182.7500 -64.0 + 55.5000 183.7500 -64.0 + 65.2500 195.5000 -64.0 + 77.2500 206.5000 -64.0 + 81.5000 209.7500 -64.0 + 83.5000 210.7500 -64.0 + 85.2500 211.5000 -64.0 + 96.5000 211.7500 -64.0 + 98.2500 212.5000 -64.0 + 105.5000 212.7500 -64.0 + 107.5000 211.7500 -64.0 + 113.5000 211.7500 -64.0 + 115.5000 210.7500 -64.0 + 118.5000 210.7500 -64.0 + 125.5000 203.7500 -64.0 + 127.5000 203.7500 -64.0 + 130.5000 200.7500 -64.0 + 142.5000 191.7500 -64.0 + 149.5000 187.7500 -64.0 + 155.7500 180.5000 -64.0 + 158.5000 176.7500 -64.0 + 158.7500 174.5000 -64.0 + 161.7500 168.5000 -64.0 + 166.5000 159.7500 -64.0 + 166.7500 157.5000 -64.0 + 168.7500 152.5000 -64.0 + 169.5000 150.7500 -64.0 + 169.7500 144.5000 -64.0 + 167.7500 140.5000 -64.0 + 167.7500 138.5000 -64.0 + 164.7500 132.5000 -64.0 + 157.5000 128.2500 -64.0 + 154.2500 129.5000 -64.0 + 160.5000 130.7500 -64.0 + 161.2500 132.5000 -64.0 + 160.2500 135.5000 -64.0 + 158.5000 136.2500 -64.0 + 158.2500 137.5000 -64.0 + 163.5000 135.7500 -64.0 + 165.2500 140.5000 -64.0 + 164.2500 145.5000 -64.0 + 167.2500 147.5000 -64.0 + 167.2500 149.5000 -64.0 + 165.5000 151.2500 -64.0 + 166.2500 152.5000 -64.0 + 166.2500 154.5000 -64.0 + 162.5000 158.2500 -64.0 + 160.5000 156.2500 -64.0 + 158.5000 157.2500 -64.0 + 156.5000 157.2500 -64.0 + 155.7500 155.5000 -64.0 + 152.5000 155.2500 -64.0 + 149.7500 151.5000 -64.0 + 150.7500 148.5000 -64.0 + 152.5000 147.7500 -64.0 + 149.7500 145.5000 -64.0 + 149.7500 142.5000 -64.0 + 148.7500 139.5000 -64.0 + 147.5000 139.2500 -64.0 + 146.7500 137.5000 -64.0 + 146.2500 138.5000 -64.0 + 145.5000 140.2500 -64.0 + 143.5000 140.2500 -64.0 + 143.2500 143.5000 -64.0 + 151.2500 159.5000 -64.0 + 151.2500 168.5000 -64.0 + 147.2500 176.5000 -64.0 + 139.5000 184.2500 -64.0 + 129.5000 189.2500 -64.0 + 127.5000 189.2500 -64.0 + 123.5000 191.2500 -64.0 + 119.5000 191.2500 -64.0 + 117.5000 192.2500 -64.0 + 112.5000 191.2500 -64.0 + 109.7500 188.5000 -64.0 + 106.7500 184.5000 -64.0 + 104.7500 178.5000 -64.0 + 103.5000 179.2500 -64.0 + 101.2500 186.5000 -64.0 + 96.5000 191.2500 -64.0 + 88.5000 191.2500 -64.0 + 79.5000 188.2500 -64.0 + 72.5000 185.2500 -64.0 + 69.5000 182.2500 -64.0 + 67.5000 181.2500 -64.0 + 59.7500 174.5000 -64.0 + 55.7500 167.5000 -64.0 + 55.7500 150.5000 -64.0 + 54.7500 147.5000 -64.0 + 56.7500 142.5000 -64.0 + 61.5000 137.2500 -64.0 + 58.5000 138.2500 -64.0 + 54.5000 144.2500 -64.0 + 52.7500 143.5000 -64.0 + 50.5000 145.2500 -64.0 + 48.5000 145.2500 -64.0 + 48.2500 146.5000 -64.0 + 52.5000 146.7500 -64.0 + 54.2500 150.5000 -64.0 + 52.5000 152.2500 -64.0 + 52.2500 154.5000 -64.0 + 51.5000 156.2500 -64.0 + 50.7500 154.5000 -64.0 + 48.5000 152.2500 -64.0 + 46.5000 151.2500 -64.0 + 43.7500 147.5000 -64.0 + 44.5000 145.7500 -64.0 + 44.7500 142.5000 -64.0 + 43.7500 140.5000 -64.0 + 45.5000 138.7500 -64.0 + 47.5000 138.7500 -64.0 + 46.7500 137.5000 -64.0 + 46.7500 132.5000 -64.0 + 49.5000 129.7500 -64.0 + 54.5000 129.7500 -64.0 + 56.2500 133.5000 -64.0 + 57.5000 133.7500 -64.0 + 59.5000 131.7500 -64.0 + 60.2500 132.5000 -64.0 + 63.5000 132.7500 -64.0 + 64.5000 130.7500 -64.0 + 66.7500 129.5000 -64.0 + 67.7500 127.5000 -64.0 + 69.5000 126.7500 -64.0 + 75.5000 128.7500 -64.0 + 77.2500 129.5000 -64.0 + 81.5000 129.7500 -64.0 + 86.5000 127.7500 -64.0 + 87.7500 124.5000 -64.0 + 91.7500 121.5000 -64.0 + 89.5000 121.2500 -64.0 + 81.5000 128.2500 -64.0 + 77.5000 126.2500 -64.0 + 75.5000 127.2500 -64.0 + 73.5000 127.2500 -64.0 + 67.5000 125.2500 -64.0 + 66.7500 123.5000 -64.0 + 65.7500 121.5000 -64.0 + 67.5000 119.7500 -64.0 + 67.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 99.2500 119.5000 -64.0 + 98.5000 120.2500 -64.0 + 96.2500 120.5000 -64.0 + 100.5000 120.7500 -64.0 + 101.2500 122.5000 -64.0 + 94.5000 126.2500 -64.0 + 91.5000 126.2500 -64.0 + 87.5000 128.2500 -64.0 + 87.2500 131.5000 -64.0 + 86.5000 133.2500 -64.0 + 81.5000 133.2500 -64.0 + 79.5000 134.2500 -64.0 + 77.5000 134.2500 -64.0 + 74.5000 133.2500 -64.0 + 70.5000 135.2500 -64.0 + 67.2500 135.5000 -64.0 + 76.5000 135.7500 -64.0 + 78.2500 137.5000 -64.0 + 86.5000 137.7500 -64.0 + 89.7500 134.5000 -64.0 + 90.7500 132.5000 -64.0 + 88.7500 130.5000 -64.0 + 89.5000 128.7500 -64.0 + 94.5000 128.7500 -64.0 + 95.7500 127.5000 -64.0 + 102.5000 122.7500 -64.0 + 109.5000 122.7500 -64.0 + 115.5000 125.7500 -64.0 + 120.2500 130.5000 -64.0 + 123.2500 134.5000 -64.0 + 123.2500 139.5000 -64.0 + 124.5000 140.7500 -64.0 + 128.2500 143.5000 -64.0 + 137.5000 143.7500 -64.0 + 139.5000 142.7500 -64.0 + 138.7500 141.5000 -64.0 + 136.5000 141.2500 -64.0 + 134.5000 142.2500 -64.0 + 132.5000 142.2500 -64.0 + 130.7500 140.5000 -64.0 + 130.7500 138.5000 -64.0 + 129.7500 135.5000 -64.0 + 126.5000 135.2500 -64.0 + 124.7500 133.5000 -64.0 + 124.7500 131.5000 -64.0 + 117.5000 125.2500 -64.0 + 113.7500 122.5000 -64.0 + 114.5000 121.7500 -64.0 + 120.5000 121.7500 -64.0 + 123.5000 122.7500 -64.0 + 132.2500 132.5000 -64.0 + 133.5000 131.7500 -64.0 + 136.5000 131.7500 -64.0 + 135.7500 130.5000 -64.0 + 137.5000 129.7500 -64.0 + 136.5000 128.2500 -64.0 + 132.5000 130.2500 -64.0 + 131.7500 128.5000 -64.0 + 126.5000 123.2500 -64.0 + 122.5000 121.2500 -64.0 + 113.5000 120.2500 -64.0 + 111.5000 121.2500 -64.0 + 109.7500 120.5000 -64.0 + 102.5000 120.2500 -64.0 +} -64.0 +{ -64.0 + 144.2500 119.5000 -64.0 + 143.5000 121.2500 -64.0 + 145.2500 123.5000 -64.0 + 146.5000 121.7500 -64.0 + 149.7500 121.5000 -64.0 + 147.5000 121.2500 -64.0 + 145.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 133.5000 -64.0 + 150.2500 138.5000 -64.0 + 151.5000 138.7500 -64.0 + 151.7500 134.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 139.5000 -64.0 + 153.2500 140.5000 -64.0 + 154.5000 141.7500 -64.0 + 154.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 158.2500 142.5000 -64.0 + 158.2500 143.5000 -64.0 + 159.5000 143.7500 -64.0 + 159.7500 142.5000 -64.0 +} -64.0 +{ -64.0 + 158.2500 153.5000 -64.0 + 159.2500 154.5000 -64.0 + 159.7500 153.5000 -64.0 +} -64.0 +{ -64.0 + 110.7500 40.5000 -64.0 + 111.5000 39.7500 -64.0 + 112.2500 40.5000 -64.0 + 111.5000 41.2500 -64.0 +} -64.0 +{ -64.0 + 94.7500 41.5000 -64.0 + 95.5000 40.7500 -64.0 + 97.5000 40.7500 -64.0 + 99.2500 42.5000 -64.0 + 98.5000 44.2500 -64.0 + 95.5000 43.2500 -64.0 +} -64.0 +{ -64.0 + 123.7500 42.5000 -64.0 + 124.5000 41.7500 -64.0 + 125.2500 42.5000 -64.0 + 124.5000 44.2500 -64.0 +} -64.0 +{ -64.0 + 132.7500 68.5000 -64.0 + 133.5000 67.7500 -64.0 + 135.5000 67.7500 -64.0 + 137.2500 69.5000 -64.0 + 136.5000 70.2500 -64.0 + 132.5000 72.2500 -64.0 + 130.5000 72.2500 -64.0 + 129.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 150.7500 88.5000 -64.0 + 151.5000 87.7500 -64.0 + 152.2500 89.5000 -64.0 + 153.2500 91.5000 -64.0 + 153.2500 94.5000 -64.0 + 152.5000 96.2500 -64.0 + 151.7500 94.5000 -64.0 + 150.7500 92.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 98.5000 -64.0 + 153.5000 97.7500 -64.0 + 154.2500 99.5000 -64.0 + 153.5000 101.2500 -64.0 + 152.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 154.7500 105.5000 -64.0 + 155.5000 104.7500 -64.0 + 156.2500 105.5000 -64.0 + 155.5000 106.2500 -64.0 +} -64.0 +{ -64.0 + 53.7500 106.5000 -64.0 + 54.5000 105.7500 -64.0 + 55.2500 106.5000 -64.0 + 55.2500 109.5000 -64.0 + 54.5000 111.2500 -64.0 + 53.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 154.7500 108.5000 -64.0 + 155.5000 107.7500 -64.0 + 156.2500 108.5000 -64.0 + 157.2500 110.5000 -64.0 + 156.5000 112.2500 -64.0 + 154.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 63.5000 124.7500 -64.0 + 65.5000 124.7500 -64.0 + 66.2500 126.5000 -64.0 + 63.5000 128.2500 -64.0 + 61.5000 129.2500 -64.0 + 59.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 125.7500 137.5000 -64.0 + 127.5000 136.7500 -64.0 + 129.2500 137.5000 -64.0 + 129.2500 140.5000 -64.0 + 127.5000 141.2500 -64.0 + 125.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 45.7500 153.5000 -64.0 + 46.5000 152.7500 -64.0 + 48.2500 153.5000 -64.0 + 47.5000 154.2500 -64.0 +} -64.0 +v 420 z -142.000000 -64.0 +{ -64.0 + 105.2500 30.5000 -64.0 + 104.5000 31.2500 -64.0 + 101.5000 31.2500 -64.0 + 99.5000 33.2500 -64.0 + 101.5000 35.7500 -64.0 + 103.5000 36.7500 -64.0 + 105.5000 35.7500 -64.0 + 108.5000 36.7500 -64.0 + 111.5000 32.7500 -64.0 + 114.5000 36.7500 -64.0 + 116.5000 35.7500 -64.0 + 118.2500 37.5000 -64.0 + 117.5000 39.2500 -64.0 + 115.5000 39.2500 -64.0 + 113.7500 37.5000 -64.0 + 110.5000 37.2500 -64.0 + 106.5000 39.2500 -64.0 + 104.5000 39.2500 -64.0 + 102.5000 40.2500 -64.0 + 101.7500 38.5000 -64.0 + 97.5000 34.2500 -64.0 + 94.5000 35.2500 -64.0 + 92.2500 39.5000 -64.0 + 90.2500 43.5000 -64.0 + 96.2500 46.5000 -64.0 + 94.5000 48.2500 -64.0 + 91.7500 45.5000 -64.0 + 89.5000 45.2500 -64.0 + 88.2500 48.5000 -64.0 + 90.5000 50.7500 -64.0 + 94.5000 52.7500 -64.0 + 96.7500 47.5000 -64.0 + 102.5000 40.7500 -64.0 + 104.5000 40.7500 -64.0 + 109.5000 41.7500 -64.0 + 109.7500 39.5000 -64.0 + 111.5000 37.7500 -64.0 + 113.2500 39.5000 -64.0 + 112.5000 41.2500 -64.0 + 113.5000 42.7500 -64.0 + 115.5000 41.7500 -64.0 + 121.5000 41.7500 -64.0 + 123.2500 43.5000 -64.0 + 126.2500 49.5000 -64.0 + 126.2500 51.5000 -64.0 + 127.2500 53.5000 -64.0 + 129.5000 52.7500 -64.0 + 133.2500 55.5000 -64.0 + 133.2500 57.5000 -64.0 + 136.5000 57.7500 -64.0 + 136.7500 55.5000 -64.0 + 135.7500 53.5000 -64.0 + 135.7500 51.5000 -64.0 + 131.5000 46.2500 -64.0 + 127.5000 48.2500 -64.0 + 125.7500 45.5000 -64.0 + 126.5000 44.7500 -64.0 + 129.5000 44.7500 -64.0 + 132.5000 43.7500 -64.0 + 132.5000 42.2500 -64.0 + 130.5000 41.2500 -64.0 + 128.7500 40.5000 -64.0 + 128.7500 35.5000 -64.0 + 127.7500 33.5000 -64.0 + 126.5000 34.2500 -64.0 + 124.5000 35.2500 -64.0 + 122.7500 32.5000 -64.0 + 120.5000 32.2500 -64.0 + 118.5000 33.2500 -64.0 + 116.7500 30.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 56.5000 -64.0 + 126.5000 57.2500 -64.0 + 126.2500 60.5000 -64.0 + 127.2500 63.5000 -64.0 + 127.7500 62.5000 -64.0 + 130.7500 60.5000 -64.0 + 131.7500 58.5000 -64.0 + 128.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 58.5000 -64.0 + 82.5000 62.2500 -64.0 + 83.2500 64.5000 -64.0 + 88.2500 66.5000 -64.0 + 91.7500 65.5000 -64.0 + 92.7500 63.5000 -64.0 + 89.5000 62.2500 -64.0 + 86.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 59.5000 -64.0 + 130.5000 64.2500 -64.0 + 128.5000 64.2500 -64.0 + 128.2500 69.5000 -64.0 + 129.2500 71.5000 -64.0 + 129.2500 75.5000 -64.0 + 131.2500 76.5000 -64.0 + 137.7500 76.5000 -64.0 + 139.7500 72.5000 -64.0 + 138.7500 70.5000 -64.0 + 134.5000 70.2500 -64.0 + 130.5000 72.2500 -64.0 + 129.7500 71.5000 -64.0 + 130.5000 69.7500 -64.0 + 132.5000 69.7500 -64.0 + 134.5000 67.7500 -64.0 + 137.7500 67.5000 -64.0 + 138.7500 65.5000 -64.0 + 137.7500 63.5000 -64.0 + 137.7500 60.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 68.5000 -64.0 + 82.2500 69.5000 -64.0 + 84.2500 73.5000 -64.0 + 88.5000 73.7500 -64.0 + 90.5000 72.7500 -64.0 + 90.5000 70.2500 -64.0 + 86.7500 68.5000 -64.0 +} -64.0 +{ -64.0 + 63.2500 79.5000 -64.0 + 61.5000 83.2500 -64.0 + 61.2500 86.5000 -64.0 + 59.2500 90.5000 -64.0 + 58.2500 95.5000 -64.0 + 55.5000 101.2500 -64.0 + 51.5000 107.2500 -64.0 + 51.2500 110.5000 -64.0 + 53.2500 112.5000 -64.0 + 55.7500 112.5000 -64.0 + 57.7500 108.5000 -64.0 + 58.7500 101.5000 -64.0 + 62.7500 95.5000 -64.0 + 65.5000 89.7500 -64.0 + 65.7500 83.5000 -64.0 + 64.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 82.5000 -64.0 + 85.2500 83.5000 -64.0 + 87.5000 83.7500 -64.0 + 88.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 84.5000 -64.0 + 81.5000 85.7500 -64.0 + 84.7500 84.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 84.5000 -64.0 + 148.5000 90.2500 -64.0 + 148.2500 96.5000 -64.0 + 151.2500 100.5000 -64.0 + 151.7500 99.5000 -64.0 + 150.7500 97.5000 -64.0 + 149.7500 90.5000 -64.0 + 151.5000 88.7500 -64.0 + 152.2500 89.5000 -64.0 + 152.2500 92.5000 -64.0 + 153.2500 94.5000 -64.0 + 152.2500 96.5000 -64.0 + 155.2500 102.5000 -64.0 + 154.5000 104.2500 -64.0 + 152.7500 101.5000 -64.0 + 152.2500 102.5000 -64.0 + 154.2500 108.5000 -64.0 + 153.2500 111.5000 -64.0 + 154.2500 114.5000 -64.0 + 157.5000 114.7500 -64.0 + 158.5000 112.7500 -64.0 + 158.7500 107.5000 -64.0 + 157.7500 105.5000 -64.0 + 157.7500 103.5000 -64.0 + 155.7500 99.5000 -64.0 + 155.7500 96.5000 -64.0 + 153.7500 92.5000 -64.0 + 153.7500 88.5000 -64.0 + 152.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 65.2500 116.5000 -64.0 + 63.2500 120.5000 -64.0 + 59.5000 124.2500 -64.0 + 56.5000 124.2500 -64.0 + 56.2500 125.5000 -64.0 + 50.2500 128.5000 -64.0 + 54.5000 128.7500 -64.0 + 56.2500 131.5000 -64.0 + 56.2500 133.5000 -64.0 + 59.5000 134.7500 -64.0 + 61.5000 133.7500 -64.0 + 64.5000 133.7500 -64.0 + 66.2500 135.5000 -64.0 + 65.5000 136.2500 -64.0 + 65.5000 137.7500 -64.0 + 69.5000 135.7500 -64.0 + 72.5000 135.7500 -64.0 + 75.2500 138.5000 -64.0 + 74.2500 141.5000 -64.0 + 79.5000 141.7500 -64.0 + 82.5000 138.7500 -64.0 + 87.5000 138.7500 -64.0 + 89.5000 136.7500 -64.0 + 89.7500 131.5000 -64.0 + 94.5000 128.7500 -64.0 + 103.7500 121.5000 -64.0 + 98.2500 119.5000 -64.0 + 99.2500 121.5000 -64.0 + 99.2500 123.5000 -64.0 + 97.2500 125.5000 -64.0 + 89.2500 128.5000 -64.0 + 85.5000 134.2500 -64.0 + 83.7500 133.5000 -64.0 + 81.5000 134.2500 -64.0 + 79.5000 137.2500 -64.0 + 75.7500 135.5000 -64.0 + 69.5000 135.2500 -64.0 + 65.5000 133.2500 -64.0 + 64.7500 131.5000 -64.0 + 58.7500 129.5000 -64.0 + 58.7500 127.5000 -64.0 + 61.5000 123.7500 -64.0 + 66.5000 123.7500 -64.0 + 66.7500 121.5000 -64.0 + 65.7500 119.5000 -64.0 + 66.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 144.2500 118.5000 -64.0 + 143.2500 119.5000 -64.0 + 144.2500 121.5000 -64.0 + 145.5000 120.7500 -64.0 + 145.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 120.5000 -64.0 + 113.5000 122.2500 -64.0 + 111.2500 122.5000 -64.0 + 119.2500 129.5000 -64.0 + 122.2500 133.5000 -64.0 + 123.2500 140.5000 -64.0 + 125.2500 144.5000 -64.0 + 127.5000 144.7500 -64.0 + 124.7500 140.5000 -64.0 + 125.5000 136.7500 -64.0 + 130.7500 140.5000 -64.0 + 129.7500 138.5000 -64.0 + 129.7500 136.5000 -64.0 + 125.5000 136.2500 -64.0 + 123.7500 131.5000 -64.0 + 117.7500 125.5000 -64.0 + 116.7500 123.5000 -64.0 + 117.5000 121.7500 -64.0 + 119.5000 120.7500 -64.0 + 124.5000 121.7500 -64.0 + 128.2500 125.5000 -64.0 + 132.5000 132.7500 -64.0 + 134.5000 131.7500 -64.0 + 135.2500 132.5000 -64.0 + 136.7500 132.5000 -64.0 + 130.7500 127.5000 -64.0 + 128.5000 123.2500 -64.0 + 124.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 88.2500 121.5000 -64.0 + 84.5000 125.2500 -64.0 + 78.5000 129.2500 -64.0 + 76.5000 129.2500 -64.0 + 78.5000 130.7500 -64.0 + 80.5000 129.7500 -64.0 + 82.5000 129.7500 -64.0 + 84.7500 126.5000 -64.0 + 89.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 126.5000 -64.0 + 69.2500 127.5000 -64.0 + 66.2500 129.5000 -64.0 + 70.5000 129.7500 -64.0 + 74.5000 127.7500 -64.0 + 76.5000 127.7500 -64.0 + 76.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 47.2500 129.5000 -64.0 + 45.2500 131.5000 -64.0 + 40.5000 141.2500 -64.0 + 40.2500 149.5000 -64.0 + 43.2500 155.5000 -64.0 + 44.2500 161.5000 -64.0 + 48.5000 168.7500 -64.0 + 52.2500 177.5000 -64.0 + 61.5000 187.7500 -64.0 + 65.5000 189.7500 -64.0 + 68.2500 192.5000 -64.0 + 69.2500 194.5000 -64.0 + 72.5000 196.7500 -64.0 + 80.5000 202.7500 -64.0 + 84.5000 204.7500 -64.0 + 88.2500 208.5000 -64.0 + 96.5000 209.7500 -64.0 + 100.2500 211.5000 -64.0 + 103.5000 211.7500 -64.0 + 105.5000 210.7500 -64.0 + 108.5000 210.7500 -64.0 + 113.5000 208.7500 -64.0 + 114.7500 204.5000 -64.0 + 120.5000 200.7500 -64.0 + 122.7500 200.5000 -64.0 + 131.5000 196.7500 -64.0 + 138.7500 190.5000 -64.0 + 147.5000 186.7500 -64.0 + 151.7500 182.5000 -64.0 + 158.5000 172.7500 -64.0 + 160.5000 164.7500 -64.0 + 162.5000 163.7500 -64.0 + 165.5000 158.7500 -64.0 + 168.5000 150.7500 -64.0 + 168.7500 142.5000 -64.0 + 166.7500 138.5000 -64.0 + 166.7500 135.5000 -64.0 + 161.7500 129.5000 -64.0 + 159.5000 129.2500 -64.0 + 161.2500 132.5000 -64.0 + 155.5000 138.2500 -64.0 + 152.5000 138.2500 -64.0 + 149.5000 141.2500 -64.0 + 145.2500 141.5000 -64.0 + 146.2500 143.5000 -64.0 + 144.5000 145.2500 -64.0 + 141.7500 143.5000 -64.0 + 133.5000 143.2500 -64.0 + 131.7500 141.5000 -64.0 + 130.5000 143.2500 -64.0 + 130.2500 145.5000 -64.0 + 138.5000 145.7500 -64.0 + 144.2500 148.5000 -64.0 + 147.2500 154.5000 -64.0 + 147.2500 156.5000 -64.0 + 149.2500 160.5000 -64.0 + 149.2500 168.5000 -64.0 + 145.2500 176.5000 -64.0 + 135.5000 184.2500 -64.0 + 125.5000 189.2500 -64.0 + 123.5000 189.2500 -64.0 + 121.5000 190.2500 -64.0 + 116.5000 190.2500 -64.0 + 111.5000 188.2500 -64.0 + 108.7500 184.5000 -64.0 + 105.7500 178.5000 -64.0 + 105.5000 174.2500 -64.0 + 103.5000 173.2500 -64.0 + 101.2500 184.5000 -64.0 + 97.5000 188.2500 -64.0 + 93.5000 190.2500 -64.0 + 84.5000 188.2500 -64.0 + 77.7500 185.5000 -64.0 + 75.5000 185.2500 -64.0 + 61.7500 174.5000 -64.0 + 56.7500 164.5000 -64.0 + 58.7500 145.5000 -64.0 + 56.5000 141.2500 -64.0 + 56.2500 145.5000 -64.0 + 54.5000 146.2500 -64.0 + 52.7500 144.5000 -64.0 + 53.7500 141.5000 -64.0 + 51.5000 143.2500 -64.0 + 48.5000 143.2500 -64.0 + 47.2500 147.5000 -64.0 + 45.5000 149.2500 -64.0 + 43.7500 148.5000 -64.0 + 42.7500 146.5000 -64.0 + 45.5000 144.7500 -64.0 + 45.7500 141.5000 -64.0 + 44.7500 139.5000 -64.0 + 48.7500 133.5000 -64.0 + 47.7500 131.5000 -64.0 + 48.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 126.7500 35.5000 -64.0 + 127.5000 34.7500 -64.0 + 128.2500 35.5000 -64.0 + 127.5000 36.2500 -64.0 +} -64.0 +{ -64.0 + 94.7500 40.5000 -64.0 + 95.5000 39.7500 -64.0 + 98.2500 41.5000 -64.0 + 96.5000 42.2500 -64.0 +} -64.0 +{ -64.0 + 61.7500 84.5000 -64.0 + 62.5000 83.7500 -64.0 + 64.2500 84.5000 -64.0 + 64.2500 87.5000 -64.0 + 62.5000 91.2500 -64.0 + 60.7500 90.5000 -64.0 + 61.5000 88.7500 -64.0 +} -64.0 +{ -64.0 + 59.7500 94.5000 -64.0 + 60.5000 93.7500 -64.0 + 61.2500 94.5000 -64.0 + 60.5000 96.2500 -64.0 +} -64.0 +{ -64.0 + 55.7500 103.5000 -64.0 + 56.5000 102.7500 -64.0 + 57.2500 103.5000 -64.0 + 56.5000 105.2500 -64.0 + 56.2500 108.5000 -64.0 + 54.5000 110.2500 -64.0 + 53.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 154.7500 107.5000 -64.0 + 155.5000 106.7500 -64.0 + 156.2500 107.5000 -64.0 + 156.2500 109.5000 -64.0 + 155.5000 111.2500 -64.0 + 154.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 159.5000 135.7500 -64.0 + 161.5000 135.7500 -64.0 + 163.2500 136.5000 -64.0 + 163.2500 138.5000 -64.0 + 162.5000 140.2500 -64.0 + 163.5000 140.7500 -64.0 + 165.2500 143.5000 -64.0 + 165.2500 147.5000 -64.0 + 164.5000 149.2500 -64.0 + 165.2500 150.5000 -64.0 + 165.2500 154.5000 -64.0 + 161.5000 156.2500 -64.0 + 159.7500 155.5000 -64.0 + 159.7500 153.5000 -64.0 + 154.7500 148.5000 -64.0 + 154.7500 146.5000 -64.0 + 157.5000 143.7500 -64.0 + 161.5000 143.7500 -64.0 + 161.7500 142.5000 -64.0 + 158.5000 142.2500 -64.0 + 156.7500 141.5000 -64.0 + 156.7500 138.5000 -64.0 +} -64.0 +{ -64.0 + 50.7500 147.5000 -64.0 + 52.5000 146.7500 -64.0 + 55.5000 147.7500 -64.0 + 57.2500 150.5000 -64.0 + 56.5000 152.2500 -64.0 + 52.5000 154.2500 -64.0 + 50.5000 154.2500 -64.0 + 47.7500 150.5000 -64.0 +} -64.0 +{ -64.0 + 49.7500 157.5000 -64.0 + 50.5000 156.7500 -64.0 + 51.2500 157.5000 -64.0 + 50.5000 158.2500 -64.0 +} -64.0 +v 388 z -144.000000 -64.0 +{ -64.0 + 106.2500 29.5000 -64.0 + 104.5000 31.2500 -64.0 + 101.2500 30.5000 -64.0 + 98.5000 34.2500 -64.0 + 96.5000 33.2500 -64.0 + 94.5000 35.2500 -64.0 + 94.2500 38.5000 -64.0 + 91.5000 40.2500 -64.0 + 91.2500 43.5000 -64.0 + 89.5000 45.2500 -64.0 + 89.2500 48.5000 -64.0 + 93.2500 52.5000 -64.0 + 95.5000 50.7500 -64.0 + 95.7500 48.5000 -64.0 + 99.5000 41.7500 -64.0 + 103.5000 38.7500 -64.0 + 107.5000 38.7500 -64.0 + 111.5000 36.7500 -64.0 + 113.2500 37.5000 -64.0 + 114.2500 39.5000 -64.0 + 116.5000 39.7500 -64.0 + 118.5000 38.7500 -64.0 + 121.5000 39.7500 -64.0 + 126.2500 47.5000 -64.0 + 126.2500 50.5000 -64.0 + 128.2500 55.5000 -64.0 + 126.5000 57.2500 -64.0 + 126.2500 60.5000 -64.0 + 128.2500 62.5000 -64.0 + 128.2500 68.5000 -64.0 + 129.5000 69.7500 -64.0 + 133.5000 67.7500 -64.0 + 136.5000 67.7500 -64.0 + 138.5000 66.7500 -64.0 + 138.7500 62.5000 -64.0 + 137.7500 60.5000 -64.0 + 135.5000 60.2500 -64.0 + 132.5000 61.2500 -64.0 + 129.5000 64.2500 -64.0 + 128.7500 62.5000 -64.0 + 136.5000 56.7500 -64.0 + 136.7500 54.5000 -64.0 + 134.7500 52.5000 -64.0 + 134.7500 49.5000 -64.0 + 132.7500 48.5000 -64.0 + 132.7500 46.5000 -64.0 + 130.7500 44.5000 -64.0 + 131.5000 43.7500 -64.0 + 131.7500 40.5000 -64.0 + 127.7500 39.5000 -64.0 + 128.5000 37.2500 -64.0 + 126.5000 38.2500 -64.0 + 122.7500 37.5000 -64.0 + 124.5000 34.7500 -64.0 + 121.7500 30.5000 -64.0 + 118.5000 31.2500 -64.0 + 116.7500 29.5000 -64.0 + 113.5000 29.2500 -64.0 + 111.5000 30.2500 -64.0 + 110.7500 29.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 31.5000 -64.0 + 130.2500 32.5000 -64.0 + 130.7500 31.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 57.5000 -64.0 + 83.5000 58.2500 -64.0 + 82.2500 62.5000 -64.0 + 87.2500 65.5000 -64.0 + 90.5000 65.7500 -64.0 + 91.2500 67.5000 -64.0 + 91.7500 66.5000 -64.0 + 92.5000 64.7500 -64.0 + 92.5000 60.2500 -64.0 + 90.5000 61.2500 -64.0 + 86.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 67.5000 -64.0 + 82.2500 71.5000 -64.0 + 84.2500 73.5000 -64.0 + 89.5000 73.7500 -64.0 + 91.5000 72.7500 -64.0 + 91.7500 70.5000 -64.0 + 86.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 133.2500 70.5000 -64.0 + 129.5000 72.2500 -64.0 + 129.2500 74.5000 -64.0 + 130.2500 76.5000 -64.0 + 137.5000 76.7500 -64.0 + 140.5000 73.7500 -64.0 + 140.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 63.2500 80.5000 -64.0 + 62.2500 84.5000 -64.0 + 59.2500 90.5000 -64.0 + 58.2500 95.5000 -64.0 + 52.5000 106.2500 -64.0 + 52.2500 109.5000 -64.0 + 55.5000 111.7500 -64.0 + 57.5000 110.7500 -64.0 + 57.7500 106.5000 -64.0 + 59.7500 101.5000 -64.0 + 66.5000 91.7500 -64.0 + 66.7500 86.5000 -64.0 + 64.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 85.5000 -64.0 + 150.2500 87.5000 -64.0 + 147.5000 90.2500 -64.0 + 147.2500 95.5000 -64.0 + 148.2500 98.5000 -64.0 + 153.2500 103.5000 -64.0 + 153.2500 105.5000 -64.0 + 156.2500 107.5000 -64.0 + 155.5000 111.2500 -64.0 + 153.5000 108.2500 -64.0 + 153.2500 113.5000 -64.0 + 155.2500 114.5000 -64.0 + 157.5000 113.7500 -64.0 + 158.5000 111.7500 -64.0 + 158.7500 108.5000 -64.0 + 157.7500 106.5000 -64.0 + 157.7500 103.5000 -64.0 + 153.7500 93.5000 -64.0 + 153.7500 89.5000 -64.0 + 152.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 143.2500 117.5000 -64.0 + 143.5000 119.7500 -64.0 + 145.5000 118.7500 -64.0 + 144.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 118.5000 -64.0 + 64.5000 122.7500 -64.0 + 67.7500 121.5000 -64.0 + 66.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 118.5000 -64.0 + 116.5000 122.2500 -64.0 + 116.2500 124.5000 -64.0 + 117.2500 127.5000 -64.0 + 122.2500 133.5000 -64.0 + 122.2500 143.5000 -64.0 + 125.2500 147.5000 -64.0 + 128.5000 147.7500 -64.0 + 130.5000 146.7500 -64.0 + 138.5000 146.7500 -64.0 + 142.2500 149.5000 -64.0 + 145.2500 153.5000 -64.0 + 145.2500 155.5000 -64.0 + 147.2500 159.5000 -64.0 + 147.2500 168.5000 -64.0 + 146.2500 171.5000 -64.0 + 140.5000 177.2500 -64.0 + 129.5000 185.2500 -64.0 + 127.5000 185.2500 -64.0 + 123.5000 187.2500 -64.0 + 121.5000 187.2500 -64.0 + 119.5000 188.2500 -64.0 + 112.5000 186.2500 -64.0 + 107.7500 179.5000 -64.0 + 107.7500 177.5000 -64.0 + 106.7500 175.5000 -64.0 + 106.5000 168.2500 -64.0 + 104.5000 167.2500 -64.0 + 102.5000 170.2500 -64.0 + 102.2500 176.5000 -64.0 + 100.2500 182.5000 -64.0 + 95.5000 187.2500 -64.0 + 91.5000 187.2500 -64.0 + 79.5000 184.2500 -64.0 + 68.5000 178.2500 -64.0 + 61.7500 171.5000 -64.0 + 58.7500 165.5000 -64.0 + 58.7500 153.5000 -64.0 + 59.7500 150.5000 -64.0 + 62.5000 146.7500 -64.0 + 62.7500 140.5000 -64.0 + 68.5000 137.7500 -64.0 + 70.2500 138.5000 -64.0 + 71.2500 140.5000 -64.0 + 70.2500 142.5000 -64.0 + 81.5000 143.7500 -64.0 + 83.5000 142.7500 -64.0 + 85.5000 142.7500 -64.0 + 89.5000 138.7500 -64.0 + 90.7500 133.5000 -64.0 + 99.5000 124.7500 -64.0 + 99.7500 121.5000 -64.0 + 97.2500 119.5000 -64.0 + 98.2500 121.5000 -64.0 + 98.2500 124.5000 -64.0 + 87.5000 132.2500 -64.0 + 87.2500 134.5000 -64.0 + 85.5000 135.2500 -64.0 + 82.5000 134.2500 -64.0 + 82.2500 135.5000 -64.0 + 83.2500 138.5000 -64.0 + 78.5000 140.2500 -64.0 + 72.7500 136.5000 -64.0 + 67.5000 136.2500 -64.0 + 65.7500 133.5000 -64.0 + 66.5000 132.7500 -64.0 + 66.7500 130.5000 -64.0 + 63.5000 133.2500 -64.0 + 59.5000 132.2500 -64.0 + 57.7500 130.5000 -64.0 + 57.7500 124.5000 -64.0 + 56.5000 124.2500 -64.0 + 55.2500 125.5000 -64.0 + 50.5000 127.2500 -64.0 + 50.5000 128.7500 -64.0 + 53.5000 127.7500 -64.0 + 55.2500 129.5000 -64.0 + 55.2500 132.5000 -64.0 + 54.5000 134.2500 -64.0 + 55.5000 135.7500 -64.0 + 57.5000 134.7500 -64.0 + 59.5000 134.7500 -64.0 + 62.2500 138.5000 -64.0 + 60.5000 140.2500 -64.0 + 60.2500 143.5000 -64.0 + 58.5000 145.2500 -64.0 + 56.7500 144.5000 -64.0 + 56.2500 145.5000 -64.0 + 54.5000 146.2500 -64.0 + 53.7500 144.5000 -64.0 + 55.5000 143.7500 -64.0 + 55.7500 142.5000 -64.0 + 53.5000 142.2500 -64.0 + 51.5000 143.2500 -64.0 + 47.5000 142.2500 -64.0 + 45.7500 140.5000 -64.0 + 46.5000 136.7500 -64.0 + 48.5000 135.7500 -64.0 + 47.7500 133.5000 -64.0 + 48.5000 131.7500 -64.0 + 47.7500 129.5000 -64.0 + 46.5000 129.2500 -64.0 + 43.5000 134.2500 -64.0 + 41.5000 141.2500 -64.0 + 41.2500 148.5000 -64.0 + 45.2500 156.5000 -64.0 + 45.2500 158.5000 -64.0 + 47.2500 160.5000 -64.0 + 49.5000 158.7500 -64.0 + 50.2500 159.5000 -64.0 + 50.2500 161.5000 -64.0 + 48.2500 163.5000 -64.0 + 52.2500 173.5000 -64.0 + 63.5000 185.7500 -64.0 + 67.5000 187.7500 -64.0 + 81.2500 197.5000 -64.0 + 86.5000 197.7500 -64.0 + 89.5000 198.7500 -64.0 + 97.2500 203.5000 -64.0 + 97.2500 206.5000 -64.0 + 100.2500 209.5000 -64.0 + 106.5000 209.7500 -64.0 + 108.7500 206.5000 -64.0 + 107.7500 204.5000 -64.0 + 107.7500 202.5000 -64.0 + 111.5000 198.7500 -64.0 + 113.5000 198.7500 -64.0 + 117.5000 196.7500 -64.0 + 124.5000 195.7500 -64.0 + 129.5000 193.7500 -64.0 + 134.5000 189.7500 -64.0 + 146.5000 183.7500 -64.0 + 151.7500 178.5000 -64.0 + 156.5000 169.7500 -64.0 + 156.7500 163.5000 -64.0 + 159.5000 160.7500 -64.0 + 162.7500 160.5000 -64.0 + 167.5000 150.7500 -64.0 + 167.7500 140.5000 -64.0 + 165.7500 136.5000 -64.0 + 165.7500 134.5000 -64.0 + 161.7500 130.5000 -64.0 + 158.5000 134.2500 -64.0 + 156.5000 134.2500 -64.0 + 155.5000 137.2500 -64.0 + 153.5000 137.2500 -64.0 + 153.2500 139.5000 -64.0 + 154.2500 141.5000 -64.0 + 151.5000 144.2500 -64.0 + 142.7500 142.5000 -64.0 + 139.5000 144.2500 -64.0 + 134.5000 144.2500 -64.0 + 130.5000 146.2500 -64.0 + 128.5000 146.2500 -64.0 + 126.7500 144.5000 -64.0 + 127.5000 140.7500 -64.0 + 129.5000 140.7500 -64.0 + 129.7500 136.5000 -64.0 + 128.5000 137.2500 -64.0 + 124.7500 136.5000 -64.0 + 123.7500 131.5000 -64.0 + 119.5000 128.2500 -64.0 + 117.7500 125.5000 -64.0 + 118.7500 121.5000 -64.0 + 120.5000 119.7500 -64.0 + 129.5000 124.7500 -64.0 + 129.7500 123.5000 -64.0 + 122.5000 119.2500 -64.0 +} -64.0 +{ -64.0 + 85.2500 123.5000 -64.0 + 82.5000 126.2500 -64.0 + 76.5000 129.2500 -64.0 + 76.2500 130.5000 -64.0 + 81.5000 129.7500 -64.0 + 86.7500 123.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 125.5000 -64.0 + 130.2500 127.5000 -64.0 + 130.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 129.5000 -64.0 + 132.2500 131.5000 -64.0 + 132.2500 137.5000 -64.0 + 133.5000 137.7500 -64.0 + 134.5000 134.7500 -64.0 + 132.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 141.5000 -64.0 + 133.2500 142.5000 -64.0 + 133.7500 141.5000 -64.0 +} -64.0 +{ -64.0 + 110.7500 33.5000 -64.0 + 111.5000 32.7500 -64.0 + 113.2500 34.5000 -64.0 + 111.5000 35.2500 -64.0 +} -64.0 +{ -64.0 + 128.5000 43.7500 -64.0 + 130.2500 44.5000 -64.0 + 128.5000 46.2500 -64.0 + 126.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 92.7500 45.5000 -64.0 + 93.5000 44.7500 -64.0 + 95.2500 45.5000 -64.0 + 94.5000 47.2500 -64.0 +} -64.0 +{ -64.0 + 62.7500 85.5000 -64.0 + 64.5000 84.7500 -64.0 + 66.2500 86.5000 -64.0 + 63.2500 93.5000 -64.0 + 58.5000 101.2500 -64.0 + 57.7500 99.5000 -64.0 + 61.5000 91.7500 -64.0 +} -64.0 +{ -64.0 + 149.7500 90.5000 -64.0 + 150.5000 89.7500 -64.0 + 152.2500 91.5000 -64.0 + 152.2500 96.5000 -64.0 + 155.2500 102.5000 -64.0 + 154.5000 104.2500 -64.0 + 153.7500 103.5000 -64.0 + 153.7500 101.5000 -64.0 + 150.5000 98.2500 -64.0 + 148.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 56.7500 102.5000 -64.0 + 57.5000 101.7500 -64.0 + 58.2500 102.5000 -64.0 + 57.5000 103.2500 -64.0 + 56.2500 107.5000 -64.0 + 55.5000 109.2500 -64.0 + 54.7500 108.5000 -64.0 + 54.7500 106.5000 -64.0 +} -64.0 +{ -64.0 + 158.7500 135.5000 -64.0 + 159.5000 134.7500 -64.0 + 162.5000 134.7500 -64.0 + 164.2500 136.5000 -64.0 + 164.2500 138.5000 -64.0 + 160.5000 143.2500 -64.0 + 157.7500 139.5000 -64.0 + 157.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 163.5000 142.7500 -64.0 + 165.5000 142.7500 -64.0 + 167.2500 144.5000 -64.0 + 165.2500 148.5000 -64.0 + 166.2500 150.5000 -64.0 + 164.5000 154.2500 -64.0 + 160.5000 154.2500 -64.0 + 158.7500 152.5000 -64.0 + 159.7500 150.5000 -64.0 + 156.7500 148.5000 -64.0 + 157.5000 147.7500 -64.0 + 156.7500 146.5000 -64.0 + 157.5000 144.7500 -64.0 + 161.5000 144.7500 -64.0 +} -64.0 +{ -64.0 + 142.7500 145.5000 -64.0 + 143.5000 144.7500 -64.0 + 147.2500 146.5000 -64.0 + 146.2500 148.5000 -64.0 + 144.5000 149.2500 -64.0 + 142.7500 147.5000 -64.0 +} -64.0 +{ -64.0 + 53.5000 147.7500 -64.0 + 55.5000 147.7500 -64.0 + 57.2500 148.5000 -64.0 + 57.2500 151.5000 -64.0 + 55.5000 153.2500 -64.0 + 53.5000 153.2500 -64.0 + 51.7500 152.5000 -64.0 + 50.7500 150.5000 -64.0 +} -64.0 +v 402 z -146.000000 -64.0 +{ -64.0 + 108.2500 27.5000 -64.0 + 104.5000 30.2500 -64.0 + 101.2500 29.5000 -64.0 + 98.5000 33.2500 -64.0 + 96.5000 32.2500 -64.0 + 94.2500 35.5000 -64.0 + 95.2500 37.5000 -64.0 + 92.5000 39.2500 -64.0 + 92.2500 41.5000 -64.0 + 93.2500 43.5000 -64.0 + 90.5000 45.2500 -64.0 + 90.2500 48.5000 -64.0 + 92.2500 50.5000 -64.0 + 94.7500 50.5000 -64.0 + 95.7500 48.5000 -64.0 + 94.7500 46.5000 -64.0 + 98.5000 43.7500 -64.0 + 98.7500 41.5000 -64.0 + 101.7500 37.5000 -64.0 + 104.5000 35.7500 -64.0 + 109.5000 35.7500 -64.0 + 111.5000 33.7500 -64.0 + 115.5000 36.7500 -64.0 + 117.5000 35.7500 -64.0 + 119.5000 35.7500 -64.0 + 123.2500 39.5000 -64.0 + 125.2500 43.5000 -64.0 + 129.2500 44.5000 -64.0 + 125.5000 48.2500 -64.0 + 125.5000 50.7500 -64.0 + 127.5000 51.7500 -64.0 + 128.2500 53.5000 -64.0 + 126.2500 57.5000 -64.0 + 127.2500 60.5000 -64.0 + 129.5000 60.7500 -64.0 + 136.5000 56.7500 -64.0 + 136.7500 54.5000 -64.0 + 134.7500 52.5000 -64.0 + 134.7500 50.5000 -64.0 + 131.7500 48.5000 -64.0 + 132.7500 46.5000 -64.0 + 130.7500 44.5000 -64.0 + 131.7500 41.5000 -64.0 + 130.7500 39.5000 -64.0 + 126.7500 38.5000 -64.0 + 128.7500 35.5000 -64.0 + 124.7500 34.5000 -64.0 + 126.5000 32.7500 -64.0 + 128.7500 32.5000 -64.0 + 124.5000 32.2500 -64.0 + 123.5000 30.2500 -64.0 + 121.5000 29.2500 -64.0 + 118.5000 30.2500 -64.0 + 116.7500 27.5000 -64.0 + 113.5000 27.2500 -64.0 + 111.5000 29.2500 -64.0 +} -64.0 +{ -64.0 + 85.2500 56.5000 -64.0 + 82.2500 61.5000 -64.0 + 83.2500 63.5000 -64.0 + 86.5000 63.7500 -64.0 + 91.2500 67.5000 -64.0 + 89.5000 68.2500 -64.0 + 82.5000 66.2500 -64.0 + 80.5000 69.2500 -64.0 + 81.5000 70.7500 -64.0 + 81.7500 68.5000 -64.0 + 83.5000 67.7500 -64.0 + 85.2500 68.5000 -64.0 + 84.5000 69.2500 -64.0 + 85.2500 72.5000 -64.0 + 83.5000 73.2500 -64.0 + 81.7500 72.5000 -64.0 + 81.2500 73.5000 -64.0 + 91.5000 73.7500 -64.0 + 92.5000 69.7500 -64.0 + 92.7500 63.5000 -64.0 + 91.7500 60.5000 -64.0 + 86.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 59.5000 -64.0 + 129.5000 64.2500 -64.0 + 129.2500 66.5000 -64.0 + 130.2500 68.5000 -64.0 + 132.5000 68.7500 -64.0 + 133.2500 70.5000 -64.0 + 134.5000 69.7500 -64.0 + 133.7500 68.5000 -64.0 + 136.7500 63.5000 -64.0 + 134.7500 61.5000 -64.0 + 136.5000 60.7500 -64.0 + 138.2500 62.5000 -64.0 + 138.2500 66.5000 -64.0 + 139.5000 65.7500 -64.0 + 139.7500 63.5000 -64.0 + 138.7500 60.5000 -64.0 +} -64.0 +{ -64.0 + 138.2500 69.5000 -64.0 + 137.2500 72.5000 -64.0 + 140.5000 70.7500 -64.0 + 139.7500 69.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 71.5000 -64.0 + 130.5000 72.2500 -64.0 + 130.2500 74.5000 -64.0 + 131.5000 75.7500 -64.0 + 136.5000 76.7500 -64.0 + 135.5000 76.2500 -64.0 + 131.7500 73.5000 -64.0 + 132.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 142.2500 73.5000 -64.0 + 142.2500 74.5000 -64.0 + 141.5000 76.2500 -64.0 + 142.5000 76.7500 -64.0 + 142.7500 74.5000 -64.0 +} -64.0 +{ -64.0 + 63.2500 81.5000 -64.0 + 58.5000 92.2500 -64.0 + 57.2500 98.5000 -64.0 + 53.5000 104.2500 -64.0 + 53.2500 108.5000 -64.0 + 54.2500 110.5000 -64.0 + 57.5000 110.7500 -64.0 + 58.5000 108.7500 -64.0 + 58.7500 102.5000 -64.0 + 67.7500 92.5000 -64.0 + 68.7500 87.5000 -64.0 + 65.7500 84.5000 -64.0 + 65.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 85.5000 -64.0 + 150.2500 87.5000 -64.0 + 146.5000 91.2500 -64.0 + 146.2500 95.5000 -64.0 + 147.2500 97.5000 -64.0 + 147.2500 99.5000 -64.0 + 152.5000 101.7500 -64.0 + 152.7500 99.5000 -64.0 + 150.5000 99.2500 -64.0 + 147.7500 95.5000 -64.0 + 147.7500 92.5000 -64.0 + 150.5000 89.7500 -64.0 + 152.2500 93.5000 -64.0 + 152.2500 95.5000 -64.0 + 155.2500 101.5000 -64.0 + 155.2500 105.5000 -64.0 + 156.2500 108.5000 -64.0 + 155.5000 110.2500 -64.0 + 153.7500 109.5000 -64.0 + 153.7500 106.5000 -64.0 + 152.5000 107.2500 -64.0 + 152.2500 109.5000 -64.0 + 153.5000 112.7500 -64.0 + 155.5000 113.7500 -64.0 + 157.5000 112.7500 -64.0 + 157.7500 104.5000 -64.0 + 153.7500 94.5000 -64.0 + 153.7500 90.5000 -64.0 + 152.7500 88.5000 -64.0 + 152.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 115.5000 -64.0 + 117.2500 116.5000 -64.0 + 117.2500 120.5000 -64.0 + 116.2500 123.5000 -64.0 + 122.2500 134.5000 -64.0 + 121.2500 149.5000 -64.0 + 124.5000 150.7500 -64.0 + 126.5000 149.7500 -64.0 + 130.5000 149.7500 -64.0 + 132.5000 148.7500 -64.0 + 137.5000 148.7500 -64.0 + 141.2500 151.5000 -64.0 + 144.2500 155.5000 -64.0 + 144.2500 157.5000 -64.0 + 145.2500 159.5000 -64.0 + 145.2500 164.5000 -64.0 + 143.2500 170.5000 -64.0 + 132.5000 180.2500 -64.0 + 126.5000 183.2500 -64.0 + 124.5000 183.2500 -64.0 + 122.5000 184.2500 -64.0 + 117.5000 184.2500 -64.0 + 114.5000 183.2500 -64.0 + 111.7500 180.5000 -64.0 + 108.7500 175.5000 -64.0 + 108.7500 168.5000 -64.0 + 112.7500 159.5000 -64.0 + 110.5000 159.2500 -64.0 + 106.5000 162.2500 -64.0 + 100.2500 162.5000 -64.0 + 101.2500 164.5000 -64.0 + 101.2500 173.5000 -64.0 + 98.5000 180.2500 -64.0 + 94.5000 183.2500 -64.0 + 89.5000 183.2500 -64.0 + 87.5000 182.2500 -64.0 + 78.5000 181.2500 -64.0 + 64.7500 172.5000 -64.0 + 60.7500 165.5000 -64.0 + 60.7500 161.5000 -64.0 + 59.7500 159.5000 -64.0 + 60.5000 158.7500 -64.0 + 60.7500 153.5000 -64.0 + 63.7500 147.5000 -64.0 + 67.5000 144.7500 -64.0 + 74.5000 144.7500 -64.0 + 79.2500 146.5000 -64.0 + 84.5000 146.7500 -64.0 + 87.7500 144.5000 -64.0 + 90.5000 138.7500 -64.0 + 90.7500 134.5000 -64.0 + 98.5000 124.7500 -64.0 + 98.7500 122.5000 -64.0 + 97.5000 121.2500 -64.0 + 97.2500 125.5000 -64.0 + 94.5000 128.2500 -64.0 + 90.5000 130.2500 -64.0 + 88.2500 134.5000 -64.0 + 84.2500 137.5000 -64.0 + 87.2500 141.5000 -64.0 + 86.2500 143.5000 -64.0 + 83.5000 145.2500 -64.0 + 81.7500 144.5000 -64.0 + 82.5000 142.7500 -64.0 + 81.5000 141.2500 -64.0 + 77.5000 143.2500 -64.0 + 75.5000 143.2500 -64.0 + 69.7500 138.5000 -64.0 + 65.5000 138.2500 -64.0 + 64.7500 136.5000 -64.0 + 65.5000 134.7500 -64.0 + 67.7500 133.5000 -64.0 + 64.5000 133.2500 -64.0 + 62.5000 134.2500 -64.0 + 59.5000 134.2500 -64.0 + 57.7500 133.5000 -64.0 + 54.7500 127.5000 -64.0 + 49.5000 127.2500 -64.0 + 46.2500 130.5000 -64.0 + 43.5000 136.2500 -64.0 + 43.2500 148.5000 -64.0 + 47.5000 157.7500 -64.0 + 49.5000 158.7500 -64.0 + 52.2500 162.5000 -64.0 + 52.2500 167.5000 -64.0 + 59.5000 178.7500 -64.0 + 67.5000 184.7500 -64.0 + 80.2500 191.5000 -64.0 + 83.5000 191.7500 -64.0 + 85.2500 193.5000 -64.0 + 88.5000 193.7500 -64.0 + 90.5000 192.7500 -64.0 + 91.2500 193.5000 -64.0 + 106.5000 193.7500 -64.0 + 108.5000 194.7500 -64.0 + 110.5000 193.7500 -64.0 + 114.5000 193.7500 -64.0 + 121.5000 191.7500 -64.0 + 127.5000 190.7500 -64.0 + 140.5000 183.7500 -64.0 + 146.5000 179.7500 -64.0 + 152.5000 168.7500 -64.0 + 153.7500 163.5000 -64.0 + 152.7500 160.5000 -64.0 + 155.5000 156.7500 -64.0 + 155.7500 154.5000 -64.0 + 154.7500 151.5000 -64.0 + 153.5000 151.2500 -64.0 + 151.7500 149.5000 -64.0 + 151.7500 147.5000 -64.0 + 149.7500 145.5000 -64.0 + 145.5000 144.2500 -64.0 + 143.5000 145.2500 -64.0 + 140.5000 144.2500 -64.0 + 138.5000 145.2500 -64.0 + 136.5000 145.2500 -64.0 + 134.5000 143.2500 -64.0 + 134.2500 145.5000 -64.0 + 131.5000 147.2500 -64.0 + 129.5000 147.2500 -64.0 + 127.7500 145.5000 -64.0 + 128.7500 143.5000 -64.0 + 127.2500 142.5000 -64.0 + 125.5000 146.2500 -64.0 + 123.7500 144.5000 -64.0 + 123.7500 140.5000 -64.0 + 125.5000 138.7500 -64.0 + 127.2500 140.5000 -64.0 + 128.5000 139.7500 -64.0 + 129.2500 140.5000 -64.0 + 130.5000 138.7500 -64.0 + 132.5000 138.7500 -64.0 + 132.7500 129.5000 -64.0 + 130.5000 126.2500 -64.0 + 128.5000 125.2500 -64.0 + 130.2500 127.5000 -64.0 + 130.2500 131.5000 -64.0 + 129.5000 133.2500 -64.0 + 125.5000 135.2500 -64.0 + 123.7500 131.5000 -64.0 + 121.7500 130.5000 -64.0 + 118.7500 125.5000 -64.0 + 118.7500 122.5000 -64.0 + 119.5000 120.7500 -64.0 + 125.5000 123.7500 -64.0 + 122.7500 120.5000 -64.0 + 118.7500 119.5000 -64.0 + 119.5000 117.7500 -64.0 + 128.2500 122.5000 -64.0 + 128.7500 121.5000 -64.0 + 121.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 143.2500 115.5000 -64.0 + 142.5000 116.2500 -64.0 + 142.5000 117.7500 -64.0 + 144.5000 118.7500 -64.0 + 144.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 66.2500 117.5000 -64.0 + 65.2500 119.5000 -64.0 + 67.5000 119.7500 -64.0 + 67.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 117.5000 -64.0 + 89.2500 118.5000 -64.0 + 91.5000 118.7500 -64.0 + 92.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 126.5000 -64.0 + 79.5000 129.2500 -64.0 + 77.5000 130.2500 -64.0 + 77.5000 131.7500 -64.0 + 80.5000 130.7500 -64.0 + 83.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 161.2500 131.5000 -64.0 + 161.2500 132.5000 -64.0 + 159.5000 134.2500 -64.0 + 155.5000 134.2500 -64.0 + 153.5000 133.2500 -64.0 + 153.5000 136.7500 -64.0 + 157.5000 145.7500 -64.0 + 159.5000 146.7500 -64.0 + 162.5000 145.7500 -64.0 + 164.2500 147.5000 -64.0 + 163.5000 149.2500 -64.0 + 162.2500 155.5000 -64.0 + 164.7500 153.5000 -64.0 + 165.7500 151.5000 -64.0 + 166.5000 149.7500 -64.0 + 166.7500 141.5000 -64.0 + 165.7500 139.5000 -64.0 + 165.7500 137.5000 -64.0 + 162.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 119.7500 32.5000 -64.0 + 120.5000 31.7500 -64.0 + 122.2500 32.5000 -64.0 + 121.5000 33.2500 -64.0 +} -64.0 +{ -64.0 + 133.7500 55.5000 -64.0 + 134.5000 54.7500 -64.0 + 135.2500 55.5000 -64.0 + 134.5000 56.2500 -64.0 +} -64.0 +{ -64.0 + 85.7500 69.5000 -64.0 + 86.5000 68.7500 -64.0 + 87.2500 69.5000 -64.0 + 86.5000 70.2500 -64.0 +} -64.0 +{ -64.0 + 63.7500 85.5000 -64.0 + 64.5000 84.7500 -64.0 + 66.2500 86.5000 -64.0 + 66.2500 88.5000 -64.0 + 65.2500 91.5000 -64.0 + 63.5000 95.2500 -64.0 + 58.5000 101.2500 -64.0 + 57.7500 100.5000 -64.0 + 58.7500 97.5000 -64.0 + 61.5000 91.7500 -64.0 + 61.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 55.7500 104.5000 -64.0 + 56.5000 103.7500 -64.0 + 58.2500 104.5000 -64.0 + 57.2500 106.5000 -64.0 + 56.5000 108.2500 -64.0 + 54.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 51.7500 129.5000 -64.0 + 53.5000 128.7500 -64.0 + 55.2500 131.5000 -64.0 + 55.2500 133.5000 -64.0 + 53.5000 134.7500 -64.0 + 55.5000 135.7500 -64.0 + 57.2500 138.5000 -64.0 + 57.2500 140.5000 -64.0 + 58.5000 140.7500 -64.0 + 59.2500 142.5000 -64.0 + 58.5000 144.2500 -64.0 + 54.5000 142.2500 -64.0 + 52.5000 143.2500 -64.0 + 48.5000 143.2500 -64.0 + 46.7500 142.5000 -64.0 + 46.7500 140.5000 -64.0 + 45.7500 138.5000 -64.0 + 46.7500 136.5000 -64.0 + 48.5000 135.7500 -64.0 +} -64.0 +{ -64.0 + 160.5000 134.7500 -64.0 + 163.2500 136.5000 -64.0 + 162.2500 141.5000 -64.0 + 161.5000 143.2500 -64.0 + 159.7500 142.5000 -64.0 + 159.7500 139.5000 -64.0 + 157.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 86.7500 137.5000 -64.0 + 87.5000 136.7500 -64.0 + 88.2500 137.5000 -64.0 + 87.5000 139.2500 -64.0 +} -64.0 +v 547 z -148.000000 -64.0 +{ -64.0 + 107.2500 26.5000 -64.0 + 105.5000 27.2500 -64.0 + 104.5000 30.2500 -64.0 + 102.7500 28.5000 -64.0 + 100.5000 28.2500 -64.0 + 98.5000 31.2500 -64.0 + 97.7500 30.5000 -64.0 + 95.5000 31.2500 -64.0 + 94.2500 34.5000 -64.0 + 95.2500 36.5000 -64.0 + 94.5000 37.2500 -64.0 + 91.2500 37.5000 -64.0 + 93.5000 37.7500 -64.0 + 96.2500 40.5000 -64.0 + 93.5000 42.2500 -64.0 + 93.2500 43.5000 -64.0 + 91.5000 45.2500 -64.0 + 91.2500 47.5000 -64.0 + 92.2500 49.5000 -64.0 + 95.5000 49.7500 -64.0 + 95.7500 47.5000 -64.0 + 94.7500 44.5000 -64.0 + 98.5000 42.7500 -64.0 + 98.7500 38.5000 -64.0 + 100.7500 37.5000 -64.0 + 101.7500 35.5000 -64.0 + 105.5000 32.7500 -64.0 + 106.2500 33.5000 -64.0 + 109.7500 33.5000 -64.0 + 110.7500 31.5000 -64.0 + 112.5000 30.7500 -64.0 + 113.5000 32.7500 -64.0 + 115.5000 33.7500 -64.0 + 117.5000 32.7500 -64.0 + 121.5000 33.7500 -64.0 + 123.2500 37.5000 -64.0 + 123.2500 41.5000 -64.0 + 129.2500 43.5000 -64.0 + 125.5000 47.2500 -64.0 + 125.2500 50.5000 -64.0 + 128.5000 50.7500 -64.0 + 131.7500 47.5000 -64.0 + 132.7500 45.5000 -64.0 + 129.7500 43.5000 -64.0 + 131.5000 42.7500 -64.0 + 131.7500 39.5000 -64.0 + 126.5000 38.2500 -64.0 + 125.7500 36.5000 -64.0 + 129.5000 34.7500 -64.0 + 129.7500 32.5000 -64.0 + 128.7500 30.5000 -64.0 + 126.5000 30.2500 -64.0 + 122.5000 32.2500 -64.0 + 121.7500 30.5000 -64.0 + 123.5000 29.7500 -64.0 + 123.5000 28.2500 -64.0 + 121.5000 27.2500 -64.0 + 119.5000 28.2500 -64.0 + 117.7500 26.5000 -64.0 + 114.5000 26.2500 -64.0 + 112.5000 27.2500 -64.0 + 110.7500 26.5000 -64.0 +} -64.0 +{ -64.0 + 135.2500 43.5000 -64.0 + 134.2500 47.5000 -64.0 + 129.5000 52.2500 -64.0 + 127.5000 53.2500 -64.0 + 127.2500 54.5000 -64.0 + 129.2500 55.5000 -64.0 + 129.2500 59.5000 -64.0 + 132.5000 56.7500 -64.0 + 133.2500 57.5000 -64.0 + 133.2500 59.5000 -64.0 + 133.7500 58.5000 -64.0 + 135.5000 57.7500 -64.0 + 138.7500 60.5000 -64.0 + 136.7500 54.5000 -64.0 + 137.7500 52.5000 -64.0 + 136.7500 50.5000 -64.0 + 136.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 55.5000 -64.0 + 81.5000 59.2500 -64.0 + 82.2500 60.5000 -64.0 + 82.2500 64.5000 -64.0 + 83.5000 63.7500 -64.0 + 85.2500 64.5000 -64.0 + 86.5000 63.7500 -64.0 + 89.2500 65.5000 -64.0 + 87.5000 66.2500 -64.0 + 90.2500 70.5000 -64.0 + 91.5000 67.7500 -64.0 + 95.5000 67.7500 -64.0 + 93.7500 66.5000 -64.0 + 95.5000 65.7500 -64.0 + 94.7500 64.5000 -64.0 + 97.5000 62.7500 -64.0 + 95.7500 61.5000 -64.0 + 94.5000 62.2500 -64.0 + 92.7500 61.5000 -64.0 + 91.7500 59.5000 -64.0 + 86.7500 55.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 58.5000 -64.0 + 125.2500 59.5000 -64.0 + 127.5000 59.7500 -64.0 +} -64.0 +{ -64.0 + 102.2500 59.5000 -64.0 + 103.2500 60.5000 -64.0 + 108.5000 60.7500 -64.0 + 111.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 59.5000 -64.0 + 139.2500 61.5000 -64.0 + 140.2500 63.5000 -64.0 + 140.2500 65.5000 -64.0 + 141.5000 65.7500 -64.0 + 141.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 60.5000 -64.0 + 133.5000 61.2500 -64.0 + 135.5000 65.7500 -64.0 + 135.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 63.5000 -64.0 + 111.5000 65.2500 -64.0 + 103.5000 66.2500 -64.0 + 105.2500 67.5000 -64.0 + 118.5000 67.7500 -64.0 + 127.5000 68.7500 -64.0 + 130.5000 69.7500 -64.0 + 131.2500 71.5000 -64.0 + 131.7500 70.5000 -64.0 + 130.7500 68.5000 -64.0 + 133.5000 66.7500 -64.0 + 131.7500 65.5000 -64.0 + 131.7500 63.5000 -64.0 + 129.5000 63.2500 -64.0 + 129.2500 64.5000 -64.0 + 130.2500 66.5000 -64.0 + 128.5000 67.2500 -64.0 + 119.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 83.2500 71.5000 -64.0 + 83.2500 72.5000 -64.0 + 84.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 71.5000 -64.0 + 86.2500 72.5000 -64.0 + 89.2500 74.5000 -64.0 + 97.5000 74.2500 -64.0 + 88.7500 72.5000 -64.0 + 89.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 77.2500 72.5000 -64.0 + 76.5000 73.2500 -64.0 + 73.5000 73.2500 -64.0 + 71.5000 74.2500 -64.0 + 69.5000 74.2500 -64.0 + 67.5000 75.2500 -64.0 + 64.2500 75.5000 -64.0 + 71.5000 75.7500 -64.0 + 72.2500 77.5000 -64.0 + 71.2500 80.5000 -64.0 + 72.5000 79.7500 -64.0 + 82.5000 74.7500 -64.0 + 81.5000 74.2500 -64.0 + 79.5000 75.2500 -64.0 + 77.7500 73.5000 -64.0 + 78.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 72.5000 -64.0 + 129.5000 73.2500 -64.0 + 133.2500 76.5000 -64.0 + 132.5000 77.2500 -64.0 + 130.5000 77.2500 -64.0 + 128.7500 76.5000 -64.0 + 122.5000 76.2500 -64.0 + 122.2500 80.5000 -64.0 + 123.5000 79.7500 -64.0 + 129.5000 77.7500 -64.0 + 131.5000 78.7500 -64.0 + 133.5000 77.7500 -64.0 + 136.5000 77.7500 -64.0 +} -64.0 +{ -64.0 + 144.2500 72.5000 -64.0 + 143.5000 73.2500 -64.0 + 145.2500 74.5000 -64.0 + 142.5000 77.2500 -64.0 + 145.2500 79.5000 -64.0 + 146.5000 78.7500 -64.0 + 147.2500 79.5000 -64.0 + 150.5000 79.7500 -64.0 + 152.2500 80.5000 -64.0 + 159.5000 80.7500 -64.0 + 148.5000 75.2500 -64.0 + 146.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 81.5000 -64.0 + 53.2500 106.5000 -64.0 + 55.2500 110.5000 -64.0 + 57.5000 110.7500 -64.0 + 58.7500 109.5000 -64.0 + 59.7500 104.5000 -64.0 + 58.5000 103.2500 -64.0 + 58.2500 105.5000 -64.0 + 56.5000 107.2500 -64.0 + 55.7500 106.5000 -64.0 + 55.7500 104.5000 -64.0 + 58.5000 100.7500 -64.0 + 57.7500 99.5000 -64.0 + 64.5000 85.7500 -64.0 + 65.2500 87.5000 -64.0 + 67.2500 88.5000 -64.0 + 67.2500 91.5000 -64.0 + 64.5000 95.2500 -64.0 + 62.2500 96.5000 -64.0 + 61.2500 98.5000 -64.0 + 64.5000 96.7500 -64.0 + 66.5000 96.7500 -64.0 + 68.7500 92.5000 -64.0 + 69.7500 87.5000 -64.0 + 67.7500 85.5000 -64.0 + 65.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 139.2500 81.5000 -64.0 + 139.2500 82.5000 -64.0 + 138.5000 84.2500 -64.0 + 138.2500 86.5000 -64.0 + 139.2500 88.5000 -64.0 + 139.2500 91.5000 -64.0 + 140.5000 92.7500 -64.0 + 140.7500 88.5000 -64.0 + 139.7500 86.5000 -64.0 + 139.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 85.5000 -64.0 + 150.2500 87.5000 -64.0 + 152.2500 91.5000 -64.0 + 153.2500 97.5000 -64.0 + 155.2500 101.5000 -64.0 + 155.2500 108.5000 -64.0 + 154.5000 110.2500 -64.0 + 153.7500 109.5000 -64.0 + 153.7500 105.5000 -64.0 + 152.5000 105.2500 -64.0 + 152.2500 107.5000 -64.0 + 153.2500 109.5000 -64.0 + 153.2500 112.5000 -64.0 + 155.5000 112.7500 -64.0 + 157.5000 111.7500 -64.0 + 157.7500 107.5000 -64.0 + 156.7500 105.5000 -64.0 + 155.7500 99.5000 -64.0 + 152.7500 93.5000 -64.0 + 152.7500 87.5000 -64.0 + 151.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 147.2500 97.5000 -64.0 + 148.2500 99.5000 -64.0 + 151.5000 99.7500 -64.0 + 151.7500 98.5000 -64.0 +} -64.0 +{ -64.0 + 105.2500 109.5000 -64.0 + 104.5000 110.2500 -64.0 + 99.5000 113.2500 -64.0 + 97.5000 113.2500 -64.0 + 95.5000 114.2500 -64.0 + 93.5000 114.2500 -64.0 + 88.5000 116.2500 -64.0 + 86.2500 119.5000 -64.0 + 84.2500 123.5000 -64.0 + 85.5000 123.7500 -64.0 + 87.5000 121.7500 -64.0 + 94.5000 117.7500 -64.0 + 96.5000 117.7500 -64.0 + 100.5000 115.7500 -64.0 + 104.5000 115.7500 -64.0 + 106.2500 116.5000 -64.0 + 105.5000 118.2500 -64.0 + 105.2500 121.5000 -64.0 + 107.2500 123.5000 -64.0 + 108.5000 122.7500 -64.0 + 110.5000 122.7500 -64.0 + 110.7500 118.5000 -64.0 + 109.7500 116.5000 -64.0 + 110.5000 115.7500 -64.0 + 113.5000 116.7500 -64.0 + 117.2500 118.5000 -64.0 + 117.2500 124.5000 -64.0 + 119.2500 128.5000 -64.0 + 123.2500 135.5000 -64.0 + 123.2500 140.5000 -64.0 + 121.5000 142.2500 -64.0 + 118.2500 151.5000 -64.0 + 115.5000 154.2500 -64.0 + 107.5000 159.2500 -64.0 + 101.5000 159.2500 -64.0 + 97.7500 156.5000 -64.0 + 95.5000 156.2500 -64.0 + 91.5000 154.2500 -64.0 + 91.2500 156.5000 -64.0 + 95.2500 161.5000 -64.0 + 99.2500 168.5000 -64.0 + 99.2500 172.5000 -64.0 + 96.5000 176.2500 -64.0 + 92.5000 178.2500 -64.0 + 90.5000 178.2500 -64.0 + 87.5000 177.2500 -64.0 + 85.5000 178.2500 -64.0 + 84.7500 177.5000 -64.0 + 83.5000 178.2500 -64.0 + 79.5000 178.2500 -64.0 + 73.5000 175.2500 -64.0 + 67.5000 170.2500 -64.0 + 62.7500 163.5000 -64.0 + 62.7500 161.5000 -64.0 + 61.7500 159.5000 -64.0 + 61.7500 157.5000 -64.0 + 63.7500 151.5000 -64.0 + 68.5000 146.7500 -64.0 + 70.5000 146.7500 -64.0 + 72.5000 145.7500 -64.0 + 84.2500 151.5000 -64.0 + 89.5000 151.7500 -64.0 + 89.7500 148.5000 -64.0 + 90.5000 146.7500 -64.0 + 90.7500 136.5000 -64.0 + 92.7500 131.5000 -64.0 + 97.5000 126.7500 -64.0 + 97.7500 122.5000 -64.0 + 96.5000 124.2500 -64.0 + 96.2500 126.5000 -64.0 + 89.5000 132.2500 -64.0 + 89.2500 135.5000 -64.0 + 88.5000 137.2500 -64.0 + 86.7500 135.5000 -64.0 + 84.5000 135.2500 -64.0 + 82.7500 132.5000 -64.0 + 82.7500 128.5000 -64.0 + 81.2500 131.5000 -64.0 + 80.5000 133.2500 -64.0 + 81.5000 134.7500 -64.0 + 83.5000 135.7500 -64.0 + 84.2500 137.5000 -64.0 + 88.2500 139.5000 -64.0 + 88.2500 141.5000 -64.0 + 86.5000 143.2500 -64.0 + 84.5000 143.2500 -64.0 + 84.2500 144.5000 -64.0 + 83.5000 146.2500 -64.0 + 81.5000 146.2500 -64.0 + 78.5000 143.2500 -64.0 + 76.5000 144.2500 -64.0 + 74.7500 143.5000 -64.0 + 72.5000 143.2500 -64.0 + 70.7500 142.5000 -64.0 + 69.7500 140.5000 -64.0 + 67.5000 138.2500 -64.0 + 67.2500 140.5000 -64.0 + 69.2500 142.5000 -64.0 + 68.5000 143.2500 -64.0 + 67.7500 142.5000 -64.0 + 65.5000 144.2500 -64.0 + 63.7500 142.5000 -64.0 + 63.7500 138.5000 -64.0 + 65.7500 137.5000 -64.0 + 66.7500 135.5000 -64.0 + 62.5000 135.2500 -64.0 + 60.5000 136.2500 -64.0 + 58.5000 136.2500 -64.0 + 56.5000 137.2500 -64.0 + 55.7500 136.5000 -64.0 + 55.7500 134.5000 -64.0 + 56.5000 132.7500 -64.0 + 55.7500 131.5000 -64.0 + 55.7500 129.5000 -64.0 + 53.7500 127.5000 -64.0 + 51.5000 127.2500 -64.0 + 48.5000 128.2500 -64.0 + 45.5000 132.2500 -64.0 + 45.2500 137.5000 -64.0 + 44.5000 139.2500 -64.0 + 44.2500 146.5000 -64.0 + 45.2500 148.5000 -64.0 + 45.5000 150.7500 -64.0 + 49.2500 153.5000 -64.0 + 51.2500 157.5000 -64.0 + 52.5000 157.7500 -64.0 + 55.2500 161.5000 -64.0 + 55.2500 164.5000 -64.0 + 57.5000 167.7500 -64.0 + 61.2500 176.5000 -64.0 + 62.5000 176.7500 -64.0 + 68.5000 181.7500 -64.0 + 76.5000 185.7500 -64.0 + 78.2500 186.5000 -64.0 + 81.5000 186.7500 -64.0 + 83.2500 187.5000 -64.0 + 91.5000 187.7500 -64.0 + 93.2500 188.5000 -64.0 + 102.5000 188.7500 -64.0 + 104.5000 189.7500 -64.0 + 106.5000 188.7500 -64.0 + 108.2500 189.5000 -64.0 + 112.5000 189.7500 -64.0 + 114.5000 188.7500 -64.0 + 118.5000 188.7500 -64.0 + 120.5000 187.7500 -64.0 + 124.5000 187.7500 -64.0 + 126.5000 186.7500 -64.0 + 128.5000 186.7500 -64.0 + 130.5000 185.7500 -64.0 + 132.7500 185.5000 -64.0 + 142.7500 178.5000 -64.0 + 145.5000 174.7500 -64.0 + 147.7500 168.5000 -64.0 + 150.5000 162.7500 -64.0 + 150.7500 149.5000 -64.0 + 148.7500 147.5000 -64.0 + 146.5000 147.2500 -64.0 + 146.2500 149.5000 -64.0 + 144.5000 151.2500 -64.0 + 134.5000 146.2500 -64.0 + 132.5000 148.2500 -64.0 + 130.5000 148.2500 -64.0 + 128.7500 147.5000 -64.0 + 126.7500 143.5000 -64.0 + 127.5000 141.7500 -64.0 + 126.7500 140.5000 -64.0 + 126.7500 136.5000 -64.0 + 128.5000 134.7500 -64.0 + 131.5000 134.7500 -64.0 + 131.7500 131.5000 -64.0 + 130.7500 129.5000 -64.0 + 131.7500 122.5000 -64.0 + 130.7500 119.5000 -64.0 + 128.7500 118.5000 -64.0 + 121.7500 114.5000 -64.0 + 115.5000 113.2500 -64.0 + 109.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 142.2500 114.5000 -64.0 + 141.5000 115.2500 -64.0 + 142.2500 116.5000 -64.0 + 144.5000 116.7500 -64.0 +} -64.0 +{ -64.0 + 67.2500 115.5000 -64.0 + 66.5000 116.2500 -64.0 + 66.5000 117.7500 -64.0 + 68.5000 118.7500 -64.0 + 68.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 160.2500 131.5000 -64.0 + 160.2500 132.5000 -64.0 + 159.5000 134.2500 -64.0 + 156.5000 134.2500 -64.0 + 153.5000 133.2500 -64.0 + 159.2500 145.5000 -64.0 + 163.2500 150.5000 -64.0 + 164.5000 149.7500 -64.0 + 164.7500 137.5000 -64.0 + 161.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 77.2500 139.5000 -64.0 + 82.5000 142.7500 -64.0 + 83.5000 142.2500 -64.0 + 79.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 113.7500 27.5000 -64.0 + 115.5000 26.7500 -64.0 + 117.2500 27.5000 -64.0 + 116.5000 29.2500 -64.0 +} -64.0 +{ -64.0 + 125.7500 33.5000 -64.0 + 126.5000 32.7500 -64.0 + 127.2500 33.5000 -64.0 + 126.5000 35.2500 -64.0 +} -64.0 +{ -64.0 + 132.7500 52.5000 -64.0 + 133.5000 51.7500 -64.0 + 135.2500 53.5000 -64.0 + 133.5000 54.2500 -64.0 +} -64.0 +{ -64.0 + 83.7500 57.5000 -64.0 + 85.5000 56.7500 -64.0 + 87.2500 57.5000 -64.0 + 85.5000 59.2500 -64.0 + 86.2500 62.5000 -64.0 + 84.5000 63.2500 -64.0 + 82.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 92.7500 116.5000 -64.0 + 93.5000 115.7500 -64.0 + 94.2500 116.5000 -64.0 + 93.5000 117.2500 -64.0 +} -64.0 +{ -64.0 + 119.7500 116.5000 -64.0 + 120.5000 115.7500 -64.0 + 121.2500 116.5000 -64.0 + 120.5000 117.2500 -64.0 +} -64.0 +{ -64.0 + 121.7500 117.5000 -64.0 + 122.5000 116.7500 -64.0 + 123.2500 117.5000 -64.0 + 122.5000 118.2500 -64.0 +} -64.0 +{ -64.0 + 107.7500 119.5000 -64.0 + 108.5000 118.7500 -64.0 + 109.2500 119.5000 -64.0 + 108.5000 120.2500 -64.0 +} -64.0 +{ -64.0 + 118.7500 119.5000 -64.0 + 119.5000 118.7500 -64.0 + 120.2500 119.5000 -64.0 + 124.5000 120.7500 -64.0 + 129.2500 125.5000 -64.0 + 128.5000 127.2500 -64.0 + 125.5000 125.2500 -64.0 + 123.5000 124.2500 -64.0 +} -64.0 +{ -64.0 + 126.7500 120.5000 -64.0 + 127.5000 119.7500 -64.0 + 128.2500 120.5000 -64.0 + 127.5000 121.2500 -64.0 +} -64.0 +{ -64.0 + 117.7500 121.5000 -64.0 + 118.5000 120.7500 -64.0 + 119.2500 121.5000 -64.0 + 120.2500 123.5000 -64.0 + 121.5000 123.7500 -64.0 + 123.5000 125.7500 -64.0 + 127.2500 128.5000 -64.0 + 127.2500 131.5000 -64.0 + 125.5000 133.2500 -64.0 + 123.5000 133.2500 -64.0 + 120.7500 129.5000 -64.0 + 120.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 49.7500 132.5000 -64.0 + 51.5000 131.7500 -64.0 + 53.2500 133.5000 -64.0 + 53.2500 135.5000 -64.0 + 55.2500 137.5000 -64.0 + 55.2500 139.5000 -64.0 + 51.5000 143.2500 -64.0 + 48.5000 143.2500 -64.0 + 45.7500 139.5000 -64.0 + 47.5000 135.7500 -64.0 + 49.7500 135.5000 -64.0 + 48.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 129.7500 152.5000 -64.0 + 130.5000 151.7500 -64.0 + 137.5000 151.7500 -64.0 + 142.2500 156.5000 -64.0 + 142.2500 159.5000 -64.0 + 143.2500 161.5000 -64.0 + 143.2500 166.5000 -64.0 + 141.2500 168.5000 -64.0 + 140.2500 170.5000 -64.0 + 135.2500 174.5000 -64.0 + 128.5000 179.2500 -64.0 + 126.5000 179.2500 -64.0 + 124.5000 180.2500 -64.0 + 120.5000 180.2500 -64.0 + 114.7500 177.5000 -64.0 + 111.7500 172.5000 -64.0 + 111.7500 167.5000 -64.0 + 114.5000 163.7500 -64.0 + 116.5000 162.7500 -64.0 + 122.5000 155.7500 -64.0 + 127.5000 152.7500 -64.0 +} -64.0 +{ -64.0 + 101.7500 165.5000 -64.0 + 102.5000 164.7500 -64.0 + 103.5000 165.7500 -64.0 + 105.5000 164.7500 -64.0 + 106.2500 165.5000 -64.0 + 106.2500 167.5000 -64.0 + 105.5000 169.2500 -64.0 + 103.5000 169.2500 -64.0 +} -64.0 +v 616 z -150.000000 -64.0 +{ -64.0 + 106.2500 26.5000 -64.0 + 111.2500 27.5000 -64.0 + 109.2500 28.5000 -64.0 + 107.5000 32.2500 -64.0 + 105.7500 30.5000 -64.0 + 105.7500 27.5000 -64.0 + 101.5000 27.2500 -64.0 + 102.5000 27.7500 -64.0 + 104.2500 31.5000 -64.0 + 102.5000 32.2500 -64.0 + 100.7500 30.5000 -64.0 + 100.7500 28.5000 -64.0 + 95.5000 31.2500 -64.0 + 94.7500 29.5000 -64.0 + 93.2500 29.5000 -64.0 + 91.2500 33.5000 -64.0 + 90.5000 36.7500 -64.0 + 92.5000 35.7500 -64.0 + 94.2500 37.5000 -64.0 + 95.5000 36.7500 -64.0 + 96.2500 37.5000 -64.0 + 98.5000 37.7500 -64.0 + 99.5000 39.7500 -64.0 + 99.7500 37.5000 -64.0 + 97.7500 35.5000 -64.0 + 99.5000 32.7500 -64.0 + 101.2500 33.5000 -64.0 + 101.2500 35.5000 -64.0 + 105.5000 31.7500 -64.0 + 106.2500 32.5000 -64.0 + 109.5000 32.7500 -64.0 + 112.5000 29.7500 -64.0 + 113.2500 31.5000 -64.0 + 115.5000 32.7500 -64.0 + 117.5000 31.7500 -64.0 + 120.5000 31.7500 -64.0 + 122.7500 27.5000 -64.0 + 120.7500 26.5000 -64.0 + 119.5000 27.2500 -64.0 + 117.5000 26.2500 -64.0 + 118.2500 29.5000 -64.0 + 116.5000 30.2500 -64.0 + 115.7500 28.5000 -64.0 + 112.7500 27.5000 -64.0 + 113.7500 26.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 29.5000 -64.0 + 123.5000 32.2500 -64.0 + 121.5000 32.2500 -64.0 + 122.2500 35.5000 -64.0 + 123.5000 33.7500 -64.0 + 126.5000 33.7500 -64.0 + 128.2500 34.5000 -64.0 + 129.5000 33.7500 -64.0 + 129.7500 29.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 36.5000 -64.0 + 127.2500 38.5000 -64.0 + 128.5000 37.7500 -64.0 + 130.2500 38.5000 -64.0 + 130.2500 41.5000 -64.0 + 129.5000 43.2500 -64.0 + 130.2500 46.5000 -64.0 + 133.2500 47.5000 -64.0 + 132.2500 52.5000 -64.0 + 133.5000 49.7500 -64.0 + 135.2500 50.5000 -64.0 + 135.5000 55.7500 -64.0 + 137.7500 47.5000 -64.0 + 136.7500 45.5000 -64.0 + 136.7500 43.5000 -64.0 + 132.5000 43.2500 -64.0 + 130.7500 42.5000 -64.0 + 130.7500 39.5000 -64.0 + 133.5000 36.7500 -64.0 + 132.5000 36.2500 -64.0 + 130.5000 37.2500 -64.0 +} -64.0 +{ -64.0 + 123.2500 38.5000 -64.0 + 123.2500 40.5000 -64.0 + 123.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 135.2500 39.5000 -64.0 + 134.5000 40.2500 -64.0 + 136.2500 41.5000 -64.0 + 136.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 98.2500 40.5000 -64.0 + 97.2500 41.5000 -64.0 + 98.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 43.5000 -64.0 + 87.2500 46.5000 -64.0 + 85.5000 50.2500 -64.0 + 81.5000 50.2500 -64.0 + 79.5000 51.2500 -64.0 + 80.2500 52.5000 -64.0 + 80.2500 55.5000 -64.0 + 79.5000 57.2500 -64.0 + 78.7500 56.5000 -64.0 + 78.2500 57.5000 -64.0 + 80.5000 60.7500 -64.0 + 80.7500 58.5000 -64.0 + 85.5000 53.7500 -64.0 + 86.5000 54.7500 -64.0 + 88.7500 46.5000 -64.0 + 90.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 95.2500 43.5000 -64.0 + 94.2500 44.5000 -64.0 + 93.2500 49.5000 -64.0 + 94.5000 49.7500 -64.0 + 96.5000 48.7500 -64.0 + 96.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 43.5000 -64.0 + 126.2500 44.5000 -64.0 + 124.5000 46.2500 -64.0 + 124.2500 48.5000 -64.0 + 125.2500 50.5000 -64.0 + 127.5000 50.7500 -64.0 + 126.7500 49.5000 -64.0 + 127.5000 48.7500 -64.0 + 128.2500 49.5000 -64.0 + 128.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 49.5000 -64.0 + 116.2500 50.5000 -64.0 + 117.5000 50.7500 -64.0 + 120.2500 53.5000 -64.0 + 118.5000 54.2500 -64.0 + 117.5000 54.7500 -64.0 + 119.5000 55.7500 -64.0 + 121.2500 56.5000 -64.0 + 120.2500 58.5000 -64.0 + 124.5000 58.7500 -64.0 + 124.7500 56.5000 -64.0 + 125.5000 54.7500 -64.0 + 119.7500 49.5000 -64.0 +} -64.0 +{ -64.0 + 145.2500 53.5000 -64.0 + 144.5000 54.2500 -64.0 + 142.2500 54.5000 -64.0 + 144.5000 54.7500 -64.0 + 146.5000 53.7500 -64.0 + 148.7500 53.5000 -64.0 +} -64.0 +{ -64.0 + 111.2500 56.5000 -64.0 + 110.5000 57.2500 -64.0 + 107.5000 57.2500 -64.0 + 105.5000 58.2500 -64.0 + 101.5000 58.2500 -64.0 + 100.5000 60.2500 -64.0 + 99.7500 59.5000 -64.0 + 98.5000 60.2500 -64.0 + 96.5000 60.2500 -64.0 + 94.5000 61.2500 -64.0 + 92.5000 61.2500 -64.0 + 90.7500 57.5000 -64.0 + 89.5000 58.2500 -64.0 + 89.2500 60.5000 -64.0 + 88.5000 62.2500 -64.0 + 90.2500 65.5000 -64.0 + 92.5000 65.7500 -64.0 + 97.5000 66.7500 -64.0 + 99.5000 65.7500 -64.0 + 101.5000 65.7500 -64.0 + 103.2500 66.5000 -64.0 + 127.7500 66.5000 -64.0 + 123.5000 66.2500 -64.0 + 121.7500 65.5000 -64.0 + 122.7500 63.5000 -64.0 + 118.5000 63.2500 -64.0 + 116.5000 64.2500 -64.0 + 114.5000 64.2500 -64.0 + 112.5000 65.2500 -64.0 + 101.5000 65.2500 -64.0 + 99.7500 64.5000 -64.0 + 100.5000 62.7500 -64.0 + 102.5000 62.7500 -64.0 + 104.5000 61.7500 -64.0 + 107.5000 61.7500 -64.0 + 109.5000 60.7500 -64.0 + 112.5000 60.7500 -64.0 + 114.5000 59.7500 -64.0 + 117.5000 59.7500 -64.0 + 114.5000 58.2500 -64.0 + 113.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 57.5000 -64.0 + 149.5000 58.2500 -64.0 + 143.5000 58.2500 -64.0 + 141.5000 59.2500 -64.0 + 136.5000 59.2500 -64.0 + 137.5000 59.7500 -64.0 + 139.2500 60.5000 -64.0 + 140.5000 59.7500 -64.0 + 141.2500 60.5000 -64.0 + 143.5000 60.7500 -64.0 + 144.2500 62.5000 -64.0 + 142.5000 63.2500 -64.0 + 144.2500 65.5000 -64.0 + 143.5000 66.2500 -64.0 + 141.2500 67.5000 -64.0 + 143.2500 71.5000 -64.0 + 143.2500 73.5000 -64.0 + 141.5000 74.2500 -64.0 + 146.2500 77.5000 -64.0 + 147.2500 79.5000 -64.0 + 152.2500 82.5000 -64.0 + 152.7500 81.5000 -64.0 + 153.5000 79.7500 -64.0 + 155.2500 80.5000 -64.0 + 161.5000 82.7500 -64.0 + 160.7500 81.5000 -64.0 + 156.5000 78.2500 -64.0 + 154.5000 77.2500 -64.0 + 152.7500 76.5000 -64.0 + 147.5000 76.2500 -64.0 + 145.7500 74.5000 -64.0 + 147.5000 73.7500 -64.0 + 147.7500 72.5000 -64.0 + 143.7500 70.5000 -64.0 + 142.7500 68.5000 -64.0 + 144.5000 66.7500 -64.0 + 146.5000 66.7500 -64.0 + 148.5000 65.7500 -64.0 + 155.5000 65.7500 -64.0 + 155.7500 64.5000 -64.0 + 153.7500 63.5000 -64.0 + 152.5000 64.2500 -64.0 + 150.5000 64.2500 -64.0 + 148.7500 63.5000 -64.0 + 149.5000 62.7500 -64.0 + 151.5000 62.7500 -64.0 + 153.5000 61.7500 -64.0 + 152.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 85.2500 58.5000 -64.0 + 85.2500 60.5000 -64.0 + 85.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 61.5000 -64.0 + 65.2500 62.5000 -64.0 + 75.5000 63.7500 -64.0 + 72.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 63.5000 -64.0 + 129.2500 66.5000 -64.0 + 130.5000 65.7500 -64.0 + 132.5000 66.7500 -64.0 +} -64.0 +{ -64.0 + 72.2500 65.5000 -64.0 + 70.5000 66.2500 -64.0 + 77.2500 69.5000 -64.0 + 77.5000 71.7500 -64.0 + 77.7500 68.5000 -64.0 + 75.7500 67.5000 -64.0 + 75.7500 65.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 69.5000 -64.0 + 128.2500 71.5000 -64.0 + 125.5000 74.2500 -64.0 + 92.5000 73.2500 -64.0 + 93.2500 74.5000 -64.0 + 91.5000 75.2500 -64.0 + 89.7500 73.5000 -64.0 + 91.5000 72.7500 -64.0 + 91.7500 70.5000 -64.0 + 88.5000 72.2500 -64.0 + 89.2500 74.5000 -64.0 + 87.5000 75.2500 -64.0 + 88.2500 76.5000 -64.0 + 93.5000 77.7500 -64.0 + 97.2500 81.5000 -64.0 + 100.5000 79.7500 -64.0 + 98.7500 76.5000 -64.0 + 100.5000 75.7500 -64.0 + 103.5000 76.7500 -64.0 + 105.5000 75.7500 -64.0 + 110.5000 76.7500 -64.0 + 113.5000 75.7500 -64.0 + 115.2500 76.5000 -64.0 + 114.5000 78.2500 -64.0 + 117.5000 79.7500 -64.0 + 118.2500 81.5000 -64.0 + 116.5000 83.2500 -64.0 + 116.2500 85.5000 -64.0 + 118.5000 83.7500 -64.0 + 120.5000 83.7500 -64.0 + 124.5000 81.7500 -64.0 + 125.5000 83.7500 -64.0 + 129.5000 80.7500 -64.0 + 131.5000 80.7500 -64.0 + 134.5000 77.2500 -64.0 + 132.5000 78.2500 -64.0 + 127.5000 77.2500 -64.0 + 126.7500 75.5000 -64.0 + 128.5000 73.7500 -64.0 + 130.5000 73.7500 -64.0 +} -64.0 +{ -64.0 + 75.2500 73.5000 -64.0 + 74.5000 74.2500 -64.0 + 69.5000 74.2500 -64.0 + 67.5000 75.2500 -64.0 + 61.5000 75.2500 -64.0 + 59.5000 76.2500 -64.0 + 57.5000 76.2500 -64.0 + 55.5000 77.2500 -64.0 + 53.2500 77.5000 -64.0 + 60.5000 77.7500 -64.0 + 62.5000 76.7500 -64.0 + 67.5000 76.7500 -64.0 + 69.2500 77.5000 -64.0 + 67.5000 78.2500 -64.0 + 61.5000 81.2500 -64.0 + 63.2500 82.5000 -64.0 + 61.5000 86.2500 -64.0 + 61.2500 88.5000 -64.0 + 58.2500 94.5000 -64.0 + 57.2500 99.5000 -64.0 + 54.5000 103.2500 -64.0 + 54.2500 107.5000 -64.0 + 55.2500 109.5000 -64.0 + 58.5000 109.7500 -64.0 + 59.7500 106.5000 -64.0 + 60.5000 104.7500 -64.0 + 59.7500 102.5000 -64.0 + 57.5000 106.2500 -64.0 + 56.7500 105.5000 -64.0 + 56.7500 101.5000 -64.0 + 60.7500 93.5000 -64.0 + 65.5000 85.7500 -64.0 + 67.5000 87.7500 -64.0 + 69.5000 88.7500 -64.0 + 69.7500 86.5000 -64.0 + 68.5000 86.2500 -64.0 + 66.7500 83.5000 -64.0 + 66.7500 81.5000 -64.0 + 70.5000 78.7500 -64.0 + 72.2500 79.5000 -64.0 + 77.5000 74.7500 -64.0 + 79.5000 74.7500 -64.0 + 78.5000 74.2500 -64.0 + 76.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 103.2500 82.5000 -64.0 + 103.5000 82.7500 -64.0 + 105.5000 83.7500 -64.0 + 104.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 84.5000 -64.0 + 130.5000 85.2500 -64.0 + 130.2500 87.5000 -64.0 + 131.5000 87.7500 -64.0 + 131.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 84.5000 -64.0 + 149.5000 88.2500 -64.0 + 152.2500 92.5000 -64.0 + 152.5000 94.7500 -64.0 + 152.7500 90.5000 -64.0 + 153.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 91.5000 -64.0 + 67.5000 92.2500 -64.0 + 62.2500 96.5000 -64.0 + 66.5000 96.7500 -64.0 + 68.7500 92.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 95.5000 -64.0 + 153.2500 97.5000 -64.0 + 153.7500 96.5000 -64.0 +} -64.0 +{ -64.0 + 154.2500 98.5000 -64.0 + 154.2500 99.5000 -64.0 + 155.2500 101.5000 -64.0 + 155.2500 108.5000 -64.0 + 154.5000 110.2500 -64.0 + 153.5000 109.2500 -64.0 + 153.5000 111.7500 -64.0 + 155.5000 112.7500 -64.0 + 157.5000 110.7500 -64.0 + 157.7500 108.5000 -64.0 + 156.7500 106.5000 -64.0 + 156.7500 103.5000 -64.0 +} -64.0 +{ -64.0 + 152.2500 106.5000 -64.0 + 152.2500 108.5000 -64.0 + 152.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 108.5000 -64.0 + 94.5000 114.2500 -64.0 + 91.5000 114.2500 -64.0 + 87.2500 116.5000 -64.0 + 89.5000 116.7500 -64.0 + 96.5000 114.7500 -64.0 + 97.2500 116.5000 -64.0 + 95.5000 118.2500 -64.0 + 91.5000 118.2500 -64.0 + 85.5000 121.2500 -64.0 + 84.7500 119.5000 -64.0 + 86.7500 117.5000 -64.0 + 84.5000 117.2500 -64.0 + 81.5000 120.2500 -64.0 + 83.2500 122.5000 -64.0 + 83.2500 126.5000 -64.0 + 88.5000 121.7500 -64.0 + 90.2500 122.5000 -64.0 + 89.5000 124.2500 -64.0 + 92.2500 130.5000 -64.0 + 88.5000 133.2500 -64.0 + 86.7500 132.5000 -64.0 + 86.7500 130.5000 -64.0 + 83.5000 128.2500 -64.0 + 81.5000 131.2500 -64.0 + 81.2500 134.5000 -64.0 + 87.2500 138.5000 -64.0 + 87.2500 140.5000 -64.0 + 85.5000 141.2500 -64.0 + 84.5000 143.2500 -64.0 + 85.2500 145.5000 -64.0 + 84.5000 147.2500 -64.0 + 81.5000 147.2500 -64.0 + 79.5000 144.2500 -64.0 + 77.5000 143.2500 -64.0 + 73.5000 146.2500 -64.0 + 71.5000 145.2500 -64.0 + 70.7500 143.5000 -64.0 + 66.7500 140.5000 -64.0 + 64.5000 140.2500 -64.0 + 60.5000 138.2500 -64.0 + 59.2500 139.5000 -64.0 + 56.5000 145.2500 -64.0 + 55.5000 144.2500 -64.0 + 52.5000 149.2500 -64.0 + 52.2500 151.5000 -64.0 + 53.5000 152.7500 -64.0 + 55.5000 151.7500 -64.0 + 57.2500 152.5000 -64.0 + 58.2500 161.5000 -64.0 + 63.2500 174.5000 -64.0 + 75.2500 182.5000 -64.0 + 91.5000 182.7500 -64.0 + 91.7500 181.5000 -64.0 + 93.5000 179.7500 -64.0 + 94.2500 180.5000 -64.0 + 96.5000 180.7500 -64.0 + 98.5000 178.7500 -64.0 + 100.2500 180.5000 -64.0 + 100.2500 184.5000 -64.0 + 104.2500 185.5000 -64.0 + 105.5000 184.7500 -64.0 + 107.7500 178.5000 -64.0 + 105.7500 174.5000 -64.0 + 105.7500 171.5000 -64.0 + 107.5000 169.7500 -64.0 + 110.2500 175.5000 -64.0 + 110.2500 177.5000 -64.0 + 111.5000 177.7500 -64.0 + 112.2500 179.5000 -64.0 + 116.5000 180.7500 -64.0 + 119.2500 183.5000 -64.0 + 127.5000 183.7500 -64.0 + 137.5000 178.7500 -64.0 + 143.5000 172.7500 -64.0 + 146.7500 162.5000 -64.0 + 145.7500 159.5000 -64.0 + 141.5000 157.2500 -64.0 + 140.7500 155.5000 -64.0 + 134.7500 150.5000 -64.0 + 128.5000 150.2500 -64.0 + 125.7500 147.5000 -64.0 + 125.7500 142.5000 -64.0 + 124.5000 142.2500 -64.0 + 121.2500 145.5000 -64.0 + 118.5000 151.2500 -64.0 + 109.5000 157.2500 -64.0 + 101.5000 157.2500 -64.0 + 94.7500 151.5000 -64.0 + 91.7500 146.5000 -64.0 + 91.7500 142.5000 -64.0 + 90.7500 140.5000 -64.0 + 90.7500 135.5000 -64.0 + 91.7500 132.5000 -64.0 + 97.5000 125.7500 -64.0 + 97.7500 123.5000 -64.0 + 96.5000 122.2500 -64.0 + 94.5000 125.2500 -64.0 + 92.7500 124.5000 -64.0 + 93.5000 123.7500 -64.0 + 91.7500 121.5000 -64.0 + 94.5000 119.7500 -64.0 + 96.5000 119.7500 -64.0 + 98.5000 117.7500 -64.0 + 102.5000 115.7500 -64.0 + 104.2500 116.5000 -64.0 + 105.2500 122.5000 -64.0 + 108.5000 124.7500 -64.0 + 111.5000 121.7500 -64.0 + 111.7500 117.5000 -64.0 + 113.5000 116.7500 -64.0 + 115.2500 117.5000 -64.0 + 118.2500 121.5000 -64.0 + 118.2500 124.5000 -64.0 + 121.2500 130.5000 -64.0 + 121.2500 133.5000 -64.0 + 122.2500 136.5000 -64.0 + 123.7500 136.5000 -64.0 + 124.7500 134.5000 -64.0 + 121.7500 130.5000 -64.0 + 122.5000 128.7500 -64.0 + 127.2500 135.5000 -64.0 + 127.2500 138.5000 -64.0 + 129.5000 138.7500 -64.0 + 131.5000 135.7500 -64.0 + 131.7500 126.5000 -64.0 + 133.5000 124.7500 -64.0 + 133.7500 122.5000 -64.0 + 132.7500 120.5000 -64.0 + 130.5000 122.2500 -64.0 + 131.2500 123.5000 -64.0 + 130.5000 124.2500 -64.0 + 128.7500 122.5000 -64.0 + 126.5000 122.2500 -64.0 + 124.7500 120.5000 -64.0 + 120.5000 119.2500 -64.0 + 117.7500 116.5000 -64.0 + 118.5000 114.7500 -64.0 + 128.2500 119.5000 -64.0 + 129.7500 118.5000 -64.0 + 122.7500 114.5000 -64.0 + 117.5000 113.2500 -64.0 + 110.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 142.2500 113.5000 -64.0 + 142.2500 114.5000 -64.0 + 143.5000 114.7500 -64.0 +} -64.0 +{ -64.0 + 68.2500 114.5000 -64.0 + 67.2500 116.5000 -64.0 + 69.5000 116.7500 -64.0 + 69.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 50.2500 128.5000 -64.0 + 48.5000 129.2500 -64.0 + 46.5000 133.2500 -64.0 + 46.2500 140.5000 -64.0 + 45.2500 142.5000 -64.0 + 46.2500 144.5000 -64.0 + 46.2500 147.5000 -64.0 + 47.5000 148.7500 -64.0 + 50.5000 144.7500 -64.0 + 50.7500 142.5000 -64.0 + 49.5000 142.2500 -64.0 + 46.7500 138.5000 -64.0 + 49.5000 135.7500 -64.0 + 54.5000 137.7500 -64.0 + 55.5000 134.7500 -64.0 + 53.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 158.2500 131.5000 -64.0 + 157.5000 132.2500 -64.0 + 154.2500 132.5000 -64.0 + 158.2500 140.5000 -64.0 + 161.2500 144.5000 -64.0 + 162.7500 144.5000 -64.0 + 161.7500 142.5000 -64.0 + 161.7500 138.5000 -64.0 + 162.5000 136.7500 -64.0 + 161.7500 135.5000 -64.0 + 161.7500 133.5000 -64.0 + 159.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 125.7500 30.5000 -64.0 + 126.5000 29.7500 -64.0 + 128.2500 30.5000 -64.0 + 129.2500 32.5000 -64.0 + 127.5000 33.2500 -64.0 +} -64.0 +{ -64.0 + 93.7500 35.5000 -64.0 + 94.5000 34.7500 -64.0 + 95.2500 35.5000 -64.0 + 94.5000 36.2500 -64.0 +} -64.0 +{ -64.0 + 97.7500 64.5000 -64.0 + 98.5000 63.7500 -64.0 + 99.2500 64.5000 -64.0 + 98.5000 65.2500 -64.0 +} -64.0 +{ -64.0 + 150.7500 78.5000 -64.0 + 151.5000 77.7500 -64.0 + 152.2500 78.5000 -64.0 + 151.5000 79.2500 -64.0 +} -64.0 +{ -64.0 + 118.7500 82.5000 -64.0 + 119.5000 81.7500 -64.0 + 120.2500 82.5000 -64.0 + 119.5000 83.2500 -64.0 +} -64.0 +{ -64.0 + 106.7500 118.5000 -64.0 + 108.5000 117.7500 -64.0 + 109.2500 119.5000 -64.0 + 108.5000 121.2500 -64.0 + 106.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 122.5000 122.7500 -64.0 + 125.5000 123.7500 -64.0 + 128.2500 127.5000 -64.0 + 127.5000 129.2500 -64.0 + 123.5000 124.2500 -64.0 + 121.5000 125.2500 -64.0 + 120.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 72.7500 149.5000 -64.0 + 73.5000 148.7500 -64.0 + 75.5000 149.7500 -64.0 + 78.5000 152.7500 -64.0 + 80.5000 153.7500 -64.0 + 84.5000 158.7500 -64.0 + 89.2500 165.5000 -64.0 + 89.2500 168.5000 -64.0 + 85.5000 172.2500 -64.0 + 82.5000 172.2500 -64.0 + 80.5000 173.2500 -64.0 + 79.7500 172.5000 -64.0 + 77.5000 172.2500 -64.0 + 72.5000 170.2500 -64.0 + 69.5000 167.2500 -64.0 + 67.5000 166.2500 -64.0 + 64.7500 162.5000 -64.0 + 64.7500 160.5000 -64.0 + 63.7500 158.5000 -64.0 + 63.7500 156.5000 -64.0 + 69.5000 149.7500 -64.0 +} -64.0 +{ -64.0 + 121.7500 152.5000 -64.0 + 122.5000 151.7500 -64.0 + 123.2500 152.5000 -64.0 + 122.5000 153.2500 -64.0 +} -64.0 +{ -64.0 + 128.7500 156.5000 -64.0 + 129.5000 155.7500 -64.0 + 135.5000 155.7500 -64.0 + 140.2500 159.5000 -64.0 + 140.2500 162.5000 -64.0 + 138.2500 166.5000 -64.0 + 135.5000 170.2500 -64.0 + 131.5000 173.2500 -64.0 + 127.5000 175.2500 -64.0 + 122.5000 175.2500 -64.0 + 118.7500 172.5000 -64.0 + 118.7500 169.5000 -64.0 + 119.5000 167.7500 -64.0 + 123.7500 161.5000 -64.0 + 124.7500 159.5000 -64.0 +} -64.0 +v 544 z -152.000000 -64.0 +{ -64.0 + 105.2500 26.5000 -64.0 + 104.5000 27.2500 -64.0 + 101.5000 27.2500 -64.0 + 100.2500 28.5000 -64.0 + 101.2500 30.5000 -64.0 + 101.2500 32.5000 -64.0 + 102.5000 32.7500 -64.0 + 104.5000 30.7500 -64.0 + 108.5000 30.7500 -64.0 + 112.5000 28.7500 -64.0 + 114.2500 29.5000 -64.0 + 117.5000 29.7500 -64.0 + 119.5000 27.7500 -64.0 + 122.5000 27.7500 -64.0 + 121.7500 26.5000 -64.0 + 118.5000 26.2500 -64.0 + 117.5000 28.2500 -64.0 + 114.5000 28.2500 -64.0 + 112.7500 27.5000 -64.0 + 113.7500 26.5000 -64.0 + 110.5000 26.2500 -64.0 + 112.2500 27.5000 -64.0 + 111.5000 28.2500 -64.0 + 107.5000 30.2500 -64.0 + 105.7500 28.5000 -64.0 + 106.7500 26.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 29.5000 -64.0 + 92.2500 32.5000 -64.0 + 90.5000 33.2500 -64.0 + 90.2500 36.5000 -64.0 + 92.5000 33.7500 -64.0 + 93.2500 34.5000 -64.0 + 94.5000 33.7500 -64.0 + 95.2500 34.5000 -64.0 + 94.5000 35.2500 -64.0 + 96.5000 36.7500 -64.0 + 96.7500 34.5000 -64.0 + 98.5000 32.7500 -64.0 + 98.5000 30.2500 -64.0 + 94.5000 32.2500 -64.0 +} -64.0 +{ -64.0 + 126.2500 29.5000 -64.0 + 126.2500 30.5000 -64.0 + 127.2500 32.5000 -64.0 + 128.7500 32.5000 -64.0 + 130.5000 29.2500 -64.0 + 128.5000 30.2500 -64.0 +} -64.0 +{ -64.0 + 131.2500 32.5000 -64.0 + 129.2500 33.5000 -64.0 + 132.5000 33.7500 -64.0 + 133.7500 32.5000 -64.0 +} -64.0 +{ -64.0 + 99.2500 33.5000 -64.0 + 99.2500 36.5000 -64.0 + 97.5000 37.7500 -64.0 + 102.5000 38.7500 -64.0 + 99.7500 36.5000 -64.0 + 100.7500 33.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 35.5000 -64.0 + 129.5000 36.7500 -64.0 + 132.5000 35.7500 -64.0 + 133.2500 37.5000 -64.0 + 135.7500 35.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 37.5000 -64.0 + 122.2500 39.5000 -64.0 + 122.7500 38.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 38.5000 -64.0 + 91.2500 40.5000 -64.0 + 91.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 39.5000 -64.0 + 133.2500 40.5000 -64.0 + 135.5000 40.7500 -64.0 + 136.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 42.5000 -64.0 + 87.5000 47.2500 -64.0 + 88.2500 49.5000 -64.0 + 90.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 95.2500 43.5000 -64.0 + 95.2500 44.5000 -64.0 + 96.5000 44.7500 -64.0 + 97.2500 46.5000 -64.0 + 96.5000 48.2500 -64.0 + 94.2500 49.5000 -64.0 + 96.5000 49.7500 -64.0 + 98.2500 50.5000 -64.0 + 92.5000 55.2500 -64.0 + 90.5000 56.2500 -64.0 + 90.5000 57.7500 -64.0 + 92.5000 56.7500 -64.0 + 95.5000 56.7500 -64.0 + 107.5000 50.7500 -64.0 + 109.5000 50.7500 -64.0 + 109.7500 49.5000 -64.0 + 108.5000 49.2500 -64.0 + 106.7500 47.5000 -64.0 + 102.5000 47.2500 -64.0 + 98.5000 45.2500 -64.0 +} -64.0 +{ -64.0 + 133.2500 43.5000 -64.0 + 134.2500 45.5000 -64.0 + 135.5000 44.7500 -64.0 + 134.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 45.5000 -64.0 + 137.5000 47.2500 -64.0 + 134.5000 47.2500 -64.0 + 136.2500 48.5000 -64.0 + 135.2500 50.5000 -64.0 + 137.2500 54.5000 -64.0 + 136.2500 55.5000 -64.0 + 142.5000 55.7500 -64.0 + 143.7500 54.5000 -64.0 + 139.5000 54.2500 -64.0 + 137.7500 53.5000 -64.0 + 136.7500 51.5000 -64.0 + 144.5000 47.7500 -64.0 + 144.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 46.5000 -64.0 + 114.2500 47.5000 -64.0 + 115.7500 46.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 46.5000 -64.0 + 121.5000 47.2500 -64.0 + 119.2500 47.5000 -64.0 + 122.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 48.5000 -64.0 + 121.2500 51.5000 -64.0 + 121.2500 53.5000 -64.0 + 119.5000 54.2500 -64.0 + 116.5000 53.2500 -64.0 + 114.5000 54.2500 -64.0 + 113.7500 53.5000 -64.0 + 114.7500 52.5000 -64.0 + 111.5000 52.2500 -64.0 + 112.2500 54.5000 -64.0 + 105.2500 58.5000 -64.0 + 107.5000 58.7500 -64.0 + 114.5000 56.7500 -64.0 + 115.5000 57.7500 -64.0 + 118.5000 56.7500 -64.0 + 122.5000 53.7500 -64.0 + 124.5000 54.7500 -64.0 + 123.7500 53.5000 -64.0 + 125.7500 50.5000 -64.0 + 122.5000 50.2500 -64.0 + 118.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 50.5000 -64.0 + 70.5000 51.2500 -64.0 + 74.5000 56.7500 -64.0 + 76.5000 57.7500 -64.0 + 75.7500 56.5000 -64.0 + 76.5000 54.7500 -64.0 + 80.2500 56.5000 -64.0 + 85.5000 56.7500 -64.0 + 87.5000 54.7500 -64.0 + 86.5000 53.2500 -64.0 + 82.5000 56.2500 -64.0 + 80.7500 55.5000 -64.0 + 79.7500 53.5000 -64.0 + 74.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 57.5000 -64.0 + 120.2500 58.5000 -64.0 + 125.5000 58.7500 -64.0 + 124.7500 57.5000 -64.0 +} -64.0 +{ -64.0 + 77.2500 58.5000 -64.0 + 76.5000 59.2500 -64.0 + 73.5000 59.2500 -64.0 + 75.2500 60.5000 -64.0 + 78.5000 60.7500 -64.0 + 78.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 148.2500 58.5000 -64.0 + 146.5000 60.2500 -64.0 + 143.5000 60.2500 -64.0 + 145.2500 61.5000 -64.0 + 144.5000 62.2500 -64.0 + 140.2500 62.5000 -64.0 + 141.2500 64.5000 -64.0 + 140.2500 65.5000 -64.0 + 141.2500 67.5000 -64.0 + 143.5000 67.7500 -64.0 + 145.2500 69.5000 -64.0 + 144.5000 70.2500 -64.0 + 138.2500 70.5000 -64.0 + 142.5000 70.7500 -64.0 + 144.2500 71.5000 -64.0 + 143.5000 72.2500 -64.0 + 140.5000 72.7500 -64.0 + 146.2500 75.5000 -64.0 + 149.5000 75.7500 -64.0 + 155.2500 78.5000 -64.0 + 154.5000 80.2500 -64.0 + 147.5000 77.2500 -64.0 + 147.2500 78.5000 -64.0 + 151.5000 81.7500 -64.0 + 155.5000 83.7500 -64.0 + 157.5000 81.7500 -64.0 + 159.2500 82.5000 -64.0 + 163.5000 82.7500 -64.0 + 160.5000 81.2500 -64.0 + 156.7500 77.5000 -64.0 + 157.7500 76.5000 -64.0 + 152.7500 73.5000 -64.0 + 150.5000 73.2500 -64.0 + 148.7500 71.5000 -64.0 + 150.5000 69.7500 -64.0 + 152.7500 69.5000 -64.0 + 144.7500 66.5000 -64.0 + 145.5000 65.7500 -64.0 + 144.7500 64.5000 -64.0 + 145.5000 63.7500 -64.0 + 149.5000 63.7500 -64.0 + 150.5000 61.7500 -64.0 + 153.5000 61.7500 -64.0 + 153.7500 60.5000 -64.0 + 150.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 59.5000 -64.0 + 93.2500 60.5000 -64.0 + 91.2500 62.5000 -64.0 + 93.5000 62.7500 -64.0 + 95.2500 63.5000 -64.0 + 97.5000 62.7500 -64.0 + 101.2500 64.5000 -64.0 + 108.5000 64.7500 -64.0 + 112.5000 66.7500 -64.0 + 114.5000 65.7500 -64.0 + 116.5000 65.7500 -64.0 + 118.5000 64.7500 -64.0 + 125.5000 64.7500 -64.0 + 126.7500 62.5000 -64.0 + 118.5000 62.2500 -64.0 + 120.2500 63.5000 -64.0 + 119.5000 64.2500 -64.0 + 116.5000 63.2500 -64.0 + 114.7500 62.5000 -64.0 + 95.5000 62.2500 -64.0 + 93.7500 61.5000 -64.0 + 95.5000 60.7500 -64.0 +} -64.0 +{ -64.0 + 76.2500 63.5000 -64.0 + 70.2500 67.5000 -64.0 + 76.5000 67.7500 -64.0 + 78.5000 68.7500 -64.0 + 78.7500 65.5000 -64.0 + 77.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 63.5000 -64.0 + 128.5000 64.2500 -64.0 + 129.5000 65.7500 -64.0 + 131.5000 66.7500 -64.0 + 130.7500 65.5000 -64.0 + 130.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 67.5000 -64.0 + 128.5000 68.2500 -64.0 + 122.5000 68.2500 -64.0 + 123.2500 69.5000 -64.0 + 125.5000 68.7500 -64.0 + 130.5000 69.7500 -64.0 +} -64.0 +{ -64.0 + 76.2500 69.5000 -64.0 + 74.5000 71.7500 -64.0 + 76.5000 72.7500 -64.0 + 79.5000 71.7500 -64.0 + 78.5000 71.2500 -64.0 + 77.7500 69.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 70.5000 -64.0 + 96.2500 74.5000 -64.0 + 94.5000 75.2500 -64.0 + 91.5000 74.2500 -64.0 + 90.5000 72.2500 -64.0 + 87.5000 76.2500 -64.0 + 86.7500 75.5000 -64.0 + 86.2500 76.5000 -64.0 + 90.5000 81.7500 -64.0 + 91.5000 76.7500 -64.0 + 97.2500 82.5000 -64.0 + 98.2500 84.5000 -64.0 + 101.2500 85.5000 -64.0 + 102.5000 84.7500 -64.0 + 105.5000 84.7500 -64.0 + 106.2500 86.5000 -64.0 + 107.5000 86.7500 -64.0 + 110.5000 85.7500 -64.0 + 110.7500 84.5000 -64.0 + 105.7500 83.5000 -64.0 + 105.7500 80.5000 -64.0 + 101.7500 74.5000 -64.0 + 98.5000 73.2500 -64.0 + 94.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 71.5000 -64.0 + 131.5000 72.2500 -64.0 + 127.5000 72.2500 -64.0 + 129.2500 73.5000 -64.0 + 131.5000 73.7500 -64.0 + 134.5000 74.7500 -64.0 +} -64.0 +{ -64.0 + 121.2500 72.5000 -64.0 + 117.5000 75.2500 -64.0 + 118.5000 75.7500 -64.0 + 119.2500 77.5000 -64.0 + 120.5000 76.7500 -64.0 + 121.2500 77.5000 -64.0 + 123.5000 75.7500 -64.0 + 122.5000 75.2500 -64.0 +} -64.0 +{ -64.0 + 104.2500 73.5000 -64.0 + 107.2500 75.5000 -64.0 + 108.7500 75.5000 -64.0 + 109.7500 73.5000 -64.0 + 108.5000 73.2500 -64.0 + 106.5000 74.2500 -64.0 + 105.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 76.5000 -64.0 + 124.2500 78.5000 -64.0 + 125.7500 76.5000 -64.0 +} -64.0 +{ -64.0 + 69.2500 77.5000 -64.0 + 66.5000 79.2500 -64.0 + 64.5000 79.2500 -64.0 + 60.5000 82.2500 -64.0 + 61.5000 82.7500 -64.0 + 63.5000 81.7500 -64.0 + 64.2500 82.5000 -64.0 + 62.2500 86.5000 -64.0 + 54.2500 106.5000 -64.0 + 55.2500 108.5000 -64.0 + 58.7500 108.5000 -64.0 + 61.5000 102.7500 -64.0 + 61.7500 100.5000 -64.0 + 60.5000 100.2500 -64.0 + 60.2500 101.5000 -64.0 + 58.5000 103.2500 -64.0 + 56.7500 102.5000 -64.0 + 61.5000 92.7500 -64.0 + 61.7500 90.5000 -64.0 + 64.7500 86.5000 -64.0 + 66.5000 85.7500 -64.0 + 68.2500 86.5000 -64.0 + 68.2500 88.5000 -64.0 + 70.2500 89.5000 -64.0 + 64.5000 94.2500 -64.0 + 62.5000 94.2500 -64.0 + 62.2500 95.5000 -64.0 + 66.5000 96.7500 -64.0 + 66.7500 95.5000 -64.0 + 69.7500 92.5000 -64.0 + 70.7500 90.5000 -64.0 + 71.5000 87.2500 -64.0 + 69.5000 86.2500 -64.0 + 65.7500 80.5000 -64.0 + 71.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 151.2500 85.5000 -64.0 + 148.5000 88.2500 -64.0 + 151.2500 90.5000 -64.0 + 152.2500 95.5000 -64.0 + 150.5000 96.2500 -64.0 + 154.2500 99.5000 -64.0 + 154.2500 104.5000 -64.0 + 153.5000 106.2500 -64.0 + 151.5000 103.2500 -64.0 + 151.2500 105.5000 -64.0 + 154.2500 111.5000 -64.0 + 156.5000 111.7500 -64.0 + 156.7500 104.5000 -64.0 + 155.7500 102.5000 -64.0 + 155.7500 100.5000 -64.0 + 153.7500 96.5000 -64.0 + 153.7500 94.5000 -64.0 + 152.7500 92.5000 -64.0 + 152.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 146.2500 89.5000 -64.0 + 143.5000 91.2500 -64.0 + 144.2500 92.5000 -64.0 + 147.7500 89.5000 -64.0 +} -64.0 +{ -64.0 + 146.2500 96.5000 -64.0 + 146.5000 96.7500 -64.0 + 148.5000 97.7500 -64.0 + 148.7500 96.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 107.5000 -64.0 + 105.5000 108.2500 -64.0 + 94.5000 114.2500 -64.0 + 92.2500 114.5000 -64.0 + 97.5000 114.7500 -64.0 + 99.2500 115.5000 -64.0 + 96.5000 118.2500 -64.0 + 88.5000 122.2500 -64.0 + 86.5000 122.2500 -64.0 + 83.5000 123.2500 -64.0 + 81.7500 120.5000 -64.0 + 82.7500 118.5000 -64.0 + 80.5000 118.2500 -64.0 + 78.5000 120.7500 -64.0 + 82.2500 123.5000 -64.0 + 82.2500 126.5000 -64.0 + 80.2500 132.5000 -64.0 + 81.2500 135.5000 -64.0 + 84.2500 137.5000 -64.0 + 90.5000 134.7500 -64.0 + 90.7500 132.5000 -64.0 + 89.5000 131.2500 -64.0 + 87.5000 130.2500 -64.0 + 85.7500 129.5000 -64.0 + 87.7500 125.5000 -64.0 + 94.5000 121.7500 -64.0 + 96.5000 121.7500 -64.0 + 102.5000 114.7500 -64.0 + 103.2500 116.5000 -64.0 + 102.2500 118.5000 -64.0 + 103.2500 121.5000 -64.0 + 106.2500 124.5000 -64.0 + 110.7500 124.5000 -64.0 + 113.7500 118.5000 -64.0 + 114.5000 116.7500 -64.0 + 117.2500 119.5000 -64.0 + 117.5000 122.7500 -64.0 + 119.5000 123.7500 -64.0 + 123.2500 126.5000 -64.0 + 123.2500 128.5000 -64.0 + 124.2500 130.5000 -64.0 + 122.5000 131.2500 -64.0 + 121.5000 133.2500 -64.0 + 121.2500 135.5000 -64.0 + 126.5000 138.7500 -64.0 + 128.5000 137.7500 -64.0 + 130.7500 137.5000 -64.0 + 132.7500 133.5000 -64.0 + 131.7500 131.5000 -64.0 + 131.7500 127.5000 -64.0 + 133.5000 123.7500 -64.0 + 136.5000 123.7500 -64.0 + 136.7500 122.5000 -64.0 + 133.7500 120.5000 -64.0 + 131.2500 125.5000 -64.0 + 129.5000 126.2500 -64.0 + 125.7500 123.5000 -64.0 + 124.7500 121.5000 -64.0 + 123.5000 121.2500 -64.0 + 115.7500 115.5000 -64.0 + 116.5000 113.7500 -64.0 + 118.5000 114.7500 -64.0 + 123.5000 115.7500 -64.0 + 127.2500 118.5000 -64.0 + 129.5000 118.7500 -64.0 + 127.5000 117.2500 -64.0 + 113.5000 110.2500 -64.0 + 109.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 69.2500 113.5000 -64.0 + 68.5000 114.7500 -64.0 + 70.5000 115.7500 -64.0 + 70.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 115.5000 -64.0 + 85.5000 116.2500 -64.0 + 85.2500 117.5000 -64.0 + 90.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 51.2500 129.5000 -64.0 + 49.2500 130.5000 -64.0 + 47.5000 134.2500 -64.0 + 47.2500 142.5000 -64.0 + 48.2500 144.5000 -64.0 + 50.5000 142.7500 -64.0 + 53.5000 137.7500 -64.0 + 53.7500 131.5000 -64.0 + 52.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 141.5000 -64.0 + 87.5000 142.2500 -64.0 + 86.5000 145.2500 -64.0 + 86.2500 149.5000 -64.0 + 84.5000 151.2500 -64.0 + 81.7500 148.5000 -64.0 + 77.5000 148.2500 -64.0 + 76.5000 150.2500 -64.0 + 74.5000 150.2500 -64.0 + 72.5000 151.2500 -64.0 + 71.7500 150.5000 -64.0 + 68.5000 150.2500 -64.0 + 66.7500 146.5000 -64.0 + 62.5000 143.2500 -64.0 + 60.5000 144.2500 -64.0 + 60.2500 151.5000 -64.0 + 61.2500 153.5000 -64.0 + 61.2500 156.5000 -64.0 + 63.2500 160.5000 -64.0 + 64.2500 168.5000 -64.0 + 66.2500 172.5000 -64.0 + 71.2500 175.5000 -64.0 + 73.5000 174.7500 -64.0 + 80.5000 176.7500 -64.0 + 83.5000 175.7500 -64.0 + 85.5000 172.7500 -64.0 + 89.5000 170.7500 -64.0 + 89.7500 168.5000 -64.0 + 91.5000 167.7500 -64.0 + 93.2500 168.5000 -64.0 + 96.5000 167.7500 -64.0 + 101.5000 168.7500 -64.0 + 104.2500 171.5000 -64.0 + 107.5000 166.7500 -64.0 + 109.5000 165.7500 -64.0 + 112.5000 166.7500 -64.0 + 115.5000 169.7500 -64.0 + 117.5000 170.7500 -64.0 + 118.2500 172.5000 -64.0 + 121.5000 172.7500 -64.0 + 123.5000 171.7500 -64.0 + 126.2500 175.5000 -64.0 + 131.5000 175.7500 -64.0 + 137.5000 172.7500 -64.0 + 140.7500 168.5000 -64.0 + 139.7500 166.5000 -64.0 + 139.7500 163.5000 -64.0 + 136.7500 159.5000 -64.0 + 130.5000 154.2500 -64.0 + 127.5000 155.2500 -64.0 + 125.7500 154.5000 -64.0 + 126.7500 151.5000 -64.0 + 124.7500 150.5000 -64.0 + 121.5000 150.2500 -64.0 + 119.5000 152.2500 -64.0 + 108.5000 159.2500 -64.0 + 105.7500 157.5000 -64.0 + 100.5000 156.2500 -64.0 + 97.5000 153.2500 -64.0 + 95.5000 152.2500 -64.0 + 90.7500 144.5000 -64.0 + 90.7500 142.5000 -64.0 +} -64.0 +{ -64.0 + 122.7500 51.5000 -64.0 + 123.5000 50.7500 -64.0 + 124.2500 51.5000 -64.0 + 123.5000 52.2500 -64.0 +} -64.0 +{ -64.0 + 121.7500 63.5000 -64.0 + 122.5000 62.7500 -64.0 + 124.2500 63.5000 -64.0 + 123.5000 64.2500 -64.0 +} -64.0 +{ -64.0 + 107.7500 118.5000 -64.0 + 108.5000 117.7500 -64.0 + 110.5000 117.7500 -64.0 + 111.2500 119.5000 -64.0 + 109.5000 121.2500 -64.0 + 107.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 88.7500 153.5000 -64.0 + 90.5000 152.7500 -64.0 + 93.2500 156.5000 -64.0 + 92.5000 158.2500 -64.0 + 90.5000 158.2500 -64.0 + 88.7500 156.5000 -64.0 +} -64.0 +{ -64.0 + 120.7500 156.5000 -64.0 + 121.5000 155.7500 -64.0 + 122.2500 156.5000 -64.0 + 121.5000 157.2500 -64.0 +} -64.0 +{ -64.0 + 71.7500 160.5000 -64.0 + 73.5000 159.7500 -64.0 + 75.2500 161.5000 -64.0 + 74.5000 163.2500 -64.0 + 73.7500 162.5000 -64.0 + 72.5000 163.2500 -64.0 + 71.7500 162.5000 -64.0 +} -64.0 +v 350 z -154.000000 -64.0 +{ -64.0 + 105.2500 26.5000 -64.0 + 103.5000 27.2500 -64.0 + 105.2500 28.5000 -64.0 + 107.5000 28.7500 -64.0 + 105.7500 27.5000 -64.0 + 106.5000 26.7500 -64.0 + 108.2500 27.5000 -64.0 + 114.5000 27.7500 -64.0 + 116.5000 26.7500 -64.0 +} -64.0 +{ -64.0 + 122.2500 27.5000 -64.0 + 123.2500 28.5000 -64.0 + 123.7500 27.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 28.5000 -64.0 + 100.2500 29.5000 -64.0 + 102.5000 29.7500 -64.0 +} -64.0 +{ -64.0 + 97.2500 30.5000 -64.0 + 98.2500 31.5000 -64.0 + 98.5000 33.7500 -64.0 + 98.7500 30.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 30.5000 -64.0 + 126.2500 33.5000 -64.0 + 128.5000 33.7500 -64.0 + 128.7500 32.5000 -64.0 + 127.7500 30.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 34.5000 -64.0 + 96.2500 35.5000 -64.0 + 97.5000 35.7500 -64.0 + 97.7500 34.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 36.5000 -64.0 + 91.2500 38.5000 -64.0 + 92.5000 37.7500 -64.0 + 94.2500 38.5000 -64.0 + 94.2500 40.5000 -64.0 + 92.2500 41.5000 -64.0 + 94.5000 41.7500 -64.0 + 94.7500 38.5000 -64.0 + 93.7500 36.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 36.5000 -64.0 + 129.5000 37.2500 -64.0 + 130.2500 38.5000 -64.0 + 130.2500 41.5000 -64.0 + 131.2500 43.5000 -64.0 + 130.2500 44.5000 -64.0 + 131.2500 46.5000 -64.0 + 130.5000 48.2500 -64.0 + 126.7500 46.5000 -64.0 + 125.5000 47.2500 -64.0 + 127.2500 49.5000 -64.0 + 129.5000 48.7500 -64.0 + 132.5000 49.7500 -64.0 + 135.2500 53.5000 -64.0 + 135.2500 55.5000 -64.0 + 134.2500 58.5000 -64.0 + 135.7500 57.5000 -64.0 + 136.7500 55.5000 -64.0 + 135.7500 52.5000 -64.0 + 131.7500 47.5000 -64.0 + 133.7500 43.5000 -64.0 + 134.5000 41.7500 -64.0 + 134.5000 40.2500 -64.0 + 132.5000 41.2500 -64.0 + 130.7500 40.5000 -64.0 + 130.7500 38.5000 -64.0 + 132.5000 37.7500 -64.0 + 132.7500 36.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 39.5000 -64.0 + 96.2500 40.5000 -64.0 + 97.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 95.2500 45.5000 -64.0 + 94.5000 46.2500 -64.0 + 94.5000 47.7500 -64.0 + 96.5000 48.7500 -64.0 + 96.7500 47.5000 -64.0 + 98.5000 45.7500 -64.0 + 100.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 52.5000 -64.0 + 126.2500 53.5000 -64.0 + 126.7500 54.5000 -64.0 + 127.7500 52.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 53.5000 -64.0 + 114.2500 54.5000 -64.0 + 118.5000 54.7500 -64.0 + 121.7500 53.5000 -64.0 + 119.5000 53.2500 -64.0 + 117.5000 54.2500 -64.0 +} -64.0 +{ -64.0 + 85.2500 54.5000 -64.0 + 82.5000 56.2500 -64.0 + 80.7500 55.5000 -64.0 + 76.5000 55.2500 -64.0 + 76.2500 56.5000 -64.0 + 81.2500 60.5000 -64.0 + 83.5000 56.7500 -64.0 + 86.5000 56.7500 -64.0 + 86.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 56.5000 -64.0 + 89.2500 57.5000 -64.0 + 90.5000 56.7500 -64.0 + 91.2500 57.5000 -64.0 + 91.7500 56.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 59.5000 -64.0 + 126.5000 61.2500 -64.0 + 124.5000 61.2500 -64.0 + 124.2500 62.5000 -64.0 + 130.7500 61.5000 -64.0 + 128.5000 61.2500 -64.0 +} -64.0 +{ -64.0 + 91.2500 62.5000 -64.0 + 90.2500 63.5000 -64.0 + 95.5000 63.7500 -64.0 +} -64.0 +{ -64.0 + 83.2500 64.5000 -64.0 + 81.5000 65.7500 -64.0 + 83.5000 66.7500 -64.0 + 84.5000 64.7500 -64.0 + 87.5000 65.7500 -64.0 + 86.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 88.2500 66.5000 -64.0 + 89.2500 68.5000 -64.0 + 88.5000 70.2500 -64.0 + 86.7500 69.5000 -64.0 + 85.5000 71.2500 -64.0 + 83.5000 71.2500 -64.0 + 84.2500 72.5000 -64.0 + 87.5000 72.7500 -64.0 + 90.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 65.2500 82.5000 -64.0 + 59.5000 92.2500 -64.0 + 55.5000 102.2500 -64.0 + 55.5000 107.7500 -64.0 + 57.5000 108.7500 -64.0 + 62.5000 100.7500 -64.0 + 61.7500 99.5000 -64.0 + 58.5000 105.2500 -64.0 + 57.7500 104.5000 -64.0 + 57.7500 101.5000 -64.0 + 61.5000 93.7500 -64.0 + 61.7500 91.5000 -64.0 + 65.7500 85.5000 -64.0 + 67.5000 84.7500 -64.0 + 70.2500 87.5000 -64.0 + 70.2500 89.5000 -64.0 + 66.5000 93.2500 -64.0 + 63.5000 93.2500 -64.0 + 63.2500 94.5000 -64.0 + 64.5000 94.7500 -64.0 + 65.2500 96.5000 -64.0 + 70.5000 92.7500 -64.0 + 73.5000 87.7500 -64.0 + 71.7500 85.5000 -64.0 + 69.5000 85.2500 -64.0 + 67.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 85.5000 -64.0 + 147.2500 87.5000 -64.0 + 142.5000 89.2500 -64.0 + 142.2500 91.5000 -64.0 + 143.2500 94.5000 -64.0 + 149.2500 100.5000 -64.0 + 152.2500 106.5000 -64.0 + 153.2500 111.5000 -64.0 + 154.5000 111.7500 -64.0 + 156.5000 110.7500 -64.0 + 156.7500 103.5000 -64.0 + 155.7500 101.5000 -64.0 + 155.7500 99.5000 -64.0 + 153.7500 95.5000 -64.0 + 153.7500 92.5000 -64.0 + 151.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 107.5000 -64.0 + 106.5000 108.2500 -64.0 + 100.5000 111.2500 -64.0 + 98.5000 111.2500 -64.0 + 92.5000 114.2500 -64.0 + 90.5000 114.2500 -64.0 + 86.5000 116.2500 -64.0 + 84.5000 116.2500 -64.0 + 84.2500 117.5000 -64.0 + 85.5000 116.7500 -64.0 + 87.5000 116.7500 -64.0 + 91.5000 114.7500 -64.0 + 96.5000 114.7500 -64.0 + 98.2500 115.5000 -64.0 + 97.2500 118.5000 -64.0 + 94.5000 121.2500 -64.0 + 92.5000 121.2500 -64.0 + 90.5000 122.2500 -64.0 + 90.5000 123.7500 -64.0 + 92.5000 122.7500 -64.0 + 96.5000 122.7500 -64.0 + 98.5000 121.7500 -64.0 + 98.7500 118.5000 -64.0 + 99.7500 115.5000 -64.0 + 102.5000 113.7500 -64.0 + 103.2500 114.5000 -64.0 + 103.2500 116.5000 -64.0 + 102.2500 119.5000 -64.0 + 103.2500 121.5000 -64.0 + 104.5000 123.7500 -64.0 + 108.5000 125.7500 -64.0 + 112.5000 122.7500 -64.0 + 112.7500 120.5000 -64.0 + 113.5000 118.7500 -64.0 + 112.7500 117.5000 -64.0 + 112.7500 115.5000 -64.0 + 114.5000 114.7500 -64.0 + 116.2500 116.5000 -64.0 + 116.2500 120.5000 -64.0 + 117.2500 123.5000 -64.0 + 119.2500 124.5000 -64.0 + 120.5000 123.7500 -64.0 + 122.5000 122.7500 -64.0 + 123.2500 124.5000 -64.0 + 121.5000 126.2500 -64.0 + 121.2500 133.5000 -64.0 + 123.2500 137.5000 -64.0 + 129.5000 137.7500 -64.0 + 132.5000 134.7500 -64.0 + 132.7500 131.5000 -64.0 + 130.7500 127.5000 -64.0 + 132.7500 123.5000 -64.0 + 131.5000 123.2500 -64.0 + 131.2500 124.5000 -64.0 + 129.5000 126.2500 -64.0 + 128.5000 125.2500 -64.0 + 128.2500 127.5000 -64.0 + 129.2500 129.5000 -64.0 + 129.2500 133.5000 -64.0 + 127.5000 134.2500 -64.0 + 125.7500 133.5000 -64.0 + 125.7500 131.5000 -64.0 + 127.5000 129.2500 -64.0 + 125.5000 128.2500 -64.0 + 124.7500 126.5000 -64.0 + 125.7500 123.5000 -64.0 + 123.7500 121.5000 -64.0 + 121.5000 121.2500 -64.0 + 117.7500 118.5000 -64.0 + 117.7500 115.5000 -64.0 + 119.5000 114.7500 -64.0 + 124.5000 115.7500 -64.0 + 121.7500 113.5000 -64.0 + 119.5000 113.2500 -64.0 + 116.5000 112.2500 -64.0 + 111.5000 110.2500 -64.0 + 108.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 70.2500 112.5000 -64.0 + 70.2500 114.5000 -64.0 + 71.5000 114.7500 -64.0 + 71.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 125.2500 116.5000 -64.0 + 125.5000 116.7500 -64.0 + 127.5000 117.7500 -64.0 + 130.2500 120.5000 -64.0 + 133.5000 120.7500 -64.0 + 134.5000 120.2500 -64.0 + 132.5000 119.2500 -64.0 + 126.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 77.2500 119.5000 -64.0 + 75.2500 122.5000 -64.0 + 76.5000 121.7500 -64.0 + 81.5000 121.7500 -64.0 + 80.5000 121.2500 -64.0 + 79.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 122.5000 -64.0 + 136.2500 123.5000 -64.0 + 138.2500 124.5000 -64.0 + 139.7500 124.5000 -64.0 + 138.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 123.5000 -64.0 + 80.5000 130.2500 -64.0 + 80.2500 132.5000 -64.0 + 82.2500 136.5000 -64.0 + 87.5000 136.7500 -64.0 + 90.5000 131.7500 -64.0 + 88.7500 129.5000 -64.0 + 88.7500 125.5000 -64.0 + 86.5000 125.2500 -64.0 +} -64.0 +{ -64.0 + 139.2500 131.5000 -64.0 + 138.5000 132.2500 -64.0 + 139.5000 132.7500 -64.0 + 140.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 50.2500 134.5000 -64.0 + 49.5000 136.2500 -64.0 + 49.2500 140.5000 -64.0 + 50.5000 140.7500 -64.0 + 52.5000 138.7500 -64.0 + 52.7500 136.5000 -64.0 + 51.7500 134.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 148.5000 -64.0 + 89.5000 150.2500 -64.0 + 87.5000 150.2500 -64.0 + 87.2500 152.5000 -64.0 + 84.5000 154.2500 -64.0 + 86.2500 158.5000 -64.0 + 87.5000 157.7500 -64.0 + 88.2500 158.5000 -64.0 + 88.2500 160.5000 -64.0 + 93.2500 161.5000 -64.0 + 95.5000 160.7500 -64.0 + 98.7500 156.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 153.5000 -64.0 + 115.2500 156.5000 -64.0 + 114.2500 158.5000 -64.0 + 117.5000 159.7500 -64.0 + 119.5000 158.7500 -64.0 + 121.5000 158.7500 -64.0 + 123.7500 155.5000 -64.0 + 122.7500 153.5000 -64.0 +} -64.0 +{ -64.0 + 65.2500 157.5000 -64.0 + 65.2500 158.5000 -64.0 + 66.2500 160.5000 -64.0 + 66.2500 163.5000 -64.0 + 67.7500 161.5000 -64.0 + 66.7500 158.5000 -64.0 +} -64.0 +{ -64.0 + 71.2500 160.5000 -64.0 + 71.2500 166.5000 -64.0 + 74.5000 166.7500 -64.0 + 76.7500 163.5000 -64.0 + 73.7500 160.5000 -64.0 +} -64.0 +{ -64.0 + 104.2500 161.5000 -64.0 + 103.2500 162.5000 -64.0 + 104.2500 165.5000 -64.0 + 105.5000 164.7500 -64.0 + 105.7500 161.5000 -64.0 +} -64.0 +{ -64.0 + 148.5000 87.7500 -64.0 + 149.2500 88.5000 -64.0 + 151.2500 92.5000 -64.0 + 151.2500 94.5000 -64.0 + 154.2500 100.5000 -64.0 + 154.2500 104.5000 -64.0 + 153.5000 106.2500 -64.0 + 150.7500 101.5000 -64.0 + 150.7500 99.5000 -64.0 + 148.7500 98.5000 -64.0 + 148.7500 96.5000 -64.0 + 145.7500 93.5000 -64.0 + 144.7500 91.5000 -64.0 +} -64.0 +{ -64.0 + 108.7500 116.5000 -64.0 + 109.5000 115.7500 -64.0 + 111.2500 117.5000 -64.0 + 110.5000 119.2500 -64.0 + 109.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 104.7500 117.5000 -64.0 + 105.5000 116.7500 -64.0 + 107.2500 117.5000 -64.0 + 106.5000 119.2500 -64.0 + 108.2500 121.5000 -64.0 + 107.5000 122.2500 -64.0 + 104.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 82.7500 131.5000 -64.0 + 84.5000 130.7500 -64.0 + 85.2500 132.5000 -64.0 + 83.5000 133.2500 -64.0 +} -64.0 +v 204 z -156.000000 -64.0 +{ -64.0 + 89.2500 58.5000 -64.0 + 88.5000 59.2500 -64.0 + 88.5000 60.7500 -64.0 + 90.5000 61.7500 -64.0 + 90.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 135.2500 65.5000 -64.0 + 134.2500 67.5000 -64.0 + 135.5000 67.7500 -64.0 +} -64.0 +{ -64.0 + 80.2500 72.5000 -64.0 + 77.5000 74.2500 -64.0 + 77.2500 76.5000 -64.0 + 80.5000 76.7500 -64.0 + 82.5000 75.7500 -64.0 + 82.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 136.2500 73.5000 -64.0 + 135.5000 74.2500 -64.0 + 136.5000 74.7500 -64.0 + 139.7500 75.5000 -64.0 + 138.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 75.5000 -64.0 + 131.5000 76.2500 -64.0 + 131.2500 78.5000 -64.0 + 133.7500 80.5000 -64.0 + 132.7500 77.5000 -64.0 + 134.7500 75.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 76.5000 -64.0 + 140.2500 77.5000 -64.0 + 139.2500 80.5000 -64.0 + 140.5000 79.7500 -64.0 + 140.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 66.2500 81.5000 -64.0 + 58.5000 94.2500 -64.0 + 55.2500 106.5000 -64.0 + 57.2500 108.5000 -64.0 + 58.5000 107.7500 -64.0 + 63.5000 98.7500 -64.0 + 62.5000 97.2500 -64.0 + 62.2500 99.5000 -64.0 + 59.5000 103.2500 -64.0 + 58.7500 102.5000 -64.0 + 58.7500 99.5000 -64.0 + 60.5000 95.7500 -64.0 + 60.7500 93.5000 -64.0 + 66.5000 84.7500 -64.0 + 68.5000 84.7500 -64.0 + 72.2500 87.5000 -64.0 + 66.5000 93.2500 -64.0 + 64.2500 92.5000 -64.0 + 65.2500 95.5000 -64.0 + 66.5000 95.7500 -64.0 + 73.7500 89.5000 -64.0 + 74.7500 87.5000 -64.0 + 73.7500 85.5000 -64.0 + 71.5000 85.2500 -64.0 + 67.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 148.2500 85.5000 -64.0 + 145.5000 87.2500 -64.0 + 143.5000 87.2500 -64.0 + 141.5000 88.2500 -64.0 + 141.2500 91.5000 -64.0 + 145.2500 95.5000 -64.0 + 152.2500 106.5000 -64.0 + 153.2500 111.5000 -64.0 + 154.5000 111.7500 -64.0 + 156.5000 110.7500 -64.0 + 156.7500 103.5000 -64.0 + 154.7500 99.5000 -64.0 + 154.7500 97.5000 -64.0 + 153.7500 95.5000 -64.0 + 153.7500 91.5000 -64.0 + 150.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 72.2500 110.5000 -64.0 + 71.2500 112.5000 -64.0 + 72.5000 112.7500 -64.0 +} -64.0 +{ -64.0 + 105.2500 110.5000 -64.0 + 103.5000 114.2500 -64.0 + 103.2500 122.5000 -64.0 + 105.2500 124.5000 -64.0 + 110.5000 124.7500 -64.0 + 113.5000 119.7500 -64.0 + 112.7500 116.5000 -64.0 + 109.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 95.2500 112.5000 -64.0 + 94.5000 113.2500 -64.0 + 91.5000 113.2500 -64.0 + 83.5000 117.2500 -64.0 + 81.5000 117.2500 -64.0 + 77.5000 119.2500 -64.0 + 75.5000 119.2500 -64.0 + 76.2500 120.5000 -64.0 + 76.5000 122.7500 -64.0 + 79.5000 118.7500 -64.0 + 83.5000 118.7500 -64.0 + 91.5000 114.7500 -64.0 + 96.5000 114.7500 -64.0 + 98.2500 115.5000 -64.0 + 95.2500 120.5000 -64.0 + 90.2500 122.5000 -64.0 + 89.2500 127.5000 -64.0 + 87.5000 128.2500 -64.0 + 88.2500 130.5000 -64.0 + 87.5000 132.2500 -64.0 + 85.5000 133.2500 -64.0 + 83.7500 132.5000 -64.0 + 83.7500 130.5000 -64.0 + 84.7500 127.5000 -64.0 + 86.5000 126.7500 -64.0 + 86.7500 125.5000 -64.0 + 84.5000 122.2500 -64.0 + 84.2500 124.5000 -64.0 + 83.2500 127.5000 -64.0 + 80.5000 130.2500 -64.0 + 80.2500 133.5000 -64.0 + 83.2500 136.5000 -64.0 + 88.5000 136.7500 -64.0 + 93.5000 128.7500 -64.0 + 93.7500 126.5000 -64.0 + 94.5000 124.7500 -64.0 + 98.5000 121.7500 -64.0 + 98.7500 116.5000 -64.0 + 101.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 113.5000 -64.0 + 117.2500 117.5000 -64.0 + 116.5000 118.2500 -64.0 + 116.2500 120.5000 -64.0 + 121.2500 130.5000 -64.0 + 121.2500 137.5000 -64.0 + 122.2500 139.5000 -64.0 + 125.5000 139.7500 -64.0 + 130.5000 137.7500 -64.0 + 134.5000 134.7500 -64.0 + 136.5000 134.7500 -64.0 + 140.5000 130.2500 -64.0 + 138.5000 131.2500 -64.0 + 133.5000 131.2500 -64.0 + 130.7500 127.5000 -64.0 + 131.7500 126.5000 -64.0 + 132.7500 121.5000 -64.0 + 127.7500 116.5000 -64.0 + 122.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 82.2500 120.5000 -64.0 + 83.2500 121.5000 -64.0 + 83.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 121.5000 -64.0 + 137.2500 123.5000 -64.0 + 138.5000 122.7500 -64.0 + 141.5000 122.7500 -64.0 + 139.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 74.2500 128.5000 -64.0 + 75.2500 130.5000 -64.0 + 77.5000 130.7500 -64.0 + 75.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 146.5000 -64.0 + 107.5000 149.2500 -64.0 + 103.5000 149.2500 -64.0 + 99.7500 147.5000 -64.0 + 97.5000 147.2500 -64.0 + 97.2500 148.5000 -64.0 + 98.5000 149.7500 -64.0 + 106.5000 153.7500 -64.0 + 112.5000 150.7500 -64.0 + 114.7500 150.5000 -64.0 + 115.7500 148.5000 -64.0 + 114.7500 146.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 154.5000 -64.0 + 92.2500 156.5000 -64.0 + 93.5000 156.7500 -64.0 + 93.7500 155.5000 -64.0 +} -64.0 +{ -64.0 + 146.7500 88.5000 -64.0 + 148.5000 87.7500 -64.0 + 150.2500 89.5000 -64.0 + 150.2500 91.5000 -64.0 + 153.2500 97.5000 -64.0 + 154.2500 102.5000 -64.0 + 153.5000 104.2500 -64.0 + 143.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 108.7500 115.5000 -64.0 + 109.5000 114.7500 -64.0 + 110.2500 115.5000 -64.0 + 111.2500 117.5000 -64.0 + 110.5000 119.2500 -64.0 + 108.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 118.7500 115.5000 -64.0 + 119.5000 114.7500 -64.0 + 121.5000 114.7500 -64.0 + 127.5000 117.7500 -64.0 + 130.2500 121.5000 -64.0 + 130.2500 125.5000 -64.0 + 129.5000 127.2500 -64.0 + 130.2500 128.5000 -64.0 + 128.5000 132.2500 -64.0 + 126.5000 133.2500 -64.0 + 123.7500 130.5000 -64.0 + 121.7500 126.5000 -64.0 + 121.7500 123.5000 -64.0 + 120.5000 123.2500 -64.0 + 119.7500 121.5000 -64.0 + 117.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 104.7500 116.5000 -64.0 + 105.5000 115.7500 -64.0 + 107.2500 116.5000 -64.0 + 107.2500 119.5000 -64.0 + 106.5000 121.2500 -64.0 + 104.7500 119.5000 -64.0 +} -64.0 +v 273 z -158.000000 -64.0 +{ -64.0 + 128.2500 61.5000 -64.0 + 128.2500 62.5000 -64.0 + 127.2500 64.5000 -64.0 + 128.2500 66.5000 -64.0 + 128.2500 68.5000 -64.0 + 127.5000 70.2500 -64.0 + 122.5000 70.2500 -64.0 + 120.5000 71.2500 -64.0 + 113.5000 71.2500 -64.0 + 110.2500 72.5000 -64.0 + 121.5000 72.7500 -64.0 + 123.5000 71.7500 -64.0 + 129.5000 71.7500 -64.0 + 128.7500 70.5000 -64.0 + 128.7500 66.5000 -64.0 + 129.5000 64.7500 -64.0 + 131.5000 63.7500 -64.0 +} -64.0 +{ -64.0 + 136.2500 62.5000 -64.0 + 135.5000 63.2500 -64.0 + 136.5000 63.7500 -64.0 + 137.2500 65.5000 -64.0 + 138.7500 62.5000 -64.0 +} -64.0 +{ -64.0 + 81.2500 63.5000 -64.0 + 80.5000 65.2500 -64.0 + 75.5000 64.2500 -64.0 + 74.5000 67.2500 -64.0 + 76.2500 71.5000 -64.0 + 78.5000 68.7500 -64.0 + 81.5000 68.7500 -64.0 + 83.2500 70.5000 -64.0 + 83.5000 73.7500 -64.0 + 83.7500 69.5000 -64.0 + 81.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 68.5000 -64.0 + 149.5000 69.2500 -64.0 + 147.5000 69.2500 -64.0 + 141.5000 72.2500 -64.0 + 139.7500 71.5000 -64.0 + 137.5000 72.2500 -64.0 + 138.2500 73.5000 -64.0 + 139.5000 72.7500 -64.0 + 142.5000 72.7500 -64.0 + 144.2500 73.5000 -64.0 + 142.2500 74.5000 -64.0 + 143.2500 76.5000 -64.0 + 143.2500 78.5000 -64.0 + 145.7500 78.5000 -64.0 + 146.7500 76.5000 -64.0 + 144.7500 75.5000 -64.0 + 146.5000 73.7500 -64.0 + 148.5000 73.7500 -64.0 + 149.5000 71.7500 -64.0 + 153.5000 69.7500 -64.0 + 155.5000 69.7500 -64.0 + 154.7500 68.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 72.5000 -64.0 + 131.2500 73.5000 -64.0 + 127.5000 75.2500 -64.0 + 127.2500 76.5000 -64.0 + 129.2500 77.5000 -64.0 + 127.5000 79.2500 -64.0 + 121.5000 79.2500 -64.0 + 119.7500 78.5000 -64.0 + 101.5000 78.2500 -64.0 + 99.7500 77.5000 -64.0 + 88.5000 77.2500 -64.0 + 84.7500 75.5000 -64.0 + 81.5000 78.2500 -64.0 + 78.2500 78.5000 -64.0 + 79.2500 81.5000 -64.0 + 82.5000 81.7500 -64.0 + 85.5000 78.7500 -64.0 + 89.5000 78.7500 -64.0 + 91.5000 79.7500 -64.0 + 93.5000 78.7500 -64.0 + 109.5000 78.7500 -64.0 + 111.2500 79.5000 -64.0 + 128.5000 80.7500 -64.0 + 130.5000 78.7500 -64.0 + 131.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 79.5000 -64.0 + 131.2500 80.5000 -64.0 + 132.5000 80.7500 -64.0 +} -64.0 +{ -64.0 + 67.2500 80.5000 -64.0 + 65.5000 81.2500 -64.0 + 65.2500 82.5000 -64.0 + 58.2500 95.5000 -64.0 + 57.2500 100.5000 -64.0 + 55.2500 104.5000 -64.0 + 56.2500 107.5000 -64.0 + 58.7500 107.5000 -64.0 + 64.7500 96.5000 -64.0 + 63.5000 96.2500 -64.0 + 63.2500 97.5000 -64.0 + 59.5000 102.2500 -64.0 + 58.7500 101.5000 -64.0 + 59.7500 97.5000 -64.0 + 64.7500 87.5000 -64.0 + 68.5000 83.7500 -64.0 + 73.2500 85.5000 -64.0 + 73.2500 87.5000 -64.0 + 65.2500 93.5000 -64.0 + 66.2500 95.5000 -64.0 + 74.5000 89.7500 -64.0 + 76.5000 86.7500 -64.0 + 75.5000 85.2500 -64.0 +} -64.0 +{ -64.0 + 148.2500 80.5000 -64.0 + 151.2500 82.5000 -64.0 + 157.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 149.2500 83.5000 -64.0 + 147.2500 86.5000 -64.0 + 148.5000 86.7500 -64.0 + 151.2500 91.5000 -64.0 + 151.2500 93.5000 -64.0 + 153.2500 97.5000 -64.0 + 153.2500 99.5000 -64.0 + 154.2500 101.5000 -64.0 + 153.5000 103.2500 -64.0 + 151.7500 102.5000 -64.0 + 150.7500 100.5000 -64.0 + 149.5000 101.2500 -64.0 + 152.2500 106.5000 -64.0 + 153.2500 111.5000 -64.0 + 154.5000 111.7500 -64.0 + 156.5000 110.7500 -64.0 + 156.7500 105.5000 -64.0 + 154.7500 101.5000 -64.0 + 154.7500 99.5000 -64.0 + 153.7500 97.5000 -64.0 + 153.7500 92.5000 -64.0 + 151.7500 88.5000 -64.0 + 151.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 139.2500 88.5000 -64.0 + 139.2500 91.5000 -64.0 + 142.5000 92.7500 -64.0 + 148.7500 98.5000 -64.0 + 147.7500 95.5000 -64.0 + 140.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 73.2500 109.5000 -64.0 + 72.2500 111.5000 -64.0 + 73.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 112.5000 -64.0 + 88.5000 114.2500 -64.0 + 84.5000 118.2500 -64.0 + 84.2500 120.5000 -64.0 + 85.2500 122.5000 -64.0 + 85.2500 125.5000 -64.0 + 82.5000 128.2500 -64.0 + 80.5000 129.2500 -64.0 + 73.7500 126.5000 -64.0 + 72.2500 126.5000 -64.0 + 76.2500 129.5000 -64.0 + 80.2500 136.5000 -64.0 + 85.2500 138.5000 -64.0 + 89.5000 138.7500 -64.0 + 91.5000 136.7500 -64.0 + 91.7500 132.5000 -64.0 + 94.5000 128.7500 -64.0 + 94.7500 126.5000 -64.0 + 98.5000 120.7500 -64.0 + 99.7500 114.5000 -64.0 + 97.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 112.5000 -64.0 + 104.5000 113.2500 -64.0 + 103.2500 116.5000 -64.0 + 102.2500 121.5000 -64.0 + 107.2500 124.5000 -64.0 + 108.5000 123.7500 -64.0 + 111.5000 123.7500 -64.0 + 113.5000 121.7500 -64.0 + 113.7500 119.5000 -64.0 + 111.7500 114.5000 -64.0 + 108.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 113.5000 -64.0 + 117.5000 114.2500 -64.0 + 117.2500 118.5000 -64.0 + 116.5000 120.2500 -64.0 + 118.2500 123.5000 -64.0 + 118.2500 125.5000 -64.0 + 122.2500 133.5000 -64.0 + 121.2500 136.5000 -64.0 + 118.2500 140.5000 -64.0 + 117.2500 142.5000 -64.0 + 112.5000 145.2500 -64.0 + 108.5000 147.2500 -64.0 + 105.5000 147.2500 -64.0 + 96.5000 144.2500 -64.0 + 93.5000 145.2500 -64.0 + 93.2500 146.5000 -64.0 + 94.2500 148.5000 -64.0 + 100.2500 152.5000 -64.0 + 102.5000 152.7500 -64.0 + 104.2500 154.5000 -64.0 + 106.5000 154.7500 -64.0 + 112.5000 151.7500 -64.0 + 118.7500 149.5000 -64.0 + 119.7500 147.5000 -64.0 + 118.7500 144.5000 -64.0 + 119.5000 142.7500 -64.0 + 121.5000 141.7500 -64.0 + 123.5000 142.7500 -64.0 + 125.5000 141.7500 -64.0 + 127.5000 141.7500 -64.0 + 131.5000 139.7500 -64.0 + 132.7500 135.5000 -64.0 + 139.5000 130.7500 -64.0 + 141.5000 129.7500 -64.0 + 138.5000 128.2500 -64.0 + 134.5000 131.2500 -64.0 + 131.7500 129.5000 -64.0 + 131.7500 127.5000 -64.0 + 130.5000 126.2500 -64.0 + 130.2500 129.5000 -64.0 + 128.5000 131.2500 -64.0 + 124.5000 131.2500 -64.0 + 121.7500 128.5000 -64.0 + 118.7500 122.5000 -64.0 + 118.7500 119.5000 -64.0 + 120.5000 115.7500 -64.0 + 125.5000 115.7500 -64.0 + 128.2500 118.5000 -64.0 + 130.5000 122.7500 -64.0 + 130.7500 120.5000 -64.0 + 129.7500 118.5000 -64.0 + 123.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 74.2500 118.5000 -64.0 + 75.5000 118.7500 -64.0 + 77.2500 120.5000 -64.0 + 79.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 91.7500 115.5000 -64.0 + 92.5000 114.7500 -64.0 + 95.5000 114.7500 -64.0 + 97.2500 116.5000 -64.0 + 93.5000 124.2500 -64.0 + 93.2500 126.5000 -64.0 + 90.5000 129.2500 -64.0 + 87.5000 129.2500 -64.0 + 85.7500 127.5000 -64.0 + 85.7500 119.5000 -64.0 + 88.5000 115.7500 -64.0 +} -64.0 +{ -64.0 + 104.7500 115.5000 -64.0 + 105.5000 114.7500 -64.0 + 107.2500 115.5000 -64.0 + 107.2500 117.5000 -64.0 + 108.7500 117.5000 -64.0 + 107.7500 115.5000 -64.0 + 108.5000 114.7500 -64.0 + 111.2500 116.5000 -64.0 + 111.2500 120.5000 -64.0 + 109.5000 122.2500 -64.0 + 108.7500 121.5000 -64.0 + 106.5000 122.2500 -64.0 + 103.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 125.7500 136.5000 -64.0 + 127.5000 135.7500 -64.0 + 129.2500 136.5000 -64.0 + 127.5000 137.2500 -64.0 +} -64.0 +{ -64.0 + 113.7500 147.5000 -64.0 + 114.5000 146.7500 -64.0 + 115.2500 148.5000 -64.0 + 113.5000 150.2500 -64.0 + 111.5000 150.2500 -64.0 + 109.7500 149.5000 -64.0 +} -64.0 +{ -64.0 + 97.7500 148.5000 -64.0 + 99.5000 147.7500 -64.0 + 103.2500 150.5000 -64.0 + 102.5000 151.2500 -64.0 + 101.7500 150.5000 -64.0 + 99.5000 150.2500 -64.0 +} -64.0 +{ -64.0 + 104.7500 151.5000 -64.0 + 105.5000 150.7500 -64.0 + 106.2500 151.5000 -64.0 + 105.5000 152.2500 -64.0 +} -64.0 +v 370 z -160.000000 -64.0 +{ -64.0 + 105.2500 33.5000 -64.0 + 103.2500 34.5000 -64.0 + 106.5000 34.7500 -64.0 + 108.5000 33.7500 -64.0 + 110.5000 34.7500 -64.0 + 112.5000 33.7500 -64.0 + 117.5000 34.7500 -64.0 + 119.2500 36.5000 -64.0 + 120.5000 35.7500 -64.0 + 122.7500 39.5000 -64.0 + 123.7500 37.5000 -64.0 + 122.7500 35.5000 -64.0 + 120.5000 35.2500 -64.0 + 118.7500 33.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 38.5000 -64.0 + 87.5000 42.2500 -64.0 + 87.2500 45.5000 -64.0 + 89.2500 47.5000 -64.0 + 92.5000 43.7500 -64.0 + 93.7500 44.5000 -64.0 + 94.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 43.5000 -64.0 + 96.5000 44.2500 -64.0 + 94.5000 45.2500 -64.0 + 97.2500 47.5000 -64.0 + 96.2500 50.5000 -64.0 + 98.5000 48.7500 -64.0 + 100.5000 48.7500 -64.0 + 100.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 80.2500 47.5000 -64.0 + 78.5000 48.2500 -64.0 + 81.2500 50.5000 -64.0 + 81.2500 54.5000 -64.0 + 79.5000 58.2500 -64.0 + 78.5000 57.2500 -64.0 + 78.2500 62.5000 -64.0 + 75.5000 65.2500 -64.0 + 77.5000 68.7500 -64.0 + 79.5000 65.7500 -64.0 + 79.7500 63.5000 -64.0 + 82.5000 59.7500 -64.0 + 83.2500 60.5000 -64.0 + 83.5000 65.7500 -64.0 + 83.7500 62.5000 -64.0 + 85.7500 58.5000 -64.0 + 86.7500 53.5000 -64.0 + 88.5000 51.7500 -64.0 + 88.7500 49.5000 -64.0 + 83.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 143.2500 51.5000 -64.0 + 140.2500 54.5000 -64.0 + 139.2500 56.5000 -64.0 + 135.5000 59.2500 -64.0 + 135.2500 61.5000 -64.0 + 136.5000 61.7500 -64.0 + 138.5000 60.7500 -64.0 + 140.2500 61.5000 -64.0 + 140.2500 64.5000 -64.0 + 141.7500 62.5000 -64.0 + 140.7500 60.5000 -64.0 + 141.5000 59.2500 -64.0 + 139.5000 60.2500 -64.0 + 138.7500 58.5000 -64.0 + 141.5000 56.7500 -64.0 + 142.2500 58.5000 -64.0 + 148.7500 57.5000 -64.0 + 149.7500 55.5000 -64.0 + 147.7500 54.5000 -64.0 + 145.5000 55.2500 -64.0 + 143.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 52.5000 -64.0 + 93.5000 52.7500 -64.0 + 103.2500 59.5000 -64.0 + 103.2500 61.5000 -64.0 + 97.5000 64.2500 -64.0 + 95.5000 64.2500 -64.0 + 92.2500 66.5000 -64.0 + 91.2500 68.5000 -64.0 + 98.5000 68.7500 -64.0 + 105.5000 66.7500 -64.0 + 114.5000 65.7500 -64.0 + 122.5000 62.7500 -64.0 + 120.7500 61.5000 -64.0 + 111.5000 61.2500 -64.0 + 94.7500 52.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 61.5000 -64.0 + 127.2500 62.5000 -64.0 + 127.7500 61.5000 -64.0 +} -64.0 +{ -64.0 + 55.2500 62.5000 -64.0 + 56.2500 64.5000 -64.0 + 60.2500 65.5000 -64.0 + 66.5000 65.7500 -64.0 + 65.7500 64.5000 -64.0 + 59.5000 63.2500 -64.0 +} -64.0 +{ -64.0 + 152.2500 67.5000 -64.0 + 151.5000 68.2500 -64.0 + 148.2500 68.5000 -64.0 + 150.5000 68.7500 -64.0 + 152.2500 69.5000 -64.0 + 149.5000 72.2500 -64.0 + 145.5000 75.2500 -64.0 + 143.5000 76.2500 -64.0 + 144.5000 77.7500 -64.0 + 146.5000 76.7500 -64.0 + 148.5000 76.7500 -64.0 + 150.5000 77.7500 -64.0 + 152.5000 76.7500 -64.0 + 155.5000 76.7500 -64.0 + 154.7500 74.5000 -64.0 + 159.5000 70.7500 -64.0 + 159.7500 68.5000 -64.0 + 157.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 68.5000 -64.0 + 111.5000 71.2500 -64.0 + 112.2500 72.5000 -64.0 + 125.7500 72.5000 -64.0 + 120.7500 71.5000 -64.0 + 123.5000 69.7500 -64.0 + 127.5000 69.7500 -64.0 + 127.7500 68.5000 -64.0 + 126.5000 69.2500 -64.0 + 125.7500 68.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 72.5000 -64.0 + 68.5000 73.7500 -64.0 + 72.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 86.2500 72.5000 -64.0 + 86.2500 73.5000 -64.0 + 87.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 72.5000 -64.0 + 128.2500 73.5000 -64.0 + 126.5000 75.2500 -64.0 + 128.2500 77.5000 -64.0 + 124.5000 79.2500 -64.0 + 122.7500 78.5000 -64.0 + 104.5000 78.2500 -64.0 + 102.7500 77.5000 -64.0 + 85.5000 76.2500 -64.0 + 84.7500 74.5000 -64.0 + 82.5000 75.2500 -64.0 + 84.2500 76.5000 -64.0 + 88.2500 77.5000 -64.0 + 82.5000 80.2500 -64.0 + 81.7500 79.5000 -64.0 + 79.5000 79.2500 -64.0 + 81.2500 80.5000 -64.0 + 81.2500 83.5000 -64.0 + 84.5000 81.7500 -64.0 + 88.5000 82.7500 -64.0 + 88.7500 80.5000 -64.0 + 90.5000 79.7500 -64.0 + 95.5000 80.7500 -64.0 + 97.5000 82.7500 -64.0 + 99.5000 81.7500 -64.0 + 103.2500 82.5000 -64.0 + 101.5000 83.2500 -64.0 + 104.2500 84.5000 -64.0 + 105.5000 83.7500 -64.0 + 104.7500 82.5000 -64.0 + 105.5000 81.7500 -64.0 + 107.2500 82.5000 -64.0 + 117.5000 83.7500 -64.0 + 121.5000 81.7500 -64.0 + 124.2500 83.5000 -64.0 + 123.2500 87.5000 -64.0 + 125.2500 88.5000 -64.0 + 124.2500 91.5000 -64.0 + 125.5000 91.7500 -64.0 + 126.2500 93.5000 -64.0 + 124.2500 95.5000 -64.0 + 125.7500 95.5000 -64.0 + 128.7500 88.5000 -64.0 + 132.5000 84.7500 -64.0 + 136.7500 82.5000 -64.0 + 133.5000 82.2500 -64.0 + 131.5000 83.2500 -64.0 + 129.7500 82.5000 -64.0 + 130.7500 77.5000 -64.0 + 129.5000 77.2500 -64.0 + 127.7500 75.5000 -64.0 + 129.7500 72.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 78.5000 -64.0 + 63.5000 79.2500 -64.0 + 58.5000 79.2500 -64.0 + 54.5000 82.2500 -64.0 + 52.5000 82.2500 -64.0 + 50.5000 83.2500 -64.0 + 50.2500 85.5000 -64.0 + 51.5000 84.7500 -64.0 + 53.5000 84.7500 -64.0 + 55.5000 83.7500 -64.0 + 58.5000 83.7500 -64.0 + 62.5000 81.7500 -64.0 + 64.5000 81.7500 -64.0 + 65.2500 83.5000 -64.0 + 64.2500 86.5000 -64.0 + 57.2500 98.5000 -64.0 + 56.2500 105.5000 -64.0 + 57.2500 107.5000 -64.0 + 58.7500 107.5000 -64.0 + 59.7500 105.5000 -64.0 + 62.7500 98.5000 -64.0 + 59.5000 101.2500 -64.0 + 58.7500 100.5000 -64.0 + 59.5000 99.7500 -64.0 + 59.7500 97.5000 -64.0 + 66.7500 83.5000 -64.0 + 68.5000 82.7500 -64.0 + 68.7500 81.5000 -64.0 + 69.5000 79.7500 -64.0 + 71.7500 78.5000 -64.0 +} -64.0 +{ -64.0 + 75.2500 79.5000 -64.0 + 75.2500 80.5000 -64.0 + 72.5000 83.2500 -64.0 + 72.2500 87.5000 -64.0 + 69.5000 91.2500 -64.0 + 67.2500 92.5000 -64.0 + 66.2500 94.5000 -64.0 + 67.5000 94.7500 -64.0 + 69.5000 92.7500 -64.0 + 70.2500 93.5000 -64.0 + 71.7500 93.5000 -64.0 + 72.7500 91.5000 -64.0 + 76.7500 87.5000 -64.0 + 77.7500 85.5000 -64.0 + 75.7500 83.5000 -64.0 + 75.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 148.2500 82.5000 -64.0 + 148.2500 84.5000 -64.0 + 150.2500 86.5000 -64.0 + 150.2500 88.5000 -64.0 + 152.5000 93.7500 -64.0 + 152.7500 91.5000 -64.0 + 150.7500 87.5000 -64.0 + 150.7500 84.5000 -64.0 + 152.5000 83.7500 -64.0 + 159.5000 85.7500 -64.0 + 162.5000 84.7500 -64.0 + 160.7500 83.5000 -64.0 + 156.7500 82.5000 -64.0 +} -64.0 +{ -64.0 + 139.2500 88.5000 -64.0 + 139.2500 89.5000 -64.0 + 140.2500 91.5000 -64.0 + 142.5000 91.7500 -64.0 +} -64.0 +{ -64.0 + 121.2500 101.5000 -64.0 + 121.2500 102.5000 -64.0 + 121.7500 103.5000 -64.0 + 122.7500 101.5000 -64.0 +} -64.0 +{ -64.0 + 154.2500 101.5000 -64.0 + 154.2500 104.5000 -64.0 + 153.5000 106.2500 -64.0 + 152.7500 105.5000 -64.0 + 152.2500 106.5000 -64.0 + 153.2500 108.5000 -64.0 + 153.2500 110.5000 -64.0 + 154.5000 111.7500 -64.0 + 156.7500 108.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 112.5000 -64.0 + 90.5000 113.2500 -64.0 + 88.5000 113.2500 -64.0 + 85.5000 118.2500 -64.0 + 85.2500 124.5000 -64.0 + 83.2500 129.5000 -64.0 + 81.5000 130.2500 -64.0 + 77.7500 127.5000 -64.0 + 74.7500 123.5000 -64.0 + 73.5000 124.2500 -64.0 + 72.7500 123.5000 -64.0 + 68.5000 122.2500 -64.0 + 68.2500 123.5000 -64.0 + 71.5000 123.7500 -64.0 + 79.2500 131.5000 -64.0 + 81.2500 135.5000 -64.0 + 83.2500 141.5000 -64.0 + 85.2500 142.5000 -64.0 + 88.5000 142.7500 -64.0 + 90.2500 143.5000 -64.0 + 89.5000 144.2500 -64.0 + 89.2500 146.5000 -64.0 + 90.5000 146.7500 -64.0 + 92.2500 148.5000 -64.0 + 94.5000 148.7500 -64.0 + 102.2500 154.5000 -64.0 + 103.7500 153.5000 -64.0 + 94.7500 147.5000 -64.0 + 95.5000 145.7500 -64.0 + 97.5000 145.7500 -64.0 + 100.5000 146.7500 -64.0 + 102.2500 147.5000 -64.0 + 110.5000 147.7500 -64.0 + 116.5000 144.7500 -64.0 + 118.2500 146.5000 -64.0 + 117.5000 148.2500 -64.0 + 107.5000 153.2500 -64.0 + 107.2500 154.5000 -64.0 + 108.5000 154.7500 -64.0 + 115.7500 150.5000 -64.0 + 120.5000 148.7500 -64.0 + 124.5000 145.7500 -64.0 + 126.5000 144.7500 -64.0 + 128.5000 141.7500 -64.0 + 130.7500 135.5000 -64.0 + 133.5000 132.7500 -64.0 + 131.7500 129.5000 -64.0 + 131.5000 123.2500 -64.0 + 131.2500 125.5000 -64.0 + 130.2500 128.5000 -64.0 + 127.5000 131.2500 -64.0 + 125.5000 131.2500 -64.0 + 121.7500 127.5000 -64.0 + 122.5000 126.7500 -64.0 + 121.7500 125.5000 -64.0 + 122.7500 123.5000 -64.0 + 123.5000 121.7500 -64.0 + 126.7500 117.5000 -64.0 + 125.7500 114.5000 -64.0 + 119.5000 114.2500 -64.0 + 118.5000 116.2500 -64.0 + 116.5000 116.2500 -64.0 + 116.2500 118.5000 -64.0 + 118.2500 122.5000 -64.0 + 118.2500 127.5000 -64.0 + 123.2500 132.5000 -64.0 + 123.2500 134.5000 -64.0 + 122.2500 137.5000 -64.0 + 115.5000 142.2500 -64.0 + 109.5000 145.2500 -64.0 + 103.5000 145.2500 -64.0 + 96.5000 142.2500 -64.0 + 91.7500 135.5000 -64.0 + 91.7500 131.5000 -64.0 + 97.7500 125.5000 -64.0 + 98.7500 116.5000 -64.0 + 97.5000 115.2500 -64.0 + 93.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 113.5000 -64.0 + 102.5000 116.2500 -64.0 + 102.2500 119.5000 -64.0 + 104.2500 123.5000 -64.0 + 109.5000 123.7500 -64.0 + 113.5000 121.7500 -64.0 + 113.7500 116.5000 -64.0 + 110.5000 114.2500 -64.0 +} -64.0 +{ -64.0 + 88.7500 116.5000 -64.0 + 90.5000 115.7500 -64.0 + 92.2500 116.5000 -64.0 + 90.2500 119.5000 -64.0 + 92.5000 119.7500 -64.0 + 91.7500 118.5000 -64.0 + 93.5000 116.7500 -64.0 + 94.2500 118.5000 -64.0 + 96.2500 125.5000 -64.0 + 94.5000 126.2500 -64.0 + 91.5000 129.2500 -64.0 + 87.5000 129.2500 -64.0 + 85.7500 125.5000 -64.0 + 86.5000 123.7500 -64.0 + 85.7500 122.5000 -64.0 + 86.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 103.7500 116.5000 -64.0 + 104.5000 115.7500 -64.0 + 109.5000 116.7500 -64.0 + 111.2500 118.5000 -64.0 + 111.2500 120.5000 -64.0 + 109.5000 122.2500 -64.0 + 106.5000 122.2500 -64.0 + 103.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 85.7500 136.5000 -64.0 + 86.5000 135.7500 -64.0 + 87.2500 136.5000 -64.0 + 86.5000 137.2500 -64.0 +} -64.0 +v 484 z -162.000000 -64.0 +{ -64.0 + 96.2500 29.5000 -64.0 + 92.5000 32.2500 -64.0 + 89.5000 32.2500 -64.0 + 87.7500 31.5000 -64.0 + 87.2500 32.5000 -64.0 + 89.2500 34.5000 -64.0 + 89.2500 36.5000 -64.0 + 87.5000 37.2500 -64.0 + 87.2500 40.5000 -64.0 + 84.5000 43.2500 -64.0 + 84.5000 44.7500 -64.0 + 86.5000 45.7500 -64.0 + 86.7500 44.5000 -64.0 + 89.7500 41.5000 -64.0 + 88.7500 39.5000 -64.0 + 89.5000 38.7500 -64.0 + 92.7500 38.5000 -64.0 + 89.7500 34.5000 -64.0 + 91.5000 33.7500 -64.0 + 94.2500 36.5000 -64.0 + 95.5000 34.7500 -64.0 + 96.7500 30.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 32.5000 -64.0 + 106.5000 34.2500 -64.0 + 104.2500 34.5000 -64.0 + 105.2500 36.5000 -64.0 + 105.2500 39.5000 -64.0 + 101.2500 41.5000 -64.0 + 103.5000 41.7500 -64.0 + 105.2500 43.5000 -64.0 + 104.5000 45.2500 -64.0 + 102.5000 45.2500 -64.0 + 101.5000 47.2500 -64.0 + 102.5000 47.7500 -64.0 + 104.5000 46.7500 -64.0 + 115.5000 52.7500 -64.0 + 125.5000 56.7500 -64.0 + 124.5000 55.2500 -64.0 + 111.5000 47.2500 -64.0 + 108.7500 44.5000 -64.0 + 109.5000 43.7500 -64.0 + 109.7500 40.5000 -64.0 + 107.7500 38.5000 -64.0 + 108.5000 36.7500 -64.0 + 110.5000 36.7500 -64.0 + 112.5000 35.7500 -64.0 + 114.5000 36.7500 -64.0 + 116.5000 35.7500 -64.0 + 120.5000 37.7500 -64.0 + 123.2500 42.5000 -64.0 + 122.2500 45.5000 -64.0 + 123.5000 46.7500 -64.0 + 126.5000 45.7500 -64.0 + 126.7500 42.5000 -64.0 + 124.7500 40.5000 -64.0 + 124.7500 37.5000 -64.0 + 123.7500 35.5000 -64.0 + 119.5000 34.2500 -64.0 + 120.2500 35.5000 -64.0 + 119.5000 36.2500 -64.0 + 117.7500 35.5000 -64.0 + 112.5000 35.2500 -64.0 + 109.5000 36.2500 -64.0 + 107.7500 34.5000 -64.0 + 108.5000 33.7500 -64.0 + 118.7500 33.5000 -64.0 + 114.7500 32.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 38.5000 -64.0 + 94.5000 39.7500 -64.0 + 96.5000 40.7500 -64.0 + 95.7500 38.5000 -64.0 +} -64.0 +{ -64.0 + 77.2500 47.5000 -64.0 + 77.2500 49.5000 -64.0 + 79.5000 49.7500 -64.0 + 83.2500 51.5000 -64.0 + 79.2500 59.5000 -64.0 + 80.2500 61.5000 -64.0 + 80.2500 64.5000 -64.0 + 81.5000 64.7500 -64.0 + 80.7500 63.5000 -64.0 + 80.7500 59.5000 -64.0 + 81.7500 56.5000 -64.0 + 84.5000 52.7500 -64.0 + 86.5000 52.7500 -64.0 + 86.7500 49.5000 -64.0 + 84.5000 50.2500 -64.0 + 82.7500 49.5000 -64.0 + 84.7500 48.5000 -64.0 + 80.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 99.2500 48.5000 -64.0 + 99.2500 49.5000 -64.0 + 98.2500 51.5000 -64.0 + 101.5000 51.7500 -64.0 + 99.7500 49.5000 -64.0 + 100.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 50.5000 -64.0 + 136.5000 56.2500 -64.0 + 136.5000 57.7500 -64.0 + 140.5000 55.7500 -64.0 + 144.5000 55.7500 -64.0 + 146.2500 56.5000 -64.0 + 144.2500 57.5000 -64.0 + 146.5000 57.7500 -64.0 + 149.5000 56.7500 -64.0 + 151.7500 54.5000 -64.0 + 149.5000 54.2500 -64.0 + 143.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 54.5000 -64.0 + 91.2500 58.5000 -64.0 + 88.2500 64.5000 -64.0 + 89.5000 63.7500 -64.0 + 92.2500 65.5000 -64.0 + 91.5000 66.2500 -64.0 + 97.5000 67.7500 -64.0 + 99.5000 66.7500 -64.0 + 103.5000 66.7500 -64.0 + 105.5000 65.7500 -64.0 + 114.5000 64.7500 -64.0 + 118.5000 62.7500 -64.0 + 117.7500 61.5000 -64.0 + 108.5000 59.2500 -64.0 + 98.5000 54.2500 -64.0 + 96.5000 55.2500 -64.0 +} -64.0 +{ -64.0 + 135.2500 58.5000 -64.0 + 135.2500 59.5000 -64.0 + 136.5000 59.7500 -64.0 +} -64.0 +{ -64.0 + 138.2500 59.5000 -64.0 + 137.2500 60.5000 -64.0 + 141.5000 60.7500 -64.0 + 143.2500 63.5000 -64.0 + 141.2500 64.5000 -64.0 + 143.5000 64.7500 -64.0 + 151.2500 68.5000 -64.0 + 155.2500 69.5000 -64.0 + 152.5000 71.2500 -64.0 + 145.7500 69.5000 -64.0 + 141.5000 69.2500 -64.0 + 140.5000 69.7500 -64.0 + 147.5000 70.7500 -64.0 + 148.2500 72.5000 -64.0 + 146.5000 73.2500 -64.0 + 144.5000 75.7500 -64.0 + 148.5000 73.7500 -64.0 + 150.5000 73.7500 -64.0 + 152.5000 72.7500 -64.0 + 156.5000 72.7500 -64.0 + 158.5000 71.7500 -64.0 + 159.2500 72.5000 -64.0 + 161.5000 72.7500 -64.0 + 160.7500 70.5000 -64.0 + 155.7500 68.5000 -64.0 + 157.5000 66.7500 -64.0 + 154.5000 65.2500 -64.0 + 145.5000 63.2500 -64.0 + 142.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 56.2500 61.5000 -64.0 + 55.5000 62.2500 -64.0 + 55.5000 63.7500 -64.0 + 60.5000 64.7500 -64.0 + 62.2500 65.5000 -64.0 + 69.5000 65.7500 -64.0 + 71.2500 66.5000 -64.0 + 72.5000 65.7500 -64.0 + 74.5000 65.7500 -64.0 + 76.2500 66.5000 -64.0 + 78.5000 64.2500 -64.0 + 76.5000 65.2500 -64.0 + 74.5000 65.2500 -64.0 + 70.7500 63.5000 -64.0 + 66.5000 63.2500 -64.0 + 63.5000 62.2500 -64.0 + 61.7500 61.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 67.5000 -64.0 + 115.5000 69.2500 -64.0 + 116.2500 72.5000 -64.0 + 121.5000 72.7500 -64.0 + 121.7500 71.5000 -64.0 + 123.5000 69.7500 -64.0 + 126.5000 69.7500 -64.0 + 121.7500 67.5000 -64.0 +} -64.0 +{ -64.0 + 63.2500 71.5000 -64.0 + 63.2500 72.5000 -64.0 + 65.2500 73.5000 -64.0 + 69.5000 73.7500 -64.0 + 67.7500 72.5000 -64.0 + 69.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 73.5000 -64.0 + 93.2500 74.5000 -64.0 + 97.5000 74.7500 -64.0 + 99.2500 75.5000 -64.0 + 98.5000 76.2500 -64.0 + 93.5000 76.2500 -64.0 + 90.5000 77.2500 -64.0 + 91.2500 78.5000 -64.0 + 93.5000 78.7500 -64.0 + 95.2500 79.5000 -64.0 + 99.5000 79.7500 -64.0 + 101.5000 81.7500 -64.0 + 103.5000 80.7500 -64.0 + 105.5000 80.7500 -64.0 + 109.5000 82.7500 -64.0 + 112.5000 81.7500 -64.0 + 115.2500 84.5000 -64.0 + 114.5000 85.2500 -64.0 + 114.5000 86.7500 -64.0 + 116.5000 87.7500 -64.0 + 116.7500 86.5000 -64.0 + 118.5000 84.7500 -64.0 + 120.2500 85.5000 -64.0 + 117.2500 89.5000 -64.0 + 120.5000 89.7500 -64.0 + 121.2500 91.5000 -64.0 + 119.2500 93.5000 -64.0 + 121.5000 93.7500 -64.0 + 121.7500 91.5000 -64.0 + 123.5000 90.7500 -64.0 + 125.2500 92.5000 -64.0 + 124.5000 93.2500 -64.0 + 124.2500 96.5000 -64.0 + 125.5000 95.7500 -64.0 + 129.5000 95.7500 -64.0 + 131.7500 93.5000 -64.0 + 132.7500 91.5000 -64.0 + 135.5000 87.7500 -64.0 + 137.5000 87.7500 -64.0 + 137.7500 84.5000 -64.0 + 138.7500 81.5000 -64.0 + 136.5000 83.2500 -64.0 + 133.5000 83.2500 -64.0 + 130.5000 84.2500 -64.0 + 128.7500 83.5000 -64.0 + 128.7500 81.5000 -64.0 + 127.7500 78.5000 -64.0 + 129.7500 77.5000 -64.0 + 121.5000 77.2500 -64.0 + 118.5000 76.2500 -64.0 + 116.5000 77.2500 -64.0 + 114.7500 76.5000 -64.0 + 110.5000 76.2500 -64.0 + 104.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 73.5000 -64.0 + 130.2500 76.5000 -64.0 + 131.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 137.2500 73.5000 -64.0 + 136.2500 75.5000 -64.0 + 138.5000 75.7500 -64.0 + 138.7500 74.5000 -64.0 +} -64.0 +{ -64.0 + 69.2500 77.5000 -64.0 + 68.5000 78.2500 -64.0 + 65.5000 78.2500 -64.0 + 63.5000 79.2500 -64.0 + 59.5000 79.2500 -64.0 + 53.5000 82.2500 -64.0 + 51.5000 82.2500 -64.0 + 50.2500 84.5000 -64.0 + 54.5000 84.7500 -64.0 + 63.5000 81.7500 -64.0 + 65.2500 84.5000 -64.0 + 67.5000 81.7500 -64.0 + 65.7500 80.5000 -64.0 + 67.5000 78.7500 -64.0 + 69.2500 79.5000 -64.0 + 70.5000 78.7500 -64.0 +} -64.0 +{ -64.0 + 86.2500 77.5000 -64.0 + 82.5000 81.2500 -64.0 + 81.7500 79.5000 -64.0 + 80.5000 79.2500 -64.0 + 81.2500 80.5000 -64.0 + 80.5000 84.2500 -64.0 + 81.2500 85.5000 -64.0 + 80.2500 90.5000 -64.0 + 81.5000 88.7500 -64.0 + 81.7500 84.5000 -64.0 + 84.5000 81.7500 -64.0 + 87.5000 81.7500 -64.0 + 87.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 76.2500 79.5000 -64.0 + 74.5000 81.2500 -64.0 + 73.2500 87.5000 -64.0 + 67.5000 93.2500 -64.0 + 68.5000 93.7500 -64.0 + 70.5000 91.7500 -64.0 + 72.5000 91.7500 -64.0 + 77.5000 86.7500 -64.0 + 75.7500 85.5000 -64.0 + 76.7500 80.5000 -64.0 +} -64.0 +{ -64.0 + 150.2500 87.5000 -64.0 + 150.2500 89.5000 -64.0 + 152.2500 93.5000 -64.0 + 153.2500 102.5000 -64.0 + 151.5000 103.2500 -64.0 + 151.2500 104.5000 -64.0 + 152.2500 107.5000 -64.0 + 152.7500 106.5000 -64.0 + 151.7500 104.5000 -64.0 + 152.5000 103.7500 -64.0 + 155.2500 107.5000 -64.0 + 155.5000 110.7500 -64.0 + 155.7500 105.5000 -64.0 + 153.7500 101.5000 -64.0 + 152.7500 91.5000 -64.0 + 151.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 138.2500 88.5000 -64.0 + 138.5000 88.7500 -64.0 + 142.2500 91.5000 -64.0 + 143.7500 91.5000 -64.0 + 139.7500 88.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 90.5000 -64.0 + 110.2500 91.5000 -64.0 + 111.2500 93.5000 -64.0 + 113.5000 91.7500 -64.0 +} -64.0 +{ -64.0 + 79.2500 92.5000 -64.0 + 79.2500 93.5000 -64.0 + 78.2500 96.5000 -64.0 + 77.5000 98.2500 -64.0 + 77.2500 102.5000 -64.0 + 77.7500 103.5000 -64.0 + 79.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 59.2500 97.5000 -64.0 + 57.5000 101.2500 -64.0 + 57.2500 105.5000 -64.0 + 58.2500 107.5000 -64.0 + 59.7500 106.5000 -64.0 + 60.7500 101.5000 -64.0 + 58.7500 100.5000 -64.0 + 59.7500 98.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 102.5000 -64.0 + 123.5000 103.2500 -64.0 + 124.2500 105.5000 -64.0 + 123.2500 107.5000 -64.0 + 124.2500 109.5000 -64.0 + 126.7500 104.5000 -64.0 + 125.7500 102.5000 -64.0 +} -64.0 +{ -64.0 + 76.2500 104.5000 -64.0 + 75.2500 106.5000 -64.0 + 75.7500 107.5000 -64.0 + 76.7500 105.5000 -64.0 +} -64.0 +{ -64.0 + 153.2500 110.5000 -64.0 + 153.2500 111.5000 -64.0 + 154.5000 111.7500 -64.0 +} -64.0 +{ -64.0 + 87.2500 112.5000 -64.0 + 86.5000 113.2500 -64.0 + 87.2500 114.5000 -64.0 + 86.2500 117.5000 -64.0 + 87.5000 116.7500 -64.0 + 89.2500 117.5000 -64.0 + 89.2500 119.5000 -64.0 + 90.2500 121.5000 -64.0 + 89.5000 122.2500 -64.0 + 90.2500 124.5000 -64.0 + 91.5000 124.7500 -64.0 + 93.2500 125.5000 -64.0 + 90.5000 128.2500 -64.0 + 87.5000 128.2500 -64.0 + 85.7500 126.5000 -64.0 + 85.7500 121.5000 -64.0 + 84.5000 120.2500 -64.0 + 84.2500 130.5000 -64.0 + 87.2500 134.5000 -64.0 + 86.5000 135.2500 -64.0 + 84.2500 135.5000 -64.0 + 83.2500 137.5000 -64.0 + 87.5000 144.7500 -64.0 + 100.5000 151.7500 -64.0 + 104.2500 154.5000 -64.0 + 108.5000 154.7500 -64.0 + 110.5000 153.7500 -64.0 + 114.5000 150.7500 -64.0 + 122.5000 146.7500 -64.0 + 125.7500 143.5000 -64.0 + 127.7500 139.5000 -64.0 + 126.7500 137.5000 -64.0 + 125.5000 138.2500 -64.0 + 119.5000 141.2500 -64.0 + 116.5000 141.2500 -64.0 + 110.5000 144.2500 -64.0 + 108.5000 144.2500 -64.0 + 106.5000 145.2500 -64.0 + 105.7500 144.5000 -64.0 + 102.5000 144.2500 -64.0 + 94.5000 140.2500 -64.0 + 87.7500 133.5000 -64.0 + 89.7500 131.5000 -64.0 + 96.7500 128.5000 -64.0 + 97.7500 126.5000 -64.0 + 95.5000 126.2500 -64.0 + 94.7500 124.5000 -64.0 + 95.5000 122.7500 -64.0 + 97.5000 122.7500 -64.0 + 99.5000 124.7500 -64.0 + 103.5000 122.7500 -64.0 + 107.5000 124.7500 -64.0 + 115.5000 120.7500 -64.0 + 120.5000 121.7500 -64.0 + 122.5000 119.7500 -64.0 + 123.2500 120.5000 -64.0 + 122.2500 125.5000 -64.0 + 120.5000 127.2500 -64.0 + 120.2500 129.5000 -64.0 + 122.5000 130.7500 -64.0 + 124.5000 131.7500 -64.0 + 126.2500 132.5000 -64.0 + 128.7500 132.5000 -64.0 + 131.5000 128.7500 -64.0 + 131.7500 125.5000 -64.0 + 132.7500 123.5000 -64.0 + 131.7500 121.5000 -64.0 + 131.7500 119.5000 -64.0 + 130.5000 118.2500 -64.0 + 124.5000 115.2500 -64.0 + 124.2500 117.5000 -64.0 + 123.5000 119.2500 -64.0 + 121.7500 117.5000 -64.0 + 120.7500 115.5000 -64.0 + 117.7500 113.5000 -64.0 + 116.5000 114.2500 -64.0 + 112.5000 114.2500 -64.0 + 107.5000 113.2500 -64.0 + 99.5000 117.2500 -64.0 + 96.5000 117.2500 -64.0 + 94.7500 116.5000 -64.0 + 93.5000 114.2500 -64.0 + 91.5000 113.2500 -64.0 + 89.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 71.2500 119.5000 -64.0 + 70.2500 121.5000 -64.0 + 72.5000 121.7500 -64.0 + 72.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 92.7500 59.5000 -64.0 + 93.5000 58.7500 -64.0 + 94.2500 59.5000 -64.0 + 93.5000 60.2500 -64.0 +} -64.0 +{ -64.0 + 93.7500 61.5000 -64.0 + 94.5000 60.7500 -64.0 + 95.2500 61.5000 -64.0 + 94.5000 62.2500 -64.0 +} -64.0 +{ -64.0 + 107.7500 61.5000 -64.0 + 109.5000 60.7500 -64.0 + 117.2500 62.5000 -64.0 + 114.5000 64.2500 -64.0 + 110.5000 64.2500 -64.0 + 103.5000 66.2500 -64.0 + 95.5000 66.2500 -64.0 + 93.7500 65.5000 -64.0 + 96.5000 63.7500 -64.0 + 98.5000 63.7500 -64.0 + 100.5000 62.7500 -64.0 + 107.5000 62.7500 -64.0 +} -64.0 +{ -64.0 + 118.7500 83.5000 -64.0 + 119.5000 82.7500 -64.0 + 120.2500 83.5000 -64.0 + 119.5000 84.2500 -64.0 +} -64.0 +{ -64.0 + 103.7500 116.5000 -64.0 + 105.5000 115.7500 -64.0 + 107.2500 116.5000 -64.0 + 104.5000 119.2500 -64.0 + 102.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 116.5000 -64.0 + 108.5000 115.7500 -64.0 + 111.2500 120.5000 -64.0 + 109.5000 122.2500 -64.0 + 107.5000 122.2500 -64.0 + 105.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 128.7500 125.5000 -64.0 + 129.5000 124.7500 -64.0 + 130.2500 125.5000 -64.0 + 129.5000 126.2500 -64.0 +} -64.0 +{ -64.0 + 126.7500 127.5000 -64.0 + 127.5000 126.7500 -64.0 + 129.2500 127.5000 -64.0 + 127.5000 129.2500 -64.0 +} -64.0 +{ -64.0 + 95.7500 145.5000 -64.0 + 96.5000 144.7500 -64.0 + 102.5000 146.7500 -64.0 + 104.2500 147.5000 -64.0 + 110.5000 147.7500 -64.0 + 113.5000 146.7500 -64.0 + 114.2500 148.5000 -64.0 + 112.5000 149.2500 -64.0 + 106.5000 152.2500 -64.0 + 104.7500 151.5000 -64.0 + 102.5000 151.2500 -64.0 + 98.5000 148.2500 -64.0 + 96.5000 147.2500 -64.0 +} -64.0 +v 400 z -164.000000 -64.0 +{ -64.0 + 95.2500 31.5000 -64.0 + 90.5000 42.2500 -64.0 + 88.7500 41.5000 -64.0 + 85.5000 43.2500 -64.0 + 88.5000 47.7500 -64.0 + 88.7500 45.5000 -64.0 + 90.5000 43.7500 -64.0 + 91.2500 44.5000 -64.0 + 92.5000 42.7500 -64.0 + 93.2500 43.5000 -64.0 + 92.5000 45.2500 -64.0 + 93.5000 45.7500 -64.0 + 94.5000 42.7500 -64.0 + 97.5000 43.7500 -64.0 + 98.2500 45.5000 -64.0 + 96.5000 47.2500 -64.0 + 93.5000 47.7500 -64.0 + 97.2500 49.5000 -64.0 + 96.2500 50.5000 -64.0 + 98.5000 50.7500 -64.0 + 97.7500 49.5000 -64.0 + 98.7500 47.5000 -64.0 + 101.5000 45.7500 -64.0 + 106.5000 39.7500 -64.0 + 108.5000 40.7500 -64.0 + 110.5000 37.7500 -64.0 + 116.5000 39.7500 -64.0 + 118.5000 38.7500 -64.0 + 121.2500 43.5000 -64.0 + 120.5000 45.2500 -64.0 + 121.2500 46.5000 -64.0 + 125.5000 46.7500 -64.0 + 127.5000 45.7500 -64.0 + 127.7500 42.5000 -64.0 + 126.5000 42.2500 -64.0 + 124.7500 40.5000 -64.0 + 124.7500 36.5000 -64.0 + 122.5000 35.2500 -64.0 + 115.7500 33.5000 -64.0 + 109.5000 33.2500 -64.0 + 107.5000 34.2500 -64.0 + 99.5000 35.2500 -64.0 + 97.5000 38.2500 -64.0 + 95.5000 39.2500 -64.0 + 93.7500 38.5000 -64.0 + 94.5000 37.7500 -64.0 + 95.7500 32.5000 -64.0 +} -64.0 +{ -64.0 + 80.2500 48.5000 -64.0 + 79.2500 49.5000 -64.0 + 83.2500 50.5000 -64.0 + 84.5000 49.7500 -64.0 +} -64.0 +{ -64.0 + 85.2500 50.5000 -64.0 + 86.2500 51.5000 -64.0 + 86.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 137.2500 50.5000 -64.0 + 137.2500 54.5000 -64.0 + 136.5000 56.2500 -64.0 + 136.2500 61.5000 -64.0 + 141.2500 63.5000 -64.0 + 140.2500 66.5000 -64.0 + 141.5000 66.7500 -64.0 + 142.7500 64.5000 -64.0 + 140.7500 60.5000 -64.0 + 146.5000 57.7500 -64.0 + 148.5000 57.7500 -64.0 + 149.7500 56.5000 -64.0 + 143.7500 52.5000 -64.0 + 141.5000 53.2500 -64.0 +} -64.0 +{ -64.0 + 95.2500 53.5000 -64.0 + 92.5000 55.2500 -64.0 + 90.2500 61.5000 -64.0 + 91.5000 60.7500 -64.0 + 91.7500 58.5000 -64.0 + 93.5000 56.7500 -64.0 + 97.5000 57.7500 -64.0 + 97.7500 55.5000 -64.0 +} -64.0 +{ -64.0 + 79.2500 56.5000 -64.0 + 79.2500 62.5000 -64.0 + 77.2500 66.5000 -64.0 + 78.5000 65.7500 -64.0 + 79.5000 66.7500 -64.0 + 79.7500 63.5000 -64.0 + 81.5000 61.7500 -64.0 + 80.7500 60.5000 -64.0 + 81.5000 58.7500 -64.0 +} -64.0 +{ -64.0 + 83.2500 58.5000 -64.0 + 82.2500 60.5000 -64.0 + 83.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 58.5000 -64.0 + 109.5000 58.7500 -64.0 + 113.2500 61.5000 -64.0 + 112.5000 62.2500 -64.0 + 100.5000 62.2500 -64.0 + 94.5000 65.2500 -64.0 + 92.5000 65.2500 -64.0 + 90.5000 66.2500 -64.0 + 87.5000 66.2500 -64.0 + 87.2500 67.5000 -64.0 + 97.5000 67.7500 -64.0 + 99.5000 66.7500 -64.0 + 104.5000 66.7500 -64.0 + 106.5000 65.7500 -64.0 + 109.5000 65.7500 -64.0 + 111.5000 64.7500 -64.0 + 113.5000 64.7500 -64.0 + 115.5000 63.7500 -64.0 + 120.5000 63.7500 -64.0 + 120.7500 62.5000 -64.0 + 119.5000 62.2500 -64.0 + 114.5000 60.2500 -64.0 + 110.7500 58.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 65.5000 -64.0 + 128.2500 66.5000 -64.0 + 129.5000 66.7500 -64.0 +} -64.0 +{ -64.0 + 133.2500 65.5000 -64.0 + 133.2500 67.5000 -64.0 + 133.7500 66.5000 -64.0 +} -64.0 +{ -64.0 + 64.2500 66.5000 -64.0 + 63.5000 67.2500 -64.0 + 59.5000 67.2500 -64.0 + 56.5000 68.2500 -64.0 + 54.7500 67.5000 -64.0 + 53.2500 68.5000 -64.0 + 55.5000 68.7500 -64.0 + 57.2500 69.5000 -64.0 + 62.5000 69.7500 -64.0 + 69.5000 70.7500 -64.0 + 71.2500 72.5000 -64.0 + 71.2500 74.5000 -64.0 + 74.5000 74.7500 -64.0 + 73.5000 74.2500 -64.0 + 71.7500 71.5000 -64.0 + 72.5000 70.7500 -64.0 + 74.7500 70.5000 -64.0 + 72.5000 70.2500 -64.0 + 68.7500 66.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 69.5000 -64.0 + 126.2500 70.5000 -64.0 + 127.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 70.5000 -64.0 + 142.2500 71.5000 -64.0 + 148.5000 71.7500 -64.0 + 150.5000 72.7500 -64.0 + 152.5000 71.7500 -64.0 + 156.7500 71.5000 -64.0 + 152.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 157.2500 70.5000 -64.0 + 157.5000 70.7500 -64.0 + 159.5000 71.7500 -64.0 + 159.7500 70.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 71.5000 -64.0 + 115.5000 72.2500 -64.0 + 107.5000 72.2500 -64.0 + 105.5000 73.2500 -64.0 + 90.5000 73.2500 -64.0 + 90.2500 75.5000 -64.0 + 88.5000 77.2500 -64.0 + 85.5000 75.2500 -64.0 + 84.2500 79.5000 -64.0 + 82.5000 80.2500 -64.0 + 80.5000 79.2500 -64.0 + 80.2500 82.5000 -64.0 + 79.5000 84.2500 -64.0 + 77.5000 84.2500 -64.0 + 70.5000 90.2500 -64.0 + 68.2500 91.5000 -64.0 + 67.2500 93.5000 -64.0 + 69.5000 92.7500 -64.0 + 74.5000 88.7500 -64.0 + 76.5000 88.7500 -64.0 + 77.5000 90.7500 -64.0 + 78.7500 86.5000 -64.0 + 80.5000 85.7500 -64.0 + 80.7500 84.5000 -64.0 + 83.5000 81.7500 -64.0 + 86.5000 81.7500 -64.0 + 88.5000 80.7500 -64.0 + 87.7500 79.5000 -64.0 + 88.5000 77.7500 -64.0 + 90.2500 78.5000 -64.0 + 94.5000 78.7500 -64.0 + 96.5000 77.7500 -64.0 + 112.5000 77.7500 -64.0 + 114.2500 78.5000 -64.0 + 115.5000 80.7500 -64.0 + 117.5000 81.7500 -64.0 + 121.5000 79.7500 -64.0 + 122.5000 80.7500 -64.0 + 126.5000 78.7500 -64.0 + 127.2500 79.5000 -64.0 + 126.2500 81.5000 -64.0 + 128.2500 85.5000 -64.0 + 128.2500 87.5000 -64.0 + 127.5000 89.2500 -64.0 + 128.5000 89.7500 -64.0 + 128.7500 87.5000 -64.0 + 130.5000 85.7500 -64.0 + 132.5000 85.7500 -64.0 + 133.5000 83.7500 -64.0 + 134.2500 84.5000 -64.0 + 135.2500 86.5000 -64.0 + 137.5000 88.7500 -64.0 + 139.5000 89.7500 -64.0 + 143.2500 91.5000 -64.0 + 143.7500 90.5000 -64.0 + 142.5000 90.2500 -64.0 + 139.7500 87.5000 -64.0 + 139.7500 82.5000 -64.0 + 138.7500 79.5000 -64.0 + 137.5000 81.2500 -64.0 + 135.7500 80.5000 -64.0 + 133.5000 80.2500 -64.0 + 131.7500 78.5000 -64.0 + 132.5000 76.7500 -64.0 + 136.5000 74.7500 -64.0 + 133.5000 73.2500 -64.0 + 131.5000 74.2500 -64.0 + 129.5000 74.2500 -64.0 + 126.5000 73.2500 -64.0 + 124.7500 72.5000 -64.0 + 125.7500 71.5000 -64.0 +} -64.0 +{ -64.0 + 141.2500 73.5000 -64.0 + 141.2500 76.5000 -64.0 + 142.7500 73.5000 -64.0 +} -64.0 +{ -64.0 + 68.2500 77.5000 -64.0 + 66.5000 79.2500 -64.0 + 64.5000 79.2500 -64.0 + 65.2500 80.5000 -64.0 + 65.2500 83.5000 -64.0 + 63.2500 90.5000 -64.0 + 67.7500 81.5000 -64.0 + 71.5000 78.7500 -64.0 + 70.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 76.2500 79.5000 -64.0 + 75.5000 81.2500 -64.0 + 76.2500 82.5000 -64.0 + 77.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 147.2500 79.5000 -64.0 + 146.5000 80.2500 -64.0 + 148.2500 82.5000 -64.0 + 150.2500 86.5000 -64.0 + 150.2500 89.5000 -64.0 + 151.2500 91.5000 -64.0 + 151.2500 93.5000 -64.0 + 152.2500 95.5000 -64.0 + 152.2500 98.5000 -64.0 + 151.5000 100.2500 -64.0 + 150.5000 99.2500 -64.0 + 150.2500 101.5000 -64.0 + 151.2500 103.5000 -64.0 + 151.2500 107.5000 -64.0 + 153.2500 111.5000 -64.0 + 155.5000 111.7500 -64.0 + 155.7500 110.5000 -64.0 + 154.5000 111.2500 -64.0 + 152.7500 109.5000 -64.0 + 152.7500 107.5000 -64.0 + 153.5000 105.7500 -64.0 + 154.2500 107.5000 -64.0 + 155.5000 107.7500 -64.0 + 155.7500 105.5000 -64.0 + 153.7500 101.5000 -64.0 + 153.7500 97.5000 -64.0 + 152.7500 95.5000 -64.0 + 152.7500 90.5000 -64.0 + 150.7500 86.5000 -64.0 + 150.7500 81.5000 -64.0 + 152.5000 80.7500 -64.0 + 151.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 61.2500 93.5000 -64.0 + 58.2500 100.5000 -64.0 + 57.2500 105.5000 -64.0 + 58.2500 107.5000 -64.0 + 59.7500 106.5000 -64.0 + 64.5000 97.7500 -64.0 + 63.5000 97.2500 -64.0 + 61.5000 99.2500 -64.0 + 60.7500 97.5000 -64.0 + 61.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 112.5000 -64.0 + 116.5000 113.2500 -64.0 + 106.5000 113.2500 -64.0 + 100.5000 116.2500 -64.0 + 96.5000 116.2500 -64.0 + 94.5000 118.2500 -64.0 + 94.2500 123.5000 -64.0 + 95.2500 126.5000 -64.0 + 93.5000 127.2500 -64.0 + 91.7500 125.5000 -64.0 + 91.7500 122.5000 -64.0 + 90.7500 119.5000 -64.0 + 87.7500 115.5000 -64.0 + 85.5000 115.2500 -64.0 + 83.2500 121.5000 -64.0 + 84.2500 123.5000 -64.0 + 84.2500 128.5000 -64.0 + 86.2500 130.5000 -64.0 + 94.5000 130.7500 -64.0 + 96.5000 128.7500 -64.0 + 98.2500 129.5000 -64.0 + 99.7500 129.5000 -64.0 + 100.7500 127.5000 -64.0 + 103.5000 123.7500 -64.0 + 105.2500 124.5000 -64.0 + 108.5000 124.7500 -64.0 + 114.5000 121.7500 -64.0 + 117.5000 121.7500 -64.0 + 121.2500 124.5000 -64.0 + 124.5000 124.7500 -64.0 + 124.7500 117.5000 -64.0 + 119.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 120.5000 -64.0 + 129.5000 124.2500 -64.0 + 129.2500 126.5000 -64.0 + 127.5000 128.2500 -64.0 + 127.2500 130.5000 -64.0 + 129.5000 130.7500 -64.0 + 132.5000 125.7500 -64.0 + 132.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 140.5000 -64.0 + 88.5000 141.2500 -64.0 + 89.5000 143.7500 -64.0 + 93.2500 146.5000 -64.0 + 96.5000 146.7500 -64.0 + 100.5000 149.7500 -64.0 + 105.5000 150.7500 -64.0 + 108.5000 151.7500 -64.0 + 116.5000 147.7500 -64.0 + 120.7500 145.5000 -64.0 + 121.7500 143.5000 -64.0 + 120.5000 144.2500 -64.0 + 119.7500 143.5000 -64.0 + 112.5000 143.2500 -64.0 + 110.5000 144.2500 -64.0 + 106.5000 144.2500 -64.0 + 99.5000 143.2500 -64.0 + 97.7500 142.5000 -64.0 + 92.5000 142.2500 -64.0 + 90.7500 140.5000 -64.0 +} -64.0 +{ -64.0 + 108.7500 34.5000 -64.0 + 109.5000 33.7500 -64.0 + 111.2500 35.5000 -64.0 + 109.5000 37.2500 -64.0 + 108.7500 36.5000 -64.0 +} -64.0 +{ -64.0 + 111.7500 35.5000 -64.0 + 112.5000 34.7500 -64.0 + 114.5000 34.7500 -64.0 + 115.2500 36.5000 -64.0 + 113.5000 37.2500 -64.0 +} -64.0 +{ -64.0 + 92.7500 40.5000 -64.0 + 93.5000 39.7500 -64.0 + 94.2500 40.5000 -64.0 + 93.5000 42.2500 -64.0 +} -64.0 +{ -64.0 + 96.7500 41.5000 -64.0 + 98.5000 40.7500 -64.0 + 99.2500 42.5000 -64.0 + 97.5000 43.2500 -64.0 +} -64.0 +{ -64.0 + 99.7500 43.5000 -64.0 + 100.5000 42.7500 -64.0 + 101.2500 43.5000 -64.0 + 100.5000 44.2500 -64.0 +} -64.0 +{ -64.0 + 136.7500 59.5000 -64.0 + 137.5000 58.7500 -64.0 + 138.2500 59.5000 -64.0 + 137.5000 60.2500 -64.0 +} -64.0 +{ -64.0 + 111.7500 73.5000 -64.0 + 112.5000 72.7500 -64.0 + 113.2500 73.5000 -64.0 + 121.5000 73.7500 -64.0 + 130.5000 74.7500 -64.0 + 132.2500 75.5000 -64.0 + 131.5000 76.2500 -64.0 + 107.5000 76.2500 -64.0 + 105.7500 75.5000 -64.0 + 107.5000 74.7500 -64.0 + 109.5000 73.7500 -64.0 +} -64.0 +{ -64.0 + 90.7500 76.5000 -64.0 + 91.5000 75.7500 -64.0 + 92.2500 76.5000 -64.0 + 91.5000 77.2500 -64.0 +} -64.0 +{ -64.0 + 69.5000 77.7500 -64.0 + 70.2500 78.5000 -64.0 + 68.5000 80.2500 -64.0 + 67.7500 79.5000 -64.0 +} -64.0 +{ -64.0 + 136.7500 83.5000 -64.0 + 137.5000 82.7500 -64.0 + 138.2500 83.5000 -64.0 + 137.5000 84.2500 -64.0 +} -64.0 +{ -64.0 + 59.7500 100.5000 -64.0 + 60.5000 99.7500 -64.0 + 61.2500 100.5000 -64.0 + 60.5000 101.2500 -64.0 +} -64.0 +{ -64.0 + 104.7500 116.5000 -64.0 + 106.5000 115.7500 -64.0 + 111.5000 116.7500 -64.0 + 112.2500 118.5000 -64.0 + 111.2500 121.5000 -64.0 + 108.5000 123.2500 -64.0 + 101.7500 119.5000 -64.0 + 102.5000 117.7500 -64.0 +} -64.0 +v 233 z -166.000000 -64.0 +{ -64.0 + 105.2500 34.5000 -64.0 + 102.5000 37.2500 -64.0 + 100.5000 35.2500 -64.0 + 98.5000 36.2500 -64.0 + 98.2500 40.5000 -64.0 + 100.2500 42.5000 -64.0 + 102.5000 42.7500 -64.0 + 103.5000 40.7500 -64.0 + 106.5000 40.7500 -64.0 + 108.2500 41.5000 -64.0 + 111.5000 38.7500 -64.0 + 112.2500 40.5000 -64.0 + 118.5000 40.7500 -64.0 + 119.2500 42.5000 -64.0 + 121.2500 43.5000 -64.0 + 121.2500 45.5000 -64.0 + 122.2500 47.5000 -64.0 + 125.7500 47.5000 -64.0 + 123.5000 47.2500 -64.0 + 122.7500 45.5000 -64.0 + 126.5000 42.7500 -64.0 + 124.7500 41.5000 -64.0 + 125.5000 40.7500 -64.0 + 125.7500 37.5000 -64.0 + 122.7500 36.5000 -64.0 + 121.5000 37.2500 -64.0 + 118.7500 34.5000 -64.0 + 116.5000 35.2500 -64.0 + 113.5000 34.2500 -64.0 + 111.5000 35.2500 -64.0 + 110.5000 34.2500 -64.0 + 108.5000 35.2500 -64.0 +} -64.0 +{ -64.0 + 87.2500 38.5000 -64.0 + 91.2500 41.5000 -64.0 + 91.7500 40.5000 -64.0 + 93.5000 39.7500 -64.0 + 90.7500 38.5000 -64.0 +} -64.0 +{ -64.0 + 86.2500 43.5000 -64.0 + 87.2500 44.5000 -64.0 + 86.5000 46.2500 -64.0 + 87.2500 47.5000 -64.0 + 88.5000 45.7500 -64.0 + 90.5000 44.7500 -64.0 + 89.7500 43.5000 -64.0 +} -64.0 +{ -64.0 + 94.2500 44.5000 -64.0 + 95.2500 45.5000 -64.0 + 93.5000 46.2500 -64.0 + 95.2500 48.5000 -64.0 + 94.5000 52.2500 -64.0 + 92.5000 52.2500 -64.0 + 95.2500 53.5000 -64.0 + 96.5000 52.7500 -64.0 + 95.7500 50.5000 -64.0 + 96.5000 48.7500 -64.0 + 98.5000 48.7500 -64.0 + 99.5000 45.7500 -64.0 + 110.5000 51.7500 -64.0 + 111.2500 53.5000 -64.0 + 120.5000 56.7500 -64.0 + 121.5000 56.2500 -64.0 + 106.5000 48.2500 -64.0 + 100.5000 44.2500 -64.0 + 97.5000 45.2500 -64.0 +} -64.0 +{ -64.0 + 129.2500 44.5000 -64.0 + 129.2500 46.5000 -64.0 + 130.7500 44.5000 -64.0 +} -64.0 +{ -64.0 + 137.2500 60.5000 -64.0 + 136.5000 61.2500 -64.0 + 137.5000 63.7500 -64.0 + 139.5000 64.7500 -64.0 + 140.2500 66.5000 -64.0 + 141.2500 68.5000 -64.0 + 143.5000 68.7500 -64.0 + 143.7500 67.5000 -64.0 + 141.7500 65.5000 -64.0 + 143.7500 64.5000 -64.0 + 142.7500 62.5000 -64.0 + 138.5000 62.2500 -64.0 +} -64.0 +{ -64.0 + 129.2500 63.5000 -64.0 + 127.2500 66.5000 -64.0 + 128.2500 68.5000 -64.0 + 128.2500 72.5000 -64.0 + 129.5000 72.7500 -64.0 + 132.2500 76.5000 -64.0 + 132.2500 78.5000 -64.0 + 134.2500 82.5000 -64.0 + 134.2500 84.5000 -64.0 + 136.2500 86.5000 -64.0 + 146.2500 93.5000 -64.0 + 146.7500 92.5000 -64.0 + 142.7500 88.5000 -64.0 + 141.7500 79.5000 -64.0 + 139.5000 76.2500 -64.0 + 135.7500 74.5000 -64.0 + 135.7500 71.5000 -64.0 + 134.5000 72.2500 -64.0 + 131.5000 72.2500 -64.0 + 128.7500 68.5000 -64.0 + 128.7500 66.5000 -64.0 + 129.7500 64.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 68.5000 -64.0 + 80.5000 70.2500 -64.0 + 78.5000 70.2500 -64.0 + 83.2500 73.5000 -64.0 + 84.2500 75.5000 -64.0 + 83.5000 77.2500 -64.0 + 79.5000 77.2500 -64.0 + 77.5000 75.2500 -64.0 + 77.2500 77.5000 -64.0 + 75.5000 79.2500 -64.0 + 72.7500 77.5000 -64.0 + 72.7500 75.5000 -64.0 + 71.5000 75.2500 -64.0 + 67.5000 77.2500 -64.0 + 67.2500 79.5000 -64.0 + 64.2500 85.5000 -64.0 + 63.2500 90.5000 -64.0 + 58.2500 100.5000 -64.0 + 57.2500 105.5000 -64.0 + 58.2500 107.5000 -64.0 + 60.7500 106.5000 -64.0 + 67.5000 93.7500 -64.0 + 71.5000 90.7500 -64.0 + 79.5000 86.7500 -64.0 + 81.7500 84.5000 -64.0 + 86.5000 75.7500 -64.0 + 86.7500 72.5000 -64.0 + 83.5000 72.2500 -64.0 + 82.7500 70.5000 -64.0 + 85.7500 68.5000 -64.0 +} -64.0 +{ -64.0 + 74.2500 69.5000 -64.0 + 73.5000 70.2500 -64.0 + 74.2500 71.5000 -64.0 + 74.2500 73.5000 -64.0 + 74.7500 72.5000 -64.0 + 75.5000 70.7500 -64.0 +} -64.0 +{ -64.0 + 147.2500 77.5000 -64.0 + 143.2500 79.5000 -64.0 + 147.2500 80.5000 -64.0 + 150.2500 86.5000 -64.0 + 150.2500 89.5000 -64.0 + 151.2500 91.5000 -64.0 + 151.2500 96.5000 -64.0 + 150.5000 98.2500 -64.0 + 149.5000 97.2500 -64.0 + 149.2500 99.5000 -64.0 + 150.2500 101.5000 -64.0 + 150.2500 105.5000 -64.0 + 152.2500 111.5000 -64.0 + 155.5000 111.7500 -64.0 + 155.7500 107.5000 -64.0 + 153.7500 101.5000 -64.0 + 153.7500 96.5000 -64.0 + 152.7500 94.5000 -64.0 + 151.7500 85.5000 -64.0 + 149.7500 78.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 111.5000 -64.0 + 113.5000 114.2500 -64.0 + 112.7500 113.5000 -64.0 + 106.5000 113.2500 -64.0 + 100.5000 116.2500 -64.0 + 92.5000 115.2500 -64.0 + 89.2500 116.5000 -64.0 + 91.2500 120.5000 -64.0 + 92.2500 127.5000 -64.0 + 90.5000 128.2500 -64.0 + 85.7500 118.5000 -64.0 + 84.5000 118.2500 -64.0 + 82.5000 120.2500 -64.0 + 82.2500 124.5000 -64.0 + 85.2500 130.5000 -64.0 + 92.5000 130.7500 -64.0 + 94.2500 132.5000 -64.0 + 97.5000 132.7500 -64.0 + 100.7500 127.5000 -64.0 + 103.5000 124.7500 -64.0 + 107.5000 124.7500 -64.0 + 109.5000 123.7500 -64.0 + 117.5000 122.7500 -64.0 + 125.5000 127.7500 -64.0 + 131.5000 124.7500 -64.0 + 131.7500 121.5000 -64.0 + 130.7500 119.5000 -64.0 + 131.5000 117.7500 -64.0 + 130.5000 116.2500 -64.0 + 122.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 149.5000 -64.0 + 114.2500 150.5000 -64.0 + 115.2500 153.5000 -64.0 + 115.7500 152.5000 -64.0 +} -64.0 +{ -64.0 + 134.7500 77.5000 -64.0 + 135.5000 76.7500 -64.0 + 136.2500 77.5000 -64.0 + 135.5000 78.2500 -64.0 +} -64.0 +{ -64.0 + 70.5000 78.7500 -64.0 + 72.5000 78.7500 -64.0 + 77.2500 83.5000 -64.0 + 76.5000 85.2500 -64.0 + 72.5000 88.2500 -64.0 + 70.5000 89.2500 -64.0 + 63.5000 97.2500 -64.0 + 62.7500 95.5000 -64.0 + 63.7500 90.5000 -64.0 + 66.7500 86.5000 -64.0 + 67.7500 81.5000 -64.0 +} -64.0 +{ -64.0 + 58.7500 104.5000 -64.0 + 59.5000 103.7500 -64.0 + 60.2500 104.5000 -64.0 + 59.5000 105.2500 -64.0 +} -64.0 +{ -64.0 + 152.7500 106.5000 -64.0 + 153.5000 105.7500 -64.0 + 155.2500 109.5000 -64.0 + 154.5000 111.2500 -64.0 + 152.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 120.7500 112.5000 -64.0 + 121.5000 111.7500 -64.0 + 122.2500 112.5000 -64.0 + 121.2500 114.5000 -64.0 + 122.2500 117.5000 -64.0 + 120.5000 118.2500 -64.0 + 118.5000 119.2500 -64.0 + 116.5000 119.2500 -64.0 + 108.5000 123.2500 -64.0 + 104.5000 123.2500 -64.0 + 102.7500 122.5000 -64.0 + 96.5000 122.2500 -64.0 + 94.7500 120.5000 -64.0 + 96.5000 117.7500 -64.0 + 101.7500 117.5000 -64.0 + 108.5000 114.7500 -64.0 + 110.2500 115.5000 -64.0 + 116.5000 115.7500 -64.0 + 118.5000 113.7500 -64.0 +} -64.0 +v 207 z -168.000000 -64.0 +{ -64.0 + 105.2500 35.5000 -64.0 + 104.2500 37.5000 -64.0 + 102.5000 38.2500 -64.0 + 100.5000 36.2500 -64.0 + 98.5000 37.2500 -64.0 + 97.2500 45.5000 -64.0 + 95.5000 46.2500 -64.0 + 93.7500 44.5000 -64.0 + 92.5000 46.2500 -64.0 + 89.5000 46.2500 -64.0 + 89.2500 49.5000 -64.0 + 94.5000 56.7500 -64.0 + 95.7500 52.5000 -64.0 + 99.7500 46.5000 -64.0 + 106.5000 42.7500 -64.0 + 114.5000 42.7500 -64.0 + 119.5000 44.7500 -64.0 + 123.2500 48.5000 -64.0 + 126.5000 48.7500 -64.0 + 128.5000 46.2500 -64.0 + 126.5000 47.2500 -64.0 + 122.7500 46.5000 -64.0 + 125.5000 43.7500 -64.0 + 128.7500 43.5000 -64.0 + 124.7500 42.5000 -64.0 + 124.7500 38.5000 -64.0 + 120.5000 38.2500 -64.0 + 119.7500 36.5000 -64.0 + 118.5000 36.2500 -64.0 + 116.5000 37.2500 -64.0 + 113.7500 35.5000 -64.0 + 112.5000 36.2500 -64.0 +} -64.0 +{ -64.0 + 92.2500 39.5000 -64.0 + 91.2500 41.5000 -64.0 + 93.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 84.2500 63.5000 -64.0 + 84.2500 64.5000 -64.0 + 82.2500 68.5000 -64.0 + 75.5000 74.2500 -64.0 + 70.5000 74.2500 -64.0 + 69.2500 75.5000 -64.0 + 64.2500 85.5000 -64.0 + 63.2500 90.5000 -64.0 + 58.5000 101.2500 -64.0 + 58.2500 106.5000 -64.0 + 60.5000 106.7500 -64.0 + 63.5000 103.7500 -64.0 + 63.7500 101.5000 -64.0 + 68.7500 91.5000 -64.0 + 66.5000 92.2500 -64.0 + 66.2500 93.5000 -64.0 + 64.5000 95.2500 -64.0 + 63.7500 93.5000 -64.0 + 64.5000 91.7500 -64.0 + 66.7500 85.5000 -64.0 + 68.7500 80.5000 -64.0 + 71.5000 76.7500 -64.0 + 75.2500 79.5000 -64.0 + 75.2500 82.5000 -64.0 + 76.2500 84.5000 -64.0 + 73.5000 87.2500 -64.0 + 71.5000 88.2500 -64.0 + 69.5000 90.7500 -64.0 + 78.5000 86.7500 -64.0 + 82.7500 82.5000 -64.0 + 86.7500 74.5000 -64.0 + 87.7500 67.5000 -64.0 + 85.2500 72.5000 -64.0 + 84.5000 74.2500 -64.0 + 83.7500 73.5000 -64.0 + 82.7500 71.5000 -64.0 + 83.5000 69.7500 -64.0 + 85.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 63.5000 -64.0 + 129.5000 65.2500 -64.0 + 129.2500 67.5000 -64.0 + 130.2500 69.5000 -64.0 + 130.2500 72.5000 -64.0 + 133.2500 78.5000 -64.0 + 134.2500 83.5000 -64.0 + 136.5000 85.7500 -64.0 + 146.2500 92.5000 -64.0 + 146.7500 91.5000 -64.0 + 142.7500 87.5000 -64.0 + 142.7500 84.5000 -64.0 + 141.7500 82.5000 -64.0 + 142.5000 78.7500 -64.0 + 146.5000 78.7500 -64.0 + 150.2500 86.5000 -64.0 + 151.2500 95.5000 -64.0 + 150.5000 97.2500 -64.0 + 147.7500 93.5000 -64.0 + 147.2500 94.5000 -64.0 + 149.2500 98.5000 -64.0 + 149.2500 101.5000 -64.0 + 151.2500 105.5000 -64.0 + 151.2500 109.5000 -64.0 + 153.5000 111.7500 -64.0 + 155.5000 110.7500 -64.0 + 155.7500 105.5000 -64.0 + 153.7500 101.5000 -64.0 + 153.7500 94.5000 -64.0 + 152.7500 92.5000 -64.0 + 151.7500 83.5000 -64.0 + 150.7500 81.5000 -64.0 + 150.7500 79.5000 -64.0 + 147.7500 75.5000 -64.0 + 143.5000 75.2500 -64.0 + 139.5000 73.2500 -64.0 + 137.7500 69.5000 -64.0 + 136.5000 70.2500 -64.0 + 134.7500 69.5000 -64.0 + 132.5000 71.2500 -64.0 + 131.7500 70.5000 -64.0 + 131.7500 67.5000 -64.0 + 133.5000 65.7500 -64.0 + 136.5000 65.7500 -64.0 + 138.2500 66.5000 -64.0 + 138.5000 68.7500 -64.0 + 138.7500 65.5000 -64.0 + 136.5000 65.2500 -64.0 + 134.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 111.5000 -64.0 + 113.5000 114.2500 -64.0 + 111.7500 113.5000 -64.0 + 107.5000 113.2500 -64.0 + 101.5000 116.2500 -64.0 + 94.5000 116.2500 -64.0 + 91.5000 115.2500 -64.0 + 87.2500 116.5000 -64.0 + 83.5000 123.2500 -64.0 + 83.2500 127.5000 -64.0 + 84.2500 130.5000 -64.0 + 89.5000 135.7500 -64.0 + 94.5000 136.7500 -64.0 + 97.5000 133.7500 -64.0 + 97.7500 131.5000 -64.0 + 100.5000 127.7500 -64.0 + 104.7500 125.5000 -64.0 + 103.7500 123.5000 -64.0 + 101.5000 123.2500 -64.0 + 99.5000 124.2500 -64.0 + 97.5000 124.2500 -64.0 + 97.2500 126.5000 -64.0 + 95.5000 128.2500 -64.0 + 93.7500 127.5000 -64.0 + 93.7500 125.5000 -64.0 + 92.5000 125.2500 -64.0 + 89.7500 122.5000 -64.0 + 93.5000 117.7500 -64.0 + 100.5000 117.7500 -64.0 + 106.5000 114.7500 -64.0 + 110.5000 114.7500 -64.0 + 112.5000 115.7500 -64.0 + 114.5000 114.7500 -64.0 + 116.5000 114.7500 -64.0 + 122.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 113.5000 -64.0 + 131.2500 115.5000 -64.0 + 131.2500 118.5000 -64.0 + 129.5000 120.2500 -64.0 + 129.2500 124.5000 -64.0 + 125.5000 127.2500 -64.0 + 122.7500 123.5000 -64.0 + 123.5000 121.7500 -64.0 + 125.5000 121.7500 -64.0 + 124.7500 120.5000 -64.0 + 119.5000 119.2500 -64.0 + 118.5000 121.2500 -64.0 + 115.5000 121.2500 -64.0 + 113.5000 122.2500 -64.0 + 113.2500 124.5000 -64.0 + 114.5000 123.7500 -64.0 + 118.5000 123.7500 -64.0 + 126.5000 130.7500 -64.0 + 132.5000 122.7500 -64.0 + 132.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 142.5000 -64.0 + 116.5000 143.2500 -64.0 + 113.5000 146.2500 -64.0 + 111.7500 145.5000 -64.0 + 107.5000 145.2500 -64.0 + 107.2500 146.5000 -64.0 + 111.2500 148.5000 -64.0 + 114.2500 154.5000 -64.0 + 116.5000 153.7500 -64.0 + 116.7500 148.5000 -64.0 + 119.5000 144.7500 -64.0 + 119.7500 142.5000 -64.0 +} -64.0 +{ -64.0 + 89.7500 47.5000 -64.0 + 91.5000 46.7500 -64.0 + 92.2500 48.5000 -64.0 + 90.5000 49.2500 -64.0 +} -64.0 +{ -64.0 + 59.7500 103.5000 -64.0 + 60.5000 102.7500 -64.0 + 61.2500 104.5000 -64.0 + 59.5000 106.2500 -64.0 + 58.7500 105.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 106.5000 -64.0 + 153.5000 105.7500 -64.0 + 155.2500 108.5000 -64.0 + 154.5000 110.2500 -64.0 + 152.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 86.7500 122.5000 -64.0 + 87.5000 121.7500 -64.0 + 88.2500 122.5000 -64.0 + 87.5000 124.2500 -64.0 +} -64.0 +v 246 z -170.000000 -64.0 +{ -64.0 + 105.2500 36.5000 -64.0 + 104.5000 37.2500 -64.0 + 102.5000 38.2500 -64.0 + 100.7500 37.5000 -64.0 + 98.5000 38.2500 -64.0 + 98.2500 39.5000 -64.0 + 95.5000 42.2500 -64.0 + 93.5000 42.2500 -64.0 + 93.2500 44.5000 -64.0 + 89.5000 48.2500 -64.0 + 88.2500 54.5000 -64.0 + 85.2500 60.5000 -64.0 + 86.5000 60.7500 -64.0 + 87.7500 58.5000 -64.0 + 88.7500 56.5000 -64.0 + 89.5000 54.7500 -64.0 + 91.5000 53.7500 -64.0 + 93.2500 54.5000 -64.0 + 94.2500 56.5000 -64.0 + 91.2500 63.5000 -64.0 + 92.7500 62.5000 -64.0 + 96.5000 55.7500 -64.0 + 96.7500 52.5000 -64.0 + 103.5000 46.7500 -64.0 + 109.5000 43.7500 -64.0 + 112.5000 43.7500 -64.0 + 117.5000 45.7500 -64.0 + 125.2500 52.5000 -64.0 + 128.2500 58.5000 -64.0 + 128.5000 62.7500 -64.0 + 130.5000 59.7500 -64.0 + 132.2500 60.5000 -64.0 + 133.2500 62.5000 -64.0 + 131.5000 64.2500 -64.0 + 129.5000 65.2500 -64.0 + 129.2500 67.5000 -64.0 + 130.2500 69.5000 -64.0 + 130.2500 71.5000 -64.0 + 133.2500 77.5000 -64.0 + 133.2500 79.5000 -64.0 + 134.2500 82.5000 -64.0 + 135.5000 82.7500 -64.0 + 146.2500 92.5000 -64.0 + 149.2500 98.5000 -64.0 + 149.2500 100.5000 -64.0 + 150.2500 102.5000 -64.0 + 150.2500 104.5000 -64.0 + 151.2500 106.5000 -64.0 + 151.5000 109.7500 -64.0 + 153.5000 110.7500 -64.0 + 155.5000 109.7500 -64.0 + 155.7500 105.5000 -64.0 + 154.7500 103.5000 -64.0 + 154.7500 101.5000 -64.0 + 153.7500 99.5000 -64.0 + 153.7500 94.5000 -64.0 + 152.7500 92.5000 -64.0 + 152.7500 87.5000 -64.0 + 151.7500 85.5000 -64.0 + 151.7500 82.5000 -64.0 + 149.7500 76.5000 -64.0 + 146.7500 73.5000 -64.0 + 142.5000 72.2500 -64.0 + 134.7500 63.5000 -64.0 + 134.7500 61.5000 -64.0 + 131.7500 57.5000 -64.0 + 128.7500 51.5000 -64.0 + 126.7500 50.5000 -64.0 + 128.5000 48.7500 -64.0 + 128.5000 45.2500 -64.0 + 126.5000 44.2500 -64.0 + 124.7500 39.5000 -64.0 + 120.5000 39.2500 -64.0 + 119.7500 37.5000 -64.0 + 110.5000 37.2500 -64.0 +} -64.0 +{ -64.0 + 84.2500 62.5000 -64.0 + 83.5000 63.2500 -64.0 + 83.2500 65.5000 -64.0 + 80.5000 68.2500 -64.0 + 76.5000 71.2500 -64.0 + 74.5000 71.2500 -64.0 + 71.5000 72.2500 -64.0 + 69.2500 74.5000 -64.0 + 68.2500 76.5000 -64.0 + 67.5000 78.2500 -64.0 + 65.2500 84.5000 -64.0 + 63.5000 88.2500 -64.0 + 63.2500 90.5000 -64.0 + 62.2500 93.5000 -64.0 + 59.5000 99.2500 -64.0 + 59.2500 101.5000 -64.0 + 58.2500 104.5000 -64.0 + 59.2500 106.5000 -64.0 + 61.7500 106.5000 -64.0 + 69.7500 90.5000 -64.0 + 68.2500 90.5000 -64.0 + 65.5000 94.2500 -64.0 + 64.7500 93.5000 -64.0 + 65.7500 88.5000 -64.0 + 66.7500 85.5000 -64.0 + 69.7500 78.5000 -64.0 + 72.5000 75.7500 -64.0 + 76.5000 73.7500 -64.0 + 77.2500 74.5000 -64.0 + 77.2500 83.5000 -64.0 + 71.5000 88.7500 -64.0 + 76.5000 86.7500 -64.0 + 83.7500 81.5000 -64.0 + 85.7500 77.5000 -64.0 + 86.5000 75.7500 -64.0 + 88.7500 69.5000 -64.0 + 90.7500 64.5000 -64.0 + 89.2500 65.5000 -64.0 + 88.2500 67.5000 -64.0 + 87.5000 69.2500 -64.0 + 85.2500 75.5000 -64.0 + 83.5000 76.2500 -64.0 + 81.7500 74.5000 -64.0 + 80.7500 72.5000 -64.0 + 82.7500 71.5000 -64.0 + 83.7500 66.5000 -64.0 + 84.7500 63.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 112.5000 -64.0 + 102.5000 116.2500 -64.0 + 103.5000 116.7500 -64.0 + 107.5000 113.7500 -64.0 + 109.5000 113.7500 -64.0 + 111.2500 115.5000 -64.0 + 115.5000 115.7500 -64.0 + 119.5000 113.7500 -64.0 + 122.5000 113.7500 -64.0 + 123.7500 112.5000 -64.0 + 121.5000 112.2500 -64.0 + 117.5000 114.2500 -64.0 + 112.5000 114.2500 -64.0 + 108.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 115.5000 -64.0 + 88.5000 116.2500 -64.0 + 87.2500 118.5000 -64.0 + 100.5000 118.7500 -64.0 + 101.7500 117.5000 -64.0 + 94.5000 117.2500 -64.0 +} -64.0 +{ -64.0 + 131.2500 115.5000 -64.0 + 130.2500 117.5000 -64.0 + 130.7500 118.5000 -64.0 + 131.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 86.2500 119.5000 -64.0 + 85.2500 120.5000 -64.0 + 84.2500 125.5000 -64.0 + 85.2500 128.5000 -64.0 + 86.5000 128.7500 -64.0 + 86.7500 125.5000 -64.0 + 85.7500 123.5000 -64.0 + 86.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 120.5000 -64.0 + 120.5000 121.2500 -64.0 + 118.5000 121.2500 -64.0 + 112.5000 124.2500 -64.0 + 110.7500 123.5000 -64.0 + 108.5000 123.2500 -64.0 + 108.2500 124.5000 -64.0 + 113.5000 124.7500 -64.0 + 115.5000 123.7500 -64.0 + 117.5000 123.7500 -64.0 + 121.5000 125.7500 -64.0 + 122.2500 127.5000 -64.0 + 124.2500 131.5000 -64.0 + 124.2500 134.5000 -64.0 + 126.5000 134.7500 -64.0 + 128.5000 131.7500 -64.0 + 128.7500 129.5000 -64.0 + 130.7500 125.5000 -64.0 + 129.7500 123.5000 -64.0 + 127.5000 123.2500 -64.0 + 129.2500 124.5000 -64.0 + 129.2500 127.5000 -64.0 + 126.5000 129.2500 -64.0 + 125.7500 128.5000 -64.0 + 122.7500 123.5000 -64.0 + 123.5000 122.7500 -64.0 + 126.7500 122.5000 -64.0 + 124.5000 122.2500 -64.0 + 122.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 124.5000 -64.0 + 93.2500 126.5000 -64.0 + 87.5000 131.2500 -64.0 + 89.2500 134.5000 -64.0 + 95.5000 138.7500 -64.0 + 97.5000 137.7500 -64.0 + 97.7500 131.5000 -64.0 + 100.7500 127.5000 -64.0 + 105.5000 125.7500 -64.0 + 103.7500 124.5000 -64.0 + 100.5000 124.2500 -64.0 + 96.5000 127.2500 -64.0 + 94.5000 134.2500 -64.0 + 92.5000 134.2500 -64.0 + 90.7500 132.5000 -64.0 + 90.7500 130.5000 -64.0 + 94.5000 127.7500 -64.0 + 94.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 139.5000 -64.0 + 120.5000 140.2500 -64.0 + 118.5000 141.2500 -64.0 + 114.5000 144.2500 -64.0 + 105.5000 144.2500 -64.0 + 102.5000 143.2500 -64.0 + 103.5000 144.7500 -64.0 + 109.5000 147.7500 -64.0 + 111.5000 145.7500 -64.0 + 114.5000 145.7500 -64.0 + 116.5000 144.7500 -64.0 + 117.2500 145.5000 -64.0 + 117.5000 148.7500 -64.0 + 117.7500 146.5000 -64.0 + 121.7500 141.5000 -64.0 + 122.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 154.5000 -64.0 + 113.2500 156.5000 -64.0 + 113.7500 155.5000 -64.0 +} -64.0 +{ -64.0 + 140.7500 75.5000 -64.0 + 142.5000 74.7500 -64.0 + 146.2500 77.5000 -64.0 + 149.2500 82.5000 -64.0 + 149.2500 84.5000 -64.0 + 150.2500 86.5000 -64.0 + 151.2500 94.5000 -64.0 + 150.5000 96.2500 -64.0 + 141.7500 84.5000 -64.0 + 141.7500 82.5000 -64.0 + 139.7500 81.5000 -64.0 + 139.7500 77.5000 -64.0 +} -64.0 +{ -64.0 + 134.7500 76.5000 -64.0 + 136.5000 75.7500 -64.0 + 138.2500 77.5000 -64.0 + 137.5000 78.2500 -64.0 + 135.5000 78.2500 -64.0 +} -64.0 +{ -64.0 + 60.5000 102.7500 -64.0 + 62.2500 103.5000 -64.0 + 60.5000 106.2500 -64.0 + 58.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 105.5000 -64.0 + 153.5000 104.7500 -64.0 + 155.2500 107.5000 -64.0 + 154.5000 109.2500 -64.0 + 152.7500 108.5000 -64.0 +} -64.0 +v 234 z -172.000000 -64.0 +{ -64.0 + 104.2500 38.5000 -64.0 + 103.5000 40.2500 -64.0 + 98.5000 39.2500 -64.0 + 98.2500 40.5000 -64.0 + 94.5000 43.2500 -64.0 + 90.2500 48.5000 -64.0 + 83.2500 62.5000 -64.0 + 76.5000 69.2500 -64.0 + 74.5000 69.2500 -64.0 + 69.5000 73.2500 -64.0 + 59.5000 100.2500 -64.0 + 59.2500 105.5000 -64.0 + 62.5000 105.7500 -64.0 + 66.7500 98.5000 -64.0 + 67.7500 93.5000 -64.0 + 70.5000 89.7500 -64.0 + 78.5000 84.7500 -64.0 + 82.5000 80.7500 -64.0 + 84.5000 79.7500 -64.0 + 91.7500 65.5000 -64.0 + 100.5000 50.7500 -64.0 + 104.5000 47.7500 -64.0 + 110.5000 44.7500 -64.0 + 115.5000 45.7500 -64.0 + 122.2500 51.5000 -64.0 + 127.2500 59.5000 -64.0 + 127.2500 61.5000 -64.0 + 128.5000 62.7500 -64.0 + 128.7500 60.5000 -64.0 + 127.7500 58.5000 -64.0 + 129.5000 56.7500 -64.0 + 131.2500 57.5000 -64.0 + 134.2500 62.5000 -64.0 + 133.2500 65.5000 -64.0 + 131.5000 66.2500 -64.0 + 129.5000 65.2500 -64.0 + 129.2500 67.5000 -64.0 + 130.2500 69.5000 -64.0 + 130.2500 71.5000 -64.0 + 133.2500 77.5000 -64.0 + 133.2500 79.5000 -64.0 + 139.2500 83.5000 -64.0 + 140.2500 85.5000 -64.0 + 145.2500 90.5000 -64.0 + 149.2500 97.5000 -64.0 + 149.2500 99.5000 -64.0 + 152.2500 109.5000 -64.0 + 154.5000 109.7500 -64.0 + 156.7500 106.5000 -64.0 + 155.7500 104.5000 -64.0 + 155.7500 102.5000 -64.0 + 153.7500 98.5000 -64.0 + 152.7500 86.5000 -64.0 + 148.7500 73.5000 -64.0 + 144.5000 71.2500 -64.0 + 138.5000 65.2500 -64.0 + 128.7500 50.5000 -64.0 + 128.7500 46.5000 -64.0 + 125.7500 44.5000 -64.0 + 125.7500 42.5000 -64.0 + 123.5000 40.2500 -64.0 + 120.5000 41.2500 -64.0 + 118.5000 38.2500 -64.0 + 116.5000 39.2500 -64.0 + 114.5000 38.2500 -64.0 + 112.5000 39.2500 -64.0 +} -64.0 +{ -64.0 + 106.2500 112.5000 -64.0 + 104.5000 113.2500 -64.0 + 103.5000 115.2500 -64.0 + 99.5000 118.2500 -64.0 + 96.5000 118.2500 -64.0 + 94.5000 119.2500 -64.0 + 89.5000 118.2500 -64.0 + 88.2500 119.5000 -64.0 + 92.5000 119.7500 -64.0 + 94.5000 121.7500 -64.0 + 100.5000 119.7500 -64.0 + 106.5000 113.7500 -64.0 + 109.5000 113.7500 -64.0 + 111.2500 115.5000 -64.0 + 115.2500 116.5000 -64.0 + 118.7500 115.5000 -64.0 + 113.5000 115.2500 -64.0 + 109.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 113.5000 -64.0 + 121.5000 114.2500 -64.0 + 119.5000 114.2500 -64.0 + 122.5000 115.7500 -64.0 + 125.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 116.5000 -64.0 + 130.2500 117.5000 -64.0 + 131.5000 117.7500 -64.0 + 131.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 118.5000 -64.0 + 119.2500 120.5000 -64.0 + 114.5000 124.2500 -64.0 + 111.5000 124.2500 -64.0 + 109.7500 123.5000 -64.0 + 106.5000 125.2500 -64.0 + 98.5000 125.2500 -64.0 + 95.5000 124.2500 -64.0 + 94.2500 127.5000 -64.0 + 90.2500 131.5000 -64.0 + 89.2500 133.5000 -64.0 + 90.2500 135.5000 -64.0 + 92.5000 130.7500 -64.0 + 94.5000 129.7500 -64.0 + 96.2500 130.5000 -64.0 + 96.2500 135.5000 -64.0 + 95.5000 137.2500 -64.0 + 93.5000 138.2500 -64.0 + 91.7500 136.5000 -64.0 + 91.2500 137.5000 -64.0 + 101.2500 145.5000 -64.0 + 103.5000 145.7500 -64.0 + 107.2500 148.5000 -64.0 + 108.7500 148.5000 -64.0 + 107.7500 146.5000 -64.0 + 108.5000 145.7500 -64.0 + 112.5000 145.7500 -64.0 + 116.5000 143.7500 -64.0 + 118.2500 144.5000 -64.0 + 118.5000 148.7500 -64.0 + 118.7500 145.5000 -64.0 + 123.5000 140.7500 -64.0 + 129.5000 132.7500 -64.0 + 129.7500 130.5000 -64.0 + 126.5000 131.2500 -64.0 + 124.7500 128.5000 -64.0 + 124.7500 125.5000 -64.0 + 126.5000 124.7500 -64.0 + 130.5000 126.7500 -64.0 + 130.7500 125.5000 -64.0 + 128.7500 123.5000 -64.0 + 125.5000 123.2500 -64.0 + 121.7500 121.5000 -64.0 + 121.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 85.2500 123.5000 -64.0 + 85.2500 125.5000 -64.0 + 86.5000 125.7500 -64.0 + 86.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 160.5000 -64.0 + 113.2500 161.5000 -64.0 + 114.7500 160.5000 -64.0 +} -64.0 +{ -64.0 + 98.7500 46.5000 -64.0 + 99.5000 45.7500 -64.0 + 100.2500 46.5000 -64.0 + 99.5000 47.2500 -64.0 +} -64.0 +{ -64.0 + 93.7500 49.5000 -64.0 + 94.5000 48.7500 -64.0 + 98.2500 50.5000 -64.0 + 96.2500 53.5000 -64.0 + 95.2500 55.5000 -64.0 + 93.2500 60.5000 -64.0 + 87.5000 67.2500 -64.0 + 87.2500 70.5000 -64.0 + 86.2500 73.5000 -64.0 + 78.5000 81.2500 -64.0 + 68.5000 90.2500 -64.0 + 66.5000 90.2500 -64.0 + 65.7500 88.5000 -64.0 + 66.7500 85.5000 -64.0 + 69.7500 78.5000 -64.0 + 72.5000 74.7500 -64.0 + 76.5000 72.7500 -64.0 + 76.7500 71.5000 -64.0 + 80.5000 68.7500 -64.0 + 82.5000 68.7500 -64.0 + 82.7500 67.5000 -64.0 + 86.7500 59.5000 -64.0 + 89.7500 57.5000 -64.0 + 88.7500 55.5000 -64.0 + 90.5000 53.7500 -64.0 + 94.5000 53.7500 -64.0 + 94.7500 51.5000 -64.0 +} -64.0 +{ -64.0 + 124.7500 51.5000 -64.0 + 126.5000 50.7500 -64.0 + 128.2500 51.5000 -64.0 + 128.2500 53.5000 -64.0 + 126.5000 54.2500 -64.0 +} -64.0 +{ -64.0 + 140.7500 75.5000 -64.0 + 141.5000 74.7500 -64.0 + 145.5000 74.7500 -64.0 + 147.2500 76.5000 -64.0 + 147.2500 78.5000 -64.0 + 149.2500 82.5000 -64.0 + 149.2500 85.5000 -64.0 + 150.2500 87.5000 -64.0 + 150.2500 90.5000 -64.0 + 151.2500 92.5000 -64.0 + 150.5000 94.2500 -64.0 + 148.7500 92.5000 -64.0 + 147.7500 90.5000 -64.0 + 145.5000 88.2500 -64.0 + 140.7500 81.5000 -64.0 + 137.7500 77.5000 -64.0 + 138.5000 76.7500 -64.0 +} -64.0 +{ -64.0 + 65.7500 91.5000 -64.0 + 66.5000 90.7500 -64.0 + 67.2500 91.5000 -64.0 + 65.5000 94.2500 -64.0 + 64.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 62.5000 99.7500 -64.0 + 63.2500 100.5000 -64.0 + 62.5000 101.2500 -64.0 + 62.2500 103.5000 -64.0 + 60.5000 104.2500 -64.0 + 59.7500 102.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 104.5000 -64.0 + 153.5000 103.7500 -64.0 + 154.2500 104.5000 -64.0 + 155.2500 106.5000 -64.0 + 154.5000 108.2500 -64.0 + 152.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 115.7500 124.5000 -64.0 + 117.5000 123.7500 -64.0 + 120.5000 124.7500 -64.0 + 123.2500 128.5000 -64.0 + 123.2500 133.5000 -64.0 + 122.2500 136.5000 -64.0 + 119.5000 140.2500 -64.0 + 111.5000 144.2500 -64.0 + 109.7500 143.5000 -64.0 + 105.5000 143.2500 -64.0 + 101.7500 141.5000 -64.0 + 98.7500 137.5000 -64.0 + 98.7500 134.5000 -64.0 + 97.7500 132.5000 -64.0 + 98.7500 129.5000 -64.0 + 101.5000 126.7500 -64.0 + 103.5000 126.7500 -64.0 + 105.5000 125.7500 -64.0 + 109.5000 125.7500 -64.0 + 111.5000 124.7500 -64.0 +} -64.0 +v 203 z -174.000000 -64.0 +{ -64.0 + 106.2500 39.5000 -64.0 + 103.5000 41.2500 -64.0 + 100.5000 40.2500 -64.0 + 96.5000 44.2500 -64.0 + 94.5000 44.2500 -64.0 + 94.2500 45.5000 -64.0 + 89.2500 50.5000 -64.0 + 86.2500 56.5000 -64.0 + 77.5000 66.2500 -64.0 + 69.5000 72.2500 -64.0 + 59.5000 100.2500 -64.0 + 60.2500 101.5000 -64.0 + 60.2500 104.5000 -64.0 + 63.5000 104.7500 -64.0 + 65.7500 101.5000 -64.0 + 67.7500 92.5000 -64.0 + 76.5000 83.7500 -64.0 + 78.5000 82.7500 -64.0 + 86.7500 75.5000 -64.0 + 92.7500 64.5000 -64.0 + 98.7500 56.5000 -64.0 + 100.7500 52.5000 -64.0 + 107.5000 46.7500 -64.0 + 114.5000 46.7500 -64.0 + 120.2500 50.5000 -64.0 + 123.2500 54.5000 -64.0 + 123.2500 56.5000 -64.0 + 126.2500 60.5000 -64.0 + 130.2500 68.5000 -64.0 + 131.2500 74.5000 -64.0 + 139.5000 81.7500 -64.0 + 144.2500 88.5000 -64.0 + 150.2500 98.5000 -64.0 + 150.2500 103.5000 -64.0 + 152.2500 107.5000 -64.0 + 155.5000 107.7500 -64.0 + 156.7500 103.5000 -64.0 + 154.7500 99.5000 -64.0 + 153.7500 91.5000 -64.0 + 151.7500 84.5000 -64.0 + 150.7500 77.5000 -64.0 + 148.5000 72.2500 -64.0 + 146.5000 71.2500 -64.0 + 136.7500 60.5000 -64.0 + 123.7500 42.5000 -64.0 + 119.5000 42.2500 -64.0 + 118.7500 40.5000 -64.0 + 109.5000 40.2500 -64.0 +} -64.0 +{ -64.0 + 107.2500 111.5000 -64.0 + 105.2500 112.5000 -64.0 + 107.5000 112.7500 -64.0 + 114.2500 116.5000 -64.0 + 118.5000 116.7500 -64.0 + 120.2500 117.5000 -64.0 + 119.2500 119.5000 -64.0 + 114.5000 124.2500 -64.0 + 110.5000 124.2500 -64.0 + 108.5000 125.2500 -64.0 + 101.5000 125.2500 -64.0 + 98.5000 124.2500 -64.0 + 97.7500 122.5000 -64.0 + 101.5000 119.7500 -64.0 + 102.7500 116.5000 -64.0 + 94.5000 121.2500 -64.0 + 96.2500 123.5000 -64.0 + 96.2500 126.5000 -64.0 + 93.5000 129.2500 -64.0 + 89.5000 131.2500 -64.0 + 89.5000 136.7500 -64.0 + 91.5000 133.7500 -64.0 + 93.5000 132.7500 -64.0 + 95.2500 133.5000 -64.0 + 99.2500 141.5000 -64.0 + 104.2500 144.5000 -64.0 + 113.5000 144.7500 -64.0 + 116.5000 143.7500 -64.0 + 121.5000 139.7500 -64.0 + 122.2500 141.5000 -64.0 + 120.5000 143.2500 -64.0 + 120.2500 147.5000 -64.0 + 122.7500 142.5000 -64.0 + 130.5000 133.7500 -64.0 + 130.7500 131.5000 -64.0 + 129.2500 132.5000 -64.0 + 128.2500 134.5000 -64.0 + 123.5000 138.2500 -64.0 + 122.7500 137.5000 -64.0 + 124.5000 134.7500 -64.0 + 124.7500 128.5000 -64.0 + 126.5000 126.7500 -64.0 + 129.5000 126.7500 -64.0 + 131.5000 128.7500 -64.0 + 131.7500 126.5000 -64.0 + 128.7500 122.5000 -64.0 + 125.5000 124.2500 -64.0 + 122.2500 124.5000 -64.0 + 123.2500 126.5000 -64.0 + 123.2500 131.5000 -64.0 + 121.2500 137.5000 -64.0 + 118.5000 140.2500 -64.0 + 113.5000 143.2500 -64.0 + 106.5000 143.2500 -64.0 + 103.5000 142.2500 -64.0 + 100.7500 139.5000 -64.0 + 97.7500 133.5000 -64.0 + 97.7500 129.5000 -64.0 + 100.5000 126.7500 -64.0 + 107.5000 126.7500 -64.0 + 117.5000 123.7500 -64.0 + 121.5000 123.7500 -64.0 + 120.7500 122.5000 -64.0 + 120.7500 119.5000 -64.0 + 123.5000 116.7500 -64.0 + 127.2500 117.5000 -64.0 + 127.7500 116.5000 -64.0 + 122.7500 115.5000 -64.0 + 114.5000 115.2500 -64.0 + 108.7500 111.5000 -64.0 +} -64.0 +{ -64.0 + 85.2500 124.5000 -64.0 + 84.2500 126.5000 -64.0 + 86.5000 126.7500 -64.0 + 86.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 143.5000 -64.0 + 104.5000 147.7500 -64.0 + 107.2500 150.5000 -64.0 + 107.7500 149.5000 -64.0 + 105.5000 147.2500 -64.0 + 98.7500 143.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 148.5000 -64.0 + 119.2500 150.5000 -64.0 + 119.7500 149.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 161.5000 -64.0 + 112.2500 162.5000 -64.0 + 113.5000 162.7500 -64.0 + 113.7500 161.5000 -64.0 +} -64.0 +{ -64.0 + 97.7500 46.5000 -64.0 + 98.5000 45.7500 -64.0 + 100.2500 46.5000 -64.0 + 101.2500 48.5000 -64.0 + 99.5000 50.2500 -64.0 + 98.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 94.7500 50.5000 -64.0 + 95.5000 49.7500 -64.0 + 98.2500 52.5000 -64.0 + 97.2500 54.5000 -64.0 + 94.5000 57.2500 -64.0 + 94.2500 59.5000 -64.0 + 91.2500 62.5000 -64.0 + 90.2500 64.5000 -64.0 + 88.5000 65.2500 -64.0 + 88.2500 66.5000 -64.0 + 85.2500 73.5000 -64.0 + 82.2500 76.5000 -64.0 + 81.2500 78.5000 -64.0 + 79.5000 79.2500 -64.0 + 73.5000 85.2500 -64.0 + 69.5000 88.2500 -64.0 + 67.5000 89.2500 -64.0 + 66.7500 87.5000 -64.0 + 67.7500 84.5000 -64.0 + 71.7500 74.5000 -64.0 + 77.5000 68.7500 -64.0 + 81.5000 66.7500 -64.0 + 84.5000 63.7500 -64.0 + 86.7500 56.5000 -64.0 + 89.5000 54.7500 -64.0 + 92.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 124.7500 52.5000 -64.0 + 126.5000 51.7500 -64.0 + 128.2500 52.5000 -64.0 + 129.2500 54.5000 -64.0 + 130.5000 54.7500 -64.0 + 136.2500 63.5000 -64.0 + 136.2500 65.5000 -64.0 + 134.5000 67.2500 -64.0 + 132.5000 67.2500 -64.0 + 128.7500 62.5000 -64.0 + 126.7500 58.5000 -64.0 + 128.7500 57.5000 -64.0 + 124.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 142.7500 74.5000 -64.0 + 144.5000 73.7500 -64.0 + 146.2500 74.5000 -64.0 + 148.2500 78.5000 -64.0 + 148.2500 80.5000 -64.0 + 149.2500 82.5000 -64.0 + 150.2500 90.5000 -64.0 + 149.5000 92.2500 -64.0 + 138.7500 77.5000 -64.0 + 139.5000 75.7500 -64.0 + 141.5000 75.7500 -64.0 +} -64.0 +{ -64.0 + 63.5000 97.7500 -64.0 + 64.2500 98.5000 -64.0 + 63.5000 99.2500 -64.0 + 63.2500 101.5000 -64.0 + 62.5000 103.2500 -64.0 + 60.7500 102.5000 -64.0 + 60.7500 100.5000 -64.0 +} -64.0 +{ -64.0 + 152.7500 101.5000 -64.0 + 153.5000 100.7500 -64.0 + 155.2500 103.5000 -64.0 + 154.5000 105.2500 -64.0 + 152.7500 104.5000 -64.0 +} -64.0 +v 187 z -176.000000 -64.0 +{ -64.0 + 103.2500 41.5000 -64.0 + 102.5000 42.2500 -64.0 + 99.5000 42.2500 -64.0 + 91.2500 49.5000 -64.0 + 82.2500 59.5000 -64.0 + 81.2500 61.5000 -64.0 + 69.5000 72.2500 -64.0 + 69.2500 74.5000 -64.0 + 68.2500 77.5000 -64.0 + 66.2500 82.5000 -64.0 + 65.5000 84.2500 -64.0 + 62.2500 93.5000 -64.0 + 60.5000 97.2500 -64.0 + 60.2500 103.5000 -64.0 + 63.5000 103.7500 -64.0 + 65.7500 100.5000 -64.0 + 66.7500 95.5000 -64.0 + 67.7500 92.5000 -64.0 + 79.5000 79.7500 -64.0 + 87.7500 73.5000 -64.0 + 91.7500 65.5000 -64.0 + 97.7500 58.5000 -64.0 + 103.5000 50.7500 -64.0 + 108.5000 47.7500 -64.0 + 112.5000 47.7500 -64.0 + 117.5000 49.7500 -64.0 + 121.2500 53.5000 -64.0 + 124.2500 58.5000 -64.0 + 129.2500 66.5000 -64.0 + 131.2500 72.5000 -64.0 + 140.2500 80.5000 -64.0 + 144.2500 87.5000 -64.0 + 145.2500 89.5000 -64.0 + 148.2500 93.5000 -64.0 + 151.2500 99.5000 -64.0 + 151.2500 103.5000 -64.0 + 152.5000 104.7500 -64.0 + 154.5000 105.7500 -64.0 + 155.5000 103.7500 -64.0 + 154.7500 102.5000 -64.0 + 154.7500 96.5000 -64.0 + 153.7500 94.5000 -64.0 + 153.7500 91.5000 -64.0 + 152.7500 89.5000 -64.0 + 152.7500 87.5000 -64.0 + 151.7500 85.5000 -64.0 + 151.7500 82.5000 -64.0 + 150.7500 80.5000 -64.0 + 150.7500 77.5000 -64.0 + 148.7500 72.5000 -64.0 + 140.7500 64.5000 -64.0 + 139.5000 62.2500 -64.0 + 131.7500 52.5000 -64.0 + 130.7500 50.5000 -64.0 + 123.7500 44.5000 -64.0 + 121.5000 44.2500 -64.0 + 117.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 115.5000 -64.0 + 118.2500 118.5000 -64.0 + 118.2500 120.5000 -64.0 + 114.5000 124.2500 -64.0 + 112.5000 124.2500 -64.0 + 110.5000 125.2500 -64.0 + 111.5000 125.7500 -64.0 + 113.5000 124.7500 -64.0 + 116.5000 124.7500 -64.0 + 120.5000 122.7500 -64.0 + 120.7500 118.5000 -64.0 + 119.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 98.2500 120.5000 -64.0 + 97.2500 122.5000 -64.0 + 98.2500 125.5000 -64.0 + 100.2500 126.5000 -64.0 + 104.7500 126.5000 -64.0 + 99.7500 122.5000 -64.0 + 99.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 121.5000 -64.0 + 128.2500 123.5000 -64.0 + 124.5000 127.2500 -64.0 + 121.2500 137.5000 -64.0 + 112.5000 143.2500 -64.0 + 108.5000 143.2500 -64.0 + 102.5000 141.2500 -64.0 + 94.7500 130.5000 -64.0 + 90.5000 130.2500 -64.0 + 88.7500 128.5000 -64.0 + 88.5000 123.2500 -64.0 + 88.2500 129.5000 -64.0 + 90.2500 131.5000 -64.0 + 88.2500 135.5000 -64.0 + 89.5000 135.7500 -64.0 + 93.5000 133.7500 -64.0 + 95.2500 134.5000 -64.0 + 97.2500 138.5000 -64.0 + 103.2500 143.5000 -64.0 + 107.2500 144.5000 -64.0 + 112.5000 144.7500 -64.0 + 117.5000 142.7500 -64.0 + 120.5000 139.7500 -64.0 + 122.5000 138.7500 -64.0 + 124.5000 134.7500 -64.0 + 124.7500 130.5000 -64.0 + 127.5000 127.7500 -64.0 + 130.5000 127.7500 -64.0 + 132.2500 129.5000 -64.0 + 132.2500 131.5000 -64.0 + 133.7500 130.5000 -64.0 + 131.7500 126.5000 -64.0 + 131.7500 123.5000 -64.0 + 129.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 125.5000 -64.0 + 106.2500 126.5000 -64.0 + 108.5000 126.7500 -64.0 + 108.7500 125.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 137.5000 -64.0 + 123.2500 142.5000 -64.0 + 125.7500 140.5000 -64.0 + 126.7500 138.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 149.5000 -64.0 + 120.2500 152.5000 -64.0 + 121.5000 150.7500 -64.0 +} -64.0 +{ -64.0 + 107.2500 151.5000 -64.0 + 107.2500 152.5000 -64.0 + 109.2500 156.5000 -64.0 + 109.7500 155.5000 -64.0 + 108.7500 152.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 152.5000 -64.0 + 114.5000 153.2500 -64.0 + 114.2500 156.5000 -64.0 + 116.5000 154.7500 -64.0 +} -64.0 +{ -64.0 + 97.7500 46.5000 -64.0 + 98.5000 45.7500 -64.0 + 101.2500 49.5000 -64.0 + 98.5000 51.2500 -64.0 + 97.7500 50.5000 -64.0 +} -64.0 +{ -64.0 + 93.7500 50.5000 -64.0 + 94.5000 49.7500 -64.0 + 98.2500 52.5000 -64.0 + 96.2500 57.5000 -64.0 + 88.5000 65.2500 -64.0 + 88.2500 67.5000 -64.0 + 85.2500 71.5000 -64.0 + 84.2500 73.5000 -64.0 + 72.5000 85.2500 -64.0 + 68.5000 87.2500 -64.0 + 67.7500 85.5000 -64.0 + 68.7500 82.5000 -64.0 + 72.7500 72.5000 -64.0 + 75.5000 69.7500 -64.0 + 80.7500 65.5000 -64.0 + 81.7500 63.5000 -64.0 + 89.5000 54.7500 -64.0 + 91.7500 54.5000 -64.0 +} -64.0 +{ -64.0 + 124.7500 53.5000 -64.0 + 125.5000 52.7500 -64.0 + 129.5000 52.7500 -64.0 + 132.2500 56.5000 -64.0 + 132.5000 59.7500 -64.0 + 136.2500 62.5000 -64.0 + 138.2500 66.5000 -64.0 + 139.5000 66.7500 -64.0 + 143.2500 70.5000 -64.0 + 146.2500 74.5000 -64.0 + 148.2500 78.5000 -64.0 + 148.2500 81.5000 -64.0 + 149.2500 83.5000 -64.0 + 149.2500 86.5000 -64.0 + 150.2500 88.5000 -64.0 + 149.5000 89.2500 -64.0 + 147.5000 88.2500 -64.0 + 139.7500 78.5000 -64.0 + 139.7500 76.5000 -64.0 + 141.5000 74.7500 -64.0 + 140.7500 73.5000 -64.0 + 136.5000 73.2500 -64.0 + 133.7500 70.5000 -64.0 + 133.7500 67.5000 -64.0 + 130.7500 65.5000 -64.0 + 130.7500 62.5000 -64.0 + 127.7500 59.5000 -64.0 +} -64.0 +{ -64.0 + 62.7500 96.5000 -64.0 + 63.5000 95.7500 -64.0 + 64.2500 96.5000 -64.0 + 64.2500 98.5000 -64.0 + 63.2500 101.5000 -64.0 + 61.5000 102.2500 -64.0 + 60.7500 100.5000 -64.0 +} -64.0 +v 182 z -178.000000 -64.0 +{ -64.0 + 106.2500 41.5000 -64.0 + 105.5000 42.2500 -64.0 + 102.5000 42.2500 -64.0 + 94.5000 46.2500 -64.0 + 72.2500 69.5000 -64.0 + 69.5000 73.2500 -64.0 + 69.2500 75.5000 -64.0 + 68.2500 78.5000 -64.0 + 66.5000 82.2500 -64.0 + 66.2500 84.5000 -64.0 + 63.2500 90.5000 -64.0 + 62.2500 95.5000 -64.0 + 61.5000 97.2500 -64.0 + 61.2500 101.5000 -64.0 + 63.5000 101.7500 -64.0 + 65.5000 98.7500 -64.0 + 65.7500 96.5000 -64.0 + 67.7500 91.5000 -64.0 + 75.7500 83.5000 -64.0 + 76.7500 81.5000 -64.0 + 89.7500 69.5000 -64.0 + 90.7500 67.5000 -64.0 + 96.5000 59.7500 -64.0 + 98.7500 58.5000 -64.0 + 99.7500 56.5000 -64.0 + 104.5000 51.7500 -64.0 + 110.5000 48.7500 -64.0 + 113.5000 49.7500 -64.0 + 119.2500 52.5000 -64.0 + 129.2500 66.5000 -64.0 + 131.2500 70.5000 -64.0 + 137.5000 76.7500 -64.0 + 139.5000 77.7500 -64.0 + 139.7500 75.5000 -64.0 + 133.7500 69.5000 -64.0 + 133.7500 67.5000 -64.0 + 130.7500 64.5000 -64.0 + 130.7500 62.5000 -64.0 + 127.7500 59.5000 -64.0 + 123.7500 52.5000 -64.0 + 122.7500 50.5000 -64.0 + 123.5000 48.7500 -64.0 + 125.2500 51.5000 -64.0 + 128.5000 51.7500 -64.0 + 131.2500 55.5000 -64.0 + 133.5000 59.7500 -64.0 + 135.5000 60.7500 -64.0 + 141.2500 67.5000 -64.0 + 147.2500 75.5000 -64.0 + 147.2500 77.5000 -64.0 + 148.2500 79.5000 -64.0 + 148.2500 83.5000 -64.0 + 147.5000 85.2500 -64.0 + 140.2500 78.5000 -64.0 + 145.2500 88.5000 -64.0 + 149.2500 93.5000 -64.0 + 152.2500 97.5000 -64.0 + 152.2500 100.5000 -64.0 + 153.5000 101.7500 -64.0 + 153.7500 97.5000 -64.0 + 152.7500 95.5000 -64.0 + 152.7500 90.5000 -64.0 + 151.7500 88.5000 -64.0 + 151.7500 83.5000 -64.0 + 150.7500 81.5000 -64.0 + 150.7500 77.5000 -64.0 + 146.7500 69.5000 -64.0 + 135.7500 57.5000 -64.0 + 134.7500 55.5000 -64.0 + 128.5000 48.2500 -64.0 + 115.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 116.5000 -64.0 + 115.2500 117.5000 -64.0 + 116.5000 117.7500 -64.0 + 118.2500 120.5000 -64.0 + 117.5000 121.2500 -64.0 + 113.5000 119.2500 -64.0 + 114.2500 120.5000 -64.0 + 115.2500 122.5000 -64.0 + 114.2500 124.5000 -64.0 + 119.5000 124.7500 -64.0 + 121.5000 123.7500 -64.0 + 121.7500 121.5000 -64.0 + 119.7500 117.5000 -64.0 + 117.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 121.5000 -64.0 + 100.2500 126.5000 -64.0 + 103.5000 126.7500 -64.0 +} -64.0 +{ -64.0 + 87.2500 127.5000 -64.0 + 86.5000 128.2500 -64.0 + 84.5000 129.2500 -64.0 + 84.2500 130.5000 -64.0 + 86.2500 131.5000 -64.0 + 87.5000 130.7500 -64.0 + 89.5000 130.7500 -64.0 + 91.2500 134.5000 -64.0 + 93.5000 134.7500 -64.0 + 95.2500 135.5000 -64.0 + 98.2500 139.5000 -64.0 + 104.5000 143.7500 -64.0 + 113.5000 144.7500 -64.0 + 115.2500 145.5000 -64.0 + 115.2500 148.5000 -64.0 + 116.7500 147.5000 -64.0 + 115.7500 145.5000 -64.0 + 116.7500 143.5000 -64.0 + 119.5000 140.7500 -64.0 + 121.5000 139.7500 -64.0 + 124.5000 134.7500 -64.0 + 124.7500 131.5000 -64.0 + 127.5000 128.7500 -64.0 + 128.2500 129.5000 -64.0 + 130.5000 129.7500 -64.0 + 134.5000 131.7500 -64.0 + 135.7500 130.5000 -64.0 + 132.5000 128.2500 -64.0 + 127.5000 127.2500 -64.0 + 124.5000 130.2500 -64.0 + 122.2500 136.5000 -64.0 + 116.5000 141.2500 -64.0 + 110.5000 143.2500 -64.0 + 108.7500 142.5000 -64.0 + 105.5000 142.2500 -64.0 + 102.5000 141.2500 -64.0 + 93.7500 131.5000 -64.0 + 89.5000 130.2500 -64.0 + 88.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 139.5000 -64.0 + 125.5000 140.2500 -64.0 + 120.2500 150.5000 -64.0 + 121.7500 151.5000 -64.0 + 125.7500 141.5000 -64.0 + 128.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 143.5000 -64.0 + 94.2500 144.5000 -64.0 + 98.7500 144.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 148.5000 -64.0 + 108.5000 152.2500 -64.0 + 105.5000 150.2500 -64.0 + 105.2500 151.5000 -64.0 + 108.2500 155.5000 -64.0 + 109.5000 155.7500 -64.0 + 111.5000 149.7500 -64.0 + 113.2500 150.5000 -64.0 + 114.5000 152.7500 -64.0 + 114.7500 149.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 43.5000 -64.0 + 108.5000 42.7500 -64.0 + 113.5000 42.7500 -64.0 + 115.2500 44.5000 -64.0 + 118.5000 44.7500 -64.0 + 119.2500 46.5000 -64.0 + 118.5000 48.2500 -64.0 + 114.7500 46.5000 -64.0 + 108.5000 46.2500 -64.0 + 105.5000 47.2500 -64.0 + 103.7500 46.5000 -64.0 + 104.5000 45.7500 -64.0 + 106.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 96.7500 47.5000 -64.0 + 98.5000 46.7500 -64.0 + 101.2500 50.5000 -64.0 + 99.2500 51.5000 -64.0 + 97.2500 55.5000 -64.0 + 92.2500 60.5000 -64.0 + 87.2500 68.5000 -64.0 + 77.5000 79.2500 -64.0 + 70.5000 85.2500 -64.0 + 68.7500 84.5000 -64.0 + 69.7500 79.5000 -64.0 + 71.5000 77.7500 -64.0 + 71.7500 74.5000 -64.0 + 77.5000 66.7500 -64.0 + 79.5000 65.7500 -64.0 + 89.5000 55.7500 -64.0 + 94.5000 49.7500 -64.0 + 96.5000 49.7500 -64.0 + 95.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 62.7500 95.5000 -64.0 + 63.5000 94.7500 -64.0 + 64.2500 95.5000 -64.0 + 63.5000 96.2500 -64.0 +} -64.0 +v 164 z -180.000000 -64.0 +{ -64.0 + 107.2500 41.5000 -64.0 + 106.5000 42.2500 -64.0 + 104.5000 42.2500 -64.0 + 101.2500 43.5000 -64.0 + 94.5000 46.2500 -64.0 + 91.5000 49.2500 -64.0 + 87.5000 55.2500 -64.0 + 85.5000 56.2500 -64.0 + 70.2500 71.5000 -64.0 + 69.2500 76.5000 -64.0 + 68.2500 78.5000 -64.0 + 67.2500 85.5000 -64.0 + 64.2500 91.5000 -64.0 + 63.2500 96.5000 -64.0 + 63.7500 97.5000 -64.0 + 65.7500 93.5000 -64.0 + 67.5000 89.7500 -64.0 + 69.5000 88.7500 -64.0 + 77.7500 80.5000 -64.0 + 78.7500 78.5000 -64.0 + 76.5000 79.2500 -64.0 + 72.5000 82.2500 -64.0 + 70.7500 81.5000 -64.0 + 70.7500 78.5000 -64.0 + 74.7500 70.5000 -64.0 + 77.5000 66.7500 -64.0 + 82.7500 62.5000 -64.0 + 96.5000 47.7500 -64.0 + 98.5000 47.7500 -64.0 + 100.2500 48.5000 -64.0 + 100.2500 51.5000 -64.0 + 91.2500 61.5000 -64.0 + 89.2500 65.5000 -64.0 + 84.2500 70.5000 -64.0 + 83.2500 72.5000 -64.0 + 84.5000 72.7500 -64.0 + 90.7500 67.5000 -64.0 + 91.7500 65.5000 -64.0 + 105.5000 51.7500 -64.0 + 111.5000 49.7500 -64.0 + 116.5000 51.7500 -64.0 + 126.2500 61.5000 -64.0 + 127.2500 63.5000 -64.0 + 137.2500 74.5000 -64.0 + 138.2500 76.5000 -64.0 + 146.2500 87.5000 -64.0 + 147.2500 89.5000 -64.0 + 149.2500 90.5000 -64.0 + 150.5000 89.7500 -64.0 + 150.7500 79.5000 -64.0 + 149.7500 77.5000 -64.0 + 149.7500 74.5000 -64.0 + 145.7500 68.5000 -64.0 + 144.7500 66.5000 -64.0 + 136.5000 58.2500 -64.0 + 134.5000 57.2500 -64.0 + 132.7500 53.5000 -64.0 + 129.7500 49.5000 -64.0 + 124.5000 46.2500 -64.0 + 115.7500 41.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 115.5000 -64.0 + 113.5000 119.2500 -64.0 + 110.5000 119.2500 -64.0 + 104.5000 121.2500 -64.0 + 101.5000 120.2500 -64.0 + 99.2500 126.5000 -64.0 + 100.2500 128.5000 -64.0 + 102.5000 128.7500 -64.0 + 104.5000 123.7500 -64.0 + 108.5000 121.7500 -64.0 + 110.2500 122.5000 -64.0 + 110.2500 124.5000 -64.0 + 108.5000 126.2500 -64.0 + 105.5000 126.2500 -64.0 + 105.2500 127.5000 -64.0 + 108.5000 127.7500 -64.0 + 110.5000 126.7500 -64.0 + 112.5000 126.7500 -64.0 + 114.5000 124.7500 -64.0 + 115.2500 126.5000 -64.0 + 116.5000 126.7500 -64.0 + 119.5000 123.7500 -64.0 + 120.2500 124.5000 -64.0 + 121.5000 123.7500 -64.0 + 121.7500 120.5000 -64.0 + 120.7500 117.5000 -64.0 + 119.5000 117.2500 -64.0 + 117.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 128.5000 -64.0 + 125.2500 130.5000 -64.0 + 128.5000 130.7500 -64.0 + 130.2500 132.5000 -64.0 + 136.5000 132.7500 -64.0 + 136.7500 131.5000 -64.0 + 130.5000 131.2500 -64.0 +} -64.0 +{ -64.0 + 87.2500 131.5000 -64.0 + 86.2500 133.5000 -64.0 + 87.5000 133.7500 -64.0 + 90.5000 132.7500 -64.0 + 92.2500 135.5000 -64.0 + 96.2500 136.5000 -64.0 + 97.2500 138.5000 -64.0 + 103.2500 143.5000 -64.0 + 108.2500 144.5000 -64.0 + 109.2500 146.5000 -64.0 + 107.5000 148.2500 -64.0 + 104.5000 147.2500 -64.0 + 100.7500 143.5000 -64.0 + 98.5000 143.2500 -64.0 + 101.5000 146.7500 -64.0 + 105.2500 149.5000 -64.0 + 108.5000 149.7500 -64.0 + 111.5000 148.7500 -64.0 + 114.5000 149.7500 -64.0 + 115.5000 147.7500 -64.0 + 115.5000 145.2500 -64.0 + 111.5000 143.2500 -64.0 + 102.5000 141.2500 -64.0 + 98.7500 137.5000 -64.0 + 97.7500 135.5000 -64.0 + 90.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 132.5000 -64.0 + 123.5000 133.2500 -64.0 + 123.2500 135.5000 -64.0 + 118.5000 140.7500 -64.0 + 122.5000 138.7500 -64.0 + 122.7500 137.5000 -64.0 + 124.5000 135.7500 -64.0 + 124.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 138.5000 -64.0 + 122.5000 144.2500 -64.0 + 120.5000 145.2500 -64.0 + 120.2500 146.5000 -64.0 + 122.5000 146.7500 -64.0 + 126.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 43.5000 -64.0 + 108.5000 42.7500 -64.0 + 112.5000 42.7500 -64.0 + 126.5000 49.7500 -64.0 + 129.2500 52.5000 -64.0 + 132.2500 56.5000 -64.0 + 133.2500 58.5000 -64.0 + 139.5000 64.7500 -64.0 + 144.2500 71.5000 -64.0 + 147.2500 76.5000 -64.0 + 147.2500 79.5000 -64.0 + 146.5000 81.2500 -64.0 + 143.5000 80.2500 -64.0 + 140.7500 77.5000 -64.0 + 139.7500 75.5000 -64.0 + 133.7500 68.5000 -64.0 + 133.7500 66.5000 -64.0 + 131.7500 64.5000 -64.0 + 128.7500 60.5000 -64.0 + 126.7500 56.5000 -64.0 + 125.5000 56.2500 -64.0 + 124.7500 54.5000 -64.0 + 120.7500 50.5000 -64.0 + 115.5000 47.2500 -64.0 + 108.5000 46.2500 -64.0 + 106.5000 48.2500 -64.0 + 104.5000 48.2500 -64.0 + 102.7500 47.5000 -64.0 + 102.7500 45.5000 -64.0 +} -64.0 +v 148 z -182.000000 -64.0 +{ -64.0 + 109.2500 40.5000 -64.0 + 108.5000 41.2500 -64.0 + 106.2500 41.5000 -64.0 + 93.5000 47.2500 -64.0 + 90.2500 51.5000 -64.0 + 89.2500 53.5000 -64.0 + 90.5000 53.7500 -64.0 + 98.5000 47.7500 -64.0 + 101.5000 47.7500 -64.0 + 101.7500 46.5000 -64.0 + 104.5000 44.7500 -64.0 + 108.5000 42.7500 -64.0 + 113.5000 42.7500 -64.0 + 115.2500 43.5000 -64.0 + 120.2500 46.5000 -64.0 + 127.2500 50.5000 -64.0 + 130.2500 54.5000 -64.0 + 132.7500 54.5000 -64.0 + 130.7500 50.5000 -64.0 + 124.5000 46.2500 -64.0 + 113.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 47.5000 -64.0 + 108.5000 48.2500 -64.0 + 106.5000 48.2500 -64.0 + 102.5000 50.2500 -64.0 + 100.5000 50.2500 -64.0 + 100.2500 51.5000 -64.0 + 97.2500 54.5000 -64.0 + 95.2500 58.5000 -64.0 + 91.2500 61.5000 -64.0 + 90.2500 63.5000 -64.0 + 85.2500 68.5000 -64.0 + 83.2500 72.5000 -64.0 + 89.5000 66.7500 -64.0 + 91.5000 65.7500 -64.0 + 96.5000 59.7500 -64.0 + 104.5000 53.7500 -64.0 + 109.5000 50.7500 -64.0 + 111.5000 50.7500 -64.0 + 119.5000 54.7500 -64.0 + 133.5000 68.7500 -64.0 + 138.2500 75.5000 -64.0 + 139.2500 77.5000 -64.0 + 145.2500 83.5000 -64.0 + 146.2500 85.5000 -64.0 + 148.5000 85.7500 -64.0 + 149.5000 83.7500 -64.0 + 149.7500 76.5000 -64.0 + 144.7500 66.5000 -64.0 + 139.7500 61.5000 -64.0 + 138.7500 59.5000 -64.0 + 136.5000 57.2500 -64.0 + 134.5000 56.2500 -64.0 + 134.2500 57.5000 -64.0 + 135.2500 60.5000 -64.0 + 139.2500 64.5000 -64.0 + 145.2500 72.5000 -64.0 + 145.2500 75.5000 -64.0 + 144.5000 77.2500 -64.0 + 142.5000 77.2500 -64.0 + 134.7500 68.5000 -64.0 + 133.7500 66.5000 -64.0 + 127.7500 59.5000 -64.0 + 127.7500 57.5000 -64.0 + 124.5000 54.2500 -64.0 + 120.7500 51.5000 -64.0 + 114.7500 47.5000 -64.0 +} -64.0 +{ -64.0 + 87.2500 55.5000 -64.0 + 85.5000 56.2500 -64.0 + 79.5000 62.2500 -64.0 + 77.5000 63.2500 -64.0 + 70.5000 72.2500 -64.0 + 69.2500 83.5000 -64.0 + 70.2500 85.5000 -64.0 + 72.5000 84.7500 -64.0 + 80.7500 76.5000 -64.0 + 81.7500 74.5000 -64.0 + 80.5000 74.2500 -64.0 + 76.5000 78.2500 -64.0 + 72.7500 77.5000 -64.0 + 72.7500 75.5000 -64.0 + 75.7500 69.5000 -64.0 + 87.7500 57.5000 -64.0 + 88.7500 55.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 113.5000 -64.0 + 113.2500 116.5000 -64.0 + 115.2500 117.5000 -64.0 + 114.5000 119.2500 -64.0 + 112.5000 119.2500 -64.0 + 110.5000 125.2500 -64.0 + 111.2500 126.5000 -64.0 + 114.5000 126.7500 -64.0 + 118.5000 123.7500 -64.0 + 120.5000 124.7500 -64.0 + 122.5000 123.7500 -64.0 + 121.7500 122.5000 -64.0 + 121.7500 118.5000 -64.0 + 118.5000 118.2500 -64.0 + 116.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 98.2500 124.5000 -64.0 + 99.2500 127.5000 -64.0 + 100.5000 125.7500 -64.0 + 99.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 126.5000 -64.0 + 124.5000 129.2500 -64.0 + 124.2500 133.5000 -64.0 + 123.2500 136.5000 -64.0 + 120.5000 140.2500 -64.0 + 120.2500 143.5000 -64.0 + 122.5000 143.7500 -64.0 + 128.5000 135.2500 -64.0 + 126.5000 136.2500 -64.0 + 125.7500 134.5000 -64.0 + 126.5000 132.7500 -64.0 + 128.5000 132.7500 -64.0 + 132.5000 134.7500 -64.0 + 134.5000 133.7500 -64.0 + 132.7500 131.5000 -64.0 + 127.5000 131.2500 -64.0 + 126.7500 129.5000 -64.0 + 129.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 127.5000 -64.0 + 100.2500 128.5000 -64.0 + 103.5000 128.7500 -64.0 + 103.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 133.5000 -64.0 + 87.5000 134.2500 -64.0 + 88.2500 135.5000 -64.0 + 88.2500 138.5000 -64.0 + 89.5000 138.7500 -64.0 + 90.5000 136.7500 -64.0 + 92.5000 135.7500 -64.0 + 95.5000 136.7500 -64.0 + 98.2500 140.5000 -64.0 + 97.2500 143.5000 -64.0 + 104.2500 147.5000 -64.0 + 106.5000 147.7500 -64.0 + 108.5000 146.7500 -64.0 + 110.5000 146.7500 -64.0 + 114.5000 148.7500 -64.0 + 114.7500 146.5000 -64.0 + 113.7500 144.5000 -64.0 + 110.5000 144.2500 -64.0 + 106.5000 142.2500 -64.0 + 101.5000 141.2500 -64.0 + 99.5000 139.2500 -64.0 + 97.7500 134.5000 -64.0 + 95.7500 133.5000 -64.0 +} -64.0 +v 148 z -184.000000 -64.0 +{ -64.0 + 108.2500 40.5000 -64.0 + 94.5000 47.2500 -64.0 + 80.5000 61.2500 -64.0 + 78.5000 62.2500 -64.0 + 71.5000 72.2500 -64.0 + 71.2500 80.5000 -64.0 + 72.5000 81.7500 -64.0 + 75.5000 80.7500 -64.0 + 84.7500 71.5000 -64.0 + 85.7500 69.5000 -64.0 + 97.5000 58.7500 -64.0 + 108.5000 51.7500 -64.0 + 112.5000 51.7500 -64.0 + 117.5000 53.7500 -64.0 + 123.5000 57.7500 -64.0 + 131.5000 65.7500 -64.0 + 139.2500 76.5000 -64.0 + 145.2500 81.5000 -64.0 + 147.5000 81.7500 -64.0 + 148.5000 79.7500 -64.0 + 148.7500 76.5000 -64.0 + 147.7500 74.5000 -64.0 + 147.7500 72.5000 -64.0 + 142.7500 63.5000 -64.0 + 132.7500 53.5000 -64.0 + 131.5000 51.2500 -64.0 + 114.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 114.5000 -64.0 + 114.2500 118.5000 -64.0 + 107.5000 124.2500 -64.0 + 103.5000 124.2500 -64.0 + 103.2500 125.5000 -64.0 + 105.2500 127.5000 -64.0 + 100.5000 129.2500 -64.0 + 98.5000 127.2500 -64.0 + 98.2500 130.5000 -64.0 + 99.5000 130.7500 -64.0 + 103.5000 128.7500 -64.0 + 105.5000 128.7500 -64.0 + 107.5000 127.7500 -64.0 + 109.5000 128.7500 -64.0 + 112.7500 127.5000 -64.0 + 107.7500 126.5000 -64.0 + 113.5000 123.7500 -64.0 + 115.5000 123.7500 -64.0 + 116.7500 121.5000 -64.0 + 115.7500 119.5000 -64.0 + 116.5000 117.7500 -64.0 +} -64.0 +{ -64.0 + 120.2500 120.5000 -64.0 + 119.5000 121.2500 -64.0 + 120.2500 122.5000 -64.0 + 116.2500 125.5000 -64.0 + 122.5000 126.7500 -64.0 + 124.2500 129.5000 -64.0 + 124.5000 135.7500 -64.0 + 126.5000 136.7500 -64.0 + 132.5000 133.7500 -64.0 + 132.7500 132.5000 -64.0 + 128.5000 132.2500 -64.0 + 126.7500 130.5000 -64.0 + 125.7500 128.5000 -64.0 + 127.5000 126.7500 -64.0 + 130.5000 126.7500 -64.0 + 134.5000 128.7500 -64.0 + 134.7500 127.5000 -64.0 + 130.7500 125.5000 -64.0 + 127.5000 125.2500 -64.0 + 124.5000 124.2500 -64.0 + 121.7500 120.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 124.5000 -64.0 + 97.2500 125.5000 -64.0 + 97.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 133.5000 -64.0 + 88.5000 135.2500 -64.0 + 88.2500 139.5000 -64.0 + 92.5000 135.7500 -64.0 + 94.5000 135.7500 -64.0 + 96.2500 137.5000 -64.0 + 98.2500 141.5000 -64.0 + 95.5000 143.2500 -64.0 + 98.2500 144.5000 -64.0 + 109.5000 145.7500 -64.0 + 113.2500 148.5000 -64.0 + 115.5000 148.7500 -64.0 + 115.7500 144.5000 -64.0 + 110.5000 145.2500 -64.0 + 104.7500 141.5000 -64.0 + 100.5000 141.2500 -64.0 + 97.7500 138.5000 -64.0 + 98.5000 137.7500 -64.0 + 98.7500 135.5000 -64.0 + 97.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 137.5000 -64.0 + 120.5000 139.2500 -64.0 + 121.5000 139.7500 -64.0 + 123.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 140.5000 -64.0 + 117.5000 141.2500 -64.0 + 118.5000 141.7500 -64.0 + 119.7500 140.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 43.5000 -64.0 + 108.5000 42.7500 -64.0 + 110.5000 42.7500 -64.0 + 112.2500 43.5000 -64.0 + 113.5000 42.7500 -64.0 + 117.5000 44.7500 -64.0 + 119.2500 45.5000 -64.0 + 125.2500 49.5000 -64.0 + 131.2500 54.5000 -64.0 + 133.2500 58.5000 -64.0 + 134.5000 58.7500 -64.0 + 135.2500 60.5000 -64.0 + 139.2500 64.5000 -64.0 + 142.2500 69.5000 -64.0 + 143.2500 71.5000 -64.0 + 142.5000 73.2500 -64.0 + 140.5000 73.2500 -64.0 + 136.7500 69.5000 -64.0 + 135.7500 67.5000 -64.0 + 127.7500 58.5000 -64.0 + 127.7500 56.5000 -64.0 + 125.7500 54.5000 -64.0 + 118.5000 50.2500 -64.0 + 112.5000 47.2500 -64.0 + 110.5000 48.2500 -64.0 + 108.5000 48.2500 -64.0 + 106.5000 49.2500 -64.0 + 103.5000 49.2500 -64.0 + 101.5000 51.2500 -64.0 + 98.5000 51.2500 -64.0 + 98.2500 52.5000 -64.0 + 96.5000 54.2500 -64.0 + 96.2500 56.5000 -64.0 + 92.2500 60.5000 -64.0 + 91.2500 62.5000 -64.0 + 85.2500 67.5000 -64.0 + 84.2500 69.5000 -64.0 + 77.5000 75.2500 -64.0 + 75.7500 74.5000 -64.0 + 75.7500 70.5000 -64.0 + 77.7500 68.5000 -64.0 + 78.7500 66.5000 -64.0 + 89.7500 55.5000 -64.0 + 92.5000 51.7500 -64.0 + 94.5000 50.7500 -64.0 + 98.5000 47.7500 -64.0 + 103.5000 44.7500 -64.0 + 106.7500 45.5000 -64.0 +} -64.0 +v 122 z -186.000000 -64.0 +{ -64.0 + 110.2500 39.5000 -64.0 + 94.5000 47.2500 -64.0 + 78.5000 63.2500 -64.0 + 72.2500 73.5000 -64.0 + 74.2500 77.5000 -64.0 + 76.5000 77.7500 -64.0 + 82.5000 73.7500 -64.0 + 92.5000 62.7500 -64.0 + 99.5000 56.7500 -64.0 + 107.5000 52.7500 -64.0 + 113.5000 52.7500 -64.0 + 119.5000 54.7500 -64.0 + 126.2500 59.5000 -64.0 + 133.2500 68.5000 -64.0 + 142.2500 77.5000 -64.0 + 144.5000 77.7500 -64.0 + 146.5000 76.7500 -64.0 + 146.7500 73.5000 -64.0 + 145.7500 71.5000 -64.0 + 145.7500 69.5000 -64.0 + 139.7500 59.5000 -64.0 + 129.5000 49.2500 -64.0 + 123.5000 46.2500 -64.0 + 120.7500 43.5000 -64.0 + 113.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 114.5000 -64.0 + 112.5000 116.2500 -64.0 + 114.2500 117.5000 -64.0 + 115.5000 116.7500 -64.0 + 115.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 118.5000 -64.0 + 101.2500 119.5000 -64.0 + 102.5000 119.7500 -64.0 + 102.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 121.2500 121.5000 -64.0 + 121.2500 123.5000 -64.0 + 116.5000 125.2500 -64.0 + 117.2500 126.5000 -64.0 + 120.5000 126.7500 -64.0 + 123.2500 129.5000 -64.0 + 123.2500 133.5000 -64.0 + 122.2500 136.5000 -64.0 + 114.5000 143.2500 -64.0 + 110.5000 143.2500 -64.0 + 102.5000 140.2500 -64.0 + 99.7500 137.5000 -64.0 + 99.7500 132.5000 -64.0 + 103.5000 129.7500 -64.0 + 104.5000 128.2500 -64.0 + 102.5000 129.2500 -64.0 + 99.5000 129.2500 -64.0 + 96.2500 131.5000 -64.0 + 91.5000 133.2500 -64.0 + 88.5000 138.2500 -64.0 + 88.2500 141.5000 -64.0 + 89.5000 141.7500 -64.0 + 90.7500 137.5000 -64.0 + 94.5000 134.7500 -64.0 + 96.5000 135.7500 -64.0 + 101.2500 142.5000 -64.0 + 100.5000 143.2500 -64.0 + 104.2500 145.5000 -64.0 + 108.5000 145.7500 -64.0 + 114.5000 149.7500 -64.0 + 114.7500 148.5000 -64.0 + 116.5000 147.7500 -64.0 + 126.5000 135.7500 -64.0 + 131.5000 134.7500 -64.0 + 131.7500 133.5000 -64.0 + 127.5000 133.2500 -64.0 + 125.7500 131.5000 -64.0 + 125.7500 128.5000 -64.0 + 122.7500 125.5000 -64.0 + 123.5000 124.7500 -64.0 + 125.5000 125.7500 -64.0 + 126.7500 124.5000 -64.0 + 122.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 43.5000 -64.0 + 108.5000 42.7500 -64.0 + 110.5000 42.7500 -64.0 + 112.2500 43.5000 -64.0 + 111.5000 44.2500 -64.0 + 111.2500 46.5000 -64.0 + 107.5000 49.2500 -64.0 + 103.5000 49.2500 -64.0 + 103.2500 50.5000 -64.0 + 96.5000 54.2500 -64.0 + 96.2500 56.5000 -64.0 + 94.5000 57.2500 -64.0 + 94.2500 58.5000 -64.0 + 92.5000 60.2500 -64.0 + 90.5000 61.2500 -64.0 + 83.5000 68.2500 -64.0 + 79.5000 71.2500 -64.0 + 78.7500 69.5000 -64.0 + 79.7500 66.5000 -64.0 + 89.5000 55.7500 -64.0 + 99.5000 46.7500 -64.0 + 101.5000 46.7500 -64.0 + 103.5000 44.7500 -64.0 + 105.2500 45.5000 -64.0 +} -64.0 +{ -64.0 + 113.7500 43.5000 -64.0 + 114.5000 42.7500 -64.0 + 115.5000 43.7500 -64.0 + 119.5000 45.7500 -64.0 + 126.2500 50.5000 -64.0 + 126.2500 52.5000 -64.0 + 128.5000 52.7500 -64.0 + 134.2500 58.5000 -64.0 + 137.2500 62.5000 -64.0 + 140.2500 67.5000 -64.0 + 139.5000 69.2500 -64.0 + 137.5000 67.2500 -64.0 + 135.5000 66.2500 -64.0 + 134.7500 64.5000 -64.0 + 130.7500 60.5000 -64.0 + 129.7500 58.5000 -64.0 + 128.5000 58.2500 -64.0 + 127.7500 56.5000 -64.0 + 125.5000 54.2500 -64.0 + 119.5000 51.2500 -64.0 + 113.7500 46.5000 -64.0 +} -64.0 +v 113 z -188.000000 -64.0 +{ -64.0 + 109.2500 39.5000 -64.0 + 93.5000 48.2500 -64.0 + 82.2500 59.5000 -64.0 + 75.5000 69.2500 -64.0 + 75.5000 73.7500 -64.0 + 77.5000 74.7500 -64.0 + 82.5000 72.7500 -64.0 + 89.7500 65.5000 -64.0 + 90.7500 63.5000 -64.0 + 92.5000 62.7500 -64.0 + 97.5000 57.7500 -64.0 + 107.5000 52.7500 -64.0 + 114.5000 52.7500 -64.0 + 124.5000 56.7500 -64.0 + 125.2500 58.5000 -64.0 + 137.5000 71.7500 -64.0 + 141.2500 74.5000 -64.0 + 143.5000 74.7500 -64.0 + 144.7500 70.5000 -64.0 + 142.7500 66.5000 -64.0 + 142.7500 64.5000 -64.0 + 138.7500 58.5000 -64.0 + 128.5000 48.2500 -64.0 + 114.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 114.5000 -64.0 + 108.5000 115.2500 -64.0 + 105.2500 115.5000 -64.0 + 108.5000 115.7500 -64.0 + 110.5000 114.7500 -64.0 + 111.2500 115.5000 -64.0 + 114.5000 115.7500 -64.0 + 114.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 122.5000 -64.0 + 122.5000 123.7500 -64.0 + 126.2500 125.5000 -64.0 + 128.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 124.5000 -64.0 + 119.5000 125.2500 -64.0 + 116.5000 125.2500 -64.0 + 115.2500 126.5000 -64.0 + 119.5000 126.7500 -64.0 + 123.2500 129.5000 -64.0 + 123.2500 135.5000 -64.0 + 120.5000 139.2500 -64.0 + 122.2500 140.5000 -64.0 + 121.5000 141.2500 -64.0 + 118.5000 146.2500 -64.0 + 118.2500 149.5000 -64.0 + 122.7500 140.5000 -64.0 + 127.5000 135.7500 -64.0 + 129.5000 135.7500 -64.0 + 132.7500 134.5000 -64.0 + 129.5000 134.2500 -64.0 + 125.7500 132.5000 -64.0 + 125.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 103.2500 128.5000 -64.0 + 99.2500 130.5000 -64.0 + 97.2500 134.5000 -64.0 + 99.2500 138.5000 -64.0 + 98.5000 139.2500 -64.0 + 98.2500 142.5000 -64.0 + 100.2500 144.5000 -64.0 + 108.5000 146.7500 -64.0 + 112.2500 149.5000 -64.0 + 113.5000 148.7500 -64.0 + 110.7500 145.5000 -64.0 + 111.5000 144.7500 -64.0 + 117.5000 143.7500 -64.0 + 119.7500 140.5000 -64.0 + 118.5000 140.2500 -64.0 + 114.5000 143.2500 -64.0 + 109.5000 143.2500 -64.0 + 101.5000 139.2500 -64.0 + 99.7500 136.5000 -64.0 + 100.5000 132.7500 -64.0 + 105.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 132.5000 -64.0 + 89.5000 133.2500 -64.0 + 90.2500 135.5000 -64.0 + 89.5000 137.2500 -64.0 + 89.2500 142.5000 -64.0 + 90.5000 142.7500 -64.0 + 90.7500 140.5000 -64.0 + 91.7500 138.5000 -64.0 + 90.7500 136.5000 -64.0 + 90.7500 133.5000 -64.0 + 92.7500 132.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 43.5000 -64.0 + 109.5000 42.7500 -64.0 + 110.2500 44.5000 -64.0 + 109.5000 46.2500 -64.0 + 110.2500 47.5000 -64.0 + 102.5000 51.2500 -64.0 + 100.5000 51.2500 -64.0 + 84.5000 65.2500 -64.0 + 83.7500 64.5000 -64.0 + 85.7500 60.5000 -64.0 + 97.5000 48.7500 -64.0 + 103.5000 44.7500 -64.0 + 107.5000 45.7500 -64.0 +} -64.0 +{ -64.0 + 119.5000 46.7500 -64.0 + 121.5000 46.7500 -64.0 + 125.2500 49.5000 -64.0 + 125.2500 51.5000 -64.0 + 123.5000 52.2500 -64.0 + 120.5000 51.2500 -64.0 + 117.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 128.5000 52.7500 -64.0 + 136.2500 61.5000 -64.0 + 135.5000 63.2500 -64.0 + 132.7500 61.5000 -64.0 + 131.7500 59.5000 -64.0 + 126.7500 54.5000 -64.0 +} -64.0 +v 98 z -190.000000 -64.0 +{ -64.0 + 108.2500 39.5000 -64.0 + 100.5000 43.2500 -64.0 + 94.5000 47.2500 -64.0 + 84.5000 57.2500 -64.0 + 79.2500 65.5000 -64.0 + 78.2500 70.5000 -64.0 + 79.5000 71.7500 -64.0 + 81.5000 70.7500 -64.0 + 83.5000 70.7500 -64.0 + 98.5000 56.7500 -64.0 + 103.5000 53.7500 -64.0 + 105.5000 53.7500 -64.0 + 109.5000 51.7500 -64.0 + 111.2500 52.5000 -64.0 + 113.5000 51.7500 -64.0 + 123.5000 55.7500 -64.0 + 134.5000 67.7500 -64.0 + 138.2500 70.5000 -64.0 + 141.5000 70.7500 -64.0 + 141.7500 66.5000 -64.0 + 137.7500 58.5000 -64.0 + 130.7500 49.5000 -64.0 + 129.5000 49.2500 -64.0 + 126.7500 46.5000 -64.0 + 115.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 122.5000 -64.0 + 115.2500 126.5000 -64.0 + 119.5000 126.7500 -64.0 + 122.5000 127.7500 -64.0 + 124.2500 131.5000 -64.0 + 123.2500 136.5000 -64.0 + 119.5000 140.2500 -64.0 + 113.5000 144.2500 -64.0 + 108.5000 143.2500 -64.0 + 102.7500 140.5000 -64.0 + 99.7500 136.5000 -64.0 + 99.7500 133.5000 -64.0 + 104.7500 129.5000 -64.0 + 100.5000 129.2500 -64.0 + 96.5000 133.2500 -64.0 + 92.5000 133.2500 -64.0 + 89.5000 134.2500 -64.0 + 89.2500 142.5000 -64.0 + 91.2500 144.5000 -64.0 + 92.7500 144.5000 -64.0 + 90.7500 140.5000 -64.0 + 90.7500 135.5000 -64.0 + 92.5000 134.7500 -64.0 + 97.5000 136.7500 -64.0 + 98.2500 138.5000 -64.0 + 101.2500 141.5000 -64.0 + 95.2500 144.5000 -64.0 + 103.5000 144.7500 -64.0 + 101.7500 142.5000 -64.0 + 102.5000 141.7500 -64.0 + 108.2500 144.5000 -64.0 + 115.5000 144.7500 -64.0 + 119.5000 141.7500 -64.0 + 121.2500 142.5000 -64.0 + 118.5000 148.2500 -64.0 + 118.5000 149.7500 -64.0 + 121.5000 145.7500 -64.0 + 121.7500 141.5000 -64.0 + 126.5000 136.7500 -64.0 + 132.7500 135.5000 -64.0 + 126.5000 135.2500 -64.0 + 124.5000 137.2500 -64.0 + 123.7500 136.5000 -64.0 + 125.5000 133.7500 -64.0 + 125.7500 130.5000 -64.0 + 129.7500 124.5000 -64.0 + 123.5000 124.2500 -64.0 + 121.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 104.2500 145.5000 -64.0 + 106.2500 146.5000 -64.0 + 106.7500 145.5000 -64.0 +} -64.0 +{ -64.0 + 107.2500 147.5000 -64.0 + 113.7500 151.5000 -64.0 + 112.7500 148.5000 -64.0 + 110.7500 147.5000 -64.0 +} -64.0 +{ -64.0 + 103.7500 45.5000 -64.0 + 105.5000 44.7500 -64.0 + 107.2500 47.5000 -64.0 + 103.5000 50.2500 -64.0 + 97.5000 52.2500 -64.0 + 92.5000 56.2500 -64.0 + 91.7500 55.5000 -64.0 + 93.7500 52.5000 -64.0 + 99.5000 47.7500 -64.0 +} -64.0 +{ -64.0 + 113.7500 46.5000 -64.0 + 114.5000 45.7500 -64.0 + 115.2500 46.5000 -64.0 + 114.5000 47.2500 -64.0 +} -64.0 +{ -64.0 + 119.7500 47.5000 -64.0 + 121.5000 46.7500 -64.0 + 125.2500 49.5000 -64.0 + 124.5000 51.2500 -64.0 + 122.5000 51.2500 -64.0 +} -64.0 +v 100 z -192.000000 -64.0 +{ -64.0 + 107.2500 39.5000 -64.0 + 102.5000 41.2500 -64.0 + 95.5000 46.2500 -64.0 + 88.5000 53.2500 -64.0 + 82.2500 63.5000 -64.0 + 81.5000 66.7500 -64.0 + 83.5000 67.7500 -64.0 + 86.5000 66.7500 -64.0 + 99.5000 55.7500 -64.0 + 109.5000 50.7500 -64.0 + 113.5000 50.7500 -64.0 + 121.5000 53.7500 -64.0 + 136.2500 67.5000 -64.0 + 138.5000 67.7500 -64.0 + 138.7500 62.5000 -64.0 + 134.7500 54.5000 -64.0 + 130.7500 50.5000 -64.0 + 129.5000 48.2500 -64.0 + 121.5000 42.2500 -64.0 + 115.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 119.5000 -64.0 + 117.2500 121.5000 -64.0 + 115.2500 122.5000 -64.0 + 114.2500 124.5000 -64.0 + 116.2500 125.5000 -64.0 + 115.5000 127.2500 -64.0 + 116.5000 127.7500 -64.0 + 122.5000 125.7500 -64.0 + 120.5000 121.2500 -64.0 +} -64.0 +{ -64.0 + 132.2500 121.5000 -64.0 + 131.2500 123.5000 -64.0 + 125.5000 126.2500 -64.0 + 124.2500 134.5000 -64.0 + 120.2500 140.5000 -64.0 + 118.5000 141.2500 -64.0 + 115.5000 144.2500 -64.0 + 109.5000 144.2500 -64.0 + 101.7500 140.5000 -64.0 + 97.7500 134.5000 -64.0 + 93.5000 134.2500 -64.0 + 91.7500 133.5000 -64.0 + 90.7500 131.5000 -64.0 + 89.2500 130.5000 -64.0 + 91.2500 136.5000 -64.0 + 97.5000 137.7500 -64.0 + 100.2500 140.5000 -64.0 + 101.2500 142.5000 -64.0 + 98.5000 144.2500 -64.0 + 92.5000 144.2500 -64.0 + 90.7500 140.5000 -64.0 + 88.5000 138.2500 -64.0 + 88.2500 141.5000 -64.0 + 91.2500 144.5000 -64.0 + 102.5000 144.7500 -64.0 + 104.2500 145.5000 -64.0 + 105.2500 147.5000 -64.0 + 107.2500 148.5000 -64.0 + 112.5000 148.7500 -64.0 + 111.7500 147.5000 -64.0 + 109.5000 147.2500 -64.0 + 102.7500 143.5000 -64.0 + 103.5000 142.7500 -64.0 + 113.2500 146.5000 -64.0 + 117.5000 144.7500 -64.0 + 120.5000 141.7500 -64.0 + 121.2500 142.5000 -64.0 + 119.2500 146.5000 -64.0 + 120.5000 146.7500 -64.0 + 123.5000 141.7500 -64.0 + 123.7500 139.5000 -64.0 + 125.5000 137.7500 -64.0 + 128.5000 137.7500 -64.0 + 129.7500 136.5000 -64.0 + 127.5000 136.2500 -64.0 + 125.5000 137.2500 -64.0 + 124.7500 135.5000 -64.0 + 129.7500 125.5000 -64.0 + 133.5000 123.7500 -64.0 +} -64.0 +{ -64.0 + 100.2500 128.5000 -64.0 + 99.2500 130.5000 -64.0 + 104.5000 130.7500 -64.0 + 104.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 129.5000 -64.0 + 109.2500 130.5000 -64.0 + 111.5000 130.7500 -64.0 + 111.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 112.7500 43.5000 -64.0 + 113.5000 42.7500 -64.0 + 115.2500 44.5000 -64.0 + 114.5000 46.2500 -64.0 + 113.7500 45.5000 -64.0 +} -64.0 +{ -64.0 + 102.7500 45.5000 -64.0 + 104.5000 44.7500 -64.0 + 106.2500 46.5000 -64.0 + 101.5000 49.2500 -64.0 + 99.7500 48.5000 -64.0 +} -64.0 +{ -64.0 + 115.7500 45.5000 -64.0 + 116.5000 44.7500 -64.0 + 118.2500 45.5000 -64.0 + 117.5000 47.2500 -64.0 +} -64.0 +v 87 z -194.000000 -64.0 +{ -64.0 + 105.2500 39.5000 -64.0 + 101.5000 41.2500 -64.0 + 90.5000 52.2500 -64.0 + 86.5000 59.2500 -64.0 + 86.2500 63.5000 -64.0 + 87.5000 63.7500 -64.0 + 99.5000 54.7500 -64.0 + 109.5000 49.7500 -64.0 + 114.5000 49.7500 -64.0 + 121.5000 52.7500 -64.0 + 132.2500 62.5000 -64.0 + 135.5000 62.7500 -64.0 + 135.5000 60.2500 -64.0 + 132.7500 53.5000 -64.0 + 126.7500 45.5000 -64.0 + 122.5000 42.2500 -64.0 + 116.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 118.5000 -64.0 + 117.2500 120.5000 -64.0 + 115.2500 124.5000 -64.0 + 117.5000 123.7500 -64.0 + 119.2500 124.5000 -64.0 + 118.5000 126.2500 -64.0 + 116.5000 127.2500 -64.0 + 116.2500 128.5000 -64.0 + 117.5000 128.7500 -64.0 + 121.5000 124.7500 -64.0 + 120.7500 121.5000 -64.0 + 119.5000 121.2500 -64.0 +} -64.0 +{ -64.0 + 131.2500 124.5000 -64.0 + 130.5000 125.2500 -64.0 + 128.2500 125.5000 -64.0 + 127.2500 127.5000 -64.0 + 129.2500 128.5000 -64.0 + 130.5000 127.7500 -64.0 + 132.5000 126.7500 -64.0 +} -64.0 +{ -64.0 + 125.2500 130.5000 -64.0 + 125.2500 132.5000 -64.0 + 122.2500 139.5000 -64.0 + 115.5000 145.2500 -64.0 + 108.5000 145.2500 -64.0 + 98.5000 139.2500 -64.0 + 101.2500 142.5000 -64.0 + 95.2500 145.5000 -64.0 + 98.5000 145.7500 -64.0 + 100.5000 144.7500 -64.0 + 106.2500 147.5000 -64.0 + 111.5000 147.7500 -64.0 + 114.7500 150.5000 -64.0 + 113.7500 148.5000 -64.0 + 115.5000 146.7500 -64.0 + 117.2500 147.5000 -64.0 + 117.5000 149.7500 -64.0 + 117.7500 147.5000 -64.0 + 123.5000 143.7500 -64.0 + 124.7500 140.5000 -64.0 + 127.5000 137.7500 -64.0 + 132.5000 137.7500 -64.0 + 135.5000 136.7500 -64.0 + 135.5000 135.2500 -64.0 + 131.5000 137.2500 -64.0 + 129.5000 136.2500 -64.0 + 126.5000 137.2500 -64.0 + 124.7500 136.5000 -64.0 + 126.5000 133.7500 -64.0 + 126.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 137.5000 -64.0 + 92.5000 138.2500 -64.0 + 88.5000 138.2500 -64.0 + 88.2500 142.5000 -64.0 + 89.5000 143.7500 -64.0 + 93.5000 145.7500 -64.0 + 89.7500 141.5000 -64.0 + 90.5000 140.7500 -64.0 + 94.5000 137.7500 -64.0 + 96.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 151.5000 -64.0 + 116.5000 154.7500 -64.0 + 116.7500 151.5000 -64.0 +} -64.0 +{ -64.0 + 110.7500 43.5000 -64.0 + 111.5000 42.7500 -64.0 + 113.2500 43.5000 -64.0 + 112.5000 45.2500 -64.0 +} -64.0 +{ -64.0 + 107.7500 44.5000 -64.0 + 108.5000 43.7500 -64.0 + 109.2500 44.5000 -64.0 + 108.5000 45.2500 -64.0 +} -64.0 +v 81 z -196.000000 -64.0 +{ -64.0 + 105.2500 39.5000 -64.0 + 101.2500 41.5000 -64.0 + 93.5000 51.2500 -64.0 + 90.2500 56.5000 -64.0 + 91.2500 58.5000 -64.0 + 93.5000 57.7500 -64.0 + 99.5000 52.7500 -64.0 + 105.5000 49.7500 -64.0 + 107.5000 49.7500 -64.0 + 109.5000 48.7500 -64.0 + 114.5000 48.7500 -64.0 + 122.5000 51.7500 -64.0 + 129.2500 57.5000 -64.0 + 131.5000 57.7500 -64.0 + 131.5000 56.2500 -64.0 + 128.7500 49.5000 -64.0 + 123.5000 43.2500 -64.0 + 119.7500 40.5000 -64.0 + 114.5000 40.2500 -64.0 + 112.7500 39.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 119.5000 -64.0 + 117.2500 120.5000 -64.0 + 116.5000 122.2500 -64.0 + 111.5000 125.2500 -64.0 + 112.2500 126.5000 -64.0 + 115.5000 126.7500 -64.0 + 116.2500 128.5000 -64.0 + 115.5000 130.2500 -64.0 + 114.7500 129.5000 -64.0 + 111.5000 129.2500 -64.0 + 107.5000 131.2500 -64.0 + 102.5000 130.2500 -64.0 + 102.5000 131.7500 -64.0 + 111.5000 132.7500 -64.0 + 113.5000 130.7500 -64.0 + 117.5000 130.7500 -64.0 + 119.5000 128.7500 -64.0 + 121.5000 129.7500 -64.0 + 121.7500 128.5000 -64.0 + 120.7500 126.5000 -64.0 + 121.5000 125.7500 -64.0 + 122.5000 122.2500 -64.0 + 118.7500 119.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 126.5000 -64.0 + 128.2500 128.5000 -64.0 + 125.5000 131.2500 -64.0 + 122.2500 140.5000 -64.0 + 118.5000 144.2500 -64.0 + 114.5000 146.2500 -64.0 + 110.5000 146.2500 -64.0 + 103.5000 143.2500 -64.0 + 96.7500 138.5000 -64.0 + 93.5000 138.2500 -64.0 + 91.5000 137.2500 -64.0 + 88.5000 138.2500 -64.0 + 88.2500 139.5000 -64.0 + 93.2500 140.5000 -64.0 + 92.2500 141.5000 -64.0 + 94.5000 141.7500 -64.0 + 97.5000 140.7500 -64.0 + 100.2500 143.5000 -64.0 + 97.2500 145.5000 -64.0 + 102.5000 145.7500 -64.0 + 106.2500 147.5000 -64.0 + 114.5000 149.7500 -64.0 + 116.2500 153.5000 -64.0 + 117.5000 153.7500 -64.0 + 117.7500 149.5000 -64.0 + 118.5000 147.7500 -64.0 + 125.5000 141.7500 -64.0 + 130.5000 138.7500 -64.0 + 133.5000 138.7500 -64.0 + 133.7500 137.5000 -64.0 + 130.5000 137.2500 -64.0 + 127.5000 138.2500 -64.0 + 125.7500 137.5000 -64.0 + 126.7500 132.5000 -64.0 + 129.5000 129.7500 -64.0 + 131.5000 128.7500 -64.0 + 134.5000 129.7500 -64.0 + 131.7500 126.5000 -64.0 +} -64.0 +v 78 z -198.000000 -64.0 +{ -64.0 + 104.2500 40.5000 -64.0 + 102.2500 41.5000 -64.0 + 98.2500 49.5000 -64.0 + 101.5000 49.7500 -64.0 + 105.5000 47.7500 -64.0 + 114.5000 47.7500 -64.0 + 125.5000 50.7500 -64.0 + 125.7500 49.5000 -64.0 + 123.7500 44.5000 -64.0 + 120.7500 41.5000 -64.0 + 113.5000 41.2500 -64.0 + 111.7500 40.5000 -64.0 +} -64.0 +{ -64.0 + 129.2500 116.5000 -64.0 + 129.2500 117.5000 -64.0 + 130.5000 117.7500 -64.0 + 130.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 118.5000 -64.0 + 116.2500 119.5000 -64.0 + 117.5000 119.7500 -64.0 + 119.2500 122.5000 -64.0 + 119.2500 126.5000 -64.0 + 116.2500 129.5000 -64.0 + 115.2500 131.5000 -64.0 + 117.5000 131.7500 -64.0 + 120.7500 130.5000 -64.0 + 121.7500 128.5000 -64.0 + 120.7500 126.5000 -64.0 + 122.7500 124.5000 -64.0 + 123.7500 122.5000 -64.0 + 118.7500 118.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 120.5000 -64.0 + 111.5000 121.2500 -64.0 + 106.5000 121.2500 -64.0 + 103.5000 124.2500 -64.0 + 101.5000 124.2500 -64.0 + 102.5000 125.7500 -64.0 + 104.5000 126.7500 -64.0 + 104.7500 125.5000 -64.0 + 108.5000 122.7500 -64.0 + 114.5000 122.7500 -64.0 + 115.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 127.5000 -64.0 + 124.5000 134.2500 -64.0 + 124.2500 137.5000 -64.0 + 120.5000 143.2500 -64.0 + 116.5000 146.2500 -64.0 + 113.5000 146.2500 -64.0 + 111.5000 147.2500 -64.0 + 99.7500 142.5000 -64.0 + 97.2500 145.5000 -64.0 + 103.5000 145.7500 -64.0 + 109.5000 148.7500 -64.0 + 114.5000 149.7500 -64.0 + 115.2500 151.5000 -64.0 + 116.7500 152.5000 -64.0 + 117.7500 147.5000 -64.0 + 120.5000 144.7500 -64.0 + 130.7500 138.5000 -64.0 + 126.5000 137.2500 -64.0 + 125.5000 139.2500 -64.0 + 124.7500 137.5000 -64.0 + 126.5000 135.7500 -64.0 + 126.7500 133.5000 -64.0 + 132.5000 128.7500 -64.0 + 133.2500 130.5000 -64.0 + 135.5000 132.7500 -64.0 + 135.7500 130.5000 -64.0 + 132.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 130.5000 -64.0 + 101.2500 132.5000 -64.0 + 104.7500 132.5000 -64.0 + 103.7500 130.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 137.5000 -64.0 + 90.2500 140.5000 -64.0 + 95.5000 140.7500 -64.0 + 98.5000 141.7500 -64.0 + 98.7500 139.5000 -64.0 + 95.7500 137.5000 -64.0 +} -64.0 +v 75 z -200.000000 -64.0 +{ -64.0 + 107.2500 89.5000 -64.0 + 107.2500 91.5000 -64.0 + 109.5000 91.7500 -64.0 +} -64.0 +{ -64.0 + 90.2500 106.5000 -64.0 + 90.2500 108.5000 -64.0 + 91.7500 109.5000 -64.0 + 92.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 116.5000 -64.0 + 114.2500 117.5000 -64.0 + 116.5000 117.7500 -64.0 + 118.2500 120.5000 -64.0 + 118.2500 124.5000 -64.0 + 117.5000 126.2500 -64.0 + 113.5000 129.2500 -64.0 + 111.5000 129.2500 -64.0 + 109.5000 130.2500 -64.0 + 103.5000 130.2500 -64.0 + 101.2500 128.5000 -64.0 + 102.2500 130.5000 -64.0 + 102.2500 132.5000 -64.0 + 100.5000 133.2500 -64.0 + 98.7500 130.5000 -64.0 + 98.7500 128.5000 -64.0 + 97.2500 128.5000 -64.0 + 99.2500 134.5000 -64.0 + 101.5000 134.7500 -64.0 + 110.5000 131.7500 -64.0 + 112.2500 132.5000 -64.0 + 117.5000 132.7500 -64.0 + 121.5000 130.7500 -64.0 + 124.2500 132.5000 -64.0 + 124.2500 136.5000 -64.0 + 119.2500 144.5000 -64.0 + 113.5000 147.2500 -64.0 + 108.5000 146.2500 -64.0 + 107.2500 147.5000 -64.0 + 110.2500 149.5000 -64.0 + 112.5000 149.7500 -64.0 + 115.5000 152.7500 -64.0 + 118.5000 148.7500 -64.0 + 118.7500 146.5000 -64.0 + 123.5000 141.7500 -64.0 + 125.5000 141.7500 -64.0 + 125.7500 139.5000 -64.0 + 127.5000 135.7500 -64.0 + 127.7500 132.5000 -64.0 + 130.5000 129.7500 -64.0 + 132.5000 129.7500 -64.0 + 133.2500 131.5000 -64.0 + 134.5000 135.7500 -64.0 + 136.5000 134.7500 -64.0 + 136.7500 132.5000 -64.0 + 134.7500 128.5000 -64.0 + 131.5000 127.2500 -64.0 + 127.5000 130.2500 -64.0 + 123.5000 130.2500 -64.0 + 121.7500 126.5000 -64.0 + 125.7500 122.5000 -64.0 + 121.5000 122.2500 -64.0 + 119.7500 118.5000 -64.0 + 116.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 137.5000 -64.0 + 94.2500 139.5000 -64.0 + 93.2500 142.5000 -64.0 + 97.5000 142.7500 -64.0 + 100.7500 141.5000 -64.0 + 97.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 138.5000 -64.0 + 87.5000 141.2500 -64.0 + 88.2500 142.5000 -64.0 + 89.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 118.7500 125.5000 -64.0 + 119.5000 124.7500 -64.0 + 120.2500 125.5000 -64.0 + 119.5000 126.2500 -64.0 +} -64.0 +v 109 z -202.000000 -64.0 +{ -64.0 + 105.2500 86.5000 -64.0 + 103.5000 88.2500 -64.0 + 101.2500 88.5000 -64.0 + 104.5000 88.7500 -64.0 + 109.5000 86.7500 -64.0 + 114.5000 87.7500 -64.0 + 111.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 119.2500 90.5000 -64.0 + 119.5000 90.7500 -64.0 + 121.5000 91.7500 -64.0 + 120.7500 90.5000 -64.0 +} -64.0 +{ -64.0 + 98.2500 91.5000 -64.0 + 97.2500 93.5000 -64.0 + 98.5000 93.7500 -64.0 +} -64.0 +{ -64.0 + 100.2500 94.5000 -64.0 + 99.5000 95.2500 -64.0 + 100.5000 95.7500 -64.0 + 101.7500 94.5000 -64.0 +} -64.0 +{ -64.0 + 109.2500 115.5000 -64.0 + 107.5000 117.7500 -64.0 + 109.5000 116.7500 -64.0 + 113.5000 116.7500 -64.0 + 117.2500 120.5000 -64.0 + 114.5000 124.2500 -64.0 + 112.5000 124.2500 -64.0 + 107.5000 128.2500 -64.0 + 104.5000 128.2500 -64.0 + 102.5000 125.2500 -64.0 + 100.5000 124.2500 -64.0 + 100.2500 125.5000 -64.0 + 105.2500 130.5000 -64.0 + 107.5000 129.7500 -64.0 + 109.2500 130.5000 -64.0 + 115.5000 128.7500 -64.0 + 115.7500 126.5000 -64.0 + 119.5000 121.7500 -64.0 + 121.2500 122.5000 -64.0 + 122.2500 124.5000 -64.0 + 120.5000 126.2500 -64.0 + 120.2500 128.5000 -64.0 + 118.5000 130.2500 -64.0 + 115.2500 130.5000 -64.0 + 114.2500 132.5000 -64.0 + 115.5000 131.7500 -64.0 + 116.5000 132.7500 -64.0 + 118.5000 131.7500 -64.0 + 121.5000 131.7500 -64.0 + 124.2500 134.5000 -64.0 + 123.2500 139.5000 -64.0 + 114.5000 147.2500 -64.0 + 110.5000 147.2500 -64.0 + 105.5000 145.2500 -64.0 + 99.7500 139.5000 -64.0 + 99.7500 136.5000 -64.0 + 104.5000 134.7500 -64.0 + 104.7500 133.5000 -64.0 + 100.5000 133.2500 -64.0 + 98.5000 130.2500 -64.0 + 98.2500 132.5000 -64.0 + 95.5000 136.2500 -64.0 + 91.2500 136.5000 -64.0 + 88.5000 140.2500 -64.0 + 88.5000 142.7500 -64.0 + 92.2500 145.5000 -64.0 + 93.5000 144.7500 -64.0 + 100.5000 144.7500 -64.0 + 109.2500 149.5000 -64.0 + 111.5000 149.7500 -64.0 + 115.5000 154.7500 -64.0 + 116.5000 150.7500 -64.0 + 118.5000 149.7500 -64.0 + 122.5000 144.7500 -64.0 + 126.5000 141.7500 -64.0 + 128.5000 141.7500 -64.0 + 130.5000 139.7500 -64.0 + 132.5000 139.7500 -64.0 + 136.5000 136.7500 -64.0 + 136.7500 131.5000 -64.0 + 134.7500 127.5000 -64.0 + 131.5000 127.2500 -64.0 + 129.5000 129.2500 -64.0 + 131.2500 130.5000 -64.0 + 131.2500 132.5000 -64.0 + 133.2500 133.5000 -64.0 + 133.2500 135.5000 -64.0 + 131.5000 137.2500 -64.0 + 128.5000 137.2500 -64.0 + 126.7500 132.5000 -64.0 + 128.7500 130.5000 -64.0 + 124.5000 130.2500 -64.0 + 121.7500 126.5000 -64.0 + 123.5000 124.7500 -64.0 + 127.5000 122.7500 -64.0 + 127.5000 121.2500 -64.0 + 125.5000 122.2500 -64.0 + 122.5000 122.2500 -64.0 + 121.7500 120.5000 -64.0 + 118.5000 117.2500 -64.0 + 114.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 106.2500 133.5000 -64.0 + 111.5000 134.7500 -64.0 + 112.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 90.7500 138.5000 -64.0 + 91.5000 137.7500 -64.0 + 93.5000 137.7500 -64.0 + 95.2500 139.5000 -64.0 + 96.2500 141.5000 -64.0 + 93.5000 144.2500 -64.0 + 90.7500 140.5000 -64.0 +} -64.0 +v 109 z -204.000000 -64.0 +{ -64.0 + 106.2500 85.5000 -64.0 + 105.2500 86.5000 -64.0 + 108.5000 86.7500 -64.0 + 109.7500 85.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 115.5000 -64.0 + 110.2500 116.5000 -64.0 + 114.2500 118.5000 -64.0 + 113.5000 120.2500 -64.0 + 108.5000 120.2500 -64.0 + 106.5000 121.2500 -64.0 + 104.5000 121.2500 -64.0 + 99.2500 124.5000 -64.0 + 102.5000 124.7500 -64.0 + 106.5000 121.7500 -64.0 + 107.5000 123.7500 -64.0 + 109.5000 124.7500 -64.0 + 113.5000 121.7500 -64.0 + 117.5000 121.7500 -64.0 + 121.2500 123.5000 -64.0 + 121.2500 128.5000 -64.0 + 119.5000 130.2500 -64.0 + 117.5000 130.2500 -64.0 + 115.5000 131.2500 -64.0 + 113.5000 131.2500 -64.0 + 112.2500 132.5000 -64.0 + 117.5000 132.7500 -64.0 + 119.5000 131.7500 -64.0 + 121.5000 132.7500 -64.0 + 125.2500 136.5000 -64.0 + 123.2500 140.5000 -64.0 + 120.5000 143.2500 -64.0 + 116.5000 150.2500 -64.0 + 114.5000 151.2500 -64.0 + 112.7500 150.5000 -64.0 + 115.7500 148.5000 -64.0 + 112.5000 148.2500 -64.0 + 109.5000 147.2500 -64.0 + 104.5000 145.2500 -64.0 + 99.7500 140.5000 -64.0 + 99.7500 138.5000 -64.0 + 101.5000 136.7500 -64.0 + 106.7500 133.5000 -64.0 + 102.5000 133.2500 -64.0 + 100.5000 134.2500 -64.0 + 98.7500 133.5000 -64.0 + 98.5000 131.2500 -64.0 + 98.2500 133.5000 -64.0 + 96.2500 135.5000 -64.0 + 97.2500 137.5000 -64.0 + 96.5000 138.2500 -64.0 + 96.2500 140.5000 -64.0 + 97.2500 142.5000 -64.0 + 96.5000 144.2500 -64.0 + 93.5000 144.2500 -64.0 + 91.7500 143.5000 -64.0 + 91.7500 141.5000 -64.0 + 90.7500 139.5000 -64.0 + 90.7500 136.5000 -64.0 + 89.2500 136.5000 -64.0 + 90.2500 138.5000 -64.0 + 89.5000 140.2500 -64.0 + 89.2500 143.5000 -64.0 + 90.5000 144.7500 -64.0 + 94.5000 146.7500 -64.0 + 96.5000 145.7500 -64.0 + 98.5000 145.7500 -64.0 + 101.5000 146.7500 -64.0 + 107.2500 149.5000 -64.0 + 109.5000 149.7500 -64.0 + 113.2500 152.5000 -64.0 + 113.2500 154.5000 -64.0 + 115.5000 157.7500 -64.0 + 117.5000 156.7500 -64.0 + 116.7500 154.5000 -64.0 + 117.7500 151.5000 -64.0 + 123.5000 144.7500 -64.0 + 129.5000 141.7500 -64.0 + 131.5000 141.7500 -64.0 + 133.5000 140.7500 -64.0 + 135.5000 140.7500 -64.0 + 137.5000 138.7500 -64.0 + 137.7500 134.5000 -64.0 + 139.7500 129.5000 -64.0 + 136.7500 125.5000 -64.0 + 134.5000 125.2500 -64.0 + 132.5000 126.2500 -64.0 + 130.5000 126.2500 -64.0 + 130.2500 128.5000 -64.0 + 128.5000 130.2500 -64.0 + 124.5000 130.2500 -64.0 + 122.7500 128.5000 -64.0 + 121.7500 126.5000 -64.0 + 125.5000 123.7500 -64.0 + 129.5000 123.7500 -64.0 + 128.7500 122.5000 -64.0 + 124.5000 122.2500 -64.0 + 122.5000 121.2500 -64.0 + 114.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 132.7500 128.5000 -64.0 + 134.5000 127.7500 -64.0 + 136.2500 128.5000 -64.0 + 133.5000 130.2500 -64.0 +} -64.0 +{ -64.0 + 130.7500 133.5000 -64.0 + 131.5000 132.7500 -64.0 + 133.2500 133.5000 -64.0 + 134.2500 135.5000 -64.0 + 132.5000 137.2500 -64.0 + 127.5000 140.2500 -64.0 + 125.7500 139.5000 -64.0 +} -64.0 +v 97 z -206.000000 -64.0 +{ -64.0 + 107.2500 86.5000 -64.0 + 105.2500 87.5000 -64.0 + 114.5000 87.7500 -64.0 + 116.5000 88.7500 -64.0 + 117.5000 88.2500 -64.0 + 113.7500 86.5000 -64.0 +} -64.0 +{ -64.0 + 110.2500 116.5000 -64.0 + 108.5000 118.2500 -64.0 + 102.5000 121.2500 -64.0 + 101.2500 124.5000 -64.0 + 107.5000 119.7500 -64.0 + 110.5000 119.7500 -64.0 + 116.5000 121.7500 -64.0 + 120.2500 125.5000 -64.0 + 119.5000 129.2500 -64.0 + 114.5000 132.2500 -64.0 + 123.5000 132.7500 -64.0 + 125.2500 134.5000 -64.0 + 125.2500 138.5000 -64.0 + 119.5000 146.2500 -64.0 + 113.5000 149.2500 -64.0 + 104.5000 146.2500 -64.0 + 99.7500 141.5000 -64.0 + 100.5000 137.7500 -64.0 + 106.5000 134.7500 -64.0 + 103.7500 133.5000 -64.0 + 100.5000 134.2500 -64.0 + 98.5000 131.2500 -64.0 + 98.2500 133.5000 -64.0 + 95.5000 137.2500 -64.0 + 90.5000 137.2500 -64.0 + 89.2500 142.5000 -64.0 + 90.2500 145.5000 -64.0 + 93.2500 147.5000 -64.0 + 95.5000 147.7500 -64.0 + 97.5000 146.7500 -64.0 + 102.5000 147.7500 -64.0 + 111.5000 151.7500 -64.0 + 110.7500 150.5000 -64.0 + 111.5000 149.7500 -64.0 + 114.5000 149.7500 -64.0 + 116.5000 148.7500 -64.0 + 118.2500 149.5000 -64.0 + 117.5000 151.2500 -64.0 + 117.2500 155.5000 -64.0 + 118.2500 157.5000 -64.0 + 117.5000 158.2500 -64.0 + 114.7500 156.5000 -64.0 + 114.7500 154.5000 -64.0 + 113.5000 153.2500 -64.0 + 113.2500 158.5000 -64.0 + 114.5000 159.7500 -64.0 + 116.5000 158.7500 -64.0 + 119.5000 158.7500 -64.0 + 117.7500 154.5000 -64.0 + 119.7500 149.5000 -64.0 + 125.5000 143.7500 -64.0 + 127.5000 143.7500 -64.0 + 131.5000 141.7500 -64.0 + 137.5000 140.7500 -64.0 + 141.5000 137.7500 -64.0 + 141.7500 132.5000 -64.0 + 140.5000 131.2500 -64.0 + 138.5000 134.2500 -64.0 + 136.7500 132.5000 -64.0 + 133.5000 134.2500 -64.0 + 131.7500 131.5000 -64.0 + 125.5000 131.2500 -64.0 + 121.7500 127.5000 -64.0 + 124.7500 123.5000 -64.0 + 117.5000 119.2500 -64.0 + 115.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 128.2500 122.5000 -64.0 + 128.2500 123.5000 -64.0 + 130.2500 124.5000 -64.0 + 131.2500 126.5000 -64.0 + 132.5000 126.7500 -64.0 + 135.7500 124.5000 -64.0 + 132.5000 124.2500 -64.0 + 131.7500 122.5000 -64.0 + 130.5000 123.2500 -64.0 +} -64.0 +{ -64.0 + 132.5000 135.7500 -64.0 + 134.2500 136.5000 -64.0 + 134.2500 138.5000 -64.0 + 132.5000 139.2500 -64.0 + 130.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 90.7500 141.5000 -64.0 + 91.5000 140.7500 -64.0 + 93.5000 140.7500 -64.0 + 98.5000 142.7500 -64.0 + 101.2500 145.5000 -64.0 + 100.5000 146.2500 -64.0 + 98.5000 145.2500 -64.0 + 96.5000 146.2500 -64.0 + 94.7500 145.5000 -64.0 + 93.5000 146.2500 -64.0 + 90.7500 143.5000 -64.0 +} -64.0 +v 120 z -208.000000 -64.0 +{ -64.0 + 101.2500 87.5000 -64.0 + 100.2500 88.5000 -64.0 + 102.5000 88.7500 -64.0 + 102.7500 87.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 116.5000 -64.0 + 111.5000 118.2500 -64.0 + 106.5000 119.2500 -64.0 + 105.5000 120.7500 -64.0 + 107.5000 119.7500 -64.0 + 111.5000 119.7500 -64.0 + 114.5000 120.7500 -64.0 + 116.2500 123.5000 -64.0 + 116.2500 126.5000 -64.0 + 115.5000 128.2500 -64.0 + 113.5000 128.2500 -64.0 + 114.5000 128.7500 -64.0 + 115.2500 130.5000 -64.0 + 112.2500 134.5000 -64.0 + 123.5000 131.7500 -64.0 + 125.5000 128.7500 -64.0 + 124.7500 127.5000 -64.0 + 124.7500 123.5000 -64.0 + 122.5000 125.2500 -64.0 + 121.7500 124.5000 -64.0 + 122.7500 121.5000 -64.0 + 121.7500 119.5000 -64.0 + 121.7500 116.5000 -64.0 + 120.5000 116.2500 -64.0 + 118.5000 117.2500 -64.0 +} -64.0 +{ -64.0 + 103.2500 121.5000 -64.0 + 102.2500 123.5000 -64.0 + 103.7500 123.5000 -64.0 + 104.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 122.5000 -64.0 + 131.2500 123.5000 -64.0 + 132.2500 125.5000 -64.0 + 134.7500 125.5000 -64.0 + 135.7500 123.5000 -64.0 + 133.7500 122.5000 -64.0 +} -64.0 +{ -64.0 + 135.2500 127.5000 -64.0 + 135.2500 128.5000 -64.0 + 136.5000 129.7500 -64.0 + 136.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 99.2500 129.5000 -64.0 + 98.5000 130.2500 -64.0 + 98.2500 134.5000 -64.0 + 94.5000 138.2500 -64.0 + 91.5000 138.2500 -64.0 + 91.2500 139.5000 -64.0 + 88.5000 143.2500 -64.0 + 90.2500 145.5000 -64.0 + 90.2500 147.5000 -64.0 + 92.2500 148.5000 -64.0 + 94.5000 148.7500 -64.0 + 96.5000 147.7500 -64.0 + 101.5000 147.7500 -64.0 + 108.5000 150.7500 -64.0 + 113.2500 155.5000 -64.0 + 113.2500 157.5000 -64.0 + 112.5000 159.2500 -64.0 + 114.2500 161.5000 -64.0 + 115.5000 160.7500 -64.0 + 113.7500 159.5000 -64.0 + 114.5000 157.7500 -64.0 + 114.7500 155.5000 -64.0 + 110.7500 151.5000 -64.0 + 111.5000 150.7500 -64.0 + 113.2500 151.5000 -64.0 + 115.5000 151.7500 -64.0 + 117.5000 149.7500 -64.0 + 118.2500 150.5000 -64.0 + 117.5000 152.2500 -64.0 + 117.2500 155.5000 -64.0 + 118.5000 156.7500 -64.0 + 118.7500 153.5000 -64.0 + 120.7500 149.5000 -64.0 + 125.5000 144.7500 -64.0 + 129.5000 144.7500 -64.0 + 135.5000 142.7500 -64.0 + 139.5000 139.7500 -64.0 + 141.7500 138.5000 -64.0 + 142.7500 136.5000 -64.0 + 141.7500 134.5000 -64.0 + 141.2500 135.5000 -64.0 + 140.5000 137.2500 -64.0 + 138.5000 137.2500 -64.0 + 137.5000 135.2500 -64.0 + 135.5000 136.2500 -64.0 + 133.5000 136.2500 -64.0 + 130.5000 135.2500 -64.0 + 128.5000 137.2500 -64.0 + 126.5000 137.2500 -64.0 + 119.5000 147.2500 -64.0 + 114.5000 150.2500 -64.0 + 111.5000 150.2500 -64.0 + 101.5000 145.2500 -64.0 + 97.7500 140.5000 -64.0 + 97.7500 138.5000 -64.0 + 100.5000 136.7500 -64.0 + 104.5000 136.7500 -64.0 + 106.5000 135.7500 -64.0 + 108.5000 135.7500 -64.0 + 108.7500 134.5000 -64.0 + 106.5000 134.2500 -64.0 + 102.5000 130.2500 -64.0 + 100.5000 131.2500 -64.0 +} -64.0 +{ -64.0 + 87.2500 130.5000 -64.0 + 87.2500 132.5000 -64.0 + 87.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 89.2500 135.5000 -64.0 + 90.2500 137.5000 -64.0 + 90.7500 136.5000 -64.0 +} -64.0 +{ -64.0 + 90.7500 143.5000 -64.0 + 91.5000 142.7500 -64.0 + 97.5000 142.7500 -64.0 + 100.2500 145.5000 -64.0 + 99.5000 146.2500 -64.0 + 96.5000 146.2500 -64.0 + 93.5000 147.2500 -64.0 + 91.7500 145.5000 -64.0 +} -64.0 +v 97 z -210.000000 -64.0 +{ -64.0 + 118.2500 115.5000 -64.0 + 117.5000 116.2500 -64.0 + 114.5000 116.2500 -64.0 + 108.5000 119.2500 -64.0 + 106.5000 119.2500 -64.0 + 103.2500 122.5000 -64.0 + 102.2500 124.5000 -64.0 + 104.5000 122.7500 -64.0 + 106.5000 121.7500 -64.0 + 112.5000 119.7500 -64.0 + 114.2500 121.5000 -64.0 + 115.2500 123.5000 -64.0 + 112.5000 126.2500 -64.0 + 112.2500 129.5000 -64.0 + 113.2500 131.5000 -64.0 + 111.5000 134.2500 -64.0 + 107.5000 134.2500 -64.0 + 104.7500 130.5000 -64.0 + 102.5000 130.2500 -64.0 + 100.7500 129.5000 -64.0 + 100.7500 127.5000 -64.0 + 98.5000 131.2500 -64.0 + 98.2500 134.5000 -64.0 + 99.2500 136.5000 -64.0 + 105.5000 137.7500 -64.0 + 111.5000 134.7500 -64.0 + 116.5000 134.7500 -64.0 + 119.5000 133.7500 -64.0 + 121.2500 134.5000 -64.0 + 123.5000 132.7500 -64.0 + 123.7500 129.5000 -64.0 + 121.5000 129.2500 -64.0 + 119.7500 128.5000 -64.0 + 119.7500 126.5000 -64.0 + 117.7500 122.5000 -64.0 + 118.5000 121.7500 -64.0 + 120.5000 120.7500 -64.0 + 121.7500 118.5000 -64.0 + 120.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 128.5000 -64.0 + 127.5000 132.2500 -64.0 + 127.2500 134.5000 -64.0 + 129.5000 132.7500 -64.0 + 131.2500 133.5000 -64.0 + 138.5000 133.7500 -64.0 + 138.7500 132.5000 -64.0 + 136.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 86.2500 131.5000 -64.0 + 86.2500 132.5000 -64.0 + 87.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 140.2500 137.5000 -64.0 + 139.5000 138.2500 -64.0 + 133.5000 138.2500 -64.0 + 129.5000 140.2500 -64.0 + 125.5000 140.2500 -64.0 + 123.2500 142.5000 -64.0 + 121.2500 146.5000 -64.0 + 116.5000 151.2500 -64.0 + 113.5000 151.2500 -64.0 + 113.2500 152.5000 -64.0 + 116.5000 155.7500 -64.0 + 118.5000 156.7500 -64.0 + 117.7500 155.5000 -64.0 + 118.7500 152.5000 -64.0 + 124.5000 146.7500 -64.0 + 128.5000 144.7500 -64.0 + 130.5000 145.7500 -64.0 + 132.5000 144.7500 -64.0 + 134.5000 144.7500 -64.0 + 137.7500 142.5000 -64.0 + 138.7500 140.5000 -64.0 + 140.5000 139.7500 -64.0 + 140.7500 138.5000 -64.0 +} -64.0 +{ -64.0 + 93.2500 141.5000 -64.0 + 92.5000 142.2500 -64.0 + 89.2500 142.5000 -64.0 + 88.2500 144.5000 -64.0 + 89.5000 147.7500 -64.0 + 93.5000 149.7500 -64.0 + 99.5000 147.7500 -64.0 + 102.5000 148.7500 -64.0 + 107.5000 150.7500 -64.0 + 113.2500 156.5000 -64.0 + 113.2500 158.5000 -64.0 + 114.5000 156.7500 -64.0 + 110.7500 152.5000 -64.0 + 110.7500 150.5000 -64.0 + 106.5000 148.2500 -64.0 + 100.5000 145.2500 -64.0 + 96.7500 141.5000 -64.0 +} -64.0 +{ -64.0 + 96.5000 143.7500 -64.0 + 98.2500 145.5000 -64.0 + 97.5000 147.2500 -64.0 + 93.5000 147.2500 -64.0 + 91.7500 146.5000 -64.0 + 92.5000 145.7500 -64.0 + 94.5000 145.7500 -64.0 +} -64.0 +v 108 z -212.000000 -64.0 +{ -64.0 + 118.2500 113.5000 -64.0 + 117.5000 115.2500 -64.0 + 114.5000 115.2500 -64.0 + 106.5000 120.2500 -64.0 + 104.5000 120.2500 -64.0 + 101.5000 123.2500 -64.0 + 101.2500 125.5000 -64.0 + 105.5000 121.7500 -64.0 + 109.5000 119.7500 -64.0 + 113.2500 120.5000 -64.0 + 114.2500 122.5000 -64.0 + 109.5000 130.2500 -64.0 + 105.5000 130.2500 -64.0 + 105.2500 131.5000 -64.0 + 103.5000 132.2500 -64.0 + 102.7500 130.5000 -64.0 + 104.7500 129.5000 -64.0 + 100.7500 128.5000 -64.0 + 100.7500 126.5000 -64.0 + 99.5000 127.2500 -64.0 + 98.5000 137.7500 -64.0 + 100.5000 138.7500 -64.0 + 100.7500 137.5000 -64.0 + 102.5000 136.7500 -64.0 + 106.5000 138.7500 -64.0 + 110.5000 136.7500 -64.0 + 120.5000 136.7500 -64.0 + 120.7500 134.5000 -64.0 + 117.7500 132.5000 -64.0 + 117.7500 124.5000 -64.0 + 116.7500 122.5000 -64.0 + 116.7500 120.5000 -64.0 + 118.5000 119.7500 -64.0 + 119.5000 117.7500 -64.0 + 119.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 122.2500 117.5000 -64.0 + 120.2500 123.5000 -64.0 + 123.2500 129.5000 -64.0 + 123.2500 132.5000 -64.0 + 124.5000 131.7500 -64.0 + 124.7500 126.5000 -64.0 + 125.5000 124.7500 -64.0 + 124.7500 123.5000 -64.0 + 125.7500 121.5000 -64.0 + 123.7500 117.5000 -64.0 +} -64.0 +{ -64.0 + 133.2500 128.5000 -64.0 + 131.5000 129.2500 -64.0 + 124.5000 137.2500 -64.0 + 124.2500 140.5000 -64.0 + 129.5000 137.7500 -64.0 + 129.7500 135.5000 -64.0 + 131.5000 134.7500 -64.0 + 133.5000 137.7500 -64.0 + 137.5000 135.7500 -64.0 + 139.5000 137.7500 -64.0 + 141.5000 136.7500 -64.0 + 140.5000 133.2500 -64.0 + 136.5000 131.2500 -64.0 + 135.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 139.5000 -64.0 + 88.2500 141.5000 -64.0 + 93.5000 141.7500 -64.0 + 95.2500 142.5000 -64.0 + 95.7500 141.5000 -64.0 + 92.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 134.2500 140.5000 -64.0 + 133.5000 141.2500 -64.0 + 131.5000 141.2500 -64.0 + 129.5000 142.2500 -64.0 + 125.2500 142.5000 -64.0 + 123.2500 146.5000 -64.0 + 124.5000 146.7500 -64.0 + 126.5000 145.7500 -64.0 + 128.5000 145.7500 -64.0 + 131.5000 146.7500 -64.0 + 135.5000 143.7500 -64.0 + 137.7500 142.5000 -64.0 + 138.7500 140.5000 -64.0 + 137.5000 141.2500 -64.0 + 135.7500 140.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 143.5000 -64.0 + 94.5000 145.2500 -64.0 + 92.5000 145.2500 -64.0 + 90.5000 146.2500 -64.0 + 88.7500 145.5000 -64.0 + 87.2500 146.5000 -64.0 + 90.5000 146.7500 -64.0 + 92.5000 147.7500 -64.0 + 96.5000 145.7500 -64.0 + 98.2500 147.5000 -64.0 + 95.5000 149.2500 -64.0 + 92.2500 149.5000 -64.0 + 95.5000 149.7500 -64.0 + 97.5000 148.7500 -64.0 + 106.7500 149.5000 -64.0 + 102.7500 146.5000 -64.0 + 100.5000 146.2500 -64.0 + 97.7500 143.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 154.5000 -64.0 + 114.2500 157.5000 -64.0 + 116.5000 159.7500 -64.0 + 116.7500 154.5000 -64.0 + 115.5000 155.2500 -64.0 + 114.7500 154.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 162.5000 -64.0 + 111.5000 163.7500 -64.0 + 113.5000 164.7500 -64.0 + 113.7500 163.5000 -64.0 +} -64.0 +v 99 z -214.000000 -64.0 +{ -64.0 + 117.2500 114.5000 -64.0 + 116.5000 115.2500 -64.0 + 111.5000 115.2500 -64.0 + 110.2500 116.5000 -64.0 + 109.2500 118.5000 -64.0 + 107.5000 119.2500 -64.0 + 105.5000 120.2500 -64.0 + 103.5000 120.2500 -64.0 + 102.2500 121.5000 -64.0 + 101.2500 123.5000 -64.0 + 99.5000 124.2500 -64.0 + 99.2500 126.5000 -64.0 + 101.2500 130.5000 -64.0 + 102.5000 129.7500 -64.0 + 104.2500 130.5000 -64.0 + 106.2500 134.5000 -64.0 + 105.5000 136.2500 -64.0 + 103.5000 137.2500 -64.0 + 100.5000 136.2500 -64.0 + 97.7500 130.5000 -64.0 + 96.2500 131.5000 -64.0 + 97.2500 133.5000 -64.0 + 97.2500 135.5000 -64.0 + 99.2500 139.5000 -64.0 + 102.5000 139.7500 -64.0 + 104.5000 138.7500 -64.0 + 107.5000 138.7500 -64.0 + 111.5000 135.7500 -64.0 + 113.5000 135.7500 -64.0 + 113.7500 134.5000 -64.0 + 112.7500 132.5000 -64.0 + 115.5000 130.7500 -64.0 + 114.7500 129.5000 -64.0 + 114.7500 127.5000 -64.0 + 115.5000 125.7500 -64.0 + 115.7500 120.5000 -64.0 + 117.5000 118.7500 -64.0 + 117.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 116.5000 -64.0 + 120.2500 119.5000 -64.0 + 118.5000 128.2500 -64.0 + 120.2500 130.5000 -64.0 + 119.2500 131.5000 -64.0 + 121.2500 135.5000 -64.0 + 122.7500 135.5000 -64.0 + 124.5000 131.7500 -64.0 + 124.7500 121.5000 -64.0 + 123.7500 119.5000 -64.0 + 123.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 131.5000 -64.0 + 129.5000 133.2500 -64.0 + 125.2500 135.5000 -64.0 + 122.2500 142.5000 -64.0 + 116.5000 149.2500 -64.0 + 112.2500 152.5000 -64.0 + 115.7500 152.5000 -64.0 + 124.5000 146.7500 -64.0 + 124.7500 142.5000 -64.0 + 126.5000 141.7500 -64.0 + 128.2500 142.5000 -64.0 + 127.2500 145.5000 -64.0 + 129.2500 146.5000 -64.0 + 132.5000 146.7500 -64.0 + 134.5000 145.7500 -64.0 + 134.7500 143.5000 -64.0 + 132.5000 143.2500 -64.0 + 131.7500 141.5000 -64.0 + 133.5000 139.7500 -64.0 + 137.5000 139.7500 -64.0 + 139.5000 140.7500 -64.0 + 141.5000 139.7500 -64.0 + 141.7500 136.5000 -64.0 + 139.7500 134.5000 -64.0 + 137.5000 134.2500 -64.0 + 134.7500 131.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 139.5000 -64.0 + 91.2500 141.5000 -64.0 + 90.5000 143.2500 -64.0 + 91.2500 144.5000 -64.0 + 93.5000 144.7500 -64.0 + 97.2500 147.5000 -64.0 + 98.7500 147.5000 -64.0 + 97.7500 145.5000 -64.0 + 97.7500 143.5000 -64.0 + 92.7500 139.5000 -64.0 +} -64.0 +{ -64.0 + 107.7500 120.5000 -64.0 + 108.5000 119.7500 -64.0 + 110.5000 119.7500 -64.0 + 112.2500 120.5000 -64.0 + 113.2500 122.5000 -64.0 + 107.5000 127.2500 -64.0 + 103.5000 127.2500 -64.0 + 101.7500 126.5000 -64.0 + 101.7500 123.5000 -64.0 + 105.5000 120.7500 -64.0 +} -64.0 +{ -64.0 + 106.7500 132.5000 -64.0 + 108.5000 131.7500 -64.0 + 109.2500 133.5000 -64.0 + 107.5000 134.2500 -64.0 +} -64.0 +v 105 z -216.000000 -64.0 +{ -64.0 + 113.2500 114.5000 -64.0 + 112.5000 115.2500 -64.0 + 110.5000 116.2500 -64.0 + 108.2500 118.5000 -64.0 + 103.2500 120.5000 -64.0 + 106.5000 120.7500 -64.0 + 108.2500 121.5000 -64.0 + 107.5000 123.2500 -64.0 + 105.5000 123.2500 -64.0 + 98.5000 122.2500 -64.0 + 98.5000 123.7500 -64.0 + 100.5000 124.7500 -64.0 + 101.2500 126.5000 -64.0 + 104.5000 127.7500 -64.0 + 106.5000 126.7500 -64.0 + 111.5000 126.7500 -64.0 + 111.7500 124.5000 -64.0 + 114.5000 122.7500 -64.0 + 114.7500 120.5000 -64.0 + 116.5000 118.7500 -64.0 + 116.7500 116.5000 -64.0 + 115.7500 114.5000 -64.0 +} -64.0 +{ -64.0 + 120.2500 116.5000 -64.0 + 119.5000 117.2500 -64.0 + 119.2500 120.5000 -64.0 + 115.2500 128.5000 -64.0 + 116.2500 130.5000 -64.0 + 115.5000 132.2500 -64.0 + 114.7500 131.5000 -64.0 + 107.5000 135.2500 -64.0 + 104.5000 135.2500 -64.0 + 102.7500 134.5000 -64.0 + 98.5000 129.2500 -64.0 + 96.5000 128.2500 -64.0 + 96.2500 131.5000 -64.0 + 97.2500 133.5000 -64.0 + 97.2500 137.5000 -64.0 + 98.2500 139.5000 -64.0 + 102.5000 139.7500 -64.0 + 106.5000 137.7500 -64.0 + 108.5000 137.7500 -64.0 + 112.5000 135.7500 -64.0 + 113.2500 136.5000 -64.0 + 117.5000 137.7500 -64.0 + 119.5000 136.7500 -64.0 + 121.5000 136.7500 -64.0 + 123.2500 137.5000 -64.0 + 124.2500 139.5000 -64.0 + 122.2500 144.5000 -64.0 + 117.5000 149.2500 -64.0 + 112.5000 152.2500 -64.0 + 107.5000 150.2500 -64.0 + 97.7500 142.5000 -64.0 + 89.5000 139.2500 -64.0 + 89.2500 140.5000 -64.0 + 90.5000 140.7500 -64.0 + 93.2500 144.5000 -64.0 + 92.2500 146.5000 -64.0 + 97.5000 146.7500 -64.0 + 110.5000 152.7500 -64.0 + 112.2500 153.5000 -64.0 + 112.2500 155.5000 -64.0 + 113.5000 156.7500 -64.0 + 115.5000 157.7500 -64.0 + 115.7500 155.5000 -64.0 + 119.5000 151.7500 -64.0 + 126.5000 145.7500 -64.0 + 127.2500 146.5000 -64.0 + 128.5000 145.7500 -64.0 + 135.5000 146.7500 -64.0 + 136.7500 145.5000 -64.0 + 137.7500 143.5000 -64.0 + 138.5000 141.7500 -64.0 + 138.7500 138.5000 -64.0 + 137.7500 135.5000 -64.0 + 135.5000 135.2500 -64.0 + 133.7500 134.5000 -64.0 + 135.5000 133.7500 -64.0 + 135.7500 132.5000 -64.0 + 134.7500 130.5000 -64.0 + 127.5000 134.2500 -64.0 + 124.7500 132.5000 -64.0 + 124.7500 129.5000 -64.0 + 126.7500 125.5000 -64.0 + 125.7500 123.5000 -64.0 + 121.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 108.7500 120.5000 -64.0 + 109.5000 119.7500 -64.0 + 110.2500 120.5000 -64.0 + 109.5000 121.2500 -64.0 +} -64.0 +{ -64.0 + 97.7500 133.5000 -64.0 + 98.5000 132.7500 -64.0 + 100.2500 134.5000 -64.0 + 101.2500 136.5000 -64.0 + 99.5000 137.2500 -64.0 +} -64.0 +{ -64.0 + 133.7500 142.5000 -64.0 + 134.5000 141.7500 -64.0 + 135.2500 142.5000 -64.0 + 136.2500 144.5000 -64.0 + 134.5000 146.2500 -64.0 + 132.7500 144.5000 -64.0 +} -64.0 +{ -64.0 + 114.5000 151.7500 -64.0 + 116.2500 152.5000 -64.0 + 114.5000 154.2500 -64.0 + 112.7500 153.5000 -64.0 +} -64.0 +v 104 z -218.000000 -64.0 +{ -64.0 + 113.2500 113.5000 -64.0 + 111.5000 114.2500 -64.0 + 112.2500 115.5000 -64.0 + 111.5000 117.2500 -64.0 + 108.5000 117.2500 -64.0 + 103.5000 121.2500 -64.0 + 101.5000 121.2500 -64.0 + 99.5000 122.2500 -64.0 + 100.5000 122.7500 -64.0 + 105.5000 123.7500 -64.0 + 113.5000 119.7500 -64.0 + 115.5000 116.7500 -64.0 + 115.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 118.2500 116.5000 -64.0 + 118.2500 117.5000 -64.0 + 117.2500 122.5000 -64.0 + 115.5000 124.2500 -64.0 + 113.2500 125.5000 -64.0 + 112.2500 127.5000 -64.0 + 108.5000 131.2500 -64.0 + 106.7500 130.5000 -64.0 + 101.5000 130.2500 -64.0 + 98.5000 127.2500 -64.0 + 96.5000 126.2500 -64.0 + 96.2500 128.5000 -64.0 + 97.5000 127.7500 -64.0 + 98.2500 128.5000 -64.0 + 99.2500 130.5000 -64.0 + 105.2500 136.5000 -64.0 + 104.5000 138.2500 -64.0 + 102.5000 138.2500 -64.0 + 98.7500 136.5000 -64.0 + 97.7500 134.5000 -64.0 + 96.5000 136.2500 -64.0 + 96.2500 139.5000 -64.0 + 94.5000 141.2500 -64.0 + 91.2500 141.5000 -64.0 + 92.2500 143.5000 -64.0 + 94.5000 143.7500 -64.0 + 95.2500 145.5000 -64.0 + 93.5000 146.2500 -64.0 + 89.5000 144.2500 -64.0 + 89.2500 147.5000 -64.0 + 91.2500 148.5000 -64.0 + 98.5000 148.7500 -64.0 + 101.5000 149.7500 -64.0 + 107.2500 152.5000 -64.0 + 115.5000 153.7500 -64.0 + 117.2500 154.5000 -64.0 + 117.2500 156.5000 -64.0 + 118.7500 153.5000 -64.0 + 122.5000 149.7500 -64.0 + 126.5000 146.7500 -64.0 + 128.5000 146.7500 -64.0 + 130.5000 145.7500 -64.0 + 133.5000 146.7500 -64.0 + 136.5000 145.7500 -64.0 + 139.5000 140.7500 -64.0 + 139.7500 137.5000 -64.0 + 138.7500 135.5000 -64.0 + 134.5000 135.2500 -64.0 + 132.7500 133.5000 -64.0 + 133.5000 132.7500 -64.0 + 135.5000 131.7500 -64.0 + 135.5000 129.2500 -64.0 + 129.5000 133.2500 -64.0 + 126.5000 133.2500 -64.0 + 123.7500 130.5000 -64.0 + 124.7500 127.5000 -64.0 + 126.7500 126.5000 -64.0 + 127.7500 124.5000 -64.0 + 123.7500 122.5000 -64.0 + 123.7500 120.5000 -64.0 + 119.7500 116.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 157.5000 -64.0 + 113.2500 159.5000 -64.0 + 114.2500 161.5000 -64.0 + 114.2500 163.5000 -64.0 + 115.5000 162.7500 -64.0 + 116.7500 157.5000 -64.0 + 115.5000 158.2500 -64.0 +} -64.0 +{ -64.0 + 117.7500 125.5000 -64.0 + 119.5000 124.7500 -64.0 + 123.2500 127.5000 -64.0 + 123.2500 129.5000 -64.0 + 119.5000 132.2500 -64.0 + 116.7500 127.5000 -64.0 +} -64.0 +{ -64.0 + 116.7500 137.5000 -64.0 + 117.5000 136.7500 -64.0 + 120.5000 136.7500 -64.0 + 123.5000 137.7500 -64.0 + 125.2500 140.5000 -64.0 + 124.5000 141.2500 -64.0 + 124.2500 143.5000 -64.0 + 121.2500 147.5000 -64.0 + 114.5000 152.2500 -64.0 + 111.5000 152.2500 -64.0 + 102.5000 148.2500 -64.0 + 98.7500 143.5000 -64.0 + 99.5000 141.7500 -64.0 + 105.5000 138.7500 -64.0 + 106.2500 139.5000 -64.0 + 108.5000 139.7500 -64.0 + 110.5000 137.7500 -64.0 +} -64.0 +v 134 z -220.000000 -64.0 +{ -64.0 + 114.2500 91.5000 -64.0 + 114.5000 92.7500 -64.0 + 116.5000 93.7500 -64.0 +} -64.0 +{ -64.0 + 90.2500 109.5000 -64.0 + 91.2500 111.5000 -64.0 + 92.5000 111.7500 -64.0 + 92.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 110.5000 -64.0 + 127.5000 110.7500 -64.0 + 129.5000 111.7500 -64.0 + 129.7500 110.5000 -64.0 +} -64.0 +{ -64.0 + 112.2500 113.5000 -64.0 + 112.2500 115.5000 -64.0 + 110.5000 117.2500 -64.0 + 107.5000 117.2500 -64.0 + 104.5000 120.2500 -64.0 + 100.5000 120.2500 -64.0 + 100.2500 121.5000 -64.0 + 102.5000 121.7500 -64.0 + 104.5000 120.7500 -64.0 + 107.5000 120.7500 -64.0 + 111.5000 117.7500 -64.0 + 114.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 115.5000 -64.0 + 115.2500 120.5000 -64.0 + 112.5000 124.2500 -64.0 + 110.5000 124.2500 -64.0 + 108.5000 126.2500 -64.0 + 110.5000 128.7500 -64.0 + 112.5000 127.7500 -64.0 + 112.7500 125.5000 -64.0 + 117.5000 123.7500 -64.0 + 120.5000 124.7500 -64.0 + 123.2500 127.5000 -64.0 + 121.5000 134.2500 -64.0 + 119.5000 134.2500 -64.0 + 117.5000 135.2500 -64.0 + 116.7500 134.5000 -64.0 + 116.7500 131.5000 -64.0 + 115.5000 131.2500 -64.0 + 114.5000 133.2500 -64.0 + 112.5000 134.2500 -64.0 + 112.2500 137.5000 -64.0 + 125.5000 137.7500 -64.0 + 126.2500 139.5000 -64.0 + 125.2500 144.5000 -64.0 + 115.5000 154.2500 -64.0 + 111.5000 154.2500 -64.0 + 107.5000 151.2500 -64.0 + 101.5000 148.2500 -64.0 + 98.7500 144.5000 -64.0 + 99.5000 142.7500 -64.0 + 103.5000 139.7500 -64.0 + 105.5000 139.7500 -64.0 + 107.5000 138.7500 -64.0 + 109.2500 139.5000 -64.0 + 109.7500 138.5000 -64.0 + 107.7500 137.5000 -64.0 + 107.7500 135.5000 -64.0 + 106.5000 135.2500 -64.0 + 105.5000 138.2500 -64.0 + 99.5000 138.2500 -64.0 + 97.7500 136.5000 -64.0 + 97.7500 134.5000 -64.0 + 96.2500 137.5000 -64.0 + 93.5000 140.2500 -64.0 + 91.5000 141.2500 -64.0 + 91.2500 142.5000 -64.0 + 89.5000 143.2500 -64.0 + 88.2500 147.5000 -64.0 + 89.5000 148.7500 -64.0 + 95.5000 149.2500 -64.0 + 94.7500 147.5000 -64.0 + 96.5000 145.7500 -64.0 + 100.2500 148.5000 -64.0 + 99.2500 149.5000 -64.0 + 102.2500 151.5000 -64.0 + 105.5000 151.7500 -64.0 + 109.2500 154.5000 -64.0 + 116.5000 154.7500 -64.0 + 118.2500 155.5000 -64.0 + 117.2500 160.5000 -64.0 + 120.7500 152.5000 -64.0 + 124.5000 148.7500 -64.0 + 128.5000 146.7500 -64.0 + 133.5000 146.7500 -64.0 + 136.5000 145.7500 -64.0 + 139.5000 142.7500 -64.0 + 140.5000 138.7500 -64.0 + 139.7500 136.5000 -64.0 + 137.5000 136.2500 -64.0 + 134.5000 140.2500 -64.0 + 130.5000 140.2500 -64.0 + 128.7500 138.5000 -64.0 + 133.5000 135.7500 -64.0 + 135.5000 135.7500 -64.0 + 137.5000 134.7500 -64.0 + 134.5000 133.2500 -64.0 + 128.5000 136.2500 -64.0 + 123.7500 130.5000 -64.0 + 123.7500 128.5000 -64.0 + 125.5000 126.7500 -64.0 + 128.7500 126.5000 -64.0 + 127.7500 124.5000 -64.0 + 124.5000 124.2500 -64.0 + 120.7500 119.5000 -64.0 + 118.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 125.5000 -64.0 + 96.5000 126.2500 -64.0 + 96.2500 128.5000 -64.0 + 97.5000 128.7500 -64.0 + 99.2500 129.5000 -64.0 + 104.5000 129.7500 -64.0 + 107.5000 128.7500 -64.0 + 107.7500 127.5000 -64.0 + 106.5000 127.2500 -64.0 + 104.5000 126.2500 -64.0 + 100.5000 128.2500 -64.0 + 98.5000 127.2500 -64.0 +} -64.0 +{ -64.0 + 134.2500 129.5000 -64.0 + 131.5000 131.2500 -64.0 + 132.5000 131.7500 -64.0 + 135.5000 130.7500 -64.0 + 135.7500 129.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 159.5000 -64.0 + 113.2500 161.5000 -64.0 + 114.5000 161.7500 -64.0 +} -64.0 +{ -64.0 + 90.7500 144.5000 -64.0 + 91.5000 143.7500 -64.0 + 93.2500 144.5000 -64.0 + 94.2500 146.5000 -64.0 + 93.5000 148.2500 -64.0 + 91.5000 148.2500 -64.0 + 89.7500 146.5000 -64.0 +} -64.0 +v 125 z -222.000000 -64.0 +{ -64.0 + 114.2500 92.5000 -64.0 + 114.2500 93.5000 -64.0 + 116.5000 93.7500 -64.0 + 115.7500 92.5000 -64.0 +} -64.0 +{ -64.0 + 95.2500 95.5000 -64.0 + 94.5000 97.7500 -64.0 + 96.5000 96.7500 -64.0 +} -64.0 +{ -64.0 + 127.2500 106.5000 -64.0 + 126.5000 107.2500 -64.0 + 127.2500 108.5000 -64.0 + 127.2500 110.5000 -64.0 + 129.7500 110.5000 -64.0 + 128.7500 107.5000 -64.0 +} -64.0 +{ -64.0 + 91.2500 109.5000 -64.0 + 91.2500 110.5000 -64.0 + 92.2500 113.5000 -64.0 + 93.5000 113.7500 -64.0 + 92.7500 112.5000 -64.0 + 92.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 90.2500 115.5000 -64.0 + 90.5000 115.7500 -64.0 + 92.5000 116.7500 -64.0 + 92.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 116.2500 115.5000 -64.0 + 112.5000 119.2500 -64.0 + 112.2500 121.5000 -64.0 + 110.5000 123.2500 -64.0 + 108.2500 123.5000 -64.0 + 114.5000 123.7500 -64.0 + 114.7500 121.5000 -64.0 + 116.5000 119.7500 -64.0 + 122.2500 128.5000 -64.0 + 121.2500 131.5000 -64.0 + 118.5000 134.2500 -64.0 + 115.5000 134.2500 -64.0 + 118.2500 136.5000 -64.0 + 117.5000 137.2500 -64.0 + 118.5000 137.7500 -64.0 + 124.5000 135.7500 -64.0 + 124.7500 126.5000 -64.0 + 123.5000 126.2500 -64.0 + 119.7500 122.5000 -64.0 + 119.7500 120.5000 -64.0 + 117.7500 118.5000 -64.0 + 117.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 101.2500 124.5000 -64.0 + 100.5000 125.2500 -64.0 + 98.5000 125.2500 -64.0 + 99.2500 126.5000 -64.0 + 99.2500 128.5000 -64.0 + 98.5000 130.2500 -64.0 + 99.5000 130.7500 -64.0 + 101.5000 128.7500 -64.0 + 106.7500 124.5000 -64.0 +} -64.0 +{ -64.0 + 126.2500 125.5000 -64.0 + 127.2500 127.5000 -64.0 + 129.5000 127.7500 -64.0 + 129.7500 126.5000 -64.0 +} -64.0 +{ -64.0 + 131.2500 128.5000 -64.0 + 131.2500 129.5000 -64.0 + 135.5000 129.7500 -64.0 + 135.7500 128.5000 -64.0 +} -64.0 +{ -64.0 + 133.2500 133.5000 -64.0 + 129.5000 135.2500 -64.0 + 127.2500 137.5000 -64.0 + 125.2500 141.5000 -64.0 + 126.2500 144.5000 -64.0 + 116.2500 155.5000 -64.0 + 117.2500 157.5000 -64.0 + 117.5000 162.7500 -64.0 + 117.7500 158.5000 -64.0 + 123.5000 150.7500 -64.0 + 130.5000 146.7500 -64.0 + 135.5000 146.7500 -64.0 + 140.5000 140.7500 -64.0 + 140.7500 138.5000 -64.0 + 139.5000 138.2500 -64.0 + 134.5000 143.2500 -64.0 + 129.5000 143.2500 -64.0 + 128.7500 141.5000 -64.0 + 129.5000 139.7500 -64.0 + 132.5000 139.7500 -64.0 + 136.5000 136.7500 -64.0 + 138.5000 136.7500 -64.0 + 138.7500 135.5000 -64.0 + 135.7500 133.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 136.5000 -64.0 + 97.2500 137.5000 -64.0 + 94.5000 139.2500 -64.0 + 90.5000 141.2500 -64.0 + 90.2500 143.5000 -64.0 + 88.5000 145.2500 -64.0 + 88.5000 148.7500 -64.0 + 90.5000 149.7500 -64.0 + 89.7500 147.5000 -64.0 + 90.5000 145.7500 -64.0 + 92.5000 144.7500 -64.0 + 94.5000 146.7500 -64.0 + 99.7500 147.5000 -64.0 + 98.7500 145.5000 -64.0 + 98.7500 143.5000 -64.0 + 100.5000 141.7500 -64.0 + 106.7500 139.5000 -64.0 + 104.5000 139.2500 -64.0 + 101.5000 138.2500 -64.0 + 98.5000 139.2500 -64.0 + 97.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 113.2500 137.5000 -64.0 + 113.5000 137.7500 -64.0 + 115.5000 138.7500 -64.0 + 115.7500 137.5000 -64.0 +} -64.0 +{ -64.0 + 100.2500 148.5000 -64.0 + 99.5000 150.2500 -64.0 + 96.5000 150.2500 -64.0 + 94.5000 149.2500 -64.0 + 92.5000 150.2500 -64.0 + 94.5000 151.7500 -64.0 + 97.5000 150.7500 -64.0 + 105.5000 152.7500 -64.0 + 111.5000 158.7500 -64.0 + 111.7500 155.5000 -64.0 +} -64.0 +{ -64.0 + 129.7500 136.5000 -64.0 + 130.5000 135.7500 -64.0 + 132.2500 136.5000 -64.0 + 131.5000 137.2500 -64.0 +} -64.0 +v 115 z -224.000000 -64.0 +{ -64.0 + 114.2500 93.5000 -64.0 + 114.5000 93.7500 -64.0 + 116.5000 94.7500 -64.0 + 115.7500 93.5000 -64.0 +} -64.0 +{ -64.0 + 96.2500 96.5000 -64.0 + 95.2500 97.5000 -64.0 + 96.7500 97.5000 -64.0 +} -64.0 +{ -64.0 + 124.2500 104.5000 -64.0 + 126.2500 108.5000 -64.0 + 126.7500 107.5000 -64.0 + 125.7500 104.5000 -64.0 +} -64.0 +{ -64.0 + 127.2500 109.5000 -64.0 + 127.2500 110.5000 -64.0 + 128.5000 110.7500 -64.0 + 128.7500 109.5000 -64.0 +} -64.0 +{ -64.0 + 92.2500 111.5000 -64.0 + 93.2500 114.5000 -64.0 + 91.2500 115.5000 -64.0 + 93.5000 115.7500 -64.0 + 93.7500 112.5000 -64.0 +} -64.0 +{ -64.0 + 132.2500 113.5000 -64.0 + 132.2500 114.5000 -64.0 + 133.7500 115.5000 -64.0 + 134.7500 113.5000 -64.0 +} -64.0 +{ -64.0 + 114.2500 115.5000 -64.0 + 111.2500 120.5000 -64.0 + 107.5000 122.2500 -64.0 + 102.5000 122.2500 -64.0 + 100.5000 123.2500 -64.0 + 102.2500 126.5000 -64.0 + 98.5000 131.2500 -64.0 + 98.5000 132.7500 -64.0 + 101.7500 130.5000 -64.0 + 103.7500 126.5000 -64.0 + 108.5000 123.7500 -64.0 + 111.5000 123.7500 -64.0 + 113.5000 120.7500 -64.0 + 115.2500 121.5000 -64.0 + 116.5000 120.7500 -64.0 + 116.7500 115.5000 -64.0 +} -64.0 +{ -64.0 + 117.2500 121.5000 -64.0 + 117.2500 122.5000 -64.0 + 120.2500 126.5000 -64.0 + 120.2500 128.5000 -64.0 + 118.5000 130.2500 -64.0 + 114.5000 133.2500 -64.0 + 114.2500 135.5000 -64.0 + 118.5000 135.7500 -64.0 + 119.2500 137.5000 -64.0 + 117.5000 139.2500 -64.0 + 115.5000 139.2500 -64.0 + 113.7500 137.5000 -64.0 + 112.2500 139.5000 -64.0 + 121.5000 139.7500 -64.0 + 122.7500 138.5000 -64.0 + 125.7500 132.5000 -64.0 + 124.7500 129.5000 -64.0 + 126.5000 125.7500 -64.0 + 125.5000 124.2500 -64.0 + 123.5000 125.2500 -64.0 + 120.7500 121.5000 -64.0 +} -64.0 +{ -64.0 + 97.2500 135.5000 -64.0 + 97.2500 136.5000 -64.0 + 95.2500 141.5000 -64.0 + 94.5000 143.2500 -64.0 + 88.5000 146.2500 -64.0 + 88.2500 149.5000 -64.0 + 94.5000 152.7500 -64.0 + 96.5000 151.7500 -64.0 + 103.5000 152.7500 -64.0 + 109.5000 155.7500 -64.0 + 108.7500 154.5000 -64.0 + 102.5000 150.2500 -64.0 + 100.5000 149.2500 -64.0 + 99.5000 151.2500 -64.0 + 96.5000 151.2500 -64.0 + 94.7500 149.5000 -64.0 + 96.5000 147.7500 -64.0 + 99.5000 148.7500 -64.0 + 97.7500 145.5000 -64.0 + 97.7500 143.5000 -64.0 + 98.5000 141.7500 -64.0 + 103.5000 141.7500 -64.0 + 107.5000 139.7500 -64.0 + 106.5000 139.2500 -64.0 + 104.7500 138.5000 -64.0 + 105.7500 136.5000 -64.0 + 103.5000 136.2500 -64.0 + 101.5000 138.2500 -64.0 + 98.7500 135.5000 -64.0 +} -64.0 +{ -64.0 + 130.2500 135.5000 -64.0 + 124.5000 142.2500 -64.0 + 127.2500 145.5000 -64.0 + 124.2500 149.5000 -64.0 + 131.5000 145.7500 -64.0 + 137.5000 145.7500 -64.0 + 140.7500 141.5000 -64.0 + 138.5000 141.2500 -64.0 + 134.5000 144.2500 -64.0 + 131.5000 144.2500 -64.0 + 129.7500 143.5000 -64.0 + 138.5000 139.7500 -64.0 + 138.5000 136.2500 -64.0 + 136.5000 135.2500 -64.0 + 137.2500 136.5000 -64.0 + 136.5000 138.2500 -64.0 + 134.7500 137.5000 -64.0 + 132.5000 138.2500 -64.0 + 131.5000 140.2500 -64.0 + 129.7500 139.5000 -64.0 + 131.7500 135.5000 -64.0 +} -64.0 +{ -64.0 + 115.2500 164.5000 -64.0 + 115.2500 166.5000 -64.0 + 116.5000 166.7500 -64.0 + 116.7500 164.5000 -64.0 +} -64.0 + -64.0 \ No newline at end of file diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom1249.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom1249.pts new file mode 100644 index 000000000000..e3d4e09ed6a0 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom1249.pts @@ -0,0 +1,1249 @@ +1248 +27.850301 -17.970299 134.875148 +-25.310101 -17.089901 117.229948 +-30.421501 -21.008499 144.254249 +0.114400 -1.784400 50.132200 +-18.264400 12.484400 101.627799 +17.396600 -1.906600 99.023301 +21.175900 -19.185901 135.392952 +21.063600 -19.043600 132.826796 +-22.225100 -15.724900 108.897448 +8.249500 -14.839500 101.639749 +29.463299 -5.123300 142.671651 +28.427000 -18.197000 149.973500 +20.364199 6.405800 114.632099 +14.811500 -9.141500 105.235749 +-15.004000 -8.116000 98.497997 +19.542701 -11.952700 123.446353 +-10.693900 -4.016100 58.998050 +-18.223399 -13.286600 96.398302 +-24.134400 11.784400 107.332801 +-23.475999 8.946000 104.191998 +-4.457700 9.027700 56.901148 +16.912700 15.277300 98.476347 +12.924100 12.075900 77.677051 +-21.715099 6.515100 96.397452 +10.053100 -2.053100 61.576548 +8.974900 -5.644900 68.852447 +29.422501 -20.732500 142.186247 +31.027899 -19.127900 149.983950 +27.245601 -13.955600 143.737795 +27.104600 -21.824600 149.962300 +22.975500 -13.585500 143.232755 +17.288300 -16.248301 111.504147 +11.139900 -5.079900 66.779953 +5.708200 -5.798200 66.274099 +9.299900 -4.059900 60.559951 +18.658001 -17.238001 120.339001 +28.983600 -7.483600 149.996800 +27.157400 -17.317400 149.988700 +30.981799 -14.521800 149.960900 +20.507200 17.852800 112.518598 +14.246800 -7.776800 92.238399 +15.299200 -12.349200 106.839596 +20.051600 -15.941601 125.510798 +17.014300 -12.824300 114.637149 +22.088301 -9.988300 120.869147 +18.696699 -9.706700 114.113353 +21.106100 -15.646100 129.163047 +22.033800 -2.333800 121.891898 +-19.762800 -11.657200 96.948599 +-20.256000 10.436000 98.992001 +-2.200600 2.110600 56.369702 +4.071700 -2.541700 66.255849 +3.152600 -1.982600 62.086299 +9.701500 -1.501500 62.625749 +14.424000 10.726000 88.107003 +-17.650600 6.960600 97.964700 +-16.106900 1.746900 89.671550 +3.865300 -3.635300 75.612649 +3.290200 -2.310200 69.370102 +-16.555599 8.445600 91.712202 +-7.549400 1.549400 62.095299 +6.940000 -9.100000 95.914998 +7.074300 -4.804300 73.542148 +-19.513600 4.613600 100.078202 +-20.076300 6.286300 102.651850 +-18.569800 -9.290200 100.035102 +-20.560200 1.840200 99.014901 +-17.004301 -7.375700 95.372852 +-15.204500 -11.905500 99.517748 +-11.031800 -10.748200 96.414102 +-4.650500 -7.619500 80.814746 +10.709000 -15.099000 110.989500 +9.578600 -12.348600 107.329301 +0.532000 -11.422000 103.195997 +-20.686101 6.686100 104.721952 +-15.619500 -8.810500 100.040252 +-15.200400 -10.819600 104.194798 +-12.088800 -11.001200 104.220598 +10.674700 -9.114700 102.117354 +20.819301 -18.709300 132.819646 +20.199099 -12.049100 128.674543 +19.385099 -11.085100 123.957550 +-20.917200 -9.272800 92.751403 +-4.043800 -2.546200 51.163101 +-9.308000 -4.242000 58.466000 +-16.998900 -14.221100 97.475553 +-15.706300 -13.303700 92.791853 +-19.028101 -12.051900 90.675951 +-22.591499 15.911500 100.584248 +-15.927600 14.587600 91.711202 +3.550800 8.709200 54.815400 +16.712400 11.697600 99.021201 +-19.986700 12.906700 96.921649 +-11.174600 7.344600 64.152697 +-13.900700 8.860700 77.674651 +11.669300 -3.059300 65.219648 +15.810500 0.239500 89.140254 +5.729900 -1.889900 53.249949 +7.298300 1.991700 57.419149 +23.049200 11.560800 111.494597 +20.645301 4.974700 113.057652 +13.972400 -3.812400 76.116204 +25.074399 0.045600 121.367202 +24.139500 4.980500 116.704751 +24.998800 -17.598800 145.279407 +26.568401 -16.038400 146.854205 +29.687400 -21.817400 149.958700 +22.317100 -19.487100 141.113554 +25.554001 -17.094000 148.407002 +23.782200 -13.892200 146.856105 +27.890600 -16.050599 147.355294 +12.177100 -4.727100 67.308550 +9.268400 -5.148400 63.159200 +10.442500 -4.652500 60.026251 +11.252200 -4.762200 65.236098 +8.167200 -3.957200 64.183597 +7.972200 -4.402200 66.261099 +-19.830300 13.350300 103.164847 +30.963699 -7.213700 149.951850 +19.028700 14.271300 109.414352 +18.123000 15.257000 105.256499 +25.123199 -0.783200 126.596598 +23.697200 8.712800 116.683601 +22.574900 2.235100 119.282450 +22.567500 9.082500 114.078753 +23.254100 5.555900 117.232048 +20.163701 14.096300 113.586848 +24.498400 -20.888400 149.954200 +18.343900 -7.843900 101.601949 +15.379100 -10.709100 108.904548 +15.561800 -12.021800 110.440903 +12.753200 -13.093200 108.906598 +17.214001 -12.934000 112.521998 +17.983100 -12.533100 114.631549 +12.877700 -11.097700 103.713851 +12.889700 -9.189700 101.594849 +12.393600 -13.353600 103.161797 +20.851200 -17.701200 130.215605 +20.459600 -17.209600 127.624799 +20.577200 -13.737200 125.553598 +19.710300 -16.280299 122.945149 +19.676200 -15.496200 122.928099 +12.485200 -11.985200 105.252599 +11.968600 -13.238600 106.829296 +21.251200 -8.951200 115.150604 +21.900801 -7.770800 118.780403 +19.093600 -0.583600 105.761803 +22.807101 0.602900 117.213548 +22.114700 6.175300 112.542348 +12.904200 -9.734200 107.327101 +11.800100 -10.420100 109.390052 +19.031600 -11.781600 121.380802 +21.798900 2.881100 117.214448 +22.072500 5.927500 114.596249 +22.255400 -4.445400 119.797696 +22.579200 -0.669200 119.284600 +18.505701 -11.765700 116.707851 +23.753101 -11.153100 131.261549 +23.506001 -2.996000 123.983000 +23.473301 -5.973300 123.966650 +22.830800 -4.360800 121.870398 +-19.869601 -13.140400 97.955200 +-20.318900 -11.191100 95.365552 +-21.455201 -1.124800 98.992401 +-20.642100 -9.617900 96.928949 +-22.819500 11.419500 103.675251 +-21.773300 11.133300 102.113354 +-21.579701 9.669700 99.015151 +-2.144400 1.054400 53.792799 +-4.323100 1.703100 55.838451 +-0.517400 -2.832600 58.471300 +-1.598500 -0.901500 53.790749 +-3.327100 -1.722900 54.831450 +-6.151400 2.481400 58.479300 +-7.639500 -2.870500 58.995250 +-4.462400 -3.167600 61.063802 +-8.892300 -3.417700 59.488850 +2.383600 -2.413600 66.271799 +-1.912000 4.502000 55.359001 +8.304700 -1.794700 60.532351 +6.917900 -0.907900 57.918949 +0.455600 1.654400 54.312800 +4.490400 -0.380400 55.310201 +4.719600 1.400400 55.329801 +5.251200 -3.031200 61.070602 +4.253600 -2.293600 55.836801 +-1.507200 5.247200 57.431399 +9.099200 -1.539200 61.579598 +-3.477400 5.587400 57.436299 +5.813900 -3.023900 62.626949 +5.740100 -3.320100 64.685051 +7.698300 0.961700 61.079152 +7.038400 3.821600 60.524201 +-1.123300 5.973300 58.473350 +-11.906800 -9.293200 96.391602 +-11.910600 -8.269400 97.959700 +0.503600 -10.243600 101.626799 +-4.825000 -9.885000 98.487497 +17.830800 5.989200 98.510397 +-14.861700 10.991700 86.029151 +15.921900 13.058100 92.750953 +15.026600 9.873400 88.103303 +-19.060499 10.430500 98.994751 +-18.130300 12.180300 96.929849 +-17.176200 10.856200 94.316901 +-17.909900 2.589900 96.955049 +-19.156400 4.436400 96.916799 +-19.930999 4.581000 98.499497 +5.521700 -4.311700 71.965850 +-19.701600 12.661600 100.069202 +-20.812100 11.672100 98.483947 +-20.825200 12.795200 96.917399 +-18.757200 13.337200 93.281400 +-18.345499 13.475500 90.702251 +-20.228600 9.038600 97.455703 +-18.708099 7.788100 96.405952 +-16.348100 9.858100 90.195947 +-7.977300 3.337300 60.541351 +-11.808700 4.728700 71.995650 +-10.434000 3.634000 65.202998 +-5.086500 -4.323500 71.466753 +0.870600 -3.170600 75.100303 +-2.508200 -4.341800 75.095903 +-9.061500 5.131500 65.209248 +0.447400 8.312600 61.558698 +0.540500 9.129500 65.230248 +-7.760200 6.150200 62.099899 +-5.932200 9.472200 62.098899 +-10.075900 7.105900 68.332051 +7.026000 -4.076000 69.872998 +10.748600 -1.578600 65.744302 +7.064500 -3.804500 67.802246 +-14.228600 7.048600 81.830697 +0.624000 -3.784000 78.732002 +-2.199100 -7.120900 83.945449 +0.910300 -4.610300 79.770153 +-1.691200 -6.778800 81.879397 +-14.983700 -7.696300 96.913149 +-8.715400 -8.384600 93.307300 +-13.627000 -7.513000 93.826496 +13.315700 8.914300 81.347851 +14.384600 -1.814600 84.457303 +3.888300 -2.638300 71.449153 +-20.895399 9.765400 102.112304 +-19.105800 9.415800 100.592098 +-19.144600 7.074600 99.522698 +-21.144901 7.764900 101.102553 +-21.158100 5.308100 100.035952 +-20.203401 4.733400 100.078302 +-20.285100 6.535100 99.552448 +-19.867501 6.977500 97.956250 +-16.701200 -10.818800 102.654400 +-16.249600 -11.180400 101.110203 +-19.134101 -12.015900 97.987950 +-16.947700 -11.412300 97.981150 +-17.707000 -10.403000 98.506497 +-19.436600 -9.163400 100.031702 +-21.721901 2.901900 99.029051 +-21.651400 4.391400 101.599299 +-17.619800 -10.570200 96.935099 +-19.640300 -10.629700 95.374852 +-18.564900 -1.845100 97.447553 +-17.973400 -4.876600 94.328301 +-17.237900 -8.492100 96.956049 +-19.617101 -9.482900 95.876448 +-19.072001 -7.548000 95.898998 +-20.384401 1.644400 95.907798 +-16.475200 2.025200 89.642400 +-0.915300 -11.574700 99.532348 +5.236500 -11.196500 101.118253 +7.105100 -12.185100 103.692551 +-4.833600 -12.456400 99.548198 +3.587700 -12.287700 104.233848 +-11.012100 -10.037900 99.548948 +-14.849800 -12.400200 99.520098 +-11.471800 -11.978200 100.044102 +-13.937900 -10.512100 99.546048 +-14.697600 -10.622400 102.126204 +-16.399499 -13.070500 97.435253 +-16.645599 -10.554400 96.437202 +-14.318900 -9.381100 96.435552 +-16.075000 -11.765000 97.432503 +-13.879100 -11.310900 96.405452 +8.370300 -6.840300 78.730152 +5.836600 -8.476600 90.158297 +8.049600 -7.739600 84.989800 +6.871800 -13.841800 100.060902 +2.995900 -5.875900 79.272949 +-9.843800 -11.666200 93.308100 +-10.480200 -12.669800 96.439902 +4.401700 -4.881700 74.040852 +4.844300 -6.424300 70.932149 +6.401900 -6.821900 76.635950 +-2.854500 -7.305500 75.117753 +-12.435900 -5.864100 77.672051 +-16.050100 -6.369900 87.584948 +-14.378200 -7.051800 91.210898 +-17.341500 -3.838500 91.719252 +-16.670000 -7.100000 92.790003 +-16.213400 -6.776600 90.183297 +-14.210300 -9.339700 95.369852 +-0.693600 -3.496400 66.798203 +1.874500 -4.614500 73.032251 +16.307500 -14.677500 114.098753 +12.886800 -14.746800 108.388402 +16.145200 -14.355200 111.992601 +19.079701 -15.199700 120.344851 +18.376101 -14.066100 116.163047 +-6.587500 -13.632500 101.591249 +-12.355600 -12.534400 102.152204 +2.780700 -13.090700 104.190348 +-16.055700 -13.014300 100.557148 +-18.943901 -9.896100 101.638049 +-19.953901 2.633900 100.033052 +-11.035400 -9.444600 102.652300 +-14.802200 -9.647800 103.188897 +-19.080200 4.940200 100.034902 +-19.051199 9.191200 102.634400 +11.654100 -9.624100 105.782053 +3.878300 -11.078300 104.199148 +10.226000 -14.306000 110.443003 +-20.797801 -12.252200 92.231099 +18.481301 1.958700 105.255649 +3.080900 -10.280900 101.090453 +-20.208101 13.128100 90.710951 +-9.834500 10.214500 64.157747 +-21.474900 13.394900 95.362552 +2.548200 -1.428200 49.629099 +6.123200 -2.783200 54.286600 +4.486300 2.443700 51.688151 +5.448100 2.181900 53.784049 +9.673400 0.846600 60.536701 +9.712600 8.327400 65.196298 +22.982500 17.437500 112.026251 +23.942899 12.657100 115.671450 +18.971300 8.268700 104.755652 +21.303101 8.846900 111.491547 +21.161500 11.518500 111.515747 +20.607900 -4.577900 108.883948 +22.374501 15.865500 108.362252 +29.379899 -7.159900 148.399952 +22.148200 -18.958199 138.514098 +23.999200 -14.069200 146.359601 +30.092000 -20.322000 145.316007 +25.465401 -18.835400 147.887698 +9.726500 -4.096500 61.043252 +10.248800 -4.328800 62.629399 +9.941900 -2.591900 62.635949 +10.080400 -1.990400 63.665200 +5.986500 -3.566500 66.793253 +7.280200 -4.320200 66.260099 +31.057399 -6.397400 149.998700 +21.694800 8.405200 114.607399 +22.731200 13.688800 113.030602 +22.918801 11.191200 113.589398 +21.985999 12.554000 113.048002 +21.906799 11.493200 113.573398 +22.248400 1.821600 119.794196 +16.536301 -2.806300 94.323151 +18.774899 -2.934900 105.782453 +15.962600 -10.982600 108.911298 +17.625200 -11.455200 112.532598 +14.680600 -10.850600 106.805296 +14.956100 -11.846100 108.878048 +16.422500 -11.012500 112.516248 +15.800800 -10.710800 110.950400 +16.323700 -13.233700 110.441853 +12.565700 -12.055700 101.607849 +12.073700 -9.623700 103.671851 +9.856000 -6.856000 78.237998 +19.813300 -12.463300 123.476653 +11.211700 -10.151700 103.685851 +13.702600 -11.622600 107.356301 +13.741200 -11.611200 106.795596 +10.592600 -14.672600 109.941299 +10.970000 -14.090000 104.730002 +20.161701 -8.141700 108.380852 +18.341101 -2.181100 103.670551 +21.176500 -4.256500 115.113254 +19.864300 -3.604300 110.972150 +19.000100 -2.800100 107.320051 +15.300200 -9.330200 107.320101 +17.744199 -11.234200 114.607099 +18.064699 -11.294700 116.687351 +18.155199 -10.645200 117.212598 +22.239300 0.710700 119.319650 +23.097000 5.023000 116.683501 +22.833101 4.646900 119.306550 +23.943600 0.026400 121.896798 +24.344800 0.935200 121.887398 +22.038699 5.551300 114.109353 +21.817901 7.242100 114.098953 +22.650900 6.489100 114.590449 +22.047599 -3.577600 117.238798 +23.728501 -3.518500 121.894248 +21.818500 -1.128500 117.224248 +20.224299 -3.374300 113.042152 +20.642800 -3.622800 115.146404 +23.035299 0.004700 119.307650 +22.762501 -3.402500 119.271250 +26.109100 -5.889100 131.774553 +26.260599 -2.320600 129.175297 +24.383699 -5.773700 126.556848 +24.585801 -3.455800 123.987900 +24.507800 -1.517800 123.478903 +23.095200 -1.885200 121.892598 +-21.069200 -10.340800 95.895398 +-21.263501 -9.066500 97.443253 +-21.871401 11.921400 102.154304 +-22.629499 10.979500 102.125254 +-3.089700 4.849700 54.810150 +-1.995700 1.025700 53.247149 +-3.808300 4.718300 55.315851 +-2.563500 -2.246500 53.773249 +-4.778300 -1.591700 55.310851 +-3.715500 -2.444500 54.827250 +-2.715500 -1.094500 53.787249 +-4.852400 3.982400 58.473800 +-4.653400 4.553400 57.393299 +-4.061100 2.651100 56.904448 +-2.546700 2.416700 55.326651 +-8.068300 -1.411700 58.985850 +-3.838900 1.728900 56.915548 +-7.604500 -2.105500 58.462750 +-6.998900 -3.171100 58.460550 +-5.521700 0.361700 57.949149 +-2.973200 1.153200 55.353401 +-1.923500 -0.326500 55.353251 +-10.482400 3.952400 67.303800 +-3.653800 -3.206200 65.213098 +-1.448400 -3.021600 66.765803 +-9.218600 3.098600 65.190698 +-0.462900 2.592900 54.273550 +8.063300 -0.003300 58.476650 +2.443600 -1.503600 52.196802 +1.720900 -0.570900 51.685451 +0.261300 -1.001300 51.715651 +-1.007300 0.077300 53.236349 +1.049300 -1.919300 54.794650 +-1.498700 0.418700 54.270650 +-1.444500 0.014500 54.827750 +4.184200 2.065800 54.802100 +4.460000 2.760000 53.254999 +6.734300 2.025700 57.927149 +4.345700 1.744300 56.382852 +-0.237900 -2.462100 58.461050 +5.872000 -0.702000 55.336001 +6.442400 1.107600 57.931199 +3.319600 -1.989600 58.474800 +4.282500 1.017500 55.351251 +-1.445000 3.595000 55.877501 +-0.485100 2.845100 55.877451 +-1.454600 2.024600 54.822700 +5.745400 2.754600 55.857701 +5.633700 0.426300 55.311851 +4.461200 -0.811200 52.715598 +3.570900 1.759100 53.270449 +3.250700 0.399300 52.195352 +5.723800 3.876200 56.881898 +-0.977000 5.387000 57.396499 +4.967600 -2.257600 53.778799 +-1.971400 5.711400 56.384302 +8.033400 1.716600 60.016701 +9.139800 -0.679800 61.599898 +8.949100 -0.669100 61.074552 +9.047300 -1.457300 62.088649 +7.109500 4.410500 59.479750 +7.933100 3.676900 60.556551 +-8.984900 -9.175100 95.897548 +0.598900 -9.778900 100.034452 +-17.128199 12.078200 96.925899 +16.645199 2.394800 95.882598 +15.626100 1.453900 90.703051 +14.841600 12.258400 90.150797 +-15.930800 9.370800 90.169597 +15.111600 10.078400 89.650800 +-18.572300 12.242300 100.033852 +-19.811201 12.281200 97.984400 +-16.347099 13.737100 91.741452 +-18.811701 13.021700 92.269149 +-17.837300 13.337300 92.276349 +-17.081200 13.271200 93.314400 +-17.856500 4.066500 98.516747 +-18.786001 4.746000 98.476997 +-21.000300 3.670300 98.474847 +-20.752300 2.872300 98.513847 +7.249400 -5.679400 69.369702 +5.777500 -4.487500 70.408752 +4.603200 -3.233200 67.296600 +5.974100 -4.854100 67.287050 +5.335200 -3.745200 69.372602 +-16.499700 13.289700 90.685151 +-20.912000 12.362000 96.958999 +-21.594200 12.804200 98.517897 +-20.775100 12.475100 98.502447 +-20.759800 13.199800 96.950099 +-15.283200 13.193200 86.533398 +-19.654900 12.824900 93.807546 +-18.396400 7.436400 94.846797 +-18.371999 13.702000 89.129004 +-7.789900 4.059900 59.475050 +-9.356500 1.886500 62.606749 +-10.212100 3.162100 62.613949 +-15.292300 10.132300 86.038851 +-14.785000 9.135000 81.832497 +-10.827800 2.417800 64.156097 +-10.210600 2.390600 65.759702 +-6.756800 -3.573200 65.236598 +-9.469600 1.919600 64.170197 +-2.924400 -3.455600 69.902798 +-10.137300 5.887300 68.861347 +-12.612300 6.612300 77.713851 +1.076400 9.473600 64.698201 +-2.029800 6.949800 57.415099 +3.301900 -2.221900 67.790946 +8.036200 6.673800 64.173097 +-10.128600 6.178600 66.245699 +-8.139300 6.189300 61.570348 +-4.122300 7.932300 58.973850 +-4.172100 8.732100 59.488950 +-8.603300 3.333300 62.608349 +0.563200 -2.753200 66.791603 +0.562000 9.988000 68.346001 +-9.018100 7.958100 62.615949 +-6.984000 8.674000 61.562998 +-9.686800 7.526800 64.176597 +-7.311800 6.531800 62.604099 +-11.889900 7.249900 71.455053 +-10.956700 7.646700 65.726652 +-10.665100 6.305100 70.952449 +-9.969900 7.579900 65.210048 +-9.153600 7.653600 65.723202 +9.043200 -4.543200 67.796596 +8.712100 -4.102100 66.776053 +11.849900 -4.369900 67.794946 +6.775700 -3.965700 71.967850 +10.736500 1.233500 65.738252 +11.129600 8.350400 71.974800 +9.522200 -0.442200 62.591099 +8.286700 3.443300 61.598348 +9.468700 0.561300 62.619349 +-11.538400 -8.511600 96.410802 +14.541400 9.548600 87.060702 +13.429200 -2.329200 77.184597 +-19.824700 11.724700 101.637649 +-20.738800 10.828800 100.560598 +-20.055999 10.966000 100.551998 +-19.408699 9.348700 98.990651 +-20.488900 9.278900 101.080553 +-21.865900 7.415900 99.537048 +-21.178800 4.638800 98.470597 +-20.600600 5.500600 101.599699 +-20.710699 6.380700 97.959650 +-20.677699 6.937700 97.976150 +-20.338200 5.858200 99.525898 +-20.277300 11.417300 102.156354 +-20.647399 7.817400 102.631300 +-16.013600 -13.416400 100.578198 +-18.070301 -13.779700 99.544848 +-19.446700 -12.923300 99.541648 +-17.209300 -11.720700 99.545348 +-16.739900 -11.550100 99.520048 +-19.026900 -9.703100 100.061552 +-17.887701 -12.452300 99.546148 +-15.971300 -11.148700 99.559348 +-15.678100 -9.831900 101.605949 +-15.446900 -11.083100 102.661550 +-20.269301 -9.190700 100.045352 +-19.640699 -10.939300 98.474647 +-21.477400 5.407400 100.046302 +-18.805799 -11.964200 96.437102 +-17.937401 -2.042600 95.886298 +-17.162600 -0.177400 91.728702 +-18.283601 0.073600 95.878198 +-20.225801 -2.194200 95.902098 +-19.877400 -1.292600 97.466303 +-17.522800 -8.377200 98.513597 +-19.861900 -0.118100 97.474053 +-19.426100 1.256100 97.436953 +-19.457500 -9.512500 96.936249 +-18.080600 -9.899400 96.954699 +-20.346100 -9.883900 95.351952 +-18.459300 -7.490700 96.930349 +-18.618901 -7.741100 95.880548 +-18.978800 -8.421200 96.920599 +-20.064400 -7.895600 97.452803 +-19.394500 -4.695500 97.452753 +-19.944901 -8.645100 94.317551 +-20.432301 -8.337700 95.883848 +-19.915901 -5.434100 95.892048 +-21.048100 -0.571900 95.905948 +-14.592100 8.032100 80.798946 +-1.273500 -10.286500 100.048252 +2.758700 -11.898700 101.104353 +4.969800 -11.599800 101.074903 +0.497400 -11.537400 101.103703 +0.686300 -10.626300 101.633149 +-1.961500 -11.018500 100.049252 +8.126300 -10.126300 100.583148 +3.692500 -11.092500 102.666250 +6.195400 -11.235400 102.677700 +6.806500 -13.476500 102.123254 +5.796200 -12.036200 102.148104 +7.812300 -13.262300 101.596149 +7.333800 -11.483800 102.121904 +4.534400 -13.864400 102.132204 +0.311100 -12.631100 101.100553 +-2.320100 -13.109900 101.094953 +-0.060000 -12.310000 102.650000 +7.110100 -12.570100 103.695051 +-13.817700 -9.012300 99.521148 +-11.398700 -9.541300 101.090653 +-13.059600 -9.500400 97.980200 +-1.984100 -10.455900 101.612949 +-10.137700 -10.152300 97.456153 +-10.090500 -11.269500 97.479753 +-7.062300 -11.657700 98.473847 +-10.540700 -9.509300 99.529648 +-8.871800 -10.628200 100.589098 +-9.435300 -11.774700 99.022351 +-12.858100 -11.651900 99.020951 +-10.158400 -11.291600 100.555798 +-14.481000 -12.549000 97.469503 +-9.823700 -10.536300 102.638150 +-4.578100 -11.361900 101.630949 +-4.400300 -11.479700 100.034852 +-13.624600 -10.285400 97.952700 +-12.417300 -11.102700 102.671350 +-12.059100 -11.050900 101.110453 +-13.340600 -10.629400 101.079703 +-12.703600 -11.966400 100.583198 +-13.709000 -11.591000 101.070503 +-13.886400 -11.173600 102.646800 +-14.580800 -10.569200 102.654600 +-16.395599 -13.674400 96.957199 +-15.273900 -12.876100 94.853047 +-16.463399 -12.186600 95.398302 +-16.845900 -12.194100 97.467053 +-16.270699 -10.559300 94.849647 +-14.895900 -7.924100 95.357052 +-15.952600 -11.837400 95.888698 +8.999400 -8.169400 88.624699 +-1.951400 -7.968600 80.839296 +1.519900 -13.839900 99.029951 +-3.163900 -13.006100 99.523048 +-2.444000 -8.756000 87.058002 +-2.377500 -11.922500 96.416252 +-5.825300 -11.704700 98.497347 +-4.285300 -11.234700 98.502347 +-3.072700 -9.337300 92.783653 +-2.852700 -9.197300 91.228648 +-10.256200 -13.323800 100.046902 +-7.767800 -12.682200 99.541098 +3.179500 -5.899500 75.594749 +3.816800 -5.836800 74.068402 +5.268300 -4.898300 74.594148 +5.013300 -5.403300 77.176647 +4.839400 -5.449400 76.149704 +-0.478400 -6.161600 78.725802 +-3.160100 -6.699900 78.209948 +4.905800 -4.335800 74.037902 +5.658800 -5.768800 73.034401 +-18.743100 -12.386900 94.838447 +-5.969000 -5.351000 71.455503 +-14.914300 -4.505700 78.207848 +-12.596700 3.606700 72.476647 +-16.529799 -2.190200 87.570098 +-14.929800 -2.460200 80.835096 +-16.021900 -2.008100 85.479047 +-16.434299 -4.845700 85.492847 +-17.649101 -4.930900 92.780453 +-17.411000 -5.029000 91.759502 +-15.047400 -7.062600 89.661300 +-19.743401 -10.336600 92.773303 +-19.632000 -11.398000 92.253999 +-20.240601 -10.509400 94.334701 +-8.613500 -8.606500 90.718251 +-10.367600 -8.342400 93.286200 +-14.576100 -12.593900 91.751952 +-15.813600 -11.806400 91.203198 +-16.881300 -10.578700 93.819346 +-5.934000 -8.366000 88.118003 +-3.775600 -6.304400 76.112204 +-3.915400 -5.844600 74.572298 +-2.848200 -4.781800 73.530898 +1.946800 -5.566800 71.978400 +3.504500 -4.074500 74.042252 +3.815800 -4.355800 72.992901 +4.350600 -5.480600 71.435303 +4.330000 -5.250000 72.494997 +3.807500 -5.237500 70.398752 +2.250300 -5.580300 73.030151 +-1.741100 -4.118900 73.514448 +-0.621600 -3.908400 71.474203 +-1.640700 -5.509300 77.179647 +-1.134300 -4.735700 76.117854 +0.886300 -4.846300 77.178147 +0.960500 -4.980500 75.595249 +19.434700 -15.774700 122.917349 +16.403399 -15.823400 113.566698 +14.380000 -13.650000 106.839996 +12.812500 -13.552500 106.791246 +12.593000 -14.553000 106.286500 +14.959600 -14.949600 109.944799 +14.348700 -12.868700 108.369352 +14.253200 -14.333200 110.456603 +15.051900 -15.101900 112.025951 +19.063800 -12.133800 118.796903 +17.765000 -16.035001 115.677500 +-1.132400 -12.367600 103.168797 +-7.281300 -14.248700 101.594349 +-12.936200 -13.733800 102.126904 +-19.031599 -1.878400 99.009201 +-18.427901 2.807900 98.486047 +5.566800 -11.906800 104.233398 +8.440000 -10.640000 104.229998 +18.891900 1.818100 107.355951 +-20.619101 -12.610900 92.240449 +2.507200 -0.277200 49.103599 +18.247300 3.062700 102.113654 +19.661600 11.418400 109.920799 +17.886900 4.673100 102.113454 +-19.567501 14.097500 89.146254 +-8.484300 9.104300 61.052852 +-10.928400 9.608400 64.670801 +9.342000 5.998000 62.605999 +12.389100 10.620900 74.074552 +23.612199 17.337800 114.111103 +20.930699 7.409300 110.460353 +19.408001 3.942000 107.339001 +21.632499 12.437500 109.396252 +19.459799 11.880200 107.834897 +21.044199 9.885800 109.952099 +19.995600 12.884400 111.507797 +20.822699 10.117300 112.011351 +21.259400 9.530600 112.034701 +20.094301 15.515700 110.992150 +22.501500 15.058500 110.950750 +21.912701 12.347300 111.506347 +19.004100 15.795900 105.242049 +19.710200 15.499800 108.905098 +21.259000 16.191000 110.434503 +17.803699 13.776300 102.156854 +15.177400 9.722600 87.078702 +21.939200 -18.989199 138.529598 +23.911700 -13.801700 146.315851 +9.310900 -2.930900 62.110449 +23.127999 13.542000 113.034002 +22.026599 15.673400 113.068302 +22.630500 10.409500 114.110253 +22.306500 13.003500 113.578248 +21.877799 12.492200 113.558898 +22.036099 10.133900 114.108053 +9.660500 -9.490500 100.570248 +13.234500 -11.634500 105.267249 +15.683900 -11.453900 110.986950 +15.229400 -10.339400 108.919698 +16.328500 -11.218500 110.444253 +11.132700 -14.082700 102.661350 +14.446700 -13.526700 106.293350 +10.165900 -10.055900 104.192948 +11.387200 -9.647200 103.683601 +12.260800 -13.720800 104.740402 +11.562800 -13.462800 106.811396 +20.435100 -3.325100 110.967550 +21.217500 1.302500 117.223748 +20.850901 2.799100 115.150454 +22.218400 5.011600 117.219198 +22.275201 5.924800 114.597599 +23.548200 4.351800 118.784103 +23.407600 2.952400 119.283800 +20.810401 -3.450400 115.130204 +22.672000 1.668000 119.800996 +23.458500 0.581500 119.309250 +22.526901 -4.516900 119.833446 +26.467201 -2.627200 129.168597 +25.050799 -2.240800 126.560398 +-18.884899 -12.705100 96.397552 +-20.838900 -11.701100 96.910549 +-20.707300 -10.302700 94.346351 +-21.245200 12.155200 100.077402 +-2.979900 -0.100100 53.750049 +-1.436100 -1.653900 54.831950 +-1.004900 -1.265100 54.287550 +-4.738300 -2.201700 54.835850 +-2.840700 -0.669300 54.839650 +-2.847700 3.237700 55.851151 +-3.452400 4.162400 56.373802 +-1.977500 1.127500 54.316250 +-3.410300 2.150300 55.324851 +-9.306400 1.176400 60.556801 +-9.533000 1.113000 61.563498 +-9.235700 1.735700 61.552148 +-5.845100 -0.054900 57.392449 +-6.742400 -0.627600 58.988800 +-6.203500 -2.826500 56.913248 +-6.574700 -0.845300 58.472650 +-4.095700 0.715700 55.857151 +-3.577500 -1.022500 55.876251 +-1.324400 4.944400 58.997800 +1.937000 -0.987000 50.133500 +0.420500 1.349500 53.775249 +2.204900 0.255100 50.642450 +8.248700 -1.888700 59.484350 +6.950800 0.389200 57.935399 +-0.660600 -0.699400 53.269699 +-1.436900 0.696900 53.776549 +-2.051700 1.461700 55.334151 +-1.472900 -0.287100 54.813550 +-0.004700 0.984700 54.317650 +-0.319900 -2.520100 57.950049 +3.078400 -1.708400 53.254199 +5.237000 3.113000 55.848501 +-1.456500 2.376500 55.346751 +5.973600 2.056400 55.336801 +3.632100 -0.452100 52.756048 +3.661100 0.328900 51.675551 +5.372600 3.557400 57.401299 +-1.218900 5.388900 56.375552 +-16.900299 0.640300 92.754853 +-8.766600 -8.563400 94.831697 +-17.369600 11.989600 98.505197 +-14.430800 11.680800 83.424602 +-18.450301 11.330300 98.474847 +-18.156600 12.666600 92.276699 +-19.437900 12.877900 95.391052 +-19.977801 5.607800 97.986100 +7.468500 -4.268500 67.279250 +7.634000 -4.934000 68.831997 +6.310500 -3.440500 68.330251 +-17.804000 13.144000 97.973000 +-19.238299 12.828300 98.505847 +-16.842600 13.172600 89.123704 +-17.875700 9.275700 97.457153 +-17.528501 10.848500 95.360752 +-10.420200 1.940200 61.599898 +-5.235100 4.685100 57.397449 +-10.689100 1.659100 62.080449 +-9.898600 0.778600 63.675700 +-6.698200 -4.701800 70.430902 +-10.887500 -1.062500 63.111250 +0.190800 -3.010800 71.970400 +-0.084200 -3.165800 74.037902 +-8.963700 6.073700 65.758152 +-9.851000 6.131000 66.774503 +-2.943200 -6.006800 79.243399 +-2.575900 -4.564100 76.122054 +-10.995400 5.735400 71.472303 +7.643600 5.836400 61.051802 +6.448300 4.791700 58.964150 +-1.015200 6.165200 57.427399 +11.096800 9.553200 71.478403 +9.057300 6.952700 65.208648 +-8.771400 3.781400 62.074299 +-3.283700 7.473700 57.433149 +-2.533300 6.363300 57.943349 +-3.161800 8.221800 57.929099 +-6.149500 6.839500 58.980250 +-7.230500 8.290500 61.049752 +-7.556200 4.366200 60.541901 +-9.994300 4.304300 64.187847 +-8.963900 4.083900 63.148050 +-7.231200 8.501200 62.094399 +-4.680400 9.130400 60.029801 +-8.176900 6.906900 62.606549 +-6.618500 9.308500 63.665750 +-6.622300 8.532300 63.663850 +7.832100 4.517900 61.581048 +9.177400 6.492600 64.188697 +11.363700 8.996300 73.526848 +-14.315900 8.395900 81.857047 +9.925000 -8.095000 91.732502 +7.637400 -8.527400 92.273699 +-16.025100 -1.074900 87.597448 +13.503600 11.316400 80.826796 +14.441300 4.428700 82.915648 +3.068000 -5.418000 79.238999 +5.164300 -4.084300 73.037151 +-19.133900 10.793900 100.578048 +-19.882701 9.742700 100.553648 +-21.877999 8.168000 101.086003 +-18.307699 12.037700 100.076152 +-18.956600 8.146600 99.531698 +-20.833301 8.623300 99.538348 +-20.579900 5.269900 98.515047 +-21.368699 7.318700 97.965650 +-15.711300 -13.398700 102.149354 +-18.242199 -14.137800 99.543898 +-19.128900 -13.381100 99.530548 +-18.751200 -13.208800 101.079403 +-17.369601 -13.450400 100.595198 +-15.470100 -10.289900 99.554948 +-17.622000 -11.998000 97.979000 +-18.969501 -12.970500 97.985250 +-20.297800 -9.522200 98.486097 +-20.041400 -8.988600 97.464303 +-22.337700 6.107700 101.606149 +-21.421200 4.661200 98.519397 +-19.942101 -5.897900 94.318951 +-20.196300 -2.363700 97.471853 +-20.205400 0.605400 97.467303 +-20.026100 1.306100 97.471953 +-19.501500 0.671500 96.914249 +-18.046900 -9.563100 98.506547 +-20.152400 -9.007600 96.918799 +-19.113601 -8.916400 98.483197 +-19.917400 -5.452600 98.991301 +-19.058700 -7.431300 97.455653 +-20.600200 -5.409800 95.879898 +-20.391500 -4.828500 97.459253 +-18.158801 0.618800 95.375602 +-18.085800 -0.914200 94.352101 +-21.077800 1.227800 97.451103 +-20.904700 3.534700 95.892648 +-20.725500 -0.774500 94.337251 +1.656800 -12.046800 99.528398 +1.375800 -10.685800 101.107903 +-2.204500 -9.755500 96.942749 +2.351300 -13.141300 100.560648 +4.268100 -13.268100 100.564048 +4.446000 -11.966000 101.073003 +1.185800 -12.065800 102.652900 +3.278700 -13.098700 102.124354 +2.657400 -11.867400 102.678700 +-0.041200 -11.088800 101.619399 +4.417300 -12.107300 102.673650 +7.918300 -9.928300 102.149154 +5.226100 -13.316100 101.623049 +7.224300 -13.044300 102.157154 +7.005200 -14.205200 101.632599 +-0.241100 -13.088900 101.084453 +-1.299100 -11.680900 101.605449 +-0.725400 -11.414600 101.107303 +-3.895800 -12.704200 101.622099 +-2.657700 -12.092300 101.626149 +-1.259700 -13.020300 102.145154 +5.117700 -13.427700 103.683851 +6.028100 -12.468100 104.194048 +-9.005600 -11.644400 97.432203 +-7.580700 -10.549300 99.009651 +-8.126200 -9.903800 98.991901 +-9.141600 -11.488400 98.999201 +-9.957600 -9.722400 100.566198 +-6.761800 -12.628200 100.064102 +-10.849200 -11.060800 97.435403 +-10.337200 -11.122800 98.996401 +-15.430000 -13.560000 99.015001 +-13.858600 -13.471400 99.030701 +-11.126300 -12.393700 98.481847 +-5.201100 -10.968900 102.114454 +-4.884800 -10.385200 100.587598 +-7.142300 -10.377700 100.583848 +-9.404900 -10.375100 102.127554 +-2.794400 -12.145600 100.062802 +-3.641800 -11.558200 98.484097 +-4.366100 -10.783900 100.051952 +-16.248799 -12.571200 95.905598 +-15.558200 -9.601800 100.070902 +-12.069800 -11.720200 102.115104 +-12.968800 -11.831200 102.110604 +-14.535100 -11.014900 101.092453 +-13.630600 -11.569400 99.529698 +-16.839200 -13.770800 98.515397 +-15.121400 -13.008600 95.889298 +-16.586300 -7.463700 93.801846 +-16.328800 -11.351200 97.950600 +-14.892000 -11.678000 97.994000 +-1.479300 -7.400700 81.845347 +1.704500 -9.164500 92.257249 +-2.526900 -13.033100 97.476553 +0.609300 -13.289300 98.999651 +-5.638200 -12.681800 98.505897 +-2.951500 -9.328500 90.199247 +-8.721500 -12.178500 98.494247 +-10.965500 -12.024500 99.027251 +-9.812600 -12.037400 97.448703 +4.922200 -5.582200 75.621099 +3.014000 -6.524000 74.052002 +2.992300 -5.082300 76.651150 +3.315700 -5.645700 77.702851 +-0.489900 -6.620100 79.760053 +-2.971100 -6.778900 76.119454 +-0.741400 -7.228600 79.774303 +7.418000 -5.658000 71.979000 +4.855800 -5.685800 74.582898 +-15.413100 -6.296900 84.993450 +-13.719500 7.869500 77.700251 +-13.932100 5.432100 80.283950 +-14.582700 -7.297300 93.833646 +-16.340899 -0.519100 89.144554 +-16.430900 -7.379100 92.264549 +-16.089500 -7.260500 92.760253 +-20.344100 -10.375900 92.792953 +-15.898200 -12.141800 92.775903 +-17.373301 -10.936700 95.353352 +-3.282800 -6.947200 76.158604 +-4.096200 -5.783800 73.541898 +-4.712700 -4.817300 73.548648 +-5.949000 -5.221000 73.025501 +-3.369100 -5.470900 76.115454 +-5.298600 -6.371400 75.600699 +-2.107300 -4.812700 75.101353 +-2.906500 -5.103500 74.561748 +-1.200300 -4.249700 72.479847 +3.349200 -4.039200 73.014601 +3.784100 -5.264100 71.457053 +3.755100 -5.135100 73.027551 +1.703800 -4.023800 73.006901 +1.724800 -4.194800 71.992400 +0.728000 -4.668000 76.129004 +-1.398100 -6.191900 79.785953 +1.302400 -4.142400 75.636199 +0.616200 -5.796200 76.138104 +1.033800 -5.393800 76.666900 +0.773000 -5.513000 78.736502 +2.573000 -4.103000 75.111503 +2.523700 -4.603700 75.086853 +3.848400 -4.078400 75.099203 +0.352600 -5.902600 75.101303 +14.779300 -13.719300 108.399652 +14.169000 -13.929000 108.374502 +14.034200 -12.924200 108.887098 +13.809100 -14.669100 109.939549 +15.374200 -15.574200 111.992101 +14.246600 -14.726600 110.453303 +14.163200 -15.183200 109.926599 +17.995099 -14.645100 116.172547 +18.727100 -12.777100 116.718551 +5.203500 -14.453500 102.116754 +-7.577200 -12.942800 101.621399 +-12.417200 -14.212800 102.121404 +-10.189200 -13.710800 101.630399 +-12.684800 -12.595200 100.592598 +-18.994600 3.034600 100.077702 +17.938500 1.271500 102.139254 +18.172200 1.587800 103.676101 +20.542300 8.107700 112.536148 +-8.325600 8.975600 60.522201 +12.273400 11.316600 74.556698 +11.399500 10.250500 69.889748 +20.038900 15.501100 106.809446 +19.741400 12.578600 109.395702 +21.220699 13.649300 107.315351 +20.607401 11.942600 110.958700 +21.035200 8.784800 110.982600 +20.700001 9.330000 110.440003 +21.564700 11.035300 113.597348 +21.831000 16.478999 112.030501 +22.718699 15.041300 110.959350 +22.218999 13.341000 110.999500 +21.832900 16.197100 110.431453 +21.624699 13.385300 109.392352 +20.001500 14.638500 109.430752 +20.050601 16.059400 108.890298 +13.800800 8.389200 81.310401 +8.918300 -3.068300 61.594148 +9.239100 -2.609100 62.609549 +24.849800 4.640200 121.359902 +23.048699 12.901300 113.559348 +11.362700 -9.082700 100.551348 +12.453900 -9.783900 105.236949 +8.091000 -10.551000 102.150504 +13.143600 -13.903600 106.286800 +9.834300 -14.154300 108.357152 +11.236900 -14.266900 108.898448 +24.045800 2.204200 119.297900 +21.579900 -1.089900 117.204948 +24.209099 0.660900 121.354552 +-19.920200 -12.139800 96.954899 +-19.705199 -12.014800 96.402402 +-21.253200 -11.796800 96.958399 +-20.864600 -10.305400 94.347701 +-22.000500 12.300500 101.599749 +-1.911700 -1.348300 55.359151 +-2.414800 -1.665200 55.347601 +-1.634800 -0.775200 53.242599 +-0.924200 -0.765800 52.752898 +-4.062100 6.662100 56.903948 +-2.764500 4.794500 55.312751 +-9.752800 -0.927200 60.543601 +-9.007200 1.597200 61.056402 +-4.900900 -3.109100 57.959549 +-3.373400 0.763400 55.833301 +-0.303400 1.973400 53.788299 +6.939600 -0.359600 57.439799 +-0.322800 2.972800 54.818600 +2.601000 -0.291000 50.120500 +5.754300 1.385700 55.862151 +-1.026300 3.766300 55.321851 +8.488900 -3.988900 63.154450 +-8.255500 -9.234500 97.472253 +-8.875700 -9.104300 96.412152 +21.135701 13.684300 106.807846 +-18.171500 12.571500 97.959250 +-16.929101 13.089100 94.845447 +-18.142899 12.772900 93.833546 +-17.440600 12.530600 94.834697 +7.168700 -4.628700 69.389352 +-19.107301 11.067300 98.486347 +-17.802200 11.132200 96.923899 +-10.431200 -0.448800 61.079402 +-10.630100 0.010100 64.709951 +-2.191800 6.771800 57.914099 +-9.452200 4.712200 64.178897 +-10.022000 3.532000 64.679001 +-8.746800 8.916800 62.591599 +-7.065500 8.015500 62.072249 +-8.323400 7.803400 64.193297 +-8.401500 5.931500 64.154247 +-8.958500 7.108500 64.150747 +-7.750500 6.760500 63.154750 +6.902000 -4.952000 73.026001 +9.089200 5.610800 64.199597 +2.031200 -9.061200 93.800596 +0.774000 -9.234000 95.372002 +6.025700 -8.835700 94.357851 +-18.693999 10.284000 99.008001 +-20.413700 5.623700 98.513147 +-21.500199 7.400200 97.984900 +-20.939700 -9.680300 98.505147 +-20.005100 -12.404900 99.522448 +-15.512100 -13.887900 100.568948 +-18.016201 -13.173800 99.001901 +-19.614299 -8.925700 98.487847 +-20.485701 -7.234300 93.302150 +-20.235900 0.045900 97.452053 +-20.594000 -6.066000 98.998001 +-19.252000 -7.988000 97.439003 +-20.366200 -5.503800 94.351901 +-20.729201 -8.130800 95.900398 +-20.545800 -7.314200 94.342101 +-19.504900 -7.225100 96.912549 +-17.878101 0.438100 95.350952 +-21.312100 3.762100 98.488947 +3.354600 -12.344600 99.007301 +4.605200 -13.745200 100.557598 +1.130300 -12.400300 99.520148 +2.467000 -12.477000 102.673500 +2.390500 -11.400500 102.635250 +-4.104200 -10.285800 98.507897 +5.943600 -13.203600 101.626799 +-0.886200 -12.363800 102.676900 +-9.807600 -10.262400 97.451203 +-4.884100 -10.545900 100.052952 +-6.285300 -10.394700 100.042352 +-5.408200 -11.391800 100.050902 +-7.472800 -12.127200 100.053602 +-13.600500 -13.159500 100.569748 +-14.267400 -12.442600 98.996301 +-11.429100 -12.900900 98.500447 +-15.557100 -13.072900 97.436453 +-11.864500 -12.355500 97.432753 +-7.649700 -10.000300 102.125154 +-3.450800 -12.419200 100.079602 +-12.173600 -12.366400 99.018201 +-15.638900 -12.681100 98.995551 +-14.039000 -11.321000 97.995500 +-5.541200 -9.768800 96.949399 +-9.023300 -12.576700 98.513347 +-10.629400 -11.940600 97.460303 +-0.440800 -6.669200 80.829596 +-2.398300 -5.061700 76.140854 +4.359800 -4.659800 73.014901 +-17.483601 -4.606400 92.783203 +-3.060700 -6.689300 75.079653 +-3.945400 -6.184600 74.557298 +-5.946100 -5.913900 75.601949 +-5.400000 -6.040000 77.164997 +3.948800 -4.358800 72.489397 +-1.300700 -4.529300 74.594648 +-1.090000 -4.620000 75.095003 +-0.904500 -4.375500 73.552748 +1.464500 -5.244500 74.042252 +-1.689200 -5.650800 78.205398 +-3.034000 -6.826000 79.267999 +-0.047900 -5.592100 77.176047 +3.118000 -5.058000 75.633999 +14.808100 -12.418100 108.899048 +16.335901 -15.715900 111.507947 +-1.860800 -14.149200 102.634600 +-11.396100 -13.473900 101.091953 +-9.172300 -11.177700 102.153854 +-12.565700 -13.394300 100.567148 +-19.577500 1.877500 100.046252 +8.466200 -9.386200 100.578098 +19.573299 12.556700 109.406652 +21.416699 14.473300 113.053352 +22.896101 13.143900 113.578048 +11.592400 -9.272400 100.581198 +24.156601 5.503400 118.783303 +-19.708999 -12.051000 94.845497 +-21.051500 -9.698500 97.464253 +-21.918201 12.088200 102.130904 +-2.026100 -1.613900 55.831951 +-4.465300 6.075300 57.437349 +-2.882900 5.062900 55.348551 +-3.651000 -2.789000 58.954500 +-5.789400 -0.200600 57.915299 +-0.009000 0.189000 52.235502 +-18.146099 12.766100 96.436952 +-17.815799 13.105800 93.837096 +-5.299400 -5.510600 76.135304 +-4.335300 -4.734700 74.557348 +-6.351800 7.451800 61.064102 +-6.890500 8.200500 61.059752 +-8.940100 7.870100 64.714951 +9.550500 3.949500 63.675250 +8.953900 4.346100 62.631949 +-18.979699 9.259700 99.035151 +-16.512000 -12.938000 99.548998 +-20.079299 -8.850700 98.510347 +5.940500 -12.870500 102.130254 +0.809800 -13.409800 102.639900 +1.534600 -13.684600 100.587298 +9.148800 -14.488800 106.804396 +-9.647300 -11.772700 100.551348 +-8.129600 -12.640400 100.070202 +-13.581900 -11.868100 97.974050 +-3.431600 -12.718400 99.559198 +-16.493100 -12.906900 97.953450 +6.116500 -8.966500 93.318250 +-7.767700 -12.922300 99.541148 +-3.544400 -13.235600 101.092803 +-5.058200 -11.761800 96.940899 +1.882300 -5.152300 73.036151 +1.651600 -4.141600 74.075802 +1.381800 -3.981800 75.095903 +-0.766000 -6.334000 80.806996 +2.533300 -5.673300 74.576648 +-20.022500 1.102500 99.023751 +-20.421800 -0.278200 98.994101 +20.742200 9.897800 108.386102 +20.921700 15.538300 106.790846 +10.002500 -14.412500 108.351252 +-20.510999 -12.299000 94.854497 +-3.427100 4.807100 55.851451 +-4.795400 8.915400 60.512301 +-5.921800 8.331800 62.104099 +-17.686700 -12.443300 98.996651 +6.241100 -12.721100 103.705551 +1.394800 -13.844800 102.667400 +-4.408600 -13.111400 101.095703 +-4.308600 -13.251400 101.590699 +-4.643600 -12.316400 97.958200 +1.869400 -4.909400 74.054702 +20.499800 9.810200 108.359902 +19.769800 9.660200 108.369902 +20.653601 9.906400 109.941799 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom384.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom384.pts new file mode 100644 index 000000000000..36c8cf42d385 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/thom384.pts @@ -0,0 +1,384 @@ +383 +27.850301 -17.970299 134.875148 +-30.421501 -21.008499 144.254249 +0.114400 -1.784400 50.132200 +-18.264400 12.484400 101.627799 +17.396600 -1.906600 99.023301 +21.063600 -19.043600 132.826796 +29.463299 -5.123300 142.671651 +28.427000 -18.197000 149.973500 +20.364199 6.405800 114.632099 +14.811500 -9.141500 105.235749 +19.542701 -11.952700 123.446353 +-15.004000 -8.116000 98.497997 +-10.693900 -4.016100 58.998050 +-24.134400 11.784400 107.332801 +-23.475999 8.946000 104.191998 +-4.457700 9.027700 56.901148 +16.912700 15.277300 98.476347 +12.924100 12.075900 77.677051 +-21.715099 6.515100 96.397452 +10.053100 -2.053100 61.576548 +8.974900 -5.644900 68.852447 +8.249500 -14.839500 101.639749 +29.422501 -20.732500 142.186247 +27.104600 -21.824600 149.962300 +31.013999 -2.164000 149.977000 +27.157400 -17.317400 149.988700 +30.981799 -14.521800 149.960900 +31.027899 -19.127900 149.983950 +20.507200 17.852800 112.518598 +21.309300 -12.729300 134.384644 +19.385099 -11.085100 123.957550 +22.975500 -13.585500 143.232755 +14.246800 -7.776800 92.238399 +15.299200 -12.349200 106.839596 +-20.686101 6.686100 104.721952 +10.410300 -14.950300 109.945149 +-0.572800 -12.837200 104.743602 +9.430900 -11.520900 105.765453 +22.088301 -9.988300 120.869147 +18.696699 -9.706700 114.113353 +20.051600 -15.941601 125.510798 +17.014300 -12.824300 114.637149 +25.541301 -12.251300 134.885648 +22.033800 -2.333800 121.891898 +-18.289400 -7.380600 96.930299 +-21.954500 4.094500 101.622749 +-19.513600 4.613600 100.078202 +-20.256000 10.436000 98.992001 +-13.608300 -11.011700 97.960850 +-2.165500 -7.894500 80.802246 +-2.200600 2.110600 56.369702 +14.424000 10.726000 88.107003 +-17.650600 6.960600 97.964700 +-16.106900 1.746900 89.671550 +3.865300 -3.635300 75.612649 +3.290200 -2.310200 69.370102 +-16.555599 8.445600 91.712202 +-7.549400 1.549400 62.095299 +7.074300 -4.804300 73.542148 +10.674700 -9.114700 102.117354 +6.940000 -9.100000 95.914998 +-20.917200 -9.272800 92.751403 +-4.043800 -2.546200 51.163101 +-15.706300 -13.303700 92.791853 +-22.591499 15.911500 100.584248 +-15.927600 14.587600 91.711202 +3.550800 8.709200 54.815400 +-19.986700 12.906700 96.921649 +-11.174600 7.344600 64.152697 +5.729900 -1.889900 53.249949 +7.298300 1.991700 57.419149 +17.288300 -16.248301 111.504147 +11.139900 -5.079900 66.779953 +9.299900 -4.059900 60.559951 +23.049200 11.560800 111.494597 +24.139500 4.980500 116.704751 +29.687400 -21.817400 149.958700 +22.317100 -19.487100 141.113554 +23.782200 -13.892200 146.856105 +28.643601 -7.063600 145.816796 +-19.830300 13.350300 103.164847 +19.028700 14.271300 109.414352 +28.074900 -4.714900 140.597449 +22.833101 4.646900 119.306550 +22.090100 5.439900 116.685051 +22.567500 9.082500 114.078753 +20.163701 14.096300 113.586848 +20.742100 -11.562100 131.231049 +21.981901 -17.111900 134.370944 +25.385999 -12.786000 140.117995 +24.287300 -11.777300 136.968650 +27.245601 -13.955600 143.737795 +27.890600 -16.050599 147.355294 +21.251200 -8.951200 115.150604 +12.877700 -11.097700 103.713851 +-18.707900 5.677900 101.101053 +12.688800 -9.448800 105.264399 +-11.035400 -9.444600 102.652300 +-14.368000 -10.892000 101.091003 +-1.861500 -14.028500 102.634250 +-13.923300 -12.566700 98.998351 +12.485200 -11.985200 105.252599 +11.048700 -13.378700 106.834346 +15.585200 -10.855200 108.912598 +16.027501 -12.237500 112.513748 +14.253200 -14.333200 110.456603 +16.070500 -14.640500 114.080253 +17.983100 -12.533100 114.631549 +6.535600 -13.215600 105.777803 +21.772400 1.057600 117.201198 +22.093599 -4.353600 119.821796 +12.941200 -11.261200 110.465603 +8.894700 -11.624700 107.357351 +19.696600 0.693400 108.898298 +21.726600 6.443400 112.543298 +18.646500 -13.406500 116.678251 +21.180000 -14.900000 129.675001 +24.322701 -5.942700 126.056352 +20.577200 -13.737200 125.553598 +23.806999 -11.367000 134.358494 +21.780000 -11.330000 131.770003 +23.553400 -3.403400 121.911698 +-18.976199 -4.463800 99.036901 +-18.976499 -2.053500 99.036751 +-20.277900 -7.612100 97.431053 +-20.563300 -1.986700 97.458353 +-21.594099 7.434100 103.177947 +-20.604900 6.144900 101.112553 +-19.292400 9.542400 100.588798 +-22.819500 11.419500 103.675251 +-21.773300 11.133300 102.113354 +-16.047000 -8.803000 98.486497 +-17.838200 -12.431800 97.955900 +-18.931901 -9.888100 98.489047 +-2.144400 1.054400 53.792799 +-4.323100 1.703100 55.838451 +1.430600 -2.270600 61.570298 +-2.026100 -1.613900 55.831951 +2.131900 -1.761900 54.815950 +-0.320800 -1.229200 52.214602 +6.954800 -1.014800 57.937399 +4.719600 1.400400 55.329801 +-6.380700 2.000700 58.964650 +1.736200 -5.286200 72.513097 +5.514400 -4.744400 71.962200 +3.504500 -4.074500 74.042252 +-0.940300 5.240300 57.939849 +0.447400 8.312600 61.558698 +7.754600 1.155400 61.057302 +7.038400 3.821600 60.524201 +-18.130300 12.180300 96.929849 +0.591600 -4.271600 79.750803 +-16.671001 -7.499000 95.374502 +-17.649101 -4.930900 92.780453 +-14.640000 -9.350000 96.914999 +-9.162100 -7.997900 88.098953 +-15.918000 -6.132000 86.515998 +-19.701600 12.661600 100.069202 +-20.835200 13.045200 96.912399 +-18.631699 13.451700 92.279149 +-18.708099 7.788100 96.405952 +-7.977300 3.337300 60.541351 +-10.023200 0.453200 62.598399 +-7.388900 -3.921100 68.870547 +-3.846100 -3.533900 69.391952 +0.788000 -3.358000 76.674000 +-2.012200 -3.767800 75.083903 +-7.760200 6.150200 62.099899 +-9.870600 7.370600 66.764703 +-11.900100 5.990100 72.514947 +3.315700 -5.645700 77.702851 +-0.920200 -10.459800 101.614899 +-1.343500 -7.016500 82.893248 +6.011700 -11.191700 100.565848 +7.105100 -12.185100 103.692551 +-10.273400 -10.216600 99.028301 +-11.712200 -9.327800 96.408902 +-8.960200 -11.809800 97.454903 +3.113900 -12.953900 100.591948 +3.243300 -10.013300 101.081653 +-20.770601 -11.609400 92.244699 +-19.028101 -12.051900 90.675951 +-20.208101 13.128100 90.710951 +-9.834500 10.214500 64.157747 +4.486300 2.443700 51.688151 +9.673400 0.846600 60.536701 +9.712600 8.327400 65.196298 +13.512100 -4.832100 74.061052 +12.061000 -4.051000 66.245499 +22.982500 17.437500 112.026251 +23.673800 14.956200 114.606899 +20.499800 9.810200 108.359902 +21.161500 11.518500 111.515747 +22.374501 15.865500 108.362252 +24.998800 -17.598800 145.279407 +26.518900 -9.998900 142.679451 +27.565800 -12.355800 145.307907 +24.669799 -12.679800 143.214905 +23.095200 -1.885200 121.892598 +24.370300 1.799700 121.900148 +21.694800 8.405200 114.607399 +24.475301 -14.645300 142.167647 +23.101000 -12.941000 136.965500 +23.011600 -11.721600 136.445796 +11.249500 -10.039500 102.144754 +11.478300 -9.638300 105.789153 +-12.076300 -11.093700 102.666850 +-10.158400 -11.291600 100.555798 +-14.430500 -13.689500 100.589748 +-11.942100 -12.587900 101.628949 +4.210800 -13.780800 102.150404 +11.627100 -10.087100 103.713551 +13.965000 -12.725000 108.367502 +13.494400 -10.934400 107.342201 +11.087800 -11.727800 107.343901 +17.523701 -10.653700 114.596849 +15.976999 -14.507000 112.003501 +22.654100 0.555900 117.237048 +21.217500 1.302500 117.223748 +10.458900 -12.888900 110.959450 +20.789201 -3.569200 115.119604 +12.419000 -14.169000 106.289500 +26.735001 -12.275000 134.897498 +23.753101 -11.153100 131.261549 +25.044499 -9.814500 134.397244 +-15.024300 -9.735700 103.167847 +-18.943901 -9.896100 101.638049 +-19.183900 -0.826100 97.473053 +-21.081500 4.011500 100.074252 +-21.030300 -7.229700 97.474853 +-20.216900 -5.253100 99.011551 +-20.370299 9.710300 100.569848 +-18.827300 4.747300 101.606349 +-17.820599 -13.119400 96.429702 +-19.615700 -11.634300 96.937149 +-17.897401 -11.592600 99.541298 +-4.505300 -1.134700 55.352351 +-3.076800 -0.133200 54.281600 +-1.984000 -0.956000 53.782999 +-1.971800 5.601800 55.859101 +4.345700 1.744300 56.382852 +4.337700 0.212300 53.788849 +-5.845100 -0.054900 57.392449 +-2.207900 2.327900 56.896048 +-4.803200 5.673200 58.448400 +-3.315500 7.895500 58.437250 +-4.058200 3.998200 57.390899 +-2.918700 2.268700 55.330651 +1.922000 -4.172000 72.991001 +8.036200 6.673800 64.173097 +9.331000 0.699000 62.070499 +15.177400 9.722600 87.078702 +-15.047600 -11.302400 96.401202 +-18.230100 -10.259900 96.959949 +-19.210901 -7.459100 95.914548 +-20.057501 -6.162500 95.906248 +-14.785000 9.135000 81.832497 +-6.880700 -4.639300 67.304650 +0.504400 -5.664400 76.667200 +-9.644500 3.944500 63.637750 +-5.252100 8.492100 60.543951 +-8.323400 7.803400 64.193297 +-7.812700 5.902700 64.168647 +12.889700 -9.189700 101.594849 +-8.747400 -8.232600 93.291300 +-8.437700 -9.452300 99.006151 +4.299700 -11.999700 101.089853 +-13.059600 -9.500400 97.980200 +-4.751400 -11.228600 101.629299 +-5.702600 -11.687400 100.078702 +-0.019300 -11.130700 99.550348 +-1.125500 -12.214500 101.077253 +1.704500 -9.164500 92.257249 +-8.743600 -12.276400 95.388202 +-6.535000 -12.745000 98.482497 +-0.395100 -12.694900 102.657450 +8.012100 -6.662100 76.156054 +5.773300 -7.943300 83.946649 +-13.410600 -8.179400 97.974700 +2.629100 -10.759100 104.719552 +17.136201 12.023800 100.573098 +18.969300 1.950700 106.829646 +18.233000 12.227000 105.786503 +19.635699 9.214300 108.397852 +-19.567501 14.097500 89.146254 +-10.928400 9.608400 64.670801 +4.128600 -1.358600 51.189301 +23.612199 17.337800 114.111103 +22.350301 12.439700 113.035152 +20.050601 16.059400 108.890298 +25.622900 -14.602900 141.656443 +13.433900 -12.663900 105.271949 +14.446700 -13.526700 106.293350 +-12.458200 -10.991800 104.215898 +-7.977000 -12.133000 102.136504 +-10.337200 -11.122800 98.996401 +8.685300 -12.285300 103.677651 +11.915700 -12.805700 110.432853 +15.323500 -12.373500 108.876748 +21.036700 2.813300 115.143354 +20.474001 -10.874000 126.566998 +-15.678100 -9.831900 101.605949 +-18.537900 -9.082100 100.051052 +-19.415301 0.275300 95.892348 +-20.074500 -1.855500 98.997751 +-20.657700 -11.132300 96.921149 +-16.127301 -11.362700 102.676350 +-4.404800 -1.805200 55.352601 +3.603800 0.256200 52.236902 +-1.456500 2.376500 55.346751 +-6.989300 -0.650700 59.515350 +-3.508500 6.938500 57.420749 +13.405600 2.894400 79.752803 +5.013300 -5.403300 77.176647 +-16.463399 -12.186600 95.398302 +-17.237900 -8.492100 96.956049 +-15.187700 -11.322300 99.526148 +-19.380301 -9.519700 94.354851 +-17.254100 -10.525900 93.792946 +-10.367600 -8.342400 93.286200 +-18.943799 -7.526200 94.333101 +-18.886901 -5.823100 95.911548 +-18.345499 13.475500 90.702251 +0.806700 -5.676700 77.718351 +1.046900 -4.706900 77.708451 +-9.061500 5.131500 65.209248 +-11.407800 7.057800 72.511097 +-4.013600 -10.796400 100.058202 +3.416100 -12.676100 104.238048 +2.260000 -12.440000 102.655000 +7.753900 -12.673900 102.156954 +9.956900 -9.976900 102.113454 +7.505000 -11.235000 104.212498 +5.119000 -10.599000 102.669500 +-3.021400 -11.178600 103.199297 +-8.721000 -11.079000 99.034501 +-5.856500 -11.553500 98.481747 +3.042600 -10.732600 99.536298 +1.399600 -11.809600 101.119803 +-8.425600 8.965600 60.527201 +2.854500 -0.104500 50.117250 +20.102601 14.287400 110.996300 +20.071300 15.338700 106.825646 +25.300099 -13.550100 140.075045 +-14.544200 -10.735800 102.672900 +8.899800 -11.309800 103.694901 +8.373500 -13.593500 103.701751 +14.957000 -13.707000 108.393502 +-14.790800 -10.369200 100.579598 +-19.526100 -0.693900 99.016951 +-19.891100 1.501100 99.004451 +-20.159900 -11.180100 95.360052 +-19.838100 -11.101900 93.795946 +3.044600 0.755400 51.682301 +3.687800 1.442200 52.738898 +-6.885100 -3.294900 61.557448 +-6.215400 1.495400 59.492300 +-17.352500 -7.377500 94.313751 +-16.239999 -6.860000 91.224998 +-20.576800 0.046800 95.891598 +-18.031599 5.911600 96.409202 +-16.499700 13.289700 90.685151 +-9.316800 8.566800 63.131600 +-6.187100 -10.722900 98.486447 +3.329400 -10.959400 102.659700 +-9.227300 -10.502700 100.586348 +-5.203100 -11.776900 96.948449 +2.934500 -1.344500 50.157250 +21.912201 13.157800 111.506097 +-17.928601 0.158600 95.890698 +-17.785900 3.815900 96.932049 +-20.299200 3.889200 98.485397 +4.120400 0.749600 54.270200 +-17.981600 -6.818400 94.324201 +-19.942101 -5.897900 94.318951 +-18.396400 7.436400 94.846797 +-9.592500 7.612500 63.663750 +21.840700 14.839300 110.435353 +-20.119800 2.629800 96.935099 +21.831000 16.478999 112.030501 +20.249299 14.330700 108.894648 +21.416699 14.473300 113.053352 +21.707799 13.162200 109.433902 diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/data/torus_ran.pts b/Alpha_shapes_3/demo/Alpha_shapes_3/data/torus_ran.pts new file mode 100644 index 000000000000..0ee8d1f9dec2 --- /dev/null +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/data/torus_ran.pts @@ -0,0 +1,500 @@ +500 +231.000000 182.000000 0.000351 +14.000000 115.000000 -15.999829 +71.000000 94.000000 31.999592 +68.000000 54.000000 47.999560 +207.000000 119.000000 31.999602 +108.000000 241.000000 -31.999965 +36.000000 131.000000 -31.999798 +61.000000 79.000000 -16.000061 +158.000000 29.000000 47.999573 +171.000000 20.000000 32.000102 +80.000000 21.000000 15.999613 +208.000000 209.000000 -32.000094 +72.000000 154.000000 -0.000168 +130.000000 195.000000 0.000267 +159.000000 185.000000 0.000415 +165.000000 172.000000 -15.999620 +189.000000 138.000000 -16.000149 +180.000000 211.000000 -48.000257 +152.000000 182.000000 -32.000245 +196.000000 216.000000 -0.000361 +171.000000 63.000000 47.999650 +8.000000 118.000000 -0.000377 +167.000000 228.000000 0.000447 +149.000000 64.000000 -0.000335 +26.000000 166.000000 -31.999897 +62.000000 132.000000 15.999507 +129.000000 244.000000 -15.999563 +223.000000 57.000000 15.999837 +142.000000 25.000000 47.999532 +119.000000 12.000000 15.999691 +51.000000 213.000000 -32.000051 +67.000000 59.000000 47.999558 +244.000000 118.000000 16.000059 +229.000000 186.000000 0.000022 +151.000000 232.000000 0.000274 +177.000000 166.000000 -0.000265 +139.000000 71.000000 16.000400 +201.000000 184.000000 16.000257 +149.000000 26.000000 47.999937 +144.000000 184.000000 -32.000347 +212.000000 44.000000 16.000372 +122.000000 243.000000 -32.000271 +63.000000 226.000000 -15.999717 +14.000000 92.000000 -0.000228 +79.000000 191.000000 -48.000345 +168.000000 174.000000 -31.999750 +94.000000 239.000000 -15.999957 +128.000000 196.000000 -0.000407 +10.000000 151.000000 -0.000198 +28.000000 63.000000 16.000490 +50.000000 217.000000 -15.999698 +147.000000 242.000000 -16.000115 +11.000000 139.000000 -16.000482 +208.000000 183.000000 16.000006 +153.000000 28.000000 47.999911 +63.000000 29.000000 15.999721 +18.000000 173.000000 0.000064 +80.000000 86.000000 31.999967 +214.000000 131.000000 -31.999614 +25.000000 164.000000 -32.000292 +18.000000 81.000000 15.999688 +174.000000 164.000000 -15.999519 +112.000000 58.000000 48.000316 +221.000000 196.000000 0.000020 +87.000000 228.000000 0.000271 +85.000000 82.000000 31.999577 +136.000000 185.000000 -31.999946 +139.000000 12.000000 15.999814 +207.000000 136.000000 -31.999751 +243.000000 127.000000 -16.000406 +238.000000 83.000000 16.000043 +236.000000 175.000000 0.000133 +59.000000 39.000000 -0.000173 +138.000000 58.000000 48.000435 +63.000000 125.000000 -15.999958 +148.000000 59.000000 47.999763 +11.000000 116.000000 16.000295 +12.000000 104.000000 16.000059 +99.000000 195.000000 -47.999545 +176.000000 168.000000 -32.000485 +97.000000 186.000000 -0.000049 +26.000000 69.000000 0.000408 +67.000000 196.000000 -48.000408 +197.000000 73.000000 -15.999752 +180.000000 99.000000 15.999739 +246.000000 145.000000 0.000341 +54.000000 184.000000 15.999968 +194.000000 78.000000 -15.999879 +16.000000 144.000000 15.999772 +100.000000 28.000000 47.999568 +26.000000 108.000000 32.000427 +188.000000 58.000000 48.000056 +104.000000 23.000000 0.000019 +186.000000 193.000000 -47.999712 +242.000000 100.000000 16.000407 +139.000000 12.000000 31.999602 +229.000000 168.000000 -31.999564 +96.000000 230.000000 -0.000241 +144.000000 71.000000 31.999954 +139.000000 184.000000 -16.000332 +158.000000 226.000000 -48.000437 +54.000000 143.000000 -31.999968 +241.000000 163.000000 -0.000375 +110.000000 59.000000 47.999725 +88.000000 27.000000 0.000264 +159.000000 25.000000 0.000204 +228.000000 68.000000 0.000450 +53.000000 114.000000 31.999861 +76.000000 22.000000 16.000012 +238.000000 172.000000 -16.000306 +27.000000 174.000000 -32.000074 +71.000000 64.000000 48.000089 +58.000000 73.000000 -16.000054 +226.000000 75.000000 31.999956 +64.000000 224.000000 -32.000409 +219.000000 79.000000 -16.000015 +171.000000 219.000000 -48.000443 +17.000000 149.000000 15.999620 +85.000000 219.000000 -47.999948 +139.000000 243.000000 -31.999927 +64.000000 132.000000 -15.999923 +133.000000 60.000000 0.000370 +141.000000 13.000000 32.000016 +144.000000 193.000000 0.000487 +29.000000 77.000000 32.000389 +186.000000 227.000000 -31.999584 +51.000000 211.000000 -0.000140 +100.000000 67.000000 -0.000192 +153.000000 240.000000 -31.999932 +184.000000 64.000000 48.000329 +118.000000 233.000000 0.000081 +37.000000 196.000000 -32.000450 +196.000000 35.000000 32.000130 +43.000000 51.000000 32.000190 +97.000000 61.000000 47.999902 +18.000000 174.000000 -15.999889 +54.000000 112.000000 32.000389 +244.000000 102.000000 -0.000141 +26.000000 89.000000 31.999633 +183.000000 101.000000 -0.000397 +190.000000 155.000000 -32.000059 +141.000000 61.000000 -0.000261 +122.000000 69.000000 31.999905 +159.000000 239.000000 -31.999703 +180.000000 156.000000 -16.000295 +122.000000 186.000000 -32.000017 +159.000000 16.000000 31.999811 +111.000000 62.000000 0.000081 +30.000000 73.000000 32.000406 +40.000000 131.000000 -32.000022 +185.000000 50.000000 47.999556 +46.000000 121.000000 32.000010 +15.000000 91.000000 15.999817 +139.000000 243.000000 -15.999875 +194.000000 110.000000 -15.999682 +200.000000 221.000000 -16.000194 +146.000000 183.000000 -32.000064 +106.000000 191.000000 0.000436 +182.000000 156.000000 -0.000125 +201.000000 71.000000 -16.000001 +127.000000 59.000000 0.000459 +141.000000 242.000000 -32.000493 +171.000000 235.000000 -31.999615 +61.000000 176.000000 15.999908 +151.000000 14.000000 31.999740 +121.000000 185.000000 -16.000410 +9.000000 110.000000 -0.000308 +36.000000 124.000000 31.999681 +162.000000 16.000000 16.000300 +80.000000 234.000000 -16.000029 +15.000000 164.000000 -15.999884 +208.000000 72.000000 -16.000103 +67.000000 114.000000 15.999868 +120.000000 60.000000 0.000358 +153.000000 24.000000 -0.000315 +167.000000 77.000000 0.000084 +88.000000 178.000000 -0.000296 +178.000000 88.000000 31.999579 +75.000000 99.000000 16.000467 +151.000000 241.000000 -31.999550 +47.000000 183.000000 15.999840 +151.000000 180.000000 -15.999625 +112.000000 230.000000 -47.999580 +152.000000 60.000000 47.999920 +145.000000 183.000000 -15.999679 +62.000000 123.000000 -16.000320 +228.000000 142.000000 -32.000272 +106.000000 232.000000 0.000122 +89.000000 33.000000 48.000060 +118.000000 231.000000 -48.000438 +162.000000 239.000000 -15.999565 +196.000000 220.000000 -31.999656 +189.000000 117.000000 15.999870 +73.000000 46.000000 48.000414 +193.000000 37.000000 0.000188 +187.000000 221.000000 0.000304 +61.000000 140.000000 15.999972 +115.000000 184.000000 -15.999817 +153.000000 231.000000 -0.000374 +46.000000 134.000000 -31.999890 +68.000000 201.000000 -47.999923 +217.000000 55.000000 -0.000048 +200.000000 34.000000 16.000119 +152.000000 195.000000 -48.000153 +146.000000 72.000000 32.000142 +105.000000 242.000000 -15.999819 +158.000000 69.000000 0.000177 +145.000000 72.000000 15.999652 +103.000000 73.000000 32.000330 +246.000000 112.000000 -0.000307 +243.000000 128.000000 16.000331 +46.000000 48.000000 0.000354 +99.000000 15.000000 31.999993 +96.000000 70.000000 0.000313 +192.000000 129.000000 15.999724 +171.000000 36.000000 48.000142 +56.000000 41.000000 -0.000237 +87.000000 236.000000 -32.000264 +110.000000 242.000000 -32.000440 +90.000000 26.000000 0.000233 +219.000000 176.000000 16.000414 +196.000000 32.000000 15.999647 +225.000000 119.000000 31.999763 +168.000000 81.000000 31.999513 +103.000000 182.000000 -31.999641 +28.000000 192.000000 -16.000020 +225.000000 136.000000 -32.000475 +62.000000 117.000000 -15.999916 +58.000000 182.000000 16.000479 +94.000000 71.000000 0.000277 +210.000000 43.000000 16.000458 +238.000000 86.000000 -0.000143 +186.000000 28.000000 32.000422 +208.000000 46.000000 32.000427 +99.000000 60.000000 47.999544 +85.000000 36.000000 47.999560 +14.000000 140.000000 16.000064 +174.000000 91.000000 16.000080 +72.000000 33.000000 0.000351 +230.000000 95.000000 31.999702 +153.000000 15.000000 31.999736 +180.000000 44.000000 48.000142 +147.000000 13.000000 16.000173 +168.000000 27.000000 0.000135 +16.000000 168.000000 -16.000330 +12.000000 98.000000 0.000077 +84.000000 88.000000 15.999770 +175.000000 162.000000 -15.999729 +122.000000 12.000000 31.999587 +194.000000 145.000000 16.000214 +245.000000 104.000000 0.000096 +38.000000 50.000000 16.000261 +102.000000 231.000000 -0.000273 +120.000000 70.000000 32.000247 +103.000000 241.000000 -15.999562 +24.000000 73.000000 0.000059 +153.000000 241.000000 -16.000022 +80.000000 29.000000 -0.000425 +73.000000 223.000000 0.000246 +25.000000 91.000000 -15.999716 +110.000000 13.000000 31.999612 +142.000000 230.000000 -47.999894 +23.000000 185.000000 -16.000220 +226.000000 180.000000 -31.999881 +230.000000 105.000000 32.000364 +80.000000 169.000000 -31.999656 +219.000000 203.000000 -16.000266 +69.000000 142.000000 -0.000292 +33.000000 61.000000 0.000446 +66.000000 119.000000 15.999737 +29.000000 178.000000 -31.999839 +122.000000 195.000000 0.000250 +95.000000 79.000000 15.999537 +53.000000 141.000000 -32.000021 +228.000000 113.000000 31.999506 +110.000000 196.000000 -48.000009 +84.000000 167.000000 -16.000145 +221.000000 123.000000 32.000377 +192.000000 126.000000 -16.000016 +163.000000 237.000000 -32.000336 +107.000000 73.000000 15.999636 +30.000000 59.000000 15.999555 +143.000000 233.000000 -0.000014 +76.000000 233.000000 -16.000291 +140.000000 24.000000 48.000373 +13.000000 122.000000 -16.000396 +119.000000 243.000000 -15.999928 +219.000000 52.000000 15.999516 +39.000000 207.000000 -16.000205 +11.000000 153.000000 0.000400 +153.000000 227.000000 -47.999632 +197.000000 182.000000 15.999689 +96.000000 15.000000 16.000408 +189.000000 27.000000 16.000370 +85.000000 173.000000 -32.000317 +137.000000 185.000000 -15.999535 +186.000000 113.000000 0.000316 +47.000000 72.000000 -16.000307 +26.000000 147.000000 -31.999760 +34.000000 59.000000 0.000272 +184.000000 191.000000 -47.999729 +135.000000 195.000000 0.000041 +137.000000 22.000000 0.000252 +137.000000 70.000000 16.000342 +25.000000 164.000000 16.000081 +241.000000 162.000000 -16.000253 +25.000000 91.000000 31.999907 +204.000000 44.000000 -0.000409 +110.000000 184.000000 -32.000070 +71.000000 191.000000 -47.999714 +186.000000 141.000000 -0.000049 +112.000000 22.000000 -0.000413 +27.000000 187.000000 -0.000197 +28.000000 139.000000 -31.999749 +155.000000 76.000000 16.000041 +31.000000 135.000000 -31.999815 +99.000000 240.000000 -32.000440 +218.000000 59.000000 32.000098 +240.000000 164.000000 -16.000179 +186.000000 62.000000 48.000381 +193.000000 120.000000 -15.999543 +87.000000 19.000000 32.000031 +185.000000 148.000000 -0.000396 +187.000000 139.000000 -0.000262 +194.000000 177.000000 15.999986 +13.000000 133.000000 15.999525 +217.000000 131.000000 -32.000238 +73.000000 229.000000 -31.999844 +218.000000 196.000000 -31.999779 +62.000000 218.000000 -0.000483 +131.000000 12.000000 16.000284 +68.000000 136.000000 -0.000446 +14.000000 94.000000 16.000185 +112.000000 197.000000 -48.000241 +223.000000 198.000000 -15.999801 +71.000000 161.000000 -32.000219 +86.000000 18.000000 16.000351 +100.000000 227.000000 -47.999777 +17.000000 169.000000 -0.000308 +118.000000 24.000000 47.999953 +190.000000 100.000000 31.999686 +72.000000 103.000000 0.000019 +214.000000 124.000000 32.000046 +221.000000 132.000000 -32.000248 +81.000000 217.000000 -48.000242 +54.000000 71.000000 -16.000327 +14.000000 161.000000 -16.000004 +64.000000 31.000000 31.999705 +196.000000 223.000000 -16.000117 +114.000000 194.000000 0.000448 +239.000000 109.000000 -15.999611 +242.000000 155.000000 -15.999961 +62.000000 138.000000 15.999829 +155.000000 188.000000 -0.000170 +12.000000 131.000000 15.999532 +230.000000 150.000000 -31.999836 +12.000000 124.000000 -15.999937 +244.000000 137.000000 -15.999895 +38.000000 200.000000 0.000110 +175.000000 93.000000 16.000389 +40.000000 124.000000 32.000203 +129.000000 11.000000 15.999840 +39.000000 48.000000 16.000091 +23.000000 70.000000 15.999560 +89.000000 222.000000 -47.999557 +73.000000 26.000000 31.999999 +242.000000 94.000000 -0.000065 +229.000000 148.000000 -32.000276 +86.000000 237.000000 -15.999800 +229.000000 190.000000 -15.999638 +115.000000 71.000000 15.999835 +180.000000 95.000000 -0.000262 +247.000000 137.000000 0.000076 +130.000000 69.000000 31.999978 +38.000000 205.000000 -15.999885 +95.000000 238.000000 -31.999829 +155.000000 179.000000 -16.000164 +25.000000 153.000000 -32.000133 +17.000000 106.000000 -15.999715 +178.000000 167.000000 -31.999967 +209.000000 207.000000 -0.000472 +68.000000 34.000000 0.000071 +239.000000 146.000000 15.999682 +81.000000 38.000000 47.999976 +110.000000 23.000000 -0.000396 +27.000000 81.000000 31.999842 +136.000000 70.000000 32.000427 +145.000000 232.000000 0.000270 +140.000000 231.000000 -47.999598 +148.000000 196.000000 -48.000069 +16.000000 111.000000 -16.000408 +108.000000 14.000000 31.999518 +240.000000 91.000000 16.000149 +230.000000 160.000000 -32.000275 +64.000000 123.000000 15.999728 +16.000000 87.000000 15.999844 +8.000000 141.000000 0.000100 +222.000000 194.000000 -0.000178 +160.000000 61.000000 48.000409 +174.000000 20.000000 15.999672 +171.000000 174.000000 0.000162 +84.000000 81.000000 -0.000264 +151.000000 75.000000 15.999741 +36.000000 79.000000 -16.000373 +163.000000 18.000000 31.999651 +68.000000 116.000000 -0.000288 +185.000000 205.000000 -48.000148 +193.000000 135.000000 16.000057 +187.000000 119.000000 0.000122 +19.000000 80.000000 0.000444 +173.000000 64.000000 47.999899 +237.000000 82.000000 0.000371 +212.000000 211.000000 -15.999928 +229.000000 87.000000 31.999870 +69.000000 114.000000 0.000236 +97.000000 194.000000 -48.000360 +36.000000 176.000000 15.999577 +55.000000 213.000000 -0.000157 +189.000000 228.000000 -15.999840 +110.000000 192.000000 -0.000275 +174.000000 235.000000 -15.999655 +73.000000 99.000000 -0.000327 +28.000000 116.000000 31.999974 +229.000000 107.000000 31.999858 +153.000000 14.000000 15.999576 +103.000000 14.000000 16.000290 +130.000000 186.000000 -31.999906 +162.000000 62.000000 48.000005 +75.000000 160.000000 0.000127 +13.000000 161.000000 -0.000169 +183.000000 222.000000 -0.000352 +107.000000 182.000000 -15.999640 +105.000000 13.000000 15.999856 +50.000000 38.000000 16.000248 +175.000000 86.000000 0.000015 +30.000000 196.000000 -15.999867 +51.000000 42.000000 31.999990 +241.000000 93.000000 15.999799 +131.000000 243.000000 -16.000487 +243.000000 102.000000 15.999527 +30.000000 182.000000 -32.000239 +120.000000 185.000000 -31.999833 +66.000000 136.000000 -16.000264 +200.000000 42.000000 -0.000351 +25.000000 102.000000 32.000231 +176.000000 87.000000 32.000019 +160.000000 194.000000 -47.999614 +96.000000 240.000000 -16.000345 +230.000000 91.000000 -15.999643 +243.000000 157.000000 -0.000306 +243.000000 153.000000 -16.000310 +217.000000 124.000000 32.000136 +188.000000 197.000000 -47.999767 +121.000000 70.000000 15.999790 +242.000000 134.000000 16.000201 +165.000000 229.000000 -0.000410 +102.000000 24.000000 -0.000139 +230.000000 164.000000 16.000285 +182.000000 32.000000 0.000135 +247.000000 114.000000 -0.000002 +43.000000 204.000000 -32.000367 +210.000000 212.000000 -15.999682 +37.000000 59.000000 32.000195 +94.000000 16.000000 15.999830 +112.000000 25.000000 48.000203 +95.000000 17.000000 31.999534 +171.000000 192.000000 -48.000241 +125.000000 60.000000 0.000292 +12.000000 151.000000 -15.999890 +162.000000 193.000000 -48.000247 +161.000000 184.000000 0.000343 +70.000000 107.000000 -0.000360 +31.000000 120.000000 32.000491 +73.000000 209.000000 -47.999995 +106.000000 73.000000 31.999769 +145.000000 63.000000 -0.000340 +183.000000 152.000000 0.000134 +138.000000 197.000000 -47.999966 +106.000000 182.000000 -32.000377 +95.000000 176.000000 -15.999590 +61.000000 115.000000 -16.000234 +80.000000 169.000000 0.000431 +149.000000 23.000000 0.000338 +242.000000 121.000000 -16.000055 +63.000000 130.000000 16.000208 +229.000000 65.000000 15.999791 +152.000000 73.000000 31.999837 +9.000000 143.000000 -0.000190 +13.000000 100.000000 15.999721 +78.000000 89.000000 0.000382 +175.000000 226.000000 -0.000207 +79.000000 64.000000 47.999724 +165.000000 83.000000 15.999635 +173.000000 191.000000 -48.000118 +67.000000 141.000000 -15.999508 +149.000000 229.000000 -48.000104 +75.000000 156.000000 -15.999668 +13.000000 155.000000 -15.999930 +110.000000 71.000000 32.000201 From 3779d21163b3a80f3e1cce95c2f41fb6ff3c58aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 25 Aug 2023 14:36:51 +0200 Subject: [PATCH 0668/1398] doc that the functions depend on Eigen --- .../interpolated_corrected_curvatures.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h index 4b940f157e88..b90d66cbde2e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h @@ -1037,6 +1037,8 @@ class Interpolated_corrected_curvatures_computer * By providing mean, Gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * @@ -1127,6 +1129,8 @@ void interpolated_corrected_curvatures(const PolygonMesh& pmesh, * * computes the interpolated corrected mean curvature across the mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. @@ -1198,6 +1202,8 @@ void interpolated_corrected_mean_curvature(const PolygonMesh& pmesh, * * computes the interpolated corrected Gaussian curvature across the mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` as key type and `GT::FT` as value type. @@ -1268,6 +1274,8 @@ void interpolated_corrected_Gaussian_curvature(const PolygonMesh& pmesh, * * computes the interpolated corrected principal curvatures and directions across the mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam VertexCurvatureMap a model of `WritablePropertyMap` with * `boost::graph_traits::%vertex_descriptor` as key type and @@ -1341,6 +1349,8 @@ void interpolated_corrected_principal_curvatures_and_directions(const PolygonMes * By providing mean, Gaussian and/or principal curvature and direction property maps as named parameters, the user * can choose which quantites to compute. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * @@ -1426,6 +1436,8 @@ void interpolated_corrected_curvatures_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected mean curvature at vertex `v` of mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * @@ -1503,6 +1515,8 @@ interpolated_corrected_mean_curvature_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected Gaussian curvature at vertex `v` of mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * @@ -1580,6 +1594,8 @@ interpolated_corrected_Gaussian_curvature_one_vertex(const PolygonMesh& pmesh, * \ingroup PMP_corrected_curvatures_grp * computes the interpolated corrected principal curvatures and directions at vertex `v` of mesh `pmesh`. * +* \note This function depends on the \eigen 3.1 (or later) library. +* * @tparam PolygonMesh a model of `FaceListGraph`. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters". * From 1db314ee4424a115df56520a15a526ab27cf30b9 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 25 Aug 2023 14:39:38 +0200 Subject: [PATCH 0669/1398] Fixing image filenames in the doxyfile --- .../doc/Polygon_mesh_processing/Doxyfile.in | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in index 8c263a409995..ca887f906691 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in @@ -23,7 +23,40 @@ EXCLUDE_SYMBOLS += experimental HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/selfintersections.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/mesh_smoothing.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png \ - ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png + ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png \ + ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png \ + ${CGAL_PACKAGE_DOC_DIR}/fig/ bimba-dmax0.020000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.020000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.030000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.030000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.040000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.040000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.050000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.050000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.020000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/ bimba-dmin0.020000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.030000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.030000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.040000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.040000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.050000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.050000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.020000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.020000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.030000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.030000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.040000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.040000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.050000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.050000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.030000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.030000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.040000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.040000-0.002000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.050000-0.000000.png\ + ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.050000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/decimate_cheese.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/decimate_colors.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/decimate_rg_joint.png From c16b155d4ee72ef3fd0f44086b84dee79b683269 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 25 Aug 2023 14:39:59 +0200 Subject: [PATCH 0670/1398] Removing old image file. --- Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in index ca887f906691..8afaceb878f4 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in @@ -23,8 +23,6 @@ EXCLUDE_SYMBOLS += experimental HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/selfintersections.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/mesh_smoothing.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png \ - ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png \ - ${CGAL_PACKAGE_DOC_DIR}/fig/icc_diff_radius.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/ bimba-dmax0.020000-0.000000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.020000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.030000-0.000000.png\ From 4b450a594840de692804db70433aa900ed670dca Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 25 Aug 2023 15:12:56 +0200 Subject: [PATCH 0671/1398] Cleaning up not used images --- .../doc/Polygon_mesh_processing/Doxyfile.in | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in index 8afaceb878f4..5cdf93414ac8 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Doxyfile.in @@ -23,30 +23,9 @@ EXCLUDE_SYMBOLS += experimental HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/selfintersections.jpg \ ${CGAL_PACKAGE_DOC_DIR}/fig/mesh_smoothing.png \ ${CGAL_PACKAGE_DOC_DIR}/fig/shape_smoothing.png \ - ${CGAL_PACKAGE_DOC_DIR}/fig/ bimba-dmax0.020000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.020000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.030000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.030000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.040000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.040000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.050000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmax0.050000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.020000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/ bimba-dmin0.020000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.030000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.030000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.040000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.040000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.050000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-dmin0.050000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.020000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.020000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.030000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.030000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.040000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.040000-0.002000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.050000-0.000000.png\ - ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-gaussian0.050000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.000000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.020000-0.002000.png\ ${CGAL_PACKAGE_DOC_DIR}/fig/bimba-mean0.030000-0.000000.png\ From 28efeb20569b20b5baa1ac8b15d1476caa8681b7 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 27 Aug 2023 19:13:42 +0300 Subject: [PATCH 0672/1398] integrated curvature vis to display property still need to add the radius setting part --- .../Display/Display_property_plugin.cpp | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index 994dcd2e8d9b..ed0de184db33 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -22,11 +22,13 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -47,6 +49,8 @@ using namespace CGAL::Three; + + Viewer_interface* (&getActiveViewer)() = Three::activeViewer; class DockWidget @@ -99,6 +103,11 @@ class Display_property_plugin MAX_VALUE }; + enum CurvatureType { + MEAN_CURVATURE, + GAUSSIAN_CURVATURE + }; + public: bool applicable(QAction*) const Q_DECL_OVERRIDE { @@ -238,6 +247,14 @@ private Q_SLOTS: dock_widget->maxBox->setRange(0, 360); dock_widget->maxBox->setValue(0); } + else if (property_name == "Interpolated Corrected Gaussian Curvature" || + property_name == "Interpolated Corrected Mean Curvature") + { + dock_widget->minBox->setRange(-1000, 1000); + dock_widget->minBox->setValue(0); + dock_widget->maxBox->setRange(-1000, 1000); + dock_widget->maxBox->setValue(0); + } else if(property_name == "Scaled Jacobian") { dock_widget->minBox->setRange(-1000, 1000); @@ -432,11 +449,15 @@ private Q_SLOTS: dock_widget->propertyBox->addItems({"Smallest Angle Per Face", "Largest Angle Per Face", "Scaled Jacobian", - "Face Area"}); + "Face Area", + "Interpolated Corrected Mean Curvature", + "Interpolated Corrected Gaussian Curvature"}); property_simplex_types = { Property_simplex_type::FACE, Property_simplex_type::FACE, Property_simplex_type::FACE, - Property_simplex_type::FACE }; + Property_simplex_type::FACE, + Property_simplex_type::VERTEX, + Property_simplex_type::VERTEX }; detectSMScalarProperties(*(sm_item->face_graph())); } else if(ps_item) @@ -506,10 +527,15 @@ private Q_SLOTS: { CGAL_assertion(static_cast(dock_widget->propertyBox->count()) == property_simplex_types.size()); + const int property_index = dock_widget->propertyBox->currentIndex(); + // leave it flat if it was, otherwise set to flat+edges - if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges) + if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::FACE) sm_item->setRenderingMode(FlatPlusEdges); + if(sm_item->renderingMode() != Gouraud && sm_item->renderingMode() != GouraudPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::VERTEX) + sm_item->setRenderingMode(GouraudPlusEdges); + const std::string& property_name = dock_widget->propertyBox->currentText().toStdString(); if(property_name == "Smallest Angle Per Face") { @@ -527,6 +553,14 @@ private Q_SLOTS: { displayArea(sm_item); } + else if(property_name == "Interpolated Corrected Mean Curvature") + { + displayCurvature(sm_item, MEAN_CURVATURE); + } + else if(property_name == "Interpolated Corrected Gaussian Curvature") + { + displayCurvature(sm_item, GAUSSIAN_CURVATURE); + } else { const int property_index = dock_widget->propertyBox->currentIndex(); @@ -629,6 +663,8 @@ private Q_SLOTS: removeDisplayPluginProperty(item, "f:display_plugin_largest_angle"); removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian"); removeDisplayPluginProperty(item, "f:display_plugin_area"); + removeDisplayPluginProperty(item, "f:display_plugin_mean_curvature"); + removeDisplayPluginProperty(item, "f:display_plugin_gaussian_curvature"); } void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item, @@ -809,6 +845,32 @@ private Q_SLOTS: displaySMProperty("f:display_plugin_area", *sm); } + void displayCurvature(Scene_surface_mesh_item* sm_item, + const CurvatureType curvature_type) + { + SMesh* sm = sm_item->face_graph(); + if(sm == nullptr) + return; + + bool not_initialized; + std::string tied_string = (curvature_type == MEAN_CURVATURE) ? + "v:display_plugin_mean_curvature" : "v:display_plugin_gaussian_curvature"; + + SMesh::Property_map vcurvature; + std::tie(vcurvature, not_initialized) = sm->add_property_map(tied_string, 0); + + if (curvature_type == MEAN_CURVATURE) + { + CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature(*sm, vcurvature); + } + else if (curvature_type == GAUSSIAN_CURVATURE) + { + CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature(*sm, vcurvature); + } + + displaySMProperty(tied_string, *sm); + } + private: template bool call_on_PS_property(const std::string& name, @@ -964,6 +1026,10 @@ private Q_SLOTS: zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum); else if(property_name == "Face Area") zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum); + else if(property_name == "Interpolated Corrected Mean Curvature") + zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_mean_curvature", extremum); + else if(property_name == "Interpolated Corrected Gaussian Curvature") + zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_gaussian_curvature", extremum); else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX) zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum); else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE) @@ -1298,7 +1364,10 @@ isSMPropertyScalar(const std::string& name, if(name == "f:display_plugin_smallest_angle" || name == "f:display_plugin_largest_angle" || name == "f:display_plugin_scaled_jacobian" || - name == "f:display_plugin_area") + name == "f:display_plugin_area" || + name == "f:display_plugin_mean_curvature" || + name == "f:display_plugin_gaussian_curvature") + return false; // the dispatch function does the filtering we want: if it founds a property From 46ac0f90604291123bacd57e40b9bfa8c9b2b044 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Sun, 27 Aug 2023 19:27:23 +0300 Subject: [PATCH 0673/1398] trim whitespaces --- .../demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp index ed0de184db33..e5baf54cfd7e 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Display/Display_property_plugin.cpp @@ -247,7 +247,7 @@ private Q_SLOTS: dock_widget->maxBox->setRange(0, 360); dock_widget->maxBox->setValue(0); } - else if (property_name == "Interpolated Corrected Gaussian Curvature" || + else if (property_name == "Interpolated Corrected Gaussian Curvature" || property_name == "Interpolated Corrected Mean Curvature") { dock_widget->minBox->setRange(-1000, 1000); From 49d6821d9bf3ad827ad664e739c90e0cd8c24909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 28 Aug 2023 13:51:57 +0200 Subject: [PATCH 0674/1398] accomodate update to c++17 STL --- Kernel_23/include/CGAL/Kernel/function_objects.h | 16 ++++++++-------- .../Polygon_mesh_processing/autorefinement.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 8974b762dcb4..8309a3c97ce7 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -2211,8 +2211,8 @@ namespace CommonKernelFunctors { Plane plane3 = construct_plane(p3, q3, r3); const auto res = typename K::Intersect_3()(plane1, plane2, plane3); - CGAL_assertion(res!=boost::none); - const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(res!=std::nullopt); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -2221,8 +2221,8 @@ namespace CommonKernelFunctors { operator()(const Plane& plane1, const Plane& plane2, const Plane& plane3) const { const auto res = typename K::Intersect_3()(plane1, plane2, plane3); - CGAL_assertion(res!=boost::none); - const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(res!=std::nullopt); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -2245,8 +2245,8 @@ namespace CommonKernelFunctors { Segment s2 = construct_segment(p2, q2); const auto res = typename K::Intersect_3()(s1, s2); - CGAL_assertion(res!=boost::none); - const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(res!=std::nullopt); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } @@ -2255,8 +2255,8 @@ namespace CommonKernelFunctors { operator()(const Segment& s1, const Segment& s2) const { const auto res = typename K::Intersect_3()(s1, s2); - CGAL_assertion(res!=boost::none); - const Point* e_pt = boost::get(&(*res)); + CGAL_assertion(res!=std::nullopt); + const Point* e_pt = std::get_if(&(*res)); CGAL_assertion(e_pt!=nullptr); return *e_pt; } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 0fb843c31c00..b3133304bb96 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -292,8 +292,8 @@ void old_intersection_coplanar_triangles_cutoff(const typename Kernel::Point_3& CGAL_kernel_assertion_code(int pt_added = 0;) - const typename Kernel::Point_3* prev = &(*boost::prior(inter_pts.end())); - Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : boost::prior(inter_pts.end()); + const typename Kernel::Point_3* prev = &(*std::prev(inter_pts.end())); + Iterator stop = inter_pts.size() > 2 ? inter_pts.end() : std::prev(inter_pts.end()); for(Iterator it=inter_pts.begin(); it!=stop; ++it) { const typename Kernel::Point_3& curr = *it; From f499b635341b85b977328d6c0f7e4c8f4c1b6265 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 28 Aug 2023 14:07:24 +0200 Subject: [PATCH 0675/1398] Update features_detection.h --- .../include/CGAL/Mesh_3/features_detection/features_detection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 461cda686995..943674f45ddd 100644 --- a/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h +++ b/Mesh_3/include/CGAL/Mesh_3/features_detection/features_detection.h @@ -3802,7 +3802,7 @@ inline constexpr Cube convert_to_cube(unsigned int n) { // 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) +inline constexpr Cube operator""_c(unsigned long long n) { #if !defined(_MSC_VER) || (_MSC_VER > 1900) assert(n < (1 << 24)); From ea46c6f28252ea4010b610cc883cebbe5ea1f6a1 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Mon, 28 Aug 2023 16:24:03 +0300 Subject: [PATCH 0676/1398] Pacify msvc17: explicitly name the (non-const) iterator type --- .../include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h index 5aa184d4d0c8..2889f219237f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_zone_2_impl.h @@ -946,7 +946,9 @@ _leftmost_intersection_with_face_boundary(Face_handle face, bool on_boundary) { // Traverse the isolated vertices inside the face (if there exist any), and // check whether an isolated vertex lies on the curve. - for (auto iv_it = face->isolated_vertices_begin(); + // MSVC17 requires an explicit (non-const) type for the iterator. + typename Arrangement_2::Isolated_vertex_iterator iv_it; + for (iv_it = face->isolated_vertices_begin(); iv_it != face->isolated_vertices_end(); ++iv_it) { // If the isolated vertex is not in the x-range of our curve, disregard it. if (! is_in_x_range(m_cv, iv_it->point())) continue; From 4fbcb937044844d9afb5f486f45bdd664704c366 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 28 Aug 2023 16:54:30 +0200 Subject: [PATCH 0677/1398] a few cleanups --- .../demo/Circular_kernel_3/CMakeLists.txt | 8 ++--- .../demo/Alpha_shapes_2/CMakeLists.txt | 12 +------ .../demo/Apollonius_graph_2/CMakeLists.txt | 19 ++++------- .../demo/Bounding_volumes/Bounding_volumes.ui | 2 +- .../demo/Bounding_volumes/CMakeLists.txt | 34 ++++--------------- 5 files changed, 17 insertions(+), 58 deletions(-) diff --git a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt index 3f46c3dcd935..2ed07a6904ec 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt +++ b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt @@ -12,18 +12,16 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGL OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_executable( - Circular_kernel_3 Circular_kernel_3.cpp Viewer.cpp - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + add_executable(Circular_kernel_3 Circular_kernel_3.cpp Viewer.cpp) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Circular_kernel_3) target_link_libraries(Circular_kernel_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 - Qt6::Widgets Qt6::OpenGL Qt6::OpenGLWidgets) + Qt6::Widgets Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Circular_kernel_3) diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index 4049f54c00d5..f8e410b6a4ea 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -4,19 +4,9 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Alpha_shapes_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) -include_directories(BEFORE ./include) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index 9cf502573e57..a7bf703fb43b 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -15,25 +15,18 @@ endif() find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) - #-------------------------------- - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Apollonius_graph_2.ui) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Apollonius_graph_2.qrc) - - # use the Qt MOC preprocessor on classes that derives from QObject - - # The executable itself. - add_executable( - Apollonius_graph_2 Apollonius_graph_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Apollonius_graph_2 Apollonius_graph_2.cpp Apollonius_graph_2.ui + Apollonius_graph_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Apollonius_graph_2) diff --git a/GraphicsView/demo/Bounding_volumes/Bounding_volumes.ui b/GraphicsView/demo/Bounding_volumes/Bounding_volumes.ui index 6228db3d7178..73b0415f93c6 100644 --- a/GraphicsView/demo/Bounding_volumes/Bounding_volumes.ui +++ b/GraphicsView/demo/Bounding_volumes/Bounding_volumes.ui @@ -197,7 +197,7 @@ - icons/min_circle.pngicons/min_circle.png + :/cgal/Actions/icons/min_circle.png:/cgal/Actions/icons/min_circle.png Minimum Enclosing &Circle diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 56ed6427701e..bdf70858d185 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -4,46 +4,24 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Bounding_volumes_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) -include_directories(BEFORE ./include) - +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Bounding_volumes.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Bounding_volumes.qrc) - - # use the Qt MOC preprocessor on classes that derives from QObject - - # The executable itself. - add_executable( - Bounding_volumes Bounding_volumes.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Bounding_volumes Bounding_volumes.cpp Bounding_volumes.ui Bounding_volumes.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Bounding_volumes) target_link_libraries(Bounding_volumes PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 - Qt6::Gui) - - include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) - cgal_add_compilation_test(Bounding_volumes) + Qt6::Widgets) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Bounding_volumes) From 3a52549c410a87a8c01be35367d612809e1d9da9 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 29 Aug 2023 16:35:15 +0200 Subject: [PATCH 0678/1398] more cleanup of CMake scripts for Qt6 --- .../demo/Circular_kernel_3/CMakeLists.txt | 11 +---- .../demo/Alpha_shapes_2/CMakeLists.txt | 13 ++---- .../demo/Apollonius_graph_2/CMakeLists.txt | 9 ----- .../demo/Circular_kernel_2/CMakeLists.txt | 29 +++----------- GraphicsView/demo/Generator/CMakeLists.txt | 24 ++--------- GraphicsView/demo/GraphicsView/CMakeLists.txt | 13 +----- .../demo/L1_Voronoi_diagram_2/CMakeLists.txt | 25 +++--------- .../demo/Largest_empty_rect_2/CMakeLists.txt | 25 +++--------- .../Periodic_2_triangulation_2/CMakeLists.txt | 13 +----- GraphicsView/demo/Polygon/CMakeLists.txt | 25 ++---------- .../Segment_Delaunay_graph_2/CMakeLists.txt | 26 +++--------- .../CMakeLists.txt | 32 +++------------ .../demo/Snap_rounding_2/CMakeLists.txt | 27 +++---------- .../demo/Snap_rounding_2/Snap_rounding_2.qrc | 9 +++-- .../demo/Spatial_searching_2/CMakeLists.txt | 26 +++--------- .../demo/Stream_lines_2/CMakeLists.txt | 26 +++--------- .../demo/Triangulation_2/CMakeLists.txt | 40 ++++++------------- 17 files changed, 83 insertions(+), 290 deletions(-) diff --git a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt index 2ed07a6904ec..42cc885bbffa 100644 --- a/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt +++ b/Circular_kernel_3/demo/Circular_kernel_3/CMakeLists.txt @@ -1,22 +1,13 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Circular_kernel_3_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - add_executable(Circular_kernel_3 Circular_kernel_3.cpp Viewer.cpp) + qt_add_executable(Circular_kernel_3 Circular_kernel_3.cpp Viewer.cpp) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Circular_kernel_3) diff --git a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt index f8e410b6a4ea..39e6c10e48ba 100644 --- a/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt +++ b/GraphicsView/demo/Alpha_shapes_2/CMakeLists.txt @@ -12,17 +12,12 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) - - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Alpha_shapes_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Alpha_shapes_2.qrc) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) # The executable itself. - add_executable( - Alpha_shapes_2 Alpha_shapes_2.cpp ${DT_UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Alpha_shapes_2 Alpha_shapes_2.cpp Alpha_shapes_2.ui Alpha_shapes_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Alpha_shapes_2) diff --git a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt index a7bf703fb43b..219466b79416 100644 --- a/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Apollonius_graph_2/CMakeLists.txt @@ -4,15 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Apollonius_graph_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) diff --git a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt index 054e5feeedb4..940c5bcc27d3 100644 --- a/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt +++ b/GraphicsView/demo/Circular_kernel_2/CMakeLists.txt @@ -4,37 +4,20 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Circular_kernel_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Circular_kernel_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Circular_kernel_2.qrc) - - # use the Qt MOC preprocessor on classes that derives from QObject - - # The executable itself. - add_executable( - Circular_kernel_2 Circular_kernel_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) - + qt_add_executable( + Circular_kernel_2 Circular_kernel_2.cpp + Circular_kernel_2.ui Circular_kernel_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Circular_kernel_2) target_link_libraries(Circular_kernel_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index 2b6dbe1c77be..cea168a2c9d9 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -3,15 +3,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Generator_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) @@ -21,18 +12,11 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Generator_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Generator_2.qrc) - - # use the Qt MOC preprocessor on classes that derives from QObject - - # The executable itself. - add_executable(Generator_2 Generator_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable(Generator_2 Generator_2.cpp + Generator_2.ui Generator_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Generator_2) diff --git a/GraphicsView/demo/GraphicsView/CMakeLists.txt b/GraphicsView/demo/GraphicsView/CMakeLists.txt index 771f3225dd64..aa84ba549cb6 100644 --- a/GraphicsView/demo/GraphicsView/CMakeLists.txt +++ b/GraphicsView/demo/GraphicsView/CMakeLists.txt @@ -3,25 +3,16 @@ cmake_minimum_required(VERSION 3.1...3.23) project(GraphicsView_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) - add_executable(min min.cpp ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable(min min.cpp) add_to_cached_list(CGAL_EXECUTABLE_TARGETS min) diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt index e8c2499c325e..058ac7ad55b3 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/CMakeLists.txt @@ -4,18 +4,9 @@ cmake_minimum_required(VERSION 3.1...3.23) project(L1_Voronoi_diagram_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) @@ -23,17 +14,13 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES L1_voronoi_diagram_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./L1_voronoi_diagram_2.qrc) - # The executable itself. - add_executable( - L1_voronoi_diagram_2 L1_voronoi_diagram_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + L1_voronoi_diagram_2 L1_voronoi_diagram_2.cpp + L1_voronoi_diagram_2.ui L1_voronoi_diagram_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS L1_voronoi_diagram_2) diff --git a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt index 8fedcbb9f469..275095d4b70d 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt +++ b/GraphicsView/demo/Largest_empty_rect_2/CMakeLists.txt @@ -4,35 +4,22 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Largest_empty_rect_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Largest_empty_rectangle_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Largest_empty_rectangle_2.qrc) - # The executable itself. - add_executable( - Largest_empty_rectangle_2 Largest_empty_rectangle_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Largest_empty_rectangle_2 Largest_empty_rectangle_2.cpp + Largest_empty_rectangle_2.ui Largest_empty_rectangle_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Largest_empty_rectangle_2) diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt index f8acebb2ee4c..f6b0698e4cba 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Periodic_2_triangulation_2/CMakeLists.txt @@ -1,18 +1,9 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Periodic_2_triangulation_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) @@ -35,7 +26,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) source_group("QT" FILES ${QT_headers}) # The executable itself. - add_executable( + qt_add_executable( Periodic_2_Delaunay_triangulation_2 Periodic_2_Delaunay_triangulation_2.cpp ${DT_UI_FILES} diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index db1fe276a5ea..341021360a39 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -4,15 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Polygon_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) @@ -28,23 +19,15 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) if(CGAL_Core_FOUND) add_definitions(-DCGAL_USE_CORE) endif() - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Polygon_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Polygon_2.qrc) - - # add_library( CGAL SHARED IMPORTED ) - # SET_PROPERTY(TARGET CGAL PROPERTY IMPORTED_LOCATION ${CGAL_LIBRARY} ) - - # The executable itself. - add_executable(Polygon_2 Polygon_2.cpp ${DT_UI_FILES} ${DT_RESOURCE_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable(Polygon_2 Polygon_2.cpp + Polygon_2.ui Polygon_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polygon_2) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt index 7a947227eece..463f5a424c11 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/CMakeLists.txt @@ -4,37 +4,23 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Segment_Delaunay_graph_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) - # UI files (Qt Designer files) - qt6_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Segment_voronoi_2.qrc) - # The executable itself. - add_executable( - Segment_voronoi_2 Segment_voronoi_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Segment_voronoi_2 Segment_voronoi_2.cpp + Segment_voronoi_2.ui Segment_voronoi_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Segment_voronoi_2) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index e3cb33be16c0..980aa3401a2a 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -4,40 +4,20 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Segment_Delaunay_graph_Linf_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 Core) -set(QT_USE_QTXML TRUE) -set(QT_USE_QTMAIN TRUE) -set(QT_USE_QTSCRIPT TRUE) -set(QT_USE_QTOPENGL TRUE) - -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ./include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) - include(${CGAL_USE_FILE}) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) add_definitions(-DQT_NO_KEYWORDS) - # UI files (Qt Designer files) - qt6_wrap_ui(CDT_UI_FILES Segment_voronoi_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Segment_voronoi_2.qrc) - - # The executable itself. - add_executable( - Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp + Segment_voronoi_2.ui Segment_voronoi_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Segment_voronoi_linf_2) diff --git a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt index 896dfc63b086..ab1015f2fc36 100644 --- a/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt +++ b/GraphicsView/demo/Snap_rounding_2/CMakeLists.txt @@ -4,34 +4,19 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Snap_rounding_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Widgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) add_definitions(-DQT_NO_KEYWORDS) - set(CMAKE_INCLUDE_CURRENT_DIR ON) - - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Snap_rounding_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Snap_rounding_2.qrc) - # The executable itself. - add_executable( - Snap_rounding_2 Snap_rounding_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Snap_rounding_2 Snap_rounding_2.cpp + Snap_rounding_2.ui Snap_rounding_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Snap_rounding_2) diff --git a/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.qrc b/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.qrc index 7604c41cc813..b4307047176a 100644 --- a/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.qrc +++ b/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.qrc @@ -1,8 +1,11 @@ - + + icons/grid.png + icons/snapped.png + icons/unsnapped.png - - ../resources/about_CGAL.html + + ../resources/about_CGAL.html about_Snap_rounding_2.html diff --git a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt index 55770b5f4c3a..78c6acd254de 100644 --- a/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt +++ b/GraphicsView/demo/Spatial_searching_2/CMakeLists.txt @@ -4,35 +4,21 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Spatial_searching_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Spatial_searching_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Spatial_searching_2.qrc) - - # The executable itself. - add_executable( - Spatial_searching_2 Spatial_searching_2.cpp ${DT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Spatial_searching_2 Spatial_searching_2.cpp + Spatial_searching_2.ui Spatial_searching_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Spatial_searching_2) diff --git a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt index 71deef9e9100..f3f3133898a1 100644 --- a/GraphicsView/demo/Stream_lines_2/CMakeLists.txt +++ b/GraphicsView/demo/Stream_lines_2/CMakeLists.txt @@ -4,35 +4,21 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Stream_lines_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(DT_UI_FILES Stream_lines_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Stream_lines_2.qrc) - - # The executable itself. - add_executable( - Stream_lines_2 Stream_lines_2.cpp ${DT_UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + qt_add_executable( + Stream_lines_2 Stream_lines_2.cpp + Stream_lines_2.ui Stream_lines_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Stream_lines_2) diff --git a/GraphicsView/demo/Triangulation_2/CMakeLists.txt b/GraphicsView/demo/Triangulation_2/CMakeLists.txt index 6ee55850f86d..a3ff3a16dd43 100644 --- a/GraphicsView/demo/Triangulation_2/CMakeLists.txt +++ b/GraphicsView/demo/Triangulation_2/CMakeLists.txt @@ -4,16 +4,9 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Triangulation_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - -set(CMAKE_AUTOMOC TRUE) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) @@ -31,13 +24,10 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # The "constrained Delaunay" demo: Constrained_Delaunay_triangulation_2 #-------------------------------- -qt6_add_resources(CD_RES_FILE Constrained_Delaunay_triangulation_2.qrc) -qt6_wrap_ui(CD_UI_FILES Constrained_Delaunay_triangulation_2.ui) -# The executable itself. -add_executable( +qt_add_executable( Constrained_Delaunay_triangulation_2 - Constrained_Delaunay_triangulation_2.cpp ${CD_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CD_RES_FILE}) + Constrained_Delaunay_triangulation_2.cpp + Constrained_Delaunay_triangulation_2.ui Constrained_Delaunay_triangulation_2.qrc) target_link_libraries(Constrained_Delaunay_triangulation_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) target_include_directories(Constrained_Delaunay_triangulation_2 @@ -48,12 +38,9 @@ add_to_cached_list(CGAL_EXECUTABLE_TARGETS Constrained_Delaunay_triangulation_2) #-------------------------------- # The "Delaunay" demo: Delaunay_triangulation_2 #-------------------------------- -qt6_wrap_ui(D_UI_FILES Delaunay_triangulation_2.ui) -qt6_add_resources(D_RES_FILE Delaunay_triangulation_2.qrc) -# The executable itself. -add_executable( - Delaunay_triangulation_2 Delaunay_triangulation_2.cpp ${D_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${D_RES_FILE}) +qt_add_executable( + Delaunay_triangulation_2 Delaunay_triangulation_2.cpp + Delaunay_triangulation_2.ui Delaunay_triangulation_2.qrc) target_link_libraries(Delaunay_triangulation_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) @@ -63,12 +50,9 @@ add_to_cached_list(CGAL_EXECUTABLE_TARGETS Delaunay_triangulation_2) # The "Regular" demo: Regular_triangulation_2 #-------------------------------- -# The executable itself. -qt6_add_resources(R_RES_FILE Regular_triangulation_2.qrc) -qt6_wrap_ui(R_UI_FILES Regular_triangulation_2.ui) -add_executable( - Regular_triangulation_2 Regular_triangulation_2.cpp ${R_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${R_RES_FILE}) +qt_add_executable( + Regular_triangulation_2 Regular_triangulation_2.cpp + Regular_triangulation_2.ui Regular_triangulation_2.qrc) target_link_libraries(Regular_triangulation_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) From 7af862ec8a0194e9943caf3d6df44e15d830a6c8 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 29 Aug 2023 16:55:28 +0200 Subject: [PATCH 0679/1398] fix trailing space --- GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt index 980aa3401a2a..842ed5ff23bb 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/CMakeLists.txt @@ -16,7 +16,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) qt_add_executable( - Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp + Segment_voronoi_linf_2 Segment_voronoi_linf_2.cpp Segment_voronoi_2.ui Segment_voronoi_2.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Segment_voronoi_linf_2) From 1f13a625b11732ec9240e3249c1a279a08556a18 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 30 Aug 2023 09:32:17 +0200 Subject: [PATCH 0680/1398] restore the OpenGL format in DemosMainWindow That still does not work well when the widget is a `QOpenGLWidget`. We probably need to derive from that class, to call `glClearColor(..)` in the `paintGL()` method. --- .../include/CGAL/Qt/CreateOpenGLContext.h | 12 ++++-------- .../include/CGAL/Qt/DemosMainWindow_impl.h | 15 +++++++++------ GraphicsView/include/CGAL/Qt/debug_impl.h | 1 - GraphicsView/include/CGAL/Qt/qglviewer.h | 2 -- GraphicsView/include/CGAL/Qt/qglviewer_impl.h | 1 - 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h b/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h index e85911f73e87..5c37bffe9a05 100644 --- a/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h +++ b/GraphicsView/include/CGAL/Qt/CreateOpenGLContext.h @@ -19,16 +19,12 @@ namespace Qt{ inline QOpenGLContext* createOpenGLContext() { QOpenGLContext *context = new QOpenGLContext(); + QSurfaceFormat format; + format.setVersion(2,1); + format.setProfile(QSurfaceFormat::CompatibilityProfile); + context->setFormat(format); context->create(); return context; - - //QSurfaceFormat format; - //format.setVersion(2,1); - //format.setProfile(QSurfaceFormat::CompatibilityProfile); - //context->setFormat(format); - //QGLContext *result = QGLContext::fromOpenGLContext(context); - // result->create(); - //return result; } } // namespace Qt } // namespace CGAL diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h index 9b1761e6b868..8b6cb174703c 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h @@ -208,19 +208,22 @@ void DemosMainWindow::setUseOpenGL(bool checked) { if(checked) { - // AF QOpenGLWidget* new_viewport = new QOpenGLWidget; + QOpenGLWidget* new_viewport = new QOpenGLWidget(this); + new_viewport->setUpdateBehavior(QOpenGLWidget::NoPartialUpdate); // Setup the format to allow antialiasing with OpenGL: // one need to activate the SampleBuffers, if the graphic driver allows // this. - // AF QGLFormat glformat = new_viewport->format(); - // AF glformat.setOption(QGL::SampleBuffers); - // AF new_viewport->setFormat(glformat); + auto glformat = new_viewport->format(); + glformat.setSamples(4); + new_viewport->setFormat(glformat); - // AF view->setViewport(new_viewport); + view->setViewport(new_viewport); + view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); } else { - view->setViewport(new QWidget); + view->setViewport(new QWidget(this)); + view->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); } statusBar()->showMessage(tr("OpenGL %1activated").arg(checked?"":"de-"), 1000); diff --git a/GraphicsView/include/CGAL/Qt/debug_impl.h b/GraphicsView/include/CGAL/Qt/debug_impl.h index 4f3c152697c6..a9e0d6da5b1a 100644 --- a/GraphicsView/include/CGAL/Qt/debug_impl.h +++ b/GraphicsView/include/CGAL/Qt/debug_impl.h @@ -23,7 +23,6 @@ #include #include #include -#include #include namespace CGAL { namespace Qt { diff --git a/GraphicsView/include/CGAL/Qt/qglviewer.h b/GraphicsView/include/CGAL/Qt/qglviewer.h index a89a66a4b744..8ee3b4135f29 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer.h @@ -70,8 +70,6 @@ class CGAL_QT_EXPORT QGLViewer : public QOpenGLWidget, public QOpenGLFunctions { Q_OBJECT public: - //todo check if this is used. If not remove it - explicit QGLViewer(QOpenGLContext* context, QWidget *parent = nullptr, ::Qt::WindowFlags flags = ::Qt::WindowType(0)); explicit QGLViewer(QWidget *parent = nullptr, diff --git a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h index b6bfc70e9ac3..3cca531c5fb2 100644 --- a/GraphicsView/include/CGAL/Qt/qglviewer_impl.h +++ b/GraphicsView/include/CGAL/Qt/qglviewer_impl.h @@ -2446,7 +2446,6 @@ void CGAL::QGLViewer::setMouseBinding(::Qt::Key key, ::Qt::KeyboardModifiers mod ClickBindingPrivate cbp(modifiers, button, false, ::Qt::NoButton, key); clickBinding_.remove(cbp); - } From 4740f81a1b706af3c8ecd6153f24d6d3fbd5b3fe Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 31 Aug 2023 15:43:44 +0200 Subject: [PATCH 0681/1398] add a target to compile all CGALlab --- Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake index dea8e54d2b0a..f4129a57c9fc 100644 --- a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake +++ b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake @@ -64,6 +64,10 @@ include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) if(TARGET Polyhedron_3) add_dependencies( ${plugin_name} Polyhedron_3 ) endif() + if(NOT TARGET CGALlab_all_plugins) + add_custom_target(CGALlab_all_plugins) + endif() + add_dependencies(CGALlab_all_plugins ${plugin_name}) #metadata management #create "${plugin_implementation_base_name}.json" in BINARY_DIR STRING(TOLOWER "${plugin_implementation_base_name}.json" base_name) From 4dc2ad3f36a9f2023e3e0ceaa5e44bf38b7332ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 4 Sep 2023 14:05:18 +0200 Subject: [PATCH 0682/1398] fix map type --- .../CGAL/Polygon_mesh_processing/autorefinement.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index b3133304bb96..32765252a6f2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1480,12 +1480,13 @@ void autorefine_triangle_soup(PointRange& soup_points, // TODO: reuse the fact that maps per triangle are already sorted #ifdef CGAL_LINKED_WITH_TBB - std::conditional_t, - std::map> point_id_map; + typedef std::conditional_t, + std::map> Point_id_map; #else - std::map point_id_map; + typedef std::map Point_id_map; #endif + Point_id_map point_id_map; #if ! defined(CGAL_NDEBUG) || defined(CGAL_DEBUG_PMP_AUTOREFINE) std::vector exact_soup_points; @@ -1605,7 +1606,7 @@ void autorefine_triangle_soup(PointRange& soup_points, #else //option 2 (without mutex) /// Lambda concurrent_get_point_id() - tbb::concurrent_vector::iterator> iterators; + tbb::concurrent_vector iterators; auto concurrent_get_point_id = [&](const typename EK::Point_3 pt) { auto insert_res = point_id_map.insert(std::make_pair(pt, -1)); @@ -1616,7 +1617,7 @@ void autorefine_triangle_soup(PointRange& soup_points, //use map iterator triple for triangles to create them concurrently and safely soup_triangles_out.resize(offset + new_triangles.size()); - std::vector::iterator, 3>> triangle_buffer(new_triangles.size()); + std::vector> triangle_buffer(new_triangles.size()); tbb::parallel_for(tbb::blocked_range(0, new_triangles.size()), [&](const tbb::blocked_range& r) { for (size_t ti = r.begin(); ti != r.end(); ++ti) { From 9d68f5350e491bb1b23a42f14027285477a18780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 4 Sep 2023 14:58:47 +0200 Subject: [PATCH 0683/1398] doc + changes --- Installation/CHANGES.md | 6 ++++++ .../include/CGAL/Polygon_mesh_processing/autorefinement.h | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 479984002682..b361d15dec76 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -35,6 +35,12 @@ Release date: October 2023 - Removed the class templates `Gray_image_mesh_domain_3`, `Implicit_mesh_domain_3`, and `Labeled_image_mesh_domain_3` which are deprecated since CGAL-4.13. +### [Polygon Mesh Processing](https://doc.cgal.org/6.0/Manual/packages.html#PkgPolygonMeshProcessing) + +- Added the function + `CGAL::Polygon_mesh_processing::autorefine_triangle_soup()` that refines a soup of triangles so that no pair of triangles intersects + (they can share an edge or a vertex). Also added, the function `autorefine()` operating directly on a triangle mesh and updating it + using the aforementioned function on triangle soup. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h index 32765252a6f2..884ce3477aa8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/autorefinement.h @@ -1128,8 +1128,9 @@ void generate_subtriangles(std::size_t ti, /** * \ingroup PMP_corefinement_grp * -* refines a soup of triangles so that no pair of triangles intersects in their interior. -* Note that points in `soup_points` can only be added (intersection points) a the end of the container, with the initial order preserved. +* refines a soup of triangles so that no pair of triangles intersects. +* Output triangles may share a common edge or a common vertex (but with the same indexed position in `points`). +* Note that points in `soup_points` can only be added (intersection points) at the end of the container, with the initial order preserved. * Note that if `soup_points` contains two or more identical points and only the first copy (following the order in the `soup_points`) * will be used in `soup_triangles`. * `soup_triangles` will be updated to contain both the input triangles and the new subdivides triangles. Degenerate triangles will be removed. From 0303b8dfd5eb99acb0668ff02e5e22c4d2c60424 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Tue, 5 Sep 2023 15:58:43 +0200 Subject: [PATCH 0684/1398] Update CMakeLists for QT6 --- .../Polyline_simplification_2/CMakeLists.txt | 27 +++++-------------- .../Surface_mesh_deformation/CMakeLists.txt | 5 ---- .../demo/Triangulation_3/CMakeLists.txt | 25 +++++------------ 3 files changed, 12 insertions(+), 45 deletions(-) diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index 90254ff949da..db32bac7b395 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -4,39 +4,24 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Polyline_simplification_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Widgets) +find_package(Qt6 QUIET COMPONENTS Widgets) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - set(CMAKE_AUTOMOC ON) - add_definitions(-DQT_NO_KEYWORDS) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # UI files (Qt Designer files) - qt6_wrap_ui(CDT_UI_FILES Polyline_simplification_2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.qrc) # The executable itself. - add_executable( + qt_add_executable( Polyline_simplification_2 - ${CMAKE_CURRENT_SOURCE_DIR}/Polyline_simplification_2.cpp ${CDT_UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} ${CGAL_Qt6_MOC_FILES}) + Polyline_simplification_2.cpp Polyline_simplification_2.ui Polyline_simplification_2.qrc) target_link_libraries(Polyline_simplification_2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) diff --git a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt index 33263a815435..3f5e0bdb430e 100644 --- a/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt +++ b/Surface_mesh_deformation/demo/Surface_mesh_deformation/CMakeLists.txt @@ -4,11 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Surface_mesh_deformation_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - set_property(DIRECTORY PROPERTY CGAL_NO_TESTING TRUE) find_package(CGAL REQUIRED) diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index bce91a5a51b3..1058b455a761 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -4,14 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Triangulation_3_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -20,7 +12,7 @@ set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets OpenGL) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) @@ -48,24 +40,19 @@ endif() if(CGAL_Qt6_FOUND AND Qt6_FOUND) include_directories(BEFORE ./) - - # ui files, created with Qt Designer - qt6_wrap_ui(uis MainWindow.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./T3_demo.qrc) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) # cpp files - add_executable( + qt_add_executable( T3_demo T3_demo.cpp MainWindow.cpp Viewer.cpp PreferenceDlg.cpp Scene.cpp - ${uis} - ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + MainWindow.ui + T3_demo.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS T3_demo) From 586a71e66ef3fedc55bce6148837bfc4b08b739c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 6 Sep 2023 01:59:35 +0300 Subject: [PATCH 0685/1398] added missing reference to paper --- Documentation/doc/biblio/cgal_manual.bib | 9 +++++++++ Heat_method_3/doc/Heat_method_3/Heat_method_3.txt | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 89d062ddddf5..2abd7e1b30d4 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -2049,6 +2049,15 @@ @Article{ cgal:rz-jcam-04 update = "09.11 penarand" } +@article{ cgal:sc-lntm-20 + ,author = {Nicholas Sharp and Keenan Crane} + ,title = {{A Laplacian for Nonmanifold Triangle Meshes}} + ,journal = {Computer Graphics Forum (SGP)} + ,volume = {39} + ,number = {5} + ,year = {2020} +} + @inproceedings{cgal:ssgh-tmpm-01, title={Texture mapping progressive meshes}, author={Sander, Pedro V and Snyder, John and Gortler, Steven J and Hoppe, Hugues}, diff --git a/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt index 82ad37d2d41b..2b2d3f8aab3a 100644 --- a/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt +++ b/Heat_method_3/doc/Heat_method_3/Heat_method_3.txt @@ -41,7 +41,7 @@ the mathematical theory of the Heat method. The last section is about the \ref s Note that this package depends on the third party \ref thirdpartyEigen library (3.3 or greater), or another model of the concept `SparseLinearAlgebraWithFactorTraits_d`. -This implementation is based on \cgalCite{cgal:cww-ghnac-13} and \cgalCite{cgal:fsbs-acidt-06} +This implementation is based on \cgalCite{cgal:cww-ghnac-13} , \cgalCite{cgal:fsbs-acidt-06} , and \cgalCite{cgal:sc-lntm-20} This package is related to the package \ref PkgSurfaceMeshShortestPath. Both deal with geodesic distances. The heat method package computes for every vertex of a mesh an approximate distance to one or several source vertices. From 88a9d86012230914bbb80e8eef81e3468ab93387 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 6 Sep 2023 02:30:05 +0300 Subject: [PATCH 0686/1398] added url --- Documentation/doc/biblio/cgal_manual.bib | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 2abd7e1b30d4..38b745f67809 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -2053,6 +2053,7 @@ @article{ cgal:sc-lntm-20 ,author = {Nicholas Sharp and Keenan Crane} ,title = {{A Laplacian for Nonmanifold Triangle Meshes}} ,journal = {Computer Graphics Forum (SGP)} + ,url = "https://www.cs.cmu.edu/~kmcrane/Projects/NonmanifoldLaplace/NonmanifoldLaplace.pdf" ,volume = {39} ,number = {5} ,year = {2020} From 167db62e0753cf73965e97eccbe6b2545e96d59c Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:50:39 +0300 Subject: [PATCH 0687/1398] moved bib to cgal_manual.bib & restored geom.bib --- Documentation/doc/biblio/cgal_manual.bib | 23 +++++++++++++++++ Documentation/doc/biblio/geom.bib | 25 +------------------ .../Polygon_mesh_processing.txt | 10 ++++---- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 89d062ddddf5..453f1968678e 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -1331,6 +1331,29 @@ @INPROCEEDINGS{cgal:la-srpss-13 address = {Girona, Spain} } +@article{cgal:lrtc-iccmps-20, + author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert and David Coeurjolly}, + journal = {Computer Graphics Forum (Proceedings of Symposium on Geometry Processing)}, + number = {5}, + title = {Interpolated Corrected Curvature Measures for Polygonal Surfaces}, + volume = {39}, + month = aug, + year = {2020}, + url = {https://doi.org/10.1111/cgf.14067}, + doi = {10.1111/cgf.14067} +} + +@article{cgal:lrt-ccm-22, + author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert}, + journal = {Discrete & Computational Geometry}, + title = {Corrected Curvature Measures}, + volume = {68}, + pages = {477-524}, + month = jul, + year = {2022}, + url = {https://doi.org/10.1007/s00454-022-00399-4} +} + @article{cgal:lm-clscm-12, author = {Lafarge, Florent and Mallet, Clement}, title = {{Creating large-scale city models from 3D-point clouds: a robust approach with hybrid representation}}, diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index f072116a2e27..5d6a1f80b0c4 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -152043,7 +152043,6 @@ @article{cvl-ew-12 Pages = {215--224}, Year = {2012}, Url = {https://monge.univ-mlv.fr/~colinde/pub/09edgewidth.pdf} -} @inproceedings{tang2009interactive, title={Interactive Hausdorff distance computation for general polygonal models}, @@ -152054,26 +152053,4 @@ @inproceedings{tang2009interactive pages={74}, year={2009}, organization={ACM} -} - -@article{lachaud2020, - author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert and David Coeurjolly}, - journal = {Computer Graphics Forum (Proceedings of Symposium on Geometry Processing)}, - number = {5}, - title = {Interpolated corrected curvature measures for polygonal surfaces}, - volume = {39}, - month = jul, - year = {2020} -} - -@article{lachaud2022 - author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert}, - journal = {Discrete & Computational Geometry}, - title = {Corrected Curvature Measures}, - volume = {68}, - pages = {477-524}, - month = jul, - year = {2022}, - url = {https://doi.org/10.1007/s00454-022-00399-4} -} - +} \ No newline at end of file diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 9773216f3cb6..d81a1f6029e4 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -940,7 +940,7 @@ not provide storage for the normals. \section PMPICC Computing Curvatures This package provides methods to compute curvatures on polygonal meshes based on Interpolated -Corrected Curvatures on Polyhedral Surfaces \cgalCite{lachaud2020}. This includes mean curvature, +Corrected Curvatures on Polyhedral Surfaces \cgalCite{cgal:lrtc-iccmps-20}. This includes mean curvature, Gaussian curvature, principal curvatures and directions. These can be computed on triangle meshes, quad meshes, and meshes with n-gon faces (for n-gons, the centroid must be inside the n-gon face). The algorithms used prove to work well in general. Also, on meshes with noise on vertex positions, @@ -955,10 +955,10 @@ in each direction is called the principal curvature: \f$ k_1 \f$ and \f$ k_2 \f$ curvatures). Curvature is usually expressed as scalar quantities like the mean curvature \f$ H \f$ and the Gaussian curvature \f$ K \f$ which are defined in terms of the principal curvatures. -The algorithms are based on the two papers \cgalCite{lachaud2022} and \cgalCite{lachaud2020}. They -introduce a new way to compute curvatures on polygonal meshes. The main idea in \cgalCite{lachaud2022} is +The algorithms are based on the two papers \cgalCite{cgal:lrt-ccm-22} and \cgalCite{cgal:lrtc-iccmps-20}. They +introduce a new way to compute curvatures on polygonal meshes. The main idea in \cgalCite{cgal:lrt-ccm-22} is based on decoupling the normal information from the position information, which is useful for dealing with -digital surfaces, or meshes with noise on vertex positions. \cgalCite{lachaud2020} introduces some +digital surfaces, or meshes with noise on vertex positions. \cgalCite{cgal:lrtc-iccmps-20} introduces some extensions to this framework. As it uses linear interpolation on the corrected normal vector field to derive new closed form equations for the corrected curvature measures. These interpolated curvature measures are the first step for computing the curvatures. For a triangle \f$ \tau_{ijk} \f$, @@ -1285,7 +1285,7 @@ is covered by a set of prisms, where each prism is an offset for an input triang That is, the implementation in \cgal does not use indirect predicates. The interpolated corrected curvatures were implemented during GSoC 2022. This was implemented by Hossam Saeed and under -supervision of David Coeurjolly, Jaques-Olivier Lachaud, and Sébastien Loriot. The implementation is based on \cgalCite{lachaud2020}. +supervision of David Coeurjolly, Jaques-Olivier Lachaud, and Sébastien Loriot. The implementation is based on \cgalCite{cgal:lrtc-iccmps-20}. DGtal's implementation was also used as a reference during the project. From 72fd73e2b7f4db9e9b4c1f20cdfaddfafe6ee05f Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:51:28 +0300 Subject: [PATCH 0688/1398] Update geom.bib --- Documentation/doc/biblio/geom.bib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/biblio/geom.bib b/Documentation/doc/biblio/geom.bib index 5d6a1f80b0c4..969a1a79b5ba 100644 --- a/Documentation/doc/biblio/geom.bib +++ b/Documentation/doc/biblio/geom.bib @@ -152053,4 +152053,4 @@ @inproceedings{tang2009interactive pages={74}, year={2009}, organization={ACM} -} \ No newline at end of file +} From 5ddcf716b618c7683e6427e6310e7b361d6177d1 Mon Sep 17 00:00:00 2001 From: hoskillua <47090776+hoskillua@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:52:34 +0300 Subject: [PATCH 0689/1398] fixed order in bib --- Documentation/doc/biblio/cgal_manual.bib | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 453f1968678e..5fc304486601 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -1331,6 +1331,16 @@ @INPROCEEDINGS{cgal:la-srpss-13 address = {Girona, Spain} } +@article{cgal:lm-clscm-12, + author = {Lafarge, Florent and Mallet, Clement}, + title = {{Creating large-scale city models from 3D-point clouds: a robust approach with hybrid representation}}, + journal = {International Journal of Computer Vision}, + volume = {99}, + number = {1}, + pages = {69-85}, + year = {2012}, +} + @article{cgal:lrtc-iccmps-20, author = {Jacques-Olivier Lachaud and Pascal Romon and Boris Thibert and David Coeurjolly}, journal = {Computer Graphics Forum (Proceedings of Symposium on Geometry Processing)}, @@ -1354,16 +1364,6 @@ @article{cgal:lrt-ccm-22 url = {https://doi.org/10.1007/s00454-022-00399-4} } -@article{cgal:lm-clscm-12, - author = {Lafarge, Florent and Mallet, Clement}, - title = {{Creating large-scale city models from 3D-point clouds: a robust approach with hybrid representation}}, - journal = {International Journal of Computer Vision}, - volume = {99}, - number = {1}, - pages = {69-85}, - year = {2012}, -} - @inproceedings{ cgal:lt-fmeps-98, author = "Peter Lindstrom and Greg Turk", title = "Fast and memory efficient polygonal simplification", From 7beae3e8beb8d400d7e997471467198d14ab8e7c Mon Sep 17 00:00:00 2001 From: ange-clement Date: Wed, 6 Sep 2023 16:19:02 +0200 Subject: [PATCH 0690/1398] Made images colors adapt to their base color --- .../demo/Polyhedron/Scene_image_item.cpp | 27 ++++++++++++------- Polyhedron/demo/Polyhedron/Scene_image_item.h | 2 ++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp index e9999831d4e9..6969b172e378 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp @@ -24,7 +24,7 @@ template class Image_accessor { public: - Image_accessor(const Image& im, int dx=1, int dy=1, int dz=1); + Image_accessor(const Image& im, int dx=1, int dy=1, int dz=1, const QColor& default_color = QColor()); bool is_vertex_active(std::size_t i, std::size_t j, std::size_t k) const; const QColor& vertex_color(std::size_t i, std::size_t j, std::size_t k) const; @@ -64,12 +64,12 @@ class Image_accessor }; template -Image_accessor::Image_accessor(const Image& im, int dx, int dy, int dz) +Image_accessor::Image_accessor(const Image& im, int dx, int dy, int dz, const QColor& default_color) : im_(&im) , dx_(dx) , dy_(dy) , dz_(dz) -, default_color_() +, default_color_(default_color) , colors_() { const std::size_t xdim = im_->xdim(); @@ -88,14 +88,15 @@ Image_accessor::Image_accessor(const Image& im, int dx, int dy, int d } } - double i=0; - const double starting_hue = 45./360.; // magenta + const double nb_Colors = colors_.size()+1; + double i=1; + const double starting_hue = default_color.hueF(); for ( auto it = colors_.begin(), end = colors_.end() ; it != end ; ++it, i += 1.) { - double hue = starting_hue + 1./double(colors_.size()) * i; + double hue = starting_hue + 1./nb_Colors * i; if ( hue > 1. ) { hue -= 1.; } - it->second = QColor::fromHsvF(hue, .75, .75); + it->second = QColor::fromHsvF(hue, default_color.saturationF(), default_color.valueF()); } } @@ -753,6 +754,11 @@ void Scene_image_item::drawEdges(Viewer_interface *viewer) const bool Scene_image_item::isGray() { return d->is_hidden;} +void Scene_image_item::setColor(QColor c) { + color_ = c; + invalidateOpenGLBuffers(); +} + void Scene_image_item::invalidateOpenGLBuffers() { setBuffersFilled(false); @@ -779,9 +785,9 @@ void Scene_image_item::initializeBuffers(Viewer_interface *v) const template internal::Vertex_buffer_helper* -init_helper(const Image &im, int dx, int dy, int dz, bool is_ogl_4_3) +init_helper(const Image &im, int dx, int dy, int dz, bool is_ogl_4_3, const QColor& default_color = QColor()) { - internal::Image_accessor image_data_accessor(im, dx, dy, dz); + internal::Image_accessor image_data_accessor(im, dx, dy, dz, default_color); return new internal::Vertex_buffer_helper_impl(std::move(image_data_accessor), is_ogl_4_3); } @@ -800,7 +806,8 @@ void Scene_image_item::computeElements() const CGAL_IMAGE_IO_CASE(m_image->image(), d->helper = init_helper(*m_image, d->m_voxel_scale, d->m_voxel_scale, d->m_voxel_scale, - d->is_ogl_4_3)); + d->is_ogl_4_3, + color_)); d->helper->fill_buffer_data(); getTriangleContainer(0)->allocate( Tc::Smooth_vertices, diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.h b/Polyhedron/demo/Polyhedron/Scene_image_item.h index fadffb352c45..d841f4b4f33d 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.h @@ -49,6 +49,8 @@ class SCENE_IMAGE_ITEM_EXPORT Scene_image_item void set_image_weights(const Image& img, const float sigma); float sigma_weights() const; + void setColor(QColor c); + void invalidateOpenGLBuffers(); void initializeBuffers(Viewer_interface *) const; void computeElements() const; From 6f8116c4d55cb4fd691ea4e02e003f468b8afd68 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Wed, 6 Sep 2023 18:24:27 +0200 Subject: [PATCH 0691/1398] Update mesh coloring. Visible surface patches uses the domains' colors. The mesh generated from an image has now the same color (if their base color is the same). --- .../Polyhedron/Scene_triangulation_3_item.cpp | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp index 7dc8c51f1ce9..837d859aa973 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp @@ -442,6 +442,7 @@ struct Scene_triangulation_3_item_priv { typedef std::set Indices; Indices surface_patch_indices_; Indices subdomain_indices_; + std::unordered_map visible_surface_patch_to_subdomain; std::unordered_map id_to_compact; QSlider* tet_Slider; bool is_filterable; @@ -643,6 +644,7 @@ Scene_triangulation_3_item::triangulation_changed() // Fill indices map and get max subdomain value d->surface_patch_indices_.clear(); d->subdomain_indices_.clear(); + d->visible_surface_patch_to_subdomain.clear(); d->visible_subdomain.clear(); d->id_to_compact.clear(); @@ -664,7 +666,18 @@ Scene_triangulation_3_item::triangulation_changed() end = triangulation().finite_facets_end(); fit != end; ++fit) { max = (std::max)(max, fit->first->surface_patch_index(fit->second)); - d->surface_patch_indices_.insert(fit->first->surface_patch_index(fit->second)); + int index = fit->first->surface_patch_index(fit->second); + d->surface_patch_indices_.insert(index); + int dom0 = fit->first->subdomain_index(); + int dom1 = fit->first->neighbor(fit->second)->subdomain_index(); + if (dom0 == 0) // if cell is not in complex + { + d->visible_surface_patch_to_subdomain[index] = dom1; + } + else if (dom1 == 0) // if opposite cell is not in complex + { + d->visible_surface_patch_to_subdomain[index] = dom0; + } } d->colors.resize(max + 1); @@ -882,12 +895,23 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c) } const size_type nb_patch_indices = surface_patch_indices_.size(); i = 0; + double patch_hsv_value = fmod(c.valueF() + .5, 1.); for (Indices::iterator it = surface_patch_indices_.begin(), end = surface_patch_indices_.end(); it != end; ++it, i += 1.) { double hue = c.hueF() + 1. / double(nb_patch_indices) * i; if (hue > 1) { hue -= 1.; } - colors[*it] = QColor::fromHsvF(hue, c.saturationF(), c.valueF()); + colors[*it] = QColor::fromHsvF(hue, c.saturationF(), patch_hsv_value); + } + + const size_type nb_visible_patch_indices = visible_surface_patch_to_subdomain.size(); + i = 0; + for (std::unordered_map::iterator it = visible_surface_patch_to_subdomain.begin(), + end = visible_surface_patch_to_subdomain.end(); it != end; ++it, i += 1.) + { + double hue = c.hueF() + 1. / double(nb_patch_indices) * i; + if (hue > 1) { hue -= 1.; } + colors[it->first] = colors_subdomains[it->second]; } } From c059ee5be3f9014ca433d9d6437b464909f3f4e4 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Thu, 7 Sep 2023 10:06:25 +0200 Subject: [PATCH 0692/1398] Updated scene mesh creation The color is initialized to the base item's color. --- Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 59c687fb8a40..ca47e02782a9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -1037,7 +1037,7 @@ treat_result(Scene_item& source_item, float((bbox.ymin() + bbox.ymax())/2.f), float((bbox.zmin() + bbox.zmax())/2.f)); - result_item->setColor(default_mesh_color); + result_item->setColor(source_item.color()); result_item->setRenderingMode(source_item.renderingMode()); result_item->set_data_item(&source_item); From 3d49105c91b5d7f3b7b9400f25b59118abfb5cd1 Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 7 Sep 2023 14:57:16 +0200 Subject: [PATCH 0693/1398] Incorrect closing HTML comment Newer versions of doxygen are more restrictive (and following the rules) in respect to the end comment of a HTML type of comment, i.e. ``, so parts of the paragraphs were missing (Triangulation/index.html and Triangulation/group___pkg_triangulations_ref.html) See also https://www.w3.org/TR/2006/REC-xml11-20060816/#sec-comments --- Triangulation/doc/Triangulation/PackageDescription.txt | 2 +- Triangulation/doc/Triangulation/Triangulation.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Triangulation/doc/Triangulation/PackageDescription.txt b/Triangulation/doc/Triangulation/PackageDescription.txt index 0b5d4c7b5ed3..2ef98bf9d843 100644 --- a/Triangulation/doc/Triangulation/PackageDescription.txt +++ b/Triangulation/doc/Triangulation/PackageDescription.txt @@ -67,7 +67,7 @@ of the underlying Euclidean space \f$ \mathbb{R}^d\f$. The neighbors of a full cell are also indexed in such a way that the neighbor indexed by \f$ i\f$ is opposite to the vertex with the same index. ----> +--> \cgalClassifedRefPages diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index 452891fa4158..d45c8cd1ba8a 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -41,7 +41,7 @@ that is pure, connected and without boundaries nor singularities. The dimension of the triangulation is the dimension of its maximal simplices. - + In the sequel, we will call these maximal simplices full cells. A face of a simplex is a subset of this simplex. A proper face of a simplex is a strict subset of this simplex. @@ -136,12 +136,12 @@ Possible values of \f$d\f$ (the current dimension of the triangulation) i triangulation data structure.
        \f$d=-1\f$
        This corresponds to an abstract simplicial complex reduced to a single vertex. - +
        \f$d=0\f$
        This corresponds to an abstract simplicial complex including two vertices, each corresponding to a full cell; the two full cells being neighbors of each other. This is the unique triangulation of the \f$ 0\f$-sphere. - +
        \f$ 0< d \le D\f$
        This corresponds to a triangulation of the sphere \f$ \mathbb{S}^d\f$.
    @@ -260,7 +260,7 @@ Therefore, the reader will make the best use of this example by reading it slowly, together with the reference manual documentation of the methods that are called (see here: `TriangulationDataStructure`) and by trying to understand the various -`assert(...)` statements.---> +`assert(...)` statements. --> \cgalExample{triangulation_data_structure_static.cpp} From a3148fb8f5d4cea082c5ea03caab9d72480b30cc Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 7 Sep 2023 17:33:26 +0200 Subject: [PATCH 0694/1398] issue #7701 Appearance of "Set of Faces" in documentation. Remove gray background and get some indentation (Note this proposed pull request needs the proposed pull request #7700) --- Triangulation/doc/Triangulation/Triangulation.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Triangulation/doc/Triangulation/Triangulation.txt b/Triangulation/doc/Triangulation/Triangulation.txt index 452891fa4158..0fdc6a4d6c06 100644 --- a/Triangulation/doc/Triangulation/Triangulation.txt +++ b/Triangulation/doc/Triangulation/Triangulation.txt @@ -130,7 +130,7 @@ Two full cells \f$ \sigma\f$ and \f$ \sigma'\f$ sharing a facet are called neighbors. A full cell has always exactly \f$ d+1\f$ neighbors. Possible values of \f$d\f$ (the current dimension of the triangulation) include -
    +\par
    \f$d=-2\f$
    This corresponds to an empty triangulation data structure. @@ -145,7 +145,6 @@ triangulation of the \f$ 0\f$-sphere.
    \f$ 0< d \le D\f$
    This corresponds to a triangulation of the sphere \f$ \mathbb{S}^d\f$.
    -
    ## The `Triangulation_data_structure` Class ## From 8afc4347b43414e19fdebdc5925181a102293ae6 Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 7 Sep 2023 17:43:05 +0200 Subject: [PATCH 0695/1398] issue #7702 Appearance of " Hilbert Sorting" in documentation. Remove gray background and get some indentation --- Spatial_sorting/doc/Spatial_sorting/Spatial_sorting.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Spatial_sorting/doc/Spatial_sorting/Spatial_sorting.txt b/Spatial_sorting/doc/Spatial_sorting/Spatial_sorting.txt index a97ef3ead181..6dd4d3cef740 100644 --- a/Spatial_sorting/doc/Spatial_sorting/Spatial_sorting.txt +++ b/Spatial_sorting/doc/Spatial_sorting/Spatial_sorting.txt @@ -42,18 +42,16 @@ to the unit square \f$ [0,1]^2\f$, such that \f$ f(0)=(0,0)\f$ and \f$ f(1)=(1,0 in the following way: the unit square is subdivided in four such that -
    +\par \f$ f([0,\frac{1}{4}])=[0,\frac{1}{2}]^2\f$, \f$ f([\frac{1}{4},\frac{1}{2}])=[0,\frac{1}{2}]\times[\frac{1}{2},1]\f$, \f$ f([\frac{1}{2},\frac{3}{4}])=[\frac{1}{2},1]^2\f$, and \f$ f([\frac{3}{4},1])=[\frac{1}{2},1]\times[0,\frac{1}{2}].\f$ - -\f$ f(\frac{1}{4})=(0,\frac{1}{2})\f$ - +
    +\f$ f(\frac{1}{4})=(0,\frac{1}{2})\f$, \f$ f(\frac{1}{2})=(\frac{1}{2},\frac{1}{2})\f$, and \f$ f(\frac{3}{4})=(1,\frac{1}{2})\f$. -
    Then each square is subdivided in the same way recursively. \cgalFigureRef{Spatial_sorting_fig_Hilbert8} illustrates this process. From 3ef293b5bd21e31567fcef8557e266091503f284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 8 Sep 2023 11:41:14 +0200 Subject: [PATCH 0696/1398] Update to new cgalModels --- .../include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h index 94bcd7ab5f12..c551716d618e 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/Remeshing_cell_base_3.h @@ -35,7 +35,7 @@ It has to be a model of the concept `RemeshingTriangulationTraits_3`. \tparam Cb is a cell base class from which `Remeshing_cell_base_3` derives. It must be a model of the `SimplicialMeshCellBase_3` concept. -\cgalModels `RemeshingCellBase_3` +\cgalModels{RemeshingCellBase_3} */ template Date: Fri, 8 Sep 2023 11:49:32 +0200 Subject: [PATCH 0697/1398] fix warnings (and ASAN errors) --- .../Arrangement_on_surface_2/PropertyValueDelegate.cpp | 2 +- .../examples/Arrangement_on_surface_2/draw_arr.cpp | 8 +++----- .../include/CGAL/Curved_kernel_via_analysis_2/Point_2.h | 8 ++++---- .../demo/Periodic_3_triangulation_3/MainWindow.h | 6 +++--- .../demo/Periodic_Lloyd_3/MainWindow.cpp | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PropertyValueDelegate.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PropertyValueDelegate.cpp index 0f2dbb004986..ba47beb81df0 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PropertyValueDelegate.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PropertyValueDelegate.cpp @@ -22,7 +22,7 @@ PropertyValueDelegate::PropertyValueDelegate( QObject* parent ): QItemEditorFactory* factory = new QItemEditorFactory; QItemEditorCreatorBase* creator = new QStandardItemEditorCreator< PositiveSpinBox >( ); - factory->registerEditor( QVariant::UInt, creator ); + factory->registerEditor( QMetaType::UInt, creator ); this->setItemEditorFactory( factory ); } diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp index 8c3c9b4daf85..91da88edc68a 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/draw_arr.cpp @@ -22,8 +22,8 @@ std::tuple hsv_to_rgb(float hue, float sat, float value) { float red, green, blue; float fc = value * sat; // Chroma - float hue_prime = fmod(hue / 60.0f, 6); - float fx = fc * (1.0f - fabs(fmod(hue_prime, 2) - 1.0)); + float hue_prime = fmod(hue / 60.0f, 6.f); + float fx = fc * (1.0f - fabs(fmod(hue_prime, 2.f) - 1.f)); float fm = value - fc; if(0 <= hue_prime && hue_prime < 1) { @@ -104,9 +104,7 @@ int main() { float h = 360.0f * id++ / arr.number_of_faces(); float s = 0.5; float v = 0.5; - float r, g, b; - typedef unsigned char uchar; - std::tie(r, g, b) = hsv_to_rgb(h, s, v); + auto [r, g, b] = hsv_to_rgb(h, s, v); return CGAL::IO::Color(r,g,b); }, "hsv colors", true); diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index 789f24b841e4..f64c67b70eac 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -736,13 +736,13 @@ class Point_2 : swallow(is, '('); // read values - is >> iformat(rep._m_xy); + is >> IO::iformat(rep._m_xy); swallow(is, ','); - is >> iformat(rep._m_x); + is >> IO::iformat(rep._m_x); swallow(is, ','); - is >> iformat(rep._m_curve); + is >> IO::iformat(rep._m_curve); swallow(is, ','); - is >> iformat(rep._m_arcno); + is >> IO::iformat(rep._m_arcno); swallow(is, ','); is >> rep._m_location; diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h index 0972fe6db4c1..79b3e5bec140 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h @@ -103,15 +103,15 @@ class MainWindow : public QMainWindow } ~MainWindow() { - delete(ui); - delete(s); process->close(); delete(process); + delete(s); + delete(ui); } public Q_SLOTS: void help() { - QString app = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QString app = QLibraryInfo::path(QLibraryInfo::BinariesPath) + QDir::separator(); #if !defined(Q_OS_MAC) app += QString("assistant"); diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp index 8287214bbcfa..f4eb7aeb793a 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/MainWindow.cpp @@ -204,7 +204,7 @@ MainWindow::newPoints(int n) } void MainWindow::help() { - QString app = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QString app = QLibraryInfo::path(QLibraryInfo::BinariesPath) + QDir::separator(); #if !defined(Q_OS_MAC) app += QString("assistant"); From 4addbd6ddc2b9064617c4374efa3e60aa4f46d73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 05:35:00 +0000 Subject: [PATCH 0698/1398] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build_doc.yml | 2 +- .github/workflows/checks.yml | 2 +- .github/workflows/cmake-all.yml | 4 ++-- .github/workflows/delete_doc.yml | 2 +- .github/workflows/demo.yml | 8 ++++---- .github/workflows/list_workflow_last_run.yml | 2 +- .github/workflows/reuse.yml | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 85158cfc285e..b629c1870cf0 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -60,7 +60,7 @@ jobs: content: 'rocket' }) - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: "checkout branch" if: steps.get_round.outputs.result != 'stop' with: diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 0af6e276e6ed..78d96aa94dbe 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: | .github/install.sh diff --git a/.github/workflows/cmake-all.yml b/.github/workflows/cmake-all.yml index d0507b4d4305..b9e7226c62dd 100644 --- a/.github/workflows/cmake-all.yml +++ b/.github/workflows/cmake-all.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: sudo apt-get install -y libboost-dev libboost-program-options-dev libmpfr-dev libeigen3-dev - name: configure all @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: sudo bash -e .github/install.sh - name: configure all diff --git a/.github/workflows/delete_doc.yml b/.github/workflows/delete_doc.yml index 38f5ab445ac2..0910e74ef3be 100644 --- a/.github/workflows/delete_doc.yml +++ b/.github/workflows/delete_doc.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: delete directory run: | set -x diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml index 123458ebe047..a98dfba56b83 100644 --- a/.github/workflows/demo.yml +++ b/.github/workflows/demo.yml @@ -9,7 +9,7 @@ jobs: batch_1: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: .github/install.sh - name: run1 @@ -17,7 +17,7 @@ jobs: batch_2: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: .github/install.sh - name: run2 @@ -25,7 +25,7 @@ jobs: batch_3: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: .github/install.sh - name: run3 @@ -33,7 +33,7 @@ jobs: batch_4: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: install dependencies run: .github/install.sh - name: run4 diff --git a/.github/workflows/list_workflow_last_run.yml b/.github/workflows/list_workflow_last_run.yml index 79b1d2c06348..d12b758e62ba 100644 --- a/.github/workflows/list_workflow_last_run.yml +++ b/.github/workflows/list_workflow_last_run.yml @@ -12,7 +12,7 @@ messages: ${{ steps.cat_output.outputs.message }} steps: - name: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: run script run: | chmod +x ./Scripts/developer_scripts/list_cgal_workflows_last_run.sh diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml index 8b0bba4260ee..c55ba6df40d9 100644 --- a/.github/workflows/reuse.yml +++ b/.github/workflows/reuse.yml @@ -10,7 +10,7 @@ jobs: reuse: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: REUSE version uses: fsfe/reuse-action@v2 with: From a4136707b24d991c7694018b6d0ac83e7da82757 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 11 Sep 2023 09:51:06 +0200 Subject: [PATCH 0699/1398] More CMakeLists Updates for QT6 --- GraphicsView/demo/Generator/CMakeLists.txt | 2 +- .../Periodic_3_triangulation_3/CMakeLists.txt | 24 ++++--------------- .../demo/Periodic_Lloyd_3/CMakeLists.txt | 23 ++++-------------- .../CMakeLists.txt | 9 +++---- .../Polyline_simplification_2/CMakeLists.txt | 2 -- .../Triangulation_on_sphere_2/CMakeLists.txt | 17 +++---------- 6 files changed, 17 insertions(+), 60 deletions(-) diff --git a/GraphicsView/demo/Generator/CMakeLists.txt b/GraphicsView/demo/Generator/CMakeLists.txt index cea168a2c9d9..6a3c0d9a4ac0 100644 --- a/GraphicsView/demo/Generator/CMakeLists.txt +++ b/GraphicsView/demo/Generator/CMakeLists.txt @@ -5,7 +5,7 @@ project(Generator_Demo) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index d2cfa5ea7706..da044276aec7 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -4,20 +4,11 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Periodic_3_triangulation_3_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - # Find CGAL find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Widgets OpenGL OpenGLWidgets Help ToolsTools) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL Help ToolsTools) if(Qt6_FOUND) add_definitions(-DQT_NO_KEYWORDS) @@ -30,11 +21,9 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND AND TARGET ${CGAL_QCOLLECTIONGENERATOR_TARGET}) - # UI files (Qt Designer files) - qt6_wrap_ui(UI_FILES MainWindow.ui) - - # qrc files (resource files) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Periodic_3_triangulation_3.qrc) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) # use the Qt MOC preprocessor on classes that derive from QObject qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Scene.cpp") @@ -52,7 +41,7 @@ if(CGAL_Qt6_FOUND ${CMAKE_CURRENT_BINARY_DIR}/Periodic_3_triangulation_3.qhc) # The executable itself - add_executable( + qt_add_executable( periodic_3_triangulation_3_demo Scene.cpp moc_Scene.cpp @@ -61,9 +50,6 @@ if(CGAL_Qt6_FOUND periodic_3_triangulation_3_demo.cpp MainWindow.ui moc_MainWindow.cpp - ${UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES} Periodic_3_triangulation_3.qhc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS periodic_3_triangulation_3_demo) diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt index 03a49088d023..038cb121393f 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -4,14 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Periodic_Lloyd_3_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. @@ -19,7 +11,7 @@ set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGL OpenGLWidgets Help ToolsTools) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL Help ToolsTools) set(CGAL_QCOLLECTIONGENERATOR_TARGET Qt6::qhelpgenerator) @@ -29,11 +21,8 @@ if(CGAL_Qt6_FOUND include_directories(BEFORE ./) - # ui file, created with Qt Designer - qt6_wrap_ui(uis MainWindow.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Periodic_Lloyd_3.qrc) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) if(DEFINED QT_QCOLLECTIONGENERATOR_EXECUTABLE) @@ -51,15 +40,13 @@ if(CGAL_Qt6_FOUND ${CMAKE_CURRENT_BINARY_DIR}/Periodic_Lloyd_3.qhc WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - add_executable( + qt_add_executable( Periodic_Lloyd_3 Periodic_Lloyd_3.qhc Periodic_Lloyd_3.cpp MainWindow.cpp Viewer.cpp - ${uis} - ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + Periodic_Lloyd_3.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Periodic_Lloyd_3) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index cda66cbac6e7..d57ee2e529bc 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -20,14 +20,11 @@ if((CGAL_Core_FOUND OR LEDA_FOUND) include_directories(BEFORE include) - # ui files, created with Qt Designer - qt6_wrap_ui(UIS P4HDT2.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(RESOURCE_FILES Main_resources.qrc) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) # cpp files - add_executable(P4HDT2 P4HDT2.cpp ${RESOURCE_FILES} ${UIS}) + qt_add_executable(P4HDT2 P4HDT2.cpp P4HDT2.ui) target_link_libraries(P4HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) if(TARGET CGAL::CGAL_Core) diff --git a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt index db32bac7b395..e8ffecc2a3dd 100644 --- a/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt +++ b/Polyline_simplification_2/demo/Polyline_simplification_2/CMakeLists.txt @@ -17,8 +17,6 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - - # The executable itself. qt_add_executable( Polyline_simplification_2 Polyline_simplification_2.cpp Polyline_simplification_2.ui Polyline_simplification_2.qrc) diff --git a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt index 6499a9d7ffbb..5fc26c32a7f7 100644 --- a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt +++ b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/CMakeLists.txt @@ -11,20 +11,12 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() # Find CGAL and CGAL Qt6 find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets OpenGL) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) @@ -33,12 +25,9 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND AND TARGET CGAL::Eigen3_support) # Include this package's headers first include_directories(BEFORE ./ ./include) - # ui file, created with Qt Designer - qt6_wrap_ui( uis Mainwindow.ui ) - - #qt6_generate_moc( main.cpp Mainwindow.moc) + set(CMAKE_AUTOUIC ON) - add_executable ( Triangulation_on_sphere_2_Demo main.cpp Viewer.cpp ${uis}) + qt_add_executable ( Triangulation_on_sphere_2_Demo main.cpp Viewer.cpp) add_to_cached_list( CGAL_EXECUTABLE_TARGETS Triangulation_on_sphere_2_Demo ) From 0d7280ea63ac21e406a9608871f4e6e1f0abc5d5 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Mon, 11 Sep 2023 16:10:20 +0200 Subject: [PATCH 0700/1398] CMakeLists updates for Qt6 --- .../Hyperbolic_triangulation_2/CMakeLists.txt | 20 ++++-------- .../demo/Linear_cell_complex/CMakeLists.txt | 32 +++++-------------- Mesh_2/demo/Mesh_2/CMakeLists.txt | 5 --- .../Periodic_3_triangulation_3/CMakeLists.txt | 2 +- .../demo/Periodic_Lloyd_3/CMakeLists.txt | 3 +- .../CMakeLists.txt | 2 +- .../demo/Triangulation_3/CMakeLists.txt | 2 +- 7 files changed, 19 insertions(+), 47 deletions(-) diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index 0c4ea157c891..9d46e7227294 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -7,33 +7,27 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6) find_package(LEDA QUIET) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND)) - # ui files, created with Qt Designer - qt6_wrap_ui(UIS HDT2.ui) - qt6_add_resources(RESOURCE_FILES resources/Delaunay_triangulation_2.qrc) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # cpp files - add_executable ( HDT2 HDT2.cpp ${CGAL_Qt6_RESOURCE_FILES} ${RESOURCE_FILES} ${UIS}) + qt_add_executable ( HDT2 HDT2.cpp) target_include_directories(HDT2 PRIVATE ./ ./include) add_to_cached_list( CGAL_EXECUTABLE_TARGETS HDT2 ) - target_link_libraries ( HDT2 CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) + target_link_libraries ( HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) if(CGAL_Core_FOUND) - target_link_libraries ( HDT2 CGAL::CGAL_Core) + target_link_libraries ( HDT2 PRIVATE CGAL::CGAL_Core) else() - target_link_libraries ( HDT2 ${LEDA_LIBRARIES}) + target_link_libraries ( HDT2 PRIVATE ${LEDA_LIBRARIES}) endif() include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index c001d50f23ff..b152c55bd9da 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -5,18 +5,8 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Linear_cell_complex_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) ## To add expensive tests # add_definitions("-DCGAL_CHECK_EXPENSIVE") @@ -42,7 +32,7 @@ add_definitions(-DCMAP_WITH_INDEX) # to use cc with index (handle otherwise) ################## find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) -find_package(Qt6 COMPONENTS Widgets OpenGL OpenGLWidgets) +find_package(Qt6 COMPONENTS Widgets OpenGL) if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) @@ -51,17 +41,14 @@ if(NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) else() add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - # ui file, created with Qt Designer - qt6_wrap_ui(uis MainWindow.ui CreateMesh.ui CreateMenger.ui - CreateSierpinskiCarpet.ui CreateSierpinskiTriangle.ui) - - # qrc files (resources files, that contain icons, at least) - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES ./Linear_cell_complex_3.qrc) - - add_executable( + qt_add_executable( Linear_cell_complex_3_demo Linear_cell_complex_3_demo.cpp + Linear_cell_complex_3.qrc MainWindow.cpp Viewer.cpp Linear_cell_complex_3_subdivision.cpp @@ -69,15 +56,12 @@ else() typedefs.h import_moka.h MainWindow.h - Viewer.h - ${uis} - ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + Viewer.h) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Linear_cell_complex_3_demo) target_link_libraries(Linear_cell_complex_3_demo - PUBLIC CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::OpenGL) + PUBLIC CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Linear_cell_complex_3_demo) diff --git a/Mesh_2/demo/Mesh_2/CMakeLists.txt b/Mesh_2/demo/Mesh_2/CMakeLists.txt index 6619032f709f..5087c477a12d 100644 --- a/Mesh_2/demo/Mesh_2/CMakeLists.txt +++ b/Mesh_2/demo/Mesh_2/CMakeLists.txt @@ -4,11 +4,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Mesh_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - find_package(CGAL REQUIRED) include(${CGAL_USE_FILE}) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index da044276aec7..22c26c48986b 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -55,7 +55,7 @@ if(CGAL_Qt6_FOUND add_to_cached_list(CGAL_EXECUTABLE_TARGETS periodic_3_triangulation_3_demo) target_link_libraries(periodic_3_triangulation_3_demo - PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::OpenGL) + PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(periodic_3_triangulation_3_demo) diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt index 038cb121393f..cb944392edf4 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -50,8 +50,7 @@ if(CGAL_Qt6_FOUND add_to_cached_list(CGAL_EXECUTABLE_TARGETS Periodic_Lloyd_3) - target_link_libraries(Periodic_Lloyd_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 - Qt6::OpenGLWidgets Qt6::OpenGL) + target_link_libraries(Periodic_Lloyd_3 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGL) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Periodic_Lloyd_3) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index d57ee2e529bc..d3ba88394b2f 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -13,7 +13,7 @@ include(${CGAL_USE_FILE}) find_package(LEDA QUIET) -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if((CGAL_Core_FOUND OR LEDA_FOUND) AND Qt6_FOUND AND CGAL_Qt6_FOUND) diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index 1058b455a761..ab246bc44268 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -57,7 +57,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS T3_demo) target_link_libraries(T3_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) - target_link_libraries(T3_demo PRIVATE Qt6::OpenGLWidgets Qt6::OpenGL) + target_link_libraries(T3_demo PRIVATE Qt6::OpenGL) if(TARGET CGAL::TBB_support) target_link_libraries(T3_demo PUBLIC CGAL::TBB_support) endif() From b77659beb202fc494a5b1c18c28218be1b3429d5 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 11 Sep 2023 17:21:37 +0200 Subject: [PATCH 0701/1398] Added support for vtk images (vti format) --- .../Polyhedron/Plugins/Mesh_3/CMakeLists.txt | 4 ++-- .../Plugins/Mesh_3/Io_image_plugin.cpp | 23 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt index 2cc3f58854f2..706ce2d36439 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/CMakeLists.txt @@ -34,14 +34,14 @@ if(ITK_FOUND) target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support) endif(ITK_FOUND) -find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) +find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage vtkIOXML NO_MODULE) if(VTK_FOUND) if(VTK_USE_FILE) include(${VTK_USE_FILE}) endif() if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) if(TARGET VTK::IOImage) - set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral) + set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral VTK::IOXML) endif() if(NOT VTK_LIBRARIES) message(STATUS "NOTICE: DICOM files (.dcm) require the VTK libraries, and will not be readable.") diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 80eedf998fa9..32ec637c9210 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -1089,6 +1090,7 @@ QString Io_image_plugin::nameFilters() const return QString("Inrimage files (*.inr *.inr.gz) ;; " "Analyze files (*.hdr *.img *.img.gz) ;; " "Stanford Exploration Project files (*.H *.HH) ;; " + "VTK image files (*.vti) ;; " "NRRD image files (*.nrrd) ;; " "NIFTI image files (*.nii *.nii.gz)"); } @@ -1128,8 +1130,25 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) QApplication::restoreOverrideCursor(); Image* image = new Image; + // read a vti file + if(fileinfo.suffix() == "vti") + { +#ifdef CGAL_USE_VTK + vtkNew reader; + reader->SetFileName(fileinfo.filePath().toUtf8()); + reader->Update(); + auto vtk_image = reader->GetOutput(); + vtk_image->Print(std::cerr); + *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data +#else + CGAL::Three::Three::warning("VTK is required to read VTI files"); + delete image; + return QList(); +#endif + } + // read a nrrd file - if(fileinfo.suffix() == "nrrd") + else if(fileinfo.suffix() == "nrrd") { #ifdef CGAL_USE_VTK vtkNew reader; @@ -1146,7 +1165,7 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) } // read a NIFTI file - if(fileinfo.suffix() == "nii" + else if(fileinfo.suffix() == "nii" || ( fileinfo.suffix() == "gz" && fileinfo.fileName().endsWith(QString(".nii.gz"), Qt::CaseInsensitive))) { From 303282aec6841421ea9d623670d89f1906866fa5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 11 Sep 2023 17:33:34 +0200 Subject: [PATCH 0702/1398] fix "Save as..." in CGAL Lab --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 5829ffb5e22c..1714b547af9e 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1948,10 +1948,10 @@ void MainWindow::on_actionSaveAs_triggered() return; } - Q_FOREACH(QString string, filters) + for(QString string: filters) { QStringList sl = string.split(";;"); - Q_FOREACH(QString s, sl){ + for(QString s: sl){ QRegularExpressionMatch match = extensions.match(s); if(match.hasMatch()) filter_exts.append(match.capturedTexts()); @@ -1987,9 +1987,9 @@ void MainWindow::on_actionSaveAs_triggered() if(filename.isEmpty()) return; last_saved_dir = QFileInfo(filename).absoluteDir().path(); - // AF extensions.indexIn(sf.split(";;").first()); + auto match = extensions.match(sf.split(";;").first()); QString filter_ext, filename_ext; - // AF filter_ext = extensions.cap().split(" ").first();// in case of syntax like (*.a *.b) + filter_ext = match.captured().split(" ").first();// in case of syntax like (*.a *.b) filter_ext.remove(")"); filter_ext.remove("("); From c276b54e94594a876183a0f83260b21659616401 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 11 Sep 2023 17:33:54 +0200 Subject: [PATCH 0703/1398] Remove one occurence of "qt5" --- .github/workflows/cmake-all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-all.yml b/.github/workflows/cmake-all.yml index d0507b4d4305..77f607ab8849 100644 --- a/.github/workflows/cmake-all.yml +++ b/.github/workflows/cmake-all.yml @@ -20,7 +20,7 @@ jobs: mkdir build && cd build && CXX=clang++ cmake -DWITH_examples=ON -DWITH_tests=ON -DWITH_demos=ON -DBUILD_TESTING=ON .. ctest -L Installation -j $(getconf _NPROCESSORS_ONLN) - cmake-testsuite-with-qt5: + cmake-testsuite-with-qt: runs-on: ubuntu-latest From 873c3b26cfc97b19909fcdda7b38e7d1685ab6ba Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 11 Sep 2023 17:46:27 +0200 Subject: [PATCH 0704/1398] remove a few occurrences of "qt5" There are still a lot! --- AABB_tree/demo/AABB_tree/AABB_demo.cpp | 2 +- Alpha_shapes_3/demo/Alpha_shapes_3/Alpha_shape_3.cpp | 4 ++-- .../demo/Arrangement_on_surface_2/arrangement_2.cpp | 2 +- Documentation/doc/Documentation/Third_party.txt | 4 ++-- Documentation/doc/Documentation/Usage.txt | 4 ++-- .../doc/Documentation/advanced/Configuration_variables.txt | 4 ++-- Documentation/doc/Documentation/advanced/Installation.txt | 2 +- Documentation/doc/Documentation/windows.txt | 2 +- Documentation/doc/resources/1.8.13/BaseDoxyfile.in | 2 +- Documentation/doc/resources/1.9.6/BaseDoxyfile.in | 2 +- GraphicsView/demo/Alpha_shapes_2/Alpha_shapes_2.cpp | 2 +- GraphicsView/demo/Apollonius_graph_2/Apollonius_graph_2.cpp | 2 +- GraphicsView/demo/Bounding_volumes/Bounding_volumes.cpp | 2 +- GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp | 2 +- GraphicsView/demo/Generator/Generator_2.cpp | 2 +- .../demo/L1_Voronoi_diagram_2/L1_voronoi_diagram_2.cpp | 2 +- .../demo/Largest_empty_rect_2/Largest_empty_rectangle_2.cpp | 2 +- .../Periodic_2_Delaunay_triangulation_2.cpp | 2 +- GraphicsView/demo/Polygon/Polygon_2.cpp | 2 +- .../demo/Segment_Delaunay_graph_2/Segment_voronoi_2.cpp | 2 +- GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.cpp | 2 +- GraphicsView/demo/Spatial_searching_2/Spatial_searching_2.cpp | 2 +- GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp | 2 +- .../Triangulation_2/Constrained_Delaunay_triangulation_2.cpp | 2 +- .../demo/Triangulation_2/Delaunay_triangulation_2.cpp | 2 +- GraphicsView/demo/Triangulation_2/Regular_triangulation_2.cpp | 2 +- .../demo/Hyperbolic_triangulation_2/HDT2.cpp | 2 +- .../demo/Periodic_Lloyd_3/Periodic_Lloyd_3.cpp | 2 +- Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp | 2 +- 29 files changed, 33 insertions(+), 33 deletions(-) diff --git a/AABB_tree/demo/AABB_tree/AABB_demo.cpp b/AABB_tree/demo/AABB_tree/AABB_demo.cpp index 9727327004f0..881fd8710dbf 100644 --- a/AABB_tree/demo/AABB_tree/AABB_demo.cpp +++ b/AABB_tree/demo/AABB_tree/AABB_demo.cpp @@ -30,7 +30,7 @@ int main(int argc, char **argv) app.setOrganizationName("INRIA"); app.setApplicationName("AABB tree demo"); - // Import resources from libCGALQt (Qt5). + // Import resources from libCGALQt (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/Alpha_shapes_3/demo/Alpha_shapes_3/Alpha_shape_3.cpp b/Alpha_shapes_3/demo/Alpha_shapes_3/Alpha_shape_3.cpp index 784ee1af57ff..3ec08a1113ec 100644 --- a/Alpha_shapes_3/demo/Alpha_shapes_3/Alpha_shape_3.cpp +++ b/Alpha_shapes_3/demo/Alpha_shapes_3/Alpha_shape_3.cpp @@ -16,8 +16,8 @@ int main(int argc, char** argv) application.setOrganizationName("GeometryFactory"); application.setApplicationName("Alpha Shape Reconstruction"); - // Import resources from libCGALQt (Qt5). - // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE + // Import resources from libCGAL_Qt6 + // See https://doc.qt.io/qt-6/qtresource-proxy.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Alpha_shape_3); diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/arrangement_2.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/arrangement_2.cpp index 35d589585d8d..f0a5ccfe47fa 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/arrangement_2.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/arrangement_2.cpp @@ -19,7 +19,7 @@ int main(int argc, char* argv[]) QCoreApplication::setOrganizationName("CGAL"); QCoreApplication::setApplicationName("2D Arrangements Demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; ArrangementDemoWindow demoWindow; diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index d55d10c2cbef..569599ae0fdf 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -107,8 +107,8 @@ the location of third-party software during configuration. Qt is a cross-platform application and UI framework. -The component libCGAL_Qt5 is essential to run the \cgal demos and basic viewers. -It requires \qt5 installed on your system. +The component libCGAL_Qt6 is essential to run the \cgal demos and basic viewers. +It requires \qt6 installed on your system. In case \qt is not yet installed on your system, you can download it from `https://www.qt-project.org/`. diff --git a/Documentation/doc/Documentation/Usage.txt b/Documentation/doc/Documentation/Usage.txt index 1c02423cf496..046f3d6da384 100644 --- a/Documentation/doc/Documentation/Usage.txt +++ b/Documentation/doc/Documentation/Usage.txt @@ -171,9 +171,9 @@ In order to link against Qt5, you need to run: brew link qt@5 -After that, you will have to specify the Qt5_DIR by hand to cmake, using something like +After that, you will have to specify the Qt6_DIR by hand to cmake, using something like - -DQt5_DIR=/usr/local/opt/qt5/lib/cmake/Qt5 + -DQt6_DIR=/usr/local/opt/qt6/lib/cmake/Qt6 where `/usr/local/` is actually your current brew installation directory. Check this directory to be sure where the Qt5 is placed on your machine. diff --git a/Documentation/doc/Documentation/advanced/Configuration_variables.txt b/Documentation/doc/Documentation/advanced/Configuration_variables.txt index 8434b496014b..7cedae4344ac 100644 --- a/Documentation/doc/Documentation/advanced/Configuration_variables.txt +++ b/Documentation/doc/Documentation/advanced/Configuration_variables.txt @@ -27,7 +27,7 @@ configure and/or build. Their values can be ON or OFF. | `WITH_examples` | OFF | | `WITH_demos` | OFF | | `WITH_CGAL_Core` | ON | -| `WITH_CGAL_Qt5` | ON | +| `WITH_CGAL_Qt6` | ON | | `WITH_CGAL_ImageIO` | ON | \subsection installation_flags Compiler and Linker Flags @@ -181,7 +181,7 @@ Under Linux, the \gmpxx is also searched for, and you may specify the following \subsection installation_qt5 Qt5 Library You must set the cmake or environment variable `Qt5_DIR` to point to the path -to the directory containing the file `Qt5Config.cmake` created by your \qt5 installation. If you are +to the directory containing the file `Qt6Config.cmake` created by your \qt6 installation. If you are using the open source edition it should be `/qt-everywhere-opensource-src-/qtbase/lib/cmake/Qt5`. \subsection installation_leda LEDA Library diff --git a/Documentation/doc/Documentation/advanced/Installation.txt b/Documentation/doc/Documentation/advanced/Installation.txt index 933565ad78fc..7bf4f0f98748 100644 --- a/Documentation/doc/Documentation/advanced/Installation.txt +++ b/Documentation/doc/Documentation/advanced/Installation.txt @@ -61,7 +61,7 @@ See the page | :-------- | :------------- | :------------ | :----------- | | \cgal | none | Main library | \gmp, \mpfr, \boost (headers) | | `CGAL_ImageIO` | `WITH_CGAL_ImageIO` | Utilities to read and write image files | \zlib, \vtk (optional) | -| `CGAL_Qt5` | `WITH_CGAL_Qt5` | `QGraphicsView` support for \qt5-based demos | \qt5 | +| `CGAL_Qt6` | `WITH_CGAL_Qt6` | `QGraphicsView` support for \qt6-based demos | \qt6 | \subsection installation_examples CGAL Examples and Demos diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index d40059d76cd3..8b4674530077 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -114,7 +114,7 @@ not depend on `Qt`. However, one of the examples in the Triangulation_2 package for visualization purposes. If you already have `Qt` installed, you can simply fill in the requested CMake variables and paths. Otherwise, you can also install it using `vcpkg`: - C:\dev\vcpkg> .\vcpkg.exe install qt5 + C:\dev\vcpkg> .\vcpkg.exe install qt6 Remember to specify `--triplet` or the related environment variable in case you target 64-bit applications. diff --git a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in index 7f347c1529c0..137dd3e63d87 100644 --- a/Documentation/doc/resources/1.8.13/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.8.13/BaseDoxyfile.in @@ -78,7 +78,7 @@ ALIASES = "cgal=%CGAL" \ "gnu=GNU" \ "ms=MS" \ "qt=Qt" \ - "qt5=Qt5" \ + "qt6=Qt6" \ "eigen=Eigen" \ "opengr=OpenGR" \ "libpointmatcher=libpointmatcher" \ diff --git a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in index f5d4533ce70e..3548e27a271c 100644 --- a/Documentation/doc/resources/1.9.6/BaseDoxyfile.in +++ b/Documentation/doc/resources/1.9.6/BaseDoxyfile.in @@ -87,7 +87,7 @@ ALIASES = "cgal=%CGAL" \ "gnu=GNU" \ "ms=MS" \ "qt=Qt" \ - "qt5=Qt5" \ + "qt6=Qt6" \ "eigen=Eigen" \ "opengr=OpenGR" \ "libpointmatcher=libpointmatcher" \ diff --git a/GraphicsView/demo/Alpha_shapes_2/Alpha_shapes_2.cpp b/GraphicsView/demo/Alpha_shapes_2/Alpha_shapes_2.cpp index d81a7cb7c49c..31222218e48f 100644 --- a/GraphicsView/demo/Alpha_shapes_2/Alpha_shapes_2.cpp +++ b/GraphicsView/demo/Alpha_shapes_2/Alpha_shapes_2.cpp @@ -311,7 +311,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Alpha_shape_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Apollonius_graph_2/Apollonius_graph_2.cpp b/GraphicsView/demo/Apollonius_graph_2/Apollonius_graph_2.cpp index 31c3c828d765..7d42f4bddf10 100644 --- a/GraphicsView/demo/Apollonius_graph_2/Apollonius_graph_2.cpp +++ b/GraphicsView/demo/Apollonius_graph_2/Apollonius_graph_2.cpp @@ -313,7 +313,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Apollonius_graph_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Apollonius_graph_2); diff --git a/GraphicsView/demo/Bounding_volumes/Bounding_volumes.cpp b/GraphicsView/demo/Bounding_volumes/Bounding_volumes.cpp index c224faf6e663..7b6071d93abf 100644 --- a/GraphicsView/demo/Bounding_volumes/Bounding_volumes.cpp +++ b/GraphicsView/demo/Bounding_volumes/Bounding_volumes.cpp @@ -573,7 +573,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Bounding_volumes demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; diff --git a/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp b/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp index e593af52c147..53555763d100 100644 --- a/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp +++ b/GraphicsView/demo/Circular_kernel_2/Circular_kernel_2.cpp @@ -336,7 +336,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Circular_kernel_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Generator/Generator_2.cpp b/GraphicsView/demo/Generator/Generator_2.cpp index 0072354e66c3..a10c3566a108 100644 --- a/GraphicsView/demo/Generator/Generator_2.cpp +++ b/GraphicsView/demo/Generator/Generator_2.cpp @@ -338,7 +338,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Generator_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Generator_2); diff --git a/GraphicsView/demo/L1_Voronoi_diagram_2/L1_voronoi_diagram_2.cpp b/GraphicsView/demo/L1_Voronoi_diagram_2/L1_voronoi_diagram_2.cpp index 726a509b885f..57aaab80f01f 100644 --- a/GraphicsView/demo/L1_Voronoi_diagram_2/L1_voronoi_diagram_2.cpp +++ b/GraphicsView/demo/L1_Voronoi_diagram_2/L1_voronoi_diagram_2.cpp @@ -395,7 +395,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("L1 Voronoi diagram_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Largest_empty_rect_2/Largest_empty_rectangle_2.cpp b/GraphicsView/demo/Largest_empty_rect_2/Largest_empty_rectangle_2.cpp index 67e4f336075d..20e13248017e 100644 --- a/GraphicsView/demo/Largest_empty_rect_2/Largest_empty_rectangle_2.cpp +++ b/GraphicsView/demo/Largest_empty_rect_2/Largest_empty_rectangle_2.cpp @@ -327,7 +327,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Largest_empty_rectangle_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Largest_empty_rectangle_2); diff --git a/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp b/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp index 00beec2bc227..b878c6c69dd7 100644 --- a/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Periodic_2_triangulation_2/Periodic_2_Delaunay_triangulation_2.cpp @@ -476,7 +476,7 @@ int main(int argc, char **argv) app.setOrganizationName("Nico Kruithof"); app.setApplicationName("Periodic_2_Delaunay_triangulation_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; diff --git a/GraphicsView/demo/Polygon/Polygon_2.cpp b/GraphicsView/demo/Polygon/Polygon_2.cpp index 67c16d0b3dca..dc9fdf66275a 100644 --- a/GraphicsView/demo/Polygon/Polygon_2.cpp +++ b/GraphicsView/demo/Polygon/Polygon_2.cpp @@ -596,7 +596,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Polygon_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Polygon_2); diff --git a/GraphicsView/demo/Segment_Delaunay_graph_2/Segment_voronoi_2.cpp b/GraphicsView/demo/Segment_Delaunay_graph_2/Segment_voronoi_2.cpp index 07845c04bc31..de2e7b18cee9 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_2/Segment_voronoi_2.cpp +++ b/GraphicsView/demo/Segment_Delaunay_graph_2/Segment_voronoi_2.cpp @@ -426,7 +426,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Segment Voronoi 2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.cpp b/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.cpp index 8ab184cfdce2..9af19ac62f11 100644 --- a/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.cpp +++ b/GraphicsView/demo/Snap_rounding_2/Snap_rounding_2.cpp @@ -341,7 +341,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Snap_rounding_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Snap_rounding_2); diff --git a/GraphicsView/demo/Spatial_searching_2/Spatial_searching_2.cpp b/GraphicsView/demo/Spatial_searching_2/Spatial_searching_2.cpp index d25a215c8cc0..0c982df5ccb9 100644 --- a/GraphicsView/demo/Spatial_searching_2/Spatial_searching_2.cpp +++ b/GraphicsView/demo/Spatial_searching_2/Spatial_searching_2.cpp @@ -302,7 +302,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Spatial_searching_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Spatial_searching_2); diff --git a/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp b/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp index 37e2138ece54..7dd2b13661b7 100644 --- a/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp +++ b/GraphicsView/demo/Stream_lines_2/Stream_lines_2.cpp @@ -279,7 +279,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Stream_lines_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Stream_lines_2); diff --git a/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp b/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp index 5da75ee41da8..990a8952cad2 100644 --- a/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Triangulation_2/Constrained_Delaunay_triangulation_2.cpp @@ -923,7 +923,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Constrained_Delaunay_triangulation_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp b/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp index e00d9fa260fd..55a11c0171bf 100644 --- a/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp +++ b/GraphicsView/demo/Triangulation_2/Delaunay_triangulation_2.cpp @@ -412,7 +412,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Delaunay_triangulation_2 demo"); - // Import resources from libCGAL (QT5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/GraphicsView/demo/Triangulation_2/Regular_triangulation_2.cpp b/GraphicsView/demo/Triangulation_2/Regular_triangulation_2.cpp index 6df0dd319011..07a3ed67ad0a 100644 --- a/GraphicsView/demo/Triangulation_2/Regular_triangulation_2.cpp +++ b/GraphicsView/demo/Triangulation_2/Regular_triangulation_2.cpp @@ -334,7 +334,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Regular_triangulation_2 demo"); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp index bd76416342bb..9dd9c45c7f95 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/HDT2.cpp @@ -411,7 +411,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Hyperbolic_Delaunay_triangulation_2 demo"); - // Import resources from libCGAL (QT5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; MainWindow mainWindow; diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Periodic_Lloyd_3.cpp b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Periodic_Lloyd_3.cpp index ae0074e0bcc8..0f8f1dd27b93 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Periodic_Lloyd_3.cpp +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/Periodic_Lloyd_3.cpp @@ -13,7 +13,7 @@ int main(int argc, char** argv) application.setOrganizationName("INRIA"); application.setApplicationName("3D Periodic Lloyd"); - // Import resources from libCGAL (QT5). + // Import resources from libCGAL (Qt6). // See https://doc.qt.io/qt-5/qdir.html#Q_INIT_RESOURCE CGAL_QT_INIT_RESOURCES; Q_INIT_RESOURCE(Periodic_Lloyd_3); diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp index 7b6e5225dfe3..05f30fa3da64 100644 --- a/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp +++ b/Polyhedron/demo/Polyhedron/Polyhedron_demo.cpp @@ -54,7 +54,7 @@ Polyhedron_demo::Polyhedron_demo(int& argc, char **argv, std::cout.precision(17); std::clog.precision(17); - // Import resources from libCGAL (Qt5). + // Import resources from libCGAL (Qt6). CGAL_QT_INIT_RESOURCES; this->setOrganizationDomain("geometryfactory.com"); From 7d79636f0bec6a5e703f3a9c81c9052d6e5ed0cf Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 11 Sep 2023 17:48:24 +0200 Subject: [PATCH 0705/1398] Removed unnecessary lines --- Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp index 837d859aa973..91e88fb6ae22 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp @@ -904,13 +904,9 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c) colors[*it] = QColor::fromHsvF(hue, c.saturationF(), patch_hsv_value); } - const size_type nb_visible_patch_indices = visible_surface_patch_to_subdomain.size(); - i = 0; for (std::unordered_map::iterator it = visible_surface_patch_to_subdomain.begin(), - end = visible_surface_patch_to_subdomain.end(); it != end; ++it, i += 1.) + end = visible_surface_patch_to_subdomain.end(); it != end; ++it) { - double hue = c.hueF() + 1. / double(nb_patch_indices) * i; - if (hue > 1) { hue -= 1.; } colors[it->first] = colors_subdomains[it->second]; } } From 25c82a2ea29c9c790b4edaa49f2390cf25928df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Pa=C4=91en?= <49401914+ipadjen@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:28:56 +0200 Subject: [PATCH 0706/1398] UpdateSizing_field_base docs Co-authored-by: Andreas Fabri --- .../internal/Isotropic_remeshing/Sizing_field_base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h index 55cdfceff24e..580601bbaecb 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h @@ -31,7 +31,7 @@ namespace Polygon_mesh_processing * * \cgalModels PMPSizingField * -* \sa `isotropic_remeshing` +* \sa `isotropic_remeshing()` * \sa `Uniform_sizing_field` * \sa `Adaptive_sizing_field` * From 04e3be8b8c9cac56c1a36e771bc49843e3696aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Pa=C4=91en?= <49401914+ipadjen@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:29:28 +0200 Subject: [PATCH 0707/1398] Update Concepts/PMPSizingField docs Co-authored-by: Andreas Fabri --- .../doc/Polygon_mesh_processing/Concepts/PMPSizingField.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h index 8f89b3a88967..afd1db889147 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Concepts/PMPSizingField.h @@ -48,7 +48,7 @@ std::optional is_too_long(const vertex_descriptor va, std::optional is_too_short(const halfedge_descriptor h, const PolygonMesh& pmesh) const; -/// called to define the location of the halfedge `h` split in case `is_too_long` +/// called to define the location of the halfedge `h` split in case `is_too_long()` /// returns a value. Point_3 split_placement(const halfedge_descriptor h, const PolygonMesh& pmesh) const; From 237e915d2baecc52ea8890cf10a323a555b92459 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 23 Aug 2023 21:00:28 +0200 Subject: [PATCH 0708/1398] Use any argument convertible to double for overloads in isotropic_remeshing() in split_long_edges() --- .../Uniform_sizing_field.h | 2 +- .../CGAL/Polygon_mesh_processing/remesh.h | 31 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 7e8c24f3dd22..2ef86ab0233c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -80,7 +80,7 @@ class Uniform_sizing_field : public Sizing_field_base * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. The default * vertex point map of pmesh is used to construct the class. */ - Uniform_sizing_field(const FT& size, const PolygonMesh& pmesh) + Uniform_sizing_field(const FT size, const PolygonMesh& pmesh) : Uniform_sizing_field(size, get(CGAL::vertex_point, pmesh)) {} diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index db036a4be6ac..a8da9fd9a019 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -51,7 +51,8 @@ namespace Polygon_mesh_processing { * @param pmesh a polygon mesh with triangulated surface patches to be remeshed * @param faces the range of triangular faces defining one or several surface patches to be remeshed * @param sizing uniform or adaptive sizing field that determines a target length for individual edges. -* If a number is passed, it uses uniform sizing with the number as a target edge length. +* If a float is passed (i.e. sizing is convertible to a double), it will use a `Uniform_sizing_field()` +* with the float as a target edge length. * If `0` is passed then only the edge-flip, tangential relaxation, and projection steps will be done. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * @@ -197,7 +198,8 @@ namespace Polygon_mesh_processing { template + , typename NamedParameters = parameters::Default_named_parameters + , typename = typename std::enable_if_t>> void isotropic_remeshing(const FaceRange& faces , SizingFunction& sizing , PolygonMesh& pmesh @@ -338,9 +340,11 @@ void isotropic_remeshing(const FaceRange& faces // Overload when using target_edge_length for sizing template + , typename SizingValue + , typename NamedParameters = parameters::Default_named_parameters + , typename = typename std::enable_if_t>> void isotropic_remeshing(const FaceRange& faces - , const double target_edge_length + , const SizingValue target_edge_length , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { @@ -377,8 +381,8 @@ void isotropic_remeshing(const FaceRange& faces * * @param pmesh a polygon mesh * @param edges the range of edges to be split if they are longer than given threshold -* @param sizing the sizing function that is used to split edges from 'edges' list. If a number is passed, -* all edges longer than the number are split into sub-edges. +* @param sizing the sizing function that is used to split edges from 'edges' list. If a float is passed (i.e. sizing +* is convertible to a double), it will use a `Uniform_sizing_field()` with the float as a target edge length. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * \cgalNamedParamsBegin @@ -424,7 +428,8 @@ void isotropic_remeshing(const FaceRange& faces template + , typename NamedParameters = parameters::Default_named_parameters + , typename = typename std::enable_if_t>> void split_long_edges(const EdgeRange& edges , SizingFunction& sizing , PolygonMesh& pmesh @@ -473,21 +478,17 @@ void split_long_edges(const EdgeRange& edges fimap, false/*need aabb_tree*/); - // check if sizing field needs updating - if constexpr (!std::is_same_v>) - { - //todo ip: check if sizing field needs to be checked and updated here - } - remesher.split_long_edges(edges, sizing); } // Convenience overload when using max_length for sizing template + , typename SizingValue + , typename NamedParameters = parameters::Default_named_parameters + , typename = typename std::enable_if_t>> void split_long_edges(const EdgeRange& edges - , const double max_length + , const SizingValue max_length , PolygonMesh& pmesh , const NamedParameters& np = parameters::default_values()) { From ec1793f54d46112ccc35f94e73cf8518fc5a5b79 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Thu, 24 Aug 2023 17:50:16 +0200 Subject: [PATCH 0709/1398] Documentation update --- .../CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 5 ++++- .../include/CGAL/Polygon_mesh_processing/remesh.h | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index 2ef86ab0233c..c49273921074 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -44,7 +44,10 @@ namespace Polygon_mesh_processing */ template ::const_type> -class Uniform_sizing_field : public Sizing_field_base +class Uniform_sizing_field +#ifndef DOXYGEN_RUNNING + : public Sizing_field_base +#endif { private: typedef Sizing_field_base Base; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h index a8da9fd9a019..45ce27304cb8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/remesh.h @@ -51,8 +51,8 @@ namespace Polygon_mesh_processing { * @param pmesh a polygon mesh with triangulated surface patches to be remeshed * @param faces the range of triangular faces defining one or several surface patches to be remeshed * @param sizing uniform or adaptive sizing field that determines a target length for individual edges. -* If a float is passed (i.e. sizing is convertible to a double), it will use a `Uniform_sizing_field()` -* with the float as a target edge length. +* If a number convertible to a double is passed, it will use a `Uniform_sizing_field()` +* with the number as a target edge length. * If `0` is passed then only the edge-flip, tangential relaxation, and projection steps will be done. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * @@ -381,8 +381,8 @@ void isotropic_remeshing(const FaceRange& faces * * @param pmesh a polygon mesh * @param edges the range of edges to be split if they are longer than given threshold -* @param sizing the sizing function that is used to split edges from 'edges' list. If a float is passed (i.e. sizing -* is convertible to a double), it will use a `Uniform_sizing_field()` with the float as a target edge length. +* @param sizing the sizing function that is used to split edges from 'edges' list. If a number convertible to +* a double is passed, it will use a `Uniform_sizing_field()` with the number as a target edge length. * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * \cgalNamedParamsBegin From f73e7d4a79a833268f4d134cd2ca877b162ddd15 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Wed, 6 Sep 2023 21:38:01 +0200 Subject: [PATCH 0710/1398] Add adaptive sizing information to the user manual --- Documentation/doc/biblio/cgal_manual.bib | 10 ++++++++ .../Polygon_mesh_processing.txt | 23 +++++++++++++++--- .../fig/uniform_and_adaptive.png | Bin 0 -> 316564 bytes 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/uniform_and_adaptive.png diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 89d062ddddf5..713047b1ed50 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -3073,6 +3073,16 @@ @article{ecvp-bhhhk-14 bibsource = {dblp computer science bibliography, https://dblp.org/} } +@inproceedings {dunyach2013curvRemesh, + booktitle = {Eurographics 2013 - Short Papers}, + title = {{Adaptive Remeshing for Real-Time Mesh Deformation}}, + author = {Dunyach, Marion and Vanderhaeghe, David and Barthe, Loïc and Botsch, Mario}, + year = {2013}, + publisher = {The Eurographics Association}, + ISSN = {1017-4656}, + DOI = {10.2312/conf/EG2013/short/029-032} +} + @book{botsch2010PMP, title={Polygon mesh processing}, author={M. Botsch and L. Kobbelt and M. Pauly and P. Alliez and B. L{\'e}vy}, diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 8f5863bd1f0f..0f89da2c013f 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -116,10 +116,19 @@ to the original surface to keep a good approximation of the input. A triangulated region of a polygon mesh can be remeshed using the function `CGAL::Polygon_mesh_processing::isotropic_remeshing()`, as illustrated -by \cgalFigureRef{iso_remeshing}. The algorithm has only two parameters : -the target edge length for the remeshed surface patch, and -the number of iterations of the abovementioned sequence of operations. The bigger -this number, the smoother and closer to target edge length the mesh will be. +by \cgalFigureRef{iso_remeshing}. The algorithm has two parameters: +the sizing field object for the remeshed surface patch, and +the number of iterations of the abovementioned sequence of operations. + +The sizing field establishes the target edge length for the remeshed surface. The sizing field can be uniform or +adaptive. With the uniform sizing field, initiated by the `CGAL::Polygon_mesh_processing::Uniform_sizing_field()` constructor, +all triangle edges are targeted to have equal lengths. On the other hand, with the adaptive sizing field, initiated by +the `CGAL::Polygon_mesh_processing::Adaptive_sizing_field()`, triangle edge lengths depend on the local curvature -- +shorter edges appear in regions with a higher curvature and vice versa. The outline of the adaptive sizing +field algorithm is available in \cgalCite{dunyach2013curvRemesh}. The distinction between uniform and adaptive +sizing fields is depicted in figure \cgalFigureRef{uniform_and_adaptive}. + +As the number of iterations increases, the mesh tends to be smoother and closer to the target edge length. An additional option has been added to \e protect (\e i.\e e. not modify) some given polylines. In some cases, those polylines are too long, and reaching the desired target edge length while protecting them is not @@ -134,6 +143,12 @@ Isotropic remeshing. (a) Triangulated input surface mesh. (d) Surface mesh with the selection uniformly remeshed. \cgalFigureEnd +\cgalFigureBegin{uniform_and_adaptive, uniform_and_adaptive.png} +Sizing fields in isotropic remeshing. +(a) Uniform sizing field. +(b) Curvature-based adaptive sizing field. +\cgalFigureEnd + \paragraph Delaunay-Based Surface Remeshing The mesh generation algorithm implemented in the \ref PkgMesh3 package can be used to remesh a given triangulated surface mesh. The algorithm, based on Delaunay refinement of a restricted Delaunay triangulation, diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/uniform_and_adaptive.png b/Polygon_mesh_processing/doc/Polygon_mesh_processing/fig/uniform_and_adaptive.png new file mode 100644 index 0000000000000000000000000000000000000000..4aca8a398d26d773f009845adefcaa90bc7e5915 GIT binary patch literal 316564 zcma&ObyQSg+c&xi1*DPg7z7mrq`NzZkOm3qp}R#uxar5F^3sw#9Q-^ytZ(0N0DxS0mWGE;BAi%c75)MD zoy6QpO{(2TfS#coeE?54A1?tg3C1H3>kSEe_KuJUKT}StCusVaTvph6E_1V`ctn_9 zq?Q5S5zW%K20!oP!$ZU@qJ2Aa`*y@@6gLo`;6?o3d>epYJw!-gjwV)Bu4k|#5Sd7B z4V4z}@6Zp+C%pi0g5u@r?^-Q-i&W(RAOnumZy*Hye;z)ys=d$#Xybu3dV+0Cq&Rh8 z;Em=0AuvD+RBP0kKLe5gz|PB8f*vTv1`aOdMV@1A%E0EWZI-K4d_W`uQ*l ztrAKu`$X4TiLqlyvm6r8J(N70syM+(*ql5@?s0aqwobSH!>&fcgybcj1;!?QW@-k* zbGdC4r4cLuAio~}e$OWwxBYkX&tHpeyW@-A{CnFI2YL~@)7AU-C}dOsPi6FY!FX$H z2F0--soJf}wnQITcn4UmUK?^QV&v*Q8}q)7^y0e}qt4D#8xW$Re1?g6$Y`3^!M+hG z^1%7WVJ*`C3Vii`(fb5&N*7D3=q~tl=VW5J|?N(_-YZ$WY_CG>Gj>OTK za0kTv&sn3$G2;O|ORl$GZ~#c`x{eiljRXv*7H$AQ`wpo=aT1AAA36X?<$iosEslou zov^$cC-Xa1dp8NP$x|sYEJ(Kyp2XA5K+0!%q$%QLn%x3(s14O9xxS@|g0ra*J}Tg&Kt-6L{8{ zN-y@~V1p~0=(U06w5jn;akz1+35da;n@xlQyi6MhV6gaoKbUl~!8` zPvwZZhkC5qDAc&1)A%mv#tgeQG(;vhRIWhNtf`MInvS^d?T1qxi5cg2DEln7UzAPt zYp)NK+@ByQ+}V7TG$dV0Ey^w8EwcVP4I|<7)vTTH&u1!((2Zb^_^_g|in7+s*i=|l z_*d{QcrSD=m>xPG5+Cj_9J@JYiDj{5T?)Vi;BFYLJgv~ykk&=F(LIq#vwg2!jLTn_ zIJ?W^vX`)nf=iOUJGNh}o5xRr{}kg7S+&OZSQU)R z7ce!yIQne4!R<*RVo~luXB z%IC@l4`TSIGi|d?I_KLLZ=*xLN@w;eMDj%Tr!1uS4n0XxPJx$yc_;GD>)qwM*>d?A zgMF5L*o?NF8ijTSR)#>vP-AgLMn#W%25gmZoiO(0#LG(!`vs1J+kztdUNHK1RAk{sU zL<9CM;+uVr_fYZ{`BCdc!{lW_Mq9>G#XM|k`L}SdUl~IAO$NoF;ZNaX@rx6<&brg@ zjjV4O-+r9OZL=A<8|fM$I;d6aGGAoRu)_uxd-T^jhJ4-&hzNhU8QDb<=@UWD@y_|& zS=33tD%{E7KjWX~k9M1l5WE?>i~ZO2$LoyvROQKgr0+;uNF5)^Kh~kxqR^nGp?*c< zeiHqp?I|0U2$2L92DUDZbD~2x$r;798RwEEOZqs`FZ3)TJ&GIl-!GJ?XYgY}N6}aD z{2hv}m3DtOqKB=?+J!aKSd*oZT>BBeeD${U%^tK~!_~61E^Yqk`T3vpX)1y1a|p&^_-4;sk8t>g3-Y#II%no)x@L;2 zS>@JJehbOp-I1Ye4}XeHFxNL9DK*(*~$KMT$XQI+n@kIskI zG&L&-CH&2Lmwd&yEa)eBV->0@RK> zI<|F6{p(rwCgvtpi`TCcu{XW`!hTUCe*OjDWVm)YUnH^%Q5r9(SFcpVAy#55e(kAG zs_)q>*CD4j#kp#6zjw`m8AR;c5m&9&TwOQU?5TUYM&BjfM$8bYLE`a-!%)4|+|&AG z!f(iGs5a$JZCyuQ>&(V$=`2S5)5O=WlCOibxspqg28Zk`FZ5c>h)j~rwT^94r}f_j zydp_9E_W<1uKZUm)BJZ`Tg7ivVGL7Pan19#xr`aEAO1Cr!fnERsQh#ek{vL{rNNIBsPGIxJ)yrh7Cv>b=7GA-?sUX|>4LXG3i#Z{+9F&*9ay zfTm0IeL1h!69Qds<*Ws;T;aTq&>9V zjc?}Pva?h~g{RV%yx>Z=X|{$?!wyTy(QHu?*CVASWBB0t%66>bNxS0(J=}DWu}QH) zxKdcw-|_B`T$R4V{s;Kbp|((^>xJ^Z;P~-mz>Q7!w9D+j**AtcULD7M2NX^AFP15r z8Cx&^xnCWUcsx5&S~B#G^{l$>T)5jqyTRQHsK2lI&<$Jr_rCl6=uchTV;qdn+4o5g zlb`=g$o`g{W{_csj?JQ>p};2ZI5Qtf{PV5$+w;+1{_h^V_Fc-hSMSylilaKWb0?VB zk)vIeUM1(w$7Ll|0{smAH0>i^!ly;I6(fs&$IZvBtNk4`Y0S4`_iE?kH)j3c##G@V z+rIa=Z1CW71gk9HC^%%&n#rjv1AzAn00;~QfE)0sz#RZ^V+Vk}_W&U91pr7KGh3lT z;0qXza=I=6fcgCKKmyV;NdeTs26-uQP0!2&KaXajS+_g#mj3XeQ76-Wr%b+H;hK$n zh2xXrSTuAzEkZXsybcdMbcn7*U@}Q6ZBv6ZZ2R_AkZO z|16@N5U)0m#-Wum$J?=o|88X>CWSdZ|8ZTJ(wdSuf>-yYZCwH9h*whhceCmBs~7;E zTebc)!nG*X(+tCb|LcFFJ1L&s(NcK%Lddy(^t_!HBin((o2Ro*D!eXS9lHU1KqU{3 z)L-7twl#)J*H2Tlj zLBp0+4}n$v|J(~Be>HvRUKXPJWMWAVIHe?B%7Apw0uGBq77W>a7uA4RIPM?g^_fO7I=w z-l&r~9J$7~Pbc4)NyD$qA>FuYDM7L}hBLP05cGYzqpa$p%=_v!6pXgQ^0{Xw zn2{aLp?N*f@#FM4vR^9oITm5Ca(*J~(&Wrc!f_dzSz~txne&H>smx6u2rt%{tl_H{Q)3`Z|35T_-X}SwZfBZS1est$>e0G%?X4HKMDM~ zC<^_TEtF~7rWw6#H+$~FSAY3a%g@MK);N=SQVq-pl)3PFt=U9i4Zk;A`<__1>bAm1 z=%Q#&8t>e3IhfRA1lPf3a;k@uTpH+FNstA00$?{wTiT3LHSn-G>^tl{SCZ1oY=Jo< zRsotPapXKe40Ge2_pfN7$JGOlx@}Zx$HLkJ2*X*`s1ETZKK>SC!3+Ki${X9q1Fn}7 z@03QY`MCQm$ubo)+?R5^qNQrw2kL;eFjGP#lq%IQ`nWhL#)!P@yQ>yxUx`A#TvR$i zoA^N|oXRM8oIv{i>3t0S;#ldveEr@{E<=Qv1VI^HL~6q_vG2XzLP0)3f?7DHlhyub z4)64?r)2y*O3xH2Zq}vbiNWP72fq;HMt0M_?^|B=9^DrTvcM>iA!6k!C0&W_!7GiY z0E3U66P4R0_oKM^w$$9GXq8#z$QBK-8oy?yo|{~dCbXUtfFp1okC;Q7^{3QZm-wwV~+ek8_Da25J;QeQQ^-lXJgUUe5E9A8jWVR@IJepBje~B zksIRu;%`%9{w|oYu9hctWcK4MVssW8(V-a2`Xb_+Be)kR7pJFuIu##|^T4B}fBES> z*T4JEIJ1BKdAizacm@f64lTgoMzh?Qih5vjwwV%5BSKZGVteaC}CTU z@H%tG_AyZ8V(Un-$vY>?c_+HZSY6rOrvCPDr}+2$zyR*y`CfG>0zvg7jXb){xjjux zg47`=L-|j``(USCyCcO-{61w5*DOuDTaF2KT0V>~%PFV2F{rJ= zepyGnr}TutBnw4>EwN%|Dj(H^qx}A` z=cd*1((Gtoi9Ni``t!2qi5LkWmWboyv?qog2q`6H_%Y*SghqQg1~WQJl*|(QsF{Wh z;MjSI0=XJF->MxZecBKC#8FI+R}ysNU*9vC)T{l(%>BrIk1m!;7bU&s^dMEI<+;8& zwsZ)V_<(bt#)kON+R&vlthz^j0>Nh~LK ziQfqagoyL@==kUd$D3`uCscyjH560bP&QV03ol&WvaFNxwI4D>dk1juOl`mP2v{wG zdtTMSVpac~T*c;G9&6U3n{yNN4M*YkcmJ@)mr;$Ra%%TBh-xD)H1{7U<|=q4MH&u< z@^cuNsj9$QR6k<{Z$Gdesb}vx%5B}n>4D%}ZYrX3|F$}5;($e4*>=X8cIX`&wz0yH zFiPf~_~6Cu*R^%zad4;Q(X}5)({G4&%l8z|WAFU3StF+^XNF@p07eP#;<5jCTh&YD z6Ts@R2;P1|l(5BFKM{Ll_;s`4=x9#z!aly(h13c68_n3uYAt3} z_}PNFaQ?4`RBY)uo$ts)`G!o=A%fFgQ?{%Uw+~qV%Psr1YFq@jmG1Vw^>xmW(6{q| zWBh;^q@GU>7ptOct(=1Q!?rkWh+%=Fp>}`yePu1bm`Wx-Z=>tQ=I!Jzw^+1QQXhoq z`d>b3Cl~hzS>^Bzs7CE*Y>w8gzN~8GMn=(%`y38fpFZE;)Q^@BjMDrHDD1(+QNbbM zF-{b`_RXI!l~HadX;|99mx-BKrsgleFzo+u*tp&4ZoOE+5!meV@NHw{E@z~DrF8!# zZ;eZ4#hrJj?9dzB=6E3yvZYGv{=1cpD>vgXq@D&z|1E6535*TDg!{Et4Mkv=+5kf& zB(cz=4rp(?M5B#-WopYrX63Qr+7^V&h+QriwmQfmu6%6 z=TMJZw*a?IFk;}s@oN8-TTaOlvg)F$=UWL6Nu!?LggaTx!9!N6g5wvFO+NMeZP8k@ zJZ=t`kiL=SVS#Mw7D0-Q+Q!A8(SY_{XAfg}({ZZ>6V>U}#g>N$uDMLMzQg^_e?fQm zHfV>=MwUWb{jUCy6NW|fJhFgxo6@!4CPc^*VvcrixT zmne|B>HI*arGAMsHzj|I`0b;ZNyGdQPQZr#O8E;351b)fS&+Ke3ai!N6ovO6xrXSd zYyIxMXB@K#O#vb|rv-_&au>ebT(s)(Y0(`_s?=W#jaQsxwR3s1sXzPMdIfk#uI^vw zX%&29kRnWGM@CPO61*{@YD4Nim(i~s&}WR`G8dW=I2*`6vP^y5nd4>rIPhn}2!~r} zY-`KM&t13uSKZ;ZH~ySY)!(Xfon;ny6)49tjkZP)-YH|-q6qRC!%1(4n)}y`Tep3% z{9hb#{M+ULw1c3mAGex|w>q9weW=S)vE(|eW|I2?BTNZ)>UMLoPq!P*d)R&&*bKJ6 z4~=xXn-x?kEU)OMO<*3`pPKxZQ``F)jXaYcB*M3;yq@POb5AFUP$`HAz#nq3bWv}~ z#XD%o!Qst$CVDC@229O%@5rN1+2L)t-Y=fU(M43WiQ+dMo=RZ_+Y+QvFMz>V<~zR= zJO~w8EuZ}Uh#s(4ecqCqV8!=xl7Shub~LH>N>_8kI()r_)UfhoGDZ=c^4IP1)4k+u zm%d!d>*q3zo_^t#z%NrMs0ltZz}XK*UBj1Iy9i%Ti+OSA;T5}h;rZ5naYMstkvhj) zJmxu&I{ou|*n6X_jTX}XT?&zw@|Pl`m9gLw(kD&Cp@?5LI^ zVPpRq4^M-6T`4LUu<)fAmj%A4_!Jd@^Pp2%W$$iro)dHkn;L0zhv$R|%y_VZ7Hunh z^u!Nb5=h)8K=spF#QZ_ z)mE!=0UyaUO=*UzH`VD*0{exS`sKK{MTXxl@Ba6SvA<({y|y8N+AWyG$`W!TPnS>T zN&M744E|;wKgy}4vAM_A z9^X5l>7%F<%E{n*3wfzbzd&lfH;J~Ysg$qle=a&L7wV!z#FGdKLyd0|e)=E;ZX*)x zbC@1(KcTW9SHV{~7{Zt8x74_w12`*`qMqt``24HyPemWaS^)yoB(k(t2+Kn1o zuy^S_Z_H-b+WB3y3RtoYZx*Eboju8Ne2q=~IjUh$nx*eH*J{SkHX6 z*myOG{jeWC`Jx9b(1*f}_^{-qAVSrKC8LydI+v6 zhCO@tpH5=i5`Y)5nea8b(a`G??Cr?kwHmC36;Hap{)|e#3V1wo0!#Lx3CzkA{^P?7 z%QDo^f}Zop|HAuBNv)ZsYT-|#OaZk|#96U_J_=Wi z)efNmfg5f5nWz3>oBQ1MFqU@&1V-w^Pyr$D@|-4E;+3G&-g{oID*lM)KKk0X2k#7N zPyui_B~)HG_eprT01>KX^EQSz_Co>O6C6bToRv+K?B0LC7k~$l`|z|s2gblKfI~$= z^nEsFM%DKXrl%zKlbuJAD;pqsbcWl07QzJP8gH<_`!!n4?BWHIGQk^g{k8e;9+5tQ zN>lvZbyN}6RWkyYddJ`rkv>cLJ-h=3KpJ=FDvK=rRzXDB{Q=hWC+}y&*$o{CGvCx1 zqALp?^nF5W%}l&Q4Lthfzjt)3gP3u-67C6Mo%wT$_7oXNcVAjPu?t3ndpIt-?p%KG zc<4^S&6TWT+W;S%x4{LOjamH7lSdc=ff{ISt=kHSYoYa!tx`s#y};9_HN?t3*jlB6 zf;4CaGSa^+fw$H#(mSmgOuZ)7SKvHSPgQwYXJ@cZoYpT9>J|tvY_8dhU>&fye=TEo zzDMJByUp}>voq!5wG!HzEU_RQ_ghJ5x(vzX{$_Li;XB?^etWyaahIJs6>b&8Yh-Y` zffD|4acaxX8OlT(wvDm4iA35WGywaMuTYNrp&fR^hxBU~aHwb*-csfDo|*gJLOL+Y z2ex-Pmo-<}ocKZh$%h5LqkxKld)M6uVcv^t&f%kH(Q1$y`#GBRR+E4*B+*D_F7m_` z{q>~+p+tDJmGAr^E+ff# zTD9o^_VUZ~u;P0n`fGn4y(hPai;G4h^<*LZ`lD?`IW;4#!|C_sUPV7*rE0!qFGQ{T zqH5c4Vk7hy1HrA`g8ay!YuG#eNq;aK-hRb>N0ucyX)3AG;v!t%KuFc6w`yeWGjh=; zdT~k?y^t+cv)KLMc6qOxFz3nW*?6G#InZ{08m^DMv6u#?#ua&Xf;25%6Qp@M0_SgX zb`qb*BX-W@3|6;Xa1Ef8bvM|d4#>aO6LK=|=)^ z53Ive3{^n1er#_v?Zalj{P1&-GxQBsc9B&{;c`@+HD5svxvTAC%f+qvOZp; ze);plAnZs60>O0b+h7VcUzx2PlBZl<#;Rz|Mt)50O{}YCQh6KyphU#Nmi;VPFyD^C zjL$7x!2trKh&p8gsuuQRxphOCR1K$hMwuo4OJLMJTZCBGfvI<@?f|l6=NK_t*BY>mJb1&%FX~b5hY3DQ;dAWM)TI1i`#huZPvZP}^XS0T3anM|$Ch?) zbAayVJ>t-IC2HiZGg_EpHOtF^T7kkl=H!R-Gy&TO+WyxU;eTy8M|E+nvI%B(WBRx< z9HuXmD1dcv@^!0fIJ&A%rG`SDN*ip=4@eaWXvG`N#Iq=^5LoUZCPz}UO3%|UCr zSWkAkNyV@82pgfh&?lksLGvVJw=7!zYfJTYdg+ApsJSLVT1`LAz}1HXAGd?2O?lfI z#*?#EWHkM=QMfq|7r{*xcTp61hmZW}y20;A!u1Jae9fNvE7k^1eewgttwx1(uY{DB znlU`3-8$byR9g^qc~nLkC4uia7Q|cgv<-sw{q?v}V_zTU z(_Vhh8F{ZO-B4OhX(RfPi;5?Sc=1bKX}e+NzfS&b74t?mCwHg}h+3a(ZeVvbPs^zK zGHP}!)$d>PQ!d0%DX?Z7t96|< z{14v+4jTa-@IwPQJlWp{@8UgjI7uA{*34Fm9{4Ioe@TLT9`Ylf=YBzYi`7`=rT9XC z{48)gPxl+xei9J^oA#2id~u$=AeVHU-v;6va-bTdSql2sa(s>#JO4hkAfjFnkZZLc zS28m+7gQm2b8jT}dyK>``SoUdeemO!D+vca?_exqEd#SGJwm zReKRMTe-ar@<{<%Guvg@NCblFN!;S%O?c_9bC@7`oBLGk)vL*p(b;958Ifsh1Qn3$ zzh#RA8LyzSeIN#*;p)k)?NTG5|9s6=MRD61|J3Ta_i>%o_W4*5!VCyx5PWlXr2nx2 z94b%&JN>&CY_DcWPe}iM$YKWR;g4YV&?ZDJET(p#Kxun1v7wUj4C0cResE*)Z)WF!hPCV{C8I8j(>uq? zsfBWU8)NtrxDHdT5ZAsd9@sKHb`zA63po~=c17DqenXy(rREdgPai46?O zm3xe-i#whRNA{2)sd&`!phS*Ifj#ZcryyDUW;B@n9yNTDg)UN)WM5#dKW%iO;T~oM z(!7-A5AS7?e+O;8@mgIR_Z#E1e`u=m!US@4`~CP@x-?$&rb2W?KjjqkD9O*K1wCCM zkiz7)3RERNypKylnJ3g#B>b4fvf`ngLK-@-o^`IVA@53cBI$Uw>~}1>dB5Tu@dmoS z^|5abs^xCK%<5!Ay{vmMr3rG8lgm{y)2$#UjtpEm_~)eZ%!7BaJjzBFstt9Cvv5ua^m`OXl)59`JjP=V?N{QI-UENpQ4l>|Q z?5Vtb2z;Y`3$z{keQt^t@B;^P0@=oZ^1VBiLu-F>SQzswc`(MF2%;bWDwNO@PpT z=-moK1S-bHh+9A^U6lf&Imf7uZta}e2`6@J!d-1osmsH|DYbsB4mK1^T0szw zP`OFNZumr}dG>Vn0`ca`{?-!S?7rjj$W8BnfXm)EG+HJ0@KQPzY>%qigeAb}xE?Py+|!J~)?#a1mKWdV=&DRIDzv+v_}2eW)0dOA0KtoM z70t@MlLG?ebh^#@5te(q5Xf4I37F;WIQ z-P2dH`RHz7q;16V`>$sO+$&&vVC?|^)T&RzaY{9^BeySItz3|0xal!I2M=4Uf$(Zk zTU{63U|a;qs0B2STI(aMffM>{I~2F-d&xI~Wgyl>qLpKY{f!quXPJr#p^tdBpeB5n z7GEHRFE>aJQUazq@fhRn0lLAhuLDqk;;!wgw}>Y|MO)U7@vJ}G64r{UxL{sExywJA z*+^20n{n;sr%;^Eo%*NEeuN}zYRD~u#260j4jm-O%6*Q;W@4KWsSS%bKz4Oh2vPKS zzwd}dfrFR=A<;DPG^hF?IwN)@qbr2vHHj?g+gBY}+HBTK68Vx_<18OZ*)dD= z1ANGSm?nD=pSh+%@-ihiW13{@?+A7icjtf=^9R3rc`*t1#MP70mHl99%%dhESjkgR zhhPQX?+aH+9^(%pc-d4}h7ywMuo-(?CA2Xc%pj4F2r-@Ce_g-VPuGP{r0`Hz`Q~}# z_C%8W{@5fH52+!5qJqHu8DqE`;nD~MQ-_o=5v^-T*wCP6;hPo|Y%%J)TR1tZ;GnRd6OEW>uA%w#Z}qHH{hUbM}u_2dvI`pSR6Cd_r`H zIb$WU7|)psQwO{U@|j;n8-Q$$DHl)v9BF=W!$&XtJO!zE98pE|ODB*}iCu=@7ij-N zD#VvAyTvw_&kvG<=7AcC6hMZ^f7GlNK+Q@ijl^sw82$M+WOO)-kpBldL@NILPFW*y zn;(uMA`g*>5n3q1GkF{-9=Er_9VBi_jest{IM*F1PQai-QbRs{`7`~GbiCf2zn%8s z4$IXLqPYe3qMV79c{6L+)}f0=kf?9egB~H{xb*t{2Y=oEtn(d3)LhLoB;W7LDK!xrAbLFN7Qc+H#zI*Hz<`BzpJjsiq(7$+;zB#4}?+ z_gF>(OnccTd}>kX(+3mzjU(*iSA?Z>Ca4n+;_~!y2@-GUr^c3fm>4raF(xQDzMs9G zX5W6a%BkJOKX`@VK5BT#_)o|EKNJ*4r=d&Fi+_LzRZ3_jC_ST*OX7j^KMFYiA5q&X zSgE^^vrFq@F5RMHVET8Vza3_n3mEy7tP3}I2MKRVWYgsYk|1Xy0J!eV z=VnKRn|1PpD54l*GcRg7W5&GQ_v<(BISp$;%D5L)Ah!3Ixa%yzw0qtW#FbxMUDCin zVRLh2L~3#p%`wAr8Dj2ABS$Ui1_!ELmce>}lyIS@{JP)C~FaIB9a!7LBbu;~Ag*`%y$ z8}@Pmc5_X=Zu@W=d3tR0IMVn$-d-IyTj#Qp7IMFGLaohwdWdEsT7nF>GZd928`>T= z@bl264i#T6cEjzt=@JLq!>1&6f{fHI4E=ZiG~BFrKq8kSHkZuMeimZW@n~2@~t?% zzgV<-wXhvY{CHM)<+?d{(mraYNhn`mI5R`?3W|EWnsH#MfLGGQ?ray;M)EG;h_e(O zvLCY5RH#r4`b}TK8C6XTFbeLL4eAKP_mkc0y_3vOKSU^mR(K7YfLTZkiVc5yR-|fv z6G#_j^n|s~X7h2NSF{PQ!xZ!7gzme6Q90^`8+=)UWM(}K*vxay(&M*XJn-bGCQY#) zRs{}Mbxq}-M32?g&hV1=jj|+$>1bY8A6RG)Ux*Xc)A83zK{*_p$+ha$@^w(jQMqSQ z*oo;NXA(_so`=3ClE)z=ker3yS1>K`okx2 zRV(uOR$8Ao(?HtmR>HuI^7(44!od z6$VmxKI`%h_pR#pRRyb?B6_JK3+0oX48cKF*(bN^xHE5Lpb0#K3CI?6aa_B$Vy3Y> zlor9N`Z8mc^Vvb$(Q`N_WOL?Wfs{mQ*NpKq zF&%=0?phS~s%io8U)?yM;)fM|9OZ+uhoyX(4bl#W8a}08Y-yUUU=_i)&+2P`KLl}V z87tmwNjerZNjV(zw+%p6QT zcP0+b^e=$-An5;#FC#;Qp-B8OnEn5C7o3+{LhRV`)r2L!YGQ^E^tB|?r~2D4y_X?r zFp9@SeGSEiKxHz5o^^kPvkyNRNa%}0s$Efwc3mjW*JAwIG(kMJEv{h~Nq8b5W52at zZ)Dn=k6!St_j@tD@W>TsKC_oGV{rQlB!tf4Wn5|TE9)q;_aFzjmY)J&ui4NZINu^P z%I|5B;pVCLTPAS=2e#;&C8^*SXH)WNusk?SfNJP1kSmW^1`RZk3=vYQ67ggN(c3D#;YJCKFP&DTk4mF98^1s|vxJPYW~P{L7f-q! z6{2rg_I?rVC26g3*Vu<^c}-j3gs6*GC{HM*3Ax!-a!PqCJR=W z)dw)o7^CXwMq$$ml6&tX;+$UE{8ChdCPQlU;wX{5P-~jI;_o_zBzXVz6~?7Y;fsZ` zAeT6kFqJLj$v+!!)T$bdQ^O?Z?fqdLeu@$(Jy~~*;kCyi4`I=T)PE5&XD&CH;u=#k zq{k>AkY48XCOb#Z47t0zNy}SNOfPbQONjPL7eq8xcapECq9Inn034Mq%PPCnh9IPA zotE0$AyJG9LNv^^d51QM#HgPe8S^;~Y%|a@7$;j7fAY1StCw&p!JP3TRfjljy}IsOXe zr`Q2;#eoijxXR*VVW8FgR&d*BD~1eNa@^bKkm@Hhzm=Pm9Wf4HlhQ}ZyC6`f2c);j z1pn^2tZNf|*uOup)Jf*3pi*1UGl$~S#}I=?3exnT3=&-kh=FR&@#Q*_y^wjN&G83# z`=nNmznWm-s}(&B3ClOVX0^UZcp6JvgDH*t(Qy%*R*BHdp6f4MpWydh&99ngjL}<~ z;O?IPK7a6OK*V!_FH0(3O+7wU-buIZ(8#95Vjpk8mQ9K{TurbHR$UeWYT_CDF_}%g@<^2$v(BPiA@m(t#K?6OJB7IeJrdob+z-ONMVHDv+%x}`9 zyqp1x(vuoh1bNu+ZMM%!38Yl!JXlW(9QL#z&`pPNqj%DG=+-)CVe#JX*YoEu zm}E@HFWAMO5_~G87r7zhqLhA!zaJrrd^PK{!ol`ysu&2*BNt?lf6!&;ekKzl8#8=V zMvZ%*kRc*U$>~i)q|UI? z07Hblmvn8kfJ`#&L?cM;2!n)2(fe2ilJ91O35+yi63@u|%!fj<_E+|5sl8+W)mchf z3#R@3wc4-umOvUb@vNNrxt>_dKa1ZMYw#od2uUvvMh#?QDe$9^CzOnrrp@ZFSkBu~ zWPbatU*h|P#{R&QHGJtOgJcEY_6l(uGS@8US83=!-57*95-000gUYfT;dyQsW0G5s z?N4e7<$1>NdPr7JJLp;XGd6>Z!VI&*SE&6*0H~gTS{n)gwrMeVI_wvwru~It!Xw)E zYD^hXVPd%qrCwd8R2Do!i@UHe=c)k(UPG5>j1du_>qdnL=LEy-tkZGX9Hfgeho$^%KPO=8 zV*FJY$Xw5t9n8UY7%H>qE&Fi_Jrrwko$QZhE|xgtDLZ$-ax4%BlLHsht(F#8K59_;2QOd5g2Xc93$XW2A?^@OiO$QciK@12_glrR{W{qtlLgj50-t`3oW= zvJ}X!Xz^ZSDhA)gY4X7@%O#%ItT@*-uRSS~q!} zex<=_*SK;nP^H;R&?ltt3;*HxjN|)3N}P?iQ7CRe;(Cmi|1hITcrJl-@5FpONlg@e z^MDccpF-hZLp^_d&JOgLTL=7J{K3tFd+nAbzn9-=U7Xxd0Tud0YwZO!8b)1T{Ga44 zc=8Z&%}p|1@*a>Iyg-E|L279TA`as8_GJZY(s^i0FPaA6?ZGJDx^WGfgc@KG#B3b92QXC~BP}7r&2D+f;pmcTwkQ z^crgJ8ZToc>ag^ikJNB8z;`jz&adzXK_C5DF-V$38}^H+A~{9fWvo&}@uWPhlER?z zg48I(`;of&6~Po3xbOZSU*s!D_`=BU1ka`CKRLs`qnD?&&`eQA#;Df!IMa8N^WI?f zFxc>LV=lR)heGUvoe=4~mTw)=S*HgW!WwzY1r)t<#x)L={{=k2IjgXrPO3$U<&)~Y zp2E3KX3+GyLXjK5imhtsO&3P##_!E1)?u)ZS#DiB3hAWhvsL}L8Gtjrr~mC^#dLvk zr<1e9PRj2Hg9kZUqHQE~%Z?|r<^~1v%mhOAkO&1n`Rdp6i*fJujWnSqgLwkKNR*W8 ze7GnSvYtJfc%&BY?WK3Reh<~ZhFJwAuyms1zjan#0Bx(YuDntNk#U!qjVDI9muB=P zn-!M^^W>PeEax`(lGqE9FoAlbpiuk%g(PNVYgR@g1G22m3I&7n>OLobGq)oK?5O09 z7xJhC`Cn37^W$X@WW>_rAh^%}B180iVBkdiS%@jb7qgdwPO7s0^S`gs)P9oiM1?z;169PhM&!jW88W1` z^^|?ZPulrXDCKwU)z{=g{-)JFN(ol5^%_HEP|>2%g{!)}2e_aiEvKN%q?f*{(->m|6bM`wIr8}|yfee!Ap5`iN`TirT3yrs{`@Sd zIk;yiiCIr4pETmlp2K>L)?$@Z4LZbFN%_f|bOnZD;hDNbqz%<2U+{#gT|q!X`ofOr19{0ySk*|d%&GRFid>hXqNziKyR|uB(r2s&u8rSclh_yl(hp6r`HY&LAu=0DHk%ft zSgPaWFjGV;8!~`16Mzo$7Q*mJHdxvd0hRhHI3-C6Bmy-&f3cFTcUb0Uxx%-6P`dt) zY0(j?tmSavwdDW}7~OvhmF{M;1uLfDmDe*MlT+T7z@rl3LxMfM+D%N6ktz#bHf<_< zLUjTpGlFh+>kpwxec4CXFiDJy^Y8yRxtmd(krJW^EsHi+NL zK5G8?PxoJqFX%i~5=lexA_NlHk>@*8fOePQ>Ib4hPjtE;R*TVu@qMWU*sRlP#*p0j zx`b;`0AB~?+6lzTF0Fif`5}*xYctQeFDOGI0sZdWlIQ6Rp^$r0XcGEYtDBM#!{4Cw zi%@K{J&&hCcK`CCQ-&~^Sq2|;mhXi-jOLAc$2L`Ze>&d`B_DS=rJ|SGbDH3yN|0uZ z=t&`}`t4a!KZ1W!@U67-UEx!bQhuGcLjhgnLPgXsL6?}BtQlU!+gG}%BjpvSCI~5F z@%?8NNE2}VT0UEe^lVNy|FebPr%)M_8Ih;zRsKdd1SHg64POp?tU=7Hc|&MZ{4eM8 zX7_IVa3ag>6Wi=^VWu3$DY(^Q1HawIKF%{e16TJ!wewhKb-msuiKx~%h%yOCRKz6&bx zcNp|aWRNA5CvKryTYQ%w9aK2}YFLk=ijmwK<4n+M)XqFUw}O&WxbF$nrp(%wmFrbG ztXATO2ta9q^+63u#H2pWxqE0RG$p?GoN{JB*!}hyDDON6jrJ&jEFstt|A$-4mLydD zGgtZI=oB<~v=@E7wehC@$ine^-Zqxm=J0b-_S+xDqw&mtrKQ^pPF?@DEW$XC9>VHOnlEk}>!YaZr)!-ZLzZ->O`)hVZlv&zC0r zu#a-27pH7C%n;$_M=q}eTX+-a-IPqbu)6qVXLU*bOsX2iAg9~O>NH`)i0sXW~GYhgz{qaX)~b`i{$hx&ng(qBP<9RUw)k=>G>j3St|m7 z!6zcuf>?1@2u}~JM}=?{MJtOs{5aTLY8Wx}Z%lwT=%%nE>k4{_6Ag_BQAL{+)Y&pg zg!l%zMG@%MOW}KZ&5vOk?NBkt$2!7H6$rySC?4j&>Ke_Nc7W{5=UZud4Va#r@Rsl@ z=!Eo?;@BNWgHZQtW_$lQ;Nt{DqfbC?m^?pHp6hY8c$8AVuNJ>7$;^e@c`~KD34~c> z;ULQiMLufX?XR6bfeApk02=T48!K-pnzle5Dp8)h+S<1#m*V#32e+c%*9lNjB@@pC zHNo&l2gK933$M+!?cnZWdT2=rD~1{R5V6b(V)7w4!u^~{ollJ6@b->}P(ek`Zoo4WoZfsmeLU`fv=RU#jLd7g02dVC9JVY9W(O@K5$ z=;Dsu58O8ejT9oYLWrsFM^+R5pM8{_co2ih%ubzjuKv7-)r-rbIuGKpJB&ZV@Qtcxj}hvK2lBZ~Yi7V4 zNYH}b?|pkn|8B?QHdApkjNN*q)qct_LBE<5n8Af1Pa$X!@+^et;Ri;f>xi#Sqsj$J z^^yjoR!@m$rSGbug`L{yzuM8#<<@60^!KG5Q1Uc%*_5l+YO|ffTvyBLN}Cl3B|+eb z(})FC`a)%FwW0#I75QTB#C*UO-vIRCZ!v}2UVR40kYjA))q zOLo%caB~#BfCzoT(=vt9Ryao)yWu5kdMS|tLxVMEo|Q4P+mjQ7NGT9_DNzPb?5o)E z(RmBY zrw|^^-&36tuZC2uB531gGD7yg6TaH7di9Mby%=0EpmMaY_NBy3Jipm*IODA;OiVAQ zlAa}E8U!jSeO#_pQ~ms?u+JvjQnW7%=0S(Rclb-FCI>0)ooc-_+FDb8tG{XbyAtI; z(=s?@$#!*n?^caUiT@v(&N?c}_50gHDIqnal*Ay2f}n&n0z=nGx1`j7qyiEmIdmfk z$j~L-jg&|?Ln$I1(k1fVocH_t=bUxca;+oGGxxLay+7BrrTX+8ko?_71iBNSPj3^cr-`Oj~W3 z6FWxxYDg7PzUp97_P@6=F)_17k7*l{zI@>h;@6Azut-Qi8DfwM;^Bl(A;%u>K^_>bJi%j6Kr4PA<4Pcn?T*>U zpL_&;>J-Lzyjr5`5~W`dG~{O(YN}OT)^}J=9d-!Omzf3)V&_jgKM5=&|Fmz#Be61h zdz=O5q~KXft{Tg^{z|gs{?jIfbQ%iWWwn5jVyt)dAje6Iv3aFcjr8HU-M}C5#nB?w~sM+Ht*i*e`fC{;bX*Zl-ya zS8W?f1oEfaa!!#b${wD5^d#p4J&0Os_t{Q> zK~A$Jabj$A*nfTo!#DM2xqDSn8f*&@j>8O@?zIPe*(ogM1?Bq6f|`n_qta|U7$Miu zqrNRTA*@!%oyfnReCm6d68byK5G~yc73tv4z!mtr6SDj1u@l9 z9A~gtRs_Et+6*1BC&VqRMY?Pr+>k!;29Ah|N(|%gH@$ZjbEX?5X&%Snvg%)1qa@w@tck1%0 zdpd|zg5f5mnqdA=$dkq4LZMgLNho28tJWwlu>=^k*-#h0t79bJMxGW_lG0dfAoa)h zwTEUmA)!{?UK4c<^BaI8Z7pUYiD@!~#GMo>$LtJi(TX$e9o}B=h;H@{slG_^px3JwNJgY3IS)fr%7}G%oIH+ zly4%>2%+saCj~bH7OSq+gLdK66PtBaTepY9KMSz=Jz0fdVI|odik6K9rY_4elOvv) z8v#Z~Ri`X5vKI-w*b)Tv!h$sJ7K5|rH#l78k*+)uG&t%E_PGn#|A977_?3bH#YFx3NrafRx;{DPj zUYc*{7g82r|IH$IiVmK__TUk`e6*Xaq|<;MO#pFqJg!4PX;~v-sCkcrb^I!t-jtSS zo86}vWoH^!7;d^<;wQXzeba?NZdsna>6)^{d+wTPFN z=Bh}m5wt{`IV-s`aUPiAzPqHbGa=3KIJgLtcy6i67-rJvOyg2CCUM}yMJeB@aE1HN zWX_-%-&3|Iv#I-hlq5b>EJuVFnx zXuVHvP8EQ{YX>#Jz@J>aG?y6~haZURydnN;Cves_m5ruFkZ{#YNkEngj00g25C(+9 z9mRz4s#e!lf(l$E^}d|GsLS>oBnOiq{?)sb z0`;J9O{X`;ebEU<(|owc<=QV?**qtY?#@|%5TIkRz(0Gy=y{2oQ&eBlJ=z+BOM`9k zDkr#84g~SuTRs;=Iv5y|qqwNa<+L$P?$+i;+RKZ+W$a-m-u@*@^CblO4_w1%!{ZNK z##Cb|^vYWXq<{F82F8wdgIw}0h&){>@09Z3Na9=DuTXeRmj6=HdkyrAcUNYG=lR1Y zb0Zy%-d~%Za5I4uL45Pe-^e=gY;jNb{!}I!)(99%_J)co^mb}~>Ow9p5(BE^v#>K7adyYh2PV580`Uityint< z>yEjhylW^+Tpsy~TC(3)a*H&m5+cF*specK<*<&i`tr;d>yJHu5)HHixAR3bu~y`0 z-~ZJyp=`p6tHCm~gV-wN4QlX>gIzJshpjN$IgOF3E9ma)Q(d%^G{xj#Nzi=yA zY3{T7%kLupr5l}BYMcu}JO5O2wkASuFy3Cm8LE#yi&akgQ579=km3Dcb`&&U+e6WP zxq*D>0y(t~{>Ynv)T=J(5rb}@w0}6p7kd#!u zbr7S>0zo&v;b5o=!cr1LhJZ~t#&O=?3pWbGju~(=3dPXDRpB*AV*c;spwAmC`UJxu4SV^Axq46~T7CK1#yK{KKX{$)*G^VOiPK-> z8Q+GgGCp2vaXUN*fWHA@qW6dVkXz0?Cq6d2Q|RsUpb!HzzeM(-#Qhy|&qNDLI1 z_ub!W4b=LIwImn3d5tt=|B_w8RTRe|61k>!aCsM_khw#3=WNZkAm3c!+%OwO=xfdX zsu(k@D8zos5v7zJPObdva-#=UJO65zZQPu@{^Ta=V=_g%h8@=aP&GeDbn|g}|~Z>hkq}IWnU58V?>+muJJMUe(mTfMRs+gx+6OeOVf-G1 z#{59@Q&Sm=G zM;^hX6E5}}sGi&#mT&J0$K9MN-(rSXNA&01+erbHz3WZES`;`c==Q1w9mM6V>BjD6 zizd=`O{P~O9N!FM`#FDziln4#Do)6m&8hq@EHB!D z>96<%5lU}(`M0Si8ez4y#(~mv_|}io@UW4_z;)rH>6ymOveCTDYyb|JJBc<8;hA6y z^7HHmK-z`xBJCx2b^)@T(6j^+%g)gqlF?XQAV+`i#&O`i1CZKxS6%&={L8B|#6GPc z!D|5l^kTj_#2G+C$ESt86d#9+0PKHl1qy?GZHsX%=GMPO&szU-UDy4o+kbn|21ZK^H+4>L zRBv>q&vE^@sCvjE<*Qr%Z~sJs|JmNo8&!tWru&{d!HOH)AsIMcJby%`ui1LLgq_8l z)qXFzjZc7fSJyA=p8fid6{ntFM9dkk_S?a}`HoM0bzJ;@zqbB zzgFBxhz70RrPnc3H!(~JzP`M9$^fw&4mfwv)O0<)8mlz~zxw!-re(md30z#`kkxJc z)7!PLW~{!=B02>gyOxF*e)M~%bpP_lF?Du5AZ!N!`=+)F5x?OWgtM5XR%2$1e3$bc zd1MpGkr?ie+4K=lqMTaP-Y@Q9Qg4Zk)0J6uQJbfp-}$Uewr}0rYAD^3f$UG5Cr0-U z7`~t%031on)wQR|af?X94yXNAvorXncdVI~aI%FzhD^|3gjs`5OU5%#tI55#@^d>d z_fl9r*GRh~NA93S{zse>@`RjT&fej178!pLevWt{<>qtCMWMu8%(TxaGQYpH_S|bx z0-8$lyrv31p8e7i(NSQySRqbPPMz4c|MDti1v1r*Ebl z_4$%Li&QuxLg!&8Ixsy#3kBsNt-Xz49)E$S*R;k^_vK(Jljz=uNYd<8{9{7Or zuzd&%8oK*Q{%tYwB34`V&D75fP+4fe2GlbvIjjH%?Z-aF2l1wlp+)cpAJ)=^+Sv4F z1@#PKD>)P@ZMJ%{2jIxr5dYgJ)jhe$I&27&#C+A}DWIPCS-YN9m)4&e<7eGJMTwEK z7BhSiM4gluT=PQIoiC$23$af@c=<7=a1LTi=fGZIV}hWj%JS$x5r#Q5k%1mtDHqDi zX)cMq+V8?x5WCIWwxk z-`?Eo4r?jJ$`Oa!u0N8NMVJ|S2c8tt8If7tvnP~e`pB%fQh}Uueyp}zwqI+Hac%>M z*ij14eD&Aem1CSj5k`B&IsI&Z4)B3|nf(KXL;d`uwWYEN{Iy%>4G}XDtoFE9y+E7u zv?hZE@lot`dfqXP>>{=_h;^^M0^XceT2AL*r?QC3`fppW;3HB+w3@jm>=)uvcC@zm z4{HX0Z1KCea!}Qs-y|T(Ny}m6eN!fz7MGcG)f1db(EvwO$2i9!whLj#_C2E?_cDjjMg(bvEJ7%vSD!de@_8DEOi|&6#!ENI` zFX~TLrd3MxsD8hO9n%=hnFRROT+L}n-z&E%ext3?%J!z9BL%r zk7Wa;&^FmPf}OHJITM*YE#YOr5HUkOt*XGr13zi_KeV@3bgGpqxwf$PtNdo?YEA};zr7R86 z9DYxR&{~<4wOa&+KY@3JZ)LD~e2etwOY~OiVBZe=o)o(G+tWKU*CV++A_R+rd4L9S+Pq{F9@N$i$^#)kNCDW>x9q_KYOQ%yovzpoWvGD)D=h z9-AI?6{G8D)@V*a+cq4~cDNmbsRN^{&*|a~WsC;yK4elWR^0CYGXMe57IuG`?S{PA z(OP=&ast3%Ca@{%$`bw5+EdnzDpYmtqG>d|ATJXz4YK`EX=e5?oiwaI>;6AN8h!ya zZf-GlgKU1;C=#e0&D-X;j}pYN6iH3lZCN-<#D#!sYz^Av89$yXgLx_fF44gTmNORo zKF_xw8TrXD<0!4}Hl2hZFo^D5@xB`iYMnkK^*!)c7$gk$C<0uBu)qt9gc`0l6o;gJ2F_PkD zzVeyfm|%;@p!UZ3W3MYCV~>4)Z>BM<*|noJx-4jjW=a;wOq#OF<}Mn+)$LBJq*h30 zDhY|9X>m>b#e&E6j>XjL887LKY_IQp?!Mcb_m9L4zIPcAFlMEZuY%SH?0NN^CYx77PrX2yKsVgmJm0!Y)KKOeHMZ3^^d`}+ zN}A15$bAOmD|&=k6_B*{5+PN|pl`}L{Jt?W>WJe9eM5g1Py43^&kamy*&N4w<^NpK z)auayp2gUu?R>MdA#dz->y(PI4G`mfVjwV*u~PHUk7C;RJPmb?P;J|zYV{pFo1uT# z+UL7jTJupy*}p8P^=lL;{dfM|yEIrTwh*FojoNICt*Z@=`#?w7{M+gASntST{7J+b zjI6f1`8Qu`EAvV46-iB^YqI4QwP&%QkT=g&>(7%nks`i2OkK;=lYhv z783xz%^DPt$cye?o(w+V>! zM*LqKsimD193fr^cu^Db%+kQMTZfn9q}J2fQ&BmguLGP817f{4*ldsOox+W-1%|Rk z+A!Od4(*odE_heQ8cars0RJ0K;AOF(8$MsWXORl!T5&Q>< zIIls9#EBUD%sxrX2T}|p_#aKD3eqJ*`Vb8O4@3N0PFv>Y%^q2hxinu~=||@CH{vr}JjQyt8<(Scn-A$g z7lb<|@cxTMN>cy2Ij435XaL>Bfy5ohe(Uty9|^KW9Zlk=2YKJ0Or8KmHM&Eb`a${|2%qgj_$S zdF=ey5)X&i=wT5_oKIS$#_vpwz!mN@sP5xah2gXV1rv@`Ig-Gi`9H)>D#gL>s}6f8 z=3r%|l>`C}Q0P=J`wSR77vX(a2ugWwg5ye%-j1)4_%DHfSG&!1j!)Vmg^K9Pwf=+) zEP*L|ucqEC&NMvs)w*;bpHq|F>*)agAUM&^!()7+$s@{18tV5?77`WMwxkl6xjwEm zFdDS$+n~6}1cN6(-#CG)1=%AY&5fYfumJF5h2#95{daM2fN+R<*r0NSM+~c``ySDxhFX%VwTBw2%7-+JwPI7J%_s+G`qI}Zt3L{` zxK~DHCQ>n0N{boMKS}3T=j0)E>#JP26@%=SJ8C|t`*^|*5kuoc01!M-lOo!@)7CPr zKuNU*(nsHx5B=>zS)IXc9;gIqK^ND_q{;x2@kiCIIpuaAuY95Hfv6-a#G zCL3H>dUM^D4Z^+4fExV_>S&Y5fSpX;2^^;j>}vrDoxNCS_lT1n#*EazD?3FVdiXiq zj7P!W5-|qch!Dj?lSPi|tTHr!eLFIUuUGC!68ws)ae{-^NW)GesaKEp68O)3>J0!F zB7dlhIlaO+2z1Kod0fVWqaZ%*Ss;6Kv$8bJ;*D*Cy)m z{mzvu+qqaH`Bmt$*iZ`Dbk(e7HcV!p#4wM0>RK4}f0199f~@uBfa?SD0R_7(2jmxM zPpa=y_hRJr9p-(WxmFX*o1<=>cGKm*K{Z*PAMe3{k80aFHd~DIuGSh8vWTi==Itw; zPq2xya(v(d;h^0i2w7|S2TvZhgD*UrgeL_{f zO!uKhP3COf>dnt_QsYRrImx6#W88zpAMX!UaMywc-upB_s9ZkQoN!E3l>zv-i_y!6 z{T7+fmRtGq8Wr(sa#aR5e|4V9R==M2OiD+q4k%qBvFhob7@pob6W^#N8Cd2PYY#+6w?&*aoPf2~PK_GzeO6PD%W`(Qh2Bsa+^ z{Pev50hnPM`>`)#4i&bps(W5{ZXbQBKK84nPPvX|H2B^(Tzy3)vnH^`;oy^f;x@4u ze2g6LXvha4^k3lVKu-7>qPspaiwWiXT!86qPSIhE$3(`s!QSvCkWHAJ z>3d}S{FJIYm#KT$Bhk&U9pbRnZ^LnvYSm^i#x@Z zAR;tBvNV}@`3uZo{U;>xN8 zy{Q@DP+(sz(9m4_mgkURO@d~_pdfuh1kMPCJ&q7tKlw{BCwbLxQ|xm!QO0Xjk)Wr( zB0hDjR*<|-6iMStYO>rXibx22UHP3Y3@%#%E=}_gD7rKD-SBQb0G>L0fLj4i=m=dS zi%6Rm+^U~mc=f(M>i;XsltNX(HSai;x%h`d2ELLFWh}h?@%nUDW)|@dR@c3j?f8#- z4ZxfhbZHi;e*@&RRkuLlYOJ8`Mgi{SD%OUmaJPo#jrl!N?mvmV7`bhb07yT-V{ara zTVYUHK#?ctJ(Q-hA1; zgwnAr7cARl^}Z5uQ>!_=OVeR|p?g2PaYhSWK%(H?Qp6kyg;NdoQ;cH&6*f&P*=nT; z+tRvj6HEPTqK`kWZ^xL|;2Qnc2^Q|Sd-p*3CVwb;eBM}f<*qA11M1CB+v*j}FKx6Q z5?XviXHbasOihiD#MtOpT4k>J<;Wt2zhYR1ftT_B`dRZn+D$q3kC?Z##22nJ+7R7H zPT!|44%<^19(uhYP$P_``&&w3r6W2G)&fiL^LuB?Obf)r8H!RZVueU&I(~d$d`#KT zKjG?cXZKKzar;*LFjD8+LJn2;e z;jyRAro9HOuRkW&M>5mai-$A&51UPb-`#_IIS@KV;LF$M5BdYo4%dI4oh)QDhf%C> zZu0}%1rQW75hZ3Wr2+zT(b38d?h)V3wuXQw7lBzRk}y*i4`jKHJBoEjE`rWA zxgPGl2#Qeh!;L%!c2;$9VyQfJimbJ0@iyy4s3#;Tc3km}Ya|E#&?hBdX zOE6?f(Ess!(vs8W51rw>-{cJKce*>Db`)sW48d(`G-+x>%`G zj}^q^UnC}TvZAVmVWfeAj<&YB&y$w$qKYKk)sEzU2(rIOYRRIm zsXE%j@&3~z+=$K?Zd^B&(WeVkp5ii8j{}J#m&fcfskB(bCjDhAK;Z)XMkt{3xhviX z6e>W3_*Evv-ZdKmVPGl5h4#h>1@>wBy*M5M`gsOV76(xrFU)!t3f&c2h_7hlY_Dix zA%#tlBTN408|$gnT4NoaWHyjeHe5DMwTa6-p@M}Iay#DK$z($r^MIVBx@4%K=(DiSFO;?cLSR?(_mOn|!$i|Ms=i+1t zeqrWbyia1?XAEbpq=nDAD)~K*j6=$)a(Y$=#>T>ZhvW1M9a@kNIV}3ET$nQYpB2plv_p5 z$pzdk`7jEB_-qh$0^Mws)KriDC0vib$;Jz_+Gm~oNAjC@hU|Ci(}I+!#c3O^?A)RR zrGl37fY;P87x%C+IBc2kH)BR<9$}rZ<7$1ZD|M#kA`Ji zp`zL78#(44a?CfG-lK^}_nqV}koGSF!4mVWxX!(1xg18-U#Gypy5KYQ0Mj9MreSf= z?DddjwZXo%3Avo{FY2CP#J#s|A*zTb;=j)Gz&!L6T;ej_8UL^e#q~;hWMdB7Nv6a| znkCL9rf6nT%Yo044kuLf)X(6A;~d$@ILsz4=%7?KxFLLi>e`_d=RUcWIZRP4%(#z> z!g>v{#c?p?u-ST`&jy9=JfNHRySzN3zch}YGF<<`cWW$_35Bnr(7u~ps()v48gsZf z^$>%}ju}x^_|xO-XhOWE{oei|e>D@nzwX+Ap;EX3O;dzKR#0)s|3$#id8p>z}(SS=agPylWN@FG9Rcq#4z}!<5MEsQ;E(|_>&)l zQqy!rFN`Ug&dd3-=h`#tu`IXHn%)=L1KyL?V4Buj)cV*-6xC{TWuBWVK_W_nSv?T@ zV%LNU9=e?TOX`spV-0B&vXp->OBRM!Fj(p%uO!WycAMGJ8VUYjFO|_7dG{4-XM*ml z!jq`u(2L8r-%kxI=v!L11zufW{H8@Ueu&(_Fs>+i9^pT9Gs zPb%LAhobTS*C|)KeENSmOePNULVU0sVZH|O(&AWYeSS|AGG<-kF#5SrSP&^QTKS#e z&Gp&tstNxWP>aJU;U-+fBV@-BtYMGtyG*J0RofO!*%!uA)wZR=9xwg7`tz<^8#?UmN{M|9Hi5L=m&GV4flZYk(D1BoMr>FlfTr_Md$=3snC@r6<-VI_90kO|9+J-o<3^Qg5 zW@fQ3h3!n`1Gacee_8OWX+HVLmpzQ-t4zZDP6Ef)tzvJoqIgo3*E zp3h1)p$!L2DOgG)Hh%rxaX8B07R`$stW~Ng-&lu?fYJXdV{G) z8TTjp#NXu%<$hRwUsk1&0iVp5p^Q&R;T&(T1Gh)=uj&L?m4S%xYXR}we~5;#mVRK4 z#-mL1s!o-}I+ANJs*lr*EX9V_O?f;Ny3-4=*vTE|6x* zDN1rMJ|{YUXbPHgkWbH%(}z_Me=w|#<1^6DPN5yY2|$Tm%gED?H%=eTlr#z$#iWNc z#G?mr)06G&!p!lX_J+`K{pHC+2GY?VwpGgo+vZ;|(Q)|fPJOg(QQ&lcwfyN(!=nJO z$3%kdkp8u9yd4g#M^wwAZ>x*0u0i=ATGCtbcW(XaBmu>n$46=W_7=9CCsvc)bXglF zMme#(Ndgg%)%gW?5@bhD?$?%g@mN?83%}bjy#f!rG;Y9yWGTHB0)?$R?ka);_~vqSQ78j4K}Q*<9F05&vUPCfmxiC9lZ>Avv1+tUP{Ty z9-}rEAEH6gKNTOE5iqnvZ{(l6DcG5`e{kfjNQTuWhU+g+ClEQCaR_-L8(WaXD{=1z z-OPU<6I&b%*x4+x$-1cB=84!kLGg^PpSMO6!0hZmfz_S~Bxv~_{V=sL5CT4z>$kx~ zfAI9zorx!vpxjNLWGT-HRl&}m)L;e6z+X+{Yj?G)fk4r2B`=zyOf^cr8b2%V;QxB~ zaE}9gHbpd2Lk*i2#k;u$F(TF}pneFHXG+bHh=1ez+sTW~F9LCBdR7#YG?cYE4zP}Z3 za%88W$o+c5K@uwB;AXCHcoG>%-WMm^y$wR+QK*1GL}unQF2gDt#eDY22!-)mqxKA} z5u2l=R?tA|a4>v>|Nlr-{trIR{ju(iDGuyDGPwQ2syWk5I2A#hoZ&B0eoObzXG&j9 za3Cj+N0WC9-+0gX4BML~LnAeIOlmYP0sDG*pJtd&J7;HQUfkP!Wiu~R+R<;ug=Xo6xp_GyRRZ)?3?GUKdxFi1P15u}|gX!V*yoL4oYZ5deGL%;br+7eV zrtz#Heynj+p8_p?nWx7qaFF1j-SX7Z`&E>BU0togQ$J}sERlQm; #hjnJo7ye52 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

    As!dHE7o8jMW_{y1=-@ljrM3 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Ðcz*wyt?!F;-3sdea$IE)D%y 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 O0D-5gpUXO@geCyMVxb5C literal 0 HcmV?d00001 From cd6692661d8c5314ba9409d9a132e1e2f3728fd9 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sat, 9 Sep 2023 11:32:18 +0200 Subject: [PATCH 0711/1398] Move Sizing_field_base.h out of internal --- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 2 +- .../{internal => }/Isotropic_remeshing/Sizing_field_base.h | 0 .../include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/{internal => }/Isotropic_remeshing/Sizing_field_base.h (100%) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index fcc96deb9baf..b1794a6a6b77 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -15,7 +15,7 @@ #include -#include +#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Isotropic_remeshing/Sizing_field_base.h similarity index 100% rename from Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Isotropic_remeshing/Sizing_field_base.h rename to Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Isotropic_remeshing/Sizing_field_base.h diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h index c49273921074..02d21df369be 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Uniform_sizing_field.h @@ -15,7 +15,7 @@ #include -#include +#include #include From 22b08dfaf86a0a5792ea6d656b8b34a1b911dced Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sat, 9 Sep 2023 11:46:43 +0200 Subject: [PATCH 0712/1398] Update documentation Info on curvature calculation in Adaptive_sizing_field Update reference manual welcome page --- .../doc/Polygon_mesh_processing/PackageDescription.txt | 7 +++++-- .../CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index 83929a699818..74bfc24e231b 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -115,8 +115,6 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::split()` \cgalCRPSection{Meshing Functions} -- \link PMP_meshing_grp `CGAL::Polygon_mesh_processing::isotropic_remeshing()` \endlink -- \link PMP_meshing_grp `CGAL::Polygon_mesh_processing::split_long_edges()` \endlink - `CGAL::Polygon_mesh_processing::remesh_planar_patches()` - `CGAL::Polygon_mesh_processing::remesh_almost_planar_patches()` - `CGAL::Polygon_mesh_processing::refine()` @@ -131,9 +129,14 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::smooth_mesh()` (deprecated) - `CGAL::Polygon_mesh_processing::angle_and_area_smoothing()` - `CGAL::Polygon_mesh_processing::tangential_relaxation()` +- `CGAL::Polygon_mesh_processing::tangential_relaxation_with_sizing()` - `CGAL::Polygon_mesh_processing::smooth_shape()` - `CGAL::Polygon_mesh_processing::random_perturbation()` +\cgalCRPSection{Sizing Fields} +- `CGAL::Polygon_mesh_processing::Uniform_sizing_field()` +- `CGAL::Polygon_mesh_processing::Adaptive_sizing_field()` + \cgalCRPSection{Orientation Functions} - `CGAL::Polygon_mesh_processing::orient_polygon_soup()` - `CGAL::Polygon_mesh_processing::orient()` diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index b1794a6a6b77..60c9e5f76597 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -32,6 +32,9 @@ namespace Polygon_mesh_processing * provides a set of instructions for isotropic remeshing to achieve variable * mesh edge lengths as a function of local discrete curvatures. * +* The local discrete curvatures are calculated using the +* `CGAL::Polygon_mesh_processing::interpolated_corrected_principal_curvatures_and_directions()` function. +* * Edges longer than the local target edge length are split in half, while * edges shorter than the local target edge length are collapsed. * From 7037103416379b20e7254325460696b95d98a20d Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sat, 9 Sep 2023 12:49:03 +0200 Subject: [PATCH 0713/1398] Introduce ball_radius NP for curvature calculation in Adaptive_sizing_field --- .../Adaptive_sizing_field.h | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 60c9e5f76597..783b7f5e5669 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -71,31 +71,50 @@ class Adaptive_sizing_field : public Sizing_field_base * * @tparam FaceRange range of `boost::graph_traits::%face_descriptor`, * model of `Range`. Its iterator type is `ForwardIterator`. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" * * @param tol the error tolerance, used together with curvature to derive target edge length. - * Lower tolerance values will result in shorter mesh edges. + * Lower tolerance values will result in shorter mesh edges. * @param edge_len_min_max is the stopping criterion for minimum and maximum allowed * edge length. * @param face_range the range of triangular faces defining one or several surface patches * to be remeshed. It should be the same as the range of faces used for `isotropic_remeshing()`. * @param pmesh a polygon mesh with triangulated surface patches to be remeshed. It should be the * same mesh as the one used in `isotropic_remeshing()`. + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + + * \cgalNamedParamsBegin + * \cgalParamNBegin{ball_radius} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures + * by summing measures of faces inside a ball of this radius centered at the + * vertex expanded from. The summed face measures are weighted by their + * inclusion ratio inside this ball.} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures. + * It can effectively smooth the curvature field and consequently the sizing field.} + * \cgalParamType{`Base::FT`} + * \cgalParamDefault{`-1`} + * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of + * measures on faces around the vertex.} + * \cgalParamNEnd */ - template + template Adaptive_sizing_field(const double tol , const std::pair& edge_len_min_max , const FaceRange& face_range - , PolygonMesh& pmesh) + , PolygonMesh& pmesh + , const NamedParameters& np = parameters::default_values()) : tol(tol) , m_short(edge_len_min_max.first) , m_long(edge_len_min_max.second) , m_vpmap(get(CGAL::vertex_point, pmesh)) , m_vertex_sizing_map(get(Vertex_property_tag(), pmesh)) { + if (face_range.size() == faces(pmesh).size()) { // calculate curvature from the whole mesh - calc_sizing_map(pmesh); + calc_sizing_map(pmesh, np); } else { @@ -108,14 +127,16 @@ class Adaptive_sizing_field : public Sizing_field_base is_selected, std::back_inserter(selection)); Face_filtered_graph ffg(pmesh, selection); - calc_sizing_map(ffg); + calc_sizing_map(ffg, np); } } ///@} private: - template - void calc_sizing_map(FaceGraph& face_graph) + template + void calc_sizing_map(FaceGraph& face_graph + , const NamedParameters& np) { //todo ip: please check if this is good enough to store curvature typedef Principal_curvatures_and_directions Principal_curvatures; @@ -123,6 +144,10 @@ class Adaptive_sizing_field : public Sizing_field_base typedef typename boost::property_map::type Vertex_curvature_map; + using parameters::choose_parameter; + using parameters::get_parameter; + typename Base::FT radius = choose_parameter(get_parameter(np, internal_np::ball_radius), -1); + #ifdef CGAL_PMP_REMESHING_VERBOSE int oversize = 0; int undersize = 0; @@ -132,7 +157,8 @@ class Adaptive_sizing_field : public Sizing_field_base Vertex_curvature_map vertex_curvature_map = get(Vertex_curvature_tag(), face_graph); interpolated_corrected_principal_curvatures_and_directions(face_graph - , vertex_curvature_map); + , vertex_curvature_map + , parameters::ball_radius(radius)); // calculate vertex sizing field L(x_i) from the curvature field for(vertex_descriptor v : vertices(face_graph)) { From 426c6f9f5b156b1938ab59f19e2682c5cf7e3ff5 Mon Sep 17 00:00:00 2001 From: Ivan Paden Date: Sat, 9 Sep 2023 15:56:04 +0200 Subject: [PATCH 0714/1398] Update polyhedron demo with ball_radius np in Adaptive_sizing_field --- .../Adaptive_sizing_field.h | 7 +- .../Plugins/PMP/Isotropic_remeshing_dialog.ui | 219 ++++++++++-------- .../PMP/Isotropic_remeshing_plugin.cpp | 73 ++++-- 3 files changed, 191 insertions(+), 108 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 783b7f5e5669..6525d7b2f85f 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -85,10 +85,9 @@ class Adaptive_sizing_field : public Sizing_field_base * \cgalNamedParamsBegin * \cgalParamNBegin{ball_radius} - * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures - * by summing measures of faces inside a ball of this radius centered at the - * vertex expanded from. The summed face measures are weighted by their - * inclusion ratio inside this ball.} + * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures. + * It can potentially smooth the curvature and consequently the sizing field in the + * case of noisy input.} * \cgalParamDescription{a scalar value specifying the radius used for expanding curvature measures. * It can effectively smooth the curvature field and consequently the sizing field.} * \cgalParamType{`Base::FT`} diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui index 540a52c1bff9..fd2e9c6ab6c3 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_dialog.ui @@ -10,7 +10,7 @@ 0 0 381 - 545 + 620 @@ -59,7 +59,68 @@ Isotropic remeshing - + + + + + + + + + + + + Minimum edge length + + + + + + + + + + + + + + 0 + + + 100 + + + 1 + + + + + + + Error tolerance + + + + + + + + + + true + + + + + + + + + + 0.00 + + + @@ -109,7 +170,7 @@ - + Qt::Vertical @@ -122,87 +183,17 @@ - - - - Qt::Vertical - - - QSizePolicy::Maximum - - - - 20 - 24 - - - - - - - - Error tolerance - - - - - - - - - - 0.00 - - - - - - - Minimum edge length - - - - - - - - - - - - - - 0 - - - 100 - - - 1 - - - - - - - - - - true - - - - - + + - Number of Smoothing iterations + Allow 1D smoothing along borders Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + Protect borders/selected edges @@ -212,24 +203,14 @@ - + - - - - Allow 1D smoothing along borders - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + Preserve duplicated edges @@ -239,7 +220,7 @@ - + @@ -252,7 +233,7 @@ - + Number of Main iterations @@ -265,6 +246,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Maximum + + + + 20 + 24 + + + + @@ -312,6 +309,46 @@ + + + + Number of Smoothing iterations + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Ball radius + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Curvature smoothing + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -1 + + + false + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp index a819c2c22943..06155a62c217 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Isotropic_remeshing_plugin.cpp @@ -300,7 +300,8 @@ class Polyhedron_demo_isotropic_remeshing_plugin : const double target_length, const double error_tol, const double min_length, - const double max_length) + const double max_length, + const double curv_ball_r) { std::vector p_edges; for(edge_descriptor e : edges(pmesh)) @@ -335,7 +336,8 @@ class Polyhedron_demo_isotropic_remeshing_plugin : error_tol , edge_min_max , faces(*selection_item->polyhedron()) - , *selection_item->polyhedron()); + , *selection_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r)); CGAL::Polygon_mesh_processing::split_long_edges( p_edges , adaptive_sizing @@ -394,6 +396,8 @@ public Q_SLOTS: unsigned int nb_smooth = ui.nbSmoothing_spinbox->value(); bool protect = ui.protect_checkbox->isChecked(); bool smooth_features = ui.smooth1D_checkbox->isChecked(); + bool curv_smooth = ui.curvSmooth_checkbox->isChecked(); + double curv_ball_r = ui.curvSmoothBallR_edit->value(); // wait cursor QApplication::setOverrideCursor(Qt::WaitCursor); @@ -425,7 +429,8 @@ public Q_SLOTS: { if (edges_only) { - do_split_edges(edge_sizing_type, selection_item, pmesh, target_length, error_tol, min_length, max_length); + do_split_edges(edge_sizing_type, selection_item, pmesh, + target_length, error_tol, min_length, max_length, curv_ball_r); } else //not edges_only { @@ -461,7 +466,8 @@ public Q_SLOTS: } else { - do_split_edges(edge_sizing_type, selection_item, pmesh, target_length, error_tol, min_length, max_length); + do_split_edges(edge_sizing_type, selection_item, pmesh, + target_length, error_tol, min_length, max_length, curv_ball_r); } } @@ -517,7 +523,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*selection_item->polyhedron()) - , *selection_item->polyhedron()); + , *selection_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r)); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(*selection_item->polyhedron()) , adaptive_sizing_field @@ -600,7 +607,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*selection_item->polyhedron()) - , *selection_item->polyhedron()); + , *selection_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r)); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing(selection_item->selected_facets , adaptive_sizing_field @@ -675,9 +683,10 @@ public Q_SLOTS: { std::pair edge_min_max{min_length, max_length}; PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol - , edge_min_max - , faces(pmesh) - , pmesh); + , edge_min_max + , faces(pmesh) + , pmesh + , CGAL::parameters::ball_radius(curv_ball_r)); CGAL::Polygon_mesh_processing::split_long_edges( edges_to_split , target_length @@ -704,7 +713,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(pmesh) - , pmesh); + , pmesh + , CGAL::parameters::ball_radius(curv_ball_r)); CGAL::Polygon_mesh_processing::split_long_edges( edges_to_split , adaptive_sizing_field @@ -799,7 +809,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol , edge_min_max , faces(*poly_item->polyhedron()) - , *poly_item->polyhedron()); + , *poly_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r)); if (fpmap_valid) CGAL::Polygon_mesh_processing::isotropic_remeshing( faces(*poly_item->polyhedron()) @@ -862,6 +873,8 @@ public Q_SLOTS: unsigned int nb_iter = 1; bool protect = false; bool smooth_features = true; + bool curv_smooth = false; + double curv_ball_r = -1; std::vector selection; for(int index : scene->selectionIndices()) @@ -902,6 +915,8 @@ public Q_SLOTS: nb_iter = ui.nbIterations_spinbox->value(); protect = ui.protect_checkbox->isChecked(); smooth_features = ui.smooth1D_checkbox->isChecked(); + curv_smooth = ui.curvSmooth_checkbox->isChecked(); + curv_ball_r = ui.curvSmoothBallR_edit->value(); } } } @@ -1011,6 +1026,8 @@ public Q_SLOTS: unsigned int nb_iter_; bool protect_; bool smooth_features_; + bool curv_smooth_; + double curv_ball_r_; protected: void remesh(Scene_facegraph_item* poly_item, @@ -1042,7 +1059,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ , edge_min_max , faces(*poly_item->polyhedron()) - , *poly_item->polyhedron()); + , *poly_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r_)); CGAL::Polygon_mesh_processing::split_long_edges( border_edges , target_length_ @@ -1072,7 +1090,8 @@ public Q_SLOTS: PMP::Adaptive_sizing_field adaptive_sizing_field(error_tol_ , edge_min_max , faces(*poly_item->polyhedron()) - , *poly_item->polyhedron()); + , *poly_item->polyhedron() + , CGAL::parameters::ball_radius(curv_ball_r_)); CGAL::Polygon_mesh_processing::isotropic_remeshing( faces(*poly_item->polyhedron()) , target_length_ @@ -1234,6 +1253,10 @@ public Q_SLOTS: ui.minEdgeLength_edit->hide(); ui.maxEdgeLength_label->hide(); ui.maxEdgeLength_edit->hide(); + ui.curvSmooth_checkbox->hide(); + ui.curvSmooth_label->hide(); + ui.curvSmoothBallR_edit->hide(); + ui.curvSmoothBallR_label->hide(); } else if (index == 1) { @@ -1245,6 +1268,25 @@ public Q_SLOTS: ui.minEdgeLength_edit->show(); ui.maxEdgeLength_label->show(); ui.maxEdgeLength_edit->show(); + ui.curvSmooth_checkbox->show(); + ui.curvSmooth_label->show(); + ui.curvSmoothBallR_edit->show(); + ui.curvSmoothBallR_label->show(); + } + } + + void update_after_curvSmooth_click() + { + if (ui.curvSmooth_checkbox->isChecked()) + { + ui.curvSmoothBallR_label->setEnabled(true); + ui.curvSmoothBallR_edit->setEnabled(true); + } + else + { + ui.curvSmoothBallR_label->setEnabled(false); + ui.curvSmoothBallR_edit->setValue(-1); + ui.curvSmoothBallR_edit->setEnabled(false); } } @@ -1268,6 +1310,7 @@ public Q_SLOTS: connect(ui.splitEdgesOnly_checkbox, SIGNAL(clicked(bool)), this, SLOT(update_after_splitEdgesOnly_click())); connect(ui.edgeSizing_type_combo_box, SIGNAL(currentIndexChanged(int)), this, SLOT(on_edgeSizing_type_combo_box_changed(int))); + connect(ui.curvSmooth_checkbox, SIGNAL(clicked(bool)), this, SLOT(update_after_curvSmooth_click())); //Set default parameters Scene_interface::Bbox bbox = poly_item != nullptr ? poly_item->bbox() @@ -1313,6 +1356,10 @@ public Q_SLOTS: on_edgeSizing_type_combo_box_changed(0); ui.protect_checkbox->setChecked(false); ui.smooth1D_checkbox->setChecked(true); + ui.curvSmooth_checkbox->setChecked(false); + ui.curvSmoothBallR_label->setEnabled(false); + ui.curvSmoothBallR_edit->setEnabled(false); + ui.curvSmoothBallR_edit->setValue(-1); if (nullptr != selection_item) { From b370381e0a54153a2c48b8748001b244c4d232d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 12 Sep 2023 15:26:31 +0200 Subject: [PATCH 0715/1398] add missing ending --- .../include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h index 6525d7b2f85f..d77803bba822 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/Adaptive_sizing_field.h @@ -95,6 +95,7 @@ class Adaptive_sizing_field : public Sizing_field_base * \cgalParamExtra{If this parameter is omitted (`-1`), the expansion will just by a weightless sum of * measures on faces around the vertex.} * \cgalParamNEnd + * \cgalNamedParamsEnd */ template From cf1b5fd46af49ea1d557c2fb499d99a6c07fc043 Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Wed, 13 Sep 2023 11:38:45 +0200 Subject: [PATCH 0716/1398] Update CMakeLists for QT6 --- .../Hyperbolic_triangulation_2/CMakeLists.txt | 2 +- .../Periodic_3_triangulation_3/CMakeLists.txt | 3 +- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 33 +++---------------- .../Principal_component_analysis/PCA_demo.cpp | 6 ---- 5 files changed, 9 insertions(+), 37 deletions(-) diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index 9d46e7227294..c4191347bfdc 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -20,7 +20,7 @@ if(CGAL_Qt6_FOUND set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - qt_add_executable ( HDT2 HDT2.cpp) + qt_add_executable ( HDT2 HDT2.cpp resources/Delaunay_triangulation_2.qrc) target_include_directories(HDT2 PRIVATE ./ ./include) add_to_cached_list( CGAL_EXECUTABLE_TARGETS HDT2 ) target_link_libraries ( HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index 22c26c48986b..7225c76cd3ba 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -50,7 +50,8 @@ if(CGAL_Qt6_FOUND periodic_3_triangulation_3_demo.cpp MainWindow.ui moc_MainWindow.cpp - Periodic_3_triangulation_3.qhc) + Periodic_3_triangulation_3.qhc + Periodic_3_triangulation_3.qrc) add_to_cached_list(CGAL_EXECUTABLE_TARGETS periodic_3_triangulation_3_demo) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index d3ba88394b2f..3b838ba2c829 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -24,7 +24,7 @@ if((CGAL_Core_FOUND OR LEDA_FOUND) set(CMAKE_AUTORCC ON) # cpp files - qt_add_executable(P4HDT2 P4HDT2.cpp P4HDT2.ui) + qt_add_executable(P4HDT2 P4HDT2.cpp P4HDT2.ui Main_resources.qrc) target_link_libraries(P4HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) if(TARGET CGAL::CGAL_Core) diff --git a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt index 9b7e95914aae..9a6ace55f2b3 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt +++ b/Principal_component_analysis/demo/Principal_component_analysis/CMakeLists.txt @@ -3,15 +3,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Principal_component_analysis_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - include_directories(./) # Find CGAL and CGAL Qt6 @@ -25,30 +16,16 @@ if(NOT TARGET CGAL::Eigen3_support) endif() # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets OpenGL) +find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) if(CGAL_Qt6_FOUND AND Qt6_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) - qt6_wrap_ui(UI_FILES MainWindow.ui) - - include(AddFileDependencies) - - qt6_generate_moc("MainWindow.h" - "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp") - add_file_dependencies(MainWindow_moc.cpp - "${CMAKE_CURRENT_SOURCE_DIR}/MainWindow.h") - - qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") - add_file_dependencies(Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h") - - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES PCA_demo.qrc) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - add_file_dependencies( - PCA_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" - "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp") - add_executable(PCA_demo PCA_demo.cpp ${UI_FILES} ${CGAL_Qt6_RESOURCE_FILES} - ${CGAL_Qt6_MOC_FILES}) + qt_add_executable(PCA_demo PCA_demo.cpp MainWindow.ui MainWindow.cpp Viewer.cpp Scene.cpp) target_link_libraries(PCA_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 CGAL::Eigen3_support Qt6::Widgets Qt6::OpenGL) diff --git a/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp b/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp index 04b8cf11f13c..a5a393c4d478 100644 --- a/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp +++ b/Principal_component_analysis/demo/Principal_component_analysis/PCA_demo.cpp @@ -51,9 +51,3 @@ int main(int argc, char **argv) return app.exec(); } -# include "Scene.cpp" -# include "Viewer.cpp" -# include "Viewer_moc.cpp" -# include "MainWindow.cpp" -# include "MainWindow_moc.cpp" - From 4b3279e66589ddce5159d4973cebc4b1f51e28ec Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 13 Sep 2023 14:59:10 +0200 Subject: [PATCH 0717/1398] Remove the "Use OpenGL" option from 2D demos --- .../include/CGAL/Qt/DemosMainWindow.h | 2 - .../include/CGAL/Qt/DemosMainWindow_impl.h | 40 ------------------- 2 files changed, 42 deletions(-) diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow.h index d28d98b37188..8f71f6bf1171 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow.h @@ -89,7 +89,6 @@ public Q_SLOTS: protected Q_SLOTS: void setUseAntialiasing(bool checked); - void setUseOpenGL(bool checked); void popupAboutCGAL(); void popupAboutDemo(); @@ -108,7 +107,6 @@ protected Q_SLOTS: GraphicsViewNavigation* navigation; QLabel* xycoord ; - QAction *actionUse_OpenGL; QAction *actionUse_Antialiasing; QAction *actionAbout; QAction *actionAboutCGAL; diff --git a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h index 8b6cb174703c..5f8c85c1d7f3 100644 --- a/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h +++ b/GraphicsView/include/CGAL/Qt/DemosMainWindow_impl.h @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -41,7 +40,6 @@ # include #endif #include -#include #include // needed to get CGAL_VERSION_STR #include @@ -62,13 +60,6 @@ DemosMainWindow::DemosMainWindow(QWidget * parent, ::Qt::WindowFlags flags) xycoord->setMinimumSize(xycoord->sizeHint()); xycoord->clear(); - actionUse_OpenGL = new QAction(this); - actionUse_OpenGL->setObjectName("actionUse_OpenGL"); - actionUse_OpenGL->setCheckable(true); - actionUse_OpenGL->setText(tr("Use &OpenGL")); - actionUse_OpenGL->setStatusTip(tr("Make Qt use OpenGL to display the graphical items, instead of its native painting system.")); - actionUse_OpenGL->setShortcut(tr("Ctrl+G")); - actionUse_Antialiasing = new QAction(this); actionUse_Antialiasing->setObjectName("actionUse_Antialiasing"); actionUse_Antialiasing->setCheckable(true); @@ -151,12 +142,9 @@ DemosMainWindow::setupOptionsMenu(QMenu* menuOptions) if(!menuOptions->isEmpty()) { menuOptions->addSeparator(); } - menuOptions->addAction(actionUse_OpenGL); menuOptions->addAction(actionUse_Antialiasing); connect(actionUse_Antialiasing, SIGNAL(toggled(bool)), this, SLOT(setUseAntialiasing(bool))); - connect(actionUse_OpenGL, SIGNAL(toggled(bool)), - this, SLOT(setUseOpenGL(bool))); actionUse_Antialiasing->setChecked(true); } @@ -203,34 +191,6 @@ DemosMainWindow::setUseAntialiasing(bool checked) 1000); } -CGAL_INLINE_FUNCTION -void -DemosMainWindow::setUseOpenGL(bool checked) -{ - if(checked) { - QOpenGLWidget* new_viewport = new QOpenGLWidget(this); - new_viewport->setUpdateBehavior(QOpenGLWidget::NoPartialUpdate); - - // Setup the format to allow antialiasing with OpenGL: - // one need to activate the SampleBuffers, if the graphic driver allows - // this. - auto glformat = new_viewport->format(); - glformat.setSamples(4); - new_viewport->setFormat(glformat); - - view->setViewport(new_viewport); - view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); - } - else { - view->setViewport(new QWidget(this)); - view->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); - } - statusBar()->showMessage(tr("OpenGL %1activated").arg(checked?"":"de-"), - 1000); - view->viewport()->installEventFilter(navigation); - view->setFocus(); -} - CGAL_INLINE_FUNCTION QMenu* DemosMainWindow::getMenu(QString objectName, QString title) From 0d9037b8dacbae191c3f7deac483d30fffca06a3 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 13 Sep 2023 14:59:21 +0200 Subject: [PATCH 0718/1398] add the ui file --- .../demo/Hyperbolic_triangulation_2/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt index c4191347bfdc..2f75d88b48ae 100644 --- a/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/CMakeLists.txt @@ -4,9 +4,6 @@ project(Hyperbolic_triangulation_2_Demo) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6) find_package(LEDA QUIET) @@ -17,10 +14,11 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND AND (CGAL_Core_FOUND OR LEDA_FOUND)) + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - qt_add_executable ( HDT2 HDT2.cpp resources/Delaunay_triangulation_2.qrc) + qt_add_executable ( HDT2 HDT2.cpp HDT2.ui resources/Delaunay_triangulation_2.qrc ) target_include_directories(HDT2 PRIVATE ./ ./include) add_to_cached_list( CGAL_EXECUTABLE_TARGETS HDT2 ) target_link_libraries ( HDT2 PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets) From cb68fdf09ecec5e2e26f3d866799ccf931dd35c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 13 Sep 2023 15:20:11 +0200 Subject: [PATCH 0719/1398] Add breaking changes --- Installation/CHANGES.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 479984002682..01485063f191 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -35,6 +35,18 @@ Release date: October 2023 - Removed the class templates `Gray_image_mesh_domain_3`, `Implicit_mesh_domain_3`, and `Labeled_image_mesh_domain_3` which are deprecated since CGAL-4.13. +### [Tetrahedral Remeshing](https://doc.cgal.org/6.0/Manual/packages.html#PkgTetrahedralRemeshing) +- **Breaking change**: The template parameters of + `CGAL::Tetrahedral_remeshing::Remeshing_cell_base_3` + have been modified, reverting changes introduced in CGAL 5.6. +- **Breaking change**: The vertex base of + `CGAL::Tetrahedral_remeshing::Remeshing_vertex_base_3` + must now be a model of the concept ` SimplicialMeshVertexBase_3` (and not only `TriangulationVertexBase_3`). + +### [3D Simplicial Mesh Data Structure](https://doc.cgal.org/6.0/Manual/packages.html#PkgSMDS3) +- **Breaking change**: The template parameters of + `CGAL::Simplicial_mesh_cell_base_3` + have been modified to enable passing a geometric traits and a custom cell base class. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- From 67baec27a1e9b9d64128d054ddc12fdd625a090c Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 13 Sep 2023 15:37:01 +0200 Subject: [PATCH 0720/1398] Fix Optimal_transportation_reconstruction_2_Demo --- .../CMakeLists.txt | 56 +++---------------- .../dialog_options.cpp | 3 + .../dialog_options.h | 1 + .../scene.h | 1 + .../window.cpp | 1 - 5 files changed, 14 insertions(+), 48 deletions(-) create mode 100644 Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.cpp diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt index 2b4aafc27cb8..5b8060beca2b 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt @@ -3,27 +3,11 @@ cmake_minimum_required(VERSION 3.1...3.23) project(Optimal_transportation_reconstruction_2_Demo) -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() - -# Include this package's headers first -include_directories(BEFORE ./ ./include) - # Find CGAL and CGAL Qt6 find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) -if(Qt6_FOUND) - add_definitions(-DQT_NO_KEYWORDS) - set(CMAKE_INCLUDE_CURRENT_DIR ON) -endif(Qt6_FOUND) # Find CImg find_path( @@ -40,33 +24,15 @@ else() endif() if(CGAL_Qt6_FOUND AND Qt6_FOUND) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) - set(SRCS glviewer.cpp scene.cpp Otr2_demo.cpp window.cpp render.cpp) - - set(CGAL_Qt6_MOC_FILES moc_dialog_options.cxx moc_glviewer.cxx moc_window.cxx) - - set(UIS pwsrec.ui options.ui) - - qt6_wrap_ui(UI_FILES ${UIS}) - - include(AddFileDependencies) - - qt6_generate_moc("window.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_window.cxx") - add_file_dependencies(moc_window.cxx "${CMAKE_CURRENT_SOURCE_DIR}/window.h") - - qt6_generate_moc("glviewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_glviewer.cxx") - add_file_dependencies(moc_glviewer.cxx - "${CMAKE_CURRENT_SOURCE_DIR}/glviewer.h") - - qt6_generate_moc("dialog_options.h" - "${CMAKE_CURRENT_BINARY_DIR}/moc_dialog_options.cxx") - add_file_dependencies(moc_dialog_options.cxx - "${CMAKE_CURRENT_SOURCE_DIR}/dialog_options.h") - - qt6_add_resources(CGAL_Qt6_RESOURCE_FILES pwsrec.qrc) + add_definitions(-DQT_NO_KEYWORDS) + set(CMAKE_INCLUDE_CURRENT_DIR ON) - add_executable(Otr2_demo ${SRCS} ${CGAL_Qt6_MOC_FILES} ${UI_FILES} - ${CGAL_Qt6_RESOURCE_FILES}) + add_executable(Otr2_demo glviewer.cpp scene.cpp Otr2_demo.cpp window.cpp render.cpp dialog_options.cpp + pwsrec.ui options.ui pwsrec.qrc) target_link_libraries(Otr2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGLWidgets) @@ -86,9 +52,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Otr2_demo) -else( - CGAL_Qt6_FOUND - AND Qt6_FOUND) +else() set(OTR2_MISSING_DEPS "") @@ -102,6 +66,4 @@ else( message("NOTICE: This demo requires ${OTR2_MISSING_DEPS} and will not be compiled.") -endif( - CGAL_Qt6_FOUND - AND Qt6_FOUND) +endif() diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.cpp b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.cpp new file mode 100644 index 000000000000..4419cbc979d5 --- /dev/null +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.cpp @@ -0,0 +1,3 @@ +#include "dialog_options.h" + +Dialog_options::~Dialog_options() {} diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.h b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.h index 8df3c2c86056..25d3f497bd51 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.h +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/dialog_options.h @@ -26,6 +26,7 @@ public Q_SLOTS: { setupUi(this); } + virtual ~Dialog_options(); void set_all_ranges() { diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/scene.h b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/scene.h index 7ac83c723f59..9cc6b7240571 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/scene.h +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/scene.h @@ -17,6 +17,7 @@ #ifdef CGAL_USE_CIMG #define cimg_display 0 // To avoid X11 or Windows-GDI dependency #include +#include #endif #include // std::pair #include diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/window.cpp b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/window.cpp index 31003233b111..3e52a5ef95e6 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/window.cpp +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/window.cpp @@ -11,7 +11,6 @@ // local #include "window.h" -#include "ui_options.h" #include "dialog_options.h" MainWindow::MainWindow() : From 86e28d2c85e868b20a41ac5939673bc324e6c830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 13 Sep 2023 15:45:15 +0200 Subject: [PATCH 0721/1398] Change default model --- Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp index 66e9653f1b41..113215b631a1 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -63,7 +63,7 @@ using Facet = Triangulation::Facet; int main(int argc, char** argv) { // Read the input - const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/armadillo.off"); + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/bull.off"); std::cout << "Reading " << filename << "..." << std::endl; Points points; From b01da56a56ee4418dc2396f6541ed1ffa7796497 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 13 Sep 2023 17:13:39 +0200 Subject: [PATCH 0722/1398] remove occurrences of OpenGLWidgets in demos' CMake scripts --- GraphicsView/demo/Polygon/CMakeLists.txt | 2 +- .../Optimal_transportation_reconstruction_2/CMakeLists.txt | 4 ++-- .../demo/Polyhedron/implicit_functions/CMakeLists.txt | 6 +----- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index 341021360a39..303b381e038f 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -13,7 +13,7 @@ if(NOT TARGET CGAL::Eigen3_support) return() endif() -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt index 5b8060beca2b..d62d77e37b77 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt @@ -7,7 +7,7 @@ project(Optimal_transportation_reconstruction_2_Demo) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -find_package(Qt6 QUIET COMPONENTS Widgets OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Widgets) # Find CImg find_path( @@ -34,7 +34,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_executable(Otr2_demo glviewer.cpp scene.cpp Otr2_demo.cpp window.cpp render.cpp dialog_options.cpp pwsrec.ui options.ui pwsrec.qrc) - target_link_libraries(Otr2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::OpenGLWidgets) + target_link_libraries(Otr2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6) # Link with pthread if necessary if(CIMG_INCLUDE_DIR) diff --git a/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt b/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt index b821fd3e7791..174535ff5d5e 100644 --- a/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/implicit_functions/CMakeLists.txt @@ -23,11 +23,7 @@ include_directories(BEFORE ${Mesh_3_implicit_functions_BINARY_DIR} ../include) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) # Find Qt6 itself -set(QT_USE_QTXML TRUE) -set(QT_USE_QTMAIN TRUE) -set(QT_USE_QTSCRIPT TRUE) -set(QT_USE_QTOPENGL TRUE) -find_package(Qt6 QUIET COMPONENTS OpenGLWidgets) +find_package(Qt6 QUIET COMPONENTS Core) if(CGAL_Qt6_FOUND AND Qt6_FOUND) # put plugins (which are shared libraries) at the same location as From 03e89cc97b23d23c75964274969a69ba89fb138a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 13 Sep 2023 17:57:54 +0200 Subject: [PATCH 0723/1398] fix periodic_3_triangulation_3_demo --- .../demo/Periodic_3_triangulation_3/CMakeLists.txt | 10 +--------- .../demo/Periodic_3_triangulation_3/MainWindow.cpp | 8 ++++++++ .../demo/Periodic_3_triangulation_3/MainWindow.h | 7 +------ 3 files changed, 10 insertions(+), 15 deletions(-) create mode 100644 Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.cpp diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt index 7225c76cd3ba..bab63515c66d 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/CMakeLists.txt @@ -25,12 +25,6 @@ if(CGAL_Qt6_FOUND set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) - # use the Qt MOC preprocessor on classes that derive from QObject - qt6_generate_moc("Scene.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Scene.cpp") - qt6_generate_moc("MainWindow.h" - "${CMAKE_CURRENT_BINARY_DIR}/moc_MainWindow.cpp") - qt6_generate_moc("Viewer.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_Viewer.cpp") - # generate QtAssistant collection file add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Periodic_3_triangulation_3.qhc @@ -44,12 +38,10 @@ if(CGAL_Qt6_FOUND qt_add_executable( periodic_3_triangulation_3_demo Scene.cpp - moc_Scene.cpp Viewer.cpp - moc_Viewer.cpp + MainWindow.cpp periodic_3_triangulation_3_demo.cpp MainWindow.ui - moc_MainWindow.cpp Periodic_3_triangulation_3.qhc Periodic_3_triangulation_3.qrc) diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.cpp b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.cpp new file mode 100644 index 000000000000..2d77555e636b --- /dev/null +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.cpp @@ -0,0 +1,8 @@ +#include "MainWindow.h" + +MainWindow::~MainWindow() { + process->close(); + delete(process); + delete(s); + delete(ui); +} diff --git a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h index 79b3e5bec140..ca9bf07e1160 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h +++ b/Periodic_3_triangulation_3/demo/Periodic_3_triangulation_3/MainWindow.h @@ -102,12 +102,7 @@ class MainWindow : public QMainWindow this, SLOT(about())); } - ~MainWindow() { - process->close(); - delete(process); - delete(s); - delete(ui); - } + ~MainWindow(); public Q_SLOTS: void help() { From 09a4ac1ad7769a229985094188815368a673ff4b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 14:39:45 +0200 Subject: [PATCH 0724/1398] cosmetic changes --- .../Optimal_transportation_reconstruction_2/CMakeLists.txt | 2 +- .../demo/Periodic_Lloyd_3/CMakeLists.txt | 6 +++--- Three/include/CGAL/Three/exceptions.h | 3 --- Triangulation_3/demo/Triangulation_3/CMakeLists.txt | 4 +--- Triangulation_3/demo/Triangulation_3/MainWindow.cpp | 4 +--- Triangulation_3/demo/Triangulation_3/MainWindow.ui | 6 ------ 6 files changed, 6 insertions(+), 19 deletions(-) diff --git a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt index d62d77e37b77..207781a6c6b9 100644 --- a/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt +++ b/Optimal_transportation_reconstruction_2/demo/Optimal_transportation_reconstruction_2/CMakeLists.txt @@ -61,7 +61,7 @@ else() endif() if(NOT Qt6_FOUND) - set(OTR2_MISSING_DEPS "Qt6.4, ${OTR2_MISSING_DEPS}") + set(OTR2_MISSING_DEPS "Qt6, ${OTR2_MISSING_DEPS}") endif() message("NOTICE: This demo requires ${OTR2_MISSING_DEPS} and will not be compiled.") diff --git a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt index cb944392edf4..579699f9b6e7 100644 --- a/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt +++ b/Periodic_3_triangulation_3/demo/Periodic_Lloyd_3/CMakeLists.txt @@ -7,7 +7,6 @@ project(Periodic_Lloyd_3_Demo) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) @@ -21,8 +20,9 @@ if(CGAL_Qt6_FOUND include_directories(BEFORE ./) - set(CMAKE_AUTOUIC ON) - set(CMAKE_AUTORCC ON) + set(CMAKE_AUTOMOC ON) + set(CMAKE_AUTOUIC ON) + set(CMAKE_AUTORCC ON) if(DEFINED QT_QCOLLECTIONGENERATOR_EXECUTABLE) diff --git a/Three/include/CGAL/Three/exceptions.h b/Three/include/CGAL/Three/exceptions.h index 927489b4f203..ccf67496230f 100644 --- a/Three/include/CGAL/Three/exceptions.h +++ b/Three/include/CGAL/Three/exceptions.h @@ -19,9 +19,6 @@ #include #include #include -//#include -//#include -//#include #include #include diff --git a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt index ab246bc44268..1cf16c563dfd 100644 --- a/Triangulation_3/demo/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/demo/Triangulation_3/CMakeLists.txt @@ -7,9 +7,6 @@ project(Triangulation_3_Demo) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) - find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6) find_package(Qt6 QUIET COMPONENTS Widgets OpenGL) @@ -40,6 +37,7 @@ endif() if(CGAL_Qt6_FOUND AND Qt6_FOUND) include_directories(BEFORE ./) + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/Triangulation_3/demo/Triangulation_3/MainWindow.cpp b/Triangulation_3/demo/Triangulation_3/MainWindow.cpp index 3e8af7b0b0b1..030948e7a2ca 100644 --- a/Triangulation_3/demo/Triangulation_3/MainWindow.cpp +++ b/Triangulation_3/demo/Triangulation_3/MainWindow.cpp @@ -72,8 +72,6 @@ void MainWindow::connectActions() // Help menu actions QObject::connect(this->actionDemo_Help, SIGNAL(triggered()), this->viewer, SLOT(help())); - QObject::connect(this->actionAbout_T3_demo, SIGNAL(triggered()), - this, SLOT(popupAboutDemo())); // Quit QObject::connect(this->actionQuit, SIGNAL(triggered()), @@ -214,7 +212,7 @@ void MainWindow::on_actionClear_Scene_triggered() void MainWindow::popupAboutCGAL() { // read contents from .html file - QFile about_CGAL(":/documentation/documentation/about.html"); + QFile about_CGAL(":/documentation/documentation/about_CGAL.html"); about_CGAL.open(QIODevice::ReadOnly|QIODevice::Text); QString about_CGAL_txt = QTextStream(&about_CGAL).readAll(); diff --git a/Triangulation_3/demo/Triangulation_3/MainWindow.ui b/Triangulation_3/demo/Triangulation_3/MainWindow.ui index e808c9eda3ba..0bdf33a8176f 100644 --- a/Triangulation_3/demo/Triangulation_3/MainWindow.ui +++ b/Triangulation_3/demo/Triangulation_3/MainWindow.ui @@ -112,7 +112,6 @@ Help - @@ -555,11 +554,6 @@ Stop Animation - - - About T3_demo - - From 3fca44f9492f5e5e70de0bd560dffba54603eb0d Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 14 Sep 2023 16:04:23 +0300 Subject: [PATCH 0725/1398] Left \ingroup statements in separe lines --- .../Arrangement_on_surface_2/CGAL/Arrangement_2.h | 12 ++++++------ .../CGAL/Arrangement_on_surface_2.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h index bf3e048637d7..a269c6e01842 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h @@ -160,12 +160,12 @@ class Arrangement_2 : public Arrangement_on_surface_2 Date: Thu, 14 Sep 2023 15:13:46 +0200 Subject: [PATCH 0726/1398] finish review of polyhedron demo --- Polyhedron/demo/Polyhedron/Scene.cpp | 1 - Polyhedron/demo/Polyhedron/Show_point_dialog.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene.cpp b/Polyhedron/demo/Polyhedron/Scene.cpp index a00ef63117f3..feb5ab6f0024 100644 --- a/Polyhedron/demo/Polyhedron/Scene.cpp +++ b/Polyhedron/demo/Polyhedron/Scene.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include diff --git a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp index 5df594bc57c4..915c6a0494f6 100644 --- a/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp +++ b/Polyhedron/demo/Polyhedron/Show_point_dialog.cpp @@ -53,7 +53,7 @@ void Show_point_dialog::interprete_string(const QString& string) + "$"; QRegularExpression re(full_re); - QRegularExpressionMatch match = re.match(string); // AF @todo QRegExp had exactMatch() + QRegularExpressionMatch match = re.match(string); if(match.hasMatch()) { // const double x = re.cap(1).toDouble(); // const double y = re.cap(2).toDouble(); From d8d371b12b57202f5316b91db0a53a5a3c2c8852 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 14 Sep 2023 16:41:41 +0300 Subject: [PATCH 0727/1398] 1st revision --- .../CGAL/CORE_algebraic_number_traits.h | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h new file mode 100644 index 000000000000..4b40d11fd1d7 --- /dev/null +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h @@ -0,0 +1,218 @@ +namespace CGAL { + +/*! \ingroup PkgArrangementOnSurface2TraitsClasses + * + * `CORE_algebraic_number_traits` is a traits class for CORE's algebraic + * number types. + * + * \sa `Arr_conic_traits_2` + */ +class CORE_algebraic_number_traits { +public: + /// \name Types + /// @{ + + //! The integer number type. + typedef CORE::BigInt Integer; + + //! The rational number type. + typedef CORE::BigRat Rational; + + //! The polynomial type. + typedef CORE::Polynomial Polynomial; + + //! The algebraic number type. + typedef CORE::Expr Algebraic; + + /// @} + + /// \name Utility Functions + /// @{ + + /*! Obtain the numerator of a rational number. + * \param q A rational number. + * \return The numerator of q. + */ + Integer numerator(const Rational& q) const; + + /*! Obtain the denominator of a rational number. + * \param q A rational number. + * \return The denominator of q. + */ + Integer denominator(const Rational& q) const; + + /*! Convert an integer to an algebraic number. + * \param z An integer. + * \return The algebraic number equivalent to z. + */ + Algebraic convert(const Integer& z) const; + + /*! Convert a rational number to an algebraic number. + * \param q A rational number. + * \return The algebraic number equivalent to q. + */ + Algebraic convert(const Rational& q) const; + + /*! Construct a rational number that lies strictly between two algebraic + * values. + * \param x1 The first algebraic value. + * \param x2 The second algebraic value. + * \pre The two values are not equal. + * \return A rational number that lies in the open interval (x1, x2). + */ + Rational rational_in_interval(const Algebraic& x1, const Algebraic& x2) const; + + /*! Obtain a range of double-precision floats that contains the given + * algebraic number. + * \param x The given number. + * \return A pair that contain x. + */ + std::pair double_interval(const Algebraic& x) const; + + /*! Convert a sequence of rational coefficients to an equivalent sequence + * of integer coefficients. If the input coefficients are q(1), ..., q(k), + * where q(i) = n(i)/d(i) then the output coefficients will be of the + * form: + * n(i) * lcm {d(1), ... , d(k)} + * a(i) = ------------------------------- + * d(i) * gcd {n(1), ... , n(k)} + * + * \param q_begin The begin iterator of the rational sequence. + * \param q_end The past-the-end iterator of the rational sequence. + * \param zoi An output iterator for the integer coefficients. + * \return A past-the-end iterator for the output container. + * \pre The value type of q_begin and q_end is `Rational`, and + * the value type of zoi is `Integer`. + */ + template + OutputIterator convert_coefficients(InputIterator q_begin, + InputIterator q_end, + OutputIterator zoi) const; + + /*! Compute the square root of an algebraic number. + * \param x The number. + * \return The square root of x. + * \pre x is non-negative. + */ + Algebraic sqrt(const Algebraic& x) const; + + /*! Compute the roots of a quadratic equations \f$a*x^2+ b*x + c = 0\f$ + * with integer coefficients. + * \param a The coefficient of \f$x^2\f$ + * \param b The coefficient of \f$x\f$ + * \param c The free term. + * \param oi An output iterator for the real-valued solutions of the + * quadratic equation. + * \return A past-the-end iterator for the output container. + * \pre The value type of oi is Algebraic. + */ + template + OutputIterator solve_quadratic_equation(const NT& a, const NT& b, const NT& c, + OutputIterator oi) const; + + /*! Construct a polynomial with integer coefficients. + * \param coeffs The coefficients of the input polynomial. + * \param degree The degree of the input polynomial. + * \return The polynomial. + */ + Polynomial construct_polynomial(const Integer* coeffs, + unsigned int degree) const; + + /*! Construct a polynomial with integer coefficients given rational + * coefficients. + * \param coeffs The coefficients of the input polynomial. + * \param degree The degree of the input polynomial. + * \param poly Output: The resulting polynomial with integer coefficients. + * \param poly_denom Output: The denominator for the polynomial. + * \return Whether this polynomial is non-zero (false if the polynomial is + * zero). + */ + bool construct_polynomial(const Rational *coeffs, + unsigned int degree, + Polynomial& poly, Integer& poly_denom) const; + + /*! Construct two polynomials with integer coefficients such that P(x)/Q(x) + * is a rational function equivalent to the one represented by the two + * given vectors of rational coefficients. It is guaranteed that the GCD + * of P(x) and Q(x) is trivial. + * \param p_coeffs The coefficients of the input numerator polynomial. + * \param p_degree The degree of the input numerator polynomial. + * \param q_coeffs The coefficients of the input denominator polynomial. + * \param q_degree The degree of the input denominator polynomial. + * \param p_poly Output: The resulting numerator polynomial with integer + * coefficients. + * \param q_poly Output: The resulting denominator polynomial with integer + * coefficients. + * \return (true) on success; (false) if the denominator is 0. + */ + bool construct_polynomials(const Rational* p_coeffs, + unsigned int p_degree, + const Rational* q_coeffs, + unsigned int q_degree, + Polynomial& p_poly, Polynomial& q_poly) const; + + /*! Compute the degree of a polynomial. + */ + int degree(const Polynomial& poly) const; + + /*! Evaluate a polynomial at a given x-value. + * \param poly A polynomial. + * \param x The value to evaluate at. + * \return The value of the polynomial at x. + */ + template + NT evaluate_at(const Polynomial& poly, NT& x) const; + + /*! Compute the derivative of the given polynomial. + * \param poly The polynomial p(x). + * \return The derivative p'(x). + */ + Polynomial derive(const Polynomial& poly) const; + + /*! Multiply a polynomial by some scalar coefficient. + * \param poly The polynomial P(x). + * \param a The scalar value. + * \return The scalar multiplication a*P(x). + */ + Polynomial scale(const Polynomial& poly, const Integer& a) const; + + /*! Perform "long division" of two polynomials: Given A(x) and B(x) compute + * two polynomials Q(x) and R(x) such that: A(x) = Q(x)*B(x) + R(x) and + * R(x) has minimal degree. + * \param polyA The first polynomial A(x). + * \param polyB The second polynomial A(x). + * \param rem Output: The remainder polynomial R(x). + * \return The quontient polynomial Q(x). + */ + Polynomial divide(const Polynomial& polyA, + const Polynomial& polyB, + Polynomial& rem) const; + + /*! Compute the real-valued roots of a polynomial with integer coefficients, + * sorted in ascending order. + * \param poly The input polynomial. + * \param oi An output iterator for the real-valued root of the polynomial. + * \return A past-the-end iterator for the output container. + * \pre The value type of oi is Algebraic. + */ + template + OutputIterator compute_polynomial_roots(const Polynomial& poly, + OutputIterator oi) const; + + /*! Compute the real-valued roots of a polynomial with integer coefficients, + * within a given interval. The roots are sorted in ascending order. + * \param poly The input polynomial. + * \param x_min The left bound of the interval. + * \param x_max The right bound of the interval. + * \param oi An output iterator for the real-valued root of the polynomial. + * \return A past-the-end iterator for the output container. + * \pre The value type of oi is Algebraic. + */ + template + OutputIterator compute_polynomial_roots(const Polynomial& poly, + double x_min, double x_max, + OutputIterator oi) const; + /// @} +}; + +} /* end namespace CGAL */ From 8123d2e2f8cfc4c679b968109396f5234cc5834d Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 14 Sep 2023 16:44:26 +0300 Subject: [PATCH 0728/1398] Added missing documentation for CGAL::CORE_algebraic_number_traits --- .../doc/Arrangement_on_surface_2/PackageDescription.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt index c14d0489746b..20dc50a57953 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt @@ -236,6 +236,7 @@ implemented as peripheral classes or as free (global) functions. - `CGAL::Arr_bounded_planar_topology_traits_2` - `CGAL::Arr_unb_planar_topology_traits_2` - `CGAL::Arr_spherical_topology_traits_2` +- `CGAL::CORE_algebraic_number_traits` \cgalCRPSection{Functions} From 8c2f72d94daa22183ed2584ebf4eb471ede91638 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 14 Sep 2023 16:44:47 +0300 Subject: [PATCH 0729/1398] Removed erroneous link --- .../doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h index fe4de62ca8f0..2c0d60278730 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h @@ -34,7 +34,6 @@ namespace CGAL { * \sa `Arr_default_dcel` * \sa `ArrangementBasicTraits_2` * \sa `CGAL::overlay()` - * \sa `CGAL::is_valid()` * Insertion Functions From e5f49d70991dc610ca80acf0e1123d00157ba10a Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Thu, 14 Sep 2023 16:56:58 +0300 Subject: [PATCH 0730/1398] Fixed the description of the topology traits --- .../Arrangement_on_surface_2.txt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index b4bff8ed2db1..f7dfaa98b520 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -5651,10 +5651,24 @@ must model the basic concept `ArrangementBasicTopologyTraits`. A model of this basic concept holds the (\dcel) data structure used to represent the arrangement cells (i.e., vertices, edges, and facets) and the incidence relations between them. At this point we do not -expose the concepts that refine the basic concept. The package -contains one topology traits, namely, -`Arr_spherical_topology_traits_2`. It can serve as a topology traits -for an arrangement embedded on a sphere. More precisely, for an +expose the concepts that refine the basic concept. The package +contains three topology traits class templates, namely, +`Arr_bounded_planar_topology_traits_2`, +`Arr_unb_planar_topology_traits_2`, and +`Arr_spherical_topology_traits_2`. The first two are internally used +to define any instance of the class template +`Arrangement_2`. In particular, an instance +`Arrangement_2` is derived from the instance +`Arrangement_on_surface_2`, where +the `Topology_traits` type is selected based on the provided geometry +traits `Geometry_traits_2`, or more precisely, on the boundary +conditions defined by the geometry traits. If all sides of the +boundary of the parameter space are cosed, the instance +`Arr_bounded_planar_topology_traits_2` is +selected; otherwise the instance +`Arr_unb_planar_topology_traits_2` is +selected. The third topology traits serves as a topology traits for +an arrangement embedded on a sphere. More precisely, for an arrangement embedded on a sphere defined over a parameter space, the left and right boundary sides of which are identified, and the top and bottom boundary sides are contracted. From 2f6d51b49b495b2693d0be912e344876dee6e87a Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 16:27:16 +0200 Subject: [PATCH 0731/1398] Remove a few occurrences of CGAL_Qt5 ... and replace by CGAL_Qt6 --- .../Arrangement_on_surface_2.txt | 4 +- .../CGAL/draw_arrangement_2.h | 4 +- .../CGAL/draw_polygon_set_2.h | 4 +- .../include/CGAL/draw_polygon_set_2.h | 4 +- .../create_and_use_a_cmakelist.txt | 6 +- .../doc/Documentation/Third_party.txt | 2 +- .../doc/scripts/test_doxygen_versions.sh | 2 +- GraphicsView/include/CGAL/Qt/CGAL_Qt_config.h | 4 +- GraphicsView/include/CGAL/auto_link/Qt.h | 4 +- GraphicsView/include/CGAL/export/Qt.h | 2 +- .../CGAL_Qt5_moc_and_resource_files.cmake | 25 ---- .../CGAL_SetupCGAL_Qt5Dependencies.cmake | 127 ------------------ ...GAL_enable_end_of_configuration_hook.cmake | 6 +- .../Help/CGAL_SetupCGAL_Qt5Dependencies.rst | 1 - .../Help/CGAL_SetupCGAL_Qt6Dependencies.rst | 1 + Installation/cmake/modules/Help/index.rst | 2 +- Installation/test/Installation/CMakeLists.txt | 96 ++++++------- .../test/Installation/link_to_CGAL_Qt6.cpp | 11 ++ ...make.in => test_configuration_qt.cmake.in} | 6 +- ...tion_qt5.cpp => test_configuration_qt.cpp} | 0 .../CGAL/draw_linear_cell_complex.h | 4 +- .../Linear_cell_complex.txt | 4 +- Nef_3/doc/Nef_3/CGAL/draw_nef_3.h | 4 +- Nef_3/doc/Nef_3/Nef_3.txt | 4 +- .../CGAL/draw_periodic_2_triangulation_2.h | 4 +- Point_set_3/doc/Point_set_3/Point_set_3.txt | 4 +- Point_set_3/include/CGAL/draw_point_set_3.h | 4 +- Polygon/doc/Polygon/Polygon.txt | 4 +- Polygon/include/CGAL/draw_polygon_2.h | 4 +- .../include/CGAL/draw_polygon_with_holes_2.h | 4 +- .../doc/Polyhedron/CGAL/draw_polyhedron.h | 4 +- Polyhedron/doc/Polyhedron/Polyhedron.txt | 4 +- .../doc/Surface_mesh/Surface_mesh.txt | 4 +- Surface_mesh/include/CGAL/draw_surface_mesh.h | 4 +- .../CGAL/draw_face_graph_with_paths.h | 4 +- .../Surface_mesh_topology.txt | 8 +- Testsuite/test/post_process_ctest_results.py | 2 +- .../CGAL/draw_triangulation_2.h | 8 +- .../doc/Triangulation_2/Triangulation_2.txt | 4 +- .../CGAL/draw_triangulation_3.h | 4 +- .../doc/Triangulation_3/Triangulation_3.txt | 4 +- .../CGAL/draw_voronoi_diagram_2.h | 4 +- .../Voronoi_diagram_2/Voronoi_diagram_2.txt | 4 +- 43 files changed, 134 insertions(+), 275 deletions(-) delete mode 100644 Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake delete mode 100644 Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake delete mode 100644 Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt5Dependencies.rst create mode 100644 Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt6Dependencies.rst create mode 100644 Installation/test/Installation/link_to_CGAL_Qt6.cpp rename Installation/test/Installation/{test_configuration_qt5.cmake.in => test_configuration_qt.cmake.in} (89%) rename Installation/test/Installation/{test_configuration_qt5.cpp => test_configuration_qt.cpp} (100%) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index 5254543120c7..b7c41b3e5ccb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -6750,8 +6750,8 @@ An arrangement data structure can be visualized by calling the \link PkgArrangem \cgalExample{Arrangement_on_surface_2/draw_arr.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{aos_fig-draw_arr,draw_arr.png} A snapshot of the window created by the program diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h index f415f5c9e7ec..a22a398115e0 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/draw_arrangement_2.h @@ -28,9 +28,9 @@ namespace CGAL { * opens a new window and draws `arr`, an instance of the `CGAL::Arrangement_2` * class template. A call to this function is blocking; that is, the program * continues only after the user closes the window. This function requires - * `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is + * `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is * defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link - * with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. + * with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. * * \tparam GeometryTraits_2 a geometry traits type, a model of a 2D arrangement * traits concept. At this point it must be an instance of either diff --git a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h index df7a777dbdc9..5728fe8b86c6 100644 --- a/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/doc/Boolean_set_operations_2/CGAL/draw_polygon_set_2.h @@ -3,8 +3,8 @@ namespace CGAL { /*! \ingroup PkgDrawPolygonSet2 -opens a new window and draws `aps`, an instance of the `CGAL::Polygon_set_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws `aps`, an instance of the `CGAL::Polygon_set_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam PS an instance of the `CGAL::Polygon_set_2` class. \param aps the polygon set to draw. diff --git a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h index 3a5a31421be5..6eaa81b02f7b 100644 --- a/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h +++ b/Boolean_set_operations_2/include/CGAL/draw_polygon_set_2.h @@ -27,9 +27,9 @@ namespace CGAL { * * opens a new window and draws `aps`, an instance of the `CGAL::Polygon_set_2` * class. A call to this function is blocking, that is the program continues as - * soon as the user closes the window. This function requires `CGAL_Qt5`, and is + * soon as the user closes the window. This function requires `CGAL_Qt6`, and is * only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with - * the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add + * the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add * the definition `CGAL_USE_BASIC_VIEWER`. * \tparam PS an instance of the `CGAL::Polygon_set_2` class. * \param aps the polygon set to draw. diff --git a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt index 02ff32da6bc3..14eb07f8d8f0 100644 --- a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt +++ b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt @@ -33,14 +33,14 @@ This section describes a minimal example of a program that uses \cgal and Qt5 fo \skip cmake_minimum_required \until project -\skip #CGAL_Qt5 is needed for the drawing. +\skip #CGAL_Qt6 is needed for the drawing. \until endif() \skip #create the executable of the application \until "draw_surface_mesh.cpp" -\skip if(CGAL_Qt5_FOUND) -\until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Qt5) +\skip if(CGAL_Qt6_FOUND) +\until target_link_libraries(draw_surface_mesh PUBLIC CGAL::CGAL_Qt6) \skip endif \until #end of the file diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index 569599ae0fdf..67533c1aef90 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -77,7 +77,7 @@ we recommend that you define the environment variable \subsection thirdpartyMPFR GNU Multiple Precision Arithmetic (GMP) and GNU Multiple Precision Floating-Point Reliably (MPFR) Libraries GMP Version 4.2 or later, MPFR Version 2.2.1 or later -The components `libCGAL`, `libCGAL_Core`, and `libCGAL_Qt5` require +The components `libCGAL`, `libCGAL_Core`, and `libCGAL_Qt6` require \gmp and \mpfr which are libraries for multi precision integers and rational numbers, and for multi precision floating point numbers. diff --git a/Documentation/doc/scripts/test_doxygen_versions.sh b/Documentation/doc/scripts/test_doxygen_versions.sh index f71d5c6e0220..c847e110a2d2 100644 --- a/Documentation/doc/scripts/test_doxygen_versions.sh +++ b/Documentation/doc/scripts/test_doxygen_versions.sh @@ -117,7 +117,7 @@ if [ "$HAS_REF" -ne "1" ]; then if [ $IS_RELEASE = 0 ]; then cd $ROOT mkdir -p ./build && cd ./build - cmake -DWITH_CGAL_Core=false -DWITH_CGAL_ImageIO=false -DWITH_CGAL_Qt5=false .. 1>> ./build_logs + cmake -DWITH_CGAL_Core=false -DWITH_CGAL_ImageIO=false -DWITH_CGAL_Qt6=false .. 1>> ./build_logs CGAL_NAME="$(cat $PWD/VERSION)" cd $ROOT rm -rf ./build diff --git a/GraphicsView/include/CGAL/Qt/CGAL_Qt_config.h b/GraphicsView/include/CGAL/Qt/CGAL_Qt_config.h index 118426a54df1..6aad119ecc35 100644 --- a/GraphicsView/include/CGAL/Qt/CGAL_Qt_config.h +++ b/GraphicsView/include/CGAL/Qt/CGAL_Qt_config.h @@ -14,8 +14,8 @@ #include -#if defined(CGAL_Qt5_DLL) -# if defined(CGAL_Qt5_EXPORTS) +#if defined(CGAL_Qt6_DLL) +# if defined(CGAL_Qt6_EXPORTS) # define CGAL_QT_EXPORT Q_DECL_EXPORT # else # define CGAL_QT_EXPORT Q_DECL_IMPORT diff --git a/GraphicsView/include/CGAL/auto_link/Qt.h b/GraphicsView/include/CGAL/auto_link/Qt.h index bcaf3cbd99c3..a08e108e2d34 100644 --- a/GraphicsView/include/CGAL/auto_link/Qt.h +++ b/GraphicsView/include/CGAL/auto_link/Qt.h @@ -16,13 +16,13 @@ #include #if (! defined (CGAL_NO_AUTOLINK_QT)) -#if ( ! defined( CGAL_EXPORTS ) && (! defined ( CGAL_Qt5_EXPORTS ))) +#if ( ! defined( CGAL_EXPORTS ) && (! defined ( CGAL_Qt6_EXPORTS ))) // If CGAL_EXPORTS is defined it means that we are building the CGAL // library as a DLL. The CGAL.dll does not really depend on CGAL_Qt, // whatever the header inclusion graph says. -#define CGAL_LIB_NAME CGAL_Qt5 +#define CGAL_LIB_NAME CGAL_Qt6 #include diff --git a/GraphicsView/include/CGAL/export/Qt.h b/GraphicsView/include/CGAL/export/Qt.h index 7d79a2069917..a1392b2610a2 100644 --- a/GraphicsView/include/CGAL/export/Qt.h +++ b/GraphicsView/include/CGAL/export/Qt.h @@ -18,7 +18,7 @@ #if ( defined(CGAL_BUILD_SHARED_LIBS) && ( ! defined(CGAL_HEADER_ONLY) ) ) \ || defined(CGAL_USE_Qt5_RESOURCES) -# if defined(CGAL_Qt5_EXPORTS) || defined(CGAL_USE_Qt5_RESOURCES) +# if defined(CGAL_Qt6_EXPORTS) || defined(CGAL_USE_Qt5_RESOURCES) // defined by CMake or in cpp files of the dll # define CGAL_QT_EXPORT CGAL_DLL_EXPORT diff --git a/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake b/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake deleted file mode 100644 index 2d566decf613..000000000000 --- a/Installation/cmake/modules/CGAL_Qt5_moc_and_resource_files.cmake +++ /dev/null @@ -1,25 +0,0 @@ -if(CGAL_Qt5_moc_and_resource_files_included) - return() -endif() -set(CGAL_Qt5_moc_and_resource_files_included TRUE) -# qrc files (resources files, that contain icons, at least) -if(EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc) - qt5_add_resources (_CGAL_Qt5_RESOURCE_FILES_private - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/resources/CGAL.qrc - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/Input.qrc - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/File.qrc - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/demo/icons/Triangulation_2.qrc) -else() - # Installed version, in CMake resources - file ( COPY - ${CGAL_MODULES_DIR}/demo/resources - ${CGAL_MODULES_DIR}/demo/icons - DESTINATION ${CMAKE_BINARY_DIR}) - qt5_add_resources (_CGAL_Qt5_RESOURCE_FILES_private - ${CMAKE_BINARY_DIR}/resources/CGAL.qrc - ${CMAKE_BINARY_DIR}/icons/Input.qrc - ${CMAKE_BINARY_DIR}/icons/File.qrc - ${CMAKE_BINARY_DIR}/icons/Triangulation_2.qrc) -endif() - -qt5_wrap_ui(_CGAL_Qt5_UI_FILES ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/ImageInterface.ui) diff --git a/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake deleted file mode 100644 index c6701aeb1a1b..000000000000 --- a/Installation/cmake/modules/CGAL_SetupCGAL_Qt5Dependencies.cmake +++ /dev/null @@ -1,127 +0,0 @@ -#.rst: -# CGAL_SetupCGAL_Qt5Dependencies -# ------------------------------ -# -# The module searches for the dependencies of the `CGAL_Qt5` library: -# - the `Qt5` libraries -# -# by calling -# -# .. code-block:: cmake -# -# find_package(Qt5 QUIET COMPONENTS OpenGL Widgets) -# -# and defines the variable :variable:`CGAL_Qt5_FOUND` and the function -# :command:`CGAL_setup_CGAL_Qt5_dependencies`. -# - -if(CGAL_SetupCGAL_Qt5Dependencies_included) - return() -endif() -set(CGAL_SetupCGAL_Qt5Dependencies_included TRUE) - -#.rst: -# Used Modules -# ^^^^^^^^^^^^ -# - :module:`Qt5Config` -find_package(Qt5 QUIET COMPONENTS OpenGL Widgets OPTIONAL_COMPONENTS Svg) - -set(CGAL_Qt5_MISSING_DEPS "") -if(NOT Qt5OpenGL_FOUND) - set(CGAL_Qt5_MISSING_DEPS "Qt5OpenGL") -endif() -if(NOT Qt5Widgets_FOUND) - set(CGAL_Qt5_MISSING_DEPS "${CGAL_Qt5_MISSING_DEPS} Qt5Widgets") -endif() -if(NOT Qt5_FOUND) - set(CGAL_Qt5_MISSING_DEPS "${CGAL_Qt5_MISSING_DEPS} Qt5") -endif() -if(NOT EXISTS ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsItem.h) - set(CGAL_Qt5_MISSING_DEPS "${CGAL_Qt5_MISSING_DEPS} headers") -endif() - -#.rst: -# Result Variables -# ^^^^^^^^^^^^^^^^ -# -# .. variable:: CGAL_Qt5_FOUND -# -# Set to `TRUE` if the dependencies of `CGAL_Qt5` were found. -# -if(NOT CGAL_Qt5_MISSING_DEPS) - set(CGAL_Qt5_FOUND TRUE) - set_property(GLOBAL PROPERTY CGAL_Qt5_FOUND TRUE) - - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Qt5_moc_and_resource_files.cmake) - - if(NOT TARGET CGAL_Qt5_moc_and_resources) - add_library(CGAL_Qt5_moc_and_resources STATIC - ${_CGAL_Qt5_MOC_FILES_private} - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsViewNavigation.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/DemosMainWindow.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsItem.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/GraphicsViewInput.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/camera.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/frame.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/keyFrameInterpolator.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/manipulatedCameraFrame.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/manipulatedFrame.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/qglviewer.h - ${CGAL_GRAPHICSVIEW_PACKAGE_DIR}/include/CGAL/Qt/image_interface.h - ${_CGAL_Qt5_UI_FILES} - ${_CGAL_Qt5_RESOURCE_FILES_private}) - target_include_directories( CGAL_Qt5_moc_and_resources PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) - set_target_properties(CGAL_Qt5_moc_and_resources PROPERTIES - POSITION_INDEPENDENT_CODE TRUE - EXCLUDE_FROM_ALL TRUE - AUTOMOC TRUE) - target_link_libraries(CGAL_Qt5_moc_and_resources PUBLIC CGAL::CGAL Qt5::Widgets Qt5::OpenGL ) - if(Qt5Svg_FOUND) - target_link_libraries(CGAL_Qt5_moc_and_resources PUBLIC Qt5::Svg) - endif() - add_library(CGAL::CGAL_Qt5_moc_and_resources ALIAS CGAL_Qt5_moc_and_resources) - add_library(CGAL::Qt5_moc_and_resources ALIAS CGAL_Qt5_moc_and_resources) - endif() - -endif() - -#get_property(QT_UIC_EXECUTABLE TARGET Qt5::uic PROPERTY LOCATION) -#message( STATUS "Qt5Core include: ${Qt5Core_INCLUDE_DIRS}" ) -#message( STATUS "Qt5 libraries: ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Svg_LIBRARIES} ${Qt5OpenGL_LIBRARIES}" ) -#message( STATUS "Qt5Core definitions: ${Qt5Core_DEFINITIONS}" ) -#message( STATUS "moc executable: ${QT_MOC_EXECUTABLE}" ) -#message( STATUS "uic executable: ${QT_UIC_EXECUTABLE}" ) - -#.rst: -# -# Provided Functions -# ^^^^^^^^^^^^^^^^^^ -# -# .. command:: CGAL_setup_CGAL_Qt5_dependencies -# -# Link the target with the dependencies of `CGAL_Qt5`:: -# -# CGAL_setup_CGAL_Qt5_dependencies( target ) -# -# The dependencies are -# added using :command:`target_link_libraries` with the ``INTERFACE`` -# keyword. -# -function(CGAL_setup_CGAL_Qt5_dependencies target) - - if($ENV{CGAL_FAKE_PUBLIC_RELEASE}) - target_compile_definitions( ${target} INTERFACE CGAL_FAKE_PUBLIC_RELEASE=1 ) - endif() - target_link_libraries( ${target} INTERFACE CGAL::CGAL) - target_link_libraries( ${target} INTERFACE CGAL::Qt5_moc_and_resources) - target_link_libraries( ${target} INTERFACE Qt5::OpenGL Qt5::Widgets ) - - # Remove -Wdeprecated-copy, for g++ >= 9.0, because Qt5, as of - # version 5.12, has a lot of [-Wdeprecated-copy] warnings. - if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9" ) - target_compile_options( ${target} INTERFACE "-Wno-deprecated-copy" "-Wno-cast-function-type" ) - endif() - -endfunction() - diff --git a/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake b/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake index 81f62d9aab45..a25a85fa50c4 100644 --- a/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake +++ b/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake @@ -24,7 +24,7 @@ function(CGAL_hook_check_targets) endif() get_property(_targets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY BUILDSYSTEM_TARGETS) set(_list_of_deps) - set(_special_targets demos examples tests ALL_CGAL_TARGETS CGAL_Qt5_moc_and_resources uninstall install_FindCGAL) + set(_special_targets demos examples tests ALL_CGAL_TARGETS CGAL_Qt6_moc_and_resources uninstall install_FindCGAL) foreach(t ${_special_targets}) if(NOT TARGET ${t}) continue() @@ -110,8 +110,8 @@ function(CGAL_hook_fix_ctest_depending_on_Qt5) continue() endif() get_property(_target_links TARGET ${_target} PROPERTY LINK_LIBRARIES) - if("CGAL_Qt5" IN_LIST _target_links OR "CGAL::CGAL_Qt5" IN_LIST _target_links) - set_property(TEST "compilation of ${_target}" APPEND PROPERTY FIXTURES_REQUIRED CGAL_Qt5_moc_and_resources_Fixture) + if("CGAL_Qt6" IN_LIST _target_links OR "CGAL::CGAL_Qt6" IN_LIST _target_links) + set_property(TEST "compilation of ${_target}" APPEND PROPERTY FIXTURES_REQUIRED CGAL_Qt6_moc_and_resources_Fixture) endif() endforeach() endfunction() diff --git a/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt5Dependencies.rst b/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt5Dependencies.rst deleted file mode 100644 index 815f7a4dd5f1..000000000000 --- a/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt5Dependencies.rst +++ /dev/null @@ -1 +0,0 @@ -.. cmake-module:: ../CGAL_SetupCGAL_Qt5Dependencies.cmake diff --git a/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt6Dependencies.rst b/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt6Dependencies.rst new file mode 100644 index 000000000000..87365f45ac4a --- /dev/null +++ b/Installation/cmake/modules/Help/CGAL_SetupCGAL_Qt6Dependencies.rst @@ -0,0 +1 @@ +.. cmake-module:: ../CGAL_SetupCGAL_Qt6Dependencies.cmake diff --git a/Installation/cmake/modules/Help/index.rst b/Installation/cmake/modules/Help/index.rst index b47d4211d9b3..b13ae1e506f9 100644 --- a/Installation/cmake/modules/Help/index.rst +++ b/Installation/cmake/modules/Help/index.rst @@ -16,7 +16,7 @@ Contents: CGAL_SetupBoost CGAL_SetupCGALDependencies CGAL_SetupCGAL_CoreDependencies - CGAL_SetupCGAL_Qt5Dependencies + CGAL_SetupCGAL_Qt6Dependencies CGAL_SetupCGAL_ImageIODependencies TODO diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index d8b14c0bb170..c057119bbd3c 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -78,10 +78,10 @@ else() set(NON_STANDARD_INSTALL_PREFIX ${CMAKE_BINARY_DIR}) endif() -if(WITH_CGAL_Qt5) +if(WITH_CGAL_Qt6) find_package(Qt6 QUIET COMPONENTS Core) - if(Qt5_FOUND) - create_link_to_program(CGAL_Qt5) + if(Qt6_FOUND) + create_link_to_program(CGAL_Qt6) endif() endif() @@ -152,12 +152,12 @@ file(MAKE_DIRECTORY "${NON_STANDARD_INSTALL_PREFIX}/non_standard_install") file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/non_standard_build) file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/test_config_file) -if(CGAL_Qt5_FOUND) - file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt5) - file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt5) - file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/test_config_file_qt5) - configure_file(test_configuration_qt5.cmake.in ${CMAKE_BINARY_DIR}/test_config_file_qt5/CMakeLists.txt @ONLY) -endif()#CGAL_Qt5_FOUND +if(CGAL_Qt6_FOUND) + file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt) + file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt) + file(MAKE_DIRECTORY ${NON_STANDARD_INSTALL_PREFIX}/test_config_file_qt) + configure_file(test_configuration_qt.cmake.in ${CMAKE_BINARY_DIR}/test_config_file_qt/CMakeLists.txt @ONLY) +endif()#CGAL_Qt6_FOUND #If ctest is ran from a global config, CGAL_SOURCE_DIR exists, but from Installation/test it doesn't. In that case, however, there is a CGAL_DIR. if("${CGAL_SOURCE_DIR}" STREQUAL "") @@ -173,28 +173,28 @@ configure_file(test_configuration.cmake.in ${CMAKE_BINARY_DIR}/test_config_file/ #test CGAL_DIR = source_dir (Git_root or CGAL-5.x dir. get_filename_component(CGAL_DIR_CORRECT_PATH "${CGAL_SOURCE_DIR}/CGALConfig.cmake" DIRECTORY) -add_test(NAME test_config_file +add_test(NAME test_config_file_in_CGAL_SOURCE_DIR COMMAND ${CMAKE_COMMAND} ${GENERATOR} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} "${CMAKE_BINARY_DIR}/test_config_file" #src - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file") #build -list(APPEND test_config_lst "test_config_file") + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_in_CGAL_SOURCE_DIR") #build +list(APPEND test_config_lst "test_config_file_in_CGAL_SOURCE_DIR") if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE)#CGAL_BRANCH_BUILD #test CGAL_DIR = CGAL-5.x/lib/cmake/CGAL get_filename_component(CGAL_DIR_CORRECT_PATH "${CGAL_SOURCE_DIR}/lib/cmake/CGAL/CGALConfig.cmake" DIRECTORY) - add_test(NAME test_config_file_2 + add_test(NAME test_config_file_in_lib_cmake_CGAL COMMAND ${CMAKE_COMMAND} ${GENERATOR} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} "${CMAKE_BINARY_DIR}/test_config_file" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_2") + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_in_lib_cmake_CGAL") else()#CGAL_BRANCH_BUILD #use the CGAL_DIR get_filename_component(CGAL_DIR_CORRECT_PATH "${CGAL_SOURCE_DIR}/Installation/lib/cmake/CGAL/CGALConfig.cmake" DIRECTORY) - add_test(NAME test_config_file_2 + add_test(NAME test_config_file_in_lib_cmake_CGAL COMMAND ${CMAKE_COMMAND} ${GENERATOR} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} "${CMAKE_BINARY_DIR}/test_config_file" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_2") + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_in_lib_cmake_CGAL") endif()#CGAL_BRANCH_BUILD -list(APPEND test_config_lst "test_config_file_2") +list(APPEND test_config_lst "test_config_file_in_lib_cmake_CGAL") #configure cgal for a non standard install without Qt6 get_filename_component(CORRECT_INSTALL_PATH "${NON_STANDARD_INSTALL_PREFIX}/non_standard_install/dummy.txt" DIRECTORY) @@ -206,40 +206,40 @@ add_test(NAME config_non_standard_cgal add_test(NAME install_non_standard_cgal COMMAND ${CMAKE_COMMAND} --build "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build" --target "install" --config "$") -#test CGAL_DIR=non standard place without cgal_qt5 +#test CGAL_DIR=non standard place without cgal_qt get_filename_component(CGAL_DIR_CORRECT_PATH "${NON_STANDARD_INSTALL_PREFIX}/non_standard_install/lib/cmake/CGAL/CGALConfig.cmake" DIRECTORY) -add_test(NAME test_config_file_3 +add_test(NAME test_config_file_non_standard_install_lib_cmake COMMAND ${CMAKE_COMMAND} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} "${CMAKE_BINARY_DIR}/test_config_file" -WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_3") -list(APPEND test_config_lst "test_config_file_3") +WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_non_standard_install_lib_cmake") +list(APPEND test_config_lst "test_config_file_non_standard_install_lib_cmake") -if(CGAL_Qt5_FOUND) +if(CGAL_Qt6_FOUND) #configure cgal for a non standard install with Qt6 - add_test(NAME config_non_standard_cgal_qt5 - COMMAND ${CMAKE_COMMAND} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt5 -DCGAL_INSTALL_LIB_DIR=lib + add_test(NAME config_non_standard_cgal_qt + COMMAND ${CMAKE_COMMAND} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt -DCGAL_INSTALL_LIB_DIR=lib "${CGAL_SOURCE_DIR}" - WORKING_DIRECTORY "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt5") + WORKING_DIRECTORY "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt") #install cgal in the non standard place - add_test(NAME install_non_standard_cgal_qt5 - COMMAND ${CMAKE_COMMAND} --build "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt5" --target "install" --config "$") + add_test(NAME install_non_standard_cgal_qt + COMMAND ${CMAKE_COMMAND} --build "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build_qt" --target "install" --config "$") - #test CGAL_DIR=non standard place with cgal_qt5 - get_filename_component(CGAL_DIR_CORRECT_PATH "${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt5/lib/cmake/CGAL/CGALConfig.cmake" DIRECTORY) - add_test(NAME test_config_file_4 + #test CGAL_DIR=non standard place with cgal_qt + get_filename_component(CGAL_DIR_CORRECT_PATH "${NON_STANDARD_INSTALL_PREFIX}/non_standard_install_qt/lib/cmake/CGAL/CGALConfig.cmake" DIRECTORY) + add_test(NAME test_config_file_non_standard_install_lib_cmake_with_qt COMMAND ${CMAKE_COMMAND} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} - "${CMAKE_BINARY_DIR}/test_config_file_qt5" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_4") - list(APPEND test_config_lst "test_config_file_4") -endif()#CGAL_Qt5_FOUND + "${CMAKE_BINARY_DIR}/test_config_file_qt" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_non_standard_install_lib_cmake_with_qt") + list(APPEND test_config_lst "test_config_file_non_standard_install_lib_cmake_with_qt") +endif()#CGAL_Qt6_FOUND #test CGAL_DIR=non standard build get_filename_component(CGAL_DIR_CORRECT_PATH "${NON_STANDARD_INSTALL_PREFIX}/non_standard_build/CGALConfig.cmake" DIRECTORY) -add_test(NAME test_config_file_5 +add_test(NAME test_config_file_non_standard COMMAND ${CMAKE_COMMAND} ${INIT_FILE} -DCMAKE_BUILD_TYPE=Release -DCGAL_DIR=${CGAL_DIR_CORRECT_PATH} -DCGAL_GIVEN_DIR=${CGAL_DIR_CORRECT_PATH} "${CMAKE_BINARY_DIR}/test_config_file" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_5") -list(APPEND test_config_lst "test_config_file_5") + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/build-test_config_file_non_standard") +list(APPEND test_config_lst "test_config_file_non_standard") foreach(tgt ${test_config_lst}) #add_custom_target(${tgt}_target) @@ -268,19 +268,19 @@ foreach(tgt ${test_config_lst}) endforeach() set_property(TEST install_non_standard_cgal APPEND PROPERTY DEPENDS config_non_standard_cgal) -set_property(TEST config_non_standard_cgal APPEND PROPERTY FIXTURES_SETUP test_config_file_3_target) -set_property(TEST install_non_standard_cgal APPEND PROPERTY FIXTURES_SETUP test_config_file_3_target) -set_property(TEST test_config_file_3 test_config_file_5 APPEND PROPERTY FIXTURES_REQUIRED test_config_file_3_target) +set_property(TEST config_non_standard_cgal APPEND PROPERTY FIXTURES_SETUP test_config_file_non_standard_install_lib_cmake_target) +set_property(TEST install_non_standard_cgal APPEND PROPERTY FIXTURES_SETUP test_config_file_non_standard_install_lib_cmake_target) +set_property(TEST test_config_file_non_standard_install_lib_cmake test_config_file_non_standard APPEND PROPERTY FIXTURES_REQUIRED test_config_file_non_standard_install_lib_cmake_target) set_property(TEST install_non_standard_cgal APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) set_property(TEST config_non_standard_cgal APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) -if(CGAL_Qt5_FOUND) - set_property(TEST install_non_standard_cgal_qt5 APPEND PROPERTY DEPENDS config_non_standard_cgal_qt5) - set_property(TEST config_non_standard_cgal_qt5 APPEND PROPERTY FIXTURES_SETUP test_config_file_4_target) - set_property(TEST install_non_standard_cgal_qt5 APPEND PROPERTY FIXTURES_SETUP test_config_file_4_target) - set_property(TEST test_config_file_4 APPEND PROPERTY FIXTURES_REQUIRED test_config_file_4_target) +if(CGAL_Qt6_FOUND) + set_property(TEST install_non_standard_cgal_qt APPEND PROPERTY DEPENDS config_non_standard_cgal_qt) + set_property(TEST config_non_standard_cgal_qt APPEND PROPERTY FIXTURES_SETUP test_config_file_non_standard_install_lib_cmake_with_qt_target) + set_property(TEST install_non_standard_cgal_qt APPEND PROPERTY FIXTURES_SETUP test_config_file_non_standard_install_lib_cmake_with_qt_target) + set_property(TEST test_config_file_non_standard_install_lib_cmake_with_qt APPEND PROPERTY FIXTURES_REQUIRED test_config_file_non_standard_install_lib_cmake_with_qt_target) - set_property(TEST install_non_standard_cgal_qt5 APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) - set_property(TEST config_non_standard_cgal_qt5 APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) -endif()#CGAL_Qt5_FOUND + set_property(TEST install_non_standard_cgal_qt APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) + set_property(TEST config_non_standard_cgal_qt APPEND PROPERTY LABELS Installation_Tests CGAL_cmake_testsuite) +endif()#CGAL_Qt6_FOUND diff --git a/Installation/test/Installation/link_to_CGAL_Qt6.cpp b/Installation/test/Installation/link_to_CGAL_Qt6.cpp new file mode 100644 index 000000000000..f83cad157054 --- /dev/null +++ b/Installation/test/Installation/link_to_CGAL_Qt6.cpp @@ -0,0 +1,11 @@ +// Use something defined not in headers but in the CGAL library to test that is was indeed properly built and linked to, + +#include + +typedef QRectF (*mapToSceneFunction)(const QGraphicsView* , const QRect); + +int main() +{ + mapToSceneFunction f = CGAL::Qt::mapToScene; + return (&f > 0) ? 0 : 1; +} diff --git a/Installation/test/Installation/test_configuration_qt5.cmake.in b/Installation/test/Installation/test_configuration_qt.cmake.in similarity index 89% rename from Installation/test/Installation/test_configuration_qt5.cmake.in rename to Installation/test/Installation/test_configuration_qt.cmake.in index 548c6fba2bf8..6283fc661205 100644 --- a/Installation/test/Installation/test_configuration_qt5.cmake.in +++ b/Installation/test/Installation/test_configuration_qt.cmake.in @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.23) project(test_configuration) -find_package(CGAL COMPONENTS Qt5) +find_package(CGAL COMPONENTS Qt6) add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS) get_filename_component(CGAL_DIR_PATH "${CGAL_DIR}/CMakeConfig.cmake" DIRECTORY) @@ -10,5 +10,5 @@ if(NOT ${CGAL_DIR_PATH} STREQUAL ${CGAL_GIVEN_DIR_PATH}) message("${CGAL_DIR_PATH} != ${CGAL_GIVEN_DIR_PATH}") message( FATAL_ERROR "The CGAL_DIR is wrong !") endif() -add_executable(test_configuration @CMAKE_CURRENT_SOURCE_DIR@/test_configuration_qt5.cpp) -target_link_libraries(test_configuration PUBLIC CGAL::CGAL CGAL::CGAL_Qt5) +add_executable(test_configuration @CMAKE_CURRENT_SOURCE_DIR@/test_configuration_qt.cpp) +target_link_libraries(test_configuration PUBLIC CGAL::CGAL CGAL::CGAL_Qt6) diff --git a/Installation/test/Installation/test_configuration_qt5.cpp b/Installation/test/Installation/test_configuration_qt.cpp similarity index 100% rename from Installation/test/Installation/test_configuration_qt5.cpp rename to Installation/test/Installation/test_configuration_qt.cpp diff --git a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h index 0e0d2f392b58..648d2c81ef3c 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h +++ b/Linear_cell_complex/doc/Linear_cell_complex/CGAL/draw_linear_cell_complex.h @@ -3,8 +3,8 @@ namespace CGAL { /*! \ingroup PkgDrawLinearCellComplex -opens a new window and draws `alcc`, a model of the `LinearCellComplex` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws `alcc`, a model of the `LinearCellComplex` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam LCC a model of the `LinearCellComplex` concept. \param alcc the linear cell complex to draw. diff --git a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt index 0cb7753c302a..cac02fc6200d 100644 --- a/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt +++ b/Linear_cell_complex/doc/Linear_cell_complex/Linear_cell_complex.txt @@ -265,8 +265,8 @@ A linear cell complex can be visualized by calling the \link PkgDrawLinearCellCo \cgalExample{Linear_cell_complex/draw_linear_cell_complex.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_lcc,draw_lcc.png} Result of the run of the draw_linear_cell_complex program. A window shows two 3D cubes and allows to navigate through the 3D scene. diff --git a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h index f65883f84053..d61f502cc4f0 100644 --- a/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h +++ b/Nef_3/doc/Nef_3/CGAL/draw_nef_3.h @@ -4,8 +4,8 @@ namespace CGAL { \ingroup PkgDrawNef3 Open a new window and draws `anef3`, the `Nef_polyhedron_3`. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam Nef3 a model of the `Nef_polyhedron_3` concept. \param anef3 the nef polyhedron to draw. diff --git a/Nef_3/doc/Nef_3/Nef_3.txt b/Nef_3/doc/Nef_3/Nef_3.txt index 60e98f188640..2edbb56529d6 100644 --- a/Nef_3/doc/Nef_3/Nef_3.txt +++ b/Nef_3/doc/Nef_3/Nef_3.txt @@ -424,8 +424,8 @@ A nef polyhedron can be visualised by calling the \link PkgDrawNef3 CGAL::draw( \cgalExample{Polygon/draw_polygon.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_polygon,draw_polygon.png} Result of the run of the draw_polygon program. A window shows the polygon and allows to navigate through the scene. diff --git a/Polygon/include/CGAL/draw_polygon_2.h b/Polygon/include/CGAL/draw_polygon_2.h index 1ab6ea142674..800e15e18a06 100644 --- a/Polygon/include/CGAL/draw_polygon_2.h +++ b/Polygon/include/CGAL/draw_polygon_2.h @@ -25,8 +25,8 @@ namespace CGAL { /*! \ingroup PkgDrawPolygon2 -opens a new window and draws `ap`, an instance of the `CGAL::Polygon_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws `ap`, an instance of the `CGAL::Polygon_2` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam P an instance of the `CGAL::Polygon_2` class. \param ap the polygon to draw. diff --git a/Polygon/include/CGAL/draw_polygon_with_holes_2.h b/Polygon/include/CGAL/draw_polygon_with_holes_2.h index d8b72c9bdd92..a530ad0a221b 100644 --- a/Polygon/include/CGAL/draw_polygon_with_holes_2.h +++ b/Polygon/include/CGAL/draw_polygon_with_holes_2.h @@ -28,9 +28,9 @@ namespace CGAL { * opens a new window and draws `aph`, an instance of the * `CGAL::Polygon_with_holes_2` class. A call to this function is blocking, that * is the program continues as soon as the user closes the window. This function - * requires `CGAL_Qt5`, and is only available if the macro + * requires `CGAL_Qt6`, and is only available if the macro * `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target - * `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition + * `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition * `CGAL_USE_BASIC_VIEWER`. * \tparam PH an instance of the `CGAL::Polygon_with_holes_2` class. * \param aph the polygon with holes to draw. diff --git a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h index 3ce65574799e..9ed56fe232c2 100644 --- a/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h +++ b/Polyhedron/doc/Polyhedron/CGAL/draw_polyhedron.h @@ -3,8 +3,8 @@ namespace CGAL { /*! \ingroup PkgDrawPolyhedron -opens a new window and draws `apoly`, an instance of the `CGAL::Polyhedron_3` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws `apoly`, an instance of the `CGAL::Polyhedron_3` class. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam POLY an instance of the `CGAL::Polyhedron_3` class. \param apoly the polyhedron to draw. diff --git a/Polyhedron/doc/Polyhedron/Polyhedron.txt b/Polyhedron/doc/Polyhedron/Polyhedron.txt index cff55a73257d..e9d9cb1a5b35 100644 --- a/Polyhedron/doc/Polyhedron/Polyhedron.txt +++ b/Polyhedron/doc/Polyhedron/Polyhedron.txt @@ -284,8 +284,8 @@ A polyhedron can be visualized by calling the \link PkgDrawPolyhedron CGAL::draw \cgalExample{Polyhedron/draw_polyhedron.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_polyhedron,draw_polyhedron.png} Result of the run of the draw_polyhedron program. A window shows the polyhedron and allows to navigate through the 3D scene. diff --git a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt index e7a521eaaabc..b7be50a395fc 100644 --- a/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt +++ b/Surface_mesh/doc/Surface_mesh/Surface_mesh.txt @@ -388,8 +388,8 @@ A surface mesh can be visualized by calling the \link PkgDrawSurfaceMesh CGAL::d \cgalExample{Surface_mesh/draw_surface_mesh.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_surface_mesh,draw_surface_mesh.png} Result of the run of the draw_surface_mesh program. A window shows the surface mesh and allows to navigate through the 3D scene. diff --git a/Surface_mesh/include/CGAL/draw_surface_mesh.h b/Surface_mesh/include/CGAL/draw_surface_mesh.h index 8dd25acd5b2b..72158e05836c 100644 --- a/Surface_mesh/include/CGAL/draw_surface_mesh.h +++ b/Surface_mesh/include/CGAL/draw_surface_mesh.h @@ -17,8 +17,8 @@ /*! \ingroup PkgDrawSurfaceMesh -Open a new window and draw `asm`, an instance of the `CGAL::Surface_mesh` class. The function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +Open a new window and draw `asm`, an instance of the `CGAL::Surface_mesh` class. The function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam SM an instance of the `CGAL::Surface_mesh` class. \param asm the surface mesh to draw. diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h index e2a13b4bf5ff..df9bde13a6f3 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/CGAL/draw_face_graph_with_paths.h @@ -4,7 +4,7 @@ namespace CGAL { \ingroup PkgDrawFaceGraphWithPaths opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. \tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept. \param amesh the mesh to draw. \param apaths the paths to draw, which should lie on `amesh`. @@ -17,7 +17,7 @@ void draw(const Mesh& amesh, \ingroup PkgDrawFaceGraphWithPaths opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `apaths`. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the flag `CGAL_USE_BASIC_VIEWER` is defined at compile time. \tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept. \param amesh the mesh to draw. \param apaths the paths to draw, which should lie on `amesh`. diff --git a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt index 4ce425fb91f2..ad624ea45868 100644 --- a/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt +++ b/Surface_mesh_topology/doc/Surface_mesh_topology/Surface_mesh_topology.txt @@ -153,20 +153,20 @@ In order to find the edge width of the surface, one can make use of the routine \cgalExample{Surface_mesh_topology/edgewidth_surface_mesh.cpp} -In these two examples, the mesh and the cycles can be visualized if CGAL_Qt5 is enabled. +In these two examples, the mesh and the cycles can be visualized if CGAL_Qt6 is enabled. \subsection SMTopology_Example_IV Compute Face Width -The following example computes the face width, and visualizes it if CGAL_Qt5 is enabled. +The following example computes the face width, and visualizes it if CGAL_Qt6 is enabled. \cgalExample{Surface_mesh_topology/facewidth.cpp} \subsection SMTopology_Example_V Basic Homotopy Test -The following example shows how to load an off file and how to create three closed paths on this surface. Contractibility and free homotopy tests are then performed. The example also shows how to use the \cgal viewer if CGAL_Qt5 is enabled. +The following example shows how to load an off file and how to create three closed paths on this surface. Contractibility and free homotopy tests are then performed. The example also shows how to use the \cgal viewer if CGAL_Qt6 is enabled. \cgalExample{Surface_mesh_topology/path_homotopy_double_torus.cpp} \subsection SMTopology_Example_VI Basic Simplicity Test -The following example shows how to test the simplicity of a closed path on a double torus. The original path is visualized if CGAL_Qt5 is enabled. +The following example shows how to test the simplicity of a closed path on a double torus. The original path is visualized if CGAL_Qt6 is enabled. \cgalExample{Surface_mesh_topology/path_simplicity_double_torus_2.cpp} \subsection SMTopology_Example_VI_VII Polygonal Schema diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 120094cabbb3..2ec152996977 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -47,7 +47,7 @@ name="libCGALCore_shared" elif name == "libCGAL_ImageIO": name="libCGALimageIO_shared" - elif name == "libCGAL_Qt5": + elif name == "libCGAL_Qt6": name="libCGALQt5_shared" if name=="incomplete": is_writing=False diff --git a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h index 4b63d19a344d..6ca50c894cf4 100644 --- a/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h +++ b/Triangulation_2/doc/Triangulation_2/CGAL/draw_triangulation_2.h @@ -8,9 +8,9 @@ has constraints they are drawn. If the face type has a member function `bool is_in_domain()` the faces inside and outside of the domain are drawn in different colors. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with -`CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +`CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam T2 a triangulation class derived from `Triangulation_2` or `Constrained_triangulation_2` \param at2 the triangulation to draw. @@ -26,8 +26,8 @@ opens a new window and draws a constrained triangulation. If the triangulation has constraints they are drawn. The faces inside and outside of the domain, based on the property map, are drawn in different colors. -A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam CT2 a triangulation class derived from `Constrained_triangulation_2` \tparam InDomainPMap a class model of `ReadWritePropertyMap` with diff --git a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt index 249c5a0117de..a7aead03e285 100644 --- a/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt +++ b/Triangulation_2/doc/Triangulation_2/Triangulation_2.txt @@ -509,8 +509,8 @@ A 2D triangulation can be visualized by calling the \link PkgDrawTriangulation2 \cgalExample{Triangulation_2/draw_triangulation_2.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_triangulation_2,draw_triangulation_2.png} Result of the run of the draw_triangulation_2 program. A window shows the 2D triangulation and allows to navigate through the scene. diff --git a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h index 266e73dcca29..82d1caf91248 100644 --- a/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h +++ b/Triangulation_3/doc/Triangulation_3/CGAL/draw_triangulation_3.h @@ -3,8 +3,8 @@ namespace CGAL { /*! \ingroup PkgDrawTriangulation3 -opens a new window and draws `at3`, a model of the `TriangulationDataStructure_3` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +opens a new window and draws `at3`, a model of the `TriangulationDataStructure_3` concept. A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt6, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam T3 a model of the `TriangulationDataStructure_3` concept. \param at3 the triangulation to draw. diff --git a/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt b/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt index 0b1170a552ed..84daca88505f 100644 --- a/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt +++ b/Triangulation_3/doc/Triangulation_3/Triangulation_3.txt @@ -569,8 +569,8 @@ A 3D triangulation can be visualized by calling the \link PkgDrawTriangulation3 \cgalExample{Triangulation_3/draw_triangulation_3.cpp} -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalFigureBegin{fig_draw_triangulation_3,draw_triangulation_3.png} Result of the run of the draw_triangulation_3 program. A window shows the 3D triangulation and allows to navigate through the 3D scene. diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h index 1eb06f9c3530..530bcaf5dda2 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/CGAL/draw_voronoi_diagram_2.h @@ -6,8 +6,8 @@ namespace CGAL { opens a new window and draws `av2`, the `Voronoi_diagram_2` constructed from a Delaunay Graph which is a model of `DelaunayGraph_2` concept. The class `Voronoi_diagram_2` provides an adaptor to view a triangulated Delaunay graph as their dual subdivision, the Voronoi diagram. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \tparam V2 a model of the `AdaptationTraits_2` concept. \param av2 the voronoi diagram to draw. diff --git a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Voronoi_diagram_2.txt b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Voronoi_diagram_2.txt index 2ee66c16c184..437036f97efd 100644 --- a/Voronoi_diagram_2/doc/Voronoi_diagram_2/Voronoi_diagram_2.txt +++ b/Voronoi_diagram_2/doc/Voronoi_diagram_2/Voronoi_diagram_2.txt @@ -493,8 +493,8 @@ location queries. A 2D Voronoi Diagram can be visualized by calling the \link PkgDrawVoronoiDiagram2 CGAL::draw() \endlink function as shown in the following example. This function opens a new window showing the Voronoi Diagram of the given input sites/vertex locations. A call to this function is blocking, that is the program continues as soon as the user closes the window. -This function requires `CGAL_Qt5`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. -Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt5` and add the definition `CGAL_USE_BASIC_VIEWER`. +This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. \cgalExample{Voronoi_diagram_2/draw_voronoi_diagram_2.cpp} From 48f37a14dc9563617633c3a313c94d2cf00d8e1b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 17:02:21 +0200 Subject: [PATCH 0732/1398] remove occurrences of Qt5 --- .gitignore | 8 ------ .../Developer_manual/cmakelist_script.txt | 2 +- .../create_and_use_a_cmakelist.txt | 4 +-- .../doc/Documentation/Third_party.txt | 4 +-- Documentation/doc/Documentation/Usage.txt | 8 +++--- .../advanced/Configuration_variables.txt | 8 +++--- Documentation/doc/Documentation/windows.txt | 9 +++---- GraphicsView/TODO | 11 -------- .../Segment_voronoi_linf_2.cpp | 2 +- GraphicsView/include/CGAL/export/Qt.h | 4 +-- Installation/LICENSE | 11 ++++---- ...GAL_enable_end_of_configuration_hook.cmake | 4 +-- .../config/support/print_QT4_version.cpp | 19 -------------- Installation/include/CGAL/export/helpers.h | 2 +- .../Installation/test_configuration_qt.cpp | 2 +- .../Linear_cell_complex_3_demo.cpp | 2 +- Mesh_2/demo/Mesh_2/README.txt | 2 +- .../Polyline_simplification_2.cpp | 2 +- .../fundamental_group_of_the_torus.cpp | 2 +- Testsuite/test/post_process_ctest_results.py | 2 +- Three/doc/Three/Three.txt | 25 +++++++++---------- 21 files changed, 46 insertions(+), 87 deletions(-) delete mode 100644 GraphicsView/TODO delete mode 100644 Installation/cmake/modules/config/support/print_QT4_version.cpp diff --git a/.gitignore b/.gitignore index a53ed4269ce2..90f003227c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -178,12 +178,6 @@ GraphicsView/demo/Triangulation_2/Makefile GraphicsView/demo/Triangulation_2/Regular_triangulation_2 GraphicsView/demo/Triangulation_2/qrc_*.cxx GraphicsView/demo/Triangulation_2/ui_*.h -GraphicsView/src/CGAL_Qt5/*.dll -GraphicsView/src/CGAL_Qt5/*.lib -GraphicsView/src/CGAL_Qt5/*.so -GraphicsView/src/CGAL_Qt5/Makefile -GraphicsView/src/CGAL_Qt5/moc_*.cxx -GraphicsView/src/CGAL_Qt5/qrc_*.cxx HalfedgeDS/test/HalfedgeDS/cgal_test_with_cmake HalfedgeDS/test/HalfedgeDS/test_hds HalfedgeDS/test/HalfedgeDS/test_hds_decorator @@ -879,7 +873,6 @@ Surface_mesher/demo/Surface_mesher/.*.deps Surface_mesher/demo/Surface_mesher/.qglviewer.xml Surface_mesher/demo/Surface_mesher/Makefile Surface_mesher/demo/Surface_mesher/Surface_mesher -Surface_mesher/demo/Surface_mesher/Surface_mesher_Qt5_Demo Surface_mesher/demo/Surface_mesher/VTK/Makefile Surface_mesher/demo/Surface_mesher/VTK/mesh_a_3D_image Surface_mesher/demo/Surface_mesher/VTK/mesh_a_VTK_3D_image @@ -894,7 +887,6 @@ Surface_mesher/demo/Surface_mesher/out*.off Surface_mesher/demo/Surface_mesher/polyhedron_remesher Surface_mesher/demo/Surface_mesher/polyhedron_remesher_with_edges Surface_mesher/demo/Surface_mesher/qrc_*.c* -Surface_mesher/demo/Surface_mesher/qt5-demo Surface_mesher/demo/Surface_mesher/ui_*.h Surface_mesher/doxygen Surface_mesher/examples/Surface_mesher/.*.deps diff --git a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt index 7b451bf81784..26c1f7c0ef4b 100644 --- a/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt +++ b/Documentation/doc/Documentation/Developer_manual/cmakelist_script.txt @@ -23,7 +23,7 @@ If the parameter is not given, the script creates one executable for each giv source file.

    `-c com1:com2:...`
    Lists components ("com1", "com2") of \cgal to which the executable(s) should be linked. Valid components are \cgal's -libraries (i.e.\ "Core", "ImageIO", and "Qt5"). An example is `-c Core`. +libraries (i.e.\ "Core", "ImageIO", and "Qt6"). An example is `-c Core`.
    `-b boost1:boost2:...`
    Lists components ("boost1", "boost2") of \boost to which the executable(s) should be diff --git a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt index 14eb07f8d8f0..d55f4c0819ba 100644 --- a/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt +++ b/Documentation/doc/Documentation/Developer_manual/create_and_use_a_cmakelist.txt @@ -25,8 +25,8 @@ the section \subpage thirdparty. - `-frounding-math` with gcc - `/fp:strict /fp:except-` with MSVC -\section secexample Minimal Example Using Qt5 -This section describes a minimal example of a program that uses \cgal and Qt5 for some GUI features. +\section secexample Minimal Example Using Qt6 +This section describes a minimal example of a program that uses \cgal and Qt6 for some GUI features. \subsection subcmake CMakeLists.txt \dontinclude Surface_mesh/CMakeLists.txt diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index 67533c1aef90..dda99763ac9d 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -102,8 +102,8 @@ version shipped with \cgal. The page \ref configurationvariables lists CMake and environment variables which can be used to specify the location of third-party software during configuration. -\subsection thirdpartyQt Qt5 -Version 5.9.0 or later +\subsection thirdpartyQt Qt6 +Version 6.4 or later Qt is a cross-platform application and UI framework. diff --git a/Documentation/doc/Documentation/Usage.txt b/Documentation/doc/Documentation/Usage.txt index 046f3d6da384..0cfdb9ba30ec 100644 --- a/Documentation/doc/Documentation/Usage.txt +++ b/Documentation/doc/Documentation/Usage.txt @@ -166,17 +166,17 @@ if no debugging is intended. Users should thus run: cd CGAL-\cgalReleaseNumber/examples/Triangulation_2 cmake -DCGAL_DIR=$HOME/CGAL-\cgalReleaseNumber -DCMAKE_BUILD_TYPE=Release . # we are here using a release tarball -The package Qt5 on brew is "keg-only", which means it is not "linked" with brew. -In order to link against Qt5, you need to run: +The package Qt6 on brew is "keg-only", which means it is not "linked" with brew. +In order to link against Qt6, you need to run: - brew link qt@5 + brew link qt@6 After that, you will have to specify the Qt6_DIR by hand to cmake, using something like -DQt6_DIR=/usr/local/opt/qt6/lib/cmake/Qt6 where `/usr/local/` is actually your current brew installation directory. Check this directory -to be sure where the Qt5 is placed on your machine. +to be sure where the Qt6 is placed on your machine. \subsection usage_configuring_cmake_gui Specifying Missing Dependencies diff --git a/Documentation/doc/Documentation/advanced/Configuration_variables.txt b/Documentation/doc/Documentation/advanced/Configuration_variables.txt index 7cedae4344ac..7c475f547766 100644 --- a/Documentation/doc/Documentation/advanced/Configuration_variables.txt +++ b/Documentation/doc/Documentation/advanced/Configuration_variables.txt @@ -85,7 +85,7 @@ and will serverly limit performances. | Variable | Description | Type | %Default Value | | :- | :- | :- | :- | | `CGAL_DIR` | Full-path to the binary directory where \cgal was configured |Either CMake or Environment | none | -| `Qt5_DIR` | Full-path to the Qt cmake directory |CMake| platform-dependent| +| `Qt6_DIR` | Full-path to the Qt cmake directory |CMake| platform-dependent| \subsection installation_variables_third_party Variables Providing Information About 3rd-Party Libraries @@ -178,11 +178,11 @@ Under Linux, the \gmpxx is also searched for, and you may specify the following -\subsection installation_qt5 Qt5 Library +\subsection installation_qt6 Qt6 Library -You must set the cmake or environment variable `Qt5_DIR` to point to the path +You must set the cmake or environment variable `Qt6_DIR` to point to the path to the directory containing the file `Qt6Config.cmake` created by your \qt6 installation. If you are -using the open source edition it should be `/qt-everywhere-opensource-src-/qtbase/lib/cmake/Qt5`. +using the open source edition it should be `/qt-everywhere-opensource-src-/qtbase/lib/cmake/Qt6`. \subsection installation_leda LEDA Library diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index 8b4674530077..0dd5839a8b3b 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -118,7 +118,7 @@ CMake variables and paths. Otherwise, you can also install it using `vcpkg`: Remember to specify `--triplet` or the related environment variable in case you target 64-bit applications. -As Qt5 is modular and as the \cgal examples and demos use only some of these modules +As Qt6 is modular and as the \cgal examples and demos use only some of these modules you can save download and compilation time by specifying an *installation option*: C:\dev\vcpkg> .\vcpkg.exe install cgal[qt] @@ -234,11 +234,10 @@ A typical `Qt` installation would consist of the following steps: diff --git a/GraphicsView/TODO b/GraphicsView/TODO deleted file mode 100644 index ec7ea6d5649d..000000000000 --- a/GraphicsView/TODO +++ /dev/null @@ -1,11 +0,0 @@ -Les inputs se sont seulement un simple mousePressEvent (pour un circle, il faut cliquer deux fois) -Pour le cercle, ça serait bien d'avoir la possibilité d'entrée un cercle par centre/rayon, ou deux points diamétraux, ou trois points. -Bloquer l'input sur un truc // aux axes (avec shift) -S'inspirer de ipe, en général. - -Control: pour les navigations -Shift: pour // aux axes. - -Affichage du (x,y) par rapport à l'origine de l'objet en cours. - -Integrer src/CGALQt5 dans le build process de CGAL, avec CMake. diff --git a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp index 7b67d31ad4a5..77d9e7c4dc00 100644 --- a/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp +++ b/GraphicsView/demo/Segment_Delaunay_graph_Linf_2/Segment_voronoi_linf_2.cpp @@ -522,7 +522,7 @@ int main(int argc, char **argv) app.setOrganizationName("GeometryFactory"); app.setApplicationName("Segment Voronoi 2 demo"); - // Import resources from libCGAL (Qt5) + // Import resources from libCGAL (Qt6) CGAL_QT_INIT_RESOURCES; if (argc == 2) { diff --git a/GraphicsView/include/CGAL/export/Qt.h b/GraphicsView/include/CGAL/export/Qt.h index a1392b2610a2..a5b1c82fa197 100644 --- a/GraphicsView/include/CGAL/export/Qt.h +++ b/GraphicsView/include/CGAL/export/Qt.h @@ -16,9 +16,9 @@ #include #if ( defined(CGAL_BUILD_SHARED_LIBS) && ( ! defined(CGAL_HEADER_ONLY) ) ) \ - || defined(CGAL_USE_Qt5_RESOURCES) + || defined(CGAL_USE_Qt6_RESOURCES) -# if defined(CGAL_Qt6_EXPORTS) || defined(CGAL_USE_Qt5_RESOURCES) +# if defined(CGAL_Qt6_EXPORTS) || defined(CGAL_USE_Qt6_RESOURCES) // defined by CMake or in cpp files of the dll # define CGAL_QT_EXPORT CGAL_DLL_EXPORT diff --git a/Installation/LICENSE b/Installation/LICENSE index 1ba1accba3e1..dd6e40c93dcb 100644 --- a/Installation/LICENSE +++ b/Installation/LICENSE @@ -5,9 +5,8 @@ The CGAL software consists of several parts, each of which is licensed under an open source license. It is also possible to obtain commercial licenses from GeometryFactory (www.geometryfactory.com) for all or parts of CGAL. -The source code of the CGAL library can be found in the directories -"src/CGAL", "src/CGALQt", "src/CGALQt5" and "include/CGAL" (with the -exception of "include/CGAL/CORE", "include/CGAL/OpenNL"). +The source code of the CGAL library can be found in the directory +"include/CGAL" (with the exception of "include/CGAL/CORE", "include/CGAL/OpenNL"). It is specified in each file of the CGAL library which license applies to it. This is either the GNU General Public License or the GNU Lesser General Public License (as published by the Free Software @@ -26,9 +25,9 @@ Distributed along with CGAL (for the users' convenience), but not part of CGAL, are the following third-party libraries, available under their own licenses: -- CORE, in the directories "include/CGAL/CORE" and "src/CGAL_Core", is - licensed under the LGPL (see LICENSE.LGPL). -- ImageIO, in the directory "src/CGAL_ImageIO", is licensed under the LGPL +- CORE, in the directory "include/CGAL/CORE" is licensed under the LGPL + (see LICENSE.LGPL). +- ImageIO, in the directory "include/CGAL/ImageIO", is licensed under the LGPL (see LICENSE.LGPL). - OpenNL, in the directory "include/CGAL/OpenNL", is licensed under the LGPL (see LICENSE.LGPL). diff --git a/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake b/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake index a25a85fa50c4..4b6053671fc8 100644 --- a/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake +++ b/Installation/cmake/modules/CGAL_enable_end_of_configuration_hook.cmake @@ -103,7 +103,7 @@ disable this ${type}.\n\ endif() endfunction() -function(CGAL_hook_fix_ctest_depending_on_Qt5) +function(CGAL_hook_fix_ctest_depending_on_Qt6) get_property(_targets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY BUILDSYSTEM_TARGETS) foreach(_target ${_targets}) if(NOT TEST "compilation of ${_target}") @@ -120,7 +120,7 @@ function(CGAL_hooks_at_end_of_all_directories) CGAL_hook_check_targets() CGAL_hook_check_unused_cpp_files() if(BUILD_TESTING) - CGAL_hook_fix_ctest_depending_on_Qt5() + CGAL_hook_fix_ctest_depending_on_Qt6() endif() endfunction() diff --git a/Installation/cmake/modules/config/support/print_QT4_version.cpp b/Installation/cmake/modules/config/support/print_QT4_version.cpp deleted file mode 100644 index cd290f2f4e4a..000000000000 --- a/Installation/cmake/modules/config/support/print_QT4_version.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2008 GeometryFactory, Sophia Antipolis (France) -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial - -// Tests if QT5 is available and prints its version string. - -#include -#include - -int main() -{ - std::cout << "version=" << QT_VERSION_STR << std::endl; - - return 0; -} diff --git a/Installation/include/CGAL/export/helpers.h b/Installation/include/CGAL/export/helpers.h index 4b384c71f4bc..3f5750902f80 100644 --- a/Installation/include/CGAL/export/helpers.h +++ b/Installation/include/CGAL/export/helpers.h @@ -12,7 +12,7 @@ #ifndef CGAL_EXPORT_HELPERS_H #define CGAL_EXPORT_HELPERS_H -#if defined(CGAL_HEADER_ONLY) && ! defined(CGAL_USE_Qt5_RESOURCES) +#if defined(CGAL_HEADER_ONLY) && ! defined(CGAL_USE_Qt6_RESOURCES) # define CGAL_DLL_IMPORT # define CGAL_DLL_EXPORT # define CGAL_DLL_LOCAL diff --git a/Installation/test/Installation/test_configuration_qt.cpp b/Installation/test/Installation/test_configuration_qt.cpp index 73206ca0b4fe..34436111e123 100644 --- a/Installation/test/Installation/test_configuration_qt.cpp +++ b/Installation/test/Installation/test_configuration_qt.cpp @@ -26,7 +26,7 @@ int main(int argc, char**) { std::istream_iterator end; Triangulation t; t.insert(begin, end); - if(argc == 3) // do not test Qt5 at runtime + if(argc == 3) // do not test Qt6 at runtime CGAL::draw(t); std::cout<<"OK."< > paths={pij, pkl}; - CGAL::draw(sm, paths); // Enable only if CGAL was compiled with Qt5 + CGAL::draw(sm, paths); // Enable only if CGAL was compiled with Qt6 #endif // CGAL_USE_BASIC_VIEWER */ for (int i=-4; i<=4; ++i) diff --git a/Testsuite/test/post_process_ctest_results.py b/Testsuite/test/post_process_ctest_results.py index 2ec152996977..6da4d7de21c1 100644 --- a/Testsuite/test/post_process_ctest_results.py +++ b/Testsuite/test/post_process_ctest_results.py @@ -48,7 +48,7 @@ elif name == "libCGAL_ImageIO": name="libCGALimageIO_shared" elif name == "libCGAL_Qt6": - name="libCGALQt5_shared" + name="libCGALQt6_shared" if name=="incomplete": is_writing=False is_ignored=False diff --git a/Three/doc/Three/Three.txt b/Three/doc/Three/Three.txt index b8987352aea0..593d7623b2f3 100644 --- a/Three/doc/Three/Three.txt +++ b/Three/doc/Three/Three.txt @@ -322,7 +322,7 @@ To create an external plugin, you must make a new Cmake project.\n project( Example_plugin ) -Configure CMake as you desire and fetch the right Qt5 packages : +Configure CMake as you desire and fetch the right Qt6 packages : # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -331,13 +331,13 @@ Configure CMake as you desire and fetch the right Qt5 packages : cmake_minimum_required(VERSION 3.1...3.23) #Find CGAL - find_package(CGAL COMPONENTS Qt5) + find_package(CGAL COMPONENTS Qt6) include( ${CGAL_USE_FILE} ) - # Find Qt5 itself - find_package(Qt5 + # Find Qt6 itself + find_package(Qt6 QUIET - COMPONENTS OpenGL Script Svg Xml - OPTIONAL_COMPONENTS ScriptTools) + COMPONENTS OpenGLWidgets Svg + OPTIONAL_COMPONENTS WebSockets) You will probably have to fetch the libraries exported by the Polyhedron_demo, like the Scene_items. @@ -370,15 +370,14 @@ Notice that an external plugin will not be automatically loaded in the Polyhedro cmake_minimum_required(VERSION 3.1...3.23) #Find CGAL - find_package(CGAL COMPONENTS Qt5) + find_package(CGAL COMPONENTS Qt6) include( ${CGAL_USE_FILE} ) - # Find Qt5 itself - find_package(Qt5 - QUIET - COMPONENTS OpenGL Script Svg Xml - OPTIONAL_COMPONENTS ScriptTools) + # Find Qt6 itself + find_package(Qt6 QUIET + COMPONENTS OpenGLWidgets Svg + OPTIONAL_COMPONENTS WebSockets) - if(Qt5_FOUND AND CGAL_FOUND) + if(Qt6_FOUND AND CGAL_FOUND) find_package(CGAL_polyhedron_demo) include( ${CGAL_POLYHEDRON_DEMO_USE_FILE} ) From 68f7646dcbca3066ec65a81fd22b371a3605b4e5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 17:02:49 +0200 Subject: [PATCH 0733/1398] remove stray CMake debug messages --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index 4aaa5a99984d..afcfd708dc06 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -40,10 +40,6 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 ImageIO) set_package_properties(CGAL PROPERTIES TYPE REQUIRED) include(${CGAL_USE_FILE}) -if(CGAL_Qt6_FOUND) - message( STATUS "we found CGAL_Qt6") -endif() - # Find Qt6 itself find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Widgets Qml @@ -55,12 +51,7 @@ set_package_properties( PURPOSE "Enables the 3D Features, for GUI and visualization." DESCRIPTION "To find this package, it should be sufficient to fill the Qt6_DIR variable with: ///lib/cmake/Qt6") -if(NOT Qt6_FOUND) - message( STATUS "we did not find it") -endif() - if(Qt6_FOUND) - message( STATUS "we did find Qt6") add_definitions(-DQT_NO_KEYWORDS) add_definitions(-DSCENE_IMAGE_GL_BUFFERS_AVAILABLE) endif(Qt6_FOUND) @@ -128,17 +119,6 @@ set_package_properties( DESCRIPTION "A library for parallel programming." PURPOSE "Plugins such as Mesh_3, Bilateral smoothing, and WLOP are faster if TBB is linked.") - - -if(NOT CGAL_Qt6_FOUND) - message( STATUS "NOT CGAL_Qt6_FOUND") -endif() - -if(NOT Qt6_FOUND) - message( STATUS "NOT Qt6_FOUND") -endif() - - if(CGAL_Qt6_FOUND AND Qt6_FOUND) include(${CGAL_USE_FILE}) From 9bba3bd5fa57a8c8fb861fcd07b541e9238d97d5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 17:06:34 +0200 Subject: [PATCH 0734/1398] fix the list of used Qt6 components --- Documentation/doc/Documentation/Third_party.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index dda99763ac9d..1784cd7f88c5 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -112,9 +112,9 @@ It requires \qt6 installed on your system. In case \qt is not yet installed on your system, you can download it from `https://www.qt-project.org/`. -The exhaustive list of \qt5 components used in demos is: -`Core`, `Gui`, `Help`, `OpenGL`, `Script`, `ScriptTools`, `Svg`, `Widgets`, -`qcollectiongenerator` (with `sqlite` driver plugin), and `Xml`. +The exhaustive list of \qt6 components used in demos is: +`Core`, `Gui`, `Help`, `OpenGL`, `OpenGLWidgets`, `Qml`, `Svg`, `Widgets`, +`WebSockets`, `Network`, and `qcollectiongenerator` (with `sqlite` driver plugin). \subsection thirdpartyEigen Eigen Version 3.3.4 or later From b05e1e9e4604aa8663366f6f6aed416c215cce7e Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 14 Sep 2023 17:32:55 +0200 Subject: [PATCH 0735/1398] Remove UseCGAL.cmake and our old CMake macros `use_lib` and `use_component`. --- .../Arrangement_on_surface_2/CMakeLists.txt | 1 - .../Arrangement_on_surface_2/CMakeLists.txt | 3 - CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt | 2 - .../benchmark/Filtered_kernel/CMakeLists.txt | 6 +- GraphicsView/demo/Polygon/CMakeLists.txt | 1 - Installation/CHANGES.md | 1 + Installation/CMakeLists.txt | 3 - .../cmake/modules/CGALConfig_binary.cmake.in | 4 +- .../cmake/modules/CGALConfig_install.cmake.in | 3 +- Installation/cmake/modules/CGAL_Macros.cmake | 121 ------------------ Installation/cmake/modules/UseCGAL.cmake | 51 -------- Installation/lib/cmake/CGAL/CGALConfig.cmake | 4 +- Installation/test/Installation/CMakeLists.txt | 2 - .../Linear_cell_complex_2/CMakeLists.txt | 6 +- .../cmake/FindCGAL.cmake | 93 -------------- .../Linear_cell_complex_3/CMakeLists.txt | 4 +- Mesh_2/demo/Mesh_2/CMakeLists.txt | 6 +- Mesh_3/examples/Mesh_3/CMakeLists.txt | 3 +- .../CMakeLists.txt | 1 - Polyhedron/demo/Polyhedron/CMakeLists.txt | 10 +- .../Plugins/Surface_mesh/CMakeLists.txt | 2 - .../Plugins/Three_examples/CMakeLists.txt | 3 - .../Polyhedron/polyhedron_demo_macros.cmake | 2 +- Surface_mesh/benchmark/CMakeLists.txt | 6 +- Three/doc/Three/Three.txt | 2 - 25 files changed, 21 insertions(+), 319 deletions(-) delete mode 100644 Installation/cmake/modules/UseCGAL.cmake delete mode 100644 Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt index 5e9bf30e1d7a..b1de5935340d 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/CMakeLists.txt @@ -16,7 +16,6 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Core Qt6) find_package(Qt6 QUIET COMPONENTS Widgets) if (CGAL_Qt6_FOUND AND Qt6_FOUND) - include(${CGAL_USE_FILE}) add_compile_definitions(QT_NO_KEYWORDS) include_directories( BEFORE ./ ) diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/CMakeLists.txt b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/CMakeLists.txt index bd49b35a5ac5..f138fb0beb3e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/CMakeLists.txt +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/CMakeLists.txt @@ -8,7 +8,4 @@ enable_testing() find_package(CGAL REQUIRED COMPONENTS Core) -include (${CGAL_USE_FILE}) -# Since CMake-2.8.12: New CMake script, that defines the targets and -# the CTest test cases. include(${CMAKE_CURRENT_SOURCE_DIR}/cgal_test.cmake) diff --git a/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt b/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt index f017575dd855..98a5ab469f39 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt +++ b/CGAL_ipelets/demo/CGAL_ipelets/CMakeLists.txt @@ -20,8 +20,6 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") find_package(CGAL REQUIRED COMPONENTS Core) -include(${CGAL_USE_FILE}) - find_package(Eigen3 3.1.0 QUIET) #(requires 3.1.0 or greater) include(CGAL_Eigen3_support) if(NOT TARGET CGAL::Eigen3_support) diff --git a/Filtered_kernel/benchmark/Filtered_kernel/CMakeLists.txt b/Filtered_kernel/benchmark/Filtered_kernel/CMakeLists.txt index b894f7392295..b240de403f81 100644 --- a/Filtered_kernel/benchmark/Filtered_kernel/CMakeLists.txt +++ b/Filtered_kernel/benchmark/Filtered_kernel/CMakeLists.txt @@ -9,12 +9,10 @@ add_executable(bench_simple_comparisons bench_simple_comparisons.cpp) find_package(CGAL REQUIRED COMPONENTS Core) add_executable(bench_orientation_3 "orientation_3.cpp") -target_link_libraries(bench_orientation_3 ${CGAL_LIBRARIES} - ${CGAL_3RD_PARTY_LIBRARIES}) +target_link_libraries(bench_orientation_3 CGAL::CGAL_Core) add_executable(bench_comparisons "orientation_3.cpp") -target_link_libraries(bench_comparisons ${CGAL_LIBRARIES} - ${CGAL_3RD_PARTY_LIBRARIES}) +target_link_libraries(bench_comparisons CGAL::CGAL_Core) set_property( TARGET bench_comparisons APPEND diff --git a/GraphicsView/demo/Polygon/CMakeLists.txt b/GraphicsView/demo/Polygon/CMakeLists.txt index 303b381e038f..ee30af0275eb 100644 --- a/GraphicsView/demo/Polygon/CMakeLists.txt +++ b/GraphicsView/demo/Polygon/CMakeLists.txt @@ -16,7 +16,6 @@ endif() find_package(Qt6 QUIET COMPONENTS Widgets) if(CGAL_Qt6_FOUND AND Qt6_FOUND) - include(${CGAL_USE_FILE}) add_definitions(-DQT_NO_KEYWORDS) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index eb1e09caa197..a0202f39624f 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -14,6 +14,7 @@ Release date: October 2023 - **Breaking change**: The usage of `boost::shared_ptr` has been replaced by `std::shared_ptr`. Packages affected are 2D Straight Line Skeleton and Shape Detection. - **Breaking change**: The usage of `boost::optional` has been replaced by `std::optional`. Packages affected are 2D Straight Line Skeleton, 3D Fast Intersection and Distance Computation (AABB Tree), and the Kernel intersection. - **Breaking change**: The usage of `boost::variant` has been replaced by `std::variant`. Packages affected are 2D Arrangements, and the Kernel intersection. +- **Breaking chahge**: The file CMake file `UseCGAL.cmake` has been removed from CGAL. Usages of the CMake variables `${CGAL_USE_FILE}` and `${CGAL_LIBRARIES}` must be replaced by a link to the imported target `CGAL::CGAL`, for example: `target_link_library(the_target PRIVATE CGAL::CGAL)`. #### 2D Arrangements diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index d773903a310a..d9a0eecee3cc 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -656,7 +656,6 @@ endif() # # Variables used when WITH_{demos|examples|tests} are TRUE # -set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake) get_property(CGAL_FOUND GLOBAL PROPERTY CGAL_FOUND) get_property(CGAL_Core_FOUND GLOBAL PROPERTY CGAL_Core_FOUND) get_property(CGAL_ImageIO_FOUND GLOBAL PROPERTY CGAL_ImageIO_FOUND) @@ -755,8 +754,6 @@ install(PROGRAMS ${scripts} DESTINATION ${CGAL_INSTALL_BIN_DIR}) install(DIRECTORY ${CGAL_MODULES_REL_DIR}/ DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) -install(FILES ${CGAL_MODULES_REL_DIR}/UseCGAL.cmake - DESTINATION ${CGAL_INSTALL_CMAKE_DIR}) if(IS_DIRECTORY auxiliary/gmp/include AND IS_DIRECTORY auxiliary/gmp/lib) install(DIRECTORY auxiliary/gmp/include/ DESTINATION ${CGAL_INSTALL_INC_DIR}) diff --git a/Installation/cmake/modules/CGALConfig_binary.cmake.in b/Installation/cmake/modules/CGALConfig_binary.cmake.in index 7987a2bbd1f3..eaab3c7f7f7a 100644 --- a/Installation/cmake/modules/CGALConfig_binary.cmake.in +++ b/Installation/cmake/modules/CGALConfig_binary.cmake.in @@ -93,8 +93,6 @@ set(CGAL_ImageIO_USE_ZLIB "@CGAL_ImageIO_USE_ZLIB@" ) set(CGAL_VERSION "${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}.${CGAL_BUGFIX_VERSION}") -set(CGAL_USE_FILE "${CGAL_MODULES_DIR}/UseCGAL.cmake" ) - if ( CGAL_FIND_REQUIRED ) set( CHECK_CGAL_COMPONENT_MSG_ON_ERROR TRUE ) set( CHECK_CGAL_COMPONENT_ERROR_TYPE FATAL_ERROR ) @@ -169,7 +167,7 @@ foreach( CGAL_COMPONENT ${CGAL_FIND_COMPONENTS} ) endforeach() # Starting with cmake 2.6.3, CGAL_FIND_COMPONENTS is cleared out when find_package returns. -# But we need it within UseCGAL.cmake, so we save it aside into another variable +# But we need it within CGAL_CreateSingleSourceCGALProgram.cmake, so we save it aside into another variable set( CGAL_REQUESTED_COMPONENTS ${CGAL_FIND_COMPONENTS} ) # for preconfigured libs diff --git a/Installation/cmake/modules/CGALConfig_install.cmake.in b/Installation/cmake/modules/CGALConfig_install.cmake.in index 9ee7c0ba8803..eac955bb91c0 100644 --- a/Installation/cmake/modules/CGALConfig_install.cmake.in +++ b/Installation/cmake/modules/CGALConfig_install.cmake.in @@ -54,7 +54,6 @@ set(CGAL_ImageIO_USE_ZLIB "@CGAL_ImageIO_USE_ZLIB@" ) set(CGAL_VERSION "${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}.${CGAL_BUGFIX_VERSION}") -set(CGAL_USE_FILE "${CGAL_MODULES_DIR}/UseCGAL.cmake" ) set(CGAL_GRAPHICSVIEW_PACKAGE_DIR "${CGAL_INSTALL_PREFIX}" CACHE INTERNAL "Directory containing the GraphicsView package") if ( CGAL_FIND_REQUIRED ) @@ -153,7 +152,7 @@ foreach( CGAL_COMPONENT ${CGAL_FIND_COMPONENTS} ) endforeach() # Starting with cmake 2.6.3, CGAL_FIND_COMPONENTS is cleared out when find_package returns. -# But we need it within UseCGAL.cmake, so we save it aside into another variable +# But we need it within CGAL_CreateSingleSourceCGALProgram.cmake, so we save it aside into another variable set( CGAL_REQUESTED_COMPONENTS ${CGAL_FIND_COMPONENTS} ) # for preconfigured libs diff --git a/Installation/cmake/modules/CGAL_Macros.cmake b/Installation/cmake/modules/CGAL_Macros.cmake index 2cc35fdc572e..3636673f55eb 100644 --- a/Installation/cmake/modules/CGAL_Macros.cmake +++ b/Installation/cmake/modules/CGAL_Macros.cmake @@ -211,127 +211,6 @@ if( NOT CGAL_MACROS_FILE_INCLUDED ) endmacro() - macro( use_lib ) - - set (lib "${ARGV0}") - - set (vlib ${CGAL_EXT_LIB_${lib}_PREFIX} ) - - if ( ${vlib}_FOUND AND (NOT TARGET CGAL OR WITH_${lib})) - - if ( NOT ${vlib}_SETUP ) # avoid double usage - - if ( "${ARGC}" EQUAL "2" ) - - set (usefile "${ARGV1}") - - include( ${usefile} ) - message (STATUS "Configured ${lib} from UseLIB-file: ${usefile}") - - # UseLIB-file has to set ${vlib}_SETUP to TRUE - # TODO EBEB what about Qt6, zlib? - - else() - - ####message( STATUS "${lib} include: ${${vlib}_INCLUDE_DIR}" ) - include_directories ( SYSTEM ${${vlib}_INCLUDE_DIR} ) - - # TODO EBEB remove definitions? - ####message( STATUS "${lib} definitions: ${${vlib}_DEFINITIONS}" ) - add_definitions( ${${vlib}_DEFINITIONS} "-DCGAL_USE_${vlib}" ) - - if ( ${vlib}_LIBRARIES ) - ####message( STATUS "${lib} libraries: ${${vlib}_LIBRARIES}" ) - link_libraries( ${${vlib}_LIBRARIES} ) - endif() - - ####message (STATUS "Configured ${lib} in standard way") - - set( ${vlib}_SETUP TRUE ) - - endif() - - endif() - - if (NOT ${vlib}_SETUP ) - - message( WARNING "${vlib} has not been set up" ) - - endif() - - else() - - if ( WITH_${lib} ) - message( SEND_ERROR "Try to use ${lib} that is not found") - endif() - - endif() - - endmacro() - - - macro( use_component component) - - message (STATUS "Requested component: ${component}") - - if(WITH_CGAL_${component}) - if(TARGET CGAL::CGAL_${component}) - add_to_list( CGAL_LIBRARIES CGAL::CGAL_${component} ) - elseif(TARGET CGAL_${component}) - add_to_list( CGAL_LIBRARIES CGAL_${component} ) - else() - add_to_list( CGAL_LIBRARIES ${CGAL_${component}_LIBRARY} ) - endif() - add_to_list( CGAL_3RD_PARTY_LIBRARIES ${CGAL_${component}_3RD_PARTY_LIBRARIES} ) - - add_to_list( CGAL_3RD_PARTY_INCLUDE_DIRS ${CGAL_${component}_3RD_PARTY_INCLUDE_DIRS} ) - add_to_list( CGAL_3RD_PARTY_DEFINITIONS ${CGAL_${component}_3RD_PARTY_DEFINITIONS} ) - add_to_list( CGAL_3RD_PARTY_LIBRARIES_DIRS ${CGAL_${component}_3RD_PARTY_LIBRARIES_DIRS} ) - - # To deal with imported targets of Qt6 and Boost, when CGAL - # targets are themselves imported by another project. - - if (${component} STREQUAL "Qt6") - find_package(Qt6 COMPONENTS Widgets OpenGLWidgets Gui Core Script ScriptTools QUIET) - endif() - - else(WITH_CGAL_${component}) - - # now we are talking about 3rd party libs - list( FIND CGAL_CONFIGURED_LIBRARIES "CGAL_${component}" POSITION ) - if ( "${POSITION}" EQUAL "-1" ) # if component is not a CGAL_ - - if (NOT DEFINED CGAL_EXT_LIB_${component}_PREFIX) - set(CGAL_EXT_LIB_${component}_PREFIX ${component}) - endif() - - set( vlib "${CGAL_EXT_LIB_${component}_PREFIX}" ) - - if (${vlib}_FOUND) - - use_lib( ${component} ${${vlib}_USE_FILE}) - - else() - - ####message( STATUS "External library ${vlib} after find") - if (${vlib}_FOUND) - ####message( STATUS "External library ${vlib} about to be used") - use_lib( ${component} ${${vlib}_USE_FILE}) - endif() - - endif() - else() - - if (NOT WITH_CGAL_${component}) - message(STATUS "NOTICE: The CGAL_${component} library seems to be required but is not build. Thus, it is expected that some executables will not be compiled.") - endif() - - endif() - - endif(WITH_CGAL_${component}) - - endmacro() - function( cgal_setup_module_path ) # Avoid to modify the modules path twice if(NOT CGAL_MODULE_PATH_IS_SET) diff --git a/Installation/cmake/modules/UseCGAL.cmake b/Installation/cmake/modules/UseCGAL.cmake deleted file mode 100644 index 43449b85e512..000000000000 --- a/Installation/cmake/modules/UseCGAL.cmake +++ /dev/null @@ -1,51 +0,0 @@ -# -# UseCGAL.cmake can be included in a project to set the needed compiler and linker -# settings to use CGAL in a program. -# -# The variables used here are defined in the CGALConfig.cmake generated when CGAL was installed. -# -# -include(${CGAL_MODULES_DIR}/CGAL_Macros.cmake) - -cgal_setup_module_path() - -if(NOT USE_CGAL_FILE_INCLUDED) - set(USE_CGAL_FILE_INCLUDED 1) - - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_Common.cmake) - if( CGAL_DEV_MODE OR RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE ) - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_SetupFlags.cmake) - else() - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_display_flags.cmake) - endif() - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_GeneratorSpecificSettings.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/CGAL_TweakFindBoost.cmake) - - set( CGAL_LIBRARIES ) - - foreach ( component ${CGAL_REQUESTED_COMPONENTS} ) - use_component( ${component} ) - endforeach() - - include_directories( "${CMAKE_CURRENT_BINARY_DIR}" ) - - if(TARGET CGAL::CGAL) - add_to_list( CGAL_LIBRARIES CGAL::CGAL ) - elseif(TARGET CGAL) - add_to_list( CGAL_LIBRARIES CGAL ) - else() - add_to_list( CGAL_LIBRARIES ${CGAL_LIBRARY} ) - endif() - - #message (STATUS "LIB: ${CGAL_LIBRARY}") - #message (STATUS "LIBS: ${CGAL_LIBRARIES}") - - include_directories ( ${CGAL_INCLUDE_DIRS}) - include_directories ( SYSTEM ${CGAL_3RD_PARTY_INCLUDE_DIRS} ) - add_definitions ( ${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_DEFINITIONS} ) - - if(NOT CGAL_NO_BLANKET_LINKING) - link_directories ( ${CGAL_3RD_PARTY_LIBRARIES_DIRS} ) - link_libraries ( ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ) - endif() -endif() diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index abd23a6e7fe0..7b3f2c419cb4 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -2,7 +2,7 @@ # This file is the CGALConfig.cmake for a header-only CGAL installation # -# For UseCGAL.cmake +# For CGAL_CreateSingleSourceCGALProgram.cmake set( CGAL_REQUESTED_COMPONENTS ${CGAL_FIND_COMPONENTS} ) set(CGAL_LIBRARIES CGAL) @@ -113,8 +113,6 @@ include(${CGAL_MODULES_DIR}/CGAL_Common.cmake) include(${CGAL_MODULES_DIR}/CGAL_TweakFindBoost.cmake) include(${CGAL_MODULES_DIR}/CGAL_enable_end_of_configuration_hook.cmake) -set(CGAL_USE_FILE ${CGAL_MODULES_DIR}/UseCGAL.cmake) - include(${CGAL_CONFIG_DIR}/CGALConfigVersion.cmake) # Temporary? Change the CMAKE module path diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index c057119bbd3c..5a22a7c42333 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -32,8 +32,6 @@ endmacro() find_package(CGAL REQUIRED COMPONENTS Core) -include(${CGAL_USE_FILE}) - include(CGAL_CreateSingleSourceCGALProgram) create_single_source_cgal_program("endian.cpp") diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt index c63decf81000..cfa7f45bb92c 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_2/CMakeLists.txt @@ -26,12 +26,12 @@ link_directories(${OPENMESH_LIBRARY_DIR}) # Polyhedron add_executable(polyhedron_performance performance_2.h polyhedron_performance.h polyhedron_performance.cpp) -target_link_libraries(polyhedron_performance ${CGAL_LIBRARIES}) +target_link_libraries(polyhedron_performance CGAL::CGAL) # LCC_2 add_executable(lcc_performance_2 performance_2.h lcc_performance_2.h lcc_performance_2.cpp) -target_link_libraries(lcc_performance_2 ${CGAL_LIBRARIES}) +target_link_libraries(lcc_performance_2 CGAL::CGAL) # Surface_mesh add_executable( @@ -80,7 +80,7 @@ add_executable( target_link_libraries( performance_2 - ${CGAL_LIBRARIES} + CGAL::CGAL surface_mesh algo assimp diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake b/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake deleted file mode 100644 index a4b0902e60d4..000000000000 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_2/cmake/FindCGAL.cmake +++ /dev/null @@ -1,93 +0,0 @@ -# -# The following module is based on FindVTK.cmake -# - -# - Find a CGAL installation or binary tree. -# The following variables are set if CGAL is found. If CGAL is not -# found, CGAL_FOUND is set to false. -# -# CGAL_FOUND - Set to true when CGAL is found. -# CGAL_USE_FILE - CMake file to use CGAL. -# - -# Construct consistent error messages for use below. -set(CGAL_DIR_DESCRIPTION "directory containing CGALConfig.cmake. This is either the binary directory where CGAL was configured or PREFIX/lib/CGAL for an installation.") -set(CGAL_DIR_MESSAGE "CGAL not found. Set the CGAL_DIR cmake variable or environment variable to the ${CGAL_DIR_DESCRIPTION}") - -if ( NOT CGAL_DIR ) - - # Get the system search path as a list. - if(UNIX) - string(REGEX MATCHALL "[^:]+" CGAL_DIR_SEARCH1 "$ENV{PATH}") - else() - string(REGEX REPLACE "\\\\" "/" CGAL_DIR_SEARCH1 "$ENV{PATH}") - endif() - - string(REGEX REPLACE "/;" ";" CGAL_DIR_SEARCH2 "${CGAL_DIR_SEARCH1}") - - # Construct a set of paths relative to the system search path. - set(CGAL_DIR_SEARCH "") - - foreach(dir ${CGAL_DIR_SEARCH2}) - - set(CGAL_DIR_SEARCH ${CGAL_DIR_SEARCH} ${dir}/../lib/CGAL ) - - endforeach() - - - # - # Look for an installation or build tree. - # - find_path(CGAL_DIR CGALConfig.cmake - - # Look for an environment variable CGAL_DIR. - $ENV{CGAL_DIR} - - # Look in places relative to the system executable search path. - ${CGAL_DIR_SEARCH} - - # Look in standard UNIX install locations. - /usr/local/lib/CGAL - /usr/lib/CGAL - - # Read from the CMakeSetup registry entries. It is likely that - # CGAL will have been recently built. - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild1] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild2] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild3] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild4] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild5] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild6] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild7] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild8] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild9] - [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild10] - - # Help the user find it if we cannot. - DOC "The ${CGAL_DIR_DESCRIPTION}" - ) - -endif() - -if ( CGAL_DIR ) - - if ( EXISTS "${CGAL_DIR}/CGALConfig.cmake" ) - include( "${CGAL_DIR}/CGALConfig.cmake" ) - set( CGAL_FOUND TRUE ) - endif() - -endif() - -if( NOT CGAL_FOUND) - if(CGAL_FIND_REQUIRED) - MESSAGE(FATAL_ERROR ${CGAL_DIR_MESSAGE}) - else() - if(NOT CGAL_FIND_QUIETLY) - MESSAGE(STATUS ${CGAL_DIR_MESSAGE}) - endif() - endif() -endif() - -if(CGAL_FOUND) - message(STATUS "Found CGAL.") -endif() diff --git a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt index 4b65e2ee3c5e..5502fe39111c 100644 --- a/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt +++ b/Linear_cell_complex/benchmark/Linear_cell_complex_3/CMakeLists.txt @@ -33,7 +33,7 @@ target_link_libraries( OpenVolumeMesh boost_timer boost_system - ${CGAL_LIBRARIES} + CGAL::CGAL algo assimp container @@ -65,7 +65,7 @@ target_link_libraries( # LCC_3 add_executable(lcc_performance_3 performance_3.h lcc_performance_3.h lcc_performance_3.cpp) -target_link_libraries(lcc_performance_3 ${CGAL_LIBRARIES} +target_link_libraries(lcc_performance_3 CGAL::CGAL ${MAP_VIEWER_LIBRARIES}) # OpenVolumeMesh diff --git a/Mesh_2/demo/Mesh_2/CMakeLists.txt b/Mesh_2/demo/Mesh_2/CMakeLists.txt index 5087c477a12d..74c8b7f2d86a 100644 --- a/Mesh_2/demo/Mesh_2/CMakeLists.txt +++ b/Mesh_2/demo/Mesh_2/CMakeLists.txt @@ -6,16 +6,14 @@ project(Mesh_2_Demo) find_package(CGAL REQUIRED) -include(${CGAL_USE_FILE}) - # conform target add_executable(conform conform.cpp) -target_link_libraries(conform ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES}) +target_link_libraries(conform CGAL::CGAL) add_to_cached_list(CGAL_EXECUTABLE_TARGETS conform) # mesh target add_executable(mesh mesh.cpp) -target_link_libraries(mesh ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES}) +target_link_libraries(mesh CGAL::CGAL) add_to_cached_list(CGAL_EXECUTABLE_TARGETS mesh) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 0b59088e04a2..16e7bcd755de 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -124,8 +124,7 @@ if(TARGET CGAL::CGAL_ImageIO) add_executable(mesh_3D_gray_vtk_image mesh_3D_gray_vtk_image.cpp) target_link_libraries( mesh_3D_gray_vtk_image - PUBLIC CGAL::Eigen3_support CGAL::CGAL CGAL::CGAL_ImageIO - ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ${VTK_LIBRARIES}) + PUBLIC CGAL::Eigen3_support CGAL::CGAL CGAL::CGAL_ImageIO ${VTK_LIBRARIES}) cgal_add_test(mesh_3D_gray_vtk_image) add_to_cached_list(CGAL_EXECUTABLE_TARGETS mesh_3D_gray_vtk_image) endif() diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index 3b838ba2c829..ee592422710c 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -9,7 +9,6 @@ include_directories(${CMAKE_BINARY_DIR}) set(CMAKE_AUTOMOC ON) find_package(CGAL REQUIRED COMPONENTS Core Qt6) -include(${CGAL_USE_FILE}) find_package(LEDA QUIET) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index afcfd708dc06..28bf9132603b 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -38,7 +38,6 @@ option(POLYHEDRON_QTSCRIPT_DEBUGGER # Find CGAL find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt6 ImageIO) set_package_properties(CGAL PROPERTIES TYPE REQUIRED) -include(${CGAL_USE_FILE}) # Find Qt6 itself find_package(Qt6 QUIET @@ -120,8 +119,6 @@ set_package_properties( PURPOSE "Plugins such as Mesh_3, Bilateral smoothing, and WLOP are faster if TBB is linked.") if(CGAL_Qt6_FOUND AND Qt6_FOUND) - include(${CGAL_USE_FILE}) - qt6_wrap_ui(MainWindowUI_files MainWindow.ui) qt6_wrap_ui(SubViewerUI_files SubViewer.ui) qt6_wrap_ui(statisticsUI_FILES Statistics_on_item_dialog.ui) @@ -209,7 +206,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_library(scene_basic_objects SHARED Scene_plane_item.cpp Scene_spheres_item.cpp) target_link_libraries( - scene_basic_objects PUBLIC demo_framework ${CGAL_LIBRARIES} Qt6::OpenGLWidgets + scene_basic_objects PUBLIC demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::Gui Qt6::Widgets) add_library(scene_color_ramp SHARED Color_ramp.cpp) target_link_libraries(scene_color_ramp PRIVATE Qt6::Core) @@ -225,7 +222,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) macro(add_item item_name) add_library(${item_name} SHARED ${ARGN}) target_link_libraries( - ${item_name} PUBLIC demo_framework ${CGAL_LIBRARIES} Qt6::OpenGLWidgets Qt6::Gui + ${item_name} PUBLIC demo_framework CGAL::CGAL_Qt6 Qt6::OpenGLWidgets Qt6::Gui Qt6::Widgets) add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${item_name}) endmacro(add_item) @@ -376,8 +373,7 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) target_link_libraries(Polyhedron_3 PRIVATE demo_framework) # Link with CGAL - target_link_libraries(Polyhedron_3 PUBLIC ${CGAL_LIBRARIES} - ${CGAL_3RD_PARTY_LIBRARIES}) + target_link_libraries(Polyhedron_3 PUBLIC CGAL::CGAL_Qt6) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Polyhedron_3) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt index e1b75611bac6..0af285ce58fb 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh/CMakeLists.txt @@ -7,8 +7,6 @@ if(NOT CGAL_DISABLE_GMP) if(TARGET CGAL::Eigen3_support) find_package(CGAL REQUIRED COMPONENTS Core) - include(${CGAL_USE_FILE}) - qt6_wrap_ui(parameterizationUI_FILES Parameterization_widget.ui OTE_dialog.ui) polyhedron_demo_plugin(parameterization_plugin Parameterization_plugin ${parameterizationUI_FILES}) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt index 9761cea5fd5f..23f8d5f89994 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Three_examples/CMakeLists.txt @@ -17,9 +17,6 @@ find_package(Qt6 QUIET OPTIONAL_COMPONENTS WebSockets) if(RUNNING_CGAL_AUTO_TEST OR CGAL_TEST_SUITE) - if(Qt6_FOUND) - include(${CGAL_USE_FILE}) - endif() polyhedron_demo_plugin(example_plugin Example_plugin) qt6_wrap_ui(basicUI_FILES Basic_dialog.ui) diff --git a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake index f4129a57c9fc..6bdda967ab8b 100644 --- a/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake +++ b/Polyhedron/demo/Polyhedron/polyhedron_demo_macros.cmake @@ -60,7 +60,7 @@ include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) set_property(TEST "compilation of ${plugin_name}" APPEND PROPERTY FIXTURES_REQUIRED demo_framework_SetupFixture) endif() # Link with CGAL - target_link_libraries( ${plugin_name} PUBLIC ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ) + target_link_libraries( ${plugin_name} PUBLIC CGAL::CGAL ) if(TARGET Polyhedron_3) add_dependencies( ${plugin_name} Polyhedron_3 ) endif() diff --git a/Surface_mesh/benchmark/CMakeLists.txt b/Surface_mesh/benchmark/CMakeLists.txt index 33ae6c845694..818e8cb6b9d3 100644 --- a/Surface_mesh/benchmark/CMakeLists.txt +++ b/Surface_mesh/benchmark/CMakeLists.txt @@ -12,12 +12,12 @@ add_definitions("-std=c++1y") # Polyhedron add_executable(polyhedron_performance performance_2.h polyhedron_performance.h polyhedron_performance.cpp) -target_link_libraries(polyhedron_performance PRIVATE ${CGAL_LIBRARIES}) +target_link_libraries(polyhedron_performance PRIVATE CGAL::CGAL) # LCC_2 add_executable(lcc_performance_2 performance_2.h lcc_performance_2.h lcc_performance_2.cpp) -target_link_libraries(lcc_performance_2 PRIVATE ${CGAL_LIBRARIES}) +target_link_libraries(lcc_performance_2 PRIVATE CGAL::CGAL) # Surface_mesh add_executable( @@ -29,7 +29,7 @@ add_executable( performance_2 performance_2.cpp performance_2.h polyhedron_performance.h surface_mesh_performance.h lcc_performance_2.h) -target_link_libraries(performance_2 PRIVATE ${CGAL_LIBRARIES}) +target_link_libraries(performance_2 PRIVATE CGAL::CGAL) create_single_source_cgal_program("sm_sms.cpp") create_single_source_cgal_program("poly_sms.cpp") diff --git a/Three/doc/Three/Three.txt b/Three/doc/Three/Three.txt index 593d7623b2f3..2afe5f4d27ca 100644 --- a/Three/doc/Three/Three.txt +++ b/Three/doc/Three/Three.txt @@ -332,7 +332,6 @@ Configure CMake as you desire and fetch the right Qt6 packages : #Find CGAL find_package(CGAL COMPONENTS Qt6) - include( ${CGAL_USE_FILE} ) # Find Qt6 itself find_package(Qt6 QUIET @@ -371,7 +370,6 @@ Notice that an external plugin will not be automatically loaded in the Polyhedro #Find CGAL find_package(CGAL COMPONENTS Qt6) - include( ${CGAL_USE_FILE} ) # Find Qt6 itself find_package(Qt6 QUIET COMPONENTS OpenGLWidgets Svg From 40a7f324d3487876bf647737101835717b4a5407 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Fri, 15 Sep 2023 11:27:43 +0200 Subject: [PATCH 0736/1398] fix a compilation error The generated `ui_Deform_mesh.h` was not is in the right directory. I have moved the definition of the item in the plugin directory. --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 7 ------- .../Plugins/Surface_mesh_deformation/CMakeLists.txt | 8 ++++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index 28bf9132603b..d2d45f83c7b4 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -295,13 +295,6 @@ if(CGAL_Qt6_FOUND AND Qt6_FOUND) add_item(scene_textured_item Scene_textured_surface_mesh_item.cpp texture.cpp) target_link_libraries(scene_textured_item PUBLIC CGAL::Eigen3_support) - qt6_wrap_ui(editionUI_FILES Plugins/Surface_mesh_deformation/Deform_mesh.ui) - add_item(scene_edit_item - Plugins/Surface_mesh_deformation/Scene_edit_polyhedron_item.cpp - ${editionUI_FILES}) - target_link_libraries( - scene_edit_item PUBLIC CGAL::Eigen3_support scene_surface_mesh_item - scene_k_ring_selection scene_basic_objects) add_item(scene_mcf_item Plugins/PMP/Scene_mcf_item.cpp) target_link_libraries(scene_mcf_item PUBLIC CGAL::Eigen3_support) endif() diff --git a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/CMakeLists.txt index ce9c7e682094..36cbea480cd9 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/Surface_mesh_deformation/CMakeLists.txt @@ -2,6 +2,14 @@ include(polyhedron_demo_macros) if(TARGET CGAL::Eigen3_support AND "${EIGEN3_VERSION}" VERSION_GREATER "3.1.90") + qt6_wrap_ui(editionUI_FILES Deform_mesh.ui) + add_item(scene_edit_item + Scene_edit_polyhedron_item.cpp + ${editionUI_FILES}) + target_link_libraries( + scene_edit_item PUBLIC CGAL::Eigen3_support scene_surface_mesh_item + scene_k_ring_selection scene_basic_objects) + polyhedron_demo_plugin(edit_plugin Edit_polyhedron_plugin Deform_mesh.ui) target_link_libraries(edit_plugin PUBLIC scene_surface_mesh_item scene_edit_item scene_selection_item) From 11c8b17f884f6fee9417923b4d770e7d97e41fe8 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 17 Sep 2023 14:25:23 +0100 Subject: [PATCH 0737/1398] Box_intersection_d: Fix doc link --- .../Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h | 4 ++-- .../doc/Box_intersection_d/PackageDescription.txt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h index a3731b377d46..b981a093d7f2 100644 --- a/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h +++ b/Box_intersection_d/doc/Box_intersection_d/CGAL/Box_intersection_d/Box_traits_d.h @@ -47,12 +47,12 @@ Box_traits_d(); /*! -\ingroup PkgBoxIntersectionDFunctions +\ingroup PkgBoxIntersectionDEnums */ enum Setting { COMPLETE, BIPARTITE }; /*! -\ingroup PkgBoxIntersectionDFunctions +\ingroup PkgBoxIntersectionDEnums */ enum Topology { HALF_OPEN, CLOSED }; diff --git a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt index 0574d49cc386..724fabe7234f 100644 --- a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt +++ b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt @@ -2,6 +2,9 @@ /// \defgroup PkgBoxIntersectionDConcepts Concepts /// \ingroup PkgBoxIntersectionDRef +/// \defgroup PkgBoxIntersectionDEnums Rnumerations +/// \ingroup PkgBoxIntersectionDRef + /// \defgroup PkgBoxIntersectionDClasses Classes /// \ingroup PkgBoxIntersectionDRef @@ -56,4 +59,3 @@ - `CGAL::box_self_intersection_all_pairs_d` */ - From 7500e801c7480b5cc7ac3873cef62dd5546bbb03 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 18 Sep 2023 09:17:15 +0100 Subject: [PATCH 0738/1398] Fix typo --- .../doc/Box_intersection_d/PackageDescription.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt index 724fabe7234f..9844c8f94824 100644 --- a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt +++ b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt @@ -2,7 +2,7 @@ /// \defgroup PkgBoxIntersectionDConcepts Concepts /// \ingroup PkgBoxIntersectionDRef -/// \defgroup PkgBoxIntersectionDEnums Rnumerations +/// \defgroup PkgBoxIntersectionDEnums Enumerations /// \ingroup PkgBoxIntersectionDRef /// \defgroup PkgBoxIntersectionDClasses Classes From c140a5df31f69d837c5d37fad66fb42d673698e7 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 18 Sep 2023 11:15:07 +0100 Subject: [PATCH 0739/1398] Add \cgalCRPSection{Enumerations} --- .../doc/Box_intersection_d/PackageDescription.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt index 9844c8f94824..2e3b3607b687 100644 --- a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt +++ b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt @@ -42,6 +42,11 @@ \cgalClassifedRefPages +\cgalCRPSection{Enumerations} +- `CGAL::Box_intersection_d::Setting` +- `CGAL::Box_intersection_d::Topology` + + \cgalCRPSection{Concepts} - `BoxIntersectionBox_d` - `BoxIntersectionTraits_d` From 71cd38ecb5fe12330791ba40ad71eb4eac1f27b7 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Tue, 19 Sep 2023 12:20:06 +0300 Subject: [PATCH 0740/1398] Several fixes mainly related to output iterators --- .../Arrangement_on_surface_2.txt | 2 +- .../CGAL/Arr_algebraic_segment_traits_2.h | 402 ++++++++---------- .../CGAL/Arr_batched_point_location.h | 64 +-- .../CGAL/Arr_conic_traits_2.h | 29 +- .../CGAL/Arr_point_location_result.h | 35 +- .../CGAL/Arr_polycurve_traits_2.h | 19 +- .../CGAL/Arr_vertical_decomposition_2.h | 80 ++-- .../CGAL/Arrangement_2.h | 33 -- .../CGAL/Arrangement_on_surface_2.h | 49 ++- .../CGAL/CORE_algebraic_number_traits.h | 180 ++++---- .../Concepts/ArrTraits--Intersect_2.h | 35 +- .../Concepts/ArrTraits--MakeXMonotone_2.h | 20 +- .../batched_point_location.cpp | 2 +- 13 files changed, 467 insertions(+), 483 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index f7dfaa98b520..4299322e38cd 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -5663,7 +5663,7 @@ to define any instance of the class template the `Topology_traits` type is selected based on the provided geometry traits `Geometry_traits_2`, or more precisely, on the boundary conditions defined by the geometry traits. If all sides of the -boundary of the parameter space are cosed, the instance +boundary of the parameter space are closed, the instance `Arr_bounded_planar_topology_traits_2` is selected; otherwise the instance `Arr_unb_planar_topology_traits_2` is diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h index 069d91859ee7..5007dce85f53 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_algebraic_segment_traits_2.h @@ -26,45 +26,37 @@ one of the integral types above. */ -template< typename Coefficient > +template class Arr_algebraic_segment_traits_2 { public: /// \name Types /// @{ -/*! -Value to specify whether a point should be in the interior -of a segment, or its minimal point, -or its maximal point in lexicographic order. -*/ +/*! Value to specify whether a point should be in the interior of a segment, or + * its minimal point, or its maximal point in lexicographic order. + */ enum Site_of_point { POINT_IN_INTERIOR = 0, MIN_ENDPOINT = -1, MAX_ENDPOINT = 1 }; -/*! -the type for bivariate polynomials, -with innermost coefficient type `Coefficient`. -Constitutes a model of the concept `Polynomial_d` -with two variables. - -\sa `CGAL::Polynomial_d` -*/ +/*! the type for bivariate polynomials, with innermost coefficient type + * `Coefficient`. Constitutes a model of the concept `Polynomial_d` with two + * variables. + * + * \sa `CGAL::Polynomial_d` + */ typedef unspecified_type Polynomial_2; -/*! -model for the concept -`AlgebraicKernel_1` -*/ +/*! model for the concept `AlgebraicKernel_1` + */ typedef unspecified_type Algebraic_kernel_1; -/*! -represents coordinates of points. -Typedef from `Algebraic_kernel_1::Algebraic_real_1` -*/ +/*! represents coordinates of points. + * Typedef from `Algebraic_kernel_1::Algebraic_real_1` + */ typedef unspecified_type Algebraic_real_1; -/*! -Typedef from `Algebraic_kernel_1::Bound` -*/ +/*! Typedef from `Algebraic_kernel_1::Bound` + */ typedef unspecified_type Bound; /// @} @@ -74,46 +66,41 @@ typedef unspecified_type Bound; /*! -*/ + */ Construct_curve_2 construct_curve_2_object() const; /*! -*/ + */ Construct_point_2 construct_point_2_object() const; /*! -*/ + */ Construct_x_monotone_segment_2 construct_x_monotone_segment_2_object() const; /// @} /*! - -*/ + */ class Construct_curve_2 { public: /// \name Object Creation Functors /// @{ -/*! -Returns a `Curve_2` object that represents the curve defined by -the polynomial `p` -*/ +/*! Returns a `Curve_2` object that represents the curve defined by the + * polynomial `p` + */ Curve_2 operator() (Polynomial_2 p); -/*! -Returns a `Curve_2` object specified by `s`. -The passed string represents the defining polynomial of the curve -and must be given in a MAPLE-readable format using "x" as first -and "y" as second variable, e.g., -"(x^3*y-2*x)*(-6*x-y^3*x^6)" -for integer coefficients, and "3/2*x*y^4-5/7*x^2+3/1" -for rational coefficients. -*/ +/*! Returns a `Curve_2` object specified by `s`. The passed string represents + * the defining polynomial of the curve and must be given in a MAPLE-readable + * format using "x" as first and "y" as second variable, e.g., + * \f$(x^3*y-2*x)*(-6*x-y^3*x^6)\f$ for integer coefficients, and + * \f$3/2*x*y^4-5/7*x^2+3/1\f$ for rational coefficients. + */ Curve_2 operator() (std::string s); /// @} @@ -122,49 +109,42 @@ Curve_2 operator() (std::string s); /*! - -*/ + */ class Construct_point_2 { public: /// \name Object Creation Functors /// @{ -/*! -Returns a `Point_2` object that represents the `arcno`-th -point in the fiber of `cv` at \f$ x\f$-coordinate `x`, -counted from the bottom, starting with zero. -\pre (`cv` must not have a vertical line at `x`, -and \f$ 0\leq arcno < c\f$, where \f$ c\f$ is the number of points -in the fiber of `cv` at `x`.) -*/ +/*! Returns a `Point_2` object that represents the `arcno`-th + * point in the fiber of `cv` at \f$ x\f$-coordinate `x`, + * counted from the bottom, starting with zero. + * \pre (`cv` must not have a vertical line at `x`, + * and \f$ 0\leq arcno < c\f$, where \f$ c\f$ is the number of points + * in the fiber of `cv` at `x`.) + */ Point_2 operator() (Algebraic_real_1 x, Curve_2 cv, int arcno); -/*! -Returns a `Point_2` object that represents the -point on `xcv` at \f$ x\f$-coordinate `x` -\pre (`x` is in the \f$ x\f$-range of `xcv`.) -*/ +/*! Returns a `Point_2` object that represents the + * point on `xcv` at \f$ x\f$-coordinate `x` + * \pre (`x` is in the \f$ x\f$-range of `xcv`.) + */ Point_2 operator() (Algebraic_real_1 x, X_monotone_curve_2 xcv); -/*! -Returns a `Point_2` object that represents (x,y) -*/ +/*! Returns a `Point_2` object that represents (x,y) + */ Point_2 operator() (Algebraic_real_1 x, Algebraic_real_1 y); -/*! -Returns a `Point_2` object that represents (x,y) -*/ +/*! Returns a `Point_2` object that represents (x,y) + */ Point_2 operator() (Coefficient x, Coefficient y); -/*! -Returns a `Point_2` object that represents (x,y) -*/ +/*! Returns a `Point_2` object that represents (x,y) + */ Point_2 operator() (Bound x, Bound y); -/*! -Returns a `Point_2` object that represents (x,y) -*/ +/*! Returns a `Point_2` object that represents (x,y) + */ Point_2 operator() (int x, int y); /// @} @@ -173,91 +153,86 @@ Point_2 operator() (int x, int y); /*! - -*/ + */ class Construct_x_monotone_segment_2 { public: /// \name Object Creation Functors /// @{ -/*! -Writes a sequence of `X_monotone_curve_2` objects (terminal -segments) into `out`. These terminal segments compose an -\f$ x\f$-monotone (or vertical) segment of the curve `cv` that -starts in `end_min`, and ends in `end_max`. -\pre (`end_min` must have a unique \f$ x\f$-monotone segment -to its right, or `end_max` must have a unique -\f$ x\f$-monotone segment to its left. Furthermore, -`end_min` and `end_max` must be connected -by an \f$ x\f$-monotone segment of `cv`) -*/ -template OutputIterator -operator() (Curve_2 cv, Point_2 end_min, Point_2 end_max, -OutputIterator out); - -/*! -Writes a sequence of `X_monotone_curve_2` objects into `out`. -These segments form an \f$ x\f$-monotone (or vertical) -segment of the curve `cv`. - -If `site_of_p==POINT_IN_INTERIOR`, the maximal segment is -returned that contains `p` in its interior. - -returned that contains `p` as its left endpoint. - -returned that contains `p` as its left endpoint. -\pre (If `site_of_p==POINT_IN_INTERIOR`, `p` -must be an interior point of an \f$ x\f$-monotone or a vertical -segment. -must either have a unique \f$ x\f$-monotone segment to the right, -or a vertical segment from `p` upwards. -must either have a unique \f$ x\f$-monotone segment to the left, -or a vertical segment from `p` downwards.) -*/ -template OutputIterator -operator() (Curve_2 cv, Point_2 p, -Site_of_point site_of_p, -OutputIterator out); - -/*! -Writes a sequence of `X_monotone_curve_2` objects into `out`. -These segments form a straight-line segment connecting -the points `p` and `q`. If `p` and `q` share the -same \f$ x\f$-coordinate, the constructed vertical segment consists of -only one `X_monotone_curve_2` object and can be computed -efficiently. In the non-vertical case, -the construction is only possible if `p` and `q` -have both rational x- and y-coordinates. -\pre (`p` must not be equal to `q`.) - -*/ -template OutputIterator -operator() (Point_2 p, Point_2 q, -OutputIterator out); +/*! inserts a sequence of `X_monotone_curve_2` objects (terminal segments) into + * an output container given through an output iterator. These terminal segments + * compose an \f$x\f$-monotone (or vertical) segment of a given curve that + * starts in `end_min`, and ends in `end_max`. + * + * \param cv The input curve. + * \param end_min The starting point. + * \param end_max The ending point. + * \param oi The output iterator that points at the output container. + * \return The past-the-end iterator of the output container. + * + * \pre `end_min` must have a unique \f$x\f$-monotone segment to its right, or + * `end_max` must have a unique \f$x\f$-monotone segment to its left. + * Furthermore, `end_min` and `end_max` must be connected by an + * \f$x\f$-monotone segment of `cv`) + */ +template +OutputIterator operator() (Curve_2 cv, Point_2 end_min, Point_2 end_max, + OutputIterator oi); + +/*! inserts a sequence of `X_monotone_curve_2` objects into an output container + * given through an output iterator. These segments form an \f$x\f$-monotone + * (or vertical) segment of the curve `cv`. + * + * If `site_of_p==POINT_IN_INTERIOR`, the maximal segment is + * returned that contains `p` in its interior. + * + * returned that contains `p` as its left endpoint. + * + * returned that contains `p` as its left endpoint. + * + * \pre (If `site_of_p==POINT_IN_INTERIOR`, `p` + * must be an interior point of an \f$x\f$-monotone or a vertical + * segment. + * must either have a unique \f$x\f$-monotone segment to the right, + * or a vertical segment from `p` upwards. + * must either have a unique \f$x\f$-monotone segment to the left, + * or a vertical segment from `p` downwards.) + */ +template +OutputIterator operator() (Curve_2 cv, Point_2 p, Site_of_point site_of_p, + OutputIterator out); + +/*! inserts a sequence of `X_monotone_curve_2` objects into an output container + * given through an output iterator. These segments form a straight-line + * segment connecting the points `p` and `q`. If `p` and `q` share the same + * \f$x\f$-coordinate, the constructed vertical segment consists of only one + * `X_monotone_curve_2` object and can be computed efficiently. In the + * non-vertical case, the construction is only possible if `p` and `q` have both + * rational x- and y-coordinates. + * + * \pre (`p` must not be equal to `q`.) + */ +template +OutputIterator operator() (Point_2 p, Point_2 q, OutputIterator out); /// @} }; /* end Arr_algebraic_segment_traits_2::Construct_x_monotone_segment_2 */ -/*! - - -Models the `ArrangementTraits_2::Curve_2` concept. -Represents algebraic curves. Internally, the type stores -topological-geometric information about the particular curve. -In order to use internal caching, instances should only be created -using the `Construct_curve_2` functor of the traits class. - -*/ +/*! Models the `ArrangementTraits_2::Curve_2` concept. + * Represents algebraic curves. Internally, the type stores + * topological-geometric information about the particular curve. + * In order to use internal caching, instances should only be created + * using the `Construct_curve_2` functor of the traits class. + */ class Curve_2 { public: /// \name Modifiers /// @{ -/*! -returns the defining polynomial of the curve. +/*! returns the defining polynomial of the curve. */ Polynomial_2 polynomial () const; @@ -265,124 +240,105 @@ Polynomial_2 polynomial () const; }; /* end Arr_algebraic_segment_traits_2::Curve_2 */ -/*! - - -Models the `ArrangementBasicTraits_2::Point_2` concept. -Represents points in \f$ \mathbb{R}^2\f$. Intersection points of algebraic curves -are in general non-rational, so we need a data structure that is capable -of representing arbitrary points with algebraic coordinates. - -The traits class represents algebraic coordinates by the type -`Algebraic_real_1`, which is a model of the `AlgebraicReal_1` -concept. -A point \f$ p\f$ is stored by a triple \f$ (x,cv,arcno)\f$, -where \f$ x\f$ is the \f$ x\f$-coordinate of a point, \f$ cv\f$ is an instance -of `Curve_2` that contains the point, (and has no vertical line at \f$ x\f$), -and \f$ arcno\f$ is an `int`, denoting that \f$ p\f$ is met as the \f$ arcno\f$-th -point when shooting a vertical ray at \f$ x\f$, starting from \f$ -\infty\f$ -(where counting starts with \f$ 0\f$). +/*! Models the `ArrangementBasicTraits_2::Point_2` concept. + * Represents points in \f$ \mathbb{R}^2\f$. Intersection points of algebraic + * curves are in general non-rational, so we need a data structure that is + * capable of representing arbitrary points with algebraic coordinates. + * + * The traits class represents algebraic coordinates by the type + * `Algebraic_real_1`, which is a model of the `AlgebraicReal_1` concept. + * A point \f$ p\f$ is stored by a triple \f$ (x,cv,arcno)\f$, + * where \f$ x\f$ is the \f$ x\f$-coordinate of a point, \f$ cv\f$ is an instance + * of `Curve_2` that contains the point, (and has no vertical line at \f$ x\f$), + * and \f$ arcno\f$ is an `int`, denoting that \f$ p\f$ is met as the + * \f$arcno\f$-th point when shooting a vertical ray at \f$ x\f$, starting from + * \f$-\infty\f$ (where counting starts with \f$ 0\f$). + * + * In addition to the methods listed below, the copy constructor and assignment + * operator for `Point_2` objects are also supported. + * + * The functor `Construct_point_2` constructs `Point_2` instances. + */ -In addition to the methods listed below, the copy constructor and assignment -operator for `Point_2` objects are also supported. - -The functor `Construct_point_2` constructs `Point_2` instances. - -*/ class Point_2 { public: /// \name Modifiers /// @{ -/*! -returns the \f$ x\f$-coordinate of `p`. -*/ +/*! returns the \f$ x\f$-coordinate of `p`. + */ Algebraic_real_1 x () const; -/*! -returns the \f$ y\f$-coordinates of `p`. - -Attention: As described above, points are not stored -by their \f$ y\f$-coordinate in `Algebraic_real_1` representation. In fact, -this representation must be computed on demand, and might become quite -costly for points defined by high-degree polynomials. Therefore, it is -recommended to avoid to call this function as much as possible. -*/ +/*! returns the \f$ y\f$-coordinates of `p`. + * + * Attention: As described above, points are not stored + * by their \f$ y\f$-coordinate in `Algebraic_real_1` representation. In fact, + * this representation must be computed on demand, and might become quite + * costly for points defined by high-degree polynomials. Therefore, it is + * recommended to avoid to call this function as much as possible. + */ Algebraic_real_1 y () const; -/*! -returns a `Curve_2` instance that `p`is part of. -*/ +/*! returns a `Curve_2` instance that `p`is part of. + */ Curve_2 curve () const; -/*! -returns the arc number of `p`. -*/ +/*! returns the arc number of `p`. + */ int arcno () const; -/*! -returns double-approximations of the \f$ x\f$- and \f$ y\f$-coordinates. -*/ +/*! returns double-approximations of the \f$ x\f$- and \f$ y\f$-coordinates. + */ std::pair to_double () const; /// @} }; /* end Arr_algebraic_segment_traits_2::Point_2 */ -/*! - - -Models the `ArrangementBasicTraits_2::X_monotone_curve_2` concept. -Represents terminal segments of an algebraic curves, -that means vertical segments or \f$ x\f$-monotone segments with no critical -\f$ x\f$-coordinate in the interior of their \f$ x\f$-range. -Terminal segments might either be bounded or unbounded. -By definition, each interior point of -a non-vertical segment has the same arc number (see the documentation of -type `Point_2` above, which is called the arc number of the segment -(note the arc number at the endpoints might differ). -Such segments are represented internally by a 4-tuple \f$ (p,q,cv,arcno)\f$, -where \f$ p\f$ and \f$ q\f$ are the endpoints, \f$ cv\f$ is the supporting curve -that the segment belongs to, and arcno is the arc number of the segment. - -Arbitrary (weakly) \f$ x\f$-monotone segments are presented by a range -of `X_monotone_curve_2` instances, whose union equals the segment. -The functor `Construct_x_monotone_segment_2` allows their construction. -To construct all (maximal) terminal segments of a curve, -use the `Make_x_monotone_2` functor supplied by the traits class. - -*/ +/*! Models the `ArrangementBasicTraits_2::X_monotone_curve_2` concept. + * Represents terminal segments of an algebraic curves, that means vertical + * segments or \f$ x\f$-monotone segments with no critical \f$ x\f$-coordinate + * in the interior of their \f$ x\f$-range. Terminal segments might either be + * bounded or unbounded. By definition, each interior point of a non-vertical + * segment has the same arc number (see the documentation of type `Point_2` + * above, which is called the arc number of the segment (note the arc + * number at the endpoints might differ). Such segments are represented + * internally by a 4-tuple \f$ (p,q,cv,arcno)\f$, where \f$ p\f$ and \f$ q\f$ + * are the endpoints, \f$ cv\f$ is the supporting curve that the segment + * belongs to, and arcno is the arc number of the segment. + * + * Arbitrary (weakly) \f$ x\f$-monotone segments are presented by a range + * of `X_monotone_curve_2` instances, whose union equals the segment. + * The functor `Construct_x_monotone_segment_2` allows their construction. + * To construct all (maximal) terminal segments of a curve, + * use the `Make_x_monotone_2` functor supplied by the traits class. + */ class X_monotone_curve_2 { public: /// \name Modifiers /// @{ -/*! -returns the supporting algebraic curve of `s`. -*/ +/*! returns the supporting algebraic curve of `s`. + */ Curve_2 curve () const; -/*! -returns whether `s` is a vertical segment. -*/ +/*! returns whether `s` is a vertical segment. + */ bool is_vertical () const; -/*! -returns whether `s` has a finite endpoint on the left -*/ +/*! returns whether `s` has a finite endpoint on the left + */ bool is_finite (CGAL::Arr_curve_end ce) const; -/*! -\pre (The corresponding curve end is finite) -*/ +/*! \pre (The corresponding curve end is finite) + */ Point_2 curve_end (CGAL::Arr_curve_end ce) const; -/*! -returns the arc number of the segment. -\pre (The segment is non-vertical) -*/ +/*! returns the arc number of the segment. + * \pre (The segment is non-vertical) + */ int arcno () const; /*! @@ -395,8 +351,6 @@ Algebraic_real_1 x () const; }; /* end Arr_algebraic_segment_traits_2::X_monotone_curve_2 */ - - - }; /* end Arr_algebraic_segment_traits_2 */ + } /* end namespace CGAL */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h index bafb54b7db7b..d71d0f7faf9b 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_batched_point_location.h @@ -1,36 +1,38 @@ namespace CGAL { -/*! -\ingroup PkgArrangementOnSurface2PointLocation - -Performs a batched point-location operation on a -given arrangement. It accepts a range of query points, and locates each -point in the arrangement. The query results are returned through the output -iterator. Each query result is given as a pair of the query point and an -object representing the arrangement feature that contains it, namely a -discriminated union container of the bounded types `Face_const_handle`, -`Halfedge_const_handle`, and `Vertex_const_hanlde`. The resulting -pairs in the output sequence are sorted in increasing \f$ xy\f$-lexicographical -order of the query points. The function returns a past-the-end iterator of -the output sequence. - -\cgalHeading{Requirements} - -
      -
    • `InputIterator::value_type` must be `Arrangement_2::Point_2`. -
    • `OutputIterator::value_type` must be convertible to -`std::pair::%Type>`. -
    - -\sa `CGAL::Arr_point_location_result` - -*/ -template::%Type>`. + * + * \sa `CGAL::Arr_point_location_result` + * + */ +template -OutputIterator locate (const Arrangement_2& arr, -InputIterator points_begin, -InputIterator points_end, -OutputIterator oi); +OutputIterator locate (const Arrangement_2& arr, + InputIterator begin, + InputIterator end, + OutputIterator oi); } /* namespace CGAL */ - diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h index d53d7b3bb21a..afe365a3da4e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_conic_traits_2.h @@ -467,20 +467,23 @@ class Arr_conic_traits_2 { */ Approximate_point_2 operator()(const Point_2& p) const; - /*! Obtain a polyline that approximates an \f$x\f$-monotone curve. The - * polyline is defined by a range of approximate points beginning at - * `oi`. The type `OutputIterator` must dereference the type - * `Approximate_point_2`. The first and last points in the range are always - * the endpoints of the given arc `xcv`. The operator returns a - * past-the-end iterator of the destination range. - * \param oi An output iterator for the resulting polyline. - * \param error The error bound of the polyline approximation. This is - * the Hausdorff distance between the arc and the polyline - * that approximates the arc. + /*! approximates a given \f$x\f$-monotone curve. It computes a sequence of + * approximate points that represent an approximate polyline, and inserts + * them into an output container given through an output iterator. The + * first and last points in the sequence are always approximations of the + * endpoints of the given arc. + * + * \param oi An output iterator for the output container. + * \param error The error bound of the polyline approximation. This is the + * Hausdorff distance between the arc and the polyline that + * approximates the arc. * \param xcv The exact \f$x\f$-monotone arc. * \param l2r A Boolean flag that indicates whether the arc direction is - * left to right. - * \return The past-the-end iterator of the output iterator. + * left to right. + * \return The past-the-end iterator of the output container. + * + * \pre Dereferencing `oi` must yield an object of type + * `Arr_conic_traits_2::Approximate_point_2`. */ template OutputIterator operator()(OutputIterator oi, double error, @@ -521,7 +524,7 @@ class Arr_conic_traits_2 { Trim_2 trim_2_object() const; /*! Obtain an `Approximate_2` functor. */ - Trim_2 approximate_2_object() const; + Approximate_2 approximate_2_object() const; /// @} diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h index 2a48e35b399b..0456c4e06f8c 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_point_location_result.h @@ -1,27 +1,28 @@ namespace CGAL { -/*! -\ingroup PkgArrangementOnSurface2PointLocation - -A unary metafunction to determine the return type of a point-location -or vertical ray-shoot query. - -\tparam Arrangement must be an instance of the `CGAL::Arrangement_2` class template. - -\sa `ArrangementPointLocation_2` -\sa `ArrangementVerticalRayShoot_2` -\sa `CGAL::Arr_naive_point_location` -\sa `CGAL::Arr_walk_along_line_point_location` -\sa `CGAL::Arr_landmarks_point_location` -\sa `CGAL::Arr_trapezoid_ric_point_location` -*/ -template +/*! \ingroup PkgArrangementOnSurface2PointLocation + * + * A unary metafunction to determine the return type of a point-location or + * vertical ray-shoot query. + * + * \tparam Arrangement must be an instance of the + * `CGAL::Arrangement_on_surface_2` class template. + * + * \sa `ArrangementPointLocation_2` + * \sa `ArrangementVerticalRayShoot_2` + * \sa `CGAL::Arr_naive_point_location` + * \sa `CGAL::Arr_walk_along_line_point_location` + * \sa `CGAL::Arr_landmarks_point_location` + * \sa `CGAL::Arr_trapezoid_ric_point_location` + */ +template struct Arr_point_location_result { /*! The type of the arrangement feature that is the result of a * point-location query or a vertical ray-shoot query, namely, - * `std::variant` + * `std::variant` */ typedef unspecified_type Type; }; /* end Arr_point_location_result */ + } /* end namespace CGAL */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h index a1bb1b331d12..e5b8be8d93c7 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_polycurve_traits_2.h @@ -238,17 +238,22 @@ namespace CGAL { const Point_2& tgt) const; }; - /*! Subdivide a given subcurve into x-monotone subcurves and insert them - * into a given output iterator. + /*! Subdivide a given subcurve into \f$x\f$-monotone subcurves and + * isolated points, and insert them into an output container. An object in + * the output container is represented by a discriminated union container + * that holds either a point or an \f$x\f$-monotone curve. */ class Make_x_monotone_2 { public: - /*! - * \pre if `cv` is not empty then it must be continuous and well-oriented. + /*! performs the subdivision. + * * \param cv the subcurve. - * \param oi an output iterator for the result. Its value type is a variant - * that wraps Point_2 or an X_monotone_curve_2 objects. - * \return the past-the-end iterator. + * \param oi The output iterator that points at the output container. + * \return the past-the-end iterator of the output container. + * + * \pre if `cv` is not empty, then it must be continuous and well-oriented. + * \pre Dereferencing `oi` must yield a polymorphic object of type + * `std::variant<`\link Arr_polycurve_traits_2::Point_2 `Point_2` \endlink, `X_monotone_curve_2>`. */ template OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const; diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h index 7a39bd94d777..38c0403f9fd6 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h @@ -2,51 +2,53 @@ namespace CGAL { /*! \ingroup PkgArrangementOnSurface2Funcs * - * Produces the symbolic vertical decomposition of a given arrangement, - * performing a batched vertical ray-shooting query from all arrangement - * vertices, such that every vertex is associated with a pair of objects, one - * corresponds to the arrangement feature that lies below it, and the other - * corresponds to the feature that lies above it. The output of this function - * can be readily used for inserting vertical walls and physically decomposing - * the arrangement into pseudo-trapezoids. To do this, it is convenient to - * process the vertices in an ascending \f$ xy\f$-lexicographic order. The - * visible objects are therefore returned through an output iterator, which - * pairs each finite arrangement vertex with the two features it "sees", such - * that the vertices are given in ascending \f$ xy\f$-lexicographic order. + * produces the symbolic vertical decomposition of a given arrangement. More + * precisely, this function performs a batched vertical ray-shooting query from + * every arrangement vertex, and pairs each vertex with a pair of polymorphic + * objects, one corresponds to the arrangement feature that lies below it, and + * the other corresponds to the feature that lies above it. * - * Produces the symbolic vertical decomposition of the `arr` arrangement. More - * precisely, it performs a batched vertical ray-shooting query from all - * arrangement vertices, such that every vertex is associated with a pair of - * objects, one corresponding to the arrangement feature that lies below it, - * while the other corresponds to the feature that lies above it. The query - * results are returned through the output iterator, which pairs each finite - * arrangement vertex with a pair of objects, the first represents the feature - * below the vertex, and the second represents the feature that lies above - * it. Each object is an optional variant that wraps a handle to an arrangement - * feature. If the vertex is the top end-vertex of a vertical edge, we say that + * The finite arrangement vertices and the features they "see", if exist, + * that are, the query results, are inserted in ascending \f$xy\f$-lexicographic + * order (of the query vertex) into an output container given through an output + * iterator. If the vertex is the top end-vertex of a vertical edge, we say that * there is no feature below it; similarly, if it is the bottom end-vertex of a - * vertical edge, we say that there is no feature above it. In these cases the - * optional object is set to be empty; otherwise it is set as follows: + * vertical edge, we say that there is no feature above it. Each feature, if + * exists, is represented by a discriminated union container that holds an + * object of one of the following types: + * *
      - *
    • `Halfedge_const_handle`, if the vertex is located above (or below) an - * edge. The given halfedge is always directed from right to left. In case - * there is no concrete edge below (or above) the vertex, and the arrangement - * is unbounded, then the object returned is a fictitious halfedge. - *
    • `Face_const_handle`, in case there is no edge below (or above) - * the vertex, and the arrangement is bounded. - *
    • `Vertex_const_handle`, in case the vertex is located vertically above - * (or below) another arrangement vertex. - *
    The function returns a past-the-end iterator for its output sequence. + *
  • `Arrangement_on_surface_2::Halfedge_const_handle`, if the vertex is + * located above (or below) an edge. The given halfedge is always directed + * from right to left. In case there is no concrete edge below (or above) + * the vertex, and the arrangement is unbounded, then the object returned + * is a fictitious halfedge. + *
  • `Arrangement_on_surface_2::Face_const_handle`, in case there is no edge + * below (or above) the vertex, and the arrangement is bounded. + *
  • `Arrangement_on_surface_2::Vertex_const_handle`, in case the vertex is + * located vertically above (or below) another arrangement vertex. + * * - * \cgalHeading{Requirements} + * The output of this function can be readily used for inserting vertical walls + * and physically decomposing the arrangement into pseudo-trapezoids. * - * `OutputIterator::value_type` must be - * `pair >`. + * \param arr The arrangement. + * \param oi The output iterator that points at the output container. + * \return The past-the-end iterator of the output container. + * + * \cgalHeading{Requirements} * + * \pre Dereferencing `oi` must yield an object of type + * `std::pair>>, + * where `Type` is + * `std::variant`. */ -template -OutputIterator decompose (const Arrangement_2& arr, -OutputIterator oi); +template +OutputIterator +decompose(const Arrangement_on_surface_2& arr, + OutputIterator oi); } /* namespace CGAL */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h index a269c6e01842..465f1f3a9b20 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_2.h @@ -379,37 +379,4 @@ template bool remove_vertex(Arrangement_2& arr, typename Arrangement_2::Vertex_handle v); -/*! \ingroup PkgArrangementOnSurface2Funcs - * - * Compute the zone of the given \f$ x\f$-monotone curve in the existing - * arrangement. Meaning, it output the arrangement's vertices, edges and faces - * that the \f$ x\f$-monotone curve intersects. The order of the objects is the - * order that they are discovered when traversing the \f$ x\f$-monotone curve - * from left to right. - * - * A given point-location object is used for answering point-location queries - * during the insertion process. By default, the function uses the "walk along - * line" point-location strategy - namely an instance of the class - * `Arr_walk_along_line_point_location >`. - * - * Compute the zone of the given \f$ x\f$-monotone curve `c` in the arrangement - * `arr`. - * - * \pre If provided, `pl` must be attached to the given arrangement `arr`. - * - * \cgalHeading{Requirements} - * - *
      - *
    • The instantiated `GeomTraits` class must model the - * `ArrangementXMonotoneTraits_2` concept. - *
    • The point-location object `pl`, must model the - * `ArrangementPointLocation_2` concept. - *
    - */ -template -OutputIterator zone(Arrangement_2& arr, - const typename Traits::X_monotone_curve_2& c, - OutputIterator oi, const PointLocation& pl); - } /* namespace CGAL */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h index 2c0d60278730..48485644adeb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h @@ -1294,38 +1294,45 @@ bool remove_vertex /*! \ingroup PkgArrangementOnSurface2Funcs * - * Compute the zone of the given \f$ x\f$-monotone curve in the existing - * arrangement. Meaning, it output the arrangement's vertices, edges and faces - * that the \f$ x\f$-monotone curve intersects. The order of the objects is the - * order that they are discovered when traversing the \f$ x\f$-monotone curve - * from left to right. + * computes the zone of the given \f$x\f$-monotone curve in a given + * arrangement. More precisely, this function finds the arrangement vertices, + * edges ,and faces that the given \f$x\f$-monotone curve intersects, and + * inserts them in the order they are discovered when traversing the + * \f$x\f$-monotone curve from left to right into an output contaiuner given + * through an output iterator. An object in the resulting zone is represented by + * a discriminated union container that holds a vertex handle, halfedge handle, + * or a face handle. * * A given point-location object is used for answering point-location queries * during the insertion process. By default, the function uses the "walk along - * line" point-location strategy - namely an instance of the class + * line" point-location strategy, namely, an instance of the class * `Arr_walk_along_line_point_location >`. + * TopologyTraits>>`. * - * Compute the zone of the given \f$ x\f$-monotone curve `c` in the arrangement - * `arr`. + * \param arr The given arrangement. + * \param c The \f$x\f$-monotone curve. + * \param oi The output iterator that points at the output container. + * \param pl The point-location object. + * \return The past-the-end iterator of the output container. * * \pre If provided, `pl` must be attached to the given arrangement `arr`. + * \pre The instantiated `GeometryTraits` class must model the + * `ArrangementXMonotoneTraits_2` concept. + * \pre The point-location object `pl`, must model the + * `ArrangementPointLocation_2` concept. + * \pre Dereferencing `oi` must yield a polymorphic object of type + * `std::variant`. * * \cgalHeading{Requirements} - * - *
      - *
    • The instantiated `GeometryTraits` class must model the - * `ArrangementXMonotoneTraits_2` concept. - *
    • The point-location object `pl`, must model the - * `ArrangementPointLocation_2` concept. - *
    */ template -OutputIterator zone -(Arrangement_on_surface_2& arr, - const typename GeometryTraits::X_monotone_curve_2& c, - OutputIterator oi, - const PointLocation& pl); +OutputIterator +zone(Arrangement_on_surface_2& arr, + const typename GeometryTraits::X_monotone_curve_2& c, + OutputIterator oi, + const PointLocation& pl); } /* namespace CGAL */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h index 4b40d11fd1d7..b48ef555575a 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/CORE_algebraic_number_traits.h @@ -29,88 +29,102 @@ class CORE_algebraic_number_traits { /// \name Utility Functions /// @{ - /*! Obtain the numerator of a rational number. - * \param q A rational number. - * \return The numerator of q. + /*! obtains the numerator of a rational number. + * + * \param q The rational number. + * \return The numerator of `q`. */ Integer numerator(const Rational& q) const; - /*! Obtain the denominator of a rational number. - * \param q A rational number. - * \return The denominator of q. + /*! obtains the denominator of a rational number. + * + * \param q The rational number. + * \return The denominator of `q`. */ Integer denominator(const Rational& q) const; - /*! Convert an integer to an algebraic number. - * \param z An integer. - * \return The algebraic number equivalent to z. + /*! converts an integer to an algebraic number. + * + * \param z The integer. + * \return The algebraic number equivalent to `z`. */ Algebraic convert(const Integer& z) const; - /*! Convert a rational number to an algebraic number. + /*! converts a rational number to an algebraic number. + * * \param q A rational number. - * \return The algebraic number equivalent to q. + * \return The algebraic number equivalent to `q`. */ Algebraic convert(const Rational& q) const; - /*! Construct a rational number that lies strictly between two algebraic + /*! constructs a rational number that lies strictly between two algebraic * values. + * * \param x1 The first algebraic value. * \param x2 The second algebraic value. * \pre The two values are not equal. - * \return A rational number that lies in the open interval (x1, x2). + * \return The rational number that lies in the open interval (`x1`, `x2`). */ Rational rational_in_interval(const Algebraic& x1, const Algebraic& x2) const; - /*! Obtain a range of double-precision floats that contains the given + /*! obtains a range of double-precision floats that contains the given * algebraic number. + * * \param x The given number. - * \return A pair that contain x. + * \return The range of double-precision floats that contain `x`. */ std::pair double_interval(const Algebraic& x) const; - /*! Convert a sequence of rational coefficients to an equivalent sequence - * of integer coefficients. If the input coefficients are q(1), ..., q(k), - * where q(i) = n(i)/d(i) then the output coefficients will be of the - * form: - * n(i) * lcm {d(1), ... , d(k)} - * a(i) = ------------------------------- - * d(i) * gcd {n(1), ... , n(k)} - * - * \param q_begin The begin iterator of the rational sequence. - * \param q_end The past-the-end iterator of the rational sequence. - * \param zoi An output iterator for the integer coefficients. - * \return A past-the-end iterator for the output container. - * \pre The value type of q_begin and q_end is `Rational`, and - * the value type of zoi is `Integer`. + /*! converts a sequence of rational coefficients to an equivalent sequence + * of integer coefficients. If the input coefficients are + * \f$q(1),\ldots,q(k)\f$, where \f$q(i) = n(i)/d(i)\f$, then the output + * coefficients will be of the form: + * \f$a(i) = \frac{n(i) \cdot \mathrm{lcm}(d(1),\ldots,d(k))}{d(i) \cdot \mathrm{gcd}(n(1),\ldots, n(k))}\f$. + * It inserts the output sequence into an output container given through an + * output iterator. + * + * \param begin The begin iterator of the rational coefficients input + * container. + * \param end The past-the-end iterator of the rational coefficients input + * container. + * \param oi The output iterator of the integer coefficients output container. + * \return The past-the-end iterator of the output container. + * + * \pre The value type of `InputIterator` is `Rational`. + * \pre Dereferencing `oi` must yield an object convertible to `Integer`. */ template - OutputIterator convert_coefficients(InputIterator q_begin, - InputIterator q_end, - OutputIterator zoi) const; + OutputIterator convert_coefficients(InputIterator begin, + InputIterator end, + OutputIterator oi) const; - /*! Compute the square root of an algebraic number. + /*! computes the square root of an algebraic number. + * * \param x The number. - * \return The square root of x. - * \pre x is non-negative. + * \return The square root of `x`. + * \pre `x` is non-negative. */ Algebraic sqrt(const Algebraic& x) const; - /*! Compute the roots of a quadratic equations \f$a*x^2+ b*x + c = 0\f$ - * with integer coefficients. + /*! computes the roots of a quadratic equations \f$a*x^2+ b*x + c = 0\f$ + * with integer coefficients, and inserts them into an output container given + * through an output iterator. + * * \param a The coefficient of \f$x^2\f$ * \param b The coefficient of \f$x\f$ * \param c The free term. - * \param oi An output iterator for the real-valued solutions of the - * quadratic equation. - * \return A past-the-end iterator for the output container. - * \pre The value type of oi is Algebraic. + * \param oi The output iterator of the output container of real-valued + * solutions of the quadratic equation. + * \return The past-the-end iterator of the output container. + * + * \pre Dereferencing `oi` must yield an object convertible to `Algebraic`. */ template OutputIterator solve_quadratic_equation(const NT& a, const NT& b, const NT& c, OutputIterator oi) const; - /*! Construct a polynomial with integer coefficients. + /*! constructs a polynomial with integer coefficients. + * * \param coeffs The coefficients of the input polynomial. * \param degree The degree of the input polynomial. * \return The polynomial. @@ -118,8 +132,9 @@ class CORE_algebraic_number_traits { Polynomial construct_polynomial(const Integer* coeffs, unsigned int degree) const; - /*! Construct a polynomial with integer coefficients given rational + /*! constructs a polynomial with integer coefficients given rational * coefficients. + * * \param coeffs The coefficients of the input polynomial. * \param degree The degree of the input polynomial. * \param poly Output: The resulting polynomial with integer coefficients. @@ -131,10 +146,11 @@ class CORE_algebraic_number_traits { unsigned int degree, Polynomial& poly, Integer& poly_denom) const; - /*! Construct two polynomials with integer coefficients such that P(x)/Q(x) - * is a rational function equivalent to the one represented by the two - * given vectors of rational coefficients. It is guaranteed that the GCD - * of P(x) and Q(x) is trivial. + /*! constructs two polynomials with integer coefficients such that + * \f$P(x)/Q(x)\f$ is a rational function equivalent to the one represented + * by the two given vectors of rational coefficients. It is guaranteed that + * the GCD of \f$P(x)\f$ and \f$Q(x)\f$ is trivial. + * * \param p_coeffs The coefficients of the input numerator polynomial. * \param p_degree The degree of the input numerator polynomial. * \param q_coeffs The coefficients of the input denominator polynomial. @@ -143,7 +159,7 @@ class CORE_algebraic_number_traits { * coefficients. * \param q_poly Output: The resulting denominator polynomial with integer * coefficients. - * \return (true) on success; (false) if the denominator is 0. + * \return `true` on success; `false` if the denominator is 0. */ bool construct_polynomials(const Rational* p_coeffs, unsigned int p_degree, @@ -155,58 +171,70 @@ class CORE_algebraic_number_traits { */ int degree(const Polynomial& poly) const; - /*! Evaluate a polynomial at a given x-value. - * \param poly A polynomial. + /*! evaluates a polynomial at a given \f$x\f$-value. + * + * \param poly The polynomial. * \param x The value to evaluate at. - * \return The value of the polynomial at x. + * \return The value of the polynomial at `x`. */ template NT evaluate_at(const Polynomial& poly, NT& x) const; - /*! Compute the derivative of the given polynomial. - * \param poly The polynomial p(x). - * \return The derivative p'(x). + /*! computes the derivative of the given polynomial. + * + * \param poly The polynomial \f$p(x)\f$. + * \return The derivative \f$p'(x)\f$. */ Polynomial derive(const Polynomial& poly) const; - /*! Multiply a polynomial by some scalar coefficient. - * \param poly The polynomial P(x). + /*! multiplies a polynomial by some scalar coefficient. + * + * \param poly The polynomial \f$P(x)\f$. * \param a The scalar value. - * \return The scalar multiplication a*P(x). + * \return The scalar multiplication \f$a \cdot P(x)\f$. */ Polynomial scale(const Polynomial& poly, const Integer& a) const; - /*! Perform "long division" of two polynomials: Given A(x) and B(x) compute - * two polynomials Q(x) and R(x) such that: A(x) = Q(x)*B(x) + R(x) and - * R(x) has minimal degree. - * \param polyA The first polynomial A(x). - * \param polyB The second polynomial A(x). - * \param rem Output: The remainder polynomial R(x). - * \return The quontient polynomial Q(x). + /*! performs "long division" of two polynomials: Given \f$A(x)\f$ and + * \f$B(x)\f$ compute two polynomials \f$Q(x)\f$ and \f$R(x)\f$ such that: + * \f$A(x) = Q(x) \cdot B(x) + R(x)\f$ and \f$R(x)\f$ has minimal degree. + * + * \param poly_a The first polynomial \f$A(x)\f$. + * \param poly_b The second polynomial \f$A(x)\f$. + * \param rem Output: The remainder polynomial \f$R(x)\f$. + * \return The quontient polynomial \f$Q(x)\f$. */ - Polynomial divide(const Polynomial& polyA, - const Polynomial& polyB, + Polynomial divide(const Polynomial& poly_a, + const Polynomial& poly_b, Polynomial& rem) const; - /*! Compute the real-valued roots of a polynomial with integer coefficients, - * sorted in ascending order. + /*! computes the real-valued roots of a polynomial with integer coefficients, + * and inserts them in ascending order into an output container given through + * an output iterator. + * * \param poly The input polynomial. - * \param oi An output iterator for the real-valued root of the polynomial. - * \return A past-the-end iterator for the output container. - * \pre The value type of oi is Algebraic. + * \param oi The output iterator of the output container of real-valued root + * of the polynomial. + * \return The past-the-end iterator of the output container. + * + * \pre Dereferencing `oi` must yield an object convertible to `Algebraic`. */ template OutputIterator compute_polynomial_roots(const Polynomial& poly, OutputIterator oi) const; - /*! Compute the real-valued roots of a polynomial with integer coefficients, - * within a given interval. The roots are sorted in ascending order. + /*! computes the real-valued roots of a polynomial with integer coefficients + * within a given interval, and inserts them in ascending order into an output + * container given through an output iterator. + * * \param poly The input polynomial. * \param x_min The left bound of the interval. * \param x_max The right bound of the interval. - * \param oi An output iterator for the real-valued root of the polynomial. - * \return A past-the-end iterator for the output container. - * \pre The value type of oi is Algebraic. + * \param oi The output iterator of the output container of the real-valued + * root of the polynomial. + * \return The past-the-end iterator of the output container. + * + * \pre Dereferencing `oi` must yield an object convertible to `Algebraic`. */ template OutputIterator compute_polynomial_roots(const Polynomial& poly, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h index 7f0c1a50fcd5..f13a26422e92 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--Intersect_2.h @@ -16,26 +16,33 @@ class Intersect_2 { /// A model of this concept must provide: /// @{ - /*! computes the intersections of `xc1` and `xc2` and writes them in an - * ascending lexicographic \f$xy\f$-order into a range beginning at - * `oi`. The type `OutputIterator` must dereference a polymorphic object of - * type `std::variant` that wraps objects of type either type - * `pair` or - * `ArrTraits::X_monotone_curve_2`. An object of the former type represents an - * intersection point with its multiplicity (in case the multiplicity is - * undefined or unknown, it should be set to \f$0\f$). An object of the latter - * type represents an overlapping subcurve of `xc1` and `xc2`. The operator - * returns a past-the-end iterator of the destination range. + /*! computes the intersections of two \f$x\f$-monotone curves and inserts the + * result in ascending \f$xy\f$-lexicographic order into an output container + * given through an output iterator. An intersection, if exists, is + * represented by a discriminated union container that holds either an + * intersection point along with its multiplicity or an overlapping + * \f$x\f$-monotone subcurve. If the multiplicity is undefined or unknown, it + * should be set to \f$0\f$. * - * A special case may occur when the parameter space of the surface, the - * arrangement is embedded on, is identified on the left and right sides of - * the boundary. An intersection point that lies on the identification curve, + * \param xc1 The first \f$x\f$-monotone curve. + * \param xc2 The second \f$x\f$-monotone curve. + * \param oi The output iterator that points at the output container. + * \return The past-the-end iterator of the output container. + * + * A special case may occur when the left and right sides of the boundary of + * the parameter space of the surface, the arrangement is embedded on, are + * identified. An intersection point that lies on the identification curve, * between two \f$x\f$-monotone curves that intersect at their left and right * ends must be ignored. Consider two \f$x\f$-monotone curves that intersect * at their left and right ends, respectively, at a point \f$p\f$ that lies on * the identification curve. If, for example, the number of intersections * between these two curves is greater than 1, the order of intersections is - * non-deterministic. + * nondeterministic. + * + * \pre Dereferencing `oi` must yield an object of type + * `std::optional>`, + * where `%Point_2` is a model of `ArrTraits::Point_2` and + * `X_monotone_curve_2` is a model of `ArrTraits::XMonotoneCurve_2`. */ template OutputIterator operator()(ArrTraits::X_monotone_curve_2 xc1, diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h index 3f125aea2f65..a86290bd333d 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--MakeXMonotone_2.h @@ -15,12 +15,20 @@ class MakeXMonotone_2 { /// A model of this concept must provide: /// @{ - /*! subdivides the input curve `c` into \f$x\f$-monotone subcurves and - * isolated points, and inserts the results into a range beginning at the given - * output iterator `oi`. The type `OutputIterator` dereferences a - * `std::variant` that wraps either an `ArrTraits::Point_2` object or an - * `ArrTraits::X_monotone_curve_2` object. The operator returns a past-the-end - * iterator for the output sequence. + /*! subdivides an input curve into \f$x\f$-monotone subcurves and isolated + * points, and inserts the results into an output container given through an + * output iterator. An object in the output container is represented by a + * discriminated union container that holds either a point or an + * \f$x\f$-monotone curve. + * + * \param c The input curve. + * \param oi The output iterator that points at the output container. + * \return The past-the-end iterator of the output container. + * + * \pre Dereferencing `oi` must yield a polymorphic object of type + * `std::variant<%Point_2, X_monotone_curve_2>`, where `%Point_2` is a model + * of `ArrTraits::Point_2` and `X_monotone_curve_2` is a model of + * `ArrTraits::XMonotoneCurve_2`. */ template OutputIterator operator()(ArrTraits::Curve_2 c, OutputIterator oi); diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/batched_point_location.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/batched_point_location.cpp index 6d42fb6ca5f6..f2cbc29815d4 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/batched_point_location.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/batched_point_location.cpp @@ -23,7 +23,7 @@ int main() { Point(1, 4), Point(4, 3), Point(6, 3), Point(3, 2), Point(5, 2), Point(1, 0) }; std::list results; - locate(arr, points.begin(), points.end(), std::back_inserter(results)); + CGAL::locate(arr, points.begin(), points.end(), std::back_inserter(results)); // Print the results. for (auto it = results.begin(); it != results.end(); ++it) From c66218bf8512568ed7eca8d7b46da9442f6d9218 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Tue, 19 Sep 2023 13:42:40 +0300 Subject: [PATCH 0741/1398] Fixed typo --- .../CGAL/Arr_vertical_decomposition_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h index 38c0403f9fd6..09f2ad4e5d21 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h @@ -40,7 +40,7 @@ namespace CGAL { * * \pre Dereferencing `oi` must yield an object of type * `std::pair>>, + * std::pair>>`, * where `Type` is * `std::variant Date: Tue, 19 Sep 2023 14:59:11 +0200 Subject: [PATCH 0742/1398] CGALConfig.cmake remove the early return() Otherwise we have a lot of warnings like: ``` CMake Warning at /usr/lib64/cmake/Qt6/QtPublicWalkLibsHelpers.cmake:284 (message): When trying to collect dependencies of target 'Constrained_Delaunay_triangulation_2', the non-existent target 'Qt6::Svg' was encountered. This can likely be fixed by moving the find_package call that pulls in 'Qt6::Svg' to the scope of directory '/home/lrineau/Git/cgal-testsuite-dockerfiles/testsuite/CGAL-6.0-Ic-66/test/Triangulation_2_Demo' or higher. This warning can be silenced by setting QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING to ON. Call Stack (most recent call first): /usr/lib64/cmake/Qt6/QtPublicWalkLibsHelpers.cmake:320 (__qt_internal_print_missing_dependency_target_warning) /usr/lib64/cmake/Qt6Core/Qt6CoreMacros.cmake:609 (__qt_internal_collect_all_target_dependencies) /usr/lib64/cmake/Qt6Core/Qt6CoreMacros.cmake:709 (_qt_internal_finalize_executable) /usr/lib64/cmake/Qt6Core/Qt6CoreMacros.cmake:564:EVAL:1 (qt6_finalize_target) test/Triangulation_2_Demo/CMakeLists.txt:DEFERRED ``` The issue was that `find_package(Qt6) ...` is required in any sub-directory, because imported targets like `Qt6::Svg` are local to the directory scope. --- Installation/lib/cmake/CGAL/CGALConfig.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Installation/lib/cmake/CGAL/CGALConfig.cmake b/Installation/lib/cmake/CGAL/CGALConfig.cmake index 7b3f2c419cb4..93e9e8830f0a 100644 --- a/Installation/lib/cmake/CGAL/CGALConfig.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfig.cmake @@ -146,11 +146,6 @@ foreach(cgal_lib ${CGAL_LIBRARIES}) set(CGALConfig_all_targets_are_defined FALSE) endif() endforeach() -if(CGALConfig_all_targets_are_defined) - return() -endif() - -message(STATUS "Using header-only CGAL") if(NOT CGAL_FOUND) return() From 0ffb2563519e010abec22682b05ca71ae27f28c5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Tue, 19 Sep 2023 15:11:55 +0200 Subject: [PATCH 0743/1398] fix the workflow demo.yml The four batches were wrong: they all compiled all the plugins, instead of only a fourth of them. --- .github/test.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/test.sh b/.github/test.sh index a744f6d5b08a..cf69ebee9552 100755 --- a/.github/test.sh +++ b/.github/test.sh @@ -3,11 +3,10 @@ FACTOR=$1 set -ex cd Polyhedron/demo -LIST_OF_PLUGINS=$(/usr/local/bin/cmake --build . -t help | egrep 'plugin$' |& cut -d\ -f2) +/usr/local/bin/cmake -S Polyhedron -B build -DCGAL_DIR=$2 +LIST_OF_PLUGINS=$(/usr/local/bin/cmake --build build -t help | egrep 'plugin$' |& cut -d\ -f2) PLUGINS_ARRAY=(${LIST_OF_PLUGINS}); NB_OF_PLUGINS=${#PLUGINS_ARRAY[@]} DEL=$(($NB_OF_PLUGINS / 4)) -mkdir build cd build -/usr/local/bin/cmake -DCGAL_DIR=$2 ../Polyhedron make -j2 ${PLUGINS_ARRAY[@]:$(($FACTOR * $DEL)):$((($FACTOR + 1) * $DEL))} From 5247f0fbdbdb9b754050bd03e19e646267f23740 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 19 Sep 2023 15:43:02 +0100 Subject: [PATCH 0744/1398] Bounding_volumes: Use Eigen library in demo --- .../demo/Bounding_volumes/CMakeLists.txt | 10 +- GraphicsView/demo/Bounding_volumes/Ellipse.h | 92 ++++++++++--------- .../demo/Bounding_volumes/data.pts.cgal | 3 + .../demo/Bounding_volumes/rect.pts.cgal | 4 + .../demo/Bounding_volumes/slanted.pts.cgal | 4 + 5 files changed, 68 insertions(+), 45 deletions(-) create mode 100644 GraphicsView/demo/Bounding_volumes/data.pts.cgal create mode 100644 GraphicsView/demo/Bounding_volumes/rect.pts.cgal create mode 100644 GraphicsView/demo/Bounding_volumes/slanted.pts.cgal diff --git a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt index 78f97078c03e..ac02fc6554c9 100644 --- a/GraphicsView/demo/Bounding_volumes/CMakeLists.txt +++ b/GraphicsView/demo/Bounding_volumes/CMakeLists.txt @@ -18,6 +18,10 @@ find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5) find_package(Qt5 QUIET COMPONENTS Widgets) include_directories(BEFORE ./include) +find_package(Eigen3 3.1.91 QUIET) #(requires 3.1.91 or greater) +include(CGAL_Eigen3_support) + +if(TARGET CGAL::Eigen3_support) if(CGAL_Qt5_FOUND AND Qt5_FOUND) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -40,7 +44,8 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_to_cached_list(CGAL_EXECUTABLE_TARGETS Bounding_volumes) target_link_libraries(Bounding_volumes PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 - Qt5::Widgets) + Qt5::Widgets + PUBLIC CGAL::Eigen3_support) include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) cgal_add_compilation_test(Bounding_volumes) @@ -53,3 +58,6 @@ else() message("NOTICE: This demo requires CGAL and Qt5, and will not be compiled.") endif() +else() + message("NOTICE: This demo requires CGAL and Eigen, and will not be compiled.") +endif() diff --git a/GraphicsView/demo/Bounding_volumes/Ellipse.h b/GraphicsView/demo/Bounding_volumes/Ellipse.h index ce5e09a556c3..d950b8fd8061 100644 --- a/GraphicsView/demo/Bounding_volumes/Ellipse.h +++ b/GraphicsView/demo/Bounding_volumes/Ellipse.h @@ -1,6 +1,9 @@ #ifndef ELLIPSE_H #define ELLIPSE_H +#include +#include + template class Ellipse_2 { @@ -20,50 +23,51 @@ template CGAL::Simple_cartesian::Conic_2 co; me.ellipse().double_conic(co); - double a11 = co.r(); - double a12 = co.t()/2.0; - double a22 = co.s(); - double b1 = co.u(); - double b2 = co.v(); - double c = co.w(); - - assert(a11*a22-a12*a12 >= 0); - - double delta = (a11>a22)? a11-a22 : a22-a11; - if( (delta < 0.00000000001) && (a12 == 0)){ - ce = Point_2(-b1/(2*a11), -b2/(2*a11)); - a_ = b_ = std::sqrt(b1*b1+b2*b2-4*a11*c)/(2*a11); - va_ = Vector_2(a_, 0); - vb_ = Vector_2(0, b_); - return; - } - - double kden = 2.0*(a12*a12 - a11*a22); - double k1 = (a22*b1 - a12*b2)/kden; - double k2 = (a11*b2 - a12*b1)/kden; - ce = Point_2(k1,k2); - double mu = 1/(a11*k1*k1 + 2.0*a12*k1*k2 + a22*k2*k2 - c); - double m11 = mu*a11; - double m12 = mu*a12; - double m22 = mu*a22; - - double r = std::sqrt((m11-m22)*(m11-m22) + 4.0*m12*m12); - double lambda1 = ((m11+m22) + r)/2.0; - double lambda2 = ((m11+m22) - r)/2.0; - - b_ = 1.0/sqrt(lambda1); - a_ = 1.0/sqrt(lambda2); - double omega = 1.0/ - std::sqrt((lambda1-m22)*(lambda1-m22) + m12*m12); - - double u1x = - a_ * omega*m12; - double u1y = a_ * omega * (lambda1-m22); - - double u2x = b_* omega * (lambda1-m22); - double u2y = b_* omega*m12; - - va_ = Vector_2(u1x,u1y); - vb_ = Vector_2(u2x,u2y); + // https://en.wikipedia.org/wiki/Matrix_representation_of_conic_sections + double A = co.r(); + double B = co.t(); + double C = co.s(); + double D = co.u(); + double E = co.v(); + double F = co.w(); + + assert(A * C - B*B/4 >= 0); + + Eigen::Matrix2d A33, A33i; + A33 << A, B/2, B/2, C; + A33i = A33.inverse(); + + Eigen::Vector2d v; + v << -D/2 , -E/2; + + v = A33i * v; + + ce = Point_2(v[0],v[1]); + + Eigen::EigenSolver es(A33); + + Eigen::Matrix2cd ev; + ev = es.eigenvectors(); + double x0 = ev.col(0)[0].real(); + double y0 = ev.col(0)[1].real(); + double x1 = ev.col(1)[0].real(); + double y1 = ev.col(1)[1].real(); + + double lambda1 = es.eigenvalues()[0].real(); + double lambda2 = es.eigenvalues()[1].real(); + + Eigen::Matrix3d AQ; + AQ << A, B/2, D/2, + B/2, C, E/2, + D/2, E/2, F; + + double K = AQ.determinant() / A33.determinant(); + + a_ = sqrt(-K/lambda1); + b_ = sqrt(-K/lambda2); + + va_ = a_ * Vector_2(x0,y0); + vb_ = b_ * Vector_2(x1,y1); } diff --git a/GraphicsView/demo/Bounding_volumes/data.pts.cgal b/GraphicsView/demo/Bounding_volumes/data.pts.cgal new file mode 100644 index 000000000000..49b66d2f77a8 --- /dev/null +++ b/GraphicsView/demo/Bounding_volumes/data.pts.cgal @@ -0,0 +1,3 @@ +0 2 +2 1 +0 0 diff --git a/GraphicsView/demo/Bounding_volumes/rect.pts.cgal b/GraphicsView/demo/Bounding_volumes/rect.pts.cgal new file mode 100644 index 000000000000..ab69a7198547 --- /dev/null +++ b/GraphicsView/demo/Bounding_volumes/rect.pts.cgal @@ -0,0 +1,4 @@ +-2 1 +-2 -1 +2 1 +2 -1 diff --git a/GraphicsView/demo/Bounding_volumes/slanted.pts.cgal b/GraphicsView/demo/Bounding_volumes/slanted.pts.cgal new file mode 100644 index 000000000000..0af8ad54f6b2 --- /dev/null +++ b/GraphicsView/demo/Bounding_volumes/slanted.pts.cgal @@ -0,0 +1,4 @@ +-2 -1 +-1 -2 +1 2 +2 1 From 672a0d02bb39d3698438b67fdfed068c19c73961 Mon Sep 17 00:00:00 2001 From: Andry <85350850+Kuprin2000@users.noreply.github.com> Date: Tue, 19 Sep 2023 18:09:51 +0300 Subject: [PATCH 0745/1398] Added type cast to preprocess_weights() to avoid warnings --- Straight_skeleton_extrusion_2/include/CGAL/extrude_skeleton.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Straight_skeleton_extrusion_2/include/CGAL/extrude_skeleton.h b/Straight_skeleton_extrusion_2/include/CGAL/extrude_skeleton.h index 6d9c0286d0b1..bb8929a3da96 100644 --- a/Straight_skeleton_extrusion_2/include/CGAL/extrude_skeleton.h +++ b/Straight_skeleton_extrusion_2/include/CGAL/extrude_skeleton.h @@ -955,7 +955,7 @@ preprocess_weights(WeightRange& weights) // Since the max value might not be very close to 90°, take the max between of the large-% weight // and the weight corresponding to an angle of 89.9999999° const FT weight_of_89d9999999 = 572957787.3425436; // tan(89.9999999°) - const FT scaled_max = (std::max)(weight_of_89d9999999, 1e3 * max_value); + const FT scaled_max = (std::max)(weight_of_89d9999999, FT(1e3) * max_value); for(auto& contour_weights : weights) { From d2ab01fc5d8ff81b425fb6b1bb226764a6d29dd2 Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Wed, 20 Sep 2023 12:25:17 +0300 Subject: [PATCH 0746/1398] Forced references (to std::variant) not to spread over more than a single line to pacify older version of Doxygen --- .../CGAL/Arr_vertical_decomposition_2.h | 4 +--- .../Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h index 09f2ad4e5d21..15631d265e38 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arr_vertical_decomposition_2.h @@ -42,9 +42,7 @@ namespace CGAL { * `std::pair>>`, * where `Type` is - * `std::variant`. + * `std::variant`. */ template OutputIterator diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h index 48485644adeb..5886ce3f19d8 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/CGAL/Arrangement_on_surface_2.h @@ -1321,9 +1321,7 @@ bool remove_vertex * \pre The point-location object `pl`, must model the * `ArrangementPointLocation_2` concept. * \pre Dereferencing `oi` must yield a polymorphic object of type - * `std::variant`. + * `std::variant`. * * \cgalHeading{Requirements} */ From 88bcd4096625b172d1091e33cfb37118513e50a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:48:42 +0200 Subject: [PATCH 0747/1398] Enable changing the oracle in the AW3 builder --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index f12ad06804b1..86010b27dfcf 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -173,7 +173,7 @@ class Alpha_wrap_3 using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>; protected: - const Oracle m_oracle; + Oracle m_oracle; SC_Iso_cuboid_3 m_bbox; FT m_alpha, m_sq_alpha; @@ -183,10 +183,12 @@ class Alpha_wrap_3 Alpha_PQ m_queue; public: - // Main constructor + Alpha_wrap_3() + : m_queue(4096) + { } + Alpha_wrap_3(const Oracle& oracle) - : - m_oracle(oracle), + : m_oracle(oracle), m_dt(Geom_traits(oracle.geom_traits())), // used to set up the initial MPQ, use some arbitrary not-too-small value m_queue(4096) @@ -198,6 +200,8 @@ class Alpha_wrap_3 public: const Geom_traits& geom_traits() const { return m_dt.geom_traits(); } + Oracle& oracle() { return m_oracle; } + const Oracle& oracle() const { return m_oracle; } Dt& triangulation() { return m_dt; } const Dt& triangulation() const { return m_dt; } const Alpha_PQ& queue() const { return m_queue; } From 4512b0e6f44ec1ac42ae0854bba2abb12588b7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:52:20 +0200 Subject: [PATCH 0748/1398] Rewrite the extraction of possibly non-manifold wraps --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 295 ++++++++++++------ 1 file changed, 193 insertions(+), 102 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 86010b27dfcf..6e8e323e85a9 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -648,165 +648,256 @@ class Alpha_wrap_3 return true; } -public: - // Manifoldness is tolerated while debugging and extracting at intermediate states - // Not the preferred way because it uses 3*nv storage - template - void extract_possibly_non_manifold_surface(OutputMesh& output_mesh, - OVPM ovpm) const +private: + void extract_boundary(std::vector& points, + std::vector >& faces) const { - namespace PMP = Polygon_mesh_processing; - -#ifdef CGAL_AW3_DEBUG - std::cout << "> Extract possibly non-manifold wrap... ()" << std::endl; -#endif - - clear(output_mesh); - - CGAL_assertion_code(for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit)) - CGAL_assertion(cit->tds_data().is_clear()); + std::unordered_map vertex_to_id; - for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit) + for(auto fit=m_dt.all_facets_begin(), fend=m_dt.all_facets_end(); fit!=fend; ++fit) { - Cell_handle seed = cit; - if(seed->info().is_outside || seed->tds_data().processed()) + Facet f = *fit; + if(!f.first->info().is_outside) + f = m_dt.mirror_facet(f); + + const Cell_handle ch = f.first; + const int s = f.second; + const Cell_handle nh = ch->neighbor(s); + if(ch->info().is_outside == nh->info().is_outside) continue; - std::queue to_visit; - to_visit.push(seed); + std::array ids; + for(int pos=0; pos<3; ++pos) + { + Vertex_handle vh = ch->vertex(Dt::vertex_triple_index(s, pos)); + auto insertion_res = vertex_to_id.emplace(vh, vertex_to_id.size()); + if(insertion_res.second) // successful insertion, never-seen-before vertex + points.push_back(m_dt.point(vh)); - std::vector points; - std::vector > faces; - std::size_t idx = 0; + ids[pos] = insertion_res.first->second; + } - while(!to_visit.empty()) - { - const Cell_handle cell = to_visit.front(); - CGAL_assertion(!cell->info().is_outside && !m_dt.is_infinite(cell)); + faces.emplace_back(std::array{ids[0], ids[1], ids[2]}); + } + } - to_visit.pop(); + template + void extract_manifold_surface(OutputMesh& output_mesh, + OVPM ovpm) const + { + namespace PMP = Polygon_mesh_processing; - if(cell->tds_data().processed()) - continue; +#ifdef CGAL_AW3_DEBUG + std::cout << "> Extract manifold wrap... ()" << std::endl; +#endif - cell->tds_data().mark_processed(); + CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles())) + CGAL_assertion(!is_non_manifold(v)); - for(int fid=0; fid<4; ++fid) - { - const Cell_handle neighbor = cell->neighbor(fid); - if(neighbor->info().is_outside) - { - // There shouldn't be any artificial vertex on the inside/outside boundary - // (past initialization) -// CGAL_assertion(cell->vertex((fid + 1)&3)->info() == DEFAULT); -// CGAL_assertion(cell->vertex((fid + 2)&3)->info() == DEFAULT); -// CGAL_assertion(cell->vertex((fid + 3)&3)->info() == DEFAULT); - - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 0))); - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 1))); - points.push_back(m_dt.point(cell, Dt::vertex_triple_index(fid, 2))); - faces.push_back({idx, idx + 1, idx + 2}); - idx += 3; - } - else - { - to_visit.push(neighbor); - } - } - } + clear(output_mesh); - PMP::duplicate_non_manifold_edges_in_polygon_soup(points, faces); + std::vector points; + std::vector > faces; + extract_boundary(points, faces); - CGAL_assertion(PMP::is_polygon_soup_a_polygon_mesh(faces)); - PMP::polygon_soup_to_polygon_mesh(points, faces, output_mesh, - CGAL::parameters::default_values(), - CGAL::parameters::vertex_point_map(ovpm)); + if(faces.empty()) + { +#ifdef CGAL_AW3_DEBUG + std::cout << "Empty wrap?..." << std::endl; +#endif + return; + } - PMP::stitch_borders(output_mesh, CGAL::parameters::vertex_point_map(ovpm)); - CGAL_assertion(is_closed(output_mesh)); + if(!PMP::is_polygon_soup_a_polygon_mesh(faces)) + { + CGAL_warning_msg(false, "Failed to extract a manifold boundary!"); + return; } - for(auto cit=m_dt.finite_cells_begin(), cend=m_dt.finite_cells_end(); cit!=cend; ++cit) - cit->tds_data().clear(); + PMP::polygon_soup_to_polygon_mesh(points, faces, output_mesh, + CGAL::parameters::default_values(), + CGAL::parameters::vertex_point_map(ovpm)); CGAL_postcondition(!is_empty(output_mesh)); CGAL_postcondition(is_valid_polygon_mesh(output_mesh)); CGAL_postcondition(is_closed(output_mesh)); - - PMP::orient_to_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm)); + CGAL_postcondition(PMP::does_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm))); } template - void extract_manifold_surface(OutputMesh& output_mesh, - OVPM ovpm) const + void extract_possibly_non_manifold_surface(OutputMesh& output_mesh, + OVPM ovpm) const { namespace PMP = Polygon_mesh_processing; + using vertex_descriptor = typename boost::graph_traits::vertex_descriptor; + using halfedge_descriptor = typename boost::graph_traits::halfedge_descriptor; + using face_descriptor = typename boost::graph_traits::face_descriptor; + #ifdef CGAL_AW3_DEBUG - std::cout << "> Extract wrap... ()" << std::endl; + std::cout << "> Extract possibly non-manifold wrap... ()" << std::endl; #endif - CGAL_assertion_code(for(Vertex_handle v : m_dt.finite_vertex_handles())) - CGAL_assertion(!is_non_manifold(v)); - clear(output_mesh); - // boundary faces to polygon soup std::vector points; - std::vector > faces; + std::vector > polygons; - std::unordered_map vertex_to_id; - std::size_t nv = 0; + // Explode the polygon soup into indepent triangles, and stitch back edge by edge by walking along the exterior + std::map facet_ids; + std::size_t idx = 0; - for(auto fit=m_dt.finite_facets_begin(), fend=m_dt.finite_facets_end(); fit!=fend; ++fit) + for(auto fit=m_dt.all_facets_begin(), fend=m_dt.all_facets_end(); fit!=fend; ++fit) { Facet f = *fit; if(!f.first->info().is_outside) f = m_dt.mirror_facet(f); - const Cell_handle c = f.first; + const Cell_handle ch = f.first; const int s = f.second; - const Cell_handle nh = c->neighbor(s); - if(c->info().is_outside == nh->info().is_outside) + const Cell_handle nh = ch->neighbor(s); + if(ch->info().is_outside == nh->info().is_outside) continue; - std::array ids; - for(int pos=0; pos<3; ++pos) - { - Vertex_handle vh = c->vertex(Dt::vertex_triple_index(s, pos)); - auto insertion_res = vertex_to_id.emplace(vh, nv); - if(insertion_res.second) // successful insertion, never-seen-before vertex - { - points.push_back(m_dt.point(vh)); - ++nv; - } + facet_ids[f] = idx / 3; - ids[pos] = insertion_res.first->second; - } + points.push_back(m_dt.point(ch, Dt::vertex_triple_index(s, 0))); + points.push_back(m_dt.point(ch, Dt::vertex_triple_index(s, 1))); + points.push_back(m_dt.point(ch, Dt::vertex_triple_index(s, 2))); + polygons.push_back({idx, idx + 1, idx + 2}); - faces.emplace_back(std::array{ids[0], ids[1], ids[2]}); + idx += 3; } - if(faces.empty()) - return; - - if(!PMP::is_polygon_soup_a_polygon_mesh(faces)) + if(polygons.empty()) { - CGAL_warning_msg(false, "Could NOT extract mesh..."); +#ifdef CGAL_AW3_DEBUG + std::cout << "Empty wrap?..." << std::endl; +#endif return; } - PMP::polygon_soup_to_polygon_mesh(points, faces, output_mesh, - CGAL::parameters::default_values(), + CGAL_assertion(PMP::is_polygon_soup_a_polygon_mesh(polygons)); + + std::unordered_map i2f; + PMP::polygon_soup_to_polygon_mesh(points, polygons, output_mesh, + CGAL::parameters::polygon_to_face_output_iterator(std::inserter(i2f, i2f.end())), CGAL::parameters::vertex_point_map(ovpm)); + auto face_to_facet = get(CGAL::dynamic_face_property_t(), output_mesh); + + idx = 0; + for(auto fit=m_dt.all_facets_begin(), fend=m_dt.all_facets_end(); fit!=fend; ++fit) + { + Facet f = *fit; + if(!f.first->info().is_outside) + f = m_dt.mirror_facet(f); + + const Cell_handle ch = f.first; + const int s = f.second; + const Cell_handle nh = ch->neighbor(s); + if(ch->info().is_outside == nh->info().is_outside) + continue; + + put(face_to_facet, i2f[idx++], f); + } + + // grab the stitchable halfedges + std::vector > to_stitch; + + for(face_descriptor f : faces(output_mesh)) + { + const Facet& tr_f = get(face_to_facet, f); + const Cell_handle ch = tr_f.first; + CGAL_assertion(ch->info().is_outside); + + for(halfedge_descriptor h : halfedges_around_face(halfedge(f, output_mesh), output_mesh)) + { + const vertex_descriptor sv = source(h, output_mesh); + const vertex_descriptor tv = target(h, output_mesh); + + // only need the pair of halfedges once + if(get(ovpm, sv) > get(ovpm, tv)) + continue; + + // One could avoid these point comparisons by using the fact that we know that the graph + // has faces built in a specific order (through BGL::add_face()), but it's better to make + // this code more generic (and it is not very costly). + auto graph_descriptor_to_triangulation_handle = [&](const vertex_descriptor v) + { + const Point_3& p = get(ovpm, v); + for(int i=0; i<4; ++i) + if(ch->vertex(i)->point() == p) + return ch->vertex(i); + + CGAL_assertion(false); + return Vertex_handle(); + }; + + const Vertex_handle s_vh = graph_descriptor_to_triangulation_handle(sv); + const Vertex_handle t_vh = graph_descriptor_to_triangulation_handle(tv); + CGAL_assertion(get(ovpm, sv) == m_dt.point(s_vh)); + CGAL_assertion(get(ovpm, tv) == m_dt.point(t_vh)); + + const int facet_third_id = 6 - (ch->index(s_vh) + ch->index(t_vh) + tr_f.second); // 0 + 1 + 2 + 3 = 6 + Vertex_handle third_vh = ch->vertex(facet_third_id); + + // walk around the edge (in the exterior of the wrap) till meeting an inside cell + Cell_handle start_ch = ch, curr_ch = ch; + do + { + const int i = curr_ch->index(s_vh); + const int j = curr_ch->index(t_vh); + + // the facet is incident to the outside cell, and we walk in the exterior + const int facet_third_id = 6 - (curr_ch->index(s_vh) + curr_ch->index(t_vh) + curr_ch->index(third_vh)); + third_vh = curr_ch->vertex(facet_third_id); + curr_ch = curr_ch->neighbor(Dt::next_around_edge(i,j)); + + if(!curr_ch->info().is_outside) + break; + } + while(curr_ch != start_ch); + + CGAL_assertion(curr_ch != start_ch); + CGAL_assertion(!curr_ch->info().is_outside); + + const int opp_id = 6 - (curr_ch->index(s_vh) + curr_ch->index(t_vh) + curr_ch->index(third_vh)); + const Facet tr_f2 = m_dt.mirror_facet(Facet(curr_ch, opp_id)); + CGAL_assertion(facet_ids.count(Facet(curr_ch, opp_id)) == 0); + CGAL_assertion(tr_f2.first->info().is_outside); + CGAL_assertion(tr_f2.first->neighbor(tr_f2.second) == curr_ch); + CGAL_assertion(tr_f2.first->has_vertex(s_vh) && tr_f2.first->has_vertex(t_vh)); + + const face_descriptor f2 = i2f[facet_ids.at(tr_f2)]; + halfedge_descriptor h2 = halfedge(f2, output_mesh), done = h2; + while(get(ovpm, target(h2, output_mesh)) != get(ovpm, source(h, output_mesh))) + { + h2 = next(h2, output_mesh); + CGAL_assertion(h2 != done); + if(h2 == done) + break; + } + + CGAL_assertion(get(ovpm, source(h, output_mesh)) == get(ovpm, target(h2, output_mesh))); + CGAL_assertion(get(ovpm, target(h, output_mesh)) == get(ovpm, source(h2, output_mesh))); + CGAL_assertion(get(ovpm, target(next(h2, output_mesh), output_mesh)) == m_dt.point(third_vh)); + + to_stitch.emplace_back(opposite(h, output_mesh), opposite(h2, output_mesh)); + } + } + + PMP::internal::stitch_halfedge_range(to_stitch, output_mesh, ovpm); + + collect_garbage(output_mesh); + CGAL_postcondition(!is_empty(output_mesh)); CGAL_postcondition(is_valid_polygon_mesh(output_mesh)); CGAL_postcondition(is_closed(output_mesh)); - - PMP::orient_to_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm)); + CGAL_postcondition(PMP::does_bound_a_volume(output_mesh, CGAL::parameters::vertex_point_map(ovpm))); } +public: template void extract_surface(OutputMesh& output_mesh, OVPM ovpm, From 4d50ec46b361ca0c912f3725d91fe673ff6ed869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:53:12 +0200 Subject: [PATCH 0749/1398] Consider all cases in facet_status In a normal run of the algorithm, we shall never ask the facet status of a facet that is already outside, but it's better to be complete and it costs nothing. --- .../include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 6e8e323e85a9..7c48a51ba6c5 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1027,6 +1027,15 @@ class Alpha_wrap_3 // skip if neighbor is OUTSIDE or infinite const Cell_handle ch = f.first; const int id = f.second; + + if(!ch->info().is_outside) + { +#ifdef CGAL_AW3_DEBUG_FACET_STATUS + std::cout << "Facet is inside" << std::endl; +#endif + return IRRELEVANT; + } + const Cell_handle nh = ch->neighbor(id); if(m_dt.is_infinite(nh)) return TRAVERSABLE; From bff07b2fc9ef0c26209475deae428ed77c29fecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:55:11 +0200 Subject: [PATCH 0750/1398] Simplify the gate comparer: we can also sort artificial facets like normal facets Artificial facets are *not* infinite facets. --- .../include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h index 8d63e34c9e3b..824d27bc2c10 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h @@ -68,11 +68,6 @@ struct Less_gate template bool operator()(const Gate& a, const Gate& b) const { - // @fixme? make it a total order by comparing addresses if both gates are bbox facets - if(a.is_artificial_facet()) - return true; - else if(b.is_artificial_facet()) - return false; return a.priority() > b.priority(); } }; From 5304f739b9f4e26c49630a1fe2970e5c5711b20e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:57:02 +0200 Subject: [PATCH 0751/1398] Enable restarting from a previous wrap --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 82 ++++++++++++++++--- .../internal/parameters_interface.h | 1 + 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 7c48a51ba6c5..9a0ee2ddb619 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -176,8 +176,8 @@ class Alpha_wrap_3 Oracle m_oracle; SC_Iso_cuboid_3 m_bbox; - FT m_alpha, m_sq_alpha; - FT m_offset, m_sq_offset; + FT m_alpha = FT(-1), m_sq_alpha = FT(-1); + FT m_offset = FT(-1), m_sq_offset = FT(-1); Dt m_dt; Alpha_PQ m_queue; @@ -268,6 +268,20 @@ class Alpha_wrap_3 const bool do_enforce_manifoldness = choose_parameter(get_parameter(in_np, internal_np::do_enforce_manifoldness), true); + // This parameter enables avoiding recomputing the triangulation from scratch when wrapping + // the same meshes for multiple values of alpha (and typically the same offset values). + // + // /!\ Warning /!\ + // + // If this is enabled, the 3D triangulation will NEVER be cleared and re-initialized + // at launch. This means that the triangulation is NOT cleared, even when: + // - the triangulation is empty; you will get nothing. + // - you use an alpha value that is greater than what was used in a previous run; you will + // obtain a denser result than what you might expect. + // - you use a different offset value between runs, you might then get points that are not + // on the offset surface corresponding to your latter offset value. + const bool resuming = choose_parameter(get_parameter(in_np, internal_np::refine_triangulation), false); + #ifdef CGAL_AW3_TIMER CGAL::Real_timer t; t.start(); @@ -275,7 +289,7 @@ class Alpha_wrap_3 visitor.on_alpha_wrapping_begin(*this); - if(!initialize(alpha, offset, seeds)) + if(!initialize(alpha, offset, seeds, resuming)) return; #ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP @@ -648,6 +662,35 @@ class Alpha_wrap_3 return true; } + // This function is used in the case of resumption of a previous run: m_dt is not cleared, + // and we fill the queue with the new parameters. + bool initialize_from_existing_triangulation() + { + std::cout << "restart from a DT of " << m_dt.number_of_cells() << " cells" << std::endl; + + Real_timer t; + t.start(); + + for(Cell_handle ch : m_dt.all_cell_handles()) + { + if(!ch->info().is_outside) + continue; + + for(int i=0; i<4; ++i) + { + if(ch->neighbor(i)->info().is_outside) + continue; + + push_facet(std::make_pair(ch, i)); + } + } + + t.stop(); + std::cout << t.time() << " for scanning" << std::endl; + + return true; + } + private: void extract_boundary(std::vector& points, std::vector >& faces) const @@ -1105,7 +1148,8 @@ class Alpha_wrap_3 template bool initialize(const double alpha, const double offset, - const SeedRange& seeds) + const SeedRange& seeds, + const bool resuming = false) { #ifdef CGAL_AW3_DEBUG std::cout << "> Initialize..." << std::endl; @@ -1121,20 +1165,38 @@ class Alpha_wrap_3 return false; } + if(resuming) + { + if(offset != m_offset) + { +#ifdef CGAL_AW3_DEBUG + std::cerr << "Warning: resuming with a different offset!" << std::endl; +#endif + } + } + m_alpha = FT(alpha); m_sq_alpha = square(m_alpha); m_offset = FT(offset); m_sq_offset = square(m_offset); - m_dt.clear(); m_queue.clear(); - insert_bbox_corners(); - - if(seeds.empty()) - return initialize_from_infinity(); + if(resuming) + { + return initialize_from_existing_triangulation(); + } else - return initialize_with_cavities(seeds); + { + m_dt.clear(); + + insert_bbox_corners(); + + if(seeds.empty()) + return initialize_from_infinity(); + else + return initialize_with_cavities(seeds); + } } template 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 7792ad5cdb60..435075df6e2a 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -237,6 +237,7 @@ CGAL_add_named_parameter(smooth_constrained_edges_t, smooth_constrained_edges, s // List of named parameters used in Alpha_wrap_3 CGAL_add_named_parameter(do_enforce_manifoldness_t, do_enforce_manifoldness, do_enforce_manifoldness) CGAL_add_named_parameter(seed_points_t, seed_points, seed_points) +CGAL_add_named_parameter(refine_triangulation_t, refine_triangulation, refine_triangulation) // SMDS_3 parameters CGAL_add_named_parameter(surface_facets_t, surface_facets, surface_facets) From 36017331c2e12a62a055943732b1cfed4d128eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:58:30 +0200 Subject: [PATCH 0752/1398] Add an example of successive AW3 restarts --- .../examples/Alpha_wrap_3/CMakeLists.txt | 1 + .../Alpha_wrap_3/successive_wraps.cpp | 151 ++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt index 2014b9baa7ca..11dec5f4134d 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/CMakeLists.txt @@ -12,3 +12,4 @@ create_single_source_cgal_program("triangle_soup_wrap.cpp") create_single_source_cgal_program("point_set_wrap.cpp") create_single_source_cgal_program("wrap_from_cavity.cpp") create_single_source_cgal_program("mixed_inputs_wrap.cpp") +create_single_source_cgal_program("successive_wraps.cpp") diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp new file mode 100644 index 000000000000..600d533ee411 --- /dev/null +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp @@ -0,0 +1,151 @@ +#define CGAL_AW3_TIMER + +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace PMP = CGAL::Polygon_mesh_processing; + +using K = CGAL::Exact_predicates_inexact_constructions_kernel; +using FT = K::FT; +using Point_3 = K::Point_3; + +using Mesh = CGAL::Surface_mesh; + +// We want decreasing alphas, and these are relative ratios, so they need to be increasing +const std::vector relative_alphas = { 1, 2/*50, 100, 150, 200, 250*/ }; +const FT relative_offset = 600; + +int main(int argc, char** argv) +{ + std::cout.precision(17); + std::cerr.precision(17); + + // Read the input + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cube.off"); + std::cout << "Reading " << filename << "..." << std::endl; + + Mesh mesh; + if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh)) + { + std::cerr << "Invalid input." << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Input: " << num_vertices(mesh) << " vertices, " << num_faces(mesh) << " faces" << std::endl; + + const CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(mesh); + const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); + + // =============================================================================================== + // Naive approach: + + CGAL::Real_timer t; + double total_time = 0.; + + for(std::size_t i=0; i>> [" << i << "] alpha: " << alpha << " offset: " << offset << std::endl; + + Mesh wrap; + CGAL::alpha_wrap_3(mesh, alpha, offset, wrap, + CGAL::parameters::do_enforce_manifoldness(false)); + + t.stop(); + std::cout << " Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl; + std::cout << " Elapsed time: " << t.time() << " s." << std::endl; + + std::string input_name = std::string(filename); + input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); + input_name = input_name.substr(0, input_name.find_last_of(".")); + std::string output_name = input_name + + "_" + std::to_string(static_cast(relative_alphas[i])) + + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + std::cout << "Writing to " << output_name << std::endl; + CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); + + total_time += t.time(); + } + + std::cout << "Total elapsed time (naive): " << total_time << " s.\n" << std::endl; + + // =============================================================================================== + // Re-use approach + // + // Here, we restart from the triangulation of the previous state, and carve according + // to a (smaller) alpha value. This enables considerable speed-up: the cumulated time taken + // to run `n` successive instances of `{alpha_wrap(alpha_i)}_(i=1...n)` will be equal to the + // time taken to run alpha_wrap(alpha_n) from scratch. + // + // For example: + // naive: + // alpha_wrap(alpha_1, ...) ---> 2s + // alpha_wrap(alpha_2, ...) ---> 4s + // alpha_wrap(alpha_3, ...) ---> 8s + // will become with reusability: + // alpha_wrap(alpha_1, ..., reuse) ---> 2s + // alpha_wrap(alpha_2, ..., reuse) ---> 2s // 2+2 = 4s = naive alpha_2 + // alpha_wrap(alpha_3, ..., reuse) ---> 4s // 2+2+4 = 8s = naive alpha_3 + // Thus, if we care about the intermediate results, we save 6s (8s instead of 14s). + // The speed-up increases with the number of intermediate results, and if the alpha values + // are close. + // + // !! Warning !! + // The result of alpha_wrap(alpha_1, ...) followed by alpha_wrap(alpha_2, ...) with alpha_2 + // smaller than alpha_1 is going to be close but NOT exactly equal to that produced by calling + // alpha_wrap(alpha_2, ...) directly. + + total_time = 0.; + t.reset(); + + using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_mesh_oracle; + using Wrapper = CGAL::Alpha_wraps_3::internal::Alpha_wrap_3; + Wrapper wrapper; // contains the triangulation that is being refined iteratively + + for(std::size_t i=0; i>> [" << i << "] alpha: " << alpha << " offset: " << offset << std::endl; + + // The triangle mesh oracle can be initialized with alpha to internally perform a split + // of too-big facets while building the AABB Tree. This split in fact yields a significant + // speed-up for meshes with elements that are large compared to alpha. This speed-up makes it + // faster to re-build the AABB tree for every value of alpha than to use a non-optimized tree. + Oracle oracle(alpha); + oracle.add_triangle_mesh(mesh, CGAL::parameters::default_values()); + wrapper.oracle() = oracle; + + Mesh wrap; + wrapper(alpha, offset, wrap, + CGAL::parameters::do_enforce_manifoldness(false) + .refine_triangulation((i != 0))); + + t.stop(); + std::cout << " Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl; + std::cout << " Elapsed time: " << t.time() << " s." << std::endl; + + total_time += t.time(); + } + + std::cout << "Total elapsed time (successive): " << total_time << " s." << std::endl; + + return EXIT_SUCCESS; +} From 19cb693a1b9ff119593057c76402493b03e474e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 12:59:46 +0200 Subject: [PATCH 0753/1398] Improve debug code --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 84 +++++++++++++------ 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 9a0ee2ddb619..0579297c4335 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1053,6 +1053,24 @@ class Alpha_wrap_3 TRAVERSABLE }; + inline const char* get_status_message(const Facet_queue_status status) + { + constexpr std::size_t status_count = 3; + + // Messages corresponding to Error_code list above. Must be kept in sync! + static const char* message[status_count] = { + "Irrelevant facet", + "Artificial facet", + "Traversable facet" + }; + + if(status > status_count || status < 0) + return "Unknown status"; + else + return message[status]; + } + +public: // @speed some decent time may be spent constructing Facet (pairs) for no reason as it's always // just to grab the .first and .second as soon as it's constructed, and not due to API requirements // e.g. from DT3 @@ -1062,9 +1080,9 @@ class Alpha_wrap_3 #ifdef CGAL_AW3_DEBUG_FACET_STATUS std::cout << "facet status: " - << f.first->vertex((f.second + 1)&3)->point() << " " - << f.first->vertex((f.second + 2)&3)->point() << " " - << f.first->vertex((f.second + 3)&3)->point() << std::endl; + << m_dt.point(f.first, Dt::vertex_triple_index(f.second, 0)) << " " + << m_dt.point(f.first, Dt::vertex_triple_index(f.second, 1)) << " " + << m_dt.point(f.first, Dt::vertex_triple_index(f.second, 2)) << std::endl; #endif // skip if neighbor is OUTSIDE or infinite @@ -1119,6 +1137,7 @@ class Alpha_wrap_3 return IRRELEVANT; } +private: bool push_facet(const Facet& f) { CGAL_precondition(f.first->info().is_outside); @@ -1127,19 +1146,29 @@ class Alpha_wrap_3 if(m_queue.contains_with_bounds_check(Gate(f))) return false; - const Facet_queue_status s = facet_status(f); - if(s == IRRELEVANT) + const Facet_queue_status status = facet_status(f); + if(status == IRRELEVANT) return false; const Cell_handle ch = f.first; - const int id = f.second; - const Point_3& p0 = m_dt.point(ch, (id+1)&3); - const Point_3& p1 = m_dt.point(ch, (id+2)&3); - const Point_3& p2 = m_dt.point(ch, (id+3)&3); + const int s = f.second; + const Point_3& p0 = m_dt.point(ch, Dt::vertex_triple_index(s, 0)); + const Point_3& p1 = m_dt.point(ch, Dt::vertex_triple_index(s, 1)); + const Point_3& p2 = m_dt.point(ch, Dt::vertex_triple_index(s, 2)); - // @todo should prob be the real value we compare to alpha instead of squared_radius + // @todo should prob be the real value that we compare to alpha instead of squared_radius const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2); - m_queue.resize_and_push(Gate(f, sqr, (s == ARTIFICIAL_FACET))); + m_queue.resize_and_push(Gate(f, sqr, (status == ARTIFICIAL_FACET))); + +#ifdef CGAL_AW3_DEBUG_QUEUE + static int gid = 0; + std::cout << "Queue insertion #" << gid++ << "\n" + << " ch = " << &*ch << " (" << m_dt.is_infinite(ch) << ") " << "\n" + << "\t" << p0 << "\n\t" << p1 << "\n\t" << p2 << std::endl; + std::cout << " Status: " << get_status_message(status) << std::endl; + std::cout << " SQR: " << sqr << std::endl; + std::cout << " Artificiality: " << (status == ARTIFICIAL_FACET) << std::endl; +#endif return true; } @@ -1160,7 +1189,7 @@ class Alpha_wrap_3 if(!is_positive(alpha) || !is_positive(offset)) { #ifdef CGAL_AW3_DEBUG - std::cout << "Error: invalid input parameters" << std::endl; + std::cerr << "Error: invalid input parameters: " << alpha << " and" << offset << std::endl; #endif return false; } @@ -1230,7 +1259,9 @@ class Alpha_wrap_3 std::cout << m_queue.size() << " facets in the queue" << std::endl; std::cout << "Face " << fid++ << "\n" << "c = " << &*ch << " (" << m_dt.is_infinite(ch) << "), n = " << &*neighbor << " (" << m_dt.is_infinite(neighbor) << ")" << "\n" - << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl; + << m_dt.point(ch, Dt::vertex_triple_index(id, 0)) << "\n" + << m_dt.point(ch, Dt::vertex_triple_index(id, 1)) << "\n" + << m_dt.point(ch, Dt::vertex_triple_index(id, 2)) << std::endl; std::cout << "Priority: " << gate.priority() << std::endl; #endif @@ -1246,7 +1277,9 @@ class Alpha_wrap_3 std::string face_name = "results/steps/face_" + std::to_string(static_cast(i++)) + ".xyz"; std::ofstream face_out(face_name); face_out.precision(17); - face_out << "3\n" << m_dt.point(ch, (id+1)&3) << "\n" << m_dt.point(ch, (id+2)&3) << "\n" << m_dt.point(ch, (id+3)&3) << std::endl; + face_out << "3\n" << m_dt.point(ch, Dt::vertex_triple_index(id, 0)) << "\n" + << m_dt.point(ch, Dt::vertex_triple_index(id, 1)) << "\n" + << m_dt.point(ch, Dt::vertex_triple_index(id, 2)) << std::endl; face_out.close(); #endif @@ -1373,7 +1406,7 @@ class Alpha_wrap_3 inc_cells.reserve(64); m_dt.incident_cells(v, std::back_inserter(inc_cells)); - // Flood one inside and outside CC. + // Flood one inside and outside CC within the cell umbrella of the vertex. // Process both an inside and an outside CC to also detect edge pinching. // If there are still unprocessed afterwards, there is a non-manifoldness issue. // @@ -1664,7 +1697,8 @@ class Alpha_wrap_3 private: void check_queue_sanity() { - std::cout << "Check queue sanity..." << std::endl; + std::cout << "\t~~~ Check queue sanity ~~~" << std::endl; + std::vector queue_gates; Gate previous_top_gate = m_queue.top(); while(!m_queue.empty()) @@ -1674,15 +1708,16 @@ class Alpha_wrap_3 const Facet& current_f = current_gate.facet(); const Cell_handle ch = current_f.first; const int id = current_f.second; - const Point_3& p0 = m_dt.point(ch, (id+1)&3); - const Point_3& p1 = m_dt.point(ch, (id+2)&3); - const Point_3& p2 = m_dt.point(ch, (id+3)&3); + const Point_3& p0 = m_dt.point(ch, Dt::vertex_triple_index(id, 0)); + const Point_3& p1 = m_dt.point(ch, Dt::vertex_triple_index(id, 1)); + const Point_3& p2 = m_dt.point(ch, Dt::vertex_triple_index(id, 2)); const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2); - std::cout << "At Facet with VID " << get(Gate_ID_PM
    (), current_gate) << std::endl; - - if(current_gate.priority() != sqr) - std::cerr << "Error: facet in queue has wrong priority" << std::endl; + std::cout << "At Facet with VID " << get(Gate_ID_PM
    (), current_gate) << "\n"; + std::cout << "\t" << p0 << "\n\t" << p1 << "\n\t" << p2 << "\n"; + std::cout << " Artificiality: " << current_gate.is_artificial_facet() << "\n"; + std::cout << " SQR: " << sqr << "\n"; + std::cout << " Priority " << current_gate.priority() << std::endl; if(Less_gate()(current_gate, previous_top_gate)) std::cerr << "Error: current gate has higher priority than the previous top" << std::endl; @@ -1691,7 +1726,8 @@ class Alpha_wrap_3 m_queue.pop(); } - std::cout << "End sanity check" << std::endl; + + std::cout << "\t~~~ End queue sanity check ~~~" << std::endl; // Rebuild CGAL_assertion(m_queue.empty()); From 029d7a8fba55237bcdc8d608c40d79d0ec5273ab Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 20 Sep 2023 16:50:48 +0200 Subject: [PATCH 0754/1398] fix test/Installation tests on Windows --- Installation/test/Installation/CMakeLists.txt | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index 5a22a7c42333..db725c17645f 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -7,32 +7,16 @@ project( Installation_Tests ) macro(create_link_to_program COMPONENT) - add_executable(link_to_${COMPONENT} link_to_${COMPONENT}.cpp) - - include_directories(${${COMPONENT}_3RD_PARTY_INCLUDE_DIRS}) - - add_definitions(${${COMPONENT}_3RD_PARTY_DEFINITIONS}) - - link_directories(${${COMPONENT}_3RD_PARTY_LIBRARIES_DIRS}) - - # Link the executable to CGAL and third-party libraries - if(CGAL_AUTO_LINK_ENABLED OR CGAL_HEADER_ONLY) - target_link_libraries(link_to_${COMPONENT} ${CGAL_3RD_PARTY_LIBRARIES} - ${${COMPONENT}_3RD_PARTY_LIBRARIES}) - else() - target_link_libraries( - link_to_${COMPONENT} CGAL::${COMPONENT} ${CGAL_3RD_PARTY_LIBRARIES} - ${${COMPONENT}_3RD_PARTY_LIBRARIES}) - endif() - + target_link_libraries(link_to_${COMPONENT} CGAL::${COMPONENT}) add_to_cached_list(CGAL_EXECUTABLE_TARGETS link_to_${COMPONENT}) - + CGAL_add_test(link_to_${COMPONENT}) endmacro() find_package(CGAL REQUIRED COMPONENTS Core) include(CGAL_CreateSingleSourceCGALProgram) +include(CGAL_SetupGMP) create_single_source_cgal_program("endian.cpp") @@ -68,6 +52,7 @@ if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Windows) target_link_libraries(display_dll_version_info version) add_executable(test_gmp_mpfr_dll test_gmp_mpfr_dll.cpp) target_link_libraries(test_gmp_mpfr_dll version) + use_CGAL_GMP_support(test_gmp_mpfr_dll) CGAL_add_test(test_gmp_mpfr_dll) add_to_cached_list( CGAL_EXECUTABLE_TARGETS test_gmp_mpfr_dll ) string(RANDOM RDM_DIR)#5 random chars to avoid conflicts in parallel testsuites From d092d4b0e3a7669f980ef675375754154ab38653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 14:34:36 +0200 Subject: [PATCH 0755/1398] Reformulate a cross product to increase precision --- .../edge_collapse_surface_mesh.cpp | 10 +- .../include/CGAL/Cartesian/MatrixC33.h | 7 ++ .../internal/Lindstrom_Turk_core.h | 98 ++++++++++++++++++- .../internal/Common.h | 5 +- 4 files changed, 112 insertions(+), 8 deletions(-) diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp index d21417d98295..3e88f4b090df 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp @@ -16,10 +16,12 @@ namespace SMS = CGAL::Surface_mesh_simplification; int main(int argc, char** argv) { + std::cout.precision(17); + std::cerr.precision(17); + Surface_mesh surface_mesh; const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/cube-meshed.off"); - std::ifstream is(filename); - if(!is || !(is >> surface_mesh)) + if(!CGAL::IO::read_polygon_mesh(filename, surface_mesh)) { std::cerr << "Failed to read input mesh: " << filename << std::endl; return EXIT_FAILURE; @@ -33,6 +35,8 @@ int main(int argc, char** argv) std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + std::cout << num_vertices(surface_mesh) << " vertices, " << num_edges(surface_mesh) << " edges (BEFORE)" << std::endl; + // In this example, the simplification stops when the number of undirected edges // drops below 10% of the initial count double stop_ratio = (argc > 2) ? std::stod(argv[2]) : 0.1; @@ -45,7 +49,7 @@ int main(int argc, char** argv) std::cout << "\nFinished!\n" << r << " edges removed.\n" << surface_mesh.number_of_edges() << " final edges.\n"; std::cout << "Time elapsed: " << std::chrono::duration_cast(end_time - start_time).count() << "ms" << std::endl; - CGAL::IO::write_polygon_mesh((argc > 3) ? argv[3] : "out.off", surface_mesh, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_mesh((argc > 3) ? argv[3] : "out_SC.off", surface_mesh, CGAL::parameters::stream_precision(17)); return EXIT_SUCCESS; } diff --git a/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h b/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h index 7cc2858020b3..3c24abbc3c24 100644 --- a/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h +++ b/Surface_mesh_simplification/include/CGAL/Cartesian/MatrixC33.h @@ -131,6 +131,13 @@ class MatrixC33 return Vector_3(v*m.r0(), v*m.r1(), v*m.r2()); } + friend std::ostream& operator<<(std::ostream & os, const MatrixC33& m) +{ + return os << m.r0() << std::endl + << m.r1() << std::endl + << m.r2() << std::endl; +} + RT determinant() const { return CGAL::determinant(r0().x(), r0().y(), r0().z(), diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index 59002f636814..dd901c8d89ae 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -13,6 +13,8 @@ #include +#include + #include #include #include @@ -119,9 +121,103 @@ private : const Geom_traits& geom_traits() const { return mProfile.geom_traits(); } const TM& surface() const { return mProfile.surface(); } +#if 0 + // a*b - c*d + // The next two functions are from https://stackoverflow.com/questions/63665010/accurate-floating-point-computation-of-the-sum-and-difference-of-two-products + static double diff_of_products_kahan(const double a, const double b, const double c, const double d) + { + double w = d * c; + double e = std::fma(c, -d, w); + double f = std::fma(a, b, -w); + return f + e; + } + + static double diff_of_products_cht(const double a, const double b, const double c, const double d) + { + double p1 = a * b; + double p2 = c * d; + double e1 = std::fma (a, b, -p1); + double e2 = std::fma (c, -d, p2); + double r = p1 - p2; + double e = e1 + e2; + return r + e; + } + + static double diff_of_products(const double a, const double b, const double c, const double d) + { + // the next two are equivalent in results and speed + return diff_of_products_kahan(a, b, c, d); + // return diff_of_products_cht(a, b, c, d); + } + + template + static OFT diff_of_products(const OFT& a, const OFT& b, const OFT& c, const OFT& d) + { + return a*b - c*d; + } +#endif + + static Vector SL_cross_product(const Vector& a, const Vector& b) + { + const FT ax=a.x(), ay=a.y(), az=a.z(); + const FT bx=b.x(), by=b.y(), bz=b.z(); + + auto minor = [](double ai, double bi, double aj, double bj) + { + // The main idea is that we expect ai and bi (and aj and bj) to have roughly the same magnitude + // since this function is used to compute the cross product of two vectors that are defined + // as (ORIGIN, pa) and (ORIGIN, pb) and pa and pb are part of the same triangle. + // + // We can abuse this fact to trade 2 extra subtractions to lower the error. + return ai * (bj - aj) + aj * (ai - bi); + }; + + // ay* + FT x = minor(ay, by, az, bz); + FT y = minor(az, bz, ax, bx); + FT z = minor(ax, bx, ay, by); + + return Vector(x, y, z); + } + +#if 0 + static Vector exact_cross_product(const Vector& a, const Vector& b) + { + CGAL::Cartesian_converter to_exact; + CGAL::Cartesian_converter to_approx; + auto exv = cross_product(to_exact(a), to_exact(b)); + exv.exact(); + return to_approx(exv); + } +#endif + + static Vector X_product(const Vector& u, const Vector& v) + { +#if 0 + // this can create large errors and spiky meshes for kernels with inexact constructions + return CGAL::cross_product(u,v); +#elif 0 + // improves the problem mentioned above a bit, but not enough + return { std::fma(u.y(), v.z(), -u.z()*v.y()), + std::fma(u.z(), v.x(), -u.x()*v.z()), + std::fma(u.x(), v.y(), -u.y()*v.x()) }; +#elif 0 + // this is the best without resorting to exact, but it inflicts a 20% slowdown + return { diff_of_products(u.y(), v.z(), u.z(), v.y()), + diff_of_products(u.z(), v.x(), u.x(), v.z()), + diff_of_products(u.x(), v.y(), u.y(), v.x()) }; +#elif 1 + // balanced solution based on abusing the fact that here we expect u and v to have similar coordinates + return SL_cross_product(u, v); +#elif 0 + // obviously too slow + return exact_cross_product(u, v); +#endif + } + static Vector point_cross_product(const Point& a, const Point& b) { - return cross_product(a-ORIGIN, b-ORIGIN); + return X_product(a-ORIGIN, b-ORIGIN); } // This is the (uX)(Xu) product described in the Lindstrom-Turk paper diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h index 4ed45a02d1e6..5255a0b53591 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h @@ -114,10 +114,7 @@ inline std::string optional_to_string(const std::optional& o) { namespace internal { namespace { bool cgal_enable_sms_trace = true; } } #define CGAL_SMS_TRACE_IMPL(m) \ - if(::internal::cgal_enable_sms_trace) { \ - std::ostringstream ss; ss << m; std::string s = ss.str(); \ - /*Surface_simplification_external_trace(s)*/ std::cerr << s << std::endl; \ - } + std::cerr << m << std::endl; #define CGAL_SMS_DEBUG_CODE(code) code #else From 985c8a7825ed3d0d2289825c199274f37f36b795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 16:58:59 +0200 Subject: [PATCH 0756/1398] Add a test --- .../CMakeLists.txt | 1 + .../data/far_xy.off | 90 +++++++++++++++++++ .../test_edge_collapse_stability.cpp | 71 +++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 Surface_mesh_simplification/test/Surface_mesh_simplification/data/far_xy.off create mode 100644 Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_stability.cpp diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt b/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt index 2f55474593af..9c1e010e5efb 100644 --- a/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/CMakeLists.txt @@ -12,6 +12,7 @@ create_single_source_cgal_program("test_edge_collapse_Envelope.cpp") create_single_source_cgal_program("test_edge_collapse_Polyhedron_3.cpp") create_single_source_cgal_program("test_edge_profile_link.cpp") create_single_source_cgal_program("test_edge_deprecated_stop_predicates.cpp") +create_single_source_cgal_program("test_edge_collapse_stability.cpp") find_package(Eigen3 3.1.0 QUIET) #(3.1.0 or greater) include(CGAL_Eigen3_support) diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/data/far_xy.off b/Surface_mesh_simplification/test/Surface_mesh_simplification/data/far_xy.off new file mode 100644 index 000000000000..efa40d4b9a19 --- /dev/null +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/data/far_xy.off @@ -0,0 +1,90 @@ +OFF +36 50 0 + +104605.80000019073 1217329.6000003815 134.27659606933594 +104605.75 1217329.6000003815 134.27859497070312 +104605.55000019073 1217329.7999992371 134.29460144042969 +104605.80000019073 1217329.7999992371 134.28489685058594 +104605.75 1217329.7999992371 134.28680419921875 +104605.75 1217329.75 134.28469848632812 +104605.55000019073 1217329.75 134.2926025390625 +104605.55000019073 1217329.7000007629 134.29060363769531 +104605.80000019073 1217329.75 134.28280639648438 +104605.84999990463 1217329.7999992371 134.28300476074219 +104605.69999980927 1217329.7999992371 134.2886962890625 +104605.55000019073 1217329.6499996185 134.28860473632812 +104605.55000019073 1217329.6000003815 134.28660583496094 +104605.84999990463 1217329.6000003815 134.27470397949219 +104605.59999990463 1217329.7999992371 134.2926025390625 +104605.75 1217329.7000007629 134.2825927734375 +104605.65000009537 1217329.75 134.28860473632812 +104605.80000019073 1217329.7000007629 134.28070068359375 +104605.84999990463 1217329.75 134.28089904785156 +104605.69999980927 1217329.7000007629 134.28460693359375 +104605.90000009537 1217329.7999992371 134.28109741210938 +104605.90000009537 1217329.6499996185 134.27490234375 +104605.90000009537 1217329.7000007629 134.27690124511719 +104605.65000009537 1217329.5499992371 134.28059387207031 +104605.59999990463 1217329.5 134.28050231933594 +104605.90000009537 1217329.5499992371 134.27070617675781 +104605.69999980927 1217329.6000003815 134.28059387207031 +104605.65000009537 1217329.6499996185 134.28460693359375 +104605.59999990463 1217329.7000007629 134.28860473632812 +104605.65000009537 1217329.4500007629 134.27650451660156 +104605.59999990463 1217329.6000003815 134.28460693359375 +104605.55000019073 1217329.5 134.28250122070312 +104605.55000019073 1217329.5499992371 134.28450012207031 +104605.90000009537 1217329.75 134.27900695800781 +104605.84999990463 1217329.7000007629 134.27879333496094 +104605.84999990463 1217329.6499996185 134.27679443359375 +3 30 23 26 +3 3 4 5 +3 26 23 1 +3 22 33 34 +3 8 9 3 +3 17 0 35 +3 17 1 0 +3 4 10 5 +3 15 1 17 +3 8 3 5 +3 15 26 1 +3 6 14 2 +3 0 25 13 +3 35 0 13 +3 6 16 14 +3 28 16 6 +3 7 28 6 +3 8 5 15 +3 16 10 14 +3 8 15 17 +3 16 5 10 +3 18 8 17 +3 16 19 5 +3 19 15 5 +3 18 20 9 +3 18 9 8 +3 11 28 7 +3 11 27 28 +3 21 35 13 +3 21 22 35 +3 22 34 35 +3 31 24 32 +3 24 23 32 +3 24 29 23 +3 29 1 23 +3 19 26 15 +3 27 26 19 +3 28 27 19 +3 28 19 16 +3 29 0 1 +3 30 26 27 +3 29 25 0 +3 18 33 20 +3 34 33 18 +3 34 18 17 +3 34 17 35 +3 32 23 30 +3 32 30 12 +3 12 30 11 +3 30 27 11 + diff --git a/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_stability.cpp b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_stability.cpp new file mode 100644 index 000000000000..f2efb2182448 --- /dev/null +++ b/Surface_mesh_simplification/test/Surface_mesh_simplification/test_edge_collapse_stability.cpp @@ -0,0 +1,71 @@ +#include +#include + +// Simplification function +#include +#include +#include +#include + +#include + +//bbox +#include + +#include +#include + +namespace SMS = CGAL::Surface_mesh_simplification; + +typedef CGAL::Simple_cartesian Kernel; + +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Surface; + +typedef SMS::LindstromTurk_cost Cost; +typedef SMS::LindstromTurk_placement Placement; + +int main(int argc, char** argv) +{ + std::cout.precision(17); + std::cerr.precision(17); + + std::string filename = (argc > 1) ? argv[1] : "data/far_xy.off"; + + Surface mesh; + if(!CGAL::IO::read_polygon_mesh(filename, mesh)) + { + std::cerr << "Failed to read input mesh: " << filename << std::endl; + return EXIT_FAILURE; + } + + std::cout << "input has " << num_vertices(mesh) << " vertices." << std::endl; + + CGAL::Iso_cuboid_3 bbox(CGAL::Polygon_mesh_processing::bbox(mesh)); + + // scale a bit the bounding box bbox, because the kernel is SC + bbox = { bbox.min() - 0.01 * (bbox.max() - bbox.min()), + bbox.max() + 0.01 * (bbox.max() - bbox.min()) }; + + std::cout << "Bbox: " << bbox << std::endl; + + SMS::Edge_count_stop_predicate stop(num_halfedges(mesh)/10); + Placement placement_ref; + + SMS::edge_collapse(mesh, stop, + CGAL::parameters::get_cost(Cost()) + .get_placement(placement_ref)); + + CGAL::IO::write_polygon_mesh("out.off", mesh, CGAL::parameters::stream_precision(17)); + + for(auto v : vertices(mesh)) + { + if(bbox.has_on_unbounded_side(mesh.point(v))) + { + std::cerr << "Error: " << mesh.point(v) << " is outside" << std::endl; + } + } + + std::cout << "output has " << vertices(mesh).size() << " vertices." << std::endl; + return EXIT_SUCCESS; +} From 3316dc5c01b195e86f1d836587e368f7e8e3b458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 20 Sep 2023 17:00:58 +0200 Subject: [PATCH 0757/1398] Restore some base code --- .../edge_collapse_surface_mesh.cpp | 2 +- .../CGAL/Surface_mesh_simplification/internal/Common.h | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp index 3e88f4b090df..a37cb970c930 100644 --- a/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp +++ b/Surface_mesh_simplification/examples/Surface_mesh_simplification/edge_collapse_surface_mesh.cpp @@ -49,7 +49,7 @@ int main(int argc, char** argv) std::cout << "\nFinished!\n" << r << " edges removed.\n" << surface_mesh.number_of_edges() << " final edges.\n"; std::cout << "Time elapsed: " << std::chrono::duration_cast(end_time - start_time).count() << "ms" << std::endl; - CGAL::IO::write_polygon_mesh((argc > 3) ? argv[3] : "out_SC.off", surface_mesh, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_mesh((argc > 3) ? argv[3] : "out.off", surface_mesh, CGAL::parameters::stream_precision(17)); return EXIT_SUCCESS; } diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h index 5255a0b53591..4ed45a02d1e6 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/internal/Common.h @@ -114,7 +114,10 @@ inline std::string optional_to_string(const std::optional& o) { namespace internal { namespace { bool cgal_enable_sms_trace = true; } } #define CGAL_SMS_TRACE_IMPL(m) \ - std::cerr << m << std::endl; + if(::internal::cgal_enable_sms_trace) { \ + std::ostringstream ss; ss << m; std::string s = ss.str(); \ + /*Surface_simplification_external_trace(s)*/ std::cerr << s << std::endl; \ + } #define CGAL_SMS_DEBUG_CODE(code) code #else From 433881020e0271f39bab161a4493c95840e60077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Thu, 21 Sep 2023 10:18:30 +0200 Subject: [PATCH 0758/1398] Remove needless header include --- .../Policies/Edge_collapse/internal/Lindstrom_Turk_core.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index dd901c8d89ae..31c12e18c54d 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -13,8 +13,6 @@ #include -#include - #include #include #include From 91f0aeee190950517229c22e008e08552ae3720f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 21 Sep 2023 14:03:36 +0100 Subject: [PATCH 0759/1398] Move section --- .../doc/Box_intersection_d/PackageDescription.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt index 2e3b3607b687..5f7e72b6313d 100644 --- a/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt +++ b/Box_intersection_d/doc/Box_intersection_d/PackageDescription.txt @@ -42,15 +42,14 @@ \cgalClassifedRefPages -\cgalCRPSection{Enumerations} -- `CGAL::Box_intersection_d::Setting` -- `CGAL::Box_intersection_d::Topology` - - \cgalCRPSection{Concepts} - `BoxIntersectionBox_d` - `BoxIntersectionTraits_d` +\cgalCRPSection{Enumerations} +- `CGAL::Box_intersection_d::Setting` +- `CGAL::Box_intersection_d::Topology` + \cgalCRPSection{Classes} - `CGAL::Box_intersection_d::Box_d` - `CGAL::Box_intersection_d::Box_with_handle_d` From e18026d9e7d3be03fbbc38d7b7f6d699df79900f Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 21 Sep 2023 14:08:16 +0100 Subject: [PATCH 0760/1398] linking in the doc --- .../doc/Box_intersection_d/Box_intersection_d.txt | 3 +-- Box_intersection_d/doc/Box_intersection_d/dependencies | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt b/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt index 2dcd2db8d30e..b3101a05aaca 100644 --- a/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt +++ b/Box_intersection_d/doc/Box_intersection_d/Box_intersection_d.txt @@ -216,7 +216,7 @@ boxes and approximated geometry, which is the case here. It saves us the extra space that was needed for the explicit `id`-number in the previous example. -We run the self intersection algorithm with the `report_inters` +We run the self intersection algorithm with the `report_inters()` function as callback. This callback reports the intersecting boxes. It uses the `handle` and the global `triangles` vector to calculate the triangle numbers. Then it checks the triangles @@ -480,4 +480,3 @@ however, we learned too late about this implementation. */ } /* namespace CGAL */ - diff --git a/Box_intersection_d/doc/Box_intersection_d/dependencies b/Box_intersection_d/doc/Box_intersection_d/dependencies index a4d5f76715e3..a01021f28b7a 100644 --- a/Box_intersection_d/doc/Box_intersection_d/dependencies +++ b/Box_intersection_d/doc/Box_intersection_d/dependencies @@ -4,3 +4,4 @@ STL_Extension Algebraic_foundations Circulator Stream_support +Polyhedron From fffea5c616d56b872eb8430e0dd286bdf4ce4658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 21 Sep 2023 15:29:31 +0200 Subject: [PATCH 0761/1398] add an avx version for archive, it is slower so not used in general, CGAL with avx is itself slower --- .../internal/Lindstrom_Turk_core.h | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index 31c12e18c54d..70750a95eca2 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -155,6 +155,36 @@ private : } #endif +#ifdef __AVX__ + static Vector SL_cross_product_avx(const Vector& A, const Vector& B) + { + const FT ax=A.x(), ay=A.y(), az=A.z(); + const FT bx=B.x(), by=B.y(), bz=B.z(); + + __m256d a = _mm256_set_pd(ay, az, ax, 1.0); + __m256d b = _mm256_set_pd(bz, bx, by, 1.0); + __m256d c = _mm256_set_pd(az, ax, ay, 1.0); + __m256d d = _mm256_set_pd(by, bz, bx, 1.0); + + __m256d s1 = _mm256_sub_pd(b, c); + __m256d s2 = _mm256_sub_pd(a, d); + + b = _mm256_mul_pd(a, s1); + d = _mm256_mul_pd(c, s2); + a = _mm256_add_pd(b, d); + + double res[4]; + _mm256_storeu_pd(res, a); + +// a * (b - c ) + c * ( a - d); +// FT x = ay * (bz - az) + az * (ay - by); +// FT y = az * (bx - ax) + ax * (az - bz); +// FT z = ax * (by - ay) + ay * (ax - bx); + + return Vector(res[3], res[2], res[1]); + } +#end + static Vector SL_cross_product(const Vector& a, const Vector& b) { const FT ax=a.x(), ay=a.y(), az=a.z(); From d65cd2d298b12a4156423c6171d93bbb56b77d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 21 Sep 2023 16:12:35 +0200 Subject: [PATCH 0762/1398] fix macro --- .../Policies/Edge_collapse/internal/Lindstrom_Turk_core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h index 70750a95eca2..d97688dde8bd 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/Lindstrom_Turk_core.h @@ -183,7 +183,7 @@ private : return Vector(res[3], res[2], res[1]); } -#end +#endif static Vector SL_cross_product(const Vector& a, const Vector& b) { From 41702c944be33550264119a45b1132d8b0f8b871 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Fri, 22 Sep 2023 16:05:50 +0200 Subject: [PATCH 0763/1398] Added clip box support for image items --- .../resources/no_interpolation_shader.frag | 10 ++++++++ .../resources/no_interpolation_shader.geom | 9 ++++++- .../resources/no_interpolation_shader.vert | 24 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.frag b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.frag index 904a0907c095..87d4736352ed 100644 --- a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.frag +++ b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.frag @@ -7,6 +7,7 @@ in GS_OUT flat vec4 color[4]; vec2 uv; flat vec4 prob[4]; + float dist[6]; } fs_in; uniform bool is_two_side; @@ -15,11 +16,20 @@ uniform vec4 light_diff; uniform vec4 light_spec; uniform vec4 light_amb; uniform float spec_power ; +uniform bool is_clipbox_on; out vec4 out_color; void main(void) { + if(is_clipbox_on) + if(fs_in.dist[0]>0.0 || + fs_in.dist[1]>0.0 || + fs_in.dist[2]>0.0 || + fs_in.dist[3]>0.0 || + fs_in.dist[4]>0.0 || + fs_in.dist[5]>0.0) + discard; vec4 color; //find base color of pixel vec4 m1 = mix(fs_in.prob[0], fs_in.prob[1], fs_in.uv.y); diff --git a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.geom b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.geom index f1b664d07a9e..663fe6c44a82 100644 --- a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.geom +++ b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.geom @@ -8,6 +8,7 @@ in VS_OUT vec4 fP; vec3 fN; vec4 out_color; + float dist[6]; } gs_in[4]; out GS_OUT @@ -17,6 +18,7 @@ out GS_OUT flat vec4 color[4]; vec2 uv; flat vec4 prob[4]; + float dist[6]; } gs_out; void main(void) @@ -25,19 +27,21 @@ void main(void) gs_out.fN = gs_in[0].fN; gs_out.fP = gs_in[0].fP; gs_out.uv = vec2(0.0, 0.0); - + gs_out.dist = gs_in[0].dist; EmitVertex(); gl_Position = gl_in[1].gl_Position; gs_out.fN = gs_in[1].fN; gs_out.fP = gs_in[1].fP; gs_out.uv = vec2(0.0, 1.0); + gs_out.dist = gs_in[1].dist; EmitVertex(); gl_Position = gl_in[3].gl_Position; gs_out.fN = gs_in[3].fN; gs_out.fP = gs_in[3].fP; gs_out.uv = vec2(1.0, 0.0); + gs_out.dist = gs_in[3].dist; // We're only writing the output color for the last // vertex here because they're flat attributes, @@ -67,18 +71,21 @@ void main(void) gs_out.fN = gs_in[1].fN; gs_out.fP = gs_in[1].fP; gs_out.uv = vec2(0.0, 1.0); + gs_out.dist = gs_in[1].dist; EmitVertex(); gl_Position = gl_in[2].gl_Position; gs_out.fN = gs_in[2].fN; gs_out.fP = gs_in[2].fP; gs_out.uv = vec2(1.0, 1.0); + gs_out.dist = gs_in[2].dist; EmitVertex(); gl_Position = gl_in[3].gl_Position; gs_out.fN = gs_in[3].fN; gs_out.fP = gs_in[3].fP; gs_out.uv = vec2(1.0, 0.0); + gs_out.dist = gs_in[3].dist; // Again, only write the output color for the last vertex gs_out.color[0] = gs_in[0].out_color; gs_out.color[1] = gs_in[1].out_color; diff --git a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert index 727e4b07d9a8..115e809f9129 100644 --- a/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert +++ b/Polyhedron/demo/Polyhedron/resources/no_interpolation_shader.vert @@ -9,15 +9,39 @@ out VS_OUT vec4 fP; vec3 fN; vec4 out_color; + float dist[6]; }vs_out; uniform mat4 mvp_matrix; uniform mat4 mv_matrix; uniform mat4 norm_matrix; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + vs_out.dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + vs_out.dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + void main(void) { vs_out.out_color=colors; + if(is_clipbox_on) + compute_distances(); vs_out.fP = mv_matrix * vertex; vs_out.fN = mat3(norm_matrix)* normals; gl_Position = mvp_matrix * vertex; From 87003941220f792096961bb9a3896afc5afdfb2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Sun, 24 Sep 2023 22:52:20 +0200 Subject: [PATCH 0764/1398] boost::mpl::if_ -> std::conditional --- .../CGAL/AABB_face_graph_triangle_primitive.h | 9 ++- .../AABB_halfedge_graph_segment_primitive.h | 9 ++- .../include/CGAL/number_utils.h | 16 ++--- .../include/CGAL/Arr_batched_point_location.h | 3 +- .../include/CGAL/Arr_overlay_2.h | 5 +- .../include/CGAL/Arr_tags.h | 59 +++++++++---------- .../CGAL/Arr_vertical_decomposition_2.h | 3 +- .../Arr_traits_adaptor_2_dispatching.h | 23 +++----- .../Arrangement_on_surface_2_global.h | 10 ++-- .../Arrangement_on_surface_2/test_tags.cpp | 1 - .../test_traits_dispatching.cpp | 1 - .../internal/OM_iterator_from_circulator.h | 29 ++++----- .../internal/initialized_index_maps_helpers.h | 4 +- .../CGAL/boost/graph/named_params_helper.h | 18 +++--- BGL/include/CGAL/boost/graph/properties.h | 10 ++-- .../CGAL/boost/graph/properties_OpenMesh.h | 15 +++-- BGL/include/CGAL/boost/graph/property_maps.h | 1 - .../CGAL/Combinatorial_map_iterators_base.h | 34 +++++------ .../CGAL/Compact_container_with_index.h | 11 ++-- Filtered_kernel/include/CGAL/Lazy_kernel.h | 1 - .../CGAL/Generalized_map_iterators_base.h | 1 - .../include/CGAL/sibson_gradient_fitting.h | 1 - Kernel_23/include/CGAL/Kernel_traits.h | 1 - Mesh_3/benchmark/Mesh_3/StdAfx.h | 2 - .../Implicit_to_labeling_function_wrapper.h | 7 +-- .../Image_to_labeled_function_wrapper.h | 1 - Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h | 7 +-- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 7 +-- .../CGAL/Mesh_3/Triangulation_helpers.h | 1 - .../CGAL/NewKernel_d/Cartesian_filter_K.h | 1 - .../NewKernel_d/Cartesian_static_filters.h | 7 +-- .../CGAL/NewKernel_d/KernelD_converter.h | 9 ++- .../include/CGAL/NewKernel_d/functor_tags.h | 3 +- NewKernel_d/include/CGAL/NewKernel_d/utils.h | 8 +-- NewKernel_d/test/NewKernel_d/Epick_d.cpp | 4 +- Number_types/include/CGAL/Lazy_exact_nt.h | 10 ++-- Number_types/include/CGAL/Quotient.h | 8 +-- .../Algebraic_structure_traits.h | 8 +-- .../CGAL/Sqrt_extension/Coercion_traits.h | 4 +- ...t_to_labeled_subdomains_function_wrapper.h | 7 +-- .../CGAL/Periodic_3_function_wrapper.h | 7 +-- .../CGAL/Periodic_3_regular_triangulation_3.h | 1 - ...ABB_traversal_traits_with_transformation.h | 1 - .../internal/Corefinement/face_graph_utils.h | 7 +-- .../Polygon_mesh_processing/intersection.h | 1 - .../CGAL/Polygon_mesh_processing/locate.h | 1 - .../include/CGAL/Polygon_mesh_slicer.h | 9 ++- Polynomial/include/CGAL/Polynomial.h | 1 - .../include/CGAL/Polynomial/Polynomial_type.h | 6 +- Polynomial/include/CGAL/Polynomial_traits_d.h | 6 +- .../include/CGAL/Dynamic_property_map.h | 7 +-- .../CGAL/Mesh_complex_3_in_triangulation_3.h | 1 - .../include/CGAL/Compact_container.h | 10 ++-- .../CGAL/Concurrent_compact_container.h | 4 +- .../include/CGAL/Handle_with_policy.h | 6 +- .../include/CGAL/Named_function_parameters.h | 13 ++-- .../include/CGAL/transforming_iterator.h | 7 +-- .../include/CGAL/Skin_surface_base_3.h | 1 - .../include/CGAL/Fuzzy_iso_box.h | 2 - .../include/CGAL/Search_traits_adapter.h | 12 ++-- .../Straight_skeleton_aux.h | 11 ++-- .../CGAL/Constrained_triangulation_2.h | 5 +- .../include/CGAL/Regular_triangulation_2.h | 1 - .../include/CGAL/Triangulation_hierarchy_2.h | 1 - .../include/CGAL/Regular_triangulation_3.h | 1 - ...n_cell_base_with_weighted_circumcenter_3.h | 1 - .../include/CGAL/Triangulation_3.h | 1 - .../include/CGAL/Triangulation_hierarchy_3.h | 1 - .../include/CGAL/_test_cls_delaunay_3.h | 1 - .../CGAL/_test_cls_parallel_triangulation_3.h | 1 - .../test_regular_insert_range_with_info.cpp | 18 +++--- 71 files changed, 212 insertions(+), 292 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h index 5422c84b2ae6..021cdc6270ab 100644 --- a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h @@ -21,7 +21,6 @@ #include #include #include -#include namespace CGAL { @@ -57,9 +56,9 @@ template < class FaceGraph, class CacheDatum=Tag_false > class AABB_face_graph_triangle_primitive #ifndef DOXYGEN_RUNNING - : public AABB_primitive::face_descriptor, - std::pair::face_descriptor, const FaceGraph*> >::type, + : public AABB_primitive::face_descriptor, + std::pair::face_descriptor, const FaceGraph*> >, Triangle_from_face_descriptor_map< FaceGraph, typename Default::Get::const_type >::type VertexPointPMap_; typedef typename boost::graph_traits::face_descriptor FD; - typedef typename boost::mpl::if_ >::type Id_; + typedef std::conditional_t > Id_; typedef Triangle_from_face_descriptor_map Triangle_property_map; typedef One_point_from_face_descriptor_map Point_property_map; diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index 135682273199..3f5481d0cfe1 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -24,7 +24,6 @@ #include #include #include -#include #include @@ -70,9 +69,9 @@ template < class HalfedgeGraph, class CacheDatum = Tag_false > class AABB_halfedge_graph_segment_primitive #ifndef DOXYGEN_RUNNING - : public AABB_primitive< typename boost::mpl::if_::edge_descriptor, - std::pair::edge_descriptor, const HalfedgeGraph*> >::type, + : public AABB_primitive< std::conditional_t::edge_descriptor, + std::pair::edge_descriptor, const HalfedgeGraph*> >, Segment_from_edge_descriptor_map< HalfedgeGraph, typename Default::Get::const_type >::type VertexPointPMap_; typedef typename boost::graph_traits::edge_descriptor ED; - typedef typename boost::mpl::if_ >::type Id_; + typedef std::conditional_t > Id_; typedef Segment_from_edge_descriptor_map Segment_property_map; typedef Source_point_from_edge_descriptor_map Point_property_map; diff --git a/Algebraic_foundations/include/CGAL/number_utils.h b/Algebraic_foundations/include/CGAL/number_utils.h index c17823d72b9d..5a5bc2d242d3 100644 --- a/Algebraic_foundations/include/CGAL/number_utils.h +++ b/Algebraic_foundations/include/CGAL/number_utils.h @@ -194,21 +194,21 @@ root_of( int k, Input_iterator begin, Input_iterator end ) { template< class Number_type > inline // select a Is_zero functor -typename boost::mpl::if_c< - ::std::is_same< typename Algebraic_structure_traits< Number_type >::Is_zero, - Null_functor >::value , +typename std::conditional_t< + std::is_same_v< typename Algebraic_structure_traits< Number_type >::Is_zero, + Null_functor >, typename Real_embeddable_traits< Number_type >::Is_zero, typename Algebraic_structure_traits< Number_type >::Is_zero ->::type::result_type +>::result_type is_zero( const Number_type& x ) { // We take the Algebraic_structure_traits<>::Is_zero functor by default. If it // is not available, we take the Real_embeddable_traits functor - typename ::boost::mpl::if_c< - ::std::is_same< + std::conditional_t< + std::is_same_v< typename Algebraic_structure_traits< Number_type >::Is_zero, - Null_functor >::value , + Null_functor > , typename Real_embeddable_traits< Number_type >::Is_zero, - typename Algebraic_structure_traits< Number_type >::Is_zero >::type + typename Algebraic_structure_traits< Number_type >::Is_zero > is_zero; return is_zero( x ); } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h index 42715621e4b2..85ba6ccc235f 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h @@ -26,7 +26,6 @@ #include #include -#include #include namespace CGAL { @@ -120,7 +119,7 @@ locate(const Arrangement_on_surface_2& arr, * Use the form 'A a(*b);' and not ''A a = b;' to handle the case where A has * only an implicit constructor, (which takes *b as a parameter). */ - typename boost::mpl::if_, const Bgt2&, Bgt2>::type + std::conditional_t, const Bgt2&, Bgt2> ex_traits(*geom_traits); // Define the sweep-line visitor and perform the sweep. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 2951b1983fe8..dfa6fb89ffc1 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -25,7 +25,6 @@ #include #include -#include #include #include @@ -247,8 +246,8 @@ overlay(const Arrangement_on_surface_2& arr1 * Use the form 'A a(*b);' and not ''A a = b;' to handle the case where A has * only an implicit constructor, (which takes *b as a parameter). */ - typename boost::mpl::if_, - const Ovl_gt2&, Ovl_gt2>::type + std::conditional_t, + const Ovl_gt2&, Ovl_gt2> ex_traits(*traits_adaptor); Ovl_visitor visitor(&arr1, &arr2, &arr, &ovl_tr); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_tags.h b/Arrangement_on_surface_2/include/CGAL/Arr_tags.h index 91313be6c5d8..1aac06155855 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_tags.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_tags.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -246,14 +245,14 @@ struct Arr_all_sides_not_finite_tag : struct Arr_not_all_sides_not_finite_tag : public virtual Arr_not_all_sides_oblivious_tag {}; -typedef boost::mpl::bool_ Arr_true; -typedef boost::mpl::bool_ Arr_false; +typedef std::true_type Arr_true; +typedef std::false_type Arr_false; template struct Arr_is_side_oblivious { typedef ArrSideCategory Side_cat; typedef std::is_same Is_same; - typedef boost::mpl::if_ result; + typedef std::conditional result; typedef typename result::type type; }; @@ -261,7 +260,7 @@ template struct Arr_is_side_open { typedef ArrSideCategory Side_cat; typedef std::is_same Is_same; - typedef boost::mpl::if_ result; + typedef std::conditional result; typedef typename result::type type; }; @@ -269,7 +268,7 @@ template struct Arr_is_side_identified { typedef ArrSideCategory Side_cat; typedef std::is_same Is_same; - typedef boost::mpl::if_ result; + typedef std::conditional result; typedef typename result::type type; }; @@ -277,7 +276,7 @@ template struct Arr_is_side_contracted { typedef ArrSideCategory Side_cat; typedef std::is_same Is_same; - typedef boost::mpl::if_ result; + typedef std::conditional result; typedef typename result::type type; }; @@ -285,7 +284,7 @@ template struct Arr_is_side_closed { typedef ArrSideCategory Side_cat; typedef std::is_same Is_same; - typedef boost::mpl::if_ result; + typedef std::conditional result; typedef typename result::type type; }; @@ -307,10 +306,10 @@ struct Arr_all_sides_oblivious_category { /*! Boolean tag that is Arr_all_sides_oblivious_tag if all sides are * oblivious, otherwise Arr_not_all_sides_oblivious_tag */ - typedef typename boost::mpl::if_, - Arr_all_sides_oblivious_tag, - Arr_not_all_sides_oblivious_tag>::type + typedef std::conditional_t result; }; @@ -340,10 +339,10 @@ struct Arr_all_sides_not_open_category { /*! Boolean tag that is Arr_all_sides_not_open_tag if all sides are not-open, * otherwise Arr_not_all_sides_not_open_tag */ - typedef typename boost::mpl::if_, - Arr_all_sides_not_open_tag, - Arr_not_all_sides_not_open_tag>::type + typedef std::conditional_t result; }; @@ -379,18 +378,18 @@ struct Arr_sides_category { typedef boost::mpl::or_ Bot_obl_or_ope; typedef boost::mpl::or_ Top_obl_or_ope; - typedef typename boost::mpl::if_, - Arr_all_sides_not_finite_tag, - Arr_not_all_sides_not_finite_tag>::type + typedef std::conditional_t tmp; public: - typedef typename boost::mpl::if_, - Arr_all_sides_oblivious_tag, tmp>::type + typedef std::conditional_t result; }; @@ -532,11 +531,11 @@ struct Arr_two_sides_category { Is_open; public: - typedef typename boost::mpl::if_::type>::type>::type>::type + typedef std::conditional_t>>> result; }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h index 75c8f25e0c96..099f44192ee5 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_vertical_decomposition_2.h @@ -24,7 +24,6 @@ #include #include -#include #include namespace CGAL { @@ -124,7 +123,7 @@ decompose(const Arrangement_on_surface_2& arr, * Use the form 'A a(*b);' and not ''A a = b;' to handle the case where A has * only an implicit constructor, (which takes *b as a parameter). */ - typename boost::mpl::if_, const Vgt2&, Vgt2>::type + std::conditional_t, const Vgt2&, Vgt2> ex_traits(*geom_traits); // Define the sweep-line visitor and perform the sweep. diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2_dispatching.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2_dispatching.h index e4533596dd2b..283b2dc66b5c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2_dispatching.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arr_traits_adaptor_2_dispatching.h @@ -17,7 +17,6 @@ #include -#include #include #include #include @@ -59,25 +58,21 @@ struct Or_traits { private: - typedef boost::mpl::bool_< true > true_; - typedef boost::mpl::bool_< false > false_; + typedef std::conditional< + std::is_same_v< Arr_smaller_implementation_tag, Arr_use_traits_tag >, + std::true_type, std::false_type > Smaller_traits; - typedef boost::mpl::if_< - std::is_same< Arr_smaller_implementation_tag, Arr_use_traits_tag >, - true_, false_ > Smaller_traits; - - typedef boost::mpl::if_< - std::is_same< Arr_larger_implementation_tag, Arr_use_traits_tag >, - true_, false_ > Larger_traits; + typedef std::conditional_t_< + std::is_same_v< Arr_larger_implementation_tag, Arr_use_traits_tag >, + std::true_type, std::false_type > Larger_traits; public: //! the result type (if one side asks for traits, then ask traits! //! Or vice versa: If both ask for dummy, then dummy!) - typedef typename boost::mpl::if_< - boost::mpl::or_< Smaller_traits, Larger_traits >, - Arr_use_traits_tag, - Arr_use_dummy_tag >::type type; + typedef std::conditional_t< + Smaller_traits, Larger_traits >::value || Arr_use_traits_tag::value, + Arr_use_dummy_tag > type; }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h index 0f2957d47149..ee072c95778c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_2/Arrangement_on_surface_2_global.h @@ -23,8 +23,6 @@ #include #include -#include -#include #include #include @@ -271,7 +269,7 @@ insert_empty(Arrangement_on_surface_2& arr, * Use the form 'A a(*b);' and not ''A a = b;' to handle the case where A has * only an implicit constructor, (which takes *b as a parameter). */ - typename boost::mpl::if_, const Cgt2&, Cgt2>::type + std::conditional_t, const Cgt2&, Cgt2> traits(*geom_traits); // Define a surface-sweep instance and perform the sweep: @@ -326,7 +324,7 @@ void insert_empty(Arrangement_on_surface_2& * Use the form 'A a(*b);' and not ''A a = b;' to handle the case where A has * only an implicit constructor, (which takes *b as a parameter). */ - typename boost::mpl::if_, const Cgt2&, Cgt2>::type + std::conditional_t, const Cgt2&, Cgt2> traits(*geom_traits); // Define a surface-sweep instance and perform the sweep. @@ -379,7 +377,7 @@ void insert_non_empty(Arrangement_on_surface_2, const Igt2&, Igt2>::type + std::conditional_t, const Igt2&, Igt2> traits(*geom_traits); // Create a set of existing as well as new curves and points. @@ -979,7 +977,7 @@ non_intersecting_insert_non_empty(Arrangement_on_surface_2, const Igt2&, Igt2>::type + std::conditional_t, const Igt2&, Igt2> traits(*geom_traits); // Create a set of existing as well as new curves and points. diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp index 81eae4204966..a86325de2afc 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp @@ -6,7 +6,6 @@ #include #include -#include struct Traits1 { typedef CGAL::Arr_open_side_tag Left_side_category; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp index 5c8e19fa12e0..ce17f3b9105e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_traits_dispatching.cpp @@ -4,7 +4,6 @@ #include #include -#include int dispatch(CGAL::Arr_use_dummy_tag) { return 0; diff --git a/BGL/include/CGAL/boost/graph/internal/OM_iterator_from_circulator.h b/BGL/include/CGAL/boost/graph/internal/OM_iterator_from_circulator.h index e726e161a6bd..01104c546804 100644 --- a/BGL/include/CGAL/boost/graph/internal/OM_iterator_from_circulator.h +++ b/BGL/include/CGAL/boost/graph/internal/OM_iterator_from_circulator.h @@ -20,8 +20,6 @@ #include #include -#include - namespace CGAL { // adapted from circulator.h, does not support @@ -45,23 +43,20 @@ class OM_iterator_from_circulator { typedef typename I__traits::iterator_category iterator_category; - typedef typename - boost::mpl::if_c< Prevent_deref - , C - , typename C::value_type - >::type value_type; + typedef std::conditional_t< Prevent_deref + , C + , typename C::value_type> + value_type; typedef typename C::difference_type difference_type; - typedef typename - boost::mpl::if_c< Prevent_deref - , C& - , typename C::reference - >::type reference; - typedef typename - boost::mpl::if_c< Prevent_deref - , C* - , typename C::reference - >::type pointer; + typedef std::conditional_t< Prevent_deref + , C& + , typename C::reference + > reference; + typedef std::conditional_t< Prevent_deref + , C* + , typename C::reference + > pointer; OM_iterator_from_circulator(){} diff --git a/BGL/include/CGAL/boost/graph/internal/initialized_index_maps_helpers.h b/BGL/include/CGAL/boost/graph/internal/initialized_index_maps_helpers.h index 2d85e38d35c1..eddefcec7fb2 100644 --- a/BGL/include/CGAL/boost/graph/internal/initialized_index_maps_helpers.h +++ b/BGL/include/CGAL/boost/graph/internal/initialized_index_maps_helpers.h @@ -276,8 +276,8 @@ class GetInitializedIndexMap { public: // Check if there is an internal property map; if not, we must a dynamic property map - typedef typename boost::mpl::if_c< - CGAL::graph_has_property::value, Tag, DynamicTag>::type Final_tag; + typedef std::conditional_t< + CGAL::graph_has_property::value, Tag, DynamicTag> Final_tag; typedef typename internal_np::Lookup_named_param_def< PropertyTag, diff --git a/BGL/include/CGAL/boost/graph/named_params_helper.h b/BGL/include/CGAL/boost/graph/named_params_helper.h index 1e0efd6faa60..4dce0049b1ab 100644 --- a/BGL/include/CGAL/boost/graph/named_params_helper.h +++ b/BGL/include/CGAL/boost/graph/named_params_helper.h @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -43,11 +42,10 @@ class property_map_selector { public: typedef typename graph_has_property::type Has_internal_pmap; - typedef typename boost::mpl::if_c::type, - typename boost::cgal_no_property::type - >::type type; - typedef typename boost::mpl::if_c::type, + typename boost::cgal_no_property::type> type; + typedef std::conditional_t::const_type, typename boost::cgal_no_property::const_type >::type const_type; @@ -209,10 +207,10 @@ struct GetGeomTraits_impl::value, - typename GetK::Kernel, - Fake_GT>::type type; + typedef std::conditional_t::value, + typename GetK::Kernel, + Fake_GT> type; }; template typedef ValueType value_type; typedef Handle key_type; - typedef typename boost::mpl::if_< std::is_reference, - ValueType&, - ValueType >::type Reference; + typedef std::conditional_t< std::is_reference, + ValueType&, + ValueType > Reference; Point_accessor() {} Point_accessor(Point_accessor) {} @@ -172,9 +172,9 @@ struct Is_writable_property_map // property map must define. template struct Is_writable_property_map - : boost::mpl::if_c::reference>::type>::value, - CGAL::Tag_false, CGAL::Tag_true>::type + CGAL::Tag_false, CGAL::Tag_true> { }; } // namespace internal diff --git a/BGL/include/CGAL/boost/graph/properties_OpenMesh.h b/BGL/include/CGAL/boost/graph/properties_OpenMesh.h index 861f5aea98b6..f6f56cea7ef8 100644 --- a/BGL/include/CGAL/boost/graph/properties_OpenMesh.h +++ b/BGL/include/CGAL/boost/graph/properties_OpenMesh.h @@ -13,7 +13,6 @@ #include #include #include -#include #ifndef OPEN_MESH_CLASS #error OPEN_MESH_CLASS is not defined @@ -29,13 +28,13 @@ namespace CGAL { template class OM_pmap { public: - typedef typename boost::mpl::if_::vertex_descriptor>, - OpenMesh::VPropHandleT, - typename boost::mpl::if_::face_descriptor>, - OpenMesh::FPropHandleT, - typename boost::mpl::if_::halfedge_descriptor>, - OpenMesh::HPropHandleT, - OpenMesh::EPropHandleT >::type>::type>::type H; + typedef std::conditional_t::vertex_descriptor>, + OpenMesh::VPropHandleT, + std::conditional_t::face_descriptor>, + OpenMesh::FPropHandleT, + std::conditional_t::halfedge_descriptor>, + OpenMesh::HPropHandleT, + OpenMesh::EPropHandleT >>> H; typedef boost::lvalue_property_map_tag category; diff --git a/BGL/include/CGAL/boost/graph/property_maps.h b/BGL/include/CGAL/boost/graph/property_maps.h index aab29d9b8811..b6973feb65c8 100644 --- a/BGL/include/CGAL/boost/graph/property_maps.h +++ b/BGL/include/CGAL/boost/graph/property_maps.h @@ -15,7 +15,6 @@ #include #include -#include namespace CGAL{ diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h index a50266f76592..555dc554c58e 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h @@ -18,7 +18,6 @@ #include #include -#include #include @@ -68,24 +67,24 @@ namespace CGAL { class CMap_dart_iterator; template < typename Map_,bool Const> - class CMap_dart_iterator: public boost::mpl::if_c< Const, + class CMap_dart_iterator: public std::conditional_t< Const, typename Map_::Dart_container::const_iterator, - typename Map_::Dart_container::iterator>::type + typename Map_::Dart_container::iterator> //public internal::CC_iterator { public: typedef CMap_dart_iterator Self; - typedef typename boost::mpl::if_c< Const, + typedef std::conditional_t< Const, typename Map_::Dart_container::const_iterator, - typename Map_::Dart_container::iterator>::type Base; + typename Map_::Dart_container::iterator> Base; // typedef internal::CC_iterator Base; - typedef typename boost::mpl::if_c< Const, - typename Map_::Dart_const_descriptor, - typename Map_::Dart_descriptor>::type + typedef std::conditional_t< Const, + typename Map_::Dart_const_descriptor, + typename Map_::Dart_descriptor> Dart_descriptor; - typedef typename boost::mpl::if_c< Const, const Map_, Map_>::type Map; + typedef std::conditional_t< Const, const Map_, Map_> Map; typedef std::input_iterator_tag iterator_category; typedef typename Base::value_type value_type; @@ -180,25 +179,24 @@ namespace CGAL { template < typename Map_,bool Const > class CMap_dart_iterator: - /*public boost::mpl::if_c< Const, + /*public std::conditional_t< Const, typename Map_::Dart_container::const_iterator, - typename Map_::Dart_container::iterator>::type*/ + typename Map_::Dart_container::iterator>*/ public internal::CC_iterator_with_index { public: typedef CMap_dart_iterator Self; - /*typedef typename boost::mpl::if_c< Const, + /*typedef std::conditional_t< Const, typename Map_::Dart_container::const_iterator, - typename Map_::Dart_container::iterator>::type Base;*/ + typename Map_::Dart_container::iterator> Base;*/ typedef internal::CC_iterator_with_index Base; - typedef typename boost::mpl::if_c< Const, - typename Map_::Dart_const_descriptor, - typename Map_::Dart_descriptor>::type + typedef std::conditional_t< Const, + typename Map_::Dart_const_descriptor, + typename Map_::Dart_descriptor> Dart_descriptor; - typedef typename boost::mpl::if_c< Const, const Map_, - Map_>::type Map; + typedef std::conditional_t< Const, const Map_, Map_> Map; typedef std::input_iterator_tag iterator_category; typedef typename Base::value_type value_type; diff --git a/Combinatorial_map/include/CGAL/Compact_container_with_index.h b/Combinatorial_map/include/CGAL/Compact_container_with_index.h index d3d67c57a88d..dbb9aa8bae6d 100644 --- a/Combinatorial_map/include/CGAL/Compact_container_with_index.h +++ b/Combinatorial_map/include/CGAL/Compact_container_with_index.h @@ -861,14 +861,13 @@ namespace internal { typedef typename DSC::value_type value_type; typedef typename DSC::size_type size_type; typedef typename DSC::difference_type difference_type; - typedef typename boost::mpl::if_c< Const, const value_type*, - value_type*>::type pointer; - typedef typename boost::mpl::if_c< Const, const value_type&, - value_type&>::type reference; + typedef std::conditional_t< Const, const value_type*, + value_type*> pointer; + typedef std::conditional_t< Const, const value_type&, + value_type&> reference; typedef std::bidirectional_iterator_tag iterator_category; - typedef typename boost::mpl::if_c< Const, const DSC*, DSC*>::type - cc_pointer; + typedef std::conditional_t< Const, const DSC*, DSC*> cc_pointer; CC_iterator_with_index(): m_ptr_to_cc(nullptr), m_index(0) diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 911a86debc30..c6b6cb2444ab 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include diff --git a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h index 034b1600f936..1747f89f354b 100644 --- a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h +++ b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h @@ -19,7 +19,6 @@ #include #include #include -#include namespace CGAL { diff --git a/Interpolation/include/CGAL/sibson_gradient_fitting.h b/Interpolation/include/CGAL/sibson_gradient_fitting.h index f08600a4603c..f6d6d0559dd8 100644 --- a/Interpolation/include/CGAL/sibson_gradient_fitting.h +++ b/Interpolation/include/CGAL/sibson_gradient_fitting.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/Kernel_23/include/CGAL/Kernel_traits.h b/Kernel_23/include/CGAL/Kernel_traits.h index 4839184ff304..e12d38503bca 100644 --- a/Kernel_23/include/CGAL/Kernel_traits.h +++ b/Kernel_23/include/CGAL/Kernel_traits.h @@ -19,7 +19,6 @@ #include #include -#include namespace CGAL { diff --git a/Mesh_3/benchmark/Mesh_3/StdAfx.h b/Mesh_3/benchmark/Mesh_3/StdAfx.h index 57890430a5b2..9648697498aa 100644 --- a/Mesh_3/benchmark/Mesh_3/StdAfx.h +++ b/Mesh_3/benchmark/Mesh_3/StdAfx.h @@ -42,11 +42,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include diff --git a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h index 7e3af3de705e..3ab3f0d3ba5f 100644 --- a/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h +++ b/Mesh_3/include/CGAL/Implicit_to_labeling_function_wrapper.h @@ -33,7 +33,6 @@ #include #include -#include #include #include @@ -67,9 +66,9 @@ class Implicit_to_labeling_function_wrapper } private: - typedef typename boost::mpl::if_, - Function_*, - Function_>::type Stored_function; + typedef std::conditional_t, + Function_*, + Function_> Stored_function; /// Function to wrap Stored_function f_; diff --git a/Mesh_3/include/CGAL/Mesh_3/Image_to_labeled_function_wrapper.h b/Mesh_3/include/CGAL/Mesh_3/Image_to_labeled_function_wrapper.h index 45246e4463db..3d1c030ff08b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Image_to_labeled_function_wrapper.h +++ b/Mesh_3/include/CGAL/Mesh_3/Image_to_labeled_function_wrapper.h @@ -26,7 +26,6 @@ #include #include #include -#include namespace CGAL { diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h index 44e4f82b82d2..ad023df618e2 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h @@ -37,7 +37,6 @@ #include #include -#include #include #include @@ -172,9 +171,9 @@ template::value, + std::is_convertible_v, // Parallel # ifdef CGAL_MESH_3_USE_LAZY_UNSORTED_REFINEMENT_QUEUE @@ -209,7 +208,7 @@ template # endif - >::type // boost::if (parallel/sequential) + > // std::conditional (parallel/sequential) #else // !CGAL_LINKED_WITH_TBB diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index b4e2af503757..50e0a6cef08d 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -640,9 +639,9 @@ template class Base_ = Refine_facets_3_base, #ifdef CGAL_LINKED_WITH_TBB - class Container_ = typename boost::mpl::if_c // (parallel/sequential?) + class Container_ = std::conditional_t // (parallel/sequential?) < - std::is_convertible::value, + std::is_convertible_v, // Parallel # ifdef CGAL_MESH_3_USE_LAZY_UNSORTED_REFINEMENT_QUEUE Meshes::Filtered_deque_container @@ -679,7 +678,7 @@ template # endif - >::type // boost::if (parallel/sequential) + > // std::conditional (parallel/sequential) #else // !CGAL_LINKED_WITH_TBB diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h index db2dde5b6d3d..e8517c94945a 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h index c02efa6dcc65..25ec0c4f25c4 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_K.h @@ -15,7 +15,6 @@ #include #include #include -#include #include namespace CGAL { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h index 5c3a64287d28..122cfe90885b 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_static_filters.h @@ -16,7 +16,6 @@ #include // bug, should be included by the next one #include #include -#include namespace CGAL { namespace SFA { // static filter adapter @@ -98,9 +97,9 @@ struct Cartesian_static_filters, R_, Derived_> : public R_ { template struct Functor : Inherit_functor {}; template struct Functor { typedef - //typename boost::mpl::if_ < - //std::is_same, - //typename Get_functor::type, + //std::conditional_t < + //std::is_same_v, + //typename Get_functor, SFA::Orientation_of_points_2 // >::type type; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h b/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h index d62b8215cc52..edfb15ae9e95 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/KernelD_converter.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -80,12 +79,12 @@ class KernelD_converter_ // Explicit calls to boost::mpl functions to avoid parenthesis // warning on some versions of GCC - typedef typename boost::mpl::if_ < + typedef std::conditional_t < // If Point==Vector, keep only one conversion - boost::mpl::or_, + duplicate::value || // For iterator objects, the default is make_transforming_iterator - boost::mpl::bool_<(iterator_tag_traits::is_iterator && no_converter::value)> >, - Do_not_use,K1_Obj>::type argument_type; + (iterator_tag_traits::is_iterator && no_converter::value), + Do_not_use,K1_Obj> argument_type; //typedef typename KOC::argument_type K1_Obj; //typedef typename KOC::result_type K2_Obj; public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h b/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h index a3255d25eb00..4eb0e8900631 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/functor_tags.h @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -233,7 +232,7 @@ namespace CGAL { #undef CGAL_DECL_ITER_OBJ templatestruct Get_functor_category,B,C> : - boost::mpl::if_c::is_iterator, + std::conditional::is_iterator, Construct_iterator_tag, Construct_tag> {}; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/utils.h b/NewKernel_d/include/CGAL/NewKernel_d/utils.h index a1ac6faeddd2..f2e6a2f3ada5 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/utils.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/utils.h @@ -145,11 +145,11 @@ struct Has_type_different_from #define CGAL_KD_DEFAULT_FUNCTOR(Tg,Name,ReqTyp,ReqFun) \ template \ struct Get_functor::value \ || !Provides_types >::value \ || !Provides_functors >::value \ - , int, void>::type> \ + , int, void>> \ { \ typedef CGAL_STRIP_PAREN_ Name type; \ typedef K Bound_kernel; \ @@ -159,11 +159,11 @@ struct Has_type_different_from #define CGAL_KD_DEFAULT_TYPE(Tg,Name,ReqTyp,ReqFun) \ template \ struct Get_type::value \ || !Provides_types >::value \ || !Provides_functors >::value \ - , int, void>::type> \ + , int, void>> \ { \ typedef CGAL_STRIP_PAREN_ Name type; \ typedef K Bound_kernel; \ diff --git a/NewKernel_d/test/NewKernel_d/Epick_d.cpp b/NewKernel_d/test/NewKernel_d/Epick_d.cpp index 18ac1657ee63..5693977869a4 100644 --- a/NewKernel_d/test/NewKernel_d/Epick_d.cpp +++ b/NewKernel_d/test/NewKernel_d/Epick_d.cpp @@ -509,8 +509,8 @@ void test3(){ ; CP_ cp_ Kinit(construct_point_d_object); CV_ cv_ Kinit(construct_vector_d_object); - typename boost::mpl::if_,Construct_point3_helper,CP_>::type cp(cp_); - typename boost::mpl::if_,Construct_point3_helper,CV_>::type cv(cv_); + std::conditional_t,Construct_point3_helper,CP_> cp(cp_); + std::conditional_t,Construct_point3_helper,CV_> cv(cv_); CCI ci Kinit(construct_cartesian_const_iterator_d_object); CC cc Kinit(compute_coordinate_d_object); CL cl Kinit(compare_lexicographically_d_object); diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index 3f06ef3fb329..3f8a2812968a 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -19,7 +19,6 @@ #include // for Root_of functor #include -#include #include #include @@ -1179,12 +1178,11 @@ struct Coercion_traits< Lazy_exact_nt, Lazy_exact_nt > Are_implicit_interoperable; \ private: \ static const bool interoperable \ - =std::is_same< Are_implicit_interoperable, Tag_false>::value; \ + =std::is_same< Are_implicit_interoperable, Tag_false>::value; \ public: \ - typedef typename boost::mpl::if_c \ - ::type Type; \ - typedef typename boost::mpl::if_c >::type Cast; \ + typedef std::conditional_t Type; \ + typedef std::conditional_t > Cast; \ }; \ \ template \ diff --git a/Number_types/include/CGAL/Quotient.h b/Number_types/include/CGAL/Quotient.h index e91e22208a50..8c117c2fb6d8 100644 --- a/Number_types/include/CGAL/Quotient.h +++ b/Number_types/include/CGAL/Quotient.h @@ -627,13 +627,13 @@ template< class NT > class Algebraic_structure_traits_quotient_base< Quotient::Sqrt, - Null_functor >::value, + typedef std::conditional_t< + !std::is_same_v< typename Algebraic_structure_traits::Sqrt, + Null_functor >, typename INTERN_QUOTIENT::Sqrt_selector< Type, Is_exact >::Sqrt, Null_functor - >::type Sqrt; + > Sqrt; class Simplify : public CGAL::cpp98::unary_function< Type&, void > { diff --git a/Number_types/include/CGAL/Sqrt_extension/Algebraic_structure_traits.h b/Number_types/include/CGAL/Sqrt_extension/Algebraic_structure_traits.h index b0913afb1b6f..b1500148b598 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Algebraic_structure_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Algebraic_structure_traits.h @@ -204,10 +204,10 @@ class Algebraic_structure_traits< Sqrt_extension< COEFF_, ROOT_, ACDE_TAG,FP_TAG typedef Sqrt_extension< COEFF_, ROOT_, ACDE_TAG,FP_TAG > Type; // Tag_true if COEFF and ROOT are exact - typedef typename ::boost::mpl::if_c< - bool( ::std::is_same::Is_exact,::CGAL::Tag_true>::value )&& - bool( ::std::is_same::Is_exact,::CGAL::Tag_true>::value ) - ,::CGAL::Tag_true,::CGAL::Tag_false>::type Is_exact; + typedef std::conditional_t< + std::is_same_v::Is_exact,::CGAL::Tag_true> && + std::is_same::Is_exact,::CGAL::Tag_true> + ,::CGAL::Tag_true,::CGAL::Tag_false> Is_exact; typedef typename Algebraic_structure_traits::Is_numerical_sensitive Is_numerical_sensitive; diff --git a/Number_types/include/CGAL/Sqrt_extension/Coercion_traits.h b/Number_types/include/CGAL/Sqrt_extension/Coercion_traits.h index 6b4344348d4d..5b5ddfa45c69 100644 --- a/Number_types/include/CGAL/Sqrt_extension/Coercion_traits.h +++ b/Number_types/include/CGAL/Sqrt_extension/Coercion_traits.h @@ -178,7 +178,7 @@ template struct CT_ext_not_to_fwsqrt; // template struct Coercion_traits_for_level, B , CTL_SQRT_EXT> -:public ::boost::mpl::if_c< +:public std::conditional_t< // if B is fwsqrt ::boost::is_base_and_derived< Field_with_sqrt_tag, @@ -192,7 +192,7 @@ typename Algebraic_structure_traits::Algebraic_category >::value , //else take Intern::Coercion_traits not for fwsqrt INTERN_CT::CT_ext_not_to_fwsqrt< Sqrt_extension ,B> - >::type + > {}; // diff --git a/Periodic_3_mesh_3/include/CGAL/Implicit_to_labeled_subdomains_function_wrapper.h b/Periodic_3_mesh_3/include/CGAL/Implicit_to_labeled_subdomains_function_wrapper.h index a96c2eafa366..d821ab2fe3f9 100644 --- a/Periodic_3_mesh_3/include/CGAL/Implicit_to_labeled_subdomains_function_wrapper.h +++ b/Periodic_3_mesh_3/include/CGAL/Implicit_to_labeled_subdomains_function_wrapper.h @@ -15,7 +15,6 @@ #include #include -#include #if defined(BOOST_MSVC) # pragma warning(push) @@ -47,9 +46,9 @@ class Implicit_to_labeled_subdomains_function_wrapper } private: - typedef typename boost::mpl::if_, - Function_*, - Function_>::type Stored_function; + typedef std::conditional_t, + Function_*, + Function_> Stored_function; /// Function to wrap Stored_function f_; diff --git a/Periodic_3_mesh_3/include/CGAL/Periodic_3_function_wrapper.h b/Periodic_3_mesh_3/include/CGAL/Periodic_3_function_wrapper.h index 2780d6183932..b1ee5e650654 100644 --- a/Periodic_3_mesh_3/include/CGAL/Periodic_3_function_wrapper.h +++ b/Periodic_3_mesh_3/include/CGAL/Periodic_3_function_wrapper.h @@ -18,7 +18,6 @@ #include #include -#include namespace CGAL { @@ -46,9 +45,9 @@ class Periodic_3_function_wrapper } private: - typedef typename boost::mpl::if_, - Function_*, - Function_>::type Stored_function; + typedef std::conditional_t, + Function_*, + Function_>: Stored_function; /// Function to wrap Stored_function f_; diff --git a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h index 7eed15886cd0..63fb94044699 100644 --- a/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h +++ b/Periodic_3_triangulation_3/include/CGAL/Periodic_3_regular_triangulation_3.h @@ -31,7 +31,6 @@ #include #include -#include #include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/AABB_traversal_traits_with_transformation.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/AABB_traversal_traits_with_transformation.h index 838842771364..7dad2004ecd0 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/AABB_traversal_traits_with_transformation.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/AABB_traversal_traits_with_transformation.h @@ -27,7 +27,6 @@ #include #include -#include namespace CGAL { diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h index 4a15d9e59c74..68f0c9e5e6c8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/face_graph_utils.h @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -388,12 +387,12 @@ struct TweakedGetVertexPointMap typedef typename std::is_same::value_type>::type Use_default_tag; - typedef typename boost::mpl::if_< - Use_default_tag, + typedef std::conditional_t< + Use_default_tag::value, Default_map, Dummy_default_vertex_point_map::vertex_descriptor > - >::type type; + > type; }; template diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index 26e205ea43d9..f32f9d907a98 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -29,7 +29,6 @@ #include #include -#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index ef361b175299..b99ed460a6f6 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -30,7 +30,6 @@ #include #include -#include #include #include diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h index f1b88540a606..a608179f49ae 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_slicer.h @@ -30,7 +30,6 @@ #include #include -#include #include #include @@ -79,12 +78,12 @@ template::type >::type, + typename boost::property_map< TriangleMesh, vertex_point_t>::type >, Default, - VertexPointMap>::type> > >, + VertexPointMap>>>>, bool UseParallelPlaneOptimization=true> class Polygon_mesh_slicer { diff --git a/Polynomial/include/CGAL/Polynomial.h b/Polynomial/include/CGAL/Polynomial.h index b3681eb43b5f..ad61432cd405 100644 --- a/Polynomial/include/CGAL/Polynomial.h +++ b/Polynomial/include/CGAL/Polynomial.h @@ -34,7 +34,6 @@ #include #include #include -#include #include #include diff --git a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h index e2529d2e3495..de6bcdc447bd 100644 --- a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h +++ b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h @@ -486,9 +486,9 @@ class Polynomial // and NT would be changed by NTX typedef typename Fraction_traits::Is_fraction Is_fraction; typedef typename Coercion_traits::Type Type; - typedef typename ::boost::mpl::if_c< - ::std::is_same::value, Is_fraction, CGAL::Tag_false - >::type If_decomposable_AND_Type_equals_NT; + typedef std::conditional_t< + std::is_same_v, Is_fraction, CGAL::Tag_false + > If_decomposable_AND_Type_equals_NT; return sign_at_(x,If_decomposable_AND_Type_equals_NT()); } diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index 6eb4f0d6e3f2..dfbf7cf31357 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -999,7 +999,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, // Sign_at, Sign_at_homogeneous, Compare // define XXX_ even though ICoeff may not be Real_embeddable - // select propoer XXX among XXX_ or Null_functor using ::boost::mpl::if_ + // select propoer XXX among XXX_ or Null_functor using ::std::conditional_t private: struct Sign_at_ { private: @@ -1036,8 +1036,8 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, typedef Real_embeddable_traits RET_IC; typedef typename RET_IC::Is_real_embeddable IC_is_real_embeddable; public: - typedef typename ::boost::mpl::if_::type Sign_at; - typedef typename ::boost::mpl::if_::type Sign_at_homogeneous; + typedef std::conditional_t Sign_at; + typedef std::conditional_t Sign_at_homogeneous; typedef typename Real_embeddable_traits::Compare Compare; diff --git a/Property_map/include/CGAL/Dynamic_property_map.h b/Property_map/include/CGAL/Dynamic_property_map.h index a7dc48b5354a..bca414e19b00 100644 --- a/Property_map/include/CGAL/Dynamic_property_map.h +++ b/Property_map/include/CGAL/Dynamic_property_map.h @@ -19,7 +19,6 @@ #include #include -#include #include @@ -127,9 +126,9 @@ struct Dynamic_with_index { typedef Key key_type; typedef Value value_type; - typedef typename boost::mpl::if_< std::is_same, - value_type, - value_type&>::type reference; + typedef std::conditional_t< std::is_same_v, + value_type, + value_type&> reference; typedef boost::read_write_property_map_tag category; Dynamic_with_index() 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 f77f1d9c07f3..ef7c6164f2d0 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 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff --git a/STL_Extension/include/CGAL/Compact_container.h b/STL_Extension/include/CGAL/Compact_container.h index 24f7ef91c721..81ff5cf1bce2 100644 --- a/STL_Extension/include/CGAL/Compact_container.h +++ b/STL_Extension/include/CGAL/Compact_container.h @@ -35,8 +35,6 @@ #include #include -#include - // An STL like container with the following properties : // - to achieve compactness, it requires access to a pointer stored in T, // specified by a traits. This pointer is supposed to be 4 bytes aligned @@ -866,10 +864,10 @@ namespace internal { typedef typename DSC::value_type value_type; typedef typename DSC::size_type size_type; typedef typename DSC::difference_type difference_type; - typedef typename boost::mpl::if_c< Const, const value_type*, - value_type*>::type pointer; - typedef typename boost::mpl::if_c< Const, const value_type&, - value_type&>::type reference; + typedef std::conditional_t< Const, const value_type*, + value_type*> pointer; + typedef std::conditional_t< Const, const value_type&, + value_type&> reference; typedef std::bidirectional_iterator_tag iterator_category; // the initialization with nullptr is required by our Handle concept. diff --git a/STL_Extension/include/CGAL/Concurrent_compact_container.h b/STL_Extension/include/CGAL/Concurrent_compact_container.h index 7f18ab80f57e..e6a2a5dbecf1 100644 --- a/STL_Extension/include/CGAL/Concurrent_compact_container.h +++ b/STL_Extension/include/CGAL/Concurrent_compact_container.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012 INRIA Sophia-Antipolis (France). +3// Copyright (c) 2012 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org) @@ -36,8 +36,6 @@ #include #include -#include - namespace CGAL { #define CGAL_GENERATE_MEMBER_DETECTOR(X) \ diff --git a/STL_Extension/include/CGAL/Handle_with_policy.h b/STL_Extension/include/CGAL/Handle_with_policy.h index 5f952a66e15f..528bf8061d10 100644 --- a/STL_Extension/include/CGAL/Handle_with_policy.h +++ b/STL_Extension/include/CGAL/Handle_with_policy.h @@ -21,8 +21,6 @@ #include #include -#include - #include #ifdef CGAL_USE_LEDA @@ -728,10 +726,10 @@ class Handle_with_policy { static Bind bind; // Define type that is used for function matching - typedef typename ::boost::mpl::if_c< + typedef std::conditional_t< is_class_hierarchy, ::CGAL::Tag_true, - ::CGAL::Tag_false >::type + ::CGAL::Tag_false > Class_hierarchy; //! the internal representation, i.e., \c T plus a reference count diff --git a/STL_Extension/include/CGAL/Named_function_parameters.h b/STL_Extension/include/CGAL/Named_function_parameters.h index d0f1648f816e..7558aae88f25 100644 --- a/STL_Extension/include/CGAL/Named_function_parameters.h +++ b/STL_Extension/include/CGAL/Named_function_parameters.h @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -143,14 +142,14 @@ struct Lookup_named_param_def typedef typename internal_np::Get_param::type NP_type; typedef typename internal_np::Get_param::reference NP_reference; - typedef typename boost::mpl::if_< - std::is_same, - D, NP_type>::type + typedef std::conditional_t< + std::is_same_v, + D, NP_type> type; - typedef typename boost::mpl::if_< - std::is_same, - D&, NP_reference>::type + typedef std::conditional_t< + std::is_same_v, + D&, NP_reference> reference; }; diff --git a/STL_Extension/include/CGAL/transforming_iterator.h b/STL_Extension/include/CGAL/transforming_iterator.h index bd94ad33c4fd..21d88e8f69cf 100644 --- a/STL_Extension/include/CGAL/transforming_iterator.h +++ b/STL_Extension/include/CGAL/transforming_iterator.h @@ -12,7 +12,6 @@ #ifndef CGAL_TRANSFORMING_ITERATOR_H #define CGAL_TRANSFORMING_ITERATOR_H #include -#include #include #include #include @@ -55,10 +54,8 @@ class transforming_iterator_helper typedef typename Default::Get>>::type value_type; // Crappy heuristic. If we have *it that returns a Weighted_point and F that returns a reference to the Point contained in the Weighted_point it takes as argument, we do NOT want the transformed iterator to return a reference to the temporary *it. On the other hand, if *it returns an int n, and F returns a reference to array[n] it is not so good to lose the reference. This probably should be done elsewhere and should at least be made optional... - typedef typename boost::mpl::if_< - boost::mpl::or_, - std::is_integral >, - reference_, value_type>::type reference; + typedef std::conditional_t || std::is_integral_v, + reference_, value_type> reference; public: typedef boost::iterator_adaptor< diff --git a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h index 6962b1ec8f21..528ea1e0e832 100644 --- a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h +++ b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h @@ -42,7 +42,6 @@ #include -#include #include namespace CGAL { diff --git a/Spatial_searching/include/CGAL/Fuzzy_iso_box.h b/Spatial_searching/include/CGAL/Fuzzy_iso_box.h index 0b34898eff93..08cc1da0063c 100644 --- a/Spatial_searching/include/CGAL/Fuzzy_iso_box.h +++ b/Spatial_searching/include/CGAL/Fuzzy_iso_box.h @@ -22,8 +22,6 @@ #include #include -#include - #include diff --git a/Spatial_searching/include/CGAL/Search_traits_adapter.h b/Spatial_searching/include/CGAL/Search_traits_adapter.h index ff640dc639a4..7a518cf68eed 100644 --- a/Spatial_searching/include/CGAL/Search_traits_adapter.h +++ b/Spatial_searching/include/CGAL/Search_traits_adapter.h @@ -224,16 +224,16 @@ class Search_traits_adapter : public Base_traits{ // Select type of iterator + construct class depending on whether // point map is lvalue or not - typedef typename boost::mpl::if_< - std::is_reference::reference>, + typedef std::conditional_t< + std::is_reference_v::reference>, typename Base::Cartesian_const_iterator_d, - No_lvalue_iterator>::type + No_lvalue_iterator> Cartesian_const_iterator_d; - typedef typename boost::mpl::if_< - std::is_reference::reference>, + typedef std::conditional_t< + std::is_reference_v::reference>, Construct_cartesian_const_iterator_d_lvalue, - Construct_cartesian_const_iterator_d_no_lvalue>::type + Construct_cartesian_const_iterator_d_no_lvalue> Construct_cartesian_const_iterator_d; struct Construct_iso_box_d: public Base::Construct_iso_box_d{ diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h index a799eccda60b..30b1e25de59a 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_aux.h @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -36,12 +35,10 @@ struct Has_inexact_constructions { typedef typename K::FT FT ; - typedef typename boost::mpl::if_< boost::mpl::or_< std::is_same - , std::is_same - > - , Tag_true - , Tag_false - >::type type ; + typedef std::conditional_t< std::is_same_v || std::is_same_v + , Tag_true + , Tag_false + > type ; } ; template diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 4ce20796d1ab..02b050f790ad 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -96,9 +95,9 @@ namespace internal { template struct Itag { - typedef typename boost::mpl::if_::Is_exact, + typedef std::conditional_t<(typename Algebraic_structure_traits::Is_exact)::value, Exact_intersections_tag, - Exact_predicates_tag>::type type; + Exact_predicates_tag> type; }; } // namespace internal diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_2.h index f7e4a653060b..c3ab2223a0ad 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_2.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h index 93e00b1680ff..295132483846 100644 --- a/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_hierarchy_2.h @@ -26,7 +26,6 @@ #include #include -#include #include #include #include diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_3.h index aa58c124ed1f..7795840a2e6d 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_3.h @@ -54,7 +54,6 @@ #include #endif -#include #include #include #include diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h index 3a73305b380e..f2c945342e8e 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_cell_base_with_weighted_circumcenter_3.h @@ -22,7 +22,6 @@ #include #include -#include #include namespace CGAL { diff --git a/Triangulation_3/include/CGAL/Triangulation_3.h b/Triangulation_3/include/CGAL/Triangulation_3.h index 7b8ef9ab6c8a..fd4b530c7a88 100644 --- a/Triangulation_3/include/CGAL/Triangulation_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_3.h @@ -48,7 +48,6 @@ #include #include #include -#include #include #include #include diff --git a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h index 021e40e2ffef..c852a4bed75c 100644 --- a/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_hierarchy_3.h @@ -48,7 +48,6 @@ #include #include #include -#include #include #include diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h index 78b8822f5984..01f08ac186ce 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_delaunay_3.h @@ -25,7 +25,6 @@ #include #include -#include #include #include diff --git a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_parallel_triangulation_3.h b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_parallel_triangulation_3.h index e93418c19cf1..20c4351bc498 100644 --- a/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_parallel_triangulation_3.h +++ b/Triangulation_3/test/Triangulation_3/include/CGAL/_test_cls_parallel_triangulation_3.h @@ -16,7 +16,6 @@ #include #include -#include template diff --git a/Triangulation_3/test/Triangulation_3/test_regular_insert_range_with_info.cpp b/Triangulation_3/test/Triangulation_3/test_regular_insert_range_with_info.cpp index e4f80d9149f0..c1b00d9aca9b 100644 --- a/Triangulation_3/test/Triangulation_3/test_regular_insert_range_with_info.cpp +++ b/Triangulation_3/test/Triangulation_3/test_regular_insert_range_with_info.cpp @@ -37,9 +37,9 @@ struct Tester void test_iterator_on_pair() const { typedef std::vector > Container; - typedef typename boost::mpl::if_, - std::add_const_t, - Container>::type Cast_type; + typedef std::conditional_t, + Container> Cast_type; Container points; points.push_back(std::make_pair(Weighted_point(Bare_point(0.160385, 0.599679, 0.374932), -0.118572), 0)); @@ -90,9 +90,9 @@ struct Tester void test_zip_iterator() const { typedef std::vector Container; - typedef typename boost::mpl::if_, - std::add_const_t, - Container >::type Cast_type; + typedef std::conditional_t, + Container > Cast_type; Container points; points.push_back(Weighted_point(Bare_point(0,0,0),1)); @@ -156,9 +156,9 @@ struct Tester void test_transform_iterator() const { typedef std::vector< Weighted_point > Container; - typedef typename boost::mpl::if_, - std::add_const_t, - Container >::type Cast_type; + typedef std::conditional_t, + Container > Cast_type; Container points; points.push_back(Weighted_point(Bare_point(0,0,0),1)); From 45f0c6665a29f2557545c1436731b45031d20dad Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 25 Sep 2023 10:50:29 +0200 Subject: [PATCH 0765/1398] Added clip support for tetrahedral meshes --- .../Polyhedron/resources/shader_c3t3.frag | 29 +++++++++++++++---- .../Polyhedron/resources/shader_c3t3.vert | 24 +++++++++++++++ .../resources/shader_c3t3_edges.frag | 10 +++++++ .../resources/shader_c3t3_edges.vert | 24 +++++++++++++++ 4 files changed, 82 insertions(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag index 27b255c5e1c6..9408f3d59327 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.frag @@ -2,6 +2,7 @@ in vec4 color; in vec4 fP; in vec3 fN; +in float dist[6]; flat in vec2 subdomain_out; uniform vec4 light_pos; uniform vec4 light_diff; @@ -10,6 +11,7 @@ uniform vec4 light_amb; uniform float spec_power ; uniform int is_two_side; uniform bool is_selected; +uniform bool is_clipbox_on; uniform float near; uniform float far; uniform float width; @@ -28,7 +30,19 @@ float depth(float z) return (2 * near) / (far + near - z * (far - near)); } -void main(void) { +bool compute_clip_visibility() { + if(is_clipbox_on) + return dist[0]>0.0 || + dist[1]>0.0 || + dist[2]>0.0 || + dist[3]>0.0 || + dist[4]>0.0 || + dist[5]>0.0; + else + return false; +} + +bool compute_filtering_visibility() { if(is_filterable) { uint domain1 = uint(subdomain_out.x); @@ -37,10 +51,15 @@ void main(void) { uint i2 = domain2/25u; uint visible1 = uint(is_visible_bitset[i1]); uint visible2 = uint(is_visible_bitset[i2]); - if((visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u) - { - discard; - } + return (visible1>>(domain1%25u))%2u == 0u && (visible2>>(domain2%25u))%2u == 0u; + } + else + return false; +} + +void main(void) { + if (compute_clip_visibility() || compute_filtering_visibility()) { + discard; } float d = depth(gl_FragCoord.z); float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r; diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert index 2298a14b15cf..b7677129d668 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3.vert @@ -12,13 +12,37 @@ uniform float shrink_factor; out vec4 fP; out vec3 fN; out vec4 color; +out float dist[6]; flat out vec2 subdomain_out; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; uniform float point_size; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + void main(void) { subdomain_out = subdomain_in; gl_PointSize = point_size; color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); + if(is_clipbox_on) + compute_distances(); fP = mv_matrix * vertex; mat3 norm_matrix_3; diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag index c3fbb6bba004..d15d6e125122 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.frag @@ -1,12 +1,22 @@ #version 150 in vec4 color; +in float dist[6]; flat in vec2 subdomain_out; +uniform bool is_clipbox_on; uniform bool is_surface; uniform vec4 is_visible_bitset; uniform bool is_filterable; out vec4 out_color; void main(void) { + if(is_clipbox_on) + if(dist[0]>0.0 || + dist[1]>0.0 || + dist[2]>0.0 || + dist[3]>0.0 || + dist[4]>0.0 || + dist[5]>0.0) + discard; if(is_filterable) { uint domain1 = uint(subdomain_out.x); diff --git a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert index 9d00649a829c..60f51ff758a9 100644 --- a/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert +++ b/Polyhedron/demo/Polyhedron/resources/shader_c3t3_edges.vert @@ -5,12 +5,36 @@ in vec2 subdomain_in; uniform mat4 mvp_matrix; uniform vec4 cutplane; out vec4 color; +out float dist[6]; uniform float point_size; flat out vec2 subdomain_out; +uniform bool is_clipbox_on; +uniform mat4 clipbox1; +uniform mat4 clipbox2; + +void compute_distances(void) +{ + for(int i=0; i<3; ++i) + { + dist[i]= + clipbox1[i][0]*vertex.x+ + clipbox1[i][1]*vertex.y+ + clipbox1[i][2]*vertex.z + + clipbox1[i][3]; + dist[i+3]= + clipbox2[i][0]*vertex.x+ + clipbox2[i][1]*vertex.y+ + clipbox2[i][2]*vertex.z + + clipbox2[i][3]; + } +} + void main(void) { subdomain_out = subdomain_in; gl_PointSize = point_size; color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w); + if(is_clipbox_on) + compute_distances(); gl_Position = mvp_matrix * vertex; } From da67575f3b66d7d48f6cb16a90af3c4fde471ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Bartoletti?= Date: Wed, 20 Sep 2023 10:06:18 +0200 Subject: [PATCH 0766/1398] Fix general_polygon_example.png The visibility zone is slightly offset on the original image. This version displays the correct zone. --- .../fig/general_polygon_example.png | Bin 19759 -> 108727 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Visibility_2/doc/Visibility_2/fig/general_polygon_example.png b/Visibility_2/doc/Visibility_2/fig/general_polygon_example.png index 2f06e9a7b7406a143f6015510c736096e7fd9835..59c2cc63e99276b4dfa0c15fa268ea642e7a3ff0 100644 GIT binary patch literal 108727 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%0Au~ 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 Q;2~!Wp00i_>zopr03T@3Hvj+t From eb5c2816d500d99ebc2974f255cce82e50a153fc Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 25 Sep 2023 11:55:28 +0200 Subject: [PATCH 0767/1398] Adapted clip button to a toggle behaviour --- .../Plugins/PCA/Clipping_box_plugin.cpp | 52 +++++++++++++++++-- .../demo/Polyhedron/Scene_image_item.cpp | 1 + 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp index 062e993b175d..9753e4e2f11f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp @@ -64,10 +64,14 @@ public Q_SLOTS: void tab_change(); private: bool eventFilter(QObject *, QEvent *); + bool process_event_clip_box(QEvent *); + bool process_event_clip_orthographic(QEvent *); + void do_clip(bool); QAction* actionClipbox; ClipWidget* dock_widget; Scene_edit_box_item* item; bool shift_pressing; + bool clipping; Selection_visualizer* visualizer; }; // end Clipping_box_plugin @@ -96,6 +100,7 @@ void Clipping_box_plugin::init(QMainWindow* mainWindow, CGAL::Three::Scene_inter this, SLOT(connectNewViewer(QObject*))); visualizer = nullptr; shift_pressing = false; + clipping = false; } void Clipping_box_plugin::clipbox() @@ -148,6 +153,25 @@ void Clipping_box_plugin::enableAction() { } void Clipping_box_plugin::clip(bool b) +{ + clipping = b; + if (b) + { + Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) + { + v->installEventFilter(this); + } + } + else { + Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) + { + v->removeEventFilter(this); + } + } + do_clip(b); +} + +void Clipping_box_plugin::do_clip(bool b) { typedef CGAL::Epick Kernel; typedef CGAL::Polyhedron_3 Mesh; @@ -231,12 +255,20 @@ void Clipping_box_plugin::tab_change() } -bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) { - static QImage background; - if (dock_widget->isHidden() || !(dock_widget->isActiveWindow()) || dock_widget->tabWidget->currentIndex() != 1 - || (dock_widget->tabWidget->currentIndex() == 1 && !dock_widget->clipButton->isChecked())) +bool Clipping_box_plugin::process_event_clip_box(QEvent *event) +{ + if (event->type() == QEvent::MouseButtonRelease) + { +// item->itemChanged(); + do_clip(clipping); return false; + } + return false; +} +bool Clipping_box_plugin::process_event_clip_orthographic(QEvent *event) +{ + static QImage background; if(event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent *keyEvent = static_cast(event); @@ -359,4 +391,16 @@ bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) { } return false; } + +bool Clipping_box_plugin::eventFilter(QObject *, QEvent *event) { + if (dock_widget->isHidden() || !dock_widget->isActiveWindow()) + return false; + if (dock_widget->tabWidget->currentIndex() == 0 && dock_widget->pushButton->isChecked()) + return process_event_clip_box(event); + else if (dock_widget->tabWidget->currentIndex() == 1 && dock_widget->clipButton->isChecked()) + return process_event_clip_orthographic(event); + else + return false; + +} #include "Clipping_box_plugin.moc" diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp index bdcf80a5091c..c5770c8adab5 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp @@ -756,6 +756,7 @@ void Scene_image_item::drawEdges(Viewer_interface *viewer) const getEdgeContainer(0)->setWidth(3.0f); } getEdgeContainer(0)->setColor(QColor(Qt::black)); + getEdgeContainer(0)->setClipping(false); viewer->glDepthRangef(0.00001f, 0.99999f); getEdgeContainer(0)->draw(viewer, true); viewer->glDepthRangef(0.0f, 1.0f); From 1d29a75c9a36cc7c0bb2f6867f99b4ecaa138416 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 25 Sep 2023 16:09:41 +0200 Subject: [PATCH 0768/1398] iformat/oformat are in CGAL::IO The calls without the `IO::` namespace are deprecated. --- .../include/CGAL/Curved_kernel_via_analysis_2/Point_2.h | 8 ++++---- Mesh_2/include/CGAL/IO/File_poly.h | 2 +- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 4 ++-- Point_set_processing_3/include/CGAL/IO/read_xyz_points.h | 6 +++--- Stream_support/include/CGAL/IO/PLY/PLY_reader.h | 2 +- Stream_support/include/CGAL/IO/STL/STL_reader.h | 2 +- Stream_support/include/CGAL/IO/VTK.h | 2 +- .../include/CGAL/Constrained_triangulation_2.h | 2 +- .../internal/Polyline_constraint_hierarchy_2.h | 8 ++++---- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index 789f24b841e4..f64c67b70eac 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -736,13 +736,13 @@ class Point_2 : swallow(is, '('); // read values - is >> iformat(rep._m_xy); + is >> IO::iformat(rep._m_xy); swallow(is, ','); - is >> iformat(rep._m_x); + is >> IO::iformat(rep._m_x); swallow(is, ','); - is >> iformat(rep._m_curve); + is >> IO::iformat(rep._m_curve); swallow(is, ','); - is >> iformat(rep._m_arcno); + is >> IO::iformat(rep._m_arcno); swallow(is, ','); is >> rep._m_location; diff --git a/Mesh_2/include/CGAL/IO/File_poly.h b/Mesh_2/include/CGAL/IO/File_poly.h index 9f3002c32f05..0c5704cae342 100644 --- a/Mesh_2/include/CGAL/IO/File_poly.h +++ b/Mesh_2/include/CGAL/IO/File_poly.h @@ -43,7 +43,7 @@ read_triangle_poly_file(CDT& t, std::istream &f, { unsigned int j; double x, y; - f >> j >> iformat(x) >> iformat(y); + f >> j >> IO::iformat(x) >> IO::iformat(y); Point p(x, y); skip_until_EOL(f); skip_comment_OFF(f); vertices[--j] = t.insert(p); diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h index b4e2af503757..88a6e8ef555b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h @@ -1148,9 +1148,9 @@ number_of_bad_elements_impl() const Subdomain mc_subdomain = this->r_oracle_.is_in_domain_object()(this->r_tr_.dual(mc)); std::cerr << "*** Is in complex? c is marked in domain: " << this->r_c3t3_.is_in_complex(c) - << " / c is really in subdomain: " << oformat(c_subdomain) + << " / c is really in subdomain: " << IO::oformat(c_subdomain) << " / mc is marked in domain: " << this->r_c3t3_.is_in_complex(mc) - << " / mc is really in subdomain: " << oformat(mc_subdomain) + << " / mc is really in subdomain: " << IO::oformat(mc_subdomain) << std::endl; diff --git a/Point_set_processing_3/include/CGAL/IO/read_xyz_points.h b/Point_set_processing_3/include/CGAL/IO/read_xyz_points.h index b930b167d093..ba023110950f 100644 --- a/Point_set_processing_3/include/CGAL/IO/read_xyz_points.h +++ b/Point_set_processing_3/include/CGAL/IO/read_xyz_points.h @@ -134,15 +134,15 @@ bool read_XYZ(std::istream& is, { iss.clear(); iss.str(line); - if (iss >> iformat(x) >> iformat(y) >> iformat(z)) + if (iss >> IO::iformat(x) >> IO::iformat(y) >> IO::iformat(z)) { Point point(x,y,z); Vector normal = CGAL::NULL_VECTOR; // ... + normal... - if (iss >> iformat(nx)) + if (iss >> IO::iformat(nx)) { // In case we could read one number, we expect that there are two more - if(iss >> iformat(ny) >> iformat(nz)){ + if(iss >> IO::iformat(ny) >> IO::iformat(nz)){ normal = Vector(nx,ny,nz); } else { std::cerr << "Error line " << lineNumber << " of file (incomplete normal coordinates)" << std::endl; diff --git a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h index a4a50bd36c8c..ee8b18ef59c0 100644 --- a/Stream_support/include/CGAL/IO/PLY/PLY_reader.h +++ b/Stream_support/include/CGAL/IO/PLY/PLY_reader.h @@ -201,7 +201,7 @@ class PLY_read_number void read_ascii(std::istream& stream, double& t) const { - if(!(stream >> iformat(t))) + if(!(stream >> IO::iformat(t))) stream.clear(std::ios::badbit); } diff --git a/Stream_support/include/CGAL/IO/STL/STL_reader.h b/Stream_support/include/CGAL/IO/STL/STL_reader.h index 16970596d098..a47872f44705 100644 --- a/Stream_support/include/CGAL/IO/STL/STL_reader.h +++ b/Stream_support/include/CGAL/IO/STL/STL_reader.h @@ -75,7 +75,7 @@ bool read_ASCII_facet(std::istream& is, return false; } - if(!(is >> iformat(x) >> iformat(y) >> iformat(z))) + if(!(is >> IO::iformat(x) >> IO::iformat(y) >> IO::iformat(z))) { if(verbose) std::cerr << "Error while reading point coordinates (premature end of file)" << std::endl; diff --git a/Stream_support/include/CGAL/IO/VTK.h b/Stream_support/include/CGAL/IO/VTK.h index 8878fde1523a..585cc9d96854 100644 --- a/Stream_support/include/CGAL/IO/VTK.h +++ b/Stream_support/include/CGAL/IO/VTK.h @@ -199,7 +199,7 @@ void write_soup_points_tag(std::ostream& os, { os << "\">\n"; for(const Point& p : points) - os << oformat(p.x()) << " " << oformat(p.y()) << " " << oformat(p.z()) << " "; + os << IO::oformat(p.x()) << " " << IO::oformat(p.y()) << " " << IO::oformat(p.z()) << " "; os << " \n"; } os << " \n"; diff --git a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h index 4ce20796d1ab..048b373187eb 100644 --- a/Triangulation_2/include/CGAL/Constrained_triangulation_2.h +++ b/Triangulation_2/include/CGAL/Constrained_triangulation_2.h @@ -623,7 +623,7 @@ insert_constraint(Vertex_handle vaa, Vertex_handle vbb, OutputIterator out) auto display_vertex(Vertex_handle v) const { With_point_tag point_tag; using CGAL::IO::oformat; - return oformat(v, point_tag); + return IO::oformat(v, point_tag); } #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS 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 b8bcaac8f18a..21144872845c 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 @@ -865,7 +865,7 @@ insert_constraint(T va, T vb){ using CGAL::IO::oformat; std::cerr << CGAL::internal::cdt_2_indent_level << "C_hierachy.insert_constraint( " - << oformat(va) << ", " << oformat(vb) << ")\n"; + << IO::oformat(va) << ", " << IO::oformat(vb) << ")\n"; #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS typename Sc_to_c_map::iterator scit = sc_to_c_map.find(he); if(scit == sc_to_c_map.end()){ @@ -900,7 +900,7 @@ insert_constraint_old_API(T va, T vb){ using CGAL::IO::oformat; std::cerr << CGAL::internal::cdt_2_indent_level << "C_hierachy.insert_constraint_old_API( " - << oformat(va) << ", " << oformat(vb) << ")\n"; + << IO::oformat(va) << ", " << IO::oformat(vb) << ")\n"; #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS typename Sc_to_c_map::iterator scit = sc_to_c_map.find(he); if(scit == sc_to_c_map.end()){ @@ -933,7 +933,7 @@ append_constraint(Constraint_id cid, T va, T vb){ using CGAL::IO::oformat; std::cerr << CGAL::internal::cdt_2_indent_level << "C_hierachy.append_constraint( ..., " - << oformat(va) << ", " << oformat(vb) << ")\n"; + << IO::oformat(va) << ", " << IO::oformat(vb) << ")\n"; #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS typename Sc_to_c_map::iterator scit = sc_to_c_map.find(he); if(scit == sc_to_c_map.end()){ @@ -1050,7 +1050,7 @@ add_Steiner(T va, T vb, T vc){ using CGAL::IO::oformat; std::cerr << CGAL::internal::cdt_2_indent_level << "C_hierachy.add_Steinter( " - << oformat(va) << ", " << oformat(vb) << ", " << oformat(vc) + << IO::oformat(va) << ", " << IO::oformat(vb) << ", " << IO::oformat(vc) << ")\n"; #endif // CGAL_CDT_2_DEBUG_INTERSECTIONS Context_list* hcl=nullptr; From eadd12cdb0e5545494e78946403fb7649fb611a6 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 25 Sep 2023 15:14:43 +0100 Subject: [PATCH 0769/1398] reindent --- .../CGAL/Variational_shape_approximation.h | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index d24ecb93ffa5..13e2e29944b8 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -1904,64 +1904,64 @@ class Variational_shape_approximation { if_subdivide = true; } else { - FT dist_max(0.0); - Vector_3 chord_vec = vector_functor(pt_begin, pt_end); - const FT chord_len = CGAL::approximate_sqrt(chord_vec.squared_length()); - bool degenerate_chord = false; - if (chord_len > FT(0.0)) { - Segment_3 seg(pt_begin, pt_end); - chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); - for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - //Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); - //vec = cross_product_functor(chord_vec, vec); - //const FT dist = CGAL::approximate_sqrt(vec.squared_length()); - const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance(m_vpoint_map[target(*citr, *m_ptm)], seg)); - if (dist > dist_max) { - chord_max = citr; - dist_max = dist; - } - } + FT dist_max(0.0); + Vector_3 chord_vec = vector_functor(pt_begin, pt_end); + const FT chord_len = CGAL::approximate_sqrt(chord_vec.squared_length()); + bool degenerate_chord = false; + if (chord_len > FT(0.0)) { + Segment_3 seg(pt_begin, pt_end); + chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); + for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { + //Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); + //vec = cross_product_functor(chord_vec, vec); + //const FT dist = CGAL::approximate_sqrt(vec.squared_length()); + const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance(m_vpoint_map[target(*citr, *m_ptm)], seg)); + if (dist > dist_max) { + chord_max = citr; + dist_max = dist; + } } - else { - degenerate_chord = true; - for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( - pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); - if (dist > dist_max) { - chord_max = citr; - dist_max = dist; - } - } + } + else { + degenerate_chord = true; + for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { + const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( + pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); + if (dist > dist_max) { + chord_max = citr; + dist_max = dist; + } } + } - FT criterion = dist_max; - if (relative_to_chord && !degenerate_chord) - criterion /= chord_len; - else - criterion /= m_average_edge_length; - - if (with_dihedral_angle) { - // suppose the proxy normal angle is acute - std::size_t px_left = get(m_fproxy_map, face(he_first, *m_ptm)); - std::size_t px_right = px_left; - if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) - px_right = get(m_fproxy_map, face(opposite(he_first, *m_ptm), *m_ptm)); - FT norm_sin(1.0); - if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) { - Vector_3 vec = cross_product_functor( - m_px_planes[px_left].normal, m_px_planes[px_right].normal); - norm_sin = CGAL::approximate_sqrt(vec.squared_length()); - } - criterion *= norm_sin; - } - if (is_boundary) { - if (criterion > boundary_subdivision_ratio) - if_subdivide = true; - } - else { - if (criterion > subdivision_ratio) - if_subdivide = true; + FT criterion = dist_max; + if (relative_to_chord && !degenerate_chord) + criterion /= chord_len; + else + criterion /= m_average_edge_length; + + if (with_dihedral_angle) { + // suppose the proxy normal angle is acute + std::size_t px_left = get(m_fproxy_map, face(he_first, *m_ptm)); + std::size_t px_right = px_left; + if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) + px_right = get(m_fproxy_map, face(opposite(he_first, *m_ptm), *m_ptm)); + FT norm_sin(1.0); + if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) { + Vector_3 vec = cross_product_functor( + m_px_planes[px_left].normal, m_px_planes[px_right].normal); + norm_sin = CGAL::approximate_sqrt(vec.squared_length()); } + criterion *= norm_sin; + } + if (is_boundary) { + if (criterion > boundary_subdivision_ratio) + if_subdivide = true; + } + else { + if (criterion > subdivision_ratio) + if_subdivide = true; + } } if (if_subdivide) { // subdivide at the most remote vertex From ebdfddbf5b6aff091c6a725b82d667205b2dfdf5 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Mon, 25 Sep 2023 16:30:47 +0200 Subject: [PATCH 0770/1398] add a link to TBB --- Mesh_3/examples/Mesh_3/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 0b59088e04a2..31ab08db7e8e 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -198,6 +198,7 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support) target mesh_3D_image mesh_3D_weighted_image + mesh_3D_weighted_image_with_detection_of_features mesh_3D_image_variable_size mesh_3D_image_with_custom_initialization mesh_3D_gray_image_with_custom_initialization From 0c090b80e2fab579cec0fc116edcd9797c3fc459 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 25 Sep 2023 17:13:56 +0200 Subject: [PATCH 0771/1398] Disabled tetrahedra clip plane when clipping box is active --- .../Polyhedron/Scene_triangulation_3_item.cpp | 100 +++++++++++++++++- .../Polyhedron/Scene_triangulation_3_item.h | 4 + 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp index 91e88fb6ae22..84f6daae4300 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp @@ -1,7 +1,9 @@ +#include "Scene.h" #include "config.h" #include "Scene_triangulation_3_item.h" #include "Scene_surface_mesh_item.h" #include "Scene_spheres_item.h" +#include "Plugins/PCA/Scene_edit_box_item.h" #include #include @@ -20,6 +22,7 @@ #include #include +#include #include #include #include @@ -179,7 +182,15 @@ public : QVector4D cp = cgal_plane_to_vector4d(plane); getEdgeContainer(0)->setPlane(cp); getEdgeContainer(0)->setColor(QColor(Qt::black)); - getEdgeContainer(0)->draw(viewer, true); + if (!cut_edges) { + bool clipping = getEdgeContainer(0)->getClipping(); + getEdgeContainer(0)->setClipping(false); + getEdgeContainer(0)->draw(viewer, true); + getEdgeContainer(0)->setClipping(clipping); + } + else { + getEdgeContainer(0)->draw(viewer, true); + } } @@ -278,6 +289,10 @@ public : m_alpha = a / 255.0f; redraw(); } + void setCutEdges(bool b) + { + cut_edges = b; + } private: //contains the data @@ -290,6 +305,8 @@ public : mutable bool is_fast; mutable QSlider* alphaSlider; mutable float m_alpha ; + + bool cut_edges; }; //end of class Scene_triangle_item @@ -436,6 +453,25 @@ struct Scene_triangulation_3_item_priv { Scene_spheres_item *spheres; std::vector tr_vertices; Scene_intersection_item *intersection; + void set_intersection_enabled(bool b) + { + if (intersection) + intersection->setVisible(b); + } + bool is_intersection_enabled() + { + if (intersection) + return intersection->visible(); + else + return false; + } + bool is_item_clip_box(int id) + { + if(dynamic_cast(CGAL::Three::Three::scene()->item(id))) + return true; + else + return false; + } bool spheres_are_shown; const Scene_item* data_item_; QPixmap histogram_; @@ -497,6 +533,7 @@ struct Scene_triangulation_3_item_priv { bool show_tetrahedra; bool is_aabb_tree_built; bool last_intersection; + bool cut_edges; void push_normal(std::vector& normals, const EPICK::Vector_3& n) const { @@ -550,6 +587,14 @@ void Scene_triangulation_3_item::common_constructor(bool display_elements) { v->installEventFilter(this); } + for(int i = 0, end = scene->numberOfEntries(); + i < end; ++i) + { + if (d->is_item_clip_box(i)) + d->set_intersection_enabled(false); + } + connect(static_cast(CGAL::Three::Three::scene()), SIGNAL(newItem(int)), this, SLOT(check_new_item(int))); + connect(static_cast(CGAL::Three::Three::scene()), SIGNAL(indexErased(Scene_interface::Item_id)), this, SLOT(check_deleted_item(Scene_interface::Item_id))); } Scene_triangulation_3_item::Scene_triangulation_3_item(bool display_elements) : Scene_group_item("unnamed") @@ -602,6 +647,20 @@ Scene_triangulation_3_item::data_item_destroyed() set_data_item(NULL); } +void +Scene_triangulation_3_item::check_new_item(int id) +{ + if (d->is_item_clip_box(id)) + d->set_intersection_enabled(false); +} + +void +Scene_triangulation_3_item::check_deleted_item(Scene_interface::Item_id id) +{ + if (d->is_item_clip_box(id)) + d->set_intersection_enabled(true); +} + const T3& Scene_triangulation_3_item::triangulation() const { return d->triangulation; @@ -913,6 +972,8 @@ Scene_triangulation_3_item_priv::compute_color_map(const QColor& c) Geom_traits::Plane_3 Scene_triangulation_3_item::plane(CGAL::qglviewer::Vec offset) const { + if (!d->is_intersection_enabled()) + return Geom_traits::Plane_3(1.0, 0.0, 0.0, std::numeric_limits::max()); const CGAL::qglviewer::Vec& pos = d->frame->position() - offset; const CGAL::qglviewer::Vec& n = d->frame->inverseTransformOf(CGAL::qglviewer::Vec(0.f, 0.f, 1.f)); @@ -1018,7 +1079,7 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con d->spheres->setPlane(this->plane()); } } - if(d->is_grid_shown) + if(d->is_grid_shown && d->is_intersection_enabled()) { getEdgeContainer(Grid_edges)->setColor(QColor(Qt::black)); @@ -1026,7 +1087,11 @@ void Scene_triangulation_3_item::draw(CGAL::Three::Viewer_interface* viewer) con for (int i = 0; i<16; i++) f_mat.data()[i] = static_cast(d->frame->matrix()[i]); getEdgeContainer(Grid_edges)->setFrameMatrix(f_mat); + // always draw plane (disable clipping) + bool clipping = getEdgeContainer(Grid_edges)->getClipping(); + getEdgeContainer(Grid_edges)->setClipping(false); getEdgeContainer(Grid_edges)->draw(viewer, true); + getEdgeContainer(Grid_edges)->setClipping(clipping); } } @@ -1056,14 +1121,18 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer computeElements(); initializeBuffers(viewer); } - if(renderingMode() == Wireframe && d->is_grid_shown) + if(renderingMode() == Wireframe && d->is_grid_shown && d->is_intersection_enabled()) { getEdgeContainer(Grid_edges)->setColor(QColor(Qt::black)); QMatrix4x4 f_mat; for (int i = 0; i<16; i++) f_mat.data()[i] = static_cast(d->frame->matrix()[i]); getEdgeContainer(Grid_edges)->setFrameMatrix(f_mat); + // always draw plane (disable clipping) + bool clipping = getEdgeContainer(Grid_edges)->getClipping(); + getEdgeContainer(Grid_edges)->setClipping(false); getEdgeContainer(Grid_edges)->draw(viewer, true); + getEdgeContainer(Grid_edges)->setClipping(clipping); } QVector4D cp = cgal_plane_to_vector4d(this->plane()); @@ -1079,7 +1148,15 @@ void Scene_triangulation_3_item::drawEdges(CGAL::Three::Viewer_interface* viewer getEdgeContainer(T3_edges)->setPlane(cp); getEdgeContainer(T3_edges)->setIsSurface(is_surface()); getEdgeContainer(T3_edges)->setColor(QColor(Qt::black)); - getEdgeContainer(T3_edges)->draw(viewer, true); + if (!d->cut_edges) { + bool clipping = getEdgeContainer(T3_edges)->getClipping(); + getEdgeContainer(T3_edges)->setClipping(false); + getEdgeContainer(T3_edges)->draw(viewer, true); + getEdgeContainer(T3_edges)->setClipping(clipping); + } + else { + getEdgeContainer(T3_edges)->draw(viewer, true); + } if(d->show_tetrahedra){ if(!d->frame->isManipulated()) @@ -1217,6 +1294,14 @@ QMenu* Scene_triangulation_3_item::contextMenu() this, SLOT(show_spheres(bool))); } + QAction* actionToggleCutEdges = + menu->addAction(tr("Cut &edges")); + actionToggleCutEdges->setCheckable(true); + actionToggleCutEdges->setChecked(true); + actionToggleCutEdges->setObjectName("actionToggleCutEdges"); + connect(actionToggleCutEdges, SIGNAL(toggled(bool)), + this, SLOT(set_cut_edge(bool))); + menu->setProperty(prop_name, true); } return menu; @@ -2081,5 +2166,12 @@ void Scene_triangulation_3_item::computeIntersection() } } +void Scene_triangulation_3_item::set_cut_edge(bool b) +{ + d->cut_edges = b; + d->intersection->setCutEdges(b); + Q_EMIT redraw(); +} + #include "Scene_triangulation_3_item.moc" diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h index 8cd2b81bd126..33a2cd8f124b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h @@ -121,6 +121,9 @@ using namespace CGAL::Three; void data_item_destroyed(); + void check_new_item(int id); + void check_deleted_item(Scene_interface::Item_id id); + void reset_spheres(); void reset_intersection_item(); @@ -128,6 +131,7 @@ using namespace CGAL::Three; void show_grid(bool b); void show_spheres(bool b); void computeIntersection(); + void set_cut_edge(bool b); virtual QPixmap graphicalToolTip() const Q_DECL_OVERRIDE; From aad5976559a333bbbf4b3ddd8476c0404c03e831 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 25 Sep 2023 16:20:25 +0100 Subject: [PATCH 0772/1398] Change default --- .../include/CGAL/Variational_shape_approximation.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 13e2e29944b8..ea3896cf1f60 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -799,7 +799,7 @@ class Variational_shape_approximation { * \cgalParamNBegin{boundary_subdivision_ratio} * \cgalParamDescription{the chord subdivision ratio threshold to the chord length or average edge length for boundary edges} * \cgalParamType{`geom_traits::FT`} - * \cgalParamDefault{`5.0`} + * \cgalParamDefault{`subdivision_ratio`} * \cgalParamNEnd * * \cgalParamNBegin{relative_to_chord} @@ -840,7 +840,7 @@ class Variational_shape_approximation { using parameters::choose_parameter; const FT subdivision_ratio = choose_parameter(get_parameter(np, internal_np::subdivision_ratio), FT(5.0)); - const FT boundary_subdivision_ratio = choose_parameter(get_parameter(np, internal_np::boundary_subdivision_ratio), FT(5.0)); + const FT boundary_subdivision_ratio = choose_parameter(get_parameter(np, internal_np::boundary_subdivision_ratio), subdivision_ratio); const bool relative_to_chord = choose_parameter(get_parameter(np, internal_np::relative_to_chord), false); const bool with_dihedral_angle = choose_parameter(get_parameter(np, internal_np::with_dihedral_angle), false); const bool optimize_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_anchor_location), true); @@ -1912,9 +1912,6 @@ class Variational_shape_approximation { Segment_3 seg(pt_begin, pt_end); chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { - //Vector_3 vec = vector_functor(pt_begin, m_vpoint_map[target(*citr, *m_ptm)]); - //vec = cross_product_functor(chord_vec, vec); - //const FT dist = CGAL::approximate_sqrt(vec.squared_length()); const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance(m_vpoint_map[target(*citr, *m_ptm)], seg)); if (dist > dist_max) { chord_max = citr; @@ -1926,7 +1923,7 @@ class Variational_shape_approximation { degenerate_chord = true; for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance( - pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); + pt_begin, m_vpoint_map[target(*citr, *m_ptm)])); if (dist > dist_max) { chord_max = citr; dist_max = dist; @@ -1949,7 +1946,7 @@ class Variational_shape_approximation { FT norm_sin(1.0); if (!CGAL::is_border(opposite(he_first, *m_ptm), *m_ptm)) { Vector_3 vec = cross_product_functor( - m_px_planes[px_left].normal, m_px_planes[px_right].normal); + m_px_planes[px_left].normal, m_px_planes[px_right].normal); norm_sin = CGAL::approximate_sqrt(vec.squared_length()); } criterion *= norm_sin; From dd36cae7ccd12996d2788f534fd77e2bcd1f57d8 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 25 Sep 2023 16:26:59 +0100 Subject: [PATCH 0773/1398] remove unused variable --- .../include/CGAL/Variational_shape_approximation.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index ea3896cf1f60..23cfab856f61 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -1910,7 +1910,6 @@ class Variational_shape_approximation { bool degenerate_chord = false; if (chord_len > FT(0.0)) { Segment_3 seg(pt_begin, pt_end); - chord_vec = scale_functor(chord_vec, FT(1.0) / chord_len); for (Boundary_chord_iterator citr = chord_begin; citr != chord_end; ++citr) { const FT dist = CGAL::approximate_sqrt(CGAL::squared_distance(m_vpoint_map[target(*citr, *m_ptm)], seg)); if (dist > dist_max) { From c5b2d4d00bfc1f11001f3a42aea122e4c3f02e45 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 10:12:22 +0200 Subject: [PATCH 0774/1398] Added reset button on clip box --- .../Plugins/PCA/Clipping_box_plugin.cpp | 6 +++ .../Plugins/PCA/Clipping_box_widget.ui | 37 +++++++++++++++++++ .../Plugins/PCA/Scene_edit_box_item.cpp | 21 +++++++++++ .../Plugins/PCA/Scene_edit_box_item.h | 1 + 4 files changed, 65 insertions(+) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp index 9753e4e2f11f..251c461dd13c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp @@ -135,6 +135,12 @@ void Clipping_box_plugin::clipbox() }); connect(dock_widget->tabWidget, &QTabWidget::currentChanged, this, &Clipping_box_plugin::tab_change); + connect(dock_widget->resetButton, &QPushButton::clicked, + this, [this]() + { + item->reset(); + do_clip(true); + }); item->setName("Clipping box"); item->setRenderingMode(FlatPlusEdges); diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_widget.ui b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_widget.ui index 7c79e1421246..e0a2709e2fa8 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_widget.ui +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_widget.ui @@ -65,6 +65,43 @@ + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reset + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index 6dea656ae705..cca910c37768 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -251,6 +251,22 @@ struct Scene_edit_box_item_priv{ double applyX(int id, double x, double dirx); double applyY(int id, double y, double diry); double applyZ(int id, double z, double dirz); + void reset_vertices() + { + Scene_item::Bbox bb = scene->bbox(); + float eps = 1.e-6; + pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps; + pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps; + pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps; + double x=(bb.xmin()+bb.xmax())/2; + double y=(bb.ymin()+bb.ymax())/2; + double z=(bb.zmin()+bb.zmax())/2; + center_ = CGAL::qglviewer::Vec(x,y,z); + relative_center_ = CGAL::qglviewer::Vec(0,0,0); + const CGAL::qglviewer::Vec offset = static_cast(CGAL::QGLViewer::QGLViewerPool().first())->offset(); + frame->setPosition(center_+offset); + item->invalidateOpenGLBuffers(); + } const Scene_interface* scene; Scene_edit_box_item* item; QPoint picked_pixel; @@ -1307,3 +1323,8 @@ void Scene_edit_box_item::connectNewViewer(QObject *o) return; viewer->setMouseTracking(true); } + +void Scene_edit_box_item::reset() +{ + d->reset_vertices(); +} diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h index 4b95cc4fe739..4d8988955655 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h @@ -59,6 +59,7 @@ public Q_SLOTS: void highlight(CGAL::Three::Viewer_interface* viewer); void clearHL(); void connectNewViewer(QObject* o); + void reset(); protected: friend struct Scene_edit_box_item_priv; Scene_edit_box_item_priv* d; From 384e7fad3865710adbc8af4ecc9910fab86d7799 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 10:16:17 +0200 Subject: [PATCH 0775/1398] Added epsilon on clipping + try fix test undefined reference to Scene_edit_box_item --- .../demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp | 9 +++++---- .../demo/Polyhedron/Scene_triangulation_3_item.cpp | 1 - Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index cca910c37768..91bcde149bab 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -99,9 +99,10 @@ struct Scene_edit_box_item_priv{ constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(.0,.0,.1)); frame->setConstraint(&constraint); //create the sphere model - pool[0] = bb.xmin(); pool[3] = bb.xmax(); - pool[1] = bb.ymin(); pool[4] = bb.ymax(); - pool[2] = bb.zmin(); pool[5] = bb.zmax(); + float eps = 1.e-3; + pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps; + pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps; + pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps; vertex_spheres.resize(0); normal_spheres.resize(0); @@ -254,7 +255,7 @@ struct Scene_edit_box_item_priv{ void reset_vertices() { Scene_item::Bbox bb = scene->bbox(); - float eps = 1.e-6; + float eps = 1.e-3; pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps; pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps; pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps; diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp index 84f6daae4300..7eee6f9c0941 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp @@ -3,7 +3,6 @@ #include "Scene_triangulation_3_item.h" #include "Scene_surface_mesh_item.h" #include "Scene_spheres_item.h" -#include "Plugins/PCA/Scene_edit_box_item.h" #include #include diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h index 33a2cd8f124b..89f0e38d3d9f 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h @@ -2,6 +2,7 @@ #define SCENE_TRIANGULATION_3_ITEM_H #include "Scene_triangulation_3_item_config.h" +#include "Plugins/PCA/Scene_edit_box_item.h" #include "T3_type.h" #include From aa125fe1db50094568a95beb2026f780660cb4bb Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 10:48:21 +0200 Subject: [PATCH 0776/1398] Quick fix : Made images draw surfaces even if they are inside --- Polyhedron/demo/Polyhedron/Scene_image_item.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp index bdcf80a5091c..3a2847dfba96 100644 --- a/Polyhedron/demo/Polyhedron/Scene_image_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_image_item.cpp @@ -114,15 +114,7 @@ is_vertex_active(std::size_t i, std::size_t j, std::size_t k) const Word_type v7 = image_data(i , j , k-dz_); Word_type v8 = image_data(i , j , k ); - // don't draw interior vertices - if ( v1 != 0 && v2 != 0 && v3 != 0 && v4 != 0 && - v5 != 0 && v6 != 0 && v7 != 0 && v8 != 0 ) - { - return false; - } - - return ( v1 != 0 || v2 != 0 || v3 != 0 || v4 != 0 || - v5 != 0 || v6 != 0 || v7 != 0 || v8 != 0 ); + return v1 != v2 || v1 != v3 || v1 != v4 || v1 != v5 || v1 != v6 || v1 != v7 || v1 != v8; } template const QColor& From c8545e8f0605a82574810009082c809211a033e2 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 12:14:52 +0200 Subject: [PATCH 0777/1398] Add link to scene_edit_box_item + small fix of triangulation_3 cut plane --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 2 +- Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp | 8 ++++---- Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index 325a670e8096..ecab2ece7fd0 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -236,7 +236,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) add_item(scene_c3t3_item Scene_c3t3_item.cpp) target_link_libraries( scene_c3t3_item PUBLIC scene_triangulation_3_item - scene_surface_mesh_item scene_polygon_soup_item + scene_surface_mesh_item scene_polygon_soup_item scene_edit_box_item scene_basic_objects ${TBB_LIBRARIES}) if(TARGET CGAL::TBB_support) diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp index 7eee6f9c0941..04d0d44c58e3 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.cpp @@ -3,6 +3,7 @@ #include "Scene_triangulation_3_item.h" #include "Scene_surface_mesh_item.h" #include "Scene_spheres_item.h" +#include "Plugins/PCA/Scene_edit_box_item.h" #include #include @@ -456,13 +457,11 @@ struct Scene_triangulation_3_item_priv { { if (intersection) intersection->setVisible(b); + cut_plane_enabled = b; } bool is_intersection_enabled() { - if (intersection) - return intersection->visible(); - else - return false; + return cut_plane_enabled; } bool is_item_clip_box(int id) { @@ -530,6 +529,7 @@ struct Scene_triangulation_3_item_priv { boost::dynamic_bitset<> visible_subdomain; std::bitset<24> bs[4] = {16777215, 16777215, 16777215, 16777215}; bool show_tetrahedra; + bool cut_plane_enabled; bool is_aabb_tree_built; bool last_intersection; bool cut_edges; diff --git a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h index 89f0e38d3d9f..33a2cd8f124b 100644 --- a/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_triangulation_3_item.h @@ -2,7 +2,6 @@ #define SCENE_TRIANGULATION_3_ITEM_H #include "Scene_triangulation_3_item_config.h" -#include "Plugins/PCA/Scene_edit_box_item.h" #include "T3_type.h" #include From 031594e0db5a22777728a103708455a28245360c Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 12:23:52 +0200 Subject: [PATCH 0778/1398] Replaced Q_FOREACH with c++11 for each --- .../demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp index 251c461dd13c..a2dd4f791397 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Clipping_box_plugin.cpp @@ -163,13 +163,13 @@ void Clipping_box_plugin::clip(bool b) clipping = b; if (b) { - Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) + for(CGAL::QGLViewer* v : CGAL::QGLViewer::QGLViewerPool()) { v->installEventFilter(this); } } else { - Q_FOREACH(CGAL::QGLViewer* v, CGAL::QGLViewer::QGLViewerPool()) + for(CGAL::QGLViewer* v : CGAL::QGLViewer::QGLViewerPool()) { v->removeEventFilter(this); } From 98ba8b68e3c1e4487a6ae0f6dd7d9ee7202e4cbd Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 12:38:34 +0200 Subject: [PATCH 0779/1398] Fix wrong linkage --- Polyhedron/demo/Polyhedron/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/CMakeLists.txt b/Polyhedron/demo/Polyhedron/CMakeLists.txt index ecab2ece7fd0..85c604688599 100644 --- a/Polyhedron/demo/Polyhedron/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/CMakeLists.txt @@ -231,12 +231,12 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND) endmacro(add_item) add_item(scene_triangulation_3_item Scene_triangulation_3_item.cpp) - target_link_libraries(scene_triangulation_3_item PUBLIC scene_basic_objects) + target_link_libraries(scene_triangulation_3_item PUBLIC scene_basic_objects scene_edit_box_item) add_item(scene_c3t3_item Scene_c3t3_item.cpp) target_link_libraries( scene_c3t3_item PUBLIC scene_triangulation_3_item - scene_surface_mesh_item scene_polygon_soup_item scene_edit_box_item + scene_surface_mesh_item scene_polygon_soup_item scene_basic_objects ${TBB_LIBRARIES}) if(TARGET CGAL::TBB_support) From 595897e7c74ccc757a0b4889972119d5d0e0330b Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 15:22:49 +0200 Subject: [PATCH 0780/1398] Factorized vtk image loading --- .../Plugins/Mesh_3/Io_image_plugin.cpp | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 32ec637c9210..8da04e3cc8e2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -54,6 +54,7 @@ #include #include +#include #include #include #include @@ -333,6 +334,8 @@ class Io_image_plugin : QString nameFilters() const override; bool canLoad(QFileInfo) const override; QList load(QFileInfo fileinfo, bool& ok, bool add_to_scene = true) override; + template + bool load_vtk_file(QFileInfo fileinfo, Image* image); bool canSave(const CGAL::Three::Scene_item*) override; bool save(QFileInfo fileinfo, QList& items ) override @@ -1123,6 +1126,25 @@ void convert(Image* image) image->image()->wordKind = WK_FLOAT; } + +template +bool +Io_image_plugin::load_vtk_file(QFileInfo fileinfo, Image* image) +{ +#ifdef CGAL_USE_VTK + vtkNew reader; + reader->SetFileName(fileinfo.filePath().toUtf8()); + reader->Update(); + auto vtk_image = reader->GetOutput(); + vtk_image->Print(std::cerr); + *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data + return true; +#else + return false; +#endif +} + + QList Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) { @@ -1130,20 +1152,15 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) QApplication::restoreOverrideCursor(); Image* image = new Image; + QString warningMessage; // read a vti file if(fileinfo.suffix() == "vti") { #ifdef CGAL_USE_VTK - vtkNew reader; - reader->SetFileName(fileinfo.filePath().toUtf8()); - reader->Update(); - auto vtk_image = reader->GetOutput(); - vtk_image->Print(std::cerr); - *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data + ok = load_vtk_file(fileinfo, image); #else - CGAL::Three::Three::warning("VTK is required to read VTI files"); - delete image; - return QList(); + ok = false; + warningMessage = "VTK is required to read VTI files"; #endif } @@ -1151,16 +1168,10 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) else if(fileinfo.suffix() == "nrrd") { #ifdef CGAL_USE_VTK - vtkNew reader; - reader->SetFileName(fileinfo.filePath().toUtf8()); - reader->Update(); - auto vtk_image = reader->GetOutput(); - vtk_image->Print(std::cerr); - *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data + ok = load_vtk_file(fileinfo, image); #else - CGAL::Three::Three::warning("VTK is required to read NRRD files"); - delete image; - return QList(); + ok = false; + warningMessage = "VTK is required to read NRRD files"; #endif } @@ -1170,16 +1181,10 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) && fileinfo.fileName().endsWith(QString(".nii.gz"), Qt::CaseInsensitive))) { #ifdef CGAL_USE_VTK - vtkNew reader; - reader->SetFileName(fileinfo.filePath().toUtf8()); - reader->Update(); - auto vtk_image = reader->GetOutput(); - vtk_image->Print(std::cerr); - *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data + ok = load_vtk_file(fileinfo, image); #else - CGAL::Three::Three::warning("VTK is required to read NIfTI files"); - delete image; - return QList(); + ok = false; + warningMessage = "VTK is required to read NifTI files"; #endif } @@ -1286,11 +1291,16 @@ Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) if(!success) { ok = false; - delete image; - return QList(); } } + if (!ok) { + if (warningMessage.length() > 0) + CGAL::Three::Three::warning(warningMessage); + delete image; + return QList(); + } + // Get display precision QDialog dialog; ui.setupUi(&dialog); From 7edb061915f9a222171ae51079af2465651bc4fa Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 15:44:30 +0200 Subject: [PATCH 0781/1398] Added dual contouring plugin from isosurfacing_3 package --- .../Plugins/Isosurfacing_3/CMakeLists.txt | 6 + .../Isosurfacing_3/Isosurface_3_plugin.cpp | 369 ++++++++++++++++++ 2 files changed, 375 insertions(+) create mode 100644 Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/CMakeLists.txt create mode 100644 Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/Isosurface_3_plugin.cpp diff --git a/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/CMakeLists.txt new file mode 100644 index 000000000000..8707fb421bde --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/CMakeLists.txt @@ -0,0 +1,6 @@ +include(polyhedron_demo_macros) + +polyhedron_demo_plugin(isosurface_3_plugin Isosurface_3_plugin KEYWORDS + Isosurface_3) +target_link_libraries( + isosurface_3_plugin PUBLIC scene_polygon_soup_item scene_image_item ) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/Isosurface_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/Isosurface_3_plugin.cpp new file mode 100644 index 000000000000..4b25ab97f9a6 --- /dev/null +++ b/Polyhedron/demo/Polyhedron/Plugins/Isosurfacing_3/Isosurface_3_plugin.cpp @@ -0,0 +1,369 @@ +#include +#include +#include +#include +#include "Scene_polygon_soup_item.h" +#include "Scene_image_item.h" +#include "SMesh_type.h" +#include "Image_type.h" + +#include +#include +#include + +using namespace CGAL::Three; +class Polyhedron_demo_isosurface_3_plugin : + public QObject, + public Polyhedron_demo_plugin_interface +{ + Q_OBJECT + Q_INTERFACES(CGAL::Three::Polyhedron_demo_plugin_interface) + Q_PLUGIN_METADATA(IID "com.geometryfactory.PolyhedronDemo.PluginInterface/1.0") +public: + void init(QMainWindow*mw, + Scene_interface* scene_interface, + Messages_interface*) + { + scene = scene_interface; + this->mw = mw; + QAction *actionDualLabel = new QAction("Dual contour label image", mw); + actionDualLabel->setProperty("subMenuName","Isosurface"); + connect(actionDualLabel, SIGNAL(triggered()), this, SLOT(on_actionDualLabel_triggered())); + _actions << actionDualLabel; + } + + QList actions()const {return _actions;} + + bool applicable(QAction*) const { + return + qobject_cast(scene->item(scene->mainSelectionIndex())); + } + +public Q_SLOTS: + void on_actionDualLabel_triggered(); +private: + QList _actions; + Scene_interface* scene; + QMainWindow* mw; +}; // end Polyhedron_demo_convex_hull_plugin + +class Polyhedron_demo_isosurface_3_plugin_helper { + typedef float Word_type; + typedef std::size_t vertex_descriptor; + typedef std::pair surface_descriptor; + + struct Mesh_quad { + typedef vertex_descriptor* iterator; + typedef const vertex_descriptor* const_iterator; + + vertex_descriptor t[4]; + surface_descriptor surface; + + Mesh_quad() {} + + Mesh_quad(const Mesh_quad & other) { + t[0] = other.t[0]; + t[1] = other.t[1]; + t[2] = other.t[2]; + t[3] = other.t[3]; + surface = other.surface; + } + + Mesh_quad(vertex_descriptor v0, vertex_descriptor v1, vertex_descriptor v2, vertex_descriptor v3, Word_type val1, Word_type val2) { + if (val1 < val2) { + t[0] = v3; + t[1] = v2; + t[2] = v1; + t[3] = v0; + surface = std::make_pair(val1, val2); + } + else { + t[0] = v0; + t[1] = v1; + t[2] = v2; + t[3] = v3; + surface = std::make_pair(val2, val1); + } + } + + std::size_t size() const { + return 4; + } + + vertex_descriptor operator[](int i) const { return t[i]; } + + iterator begin() { return &t[0]; } + const_iterator begin() const { return &t[0]; } + iterator end() { return &t[4]; } + const_iterator end() const { return &t[4]; } + }; + + struct Mesh + { + using Polygon = Mesh_quad; + + std::vector vertices; + std::vector polygons; + + vertex_descriptor add_vertex(EPICK::Point_3 p) { + vertices.push_back(p); + return vertices.size()-1; + } + + void add_face(const Polygon & poly) { + polygons.push_back(Polygon(poly)); + } + + void add_face(vertex_descriptor v0, vertex_descriptor v1, vertex_descriptor v2, vertex_descriptor v3, Word_type val1, Word_type val2) + { + polygons.push_back(Polygon(v0, v1, v2, v3, val1, val2)); + } + }; + +public: + Polyhedron_demo_isosurface_3_plugin_helper(const Image* image) + { + image_ = image; + } + + void dual_contouring_label_image() + { + int i,j,k; + + float dx_ = 1.0; + float dy_ = 1.0; + float dz_ = 1.0; + double vx_ = image_->vx(); + double vy_ = image_->vy(); + double vz_ = image_->vz(); + double tx_ = image_->tx(); + double ty_ = image_->ty(); + double tz_ = image_->tz(); + + int xdim_ = image_->xdim(); + int ydim_ = image_->ydim(); + int zdim_ = image_->zdim(); + int xdim_p = xdim_+dx_; + int ydim_p = ydim_+dy_; + int zdim_p = zdim_+dz_; + + std::map vertices; + + for ( k = -dz_ ; k < zdim_ ; k+=dz_ ) + { + for ( j = -dy_ ; j < ydim_ ; j+=dy_ ) + { + for ( i = -dx_ ; i < xdim_ ; i+=dx_ ) + { + const Word_type & v0 = image_data(i, j, k); + + const Word_type & v1 = image_data(i+dx_, j, k); + const Word_type & v2 = image_data(i, j+dy_, k); + const Word_type & v3 = image_data(i, j, k+dz_); + + const Word_type & v4 = image_data(i+dx_, j+dy_, k); + const Word_type & v5 = image_data(i, j+dy_, k+dz_); + const Word_type & v6 = image_data(i+dx_, j, k+dz_); + + const Word_type & v7 = image_data(i+dx_, j+dy_, k+dz_); + + // if one is different + if (v0 != v1 || v0 != v2 || v0 != v3 || v0 != v4 || v0 != v5 || v0 != v6 || v0 != v7) { + int ip = i+dx_; + int jp = j+dy_; + int kp = k+dz_; + int index = kp*ydim_p*xdim_p + jp*xdim_p + ip; + double di = i+0.5*dx_; + double dj = j+0.5*dy_; + double dk = k+0.5*dz_; + if (di < 0) + di = 0.0; + if (dj < 0) + dj = 0.0; + if (dk < 0) + dk = 0.0; + if (di > xdim_-dx_) + di = xdim_-1; + if (dj > ydim_-dy_) + dj = ydim_-1; + if (dk > zdim_-dz_) + dk = zdim_-1; + di = di * vx_ + tx_; + dj = dj * vy_ + ty_; + dk = dk * vz_ + tz_; + + vertex_descriptor vertex_0 = mesh_.add_vertex(Point_3(di, dj, dk)); + vertices.insert(std::make_pair(index, vertex_0)); + + // check x direction + if (v0 != v1) + { + vertex_descriptor vertex_1 = vertices.find(kp*ydim_p*xdim_p + j *xdim_p + ip)->second; + vertex_descriptor vertex_2 = vertices.find(k *ydim_p*xdim_p + j *xdim_p + ip)->second; + vertex_descriptor vertex_3 = vertices.find(k *ydim_p*xdim_p + jp*xdim_p + ip)->second; + mesh_.add_face(vertex_0, vertex_1, vertex_2, vertex_3, v0, v1); + } + // check y direction + if (v0 != v2) + { + vertex_descriptor vertex_1 = vertices.find(k *ydim_p*xdim_p + jp*xdim_p + ip)->second; + vertex_descriptor vertex_2 = vertices.find(k *ydim_p*xdim_p + jp*xdim_p + i )->second; + vertex_descriptor vertex_3 = vertices.find(kp*ydim_p*xdim_p + jp*xdim_p + i )->second; + mesh_.add_face(vertex_0, vertex_1, vertex_2, vertex_3, v0, v2); + } + // check z direction + if (v0 != v3) + { + vertex_descriptor vertex_1 = vertices.find(kp*ydim_p*xdim_p + jp*xdim_p + i )->second; + vertex_descriptor vertex_2 = vertices.find(kp*ydim_p*xdim_p + j *xdim_p + i )->second; + vertex_descriptor vertex_3 = vertices.find(kp*ydim_p*xdim_p + j *xdim_p + ip)->second; + mesh_.add_face(vertex_0, vertex_1, vertex_2, vertex_3, v0, v3); + } + } + } + } + } + } + + void generate_polygon_soup(std::vector & vertices, + std::vector> & polygons, + std::vector & fcolors, + std::vector & vcolors, + const QColor & c) + { + vertices.clear(); + polygons.clear(); + fcolors.clear(); + vcolors.clear(); + + const std::vector & m_vertices = mesh_.vertices; + const std::vector & m_polygons = mesh_.polygons; + std::size_t polygon_size = m_polygons.size(); + + vertices.insert(vertices.begin(), m_vertices.begin(), m_vertices.end()); + + std::map surface_color_map; + compute_color_map(surface_color_map, c); + + fcolors.resize(polygon_size); + polygons.resize(polygon_size); + for (std::size_t i = 0; i < polygon_size; i++) + { + const Mesh_quad & quad = m_polygons[i]; + + std::vector polygon; + polygon.resize(4); + polygon[0] = quad.t[0]; + polygon[1] = quad.t[1]; + polygon[2] = quad.t[2]; + polygon[3] = quad.t[3]; + polygons[i] = polygon; + + const QColor & color = surface_color_map[quad.surface]; + fcolors[i] = CGAL::IO::Color(color.red(), color.green(), color.blue()); + } + } + +private: + Mesh mesh_; + const Image* image_; + int nb_surfaces; + + Word_type image_data(std::size_t i, std::size_t j, std::size_t k) + { + if ( i>=0 && ixdim() && j>=0 && jydim() && k>=0 && kzdim() ) + return image_->value(i, j, k); + else + return 0; + } + + void compute_color_map(std::map & surface_color_map, const QColor & c) + { + // obtain and order all subdomains and surfaces + std::map subdomain_color_map; + for (const Mesh_quad& quad : mesh_.polygons) { + const surface_descriptor & surface = quad.surface; + subdomain_color_map[surface.first] = QColor(); + subdomain_color_map[surface.second] = QColor(); + surface_color_map[surface] = QColor(); + } + + // assign default color to each subdomains (same colors as images) + double nb_domains = subdomain_color_map.size(); + double i = 0; + for (std::map::iterator it = subdomain_color_map.begin(), + end = subdomain_color_map.end(); it != end; ++it, i += 1.) + { + double hue = c.hueF() + 1. / nb_domains * i; + if (hue > 1) { hue -= 1.; } + it->second = QColor::fromHsvF(hue, c.saturationF(), c.valueF()); + } + + // assign color for each surfaces (use subdomain color if the surface is in contact with background) + nb_domains = surface_color_map.size(); + i = 0; + double patch_hsv_value = fmod(c.valueF() + .5, 1.); + for (std::map::iterator it = surface_color_map.begin(), + end = surface_color_map.end(); it != end; ++it, i += 1.) + { + QColor surface_color; + if (it->first.first == 0) { + surface_color = subdomain_color_map[it->first.second]; + } + else { + double hue = c.hueF() + 1. / nb_domains * i; + if (hue > 1) { hue -= 1.; } + surface_color = QColor::fromHsvF(hue, c.saturationF(), patch_hsv_value); + } + + it->second = surface_color; + } + } +}; + +void Polyhedron_demo_isosurface_3_plugin::on_actionDualLabel_triggered() +{ + const CGAL::Three::Scene_interface::Item_id index = scene->mainSelectionIndex(); + + Scene_image_item* img_item = + qobject_cast(scene->item(index)); + + if( img_item ) + { + // wait cursor + QApplication::setOverrideCursor(Qt::WaitCursor); + + QElapsedTimer time; + time.start(); + QElapsedTimer time_per_op; + time_per_op.start(); + std::cout << "Dual contour label image..."; + + Polyhedron_demo_isosurface_3_plugin_helper helper(img_item->image()); + helper.dual_contouring_label_image(); + + std::vector vertices; + std::vector> polygons; + std::vector fcolors; + std::vector vcolors; + + helper.generate_polygon_soup(vertices, polygons, fcolors, vcolors, img_item->color()); + + std::cout << "ok (" << time.elapsed() << " ms)" << std::endl; + + Scene_polygon_soup_item* new_item = new Scene_polygon_soup_item(); + new_item->load(vertices, polygons, fcolors, vcolors); + new_item->setName(tr("%1 (surface)").arg(scene->item(index)->name())); + new_item->setColor(img_item->color()); + new_item->setRenderingMode(FlatPlusEdges); + scene->addItem(new_item); + + + img_item->setVisible(false); + + // default cursor + QApplication::restoreOverrideCursor(); + } +} + +#include "Isosurface_3_plugin.moc" From a3ab2aa68eaf164f31f909af355a07f7585a6779 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Tue, 26 Sep 2023 15:57:05 +0200 Subject: [PATCH 0782/1398] Mooved templeted function load_vtk_file out of Io_image_plugin class --- .../Plugins/Mesh_3/Io_image_plugin.cpp | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp index 8da04e3cc8e2..d1e98bfdf49c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Io_image_plugin.cpp @@ -79,6 +79,23 @@ #include #include +template +bool +load_vtk_file(QFileInfo fileinfo, Image* image) +{ +#ifdef CGAL_USE_VTK + vtkNew reader; + reader->SetFileName(fileinfo.filePath().toUtf8()); + reader->Update(); + auto vtk_image = reader->GetOutput(); + vtk_image->Print(std::cerr); + *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data + return true; +#else + return false; +#endif +} + // Covariant return types don't work for scalar types and we cannot // have templates here, hence this unfortunate hack. @@ -334,8 +351,6 @@ class Io_image_plugin : QString nameFilters() const override; bool canLoad(QFileInfo) const override; QList load(QFileInfo fileinfo, bool& ok, bool add_to_scene = true) override; - template - bool load_vtk_file(QFileInfo fileinfo, Image* image); bool canSave(const CGAL::Three::Scene_item*) override; bool save(QFileInfo fileinfo, QList& items ) override @@ -1127,24 +1142,6 @@ void convert(Image* image) } -template -bool -Io_image_plugin::load_vtk_file(QFileInfo fileinfo, Image* image) -{ -#ifdef CGAL_USE_VTK - vtkNew reader; - reader->SetFileName(fileinfo.filePath().toUtf8()); - reader->Update(); - auto vtk_image = reader->GetOutput(); - vtk_image->Print(std::cerr); - *image = CGAL::IO::read_vtk_image_data(vtk_image); // copy the image data - return true; -#else - return false; -#endif -} - - QList Io_image_plugin::load(QFileInfo fileinfo, bool& ok, bool add_to_scene) { From c82f2a9d9c2c082f477b7d5e2af7f57e319e3acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 27 Sep 2023 10:11:31 +0200 Subject: [PATCH 0783/1398] Update some variable names to reflect the genericity of the triangulation --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 9 +-- .../internal/gate_priority_queue.h | 16 ++--- .../Alpha_wrap_3/internal/geometry_utils.h | 62 +++++++++---------- 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index f2ad170c95e7..8f7b1f5efc9c 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -290,7 +290,7 @@ class Alpha_wrap_3 extract_surface(output_mesh, ovpm, true /*tolerate non manifoldness*/); #ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP - dump_triangulation_faces("intermediate_dt3.off", false /*only_boundary_faces*/); + dump_triangulation_faces("intermediate_tr.off", false /*only_boundary_faces*/); IO::write_polygon_mesh("intermediate.off", output_mesh, CGAL::parameters::vertex_point_map(ovpm).stream_precision(17)); #endif @@ -350,7 +350,7 @@ class Alpha_wrap_3 #ifdef CGAL_AW3_DEBUG_DUMP_EVERY_STEP IO::write_polygon_mesh("final.off", output_mesh, CGAL::parameters::stream_precision(17)); - dump_triangulation_faces("final_dt3.off", false /*only_boundary_faces*/); + dump_triangulation_faces("final_tr.off", false /*only_boundary_faces*/); #endif #endif @@ -643,7 +643,9 @@ class Alpha_wrap_3 // and we fill the queue with the new parameters. bool initialize_from_existing_triangulation() { - std::cout << "restart from a DT of " << m_tr.number_of_cells() << " cells" << std::endl; +#ifdef CGAL_AW3_DEBUG_INITIALIZATION + std::cout << "Restart from a DT of " << m_tr.number_of_cells() << " cells" << std::endl; +#endif Real_timer t; t.start(); @@ -1050,7 +1052,6 @@ class Alpha_wrap_3 public: // @speed some decent time may be spent constructing Facet (pairs) for no reason as it's always // just to grab the .first and .second as soon as it's constructed, and not due to API requirements - // e.g. from DT3 Facet_queue_status facet_status(const Facet& f) const { CGAL_precondition(!m_tr.is_infinite(f)); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h index 824d27bc2c10..5e14a4d08ea1 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h @@ -28,11 +28,11 @@ namespace Alpha_wraps_3 { namespace internal { // Represents an alpha-traversable facet in the mutable priority queue -template +template class Gate { - using Facet = typename DT3::Facet; - using FT = typename DT3::Geom_traits::FT; + using Facet = typename Tr::Facet; + using FT = typename Tr::Geom_traits::FT; private: Facet m_facet; @@ -65,24 +65,24 @@ class Gate struct Less_gate { - template - bool operator()(const Gate& a, const Gate& b) const + template + bool operator()(const Gate& a, const Gate& b) const { return a.priority() > b.priority(); } }; -template +template struct Gate_ID_PM { - using key_type = Gate; + using key_type = Gate; using value_type = std::size_t; using reference = std::size_t; using category = boost::readable_property_map_tag; inline friend value_type get(Gate_ID_PM, const key_type& k) { - using Facet = typename DT3::Facet; + using Facet = typename Tr::Facet; const Facet& f = k.facet(); return (4 * f.first->time_stamp() + f.second); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h index d3814d0f3b25..7d66cfd19f41 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h @@ -40,16 +40,16 @@ struct Orientation_of_circumcenter } }; -template +template bool -less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha, - const typename Dt::Facet& fh, - const Dt& dt) +less_squared_radius_of_min_empty_sphere(typename Tr::Geom_traits::FT sq_alpha, + const typename Tr::Facet& fh, + const Tr& tr) { - using Cell_handle = typename Dt::Cell_handle; - using Point = typename Dt::Point; + using Cell_handle = typename Tr::Cell_handle; + using Point = typename Tr::Point; - using CK = typename Dt::Geom_traits; + using CK = typename Tr::Geom_traits; using Exact_kernel = typename Exact_kernel_selector::Exact_kernel; using Approximate_kernel = Simple_cartesian; using C2A = Cartesian_converter; @@ -65,17 +65,17 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha, const int ic = fh.second; const Cell_handle n = c->neighbor(ic); - const Point& p1 = dt.point(c, Dt::vertex_triple_index(ic,0)); - const Point& p2 = dt.point(c, Dt::vertex_triple_index(ic,1)); - const Point& p3 = dt.point(c, Dt::vertex_triple_index(ic,2)); + const Point& p1 = tr.point(c, Tr::vertex_triple_index(ic,0)); + const Point& p2 = tr.point(c, Tr::vertex_triple_index(ic,1)); + const Point& p3 = tr.point(c, Tr::vertex_triple_index(ic,2)); // This is not actually possible in the context of alpha wrapping, but keeping it for genericity // and because it does not cost anything. - if(dt.is_infinite(n)) + if(tr.is_infinite(n)) { Orientation ori = orientation_of_circumcenter(p1, p2, p3, - dt.point(c, 0), dt.point(c, 1), - dt.point(c, 2), dt.point(c, 3)); + tr.point(c, 0), tr.point(c, 1), + tr.point(c, 2), tr.point(c, 3)); if(ori == POSITIVE) { @@ -84,18 +84,18 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha, } else { - Comparison_result cr = compare_squared_radius(dt.point(c, 0), dt.point(c, 1), - dt.point(c, 2), dt.point(c, 3), + Comparison_result cr = compare_squared_radius(tr.point(c, 0), tr.point(c, 1), + tr.point(c, 2), tr.point(c, 3), sq_alpha); return cr == LARGER; } } - if(dt.is_infinite(c)) + if(tr.is_infinite(c)) { Orientation ori = orientation_of_circumcenter(p1, p2, p3, - dt.point(n, 0), dt.point(n, 1), - dt.point(n, 2), dt.point(n, 3)); + tr.point(n, 0), tr.point(n, 1), + tr.point(n, 2), tr.point(n, 3)); if(ori == NEGATIVE) { @@ -104,8 +104,8 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha, } else { - Comparison_result cr = compare_squared_radius(dt.point(n, 0), dt.point(n, 1), - dt.point(n, 2), dt.point(n, 3), + Comparison_result cr = compare_squared_radius(tr.point(n, 0), tr.point(n, 1), + tr.point(n, 2), tr.point(n, 3), sq_alpha); return cr == LARGER; } @@ -113,40 +113,40 @@ less_squared_radius_of_min_empty_sphere(typename Dt::Geom_traits::FT sq_alpha, // both c and n are finite if(orientation_of_circumcenter(p1, p2, p3, - dt.point(c, 0), dt.point(c, 1), dt.point(c, 2), dt.point(c, 3)) != + tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)) != orientation_of_circumcenter(p1, p2, p3, - dt.point(n, 0), dt.point(n, 1), dt.point(n, 2), dt.point(n, 3))) + tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3))) { Comparison_result cr = compare_squared_radius(p1, p2, p3, sq_alpha); #ifdef CGAL_AW3_DEBUG_TRAVERSABILITY std::cout << "dual crosses the face; CR: " - << typename Dt::Geom_traits().compute_squared_radius_3_object()(p1, p2, p3) + << typename Tr::Geom_traits().compute_squared_radius_3_object()(p1, p2, p3) << " sq alpha " << sq_alpha << std::endl; #endif return cr == LARGER; } else { - Comparison_result cr = compare_squared_radius(dt.point(c, 0), dt.point(c, 1), - dt.point(c, 2), dt.point(c, 3), + Comparison_result cr = compare_squared_radius(tr.point(c, 0), tr.point(c, 1), + tr.point(c, 2), tr.point(c, 3), sq_alpha); #ifdef CGAL_AW3_DEBUG_TRAVERSABILITY std::cout << "dual does not cross the face; CR(c): " - << typename Dt::Geom_traits().compute_squared_radius_3_object()(dt.point(c, 0), dt.point(c, 1), - dt.point(c, 2), dt.point(c, 3)) + << typename Tr::Geom_traits().compute_squared_radius_3_object()(tr.point(c, 0), tr.point(c, 1), + tr.point(c, 2), tr.point(c, 3)) << " sq alpha " << sq_alpha << std::endl; #endif if(cr != LARGER) return false; - cr = compare_squared_radius(dt.point(n, 0), dt.point(n, 1), - dt.point(n, 2), dt.point(n, 3), + cr = compare_squared_radius(tr.point(n, 0), tr.point(n, 1), + tr.point(n, 2), tr.point(n, 3), sq_alpha); #ifdef CGAL_AW3_DEBUG_TRAVERSABILITY std::cout << "dual does not cross the face; CR(n): " - << typename Dt::Geom_traits().compute_squared_radius_3_object()(dt.point(n, 0), dt.point(n, 1), - dt.point(n, 2), dt.point(n, 3)) + << typename Tr::Geom_traits().compute_squared_radius_3_object()(tr.point(n, 0), tr.point(n, 1), + tr.point(n, 2), tr.point(n, 3)) << " sq alpha " << sq_alpha << std::endl; #endif From 62bb2a58d098dc08076f2165d104670dfa65388a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 27 Sep 2023 10:13:39 +0200 Subject: [PATCH 0784/1398] Put the warnings outside of verbosity macros (too important) --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 8f7b1f5efc9c..3ee6061d0d89 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1173,15 +1173,11 @@ class Alpha_wrap_3 return false; } - if(resuming) - { - if(offset != m_offset) - { -#ifdef CGAL_AW3_DEBUG - std::cerr << "Warning: resuming with a different offset!" << std::endl; -#endif - } - } + if(resuming && alpha > m_alpha) + std::cerr << "Warning: resuming with an alpha greater than last iteration!" << std::endl; + + if(resuming && offset != m_offset) + std::cerr << "Warning: resuming with a different offset!" << std::endl; m_alpha = FT(alpha); m_sq_alpha = square(m_alpha); From bc8351f15678b90955a9d5c2a5cc4b0389b49642 Mon Sep 17 00:00:00 2001 From: Mael Date: Wed, 27 Sep 2023 11:06:49 +0200 Subject: [PATCH 0785/1398] Fix typo --- Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 6d544be058d6..639c9a3f4685 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1418,7 +1418,7 @@ class Alpha_wrap_3 squared_distance(m_dt.point(c, 0), m_dt.point(c, 2)), squared_distance(m_dt.point(c, 0), m_dt.point(c, 3)), squared_distance(m_dt.point(c, 1), m_dt.point(c, 2)), - squared_distance(m_dt.point(c, 3), m_dt.point(c, 3)), + squared_distance(m_dt.point(c, 1), m_dt.point(c, 3)), squared_distance(m_dt.point(c, 2), m_dt.point(c, 3)) }); }; From 92232c9295ed2f246ff3f20221f231021c3d4aa7 Mon Sep 17 00:00:00 2001 From: CCXXXI Date: Thu, 28 Sep 2023 12:53:05 +0800 Subject: [PATCH 0786/1398] fix a typo in Tutorial_hello_world.txt --- .../doc/Documentation/Tutorials/Tutorial_hello_world.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/Documentation/Tutorials/Tutorial_hello_world.txt b/Documentation/doc/Documentation/Tutorials/Tutorial_hello_world.txt index da30ca174ccf..a006447c79af 100644 --- a/Documentation/doc/Documentation/Tutorials/Tutorial_hello_world.txt +++ b/Documentation/doc/Documentation/Tutorials/Tutorial_hello_world.txt @@ -73,7 +73,7 @@ seems that the points are collinear, or perform a right turn. If you must ensure that your numbers get interpreted at their full precision you can use a \cgal kernel that performs exact predicates and -extract constructions. +exact constructions. \cgalExample{Kernel_23/exact.cpp} From a72ccf2089be07f42913514d6267c5f32f413d0b Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Thu, 28 Sep 2023 15:04:35 +0200 Subject: [PATCH 0787/1398] Fix CMake error on Windows https://cgal.geometryfactory.com/CGAL/testsuite/CGAL-6.0-Ic-73/Installation/TestReport_Christo_MSVC-2022-Preview-Release.gz ``` CMake Error at cmake/modules/CGAL_SetupGMP.cmake:73 (target_link_libraries): The plain signature for target_link_libraries has already been used with the target "test_gmp_mpfr_dll". All uses of target_link_libraries with a target must be either all-keyword or all-plain. The uses of the plain signature are here: * test/Installation/CMakeLists.txt:54 (target_link_libraries) Call Stack (most recent call first): test/Installation/CMakeLists.txt:55 (use_CGAL_GMP_support) ``` --- Installation/test/Installation/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Installation/test/Installation/CMakeLists.txt b/Installation/test/Installation/CMakeLists.txt index db725c17645f..cf090c2d39ad 100644 --- a/Installation/test/Installation/CMakeLists.txt +++ b/Installation/test/Installation/CMakeLists.txt @@ -49,9 +49,9 @@ endif() if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Windows) add_executable(display_dll_version_info display_dll_version_info.cpp) - target_link_libraries(display_dll_version_info version) + target_link_libraries(display_dll_version_info PRIVATE version) add_executable(test_gmp_mpfr_dll test_gmp_mpfr_dll.cpp) - target_link_libraries(test_gmp_mpfr_dll version) + target_link_libraries(test_gmp_mpfr_dll PRIVATE version) use_CGAL_GMP_support(test_gmp_mpfr_dll) CGAL_add_test(test_gmp_mpfr_dll) add_to_cached_list( CGAL_EXECUTABLE_TARGETS test_gmp_mpfr_dll ) From f324943fba613e48477f4fbc84afe07ec5e1f8f2 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Thu, 28 Sep 2023 17:16:03 +0200 Subject: [PATCH 0788/1398] Added item in dropdown for selected edges + Fixed logic tautology when selecting edges before mesh --- .../demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 c17f4879f1dc..7c5d37c8f9ff 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -368,9 +368,9 @@ std::optional Mesh_3_plugin::get_items_or_return_error_string() const { auto poly_items_ptr = std::get_if(&items.value()); auto image_items_ptr = std::get_if(&items.value()); - if(poly_items_ptr && poly_items_ptr == nullptr) + if(poly_items_ptr != nullptr) poly_items_ptr->polylines_item = polylines_item; - else if(image_items_ptr && image_items_ptr == nullptr) + else if(image_items_ptr != nullptr ) image_items_ptr->polylines_item = polylines_item; } @@ -663,6 +663,8 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, ui.protectEdges->addItem(boundary_only.first, v(boundary_only.second)); } else ui.protectEdges->addItem(sharp_edges.first, v(sharp_edges.second)); + if (polylines_item != nullptr) + ui.protectEdges->addItem(input_polylines.first, v(input_polylines.second)); } else if (items->index() == IMAGE_MESH_ITEMS) { if (polylines_item != nullptr) { ui.protectEdges->addItem(input_polylines.first, QVariant::fromValue(input_polylines.second)); @@ -729,6 +731,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, const auto pe_flags = ui.protectEdges->currentData().value(); protect_borders = ui.protect->isChecked() && pe_flags.testFlag(BORDERS); protect_features = ui.protect->isChecked() && pe_flags.testFlag(FEATURES); + const bool protect_polylines = ui.protect->isChecked() && polylines_item != nullptr; const bool detect_connected_components = ui.detectComponents->isChecked(); const int manifold = (ui.manifoldCheckBox->isChecked() ? 1 : 0) + @@ -811,7 +814,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, { thread = cgal_code_mesh_3( polyhedrons, - (polylines_item == nullptr) ? plc : polylines_item->polylines, + protect_polylines ? polylines_item->polylines : plc, bounding_polyhedron, item_name, angle, From 28915280733428e573e1eb4b7c9a818318c81784 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 28 Sep 2023 19:21:49 +0200 Subject: [PATCH 0789/1398] Bug fix in drawing of interior faces when the outer boundary is pinched --- GraphicsView/include/CGAL/Buffer_for_vao.h | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index fddd4a663ffb..8fda19879933 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -746,17 +746,24 @@ class Buffer_for_vao fit->info().is_process = false; } // (2.2) We check if the facet is external or internal - std::queue face_queue; + std::queue face_queue, faces_internal; typename CDT::Face_handle face_internal = nullptr; if (cdt.infinite_vertex()->face()!=nullptr) - { face_queue.push(cdt.infinite_vertex()->face()); } + { + typename CDT::Face_circulator + incident_faces(cdt.infinite_vertex()), end_incident_faces(incident_faces); + do + { face_queue.push(incident_faces); } + while(++incident_faces!=end_incident_faces); + } + // std::cout<<"# faces PUSHED "<info().is_process) { - fh->info().is_process = true; + fh->info().is_process=true; for(int i=0; i<3; ++i) { if(!cdt.is_constrained(std::make_pair(fh, i))) @@ -764,21 +771,16 @@ class Buffer_for_vao if (fh->neighbor(i)!=nullptr) { face_queue.push(fh->neighbor(i)); } } - else if (face_internal==nullptr) - { - face_internal = fh->neighbor(i); - } + else + { faces_internal.push(fh->neighbor(i)); } } } } - if ( face_internal!=nullptr ) - { face_queue.push(face_internal); } - - while(!face_queue.empty()) + while(!faces_internal.empty()) { - typename CDT::Face_handle fh = face_queue.front(); - face_queue.pop(); + typename CDT::Face_handle fh=faces_internal.front(); + faces_internal.pop(); if(!fh->info().is_process) { fh->info().is_process = true; @@ -788,7 +790,7 @@ class Buffer_for_vao if(!cdt.is_constrained(std::make_pair(fh, i))) { if (fh->neighbor(i)!=nullptr) - { face_queue.push(fh->neighbor(i)); } + { faces_internal.push(fh->neighbor(i)); } } } } From 685caf955d43580cdaba25fd1c35ca455f1d5626 Mon Sep 17 00:00:00 2001 From: ange-clement Date: Fri, 29 Sep 2023 10:54:53 +0200 Subject: [PATCH 0790/1398] Renamed variable for clarity --- .../demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 7c5d37c8f9ff..a146afb007a0 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Mesh_3/Mesh_3_plugin.cpp @@ -778,7 +778,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, sm_items.removeAll(make_not_null(bounding_sm_item)); } - Scene_polylines_item::Polylines_container plc; + Scene_polylines_item::Polylines_container polylines_empty_container; SMesh* bounding_polyhedron = (bounding_sm_item == nullptr) ? nullptr : bounding_sm_item->polyhedron(); @@ -814,7 +814,7 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, { thread = cgal_code_mesh_3( polyhedrons, - protect_polylines ? polylines_item->polylines : plc, + protect_polylines ? polylines_item->polylines : polylines_empty_container, bounding_polyhedron, item_name, angle, @@ -881,11 +881,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type, ? image_item->image_weights() : nullptr; - Scene_polylines_item::Polylines_container plc; + Scene_polylines_item::Polylines_container polylines_empty_container; thread = cgal_code_mesh_3( pImage, - (img_polylines_item == nullptr) ? plc : img_polylines_item->polylines, + (img_polylines_item == nullptr) ? polylines_empty_container : img_polylines_item->polylines, angle, facets_sizing, facets_min_sizing, From 00f167a8357ab5fe72fb22e0a547c5543f8f1d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:02:47 +0200 Subject: [PATCH 0791/1398] Add benchmarking scripts --- .../benchmark/Alpha_wrap_3/CMakeLists.txt | 15 + .../compute_performance_benchmark_data.py | 61 ++++ .../generate_performance_benchmark_charts.py | 156 ++++++++++ .../Performance/performance_benchmark.cpp | 65 +++++ .../Quality/compute_quality_benchmark_data.py | 54 ++++ .../Alpha_wrap_3/Quality/distance_utils.h | 151 ++++++++++ .../generate_quality_benchmark_charts.py | 182 ++++++++++++ .../Quality/quality_benchmark.cpp | 271 ++++++++++++++++++ .../compute_robustness_benchmark_data.py | 96 +++++++ .../generate_robustness_benchmark_charts.py | 154 ++++++++++ .../Robustness/robustness_benchmark.cpp | 106 +++++++ .../benchmark/Alpha_wrap_3/benchmarking.sh | 86 ++++++ .../CGAL/Alpha_wrap_3/internal/validation.h} | 0 .../test_AW3_cavity_initializations.cpp | 2 +- .../Alpha_wrap_3/test_AW3_manifoldness.cpp | 2 +- .../Alpha_wrap_3/test_AW3_multiple_calls.cpp | 2 +- .../Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp | 2 +- 17 files changed, 1401 insertions(+), 4 deletions(-) create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/CMakeLists.txt create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/performance_benchmark.cpp create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/distance_utils.h create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/quality_benchmark.cpp create mode 100755 Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/compute_robustness_benchmark_data.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/generate_robustness_benchmark_charts.py create mode 100644 Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/robustness_benchmark.cpp create mode 100755 Alpha_wrap_3/benchmark/Alpha_wrap_3/benchmarking.sh rename Alpha_wrap_3/{test/Alpha_wrap_3/alpha_wrap_validation.h => include/CGAL/Alpha_wrap_3/internal/validation.h} (100%) diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/CMakeLists.txt b/Alpha_wrap_3/benchmark/Alpha_wrap_3/CMakeLists.txt new file mode 100644 index 000000000000..a9aa0d1d63cb --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/CMakeLists.txt @@ -0,0 +1,15 @@ +# Created by the script cgal_create_cmake_script +# This is the CMake script for compiling a CGAL application. + +cmake_minimum_required(VERSION 3.1...3.20) +project(Alpha_wrap_3_Benchmark) + +find_package(CGAL REQUIRED) + +include_directories (BEFORE ../../include ./Quality ./Robustness) # AW3 includes +include_directories (BEFORE ../../../CGAL-Patches/include) + +# create a target per cppfile +create_single_source_cgal_program("Performance/performance_benchmark.cpp") +create_single_source_cgal_program("Quality/quality_benchmark.cpp") +create_single_source_cgal_program("Robustness/robustness_benchmark.cpp") diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py new file mode 100644 index 000000000000..86c57d351465 --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py @@ -0,0 +1,61 @@ +# Copyright (c) 2019-2023 Google LLC (USA). +# All rights reserved. +# +# This file is part of CGAL (www.cgal.org). +# +# $URL$ +# $Id$ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# +# Author(s) : Pierre Alliez +# Michael Hemmer +# Cedric Portaneri +# +#!/usr/bin/python + +import os, sys, subprocess, datetime, time, getopt + +def compute_performance_benchmark_data(execname, filename, alpha): + + output = "" + cmd = ("/usr/bin/time", "-v", + execname, "-i", + filename, "-a", alpha) + proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + start_new_session=True) + + outs, errs = proc.communicate() + output = outs.decode("utf-8") + errs.decode("utf-8") + + for output_line in output.split("\n"): + if "User time (seconds): " in output_line: + print(output_line[len("User time (seconds): "):]) + continue + if "Maximum resident set size (kbytes): " in output_line: + print(output_line[len("Maximum resident set size (kbytes): "):]) + continue + +def main(argv): + execname="" + filename="" + alpha="" + try: + opts, args = getopt.getopt(sys.argv[1:], 'e:i:a:') + except getopt.GetoptError: + sys.exit(2) + for opt, arg in opts: + if opt == "-e": + execname = arg + elif opt == "-i": + filename = arg + elif opt == "-a": + alpha = arg + + compute_performance_benchmark_data(execname, filename, alpha) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py new file mode 100644 index 000000000000..445b69232778 --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py @@ -0,0 +1,156 @@ +# Copyright (c) 2019-2023 Google LLC (USA). +# All rights reserved. +# +# This file is part of CGAL (www.cgal.org). +# +# $URL$ +# $Id$ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# +# Author(s) : Pierre Alliez +# Michael Hemmer +# Cedric Portaneri +# +#!/usr/bin/python + +import os, sys, subprocess, datetime, time, signal, getopt +import numpy as np +import matplotlib.pyplot as plt + +def main(argv): + + inputdir="" + outputdir="" + commit_hash="" + alpha="" + do_diff=False + diffdir="" + diff_hash="" + try: + opts, args = getopt.getopt(sys.argv[1:], 'i:a:o:c:d:p:') + except getopt.GetoptError: + sys.exit(2) + for opt, arg in opts: + if opt == "-i": + inputdir = arg + elif opt == "-a": + alpha = arg + elif opt == "-o": + outputdir = arg + elif opt == "-c": + commit_hash = arg + elif opt == "-d": + diff_hash = arg + do_diff = True + elif opt == "-p": + diffdir = arg + + all_metric = { + "Time_(second)" : {}, + "Memory_Peak_(kbytes)" : {}} + num_input = 0 + for filename in os.listdir(inputdir) : + new_path = os.path.join(inputdir,filename) + new_file = open(new_path) + is_empty_new = os.path.getsize(new_path) <= 1 + if do_diff : + old_path = os.path.join(diffdir,filename) + old_file = open(old_path) + is_empty_old = os.path.getsize(old_path) <= 1 + for key in all_metric: + if is_empty_new or is_empty_old : + new_val = 0. + old_val = 0. + else : + new_val = float(new_file.readline().rstrip('\n')) + old_val = float(old_file.readline().rstrip('\n')) + mesh_id = str(filename.split('.')[0]) + all_metric[key][mesh_id] = [new_val, old_val] + else : + for key in all_metric: + if is_empty_new : + new_val = 0. + else : + new_val = float(new_file.readline().rstrip('\n')) + mesh_id = str(filename.split('.')[0]) + all_metric[key][mesh_id] = [new_val, new_val] + num_input = num_input+1 + + # update .pdf chart + date_now = datetime.datetime.now() + date_for_filename = str(date_now.year) +"_"+ str(date_now.month) +"_"+ str(date_now.day) +"_"+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn" + for key in all_metric: + goal = 0 + num_el = range(len(all_metric[key])) + avg_diff_to_goal = 0. + avg = 0. + x1 = [] + x2 = [] + for value in all_metric[key].values() : + avg += value[0] + diff_to_goal = abs(value[1]-goal) - abs(value[0]-goal) + avg_diff_to_goal += diff_to_goal + x1.append(value[0]) + x2.append(value[1]) + avg_diff_to_goal /= float(len(all_metric[key])) + avg /= float(len(all_metric[key])) + + plt.figure(figsize=(8,8)) + if do_diff : + plt.hist(x2, bins=100, color='tab:green', alpha=0.5) + plt.hist(x1, bins=100, color='tab:blue', alpha=0.5) + plt.vlines(x = goal, ymin=plt.ylim()[0], ymax=plt.ylim()[1], linestyles='dashed') + + title = "" + if do_diff : + title += "Diff between " + commit_hash + " and " + diff_hash + " on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha + else : + title += "Benchmarking on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha + + avg_str = str(format(abs(avg), '.2f')) + if key == "Time_(second)" : + title += "\nIn average we spend " + avg_str + " seconds" + else : + title += "\nIn average we use up to " + avg_str + " kbytes" + + if do_diff and avg_diff_to_goal == 0. : + title += "\nNo change between the two commits" + elif do_diff : + avg_diff_str = str(format(abs(avg_diff_to_goal), '.2f')) + if key == "Time_(second)" : + if avg_diff_to_goal < 0 : + title += "\nIn average we get slower by " + else : + title += "\nIn average we get faster " + title += avg_diff_str + " seconds" + else : + if avg_diff_to_goal < 0 : + title += "\nIn average we use " + avg_diff_str + " more" + else : + title += "\nIn average we use " + avg_diff_str + " less" + title += " kbytes" + + plt.title(title, fontsize=15) + plt.xlabel(key.replace("_"," "), fontsize=14) + plt.ylabel("# of meshes", fontsize=14) + plt.tick_params(axis="x", labelsize=9) + plt.tick_params(axis="y", labelsize=9) + + chart_filename = "" + if do_diff : + chart_filename += "diff_"+commit_hash+"_"+diff_hash+"_"+key+"_"+date_for_filename+".pdf" + else : + chart_filename += "results_"+commit_hash+"_"+key+"_"+date_for_filename+".pdf" + chart_path = os.path.join(outputdir+"/charts",chart_filename) + if os.path.isfile(chart_path) : + os.remove(chart_path) + plt.savefig(chart_path, bbox_inches="tight") + plt.close() + + print("pdf updated") + + sys.exit() + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/performance_benchmark.cpp b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/performance_benchmark.cpp new file mode 100644 index 000000000000..207b4704635a --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/performance_benchmark.cpp @@ -0,0 +1,65 @@ +#include +#include + +#include + +#include + +#include +#include +#include +#include + +using K = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_3 = K::Point_3; +using Vector_3 = K::Vector_3; + +using Mesh = CGAL::Surface_mesh; + +namespace PMP = CGAL::Polygon_mesh_processing; + +int main(int argc, char** argv) +{ + const int argc_check = argc - 1; + const char* entry_name_ptr = nullptr; + double relative_alpha_ratio = 20., relative_offset_ratio = 600.; + + for(int i=1; i points; + std::vector > faces; + if(!CGAL::IO::read_polygon_soup(entry_name_ptr, points, faces) || faces.empty()) + { + std::cerr << "Error: Invalid input data." << std::endl; + return EXIT_FAILURE; + } + + CGAL::Bbox_3 bbox; + for(const Point_3& p : points) + bbox += p.bbox(); + + const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); + const double alpha = diag_length / relative_alpha_ratio; + const double offset = diag_length / relative_offset_ratio; + + Mesh wrap; + CGAL::alpha_wrap_3(points, faces, alpha, offset, wrap); + + return EXIT_SUCCESS; +} diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py new file mode 100644 index 000000000000..3b996cb57490 --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py @@ -0,0 +1,54 @@ +# Copyright (c) 2019-2023 Google LLC (USA). +# All rights reserved. +# +# This file is part of CGAL (www.cgal.org). +# +# $URL$ +# $Id$ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# +# Author(s) : Pierre Alliez +# Michael Hemmer +# Cedric Portaneri +# +#!/usr/bin/python + +import os, sys, subprocess, datetime, time, getopt + +def compute_quality_benchmark_data(execname, filename, alpha): + + output = "" + cmd = (execname, "-i", + filename, "-a", alpha) + proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + start_new_session=True) + + outs, errs = proc.communicate() + output = outs.decode("utf-8") + errs.decode("utf-8") + + print(output) + +def main(argv): + execname="" + filename="" + alpha="" + try: + opts, args = getopt.getopt(sys.argv[1:], 'e:i:a:') + except getopt.GetoptError: + sys.exit(2) + for opt, arg in opts: + if opt == "-e": + execname = arg + elif opt == "-i": + filename = arg + elif opt == "-a": + alpha = arg + + compute_quality_benchmark_data(execname, filename, alpha) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/distance_utils.h b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/distance_utils.h new file mode 100644 index 000000000000..379573e9c90a --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/distance_utils.h @@ -0,0 +1,151 @@ +// Copyright (c) 2019-2022 Google LLC (USA). +// 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) : Pierre Alliez +// Michael Hemmer +// Cedric Portaneri + +#ifndef CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_ +#define CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Aw3i { + +enum Distance_metric { HAUSDORFF = 0, MEAN = 1, RMS = 2 }; + +template +inline double approximate_hausdorff_distance(const std::vector& sample_points, + const AABBTree& tree, + Point& hint) +{ + double hdist = 0; + for(const Point& pt : sample_points) + { + hint = tree.closest_point(pt, hint); + auto dist = CGAL::squared_distance(hint, pt); + double d = CGAL::to_double(CGAL::approximate_sqrt(dist)); + if(d > hdist) + hdist = d; + } + + return hdist; +} + +template +inline double approximate_mean_distance(const std::vector& sample_points, + const AABBTree& tree, + Point& hint) +{ + double mdist = 0; + for(const Point& pt : sample_points) + { + hint = tree.closest_point(pt, hint); + auto dist = CGAL::squared_distance(hint, pt); + double d = CGAL::to_double(CGAL::approximate_sqrt(dist)); + mdist += d; + } + + return mdist / sample_points.size(); +} + +template +inline double approximate_rms_distance(const std::vector& sample_points, + const AABBTree& tree, + Point& hint) +{ + double rmsdist = 0; + for(const Point& pt : sample_points) + { + hint = tree.closest_point(pt, hint); + auto dist = CGAL::squared_distance(hint, pt); + rmsdist += CGAL::to_double(dist); + } + + return CGAL::to_double(CGAL::approximate_sqrt(rmsdist / sample_points.size())); +} + +template +inline double approximate_distance(const TriangleMesh& tm1, + const TriangleMesh& tm2, + const Distance_metric& metric) +{ + using GT = typename CGAL::GetGeomTraits::type; + using Point_3 = typename GT::Point_3; + + using Primitive = CGAL::AABB_face_graph_triangle_primitive; + using AABB_traits = CGAL::AABB_traits; + using AABB_tree = CGAL::AABB_tree; + + using CGAL::parameters::choose_parameter; + using CGAL::parameters::get_parameter; + + std::vector original_sample_points; + CGAL::Polygon_mesh_processing::sample_triangle_mesh(tm1, std::back_inserter(original_sample_points), + CGAL::parameters::all_default()); + + std::vector sample_points(std::begin(original_sample_points), + std::end(original_sample_points)); + CGAL::spatial_sort(sample_points.begin(), sample_points.end()); + + AABB_tree tree(faces(tm2).first, faces(tm2).second, tm2); + tree.build(); + + auto vpm_2 = get(CGAL::vertex_point, tm2); + Point_3 hint = get(vpm_2, *vertices(tm2).first); + + if(metric == HAUSDORFF) + return approximate_hausdorff_distance(sample_points, tree, hint); + else if(metric == MEAN) + return approximate_mean_distance(sample_points, tree, hint); + else if(metric == RMS) + return approximate_rms_distance(sample_points, tree, hint); + else + std::cerr << "Metric unknown\n" << std::endl; + + return -1.0; +} + +template +double get_longest_diag_bbox(const TriangleMesh& tm) +{ + CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(tm); + return std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + + CGAL::square(bbox.ymax() - bbox.ymin()) + + CGAL::square(bbox.zmax() - bbox.zmin())); +} + +template +inline double approximate_distance_relative_to_bbox(const TriangleMesh& tm1, + const TriangleMesh& tm2, + const Distance_metric& metric) +{ + double longest_diag_length = get_longest_diag_bbox(tm1); + return approximate_distance(tm1, tm2, metric) / longest_diag_length; +} + +template +inline double approximate_distance_relative_to_bbox(const TriangleMesh& tm1, + const TriangleMesh& tm2, + const Distance_metric& metric, + const FT& longest_diag_length) +{ + return approximate_distance(tm1, tm2, metric) / CGAL::to_double(longest_diag_length); +} + +} // namespace Aw3i + +#endif // CGAL_CGAL_ALPHA_WRAP_3_BENCHMARK_ALPHA_WRAP_3_QUALITY_DISTANCE_H_ diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py new file mode 100644 index 000000000000..0df5ed5e0f4e --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py @@ -0,0 +1,182 @@ +# Copyright (c) 2019-2023 Google LLC (USA). +# All rights reserved. +# +# This file is part of CGAL (www.cgal.org). +# +# $URL$ +# $Id$ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# +# Author(s) : Pierre Alliez +# Michael Hemmer +# Cedric Portaneri +# +#!/usr/bin/python + +import os, sys, subprocess, datetime, time, signal, getopt +import numpy as np +import matplotlib.pyplot as plt + +def main(argv): + + inputdir="" + outputdir="" + commit_hash="" + alpha="" + do_diff=False + diffdir="" + diff_hash="" + try: + opts, args = getopt.getopt(sys.argv[1:], 'i:a:o:c:d:p:') + except getopt.GetoptError: + sys.exit(2) + for opt, arg in opts: + if opt == "-i": + inputdir = arg + elif opt == "-a": + alpha = arg + elif opt == "-o": + outputdir = arg + elif opt == "-c": + commit_hash = arg + elif opt == "-d": + diff_hash = arg + do_diff = True + elif opt == "-p": + diffdir = arg + + all_metric = { + "Mean_Min_Angle_(degree)" : {}, + "Mean_Max_Angle_(degree)" : {}, + "Mean_Radius_Ratio" : {}, + "Mean_Edge_Ratio" : {}, + "Mean_Aspect_Ratio" : {}, + "Complexity_(#_of_triangle)" : {}, + "#_of_almost_degenerate_triangle" : {}, + "Hausdorff_distance_output_to_input_(%_of_bbox_diag)" : {}} + num_input = 0 + print("inputdir = ", inputdir) + for filename in os.listdir(inputdir) : + new_path = os.path.join(inputdir,filename) + new_file = open(new_path) + if do_diff : + old_path = os.path.join(diffdir,filename) + old_file = open(old_path) + is_empty_old = os.path.getsize(old_path) <= 1 + for key in all_metric : + try : + new_val = float(new_file.readline().rstrip('\n')) + old_val = float(old_file.readline().rstrip('\n')) + mesh_id = str(filename.split('.')[0]) + all_metric[key][mesh_id] = [new_val, old_val] + except ValueError: + pass + else : + for key in all_metric : + try : + new_val = float(new_file.readline().rstrip('\n')) + mesh_id = str(filename.split('.')[0]) + all_metric[key][mesh_id] = [new_val, new_val] + except ValueError: + pass + num_input = num_input+1 + + # update .pdf chart + date_now = datetime.datetime.now() + date_for_filename = str(date_now.year) +"_"+ str(date_now.month) +"_"+ str(date_now.day) +"_"+ str(date_now.hour) +"h"+ str(date_now.minute) +"mn" + for key in all_metric: + goal = 0 + if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)": + goal = 60 + elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" : + goal = 1 + + num_el = range(len(all_metric[key])) + avg_diff_to_goal = 0. + avg = 0. + x1 = [] + x2 = [] + for value in all_metric[key].values() : + avg += value[0] + diff_to_goal = abs(value[1]-goal) - abs(value[0]-goal) + avg_diff_to_goal += diff_to_goal + x1.append(value[0]) + x2.append(value[1]) + avg_diff_to_goal /= float(len(all_metric[key])) + avg /= float(len(all_metric[key])) + + plt.figure(figsize=(8,8)) + if do_diff : + plt.hist(x2, bins=100, color='tab:green', alpha=0.5) + plt.hist(x1, bins=100, color='tab:blue', alpha=0.5) + plt.vlines(x = goal, ymin=plt.ylim()[0], ymax=plt.ylim()[1], linestyles='dashed') + + title = "" + if do_diff : + title += "Diff between " + commit_hash + " and " + diff_hash + " on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha + else : + title += "Benchmarking on " + str(num_input) + " meshes from Thingi10K\nAlpha = Bbox diag length / " + alpha + + avg_str = str(format(abs(avg), '.2f')) + if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)": + title += "\nIn average we have " + avg_str + "°" + elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" : + title += "\nIn average we have a ratio of " + avg_str + elif key == "Hausdorff_distance_output_to_input_(%_of_bbox_diag)" : + title += "\nIn average we have a distance of " + avg_str + "% of bbox diag" + elif key == "Complexity_(#_of_triangle)" or key == "#_of_almost_degenerate_triangle" : + title += "\nIn average we have " + avg_str + " triangles" + + if do_diff and avg_diff_to_goal == 0. : + title += "\nNo change between the two commits" + elif do_diff : + avg_diff_str = str(format(abs(avg_diff_to_goal), '.2f')) + if key == "Mean_Min_Angle_(degree)" or key == "Mean_Max_Angle_(degree)": + if avg_diff_to_goal < 0 : + title += "\nIn average we loose " + else : + title += "\nIn average we gain " + title += avg_diff_str + "° toward 60°" + elif key == "Mean_Radius_Ratio" or key == "Mean_Edge_Ratio" or key == "Mean_Aspect_Ratio" : + if avg_diff_to_goal < 0 : + title += "\nIn average we loose " + else : + title += "\nIn average we gain " + title += avg_diff_str + " of ratio toward 1" + elif key == "Hausdorff_distance_output_to_input_(%_of_bbox_diag)" : + if avg_diff_to_goal < 0 : + title += "\nIn average we increase by " + else : + title += "\nIn average we reduce by " + title += avg_diff_str + " the bbox ratio" + elif key == "Complexity_(#_of_triangle)" or key == "#_of_almost_degenerate_triangle" : + if avg_diff_to_goal < 0 : + title += "\nIn average we get " + avg_diff_str + " more" + else : + title += "\nIn average we get " + avg_diff_str + " less" + title += " triangles" + + plt.title(title, fontsize=15) + plt.xlabel(key.replace("_"," "), fontsize=14) + plt.ylabel("# of meshes", fontsize=14) + plt.tick_params(axis="x", labelsize=9) + plt.tick_params(axis="y", labelsize=9) + + chart_filename = "" + if do_diff : + chart_filename += "diff_"+commit_hash+"_"+diff_hash+"_"+key+"_"+date_for_filename+".pdf" + else : + chart_filename += "results_"+commit_hash+"_"+key+"_"+date_for_filename+".pdf" + chart_path = os.path.join(outputdir+"/charts",chart_filename) + if os.path.isfile(chart_path) : + os.remove(chart_path) + plt.savefig(chart_path, bbox_inches="tight") + plt.close() + + print("pdf updated") + + sys.exit() + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/quality_benchmark.cpp b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/quality_benchmark.cpp new file mode 100644 index 000000000000..4565cca641a1 --- /dev/null +++ b/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/quality_benchmark.cpp @@ -0,0 +1,271 @@ +#include + +#include +#include + +#include + +#include + +#include +#include +#include + +using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_3 = Kernel::Point_3; +using Vector_3 = Kernel::Vector_3; +using Triangle_3 = Kernel::Triangle_3; +using FT = Kernel::FT; + +using Mesh = CGAL::Surface_mesh; +using face_descriptor = boost::graph_traits::face_descriptor; + +using Oracle = CGAL::Alpha_wraps_3::internal::Triangle_mesh_oracle; +using Dt = CGAL::Alpha_wraps_3::internal::Alpha_wrap_3::Triangulation; + +namespace PMP = CGAL::Polygon_mesh_processing; + +std::array triangle_angles(const Triangle_3& tr) +{ + FT sq_a = CGAL::squared_distance(tr[0], tr[1]); + FT sq_b = CGAL::squared_distance(tr[1], tr[2]); + FT sq_c = CGAL::squared_distance(tr[2], tr[0]); + + FT two_ab = 2. * CGAL::sqrt(sq_a) * CGAL::sqrt(sq_b); + FT two_bc = 2. * CGAL::sqrt(sq_b) * CGAL::sqrt(sq_c); + FT two_ca = 2. * CGAL::sqrt(sq_c) * CGAL::sqrt(sq_a); + + FT angle_a = (sq_b + sq_c - sq_a) / two_bc; + FT angle_b = (sq_c + sq_a - sq_b) / two_ca; + FT angle_c = (sq_a + sq_b - sq_c) / two_ab; + if(angle_a < -1.) angle_a = -1.; + if(angle_b < -1.) angle_b = -1.; + if(angle_c < -1.) angle_c = -1.; + if(angle_a > 1.) angle_a = 1.; + if(angle_b > 1.) angle_b = 1.; + if(angle_c > 1.) angle_c = 1.; + angle_a = std::acos(angle_a); + angle_b = std::acos(angle_b); + angle_c = std::acos(angle_c); + + return {angle_a, angle_b, angle_c}; +} + +bool is_almost_degenerate(const Triangle_3& tr, + double threshold) +{ + FT sq_area = tr.squared_area(); + return (CGAL::sqrt(CGAL::to_double(sq_area)) < threshold); +} + +auto surface_mesh_face_to_triangle(const face_descriptor fd, + const Mesh& sm) +{ + typename boost::graph_traits::halfedge_descriptor hd = halfedge(fd,sm); + return Triangle_3(sm.point(target(hd,sm)), + sm.point(target(next(hd,sm),sm)), + sm.point(target(next(next(hd,sm),sm),sm))); +} + +double mean_min_angle(const Mesh& mesh) +{ + double mean_min_angle = 0.; + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + std::array angles = triangle_angles(tr); + + FT min_angle = std::min({angles[0], angles[1], angles[2]}); + + min_angle = min_angle * (180.0 / CGAL_PI); + mean_min_angle += min_angle; + } + + mean_min_angle /= static_cast(mesh.number_of_faces()); + return mean_min_angle; +} + +double mean_max_angle(const Mesh& mesh) +{ + double mean_max_angle = 0.; + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + std::array angles = triangle_angles(tr); + + FT max_angle = std::max({angles[0], angles[1], angles[2]}); + + max_angle = max_angle * (180.0 / CGAL_PI); + mean_max_angle += max_angle; + } + + mean_max_angle /= static_cast(mesh.number_of_faces()); + return mean_max_angle; +} + +double mean_radius_ratio(const Mesh& mesh, + double degenerate_threshold) +{ + double mean_radius_ratio = 0.; + size_t num_almost_degenerate_tri = 0; + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + if(is_almost_degenerate(tr, degenerate_threshold)) + { + ++num_almost_degenerate_tri; + continue; + } + + FT circumsphere_radius = std::sqrt(CGAL::squared_radius(tr[0], tr[1], tr[2])); + + FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1])); + FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2])); + FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0])); + FT s = 0.5 * (a + b + c); + FT inscribed_radius = std::sqrt((s * (s - a) * (s - b) * (s - c)) / s); + FT radius_ratio = circumsphere_radius / inscribed_radius; + radius_ratio /= 2.; // normalized + mean_radius_ratio += radius_ratio; + } + + mean_radius_ratio /= static_cast(mesh.number_of_faces() - num_almost_degenerate_tri); + return mean_radius_ratio; +} + +double mean_edge_ratio(const Mesh& mesh, + double degenerate_threshold) +{ + double mean_edge_ratio = 0.; + size_t num_almost_degenerate_tri = 0; + + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + if(is_almost_degenerate(tr, degenerate_threshold)) + { + ++num_almost_degenerate_tri; + continue; + } + + FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1])); + FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2])); + FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0])); + FT min_edge = std::min({a, b, c}); + FT max_edge = std::max({a, b, c}); + FT edge_ratio = max_edge / min_edge; + + mean_edge_ratio += edge_ratio; + } + + mean_edge_ratio /= static_cast(mesh.number_of_faces() - num_almost_degenerate_tri); + return mean_edge_ratio; +} + +double mean_aspect_ratio(const Mesh& mesh, + double degenerate_threshold) +{ + double mean_aspect_ratio = 0.; + size_t num_almost_degenerate_tri = 0; + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + if(is_almost_degenerate(tr, degenerate_threshold)) + { + ++num_almost_degenerate_tri; + continue; + } + + FT a = std::sqrt(CGAL::squared_distance(tr[0], tr[1])); + FT b = std::sqrt(CGAL::squared_distance(tr[1], tr[2])); + FT c = std::sqrt(CGAL::squared_distance(tr[2], tr[0])); + FT s = 0.5 * (a + b + c); + FT inscribed_radius = std::sqrt((s * (s - a) * (s - b) * (s - c)) / s); + FT max_edge = std::max({a, b, c}); + FT aspect_ratio = max_edge / inscribed_radius; + aspect_ratio /= (2. * std::sqrt(3.)); // normalized + mean_aspect_ratio += aspect_ratio; + } + + mean_aspect_ratio /= static_cast(mesh.number_of_faces() - num_almost_degenerate_tri); + return mean_aspect_ratio; +} + +size_t num_almost_degenerate_tri(const Mesh& mesh, + double degenerate_threshold) +{ + size_t num_almost_degenerate_tri = 0; + for(const face_descriptor f : faces(mesh)) + { + const Triangle_3 tr = surface_mesh_face_to_triangle(f, mesh); + if(is_almost_degenerate(tr, degenerate_threshold)) + { + ++num_almost_degenerate_tri; + } + } + return num_almost_degenerate_tri; +} + +int main(int argc, char** argv) +{ + const int argc_check = argc - 1; + char *entry_name_ptr = nullptr; + double relative_alpha_ratio = 20.; + double relative_offset_ratio = 600.; + + for(int i=1; i +#include + +#include +#include + +#include + +using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point_3 = Kernel::Point_3; +using Mesh = CGAL::Surface_mesh; + +namespace CGAL { +namespace Alpha_wraps_3 { +namespace internal { +namespace { + +enum Robustness_benchmark_exit_code +{ + // Success + VALID_SOLID_OUTPUT = 0, + + // Failure + OUTPUT_IS_NOT_TRIANGLE_MESH = 1, + OUTPUT_IS_COMBINATORIAL_NON_MANIFOLD = 2, + OUTPUT_HAS_BORDERS = 3, + OUTPUT_HAS_DEGENERATED_FACES = 4, + OUTPUT_HAS_GEOMETRIC_SELF_INTERSECTIONS = 5, + OUTPUT_DOES_NOT_BOUND_VOLUME = 6, + OUTPUT_DOES_NOT_CONTAIN_INPUT = 7, + OUTPUT_DISTANCE_IS_TOO_LARGE = 8, +}; + +} // namespace +} // namespace internal +} // namespace Alpha_wraps_3 +} // namespace CGAL + +namespace PMP = CGAL::Polygon_mesh_processing; +namespace AW3i = CGAL::Alpha_wraps_3::internal; + +int main(int argc, char** argv) +{ + const int argc_check = argc - 1; + char* entry_name_ptr = nullptr; + double relative_alpha_ratio = 20.; + double relative_offset_ratio = 600.; + + for(int i=1; i $2/Robustness/results/$5/$filename.log + + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/compute_performance_benchmark_data.py \ + -e $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/build-release/performance_benchmark -i $6 -a $3 \ + > $2/Performance/results/$5/$filename.log + + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/compute_quality_benchmark_data.py \ + -e $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/build-release/quality_benchmark -i $6 -a $3 \ + > $2/Quality/results/$5/$filename.log +} +export -f compute_benchmark_data + +# $1: directory containing the alpha wrap project +# $2: directory containing the input data folder +# $3: directory containing the output results +# $4: alpha value +# $5: timeout value for robustness benchmark in seconds +# $6: number of virtual thread used +# $7: hash of the latest commit +# $8: hash of a commit to perform the diff with latest +cd $1 + +mkdir -p $3/Robustness/results/$7 +mkdir -p $3/Performance/results/$7 +mkdir -p $3/Quality/results/$7 +mkdir -p $3/Robustness/charts_data +mkdir -p $3/Performance/charts_data +mkdir -p $3/Quality/charts_data +mkdir -p $3/Robustness/charts +mkdir -p $3/Performance/charts +mkdir -p $3/Quality/charts +mkdir -p $3/Robustness/log +mkdir -p $3/Performance/log +mkdir -p $3/Quality/log +mkdir -p $3/charts + +find $2 -mindepth 1 | parallel -j$6 compute_benchmark_data $1 $3 $4 $5 $7 ::: + +python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Robustness/generate_robustness_benchmark_charts.py -i $3/Robustness/results/$7 -o $3/Robustness -a $4 -c $7 + +if [ -z "$8" ]; then + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py -i $3/Performance/results/$7 -o $3/Performance -a $4 -c $7; +else + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Performance/generate_performance_benchmark_charts.py -i $3/Performance/results/$7 -o $3/Performance -a $4 -c $7 -p $3/Performance/results/$8 -d $8; +fi + +if [ -z "$8" ]; then + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py -i $3/Quality/results/$7 -o $3/Quality -a $4 -c $7; +else + python3 $1/Alpha_wrap_3/benchmark/Alpha_wrap_3/Quality/generate_quality_benchmark_charts.py -i $3/Quality/results/$7 -o $3/Quality -a $4 -c $7 -p $3/Quality/results/$8 -d $8; +fi + +charts_path="$(ls "$3/Robustness/charts"/* -dArt | tail -n 1) $(ls "$3/Performance/charts"/* -dArt | tail -n 2) $(ls "$3/Quality/charts"/* -dArt | tail -n 9)" + +pdfjam --nup 2x6 $charts_path --outfile $3/charts/results_$7_$8_alpha_$4_$(date '+%Y-%m-%d_%H:%M:%S').pdf diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/alpha_wrap_validation.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/validation.h similarity index 100% rename from Alpha_wrap_3/test/Alpha_wrap_3/alpha_wrap_validation.h rename to Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/validation.h diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp index d7567bab205b..1e37919756ab 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_cavity_initializations.cpp @@ -6,7 +6,7 @@ #include #include -#include "alpha_wrap_validation.h" +#include #include diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp index 638431e30567..189cc73fa2dc 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_manifoldness.cpp @@ -5,7 +5,7 @@ //#define CGAL_AW3_DEBUG_QUEUE #include -#include "alpha_wrap_validation.h" +#include #include #include diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp index e2abc6f1f12f..a7abdf6674e5 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_AW3_multiple_calls.cpp @@ -4,7 +4,7 @@ #include #include -#include "alpha_wrap_validation.h" +#include #include #include diff --git a/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp b/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp index 470d48e40d44..e7a362fc7098 100644 --- a/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp +++ b/Alpha_wrap_3/test/Alpha_wrap_3/test_alpha_wrap_3_mesh.cpp @@ -6,7 +6,7 @@ //#define CGAL_AW3_DEBUG_QUEUE #include -#include "alpha_wrap_validation.h" +#include #include #include From 53c89475a379a29e6516b0d93746653c4b255e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:12:17 +0200 Subject: [PATCH 0792/1398] Rename a variable --- Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp index ffcedc7f1cbb..4e96d6c1116c 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp @@ -105,8 +105,8 @@ int main(int argc, char** argv) CGAL::Alpha_wraps_3::internal::Alpha_wrap_3 aw3(oracle); - Mesh output_mesh; - aw3(alpha, offset, output_mesh); + Mesh wrap; + aw3(alpha, offset, wrap); t.stop(); std::cout << "Took " << t.time() << std::endl; @@ -123,7 +123,7 @@ int main(int argc, char** argv) std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_" + std::to_string(static_cast(relative_alpha)) + "_" + std::to_string(static_cast(relative_offset)) + ".off"; std::cout << "Writing to " << output_name << std::endl; - CGAL::IO::write_polygon_mesh(output_name, output_mesh, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); return EXIT_SUCCESS; } From e3854f68e3269da5d3ecb472c0f1a69f5f78999c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:12:31 +0200 Subject: [PATCH 0793/1398] Expose useful typedefs from Alpha_wrapper_3 --- .../include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 3ee6061d0d89..3aaabefd94fc 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -124,8 +124,13 @@ class Alpha_wrap_3 using Default_Tds = CGAL::Triangulation_data_structure_3; using Default_Triangulation = CGAL::Delaunay_triangulation_3; +public: using Triangulation = typename Default::Get::type; + // Use the geom traits from the triangulation, and trust the (advanced) user that provided it + using Geom_traits = typename Triangulation::Geom_traits; + +private: using Cell_handle = typename Triangulation::Cell_handle; using Facet = typename Triangulation::Facet; using Vertex_handle = typename Triangulation::Vertex_handle; @@ -134,9 +139,6 @@ class Alpha_wrap_3 using Gate = internal::Gate; using Alpha_PQ = Modifiable_priority_queue, CGAL_BOOST_PAIRING_HEAP>; - // Use the geom traits from the triangulation, and trust the (advanced) user that provided it - using Geom_traits = typename Triangulation::Geom_traits; - using FT = typename Geom_traits::FT; using Point_3 = typename Geom_traits::Point_3; using Vector_3 = typename Geom_traits::Vector_3; From cfae913d77ec5e346aed9e5d3c90e3d591dea4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:13:31 +0200 Subject: [PATCH 0794/1398] Complete the sort functor in AW3's main queue --- .../internal/gate_priority_queue.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h index 5e14a4d08ea1..a9bdd7e0491b 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h @@ -68,6 +68,24 @@ struct Less_gate template bool operator()(const Gate& a, const Gate& b) const { + // If one is artificial and the other is not, give priority to the artificial facet + // + // The artificial facet are given highest priority because they need to be treated + // regardless of their circumradius. Treating them first allow the part that depends + // on alpha to be treated uniformly in a way: whatever the alpha, we'll do the same + // first treatmen + if(a.is_artificial_facet() != b.is_artificial_facet()) + return a.is_artificial_facet(); + + if(a.priority() == b.priority()) + { + // arbitrary, the sole purpose is to make it a total order for determinism + if(a.facet().first->time_stamp() == b.facet().first->time_stamp()) + return a.facet().second < b.facet().second; + + return a.facet().first->time_stamp() < b.facet().first->time_stamp(); + } + return a.priority() > b.priority(); } }; From 7e2386f97e9d935bd61d3120736832eca3200f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:14:42 +0200 Subject: [PATCH 0795/1398] Use the real circumradius value to sort the facets Meaning, use the value that we compare against alpha, and not simply the radius of the smallest circumscribing ball. This strongly changes the order of the queue and thus thus results are very different, but still the same (same guarantees, same element quality, only a little bit more elements, etc.) Also a massive, ~35% speed-up, that needs to be investigated. --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 11 +-- .../Alpha_wrap_3/internal/geometry_utils.h | 74 +++++++++++++++++++ 2 files changed, 80 insertions(+), 5 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 3aaabefd94fc..14ad83cdbd36 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1131,17 +1131,16 @@ class Alpha_wrap_3 if(status == IRRELEVANT) return false; + const FT sqr = smallest_squared_radius_3(f, m_tr); + m_queue.resize_and_push(Gate(f, sqr, (status == ARTIFICIAL_FACET))); + +#ifdef CGAL_AW3_DEBUG_QUEUE const Cell_handle ch = f.first; const int s = f.second; const Point_3& p0 = m_tr.point(ch, Triangulation::vertex_triple_index(s, 0)); const Point_3& p1 = m_tr.point(ch, Triangulation::vertex_triple_index(s, 1)); const Point_3& p2 = m_tr.point(ch, Triangulation::vertex_triple_index(s, 2)); - // @todo should prob be the real value that we compare to alpha instead of squared_radius - const FT sqr = geom_traits().compute_squared_radius_3_object()(p0, p1, p2); - m_queue.resize_and_push(Gate(f, sqr, (status == ARTIFICIAL_FACET))); - -#ifdef CGAL_AW3_DEBUG_QUEUE static int gid = 0; std::cout << "Queue insertion #" << gid++ << "\n" << " ch = " << &*ch << " (" << m_tr.is_infinite(ch) << ") " << "\n" @@ -1151,6 +1150,8 @@ class Alpha_wrap_3 std::cout << " Artificiality: " << (status == ARTIFICIAL_FACET) << std::endl; #endif + CGAL_assertion(status == ARTIFICIAL_FACET || sqr >= m_sq_alpha); + return true; } diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h index 7d66cfd19f41..f39a47012862 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/geometry_utils.h @@ -154,6 +154,80 @@ less_squared_radius_of_min_empty_sphere(typename Tr::Geom_traits::FT sq_alpha, } } +template +bool +smallest_squared_radius_3(const typename Tr::Facet& fh, + const Tr& tr) +{ + using Cell_handle = typename Tr::Cell_handle; + using Point = typename Tr::Point; + using FT = typename Tr::Geom_traits::FT; + + using CK = typename Tr::Geom_traits; + using Exact_kernel = typename Exact_kernel_selector::Exact_kernel; + using Approximate_kernel = Simple_cartesian; + using C2A = Cartesian_converter; + using C2E = typename Exact_kernel_selector::C2E; + + using Orientation_of_circumcenter = Filtered_predicate, + Orientation_of_circumcenter, + C2E, C2A>; + + Orientation_of_circumcenter orientation_of_circumcenter; + + auto squared_radius = tr.geom_traits().compute_squared_radius_3_object(); + + const Cell_handle c = fh.first; + const int ic = fh.second; + const Cell_handle n = c->neighbor(ic); + + const Point& p1 = tr.point(c, Tr::vertex_triple_index(ic,0)); + const Point& p2 = tr.point(c, Tr::vertex_triple_index(ic,1)); + const Point& p3 = tr.point(c, Tr::vertex_triple_index(ic,2)); + + // This is not actually possible in the context of alpha wrapping, but keeping it for genericity + // and because it does not cost anything. + if(tr.is_infinite(n)) + { + Orientation ori = orientation_of_circumcenter(p1, p2, p3, + tr.point(c, 0), tr.point(c, 1), + tr.point(c, 2), tr.point(c, 3)); + if(ori == POSITIVE) + return squared_radius(p1, p2, p3); + else + return squared_radius(tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)); + } + + if(tr.is_infinite(c)) + { + Orientation ori = orientation_of_circumcenter(p1, p2, p3, + tr.point(n, 0), tr.point(n, 1), + tr.point(n, 2), tr.point(n, 3)); + if(ori == NEGATIVE) + return squared_radius(p1, p2, p3); + else + return squared_radius(tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3)); + } + + // both c and n are finite + if(orientation_of_circumcenter(p1, p2, p3, + tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)) != + orientation_of_circumcenter(p1, p2, p3, + tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3))) + { + // Dual crosses the face + return squared_radius(p1, p2, p3); + } + else + { + // Dual does not crosses the face + FT cr = squared_radius(tr.point(c, 0), tr.point(c, 1), tr.point(c, 2), tr.point(c, 3)); + FT cnr = squared_radius(tr.point(n, 0), tr.point(n, 1), tr.point(n, 2), tr.point(n, 3)); + return (CGAL::min)(cr, cnr); + } +} + + } // namespace internal } // namespace Alpha_wraps_3 } // namespace CGAL From be42e0fbe887abff709b4c18d5070b5261ad71ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:19:39 +0200 Subject: [PATCH 0796/1398] Minor debug code cleaning --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 14ad83cdbd36..a7130c2a3774 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1228,8 +1228,10 @@ class Alpha_wrap_3 CGAL_precondition(!m_tr.is_infinite(f)); const Cell_handle ch = f.first; - const int id = f.second; - const Cell_handle neighbor = ch->neighbor(id); + const int s = f.second; + CGAL_precondition(ch->is_outside()); + + const Cell_handle neighbor = ch->neighbor(s); #ifdef CGAL_AW3_DEBUG_QUEUE static int fid = 0; @@ -1237,10 +1239,11 @@ class Alpha_wrap_3 std::cout << m_queue.size() << " facets in the queue" << std::endl; std::cout << "Face " << fid++ << "\n" << "c = " << &*ch << " (" << m_tr.is_infinite(ch) << "), n = " << &*neighbor << " (" << m_tr.is_infinite(neighbor) << ")" << "\n" - << m_tr.point(ch, Triangulation::vertex_triple_index(id, 0)) << "\n" - << m_tr.point(ch, Triangulation::vertex_triple_index(id, 1)) << "\n" - << m_tr.point(ch, Triangulation::vertex_triple_index(id, 2)) << std::endl; - std::cout << "Priority: " << gate.priority() << std::endl; + << m_tr.point(ch, Triangulation::vertex_triple_index(s, 0)) << "\n" + << m_tr.point(ch, Triangulation::vertex_triple_index(s, 1)) << "\n" + << m_tr.point(ch, Triangulation::vertex_triple_index(s, 2)) << std::endl; + std::cout << "Artificiality: " << gate.is_artificial_facet() << std::endl; + std::cout << "Priority: " << gate.priority() << " (sq alpha: " << m_sq_alpha << ")" << std::endl; #endif visitor.before_facet_treatment(*this, gate); @@ -1255,9 +1258,9 @@ class Alpha_wrap_3 std::string face_name = "results/steps/face_" + std::to_string(static_cast(i++)) + ".xyz"; std::ofstream face_out(face_name); face_out.precision(17); - face_out << "3\n" << m_tr.point(ch, Triangulation::vertex_triple_index(id, 0)) << "\n" - << m_tr.point(ch, Triangulation::vertex_triple_index(id, 1)) << "\n" - << m_tr.point(ch, Triangulation::vertex_triple_index(id, 2)) << std::endl; + face_out << "3\n" << m_tr.point(ch, Triangulation::vertex_triple_index(s, 0)) << "\n" + << m_tr.point(ch, Triangulation::vertex_triple_index(s, 1)) << "\n" + << m_tr.point(ch, Triangulation::vertex_triple_index(s, 2)) << std::endl; face_out.close(); #endif From 8ccce4c536ea7c3e04f1a15d34e6ca362ae84bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 29 Sep 2023 11:19:52 +0200 Subject: [PATCH 0797/1398] Avoid one useless facet check This doesn't bring any speed-up because it was a very fast exit in push_facet(): the neighbor was necessarily outside (since we come from it), and we are done. --- .../include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index a7130c2a3774..2174363240b6 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -1355,15 +1355,16 @@ class Alpha_wrap_3 } } } - else + else // no need for a Steiner point, carve through and continue { // tag neighbor as OUTSIDE neighbor->is_outside() = true; // for each finite facet of neighbor, push it to the queue - for(int i=0; i<4; ++i) + const int mi = m_tr.mirror_index(ch, s); + for(int i=1; i<4; ++i) { - const Facet neighbor_f = std::make_pair(neighbor, i); + const Facet neighbor_f = std::make_pair(neighbor, (mi+i)&3); push_facet(neighbor_f); } } From 3e632ecb629ecf9ca40235316f7ab516d256ee56 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Fri, 29 Sep 2023 15:00:08 +0200 Subject: [PATCH 0798/1398] Add missing functions capacity and upper bound in dart_range for cmap and lcc with index. --- .../Combinatorial_map_storages_with_index.h | 6 ++- ..._linear_cell_complex_storages_with_index.h | 38 ++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) 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 f1e3d62cbab7..2b2ecf811830 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h @@ -148,6 +148,10 @@ namespace CGAL { { return mmap.mdarts.is_used(i); } bool owns(size_type i) const { return mmap.mdarts.owns(i); } + size_type capacity() const + { return mmap.mdarts.capacity(); } + size_type upper_bound() const + { return mmap.mdarts.upper_bound(); } private: Self & mmap; }; @@ -444,7 +448,7 @@ namespace CGAL { (mattribute_containers).upper_bound(); } - protected: + protected: // Set the handle on the i th attribute template void basic_set_dart_attribute(Dart_descriptor dh, diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h index 56010ad433ab..96b388fd1728 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h @@ -99,14 +99,14 @@ namespace CGAL { {}; template struct Attribute_const_descriptor: - public Helper::template Attribute_const_descriptor + public Helper::template Attribute_const_descriptor {}; template struct Attribute_range: public Helper::template Attribute_range {}; template struct Attribute_const_range: - public Helper::template Attribute_const_range + public Helper::template Attribute_const_range {}; typedef typename Attribute_type<0>::type Vertex_attribute; @@ -169,6 +169,10 @@ namespace CGAL { { return mmap.mdarts.is_used(i); } bool owns(size_type i) const { return mmap.mdarts.owns(i); } + size_type capacity() const + { return mmap.mdarts.capacity(); } + size_type upper_bound() const + { return mmap.mdarts.upper_bound(); } private: Self & mmap; }; @@ -202,7 +206,7 @@ namespace CGAL { * @return true iff the map is empty. */ bool is_empty() const - { return darts().empty(); } + { return darts().empty(); } /// @return the number of darts. size_type number_of_darts() const @@ -288,18 +292,18 @@ namespace CGAL { typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { static_assert(Helper::template Dimension_index::value>=0, - "attribute called but i-attributes are disabled."); + "attribute called but i-attributes are disabled."); return std::get::value> - (mdarts[ADart].mattribute_descriptors); + (mdarts[ADart].mattribute_descriptors); } template typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { static_assert(Helper::template Dimension_index::value>=0, - "attribute called but i-attributes are disabled."); + "attribute called but i-attributes are disabled."); return std::get::value> - (mdarts[ADart].mattribute_descriptors); + (mdarts[ADart].mattribute_descriptors); } // Copy a given attribute @@ -360,7 +364,7 @@ namespace CGAL { { CGAL_assertion( ah!=null_descriptor ); return std::get::value> - (mattribute_containers)[ah]; + (mattribute_containers)[ah]; } template const typename Attribute_type::type& @@ -368,7 +372,7 @@ namespace CGAL { { CGAL_assertion( ah!=null_descriptor ); return std::get::value> - (mattribute_containers)[ah]; + (mattribute_containers)[ah]; } // Get the dart of the given attribute @@ -486,14 +490,14 @@ namespace CGAL { typename Attribute_descriptor::type ah) { std::get::value> - (mdarts[dh].mattribute_descriptors) = ah; + (mdarts[dh].mattribute_descriptors) = ah; } /** Link a dart with a given dart for a given dimension. - * @param adart the dart to link. - * @param adart2 the dart to link with. - * @param i the dimension. - */ + * @param adart the dart to link. + * @param adart2 the dart to link with. + * @param i the dimension. + */ template void dart_link_beta(Dart_descriptor adart, Dart_descriptor adart2) { @@ -509,9 +513,9 @@ namespace CGAL { } /** Unlink a dart for a given dimension. - * @param adart a dart. - * @param i the dimension. - */ + * @param adart a dart. + * @param i the dimension. + */ template void dart_unlink_beta(Dart_descriptor adart) { From 05e11d381f952251538a134bd114871b1eb90173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Aug 2021 17:32:43 +0200 Subject: [PATCH 0799/1398] add experimental function to refine a mesh along an isocurve --- .../internal/refine_mesh_at_isolevel.h | 129 ++++++++++++++++++ .../Polygon_mesh_processing/CMakeLists.txt | 5 + .../test_geodesic_isolevel_refinement.cmd | 1 + .../test_geodesic_isolevel_refinement.cpp | 63 +++++++++ 4 files changed, 198 insertions(+) create mode 100644 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h create mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd create mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h new file mode 100644 index 000000000000..f4b0f7cc6497 --- /dev/null +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h @@ -0,0 +1,129 @@ +// Copyright (c) 2021 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_POLYGON_MESH_PROCESSING_CLIP_H +#define CGAL_POLYGON_MESH_PROCESSING_CLIP_H + +#include + +#include + +namespace CGAL { +namespace Polygon_mesh_processing { +namespace experimental { + + +template +void refine_mesh_at_isolevel(PolygonMesh& pm, + ValueMap value_map, + typename boost::property_traits::value_type isovalue, + const NamedParameters& np) +{ + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + + typedef Static_boolean_property_map Default_ECM; + typedef typename internal_np::Lookup_named_param_def::type ECM; + typedef typename GetVertexPointMap < PolygonMesh, NamedParameters>::type VPM; + + VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), + get_property_map(vertex_point, pm)); + + ECM ecm = choose_parameter(get_parameter(np, internal_np::edge_is_constrained), Default_ECM()); + + std::unordered_map > faces_to_split; + std::vector to_split; + for (edge_descriptor e : edges(pm)) + { + vertex_descriptor src = source(e, pm), tgt = target(e, pm); + if (get(value_map, src)==isovalue) + { + for (halfedge_descriptor h : halfedges_around_source(halfedge(e, pm), pm)) + { + face_descriptor f = face(h, pm); + if (f!=boost::graph_traits::null_face()) + faces_to_split[f].push_back(opposite(h, pm)); + } + continue; + } + if (get(value_map, tgt)==isovalue) + { + for (halfedge_descriptor h : halfedges_around_target(halfedge(e, pm), pm)) + { + face_descriptor f = face(h, pm); + if (f!=boost::graph_traits::null_face()) + faces_to_split[f].push_back(h); + } + continue; + } + if ( (get(value_map, tgt) < isovalue) != (get(value_map, src) < isovalue) ) + { + to_split.push_back(e); + } + } + + for (edge_descriptor e : to_split) + { + vertex_descriptor src = source(e, pm), tgt = target(e, pm); + double ds = get(value_map, src); + double dt = get(value_map, tgt); + double alpha = (isovalue - dt) / (ds - dt); + halfedge_descriptor hnew = CGAL::Euler::split_edge(halfedge(e, pm), pm); + put(vpm, target(hnew, pm), barycenter(get(vpm,src), alpha, get(vpm, tgt), 1-alpha)); + put(value_map, target(hnew, pm) , isovalue); + face_descriptor f = face(hnew, pm); + if (f!=boost::graph_traits::null_face()) + faces_to_split[f].push_back(hnew); + hnew=pm.prev(opposite(hnew, pm)); + f = face(hnew, pm); + if (f!=boost::graph_traits::null_face()) + faces_to_split[f].push_back(hnew); + } + + for (const auto& p : faces_to_split) + { + if(p.second.size()!=2) continue; + + std::pair res = edge(target(p.second[0],pm), + target(p.second[1],pm), pm); + if (res.second) + { + // no split as the edge already exists (the two vertices are on the isolevel) + put(ecm, res.first, true); + continue; + } + + halfedge_descriptor hnew = CGAL::Euler::split_face(p.second[0], p.second[1], pm); + put(ecm, edge(hnew, pm), true); + } +} + +template +void refine_mesh_at_isolevel(PolygonMesh& pm, + ValueMap value_map, + typename boost::property_traits::value_type iso_level) +{ + refine_mesh_at_isolevel(pm, value_map, iso_level, parameters::all_default()); +} + +} } } // end of CGAL::Polygon_mesh_processing::experimental + + +#endif diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index eb9b98cbe593..6f5d1e7c7ce9 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -125,6 +125,11 @@ else() message(STATUS "NOTICE: Tests are not using Ceres.") endif() +if (TARGET CGAL::Eigen3_support) + create_single_source_cgal_program("test_geodesic_isolevel_refinement.cpp") + target_link_libraries( test_geodesic_isolevel_refinement PUBLIC CGAL::Eigen3_support) +endif() + if(BUILD_TESTING) set_tests_properties( "execution of triangulate_hole_Polyhedron_3_no_delaunay_test" diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd new file mode 100644 index 000000000000..36105ee3a020 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd @@ -0,0 +1 @@ +${CGAL_DATA_DIR}/meshes/elephant.off 0.001 0.01 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 10 diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp new file mode 100644 index 000000000000..a2098c63e3b9 --- /dev/null +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include +#include + +#include +#include + +typedef CGAL::Simple_cartesian Kernel; +typedef Kernel::Point_3 Point_3; +typedef CGAL::Surface_mesh Triangle_mesh; + +typedef boost::graph_traits::vertex_descriptor vertex_descriptor; +typedef boost::graph_traits::edge_descriptor edge_descriptor; + +typedef Triangle_mesh::Property_map Vertex_distance_map; +typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 Heat_method; + +int main(int argc, char* argv[]) +{ + const char* filename = argv[1]; + + Triangle_mesh tm; + if(!CGAL::IO::read_polygon_mesh(filename, tm) || + CGAL::is_empty(tm) || !CGAL::is_triangle_mesh(tm)) + { + std::cerr << "Invalid input file." << std::endl; + return EXIT_FAILURE; + } + + //property map for the distance values to the source set + Vertex_distance_map vertex_distance = tm.add_property_map("v:distance", 0).first; + + Heat_method hm(tm); + + //add the first vertex as the source set + vertex_descriptor s = *(vertices(tm).first); + hm.add_source(s); + hm.estimate_geodesic_distances(vertex_distance); + + //property map for the constrained status of edges + auto ecm = tm.add_property_map("e:is_constrained", 0).first; + + + for (int i=2; i splitted; + + CGAL::Polygon_mesh_processing::split_connected_components(tm, splitted, CGAL::parameters::edge_is_constrained_map(ecm)); + +#ifdef CGAL_TEST_SUITE + assert(splitted.size() == 22); +#else + for(std::size_t i=0; i Date: Sat, 30 Sep 2023 08:41:07 +0200 Subject: [PATCH 0800/1398] add doc --- .../internal/refine_mesh_at_isolevel.h | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h index f4b0f7cc6497..8bb6502865f7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h @@ -10,10 +10,10 @@ // // Author(s) : Sebastien Loriot -#ifndef CGAL_POLYGON_MESH_PROCESSING_CLIP_H -#define CGAL_POLYGON_MESH_PROCESSING_CLIP_H +#ifndef CGAL_POLYGON_MESH_PROCESSING_REFINE_MESH_AT_ISOLEVEL_H +#define CGAL_POLYGON_MESH_PROCESSING_REFINE_MESH_AT_ISOLEVEL_H -#include +#include #include @@ -21,12 +21,43 @@ namespace CGAL { namespace Polygon_mesh_processing { namespace experimental { - -template +/*! \ingroup PkgPolygonMeshProcessingRef + * Function object that computes the intersection of a plane with + * a triangulated surface mesh. + * + * @tparam PolygonMesh a model of the concepts `EdgeListGraph` and `FaceListGraph` + * @tparam ValueMap a model of the concept `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` + * as key type and with its value type being model of `LessThanComparable`. + * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" for `pm` + * + * @param pm the polygon mesh to be refined + * @param value_map the property map containing value at each vertex for a given function defined over the mesh + * @param isovalue the value used to defined the cut locus of edges having their incident vertices associated with + * values respectively larger and smaller than `isovalue` in `value_map` + * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below + * + * \cgalNamedParamsBegin + * \cgalParamNBegin{edge_is_constrained_map} + * \cgalParamDescription{an ouput property map associating `true` to all new edges added by the cut, and false to input edges. + * \cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits::%edge_descriptor` + * as key type and `bool` as value type} + * \cgalParamDefault{No marks on edges will be put} + * \cgalParamNBegin{vertex_point_map} + * \cgalParamDescription{a property map associating points to the vertices of `pm`} + * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` + * as key type and `%Point_3` as value type} + * \cgalParamDefault{`boost::get(CGAL::vertex_point, pm)`} + * \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` + * must be available in `PolygonMesh`.} + * \cgalParamNEnd + * \cgalNamedParamsEnd + * + */ +template void refine_mesh_at_isolevel(PolygonMesh& pm, ValueMap value_map, typename boost::property_traits::value_type isovalue, - const NamedParameters& np) + const NamedParameters& np = parameters::default_values()) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; @@ -115,14 +146,6 @@ void refine_mesh_at_isolevel(PolygonMesh& pm, } } -template -void refine_mesh_at_isolevel(PolygonMesh& pm, - ValueMap value_map, - typename boost::property_traits::value_type iso_level) -{ - refine_mesh_at_isolevel(pm, value_map, iso_level, parameters::all_default()); -} - } } } // end of CGAL::Polygon_mesh_processing::experimental From 5f012f87464ab14cda32fb734a6384d61847120d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 2 Oct 2023 10:54:54 +0100 Subject: [PATCH 0801/1398] By default do the same thing for border edges --- .../include/CGAL/Variational_shape_approximation.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h index 23cfab856f61..c6966ccaac01 100644 --- a/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h +++ b/Surface_mesh_approximation/include/CGAL/Variational_shape_approximation.h @@ -824,7 +824,7 @@ class Variational_shape_approximation { * \cgalParamNBegin{optimize_boundary_anchor_location} * \cgalParamDescription{If `true`, optimize the anchor locations of boundary vertices} * \cgalParamType{`Boolean`} - * \cgalParamDefault{`true`} + * \cgalParamDefault{`optimize_anchor_location`} * \cgalParamNEnd * * \cgalParamNBegin{pca_plane} @@ -844,7 +844,7 @@ class Variational_shape_approximation { const bool relative_to_chord = choose_parameter(get_parameter(np, internal_np::relative_to_chord), false); const bool with_dihedral_angle = choose_parameter(get_parameter(np, internal_np::with_dihedral_angle), false); const bool optimize_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_anchor_location), true); - const bool optimize_boundary_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_boundary_anchor_location), true); + const bool optimize_boundary_anchor_location = choose_parameter(get_parameter(np, internal_np::optimize_boundary_anchor_location), optimize_anchor_location); const bool pca_plane = choose_parameter(get_parameter(np, internal_np::pca_plane), false); // compute averaged edge length, used in chord subdivision From eacc3ab4d1c8eb17818d8caf33b87ae367e82206 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 2 Oct 2023 12:13:54 +0200 Subject: [PATCH 0802/1398] add missing typedef --- Mesh_3/include/CGAL/Mesh_vertex_base_3.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mesh_3/include/CGAL/Mesh_vertex_base_3.h b/Mesh_3/include/CGAL/Mesh_vertex_base_3.h index 2cf97e4bdc1e..46b09094e954 100644 --- a/Mesh_3/include/CGAL/Mesh_vertex_base_3.h +++ b/Mesh_3/include/CGAL/Mesh_vertex_base_3.h @@ -115,6 +115,7 @@ class Mesh_vertex_3 // Types typedef Index_ Index; typedef typename GT::FT FT; + typedef typename Vb::Point Point; // Constructor Mesh_vertex_3() @@ -324,6 +325,7 @@ struct Mesh_vertex_base_3 { #endif using Vertex_handle = typename Triangulation_data_structure::Vertex_handle; using Cell_handle = typename Triangulation_data_structure::Cell_handle; + using Point = typename Vb::Point; template < class TDS3 > struct Rebind_TDS { From c17841356a3228ff9509a6edc58bc22fee672071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 2 Oct 2023 13:10:38 +0200 Subject: [PATCH 0803/1398] Minor error message tweak --- Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp | 2 +- Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp | 2 +- Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp | 2 +- Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp | 2 +- Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp | 2 +- Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp index 8742a2a20011..aeb47b80152e 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp @@ -23,7 +23,7 @@ int main(int argc, char** argv) Point_container points; if(!CGAL::IO::read_points(filename, std::back_inserter(points)) || points.empty()) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp index 600d533ee411..59010d1212ea 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp @@ -35,7 +35,7 @@ int main(int argc, char** argv) Mesh mesh; if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh)) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp index 00e2e4fd9fc5..369cf375a6ff 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp @@ -25,7 +25,7 @@ int main(int argc, char** argv) Mesh mesh; if(!PMP::IO::read_polygon_mesh(filename, mesh) || is_empty(mesh) || !is_triangle_mesh(mesh)) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp index 626e3bdc3ba4..6e1321c302dd 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp @@ -30,7 +30,7 @@ int main(int argc, char** argv) std::vector > faces; if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty()) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp index 113215b631a1..682cffac3390 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -70,7 +70,7 @@ int main(int argc, char** argv) Faces faces; if(!CGAL::IO::read_polygon_soup(filename, points, faces) || faces.empty()) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp index 1c1d6c7b3d72..9de47aefbcd2 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp @@ -25,7 +25,7 @@ int main(int argc, char** argv) if(!PMP::IO::read_polygon_mesh(filename, input) || is_empty(input) || !is_triangle_mesh(input)) { - std::cerr << "Invalid input." << std::endl; + std::cerr << "Invalid input:" << filename << std::endl; return EXIT_FAILURE; } From 92cb998499571334451c7b6483e8d06f9d819d3d Mon Sep 17 00:00:00 2001 From: ange-clement Date: Mon, 2 Oct 2023 13:16:28 +0200 Subject: [PATCH 0804/1398] Diabled "Alpha slider" on edit box --- .../Plugins/PCA/Scene_edit_box_item.cpp | 15 +++++++++++++++ .../Polyhedron/Plugins/PCA/Scene_edit_box_item.h | 1 + 2 files changed, 16 insertions(+) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index 91bcde149bab..b007fc612821 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -281,6 +281,7 @@ struct Scene_edit_box_item_priv{ Scene_edit_box_item::Scene_edit_box_item() { d = nullptr; + contextMenu(); } Scene_edit_box_item::Scene_edit_box_item(const Scene_interface *scene_interface) { @@ -311,12 +312,26 @@ Scene_edit_box_item::Scene_edit_box_item(const Scene_interface *scene_interface) : Vi::PROGRAM_NO_SELECTION, false)); } + contextMenu(); } QString Scene_edit_box_item::toolTip() const { return QString(); } + +QMenu* Scene_edit_box_item::contextMenu() +{ + // diasable "Alpha slider" in menu + QMenu* resMenu = Scene_item::contextMenu(); + bool prop = property("menu_changed").toBool(); + if(!prop) + { + setProperty("menu_changed", true); + } + return resMenu; +} + void Scene_edit_box_item::drawSpheres(Viewer_interface *viewer, const QMatrix4x4 f_matrix ) const { GLdouble d_mat[16]; diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h index 4d8988955655..0d99b9ce08ed 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.h @@ -33,6 +33,7 @@ class SCENE_EDIT_BOX_ITEM_EXPORT Scene_edit_box_item: } QString toolTip() const; + QMenu* contextMenu(); bool eventFilter(QObject *, QEvent *); // Indicate if rendering mode is supported From 9fa445f21754a1ac7923f2b5d190647ebd818dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 2 Oct 2023 13:13:40 +0200 Subject: [PATCH 0805/1398] Change nomenclature to clarify the different types of gate permissiveness --- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 39 +++++++++++-------- .../internal/gate_priority_queue.h | 16 ++++---- .../Alpha_wrap_3/Alpha_wrap_3_plugin.cpp | 6 +-- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 2174363240b6..7c9509b9185a 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -523,7 +523,7 @@ class Alpha_wrap_3 continue; } - // Mark the seeds and icosahedron vertices as "artificial vertices" such that the facets + // Mark the seeds and icosahedron vertices as "scaffolding vertices" such that the facets // incident to these vertices are always traversable regardless of their circumcenter. // This is done because otherwise some cavities can appear on the mesh: non-traversable facets // with two vertices on the offset, and the third being a deeper inside seed / ico_seed. @@ -592,11 +592,12 @@ class Alpha_wrap_3 std::vector inc_cells; inc_cells.reserve(64); m_tr.incident_cells(seed_v, std::back_inserter(inc_cells)); + for(Cell_handle ch : inc_cells) ch->is_outside() = cavity_cell_outside_tag(ch); } - // Might as well go through the full triangulation since only seeds should have been inserted + // Should be cheap enough to go through the full triangulation as only seeds have been inserted for(Cell_handle ch : m_tr.all_cell_handles()) { if(!ch->is_outside()) @@ -1027,21 +1028,24 @@ class Alpha_wrap_3 } private: + // A permissive gate is a gate that we can traverse without checking its circumradius enum Facet_queue_status { IRRELEVANT = 0, - ARTIFICIAL_FACET, + HAS_INFINITE_NEIGHBOR, // the cell incident to the mirrored facet is infinite (permissive) + SCAFFOLDING, // incident to a SEED or BBOX vertex (permissive) TRAVERSABLE }; inline const char* get_status_message(const Facet_queue_status status) { - constexpr std::size_t status_count = 3; + constexpr std::size_t status_count = 4; // Messages corresponding to Error_code list above. Must be kept in sync! static const char* message[status_count] = { "Irrelevant facet", - "Artificial facet", + "Facet incident to infinite neighbor", + "Facet with a bbox/seed vertex", "Traversable facet" }; @@ -1079,7 +1083,7 @@ class Alpha_wrap_3 const Cell_handle nh = ch->neighbor(id); if(m_tr.is_infinite(nh)) - return TRAVERSABLE; + return HAS_INFINITE_NEIGHBOR; if(nh->is_outside()) { @@ -1089,7 +1093,7 @@ class Alpha_wrap_3 return IRRELEVANT; } - // push if facet is connected to artificial vertices + // push if facet is connected to scaffolding vertices for(int i=0; i<3; ++i) { const Vertex_handle vh = ch->vertex(Triangulation::vertex_triple_index(id, i)); @@ -1097,9 +1101,9 @@ class Alpha_wrap_3 vh->type() == AW3i::Vertex_type:: SEED_VERTEX) { #ifdef CGAL_AW3_DEBUG_FACET_STATUS - std::cout << "artificial facet due to artificial vertex #" << i << std::endl; + std::cout << "Scaffolding facet due to vertex #" << i << std::endl; #endif - return ARTIFICIAL_FACET; + return SCAFFOLDING; } } @@ -1132,7 +1136,8 @@ class Alpha_wrap_3 return false; const FT sqr = smallest_squared_radius_3(f, m_tr); - m_queue.resize_and_push(Gate(f, sqr, (status == ARTIFICIAL_FACET))); + const bool is_permissive = (status == HAS_INFINITE_NEIGHBOR || status == SCAFFOLDING); + m_queue.resize_and_push(Gate(f, sqr, is_permissive)); #ifdef CGAL_AW3_DEBUG_QUEUE const Cell_handle ch = f.first; @@ -1147,10 +1152,10 @@ class Alpha_wrap_3 << "\t" << p0 << "\n\t" << p1 << "\n\t" << p2 << std::endl; std::cout << " Status: " << get_status_message(status) << std::endl; std::cout << " SQR: " << sqr << std::endl; - std::cout << " Artificiality: " << (status == ARTIFICIAL_FACET) << std::endl; + std::cout << " Permissiveness: " << is_permissive << std::endl; #endif - CGAL_assertion(status == ARTIFICIAL_FACET || sqr >= m_sq_alpha); + CGAL_assertion(is_permissive || sqr >= m_sq_alpha); return true; } @@ -1242,8 +1247,8 @@ class Alpha_wrap_3 << m_tr.point(ch, Triangulation::vertex_triple_index(s, 0)) << "\n" << m_tr.point(ch, Triangulation::vertex_triple_index(s, 1)) << "\n" << m_tr.point(ch, Triangulation::vertex_triple_index(s, 2)) << std::endl; - std::cout << "Artificiality: " << gate.is_artificial_facet() << std::endl; std::cout << "Priority: " << gate.priority() << " (sq alpha: " << m_sq_alpha << ")" << std::endl; + std::cout << "Permissiveness: " << gate.is_permissive_facet() << std::endl; #endif visitor.before_facet_treatment(*this, gate); @@ -1547,7 +1552,7 @@ class Alpha_wrap_3 } // Some lambdas for the comparer - auto has_artificial_vertex = [](Cell_handle c) -> bool + auto has_scaffolding_vertex = [](Cell_handle c) -> bool { for(int i=0; i<4; ++i) { @@ -1625,9 +1630,9 @@ class Alpha_wrap_3 // @todo give topmost priority to cells with > 1 non-manifold vertex? auto comparer = [&](Cell_handle l, Cell_handle r) -> bool { - if(has_artificial_vertex(l)) + if(has_scaffolding_vertex(l)) return false; - if(has_artificial_vertex(r)) + if(has_scaffolding_vertex(r)) return true; const int l_bf_count = count_boundary_facets(l, v); @@ -1706,7 +1711,7 @@ class Alpha_wrap_3 std::cout << "At Facet with VID " << get(Gate_ID_PM(), current_gate) << "\n"; std::cout << "\t" << p0 << "\n\t" << p1 << "\n\t" << p2 << "\n"; - std::cout << " Artificiality: " << current_gate.is_artificial_facet() << "\n"; + std::cout << " Permissiveness: " << current_gate.is_permissive_facet() << "\n"; std::cout << " SQR: " << sqr << "\n"; std::cout << " Priority " << current_gate.priority() << std::endl; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h index a9bdd7e0491b..b091b2cabe24 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/gate_priority_queue.h @@ -37,17 +37,17 @@ class Gate private: Facet m_facet; FT m_priority; // circumsphere sq_radius - bool m_is_artificial_facet; + bool m_is_permissive_facet; public: // Constructors Gate(const Facet& facet, const FT& priority, - const bool is_artificial_facet) + const bool is_permissive_facet) : m_facet(facet), m_priority(priority), - m_is_artificial_facet(is_artificial_facet) + m_is_permissive_facet(is_permissive_facet) { CGAL_assertion(priority >= 0); } @@ -60,7 +60,7 @@ class Gate public: const Facet& facet() const { return m_facet; } const FT& priority() const { return m_priority; } - bool is_artificial_facet() const { return m_is_artificial_facet; } + bool is_permissive_facet() const { return m_is_permissive_facet; } }; struct Less_gate @@ -68,14 +68,14 @@ struct Less_gate template bool operator()(const Gate& a, const Gate& b) const { - // If one is artificial and the other is not, give priority to the artificial facet + // If one is permissive and the other is not, give priority to the permissive facet // - // The artificial facet are given highest priority because they need to be treated + // The permissive facet are given highest priority because they need to be treated // regardless of their circumradius. Treating them first allow the part that depends // on alpha to be treated uniformly in a way: whatever the alpha, we'll do the same // first treatmen - if(a.is_artificial_facet() != b.is_artificial_facet()) - return a.is_artificial_facet(); + if(a.is_permissive_facet() != b.is_permissive_facet()) + return a.is_permissive_facet(); if(a.priority() == b.priority()) { diff --git a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp index a1b29fd5689d..e66d6c83dd3f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Alpha_wrap_3/Alpha_wrap_3_plugin.cpp @@ -113,10 +113,10 @@ struct Iterative_AW3_visualization_visitor if(!points || !faces || !fcolors || !vcolors) return; - // If the next top of the queue has vertices on the bbox, don't draw (as to avoid producing + // If the next top of the queue has vertices on the bbox, don't draw (try to avoid producing // spikes in the visualization) // const auto& gate = wrapper.queue().top(); -// if(wrapper.triangulation().number_of_vertices() > 500 && gate.is_artificial_facet()) +// if(wrapper.triangulation().number_of_vertices() > 500 && gate.is_permissive_facet()) // return; // Skip some... @@ -216,7 +216,7 @@ struct AW3_interrupter_visitor { } // Only overload this one because it gives a better state of the wrap (for other visitor calls, - // we often get tetrahedral spikes because there are artificial gates in the queue) + // we often get tetrahedral spikes because there are scaffolding gates in the queue) template void before_Steiner_point_insertion(const Wrapper& wrapper, const Point& p) { From 1d79ab5023e81ba4725868ce91f638bdb399d8a2 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 2 Oct 2023 16:28:04 +0200 Subject: [PATCH 0806/1398] rename B_ --- Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h index c5a148d78fa8..e9543925efbf 100644 --- a/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h +++ b/Mesh_3/include/CGAL/Mesh_3/mesh_standard_cell_criteria.h @@ -202,7 +202,7 @@ class Cell_uniform_size_criterion { #ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA std::cerr << "Cell too small (uniform size): sq_radius[" << size - << "] bound[" << B_ << "]\n"; + << "] bound[" << sq_radius_bound_ << "]\n"; #endif return Is_bad(Quality(sq_radius_bound_/size)); } From e8651b8a58f50774263118ccfe7dedabf7de104c Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 2 Oct 2023 16:30:21 +0200 Subject: [PATCH 0807/1398] add min_radius_bound member and accessor --- Mesh_3/include/CGAL/Mesh_facet_criteria_3.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h index ef69c9413d53..7043597f336b 100644 --- a/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_facet_criteria_3.h @@ -25,6 +25,8 @@ #include #include +#include + namespace CGAL { /*! @@ -131,9 +133,13 @@ class Mesh_facet_criteria_3 const DistanceField& distance_bound, const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE, const FT& min_radius_bound = 0.) + : min_radius_bound_(std::nullopt) { if (FT(0) != min_radius_bound) + { init_min_radius(min_radius_bound); + min_radius_bound_ = min_radius_bound; + } if ( FT(0) != angle_bound ) init_aspect(angle_bound); @@ -173,6 +179,10 @@ class Mesh_facet_criteria_3 return topology_; } + std::optional min_radius_bound() const { + return min_radius_bound_; + } + private: void init_aspect(const FT& angle_bound) { @@ -242,6 +252,7 @@ class Mesh_facet_criteria_3 private: Criteria criteria_; Mesh_facet_topology topology_; + std::optional min_radius_bound_; }; // end class Mesh_facet_criteria_3 } // end namespace CGAL From 05b80838e7f62f46bb6e6a14830274835f304e66 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 2 Oct 2023 16:31:29 +0200 Subject: [PATCH 0808/1398] check min_size before inserting facets or edges in refinement queues --- .../CGAL/Mesh_3/Refine_facets_manifold_base.h | 61 +++++++++++++++---- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h index c46dad7a808f..9f266793fc6a 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h @@ -95,6 +95,7 @@ class Refine_facets_manifold_base mutable bool m_bad_vertices_initialized; bool m_with_manifold_criterion; bool m_with_boundary; + std::optional m_facet_min_size; private: // computes and return an ordered pair of Vertex @@ -141,7 +142,7 @@ class Refine_facets_manifold_base return this->r_tr_.min_squared_distance(fcenter, cp(wp)) - cw(wp); } - Facet + std::pair biggest_incident_facet_in_complex(const Vertex_handle v) const { #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS @@ -195,10 +196,12 @@ class Refine_facets_manifold_base << std::endl; #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS - return biggest_facet; + return { biggest_facet, biggest_sq_dist }; } - Facet biggest_incident_facet_in_complex(const Edge& arete) const { + std::pair + biggest_incident_facet_in_complex(const Edge& arete) const + { // Find the first facet in the incident facets // of the edge which is in the Complex // use the list of incident facets in the complex @@ -239,7 +242,25 @@ class Refine_facets_manifold_base << biggest_sq_dist << std::endl; #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS - return biggest_facet; + return { biggest_facet, biggest_sq_dist }; + } + + bool biggest_incident_facet_is_smaller_than_min_size(const Edge& e) const + { + if(!m_facet_min_size) + return false; + + const FT sq_dist = biggest_incident_facet_in_complex(e).second; + return (sq_dist < CGAL::square(*m_facet_min_size)); + } + + bool biggest_incident_facet_is_smaller_than_min_size(const Vertex_handle& v) const + { + if(!m_facet_min_size) + return false; + + const FT sq_dist = biggest_incident_facet_in_complex(v).second; + return (sq_dist < CGAL::square(*m_facet_min_size)); } /////////////////////// @@ -324,6 +345,7 @@ class Refine_facets_manifold_base , m_bad_vertices_initialized(false) , m_with_manifold_criterion((mesh_topology & MANIFOLD_WITH_BOUNDARY) != 0) , m_with_boundary((mesh_topology & NO_BOUNDARY) == 0) + , m_facet_min_size(criteria.min_radius_bound()) { #ifdef CGAL_MESH_3_DEBUG_CONSTRUCTORS std::cerr << "CONS: Refine_facets_manifold_base"; @@ -357,11 +379,14 @@ class Refine_facets_manifold_base ( (!m_with_boundary) && (this->r_c3t3_.face_status(*eit) == C3t3::BOUNDARY) ) ) { + if (biggest_incident_facet_is_smaller_than_min_size(*eit)) + continue; + #ifdef CGAL_LINKED_WITH_TBB // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(*eit), + this->insert_bad_facet(biggest_incident_facet_in_complex(*eit).first, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB @@ -395,7 +420,11 @@ class Refine_facets_manifold_base end = this->r_tr_.finite_vertices_end(); vit != end; ++vit) { - if( this->r_c3t3_.face_status(vit) == C3t3::SINGULAR ) { + if( this->r_c3t3_.face_status(vit) == C3t3::SINGULAR ) + { + if(biggest_incident_facet_is_smaller_than_min_size(vit)) + continue; + #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS std::cerr << "m_bad_vertices.insert(" << this->r_tr_.point(vit) << ")\n"; @@ -404,7 +433,7 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(vit), + this->insert_bad_facet(biggest_incident_facet_in_complex(vit).first, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB @@ -489,7 +518,7 @@ class Refine_facets_manifold_base << this->r_tr_.point(edgevv.second) << "\n"; #endif // CGAL_MESHES_DEBUG_REFINEMENT_POINTS - return biggest_incident_facet_in_complex(first_bad_edge); + return biggest_incident_facet_in_complex(first_bad_edge).first; } else { CGAL_assertion(!m_bad_vertices.empty()); const Vertex_handle& v = *m_bad_vertices.begin(); @@ -506,7 +535,7 @@ class Refine_facets_manifold_base dump_c3t3(this->r_c3t3_, "dump-crash"); CGAL_error_msg("this->r_c3t3_.face_status(v) != C3t3::SINGULAR"); } - return biggest_incident_facet_in_complex(v); + return biggest_incident_facet_in_complex(v).first; } } //end Sequential } @@ -568,11 +597,13 @@ class Refine_facets_manifold_base (this->r_c3t3_.face_status(edge) == C3t3::BOUNDARY) ) ) { + if (biggest_incident_facet_is_smaller_than_min_size(edge)) + continue; #ifdef CGAL_LINKED_WITH_TBB // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(edge), + this->insert_bad_facet(biggest_incident_facet_in_complex(edge).first, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB @@ -616,6 +647,9 @@ class Refine_facets_manifold_base // !this->r_c3t3_.is_regular_or_boundary_for_vertices(*vit) ) { + if(biggest_incident_facet_is_smaller_than_min_size(*vit)) + continue; + #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS std::cerr << "m_bad_vertices.insert(" << this->r_tr_.point(*vit) << ")\n"; @@ -624,7 +658,7 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(*vit), + this->insert_bad_facet(biggest_incident_facet_in_complex(*vit).first, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB @@ -635,7 +669,8 @@ class Refine_facets_manifold_base } if ( this->r_c3t3_.has_incident_facets_in_complex(v) && - (this->r_c3t3_.face_status(v) == C3t3::SINGULAR) + (this->r_c3t3_.face_status(v) == C3t3::SINGULAR) && + !biggest_incident_facet_is_smaller_than_min_size(v) // !this->r_c3t3_.is_regular_or_boundary_for_vertices(v) ) { @@ -647,7 +682,7 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(v), + this->insert_bad_facet(biggest_incident_facet_in_complex(v).first, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB From 83b49e296b0324e4170ca7a4fad4c27717430c18 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 2 Oct 2023 15:40:51 +0100 Subject: [PATCH 0809/1398] Fix typos in the User Manual --- .../Surface_mesh_approximation/Surface_mesh_approximation.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Surface_mesh_approximation.txt b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Surface_mesh_approximation.txt index 5a486de1ad1f..e2ea8e5b1b51 100644 --- a/Surface_mesh_approximation/doc/Surface_mesh_approximation/Surface_mesh_approximation.txt +++ b/Surface_mesh_approximation/doc/Surface_mesh_approximation/Surface_mesh_approximation.txt @@ -121,7 +121,7 @@ In order to approximate complex boundaries well, more anchors are generated by r \f[ d = d / input\_mesh\_average\_edge\_length. \f] Optionally, \f$ d \f$ can be measured as the ratio of the chord length: \f[ d = d / \Vert(\mathbf{a}, \mathbf{b})\Vert. \f] -Also, we can add a dihedral angle weight \f$ sin(\mathbf{N}_i,\mathbf{N}_j) \f$ to the distance measurement, where \f$ \mathbf{N}_i,\mathbf{N}_j \f$ are the normals of the proxies separated by the chord \f$ (\mathbf{a}, \mathbf{b}) \f$. If the angle between proxy \f$ P_i \f$ and \f$ P_j \f$ is rather small, then a coarse approximation will do as it does not add geometric information on the shape. Trivial chords (less than 4 edges) are not subdivided if they are non-circular. In case of circular chords, additional anchors maybe added to maintain the topology even if they are trivial, as detailed in Section \ref sma_anchors_additional. +Also, we can add a dihedral angle weight \f$ sin(\mathbf{N}_i,\mathbf{N}_j) \f$ to the distance measurement, where \f$ \mathbf{N}_i,\mathbf{N}_j \f$ are the normals of the proxies separated by the chord \f$ (\mathbf{a}, \mathbf{b}) \f$. If the angle between proxy \f$ P_i \f$ and \f$ P_j \f$ is rather small, then a coarse approximation will do as it does not add geometric information on the shape. Trivial chords (made of a single edge) are not subdivided. In case of circular chords, additional anchors may be added to maintain the topology, as detailed in Section \ref sma_anchors_additional. \cgalFigureBegin{chord, chord.jpg} Varying the chord error. From left to right: clustering partition, and meshing with decreasing absolute chord error 5, 3 and 1 without dihedral angle weight. The boundaries of the partition (red lines) are approximated with increasing accuracy. @@ -132,7 +132,7 @@ Varying the chord error. From left to right: clustering partition, and meshing w For a boundary cycle without any anchor such as the hole depicted Figure \cgalFigureRef{operations}, we first add a starting anchor to the boundary. We then subdivide this circular chord to ensure that every boundary cycle has at least 2 anchors (i.e., every chord is connecting 2 different anchors, Figure \cgalFigureRef{anchors}). Finally, we add additional anchors to ensure that at least three anchor vertices are generated on every boundary cycle. \cgalFigureBegin{anchors, anchors.jpg} -Adding anchors. From left to right: starting from a partition (grey) with a hole (while) and two encircled regions (green and blue), we add a starting anchor (orange disk) to the boundary cycle (red dash line) without any anchor (2nd), subdivide the circular chord (3rd, the number indicates the level of recursion) and add anchors to the boundary cycle with less than 2 anchors (4th, red dash lines). +Adding anchors. From left to right: starting from a partition (grey) with a hole (white) and two encircled regions (green and blue), we add a starting anchor (orange disk) to the boundary cycle (red dash line) without any anchor (2nd), subdivide the circular chord (3rd, the number indicates the level of recursion) and add anchors to the boundary cycle with less than 2 anchors (4th, red dash lines). \cgalFigureEnd \subsubsection sma_triangulation Discrete Triangulation From d46efd537fbb43c73687d11aa2ba54808113769c Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 2 Oct 2023 16:59:42 +0200 Subject: [PATCH 0810/1398] avoid computing twice the biggest incident facet --- .../CGAL/Mesh_3/Refine_facets_manifold_base.h | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h index 9f266793fc6a..6eadbfac52f4 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h @@ -245,22 +245,17 @@ class Refine_facets_manifold_base return { biggest_facet, biggest_sq_dist }; } - bool biggest_incident_facet_is_smaller_than_min_size(const Edge& e) const + bool is_smaller_than_min_size(const FT& sq_dist) const { if(!m_facet_min_size) return false; - - const FT sq_dist = biggest_incident_facet_in_complex(e).second; - return (sq_dist < CGAL::square(*m_facet_min_size)); + return sq_dist < CGAL::square(*m_facet_min_size); } - bool biggest_incident_facet_is_smaller_than_min_size(const Vertex_handle& v) const + template //T may be Edge or Vertex_handle + bool biggest_incident_facet_is_smaller_than_min_size(const T& t) const { - if(!m_facet_min_size) - return false; - - const FT sq_dist = biggest_incident_facet_in_complex(v).second; - return (sq_dist < CGAL::square(*m_facet_min_size)); + return is_smaller_than_min_size(biggest_incident_facet_in_complex(t).second); } /////////////////////// @@ -379,15 +374,15 @@ class Refine_facets_manifold_base ( (!m_with_boundary) && (this->r_c3t3_.face_status(*eit) == C3t3::BOUNDARY) ) ) { - if (biggest_incident_facet_is_smaller_than_min_size(*eit)) + const auto [biggest_f, sq_dist] = biggest_incident_facet_in_complex(*eit); + if (is_smaller_than_min_size(sq_dist)) continue; #ifdef CGAL_LINKED_WITH_TBB // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(*eit).first, - typename Base::Quality()); + this->insert_bad_facet(biggest_f, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB { // Sequential @@ -422,7 +417,8 @@ class Refine_facets_manifold_base { if( this->r_c3t3_.face_status(vit) == C3t3::SINGULAR ) { - if(biggest_incident_facet_is_smaller_than_min_size(vit)) + const auto [biggest_f, sq_dist] = biggest_incident_facet_in_complex(vit); + if (is_smaller_than_min_size(sq_dist)) continue; #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS @@ -433,8 +429,7 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(vit).first, - typename Base::Quality()); + this->insert_bad_facet(biggest_f, typename Base::Quality()); } else #endif // CGAL_LINKED_WITH_TBB { // Sequential @@ -597,15 +592,17 @@ class Refine_facets_manifold_base (this->r_c3t3_.face_status(edge) == C3t3::BOUNDARY) ) ) { - if (biggest_incident_facet_is_smaller_than_min_size(edge)) + const auto [biggest_f, sq_dist] = biggest_incident_facet_in_complex(edge); + if (is_smaller_than_min_size(sq_dist)) continue; + #ifdef CGAL_LINKED_WITH_TBB // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(edge).first, - typename Base::Quality()); - } else + this->insert_bad_facet(biggest_f, typename Base::Quality()); + } + else #endif // CGAL_LINKED_WITH_TBB { // Sequential m_bad_edges.insert(Bad_edge(edge_to_edgevv(edge), @@ -647,7 +644,8 @@ class Refine_facets_manifold_base // !this->r_c3t3_.is_regular_or_boundary_for_vertices(*vit) ) { - if(biggest_incident_facet_is_smaller_than_min_size(*vit)) + const auto [biggest_f, sq_dist] = biggest_incident_facet_in_complex(*vit); + if (is_smaller_than_min_size(sq_dist)) continue; #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS @@ -658,9 +656,9 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(*vit).first, - typename Base::Quality()); - } else + this->insert_bad_facet(biggest_f, typename Base::Quality()); + } + else #endif // CGAL_LINKED_WITH_TBB { // Sequential m_bad_vertices.insert(*vit); @@ -669,11 +667,14 @@ class Refine_facets_manifold_base } if ( this->r_c3t3_.has_incident_facets_in_complex(v) && - (this->r_c3t3_.face_status(v) == C3t3::SINGULAR) && - !biggest_incident_facet_is_smaller_than_min_size(v) + (this->r_c3t3_.face_status(v) == C3t3::SINGULAR) // !this->r_c3t3_.is_regular_or_boundary_for_vertices(v) ) { + const auto [biggest_f, sq_dist] = biggest_incident_facet_in_complex(v); + if (is_smaller_than_min_size(sq_dist)) + return; + #ifdef CGAL_MESHES_DEBUG_REFINEMENT_POINTS std::cerr << "m_bad_vertices.insert(" << this->r_tr_.point(v) << ")\n"; @@ -682,9 +683,9 @@ class Refine_facets_manifold_base // Parallel if (std::is_convertible::value) { - this->insert_bad_facet(biggest_incident_facet_in_complex(v).first, - typename Base::Quality()); - } else + this->insert_bad_facet(biggest_f, typename Base::Quality()); + } + else #endif // CGAL_LINKED_WITH_TBB { // Sequential m_bad_vertices.insert(v); From 7d12160e185cfe8b7cde24138d6e4372197ef626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 3 Oct 2023 11:52:04 +0200 Subject: [PATCH 0811/1398] update doc --- .../PackageDescription.txt | 1 + .../Polygon_mesh_processing/CMakeLists.txt | 2 + .../geodesic_isolevel_refinement.cpp} | 33 +++++++++----- .../{internal => }/refine_mesh_at_isolevel.h | 44 ++++++++++++------- .../Polygon_mesh_processing/CMakeLists.txt | 5 --- .../test_geodesic_isolevel_refinement.cmd | 1 - 6 files changed, 51 insertions(+), 35 deletions(-) rename Polygon_mesh_processing/{test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp => examples/Polygon_mesh_processing/geodesic_isolevel_refinement.cpp} (65%) rename Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/{internal => }/refine_mesh_at_isolevel.h (79%) delete mode 100644 Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt index b17c41399d0b..1d17b286dc5c 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/PackageDescription.txt @@ -258,6 +258,7 @@ The page \ref bgl_namedparameters "Named Parameters" describes their usage. - `CGAL::Polygon_mesh_processing::triangle()` - `CGAL::Polygon_mesh_processing::region_growing_of_planes_on_faces()` - `CGAL::Polygon_mesh_processing::detect_corners_of_regions()` +- `CGAL::Polygon_mesh_processing::refine_mesh_at_isolevel()` \cgalCRPSection{I/O Functions} - \link PMP_IO_grp `CGAL::Polygon_mesh_processing::IO::read_polygon_mesh()`\endlink diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt index c755ecf63e8e..0ad5f79a261b 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/CMakeLists.txt @@ -73,6 +73,8 @@ if(TARGET CGAL::Eigen3_support) target_link_libraries(delaunay_remeshing_example PUBLIC CGAL::Eigen3_support) create_single_source_cgal_program("remesh_almost_planar_patches.cpp") target_link_libraries(remesh_almost_planar_patches PUBLIC CGAL::Eigen3_support) + create_single_source_cgal_program("geodesic_isolevel_refinement.cpp") + target_link_libraries(geodesic_isolevel_refinement PUBLIC CGAL::Eigen3_support) else() message(STATUS "NOTICE: Examples that use Eigen will not be compiled.") endif() diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/geodesic_isolevel_refinement.cpp similarity index 65% rename from Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp rename to Polygon_mesh_processing/examples/Polygon_mesh_processing/geodesic_isolevel_refinement.cpp index a2098c63e3b9..76f97bf3dc66 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/geodesic_isolevel_refinement.cpp @@ -3,7 +3,7 @@ #include -#include +#include #include #include @@ -21,7 +21,7 @@ typedef CGAL::Heat_method_3::Surface_mesh_geodesic_distances_3 He int main(int argc, char* argv[]) { - const char* filename = argv[1]; + const std::string filename = (argc > 1) ? argv[1] : CGAL::data_file_path("meshes/elephant.off"); Triangle_mesh tm; if(!CGAL::IO::read_polygon_mesh(filename, tm) || @@ -31,33 +31,42 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } + // default isovalues for cutting the mesh + std::vector isovalues = {0.001, 0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 10}; + + if (argc>2) + { + isovalues.clear(); + for (int i=2; i("v:distance", 0).first; Heat_method hm(tm); - //add the first vertex as the source set + //use heat method to compute approximated geodesic distances to the source vertex `s` vertex_descriptor s = *(vertices(tm).first); hm.add_source(s); hm.estimate_geodesic_distances(vertex_distance); - //property map for the constrained status of edges + // property map to flag new cut edge added in the mesh auto ecm = tm.add_property_map("e:is_constrained", 0).first; + // refine the mesh along isovalues + for (double isovalue : isovalues) + CGAL::Polygon_mesh_processing::refine_mesh_at_isolevel(tm, vertex_distance, isovalue, CGAL::parameters::edge_is_constrained_map(ecm)); - for (int i=2; i splitted; - CGAL::Polygon_mesh_processing::split_connected_components(tm, splitted, CGAL::parameters::edge_is_constrained_map(ecm)); -#ifdef CGAL_TEST_SUITE - assert(splitted.size() == 22); -#else + assert(argc!=1 || splitted.size() == 22); + + // export each submesh in a file for(std::size_t i=0; i::%vertex_descriptor` - * as key type and with its value type being model of `LessThanComparable`. + * @tparam ValueMap a model of the concept `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` + * as key type and with its value type being the type of the coordinates of points associated with vertices + * in the vertex map provided to the `vertex_point_map()` named parameter. * @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" for `pm` * - * @param pm the polygon mesh to be refined - * @param value_map the property map containing value at each vertex for a given function defined over the mesh - * @param isovalue the value used to defined the cut locus of edges having their incident vertices associated with - * values respectively larger and smaller than `isovalue` in `value_map` + * @param pm the polygon mesh to be refined. + * @param value_map the property map containing value at each vertex for a given function defined over the mesh. + * @param isovalue the value used to defined * @param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamNBegin{edge_is_constrained_map} - * \cgalParamDescription{an ouput property map associating `true` to all new edges added by the cut, and false to input edges. + * \cgalParamDescription{an ouput property map associating `true` to all new edges added by the cut, and false to input edges.} * \cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits::%edge_descriptor` * as key type and `bool` as value type} * \cgalParamDefault{No marks on edges will be put} + * \cgalParamNEnd + * * \cgalParamNBegin{vertex_point_map} * \cgalParamDescription{a property map associating points to the vertices of `pm`} * \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` @@ -53,7 +62,7 @@ namespace experimental { * \cgalNamedParamsEnd * */ -template +template void refine_mesh_at_isolevel(PolygonMesh& pm, ValueMap value_map, typename boost::property_traits::value_type isovalue, @@ -63,6 +72,7 @@ void refine_mesh_at_isolevel(PolygonMesh& pm, typedef typename boost::graph_traits::edge_descriptor edge_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; + typedef typename boost::property_map::value_type FT; using parameters::choose_parameter; using parameters::get_parameter; @@ -113,9 +123,9 @@ void refine_mesh_at_isolevel(PolygonMesh& pm, for (edge_descriptor e : to_split) { vertex_descriptor src = source(e, pm), tgt = target(e, pm); - double ds = get(value_map, src); - double dt = get(value_map, tgt); - double alpha = (isovalue - dt) / (ds - dt); + FT ds = get(value_map, src); + FT dt = get(value_map, tgt); + FT alpha = (isovalue - dt) / (ds - dt); halfedge_descriptor hnew = CGAL::Euler::split_edge(halfedge(e, pm), pm); put(vpm, target(hnew, pm), barycenter(get(vpm,src), alpha, get(vpm, tgt), 1-alpha)); put(value_map, target(hnew, pm) , isovalue); @@ -146,7 +156,7 @@ void refine_mesh_at_isolevel(PolygonMesh& pm, } } -} } } // end of CGAL::Polygon_mesh_processing::experimental +} } // end of CGAL::Polygon_mesh_processing #endif diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt index 6f5d1e7c7ce9..eb9b98cbe593 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/CMakeLists.txt @@ -125,11 +125,6 @@ else() message(STATUS "NOTICE: Tests are not using Ceres.") endif() -if (TARGET CGAL::Eigen3_support) - create_single_source_cgal_program("test_geodesic_isolevel_refinement.cpp") - target_link_libraries( test_geodesic_isolevel_refinement PUBLIC CGAL::Eigen3_support) -endif() - if(BUILD_TESTING) set_tests_properties( "execution of triangulate_hole_Polyhedron_3_no_delaunay_test" diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd deleted file mode 100644 index 36105ee3a020..000000000000 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_geodesic_isolevel_refinement.cmd +++ /dev/null @@ -1 +0,0 @@ -${CGAL_DATA_DIR}/meshes/elephant.off 0.001 0.01 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 10 From 42b5aab4b170761f473d8464eea4bba75ee8d7cd Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 3 Oct 2023 11:18:58 +0200 Subject: [PATCH 0812/1398] Update Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_mesh_at_isolevel.h --- .../CGAL/Polygon_mesh_processing/refine_mesh_at_isolevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine_mesh_at_isolevel.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine_mesh_at_isolevel.h index 7e916fc76980..8a649b15ead4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine_mesh_at_isolevel.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine_mesh_at_isolevel.h @@ -45,7 +45,7 @@ namespace Polygon_mesh_processing { * * \cgalNamedParamsBegin * \cgalParamNBegin{edge_is_constrained_map} - * \cgalParamDescription{an ouput property map associating `true` to all new edges added by the cut, and false to input edges.} + * \cgalParamDescription{an output property map associating `true` to all new edges added by the cut, and `false` to input edges.} * \cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits::%edge_descriptor` * as key type and `bool` as value type} * \cgalParamDefault{No marks on edges will be put} From a5447a846b1734678c634fa4ed90617c06c5da46 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Wed, 4 Oct 2023 07:59:01 +0200 Subject: [PATCH 0813/1398] Remove warning --- GraphicsView/include/CGAL/Buffer_for_vao.h | 1 - 1 file changed, 1 deletion(-) diff --git a/GraphicsView/include/CGAL/Buffer_for_vao.h b/GraphicsView/include/CGAL/Buffer_for_vao.h index 8fda19879933..dde60abb832b 100644 --- a/GraphicsView/include/CGAL/Buffer_for_vao.h +++ b/GraphicsView/include/CGAL/Buffer_for_vao.h @@ -747,7 +747,6 @@ class Buffer_for_vao } // (2.2) We check if the facet is external or internal std::queue face_queue, faces_internal; - typename CDT::Face_handle face_internal = nullptr; if (cdt.infinite_vertex()->face()!=nullptr) { typename CDT::Face_circulator From 857de8b11082f463b3f9a46fd80a52150872738f Mon Sep 17 00:00:00 2001 From: ange-clement Date: Wed, 4 Oct 2023 11:21:02 +0200 Subject: [PATCH 0814/1398] Fixed warning --- .../demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp index b007fc612821..78493723e31d 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PCA/Scene_edit_box_item.cpp @@ -99,7 +99,7 @@ struct Scene_edit_box_item_priv{ constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(.0,.0,.1)); frame->setConstraint(&constraint); //create the sphere model - float eps = 1.e-3; + double eps = 1.e-3; pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps; pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps; pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps; @@ -255,7 +255,7 @@ struct Scene_edit_box_item_priv{ void reset_vertices() { Scene_item::Bbox bb = scene->bbox(); - float eps = 1.e-3; + double eps = 1.e-3; pool[0] = bb.xmin()-eps; pool[3] = bb.xmax()+eps; pool[1] = bb.ymin()-eps; pool[4] = bb.ymax()+eps; pool[2] = bb.zmin()-eps; pool[5] = bb.zmax()+eps; From ad5ae27c42ccf59683cd84a6ac52c6d6c6043d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 4 Oct 2023 22:49:06 +0200 Subject: [PATCH 0815/1398] Factorize code generating filenames out of examples --- .../Alpha_wrap_3/mixed_inputs_wrap.cpp | 5 +++-- .../examples/Alpha_wrap_3/output_helper.h | 19 +++++++++++++++++++ .../examples/Alpha_wrap_3/point_set_wrap.cpp | 8 +++----- .../Alpha_wrap_3/successive_wraps.cpp | 9 +++------ .../Alpha_wrap_3/triangle_mesh_wrap.cpp | 9 +++------ .../Alpha_wrap_3/triangle_soup_wrap.cpp | 9 +++------ .../examples/Alpha_wrap_3/volumetric_wrap.cpp | 9 +++------ .../Alpha_wrap_3/wrap_from_cavity.cpp | 8 +++----- 8 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 Alpha_wrap_3/examples/Alpha_wrap_3/output_helper.h diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp index 4e96d6c1116c..fdba4de5f514 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/mixed_inputs_wrap.cpp @@ -120,8 +120,9 @@ int main(int argc, char** argv) std::string ps_name = std::string(ps_filename); ps_name = ps_name.substr(ps_name.find_last_of("/") + 1, ps_name.length() - 1); ps_name = ps_name.substr(0, ps_name.find_last_of(".")); - std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + std::string output_name = ts_name + "_" + ss_name + "_" + ps_name + "_" + + std::to_string(static_cast(relative_alpha)) + "_" + + std::to_string(static_cast(relative_offset)) + ".off"; std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/output_helper.h b/Alpha_wrap_3/examples/Alpha_wrap_3/output_helper.h new file mode 100644 index 000000000000..3ce1155f4ef5 --- /dev/null +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/output_helper.h @@ -0,0 +1,19 @@ +#ifndef CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H +#define CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H + +#include + +std::string generate_output_name(std::string input_name, + const double alpha, + const double offset) +{ + input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); + input_name = input_name.substr(0, input_name.find_last_of(".")); + std::string output_name = input_name + + "_" + std::to_string(static_cast(alpha)) + + "_" + std::to_string(static_cast(offset)) + ".off"; + + return output_name; +} + +#endif // CGAL_ALPHA_WRAP_3_EXAMPLES_OUTPUT_HELPER_H \ No newline at end of file diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp index aeb47b80152e..a602cf5c58bf 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/point_set_wrap.cpp @@ -1,3 +1,5 @@ +#include "output_helper.h" + #include #include @@ -53,11 +55,7 @@ int main(int argc, char** argv) std::cout << "Took " << t.time() << " s." << std::endl; // Save the result - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name + "_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp index 59010d1212ea..f9b35f88b1f7 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/successive_wraps.cpp @@ -1,5 +1,7 @@ #define CGAL_AW3_TIMER +#include "output_helper.h" + #include #include @@ -69,12 +71,7 @@ int main(int argc, char** argv) std::cout << " Result: " << num_vertices(wrap) << " vertices, " << num_faces(wrap) << " faces" << std::endl; std::cout << " Elapsed time: " << t.time() << " s." << std::endl; - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name - + "_" + std::to_string(static_cast(relative_alphas[i])) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alphas[i], relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp index 369cf375a6ff..d49534904461 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_mesh_wrap.cpp @@ -1,3 +1,5 @@ +#include "output_helper.h" + #include #include @@ -56,12 +58,7 @@ int main(int argc, char** argv) std::cout << "Took " << t.time() << " s." << std::endl; // Save the result - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name - + "_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp index 6e1321c302dd..51e04974c28a 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/triangle_soup_wrap.cpp @@ -1,3 +1,5 @@ +#include "output_helper.h" + #include #include @@ -63,12 +65,7 @@ int main(int argc, char** argv) std::cout << "Took " << t.time() << " s." << std::endl; // Save the result - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name - + "_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp index 682cffac3390..3ac28de33022 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/volumetric_wrap.cpp @@ -1,3 +1,5 @@ +#include "output_helper.h" + #include #include @@ -113,12 +115,7 @@ int main(int argc, char** argv) auto dt = aw3.triangulation(); // Save the result - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name - + "_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); diff --git a/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp index 9de47aefbcd2..9422e4d969be 100644 --- a/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp +++ b/Alpha_wrap_3/examples/Alpha_wrap_3/wrap_from_cavity.cpp @@ -1,3 +1,5 @@ +#include "output_helper.h" + #include #include @@ -64,11 +66,7 @@ int main(int argc, char** argv) std::cout << "Took " << t.time() << " s." << std::endl; // Save the result - std::string input_name = std::string(filename); - input_name = input_name.substr(input_name.find_last_of("/") + 1, input_name.length() - 1); - input_name = input_name.substr(0, input_name.find_last_of(".")); - std::string output_name = input_name + "_cavity_" + std::to_string(static_cast(relative_alpha)) - + "_" + std::to_string(static_cast(relative_offset)) + ".off"; + const std::string output_name = generate_output_name(filename, relative_alpha, relative_offset); std::cout << "Writing to " << output_name << std::endl; CGAL::IO::write_polygon_mesh(output_name, wrap, CGAL::parameters::stream_precision(17)); From 660d6203308e7e32bbe37b0aea020f9a818459a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 4 Oct 2023 22:52:32 +0200 Subject: [PATCH 0816/1398] Accelerate trees manually to avoid skewing timers in flood_fill() If one day this becomes annoying because one wishes to call oracle.add_XXX() multiple times AND it's a significant runtime burden, we can just add a function add_XXXs() with a single call of accelerate_distance_queries() --- .../include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h | 6 ++++++ .../CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h | 6 ++++++ .../CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h | 6 ++++++ .../CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h index 7bad2ff313d4..8ccbf049a33e 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Point_set_oracle.h @@ -115,6 +115,12 @@ class Point_set_oracle this->tree().insert(std::next(std::cbegin(m_points), old_size), std::cend(m_points)); + // Manually constructing it here purely for profiling reasons: if we keep the lazy approach, + // it will be done at the first treatment of a facet that needs a Steiner point. + // So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes + // to accelerate the tree. + this->tree().accelerate_distance_queries(); + CGAL_postcondition(this->tree().size() == m_points.size()); } }; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h index d02a9f9faaf8..08e76dc6f5d3 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h @@ -113,6 +113,12 @@ class Segment_soup_oracle #endif this->tree().insert(std::next(std::cbegin(m_segments), old_size), std::cend(m_segments)); + // Manually constructing it here purely for profiling reasons: if we keep the lazy approach, + // it will be done at the first treatment of a facet that needs a Steiner point. + // So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes + // to accelerate the tree. + this->tree().accelerate_distance_queries(); + CGAL_postcondition(this->tree().size() == m_segments.size()); } }; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h index c87f82ac75fe..869c108693d2 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h @@ -164,6 +164,12 @@ class Triangle_mesh_oracle Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits()); } + // Manually constructing it here purely for profiling reasons: if we keep the lazy approach, + // it will be done at the first treatment of a facet that needs a Steiner point. + // So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes + // to accelerate the tree. + this->tree().accelerate_distance_queries(); + #ifdef CGAL_AW3_DEBUG std::cout << "Tree: " << this->tree().size() << " primitives (" << num_faces(tmesh) << " faces in input)" << std::endl; #endif diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h index 0a8f589fc2df..35966be46447 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h @@ -169,6 +169,12 @@ class Triangle_soup_oracle Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits()); } + // Manually constructing it here purely for profiling reasons: if we keep the lazy approach, + // it will be done at the first treatment of a facet that needs a Steiner point. + // So if one wanted to bench the flood fill runtime, it would be skewed by the time it takes + // to accelerate the tree. + this->tree().accelerate_distance_queries(); + #ifdef CGAL_AW3_DEBUG std::cout << "Tree: " << this->tree().size() << " primitives (" << faces.size() << " faces in input)" << std::endl; #endif From 88468764767950cda8daae96f5ab47885776afa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 4 Oct 2023 22:54:06 +0200 Subject: [PATCH 0817/1398] Check for degenerate segments + add warnings --- .../internal/Segment_soup_oracle.h | 20 +++++++++++++++++-- .../internal/Triangle_mesh_oracle.h | 5 +++++ .../internal/Triangle_soup_oracle.h | 10 ++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h index 08e76dc6f5d3..63f3532cf67e 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Segment_soup_oracle.h @@ -40,7 +40,8 @@ struct SS_oracle_traits { using Geom_traits = Alpha_wrap_AABB_geom_traits; // Wrap the kernel to add Ball_3 + custom Do_intersect_3 - using Segments = std::vector; + using Segment = typename GT_::Segment_3; + using Segments = std::vector; using SR_iterator = typename Segments::const_iterator; using Primitive = AABB_primitive; @@ -105,8 +107,22 @@ class Segment_soup_oracle return; } + typename Geom_traits::Is_degenerate_3 is_degenerate = this->geom_traits().is_degenerate_3_object(); + const std::size_t old_size = m_segments.size(); - m_segments.insert(std::cend(m_segments), std::cbegin(segments), std::cend(segments)); + + for(const Segment& s : segments) + { + if(is_degenerate(s)) + { +#ifdef CGAL_AW3_DEBUG + std::cerr << "Warning: ignoring degenerate segment " << s << std::endl; +#endif + continue; + } + + m_segments.push_back(s); + } #ifdef CGAL_AW3_DEBUG std::cout << "Insert into AABB tree (segments)..." << std::endl; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h index 869c108693d2..ffd8326a44f6 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h @@ -153,7 +153,12 @@ class Triangle_mesh_oracle for(face_descriptor f : faces(tmesh)) { if(Polygon_mesh_processing::is_degenerate_triangle_face(f, tmesh, np)) + { +#ifdef CGAL_AW3_DEBUG + std::cerr << "Warning: ignoring degenerate face " << f << std::endl; +#endif continue; + } const Point_ref p0 = get(vpm, source(halfedge(f, tmesh), tmesh)); const Point_ref p1 = get(vpm, target(halfedge(f, tmesh), tmesh)); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h index 35966be46447..27322a554e36 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h @@ -164,7 +164,12 @@ class Triangle_soup_oracle const Triangle_3 tr = triangle(p0, p1, p2); if(is_degenerate(tr)) + { +#ifdef CGAL_AW3_DEBUG + std::cerr << "Warning: ignoring degenerate face " << tr << std::endl; +#endif continue; + } Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits()); } @@ -190,7 +195,12 @@ class Triangle_soup_oracle for(const Triangle_3& tr : triangles) { if(is_degenerate(tr)) + { +#ifdef CGAL_AW3_DEBUG + std::cerr << "Warning: ignoring degenerate triangle " << tr << std::endl; +#endif continue; + } Splitter_base::split_and_insert_datum(tr, this->tree(), this->geom_traits()); } From 8e36b7b37e6dd2e14d55e3997d70d1ec3b0af26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 5 Oct 2023 09:32:22 +0200 Subject: [PATCH 0818/1398] the map is either const or take by copy --- Property_map/include/CGAL/property_map.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Property_map/include/CGAL/property_map.h b/Property_map/include/CGAL/property_map.h index 12fd06503fee..f1115cbf05a8 100644 --- a/Property_map/include/CGAL/property_map.h +++ b/Property_map/include/CGAL/property_map.h @@ -661,7 +661,7 @@ struct Boolean_property_map return pm.set_ptr->count(k) != 0; } - friend void put(Boolean_property_map& pm, const key_type& k, bool v) + friend void put(Boolean_property_map pm, const key_type& k, bool v) { CGAL_assertion(pm.set_ptr!=nullptr); if (v) From d53d30a69b763ad489c0476b510aa664630c0f3c Mon Sep 17 00:00:00 2001 From: albert-github Date: Thu, 5 Oct 2023 13:27:54 +0200 Subject: [PATCH 0819/1398] Defining a new resource directory to be used with doxygen master 1.10.0 Doxygen master 1.10.0 has support for the c++ concept of modules but as in the past doxygen used the term "modules" for the grouping of information (`commands like `\defgroup`, `\ingroup` etc.) an new term for the later has been introduced: Topics. The introduction of the new term also has some influence on the generated files and file names. The consequence of this is that part of CGAL documentation (i.e. the "Reference Manual") item didn't appear anymore in a.o. the treeview. - creating a new setup - adding the "topics" to the layout files as in the past the "modules" were. - adjusting the "hack.js" where some manipulation of the TreeView is done and this had "modules" coded into it. - adjusting the "header_packages.html" as this used the name "modules.js" --- Documentation/doc/CMakeLists.txt | 2 +- .../doc/resources/1.10.0/BaseDoxyfile.in | 813 ++++++++++++++++++ .../doc/resources/1.10.0/CGAL_mathjax.js | 35 + .../doc/resources/1.10.0/DoxygenLayout.xml | 177 ++++ .../resources/1.10.0/DoxygenLayoutPackage.xml | 178 ++++ .../doc/resources/1.10.0/cgal_stylesheet.css | 386 +++++++++ .../doc/resources/1.10.0/footer.html | 21 + Documentation/doc/resources/1.10.0/hacks.js | 128 +++ .../doc/resources/1.10.0/header.html | 82 ++ .../doc/resources/1.10.0/header_package.html | 144 ++++ .../doc/resources/1.10.0/menu_version.js | 109 +++ 11 files changed, 2074 insertions(+), 1 deletion(-) create mode 100644 Documentation/doc/resources/1.10.0/BaseDoxyfile.in create mode 100644 Documentation/doc/resources/1.10.0/CGAL_mathjax.js create mode 100644 Documentation/doc/resources/1.10.0/DoxygenLayout.xml create mode 100644 Documentation/doc/resources/1.10.0/DoxygenLayoutPackage.xml create mode 100644 Documentation/doc/resources/1.10.0/cgal_stylesheet.css create mode 100644 Documentation/doc/resources/1.10.0/footer.html create mode 100644 Documentation/doc/resources/1.10.0/hacks.js create mode 100644 Documentation/doc/resources/1.10.0/header.html create mode 100644 Documentation/doc/resources/1.10.0/header_package.html create mode 100644 Documentation/doc/resources/1.10.0/menu_version.js diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index 481b1792c4fd..0e7ddd3b95af 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -263,7 +263,7 @@ set(CGAL_DOC_DXY_DIR "${CMAKE_BINARY_DIR}/doc_dxy") file(MAKE_DIRECTORY "${CGAL_DOC_DXY_DIR}") #Setting the resource directory depending on the version of doxygen -set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.9.6") +set(CGAL_DOC_RESOURCE_DIR_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/resources/1.10.0") # first look if resources for the specific doxygen version is available, fallback # on the default otherwise diff --git a/Documentation/doc/resources/1.10.0/BaseDoxyfile.in b/Documentation/doc/resources/1.10.0/BaseDoxyfile.in new file mode 100644 index 000000000000..7322b03d12e0 --- /dev/null +++ b/Documentation/doc/resources/1.10.0/BaseDoxyfile.in @@ -0,0 +1,813 @@ +# Doxyfile 1.9.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# Only the settings that are not the default ones are kept in this file + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = NO + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = "cgal=%CGAL" \ + "protocgal=C++gal" \ + "plageo=Plageo" \ + "stl=STL" \ + "gmp=GMP" \ + "gmpxx=GMPXX" \ + "iso=ISO" \ + "lisp=Lisp" \ + "ieee=IEEE" \ + "ascii=ASCII" \ + "exacus=Exacus" \ + "mpir=MPIR" \ + "mpfr=MPFR" \ + "leda=LEDA" \ + "gcc=GCC" \ + "dcel=DCEL" \ + "bgl=BGL" \ + "boost=Boost" \ + "gnu=GNU" \ + "ms=MS" \ + "qt=Qt" \ + "qt5=Qt5" \ + "eigen=Eigen" \ + "opengr=OpenGR" \ + "libpointmatcher=libpointmatcher" \ + "core=Core" \ + "mpfi=MPFI" \ + "ntl=NTL" \ + "pdb=PDB" \ + "esbtl=ESBTL" \ + "tbb=TBB" \ + "laslib=LASlib" \ + "opencv=OpenCV" \ + "tensorflow=TensorFlow" \ + "metis=METIS" \ + "zlib=zlib" \ + "ceres=Ceres" \ + "glpk=GLPK" \ + "scip=SCIP" \ + "osqp=OSQP" \ + "rs=RS" \ + "rs3=RS3" \ + "unix=Unix" \ + "api=API" \ + "vtk=VTK" \ + "visualstudio=Visual Studio" \ + "taucs=TAUCS" \ + "lapack=LAPACK" \ + "blas=BLAS" \ + "opennl=OpenNL" \ + "cpp=C++" \ + "cpp11=C++11" \ + "CC=C++" \ + "cgalExample{1}=
    File \ref \1 \include \1" \ + "cgalFigureAnchor{1}=\anchor fig__\1" \ + "cgalFigureRef{1}=\ref fig__\1" \ + "cgalFigureBegin{2}=\anchor fig__\1 ^^ \image html \2 ^^ \image latex \2 \"\" width=15cm ^^ \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{3}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=7.5cm ^^ \image html \3 ^^ \image latex \3 \"\" width=7.5cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{4}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=5cm ^^ \image html \3 ^^ \image latex \3 \"\" width=5cm ^^ \image html \4 ^^ \image latex \4 \"\" width=5cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{5}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=3.75cm ^^ \image html \3 ^^ \image latex \3 \"\" width=3.75cm ^^ \image html \4 ^^ \image latex \4 \"\" width=3.75cm ^^ \image html \5 ^^ \image latex \5 \"\" width=3.75cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{6}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=3cm ^^ \image html \3 ^^ \image latex \3 \"\" width=3cm ^^ \image html \4 ^^ \image latex \4 \"\" width=3cm ^^ \image html \5 ^^ \image latex \5 \"\" width=3cm ^^ \image html \6 ^^ \image latex \6 \"\" width=3cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{7}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=2.5cm ^^ \image html \3 ^^ \image latex \3 \"\" width=2.5cm ^^ \image html \4 ^^ \image latex \4 \"\" width=2.5cm ^^ \image html \5 ^^ \image latex \5 \"\" width=2.5cm ^^ \image html \6 ^^ \image latex \6 \"\" width=2.5cm ^^ \image html \7 ^^ \image latex \7 \"\" width=2.5cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{8}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=2.1cm ^^ \image html \3 ^^ \image latex \3 \"\" width=2.1cm ^^ \image html \4 ^^ \image latex \4 \"\" width=2.1cm ^^ \image html \5 ^^ \image latex \5 \"\" width=2.1cm ^^ \image html \6 ^^ \image latex \6 \"\" width=2.1cm ^^ \image html \7 ^^ \image latex \7 \"\" width=2.1cm ^^ \image html \8 ^^ \image latex \8 \"\" width=2.1cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{9}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=1.9cm ^^ \image html \3 ^^ \image latex \3 \"\" width=1.9cm ^^ \image html \4 ^^ \image latex \4 \"\" width=1.9cm ^^ \image html \5 ^^ \image latex \5 \"\" width=1.9cm ^^ \image html \6 ^^ \image latex \6 \"\" width=1.9cm ^^ \image html \7 ^^ \image latex \7 \"\" width=1.9cm ^^ \image html \8 ^^ \image latex \8 \"\" width=1.9cm ^^ \image html \9 ^^ \image latex \9 \"\" width=1.9cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureBegin{10}=\anchor fig__\1 ^^
    \image html \2 ^^ \image latex \2 \"\" width=1.6cm ^^ \image html \3 ^^ \image latex \3 \"\" width=1.6cm ^^ \image html \4 ^^ \image latex \4 \"\" width=1.6cm ^^ \image html \5 ^^ \image latex \5 \"\" width=1.6cm ^^ \image html \6 ^^ \image latex \6 \"\" width=1.6cm ^^ \image html \7 ^^ \image latex \7 \"\" width=1.6cm ^^ \image html \8 ^^ \image latex \8 \"\" width=1.6cm ^^ \image html \9 ^^ \image latex \9 \"\" width=1.6cm ^^ \image html \10 ^^ \image latex \10 \"\" width=1.6cm ^^
    \htmlonly[block]
    \endhtmlonly ^^ \ref fig__\1" \ + "cgalFigureEnd=\htmlonly[block]
    \endhtmlonly
    " \ + "cgalFigureCaptionBegin{1}=\htmlonly[block]
    \endhtmlonly \ref fig__\1" \ + "cgalFigureCaptionEnd=\htmlonly[block]
    \endhtmlonly
    " \ + "cgalConcept=\details
    ^^ \brief" \ + "cgalConceptNamespace=\details
    ^^ \brief" \ + "cgalRefines=Refines" \ + "cgalRefines{1}=
    @cgalRefines
    @c \1
    " \ + "cgalRefines{2}=
    @cgalRefines
    @c \1
    @c \2
    " \ + "cgalRefines{3}=
    @cgalRefines
    @c \1
    @c \2
    @c \3
    " \ + "cgalRefines{4}=
    @cgalRefines
    @c \1
    @c \2
    @c \3
    @c \4
    " \ + "cgalRefines{5}=
    @cgalRefines
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ + "cgalRefinesBare{1}=
    @cgalRefines
    \1
    " \ + "cgalRefinesBare{2}=
    @cgalRefines
    @c \1
    \2
    " \ + "cgalModelsHeader=Is model of" \ + "cgalModels{1}=
    @cgalModelsHeader
    @c \1
    " \ + "cgalModels{2}=
    @cgalModelsHeader
    @c \1
    @c \2
    " \ + "cgalModels{3}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    " \ + "cgalModels{4}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    " \ + "cgalModels{5}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    " \ + "cgalModels{6}=
    @cgalModelsHeader
    @c \1
    @c \2
    @c \3
    @c \4
    @c \5
    @c \6
    " \ + "cgalModelsBareBegin=
    @cgalModelsHeader
    " \ + "cgalModelsBareEnd=
    " \ + "cgalModelsBare{1}=
    \1
    " \ + "cgalGeneralizes=\xrefitem generalizes \"Generalizes\" \"Generalization Relationships\"" \ + "cgalHasModelsHeader=Has models" \ + "cgalHasModelsBegin=
    @cgalHasModelsHeader
    " \ + "cgalHasModels{1}=
    `\1`
    " \ + "cgalHasModelsBare{1}=
    \1
    " \ + "cgalHasModelsEnd=
    " \ + "cgalDebugBegin=\htmlonly[block]
    Debugging Support
    \endhtmlonly ^^" \ + "cgalDebugEnd=\htmlonly[block]
    \endhtmlonly" \ + "cgalDebugFunction=This is a function for debugging purpose." \ + "cgalAdvancedBegin=^^ \htmlonly[block]
    Advanced
    \endhtmlonly ^^" \ + "cgalAdvancedEnd=\noop ^^ \htmlonly[block]
    \endhtmlonly" \ + "cgalAdvancedFunction=This is an advanced function." \ + "cgalAdvancedClass=This is an advanced class." \ + "cgalAdvancedType=This is an advanced type." \ + "cgalAdvancedConcept=This is an advanced concept." \ + "cgalRequiresCPP11=\warning This function requires a C++11 compiler." \ + "cgalPkgPicture{1}=
    ^^ \image html \1 ^^
    " \ + "cgalPkgSummaryBegin=
    " \ + "cgalPkgSummaryEnd=
    " \ + "cgalPkgShortInfoBegin=
    " \ + "cgalPkgShortInfoEnd=
    " \ + "cgalPkgAuthor{1}=
    \1
    " \ + "cgalPkgAuthors{1}=\cgalPkgAuthor{\1}" \ + "cgalPkgDesc{1}=
    \1
    " \ + "cgalPkgSince{1}=Introduced in: \cgal \1
    " \ + "cgalPkgDependsOn{1}=Depends on: \1
    " \ + "cgalPkgLicense{1}=License: \1
    " \ + "cgalPkgDemo{2}=Windows demo:
    \1
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{4}=Windows demos: \1, \3
    Common demo dlls: dlls
    " \ + "cgalPkgDemo{6}=Windows demos: \1, \3, \5
    Common demo dlls: dlls
    " \ + "cgalPkgDescriptionEnd=" \ + "cgalModifBegin=\htmlonly
    \endhtmlonly \xrefitem Modification \"Modifications\" \"MODIFICATIONS\"" \ + "cgalModifEnd=\htmlonly
    \endhtmlonly \latexonly END MODIFICATIONS \endlatexonly" \ + "cgalPkgBib{1}=BibTeX: \1-${CGAL_RELEASE_YEAR_ID}
    " \ + "cgalFootnote{1}=\1" \ + "cgalFootnoteCode{1}=\1" \ + "cgalAutoToc=\htmlonly[block]
    \endhtmlonly" \ + "cgalTagTrue=\link CGAL::Tag_true `CGAL::Tag_true`\endlink" \ + "cgalTagFalse=\link CGAL::Tag_false `CGAL::Tag_false`\endlink" \ + "cgalHeading{1}= \1
    " \ + "cgalClassifedRefPages=\htmlonly[block]

    Classified Reference Pages

    \endhtmlonly" \ + "cgalCRPSection{1}=

    \1

    " \ + "cgalCRPSubsection{1}=

    \1

    " \ + "cgalCite{1}=\cite \1" \ + "cgalPackageSection{2}=\htmlonly[block]
    \endhtmlonly \section \1 \2 ^^ \htmlonly[block]
    \endhtmlonly" \ + "cgalNamedParamsBegin=
    Optional Named Parameters
    " \ + "cgalNamedParamsBegin{1}=
    \1
    " \ + "cgalNamedParamsEnd=
    " \ + "cgalParamNBegin{1}= \htmlonly[block]
    \endhtmlonly
      " \ + "cgalParamDescription{1}=
    • \1
    • " \ + "cgalParamType{1}=
    • Type: \1
    • " \ + "cgalParamDefault{1}=
    • %Default: \1
    • " \ + "cgalParamExtra{1}=
    • Extra: \1
    • " \ + "cgalParamNEnd=
    \htmlonly[block]
    \endhtmlonly " \ + "cgalParamSectionBegin{1}=\cgalParamNBegin{\1}" \ + "cgalParamSectionEnd=\cgalParamNEnd" \ + "cgalParamPrecondition{1}=
  • Precondition: \1
  • " \ + "cgalBigO{1}=\f$O(\1)\f$" \ + "cgalBigOLarge{1}=\f$O\left(\1\right)\f$" \ + "cgalInclude{1}=`#include<\1>`" + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = txt=C++ + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = YES + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = YES + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = YES + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = NO + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = ${CGAL_DOC_RESOURCE_DIR}/DoxygenLayoutPackage.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = ${CGAL_DOC_BIBLIO_DIR}/cgal_manual.bib \ + ${CGAL_DOC_BIBLIO_DIR}/geom.bib + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.cpp \ + *.txt \ + *.md \ + *.h \ + *.hpp + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = Tr \ + Vb \ + Cb \ + Fb \ + K \ + Traits \ + internal + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = *.cpp \ + *.h + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = YES + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = ${CGAL_DOC_HEADER_PACKAGE} + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = ${CGAL_DOC_RESOURCE_DIR}/footer.html + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = svg + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = YES + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +${CGAL_DOC_MATHJAX_LOCATION_FULL_OPTION_LINE} + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = TeX/AMSmath \ + TeX/AMSsymbols + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = ${CGAL_DOC_RESOURCE_DIR}/CGAL_mathjax.js + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /
  • (0)) { + return exact(p); + } else { + return p; + } +} + + + } // IO namespace #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h index 36ec36f23092..a2ca48dac151 100644 --- a/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Regular_triangulation_vertex_base_2.h @@ -81,7 +81,7 @@ operator<<(std::ostream &os, const Regular_triangulation_vertex_base_2 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h index 7936ae663361..ecbb1083689d 100644 --- a/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h +++ b/Triangulation_2/include/CGAL/Triangulation_vertex_base_2.h @@ -109,7 +109,7 @@ std::ostream& operator<<(std::ostream &os, const Triangulation_vertex_base_2 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } #ifndef CGAL_NO_DEPRECATED_CODE diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h index f9f642cfbb10..cd697f179781 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_vertex_base_3.h @@ -75,7 +75,7 @@ std::ostream& operator<<(std::ostream &os, const Regular_triangulation_vertex_base_3 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h index b4527f6c403a..60e11f6233eb 100644 --- a/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h +++ b/Triangulation_3/include/CGAL/Triangulation_vertex_base_3.h @@ -61,6 +61,7 @@ class Triangulation_vertex_base_3 Point _p; }; + template < class GT, class DSVb > std::istream& operator>>(std::istream &is, Triangulation_vertex_base_3 &v) @@ -74,7 +75,7 @@ std::ostream& operator<<(std::ostream &os, const Triangulation_vertex_base_3 &v) // non combinatorial information. Default = point { - return os << static_cast(v) << v.point(); + return os << static_cast(v) << IO::serialize(v.point()); } } //namespace CGAL diff --git a/Triangulation_3/test/Triangulation_3/CMakeLists.txt b/Triangulation_3/test/Triangulation_3/CMakeLists.txt index ffd521512de0..88d63413f646 100644 --- a/Triangulation_3/test/Triangulation_3/CMakeLists.txt +++ b/Triangulation_3/test/Triangulation_3/CMakeLists.txt @@ -28,6 +28,7 @@ create_single_source_cgal_program("test_segment_simplex_traverser_3.cpp" ) create_single_source_cgal_program("test_static_filters.cpp") create_single_source_cgal_program("test_triangulation_3.cpp") create_single_source_cgal_program("test_io_triangulation_3.cpp") +create_single_source_cgal_program("test_triangulation_serialization_3.cpp") if(TARGET CGAL::TBB_support) message(STATUS "Found TBB") From 8f54a3aa06e5560ca641cc86b6a7c090a9535c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Jun 2023 14:38:48 +0200 Subject: [PATCH 0349/1398] add missing test --- .../test_triangulation_serialization_3.cpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Triangulation_3/test/Triangulation_3/test_triangulation_serialization_3.cpp diff --git a/Triangulation_3/test/Triangulation_3/test_triangulation_serialization_3.cpp b/Triangulation_3/test/Triangulation_3/test_triangulation_serialization_3.cpp new file mode 100644 index 000000000000..91a969dcc981 --- /dev/null +++ b/Triangulation_3/test/Triangulation_3/test_triangulation_serialization_3.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +#include + +#include + + +#include + +template +void test() +{ + typedef typename K::FT FT; + CGAL::Delaunay_triangulation_3 dt3; + + + // create a bunch of points + CGAL::Random random; + FT x,y,z; + for (int n=0;n<50;++n) + { + x=random.get_int(-500,500); + y=random.get_int(-500,500); + z=random.get_int(-500,500); + dt3.insert(typename K::Point_3(x/FT(3),y/FT(5),z/FT(7))); + } + + std::stringstream buffer; + buffer << std::setprecision(17) << dt3; + decltype(dt3) dt3_bis; + buffer >> dt3_bis; + + assert(dt3==dt3_bis); +} + +int main() +{ + test>(); + test(); + test(); +} \ No newline at end of file From c4eb65d71bac0982e7bab1cc175e98c1f7c792d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 13 Jun 2023 19:01:35 +0200 Subject: [PATCH 0350/1398] disable MSVC 2015 --- Scripts/developer_scripts/autotest_cgal | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Scripts/developer_scripts/autotest_cgal b/Scripts/developer_scripts/autotest_cgal index ab124cf51e2e..c984ac9ae231 100755 --- a/Scripts/developer_scripts/autotest_cgal +++ b/Scripts/developer_scripts/autotest_cgal @@ -429,6 +429,13 @@ setup_dirs() for PLATFORM in ${PLATFORMS}; do + # MSVC2015 does not support C++17 + if [ "$CGAL_RELEASE_ID" \> "CGAL-6.0" ]; then + if [ "$PLATFORMS" = "MSVC2015-Release-64bits" ]; then + continue + fi + fi + CGAL_BINARY_DIR=${CGAL_BINARY_DIR_BASE}/${PLATFORM} if [ ! -d "${CGAL_BINARY_DIR}" ]; then From 852b3b664b9fed1c76da2717a011cf2e1bcb7116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 22:40:15 +0200 Subject: [PATCH 0351/1398] expand -CGAL_CPP17_INLINE macro --- BGL/include/CGAL/boost/graph/internal/Has_member_clear.h | 2 +- .../include/CGAL/Box_intersection_d/segment_tree.h | 2 +- Combinatorial_map/include/CGAL/Combinatorial_map_storages.h | 4 ++-- Generalized_map/include/CGAL/Generalized_map_storages.h | 4 ++-- Installation/include/CGAL/config.h | 6 ------ .../include/CGAL/CMap_linear_cell_complex_storages.h | 4 ++-- .../include/CGAL/GMap_linear_cell_complex_storages.h | 4 ++-- STL_Extension/include/CGAL/Named_function_parameters.h | 2 +- STL_Extension/include/CGAL/type_traits/is_iterator.h | 6 +++--- Stream_support/include/CGAL/IO/helpers.h | 4 ++-- 10 files changed, 16 insertions(+), 22 deletions(-) diff --git a/BGL/include/CGAL/boost/graph/internal/Has_member_clear.h b/BGL/include/CGAL/boost/graph/internal/Has_member_clear.h index 9d0288d11712..c0e284b6574d 100644 --- a/BGL/include/CGAL/boost/graph/internal/Has_member_clear.h +++ b/BGL/include/CGAL/boost/graph/internal/Has_member_clear.h @@ -29,7 +29,7 @@ class Has_member_clear }; template -CGAL_CPP17_INLINE constexpr bool Has_member_clear_v = Has_member_clear::value; +inline constexpr bool Has_member_clear_v = Has_member_clear::value; } // internal } // cgal diff --git a/Box_intersection_d/include/CGAL/Box_intersection_d/segment_tree.h b/Box_intersection_d/include/CGAL/Box_intersection_d/segment_tree.h index 31b1fb23dd08..43f4061a4497 100644 --- a/Box_intersection_d/include/CGAL/Box_intersection_d/segment_tree.h +++ b/Box_intersection_d/include/CGAL/Box_intersection_d/segment_tree.h @@ -326,7 +326,7 @@ class Has_member_report }; template -CGAL_CPP17_INLINE constexpr bool Has_member_report_v = Has_member_report::value; +inline constexpr bool Has_member_report_v = Has_member_report::value; template inline diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h index cde06788e0d3..3754a4439d4b 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h @@ -64,7 +64,7 @@ namespace CGAL { typedef typename Dart_container::size_type size_type; typedef std::nullptr_t Null_descriptor_type; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_descriptor=nullptr; + inline static constexpr Null_descriptor_type null_descriptor=nullptr; using Type_for_compact_container=void*; @@ -107,7 +107,7 @@ namespace CGAL { template using Attribute_const_handle=Attribute_const_descriptor; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_handle=null_descriptor; + inline static constexpr Null_descriptor_type null_handle=null_descriptor; /// Number of marks static const size_type NB_MARKS = 32; diff --git a/Generalized_map/include/CGAL/Generalized_map_storages.h b/Generalized_map/include/CGAL/Generalized_map_storages.h index d628b153a5e3..d14cc8ea17c5 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages.h @@ -64,7 +64,7 @@ namespace CGAL { typedef typename Dart_container::size_type size_type; typedef std::nullptr_t Null_descriptor_type; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_descriptor=nullptr; + inline static constexpr Null_descriptor_type null_descriptor=nullptr; using Type_for_compact_container=void*; @@ -107,7 +107,7 @@ namespace CGAL { template using Attribute_const_handle=Attribute_const_descriptor; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_handle=null_descriptor; + inline static constexpr Null_descriptor_type null_handle=null_descriptor; /// Number of marks static const size_type NB_MARKS = 32; diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index d492dafc0466..d48250f1dc13 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -488,12 +488,6 @@ namespace cpp11{ # define CGAL_FALLTHROUGH while(false){} #endif -#if CGAL_CXX17 -# define CGAL_CPP17_INLINE inline -#else -# define CGAL_CPP17_INLINE -#endif - #ifndef CGAL_NO_ASSERTIONS # define CGAL_NO_ASSERTIONS_BOOL false #else diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h index e43fb2790389..6e6884ecbcf1 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h @@ -74,7 +74,7 @@ namespace CGAL { typedef typename Dart_container::size_type size_type; typedef std::nullptr_t Null_descriptor_type; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_descriptor=nullptr; + inline static constexpr Null_descriptor_type null_descriptor=nullptr; using Type_for_compact_container=void*; @@ -128,7 +128,7 @@ namespace CGAL { using Vertex_attribute_handle=Vertex_attribute_descriptor; using Vertex_attribute_const_handle=Vertex_attribute_const_descriptor; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_handle=null_descriptor; + inline static constexpr Null_descriptor_type null_handle=null_descriptor; /// Number of marks static const size_type NB_MARKS = 32; diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h index 3b90e193fa29..ca73368b34ab 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h @@ -74,7 +74,7 @@ namespace CGAL { typedef typename Dart_container::size_type size_type; typedef std::nullptr_t Null_descriptor_type; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_descriptor=nullptr; + inline static constexpr Null_descriptor_type null_descriptor=nullptr; using Type_for_compact_container=void*; @@ -128,7 +128,7 @@ namespace CGAL { using Vertex_attribute_handle=Vertex_attribute_descriptor; using Vertex_attribute_const_handle=Vertex_attribute_const_descriptor; - CGAL_CPP17_INLINE static constexpr Null_descriptor_type null_handle=null_descriptor; + inline static constexpr Null_descriptor_type null_handle=null_descriptor; /// Number of marks static const size_type NB_MARKS = 32; diff --git a/STL_Extension/include/CGAL/Named_function_parameters.h b/STL_Extension/include/CGAL/Named_function_parameters.h index 243ed7b4be5e..e48768eaffb4 100644 --- a/STL_Extension/include/CGAL/Named_function_parameters.h +++ b/STL_Extension/include/CGAL/Named_function_parameters.h @@ -540,6 +540,6 @@ namespace boost // For disambiguation using SFINAE BOOST_MPL_HAS_XXX_TRAIT_DEF(CGAL_Named_function_parameters_class) template -CGAL_CPP17_INLINE constexpr bool is_named_function_parameter = has_CGAL_Named_function_parameters_class::value; +inline constexpr bool is_named_function_parameter = has_CGAL_Named_function_parameters_class::value; #endif // CGAL_BOOST_FUNCTION_PARAMS_HPP diff --git a/STL_Extension/include/CGAL/type_traits/is_iterator.h b/STL_Extension/include/CGAL/type_traits/is_iterator.h index f8010ab35b3f..e1b43ac7a046 100644 --- a/STL_Extension/include/CGAL/type_traits/is_iterator.h +++ b/STL_Extension/include/CGAL/type_traits/is_iterator.h @@ -69,7 +69,7 @@ struct is_iterator { }; template -CGAL_CPP17_INLINE constexpr bool is_iterator_v = is_iterator::value; +inline constexpr bool is_iterator_v = is_iterator::value; template struct is_iterator_type @@ -77,7 +77,7 @@ struct is_iterator_type { }; template -CGAL_CPP17_INLINE constexpr bool is_iterator_type_v = is_iterator_type::value; +inline constexpr bool is_iterator_type_v = is_iterator_type::value; template ::value> @@ -91,7 +91,7 @@ struct is_iterator_to { }; template -CGAL_CPP17_INLINE constexpr bool is_iterator_to_v = is_iterator_to::value; +inline constexpr bool is_iterator_to_v = is_iterator_to::value; } // namespace CGAL diff --git a/Stream_support/include/CGAL/IO/helpers.h b/Stream_support/include/CGAL/IO/helpers.h index 36cd5e2a89ce..175f95b189d9 100644 --- a/Stream_support/include/CGAL/IO/helpers.h +++ b/Stream_support/include/CGAL/IO/helpers.h @@ -84,7 +84,7 @@ struct is_Range { }; template -CGAL_CPP17_INLINE constexpr bool is_Range_v = is_Range::value; +inline constexpr bool is_Range_v = is_Range::value; // For polygon meshes template @@ -93,7 +93,7 @@ struct is_Point_set_or_Range_or_Iterator { }; template -CGAL_CPP17_INLINE constexpr bool is_Point_set_or_Range_or_Iterator_v = is_Point_set_or_Range_or_Iterator::value; +inline constexpr bool is_Point_set_or_Range_or_Iterator_v = is_Point_set_or_Range_or_Iterator::value; } // end namespace internal } // end namespace IO From e54408370b2583153dc923884a5ec1587bc7898e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 22:50:53 +0200 Subject: [PATCH 0352/1398] remove CGAL_CXX17 macro ... and no longer used macros --- .../include/CGAL/Combinatorial_map_storages.h | 10 ---------- .../include/CGAL/Generalized_map_storages.h | 11 ----------- Installation/include/CGAL/config.h | 9 ++------- .../CGAL/CMap_linear_cell_complex_storages.h | 11 ----------- .../CGAL/GMap_linear_cell_complex_storages.h | 12 ------------ Matrix_search/include/CGAL/Cartesian_matrix.h | 4 ---- Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 14 -------------- 7 files changed, 2 insertions(+), 69 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h index 3754a4439d4b..7c505ea51657 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h @@ -467,16 +467,6 @@ namespace CGAL { typename Helper::Attribute_containers mattribute_containers; }; -#ifndef CGAL_CXX17 - template - constexpr typename Combinatorial_map_storage_1::Null_descriptor_type - Combinatorial_map_storage_1::null_descriptor; - - template - constexpr typename Combinatorial_map_storage_1::Null_descriptor_type - Combinatorial_map_storage_1::null_handle; -#endif - } // namespace CGAL #if defined(BOOST_GCC) diff --git a/Generalized_map/include/CGAL/Generalized_map_storages.h b/Generalized_map/include/CGAL/Generalized_map_storages.h index d14cc8ea17c5..4f40c0a922cc 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages.h @@ -457,17 +457,6 @@ namespace CGAL { /// Tuple of attributes containers typename Helper::Attribute_containers mattribute_containers; }; - -#ifndef CGAL_CXX17 - template - constexpr typename Generalized_map_storage_1::Null_descriptor_type - Generalized_map_storage_1::null_descriptor; - - template - constexpr typename Generalized_map_storage_1::Null_descriptor_type - Generalized_map_storage_1::null_handle; -#endif - } // namespace CGAL #if defined(BOOST_GCC) diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index d48250f1dc13..0286ae133c10 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -36,11 +36,6 @@ # define WIN64 #endif -#ifdef _MSC_VER -#define _SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING 1 -#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING 1 -#endif - #ifdef CGAL_INCLUDE_WINDOWS_DOT_H // Mimic users including this file which defines min max macros // and other names leading to name clashes @@ -147,8 +142,8 @@ #endif // Same for C++17 -#if __cplusplus >= 201703L || _MSVC_LANG >= 201703L -# define CGAL_CXX17 1 +#if !(__cplusplus >= 201703L || _MSVC_LANG >= 201703L) +#error "CGAL requires C++ 17" #endif // Same for C++20 #if __cplusplus >= 202002L || _MSVC_LANG >= 202002L diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h index 6e6884ecbcf1..1ec9a1d66af1 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h @@ -502,17 +502,6 @@ namespace CGAL { typename Helper::Attribute_containers mattribute_containers; }; -#ifndef CGAL_CXX17 - template - constexpr typename CMap_linear_cell_complex_storage_1::Null_descriptor_type - CMap_linear_cell_complex_storage_1::null_descriptor; - - template - constexpr typename CMap_linear_cell_complex_storage_1::Null_descriptor_type - CMap_linear_cell_complex_storage_1::null_handle; -#endif } // namespace CGAL #if defined(BOOST_GCC) diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h index ca73368b34ab..c2331a6acfb8 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h @@ -493,18 +493,6 @@ namespace CGAL { typename Helper::Attribute_containers mattribute_containers; }; -#ifndef CGAL_CXX17 - template - constexpr typename GMap_linear_cell_complex_storage_1::Null_descriptor_type - GMap_linear_cell_complex_storage_1::null_descriptor; - - template - constexpr typename GMap_linear_cell_complex_storage_1::Null_descriptor_type - GMap_linear_cell_complex_storage_1::null_handle; -#endif - } // namespace CGAL #if defined(BOOST_GCC) diff --git a/Matrix_search/include/CGAL/Cartesian_matrix.h b/Matrix_search/include/CGAL/Cartesian_matrix.h index 1aa192ab2c85..be3dba778b4e 100644 --- a/Matrix_search/include/CGAL/Cartesian_matrix.h +++ b/Matrix_search/include/CGAL/Cartesian_matrix.h @@ -28,11 +28,7 @@ template < class Operation, class Cartesian_matrix { public: -#if CGAL_CXX17 && __has_cpp_attribute(nodiscard) typedef typename std::invoke_result::value_type, typename std::iterator_traits::value_type>::type Value; -#else - typedef typename Operation::result_type Value; -#endif Cartesian_matrix(RandomAccessIC_row r_f, RandomAccessIC_row r_l, diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index 8e86644477bc..6a812e5581b6 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -1572,17 +1572,10 @@ class C3T3_helpers Cell_vector c3t3_cells(const Cell_vector& cells) const { Cell_vector c3t3_cells; -#ifdef CGAL_CXX17 std::remove_copy_if(cells.begin(), cells.end(), std::back_inserter(c3t3_cells), std::not_fn(Is_in_c3t3(c3t3_))); -#else - std::remove_copy_if(cells.begin(), - cells.end(), - std::back_inserter(c3t3_cells), - std::not1(Is_in_c3t3(c3t3_)) ); -#endif return c3t3_cells; } @@ -3665,17 +3658,10 @@ incident_slivers(const Vertex_handle& v, std::vector incident_cells_; tr_.incident_cells(v, std::back_inserter(incident_cells_)); -#ifdef CGAL_CXX17 std::remove_copy_if(incident_cells_.begin(), incident_cells_.end(), out, std::not_fn(Is_sliver(c3t3_, criterion, sliver_bound))); -#else - std::remove_copy_if(incident_cells_.begin(), - incident_cells_.end(), - out, - std::not1(Is_sliver(c3t3_,criterion,sliver_bound))); -#endif return out; } From c8a88b9014607bde800dbbe9fa0e3e92b6003dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 22:55:14 +0200 Subject: [PATCH 0353/1398] remove CGAL_static_assertion* --- .../internal/AABB_ray_intersection.h | 2 +- ...bb_test_is_ray_intersection_geomtraits.cpp | 8 +-- .../Algebraic_foundations/fraction_traits.cpp | 4 +- .../Algebraic_foundations/interoperable.cpp | 2 +- .../include/CGAL/Algebraic_structure_traits.h | 2 +- .../include/CGAL/Coercion_traits.h | 2 +- .../include/CGAL/Scalar_factor_traits.h | 4 +- .../CGAL/Test/_test_algebraic_structure.h | 52 +++++++++---------- .../include/CGAL/Test/_test_coercion_traits.h | 8 +-- .../include/CGAL/Test/_test_fraction_traits.h | 10 ++-- .../include/CGAL/Test/_test_rational_traits.h | 2 +- .../include/CGAL/Test/_test_real_embeddable.h | 16 +++--- .../Algebraic_extension_traits.cpp | 24 ++++----- .../Algebraic_structure_traits.cpp | 10 ++-- .../Algebraic_foundations/Coercion_traits.cpp | 14 ++--- .../Real_embeddable_traits.cpp | 6 +-- .../Scalar_factor_traits.cpp | 14 ++--- .../Algebraic_curve_kernel_2.h | 12 ++--- .../Algebraic_kernel_d/Algebraic_real_d_1.h | 2 +- .../algebraic_curve_kernel_2_tools.h | 6 +-- .../Real_embeddable_traits_extension.cpp | 16 +++--- .../CGAL/_test_algebraic_curve_kernel_2.h | 8 +-- .../include/CGAL/_test_algebraic_kernel_1.h | 10 ++-- .../include/CGAL/_test_algebraic_kernel_2.h | 16 +++--- .../include/CGAL/_test_real_comparable.h | 16 +++--- Alpha_shapes_2/include/CGAL/Alpha_shape_2.h | 6 +-- .../Alpha_shapes_2/internal/Lazy_alpha_nt_2.h | 4 +- Alpha_shapes_3/include/CGAL/Alpha_shape_3.h | 6 +-- .../Alpha_shapes_3/internal/Lazy_alpha_nt_3.h | 4 +- .../CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h | 2 +- .../internal/Triangle_mesh_oracle.h | 2 +- .../internal/Triangle_soup_oracle.h | 2 +- .../Get_arithmetic_kernel.cpp | 6 +-- .../Arr_bounded_planar_topology_traits_2.h | 8 +-- .../include/CGAL/Arr_dcel_base.h | 2 +- .../include/CGAL/Arr_overlay_2.h | 8 +-- .../CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h | 4 +- .../CGAL/Arr_rat_arc/Rational_arc_d_1.h | 4 +- .../CGAL/Arr_spherical_topology_traits_2.h | 8 +-- .../CGAL/Arr_unb_planar_topology_traits_2.h | 8 +-- .../include/CGAL/Arrangement_on_surface_2.h | 2 +- .../include/CGAL/Arrangement_zone_2.h | 2 +- .../Arrangement_on_surface_2/test_tags.cpp | 16 +++--- .../graph/IO/Generic_facegraph_builder.h | 4 +- BGL/test/BGL/test_Has_member_clear.cpp | 8 +-- BGL/test/BGL/test_Has_member_id.cpp | 18 +++---- .../Gps_agg_meta_traits.h | 8 +-- .../Gps_traits_decorator.h | 8 +-- .../include/CGAL/box_intersection_d.h | 2 +- .../test_Has_member_report.cpp | 6 +-- Circulator/include/CGAL/circulator.h | 14 ++--- .../ETHZ/internal/random-forest/forest.hpp | 2 +- .../Classification/Local_eigen_analysis.h | 6 +-- .../Sum_of_weighted_features_classifier.h | 2 +- .../include/CGAL/Cell_iterators.h | 6 +-- .../include/CGAL/Combinatorial_map.h | 32 ++++++------ .../Combinatorial_map_group_functors.h | 50 +++++++++--------- .../Combinatorial_map_internal_functors.h | 8 +-- .../CGAL/Combinatorial_map_basic_operations.h | 8 +-- .../CGAL/Combinatorial_map_iterators_base.h | 6 +-- .../CGAL/Combinatorial_map_operations.h | 4 +- .../include/CGAL/Combinatorial_map_storages.h | 6 +-- .../Combinatorial_map_storages_with_index.h | 6 +-- Combinatorial_map/include/CGAL/Dart.h | 4 +- .../include/CGAL/Dart_iterators.h | 18 +++---- .../quick_hull_default_traits.cpp | 14 ++--- .../include/CGAL/GMap_cell_iterators.h | 4 +- .../include/CGAL/GMap_dart_iterators.h | 12 ++--- .../include/CGAL/Generalized_map.h | 32 ++++++------ .../internal/Generalized_map_group_functors.h | 28 +++++----- .../CGAL/Generalized_map_iterators_base.h | 2 +- .../include/CGAL/Generalized_map_operations.h | 4 +- .../include/CGAL/Generalized_map_storages.h | 6 +-- .../Generalized_map_storages_with_index.h | 6 +-- .../Surface_mesh_geodesic_distances_3.h | 2 +- .../internal/deprecation_warning.h | 2 +- .../Installation/test_configuration_qt5.cpp | 2 +- .../include/CGAL/Intersection_traits.h | 4 +- .../internal/Bbox_3_Segment_3_do_intersect.h | 2 +- .../Test/_test_bigfloat_interval_traits.h | 2 +- .../include/CGAL/Test/_test_convert_to_bfi.h | 2 +- .../include/CGAL/Test/_test_interval_traits.h | 6 +-- Kernel_23/include/CGAL/Circle_2.h | 2 +- Kernel_23/include/CGAL/Circle_3.h | 2 +- Kernel_23/include/CGAL/Direction_2.h | 2 +- Kernel_23/include/CGAL/Direction_3.h | 2 +- Kernel_23/include/CGAL/Has_conversion.h | 4 +- Kernel_23/include/CGAL/Iso_cuboid_3.h | 2 +- Kernel_23/include/CGAL/Iso_rectangle_2.h | 2 +- Kernel_23/include/CGAL/Line_2.h | 2 +- Kernel_23/include/CGAL/Line_3.h | 2 +- Kernel_23/include/CGAL/Plane_3.h | 2 +- Kernel_23/include/CGAL/Point_2.h | 2 +- Kernel_23/include/CGAL/Point_3.h | 2 +- Kernel_23/include/CGAL/Ray_2.h | 2 +- Kernel_23/include/CGAL/Ray_3.h | 2 +- Kernel_23/include/CGAL/Segment_2.h | 2 +- Kernel_23/include/CGAL/Segment_3.h | 2 +- Kernel_23/include/CGAL/Sphere_3.h | 2 +- Kernel_23/include/CGAL/Tetrahedron_3.h | 2 +- Kernel_23/include/CGAL/Triangle_2.h | 2 +- Kernel_23/include/CGAL/Triangle_3.h | 2 +- Kernel_23/include/CGAL/Vector_2.h | 2 +- Kernel_23/include/CGAL/Vector_3.h | 2 +- Kernel_23/include/CGAL/Weighted_point_2.h | 2 +- Kernel_23/include/CGAL/Weighted_point_3.h | 2 +- .../include/CGAL/_test_cls_point_2.h | 4 +- .../include/CGAL/_test_cls_point_3.h | 4 +- .../CGAL/CMap_linear_cell_complex_storages.h | 6 +-- ..._linear_cell_complex_storages_with_index.h | 6 +-- .../CGAL/GMap_linear_cell_complex_storages.h | 6 +-- ..._linear_cell_complex_storages_with_index.h | 6 +-- .../include/CGAL/Linear_cell_complex_base.h | 2 +- .../CGAL/Linear_cell_complex_constructors.h | 2 +- .../CGAL/Linear_cell_complex_operations.h | 6 +-- .../include/CGAL/Compact_mesh_cell_base_3.h | 2 +- Mesh_3/include/CGAL/Mesh_criteria_3.h | 4 +- Mesh_3/test/Mesh_3/test_meshing_3D_image.cpp | 2 +- .../test_meshing_3D_image_deprecated.cpp | 2 +- .../test_meshing_3D_image_with_features.cpp | 2 +- .../test/Mesh_3/test_meshing_polyhedron.cpp | 2 +- Nef_2/include/CGAL/Nef_2/PM_overlayer.h | 2 +- .../CGAL/NewKernel_d/Kernel_d_interface.h | 4 +- .../include/CGAL/NewKernel_d/Vector/array.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Hyperplane_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Point_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Ref_count_obj.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Segment_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Sphere_d.h | 2 +- .../CGAL/NewKernel_d/Wrapper/Vector_d.h | 2 +- NewKernel_d/test/NewKernel_d/Epick_d.cpp | 10 ++-- Number_types/include/CGAL/Lazy_exact_nt.h | 4 +- Number_types/include/CGAL/Mpzf.h | 6 +-- Number_types/include/CGAL/Root_of_traits.h | 2 +- .../include/CGAL/Test/test_root_of_traits.h | 12 ++--- Number_types/include/CGAL/mpq_class.h | 2 +- Number_types/include/CGAL/mpz_class.h | 2 +- .../CGAL/simplest_rational_in_interval.h | 4 +- Number_types/include/CGAL/to_rational.h | 4 +- .../test/Number_types/Lazy_exact_nt_new.cpp | 10 ++-- .../test/Number_types/Quotient_new.cpp | 6 +-- .../test/Number_types/Sqrt_extension.h | 8 +-- .../include/CGAL/Test/test_root_of_2_traits.h | 6 +-- Number_types/test/Number_types/ioformat.cpp | 4 +- .../Number_types/known_bit_size_integers.cpp | 16 +++--- .../Number_types/test_nt_Coercion_traits.cpp | 14 ++--- .../internal/optimize_2.h | 2 +- .../oriented_bounding_box.h | 4 +- .../compute_registration_transformation.h | 4 +- .../include/CGAL/OpenGR/register_point_sets.h | 4 +- .../include/CGAL/cluster_point_set.h | 2 +- .../include/CGAL/jet_estimate_normals.h | 2 +- .../include/CGAL/jet_smooth_point_set.h | 2 +- .../compute_registration_transformation.h | 6 +-- .../include/CGAL/structure_point_set.h | 2 +- .../CGAL/Polygon_mesh_processing/clip.h | 2 +- .../connected_components.h | 2 +- .../Polygon_mesh_processing/corefinement.h | 4 +- .../CGAL/Polygon_mesh_processing/distance.h | 8 +-- .../CGAL/Polygon_mesh_processing/fair.h | 4 +- .../intersect_triangle_and_segment_3.h | 2 +- .../Corefinement/intersection_nodes.h | 6 +-- .../intersection_of_coplanar_triangles_3.h | 2 +- .../internal/Snapping/snap.h | 2 +- .../internal/Snapping/snap_vertices.h | 6 +-- .../Polygon_mesh_processing/intersection.h | 8 +-- .../CGAL/Polygon_mesh_processing/locate.h | 4 +- .../CGAL/Polygon_mesh_processing/measure.h | 2 +- .../orient_polygon_soup_extension.h | 8 +-- .../polygon_mesh_to_polygon_soup.h | 2 +- .../polygon_soup_to_polygon_mesh.h | 6 +-- .../repair_self_intersections.h | 2 +- .../self_intersections.h | 2 +- .../Polygon_mesh_processing/smooth_shape.h | 4 +- .../Rigid_triangle_mesh_collision_detection.h | 4 +- .../Polyhedral_envelope_filter.h | 2 +- .../test_pmp_locate.cpp | 4 +- Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h | 2 +- Polynomial/include/CGAL/Exponent_vector.h | 2 +- .../Polynomial/Algebraic_structure_traits.h | 2 +- .../include/CGAL/Polynomial/Polynomial_type.h | 2 +- .../include/CGAL/Polynomial/subresultants.h | 2 +- Polynomial/include/CGAL/Polynomial_traits_d.h | 4 +- .../CGAL/Test/_test_polynomial_traits_d.h | 48 ++++++++--------- .../Polynomial/Polynomial_type_generator.cpp | 6 +-- Polynomial/test/Polynomial/test_polynomial.h | 6 +-- .../test_polynomial_Coercion_traits.cpp | 2 +- .../test_polynomial_Get_arithmetic_kernel.cpp | 4 +- Ridges_3/include/CGAL/Ridges.h | 8 +-- Ridges_3/include/CGAL/Umbilics.h | 8 +-- .../include/CGAL/Handle_with_policy.h | 8 +-- .../include/CGAL/Named_function_parameters.h | 6 +-- STL_Extension/include/CGAL/assertions.h | 6 --- STL_Extension/include/CGAL/for_each.h | 4 +- STL_Extension/include/CGAL/iterator.h | 2 +- .../include/CGAL/transforming_pair_iterator.h | 2 +- .../test/STL_Extension/test_Cache.cpp | 12 ++--- .../STL_Extension/test_Compact_container.cpp | 2 +- .../STL_Extension/test_cgal_named_params.cpp | 20 +++---- .../test/STL_Extension/test_is_iterator.cpp | 22 ++++---- .../test/STL_Extension/test_is_streamable.cpp | 16 +++--- .../test/STL_Extension/test_stl_extension.cpp | 18 +++---- .../Weighted_PCA_smoother.h | 2 +- .../Shape_regularization/regularize_planes.h | 2 +- .../include/CGAL/Snap_rounding_kd_2.h | 2 +- Spatial_searching/include/CGAL/Kd_tree.h | 2 +- .../include/CGAL/Hilbert_sort_median_2.h | 2 +- .../include/CGAL/Hilbert_sort_median_3.h | 2 +- .../test/Stream_support/test_ioformat.cpp | 4 +- .../ARAP_parameterizer_3.h | 2 +- .../Fixed_border_parameterizer_3.h | 2 +- .../Orbifold_Tutte_parameterizer_3.h | 2 +- .../Bounded_distance_placement.h | 2 +- .../Edge_collapse/FastEnvelope_filter.h | 2 +- .../CGAL/Surface_mesher/Combining_oracle.h | 2 +- .../CGAL/No_intersection_surface_sweep_2.h | 2 +- .../CGAL/Triangulation_data_structure_3.h | 2 +- .../include/CGAL/Triangulation_2_to_lcc.h | 2 +- .../include/CGAL/Triangulation_3_to_lcc.h | 2 +- .../CGAL/Delaunay_triangulation_on_sphere_2.h | 4 +- .../internal/arc_on_sphere_2_subsampling.h | 2 +- 221 files changed, 658 insertions(+), 664 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h index e738302d5331..ff091ce6c24b 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h @@ -201,7 +201,7 @@ template boost::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > AABB_tree::first_intersection(const Ray& query, const SkipFunctor& skip) const { - CGAL_static_assertion_msg((std::is_same::value), + static_assert((std::is_same::value), "Ray and Ray_3 must be the same type"); switch(size()) // copy-paste from AABB_tree::traversal diff --git a/AABB_tree/test/AABB_tree/aabb_test_is_ray_intersection_geomtraits.cpp b/AABB_tree/test/AABB_tree/aabb_test_is_ray_intersection_geomtraits.cpp index c7198fe98e01..35612dc8ded1 100644 --- a/AABB_tree/test/AABB_tree/aabb_test_is_ray_intersection_geomtraits.cpp +++ b/AABB_tree/test/AABB_tree/aabb_test_is_ray_intersection_geomtraits.cpp @@ -26,16 +26,16 @@ int main() { using namespace CGAL::internal::AABB_tree; - CGAL_static_assertion_msg( + static_assert( (Is_ray_intersection_geomtraits::value), "CGAL::Epeck should be a RayIntersectionGeomTraits"); - CGAL_static_assertion_msg( + static_assert( (Is_ray_intersection_geomtraits< CGAL::Simple_cartesian >::value), "CGAL::Epeck should be a RayIntersectionGeomTraits"); - CGAL_static_assertion_msg( + static_assert( (!Is_ray_intersection_geomtraits::value), "Pure AABBGeomTraits shouldn't be a RayIntersectionGeomTraits"); - CGAL_static_assertion_msg( + static_assert( (!Is_ray_intersection_geomtraits::value), "The empty struct shouldn't be a RayIntersectionGeomTraits"); diff --git a/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp index 1bd5f4bd02a2..42c1e8d92883 100644 --- a/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp +++ b/Algebraic_foundations/examples/Algebraic_foundations/fraction_traits.cpp @@ -9,8 +9,8 @@ int main(){ typedef FT::Numerator_type Numerator_type; typedef FT::Denominator_type Denominator_type; - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); Numerator_type numerator; Denominator_type denominator; diff --git a/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp b/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp index abf8265a837b..0963f5f9d368 100644 --- a/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp +++ b/Algebraic_foundations/examples/Algebraic_foundations/interoperable.cpp @@ -9,7 +9,7 @@ binary_func(const A& a , const B& b){ typedef CGAL::Coercion_traits CT; // check for explicit interoperability - CGAL_static_assertion((CT::Are_explicit_interoperable::value)); + static_assert((CT::Are_explicit_interoperable::value)); // CT::Cast is used to to convert both types into the coercion type typename CT::Cast cast; diff --git a/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h b/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h index cdfca7309769..a632e12a1972 100644 --- a/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h +++ b/Algebraic_foundations/include/CGAL/Algebraic_structure_traits.h @@ -353,7 +353,7 @@ class Algebraic_structure_traits_base< Type_, typedef Coercion_traits< NT1, NT2 > CT; typedef typename CT::Type Coercion_type_NT1_NT2; CGAL_USE_TYPE(Coercion_type_NT1_NT2); - CGAL_static_assertion(( + static_assert(( ::std::is_same::value)); typename Coercion_traits< NT1, NT2 >::Cast cast; diff --git a/Algebraic_foundations/include/CGAL/Coercion_traits.h b/Algebraic_foundations/include/CGAL/Coercion_traits.h index 14acb431c7c2..09c387b5a092 100644 --- a/Algebraic_foundations/include/CGAL/Coercion_traits.h +++ b/Algebraic_foundations/include/CGAL/Coercion_traits.h @@ -35,7 +35,7 @@ #define CGAL_IMPLICIT_INTEROPERABLE_BINARY_OPERATOR_WITH_RT( NT, Result_type ) \ template < class CT_Type_1, class CT_Type_2 > \ Result_type operator()( const CT_Type_1& x, const CT_Type_2& y ) const { \ - CGAL_static_assertion((::std::is_same< \ + static_assert((::std::is_same< \ typename Coercion_traits< CT_Type_1, CT_Type_2 >::Type, NT \ >::value)); \ \ diff --git a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h index db6b3df845d0..2d7840511976 100644 --- a/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h +++ b/Algebraic_foundations/include/CGAL/Scalar_factor_traits.h @@ -85,13 +85,13 @@ class Scalar_factor_traits { // determine extractable scalar factor Scalar operator () (const NT& a) { - CGAL_static_assertion(( ::std::is_same< NT,Scalar >::value)); + static_assert(( ::std::is_same< NT,Scalar >::value)); typedef typename Algebraic_structure_traits::Algebraic_category SAT; return scalar_factor(a, SAT()); } // determine extractable scalar factor Scalar operator () (const NT& a, const Scalar& d) { - CGAL_static_assertion(( ::std::is_same< NT,Scalar >::value)); + static_assert(( ::std::is_same< NT,Scalar >::value)); typedef typename Algebraic_structure_traits::Algebraic_category SAT; return scalar_factor(a,d,SAT()); } diff --git a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h index 5a5e23c7d8fc..68970af7441c 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_algebraic_structure.h @@ -44,7 +44,7 @@ template void check_result_type(AdaptableFunctor, ResultType){ typedef typename AdaptableFunctor::result_type result_type; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); CGAL_USE_TYPE(result_type); } // check nothing for CGAL::Null_functor @@ -122,12 +122,12 @@ void test_algebraic_structure_intern( const CGAL::Integral_domain_tag& ) { CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - CGAL_static_assertion( + static_assert( (!::std::is_same< Integral_division, Null_functor >::value)); - CGAL_static_assertion((!::std::is_same< Divides, Null_functor >::value)); - CGAL_static_assertion((!::std::is_same< Is_zero, Null_functor >::value)); - CGAL_static_assertion((!::std::is_same< Is_one, Null_functor >::value)); - CGAL_static_assertion((!::std::is_same< Square, Null_functor >::value)); + static_assert((!::std::is_same< Divides, Null_functor >::value)); + static_assert((!::std::is_same< Is_zero, Null_functor >::value)); + static_assert((!::std::is_same< Is_one, Null_functor >::value)); + static_assert((!::std::is_same< Square, Null_functor >::value)); // functor const Is_zero is_zero = Is_zero(); @@ -206,7 +206,7 @@ void test_algebraic_structure_intern( CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - CGAL_static_assertion((!::std::is_same< Gcd, Null_functor>::value)); + static_assert((!::std::is_same< Gcd, Null_functor>::value)); const Gcd gcd = Gcd(); assert( gcd( AS ( 0), AS ( 0)) == unit_normal( AS (0) ) ); @@ -268,9 +268,9 @@ void test_algebraic_structure_intern( const CGAL::Euclidean_ring_tag&) { CGAL_SNAP_AST_FUNCTORS(AST); using CGAL::Null_functor; - CGAL_static_assertion((!::std::is_same< Div, Null_functor>::value)); - CGAL_static_assertion((!::std::is_same< Mod, Null_functor>::value)); - CGAL_static_assertion((!::std::is_same< Div_mod, Null_functor>::value)); + static_assert((!::std::is_same< Div, Null_functor>::value)); + static_assert((!::std::is_same< Mod, Null_functor>::value)); + static_assert((!::std::is_same< Div_mod, Null_functor>::value)); const Div div=Div(); const Mod mod=Mod(); @@ -387,7 +387,7 @@ void test_algebraic_structure_intern( const CGAL::Field_with_sqrt_tag& ) { CGAL_SNAP_AST_FUNCTORS(AST); - CGAL_static_assertion((!::std::is_same< Sqrt, Null_functor>::value)); + static_assert((!::std::is_same< Sqrt, Null_functor>::value)); const Sqrt sqrt =Sqrt(); AS a(4); @@ -613,11 +613,11 @@ class Test_is_square { CGAL_USE_TYPE(First_argument_type); CGAL_USE_TYPE(Second_argument_type); - CGAL_static_assertion( + static_assert( ( ::std::is_same< AS , First_argument_type>::value)); - CGAL_static_assertion( + static_assert( ( ::std::is_same< AS& , Second_argument_type>::value)); - //CGAL_static_assertion(( ::std::is_same< bool , Result_type>::value)); + //static_assert(( ::std::is_same< bool , Result_type>::value)); bool b = Result_type(true); CGAL_USE(b); AS test_number = AS(3)*AS(3); @@ -649,8 +649,8 @@ class Test_sqrt { typedef typename Sqrt::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion(( ::std::is_same< AS , Argument_type>::value)); - CGAL_static_assertion(( ::std::is_same< AS , Result_type>::value)); + static_assert(( ::std::is_same< AS , Argument_type>::value)); + static_assert(( ::std::is_same< AS , Result_type>::value)); typedef Algebraic_structure_traits AST; typedef typename AST::Is_exact Is_exact; assert( !Is_exact::value || AS (3) == sqrt( AS (9))); @@ -675,11 +675,11 @@ class Test_root { CGAL_USE_TYPE(First_argument_type); CGAL_USE_TYPE(Second_argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion( + static_assert( ( ::std::is_same::value)); - CGAL_static_assertion( + static_assert( ( ::std::is_same< AS , Second_argument_type>::value)); - CGAL_static_assertion( + static_assert( ( ::std::is_same< AS , Result_type>::value)); AS epsilon(1); assert( test_equality_epsilon( AS (2), @@ -803,7 +803,7 @@ void test_algebraic_structure(){ typedef CGAL::Algebraic_structure_traits< AS > AST; CGAL_SNAP_AST_FUNCTORS(AST); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef typename AST::Boolean Boolean; assert(!Boolean()); @@ -816,14 +816,14 @@ void test_algebraic_structure(){ using CGAL::Integral_domain_without_division_tag; using CGAL::Null_functor; // Test for desired exactness - CGAL_static_assertion( + static_assert( ( ::std::is_same< typename AST::Is_exact, Is_exact >::value)); - CGAL_static_assertion(( ::boost::is_convertible< Tag, + static_assert(( ::boost::is_convertible< Tag, Integral_domain_without_division_tag >::value )); - CGAL_static_assertion(( ::std::is_same< Tag, Algebraic_category>::value)); - CGAL_static_assertion((!::std::is_same< Simplify, Null_functor>::value)); - CGAL_static_assertion((!::std::is_same< Unit_part, Null_functor>::value)); + static_assert(( ::std::is_same< Tag, Algebraic_category>::value)); + static_assert((!::std::is_same< Simplify, Null_functor>::value)); + static_assert((!::std::is_same< Unit_part, Null_functor>::value)); const Simplify simplify=Simplify();; const Unit_part unit_part= Unit_part(); @@ -943,7 +943,7 @@ void test_algebraic_structure( const AS & a, const AS & b, const AS & c) { typedef CGAL::Algebraic_structure_traits AST; typedef typename AST::Is_numerical_sensitive Is_numerical_sensitive; - CGAL_static_assertion( + static_assert( !(::std::is_same::value)); CGAL_USE_TYPE(Is_numerical_sensitive); } diff --git a/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h index 0caa6ced04ed..fab14e92e981 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_coercion_traits.h @@ -326,7 +326,7 @@ void test_implicit_interoperable_one_way() { typedef typename CT::Type C; typedef typename CT::Are_implicit_interoperable Are_implicit_interoperable; - CGAL_static_assertion( + static_assert( (::std::is_same::value)); assert((::std::is_same::value)); @@ -346,9 +346,9 @@ void test_explicit_interoperable_one_way(){ typedef typename CT::Cast Cast; typedef typename Cast::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); + static_assert((::std::is_same::value)); typename CT::Cast cast; A a(3); diff --git a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h index e1aa91eb29dd..c12411757b2f 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_fraction_traits.h @@ -37,11 +37,11 @@ void test_fraction_traits(){ typedef typename FT::Compose Compose; CGAL_USE_TYPE(Is_fraction); - CGAL_static_assertion( (::std::is_same::value)); - CGAL_static_assertion( (::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); + static_assert( (::std::is_same::value)); + static_assert( (::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); // Decompose diff --git a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h index 5efda40bc2f0..26dce67e619b 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_rational_traits.h @@ -29,7 +29,7 @@ void test_rational_traits(){ typedef Rational_traits Rational_traits; typedef typename Rational_traits::RT RT; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); assert( Rational_traits().numerator(x) == RT(7)); assert( Rational_traits().denominator(x) == RT(2)); diff --git a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h index bb67e3f57a53..1f7e818d2d36 100644 --- a/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h +++ b/Algebraic_foundations/include/CGAL/Test/_test_real_embeddable.h @@ -48,9 +48,9 @@ namespace CGAL { void operator() (const ToDouble& to_double) { typedef typename ToDouble::argument_type Argument_type; typedef typename ToDouble::result_type Result_type; - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); CGAL_USE_TYPE(Argument_type); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); CGAL_USE_TYPE(Result_type); assert(42.0 == to_double(Type(42))); } @@ -71,9 +71,9 @@ namespace CGAL { typedef typename To_interval::argument_type Argument_type; typedef typename To_interval::result_type Result_type; typedef std::pair Interval_type; - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); CGAL_USE_TYPE(Argument_type); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); CGAL_USE_TYPE(Result_type); CGAL_USE_TYPE(Interval_type); // assert(NiX::in(42.0,to_Interval(Type(42)))); @@ -139,7 +139,7 @@ void test_real_embeddable() { CGAL_SNAP_RET_FUNCTORS(RET); typedef typename RET::Is_real_embeddable Is_real_embeddable; using CGAL::Tag_true; - CGAL_static_assertion(( ::std::is_same< Is_real_embeddable, Tag_true>::value)); + static_assert(( ::std::is_same< Is_real_embeddable, Tag_true>::value)); CGAL_USE_TYPE(Is_real_embeddable); typedef typename RET::Boolean Boolean; @@ -246,7 +246,7 @@ void test_not_real_embeddable() { typedef CGAL::Real_embeddable_traits RET; typedef typename RET::Is_real_embeddable Is_real_embeddable; using CGAL::Tag_false; - CGAL_static_assertion(( ::std::is_same< Is_real_embeddable, Tag_false>::value)); + static_assert(( ::std::is_same< Is_real_embeddable, Tag_false>::value)); CGAL_USE_TYPE(Is_real_embeddable); } @@ -254,13 +254,13 @@ void test_not_real_embeddable() { //template //void test_rounded_log2_abs(Type zero, CGAL::Null_functor, CeilLog2Abs) { // typedef CGAL::Null_functor Null_functor; -// CGAL_static_assertion(( ::std::is_same< CeilLog2Abs, Null_functor>::value)); +// static_assert(( ::std::is_same< CeilLog2Abs, Null_functor>::value)); //} // //template //void test_rounded_log2_abs(Type zero, FloorLog2Abs fl_log, CeilLog2Abs cl_log) { // typedef CGAL::Null_functor Null_functor; -// CGAL_static_assertion((!::std::is_same< CeilLog2Abs, Null_functor>::value)); +// static_assert((!::std::is_same< CeilLog2Abs, Null_functor>::value)); // // assert( fl_log(Type( 7)) == 2 ); // assert( cl_log(Type( 7)) == 3 ); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp index 87e5235cfe1c..03ee581bcbfa 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_extension_traits.cpp @@ -9,21 +9,21 @@ int main(){ typedef AET::Type Type; CGAL_USE_TYPE(Type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef AET::Is_extended Is_extended; CGAL_USE_TYPE(Is_extended); - CGAL_static_assertion( + static_assert( (::std::is_same::value)); typedef AET::Normalization_factor Normalization_factor; { typedef Normalization_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef Normalization_factor::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); Normalization_factor nfac; assert(nfac(3)==1); } @@ -31,10 +31,10 @@ int main(){ { typedef DFAI::argument_type argument_type; CGAL_USE_TYPE(argument_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef DFAI::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); DFAI dfai; assert(dfai(3)==1); } @@ -45,21 +45,21 @@ int main(){ typedef AET::Type Type; CGAL_USE_TYPE(Type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef AET::Is_extended Is_extended; CGAL_USE_TYPE(Is_extended); - CGAL_static_assertion( + static_assert( (::std::is_same::value)); typedef AET::Normalization_factor Normalization_factor; { typedef Normalization_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef Normalization_factor::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); Normalization_factor nfac; assert(nfac(EXT(3))==1); assert(nfac(EXT(3,0,5))==1); @@ -69,10 +69,10 @@ int main(){ { typedef DFAI::argument_type argument_type; CGAL_USE_TYPE(argument_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef DFAI::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); DFAI dfai; assert(dfai(EXT(3))==1); assert(dfai(EXT(3,0,5))==1); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp index bc1e4b85bb09..f8cb5910ce1e 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Algebraic_structure_traits.cpp @@ -7,7 +7,7 @@ { \ typedef AST::NAME NAME; \ CGAL_USE_TYPE(NAME); \ - CGAL_static_assertion( \ + static_assert( \ (::std::is_same::value)); \ } @@ -16,19 +16,19 @@ int main(){ typedef AST::Type Type; CGAL_USE_TYPE(Type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef AST::Algebraic_category Algebraic_category; CGAL_USE_TYPE(Algebraic_category); - CGAL_static_assertion( + static_assert( (::std::is_same::value)); typedef AST::Is_exact Is_exact; CGAL_USE_TYPE(Is_exact); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef AST::Is_numerical_sensitive Is_sensitive; CGAL_USE_TYPE(Is_sensitive); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); CGAL_IS_AST_NULL_FUNCTOR ( Simplify); CGAL_IS_AST_NULL_FUNCTOR ( Unit_part); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp index 7deecf693cc1..7fcb803e94c4 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Coercion_traits.cpp @@ -6,22 +6,22 @@ int main(){ { typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); - CGAL_static_assertion(( std::is_same::value)); - CGAL_static_assertion( + static_assert(( std::is_same::value)); + static_assert( ( std::is_same::value)); - CGAL_static_assertion( + static_assert( ( std::is_same::value)); assert( 5 == CT::Cast()(5)); } { typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); -// CGAL_static_assertion(( std::is_same::value)); - CGAL_static_assertion( +// static_assert(( std::is_same::value)); + static_assert( ( std::is_same::value)); - CGAL_static_assertion( + static_assert( ( std::is_same::value)); - CGAL_static_assertion( + static_assert( ( std::is_same::value)); } } diff --git a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp index f9288c9eefd4..3d03fb37e388 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Real_embeddable_traits.cpp @@ -7,7 +7,7 @@ { \ typedef RET::NAME NAME; \ CGAL_USE_TYPE(NAME); \ - CGAL_static_assertion( \ + static_assert( \ (::std::is_same::value)); \ } @@ -16,11 +16,11 @@ int main(){ typedef RET::Type Type; CGAL_USE_TYPE(Type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef RET::Is_real_embeddable Is_real_embeddable; CGAL_USE_TYPE(Is_real_embeddable); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); CGAL_IS_RET_NULL_FUNCTOR(Abs); CGAL_IS_RET_NULL_FUNCTOR(Sgn); diff --git a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp index b2b6ffd0bf3a..af4cc52c0d60 100644 --- a/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp +++ b/Algebraic_foundations/test/Algebraic_foundations/Scalar_factor_traits.cpp @@ -7,32 +7,32 @@ int main(){ typedef CGAL::Scalar_factor_traits SFT; CGAL_USE_TYPE(SFT); - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef SFT::Scalar_factor Scalar_factor; { typedef Scalar_factor::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef Scalar_factor::argument_type argument_type; CGAL_USE_TYPE(argument_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); } typedef SFT::Scalar_div Scalar_div; { typedef Scalar_div::result_type result_type; CGAL_USE_TYPE(result_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef Scalar_div::first_argument_type first_argument_type; CGAL_USE_TYPE(first_argument_type); - CGAL_static_assertion( + static_assert( (::std::is_same::value)); typedef Scalar_div::second_argument_type second_argument_type; CGAL_USE_TYPE(second_argument_type); - CGAL_static_assertion( + static_assert( (::std::is_same::value)); } diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h index 002e108b0ec6..a02edebb8e13 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h @@ -481,16 +481,16 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ Curve_analysis_2 _construct_defining_polynomial_from(Bound b) const { typedef CGAL::Fraction_traits FT; // We rely on the fact that the Bound is a fraction - CGAL_static_assertion((::std::is_same::value)); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - CGAL_static_assertion((::std::is_same + static_assert((::std::is_same ::value)); typedef CGAL::Coercion_traits Denom_coercion; - CGAL_static_assertion((::std::is_same + static_assert((::std::is_same ::value)); typename Num_coercion::Cast num_cast; @@ -2541,16 +2541,16 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ Polynomial_1 operator() (const Polynomial_2& f, Bound b) const { typedef CGAL::Fraction_traits FT; // We rely on the fact that the Bound is a fraction - CGAL_static_assertion((::std::is_same::value)); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - CGAL_static_assertion((::std::is_same + static_assert((::std::is_same ::value)); typedef CGAL::Coercion_traits Denom_coercion; - CGAL_static_assertion((::std::is_same + static_assert((::std::is_same ::value)); typename Num_coercion::Cast num_cast; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h index 54fcec0b3f58..2b5a30867ce5 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h @@ -71,7 +71,7 @@ class Algebraic_real_d_1 : public ::CGAL::Handle_with_policy< AlgebraicRealRep_d_1, HandlePolicy > { // currently Rational is the only supported Bound type. - CGAL_static_assertion( + static_assert( ( ::std::is_same ::Arithmetic_kernel::Rational>::value)); diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h index 1609fdbaa6ba..4a2b7bd038ea 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/algebraic_curve_kernel_2_tools.h @@ -186,7 +186,7 @@ template::value_type >::value)); @@ -224,12 +224,12 @@ template void cast_back_utcf(const Poly_coer_1& p,Polynomial_1& q) { // We can assume that both template arguments are polynomial types typedef CGAL::Fraction_traits FT; - CGAL_static_assertion((::std::is_same::value)); typedef typename FT::Numerator_type Numerator; typedef typename FT::Denominator_type Denominator; typedef CGAL::Coercion_traits Num_coercion; - CGAL_static_assertion((::std::is_same + static_assert((::std::is_same ::value)); Numerator p_num; diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp index 2e06d3b6aece..c56969868c1a 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/Real_embeddable_traits_extension.cpp @@ -47,8 +47,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Floor::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion(( ::std::is_same::value)); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); assert(Integer(42) == floor(NT(42))); assert(Integer(-42) == floor(NT(-42))); } @@ -59,8 +59,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Floor_log2_abs::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion(( ::std::is_same::value)); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); assert(long(0) == floor_log2_abs(NT(1))); assert(long(0) == floor_log2_abs(NT(-1))); @@ -86,8 +86,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Ceil::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion(( ::std::is_same::value)); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); assert(Integer(42) == ceil(NT(42))); assert(Integer(-42) == ceil(NT(-42))); } @@ -98,8 +98,8 @@ void test_real_embeddable_extension(const NT_&){ typedef typename Ceil_log2_abs::result_type Result_type; CGAL_USE_TYPE(Argument_type); CGAL_USE_TYPE(Result_type); - CGAL_static_assertion(( ::std::is_same::value)); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); assert(long(0) == ceil_log2_abs(NT(1))); assert(long(0) == ceil_log2_abs(NT(-1))); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h index 01a27244d746..e110e2b7c955 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_curve_kernel_2.h @@ -62,18 +62,18 @@ void test_algebraic_curve_kernel_2() { typedef AlgebraicCurveKernel_2 AK_2; - /* CGAL_static_assertion( (::std::is_same< + /* static_assert( (::std::is_same< Algebraic_real_1, typename AK::Algebraic_real_1 >::value) ); - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< Isolator, typename AK::Isolator >::value) ); - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< Coefficient, typename AK::Coefficient >::value)); - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< Polynomial_1, typename AK::Polynomial_1 >::value));*/ diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h index 20ecd337223e..7d12134feff2 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_1.h @@ -109,8 +109,8 @@ void test_algebraic_kernel_1(const AlgebraicKernel_d_1& ak_1){ typedef typename Name::result_type RT_; \ CGAL_USE_TYPE(AT_); \ CGAL_USE_TYPE(RT_); \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ } #define CGAL_CHECK_BFUNCTION(Name,AT1,AT2,RT) \ { \ @@ -120,9 +120,9 @@ void test_algebraic_kernel_1(const AlgebraicKernel_d_1& ak_1){ CGAL_USE_TYPE(AT1_); \ CGAL_USE_TYPE(AT2_); \ CGAL_USE_TYPE(RT_); \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ } // TODO: missing check for Construct_algebraic_real_1 diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h index ff04c8f8c9d6..4db859ddb25c 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_algebraic_kernel_2.h @@ -93,8 +93,8 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { typedef typename Name::result_type RT_; \ CGAL_USE_TYPE(AT_); \ CGAL_USE_TYPE(RT_); \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ } #define CGAL_CHECK_BFUNCTION(Name,AT1,AT2,RT) \ { \ @@ -104,13 +104,13 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { CGAL_USE_TYPE(AT1_); \ CGAL_USE_TYPE(AT2_); \ CGAL_USE_TYPE(RT_); \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ - {CGAL_static_assertion(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ + {static_assert(( ::std::is_same::value));} \ } - CGAL_static_assertion(( ::std::is_same + static_assert(( ::std::is_same ::value)); @@ -118,7 +118,7 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { CGAL_CHECK_UFUNCTION(Make_square_free_2,Polynomial_2,Polynomial_2); // TODO: missing check for Square_free_factorize_2 CGAL_CHECK_BFUNCTION(Is_coprime_2,Polynomial_2,Polynomial_2,bool); - CGAL_static_assertion(( ::std::is_same + static_assert(( ::std::is_same ::value)); CGAL_CHECK_BFUNCTION(Number_of_solutions_2,Polynomial_2,Polynomial_2, size_type); @@ -128,7 +128,7 @@ void test_algebraic_kernel_2(const AlgebraicKernel_2& ak_2) { CGAL_CHECK_UFUNCTION(Compute_polynomial_y_2,Algebraic_real_2,Polynomial_1); CGAL_CHECK_BFUNCTION(Isolate_x_2,Algebraic_real_2,Polynomial_1,BInterval); CGAL_CHECK_BFUNCTION(Isolate_y_2,Algebraic_real_2,Polynomial_1,BInterval); - CGAL_static_assertion(( ::std::is_same + static_assert(( ::std::is_same < BArray,typename Isolate_2::result_type>::value)); CGAL_CHECK_BFUNCTION(Sign_at_2,Polynomial_2,Algebraic_real_2,Sign); CGAL_CHECK_BFUNCTION(Is_zero_at_2,Polynomial_2,Algebraic_real_2,bool); diff --git a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h index a393abe3653d..dc9f13e3a038 100644 --- a/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h +++ b/Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_comparable.h @@ -39,8 +39,8 @@ namespace internal { void operator() (ToDouble to_double) { typedef typename ToDouble::argument_type Argument_type; typedef typename ToDouble::result_type Result_type; - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); assert(42.0 == to_double(NT(42))); } }; @@ -59,8 +59,8 @@ namespace internal { void operator() (ToInterval to_Interval) { typedef typename ToInterval::argument_type Argument_type; typedef typename ToInterval::result_type Result_type; - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same< typename Argument_type::Interval, Result_type>::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same< typename Argument_type::Interval, Result_type>::value)); // TODO: NiX::in not available!? //assert(NiX::in(42.0,to_Interval(NT(42)))); @@ -99,7 +99,7 @@ void test_real_comparable() { typedef CGAL::Real_embeddable_traits Traits; typedef typename Traits::Is_real_embeddable Is_real_comparable; using ::CGAL::Tag_true; - CGAL_static_assertion((::std::is_same< Is_real_comparable, Tag_true>::value)); + static_assert((::std::is_same< Is_real_comparable, Tag_true>::value)); typename Traits::Compare compare; typename Traits::Sign sign; typename Traits::Abs abs; @@ -168,20 +168,20 @@ void test_not_real_comparable() { typedef CGAL::Real_embeddable_traits Traits; typedef typename Traits::Is_real_embeddable Is_real_comparable; using ::CGAL::Tag_false; - CGAL_static_assertion((::std::is_same< Is_real_comparable, Tag_false>::value)); + static_assert((::std::is_same< Is_real_comparable, Tag_false>::value)); } template void test_rounded_log2_abs(NT zero, ::CGAL::Null_functor, CeilLog2Abs) { typedef ::CGAL::Null_functor Nulltype; - CGAL_static_assertion((::std::is_same< CeilLog2Abs, Nulltype>::value)); + static_assert((::std::is_same< CeilLog2Abs, Nulltype>::value)); } template void test_rounded_log2_abs(NT zero, FloorLog2Abs fl_log, CeilLog2Abs cl_log) { typedef ::CGAL::Null_functor Null_functor; - CGAL_static_assertion((!::std::is_same< CeilLog2Abs, Null_functor>::value)); + static_assert((!::std::is_same< CeilLog2Abs, Null_functor>::value)); assert( fl_log(NT( 7)) == 2 ); assert( cl_log(NT( 7)) == 3 ); diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h index 3c4cb4b7d301..56e52417684c 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shape_2.h @@ -61,7 +61,7 @@ class Alpha_shape_2 : public Dt // because the periodic triangulations' point() function returns a temporary // value while the lazy predicate evaluations that are used when the Exact tag // is set to true rely on a permanent and safe access to the points. - CGAL_static_assertion( + static_assert( (std::is_same::value) || (std::is_same::value)); @@ -76,8 +76,8 @@ class Alpha_shape_2 : public Dt typedef Type_of_alpha FT; // check that simplices are correctly instantiated - CGAL_static_assertion( (std::is_same::value) ); - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); + static_assert( (std::is_same::value) ); typedef typename Dt::Point Point; diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h index cc734b7f4b63..22565c21d859 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h @@ -148,7 +148,7 @@ class Lazy_alpha_nt_2 Approx_point to_approx(const Input_point& wp) const { // The traits class' Point_2 must be convertible using the Cartesian converter - CGAL_static_assertion((Is_traits_point_convertible_2< + static_assert((Is_traits_point_convertible_2< Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); To_approx converter; @@ -158,7 +158,7 @@ class Lazy_alpha_nt_2 Exact_point to_exact(const Input_point& wp) const { // The traits class' Point_2 must be convertible using the Cartesian converter - CGAL_static_assertion((Is_traits_point_convertible_2< + static_assert((Is_traits_point_convertible_2< Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); To_exact converter; diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h index be6849a58861..a7fdc406b041 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shape_3.h @@ -97,7 +97,7 @@ class Alpha_shape_3 : public Dt // because the periodic triangulations' point() function returns a temporary // value while the lazy predicate evaluations that are used when the Exact tag // is set to true rely on a permanent and safe access to the points. - CGAL_static_assertion( + static_assert( (std::is_same::value) || (std::is_same::value)); @@ -108,8 +108,8 @@ class Alpha_shape_3 : public Dt typedef typename Gt::FT Coord_type; //checks whether tags are correctly set in Vertex and Cell classes - CGAL_static_assertion( (std::is_same::value) ); - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); + static_assert( (std::is_same::value) ); typedef typename Dt::Point Point; diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h index cd8536243789..f20b050c1a2c 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h @@ -139,7 +139,7 @@ class Lazy_alpha_nt_3{ Approx_point to_approx(const Input_point& wp) const { // The traits class' Point_3 must be convertible using the Cartesian converter - CGAL_static_assertion((Is_traits_point_convertible_3< + static_assert((Is_traits_point_convertible_3< Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); To_approx converter; @@ -149,7 +149,7 @@ class Lazy_alpha_nt_3{ Exact_point to_exact(const Input_point& wp) const { // The traits class' Point_3 must be convertible using the Cartesian converter - CGAL_static_assertion((Is_traits_point_convertible_3< + static_assert((Is_traits_point_convertible_3< Input_traits, Kernel_approx, Kernel_exact, Weighted_tag>::value)); To_exact converter; diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h index 20982e9beaaa..0d81f8b81936 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Alpha_wrap_3.h @@ -193,7 +193,7 @@ class Alpha_wrap_3 { // Due to the Steiner point computation being a dichotomy, the algorithm is inherently inexact // and passing exact kernels is explicitly disabled to ensure no misunderstanding. - CGAL_static_assertion((std::is_floating_point::value)); + static_assert((std::is_floating_point::value)); } public: diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h index 6d0f65142f69..122599a7d50b 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_mesh_oracle.h @@ -146,7 +146,7 @@ class Triangle_mesh_oracle VPM vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, tmesh)); - CGAL_static_assertion((std::is_same::value_type, Point_3>::value)); + static_assert((std::is_same::value_type, Point_3>::value)); Splitter_base::reserve(num_faces(tmesh)); diff --git a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h index 57f936306dad..e602b708f955 100644 --- a/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h +++ b/Alpha_wrap_3/include/CGAL/Alpha_wrap_3/internal/Triangle_soup_oracle.h @@ -143,7 +143,7 @@ class Triangle_soup_oracle #endif PPM pm = choose_parameter(get_parameter(np, internal_np::point_map)); - CGAL_static_assertion((std::is_same::value_type, Point_3>::value)); + static_assert((std::is_same::value_type, Point_3>::value)); Splitter_base::reserve(faces.size()); diff --git a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp index f8b373c9764d..2947c3a3761a 100644 --- a/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp +++ b/Arithmetic_kernel/test/Arithmetic_kernel/Get_arithmetic_kernel.cpp @@ -18,17 +18,17 @@ int main() { { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } { typedef CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; CGAL_USE_TYPE(AK_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } return 0; } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h index e1582795054c..8b4a3e1eca23 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h @@ -90,10 +90,10 @@ class Arr_bounded_planar_topology_traits_2 : typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value)); - CGAL_static_assertion((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value)); - CGAL_static_assertion((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value)); - CGAL_static_assertion((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value)); + static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value)); + static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value)); + static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value)); + static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value)); //@} /*! \struct diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h b/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h index 39a618a754df..af2ea182fa74 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_dcel_base.h @@ -38,7 +38,7 @@ namespace CGAL { inline void* _clean_pointer(const void* p) { - CGAL_static_assertion(sizeof(void*) == sizeof(size_t)); + static_assert(sizeof(void*) == sizeof(size_t)); const size_t mask = ~1; const size_t val = (reinterpret_cast(p) & mask); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 83358c14b12d..5a32bb997d75 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -172,14 +172,14 @@ overlay(const Arrangement_on_surface_2& arr1 typedef typename Agt2::Point_2 A_point; typedef typename Bgt2::Point_2 B_point; typedef typename Rgt2::Point_2 Res_point; - CGAL_static_assertion((boost::is_convertible::value)); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); typedef typename Agt2::X_monotone_curve_2 A_xcv; typedef typename Bgt2::X_monotone_curve_2 B_xcv; typedef typename Rgt2::X_monotone_curve_2 Res_xcv; - CGAL_static_assertion((boost::is_convertible::value)); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); typedef Arr_traits_basic_adaptor_2 Gt_adaptor_2; typedef Arr_overlay_traits_2 diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h index 7ebec8a5eb61..f72169eea37e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Base_rational_arc_ds_1.h @@ -62,8 +62,8 @@ class Base_rational_arc_ds_1 typedef std::vector > Root_multiplicity_vector; - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h index ef568ab6cadc..da8875c47681 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_rat_arc/Rational_arc_d_1.h @@ -100,8 +100,8 @@ class Base_rational_arc_d_1 typedef Algebraic_point_2 Point_2; - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h index 9b4ea137450c..d7b170e979b8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h @@ -91,13 +91,13 @@ class Arr_spherical_topology_traits_2 { typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || std::is_same< Left_side_category, Arr_identified_side_tag >::value)); - CGAL_static_assertion((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || std::is_same< Bottom_side_category, Arr_contracted_side_tag >::value)); - CGAL_static_assertion((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || std::is_same< Top_side_category, Arr_contracted_side_tag >::value)); - CGAL_static_assertion((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || std::is_same< Right_side_category, Arr_identified_side_tag >::value)); //@} diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h index 355dd76641eb..30181d7270f3 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h @@ -87,13 +87,13 @@ class Arr_unb_planar_topology_traits_2 : typedef typename Gt_adaptor_2::Top_side_category Top_side_category; typedef typename Gt_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || std::is_same< Left_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || std::is_same< Bottom_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Top_side_category, Arr_oblivious_side_tag>::value || + static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag>::value || std::is_same< Top_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || std::is_same< Right_side_category, Arr_open_side_tag >::value)); //@} diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h index 438f46ced1cf..cf4ae5eb11ba 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h @@ -77,7 +77,7 @@ class Arrangement_on_surface_2 { typedef typename Traits_adaptor_2::Top_side_category Top_side_category; typedef typename Traits_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((Arr_sane_identified_tagging::value)); diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 2e16e30a823c..8f0185a5a037 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -67,7 +67,7 @@ class Arrangement_zone_2 { typedef typename Traits_adaptor_2::Top_side_category Top_side_category; typedef typename Traits_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((Arr_sane_identified_tagging::value)); diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp index 84896d26a68d..81eae4204966 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_tags.cpp @@ -272,38 +272,38 @@ int main () assert(ident12() == false); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_left_side_category< Traits5 >::Category, CGAL::Arr_oblivious_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_left_side_category< Traits1 >::Category, CGAL::Arr_open_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same::Category, CGAL::Arr_oblivious_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same::Category, CGAL::Arr_open_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_top_side_category< Traits5 >::Category, CGAL::Arr_oblivious_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_top_side_category< Traits1 >::Category, CGAL::Arr_open_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_right_side_category< Traits5 >::Category, CGAL::Arr_oblivious_side_tag >::value) ); - CGAL_static_assertion( + static_assert( (std::is_same< CGAL::internal::Arr_complete_right_side_category< Traits1 >::Category, CGAL::Arr_open_side_tag >::value) ); diff --git a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h index 331f8a0f44b0..3ec900827933 100644 --- a/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h +++ b/BGL/include/CGAL/boost/graph/IO/Generic_facegraph_builder.h @@ -49,9 +49,9 @@ class Generic_facegraph_builder typedef typename CGAL::GetVertexPointMap::type VPM; // usually will be true, but might not be the case if using custom type points -// CGAL_static_assertion((std::is_same::value_type>::value)); -// CGAL_static_assertion((std::is_same::type>::value)); typedef typename internal_np::Lookup_named_param_def< diff --git a/BGL/test/BGL/test_Has_member_clear.cpp b/BGL/test/BGL/test_Has_member_clear.cpp index 5a78d9a2d7eb..b8adc423eb78 100644 --- a/BGL/test/BGL/test_Has_member_clear.cpp +++ b/BGL/test/BGL/test_Has_member_clear.cpp @@ -19,13 +19,13 @@ struct with_clear_const { int main() { using namespace CGAL::internal; - CGAL_static_assertion(Has_member_clear::value); + static_assert(Has_member_clear::value); - CGAL_static_assertion(!Has_member_clear::value); + static_assert(!Has_member_clear::value); - CGAL_static_assertion(!Has_member_clear::value); + static_assert(!Has_member_clear::value); - CGAL_static_assertion(Has_member_clear::value); + static_assert(Has_member_clear::value); return 0; } diff --git a/BGL/test/BGL/test_Has_member_id.cpp b/BGL/test/BGL/test_Has_member_id.cpp index 6ff478d04c21..7cfec0bf8bdd 100644 --- a/BGL/test/BGL/test_Has_member_id.cpp +++ b/BGL/test/BGL/test_Has_member_id.cpp @@ -28,17 +28,17 @@ int main() { using namespace CGAL::internal; - CGAL_static_assertion(!Has_member_id::value); - CGAL_static_assertion(Has_member_id::value); - CGAL_static_assertion(!Has_member_id::value); - CGAL_static_assertion(Has_member_id::value); - CGAL_static_assertion(Has_member_id::value); - CGAL_static_assertion( + static_assert(!Has_member_id::value); + static_assert(Has_member_id::value); + static_assert(!Has_member_id::value); + static_assert(Has_member_id::value); + static_assert(Has_member_id::value); + static_assert( (Has_member_id::Face>::value)); - CGAL_static_assertion(!Has_member_id >::value); - CGAL_static_assertion(Has_member_id >::value); - CGAL_static_assertion(Has_member_id >::value); + static_assert(!Has_member_id >::value); + static_assert(Has_member_id >::value); + static_assert(Has_member_id >::value); return 0; } diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h index eeb80bf655d4..ef8cc06083f9 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_agg_meta_traits.h @@ -123,13 +123,13 @@ class Gps_agg_meta_traits : typedef typename Arr::Right_side_category Right_side_category; // a side is either oblivious or open (unbounded) - CGAL_static_assertion((std::is_same::value || + static_assert((std::is_same::value || std::is_same::value)); - CGAL_static_assertion((std::is_same::value || + static_assert((std::is_same::value || std::is_same::value)); - CGAL_static_assertion((std::is_same::value || + static_assert((std::is_same::value || std::is_same::value)); - CGAL_static_assertion((std::is_same::value || + static_assert((std::is_same::value || std::is_same::value)); typedef typename Arr::Halfedge_handle Halfedge_handle; diff --git a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h index c260e4cf8245..9c59b4f32753 100644 --- a/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h +++ b/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2/Gps_traits_decorator.h @@ -53,13 +53,13 @@ class Gps_traits_decorator typedef typename Base::Right_side_category Right_side_category; // a side is either oblivious or open (unbounded) - CGAL_static_assertion((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Left_side_category, Arr_oblivious_side_tag >::value || std::is_same< Left_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Bottom_side_category, Arr_oblivious_side_tag >::value || std::is_same< Bottom_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Top_side_category, Arr_oblivious_side_tag >::value || std::is_same< Top_side_category, Arr_open_side_tag >::value)); - CGAL_static_assertion((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || + static_assert((std::is_same< Right_side_category, Arr_oblivious_side_tag >::value || std::is_same< Right_side_category, Arr_open_side_tag >::value)); class Ex_point_2 diff --git a/Box_intersection_d/include/CGAL/box_intersection_d.h b/Box_intersection_d/include/CGAL/box_intersection_d.h index 94752c414623..1ac7a802d7d3 100644 --- a/Box_intersection_d/include/CGAL/box_intersection_d.h +++ b/Box_intersection_d/include/CGAL/box_intersection_d.h @@ -63,7 +63,7 @@ void box_intersection_segment_tree_d( const NT sup = Box_intersection_d::box_limits::sup(); #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else // CGAL_LINKED_WITH_TBB if(boost::is_convertible::value) diff --git a/Box_intersection_d/test/Box_intersection_d/test_Has_member_report.cpp b/Box_intersection_d/test/Box_intersection_d/test_Has_member_report.cpp index 12f64d1bc112..d3d5368f9659 100644 --- a/Box_intersection_d/test/Box_intersection_d/test_Has_member_report.cpp +++ b/Box_intersection_d/test/Box_intersection_d/test_Has_member_report.cpp @@ -18,8 +18,8 @@ struct With_report_as_a_template_member_function { int main() { using CGAL::Box_intersection_d::Has_member_report; - CGAL_static_assertion(!Has_member_report::value); - CGAL_static_assertion(Has_member_report::value); - CGAL_static_assertion(Has_member_report::value); + static_assert(!Has_member_report::value); + static_assert(Has_member_report::value); + static_assert(Has_member_report::value); return EXIT_SUCCESS; } diff --git a/Circulator/include/CGAL/circulator.h b/Circulator/include/CGAL/circulator.h index 2b1556218f04..d985eba576c2 100644 --- a/Circulator/include/CGAL/circulator.h +++ b/Circulator/include/CGAL/circulator.h @@ -193,45 +193,45 @@ template inline void Assert_circulator( const C &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_iterator( const I &) { typedef typename Circulator_traits::category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_input_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_output_category( const I &/*i*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_forward_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_bidirectional_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } template inline void Assert_random_access_category( const IC &/*ic*/) { typedef typename std::iterator_traits::iterator_category category; CGAL_USE_TYPE(category); - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); } // The assert at-least-category functions use the following // functions to resolve properly. Note the proper order of the diff --git a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp index 4611becf7110..4b8bff71481d 100644 --- a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp +++ b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/forest.hpp @@ -164,7 +164,7 @@ class RandomForest { f (seed_start, sample_idxes, trees, samples, labels, params.n_in_bag_samples, split_generator); #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (std::is_convertible::value) diff --git a/Classification/include/CGAL/Classification/Local_eigen_analysis.h b/Classification/include/CGAL/Classification/Local_eigen_analysis.h index 33e1d706599d..78606ed27490 100644 --- a/Classification/include/CGAL/Classification/Local_eigen_analysis.h +++ b/Classification/include/CGAL/Classification/Local_eigen_analysis.h @@ -265,7 +265,7 @@ class Local_eigen_analysis out.m_content->mean_range = 0.; #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (std::is_convertible::value) @@ -353,7 +353,7 @@ class Local_eigen_analysis out.m_content->mean_range = 0.; #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (std::is_convertible::value) @@ -431,7 +431,7 @@ class Local_eigen_analysis #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (std::is_convertible::value) diff --git a/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h b/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h index 2d30a534a42f..7f16459723ad 100644 --- a/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h +++ b/Classification/include/CGAL/Classification/Sum_of_weighted_features_classifier.h @@ -898,7 +898,7 @@ class Sum_of_weighted_features_classifier std::size_t gt = j; #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (std::is_convertible::value) diff --git a/Combinatorial_map/include/CGAL/Cell_iterators.h b/Combinatorial_map/include/CGAL/Cell_iterators.h index b54c12bf0c0d..9f7095c1900f 100644 --- a/Combinatorial_map/include/CGAL/Cell_iterators.h +++ b/Combinatorial_map/include/CGAL/Cell_iterators.h @@ -82,7 +82,7 @@ namespace CGAL { Ite(amap, adart, amap.get_new_mark()), mcell_mark_number(amap.get_new_mark()) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion(amap.is_whole_map_unmarked(mcell_mark_number)); @@ -196,7 +196,7 @@ namespace CGAL { Ite(amap, adart), mmark_number(amap.get_new_mark()) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, adart, mmark_number); @@ -303,7 +303,7 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 229a8d1a47df..7266c4cd5419 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -185,7 +185,7 @@ namespace CGAL { */ Combinatorial_map_base() { - CGAL_static_assertion_msg(Helper::nb_attribs<=dimension+1, + static_assert(Helper::nb_attribs<=dimension+1, "Too many attributes in the tuple Attributes_enabled"); this->init_storage(); @@ -803,7 +803,7 @@ namespace CGAL { void restricted_set_dart_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "set_dart_attribute called but i-attributes are disabled."); if ( this->template attribute(dh)==ah ) return; @@ -826,7 +826,7 @@ namespace CGAL { void set_dart_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "set_dart_attribute called but i-attributes are disabled."); if ( this->template attribute(dh)==ah ) return; @@ -1524,7 +1524,7 @@ namespace CGAL { template < class Ite > std::ostream& display_orbits(std::ostream & aos) const { - CGAL_static_assertion( (std::is_same::value) ); unsigned int nb = 0; size_type amark = get_new_mark(); @@ -1584,7 +1584,7 @@ namespace CGAL { template typename Attribute_descriptor::type create_attribute(const Args&... args) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "create_attribute but i-attributes are disabled"); typename Attribute_descriptor::type res= std::get::value> @@ -1602,7 +1602,7 @@ namespace CGAL { template void erase_attribute(typename Attribute_descriptor::type h) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "erase_attribute but i-attributes are disabled"); std::get::value> (mattribute_containers).erase(h); @@ -1612,7 +1612,7 @@ namespace CGAL { template bool is_attribute_used(typename Attribute_const_descriptor< i >::type ah) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "is_attribute_used but i-attributes are disabled"); return std::get::value> (mattribute_containers).is_used(ah); @@ -1622,7 +1622,7 @@ namespace CGAL { template size_type number_of_attributes() const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "number_of_attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers).size(); @@ -1636,8 +1636,8 @@ namespace CGAL { void set_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion(i<=dimension); - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(i<=dimension); + static_assert(Helper::template Dimension_index::value>=0, "set_attribute but i-attributes are disabled"); for ( typename Dart_of_cell_range::iterator it(*this, dh); it.cont(); ++it) @@ -1651,7 +1651,7 @@ namespace CGAL { template typename Attribute_range::type & attributes() { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers); @@ -1660,7 +1660,7 @@ namespace CGAL { template typename Attribute_const_range::type & attributes() const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers); @@ -1673,7 +1673,7 @@ namespace CGAL { typename Attribute_type::type&)>& onsplit_functor() { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1689,7 +1689,7 @@ namespace CGAL { typename Attribute_type::type&)>& onsplit_functor() const { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1705,7 +1705,7 @@ namespace CGAL { typename Attribute_type::type&)>& onmerge_functor() { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1720,7 +1720,7 @@ namespace CGAL { typename Attribute_type::type&)>& onmerge_functor() const { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); 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 06f3c4f4dc37..2b55a2c21c96 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 @@ -64,9 +64,9 @@ struct Group_nonvoid_attribute_functor_of_dart_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2) { - CGAL_static_assertion( 1<=i && i<=CMap::dimension ); - CGAL_static_assertion( i!=j && (i!=1 || j!=0) ); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert( 1<=i && i<=CMap::dimension ); + static_assert( i!=j && (i!=1 || j!=0) ); + static_assert(CMap::Helper::template Dimension_index::value>=0, "Group_attribute_functor_of_dart_run but " "i-attributes are disabled"); @@ -90,8 +90,8 @@ struct Group_nonvoid_attribute_functor_of_dart_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2) { - CGAL_static_assertion(j!=0 && j!=1); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(j!=0 && j!=1); + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_of_dart_run<0> but " "0-attributes are disabled"); @@ -127,7 +127,7 @@ struct Group_nonvoid_attribute_functor_of_dart_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_of_dart_run<0> but " "0-attributes are disabled"); @@ -152,7 +152,7 @@ struct Group_nonvoid_attribute_functor_of_dart_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_of_dart_run<0> but " "0-attributes are disabled"); @@ -240,9 +240,9 @@ struct Group_nonvoid_attribute_functor_run typename CMap::Dart_descriptor adart1, typename CMap::Dart_descriptor adart2) { - CGAL_static_assertion( 1<=i && i<=CMap::dimension ); - CGAL_static_assertion( i!=j ); - CGAL_static_assertion_msg + static_assert( 1<=i && i<=CMap::dimension ); + static_assert( i!=j ); + static_assert ( CMap::Helper::template Dimension_index::value>=0, "Group_attribute_functor_run but i-attributes are disabled" ); typename CMap::template Attribute_descriptor::type @@ -279,10 +279,10 @@ struct Group_nonvoid_attribute_functor_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2 ) { - CGAL_static_assertion_msg + static_assert ( CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_run<0> but 0-attributes are disabled" ); - CGAL_static_assertion(j!=0 && j!=1); + static_assert(j!=0 && j!=1); typename CMap::template Attribute_descriptor<0>::type a1=CMap::null_descriptor, a2=CMap::null_descriptor; @@ -340,7 +340,7 @@ struct Group_nonvoid_attribute_functor_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2 ) { - CGAL_static_assertion_msg + static_assert ( CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_run<0> but 0-attributes are disabled" ); typename CMap::Dart_descriptor od=amap.other_extremity(dh2); @@ -377,7 +377,7 @@ struct Group_nonvoid_attribute_functor_run typename CMap::Dart_descriptor dh1, typename CMap::Dart_descriptor dh2 ) { - CGAL_static_assertion_msg + static_assert ( CMap::Helper::template Dimension_index<0>::value>=0, "Group_attribute_functor_run<0> but 0-attributes are disabled" ); typename CMap::Dart_descriptor od =amap.other_extremity(dh1); @@ -474,9 +474,9 @@ struct Degroup_nonvoid_attribute_functor_run typename CMap::Dart_descriptor adart1, typename CMap::Dart_descriptor adart2) { - CGAL_static_assertion( i<=CMap::dimension ); - CGAL_static_assertion( i!=j ); - CGAL_static_assertion_msg + static_assert( i<=CMap::dimension ); + static_assert( i!=j ); + static_assert ( CMap::Helper::template Dimension_index::value>=0, "Degroup_attribute_functor_run but i-attributes are disabled" ); @@ -549,7 +549,7 @@ void test_split_attribute_functor_one_dart unsigned int, typename CMap::Hash_function> & found_attributes, typename CMap::size_type mark ) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Test_split_attribute_functor_one_dart but " "i-attributes are disabled"); @@ -615,9 +615,9 @@ struct Test_split_nonvoid_attribute_functor_run &modified_darts, typename CMap::size_type mark_modified_darts=CMap::INVALID_MARK) { - CGAL_static_assertion( 1<=i && i<=CMap::dimension ); + static_assert( 1<=i && i<=CMap::dimension ); CGAL_assertion( i!=j ); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Test_split_attribute_functor_run but " "i-attributes are disabled"); @@ -658,9 +658,9 @@ struct Test_split_nonvoid_attribute_functor_run &modified_darts2, typename CMap::size_type mark_modified_darts=CMap::INVALID_MARK) { - CGAL_static_assertion( 1<=i && i<=CMap::dimension ); + static_assert( 1<=i && i<=CMap::dimension ); CGAL_assertion( i!=j ); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Test_split_attribute_functor_run but " "i-attributes are disabled"); @@ -720,7 +720,7 @@ struct Test_split_nonvoid_attribute_functor_run typename CMap::size_type mark_modified_darts=CMap::INVALID_MARK) { CGAL_assertion( j!=0 && j!=1 ); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Test_split_attribute_functor_run<0> but " "0-attributes are disabled"); @@ -772,7 +772,7 @@ struct Test_split_nonvoid_attribute_functor_run typename CMap::size_type mark_modified_darts=CMap::INVALID_MARK) { CGAL_assertion( j!=0 && j!=1 ); - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Test_split_attribute_functor_run<0> but " "0-attributes are disabled"); @@ -858,7 +858,7 @@ struct Test_split_nonvoid_attribute_functor_run &modified_darts2, typename CMap::size_type mark_modified_darts=CMap::INVALID_MARK) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index<0>::value>=0, "Test_split_attribute_functor_run<0> but " "0-attributes are disabled"); diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h index 3e0b147942c5..c76a210ae6f4 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map/internal/Combinatorial_map_internal_functors.h @@ -220,7 +220,7 @@ struct Test_is_valid_attribute_functor typename CMap::Dart_const_descriptor adart, std::vector& marks, bool& ares) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Test_is_valid_attribute_functor but " " i-attributes are disabled"); @@ -304,7 +304,7 @@ struct Correct_invalid_attributes_functor typename CMap::Dart_descriptor adart, std::vector& marks) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Correct_invalid_attributes_functor but " " i-attributes are disabled"); @@ -362,7 +362,7 @@ struct Cleanup_useless_attributes template static void run(CMap& amap) { - CGAL_static_assertion_msg(CMap::Helper::template + static_assert(CMap::Helper::template Dimension_index::value>=0, "Cleanup_useless_attributes but " " i-attributes are disabled"); @@ -707,7 +707,7 @@ struct Test_is_same_attribute_point_functor typename Map1::Dart_const_descriptor dh1, typename Map2::Dart_const_descriptor dh2) { - CGAL_static_assertion( Withpoint1==true && Withpoint2==true ); + static_assert( Withpoint1==true && Withpoint2==true ); if (m1.template attribute(dh1)==Map1::null_descriptor && m2.template attribute(dh2)==Map2::null_descriptor) return true; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h index b7974062ae01..56991cc55d16 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_basic_operations.h @@ -34,7 +34,7 @@ namespace CGAL typename Map::Dart_const_descriptor adart1, typename Map::Dart_const_descriptor adart2) { - CGAL_static_assertion( (std::is_same::value) ); bool found=false; @@ -57,7 +57,7 @@ namespace CGAL typename Map::Dart_const_descriptor adart, typename Map::size_type amark) { - CGAL_static_assertion( (std::is_same::value) ); bool res=true; @@ -98,7 +98,7 @@ namespace CGAL typename Map::Dart_const_descriptor adart, typename Map::size_type amark) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion( (is_whole_orbit_unmarked > @@ -305,7 +305,7 @@ namespace CGAL typename Map::size_type amark, typename Map::size_type amark2=Map::INVALID_MARK) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion( (is_whole_orbit_unmarked > diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h index 0b2c39bc7204..25419ab98c05 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_iterators_base.h @@ -305,7 +305,7 @@ namespace CGAL { typedef typename Map::size_type size_type; - CGAL_static_assertion( (Bi<=Map::dimension && + static_assert( (Bi<=Map::dimension && std::is_same::value) ); public: @@ -493,7 +493,7 @@ namespace CGAL { typedef typename Map::size_type size_type; - CGAL_static_assertion( (std::is_same::value) ); /// Main constructor. @@ -579,7 +579,7 @@ namespace CGAL { /// True iff this iterator is basic typedef Tag_false Basic_iterator; - CGAL_static_assertion( (std::is_same::value) ); /// Main constructor. diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h index 2ba09b326500..6a7a1b6f2715 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h @@ -77,7 +77,7 @@ namespace CGAL static size_t run(CMap& amap, typename CMap::Dart_descriptor adart, bool update_attributes) { - CGAL_static_assertion ( 1<=i && i(adart)) ); size_t res = 0; @@ -493,7 +493,7 @@ namespace CGAL static size_t run(CMap& amap, typename CMap::Dart_descriptor adart, bool update_attributes) { - CGAL_static_assertion ( 2<=i && i<=CMap::dimension ); + static_assert ( 2<=i && i<=CMap::dimension ); CGAL_assertion( (amap.template is_contractible(adart)) ); size_t res = 0; diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h index 7c505ea51657..8de6b7c1f7fd 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages.h @@ -232,7 +232,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -241,7 +241,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -252,7 +252,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); typename Attribute_descriptor::type res= std::get::value> 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 584442412c54..f1e3d62cbab7 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_storages_with_index.h @@ -266,7 +266,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -275,7 +275,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -286,7 +286,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(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. diff --git a/Combinatorial_map/include/CGAL/Dart.h b/Combinatorial_map/include/CGAL/Dart.h index 3308def61039..17ffde4b294d 100644 --- a/Combinatorial_map/include/CGAL/Dart.h +++ b/Combinatorial_map/include/CGAL/Dart.h @@ -226,7 +226,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute() { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mattribute_descriptors); @@ -234,7 +234,7 @@ namespace CGAL { template typename Attribute_const_descriptor::type attribute() const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mattribute_descriptors); diff --git a/Combinatorial_map/include/CGAL/Dart_iterators.h b/Combinatorial_map/include/CGAL/Dart_iterators.h index c73a32b383e7..2e552f25950f 100644 --- a/Combinatorial_map/include/CGAL/Dart_iterators.h +++ b/Combinatorial_map/include/CGAL/Dart_iterators.h @@ -295,13 +295,13 @@ namespace CGAL { /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_descriptor adart): Base(amap, adart) - { CGAL_static_assertion( Bi>=2 && Bi<=Map::dimension ); } + { static_assert( Bi>=2 && Bi<=Map::dimension ); } /// Main constructor. CMap_dart_iterator_basic_of_orbit_generic(Map& amap, Dart_descriptor adart, size_type /*amark*/): Base(amap, adart) - { CGAL_static_assertion( Bi>=2 && Bi<=Map::dimension ); } + { static_assert( Bi>=2 && Bi<=Map::dimension ); } /// Prefix ++ operator. Self& operator++() @@ -346,7 +346,7 @@ namespace CGAL { typedef Tag_false Use_mark; - CGAL_static_assertion( Bi>1 && delta>1 && Bi+delta<=Map::dimension ); + static_assert( Bi>1 && delta>1 && Bi+delta<=Map::dimension ); public: /// Main constructor. @@ -460,7 +460,7 @@ namespace CGAL { typedef Tag_true Use_mark; - CGAL_static_assertion( 2<=Map::dimension ); + static_assert( 2<=Map::dimension ); public: /// Main constructor. @@ -493,7 +493,7 @@ namespace CGAL { typedef Tag_true Use_mark; - CGAL_static_assertion( 2<=Map::dimension ); + static_assert( 2<=Map::dimension ); public: /// Main constructor. @@ -524,7 +524,7 @@ namespace CGAL { typedef Tag_false Use_mark; - CGAL_static_assertion( delta>1 && delta<=Map::dimension ); + static_assert( delta>1 && delta<=Map::dimension ); public: /// Main constructor. @@ -625,7 +625,7 @@ namespace CGAL { typedef Tag_false Use_mark; - CGAL_static_assertion( delta>1 && delta+1<=Map::dimension ); + static_assert( delta>1 && delta+1<=Map::dimension ); public: /// Main constructor. @@ -726,7 +726,7 @@ namespace CGAL { typedef Tag_false Use_mark; - CGAL_static_assertion( Bi>1 && Bi+1<=Map::dimension ); + static_assert( Bi>1 && Bi+1<=Map::dimension ); public: /// Main constructor. @@ -1026,7 +1026,7 @@ namespace CGAL { typedef Tag_true Use_mark; - CGAL_static_assertion( i>1 && i<=Map::dimension+1 ); + static_assert( i>1 && i<=Map::dimension+1 ); public: /// Main constructor. diff --git a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp index d1bca0f468f5..cbb64ac931c7 100644 --- a/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp +++ b/Convex_hull_3/test/Convex_hull_3/quick_hull_default_traits.cpp @@ -23,12 +23,12 @@ using namespace CGAL::Convex_hull_3::internal; int main() { - CGAL_static_assertion( (std::is_same::type>::value) ); - CGAL_static_assertion( (std::is_same::type>::value) ); - CGAL_static_assertion( (std::is_same::type>::value) ); - CGAL_static_assertion( (std::is_same::type>::value) ); - CGAL_static_assertion( (std::is_same::type>::value) ); - CGAL_static_assertion( (std::is_same,Default_traits_for_Chull_3::type>::value) ); - CGAL_static_assertion( (std::is_same, boost::true_type >::Protector,CGAL::Protect_FPU_rounding >::value) ); + static_assert( (std::is_same::type>::value) ); + static_assert( (std::is_same::type>::value) ); + static_assert( (std::is_same::type>::value) ); + static_assert( (std::is_same::type>::value) ); + static_assert( (std::is_same::type>::value) ); + static_assert( (std::is_same,Default_traits_for_Chull_3::type>::value) ); + static_assert( (std::is_same, boost::true_type >::Protector,CGAL::Protect_FPU_rounding >::value) ); return 0; } diff --git a/Generalized_map/include/CGAL/GMap_cell_iterators.h b/Generalized_map/include/CGAL/GMap_cell_iterators.h index a3851f2c297e..f708a3a1321b 100644 --- a/Generalized_map/include/CGAL/GMap_cell_iterators.h +++ b/Generalized_map/include/CGAL/GMap_cell_iterators.h @@ -70,7 +70,7 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); @@ -183,7 +183,7 @@ namespace CGAL { Base(amap), mmark_number(amap.get_new_mark()) { - CGAL_static_assertion( (std::is_same::value) ); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); mark_cell(amap, (*this), mmark_number); diff --git a/Generalized_map/include/CGAL/GMap_dart_iterators.h b/Generalized_map/include/CGAL/GMap_dart_iterators.h index 600288df844f..1545166af3aa 100644 --- a/Generalized_map/include/CGAL/GMap_dart_iterators.h +++ b/Generalized_map/include/CGAL/GMap_dart_iterators.h @@ -96,7 +96,7 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark - CGAL_static_assertion( Ai>=0 && Ai<=Map::dimension ); + static_assert( Ai>=0 && Ai<=Map::dimension ); public: /// Main constructor. @@ -154,7 +154,7 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - CGAL_static_assertion( (0<=Ai && Ai+delta<=Map::dimension && delta>1) ); + static_assert( (0<=Ai && Ai+delta<=Map::dimension && delta>1) ); public: /// Main constructor. @@ -269,7 +269,7 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - CGAL_static_assertion(0<=Ai && Ai+1<=Map_::dimension); + static_assert(0<=Ai && Ai+1<=Map_::dimension); public: /// Main constructor. @@ -468,7 +468,7 @@ namespace CGAL { typedef Tag_false Use_mark; ///< True iff this iterator uses mark typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - CGAL_static_assertion( (0<=Ai && delta11) ); @@ -508,7 +508,7 @@ namespace CGAL { typedef Tag_true Basic_iterator; ///< True iff this iterator is basic - CGAL_static_assertion( Ai=0 && i<=Map::dimension+1 ); + static_assert( i>=0 && i<=Map::dimension+1 ); public: /// Main constructor. diff --git a/Generalized_map/include/CGAL/Generalized_map.h b/Generalized_map/include/CGAL/Generalized_map.h index 3e0f077a9899..bc9b60c0f905 100644 --- a/Generalized_map/include/CGAL/Generalized_map.h +++ b/Generalized_map/include/CGAL/Generalized_map.h @@ -161,7 +161,7 @@ namespace CGAL { */ Generalized_map_base() { - CGAL_static_assertion_msg(Helper::nb_attribs<=dimension+1, + static_assert(Helper::nb_attribs<=dimension+1, "Too many attributes in the tuple Attributes_enabled"); this->init_storage(); @@ -689,7 +689,7 @@ namespace CGAL { void restricted_set_dart_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "set_dart_attribute called but i-attributes are disabled."); if ( this->template attribute(dh)==ah ) return; @@ -712,7 +712,7 @@ namespace CGAL { void set_dart_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "set_dart_attribute called but i-attributes are disabled."); if ( this->template attribute(dh)==ah ) return; @@ -1347,7 +1347,7 @@ namespace CGAL { template < class Ite > std::ostream& display_orbits(std::ostream & aos) const { - CGAL_static_assertion( (std::is_same::value) ); unsigned int nb = 0; size_type amark = get_new_mark(); @@ -1409,7 +1409,7 @@ namespace CGAL { template typename Attribute_descriptor::type create_attribute(const Args&... args) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "create_attribute but i-attributes are disabled"); typename Attribute_descriptor::type res= std::get::value> @@ -1427,7 +1427,7 @@ namespace CGAL { template void erase_attribute(typename Attribute_descriptor::type h) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "erase_attribute but i-attributes are disabled"); std::get::value> (mattribute_containers).erase(h); @@ -1437,7 +1437,7 @@ namespace CGAL { template bool is_attribute_used(typename Attribute_const_descriptor< i >::type ah) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "is_attribute_used but i-attributes are disabled"); return std::get::value> (mattribute_containers).is_used(ah); @@ -1447,7 +1447,7 @@ namespace CGAL { template size_type number_of_attributes() const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "number_of_attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers).size(); @@ -1461,8 +1461,8 @@ namespace CGAL { void set_attribute(Dart_descriptor dh, typename Attribute_descriptor::type ah) { - CGAL_static_assertion(i<=dimension); - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(i<=dimension); + static_assert(Helper::template Dimension_index::value>=0, "set_attribute but i-attributes are disabled"); for ( typename Dart_of_cell_range::iterator it(*this, dh); it.cont(); ++it) @@ -1476,7 +1476,7 @@ namespace CGAL { template typename Attribute_range::type & attributes() { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers); @@ -1485,7 +1485,7 @@ namespace CGAL { template typename Attribute_const_range::type & attributes() const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attributes but i-attributes are disabled"); return std::get::value> (mattribute_containers); @@ -1498,7 +1498,7 @@ namespace CGAL { typename Attribute_type::type&)>& onsplit_functor() { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1514,7 +1514,7 @@ namespace CGAL { typename Attribute_type::type&)>& onsplit_functor() const { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1530,7 +1530,7 @@ namespace CGAL { typename Attribute_type::type&)>& onmerge_functor() { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); @@ -1545,7 +1545,7 @@ namespace CGAL { typename Attribute_type::type&)>& onmerge_functor() const { - CGAL_static_assertion_msg + static_assert (Helper::template Dimension_index::value>=0, "onsplit_functor but " "i-attributes are disabled"); 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 4a15c8ea733c..4b3c17816e4c 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 @@ -65,9 +65,9 @@ struct GMap_group_attribute_functor_of_dart_run typename GMap::Dart_descriptor dh1, typename GMap::Dart_descriptor dh2) { - CGAL_static_assertion( i<=GMap::dimension ); - CGAL_static_assertion( i!=j ); - CGAL_static_assertion_msg(GMap::Helper::template + static_assert( i<=GMap::dimension ); + static_assert( i!=j ); + static_assert(GMap::Helper::template Dimension_index::value>=0, "GMap_group_attribute_functor_of_dart_run but " "i-attributes are disabled"); @@ -134,9 +134,9 @@ struct GMap_group_attribute_functor_run typename GMap::Dart_descriptor adart1, typename GMap::Dart_descriptor adart2) { - CGAL_static_assertion( i<=GMap::dimension ); - CGAL_static_assertion( i!=j ); - CGAL_static_assertion_msg + static_assert( i<=GMap::dimension ); + static_assert( i!=j ); + static_assert ( GMap::Helper::template Dimension_index::value>=0, "GMap_group_attribute_functor_run but i-attributes are disabled" ); typename GMap::template Attribute_descriptor::type @@ -212,9 +212,9 @@ struct GMap_degroup_attribute_functor_run typename GMap::Dart_descriptor adart1, typename GMap::Dart_descriptor adart2) { - CGAL_static_assertion( i<=GMap::dimension ); - CGAL_static_assertion( i!=j ); - CGAL_static_assertion_msg + static_assert( i<=GMap::dimension ); + static_assert( i!=j ); + static_assert ( GMap::Helper::template Dimension_index::value>=0, "GMap_degroup_attribute_functor_run but i-attributes are disabled" ); @@ -276,7 +276,7 @@ void GMap_test_split_attribute_functor_one_dart unsigned int, typename GMap::Hash_function> & found_attributes, typename GMap::size_type mark ) { - CGAL_static_assertion_msg(GMap::Helper::template + static_assert(GMap::Helper::template Dimension_index::value>=0, "GMap_test_split_attribute_functor_one_dart but " "i-attributes are disabled"); @@ -340,9 +340,9 @@ struct GMap_test_split_attribute_functor_run &modified_darts, typename GMap::size_type mark_modified_darts=GMap::INVALID_MARK) { - CGAL_static_assertion( i<=GMap::dimension ); + static_assert( i<=GMap::dimension ); CGAL_assertion( i!=j ); - CGAL_static_assertion_msg(GMap::Helper::template + static_assert(GMap::Helper::template Dimension_index::value>=0, "GMap_test_split_attribute_functor_run but " "i-attributes are disabled"); @@ -383,9 +383,9 @@ struct GMap_test_split_attribute_functor_run &modified_darts2, typename GMap::size_type mark_modified_darts=GMap::INVALID_MARK) { - CGAL_static_assertion( i<=GMap::dimension ); + static_assert( i<=GMap::dimension ); CGAL_assertion( i!=j ); - CGAL_static_assertion_msg(GMap::Helper::template + static_assert(GMap::Helper::template Dimension_index::value>=0, "GMap_test_split_attribute_functor_run but " "i-attributes are disabled"); diff --git a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h index 15f5bb484bf6..6e9976bca4b7 100644 --- a/Generalized_map/include/CGAL/Generalized_map_iterators_base.h +++ b/Generalized_map/include/CGAL/Generalized_map_iterators_base.h @@ -59,7 +59,7 @@ namespace CGAL { typedef Tag_true Use_mark; - CGAL_static_assertion( (Ai<=Map::dimension && + static_assert( (Ai<=Map::dimension && std::is_same::value) ); public: diff --git a/Generalized_map/include/CGAL/Generalized_map_operations.h b/Generalized_map/include/CGAL/Generalized_map_operations.h index 8366f3495dfe..0ebec7a7c5c5 100644 --- a/Generalized_map/include/CGAL/Generalized_map_operations.h +++ b/Generalized_map/include/CGAL/Generalized_map_operations.h @@ -73,7 +73,7 @@ namespace CGAL static size_t run(GMap& amap, typename GMap::Dart_descriptor adart, bool update_attributes) { - CGAL_static_assertion ( i(adart)) ); size_t res = 0; @@ -292,7 +292,7 @@ namespace CGAL static size_t run(GMap& amap, typename GMap::Dart_descriptor adart, bool update_attributes) { - CGAL_static_assertion ( 1<=i && i<=GMap::dimension ); + static_assert ( 1<=i && i<=GMap::dimension ); CGAL_assertion( (amap.template is_contractible(adart)) ); size_t res = 0; diff --git a/Generalized_map/include/CGAL/Generalized_map_storages.h b/Generalized_map/include/CGAL/Generalized_map_storages.h index 4f40c0a922cc..469741cbb165 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages.h @@ -229,7 +229,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -238,7 +238,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -249,7 +249,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); typename Attribute_descriptor::type res= std::get::value> 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 828004b84164..ffd867477f28 100644 --- a/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h +++ b/Generalized_map/include/CGAL/Generalized_map_storages_with_index.h @@ -220,7 +220,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -229,7 +229,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -240,7 +240,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(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. diff --git a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h index 0dead11c3cab..150efcbf88e0 100644 --- a/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h +++ b/Heat_method_3/include/CGAL/Heat_method_3/Surface_mesh_geodesic_distances_3.h @@ -752,7 +752,7 @@ class Surface_mesh_geodesic_distances_3 > #endif { - CGAL_static_assertion((std::is_same::value) || + static_assert((std::is_same::value) || (std::is_same::value)); // extract real types from Default diff --git a/Installation/include/CGAL/Installation/internal/deprecation_warning.h b/Installation/include/CGAL/Installation/internal/deprecation_warning.h index 0206b5629742..6601ff235205 100644 --- a/Installation/include/CGAL/Installation/internal/deprecation_warning.h +++ b/Installation/include/CGAL/Installation/internal/deprecation_warning.h @@ -71,7 +71,7 @@ #endif #if defined(CGAL_NO_DEPRECATED_CODE) // No deprecated code. -CGAL_static_assertion_msg(false, CGAL_INTERNAL_DEPRECATED_MESSAGE); +static_assert(false, CGAL_INTERNAL_DEPRECATED_MESSAGE); #elif !defined(CGAL_NO_DEPRECATION_WARNINGS) // don't trigger on NO_DEPRECATION_WARNINGS # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__) # pragma message (CGAL_INTERNAL_DEPRECATED_MESSAGE) diff --git a/Installation/test/Installation/test_configuration_qt5.cpp b/Installation/test/Installation/test_configuration_qt5.cpp index af10e898b98a..9a869cc25b6d 100644 --- a/Installation/test/Installation/test_configuration_qt5.cpp +++ b/Installation/test/Installation/test_configuration_qt5.cpp @@ -13,7 +13,7 @@ template typename CGAL::Coercion_traits::Type binary_func(const A& a , const B& b){ typedef CGAL::Coercion_traits CT; - CGAL_static_assertion((CT::Are_explicit_interoperable::value)); + static_assert((CT::Are_explicit_interoperable::value)); typename CT::Cast cast; return cast(a)*cast(b); } diff --git a/Intersections_2/include/CGAL/Intersection_traits.h b/Intersections_2/include/CGAL/Intersection_traits.h index 9cc25059be9d..3bfb327db9e6 100644 --- a/Intersections_2/include/CGAL/Intersection_traits.h +++ b/Intersections_2/include/CGAL/Intersection_traits.h @@ -181,7 +181,7 @@ do_intersect_impl(const A& a, const B& b, Dynamic_dimension_tag) { // inline // typename Intersection_traits< typename Kernel_traits::Kernel, A, B>::result_type >::type // intersection(const A& a, const B& b) { -// CGAL_static_assertion_msg( (std::is_same::value), +// static_assert( (std::is_same::value), // "intersection with objects of different dimensions not supported"); // return internal::intersection_impl(a, b, typename A::Ambient_dimension()); // } @@ -190,7 +190,7 @@ do_intersect_impl(const A& a, const B& b, Dynamic_dimension_tag) { // inline // auto // K::Boolean // do_intersect(const A& a, const B& b) { -// CGAL_static_assertion_msg((std::is_same::value), +// static_assert((std::is_same::value), // "do_intersect with objects of different dimensions not supported"); // return internal::do_intersect_impl(a, b, typename A::Ambient_dimension()); // } diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h index f7ebc70d25ed..183158050e80 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_do_intersect.h @@ -66,7 +66,7 @@ class Do_intersect_bbox_segment_aux_is_greater double dmax; public: - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); Do_intersect_bbox_segment_aux_is_greater() : error(0.), tmax(0.), dmax(0.) {} diff --git a/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h b/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h index 11342ed59638..b82269dbf141 100644 --- a/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h +++ b/Interval_support/include/CGAL/Test/_test_bigfloat_interval_traits.h @@ -41,7 +41,7 @@ void test_bigfloat_interval_traits() { typedef typename BFIT::Is_bigfloat_interval Is_bigfloat_interval; CGAL_USE_TYPE(Is_bigfloat_interval); // using CGAL::Tag_true; - CGAL_static_assertion(( ::std::is_same< Is_bigfloat_interval, CGAL::Tag_true>::value)); + static_assert(( ::std::is_same< Is_bigfloat_interval, CGAL::Tag_true>::value)); const typename BFIT::Construct construct = typename BFIT::Construct(); const typename BFIT::Set_precision set_precision = typename BFIT::Set_precision(); diff --git a/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h b/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h index 34e731dae1a5..59addf6a1fed 100644 --- a/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h +++ b/Interval_support/include/CGAL/Test/_test_convert_to_bfi.h @@ -41,7 +41,7 @@ template void test_convert_to_bfi_from(BFI,From){ typedef typename CGAL::Coercion_traits::Type CT_type; CGAL_USE_TYPE(CT_type); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); assert(CGAL::convert_to_bfi(From(0)) == BFI(0)); assert(CGAL::convert_to_bfi(From(1)) == BFI(1)); assert(CGAL::convert_to_bfi(From(2)) == BFI(2)); diff --git a/Interval_support/include/CGAL/Test/_test_interval_traits.h b/Interval_support/include/CGAL/Test/_test_interval_traits.h index d44384dff797..dffa0a292e9d 100644 --- a/Interval_support/include/CGAL/Test/_test_interval_traits.h +++ b/Interval_support/include/CGAL/Test/_test_interval_traits.h @@ -36,7 +36,7 @@ void test_with_empty_interval(CGAL::Tag_false) { typedef CGAL::Interval_traits IT; typedef typename IT::Empty Empty; CGAL_USE_TYPE(Empty); - CGAL_static_assertion( + static_assert( (::std::is_same< Empty, CGAL::Null_functor>::value)); // this part changes in case we allow empty intersection @@ -74,8 +74,8 @@ void test_interval_traits() { typedef typename IT::With_empty_interval With_empty_interval; CGAL_USE_TYPE(Is_interval); using CGAL::Tag_true; - CGAL_static_assertion(( ::std::is_same< Is_interval, Tag_true>::value)); - CGAL_static_assertion(( ::std::is_same< Interval_, Interval>::value)); + static_assert(( ::std::is_same< Is_interval, Tag_true>::value)); + static_assert(( ::std::is_same< Interval_, Interval>::value)); test_with_empty_interval(With_empty_interval()); diff --git a/Kernel_23/include/CGAL/Circle_2.h b/Kernel_23/include/CGAL/Circle_2.h index 921a30d2206f..48a4896fe4e8 100644 --- a/Kernel_23/include/CGAL/Circle_2.h +++ b/Kernel_23/include/CGAL/Circle_2.h @@ -35,7 +35,7 @@ class Circle_2 : public R_::Kernel_base::Circle_2 typedef typename R_::Aff_transformation_2 Aff_transformation_2; typedef Circle_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Circle_3.h b/Kernel_23/include/CGAL/Circle_3.h index 3030977c225c..4da79afd351a 100644 --- a/Kernel_23/include/CGAL/Circle_3.h +++ b/Kernel_23/include/CGAL/Circle_3.h @@ -43,7 +43,7 @@ template typedef typename R_::Direction_3 Direction_3; typedef Circle_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Direction_2.h b/Kernel_23/include/CGAL/Direction_2.h index e3478708354f..d3376d740213 100644 --- a/Kernel_23/include/CGAL/Direction_2.h +++ b/Kernel_23/include/CGAL/Direction_2.h @@ -38,7 +38,7 @@ class Direction_2 : public R_::Kernel_base::Direction_2 typedef typename R_::Kernel_base::Direction_2 RDirection_2; typedef Direction_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Direction_3.h b/Kernel_23/include/CGAL/Direction_3.h index 6e0eb4930ab6..6c0d13596578 100644 --- a/Kernel_23/include/CGAL/Direction_3.h +++ b/Kernel_23/include/CGAL/Direction_3.h @@ -37,7 +37,7 @@ class Direction_3 : public R_::Kernel_base::Direction_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Direction_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Has_conversion.h b/Kernel_23/include/CGAL/Has_conversion.h index 8e500c916d2c..0a042781facb 100644 --- a/Kernel_23/include/CGAL/Has_conversion.h +++ b/Kernel_23/include/CGAL/Has_conversion.h @@ -23,7 +23,7 @@ namespace internal { template struct Converter_selector { - CGAL_static_assertion_msg((std::is_same::value), "Kernels must have the same representation"); @@ -33,7 +33,7 @@ struct Converter_selector template struct Converter_selector { - CGAL_static_assertion_msg((std::is_same::value), "Kernels must have the same representation"); diff --git a/Kernel_23/include/CGAL/Iso_cuboid_3.h b/Kernel_23/include/CGAL/Iso_cuboid_3.h index a78404b8db0d..35a157c5e63e 100644 --- a/Kernel_23/include/CGAL/Iso_cuboid_3.h +++ b/Kernel_23/include/CGAL/Iso_cuboid_3.h @@ -34,7 +34,7 @@ class Iso_cuboid_3 : public R_::Kernel_base::Iso_cuboid_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Iso_cuboid_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Iso_rectangle_2.h b/Kernel_23/include/CGAL/Iso_rectangle_2.h index 49d2a03b6c3c..b94e3a2086a2 100644 --- a/Kernel_23/include/CGAL/Iso_rectangle_2.h +++ b/Kernel_23/include/CGAL/Iso_rectangle_2.h @@ -33,7 +33,7 @@ class Iso_rectangle_2 : public R_::Kernel_base::Iso_rectangle_2 typedef typename R_::Aff_transformation_2 Aff_transformation_2; typedef Iso_rectangle_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Line_2.h b/Kernel_23/include/CGAL/Line_2.h index 528740a01a9a..81663f033748 100644 --- a/Kernel_23/include/CGAL/Line_2.h +++ b/Kernel_23/include/CGAL/Line_2.h @@ -41,7 +41,7 @@ class Line_2 : public R_::Kernel_base::Line_2 typedef typename R_::Kernel_base::Line_2 RLine_2; typedef Line_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Line_3.h b/Kernel_23/include/CGAL/Line_3.h index 929d658cdc76..6af58a3cfe12 100644 --- a/Kernel_23/include/CGAL/Line_3.h +++ b/Kernel_23/include/CGAL/Line_3.h @@ -38,7 +38,7 @@ class Line_3 : public R_::Kernel_base::Line_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Line_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Plane_3.h b/Kernel_23/include/CGAL/Plane_3.h index 104191a5d64d..f41fc96bb813 100644 --- a/Kernel_23/include/CGAL/Plane_3.h +++ b/Kernel_23/include/CGAL/Plane_3.h @@ -41,7 +41,7 @@ class Plane_3 : public R_::Kernel_base::Plane_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Plane_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Point_2.h b/Kernel_23/include/CGAL/Point_2.h index 87728264781a..ee8df80b3298 100644 --- a/Kernel_23/include/CGAL/Point_2.h +++ b/Kernel_23/include/CGAL/Point_2.h @@ -37,7 +37,7 @@ class Point_2 : public R_::Kernel_base::Point_2 typedef typename R_::Kernel_base::Point_2 RPoint_2; typedef Point_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Point_3.h b/Kernel_23/include/CGAL/Point_3.h index 03d00f78f3f2..27d1d19e0dfe 100644 --- a/Kernel_23/include/CGAL/Point_3.h +++ b/Kernel_23/include/CGAL/Point_3.h @@ -34,7 +34,7 @@ class Point_3 : public R_::Kernel_base::Point_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Point_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Ray_2.h b/Kernel_23/include/CGAL/Ray_2.h index d9dae50482ed..73eecc1c025d 100644 --- a/Kernel_23/include/CGAL/Ray_2.h +++ b/Kernel_23/include/CGAL/Ray_2.h @@ -42,7 +42,7 @@ class Ray_2 : public R_::Kernel_base::Ray_2 typedef typename R_::Kernel_base::Ray_2 RRay_2; typedef Ray_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Ray_3.h b/Kernel_23/include/CGAL/Ray_3.h index b35ae5e78a90..c2880eab254e 100644 --- a/Kernel_23/include/CGAL/Ray_3.h +++ b/Kernel_23/include/CGAL/Ray_3.h @@ -36,7 +36,7 @@ class Ray_3 : public R_::Kernel_base::Ray_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Ray_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Segment_2.h b/Kernel_23/include/CGAL/Segment_2.h index 6209c3a8139f..b789fe25aac8 100644 --- a/Kernel_23/include/CGAL/Segment_2.h +++ b/Kernel_23/include/CGAL/Segment_2.h @@ -40,7 +40,7 @@ class Segment_2 : public R_::Kernel_base::Segment_2 typedef typename R_::Kernel_base::Segment_2 RSegment_2; typedef Segment_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Segment_3.h b/Kernel_23/include/CGAL/Segment_3.h index 7023f5fe3fe1..45aa885fe1d2 100644 --- a/Kernel_23/include/CGAL/Segment_3.h +++ b/Kernel_23/include/CGAL/Segment_3.h @@ -38,7 +38,7 @@ class Segment_3 : public R_::Kernel_base::Segment_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Segment_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Sphere_3.h b/Kernel_23/include/CGAL/Sphere_3.h index 310303fed645..76fa374f831c 100644 --- a/Kernel_23/include/CGAL/Sphere_3.h +++ b/Kernel_23/include/CGAL/Sphere_3.h @@ -37,7 +37,7 @@ class Sphere_3 : public R_::Kernel_base::Sphere_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Sphere_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Tetrahedron_3.h b/Kernel_23/include/CGAL/Tetrahedron_3.h index a8768746f587..58710cbd72ce 100644 --- a/Kernel_23/include/CGAL/Tetrahedron_3.h +++ b/Kernel_23/include/CGAL/Tetrahedron_3.h @@ -33,7 +33,7 @@ class Tetrahedron_3 : public R_::Kernel_base::Tetrahedron_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Tetrahedron_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Triangle_2.h b/Kernel_23/include/CGAL/Triangle_2.h index cf35524a6a42..1e1d38e707e8 100644 --- a/Kernel_23/include/CGAL/Triangle_2.h +++ b/Kernel_23/include/CGAL/Triangle_2.h @@ -35,7 +35,7 @@ class Triangle_2 : public R_::Kernel_base::Triangle_2 typedef typename R_::Kernel_base::Triangle_2 RTriangle_2; typedef Triangle_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Triangle_3.h b/Kernel_23/include/CGAL/Triangle_3.h index 1496121d9fe9..1fe15d8ff8d3 100644 --- a/Kernel_23/include/CGAL/Triangle_3.h +++ b/Kernel_23/include/CGAL/Triangle_3.h @@ -36,7 +36,7 @@ class Triangle_3 : public R_::Kernel_base::Triangle_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Triangle_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Vector_2.h b/Kernel_23/include/CGAL/Vector_2.h index 6e62f77fa5d7..dcb85eaeb4ad 100644 --- a/Kernel_23/include/CGAL/Vector_2.h +++ b/Kernel_23/include/CGAL/Vector_2.h @@ -42,7 +42,7 @@ class Vector_2 : public R_::Kernel_base::Vector_2 typedef typename R_::Kernel_base::Vector_2 RVector_2; typedef Vector_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Vector_3.h b/Kernel_23/include/CGAL/Vector_3.h index f81aee480f42..0d3f16fc2fc5 100644 --- a/Kernel_23/include/CGAL/Vector_3.h +++ b/Kernel_23/include/CGAL/Vector_3.h @@ -42,7 +42,7 @@ class Vector_3 : public R_::Kernel_base::Vector_3 typedef typename R_::Aff_transformation_3 Aff_transformation_3; typedef Vector_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/include/CGAL/Weighted_point_2.h b/Kernel_23/include/CGAL/Weighted_point_2.h index ea4364644a80..d2c4f4a48e1d 100644 --- a/Kernel_23/include/CGAL/Weighted_point_2.h +++ b/Kernel_23/include/CGAL/Weighted_point_2.h @@ -34,7 +34,7 @@ class Weighted_point_2 : public R_::Kernel_base::Weighted_point_2 typedef typename R_::FT RT; typedef Weighted_point_2 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: typedef Dimension_tag<2> Ambient_dimension; diff --git a/Kernel_23/include/CGAL/Weighted_point_3.h b/Kernel_23/include/CGAL/Weighted_point_3.h index c57467fb17af..b9358604af8d 100644 --- a/Kernel_23/include/CGAL/Weighted_point_3.h +++ b/Kernel_23/include/CGAL/Weighted_point_3.h @@ -34,7 +34,7 @@ class Weighted_point_3 : public R_::Kernel_base::Weighted_point_3 typedef typename R_::FT FT; typedef Weighted_point_3 Self; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); public: diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h index 6ea80be2a414..c6d25336aa28 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_2.h @@ -60,9 +60,9 @@ _test_cls_point_2(const R& ) CGAL::Weighted_point_2 wp(p1); CGAL::Point_2 p7(wp); - CGAL_static_assertion(!(boost::is_convertible, + static_assert(!(boost::is_convertible, CGAL::Point_2 >::value)); - CGAL_static_assertion(!(boost::is_convertible, + static_assert(!(boost::is_convertible, CGAL::Weighted_point_2 >::value)); std::cout << '.'; diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h index b09c11e47a70..f96de09c0d9f 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_cls_point_3.h @@ -58,9 +58,9 @@ _test_cls_point_3(const R& ) CGAL::Weighted_point_3 wp(p1); CGAL::Point_3 p7(wp); - CGAL_static_assertion(!(boost::is_convertible, + static_assert(!(boost::is_convertible, CGAL::Point_3 >::value)); - CGAL_static_assertion(!(boost::is_convertible, + static_assert(!(boost::is_convertible, CGAL::Weighted_point_3 >::value)); std::cout << '.'; diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h index 1ec9a1d66af1..525c35eaec7b 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h @@ -253,7 +253,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -262,7 +262,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -273,7 +273,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); typename Attribute_descriptor::type res= std::get::value> diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h index 8417e20b2265..56010ad433ab 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages_with_index.h @@ -287,7 +287,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -296,7 +296,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -307,7 +307,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(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. diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h index c2331a6acfb8..2d4b0f675379 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h @@ -250,7 +250,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -259,7 +259,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (ADart->mattribute_descriptors); @@ -270,7 +270,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "copy_attribute called but i-attributes are disabled."); typename Attribute_descriptor::type res= std::get::value> 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 27d58a7651af..5d260bee1ec0 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 @@ -239,7 +239,7 @@ namespace CGAL { template typename Attribute_descriptor::type attribute(Dart_descriptor ADart) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -248,7 +248,7 @@ namespace CGAL { typename Attribute_const_descriptor::type attribute(Dart_const_descriptor ADart) const { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mdarts[ADart].mattribute_descriptors); @@ -259,7 +259,7 @@ namespace CGAL { typename Attribute_descriptor::type copy_attribute (typename Attribute_const_descriptor::type ah) { - CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, + static_assert(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. diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h index 4569404479d2..4669765f4935 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_base.h @@ -775,7 +775,7 @@ namespace CGAL { Dart_descriptor insert_point_in_cell(Dart_descriptor dh, const Point& p, bool update_attributes=true) { - CGAL_static_assertion(1<=i && i<=2); + static_assert(1<=i && i<=2); if (i==1) return insert_point_in_cell_1(dh, p, update_attributes); return insert_point_in_cell_2(dh, p, update_attributes); } diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h index 1bdac283a67e..e770c67e86c8 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h @@ -48,7 +48,7 @@ namespace CGAL { typedef typename std::list::iterator List_iterator; typedef typename LCC::Point Point; - CGAL_static_assertion( LCC::dimension>=2 && LCC::ambient_dimension==2 ); + static_assert( LCC::dimension>=2 && LCC::ambient_dimension==2 ); CGAL_assertion(edge_indices.size() % 2 == 0); std::vector< typename LCC::Vertex_attribute_descriptor > initVertices; diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h index 4728c9bf2f3f..a895b915b780 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h @@ -120,7 +120,7 @@ namespace CGAL { static typename LCC::Point run(const LCC& amap, typename LCC::Dart_const_descriptor adart) { - CGAL_static_assertion(0 const Point_3& weighted_circumcenter(const GT_& gt) const { - CGAL_static_assertion((std::is_same::value)); if (internal_tbb::is_null(weighted_circumcenter_)) { this->try_to_set_circumcenter( diff --git a/Mesh_3/include/CGAL/Mesh_criteria_3.h b/Mesh_3/include/CGAL/Mesh_criteria_3.h index c7dcfeb33ab6..71e0aa813941 100644 --- a/Mesh_3/include/CGAL/Mesh_criteria_3.h +++ b/Mesh_3/include/CGAL/Mesh_criteria_3.h @@ -98,7 +98,7 @@ class Mesh_criteria_3_impl template void add_facet_criterion(Facet_criterion* criterion) { - CGAL_static_assertion((boost::is_base_of< + static_assert((boost::is_base_of< typename Facet_criteria::Abstract_criterion, Facet_criterion >::value)); @@ -107,7 +107,7 @@ class Mesh_criteria_3_impl template void add_cell_criterion(Cell_criterion* criterion) { - CGAL_static_assertion((boost::is_base_of< + static_assert((boost::is_base_of< typename Cell_criteria::Abstract_criterion, Cell_criterion >::value)); diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_image.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_image.cpp index 9885213a25c3..a427fa7327df 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_3D_image.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_3D_image.cpp @@ -68,7 +68,7 @@ struct Image_tester : public Tester this->verify(c3t3,domain,criteria, Bissection_tag()); typedef typename Mesh_domain::Surface_patch_index Patch_id; - CGAL_static_assertion(CGAL::Output_rep::is_specialized); + static_assert(CGAL::Output_rep::is_specialized); CGAL_USE_TYPE(Patch_id); } diff --git a/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp b/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp index ed1a1fbd14b6..d76899203634 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_3D_image_deprecated.cpp @@ -50,7 +50,7 @@ struct Image_tester : public Tester this->verify(c3t3,domain,criteria, Bissection_tag()); typedef typename Mesh_domain::Surface_patch_index Patch_id; - CGAL_static_assertion(CGAL::Output_rep::is_specialized); + static_assert(CGAL::Output_rep::is_specialized); CGAL_USE_TYPE(Patch_id); } 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 index 1c9607d45cc8..15682e0429be 100644 --- 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 @@ -85,7 +85,7 @@ struct Image_tester : public Tester this->verify(c3t3, domain, criteria, Bissection_tag()); typedef typename Mesh_domain::Surface_patch_index Patch_id; - CGAL_static_assertion(CGAL::Output_rep::is_specialized); + static_assert(CGAL::Output_rep::is_specialized); CGAL_USE_TYPE(Patch_id); } diff --git a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp index 9a0c5677168f..76addcd6f618 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_polyhedron.cpp @@ -35,7 +35,7 @@ struct Polyhedron_tester : public Tester typedef CGAL::Polyhedron_3 Polyhedron; typedef CGAL::Polyhedral_mesh_domain_3 Mesh_domain; - CGAL_static_assertion((std::is_same< + static_assert((std::is_same< typename Mesh_domain::Surface_patch_index, std::pair >::value)); diff --git a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h index a28160ed477a..5ce03215db3d 100644 --- a/Nef_2/include/CGAL/Nef_2/PM_overlayer.h +++ b/Nef_2/include/CGAL/Nef_2/PM_overlayer.h @@ -959,7 +959,7 @@ bool is_forward_edge(const Const_decorator& N, void assert_type_precondition() const { typename PM_decorator_::Point p1; Point p2; - CGAL_static_assertion((std::is_same::value)); } + static_assert((std::is_same::value)); } diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h index 50ac9fbedf8f..b00b0af2d161 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Kernel_d_interface.h @@ -135,8 +135,8 @@ template struct Kernel_d_interface : public Base_ { typedef typename Base::Point_cartesian_const_iterator result_type; // Kernel_d requires a common iterator type for points and vectors // TODO: provide this mixed functor in preKernel? - // CGAL_static_assertion((std::is_same::type>::type, result_type>::value)); - // CGAL_static_assertion((std::is_same::type, result_type>::value)); + // static_assert((std::is_same::type>::type, result_type>::value)); + // static_assert((std::is_same::type, result_type>::value)); template auto operator()(Point_d const&p, Tag_ t)const{ return CPI(this->kernel())(p,t); diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h b/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h index 88a4ed421a99..be1b2b3a6f01 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Vector/array.h @@ -41,7 +41,7 @@ template struct Array_vector { template struct Property : boost::false_type {}; static const unsigned d_=Max_dim_::value; - CGAL_static_assertion(d_ != (unsigned)UNKNOWN_DIMENSION); + static_assert(d_ != (unsigned)UNKNOWN_DIMENSION); typedef std::array Vector; struct Construct_vector { diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h index 2eae60f5576f..c4f7a47040b5 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h @@ -32,7 +32,7 @@ class Hyperplane_d : public Get_type:: typedef typename Get_functor::type HTBase; typedef Hyperplane_d Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h index 42d94a93c73e..ed038e9c95f9 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Point_d.h @@ -40,7 +40,7 @@ class Point_d : public Get_type::type typedef Point_d Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h index fefbca812b78..364a4184e96d 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h @@ -33,7 +33,7 @@ class Ref_count_obj typedef typename Get_functor >::type CBase; typedef Ref_count_obj Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: typedef R_ R; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h index 28bd4e8a8a35..a45ce922e124 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Segment_d.h @@ -35,7 +35,7 @@ class Segment_d : public Get_type::type typedef typename Get_functor::type CSEBase; typedef Segment_d Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h index 7bcd8568dcc7..409c9b65e3f3 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Sphere_d.h @@ -32,7 +32,7 @@ class Sphere_d : public Get_type::type typedef typename Get_functor::type SRBase; typedef Sphere_d Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h index 6d47e86d2f33..9593ef91bbc6 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Wrapper/Vector_d.h @@ -39,7 +39,7 @@ class Vector_d : public Get_type::type typedef typename Get_functor::type SLBase; typedef Vector_d Self; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); public: diff --git a/NewKernel_d/test/NewKernel_d/Epick_d.cpp b/NewKernel_d/test/NewKernel_d/Epick_d.cpp index bbc3b6a128c7..1e88061cbf15 100644 --- a/NewKernel_d/test/NewKernel_d/Epick_d.cpp +++ b/NewKernel_d/test/NewKernel_d/Epick_d.cpp @@ -740,11 +740,11 @@ template struct CGAL::Epick_d; typedef CGAL::Epick_d > Ker2; typedef CGAL::Epick_d > Ker3; typedef CGAL::Epick_d Kerd; -CGAL_static_assertion((std::is_same,Ker2::Dimension>::value)); -CGAL_static_assertion((std::is_same,Ker3::Dimension>::value)); -CGAL_static_assertion((std::is_same::value)); -CGAL_static_assertion((std::is_same,CGAL::Ambient_dimension::type>::value)); -CGAL_static_assertion((std::is_same,CGAL::Ambient_dimension::type>::value)); +static_assert((std::is_same,Ker2::Dimension>::value)); +static_assert((std::is_same,Ker3::Dimension>::value)); +static_assert((std::is_same::value)); +static_assert((std::is_same,CGAL::Ambient_dimension::type>::value)); +static_assert((std::is_same,CGAL::Ambient_dimension::type>::value)); int main(){ //Broken with Linear_base_d (output iterator) //test2 >(); diff --git a/Number_types/include/CGAL/Lazy_exact_nt.h b/Number_types/include/CGAL/Lazy_exact_nt.h index 38c55c62d325..be91713a6749 100644 --- a/Number_types/include/CGAL/Lazy_exact_nt.h +++ b/Number_types/include/CGAL/Lazy_exact_nt.h @@ -944,7 +944,7 @@ struct Div_mod_selector { void operator()( const NT1& x, const NT2& y, NT& q, NT& r ) const { - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< typename Coercion_traits< NT1, NT2 >::Type, NT >::value)); @@ -1029,7 +1029,7 @@ template < typename ET > class Real_embeddable_traits< Lazy_exact_nt > : public INTERN_RET::Real_embeddable_traits_base< Lazy_exact_nt , CGAL::Tag_true > { // Every type ET of Lazy_exact_nt has to be real embeddable. - CGAL_static_assertion((::std::is_same< typename Real_embeddable_traits< ET > + static_assert((::std::is_same< typename Real_embeddable_traits< ET > ::Is_real_embeddable, Tag_true >::value)); public: diff --git a/Number_types/include/CGAL/Mpzf.h b/Number_types/include/CGAL/Mpzf.h index c2689f3ee455..daa0d9222b54 100644 --- a/Number_types/include/CGAL/Mpzf.h +++ b/Number_types/include/CGAL/Mpzf.h @@ -148,7 +148,7 @@ template struct pool2 { static bool empty() { return data() == 0; } static const int extra = 1; // TODO: handle the case where a pointer is larger than a mp_limb_t private: - CGAL_static_assertion(sizeof(T) >= sizeof(T*)); + static_assert(sizeof(T) >= sizeof(T*)); static T& data () { static CGAL_MPZF_TLS T data_ = 0; return data_; @@ -162,7 +162,7 @@ template struct pool3 { static bool empty() { return data() == 0; } static const int extra = 1; // TODO: handle the case where a pointer is larger than a mp_limb_t private: - CGAL_static_assertion(sizeof(T) >= sizeof(T*)); + static_assert(sizeof(T) >= sizeof(T*)); struct cleaner { T data_ = 0; ~cleaner(){ @@ -455,7 +455,7 @@ struct Mpzf { } int e1 = (int)dexp+13; // FIXME: make it more general! But not slower... - CGAL_static_assertion(GMP_NUMB_BITS == 64); + static_assert(GMP_NUMB_BITS == 64); int e2 = e1 % 64; exp = e1 / 64 - 17; // 52+1023+13==17*64 ? diff --git a/Number_types/include/CGAL/Root_of_traits.h b/Number_types/include/CGAL/Root_of_traits.h index a1a941277bc2..c014e667293d 100644 --- a/Number_types/include/CGAL/Root_of_traits.h +++ b/Number_types/include/CGAL/Root_of_traits.h @@ -150,7 +150,7 @@ struct Root_of_traits_helper < FT, Field_tag > // We have the typedef as VC10 fails with // static_assert(FrT::Is_fraction::value) typedef typename FrT::Is_fraction ISF; - CGAL_static_assertion((ISF::value)); + static_assert((ISF::value)); typedef typename FrT::Numerator_type RT; diff --git a/Number_types/include/CGAL/Test/test_root_of_traits.h b/Number_types/include/CGAL/Test/test_root_of_traits.h index ae1c7768852a..23f4b5dafc73 100644 --- a/Number_types/include/CGAL/Test/test_root_of_traits.h +++ b/Number_types/include/CGAL/Test/test_root_of_traits.h @@ -28,8 +28,8 @@ void test_root_of_traits(){ typedef typename RoT::Root_of_1 Root_of_1; typedef typename RoT::Root_of_2 Root_of_2; - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef typename RoT::Make_root_of_2 Make_root_of_2; typedef typename RoT::Make_sqrt Make_sqrt; @@ -41,10 +41,10 @@ void test_root_of_traits(){ const Inverse& inverse = Inverse(); const Square& square = Square(); - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); { diff --git a/Number_types/include/CGAL/mpq_class.h b/Number_types/include/CGAL/mpq_class.h index a651b674202c..7348097644e9 100644 --- a/Number_types/include/CGAL/mpq_class.h +++ b/Number_types/include/CGAL/mpq_class.h @@ -35,7 +35,7 @@ // while ::__gmp_expr is the others "expressions". #define CGAL_CHECK_GMP_EXPR_MPQ_CLASS \ - CGAL_static_assertion( \ + static_assert( \ (::std::is_same< ::__gmp_expr< T , T >,Type>::value )); namespace CGAL { diff --git a/Number_types/include/CGAL/mpz_class.h b/Number_types/include/CGAL/mpz_class.h index 9b868199f9f3..c8899fc1b971 100644 --- a/Number_types/include/CGAL/mpz_class.h +++ b/Number_types/include/CGAL/mpz_class.h @@ -38,7 +38,7 @@ #include #define CGAL_CHECK_GMP_EXPR \ - CGAL_static_assertion( \ + static_assert( \ (::std::is_same< ::__gmp_expr< T , T >,Type>::value )); namespace CGAL { diff --git a/Number_types/include/CGAL/simplest_rational_in_interval.h b/Number_types/include/CGAL/simplest_rational_in_interval.h index 374d89e1fd2c..a93bcc855b49 100644 --- a/Number_types/include/CGAL/simplest_rational_in_interval.h +++ b/Number_types/include/CGAL/simplest_rational_in_interval.h @@ -43,10 +43,10 @@ simplest_rational_in_interval(double x, double y) { // Must be a fraction CGAL_USE_TYPE(Is_fraction); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); // Numerator_type,Denominator_type must be the same CGAL_USE_TYPE(Denominator_type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); if(x == y){ diff --git a/Number_types/include/CGAL/to_rational.h b/Number_types/include/CGAL/to_rational.h index add67aeb6ccc..d60f56b3eb24 100644 --- a/Number_types/include/CGAL/to_rational.h +++ b/Number_types/include/CGAL/to_rational.h @@ -34,9 +34,9 @@ to_rational(double x) typedef typename FT::Denominator_type Denominator_type; typename FT::Compose compose; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); CGAL_USE_TYPE(Is_fraction); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); CGAL_USE_TYPE(Denominator_type); Numerator_type num(0),den(1); diff --git a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp index 54a1ea8581e5..f80b17bc1bae 100644 --- a/Number_types/test/Number_types/Lazy_exact_nt_new.cpp +++ b/Number_types/test/Number_types/Lazy_exact_nt_new.cpp @@ -81,9 +81,9 @@ void test_lazy_exact_nt() { typedef CGAL::Lazy_exact_nt< typename AK::Integer > LI; typedef CGAL::Lazy_exact_nt< typename AK::Rational > LR; typedef CGAL::Coercion_traits CT; - CGAL_static_assertion((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); - CGAL_static_assertion((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - CGAL_static_assertion((std::is_same< typename CT::Type,LR>::value)); + static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); + static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); + static_assert((std::is_same< typename CT::Type,LR>::value)); LI i(4); LR r(4); @@ -99,8 +99,8 @@ void test_lazy_exact_nt() { typedef CGAL::Lazy_exact_nt T1; typedef CGAL::Lazy_exact_nt T2; typedef CGAL::Coercion_traits CT; - CGAL_static_assertion((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_false>::value)); - CGAL_static_assertion((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_false>::value)); + static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_false>::value)); + static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_false>::value)); #endif #endif } diff --git a/Number_types/test/Number_types/Quotient_new.cpp b/Number_types/test/Number_types/Quotient_new.cpp index 65450205e875..079ea8fbc02b 100644 --- a/Number_types/test/Number_types/Quotient_new.cpp +++ b/Number_types/test/Number_types/Quotient_new.cpp @@ -62,9 +62,9 @@ void test_quotient() { typedef CGAL::Quotient QI; typedef CGAL::Coercion_traits CT; CGAL_USE_TYPE(CT); - CGAL_static_assertion((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); - CGAL_static_assertion((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); - CGAL_static_assertion((std::is_same< typename CT::Type,QI>::value)); + static_assert((std::is_same< typename CT::Are_explicit_interoperable,CGAL::Tag_true>::value)); + static_assert((std::is_same< typename CT::Are_implicit_interoperable,CGAL::Tag_true>::value)); + static_assert((std::is_same< typename CT::Type,QI>::value)); } } diff --git a/Number_types/test/Number_types/Sqrt_extension.h b/Number_types/test/Number_types/Sqrt_extension.h index b2c8f42d47d2..547aaf10ab92 100644 --- a/Number_types/test/Number_types/Sqrt_extension.h +++ b/Number_types/test/Number_types/Sqrt_extension.h @@ -24,7 +24,7 @@ void convert_to(const NT& x, RT& r){ typedef CGAL::Coercion_traits CT; typedef typename CT::Type Type; CGAL_USE_TYPE(Type); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); r = typename CT::Cast()(x); } } //namespace CGAL @@ -700,17 +700,17 @@ void test_get_arithmetic_kernel(){ typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } { typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } { typedef CGAL::Sqrt_extension EXT; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AT_; CGAL_USE_TYPE(AT_); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } } diff --git a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h index bb979e588f36..fddad9865341 100644 --- a/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h +++ b/Number_types/test/Number_types/include/CGAL/Test/test_root_of_2_traits.h @@ -7,12 +7,12 @@ void test_root_of_traits(){ typedef typename RoT::Root_of_1 Root_of_1; typedef typename RoT::Root_of_2 Root_of_2; - CGAL_static_assertion((::std::is_same::value)); - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); + static_assert((::std::is_same::value)); typedef typename RoT::Make_root_of_2 Make_root_of_2; typedef typename Make_root_of_2::result_type result_type; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); const Make_root_of_2& make_root_of_2 = Make_root_of_2(); Root_of_2 r = make_root_of_2(T(0),T(-1),T(2)); //-sqrt(2) diff --git a/Number_types/test/Number_types/ioformat.cpp b/Number_types/test/Number_types/ioformat.cpp index 4d9a66563211..54eaa26bf227 100644 --- a/Number_types/test/Number_types/ioformat.cpp +++ b/Number_types/test/Number_types/ioformat.cpp @@ -106,7 +106,7 @@ int main() // CORE #ifdef CGAL_USE_CORE - CGAL_static_assertion(CGAL::Output_rep::is_specialized == true); + static_assert(CGAL::Output_rep::is_specialized == true); //bug in io for CORE. test_it("CORE::BigInt"); test_it("CORE::BigRat"); @@ -116,7 +116,7 @@ int main() // LEDA based NTs #ifdef CGAL_USE_LEDA - CGAL_static_assertion(CGAL::Output_rep::is_specialized == true); + static_assert(CGAL::Output_rep::is_specialized == true); test_it("leda_integer"); test_it("leda_rational"); test_it("leda_bigfloat"); diff --git a/Number_types/test/Number_types/known_bit_size_integers.cpp b/Number_types/test/Number_types/known_bit_size_integers.cpp index 0172db54dac2..fce35d25f647 100644 --- a/Number_types/test/Number_types/known_bit_size_integers.cpp +++ b/Number_types/test/Number_types/known_bit_size_integers.cpp @@ -7,18 +7,18 @@ int main() std::cout << "Verifying the sizes of boost::[u]int{8,16,32,64}_t" << std::endl; - CGAL_static_assertion(sizeof(boost::int8_t) == 1); - CGAL_static_assertion(sizeof(boost::int16_t) == 2); - CGAL_static_assertion(sizeof(boost::int32_t) == 4); + static_assert(sizeof(boost::int8_t) == 1); + static_assert(sizeof(boost::int16_t) == 2); + static_assert(sizeof(boost::int32_t) == 4); #ifndef BOOST_NO_INT64_T - CGAL_static_assertion(sizeof(boost::int64_t) == 8); + static_assert(sizeof(boost::int64_t) == 8); #endif - CGAL_static_assertion(sizeof(boost::uint8_t) == 1); - CGAL_static_assertion(sizeof(boost::uint16_t) == 2); - CGAL_static_assertion(sizeof(boost::uint32_t) == 4); + static_assert(sizeof(boost::uint8_t) == 1); + static_assert(sizeof(boost::uint16_t) == 2); + static_assert(sizeof(boost::uint32_t) == 4); #ifndef BOOST_NO_INT64_T - CGAL_static_assertion(sizeof(boost::uint64_t) == 8); + static_assert(sizeof(boost::uint64_t) == 8); #endif return 0; diff --git a/Number_types/test/Number_types/test_nt_Coercion_traits.cpp b/Number_types/test/Number_types/test_nt_Coercion_traits.cpp index ad73c7555c66..bb7d28b3eab1 100644 --- a/Number_types/test/Number_types/test_nt_Coercion_traits.cpp +++ b/Number_types/test/Number_types/test_nt_Coercion_traits.cpp @@ -144,9 +144,9 @@ void AT_coercion_test_for_cgal_types_rat(){ typedef typename AT::Bigfloat_interval Bigfloat_interval; CGAL_USE_TYPE(Bigfloat_interval); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); CGAL::test_explicit_interoperable_from_to(); CGAL::test_explicit_interoperable_from_to(); @@ -205,10 +205,10 @@ void AT_coercion_test_for_cgal_types_fws(){ typedef typename AT::Field_with_sqrt Real; CGAL_USE_TYPE(Bigfloat_interval); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); - CGAL_static_assertion(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); + static_assert(!(::std::is_same::value)); typedef CGAL::Sqrt_extension Extn_1; diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h index 12b37586a41e..110123898a51 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/optimize_2.h @@ -117,7 +117,7 @@ void optimize_along_OBB_axes(typename Traits::Matrix& rot, typedef typename Traits::Matrix Matrix; typedef typename Traits::Vector Vector; - CGAL_static_assertion((std::is_same::type, Point>::value)); + static_assert((std::is_same::type, Point>::value)); std::vector rotated_points; rotated_points.reserve(points.size()); diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h index 037df4524780..08b39186cf4e 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/oriented_bounding_box.h @@ -202,7 +202,7 @@ void construct_oriented_bounding_box(const PointRange& points, { typedef typename Traits::Point_3 Point; - CGAL_static_assertion((std::is_same::type, Point>::value)); + static_assert((std::is_same::type, Point>::value)); if(use_ch) // construct the convex hull to reduce the number of points { @@ -341,7 +341,7 @@ void oriented_bounding_box(const PointRange& points, NamedParameters, Default_traits>::type Geom_traits; - CGAL_static_assertion_msg(!(std::is_same::value), + static_assert(!(std::is_same::value), "You must provide a traits class or have Eigen enabled!"); Geom_traits traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); diff --git a/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h b/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h index dcda82d9555f..43bf9c7db420 100644 --- a/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h +++ b/Point_set_processing_3/include/CGAL/OpenGR/compute_registration_transformation.h @@ -309,13 +309,13 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point typedef Point_set_processing_3_np_helper NP_helper2; typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The vector type of input ranges must be the same"); diff --git a/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h b/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h index 5e5d7853beef..08012fe33977 100644 --- a/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h +++ b/Point_set_processing_3/include/CGAL/OpenGR/register_point_sets.h @@ -222,13 +222,13 @@ register_point_sets (const PointRange1& point_set_1, PointRange2& point_set_2, typedef Point_set_processing_3_np_helper NP_helper2; typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The vector type of input ranges must be the same"); diff --git a/Point_set_processing_3/include/CGAL/cluster_point_set.h b/Point_set_processing_3/include/CGAL/cluster_point_set.h index c79cd850df17..6381c456917d 100644 --- a/Point_set_processing_3/include/CGAL/cluster_point_set.h +++ b/Point_set_processing_3/include/CGAL/cluster_point_set.h @@ -145,7 +145,7 @@ std::size_t cluster_point_set (PointRange& points, typedef typename NP_helper::Geom_traits Kernel; typedef typename Point_set_processing_3::GetAdjacencies::type Adjacencies; - CGAL_static_assertion_msg(!(std::is_same::type, + static_assert(!(std::is_same::type, typename GetSvdTraits::NoTraits>::value), "Error: no SVD traits"); diff --git a/Point_set_processing_3/include/CGAL/jet_estimate_normals.h b/Point_set_processing_3/include/CGAL/jet_estimate_normals.h index d808a6ee46f1..1465fc7e3573 100644 --- a/Point_set_processing_3/include/CGAL/jet_estimate_normals.h +++ b/Point_set_processing_3/include/CGAL/jet_estimate_normals.h @@ -197,7 +197,7 @@ jet_estimate_normals( typedef typename GetSvdTraits::type SvdTraits; CGAL_assertion_msg(NP_helper::has_normal_map(points, np), "Error: no normal map"); - CGAL_static_assertion_msg(!(std::is_same::NoTraits>::value), "Error: no SVD traits"); diff --git a/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h b/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h index c8982be75173..952f2c0d5956 100644 --- a/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h +++ b/Point_set_processing_3/include/CGAL/jet_smooth_point_set.h @@ -200,7 +200,7 @@ jet_smooth_point_set( typedef typename NP_helper::Geom_traits Kernel; typedef typename GetSvdTraits::type SvdTraits; - CGAL_static_assertion_msg(!(std::is_same::NoTraits>::value), "Error: no SVD traits"); diff --git a/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h b/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h index e8dac2ddc2be..cb47b1a69c1d 100644 --- a/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h +++ b/Point_set_processing_3/include/CGAL/pointmatcher/compute_registration_transformation.h @@ -607,13 +607,13 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point // property map types typedef typename NP_helper1::Const_point_map PointMap1; typedef typename NP_helper2::Const_point_map PointMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The point type of input ranges must be the same"); typedef typename NP_helper1::Normal_map NormalMap1; typedef typename NP_helper2::Normal_map NormalMap2; - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The vector type of input ranges must be the same"); @@ -630,7 +630,7 @@ compute_registration_transformation (const PointRange1& point_set_1, const Point NormalMap2 normal_map2 = NP_helper2::get_normal_map(point_set_2, np2); auto weight_map2 = choose_parameter(get_parameter(np2, internal_np::scalar_map), DefaultWeightMap2(Scalar(1))); - CGAL_static_assertion_msg((std::is_same< typename boost::property_traits::value_type, + static_assert((std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type> ::value), "The scalar type of input ranges must be the same"); diff --git a/Point_set_processing_3/include/CGAL/structure_point_set.h b/Point_set_processing_3/include/CGAL/structure_point_set.h index 043001e3b04a..58b3cbee86d0 100644 --- a/Point_set_processing_3/include/CGAL/structure_point_set.h +++ b/Point_set_processing_3/include/CGAL/structure_point_set.h @@ -234,7 +234,7 @@ class Point_set_with_structure typedef typename Point_set_processing_3::GetPlaneIndexMap::type PlaneIndexMap; CGAL_assertion_msg(NP_helper::has_normal_map(points, np), "Error: no normal map"); - CGAL_static_assertion_msg((!is_default_parameter::value), + static_assert((!is_default_parameter::value), "Error: no plane index map"); PointMap point_map = NP_helper::get_const_point_map(points, np); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h index ee92e8e36405..691ddfa6a3bf 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/clip.h @@ -444,7 +444,7 @@ generic_clip_impl( typedef typename GetVertexPointMap::type Vpm2; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); Vpm vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h index 525f020a342a..991c4b33c4b2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/connected_components.h @@ -553,7 +553,7 @@ std::size_t keep_large_connected_components(PolygonMesh& pmesh, >::type FaceSizeMap; typedef typename boost::property_traits::value_type Face_size; - CGAL_static_assertion((std::is_convertible::value)); + static_assert((std::is_convertible::value)); typedef typename internal_np::Lookup_named_param_def::type VPM1; typedef typename GetVertexPointMap::type VPM2; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); VPM1 vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), @@ -694,7 +694,7 @@ corefine( TriangleMesh& tm1, typedef typename GetVertexPointMap::type VPM1; typedef typename GetVertexPointMap::type VPM2; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); VPM1 vpm1 = choose_parameter(get_parameter(np1, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 4237fa85b6f8..6d221c77bb9e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -155,7 +155,7 @@ double max_distance_to_mesh_impl(const PointRange& sample_points, using FT = typename Kernel::FT; #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if(boost::is_convertible::value) @@ -1037,7 +1037,7 @@ sample_triangle_soup(const PointRange& points, typedef typename PointRange::value_type Point_3; typedef typename Kernel_traits::Kernel GeomTraits; - CGAL_static_assertion_msg((std::is_same::value), "Wrong point type."); + static_assert((std::is_same::value), "Wrong point type."); CGAL_precondition(!triangles.empty()); @@ -1995,7 +1995,7 @@ bounded_error_squared_one_sided_Hausdorff_distance_impl(const TriangleMesh1& tm1 OutputIterator& out) { #if !defined(CGAL_LINKED_WITH_TBB) || !defined(CGAL_METIS_ENABLED) - CGAL_static_assertion_msg(!(boost::is_convertible::value), + static_assert(!(boost::is_convertible::value), "Parallel_tag is enabled but at least TBB or METIS is unavailable."); #endif @@ -2270,7 +2270,7 @@ bounded_error_squared_symmetric_Hausdorff_distance_impl(const TriangleMesh1& tm1 OutputIterator2& out2) { #if !defined(CGAL_LINKED_WITH_TBB) || !defined(CGAL_METIS_ENABLED) - CGAL_static_assertion_msg(!(boost::is_convertible::value), + static_assert(!(boost::is_convertible::value), "Parallel_tag is enabled but at least TBB or METIS is unavailable."); #endif diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h index 28958df8ac08..60829f726230 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h @@ -151,11 +151,11 @@ bool fair(TriangleMesh& tmesh, #endif #if defined(CGAL_EIGEN3_ENABLED) - CGAL_static_assertion_msg( + static_assert( (!std::is_same::type, bool>::value) || EIGEN_VERSION_AT_LEAST(3, 2, 0), "The function `fair` requires Eigen3 version 3.2 or later."); #else - CGAL_static_assertion_msg( + static_assert( (!std::is_same::type, bool>::value), "The function `fair` requires Eigen3 version 3.2 or later."); #endif diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h index 47be440cd3aa..aaf34efd11d7 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersect_triangle_and_segment_3.h @@ -98,7 +98,7 @@ intersection_type( typedef typename boost::property_traits::value_type Point_3; typedef typename Kernel_traits::Kernel Kernel; - CGAL_static_assertion((std::is_same::value_type>::value)); + static_assert((std::is_same::value_type>::value)); halfedge_descriptor h_2=halfedge(f_2,tm2); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h index 64933af6b3b8..81f3ca6478db 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_nodes.h @@ -49,7 +49,7 @@ class Intersection_nodes::value_type Point_3; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); typedef typename Kernel_traits::Kernel Input_kernel; @@ -151,7 +151,7 @@ class Intersection_nodes::value_type Point_3; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); typedef typename Kernel_traits::Kernel Input_kernel; @@ -328,7 +328,7 @@ class Intersection_nodes::value_type Point_3; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); typedef typename Kernel_traits::Kernel Input_kernel; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h index 0e73d4be013c..7929697aec2a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Corefinement/intersection_of_coplanar_triangles_3.h @@ -32,7 +32,7 @@ struct Intersect_coplanar_faces_3 // typedefs typedef typename boost::property_traits::value_type Point; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); typedef typename CGAL::Kernel_traits::Kernel Input_kernel; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h index 62c1dc6d3e25..3effaee63d36 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap.h @@ -925,7 +925,7 @@ std::size_t snap_non_conformal_one_way(const HalfedgeRange& halfedge_range_S, #endif #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else // CGAL_LINKED_WITH_TBB if(std::is_convertible::value) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h index d821f88320b5..a9128a244df1 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/Snapping/snap_vertices.h @@ -371,7 +371,7 @@ void find_vertex_vertex_matches_with_kd_tree(Unique_positions& unique_positions_ tree.insert(unique_positions_Bv.begin(), unique_positions_Bv.end()); #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else // parallel @@ -596,7 +596,7 @@ void find_vertex_vertex_matches_with_box_d(const Unique_positions& unique_positi boxes_B_ptr.push_back(&b); #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else // CGAL_LINKED_WITH_TBB if(std::is_convertible::value) @@ -729,7 +729,7 @@ std::size_t snap_vertices_two_way(const HalfedgeRange_A& halfedge_range_A, using parameters::get_parameter; using parameters::get_parameter_reference; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); GT gt = choose_parameter(get_parameter(np_A, internal_np::geom_traits)); VPM_A vpm_A = choose_parameter(get_parameter(np_A, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h index 7d1b1b6e6bfd..4f66b558cc7e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/intersection.h @@ -425,7 +425,7 @@ compute_face_face_intersection(const FaceRange& face_range1, get_const_property_map(boost::vertex_point, tm1)); VertexPointMap2 vpmap2 = choose_parameter(get_parameter(np2, internal_np::vertex_point), get_const_property_map(boost::vertex_point, tm2)); - CGAL_static_assertion( + static_assert( (std::is_same< typename boost::property_traits::value_type, typename boost::property_traits::value_type @@ -543,7 +543,7 @@ compute_face_polyline_intersection(const FaceRange& face_range, VertexPointMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(boost::vertex_point, tm)); typedef typename boost::property_traits::value_type Point; - CGAL_static_assertion( + static_assert( (std::is_same::type>::value)); @@ -681,7 +681,7 @@ compute_face_polylines_intersection(const FaceRange& face_range, get_const_property_map(boost::vertex_point, tm)); typedef typename boost::property_traits::value_type Point; typedef typename boost::range_value::type Polyline; - CGAL_static_assertion((std::is_same::type>::value)); + static_assert((std::is_same::type>::value)); std::vector faces; faces.reserve(std::distance( boost::begin(face_range), boost::end(face_range) )); @@ -1742,7 +1742,7 @@ surface_intersection(const TriangleMesh& tm1, typedef typename GetVertexPointMap::const_type VPM1; typedef typename GetVertexPointMap::const_type VPM2; - CGAL_static_assertion((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value)); VPM1 vpm1 = parameters::choose_parameter(parameters::get_parameter(np1, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 2d5d92374baa..04e5cc6a1441 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -1661,7 +1661,7 @@ locate_with_AABB_tree(const typename internal::Location_traits AABB_traits; typedef typename Primitive::Point Point_3; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); typedef typename GetVertexPointMap::const_type VertexPointMap; typedef internal::Point_to_Point_3_VPM WrappedVPM; @@ -1754,7 +1754,7 @@ locate(const typename internal::Location_traits:: using parameters::get_parameter; using parameters::choose_parameter; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); const VertexPointMap vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), get_const_property_map(boost::vertex_point, tm)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h index ac5a340d8169..96af10bad1e2 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h @@ -985,7 +985,7 @@ void match_faces(const PolygonMesh1& m1, get_const_property_map(vertex_point, m1)); const VPMap2 vpm2 = choose_parameter(get_parameter(np2, internal_np::vertex_point), get_const_property_map(vertex_point, m2)); - CGAL_static_assertion_msg((std::is_same::value_type, + static_assert((std::is_same::value_type, typename boost::property_traits::value_type>::value), "Both vertex point maps must have the same point type."); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h index 612620049a0e..e395080f4a72 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/orient_polygon_soup_extension.h @@ -159,7 +159,7 @@ void orient_triangle_soup_with_reference_triangle_soup(const ReferencePointRange typedef typename boost::property_traits::reference PM2_Point_ref; typedef typename boost::property_traits::value_type Point_3; - CGAL_static_assertion((std::is_same::value_type>::value)); + static_assert((std::is_same::value_type>::value)); typedef typename CGAL::Kernel_traits::Kernel K; typedef typename K::Triangle_3 Triangle; @@ -215,7 +215,7 @@ void orient_triangle_soup_with_reference_triangle_soup(const ReferencePointRange }; #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if(std::is_convertible::value) @@ -309,7 +309,7 @@ void orient_triangle_soup_with_reference_triangle_mesh(const TriangleMesh& tm_re PointMap point_map = NP_helper::get_const_point_map(points, np2); - CGAL_static_assertion((std::is_same::value_type>::value)); + static_assert((std::is_same::value_type>::value)); K k = choose_parameter(get_parameter(np1, internal_np::geom_traits)); @@ -352,7 +352,7 @@ void orient_triangle_soup_with_reference_triangle_mesh(const TriangleMesh& tm_re }; #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (boost::is_convertible::value) diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h index d0b22f7b5ef3..f247b361f435 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_mesh_to_polygon_soup.h @@ -39,7 +39,7 @@ struct PM_to_PS_point_converter { PS_Point operator()(const PM_Point& p) const { - CGAL_static_assertion((std::is_convertible::value)); + static_assert((std::is_convertible::value)); return PS_Point(p); } }; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h index bd543f5d390d..cc1d299702f5 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h @@ -43,7 +43,7 @@ namespace internal { template PM_Point convert_to_pm_point(const PS_Point& p) { - CGAL_static_assertion((std::is_convertible::value)); + static_assert((std::is_convertible::value)); return PM_Point(p); } @@ -353,10 +353,10 @@ void polygon_soup_to_polygon_mesh(const PointRange& points, choose_parameter(get_parameter(np_ps, internal_np::polygon_to_face_output_iterator), impl::make_functor(get_parameter(np_ps, internal_np::polygon_to_face_map)))); - CGAL_static_assertion_msg( + static_assert( (parameters::is_default_parameter::value), "Named parameter vertex_to_vertex_map was renamed point_to_vertex_map"); - CGAL_static_assertion_msg( + static_assert( (parameters::is_default_parameter::value), "Named parameter face_to_face_map was renamed polygon_to_face_map"); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h index 5a922c7cbffe..edfdb559bf55 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/repair_self_intersections.h @@ -178,7 +178,7 @@ FaceOutputIterator replace_faces_with_patch(const std::vector::value_type, Point>::value)); + static_assert((std::is_same::value_type, Point>::value)); typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/self_intersections.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/self_intersections.h index 3524b46c7758..3d085dbb27f4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/self_intersections.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/self_intersections.h @@ -423,7 +423,7 @@ self_intersections_impl(const FaceRange& face_range, Throwing_filter throwing_filter(tmesh, vpmap, gt, Throwing_output_iterator()); #if !defined(CGAL_LINKED_WITH_TBB) - CGAL_static_assertion_msg (!(std::is_convertible::value), + static_assert (!(std::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if(std::is_convertible::value) 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 bd4e8ad8ab25..5fa0076b537e 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 @@ -154,11 +154,11 @@ void smooth_shape(const FaceRange& faces, #endif #if defined(CGAL_EIGEN3_ENABLED) - CGAL_static_assertion_msg( + static_assert( (!std::is_same::type, bool>::value) || EIGEN_VERSION_AT_LEAST(3, 2, 0), "Eigen3 version 3.2 or later is required."); #else - CGAL_static_assertion_msg( + static_assert( (!std::is_same::type, bool>::value), "Eigen3 version 3.2 or later is required."); #endif diff --git a/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h b/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h index d6cbd4204789..3ed4b89f06ed 100644 --- a/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h +++ b/Polygon_mesh_processing/include/CGAL/Rigid_triangle_mesh_collision_detection.h @@ -250,7 +250,7 @@ class Rigid_triangle_mesh_collision_detection { // handle vpm typedef typename CGAL::GetVertexPointMap::const_type Local_vpm; - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); Vpm vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), @@ -562,7 +562,7 @@ class Rigid_triangle_mesh_collision_detection parameters::get_parameter(np, internal_np::apply_per_connected_component), true); typedef typename CGAL::GetVertexPointMap::const_type Local_vpm; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); Vpm vpm = parameters::choose_parameter(parameters::get_parameter(np, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h index 00bc1225b142..c12178a1b9cf 100644 --- a/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h +++ b/Polygon_mesh_processing/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Polyhedral_envelope_filter.h @@ -58,7 +58,7 @@ class Polyhedral_envelope_filter template void initialize_envelope(const Profile& profile) const { - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp index 2767dad9338f..8aeaab049db5 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_locate.cpp @@ -522,7 +522,7 @@ struct Locate_with_AABB_tree_Tester // 2D case typedef CGAL::AABB_face_graph_triangle_primitive AABB_face_graph_primitive; typedef CGAL::AABB_traits AABB_face_graph_traits; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); Intrinsic_point_to_Point_3 to_p3; @@ -633,7 +633,7 @@ struct Locate_with_AABB_tree_Tester // 3D typedef CGAL::AABB_traits AABB_face_graph_traits; typedef typename K::Point_3 Point_3; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); CGAL::AABB_tree tree_a; Point_reference p3_a = get(vpm, v); diff --git a/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h b/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h index 363ef73cfa27..c284f6e60b19 100644 --- a/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h +++ b/Polyhedron/include/CGAL/Polyhedron_3_to_lcc.h @@ -30,7 +30,7 @@ namespace CGAL { typename LCC::Dart_descriptor import_from_polyhedron_3(LCC& alcc, const Polyhedron &apoly) { - CGAL_static_assertion( LCC::dimension>=2 && LCC::ambient_dimension==3 ); + static_assert( LCC::dimension>=2 && LCC::ambient_dimension==3 ); typedef typename Polyhedron::Halfedge_const_handle Halfedge_handle; typedef typename Polyhedron::Facet_const_iterator Facet_iterator; diff --git a/Polynomial/include/CGAL/Exponent_vector.h b/Polynomial/include/CGAL/Exponent_vector.h index 72c5e1d8f260..826a9417ffd6 100644 --- a/Polynomial/include/CGAL/Exponent_vector.h +++ b/Polynomial/include/CGAL/Exponent_vector.h @@ -59,7 +59,7 @@ class Exponent_vector : :v(begin,end){ typedef typename std::iterator_traits::value_type value_type; CGAL_USE_TYPE(value_type); - CGAL_static_assertion(( ::std::is_same::value)); + static_assert(( ::std::is_same::value)); } diff --git a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h index b5576f5489c3..d75f6f291d55 100644 --- a/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h +++ b/Polynomial/include/CGAL/Polynomial/Algebraic_structure_traits.h @@ -273,7 +273,7 @@ class Polynomial_algebraic_structure_traits_base< POLY, Field_tag > template < class NT1, class NT2 > void operator()( const NT1& x, const NT2& y, POLY& q, POLY& r ) const { - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< typename Coercion_traits< NT1, NT2 >::Type, POLY >::value)); diff --git a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h index f1055bedbd0e..9c2c27b6fc75 100644 --- a/Polynomial/include/CGAL/Polynomial/Polynomial_type.h +++ b/Polynomial/include/CGAL/Polynomial/Polynomial_type.h @@ -545,7 +545,7 @@ class Polynomial * Also available as non-member function. */ CGAL::Sign sign() const { -// CGAL_static_assertion( (std::is_same< typename Real_embeddable_traits::Is_real_embeddable, +// static_assert( (std::is_same< typename Real_embeddable_traits::Is_real_embeddable, // CGAL::Tag_true>::value) ); return CGAL::sign(lcoeff()); } diff --git a/Polynomial/include/CGAL/Polynomial/subresultants.h b/Polynomial/include/CGAL/Polynomial/subresultants.h index 4ea568bf2128..e6f4eb40fcd2 100644 --- a/Polynomial/include/CGAL/Polynomial/subresultants.h +++ b/Polynomial/include/CGAL/Polynomial/subresultants.h @@ -775,7 +775,7 @@ namespace CGAL { CGAL::Integral_domain_without_division_tag) { // polynomial_subresultants_with_cofactors requires // a model of IntegralDomain as coefficient type; - CGAL_static_assertion(sizeof(Polynomial_traits_d)==0); + static_assert(sizeof(Polynomial_traits_d)==0); return sres_out; } diff --git a/Polynomial/include/CGAL/Polynomial_traits_d.h b/Polynomial/include/CGAL/Polynomial_traits_d.h index 8172dd123955..1a377fc5c179 100644 --- a/Polynomial/include/CGAL/Polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Polynomial_traits_d.h @@ -566,7 +566,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, template Polynomial_d construct_value_type(Input_iterator begin, Input_iterator end, NT) const { typedef CGAL::Coercion_traits CT; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); typename CT::Cast cast; return Polynomial_d( boost::make_transform_iterator(begin,cast), @@ -667,7 +667,7 @@ class Polynomial_traits_d_base< Polynomial< Coefficient_type_ >, typedef Polynomial_traits_d PT; typename PT::Construct_polynomial construct; - CGAL_static_assertion(PT::d != 0); // Coefficient_type is a Polynomial + static_assert(PT::d != 0); // Coefficient_type is a Polynomial std::vector coefficients; Coefficient_type zero(0); diff --git a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h index c9097031598b..7547bd302815 100644 --- a/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h +++ b/Polynomial/include/CGAL/Test/_test_polynomial_traits_d.h @@ -50,7 +50,7 @@ static CGAL::Random my_rnd(346); // some seed #define ASSERT_IS_NULL_FUNCTOR(T) \ - CGAL_static_assertion((std::is_same::value)) + static_assert((std::is_same::value)) @@ -178,10 +178,10 @@ void test_construct_polynomial(const Polynomial_traits_d&){ } { // Construct_polynomial typedef typename PT::Construct_polynomial Constructor; - CGAL_static_assertion( + static_assert( !(std::is_same< Constructor , CGAL::Null_functor >::value)); typedef typename Constructor::result_type result_type; - CGAL_static_assertion( + static_assert( (std::is_same< result_type , Polynomial_d >::value)); CGAL_USE_TYPE(result_type); typedef typename PT::Shift Shift; @@ -1802,23 +1802,23 @@ void test_rebind(const PT& /*traits*/){ { typedef typename PT:: template Rebind::Other PT_IC_1; CGAL_USE_TYPE(PT_IC_1); - CGAL_static_assertion((std::is_same< typename PT_IC_1::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_IC_1::Innermost_coefficient_type, IC>::value)); - CGAL_static_assertion((PT_IC_1::d==1)); + static_assert((PT_IC_1::d==1)); } { typedef typename PT:: template Rebind::Other PT_IC_2; CGAL_USE_TYPE(PT_IC_2); - CGAL_static_assertion((std::is_same< typename PT_IC_2::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_IC_2::Innermost_coefficient_type, IC>::value)); - CGAL_static_assertion((PT_IC_2::d==2)); + static_assert((PT_IC_2::d==2)); } { typedef typename PT:: template Rebind::Other PT_IC_3; CGAL_USE_TYPE(PT_IC_3); - CGAL_static_assertion((std::is_same< typename PT_IC_3::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_IC_3::Innermost_coefficient_type, IC>::value)); - CGAL_static_assertion((PT_IC_3::d==3)); + static_assert((PT_IC_3::d==3)); } { typedef typename PT:: template Rebind::Other PT_IC_1; @@ -1831,11 +1831,11 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT_IC_1::Polynomial_d Poly1; typedef typename PT_IC_2::Polynomial_d Poly2; - CGAL_static_assertion((std::is_same< typename PT_IC_1::Coefficient_type, + static_assert((std::is_same< typename PT_IC_1::Coefficient_type, IC>::value)); - CGAL_static_assertion((std::is_same< typename PT_IC_2::Coefficient_type, + static_assert((std::is_same< typename PT_IC_2::Coefficient_type, Poly1>::value)); - CGAL_static_assertion((std::is_same< typename PT_IC_3::Coefficient_type, + static_assert((std::is_same< typename PT_IC_3::Coefficient_type, Poly2>::value)); } @@ -1850,12 +1850,12 @@ void test_rebind(const PT& /*traits*/){ CGAL_USE_TYPE(PT_Integer_4); typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Rational_4); - CGAL_static_assertion((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, Integer>::value)); - CGAL_static_assertion((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, Rational>::value)); - CGAL_static_assertion((PT_Integer_4::d==dimension)); - CGAL_static_assertion((PT_Rational_4::d==dimension)); + static_assert((PT_Integer_4::d==dimension)); + static_assert((PT_Rational_4::d==dimension)); } #endif #ifdef CGAL_USE_CORE @@ -1867,12 +1867,12 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Integer_4); CGAL_USE_TYPE(PT_Rational_4); - CGAL_static_assertion((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, Integer>::value)); - CGAL_static_assertion((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, Rational>::value)); - CGAL_static_assertion((PT_Integer_4::d==4)); - CGAL_static_assertion((PT_Rational_4::d==4)); + static_assert((PT_Integer_4::d==4)); + static_assert((PT_Rational_4::d==4)); } #endif { @@ -1880,12 +1880,12 @@ void test_rebind(const PT& /*traits*/){ typedef typename PT:: template Rebind::Other PT_Rational_4; CGAL_USE_TYPE(PT_Integer_4); CGAL_USE_TYPE(PT_Rational_4); - CGAL_static_assertion((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Integer_4::Innermost_coefficient_type, int>::value)); - CGAL_static_assertion((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, + static_assert((std::is_same< typename PT_Rational_4::Innermost_coefficient_type, double>::value)); - CGAL_static_assertion((PT_Integer_4::d==4)); - CGAL_static_assertion((PT_Rational_4::d==4)); + static_assert((PT_Integer_4::d==4)); + static_assert((PT_Rational_4::d==4)); } } diff --git a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp index d2b0c9315128..56e11a393579 100644 --- a/Polynomial/test/Polynomial/Polynomial_type_generator.cpp +++ b/Polynomial/test/Polynomial/Polynomial_type_generator.cpp @@ -12,14 +12,14 @@ int main(){ { typedef CGAL::Polynomial_type_generator::Type Polynomial; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); } { typedef CGAL::Polynomial_type_generator::Type Polynomial; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); } { typedef CGAL::Polynomial_type_generator::Type Polynomial; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); } } diff --git a/Polynomial/test/Polynomial/test_polynomial.h b/Polynomial/test/Polynomial/test_polynomial.h index 5637578e945b..7cd7a2e17c2d 100644 --- a/Polynomial/test/Polynomial/test_polynomial.h +++ b/Polynomial/test/Polynomial/test_polynomial.h @@ -34,7 +34,7 @@ inline void convert_to(const NT& x, RT& r){ typedef CGAL::Coercion_traits CT; typedef typename CT::Coercion_type RET; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); r = typename CT::Cast()(x); } } //namespace CGAL @@ -887,7 +887,7 @@ void test_scalar_factor_traits(){ typedef CGAL::Scalar_factor_traits SFT; typedef typename AT::Integer Scalar; typedef typename SFT::Scalar Scalar_; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typename SFT::Scalar_factor sfac; @@ -913,7 +913,7 @@ void test_scalar_factor_traits(){ typedef CGAL::Scalar_factor_traits SFT; typedef typename AT::Integer Scalar; typedef typename SFT::Scalar Scalar_; - CGAL_static_assertion((::std::is_same::value)); + static_assert((::std::is_same::value)); typename SFT::Scalar_factor sfac; diff --git a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp index 5760a12eda07..d2ad9d2019cb 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Coercion_traits.cpp @@ -147,7 +147,7 @@ void test_coercion_traits(){ /* { typedef CGAL::Coercion_traits CT; - CGAL_static_assertion(( + static_assert(( ::std::is_same< typename CT::Are_implicit_interoperable, CGAL::Tag_false>::value)); } diff --git a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp index 7107ed8f04e4..f52f33ae5846 100644 --- a/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp +++ b/Polynomial/test/Polynomial/test_polynomial_Get_arithmetic_kernel.cpp @@ -7,11 +7,11 @@ void test_get_arithmetic_kernel(){ { typedef CGAL::Polynomial POLY; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); }{ typedef CGAL::Polynomial > POLY; typedef typename CGAL::Get_arithmetic_kernel::Arithmetic_kernel AK_; - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); } } diff --git a/Ridges_3/include/CGAL/Ridges.h b/Ridges_3/include/CGAL/Ridges.h index e09c6eaf5710..47fd6019ebd2 100644 --- a/Ridges_3/include/CGAL/Ridges.h +++ b/Ridges_3/include/CGAL/Ridges.h @@ -190,10 +190,10 @@ class Ridge_approximation //requirements for the templates TriangleMesh and VertexFTMap or VertexVectorMap - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); typedef std::pair< halfedge_descriptor, FT> Ridge_halfedge; typedef Ridge_halfedge Ridge_halfhedge; // kept for backward compatibility diff --git a/Ridges_3/include/CGAL/Umbilics.h b/Ridges_3/include/CGAL/Umbilics.h index 945fb986ae72..424708b2897b 100644 --- a/Ridges_3/include/CGAL/Umbilics.h +++ b/Ridges_3/include/CGAL/Umbilics.h @@ -110,10 +110,10 @@ class Umbilic_approximation typedef typename boost::graph_traits::vertex_iterator Vertex_const_iterator; //requirements for the templates TriangleMesh and VertexFTMap or VertexVectorMap - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); typedef CGAL::Umbilic Umbilic; diff --git a/STL_Extension/include/CGAL/Handle_with_policy.h b/STL_Extension/include/CGAL/Handle_with_policy.h index 004c8b4d96fe..978fa9ec1c36 100644 --- a/STL_Extension/include/CGAL/Handle_with_policy.h +++ b/STL_Extension/include/CGAL/Handle_with_policy.h @@ -355,7 +355,7 @@ namespace Intern { typedef ::CGAL::Reference_counted_hierarchy_with_union Reference_counted_hierarchy_with_union; CGAL_USE_TYPE(Reference_counted_hierarchy_with_union); - CGAL_static_assertion(( + static_assert(( ::CGAL::is_same_or_derived< Reference_counted_hierarchy_with_union, T >::value )); } typedef T Rep; @@ -760,7 +760,7 @@ class Handle_with_policy { static Rep_allocator allocator; static Rep* new_rep( const Rep& rep) { - CGAL_static_assertion( !( + static_assert( !( ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value )); Rep* p = allocator.allocate(1); std::allocator_traits::construct(allocator, p, rep); @@ -855,7 +855,7 @@ class Handle_with_policy { //! argument, and the single argument template constructor no other //! constructor will work for class hierarchies of representations. Handle_with_policy( Rep* p) : ptr_( p) { - CGAL_static_assertion(( + static_assert(( ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value )); //Bind bind_; // trigger compile-time check //(void)bind_; @@ -869,7 +869,7 @@ class Handle_with_policy { //! version of \c initialize_with is applicable in this case except //! the template version with one argument. void initialize_with( Rep* p) { - CGAL_static_assertion(( + static_assert(( ::CGAL::is_same_or_derived< Reference_counted_hierarchy_base, Handled_type >::value )); //Bind bind_; // trigger compile-time check //(void)bind_; diff --git a/STL_Extension/include/CGAL/Named_function_parameters.h b/STL_Extension/include/CGAL/Named_function_parameters.h index e48768eaffb4..4d37486ea4fa 100644 --- a/STL_Extension/include/CGAL/Named_function_parameters.h +++ b/STL_Extension/include/CGAL/Named_function_parameters.h @@ -179,7 +179,7 @@ typename Get_param, Query_tag>::type get_parameter_impl(const Named_params_impl& np, Query_tag tag) { #ifndef CGAL_NO_STATIC_ASSERTION_TEST - CGAL_static_assertion( (!std::is_same::value) ); + static_assert( (!std::is_same::value) ); #endif return get_parameter_impl(static_cast(np), tag); } @@ -240,7 +240,7 @@ template typename Get_param, Query_tag>::reference get_parameter_reference_impl(const Named_params_impl& np, Query_tag tag) { - CGAL_static_assertion( (!std::is_same::value) ); + static_assert( (!std::is_same::value) ); return get_parameter_reference_impl(static_cast(np), tag); } @@ -532,7 +532,7 @@ namespace boost template void get_param(CGAL::Named_function_parameters, Tag2) { - CGAL_static_assertion(B && "You must use CGAL::parameters::get_parameter instead of boost::get_param"); + static_assert(B && "You must use CGAL::parameters::get_parameter instead of boost::get_param"); } } #endif diff --git a/STL_Extension/include/CGAL/assertions.h b/STL_Extension/include/CGAL/assertions.h index b64d63a92aa4..6db6e93e3575 100644 --- a/STL_Extension/include/CGAL/assertions.h +++ b/STL_Extension/include/CGAL/assertions.h @@ -137,12 +137,6 @@ inline bool possibly(Uncertain c); # define CGAL_unreachable() CGAL_assertion(false) # endif // CGAL_UNREACHABLE -# define CGAL_static_assertion(EX) \ - static_assert(EX, #EX) - -# define CGAL_static_assertion_msg(EX,MSG) \ - static_assert(EX, MSG) - #if defined(CGAL_NO_ASSERTIONS) || !defined(CGAL_CHECK_EXACTNESS) # define CGAL_exactness_assertion(EX) (static_cast(0)) # define CGAL_exactness_assertion_msg(EX,MSG) (static_cast(0)) diff --git a/STL_Extension/include/CGAL/for_each.h b/STL_Extension/include/CGAL/for_each.h index f68bba0e80b9..69a3e7dcdfe9 100644 --- a/STL_Extension/include/CGAL/for_each.h +++ b/STL_Extension/include/CGAL/for_each.h @@ -102,7 +102,7 @@ void for_each (const Range& range, ::reference)>& functor) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif @@ -118,7 +118,7 @@ void for_each (Range& range, ::reference)>& functor) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif diff --git a/STL_Extension/include/CGAL/iterator.h b/STL_Extension/include/CGAL/iterator.h index ea9a964c8a38..956cc88a8c20 100644 --- a/STL_Extension/include/CGAL/iterator.h +++ b/STL_Extension/include/CGAL/iterator.h @@ -1340,7 +1340,7 @@ class Dispatch_output_iterator < std::tuple, std::tuple > : private internal::Derivator, std::tuple >, std::tuple, std::tuple > , public std::tuple { - CGAL_static_assertion_msg(sizeof...(V) == sizeof...(O), + static_assert(sizeof...(V) == sizeof...(O), "The number of explicit template parameters has to match the number of arguments"); static const int size = sizeof...(V); diff --git a/STL_Extension/include/CGAL/transforming_pair_iterator.h b/STL_Extension/include/CGAL/transforming_pair_iterator.h index 4e59bb9282a7..abc52a584e3b 100644 --- a/STL_Extension/include/CGAL/transforming_pair_iterator.h +++ b/STL_Extension/include/CGAL/transforming_pair_iterator.h @@ -25,7 +25,7 @@ namespace CGAL { namespace internal { template ::value> struct Min_category { - CGAL_static_assertion((boost::is_convertible::value)); + static_assert((boost::is_convertible::value)); typedef Cat1 type; }; diff --git a/STL_Extension/test/STL_Extension/test_Cache.cpp b/STL_Extension/test/STL_Extension/test_Cache.cpp index a5c9de6e5a30..609eb6ab8299 100644 --- a/STL_Extension/test/STL_Extension/test_Cache.cpp +++ b/STL_Extension/test/STL_Extension/test_Cache.cpp @@ -57,16 +57,16 @@ struct Int_t : public CGAL::Handle_with_policy< Int_rep, Unify > { void test_typedefs(){ typedef CGAL::Cache Cache; CGAL_USE_TYPE(Cache); - CGAL_static_assertion(( ::std::is_same< Cache::Input, int >::value )); - CGAL_static_assertion(( ::std::is_same< Cache::Output,double>::value )); + static_assert(( ::std::is_same< Cache::Input, int >::value )); + static_assert(( ::std::is_same< Cache::Output,double>::value )); typedef CGAL::Creator_1 Creator_double; CGAL_USE_TYPE(Creator_double); - CGAL_static_assertion(( ::std::is_same::value )); + static_assert(( ::std::is_same::value )); typedef CGAL::Creator_1 Creator_int; CGAL_USE_TYPE(Creator_int); - CGAL_static_assertion(( ::std::is_same::value )); - CGAL_static_assertion(( ::std::is_same >::value )); - CGAL_static_assertion(( ::std::is_same >::value )); + static_assert(( ::std::is_same::value )); + static_assert(( ::std::is_same >::value )); + static_assert(( ::std::is_same >::value )); } int main(){ { diff --git a/STL_Extension/test/STL_Extension/test_Compact_container.cpp b/STL_Extension/test/STL_Extension/test_Compact_container.cpp index d2d96cdfc4b3..566e15dddc24 100644 --- a/STL_Extension/test/STL_Extension/test_Compact_container.cpp +++ b/STL_Extension/test/STL_Extension/test_Compact_container.cpp @@ -346,7 +346,7 @@ int main() } // Check that Compact_container does not require a complete type. - CGAL_static_assertion(sizeof(CGAL::Compact_container) > 0); + static_assert(sizeof(CGAL::Compact_container) > 0); // Test increment policy CGAL::Compact_container > C5; diff --git a/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp b/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp index 2ae445fbfd59..1f474eebabb1 100644 --- a/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp +++ b/STL_Extension/test/STL_Extension/test_cgal_named_params.cpp @@ -24,7 +24,7 @@ template void check_same_type(T) { static const bool b = std::is_same< A, T >::value; - CGAL_static_assertion(b); + static_assert(b); assert(b); } @@ -46,7 +46,7 @@ template void test_no_copyable(const NamedParameters& np) { typedef typename inp::Get_param::type NP_type; - CGAL_static_assertion( (std::is_same >::value) ); + static_assert( (std::is_same >::value) ); const A<4>& a = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), A<4>(4)); assert(a.v==4); @@ -60,31 +60,31 @@ void test_references(const NamedParameters& np) // std::reference_wrapper typedef typename inp::Lookup_named_param_def::reference Visitor_reference_type; - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); Visitor_reference_type vis_ref = params::choose_parameter(params::get_parameter_reference(np, inp::visitor), default_value); CGAL_USE(vis_ref); // std::reference_wrapper of const typedef typename inp::Lookup_named_param_def::reference FIM_reference_type; - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); FIM_reference_type fim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::face_index), default_value); CGAL_USE(fim_ref); // non-copyable typedef typename inp::Lookup_named_param_def::reference VPM_reference_type; - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); VPM_reference_type vpm_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_point), default_value); CGAL_USE(vpm_ref); // passed by copy typedef typename inp::Lookup_named_param_def::reference VIM_reference_type; - CGAL_static_assertion( (std::is_same, VIM_reference_type>::value) ); + static_assert( (std::is_same, VIM_reference_type>::value) ); VIM_reference_type vim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::vertex_index), default_value); CGAL_USE(vim_ref); // default typedef typename inp::Lookup_named_param_def::reference EIM_reference_type; - CGAL_static_assertion(( std::is_same::value) ); + static_assert(( std::is_same::value) ); EIM_reference_type eim_ref = params::choose_parameter(params::get_parameter_reference(np, inp::edge_index), default_value); assert(&eim_ref==&default_value); } @@ -103,12 +103,12 @@ int main() ); auto d = CGAL::parameters::default_values(); - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); #ifndef CGAL_NO_DEPRECATED_CODE auto d1 = CGAL::parameters::all_default(); - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); auto d2 = CGAL::Polygon_mesh_processing::parameters::all_default(); - CGAL_static_assertion( (std::is_same::value) ); + static_assert( (std::is_same::value) ); #endif return EXIT_SUCCESS; diff --git a/STL_Extension/test/STL_Extension/test_is_iterator.cpp b/STL_Extension/test/STL_Extension/test_is_iterator.cpp index 7305fe62da05..d1c3b157aaaa 100644 --- a/STL_Extension/test/STL_Extension/test_is_iterator.cpp +++ b/STL_Extension/test/STL_Extension/test_is_iterator.cpp @@ -17,17 +17,17 @@ int main() { CGAL_USE_TYPE(vector_it); CGAL_USE_TYPE(list_it); CGAL_USE_TYPE(int_p); - CGAL_static_assertion(is_iterator::value); - CGAL_static_assertion(is_iterator::value); - CGAL_static_assertion(!is_iterator::value); - CGAL_static_assertion(!is_iterator::value); - CGAL_static_assertion(is_iterator::value); + static_assert(is_iterator::value); + static_assert(is_iterator::value); + static_assert(!is_iterator::value); + static_assert(!is_iterator::value); + static_assert(is_iterator::value); - CGAL_static_assertion((is_iterator_type::value)); - CGAL_static_assertion((!is_iterator_type::value)); - CGAL_static_assertion((!is_iterator_type::value)); + static_assert((is_iterator_type::value)); + static_assert((!is_iterator_type::value)); + static_assert((!is_iterator_type::value)); - CGAL_static_assertion((is_iterator_to::value)); - CGAL_static_assertion((!is_iterator_to::value)); - CGAL_static_assertion((!is_iterator_to::value)); + static_assert((is_iterator_to::value)); + static_assert((!is_iterator_to::value)); + static_assert((!is_iterator_to::value)); } diff --git a/STL_Extension/test/STL_Extension/test_is_streamable.cpp b/STL_Extension/test/STL_Extension/test_is_streamable.cpp index 7d1c81a892cc..6e574cfdec15 100644 --- a/STL_Extension/test/STL_Extension/test_is_streamable.cpp +++ b/STL_Extension/test/STL_Extension/test_is_streamable.cpp @@ -21,12 +21,12 @@ istream& operator>>(istream& is, const D&) { return is; } int main() { using CGAL::is_streamable; - CGAL_static_assertion(!is_streamable::value); - CGAL_static_assertion(is_streamable::value); - CGAL_static_assertion(!is_streamable::value); - CGAL_static_assertion(!is_streamable::value); - CGAL_static_assertion(is_streamable::value); - CGAL_static_assertion(is_streamable::value); - CGAL_static_assertion(! (is_streamable >::value) ); - CGAL_static_assertion( (is_streamable >::value) ); + static_assert(!is_streamable::value); + static_assert(is_streamable::value); + static_assert(!is_streamable::value); + static_assert(!is_streamable::value); + static_assert(is_streamable::value); + static_assert(is_streamable::value); + static_assert(! (is_streamable >::value) ); + static_assert( (is_streamable >::value) ); } diff --git a/STL_Extension/test/STL_Extension/test_stl_extension.cpp b/STL_Extension/test/STL_Extension/test_stl_extension.cpp index d361ed8b6107..1895935f787e 100644 --- a/STL_Extension/test/STL_Extension/test_stl_extension.cpp +++ b/STL_Extension/test/STL_Extension/test_stl_extension.cpp @@ -8117,10 +8117,10 @@ void test_tuple(){ CGAL_USE_TYPE(T0); CGAL_USE_TYPE(T2); - CGAL_static_assertion( std::tuple_size::value == 0 ); - CGAL_static_assertion( std::tuple_size::value == 2 ); - CGAL_static_assertion( std::tuple_size::value == 4 ); - CGAL_static_assertion( (std::is_same::type,My_to_int>::value) ); + static_assert( std::tuple_size::value == 0 ); + static_assert( std::tuple_size::value == 2 ); + static_assert( std::tuple_size::value == 4 ); + static_assert( (std::is_same::type,My_to_int>::value) ); T1 t1=std::make_tuple(1,2); T1 t1_2=std::make_tuple(1,2); @@ -8206,15 +8206,15 @@ void test_make_sorted_pair() { assert(p3==p4); int i=2; assert( CGAL::make_sorted_pair(1,i) == std::make_pair(1,i) ); - CGAL_static_assertion( (std::is_same< + static_assert( (std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1L,i)), std::pair >::value) ); assert( (CGAL::make_sorted_pair(i,1L) == std::pair(1L,2L)) ); - CGAL_static_assertion( (std::is_same< + static_assert( (std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1,2L)), std::pair >::value) ); - CGAL_static_assertion( (std::is_same< + static_assert( (std::is_same< BOOST_TYPEOF(CGAL::make_sorted_pair(1,2L)), std::pair >::value) ); } @@ -8237,8 +8237,8 @@ void test_result_of() { typedef CGAL::cpp11::result_of::type result_type_float; CGAL_USE_TYPE(result_type); CGAL_USE_TYPE(result_type_float); - CGAL_static_assertion((std::is_same::value)); - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); + static_assert((std::is_same::value)); } diff --git a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h index bc4ba9ec616a..a32aacd681ba 100644 --- a/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h +++ b/Scale_space_reconstruction_3/include/CGAL/Scale_space_reconstruction_3/Weighted_PCA_smoother.h @@ -198,7 +198,7 @@ class Weighted_PCA_smoother void try_parallel (const F& func, std::size_t begin, std::size_t end) { #ifndef CGAL_LINKED_WITH_TBB - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else if (boost::is_convertible::value) diff --git a/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h b/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h index 94713899f344..a5a5c5e58cbd 100644 --- a/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h +++ b/Shape_regularization/include/CGAL/Shape_regularization/regularize_planes.h @@ -296,7 +296,7 @@ namespace Planes { using PlaneIndexMap = typename CGAL::Point_set_processing_3::GetPlaneIndexMap::type; - CGAL_static_assertion_msg((!is_default_parameter::value), + static_assert((!is_default_parameter::value), "Error: no plane index map"); const PlaneIndexMap index_map = diff --git a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h index add923b15e22..ff11623a892b 100644 --- a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h +++ b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h @@ -107,7 +107,7 @@ class Search_traits_kd_tree_2 { template class Multiple_kd_tree { - CGAL_static_assertion_msg((boost::is_pointer::value), "SAVED_OBJECT is not a pointer."); + static_assert((boost::is_pointer::value), "SAVED_OBJECT is not a pointer."); private: typedef Traits_ Traits; typedef typename Traits::FT NT; diff --git a/Spatial_searching/include/CGAL/Kd_tree.h b/Spatial_searching/include/CGAL/Kd_tree.h index b0958bc44ee4..317f6a78bad5 100644 --- a/Spatial_searching/include/CGAL/Kd_tree.h +++ b/Spatial_searching/include/CGAL/Kd_tree.h @@ -335,7 +335,7 @@ class Kd_tree { } #ifndef CGAL_TBB_STRUCTURE_IN_KD_TREE - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #endif diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h index 722ccc3acbce..59df305b5c4c 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_2.h @@ -157,7 +157,7 @@ class Hilbert_sort_median_2 #ifndef CGAL_LINKED_WITH_TBB CGAL_USE(begin); CGAL_USE(end); - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else const int y = (x + 1) % 2; diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h index ebf71afed5a1..6fc128cd61ad 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_median_3.h @@ -180,7 +180,7 @@ class CGAL_VISIBILITY_MACRO Hilbert_sort_median_3 #ifndef CGAL_LINKED_WITH_TBB CGAL_USE(begin); CGAL_USE(end); - CGAL_static_assertion_msg (!(boost::is_convertible::value), + static_assert (!(boost::is_convertible::value), "Parallel_tag is enabled but TBB is unavailable."); #else const int y = (x + 1) % 3, z = (x + 2) % 3; diff --git a/Stream_support/test/Stream_support/test_ioformat.cpp b/Stream_support/test/Stream_support/test_ioformat.cpp index e4e4e13e67eb..d85c7c0577ce 100644 --- a/Stream_support/test/Stream_support/test_ioformat.cpp +++ b/Stream_support/test/Stream_support/test_ioformat.cpp @@ -50,8 +50,8 @@ void test_io(const NT& x){ } int main() { - CGAL_static_assertion(CGAL::Output_rep::is_specialized == false); - CGAL_static_assertion(CGAL::Input_rep::is_specialized == false); + static_assert(CGAL::Output_rep::is_specialized == false); + static_assert(CGAL::Input_rep::is_specialized == false); std::cout << "test_io: short "<< std::endl; test_io(12); diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h index ca3de4760915..763ed9ac09b1 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/ARAP_parameterizer_3.h @@ -176,7 +176,7 @@ class ARAP_parameterizer_3 Two_vertices_parameterizer_3 >::type Border_parameterizer; #if !defined(CGAL_EIGEN3_ENABLED) - CGAL_static_assertion_msg(!(std::is_same::value), + static_assert(!(std::is_same::value), "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); #endif diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h index 3bf9f7f8f916..a128e341a7b6 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Fixed_border_parameterizer_3.h @@ -104,7 +104,7 @@ class Fixed_border_parameterizer_3 Circular_border_arc_length_parameterizer_3 >::type Border_parameterizer; #if !defined(CGAL_EIGEN3_ENABLED) - CGAL_static_assertion_msg(!(std::is_same::value), + static_assert(!(std::is_same::value), "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); #endif diff --git a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h index c23ce5bf15d8..2f629c9cb64b 100644 --- a/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h +++ b/Surface_mesh_parameterization/include/CGAL/Surface_mesh_parameterization/Orbifold_Tutte_parameterizer_3.h @@ -384,7 +384,7 @@ class Orbifold_Tutte_parameterizer_3 public: #ifndef DOXYGEN_RUNNING #if !defined(CGAL_EIGEN3_ENABLED) - CGAL_static_assertion_msg(!(std::is_same::value), + static_assert(!(std::is_same::value), "Error: You must either provide 'SolverTraits_' or link CGAL with the Eigen library"); #endif diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h index 59a33fa465ce..36f2f855312e 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Bounded_distance_placement.h @@ -49,7 +49,7 @@ class Bounded_distance_placement template void initialize_tree(const Profile& profile) const { - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h index 28b22b3e079d..2f0abb387892 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/FastEnvelope_filter.h @@ -43,7 +43,7 @@ class FastEnvelope_filter template void initialize_envelope(const Profile& profile) const { - CGAL_static_assertion((std::is_same::value)); + static_assert((std::is_same::value)); typedef typename Profile::Triangle_mesh Triangle_mesh; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h b/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h index 46c1a253cc40..1340c1700e31 100644 --- a/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h +++ b/Surface_mesher/include/CGAL/Surface_mesher/Combining_oracle.h @@ -51,7 +51,7 @@ namespace CGAL { typedef typename Oracle_a::Intersection_point Intersection_point; - CGAL_static_assertion((::std::is_same< + static_assert((::std::is_same< Intersection_point, typename Oracle_b::Intersection_point>::value)); diff --git a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h index 21aa9eaa8c72..8730089384e1 100644 --- a/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h +++ b/Surface_sweep_2/include/CGAL/No_intersection_surface_sweep_2.h @@ -129,7 +129,7 @@ class No_intersection_surface_sweep_2 { typedef typename Traits_adaptor_2::Top_side_category Top_side_category; typedef typename Traits_adaptor_2::Right_side_category Right_side_category; - CGAL_static_assertion((Arr_sane_identified_tagging< Left_side_category, Bottom_side_category, + static_assert((Arr_sane_identified_tagging< Left_side_category, Bottom_side_category, Top_side_category, Right_side_category >::value)); protected: diff --git a/TDS_3/include/CGAL/Triangulation_data_structure_3.h b/TDS_3/include/CGAL/Triangulation_data_structure_3.h index 6333387f28bd..862ffc711946 100644 --- a/TDS_3/include/CGAL/Triangulation_data_structure_3.h +++ b/TDS_3/include/CGAL/Triangulation_data_structure_3.h @@ -130,7 +130,7 @@ class Triangulation_data_structure_3 >::type Cell_range; # else - CGAL_static_assertion_msg + static_assert (!(std::is_convertible::value), "In CGAL triangulations, `Parallel_tag` can only be used with the Intel TBB library. " "Make TBB available in the build system and then define the macro `CGAL_LINKED_WITH_TBB`."); diff --git a/Triangulation_2/include/CGAL/Triangulation_2_to_lcc.h b/Triangulation_2/include/CGAL/Triangulation_2_to_lcc.h index 41a72c1e9de0..86d9a71f51e5 100644 --- a/Triangulation_2/include/CGAL/Triangulation_2_to_lcc.h +++ b/Triangulation_2/include/CGAL/Triangulation_2_to_lcc.h @@ -31,7 +31,7 @@ namespace CGAL { std::map* aface_to_dart=nullptr) { - CGAL_static_assertion( LCC::dimension>=2 && LCC::ambient_dimension==2 ); + static_assert( LCC::dimension>=2 && LCC::ambient_dimension==2 ); // Case of empty triangulations. if (atr.number_of_vertices()==0) return LCC::null_descriptor; diff --git a/Triangulation_3/include/CGAL/Triangulation_3_to_lcc.h b/Triangulation_3/include/CGAL/Triangulation_3_to_lcc.h index 01a5dbb8535b..14f718f0b138 100644 --- a/Triangulation_3/include/CGAL/Triangulation_3_to_lcc.h +++ b/Triangulation_3/include/CGAL/Triangulation_3_to_lcc.h @@ -49,7 +49,7 @@ namespace CGAL { std::map* avol_to_dart=nullptr) { - CGAL_static_assertion( LCC::dimension>=3 && LCC::ambient_dimension==3 ); + static_assert( LCC::dimension>=3 && LCC::ambient_dimension==3 ); // Case of empty triangulations. if (atr.number_of_vertices() == 0) return LCC::null_descriptor; diff --git a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h index a447bc7e3352..ab3fe40ec6cf 100644 --- a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h +++ b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_on_sphere_2.h @@ -632,8 +632,8 @@ insert(InputIterator first, InputIterator beyond, { typedef Point_3_with_iterator P3_wit; - CGAL_static_assertion((std::is_same::value_type, Point>::value)); - CGAL_static_assertion(!(std::is_same::value)); + static_assert((std::is_same::value_type, Point>::value)); + static_assert(!(std::is_same::value)); const size_type n = number_of_vertices(); diff --git a/Triangulation_on_sphere_2/include/CGAL/Triangulation_on_sphere_2/internal/arc_on_sphere_2_subsampling.h b/Triangulation_on_sphere_2/include/CGAL/Triangulation_on_sphere_2/internal/arc_on_sphere_2_subsampling.h index fbe529799391..98dc2f54c651 100644 --- a/Triangulation_on_sphere_2/include/CGAL/Triangulation_on_sphere_2/internal/arc_on_sphere_2_subsampling.h +++ b/Triangulation_on_sphere_2/include/CGAL/Triangulation_on_sphere_2/internal/arc_on_sphere_2_subsampling.h @@ -56,7 +56,7 @@ double get_theta(typename Kernel::Point_3& pt, #endif >::type Col; - CGAL_static_assertion_msg(!(std::is_same::value), + static_assert(!(std::is_same::value), "Eigen is required to perform arc subsampling!"); auto V1c = V1.cartesian_begin(), V2c = V2.cartesian_begin(), V3c = V3.cartesian_begin(); From f5803d5a8b0fa4b6796e26b82c918d3f6b9118cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 23:00:44 +0200 Subject: [PATCH 0354/1398] MSVC 2015 is no longer supported --- Documentation/doc/Documentation/Third_party.txt | 2 +- Documentation/doc/Documentation/windows.txt | 2 +- Installation/CHANGES.md | 11 +++++++++++ .../cmake/modules/CGAL_SetupCGALDependencies.cmake | 5 ----- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index 1e3fe07e9ba5..eac22ad82928 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -14,7 +14,7 @@ supporting C++14 or later. | Linux | \gnu `g++` 10.2.1 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | | | `Clang` \cgalFootnote{\cgalFootnoteCode{https://clang.llvm.org/}} compiler version 13.0.1 | | \ms Windows | \gnu `g++` 10.2.1 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | -| | \ms Visual `C++` 14.0, 15.9, 16.10, 17.0 (\visualstudio 2015, 2017, 2019, and 2022)\cgalFootnote{\cgalFootnoteCode{https://visualstudio.microsoft.com/}} | +| | \ms Visual `C++` 15.9, 16.10, 17.0 (\visualstudio 2017, 2019, and 2022)\cgalFootnote{\cgalFootnoteCode{https://visualstudio.microsoft.com/}} | | MacOS X | \gnu `g++` 10.2.1 or later\cgalFootnote{\cgalFootnoteCode{https://gcc.gnu.org/}} | | | Apple `Clang` compiler versions 10.0.1, 12.0.5, and 13.0.0 | diff --git a/Documentation/doc/Documentation/windows.txt b/Documentation/doc/Documentation/windows.txt index c4daa8fc3801..d40059d76cd3 100644 --- a/Documentation/doc/Documentation/windows.txt +++ b/Documentation/doc/Documentation/windows.txt @@ -3,7 +3,7 @@ \cgalAutoToc \cgal \cgalReleaseNumber is supported for the following \ms Visual `C++` compilers: -14.0, 15.9, 16.0, 17.0 (\visualstudio 2015, 2017, 2019, and 2022). +15.9, 16.0, 17.0 (\visualstudio 2017, 2019, and 2022). \cgal is a library that has mandatory dependencies that must be first installed: \ref thirdpartyBoost and \ref thirdpartyMPFR. diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index c4ce7a51d6d1..a505215bd003 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -1,6 +1,17 @@ Release History =============== +[Release 6.0](https://github.com/CGAL/cgal/releases/tag/v6.0) +----------- + +Release date: October 2023 + +### General Changes + +- **Breaking change**: C++17 is now required +- Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. + + [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) ----------- diff --git a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake index de0f5eb7fa4f..3664c4b0693c 100644 --- a/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake +++ b/Installation/cmake/modules/CGAL_SetupCGALDependencies.cmake @@ -127,11 +127,6 @@ function(CGAL_setup_CGAL_dependencies target) $<$:/fp:except-> $<$:/bigobj> # Use /bigobj by default ) - if(MSVC_TOOLSET_VERSION VERSION_LESS_EQUAL 140) # for MSVC 2015 - target_compile_options(${target} INTERFACE - $<$:/wd4503> # Suppress warnings C4503 about "decorated name length exceeded" - ) - endif() elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0.3) message(STATUS "Apple Clang version ${CMAKE_CXX_COMPILER_VERSION} compiler detected") From cc1cb02ccd147642ddf8cc3530f3fc587eb7681a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 23:08:22 +0200 Subject: [PATCH 0355/1398] missing 6.0 updates --- Documentation/doc/resources/1.8.13/menu_version.js | 3 ++- Documentation/doc/resources/1.8.14/menu_version.js | 3 ++- Documentation/doc/resources/1.8.20/menu_version.js | 3 ++- Documentation/doc/resources/1.8.4/menu_version.js | 3 ++- Documentation/doc/resources/1.9.3/menu_version.js | 3 ++- Installation/lib/cmake/CGAL/CGALConfigVersion.cmake | 6 +++--- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Documentation/doc/resources/1.8.13/menu_version.js b/Documentation/doc/resources/1.8.13/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.8.13/menu_version.js +++ b/Documentation/doc/resources/1.8.13/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Documentation/doc/resources/1.8.14/menu_version.js b/Documentation/doc/resources/1.8.14/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.8.14/menu_version.js +++ b/Documentation/doc/resources/1.8.14/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Documentation/doc/resources/1.8.20/menu_version.js b/Documentation/doc/resources/1.8.20/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.8.20/menu_version.js +++ b/Documentation/doc/resources/1.8.20/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Documentation/doc/resources/1.8.4/menu_version.js b/Documentation/doc/resources/1.8.4/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.8.4/menu_version.js +++ b/Documentation/doc/resources/1.8.4/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Documentation/doc/resources/1.9.3/menu_version.js b/Documentation/doc/resources/1.9.3/menu_version.js index a66903b10fee..f3b20c2fe004 100644 --- a/Documentation/doc/resources/1.9.3/menu_version.js +++ b/Documentation/doc/resources/1.9.3/menu_version.js @@ -6,7 +6,8 @@ var current_version_local = 'master' var all_versions = [ 'master', - '5.6-beta1', + '6.0-beta1', + '5.6', 'latest', '5.5.2', '5.4.4', diff --git a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake index e71784c4c52c..fc443126c186 100644 --- a/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake +++ b/Installation/lib/cmake/CGAL/CGALConfigVersion.cmake @@ -1,8 +1,8 @@ -set(CGAL_MAJOR_VERSION 5) -set(CGAL_MINOR_VERSION 6) +set(CGAL_MAJOR_VERSION 6) +set(CGAL_MINOR_VERSION 0) set(CGAL_BUGFIX_VERSION 0) include(${CMAKE_CURRENT_LIST_DIR}/CGALConfigBuildVersion.cmake) -set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "5.6-beta1") +set(CGAL_VERSION_PUBLIC_RELEASE_VERSION "6.0-beta1") set(CGAL_VERSION_PUBLIC_RELEASE_NAME "CGAL-${CGAL_VERSION_PUBLIC_RELEASE_VERSION}") if (CGAL_BUGFIX_VERSION AND CGAL_BUGFIX_VERSION GREATER 0) From 6df9a0d61cc91a1c3fa19328f4260b0edf4caffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 3 May 2023 19:04:30 +0200 Subject: [PATCH 0356/1398] check headers also needs c++17 --- Installation/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installation/CMakeLists.txt b/Installation/CMakeLists.txt index 0a521d9dd2c2..e06916bd1a3c 100644 --- a/Installation/CMakeLists.txt +++ b/Installation/CMakeLists.txt @@ -943,7 +943,7 @@ ${Qt5Widgets_DEFINITIONS} ${Qt5OpenGL_DEFINITIONS} ${Qt5Gui_DEFINITIONS} \ ${Qt5OpenGL_EXECUTABLE_COMPILE_FLAGS} -fPIC \ ${Qt5Gui_EXECUTABLE_COMPILE_FLAGS} \ ${CGAL_3RD_PARTY_DEFINITIONS} ${CGAL_Qt5_3RD_PARTY_DEFINITIONS} \ -${CGAL_DEFINITIONS}") +${CGAL_DEFINITIONS} -std=c++17") message("COMPILATION OPTIONS ARE : ${compile_options}") if(NOT RS_FOUND AND NOT RS3_FOUND) From b45b2c379faaee13a4457ab26c5349541df8a8bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 3 May 2023 18:59:54 +0200 Subject: [PATCH 0357/1398] update doc about C++ standard --- Documentation/doc/Documentation/Preliminaries.txt | 5 ++--- Documentation/doc/Documentation/Third_party.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Documentation/doc/Documentation/Preliminaries.txt b/Documentation/doc/Documentation/Preliminaries.txt index 1fccdc134f9b..c8a06bd7d17b 100644 --- a/Documentation/doc/Documentation/Preliminaries.txt +++ b/Documentation/doc/Documentation/Preliminaries.txt @@ -39,10 +39,9 @@ If you are using CMake, then you can set the CMake option `CGAL_HAS_NO_THREADS` `TRUE`. In addition to defining the preprocessor macro `CGAL_HAS_NO_THREADS`, it will also avoid CMake to link with the native threads support library on your system. -\section Preliminaries_cc0x C++14 Support +\section Preliminaries_cc0x C++17 Support -After being based on the \CC standard released in 1998 (and later refined in 2003) for a long time, -\cgal is now based on a newer major version of the standard, C++14. +\cgal is based on a the version C++17 of the standard. \section preliminaries_secchecks Checks diff --git a/Documentation/doc/Documentation/Third_party.txt b/Documentation/doc/Documentation/Third_party.txt index eac22ad82928..9017a5eee91f 100644 --- a/Documentation/doc/Documentation/Third_party.txt +++ b/Documentation/doc/Documentation/Third_party.txt @@ -6,7 +6,7 @@ \section seccompilers Supported Compilers In order to build a program using \cgal, you need a \cpp compiler -supporting C++14 or later. +supporting C++17 or later. \cgal \cgalReleaseNumber is supported (continuously tested) for the following compilers/operating systems: | Operating System | Compiler | From 5b0786aa9942b5266c219f2cda0763d74ed4cadd Mon Sep 17 00:00:00 2001 From: Sebastien Loriot Date: Wed, 7 Jun 2023 17:21:30 +0200 Subject: [PATCH 0358/1398] Update Documentation/doc/Documentation/Preliminaries.txt Co-authored-by: Laurent Rineau --- Documentation/doc/Documentation/Preliminaries.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/Documentation/Preliminaries.txt b/Documentation/doc/Documentation/Preliminaries.txt index c8a06bd7d17b..2e2ae95e661e 100644 --- a/Documentation/doc/Documentation/Preliminaries.txt +++ b/Documentation/doc/Documentation/Preliminaries.txt @@ -41,7 +41,7 @@ also avoid CMake to link with the native threads support library on your system. \section Preliminaries_cc0x C++17 Support -\cgal is based on a the version C++17 of the standard. +\cgal is based on the version C++17 of the C++ standard. \section preliminaries_secchecks Checks From 71b4e4f08f72a0724bfcf9fad0f24252539b7dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:27:13 +0200 Subject: [PATCH 0359/1398] boost::shared_ptr => std::shared_ptr --- CGAL_ipelets/demo/CGAL_ipelets/skeleton.cpp | 5 +- .../random-forest/common-libraries.hpp | 2 +- .../Feature/Gradient_of_feature.h | 2 +- GraphicsView/demo/Polygon/Polygon_2.cpp | 5 +- Installation/CHANGES.md | 1 + .../examples/Point_set_3/point_set_algo.cpp | 2 +- .../Classification/Cluster_classification.h | 4 +- .../Point_set_average_spacing_plugin.cpp | 2 +- .../Point_set_bilateral_smoothing_plugin.cpp | 2 +- .../Point_set/Point_set_clustering_plugin.cpp | 2 +- .../Point_set_outliers_removal_plugin.cpp | 2 +- .../Point_set/Point_set_selection_plugin.cpp | 4 +- .../Point_set_shape_detection_plugin.cpp | 10 ++-- .../Point_set_simplification_plugin.cpp | 6 +-- .../Point_set/Point_set_wlop_plugin.cpp | 2 +- .../include/run_with_qprogressdialog.h | 8 ++-- .../efficient_RANSAC_with_point_access.cpp | 2 +- .../Efficient_RANSAC/Efficient_RANSAC.h | 44 ++++++++--------- .../Efficient_RANSAC/property_map.h | 6 +-- .../test_efficient_RANSAC_cone_parameters.cpp | 2 +- ...t_efficient_RANSAC_cylinder_parameters.cpp | 2 +- ...test_efficient_RANSAC_plane_parameters.cpp | 2 +- .../test_efficient_RANSAC_scene.cpp | 2 +- ...est_efficient_RANSAC_sphere_parameters.cpp | 2 +- ...test_efficient_RANSAC_torus_parameters.cpp | 2 +- ...ompare_kernels_simple_polygon_skeleton.cpp | 4 +- .../create_exterior_skeleton.cpp | 6 +-- ...te_exterior_skeleton_tweaking_skeleton.cpp | 6 +-- .../CGAL/Polygon_offset_builder_2.h | 4 +- .../CGAL/Straight_skeleton_builder_2.h | 4 +- .../CGAL/Straight_skeleton_converter_2.h | 4 +- .../CGAL/arrange_offset_polygons_2.h | 6 +-- .../CGAL/create_offset_polygons_2.h | 8 ++-- ...ffset_polygons_from_polygon_with_holes_2.h | 4 +- .../CGAL/create_straight_skeleton_2.h | 10 ++-- .../Straight_skeleton_2.txt | 4 +- .../Create_offset_polygons_2.cpp | 6 +-- .../Create_saop_from_polygon_with_holes_2.cpp | 6 +-- .../Create_skeleton_and_offset_polygons_2.cpp | 6 +-- ...leton_and_offset_polygons_with_holes_2.cpp | 4 +- .../Create_straight_skeleton_2.cpp | 4 +- ...ght_skeleton_from_polygon_with_holes_2.cpp | 4 +- .../Straight_skeleton_2/Low_level_API.cpp | 6 +-- .../Show_offset_polygon.cpp | 4 +- .../Show_straight_skeleton.cpp | 4 +- .../draw_straight_skeleton_2.cpp | 4 +- .../Straight_skeleton_2/dump_to_eps.h | 4 +- ...offset_of_multiple_polygons_with_holes.cpp | 6 +-- .../examples/Straight_skeleton_2/print.h | 8 ++-- .../include/CGAL/Polygon_offset_builder_2.h | 4 +- .../Straight_skeleton_2/Polygon_iterators.h | 14 +++--- .../CGAL/Straight_skeleton_builder_2.h | 4 +- .../CGAL/Straight_skeleton_converter_2.h | 8 ++-- .../include/CGAL/arrange_offset_polygons_2.h | 16 +++---- .../include/CGAL/create_offset_polygons_2.h | 40 ++++++++-------- ...ffset_polygons_from_polygon_with_holes_2.h | 26 +++++----- .../include/CGAL/create_straight_skeleton_2.h | 24 +++++----- ...aight_skeleton_from_polygon_with_holes_2.h | 4 +- .../include/CGAL/test_offset_builder_types.h | 8 ++-- .../include/CGAL/test_sls_builder_types.h | 8 ++-- .../include/CGAL/test_sls_types.h | 14 +++--- .../test/Straight_skeleton_2/issue4533.cpp | 4 +- .../test/Straight_skeleton_2/issue4684.cpp | 4 +- .../test/Straight_skeleton_2/issue7149.cpp | 2 +- .../test/Straight_skeleton_2/print.h | 8 ++-- .../Straight_skeleton_2/test_sls_offset.cpp | 48 +++++++++---------- .../Straight_skeleton_2/test_sls_simple.cpp | 10 ++-- .../test_straight_skeleton_copy.cpp | 6 +-- .../internal/Geometry_container.h | 4 +- 69 files changed, 246 insertions(+), 259 deletions(-) diff --git a/CGAL_ipelets/demo/CGAL_ipelets/skeleton.cpp b/CGAL_ipelets/demo/CGAL_ipelets/skeleton.cpp index 7d2026c59811..71557e659689 100644 --- a/CGAL_ipelets/demo/CGAL_ipelets/skeleton.cpp +++ b/CGAL_ipelets/demo/CGAL_ipelets/skeleton.cpp @@ -11,7 +11,6 @@ // Author(s) : Sebastien Loriot, Sylvain Pion #include -#include #include #include #include @@ -38,10 +37,10 @@ const std::string Hmsg[] = { class SkeletonIpelet : public CGAL::Ipelet_base{ - typedef boost::shared_ptr PolygonPtr ; + typedef std::shared_ptr PolygonPtr ; typedef std::vector PolygonPtrVector ; typedef CGAL::Straight_skeleton_2 Skeleton ; - typedef boost::shared_ptr SkeletonPtr ; + typedef std::shared_ptr SkeletonPtr ; void draw_straight_skeleton(const Skeleton& skeleton,double); diff --git a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/common-libraries.hpp b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/common-libraries.hpp index c20b9b7155f9..6d2ebb01acfc 100644 --- a/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/common-libraries.hpp +++ b/Classification/include/CGAL/Classification/ETHZ/internal/random-forest/common-libraries.hpp @@ -45,7 +45,7 @@ #include #endif #include -#include +#include #include #include #include diff --git a/Classification/include/CGAL/Classification/Feature/Gradient_of_feature.h b/Classification/include/CGAL/Classification/Feature/Gradient_of_feature.h index 85d703c5ed1e..d87ee8f28301 100644 --- a/Classification/include/CGAL/Classification/Feature/Gradient_of_feature.h +++ b/Classification/include/CGAL/Classification/Feature/Gradient_of_feature.h @@ -37,7 +37,7 @@ class Gradient_of_feature : public Feature_base const InputRange& m_input; ItemMap m_map; Feature_handle m_feature; - boost::shared_ptr m_query; + std::shared_ptr m_query; public: /*! diff --git a/GraphicsView/demo/Polygon/Polygon_2.cpp b/GraphicsView/demo/Polygon/Polygon_2.cpp index 9463c2e979b6..67c16d0b3dca 100644 --- a/GraphicsView/demo/Polygon/Polygon_2.cpp +++ b/GraphicsView/demo/Polygon/Polygon_2.cpp @@ -1,5 +1,4 @@ #include -#include // CGAL headers #include #include @@ -42,9 +41,9 @@ typedef CGAL::Polygon_with_holes_2 > Polygon_with_holes_2 typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr SsPtr ; -typedef boost::shared_ptr PolygonPtr ; +typedef std::shared_ptr PolygonPtr ; typedef std::vector PolygonPtr_vector ; diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index a505215bd003..486f43ea21f7 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -10,6 +10,7 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. +- **Breaking change**: The usage of `boost::shared_ptr` has been replaced by `std::shared_ptr`. Packages affected are 2D Straight Line Skeleton and Shape Detection. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) diff --git a/Point_set_3/examples/Point_set_3/point_set_algo.cpp b/Point_set_3/examples/Point_set_3/point_set_algo.cpp index 12c98682475b..19f10f5ecfbf 100644 --- a/Point_set_3/examples/Point_set_3/point_set_algo.cpp +++ b/Point_set_3/examples/Point_set_3/point_set_algo.cpp @@ -68,7 +68,7 @@ int main (int, char**) parameters.normal_threshold = 0.9; ransac.detect(parameters); - for(boost::shared_ptr shape : ransac.shapes()) + for(std::shared_ptr shape : ransac.shapes()) if (Sphere* sphere = dynamic_cast(shape.get())) std::cerr << "Detected sphere of center " << sphere->center() // Center should be approx 0, 0, 0 << " and of radius " << sphere->radius() << std::endl; // Radius should be approx 1 diff --git a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.h b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.h index 224a66d20c70..ef4d006e2ce0 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.h +++ b/Polyhedron/demo/Polyhedron/Plugins/Classification/Cluster_classification.h @@ -98,7 +98,7 @@ class Cluster_classification : public Item_classification_base void add_cluster_features () { - m_eigen = boost::make_shared + m_eigen = std::make_shared (Local_eigen_analysis::create_from_point_clusters(m_clusters, Concurrency_tag())); @@ -388,7 +388,7 @@ class Cluster_classification : public Item_classification_base int m_index_color; - boost::shared_ptr m_eigen; + std::shared_ptr m_eigen; bool m_input_is_las; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_average_spacing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_average_spacing_plugin.cpp index d11f45cd623d..78c0e2482d45 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_average_spacing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_average_spacing_plugin.cpp @@ -27,7 +27,7 @@ struct Compute_average_spacing_functor { Point_set* points; const int nb_neighbors; - boost::shared_ptr result; + std::shared_ptr result; Compute_average_spacing_functor (Point_set* points, const int nb_neighbors) : points (points), nb_neighbors (nb_neighbors), result (new double(0)) { } diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_bilateral_smoothing_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_bilateral_smoothing_plugin.cpp index c4a13af368d0..03f18810236f 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_bilateral_smoothing_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_bilateral_smoothing_plugin.cpp @@ -29,7 +29,7 @@ struct Bilateral_smoothing_functor Point_set* points; unsigned int neighborhood_size; unsigned int sharpness_angle; - boost::shared_ptr result; + std::shared_ptr result; Bilateral_smoothing_functor (Point_set* points, unsigned int neighborhood_size, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_clustering_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_clustering_plugin.cpp index e898807835fa..b998a35750e2 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_clustering_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_clustering_plugin.cpp @@ -29,7 +29,7 @@ struct Clustering_functor Point_set* points; Point_set::Property_map cluster_map; const double neighbor_radius; - boost::shared_ptr result; + std::shared_ptr result; Clustering_functor (Point_set* points, const double neighbor_radius, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_outliers_removal_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_outliers_removal_plugin.cpp index 925195e38d4f..c18343a17a95 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_outliers_removal_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_outliers_removal_plugin.cpp @@ -26,7 +26,7 @@ struct Outlier_removal_functor int nb_neighbors; double removed_percentage; double distance_threshold; - boost::shared_ptr result; + std::shared_ptr result; Outlier_removal_functor (Point_set* points, int nb_neighbors, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp index 185ce8930fc5..634ae8c699b1 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_selection_plugin.cpp @@ -332,7 +332,7 @@ class Neighborhood typedef CGAL::Fuzzy_sphere Sphere; Scene_points_with_normal_item* points_item; - boost::shared_ptr tree; + std::shared_ptr tree; public: @@ -351,7 +351,7 @@ class Neighborhood { this->points_item = points_item; - tree = boost::make_shared (points_item->point_set()->begin(), + tree = std::make_shared (points_item->point_set()->begin(), points_item->point_set()->end(), Tree::Splitter(), Search_traits (points_item->point_set()->point_map())); diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp index fc344cec857c..b8117997037c 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_shape_detection_plugin.cpp @@ -440,7 +440,7 @@ class Polyhedron_demo_point_set_shape_detection_plugin : Scene_surface_mesh_item* sm_item = nullptr; sm_item = new Scene_surface_mesh_item; - boost::shared_ptr rg_plane(boost::make_shared(plane)); + std::shared_ptr rg_plane(std::make_shared(plane)); build_alpha_shape( *(point_item->point_set()), rg_plane, sm_item, search_sphere_radius); @@ -656,7 +656,7 @@ class Polyhedron_demo_point_set_shape_detection_plugin : std::map color_map; int index = 0; - for(boost::shared_ptr shape : ransac.shapes()) + for(std::shared_ptr shape : ransac.shapes()) { CGAL::Shape_detection::Cylinder *cyl; cyl = dynamic_cast *>(shape.get()); @@ -731,7 +731,7 @@ class Polyhedron_demo_point_set_shape_detection_plugin : { ss << item->name().toStdString() << "_plane_"; - boost::shared_ptr > pshape + std::shared_ptr > pshape = boost::dynamic_pointer_cast > (shape); Kernel::Point_3 ref = CGAL::ORIGIN + pshape->plane_normal (); @@ -901,7 +901,7 @@ class Polyhedron_demo_point_set_shape_detection_plugin : } template - void build_alpha_shape (Point_set& points, boost::shared_ptr plane, + void build_alpha_shape (Point_set& points, std::shared_ptr plane, Scene_surface_mesh_item* sm_item, double epsilon); }; // end Polyhedron_demo_point_set_shape_detection_plugin @@ -997,7 +997,7 @@ void Polyhedron_demo_point_set_shape_detection_plugin::on_actionDetect_triggered template void Polyhedron_demo_point_set_shape_detection_plugin::build_alpha_shape -(Point_set& points, boost::shared_ptr plane, Scene_surface_mesh_item* sm_item, double epsilon) +(Point_set& points, std::shared_ptr plane, Scene_surface_mesh_item* sm_item, double epsilon) { typedef Kernel::Point_2 Point_2; typedef CGAL::Alpha_shape_vertex_base_2 Vb; diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_simplification_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_simplification_plugin.cpp index cc5431609ac5..05eb2d414937 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_simplification_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_simplification_plugin.cpp @@ -29,7 +29,7 @@ struct Compute_average_spacing_functor { Point_set* points; const int nb_neighbors; - boost::shared_ptr result; + std::shared_ptr result; Compute_average_spacing_functor (Point_set* points, const int nb_neighbors) : points (points), nb_neighbors (nb_neighbors), result (new double(0)) { } @@ -50,7 +50,7 @@ struct Grid_simplify_functor Point_set* points; double grid_size; unsigned int min_points_per_cell; - boost::shared_ptr result; + std::shared_ptr result; Grid_simplify_functor (Point_set* points, double grid_size, unsigned min_points_per_cell) : points (points), grid_size (grid_size), min_points_per_cell(min_points_per_cell) @@ -72,7 +72,7 @@ struct Hierarchy_simplify_functor Point_set* points; unsigned int max_cluster_size; double max_surface_variation; - boost::shared_ptr result; + std::shared_ptr result; Hierarchy_simplify_functor (Point_set* points, double max_cluster_size, diff --git a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_wlop_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_wlop_plugin.cpp index 538a48b32b7f..519b4fff4efc 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_wlop_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/Point_set/Point_set_wlop_plugin.cpp @@ -27,7 +27,7 @@ struct Compute_average_spacing_functor { Point_set* points; const int nb_neighbors; - boost::shared_ptr result; + std::shared_ptr result; Compute_average_spacing_functor (Point_set* points, const int nb_neighbors) : points (points), nb_neighbors (nb_neighbors), result (new double(0)) { } diff --git a/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h b/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h index f2657fda3f1d..7a6d9744999a 100644 --- a/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h +++ b/Polyhedron/demo/Polyhedron/include/run_with_qprogressdialog.h @@ -20,9 +20,9 @@ class Signal_callback mutable std::size_t nb; public: - boost::shared_ptr latest_adv; - boost::shared_ptr state; - boost::shared_ptr signaler; + std::shared_ptr latest_adv; + std::shared_ptr state; + std::shared_ptr signaler; Signal_callback(bool) : latest_adv (new double(0)) @@ -71,7 +71,7 @@ class Signal_callback class Functor_with_signal_callback { protected: - boost::shared_ptr m_callback; + std::shared_ptr m_callback; public: Signal_callback* callback() { return m_callback.get(); } diff --git a/Shape_detection/examples/Shape_detection/efficient_RANSAC_with_point_access.cpp b/Shape_detection/examples/Shape_detection/efficient_RANSAC_with_point_access.cpp index f4e5a859bca9..34abf4d80490 100644 --- a/Shape_detection/examples/Shape_detection/efficient_RANSAC_with_point_access.cpp +++ b/Shape_detection/examples/Shape_detection/efficient_RANSAC_with_point_access.cpp @@ -99,7 +99,7 @@ int main(int argc, char** argv) { Efficient_ransac::Shape_range::iterator it = shapes.begin(); while (it != shapes.end()) { - boost::shared_ptr shape = *it; + std::shared_ptr shape = *it; // Use Shape_base::info() to print the parameters of the detected shape. std::cout << (*it)->info(); diff --git a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h index 53331b8d7091..3612ac02c705 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h +++ b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/Efficient_RANSAC.h @@ -37,7 +37,7 @@ // boost -------------- #include -#include +#include #include //--------------------- @@ -104,36 +104,36 @@ class Efficient_RANSAC { #ifdef DOXYGEN_RUNNING typedef unspecified_type Shape_range; - ///< `Iterator_range` with a bidirectional constant iterator type with value type `boost::shared_ptr`. + ///< `Iterator_range` with a bidirectional constant iterator type with value type `std::shared_ptr`. typedef unspecified_type Plane_range; - ///< `Iterator_range` with a bidirectional constant iterator type with value type `boost::shared_ptr`. + ///< `Iterator_range` with a bidirectional constant iterator type with value type `std::shared_ptr`. #else struct Shape_range : public Iterator_range< - typename std::vector >::const_iterator> { + typename std::vector >::const_iterator> { typedef Iterator_range< - typename std::vector >::const_iterator> Base; + typename std::vector >::const_iterator> Base; - Shape_range(boost::shared_ptr > > + Shape_range(std::shared_ptr > > extracted_shapes) : Base(make_range(extracted_shapes->begin(), extracted_shapes->end())), m_extracted_shapes(extracted_shapes) {} private: - boost::shared_ptr > > + std::shared_ptr > > m_extracted_shapes; // keeps a reference to the shape vector }; struct Plane_range : public Iterator_range< - typename std::vector >::const_iterator> { + typename std::vector >::const_iterator> { typedef Iterator_range< - typename std::vector >::const_iterator> Base; + typename std::vector >::const_iterator> Base; - Plane_range(boost::shared_ptr > > + Plane_range(std::shared_ptr > > extracted_shapes) : Base(make_range(extracted_shapes->begin(), extracted_shapes->end())), m_extracted_shapes(extracted_shapes) {} private: - boost::shared_ptr > > + std::shared_ptr > > m_extracted_shapes; // keeps a reference to the shape vector }; @@ -291,7 +291,7 @@ class Efficient_RANSAC { clear(); m_extracted_shapes = - boost::make_shared > >(); + std::make_shared > >(); m_num_available_points = m_num_total_points = std::distance( m_input_iterator_first, m_input_iterator_beyond); @@ -435,7 +435,7 @@ class Efficient_RANSAC { std::vector().swap(m_shape_index); m_extracted_shapes = - boost::make_shared > >(); + std::make_shared > >(); m_num_available_points = m_num_total_points; @@ -488,7 +488,7 @@ class Efficient_RANSAC { // Reset data structures possibly used by former search m_extracted_shapes = - boost::make_shared > >(); + std::make_shared > >(); m_num_available_points = m_num_total_points; for (std::size_t i = 0; i < m_num_subsets; i++) { @@ -755,7 +755,7 @@ class Efficient_RANSAC { //1. add best candidate to final result. m_extracted_shapes->push_back( - boost::shared_ptr(best_candidate)); + std::shared_ptr(best_candidate)); if (callback && !callback(num_invalid / double(m_num_total_points))) { clear(num_invalid, candidates); @@ -874,7 +874,7 @@ class Efficient_RANSAC { /// @{ /*! Returns an `Iterator_range` with a bidirectional iterator with value type - `boost::shared_ptr` over the detected shapes in the order of detection. + `std::shared_ptr` over the detected shapes in the order of detection. Depending on the chosen probability for the detection, the shapes are ordered with decreasing size. */ @@ -884,21 +884,21 @@ class Efficient_RANSAC { /*! Returns an `Iterator_range` with a bidirectional iterator with - value type `boost::shared_ptr` over only the + value type `std::shared_ptr` over only the detected planes in the order of detection. Depending on the chosen probability for the detection, the planes are ordered with decreasing size. */ Plane_range planes() const { - boost::shared_ptr > > planes - = boost::make_shared > >(); + std::shared_ptr > > planes + = std::make_shared > >(); for (std::size_t i = 0; i < m_extracted_shapes->size(); ++i) { - boost::shared_ptr pshape + std::shared_ptr pshape = boost::dynamic_pointer_cast((*m_extracted_shapes)[i]); // Ignore all shapes other than plane - if (pshape != boost::shared_ptr()) + if (pshape != std::shared_ptr()) planes->push_back(pshape); } return Plane_range(planes); @@ -1218,7 +1218,7 @@ class Efficient_RANSAC { //give the index of the subset of point i std::vector m_index_subsets; - boost::shared_ptr > > m_extracted_shapes; + std::shared_ptr > > m_extracted_shapes; std::vector m_shape_factories; diff --git a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/property_map.h b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/property_map.h index 3fb4ecea249b..774a21437cc9 100644 --- a/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/property_map.h +++ b/Shape_detection/include/CGAL/Shape_detection/Efficient_RANSAC/property_map.h @@ -31,7 +31,7 @@ namespace Shape_detection { class Point_to_shape_index_map { typedef CGAL::Shape_detection::Shape_base Shape; - boost::shared_ptr > m_indices; + std::shared_ptr > m_indices; public: typedef std::size_t key_type; ///< %Index of the point in the random access point range. @@ -50,7 +50,7 @@ namespace Shape_detection { \tparam ShapeRange must be an `Iterator_range` with a bidirectional constant iterator type with value type - `boost::shared_ptr >`. + `std::shared_ptr >`. */ template Point_to_shape_index_map (const PointRange& points, @@ -85,7 +85,7 @@ namespace Shape_detection { { public: typedef CGAL::Shape_detection::Plane Plane_shape; - typedef boost::shared_ptr key_type; + typedef std::shared_ptr key_type; typedef typename Traits::Plane_3 value_type; typedef value_type reference; typedef boost::read_write_property_map_tag category; diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp index 39ac55d03fc9..e907bbbfe0be 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cone_parameters.cpp @@ -74,7 +74,7 @@ bool test_cone_parameters() { if (shapes.size() != 1) continue; - boost::shared_ptr cone = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr cone = boost::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cone. if (!cone) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp index 67cbbf249588..4d05c98d0681 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_cylinder_parameters.cpp @@ -73,7 +73,7 @@ bool test_cylinder_parameters() { if (shapes.size() != 1) continue; - boost::shared_ptr cyl = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr cyl = boost::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cylinder. if (!cyl) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp index b963ed1e6364..e47a2f472161 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_plane_parameters.cpp @@ -67,7 +67,7 @@ bool test_plane_parameters() { if (shapes.size() != 1) continue; - boost::shared_ptr pl = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr pl = boost::dynamic_pointer_cast((*shapes.first)); if (!pl) continue; diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_scene.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_scene.cpp index fbe007b13c79..e78e2e3ca5a2 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_scene.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_scene.cpp @@ -75,7 +75,7 @@ bool test_scene(int argc, char** argv) { // Iterate through all shapes and access each point. while (it != shapes.end()) { - boost::shared_ptr shape = *it; + std::shared_ptr shape = *it; // Sum distances of points to detected shapes. FT sum_distances = 0; diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp index 0dbc63bb9de1..c6dcb0e0999a 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_sphere_parameters.cpp @@ -70,7 +70,7 @@ bool test_sphere_parameters() { if (shapes.size() != 1) continue; - boost::shared_ptr sphere = boost::dynamic_pointer_cast((*shapes.first)); + std::shared_ptr sphere = boost::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a cylinder. if (!sphere) diff --git a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp index 42138f178ffb..c380d26c7f95 100644 --- a/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp +++ b/Shape_detection/test/Shape_detection/test_efficient_RANSAC_torus_parameters.cpp @@ -72,7 +72,7 @@ bool test_torus_parameters() { if (shapes.size() != 1) continue; - boost::shared_ptr torus = + std::shared_ptr torus = boost::dynamic_pointer_cast((*shapes.first)); // Check: shape detected is a torus. diff --git a/Straight_skeleton_2/benchmark/Straight_skeleton_2/compare_kernels_simple_polygon_skeleton.cpp b/Straight_skeleton_2/benchmark/Straight_skeleton_2/compare_kernels_simple_polygon_skeleton.cpp index c75bc824e4b5..45b78c18a09b 100644 --- a/Straight_skeleton_2/benchmark/Straight_skeleton_2/compare_kernels_simple_polygon_skeleton.cpp +++ b/Straight_skeleton_2/benchmark/Straight_skeleton_2/compare_kernels_simple_polygon_skeleton.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -97,7 +97,7 @@ void build_skeleton(const char* fname) time.start(); SsBuilder ssb; ssb.enter_contour(pgn.vertices_begin(), pgn.vertices_end()); - boost::shared_ptr straight_ske = ssb.construct_skeleton(); + std::shared_ptr straight_ske = ssb.construct_skeleton(); time.stop(); std::cout << "Time spent to build skeleton " << time.time() << "\n"; diff --git a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton.cpp b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton.cpp index c20f36018839..206d7fdaeca5 100644 --- a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton.cpp +++ b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton.cpp @@ -1,7 +1,5 @@ #include -#include - #include #include #include @@ -13,8 +11,8 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp index 0f8da09cbfc7..438017f36f6a 100644 --- a/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp +++ b/Straight_skeleton_2/benchmark/Straight_skeleton_2/create_exterior_skeleton_tweaking_skeleton.cpp @@ -1,7 +1,5 @@ #include -#include - #include #include #include @@ -13,8 +11,8 @@ typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; typedef Ss::Halfedge_const_iterator Halfedge_const_iterator ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_2.h index 3f4db57e8811..65cbf5cbb715 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Polygon_offset_builder_2.h @@ -91,12 +91,12 @@ or external angle approaches `0`, numerical overflow may prevent some of the pol If that happens, the failed contour just won't be added into the resulting sequence. \tparam OutputIterator must be a model of the OutputIterator category whose `value_type` - is a `boost::shared_ptr` holding the dynamically allocated instances of type `Container`. + is a `std::shared_ptr` holding the dynamically allocated instances of type `Container`. \param t the offset value \param out an output iterator. For each resulting offset contour, a default constructed instance of `Container` type, is dynamically allocated and each offset vertex is added to it. - A `boost::shared_ptr` holding onto the dynamically allocated container is inserted + A `std::shared_ptr` holding onto the dynamically allocated container is inserted into the output sequence via the OutputIterator `out`. \returns an `OutputIterator` past-the-end of the resulting sequence, which contains each offset contour generated. diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h index 0f832497438b..1c0c422aa365 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_builder_2.h @@ -195,7 +195,7 @@ must be entered before calling `construct_skeleton()`. After `construct_skeleton()` completes, you cannot enter more contours and/or call `construct_skeleton()` again. If you need another straight skeleton for another polygon you must instantiate and use another builder. -The result is a dynamically allocated instance of the `Ss` class, wrapped in a `boost::shared_ptr`. +The result is a dynamically allocated instance of the `Ss` class, wrapped in a `std::shared_ptr`. If the construction process fails for whatever reason (such as a nearly-degenerate vertex whose internal or external angle is almost zero), the return value will be null, represented @@ -204,7 +204,7 @@ by a default constructed `shared_ptr`. The algorithm automatically checks the consistency of the result, thus, if it is not nullptr, it is guaranteed to be valid. */ -boost::shared_ptr construct_skeleton(); +std::shared_ptr construct_skeleton(); /// @} diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h index d3ff08ad9f40..a5ea28252e2f 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/Straight_skeleton_converter_2.h @@ -14,7 +14,7 @@ using the items converter `ic` to convert the geometric embedding to the types o \sa `CGAL::Straight_skeleton_converter_2` */ template -boost::shared_ptr +std::shared_ptr convert_straight_skeleton_2( Source_skeleton const& s, Items_converted const& ic = Items_converter() ); @@ -77,7 +77,7 @@ Straight_skeleton_converter_2( const Items_converter& c = Items_converter() ); /*! returns a new straight skeleton data structure with the same combinatorial and geometric data as `s` using the items converter to convert the geometric embeeding to the types of the target traits. */ -boost::shared_ptr operator()( const Source_skeleton& s) const; +std::shared_ptr operator()( const Source_skeleton& s) const; /// @} diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h index 49c4814f04fa..9b558743b362 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/arrange_offset_polygons_2.h @@ -8,16 +8,16 @@ by `create_offset_polygons_2()` into 2D polygons with holes by determining geome relationships using a simple algorithm based on the particular characteristics of offset polygons. The function determines parent-hole relationships among the polygons given by `[begin,end]` creating -`boost::shared_ptr< GeneralPolygonWithHoles_2 >` objects added to the output sequence given `out`. +`std::shared_ptr< GeneralPolygonWithHoles_2 >` objects added to the output sequence given `out`. A `CLOCKWISE` oriented polygon `H` is a hole of a `COUNTERCLOCKWISE` polygon `P`, iff at least one vertex of `H` is `ON_BOUNDED_SIDE` of `P`. This function should not be used to arrange arbitrary polygons into polygons with holes unless they meet the requirements specified below. \tparam K must be a model of `Kernel`. \tparam InputPolygonPtrIterator must be a model of `InputIterator` whose `value_type` is a smart pointer -(such as `boost::shared_ptr`) whose `element_type` is a model of `SequenceContainer` with value type `K::Point_2`. +(such as `std::shared_ptr`) whose `element_type` is a model of `SequenceContainer` with value type `K::Point_2`. \tparam OutputPolygonWithHolesPtrIterator must be a model of `OutputIterator` whose `value_type` is a smart pointer -(such as `boost::shared_ptr`) whose `element_type` is a model of `GeneralPolygonWithHoles_2`. +(such as `std::shared_ptr`) whose `element_type` is a model of `GeneralPolygonWithHoles_2`. \pre The input polygons must be simple. \pre The set of input polygons are unique and interior disjoint. That is, given distinct polygons diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_2.h index 831b3967b62b..1d4b660c8a18 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_2.h @@ -25,7 +25,7 @@ of a polygon with holes, the offset polygons will be generated in its exterior. \sa `Polygon_offset_builder_2` */ template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_offset_polygons_2 ( FT offset, const StraightSkeleton& s, OfK k = Exact_predicates_inexact_constructions_kernel ) ; @@ -63,7 +63,7 @@ polygons to be constructed. \sa `Polygon_offset_builder_2` */ template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_exterior_skeleton_and_offset_polygons_2( FT offset, const InKPolygon& poly, OfK ofk = Exact_predicates_inexact_constructions_kernel, @@ -100,7 +100,7 @@ and `create_offset_polygons_2()` instead. \sa `Polygon_offset_builder_2` */ template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_interior_skeleton_and_offset_polygons_2 ( FT offset, const InKPolygon& outer_boundary, HoleIterator holes_begin, @@ -135,7 +135,7 @@ and `create_offset_polygons_2()` instead. \sa `Polygon_offset_builder_2` */ template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_interior_skeleton_and_offset_polygons_2 ( FT offset, const InKPolygon& poly, OfK ofk = CGAL::Exact_predicates_inexact_constructions_kernel, diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_from_polygon_with_holes_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_from_polygon_with_holes_2.h index b2eea3ecf4b9..ea2025cb49e0 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_from_polygon_with_holes_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_offset_polygons_from_polygon_with_holes_2.h @@ -25,7 +25,7 @@ This is equivalent to `arrange_offset_polygons_2(create_interior_skeleton_and_of \sa `Polygon_offset_builder_2` */ template -std::vector< boost::shared_ptr< OfKPolygon > > +std::vector< std::shared_ptr< OfKPolygon > > create_interior_skeleton_and_offset_polygons_with_holes_2(FT offset, const InKPolygon& poly_with_holes, OfK ofk = CGAL::Exact_predicates_inexact_constructions_kernel, @@ -63,7 +63,7 @@ having reversed the orientation of all other polygons. \sa `Polygon_offset_builder_2` */ template -std::vector > +std::vector > create_exterior_skeleton_and_offset_polygons_with_holes_2(FT offset, const InKPolygon& poly_with_holes, OfK ofk = Exact_predicates_inexact_constructions_kernel, diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_straight_skeleton_2.h b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_straight_skeleton_2.h index 3840424cd213..7d175b73f984 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_straight_skeleton_2.h +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/CGAL/create_straight_skeleton_2.h @@ -26,7 +26,7 @@ from this exterior skeleton, as computed by the function `compute_outer_frame_ma \sa `CGAL::Straight_skeleton_builder_2` */ template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_exterior_straight_skeleton_2( FT max_offset, PointIterator vertices_begin, PointIterator vertices_end, @@ -56,7 +56,7 @@ from this exterior skeleton, as computed by the function `compute_outer_frame_ma \sa `CGAL::Straight_skeleton_builder_2` */ template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_exterior_straight_skeleton_2 ( FT max_offset, const Polygon& P, SsK k = CGAL::Exact_predicates_inexact_constructions_kernel ) ; @@ -82,7 +82,7 @@ holes given by `[holes_begin,holes_end]`. \sa `CGAL::Straight_skeleton_builder_2` */ template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_interior_straight_skeleton_2 ( PointIterator outer_contour_vertices_begin, PointIterator outer_contour_vertices_end, HoleIterator holes_begin, @@ -105,7 +105,7 @@ polygon whose outer boundary is given by the point sequence \sa `CGAL::Straight_skeleton_builder_2` */ template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_interior_straight_skeleton_2 ( PointIterator outer_contour_vertices_begin, PointIterator outer_contour_vertices_end, SsK k = CGAL::Exact_predicates_inexact_constructions_kernel ) ; @@ -127,7 +127,7 @@ polygon `outer_contour`. \sa `CGAL::Straight_skeleton_builder_2` */ template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_interior_straight_skeleton_2 ( const Polygon& outer_contour, SsK k = CGAL::Exact_predicates_inexact_constructions_kernel ) ; diff --git a/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt b/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt index 30063a178b51..0c05bf7e5e22 100644 --- a/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt +++ b/Straight_skeleton_2/doc/Straight_skeleton_2/Straight_skeleton_2.txt @@ -368,11 +368,11 @@ To construct a set of inward offset contours the user must: (3) Call `Polygon_offset_builder_2::construct_offset_contours()` passing the desired offset distance and an output iterator that can store a -`boost::shared_ptr` of `Container` instances +`std::shared_ptr` of `Container` instances into a resulting sequence (typically, a back insertion iterator) Each element in the resulting sequence is an offset contour, given by -a `boost::shared_ptr` holding a dynamically allocated instance +a `std::shared_ptr` holding a dynamically allocated instance of the Container type. Such a container can be any model of the `SequenceContainer` concept, for example, a `CGAL::Polygon_2`, or just a `std::vector` of 2D points. diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_offset_polygons_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_offset_polygons_2.cpp index fed811266216..f89d23f00187 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_offset_polygons_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_offset_polygons_2.cpp @@ -4,7 +4,7 @@ #include #include "print.h" -#include +#include #include #include @@ -15,8 +15,8 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_saop_from_polygon_with_holes_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_saop_from_polygon_with_holes_2.cpp index 95eca620ae7a..ba3e555ec094 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_saop_from_polygon_with_holes_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_saop_from_polygon_with_holes_2.cpp @@ -4,7 +4,7 @@ #include #include "print.h" -#include +#include #include #include @@ -16,8 +16,8 @@ typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_2.cpp index d0b1a979669b..572814f66820 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_2.cpp @@ -4,7 +4,7 @@ #include #include "print.h" -#include +#include #include #include @@ -16,8 +16,8 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_with_holes_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_with_holes_2.cpp index bf91a2de00d8..2bdd31e75f74 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_with_holes_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_skeleton_and_offset_polygons_with_holes_2.cpp @@ -4,7 +4,7 @@ #include #include "print.h" -#include +#include #include #include @@ -15,7 +15,7 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Polygon_with_holes_2 PolygonWithHoles ; -typedef boost::shared_ptr PolygonWithHolesPtr ; +typedef std::shared_ptr PolygonWithHolesPtr ; typedef std::vector PolygonWithHolesPtrVector; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_2.cpp index ce2e11e57f9a..08e57f794af0 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_2.cpp @@ -4,8 +4,6 @@ #include #include "print.h" -#include - #include typedef CGAL::Exact_predicates_inexact_constructions_kernel K ; @@ -14,7 +12,7 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr SsPtr ; int main() { diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_from_polygon_with_holes_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_from_polygon_with_holes_2.cpp index 3dfe3b48437b..98dc57fac285 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_from_polygon_with_holes_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Create_straight_skeleton_from_polygon_with_holes_2.cpp @@ -4,7 +4,7 @@ #include #include "print.h" -#include +#include #include @@ -15,7 +15,7 @@ typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr SsPtr ; int main() { diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp index 798228788ba0..52e405a4dd31 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Low_level_API.cpp @@ -7,7 +7,7 @@ #include #include "print.h" -#include +#include #include #include @@ -22,7 +22,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_2 Point_2; typedef CGAL::Polygon_2 Contour; -typedef boost::shared_ptr ContourPtr; +typedef std::shared_ptr ContourPtr; typedef std::vector ContourSequence ; typedef CGAL::Straight_skeleton_2 Ss; @@ -97,7 +97,7 @@ int main() ssb.enter_contour(star.rbegin(),star.rend()); // Construct the skeleton - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); // Proceed only if the skeleton was correctly constructed. if ( ss ) diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/Show_offset_polygon.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/Show_offset_polygon.cpp index 296d721cc40f..8a35567dafd5 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/Show_offset_polygon.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/Show_offset_polygon.cpp @@ -4,7 +4,7 @@ #include #include "dump_to_eps.h" -#include +#include #include #include @@ -16,7 +16,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K ; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes ; -typedef boost::shared_ptr Polygon_with_holes_ptr ; +typedef std::shared_ptr Polygon_with_holes_ptr ; typedef std::vector Polygon_with_holes_ptr_vector ; 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 080749ec9628..1273b49f7851 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 @@ -6,8 +6,6 @@ #include #include -#include - #include #include #include @@ -21,7 +19,7 @@ typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes ; typedef CGAL::Straight_skeleton_2 Straight_skeleton ; -typedef boost::shared_ptr Straight_skeleton_ptr ; +typedef std::shared_ptr Straight_skeleton_ptr ; int main( int argc, char* argv[] ) { diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/draw_straight_skeleton_2.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/draw_straight_skeleton_2.cpp index c86c3f4593e6..96f3da42c1d2 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/draw_straight_skeleton_2.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/draw_straight_skeleton_2.cpp @@ -4,8 +4,6 @@ #include #include -#include - #include typedef CGAL::Exact_predicates_inexact_constructions_kernel K ; @@ -14,7 +12,7 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr SsPtr ; int main() { diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/dump_to_eps.h b/Straight_skeleton_2/examples/Straight_skeleton_2/dump_to_eps.h index 5e94bf72b3dd..efc8694a9212 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/dump_to_eps.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/dump_to_eps.h @@ -84,11 +84,11 @@ void dump_to_eps( CGAL::Straight_skeleton_2 const& aSkeleton, char const* aTy template void dump_to_eps ( CGAL::Polygon_with_holes_2 const& aInput - , std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > const& aOutput + , std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > const& aOutput , std::ostream& rOut ) { - typedef std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > PolyWH_vector ; + typedef std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > PolyWH_vector ; CGAL::Bbox_2 lBbox = CGAL::bbox_2(aInput); diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp b/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp index f6e0a86a9312..d2da4691924c 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/exterior_offset_of_multiple_polygons_with_holes.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include @@ -17,8 +17,8 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Polygon_with_holes_2 PolygonWithHoles ; -typedef boost::shared_ptr PolygonWithHolesPtr ; -typedef boost::shared_ptr PolygonPtr ; +typedef std::shared_ptr PolygonWithHolesPtr ; +typedef std::shared_ptr PolygonPtr ; typedef std::vector PolygonWithHolesPtrVector; typedef std::vector PolygonPtrVector; diff --git a/Straight_skeleton_2/examples/Straight_skeleton_2/print.h b/Straight_skeleton_2/examples/Straight_skeleton_2/print.h index 4afc5e4a3bd5..216e11f0dd6c 100644 --- a/Straight_skeleton_2/examples/Straight_skeleton_2/print.h +++ b/Straight_skeleton_2/examples/Straight_skeleton_2/print.h @@ -21,9 +21,9 @@ void print_polygon ( CGAL::Polygon_2 const& poly ) } template -void print_polygons ( std::vector< boost::shared_ptr< CGAL::Polygon_2 > > const& polies ) +void print_polygons ( std::vector< std::shared_ptr< CGAL::Polygon_2 > > const& polies ) { - typedef std::vector< boost::shared_ptr< CGAL::Polygon_2 > > PolygonVector ; + typedef std::vector< std::shared_ptr< CGAL::Polygon_2 > > PolygonVector ; std::cout << "Polygon list with " << polies.size() << " polygons" << std::endl ; @@ -45,10 +45,10 @@ void print_polygon_with_holes ( CGAL::Polygon_with_holes_2 const& polywh ) } template -void print_polygons_with_holes ( std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > const& polies ) +void print_polygons_with_holes ( std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > const& polies ) { - typedef std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > PolygonWithHolesVector ; + typedef std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > PolygonWithHolesVector ; std::cout << "Polygon_with_holes list with " << polies.size() << " element" << std::endl ; diff --git a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h index 9d498c8f7ea5..3ddac56aa28d 100644 --- a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include @@ -71,7 +71,7 @@ public : typedef boost::optional OptionalPoint_2 ; - typedef boost::shared_ptr ContainerPtr ; + typedef std::shared_ptr ContainerPtr ; Polygon_offset_builder_2( Ss const& aSs, Traits const& aTraits = Traits(), Visitor const& aVisitor = Visitor() ) ; diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_iterators.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_iterators.h index 4740194987b2..04aa6864b4cd 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_iterators.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Polygon_iterators.h @@ -15,7 +15,7 @@ #include -#include +#include namespace CGAL { namespace CGAL_SS_i { @@ -33,11 +33,11 @@ inline typename Poly::const_iterator vertices_end ( Poly const& aPoly ) { return aPoly.end() ; } template -inline typename Poly::const_iterator vertices_begin ( boost::shared_ptr const& aPoly ) +inline typename Poly::const_iterator vertices_begin ( std::shared_ptr const& aPoly ) { return aPoly->begin() ; } template -inline typename Poly::const_iterator vertices_end ( boost::shared_ptr const& aPoly ) +inline typename Poly::const_iterator vertices_end ( std::shared_ptr const& aPoly ) { return aPoly->end() ; } // Polygon_2 @@ -52,11 +52,11 @@ vertices_end( Polygon_2 const& aPoly ) { return aPoly.vertices_end() ; } template -inline typename Polygon_2::Vertex_const_iterator vertices_begin ( boost::shared_ptr > const& aPoly ) +inline typename Polygon_2::Vertex_const_iterator vertices_begin ( std::shared_ptr > const& aPoly ) { return aPoly->vertices_begin() ; } template -inline typename Polygon_2::Vertex_const_iterator vertices_end( boost::shared_ptr > const& aPoly ) +inline typename Polygon_2::Vertex_const_iterator vertices_end( std::shared_ptr > const& aPoly ) { return aPoly->vertices_end() ; } // Polygon_with_holes_2 @@ -72,12 +72,12 @@ vertices_end( Polygon_with_holes_2 const& aPoly ) template inline typename Polygon_with_holes_2::Polygon_2::Vertex_const_iterator -vertices_begin ( boost::shared_ptr > const& aPoly ) +vertices_begin ( std::shared_ptr > const& aPoly ) { return aPoly->outer_boundary().vertices_begin() ; } template inline typename Polygon_with_holes_2::Polygon_2::Vertex_const_iterator -vertices_end( boost::shared_ptr > const& aPoly ) +vertices_end( std::shared_ptr > const& aPoly ) { return aPoly->outer_boundary().vertices_end() ; } } // namespace CGAL_SS_i diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h index c0fea4462de9..c7e3f77fbd7b 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include @@ -111,7 +111,7 @@ class Straight_skeleton_builder_2 typedef SSkel_ SSkel ; typedef Visitor_ Visitor ; - typedef boost::shared_ptr SSkelPtr ; + typedef std::shared_ptr SSkelPtr ; private : diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_converter_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_converter_2.h index 650b1894a2a5..0665d6de3742 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_converter_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_converter_2.h @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -163,7 +163,7 @@ struct Straight_skeleton_converter_2 typedef typename Source_skeleton::Traits Source_traits ; typedef typename Target_skeleton::Traits Target_traits ; - typedef boost::shared_ptr Target_skeleton_ptr ; + typedef std::shared_ptr Target_skeleton_ptr ; typedef typename Source_skeleton::Vertex_const_iterator Source_vertex_const_iterator ; typedef typename Source_skeleton::Halfedge_const_iterator Source_halfedge_const_iterator ; @@ -333,7 +333,7 @@ private : } ; template -boost::shared_ptr +std::shared_ptr convert_straight_skeleton_2 ( Source_skeleton const& aSrc, Items_converter const& ic ) { typedef Straight_skeleton_converter_2 Skeleton_converter ; @@ -345,7 +345,7 @@ convert_straight_skeleton_2 ( Source_skeleton const& aSrc, Items_converter const } template -boost::shared_ptr +std::shared_ptr convert_straight_skeleton_2 ( Source_skeleton const& aSrc ) { typedef Straight_skeleton_items_converter_2 Items_converter ; diff --git a/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h b/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h index 4ceae69e570c..840e0950b84f 100644 --- a/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h +++ b/Straight_skeleton_2/include/CGAL/arrange_offset_polygons_2.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include @@ -53,7 +53,7 @@ bool arrange_offset_polygons_2 ( InputPolygonPtrIterator aBegin typedef typename std::iterator_traits::difference_type difference_type ; typedef typename std::iterator_traits::value_type PolygonPtr ; - typedef boost::shared_ptr PolygonWithHolesPtr ; + typedef std::shared_ptr PolygonWithHolesPtr ; difference_type lSize = std::distance(aBegin,aEnd); @@ -113,18 +113,18 @@ bool arrange_offset_polygons_2 ( InputPolygonPtrIterator aBegin } template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline -arrange_offset_polygons_2 ( std::vector > const& aPolygons, +arrange_offset_polygons_2 ( std::vector > const& aPolygons, bool& no_error) { - typedef std::vector< boost::shared_ptr > result_type ; + typedef std::vector< std::shared_ptr > result_type ; typedef std::back_insert_iterator Back_inserter; typedef typename PolygonWithHoles::General_polygon_2 Polygon_2 ; typedef typename Kernel_traits::type>::Kernel K ; - typedef typename std::vector >::const_iterator PolygonIterator ; + typedef typename std::vector >::const_iterator PolygonIterator ; result_type rResult ; no_error = arrange_offset_polygons_2( @@ -134,9 +134,9 @@ arrange_offset_polygons_2 ( std::vector > const& aPol } template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline -arrange_offset_polygons_2 ( std::vector > const& aPolygons) +arrange_offset_polygons_2 ( std::vector > const& aPolygons) { bool no_error; return arrange_offset_polygons_2(aPolygons, no_error); diff --git a/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h b/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h index dbaa31bbcb8f..9a8a97012cb6 100644 --- a/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h +++ b/Straight_skeleton_2/include/CGAL/create_offset_polygons_2.h @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include @@ -103,7 +103,7 @@ struct Default_return_polygon_with_holes_type // Polygon ty }; template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_partial_interior_straight_skeleton_2 ( FT const& aMaxTime , PointIterator aOuterContour_VerticesBegin , PointIterator aOuterContour_VerticesEnd @@ -139,7 +139,7 @@ create_partial_interior_straight_skeleton_2 ( FT const& aMaxTime } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_partial_exterior_straight_skeleton_2 ( FT const& aMaxOffset , PointIterator aVerticesBegin , PointIterator aVerticesEnd @@ -152,7 +152,7 @@ create_partial_exterior_straight_skeleton_2 ( FT const& aMaxOffset typedef typename Kernel_traits::Kernel IK; typedef typename IK::FT IFT; - boost::shared_ptr > rSkeleton; + std::shared_ptr > rSkeleton; // That's because we might not have FT == IK::FT (e.g. `double` and `Core`) // Note that we can also have IK != K (e.g. `Simple_cartesian` and `EPICK`) @@ -199,10 +199,10 @@ create_partial_exterior_straight_skeleton_2 ( FT const& aMaxOffset // Kernel != Skeleton::kernel. The skeleton is converted to Straight_skeleton_2 // template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_offset_polygons_2 ( FT const& aOffset, Skeleton const& aSs, K const& , Tag_false ) { - typedef boost::shared_ptr OutPolygonPtr ; + typedef std::shared_ptr OutPolygonPtr ; typedef std::vector OutPolygonPtrVector ; typedef Straight_skeleton_2 OfSkeleton ; @@ -212,7 +212,7 @@ create_offset_polygons_2 ( FT const& aOffset, Skeleton const& aSs, K const& , Ta OutPolygonPtrVector rR ; - boost::shared_ptr lConvertedSs = convert_straight_skeleton_2(aSs); + std::shared_ptr lConvertedSs = convert_straight_skeleton_2(aSs); OffsetBuilder ob( *lConvertedSs ); ob.construct_offset_contours(aOffset, std::back_inserter(rR) ) ; @@ -223,10 +223,10 @@ create_offset_polygons_2 ( FT const& aOffset, Skeleton const& aSs, K const& , Ta // Kernel == Skeleton::kernel, no conversion // template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > create_offset_polygons_2 ( FT const& aOffset, Skeleton const& aSs, K const& /*k*/, Tag_true ) { - typedef boost::shared_ptr OutPolygonPtr ; + typedef std::shared_ptr OutPolygonPtr ; typedef std::vector OutPolygonPtrVector ; typedef Polygon_offset_builder_traits_2 OffsetBuilderTraits; @@ -242,7 +242,7 @@ create_offset_polygons_2 ( FT const& aOffset, Skeleton const& aSs, K const& /*k* // Allow failure due to invalid straight skeletons to go through the users template -Skeleton const& dereference ( boost::shared_ptr const& ss ) +Skeleton const& dereference ( std::shared_ptr const& ss ) { CGAL_precondition(ss.get() != 0); return *ss; @@ -251,7 +251,7 @@ Skeleton const& dereference ( boost::shared_ptr const& ss ) } // namespace CGAL_SS_i template -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_offset_polygons_2(const FT& aOffset, const Skeleton& aSs, @@ -263,7 +263,7 @@ create_offset_polygons_2(const FT& aOffset, template, class FT, class Skeleton> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_offset_polygons_2(const FT& aOffset, const Skeleton& aSs) @@ -278,7 +278,7 @@ create_offset_polygons_2(const FT& aOffset, template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aOuterBoundary, @@ -302,7 +302,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aOuterBoundary, @@ -319,7 +319,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, // Overload where Polygon actually is a simple polygon (no holes) template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly, @@ -337,7 +337,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, // Overloads common to both polygons with and without holes, a simple polygon is returned in any case template::type> -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly, @@ -350,7 +350,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, template::type> -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly) @@ -369,7 +369,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, // Overload where Polygon actually is a simple polygon (no holes) template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly, @@ -392,7 +392,7 @@ create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, // Overloads common to both polygons with and without holes, a simple polygons are returned in any case template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly, @@ -405,7 +405,7 @@ create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, template::type> -std::vector< boost::shared_ptr > +std::vector< std::shared_ptr > inline create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, const APolygon& aPoly) diff --git a/Straight_skeleton_2/include/CGAL/create_offset_polygons_from_polygon_with_holes_2.h b/Straight_skeleton_2/include/CGAL/create_offset_polygons_from_polygon_with_holes_2.h index 745ce692b683..1edf67e1129b 100644 --- a/Straight_skeleton_2/include/CGAL/create_offset_polygons_from_polygon_with_holes_2.h +++ b/Straight_skeleton_2/include/CGAL/create_offset_polygons_from_polygon_with_holes_2.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -38,7 +38,7 @@ namespace CGAL { // overload where PolygonWithHoles actually is a type of Polygon that supports holes template::type> // Hole-less polygon type -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, const PolygonWithHoles& aPoly, @@ -57,7 +57,7 @@ create_interior_skeleton_and_offset_polygons_2(const FT& aOffset, // Polygon might be a Polygon with holes or not, but it returns a Polygon with holes template::type> -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly, @@ -70,7 +70,7 @@ create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, template::type> -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly, @@ -83,7 +83,7 @@ create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, template::type> -std::vector > +std::vector > inline create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly) @@ -102,7 +102,7 @@ create_interior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, // Polygon might be a Polygon with holes or not, but it returns a Polygon with holes template::type> -std::vector > +std::vector > inline create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly, @@ -110,7 +110,7 @@ create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const SsK& ssk) { typedef typename CGAL_SS_i::Default_return_polygon_type::type Polygon_; - std::vector > raw_output = + std::vector > raw_output = create_exterior_skeleton_and_offset_polygons_2(aOffset, aPoly, ofk, ssk); // filter offset of the outer frame @@ -129,7 +129,7 @@ create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, if (outer_id != (raw_output.size()-1)) std::swap(raw_output[outer_id], raw_output.back()); raw_output.pop_back(); - for (boost::shared_ptr ptr : raw_output) + for (std::shared_ptr ptr : raw_output) ptr->reverse_orientation(); return arrange_offset_polygons_2(raw_output); @@ -140,7 +140,7 @@ create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, // overload where PolygonWithHoles actually is a type of Polygon that supports holes template::type> -std::vector > +std::vector > inline create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, const PolygonWithHoles& aPoly, @@ -149,14 +149,14 @@ create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, std::enable_if_t< CGAL_SS_i::has_Hole_const_iterator::value>* = nullptr) { - std::vector > polygons = + std::vector > polygons = create_exterior_skeleton_and_offset_polygons_2(aOffset, aPoly.outer_boundary(), ofk, ssk); for (typename PolygonWithHoles::Hole_const_iterator hit=aPoly.holes_begin(); hit!=aPoly.holes_end(); ++hit) { typename PolygonWithHoles::Polygon_2 hole = *hit; hole.reverse_orientation(); - std::vector > hole_polygons = + std::vector > hole_polygons = create_interior_skeleton_and_offset_polygons_2(aOffset, hole, ofk,ssk); @@ -168,7 +168,7 @@ create_exterior_skeleton_and_offset_polygons_2(const FT& aOffset, template::type> -std::vector > +std::vector > inline create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly, @@ -181,7 +181,7 @@ create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, template::type> -std::vector > +std::vector > inline create_exterior_skeleton_and_offset_polygons_with_holes_2(const FT& aOffset, const Polygon& aPoly) diff --git a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h index aa73ed322c68..d88fb85ac505 100644 --- a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_2.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -31,7 +31,7 @@ namespace CGAL { template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin , PointIterator aOuterContour_VerticesEnd , HoleIterator aHolesBegin @@ -61,7 +61,7 @@ create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin } template -boost::shared_ptr< Straight_skeleton_2< Exact_predicates_inexact_constructions_kernel > > +std::shared_ptr< Straight_skeleton_2< Exact_predicates_inexact_constructions_kernel > > inline create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin , PointIterator aOuterContour_VerticesEnd @@ -78,7 +78,7 @@ create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin , PointIterator aOuterContour_VerticesEnd @@ -98,7 +98,7 @@ create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin , PointIterator aOuterContour_VerticesEnd @@ -111,7 +111,7 @@ create_interior_straight_skeleton_2 ( PointIterator aOuterContour_VerticesBegin } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_interior_straight_skeleton_2 ( Polygon const& aOutContour, K const& k, @@ -125,7 +125,7 @@ create_interior_straight_skeleton_2 ( Polygon const& aOutContour, } template -boost::shared_ptr< Straight_skeleton_2< Exact_predicates_inexact_constructions_kernel > > +std::shared_ptr< Straight_skeleton_2< Exact_predicates_inexact_constructions_kernel > > inline create_interior_straight_skeleton_2 ( Polygon const& aOutContour ) { @@ -138,7 +138,7 @@ create_interior_straight_skeleton_2 ( Polygon const& aOutContour ) /// EXTERIOR template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > create_exterior_straight_skeleton_2 ( FT const& aMaxOffset , PointIterator aVerticesBegin , PointIterator aVerticesEnd @@ -151,7 +151,7 @@ create_exterior_straight_skeleton_2 ( FT const& aMaxOffset typedef typename Kernel_traits::Kernel IK; typedef typename IK::FT IFT; - boost::shared_ptr > rSkeleton; + std::shared_ptr > rSkeleton; // That's because we might not have FT == IK::FT (e.g. `double` and `Core`) // Note that we can also have IK != K (e.g. `Simple_cartesian` and `EPICK`) @@ -195,7 +195,7 @@ create_exterior_straight_skeleton_2 ( FT const& aMaxOffset } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_exterior_straight_skeleton_2 ( FT const& aMaxOffset , PointIterator aVerticesBegin @@ -210,7 +210,7 @@ create_exterior_straight_skeleton_2 ( FT const& aMaxOffset } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_exterior_straight_skeleton_2 ( FT const& aMaxOffset, Polygon const& aPoly, K const& k ) { @@ -222,7 +222,7 @@ create_exterior_straight_skeleton_2 ( FT const& aMaxOffset, Polygon const& aPoly } template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_exterior_straight_skeleton_2 ( FT const& aMaxOffset, Polygon const& aPoly ) { diff --git a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_from_polygon_with_holes_2.h b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_from_polygon_with_holes_2.h index 34ededf3da79..9693981d4e09 100644 --- a/Straight_skeleton_2/include/CGAL/create_straight_skeleton_from_polygon_with_holes_2.h +++ b/Straight_skeleton_2/include/CGAL/create_straight_skeleton_from_polygon_with_holes_2.h @@ -20,14 +20,14 @@ #include -#include +#include #include namespace CGAL { template -boost::shared_ptr< Straight_skeleton_2 > +std::shared_ptr< Straight_skeleton_2 > inline create_interior_straight_skeleton_2 ( Polygon const& aPolyWithHoles, K const& k, diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h index e4470f203664..7f6217477a8b 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_offset_builder_types.h @@ -21,7 +21,7 @@ #include #include -#include +#include #include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; @@ -29,10 +29,10 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point; typedef CGAL::Aff_transformation_2 Transformation; typedef std::vector Polygon_2; -typedef boost::shared_ptr PolygonPtr; +typedef std::shared_ptr PolygonPtr; typedef CGAL::Segment_2 Segment; typedef std::vector Region ; -typedef boost::shared_ptr RegionPtr ; +typedef std::shared_ptr RegionPtr ; typedef std::vector Regions ; typedef std::vector Doubles ; @@ -51,7 +51,7 @@ typedef Sls::Vertex_const_handle Vertex_const_handle ; typedef CGAL::HalfedgeDS_const_decorator Sls_const_decorator ; -typedef boost::shared_ptr SlsPtr ; +typedef std::shared_ptr SlsPtr ; #endif diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h index f41d7f30f811..7a77342eba14 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_builder_types.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include //typedef CGAL::Simple_cartesian K ; @@ -30,10 +30,10 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point; typedef CGAL::Aff_transformation_2 Transformation; typedef std::vector Polygon_2; -typedef boost::shared_ptr PolygonPtr; +typedef std::shared_ptr PolygonPtr; typedef CGAL::Segment_2 Segment; typedef std::vector Region ; -typedef boost::shared_ptr RegionPtr ; +typedef std::shared_ptr RegionPtr ; typedef std::vector Regions ; typedef std::vector Doubles ; @@ -50,7 +50,7 @@ typedef Sls::Vertex_const_handle Vertex_const_handle ; typedef CGAL::HalfedgeDS_const_decorator Sls_const_decorator ; -typedef boost::shared_ptr SlsPtr ; +typedef std::shared_ptr SlsPtr ; #endif diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h index c45acacbddab..cc55c28210ad 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/include/CGAL/test_sls_types.h @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include @@ -50,16 +50,16 @@ typedef std::vector Doubles ; typedef CGAL::Segment_2 ISegment; typedef std::vector IPolygon; -typedef boost::shared_ptr IPolygonPtr; +typedef std::shared_ptr IPolygonPtr; typedef std::vector IRegion ; -typedef boost::shared_ptr IRegionPtr ; +typedef std::shared_ptr IRegionPtr ; typedef std::vector IRegions ; typedef CGAL::Segment_2 OSegment; typedef std::vector OPolygon; -typedef boost::shared_ptr OPolygonPtr; +typedef std::shared_ptr OPolygonPtr; typedef std::vector ORegion ; -typedef boost::shared_ptr ORegionPtr ; +typedef std::shared_ptr ORegionPtr ; typedef std::vector ORegions ; typedef CGAL::Straight_skeleton_2 ISls; @@ -157,8 +157,8 @@ class IOffsetBuilderVisitor : public VisitorBase typedef CGAL::HalfedgeDS_const_decorator Sls_const_decorator ; -typedef boost::shared_ptr ISlsPtr ; -typedef boost::shared_ptr OSlsPtr ; +typedef std::shared_ptr ISlsPtr ; +typedef std::shared_ptr OSlsPtr ; typedef CGAL::Straight_skeleton_items_converter_2 SlsItemsConverter ; diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/issue4533.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/issue4533.cpp index d552e1241a4a..4f59ee87fc22 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/issue4533.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/issue4533.cpp @@ -5,7 +5,7 @@ #include "print.h" #include -#include +#include #include @@ -15,7 +15,7 @@ typedef K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Straight_skeleton_2 Ss; -typedef boost::shared_ptr SsPtr; +typedef std::shared_ptr SsPtr; int main() { diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/issue4684.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/issue4684.cpp index 560d8c014033..47dd764e525d 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/issue4684.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/issue4684.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include @@ -13,7 +13,7 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; -typedef boost::shared_ptr PolygonPtr; +typedef std::shared_ptr PolygonPtr; void low_precision_run() { diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/issue7149.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/issue7149.cpp index 9acead190b06..709a1fb0bf7c 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/issue7149.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/issue7149.cpp @@ -83,7 +83,7 @@ void test(const PointRange& points, K()); assert(ss_ptr); - std::vector > offset_polygons_ptrs = + std::vector > offset_polygons_ptrs = CGAL::create_offset_polygons_2(FT(offset), CGAL::CGAL_SS_i::dereference(ss_ptr), K()); std::cout << offset_polygons_ptrs.size() << " polygon(s)" << std::endl; diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/print.h b/Straight_skeleton_2/test/Straight_skeleton_2/print.h index abaa74d9e46d..a3cc881f4790 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/print.h +++ b/Straight_skeleton_2/test/Straight_skeleton_2/print.h @@ -24,9 +24,9 @@ void print_polygon ( CGAL::Polygon_2 const& poly ) } template -void print_polygons ( std::vector< boost::shared_ptr< CGAL::Polygon_2 > > const& polies ) +void print_polygons ( std::vector< std::shared_ptr< CGAL::Polygon_2 > > const& polies ) { - typedef std::vector< boost::shared_ptr< CGAL::Polygon_2 > > PolygonVector ; + typedef std::vector< std::shared_ptr< CGAL::Polygon_2 > > PolygonVector ; std::cout << "Polygon list with " << polies.size() << " polygons" << std::endl ; @@ -48,10 +48,10 @@ void print_polygon_with_holes ( CGAL::Polygon_with_holes_2 const& polywh ) } template -void print_polygons_with_holes ( std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > const& polies ) +void print_polygons_with_holes ( std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > const& polies ) { - typedef std::vector< boost::shared_ptr< CGAL::Polygon_with_holes_2 > > PolygonWithHolesVector ; + typedef std::vector< std::shared_ptr< CGAL::Polygon_with_holes_2 > > PolygonWithHolesVector ; std::cout << "Polygon_with_holes list with " << polies.size() << " element" << std::endl ; diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp index 02082ff87249..db7ec3b16224 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_offset.cpp @@ -37,7 +37,7 @@ void Straight_skeleton_traits_external_trace(std::string m) #include #include -#include +#include #include #include @@ -60,10 +60,10 @@ void test_API() Polygon_2 p; Polygon_with_holes_2 pwh; - std::vector< boost::shared_ptr > res; - std::vector< boost::shared_ptr > res_EPICK; - std::vector< boost::shared_ptr > res_w; - std::vector< boost::shared_ptr > res_w_EPICK; + std::vector< std::shared_ptr > res; + std::vector< std::shared_ptr > res_EPICK; + std::vector< std::shared_ptr > res_w; + std::vector< std::shared_ptr > res_w_EPICK; // First kernel is the offset construction (and thus output kernel), second kernel is the skeleton construction @@ -135,7 +135,7 @@ void test_API() } template -bool is_valid(const boost::shared_ptr& ss) +bool is_valid(const std::shared_ptr& ss) { typedef typename StraightSkeleton::Traits::Point_2 Point; @@ -176,7 +176,7 @@ void test_offset_square() typedef typename K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; - typedef boost::shared_ptr Polygon_ptr; + typedef std::shared_ptr Polygon_ptr; typedef std::vector Polygon_ptr_container; typedef CGAL::Straight_skeleton_2 Ss; @@ -193,7 +193,7 @@ void test_offset_square() Skeleton_builder ssb; ssb.enter_contour(square.begin(), square.end()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); Polygon_ptr_container offset_polys = @@ -216,7 +216,7 @@ void test_offset_four_square_holes() typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_2_ptr; + typedef std::shared_ptr Polygon_with_holes_2_ptr; typedef std::vector Polygon_with_holes_2_ptr_container; Polygon_2 outer, hole1, hole2, hole3, hole4; @@ -275,7 +275,7 @@ void test_offset_L() typedef typename K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; - typedef boost::shared_ptr Polygon_ptr; + typedef std::shared_ptr Polygon_ptr; typedef std::vector Polygon_ptr_container; typedef CGAL::Straight_skeleton_2 Ss; @@ -296,7 +296,7 @@ void test_offset_L() Skeleton_builder ssb; ssb.enter_contour(L.begin(), L.end()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); Polygon_ptr_container offset_polys = @@ -320,7 +320,7 @@ void test_offset_polygon_with_hole() typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_2_ptr; + typedef std::shared_ptr Polygon_with_holes_2_ptr; typedef std::vector Polygon_with_holes_2_ptr_container; // Square with a non-centered square hole @@ -409,7 +409,7 @@ void test_offset_pinched() typedef typename K::FT FT; typedef typename K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; - typedef boost::shared_ptr Polygon_ptr; + typedef std::shared_ptr Polygon_ptr; typedef std::vector Polygon_ptrs; typedef CGAL::Straight_skeleton_2 Ss; @@ -447,7 +447,7 @@ void test_offset_pinched() Skeleton_builder ssb; ssb.enter_contour(input.begin(), input.end()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); // The two splitting fronts meet in the middle, and at that time, @@ -490,7 +490,7 @@ void test_offset_multiple_CCs() typedef typename K::FT FT; typedef typename K::Point_2 Point_2; typedef CGAL::Polygon_2 Contour; - typedef boost::shared_ptr ContourPtr; + typedef std::shared_ptr ContourPtr; typedef std::vector Contour_sequence; typedef CGAL::Straight_skeleton_2 Ss; @@ -542,7 +542,7 @@ void test_offset_multiple_CCs() ssb.enter_contour(frame, frame+4); ssb.enter_contour(input.rbegin(), input.rend()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); Contour_sequence offset_contours; @@ -564,7 +564,7 @@ void test_offset_non_manifold() typedef typename K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_ptr; + typedef std::shared_ptr Polygon_with_holes_ptr; typedef std::vector Polygon_with_holes_ptrs; typedef CGAL::Straight_skeleton_2 Ss; @@ -588,7 +588,7 @@ void test_offset_non_manifold() ssb.enter_contour(outer.begin(), outer.end()); ssb.enter_contour(hole.begin(), hole.end()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); // The two splitting fronts meet in the middle, and at that time, @@ -647,7 +647,7 @@ void test_offset_non_manifold_2() typedef typename K::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_ptr; + typedef std::shared_ptr Polygon_with_holes_ptr; typedef std::vector Polygon_with_holes_ptrs; typedef CGAL::Straight_skeleton_2 Ss; @@ -679,7 +679,7 @@ void test_offset_non_manifold_2() ssb.enter_contour(outer.begin(), outer.end()); ssb.enter_contour(hole.begin(), hole.end()); - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); // Similar to the previous function, a split event happens and at that particular time, @@ -733,7 +733,7 @@ void test_offset_polygon_exterior() typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_2_ptr; + typedef std::shared_ptr Polygon_with_holes_2_ptr; typedef std::vector Polygon_with_holes_2_ptr_container; Polygon_2 poly; @@ -815,7 +815,7 @@ void test_offset_polygon_with_holes_exterior() typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_2_ptr; + typedef std::shared_ptr Polygon_with_holes_2_ptr; typedef std::vector Polygon_with_holes_2_ptr_container; Polygon_2 outer ; @@ -855,7 +855,7 @@ void test_offset(const char* filename) typedef CGAL::Polygon_2 Polygon_2; typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; - typedef boost::shared_ptr Polygon_with_holes_2_ptr; + typedef std::shared_ptr Polygon_with_holes_2_ptr; typedef std::vector Polygon_with_holes_2_ptr_container; typedef CGAL::Straight_skeleton_2 Ss; @@ -920,7 +920,7 @@ void test_offset(const char* filename) ssb.enter_contour(polys[i+1].begin(), polys[i+1].end()); } - boost::shared_ptr ss = ssb.construct_skeleton(); + std::shared_ptr ss = ssb.construct_skeleton(); assert(is_valid(ss)); std::set offset_times; diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_simple.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_simple.cpp index 4bddf279d398..e134a2746a75 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_simple.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_simple.cpp @@ -34,7 +34,7 @@ void Straight_skeleton_traits_external_trace(std::string m) #include #include -#include +#include #include #include @@ -53,10 +53,10 @@ void test_API() typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; typedef CGAL::Straight_skeleton_2 Straight_skeleton_EPICK; - typedef boost::shared_ptr Straight_skeleton_Ptr_EPICK; + typedef std::shared_ptr Straight_skeleton_Ptr_EPICK; typedef CGAL::Straight_skeleton_2 Straight_skeleton; - typedef boost::shared_ptr Straight_skeleton_Ptr; + typedef std::shared_ptr Straight_skeleton_Ptr; Polygon_2 p; Straight_skeleton_Ptr_EPICK ss0 = CGAL::create_interior_straight_skeleton_2(p); @@ -72,7 +72,7 @@ void test_API() } template -bool is_valid(const boost::shared_ptr& ss) +bool is_valid(const std::shared_ptr& ss) { typedef typename StraightSkeleton::Traits::Point_2 Point; typedef CGAL::Polygon_2 Polygon_2; @@ -136,7 +136,7 @@ void test_skeleton(const char* filename, typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; typedef CGAL::Straight_skeleton_2 Straight_skeleton; - typedef boost::shared_ptr Straight_skeleton_Ptr; + typedef std::shared_ptr Straight_skeleton_Ptr; std::ifstream in(filename); assert(in); diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_straight_skeleton_copy.cpp b/Straight_skeleton_2/test/Straight_skeleton_2/test_straight_skeleton_copy.cpp index acbe7d848b2a..b263a98658d7 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_straight_skeleton_copy.cpp +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_straight_skeleton_copy.cpp @@ -1,7 +1,5 @@ #include -#include - #include #include #include @@ -12,8 +10,8 @@ typedef K::Point_2 Point ; typedef CGAL::Polygon_2 Polygon_2 ; typedef CGAL::Straight_skeleton_2 Ss ; -typedef boost::shared_ptr PolygonPtr ; -typedef boost::shared_ptr SsPtr ; +typedef std::shared_ptr PolygonPtr ; +typedef std::shared_ptr SsPtr ; typedef std::vector PolygonPtrVector ; diff --git a/Stream_support/include/CGAL/Stream_support/internal/Geometry_container.h b/Stream_support/include/CGAL/Stream_support/internal/Geometry_container.h index e5be891d9b24..e3e26fe8b615 100644 --- a/Stream_support/include/CGAL/Stream_support/internal/Geometry_container.h +++ b/Stream_support/include/CGAL/Stream_support/internal/Geometry_container.h @@ -16,7 +16,7 @@ #define GEOMETRY_CONTAINER_H #include #include -#include +#include struct Dummy_deleter{ template @@ -45,7 +45,7 @@ struct Geometry_container{ typedef typename Range::const_reverse_iterator const_reverse_iterator; typedef typename Range::size_type size_type; typedef typename Range::value_type value_type; - boost::shared_ptr range; + std::shared_ptr range; bool must_delete; // // Default constructor. From 604dcdc4357ad1c24466a5167da0ceb90fa6615a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 28 Apr 2023 20:45:26 +0200 Subject: [PATCH 0360/1398] boost::optional => std::optional --- .../doc/AABB_tree/Concepts/AABBGeomTraits.h | 2 +- .../Concepts/AABBRayIntersectionTraits.h | 6 +- AABB_tree/doc/AABB_tree/Concepts/AABBTraits.h | 4 +- ..._polyhedron_facet_intersection_example.cpp | 4 +- .../AABB_tree/AABB_ray_shooting_example.cpp | 2 +- AABB_tree/include/CGAL/AABB_traits.h | 18 ++--- AABB_tree/include/CGAL/AABB_tree.h | 18 ++--- .../internal/AABB_ray_intersection.h | 22 +++--- .../internal/AABB_traversal_traits.h | 12 +-- AABB_tree/test/AABB_tree/AABB_test_util.h | 22 +++--- .../test/AABB_tree/aabb_any_all_benchmark.cpp | 2 +- .../aabb_correctness_triangle_test.cpp | 2 +- .../AABB_tree/aabb_test_ray_intersection.cpp | 10 +-- .../Algebraic_curve_kernel_2.h | 8 +- .../Algebraic_kernel_d/Algebraic_real_d_1.h | 2 +- ...ebraic_real_quadratic_refinement_rep_bfi.h | 24 +++--- .../Algebraic_kernel_d/Algebraic_real_rep.h | 4 +- .../Bitstream_descartes_E08_tree.h | 2 +- .../Algebraic_kernel_d/Curve_analysis_2.h | 28 +++---- .../Curve_pair_analysis_2.h | 34 ++++---- .../Algebraic_kernel_d/Status_line_CA_1.h | 6 +- .../Algebraic_kernel_d/Status_line_CPA_1.h | 2 +- .../CGAL/Algebraic_kernel_d/Xy_coordinate_2.h | 4 +- .../Alpha_shapes_2/internal/Lazy_alpha_nt_2.h | 4 +- .../Alpha_shapes_3/internal/Lazy_alpha_nt_3.h | 6 +- .../AlgebraicCurveParser.cpp | 2 +- .../AlgebraicCurveParser.h | 4 +- .../EnvelopeCallback.cpp | 2 +- .../GraphicsViewCurveInput.cpp | 36 ++++----- .../GraphicsViewCurveInputTyped.h | 50 ++++++------ .../Arrangement_on_surface_2/PointSnapper.cpp | 16 ++-- .../Arrangement_on_surface_2/PointSnapper.h | 2 +- .../Arrangement_on_surface_2/Utils/Utils.cpp | 16 ++-- .../Arrangement_on_surface_2/Utils/Utils.h | 16 ++-- .../unb_planar_vertical_decomposition.cpp | 2 +- .../CGAL/Arr_algebraic_segment_traits_2.h | 24 +++--- .../include/CGAL/Arr_batched_point_location.h | 2 +- .../Arr_bounded_planar_topology_traits_2.h | 4 +- .../include/CGAL/Arr_overlay_2.h | 10 +-- .../Arr_lm_nearest_neighbor.h | 2 +- .../CGAL/Arr_point_location/Td_active_edge.h | 6 +- .../Arr_point_location/Td_active_trapezoid.h | 18 ++--- .../Trapezoidal_decomposition_2.h | 38 ++++----- .../Trapezoidal_decomposition_2_impl.h | 10 +-- .../include/CGAL/Arr_point_location_result.h | 10 +-- .../include/CGAL/Arr_simple_point_location.h | 8 +- .../CGAL/Arr_spherical_topology_traits_2.h | 2 +- .../Arr_bounded_planar_vert_decomp_helper.h | 2 +- .../Arr_spherical_topology_traits_2_impl.h | 10 +-- .../Arr_spherical_vert_decomp_helper.h | 2 +- .../Arr_unb_planar_topology_traits_2_impl.h | 6 +- .../Arr_unb_planar_vert_decomp_helper.h | 2 +- .../CGAL/Arr_unb_planar_topology_traits_2.h | 2 +- .../include/CGAL/Arrangement_zone_2.h | 2 +- .../CGAL/Curved_kernel_via_analysis_2/Arc_2.h | 16 ++-- .../Curve_renderer_facade.h | 4 +- .../Fig_stream_Curve_renderer_2.h | 2 +- .../Generic_arc_2.h | 4 +- .../Generic_point_2.h | 4 +- .../Curved_kernel_via_analysis_2/Point_2.h | 12 +-- .../Sweep_curves_adapter_2.h | 2 +- .../gfx/Curve_renderer_2.h | 4 +- .../Surface_sweep_2/Arr_overlay_ss_visitor.h | 6 +- .../Surface_sweep_2/Arr_overlay_traits_2.h | 34 ++++---- .../Arr_vert_decomp_ss_visitor.h | 2 +- .../Vertical_decomposition_test.h | 2 +- BGL/include/CGAL/boost/graph/helpers.h | 4 +- .../Concepts/BarycentricCoordinates_2.h | 6 +- .../Discrete_harmonic_2.h | 32 ++++---- .../Generalized_barycentric_coordinates_2.h | 78 +++++++++---------- .../Barycentric_coordinates_2/Mean_value_2.h | 32 ++++---- .../Barycentric_coordinates_2/Wachspress_2.h | 32 ++++---- .../internal/utils_2.h | 14 ++-- .../segment_coordinates_2.h | 8 +- .../triangle_coordinates_2.h | 8 +- .../test_dh_deprecated_api.cpp | 2 +- .../test_mv_deprecated_api.cpp | 2 +- .../test_sc_deprecated_api.cpp | 2 +- .../test_tc_deprecated_api.cpp | 2 +- .../test_wp_deprecated_api.cpp | 2 +- .../include/CGAL/Cartesian_converter.h | 6 +- .../Safe_circulator_from_iterator.h | 8 +- .../dual/halfspace_intersection_3.h | 2 +- ...fspace_intersection_with_constructions_3.h | 2 +- .../Convex_hull_3/lloyd_algorithm.cpp | 2 +- .../dual/halfspace_intersection_3.h | 10 +-- .../halfspace_intersection_interior_point_3.h | 8 +- ...fspace_intersection_with_constructions_3.h | 8 +- .../test_halfspace_intersections.cpp | 6 +- .../Envelope_2/Env_divide_and_conquer_2.h | 2 +- .../Env_divide_and_conquer_2_impl.h | 6 +- .../CGAL/Filtered_predicate_with_state.h | 4 +- Filtered_kernel/include/CGAL/Lazy.h | 42 +++++----- Filtered_kernel/include/CGAL/Lazy_kernel.h | 4 +- Installation/CHANGES.md | 1 + .../Intersections_2/variant_any_object.cpp | 8 +- .../include/CGAL/Intersection_traits.h | 6 +- .../include/CGAL/Intersection_traits_2.h | 18 ++--- .../CGAL/Intersections_2/Bbox_2_Bbox_2.h | 4 +- .../include/CGAL/Intersection_traits_3.h | 72 ++++++++--------- .../CGAL/Intersections_3/Bbox_3_Bbox_3.h | 6 +- .../CGAL/Intersections_3/Line_3_Plane_3.h | 6 +- .../Intersections_3/Plane_3_Plane_3_Plane_3.h | 2 +- .../internal/Bbox_3_Segment_3_intersection.h | 6 +- .../Iso_cuboid_3_Plane_3_intersection.h | 2 +- .../internal/Line_3_Plane_3_intersection.h | 6 +- .../Plane_3_Plane_3_Plane_3_intersection.h | 12 +-- .../Plane_3_Tetrahedron_3_intersection.h | 2 +- .../internal/Ray_3_Triangle_3_intersection.h | 12 +-- .../Tetrahedron_3_Triangle_3_intersection.h | 2 +- .../test_intersections_Tetrahedron_3.cpp | 2 +- .../Kernel_23/CGAL/Projection_traits_xy_3.h | 2 +- Kernel_23/doc/Kernel_23/CGAL/intersections.h | 12 +-- Kernel_23/doc/Kernel_23/Kernel_23.txt | 2 +- Kernel_23/include/CGAL/Kernel/Type_mapper.h | 6 +- .../include/CGAL/Kernel/function_objects.h | 10 +-- .../Kernel_23/internal/Projection_traits_3.h | 8 +- .../internal/Projection_traits_base_3.h | 38 ++++----- .../CGAL/_test_all_linear_intersections.h | 4 +- Kernel_d/doc/Kernel_d/CGAL/intersections_d.h | 4 +- Kernel_d/doc/Kernel_d/Kernel_d.txt | 2 +- .../include/CGAL/Kernel_d/function_objects.h | 18 ++--- Mesh_3/benchmark/Mesh_3/StdAfx.h | 2 +- .../Concepts/IntersectionGeometricTraits_3.h | 4 +- .../doc/Mesh_3/Concepts/MeshCellCriteria_3.h | 2 +- Mesh_3/doc/Mesh_3/Concepts/MeshDomain_3.h | 8 +- .../doc/Mesh_3/Concepts/MeshFacetCriteria_3.h | 2 +- .../Concepts/MeshTriangulationTraits_3.h | 6 +- .../Mesh_3/mesh_hybrid_mesh_domain.cpp | 4 +- Mesh_3/include/CGAL/Labeled_mesh_domain_3.h | 6 +- Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 34 ++++---- .../CGAL/Mesh_3/Protect_edges_sizing_field.h | 4 +- Mesh_3/include/CGAL/Mesh_3/Refine_cells_3.h | 2 +- Mesh_3/include/CGAL/Mesh_3/Refine_facets_3.h | 6 +- Mesh_3/include/CGAL/Mesh_3/Slivers_exuder.h | 12 +-- .../Sizing_field_with_aabb_tree.h | 8 +- ...tialize_triangulation_from_labeled_image.h | 4 +- .../CGAL/Mesh_3/mesh_standard_criteria.h | 6 +- .../CGAL/Mesh_3/polylines_to_protect.h | 16 ++-- .../include/CGAL/Mesh_3/vertex_perturbation.h | 2 +- .../CGAL/Polyhedral_complex_mesh_domain_3.h | 12 +-- .../include/CGAL/Polyhedral_mesh_domain_3.h | 12 +-- .../AABB_traversal_traits_with_join.h | 12 +-- .../Minkowski_sum_2/AABB_tree_with_join.h | 10 +-- Nef_2/include/CGAL/Nef_2/HDS_items.h | 10 +-- ...xact_triangulation_euclidean_traits_xy_3.h | 16 ++-- ...xact_triangulation_euclidean_traits_xz_3.h | 16 ++-- ...xact_triangulation_euclidean_traits_yz_3.h | 16 ++-- Nef_3/include/CGAL/Nef_3/SNC_structure.h | 34 ++++---- Nef_S2/include/CGAL/Nef_S2/Sphere_map.h | 16 ++-- .../CGAL/Sqrt_extension/Sqrt_extension_type.h | 4 +- .../OTR_2/Reconstruction_triangulation_2.h | 34 ++++---- .../Protect_edges_sizing_field.h | 4 +- .../voronoi_covariance_3.h | 2 +- .../include/CGAL/structure_point_set.h | 4 +- ...refinement_mesh_union_and_intersection.cpp | 2 +- .../Polygon_mesh_processing/corefinement.h | 52 ++++++------- .../Corefinement/Face_graph_output_builder.h | 16 ++-- .../internal/Corefinement/face_graph_utils.h | 12 +-- .../Corefinement/intersection_nodes.h | 4 +- .../Hole_filling/Triangulate_hole_polyline.h | 10 +-- .../Isotropic_remeshing/remesh_impl.h | 6 +- .../Axis_parallel_plane_traits.h | 4 +- .../Point_inside_vertical_ray_cast.h | 12 +-- .../internal/Smoothing/curvature_flow_impl.h | 8 +- .../CGAL/Polygon_mesh_processing/locate.h | 2 +- .../repair_degeneracies.h | 18 ++--- .../include/CGAL/Polygon_mesh_slicer.h | 4 +- .../include/CGAL/Polyhedral_envelope.h | 16 ++-- .../include/CGAL/Side_of_triangle_mesh.h | 6 +- .../Polyhedral_envelope_filter.h | 14 ++-- .../test_corefinement_and_constraints.cpp | 6 +- .../test_corefinement_bool_op.cpp | 2 +- .../test_pmp_locate.cpp | 6 +- Polyhedron/demo/Polyhedron/MainWindow.cpp | 4 +- .../Plugins/Mesh_3/Io_image_plugin.cpp | 10 +-- .../Plugins/Mesh_3/Mesh_3_plugin.cpp | 10 +-- .../PMP/Point_inside_polyhedron_plugin.cpp | 8 +- .../Plugins/PMP/Selection_plugin.cpp | 4 +- .../Edit_polyhedron_plugin.cpp | 4 +- .../Scene_edit_polyhedron_item.cpp | 4 +- .../Scene_edit_polyhedron_item.h | 4 +- .../Scene_polyhedron_selection_item.h | 14 ++-- .../Polyhedron/Travel_isolated_components.h | 2 +- .../PolylineSimplificationCostFunction.h | 4 +- .../Hybrid_squared_distance_cost.h | 2 +- .../Scaled_squared_distance_cost.h | 6 +- .../Squared_distance_cost.h | 2 +- .../CGAL/Polyline_simplification_2/simplify.h | 6 +- STL_Extension/doc/STL_Extension/CGAL/Object.h | 4 +- .../doc/STL_Extension/CGAL/iterator.h | 6 +- .../Dispatch_output_iterator.cpp | 2 +- .../include/CGAL/Modifiable_priority_queue.h | 14 ++-- STL_Extension/include/CGAL/Object.h | 4 +- .../internal/boost/relaxed_heap.hpp | 14 ++-- STL_Extension/include/CGAL/iterator.h | 4 +- .../test/STL_Extension/test_Object.cpp | 6 +- .../STL_Extension/test_dispatch_output.cpp | 4 +- .../doc/Spatial_searching/CGAL/Kd_tree.h | 2 +- .../doc/Spatial_searching/CGAL/Kd_tree_node.h | 2 +- .../searching_with_circular_query.cpp | 2 +- Spatial_searching/include/CGAL/Kd_tree.h | 6 +- Spatial_searching/include/CGAL/Kd_tree_node.h | 18 ++--- .../include/CGAL/Point_container.h | 6 +- ...te_exterior_skeleton_tweaking_skeleton.cpp | 4 +- .../CGAL/Straight_skeleton_builder_2.h | 2 +- .../CGAL/compute_outer_frame_margin.h | 2 +- .../Concepts/PolygonOffsetBuilderTraits_2.h | 2 +- .../StraightSkeletonBuilderTraits_2.h | 4 +- .../Straight_skeleton_2/Low_level_API.cpp | 2 +- ...offset_of_multiple_polygons_with_holes.cpp | 2 +- .../include/CGAL/Polygon_offset_builder_2.h | 6 +- .../CGAL/Polygon_offset_builder_traits_2.h | 6 +- .../Polygon_offset_builder_2_impl.h | 2 +- .../Straight_skeleton_aux.h | 2 +- .../Straight_skeleton_builder_2_impl.h | 2 +- .../Straight_skeleton_builder_traits_2_aux.h | 38 ++++----- .../include/CGAL/Straight_skeleton_2/debug.h | 4 +- .../CGAL/Straight_skeleton_builder_2.h | 6 +- .../CGAL/Straight_skeleton_builder_traits_2.h | 34 ++++---- .../include/CGAL/compute_outer_frame_margin.h | 12 +-- .../constructions/Polygon_offset_cons_ftC2.h | 8 +- .../Straight_skeleton_cons_ftC2.h | 42 +++++----- .../include/CGAL/create_offset_polygons_2.h | 6 +- .../include/CGAL/create_straight_skeleton_2.h | 4 +- .../predicates/Polygon_offset_pred_ftC2.h | 8 +- .../predicates/Straight_skeleton_pred_ftC2.h | 14 ++-- .../include/CGAL/test_sls_traits_aux.cpp | 2 +- .../test/Straight_skeleton_2/test_sls.cpp | 10 +-- .../Straight_skeleton_2/test_sls_offset.cpp | 2 +- .../examples/Surface_mesh/sm_aabbtree.cpp | 4 +- .../CGAL/Variational_shape_approximation.h | 12 +-- .../vsa_correctness_test.cpp | 4 +- .../vsa_teleportation_test.cpp | 2 +- .../Surface_mesh_deformation_test_commons.h | 2 +- .../internal/AABB_traversal_traits.h | 2 +- .../internal/Filters.h | 6 +- .../internal/SDF_calculation.h | 22 +++--- .../Concepts/SurfaceMeshShortestPathTraits.h | 2 +- .../Surface_mesh_shortest_path.h | 2 +- .../Bounded_distance_placement.h | 2 +- .../Bounded_normal_change_filter.h | 4 +- .../Bounded_normal_change_placement.h | 2 +- .../Edge_collapse/Constrained_placement.h | 2 +- .../Policies/Edge_collapse/Edge_length_cost.h | 4 +- .../Edge_collapse/LindstromTurk_cost.h | 4 +- .../Edge_collapse/LindstromTurk_placement.h | 2 +- .../Edge_collapse/Midpoint_placement.h | 2 +- .../Polyhedral_envelope_filter.h | 4 +- .../EdgeCollapseSimplificationVisitor.h | 6 +- .../Concepts/GetCost.h | 6 +- .../Concepts/GetPlacement.h | 4 +- .../Concepts/PlacementFilter.h | 6 +- .../Surface_mesh_simplification.txt | 2 +- .../edge_collapse_bounded_normal_change.cpp | 6 +- .../edge_collapse_visitor_surface_mesh.cpp | 6 +- .../include/CGAL/Cartesian/MatrixC33.h | 6 +- .../Edge_collapse_visitor_base.h | 6 +- .../Bounded_distance_placement.h | 14 ++-- .../Bounded_normal_change_filter.h | 8 +- .../Bounded_normal_change_placement.h | 8 +- .../Edge_collapse/Constrained_placement.h | 2 +- .../Policies/Edge_collapse/Edge_length_cost.h | 4 +- .../Edge_collapse/FastEnvelope_filter.h | 10 +-- .../Edge_collapse/LindstromTurk_cost.h | 4 +- .../Edge_collapse/LindstromTurk_placement.h | 2 +- .../Edge_collapse/Midpoint_placement.h | 4 +- .../internal/GarlandHeckbert_policy_base.h | 14 ++-- .../internal/Lindstrom_Turk_core.h | 10 +-- .../internal/Common.h | 8 +- .../internal/Edge_collapse.h | 14 ++-- .../test_edge_collapse_Envelope.cpp | 6 +- .../test_edge_collapse_Polyhedron_3.cpp | 12 +-- .../include/CGAL/AABB_polyhedral_oracle.h | 6 +- .../internal/flip_edges.h | 20 ++--- .../internal/smooth_vertices.h | 16 ++-- .../tetrahedral_adaptive_remeshing_impl.h | 10 +-- Three/include/CGAL/Three/exceptions.h | 4 +- .../include/CGAL/Delaunay_triangulation.h | 4 +- .../include/CGAL/Regular_triangulation.h | 4 +- Triangulation/include/CGAL/Triangulation.h | 8 +- .../ConstrainedTriangulationTraits_2.h | 2 +- 282 files changed, 1257 insertions(+), 1256 deletions(-) diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h index 2f1fdc3e5c6b..e6d51ffdb756 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBGeomTraits.h @@ -47,7 +47,7 @@ Provides the operator: `return_type operator()(const Query& q, const Primitive::Datum& d)`, which computes the intersection between `q` and `d`. The type of the returned object -must be a `boost::optional` of a `boost::variant` of the possible intersection types. +must be a `std::optional` of a `boost::variant` of the possible intersection types. */ typedef unspecified_type Intersect_3; diff --git a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h index 215cbd659249..3b186c9ff222 100644 --- a/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h +++ b/AABB_tree/doc/AABB_tree/Concepts/AABBRayIntersectionTraits.h @@ -25,15 +25,15 @@ class AABBRayIntersectionTraits { /*! A functor object to compute the distance between the source of a ray and its closest intersection point between the ray and a primitive or a bounding box. - An empty `boost::optional` is returned, if there is no intersection. + An empty `std::optional` is returned, if there is no intersection. When there is an intersection, an object of type `FT` is returned such that if `i1` and `i2` are two intersection points, then `i1` is closer to the source of the ray than `i2` iff `n1 < n2`, `n1` and `n2` being the numbers returned for `i1` and `i2` respectively. Provides the operators: - `boost::optional operator()(const Ray_3& r, const Bounding_box& bbox)`. - `boost::optional::%Type > > + `std::optional operator()(const Ray_3& r, const Bounding_box& bbox)`. + `std::optional::%Type > > operator()(const Ray_3& r, const Primitive& primitive)`. A common algorithm to compute the intersection between a bounding box and a ray is ::%Type > operator()(const Query & q, const Primitive& primitive);` which returns the intersection as a pair composed of an object and a primitive id, iff the query intersects the primitive. +`std::optional::%Type > operator()(const Query & q, const Primitive& primitive);` which returns the intersection as a pair composed of an object and a primitive id, iff the query intersects the primitive. \cgalHeading{Note on Backward Compatibility} -Before the release 4.3 of \cgal, the return type of this function used to be `boost::optional`. +Before the release 4.3 of \cgal, the return type of this function used to be `std::optional`. */ typedef unspecified_type Intersection; diff --git a/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp b/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp index 4a4a1e613064..e01e49c0b6ec 100644 --- a/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp +++ b/AABB_tree/examples/AABB_tree/AABB_polyhedron_facet_intersection_example.cpp @@ -19,8 +19,8 @@ typedef CGAL::Polyhedron_3 Polyhedron; typedef CGAL::AABB_face_graph_triangle_primitive Primitive; typedef CGAL::AABB_traits Traits; typedef CGAL::AABB_tree Tree; -typedef boost::optional< Tree::Intersection_and_primitive_id::Type > Segment_intersection; -typedef boost::optional< Tree::Intersection_and_primitive_id::Type > Plane_intersection; +typedef std::optional< Tree::Intersection_and_primitive_id::Type > Segment_intersection; +typedef std::optional< Tree::Intersection_and_primitive_id::Type > Plane_intersection; typedef Tree::Primitive_id Primitive_id; int main() diff --git a/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp b/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp index d3b2af45913f..fc450abd5a80 100644 --- a/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp +++ b/AABB_tree/examples/AABB_tree/AABB_ray_shooting_example.cpp @@ -23,7 +23,7 @@ typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef CGAL::AABB_face_graph_triangle_primitive Primitive; typedef CGAL::AABB_traits Traits; typedef CGAL::AABB_tree Tree; -typedef boost::optional::Type> Ray_intersection; +typedef std::optional::Type> Ray_intersection; struct Skip { diff --git a/AABB_tree/include/CGAL/AABB_traits.h b/AABB_tree/include/CGAL/AABB_traits.h index b2eb87dc8f6a..f5c1c1240a14 100644 --- a/AABB_tree/include/CGAL/AABB_traits.h +++ b/AABB_tree/include/CGAL/AABB_traits.h @@ -27,7 +27,7 @@ #include -#include +#include /// \file AABB_traits.h @@ -39,7 +39,7 @@ template struct Remove_optional { typedef T type; }; template -struct Remove_optional< ::boost::optional > { typedef T type; }; +struct Remove_optional< ::std::optional > { typedef T type; }; //helper controlling whether extra data should be stored in the AABB_tree traits class template ::value> @@ -85,7 +85,7 @@ struct AABB_traits_base_2{ typedef typename CGAL::Bbox_3 Bounding_box; struct Intersection_distance { - boost::optional operator()(const Ray_3& ray, const Bounding_box& bbox) const { + std::optional operator()(const Ray_3& ray, const Bounding_box& bbox) const { FT t_near = -DBL_MAX; // std::numeric_limits::lowest(); C++1903 FT t_far = DBL_MAX; @@ -101,7 +101,7 @@ struct AABB_traits_base_2{ for(int i = 0; i < 3; ++i, ++source_iter, ++direction_iter) { if(*direction_iter == 0) { if((*source_iter < (bbox.min)(i)) || (*source_iter > (bbox.max)(i))) { - return boost::none; + return std::nullopt; } } else { FT t1 = ((bbox.min)(i) - *source_iter) / *direction_iter; @@ -118,7 +118,7 @@ struct AABB_traits_base_2{ // t_far = t2; if(t_near > t_far || t_far < FT(0.)) - return boost::none; + return std::nullopt; } } @@ -193,7 +193,7 @@ class AABB_traits /// `Intersection_and_primitive_id::%Type::first_type` is found according to /// the result type of `GeomTraits::Intersect_3::operator()`. If it is - /// `boost::optional` then it is `T`, and the result type otherwise. + /// `std::optional` then it is `T`, and the result type otherwise. template struct Intersection_and_primitive_id { typedef decltype( @@ -364,12 +364,12 @@ class AABB_traits Intersection(const AABB_traits& traits) :m_traits(traits) {} template - boost::optional< typename Intersection_and_primitive_id::Type > + std::optional< typename Intersection_and_primitive_id::Type > operator()(const Query& query, const typename AT::Primitive& primitive) const { auto inter_res = GeomTraits().intersect_3_object()(query, internal::Primitive_helper::get_datum(primitive,m_traits)); if (!inter_res) - return boost::none; - return boost::make_optional( std::make_pair(*inter_res, primitive.id()) ); + return std::nullopt; + return std::make_optional( std::make_pair(*inter_res, primitive.id()) ); } }; diff --git a/AABB_tree/include/CGAL/AABB_tree.h b/AABB_tree/include/CGAL/AABB_tree.h index 0016d4ecc097..4645264460e5 100644 --- a/AABB_tree/include/CGAL/AABB_tree.h +++ b/AABB_tree/include/CGAL/AABB_tree.h @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #ifdef CGAL_HAS_THREADS @@ -271,7 +271,7 @@ namespace CGAL { /// \tparam Query must be a type for which `Do_intersect` operators are /// defined in the traits class `AABBTraits`. template - boost::optional any_intersected_primitive(const Query& query) const; + std::optional any_intersected_primitive(const Query& query) const; ///@} /// \name Intersections @@ -294,7 +294,7 @@ namespace CGAL { /// \tparam Query must be a type for which `Do_intersect` and `Intersection` operators are /// defined in the traits class `AABBTraits`. template - boost::optional< typename Intersection_and_primitive_id::Type > + std::optional< typename Intersection_and_primitive_id::Type > any_intersection(const Query& query) const; @@ -318,12 +318,12 @@ namespace CGAL { /// `AABBTraits` must be a model of `AABBRayIntersectionTraits` to /// call this member function. template - boost::optional< typename Intersection_and_primitive_id::Type > + std::optional< typename Intersection_and_primitive_id::Type > first_intersection(const Ray& query, const SkipFunctor& skip) const; /// \cond template - boost::optional< typename Intersection_and_primitive_id::Type > + std::optional< typename Intersection_and_primitive_id::Type > first_intersection(const Ray& query) const { return first_intersection(query, boost::lambda::constant(false)); @@ -343,12 +343,12 @@ namespace CGAL { /// `AABBTraits` must be a model of `AABBRayIntersectionTraits` to /// call this member function. template - boost::optional + std::optional first_intersected_primitive(const Ray& query, const SkipFunctor& skip) const; /// \cond template - boost::optional + std::optional first_intersected_primitive(const Ray& query) const { return first_intersected_primitive(query, boost::lambda::constant(false)); @@ -964,7 +964,7 @@ namespace CGAL { template template - boost::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > + std::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > AABB_tree::any_intersection(const Query& query) const { using namespace CGAL::internal::AABB_tree; @@ -976,7 +976,7 @@ namespace CGAL { template template - boost::optional::Primitive_id> + std::optional::Primitive_id> AABB_tree::any_intersected_primitive(const Query& query) const { using namespace CGAL::internal::AABB_tree; diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h index ff091ce6c24b..1bc03ff4cf4d 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_ray_intersection.h @@ -19,7 +19,7 @@ #include #include -#include +#include #include # if defined(BOOST_MSVC) # pragma warning(push) @@ -43,7 +43,7 @@ class AABB_ray_intersection { public: AABB_ray_intersection(const AABBTree& tree) : tree_(tree) {} - boost::optional< Ray_intersection_and_primitive_id > + std::optional< Ray_intersection_and_primitive_id > ray_intersection(const Ray& query, SkipFunctor skip) const { // We hit the root, now continue on the children. Keep track of // nb_primitives through a variable in each Node on the stack. In @@ -63,7 +63,7 @@ class AABB_ray_intersection { Heap_type pq; // pq.reserve(tree_.size() / 2); - boost::optional< Ray_intersection_and_primitive_id > + std::optional< Ray_intersection_and_primitive_id > intersection, /* the temporary for calculating the result */ p; /* the current best intersection */ @@ -121,7 +121,7 @@ class AABB_ray_intersection { // right child const Node* child = &(current.node->right_child()); - boost::optional< FT > dist = intersection_distance_obj(query, child->bbox()); + std::optional< FT > dist = intersection_distance_obj(query, child->bbox()); if(dist) pq.push(Node_ptr_with_ft(child, *dist, 2)); @@ -130,7 +130,7 @@ class AABB_ray_intersection { default: // Children both inner nodes { const Node* child = &(current.node->left_child()); - boost::optional dist = intersection_distance_obj(query, child->bbox()); + std::optional dist = intersection_distance_obj(query, child->bbox()); if(dist) pq.push(Node_ptr_with_ft(child, *dist, current.nb_primitives/2)); @@ -198,7 +198,7 @@ class AABB_ray_intersection { template template -boost::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > +std::optional< typename AABB_tree::template Intersection_and_primitive_id::Type > AABB_tree::first_intersection(const Ray& query, const SkipFunctor& skip) const { static_assert((std::is_same::value), @@ -219,22 +219,22 @@ AABB_tree::first_intersection(const Ray& query, break; } } - return boost::none; + return std::nullopt; } template template -boost::optional::Primitive_id> +std::optional::Primitive_id> AABB_tree::first_intersected_primitive(const Ray& query, const SkipFunctor& skip) const { - boost::optional< + std::optional< typename AABB_tree:: template Intersection_and_primitive_id::Type > res = first_intersection(query, skip); if ( (bool) res ) - return boost::make_optional( res->second ); - return boost::none; + return std::make_optional( res->second ); + return std::nullopt; } } diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_traversal_traits.h b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_traversal_traits.h index fe7e85effddf..645ce1347cb2 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/AABB_traversal_traits.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/AABB_traversal_traits.h @@ -17,7 +17,7 @@ #include -#include +#include namespace CGAL { @@ -69,7 +69,7 @@ class First_intersection_traits public: typedef - boost::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > + std::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > Result; public: First_intersection_traits(const AABBTraits& traits) @@ -124,7 +124,7 @@ class Listing_intersection_traits void intersection(const Query& query, const Primitive& primitive) { - boost::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > + std::optional< typename AABBTraits::template Intersection_and_primitive_id::Type > intersection = m_traits.intersection_object()(query, primitive); if(intersection) @@ -211,7 +211,7 @@ class First_primitive_traits { if( m_traits.do_intersect_object()(query, primitive) ) { - m_result = boost::optional(primitive.id()); + m_result = std::optional(primitive.id()); m_is_found = true; } } @@ -221,12 +221,12 @@ class First_primitive_traits return m_traits.do_intersect_object()(query, node.bbox()); } - boost::optional result() const { return m_result; } + std::optional result() const { return m_result; } bool is_intersection_found() const { return m_is_found; } private: bool m_is_found; - boost::optional m_result; + std::optional m_result; const AABBTraits& m_traits; }; diff --git a/AABB_tree/test/AABB_tree/AABB_test_util.h b/AABB_tree/test/AABB_tree/AABB_test_util.h index 5b73a20f9f22..61ddd98f3bd0 100644 --- a/AABB_tree/test/AABB_tree/AABB_test_util.h +++ b/AABB_tree/test/AABB_tree/AABB_test_util.h @@ -95,20 +95,20 @@ void test_all_intersection_query_types(Tree& tree) tree.all_intersected_primitives(segment,std::back_inserter(primitives)); // any_intersection - boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > r = tree.any_intersection(ray); - boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > l = tree.any_intersection(line); - boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > s = tree.any_intersection(segment); + std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > r = tree.any_intersection(ray); + std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > l = tree.any_intersection(line); + std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > s = tree.any_intersection(segment); // any_intersected_primitive - boost::optional optional_primitive; + std::optional optional_primitive; optional_primitive = tree.any_intersected_primitive(ray); optional_primitive = tree.any_intersected_primitive(line); optional_primitive = tree.any_intersected_primitive(segment); // all_intersections - std::list< boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_r; - std::list< boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_l; - std::list< boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_s; + std::list< std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_r; + std::list< std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_l; + std::list< std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > > intersections_s; tree.all_intersections(ray,std::back_inserter(intersections_r)); tree.all_intersections(line,std::back_inserter(intersections_l)); tree.all_intersections(segment,std::back_inserter(intersections_s)); @@ -322,7 +322,7 @@ class Naive_implementations typedef typename Traits::Point_3 Point; typedef typename Traits::Point_and_primitive_id Point_and_primitive_id; - typedef boost::optional Intersection_result; + typedef std::optional Intersection_result; const Traits& m_traits; public: @@ -380,7 +380,7 @@ class Naive_implementations Polyhedron_primitive_iterator it = Pr_generator().begin(p); for ( ; it != Pr_generator().end(p) ; ++it ) { - boost::optional< typename Traits::template Intersection_and_primitive_id::Type > + std::optional< typename Traits::template Intersection_and_primitive_id::Type > intersection = m_traits.intersection_object()(query, Pr(it,p)); if ( intersection ) *out++ = *intersection; @@ -653,7 +653,7 @@ class Tree_vs_naive } // any_intersected_primitive test (do not count time here) - typedef boost::optional Any_primitive; + typedef std::optional Any_primitive; Any_primitive primitive = tree.any_intersected_primitive(query); // Check: verify we do get the result by naive method @@ -723,7 +723,7 @@ class Tree_vs_naive } // Any intersection test (do not count time here) - boost::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > + std::optional< typename Tree::AABB_traits::template Intersection_and_primitive_id::Type > intersection = tree.any_intersection(query); // Check: verify we do get the result by naive method diff --git a/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp b/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp index 5e09d6c22919..eb6fef9082a5 100644 --- a/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp +++ b/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp @@ -46,7 +46,7 @@ std::size_t intersect(ForwardIterator b, ForwardIterator e, const Tree& tree, lo v.reserve(elements); for(; b != e; ++b) { tree.all_intersections(*b, std::back_inserter(v)); - boost::optional o = tree.any_intersection(*b); + std::optional o = tree.any_intersection(*b); if(o) ++counter; } diff --git a/AABB_tree/test/AABB_tree/aabb_correctness_triangle_test.cpp b/AABB_tree/test/AABB_tree/aabb_correctness_triangle_test.cpp index 13eb303b771b..54ef4c600f6b 100644 --- a/AABB_tree/test/AABB_tree/aabb_correctness_triangle_test.cpp +++ b/AABB_tree/test/AABB_tree/aabb_correctness_triangle_test.cpp @@ -65,7 +65,7 @@ int test() return EXIT_FAILURE; } - boost::optional any; + std::optional any; any = tree.any_intersection(pq); if(!any) { diff --git a/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp b/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp index 4e86ed22d7fd..cbe92baaf705 100644 --- a/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp +++ b/AABB_tree/test/AABB_tree/aabb_test_ray_intersection.cpp @@ -36,7 +36,7 @@ FT point_on_ray_dist(const Ray& ray, const Point& point) { std::size_t accum = 0; -boost::optional< +std::optional< Tree::Intersection_and_primitive_id::Type > min_intersection(const Tree& tree, const Ray& ray) { @@ -46,9 +46,9 @@ min_intersection(const Tree& tree, const Ray& ray) { tree.all_intersections(ray, std::back_inserter(all_intersections)); accum += all_intersections.size(); Tree::FT min_distance = DBL_MAX; - boost::optional< + std::optional< Tree::Intersection_and_primitive_id::Type - > mini = boost::none; + > mini = std::nullopt; for(IntersectionVector::iterator it2 = all_intersections.begin(); it2 != all_intersections.end(); ++it2) { if(Point* point = boost::get(&(it2->first))) { @@ -125,7 +125,7 @@ int main() rays.reserve(NB_RAYS); std::transform(v1.begin(), v1.end(), v2.begin(), std::back_inserter(rays), boost::value_factory()); - std::vector< boost::optional::Type > > primitives1, primitives2; + std::vector< std::optional::Type > > primitives1, primitives2; primitives1.reserve(NB_RAYS); primitives2.reserve(NB_RAYS); @@ -140,7 +140,7 @@ int main() } assert(primitives1.size() == primitives2.size()); // Different amount of primitives intersected assert(std::equal(primitives1.begin(), primitives1.end(), primitives2.begin())); // Primitives mismatch - std::size_t c = primitives1.size() - std::count(primitives1.begin(), primitives1.end(), boost::none); + std::size_t c = primitives1.size() - std::count(primitives1.begin(), primitives1.end(), std::nullopt); std::cout << "Intersected " << c << " primitives with " << NB_RAYS << " rays" << std::endl; std::cout << "Primitive method had to sort " << accum/NB_RAYS << " intersections on average." << std::endl; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h index a02edebb8e13..b249fbf4629d 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_curve_kernel_2.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include @@ -359,7 +359,7 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ Unary_compose(const Unary_compose& other) = default; Unary_compose& operator=(const Unary_compose& other) = default; - Unary_compose() : _inner(::boost::none),_outer(::boost::none) {} + Unary_compose() : _inner(::std::nullopt),_outer(::std::nullopt) {} typedef typename InnerFunctor::argument_type argument_type; typedef typename OuterFunctor::result_type result_type; @@ -371,8 +371,8 @@ class Algebraic_curve_kernel_2 : public AlgebraicKernel_d_1{ return _outer.get()(_inner.get()(arg)); } private: - ::boost::optional _inner; - ::boost::optional _outer; + ::std::optional _inner; + ::std::optional _outer; }; template diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h index 2b5a30867ce5..9c23acc6bd05 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_d_1.h @@ -174,7 +174,7 @@ public : long old_precision = get_precision( BFI() ); set_precision( BFI(), 53 ); std::pair interval = CGAL::to_interval( convert_to_bfi( (*this))); - this->ptr()->interval_option = boost::optional< std::pair >(interval); + this->ptr()->interval_option = std::optional< std::pair >(interval); set_precision( BFI(), old_precision ); return *(this->ptr()->interval_option); } diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h index b7e686d42035..9e1cff2083b8 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_quadratic_refinement_rep_bfi.h @@ -86,10 +86,10 @@ class Algebraic_real_quadratic_refinement_rep_bfi CGAL::Polynomial_traits_d::template Rebind ::Other::Type BFI_polynomial; - mutable boost::optional + mutable std::optional < BFI_polynomial > f_bfi_; - mutable boost::optional low_bfi_, f_low_bfi_, + mutable std::optional low_bfi_, f_low_bfi_, high_bfi_, f_high_bfi_; mutable long N; @@ -229,21 +229,21 @@ class Algebraic_real_quadratic_refinement_rep_bfi bool poly_changed = (P!=this->polynomial()); if(poly_changed) { - f_bfi_ = boost::none; + f_bfi_ = std::nullopt; } if(poly_changed || LOW != this->low()) { - f_low_bfi_ = low_bfi_ = boost::none; + f_low_bfi_ = low_bfi_ = std::nullopt; } if(poly_changed || HIGH != this->high()) { - f_high_bfi_ = high_bfi_ = boost::none; + f_high_bfi_ = high_bfi_ = std::nullopt; } Base::set_implicit_rep(P,LOW,HIGH,dummy_bool); } virtual void set_explicit_rep(const Field& m) const { - f_bfi_ = boost::none; - f_low_bfi_ = low_bfi_ = boost::none; - f_high_bfi_ = high_bfi_ = boost::none; + f_bfi_ = std::nullopt; + f_low_bfi_ = low_bfi_ = std::nullopt; + f_high_bfi_ = high_bfi_ = std::nullopt; Base::set_explicit_rep(m); } @@ -256,13 +256,13 @@ class Algebraic_real_quadratic_refinement_rep_bfi if(this->is_rational()) return; if(old_low_!=this->low_) { - f_low_bfi_ = low_bfi_ = boost::none; + f_low_bfi_ = low_bfi_ = std::nullopt; } if(old_high_!=this->high_) { - f_high_bfi_ = high_bfi_ = boost::none; + f_high_bfi_ = high_bfi_ = std::nullopt; } if(old_pol != this->polynomial()) { - f_bfi_ = boost::none; + f_bfi_ = std::nullopt; } } @@ -490,7 +490,7 @@ class Algebraic_real_quadratic_refinement_rep_bfi Poly f_old = this->polynomial(); Base::simplify(); if(f_old != this->polynomial()) { - f_bfi_ = boost::none; + f_bfi_ = std::nullopt; } } }; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_rep.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_rep.h index cecfb57c9717..95e8907ad555 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_rep.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Algebraic_real_rep.h @@ -23,7 +23,7 @@ #include #include #include -#include +#include namespace CGAL { @@ -56,7 +56,7 @@ class Algebraic_real_rep{ typedef Algebraic_real_rep Self; public: - typedef boost::optional< std::pair > Interval_option; + typedef std::optional< std::pair > Interval_option; mutable Poly polynomial_; //!< square free polynomial mutable Rational low_; //!< lower endpoint of interval diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_E08_tree.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_E08_tree.h index 2f7719bb3626..bf607e75f152 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_E08_tree.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Bitstream_descartes_E08_tree.h @@ -31,7 +31,7 @@ #include #include -#include +#include /* * AUXILIARY CLASSES AND FUNCTIONS diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h index b8bd5995a6f9..a11c4283a988 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_analysis_2.h @@ -197,7 +197,7 @@ class Curve_analysis_2_rep { size_type index_of_content_root; size_type mult_of_prim_lcoeff_root; size_type index_of_prim_lcoeff_root; - boost::optional stack; + std::optional stack; }; // Functor to get the X_coordinate of an Event_coordinate @@ -211,14 +211,14 @@ class Curve_analysis_2_rep { //! The object holding the information about events, as an optional - mutable boost::optional > + mutable std::optional > event_coordinates; //! The algebraic kernel to use Algebraic_kernel_with_analysis_2* _m_kernel; //! The polynomial defining the curve - boost::optional f; + std::optional f; //! How degenerate situations are handled CGAL::Degeneracy_strategy degeneracy_strategy; @@ -231,24 +231,24 @@ class Curve_analysis_2_rep { * \c f/cont(f). The corresponding curve is equal to the curve of \c f, * only without vertical line components. */ - mutable boost::optional f_primitive; + mutable std::optional f_primitive; //! the polynomial containing all roots of the resultant of the primitive //! part of f and its y-derivative - mutable boost::optional + mutable std::optional resultant_of_primitive_and_derivative_y; //! the polynomial containing all roots of the resultant of the primitive //! part of f and its x-derivative - mutable boost::optional + mutable std::optional resultant_of_primitive_and_derivative_x; //! The Sturm-Habicht polynomials of f - mutable boost::optional > + mutable std::optional > sturm_habicht_of_primitive; //! The content of f - mutable boost::optional content; + mutable std::optional content; //! The non-working shear factors, as far as known mutable std::set bad_shears; @@ -257,10 +257,10 @@ class Curve_analysis_2_rep { mutable std::map sheared_curves; //! Has the curve vertical line components - mutable boost::optional has_vertical_component; + mutable std::optional has_vertical_component; //! The intermediate values - mutable boost::optional > > + mutable std::optional > > intermediate_values; //! stores Y_values at rational coordinate @@ -273,7 +273,7 @@ class Curve_analysis_2_rep { * are asymptotic to y=beta, * or go to +/- infty also in y-direction */ - mutable boost::optional > + mutable std::optional > horizontal_asymptotes_left, horizontal_asymptotes_right; //! friends @@ -547,7 +547,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { if(! this->ptr()->intermediate_values) { this->ptr()->intermediate_values - = std::vector > + = std::vector > (number_of_status_lines_with_event()+1); } @@ -1720,7 +1720,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { private: // Returns the intermediate values for intervals between events - std::vector >& intermediate_values() const + std::vector >& intermediate_values() const { if(! this->ptr()->intermediate_values) { // This is created during event_coordiantes() @@ -1916,7 +1916,7 @@ class Curve_analysis_2 : public ::CGAL::Handle_with_policy< Rep_ > { static_cast(content_roots.size())); this->ptr()->intermediate_values - = std::vector > + = std::vector > (event_coordinate_vector.size()+1); this->ptr()->event_coordinates = event_coordinate_vector; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h index 05b97af9bcd1..a38cf2ab659a 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Curve_pair_analysis_2.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -136,9 +136,9 @@ class Curve_pair_analysis_2_rep { typedef std::vector Slice_info; - typedef boost::optional Lazy_slice_info; + typedef std::optional Lazy_slice_info; - typedef boost::optional Lazy_bound; + typedef std::optional Lazy_bound; typedef CGAL::internal::Event_indices Event_indices; @@ -151,11 +151,11 @@ class Curve_pair_analysis_2_rep { typedef std::vector > Intersection_info_container; - typedef boost::optional + typedef std::optional Lazy_intersection_info_container; // For lazy evaluation of Status_line_CPA_1s. - typedef boost::optional Lazy_status_line_CPA_1; + typedef std::optional Lazy_status_line_CPA_1; //! @} @@ -191,31 +191,31 @@ class Curve_pair_analysis_2_rep { Polynomial_2 g; - mutable boost::optional > subresultants; + mutable std::optional > subresultants; - mutable boost::optional > + mutable std::optional > principal_subresultants; - mutable boost::optional > + mutable std::optional > coprincipal_subresultants; - mutable boost::optional resultant; + mutable std::optional resultant; - mutable boost::optional > resultant_roots; - mutable boost::optional > + mutable std::optional > resultant_roots; + mutable std::optional > event_x_coordinates; - mutable boost::optional > + mutable std::optional > multiplicities_of_resultant_roots; - mutable boost::optional > stripe_values; + mutable std::optional > stripe_values; mutable std::vector< Lazy_status_line_CPA_1 > event_slices; - mutable boost::optional > intermediate_values; + mutable std::optional > intermediate_values; - mutable boost::optional< std::vector< Lazy_status_line_CPA_1 > > + mutable std::optional< std::vector< Lazy_status_line_CPA_1 > > intermediate_slices; - mutable boost::optional > event_indices; + mutable std::optional > event_indices; mutable Lazy_intersection_info_container intersection_info_container; @@ -530,7 +530,7 @@ class Curve_pair_analysis_2 : /* * \brief Computes the intermediate x-coordinates and their status lines * - * In fact, it only fills the data fields with boost::none instances, + * In fact, it only fills the data fields with std::nullopt instances, * according to the lazy philosophy of the whole class. */ void compute_intermediate_values_and_slices() const; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h index 2bd1c6515c1c..c1260d26a456 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CA_1.h @@ -127,7 +127,7 @@ class Status_line_CA_1_rep { //Arc_pair _m_num_arcs; //! sequence of arcs crossing this status line (valid only event lines) - mutable boost::optional _m_arcs; + mutable std::optional _m_arcs; //! number of arcs intersecting this status line mutable int _m_total_arcs; @@ -160,10 +160,10 @@ class Status_line_CA_1_rep { std::vector< int > multiplicities_;*/ // stores algebraic real over the vertical line - mutable std::vector >_m_xy_coords; + mutable std::vector >_m_xy_coords; // stores the isolator instance - mutable boost::optional isolator; + mutable std::optional isolator; // befriending the handle friend class Status_line_CA_1; diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h index 26fb94416d1d..c3fb08048e7a 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Status_line_CPA_1.h @@ -75,7 +75,7 @@ class Status_line_CPA_1_rep { // represents x-coordinate of event of rational value over interval // computed only by demand - mutable boost::optional _m_x; + mutable std::optional _m_x; // for each event point stores a pair of arcnos of the 1st and 2nd curve // or -1 if respective curve is not involved diff --git a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h index 81a74c56c38c..44432d3b2af2 100644 --- a/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h +++ b/Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Xy_coordinate_2.h @@ -81,10 +81,10 @@ class Xy_coordinate_2_rep { mutable int _m_arcno; // y-coordinate - mutable boost::optional< Algebraic_real_1 > _m_y; + mutable std::optional< Algebraic_real_1 > _m_y; //! A bounding box for the given point - mutable boost::optional< std::pair > _m_bbox_2_pair; + mutable std::optional< std::pair > _m_bbox_2_pair; }; diff --git a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h index 22565c21d859..85afa0a60444 100644 --- a/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h +++ b/Alpha_shapes_2/include/CGAL/Alpha_shapes_2/internal/Lazy_alpha_nt_2.h @@ -167,7 +167,7 @@ class Lazy_alpha_nt_2 //members //the members can be updated when calling method exact() - mutable boost::optional exact_; + mutable std::optional exact_; mutable NT_approx approx_; //private functions @@ -235,7 +235,7 @@ class Lazy_alpha_nt_2 const NT_exact& exact() const { - if (exact_ == boost::none) { + if (exact_ == std::nullopt) { update_exact(); approx_=to_interval(*exact_); } diff --git a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h index f20b050c1a2c..8d461cd93a59 100644 --- a/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h +++ b/Alpha_shapes_3/include/CGAL/Alpha_shapes_3/internal/Lazy_alpha_nt_3.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include @@ -158,7 +158,7 @@ class Lazy_alpha_nt_3{ //members //the members can be updated when calling method exact() - mutable boost::optional exact_; + mutable std::optional exact_; mutable NT_approx approx_; //private functions @@ -229,7 +229,7 @@ class Lazy_alpha_nt_3{ } const NT_exact& exact() const { - if (exact_ == boost::none){ + if (exact_ == std::nullopt){ update_exact(); approx_=to_interval(*exact_); } diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp index 009eede6a798..d22b0d1474eb 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.cpp @@ -135,7 +135,7 @@ static inline bool hasValidChars(const std::string& expression, int dimension) } template -boost::optional +std::optional AlgebraicCurveParser::operator()(const std::string& expression) { using Traits = CGAL::Polynomial_traits_d; diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h index e838f2e3c0db..b5406743cb37 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/AlgebraicCurveParser.h @@ -22,12 +22,12 @@ #include #include -#include +#include template struct AlgebraicCurveParser { - boost::optional operator()(const std::string& expression); + std::optional operator()(const std::string& expression); }; #endif //ARRANGEMENT_ON_SURFACE_2_DEMO_ALGEBRAICCURVEPARSERNEW_H diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp index 71bb0f1d3c91..fe9eee327003 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp @@ -223,7 +223,7 @@ void EnvelopeCallback< Arr_>::updateEnvelope( bool lower ) { if (!e->is_empty()) { - boost::optional leftPoint, rightPoint; + std::optional leftPoint, rightPoint; if (e->left()) leftPoint = e->left()->point(); diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInput.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInput.cpp index 441cdf5271b5..9c15b61bd94c 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInput.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInput.cpp @@ -131,7 +131,7 @@ template void GraphicsViewCurveInput::curveInputDoneEvent( const std::vector& clickedPoints, CurveType type) { - boost::optional cv = + std::optional cv = this->curveGenerator.generate(clickedPoints, type); if (cv) { @@ -144,9 +144,9 @@ void GraphicsViewCurveInput::curveInputDoneEvent( template auto CurveGeneratorBase::generate( const std::vector& clickedPoints, CurveType type) - -> boost::optional + -> std::optional { - boost::optional res; + std::optional res; switch (type) { case CurveType::Segment: @@ -190,7 +190,7 @@ void CurveGeneratorBase::setTraits(const ArrTraits* traits_) // Curve Generator Segment Traits template auto CurveGenerator>::generateSegment( - const std::vector& clickedPoints) -> boost::optional + const std::vector& clickedPoints) -> std::optional { Curve_2 res{clickedPoints[0], clickedPoints[1]}; return res; @@ -200,7 +200,7 @@ auto CurveGenerator>::generateSegment( template auto CurveGenerator>:: generatePolyline(const std::vector& clickedPoints) - -> boost::optional + -> std::optional { if (clickedPoints.size() < 2) return {}; @@ -212,7 +212,7 @@ auto CurveGenerator>:: // Curve Generator Linear Traits template auto CurveGenerator>::generateSegment( - const std::vector& points) -> boost::optional + const std::vector& points) -> std::optional { Curve_2 res = Curve_2(Segment_2(points[0], points[1])); return res; @@ -220,7 +220,7 @@ auto CurveGenerator>::generateSegment( template auto CurveGenerator>::generateRay( - const std::vector& points) -> boost::optional + const std::vector& points) -> std::optional { Curve_2 res = Curve_2(Ray_2(points[0], points[1])); return res; @@ -228,7 +228,7 @@ auto CurveGenerator>::generateRay( template auto CurveGenerator>::generateLine( - const std::vector& points) -> boost::optional + const std::vector& points) -> std::optional { Curve_2 res = Curve_2(Line_2(points[0], points[1])); return res; @@ -238,7 +238,7 @@ auto CurveGenerator>::generateLine( template auto CurveGenerator>:: generateSegment(const std::vector& points) - -> boost::optional + -> std::optional { Curve_2 res = Curve_2(Rat_segment_2(points[0], points[1])); return res; @@ -246,7 +246,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: - generateCircle(const std::vector& points) -> boost::optional + generateCircle(const std::vector& points) -> std::optional { auto sq_rad = (points[0].x() - points[1].x()) * (points[0].x() - points[1].x()) + @@ -258,7 +258,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: generateEllipse(const std::vector& points) - -> boost::optional + -> std::optional { auto x1 = (CGAL::min)(points[0].x(), points[1].x()); auto y1 = (CGAL::min)(points[0].y(), points[1].y()); @@ -286,7 +286,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: generateThreePointCircularArc(const std::vector& points) - -> boost::optional + -> std::optional { auto& qp1 = points[0]; auto& qp2 = points[1]; @@ -310,7 +310,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: generateFivePointConicArc(const std::vector& points) - -> boost::optional + -> std::optional { auto& qp0 = points[0]; auto& qp1 = points[1]; @@ -341,7 +341,7 @@ auto CurveGenerator>:: // CurveGenerator Algebraic Traits template auto CurveGenerator>:: - generateLine(const std::vector& points) -> boost::optional + generateLine(const std::vector& points) -> std::optional { RationalTraits ratTraits; @@ -379,7 +379,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: - generateCircle(const std::vector& points) -> boost::optional + generateCircle(const std::vector& points) -> std::optional { auto sq_rad = (points[0].x() - points[1].x()) * (points[0].x() - points[1].x()) + @@ -390,7 +390,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: generateEllipse(const std::vector& points) - -> boost::optional + -> std::optional { auto rx = (points[0].x() - points[1].x()) * (points[0].x() - points[1].x()) / 4.; @@ -404,7 +404,7 @@ auto CurveGenerator>:: template auto CurveGenerator>:: generateEllipse_(const Point_2& center, Rational rxRat, Rational ryRat) - -> boost::optional + -> std::optional { RationalTraits ratTraits; @@ -438,7 +438,7 @@ template < auto CurveGenerator< Arr_Bezier_curve_traits_2>:: generateBezier(const std::vector& clickedPoints) - -> boost::optional + -> std::optional { if (clickedPoints.size() < 2) return {}; return Curve_2{clickedPoints.begin(), clickedPoints.end()}; diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInputTyped.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInputTyped.h index 1c8a1b946993..a62e69ac2770 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInputTyped.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/GraphicsViewCurveInputTyped.h @@ -45,26 +45,26 @@ class CurveGeneratorBase void setTraits(const ArrTraits* traits_); - boost::optional + std::optional generate(const std::vector& clickedPoints, CurveType type); - virtual boost::optional + virtual std::optional generateSegment(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateRay(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateLine(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generatePolyline(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateCircle(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateEllipse(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateThreePointCircularArc(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateFivePointConicArc(const std::vector&) { return {}; } - virtual boost::optional + virtual std::optional generateBezier(const std::vector&) { return {}; } const ArrTraits* traits; @@ -85,7 +85,7 @@ struct CurveGenerator> : using Super = CurveGeneratorBase; using Point_2 = typename Super::Point_2; - boost::optional + std::optional generateSegment(const std::vector&) override; }; @@ -98,7 +98,7 @@ struct CurveGenerator> : using Super = CurveGeneratorBase; using Point_2 = typename Super::Point_2; - boost::optional + std::optional generatePolyline(const std::vector&) override; }; @@ -118,14 +118,14 @@ struct CurveGenerator> : using Super = CurveGeneratorBase; using Point_2 = typename Super::Point_2; - boost::optional + std::optional generateSegment(const std::vector&) override; - boost::optional generateCircle(const std::vector&) override; - boost::optional + std::optional generateCircle(const std::vector&) override; + std::optional generateEllipse(const std::vector&) override; - boost::optional + std::optional generateThreePointCircularArc(const std::vector&) override; - boost::optional + std::optional generateFivePointConicArc(const std::vector&) override; }; @@ -143,10 +143,10 @@ struct CurveGenerator> : using Super = CurveGeneratorBase; using Point_2 = typename Super::Point_2; - boost::optional + std::optional generateSegment(const std::vector&) override; - boost::optional generateRay(const std::vector&) override; - boost::optional generateLine(const std::vector&) override; + std::optional generateRay(const std::vector&) override; + std::optional generateLine(const std::vector&) override; }; template @@ -165,13 +165,13 @@ struct CurveGenerator> : using Super = CurveGeneratorBase; using Point_2 = typename Super::Point_2; - boost::optional generateLine(const std::vector&) override; - boost::optional generateCircle(const std::vector&) override; - boost::optional + std::optional generateLine(const std::vector&) override; + std::optional generateCircle(const std::vector&) override; + std::optional generateEllipse(const std::vector&) override; private: - boost::optional generateEllipse_(const Point_2&, Rational, Rational); + std::optional generateEllipse_(const Point_2&, Rational, Rational); }; template < @@ -188,7 +188,7 @@ struct CurveGenerator< using Point_2 = typename Super::Point_2; using Curve_2 = typename ArrTraits::Curve_2; - boost::optional generateBezier(const std::vector&) override; + std::optional generateBezier(const std::vector&) override; }; template diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.cpp index 9194c35a749d..cefb4e8e5c09 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.cpp @@ -16,7 +16,7 @@ #include "ArrangementTypesUtils.h" #include "PointSnapper.h" -#include +#include template class PointSnapper : public PointSnapperBase @@ -26,7 +26,7 @@ class PointSnapper : public PointSnapperBase public: PointSnapper(QGraphicsScene*, GridGraphicsItem*, Arrangement*); - boost::optional snapToArrangement(const QPointF& qpt) override; + std::optional snapToArrangement(const QPointF& qpt) override; private: Arrangement* arr; @@ -170,7 +170,7 @@ PointSnapper::PointSnapper( } template -inline boost::optional snapToArrangement( +inline std::optional snapToArrangement( const QPointF& qpt, const QTransform& worldTransform, Arrangement* arr) { using Point_2 = PointSnapperBase::Point_2; @@ -215,7 +215,7 @@ struct SnapToArrangement { using Point_2 = PointSnapperBase::Point_2; template - boost::optional + std::optional operator()(const QPointF& qpt, const QTransform&, Arrangement*) { return Point_2{qpt.x(), qpt.y()}; @@ -226,7 +226,7 @@ struct SnapToArrangement> { using Point_2 = PointSnapperBase::Point_2; template - boost::optional operator()( + std::optional operator()( const QPointF& qpt, const QTransform& worldTransform, Arrangement* arr) { return snapToArrangement(qpt, worldTransform, arr); @@ -237,7 +237,7 @@ struct SnapToArrangement> { using Point_2 = PointSnapperBase::Point_2; template - boost::optional operator()( + std::optional operator()( const QPointF& qpt, const QTransform& worldTransform, Arrangement* arr) { return snapToArrangement(qpt, worldTransform, arr); @@ -248,7 +248,7 @@ struct SnapToArrangement> { using Point_2 = PointSnapperBase::Point_2; template - boost::optional operator()( + std::optional operator()( const QPointF& qpt, const QTransform& worldTransform, Arrangement* arr) { return snapToArrangement(qpt, worldTransform, arr); @@ -257,7 +257,7 @@ struct SnapToArrangement> template auto PointSnapper::snapToArrangement(const QPointF& qpt) - -> boost::optional + -> std::optional { using Traits = typename Arrangement::Geometry_traits_2; auto view = getView(); diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.h index 9829f831f5df..2d2a186235ea 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/PointSnapper.h @@ -50,7 +50,7 @@ class PointSnapperBase : public GraphicsSceneMixin protected: PointSnapperBase(QGraphicsScene* scene, GridGraphicsItem* grid); Point_2 snapToGrid(const QPointF& qpt); - virtual boost::optional snapToArrangement(const QPointF& qpt) = 0; + virtual std::optional snapToArrangement(const QPointF& qpt) = 0; GridGraphicsItem* gridGraphicsItem; bool snapToGridEnabled; diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp index 5fcdeb8fc3cb..2b44a70e0fee 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.cpp @@ -404,8 +404,8 @@ Construct_x_monotone_subcurve_2::Construct_x_monotone_subcurve_2( template auto Construct_x_monotone_subcurve_2::operator()( - const X_monotone_curve_2& curve, const boost::optional& pLeft, - const boost::optional& pRight) -> X_monotone_curve_2 + const X_monotone_curve_2& curve, const std::optional& pLeft, + const std::optional& pRight) -> X_monotone_curve_2 { Point_2 pMin, pMax; bool unbounded_min = false; @@ -457,8 +457,8 @@ template auto Construct_x_monotone_subcurve_2< CGAL::Arr_conic_traits_2>:: operator()( - const X_monotone_curve_2& curve, const boost::optional& pLeft, - const boost::optional& pRight) -> X_monotone_curve_2 + const X_monotone_curve_2& curve, const std::optional& pLeft, + const std::optional& pRight) -> X_monotone_curve_2 { // TODO: handle when pLeft or pRight is null @@ -500,8 +500,8 @@ template < auto Construct_x_monotone_subcurve_2>:: operator()( - const X_monotone_curve_2& curve, const boost::optional& pLeft, - const boost::optional& pRight) -> X_monotone_curve_2 + const X_monotone_curve_2& curve, const std::optional& pLeft, + const std::optional& pRight) -> X_monotone_curve_2 { auto pMin = this->construct_min_vertex_2(curve); auto pMax = this->construct_max_vertex_2(curve); @@ -563,8 +563,8 @@ template auto Construct_x_monotone_subcurve_2< CGAL::Arr_rational_function_traits_2>:: operator()( - const X_monotone_curve_2& curve, const boost::optional& pLeft, - const boost::optional& pRight) -> X_monotone_curve_2 + const X_monotone_curve_2& curve, const std::optional& pLeft, + const std::optional& pRight) -> X_monotone_curve_2 { Point_2 pMin, pMax; bool unbounded_min = false; diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.h index 3775dfa43af8..99b66c089d9f 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils/Utils.h @@ -358,8 +358,8 @@ class Construct_x_monotone_subcurve_2 projection. */ X_monotone_curve_2 operator() ( const X_monotone_curve_2& curve, - const boost::optional& pLeft, - const boost::optional& pRight ); + const std::optional& pLeft, + const std::optional& pRight ); protected: const ArrTraits* traits; @@ -406,8 +406,8 @@ class Construct_x_monotone_subcurve_2< CGAL::Arr_conic_traits_2< RatKernel, Return the subcurve of curve bracketed by pLeft and pRight. */ X_monotone_curve_2 operator() ( const X_monotone_curve_2& curve, - const boost::optional& pLeft, - const boost::optional& pRight ); + const std::optional& pLeft, + const std::optional& pRight ); }; // class Construct_x_monotone_subcurve_2 for Arr_conic_traits_2 @@ -436,8 +436,8 @@ class Construct_x_monotone_subcurve_2& pLeft, - const boost::optional& pRight); + const X_monotone_curve_2& curve, const std::optional& pLeft, + const std::optional& pRight); protected: const ArrTraits* traits; @@ -478,8 +478,8 @@ class Construct_x_monotone_subcurve_2< projection. */ X_monotone_curve_2 operator() ( const X_monotone_curve_2& curve, - const boost::optional& pLeft, - const boost::optional& pRight ); + const std::optional& pLeft, + const std::optional& pRight ); protected: const Traits* traits; diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp index 831e0e44395a..95bdc262b299 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/unb_planar_vertical_decomposition.cpp @@ -10,7 +10,7 @@ typedef boost::variant Cell_type; -typedef boost::optional Vert_decomp_type; +typedef std::optional Vert_decomp_type; typedef std::pair Vert_decomp_pair; typedef std::pair Vert_decomp_entry; typedef std::list Vert_decomp_list; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h index 85f1b7c5acf6..02e44f64cef6 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h @@ -25,7 +25,7 @@ #include -#include +#include #include namespace CGAL { @@ -267,8 +267,8 @@ class Arr_algebraic_segment_traits_2 { template OutputIterator x_monotone_segment(Curve_2 cv, Point_2 p, - boost::optional start, - boost::optional end, + std::optional start, + std::optional end, OutputIterator out) const { typedef boost::variant @@ -407,19 +407,19 @@ class Arr_algebraic_segment_traits_2 { Site_of_point site_of_p, OutputIterator out) const { if(site_of_p==POINT_IN_INTERIOR) { - return x_monotone_segment(cv,p,boost::none, boost::none,out); + return x_monotone_segment(cv,p,std::nullopt, std::nullopt,out); } else if(site_of_p==MIN_ENDPOINT) { return x_monotone_segment(cv, p, - boost::optional(p), - boost::none, + std::optional(p), + std::nullopt, out); } CGAL_assertion(site_of_p==MAX_ENDPOINT); return x_monotone_segment(cv, p, - boost::none, - boost::optional(p), + std::nullopt, + std::optional(p), out); } @@ -468,15 +468,15 @@ class Arr_algebraic_segment_traits_2 { return x_monotone_segment (cv, end_left, - boost::optional(end_left), - boost::optional(end_right), + std::optional(end_left), + std::optional(end_right), out); } else { return x_monotone_segment (cv, end_right, - boost::optional(end_left), - boost::optional(end_right), + std::optional(end_left), + std::optional(end_right), out); } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h index af58c2612406..81fec7a37855 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_batched_point_location.h @@ -41,7 +41,7 @@ namespace Ss2 = Surface_sweep_2; * \param oi Output: An output iterator for the query results. * \pre The value-type of PointsIterator is Arrangement::Point_2, * and the value-type of OutputIterator is is pair, - * where Result is boost::optional >. * It represents the arrangement feature containing the point. diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h index 8b4a3e1eca23..e7aea3a8d19d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_bounded_planar_topology_traits_2.h @@ -305,7 +305,7 @@ class Arr_bounded_planar_topology_traits_2 : * \pre The curve has a boundary condition in either x or y. * \return An object that wraps the curve end. */ - boost::optional > + std::optional > place_boundary_vertex(Face*, const X_monotone_curve_2&, Arr_curve_end, @@ -314,7 +314,7 @@ class Arr_bounded_planar_topology_traits_2 : { // This function should never be called: CGAL_error(); - return boost::none; + return std::nullopt; } /*! Locate the predecessor halfedge for the given curve around a given diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h index 5a32bb997d75..37f0a05f550d 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_overlay_2.h @@ -24,7 +24,7 @@ */ #include -#include +#include #include #include #include @@ -284,8 +284,8 @@ overlay(const Arrangement_on_surface_2& arr1 if (vit1->is_isolated()) { typename Arr_a::Vertex_const_handle v1 = vit1; pts_vec[i++] = - Ovl_point_2(vit1->point(), boost::make_optional(Cell_handle_red(v1)), - boost::optional()); + Ovl_point_2(vit1->point(), std::make_optional(Cell_handle_red(v1)), + std::optional()); } } @@ -294,8 +294,8 @@ overlay(const Arrangement_on_surface_2& arr1 if (vit2->is_isolated()) { typename Arr_b::Vertex_const_handle v2 = vit2; pts_vec[i++] = - Ovl_point_2(vit2->point(), boost::optional(), - boost::make_optional(Cell_handle_blue(v2))); + Ovl_point_2(vit2->point(), std::optional(), + std::make_optional(Cell_handle_blue(v2))); } } diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h index 71059ab2be40..e7c4a5b1dd52 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Arr_lm_nearest_neighbor.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace CGAL { diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h index f901bb72565d..eb161a353c52 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_edge.h @@ -145,13 +145,13 @@ class Td_active_edge : public Handle //Dag_node* m_dag_node; //pointer to the search structure (DAG) node /*! Initialize the trapezoid's neighbors. */ - inline void init_neighbors(boost::optional next) + inline void init_neighbors(std::optional next) { set_next((next) ? *next : Td_map_item(0)); } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ - CGAL_DEPRECATED inline void init_neighbours(boost::optional next) + CGAL_DEPRECATED inline void init_neighbours(std::optional next) { init_neighbors(next); } /*! Set the DAG node. */ @@ -199,7 +199,7 @@ class Td_active_edge : public Handle /*! Constructor given Vertex & Halfedge handles. */ Td_active_edge (Halfedge_const_handle he , Dag_node* node = 0, - boost::optional next = boost::none) + std::optional next = std::nullopt) { PTR = new Data(he, (next) ? *next : Td_map_item(0), node); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h index 06b384daed94..2872d2563109 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Td_active_trapezoid.h @@ -24,7 +24,7 @@ #include #include -#include +#include #ifdef CGAL_TD_DEBUG @@ -163,8 +163,8 @@ class Td_active_trapezoid : public Handle //Dag_node* m_dag_node; //pointer to the search structure (DAG) node /*! Initialize the trapezoid's neighbors. */ - inline void init_neighbors(boost::optional lb, boost::optional lt, - boost::optional rb, boost::optional rt) + inline void init_neighbors(std::optional lb, std::optional lt, + std::optional rb, std::optional rt) { set_lb((lb) ? *lb : Td_map_item(0)); set_lt((lt) ? *lt : Td_map_item(0)); @@ -173,8 +173,8 @@ class Td_active_trapezoid : public Handle } /*! \copydoc init_neighbors * \deprecated please use #init_neighbors */ - CGAL_DEPRECATED inline void init_neighbours(boost::optional lb, boost::optional lt, - boost::optional rb, boost::optional rt) + CGAL_DEPRECATED inline void init_neighbours(std::optional lb, std::optional lt, + std::optional rb, std::optional rt) { init_neighbors(lb, lt, rb, rt); } /*! Set the DAG node. */ @@ -267,10 +267,10 @@ class Td_active_trapezoid : public Handle /*! Constructor given Vertex & Halfedge handles. */ Td_active_trapezoid (Vertex_const_handle l, Vertex_const_handle r, Halfedge_const_handle b, Halfedge_const_handle t, - boost::optional lb = boost::none, - boost::optional lt = boost::none, - boost::optional rb = boost::none, - boost::optional rt = boost::none, + std::optional lb = std::nullopt, + std::optional lt = std::nullopt, + std::optional rb = std::nullopt, + std::optional rt = std::nullopt, Dag_node* node = 0) { PTR = new Data (l, r, b, t, (lb) ? *lb : Td_map_item(0), (lt) ? *lt : Td_map_item(0), diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h index 097e12d0dcb7..7b3b224a2239 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2.h @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include @@ -272,7 +272,7 @@ class Trapezoidal_decomposition_2 Base_map_item_iterator() : traits(0), m_cur_item(Td_map_item(0)){ } Base_map_item_iterator(const Traits* traits_, - boost::optional curr = boost::none) + std::optional curr = std::nullopt) :traits(traits_), m_cur_item((curr) ? *curr : Td_map_item(0) ) { } Base_map_item_iterator(const Base_map_item_iterator &it) @@ -332,12 +332,12 @@ class Trapezoidal_decomposition_2 public: //constructors In_face_iterator(const Traits* traits_, Halfedge_const_handle sep, - boost::optional curr = boost::none) + std::optional curr = std::nullopt) :Base_map_item_iterator(traits_,curr), m_sep(sep->curve()) { } In_face_iterator(const Traits* traits_, const X_monotone_curve_2& sep, - boost::optional curr = boost::none) + std::optional curr = std::nullopt) :Base_map_item_iterator(traits_,curr), m_sep(sep) { } @@ -790,25 +790,25 @@ class Trapezoidal_decomposition_2 }; class curve_end_for_fict_vertex_visitor : - public boost::static_visitor > + public boost::static_visitor > { public: - boost::optional operator()(Td_active_fictitious_vertex& t) const + std::optional operator()(Td_active_fictitious_vertex& t) const { return t.curve_end(); } - boost::optional + std::optional operator()(Td_inactive_fictitious_vertex& t) const { return t.curve_end(); } template < typename T > - boost::optional operator()(T& /* t */) const + std::optional operator()(T& /* t */) const { CGAL_assertion(false); - return boost::none; + return std::nullopt; } }; @@ -834,24 +834,24 @@ class Trapezoidal_decomposition_2 }; class curve_end_for_active_vertex_visitor : - public boost::static_visitor > + public boost::static_visitor > { public: - boost::optional operator()(Td_active_vertex& t) const + std::optional operator()(Td_active_vertex& t) const { return t.curve_end(); } - boost::optional operator()(Td_active_fictitious_vertex& t) const + std::optional operator()(Td_active_fictitious_vertex& t) const { return t.curve_end(); } template < typename T > - boost::optional operator()(T& /* t */) const + std::optional operator()(T& /* t */) const { CGAL_assertion(false); - return boost::none; + return std::nullopt; } }; @@ -878,26 +878,26 @@ class Trapezoidal_decomposition_2 }; class cv_for_edge_visitor : - public boost::static_visitor > + public boost::static_visitor > { public: - boost::optional + std::optional operator()(Td_active_edge& t) const { return t.halfedge()->curve(); } - boost::optional + std::optional operator()(Td_inactive_edge& t) const { return t.curve(); } template - boost::optional operator()(T& /* t */) const + std::optional operator()(T& /* t */) const { CGAL_assertion(false); - return boost::none; + return std::nullopt; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h index 15c72e819455..b912b9facc72 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location/Trapezoidal_decomposition_2_impl.h @@ -109,7 +109,7 @@ split_trapezoid_by_vertex(Dag_node& split_node, //CGAL_warning(left_e.is_on_left_boundary() == e.is_on_left_boundary()); //CGAL_warning(right_e.is_on_right_boundary() == e.is_on_right_boundary()); - left_e.init_neighbors(boost::none); + left_e.init_neighbors(std::nullopt); //left_e.init_neighbors(e.lb(),e.lt(),Td_map_item(),right_node.get_data()); right_e.init_neighbors(e.next()); //right_e.init_neighbors(left_node.get_data(),left_node.get_data(),e.rb(),e.rt()); @@ -307,9 +307,9 @@ split_trapezoid_by_halfedge(Dag_node& split_node, Td_active_trapezoid& top = boost::get(top_node.get_data()); - top.init_neighbors(prev_top_tr, split_tr.lt(), boost::none , split_tr.rt()); + top.init_neighbors(prev_top_tr, split_tr.lt(), std::nullopt , split_tr.rt()); bottom.init_neighbors(split_tr.lb(), prev_bottom_tr, split_tr.rb(), - boost::none); + std::nullopt); if (!traits->is_empty_item(prev_bottom_tr)) { Td_active_trapezoid& @@ -1524,7 +1524,7 @@ Trapezoidal_decomposition_2::insert(Halfedge_const_handle he) // create the Td_map_item iterator for traveling along the Trapezoids that // intersect the input Halfedge, using left-low to right-high order In_face_iterator it = follow_curve(p1_node,he,LARGER); - boost::optional curr_trp = boost::none; + std::optional curr_trp = std::nullopt; Td_map_item prev = p1_item; Td_map_item prev_bottom_tr = Td_map_item(0); //active_tr Td_map_item prev_top_tr = Td_map_item(0); //active_tr @@ -1539,7 +1539,7 @@ Trapezoidal_decomposition_2::insert(Halfedge_const_handle he) while(!!it) { //this means as long as the iterator is valid curr_trp = it.trp(); - CGAL_assertion(curr_trp != boost::none); + CGAL_assertion(curr_trp != std::nullopt); prev_bottom_tr = (*curr_trp).lb(); prev_top_tr = (*curr_trp).lt(); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h index 1fae9de1d305..db555da63f4c 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_point_location_result.h @@ -19,7 +19,7 @@ // The macro CGAL_ARR_POINT_LOCATION_VERSION controls which version of the // point location is used. Currently two values are supported: // 1. Point location with CGAL::Object -// 2. Point location with boost::optional > +// 2. Point location with std::optional > // The default value is 2. #if !defined(CGAL_ARR_POINT_LOCATION_VERSION) @@ -28,7 +28,7 @@ #include -#include +#include #include #ifdef CGAL_CFG_BOOST_VARIANT_SWAP_BUG @@ -73,7 +73,7 @@ struct Arr_point_location_result { // This function returns either make_object() or a result_type constructor // to generate return values. The Object version takes a dummy template // argument, which is needed for the return of the other option, e.g., - // boost::optional >. + // std::optional >. // In theory a one parameter variant could be returned, but this _could_ // lead to conversion overhead, and so we rather go for the real type. // Overloads for empty returns are also provided. @@ -94,8 +94,8 @@ struct Arr_point_location_result { inline Type make_result(T t) { return Type(t); } static - inline boost::optional empty_optional_result() - { return boost::optional(); } + inline std::optional empty_optional_result() + { return std::optional(); } template static diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h b/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h index 099f46edcd61..efdaa8d65d9b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_simple_point_location.h @@ -26,7 +26,7 @@ #include #include -#include +#include namespace CGAL { @@ -60,7 +60,7 @@ class Arr_simple_point_location { #if CGAL_ARR_POINT_LOCATION_VERSION < 2 typedef Result_type Optional_result_type; #else - typedef typename boost::optional Optional_result_type; + typedef typename std::optional Optional_result_type; #endif typedef typename Topology_traits::Dcel Dcel; @@ -75,8 +75,8 @@ class Arr_simple_point_location { inline bool optional_empty(const CGAL::Object& obj) const { return obj.empty(); } inline const Result_type& optional_assign(const CGAL::Object& t) const { return t; } #else - inline bool optional_empty(const boost::optional& t) const { return (!t); } - inline const Result_type& optional_assign(const boost::optional& t) const { return *t; } + inline bool optional_empty(const std::optional& t) const { return (!t); } + inline const Result_type& optional_assign(const std::optional& t) const { return *t; } #endif template diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h index d7b170e979b8..97e451bda5f9 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_spherical_topology_traits_2.h @@ -506,7 +506,7 @@ class Arr_spherical_topology_traits_2 { * \pre The curve has a boundary condition in either x or y. * \return An object that contains the curve end. */ - boost::optional > + std::optional > place_boundary_vertex(Face* f, const X_monotone_curve_2& xc, Arr_curve_end ind, diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h index 2170c332d803..b9f94fd92fcf 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_bounded_planar_vert_decomp_helper.h @@ -49,7 +49,7 @@ class Arr_bounded_planar_vert_decomp_helper { typedef boost::variant Cell_type; - typedef boost::optional Vert_type; + typedef std::optional Vert_type; protected: // Data members: diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h index 9175587a317a..ef4da091be75 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_topology_traits_2_impl.h @@ -571,7 +571,7 @@ let_me_decide_the_outer_ccb(std::pair< CGAL::Sign, CGAL::Sign> signs1, * represent the curve end along the face boundary. */ template -boost::optional +std::optional ::Vertex*, typename Arr_spherical_topology_traits_2::Halfedge*> > @@ -586,16 +586,16 @@ place_boundary_vertex(Face* /* f */, Arr_parameter_space ps_y) { typedef boost::variant Non_optional_result; - typedef boost::optional Result; + typedef std::optional Result; // std::cout << "place_boundary_vertex()" << std::endl; if (ps_y == ARR_BOTTOM_BOUNDARY) { - if (m_south_pole == nullptr) return boost::none; + if (m_south_pole == nullptr) return std::nullopt; return Result(Non_optional_result(m_south_pole)); } if (ps_y == ARR_TOP_BOUNDARY) { - if (m_north_pole == nullptr) return boost::none; + if (m_north_pole == nullptr) return std::nullopt; return Result(Non_optional_result(m_north_pole)); } @@ -611,7 +611,7 @@ place_boundary_vertex(Face* /* f */, } // The vertex hasn't been created yet, return a null object: - return boost::none; + return std::nullopt; } /*! \brief locate the predecessor halfedge for the given curve around a given diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h index af8e70a3f13c..f83aab57b858 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_spherical_vert_decomp_helper.h @@ -50,7 +50,7 @@ class Arr_spherical_vert_decomp_helper { typedef boost::variant Cell_type; - typedef boost::optional Vert_type; + typedef std::optional Vert_type; protected: typedef typename Arrangement_2::Topology_traits Topology_traits; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h index 4be3568c3a68..f9c7f957c34a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_topology_traits_2_impl.h @@ -296,7 +296,7 @@ are_equal(const Vertex *v, // represent the curve end along the face boundary. // template -boost::optional +std::optional ::Vertex*, typename Arr_unb_planar_topology_traits_2::Halfedge*> > @@ -306,7 +306,7 @@ place_boundary_vertex(Face* f, Arr_parameter_space ps_x, Arr_parameter_space ps_y) { typedef boost::variant Non_optional_result; - typedef boost::optional Result; + typedef std::optional Result; // Get a halfedge on the outer CCB of f and start traversing the CCB. Halfedge* first = *(f->outer_ccbs_begin()); @@ -331,7 +331,7 @@ place_boundary_vertex(Face* f, // If we reached here, we did not find a suitable halfedge, which should // never happen. CGAL_error(); - return boost::none; + return std::nullopt; } //----------------------------------------------------------------------------- diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h index 23fa949e3cd0..befc27bb89f0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_topology_traits/Arr_unb_planar_vert_decomp_helper.h @@ -48,7 +48,7 @@ class Arr_unb_planar_vert_decomp_helper { typedef boost::variant Cell_type; - typedef boost::optional Vert_type; + typedef std::optional Vert_type; protected: typedef typename Arrangement_2::Topology_traits Topology_traits; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h index 30181d7270f3..86df601c06ad 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_unb_planar_topology_traits_2.h @@ -291,7 +291,7 @@ class Arr_unb_planar_topology_traits_2 : * \return An object that contains the curve end. * In our case this object always wraps a fictitious edge. */ - boost::optional > + std::optional > place_boundary_vertex(Face* f, const X_monotone_curve_2& cv, Arr_curve_end ind, diff --git a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h index 8f0185a5a037..71fbfd48f9fa 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arrangement_zone_2.h @@ -103,7 +103,7 @@ class Arrangement_zone_2 { typedef std::pair Intersection_point; typedef boost::variant Intersection_result; - typedef boost::optional Optional_intersection; + typedef std::optional Optional_intersection; typedef std::list Intersect_list; typedef std::map Intersect_map; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h index 2182023925e8..8766eac294d0 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include @@ -155,13 +155,13 @@ class Arc_2_rep { mutable bool _m_left_to_right; //! stores the index of an interval this arc belongs to - mutable boost::optional _m_interval_id; + mutable std::optional _m_interval_id; //! stores boundary value in x-range of non-vertical interval - mutable boost::optional< Bound > _m_boundary_in_interval; + mutable std::optional< Bound > _m_boundary_in_interval; //! stores a bbox for an arc - mutable boost::optional< CGAL::Bbox_2 > _m_bbox; + mutable std::optional< CGAL::Bbox_2 > _m_bbox; //!@} }; @@ -2240,8 +2240,8 @@ class Arc_2 : rep._m_is_vertical = this->ptr()->_m_is_vertical; rep._m_left_to_right = this->ptr()->_m_left_to_right; - rep._m_interval_id = boost::none; - rep._m_boundary_in_interval = boost::none; + rep._m_interval_id = std::nullopt; + rep._m_boundary_in_interval = std::nullopt; return std::make_pair(Kernel_arc_2(rep), cmp); } @@ -2372,8 +2372,8 @@ class Arc_2 : this->ptr()->_m_arcno_max = arcno(); // invalidate curve-specific data - this->ptr()->_m_interval_id = boost::none; - this->ptr()->_m_boundary_in_interval = boost::none; + this->ptr()->_m_interval_id = std::nullopt; + this->ptr()->_m_boundary_in_interval = std::nullopt; } //!@} diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_renderer_facade.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_renderer_facade.h index c1ece0d0d577..df79d30b7713 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_renderer_facade.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_renderer_facade.h @@ -253,8 +253,8 @@ class Curve_renderer_interface class Allocator > inline void draw(const Arc_2& arc, Container< std::vector< Coord_2 >, Allocator >& pts, - boost::optional< Coord_2 > *end_pt1 = nullptr, - boost::optional< Coord_2 > *end_pt2 = nullptr) { + std::optional< Coord_2 > *end_pt1 = nullptr, + std::optional< Coord_2 > *end_pt2 = nullptr) { #ifndef CGAL_CKVA_DUMMY_RENDERER Bbox_2 bbox; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Fig_stream_Curve_renderer_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Fig_stream_Curve_renderer_2.h index 55d269ca01b2..a7b9453af479 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Fig_stream_Curve_renderer_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Fig_stream_Curve_renderer_2.h @@ -43,7 +43,7 @@ operator << typedef std::pair< int, int > Coord_2; typedef std::vector< Coord_2 > Coord_vec_2; - boost::optional < Coord_2 > p1, p2; + std::optional < Coord_2 > p1, p2; std::list points; Bbox_2 bbox (CGAL::to_double(ws.bounding_rect().xmin()), diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_arc_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_arc_2.h index c95ee1b85f9a..06ec76eb58f8 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_arc_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_arc_2.h @@ -83,9 +83,9 @@ class Generic_arc_2_rep // end-points (in degenerate case both point to the same object) mutable Generic_point_2 _m_min; - mutable boost::optional _m_max; + mutable std::optional _m_max; // stores native arc object (only for non-degenerate case) - mutable boost::optional _m_arc; + mutable std::optional _m_arc; // whether an arc is degenerate //bool _m_is_degenerate; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_point_2.h index f993dd009af0..c465cae03009 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Generic_point_2.h @@ -67,12 +67,12 @@ class Generic_point_2_rep _m_point(p) { } - mutable boost::optional _m_arc; // supporting arc for points at inf + mutable std::optional _m_arc; // supporting arc for points at inf // stores respective curve end if this is a point at infinity CGAL::Arr_curve_end _m_end; - mutable boost::optional _m_point; // stores a finite point + mutable std::optional _m_point; // stores a finite point // befriending the handle friend class Generic_point_2; diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index 53b5d589b136..f96830c3399a 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -21,7 +21,7 @@ #include -#include +#include #include #include @@ -107,22 +107,22 @@ class Point_2_rep //! curve point finite coordinates. They are valid only if boundary in y //! is not set (CGAL::NO_BOUNDARY), otherwise only x-coordinate is //! accessible, i.e., point is in interior - boost::optional< Coordinate_2 > _m_xy; + std::optional< Coordinate_2 > _m_xy; //! x-coordinate of a curve point - boost::optional< Coordinate_1 > _m_x; + std::optional< Coordinate_1 > _m_x; //! curve of point at boundary - boost::optional< Curve_analysis_2 > _m_curve; + std::optional< Curve_analysis_2 > _m_curve; //! arc of point at boundary - boost::optional< int > _m_arcno; + std::optional< int > _m_arcno; //! location of a point in parameter space mutable CGAL::Arr_parameter_space _m_location; //! store a double approximation of point - mutable boost::optional< std::pair< double, double > > _m_doubles; + mutable std::optional< std::pair< double, double > > _m_doubles; }; /*!\brief diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h index 3d1bdff6e912..03d6fcadfbe3 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/Sweep_curves_adapter_2.h @@ -22,7 +22,7 @@ #include -#include +#include #include #include #include diff --git a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h index f9551ac46fab..32d3d4cc8493 100644 --- a/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Curved_kernel_via_analysis_2/gfx/Curve_renderer_2.h @@ -423,8 +423,8 @@ template < class Coord_2, template < class, class > class Container, class Allocator > void draw(const Arc_2& arc, Container< std::vector< Coord_2 >, Allocator >& points, - boost::optional< Coord_2 > *end_pt1 = nullptr, - boost::optional< Coord_2 > *end_pt2 = nullptr) { + std::optional< Coord_2 > *end_pt1 = nullptr, + std::optional< Coord_2 > *end_pt2 = nullptr) { #ifdef CGAL_CKVA_CR_TIMING refine_timer.start(); diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h index ab7b56ce9871..7a011211706b 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_ss_visitor.h @@ -23,7 +23,7 @@ */ #include -#include +#include #include #include @@ -524,11 +524,11 @@ void Arr_overlay_ss_visitor::update_event(Event* e, CGAL_assertion(sc->color() == Gt2::RED); Halfedge_handle_red red_he = sc->red_halfedge_handle(); - pt.set_red_cell(boost::make_optional(Cell_handle_red(red_he))); + pt.set_red_cell(std::make_optional(Cell_handle_red(red_he))); } else if (pt.is_blue_cell_empty()) { Halfedge_handle_blue blue_he = sc->blue_halfedge_handle(); - pt.set_blue_cell(boost::make_optional(Cell_handle_blue(blue_he))); + pt.set_blue_cell(std::make_optional(Cell_handle_blue(blue_he))); } } diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h index b38fc25d3444..717b31a0d377 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_overlay_traits_2.h @@ -23,7 +23,7 @@ */ #include -#include +#include #include @@ -107,19 +107,19 @@ class Arr_overlay_traits_2 { typedef boost::variant Cell_handle_red; - typedef boost::optional Optional_cell_red; + typedef std::optional Optional_cell_red; typedef boost::variant Cell_handle_blue; - typedef boost::optional Optional_cell_blue; + typedef std::optional Optional_cell_blue; template Optional_cell_red make_optional_cell_red(Handle_red handle_red) - { return boost::make_optional(Cell_handle_red(handle_red)); } + { return std::make_optional(Cell_handle_red(handle_red)); } template Optional_cell_red make_optional_cell_blue(Handle_blue handle_blue) - { return boost::make_optional(Cell_handle_blue(handle_blue)); } + { return std::make_optional(Cell_handle_blue(handle_blue)); } private: const Gt2* m_base_traits; // The base traits object. @@ -450,16 +450,16 @@ class Arr_overlay_traits_2 { if (xcv1.color() == RED) { CGAL_assertion(xcv2.color() == BLUE); red_cell = - boost::make_optional(Cell_handle_red(xcv1.red_halfedge_handle())); + std::make_optional(Cell_handle_red(xcv1.red_halfedge_handle())); blue_cell = - boost::make_optional(Cell_handle_blue(xcv2.blue_halfedge_handle())); + std::make_optional(Cell_handle_blue(xcv2.blue_halfedge_handle())); } else { CGAL_assertion((xcv2.color() == RED) && (xcv1.color() == BLUE)); red_cell = - boost::make_optional(Cell_handle_red(xcv2.red_halfedge_handle())); + std::make_optional(Cell_handle_red(xcv2.red_halfedge_handle())); blue_cell = - boost::make_optional(Cell_handle_blue(xcv1.blue_halfedge_handle())); + std::make_optional(Cell_handle_blue(xcv1.blue_halfedge_handle())); } // Create the extended point and add the multiplicity. @@ -574,15 +574,15 @@ class Arr_overlay_traits_2 { red_cell = (! xcv.red_halfedge_handle()->target()->is_at_open_boundary() && m_base_equal(base_p, xcv.red_halfedge_handle()->target()->point())) ? - boost::make_optional(Cell_handle_red(xcv.red_halfedge_handle()->target())) : - boost::make_optional(Cell_handle_red(xcv.red_halfedge_handle())); + std::make_optional(Cell_handle_red(xcv.red_halfedge_handle()->target())) : + std::make_optional(Cell_handle_red(xcv.red_halfedge_handle())); if ((xcv.color() == BLUE) || (xcv.color() == RB_OVERLAP)) blue_cell = (! xcv.blue_halfedge_handle()->target()->is_at_open_boundary() && m_base_equal(base_p, xcv.blue_halfedge_handle()->target()->point())) ? - boost::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle()->target())) : - boost::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle())); + std::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle()->target())) : + std::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle())); return Point_2(base_p, red_cell, blue_cell); } @@ -631,15 +631,15 @@ class Arr_overlay_traits_2 { red_cell = (! xcv.red_halfedge_handle()->source()->is_at_open_boundary() && m_base_equal(base_p, xcv.red_halfedge_handle()->source()->point())) ? - boost::make_optional(Cell_handle_red(xcv.red_halfedge_handle()->source())) : - boost::make_optional(Cell_handle_red(xcv.red_halfedge_handle())); + std::make_optional(Cell_handle_red(xcv.red_halfedge_handle()->source())) : + std::make_optional(Cell_handle_red(xcv.red_halfedge_handle())); if ((xcv.color() == BLUE) || (xcv.color() == RB_OVERLAP)) blue_cell = (! xcv.blue_halfedge_handle()->source()->is_at_open_boundary() && m_base_equal(base_p, xcv.blue_halfedge_handle()->source()->point())) ? - boost::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle()->source())) : - boost::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle())); + std::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle()->source())) : + std::make_optional(Cell_handle_blue(xcv.blue_halfedge_handle())); return (Point_2(base_p, red_cell, blue_cell)); } diff --git a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h index b6b7be876f6f..952bf00e183e 100644 --- a/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h +++ b/Arrangement_on_surface_2/include/CGAL/Surface_sweep_2/Arr_vert_decomp_ss_visitor.h @@ -69,7 +69,7 @@ class Arr_vert_decomp_ss_visitor : typedef boost::variant Cell_type; - typedef boost::optional Vert_type; + typedef std::optional Vert_type; typedef std::pair Vert_pair; typedef std::pair Vert_entry; diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h index 6ffb18e01f37..881c939b5ffb 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/Vertical_decomposition_test.h @@ -46,7 +46,7 @@ class Vertical_decomposition_test : public IO_test { typedef boost::variant Cell_type; - typedef boost::optional Vert_type; + typedef std::optional Vert_type; typedef typename std::pair Vert_pair; typedef typename std::pair Vert_decomp_entry; diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index 21644ebf18f4..5ce55025c763 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -60,7 +60,7 @@ bool is_border(typename boost::graph_traits::edge_descriptor ed, cons returns a halfedge which is on a border and whose target vertex is `vd`, if such a halfedge exists. */ template -boost::optional::halfedge_descriptor> +std::optional::halfedge_descriptor> is_border(typename boost::graph_traits::vertex_descriptor vd, const FaceGraph& g) { @@ -72,7 +72,7 @@ is_border(typename boost::graph_traits::vertex_descriptor vd, } } // empty - return boost::optional::halfedge_descriptor>(); + return std::optional::halfedge_descriptor>(); } namespace BGL { diff --git a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h index 7f9ea3dfcbbf..da4b706b9bbb 100644 --- a/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h +++ b/Barycentric_coordinates_2/doc/Barycentric_coordinates_2/Concepts/BarycentricCoordinates_2.h @@ -44,7 +44,7 @@ class BarycentricCoordinates_2 { Weights are computed with respect to a query point of the type `Traits::Point_2` and stored in the output iterator `output`. The function returns a pointer to the last stored element. */ - boost::optional + std::optional weights( const Traits::Point_2& query_point, OutputIterator& output) { @@ -57,7 +57,7 @@ class BarycentricCoordinates_2 { are computed with respect to a query point of the type `Traits::Point_2` and stored in the output iterator `output`. The function returns a pointer to the last stored element. */ - boost::optional + std::optional coordinates_on_bounded_side( const Traits::Point_2& query_point, OutputIterator& output, @@ -72,7 +72,7 @@ class BarycentricCoordinates_2 { are computed with respect to a query point of the type `Traits::Point_2` and stored in the output iterator `output`. The function returns a pointer to the last stored element. */ - boost::optional + std::optional coordinates_on_unbounded_side( const Traits::Point_2& query_point, OutputIterator& output, diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h index 91d96c2f1c40..8ef72b0bce5b 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Discrete_harmonic_2.h @@ -24,7 +24,7 @@ #include // Boost headers. -#include +#include // CGAL namespace. namespace CGAL { @@ -98,7 +98,7 @@ Discrete_harmonic_2 // This function computes discrete harmonic weights (unnormalized coordinates) for a chosen query point. template - inline boost::optional weights(const Point_2 &query_point, OutputIterator &output) + inline std::optional weights(const Point_2 &query_point, OutputIterator &output) { return weights_2(query_point, output); } @@ -108,7 +108,7 @@ Discrete_harmonic_2 // This function computes discrete harmonic barycentric coordinates for a chosen query point on the bounded side of a strictly convex polygon. // \pre The provided polygon is strictly convex. template - inline boost::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { switch(type_of_algorithm) { @@ -124,14 +124,14 @@ Discrete_harmonic_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // This function computes discrete harmonic barycentric coordinates for a chosen query point on the unbounded side of a strictly convex polygon. // \pre The provided polygon is strictly convex. template - inline boost::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm, const bool warning_tag = true) + inline std::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm, const bool warning_tag = true) { switch(type_of_algorithm) { @@ -147,8 +147,8 @@ Discrete_harmonic_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // Information Functions @@ -184,7 +184,7 @@ Discrete_harmonic_2 // Compute discrete harmonic weights without normalization. template - boost::optional weights_2(const Point_2 &query_point, OutputIterator &output) + std::optional weights_2(const Point_2 &query_point, OutputIterator &output) { // Get the number of vertices in the polygon. const int n = int(number_of_vertices); @@ -220,7 +220,7 @@ Discrete_harmonic_2 ++output; // Return weights. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON BOUNDED SIDE. @@ -228,7 +228,7 @@ Discrete_harmonic_2 // Compute discrete harmonic coordinates on the bounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) { CGAL_precondition( type_of_polygon() == STRICTLY_CONVEX ); @@ -281,13 +281,13 @@ Discrete_harmonic_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // Compute discrete harmonic coordinates on the bounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) { CGAL_precondition( type_of_polygon() == STRICTLY_CONVEX ); @@ -338,7 +338,7 @@ Discrete_harmonic_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON UNBOUNDED SIDE. @@ -346,7 +346,7 @@ Discrete_harmonic_2 // Compute discrete harmonic coordinates on the unbounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) + std::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) { if(warning_tag) std::cout << std::endl << "ATTENTION: Discrete harmonic coordinates might be not well-defined outside the polygon!" << std::endl; @@ -358,7 +358,7 @@ Discrete_harmonic_2 // Compute discrete harmonic coordinates on the unbounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) + std::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) { if(warning_tag) std::cout << std::endl << "ATTENTION: Discrete harmonic coordinates might be not well-defined outside the polygon!" << std::endl; diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h index 381291b3a33e..94db271c736c 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Generalized_barycentric_coordinates_2.h @@ -24,7 +24,7 @@ #include // Boost headers. -#include +#include // CGAL namespace. namespace CGAL { @@ -118,7 +118,7 @@ Generalized_barycentric_coordinates_2 /// `CGAL::Barycentric_coordinates::PRECISE` - default slow algorithm, which is as precise as possible and /// `CGAL::Barycentric_coordinates::FAST` - fast algorithm, which is less precise but much faster. template - inline boost::optional operator()(const Point_2 &query_point, OutputIterator output, Query_point_location query_point_location = UNSPECIFIED_LOCATION, Type_of_algorithm type_of_algorithm = PRECISE) + inline std::optional operator()(const Point_2 &query_point, OutputIterator output, Query_point_location query_point_location = UNSPECIFIED_LOCATION, Type_of_algorithm type_of_algorithm = PRECISE) { return coordinates_2(query_point, output, query_point_location, type_of_algorithm); } @@ -129,7 +129,7 @@ Generalized_barycentric_coordinates_2 /// \pre The provided query point belongs to the polygon's boundary. /// \pre (0 <= index) && (index < number of the polygon's vertices). template - inline boost::optional compute_on_edge(const Point_2 &query_point, const int index, OutputIterator output) const + inline std::optional compute_on_edge(const Point_2 &query_point, const int index, OutputIterator output) const { return coordinates_on_boundary_2(query_point, index, output); } @@ -139,7 +139,7 @@ Generalized_barycentric_coordinates_2 /// /// \pre (0 <= index) && (index < number of the polygon's vertices). template - inline boost::optional compute_on_vertex(const int index, OutputIterator output) const + inline std::optional compute_on_vertex(const int index, OutputIterator output) const { return coordinates_on_vertex_2(index, output); } @@ -149,7 +149,7 @@ Generalized_barycentric_coordinates_2 /// /// \pre The provided query point belongs to the polygon's interior, excluding the boundary. template - inline boost::optional compute_weights(const Point_2 &query_point, OutputIterator output) + inline std::optional compute_weights(const Point_2 &query_point, OutputIterator output) { return weights_2(query_point, output); } @@ -183,7 +183,7 @@ Generalized_barycentric_coordinates_2 // This function accepts a container of the type `std::vector` // and returns an iterator of the type `std::back_insert_iterator` // that is placed past-the-end of the resulting sequence of coordinate values. - inline boost::optional > > operator()(const Point_2 &query_point, std::vector &output_vector, Query_point_location query_point_location = UNSPECIFIED_LOCATION, Type_of_algorithm type_of_algorithm = PRECISE) + inline std::optional > > operator()(const Point_2 &query_point, std::vector &output_vector, Query_point_location query_point_location = UNSPECIFIED_LOCATION, Type_of_algorithm type_of_algorithm = PRECISE) { output_vector.reserve(output_vector.size() + number_of_vertices); typedef typename std::back_insert_iterator > OutputIterator; @@ -198,7 +198,7 @@ Generalized_barycentric_coordinates_2 // // \pre The provided query point belongs to the polygon's boundary. // \pre (0 <= index) && (index < number of the polygon's vertices). - inline boost::optional > > compute_on_edge(const Point_2 &query_point, const int index, std::vector &output_vector) const + inline std::optional > > compute_on_edge(const Point_2 &query_point, const int index, std::vector &output_vector) const { output_vector.reserve(output_vector.size() + number_of_vertices); typedef typename std::back_insert_iterator > OutputIterator; @@ -212,7 +212,7 @@ Generalized_barycentric_coordinates_2 // that is placed past-the-end of the resulting sequence of coordinate values. // // \pre (0 <= index) && (index < number of the polygon's vertices). - inline boost::optional > > compute_on_vertex(const int index, std::vector &output_vector) const + inline std::optional > > compute_on_vertex(const int index, std::vector &output_vector) const { output_vector.reserve(output_vector.size() + number_of_vertices); typedef typename std::back_insert_iterator > OutputIterator; @@ -226,7 +226,7 @@ Generalized_barycentric_coordinates_2 // that is placed past-the-end of the resulting sequence of weight values. // // \pre The provided query point belongs to the polygon's interior, excluding the boundary. - inline boost::optional > > compute_weights(const Point_2 &query_point, std::vector &output_vector) + inline std::optional > > compute_weights(const Point_2 &query_point, std::vector &output_vector) { output_vector.reserve(output_vector.size() + number_of_vertices); typedef typename std::back_insert_iterator > OutputIterator; @@ -283,7 +283,7 @@ Generalized_barycentric_coordinates_2 // Compute weights on the bounded side of the polygon - see precondition. template - inline boost::optional weights_2(const Point_2 &query_point, OutputIterator &output) + inline std::optional weights_2(const Point_2 &query_point, OutputIterator &output) { // This is the only global precondition on the computation of weights. CGAL_precondition( CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits) == CGAL::ON_BOUNDED_SIDE ); @@ -295,7 +295,7 @@ Generalized_barycentric_coordinates_2 // Compute coordinates at any point in the plane. template - boost::optional coordinates_2(const Point_2 &query_point, OutputIterator &output, const Query_point_location query_point_location, const Type_of_algorithm type_of_algorithm) + std::optional coordinates_2(const Point_2 &query_point, OutputIterator &output, const Query_point_location query_point_location, const Type_of_algorithm type_of_algorithm) { // Determine a location of the current query point provided by the user. switch(query_point_location) @@ -324,13 +324,13 @@ Generalized_barycentric_coordinates_2 // Pointer cannot be here. Something went wrong. const bool query_point_location_failure = true; CGAL_postcondition( !query_point_location_failure ); - if(!query_point_location_failure) return boost::optional(output); - else return boost::optional(); + if(!query_point_location_failure) return std::optional(output); + else return std::optional(); } // Compute coordinates at any point in the plane with unspecified location. template - boost::optional coordinates_unspecified_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + std::optional coordinates_unspecified_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { // Determine a global location of the current query point. switch(CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits)) @@ -355,15 +355,15 @@ Generalized_barycentric_coordinates_2 // Pointer cannot be here. Something went wrong. const bool query_point_location_failure = true; CGAL_postcondition( !query_point_location_failure ); - if(!query_point_location_failure) return boost::optional(output); - else return boost::optional(); + if(!query_point_location_failure) return std::optional(output); + else return std::optional(); } // COORDINATES ON BOUNDED SIDE. // Compute coordinates on the bounded side of the polygon - precise or fast. template - inline boost::optional coordinates_on_bounded_side_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_bounded_side_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { CGAL_precondition( CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits) == CGAL::ON_BOUNDED_SIDE ); @@ -374,7 +374,7 @@ Generalized_barycentric_coordinates_2 // Compute coordinates along the boundary of the polygon with beforehand known index of the edge to which the query point belongs. template - boost::optional coordinates_on_boundary_2(const Point_2 &query_point, const int index, OutputIterator &output) const + std::optional coordinates_on_boundary_2(const Point_2 &query_point, const int index, OutputIterator &output) const { CGAL_precondition( CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits) == CGAL::ON_BOUNDARY ); CGAL_precondition( (0 <= index) && (index < int(number_of_vertices)) ); @@ -393,7 +393,7 @@ Generalized_barycentric_coordinates_2 // Compute segment coordinates along the chosen edge with the index = `index`. Segment_coordinates_2 segment_coordinates(vertex[index], vertex[index+1]); - boost::optional success = segment_coordinates(query_point, output); + std::optional success = segment_coordinates(query_point, output); ++output; for(int i = index + 1; i < last; ++i) { @@ -402,20 +402,20 @@ Generalized_barycentric_coordinates_2 } // Return coordinates. - if(success) return boost::optional(output); - else return boost::optional(); + if(success) return std::optional(output); + else return std::optional(); } // Pointer cannot be here. Something went wrong. const bool coordinates_on_boundary_failure = true; CGAL_postcondition( !coordinates_on_boundary_failure ); - if(!coordinates_on_boundary_failure) return boost::optional(output); - else return boost::optional(); + if(!coordinates_on_boundary_failure) return std::optional(output); + else return std::optional(); } // Compute coordinates along the boundary of the polygon without beforehand known index of the edge to which the query point belongs. template - boost::optional coordinates_on_boundary_2(const Point_2 &query_point, OutputIterator &output) const + std::optional coordinates_on_boundary_2(const Point_2 &query_point, OutputIterator &output) const { CGAL_precondition( CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits) == CGAL::ON_BOUNDARY ); @@ -435,7 +435,7 @@ Generalized_barycentric_coordinates_2 // Compute segment coordinates along the edge with the query point. Segment_coordinates_2 segment_coordinates(vertex[index], vertex[index+1]); - boost::optional success = segment_coordinates(query_point, output); + std::optional success = segment_coordinates(query_point, output); if(success) status = true; ++output; break; @@ -452,20 +452,20 @@ Generalized_barycentric_coordinates_2 } // Return coordinates. - if(status == true) return boost::optional(output); - else return boost::optional(); + if(status == true) return std::optional(output); + else return std::optional(); } // Pointer cannot be here. Something went wrong. const bool coordinates_on_boundary_failure = true; CGAL_postcondition( !coordinates_on_boundary_failure ); - if(!coordinates_on_boundary_failure) return boost::optional(output); - else return boost::optional(); + if(!coordinates_on_boundary_failure) return std::optional(output); + else return std::optional(); } // Compute coordinates for a query point lying on the last edge of the polygon. template - boost::optional coordinates_on_last_edge_2(const Point_2 &query_point, const int last, OutputIterator &output) const + std::optional coordinates_on_last_edge_2(const Point_2 &query_point, const int last, OutputIterator &output) const { // Some convenient typedefs. typedef std::vector Coordinate_vector; @@ -478,7 +478,7 @@ Generalized_barycentric_coordinates_2 // Compute segment coordinates along the last edge of the polygon. Segment_coordinates_2 segment_coordinates(vertex[last], vertex[0]); - boost::optional success = segment_coordinates(query_point, std::back_inserter(coordinate)); + std::optional success = segment_coordinates(query_point, std::back_inserter(coordinate)); // Store all the coordinate values. // All the values are zeros apart from those corresponding to the first and the last vertices of the polygon. @@ -492,15 +492,15 @@ Generalized_barycentric_coordinates_2 ++output; // Return computed coordinates. - if(success) return boost::optional(output); - else return boost::optional(); + if(success) return std::optional(output); + else return std::optional(); } // COORDINATES AT VERTEX. // Compute coordinates for a query point lying at one of the polygon's vertices with beforehand known vertex's index. template - boost::optional coordinates_on_vertex_2(const int index, OutputIterator &output) const + std::optional coordinates_on_vertex_2(const int index, OutputIterator &output) const { CGAL_precondition( (0 <= index) && (index < int(number_of_vertices)) ); @@ -519,12 +519,12 @@ Generalized_barycentric_coordinates_2 } // Return coordinates. - return boost::optional(output); + return std::optional(output); } // Compute coordinates for a query point lying at one of the polygon's vertices without beforehand known vertex's index. template - boost::optional coordinates_on_vertex_2(const Point_2 &query_point, OutputIterator &output) const + std::optional coordinates_on_vertex_2(const Point_2 &query_point, OutputIterator &output) const { int index = -1; CGAL_precondition( is_query_point_at_vertex(query_point, index) ); @@ -554,15 +554,15 @@ Generalized_barycentric_coordinates_2 // Return coordinates. CGAL_postcondition( !coordinates_on_vertex_failure ); - if(!coordinates_on_vertex_failure) return boost::optional(output); - else return boost::optional(); + if(!coordinates_on_vertex_failure) return std::optional(output); + else return std::optional(); } // COORDINATES ON UNBOUNDED SIDE. // Compute coordinates on the unbounded side of the polygon - precise or fast. template - inline boost::optional coordinates_on_unbounded_side_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_unbounded_side_2(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { CGAL_precondition( CGAL::bounded_side_2(vertex.begin(), vertex.end(), query_point, barycentric_traits) == CGAL::ON_UNBOUNDED_SIDE ); diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h index ef895698b0ae..2dca8b2b8fb3 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Mean_value_2.h @@ -26,7 +26,7 @@ // Boost headers. #include -#include +#include // Barycentric coordinates headers. #include @@ -154,7 +154,7 @@ Mean_value_2 // This function computes mean value weights (unnormalized coordinates) for a chosen query point. template - inline boost::optional weights(const Point_2 &query_point, OutputIterator &output) + inline std::optional weights(const Point_2 &query_point, OutputIterator &output) { return weights_2(query_point, output); } @@ -163,7 +163,7 @@ Mean_value_2 // This function computes mean value barycentric coordinates for a chosen query point on the bounded side of a simple polygon. template - inline boost::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { switch(type_of_algorithm) { @@ -179,13 +179,13 @@ Mean_value_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // This function computes mean value barycentric coordinates for a chosen query point on the unbounded side of a simple polygon. template - inline boost::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { switch(type_of_algorithm) { @@ -201,8 +201,8 @@ Mean_value_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // Information Functions @@ -243,7 +243,7 @@ Mean_value_2 // Compute mean value weights without normalization. template - boost::optional weights_2(const Point_2 &query_point, OutputIterator &output) + std::optional weights_2(const Point_2 &query_point, OutputIterator &output) { // Get the number of vertices in the polygon. const int n = int(number_of_vertices); @@ -293,7 +293,7 @@ Mean_value_2 ++output; // Return weights. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON BOUNDED SIDE. @@ -301,7 +301,7 @@ Mean_value_2 // Compute mean value coordinates on the bounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) { // Get the number of vertices in the polygon. const int n = int(number_of_vertices); @@ -368,13 +368,13 @@ Mean_value_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // Compute mean value coordinates on the bounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) { // Get the number of vertices in the polygon. const int n = int(number_of_vertices); @@ -437,7 +437,7 @@ Mean_value_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON UNBOUNDED SIDE. @@ -445,7 +445,7 @@ Mean_value_2 // Compute mean value coordinates on the unbounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) { // Use the same formulas as for the bounded side since they are also valid on the unbounded side. return coordinates_on_bounded_side_precise_2(query_point, output); @@ -454,7 +454,7 @@ Mean_value_2 // Compute mean value coordinates on the unbounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) { // Use the same formulas as for the bounded side since they are also valid on the unbounded side. return coordinates_on_bounded_side_fast_2(query_point, output); diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h index 469b84a09a30..d43f879bdf52 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/Wachspress_2.h @@ -24,7 +24,7 @@ #include // Boost headers. -#include +#include // CGAL namespace. namespace CGAL { @@ -96,7 +96,7 @@ Wachspress_2 // This function computes Wachspress weights (unnormalized coordinates) for a chosen query point. template - inline boost::optional weights(const Point_2 &query_point, OutputIterator &output) + inline std::optional weights(const Point_2 &query_point, OutputIterator &output) { return weights_2(query_point, output); } @@ -106,7 +106,7 @@ Wachspress_2 // This function computes Wachspress barycentric coordinates for a chosen query point on the bounded side of a strictly convex polygon. // \pre The provided polygon is strictly convex. template - inline boost::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) + inline std::optional coordinates_on_bounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm) { switch(type_of_algorithm) { @@ -122,14 +122,14 @@ Wachspress_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // This function computes Wachspress barycentric coordinates for a chosen query point on the unbounded side of a strictly convex polygon. // \pre The provided polygon is strictly convex. template - inline boost::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm, const bool warning_tag = true) + inline std::optional coordinates_on_unbounded_side(const Point_2 &query_point, OutputIterator &output, const Type_of_algorithm type_of_algorithm, const bool warning_tag = true) { switch(type_of_algorithm) { @@ -145,8 +145,8 @@ Wachspress_2 // Pointer cannot be here. Something went wrong. const bool type_of_algorithm_failure = true; CGAL_postcondition( !type_of_algorithm_failure ); - if(!type_of_algorithm_failure) return boost::optional(output); - else return boost::optional(); + if(!type_of_algorithm_failure) return std::optional(output); + else return std::optional(); } // Information Functions @@ -181,7 +181,7 @@ Wachspress_2 // Compute Wachspress weights without normalization. template - boost::optional weights_2(const Point_2 &query_point, OutputIterator &output) + std::optional weights_2(const Point_2 &query_point, OutputIterator &output) { // Get the number of vertices in the polygon. const int n = int(number_of_vertices); @@ -214,7 +214,7 @@ Wachspress_2 ++output; // Return weights. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON BOUNDED SIDE. @@ -222,7 +222,7 @@ Wachspress_2 // Compute Wachspress coordinates on the bounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_precise_2(const Point_2 &query_point, OutputIterator &output) { CGAL_precondition( type_of_polygon() == STRICTLY_CONVEX ); @@ -265,13 +265,13 @@ Wachspress_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // Compute Wachspress coordinates on the bounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) + std::optional coordinates_on_bounded_side_fast_2(const Point_2 &query_point, OutputIterator &output) { CGAL_precondition( type_of_polygon() == STRICTLY_CONVEX ); @@ -319,7 +319,7 @@ Wachspress_2 ++output; // Return coordinates. - return boost::optional(output); + return std::optional(output); } // COORDINATES ON UNBOUNDED SIDE. @@ -327,7 +327,7 @@ Wachspress_2 // Compute Wachspress coordinates on the unbounded side of the polygon with the slow O(n^2) but precise algorithm. // Here, n - is the number of the polygon's vertices. template - boost::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) + std::optional coordinates_on_unbounded_side_precise_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) { if(warning_tag) std::cout << std::endl << "ATTENTION: Wachspress coordinates might be not well-defined outside the polygon!" << std::endl; @@ -339,7 +339,7 @@ Wachspress_2 // Compute Wachspress coordinates on the unbounded side of the polygon with the fast O(n) but less precise algorithm. // Here, n - is the number of the polygon's vertices. Precision is lost near the boundary (~ 1.0e-10 and closer). template - boost::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) + std::optional coordinates_on_unbounded_side_fast_2(const Point_2 &query_point, OutputIterator &output, bool warning_tag) { if(warning_tag) std::cout << std::endl << "ATTENTION: Wachspress coordinates might be not well-defined outside the polygon!" << std::endl; diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/internal/utils_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/internal/utils_2.h index 7faa4f49eb2c..0cc79e16bc08 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/internal/utils_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/internal/utils_2.h @@ -31,7 +31,7 @@ // Boost headers. #include -#include +#include // Internal includes. #include @@ -222,7 +222,7 @@ namespace internal { typename VertexRange, typename GeomTraits, typename PointMap> - boost::optional< std::pair > + std::optional< std::pair > get_edge_index_approximate( const VertexRange& polygon, const typename GeomTraits::Point_2& query, @@ -264,7 +264,7 @@ namespace internal { return std::make_pair(Query_point_location::ON_EDGE, i); } } - return boost::none; + return std::nullopt; } // Why this one does not work for harmonic coordinates? - Due to the imprecisions in the Mesh_2 class. @@ -273,7 +273,7 @@ namespace internal { typename VertexRange, typename GeomTraits, typename PointMap> - boost::optional< std::pair > + std::optional< std::pair > get_edge_index_exact( const VertexRange& polygon, const typename GeomTraits::Point_2& query, @@ -303,7 +303,7 @@ namespace internal { return std::make_pair(Query_point_location::ON_EDGE, i); } } - return boost::none; + return std::nullopt; } // Check whether a query point belongs to the last polygon edge. @@ -409,7 +409,7 @@ namespace internal { typename VertexRange, typename GeomTraits, typename PointMap> - boost::optional< std::pair > + std::optional< std::pair > locate_wrt_polygon_2( const VertexRange& polygon, const typename GeomTraits::Point_2& query, @@ -430,7 +430,7 @@ namespace internal { default: return std::make_pair(Query_point_location::UNSPECIFIED, std::size_t(-1)); } - return boost::none; + return std::nullopt; } } // namespace internal diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/segment_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/segment_coordinates_2.h index b2b3120e0baf..99f9c6fb76fb 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/segment_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/segment_coordinates_2.h @@ -245,7 +245,7 @@ namespace Barycentric_coordinates { /// Computes segment barycentric coordinates for a chosen query point with respect to both vertices of the segment. /// Computed coordinates are stored in the output iterator `output`. template - inline boost::optional operator()( + inline std::optional operator()( const Point_2 &query_point, OutputIterator output) { return segment_coordinates_2(query_point, output); @@ -280,7 +280,7 @@ namespace Barycentric_coordinates { // This function accepts a container of the type `std::vector` // and returns an iterator of the type `std::back_insert_iterator` // that is placed past-the-end of the resulting sequence of coordinate values. - inline boost::optional > > operator()( + inline std::optional > > operator()( const Point_2 &query_point, std::vector &output_vector) { output_vector.reserve(output_vector.size() + 2); @@ -327,7 +327,7 @@ namespace Barycentric_coordinates { // Compute segment coordinates. template - boost::optional segment_coordinates_2( + std::optional segment_coordinates_2( const Point_2 &query_point, OutputIterator &output) { // Project point on the segment and compute the first coordinate. @@ -341,7 +341,7 @@ namespace Barycentric_coordinates { ++output; // Output both coordinates. - return boost::optional(output); + return std::optional(output); } }; diff --git a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h index 33dd658db9a3..bc681d3bf381 100644 --- a/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h +++ b/Barycentric_coordinates_2/include/CGAL/Barycentric_coordinates_2/triangle_coordinates_2.h @@ -257,7 +257,7 @@ namespace Barycentric_coordinates { /// Computes triangle barycentric coordinates for a chosen query point with respect to all three vertices of the triangle. /// Computed coordinates are stored in the output iterator `output`. template - inline boost::optional operator()( + inline std::optional operator()( const Point_2 &query_point, OutputIterator output) { return triangle_coordinates_2(query_point, output); @@ -298,7 +298,7 @@ namespace Barycentric_coordinates { // This function accepts a container of the type `std::vector` // and returns an iterator of the type `std::back_insert_iterator` // that is placed past-the-end of the resulting sequence of coordinate values. - inline boost::optional > > operator()( + inline std::optional > > operator()( const Point_2 &query_point, std::vector &output_vector) { output_vector.reserve(output_vector.size() + 3); @@ -347,7 +347,7 @@ namespace Barycentric_coordinates { // Compute triangle coordinates. template - boost::optional triangle_coordinates_2( + std::optional triangle_coordinates_2( const Point_2 &query_point, OutputIterator &output) { // Compute some related sub-areas. @@ -372,7 +372,7 @@ namespace Barycentric_coordinates { ++output; // Output all coordinates. - return boost::optional(output); + return std::optional(output); } }; diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp index c19f597f43f5..b34ca8c29098 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_dh_deprecated_api.cpp @@ -19,7 +19,7 @@ typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_c typedef CGAL::Barycentric_coordinates::Discrete_harmonic_2 Discrete_harmonic; typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Discrete_harmonic_coordinates; -typedef boost::optional Output_type; +typedef std::optional Output_type; using std::cout; using std::endl; using std::string; diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp index 25436a0bd6e2..c4bac5497a4e 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_mv_deprecated_api.cpp @@ -19,7 +19,7 @@ typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_c typedef CGAL::Barycentric_coordinates::Mean_value_2 Mean_value; typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Mean_value_coordinates; -typedef boost::optional Output_type; +typedef std::optional Output_type; using std::cout; using std::endl; using std::string; diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp index d0b363c7a7e7..9b39a907f43b 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_sc_deprecated_api.cpp @@ -12,7 +12,7 @@ typedef std::back_insert_iterator Vector_insert_iterator; typedef CGAL::Barycentric_coordinates::Segment_coordinates_2 Segment_coordinates; -typedef boost::optional Output_type; +typedef std::optional Output_type; using std::cout; using std::endl; using std::string; diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp index e37784a8adbd..bd83f52a5bd9 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_tc_deprecated_api.cpp @@ -12,7 +12,7 @@ typedef std::back_insert_iterator Vector_insert_iterator; typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_coordinates; -typedef boost::optional Output_type; +typedef std::optional Output_type; using std::cout; using std::endl; using std::string; diff --git a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp index a44bdb5391df..ae349dffb76c 100644 --- a/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp +++ b/Barycentric_coordinates_2/test/Barycentric_coordinates_2/test_wp_deprecated_api.cpp @@ -19,7 +19,7 @@ typedef CGAL::Barycentric_coordinates::Triangle_coordinates_2 Triangle_c typedef CGAL::Barycentric_coordinates::Wachspress_2 Wachspress; typedef CGAL::Barycentric_coordinates::Generalized_barycentric_coordinates_2 Wachspress_coordinates; -typedef boost::optional Output_type; +typedef std::optional Output_type; using std::cout; using std::endl; using std::string; diff --git a/Cartesian_kernel/include/CGAL/Cartesian_converter.h b/Cartesian_kernel/include/CGAL/Cartesian_converter.h index 916697a972d4..c2e9806c2bb7 100644 --- a/Cartesian_kernel/include/CGAL/Cartesian_converter.h +++ b/Cartesian_kernel/include/CGAL/Cartesian_converter.h @@ -140,11 +140,11 @@ class Cartesian_converter : public Enum_converter // visit to get the type, and copy construct inside the return type template typename - Type_mapper< boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, + Type_mapper< std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, K1, K2 >::type - operator()(const boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { typedef typename - Type_mapper< boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, + Type_mapper< std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >, K1, K2 >::type result_type; result_type res; if(!o) { diff --git a/Circulator/include/CGAL/Circulator/Safe_circulator_from_iterator.h b/Circulator/include/CGAL/Circulator/Safe_circulator_from_iterator.h index 17b05f8cffbf..f1642bce862b 100644 --- a/Circulator/include/CGAL/Circulator/Safe_circulator_from_iterator.h +++ b/Circulator/include/CGAL/Circulator/Safe_circulator_from_iterator.h @@ -22,7 +22,7 @@ #include -#include +#include #include @@ -53,9 +53,9 @@ class Safe_circulator_from_iterator { private: - boost::optional m_begin; - boost::optional m_end; - boost::optional m_current; + std::optional m_begin; + std::optional m_end; + std::optional m_current; bool m_empty; public: diff --git a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h index 2c1bb1949516..9ba9d483d825 100644 --- a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h @@ -26,6 +26,6 @@ Halfspaces are considered as lower halfspaces, that is if the plane equation is template void halfspace_intersection_3 (PlaneIterator begin, PlaneIterator end, PolygonMesh &pm, - boost::optional::value_type>::Kernel::Point_3> > origin = boost::none); + std::optional::value_type>::Kernel::Point_3> > origin = std::nullopt); } /* namespace CGAL */ diff --git a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h index a234d1905caa..76cd8dff9f3e 100644 --- a/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h +++ b/Convex_hull_3/doc/Convex_hull_3/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h @@ -25,7 +25,7 @@ template void halfspace_intersection_with_constructions_3(PlaneIterator pbegin, PlaneIterator pend, PolygonMesh &pm, - boost::optional::value_type>::Kernel::Point_3> > origin = boost::none, + std::optional::value_type>::Kernel::Point_3> > origin = std::nullopt, const Traits & ch_traits = Default_traits); } /* namespace CGAL */ diff --git a/Convex_hull_3/examples/Convex_hull_3/lloyd_algorithm.cpp b/Convex_hull_3/examples/Convex_hull_3/lloyd_algorithm.cpp index 4976b5e4a045..75d8847375d4 100644 --- a/Convex_hull_3/examples/Convex_hull_3/lloyd_algorithm.cpp +++ b/Convex_hull_3/examples/Convex_hull_3/lloyd_algorithm.cpp @@ -170,7 +170,7 @@ void lloyd_algorithm (PolyIterator poly_begin, CGAL::halfspace_intersection_3(planes.begin(), planes.end(), P, - boost::make_optional(vit->point())); + std::make_optional(vit->point())); // Centroid apply_function_object_polyhedron(P, centroid_acc); diff --git a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h index 16a685e08ddf..7a1921c698d9 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_3.h @@ -67,7 +67,7 @@ namespace CGAL // Typedefs for intersection typedef typename Kernel::Plane_3 Plane_3; typedef typename Kernel::Line_3 Line_3; - typedef boost::optional< boost::variant< Point_3, + typedef std::optional< boost::variant< Point_3, Line_3, Plane_3 > > result_inter; @@ -228,7 +228,7 @@ namespace CGAL template void halfspace_intersection_3 (PlaneIterator begin, PlaneIterator end, Polyhedron &P, - boost::optional::value_type>::Kernel::Point_3> origin = boost::none) { + std::optional::value_type>::Kernel::Point_3> origin = std::nullopt) { // Checks whether the intersection is a polyhedron CGAL_assertion_msg(Convex_hull_3::internal::is_intersection_dim_3(begin, end), "halfspace_intersection_3: intersection not a polyhedron"); @@ -242,8 +242,8 @@ namespace CGAL // find a point inside the intersection origin = halfspace_intersection_interior_point_3(begin, end); - CGAL_assertion_msg(origin!=boost::none, "halfspace_intersection_3: problem when determining a point inside the intersection"); - if (origin==boost::none) + CGAL_assertion_msg(origin!=std::nullopt, "halfspace_intersection_3: problem when determining a point inside the intersection"); + if (origin==std::nullopt) return; } @@ -273,7 +273,7 @@ namespace CGAL void halfspace_intersection_3 (PlaneIterator begin, PlaneIterator end, Polyhedron &P, typename Kernel_traits::value_type>::Kernel::Point_3 const& origin) { - halfspace_intersection_3(begin, end , P, boost::make_optional(origin)); + halfspace_intersection_3(begin, end , P, std::make_optional(origin)); } #endif } // namespace CGAL diff --git a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_interior_point_3.h b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_interior_point_3.h index afdab1fdee08..db5b53247ab4 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_interior_point_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_interior_point_3.h @@ -165,7 +165,7 @@ class Interior_polyhedron_3 { \ingroup PkgConvexHull3Functions computes a point belonging to the intersection of the halfspaces defined by the planes contained in the range `[begin, end)`. -If the intersection is empty, `boost::none` is returned. +If the intersection is empty, `std::nullopt` is returned. \attention Halfspaces are considered as lower halfspaces that is to say if the plane's equation is \f$ a\, x +b\, y +c\, z + d = 0 \f$ then the corresponding halfspace is defined by \f$ a\, x +b\, y +c\, z + d \le 0 \f$ . @@ -173,7 +173,7 @@ is \f$ a\, x +b\, y +c\, z + d = 0 \f$ then the corresponding halfspace is defin \tparam PlaneIterator must be an input iterator with the value type being a `Plane_3` object from \cgal Kernel */ template -boost::optional::value_type>::Kernel::Point_3> +std::optional::value_type>::Kernel::Point_3> halfspace_intersection_interior_point_3(PlaneIterator begin, PlaneIterator end) { // Types @@ -185,9 +185,9 @@ halfspace_intersection_interior_point_3(PlaneIterator begin, PlaneIterator end) // find a point inside the intersection internal::Interior_polyhedron_3 interior; if (!interior.find(begin, end)) - return boost::none; + return std::nullopt; - return boost::make_optional(interior.inside_point()); + return std::make_optional(interior.inside_point()); } } // namespace CGAL diff --git a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h index 4a0b9c26d449..d8946af7353c 100644 --- a/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h +++ b/Convex_hull_3/include/CGAL/Convex_hull_3/dual/halfspace_intersection_with_constructions_3.h @@ -90,7 +90,7 @@ namespace CGAL void halfspace_intersection_with_constructions_3(PlaneIterator pbegin, PlaneIterator pend, Polyhedron &P, - boost::optional::value_type>::Kernel::Point_3> origin, + std::optional::value_type>::Kernel::Point_3> origin, const Traits & ch_traits) { typedef typename Kernel_traits::value_type>::Kernel K; typedef typename K::Point_3 Point; @@ -101,8 +101,8 @@ namespace CGAL // find a point inside the intersection origin = halfspace_intersection_interior_point_3(pbegin, pend); - CGAL_assertion_msg(origin!=boost::none, "halfspace_intersection_with_constructions_3: problem when determining a point inside the intersection"); - if (origin==boost::none) + CGAL_assertion_msg(origin!=std::nullopt, "halfspace_intersection_with_constructions_3: problem when determining a point inside the intersection"); + if (origin==std::nullopt) return; } @@ -134,7 +134,7 @@ namespace CGAL void halfspace_intersection_with_constructions_3 (PlaneIterator pbegin, PlaneIterator pend, Polyhedron &P, - boost::optional::value_type>::Kernel::Point_3> const& origin = boost::none) { + std::optional::value_type>::Kernel::Point_3> const& origin = std::nullopt) { typedef typename Kernel_traits::value_type>::Kernel K; typedef typename K::Point_3 Point_3; typedef typename Convex_hull_3::internal::Default_traits_for_Chull_3::type Traits; diff --git a/Convex_hull_3/test/Convex_hull_3/test_halfspace_intersections.cpp b/Convex_hull_3/test/Convex_hull_3/test_halfspace_intersections.cpp index a0eef18da7f8..686a2b8c7176 100644 --- a/Convex_hull_3/test/Convex_hull_3/test_halfspace_intersections.cpp +++ b/Convex_hull_3/test/Convex_hull_3/test_halfspace_intersections.cpp @@ -32,7 +32,7 @@ void test() CGAL::halfspace_intersection_3(planes.begin(), planes.end(), P1, - boost::make_optional(Point(0, 0, 0)) ); + std::make_optional(Point(0, 0, 0)) ); // test halfspace_intersection_3 with non point inside CGAL::halfspace_intersection_3(planes.begin(), @@ -43,7 +43,7 @@ void test() CGAL::halfspace_intersection_with_constructions_3( planes.begin(), planes.end(), P3, - boost::make_optional(Point(0, 0, 0)) ); + std::make_optional(Point(0, 0, 0)) ); // test halfspace_intersection_with_constructions_3 with non point inside CGAL::halfspace_intersection_with_constructions_3( planes.begin(), @@ -54,7 +54,7 @@ void test() CGAL::halfspace_intersection_with_constructions_3( planes.begin(), planes.end(), P5, - boost::optional(), + std::optional(), K()); assert(num_vertices(P1)==8 && num_faces(P1)==6); diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h index fc2f04a27ecc..433a6a4949c0 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include diff --git a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h index 9503e338311b..af0f793f4eda 100644 --- a/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h +++ b/Envelope_2/include/CGAL/Envelope_2/Env_divide_and_conquer_2_impl.h @@ -19,7 +19,7 @@ * Definitions of the functions of the Envelope_divide_and_conquer_2 class. */ -#include +#include namespace CGAL { @@ -610,8 +610,8 @@ _merge_two_intervals(Edge_const_handle e1, bool is_leftmost1, // The intersection points/curves that interest us are the ones in // [v_leftmost, v]. // Without using make_optional we get a "maybe uninitialized" warning with gcc -Wall - boost::optional v_leftmost = - boost::make_optional(false, Vertex_const_handle()); + std::optional v_leftmost = + std::make_optional(false, Vertex_const_handle()); if (is_leftmost1 == true) { if (is_leftmost2 == false) diff --git a/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h b/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h index c0b2e2179caf..991fe8247b56 100644 --- a/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h +++ b/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h @@ -18,7 +18,7 @@ #include #include #include -#include +#include namespace CGAL { @@ -31,7 +31,7 @@ class Filtered_predicate_with_state C2E c2e; C2A c2a; O1 o1; - mutable boost::optional oep; + mutable std::optional oep; AP ap; typedef typename AP::result_type Ares; diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index e7024f6220b8..c9ff97618c31 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -30,7 +30,7 @@ #include #include -#include +#include #include #ifdef CGAL_LAZY_KERNEL_DEBUG # include @@ -1196,7 +1196,7 @@ struct Lazy_construction_optional_for_polygonal_envelope typedef typename LK::Approximate_kernel AK; typedef typename LK::Exact_kernel EK; typedef typename LK::E2A E2A; - typedef boost::optional result_type; + typedef std::optional result_type; CGAL_NO_UNIQUE_ADDRESS AC ac; CGAL_NO_UNIQUE_ADDRESS EC ec; @@ -1209,9 +1209,9 @@ struct Lazy_construction_optional_for_polygonal_envelope { Protect_FPU_rounding P; try { - boost::optional oap = ac(CGAL::approx(l1),CGAL::approx(l2),CGAL::approx(l3)); - if(oap == boost::none){ - return boost::none; + std::optional oap = ac(CGAL::approx(l1),CGAL::approx(l2),CGAL::approx(l3)); + if(oap == std::nullopt){ + return std::nullopt; } // Now we have to construct a rep for a lazy point with the three lazy planes. typedef Lazy_rep_optional_n LazyPointRep; @@ -1221,21 +1221,21 @@ struct Lazy_construction_optional_for_polygonal_envelope // rep = LazyPointRep(2,ap, ec, l1, l2, l3); rep.~LazyPointRep(); new (&rep) LazyPointRep(2, ap, ec, l1, l2, l3); typename LK::Point_3 lp(&rep); - return boost::make_optional(lp); + return std::make_optional(lp); } catch (Uncertain_conversion_exception&) {} } Protect_FPU_rounding P2(CGAL_FE_TONEAREST); CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); - boost::optional oep = ec(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3)); - if(oep == boost::none){ - return boost::none; + std::optional oep = ec(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3)); + if(oep == std::nullopt){ + return std::nullopt; } typedef Lazy_rep_0 LazyPointRep; const typename EK::Point_3 ep = *oep; LazyPointRep *rep = new LazyPointRep(ep); typename LK::Point_3 lp(rep); - return boost::make_optional(lp); + return std::make_optional(lp); } // for Intersect_point_3 with Plane_3 Line_3 @@ -1246,9 +1246,9 @@ struct Lazy_construction_optional_for_polygonal_envelope { Protect_FPU_rounding P; try { - boost::optional oap = ac(CGAL::approx(l1),CGAL::approx(l2)); - if(oap == boost::none){ - return boost::none; + std::optional oap = ac(CGAL::approx(l1),CGAL::approx(l2)); + if(oap == std::nullopt){ + return std::nullopt; } // Now we have to construct a rep for a lazy point with the line and the plane. typedef Lazy_rep_optional_n LazyPointRep; @@ -1258,21 +1258,21 @@ struct Lazy_construction_optional_for_polygonal_envelope // rep = LazyPointRep(2, ap, ec, l1, l2); rep.~LazyPointRep(); new (&rep) LazyPointRep(2, ap, ec, l1, l2); typename LK::Point_3 lp(&rep); - return boost::make_optional(lp); + return std::make_optional(lp); } catch (Uncertain_conversion_exception&) {} } Protect_FPU_rounding P2(CGAL_FE_TONEAREST); CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); - boost::optional oep = ec(CGAL::exact(l1), CGAL::exact(l2)); - if(oep == boost::none){ - return boost::none; + std::optional oep = ec(CGAL::exact(l1), CGAL::exact(l2)); + if(oep == std::nullopt){ + return std::nullopt; } typedef Lazy_rep_0 LazyPointRep; const typename EK::Point_3 ep = *oep; LazyPointRep *rep = new LazyPointRep(ep); typename LK::Point_3 lp(rep); - return boost::make_optional(lp); + return std::make_optional(lp); } }; @@ -1427,7 +1427,7 @@ struct Ith_for_intersection_with_variant { template< BOOST_VARIANT_ENUM_PARAMS(typename U) > const T2& - operator()(const boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const + operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { const std::vector* ptr = (boost::get >(&(*o))); return (*ptr)[i]; @@ -1858,7 +1858,7 @@ struct Variant_cast { template const T& - operator()(const boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(const std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { // can throw but should never because we always build it inside // a static visitor with the right type return boost::get(*o); @@ -1866,7 +1866,7 @@ struct Variant_cast { template T& - operator()(boost::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { + operator()(std::optional< boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) > >& o) const { // can throw but should never because we always build it inside // a static visitor with the right type, if it throws bad_get return boost::get(*o); diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 08a6ebb41a0a..6979b6f7b0cf 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -178,7 +178,7 @@ class Lazy_kernel_generic_base : protected internal::Enum_holder // The case distinction goes as follows: // result_type == FT => NT // result_type == Object => Object - // result_type == boost::optional => OPTIONAL_ Only for Intersect_point_3_for_polyhedral_envelope which returns a handle for a singleton + // result_type == std::optional => OPTIONAL_ Only for Intersect_point_3_for_polyhedral_envelope which returns a handle for a singleton // result_type == Bbox_2 || result_type == Bbox_3 => BBOX // default => NONE // no result_type => NONE @@ -188,7 +188,7 @@ class Lazy_kernel_generic_base : protected internal::Enum_holder // specializations inside a non-namespace scope. // The default implementation does some default handling, // the special cases are filtered by partial specializations. - template + template struct Lazy_wrapper_traits : boost::mpl::eval_if< internal::Has_result_type, boost::mpl::eval_if< std::is_same< typename boost::remove_cv< diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index 486f43ea21f7..386d2a272020 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -11,6 +11,7 @@ Release date: October 2023 - **Breaking change**: C++17 is now required - Support for Visual `C++` 14.0 (Visual studio 2015) is dropped. - **Breaking change**: The usage of `boost::shared_ptr` has been replaced by `std::shared_ptr`. Packages affected are 2D Straight Line Skeleton and Shape Detection. +- **Breaking change**: The usage of `boost::optional` has been replaced by `std::optional`. Packages affected are 2D Straight Line Skeleton, 3D Fast Intersection and Distance Computation (AABB Tree), and the Kernel intersection. [Release 5.6](https://github.com/CGAL/cgal/releases/tag/v5.6) diff --git a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp index 11416d859b79..a7765e4b3c1d 100644 --- a/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp +++ b/Intersections_2/benchmark/Intersections_2/variant_any_object.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ struct Intersection_traits; template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; @@ -53,7 +53,7 @@ OutputIterator intersect_do_iterator(const typename K::Segment_2 &seg1, template -boost::optional< +std::optional< boost::variant > intersection_variant(const typename K::Segment_2 &seg1, @@ -63,7 +63,7 @@ intersection_variant(const typename K::Segment_2 &seg1, typedef CGAL::internal::Segment_2_Segment_2_pair is_t; typedef boost::variant Variant; - typedef boost::optional OptVariant; + typedef std::optional OptVariant; is_t ispair(&seg1, &seg2); switch (ispair.intersection_type()) { diff --git a/Intersections_2/include/CGAL/Intersection_traits.h b/Intersections_2/include/CGAL/Intersection_traits.h index 3bfb327db9e6..ca313a2c8524 100644 --- a/Intersections_2/include/CGAL/Intersection_traits.h +++ b/Intersections_2/include/CGAL/Intersection_traits.h @@ -27,7 +27,7 @@ struct Intersection_traits { \ typedef typename boost::variant \ variant_type; \ - typedef typename boost::optional< variant_type > result_type; \ + typedef typename std::optional< variant_type > result_type; \ }; #define CGAL_INTERSECTION_TRAITS_3(A, B, R1, R2, R3) \ @@ -35,7 +35,7 @@ struct Intersection_traits { \ typedef typename boost::variant variant_type; \ - typedef typename boost::optional< variant_type > result_type; \ + typedef typename std::optional< variant_type > result_type; \ }; #define CGAL_INTERSECTION_FUNCTION(A, B, DIM) \ @@ -120,7 +120,7 @@ const T* intersect_get(const CGAL::Object& o) { template inline -const T* intersect_get(const boost::optional< boost::variant >& v) { +const T* intersect_get(const std::optional< boost::variant >& v) { return boost::get(&*v); } diff --git a/Intersections_2/include/CGAL/Intersection_traits_2.h b/Intersections_2/include/CGAL/Intersection_traits_2.h index 921405c27f96..df4d10a6c2a6 100644 --- a/Intersections_2/include/CGAL/Intersection_traits_2.h +++ b/Intersections_2/include/CGAL/Intersection_traits_2.h @@ -17,7 +17,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -51,7 +51,7 @@ struct Intersection_traits { typedef typename boost::variant< typename K::Point_2, typename K::Segment_2, typename K::Triangle_2, typename std::vector< typename K::Point_2 > > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; @@ -70,7 +70,7 @@ CGAL_INTERSECTION_TRAITS_2(Ray_2, Iso_rectangle_2, Point_2, Segment_2) template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; @@ -78,19 +78,19 @@ struct Intersection_traits struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; template @@ -99,7 +99,7 @@ struct Intersection_traits > variant_type; - typedef typename boost::optional < variant_type > result_type; + typedef typename std::optional < variant_type > result_type; }; template @@ -119,13 +119,13 @@ struct Intersection_traits { template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; template struct Intersection_traits { typedef typename boost::variant variant_type; - typedef boost::optional result_type; + typedef std::optional result_type; }; } // namespace CGAL diff --git a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h index 9b75f968c2ee..4081086aa1c5 100644 --- a/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h +++ b/Intersections_2/include/CGAL/Intersections_2/Bbox_2_Bbox_2.h @@ -25,13 +25,13 @@ do_intersect(const CGAL::Bbox_2& c, return CGAL::do_overlap(c, bbox); } -typename boost::optional< typename boost::variant > +typename std::optional< typename boost::variant > inline intersection(const CGAL::Bbox_2& a, const CGAL::Bbox_2& b) { typedef typename boost::variant variant_type; - typedef typename boost::optional result_type; + typedef typename std::optional result_type; if(!do_intersect(a, b)) return result_type(); diff --git a/Intersections_3/include/CGAL/Intersection_traits_3.h b/Intersections_3/include/CGAL/Intersection_traits_3.h index 85287e8c044e..a72f5cac9231 100644 --- a/Intersections_3/include/CGAL/Intersection_traits_3.h +++ b/Intersections_3/include/CGAL/Intersection_traits_3.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include @@ -86,7 +86,7 @@ struct Intersection_traits { typedef typename boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, typename std::vector< typename K::Point_3 > > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; @@ -109,7 +109,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Iso_cuboid_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; @@ -119,7 +119,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Segment_3, typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -149,7 +149,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Bbox_3 Point_3, variant of one @@ -157,14 +157,14 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; @@ -173,7 +173,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Iso_cuboid_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -185,7 +185,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Iso_cuboid_3 Plane_3, variant of 4 @@ -195,7 +195,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -204,7 +204,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Iso_cuboid_3 Triangle_3, variant of 4 @@ -214,7 +214,7 @@ struct Intersection_traits boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -223,7 +223,7 @@ struct Intersection_traits boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Bbox_3 Plane_3, variant of 4 @@ -233,7 +233,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -242,7 +242,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Bbox_3 Triangle_3, variant of 4 @@ -252,7 +252,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; template @@ -261,7 +261,7 @@ struct Intersection_traits { boost::variant< typename K::Point_3, typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Line_3, variant of one @@ -269,7 +269,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Line_3 Point_3, variant of one @@ -277,7 +277,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Ray_3, variant of one @@ -285,7 +285,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Ray_3 Point_3, variant of one @@ -293,7 +293,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Segment_3, variant of one @@ -301,7 +301,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Segment_3 Point_3, variant of one @@ -309,7 +309,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Point_3, variant of one @@ -317,7 +317,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Plane_3, variant of one @@ -325,7 +325,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Plane_3 Point_3, variant of one @@ -333,7 +333,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Triangle_3, variant of one @@ -341,7 +341,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Triangle_3 Point_3, variant of one @@ -349,7 +349,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Tetrahedron_3, variant of one @@ -357,7 +357,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Tetrahedron_3 Point_3, variant of one @@ -365,7 +365,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Point_3 Sphere_3, variant of one @@ -373,7 +373,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Sphere_3 Point_3, variant of one @@ -381,7 +381,7 @@ template struct Intersection_traits { typedef typename boost::variant< typename K::Point_3 > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; //Tetrahedron_3 Plane_3, variant of 4 @@ -391,7 +391,7 @@ struct Intersection_traits typedef typename boost::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; //Plane_3 Tetrahedron_3, variant of 4 @@ -401,7 +401,7 @@ struct Intersection_traits typedef typename boost::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; //Triangle_3 Tetrahedron_3, variant of 4 @@ -411,7 +411,7 @@ struct Intersection_traits typedef typename boost::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; // Tetrahedron_3 Triangle_3, variant of 4 @@ -421,7 +421,7 @@ struct Intersection_traits typedef typename boost::variant< typename K::Point_3 , typename K::Segment_3, typename K::Triangle_3, std::vector > variant_type; - typedef typename boost::optional< variant_type > result_type; + typedef typename std::optional< variant_type > result_type; }; diff --git a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h index bb244628c5ae..44af7d691c05 100644 --- a/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/Bbox_3_Bbox_3.h @@ -24,7 +24,7 @@ #include -#include +#include #include #include @@ -39,13 +39,13 @@ do_intersect(const CGAL::Bbox_3& c, return CGAL::do_overlap(c, bbox); } -typename boost::optional< typename boost::variant< Bbox_3> > +typename std::optional< typename boost::variant< Bbox_3> > inline intersection(const CGAL::Bbox_3& a, const CGAL::Bbox_3& b) { typedef typename boost::variant variant_type; - typedef typename boost::optional result_type; + typedef typename std::optional result_type; if(!do_intersect(a,b)) return result_type(); diff --git a/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h index ec3806b41f7a..5689ce58935b 100644 --- a/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/Line_3_Plane_3.h @@ -27,7 +27,7 @@ #include #include -#include +#include namespace CGAL { @@ -36,7 +36,7 @@ CGAL_INTERSECTION_FUNCTION(Line_3, Plane_3, 3) template inline -boost::optional +std::optional intersection_point_for_polyhedral_envelope(const Plane_3& plane, const Line_3& line) { @@ -45,7 +45,7 @@ intersection_point_for_polyhedral_envelope(const Plane_3& plane, template inline -boost::optional +std::optional intersection_point_for_polyhedral_envelope(const Line_3& line, const Plane_3& plane) { diff --git a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3_Plane_3.h b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3_Plane_3.h index 3030089906c7..9d7351039ffc 100644 --- a/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3_Plane_3.h +++ b/Intersections_3/include/CGAL/Intersections_3/Plane_3_Plane_3_Plane_3.h @@ -52,7 +52,7 @@ intersection(const Plane_3& plane1, template inline -boost::optional +std::optional intersection_point_for_polyhedral_envelope(const Plane_3& p0, const Plane_3& p1, const Plane_3& p2) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h index a82d17dd7597..df219948c4ef 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Segment_3_intersection.h @@ -22,7 +22,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -34,7 +34,7 @@ namespace internal { // But it must be a template function since the original kernel must be // taken into account. template -typename boost::optional< boost::variant > +typename std::optional< boost::variant > intersection_bl(const Bbox_3& box, double lpx, double lpy, double lpz, double ldx, double ldy, double ldz, @@ -45,7 +45,7 @@ intersection_bl(const Bbox_3& box, typedef typename K::Vector_3 Vector_3; typedef typename K::Segment_3 Segment_3; - typedef typename boost::optional > result_type; + typedef typename std::optional > result_type; double seg_min = 0.0, seg_max = 1.0; // first on x value diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Plane_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Plane_3_intersection.h index b052243ff0c9..7349337fc848 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Plane_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Iso_cuboid_3_Plane_3_intersection.h @@ -180,7 +180,7 @@ intersection(const typename K::Iso_cuboid_3& cub, } if (all_in || all_out) - return boost::none; + return std::nullopt; if (start_id == -1) return { result_type(corners[solo_id]) }; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Plane_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Plane_3_intersection.h index d14c119b56e5..737205703e32 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Plane_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Line_3_Plane_3_intersection.h @@ -24,7 +24,7 @@ namespace Intersections { namespace internal { template -boost::optional +std::optional intersection_point(const typename K::Plane_3& plane, const typename K::Line_3& line, const K& /*k*/) @@ -41,9 +41,9 @@ intersection_point(const typename K::Plane_3& plane, RT den = plane.a()*line_dir.dx() + plane.b()*line_dir.dy() + plane.c()*line_dir.dz(); if(den == 0) - return boost::none; + return std::nullopt; - return boost::make_optional(Point_3(den*line_pt.hx()-num*line_dir.dx(), + return std::make_optional(Point_3(den*line_pt.hx()-num*line_dir.dx(), den*line_pt.hy()-num*line_dir.dy(), den*line_pt.hz()-num*line_dir.dz(), wmult_hw((K*)0, den, line_pt))); diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h index be6ca11f0690..bdc881bf75aa 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Plane_3_Plane_3_intersection.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include namespace CGAL { @@ -27,7 +27,7 @@ namespace internal { // triple plane intersection template -boost::optional +std::optional intersection_point(const typename K::Plane_3& plane1, const typename K::Plane_3& plane2, const typename K::Plane_3& plane3, @@ -56,7 +56,7 @@ intersection_point(const typename K::Plane_3& plane1, const FT den = minor_0*m22 - minor_1*m12 + minor_2*m02; // determinant of M if(is_zero(den)){ - return boost::none; + return std::nullopt; } const FT num3 = minor_0*b2 - minor_1*b1 + minor_2*b0; // determinant of M with M[x:2] swapped with [b0,b1,b2] @@ -70,17 +70,17 @@ intersection_point(const typename K::Plane_3& plane1, const FT num1 = - minor_3*m21 + minor_4*m11 - minor_5*m01; // determinant of M with M[x:0] swapped with [b0,b1,b2] const FT num2 = minor_3*m20 - minor_4*m10 + minor_5*m00; // determinant of M with M[x:1] swapped with [b0,b1,b2] - return boost::make_optional(typename K::Point_3(num1/den, num2/den, num3/den)); + return std::make_optional(typename K::Point_3(num1/den, num2/den, num3/den)); } template -boost::optional > +std::optional > intersection(const typename K::Plane_3& plane1, const typename K::Plane_3& plane2, const typename K::Plane_3& plane3, const K& k) { - typedef typename boost::optional > result_type; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Tetrahedron_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Tetrahedron_3_intersection.h index 37e092956d71..0a1afefb0ead 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Tetrahedron_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Plane_3_Tetrahedron_3_intersection.h @@ -164,7 +164,7 @@ intersection(const typename K::Tetrahedron_3& tet, } if (all_in || all_out) - return boost::none; + return std::nullopt; if (start_id == -1) return { result_type(corners[solo_id]) }; diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Ray_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Ray_3_Triangle_3_intersection.h index 35983013bba4..5eeb8d85c8e0 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Ray_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Ray_3_Triangle_3_intersection.h @@ -396,7 +396,7 @@ intersection_coplanar(const typename K::Triangle_3& t, template inline -typename boost::optional +typename std::optional t3r3_intersection_aux(const typename K::Triangle_3& t, const typename K::Ray_3& r, const K& k) @@ -410,7 +410,7 @@ t3r3_intersection_aux(const typename K::Triangle_3& t, return *p; } - return boost::optional(); + return std::optional(); } template @@ -455,7 +455,7 @@ intersection(const typename K::Triangle_3& t, if ( orientation(p,q,a,b) != POSITIVE && orientation(p,q,b,c) != POSITIVE && orientation(p,q,c,a) != POSITIVE ) { - boost::optional op = t3r3_intersection_aux(t,r,k); + std::optional op = t3r3_intersection_aux(t,r,k); if(op) return intersection_return(*op); else return intersection_return(); } @@ -476,7 +476,7 @@ intersection(const typename K::Triangle_3& t, if ( orientation(q,p,a,b) != POSITIVE && orientation(q,p,b,c) != POSITIVE && orientation(q,p,c,a) != POSITIVE ) { - boost::optional op = t3r3_intersection_aux(t,r,k); + std::optional op = t3r3_intersection_aux(t,r,k); if(op) return intersection_return(*op); else return intersection_return(); } @@ -502,7 +502,7 @@ intersection(const typename K::Triangle_3& t, && orientation(q,p,b,c) != POSITIVE && orientation(q,p,c,a) != POSITIVE ) { - boost::optional op = t3r3_intersection_aux(t,r,k); + std::optional op = t3r3_intersection_aux(t,r,k); if(op) return intersection_return(*op); else return intersection_return(); } @@ -515,7 +515,7 @@ intersection(const typename K::Triangle_3& t, && orientation(p,q,b,c) != POSITIVE && orientation(p,q,c,a) != POSITIVE ) { - boost::optional op = t3r3_intersection_aux(t,r,k); + std::optional op = t3r3_intersection_aux(t,r,k); if(op) return intersection_return(*op); else return intersection_return(); } diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Triangle_3_intersection.h b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Triangle_3_intersection.h index 49bc573489e6..e3668392be02 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Triangle_3_intersection.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Tetrahedron_3_Triangle_3_intersection.h @@ -148,7 +148,7 @@ intersection(const typename K::Tetrahedron_3& tet, supporting_planes.swap(current_sp); if (res.empty()) - return boost::none; + return std::nullopt; } switch(res.size()) diff --git a/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp b/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp index 6f45f6200e65..29b21af670f1 100644 --- a/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp +++ b/Intersections_3/test/Intersections_3/test_intersections_Tetrahedron_3.cpp @@ -322,7 +322,7 @@ struct Tetrahedron_3_intersection_tester Tr tri(P(0.191630, -0.331630, -0.370000), P(-0.124185, -0.385815, -0.185000), P(-0.0700000, -0.0700000, 0.00000)); Tet tet(P(0, -1, 0), P(-1, 0, 0), P(0, 0, 0), P(0, 0, -1)); auto res = intersection(tri, tet); - assert(res != boost::none); + assert(res != std::nullopt); const std::vector